1 /* SPDX-License-Identifier: GPL-2.0-only */ 2 /************************************************************************** 3 * Copyright (c) 2007-2011, Intel Corporation. 4 * All Rights Reserved. 5 * 6 **************************************************************************/ 7 8 #ifndef __MMU_H 9 #define __MMU_H 10 11 struct psb_mmu_driver { 12 /* protects driver- and pd structures. Always take in read mode 13 * before taking the page table spinlock. 14 */ 15 struct rw_semaphore sem; 16 17 /* protects page tables, directory tables and pt tables. 18 * and pt structures. 19 */ 20 spinlock_t lock; 21 22 atomic_t needs_tlbflush; 23 atomic_t *msvdx_mmu_invaldc; 24 struct psb_mmu_pd *default_pd; 25 uint32_t bif_ctrl; 26 int has_clflush; 27 int clflush_add; 28 unsigned long clflush_mask; 29 30 struct drm_device *dev; 31 }; 32 33 struct psb_mmu_pd; 34 35 struct psb_mmu_pt { 36 struct psb_mmu_pd *pd; 37 uint32_t index; 38 uint32_t count; 39 struct page *p; 40 uint32_t *v; 41 }; 42 43 struct psb_mmu_pd { 44 struct psb_mmu_driver *driver; 45 int hw_context; 46 struct psb_mmu_pt **tables; 47 struct page *p; 48 struct page *dummy_pt; 49 struct page *dummy_page; 50 uint32_t pd_mask; 51 uint32_t invalid_pde; 52 uint32_t invalid_pte; 53 }; 54 55 extern struct psb_mmu_driver *psb_mmu_driver_init(struct drm_device *dev, 56 int trap_pagefaults, 57 int invalid_type, 58 atomic_t *msvdx_mmu_invaldc); 59 extern void psb_mmu_driver_takedown(struct psb_mmu_driver *driver); 60 extern struct psb_mmu_pd *psb_mmu_get_default_pd(struct psb_mmu_driver 61 *driver); 62 extern struct psb_mmu_pd *psb_mmu_alloc_pd(struct psb_mmu_driver *driver, 63 int trap_pagefaults, 64 int invalid_type); 65 extern void psb_mmu_free_pagedir(struct psb_mmu_pd *pd); 66 extern void psb_mmu_flush(struct psb_mmu_driver *driver); 67 extern void psb_mmu_remove_pfn_sequence(struct psb_mmu_pd *pd, 68 unsigned long address, 69 uint32_t num_pages); 70 extern int psb_mmu_insert_pfn_sequence(struct psb_mmu_pd *pd, 71 uint32_t start_pfn, 72 unsigned long address, 73 uint32_t num_pages, int type); 74 extern int psb_mmu_virtual_to_pfn(struct psb_mmu_pd *pd, uint32_t virtual, 75 unsigned long *pfn); 76 extern void psb_mmu_set_pd_context(struct psb_mmu_pd *pd, int hw_context); 77 extern int psb_mmu_insert_pages(struct psb_mmu_pd *pd, struct page **pages, 78 unsigned long address, uint32_t num_pages, 79 uint32_t desired_tile_stride, 80 uint32_t hw_tile_stride, int type); 81 extern void psb_mmu_remove_pages(struct psb_mmu_pd *pd, 82 unsigned long address, uint32_t num_pages, 83 uint32_t desired_tile_stride, 84 uint32_t hw_tile_stride); 85 86 #endif 87