diff options
Diffstat (limited to 'include/asm-mips/pgtable-32.h')
-rw-r--r-- | include/asm-mips/pgtable-32.h | 53 |
1 files changed, 17 insertions, 36 deletions
diff --git a/include/asm-mips/pgtable-32.h b/include/asm-mips/pgtable-32.h index 7fec93b76da9..0cff64ce0fb8 100644 --- a/include/asm-mips/pgtable-32.h +++ b/include/asm-mips/pgtable-32.h | |||
@@ -17,6 +17,8 @@ | |||
17 | #include <asm/cachectl.h> | 17 | #include <asm/cachectl.h> |
18 | #include <asm/fixmap.h> | 18 | #include <asm/fixmap.h> |
19 | 19 | ||
20 | #include <asm-generic/pgtable-nopmd.h> | ||
21 | |||
20 | /* | 22 | /* |
21 | * - add_wired_entry() add a fixed TLB entry, and move wired register | 23 | * - add_wired_entry() add a fixed TLB entry, and move wired register |
22 | */ | 24 | */ |
@@ -41,42 +43,38 @@ extern int add_temporary_entry(unsigned long entrylo0, unsigned long entrylo1, | |||
41 | * works even with the cache aliasing problem the R4k and above have. | 43 | * works even with the cache aliasing problem the R4k and above have. |
42 | */ | 44 | */ |
43 | 45 | ||
44 | /* PMD_SHIFT determines the size of the area a second-level page table can map */ | 46 | /* PGDIR_SHIFT determines what a third-level page table entry can map */ |
45 | #ifdef CONFIG_64BIT_PHYS_ADDR | 47 | #ifdef CONFIG_64BIT_PHYS_ADDR |
46 | #define PMD_SHIFT 21 | 48 | #define PGDIR_SHIFT 21 |
47 | #else | 49 | #else |
48 | #define PMD_SHIFT 22 | 50 | #define PGDIR_SHIFT 22 |
49 | #endif | 51 | #endif |
50 | #define PMD_SIZE (1UL << PMD_SHIFT) | ||
51 | #define PMD_MASK (~(PMD_SIZE-1)) | ||
52 | |||
53 | /* PGDIR_SHIFT determines what a third-level page table entry can map */ | ||
54 | #define PGDIR_SHIFT PMD_SHIFT | ||
55 | #define PGDIR_SIZE (1UL << PGDIR_SHIFT) | 52 | #define PGDIR_SIZE (1UL << PGDIR_SHIFT) |
56 | #define PGDIR_MASK (~(PGDIR_SIZE-1)) | 53 | #define PGDIR_MASK (~(PGDIR_SIZE-1)) |
57 | 54 | ||
58 | /* | 55 | /* |
59 | * Entries per page directory level: we use two-level, so | 56 | * Entries per page directory level: we use two-level, so |
60 | * we don't really have any PMD directory physically. | 57 | * we don't really have any PUD/PMD directory physically. |
61 | */ | 58 | */ |
62 | #ifdef CONFIG_64BIT_PHYS_ADDR | 59 | #ifdef CONFIG_64BIT_PHYS_ADDR |
63 | #define PGD_ORDER 1 | 60 | #define PGD_ORDER 1 |
64 | #define PMD_ORDER 0 | 61 | #define PUD_ORDER aieeee_attempt_to_allocate_pud |
62 | #define PMD_ORDER 1 | ||
65 | #define PTE_ORDER 0 | 63 | #define PTE_ORDER 0 |
66 | #else | 64 | #else |
67 | #define PGD_ORDER 0 | 65 | #define PGD_ORDER 0 |
68 | #define PMD_ORDER 0 | 66 | #define PUD_ORDER aieeee_attempt_to_allocate_pud |
67 | #define PMD_ORDER 1 | ||
69 | #define PTE_ORDER 0 | 68 | #define PTE_ORDER 0 |
70 | #endif | 69 | #endif |
71 | 70 | ||
72 | #define PTRS_PER_PGD ((PAGE_SIZE << PGD_ORDER) / sizeof(pgd_t)) | 71 | #define PTRS_PER_PGD ((PAGE_SIZE << PGD_ORDER) / sizeof(pgd_t)) |
73 | #define PTRS_PER_PMD 1 | ||
74 | #define PTRS_PER_PTE ((PAGE_SIZE << PTE_ORDER) / sizeof(pte_t)) | 72 | #define PTRS_PER_PTE ((PAGE_SIZE << PTE_ORDER) / sizeof(pte_t)) |
75 | 73 | ||
76 | #define USER_PTRS_PER_PGD (0x80000000UL/PGDIR_SIZE) | 74 | #define USER_PTRS_PER_PGD (0x80000000UL/PGDIR_SIZE) |
77 | #define FIRST_USER_ADDRESS 0 | 75 | #define FIRST_USER_ADDRESS 0 |
78 | 76 | ||
79 | #define VMALLOC_START KSEG2 | 77 | #define VMALLOC_START MAP_BASE |
80 | 78 | ||
81 | #ifdef CONFIG_HIGHMEM | 79 | #ifdef CONFIG_HIGHMEM |
82 | # define VMALLOC_END (PKMAP_BASE-2*PAGE_SIZE) | 80 | # define VMALLOC_END (PKMAP_BASE-2*PAGE_SIZE) |
@@ -91,8 +89,6 @@ extern int add_temporary_entry(unsigned long entrylo0, unsigned long entrylo1, | |||
91 | #define pte_ERROR(e) \ | 89 | #define pte_ERROR(e) \ |
92 | printk("%s:%d: bad pte %08lx.\n", __FILE__, __LINE__, pte_val(e)) | 90 | printk("%s:%d: bad pte %08lx.\n", __FILE__, __LINE__, pte_val(e)) |
93 | #endif | 91 | #endif |
94 | #define pmd_ERROR(e) \ | ||
95 | printk("%s:%d: bad pmd %08lx.\n", __FILE__, __LINE__, pmd_val(e)) | ||
96 | #define pgd_ERROR(e) \ | 92 | #define pgd_ERROR(e) \ |
97 | printk("%s:%d: bad pgd %08lx.\n", __FILE__, __LINE__, pgd_val(e)) | 93 | printk("%s:%d: bad pgd %08lx.\n", __FILE__, __LINE__, pgd_val(e)) |
98 | 94 | ||
@@ -120,17 +116,7 @@ static inline void pmd_clear(pmd_t *pmdp) | |||
120 | pmd_val(*pmdp) = ((unsigned long) invalid_pte_table); | 116 | pmd_val(*pmdp) = ((unsigned long) invalid_pte_table); |
121 | } | 117 | } |
122 | 118 | ||
123 | /* | 119 | #if defined(CONFIG_64BIT_PHYS_ADDR) && defined(CONFIG_CPU_MIPS32_R1) |
124 | * The "pgd_xxx()" functions here are trivial for a folded two-level | ||
125 | * setup: the pgd is never bad, and a pmd always exists (as it's folded | ||
126 | * into the pgd entry) | ||
127 | */ | ||
128 | static inline int pgd_none(pgd_t pgd) { return 0; } | ||
129 | static inline int pgd_bad(pgd_t pgd) { return 0; } | ||
130 | static inline int pgd_present(pgd_t pgd) { return 1; } | ||
131 | static inline void pgd_clear(pgd_t *pgdp) { } | ||
132 | |||
133 | #if defined(CONFIG_64BIT_PHYS_ADDR) && defined(CONFIG_CPU_MIPS32) | ||
134 | #define pte_page(x) pfn_to_page(pte_pfn(x)) | 120 | #define pte_page(x) pfn_to_page(pte_pfn(x)) |
135 | #define pte_pfn(x) ((unsigned long)((x).pte_high >> 6)) | 121 | #define pte_pfn(x) ((unsigned long)((x).pte_high >> 6)) |
136 | static inline pte_t | 122 | static inline pte_t |
@@ -151,27 +137,22 @@ pfn_pte(unsigned long pfn, pgprot_t prot) | |||
151 | #define pfn_pte(pfn, prot) __pte(((pfn) << (PAGE_SHIFT + 2)) | pgprot_val(prot)) | 137 | #define pfn_pte(pfn, prot) __pte(((pfn) << (PAGE_SHIFT + 2)) | pgprot_val(prot)) |
152 | #else | 138 | #else |
153 | #define pte_pfn(x) ((unsigned long)((x).pte >> PAGE_SHIFT)) | 139 | #define pte_pfn(x) ((unsigned long)((x).pte >> PAGE_SHIFT)) |
154 | #define pfn_pte(pfn, prot) __pte(((pfn) << PAGE_SHIFT) | pgprot_val(prot)) | 140 | #define pfn_pte(pfn, prot) __pte(((unsigned long long)(pfn) << PAGE_SHIFT) | pgprot_val(prot)) |
155 | #endif | 141 | #endif |
156 | #endif /* defined(CONFIG_64BIT_PHYS_ADDR) && defined(CONFIG_CPU_MIPS32) */ | 142 | #endif /* defined(CONFIG_64BIT_PHYS_ADDR) && defined(CONFIG_CPU_MIPS32_R1) */ |
157 | 143 | ||
158 | #define __pgd_offset(address) pgd_index(address) | 144 | #define __pgd_offset(address) pgd_index(address) |
145 | #define __pud_offset(address) (((address) >> PUD_SHIFT) & (PTRS_PER_PUD-1)) | ||
159 | #define __pmd_offset(address) (((address) >> PMD_SHIFT) & (PTRS_PER_PMD-1)) | 146 | #define __pmd_offset(address) (((address) >> PMD_SHIFT) & (PTRS_PER_PMD-1)) |
160 | 147 | ||
161 | /* to find an entry in a kernel page-table-directory */ | 148 | /* to find an entry in a kernel page-table-directory */ |
162 | #define pgd_offset_k(address) pgd_offset(&init_mm, address) | 149 | #define pgd_offset_k(address) pgd_offset(&init_mm, address) |
163 | 150 | ||
164 | #define pgd_index(address) ((address) >> PGDIR_SHIFT) | 151 | #define pgd_index(address) (((address) >> PGDIR_SHIFT) & (PTRS_PER_PGD-1)) |
165 | 152 | ||
166 | /* to find an entry in a page-table-directory */ | 153 | /* to find an entry in a page-table-directory */ |
167 | #define pgd_offset(mm,addr) ((mm)->pgd + pgd_index(addr)) | 154 | #define pgd_offset(mm,addr) ((mm)->pgd + pgd_index(addr)) |
168 | 155 | ||
169 | /* Find an entry in the second-level page table.. */ | ||
170 | static inline pmd_t *pmd_offset(pgd_t *dir, unsigned long address) | ||
171 | { | ||
172 | return (pmd_t *) dir; | ||
173 | } | ||
174 | |||
175 | /* Find an entry in the third-level page table.. */ | 156 | /* Find an entry in the third-level page table.. */ |
176 | #define __pte_offset(address) \ | 157 | #define __pte_offset(address) \ |
177 | (((address) >> PAGE_SHIFT) & (PTRS_PER_PTE - 1)) | 158 | (((address) >> PAGE_SHIFT) & (PTRS_PER_PTE - 1)) |
@@ -221,7 +202,7 @@ static inline pmd_t *pmd_offset(pgd_t *dir, unsigned long address) | |||
221 | */ | 202 | */ |
222 | #define PTE_FILE_MAX_BITS 27 | 203 | #define PTE_FILE_MAX_BITS 27 |
223 | 204 | ||
224 | #if defined(CONFIG_64BIT_PHYS_ADDR) && defined(CONFIG_CPU_MIPS32) | 205 | #if defined(CONFIG_64BIT_PHYS_ADDR) && defined(CONFIG_CPU_MIPS32_R1) |
225 | /* fixme */ | 206 | /* fixme */ |
226 | #define pte_to_pgoff(_pte) (((_pte).pte_high >> 6) + ((_pte).pte_high & 0x3f)) | 207 | #define pte_to_pgoff(_pte) (((_pte).pte_high >> 6) + ((_pte).pte_high & 0x3f)) |
227 | #define pgoff_to_pte(off) \ | 208 | #define pgoff_to_pte(off) \ |