qemu-devel
[Top][All Lists]
Advanced

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

[Qemu-devel] [PATCH RFC 3/7] ec: add operations for _Qxx events


From: liguang
Subject: [Qemu-devel] [PATCH RFC 3/7] ec: add operations for _Qxx events
Date: Wed, 29 May 2013 09:47:38 +0800

Signed-off-by: liguang <address@hidden>
---
 hw/acpi/ec.c         |   32 ++++++++++++++++++++++++++++----
 include/hw/acpi/ec.h |   10 ++++++++++
 2 files changed, 38 insertions(+), 4 deletions(-)

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
-- 
1.7.2.5




reply via email to

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