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