xref: /rk3399_ARM-atf/plat/arm/board/fvp/fvp_io_storage.c (revision 61f72a34250d063da67f4fc2b0eb8c3fda3376be)
1 /*
2  * Copyright (c) 2014-2018, ARM Limited and Contributors. All rights reserved.
3  *
4  * SPDX-License-Identifier: BSD-3-Clause
5  */
6 
7 #include <assert.h>
8 #include <common_def.h>
9 #include <debug.h>
10 #include <io_driver.h>
11 #include <io_semihosting.h>
12 #include <io_storage.h>
13 #include <plat_arm.h>
14 #include <semihosting.h>	/* For FOPEN_MODE_... */
15 
16 /* Semihosting filenames */
17 #define BL2_IMAGE_NAME			"bl2.bin"
18 #define BL31_IMAGE_NAME			"bl31.bin"
19 #define BL32_IMAGE_NAME			"bl32.bin"
20 #define BL33_IMAGE_NAME			"bl33.bin"
21 #define TB_FW_CONFIG_NAME		"fvp_tb_fw_config.dtb"
22 #define HW_CONFIG_NAME			"hw_config.dtb"
23 
24 #if TRUSTED_BOARD_BOOT
25 #define TRUSTED_BOOT_FW_CERT_NAME	"tb_fw.crt"
26 #define TRUSTED_KEY_CERT_NAME		"trusted_key.crt"
27 #define SOC_FW_KEY_CERT_NAME		"soc_fw_key.crt"
28 #define TOS_FW_KEY_CERT_NAME		"tos_fw_key.crt"
29 #define NT_FW_KEY_CERT_NAME		"nt_fw_key.crt"
30 #define SOC_FW_CONTENT_CERT_NAME	"soc_fw_content.crt"
31 #define TOS_FW_CONTENT_CERT_NAME	"tos_fw_content.crt"
32 #define NT_FW_CONTENT_CERT_NAME		"nt_fw_content.crt"
33 #endif /* TRUSTED_BOARD_BOOT */
34 
35 /* IO devices */
36 static const io_dev_connector_t *sh_dev_con;
37 static uintptr_t sh_dev_handle;
38 
39 static const io_file_spec_t sh_file_spec[] = {
40 	[BL2_IMAGE_ID] = {
41 		.path = BL2_IMAGE_NAME,
42 		.mode = FOPEN_MODE_RB
43 	},
44 	[BL31_IMAGE_ID] = {
45 		.path = BL31_IMAGE_NAME,
46 		.mode = FOPEN_MODE_RB
47 	},
48 	[BL32_IMAGE_ID] = {
49 		.path = BL32_IMAGE_NAME,
50 		.mode = FOPEN_MODE_RB
51 	},
52 	[BL33_IMAGE_ID] = {
53 		.path = BL33_IMAGE_NAME,
54 		.mode = FOPEN_MODE_RB
55 	},
56 	[TB_FW_CONFIG_ID] = {
57 		.path = TB_FW_CONFIG_NAME,
58 		.mode = FOPEN_MODE_RB
59 	},
60 	[HW_CONFIG_ID] = {
61 		.path = HW_CONFIG_NAME,
62 		.mode = FOPEN_MODE_RB
63 	},
64 #if TRUSTED_BOARD_BOOT
65 	[TRUSTED_BOOT_FW_CERT_ID] = {
66 		.path = TRUSTED_BOOT_FW_CERT_NAME,
67 		.mode = FOPEN_MODE_RB
68 	},
69 	[TRUSTED_KEY_CERT_ID] = {
70 		.path = TRUSTED_KEY_CERT_NAME,
71 		.mode = FOPEN_MODE_RB
72 	},
73 	[SOC_FW_KEY_CERT_ID] = {
74 		.path = SOC_FW_KEY_CERT_NAME,
75 		.mode = FOPEN_MODE_RB
76 	},
77 	[TRUSTED_OS_FW_KEY_CERT_ID] = {
78 		.path = TOS_FW_KEY_CERT_NAME,
79 		.mode = FOPEN_MODE_RB
80 	},
81 	[NON_TRUSTED_FW_KEY_CERT_ID] = {
82 		.path = NT_FW_KEY_CERT_NAME,
83 		.mode = FOPEN_MODE_RB
84 	},
85 	[SOC_FW_CONTENT_CERT_ID] = {
86 		.path = SOC_FW_CONTENT_CERT_NAME,
87 		.mode = FOPEN_MODE_RB
88 	},
89 	[TRUSTED_OS_FW_CONTENT_CERT_ID] = {
90 		.path = TOS_FW_CONTENT_CERT_NAME,
91 		.mode = FOPEN_MODE_RB
92 	},
93 	[NON_TRUSTED_FW_CONTENT_CERT_ID] = {
94 		.path = NT_FW_CONTENT_CERT_NAME,
95 		.mode = FOPEN_MODE_RB
96 	},
97 #endif /* TRUSTED_BOARD_BOOT */
98 };
99 
100 
101 static int open_semihosting(const uintptr_t spec)
102 {
103 	int result;
104 	uintptr_t local_image_handle;
105 
106 	/* See if the file exists on semi-hosting.*/
107 	result = io_dev_init(sh_dev_handle, (uintptr_t)NULL);
108 	if (result == 0) {
109 		result = io_open(sh_dev_handle, spec, &local_image_handle);
110 		if (result == 0) {
111 			VERBOSE("Using Semi-hosting IO\n");
112 			io_close(local_image_handle);
113 		}
114 	}
115 	return result;
116 }
117 
118 void plat_arm_io_setup(void)
119 {
120 	int io_result;
121 
122 	arm_io_setup();
123 
124 	/* Register the additional IO devices on this platform */
125 	io_result = register_io_dev_sh(&sh_dev_con);
126 	assert(io_result == 0);
127 
128 	/* Open connections to devices and cache the handles */
129 	io_result = io_dev_open(sh_dev_con, (uintptr_t)NULL, &sh_dev_handle);
130 	assert(io_result == 0);
131 
132 	/* Ignore improbable errors in release builds */
133 	(void)io_result;
134 }
135 
136 /*
137  * FVP provides semihosting as an alternative to load images
138  */
139 int plat_arm_get_alt_image_source(unsigned int image_id, uintptr_t *dev_handle,
140 				  uintptr_t *image_spec)
141 {
142 	int result = open_semihosting((const uintptr_t)&sh_file_spec[image_id]);
143 	if (result == 0) {
144 		*dev_handle = sh_dev_handle;
145 		*image_spec = (uintptr_t)&sh_file_spec[image_id];
146 	}
147 
148 	return result;
149 }
150