| /* |
| * Copyright (c) 2020 The Fuchsia Authors |
| */ |
| |
| #include <common.h> |
| #include <command.h> |
| #include <factory_boot_kvs.h> |
| |
| static int do_get(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[]) |
| { |
| FbKvsResult ret; |
| FbKvsValueType type; |
| size_t size; |
| uintptr_t addr; |
| |
| if (argc < 3 || !argv[1][0]) |
| return CMD_RET_USAGE; |
| |
| const char *key = argv[1]; |
| addr = (uintptr_t)simple_strtoul(argv[2], NULL, 0); |
| if (!addr) { |
| printf("[factory boot:get] Invalid address for %s: %s\n", key, argv[2]); |
| return CMD_RET_USAGE; |
| } |
| |
| /* factory_boot kvs has to be already initialized */ |
| ret = FbKvsGetValueSize(key, &size); |
| if (ret != kFbKvsResultOk) { |
| printf("[factory boot:get] Failed to get the value size for %s: %d\n", key, ret); |
| return CMD_RET_FAILURE; |
| } |
| |
| ret = FbKvsGetValueType(key, &type); |
| if (ret != kFbKvsResultOk) { |
| printf("[factory boot:get] Failed to get the value type for %s: %d\n", key, ret); |
| return CMD_RET_FAILURE; |
| } |
| |
| switch (type) { |
| case kFbKvsTypeString: |
| ret = FbKvsGetString(key, (char *)addr, &size); |
| break; |
| case kFbKvsTypeLong: |
| ret = FbKvsGetLong(key, (int64_t *)addr); |
| break; |
| case kFbKvsTypeULong: |
| ret = FbKvsGetULong(key, (uint64_t *)addr); |
| break; |
| case kFbKvsTypeData: |
| ret = FbKvsGetData(key, (uint8_t *)addr, &size); |
| break; |
| default: |
| printf("[factory boot:get] Unknown type: %d\n", type); |
| return CMD_RET_FAILURE; |
| } |
| |
| return CMD_RET_SUCCESS; |
| } |
| |
| static cmd_tbl_t commands[] = { |
| U_BOOT_CMD_MKENT(get, /* maxargs = */ 3, /* repeatable = */ 0, do_get, |
| "", ""), |
| }; |
| |
| static int do_factory_boot(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[]) |
| { |
| cmd_tbl_t *cmd; |
| int ret; |
| |
| if (argc < 2) |
| return CMD_RET_USAGE; |
| |
| argc--; |
| argv++; |
| |
| cmd = find_cmd_tbl(argv[0], commands, ARRAY_SIZE(commands)); |
| if (!cmd || argc > cmd->maxargs) |
| return CMD_RET_USAGE; |
| |
| ret = cmd->cmd(cmd, flag, argc, argv); |
| return cmd_process_error(cmdtp, ret); |
| } |
| |
| U_BOOT_CMD( |
| factory_boot, /* maxargs = */ 4, /* repeatable = */ 0, do_factory_boot, |
| "Factory Boot KVS.", |
| "factory_boot get <name> [address]- Read a value of |name| to |address|.\n" |
| ); |