powerpc/pmac/smp: Consolidate 32-bit and 64-bit PowerMac cpu_die in one file

Signed-off-by: default avatarBenjamin Herrenschmidt <benh@kernel.crashing.org>
parent 45e07fd0
...@@ -33,7 +33,6 @@ extern void pmac_setup_pci_dma(void); ...@@ -33,7 +33,6 @@ extern void pmac_setup_pci_dma(void);
extern void pmac_check_ht_link(void); extern void pmac_check_ht_link(void);
extern void pmac_setup_smp(void); extern void pmac_setup_smp(void);
extern void pmac32_cpu_die(void);
extern void low_cpu_die(void) __attribute__((noreturn)); extern void low_cpu_die(void) __attribute__((noreturn));
extern int pmac_nvram_init(void); extern int pmac_nvram_init(void);
......
...@@ -650,51 +650,6 @@ static int pmac_pci_probe_mode(struct pci_bus *bus) ...@@ -650,51 +650,6 @@ static int pmac_pci_probe_mode(struct pci_bus *bus)
return PCI_PROBE_NORMAL; return PCI_PROBE_NORMAL;
return PCI_PROBE_DEVTREE; return PCI_PROBE_DEVTREE;
} }
#ifdef CONFIG_HOTPLUG_CPU
/* access per cpu vars from generic smp.c */
DECLARE_PER_CPU(int, cpu_state);
static void pmac64_cpu_die(void)
{
/*
* turn off as much as possible, we'll be
* kicked out as this will only be invoked
* on core99 platforms for now ...
*/
printk(KERN_INFO "CPU#%d offline\n", smp_processor_id());
__get_cpu_var(cpu_state) = CPU_DEAD;
smp_wmb();
/*
* during the path that leads here preemption is disabled,
* reenable it now so that when coming up preempt count is
* zero correctly
*/
preempt_enable();
/*
* hard-disable interrupts for the non-NAP case, the NAP code
* needs to re-enable interrupts (but soft-disables them)
*/
hard_irq_disable();
while (1) {
/* let's not take timer interrupts too often ... */
set_dec(0x7fffffff);
/* should always be true at this point */
if (cpu_has_feature(CPU_FTR_CAN_NAP))
power4_cpu_offline_powersave();
else {
HMT_low();
HMT_very_low();
}
}
}
#endif /* CONFIG_HOTPLUG_CPU */
#endif /* CONFIG_PPC64 */ #endif /* CONFIG_PPC64 */
define_machine(powermac) { define_machine(powermac) {
...@@ -726,15 +681,4 @@ define_machine(powermac) { ...@@ -726,15 +681,4 @@ define_machine(powermac) {
.pcibios_after_init = pmac_pcibios_after_init, .pcibios_after_init = pmac_pcibios_after_init,
.phys_mem_access_prot = pci_phys_mem_access_prot, .phys_mem_access_prot = pci_phys_mem_access_prot,
#endif #endif
#ifdef CONFIG_HOTPLUG_CPU
#ifdef CONFIG_PPC64
.cpu_die = pmac64_cpu_die,
#endif
#ifdef CONFIG_PPC32
.cpu_die = pmac32_cpu_die,
#endif
#endif
#if defined(CONFIG_HOTPLUG_CPU) && defined(CONFIG_PPC32)
.cpu_die = generic_mach_cpu_die,
#endif
}; };
...@@ -865,7 +865,7 @@ static void __devinit smp_core99_setup_cpu(int cpu_nr) ...@@ -865,7 +865,7 @@ static void __devinit smp_core99_setup_cpu(int cpu_nr)
} }
#if defined(CONFIG_HOTPLUG_CPU) && defined(CONFIG_PPC32) #ifdef CONFIG_HOTPLUG_CPU
static int smp_core99_cpu_disable(void) static int smp_core99_cpu_disable(void)
{ {
...@@ -878,7 +878,9 @@ static int smp_core99_cpu_disable(void) ...@@ -878,7 +878,9 @@ static int smp_core99_cpu_disable(void)
return 0; return 0;
} }
void pmac32_cpu_die(void) #ifdef CONFIG_PPC32
static void pmac_cpu_die(void)
{ {
local_irq_disable(); local_irq_disable();
idle_task_exit(); idle_task_exit();
...@@ -889,7 +891,52 @@ void pmac32_cpu_die(void) ...@@ -889,7 +891,52 @@ void pmac32_cpu_die(void)
low_cpu_die(); low_cpu_die();
} }
#endif /* CONFIG_HOTPLUG_CPU && CONFIG_PP32 */ #else /* CONFIG_PPC32 */
static void pmac_cpu_die(void)
{
local_irq_disable();
idle_task_exit();
/*
* turn off as much as possible, we'll be
* kicked out as this will only be invoked
* on core99 platforms for now ...
*/
printk(KERN_INFO "CPU#%d offline\n", smp_processor_id());
__get_cpu_var(cpu_state) = CPU_DEAD;
smp_wmb();
/*
* during the path that leads here preemption is disabled,
* reenable it now so that when coming up preempt count is
* zero correctly
*/
preempt_enable();
/*
* hard-disable interrupts for the non-NAP case, the NAP code
* needs to re-enable interrupts (but soft-disables them)
*/
hard_irq_disable();
while (1) {
/* let's not take timer interrupts too often ... */
set_dec(0x7fffffff);
/* should always be true at this point */
if (cpu_has_feature(CPU_FTR_CAN_NAP))
power4_cpu_offline_powersave();
else {
HMT_low();
HMT_very_low();
}
}
}
#endif /* else CONFIG_PPC32 */
#endif /* CONFIG_HOTPLUG_CPU */
/* Core99 Macs (dual G4s and G5s) */ /* Core99 Macs (dual G4s and G5s) */
struct smp_ops_t core99_smp_ops = { struct smp_ops_t core99_smp_ops = {
...@@ -933,5 +980,10 @@ void __init pmac_setup_smp(void) ...@@ -933,5 +980,10 @@ void __init pmac_setup_smp(void)
smp_ops = &psurge_smp_ops; smp_ops = &psurge_smp_ops;
} }
#endif /* CONFIG_PPC32 */ #endif /* CONFIG_PPC32 */
#ifdef CONFIG_HOTPLUG_CPU
ppc_md.cpu_die = pmac_cpu_die;
#endif
} }
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