Signed-off-by: liguang <lig.f...@cn.fujitsu.com> --- 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