diff options
| author | Benjamin Herrenschmidt <benh@kernel.crashing.org> | 2009-03-19 15:34:16 -0400 |
|---|---|---|
| committer | Benjamin Herrenschmidt <benh@kernel.crashing.org> | 2009-03-23 22:47:34 -0400 |
| commit | 757c74d298dc8438760b8dea275c4c6e0ac8a77f (patch) | |
| tree | 77c694ad28230b3714c039fe54ab5497febfd4ac | |
| parent | a033a487f8ae79800a15774cb6565cbbca685fc6 (diff) | |
powerpc/mm: Introduce early_init_mmu() on 64-bit
This moves some MMU related init code out of setup_64.c into hash_utils_64.c
and calls it early_init_mmu() and early_init_mmu_secondary(). This will
make it easier to plug in a new MMU type.
Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
| -rw-r--r-- | arch/powerpc/include/asm/mmu-hash64.h | 2 | ||||
| -rw-r--r-- | arch/powerpc/include/asm/mmu.h | 4 | ||||
| -rw-r--r-- | arch/powerpc/kernel/setup_64.c | 35 | ||||
| -rw-r--r-- | arch/powerpc/mm/hash_utils_64.c | 36 |
4 files changed, 43 insertions, 34 deletions
diff --git a/arch/powerpc/include/asm/mmu-hash64.h b/arch/powerpc/include/asm/mmu-hash64.h index 68b752626808..98c104a09961 100644 --- a/arch/powerpc/include/asm/mmu-hash64.h +++ b/arch/powerpc/include/asm/mmu-hash64.h | |||
| @@ -284,8 +284,6 @@ extern void add_gpage(unsigned long addr, unsigned long page_size, | |||
| 284 | unsigned long number_of_pages); | 284 | unsigned long number_of_pages); |
| 285 | extern void demote_segment_4k(struct mm_struct *mm, unsigned long addr); | 285 | extern void demote_segment_4k(struct mm_struct *mm, unsigned long addr); |
| 286 | 286 | ||
| 287 | extern void htab_initialize(void); | ||
| 288 | extern void htab_initialize_secondary(void); | ||
| 289 | extern void hpte_init_native(void); | 287 | extern void hpte_init_native(void); |
| 290 | extern void hpte_init_lpar(void); | 288 | extern void hpte_init_lpar(void); |
| 291 | extern void hpte_init_iSeries(void); | 289 | extern void hpte_init_iSeries(void); |
diff --git a/arch/powerpc/include/asm/mmu.h b/arch/powerpc/include/asm/mmu.h index c073de4af849..cbf154387091 100644 --- a/arch/powerpc/include/asm/mmu.h +++ b/arch/powerpc/include/asm/mmu.h | |||
| @@ -62,6 +62,10 @@ static inline int mmu_has_feature(unsigned long feature) | |||
| 62 | 62 | ||
| 63 | extern unsigned int __start___mmu_ftr_fixup, __stop___mmu_ftr_fixup; | 63 | extern unsigned int __start___mmu_ftr_fixup, __stop___mmu_ftr_fixup; |
| 64 | 64 | ||
| 65 | /* MMU initialization (64-bit only fo now) */ | ||
| 66 | extern void early_init_mmu(void); | ||
| 67 | extern void early_init_mmu_secondary(void); | ||
| 68 | |||
| 65 | #endif /* !__ASSEMBLY__ */ | 69 | #endif /* !__ASSEMBLY__ */ |
| 66 | 70 | ||
| 67 | 71 | ||
diff --git a/arch/powerpc/kernel/setup_64.c b/arch/powerpc/kernel/setup_64.c index 73e16e298e28..c410c606955d 100644 --- a/arch/powerpc/kernel/setup_64.c +++ b/arch/powerpc/kernel/setup_64.c | |||
| @@ -202,8 +202,6 @@ void __init early_setup(unsigned long dt_ptr) | |||
| 202 | 202 | ||
| 203 | /* Fix up paca fields required for the boot cpu */ | 203 | /* Fix up paca fields required for the boot cpu */ |
| 204 | get_paca()->cpu_start = 1; | 204 | get_paca()->cpu_start = 1; |
| 205 | get_paca()->stab_real = __pa((u64)&initial_stab); | ||
| 206 | get_paca()->stab_addr = (u64)&initial_stab; | ||
| 207 | 205 | ||
| 208 | /* Probe the machine type */ | 206 | /* Probe the machine type */ |
| 209 | probe_machine(); | 207 | probe_machine(); |
| @@ -212,20 +210,8 @@ void __init early_setup(unsigned long dt_ptr) | |||
| 212 | 210 | ||
| 213 | DBG("Found, Initializing memory management...\n"); | 211 | DBG("Found, Initializing memory management...\n"); |
| 214 | 212 | ||
| 215 | /* | 213 | /* Initialize the hash table or TLB handling */ |
| 216 | * Initialize the MMU Hash table and create the linear mapping | 214 | early_init_mmu(); |
| 217 | * of memory. Has to be done before stab/slb initialization as | ||
| 218 | * this is currently where the page size encoding is obtained | ||
| 219 | */ | ||
| 220 | htab_initialize(); | ||
| 221 | |||
| 222 | /* | ||
| 223 | * Initialize stab / SLB management except on iSeries | ||
| 224 | */ | ||
| 225 | if (cpu_has_feature(CPU_FTR_SLB)) | ||
| 226 | slb_initialize(); | ||
| 227 | else if (!firmware_has_feature(FW_FEATURE_ISERIES)) | ||
| 228 | stab_initialize(get_paca()->stab_real); | ||
| 229 | 215 | ||
| 230 | DBG(" <- early_setup()\n"); | 216 | DBG(" <- early_setup()\n"); |
| 231 | } | 217 | } |
| @@ -233,22 +219,11 @@ void __init early_setup(unsigned long dt_ptr) | |||
| 233 | #ifdef CONFIG_SMP | 219 | #ifdef CONFIG_SMP |
| 234 | void early_setup_secondary(void) | 220 | void early_setup_secondary(void) |
| 235 | { | 221 | { |
| 236 | struct paca_struct *lpaca = get_paca(); | ||
| 237 | |||
| 238 | /* Mark interrupts enabled in PACA */ | 222 | /* Mark interrupts enabled in PACA */ |
| 239 | lpaca->soft_enabled = 0; | 223 | get_paca()->soft_enabled = 0; |
| 240 | 224 | ||
| 241 | /* Initialize hash table for that CPU */ | 225 | /* Initialize the hash table or TLB handling */ |
| 242 | htab_initialize_secondary(); | 226 | early_init_mmu_secondary(); |
| 243 | |||
| 244 | /* Initialize STAB/SLB. We use a virtual address as it works | ||
| 245 | * in real mode on pSeries and we want a virutal address on | ||
| 246 | * iSeries anyway | ||
| 247 | */ | ||
| 248 | if (cpu_has_feature(CPU_FTR_SLB)) | ||
| 249 | slb_initialize(); | ||
| 250 | else | ||
| 251 | stab_initialize(lpaca->stab_addr); | ||
| 252 | } | 227 | } |
| 253 | 228 | ||
| 254 | #endif /* CONFIG_SMP */ | 229 | #endif /* CONFIG_SMP */ |
diff --git a/arch/powerpc/mm/hash_utils_64.c b/arch/powerpc/mm/hash_utils_64.c index 86c00c885e68..db556d25c3a7 100644 --- a/arch/powerpc/mm/hash_utils_64.c +++ b/arch/powerpc/mm/hash_utils_64.c | |||
| @@ -590,7 +590,7 @@ static void __init htab_finish_init(void) | |||
| 590 | make_bl(htab_call_hpte_updatepp, ppc_md.hpte_updatepp); | 590 | make_bl(htab_call_hpte_updatepp, ppc_md.hpte_updatepp); |
| 591 | } | 591 | } |
| 592 | 592 | ||
| 593 | void __init htab_initialize(void) | 593 | static void __init htab_initialize(void) |
| 594 | { | 594 | { |
| 595 | unsigned long table; | 595 | unsigned long table; |
| 596 | unsigned long pteg_count; | 596 | unsigned long pteg_count; |
| @@ -732,11 +732,43 @@ void __init htab_initialize(void) | |||
| 732 | #undef KB | 732 | #undef KB |
| 733 | #undef MB | 733 | #undef MB |
| 734 | 734 | ||
| 735 | void htab_initialize_secondary(void) | 735 | void __init early_init_mmu(void) |
| 736 | { | 736 | { |
| 737 | /* Setup initial STAB address in the PACA */ | ||
| 738 | get_paca()->stab_real = __pa((u64)&initial_stab); | ||
| 739 | get_paca()->stab_addr = (u64)&initial_stab; | ||
| 740 | |||
| 741 | /* Initialize the MMU Hash table and create the linear mapping | ||
| 742 | * of memory. Has to be done before stab/slb initialization as | ||
| 743 | * this is currently where the page size encoding is obtained | ||
| 744 | */ | ||
| 745 | htab_initialize(); | ||
| 746 | |||
| 747 | /* Initialize stab / SLB management except on iSeries | ||
| 748 | */ | ||
| 749 | if (cpu_has_feature(CPU_FTR_SLB)) | ||
| 750 | slb_initialize(); | ||
| 751 | else if (!firmware_has_feature(FW_FEATURE_ISERIES)) | ||
| 752 | stab_initialize(get_paca()->stab_real); | ||
| 753 | } | ||
| 754 | |||
| 755 | #ifdef CONFIG_SMP | ||
| 756 | void __init early_init_mmu_secondary(void) | ||
| 757 | { | ||
| 758 | /* Initialize hash table for that CPU */ | ||
| 737 | if (!firmware_has_feature(FW_FEATURE_LPAR)) | 759 | if (!firmware_has_feature(FW_FEATURE_LPAR)) |
| 738 | mtspr(SPRN_SDR1, _SDR1); | 760 | mtspr(SPRN_SDR1, _SDR1); |
| 761 | |||
| 762 | /* Initialize STAB/SLB. We use a virtual address as it works | ||
| 763 | * in real mode on pSeries and we want a virutal address on | ||
| 764 | * iSeries anyway | ||
| 765 | */ | ||
| 766 | if (cpu_has_feature(CPU_FTR_SLB)) | ||
| 767 | slb_initialize(); | ||
| 768 | else | ||
| 769 | stab_initialize(get_paca()->stab_addr); | ||
| 739 | } | 770 | } |
| 771 | #endif /* CONFIG_SMP */ | ||
| 740 | 772 | ||
| 741 | /* | 773 | /* |
| 742 | * Called by asm hashtable.S for doing lazy icache flush | 774 | * Called by asm hashtable.S for doing lazy icache flush |
