Signed-off-by: liguang <lig.f...@cn.fujitsu.com> --- drivers/platform/x86/cpu_physic_hotplug.c | 30 ++++++++++++++++++++++++++-- 1 files changed, 27 insertions(+), 3 deletions(-)
diff --git a/drivers/platform/x86/cpu_physic_hotplug.c b/drivers/platform/x86/cpu_physic_hotplug.c index a52c042..1cdac1b 100644 --- a/drivers/platform/x86/cpu_physic_hotplug.c +++ b/drivers/platform/x86/cpu_physic_hotplug.c @@ -9,6 +9,11 @@ MODULE_AUTHOR("Li Guang"); MODULE_DESCRIPTION("CPU physically hot-plug/unplug Driver"); MODULE_LICENSE("GPL"); +#define EC_SPACE_CPU_IDX 3 +#define EC_SPACE_CPU_OFFSET 4 +#define EC_SPACE_CPU_CMD 2 +#define EC_CPU_EJECT 0xE7 + static int cpu_logic_hotplug_notify(struct notifier_block *nfb, unsigned long action, void *hcpu) { @@ -20,6 +25,7 @@ static int cpu_logic_hotplug_notify(struct notifier_block *nfb, case CPU_ONLINE: break; case CPU_DEAD: + ec_write(EC_SPACE_CPU_CMD, EC_CPU_EJECT); break; default: break; @@ -34,8 +40,26 @@ static struct notifier_block cpu_logic_hotplug_notifier = }; static int cpu_physic_hotplug_notify(struct notifier_block *nfb, - unsigned char *s) + unsigned long action, void *s) { + u8 index = 0, val = 0; + bool cpu_state = false; + struct acpi_processor *pr; + + ec_read(EC_SPACE_CPU_IDX, &index); + if (index == 0) + goto out; + pr = per_cpu(processors, index); + + ec_read(EC_SPACE_CPU_OFFSET + index/8, &val); + if (val & 1 << index/8) + cpu_state = true; + + if (pr->flags.need_hotplug_init & cpu_state) + cpu_up(pr->id); + +out: + return NOTIFY_OK; } static struct notifier_block cpu_physic_hotplug_notifier = @@ -46,14 +70,14 @@ static struct notifier_block cpu_physic_hotplug_notifier = static int __init cpu_qemu_hotplug_init(void) { register_hotcpu_notifier(&cpu_logic_hotplug_notifier); - register_ec_gpe_notifier(&cpu_physic_hotplug_notifier); + register_ec_space_notifier(&cpu_physic_hotplug_notifier); return 0; } static void __exit cpu_qemu_hotplug_exit(void) { unregister_hotcpu_notifier(&cpu_logic_hotplug_notifier); - unregister_ec_gpe_notifier(&cpu_physic_hotplug_notifier); + unregister_ec_space_notifier(&cpu_physic_hotplug_notifier); } module_init(cpu_qemu_hotplug_init); -- 1.7.2.5 -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/