diff options
author | Vadim Bendebury <vbendeb@chromium.org> | 2014-12-25 15:34:32 -0800 |
---|---|---|
committer | Patrick Georgi <pgeorgi@google.com> | 2015-04-18 08:57:24 +0200 |
commit | 42001a7051e8fcfedccaba17438a032e1ac72ed1 (patch) | |
tree | 4218ff24e847f654935d1ad20a4ab7e13ebb7ead | |
parent | 3c90365bdd3883950d7dffdec75364a272be8728 (diff) | |
download | coreboot-42001a7051e8fcfedccaba17438a032e1ac72ed1.tar.xz |
vboot2: provide path for booting using alternative CBFS instances
When CONFIG_MULTIPLE_CBFS_INSTANCES is enabled, the image is expected
to have CBFS instances in rw-a and rw-b sections of the bootrom.
This patch adds code which makes sure that CBFS header points at the
proper bootrpom section as determined by vboot, and the RW stages load
from that section.
BRANCH=storm
BUG=chrome-os-partner:34161, chromium:445938
TEST=with the rest of the patches in, STORM boots all the way into
Linux login prompt.
Original-Change-Id: I187e3d3e65d548c672fdf3b42419544d3bd11ea1
Original-Signed-off-by: Vadim Bendebury <vbendeb@chromium.org>
Original-Reviewed-on: https://chromium-review.googlesource.com/237662
Original-Reviewed-by: Aaron Durbin <adurbin@chromium.org>
(cherry picked from commit 71ad0bb41b183374a84a5b9fb92c3afd813ceace)
Signed-off-by: Aaron Durbin <adurbin@chromium.org>
Change-Id: Ia05cb713981c44da8cb379b72dfbe17fe1f6c5ff
Reviewed-on: http://review.coreboot.org/9704
Tested-by: build bot (Jenkins)
Reviewed-by: Stefan Reinauer <stefan.reinauer@coreboot.org>
-rw-r--r-- | src/vendorcode/google/chromeos/vboot2/vboot_handoff.c | 14 | ||||
-rw-r--r-- | src/vendorcode/google/chromeos/vboot2/verstub.c | 20 | ||||
-rw-r--r-- | src/vendorcode/google/chromeos/vboot_common.c | 3 |
3 files changed, 26 insertions, 11 deletions
diff --git a/src/vendorcode/google/chromeos/vboot2/vboot_handoff.c b/src/vendorcode/google/chromeos/vboot2/vboot_handoff.c index a5c7de617c..b84e47ef16 100644 --- a/src/vendorcode/google/chromeos/vboot2/vboot_handoff.c +++ b/src/vendorcode/google/chromeos/vboot2/vboot_handoff.c @@ -176,9 +176,13 @@ void *vboot2_load_ramstage(void) /* we're on recovery path. continue to ro-ramstage. */ return NULL; - printk(BIOS_INFO, - "loading ramstage from Slot %c\n", sd->fw_slot ? 'B' : 'A'); - vb2_get_selected_region(wd, &fw_main); - - return load_ramstage(vh, &fw_main); + if (IS_ENABLED(CONFIG_MULTIPLE_CBFS_INSTANCES)) { + return cbfs_load_stage(CBFS_DEFAULT_MEDIA, + CONFIG_CBFS_PREFIX "/ramstage"); + } else { + printk(BIOS_INFO, "loading ramstage from Slot %c\n", + sd->fw_slot ? 'B' : 'A'); + vb2_get_selected_region(wd, &fw_main); + return load_ramstage(vh, &fw_main); + } } diff --git a/src/vendorcode/google/chromeos/vboot2/verstub.c b/src/vendorcode/google/chromeos/vboot2/verstub.c index 5630defc28..86c6e1ce2a 100644 --- a/src/vendorcode/google/chromeos/vboot2/verstub.c +++ b/src/vendorcode/google/chromeos/vboot2/verstub.c @@ -78,13 +78,21 @@ void *vboot2_verify_firmware(void) if (vboot_is_slot_selected(wd)) { /* RW A or B */ struct vboot_region fw_main; - struct vboot_components *fw_info; + vb2_get_selected_region(wd, &fw_main); - fw_info = vboot_locate_components(&fw_main); - if (fw_info == NULL) - die("failed to locate firmware components\n"); - entry = vboot_load_stage(CONFIG_VBOOT_ROMSTAGE_INDEX, - &fw_main, fw_info); + + if (IS_ENABLED(CONFIG_MULTIPLE_CBFS_INSTANCES)) { + cbfs_set_header_offset(fw_main.offset_addr); + entry = cbfs_load_stage(CBFS_DEFAULT_MEDIA, + CONFIG_CBFS_PREFIX "/romstage"); + } else { + struct vboot_components *fw_info; + fw_info = vboot_locate_components(&fw_main); + if (fw_info == NULL) + die("failed to locate firmware components\n"); + entry = vboot_load_stage(CONFIG_VBOOT_ROMSTAGE_INDEX, + &fw_main, fw_info); + } } else if (vboot_is_readonly_path(wd)) { /* RO */ entry = cbfs_load_stage(CBFS_DEFAULT_MEDIA, diff --git a/src/vendorcode/google/chromeos/vboot_common.c b/src/vendorcode/google/chromeos/vboot_common.c index ef47fc8a56..95bab367ed 100644 --- a/src/vendorcode/google/chromeos/vboot_common.c +++ b/src/vendorcode/google/chromeos/vboot_common.c @@ -95,6 +95,9 @@ void *vboot_get_payload(int *len) struct vboot_handoff *vboot_handoff; struct firmware_component *fwc; + if (IS_ENABLED(CONFIG_MULTIPLE_CBFS_INSTANCES)) + return NULL; /* Let CBFS figure it out. */ + vboot_handoff = cbmem_find(CBMEM_ID_VBOOT_HANDOFF); if (vboot_handoff == NULL) |