This series is an attempt to provide CPU hotplug support on ARM virt platform. This is based on ACPI GED device. We should enable ACPI support, and use vGICv3 and 64bit CPU to support CPU hotplug. Under KVM accel, the KVM vCPUs is pre-created. Besides, vGIC IRIs is pre-created too. However, QEMU vCPU objects are defer-created. Signed-off-by: Keqian Zhu <zhukeqian1@huawei.com>
129 lines
5.1 KiB
Diff
129 lines
5.1 KiB
Diff
From 107c267ebe5b8c461268a4ff8384ad2f2b9e8ce0 Mon Sep 17 00:00:00 2001
|
|
From: Keqian Zhu <zhukeqian1@huawei.com>
|
|
Date: Wed, 22 Apr 2020 16:11:13 +0800
|
|
Subject: [PATCH] acpi/cpu: Prepare build_cpus_aml for arm virt
|
|
|
|
We will reuse build_cpus_aml to build DSDT cpus aml in arm/virt
|
|
ACPI to realize cpu hotplug. Three points are added.
|
|
|
|
1. Make ACPI IO address space configurable, because ARM64 platforms
|
|
don't use port IO for ACPI IO space.
|
|
2. Add GICC struct building support in _MAT of cpu aml.
|
|
3. Let the hotplug method parameter can be NULL, because ACPI GED
|
|
will realize it.
|
|
|
|
Besides, CPU CPPC building is injected.
|
|
|
|
Signed-off-by: Keqian Zhu <zhukeqian1@huawei.com>
|
|
Signed-off-by: Salil Mehta <salil.mehta@huawei.com>
|
|
---
|
|
hw/acpi/cpu.c | 32 +++++++++++++++++++++++++-------
|
|
hw/i386/acpi-build.c | 2 +-
|
|
include/hw/acpi/cpu.h | 3 ++-
|
|
3 files changed, 28 insertions(+), 9 deletions(-)
|
|
|
|
diff --git a/hw/acpi/cpu.c b/hw/acpi/cpu.c
|
|
index 0c0bfe479a..72ad1fcff2 100644
|
|
--- a/hw/acpi/cpu.c
|
|
+++ b/hw/acpi/cpu.c
|
|
@@ -314,7 +314,8 @@ const VMStateDescription vmstate_cpu_hotplug = {
|
|
void build_cpus_aml(Aml *table, MachineState *machine, CPUHotplugFeatures opts,
|
|
hwaddr io_base,
|
|
const char *res_root,
|
|
- const char *event_handler_method)
|
|
+ const char *event_handler_method,
|
|
+ AmlRegionSpace rs)
|
|
{
|
|
Aml *ifctx;
|
|
Aml *field;
|
|
@@ -342,13 +343,18 @@ void build_cpus_aml(Aml *table, MachineState *machine, CPUHotplugFeatures opts,
|
|
aml_append(cpu_ctrl_dev, aml_mutex(CPU_LOCK, 0));
|
|
|
|
crs = aml_resource_template();
|
|
- aml_append(crs, aml_io(AML_DECODE16, io_base, io_base, 1,
|
|
- ACPI_CPU_HOTPLUG_REG_LEN));
|
|
+ if (rs == AML_SYSTEM_IO) {
|
|
+ aml_append(crs, aml_io(AML_DECODE16, io_base, io_base, 1,
|
|
+ ACPI_CPU_HOTPLUG_REG_LEN));
|
|
+ } else {
|
|
+ aml_append(crs, aml_memory32_fixed(io_base,
|
|
+ ACPI_CPU_HOTPLUG_REG_LEN, AML_READ_WRITE));
|
|
+ }
|
|
aml_append(cpu_ctrl_dev, aml_name_decl("_CRS", crs));
|
|
|
|
/* declare CPU hotplug MMIO region with related access fields */
|
|
aml_append(cpu_ctrl_dev,
|
|
- aml_operation_region("PRST", AML_SYSTEM_IO, aml_int(io_base),
|
|
+ aml_operation_region("PRST", rs, aml_int(io_base),
|
|
ACPI_CPU_HOTPLUG_REG_LEN));
|
|
|
|
field = aml_field("PRST", AML_BYTE_ACC, AML_NOLOCK,
|
|
@@ -517,6 +523,11 @@ void build_cpus_aml(Aml *table, MachineState *machine, CPUHotplugFeatures opts,
|
|
aml_append(dev, aml_name_decl("_UID", uid));
|
|
}
|
|
|
|
+ assert(adevc);
|
|
+ if (adevc->cpu_cppc) {
|
|
+ adevc->cpu_cppc(adev, i, arch_ids->len, dev);
|
|
+ }
|
|
+
|
|
method = aml_method("_STA", 0, AML_SERIALIZED);
|
|
aml_append(method, aml_return(aml_call1(CPU_STS_METHOD, uid)));
|
|
aml_append(dev, method);
|
|
@@ -535,6 +546,11 @@ void build_cpus_aml(Aml *table, MachineState *machine, CPUHotplugFeatures opts,
|
|
apic->flags = cpu_to_le32(1);
|
|
break;
|
|
}
|
|
+ case ACPI_APIC_GENERIC_CPU_INTERFACE: {
|
|
+ AcpiMadtGenericCpuInterface *gicc = (void *)madt_buf->data;
|
|
+ gicc->flags = cpu_to_le32(1);
|
|
+ break;
|
|
+ }
|
|
default:
|
|
assert(0);
|
|
}
|
|
@@ -570,9 +586,11 @@ void build_cpus_aml(Aml *table, MachineState *machine, CPUHotplugFeatures opts,
|
|
aml_append(sb_scope, cpus_dev);
|
|
aml_append(table, sb_scope);
|
|
|
|
- method = aml_method(event_handler_method, 0, AML_NOTSERIALIZED);
|
|
- aml_append(method, aml_call0("\\_SB.CPUS." CPU_SCAN_METHOD));
|
|
- aml_append(table, method);
|
|
+ if (event_handler_method) {
|
|
+ method = aml_method(event_handler_method, 0, AML_NOTSERIALIZED);
|
|
+ aml_append(method, aml_call0("\\_SB.CPUS." CPU_SCAN_METHOD));
|
|
+ aml_append(table, method);
|
|
+ }
|
|
|
|
g_free(cphp_res_path);
|
|
}
|
|
diff --git a/hw/i386/acpi-build.c b/hw/i386/acpi-build.c
|
|
index 749218561a..c97731ecb3 100644
|
|
--- a/hw/i386/acpi-build.c
|
|
+++ b/hw/i386/acpi-build.c
|
|
@@ -1869,7 +1869,7 @@ build_dsdt(GArray *table_data, BIOSLinker *linker,
|
|
.acpi_1_compatible = true, .has_legacy_cphp = true
|
|
};
|
|
build_cpus_aml(dsdt, machine, opts, pm->cpu_hp_io_base,
|
|
- "\\_SB.PCI0", "\\_GPE._E02");
|
|
+ "\\_SB.PCI0", "\\_GPE._E02", AML_SYSTEM_IO);
|
|
}
|
|
|
|
if (pcms->memhp_io_base && nr_mem) {
|
|
diff --git a/include/hw/acpi/cpu.h b/include/hw/acpi/cpu.h
|
|
index 62f0278ba2..a30ec84a4f 100644
|
|
--- a/include/hw/acpi/cpu.h
|
|
+++ b/include/hw/acpi/cpu.h
|
|
@@ -55,7 +55,8 @@ typedef struct CPUHotplugFeatures {
|
|
void build_cpus_aml(Aml *table, MachineState *machine, CPUHotplugFeatures opts,
|
|
hwaddr io_base,
|
|
const char *res_root,
|
|
- const char *event_handler_method);
|
|
+ const char *event_handler_method,
|
|
+ AmlRegionSpace rs);
|
|
|
|
void acpi_cpu_ospm_status(CPUHotplugState *cpu_st, ACPIOSTInfoList ***list);
|
|
|
|
--
|
|
2.19.1
|