summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorTom Wai-Hong Tam <waihong@chromium.org>2011-07-14 09:07:15 +0800
committerSimon Glass <sjg@chromium.org>2011-08-29 10:58:57 -0700
commit496058c06910694faf9e21d77b9c4e6ae5ce11e3 (patch)
tree00f952cc592fc979c2b2992343aebe6b28813161 /lib
parentb069d84b3beb8e1cf3973cb4b59ceba21e26507e (diff)
CHROMIUM: Support RO firmware boot on bootstub.
Patched CL: http://gerrit.chromium.org/gerrit/#change,4065 BUG=chromium-os:17304;chromeos-os:16542 TEST=build and run on seaboard. Verified RO boot, recovery boot, normal boot, developer boot. Change-Id: I06a5a230c28da87397da0cf6f1288a8d75b73988 Reviewed-on: http://gerrit.chromium.org/gerrit/4072 Reviewed-by: Simon Glass <sjg@chromium.org> Reviewed-by: Randall Spangler <rspangler@chromium.org> Tested-by: Tom Wai-Hong Tam <waihong@chromium.org>
Diffstat (limited to 'lib')
-rw-r--r--lib/vboot/bootstub_entry.c64
1 files changed, 45 insertions, 19 deletions
diff --git a/lib/vboot/bootstub_entry.c b/lib/vboot/bootstub_entry.c
index 1d0a9899cd..57718385b1 100644
--- a/lib/vboot/bootstub_entry.c
+++ b/lib/vboot/bootstub_entry.c
@@ -34,7 +34,7 @@ static void prepare_cparams(vb_global_t *global, VbCommonParams *cparams)
static void prepare_iparams(vb_global_t *global, VbInitParams *iparams)
{
crossystem_data_t *cdata = &global->cdata_blob;
- iparams->flags = 0;
+ iparams->flags = VB_INIT_FLAG_RO_NORMAL_SUPPORT;
if (cdata->developer_sw)
iparams->flags |= VB_INIT_FLAG_DEV_SWITCH_ON;
if (cdata->recovery_sw)
@@ -207,14 +207,33 @@ static VbError_t call_VbSelectFirmware(VbCommonParams *cparams,
static int set_fwid_value(vb_global_t *global,
firmware_storage_t *file,
struct fdt_twostop_fmap *fmap,
- int index)
+ uint32_t selected_firmware)
{
crossystem_data_t *cdata = &global->cdata_blob;
char fwid[ID_LEN];
uint32_t fwid_offset;
- fwid_offset = index ? fmap->readwrite_b.rw_b_onestop.offset
- : fmap->readwrite_a.rw_a_onestop.offset;
+ switch (selected_firmware) {
+ case VB_SELECT_FIRMWARE_A:
+ fwid_offset = fmap->readwrite_a.rw_a_onestop.offset;
+ break;
+
+ case VB_SELECT_FIRMWARE_B:
+ fwid_offset = fmap->readwrite_b.rw_b_onestop.offset;
+ break;
+
+ case VB_SELECT_FIRMWARE_RECOVERY:
+ fwid_offset = fmap->readonly.ro_onestop.offset;
+ break;
+
+ case VB_SELECT_FIRMWARE_READONLY:
+ fwid_offset = fmap->readonly.ro_onestop.offset;
+ break;
+
+ default:
+ return 1;
+ }
+
fwid_offset += fmap->onestop_layout.fwid.offset;
if (fmap->onestop_layout.fwid.length > ID_LEN) {
@@ -226,7 +245,7 @@ static int set_fwid_value(vb_global_t *global,
fwid_offset,
fmap->onestop_layout.fwid.length,
fwid)) {
- VbExDebug(PREFIX "Failed to read FWID %d!\n", index);
+ VbExDebug(PREFIX "Failed to read FWID!\n");
return 1;
}
@@ -247,7 +266,6 @@ void bootstub_entry(void)
VbInitParams iparams;
VbSelectFirmwareParams fparams;
VbError_t ret;
- int index = 0;
if (fdt_decode_twostop_fmap(fdt_ptr, &fmap))
VbExError(PREFIX "Failed to load fmap config from fdt.\n");
@@ -284,31 +302,39 @@ void bootstub_entry(void)
ret);
release_fparams(&fparams);
+ if (set_fwid_value(global, &file, &fmap, fparams.selected_firmware))
+ VbExError(PREFIX "Failed to set FWID!\n");
+
+ if (file.close(&file))
+ VbExError(PREFIX "Failed to close firmware device!\n");
+
/* Handle the VbSelectFirmware() results */
switch (fparams.selected_firmware) {
case VB_SELECT_FIRMWARE_A:
- index = 0;
+ memcpy((void *)CONFIG_SYS_TEXT_BASE, cache.infos[0].buffer,
+ cache.infos[0].size);
+ jump_to_firmware((firmware_entry_t)CONFIG_SYS_TEXT_BASE);
break;
case VB_SELECT_FIRMWARE_B:
- index = 1;
+ memcpy((void *)CONFIG_SYS_TEXT_BASE, cache.infos[1].buffer,
+ cache.infos[1].size);
+ jump_to_firmware((firmware_entry_t)CONFIG_SYS_TEXT_BASE);
break;
case VB_SELECT_FIRMWARE_RECOVERY:
- /* Reboot to recovery mode */
- cold_reboot();
+ VbExDebug(PREFIX "Boot to recovery mode...\n");
+ main_entry();
+ break;
+
+ case VB_SELECT_FIRMWARE_READONLY:
+ VbExDebug(PREFIX "Boot to RO firmware...\n");
+ main_entry();
+ break;
default:
VbExError(PREFIX "Unexpected selected firmware value!\n");
}
- if (set_fwid_value(global, &file, &fmap, index))
- VbExError(PREFIX "Failed to set RW FWID!\n");
-
- if (file.close(&file))
- VbExError(PREFIX "Failed to close firmware device!\n");
-
- memcpy((void *)CONFIG_SYS_TEXT_BASE, cache.infos[index].buffer,
- cache.infos[index].size);
- jump_to_firmware((firmware_entry_t)CONFIG_SYS_TEXT_BASE);
+ VbExError(PREFIX "Should not reach here!\n");
}