diff options
author | Kumar Gala <galak@freescale.com> | 2005-04-16 18:24:22 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@ppc970.osdl.org> | 2005-04-16 18:24:22 -0400 |
commit | f50b153b1966230e78034d5ab1641ca4bb5db56d (patch) | |
tree | 9f3f0971789ca2cbb59efbd694c172804f4547cd /include | |
parent | b464fce5edc08a825907e9d48a2d2f1af0393fef (diff) |
[PATCH] ppc32: Support 36-bit physical addressing on e500
To add support for 36-bit physical addressing on e500 the following changes
have been made. The changes are generalized to support any physical address
size larger than 32-bits:
* Allow FSL Book-E parts to use a 64-bit PTE, it is 44-bits of pfn, 20-bits
of flags.
* Introduced new CPU feature (CPU_FTR_BIG_PHYS) to allow runtime handling of
updating hardware register (SPRN_MAS7) which holds the upper 32-bits of
physical address that will be written into the TLB. This is useful since
not all e500 cores support 36-bit physical addressing.
* Currently have a pass through implementation of fixup_bigphys_addr
* Moved _PAGE_DIRTY in the 64-bit PTE case to free room for three additional
storage attributes that may exist in future FSL Book-E cores and updated
fault handler to copy these bits into the hardware TLBs.
Signed-off-by: Kumar Gala <kumar.gala@freescale.com>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'include')
-rw-r--r-- | include/asm-ppc/cputable.h | 3 | ||||
-rw-r--r-- | include/asm-ppc/pgtable.h | 45 | ||||
-rw-r--r-- | include/asm-ppc/reg_booke.h | 1 |
3 files changed, 31 insertions, 18 deletions
diff --git a/include/asm-ppc/cputable.h b/include/asm-ppc/cputable.h index 22de04fe1b4c..41d8f8425c04 100644 --- a/include/asm-ppc/cputable.h +++ b/include/asm-ppc/cputable.h | |||
@@ -86,8 +86,9 @@ static inline unsigned int cpu_has_feature(unsigned int feature) | |||
86 | #define CPU_FTR_DUAL_PLL_750FX 0x00004000 | 86 | #define CPU_FTR_DUAL_PLL_750FX 0x00004000 |
87 | #define CPU_FTR_NO_DPM 0x00008000 | 87 | #define CPU_FTR_NO_DPM 0x00008000 |
88 | #define CPU_FTR_HAS_HIGH_BATS 0x00010000 | 88 | #define CPU_FTR_HAS_HIGH_BATS 0x00010000 |
89 | #define CPU_FTR_NEED_COHERENT 0x00020000 | 89 | #define CPU_FTR_NEED_COHERENT 0x00020000 |
90 | #define CPU_FTR_NO_BTIC 0x00040000 | 90 | #define CPU_FTR_NO_BTIC 0x00040000 |
91 | #define CPU_FTR_BIG_PHYS 0x00080000 | ||
91 | 92 | ||
92 | #ifdef __ASSEMBLY__ | 93 | #ifdef __ASSEMBLY__ |
93 | 94 | ||
diff --git a/include/asm-ppc/pgtable.h b/include/asm-ppc/pgtable.h index e135b4aba9fc..a67bd512b2c8 100644 --- a/include/asm-ppc/pgtable.h +++ b/include/asm-ppc/pgtable.h | |||
@@ -225,8 +225,7 @@ extern unsigned long ioremap_bot, ioremap_base; | |||
225 | /* ERPN in a PTE never gets cleared, ignore it */ | 225 | /* ERPN in a PTE never gets cleared, ignore it */ |
226 | #define _PTE_NONE_MASK 0xffffffff00000000ULL | 226 | #define _PTE_NONE_MASK 0xffffffff00000000ULL |
227 | 227 | ||
228 | #elif defined(CONFIG_E500) | 228 | #elif defined(CONFIG_FSL_BOOKE) |
229 | |||
230 | /* | 229 | /* |
231 | MMU Assist Register 3: | 230 | MMU Assist Register 3: |
232 | 231 | ||
@@ -240,21 +239,29 @@ extern unsigned long ioremap_bot, ioremap_base; | |||
240 | entries use the top 29 bits. | 239 | entries use the top 29 bits. |
241 | */ | 240 | */ |
242 | 241 | ||
243 | /* Definitions for e500 core */ | 242 | /* Definitions for FSL Book-E Cores */ |
244 | #define _PAGE_PRESENT 0x001 /* S: PTE contains a translation */ | 243 | #define _PAGE_PRESENT 0x00001 /* S: PTE contains a translation */ |
245 | #define _PAGE_USER 0x002 /* S: User page (maps to UR) */ | 244 | #define _PAGE_USER 0x00002 /* S: User page (maps to UR) */ |
246 | #define _PAGE_FILE 0x002 /* S: when !present: nonlinear file mapping */ | 245 | #define _PAGE_FILE 0x00002 /* S: when !present: nonlinear file mapping */ |
247 | #define _PAGE_ACCESSED 0x004 /* S: Page referenced */ | 246 | #define _PAGE_ACCESSED 0x00004 /* S: Page referenced */ |
248 | #define _PAGE_HWWRITE 0x008 /* H: Dirty & RW, set in exception */ | 247 | #define _PAGE_HWWRITE 0x00008 /* H: Dirty & RW, set in exception */ |
249 | #define _PAGE_RW 0x010 /* S: Write permission */ | 248 | #define _PAGE_RW 0x00010 /* S: Write permission */ |
250 | #define _PAGE_HWEXEC 0x020 /* H: UX permission */ | 249 | #define _PAGE_HWEXEC 0x00020 /* H: UX permission */ |
251 | 250 | ||
252 | #define _PAGE_ENDIAN 0x040 /* H: E bit */ | 251 | #define _PAGE_ENDIAN 0x00040 /* H: E bit */ |
253 | #define _PAGE_GUARDED 0x080 /* H: G bit */ | 252 | #define _PAGE_GUARDED 0x00080 /* H: G bit */ |
254 | #define _PAGE_COHERENT 0x100 /* H: M bit */ | 253 | #define _PAGE_COHERENT 0x00100 /* H: M bit */ |
255 | #define _PAGE_NO_CACHE 0x200 /* H: I bit */ | 254 | #define _PAGE_NO_CACHE 0x00200 /* H: I bit */ |
256 | #define _PAGE_WRITETHRU 0x400 /* H: W bit */ | 255 | #define _PAGE_WRITETHRU 0x00400 /* H: W bit */ |
257 | #define _PAGE_DIRTY 0x800 /* S: Page dirty */ | 256 | |
257 | #ifdef CONFIG_PTE_64BIT | ||
258 | #define _PAGE_DIRTY 0x08000 /* S: Page dirty */ | ||
259 | |||
260 | /* ERPN in a PTE never gets cleared, ignore it */ | ||
261 | #define _PTE_NONE_MASK 0xffffffffffff0000ULL | ||
262 | #else | ||
263 | #define _PAGE_DIRTY 0x00800 /* S: Page dirty */ | ||
264 | #endif | ||
258 | 265 | ||
259 | #define _PMD_PRESENT 0 | 266 | #define _PMD_PRESENT 0 |
260 | #define _PMD_PRESENT_MASK (PAGE_MASK) | 267 | #define _PMD_PRESENT_MASK (PAGE_MASK) |
@@ -433,7 +440,11 @@ extern unsigned long bad_call_to_PMD_PAGE_SIZE(void); | |||
433 | 440 | ||
434 | /* in some case we want to additionaly adjust where the pfn is in the pte to | 441 | /* in some case we want to additionaly adjust where the pfn is in the pte to |
435 | * allow room for more flags */ | 442 | * allow room for more flags */ |
443 | #if defined(CONFIG_FSL_BOOKE) && defined(CONFIG_PTE_64BIT) | ||
444 | #define PFN_SHIFT_OFFSET (PAGE_SHIFT + 8) | ||
445 | #else | ||
436 | #define PFN_SHIFT_OFFSET (PAGE_SHIFT) | 446 | #define PFN_SHIFT_OFFSET (PAGE_SHIFT) |
447 | #endif | ||
437 | 448 | ||
438 | #define pte_pfn(x) (pte_val(x) >> PFN_SHIFT_OFFSET) | 449 | #define pte_pfn(x) (pte_val(x) >> PFN_SHIFT_OFFSET) |
439 | #define pte_page(x) pfn_to_page(pte_pfn(x)) | 450 | #define pte_page(x) pfn_to_page(pte_pfn(x)) |
diff --git a/include/asm-ppc/reg_booke.h b/include/asm-ppc/reg_booke.h index 4b03f8e26b72..e70c25f3c339 100644 --- a/include/asm-ppc/reg_booke.h +++ b/include/asm-ppc/reg_booke.h | |||
@@ -172,6 +172,7 @@ do { \ | |||
172 | #define SPRN_MAS4 0x274 /* MMU Assist Register 4 */ | 172 | #define SPRN_MAS4 0x274 /* MMU Assist Register 4 */ |
173 | #define SPRN_MAS5 0x275 /* MMU Assist Register 5 */ | 173 | #define SPRN_MAS5 0x275 /* MMU Assist Register 5 */ |
174 | #define SPRN_MAS6 0x276 /* MMU Assist Register 6 */ | 174 | #define SPRN_MAS6 0x276 /* MMU Assist Register 6 */ |
175 | #define SPRN_MAS7 0x3b0 /* MMU Assist Register 7 */ | ||
175 | #define SPRN_PID1 0x279 /* Process ID Register 1 */ | 176 | #define SPRN_PID1 0x279 /* Process ID Register 1 */ |
176 | #define SPRN_PID2 0x27A /* Process ID Register 2 */ | 177 | #define SPRN_PID2 0x27A /* Process ID Register 2 */ |
177 | #define SPRN_TLB0CFG 0x2B0 /* TLB 0 Config Register */ | 178 | #define SPRN_TLB0CFG 0x2B0 /* TLB 0 Config Register */ |