1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0+ */ 2*4882a593Smuzhiyun /* 3*4882a593Smuzhiyun * (C) Copyright 2019 Rockchip Electronics Co., Ltd 4*4882a593Smuzhiyun */ 5*4882a593Smuzhiyun 6*4882a593Smuzhiyun #ifndef _SPL_RKFW_H_ 7*4882a593Smuzhiyun #define _SPL_RKFW_H_ 8*4882a593Smuzhiyun 9*4882a593Smuzhiyun #include <spl.h> 10*4882a593Smuzhiyun 11*4882a593Smuzhiyun #define LOADER_HARD_STR "LOADER" 12*4882a593Smuzhiyun #ifdef CONFIG_SPL_ATF 13*4882a593Smuzhiyun #define TBOOT_HEAD_TAG 0x58334c42 /* 'B', 'L', '3', 'X' */ 14*4882a593Smuzhiyun #else 15*4882a593Smuzhiyun #define TBOOT_HEAD_TAG "TOS " 16*4882a593Smuzhiyun #endif 17*4882a593Smuzhiyun 18*4882a593Smuzhiyun #define BL30_IMAGE_NAME "bl30.bin" /* SCP Firmware BL3-0 */ 19*4882a593Smuzhiyun #define BL31_IMAGE_NAME "bl31.bin" /* EL3 Runtime Firmware BL31 */ 20*4882a593Smuzhiyun #define BL32_IMAGE_NAME "bl32.bin" /* Secure Payload BL32 (Trusted OS) */ 21*4882a593Smuzhiyun 22*4882a593Smuzhiyun #define UUID_SCP_FIRMWARE_BL30 0x30334c42 /* "BL30" */ 23*4882a593Smuzhiyun #define UUID_EL3_RUNTIME_FIRMWARE_BL31 0x31334c42 /* "BL31" */ 24*4882a593Smuzhiyun #define UUID_SECURE_PAYLOAD_BL32 0x32334c42 /* "BL32" */ 25*4882a593Smuzhiyun 26*4882a593Smuzhiyun /* Signature size, unit is byte */ 27*4882a593Smuzhiyun #define SIGNATURE_SIZE 256 28*4882a593Smuzhiyun #define MAX_BL_CODE_NUM 6 29*4882a593Smuzhiyun #define LOADER_MAGIC_SIZE 8 30*4882a593Smuzhiyun #define LOADER_HASH_SIZE 32 31*4882a593Smuzhiyun 32*4882a593Smuzhiyun /* Special value used to verify platform parameters from BL2 to BL3-1 */ 33*4882a593Smuzhiyun #define RK_BL31_PLAT_PARAM_VAL 0x0f1e2d3c4b5a6978ULL 34*4882a593Smuzhiyun 35*4882a593Smuzhiyun #ifdef CONFIG_MTD_NAND_CORE 36*4882a593Smuzhiyun #define RKFW_RETRY_SECTOR_SIZE 256 37*4882a593Smuzhiyun #define RKFW_RETRY_SECTOR_TIMES 32 38*4882a593Smuzhiyun #else 39*4882a593Smuzhiyun #define RKFW_RETRY_SECTOR_SIZE 1024 40*4882a593Smuzhiyun #define RKFW_RETRY_SECTOR_TIMES 8 41*4882a593Smuzhiyun #endif 42*4882a593Smuzhiyun 43*4882a593Smuzhiyun struct s_fip_name_id { 44*4882a593Smuzhiyun const char *name; 45*4882a593Smuzhiyun const u32 id; 46*4882a593Smuzhiyun }; 47*4882a593Smuzhiyun 48*4882a593Smuzhiyun typedef struct tag_tboot_header_2k { 49*4882a593Smuzhiyun u32 tag; 50*4882a593Smuzhiyun u32 version; 51*4882a593Smuzhiyun u32 flags; 52*4882a593Smuzhiyun u32 size; 53*4882a593Smuzhiyun u32 reserved1[4]; 54*4882a593Smuzhiyun u32 rsa_n[64]; 55*4882a593Smuzhiyun u32 rsa_e[64]; 56*4882a593Smuzhiyun u32 rsa_c[64]; 57*4882a593Smuzhiyun u32 reserved2[312]; 58*4882a593Smuzhiyun } tboot_header_2k, *ptboot_header_2k; 59*4882a593Smuzhiyun 60*4882a593Smuzhiyun typedef struct tag_tboot_header { 61*4882a593Smuzhiyun u32 tag; 62*4882a593Smuzhiyun u32 version; 63*4882a593Smuzhiyun u32 flags; 64*4882a593Smuzhiyun u32 size; 65*4882a593Smuzhiyun u32 reserved[4]; 66*4882a593Smuzhiyun u32 rsa_n[64]; 67*4882a593Smuzhiyun u32 rsa_e[64]; 68*4882a593Smuzhiyun u32 rsa_c[64]; 69*4882a593Smuzhiyun } tboot_header, *ptboot_header; 70*4882a593Smuzhiyun 71*4882a593Smuzhiyun typedef struct tag_boot_component { 72*4882a593Smuzhiyun u32 component_id; 73*4882a593Smuzhiyun u32 storage_addr; 74*4882a593Smuzhiyun u32 image_size; 75*4882a593Smuzhiyun u32 reserved; 76*4882a593Smuzhiyun } boot_component, *pboot_component; 77*4882a593Smuzhiyun 78*4882a593Smuzhiyun typedef struct tag_component_data { 79*4882a593Smuzhiyun u32 hash_data[8]; 80*4882a593Smuzhiyun u32 load_addr; 81*4882a593Smuzhiyun u32 reserved[3]; 82*4882a593Smuzhiyun } component_data, *pcomponent_data; 83*4882a593Smuzhiyun 84*4882a593Smuzhiyun typedef struct tag_tboot_entry { 85*4882a593Smuzhiyun boot_component component; 86*4882a593Smuzhiyun component_data compdata; 87*4882a593Smuzhiyun } tboot_entry, *ptboot_entry; 88*4882a593Smuzhiyun 89*4882a593Smuzhiyun typedef struct tag_second_loader_hdr { 90*4882a593Smuzhiyun unsigned char magic[LOADER_MAGIC_SIZE]; 91*4882a593Smuzhiyun unsigned int version; 92*4882a593Smuzhiyun unsigned int reserved0; 93*4882a593Smuzhiyun unsigned int loader_load_addr; /* physical load addr ,default is 0x60000000 */ 94*4882a593Smuzhiyun unsigned int loader_load_size; /* size in bytes */ 95*4882a593Smuzhiyun unsigned int crc32; /* crc32 */ 96*4882a593Smuzhiyun unsigned int hash_len; /* 20 or 32 , 0 is no hash */ 97*4882a593Smuzhiyun unsigned char hash[LOADER_HASH_SIZE]; /* sha */ 98*4882a593Smuzhiyun unsigned int js_hash; /* js hsah */ 99*4882a593Smuzhiyun unsigned char reserved[1024-32-32-4]; 100*4882a593Smuzhiyun unsigned int sign_tag; /* 0x4E474953, 'N' 'G' 'I' 'S' */ 101*4882a593Smuzhiyun unsigned int sign_len; /* 256 */ 102*4882a593Smuzhiyun unsigned char rsa_hash[256]; 103*4882a593Smuzhiyun unsigned char reserved2[2048-1024-256-8]; 104*4882a593Smuzhiyun } second_loader_hdr; /* Size:2K */ 105*4882a593Smuzhiyun 106*4882a593Smuzhiyun /** 107*4882a593Smuzhiyun * spl_load_rkfw_image - Load rockchip image(trust and U-Boot) and jump to bl31. 108*4882a593Smuzhiyun */ 109*4882a593Smuzhiyun int spl_load_rkfw_image(struct spl_image_info *spl_image, 110*4882a593Smuzhiyun struct spl_load_info *info); 111*4882a593Smuzhiyun #endif 112