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