diff options
author | Che-Liang Chiou <clchiou@chromium.org> | 2011-07-02 18:44:37 +0800 |
---|---|---|
committer | Simon Glass <sjg@chromium.org> | 2011-08-29 10:58:45 -0700 |
commit | 9cd098f06d520c227e7a9859152cc643cedb6e03 (patch) | |
tree | f3ee81e26c535cb890fed6e9d28090723db3ea1a /common | |
parent | af99b11bb8236123bf0e054d49a915b2bee470fc (diff) |
CHROMIUM: twostop: prototype twostop firmware
We modify onestop firmware to support twostop booting. Basically we only
implemented R/W firmware verification.
TODO
* Read R/W firmware from mmc
* Set main R/W firmware A or B in crossystem data
* Read TPM's firmware version
BUG=chromium-os:17056
TEST=boot r/w firmware on seaboard
Change-Id: I77657547a2eafd1f7a4dafade26911cf1cc069b0
Reviewed-on: http://gerrit.chromium.org/gerrit/3603
Reviewed-by: Che-Liang Chiou <clchiou@chromium.org>
Tested-by: Che-Liang Chiou <clchiou@chromium.org>
Diffstat (limited to 'common')
-rw-r--r-- | common/cmd_cros_onestop_firmware.c | 30 |
1 files changed, 22 insertions, 8 deletions
diff --git a/common/cmd_cros_onestop_firmware.c b/common/cmd_cros_onestop_firmware.c index 958f37d5c3..512e716fb9 100644 --- a/common/cmd_cros_onestop_firmware.c +++ b/common/cmd_cros_onestop_firmware.c @@ -17,6 +17,7 @@ #include <chromeos/gbb_bmpblk.h> #include <chromeos/gpio.h> #include <chromeos/load_kernel_helper.h> +#include <chromeos/onestop.h> #include <chromeos/os_storage.h> #include <chromeos/power_management.h> #include <chromeos/vboot_nvstorage_helper.h> @@ -561,30 +562,40 @@ static uint32_t normal_boot(struct os_storage *oss, crossystem_data_t *cdata, * recovery or reboot. * * @param file firmware storage interface - * @param cdata Pointer to crossystem data + * @param gbb_data Pointer to GBB data blob + * @param cdata Pointer to crossystem data * @param oss OS storage interface + * @param dev_mode set to 1 if in developer mode, 0 if not * @return required action for caller: * REBOOT_TO_CURRENT_MODE Reboot + VBNV_COMMAND_PROMPT Return to U-Boot command prompt * anything else Go into recovery */ static unsigned onestop_boot(firmware_storage_t *file, struct os_storage *oss, - crossystem_data_t *cdata, VbNvContext *nvcxt) + uint8_t *gbb_data, crossystem_data_t *cdata, VbNvContext *nvcxt, + int *dev_mode) { unsigned reason = VBNV_RECOVERY_NOT_REQUESTED; - int dev_mode; + + VBDEBUG(PREFIX "%s onestop\n", is_ro_firmware() ? "r/o" : "r/w"); /* Work through our initialization one step at a time */ - reason = init_internal_state(file, cdata, &dev_mode, oss, nvcxt); + reason = init_internal_state(file, cdata, dev_mode, oss, nvcxt); if (reason == VBNV_RECOVERY_NOT_REQUESTED) - reason = init_vbshared_data(file, dev_mode, nvcxt); + if (is_ro_firmware() && !is_tpm_trust_ro_firmware()) + reason = boot_rw_firmware(file, *dev_mode, + gbb_data, cdata, nvcxt); if (reason == VBNV_RECOVERY_NOT_REQUESTED) - reason = rewritable_boot_init(file, cdata, dev_mode ? + reason = init_vbshared_data(file, *dev_mode, nvcxt); + + if (reason == VBNV_RECOVERY_NOT_REQUESTED) + reason = rewritable_boot_init(file, cdata, *dev_mode ? DEVELOPER_TYPE : NORMAL_TYPE); if (reason == VBNV_RECOVERY_NOT_REQUESTED) { - if (dev_mode) + if (*dev_mode) reason = developer_boot(oss, cdata, nvcxt); /* @@ -606,9 +617,12 @@ int do_cros_onestop_firmware(cmd_tbl_t *cmdtp, int flag, int argc, struct os_storage os_storage; firmware_storage_t file; VbNvContext nvcxt; + int dev_mode; clear_screen(); - reason = onestop_boot(&file, &os_storage, &_state.cdata, &nvcxt); + reason = onestop_boot(&file, &os_storage, + _state.gbb_data, &_state.cdata, &nvcxt, + &dev_mode); if (reason == VBNV_COMMAND_PROMPT) return 0; if (reason != REBOOT_TO_CURRENT_MODE) |