summaryrefslogtreecommitdiff
path: root/src/ec
diff options
context:
space:
mode:
authorFurquan Shaikh <furquan@chromium.org>2016-11-15 20:33:29 -0800
committerFurquan Shaikh <furquan@google.com>2016-11-18 04:01:59 +0100
commitcd2afc0df034670a83479aded514b22b99124cf5 (patch)
tree185aa9e1d8dd811a93b90682e250b95bf4ae8cee /src/ec
parentf8a274acf53217129460b5a487396761c174bd54 (diff)
google/chromeec: Add common infrastructure for boot-mode switches
Instead of defining the same functions for reading/clearing boot-mode switches from EC in every mainboard, add a common infrastructure to enable common functions for handling boot-mode switches if GOOGLE_CHROMEEC is being used. Only boards that were not moved to this new infrastructure are those that do not use GOOGLE_CHROMEEC or which rely on some mainboard specific mechanism for reading boot-mode switches. BUG=None BRANCH=None TEST=abuild compiles all boards successfully with and without ChromeOS option. Change-Id: I267aadea9e616464563df04b51a668b877f0d578 Signed-off-by: Furquan Shaikh <furquan@chromium.org> Reviewed-on: https://review.coreboot.org/17449 Tested-by: build bot (Jenkins) Reviewed-by: Julius Werner <jwerner@chromium.org>
Diffstat (limited to 'src/ec')
-rw-r--r--src/ec/google/chromeec/Kconfig7
-rw-r--r--src/ec/google/chromeec/Makefile.inc4
-rw-r--r--src/ec/google/chromeec/switches.c59
3 files changed, 70 insertions, 0 deletions
diff --git a/src/ec/google/chromeec/Kconfig b/src/ec/google/chromeec/Kconfig
index f8090030ef..76eef05dbe 100644
--- a/src/ec/google/chromeec/Kconfig
+++ b/src/ec/google/chromeec/Kconfig
@@ -158,3 +158,10 @@ config EC_GOOGLE_CHROMEEC_PD_FIRMWARE_FILE
depends on EC_GOOGLE_CHROMEEC_PD_FIRMWARE_EXTERNAL
help
The path and filename of the PD firmware file to use.
+
+config EC_GOOGLE_CHROMEEC_SWITCHES
+ depends on EC_GOOGLE_CHROMEEC && CHROMEOS
+ bool
+ help
+ Enable support for Chrome OS mode switches provided by the Chrome OS
+ EC.
diff --git a/src/ec/google/chromeec/Makefile.inc b/src/ec/google/chromeec/Makefile.inc
index b38d5b72ff..2fe6994884 100644
--- a/src/ec/google/chromeec/Makefile.inc
+++ b/src/ec/google/chromeec/Makefile.inc
@@ -29,6 +29,10 @@ smm-$(CONFIG_VBOOT) += vboot_storage.c
romstage-$(CONFIG_VBOOT) += vboot_storage.c
verstage-$(CONFIG_VBOOT) += vboot_storage.c
+verstage-$(CONFIG_EC_GOOGLE_CHROMEEC_SWITCHES) += switches.c
+romstage-$(CONFIG_EC_GOOGLE_CHROMEEC_SWITCHES) += switches.c
+ramstage-$(CONFIG_EC_GOOGLE_CHROMEEC_SWITCHES) += switches.c
+
CHROMEEC_SOURCE ?= $(top)/3rdparty/chromeec
# These are Chrome EC firmware images that a payload (such as depthcharge) can
diff --git a/src/ec/google/chromeec/switches.c b/src/ec/google/chromeec/switches.c
new file mode 100644
index 0000000000..74f72105d0
--- /dev/null
+++ b/src/ec/google/chromeec/switches.c
@@ -0,0 +1,59 @@
+/*
+ * This file is part of the coreboot project.
+ *
+ * Copyright 2016 Google Inc.
+ *
+ * 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 <bootmode.h>
+#include <ec/google/chromeec/ec.h>
+
+#if IS_ENABLED(CONFIG_EC_GOOGLE_CHROMEEC_LPC)
+int get_lid_switch(void)
+{
+ if (!IS_ENABLED(CONFIG_LID_SWITCH))
+ return -1;
+
+ return !!(google_chromeec_get_switches() & EC_SWITCH_LID_OPEN);
+}
+#endif
+
+int get_recovery_mode_switch(void)
+{
+ /* Check for dedicated recovery switch first. */
+ if (IS_ENABLED(CONFIG_EC_GOOGLE_CHROMEEC_LPC) &&
+ (google_chromeec_get_switches() & EC_SWITCH_DEDICATED_RECOVERY))
+ return 1;
+
+ /* Check if the EC has posted the keyboard recovery/fastboot event. */
+ return !!(google_chromeec_get_events_b() &
+ (EC_HOST_EVENT_MASK(EC_HOST_EVENT_KEYBOARD_RECOVERY) |
+ EC_HOST_EVENT_MASK(EC_HOST_EVENT_KEYBOARD_FASTBOOT)));
+}
+
+int get_recovery_mode_retrain_switch(void)
+{
+ /*
+ * Check if the EC has posted the keyboard recovery event with memory
+ * retrain.
+ */
+ return !!(google_chromeec_get_events_b() &
+ EC_HOST_EVENT_MASK(EC_HOST_EVENT_KEYBOARD_RECOVERY_HW_REINIT));
+}
+
+int clear_recovery_mode_switch(void)
+{
+ /* Clear all host event bits requesting recovery mode. */
+ return google_chromeec_clear_events_b(
+ EC_HOST_EVENT_MASK(EC_HOST_EVENT_KEYBOARD_RECOVERY) |
+ EC_HOST_EVENT_MASK(EC_HOST_EVENT_KEYBOARD_RECOVERY_HW_REINIT) |
+ EC_HOST_EVENT_MASK(EC_HOST_EVENT_KEYBOARD_FASTBOOT));
+}