imx8image.h 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273
  1. /* SPDX-License-Identifier: GPL-2.0+ */
  2. /*
  3. * Copyright 2018 NXP
  4. *
  5. * Peng Fan <peng.fan@nxp.com>
  6. */
  7. #ifndef _IMX8IMAGE_H_
  8. #define _IMX8IMAGE_H_
  9. #include <image.h>
  10. #include <inttypes.h>
  11. #include "imagetool.h"
  12. #include "linux/kernel.h"
  13. #define __packed __attribute__((packed))
  14. #define IV_MAX_LEN 32
  15. #define HASH_MAX_LEN 64
  16. #define MAX_NUM_IMGS 6
  17. #define MAX_NUM_SRK_RECORDS 4
  18. #define IVT_HEADER_TAG_B0 0x87
  19. #define IVT_VERSION_B0 0x00
  20. #define IMG_FLAG_HASH_SHA256 0x000
  21. #define IMG_FLAG_HASH_SHA384 0x100
  22. #define IMG_FLAG_HASH_SHA512 0x200
  23. #define IMG_FLAG_ENCRYPTED_MASK 0x400
  24. #define IMG_FLAG_ENCRYPTED_SHIFT 0x0A
  25. #define IMG_FLAG_BOOTFLAGS_MASK 0xFFFF0000
  26. #define IMG_FLAG_BOOTFLAGS_SHIFT 0x10
  27. #define IMG_ARRAY_ENTRY_SIZE 128
  28. #define HEADER_IMG_ARRAY_OFFSET 0x10
  29. #define HASH_TYPE_SHA_256 256
  30. #define HASH_TYPE_SHA_384 384
  31. #define HASH_TYPE_SHA_512 512
  32. #define IMAGE_HASH_ALGO_DEFAULT 384
  33. #define IMAGE_PADDING_DEFAULT 0x1000
  34. #define DCD_ENTRY_ADDR_IN_SCFW 0x240
  35. #define CONTAINER_ALIGNMENT 0x400
  36. #define CONTAINER_FLAGS_DEFAULT 0x10
  37. #define CONTAINER_FUSE_DEFAULT 0x0
  38. #define SIGNATURE_BLOCK_HEADER_LENGTH 0x10
  39. #define MAX_NUM_OF_CONTAINER 2
  40. #define FIRST_CONTAINER_HEADER_LENGTH 0x400
  41. #define BOOT_IMG_META_MU_RID_SHIFT 10
  42. #define BOOT_IMG_META_PART_ID_SHIFT 20
  43. #define IMAGE_A35_DEFAULT_META(PART) (((PART == 0) ? \
  44. PARTITION_ID_AP : PART) << \
  45. BOOT_IMG_META_PART_ID_SHIFT | \
  46. SC_R_MU_0A << \
  47. BOOT_IMG_META_MU_RID_SHIFT | \
  48. SC_R_A35_0)
  49. #define IMAGE_A53_DEFAULT_META(PART) (((PART == 0) ? \
  50. PARTITION_ID_AP : PART) << \
  51. BOOT_IMG_META_PART_ID_SHIFT | \
  52. SC_R_MU_0A << \
  53. BOOT_IMG_META_MU_RID_SHIFT | \
  54. SC_R_A53_0)
  55. #define IMAGE_A72_DEFAULT_META(PART) (((PART == 0) ? \
  56. PARTITION_ID_AP : PART) << \
  57. BOOT_IMG_META_PART_ID_SHIFT | \
  58. SC_R_MU_0A << \
  59. BOOT_IMG_META_MU_RID_SHIFT | \
  60. SC_R_A72_0)
  61. #define IMAGE_M4_0_DEFAULT_META(PART) (((PART == 0) ? \
  62. PARTITION_ID_M4 : PART) << \
  63. BOOT_IMG_META_PART_ID_SHIFT | \
  64. SC_R_M4_0_MU_1A << \
  65. BOOT_IMG_META_MU_RID_SHIFT | \
  66. SC_R_M4_0_PID0)
  67. #define IMAGE_M4_1_DEFAULT_META(PART) (((PART == 0) ? \
  68. PARTITION_ID_M4 : PART) << \
  69. BOOT_IMG_META_PART_ID_SHIFT | \
  70. SC_R_M4_1_MU_1A << \
  71. BOOT_IMG_META_MU_RID_SHIFT | \
  72. SC_R_M4_1_PID0)
  73. #define CONTAINER_IMAGE_ARRAY_START_OFFSET 0x2000
  74. typedef struct {
  75. uint8_t version;
  76. uint16_t length;
  77. uint8_t tag;
  78. uint16_t srk_table_offset;
  79. uint16_t cert_offset;
  80. uint16_t blob_offset;
  81. uint16_t signature_offset;
  82. uint32_t reserved;
  83. } __packed sig_blk_hdr_t;
  84. typedef struct {
  85. uint32_t offset;
  86. uint32_t size;
  87. uint64_t dst;
  88. uint64_t entry;
  89. uint32_t hab_flags;
  90. uint32_t meta;
  91. uint8_t hash[HASH_MAX_LEN];
  92. uint8_t iv[IV_MAX_LEN];
  93. } __packed boot_img_t;
  94. typedef struct {
  95. uint8_t version;
  96. uint16_t length;
  97. uint8_t tag;
  98. uint32_t flags;
  99. uint16_t sw_version;
  100. uint8_t fuse_version;
  101. uint8_t num_images;
  102. uint16_t sig_blk_offset;
  103. uint16_t reserved;
  104. boot_img_t img[MAX_NUM_IMGS];
  105. sig_blk_hdr_t sig_blk_hdr;
  106. uint32_t sigblk_size;
  107. uint32_t padding;
  108. } __packed flash_header_v3_t;
  109. typedef struct {
  110. flash_header_v3_t fhdr[MAX_NUM_OF_CONTAINER];
  111. } __packed imx_header_v3_t;
  112. struct image_array {
  113. char *name;
  114. unsigned int core_type;
  115. unsigned int core_id;
  116. unsigned int load_addr;
  117. };
  118. enum imx8image_cmd {
  119. CMD_INVALID,
  120. CMD_BOOT_FROM,
  121. CMD_FUSE_VERSION,
  122. CMD_SW_VERSION,
  123. CMD_MSG_BLOCK,
  124. CMD_FILEOFF,
  125. CMD_FLAG,
  126. CMD_APPEND,
  127. CMD_PARTITION,
  128. CMD_SOC_TYPE,
  129. CMD_CONTAINER,
  130. CMD_IMAGE,
  131. CMD_DATA
  132. };
  133. enum imx8image_core_type {
  134. CFG_CORE_INVALID,
  135. CFG_SCU,
  136. CFG_M40,
  137. CFG_M41,
  138. CFG_A35,
  139. CFG_A53,
  140. CFG_A72
  141. };
  142. enum imx8image_fld_types {
  143. CFG_INVALID = -1,
  144. CFG_COMMAND,
  145. CFG_CORE_TYPE,
  146. CFG_IMAGE_NAME,
  147. CFG_LOAD_ADDR
  148. };
  149. typedef enum SOC_TYPE {
  150. NONE = 0,
  151. QX,
  152. QM
  153. } soc_type_t;
  154. typedef enum option_type {
  155. NO_IMG = 0,
  156. DCD,
  157. SCFW,
  158. SECO,
  159. M40,
  160. M41,
  161. AP,
  162. OUTPUT,
  163. SCD,
  164. CSF,
  165. FLAG,
  166. DEVICE,
  167. NEW_CONTAINER,
  168. APPEND,
  169. DATA,
  170. PARTITION,
  171. FILEOFF,
  172. MSG_BLOCK
  173. } option_type_t;
  174. typedef struct {
  175. option_type_t option;
  176. char *filename;
  177. uint64_t src;
  178. uint64_t dst;
  179. uint64_t entry;
  180. uint64_t ext;
  181. } image_t;
  182. #define CORE_SC 1
  183. #define CORE_CM4_0 2
  184. #define CORE_CM4_1 3
  185. #define CORE_CA53 4
  186. #define CORE_CA35 4
  187. #define CORE_CA72 5
  188. #define CORE_SECO 6
  189. #define SC_R_OTP 357U
  190. #define SC_R_DEBUG 354U
  191. #define SC_R_ROM_0 236U
  192. #define MSG_DEBUG_EN SC_R_DEBUG
  193. #define MSG_FUSE SC_R_OTP
  194. #define MSG_FIELD SC_R_ROM_0
  195. #define IMG_TYPE_CSF 0x01 /* CSF image type */
  196. #define IMG_TYPE_SCD 0x02 /* SCD image type */
  197. #define IMG_TYPE_EXEC 0x03 /* Executable image type */
  198. #define IMG_TYPE_DATA 0x04 /* Data image type */
  199. #define IMG_TYPE_DCD_DDR 0x05 /* DCD/DDR image type */
  200. #define IMG_TYPE_SECO 0x06 /* SECO image type */
  201. #define IMG_TYPE_PROV 0x07 /* Provisioning image type */
  202. #define IMG_TYPE_DEK 0x08 /* DEK validation type */
  203. #define IMG_TYPE_SHIFT 0
  204. #define IMG_TYPE_MASK 0x1f
  205. #define IMG_TYPE(x) (((x) & IMG_TYPE_MASK) >> IMG_TYPE_SHIFT)
  206. #define BOOT_IMG_FLAGS_CORE_MASK 0xF
  207. #define BOOT_IMG_FLAGS_CORE_SHIFT 0x04
  208. #define BOOT_IMG_FLAGS_CPU_RID_MASK 0x3FF0
  209. #define BOOT_IMG_FLAGS_CPU_RID_SHIFT 4
  210. #define BOOT_IMG_FLAGS_MU_RID_MASK 0xFFC000
  211. #define BOOT_IMG_FLAGS_MU_RID_SHIFT 14
  212. #define BOOT_IMG_FLAGS_PARTITION_ID_MASK 0x1F000000
  213. #define BOOT_IMG_FLAGS_PARTITION_ID_SHIFT 24
  214. /* Resource id used in scfw */
  215. #define SC_R_A35_0 508
  216. #define SC_R_A53_0 1
  217. #define SC_R_A72_0 6
  218. #define SC_R_MU_0A 213
  219. #define SC_R_M4_0_PID0 278
  220. #define SC_R_M4_0_MU_1A 297
  221. #define SC_R_M4_1_PID0 298
  222. #define SC_R_M4_1_MU_1A 317
  223. #define PARTITION_ID_M4 0
  224. #define PARTITION_ID_AP 1
  225. #define IMG_STACK_SIZE 32
  226. #define append(p, s, l) do { \
  227. memcpy((p), (uint8_t *)(s), (l)); (p) += (l); \
  228. } while (0)
  229. #endif