@@ -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;
}
@@ -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
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(-)