diff mbox

[RFC,v2,8/8] cpu-hotplug: remove memory regison for cpu hotplug

Message ID 1370488621-6915-9-git-send-email-lig.fnst@cn.fujitsu.com
State New
Headers show

Commit Message

liguang June 6, 2013, 3:17 a.m. UTC
operations of memory regison(PIIX4_PROC_BASE) for cpu hostplug
can be transfered to EC space naturally by adding EC support.

Signed-off-by: liguang <lig.fnst@cn.fujitsu.com>
---
 hw/acpi/piix4.c      |   46 ++++++++++------------------------------------
 hw/i386/pc.c         |   16 ++++++++--------
 include/hw/acpi/ec.h |    5 +++--
 3 files changed, 21 insertions(+), 46 deletions(-)
diff mbox

Patch

diff --git a/hw/acpi/piix4.c b/hw/acpi/piix4.c
index 8c5b39a..44928e3 100644
--- a/hw/acpi/piix4.c
+++ b/hw/acpi/piix4.c
@@ -600,31 +600,6 @@  static const MemoryRegionOps piix4_pci_ops = {
     },
 };
 
-static uint64_t cpu_status_read(void *opaque, hwaddr addr, unsigned int size)
-{
-    PIIX4PMState *s = opaque;
-    CPUStatus *cpus = &s->gpe_cpu;
-    uint64_t val = cpus->sts[addr];
-
-    return val;
-}
-
-static void cpu_status_write(void *opaque, hwaddr addr, uint64_t data,
-                             unsigned int size)
-{
-    /* TODO: implement VCPU removal on guest signal that CPU can be removed */
-}
-
-static const MemoryRegionOps cpu_hotplug_ops = {
-    .read = cpu_status_read,
-    .write = cpu_status_write,
-    .endianness = DEVICE_LITTLE_ENDIAN,
-    .valid = {
-        .min_access_size = 1,
-        .max_access_size = 1,
-    },
-};
-
 static void pm_ec_sci_req(Notifier *n, void *opaque)
 {
     PIIX4PMState *s = container_of(n, PIIX4PMState, ec_sci_notifier);
@@ -653,18 +628,20 @@  static void piix4_cpu_hotplug_req(PIIX4PMState *s, CPUState *cpu,
     cpu_id = k->get_arch_id(CPU(cpu));
     if (action == PLUG) {
         g->sts[cpu_id / 8] |= (1 << (cpu_id % 8));
+        ec_acpi_space_poke(EC_ACPI_SPACE_CPUM + cpu_id/8, 1 << (cpu_id%8));
+        if (qemu_ec_enabled()) {
+            ec_acpi_event(EVENT_CPU_ONLINE);
+        }
     } else {
         g->sts[cpu_id / 8] &= ~(1 << (cpu_id % 8));
+        if (qemu_ec_enabled()) {
+            uint8_t tmp;
+            tmp = ec_acpi_space_peek(EC_ACPI_SPACE_CPUM + cpu_id/8);
+            tmp &= ~(1 << (cpu_id%8));
+            ec_acpi_space_poke(EC_ACPI_SPACE_CPUM + cpu_id/8, tmp);
+        }
     }
     pm_update_sci(s);
-
-    if (qemu_ec_enabled()) {
-        uint8_t cpu_sts = ec_acpi_space_peek(EC_ACPI_SPACE_CPUS);
-
-        ec_acpi_event(EVENT_CPU_ONLINE);
-        ec_acpi_space_poke(EC_ACPI_SPACE_CPUS, 1 << cpu_id | cpu_sts);
-        ec_acpi_space_poke(EC_ACPI_SPACE_CPUN, cpu_id);
-    }
 }
 
 static void piix4_cpu_added_req(Notifier *n, void *opaque)
@@ -701,9 +678,6 @@  static void piix4_acpi_system_hot_add_init(MemoryRegion *parent,
     pci_bus_hotplug(bus, piix4_device_hotplug, &s->dev.qdev);
 
     qemu_for_each_cpu(piix4_init_cpu_status, &s->gpe_cpu);
-    memory_region_init_io(&s->io_cpu, &cpu_hotplug_ops, s, "apci-cpu-hotplug",
-                          PIIX4_PROC_LEN);
-    memory_region_add_subregion(parent, PIIX4_PROC_BASE, &s->io_cpu);
     s->cpu_added_notifier.notify = piix4_cpu_added_req;
     qemu_register_cpu_added_notifier(&s->cpu_added_notifier);
     s->ec_sci_notifier.notify = pm_ec_sci_req;
diff --git a/hw/i386/pc.c b/hw/i386/pc.c
index a239892..8e98705 100644
--- a/hw/i386/pc.c
+++ b/hw/i386/pc.c
@@ -927,14 +927,14 @@  void pc_hot_add_cpu(const int64_t id, Error **errp)
 {
     DeviceState *icc_bridge;
     int64_t apic_id = x86_cpu_apic_id_from_index(id);
-    uint8_t cpu_sts = ec_acpi_space_peek(EC_ACPI_SPACE_CPUS);
+    uint8_t cpu_sts = ec_acpi_space_peek(EC_ACPI_SPACE_CPUM + apic_id/8);
 
     if (cpu_exists(apic_id)) {
-        if (cpu_sts & 1 << id) {
+        if (cpu_sts & 1 << id%8) {
             error_setg(errp, "Unable to add CPU: %" PRIi64
                        ", it already exists", id);
         } else {
-            ec_acpi_space_poke(EC_ACPI_SPACE_CPUS, cpu_sts | 1 << id);
+            ec_acpi_space_poke(EC_ACPI_SPACE_CPUM, cpu_sts | 1 << id%8);
         }
         return;
     }
@@ -945,7 +945,7 @@  void pc_hot_add_cpu(const int64_t id, Error **errp)
         return;
     }
 
-    ec_acpi_space_poke(EC_ACPI_SPACE_CPUS, cpu_sts | 1 << id);
+    ec_acpi_space_poke(EC_ACPI_SPACE_CPUM, cpu_sts | 1 << id%8);
     icc_bridge = DEVICE(object_resolve_path_type("icc-bridge",
                                                  TYPE_ICC_BRIDGE, NULL));
     pc_new_cpu(current_cpu_model, apic_id, icc_bridge, errp);
@@ -953,7 +953,7 @@  void pc_hot_add_cpu(const int64_t id, Error **errp)
 
 void pc_hot_del_cpu(const int64_t id, Error **errp)
 {
-    uint8_t cpu_sts = ec_acpi_space_peek(EC_ACPI_SPACE_CPUS);
+    uint8_t cpu_sts = ec_acpi_space_peek(EC_ACPI_SPACE_CPUM + id/8);
 
     if (id >= max_cpus) {
         error_setg(errp, "Unable to del CPU: %" PRIi64
@@ -961,9 +961,9 @@  void pc_hot_del_cpu(const int64_t id, Error **errp)
         return;
     }
 
-    if (cpu_sts & 1 << id) {
-        ec_acpi_space_poke(EC_ACPI_SPACE_CPUS, cpu_sts & ~(1 << id));
-        ec_acpi_space_poke(EC_ACPI_SPACE_CPUN, id);
+    if (cpu_sts & 1 << id/8) {
+        ec_acpi_space_poke(EC_ACPI_SPACE_CPUM, cpu_sts & ~(1 << id%8));
+        ec_acpi_space_poke(EC_ACPI_SPACE_CPUI, id);
     } else {
         error_setg(errp, "Unable to del CPU: %" PRIi64
                    ", it was not added before.", id);
diff --git a/include/hw/acpi/ec.h b/include/hw/acpi/ec.h
index 276d62a..8109e04 100644
--- a/include/hw/acpi/ec.h
+++ b/include/hw/acpi/ec.h
@@ -26,8 +26,9 @@ 
 #define EVENT_CPU_OFFLINE	0x2
 
 /* index of acpi space*/
-#define EC_ACPI_SPACE_CPUS	1
-#define EC_ACPI_SPACE_CPUN	2
+#define EC_ACPI_SPACE_CCMD	2
+#define EC_ACPI_SPACE_CPUI	3
+#define EC_ACPI_SPACE_CPUM	4
 
 void qemu_register_ec_sci_notifier(Notifier *notifier);
 bool qemu_ec_enabled(void);