Loading...
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 | // SPDX-License-Identifier: GPL-2.0+ /* * Copyright 2020 Broadcom */ #include <common.h> #include <command.h> #define FW_IMAGE_SIG 0xff123456 #define CFG_IMAGE_SIG 0xcf54321a /* * structure for bin file * signature: fw itb file * size: fw itb file * signature: NS3 config file * size: NS3 config file * Data: fw itb file * ............................ * ............................ * Data: NS3 config file * ............................ * ............................ */ static struct img_header { u32 bin_sig; u32 bin_size; u32 cfg1_sig; u32 cfg1_size; } *img_header; static int env_set_val(const char *varname, ulong val) { int ret; ret = env_set_hex(varname, val); if (ret) pr_err("Failed to %s env var\n", varname); return ret; } static int do_spi_images_addr(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[]) { uintptr_t images_load_addr; uintptr_t spi_load_addr; u32 len; u32 spi_data_offset = sizeof(struct img_header); if (argc != 3) return CMD_RET_USAGE; /* convert command parameter to fastboot address (base 16), i.e. hex */ images_load_addr = hextoul(argv[1], NULL); if (!images_load_addr) { pr_err("Invalid load address\n"); return CMD_RET_USAGE; } spi_load_addr = hextoul(argv[2], NULL); if (!spi_load_addr) { pr_err("Invalid spi load address\n"); return CMD_RET_USAGE; } img_header = (struct img_header *)images_load_addr; if (img_header->bin_sig != FW_IMAGE_SIG) { pr_err("Invalid Nitro bin file\n"); goto error; } if (env_set_val("spi_nitro_fw_itb_start_addr", 0)) goto error; if (env_set_val("spi_nitro_fw_itb_len", 0)) goto error; if (env_set_val("spi_nitro_fw_ns3_cfg_start_addr", 0)) goto error; if (env_set_val("spi_nitro_fw_ns3_cfg_len", 0)) goto error; len = img_header->bin_size; if (env_set_val("spi_nitro_fw_itb_start_addr", (spi_load_addr + spi_data_offset))) goto error; if (env_set_val("spi_nitro_fw_itb_len", img_header->bin_size)) goto error; spi_data_offset += len; if (img_header->cfg1_sig == CFG_IMAGE_SIG) { len = img_header->cfg1_size; if (env_set_val("spi_nitro_fw_ns3_cfg_start_addr", (spi_load_addr + spi_data_offset))) goto error; if (env_set_val("spi_nitro_fw_ns3_cfg_len", len)) goto error; spi_data_offset += len; } /* disable secure boot */ if (env_set_val("nitro_fastboot_secure", 0)) goto error; return CMD_RET_SUCCESS; error: return CMD_RET_FAILURE; } U_BOOT_CMD (spi_nitro_images_addr, 3, 1, do_spi_images_addr, "Load the bnxt bin header and sets envs ", "spi_nitro_images_addr <load_addr> <spi_base_addr>\n" ); |