113c5d8ecSJoseph Chen /* SPDX-License-Identifier: GPL-2.0+ */ 213c5d8ecSJoseph Chen /* 313c5d8ecSJoseph Chen * (C) Copyright 2019 Rockchip Electronics Co., Ltd 413c5d8ecSJoseph Chen */ 513c5d8ecSJoseph Chen 613c5d8ecSJoseph Chen #ifndef _SPL_RKFW_H_ 713c5d8ecSJoseph Chen #define _SPL_RKFW_H_ 813c5d8ecSJoseph Chen 913c5d8ecSJoseph Chen #include <spl.h> 1013c5d8ecSJoseph Chen 1113c5d8ecSJoseph Chen #define LOADER_HARD_STR "LOADER" 121cb393f1SJason Zhu #ifdef CONFIG_SPL_ATF 1313c5d8ecSJoseph Chen #define TBOOT_HEAD_TAG 0x58334c42 /* 'B', 'L', '3', 'X' */ 141cb393f1SJason Zhu #else 151cb393f1SJason Zhu #define TBOOT_HEAD_TAG "TOS " 161cb393f1SJason Zhu #endif 1713c5d8ecSJoseph Chen 1813c5d8ecSJoseph Chen #define BL30_IMAGE_NAME "bl30.bin" /* SCP Firmware BL3-0 */ 1913c5d8ecSJoseph Chen #define BL31_IMAGE_NAME "bl31.bin" /* EL3 Runtime Firmware BL31 */ 2013c5d8ecSJoseph Chen #define BL32_IMAGE_NAME "bl32.bin" /* Secure Payload BL32 (Trusted OS) */ 2113c5d8ecSJoseph Chen 2213c5d8ecSJoseph Chen #define UUID_SCP_FIRMWARE_BL30 0x30334c42 /* "BL30" */ 2313c5d8ecSJoseph Chen #define UUID_EL3_RUNTIME_FIRMWARE_BL31 0x31334c42 /* "BL31" */ 2413c5d8ecSJoseph Chen #define UUID_SECURE_PAYLOAD_BL32 0x32334c42 /* "BL32" */ 2513c5d8ecSJoseph Chen 2613c5d8ecSJoseph Chen /* Signature size, unit is byte */ 2713c5d8ecSJoseph Chen #define SIGNATURE_SIZE 256 2813c5d8ecSJoseph Chen #define MAX_BL_CODE_NUM 6 2913c5d8ecSJoseph Chen #define LOADER_MAGIC_SIZE 8 3013c5d8ecSJoseph Chen #define LOADER_HASH_SIZE 32 3113c5d8ecSJoseph Chen 3213c5d8ecSJoseph Chen /* Special value used to verify platform parameters from BL2 to BL3-1 */ 3313c5d8ecSJoseph Chen #define RK_BL31_PLAT_PARAM_VAL 0x0f1e2d3c4b5a6978ULL 3413c5d8ecSJoseph Chen 35*b6135784SJon Lin #ifdef CONFIG_MTD_NAND_CORE 36*b6135784SJon Lin #define RKFW_RETRY_SECTOR_SIZE 256 37*b6135784SJon Lin #define RKFW_RETRY_SECTOR_TIMES 32 38*b6135784SJon Lin #else 3913c5d8ecSJoseph Chen #define RKFW_RETRY_SECTOR_SIZE 1024 4013c5d8ecSJoseph Chen #define RKFW_RETRY_SECTOR_TIMES 8 41*b6135784SJon Lin #endif 4213c5d8ecSJoseph Chen 4313c5d8ecSJoseph Chen struct s_fip_name_id { 4413c5d8ecSJoseph Chen const char *name; 4513c5d8ecSJoseph Chen const u32 id; 4613c5d8ecSJoseph Chen }; 4713c5d8ecSJoseph Chen 4813c5d8ecSJoseph Chen typedef struct tag_tboot_header_2k { 4913c5d8ecSJoseph Chen u32 tag; 5013c5d8ecSJoseph Chen u32 version; 5113c5d8ecSJoseph Chen u32 flags; 5213c5d8ecSJoseph Chen u32 size; 5313c5d8ecSJoseph Chen u32 reserved1[4]; 5413c5d8ecSJoseph Chen u32 rsa_n[64]; 5513c5d8ecSJoseph Chen u32 rsa_e[64]; 5613c5d8ecSJoseph Chen u32 rsa_c[64]; 5713c5d8ecSJoseph Chen u32 reserved2[312]; 5813c5d8ecSJoseph Chen } tboot_header_2k, *ptboot_header_2k; 5913c5d8ecSJoseph Chen 6013c5d8ecSJoseph Chen typedef struct tag_tboot_header { 6113c5d8ecSJoseph Chen u32 tag; 6213c5d8ecSJoseph Chen u32 version; 6313c5d8ecSJoseph Chen u32 flags; 6413c5d8ecSJoseph Chen u32 size; 6513c5d8ecSJoseph Chen u32 reserved[4]; 6613c5d8ecSJoseph Chen u32 rsa_n[64]; 6713c5d8ecSJoseph Chen u32 rsa_e[64]; 6813c5d8ecSJoseph Chen u32 rsa_c[64]; 6913c5d8ecSJoseph Chen } tboot_header, *ptboot_header; 7013c5d8ecSJoseph Chen 7113c5d8ecSJoseph Chen typedef struct tag_boot_component { 7213c5d8ecSJoseph Chen u32 component_id; 7313c5d8ecSJoseph Chen u32 storage_addr; 7413c5d8ecSJoseph Chen u32 image_size; 7513c5d8ecSJoseph Chen u32 reserved; 7613c5d8ecSJoseph Chen } boot_component, *pboot_component; 7713c5d8ecSJoseph Chen 7813c5d8ecSJoseph Chen typedef struct tag_component_data { 7913c5d8ecSJoseph Chen u32 hash_data[8]; 8013c5d8ecSJoseph Chen u32 load_addr; 8113c5d8ecSJoseph Chen u32 reserved[3]; 8213c5d8ecSJoseph Chen } component_data, *pcomponent_data; 8313c5d8ecSJoseph Chen 8413c5d8ecSJoseph Chen typedef struct tag_tboot_entry { 8513c5d8ecSJoseph Chen boot_component component; 8613c5d8ecSJoseph Chen component_data compdata; 8713c5d8ecSJoseph Chen } tboot_entry, *ptboot_entry; 8813c5d8ecSJoseph Chen 8913c5d8ecSJoseph Chen typedef struct tag_second_loader_hdr { 9013c5d8ecSJoseph Chen unsigned char magic[LOADER_MAGIC_SIZE]; 9113c5d8ecSJoseph Chen unsigned int version; 9213c5d8ecSJoseph Chen unsigned int reserved0; 9313c5d8ecSJoseph Chen unsigned int loader_load_addr; /* physical load addr ,default is 0x60000000 */ 9413c5d8ecSJoseph Chen unsigned int loader_load_size; /* size in bytes */ 9513c5d8ecSJoseph Chen unsigned int crc32; /* crc32 */ 9613c5d8ecSJoseph Chen unsigned int hash_len; /* 20 or 32 , 0 is no hash */ 9713c5d8ecSJoseph Chen unsigned char hash[LOADER_HASH_SIZE]; /* sha */ 9813c5d8ecSJoseph Chen unsigned int js_hash; /* js hsah */ 9913c5d8ecSJoseph Chen unsigned char reserved[1024-32-32-4]; 10013c5d8ecSJoseph Chen unsigned int sign_tag; /* 0x4E474953, 'N' 'G' 'I' 'S' */ 10113c5d8ecSJoseph Chen unsigned int sign_len; /* 256 */ 10213c5d8ecSJoseph Chen unsigned char rsa_hash[256]; 10313c5d8ecSJoseph Chen unsigned char reserved2[2048-1024-256-8]; 10413c5d8ecSJoseph Chen } second_loader_hdr; /* Size:2K */ 10513c5d8ecSJoseph Chen 10613c5d8ecSJoseph Chen /** 10713c5d8ecSJoseph Chen * spl_load_rkfw_image - Load rockchip image(trust and U-Boot) and jump to bl31. 10813c5d8ecSJoseph Chen */ 10913c5d8ecSJoseph Chen int spl_load_rkfw_image(struct spl_image_info *spl_image, 1108a5f71e4SJoseph Chen struct spl_load_info *info); 11113c5d8ecSJoseph Chen #endif 112