| /* |
| * 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" |
| ); |