diff options
Diffstat (limited to 'arch/powerpc/kernel/setup_32.c')
-rw-r--r-- | arch/powerpc/kernel/setup_32.c | 33 |
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) | ||
261 | static 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 */ |
252 | void __init setup_arch(char **cmdline_p) | 283 | void __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 */ |