0001
0002
0003
0004
0005
0006
0007
0008 #ifndef __MMU_H
0009 #define __MMU_H
0010
0011 struct psb_mmu_driver {
0012
0013
0014
0015 struct rw_semaphore sem;
0016
0017
0018
0019
0020 spinlock_t lock;
0021
0022 atomic_t needs_tlbflush;
0023 atomic_t *msvdx_mmu_invaldc;
0024 struct psb_mmu_pd *default_pd;
0025 uint32_t bif_ctrl;
0026 int has_clflush;
0027 int clflush_add;
0028 unsigned long clflush_mask;
0029
0030 struct drm_device *dev;
0031 };
0032
0033 struct psb_mmu_pd;
0034
0035 struct psb_mmu_pt {
0036 struct psb_mmu_pd *pd;
0037 uint32_t index;
0038 uint32_t count;
0039 struct page *p;
0040 uint32_t *v;
0041 };
0042
0043 struct psb_mmu_pd {
0044 struct psb_mmu_driver *driver;
0045 int hw_context;
0046 struct psb_mmu_pt **tables;
0047 struct page *p;
0048 struct page *dummy_pt;
0049 struct page *dummy_page;
0050 uint32_t pd_mask;
0051 uint32_t invalid_pde;
0052 uint32_t invalid_pte;
0053 };
0054
0055 extern struct psb_mmu_driver *psb_mmu_driver_init(struct drm_device *dev,
0056 int trap_pagefaults,
0057 int invalid_type,
0058 atomic_t *msvdx_mmu_invaldc);
0059 extern void psb_mmu_driver_takedown(struct psb_mmu_driver *driver);
0060 extern struct psb_mmu_pd *psb_mmu_get_default_pd(struct psb_mmu_driver
0061 *driver);
0062 extern struct psb_mmu_pd *psb_mmu_alloc_pd(struct psb_mmu_driver *driver,
0063 int trap_pagefaults,
0064 int invalid_type);
0065 extern void psb_mmu_free_pagedir(struct psb_mmu_pd *pd);
0066 extern void psb_mmu_flush(struct psb_mmu_driver *driver);
0067 extern void psb_mmu_remove_pfn_sequence(struct psb_mmu_pd *pd,
0068 unsigned long address,
0069 uint32_t num_pages);
0070 extern int psb_mmu_insert_pfn_sequence(struct psb_mmu_pd *pd,
0071 uint32_t start_pfn,
0072 unsigned long address,
0073 uint32_t num_pages, int type);
0074 extern int psb_mmu_virtual_to_pfn(struct psb_mmu_pd *pd, uint32_t virtual,
0075 unsigned long *pfn);
0076 extern void psb_mmu_set_pd_context(struct psb_mmu_pd *pd, int hw_context);
0077 extern int psb_mmu_insert_pages(struct psb_mmu_pd *pd, struct page **pages,
0078 unsigned long address, uint32_t num_pages,
0079 uint32_t desired_tile_stride,
0080 uint32_t hw_tile_stride, int type);
0081 extern void psb_mmu_remove_pages(struct psb_mmu_pd *pd,
0082 unsigned long address, uint32_t num_pages,
0083 uint32_t desired_tile_stride,
0084 uint32_t hw_tile_stride);
0085
0086 #endif