mpi30_image.h 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275
  1. /* SPDX-License-Identifier: GPL-2.0-or-later */
  2. /*
  3. * Copyright 2018-2022 Broadcom Inc. All rights reserved.
  4. */
  5. #ifndef MPI30_IMAGE_H
  6. #define MPI30_IMAGE_H 1
  7. struct mpi3_comp_image_version {
  8. __le16 build_num;
  9. __le16 customer_id;
  10. u8 phase_minor;
  11. u8 phase_major;
  12. u8 gen_minor;
  13. u8 gen_major;
  14. };
  15. struct mpi3_hash_exclusion_format {
  16. __le32 offset;
  17. __le32 size;
  18. };
  19. #define MPI3_IMAGE_HASH_EXCUSION_NUM (4)
  20. struct mpi3_component_image_header {
  21. __le32 signature0;
  22. __le32 load_address;
  23. __le32 data_size;
  24. __le32 start_offset;
  25. __le32 signature1;
  26. __le32 flash_offset;
  27. __le32 image_size;
  28. __le32 version_string_offset;
  29. __le32 build_date_string_offset;
  30. __le32 build_time_string_offset;
  31. __le32 environment_variable_offset;
  32. __le32 application_specific;
  33. __le32 signature2;
  34. __le32 header_size;
  35. __le32 crc;
  36. __le32 flags;
  37. __le32 secondary_flash_offset;
  38. __le32 etp_offset;
  39. __le32 etp_size;
  40. union mpi3_version_union rmc_interface_version;
  41. union mpi3_version_union etp_interface_version;
  42. struct mpi3_comp_image_version component_image_version;
  43. struct mpi3_hash_exclusion_format hash_exclusion[MPI3_IMAGE_HASH_EXCUSION_NUM];
  44. __le32 next_image_header_offset;
  45. union mpi3_version_union security_version;
  46. __le32 reserved84[31];
  47. };
  48. #define MPI3_IMAGE_HEADER_SIGNATURE0_MPI3 (0xeb00003e)
  49. #define MPI3_IMAGE_HEADER_LOAD_ADDRESS_INVALID (0x00000000)
  50. #define MPI3_IMAGE_HEADER_SIGNATURE1_APPLICATION (0x20505041)
  51. #define MPI3_IMAGE_HEADER_SIGNATURE1_FIRST_MUTABLE (0x20434d46)
  52. #define MPI3_IMAGE_HEADER_SIGNATURE1_BSP (0x20505342)
  53. #define MPI3_IMAGE_HEADER_SIGNATURE1_ROM_BIOS (0x534f4942)
  54. #define MPI3_IMAGE_HEADER_SIGNATURE1_HII_X64 (0x4d494948)
  55. #define MPI3_IMAGE_HEADER_SIGNATURE1_HII_ARM (0x41494948)
  56. #define MPI3_IMAGE_HEADER_SIGNATURE1_CPLD (0x444c5043)
  57. #define MPI3_IMAGE_HEADER_SIGNATURE1_SPD (0x20445053)
  58. #define MPI3_IMAGE_HEADER_SIGNATURE1_GAS_GAUGE (0x20534147)
  59. #define MPI3_IMAGE_HEADER_SIGNATURE1_PBLP (0x504c4250)
  60. #define MPI3_IMAGE_HEADER_SIGNATURE1_MANIFEST (0x464e414d)
  61. #define MPI3_IMAGE_HEADER_SIGNATURE1_OEM (0x204d454f)
  62. #define MPI3_IMAGE_HEADER_SIGNATURE1_RMC (0x20434d52)
  63. #define MPI3_IMAGE_HEADER_SIGNATURE1_SMM (0x204d4d53)
  64. #define MPI3_IMAGE_HEADER_SIGNATURE1_PSW (0x20575350)
  65. #define MPI3_IMAGE_HEADER_SIGNATURE2_VALUE (0x50584546)
  66. #define MPI3_IMAGE_HEADER_FLAGS_DEVICE_KEY_BASIS_MASK (0x00000030)
  67. #define MPI3_IMAGE_HEADER_FLAGS_DEVICE_KEY_BASIS_CDI (0x00000000)
  68. #define MPI3_IMAGE_HEADER_FLAGS_DEVICE_KEY_BASIS_DI (0x00000010)
  69. #define MPI3_IMAGE_HEADER_FLAGS_SIGNED_NVDATA (0x00000008)
  70. #define MPI3_IMAGE_HEADER_FLAGS_REQUIRES_ACTIVATION (0x00000004)
  71. #define MPI3_IMAGE_HEADER_FLAGS_COMPRESSED (0x00000002)
  72. #define MPI3_IMAGE_HEADER_FLAGS_FLASH (0x00000001)
  73. #define MPI3_IMAGE_HEADER_SIGNATURE0_OFFSET (0x00)
  74. #define MPI3_IMAGE_HEADER_LOAD_ADDRESS_OFFSET (0x04)
  75. #define MPI3_IMAGE_HEADER_DATA_SIZE_OFFSET (0x08)
  76. #define MPI3_IMAGE_HEADER_START_OFFSET_OFFSET (0x0c)
  77. #define MPI3_IMAGE_HEADER_SIGNATURE1_OFFSET (0x10)
  78. #define MPI3_IMAGE_HEADER_FLASH_OFFSET_OFFSET (0x14)
  79. #define MPI3_IMAGE_HEADER_FLASH_SIZE_OFFSET (0x18)
  80. #define MPI3_IMAGE_HEADER_VERSION_STRING_OFFSET_OFFSET (0x1c)
  81. #define MPI3_IMAGE_HEADER_BUILD_DATE_STRING_OFFSET_OFFSET (0x20)
  82. #define MPI3_IMAGE_HEADER_BUILD_TIME_OFFSET_OFFSET (0x24)
  83. #define MPI3_IMAGE_HEADER_ENVIROMENT_VAR_OFFSET_OFFSET (0x28)
  84. #define MPI3_IMAGE_HEADER_APPLICATION_SPECIFIC_OFFSET (0x2c)
  85. #define MPI3_IMAGE_HEADER_SIGNATURE2_OFFSET (0x30)
  86. #define MPI3_IMAGE_HEADER_HEADER_SIZE_OFFSET (0x34)
  87. #define MPI3_IMAGE_HEADER_CRC_OFFSET (0x38)
  88. #define MPI3_IMAGE_HEADER_FLAGS_OFFSET (0x3c)
  89. #define MPI3_IMAGE_HEADER_SECONDARY_FLASH_OFFSET_OFFSET (0x40)
  90. #define MPI3_IMAGE_HEADER_ETP_OFFSET_OFFSET (0x44)
  91. #define MPI3_IMAGE_HEADER_ETP_SIZE_OFFSET (0x48)
  92. #define MPI3_IMAGE_HEADER_RMC_INTERFACE_VER_OFFSET (0x4c)
  93. #define MPI3_IMAGE_HEADER_ETP_INTERFACE_VER_OFFSET (0x50)
  94. #define MPI3_IMAGE_HEADER_COMPONENT_IMAGE_VER_OFFSET (0x54)
  95. #define MPI3_IMAGE_HEADER_HASH_EXCLUSION_OFFSET (0x5c)
  96. #define MPI3_IMAGE_HEADER_NEXT_IMAGE_HEADER_OFFSET_OFFSET (0x7c)
  97. #define MPI3_IMAGE_HEADER_SIZE (0x100)
  98. #ifndef MPI3_CI_MANIFEST_MPI_MAX
  99. #define MPI3_CI_MANIFEST_MPI_MAX (1)
  100. #endif
  101. struct mpi3_ci_manifest_mpi_comp_image_ref {
  102. __le32 signature1;
  103. __le32 reserved04[3];
  104. struct mpi3_comp_image_version component_image_version;
  105. __le32 component_image_version_string_offset;
  106. __le32 crc;
  107. };
  108. struct mpi3_ci_manifest_mpi {
  109. u8 manifest_type;
  110. u8 reserved01[3];
  111. __le32 reserved04[3];
  112. u8 num_image_references;
  113. u8 release_level;
  114. __le16 reserved12;
  115. __le16 reserved14;
  116. __le16 flags;
  117. __le32 reserved18[2];
  118. __le16 vendor_id;
  119. __le16 device_id;
  120. __le16 subsystem_vendor_id;
  121. __le16 subsystem_id;
  122. __le32 reserved28[2];
  123. union mpi3_version_union package_security_version;
  124. __le32 reserved34;
  125. struct mpi3_comp_image_version package_version;
  126. __le32 package_version_string_offset;
  127. __le32 package_build_date_string_offset;
  128. __le32 package_build_time_string_offset;
  129. __le32 reserved4c;
  130. __le32 diag_authorization_identifier[16];
  131. struct mpi3_ci_manifest_mpi_comp_image_ref component_image_ref[MPI3_CI_MANIFEST_MPI_MAX];
  132. };
  133. #define MPI3_CI_MANIFEST_MPI_RELEASE_LEVEL_DEV (0x00)
  134. #define MPI3_CI_MANIFEST_MPI_RELEASE_LEVEL_PREALPHA (0x10)
  135. #define MPI3_CI_MANIFEST_MPI_RELEASE_LEVEL_ALPHA (0x20)
  136. #define MPI3_CI_MANIFEST_MPI_RELEASE_LEVEL_BETA (0x30)
  137. #define MPI3_CI_MANIFEST_MPI_RELEASE_LEVEL_RC (0x40)
  138. #define MPI3_CI_MANIFEST_MPI_RELEASE_LEVEL_GCA (0x50)
  139. #define MPI3_CI_MANIFEST_MPI_RELEASE_LEVEL_POINT (0x60)
  140. #define MPI3_CI_MANIFEST_MPI_FLAGS_DIAG_AUTHORIZATION (0x01)
  141. #define MPI3_CI_MANIFEST_MPI_SUBSYSTEMID_IGNORED (0xffff)
  142. #define MPI3_CI_MANIFEST_MPI_PKG_VER_STR_OFF_UNSPECIFIED (0x00000000)
  143. #define MPI3_CI_MANIFEST_MPI_PKG_BUILD_DATE_STR_OFF_UNSPECIFIED (0x00000000)
  144. #define MPI3_CI_MANIFEST_MPI_PKG_BUILD_TIME_STR_OFF_UNSPECIFIED (0x00000000)
  145. union mpi3_ci_manifest {
  146. struct mpi3_ci_manifest_mpi mpi;
  147. __le32 dword[1];
  148. };
  149. #define MPI3_CI_MANIFEST_TYPE_MPI (0x00)
  150. struct mpi3_extended_image_header {
  151. u8 image_type;
  152. u8 reserved01[3];
  153. __le32 checksum;
  154. __le32 image_size;
  155. __le32 next_image_header_offset;
  156. __le32 reserved10[4];
  157. __le32 identify_string[8];
  158. };
  159. #define MPI3_EXT_IMAGE_IMAGETYPE_OFFSET (0x00)
  160. #define MPI3_EXT_IMAGE_IMAGESIZE_OFFSET (0x08)
  161. #define MPI3_EXT_IMAGE_NEXTIMAGE_OFFSET (0x0c)
  162. #define MPI3_EXT_IMAGE_HEADER_SIZE (0x40)
  163. #define MPI3_EXT_IMAGE_TYPE_UNSPECIFIED (0x00)
  164. #define MPI3_EXT_IMAGE_TYPE_NVDATA (0x03)
  165. #define MPI3_EXT_IMAGE_TYPE_SUPPORTED_DEVICES (0x07)
  166. #define MPI3_EXT_IMAGE_TYPE_ENCRYPTED_HASH (0x09)
  167. #define MPI3_EXT_IMAGE_TYPE_RDE (0x0a)
  168. #define MPI3_EXT_IMAGE_TYPE_AUXILIARY_PROCESSOR (0x0b)
  169. #define MPI3_EXT_IMAGE_TYPE_MIN_PRODUCT_SPECIFIC (0x80)
  170. #define MPI3_EXT_IMAGE_TYPE_MAX_PRODUCT_SPECIFIC (0xff)
  171. struct mpi3_supported_device {
  172. __le16 device_id;
  173. __le16 vendor_id;
  174. __le16 device_id_mask;
  175. __le16 reserved06;
  176. u8 low_pci_rev;
  177. u8 high_pci_rev;
  178. __le16 reserved0a;
  179. __le32 reserved0c;
  180. };
  181. #ifndef MPI3_SUPPORTED_DEVICE_MAX
  182. #define MPI3_SUPPORTED_DEVICE_MAX (1)
  183. #endif
  184. struct mpi3_supported_devices_data {
  185. u8 image_version;
  186. u8 reserved01;
  187. u8 num_devices;
  188. u8 reserved03;
  189. __le32 reserved04;
  190. struct mpi3_supported_device supported_device[MPI3_SUPPORTED_DEVICE_MAX];
  191. };
  192. #ifndef MPI3_ENCRYPTED_HASH_MAX
  193. #define MPI3_ENCRYPTED_HASH_MAX (1)
  194. #endif
  195. struct mpi3_encrypted_hash_entry {
  196. u8 hash_image_type;
  197. u8 hash_algorithm;
  198. u8 encryption_algorithm;
  199. u8 reserved03;
  200. __le32 reserved04;
  201. __le32 encrypted_hash[MPI3_ENCRYPTED_HASH_MAX];
  202. };
  203. #define MPI3_HASH_IMAGE_TYPE_KEY_WITH_SIGNATURE (0x03)
  204. #define MPI3_HASH_ALGORITHM_VERSION_MASK (0xe0)
  205. #define MPI3_HASH_ALGORITHM_VERSION_NONE (0x00)
  206. #define MPI3_HASH_ALGORITHM_VERSION_SHA1 (0x20)
  207. #define MPI3_HASH_ALGORITHM_VERSION_SHA2 (0x40)
  208. #define MPI3_HASH_ALGORITHM_VERSION_SHA3 (0x60)
  209. #define MPI3_HASH_ALGORITHM_SIZE_MASK (0x1f)
  210. #define MPI3_HASH_ALGORITHM_SIZE_UNUSED (0x00)
  211. #define MPI3_HASH_ALGORITHM_SIZE_SHA256 (0x01)
  212. #define MPI3_HASH_ALGORITHM_SIZE_SHA512 (0x02)
  213. #define MPI3_HASH_ALGORITHM_SIZE_SHA384 (0x03)
  214. #define MPI3_ENCRYPTION_ALGORITHM_UNUSED (0x00)
  215. #define MPI3_ENCRYPTION_ALGORITHM_RSA256 (0x01)
  216. #define MPI3_ENCRYPTION_ALGORITHM_RSA512 (0x02)
  217. #define MPI3_ENCRYPTION_ALGORITHM_RSA1024 (0x03)
  218. #define MPI3_ENCRYPTION_ALGORITHM_RSA2048 (0x04)
  219. #define MPI3_ENCRYPTION_ALGORITHM_RSA4096 (0x05)
  220. #define MPI3_ENCRYPTION_ALGORITHM_RSA3072 (0x06)
  221. #ifndef MPI3_PUBLIC_KEY_MAX
  222. #define MPI3_PUBLIC_KEY_MAX (1)
  223. #endif
  224. struct mpi3_encrypted_key_with_hash_entry {
  225. u8 hash_image_type;
  226. u8 hash_algorithm;
  227. u8 encryption_algorithm;
  228. u8 reserved03;
  229. __le32 reserved04;
  230. __le32 public_key[MPI3_PUBLIC_KEY_MAX];
  231. };
  232. #ifndef MPI3_ENCRYPTED_HASH_ENTRY_MAX
  233. #define MPI3_ENCRYPTED_HASH_ENTRY_MAX (1)
  234. #endif
  235. struct mpi3_encrypted_hash_data {
  236. u8 image_version;
  237. u8 num_hash;
  238. __le16 reserved02;
  239. __le32 reserved04;
  240. struct mpi3_encrypted_hash_entry encrypted_hash_entry[MPI3_ENCRYPTED_HASH_ENTRY_MAX];
  241. };
  242. #ifndef MPI3_AUX_PROC_DATA_MAX
  243. #define MPI3_AUX_PROC_DATA_MAX (1)
  244. #endif
  245. struct mpi3_aux_processor_data {
  246. u8 boot_method;
  247. u8 num_load_addr;
  248. u8 reserved02;
  249. u8 type;
  250. __le32 version;
  251. __le32 load_address[8];
  252. __le32 reserved28[22];
  253. __le32 aux_processor_data[MPI3_AUX_PROC_DATA_MAX];
  254. };
  255. #define MPI3_AUX_PROC_DATA_OFFSET (0x80)
  256. #define MPI3_AUXPROCESSOR_BOOT_METHOD_MO_MSG (0x00)
  257. #define MPI3_AUXPROCESSOR_BOOT_METHOD_MO_DOORBELL (0x01)
  258. #define MPI3_AUXPROCESSOR_BOOT_METHOD_COMPONENT (0x02)
  259. #define MPI3_AUXPROCESSOR_TYPE_ARM_A15 (0x00)
  260. #define MPI3_AUXPROCESSOR_TYPE_ARM_M0 (0x01)
  261. #define MPI3_AUXPROCESSOR_TYPE_ARM_R4 (0x02)
  262. #endif