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