powerpc/mm: Introduce early_init_mmu() on 64-bit
authorBenjamin Herrenschmidt <benh@kernel.crashing.org>
Thu, 19 Mar 2009 19:34:16 +0000 (19:34 +0000)
committerBenjamin Herrenschmidt <benh@kernel.crashing.org>
Tue, 24 Mar 2009 02:47:34 +0000 (13:47 +1100)
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>
arch/powerpc/include/asm/mmu-hash64.h
arch/powerpc/include/asm/mmu.h
arch/powerpc/kernel/setup_64.c
arch/powerpc/mm/hash_utils_64.c

index 68b7526..98c104a 100644 (file)
@@ -284,8 +284,6 @@ extern void add_gpage(unsigned long addr, unsigned long page_size,
                          unsigned long number_of_pages);
 extern void demote_segment_4k(struct mm_struct *mm, unsigned long addr);
 
                          unsigned long number_of_pages);
 extern void demote_segment_4k(struct mm_struct *mm, unsigned long addr);
 
-extern void htab_initialize(void);
-extern void htab_initialize_secondary(void);
 extern void hpte_init_native(void);
 extern void hpte_init_lpar(void);
 extern void hpte_init_iSeries(void);
 extern void hpte_init_native(void);
 extern void hpte_init_lpar(void);
 extern void hpte_init_iSeries(void);
index c073de4..cbf1543 100644 (file)
@@ -62,6 +62,10 @@ static inline int mmu_has_feature(unsigned long feature)
 
 extern unsigned int __start___mmu_ftr_fixup, __stop___mmu_ftr_fixup;
 
 
 extern unsigned int __start___mmu_ftr_fixup, __stop___mmu_ftr_fixup;
 
+/* MMU initialization (64-bit only fo now) */
+extern void early_init_mmu(void);
+extern void early_init_mmu_secondary(void);
+
 #endif /* !__ASSEMBLY__ */
 
 
 #endif /* !__ASSEMBLY__ */
 
 
index 73e16e2..c410c60 100644 (file)
@@ -202,8 +202,6 @@ void __init early_setup(unsigned long dt_ptr)
 
        /* Fix up paca fields required for the boot cpu */
        get_paca()->cpu_start = 1;
 
        /* Fix up paca fields required for the boot cpu */
        get_paca()->cpu_start = 1;
-       get_paca()->stab_real = __pa((u64)&initial_stab);
-       get_paca()->stab_addr = (u64)&initial_stab;
 
        /* Probe the machine type */
        probe_machine();
 
        /* Probe the machine type */
        probe_machine();
@@ -212,20 +210,8 @@ void __init early_setup(unsigned long dt_ptr)
 
        DBG("Found, Initializing memory management...\n");
 
 
        DBG("Found, Initializing memory management...\n");
 
-       /*
-        * Initialize the MMU Hash table and create the linear mapping
-        * of memory. Has to be done before stab/slb initialization as
-        * this is currently where the page size encoding is obtained
-        */
-       htab_initialize();
-
-       /*
-        * Initialize stab / SLB management except on iSeries
-        */
-       if (cpu_has_feature(CPU_FTR_SLB))
-               slb_initialize();
-       else if (!firmware_has_feature(FW_FEATURE_ISERIES))
-               stab_initialize(get_paca()->stab_real);
+       /* Initialize the hash table or TLB handling */
+       early_init_mmu();
 
        DBG(" <- early_setup()\n");
 }
 
        DBG(" <- early_setup()\n");
 }
@@ -233,22 +219,11 @@ void __init early_setup(unsigned long dt_ptr)
 #ifdef CONFIG_SMP
 void early_setup_secondary(void)
 {
 #ifdef CONFIG_SMP
 void early_setup_secondary(void)
 {
-       struct paca_struct *lpaca = get_paca();
-
        /* Mark interrupts enabled in PACA */
        /* Mark interrupts enabled in PACA */
-       lpaca->soft_enabled = 0;
+       get_paca()->soft_enabled = 0;
 
 
-       /* Initialize hash table for that CPU */
-       htab_initialize_secondary();
-
-       /* Initialize STAB/SLB. We use a virtual address as it works
-        * in real mode on pSeries and we want a virutal address on
-        * iSeries anyway
-        */
-       if (cpu_has_feature(CPU_FTR_SLB))
-               slb_initialize();
-       else
-               stab_initialize(lpaca->stab_addr);
+       /* Initialize the hash table or TLB handling */
+       early_init_mmu_secondary();
 }
 
 #endif /* CONFIG_SMP */
 }
 
 #endif /* CONFIG_SMP */
index 86c00c8..db556d2 100644 (file)
@@ -590,7 +590,7 @@ static void __init htab_finish_init(void)
        make_bl(htab_call_hpte_updatepp, ppc_md.hpte_updatepp);
 }
 
        make_bl(htab_call_hpte_updatepp, ppc_md.hpte_updatepp);
 }
 
-void __init htab_initialize(void)
+static void __init htab_initialize(void)
 {
        unsigned long table;
        unsigned long pteg_count;
 {
        unsigned long table;
        unsigned long pteg_count;
@@ -732,11 +732,43 @@ void __init htab_initialize(void)
 #undef KB
 #undef MB
 
 #undef KB
 #undef MB
 
-void htab_initialize_secondary(void)
+void __init early_init_mmu(void)
 {
 {
+       /* Setup initial STAB address in the PACA */
+       get_paca()->stab_real = __pa((u64)&initial_stab);
+       get_paca()->stab_addr = (u64)&initial_stab;
+
+       /* Initialize the MMU Hash table and create the linear mapping
+        * of memory. Has to be done before stab/slb initialization as
+        * this is currently where the page size encoding is obtained
+        */
+       htab_initialize();
+
+       /* Initialize stab / SLB management except on iSeries
+        */
+       if (cpu_has_feature(CPU_FTR_SLB))
+               slb_initialize();
+       else if (!firmware_has_feature(FW_FEATURE_ISERIES))
+               stab_initialize(get_paca()->stab_real);
+}
+
+#ifdef CONFIG_SMP
+void __init early_init_mmu_secondary(void)
+{
+       /* Initialize hash table for that CPU */
        if (!firmware_has_feature(FW_FEATURE_LPAR))
                mtspr(SPRN_SDR1, _SDR1);
        if (!firmware_has_feature(FW_FEATURE_LPAR))
                mtspr(SPRN_SDR1, _SDR1);
+
+       /* Initialize STAB/SLB. We use a virtual address as it works
+        * in real mode on pSeries and we want a virutal address on
+        * iSeries anyway
+        */
+       if (cpu_has_feature(CPU_FTR_SLB))
+               slb_initialize();
+       else
+               stab_initialize(get_paca()->stab_addr);
 }
 }
+#endif /* CONFIG_SMP */
 
 /*
  * Called by asm hashtable.S for doing lazy icache flush
 
 /*
  * Called by asm hashtable.S for doing lazy icache flush