xref: /OK3568_Linux_fs/u-boot/include/spl_rkfw.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
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