diff options
Diffstat (limited to 'arch/powerpc/kernel/setup_64.c')
-rw-r--r-- | arch/powerpc/kernel/setup_64.c | 50 |
1 files changed, 41 insertions, 9 deletions
diff --git a/arch/powerpc/kernel/setup_64.c b/arch/powerpc/kernel/setup_64.c index 4085aaa9478f..f5f11a7d30e5 100644 --- a/arch/powerpc/kernel/setup_64.c +++ b/arch/powerpc/kernel/setup_64.c | |||
@@ -97,6 +97,36 @@ int dcache_bsize; | |||
97 | int icache_bsize; | 97 | int icache_bsize; |
98 | int ucache_bsize; | 98 | int ucache_bsize; |
99 | 99 | ||
100 | #if defined(CONFIG_PPC_BOOK3E) && defined(CONFIG_SMP) | ||
101 | static void setup_tlb_core_data(void) | ||
102 | { | ||
103 | int cpu; | ||
104 | |||
105 | for_each_possible_cpu(cpu) { | ||
106 | int first = cpu_first_thread_sibling(cpu); | ||
107 | |||
108 | paca[cpu].tcd_ptr = &paca[first].tcd; | ||
109 | |||
110 | /* | ||
111 | * If we have threads, we need either tlbsrx. | ||
112 | * or e6500 tablewalk mode, or else TLB handlers | ||
113 | * will be racy and could produce duplicate entries. | ||
114 | */ | ||
115 | if (smt_enabled_at_boot >= 2 && | ||
116 | !mmu_has_feature(MMU_FTR_USE_TLBRSRV) && | ||
117 | book3e_htw_mode != PPC_HTW_E6500) { | ||
118 | /* Should we panic instead? */ | ||
119 | WARN_ONCE("%s: unsupported MMU configuration -- expect problems\n", | ||
120 | __func__); | ||
121 | } | ||
122 | } | ||
123 | } | ||
124 | #else | ||
125 | static void setup_tlb_core_data(void) | ||
126 | { | ||
127 | } | ||
128 | #endif | ||
129 | |||
100 | #ifdef CONFIG_SMP | 130 | #ifdef CONFIG_SMP |
101 | 131 | ||
102 | static char *smt_enabled_cmdline; | 132 | static char *smt_enabled_cmdline; |
@@ -445,6 +475,7 @@ void __init setup_system(void) | |||
445 | 475 | ||
446 | smp_setup_cpu_maps(); | 476 | smp_setup_cpu_maps(); |
447 | check_smt_enabled(); | 477 | check_smt_enabled(); |
478 | setup_tlb_core_data(); | ||
448 | 479 | ||
449 | #ifdef CONFIG_SMP | 480 | #ifdef CONFIG_SMP |
450 | /* Release secondary cpus out of their spinloops at 0x60 now that | 481 | /* Release secondary cpus out of their spinloops at 0x60 now that |
@@ -520,9 +551,6 @@ static void __init irqstack_early_init(void) | |||
520 | #ifdef CONFIG_PPC_BOOK3E | 551 | #ifdef CONFIG_PPC_BOOK3E |
521 | static void __init exc_lvl_early_init(void) | 552 | static void __init exc_lvl_early_init(void) |
522 | { | 553 | { |
523 | extern unsigned int interrupt_base_book3e; | ||
524 | extern unsigned int exc_debug_debug_book3e; | ||
525 | |||
526 | unsigned int i; | 554 | unsigned int i; |
527 | 555 | ||
528 | for_each_possible_cpu(i) { | 556 | for_each_possible_cpu(i) { |
@@ -535,8 +563,7 @@ static void __init exc_lvl_early_init(void) | |||
535 | } | 563 | } |
536 | 564 | ||
537 | if (cpu_has_feature(CPU_FTR_DEBUG_LVL_EXC)) | 565 | if (cpu_has_feature(CPU_FTR_DEBUG_LVL_EXC)) |
538 | patch_branch(&interrupt_base_book3e + (0x040 / 4) + 1, | 566 | patch_exception(0x040, exc_debug_debug_book3e); |
539 | (unsigned long)&exc_debug_debug_book3e, 0); | ||
540 | } | 567 | } |
541 | #else | 568 | #else |
542 | #define exc_lvl_early_init() | 569 | #define exc_lvl_early_init() |
@@ -544,7 +571,8 @@ static void __init exc_lvl_early_init(void) | |||
544 | 571 | ||
545 | /* | 572 | /* |
546 | * Stack space used when we detect a bad kernel stack pointer, and | 573 | * Stack space used when we detect a bad kernel stack pointer, and |
547 | * early in SMP boots before relocation is enabled. | 574 | * early in SMP boots before relocation is enabled. Exclusive emergency |
575 | * stack for machine checks. | ||
548 | */ | 576 | */ |
549 | static void __init emergency_stack_init(void) | 577 | static void __init emergency_stack_init(void) |
550 | { | 578 | { |
@@ -567,6 +595,13 @@ static void __init emergency_stack_init(void) | |||
567 | sp = memblock_alloc_base(THREAD_SIZE, THREAD_SIZE, limit); | 595 | sp = memblock_alloc_base(THREAD_SIZE, THREAD_SIZE, limit); |
568 | sp += THREAD_SIZE; | 596 | sp += THREAD_SIZE; |
569 | paca[i].emergency_sp = __va(sp); | 597 | paca[i].emergency_sp = __va(sp); |
598 | |||
599 | #ifdef CONFIG_PPC_BOOK3S_64 | ||
600 | /* emergency stack for machine check exception handling. */ | ||
601 | sp = memblock_alloc_base(THREAD_SIZE, THREAD_SIZE, limit); | ||
602 | sp += THREAD_SIZE; | ||
603 | paca[i].mc_emergency_sp = __va(sp); | ||
604 | #endif | ||
570 | } | 605 | } |
571 | } | 606 | } |
572 | 607 | ||
@@ -588,9 +623,6 @@ void __init setup_arch(char **cmdline_p) | |||
588 | dcache_bsize = ppc64_caches.dline_size; | 623 | dcache_bsize = ppc64_caches.dline_size; |
589 | icache_bsize = ppc64_caches.iline_size; | 624 | icache_bsize = ppc64_caches.iline_size; |
590 | 625 | ||
591 | /* reboot on panic */ | ||
592 | panic_timeout = 180; | ||
593 | |||
594 | if (ppc_md.panic) | 626 | if (ppc_md.panic) |
595 | setup_panic(); | 627 | setup_panic(); |
596 | 628 | ||