<div dir="ltr"><div><div>Hi.<br><br></div>At least one major bug (noted below), have you tested all of this yet?<br><br></div>MM<br><div><div><div><div class="gmail_extra"><br><br><div class="gmail_quote">On 17 April 2013 09:23, liguang <span dir="ltr"><<a href="mailto:lig.fnst@cn.fujitsu.com" target="_blank">lig.fnst@cn.fujitsu.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">this work implemented Embedded Controller chip emulation<br>
which was defined at ACPI SEPC v5 chapter 12:<br>
"ACPI Embedded Controller Interface Specification"<br>
<br>
commonly Embedded Controller will emulate keyboard,<br>
mouse, handle ACPI defined operations and some<br>
low-speed devices like SMbus.<br>
<br>
Signed-off-by: liguang <<a href="mailto:lig.fnst@cn.fujitsu.com">lig.fnst@cn.fujitsu.com</a>><br>
---<br>
 hw/ec.c |  113 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++<br>
 hw/ec.h |   20 +++++++++++<br>
 2 files changed, 133 insertions(+), 0 deletions(-)<br>
 create mode 100644 hw/ec.c<br>
 create mode 100644 hw/ec.h<br>
<br>
diff --git a/hw/ec.c b/hw/ec.c<br>
new file mode 100644<br>
index 0000000..69c92cf<br>
--- /dev/null<br>
+++ b/hw/ec.c<br>
@@ -0,0 +1,113 @@<br>
+#include "ec.h"<br>
+#include "hw/hw.h"<br>
+#include "hw/isa/isa.h"<br>
+#include "sysemu/sysemu.h"<br>
+<br>
+#define TYPE_EC_DEV<br>
+#define EC_DEV(obj) \<br>
+    OBJECT_CHECK(ECState, (obj), TYPE_EC_DEV)<br>
+<br>
+static char ec_acpi_space[EC_ACPI_SPACE_SIZE] = {0};<br>
+<br>
+typedef struct ECState {<br>
+    ISADevice dev;<br>
+    char cmd;<br>
+    char status;<br>
+    char data;<br>
+    char irq;<br>
+    char buf;<br>
+    MemoryRegion io;<br>
+} ECState;<br>
+<br>
+<br>
+static void io62_write(void *opaque, hwaddr addr, uint64_t val, unsigned size)<br>
+{<br>
+    ECState *s = opaque;<br>
+    char tmp = val & 0xff;<br>
+<br>
+    if (s->status & EC_ACPI_CMD) {<br>
+        s->buf = tmp;<br>
+        s->status &= ~EC_ACPI_CMD;<br>
+    } else {<br>
+        if (tmp < EC_ACPI_SPACE_SIZE) {<br>
+            ec_acpi_space[s->buf] = tmp;<br>
+        }<br>
+    }<br>
+}<br>
+<br>
+static uint64_t io62_read(void *opaque, hwaddr addr, unsigned size)<br>
+{<br>
+    return s->data;<br>
+}<br>
+<br>
+static void io66_write(void *opaque, hwaddr addr, uint64_t val, unsigned size)<br>
+{<br>
+    ECState *s = opaque;<br>
+<br>
+    s->status = EC_ACPI_CMD | EC_ACPI_IBF;<br>
+<br>
+    switch (val & 0xff) {<br>
+    case EC_ACPI_CMD_READ:<br>
+    case EC_ACPI_CMD_WRITE:<br>
+    case EC_ACPI_CMD_BURST_EN:<br>
+        s->statu |= EC_ACPI_BST;<br>
+    case EC_ACPI_CMD_BURST_DN:<br>
+        s->statu &= ~EC_ACPI_BST;<br>
+    case EC_ACPI_CMD_QUERY:<br>
+        s->cmd = val & 0xff;<br>
+    case default:<br>
+        break;<br>
+    }<br>
+}<br></blockquote><div><br>You've missed 'break' here a few times.<br> <br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
+<br>
+static uint64_t io66_read(void *opaque, hwaddr addr, unsigned size)<br>
+{<br>
+    ECState *s = opaque;<br>
+<br>
+    return s->status;<br>
+}<br>
+<br>
+static const MemoryRegionOps io62_io_ops = {<br>
+    .write = io62_write,<br>
+    .read = io62_read,<br>
+    .endianness = DEVICE_NATIVE_ENDIAN,<br>
+    .impl = {<br>
+        .min_access_size = 1,<br>
+        .max_access_size = 1,<br>
+    },<br>
+};<br>
+<br>
+static const MemoryRegionOps io66_io_ops = {<br>
+    .write = io66_write,<br>
+    .read = io66_read,<br>
+    .endianness = DEVICE_NATIVE_ENDIAN,<br>
+    .impl = {<br>
+        .min_access_size = 1,<br>
+        .max_access_size = 1,<br>
+    },<br>
+};<br>
+<br>
+static void ec_realizefn(DeviceState *dev, Error **err)<br>
+{<br>
+    ISADevice *isadev = ISA_DEVICE(dev);<br>
+    ECState *s = EC_DEV(dev);<br>
+<br>
+    isa_init_irq(isadev, &s->irq, 0xb);<br>
+<br>
+    memory_region_init_io(&s->io, &io62_io_ops, NULL, "ec-acpi-data", 1);<br>
+    isa_register_ioport(isadev, &s->io, 0x62);<br>
+<br>
+    memory_region_init_io(&s->io, &io66_io_ops, NULL, "ec-acpi-cmd", 1);<br>
+    isa_register_ioport(isadev, &s->io, 0x66);<br>
+<br>
+    s->status = 0;<br>
+    s->data = 0;<br>
+}<br>
+<br>
+static void ec_class_initfn(ObjectClass *klass, void *data)<br>
+{<br>
+    DeviceClass *dc = DEVICE_CLASS(klass);<br>
+<br>
+    dc->realize = ec_realizefn;<br>
+    dc->no_user = 1;<br>
+}<br>
diff --git a/hw/ec.h b/hw/ec.h<br>
new file mode 100644<br>
index 0000000..110ce04<br>
--- /dev/null<br>
+++ b/hw/ec.h<br>
@@ -0,0 +1,20 @@<br>
+#inndef __EC_H<br>
+#define __EC_H<br>
+<br>
+#define EC_ACPI_SPACE_SIZE 0x80<br>
+<br>
+#define EC_ACPI_CMD_PORT 0x66<br>
+#define EC_ACPI_DATA_PORT 0x62<br>
+<br>
+#define EC_ACPI_OBF 0x1<br>
+#define EC_ACPI_IBF 0x2<br>
+#define EC_ACPI_CMD 0x8<br>
+#define EC_ACPI_BST 0x10<br>
+<br>
+#define EC_ACPI_CMD_READ 0x80<br>
+#define EC_ACPI_CMD_WRITE 0x81<br>
+#define EC_ACPI_BURST_EN 0x82<br>
+#define EC_ACPI_BURST_DN 0x83<br>
+#define EC_ACPI_CMD_QUERY 0x84<br>
+<br>
+#endif<br>
<span class="HOEnZb"><font color="#888888">--<br>
1.7.2.5<br>
<br>
<br>
_______________________________________________<br>
SeaBIOS mailing list<br>
<a href="mailto:SeaBIOS@seabios.org">SeaBIOS@seabios.org</a><br>
<a href="http://www.seabios.org/mailman/listinfo/seabios" target="_blank">http://www.seabios.org/mailman/listinfo/seabios</a><br>
</font></span></blockquote></div><br></div></div></div></div></div>