vboot: Notify EC of current boot mode

Notify EC of boot mode, i.e. normal, developer or recovery.
This is necessary for battery firmware updates.

BUG=chrome-os-partner:24741
CQ-DEPEND=CL:205323
CQ-DEPEND=CL:210033
CQ-DEPEND=CL:215720
BRANCH=ToT
TEST=Verified on samus & glimmer.

Passed runalltests.
~/trunk/src/platform/vboot_reference $ make runalltests -j

Change-Id: I1613ede34b4a929d1e8114fb519861f349377e94
Signed-off-by: Sheng-Liang Song <ssl@chromium.org>
Reviewed-on: https://chromium-review.googlesource.com/210032
Reviewed-by: Randall Spangler <rspangler@chromium.org>
This commit is contained in:
Sheng-Liang Song
2014-07-26 21:34:28 -07:00
committed by chrome-internal-fetch
parent e08ee28548
commit 487a54bcbe
4 changed files with 32 additions and 0 deletions

View File

@@ -826,6 +826,13 @@ VbError_t VbExEcUpdateRW(int devidx, const uint8_t *image, int image_size);
*/ */
VbError_t VbExEcProtectRW(int devidx); VbError_t VbExEcProtectRW(int devidx);
/**
* Info the EC of the boot mode selected by the AP.
* mode: Normal, Developer, or Recovery
*/
enum VbEcBootMode_t {VB_EC_NORMAL, VB_EC_DEVELOPER, VB_EC_RECOVERY };
VbError_t VbExEcEnteringMode(int devidx, enum VbEcBootMode_t mode);
/*****************************************************************************/ /*****************************************************************************/
/* Misc */ /* Misc */

View File

@@ -1012,15 +1012,18 @@ VbError_t VbSelectAndLoadKernel(VbCommonParams *cparams,
/* Recovery boot */ /* Recovery boot */
p.boot_flags |= BOOT_FLAG_RECOVERY; p.boot_flags |= BOOT_FLAG_RECOVERY;
retval = VbBootRecovery(cparams, &p); retval = VbBootRecovery(cparams, &p);
VbExEcEnteringMode(0, VB_EC_RECOVERY);
VbDisplayScreen(cparams, VB_SCREEN_BLANK, 0, &vnc); VbDisplayScreen(cparams, VB_SCREEN_BLANK, 0, &vnc);
} else if (p.boot_flags & BOOT_FLAG_DEVELOPER) { } else if (p.boot_flags & BOOT_FLAG_DEVELOPER) {
/* Developer boot */ /* Developer boot */
retval = VbBootDeveloper(cparams, &p); retval = VbBootDeveloper(cparams, &p);
VbExEcEnteringMode(0, VB_EC_DEVELOPER);
VbDisplayScreen(cparams, VB_SCREEN_BLANK, 0, &vnc); VbDisplayScreen(cparams, VB_SCREEN_BLANK, 0, &vnc);
} else { } else {
/* Normal boot */ /* Normal boot */
VbExEcEnteringMode(0, VB_EC_NORMAL);
retval = VbBootNormal(cparams, &p); retval = VbBootNormal(cparams, &p);
if ((1 == shared->firmware_index) && if ((1 == shared->firmware_index) &&

View File

@@ -17,6 +17,8 @@
#include "vboot_api.h" #include "vboot_api.h"
static enum VbEcBootMode_t vboot_mode;
void VbExSleepMs(uint32_t msec) void VbExSleepMs(uint32_t msec)
{ {
} }
@@ -151,6 +153,17 @@ VbError_t VbExEcProtectRW(int devidx)
return VBERROR_SUCCESS; return VBERROR_SUCCESS;
} }
VbError_t VbExEcEnteringMode(int devidx, enum VbEcBootMode_t mode)
{
vboot_mode = mode;
return VBERROR_SUCCESS;
}
enum VbEcBootMode_t VbGetMode(void)
{
return vboot_mode;
}
int VbExLegacy(void) int VbExLegacy(void)
{ {
return 1; return 1;

View File

@@ -45,6 +45,8 @@ static uint32_t screens_count = 0;
static uint32_t mock_num_disks[8]; static uint32_t mock_num_disks[8];
static uint32_t mock_num_disks_count; static uint32_t mock_num_disks_count;
extern enum VbEcBootMode_t VbGetMode(void);
/* Reset mock data (for use before each test) */ /* Reset mock data (for use before each test) */
static void ResetMocks(void) static void ResetMocks(void)
{ {
@@ -262,7 +264,9 @@ static void VbUserConfirmsTest(void)
static void VbBootTest(void) static void VbBootTest(void)
{ {
ResetMocks(); ResetMocks();
VbExEcEnteringMode(0, VB_EC_NORMAL);
TEST_EQ(VbBootNormal(&cparams, &lkp), 1002, "VbBootNormal()"); TEST_EQ(VbBootNormal(&cparams, &lkp), 1002, "VbBootNormal()");
TEST_EQ(VbGetMode(), VB_EC_NORMAL, "vboot_mode normal");
} }
static void VbBootDevTest(void) static void VbBootDevTest(void)
@@ -273,7 +277,9 @@ static void VbBootDevTest(void)
/* Proceed after timeout */ /* Proceed after timeout */
ResetMocks(); ResetMocks();
VbExEcEnteringMode(0, VB_EC_DEVELOPER);
TEST_EQ(VbBootDeveloper(&cparams, &lkp), 1002, "Timeout"); TEST_EQ(VbBootDeveloper(&cparams, &lkp), 1002, "Timeout");
TEST_EQ(VbGetMode(), VB_EC_DEVELOPER, "vboot_mode developer");
TEST_EQ(screens_displayed[0], VB_SCREEN_DEVELOPER_WARNING, TEST_EQ(screens_displayed[0], VB_SCREEN_DEVELOPER_WARNING,
" warning screen"); " warning screen");
VbNvGet(VbApiKernelGetVnc(), VBNV_RECOVERY_REQUEST, &u); VbNvGet(VbApiKernelGetVnc(), VBNV_RECOVERY_REQUEST, &u);
@@ -448,8 +454,11 @@ static void VbBootRecTest(void)
/* Shutdown requested in loop */ /* Shutdown requested in loop */
ResetMocks(); ResetMocks();
shutdown_request_calls_left = 10; shutdown_request_calls_left = 10;
VbExEcEnteringMode(0, VB_EC_RECOVERY);
TEST_EQ(VbBootRecovery(&cparams, &lkp), VBERROR_SHUTDOWN_REQUESTED, TEST_EQ(VbBootRecovery(&cparams, &lkp), VBERROR_SHUTDOWN_REQUESTED,
"Shutdown requested"); "Shutdown requested");
TEST_EQ(VbGetMode(), VB_EC_RECOVERY, "vboot_mode recovery");
VbNvGet(VbApiKernelGetVnc(), VBNV_RECOVERY_REQUEST, &u); VbNvGet(VbApiKernelGetVnc(), VBNV_RECOVERY_REQUEST, &u);
TEST_EQ(u, 0, " recovery reason"); TEST_EQ(u, 0, " recovery reason");
TEST_EQ(screens_displayed[0], VB_SCREEN_BLANK, TEST_EQ(screens_displayed[0], VB_SCREEN_BLANK,