aboutsummaryrefslogtreecommitdiffstats
path: root/arch/powerpc/kernel/setup_32.c
diff options
context:
space:
mode:
Diffstat (limited to 'arch/powerpc/kernel/setup_32.c')
-rw-r--r--arch/powerpc/kernel/setup_32.c33
1 files changed, 33 insertions, 0 deletions
diff --git a/arch/powerpc/kernel/setup_32.c b/arch/powerpc/kernel/setup_32.c
index 19e8fcb9cea8..4efebe88e64a 100644
--- a/arch/powerpc/kernel/setup_32.c
+++ b/arch/powerpc/kernel/setup_32.c
@@ -101,6 +101,10 @@ notrace unsigned long __init early_init(unsigned long dt_ptr)
101 PTRRELOC(&__start___ftr_fixup), 101 PTRRELOC(&__start___ftr_fixup),
102 PTRRELOC(&__stop___ftr_fixup)); 102 PTRRELOC(&__stop___ftr_fixup));
103 103
104 do_lwsync_fixups(spec->cpu_features,
105 PTRRELOC(&__start___lwsync_fixup),
106 PTRRELOC(&__stop___lwsync_fixup));
107
104 return KERNELBASE + offset; 108 return KERNELBASE + offset;
105} 109}
106 110
@@ -127,6 +131,11 @@ notrace void __init machine_init(unsigned long dt_ptr, unsigned long phys)
127 ppc_md.power_save = ppc6xx_idle; 131 ppc_md.power_save = ppc6xx_idle;
128#endif 132#endif
129 133
134#ifdef CONFIG_E500
135 if (cpu_has_feature(CPU_FTR_CAN_DOZE) ||
136 cpu_has_feature(CPU_FTR_CAN_NAP))
137 ppc_md.power_save = e500_idle;
138#endif
130 if (ppc_md.progress) 139 if (ppc_md.progress)
131 ppc_md.progress("id mach(): done", 0x200); 140 ppc_md.progress("id mach(): done", 0x200);
132} 141}
@@ -248,6 +257,28 @@ static void __init irqstack_early_init(void)
248#define irqstack_early_init() 257#define irqstack_early_init()
249#endif 258#endif
250 259
260#if defined(CONFIG_BOOKE) || defined(CONFIG_40x)
261static void __init exc_lvl_early_init(void)
262{
263 unsigned int i;
264
265 /* interrupt stacks must be in lowmem, we get that for free on ppc32
266 * as the lmb is limited to lowmem by LMB_REAL_LIMIT */
267 for_each_possible_cpu(i) {
268 critirq_ctx[i] = (struct thread_info *)
269 __va(lmb_alloc(THREAD_SIZE, THREAD_SIZE));
270#ifdef CONFIG_BOOKE
271 dbgirq_ctx[i] = (struct thread_info *)
272 __va(lmb_alloc(THREAD_SIZE, THREAD_SIZE));
273 mcheckirq_ctx[i] = (struct thread_info *)
274 __va(lmb_alloc(THREAD_SIZE, THREAD_SIZE));
275#endif
276 }
277}
278#else
279#define exc_lvl_early_init()
280#endif
281
251/* Warning, IO base is not yet inited */ 282/* Warning, IO base is not yet inited */
252void __init setup_arch(char **cmdline_p) 283void __init setup_arch(char **cmdline_p)
253{ 284{
@@ -305,6 +336,8 @@ void __init setup_arch(char **cmdline_p)
305 init_mm.end_data = (unsigned long) _edata; 336 init_mm.end_data = (unsigned long) _edata;
306 init_mm.brk = klimit; 337 init_mm.brk = klimit;
307 338
339 exc_lvl_early_init();
340
308 irqstack_early_init(); 341 irqstack_early_init();
309 342
310 /* set up the bootmem stuff with available memory */ 343 /* set up the bootmem stuff with available memory */