| .. | .. |
|---|
| 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) */ |
|---|