xref: /rk3399_rockchip-uboot/include/spl_rkfw.h (revision 1cb393f1c829a024c9d1b1e528e5f31c21ae1604)
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