nitro_image_load.c 2.6 KB

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