summaryrefslogtreecommitdiff
path: root/src/ec/lenovo
diff options
context:
space:
mode:
authorPatrick Rudolph <siro@das-labor.org>2018-10-20 17:10:04 +0200
committerPatrick Georgi <pgeorgi@google.com>2019-05-08 10:26:35 +0000
commit2dc00fab7c46369bffdedf3afea2af720e4add80 (patch)
tree1a45c0849578404e4a9d9e8665e2ca62f5163b38 /src/ec/lenovo
parent1d3b3c3c0955a652a1b602c5fd86dc6c5890e967 (diff)
ec/lenovo/h8: Add function to query sense state
* Add function to wait for sense registers to become valid. * Add function to retrieve Fn-Key state. Tested on Lenovo T500: * It takes about 700msec for the registers to become valid. Tested on Lenovo T520: * It takes less than 150msec for the registers to become valid. Change-Id: Ie27e2881a256c4efb3def11f05070c446db6e5fc Signed-off-by: Patrick Rudolph <siro@das-labor.org> Reviewed-on: https://review.coreboot.org/c/coreboot/+/29204 Tested-by: build bot (Jenkins) <no-reply@coreboot.org> Reviewed-by: Philipp Deppenwiese <zaolin.daisuki@gmail.com> Reviewed-by: Nico Huber <nico.h@gmx.de>
Diffstat (limited to 'src/ec/lenovo')
-rw-r--r--src/ec/lenovo/h8/Makefile.inc7
-rw-r--r--src/ec/lenovo/h8/h8.h5
-rw-r--r--src/ec/lenovo/h8/sense.c54
3 files changed, 66 insertions, 0 deletions
diff --git a/src/ec/lenovo/h8/Makefile.inc b/src/ec/lenovo/h8/Makefile.inc
index ebf6d7d7a4..bccdd91b7d 100644
--- a/src/ec/lenovo/h8/Makefile.inc
+++ b/src/ec/lenovo/h8/Makefile.inc
@@ -1,5 +1,12 @@
ifeq ($(CONFIG_EC_LENOVO_H8),y)
+ramstage-y += sense.c
+verstage-y += sense.c
+romstage-y += sense.c
+bootblock-y += sense.c
+postcar-y += sense.c
+smm-y += sense.c
+
ifneq ($(filter y,$(CONFIG_H8_BEEP_ON_DEATH) $(CONFIG_H8_FLASH_LEDS_ON_DEATH)),)
romstage-y += panic.c
ramstage-y += panic.c
diff --git a/src/ec/lenovo/h8/h8.h b/src/ec/lenovo/h8/h8.h
index a46ba1f5e0..14948c55ce 100644
--- a/src/ec/lenovo/h8/h8.h
+++ b/src/ec/lenovo/h8/h8.h
@@ -38,6 +38,9 @@ void h8_usb_always_on(void);
void h8_mainboard_init_dock (void);
+int h8_get_fn_key(void);
+int h8_get_sense_ready(void);
+
void h8_bluetooth_enable(int on);
bool h8_bluetooth_nv_enable(void);
bool h8_has_bdc(struct device *dev);
@@ -135,8 +138,10 @@ void h8_ssdt_generator(struct device *dev);
#define H8_EVENT_FN_PRESS 0x39
#define H8_STATUS0 0x46
+#define H8_STATUS0_FN_KEY_DOWN 0x01
#define H8_STATUS1 0x47
#define H8_STATUS2 0x48
+#define H8_STATUS3 0x49
#define H8_EVENT_BAT0 0x4a
#define H8_EVENT_BAT0_STATE 0x4b
diff --git a/src/ec/lenovo/h8/sense.c b/src/ec/lenovo/h8/sense.c
new file mode 100644
index 0000000000..b929d7ede3
--- /dev/null
+++ b/src/ec/lenovo/h8/sense.c
@@ -0,0 +1,54 @@
+/*
+ * This file is part of the coreboot project.
+ *
+ * Copyright (C) 2018 Patrick Rudolph <siro@das-labor.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ */
+
+#include <ec/acpi/ec.h>
+
+#include "h8.h"
+
+/**
+ * Return the EC sense status register state.
+ *
+ * Observations showed the sense registers are all zero until the EC populates
+ * them after some time. Likely the EC sets all bits to it's valid state at
+ * once, but there's no prove as the firmware isn't available.
+ *
+ * Wait for any register having at least one bit set.
+ * Unlikely that all register will be zero after booting has finished.
+ *
+ * @return 1 if the EC provides valid data in sense status registers
+ */
+int h8_get_sense_ready(void)
+{
+ static const u8 regs[] = { H8_STATUS0, H8_STATUS1, H8_STATUS2,
+ H8_STATUS3};
+
+ for (size_t i = 0; i < ARRAY_SIZE(regs); i++) {
+ if (ec_read(regs[i]))
+ return 1;
+ }
+
+ return 0;
+}
+
+/**
+ * Return the state of Fn key.
+ * Only valid if h8_get_sense_ready (see above) returns true.
+ *
+ * @return 1 if the key is pressed.
+ */
+int h8_get_fn_key(void)
+{
+ return ec_read(H8_STATUS0) & H8_STATUS0_FN_KEY_DOWN;
+}