Message ID | 14ee117df13b08403032eb07843b91e1861228d9.1695697701.git.lixianglai@loongson.cn (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | *** Adds CPU hot-plug support to Loongarch *** | expand |
Same with this patch. It already exists in the architecture agnostic patches part of below: https://lore.kernel.org/qemu-devel/20230926100436.28284-1-salil.mehta@huawei.com/T/#t Thanks Salil. > From: xianglai li <lixianglai@loongson.cn> > Sent: Tuesday, September 26, 2023 10:54 AM > To: qemu-devel@nongnu.org > Cc: Salil Mehta <salil.mehta@opnsrc.net>; Salil Mehta > <salil.mehta@huawei.com>; Bernhard Beschow <shentey@gmail.com>; Xiaojuan > Yang <yangxiaojuan@loongson.cn>; Song Gao <gaosong@loongson.cn>; Michael S. > Tsirkin <mst@redhat.com>; Igor Mammedov <imammedo@redhat.com>; Ani Sinha > <anisinha@redhat.com>; Paolo Bonzini <pbonzini@redhat.com>; Richard > Henderson <richard.henderson@linaro.org>; Eduardo Habkost > <eduardo@habkost.net>; Marcel Apfelbaum <marcel.apfelbaum@gmail.com>; > Philippe Mathieu-Daudé <philmd@linaro.org>; wangyanan (Y) > <wangyanan55@huawei.com>; Daniel P. Berrangé <berrange@redhat.com>; Peter > Xu <peterx@redhat.com>; David Hildenbrand <david@redhat.com>; Bibo Mao > <maobibo@loongson.cn> > Subject: [PATCH v3 1/7] Update ACPI GED framework to support vcpu hot- > (un)plug > > ACPI GED shall be used to convey to the guest kernel about any cpu hot- > (un)plug > events. Therefore, existing ACPI GED framework inside QEMU needs to be > enhanced > to support CPU hot-(un)plug state and events. > > Co-authored-by: "Salil Mehta" <salil.mehta@opnsrc.net> > Co-authored-by: "Salil Mehta" <salil.mehta@huawei.com> > Cc: "Bernhard Beschow" <shentey@gmail.com> > Cc: "Salil Mehta" <salil.mehta@huawei.com> > Cc: "Salil Mehta" <salil.mehta@opnsrc.net> > Cc: Xiaojuan Yang <yangxiaojuan@loongson.cn> > Cc: Song Gao <gaosong@loongson.cn> > Cc: "Michael S. Tsirkin" <mst@redhat.com> > Cc: Igor Mammedov <imammedo@redhat.com> > Cc: Ani Sinha <anisinha@redhat.com> > Cc: Paolo Bonzini <pbonzini@redhat.com> > Cc: Richard Henderson <richard.henderson@linaro.org> > Cc: Eduardo Habkost <eduardo@habkost.net> > Cc: Marcel Apfelbaum <marcel.apfelbaum@gmail.com> > Cc: "Philippe Mathieu-Daudé" <philmd@linaro.org> > Cc: Yanan Wang <wangyanan55@huawei.com> > Cc: "Daniel P. Berrangé" <berrange@redhat.com> > Cc: Peter Xu <peterx@redhat.com> > Cc: David Hildenbrand <david@redhat.com> > Cc: Bibo Mao <maobibo@loongson.cn> > Signed-off-by: xianglai li <lixianglai@loongson.cn> > --- > hw/acpi/acpi-cpu-hotplug-stub.c | 6 +++++ > hw/acpi/cpu.c | 7 ------ > hw/acpi/generic_event_device.c | 33 ++++++++++++++++++++++++++ > include/hw/acpi/cpu_hotplug.h | 10 ++++++++ > include/hw/acpi/generic_event_device.h | 5 ++++ > 5 files changed, 54 insertions(+), 7 deletions(-) > > diff --git a/hw/acpi/acpi-cpu-hotplug-stub.c b/hw/acpi/acpi-cpu-hotplug- > stub.c > index 3fc4b14c26..2aec90d968 100644 > --- a/hw/acpi/acpi-cpu-hotplug-stub.c > +++ b/hw/acpi/acpi-cpu-hotplug-stub.c > @@ -24,6 +24,12 @@ void acpi_cpu_ospm_status(CPUHotplugState *cpu_st, > ACPIOSTInfoList ***list) > return; > } > > +void cpu_hotplug_hw_init(MemoryRegion *as, Object *owner, > + CPUHotplugState *state, hwaddr base_addr) > +{ > + return; > +} > + > void acpi_cpu_plug_cb(HotplugHandler *hotplug_dev, > CPUHotplugState *cpu_st, DeviceState *dev, Error > **errp) > { > diff --git a/hw/acpi/cpu.c b/hw/acpi/cpu.c > index 011d2c6c2d..5bad983928 100644 > --- a/hw/acpi/cpu.c > +++ b/hw/acpi/cpu.c > @@ -7,13 +7,6 @@ > #include "trace.h" > #include "sysemu/numa.h" > > -#define ACPI_CPU_HOTPLUG_REG_LEN 12 > -#define ACPI_CPU_SELECTOR_OFFSET_WR 0 > -#define ACPI_CPU_FLAGS_OFFSET_RW 4 > -#define ACPI_CPU_CMD_OFFSET_WR 5 > -#define ACPI_CPU_CMD_DATA_OFFSET_RW 8 > -#define ACPI_CPU_CMD_DATA2_OFFSET_R 0 > - > #define OVMF_CPUHP_SMI_CMD 4 > > enum { > diff --git a/hw/acpi/generic_event_device.c > b/hw/acpi/generic_event_device.c > index a3d31631fe..c5a70957b4 100644 > --- a/hw/acpi/generic_event_device.c > +++ b/hw/acpi/generic_event_device.c > @@ -12,6 +12,7 @@ > #include "qemu/osdep.h" > #include "qapi/error.h" > #include "hw/acpi/acpi.h" > +#include "hw/acpi/cpu.h" > #include "hw/acpi/generic_event_device.h" > #include "hw/irq.h" > #include "hw/mem/pc-dimm.h" > @@ -25,6 +26,7 @@ static const uint32_t ged_supported_events[] = { > ACPI_GED_MEM_HOTPLUG_EVT, > ACPI_GED_PWR_DOWN_EVT, > ACPI_GED_NVDIMM_HOTPLUG_EVT, > + ACPI_GED_CPU_HOTPLUG_EVT, > }; > > /* > @@ -117,6 +119,10 @@ void build_ged_aml(Aml *table, const char *name, > HotplugHandler *hotplug_dev, > aml_notify(aml_name("\\_SB.NVDR"), > aml_int(0x80))); > break; > + case ACPI_GED_CPU_HOTPLUG_EVT: > + aml_append(if_ctx, aml_call0(ACPI_CPU_CONTAINER "." > + ACPI_CPU_SCAN_METHOD)); > + break; > default: > /* > * Please make sure all the events in > ged_supported_events[] > @@ -234,6 +240,8 @@ static void acpi_ged_device_plug_cb(HotplugHandler > *hotplug_dev, > } else { > acpi_memory_plug_cb(hotplug_dev, &s->memhp_state, dev, errp); > } > + } else if (object_dynamic_cast(OBJECT(dev), TYPE_CPU)) { > + acpi_cpu_plug_cb(hotplug_dev, &s->cpuhp_state, dev, errp); > } else { > error_setg(errp, "virt: device plug request for unsupported > device" > " type: %s", object_get_typename(OBJECT(dev))); > @@ -248,6 +256,8 @@ static void acpi_ged_unplug_request_cb(HotplugHandler > *hotplug_dev, > if ((object_dynamic_cast(OBJECT(dev), TYPE_PC_DIMM) && > !(object_dynamic_cast(OBJECT(dev), TYPE_NVDIMM)))) > { > acpi_memory_unplug_request_cb(hotplug_dev, &s->memhp_state, dev, > errp); > + } else if (object_dynamic_cast(OBJECT(dev), TYPE_CPU)) { > + acpi_cpu_unplug_request_cb(hotplug_dev, &s->cpuhp_state, dev, > errp); > } else { > error_setg(errp, "acpi: device unplug request for unsupported > device" > " type: %s", object_get_typename(OBJECT(dev))); > @@ -261,6 +271,8 @@ static void acpi_ged_unplug_cb(HotplugHandler > *hotplug_dev, > > if (object_dynamic_cast(OBJECT(dev), TYPE_PC_DIMM)) { > acpi_memory_unplug_cb(&s->memhp_state, dev, errp); > + } else if (object_dynamic_cast(OBJECT(dev), TYPE_CPU)) { > + acpi_cpu_unplug_cb(&s->cpuhp_state, dev, errp); > } else { > error_setg(errp, "acpi: device unplug for unsupported device" > " type: %s", object_get_typename(OBJECT(dev))); > @@ -272,6 +284,7 @@ static void acpi_ged_ospm_status(AcpiDeviceIf *adev, > ACPIOSTInfoList ***list) > AcpiGedState *s = ACPI_GED(adev); > > acpi_memory_ospm_status(&s->memhp_state, list); > + acpi_cpu_ospm_status(&s->cpuhp_state, list); > } > > static void acpi_ged_send_event(AcpiDeviceIf *adev, AcpiEventStatusBits > ev) > @@ -286,6 +299,8 @@ static void acpi_ged_send_event(AcpiDeviceIf *adev, > AcpiEventStatusBits ev) > sel = ACPI_GED_PWR_DOWN_EVT; > } else if (ev & ACPI_NVDIMM_HOTPLUG_STATUS) { > sel = ACPI_GED_NVDIMM_HOTPLUG_EVT; > + } else if (ev & ACPI_CPU_HOTPLUG_STATUS) { > + sel = ACPI_GED_CPU_HOTPLUG_EVT; > } else { > /* Unknown event. Return without generating interrupt. */ > warn_report("GED: Unsupported event %d. No irq injected", ev); > @@ -318,6 +333,16 @@ static const VMStateDescription vmstate_memhp_state = > { > } > }; > > +static const VMStateDescription vmstate_cpuhp_state = { > + .name = "acpi-ged/cpuhp", > + .version_id = 1, > + .minimum_version_id = 1, > + .fields = (VMStateField[]) { > + VMSTATE_CPU_HOTPLUG(cpuhp_state, AcpiGedState), > + VMSTATE_END_OF_LIST() > + } > +}; > + > static const VMStateDescription vmstate_ged_state = { > .name = "acpi-ged-state", > .version_id = 1, > @@ -366,6 +391,7 @@ static const VMStateDescription vmstate_acpi_ged = { > }, > .subsections = (const VMStateDescription * []) { > &vmstate_memhp_state, > + &vmstate_cpuhp_state, > &vmstate_ghes_state, > NULL > } > @@ -400,6 +426,13 @@ static void acpi_ged_initfn(Object *obj) > memory_region_init_io(&ged_st->regs, obj, &ged_regs_ops, ged_st, > TYPE_ACPI_GED "-regs", ACPI_GED_REG_COUNT); > sysbus_init_mmio(sbd, &ged_st->regs); > + > + s->cpuhp.device = OBJECT(s); > + memory_region_init(&s->container_cpuhp, OBJECT(dev), "cpuhp > container", > + ACPI_CPU_HOTPLUG_REG_LEN); > + sysbus_init_mmio(SYS_BUS_DEVICE(dev), &s->container_cpuhp); > + cpu_hotplug_hw_init(&s->container_cpuhp, OBJECT(dev), > + &s->cpuhp_state, 0); > } > > static void acpi_ged_class_init(ObjectClass *class, void *data) > diff --git a/include/hw/acpi/cpu_hotplug.h b/include/hw/acpi/cpu_hotplug.h > index 3b932abbbb..afee1ab996 100644 > --- a/include/hw/acpi/cpu_hotplug.h > +++ b/include/hw/acpi/cpu_hotplug.h > @@ -19,6 +19,16 @@ > #include "hw/hotplug.h" > #include "hw/acpi/cpu.h" > > +#define ACPI_CPU_HOTPLUG_REG_LEN 12 > +#define ACPI_CPU_SELECTOR_OFFSET_WR 0 > +#define ACPI_CPU_FLAGS_OFFSET_RW 4 > +#define ACPI_CPU_CMD_OFFSET_WR 5 > +#define ACPI_CPU_CMD_DATA_OFFSET_RW 8 > +#define ACPI_CPU_CMD_DATA2_OFFSET_R 0 > + > +#define ACPI_CPU_SCAN_METHOD "CSCN" > +#define ACPI_CPU_CONTAINER "\\_SB.CPUS" > + > typedef struct AcpiCpuHotplug { > Object *device; > MemoryRegion io; > diff --git a/include/hw/acpi/generic_event_device.h > b/include/hw/acpi/generic_event_device.h > index ba84ce0214..a803ea818e 100644 > --- a/include/hw/acpi/generic_event_device.h > +++ b/include/hw/acpi/generic_event_device.h > @@ -60,6 +60,7 @@ > #define HW_ACPI_GENERIC_EVENT_DEVICE_H > > #include "hw/sysbus.h" > +#include "hw/acpi/cpu_hotplug.h" > #include "hw/acpi/memory_hotplug.h" > #include "hw/acpi/ghes.h" > #include "qom/object.h" > @@ -95,6 +96,7 @@ OBJECT_DECLARE_SIMPLE_TYPE(AcpiGedState, ACPI_GED) > #define ACPI_GED_MEM_HOTPLUG_EVT 0x1 > #define ACPI_GED_PWR_DOWN_EVT 0x2 > #define ACPI_GED_NVDIMM_HOTPLUG_EVT 0x4 > +#define ACPI_GED_CPU_HOTPLUG_EVT 0x8 > > typedef struct GEDState { > MemoryRegion evt; > @@ -106,6 +108,9 @@ struct AcpiGedState { > SysBusDevice parent_obj; > MemHotplugState memhp_state; > MemoryRegion container_memhp; > + CPUHotplugState cpuhp_state; > + MemoryRegion container_cpuhp; > + AcpiCpuHotplug cpuhp; > GEDState ged_state; > uint32_t ged_event_bitmap; > qemu_irq irq; > -- > 2.39.1 >
On Tue, Sep 26, 2023 at 05:54:26PM +0800, xianglai li wrote: > ACPI GED shall be used to convey to the guest kernel about any cpu hot-(un)plug > events. Therefore, existing ACPI GED framework inside QEMU needs to be enhanced > to support CPU hot-(un)plug state and events. > > Co-authored-by: "Salil Mehta" <salil.mehta@opnsrc.net> > Co-authored-by: "Salil Mehta" <salil.mehta@huawei.com> This is not the way to handle multiple emails. > Cc: "Bernhard Beschow" <shentey@gmail.com> > Cc: "Salil Mehta" <salil.mehta@huawei.com> > Cc: "Salil Mehta" <salil.mehta@opnsrc.net> > Cc: Xiaojuan Yang <yangxiaojuan@loongson.cn> > Cc: Song Gao <gaosong@loongson.cn> > Cc: "Michael S. Tsirkin" <mst@redhat.com> > Cc: Igor Mammedov <imammedo@redhat.com> > Cc: Ani Sinha <anisinha@redhat.com> > Cc: Paolo Bonzini <pbonzini@redhat.com> > Cc: Richard Henderson <richard.henderson@linaro.org> > Cc: Eduardo Habkost <eduardo@habkost.net> > Cc: Marcel Apfelbaum <marcel.apfelbaum@gmail.com> > Cc: "Philippe Mathieu-Daudé" <philmd@linaro.org> > Cc: Yanan Wang <wangyanan55@huawei.com> > Cc: "Daniel P. Berrangé" <berrange@redhat.com> > Cc: Peter Xu <peterx@redhat.com> > Cc: David Hildenbrand <david@redhat.com> > Cc: Bibo Mao <maobibo@loongson.cn> > Signed-off-by: xianglai li <lixianglai@loongson.cn> > --- > hw/acpi/acpi-cpu-hotplug-stub.c | 6 +++++ > hw/acpi/cpu.c | 7 ------ > hw/acpi/generic_event_device.c | 33 ++++++++++++++++++++++++++ > include/hw/acpi/cpu_hotplug.h | 10 ++++++++ > include/hw/acpi/generic_event_device.h | 5 ++++ > 5 files changed, 54 insertions(+), 7 deletions(-) > > diff --git a/hw/acpi/acpi-cpu-hotplug-stub.c b/hw/acpi/acpi-cpu-hotplug-stub.c > index 3fc4b14c26..2aec90d968 100644 > --- a/hw/acpi/acpi-cpu-hotplug-stub.c > +++ b/hw/acpi/acpi-cpu-hotplug-stub.c > @@ -24,6 +24,12 @@ void acpi_cpu_ospm_status(CPUHotplugState *cpu_st, ACPIOSTInfoList ***list) > return; > } > > +void cpu_hotplug_hw_init(MemoryRegion *as, Object *owner, > + CPUHotplugState *state, hwaddr base_addr) > +{ > + return; > +} > + > void acpi_cpu_plug_cb(HotplugHandler *hotplug_dev, > CPUHotplugState *cpu_st, DeviceState *dev, Error **errp) > { > diff --git a/hw/acpi/cpu.c b/hw/acpi/cpu.c > index 011d2c6c2d..5bad983928 100644 > --- a/hw/acpi/cpu.c > +++ b/hw/acpi/cpu.c > @@ -7,13 +7,6 @@ > #include "trace.h" > #include "sysemu/numa.h" > > -#define ACPI_CPU_HOTPLUG_REG_LEN 12 > -#define ACPI_CPU_SELECTOR_OFFSET_WR 0 > -#define ACPI_CPU_FLAGS_OFFSET_RW 4 > -#define ACPI_CPU_CMD_OFFSET_WR 5 > -#define ACPI_CPU_CMD_DATA_OFFSET_RW 8 > -#define ACPI_CPU_CMD_DATA2_OFFSET_R 0 > - > #define OVMF_CPUHP_SMI_CMD 4 > > enum { > diff --git a/hw/acpi/generic_event_device.c b/hw/acpi/generic_event_device.c > index a3d31631fe..c5a70957b4 100644 > --- a/hw/acpi/generic_event_device.c > +++ b/hw/acpi/generic_event_device.c > @@ -12,6 +12,7 @@ > #include "qemu/osdep.h" > #include "qapi/error.h" > #include "hw/acpi/acpi.h" > +#include "hw/acpi/cpu.h" > #include "hw/acpi/generic_event_device.h" > #include "hw/irq.h" > #include "hw/mem/pc-dimm.h" > @@ -25,6 +26,7 @@ static const uint32_t ged_supported_events[] = { > ACPI_GED_MEM_HOTPLUG_EVT, > ACPI_GED_PWR_DOWN_EVT, > ACPI_GED_NVDIMM_HOTPLUG_EVT, > + ACPI_GED_CPU_HOTPLUG_EVT, > }; > > /* > @@ -117,6 +119,10 @@ void build_ged_aml(Aml *table, const char *name, HotplugHandler *hotplug_dev, > aml_notify(aml_name("\\_SB.NVDR"), > aml_int(0x80))); > break; > + case ACPI_GED_CPU_HOTPLUG_EVT: > + aml_append(if_ctx, aml_call0(ACPI_CPU_CONTAINER "." > + ACPI_CPU_SCAN_METHOD)); > + break; > default: > /* > * Please make sure all the events in ged_supported_events[] > @@ -234,6 +240,8 @@ static void acpi_ged_device_plug_cb(HotplugHandler *hotplug_dev, > } else { > acpi_memory_plug_cb(hotplug_dev, &s->memhp_state, dev, errp); > } > + } else if (object_dynamic_cast(OBJECT(dev), TYPE_CPU)) { > + acpi_cpu_plug_cb(hotplug_dev, &s->cpuhp_state, dev, errp); > } else { > error_setg(errp, "virt: device plug request for unsupported device" > " type: %s", object_get_typename(OBJECT(dev))); > @@ -248,6 +256,8 @@ static void acpi_ged_unplug_request_cb(HotplugHandler *hotplug_dev, > if ((object_dynamic_cast(OBJECT(dev), TYPE_PC_DIMM) && > !(object_dynamic_cast(OBJECT(dev), TYPE_NVDIMM)))) { > acpi_memory_unplug_request_cb(hotplug_dev, &s->memhp_state, dev, errp); > + } else if (object_dynamic_cast(OBJECT(dev), TYPE_CPU)) { > + acpi_cpu_unplug_request_cb(hotplug_dev, &s->cpuhp_state, dev, errp); > } else { > error_setg(errp, "acpi: device unplug request for unsupported device" > " type: %s", object_get_typename(OBJECT(dev))); > @@ -261,6 +271,8 @@ static void acpi_ged_unplug_cb(HotplugHandler *hotplug_dev, > > if (object_dynamic_cast(OBJECT(dev), TYPE_PC_DIMM)) { > acpi_memory_unplug_cb(&s->memhp_state, dev, errp); > + } else if (object_dynamic_cast(OBJECT(dev), TYPE_CPU)) { > + acpi_cpu_unplug_cb(&s->cpuhp_state, dev, errp); > } else { > error_setg(errp, "acpi: device unplug for unsupported device" > " type: %s", object_get_typename(OBJECT(dev))); > @@ -272,6 +284,7 @@ static void acpi_ged_ospm_status(AcpiDeviceIf *adev, ACPIOSTInfoList ***list) > AcpiGedState *s = ACPI_GED(adev); > > acpi_memory_ospm_status(&s->memhp_state, list); > + acpi_cpu_ospm_status(&s->cpuhp_state, list); > } > > static void acpi_ged_send_event(AcpiDeviceIf *adev, AcpiEventStatusBits ev) > @@ -286,6 +299,8 @@ static void acpi_ged_send_event(AcpiDeviceIf *adev, AcpiEventStatusBits ev) > sel = ACPI_GED_PWR_DOWN_EVT; > } else if (ev & ACPI_NVDIMM_HOTPLUG_STATUS) { > sel = ACPI_GED_NVDIMM_HOTPLUG_EVT; > + } else if (ev & ACPI_CPU_HOTPLUG_STATUS) { > + sel = ACPI_GED_CPU_HOTPLUG_EVT; > } else { > /* Unknown event. Return without generating interrupt. */ > warn_report("GED: Unsupported event %d. No irq injected", ev); > @@ -318,6 +333,16 @@ static const VMStateDescription vmstate_memhp_state = { > } > }; > > +static const VMStateDescription vmstate_cpuhp_state = { > + .name = "acpi-ged/cpuhp", > + .version_id = 1, > + .minimum_version_id = 1, > + .fields = (VMStateField[]) { > + VMSTATE_CPU_HOTPLUG(cpuhp_state, AcpiGedState), > + VMSTATE_END_OF_LIST() > + } > +}; > + > static const VMStateDescription vmstate_ged_state = { > .name = "acpi-ged-state", > .version_id = 1, > @@ -366,6 +391,7 @@ static const VMStateDescription vmstate_acpi_ged = { > }, > .subsections = (const VMStateDescription * []) { > &vmstate_memhp_state, > + &vmstate_cpuhp_state, > &vmstate_ghes_state, > NULL > } > @@ -400,6 +426,13 @@ static void acpi_ged_initfn(Object *obj) > memory_region_init_io(&ged_st->regs, obj, &ged_regs_ops, ged_st, > TYPE_ACPI_GED "-regs", ACPI_GED_REG_COUNT); > sysbus_init_mmio(sbd, &ged_st->regs); > + > + s->cpuhp.device = OBJECT(s); > + memory_region_init(&s->container_cpuhp, OBJECT(dev), "cpuhp container", > + ACPI_CPU_HOTPLUG_REG_LEN); > + sysbus_init_mmio(SYS_BUS_DEVICE(dev), &s->container_cpuhp); > + cpu_hotplug_hw_init(&s->container_cpuhp, OBJECT(dev), > + &s->cpuhp_state, 0); > } > > static void acpi_ged_class_init(ObjectClass *class, void *data) > diff --git a/include/hw/acpi/cpu_hotplug.h b/include/hw/acpi/cpu_hotplug.h > index 3b932abbbb..afee1ab996 100644 > --- a/include/hw/acpi/cpu_hotplug.h > +++ b/include/hw/acpi/cpu_hotplug.h > @@ -19,6 +19,16 @@ > #include "hw/hotplug.h" > #include "hw/acpi/cpu.h" > > +#define ACPI_CPU_HOTPLUG_REG_LEN 12 > +#define ACPI_CPU_SELECTOR_OFFSET_WR 0 > +#define ACPI_CPU_FLAGS_OFFSET_RW 4 > +#define ACPI_CPU_CMD_OFFSET_WR 5 > +#define ACPI_CPU_CMD_DATA_OFFSET_RW 8 > +#define ACPI_CPU_CMD_DATA2_OFFSET_R 0 > + > +#define ACPI_CPU_SCAN_METHOD "CSCN" > +#define ACPI_CPU_CONTAINER "\\_SB.CPUS" > + > typedef struct AcpiCpuHotplug { > Object *device; > MemoryRegion io; > diff --git a/include/hw/acpi/generic_event_device.h b/include/hw/acpi/generic_event_device.h > index ba84ce0214..a803ea818e 100644 > --- a/include/hw/acpi/generic_event_device.h > +++ b/include/hw/acpi/generic_event_device.h > @@ -60,6 +60,7 @@ > #define HW_ACPI_GENERIC_EVENT_DEVICE_H > > #include "hw/sysbus.h" > +#include "hw/acpi/cpu_hotplug.h" > #include "hw/acpi/memory_hotplug.h" > #include "hw/acpi/ghes.h" > #include "qom/object.h" > @@ -95,6 +96,7 @@ OBJECT_DECLARE_SIMPLE_TYPE(AcpiGedState, ACPI_GED) > #define ACPI_GED_MEM_HOTPLUG_EVT 0x1 > #define ACPI_GED_PWR_DOWN_EVT 0x2 > #define ACPI_GED_NVDIMM_HOTPLUG_EVT 0x4 > +#define ACPI_GED_CPU_HOTPLUG_EVT 0x8 > > typedef struct GEDState { > MemoryRegion evt; > @@ -106,6 +108,9 @@ struct AcpiGedState { > SysBusDevice parent_obj; > MemHotplugState memhp_state; > MemoryRegion container_memhp; > + CPUHotplugState cpuhp_state; > + MemoryRegion container_cpuhp; > + AcpiCpuHotplug cpuhp; > GEDState ged_state; > uint32_t ged_event_bitmap; > qemu_irq irq; > -- > 2.39.1
Hi, Michael S. Tsirkin : > On Tue, Sep 26, 2023 at 05:54:26PM +0800, xianglai li wrote: >> ACPI GED shall be used to convey to the guest kernel about any cpu hot-(un)plug >> events. Therefore, existing ACPI GED framework inside QEMU needs to be enhanced >> to support CPU hot-(un)plug state and events. >> >> Co-authored-by: "Salil Mehta" <salil.mehta@opnsrc.net> >> Co-authored-by: "Salil Mehta" <salil.mehta@huawei.com> > This is not the way to handle multiple emails. Oh, sorry, I'll delete the first one. Thanks, Xianglai. > >> Cc: "Bernhard Beschow" <shentey@gmail.com> >> Cc: "Salil Mehta" <salil.mehta@huawei.com> >> Cc: "Salil Mehta" <salil.mehta@opnsrc.net> >> Cc: Xiaojuan Yang <yangxiaojuan@loongson.cn> >> Cc: Song Gao <gaosong@loongson.cn> >> Cc: "Michael S. Tsirkin" <mst@redhat.com> >> Cc: Igor Mammedov <imammedo@redhat.com> >> Cc: Ani Sinha <anisinha@redhat.com> >> Cc: Paolo Bonzini <pbonzini@redhat.com> >> Cc: Richard Henderson <richard.henderson@linaro.org> >> Cc: Eduardo Habkost <eduardo@habkost.net> >> Cc: Marcel Apfelbaum <marcel.apfelbaum@gmail.com> >> Cc: "Philippe Mathieu-Daudé" <philmd@linaro.org> >> Cc: Yanan Wang <wangyanan55@huawei.com> >> Cc: "Daniel P. Berrangé" <berrange@redhat.com> >> Cc: Peter Xu <peterx@redhat.com> >> Cc: David Hildenbrand <david@redhat.com> >> Cc: Bibo Mao <maobibo@loongson.cn> >> Signed-off-by: xianglai li <lixianglai@loongson.cn> >> --- >> hw/acpi/acpi-cpu-hotplug-stub.c | 6 +++++ >> hw/acpi/cpu.c | 7 ------ >> hw/acpi/generic_event_device.c | 33 ++++++++++++++++++++++++++ >> include/hw/acpi/cpu_hotplug.h | 10 ++++++++ >> include/hw/acpi/generic_event_device.h | 5 ++++ >> 5 files changed, 54 insertions(+), 7 deletions(-) >> >> diff --git a/hw/acpi/acpi-cpu-hotplug-stub.c b/hw/acpi/acpi-cpu-hotplug-stub.c >> index 3fc4b14c26..2aec90d968 100644 >> --- a/hw/acpi/acpi-cpu-hotplug-stub.c >> +++ b/hw/acpi/acpi-cpu-hotplug-stub.c >> @@ -24,6 +24,12 @@ void acpi_cpu_ospm_status(CPUHotplugState *cpu_st, ACPIOSTInfoList ***list) >> return; >> } >> >> +void cpu_hotplug_hw_init(MemoryRegion *as, Object *owner, >> + CPUHotplugState *state, hwaddr base_addr) >> +{ >> + return; >> +} >> + >> void acpi_cpu_plug_cb(HotplugHandler *hotplug_dev, >> CPUHotplugState *cpu_st, DeviceState *dev, Error **errp) >> { >> diff --git a/hw/acpi/cpu.c b/hw/acpi/cpu.c >> index 011d2c6c2d..5bad983928 100644 >> --- a/hw/acpi/cpu.c >> +++ b/hw/acpi/cpu.c >> @@ -7,13 +7,6 @@ >> #include "trace.h" >> #include "sysemu/numa.h" >> >> -#define ACPI_CPU_HOTPLUG_REG_LEN 12 >> -#define ACPI_CPU_SELECTOR_OFFSET_WR 0 >> -#define ACPI_CPU_FLAGS_OFFSET_RW 4 >> -#define ACPI_CPU_CMD_OFFSET_WR 5 >> -#define ACPI_CPU_CMD_DATA_OFFSET_RW 8 >> -#define ACPI_CPU_CMD_DATA2_OFFSET_R 0 >> - >> #define OVMF_CPUHP_SMI_CMD 4 >> >> enum { >> diff --git a/hw/acpi/generic_event_device.c b/hw/acpi/generic_event_device.c >> index a3d31631fe..c5a70957b4 100644 >> --- a/hw/acpi/generic_event_device.c >> +++ b/hw/acpi/generic_event_device.c >> @@ -12,6 +12,7 @@ >> #include "qemu/osdep.h" >> #include "qapi/error.h" >> #include "hw/acpi/acpi.h" >> +#include "hw/acpi/cpu.h" >> #include "hw/acpi/generic_event_device.h" >> #include "hw/irq.h" >> #include "hw/mem/pc-dimm.h" >> @@ -25,6 +26,7 @@ static const uint32_t ged_supported_events[] = { >> ACPI_GED_MEM_HOTPLUG_EVT, >> ACPI_GED_PWR_DOWN_EVT, >> ACPI_GED_NVDIMM_HOTPLUG_EVT, >> + ACPI_GED_CPU_HOTPLUG_EVT, >> }; >> >> /* >> @@ -117,6 +119,10 @@ void build_ged_aml(Aml *table, const char *name, HotplugHandler *hotplug_dev, >> aml_notify(aml_name("\\_SB.NVDR"), >> aml_int(0x80))); >> break; >> + case ACPI_GED_CPU_HOTPLUG_EVT: >> + aml_append(if_ctx, aml_call0(ACPI_CPU_CONTAINER "." >> + ACPI_CPU_SCAN_METHOD)); >> + break; >> default: >> /* >> * Please make sure all the events in ged_supported_events[] >> @@ -234,6 +240,8 @@ static void acpi_ged_device_plug_cb(HotplugHandler *hotplug_dev, >> } else { >> acpi_memory_plug_cb(hotplug_dev, &s->memhp_state, dev, errp); >> } >> + } else if (object_dynamic_cast(OBJECT(dev), TYPE_CPU)) { >> + acpi_cpu_plug_cb(hotplug_dev, &s->cpuhp_state, dev, errp); >> } else { >> error_setg(errp, "virt: device plug request for unsupported device" >> " type: %s", object_get_typename(OBJECT(dev))); >> @@ -248,6 +256,8 @@ static void acpi_ged_unplug_request_cb(HotplugHandler *hotplug_dev, >> if ((object_dynamic_cast(OBJECT(dev), TYPE_PC_DIMM) && >> !(object_dynamic_cast(OBJECT(dev), TYPE_NVDIMM)))) { >> acpi_memory_unplug_request_cb(hotplug_dev, &s->memhp_state, dev, errp); >> + } else if (object_dynamic_cast(OBJECT(dev), TYPE_CPU)) { >> + acpi_cpu_unplug_request_cb(hotplug_dev, &s->cpuhp_state, dev, errp); >> } else { >> error_setg(errp, "acpi: device unplug request for unsupported device" >> " type: %s", object_get_typename(OBJECT(dev))); >> @@ -261,6 +271,8 @@ static void acpi_ged_unplug_cb(HotplugHandler *hotplug_dev, >> >> if (object_dynamic_cast(OBJECT(dev), TYPE_PC_DIMM)) { >> acpi_memory_unplug_cb(&s->memhp_state, dev, errp); >> + } else if (object_dynamic_cast(OBJECT(dev), TYPE_CPU)) { >> + acpi_cpu_unplug_cb(&s->cpuhp_state, dev, errp); >> } else { >> error_setg(errp, "acpi: device unplug for unsupported device" >> " type: %s", object_get_typename(OBJECT(dev))); >> @@ -272,6 +284,7 @@ static void acpi_ged_ospm_status(AcpiDeviceIf *adev, ACPIOSTInfoList ***list) >> AcpiGedState *s = ACPI_GED(adev); >> >> acpi_memory_ospm_status(&s->memhp_state, list); >> + acpi_cpu_ospm_status(&s->cpuhp_state, list); >> } >> >> static void acpi_ged_send_event(AcpiDeviceIf *adev, AcpiEventStatusBits ev) >> @@ -286,6 +299,8 @@ static void acpi_ged_send_event(AcpiDeviceIf *adev, AcpiEventStatusBits ev) >> sel = ACPI_GED_PWR_DOWN_EVT; >> } else if (ev & ACPI_NVDIMM_HOTPLUG_STATUS) { >> sel = ACPI_GED_NVDIMM_HOTPLUG_EVT; >> + } else if (ev & ACPI_CPU_HOTPLUG_STATUS) { >> + sel = ACPI_GED_CPU_HOTPLUG_EVT; >> } else { >> /* Unknown event. Return without generating interrupt. */ >> warn_report("GED: Unsupported event %d. No irq injected", ev); >> @@ -318,6 +333,16 @@ static const VMStateDescription vmstate_memhp_state = { >> } >> }; >> >> +static const VMStateDescription vmstate_cpuhp_state = { >> + .name = "acpi-ged/cpuhp", >> + .version_id = 1, >> + .minimum_version_id = 1, >> + .fields = (VMStateField[]) { >> + VMSTATE_CPU_HOTPLUG(cpuhp_state, AcpiGedState), >> + VMSTATE_END_OF_LIST() >> + } >> +}; >> + >> static const VMStateDescription vmstate_ged_state = { >> .name = "acpi-ged-state", >> .version_id = 1, >> @@ -366,6 +391,7 @@ static const VMStateDescription vmstate_acpi_ged = { >> }, >> .subsections = (const VMStateDescription * []) { >> &vmstate_memhp_state, >> + &vmstate_cpuhp_state, >> &vmstate_ghes_state, >> NULL >> } >> @@ -400,6 +426,13 @@ static void acpi_ged_initfn(Object *obj) >> memory_region_init_io(&ged_st->regs, obj, &ged_regs_ops, ged_st, >> TYPE_ACPI_GED "-regs", ACPI_GED_REG_COUNT); >> sysbus_init_mmio(sbd, &ged_st->regs); >> + >> + s->cpuhp.device = OBJECT(s); >> + memory_region_init(&s->container_cpuhp, OBJECT(dev), "cpuhp container", >> + ACPI_CPU_HOTPLUG_REG_LEN); >> + sysbus_init_mmio(SYS_BUS_DEVICE(dev), &s->container_cpuhp); >> + cpu_hotplug_hw_init(&s->container_cpuhp, OBJECT(dev), >> + &s->cpuhp_state, 0); >> } >> >> static void acpi_ged_class_init(ObjectClass *class, void *data) >> diff --git a/include/hw/acpi/cpu_hotplug.h b/include/hw/acpi/cpu_hotplug.h >> index 3b932abbbb..afee1ab996 100644 >> --- a/include/hw/acpi/cpu_hotplug.h >> +++ b/include/hw/acpi/cpu_hotplug.h >> @@ -19,6 +19,16 @@ >> #include "hw/hotplug.h" >> #include "hw/acpi/cpu.h" >> >> +#define ACPI_CPU_HOTPLUG_REG_LEN 12 >> +#define ACPI_CPU_SELECTOR_OFFSET_WR 0 >> +#define ACPI_CPU_FLAGS_OFFSET_RW 4 >> +#define ACPI_CPU_CMD_OFFSET_WR 5 >> +#define ACPI_CPU_CMD_DATA_OFFSET_RW 8 >> +#define ACPI_CPU_CMD_DATA2_OFFSET_R 0 >> + >> +#define ACPI_CPU_SCAN_METHOD "CSCN" >> +#define ACPI_CPU_CONTAINER "\\_SB.CPUS" >> + >> typedef struct AcpiCpuHotplug { >> Object *device; >> MemoryRegion io; >> diff --git a/include/hw/acpi/generic_event_device.h b/include/hw/acpi/generic_event_device.h >> index ba84ce0214..a803ea818e 100644 >> --- a/include/hw/acpi/generic_event_device.h >> +++ b/include/hw/acpi/generic_event_device.h >> @@ -60,6 +60,7 @@ >> #define HW_ACPI_GENERIC_EVENT_DEVICE_H >> >> #include "hw/sysbus.h" >> +#include "hw/acpi/cpu_hotplug.h" >> #include "hw/acpi/memory_hotplug.h" >> #include "hw/acpi/ghes.h" >> #include "qom/object.h" >> @@ -95,6 +96,7 @@ OBJECT_DECLARE_SIMPLE_TYPE(AcpiGedState, ACPI_GED) >> #define ACPI_GED_MEM_HOTPLUG_EVT 0x1 >> #define ACPI_GED_PWR_DOWN_EVT 0x2 >> #define ACPI_GED_NVDIMM_HOTPLUG_EVT 0x4 >> +#define ACPI_GED_CPU_HOTPLUG_EVT 0x8 >> >> typedef struct GEDState { >> MemoryRegion evt; >> @@ -106,6 +108,9 @@ struct AcpiGedState { >> SysBusDevice parent_obj; >> MemHotplugState memhp_state; >> MemoryRegion container_memhp; >> + CPUHotplugState cpuhp_state; >> + MemoryRegion container_cpuhp; >> + AcpiCpuHotplug cpuhp; >> GEDState ged_state; >> uint32_t ged_event_bitmap; >> qemu_irq irq; >> -- >> 2.39.1
On Tue, Sep 26, 2023 at 05:54:26PM +0800, xianglai li wrote: > ACPI GED shall be used to convey to the guest kernel about any cpu hot-(un)plug > events. Therefore, existing ACPI GED framework inside QEMU needs to be enhanced > to support CPU hot-(un)plug state and events. > > Co-authored-by: "Salil Mehta" <salil.mehta@opnsrc.net> > Co-authored-by: "Salil Mehta" <salil.mehta@huawei.com> > Cc: "Bernhard Beschow" <shentey@gmail.com> > Cc: "Salil Mehta" <salil.mehta@huawei.com> > Cc: "Salil Mehta" <salil.mehta@opnsrc.net> > Cc: Xiaojuan Yang <yangxiaojuan@loongson.cn> > Cc: Song Gao <gaosong@loongson.cn> > Cc: "Michael S. Tsirkin" <mst@redhat.com> > Cc: Igor Mammedov <imammedo@redhat.com> > Cc: Ani Sinha <anisinha@redhat.com> > Cc: Paolo Bonzini <pbonzini@redhat.com> > Cc: Richard Henderson <richard.henderson@linaro.org> > Cc: Eduardo Habkost <eduardo@habkost.net> > Cc: Marcel Apfelbaum <marcel.apfelbaum@gmail.com> > Cc: "Philippe Mathieu-Daudé" <philmd@linaro.org> > Cc: Yanan Wang <wangyanan55@huawei.com> > Cc: "Daniel P. Berrangé" <berrange@redhat.com> > Cc: Peter Xu <peterx@redhat.com> > Cc: David Hildenbrand <david@redhat.com> > Cc: Bibo Mao <maobibo@loongson.cn> > Signed-off-by: xianglai li <lixianglai@loongson.cn> Same question as I sent on Salil Mehta's patchset. Is this based on this patchset: https://lore.kernel.org/qemu-devel/20200613213629.21984-11-salil.mehta@huawei.com/ ? If yes then it looks like you dropped Keqian Zhu. And the rules for Co-developed-by are: Co-developed-by: states that the patch was co-created by multiple developers; it is used to give attribution to co-authors (in addition to the author attributed by the From: tag) when several people work on a single patch. Since Co-developed-by: denotes authorship, every Co-developed-by: must be immediately followed by a Signed-off-by: of the associated co-author. Standard sign-off procedure applies, i.e. the ordering of Signed-off-by: tags should reflect the chronological history of the patch insofar as possible, regardless of whether the author is attributed via From: or Co-developed-by:. Notably, the last Signed-off-by: must always be that of the developer submitting the patch. but it looks like Keqian Zhu did not sign off on his original patch so you need to go and get his sign off. > --- > hw/acpi/acpi-cpu-hotplug-stub.c | 6 +++++ > hw/acpi/cpu.c | 7 ------ > hw/acpi/generic_event_device.c | 33 ++++++++++++++++++++++++++ > include/hw/acpi/cpu_hotplug.h | 10 ++++++++ > include/hw/acpi/generic_event_device.h | 5 ++++ > 5 files changed, 54 insertions(+), 7 deletions(-) > > diff --git a/hw/acpi/acpi-cpu-hotplug-stub.c b/hw/acpi/acpi-cpu-hotplug-stub.c > index 3fc4b14c26..2aec90d968 100644 > --- a/hw/acpi/acpi-cpu-hotplug-stub.c > +++ b/hw/acpi/acpi-cpu-hotplug-stub.c > @@ -24,6 +24,12 @@ void acpi_cpu_ospm_status(CPUHotplugState *cpu_st, ACPIOSTInfoList ***list) > return; > } > > +void cpu_hotplug_hw_init(MemoryRegion *as, Object *owner, > + CPUHotplugState *state, hwaddr base_addr) > +{ > + return; > +} > + > void acpi_cpu_plug_cb(HotplugHandler *hotplug_dev, > CPUHotplugState *cpu_st, DeviceState *dev, Error **errp) > { > diff --git a/hw/acpi/cpu.c b/hw/acpi/cpu.c > index 011d2c6c2d..5bad983928 100644 > --- a/hw/acpi/cpu.c > +++ b/hw/acpi/cpu.c > @@ -7,13 +7,6 @@ > #include "trace.h" > #include "sysemu/numa.h" > > -#define ACPI_CPU_HOTPLUG_REG_LEN 12 > -#define ACPI_CPU_SELECTOR_OFFSET_WR 0 > -#define ACPI_CPU_FLAGS_OFFSET_RW 4 > -#define ACPI_CPU_CMD_OFFSET_WR 5 > -#define ACPI_CPU_CMD_DATA_OFFSET_RW 8 > -#define ACPI_CPU_CMD_DATA2_OFFSET_R 0 > - > #define OVMF_CPUHP_SMI_CMD 4 > > enum { > diff --git a/hw/acpi/generic_event_device.c b/hw/acpi/generic_event_device.c > index a3d31631fe..c5a70957b4 100644 > --- a/hw/acpi/generic_event_device.c > +++ b/hw/acpi/generic_event_device.c > @@ -12,6 +12,7 @@ > #include "qemu/osdep.h" > #include "qapi/error.h" > #include "hw/acpi/acpi.h" > +#include "hw/acpi/cpu.h" > #include "hw/acpi/generic_event_device.h" > #include "hw/irq.h" > #include "hw/mem/pc-dimm.h" > @@ -25,6 +26,7 @@ static const uint32_t ged_supported_events[] = { > ACPI_GED_MEM_HOTPLUG_EVT, > ACPI_GED_PWR_DOWN_EVT, > ACPI_GED_NVDIMM_HOTPLUG_EVT, > + ACPI_GED_CPU_HOTPLUG_EVT, > }; > > /* > @@ -117,6 +119,10 @@ void build_ged_aml(Aml *table, const char *name, HotplugHandler *hotplug_dev, > aml_notify(aml_name("\\_SB.NVDR"), > aml_int(0x80))); > break; > + case ACPI_GED_CPU_HOTPLUG_EVT: > + aml_append(if_ctx, aml_call0(ACPI_CPU_CONTAINER "." > + ACPI_CPU_SCAN_METHOD)); > + break; > default: > /* > * Please make sure all the events in ged_supported_events[] > @@ -234,6 +240,8 @@ static void acpi_ged_device_plug_cb(HotplugHandler *hotplug_dev, > } else { > acpi_memory_plug_cb(hotplug_dev, &s->memhp_state, dev, errp); > } > + } else if (object_dynamic_cast(OBJECT(dev), TYPE_CPU)) { > + acpi_cpu_plug_cb(hotplug_dev, &s->cpuhp_state, dev, errp); > } else { > error_setg(errp, "virt: device plug request for unsupported device" > " type: %s", object_get_typename(OBJECT(dev))); > @@ -248,6 +256,8 @@ static void acpi_ged_unplug_request_cb(HotplugHandler *hotplug_dev, > if ((object_dynamic_cast(OBJECT(dev), TYPE_PC_DIMM) && > !(object_dynamic_cast(OBJECT(dev), TYPE_NVDIMM)))) { > acpi_memory_unplug_request_cb(hotplug_dev, &s->memhp_state, dev, errp); > + } else if (object_dynamic_cast(OBJECT(dev), TYPE_CPU)) { > + acpi_cpu_unplug_request_cb(hotplug_dev, &s->cpuhp_state, dev, errp); > } else { > error_setg(errp, "acpi: device unplug request for unsupported device" > " type: %s", object_get_typename(OBJECT(dev))); > @@ -261,6 +271,8 @@ static void acpi_ged_unplug_cb(HotplugHandler *hotplug_dev, > > if (object_dynamic_cast(OBJECT(dev), TYPE_PC_DIMM)) { > acpi_memory_unplug_cb(&s->memhp_state, dev, errp); > + } else if (object_dynamic_cast(OBJECT(dev), TYPE_CPU)) { > + acpi_cpu_unplug_cb(&s->cpuhp_state, dev, errp); > } else { > error_setg(errp, "acpi: device unplug for unsupported device" > " type: %s", object_get_typename(OBJECT(dev))); > @@ -272,6 +284,7 @@ static void acpi_ged_ospm_status(AcpiDeviceIf *adev, ACPIOSTInfoList ***list) > AcpiGedState *s = ACPI_GED(adev); > > acpi_memory_ospm_status(&s->memhp_state, list); > + acpi_cpu_ospm_status(&s->cpuhp_state, list); > } > > static void acpi_ged_send_event(AcpiDeviceIf *adev, AcpiEventStatusBits ev) > @@ -286,6 +299,8 @@ static void acpi_ged_send_event(AcpiDeviceIf *adev, AcpiEventStatusBits ev) > sel = ACPI_GED_PWR_DOWN_EVT; > } else if (ev & ACPI_NVDIMM_HOTPLUG_STATUS) { > sel = ACPI_GED_NVDIMM_HOTPLUG_EVT; > + } else if (ev & ACPI_CPU_HOTPLUG_STATUS) { > + sel = ACPI_GED_CPU_HOTPLUG_EVT; > } else { > /* Unknown event. Return without generating interrupt. */ > warn_report("GED: Unsupported event %d. No irq injected", ev); > @@ -318,6 +333,16 @@ static const VMStateDescription vmstate_memhp_state = { > } > }; > > +static const VMStateDescription vmstate_cpuhp_state = { > + .name = "acpi-ged/cpuhp", > + .version_id = 1, > + .minimum_version_id = 1, > + .fields = (VMStateField[]) { > + VMSTATE_CPU_HOTPLUG(cpuhp_state, AcpiGedState), > + VMSTATE_END_OF_LIST() > + } > +}; > + > static const VMStateDescription vmstate_ged_state = { > .name = "acpi-ged-state", > .version_id = 1, > @@ -366,6 +391,7 @@ static const VMStateDescription vmstate_acpi_ged = { > }, > .subsections = (const VMStateDescription * []) { > &vmstate_memhp_state, > + &vmstate_cpuhp_state, > &vmstate_ghes_state, > NULL > } > @@ -400,6 +426,13 @@ static void acpi_ged_initfn(Object *obj) > memory_region_init_io(&ged_st->regs, obj, &ged_regs_ops, ged_st, > TYPE_ACPI_GED "-regs", ACPI_GED_REG_COUNT); > sysbus_init_mmio(sbd, &ged_st->regs); > + > + s->cpuhp.device = OBJECT(s); > + memory_region_init(&s->container_cpuhp, OBJECT(dev), "cpuhp container", > + ACPI_CPU_HOTPLUG_REG_LEN); > + sysbus_init_mmio(SYS_BUS_DEVICE(dev), &s->container_cpuhp); > + cpu_hotplug_hw_init(&s->container_cpuhp, OBJECT(dev), > + &s->cpuhp_state, 0); > } > > static void acpi_ged_class_init(ObjectClass *class, void *data) > diff --git a/include/hw/acpi/cpu_hotplug.h b/include/hw/acpi/cpu_hotplug.h > index 3b932abbbb..afee1ab996 100644 > --- a/include/hw/acpi/cpu_hotplug.h > +++ b/include/hw/acpi/cpu_hotplug.h > @@ -19,6 +19,16 @@ > #include "hw/hotplug.h" > #include "hw/acpi/cpu.h" > > +#define ACPI_CPU_HOTPLUG_REG_LEN 12 > +#define ACPI_CPU_SELECTOR_OFFSET_WR 0 > +#define ACPI_CPU_FLAGS_OFFSET_RW 4 > +#define ACPI_CPU_CMD_OFFSET_WR 5 > +#define ACPI_CPU_CMD_DATA_OFFSET_RW 8 > +#define ACPI_CPU_CMD_DATA2_OFFSET_R 0 > + > +#define ACPI_CPU_SCAN_METHOD "CSCN" > +#define ACPI_CPU_CONTAINER "\\_SB.CPUS" > + > typedef struct AcpiCpuHotplug { > Object *device; > MemoryRegion io; > diff --git a/include/hw/acpi/generic_event_device.h b/include/hw/acpi/generic_event_device.h > index ba84ce0214..a803ea818e 100644 > --- a/include/hw/acpi/generic_event_device.h > +++ b/include/hw/acpi/generic_event_device.h > @@ -60,6 +60,7 @@ > #define HW_ACPI_GENERIC_EVENT_DEVICE_H > > #include "hw/sysbus.h" > +#include "hw/acpi/cpu_hotplug.h" > #include "hw/acpi/memory_hotplug.h" > #include "hw/acpi/ghes.h" > #include "qom/object.h" > @@ -95,6 +96,7 @@ OBJECT_DECLARE_SIMPLE_TYPE(AcpiGedState, ACPI_GED) > #define ACPI_GED_MEM_HOTPLUG_EVT 0x1 > #define ACPI_GED_PWR_DOWN_EVT 0x2 > #define ACPI_GED_NVDIMM_HOTPLUG_EVT 0x4 > +#define ACPI_GED_CPU_HOTPLUG_EVT 0x8 > > typedef struct GEDState { > MemoryRegion evt; > @@ -106,6 +108,9 @@ struct AcpiGedState { > SysBusDevice parent_obj; > MemHotplugState memhp_state; > MemoryRegion container_memhp; > + CPUHotplugState cpuhp_state; > + MemoryRegion container_cpuhp; > + AcpiCpuHotplug cpuhp; > GEDState ged_state; > uint32_t ged_event_bitmap; > qemu_irq irq; > -- > 2.39.1
On Tue, Sep 26, 2023 at 07:26:40PM +0800, lixianglai wrote: > > Hi, Michael S. Tsirkin : > > On Tue, Sep 26, 2023 at 05:54:26PM +0800, xianglai li wrote: > > > ACPI GED shall be used to convey to the guest kernel about any cpu hot-(un)plug > > > events. Therefore, existing ACPI GED framework inside QEMU needs to be enhanced > > > to support CPU hot-(un)plug state and events. > > > > > > Co-authored-by: "Salil Mehta" <salil.mehta@opnsrc.net> > > > Co-authored-by: "Salil Mehta" <salil.mehta@huawei.com> > > This is not the way to handle multiple emails. > > Oh, sorry, I'll delete the first one. > > Thanks, > > Xianglai. Can you guys figure out together with Salil Mehta what's the correct order to merge this? I can't figure out with dueling patches.
Hi Salil Mehta via: > Same with this patch. It already exists in the architecture agnostic > patches part of below: > > https://lore.kernel.org/qemu-devel/20230926100436.28284-1-salil.mehta@huawei.com/T/#t OK, I will remove the first two patches in the next version. Thanks, Xianglai. > > Thanks > Salil. > >> From: xianglai li <lixianglai@loongson.cn> >> Sent: Tuesday, September 26, 2023 10:54 AM >> To: qemu-devel@nongnu.org >> Cc: Salil Mehta <salil.mehta@opnsrc.net>; Salil Mehta >> <salil.mehta@huawei.com>; Bernhard Beschow <shentey@gmail.com>; Xiaojuan >> Yang <yangxiaojuan@loongson.cn>; Song Gao <gaosong@loongson.cn>; Michael S. >> Tsirkin <mst@redhat.com>; Igor Mammedov <imammedo@redhat.com>; Ani Sinha >> <anisinha@redhat.com>; Paolo Bonzini <pbonzini@redhat.com>; Richard >> Henderson <richard.henderson@linaro.org>; Eduardo Habkost >> <eduardo@habkost.net>; Marcel Apfelbaum <marcel.apfelbaum@gmail.com>; >> Philippe Mathieu-Daudé <philmd@linaro.org>; wangyanan (Y) >> <wangyanan55@huawei.com>; Daniel P. Berrangé <berrange@redhat.com>; Peter >> Xu <peterx@redhat.com>; David Hildenbrand <david@redhat.com>; Bibo Mao >> <maobibo@loongson.cn> >> Subject: [PATCH v3 1/7] Update ACPI GED framework to support vcpu hot- >> (un)plug >> >> ACPI GED shall be used to convey to the guest kernel about any cpu hot- >> (un)plug >> events. Therefore, existing ACPI GED framework inside QEMU needs to be >> enhanced >> to support CPU hot-(un)plug state and events. >> >> Co-authored-by: "Salil Mehta" <salil.mehta@opnsrc.net> >> Co-authored-by: "Salil Mehta" <salil.mehta@huawei.com> >> Cc: "Bernhard Beschow" <shentey@gmail.com> >> Cc: "Salil Mehta" <salil.mehta@huawei.com> >> Cc: "Salil Mehta" <salil.mehta@opnsrc.net> >> Cc: Xiaojuan Yang <yangxiaojuan@loongson.cn> >> Cc: Song Gao <gaosong@loongson.cn> >> Cc: "Michael S. Tsirkin" <mst@redhat.com> >> Cc: Igor Mammedov <imammedo@redhat.com> >> Cc: Ani Sinha <anisinha@redhat.com> >> Cc: Paolo Bonzini <pbonzini@redhat.com> >> Cc: Richard Henderson <richard.henderson@linaro.org> >> Cc: Eduardo Habkost <eduardo@habkost.net> >> Cc: Marcel Apfelbaum <marcel.apfelbaum@gmail.com> >> Cc: "Philippe Mathieu-Daudé" <philmd@linaro.org> >> Cc: Yanan Wang <wangyanan55@huawei.com> >> Cc: "Daniel P. Berrangé" <berrange@redhat.com> >> Cc: Peter Xu <peterx@redhat.com> >> Cc: David Hildenbrand <david@redhat.com> >> Cc: Bibo Mao <maobibo@loongson.cn> >> Signed-off-by: xianglai li <lixianglai@loongson.cn> >> --- >> hw/acpi/acpi-cpu-hotplug-stub.c | 6 +++++ >> hw/acpi/cpu.c | 7 ------ >> hw/acpi/generic_event_device.c | 33 ++++++++++++++++++++++++++ >> include/hw/acpi/cpu_hotplug.h | 10 ++++++++ >> include/hw/acpi/generic_event_device.h | 5 ++++ >> 5 files changed, 54 insertions(+), 7 deletions(-) >> >> diff --git a/hw/acpi/acpi-cpu-hotplug-stub.c b/hw/acpi/acpi-cpu-hotplug- >> stub.c >> index 3fc4b14c26..2aec90d968 100644 >> --- a/hw/acpi/acpi-cpu-hotplug-stub.c >> +++ b/hw/acpi/acpi-cpu-hotplug-stub.c >> @@ -24,6 +24,12 @@ void acpi_cpu_ospm_status(CPUHotplugState *cpu_st, >> ACPIOSTInfoList ***list) >> return; >> } >> >> +void cpu_hotplug_hw_init(MemoryRegion *as, Object *owner, >> + CPUHotplugState *state, hwaddr base_addr) >> +{ >> + return; >> +} >> + >> void acpi_cpu_plug_cb(HotplugHandler *hotplug_dev, >> CPUHotplugState *cpu_st, DeviceState *dev, Error >> **errp) >> { >> diff --git a/hw/acpi/cpu.c b/hw/acpi/cpu.c >> index 011d2c6c2d..5bad983928 100644 >> --- a/hw/acpi/cpu.c >> +++ b/hw/acpi/cpu.c >> @@ -7,13 +7,6 @@ >> #include "trace.h" >> #include "sysemu/numa.h" >> >> -#define ACPI_CPU_HOTPLUG_REG_LEN 12 >> -#define ACPI_CPU_SELECTOR_OFFSET_WR 0 >> -#define ACPI_CPU_FLAGS_OFFSET_RW 4 >> -#define ACPI_CPU_CMD_OFFSET_WR 5 >> -#define ACPI_CPU_CMD_DATA_OFFSET_RW 8 >> -#define ACPI_CPU_CMD_DATA2_OFFSET_R 0 >> - >> #define OVMF_CPUHP_SMI_CMD 4 >> >> enum { >> diff --git a/hw/acpi/generic_event_device.c >> b/hw/acpi/generic_event_device.c >> index a3d31631fe..c5a70957b4 100644 >> --- a/hw/acpi/generic_event_device.c >> +++ b/hw/acpi/generic_event_device.c >> @@ -12,6 +12,7 @@ >> #include "qemu/osdep.h" >> #include "qapi/error.h" >> #include "hw/acpi/acpi.h" >> +#include "hw/acpi/cpu.h" >> #include "hw/acpi/generic_event_device.h" >> #include "hw/irq.h" >> #include "hw/mem/pc-dimm.h" >> @@ -25,6 +26,7 @@ static const uint32_t ged_supported_events[] = { >> ACPI_GED_MEM_HOTPLUG_EVT, >> ACPI_GED_PWR_DOWN_EVT, >> ACPI_GED_NVDIMM_HOTPLUG_EVT, >> + ACPI_GED_CPU_HOTPLUG_EVT, >> }; >> >> /* >> @@ -117,6 +119,10 @@ void build_ged_aml(Aml *table, const char *name, >> HotplugHandler *hotplug_dev, >> aml_notify(aml_name("\\_SB.NVDR"), >> aml_int(0x80))); >> break; >> + case ACPI_GED_CPU_HOTPLUG_EVT: >> + aml_append(if_ctx, aml_call0(ACPI_CPU_CONTAINER "." >> + ACPI_CPU_SCAN_METHOD)); >> + break; >> default: >> /* >> * Please make sure all the events in >> ged_supported_events[] >> @@ -234,6 +240,8 @@ static void acpi_ged_device_plug_cb(HotplugHandler >> *hotplug_dev, >> } else { >> acpi_memory_plug_cb(hotplug_dev, &s->memhp_state, dev, errp); >> } >> + } else if (object_dynamic_cast(OBJECT(dev), TYPE_CPU)) { >> + acpi_cpu_plug_cb(hotplug_dev, &s->cpuhp_state, dev, errp); >> } else { >> error_setg(errp, "virt: device plug request for unsupported >> device" >> " type: %s", object_get_typename(OBJECT(dev))); >> @@ -248,6 +256,8 @@ static void acpi_ged_unplug_request_cb(HotplugHandler >> *hotplug_dev, >> if ((object_dynamic_cast(OBJECT(dev), TYPE_PC_DIMM) && >> !(object_dynamic_cast(OBJECT(dev), TYPE_NVDIMM)))) >> { >> acpi_memory_unplug_request_cb(hotplug_dev, &s->memhp_state, dev, >> errp); >> + } else if (object_dynamic_cast(OBJECT(dev), TYPE_CPU)) { >> + acpi_cpu_unplug_request_cb(hotplug_dev, &s->cpuhp_state, dev, >> errp); >> } else { >> error_setg(errp, "acpi: device unplug request for unsupported >> device" >> " type: %s", object_get_typename(OBJECT(dev))); >> @@ -261,6 +271,8 @@ static void acpi_ged_unplug_cb(HotplugHandler >> *hotplug_dev, >> >> if (object_dynamic_cast(OBJECT(dev), TYPE_PC_DIMM)) { >> acpi_memory_unplug_cb(&s->memhp_state, dev, errp); >> + } else if (object_dynamic_cast(OBJECT(dev), TYPE_CPU)) { >> + acpi_cpu_unplug_cb(&s->cpuhp_state, dev, errp); >> } else { >> error_setg(errp, "acpi: device unplug for unsupported device" >> " type: %s", object_get_typename(OBJECT(dev))); >> @@ -272,6 +284,7 @@ static void acpi_ged_ospm_status(AcpiDeviceIf *adev, >> ACPIOSTInfoList ***list) >> AcpiGedState *s = ACPI_GED(adev); >> >> acpi_memory_ospm_status(&s->memhp_state, list); >> + acpi_cpu_ospm_status(&s->cpuhp_state, list); >> } >> >> static void acpi_ged_send_event(AcpiDeviceIf *adev, AcpiEventStatusBits >> ev) >> @@ -286,6 +299,8 @@ static void acpi_ged_send_event(AcpiDeviceIf *adev, >> AcpiEventStatusBits ev) >> sel = ACPI_GED_PWR_DOWN_EVT; >> } else if (ev & ACPI_NVDIMM_HOTPLUG_STATUS) { >> sel = ACPI_GED_NVDIMM_HOTPLUG_EVT; >> + } else if (ev & ACPI_CPU_HOTPLUG_STATUS) { >> + sel = ACPI_GED_CPU_HOTPLUG_EVT; >> } else { >> /* Unknown event. Return without generating interrupt. */ >> warn_report("GED: Unsupported event %d. No irq injected", ev); >> @@ -318,6 +333,16 @@ static const VMStateDescription vmstate_memhp_state = >> { >> } >> }; >> >> +static const VMStateDescription vmstate_cpuhp_state = { >> + .name = "acpi-ged/cpuhp", >> + .version_id = 1, >> + .minimum_version_id = 1, >> + .fields = (VMStateField[]) { >> + VMSTATE_CPU_HOTPLUG(cpuhp_state, AcpiGedState), >> + VMSTATE_END_OF_LIST() >> + } >> +}; >> + >> static const VMStateDescription vmstate_ged_state = { >> .name = "acpi-ged-state", >> .version_id = 1, >> @@ -366,6 +391,7 @@ static const VMStateDescription vmstate_acpi_ged = { >> }, >> .subsections = (const VMStateDescription * []) { >> &vmstate_memhp_state, >> + &vmstate_cpuhp_state, >> &vmstate_ghes_state, >> NULL >> } >> @@ -400,6 +426,13 @@ static void acpi_ged_initfn(Object *obj) >> memory_region_init_io(&ged_st->regs, obj, &ged_regs_ops, ged_st, >> TYPE_ACPI_GED "-regs", ACPI_GED_REG_COUNT); >> sysbus_init_mmio(sbd, &ged_st->regs); >> + >> + s->cpuhp.device = OBJECT(s); >> + memory_region_init(&s->container_cpuhp, OBJECT(dev), "cpuhp >> container", >> + ACPI_CPU_HOTPLUG_REG_LEN); >> + sysbus_init_mmio(SYS_BUS_DEVICE(dev), &s->container_cpuhp); >> + cpu_hotplug_hw_init(&s->container_cpuhp, OBJECT(dev), >> + &s->cpuhp_state, 0); >> } >> >> static void acpi_ged_class_init(ObjectClass *class, void *data) >> diff --git a/include/hw/acpi/cpu_hotplug.h b/include/hw/acpi/cpu_hotplug.h >> index 3b932abbbb..afee1ab996 100644 >> --- a/include/hw/acpi/cpu_hotplug.h >> +++ b/include/hw/acpi/cpu_hotplug.h >> @@ -19,6 +19,16 @@ >> #include "hw/hotplug.h" >> #include "hw/acpi/cpu.h" >> >> +#define ACPI_CPU_HOTPLUG_REG_LEN 12 >> +#define ACPI_CPU_SELECTOR_OFFSET_WR 0 >> +#define ACPI_CPU_FLAGS_OFFSET_RW 4 >> +#define ACPI_CPU_CMD_OFFSET_WR 5 >> +#define ACPI_CPU_CMD_DATA_OFFSET_RW 8 >> +#define ACPI_CPU_CMD_DATA2_OFFSET_R 0 >> + >> +#define ACPI_CPU_SCAN_METHOD "CSCN" >> +#define ACPI_CPU_CONTAINER "\\_SB.CPUS" >> + >> typedef struct AcpiCpuHotplug { >> Object *device; >> MemoryRegion io; >> diff --git a/include/hw/acpi/generic_event_device.h >> b/include/hw/acpi/generic_event_device.h >> index ba84ce0214..a803ea818e 100644 >> --- a/include/hw/acpi/generic_event_device.h >> +++ b/include/hw/acpi/generic_event_device.h >> @@ -60,6 +60,7 @@ >> #define HW_ACPI_GENERIC_EVENT_DEVICE_H >> >> #include "hw/sysbus.h" >> +#include "hw/acpi/cpu_hotplug.h" >> #include "hw/acpi/memory_hotplug.h" >> #include "hw/acpi/ghes.h" >> #include "qom/object.h" >> @@ -95,6 +96,7 @@ OBJECT_DECLARE_SIMPLE_TYPE(AcpiGedState, ACPI_GED) >> #define ACPI_GED_MEM_HOTPLUG_EVT 0x1 >> #define ACPI_GED_PWR_DOWN_EVT 0x2 >> #define ACPI_GED_NVDIMM_HOTPLUG_EVT 0x4 >> +#define ACPI_GED_CPU_HOTPLUG_EVT 0x8 >> >> typedef struct GEDState { >> MemoryRegion evt; >> @@ -106,6 +108,9 @@ struct AcpiGedState { >> SysBusDevice parent_obj; >> MemHotplugState memhp_state; >> MemoryRegion container_memhp; >> + CPUHotplugState cpuhp_state; >> + MemoryRegion container_cpuhp; >> + AcpiCpuHotplug cpuhp; >> GEDState ged_state; >> uint32_t ged_event_bitmap; >> qemu_irq irq; >> -- >> 2.39.1 >>
Hi Michael, > From: Michael S. Tsirkin <mst@redhat.com> > Sent: Tuesday, September 26, 2023 1:08 PM > > On Tue, Sep 26, 2023 at 07:26:40PM +0800, lixianglai wrote: > > > > Hi, Michael S. Tsirkin : > > > On Tue, Sep 26, 2023 at 05:54:26PM +0800, xianglai li wrote: > > > > ACPI GED shall be used to convey to the guest kernel about any cpu > hot-(un)plug > > > > events. Therefore, existing ACPI GED framework inside QEMU needs to > be enhanced > > > > to support CPU hot-(un)plug state and events. > > > > > > > > Co-authored-by: "Salil Mehta" <salil.mehta@opnsrc.net> > > > > Co-authored-by: "Salil Mehta" <salil.mehta@huawei.com> > > > This is not the way to handle multiple emails. > > > > Oh, sorry, I'll delete the first one. > > > > Thanks, > > > > Xianglai. > > Can you guys figure out together with Salil Mehta what's the > correct order to merge this? I can't figure out with dueling patches. We already have an agreed approach and Loongson folks will rebase from the common patch-set. There is no contention. Thanks Salil.
On Tue, Sep 26, 2023 at 12:38:44PM +0000, Salil Mehta wrote: > Hi Michael, > > > From: Michael S. Tsirkin <mst@redhat.com> > > Sent: Tuesday, September 26, 2023 1:08 PM > > > > On Tue, Sep 26, 2023 at 07:26:40PM +0800, lixianglai wrote: > > > > > > Hi, Michael S. Tsirkin : > > > > On Tue, Sep 26, 2023 at 05:54:26PM +0800, xianglai li wrote: > > > > > ACPI GED shall be used to convey to the guest kernel about any cpu > > hot-(un)plug > > > > > events. Therefore, existing ACPI GED framework inside QEMU needs to > > be enhanced > > > > > to support CPU hot-(un)plug state and events. > > > > > > > > > > Co-authored-by: "Salil Mehta" <salil.mehta@opnsrc.net> > > > > > Co-authored-by: "Salil Mehta" <salil.mehta@huawei.com> > > > > This is not the way to handle multiple emails. > > > > > > Oh, sorry, I'll delete the first one. > > > > > > Thanks, > > > > > > Xianglai. > > > > Can you guys figure out together with Salil Mehta what's the > > correct order to merge this? I can't figure out with dueling patches. > > We already have an agreed approach and Loongson folks will > rebase from the common patch-set. There is no contention. > > Thanks > Salil. > > Great, thanks a lot!
diff --git a/hw/acpi/acpi-cpu-hotplug-stub.c b/hw/acpi/acpi-cpu-hotplug-stub.c index 3fc4b14c26..2aec90d968 100644 --- a/hw/acpi/acpi-cpu-hotplug-stub.c +++ b/hw/acpi/acpi-cpu-hotplug-stub.c @@ -24,6 +24,12 @@ void acpi_cpu_ospm_status(CPUHotplugState *cpu_st, ACPIOSTInfoList ***list) return; } +void cpu_hotplug_hw_init(MemoryRegion *as, Object *owner, + CPUHotplugState *state, hwaddr base_addr) +{ + return; +} + void acpi_cpu_plug_cb(HotplugHandler *hotplug_dev, CPUHotplugState *cpu_st, DeviceState *dev, Error **errp) { diff --git a/hw/acpi/cpu.c b/hw/acpi/cpu.c index 011d2c6c2d..5bad983928 100644 --- a/hw/acpi/cpu.c +++ b/hw/acpi/cpu.c @@ -7,13 +7,6 @@ #include "trace.h" #include "sysemu/numa.h" -#define ACPI_CPU_HOTPLUG_REG_LEN 12 -#define ACPI_CPU_SELECTOR_OFFSET_WR 0 -#define ACPI_CPU_FLAGS_OFFSET_RW 4 -#define ACPI_CPU_CMD_OFFSET_WR 5 -#define ACPI_CPU_CMD_DATA_OFFSET_RW 8 -#define ACPI_CPU_CMD_DATA2_OFFSET_R 0 - #define OVMF_CPUHP_SMI_CMD 4 enum { diff --git a/hw/acpi/generic_event_device.c b/hw/acpi/generic_event_device.c index a3d31631fe..c5a70957b4 100644 --- a/hw/acpi/generic_event_device.c +++ b/hw/acpi/generic_event_device.c @@ -12,6 +12,7 @@ #include "qemu/osdep.h" #include "qapi/error.h" #include "hw/acpi/acpi.h" +#include "hw/acpi/cpu.h" #include "hw/acpi/generic_event_device.h" #include "hw/irq.h" #include "hw/mem/pc-dimm.h" @@ -25,6 +26,7 @@ static const uint32_t ged_supported_events[] = { ACPI_GED_MEM_HOTPLUG_EVT, ACPI_GED_PWR_DOWN_EVT, ACPI_GED_NVDIMM_HOTPLUG_EVT, + ACPI_GED_CPU_HOTPLUG_EVT, }; /* @@ -117,6 +119,10 @@ void build_ged_aml(Aml *table, const char *name, HotplugHandler *hotplug_dev, aml_notify(aml_name("\\_SB.NVDR"), aml_int(0x80))); break; + case ACPI_GED_CPU_HOTPLUG_EVT: + aml_append(if_ctx, aml_call0(ACPI_CPU_CONTAINER "." + ACPI_CPU_SCAN_METHOD)); + break; default: /* * Please make sure all the events in ged_supported_events[] @@ -234,6 +240,8 @@ static void acpi_ged_device_plug_cb(HotplugHandler *hotplug_dev, } else { acpi_memory_plug_cb(hotplug_dev, &s->memhp_state, dev, errp); } + } else if (object_dynamic_cast(OBJECT(dev), TYPE_CPU)) { + acpi_cpu_plug_cb(hotplug_dev, &s->cpuhp_state, dev, errp); } else { error_setg(errp, "virt: device plug request for unsupported device" " type: %s", object_get_typename(OBJECT(dev))); @@ -248,6 +256,8 @@ static void acpi_ged_unplug_request_cb(HotplugHandler *hotplug_dev, if ((object_dynamic_cast(OBJECT(dev), TYPE_PC_DIMM) && !(object_dynamic_cast(OBJECT(dev), TYPE_NVDIMM)))) { acpi_memory_unplug_request_cb(hotplug_dev, &s->memhp_state, dev, errp); + } else if (object_dynamic_cast(OBJECT(dev), TYPE_CPU)) { + acpi_cpu_unplug_request_cb(hotplug_dev, &s->cpuhp_state, dev, errp); } else { error_setg(errp, "acpi: device unplug request for unsupported device" " type: %s", object_get_typename(OBJECT(dev))); @@ -261,6 +271,8 @@ static void acpi_ged_unplug_cb(HotplugHandler *hotplug_dev, if (object_dynamic_cast(OBJECT(dev), TYPE_PC_DIMM)) { acpi_memory_unplug_cb(&s->memhp_state, dev, errp); + } else if (object_dynamic_cast(OBJECT(dev), TYPE_CPU)) { + acpi_cpu_unplug_cb(&s->cpuhp_state, dev, errp); } else { error_setg(errp, "acpi: device unplug for unsupported device" " type: %s", object_get_typename(OBJECT(dev))); @@ -272,6 +284,7 @@ static void acpi_ged_ospm_status(AcpiDeviceIf *adev, ACPIOSTInfoList ***list) AcpiGedState *s = ACPI_GED(adev); acpi_memory_ospm_status(&s->memhp_state, list); + acpi_cpu_ospm_status(&s->cpuhp_state, list); } static void acpi_ged_send_event(AcpiDeviceIf *adev, AcpiEventStatusBits ev) @@ -286,6 +299,8 @@ static void acpi_ged_send_event(AcpiDeviceIf *adev, AcpiEventStatusBits ev) sel = ACPI_GED_PWR_DOWN_EVT; } else if (ev & ACPI_NVDIMM_HOTPLUG_STATUS) { sel = ACPI_GED_NVDIMM_HOTPLUG_EVT; + } else if (ev & ACPI_CPU_HOTPLUG_STATUS) { + sel = ACPI_GED_CPU_HOTPLUG_EVT; } else { /* Unknown event. Return without generating interrupt. */ warn_report("GED: Unsupported event %d. No irq injected", ev); @@ -318,6 +333,16 @@ static const VMStateDescription vmstate_memhp_state = { } }; +static const VMStateDescription vmstate_cpuhp_state = { + .name = "acpi-ged/cpuhp", + .version_id = 1, + .minimum_version_id = 1, + .fields = (VMStateField[]) { + VMSTATE_CPU_HOTPLUG(cpuhp_state, AcpiGedState), + VMSTATE_END_OF_LIST() + } +}; + static const VMStateDescription vmstate_ged_state = { .name = "acpi-ged-state", .version_id = 1, @@ -366,6 +391,7 @@ static const VMStateDescription vmstate_acpi_ged = { }, .subsections = (const VMStateDescription * []) { &vmstate_memhp_state, + &vmstate_cpuhp_state, &vmstate_ghes_state, NULL } @@ -400,6 +426,13 @@ static void acpi_ged_initfn(Object *obj) memory_region_init_io(&ged_st->regs, obj, &ged_regs_ops, ged_st, TYPE_ACPI_GED "-regs", ACPI_GED_REG_COUNT); sysbus_init_mmio(sbd, &ged_st->regs); + + s->cpuhp.device = OBJECT(s); + memory_region_init(&s->container_cpuhp, OBJECT(dev), "cpuhp container", + ACPI_CPU_HOTPLUG_REG_LEN); + sysbus_init_mmio(SYS_BUS_DEVICE(dev), &s->container_cpuhp); + cpu_hotplug_hw_init(&s->container_cpuhp, OBJECT(dev), + &s->cpuhp_state, 0); } static void acpi_ged_class_init(ObjectClass *class, void *data) diff --git a/include/hw/acpi/cpu_hotplug.h b/include/hw/acpi/cpu_hotplug.h index 3b932abbbb..afee1ab996 100644 --- a/include/hw/acpi/cpu_hotplug.h +++ b/include/hw/acpi/cpu_hotplug.h @@ -19,6 +19,16 @@ #include "hw/hotplug.h" #include "hw/acpi/cpu.h" +#define ACPI_CPU_HOTPLUG_REG_LEN 12 +#define ACPI_CPU_SELECTOR_OFFSET_WR 0 +#define ACPI_CPU_FLAGS_OFFSET_RW 4 +#define ACPI_CPU_CMD_OFFSET_WR 5 +#define ACPI_CPU_CMD_DATA_OFFSET_RW 8 +#define ACPI_CPU_CMD_DATA2_OFFSET_R 0 + +#define ACPI_CPU_SCAN_METHOD "CSCN" +#define ACPI_CPU_CONTAINER "\\_SB.CPUS" + typedef struct AcpiCpuHotplug { Object *device; MemoryRegion io; diff --git a/include/hw/acpi/generic_event_device.h b/include/hw/acpi/generic_event_device.h index ba84ce0214..a803ea818e 100644 --- a/include/hw/acpi/generic_event_device.h +++ b/include/hw/acpi/generic_event_device.h @@ -60,6 +60,7 @@ #define HW_ACPI_GENERIC_EVENT_DEVICE_H #include "hw/sysbus.h" +#include "hw/acpi/cpu_hotplug.h" #include "hw/acpi/memory_hotplug.h" #include "hw/acpi/ghes.h" #include "qom/object.h" @@ -95,6 +96,7 @@ OBJECT_DECLARE_SIMPLE_TYPE(AcpiGedState, ACPI_GED) #define ACPI_GED_MEM_HOTPLUG_EVT 0x1 #define ACPI_GED_PWR_DOWN_EVT 0x2 #define ACPI_GED_NVDIMM_HOTPLUG_EVT 0x4 +#define ACPI_GED_CPU_HOTPLUG_EVT 0x8 typedef struct GEDState { MemoryRegion evt; @@ -106,6 +108,9 @@ struct AcpiGedState { SysBusDevice parent_obj; MemHotplugState memhp_state; MemoryRegion container_memhp; + CPUHotplugState cpuhp_state; + MemoryRegion container_cpuhp; + AcpiCpuHotplug cpuhp; GEDState ged_state; uint32_t ged_event_bitmap; qemu_irq irq;
ACPI GED shall be used to convey to the guest kernel about any cpu hot-(un)plug events. Therefore, existing ACPI GED framework inside QEMU needs to be enhanced to support CPU hot-(un)plug state and events. Co-authored-by: "Salil Mehta" <salil.mehta@opnsrc.net> Co-authored-by: "Salil Mehta" <salil.mehta@huawei.com> Cc: "Bernhard Beschow" <shentey@gmail.com> Cc: "Salil Mehta" <salil.mehta@huawei.com> Cc: "Salil Mehta" <salil.mehta@opnsrc.net> Cc: Xiaojuan Yang <yangxiaojuan@loongson.cn> Cc: Song Gao <gaosong@loongson.cn> Cc: "Michael S. Tsirkin" <mst@redhat.com> Cc: Igor Mammedov <imammedo@redhat.com> Cc: Ani Sinha <anisinha@redhat.com> Cc: Paolo Bonzini <pbonzini@redhat.com> Cc: Richard Henderson <richard.henderson@linaro.org> Cc: Eduardo Habkost <eduardo@habkost.net> Cc: Marcel Apfelbaum <marcel.apfelbaum@gmail.com> Cc: "Philippe Mathieu-Daudé" <philmd@linaro.org> Cc: Yanan Wang <wangyanan55@huawei.com> Cc: "Daniel P. Berrangé" <berrange@redhat.com> Cc: Peter Xu <peterx@redhat.com> Cc: David Hildenbrand <david@redhat.com> Cc: Bibo Mao <maobibo@loongson.cn> Signed-off-by: xianglai li <lixianglai@loongson.cn> --- hw/acpi/acpi-cpu-hotplug-stub.c | 6 +++++ hw/acpi/cpu.c | 7 ------ hw/acpi/generic_event_device.c | 33 ++++++++++++++++++++++++++ include/hw/acpi/cpu_hotplug.h | 10 ++++++++ include/hw/acpi/generic_event_device.h | 5 ++++ 5 files changed, 54 insertions(+), 7 deletions(-)