1*3b975a14SRyder Lee /* SPDX-License-Identifier: GPL-2.0+ */ 2*3b975a14SRyder Lee /* 3*3b975a14SRyder Lee * MediaTek BootROM header definitions 4*3b975a14SRyder Lee * 5*3b975a14SRyder Lee * Copyright (C) 2018 MediaTek Inc. 6*3b975a14SRyder Lee * Author: Weijie Gao <weijie.gao@mediatek.com> 7*3b975a14SRyder Lee */ 8*3b975a14SRyder Lee 9*3b975a14SRyder Lee #ifndef _MTK_IMAGE_H 10*3b975a14SRyder Lee #define _MTK_IMAGE_H 11*3b975a14SRyder Lee 12*3b975a14SRyder Lee /* Device header definitions */ 13*3b975a14SRyder Lee 14*3b975a14SRyder Lee /* Header for NOR/SD/eMMC */ 15*3b975a14SRyder Lee union gen_boot_header { 16*3b975a14SRyder Lee struct { 17*3b975a14SRyder Lee char name[12]; 18*3b975a14SRyder Lee __le32 version; 19*3b975a14SRyder Lee __le32 size; 20*3b975a14SRyder Lee }; 21*3b975a14SRyder Lee 22*3b975a14SRyder Lee uint8_t pad[0x200]; 23*3b975a14SRyder Lee }; 24*3b975a14SRyder Lee 25*3b975a14SRyder Lee #define EMMC_BOOT_NAME "EMMC_BOOT" 26*3b975a14SRyder Lee #define SF_BOOT_NAME "SF_BOOT" 27*3b975a14SRyder Lee #define SDMMC_BOOT_NAME "SDMMC_BOOT" 28*3b975a14SRyder Lee 29*3b975a14SRyder Lee /* Header for NAND */ 30*3b975a14SRyder Lee union nand_boot_header { 31*3b975a14SRyder Lee struct { 32*3b975a14SRyder Lee char name[12]; 33*3b975a14SRyder Lee char version[4]; 34*3b975a14SRyder Lee char id[8]; 35*3b975a14SRyder Lee __le16 ioif; 36*3b975a14SRyder Lee __le16 pagesize; 37*3b975a14SRyder Lee __le16 addrcycles; 38*3b975a14SRyder Lee __le16 oobsize; 39*3b975a14SRyder Lee __le16 pages_of_block; 40*3b975a14SRyder Lee __le16 numblocks; 41*3b975a14SRyder Lee __le16 writesize_shift; 42*3b975a14SRyder Lee __le16 erasesize_shift; 43*3b975a14SRyder Lee uint8_t dummy[60]; 44*3b975a14SRyder Lee uint8_t ecc_parity[28]; 45*3b975a14SRyder Lee }; 46*3b975a14SRyder Lee 47*3b975a14SRyder Lee uint8_t data[0x80]; 48*3b975a14SRyder Lee }; 49*3b975a14SRyder Lee 50*3b975a14SRyder Lee #define NAND_BOOT_NAME "BOOTLOADER!" 51*3b975a14SRyder Lee #define NAND_BOOT_VERSION "V006" 52*3b975a14SRyder Lee #define NAND_BOOT_ID "NFIINFO" 53*3b975a14SRyder Lee 54*3b975a14SRyder Lee /* BootROM layout header */ 55*3b975a14SRyder Lee struct brom_layout_header { 56*3b975a14SRyder Lee char name[8]; 57*3b975a14SRyder Lee __le32 version; 58*3b975a14SRyder Lee __le32 header_size; 59*3b975a14SRyder Lee __le32 total_size; 60*3b975a14SRyder Lee __le32 magic; 61*3b975a14SRyder Lee __le32 type; 62*3b975a14SRyder Lee __le32 header_size_2; 63*3b975a14SRyder Lee __le32 total_size_2; 64*3b975a14SRyder Lee __le32 unused; 65*3b975a14SRyder Lee }; 66*3b975a14SRyder Lee 67*3b975a14SRyder Lee #define BRLYT_NAME "BRLYT" 68*3b975a14SRyder Lee #define BRLYT_MAGIC 0x42424242 69*3b975a14SRyder Lee 70*3b975a14SRyder Lee enum brlyt_img_type { 71*3b975a14SRyder Lee BRLYT_TYPE_INVALID = 0, 72*3b975a14SRyder Lee BRLYT_TYPE_NAND = 0x10002, 73*3b975a14SRyder Lee BRLYT_TYPE_EMMC = 0x10005, 74*3b975a14SRyder Lee BRLYT_TYPE_NOR = 0x10007, 75*3b975a14SRyder Lee BRLYT_TYPE_SDMMC = 0x10008, 76*3b975a14SRyder Lee BRLYT_TYPE_SNAND = 0x10009 77*3b975a14SRyder Lee }; 78*3b975a14SRyder Lee 79*3b975a14SRyder Lee /* Combined device header for NOR/SD/eMMC */ 80*3b975a14SRyder Lee struct gen_device_header { 81*3b975a14SRyder Lee union gen_boot_header boot; 82*3b975a14SRyder Lee 83*3b975a14SRyder Lee union { 84*3b975a14SRyder Lee struct brom_layout_header brlyt; 85*3b975a14SRyder Lee uint8_t brlyt_pad[0x400]; 86*3b975a14SRyder Lee }; 87*3b975a14SRyder Lee }; 88*3b975a14SRyder Lee 89*3b975a14SRyder Lee /* BootROM header definitions */ 90*3b975a14SRyder Lee struct gfh_common_header { 91*3b975a14SRyder Lee uint8_t magic[3]; 92*3b975a14SRyder Lee uint8_t version; 93*3b975a14SRyder Lee __le16 size; 94*3b975a14SRyder Lee __le16 type; 95*3b975a14SRyder Lee }; 96*3b975a14SRyder Lee 97*3b975a14SRyder Lee #define GFH_HEADER_MAGIC "MMM" 98*3b975a14SRyder Lee 99*3b975a14SRyder Lee #define GFH_TYPE_FILE_INFO 0 100*3b975a14SRyder Lee #define GFH_TYPE_BL_INFO 1 101*3b975a14SRyder Lee #define GFH_TYPE_BROM_CFG 7 102*3b975a14SRyder Lee #define GFH_TYPE_BL_SEC_KEY 3 103*3b975a14SRyder Lee #define GFH_TYPE_ANTI_CLONE 2 104*3b975a14SRyder Lee #define GFH_TYPE_BROM_SEC_CFG 8 105*3b975a14SRyder Lee 106*3b975a14SRyder Lee struct gfh_file_info { 107*3b975a14SRyder Lee struct gfh_common_header gfh; 108*3b975a14SRyder Lee char name[12]; 109*3b975a14SRyder Lee __le32 unused; 110*3b975a14SRyder Lee __le16 file_type; 111*3b975a14SRyder Lee uint8_t flash_type; 112*3b975a14SRyder Lee uint8_t sig_type; 113*3b975a14SRyder Lee __le32 load_addr; 114*3b975a14SRyder Lee __le32 total_size; 115*3b975a14SRyder Lee __le32 max_size; 116*3b975a14SRyder Lee __le32 hdr_size; 117*3b975a14SRyder Lee __le32 sig_size; 118*3b975a14SRyder Lee __le32 jump_offset; 119*3b975a14SRyder Lee __le32 processed; 120*3b975a14SRyder Lee }; 121*3b975a14SRyder Lee 122*3b975a14SRyder Lee #define GFH_FILE_INFO_NAME "FILE_INFO" 123*3b975a14SRyder Lee 124*3b975a14SRyder Lee #define GFH_FLASH_TYPE_GEN 5 125*3b975a14SRyder Lee #define GFH_FLASH_TYPE_NAND 2 126*3b975a14SRyder Lee 127*3b975a14SRyder Lee #define GFH_SIG_TYPE_NONE 0 128*3b975a14SRyder Lee #define GFH_SIG_TYPE_SHA256 1 129*3b975a14SRyder Lee 130*3b975a14SRyder Lee struct gfh_bl_info { 131*3b975a14SRyder Lee struct gfh_common_header gfh; 132*3b975a14SRyder Lee __le32 attr; 133*3b975a14SRyder Lee }; 134*3b975a14SRyder Lee 135*3b975a14SRyder Lee struct gfh_brom_cfg { 136*3b975a14SRyder Lee struct gfh_common_header gfh; 137*3b975a14SRyder Lee __le32 cfg_bits; 138*3b975a14SRyder Lee __le32 usbdl_by_auto_detect_timeout_ms; 139*3b975a14SRyder Lee uint8_t unused[0x48]; 140*3b975a14SRyder Lee __le32 usbdl_by_kcol0_timeout_ms; 141*3b975a14SRyder Lee __le32 usbdl_by_flag_timeout_ms; 142*3b975a14SRyder Lee uint32_t pad; 143*3b975a14SRyder Lee }; 144*3b975a14SRyder Lee 145*3b975a14SRyder Lee #define GFH_BROM_CFG_USBDL_BY_AUTO_DETECT_TIMEOUT_EN 0x02 146*3b975a14SRyder Lee #define GFH_BROM_CFG_USBDL_AUTO_DETECT_DIS 0x10 147*3b975a14SRyder Lee #define GFH_BROM_CFG_USBDL_BY_KCOL0_TIMEOUT_EN 0x80 148*3b975a14SRyder Lee #define GFH_BROM_CFG_USBDL_BY_FLAG_TIMEOUT_EN 0x100 149*3b975a14SRyder Lee 150*3b975a14SRyder Lee struct gfh_bl_sec_key { 151*3b975a14SRyder Lee struct gfh_common_header gfh; 152*3b975a14SRyder Lee uint8_t pad[0x20c]; 153*3b975a14SRyder Lee }; 154*3b975a14SRyder Lee 155*3b975a14SRyder Lee struct gfh_anti_clone { 156*3b975a14SRyder Lee struct gfh_common_header gfh; 157*3b975a14SRyder Lee uint8_t ac_b2k; 158*3b975a14SRyder Lee uint8_t ac_b2c; 159*3b975a14SRyder Lee uint16_t pad; 160*3b975a14SRyder Lee __le32 ac_offset; 161*3b975a14SRyder Lee __le32 ac_len; 162*3b975a14SRyder Lee }; 163*3b975a14SRyder Lee 164*3b975a14SRyder Lee struct gfh_brom_sec_cfg { 165*3b975a14SRyder Lee struct gfh_common_header gfh; 166*3b975a14SRyder Lee __le32 cfg_bits; 167*3b975a14SRyder Lee char customer_name[0x20]; 168*3b975a14SRyder Lee __le32 pad; 169*3b975a14SRyder Lee }; 170*3b975a14SRyder Lee 171*3b975a14SRyder Lee #define BROM_SEC_CFG_JTAG_EN 1 172*3b975a14SRyder Lee #define BROM_SEC_CFG_UART_EN 2 173*3b975a14SRyder Lee 174*3b975a14SRyder Lee struct gfh_header { 175*3b975a14SRyder Lee struct gfh_file_info file_info; 176*3b975a14SRyder Lee struct gfh_bl_info bl_info; 177*3b975a14SRyder Lee struct gfh_brom_cfg brom_cfg; 178*3b975a14SRyder Lee struct gfh_bl_sec_key bl_sec_key; 179*3b975a14SRyder Lee struct gfh_anti_clone anti_clone; 180*3b975a14SRyder Lee struct gfh_brom_sec_cfg brom_sec_cfg; 181*3b975a14SRyder Lee }; 182*3b975a14SRyder Lee 183*3b975a14SRyder Lee /* LK image header */ 184*3b975a14SRyder Lee 185*3b975a14SRyder Lee union lk_hdr { 186*3b975a14SRyder Lee struct { 187*3b975a14SRyder Lee __le32 magic; 188*3b975a14SRyder Lee __le32 size; 189*3b975a14SRyder Lee char name[32]; 190*3b975a14SRyder Lee __le32 loadaddr; 191*3b975a14SRyder Lee __le32 mode; 192*3b975a14SRyder Lee }; 193*3b975a14SRyder Lee 194*3b975a14SRyder Lee uint8_t data[512]; 195*3b975a14SRyder Lee }; 196*3b975a14SRyder Lee 197*3b975a14SRyder Lee #define LK_PART_MAGIC 0x58881688 198*3b975a14SRyder Lee 199*3b975a14SRyder Lee #endif /* _MTK_IMAGE_H */ 200