qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Qemu-devel] [RFC 12/42] pc: initialize legacy hotplug only for 2.6 and


From: Igor Mammedov
Subject: [Qemu-devel] [RFC 12/42] pc: initialize legacy hotplug only for 2.6 and older machine types
Date: Mon, 2 May 2016 14:33:21 +0200

on old machine types CPU hotplug was uncondtionally
enabled since it was introduced, consuming IO ports
and providing AML regardles of whether it was actually
in use or not. Keep it so for 2.6 and older machines.

New machine types will have an option to turn CPU
hotplug on if it's needed while by default it stays
disabled not consuming extra RAM/IO resources.

Signed-off-by: Igor Mammedov <address@hidden>
---
 hw/acpi/ich9.c       |  9 ++++++---
 hw/acpi/piix4.c      |  9 ++++++---
 hw/i386/acpi-build.c |  8 +++++++-
 include/hw/compat.h  | 11 ++++++++++-
 4 files changed, 29 insertions(+), 8 deletions(-)

diff --git a/hw/acpi/ich9.c b/hw/acpi/ich9.c
index 1cfe832..b5481d4 100644
--- a/hw/acpi/ich9.c
+++ b/hw/acpi/ich9.c
@@ -273,8 +273,10 @@ void ich9_pm_init(PCIDevice *lpc_pci, ICH9LPCPMRegs *pm,
     pm->powerdown_notifier.notify = pm_powerdown_req;
     qemu_register_powerdown_notifier(&pm->powerdown_notifier);
 
-    legacy_acpi_cpu_hotplug_init(pci_address_space_io(lpc_pci),
-        OBJECT(lpc_pci), &pm->gpe_cpu, ICH9_CPU_HOTPLUG_IO_BASE);
+    if (pm->cpu_hotplug_legacy) {
+        legacy_acpi_cpu_hotplug_init(pci_address_space_io(lpc_pci),
+            OBJECT(lpc_pci), &pm->gpe_cpu, ICH9_CPU_HOTPLUG_IO_BASE);
+    }
 
     if (pm->acpi_memory_hotplug.is_enabled) {
         acpi_memory_hotplug_init(pci_address_space_io(lpc_pci), 
OBJECT(lpc_pci),
@@ -455,7 +457,8 @@ void ich9_pm_device_plug_cb(ICH9LPCPMRegs *pm, DeviceState 
*dev, Error **errp)
         object_dynamic_cast(OBJECT(dev), TYPE_PC_DIMM)) {
         acpi_memory_plug_cb(&pm->acpi_regs, pm->irq, &pm->acpi_memory_hotplug,
                             dev, errp);
-    } else if (object_dynamic_cast(OBJECT(dev), TYPE_CPU)) {
+    } else if (pm->cpu_hotplug_legacy &&
+               object_dynamic_cast(OBJECT(dev), TYPE_CPU)) {
         legacy_acpi_cpu_plug_cb(&pm->acpi_regs, pm->irq,
                                 &pm->gpe_cpu, dev, errp);
     } else {
diff --git a/hw/acpi/piix4.c b/hw/acpi/piix4.c
index 7b5c312..86d68dd 100644
--- a/hw/acpi/piix4.c
+++ b/hw/acpi/piix4.c
@@ -352,7 +352,8 @@ static void piix4_device_plug_cb(HotplugHandler 
*hotplug_dev,
     } else if (object_dynamic_cast(OBJECT(dev), TYPE_PCI_DEVICE)) {
         acpi_pcihp_device_plug_cb(&s->ar, s->irq, &s->acpi_pci_hotplug, dev,
                                   errp);
-    } else if (object_dynamic_cast(OBJECT(dev), TYPE_CPU)) {
+    } else if (s->cpu_hotplug_legacy &&
+               object_dynamic_cast(OBJECT(dev), TYPE_CPU)) {
         legacy_acpi_cpu_plug_cb(&s->ar, s->irq, &s->gpe_cpu, dev, errp);
     } else {
         error_setg(errp, "acpi: device plug request for not supported device"
@@ -571,8 +572,10 @@ static void piix4_acpi_system_hot_add_init(MemoryRegion 
*parent,
     acpi_pcihp_init(OBJECT(s), &s->acpi_pci_hotplug, bus, parent,
                     s->use_acpi_pci_hotplug);
 
-    legacy_acpi_cpu_hotplug_init(parent, OBJECT(s), &s->gpe_cpu,
-                                 PIIX4_CPU_HOTPLUG_IO_BASE);
+    if (s->cpu_hotplug_legacy) {
+        legacy_acpi_cpu_hotplug_init(parent, OBJECT(s), &s->gpe_cpu,
+                                     PIIX4_CPU_HOTPLUG_IO_BASE);
+    }
 
     if (s->acpi_memory_hotplug.is_enabled) {
         acpi_memory_hotplug_init(parent, OBJECT(s), &s->acpi_memory_hotplug);
diff --git a/hw/i386/acpi-build.c b/hw/i386/acpi-build.c
index 4a7eab3..502f1a7 100644
--- a/hw/i386/acpi-build.c
+++ b/hw/i386/acpi-build.c
@@ -93,6 +93,7 @@ typedef struct AcpiPmInfo {
     uint32_t gpe0_blk;
     uint32_t gpe0_blk_len;
     uint32_t io_base;
+    bool legacy_cpu_hp;
     uint16_t cpu_hp_io_base;
     uint16_t mem_hp_io_base;
     uint16_t mem_hp_io_len;
@@ -141,6 +142,9 @@ static void acpi_get_pm_info(AcpiPmInfo *pm)
     }
     assert(obj);
 
+    pm->legacy_cpu_hp = object_property_get_bool(obj, "cpu-hotplug-legacy",
+                                                 NULL);
+
     pm->mem_hp_io_base = ACPI_MEMORY_HOTPLUG_BASE;
     pm->mem_hp_io_len = ACPI_MEMORY_HOTPLUG_IO_LEN;
 
@@ -1933,7 +1937,9 @@ build_dsdt(GArray *table_data, GArray *linker,
         build_q35_pci0_int(dsdt);
     }
 
-    build_legacy_cpu_hotplug_aml(dsdt, machine, pm->cpu_hp_io_base);
+    if (pm->legacy_cpu_hp) {
+        build_legacy_cpu_hotplug_aml(dsdt, machine, pm->cpu_hp_io_base);
+    }
     build_memory_hotplug_aml(dsdt, nr_mem, pm->mem_hp_io_base,
                              pm->mem_hp_io_len);
 
diff --git a/include/hw/compat.h b/include/hw/compat.h
index 636befe..f8c662d 100644
--- a/include/hw/compat.h
+++ b/include/hw/compat.h
@@ -2,7 +2,16 @@
 #define HW_COMPAT_H
 
 #define HW_COMPAT_2_6 \
-    /* empty */
+    {\
+        .driver   = "PIIX4_PM",\
+        .property = "cpu-hotplug-legacy",\
+        .value    = "on",\
+    },\
+    {\
+        .driver   = "ICH9-LPC",\
+        .property = "cpu-hotplug-legacy",\
+        .value    = "on",\
+    },\
 
 #define HW_COMPAT_2_5 \
     {\
-- 
1.8.3.1




reply via email to

[Prev in Thread] Current Thread [Next in Thread]