diff mbox

[RFC,3/7] ec: add operations for _Qxx events

Message ID 1369792062-14269-4-git-send-email-lig.fnst@cn.fujitsu.com
State New
Headers show

Commit Message

liguang May 29, 2013, 1:47 a.m. UTC
Signed-off-by: liguang <lig.fnst@cn.fujitsu.com>
---
 hw/acpi/ec.c         |   32 ++++++++++++++++++++++++++++----
 include/hw/acpi/ec.h |   10 ++++++++++
 2 files changed, 38 insertions(+), 4 deletions(-)
diff mbox

Patch

diff --git a/hw/acpi/ec.c b/hw/acpi/ec.c
index da8525f..fe82e9c 100644
--- a/hw/acpi/ec.c
+++ b/hw/acpi/ec.c
@@ -22,6 +22,9 @@  typedef struct ECState {
     MemoryRegion io[2];
 } ECState;
 
+static void ec_generate_sci(ECState *);
+static ECState *ecs;
+
 static NotifierList ec_sci_notifiers =
     NOTIFIER_LIST_INITIALIZER(ec_sci_notifiers);
 void qemu_register_ec_sci_notifier(Notifier *notifier)
@@ -44,8 +47,26 @@  void ec_acpi_event(uint8_t evt)
     sci_event = evt;
 }
 
-static void ec_generate_sci(void)
+void ec_acpi_space_poke(uint8_t idx, uint8_t val)
+{
+    if (idx < EC_ACPI_SPACE_SIZE) {
+        ec_acpi_space[idx] = val;
+        ec_generate_sci(ecs);
+    }
+}
+
+uint8_t ec_acpi_space_peek(uint8_t idx)
 {
+    if (idx < EC_ACPI_SPACE_SIZE) {
+        return ec_acpi_space[idx];
+    } else {
+        return 0;
+    }
+}
+
+static void ec_generate_sci(ECState *s)
+{
+    s->status |= EC_ACPI_SCI;
     notifier_list_notify(&ec_sci_notifiers, NULL);
 }
 
@@ -72,12 +93,11 @@  static void acpi_data_write(void *opaque, hwaddr addr, uint64_t val,
             }
             break;
         case EC_ACPI_CMD_QUERY:
-            s->data = sci_event;
         default:
             break;
         }
     }
-    ec_generate_sci();
+    ec_generate_sci(s);
 }
 
 static uint64_t acpi_data_read(void *opaque, hwaddr addr, unsigned size)
@@ -112,13 +132,15 @@  static void acpi_cmd_write(void *opaque, hwaddr addr, uint64_t val,
         is_cmd = true;
         break;
     case EC_ACPI_CMD_QUERY:
+        s->data = sci_event;
+        s->status |= EC_ACPI_OBF;
         is_cmd = true;
     default:
         break;
     }
     if (is_cmd) {
         s->cmd = val & 0xff;
-        ec_generate_sci();
+        ec_generate_sci(s);
         s->status |= EC_ACPI_SCI;
     } else {
         s->cmd = 0;
@@ -165,6 +187,8 @@  static int ec_dev_initfn(ISADevice *dev)
     memory_region_init_io(s->io + 1, &io66_io_ops, s, "ec-acpi-cmd", 1);
     isa_register_ioport(isadev, s->io + 1, 0x66);
 
+    ecs = s;
+
     return 0;
 }
 
diff --git a/include/hw/acpi/ec.h b/include/hw/acpi/ec.h
index 3556acd..276d62a 100644
--- a/include/hw/acpi/ec.h
+++ b/include/hw/acpi/ec.h
@@ -21,9 +21,19 @@ 
 #define EC_ACPI_BURST_DN 0x83
 #define EC_ACPI_CMD_QUERY 0x84
 
+/* event no. */
+#define EVENT_CPU_ONLINE	0x1
+#define EVENT_CPU_OFFLINE	0x2
+
+/* index of acpi space*/
+#define EC_ACPI_SPACE_CPUS	1
+#define EC_ACPI_SPACE_CPUN	2
+
 void qemu_register_ec_sci_notifier(Notifier *notifier);
 bool qemu_ec_enabled(void);
 void ec_dev_init(ISABus *isabus);
 void ec_acpi_event(uint8_t evt);
+void ec_acpi_space_poke(uint8_t idx, uint8_t val);
+uint8_t ec_acpi_space_peek(uint8_t idx);
 
 #endif