2 * Copyright (c) 2017-2018, ARM Limited and Contributors. All rights reserved.
4 * SPDX-License-Identifier: BSD-3-Clause
11 #include <platform_def.h>
13 #include <drivers/io/io_block.h>
14 #include <drivers/io/io_driver.h>
15 #include <drivers/io/io_fip.h>
16 #include <drivers/io/io_memmap.h>
17 #include <lib/utils_def.h>
18 #include <lib/xlat_tables/xlat_tables_v2.h>
19 #include <tools_share/firmware_image_package.h>
23 #define UNIPHIER_ROM_REGION_BASE 0x00000000ULL
24 #define UNIPHIER_ROM_REGION_SIZE 0x10000000ULL
26 #define UNIPHIER_OCM_REGION_BASE 0x30000000ULL
27 #define UNIPHIER_OCM_REGION_SIZE 0x00040000ULL
29 static const io_dev_connector_t
*uniphier_fip_dev_con
;
30 static uintptr_t uniphier_fip_dev_handle
;
32 static const io_dev_connector_t
*uniphier_backend_dev_con
;
33 static uintptr_t uniphier_backend_dev_handle
;
35 static io_block_spec_t uniphier_fip_spec
= {
36 /* .offset will be set by the io_setup func */
40 static const io_uuid_spec_t uniphier_bl2_spec
= {
41 .uuid
= UUID_TRUSTED_BOOT_FIRMWARE_BL2
,
44 static const io_uuid_spec_t uniphier_scp_spec
= {
45 .uuid
= UUID_SCP_FIRMWARE_SCP_BL2
,
48 static const io_uuid_spec_t uniphier_bl31_spec
= {
49 .uuid
= UUID_EL3_RUNTIME_FIRMWARE_BL31
,
52 static const io_uuid_spec_t uniphier_bl32_spec
= {
53 .uuid
= UUID_SECURE_PAYLOAD_BL32
,
56 static const io_uuid_spec_t uniphier_bl33_spec
= {
57 .uuid
= UUID_NON_TRUSTED_FIRMWARE_BL33
,
60 #if TRUSTED_BOARD_BOOT
61 static const io_uuid_spec_t uniphier_tb_fw_cert_spec
= {
62 .uuid
= UUID_TRUSTED_BOOT_FW_CERT
,
65 static const io_uuid_spec_t uniphier_trusted_key_cert_spec
= {
66 .uuid
= UUID_TRUSTED_KEY_CERT
,
69 static const io_uuid_spec_t uniphier_scp_fw_key_cert_spec
= {
70 .uuid
= UUID_SCP_FW_KEY_CERT
,
73 static const io_uuid_spec_t uniphier_soc_fw_key_cert_spec
= {
74 .uuid
= UUID_SOC_FW_KEY_CERT
,
77 static const io_uuid_spec_t uniphier_tos_fw_key_cert_spec
= {
78 .uuid
= UUID_TRUSTED_OS_FW_KEY_CERT
,
81 static const io_uuid_spec_t uniphier_nt_fw_key_cert_spec
= {
82 .uuid
= UUID_NON_TRUSTED_FW_KEY_CERT
,
85 static const io_uuid_spec_t uniphier_scp_fw_cert_spec
= {
86 .uuid
= UUID_SCP_FW_CONTENT_CERT
,
89 static const io_uuid_spec_t uniphier_soc_fw_cert_spec
= {
90 .uuid
= UUID_SOC_FW_CONTENT_CERT
,
93 static const io_uuid_spec_t uniphier_tos_fw_cert_spec
= {
94 .uuid
= UUID_TRUSTED_OS_FW_CONTENT_CERT
,
97 static const io_uuid_spec_t uniphier_nt_fw_cert_spec
= {
98 .uuid
= UUID_NON_TRUSTED_FW_CONTENT_CERT
,
100 #endif /* TRUSTED_BOARD_BOOT */
102 struct uniphier_io_policy
{
103 uintptr_t *dev_handle
;
104 uintptr_t image_spec
;
105 uintptr_t init_params
;
108 static const struct uniphier_io_policy uniphier_io_policies
[] = {
110 .dev_handle
= &uniphier_backend_dev_handle
,
111 .image_spec
= (uintptr_t)&uniphier_fip_spec
,
114 .dev_handle
= &uniphier_fip_dev_handle
,
115 .image_spec
= (uintptr_t)&uniphier_bl2_spec
,
116 .init_params
= FIP_IMAGE_ID
,
118 [SCP_BL2_IMAGE_ID
] = {
119 .dev_handle
= &uniphier_fip_dev_handle
,
120 .image_spec
= (uintptr_t)&uniphier_scp_spec
,
121 .init_params
= FIP_IMAGE_ID
,
124 .dev_handle
= &uniphier_fip_dev_handle
,
125 .image_spec
= (uintptr_t)&uniphier_bl31_spec
,
126 .init_params
= FIP_IMAGE_ID
,
129 .dev_handle
= &uniphier_fip_dev_handle
,
130 .image_spec
= (uintptr_t)&uniphier_bl32_spec
,
131 .init_params
= FIP_IMAGE_ID
,
134 .dev_handle
= &uniphier_fip_dev_handle
,
135 .image_spec
= (uintptr_t)&uniphier_bl33_spec
,
136 .init_params
= FIP_IMAGE_ID
,
138 #if TRUSTED_BOARD_BOOT
139 [TRUSTED_BOOT_FW_CERT_ID
] = {
140 .dev_handle
= &uniphier_fip_dev_handle
,
141 .image_spec
= (uintptr_t)&uniphier_tb_fw_cert_spec
,
142 .init_params
= FIP_IMAGE_ID
,
144 [TRUSTED_KEY_CERT_ID
] = {
145 .dev_handle
= &uniphier_fip_dev_handle
,
146 .image_spec
= (uintptr_t)&uniphier_trusted_key_cert_spec
,
147 .init_params
= FIP_IMAGE_ID
,
149 [SCP_FW_KEY_CERT_ID
] = {
150 .dev_handle
= &uniphier_fip_dev_handle
,
151 .image_spec
= (uintptr_t)&uniphier_scp_fw_key_cert_spec
,
152 .init_params
= FIP_IMAGE_ID
,
154 [SOC_FW_KEY_CERT_ID
] = {
155 .dev_handle
= &uniphier_fip_dev_handle
,
156 .image_spec
= (uintptr_t)&uniphier_soc_fw_key_cert_spec
,
157 .init_params
= FIP_IMAGE_ID
,
159 [TRUSTED_OS_FW_KEY_CERT_ID
] = {
160 .dev_handle
= &uniphier_fip_dev_handle
,
161 .image_spec
= (uintptr_t)&uniphier_tos_fw_key_cert_spec
,
162 .init_params
= FIP_IMAGE_ID
,
164 [NON_TRUSTED_FW_KEY_CERT_ID
] = {
165 .dev_handle
= &uniphier_fip_dev_handle
,
166 .image_spec
= (uintptr_t)&uniphier_nt_fw_key_cert_spec
,
167 .init_params
= FIP_IMAGE_ID
,
169 [SCP_FW_CONTENT_CERT_ID
] = {
170 .dev_handle
= &uniphier_fip_dev_handle
,
171 .image_spec
= (uintptr_t)&uniphier_scp_fw_cert_spec
,
172 .init_params
= FIP_IMAGE_ID
,
174 [SOC_FW_CONTENT_CERT_ID
] = {
175 .dev_handle
= &uniphier_fip_dev_handle
,
176 .image_spec
= (uintptr_t)&uniphier_soc_fw_cert_spec
,
177 .init_params
= FIP_IMAGE_ID
,
179 [TRUSTED_OS_FW_CONTENT_CERT_ID
] = {
180 .dev_handle
= &uniphier_fip_dev_handle
,
181 .image_spec
= (uintptr_t)&uniphier_tos_fw_cert_spec
,
182 .init_params
= FIP_IMAGE_ID
,
184 [NON_TRUSTED_FW_CONTENT_CERT_ID
] = {
185 .dev_handle
= &uniphier_fip_dev_handle
,
186 .image_spec
= (uintptr_t)&uniphier_nt_fw_cert_spec
,
187 .init_params
= FIP_IMAGE_ID
,
192 static int uniphier_io_block_setup(size_t fip_offset
, uintptr_t block_dev_spec
)
196 uniphier_fip_spec
.offset
= fip_offset
;
198 ret
= register_io_dev_block(&uniphier_backend_dev_con
);
202 return io_dev_open(uniphier_backend_dev_con
, block_dev_spec
,
203 &uniphier_backend_dev_handle
);
206 static int uniphier_io_memmap_setup(size_t fip_offset
)
210 uniphier_fip_spec
.offset
= fip_offset
;
212 ret
= mmap_add_dynamic_region(fip_offset
, fip_offset
,
213 uniphier_fip_spec
.length
,
214 MT_RO_DATA
| MT_SECURE
);
218 ret
= register_io_dev_memmap(&uniphier_backend_dev_con
);
222 return io_dev_open(uniphier_backend_dev_con
, 0,
223 &uniphier_backend_dev_handle
);
226 static int uniphier_io_fip_setup(void)
230 ret
= register_io_dev_fip(&uniphier_fip_dev_con
);
234 return io_dev_open(uniphier_fip_dev_con
, 0, &uniphier_fip_dev_handle
);
237 static int uniphier_io_emmc_setup(unsigned int soc_id
)
239 uintptr_t block_dev_spec
;
242 ret
= uniphier_emmc_init(&block_dev_spec
);
246 return uniphier_io_block_setup(0x20000, block_dev_spec
);
249 static int uniphier_io_nand_setup(unsigned int soc_id
)
251 uintptr_t block_dev_spec
;
254 ret
= uniphier_nand_init(&block_dev_spec
);
258 return uniphier_io_block_setup(0x20000, block_dev_spec
);
261 static int uniphier_io_nor_setup(unsigned int soc_id
)
263 return uniphier_io_memmap_setup(0x70000);
266 static int uniphier_io_usb_setup(unsigned int soc_id
)
268 uintptr_t block_dev_spec
;
271 /* use ROM API for loading images from USB storage */
272 ret
= mmap_add_dynamic_region(UNIPHIER_ROM_REGION_BASE
,
273 UNIPHIER_ROM_REGION_BASE
,
274 UNIPHIER_ROM_REGION_SIZE
,
275 MT_CODE
| MT_SECURE
);
280 * on-chip SRAM region: should be DEVICE attribute because the USB
281 * load functions provided by the ROM use this memory region as a work
282 * area, but do not cater to cache coherency.
284 ret
= mmap_add_dynamic_region(UNIPHIER_OCM_REGION_BASE
,
285 UNIPHIER_OCM_REGION_BASE
,
286 UNIPHIER_OCM_REGION_SIZE
,
287 MT_DEVICE
| MT_RW
| MT_SECURE
);
291 ret
= uniphier_usb_init(soc_id
, &block_dev_spec
);
295 return uniphier_io_block_setup(0x20000, block_dev_spec
);
298 static int (* const uniphier_io_setup_table
[])(unsigned int) = {
299 [UNIPHIER_BOOT_DEVICE_EMMC
] = uniphier_io_emmc_setup
,
300 [UNIPHIER_BOOT_DEVICE_NAND
] = uniphier_io_nand_setup
,
301 [UNIPHIER_BOOT_DEVICE_NOR
] = uniphier_io_nor_setup
,
302 [UNIPHIER_BOOT_DEVICE_USB
] = uniphier_io_usb_setup
,
305 int uniphier_io_setup(unsigned int soc_id
)
307 int (*io_setup
)(unsigned int soc_id
);
308 unsigned int boot_dev
;
311 boot_dev
= uniphier_get_boot_device(soc_id
);
312 if (boot_dev
== UNIPHIER_BOOT_DEVICE_RSV
)
315 io_setup
= uniphier_io_setup_table
[boot_dev
];
316 ret
= io_setup(soc_id
);
320 ret
= uniphier_io_fip_setup();
327 int plat_get_image_source(unsigned int image_id
, uintptr_t *dev_handle
,
328 uintptr_t *image_spec
)
330 uintptr_t init_params
;
332 assert(image_id
< ARRAY_SIZE(uniphier_io_policies
));
334 *dev_handle
= *(uniphier_io_policies
[image_id
].dev_handle
);
335 *image_spec
= uniphier_io_policies
[image_id
].image_spec
;
336 init_params
= uniphier_io_policies
[image_id
].init_params
;
338 return io_dev_init(*dev_handle
, init_params
);