summaryrefslogtreecommitdiff
path: root/boot/bootmeth_cros.c
diff options
context:
space:
mode:
authorSimon Glass <sjg@chromium.org>2023-07-30 11:16:50 -0600
committerSimon Glass <sjg@chromium.org>2023-08-10 18:34:54 -0600
commit4cfe4510f1e6e0cf2e346f5bd9de5d5be346238d (patch)
tree548a090ea3399e53a96baaa4721c1f6b5b16ff9e /boot/bootmeth_cros.c
parentde30aa9a2f5659ecee599d61e1940b30c76d627c (diff)
downloadu-boot-4cfe4510f1e6e0cf2e346f5bd9de5d5be346238d.tar.gz
u-boot-4cfe4510f1e6e0cf2e346f5bd9de5d5be346238d.tar.bz2
u-boot-4cfe4510f1e6e0cf2e346f5bd9de5d5be346238d.zip
bootstd: cros: Support a kernel on either partition
ChromiumOS allows a kernel to be on either partition 2 or 4. Add support for scanning both and using the first one we find with a suitable signature. Record the partition which is used. Signed-off-by: Simon Glass <sjg@chromium.org>
Diffstat (limited to 'boot/bootmeth_cros.c')
-rw-r--r--boot/bootmeth_cros.c21
1 files changed, 14 insertions, 7 deletions
diff --git a/boot/bootmeth_cros.c b/boot/bootmeth_cros.c
index 385eca3738..7b25042bfe 100644
--- a/boot/bootmeth_cros.c
+++ b/boot/bootmeth_cros.c
@@ -13,6 +13,7 @@
#include <bootdev.h>
#include <bootflow.h>
#include <bootmeth.h>
+#include <display_options.h>
#include <dm.h>
#include <malloc.h>
#include <mapmem.h>
@@ -133,7 +134,7 @@ static int cros_read_bootflow(struct udevice *dev, struct bootflow *bflow)
struct disk_partition info;
const char *uuid = NULL;
void *buf, *hdr;
- int ret;
+ int part, ret;
log_debug("starting, part=%d\n", bflow->part);
@@ -141,13 +142,19 @@ static int cros_read_bootflow(struct udevice *dev, struct bootflow *bflow)
if (bflow->part)
return log_msg_ret("max", -ENOENT);
- /* Check partition 2 */
- ret = scan_part(bflow->blk, 2, &info, &hdr);
- if (ret)
- return log_msg_ret("scan", ret);
- bflow->part = 2;
+ /* Check partition 2 then 4 */
+ part = 2;
+ ret = scan_part(bflow->blk, part, &info, &hdr);
+ if (ret) {
+ part = 4;
+ ret = scan_part(bflow->blk, part, &info, &hdr);
+ if (ret)
+ return log_msg_ret("scan", ret);
+ }
+ bflow->part = part;
- log_info("Header at %lx\n", (ulong)map_to_sysmem(hdr));
+ log_info("Selected parition %d, header at %lx\n", bflow->part,
+ (ulong)map_to_sysmem(hdr));
start = *(u32 *)(hdr + KERN_START);
size = ALIGN(*(u32 *)(hdr + KERN_SIZE), desc->blksz);
log_debug("Reading start %lx size %lx\n", start, size);