104 lines
3.9 KiB
Diff
104 lines
3.9 KiB
Diff
|
|
From 6b0f94aee82c7558d79e5ec28437483c4873dc65 Mon Sep 17 00:00:00 2001
|
||
|
|
From: Keqian Zhu <zhukeqian1@huawei.com>
|
||
|
|
Date: Sun, 5 Apr 2020 16:03:15 +0800
|
||
|
|
Subject: [PATCH] arm/virt: Attach ACPI CPU hotplug support to virt
|
||
|
|
|
||
|
|
Attach cpus aml building and GED support for CPU hotplug to
|
||
|
|
arm/virt, but currently we make it diabled by not add CPU
|
||
|
|
hotplug event to GED.
|
||
|
|
|
||
|
|
Signed-off-by: Keqian Zhu <zhukeqian1@huawei.com>
|
||
|
|
Signed-off-by: Salil Mehta <salil.mehta@huawei.com>
|
||
|
|
---
|
||
|
|
hw/arm/virt-acpi-build.c | 15 ++++++++++++++-
|
||
|
|
hw/arm/virt.c | 6 ++++++
|
||
|
|
include/hw/arm/virt.h | 1 +
|
||
|
|
3 files changed, 21 insertions(+), 1 deletion(-)
|
||
|
|
|
||
|
|
diff --git a/hw/arm/virt-acpi-build.c b/hw/arm/virt-acpi-build.c
|
||
|
|
index a93d223879..7cb320d9f2 100644
|
||
|
|
--- a/hw/arm/virt-acpi-build.c
|
||
|
|
+++ b/hw/arm/virt-acpi-build.c
|
||
|
|
@@ -937,6 +937,7 @@ build_dsdt(GArray *table_data, BIOSLinker *linker, VirtMachineState *vms)
|
||
|
|
const int *irqmap = vms->irqmap;
|
||
|
|
AcpiTable table = { .sig = "DSDT", .rev = 2, .oem_id = vms->oem_id,
|
||
|
|
.oem_table_id = vms->oem_table_id };
|
||
|
|
+ bool cpu_aml_built = false;
|
||
|
|
|
||
|
|
acpi_table_begin(&table, table_data);
|
||
|
|
dsdt = init_aml_allocator();
|
||
|
|
@@ -947,7 +948,6 @@ build_dsdt(GArray *table_data, BIOSLinker *linker, VirtMachineState *vms)
|
||
|
|
* the RTC ACPI device at all when using UEFI.
|
||
|
|
*/
|
||
|
|
scope = aml_scope("\\_SB");
|
||
|
|
- acpi_dsdt_add_cpus(scope, vms);
|
||
|
|
acpi_dsdt_add_uart(scope, &memmap[VIRT_UART],
|
||
|
|
(irqmap[VIRT_UART] + ARM_SPI_BASE));
|
||
|
|
if (vmc->acpi_expose_flash) {
|
||
|
|
@@ -977,6 +977,19 @@ build_dsdt(GArray *table_data, BIOSLinker *linker, VirtMachineState *vms)
|
||
|
|
AML_SYSTEM_MEMORY,
|
||
|
|
memmap[VIRT_PCDIMM_ACPI].base);
|
||
|
|
}
|
||
|
|
+
|
||
|
|
+ if (event & ACPI_GED_CPU_HOTPLUG_EVT) {
|
||
|
|
+ CPUHotplugFeatures opts = {
|
||
|
|
+ .acpi_1_compatible = false, .has_legacy_cphp = false
|
||
|
|
+ };
|
||
|
|
+ build_cpus_aml(dsdt, ms, opts, memmap[VIRT_CPU_ACPI].base,
|
||
|
|
+ "\\_SB", NULL, AML_SYSTEM_MEMORY);
|
||
|
|
+ cpu_aml_built = true;
|
||
|
|
+ }
|
||
|
|
+ }
|
||
|
|
+
|
||
|
|
+ if (!cpu_aml_built) {
|
||
|
|
+ acpi_dsdt_add_cpus(scope, vms);
|
||
|
|
}
|
||
|
|
|
||
|
|
acpi_dsdt_add_power_button(scope);
|
||
|
|
diff --git a/hw/arm/virt.c b/hw/arm/virt.c
|
||
|
|
index 3299d674c8..9b73c479c4 100644
|
||
|
|
--- a/hw/arm/virt.c
|
||
|
|
+++ b/hw/arm/virt.c
|
||
|
|
@@ -154,6 +154,7 @@ static const MemMapEntry base_memmap[] = {
|
||
|
|
[VIRT_NVDIMM_ACPI] = { 0x09090000, NVDIMM_ACPI_IO_LEN},
|
||
|
|
[VIRT_PVTIME] = { 0x090a0000, 0x00010000 },
|
||
|
|
[VIRT_SECURE_GPIO] = { 0x090b0000, 0x00001000 },
|
||
|
|
+ [VIRT_CPU_ACPI] = { 0x090c0000, ACPI_CPU_HOTPLUG_REG_LEN },
|
||
|
|
[VIRT_MMIO] = { 0x0a000000, 0x00000200 },
|
||
|
|
[VIRT_CPUFREQ] = { 0x0b000000, 0x00010000 },
|
||
|
|
/* ...repeating for a total of NUM_VIRTIO_TRANSPORTS, each of that size */
|
||
|
|
@@ -697,6 +698,10 @@ static inline DeviceState *create_acpi_ged(VirtMachineState *vms)
|
||
|
|
event |= ACPI_GED_NVDIMM_HOTPLUG_EVT;
|
||
|
|
}
|
||
|
|
|
||
|
|
+ /* event |= ACPI_GED_CPU_HOTPLUG_EVT;
|
||
|
|
+ * Currently CPU hotplug is not enabled.
|
||
|
|
+ */
|
||
|
|
+
|
||
|
|
dev = qdev_new(TYPE_ACPI_GED);
|
||
|
|
qdev_prop_set_uint32(dev, "ged-event", event);
|
||
|
|
|
||
|
|
@@ -706,6 +711,7 @@ static inline DeviceState *create_acpi_ged(VirtMachineState *vms)
|
||
|
|
|
||
|
|
sysbus_mmio_map(SYS_BUS_DEVICE(dev), 0, vms->memmap[VIRT_ACPI_GED].base);
|
||
|
|
sysbus_mmio_map(SYS_BUS_DEVICE(dev), 1, vms->memmap[VIRT_PCDIMM_ACPI].base);
|
||
|
|
+ sysbus_mmio_map(SYS_BUS_DEVICE(dev), 3, vms->memmap[VIRT_CPU_ACPI].base);
|
||
|
|
sysbus_connect_irq(SYS_BUS_DEVICE(dev), 0, qdev_get_gpio_in(vms->gic, irq));
|
||
|
|
|
||
|
|
sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
|
||
|
|
diff --git a/include/hw/arm/virt.h b/include/hw/arm/virt.h
|
||
|
|
index fe26709e1a..2a838620d8 100644
|
||
|
|
--- a/include/hw/arm/virt.h
|
||
|
|
+++ b/include/hw/arm/virt.h
|
||
|
|
@@ -88,6 +88,7 @@ enum {
|
||
|
|
VIRT_ACPI_GED,
|
||
|
|
VIRT_NVDIMM_ACPI,
|
||
|
|
VIRT_PVTIME,
|
||
|
|
+ VIRT_CPU_ACPI,
|
||
|
|
VIRT_LOWMEMMAP_LAST,
|
||
|
|
};
|
||
|
|
|
||
|
|
--
|
||
|
|
2.27.0
|
||
|
|
|