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" 12*1cb393f1SJason Zhu #ifdef CONFIG_SPL_ATF 1313c5d8ecSJoseph Chen #define TBOOT_HEAD_TAG 0x58334c42 /* 'B', 'L', '3', 'X' */ 14*1cb393f1SJason Zhu #else 15*1cb393f1SJason Zhu #define TBOOT_HEAD_TAG "TOS " 16*1cb393f1SJason 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 3513c5d8ecSJoseph Chen #define RKFW_RETRY_SECTOR_SIZE 1024 3613c5d8ecSJoseph Chen #define RKFW_RETRY_SECTOR_TIMES 8 3713c5d8ecSJoseph Chen 3813c5d8ecSJoseph Chen struct s_fip_name_id { 3913c5d8ecSJoseph Chen const char *name; 4013c5d8ecSJoseph Chen const u32 id; 4113c5d8ecSJoseph Chen }; 4213c5d8ecSJoseph Chen 4313c5d8ecSJoseph Chen typedef struct tag_tboot_header_2k { 4413c5d8ecSJoseph Chen u32 tag; 4513c5d8ecSJoseph Chen u32 version; 4613c5d8ecSJoseph Chen u32 flags; 4713c5d8ecSJoseph Chen u32 size; 4813c5d8ecSJoseph Chen u32 reserved1[4]; 4913c5d8ecSJoseph Chen u32 rsa_n[64]; 5013c5d8ecSJoseph Chen u32 rsa_e[64]; 5113c5d8ecSJoseph Chen u32 rsa_c[64]; 5213c5d8ecSJoseph Chen u32 reserved2[312]; 5313c5d8ecSJoseph Chen } tboot_header_2k, *ptboot_header_2k; 5413c5d8ecSJoseph Chen 5513c5d8ecSJoseph Chen typedef struct tag_tboot_header { 5613c5d8ecSJoseph Chen u32 tag; 5713c5d8ecSJoseph Chen u32 version; 5813c5d8ecSJoseph Chen u32 flags; 5913c5d8ecSJoseph Chen u32 size; 6013c5d8ecSJoseph Chen u32 reserved[4]; 6113c5d8ecSJoseph Chen u32 rsa_n[64]; 6213c5d8ecSJoseph Chen u32 rsa_e[64]; 6313c5d8ecSJoseph Chen u32 rsa_c[64]; 6413c5d8ecSJoseph Chen } tboot_header, *ptboot_header; 6513c5d8ecSJoseph Chen 6613c5d8ecSJoseph Chen typedef struct tag_boot_component { 6713c5d8ecSJoseph Chen u32 component_id; 6813c5d8ecSJoseph Chen u32 storage_addr; 6913c5d8ecSJoseph Chen u32 image_size; 7013c5d8ecSJoseph Chen u32 reserved; 7113c5d8ecSJoseph Chen } boot_component, *pboot_component; 7213c5d8ecSJoseph Chen 7313c5d8ecSJoseph Chen typedef struct tag_component_data { 7413c5d8ecSJoseph Chen u32 hash_data[8]; 7513c5d8ecSJoseph Chen u32 load_addr; 7613c5d8ecSJoseph Chen u32 reserved[3]; 7713c5d8ecSJoseph Chen } component_data, *pcomponent_data; 7813c5d8ecSJoseph Chen 7913c5d8ecSJoseph Chen typedef struct tag_tboot_entry { 8013c5d8ecSJoseph Chen boot_component component; 8113c5d8ecSJoseph Chen component_data compdata; 8213c5d8ecSJoseph Chen } tboot_entry, *ptboot_entry; 8313c5d8ecSJoseph Chen 8413c5d8ecSJoseph Chen typedef struct tag_second_loader_hdr { 8513c5d8ecSJoseph Chen unsigned char magic[LOADER_MAGIC_SIZE]; 8613c5d8ecSJoseph Chen unsigned int version; 8713c5d8ecSJoseph Chen unsigned int reserved0; 8813c5d8ecSJoseph Chen unsigned int loader_load_addr; /* physical load addr ,default is 0x60000000 */ 8913c5d8ecSJoseph Chen unsigned int loader_load_size; /* size in bytes */ 9013c5d8ecSJoseph Chen unsigned int crc32; /* crc32 */ 9113c5d8ecSJoseph Chen unsigned int hash_len; /* 20 or 32 , 0 is no hash */ 9213c5d8ecSJoseph Chen unsigned char hash[LOADER_HASH_SIZE]; /* sha */ 9313c5d8ecSJoseph Chen unsigned int js_hash; /* js hsah */ 9413c5d8ecSJoseph Chen unsigned char reserved[1024-32-32-4]; 9513c5d8ecSJoseph Chen unsigned int sign_tag; /* 0x4E474953, 'N' 'G' 'I' 'S' */ 9613c5d8ecSJoseph Chen unsigned int sign_len; /* 256 */ 9713c5d8ecSJoseph Chen unsigned char rsa_hash[256]; 9813c5d8ecSJoseph Chen unsigned char reserved2[2048-1024-256-8]; 9913c5d8ecSJoseph Chen } second_loader_hdr; /* Size:2K */ 10013c5d8ecSJoseph Chen 10113c5d8ecSJoseph Chen /** 10213c5d8ecSJoseph Chen * spl_load_rkfw_image - Load rockchip image(trust and U-Boot) and jump to bl31. 10313c5d8ecSJoseph Chen */ 10413c5d8ecSJoseph Chen int spl_load_rkfw_image(struct spl_image_info *spl_image, 10513c5d8ecSJoseph Chen struct spl_load_info *info, 106*1cb393f1SJason Zhu u32 trust_sector, u32 uboot_sector); 10713c5d8ecSJoseph Chen #endif 108