2 * Copyright (c) 2017-2018, ARM Limited and Contributors. All rights reserved.
4 * SPDX-License-Identifier: BSD-3-Clause
7 #include <arch_helpers.h>
11 #include <firmware_image_package.h>
13 #include <io_driver.h>
15 #include <io_memmap.h>
16 #include <io_storage.h>
18 #include <platform_def.h>
19 #include <semihosting.h> /* For FOPEN_MODE_... */
23 struct plat_io_policy
{
24 uintptr_t *dev_handle
;
26 int (*check
)(const uintptr_t spec
);
29 static const io_dev_connector_t
*ufs_dev_con
, *fip_dev_con
;
30 static uintptr_t ufs_dev_handle
, fip_dev_handle
;
32 static int check_ufs(const uintptr_t spec
);
33 static int check_fip(const uintptr_t spec
);
34 size_t ufs_read_lun3_blks(int lba
, uintptr_t buf
, size_t size
);
35 size_t ufs_write_lun3_blks(int lba
, const uintptr_t buf
, size_t size
);
37 static const io_block_spec_t ufs_fip_spec
= {
38 .offset
= HIKEY960_FIP_BASE
,
39 .length
= HIKEY960_FIP_MAX_SIZE
,
42 static const io_block_dev_spec_t ufs_dev_spec
= {
43 /* It's used as temp buffer in block driver. */
45 .offset
= HIKEY960_UFS_DATA_BASE
,
46 .length
= HIKEY960_UFS_DATA_SIZE
,
49 .read
= ufs_read_lun3_blks
,
50 .write
= ufs_write_lun3_blks
,
52 .block_size
= UFS_BLOCK_SIZE
,
55 static const io_uuid_spec_t scp_bl2_uuid_spec
= {
56 .uuid
= UUID_SCP_FIRMWARE_SCP_BL2
,
59 static const io_uuid_spec_t bl31_uuid_spec
= {
60 .uuid
= UUID_EL3_RUNTIME_FIRMWARE_BL31
,
63 static const io_uuid_spec_t bl32_uuid_spec
= {
64 .uuid
= UUID_SECURE_PAYLOAD_BL32
,
67 static const io_uuid_spec_t bl32_extra1_uuid_spec
= {
68 .uuid
= UUID_SECURE_PAYLOAD_BL32_EXTRA1
,
71 static const io_uuid_spec_t bl32_extra2_uuid_spec
= {
72 .uuid
= UUID_SECURE_PAYLOAD_BL32_EXTRA2
,
75 static const io_uuid_spec_t bl33_uuid_spec
= {
76 .uuid
= UUID_NON_TRUSTED_FIRMWARE_BL33
,
79 #if TRUSTED_BOARD_BOOT
80 static const io_uuid_spec_t trusted_key_cert_uuid_spec
= {
81 .uuid
= UUID_TRUSTED_KEY_CERT
,
84 static const io_uuid_spec_t scp_fw_key_cert_uuid_spec
= {
85 .uuid
= UUID_SCP_FW_KEY_CERT
,
88 static const io_uuid_spec_t soc_fw_key_cert_uuid_spec
= {
89 .uuid
= UUID_SOC_FW_KEY_CERT
,
92 static const io_uuid_spec_t tos_fw_key_cert_uuid_spec
= {
93 .uuid
= UUID_TRUSTED_OS_FW_KEY_CERT
,
96 static const io_uuid_spec_t nt_fw_key_cert_uuid_spec
= {
97 .uuid
= UUID_NON_TRUSTED_FW_KEY_CERT
,
100 static const io_uuid_spec_t scp_fw_cert_uuid_spec
= {
101 .uuid
= UUID_SCP_FW_CONTENT_CERT
,
104 static const io_uuid_spec_t soc_fw_cert_uuid_spec
= {
105 .uuid
= UUID_SOC_FW_CONTENT_CERT
,
108 static const io_uuid_spec_t tos_fw_cert_uuid_spec
= {
109 .uuid
= UUID_TRUSTED_OS_FW_CONTENT_CERT
,
112 static const io_uuid_spec_t nt_fw_cert_uuid_spec
= {
113 .uuid
= UUID_NON_TRUSTED_FW_CONTENT_CERT
,
115 #endif /* TRUSTED_BOARD_BOOT */
117 static const struct plat_io_policy policies
[] = {
120 (uintptr_t)&ufs_fip_spec
,
123 [SCP_BL2_IMAGE_ID
] = {
125 (uintptr_t)&scp_bl2_uuid_spec
,
130 (uintptr_t)&bl31_uuid_spec
,
135 (uintptr_t)&bl32_uuid_spec
,
138 [BL32_EXTRA1_IMAGE_ID
] = {
140 (uintptr_t)&bl32_extra1_uuid_spec
,
143 [BL32_EXTRA2_IMAGE_ID
] = {
145 (uintptr_t)&bl32_extra2_uuid_spec
,
150 (uintptr_t)&bl33_uuid_spec
,
153 #if TRUSTED_BOARD_BOOT
154 [TRUSTED_KEY_CERT_ID
] = {
156 (uintptr_t)&trusted_key_cert_uuid_spec
,
159 [SCP_FW_KEY_CERT_ID
] = {
161 (uintptr_t)&scp_fw_key_cert_uuid_spec
,
164 [SOC_FW_KEY_CERT_ID
] = {
166 (uintptr_t)&soc_fw_key_cert_uuid_spec
,
169 [TRUSTED_OS_FW_KEY_CERT_ID
] = {
171 (uintptr_t)&tos_fw_key_cert_uuid_spec
,
174 [NON_TRUSTED_FW_KEY_CERT_ID
] = {
176 (uintptr_t)&nt_fw_key_cert_uuid_spec
,
179 [SCP_FW_CONTENT_CERT_ID
] = {
181 (uintptr_t)&scp_fw_cert_uuid_spec
,
184 [SOC_FW_CONTENT_CERT_ID
] = {
186 (uintptr_t)&soc_fw_cert_uuid_spec
,
189 [TRUSTED_OS_FW_CONTENT_CERT_ID
] = {
191 (uintptr_t)&tos_fw_cert_uuid_spec
,
194 [NON_TRUSTED_FW_CONTENT_CERT_ID
] = {
196 (uintptr_t)&nt_fw_cert_uuid_spec
,
199 #endif /* TRUSTED_BOARD_BOOT */
202 static int check_ufs(const uintptr_t spec
)
205 uintptr_t local_handle
;
207 result
= io_dev_init(ufs_dev_handle
, (uintptr_t)NULL
);
209 result
= io_open(ufs_dev_handle
, spec
, &local_handle
);
211 io_close(local_handle
);
216 static int check_fip(const uintptr_t spec
)
219 uintptr_t local_image_handle
;
221 /* See if a Firmware Image Package is available */
222 result
= io_dev_init(fip_dev_handle
, (uintptr_t)FIP_IMAGE_ID
);
224 result
= io_open(fip_dev_handle
, spec
, &local_image_handle
);
226 VERBOSE("Using FIP\n");
227 io_close(local_image_handle
);
233 void hikey960_io_setup(void)
237 result
= register_io_dev_block(&ufs_dev_con
);
240 result
= register_io_dev_fip(&fip_dev_con
);
243 result
= io_dev_open(ufs_dev_con
, (uintptr_t)&ufs_dev_spec
,
247 result
= io_dev_open(fip_dev_con
, (uintptr_t)NULL
, &fip_dev_handle
);
250 /* Ignore improbable errors in release builds */
254 /* Return an IO device handle and specification which can be used to access
255 * an image. Use this to enforce platform load policy
257 int plat_get_image_source(unsigned int image_id
, uintptr_t *dev_handle
,
258 uintptr_t *image_spec
)
261 const struct plat_io_policy
*policy
;
263 assert(image_id
< ARRAY_SIZE(policies
));
265 policy
= &policies
[image_id
];
266 result
= policy
->check(policy
->image_spec
);
269 *image_spec
= policy
->image_spec
;
270 *dev_handle
= *(policy
->dev_handle
);
275 size_t ufs_read_lun3_blks(int lba
, uintptr_t buf
, size_t size
)
277 return ufs_read_blocks(3, lba
, buf
, size
);
280 size_t ufs_write_lun3_blks(int lba
, const uintptr_t buf
, size_t size
)
282 return ufs_write_blocks(3, lba
, buf
, size
);