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: default avatarBenjamin Herrenschmidt <benh@kernel.crashing.org>
parent a033a487
...@@ -284,8 +284,6 @@ extern void add_gpage(unsigned long addr, unsigned long page_size, ...@@ -284,8 +284,6 @@ extern void add_gpage(unsigned long addr, unsigned long page_size,
unsigned long number_of_pages); unsigned long number_of_pages);
extern void demote_segment_4k(struct mm_struct *mm, unsigned long addr); 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_native(void);
extern void hpte_init_lpar(void); extern void hpte_init_lpar(void);
extern void hpte_init_iSeries(void); extern void hpte_init_iSeries(void);
......
...@@ -62,6 +62,10 @@ static inline int mmu_has_feature(unsigned long feature) ...@@ -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__ */
......
...@@ -202,8 +202,6 @@ void __init early_setup(unsigned long dt_ptr) ...@@ -202,8 +202,6 @@ void __init early_setup(unsigned long dt_ptr)
/* Fix up paca fields required for the boot cpu */ /* Fix up paca fields required for the boot cpu */
get_paca()->cpu_start = 1; 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 the machine type */
probe_machine(); probe_machine();
...@@ -212,20 +210,8 @@ void __init early_setup(unsigned long dt_ptr) ...@@ -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 hash table or TLB handling */
* Initialize the MMU Hash table and create the linear mapping early_init_mmu();
* 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);
DBG(" <- early_setup()\n"); DBG(" <- early_setup()\n");
} }
...@@ -233,22 +219,11 @@ void __init early_setup(unsigned long dt_ptr) ...@@ -233,22 +219,11 @@ void __init early_setup(unsigned long dt_ptr)
#ifdef CONFIG_SMP #ifdef CONFIG_SMP
void early_setup_secondary(void) 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 */ /* Initialize the hash table or TLB handling */
htab_initialize_secondary(); early_init_mmu_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);
} }
#endif /* CONFIG_SMP */ #endif /* CONFIG_SMP */
......
...@@ -590,7 +590,7 @@ static void __init htab_finish_init(void) ...@@ -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 table;
unsigned long pteg_count; unsigned long pteg_count;
...@@ -732,11 +732,43 @@ void __init htab_initialize(void) ...@@ -732,11 +732,43 @@ void __init htab_initialize(void)
#undef KB #undef KB
#undef MB #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)) if (!firmware_has_feature(FW_FEATURE_LPAR))
mtspr(SPRN_SDR1, _SDR1); 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
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment