Keith Short has uploaded this change for review.

View Change

mainboard/sarien: Save the Cr50 recovery switch state in VBNV

Update sarien so the Cr50 recovery switch is only read during verstage
and save the recovery switch state to VBNV.

BUG=b:123360379
BRANCH=none
TEST=build coreboot on sarien and arcada. Test normal boot and recovery
boot on arcada - confirm that that tpm transaction errors are gone.

Change-Id: Iadf0cec651b3a26ceebadfeb637e189805c328bf
Signed-off-by: Keith Short <keithshort@chromium.org>
---
M src/mainboard/google/sarien/chromeos.c
1 file changed, 16 insertions(+), 19 deletions(-)

git pull ssh://review.coreboot.org:29418/coreboot refs/changes/01/31801/1
diff --git a/src/mainboard/google/sarien/chromeos.c b/src/mainboard/google/sarien/chromeos.c
index 1e363fd..308b682 100644
--- a/src/mainboard/google/sarien/chromeos.c
+++ b/src/mainboard/google/sarien/chromeos.c
@@ -20,18 +20,12 @@
#include <variant/gpio.h>
#include <vendorcode/google/chromeos/chromeos.h>
#include <security/tpm/tss.h>
+#include <security/vboot/vbnv.h>
#include <device/device.h>
#include <intelblocks/pmclib.h>
#include <soc/pmc.h>
#include <soc/pci_devs.h>

-enum rec_mode_state {
- REC_MODE_UNINITIALIZED,
- REC_MODE_NOT_REQUESTED,
- REC_MODE_REQUESTED,
-};
-static enum rec_mode_state saved_rec_mode;
-
void fill_lb_gpios(struct lb_gpios *gpios)
{
struct lb_gpio chromeos_gpios[] = {
@@ -84,30 +78,33 @@

int get_recovery_mode_switch(void)
{
- enum rec_mode_state state = saved_rec_mode;
+ int rec_switch;
uint8_t recovery_button_state = 0;

- /* Check the global variable first. */
- if (state == REC_MODE_NOT_REQUESTED)
- return 0;
- else if (state == REC_MODE_REQUESTED)
- return 1;
+ /*
+ * Only verstage performs a real check of the Cr50 recovery switch.
+ * The recovery switch state is cleared on the first access by the AP
+ * so there's no point in querying the Cr50 at later stages. All other
+ * stages use the state saved in VBNV.
+ */
+ if (!ENV_VERSTAGE &&
+ !get_recovery_switch_from_vbnv(&rec_switch))
+ return rec_switch;

- state = REC_MODE_NOT_REQUESTED;
+ rec_switch = 0;

/* Read state from the GPIO controlled by servo. */
if (cros_get_gpio_value(CROS_GPIO_REC))
- state = REC_MODE_REQUESTED;
+ rec_switch = 1;
/* Read one-time recovery request from cr50. */
else if (tlcl_cr50_get_recovery_button(&recovery_button_state)
== TPM_SUCCESS)
- state = recovery_button_state ?
- REC_MODE_REQUESTED : REC_MODE_NOT_REQUESTED;
+ rec_switch = !!recovery_button_state;

/* Store the state in case this is called again in verstage. */
- saved_rec_mode = state;
+ set_recovery_switch_into_vbnv(rec_switch);

- return state == REC_MODE_REQUESTED;
+ return rec_switch;
}

int get_lid_switch(void)

To view, visit change 31801. To unsubscribe, or for help writing mail filters, visit settings.

Gerrit-Project: coreboot
Gerrit-Branch: master
Gerrit-Change-Id: Iadf0cec651b3a26ceebadfeb637e189805c328bf
Gerrit-Change-Number: 31801
Gerrit-PatchSet: 1
Gerrit-Owner: Keith Short <keithshort@chromium.org>
Gerrit-MessageType: newchange