chromeos: Unconditionally clear the EC recovery request
Added the empty function clear_recovery_mode_switch (weak) Problem: If GBB_FLAG_DISABLE_EC_SOFTWARE_SYNC is set, the following will happen: 1. Boot device in recovery mode with Esc + F3 + Pwr. 2. Turn device off with Pwr button. 3. Turn device on with Pwr button. Device still boots to recovery screen with recovery_reason:0x02 recovery button pressed. If GBB_FLAG_DISABLE_EC_SOFTWARE_SYNC isn't set, turning the device off and on again with the Pwr button does a normal boot. Solution: Unconditionally clear the recovery flag. BUG=chromium:279607 BRANCH=TOT TEST=Compile OK. Change-Id: Ie1e3251a6db12e75e385220e9d3791078393b1bf Signed-off-by: Sheng-Liang Song <ssl@chromium.org> Reviewed-on: https://chromium-review.googlesource.com/197780 Reviewed-by: Aaron Durbin <adurbin@chromium.org> Reviewed-by: Randall Spangler <rspangler@chromium.org> Commit-Queue: Sheng-liang Song <ssl@google.com> Tested-by: Sheng-liang Song <ssl@google.com>
This commit is contained in:
parent
797dabe54f
commit
18908bb64c
5 changed files with 35 additions and 18 deletions
|
|
@ -94,11 +94,35 @@ static u32 google_chromeec_get_mask(u8 type)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int google_chromeec_set_mask(u8 type, u32 mask)
|
||||
{
|
||||
struct ec_params_host_event_mask req;
|
||||
struct ec_response_host_event_mask rsp;
|
||||
struct chromeec_command cmd;
|
||||
|
||||
req.mask = mask;
|
||||
cmd.cmd_code = type;
|
||||
cmd.cmd_version = 0;
|
||||
cmd.cmd_data_in = &req;
|
||||
cmd.cmd_size_in = sizeof(req);
|
||||
cmd.cmd_data_out = &rsp;
|
||||
cmd.cmd_size_out = sizeof(rsp);
|
||||
|
||||
return google_chromeec_command(&cmd);
|
||||
}
|
||||
|
||||
u32 google_chromeec_get_events_b(void)
|
||||
{
|
||||
return google_chromeec_get_mask(EC_CMD_HOST_EVENT_GET_B);
|
||||
}
|
||||
|
||||
int google_chromeec_clear_events_b(u32 mask)
|
||||
{
|
||||
printk(BIOS_DEBUG, "Chrome EC: clear events_b mask to 0x%08x\n", mask);
|
||||
return google_chromeec_set_mask(
|
||||
EC_CMD_HOST_EVENT_CLEAR_B, mask);
|
||||
}
|
||||
|
||||
#ifndef __SMM__
|
||||
void google_chromeec_check_ec_image(int expected_type)
|
||||
{
|
||||
|
|
@ -279,23 +303,6 @@ int google_chromeec_i2c_xfer(uint8_t chip, uint8_t addr, int alen,
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int google_chromeec_set_mask(u8 type, u32 mask)
|
||||
{
|
||||
struct ec_params_host_event_mask req;
|
||||
struct ec_response_host_event_mask rsp;
|
||||
struct chromeec_command cmd;
|
||||
|
||||
req.mask = mask;
|
||||
cmd.cmd_code = type;
|
||||
cmd.cmd_version = 0;
|
||||
cmd.cmd_data_in = &req;
|
||||
cmd.cmd_size_in = sizeof(req);
|
||||
cmd.cmd_data_out = &rsp;
|
||||
cmd.cmd_size_out = sizeof(rsp);
|
||||
|
||||
return google_chromeec_command(&cmd);
|
||||
}
|
||||
|
||||
int google_chromeec_set_sci_mask(u32 mask)
|
||||
{
|
||||
printk(BIOS_DEBUG, "Chrome EC: Set SCI mask to 0x%08x\n", mask);
|
||||
|
|
|
|||
|
|
@ -43,6 +43,7 @@ void google_chromeec_check_ec_image(int expected_type);
|
|||
uint8_t google_chromeec_calc_checksum(const uint8_t *data, int size);
|
||||
u16 google_chromeec_get_board_version(void);
|
||||
u32 google_chromeec_get_events_b(void);
|
||||
int google_chromeec_clear_events_b(u32 mask);
|
||||
int google_chromeec_kbbacklight(int percent);
|
||||
void google_chromeec_post(u8 postcode);
|
||||
void google_chromeec_log_events(u32 mask);
|
||||
|
|
|
|||
|
|
@ -83,6 +83,12 @@ int recovery_mode_enabled(void)
|
|||
vboot_enable_recovery();
|
||||
}
|
||||
|
||||
int __attribute__((weak)) clear_recovery_mode_switch(void)
|
||||
{
|
||||
// Can be implemented by a mainboard
|
||||
return 0;
|
||||
}
|
||||
|
||||
int vboot_skip_display_init(void)
|
||||
{
|
||||
#if CONFIG_VBOOT_VERIFY_FIRMWARE
|
||||
|
|
|
|||
|
|
@ -26,6 +26,7 @@
|
|||
/* functions implemented per mainboard: */
|
||||
int get_developer_mode_switch(void);
|
||||
int get_recovery_mode_switch(void);
|
||||
int clear_recovery_mode_switch(void);
|
||||
int get_write_protect_state(void);
|
||||
#ifdef __PRE_RAM__
|
||||
void __attribute__((weak)) save_chromeos_gpios(void);
|
||||
|
|
|
|||
|
|
@ -245,8 +245,10 @@ static void vboot_invoke_wrapper(struct vboot_handoff *vboot_handoff)
|
|||
iflags = &vboot_handoff->init_params.flags;
|
||||
if (get_developer_mode_switch())
|
||||
*iflags |= VB_INIT_FLAG_DEV_SWITCH_ON;
|
||||
if (get_recovery_mode_switch())
|
||||
if (get_recovery_mode_switch()) {
|
||||
clear_recovery_mode_switch();
|
||||
*iflags |= VB_INIT_FLAG_REC_BUTTON_PRESSED;
|
||||
}
|
||||
if (get_write_protect_state())
|
||||
*iflags |= VB_INIT_FLAG_WP_ENABLED;
|
||||
if (vboot_get_sw_write_protect())
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue