qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v2 0/8] add support for cpu hot-unplug with SMI broadcast enabled
@ 2020-12-07 14:07 Igor Mammedov
  2020-12-07 14:07 ` [PATCH v2 1/8] hw: add compat machines for 6.0 Igor Mammedov
                   ` (7 more replies)
  0 siblings, 8 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

Changelog:
 v2:
  - support fw_remove event when excuting CPHP_GET_NEXT_CPU_WITH_EVENT_CMD
  - 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>)

 v1:
  - split one big patch on smaller chunks
  - clear bit #4 in CPU eject
  - drop bit #4 toggle semantics and let it set only to 1 from guest side
  - do not allow unplug without hotplug
  - update expected ACPI tables to let CI pass

It's QEMU side to support CPU hot-unplug when using OVMF as firmware with SMI
broadcast enabled (default). It adds new bit in CPU hotplug hw, to mark CPU
as pending for removal by firmware and passes control to it to perform CPU
eject once it's ready (i.e. forgot and no longer uses that CPU).

Patches 2-7 are preparatory, adding neccesary HW and ACPI bits for the feature
and the last patch enables feature by default since 6.0 machine type.

git tree for testing:
    https://github.com/imammedo/qemu.git ovmf_cpu_unplug_v2

Cornelia Huck (1):
  hw: add compat machines for 6.0

Igor Mammedov (7):
  acpi: cpuhp: introduce 'firmware performs eject' status/control bits
  x86: acpi: introduce AcpiPmInfo::smi_on_cpu_unplug
  tests/acpi: allow expected files change
  x86: acpi: let the firmware handle pending "CPU remove" events in SMM
  tests/acpi: update expected files
  x86: ich9: factor out "guest_cpu_hotplug_features"
  x86: ich9: let firmware negotiate 'CPU hot-unplug with SMI' feature

 include/hw/acpi/cpu.h             |   2 ++
 include/hw/boards.h               |   3 +++
 include/hw/i386/pc.h              |   3 +++
 docs/specs/acpi_cpu_hotplug.txt   |  19 ++++++++++++++-----
 hw/acpi/cpu.c                     |  26 +++++++++++++++++++++++---
 hw/acpi/trace-events              |   2 ++
 hw/arm/virt.c                     |   9 ++++++++-
 hw/core/machine.c                 |   3 +++
 hw/i386/acpi-build.c              |   5 +++++
 hw/i386/pc.c                      |   5 +++++
 hw/i386/pc_piix.c                 |  14 +++++++++++++-
 hw/i386/pc_q35.c                  |  13 ++++++++++++-
 hw/isa/lpc_ich9.c                 |  16 +++++++++++++---
 hw/ppc/spapr.c                    |  15 +++++++++++++--
 hw/s390x/s390-virtio-ccw.c        |  14 +++++++++++++-
 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
 36 files changed, 132 insertions(+), 17 deletions(-)

-- 
2.27.0



^ permalink raw reply	[flat|nested] 9+ messages in thread

* [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

end of thread, other threads:[~2020-12-07 14:18 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
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 ` [PATCH v2 3/8] x86: acpi: introduce AcpiPmInfo::smi_on_cpu_unplug Igor Mammedov
2020-12-07 14:07 ` [PATCH v2 4/8] tests/acpi: allow expected files change 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
2020-12-07 14:07 ` [PATCH v2 6/8] tests/acpi: update expected files 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

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).