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 |