diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2011-04-01 11:57:02 -0400 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2011-04-01 11:57:02 -0400 |
| commit | ccd00d1091fa7fff151127f26f6900be2ac8cc10 (patch) | |
| tree | 2fdd334f5cef98018557d94a69d9432e4f8005e2 | |
| parent | afdef69c7ff7d0bf59e3cafc187aefb12878dbe3 (diff) | |
| parent | c0bb9e45f3a7f67fc358946727bc3d5f23d0f55d (diff) | |
Merge branch 'merge' of git://git.kernel.org/pub/scm/linux/kernel/git/benh/powerpc
* 'merge' of git://git.kernel.org/pub/scm/linux/kernel/git/benh/powerpc:
kdump: Allow shrinking of kdump region to be overridden
powerpc/pmac/smp: Remove no-longer needed preempt workaround
powerpc/smp: Increase vdso_data->processorCount, not just decrease it
powerpc/smp: Create idle threads on demand and properly reset them
powerpc/smp: Don't expose per-cpu "cpu_state" array
powerpc/pmac/smp: Fix CPU hotplug crashes on some machines
powerpc/smp: Add a smp_ops->bringup_up() done callback
powerpc/pmac: Rename cpu_state in therm_pm72 to avoid collision
powerpc/pmac/smp: Properly NAP offlined CPU on G5
powerpc/pmac/smp: Remove HMT changes for PowerMac offline code
powerpc/pmac/smp: Consolidate 32-bit and 64-bit PowerMac cpu_die in one file
powerpc/pmac/smp: Fixup smp_core99_cpu_disable() and use it on 64-bit
powerpc/pmac/smp: Rename fixup_irqs() to migrate_irqs() and use it on ppc32
powerpc/pmac/smp: Fix 32-bit PowerMac cpu_die
powerpc/smp: Remove unused smp_ops->cpu_enable()
powerpc/smp: Remove unused generic_cpu_enable()
powerpc/smp: Fix generic_mach_cpu_die()
powerpc/smp: soft-replugged CPUs must go back to start_secondary
powerpc: Make decrementer interrupt robust against offlined CPUs
| -rw-r--r-- | arch/powerpc/include/asm/machdep.h | 3 | ||||
| -rw-r--r-- | arch/powerpc/include/asm/smp.h | 5 | ||||
| -rw-r--r-- | arch/powerpc/kernel/head_32.S | 9 | ||||
| -rw-r--r-- | arch/powerpc/kernel/head_64.S | 7 | ||||
| -rw-r--r-- | arch/powerpc/kernel/idle_power4.S | 21 | ||||
| -rw-r--r-- | arch/powerpc/kernel/irq.c | 3 | ||||
| -rw-r--r-- | arch/powerpc/kernel/smp.c | 153 | ||||
| -rw-r--r-- | arch/powerpc/kernel/time.c | 15 | ||||
| -rw-r--r-- | arch/powerpc/platforms/powermac/pmac.h | 1 | ||||
| -rw-r--r-- | arch/powerpc/platforms/powermac/setup.c | 56 | ||||
| -rw-r--r-- | arch/powerpc/platforms/powermac/smp.c | 154 | ||||
| -rw-r--r-- | arch/powerpc/platforms/pseries/offline_states.h | 2 | ||||
| -rw-r--r-- | drivers/macintosh/therm_pm72.c | 60 | ||||
| -rw-r--r-- | include/linux/kexec.h | 1 | ||||
| -rw-r--r-- | kernel/kexec.c | 5 |
15 files changed, 272 insertions, 223 deletions
diff --git a/arch/powerpc/include/asm/machdep.h b/arch/powerpc/include/asm/machdep.h index fe56a23e1ff0..e4f01915fbb0 100644 --- a/arch/powerpc/include/asm/machdep.h +++ b/arch/powerpc/include/asm/machdep.h | |||
| @@ -35,9 +35,9 @@ struct smp_ops_t { | |||
| 35 | int (*probe)(void); | 35 | int (*probe)(void); |
| 36 | void (*kick_cpu)(int nr); | 36 | void (*kick_cpu)(int nr); |
| 37 | void (*setup_cpu)(int nr); | 37 | void (*setup_cpu)(int nr); |
| 38 | void (*bringup_done)(void); | ||
| 38 | void (*take_timebase)(void); | 39 | void (*take_timebase)(void); |
| 39 | void (*give_timebase)(void); | 40 | void (*give_timebase)(void); |
| 40 | int (*cpu_enable)(unsigned int nr); | ||
| 41 | int (*cpu_disable)(void); | 41 | int (*cpu_disable)(void); |
| 42 | void (*cpu_die)(unsigned int nr); | 42 | void (*cpu_die)(unsigned int nr); |
| 43 | int (*cpu_bootable)(unsigned int nr); | 43 | int (*cpu_bootable)(unsigned int nr); |
| @@ -267,7 +267,6 @@ struct machdep_calls { | |||
| 267 | 267 | ||
| 268 | extern void e500_idle(void); | 268 | extern void e500_idle(void); |
| 269 | extern void power4_idle(void); | 269 | extern void power4_idle(void); |
| 270 | extern void power4_cpu_offline_powersave(void); | ||
| 271 | extern void ppc6xx_idle(void); | 270 | extern void ppc6xx_idle(void); |
| 272 | extern void book3e_idle(void); | 271 | extern void book3e_idle(void); |
| 273 | 272 | ||
diff --git a/arch/powerpc/include/asm/smp.h b/arch/powerpc/include/asm/smp.h index 66e237bbe15f..a902a0d3ae0d 100644 --- a/arch/powerpc/include/asm/smp.h +++ b/arch/powerpc/include/asm/smp.h | |||
| @@ -36,15 +36,16 @@ extern void cpu_die(void); | |||
| 36 | 36 | ||
| 37 | extern void smp_send_debugger_break(int cpu); | 37 | extern void smp_send_debugger_break(int cpu); |
| 38 | extern void smp_message_recv(int); | 38 | extern void smp_message_recv(int); |
| 39 | extern void start_secondary_resume(void); | ||
| 39 | 40 | ||
| 40 | DECLARE_PER_CPU(unsigned int, cpu_pvr); | 41 | DECLARE_PER_CPU(unsigned int, cpu_pvr); |
| 41 | 42 | ||
| 42 | #ifdef CONFIG_HOTPLUG_CPU | 43 | #ifdef CONFIG_HOTPLUG_CPU |
| 43 | extern void fixup_irqs(const struct cpumask *map); | 44 | extern void migrate_irqs(void); |
| 44 | int generic_cpu_disable(void); | 45 | int generic_cpu_disable(void); |
| 45 | int generic_cpu_enable(unsigned int cpu); | ||
| 46 | void generic_cpu_die(unsigned int cpu); | 46 | void generic_cpu_die(unsigned int cpu); |
| 47 | void generic_mach_cpu_die(void); | 47 | void generic_mach_cpu_die(void); |
| 48 | void generic_set_cpu_dead(unsigned int cpu); | ||
| 48 | #endif | 49 | #endif |
| 49 | 50 | ||
| 50 | #ifdef CONFIG_PPC64 | 51 | #ifdef CONFIG_PPC64 |
diff --git a/arch/powerpc/kernel/head_32.S b/arch/powerpc/kernel/head_32.S index 98c4b29a56f4..c5c24beb8387 100644 --- a/arch/powerpc/kernel/head_32.S +++ b/arch/powerpc/kernel/head_32.S | |||
| @@ -890,6 +890,15 @@ __secondary_start: | |||
| 890 | mtspr SPRN_SRR1,r4 | 890 | mtspr SPRN_SRR1,r4 |
| 891 | SYNC | 891 | SYNC |
| 892 | RFI | 892 | RFI |
| 893 | |||
| 894 | _GLOBAL(start_secondary_resume) | ||
| 895 | /* Reset stack */ | ||
| 896 | rlwinm r1,r1,0,0,(31-THREAD_SHIFT) /* current_thread_info() */ | ||
| 897 | addi r1,r1,THREAD_SIZE-STACK_FRAME_OVERHEAD | ||
| 898 | li r3,0 | ||
| 899 | std r3,0(r1) /* Zero the stack frame pointer */ | ||
| 900 | bl start_secondary | ||
| 901 | b . | ||
| 893 | #endif /* CONFIG_SMP */ | 902 | #endif /* CONFIG_SMP */ |
| 894 | 903 | ||
| 895 | #ifdef CONFIG_KVM_BOOK3S_HANDLER | 904 | #ifdef CONFIG_KVM_BOOK3S_HANDLER |
diff --git a/arch/powerpc/kernel/head_64.S b/arch/powerpc/kernel/head_64.S index 782f23df7c85..271140b38b6f 100644 --- a/arch/powerpc/kernel/head_64.S +++ b/arch/powerpc/kernel/head_64.S | |||
| @@ -536,6 +536,13 @@ _GLOBAL(pmac_secondary_start) | |||
| 536 | add r13,r13,r4 /* for this processor. */ | 536 | add r13,r13,r4 /* for this processor. */ |
| 537 | mtspr SPRN_SPRG_PACA,r13 /* Save vaddr of paca in an SPRG*/ | 537 | mtspr SPRN_SPRG_PACA,r13 /* Save vaddr of paca in an SPRG*/ |
| 538 | 538 | ||
| 539 | /* Mark interrupts soft and hard disabled (they might be enabled | ||
| 540 | * in the PACA when doing hotplug) | ||
| 541 | */ | ||
| 542 | li r0,0 | ||
| 543 | stb r0,PACASOFTIRQEN(r13) | ||
| 544 | stb r0,PACAHARDIRQEN(r13) | ||
| 545 | |||
| 539 | /* Create a temp kernel stack for use before relocation is on. */ | 546 | /* Create a temp kernel stack for use before relocation is on. */ |
| 540 | ld r1,PACAEMERGSP(r13) | 547 | ld r1,PACAEMERGSP(r13) |
| 541 | subi r1,r1,STACK_FRAME_OVERHEAD | 548 | subi r1,r1,STACK_FRAME_OVERHEAD |
diff --git a/arch/powerpc/kernel/idle_power4.S b/arch/powerpc/kernel/idle_power4.S index 5328709eeedc..ba3195478600 100644 --- a/arch/powerpc/kernel/idle_power4.S +++ b/arch/powerpc/kernel/idle_power4.S | |||
| @@ -53,24 +53,3 @@ END_FTR_SECTION_IFSET(CPU_FTR_ALTIVEC) | |||
| 53 | isync | 53 | isync |
| 54 | b 1b | 54 | b 1b |
| 55 | 55 | ||
| 56 | _GLOBAL(power4_cpu_offline_powersave) | ||
| 57 | /* Go to NAP now */ | ||
| 58 | mfmsr r7 | ||
| 59 | rldicl r0,r7,48,1 | ||
| 60 | rotldi r0,r0,16 | ||
| 61 | mtmsrd r0,1 /* hard-disable interrupts */ | ||
| 62 | li r0,1 | ||
| 63 | li r6,0 | ||
| 64 | stb r0,PACAHARDIRQEN(r13) /* we'll hard-enable shortly */ | ||
| 65 | stb r6,PACASOFTIRQEN(r13) /* soft-disable irqs */ | ||
| 66 | BEGIN_FTR_SECTION | ||
| 67 | DSSALL | ||
| 68 | sync | ||
| 69 | END_FTR_SECTION_IFSET(CPU_FTR_ALTIVEC) | ||
| 70 | ori r7,r7,MSR_EE | ||
| 71 | oris r7,r7,MSR_POW@h | ||
| 72 | sync | ||
| 73 | isync | ||
| 74 | mtmsrd r7 | ||
| 75 | isync | ||
| 76 | blr | ||
diff --git a/arch/powerpc/kernel/irq.c b/arch/powerpc/kernel/irq.c index 63625e0650b5..f621b7d2d869 100644 --- a/arch/powerpc/kernel/irq.c +++ b/arch/powerpc/kernel/irq.c | |||
| @@ -246,12 +246,13 @@ u64 arch_irq_stat_cpu(unsigned int cpu) | |||
| 246 | } | 246 | } |
| 247 | 247 | ||
| 248 | #ifdef CONFIG_HOTPLUG_CPU | 248 | #ifdef CONFIG_HOTPLUG_CPU |
| 249 | void fixup_irqs(const struct cpumask *map) | 249 | void migrate_irqs(void) |
| 250 | { | 250 | { |
| 251 | struct irq_desc *desc; | 251 | struct irq_desc *desc; |
| 252 | unsigned int irq; | 252 | unsigned int irq; |
| 253 | static int warned; | 253 | static int warned; |
| 254 | cpumask_var_t mask; | 254 | cpumask_var_t mask; |
| 255 | const struct cpumask *map = cpu_online_mask; | ||
| 255 | 256 | ||
| 256 | alloc_cpumask_var(&mask, GFP_KERNEL); | 257 | alloc_cpumask_var(&mask, GFP_KERNEL); |
| 257 | 258 | ||
diff --git a/arch/powerpc/kernel/smp.c b/arch/powerpc/kernel/smp.c index 981360509172..cbdbb14be4b0 100644 --- a/arch/powerpc/kernel/smp.c +++ b/arch/powerpc/kernel/smp.c | |||
| @@ -57,6 +57,25 @@ | |||
| 57 | #define DBG(fmt...) | 57 | #define DBG(fmt...) |
| 58 | #endif | 58 | #endif |
| 59 | 59 | ||
| 60 | |||
| 61 | /* Store all idle threads, this can be reused instead of creating | ||
| 62 | * a new thread. Also avoids complicated thread destroy functionality | ||
| 63 | * for idle threads. | ||
| 64 | */ | ||
| 65 | #ifdef CONFIG_HOTPLUG_CPU | ||
| 66 | /* | ||
| 67 | * Needed only for CONFIG_HOTPLUG_CPU because __cpuinitdata is | ||
| 68 | * removed after init for !CONFIG_HOTPLUG_CPU. | ||
| 69 | */ | ||
| 70 | static DEFINE_PER_CPU(struct task_struct *, idle_thread_array); | ||
| 71 | #define get_idle_for_cpu(x) (per_cpu(idle_thread_array, x)) | ||
| 72 | #define set_idle_for_cpu(x, p) (per_cpu(idle_thread_array, x) = (p)) | ||
| 73 | #else | ||
| 74 | static struct task_struct *idle_thread_array[NR_CPUS] __cpuinitdata ; | ||
| 75 | #define get_idle_for_cpu(x) (idle_thread_array[(x)]) | ||
| 76 | #define set_idle_for_cpu(x, p) (idle_thread_array[(x)] = (p)) | ||
