|
From: | Marcel Apfelbaum |
Subject: | Re: [Qemu-devel] [PATCH 20/33] pc: q35: initialize new CPU hotplug hw |
Date: | Tue, 31 May 2016 13:21:20 +0300 |
User-agent: | Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Thunderbird/38.5.0 |
On 05/31/2016 01:06 PM, Igor Mammedov wrote:
On Mon, 30 May 2016 22:02:31 +0300 Marcel Apfelbaum <address@hidden> wrote:On 05/17/2016 05:43 PM, Igor Mammedov wrote:add necessary wiring to init new CPU hotplug hardware if ICH9-LPC.cpu-hotplug-legacy is "off". Set ICH9-LPC.cpu-hotplug-legacy to "off" by default and switch legacy hotplug to enabled only for 2.6 and older machine types. Signed-off-by: Igor Mammedov <address@hidden> --- v1: - drop ICH9-LPC.cpu-hotplug property --- hw/acpi/ich9.c | 42 +++++++++++++++++++++++++++++++++++++----- include/hw/acpi/ich9.h | 6 +++++- include/hw/compat.h | 6 +++++- 3 files changed, 47 insertions(+), 7 deletions(-) diff --git a/hw/acpi/ich9.c b/hw/acpi/ich9.c index 121e30c..b0285b9 100644 --- a/hw/acpi/ich9.c +++ b/hw/acpi/ich9.c @@ -170,6 +170,24 @@ static const VMStateDescription vmstate_memhp_state = { } }; +static bool vmstate_test_use_cpuhp(void *opaque) +{ + ICH9LPCPMRegs *s = opaque; + return !s->cpu_hotplug_legacy; +} + +static const VMStateDescription vmstate_cpuhp_state = { + .name = "ich9_pm/cpuhp", + .version_id = 1, + .minimum_version_id = 1, + .minimum_version_id_old = 1, + .needed = vmstate_test_use_cpuhp, + .fields = (VMStateField[]) { + VMSTATE_CPU_HOTPLUG(cpuhp.state, ICH9LPCPMRegs), + VMSTATE_END_OF_LIST() + } +}; + static bool vmstate_test_use_tco(void *opaque) { ICH9LPCPMRegs *s = opaque; @@ -209,6 +227,7 @@ const VMStateDescription vmstate_ich9_pm = { .subsections = (const VMStateDescription*[]) { &vmstate_memhp_state, &vmstate_tco_io_state, + &vmstate_cpuhp_state, NULL } }; @@ -275,7 +294,10 @@ void ich9_pm_init(PCIDevice *lpc_pci, ICH9LPCPMRegs *pm, if (pm->cpu_hotplug_legacy) { legacy_acpi_cpu_hotplug_init(pci_address_space_io(lpc_pci), - OBJECT(lpc_pci), &pm->gpe_cpu, ICH9_CPU_HOTPLUG_IO_BASE); + OBJECT(lpc_pci), &pm->cpuhp.legacy, ICH9_CPU_HOTPLUG_IO_BASE); + } else { + cpu_hotplug_hw_init(pci_address_space_io(lpc_pci), OBJECT(lpc_pci), + &pm->cpuhp.state, ICH9_CPU_HOTPLUG_IO_BASE); } if (pm->acpi_memory_hotplug.is_enabled) { @@ -414,7 +436,6 @@ void ich9_pm_add_properties(Object *obj, ICH9LPCPMRegs *pm, Error **errp) { static const uint32_t gpe0_len = ICH9_PMIO_GPE0_LEN; pm->acpi_memory_hotplug.is_enabled = true; - pm->cpu_hotplug_legacy = true;Maybe is too soon to disable legacy CPU hotplug? Will the new cpu hotplug mechanism work from this patch on, or it will break git bisect?it doesn't break bisect compile wise nor 'make check' wise, but it's hotplug won't be functional till acpi: add CPU hotplug methods to DSDT perhaps I need to move it there or into a separate patch after it.
Exactly, I would move the "enabling" code after the new hotplug mechanism is functional. The same for the next patch for piix4. Thanks, Marcel
Thanks, Marcelpm->disable_s3 = 0; pm->disable_s4 = 0; pm->s4_val = 2; @@ -461,9 +482,13 @@ void ich9_pm_device_plug_cb(HotplugHandler *hotplug_dev, DeviceState *dev, object_dynamic_cast(OBJECT(dev), TYPE_PC_DIMM)) { acpi_memory_plug_cb(hotplug_dev, &lpc->pm.acpi_memory_hotplug, dev, errp); - } else if (lpc->pm.cpu_hotplug_legacy && - object_dynamic_cast(OBJECT(dev), TYPE_CPU)) { - legacy_acpi_cpu_plug_cb(hotplug_dev, &lpc->pm.gpe_cpu, dev, errp); + } else if (object_dynamic_cast(OBJECT(dev), TYPE_CPU)) { + if (lpc->pm.cpu_hotplug_legacy) { + legacy_acpi_cpu_plug_cb(hotplug_dev, &lpc->pm.cpuhp.legacy, dev, + errp); + } else { + acpi_cpu_plug_cb(hotplug_dev, &lpc->pm.cpuhp.state, dev, errp); + } } else { error_setg(errp, "acpi: device plug request for not supported device" " type: %s", object_get_typename(OBJECT(dev))); @@ -480,6 +505,10 @@ void ich9_pm_device_unplug_request_cb(HotplugHandler *hotplug_dev, acpi_memory_unplug_request_cb(hotplug_dev, &lpc->pm.acpi_memory_hotplug, dev, errp); + } else if (object_dynamic_cast(OBJECT(dev), TYPE_CPU) && + !lpc->pm.cpu_hotplug_legacy) { + acpi_cpu_unplug_request_cb(hotplug_dev, &lpc->pm.cpuhp.state, + dev, errp); } else { error_setg(errp, "acpi: device unplug request for not supported device" " type: %s", object_get_typename(OBJECT(dev))); @@ -494,6 +523,9 @@ void ich9_pm_device_unplug_cb(HotplugHandler *hotplug_dev, DeviceState *dev, if (lpc->pm.acpi_memory_hotplug.is_enabled && object_dynamic_cast(OBJECT(dev), TYPE_PC_DIMM)) { acpi_memory_unplug_cb(&lpc->pm.acpi_memory_hotplug, dev, errp); + } else if (object_dynamic_cast(OBJECT(dev), TYPE_CPU) && + !lpc->pm.cpu_hotplug_legacy) { + acpi_cpu_unplug_cb(&lpc->pm.cpuhp.state, dev, errp); } else { error_setg(errp, "acpi: device unplug for not supported device" " type: %s", object_get_typename(OBJECT(dev))); diff --git a/include/hw/acpi/ich9.h b/include/hw/acpi/ich9.h index e29a856..198c017 100644 --- a/include/hw/acpi/ich9.h +++ b/include/hw/acpi/ich9.h @@ -23,6 +23,7 @@ #include "hw/acpi/acpi.h" #include "hw/acpi/cpu_hotplug.h" +#include "hw/acpi/cpu.h" #include "hw/acpi/memory_hotplug.h" #include "hw/acpi/acpi_dev_interface.h" #include "hw/acpi/tco.h" @@ -49,7 +50,10 @@ typedef struct ICH9LPCPMRegs { Notifier powerdown_notifier; bool cpu_hotplug_legacy; - AcpiCpuHotplug gpe_cpu; + union { + AcpiCpuHotplug legacy; /* used for keeping legacy state */ + CPUHotplugState state; + } cpuhp; MemHotplugState acpi_memory_hotplug; diff --git a/include/hw/compat.h b/include/hw/compat.h index 636befe..a65d9d2 100644 --- a/include/hw/compat.h +++ b/include/hw/compat.h @@ -2,7 +2,11 @@ #define HW_COMPAT_H #define HW_COMPAT_2_6 \ - /* empty */ + {\ + .driver = "ICH9-LPC",\ + .property = "cpu-hotplug-legacy",\ + .value = "on",\ + },\ #define HW_COMPAT_2_5 \ {\
[Prev in Thread] | Current Thread | [Next in Thread] |