129 lines
4.7 KiB
Diff
129 lines
4.7 KiB
Diff
|
|
From ac96f216155002d0c874ff88e301e83495093085 Mon Sep 17 00:00:00 2001
|
||
|
|
From: Salil Mehta <salil.mehta@huawei.com>
|
||
|
|
Date: Tue, 16 Jul 2024 12:14:58 +0100
|
||
|
|
Subject: [PATCH 64/78] hw/acpi: Update ACPI GED framework to support vCPU
|
||
|
|
Hotplug
|
||
|
|
|
||
|
|
ACPI GED (as described in the ACPI 6.4 spec) uses an interrupt listed in the
|
||
|
|
_CRS object of GED to intimate OSPM about an event. Later then demultiplexes the
|
||
|
|
notified event by evaluating ACPI _EVT method to know the type of event. Use
|
||
|
|
ACPI GED to also notify the guest kernel about any CPU hot(un)plug events.
|
||
|
|
|
||
|
|
Note, GED interface is used by many hotplug events like memory hotplug, NVDIMM
|
||
|
|
hotplug and non-hotplug events like system power down event. Each of these can
|
||
|
|
be selected using a bit in the 32 bit GED IO interface. A bit has been reserved
|
||
|
|
for the CPU hotplug event.
|
||
|
|
|
||
|
|
ACPI CPU hotplug related initialization should only happen if ACPI_CPU_HOTPLUG
|
||
|
|
support has been enabled for particular architecture. Add cpu_hotplug_hw_init()
|
||
|
|
stub to avoid compilation break.
|
||
|
|
|
||
|
|
Co-developed-by: Keqian Zhu <zhukeqian1@huawei.com>
|
||
|
|
Signed-off-by: Keqian Zhu <zhukeqian1@huawei.com>
|
||
|
|
Signed-off-by: Salil Mehta <salil.mehta@huawei.com>
|
||
|
|
Reviewed-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
|
||
|
|
Reviewed-by: Gavin Shan <gshan@redhat.com>
|
||
|
|
Reviewed-by: David Hildenbrand <david@redhat.com>
|
||
|
|
Reviewed-by: Shaoqin Huang <shahuang@redhat.com>
|
||
|
|
Tested-by: Vishnu Pajjuri <vishnu@os.amperecomputing.com>
|
||
|
|
Tested-by: Xianglai Li <lixianglai@loongson.cn>
|
||
|
|
Tested-by: Miguel Luis <miguel.luis@oracle.com>
|
||
|
|
Reviewed-by: Vishnu Pajjuri <vishnu@os.amperecomputing.com>
|
||
|
|
Tested-by: Zhao Liu <zhao1.liu@intel.com>
|
||
|
|
Reviewed-by: Zhao Liu <zhao1.liu@intel.com>
|
||
|
|
Message-Id: <20240716111502.202344-4-salil.mehta@huawei.com>
|
||
|
|
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
|
||
|
|
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
|
||
|
|
Acked-by: Igor Mammedov <imammedo@redhat.com>
|
||
|
|
Signed-off-by: Xianglai Li <lixianglai@loongson.cn>
|
||
|
|
---
|
||
|
|
docs/specs/acpi_hw_reduced_hotplug.rst | 3 ++-
|
||
|
|
hw/acpi/generic_event_device.c | 37 ++++++++++++++++++++++++++
|
||
|
|
include/hw/acpi/generic_event_device.h | 1 +
|
||
|
|
3 files changed, 40 insertions(+), 1 deletion(-)
|
||
|
|
|
||
|
|
diff --git a/docs/specs/acpi_hw_reduced_hotplug.rst b/docs/specs/acpi_hw_reduced_hotplug.rst
|
||
|
|
index 0bd3f9399f..3acd6fcd8b 100644
|
||
|
|
--- a/docs/specs/acpi_hw_reduced_hotplug.rst
|
||
|
|
+++ b/docs/specs/acpi_hw_reduced_hotplug.rst
|
||
|
|
@@ -64,7 +64,8 @@ GED IO interface (4 byte access)
|
||
|
|
0: Memory hotplug event
|
||
|
|
1: System power down event
|
||
|
|
2: NVDIMM hotplug event
|
||
|
|
- 3-31: Reserved
|
||
|
|
+ 3: CPU hotplug event
|
||
|
|
+ 4-31: Reserved
|
||
|
|
|
||
|
|
**write_access:**
|
||
|
|
|
||
|
|
diff --git a/hw/acpi/generic_event_device.c b/hw/acpi/generic_event_device.c
|
||
|
|
index 2ce7031f1a..755653dc26 100644
|
||
|
|
--- a/hw/acpi/generic_event_device.c
|
||
|
|
+++ b/hw/acpi/generic_event_device.c
|
||
|
|
@@ -397,6 +397,42 @@ static const VMStateDescription vmstate_acpi_ged = {
|
||
|
|
}
|
||
|
|
};
|
||
|
|
|
||
|
|
+static void acpi_ged_realize(DeviceState *dev, Error **errp)
|
||
|
|
+{
|
||
|
|
+ SysBusDevice *sbd = SYS_BUS_DEVICE(dev);
|
||
|
|
+ AcpiGedState *s = ACPI_GED(dev);
|
||
|
|
+ uint32_t ged_events;
|
||
|
|
+ int i;
|
||
|
|
+
|
||
|
|
+ ged_events = ctpop32(s->ged_event_bitmap);
|
||
|
|
+
|
||
|
|
+ for (i = 0; i < ARRAY_SIZE(ged_supported_events) && ged_events; i++) {
|
||
|
|
+ uint32_t event = s->ged_event_bitmap & ged_supported_events[i];
|
||
|
|
+
|
||
|
|
+ if (!event) {
|
||
|
|
+ continue;
|
||
|
|
+ }
|
||
|
|
+
|
||
|
|
+ switch (event) {
|
||
|
|
+ case ACPI_GED_CPU_HOTPLUG_EVT:
|
||
|
|
+ /* initialize CPU Hotplug related regions */
|
||
|
|
+ memory_region_init(&s->container_cpuhp, OBJECT(dev),
|
||
|
|
+ "cpuhp container",
|
||
|
|
+ ACPI_CPU_HOTPLUG_REG_LEN);
|
||
|
|
+ sysbus_init_mmio(sbd, &s->container_cpuhp);
|
||
|
|
+ cpu_hotplug_hw_init(&s->container_cpuhp, OBJECT(dev),
|
||
|
|
+ &s->cpuhp_state, 0);
|
||
|
|
+ break;
|
||
|
|
+ }
|
||
|
|
+ ged_events--;
|
||
|
|
+ }
|
||
|
|
+
|
||
|
|
+ if (ged_events) {
|
||
|
|
+ error_report("Unsupported events specified");
|
||
|
|
+ abort();
|
||
|
|
+ }
|
||
|
|
+}
|
||
|
|
+
|
||
|
|
static void acpi_ged_initfn(Object *obj)
|
||
|
|
{
|
||
|
|
DeviceState *dev = DEVICE(obj);
|
||
|
|
@@ -447,6 +483,7 @@ static void acpi_ged_class_init(ObjectClass *class, void *data)
|
||
|
|
dc->desc = "ACPI Generic Event Device";
|
||
|
|
device_class_set_props(dc, acpi_ged_properties);
|
||
|
|
dc->vmsd = &vmstate_acpi_ged;
|
||
|
|
+ dc->realize = acpi_ged_realize;
|
||
|
|
|
||
|
|
hc->plug = acpi_ged_device_plug_cb;
|
||
|
|
hc->unplug_request = acpi_ged_unplug_request_cb;
|
||
|
|
diff --git a/include/hw/acpi/generic_event_device.h b/include/hw/acpi/generic_event_device.h
|
||
|
|
index 8ed9534c57..d1df3c12e5 100644
|
||
|
|
--- a/include/hw/acpi/generic_event_device.h
|
||
|
|
+++ b/include/hw/acpi/generic_event_device.h
|
||
|
|
@@ -63,6 +63,7 @@
|
||
|
|
#include "hw/acpi/cpu_hotplug.h"
|
||
|
|
#include "hw/acpi/memory_hotplug.h"
|
||
|
|
#include "hw/acpi/ghes.h"
|
||
|
|
+#include "hw/acpi/cpu.h"
|
||
|
|
#include "qom/object.h"
|
||
|
|
|
||
|
|
#define ACPI_POWER_BUTTON_DEVICE "PWRB"
|
||
|
|
--
|
||
|
|
2.39.1
|
||
|
|
|