Signed-off-by: liguang <lig.fnst@xxxxxxxxxxxxxx> --- drivers/platform/x86/cpu_physic_hotplug.c | 27 +++++++++++++++++++++++++-- 1 files changed, 25 insertions(+), 2 deletions(-) diff --git a/drivers/platform/x86/cpu_physic_hotplug.c b/drivers/platform/x86/cpu_physic_hotplug.c index a52c042..a84c999 100644 --- a/drivers/platform/x86/cpu_physic_hotplug.c +++ b/drivers/platform/x86/cpu_physic_hotplug.c @@ -9,6 +9,9 @@ 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 + static int cpu_logic_hotplug_notify(struct notifier_block *nfb, unsigned long action, void *hcpu) { @@ -36,6 +39,26 @@ static struct notifier_block cpu_logic_hotplug_notifier = static int cpu_physic_hotplug_notify(struct notifier_block *nfb, unsigned char *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); + else + cpu_down(pr->id); + +out: + return NOTIFY_OK; } static struct notifier_block cpu_physic_hotplug_notifier = @@ -46,14 +69,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 platform-driver-x86" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html