diff options
author | Furquan Shaikh <furquan@chromium.org> | 2016-11-15 20:33:29 -0800 |
---|---|---|
committer | Furquan Shaikh <furquan@google.com> | 2016-11-18 04:01:59 +0100 |
commit | cd2afc0df034670a83479aded514b22b99124cf5 (patch) | |
tree | 185aa9e1d8dd811a93b90682e250b95bf4ae8cee /src/ec | |
parent | f8a274acf53217129460b5a487396761c174bd54 (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/Kconfig | 7 | ||||
-rw-r--r-- | src/ec/google/chromeec/Makefile.inc | 4 | ||||
-rw-r--r-- | src/ec/google/chromeec/switches.c | 59 |
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)); +} |