* [PATCH v2 1/8] hw: add compat machines for 6.0
2020-12-07 14:07 [PATCH v2 0/8] add support for cpu hot-unplug with SMI broadcast enabled Igor Mammedov
@ 2020-12-07 14:07 ` Igor Mammedov
2020-12-07 14:07 ` [PATCH v2 2/8] acpi: cpuhp: introduce 'firmware performs eject' status/control bits Igor Mammedov
` (6 subsequent siblings)
7 siblings, 0 replies; 9+ messages in thread
From: Igor Mammedov @ 2020-12-07 14:07 UTC (permalink / raw)
To: qemu-devel; +Cc: lersek, ankur.a.arora, mst
From: Cornelia Huck <cohuck@redhat.com>
Add 6.0 machine types for arm/i440fx/q35/s390x/spapr.
Signed-off-by: Cornelia Huck <cohuck@redhat.com>
Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
include/hw/boards.h | 3 +++
include/hw/i386/pc.h | 3 +++
hw/arm/virt.c | 9 ++++++++-
hw/core/machine.c | 3 +++
hw/i386/pc.c | 3 +++
hw/i386/pc_piix.c | 14 +++++++++++++-
hw/i386/pc_q35.c | 13 ++++++++++++-
hw/ppc/spapr.c | 15 +++++++++++++--
hw/s390x/s390-virtio-ccw.c | 14 +++++++++++++-
9 files changed, 71 insertions(+), 6 deletions(-)
diff --git a/include/hw/boards.h b/include/hw/boards.h
index a49e3a6b44..f94f4ad5d8 100644
--- a/include/hw/boards.h
+++ b/include/hw/boards.h
@@ -310,6 +310,9 @@ struct MachineState {
} \
type_init(machine_initfn##_register_types)
+extern GlobalProperty hw_compat_5_2[];
+extern const size_t hw_compat_5_2_len;
+
extern GlobalProperty hw_compat_5_1[];
extern const size_t hw_compat_5_1_len;
diff --git a/include/hw/i386/pc.h b/include/hw/i386/pc.h
index 911e460097..49dfa667de 100644
--- a/include/hw/i386/pc.h
+++ b/include/hw/i386/pc.h
@@ -191,6 +191,9 @@ void pc_system_firmware_init(PCMachineState *pcms, MemoryRegion *rom_memory);
void pc_madt_cpu_entry(AcpiDeviceIf *adev, int uid,
const CPUArchIdList *apic_ids, GArray *entry);
+extern GlobalProperty pc_compat_5_2[];
+extern const size_t pc_compat_5_2_len;
+
extern GlobalProperty pc_compat_5_1[];
extern const size_t pc_compat_5_1_len;
diff --git a/hw/arm/virt.c b/hw/arm/virt.c
index 27dbeb549e..d21dad4491 100644
--- a/hw/arm/virt.c
+++ b/hw/arm/virt.c
@@ -2587,10 +2587,17 @@ static void machvirt_machine_init(void)
}
type_init(machvirt_machine_init);
+static void virt_machine_6_0_options(MachineClass *mc)
+{
+}
+DEFINE_VIRT_MACHINE_AS_LATEST(6, 0)
+
static void virt_machine_5_2_options(MachineClass *mc)
{
+ virt_machine_6_0_options(mc);
+ compat_props_add(mc->compat_props, hw_compat_5_2, hw_compat_5_2_len);
}
-DEFINE_VIRT_MACHINE_AS_LATEST(5, 2)
+DEFINE_VIRT_MACHINE(5, 2)
static void virt_machine_5_1_options(MachineClass *mc)
{
diff --git a/hw/core/machine.c b/hw/core/machine.c
index d0408049b5..9c41b94e0d 100644
--- a/hw/core/machine.c
+++ b/hw/core/machine.c
@@ -28,6 +28,9 @@
#include "hw/mem/nvdimm.h"
#include "migration/vmstate.h"
+GlobalProperty hw_compat_5_2[] = {};
+const size_t hw_compat_5_2_len = G_N_ELEMENTS(hw_compat_5_2);
+
GlobalProperty hw_compat_5_1[] = {
{ "vhost-scsi", "num_queues", "1"},
{ "vhost-user-blk", "num-queues", "1"},
diff --git a/hw/i386/pc.c b/hw/i386/pc.c
index 17b514d1da..781523684c 100644
--- a/hw/i386/pc.c
+++ b/hw/i386/pc.c
@@ -97,6 +97,9 @@
#include "trace.h"
#include CONFIG_DEVICES
+GlobalProperty pc_compat_5_2[] = {};
+const size_t pc_compat_5_2_len = G_N_ELEMENTS(pc_compat_5_2);
+
GlobalProperty pc_compat_5_1[] = {
{ "ICH9-LPC", "x-smi-cpu-hotplug", "off" },
};
diff --git a/hw/i386/pc_piix.c b/hw/i386/pc_piix.c
index 13d1628f13..6188c3e97e 100644
--- a/hw/i386/pc_piix.c
+++ b/hw/i386/pc_piix.c
@@ -426,7 +426,7 @@ static void pc_i440fx_machine_options(MachineClass *m)
machine_class_allow_dynamic_sysbus_dev(m, TYPE_VMBUS_BRIDGE);
}
-static void pc_i440fx_5_2_machine_options(MachineClass *m)
+static void pc_i440fx_6_0_machine_options(MachineClass *m)
{
PCMachineClass *pcmc = PC_MACHINE_CLASS(m);
pc_i440fx_machine_options(m);
@@ -435,6 +435,18 @@ static void pc_i440fx_5_2_machine_options(MachineClass *m)
pcmc->default_cpu_version = 1;
}
+DEFINE_I440FX_MACHINE(v6_0, "pc-i440fx-6.0", NULL,
+ pc_i440fx_6_0_machine_options);
+
+static void pc_i440fx_5_2_machine_options(MachineClass *m)
+{
+ pc_i440fx_6_0_machine_options(m);
+ m->alias = NULL;
+ m->is_default = false;
+ compat_props_add(m->compat_props, hw_compat_5_2, hw_compat_5_2_len);
+ compat_props_add(m->compat_props, pc_compat_5_2, pc_compat_5_2_len);
+}
+
DEFINE_I440FX_MACHINE(v5_2, "pc-i440fx-5.2", NULL,
pc_i440fx_5_2_machine_options);
diff --git a/hw/i386/pc_q35.c b/hw/i386/pc_q35.c
index a3f4959c43..0a212443aa 100644
--- a/hw/i386/pc_q35.c
+++ b/hw/i386/pc_q35.c
@@ -344,7 +344,7 @@ static void pc_q35_machine_options(MachineClass *m)
m->max_cpus = 288;
}
-static void pc_q35_5_2_machine_options(MachineClass *m)
+static void pc_q35_6_0_machine_options(MachineClass *m)
{
PCMachineClass *pcmc = PC_MACHINE_CLASS(m);
pc_q35_machine_options(m);
@@ -352,6 +352,17 @@ static void pc_q35_5_2_machine_options(MachineClass *m)
pcmc->default_cpu_version = 1;
}
+DEFINE_Q35_MACHINE(v6_0, "pc-q35-6.0", NULL,
+ pc_q35_6_0_machine_options);
+
+static void pc_q35_5_2_machine_options(MachineClass *m)
+{
+ pc_q35_6_0_machine_options(m);
+ m->alias = NULL;
+ compat_props_add(m->compat_props, hw_compat_5_2, hw_compat_5_2_len);
+ compat_props_add(m->compat_props, pc_compat_5_2, pc_compat_5_2_len);
+}
+
DEFINE_Q35_MACHINE(v5_2, "pc-q35-5.2", NULL,
pc_q35_5_2_machine_options);
diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c
index 12a012d9dd..c060702013 100644
--- a/hw/ppc/spapr.c
+++ b/hw/ppc/spapr.c
@@ -4509,15 +4509,26 @@ static void spapr_machine_latest_class_options(MachineClass *mc)
} \
type_init(spapr_machine_register_##suffix)
+/*
+ * pseries-6.0
+ */
+static void spapr_machine_6_0_class_options(MachineClass *mc)
+{
+ /* Defaults for the latest behaviour inherited from the base class */
+}
+
+DEFINE_SPAPR_MACHINE(6_0, "6.0", true);
+
/*
* pseries-5.2
*/
static void spapr_machine_5_2_class_options(MachineClass *mc)
{
- /* Defaults for the latest behaviour inherited from the base class */
+ spapr_machine_6_0_class_options(mc);
+ compat_props_add(mc->compat_props, hw_compat_5_2, hw_compat_5_2_len);
}
-DEFINE_SPAPR_MACHINE(5_2, "5.2", true);
+DEFINE_SPAPR_MACHINE(5_2, "5.2", false);
/*
* pseries-5.1
diff --git a/hw/s390x/s390-virtio-ccw.c b/hw/s390x/s390-virtio-ccw.c
index 4e140bbead..f0ee8dae68 100644
--- a/hw/s390x/s390-virtio-ccw.c
+++ b/hw/s390x/s390-virtio-ccw.c
@@ -789,14 +789,26 @@ bool css_migration_enabled(void)
} \
type_init(ccw_machine_register_##suffix)
+static void ccw_machine_6_0_instance_options(MachineState *machine)
+{
+}
+
+static void ccw_machine_6_0_class_options(MachineClass *mc)
+{
+}
+DEFINE_CCW_MACHINE(6_0, "6.0", true);
+
static void ccw_machine_5_2_instance_options(MachineState *machine)
{
+ ccw_machine_6_0_instance_options(machine);
}
static void ccw_machine_5_2_class_options(MachineClass *mc)
{
+ ccw_machine_6_0_class_options(mc);
+ compat_props_add(mc->compat_props, hw_compat_5_2, hw_compat_5_2_len);
}
-DEFINE_CCW_MACHINE(5_2, "5.2", true);
+DEFINE_CCW_MACHINE(5_2, "5.2", false);
static void ccw_machine_5_1_instance_options(MachineState *machine)
{
--
2.27.0
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCH v2 2/8] acpi: cpuhp: introduce 'firmware performs eject' status/control bits
2020-12-07 14:07 [PATCH v2 0/8] add support for cpu hot-unplug with SMI broadcast enabled Igor Mammedov
2020-12-07 14:07 ` [PATCH v2 1/8] hw: add compat machines for 6.0 Igor Mammedov
@ 2020-12-07 14:07 ` Igor Mammedov
2020-12-07 14:07 ` [PATCH v2 3/8] x86: acpi: introduce AcpiPmInfo::smi_on_cpu_unplug Igor Mammedov
` (5 subsequent siblings)
7 siblings, 0 replies; 9+ messages in thread
From: Igor Mammedov @ 2020-12-07 14:07 UTC (permalink / raw)
To: qemu-devel; +Cc: lersek, ankur.a.arora, mst
Adds bit #4 to status/control field of CPU hotplug MMIO interface.
New bit will be used OSPM to mark CPUs as pending for removal by firmware,
when it calls _EJ0 method on CPU device node. Later on, when firmware
sees this bit set, it will perform CPU eject which will clear bit #4
as well.
Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
v2:
- take into account fw_remove bit when checking for events in
CPHP_GET_NEXT_CPU_WITH_EVENT_CMD
(Ankur Arora <ankur.a.arora@oracle.com>)
v1:
- rearrange status/control bits description (Laszlo)
- add clear bit #4 on eject
- drop toggling logic from bit #4, it can be only set by guest
and clear as part of cpu eject
- exclude boot CPU from remove request
- add trace events for new bit
---
include/hw/acpi/cpu.h | 1 +
docs/specs/acpi_cpu_hotplug.txt | 19 ++++++++++++++-----
hw/acpi/cpu.c | 12 +++++++++++-
hw/acpi/trace-events | 2 ++
4 files changed, 28 insertions(+), 6 deletions(-)
diff --git a/include/hw/acpi/cpu.h b/include/hw/acpi/cpu.h
index 0eeedaa491..d71edde456 100644
--- a/include/hw/acpi/cpu.h
+++ b/include/hw/acpi/cpu.h
@@ -22,6 +22,7 @@ typedef struct AcpiCpuStatus {
uint64_t arch_id;
bool is_inserting;
bool is_removing;
+ bool fw_remove;
uint32_t ost_event;
uint32_t ost_status;
} AcpiCpuStatus;
diff --git a/docs/specs/acpi_cpu_hotplug.txt b/docs/specs/acpi_cpu_hotplug.txt
index 9bb22d1270..9bd59ae0da 100644
--- a/docs/specs/acpi_cpu_hotplug.txt
+++ b/docs/specs/acpi_cpu_hotplug.txt
@@ -56,8 +56,11 @@ read access:
no device check event to OSPM was issued.
It's valid only when bit 0 is set.
2: Device remove event, used to distinguish device for which
- no device eject request to OSPM was issued.
- 3-7: reserved and should be ignored by OSPM
+ no device eject request to OSPM was issued. Firmware must
+ ignore this bit.
+ 3: reserved and should be ignored by OSPM
+ 4: if set to 1, OSPM requests firmware to perform device eject.
+ 5-7: reserved and should be ignored by OSPM
[0x5-0x7] reserved
[0x8] Command data: (DWORD access)
contains 0 unless value last stored in 'Command field' is one of:
@@ -79,10 +82,16 @@ write access:
selected CPU device
2: if set to 1 clears device remove event, set by OSPM
after it has emitted device eject request for the
- selected CPU device
+ selected CPU device.
3: if set to 1 initiates device eject, set by OSPM when it
- triggers CPU device removal and calls _EJ0 method
- 4-7: reserved, OSPM must clear them before writing to register
+ triggers CPU device removal and calls _EJ0 method or by firmware
+ when bit #4 is set. In case bit #4 were set, it's cleared as
+ part of device eject.
+ 4: if set to 1, OSPM hands over device eject to firmware.
+ Firmware shall issue device eject request as described above
+ (bit #3) and OSPM should not touch device eject bit (#3) in case
+ it's asked firmware to perform CPU device eject.
+ 5-7: reserved, OSPM must clear them before writing to register
[0x5] Command field: (1 byte access)
value:
0: selects a CPU device with inserting/removing events and
diff --git a/hw/acpi/cpu.c b/hw/acpi/cpu.c
index f099b50927..1293204438 100644
--- a/hw/acpi/cpu.c
+++ b/hw/acpi/cpu.c
@@ -71,6 +71,7 @@ static uint64_t cpu_hotplug_rd(void *opaque, hwaddr addr, unsigned size)
val |= cdev->cpu ? 1 : 0;
val |= cdev->is_inserting ? 2 : 0;
val |= cdev->is_removing ? 4 : 0;
+ val |= cdev->fw_remove ? 16 : 0;
trace_cpuhp_acpi_read_flags(cpu_st->selector, val);
break;
case ACPI_CPU_CMD_DATA_OFFSET_RW:
@@ -148,6 +149,14 @@ static void cpu_hotplug_wr(void *opaque, hwaddr addr, uint64_t data,
hotplug_ctrl = qdev_get_hotplug_handler(dev);
hotplug_handler_unplug(hotplug_ctrl, dev, NULL);
object_unparent(OBJECT(dev));
+ cdev->fw_remove = false;
+ } else if (data & 16) {
+ if (!cdev->cpu || cdev->cpu == first_cpu) {
+ trace_cpuhp_acpi_fw_remove_invalid_cpu(cpu_st->selector);
+ break;
+ }
+ trace_cpuhp_acpi_fw_remove_cpu(cpu_st->selector);
+ cdev->fw_remove = true;
}
break;
case ACPI_CPU_CMD_OFFSET_WR:
@@ -159,7 +168,8 @@ static void cpu_hotplug_wr(void *opaque, hwaddr addr, uint64_t data,
do {
cdev = &cpu_st->devs[iter];
- if (cdev->is_inserting || cdev->is_removing) {
+ if (cdev->is_inserting || cdev->is_removing ||
+ cdev->fw_remove) {
cpu_st->selector = iter;
trace_cpuhp_acpi_cpu_has_events(cpu_st->selector,
cdev->is_inserting, cdev->is_removing);
diff --git a/hw/acpi/trace-events b/hw/acpi/trace-events
index afbc77de1c..f91ced477d 100644
--- a/hw/acpi/trace-events
+++ b/hw/acpi/trace-events
@@ -29,6 +29,8 @@ cpuhp_acpi_clear_inserting_evt(uint32_t idx) "idx[0x%"PRIx32"]"
cpuhp_acpi_clear_remove_evt(uint32_t idx) "idx[0x%"PRIx32"]"
cpuhp_acpi_ejecting_invalid_cpu(uint32_t idx) "0x%"PRIx32
cpuhp_acpi_ejecting_cpu(uint32_t idx) "0x%"PRIx32
+cpuhp_acpi_fw_remove_invalid_cpu(uint32_t idx) "0x%"PRIx32
+cpuhp_acpi_fw_remove_cpu(uint32_t idx) "0x%"PRIx32
cpuhp_acpi_write_ost_ev(uint32_t slot, uint32_t ev) "idx[0x%"PRIx32"] OST EVENT: 0x%"PRIx32
cpuhp_acpi_write_ost_status(uint32_t slot, uint32_t st) "idx[0x%"PRIx32"] OST STATUS: 0x%"PRIx32
--
2.27.0
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCH v2 3/8] x86: acpi: introduce AcpiPmInfo::smi_on_cpu_unplug
2020-12-07 14:07 [PATCH v2 0/8] add support for cpu hot-unplug with SMI broadcast enabled Igor Mammedov
2020-12-07 14:07 ` [PATCH v2 1/8] hw: add compat machines for 6.0 Igor Mammedov
2020-12-07 14:07 ` [PATCH v2 2/8] acpi: cpuhp: introduce 'firmware performs eject' status/control bits Igor Mammedov
@ 2020-12-07 14:07 ` Igor Mammedov
2020-12-07 14:07 ` [PATCH v2 4/8] tests/acpi: allow expected files change Igor Mammedov
` (4 subsequent siblings)
7 siblings, 0 replies; 9+ messages in thread
From: Igor Mammedov @ 2020-12-07 14:07 UTC (permalink / raw)
To: qemu-devel; +Cc: lersek, ankur.a.arora, mst
Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
hw/i386/acpi-build.c | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/hw/i386/acpi-build.c b/hw/i386/acpi-build.c
index 1f5c211245..9036e5594c 100644
--- a/hw/i386/acpi-build.c
+++ b/hw/i386/acpi-build.c
@@ -96,6 +96,7 @@ typedef struct AcpiPmInfo {
bool s4_disabled;
bool pcihp_bridge_en;
bool smi_on_cpuhp;
+ bool smi_on_cpu_unplug;
bool pcihp_root_en;
uint8_t s4_val;
AcpiFadtData fadt;
@@ -197,6 +198,7 @@ static void acpi_get_pm_info(MachineState *machine, AcpiPmInfo *pm)
pm->pcihp_io_base = 0;
pm->pcihp_io_len = 0;
pm->smi_on_cpuhp = false;
+ pm->smi_on_cpu_unplug = false;
assert(obj);
init_common_fadt_data(machine, obj, &pm->fadt);
@@ -220,6 +222,8 @@ static void acpi_get_pm_info(MachineState *machine, AcpiPmInfo *pm)
pm->cpu_hp_io_base = ICH9_CPU_HOTPLUG_IO_BASE;
pm->smi_on_cpuhp =
!!(smi_features & BIT_ULL(ICH9_LPC_SMI_F_CPU_HOTPLUG_BIT));
+ pm->smi_on_cpu_unplug =
+ !!(smi_features & BIT_ULL(ICH9_LPC_SMI_F_CPU_HOT_UNPLUG_BIT));
}
/* The above need not be conditional on machine type because the reset port
--
2.27.0
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCH v2 4/8] tests/acpi: allow expected files change
2020-12-07 14:07 [PATCH v2 0/8] add support for cpu hot-unplug with SMI broadcast enabled Igor Mammedov
` (2 preceding siblings ...)
2020-12-07 14:07 ` [PATCH v2 3/8] x86: acpi: introduce AcpiPmInfo::smi_on_cpu_unplug Igor Mammedov
@ 2020-12-07 14:07 ` Igor Mammedov
2020-12-07 14:07 ` [PATCH v2 5/8] x86: acpi: let the firmware handle pending "CPU remove" events in SMM Igor Mammedov
` (3 subsequent siblings)
7 siblings, 0 replies; 9+ messages in thread
From: Igor Mammedov @ 2020-12-07 14:07 UTC (permalink / raw)
To: qemu-devel; +Cc: lersek, ankur.a.arora, mst
Change that will be introduced by following patch:
@@ -557,6 +557,7 @@ DefinitionBlock ("", "DSDT", 1, "BOCHS ", "BXPCDSDT", 0x00000001)
CINS, 1,
CRMV, 1,
CEJ0, 1,
+ CEJF, 1,
Offset (0x05),
CCMD, 8
}
Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
tests/qtest/bios-tables-test-allowed-diff.h | 21 +++++++++++++++++++++
1 file changed, 21 insertions(+)
diff --git a/tests/qtest/bios-tables-test-allowed-diff.h b/tests/qtest/bios-tables-test-allowed-diff.h
index dfb8523c8b..cc75f3fc46 100644
--- a/tests/qtest/bios-tables-test-allowed-diff.h
+++ b/tests/qtest/bios-tables-test-allowed-diff.h
@@ -1 +1,22 @@
/* List of comma-separated changed AML files to ignore */
+"tests/data/acpi/pc/DSDT",
+"tests/data/acpi/q35/DSDT",
+"tests/data/acpi/q35/DSDT.tis",
+"tests/data/acpi/q35/DSDT.bridge",
+"tests/data/acpi/q35/DSDT.mmio64",
+"tests/data/acpi/q35/DSDT.ipmibt",
+"tests/data/acpi/q35/DSDT.cphp",
+"tests/data/acpi/q35/DSDT.memhp",
+"tests/data/acpi/q35/DSDT.numamem",
+"tests/data/acpi/q35/DSDT.dimmpxm",
+"tests/data/acpi/q35/DSDT.acpihmat",
+"tests/data/acpi/pc/DSDT.bridge",
+"tests/data/acpi/pc/DSDT.ipmikcs",
+"tests/data/acpi/pc/DSDT.cphp",
+"tests/data/acpi/pc/DSDT.memhp",
+"tests/data/acpi/pc/DSDT.numamem",
+"tests/data/acpi/pc/DSDT.dimmpxm",
+"tests/data/acpi/pc/DSDT.acpihmat",
+"tests/data/acpi/pc/DSDT.roothp",
+"tests/data/acpi/pc/DSDT.hpbridge",
+"tests/data/acpi/pc/DSDT.hpbrroot",
--
2.27.0
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCH v2 5/8] x86: acpi: let the firmware handle pending "CPU remove" events in SMM
2020-12-07 14:07 [PATCH v2 0/8] add support for cpu hot-unplug with SMI broadcast enabled Igor Mammedov
` (3 preceding siblings ...)
2020-12-07 14:07 ` [PATCH v2 4/8] tests/acpi: allow expected files change Igor Mammedov
@ 2020-12-07 14:07 ` Igor Mammedov
2020-12-07 14:07 ` [PATCH v2 6/8] tests/acpi: update expected files Igor Mammedov
` (2 subsequent siblings)
7 siblings, 0 replies; 9+ messages in thread
From: Igor Mammedov @ 2020-12-07 14:07 UTC (permalink / raw)
To: qemu-devel; +Cc: lersek, ankur.a.arora, mst
if firmware and QEMU negotiated CPU hotunplug support, generate
_EJ0 method so that it will mark CPU for removal by firmware and
pass control to it by triggering SMI.
Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
v2:
- drop reserved bit before CPU_FW_EJECT_EVENT field, otherwise
AML will point to bit #5 instead on intended bit #4
(Ankur Arora <ankur.a.arora@oracle.com>)
---
include/hw/acpi/cpu.h | 1 +
hw/acpi/cpu.c | 14 ++++++++++++--
hw/i386/acpi-build.c | 1 +
3 files changed, 14 insertions(+), 2 deletions(-)
diff --git a/include/hw/acpi/cpu.h b/include/hw/acpi/cpu.h
index d71edde456..999caaf510 100644
--- a/include/hw/acpi/cpu.h
+++ b/include/hw/acpi/cpu.h
@@ -51,6 +51,7 @@ void cpu_hotplug_hw_init(MemoryRegion *as, Object *owner,
typedef struct CPUHotplugFeatures {
bool acpi_1_compatible;
bool has_legacy_cphp;
+ bool fw_unplugs_cpu;
const char *smi_path;
} CPUHotplugFeatures;
diff --git a/hw/acpi/cpu.c b/hw/acpi/cpu.c
index 1293204438..6350caa765 100644
--- a/hw/acpi/cpu.c
+++ b/hw/acpi/cpu.c
@@ -342,6 +342,7 @@ const VMStateDescription vmstate_cpu_hotplug = {
#define CPU_INSERT_EVENT "CINS"
#define CPU_REMOVE_EVENT "CRMV"
#define CPU_EJECT_EVENT "CEJ0"
+#define CPU_FW_EJECT_EVENT "CEJF"
void build_cpus_aml(Aml *table, MachineState *machine, CPUHotplugFeatures opts,
hwaddr io_base,
@@ -394,7 +395,9 @@ void build_cpus_aml(Aml *table, MachineState *machine, CPUHotplugFeatures opts,
aml_append(field, aml_named_field(CPU_REMOVE_EVENT, 1));
/* initiates device eject, write only */
aml_append(field, aml_named_field(CPU_EJECT_EVENT, 1));
- aml_append(field, aml_reserved_field(4));
+ /* tell firmware to do device eject, write only */
+ aml_append(field, aml_named_field(CPU_FW_EJECT_EVENT, 1));
+ aml_append(field, aml_reserved_field(3));
aml_append(field, aml_named_field(CPU_COMMAND, 8));
aml_append(cpu_ctrl_dev, field);
@@ -429,6 +432,7 @@ void build_cpus_aml(Aml *table, MachineState *machine, CPUHotplugFeatures opts,
Aml *ins_evt = aml_name("%s.%s", cphp_res_path, CPU_INSERT_EVENT);
Aml *rm_evt = aml_name("%s.%s", cphp_res_path, CPU_REMOVE_EVENT);
Aml *ej_evt = aml_name("%s.%s", cphp_res_path, CPU_EJECT_EVENT);
+ Aml *fw_ej_evt = aml_name("%s.%s", cphp_res_path, CPU_FW_EJECT_EVENT);
aml_append(cpus_dev, aml_name_decl("_HID", aml_string("ACPI0010")));
aml_append(cpus_dev, aml_name_decl("_CID", aml_eisaid("PNP0A05")));
@@ -471,7 +475,13 @@ void build_cpus_aml(Aml *table, MachineState *machine, CPUHotplugFeatures opts,
aml_append(method, aml_acquire(ctrl_lock, 0xFFFF));
aml_append(method, aml_store(idx, cpu_selector));
- aml_append(method, aml_store(one, ej_evt));
+ if (opts.fw_unplugs_cpu) {
+ aml_append(method, aml_store(one, fw_ej_evt));
+ aml_append(method, aml_store(aml_int(OVMF_CPUHP_SMI_CMD),
+ aml_name("%s", opts.smi_path)));
+ } else {
+ aml_append(method, aml_store(one, ej_evt));
+ }
aml_append(method, aml_release(ctrl_lock));
}
aml_append(cpus_dev, method);
diff --git a/hw/i386/acpi-build.c b/hw/i386/acpi-build.c
index 9036e5594c..475e76f514 100644
--- a/hw/i386/acpi-build.c
+++ b/hw/i386/acpi-build.c
@@ -1586,6 +1586,7 @@ build_dsdt(GArray *table_data, BIOSLinker *linker,
CPUHotplugFeatures opts = {
.acpi_1_compatible = true, .has_legacy_cphp = true,
.smi_path = pm->smi_on_cpuhp ? "\\_SB.PCI0.SMI0.SMIC" : NULL,
+ .fw_unplugs_cpu = pm->smi_on_cpu_unplug,
};
build_cpus_aml(dsdt, machine, opts, pm->cpu_hp_io_base,
"\\_SB.PCI0", "\\_GPE._E02");
--
2.27.0
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCH v2 6/8] tests/acpi: update expected files
2020-12-07 14:07 [PATCH v2 0/8] add support for cpu hot-unplug with SMI broadcast enabled Igor Mammedov
` (4 preceding siblings ...)
2020-12-07 14:07 ` [PATCH v2 5/8] x86: acpi: let the firmware handle pending "CPU remove" events in SMM Igor Mammedov
@ 2020-12-07 14:07 ` Igor Mammedov
2020-12-07 14:07 ` [PATCH v2 7/8] x86: ich9: factor out "guest_cpu_hotplug_features" Igor Mammedov
2020-12-07 14:07 ` [PATCH v2 8/8] x86: ich9: let firmware negotiate 'CPU hot-unplug with SMI' feature Igor Mammedov
7 siblings, 0 replies; 9+ messages in thread
From: Igor Mammedov @ 2020-12-07 14:07 UTC (permalink / raw)
To: qemu-devel; +Cc: lersek, ankur.a.arora, mst
update expected files with following change:
@@ -557,6 +557,7 @@ DefinitionBlock ("", "DSDT", 1, "BOCHS ", "BXPCDSDT", 0x00000001)
CINS, 1,
CRMV, 1,
CEJ0, 1,
+ CEJF, 1,
Offset (0x05),
CCMD, 8
}
Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
tests/qtest/bios-tables-test-allowed-diff.h | 21 --------------------
tests/data/acpi/pc/DSDT | Bin 5060 -> 5065 bytes
tests/data/acpi/pc/DSDT.acpihmat | Bin 6385 -> 6390 bytes
tests/data/acpi/pc/DSDT.bridge | Bin 6919 -> 6924 bytes
tests/data/acpi/pc/DSDT.cphp | Bin 5524 -> 5529 bytes
tests/data/acpi/pc/DSDT.dimmpxm | Bin 6714 -> 6719 bytes
tests/data/acpi/pc/DSDT.hpbridge | Bin 5021 -> 5026 bytes
tests/data/acpi/pc/DSDT.hpbrroot | Bin 3079 -> 3084 bytes
tests/data/acpi/pc/DSDT.ipmikcs | Bin 5132 -> 5137 bytes
tests/data/acpi/pc/DSDT.memhp | Bin 6419 -> 6424 bytes
tests/data/acpi/pc/DSDT.numamem | Bin 5066 -> 5071 bytes
tests/data/acpi/pc/DSDT.roothp | Bin 5256 -> 5261 bytes
tests/data/acpi/q35/DSDT | Bin 7796 -> 7801 bytes
tests/data/acpi/q35/DSDT.acpihmat | Bin 9121 -> 9126 bytes
tests/data/acpi/q35/DSDT.bridge | Bin 7814 -> 7819 bytes
tests/data/acpi/q35/DSDT.cphp | Bin 8260 -> 8265 bytes
tests/data/acpi/q35/DSDT.dimmpxm | Bin 9450 -> 9455 bytes
tests/data/acpi/q35/DSDT.ipmibt | Bin 7871 -> 7876 bytes
tests/data/acpi/q35/DSDT.memhp | Bin 9155 -> 9160 bytes
tests/data/acpi/q35/DSDT.mmio64 | Bin 8927 -> 8932 bytes
tests/data/acpi/q35/DSDT.numamem | Bin 7802 -> 7807 bytes
tests/data/acpi/q35/DSDT.tis | Bin 8402 -> 8407 bytes
22 files changed, 21 deletions(-)
diff --git a/tests/qtest/bios-tables-test-allowed-diff.h b/tests/qtest/bios-tables-test-allowed-diff.h
index cc75f3fc46..dfb8523c8b 100644
--- a/tests/qtest/bios-tables-test-allowed-diff.h
+++ b/tests/qtest/bios-tables-test-allowed-diff.h
@@ -1,22 +1 @@
/* List of comma-separated changed AML files to ignore */
-"tests/data/acpi/pc/DSDT",
-"tests/data/acpi/q35/DSDT",
-"tests/data/acpi/q35/DSDT.tis",
-"tests/data/acpi/q35/DSDT.bridge",
-"tests/data/acpi/q35/DSDT.mmio64",
-"tests/data/acpi/q35/DSDT.ipmibt",
-"tests/data/acpi/q35/DSDT.cphp",
-"tests/data/acpi/q35/DSDT.memhp",
-"tests/data/acpi/q35/DSDT.numamem",
-"tests/data/acpi/q35/DSDT.dimmpxm",
-"tests/data/acpi/q35/DSDT.acpihmat",
-"tests/data/acpi/pc/DSDT.bridge",
-"tests/data/acpi/pc/DSDT.ipmikcs",
-"tests/data/acpi/pc/DSDT.cphp",
-"tests/data/acpi/pc/DSDT.memhp",
-"tests/data/acpi/pc/DSDT.numamem",
-"tests/data/acpi/pc/DSDT.dimmpxm",
-"tests/data/acpi/pc/DSDT.acpihmat",
-"tests/data/acpi/pc/DSDT.roothp",
-"tests/data/acpi/pc/DSDT.hpbridge",
-"tests/data/acpi/pc/DSDT.hpbrroot",
diff --git a/tests/data/acpi/pc/DSDT b/tests/data/acpi/pc/DSDT
index 4ca46e5a2bdb1dfab79dd8630aeeb9a386d8b30e..f6173df1d598767a79aa34ad7585ad7d45c5d4f3 100644
GIT binary patch
delta 74
zcmX@2eo~#wCD<k8q%Z>m<ARM`Ti7`L?c#%-;-i~9CLd>uQ`QIw3J!5(P;d@#^<#AQ
b^b2Nm4)P6SbawSJ01<AC49uII*&BHPG~N^c
delta 69
zcmX@9eng$iCD<k8h%f^K<C%?ITi7_g?Bau+;-j0KCm&~vlT!`|3J!5(P;d@#^<#AQ
Z^b2Nm4)P6SbawSJU}Rv~?7`m10|3|D68``I
diff --git a/tests/data/acpi/pc/DSDT.acpihmat b/tests/data/acpi/pc/DSDT.acpihmat
index 35a74bce8cc152ecb615cb38c4b7f63c7c7d3ab3..67f3f7249eaaa9404ebf0f2d0a324b8c8e3bd445 100644
GIT binary patch
delta 74
zcmexp_|1^ZCD<k8n*;*`W9&w*Eo_{AF7d%m@zG5llaI5-DQg4-1&25?C^!eW`Y}3t
b`UNvO2l<9EI=gxqfCx862IkGq?CS&pQiv3j
delta 69
zcmexn_|cHdCD<k8qXYv3W9LS$Eo_{gF7d%m@zG7rlaI5-$tec}1&25?C^!eW`Y}3t
Z`UNvO2l<9EI=gxqFfy=g_F!Kp2mte(6O#Y{
diff --git a/tests/data/acpi/pc/DSDT.bridge b/tests/data/acpi/pc/DSDT.bridge
index 803d7a8e839ea8b7ac33c4490459ddaede584269..643390f4c4138b37fc481656d3f555d0eeedcb02 100644
GIT binary patch
delta 74
zcmZoS>oMbU33dtLk!E0Ee6f*h3md1uU3{=pd~}n?<l}5{${GPd!6A+e3eEwpevHnZ
be!+~+LB3&(&aPetAi|B2fqAnt`w?LP{pAyY
delta 69
zcmeA%Yd7O^33dr#mu6sK6xqnNg^kn8E<V^PKDx<y@^Q8}Ipu($;1EX!1?K=)KSpOy
YzhFk^Am1=XXIC!+Mh2G69_&Yi0d3zAfB*mh
diff --git a/tests/data/acpi/pc/DSDT.cphp b/tests/data/acpi/pc/DSDT.cphp
index 8bab2f506409f2b025a63d8b91c7bfdaa931e626..1ddcf7d8812f5d8d4d38fe7e7b35fd5885806046 100644
GIT binary patch
delta 74
zcmbQDJyV;@CD<iorYHjgBg;mvEo_|r(ec4f@zG5llaI5-DQg4-1&25?C^!eW`Y}3t
b`UNvO2l<9EI=gxqfCx862IkGq?16j$@e&fu
delta 69
zcmbQKJw=<#CD<ioiYNmEqrpb5Eo_`#(ec4f@zG7rlaI5-$tec}1&25?C^!eW`Y}3t
Z`UNvO2l<9EI=gxqFfy=g_Fxa>0|1#g5zGJp
diff --git a/tests/data/acpi/pc/DSDT.dimmpxm b/tests/data/acpi/pc/DSDT.dimmpxm
index e015b4594c96a6e0f34c0668e3383b9a91dff38e..c44385cc01879324738ffb7f997b8cdd762cbf97 100644
GIT binary patch
delta 74
zcmdmGvfqTuCD<jzUW$Q%@$E*gEo__~0rA03@zG5llaI5-DQg4-1&25?C^!eW`Y}3t
b`UNvO2l<9EI=gxqfCx862IkGq?B9g|DsB{3
delta 69
zcmdmQvde_aCD<jzN{WGjQF0^K7B)`jfcRji_~<6*$;a8^<dg$~f<qh`6r2NG{TQ7+
Z{el^tgM7mnon5^Q7#UbLd$4~O0sxmK5>@~J
diff --git a/tests/data/acpi/pc/DSDT.hpbridge b/tests/data/acpi/pc/DSDT.hpbridge
index 56032bcf1ba4e251f16c9028429826090531efdd..4ecf1eb13bf49499f729b53a6d0114672a76e28d 100644
GIT binary patch
delta 74
zcmbQMzDS+RCD<iokuU=T<IRm+Ti7`L?c#%-;-i~9CLd>uQ`QIw3J!5(P;d@#^<#AQ
b^b2Nm4)P6SbawSJ01<AC49uII*`s&>A;%M(
delta 69
zcmZ3aK3AQ~CD<iot}p`wBkM-4Eo_`#cJaYZ@zG7rlaI5-$tec}1&25?C^!eW`Y}3t
Z`UNvO2l<9EI=gxqFfy=g_F#|V0RWEi5u5-3
diff --git a/tests/data/acpi/pc/DSDT.hpbrroot b/tests/data/acpi/pc/DSDT.hpbrroot
index 36b0a8f2fbf93df47b66107125cd3ce01e017b92..a3046226ec1dcb234b726029b3790dfedb3b9221 100644
GIT binary patch
delta 52
zcmZpd=#k)Z33dtL;bCB4Y~0AD&Bp0(7a!~tAKm0J*^VuaQDgF4HfeTeS1&h42IkGX
H*nC+5ORx;6
delta 47
zcmeB?XqVt}33dr#=V4%AT)UA=n~l@UE<V^PKDx<yvK?C-qw?grY|=~&ESvYU`LY54
D6B7%l
diff --git a/tests/data/acpi/pc/DSDT.ipmikcs b/tests/data/acpi/pc/DSDT.ipmikcs
index ca6630e39f60ebd5c056f57c4c03fdb9d5467577..f1638c5d079a9442c09390426a913010df6efd8d 100644
GIT binary patch
delta 52
zcmeCtn5e<!66_KpD8j(NXuOf@4;!byU3{=pd~}n?WPbKIMvcjN?9%Mcu3m1849uIm
H*&BHPU-S(V
delta 47
zcmbQJ(WAlT66_MfBf`MI7{8J04;!bKU3{=pd~}oZWPbKIM&-$Q?9xmOESo2=H}U`g
DC4meR
diff --git a/tests/data/acpi/pc/DSDT.memhp b/tests/data/acpi/pc/DSDT.memhp
index 43f4e114e2cc48c68c35af47303fa87c9255db40..4c19e45e66918c61674785c99e4474e58866f125 100644
GIT binary patch
delta 74
zcmbPiG{cC?CD<iILXv@japFd<Eo_{w_VK|^@zG5llaI5-DQg4-1&25?C^!eW`Y}3t
b`UNvO2l<9EI=gxqfCx862IkGq>=y(9?$i@R
delta 69
zcmbPXG}(yDCD<iISdxK(aqmX1Eo__)_VK|^@zG7rlaI5-$tec}1&25?C^!eW`Y}3t
Z`UNvO2l<9EI=gxqFfy=g_F%st2mqHX5<~z1
diff --git a/tests/data/acpi/pc/DSDT.numamem b/tests/data/acpi/pc/DSDT.numamem
index ba8f7e6c33f9eb0f7a080144fcb4a27d36aa04ae..40cfd933259af05ac2aee07fca32f22122255211 100644
GIT binary patch
delta 74
zcmX@5eqNo+CD<k8yf6a;qt`~REo_{w_VK|^@zG5llaI5-DQg4-1&25?C^!eW`Y}3t
b`UNvO2l<9EI=gxqfCx862IkGq?Cm@NBh3@I
delta 69
zcmX@FeoCFoCD<k8lrRGWW7$ToEo__)_VK|^@zG7rlaI5-$tec}1&25?C^!eW`Y}3t
Z`UNvO2l<9EI=gxqFfy=g_F!-40RYHM61V^W
diff --git a/tests/data/acpi/pc/DSDT.roothp b/tests/data/acpi/pc/DSDT.roothp
index 18caa0765fc10adb29e01717390ead6c63cd0f3c..078fc8031b479cc77b6527a2b7b4bd576b6e6028 100644
GIT binary patch
delta 74
zcmeCs?A7FQ33dtT6=7gtJhqW*3md1uU3{=pd~}n?<l}5{${GPd!6A+e3eEwpevHnZ
be!+~+LB3&(&aPetAi|B2fqAntyDKjM4LcJ%
delta 69
zcmeCx?9k+L33dtT5Mf|o{Irp43md1GU3{=pd~}oZ<l}5{a>@Zg!6A+e3eEwpevHnZ
Ye!+~+LB3&(&aPetj0`NBJ=k4&0kY;2I{*Lx
diff --git a/tests/data/acpi/q35/DSDT b/tests/data/acpi/q35/DSDT
index e7414e78563372fca4d2aab9d16c58c0ff8468f4..d25cd7072932886d6967f4023faac1e1fa6e836c 100644
GIT binary patch
delta 74
zcmexj^V5dQCD<jTQjURv@!LkO2@;(CcJaYZ@zG5llNU?GDQg4-1&25?C^!eW`Y}3t
b`UNvO2l<9EI=gxqfCx862IkH3lA){sR<9H>
delta 69
zcmexq^TmeCCD<jTM2>-hQE4OB1PM+ryZB(I_~<6*$%`f8<dg$~f<qh`6r2NG{TQ7+
Z{el^tgM7mnon5^Q7#UbLt4M~j0sz2T5-|V(
diff --git a/tests/data/acpi/q35/DSDT.acpihmat b/tests/data/acpi/q35/DSDT.acpihmat
index 88434da261212b15264c892976775acd5c954aea..722e06af83abcde203a2b96a8ec81fd3bab9fc98 100644
GIT binary patch
delta 74
zcmZ4JzRaD=CD<ionKA<d<K~TA6C^nOT;hYB;-i~9CNGwVQ`QIw3J!5(P;d@#^<#AQ
b^b2Nm4)P6SbawSJ01<AC49uJ5C7ZYaE9n!*
delta 69
zcmZ4HzR;b^CD<iop)vyl<Nb|X6C^l2UE+hC;-j0KCoh(WlT!`|3J!5(P;d@#^<#AQ
Z^b2Nm4)P6SbawSJU}Rv~tRmUO1pv>W62|}l
diff --git a/tests/data/acpi/q35/DSDT.bridge b/tests/data/acpi/q35/DSDT.bridge
index 118476ff6101e11d6b1f2d3399241d7fd1a6f634..06bac139d668ddfc7914e258b471a303c9dbd192 100644
GIT binary patch
delta 74
zcmZp(?Y8A|33dtTmSbRG?BB>WL4woYE<V^PKDx<c@?wcNWsQKK;1EX!1?K=)KSpOy
bzhFk^Am1=XXIC!+5aGtiz`R*rGMyCw1r-w%
delta 69
zcmeCSZL{Ta33dr-lVf0D+`W-&f&{0RU3{=pd~}oZ<i!$ka>@Zg!6A+e3eEwpevHnZ
Ye!+~+LB3&(&aPetj0`NBRV33{0jsML6aWAK
diff --git a/tests/data/acpi/q35/DSDT.cphp b/tests/data/acpi/q35/DSDT.cphp
index 69c5edf620529e995461ccba63b76a083f25b2b6..2b933ac482e6883efccbd7d6c96089602f2c0b4d 100644
GIT binary patch
delta 74
zcmX@&aMFRxCD<jzQ-OhjF=`{%1PM<6==fl#_~<5&$%`f8lr;i^f<qh`6r2NG{TQ7+
b{el^tgM7mnon5^QK!h731M_BiNmX_L67mxM
delta 69
zcmX@<aKwSjCD<jzMS+2Vv27#Q1PM;B==fl#_~<6*$%`f8<dg$~f<qh`6r2NG{TQ7+
Z{el^tgM7mnon5^Q7#UbLt4OM{0|2<T5&i%G
diff --git a/tests/data/acpi/q35/DSDT.dimmpxm b/tests/data/acpi/q35/DSDT.dimmpxm
index af41acba6e0117191ad8495a30ded7b0acc4d2ca..bd8f8305b028ef20f9b6d1a0c69ac428d027e3d1 100644
GIT binary patch
delta 74
zcmaFm`QDSuCD<k8y$S;ZquNHU2@;$h0rA03@zG5llNU?GDQg4-1&25?C^!eW`Y}3t
b`UNvO2l<9EI=gxqfCx862IkH3lBc-=N;4E{
delta 69
zcmaFw`O1^aCD<k8l?np`W6(yf2@;&n0rA03@zG7rlNU?G$tec}1&25?C^!eW`Y}3t
Z`UNvO2l<9EI=gxqFfy=gR*^i-4FK#d6KVhe
diff --git a/tests/data/acpi/q35/DSDT.ipmibt b/tests/data/acpi/q35/DSDT.ipmibt
index a650c3041ab9d6688eda843a6a2ab418e1a7ce9b..a8f868e23c25688ab1c0371016c071f23e9d732f 100644
GIT binary patch
delta 52
zcmdmQd&HK@CD<k8h#Uh0qt-^Q+Y+4qcJaYZ@zG5llix|iF=|Zqm6T?8cJ*>&WMJN$
IB^k;J0IQk~=Kufz
delta 47
zcmX?NyWf_}CD<iozZ?StW7tNn+Y+2!cJaYZ@zG7rlix|iF)B~?m6T>;VA-568OjO(
DX1NXL
diff --git a/tests/data/acpi/q35/DSDT.memhp b/tests/data/acpi/q35/DSDT.memhp
index 85598ca3f68f437e8d5048e2cb9815f20b332152..9a802e4c67022386442976d5cb997ea3fc57b58f 100644
GIT binary patch
delta 74
zcmX@?e!`v0CD<k8gfasI<BN@46C^lY?c;-;;-i~9CNGwVQ`QIw3J!5(P;d@#^<#AQ
c^b2Nm4)P6SbawSJ01<AC49uJ5C6{mk08y|Mb^rhX
delta 69
zcmX@%e%PJMCD<k8urdP!qsT_C2@;$R_VK|^@zG7rlNU?G$tec}1&25?C^!eW`Y}3t
Z`UNvO2l<9EI=gxqFfy=gR*_u71pvFI5_SLp
diff --git a/tests/data/acpi/q35/DSDT.mmio64 b/tests/data/acpi/q35/DSDT.mmio64
index 092fdc32628f5a145b510c2a46de8b02222b1951..948c2dc7264c31932b490ca00691a7c4d9aefdb0 100644
GIT binary patch
delta 74
zcmccb`oxvXCD<k8i4p??<J^s06C^lY?c;-;;-i~9CNGwVQ`QIw3J!5(P;d@#^<#AQ
c^b2Nm4)P6SbawSJ01<AC49uJ5B@b`{09FSSl>h($
delta 69
zcmaFjdf%1HCD<k8z7hii<H?O&6C^kt?Bj!-;-j0KCoh(WlT!`|3J!5(P;d@#^<#AQ
Z^b2Nm4)P6SbawSJU}Rv~tRi`U69D$<6O{k}
diff --git a/tests/data/acpi/q35/DSDT.numamem b/tests/data/acpi/q35/DSDT.numamem
index 899946255b9111e077e06c5f78be860e863911b9..44ec1b0af400da6d298284aa959aa38add7e6dd5 100644
GIT binary patch
delta 74
zcmexm^WTQcCD<jTUXFo*aluBe2@;&H_VK|^@zG5llNU?GDQg4-1&25?C^!eW`Y}3t
b`UNvO2l<9EI=gxqfCx862IkH3lF_UHMV=Gt
delta 69
zcmexw^UH?ICD<jTN{)en@ytf92@;$R_VK|^@zG7rlNU?G$tec}1&25?C^!eW`Y}3t
Z`UNvO2l<9EI=gxqFfy=gR*{Tm1pw#D66yc|
diff --git a/tests/data/acpi/q35/DSDT.tis b/tests/data/acpi/q35/DSDT.tis
index 08802fbd12eae6ad99f03a8db9a0bc7f95e77cb4..30da3ec27958881801dacc954a343321ba26a2ae 100644
GIT binary patch
delta 74
zcmccQc-@i9CD<k8x&i|O<B5%26C^nO?c#%-;-i~9CNGwVQ`QIw3J!5(P;d@#^<#AQ
c^b2Nm4)P6SbawSJ01<AC49uJ5B{#DJ090=ji2wiq
delta 69
zcmccac*&8=CD<k8k^%z*<Cl$G6C^mj?Bau+;-j0KCoh(WlT!`|3J!5(P;d@#^<#AQ
Z^b2Nm4)P6SbawSJU}Rv~tRlIY9RT%06Nvx-
--
2.27.0
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCH v2 7/8] x86: ich9: factor out "guest_cpu_hotplug_features"
2020-12-07 14:07 [PATCH v2 0/8] add support for cpu hot-unplug with SMI broadcast enabled Igor Mammedov
` (5 preceding siblings ...)
2020-12-07 14:07 ` [PATCH v2 6/8] tests/acpi: update expected files Igor Mammedov
@ 2020-12-07 14:07 ` Igor Mammedov
2020-12-07 14:07 ` [PATCH v2 8/8] x86: ich9: let firmware negotiate 'CPU hot-unplug with SMI' feature Igor Mammedov
7 siblings, 0 replies; 9+ messages in thread
From: Igor Mammedov @ 2020-12-07 14:07 UTC (permalink / raw)
To: qemu-devel; +Cc: lersek, ankur.a.arora, mst
it will be reused by next patch to check validity of unplug
feature.
Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
hw/isa/lpc_ich9.c | 8 ++++++--
1 file changed, 6 insertions(+), 2 deletions(-)
diff --git a/hw/isa/lpc_ich9.c b/hw/isa/lpc_ich9.c
index 087a18d04d..da80430144 100644
--- a/hw/isa/lpc_ich9.c
+++ b/hw/isa/lpc_ich9.c
@@ -366,6 +366,7 @@ static void smi_features_ok_callback(void *opaque)
{
ICH9LPCState *lpc = opaque;
uint64_t guest_features;
+ uint64_t guest_cpu_hotplug_features;
if (lpc->smi_features_ok) {
/* negotiation already complete, features locked */
@@ -378,9 +379,12 @@ static void smi_features_ok_callback(void *opaque)
/* guest requests invalid features, leave @features_ok at zero */
return;
}
+
+ guest_cpu_hotplug_features = guest_features &
+ (BIT_ULL(ICH9_LPC_SMI_F_CPU_HOTPLUG_BIT) |
+ BIT_ULL(ICH9_LPC_SMI_F_CPU_HOT_UNPLUG_BIT));
if (!(guest_features & BIT_ULL(ICH9_LPC_SMI_F_BROADCAST_BIT)) &&
- guest_features & (BIT_ULL(ICH9_LPC_SMI_F_CPU_HOTPLUG_BIT) |
- BIT_ULL(ICH9_LPC_SMI_F_CPU_HOT_UNPLUG_BIT))) {
+ guest_cpu_hotplug_features) {
/*
* cpu hot-[un]plug with SMI requires SMI broadcast,
* leave @features_ok at zero
--
2.27.0
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCH v2 8/8] x86: ich9: let firmware negotiate 'CPU hot-unplug with SMI' feature
2020-12-07 14:07 [PATCH v2 0/8] add support for cpu hot-unplug with SMI broadcast enabled Igor Mammedov
` (6 preceding siblings ...)
2020-12-07 14:07 ` [PATCH v2 7/8] x86: ich9: factor out "guest_cpu_hotplug_features" Igor Mammedov
@ 2020-12-07 14:07 ` Igor Mammedov
7 siblings, 0 replies; 9+ messages in thread
From: Igor Mammedov @ 2020-12-07 14:07 UTC (permalink / raw)
To: qemu-devel; +Cc: lersek, ankur.a.arora, mst
Keep CPU hotunplug with SMI disabled on 5.2 and older and enable
it by default on newer machine types.
Signed-off-by: Igor Mammedov <imammedo@redhat.com>
---
v1:
- ensure that unplug can't be enabled without hotplug (Laszlo)
---
hw/i386/pc.c | 4 +++-
hw/isa/lpc_ich9.c | 8 +++++++-
2 files changed, 10 insertions(+), 2 deletions(-)
diff --git a/hw/i386/pc.c b/hw/i386/pc.c
index 781523684c..6476d8d853 100644
--- a/hw/i386/pc.c
+++ b/hw/i386/pc.c
@@ -97,7 +97,9 @@
#include "trace.h"
#include CONFIG_DEVICES
-GlobalProperty pc_compat_5_2[] = {};
+GlobalProperty pc_compat_5_2[] = {
+ { "ICH9-LPC", "x-smi-cpu-hotunplug", "off" },
+};
const size_t pc_compat_5_2_len = G_N_ELEMENTS(pc_compat_5_2);
GlobalProperty pc_compat_5_1[] = {
diff --git a/hw/isa/lpc_ich9.c b/hw/isa/lpc_ich9.c
index da80430144..d3145bf014 100644
--- a/hw/isa/lpc_ich9.c
+++ b/hw/isa/lpc_ich9.c
@@ -392,6 +392,12 @@ static void smi_features_ok_callback(void *opaque)
return;
}
+ if (guest_cpu_hotplug_features ==
+ BIT_ULL(ICH9_LPC_SMI_F_CPU_HOT_UNPLUG_BIT)) {
+ /* cpu hot-unplug is unsupported without cpu-hotplug */
+ return;
+ }
+
/* valid feature subset requested, lock it down, report success */
lpc->smi_negotiated_features = guest_features;
lpc->smi_features_ok = 1;
@@ -774,7 +780,7 @@ static Property ich9_lpc_properties[] = {
DEFINE_PROP_BIT64("x-smi-cpu-hotplug", ICH9LPCState, smi_host_features,
ICH9_LPC_SMI_F_CPU_HOTPLUG_BIT, true),
DEFINE_PROP_BIT64("x-smi-cpu-hotunplug", ICH9LPCState, smi_host_features,
- ICH9_LPC_SMI_F_CPU_HOT_UNPLUG_BIT, false),
+ ICH9_LPC_SMI_F_CPU_HOT_UNPLUG_BIT, true),
DEFINE_PROP_END_OF_LIST(),
};
--
2.27.0
^ permalink raw reply related [flat|nested] 9+ messages in thread