blob: ccc96fa2954a61c62eb7394457e9431d768f6fec [file] [log] [blame]
/*
* Copyright (c) 2018 The Fuchsia Authors
*
* SPDX-License-Identifier: BSD-3-Clause
*/
#include <common.h>
#include <kvstore.h>
#include <amlogic/storage_if.h>
#include <zircon/sysconfig.h>
static int do_zircon_bootconfig(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
{
const char* sysconfig;
const char* zircon_a;
const char* zircon_b;
const char* zircon_r;
const char* zircon_boot;
struct kvstore kvs;
int rc;
if (argc != 5) {
return -1;
}
sysconfig = argv[1];
zircon_a = argv[2];
zircon_b = argv[3];
zircon_r = argv[4];
uint8_t buffer[ZX_SYSCONFIG_KVSTORE_SIZE];
rc = kvs_load(&kvs, buffer, sizeof(buffer));
if (rc < 0) {
rc = store_read_ops((unsigned char*)sysconfig, buffer, ZX_SYSCONFIG_BOOT_DEFAULT_OFFSET,
sizeof(buffer));
if (rc) {
printf("do_sysconfig: store_read_ops failed for %s\n", sysconfig);
return 0;
}
rc = kvs_load(&kvs, buffer, sizeof(buffer));
if (rc < 0) {
printf("do_sysconfig: kvs_load failed for %s\n", sysconfig);
return 0;
}
}
const char* boot_part = kvs_get(&kvs, "boot", NULL);
if (!boot_part) {
printf("boot partition not set\n");
return -1;
}
if (!strcmp(boot_part, "a")) {
zircon_boot = zircon_a;
} else if (!strcmp(boot_part, "b")) {
zircon_boot = zircon_b;
} else if (!strcmp(boot_part, "r")) {
zircon_boot = zircon_r;
} else {
printf("invalid boot partition %s, booting to recovery\n", boot_part);
zircon_boot = zircon_r;
}
printf("zircon_bootconfig setting boot_part to %s\n", zircon_boot);
setenv("boot_part", zircon_boot);
return 0;
}
U_BOOT_CMD(
zircon_bootconfig, 5, 0, do_zircon_bootconfig,
"sets Zircon boot partition based on information in sysconfig partition",
" argv: zircon_bootconfig <sysconfig partition> <Zircon-A partition> "
"<Zircon-B partition> <Zircon-R partition>\n"
" This command reads the Zircon boot configuration from partition <sysconfig partition>,\n"
" The environment variable \"boot_part\" is set to one of the partition names\n"
" <Zircon-A partition>, <Zircon-B partition> or <Zircon-R partition> based on the\n"
" configuration in the sysconfig partition.\n"
);