xref: /rk3399_ARM-atf/plat/arm/common/fconf/arm_fconf_io.c (revision 2f1177b2b9ebec3b2fe92607cd771bda1dc9cbfc)
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 
21*2f1177b2SManish V Badarkhe #if PSA_FWU_SUPPORT
22*2f1177b2SManish V Badarkhe /* metadata entry details */
23*2f1177b2SManish V Badarkhe static io_block_spec_t fwu_metadata_spec;
24*2f1177b2SManish V Badarkhe #endif /* PSA_FWU_SUPPORT */
25*2f1177b2SManish 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},
70a6de824fSLouis Mayencourt #endif /* ARM_IO_IN_DTB */
710a6e7e3bSLouis Mayencourt #if TRUSTED_BOARD_BOOT
720a6e7e3bSLouis Mayencourt 	[TRUSTED_BOOT_FW_CERT_ID] = {UUID_TRUSTED_BOOT_FW_CERT},
73a6de824fSLouis Mayencourt #if !ARM_IO_IN_DTB
74a6de824fSLouis Mayencourt 	[TRUSTED_KEY_CERT_ID] = {UUID_TRUSTED_KEY_CERT},
75a6de824fSLouis Mayencourt 	[SCP_FW_KEY_CERT_ID] = {UUID_SCP_FW_KEY_CERT},
76a6de824fSLouis Mayencourt 	[SOC_FW_KEY_CERT_ID] = {UUID_SOC_FW_KEY_CERT},
77a6de824fSLouis Mayencourt 	[TRUSTED_OS_FW_KEY_CERT_ID] = {UUID_TRUSTED_OS_FW_KEY_CERT},
78a6de824fSLouis Mayencourt 	[NON_TRUSTED_FW_KEY_CERT_ID] = {UUID_NON_TRUSTED_FW_KEY_CERT},
79a6de824fSLouis Mayencourt 	[SCP_FW_CONTENT_CERT_ID] = {UUID_SCP_FW_CONTENT_CERT},
80a6de824fSLouis Mayencourt 	[SOC_FW_CONTENT_CERT_ID] = {UUID_SOC_FW_CONTENT_CERT},
81a6de824fSLouis Mayencourt 	[TRUSTED_OS_FW_CONTENT_CERT_ID] = {UUID_TRUSTED_OS_FW_CONTENT_CERT},
82a6de824fSLouis Mayencourt 	[NON_TRUSTED_FW_CONTENT_CERT_ID] = {UUID_NON_TRUSTED_FW_CONTENT_CERT},
8344f1aa8eSManish Pandey #if defined(SPD_spmd)
8403a5225cSManish Pandey 	[SIP_SP_CONTENT_CERT_ID] = {UUID_SIP_SECURE_PARTITION_CONTENT_CERT},
85990d972fSManish Pandey 	[PLAT_SP_CONTENT_CERT_ID] = {UUID_PLAT_SECURE_PARTITION_CONTENT_CERT},
8644f1aa8eSManish Pandey #endif
87a6de824fSLouis Mayencourt #endif /* ARM_IO_IN_DTB */
880a6e7e3bSLouis Mayencourt #endif /* TRUSTED_BOARD_BOOT */
890a6e7e3bSLouis Mayencourt };
900a6e7e3bSLouis Mayencourt 
910a6e7e3bSLouis Mayencourt /* By default, ARM platforms load images from the FIP */
920a6e7e3bSLouis Mayencourt struct plat_io_policy policies[MAX_NUMBER_IDS] = {
93ef1daa42SManish V Badarkhe #if ARM_GPT_SUPPORT
94ef1daa42SManish V Badarkhe 	[GPT_IMAGE_ID] = {
95ef1daa42SManish V Badarkhe 		&memmap_dev_handle,
96ef1daa42SManish V Badarkhe 		(uintptr_t)&gpt_spec,
97ef1daa42SManish V Badarkhe 		open_memmap
98ef1daa42SManish V Badarkhe 	},
99ef1daa42SManish V Badarkhe #endif /* ARM_GPT_SUPPORT */
100*2f1177b2SManish V Badarkhe #if PSA_FWU_SUPPORT
101*2f1177b2SManish V Badarkhe 	[FWU_METADATA_IMAGE_ID] = {
102*2f1177b2SManish V Badarkhe 		&memmap_dev_handle,
103*2f1177b2SManish V Badarkhe 		/* filled runtime from partition information */
104*2f1177b2SManish V Badarkhe 		(uintptr_t)&fwu_metadata_spec,
105*2f1177b2SManish V Badarkhe 		open_memmap
106*2f1177b2SManish V Badarkhe 	},
107*2f1177b2SManish V Badarkhe 	[BKUP_FWU_METADATA_IMAGE_ID] = {
108*2f1177b2SManish V Badarkhe 		&memmap_dev_handle,
109*2f1177b2SManish V Badarkhe 		/* filled runtime from partition information */
110*2f1177b2SManish V Badarkhe 		(uintptr_t)&fwu_metadata_spec,
111*2f1177b2SManish V Badarkhe 		open_memmap
112*2f1177b2SManish V Badarkhe 	},
113*2f1177b2SManish V Badarkhe #endif /* PSA_FWU_SUPPORT */
1140a6e7e3bSLouis Mayencourt 	[FIP_IMAGE_ID] = {
1150a6e7e3bSLouis Mayencourt 		&memmap_dev_handle,
1160a6e7e3bSLouis Mayencourt 		(uintptr_t)&fip_block_spec,
1170a6e7e3bSLouis Mayencourt 		open_memmap
1180a6e7e3bSLouis Mayencourt 	},
1190a6e7e3bSLouis Mayencourt 	[BL2_IMAGE_ID] = {
1200a6e7e3bSLouis Mayencourt 		&fip_dev_handle,
1210a6e7e3bSLouis Mayencourt 		(uintptr_t)&arm_uuid_spec[BL2_IMAGE_ID],
1220a6e7e3bSLouis Mayencourt 		open_fip
1230a6e7e3bSLouis Mayencourt 	},
1240a6e7e3bSLouis Mayencourt 	[TB_FW_CONFIG_ID] = {
1250a6e7e3bSLouis Mayencourt 		&fip_dev_handle,
1260a6e7e3bSLouis Mayencourt 		(uintptr_t)&arm_uuid_spec[TB_FW_CONFIG_ID],
1270a6e7e3bSLouis Mayencourt 		open_fip
1280a6e7e3bSLouis Mayencourt 	},
129243875eaSLouis Mayencourt 	[FW_CONFIG_ID] = {
130243875eaSLouis Mayencourt 		&fip_dev_handle,
131243875eaSLouis Mayencourt 		(uintptr_t)&arm_uuid_spec[FW_CONFIG_ID],
132243875eaSLouis Mayencourt 		open_fip
133243875eaSLouis Mayencourt 	},
134a6de824fSLouis Mayencourt #if !ARM_IO_IN_DTB
135a6de824fSLouis Mayencourt 	[SCP_BL2_IMAGE_ID] = {
136a6de824fSLouis Mayencourt 		&fip_dev_handle,
137a6de824fSLouis Mayencourt 		(uintptr_t)&arm_uuid_spec[SCP_BL2_IMAGE_ID],
138a6de824fSLouis Mayencourt 		open_fip
139a6de824fSLouis Mayencourt 	},
140a6de824fSLouis Mayencourt 	[BL31_IMAGE_ID] = {
141a6de824fSLouis Mayencourt 		&fip_dev_handle,
142a6de824fSLouis Mayencourt 		(uintptr_t)&arm_uuid_spec[BL31_IMAGE_ID],
143a6de824fSLouis Mayencourt 		open_fip
144a6de824fSLouis Mayencourt 	},
145a6de824fSLouis Mayencourt 	[BL32_IMAGE_ID] = {
146a6de824fSLouis Mayencourt 		&fip_dev_handle,
147a6de824fSLouis Mayencourt 		(uintptr_t)&arm_uuid_spec[BL32_IMAGE_ID],
148a6de824fSLouis Mayencourt 		open_fip
149a6de824fSLouis Mayencourt 	},
150a6de824fSLouis Mayencourt 	[BL32_EXTRA1_IMAGE_ID] = {
151a6de824fSLouis Mayencourt 		&fip_dev_handle,
152a6de824fSLouis Mayencourt 		(uintptr_t)&arm_uuid_spec[BL32_EXTRA1_IMAGE_ID],
153a6de824fSLouis Mayencourt 		open_fip
154a6de824fSLouis Mayencourt 	},
155a6de824fSLouis Mayencourt 	[BL32_EXTRA2_IMAGE_ID] = {
156a6de824fSLouis Mayencourt 		&fip_dev_handle,
157a6de824fSLouis Mayencourt 		(uintptr_t)&arm_uuid_spec[BL32_EXTRA2_IMAGE_ID],
158a6de824fSLouis Mayencourt 		open_fip
159a6de824fSLouis Mayencourt 	},
160a6de824fSLouis Mayencourt 	[BL33_IMAGE_ID] = {
161a6de824fSLouis Mayencourt 		&fip_dev_handle,
162a6de824fSLouis Mayencourt 		(uintptr_t)&arm_uuid_spec[BL33_IMAGE_ID],
163a6de824fSLouis Mayencourt 		open_fip
164a6de824fSLouis Mayencourt 	},
165a6de824fSLouis Mayencourt 	[HW_CONFIG_ID] = {
166a6de824fSLouis Mayencourt 		&fip_dev_handle,
167a6de824fSLouis Mayencourt 		(uintptr_t)&arm_uuid_spec[HW_CONFIG_ID],
168a6de824fSLouis Mayencourt 		open_fip
169a6de824fSLouis Mayencourt 	},
170a6de824fSLouis Mayencourt 	[SOC_FW_CONFIG_ID] = {
171a6de824fSLouis Mayencourt 		&fip_dev_handle,
172a6de824fSLouis Mayencourt 		(uintptr_t)&arm_uuid_spec[SOC_FW_CONFIG_ID],
173a6de824fSLouis Mayencourt 		open_fip
174a6de824fSLouis Mayencourt 	},
175a6de824fSLouis Mayencourt 	[TOS_FW_CONFIG_ID] = {
176a6de824fSLouis Mayencourt 		&fip_dev_handle,
177a6de824fSLouis Mayencourt 		(uintptr_t)&arm_uuid_spec[TOS_FW_CONFIG_ID],
178a6de824fSLouis Mayencourt 		open_fip
179a6de824fSLouis Mayencourt 	},
180a6de824fSLouis Mayencourt 	[NT_FW_CONFIG_ID] = {
181a6de824fSLouis Mayencourt 		&fip_dev_handle,
182a6de824fSLouis Mayencourt 		(uintptr_t)&arm_uuid_spec[NT_FW_CONFIG_ID],
183a6de824fSLouis Mayencourt 		open_fip
184a6de824fSLouis Mayencourt 	},
185a6de824fSLouis Mayencourt #endif /* ARM_IO_IN_DTB */
1860a6e7e3bSLouis Mayencourt #if TRUSTED_BOARD_BOOT
1870a6e7e3bSLouis Mayencourt 	[TRUSTED_BOOT_FW_CERT_ID] = {
1880a6e7e3bSLouis Mayencourt 		&fip_dev_handle,
1890a6e7e3bSLouis Mayencourt 		(uintptr_t)&arm_uuid_spec[TRUSTED_BOOT_FW_CERT_ID],
1900a6e7e3bSLouis Mayencourt 		open_fip
1910a6e7e3bSLouis Mayencourt 	},
192a6de824fSLouis Mayencourt #if !ARM_IO_IN_DTB
193a6de824fSLouis Mayencourt 	[TRUSTED_KEY_CERT_ID] = {
194a6de824fSLouis Mayencourt 		&fip_dev_handle,
195a6de824fSLouis Mayencourt 		(uintptr_t)&arm_uuid_spec[TRUSTED_KEY_CERT_ID],
196a6de824fSLouis Mayencourt 		open_fip
197a6de824fSLouis Mayencourt 	},
198a6de824fSLouis Mayencourt 	[SCP_FW_KEY_CERT_ID] = {
199a6de824fSLouis Mayencourt 		&fip_dev_handle,
200a6de824fSLouis Mayencourt 		(uintptr_t)&arm_uuid_spec[SCP_FW_KEY_CERT_ID],
201a6de824fSLouis Mayencourt 		open_fip
202a6de824fSLouis Mayencourt 	},
203a6de824fSLouis Mayencourt 	[SOC_FW_KEY_CERT_ID] = {
204a6de824fSLouis Mayencourt 		&fip_dev_handle,
205a6de824fSLouis Mayencourt 		(uintptr_t)&arm_uuid_spec[SOC_FW_KEY_CERT_ID],
206a6de824fSLouis Mayencourt 		open_fip
207a6de824fSLouis Mayencourt 	},
208a6de824fSLouis Mayencourt 	[TRUSTED_OS_FW_KEY_CERT_ID] = {
209a6de824fSLouis Mayencourt 		&fip_dev_handle,
210a6de824fSLouis Mayencourt 		(uintptr_t)&arm_uuid_spec[TRUSTED_OS_FW_KEY_CERT_ID],
211a6de824fSLouis Mayencourt 		open_fip
212a6de824fSLouis Mayencourt 	},
213a6de824fSLouis Mayencourt 	[NON_TRUSTED_FW_KEY_CERT_ID] = {
214a6de824fSLouis Mayencourt 		&fip_dev_handle,
215a6de824fSLouis Mayencourt 		(uintptr_t)&arm_uuid_spec[NON_TRUSTED_FW_KEY_CERT_ID],
216a6de824fSLouis Mayencourt 		open_fip
217a6de824fSLouis Mayencourt 	},
218a6de824fSLouis Mayencourt 	[SCP_FW_CONTENT_CERT_ID] = {
219a6de824fSLouis Mayencourt 		&fip_dev_handle,
220a6de824fSLouis Mayencourt 		(uintptr_t)&arm_uuid_spec[SCP_FW_CONTENT_CERT_ID],
221a6de824fSLouis Mayencourt 		open_fip
222a6de824fSLouis Mayencourt 	},
223a6de824fSLouis Mayencourt 	[SOC_FW_CONTENT_CERT_ID] = {
224a6de824fSLouis Mayencourt 		&fip_dev_handle,
225a6de824fSLouis Mayencourt 		(uintptr_t)&arm_uuid_spec[SOC_FW_CONTENT_CERT_ID],
226a6de824fSLouis Mayencourt 		open_fip
227a6de824fSLouis Mayencourt 	},
228a6de824fSLouis Mayencourt 	[TRUSTED_OS_FW_CONTENT_CERT_ID] = {
229a6de824fSLouis Mayencourt 		&fip_dev_handle,
230a6de824fSLouis Mayencourt 		(uintptr_t)&arm_uuid_spec[TRUSTED_OS_FW_CONTENT_CERT_ID],
231a6de824fSLouis Mayencourt 		open_fip
232a6de824fSLouis Mayencourt 	},
233a6de824fSLouis Mayencourt 	[NON_TRUSTED_FW_CONTENT_CERT_ID] = {
234a6de824fSLouis Mayencourt 		&fip_dev_handle,
235a6de824fSLouis Mayencourt 		(uintptr_t)&arm_uuid_spec[NON_TRUSTED_FW_CONTENT_CERT_ID],
236a6de824fSLouis Mayencourt 		open_fip
237a6de824fSLouis Mayencourt 	},
23844f1aa8eSManish Pandey #if defined(SPD_spmd)
23903a5225cSManish Pandey 	[SIP_SP_CONTENT_CERT_ID] = {
24044f1aa8eSManish Pandey 		&fip_dev_handle,
24103a5225cSManish Pandey 		(uintptr_t)&arm_uuid_spec[SIP_SP_CONTENT_CERT_ID],
24244f1aa8eSManish Pandey 		open_fip
24344f1aa8eSManish Pandey 	},
244990d972fSManish Pandey 	[PLAT_SP_CONTENT_CERT_ID] = {
245990d972fSManish Pandey 		&fip_dev_handle,
246990d972fSManish Pandey 		(uintptr_t)&arm_uuid_spec[PLAT_SP_CONTENT_CERT_ID],
247990d972fSManish Pandey 		open_fip
248990d972fSManish Pandey 	},
24944f1aa8eSManish Pandey #endif
250a6de824fSLouis Mayencourt #endif /* ARM_IO_IN_DTB */
2510a6e7e3bSLouis Mayencourt #endif /* TRUSTED_BOARD_BOOT */
2520a6e7e3bSLouis Mayencourt };
2530a6e7e3bSLouis Mayencourt 
2540a6e7e3bSLouis Mayencourt #ifdef IMAGE_BL2
2550a6e7e3bSLouis Mayencourt 
2560a6e7e3bSLouis Mayencourt #if TRUSTED_BOARD_BOOT
257990d972fSManish Pandey #define FCONF_ARM_IO_UUID_NUMBER	U(21)
2580a6e7e3bSLouis Mayencourt #else
259845db722SLouis Mayencourt #define FCONF_ARM_IO_UUID_NUMBER	U(10)
2600a6e7e3bSLouis Mayencourt #endif
2610a6e7e3bSLouis Mayencourt 
2620a6e7e3bSLouis Mayencourt static io_uuid_spec_t fconf_arm_uuids[FCONF_ARM_IO_UUID_NUMBER];
2630a6e7e3bSLouis Mayencourt static OBJECT_POOL_ARRAY(fconf_arm_uuids_pool, fconf_arm_uuids);
2640a6e7e3bSLouis Mayencourt 
2650a6e7e3bSLouis Mayencourt struct policies_load_info {
2660a6e7e3bSLouis Mayencourt 	unsigned int image_id;
2670a6e7e3bSLouis Mayencourt 	const char *name;
2680a6e7e3bSLouis Mayencourt };
2690a6e7e3bSLouis Mayencourt 
2700a6e7e3bSLouis Mayencourt /* image id to property name table */
2710a6e7e3bSLouis Mayencourt static const struct policies_load_info load_info[FCONF_ARM_IO_UUID_NUMBER] = {
2720a6e7e3bSLouis Mayencourt 	{SCP_BL2_IMAGE_ID, "scp_bl2_uuid"},
2730a6e7e3bSLouis Mayencourt 	{BL31_IMAGE_ID, "bl31_uuid"},
2740a6e7e3bSLouis Mayencourt 	{BL32_IMAGE_ID, "bl32_uuid"},
2750a6e7e3bSLouis Mayencourt 	{BL32_EXTRA1_IMAGE_ID, "bl32_extra1_uuid"},
2760a6e7e3bSLouis Mayencourt 	{BL32_EXTRA2_IMAGE_ID, "bl32_extra2_uuid"},
2770a6e7e3bSLouis Mayencourt 	{BL33_IMAGE_ID, "bl33_uuid"},
2780a6e7e3bSLouis Mayencourt 	{HW_CONFIG_ID, "hw_cfg_uuid"},
2790a6e7e3bSLouis Mayencourt 	{SOC_FW_CONFIG_ID, "soc_fw_cfg_uuid"},
2800a6e7e3bSLouis Mayencourt 	{TOS_FW_CONFIG_ID, "tos_fw_cfg_uuid"},
2810a6e7e3bSLouis Mayencourt 	{NT_FW_CONFIG_ID, "nt_fw_cfg_uuid"},
2820a6e7e3bSLouis Mayencourt #if TRUSTED_BOARD_BOOT
2830a6e7e3bSLouis Mayencourt 	{TRUSTED_KEY_CERT_ID, "t_key_cert_uuid"},
2840a6e7e3bSLouis Mayencourt 	{SCP_FW_KEY_CERT_ID, "scp_fw_key_uuid"},
2850a6e7e3bSLouis Mayencourt 	{SOC_FW_KEY_CERT_ID, "soc_fw_key_uuid"},
2860a6e7e3bSLouis Mayencourt 	{TRUSTED_OS_FW_KEY_CERT_ID, "tos_fw_key_cert_uuid"},
2870a6e7e3bSLouis Mayencourt 	{NON_TRUSTED_FW_KEY_CERT_ID, "nt_fw_key_cert_uuid"},
2880a6e7e3bSLouis Mayencourt 	{SCP_FW_CONTENT_CERT_ID, "scp_fw_content_cert_uuid"},
2890a6e7e3bSLouis Mayencourt 	{SOC_FW_CONTENT_CERT_ID, "soc_fw_content_cert_uuid"},
2900a6e7e3bSLouis Mayencourt 	{TRUSTED_OS_FW_CONTENT_CERT_ID, "tos_fw_content_cert_uuid"},
2910a6e7e3bSLouis Mayencourt 	{NON_TRUSTED_FW_CONTENT_CERT_ID, "nt_fw_content_cert_uuid"},
29244f1aa8eSManish Pandey #if defined(SPD_spmd)
29303a5225cSManish Pandey 	{SIP_SP_CONTENT_CERT_ID, "sip_sp_content_cert_uuid"},
294990d972fSManish Pandey 	{PLAT_SP_CONTENT_CERT_ID, "plat_sp_content_cert_uuid"},
29544f1aa8eSManish Pandey #endif
2960a6e7e3bSLouis Mayencourt #endif /* TRUSTED_BOARD_BOOT */
2970a6e7e3bSLouis Mayencourt };
2980a6e7e3bSLouis Mayencourt 
2990a6e7e3bSLouis Mayencourt int fconf_populate_arm_io_policies(uintptr_t config)
3000a6e7e3bSLouis Mayencourt {
3010a6e7e3bSLouis Mayencourt 	int err, node;
3020a6e7e3bSLouis Mayencourt 	unsigned int i;
3030a6e7e3bSLouis Mayencourt 
3040a6e7e3bSLouis Mayencourt 	union uuid_helper_t uuid_helper;
3050a6e7e3bSLouis Mayencourt 	io_uuid_spec_t *uuid_ptr;
3060a6e7e3bSLouis Mayencourt 
3070a6e7e3bSLouis Mayencourt 	/* As libfdt uses void *, we can't avoid this cast */
3080a6e7e3bSLouis Mayencourt 	const void *dtb = (void *)config;
3090a6e7e3bSLouis Mayencourt 
3100a6e7e3bSLouis Mayencourt 	/* Assert the node offset point to "arm,io-fip-handle" compatible property */
3110a6e7e3bSLouis Mayencourt 	const char *compatible_str = "arm,io-fip-handle";
3120a6e7e3bSLouis Mayencourt 	node = fdt_node_offset_by_compatible(dtb, -1, compatible_str);
3130a6e7e3bSLouis Mayencourt 	if (node < 0) {
3140a6e7e3bSLouis Mayencourt 		ERROR("FCONF: Can't find %s compatible in dtb\n", compatible_str);
3150a6e7e3bSLouis Mayencourt 		return node;
3160a6e7e3bSLouis Mayencourt 	}
3170a6e7e3bSLouis Mayencourt 
3180a6e7e3bSLouis Mayencourt 	/* Locate the uuid cells and read the value for all the load info uuid */
3190a6e7e3bSLouis Mayencourt 	for (i = 0; i < FCONF_ARM_IO_UUID_NUMBER; i++) {
3200a6e7e3bSLouis Mayencourt 		uuid_ptr = pool_alloc(&fconf_arm_uuids_pool);
3217d111d99SDavid Horstmann 		err = fdtw_read_uuid(dtb, node, load_info[i].name, 16,
3227d111d99SDavid Horstmann 				     (uint8_t *)&uuid_helper);
3230a6e7e3bSLouis Mayencourt 		if (err < 0) {
3240a6e7e3bSLouis Mayencourt 			WARN("FCONF: Read cell failed for %s\n", load_info[i].name);
3250a6e7e3bSLouis Mayencourt 			return err;
3260a6e7e3bSLouis Mayencourt 		}
3270a6e7e3bSLouis Mayencourt 
3287d111d99SDavid Horstmann 		VERBOSE("FCONF: arm-io_policies.%s cell found with value = "
3297d111d99SDavid Horstmann 			"%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x\n",
3300a6e7e3bSLouis Mayencourt 			load_info[i].name,
3317d111d99SDavid Horstmann 			uuid_helper.uuid_struct.time_low[0], uuid_helper.uuid_struct.time_low[1],
3327d111d99SDavid Horstmann 			uuid_helper.uuid_struct.time_low[2], uuid_helper.uuid_struct.time_low[3],
3337d111d99SDavid Horstmann 			uuid_helper.uuid_struct.time_mid[0], uuid_helper.uuid_struct.time_mid[1],
3347d111d99SDavid Horstmann 			uuid_helper.uuid_struct.time_hi_and_version[0],
3357d111d99SDavid Horstmann 			uuid_helper.uuid_struct.time_hi_and_version[1],
3367d111d99SDavid Horstmann 			uuid_helper.uuid_struct.clock_seq_hi_and_reserved,
3377d111d99SDavid Horstmann 			uuid_helper.uuid_struct.clock_seq_low,
3387d111d99SDavid Horstmann 			uuid_helper.uuid_struct.node[0], uuid_helper.uuid_struct.node[1],
3397d111d99SDavid Horstmann 			uuid_helper.uuid_struct.node[2], uuid_helper.uuid_struct.node[3],
3407d111d99SDavid Horstmann 			uuid_helper.uuid_struct.node[4], uuid_helper.uuid_struct.node[5]);
3410a6e7e3bSLouis Mayencourt 
3420a6e7e3bSLouis Mayencourt 		uuid_ptr->uuid = uuid_helper.uuid_struct;
3430a6e7e3bSLouis Mayencourt 		policies[load_info[i].image_id].image_spec = (uintptr_t)uuid_ptr;
3440a6e7e3bSLouis Mayencourt 		policies[load_info[i].image_id].dev_handle = &fip_dev_handle;
3450a6e7e3bSLouis Mayencourt 		policies[load_info[i].image_id].check = open_fip;
3460a6e7e3bSLouis Mayencourt 	}
3470a6e7e3bSLouis Mayencourt 	return 0;
3480a6e7e3bSLouis Mayencourt }
3490a6e7e3bSLouis Mayencourt 
350a6de824fSLouis Mayencourt #if ARM_IO_IN_DTB
35125d740c4SMadhukar Pappireddy FCONF_REGISTER_POPULATOR(TB_FW, arm_io, fconf_populate_arm_io_policies);
352a6de824fSLouis Mayencourt #endif /* ARM_IO_IN_DTB */
3530a6e7e3bSLouis Mayencourt 
3540a6e7e3bSLouis Mayencourt #endif /* IMAGE_BL2 */
355