ec: Add romstage function for checking and rebooting EC
Now that we are executing VbInit() in coreboot we can end up in a situation where the recovery reason is consumed during VbInit (end of romstage) and then the EC is rebooted to RO during ramstage EC init, thereby losing the recovery reason. Two possiblities are to remove the EC check+reboot from ramstage and let it happen in depthcharge. This however means that the system has to boot all the way into depthcharge and then reboot the EC and the system again. Instead if we do a check in romstage before VbInit() is called then we can reboot the EC into RO early and avoid booting all the way to depthcharge first. This change adds a ramstage version the EC init function and calls it from the shared romstage code immediately after the PCH decode windows are setup. BUG=chrome-os-partner:19928 BRANCH=none TEST=manual: enter recovery with crossystem recovery_request=193 Change-Id: Ic927c69a95a2114e29c343f0dcc28374266db394 Signed-off-by: Duncan Laurie <dlaurie@chromium.org> Reviewed-on: https://gerrit.chromium.org/gerrit/57470 Reviewed-by: Aaron Durbin <adurbin@chromium.org>
This commit is contained in:
parent
8f6c55c28f
commit
1ee11133c0
3 changed files with 46 additions and 2 deletions
|
|
@ -38,6 +38,9 @@
|
|||
#if CONFIG_CHROMEOS
|
||||
#include <vendorcode/google/chromeos/chromeos.h>
|
||||
#endif
|
||||
#if CONFIG_EC_GOOGLE_CHROMEEC
|
||||
#include <ec/google/chromeec/ec.h>
|
||||
#endif
|
||||
#include "haswell.h"
|
||||
#include "northbridge/intel/haswell/haswell.h"
|
||||
#include "northbridge/intel/haswell/raminit.h"
|
||||
|
|
@ -216,6 +219,11 @@ void romstage_common(const struct romstage_params *params)
|
|||
|
||||
wake_from_s3 = early_pch_init(params->gpio_map, params->rcba_config);
|
||||
|
||||
#if CONFIG_EC_GOOGLE_CHROMEEC
|
||||
/* Ensure the EC is in the right mode for recovery */
|
||||
google_chromeec_early_init();
|
||||
#endif
|
||||
|
||||
/* Halt if there was a built in self test failure */
|
||||
report_bist_failure(params->bist);
|
||||
|
||||
|
|
|
|||
|
|
@ -21,12 +21,12 @@
|
|||
#include <console/console.h>
|
||||
#include <arch/io.h>
|
||||
#include <delay.h>
|
||||
#include <arch/hlt.h>
|
||||
#include <reset.h>
|
||||
#ifndef __PRE_RAM__
|
||||
#include <elog.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <reset.h>
|
||||
#include <arch/hlt.h>
|
||||
#include "chip.h"
|
||||
#endif
|
||||
#include "ec.h"
|
||||
|
|
@ -99,6 +99,41 @@ u32 google_chromeec_get_events_b(void)
|
|||
return google_chromeec_get_mask(EC_CMD_HOST_EVENT_GET_B);
|
||||
}
|
||||
|
||||
#ifndef __SMM__
|
||||
/* Check for recovery mode and ensure EC is in RO */
|
||||
void google_chromeec_early_init(void)
|
||||
{
|
||||
struct chromeec_command cec_cmd;
|
||||
struct ec_response_get_version cec_resp = {{0}};
|
||||
|
||||
cec_cmd.cmd_code = EC_CMD_GET_VERSION;
|
||||
cec_cmd.cmd_version = 0;
|
||||
cec_cmd.cmd_data_out = &cec_resp;
|
||||
cec_cmd.cmd_size_in = 0;
|
||||
cec_cmd.cmd_size_out = sizeof(cec_resp);
|
||||
google_chromeec_command(&cec_cmd);
|
||||
|
||||
if (cec_cmd.cmd_code ||
|
||||
(recovery_mode_enabled() &&
|
||||
(cec_resp.current_image != EC_IMAGE_RO))) {
|
||||
struct ec_params_reboot_ec reboot_ec;
|
||||
/* Reboot the EC and make it come back in RO mode */
|
||||
reboot_ec.cmd = EC_REBOOT_COLD;
|
||||
reboot_ec.flags = 0;
|
||||
cec_cmd.cmd_code = EC_CMD_REBOOT_EC;
|
||||
cec_cmd.cmd_version = 0;
|
||||
cec_cmd.cmd_data_in = &reboot_ec;
|
||||
cec_cmd.cmd_size_in = sizeof(reboot_ec);
|
||||
cec_cmd.cmd_size_out = 0; /* ignore response, if any */
|
||||
printk(BIOS_DEBUG, "Rebooting with EC in RO mode:\n");
|
||||
google_chromeec_command(&cec_cmd);
|
||||
udelay(1000);
|
||||
hard_reset();
|
||||
hlt();
|
||||
}
|
||||
}
|
||||
#endif /* ! __SMM__ */
|
||||
|
||||
#ifndef __PRE_RAM__
|
||||
|
||||
static int google_chromeec_set_mask(u8 type, u32 mask)
|
||||
|
|
|
|||
|
|
@ -33,6 +33,7 @@ u16 google_chromeec_get_board_version(void);
|
|||
void google_chromeec_init(void);
|
||||
#endif
|
||||
|
||||
void google_chromeec_early_init(void);
|
||||
uint8_t google_chromeec_calc_checksum(const uint8_t *data, int size);
|
||||
u32 google_chromeec_get_events_b(void);
|
||||
int google_chromeec_kbbacklight(int percent);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue