xref: /rk3399_ARM-atf/plat/arm/common/fconf/arm_fconf_io.c (revision 9d870b79c16ef09b0c4a9db18e071c2fa235d1ad)
10a6e7e3bSLouis Mayencourt /*
27d111d99SDavid Horstmann  * Copyright (c) 2019-2021, ARM Limited. All rights reserved.
30a6e7e3bSLouis Mayencourt  *
40a6e7e3bSLouis Mayencourt  * SPDX-License-Identifier: BSD-3-Clause
50a6e7e3bSLouis Mayencourt  */
60a6e7e3bSLouis Mayencourt 
70a6e7e3bSLouis Mayencourt #include <assert.h>
80a6e7e3bSLouis Mayencourt 
90a6e7e3bSLouis Mayencourt #include <common/debug.h>
100a6e7e3bSLouis Mayencourt #include <common/fdt_wrappers.h>
110a6e7e3bSLouis Mayencourt #include <drivers/io/io_storage.h>
12ef1daa42SManish V Badarkhe #include <drivers/partition/partition.h>
130a6e7e3bSLouis Mayencourt #include <lib/object_pool.h>
140a6e7e3bSLouis Mayencourt #include <libfdt.h>
150a6e7e3bSLouis Mayencourt #include <tools_share/firmware_image_package.h>
160a6e7e3bSLouis Mayencourt 
170a6e7e3bSLouis Mayencourt #include <plat/arm/common/arm_fconf_getter.h>
180a6e7e3bSLouis Mayencourt #include <plat/arm/common/arm_fconf_io_storage.h>
190a6e7e3bSLouis Mayencourt #include <platform_def.h>
200a6e7e3bSLouis Mayencourt 
212f1177b2SManish V Badarkhe #if PSA_FWU_SUPPORT
222f1177b2SManish V Badarkhe /* metadata entry details */
232f1177b2SManish V Badarkhe static io_block_spec_t fwu_metadata_spec;
242f1177b2SManish V Badarkhe #endif /* PSA_FWU_SUPPORT */
252f1177b2SManish V Badarkhe 
26ef1daa42SManish V Badarkhe io_block_spec_t fip_block_spec = {
27ef1daa42SManish V Badarkhe /*
28ef1daa42SManish V Badarkhe  * This is fixed FIP address used by BL1, BL2 loads partition table
29ef1daa42SManish V Badarkhe  * to get FIP address.
30ef1daa42SManish V Badarkhe  */
31ef1daa42SManish V Badarkhe #if ARM_GPT_SUPPORT
32ef1daa42SManish V Badarkhe 	.offset = PLAT_ARM_FLASH_IMAGE_BASE + PLAT_ARM_FIP_OFFSET_IN_GPT,
33ef1daa42SManish V Badarkhe #else
3449e9ac28SManish V Badarkhe 	.offset = PLAT_ARM_FLASH_IMAGE_BASE,
35ef1daa42SManish V Badarkhe #endif /* ARM_GPT_SUPPORT */
3649e9ac28SManish V Badarkhe 	.length = PLAT_ARM_FLASH_IMAGE_MAX_SIZE
370a6e7e3bSLouis Mayencourt };
380a6e7e3bSLouis Mayencourt 
39ef1daa42SManish V Badarkhe #if ARM_GPT_SUPPORT
40ef1daa42SManish V Badarkhe static const io_block_spec_t gpt_spec = {
41ef1daa42SManish V Badarkhe 	.offset         = PLAT_ARM_FLASH_IMAGE_BASE,
42ef1daa42SManish V Badarkhe 	/*
43ef1daa42SManish V Badarkhe 	 * PLAT_PARTITION_BLOCK_SIZE = 512
44ef1daa42SManish V Badarkhe 	 * PLAT_PARTITION_MAX_ENTRIES = 128
45ef1daa42SManish V Badarkhe 	 * each sector has 4 partition entries, and there are
46ef1daa42SManish V Badarkhe 	 * 2 reserved sectors i.e. protective MBR and primary
47ef1daa42SManish V Badarkhe 	 * GPT header hence length gets calculated as,
48ef1daa42SManish V Badarkhe 	 * length = 512 * (128/4 + 2)
49ef1daa42SManish V Badarkhe 	 */
50ef1daa42SManish V Badarkhe 	.length         = PLAT_PARTITION_BLOCK_SIZE *
51ef1daa42SManish V Badarkhe 			  (PLAT_PARTITION_MAX_ENTRIES / 4 + 2),
52ef1daa42SManish V Badarkhe };
53ef1daa42SManish V Badarkhe #endif /* ARM_GPT_SUPPORT */
54ef1daa42SManish V Badarkhe 
550a6e7e3bSLouis Mayencourt const io_uuid_spec_t arm_uuid_spec[MAX_NUMBER_IDS] = {
560a6e7e3bSLouis Mayencourt 	[BL2_IMAGE_ID] = {UUID_TRUSTED_BOOT_FIRMWARE_BL2},
570a6e7e3bSLouis Mayencourt 	[TB_FW_CONFIG_ID] = {UUID_TB_FW_CONFIG},
58243875eaSLouis Mayencourt 	[FW_CONFIG_ID] = {UUID_FW_CONFIG},
59a6de824fSLouis Mayencourt #if !ARM_IO_IN_DTB
60a6de824fSLouis Mayencourt 	[SCP_BL2_IMAGE_ID] = {UUID_SCP_FIRMWARE_SCP_BL2},
61a6de824fSLouis Mayencourt 	[BL31_IMAGE_ID] = {UUID_EL3_RUNTIME_FIRMWARE_BL31},
62a6de824fSLouis Mayencourt 	[BL32_IMAGE_ID] = {UUID_SECURE_PAYLOAD_BL32},
63a6de824fSLouis Mayencourt 	[BL32_EXTRA1_IMAGE_ID] = {UUID_SECURE_PAYLOAD_BL32_EXTRA1},
64a6de824fSLouis Mayencourt 	[BL32_EXTRA2_IMAGE_ID] = {UUID_SECURE_PAYLOAD_BL32_EXTRA2},
65a6de824fSLouis Mayencourt 	[BL33_IMAGE_ID] = {UUID_NON_TRUSTED_FIRMWARE_BL33},
66a6de824fSLouis Mayencourt 	[HW_CONFIG_ID] = {UUID_HW_CONFIG},
67a6de824fSLouis Mayencourt 	[SOC_FW_CONFIG_ID] = {UUID_SOC_FW_CONFIG},
68a6de824fSLouis Mayencourt 	[TOS_FW_CONFIG_ID] = {UUID_TOS_FW_CONFIG},
69a6de824fSLouis Mayencourt 	[NT_FW_CONFIG_ID] = {UUID_NT_FW_CONFIG},
70*9d870b79SZelalem Aweke 	[RMM_IMAGE_ID] = {UUID_REALM_MONITOR_MGMT_FIRMWARE},
71a6de824fSLouis Mayencourt #endif /* ARM_IO_IN_DTB */
720a6e7e3bSLouis Mayencourt #if TRUSTED_BOARD_BOOT
730a6e7e3bSLouis Mayencourt 	[TRUSTED_BOOT_FW_CERT_ID] = {UUID_TRUSTED_BOOT_FW_CERT},
74a6de824fSLouis Mayencourt #if !ARM_IO_IN_DTB
75a6de824fSLouis Mayencourt 	[TRUSTED_KEY_CERT_ID] = {UUID_TRUSTED_KEY_CERT},
76a6de824fSLouis Mayencourt 	[SCP_FW_KEY_CERT_ID] = {UUID_SCP_FW_KEY_CERT},
77a6de824fSLouis Mayencourt 	[SOC_FW_KEY_CERT_ID] = {UUID_SOC_FW_KEY_CERT},
78a6de824fSLouis Mayencourt 	[TRUSTED_OS_FW_KEY_CERT_ID] = {UUID_TRUSTED_OS_FW_KEY_CERT},
79a6de824fSLouis Mayencourt 	[NON_TRUSTED_FW_KEY_CERT_ID] = {UUID_NON_TRUSTED_FW_KEY_CERT},
80a6de824fSLouis Mayencourt 	[SCP_FW_CONTENT_CERT_ID] = {UUID_SCP_FW_CONTENT_CERT},
81a6de824fSLouis Mayencourt 	[SOC_FW_CONTENT_CERT_ID] = {UUID_SOC_FW_CONTENT_CERT},
82a6de824fSLouis Mayencourt 	[TRUSTED_OS_FW_CONTENT_CERT_ID] = {UUID_TRUSTED_OS_FW_CONTENT_CERT},
83a6de824fSLouis Mayencourt 	[NON_TRUSTED_FW_CONTENT_CERT_ID] = {UUID_NON_TRUSTED_FW_CONTENT_CERT},
8444f1aa8eSManish Pandey #if defined(SPD_spmd)
8503a5225cSManish Pandey 	[SIP_SP_CONTENT_CERT_ID] = {UUID_SIP_SECURE_PARTITION_CONTENT_CERT},
86990d972fSManish Pandey 	[PLAT_SP_CONTENT_CERT_ID] = {UUID_PLAT_SECURE_PARTITION_CONTENT_CERT},
8744f1aa8eSManish Pandey #endif
88a6de824fSLouis Mayencourt #endif /* ARM_IO_IN_DTB */
890a6e7e3bSLouis Mayencourt #endif /* TRUSTED_BOARD_BOOT */
900a6e7e3bSLouis Mayencourt };
910a6e7e3bSLouis Mayencourt 
920a6e7e3bSLouis Mayencourt /* By default, ARM platforms load images from the FIP */
930a6e7e3bSLouis Mayencourt struct plat_io_policy policies[MAX_NUMBER_IDS] = {
94ef1daa42SManish V Badarkhe #if ARM_GPT_SUPPORT
95ef1daa42SManish V Badarkhe 	[GPT_IMAGE_ID] = {
96ef1daa42SManish V Badarkhe 		&memmap_dev_handle,
97ef1daa42SManish V Badarkhe 		(uintptr_t)&gpt_spec,
98ef1daa42SManish V Badarkhe 		open_memmap
99ef1daa42SManish V Badarkhe 	},
100ef1daa42SManish V Badarkhe #endif /* ARM_GPT_SUPPORT */
1012f1177b2SManish V Badarkhe #if PSA_FWU_SUPPORT
1022f1177b2SManish V Badarkhe 	[FWU_METADATA_IMAGE_ID] = {
1032f1177b2SManish V Badarkhe 		&memmap_dev_handle,
1042f1177b2SManish V Badarkhe 		/* filled runtime from partition information */
1052f1177b2SManish V Badarkhe 		(uintptr_t)&fwu_metadata_spec,
1062f1177b2SManish V Badarkhe 		open_memmap
1072f1177b2SManish V Badarkhe 	},
1082f1177b2SManish V Badarkhe 	[BKUP_FWU_METADATA_IMAGE_ID] = {
1092f1177b2SManish V Badarkhe 		&memmap_dev_handle,
1102f1177b2SManish V Badarkhe 		/* filled runtime from partition information */
1112f1177b2SManish V Badarkhe 		(uintptr_t)&fwu_metadata_spec,
1122f1177b2SManish V Badarkhe 		open_memmap
1132f1177b2SManish V Badarkhe 	},
1142f1177b2SManish V Badarkhe #endif /* PSA_FWU_SUPPORT */
1150a6e7e3bSLouis Mayencourt 	[FIP_IMAGE_ID] = {
1160a6e7e3bSLouis Mayencourt 		&memmap_dev_handle,
1170a6e7e3bSLouis Mayencourt 		(uintptr_t)&fip_block_spec,
1180a6e7e3bSLouis Mayencourt 		open_memmap
1190a6e7e3bSLouis Mayencourt 	},
1200a6e7e3bSLouis Mayencourt 	[BL2_IMAGE_ID] = {
1210a6e7e3bSLouis Mayencourt 		&fip_dev_handle,
1220a6e7e3bSLouis Mayencourt 		(uintptr_t)&arm_uuid_spec[BL2_IMAGE_ID],
1230a6e7e3bSLouis Mayencourt 		open_fip
1240a6e7e3bSLouis Mayencourt 	},
1250a6e7e3bSLouis Mayencourt 	[TB_FW_CONFIG_ID] = {
1260a6e7e3bSLouis Mayencourt 		&fip_dev_handle,
1270a6e7e3bSLouis Mayencourt 		(uintptr_t)&arm_uuid_spec[TB_FW_CONFIG_ID],
1280a6e7e3bSLouis Mayencourt 		open_fip
1290a6e7e3bSLouis Mayencourt 	},
130243875eaSLouis Mayencourt 	[FW_CONFIG_ID] = {
131243875eaSLouis Mayencourt 		&fip_dev_handle,
132243875eaSLouis Mayencourt 		(uintptr_t)&arm_uuid_spec[FW_CONFIG_ID],
133243875eaSLouis Mayencourt 		open_fip
134243875eaSLouis Mayencourt 	},
135a6de824fSLouis Mayencourt #if !ARM_IO_IN_DTB
136a6de824fSLouis Mayencourt 	[SCP_BL2_IMAGE_ID] = {
137a6de824fSLouis Mayencourt 		&fip_dev_handle,
138a6de824fSLouis Mayencourt 		(uintptr_t)&arm_uuid_spec[SCP_BL2_IMAGE_ID],
139a6de824fSLouis Mayencourt 		open_fip
140a6de824fSLouis Mayencourt 	},
141a6de824fSLouis Mayencourt 	[BL31_IMAGE_ID] = {
142a6de824fSLouis Mayencourt 		&fip_dev_handle,
143a6de824fSLouis Mayencourt 		(uintptr_t)&arm_uuid_spec[BL31_IMAGE_ID],
144a6de824fSLouis Mayencourt 		open_fip
145a6de824fSLouis Mayencourt 	},
146a6de824fSLouis Mayencourt 	[BL32_IMAGE_ID] = {
147a6de824fSLouis Mayencourt 		&fip_dev_handle,
148a6de824fSLouis Mayencourt 		(uintptr_t)&arm_uuid_spec[BL32_IMAGE_ID],
149a6de824fSLouis Mayencourt 		open_fip
150a6de824fSLouis Mayencourt 	},
151a6de824fSLouis Mayencourt 	[BL32_EXTRA1_IMAGE_ID] = {
152a6de824fSLouis Mayencourt 		&fip_dev_handle,
153a6de824fSLouis Mayencourt 		(uintptr_t)&arm_uuid_spec[BL32_EXTRA1_IMAGE_ID],
154a6de824fSLouis Mayencourt 		open_fip
155a6de824fSLouis Mayencourt 	},
156a6de824fSLouis Mayencourt 	[BL32_EXTRA2_IMAGE_ID] = {
157a6de824fSLouis Mayencourt 		&fip_dev_handle,
158a6de824fSLouis Mayencourt 		(uintptr_t)&arm_uuid_spec[BL32_EXTRA2_IMAGE_ID],
159a6de824fSLouis Mayencourt 		open_fip
160a6de824fSLouis Mayencourt 	},
161a6de824fSLouis Mayencourt 	[BL33_IMAGE_ID] = {
162a6de824fSLouis Mayencourt 		&fip_dev_handle,
163a6de824fSLouis Mayencourt 		(uintptr_t)&arm_uuid_spec[BL33_IMAGE_ID],
164a6de824fSLouis Mayencourt 		open_fip
165a6de824fSLouis Mayencourt 	},
166*9d870b79SZelalem Aweke 	[RMM_IMAGE_ID] = {
167*9d870b79SZelalem Aweke 		&fip_dev_handle,
168*9d870b79SZelalem Aweke 		(uintptr_t)&arm_uuid_spec[RMM_IMAGE_ID],
169*9d870b79SZelalem Aweke 		open_fip
170*9d870b79SZelalem Aweke 	},
171a6de824fSLouis Mayencourt 	[HW_CONFIG_ID] = {
172a6de824fSLouis Mayencourt 		&fip_dev_handle,
173a6de824fSLouis Mayencourt 		(uintptr_t)&arm_uuid_spec[HW_CONFIG_ID],
174a6de824fSLouis Mayencourt 		open_fip
175a6de824fSLouis Mayencourt 	},
176a6de824fSLouis Mayencourt 	[SOC_FW_CONFIG_ID] = {
177a6de824fSLouis Mayencourt 		&fip_dev_handle,
178a6de824fSLouis Mayencourt 		(uintptr_t)&arm_uuid_spec[SOC_FW_CONFIG_ID],
179a6de824fSLouis Mayencourt 		open_fip
180a6de824fSLouis Mayencourt 	},
181a6de824fSLouis Mayencourt 	[TOS_FW_CONFIG_ID] = {
182a6de824fSLouis Mayencourt 		&fip_dev_handle,
183a6de824fSLouis Mayencourt 		(uintptr_t)&arm_uuid_spec[TOS_FW_CONFIG_ID],
184a6de824fSLouis Mayencourt 		open_fip
185a6de824fSLouis Mayencourt 	},
186a6de824fSLouis Mayencourt 	[NT_FW_CONFIG_ID] = {
187a6de824fSLouis Mayencourt 		&fip_dev_handle,
188a6de824fSLouis Mayencourt 		(uintptr_t)&arm_uuid_spec[NT_FW_CONFIG_ID],
189a6de824fSLouis Mayencourt 		open_fip
190a6de824fSLouis Mayencourt 	},
191a6de824fSLouis Mayencourt #endif /* ARM_IO_IN_DTB */
1920a6e7e3bSLouis Mayencourt #if TRUSTED_BOARD_BOOT
1930a6e7e3bSLouis Mayencourt 	[TRUSTED_BOOT_FW_CERT_ID] = {
1940a6e7e3bSLouis Mayencourt 		&fip_dev_handle,
1950a6e7e3bSLouis Mayencourt 		(uintptr_t)&arm_uuid_spec[TRUSTED_BOOT_FW_CERT_ID],
1960a6e7e3bSLouis Mayencourt 		open_fip
1970a6e7e3bSLouis Mayencourt 	},
198a6de824fSLouis Mayencourt #if !ARM_IO_IN_DTB
199a6de824fSLouis Mayencourt 	[TRUSTED_KEY_CERT_ID] = {
200a6de824fSLouis Mayencourt 		&fip_dev_handle,
201a6de824fSLouis Mayencourt 		(uintptr_t)&arm_uuid_spec[TRUSTED_KEY_CERT_ID],
202a6de824fSLouis Mayencourt 		open_fip
203a6de824fSLouis Mayencourt 	},
204a6de824fSLouis Mayencourt 	[SCP_FW_KEY_CERT_ID] = {
205a6de824fSLouis Mayencourt 		&fip_dev_handle,
206a6de824fSLouis Mayencourt 		(uintptr_t)&arm_uuid_spec[SCP_FW_KEY_CERT_ID],
207a6de824fSLouis Mayencourt 		open_fip
208a6de824fSLouis Mayencourt 	},
209a6de824fSLouis Mayencourt 	[SOC_FW_KEY_CERT_ID] = {
210a6de824fSLouis Mayencourt 		&fip_dev_handle,
211a6de824fSLouis Mayencourt 		(uintptr_t)&arm_uuid_spec[SOC_FW_KEY_CERT_ID],
212a6de824fSLouis Mayencourt 		open_fip
213a6de824fSLouis Mayencourt 	},
214a6de824fSLouis Mayencourt 	[TRUSTED_OS_FW_KEY_CERT_ID] = {
215a6de824fSLouis Mayencourt 		&fip_dev_handle,
216a6de824fSLouis Mayencourt 		(uintptr_t)&arm_uuid_spec[TRUSTED_OS_FW_KEY_CERT_ID],
217a6de824fSLouis Mayencourt 		open_fip
218a6de824fSLouis Mayencourt 	},
219a6de824fSLouis Mayencourt 	[NON_TRUSTED_FW_KEY_CERT_ID] = {
220a6de824fSLouis Mayencourt 		&fip_dev_handle,
221a6de824fSLouis Mayencourt 		(uintptr_t)&arm_uuid_spec[NON_TRUSTED_FW_KEY_CERT_ID],
222a6de824fSLouis Mayencourt 		open_fip
223a6de824fSLouis Mayencourt 	},
224a6de824fSLouis Mayencourt 	[SCP_FW_CONTENT_CERT_ID] = {
225a6de824fSLouis Mayencourt 		&fip_dev_handle,
226a6de824fSLouis Mayencourt 		(uintptr_t)&arm_uuid_spec[SCP_FW_CONTENT_CERT_ID],
227a6de824fSLouis Mayencourt 		open_fip
228a6de824fSLouis Mayencourt 	},
229a6de824fSLouis Mayencourt 	[SOC_FW_CONTENT_CERT_ID] = {
230a6de824fSLouis Mayencourt 		&fip_dev_handle,
231a6de824fSLouis Mayencourt 		(uintptr_t)&arm_uuid_spec[SOC_FW_CONTENT_CERT_ID],
232a6de824fSLouis Mayencourt 		open_fip
233a6de824fSLouis Mayencourt 	},
234a6de824fSLouis Mayencourt 	[TRUSTED_OS_FW_CONTENT_CERT_ID] = {
235a6de824fSLouis Mayencourt 		&fip_dev_handle,
236a6de824fSLouis Mayencourt 		(uintptr_t)&arm_uuid_spec[TRUSTED_OS_FW_CONTENT_CERT_ID],
237a6de824fSLouis Mayencourt 		open_fip
238a6de824fSLouis Mayencourt 	},
239a6de824fSLouis Mayencourt 	[NON_TRUSTED_FW_CONTENT_CERT_ID] = {
240a6de824fSLouis Mayencourt 		&fip_dev_handle,
241a6de824fSLouis Mayencourt 		(uintptr_t)&arm_uuid_spec[NON_TRUSTED_FW_CONTENT_CERT_ID],
242a6de824fSLouis Mayencourt 		open_fip
243a6de824fSLouis Mayencourt 	},
24444f1aa8eSManish Pandey #if defined(SPD_spmd)
24503a5225cSManish Pandey 	[SIP_SP_CONTENT_CERT_ID] = {
24644f1aa8eSManish Pandey 		&fip_dev_handle,
24703a5225cSManish Pandey 		(uintptr_t)&arm_uuid_spec[SIP_SP_CONTENT_CERT_ID],
24844f1aa8eSManish Pandey 		open_fip
24944f1aa8eSManish Pandey 	},
250990d972fSManish Pandey 	[PLAT_SP_CONTENT_CERT_ID] = {
251990d972fSManish Pandey 		&fip_dev_handle,
252990d972fSManish Pandey 		(uintptr_t)&arm_uuid_spec[PLAT_SP_CONTENT_CERT_ID],
253990d972fSManish Pandey 		open_fip
254990d972fSManish Pandey 	},
25544f1aa8eSManish Pandey #endif
256a6de824fSLouis Mayencourt #endif /* ARM_IO_IN_DTB */
2570a6e7e3bSLouis Mayencourt #endif /* TRUSTED_BOARD_BOOT */
2580a6e7e3bSLouis Mayencourt };
2590a6e7e3bSLouis Mayencourt 
2600a6e7e3bSLouis Mayencourt #ifdef IMAGE_BL2
2610a6e7e3bSLouis Mayencourt 
2620a6e7e3bSLouis Mayencourt #if TRUSTED_BOARD_BOOT
263990d972fSManish Pandey #define FCONF_ARM_IO_UUID_NUMBER	U(21)
2640a6e7e3bSLouis Mayencourt #else
265845db722SLouis Mayencourt #define FCONF_ARM_IO_UUID_NUMBER	U(10)
2660a6e7e3bSLouis Mayencourt #endif
2670a6e7e3bSLouis Mayencourt 
2680a6e7e3bSLouis Mayencourt static io_uuid_spec_t fconf_arm_uuids[FCONF_ARM_IO_UUID_NUMBER];
2690a6e7e3bSLouis Mayencourt static OBJECT_POOL_ARRAY(fconf_arm_uuids_pool, fconf_arm_uuids);
2700a6e7e3bSLouis Mayencourt 
2710a6e7e3bSLouis Mayencourt struct policies_load_info {
2720a6e7e3bSLouis Mayencourt 	unsigned int image_id;
2730a6e7e3bSLouis Mayencourt 	const char *name;
2740a6e7e3bSLouis Mayencourt };
2750a6e7e3bSLouis Mayencourt 
2760a6e7e3bSLouis Mayencourt /* image id to property name table */
2770a6e7e3bSLouis Mayencourt static const struct policies_load_info load_info[FCONF_ARM_IO_UUID_NUMBER] = {
2780a6e7e3bSLouis Mayencourt 	{SCP_BL2_IMAGE_ID, "scp_bl2_uuid"},
2790a6e7e3bSLouis Mayencourt 	{BL31_IMAGE_ID, "bl31_uuid"},
2800a6e7e3bSLouis Mayencourt 	{BL32_IMAGE_ID, "bl32_uuid"},
2810a6e7e3bSLouis Mayencourt 	{BL32_EXTRA1_IMAGE_ID, "bl32_extra1_uuid"},
2820a6e7e3bSLouis Mayencourt 	{BL32_EXTRA2_IMAGE_ID, "bl32_extra2_uuid"},
2830a6e7e3bSLouis Mayencourt 	{BL33_IMAGE_ID, "bl33_uuid"},
2840a6e7e3bSLouis Mayencourt 	{HW_CONFIG_ID, "hw_cfg_uuid"},
2850a6e7e3bSLouis Mayencourt 	{SOC_FW_CONFIG_ID, "soc_fw_cfg_uuid"},
2860a6e7e3bSLouis Mayencourt 	{TOS_FW_CONFIG_ID, "tos_fw_cfg_uuid"},
2870a6e7e3bSLouis Mayencourt 	{NT_FW_CONFIG_ID, "nt_fw_cfg_uuid"},
2880a6e7e3bSLouis Mayencourt #if TRUSTED_BOARD_BOOT
2890a6e7e3bSLouis Mayencourt 	{TRUSTED_KEY_CERT_ID, "t_key_cert_uuid"},
2900a6e7e3bSLouis Mayencourt 	{SCP_FW_KEY_CERT_ID, "scp_fw_key_uuid"},
2910a6e7e3bSLouis Mayencourt 	{SOC_FW_KEY_CERT_ID, "soc_fw_key_uuid"},
2920a6e7e3bSLouis Mayencourt 	{TRUSTED_OS_FW_KEY_CERT_ID, "tos_fw_key_cert_uuid"},
2930a6e7e3bSLouis Mayencourt 	{NON_TRUSTED_FW_KEY_CERT_ID, "nt_fw_key_cert_uuid"},
2940a6e7e3bSLouis Mayencourt 	{SCP_FW_CONTENT_CERT_ID, "scp_fw_content_cert_uuid"},
2950a6e7e3bSLouis Mayencourt 	{SOC_FW_CONTENT_CERT_ID, "soc_fw_content_cert_uuid"},
2960a6e7e3bSLouis Mayencourt 	{TRUSTED_OS_FW_CONTENT_CERT_ID, "tos_fw_content_cert_uuid"},
2970a6e7e3bSLouis Mayencourt 	{NON_TRUSTED_FW_CONTENT_CERT_ID, "nt_fw_content_cert_uuid"},
29844f1aa8eSManish Pandey #if defined(SPD_spmd)
29903a5225cSManish Pandey 	{SIP_SP_CONTENT_CERT_ID, "sip_sp_content_cert_uuid"},
300990d972fSManish Pandey 	{PLAT_SP_CONTENT_CERT_ID, "plat_sp_content_cert_uuid"},
30144f1aa8eSManish Pandey #endif
3020a6e7e3bSLouis Mayencourt #endif /* TRUSTED_BOARD_BOOT */
3030a6e7e3bSLouis Mayencourt };
3040a6e7e3bSLouis Mayencourt 
3050a6e7e3bSLouis Mayencourt int fconf_populate_arm_io_policies(uintptr_t config)
3060a6e7e3bSLouis Mayencourt {
3070a6e7e3bSLouis Mayencourt 	int err, node;
3080a6e7e3bSLouis Mayencourt 	unsigned int i;
3090a6e7e3bSLouis Mayencourt 
3100a6e7e3bSLouis Mayencourt 	union uuid_helper_t uuid_helper;
3110a6e7e3bSLouis Mayencourt 	io_uuid_spec_t *uuid_ptr;
3120a6e7e3bSLouis Mayencourt 
3130a6e7e3bSLouis Mayencourt 	/* As libfdt uses void *, we can't avoid this cast */
3140a6e7e3bSLouis Mayencourt 	const void *dtb = (void *)config;
3150a6e7e3bSLouis Mayencourt 
3160a6e7e3bSLouis Mayencourt 	/* Assert the node offset point to "arm,io-fip-handle" compatible property */
3170a6e7e3bSLouis Mayencourt 	const char *compatible_str = "arm,io-fip-handle";
3180a6e7e3bSLouis Mayencourt 	node = fdt_node_offset_by_compatible(dtb, -1, compatible_str);
3190a6e7e3bSLouis Mayencourt 	if (node < 0) {
3200a6e7e3bSLouis Mayencourt 		ERROR("FCONF: Can't find %s compatible in dtb\n", compatible_str);
3210a6e7e3bSLouis Mayencourt 		return node;
3220a6e7e3bSLouis Mayencourt 	}
3230a6e7e3bSLouis Mayencourt 
3240a6e7e3bSLouis Mayencourt 	/* Locate the uuid cells and read the value for all the load info uuid */
3250a6e7e3bSLouis Mayencourt 	for (i = 0; i < FCONF_ARM_IO_UUID_NUMBER; i++) {
3260a6e7e3bSLouis Mayencourt 		uuid_ptr = pool_alloc(&fconf_arm_uuids_pool);
3277d111d99SDavid Horstmann 		err = fdtw_read_uuid(dtb, node, load_info[i].name, 16,
3287d111d99SDavid Horstmann 				     (uint8_t *)&uuid_helper);
3290a6e7e3bSLouis Mayencourt 		if (err < 0) {
3300a6e7e3bSLouis Mayencourt 			WARN("FCONF: Read cell failed for %s\n", load_info[i].name);
3310a6e7e3bSLouis Mayencourt 			return err;
3320a6e7e3bSLouis Mayencourt 		}
3330a6e7e3bSLouis Mayencourt 
3347d111d99SDavid Horstmann 		VERBOSE("FCONF: arm-io_policies.%s cell found with value = "
3357d111d99SDavid Horstmann 			"%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x\n",
3360a6e7e3bSLouis Mayencourt 			load_info[i].name,
3377d111d99SDavid Horstmann 			uuid_helper.uuid_struct.time_low[0], uuid_helper.uuid_struct.time_low[1],
3387d111d99SDavid Horstmann 			uuid_helper.uuid_struct.time_low[2], uuid_helper.uuid_struct.time_low[3],
3397d111d99SDavid Horstmann 			uuid_helper.uuid_struct.time_mid[0], uuid_helper.uuid_struct.time_mid[1],
3407d111d99SDavid Horstmann 			uuid_helper.uuid_struct.time_hi_and_version[0],
3417d111d99SDavid Horstmann 			uuid_helper.uuid_struct.time_hi_and_version[1],
3427d111d99SDavid Horstmann 			uuid_helper.uuid_struct.clock_seq_hi_and_reserved,
3437d111d99SDavid Horstmann 			uuid_helper.uuid_struct.clock_seq_low,
3447d111d99SDavid Horstmann 			uuid_helper.uuid_struct.node[0], uuid_helper.uuid_struct.node[1],
3457d111d99SDavid Horstmann 			uuid_helper.uuid_struct.node[2], uuid_helper.uuid_struct.node[3],
3467d111d99SDavid Horstmann 			uuid_helper.uuid_struct.node[4], uuid_helper.uuid_struct.node[5]);
3470a6e7e3bSLouis Mayencourt 
3480a6e7e3bSLouis Mayencourt 		uuid_ptr->uuid = uuid_helper.uuid_struct;
3490a6e7e3bSLouis Mayencourt 		policies[load_info[i].image_id].image_spec = (uintptr_t)uuid_ptr;
3500a6e7e3bSLouis Mayencourt 		policies[load_info[i].image_id].dev_handle = &fip_dev_handle;
3510a6e7e3bSLouis Mayencourt 		policies[load_info[i].image_id].check = open_fip;
3520a6e7e3bSLouis Mayencourt 	}
3530a6e7e3bSLouis Mayencourt 	return 0;
3540a6e7e3bSLouis Mayencourt }
3550a6e7e3bSLouis Mayencourt 
356a6de824fSLouis Mayencourt #if ARM_IO_IN_DTB
35725d740c4SMadhukar Pappireddy FCONF_REGISTER_POPULATOR(TB_FW, arm_io, fconf_populate_arm_io_policies);
358a6de824fSLouis Mayencourt #endif /* ARM_IO_IN_DTB */
3590a6e7e3bSLouis Mayencourt 
3600a6e7e3bSLouis Mayencourt #endif /* IMAGE_BL2 */
361