.. | .. |
---|
11 | 11 | |
---|
12 | 12 | #include <linux/const.h> |
---|
13 | 13 | |
---|
| 14 | +#define PMD_SHIFT 18 |
---|
| 15 | +#define PMD_SIZE (1UL << PMD_SHIFT) |
---|
| 16 | +#define PMD_MASK (~(PMD_SIZE-1)) |
---|
| 17 | +#define PMD_ALIGN(__addr) (((__addr) + ~PMD_MASK) & PMD_MASK) |
---|
| 18 | + |
---|
| 19 | +#define PGDIR_SHIFT 24 |
---|
| 20 | +#define PGDIR_SIZE (1UL << PGDIR_SHIFT) |
---|
| 21 | +#define PGDIR_MASK (~(PGDIR_SIZE-1)) |
---|
| 22 | +#define PGDIR_ALIGN(__addr) (((__addr) + ~PGDIR_MASK) & PGDIR_MASK) |
---|
| 23 | + |
---|
14 | 24 | #ifndef __ASSEMBLY__ |
---|
15 | | -#include <asm-generic/4level-fixup.h> |
---|
| 25 | +#include <asm-generic/pgtable-nopud.h> |
---|
16 | 26 | |
---|
17 | 27 | #include <linux/spinlock.h> |
---|
18 | 28 | #include <linux/mm_types.h> |
---|
.. | .. |
---|
34 | 44 | #define pmd_ERROR(e) __builtin_trap() |
---|
35 | 45 | #define pgd_ERROR(e) __builtin_trap() |
---|
36 | 46 | |
---|
37 | | -#define PMD_SHIFT 22 |
---|
38 | | -#define PMD_SIZE (1UL << PMD_SHIFT) |
---|
39 | | -#define PMD_MASK (~(PMD_SIZE-1)) |
---|
40 | | -#define PMD_ALIGN(__addr) (((__addr) + ~PMD_MASK) & PMD_MASK) |
---|
41 | | -#define PGDIR_SHIFT SRMMU_PGDIR_SHIFT |
---|
42 | | -#define PGDIR_SIZE SRMMU_PGDIR_SIZE |
---|
43 | | -#define PGDIR_MASK SRMMU_PGDIR_MASK |
---|
44 | | -#define PTRS_PER_PTE 1024 |
---|
45 | | -#define PTRS_PER_PMD SRMMU_PTRS_PER_PMD |
---|
46 | | -#define PTRS_PER_PGD SRMMU_PTRS_PER_PGD |
---|
47 | | -#define USER_PTRS_PER_PGD PAGE_OFFSET / SRMMU_PGDIR_SIZE |
---|
| 47 | +#define PTRS_PER_PTE 64 |
---|
| 48 | +#define PTRS_PER_PMD 64 |
---|
| 49 | +#define PTRS_PER_PGD 256 |
---|
| 50 | +#define USER_PTRS_PER_PGD PAGE_OFFSET / PGDIR_SIZE |
---|
48 | 51 | #define FIRST_USER_ADDRESS 0UL |
---|
49 | 52 | #define PTE_SIZE (PTRS_PER_PTE*4) |
---|
50 | 53 | |
---|
.. | .. |
---|
132 | 135 | return pfn_to_page((pmd_val(pmd) & SRMMU_PTD_PMASK) >> (PAGE_SHIFT-4)); |
---|
133 | 136 | } |
---|
134 | 137 | |
---|
135 | | -static inline unsigned long pgd_page_vaddr(pgd_t pgd) |
---|
| 138 | +static inline unsigned long __pmd_page(pmd_t pmd) |
---|
136 | 139 | { |
---|
137 | | - if (srmmu_device_memory(pgd_val(pgd))) { |
---|
138 | | - return ~0; |
---|
| 140 | + unsigned long v; |
---|
| 141 | + |
---|
| 142 | + if (srmmu_device_memory(pmd_val(pmd))) |
---|
| 143 | + BUG(); |
---|
| 144 | + |
---|
| 145 | + v = pmd_val(pmd) & SRMMU_PTD_PMASK; |
---|
| 146 | + return (unsigned long)__nocache_va(v << 4); |
---|
| 147 | +} |
---|
| 148 | + |
---|
| 149 | +static inline unsigned long pmd_page_vaddr(pmd_t pmd) |
---|
| 150 | +{ |
---|
| 151 | + unsigned long v = pmd_val(pmd) & SRMMU_PTD_PMASK; |
---|
| 152 | + return (unsigned long)__nocache_va(v << 4); |
---|
| 153 | +} |
---|
| 154 | + |
---|
| 155 | +static inline pmd_t *pud_pgtable(pud_t pud) |
---|
| 156 | +{ |
---|
| 157 | + if (srmmu_device_memory(pud_val(pud))) { |
---|
| 158 | + return (pmd_t *)~0; |
---|
139 | 159 | } else { |
---|
140 | | - unsigned long v = pgd_val(pgd) & SRMMU_PTD_PMASK; |
---|
141 | | - return (unsigned long)__nocache_va(v << 4); |
---|
| 160 | + unsigned long v = pud_val(pud) & SRMMU_PTD_PMASK; |
---|
| 161 | + return (pmd_t *)__nocache_va(v << 4); |
---|
142 | 162 | } |
---|
143 | 163 | } |
---|
144 | 164 | |
---|
.. | .. |
---|
179 | 199 | |
---|
180 | 200 | static inline void pmd_clear(pmd_t *pmdp) |
---|
181 | 201 | { |
---|
182 | | - int i; |
---|
183 | | - for (i = 0; i < PTRS_PER_PTE/SRMMU_REAL_PTRS_PER_PTE; i++) |
---|
184 | | - set_pte((pte_t *)&pmdp->pmdv[i], __pte(0)); |
---|
| 202 | + set_pte((pte_t *)&pmd_val(*pmdp), __pte(0)); |
---|
185 | 203 | } |
---|
186 | 204 | |
---|
187 | | -static inline int pgd_none(pgd_t pgd) |
---|
| 205 | +static inline int pud_none(pud_t pud) |
---|
188 | 206 | { |
---|
189 | | - return !(pgd_val(pgd) & 0xFFFFFFF); |
---|
| 207 | + return !(pud_val(pud) & 0xFFFFFFF); |
---|
190 | 208 | } |
---|
191 | 209 | |
---|
192 | | -static inline int pgd_bad(pgd_t pgd) |
---|
| 210 | +static inline int pud_bad(pud_t pud) |
---|
193 | 211 | { |
---|
194 | | - return (pgd_val(pgd) & SRMMU_ET_MASK) != SRMMU_ET_PTD; |
---|
| 212 | + return (pud_val(pud) & SRMMU_ET_MASK) != SRMMU_ET_PTD; |
---|
195 | 213 | } |
---|
196 | 214 | |
---|
197 | | -static inline int pgd_present(pgd_t pgd) |
---|
| 215 | +static inline int pud_present(pud_t pud) |
---|
198 | 216 | { |
---|
199 | | - return ((pgd_val(pgd) & SRMMU_ET_MASK) == SRMMU_ET_PTD); |
---|
| 217 | + return ((pud_val(pud) & SRMMU_ET_MASK) == SRMMU_ET_PTD); |
---|
200 | 218 | } |
---|
201 | 219 | |
---|
202 | | -static inline void pgd_clear(pgd_t *pgdp) |
---|
| 220 | +static inline void pud_clear(pud_t *pudp) |
---|
203 | 221 | { |
---|
204 | | - set_pte((pte_t *)pgdp, __pte(0)); |
---|
| 222 | + set_pte((pte_t *)pudp, __pte(0)); |
---|
205 | 223 | } |
---|
206 | 224 | |
---|
207 | 225 | /* |
---|
.. | .. |
---|
221 | 239 | static inline int pte_young(pte_t pte) |
---|
222 | 240 | { |
---|
223 | 241 | return pte_val(pte) & SRMMU_REF; |
---|
224 | | -} |
---|
225 | | - |
---|
226 | | -static inline int pte_special(pte_t pte) |
---|
227 | | -{ |
---|
228 | | - return 0; |
---|
229 | 242 | } |
---|
230 | 243 | |
---|
231 | 244 | static inline pte_t pte_wrprotect(pte_t pte) |
---|
.. | .. |
---|
257 | 270 | { |
---|
258 | 271 | return __pte(pte_val(pte) | SRMMU_REF); |
---|
259 | 272 | } |
---|
260 | | - |
---|
261 | | -#define pte_mkspecial(pte) (pte) |
---|
262 | 273 | |
---|
263 | 274 | #define pfn_pte(pfn, prot) mk_pte(pfn_to_page(pfn), prot) |
---|
264 | 275 | |
---|
.. | .. |
---|
309 | 320 | return __pte((pte_val(pte) & SRMMU_CHG_MASK) | |
---|
310 | 321 | pgprot_val(newprot)); |
---|
311 | 322 | } |
---|
312 | | - |
---|
313 | | -#define pgd_index(address) ((address) >> PGDIR_SHIFT) |
---|
314 | | - |
---|
315 | | -/* to find an entry in a page-table-directory */ |
---|
316 | | -#define pgd_offset(mm, address) ((mm)->pgd + pgd_index(address)) |
---|
317 | | - |
---|
318 | | -/* to find an entry in a kernel page-table-directory */ |
---|
319 | | -#define pgd_offset_k(address) pgd_offset(&init_mm, address) |
---|
320 | | - |
---|
321 | | -/* Find an entry in the second-level page table.. */ |
---|
322 | | -static inline pmd_t *pmd_offset(pgd_t * dir, unsigned long address) |
---|
323 | | -{ |
---|
324 | | - return (pmd_t *) pgd_page_vaddr(*dir) + |
---|
325 | | - ((address >> PMD_SHIFT) & (PTRS_PER_PMD - 1)); |
---|
326 | | -} |
---|
327 | | - |
---|
328 | | -/* Find an entry in the third-level page table.. */ |
---|
329 | | -pte_t *pte_offset_kernel(pmd_t * dir, unsigned long address); |
---|
330 | | - |
---|
331 | | -/* |
---|
332 | | - * This shortcut works on sun4m (and sun4d) because the nocache area is static. |
---|
333 | | - */ |
---|
334 | | -#define pte_offset_map(d, a) pte_offset_kernel(d,a) |
---|
335 | | -#define pte_unmap(pte) do{}while(0) |
---|
336 | 323 | |
---|
337 | 324 | struct seq_file; |
---|
338 | 325 | void mmu_info(struct seq_file *m); |
---|
.. | .. |
---|
422 | 409 | |
---|
423 | 410 | return remap_pfn_range(vma, from, phys_base >> PAGE_SHIFT, size, prot); |
---|
424 | 411 | } |
---|
425 | | -#define io_remap_pfn_range io_remap_pfn_range |
---|
| 412 | +#define io_remap_pfn_range io_remap_pfn_range |
---|
426 | 413 | |
---|
427 | 414 | #define __HAVE_ARCH_PTEP_SET_ACCESS_FLAGS |
---|
428 | 415 | #define ptep_set_access_flags(__vma, __address, __ptep, __entry, __dirty) \ |
---|
.. | .. |
---|
435 | 422 | __changed; \ |
---|
436 | 423 | }) |
---|
437 | 424 | |
---|
438 | | -#include <asm-generic/pgtable.h> |
---|
439 | | - |
---|
440 | 425 | #endif /* !(__ASSEMBLY__) */ |
---|
441 | 426 | |
---|
442 | 427 | #define VMALLOC_START _AC(0xfe600000,UL) |
---|
.. | .. |
---|
444 | 429 | |
---|
445 | 430 | /* We provide our own get_unmapped_area to cope with VA holes for userland */ |
---|
446 | 431 | #define HAVE_ARCH_UNMAPPED_AREA |
---|
447 | | - |
---|
448 | | -/* |
---|
449 | | - * No page table caches to initialise |
---|
450 | | - */ |
---|
451 | | -#define pgtable_cache_init() do { } while (0) |
---|
452 | 432 | |
---|
453 | 433 | #endif /* !(_SPARC_PGTABLE_H) */ |
---|