summaryrefslogtreecommitdiffstats
path: root/src/ec/acpi
diff options
context:
space:
mode:
authorBill XIE <persmule@gmail.com>2017-10-26 11:45:49 +0800
committerPatrick Georgi <pgeorgi@google.com>2017-11-07 12:26:42 +0000
commiteb4ded6925d147478fb75a4afcfb6534a2faaa5a (patch)
tree65b7acfd596c2e8e40d0e901739dc753c27ce700 /src/ec/acpi
parentc467334620cc51daa9b976a241e43a6cafbe54a8 (diff)
downloadcoreboot-eb4ded6925d147478fb75a4afcfb6534a2faaa5a.tar.gz
coreboot-eb4ded6925d147478fb75a4afcfb6534a2faaa5a.tar.bz2
coreboot-eb4ded6925d147478fb75a4afcfb6534a2faaa5a.zip
ec/acpi: add mechanisms to clear EC output queue
EC's output could be considered as a queue, and sometimes (observed on Thinkpad T400s during cold boot) a few (only one observed) garbage bytes may detained in such queue after power up. Those garbage bytes should be checked and discarded first before real interactions, otherwise they may disrupt the interaction during EC's enablement, causing a locked rfkill. Change-Id: Iee031306c02f5211a4512c6b4ec90f7f0db196ae Signed-off-by: Bill XIE <persmule@gmail.com> Reviewed-on: https://review.coreboot.org/22180 Tested-by: build bot (Jenkins) <no-reply@coreboot.org> Reviewed-by: Patrick Rudolph <siro@das-labor.org>
Diffstat (limited to 'src/ec/acpi')
-rw-r--r--src/ec/acpi/ec.c15
-rw-r--r--src/ec/acpi/ec.h1
2 files changed, 16 insertions, 0 deletions
diff --git a/src/ec/acpi/ec.c b/src/ec/acpi/ec.c
index a739b98df3e9..61cad656eb7c 100644
--- a/src/ec/acpi/ec.c
+++ b/src/ec/acpi/ec.c
@@ -111,6 +111,21 @@ u8 recv_ec_data(void)
return data;
}
+void ec_clear_out_queue(void)
+{
+ int timeout = 0x7fff;
+ printk(BIOS_SPEW, "Clearing EC output queue...\n");
+ while (--timeout && (inb(ec_cmd_reg) & EC_OBF)) {
+ u8 data = inb(ec_data_reg);
+ printk(BIOS_SPEW, "Discarding a garbage byte: 0x%02x\n", data);
+ udelay(10);
+ }
+ if (!timeout)
+ printk(BIOS_ERR, "Timeout while clearing EC output queue!\n");
+ else
+ printk(BIOS_SPEW, "EC output queue has been cleared.\n");
+}
+
u8 ec_read(u8 addr)
{
send_ec_command(0x80);
diff --git a/src/ec/acpi/ec.h b/src/ec/acpi/ec.h
index d9487e901547..48982d315ed2 100644
--- a/src/ec/acpi/ec.h
+++ b/src/ec/acpi/ec.h
@@ -40,6 +40,7 @@ int send_ec_command(u8 command);
int send_ec_data(u8 data);
int send_ec_data_nowait(u8 data);
u8 recv_ec_data(void);
+void ec_clear_out_queue(void);
u8 ec_status(void);
u8 ec_query(void);
u8 ec_read(u8 addr);