183d290c5STom Rini /* SPDX-License-Identifier: GPL-2.0+ */ 24e76c077SStefan Agner /* 34e76c077SStefan Agner * (C) Copyright 2009 44e76c077SStefan Agner * Stefano Babic, DENX Software Engineering, sbabic@denx.de. 54e76c077SStefan Agner */ 64e76c077SStefan Agner 74e76c077SStefan Agner #ifndef _IMXIMAGE_H_ 84e76c077SStefan Agner #define _IMXIMAGE_H_ 94e76c077SStefan Agner 104e76c077SStefan Agner #define MAX_HW_CFG_SIZE_V2 220 /* Max number of registers imx can set for v2 */ 114e76c077SStefan Agner #define MAX_PLUGIN_CODE_SIZE (64 * 1024) 124e76c077SStefan Agner #define MAX_HW_CFG_SIZE_V1 60 /* Max number of registers imx can set for v1 */ 134e76c077SStefan Agner #define APP_CODE_BARKER 0xB1 144e76c077SStefan Agner #define DCD_BARKER 0xB17219E9 154e76c077SStefan Agner 1669f06950SBryan O'Donoghue /* Specify the offset of the IVT in the IMX header as expected by BootROM */ 1769f06950SBryan O'Donoghue #define BOOTROM_IVT_HDR_OFFSET 0xC00 1869f06950SBryan O'Donoghue 194e76c077SStefan Agner /* 204e76c077SStefan Agner * NOTE: This file must be kept in sync with arch/arm/include/asm/\ 214e76c077SStefan Agner * mach-imx/imximage.cfg because tools/imximage.c can not 224e76c077SStefan Agner * cross-include headers from arch/arm/ and vice-versa. 234e76c077SStefan Agner */ 244e76c077SStefan Agner #define CMD_DATA_STR "DATA" 254e76c077SStefan Agner 264e76c077SStefan Agner /* Initial Vector Table Offset */ 274e76c077SStefan Agner #define FLASH_OFFSET_UNDEFINED 0xFFFFFFFF 284e76c077SStefan Agner #define FLASH_OFFSET_STANDARD 0x400 294e76c077SStefan Agner #define FLASH_OFFSET_NAND FLASH_OFFSET_STANDARD 304e76c077SStefan Agner #define FLASH_OFFSET_SD FLASH_OFFSET_STANDARD 314e76c077SStefan Agner #define FLASH_OFFSET_SPI FLASH_OFFSET_STANDARD 324e76c077SStefan Agner #define FLASH_OFFSET_ONENAND 0x100 334e76c077SStefan Agner #define FLASH_OFFSET_NOR 0x1000 344e76c077SStefan Agner #define FLASH_OFFSET_SATA FLASH_OFFSET_STANDARD 354e76c077SStefan Agner #define FLASH_OFFSET_QSPI 0x1000 36*6609c266SPeng Fan #define FLASH_OFFSET_FLEXSPI 0x1000 374e76c077SStefan Agner 384e76c077SStefan Agner /* Initial Load Region Size */ 394e76c077SStefan Agner #define FLASH_LOADSIZE_UNDEFINED 0xFFFFFFFF 404e76c077SStefan Agner #define FLASH_LOADSIZE_STANDARD 0x1000 414e76c077SStefan Agner #define FLASH_LOADSIZE_NAND FLASH_LOADSIZE_STANDARD 424e76c077SStefan Agner #define FLASH_LOADSIZE_SD FLASH_LOADSIZE_STANDARD 434e76c077SStefan Agner #define FLASH_LOADSIZE_SPI FLASH_LOADSIZE_STANDARD 444e76c077SStefan Agner #define FLASH_LOADSIZE_ONENAND 0x400 454e76c077SStefan Agner #define FLASH_LOADSIZE_NOR 0x0 /* entire image */ 464e76c077SStefan Agner #define FLASH_LOADSIZE_SATA FLASH_LOADSIZE_STANDARD 474e76c077SStefan Agner #define FLASH_LOADSIZE_QSPI 0x0 /* entire image */ 484e76c077SStefan Agner 494e76c077SStefan Agner /* Command tags and parameters */ 504e76c077SStefan Agner #define IVT_HEADER_TAG 0xD1 514e76c077SStefan Agner #define IVT_VERSION 0x40 52*6609c266SPeng Fan #define IVT_VERSION_V3 0x41 534e76c077SStefan Agner #define DCD_HEADER_TAG 0xD2 544e76c077SStefan Agner #define DCD_VERSION 0x40 554e76c077SStefan Agner #define DCD_WRITE_DATA_COMMAND_TAG 0xCC 564e76c077SStefan Agner #define DCD_WRITE_DATA_PARAM 0x4 574e76c077SStefan Agner #define DCD_WRITE_CLR_BIT_PARAM 0xC 584e76c077SStefan Agner #define DCD_WRITE_SET_BIT_PARAM 0x1C 594e76c077SStefan Agner #define DCD_CHECK_DATA_COMMAND_TAG 0xCF 604e76c077SStefan Agner #define DCD_CHECK_BITS_SET_PARAM 0x14 614e76c077SStefan Agner #define DCD_CHECK_BITS_CLR_PARAM 0x04 624e76c077SStefan Agner 63f4d8fccdSBryan O'Donoghue #ifndef __ASSEMBLY__ 644e76c077SStefan Agner enum imximage_cmd { 654e76c077SStefan Agner CMD_INVALID, 664e76c077SStefan Agner CMD_IMAGE_VERSION, 674e76c077SStefan Agner CMD_BOOT_FROM, 684e76c077SStefan Agner CMD_BOOT_OFFSET, 694e76c077SStefan Agner CMD_WRITE_DATA, 704e76c077SStefan Agner CMD_WRITE_CLR_BIT, 714e76c077SStefan Agner CMD_WRITE_SET_BIT, 724e76c077SStefan Agner CMD_CHECK_BITS_SET, 734e76c077SStefan Agner CMD_CHECK_BITS_CLR, 744e76c077SStefan Agner CMD_CSF, 754e76c077SStefan Agner CMD_PLUGIN, 76*6609c266SPeng Fan /* Follwoing on i.MX8MQ/MM */ 77*6609c266SPeng Fan CMD_FIT, 78*6609c266SPeng Fan CMD_SIGNED_HDMI, 79*6609c266SPeng Fan CMD_LOADER, 80*6609c266SPeng Fan CMD_SECOND_LOADER, 81*6609c266SPeng Fan CMD_DDR_FW, 824e76c077SStefan Agner }; 834e76c077SStefan Agner 844e76c077SStefan Agner enum imximage_fld_types { 854e76c077SStefan Agner CFG_INVALID = -1, 864e76c077SStefan Agner CFG_COMMAND, 874e76c077SStefan Agner CFG_REG_SIZE, 884e76c077SStefan Agner CFG_REG_ADDRESS, 894e76c077SStefan Agner CFG_REG_VALUE 904e76c077SStefan Agner }; 914e76c077SStefan Agner 924e76c077SStefan Agner enum imximage_version { 934e76c077SStefan Agner IMXIMAGE_VER_INVALID = -1, 944e76c077SStefan Agner IMXIMAGE_V1 = 1, 95*6609c266SPeng Fan IMXIMAGE_V2, 96*6609c266SPeng Fan IMXIMAGE_V3 974e76c077SStefan Agner }; 984e76c077SStefan Agner 994e76c077SStefan Agner typedef struct { 1004e76c077SStefan Agner uint32_t type; /* Type of pointer (byte, halfword, word, wait/read) */ 1014e76c077SStefan Agner uint32_t addr; /* Address to write to */ 1024e76c077SStefan Agner uint32_t value; /* Data to write */ 1034e76c077SStefan Agner } dcd_type_addr_data_t; 1044e76c077SStefan Agner 1054e76c077SStefan Agner typedef struct { 1064e76c077SStefan Agner uint32_t barker; /* Barker for sanity check */ 1074e76c077SStefan Agner uint32_t length; /* Device configuration length (without preamble) */ 1084e76c077SStefan Agner } dcd_preamble_t; 1094e76c077SStefan Agner 1104e76c077SStefan Agner typedef struct { 1114e76c077SStefan Agner dcd_preamble_t preamble; 1124e76c077SStefan Agner dcd_type_addr_data_t addr_data[MAX_HW_CFG_SIZE_V1]; 1134e76c077SStefan Agner } dcd_v1_t; 1144e76c077SStefan Agner 1154e76c077SStefan Agner typedef struct { 1164e76c077SStefan Agner uint32_t app_code_jump_vector; 1174e76c077SStefan Agner uint32_t app_code_barker; 1184e76c077SStefan Agner uint32_t app_code_csf; 1194e76c077SStefan Agner uint32_t dcd_ptr_ptr; 1204e76c077SStefan Agner uint32_t super_root_key; 1214e76c077SStefan Agner uint32_t dcd_ptr; 1224e76c077SStefan Agner uint32_t app_dest_ptr; 1234e76c077SStefan Agner } flash_header_v1_t; 1244e76c077SStefan Agner 1254e76c077SStefan Agner typedef struct { 1264e76c077SStefan Agner uint32_t length; /* Length of data to be read from flash */ 1274e76c077SStefan Agner } flash_cfg_parms_t; 1284e76c077SStefan Agner 1294e76c077SStefan Agner typedef struct { 1304e76c077SStefan Agner flash_header_v1_t fhdr; 1314e76c077SStefan Agner dcd_v1_t dcd_table; 1324e76c077SStefan Agner flash_cfg_parms_t ext_header; 1334e76c077SStefan Agner } imx_header_v1_t; 1344e76c077SStefan Agner 1354e76c077SStefan Agner typedef struct { 1364e76c077SStefan Agner uint32_t addr; 1374e76c077SStefan Agner uint32_t value; 1384e76c077SStefan Agner } dcd_addr_data_t; 1394e76c077SStefan Agner 1404e76c077SStefan Agner typedef struct { 1414e76c077SStefan Agner uint8_t tag; 1424e76c077SStefan Agner uint16_t length; 1434e76c077SStefan Agner uint8_t version; 1444e76c077SStefan Agner } __attribute__((packed)) ivt_header_t; 1454e76c077SStefan Agner 1464e76c077SStefan Agner typedef struct { 1474e76c077SStefan Agner uint8_t tag; 1484e76c077SStefan Agner uint16_t length; 1494e76c077SStefan Agner uint8_t param; 1504e76c077SStefan Agner } __attribute__((packed)) write_dcd_command_t; 1514e76c077SStefan Agner 1524e76c077SStefan Agner struct dcd_v2_cmd { 1534e76c077SStefan Agner write_dcd_command_t write_dcd_command; 1544e76c077SStefan Agner dcd_addr_data_t addr_data[MAX_HW_CFG_SIZE_V2]; 1554e76c077SStefan Agner }; 1564e76c077SStefan Agner 1574e76c077SStefan Agner typedef struct { 1584e76c077SStefan Agner ivt_header_t header; 1594e76c077SStefan Agner struct dcd_v2_cmd dcd_cmd; 1604e76c077SStefan Agner uint32_t padding[1]; /* end up on an 8-byte boundary */ 1614e76c077SStefan Agner } dcd_v2_t; 1624e76c077SStefan Agner 1634e76c077SStefan Agner typedef struct { 1644e76c077SStefan Agner uint32_t start; 1654e76c077SStefan Agner uint32_t size; 1664e76c077SStefan Agner uint32_t plugin; 1674e76c077SStefan Agner } boot_data_t; 1684e76c077SStefan Agner 1694e76c077SStefan Agner typedef struct { 1704e76c077SStefan Agner ivt_header_t header; 1714e76c077SStefan Agner uint32_t entry; 1724e76c077SStefan Agner uint32_t reserved1; 1734e76c077SStefan Agner uint32_t dcd_ptr; 1744e76c077SStefan Agner uint32_t boot_data_ptr; 1754e76c077SStefan Agner uint32_t self; 1764e76c077SStefan Agner uint32_t csf; 1774e76c077SStefan Agner uint32_t reserved2; 1784e76c077SStefan Agner } flash_header_v2_t; 1794e76c077SStefan Agner 1804e76c077SStefan Agner typedef struct { 1814e76c077SStefan Agner flash_header_v2_t fhdr; 1824e76c077SStefan Agner boot_data_t boot_data; 1834e76c077SStefan Agner union { 1844e76c077SStefan Agner dcd_v2_t dcd_table; 1854e76c077SStefan Agner char plugin_code[MAX_PLUGIN_CODE_SIZE]; 1864e76c077SStefan Agner } data; 1874e76c077SStefan Agner } imx_header_v2_t; 1884e76c077SStefan Agner 189*6609c266SPeng Fan typedef struct { 190*6609c266SPeng Fan flash_header_v2_t fhdr; 191*6609c266SPeng Fan boot_data_t boot_data; 192*6609c266SPeng Fan uint32_t padding[5]; 193*6609c266SPeng Fan } imx_header_v3_t; 194*6609c266SPeng Fan 1954e76c077SStefan Agner /* The header must be aligned to 4k on MX53 for NAND boot */ 1964e76c077SStefan Agner struct imx_header { 1974e76c077SStefan Agner union { 1984e76c077SStefan Agner imx_header_v1_t hdr_v1; 1994e76c077SStefan Agner imx_header_v2_t hdr_v2; 2004e76c077SStefan Agner } header; 2014e76c077SStefan Agner }; 2024e76c077SStefan Agner 2034e76c077SStefan Agner typedef void (*set_dcd_val_t)(struct imx_header *imxhdr, 2044e76c077SStefan Agner char *name, int lineno, 2054e76c077SStefan Agner int fld, uint32_t value, 2064e76c077SStefan Agner uint32_t off); 2074e76c077SStefan Agner 2084e76c077SStefan Agner typedef void (*set_dcd_param_t)(struct imx_header *imxhdr, uint32_t dcd_len, 2094e76c077SStefan Agner int32_t cmd); 2104e76c077SStefan Agner 2114e76c077SStefan Agner typedef void (*set_dcd_rst_t)(struct imx_header *imxhdr, 2124e76c077SStefan Agner uint32_t dcd_len, 2134e76c077SStefan Agner char *name, int lineno); 2144e76c077SStefan Agner 2154e76c077SStefan Agner typedef void (*set_imx_hdr_t)(struct imx_header *imxhdr, uint32_t dcd_len, 2164e76c077SStefan Agner uint32_t entry_point, uint32_t flash_offset); 2174e76c077SStefan Agner 218f4d8fccdSBryan O'Donoghue #endif /* __ASSEMBLY__ */ 2194e76c077SStefan Agner #endif /* _IMXIMAGE_H_ */ 220