xref: /rk3399_ARM-atf/plat/arm/common/fconf/arm_fconf_io.c (revision ef1daa420f7b2920b2ee35379de2aefed6ab2605)
10a6e7e3bSLouis Mayencourt /*
2*ef1daa42SManish V Badarkhe  * 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>
12*ef1daa42SManish 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*ef1daa42SManish V Badarkhe io_block_spec_t fip_block_spec = {
22*ef1daa42SManish V Badarkhe /*
23*ef1daa42SManish V Badarkhe  * This is fixed FIP address used by BL1, BL2 loads partition table
24*ef1daa42SManish V Badarkhe  * to get FIP address.
25*ef1daa42SManish V Badarkhe  */
26*ef1daa42SManish V Badarkhe #if ARM_GPT_SUPPORT
27*ef1daa42SManish V Badarkhe 	.offset = PLAT_ARM_FLASH_IMAGE_BASE + PLAT_ARM_FIP_OFFSET_IN_GPT,
28*ef1daa42SManish V Badarkhe #else
2949e9ac28SManish V Badarkhe 	.offset = PLAT_ARM_FLASH_IMAGE_BASE,
30*ef1daa42SManish V Badarkhe #endif /* ARM_GPT_SUPPORT */
3149e9ac28SManish V Badarkhe 	.length = PLAT_ARM_FLASH_IMAGE_MAX_SIZE
320a6e7e3bSLouis Mayencourt };
330a6e7e3bSLouis Mayencourt 
34*ef1daa42SManish V Badarkhe #if ARM_GPT_SUPPORT
35*ef1daa42SManish V Badarkhe static const io_block_spec_t gpt_spec = {
36*ef1daa42SManish V Badarkhe 	.offset         = PLAT_ARM_FLASH_IMAGE_BASE,
37*ef1daa42SManish V Badarkhe 	/*
38*ef1daa42SManish V Badarkhe 	 * PLAT_PARTITION_BLOCK_SIZE = 512
39*ef1daa42SManish V Badarkhe 	 * PLAT_PARTITION_MAX_ENTRIES = 128
40*ef1daa42SManish V Badarkhe 	 * each sector has 4 partition entries, and there are
41*ef1daa42SManish V Badarkhe 	 * 2 reserved sectors i.e. protective MBR and primary
42*ef1daa42SManish V Badarkhe 	 * GPT header hence length gets calculated as,
43*ef1daa42SManish V Badarkhe 	 * length = 512 * (128/4 + 2)
44*ef1daa42SManish V Badarkhe 	 */
45*ef1daa42SManish V Badarkhe 	.length         = PLAT_PARTITION_BLOCK_SIZE *
46*ef1daa42SManish V Badarkhe 			  (PLAT_PARTITION_MAX_ENTRIES / 4 + 2),
47*ef1daa42SManish V Badarkhe };
48*ef1daa42SManish V Badarkhe #endif /* ARM_GPT_SUPPORT */
49*ef1daa42SManish V Badarkhe 
500a6e7e3bSLouis Mayencourt const io_uuid_spec_t arm_uuid_spec[MAX_NUMBER_IDS] = {
510a6e7e3bSLouis Mayencourt 	[BL2_IMAGE_ID] = {UUID_TRUSTED_BOOT_FIRMWARE_BL2},
520a6e7e3bSLouis Mayencourt 	[TB_FW_CONFIG_ID] = {UUID_TB_FW_CONFIG},
53243875eaSLouis Mayencourt 	[FW_CONFIG_ID] = {UUID_FW_CONFIG},
54a6de824fSLouis Mayencourt #if !ARM_IO_IN_DTB
55a6de824fSLouis Mayencourt 	[SCP_BL2_IMAGE_ID] = {UUID_SCP_FIRMWARE_SCP_BL2},
56a6de824fSLouis Mayencourt 	[BL31_IMAGE_ID] = {UUID_EL3_RUNTIME_FIRMWARE_BL31},
57a6de824fSLouis Mayencourt 	[BL32_IMAGE_ID] = {UUID_SECURE_PAYLOAD_BL32},
58a6de824fSLouis Mayencourt 	[BL32_EXTRA1_IMAGE_ID] = {UUID_SECURE_PAYLOAD_BL32_EXTRA1},
59a6de824fSLouis Mayencourt 	[BL32_EXTRA2_IMAGE_ID] = {UUID_SECURE_PAYLOAD_BL32_EXTRA2},
60a6de824fSLouis Mayencourt 	[BL33_IMAGE_ID] = {UUID_NON_TRUSTED_FIRMWARE_BL33},
61a6de824fSLouis Mayencourt 	[HW_CONFIG_ID] = {UUID_HW_CONFIG},
62a6de824fSLouis Mayencourt 	[SOC_FW_CONFIG_ID] = {UUID_SOC_FW_CONFIG},
63a6de824fSLouis Mayencourt 	[TOS_FW_CONFIG_ID] = {UUID_TOS_FW_CONFIG},
64a6de824fSLouis Mayencourt 	[NT_FW_CONFIG_ID] = {UUID_NT_FW_CONFIG},
65a6de824fSLouis Mayencourt #endif /* ARM_IO_IN_DTB */
660a6e7e3bSLouis Mayencourt #if TRUSTED_BOARD_BOOT
670a6e7e3bSLouis Mayencourt 	[TRUSTED_BOOT_FW_CERT_ID] = {UUID_TRUSTED_BOOT_FW_CERT},
68a6de824fSLouis Mayencourt #if !ARM_IO_IN_DTB
69a6de824fSLouis Mayencourt 	[TRUSTED_KEY_CERT_ID] = {UUID_TRUSTED_KEY_CERT},
70a6de824fSLouis Mayencourt 	[SCP_FW_KEY_CERT_ID] = {UUID_SCP_FW_KEY_CERT},
71a6de824fSLouis Mayencourt 	[SOC_FW_KEY_CERT_ID] = {UUID_SOC_FW_KEY_CERT},
72a6de824fSLouis Mayencourt 	[TRUSTED_OS_FW_KEY_CERT_ID] = {UUID_TRUSTED_OS_FW_KEY_CERT},
73a6de824fSLouis Mayencourt 	[NON_TRUSTED_FW_KEY_CERT_ID] = {UUID_NON_TRUSTED_FW_KEY_CERT},
74a6de824fSLouis Mayencourt 	[SCP_FW_CONTENT_CERT_ID] = {UUID_SCP_FW_CONTENT_CERT},
75a6de824fSLouis Mayencourt 	[SOC_FW_CONTENT_CERT_ID] = {UUID_SOC_FW_CONTENT_CERT},
76a6de824fSLouis Mayencourt 	[TRUSTED_OS_FW_CONTENT_CERT_ID] = {UUID_TRUSTED_OS_FW_CONTENT_CERT},
77a6de824fSLouis Mayencourt 	[NON_TRUSTED_FW_CONTENT_CERT_ID] = {UUID_NON_TRUSTED_FW_CONTENT_CERT},
7844f1aa8eSManish Pandey #if defined(SPD_spmd)
7903a5225cSManish Pandey 	[SIP_SP_CONTENT_CERT_ID] = {UUID_SIP_SECURE_PARTITION_CONTENT_CERT},
80990d972fSManish Pandey 	[PLAT_SP_CONTENT_CERT_ID] = {UUID_PLAT_SECURE_PARTITION_CONTENT_CERT},
8144f1aa8eSManish Pandey #endif
82a6de824fSLouis Mayencourt #endif /* ARM_IO_IN_DTB */
830a6e7e3bSLouis Mayencourt #endif /* TRUSTED_BOARD_BOOT */
840a6e7e3bSLouis Mayencourt };
850a6e7e3bSLouis Mayencourt 
860a6e7e3bSLouis Mayencourt /* By default, ARM platforms load images from the FIP */
870a6e7e3bSLouis Mayencourt struct plat_io_policy policies[MAX_NUMBER_IDS] = {
88*ef1daa42SManish V Badarkhe #if ARM_GPT_SUPPORT
89*ef1daa42SManish V Badarkhe 	[GPT_IMAGE_ID] = {
90*ef1daa42SManish V Badarkhe 		&memmap_dev_handle,
91*ef1daa42SManish V Badarkhe 		(uintptr_t)&gpt_spec,
92*ef1daa42SManish V Badarkhe 		open_memmap
93*ef1daa42SManish V Badarkhe 	},
94*ef1daa42SManish V Badarkhe #endif /* ARM_GPT_SUPPORT */
950a6e7e3bSLouis Mayencourt 	[FIP_IMAGE_ID] = {
960a6e7e3bSLouis Mayencourt 		&memmap_dev_handle,
970a6e7e3bSLouis Mayencourt 		(uintptr_t)&fip_block_spec,
980a6e7e3bSLouis Mayencourt 		open_memmap
990a6e7e3bSLouis Mayencourt 	},
1000a6e7e3bSLouis Mayencourt 	[BL2_IMAGE_ID] = {
1010a6e7e3bSLouis Mayencourt 		&fip_dev_handle,
1020a6e7e3bSLouis Mayencourt 		(uintptr_t)&arm_uuid_spec[BL2_IMAGE_ID],
1030a6e7e3bSLouis Mayencourt 		open_fip
1040a6e7e3bSLouis Mayencourt 	},
1050a6e7e3bSLouis Mayencourt 	[TB_FW_CONFIG_ID] = {
1060a6e7e3bSLouis Mayencourt 		&fip_dev_handle,
1070a6e7e3bSLouis Mayencourt 		(uintptr_t)&arm_uuid_spec[TB_FW_CONFIG_ID],
1080a6e7e3bSLouis Mayencourt 		open_fip
1090a6e7e3bSLouis Mayencourt 	},
110243875eaSLouis Mayencourt 	[FW_CONFIG_ID] = {
111243875eaSLouis Mayencourt 		&fip_dev_handle,
112243875eaSLouis Mayencourt 		(uintptr_t)&arm_uuid_spec[FW_CONFIG_ID],
113243875eaSLouis Mayencourt 		open_fip
114243875eaSLouis Mayencourt 	},
115a6de824fSLouis Mayencourt #if !ARM_IO_IN_DTB
116a6de824fSLouis Mayencourt 	[SCP_BL2_IMAGE_ID] = {
117a6de824fSLouis Mayencourt 		&fip_dev_handle,
118a6de824fSLouis Mayencourt 		(uintptr_t)&arm_uuid_spec[SCP_BL2_IMAGE_ID],
119a6de824fSLouis Mayencourt 		open_fip
120a6de824fSLouis Mayencourt 	},
121a6de824fSLouis Mayencourt 	[BL31_IMAGE_ID] = {
122a6de824fSLouis Mayencourt 		&fip_dev_handle,
123a6de824fSLouis Mayencourt 		(uintptr_t)&arm_uuid_spec[BL31_IMAGE_ID],
124a6de824fSLouis Mayencourt 		open_fip
125a6de824fSLouis Mayencourt 	},
126a6de824fSLouis Mayencourt 	[BL32_IMAGE_ID] = {
127a6de824fSLouis Mayencourt 		&fip_dev_handle,
128a6de824fSLouis Mayencourt 		(uintptr_t)&arm_uuid_spec[BL32_IMAGE_ID],
129a6de824fSLouis Mayencourt 		open_fip
130a6de824fSLouis Mayencourt 	},
131a6de824fSLouis Mayencourt 	[BL32_EXTRA1_IMAGE_ID] = {
132a6de824fSLouis Mayencourt 		&fip_dev_handle,
133a6de824fSLouis Mayencourt 		(uintptr_t)&arm_uuid_spec[BL32_EXTRA1_IMAGE_ID],
134a6de824fSLouis Mayencourt 		open_fip
135a6de824fSLouis Mayencourt 	},
136a6de824fSLouis Mayencourt 	[BL32_EXTRA2_IMAGE_ID] = {
137a6de824fSLouis Mayencourt 		&fip_dev_handle,
138a6de824fSLouis Mayencourt 		(uintptr_t)&arm_uuid_spec[BL32_EXTRA2_IMAGE_ID],
139a6de824fSLouis Mayencourt 		open_fip
140a6de824fSLouis Mayencourt 	},
141a6de824fSLouis Mayencourt 	[BL33_IMAGE_ID] = {
142a6de824fSLouis Mayencourt 		&fip_dev_handle,
143a6de824fSLouis Mayencourt 		(uintptr_t)&arm_uuid_spec[BL33_IMAGE_ID],
144a6de824fSLouis Mayencourt 		open_fip
145a6de824fSLouis Mayencourt 	},
146a6de824fSLouis Mayencourt 	[HW_CONFIG_ID] = {
147a6de824fSLouis Mayencourt 		&fip_dev_handle,
148a6de824fSLouis Mayencourt 		(uintptr_t)&arm_uuid_spec[HW_CONFIG_ID],
149a6de824fSLouis Mayencourt 		open_fip
150a6de824fSLouis Mayencourt 	},
151a6de824fSLouis Mayencourt 	[SOC_FW_CONFIG_ID] = {
152a6de824fSLouis Mayencourt 		&fip_dev_handle,
153a6de824fSLouis Mayencourt 		(uintptr_t)&arm_uuid_spec[SOC_FW_CONFIG_ID],
154a6de824fSLouis Mayencourt 		open_fip
155a6de824fSLouis Mayencourt 	},
156a6de824fSLouis Mayencourt 	[TOS_FW_CONFIG_ID] = {
157a6de824fSLouis Mayencourt 		&fip_dev_handle,
158a6de824fSLouis Mayencourt 		(uintptr_t)&arm_uuid_spec[TOS_FW_CONFIG_ID],
159a6de824fSLouis Mayencourt 		open_fip
160a6de824fSLouis Mayencourt 	},
161a6de824fSLouis Mayencourt 	[NT_FW_CONFIG_ID] = {
162a6de824fSLouis Mayencourt 		&fip_dev_handle,
163a6de824fSLouis Mayencourt 		(uintptr_t)&arm_uuid_spec[NT_FW_CONFIG_ID],
164a6de824fSLouis Mayencourt 		open_fip
165a6de824fSLouis Mayencourt 	},
166a6de824fSLouis Mayencourt #endif /* ARM_IO_IN_DTB */
1670a6e7e3bSLouis Mayencourt #if TRUSTED_BOARD_BOOT
1680a6e7e3bSLouis Mayencourt 	[TRUSTED_BOOT_FW_CERT_ID] = {
1690a6e7e3bSLouis Mayencourt 		&fip_dev_handle,
1700a6e7e3bSLouis Mayencourt 		(uintptr_t)&arm_uuid_spec[TRUSTED_BOOT_FW_CERT_ID],
1710a6e7e3bSLouis Mayencourt 		open_fip
1720a6e7e3bSLouis Mayencourt 	},
173a6de824fSLouis Mayencourt #if !ARM_IO_IN_DTB
174a6de824fSLouis Mayencourt 	[TRUSTED_KEY_CERT_ID] = {
175a6de824fSLouis Mayencourt 		&fip_dev_handle,
176a6de824fSLouis Mayencourt 		(uintptr_t)&arm_uuid_spec[TRUSTED_KEY_CERT_ID],
177a6de824fSLouis Mayencourt 		open_fip
178a6de824fSLouis Mayencourt 	},
179a6de824fSLouis Mayencourt 	[SCP_FW_KEY_CERT_ID] = {
180a6de824fSLouis Mayencourt 		&fip_dev_handle,
181a6de824fSLouis Mayencourt 		(uintptr_t)&arm_uuid_spec[SCP_FW_KEY_CERT_ID],
182a6de824fSLouis Mayencourt 		open_fip
183a6de824fSLouis Mayencourt 	},
184a6de824fSLouis Mayencourt 	[SOC_FW_KEY_CERT_ID] = {
185a6de824fSLouis Mayencourt 		&fip_dev_handle,
186a6de824fSLouis Mayencourt 		(uintptr_t)&arm_uuid_spec[SOC_FW_KEY_CERT_ID],
187a6de824fSLouis Mayencourt 		open_fip
188a6de824fSLouis Mayencourt 	},
189a6de824fSLouis Mayencourt 	[TRUSTED_OS_FW_KEY_CERT_ID] = {
190a6de824fSLouis Mayencourt 		&fip_dev_handle,
191a6de824fSLouis Mayencourt 		(uintptr_t)&arm_uuid_spec[TRUSTED_OS_FW_KEY_CERT_ID],
192a6de824fSLouis Mayencourt 		open_fip
193a6de824fSLouis Mayencourt 	},
194a6de824fSLouis Mayencourt 	[NON_TRUSTED_FW_KEY_CERT_ID] = {
195a6de824fSLouis Mayencourt 		&fip_dev_handle,
196a6de824fSLouis Mayencourt 		(uintptr_t)&arm_uuid_spec[NON_TRUSTED_FW_KEY_CERT_ID],
197a6de824fSLouis Mayencourt 		open_fip
198a6de824fSLouis Mayencourt 	},
199a6de824fSLouis Mayencourt 	[SCP_FW_CONTENT_CERT_ID] = {
200a6de824fSLouis Mayencourt 		&fip_dev_handle,
201a6de824fSLouis Mayencourt 		(uintptr_t)&arm_uuid_spec[SCP_FW_CONTENT_CERT_ID],
202a6de824fSLouis Mayencourt 		open_fip
203a6de824fSLouis Mayencourt 	},
204a6de824fSLouis Mayencourt 	[SOC_FW_CONTENT_CERT_ID] = {
205a6de824fSLouis Mayencourt 		&fip_dev_handle,
206a6de824fSLouis Mayencourt 		(uintptr_t)&arm_uuid_spec[SOC_FW_CONTENT_CERT_ID],
207a6de824fSLouis Mayencourt 		open_fip
208a6de824fSLouis Mayencourt 	},
209a6de824fSLouis Mayencourt 	[TRUSTED_OS_FW_CONTENT_CERT_ID] = {
210a6de824fSLouis Mayencourt 		&fip_dev_handle,
211a6de824fSLouis Mayencourt 		(uintptr_t)&arm_uuid_spec[TRUSTED_OS_FW_CONTENT_CERT_ID],
212a6de824fSLouis Mayencourt 		open_fip
213a6de824fSLouis Mayencourt 	},
214a6de824fSLouis Mayencourt 	[NON_TRUSTED_FW_CONTENT_CERT_ID] = {
215a6de824fSLouis Mayencourt 		&fip_dev_handle,
216a6de824fSLouis Mayencourt 		(uintptr_t)&arm_uuid_spec[NON_TRUSTED_FW_CONTENT_CERT_ID],
217a6de824fSLouis Mayencourt 		open_fip
218a6de824fSLouis Mayencourt 	},
21944f1aa8eSManish Pandey #if defined(SPD_spmd)
22003a5225cSManish Pandey 	[SIP_SP_CONTENT_CERT_ID] = {
22144f1aa8eSManish Pandey 		&fip_dev_handle,
22203a5225cSManish Pandey 		(uintptr_t)&arm_uuid_spec[SIP_SP_CONTENT_CERT_ID],
22344f1aa8eSManish Pandey 		open_fip
22444f1aa8eSManish Pandey 	},
225990d972fSManish Pandey 	[PLAT_SP_CONTENT_CERT_ID] = {
226990d972fSManish Pandey 		&fip_dev_handle,
227990d972fSManish Pandey 		(uintptr_t)&arm_uuid_spec[PLAT_SP_CONTENT_CERT_ID],
228990d972fSManish Pandey 		open_fip
229990d972fSManish Pandey 	},
23044f1aa8eSManish Pandey #endif
231a6de824fSLouis Mayencourt #endif /* ARM_IO_IN_DTB */
2320a6e7e3bSLouis Mayencourt #endif /* TRUSTED_BOARD_BOOT */
2330a6e7e3bSLouis Mayencourt };
2340a6e7e3bSLouis Mayencourt 
2350a6e7e3bSLouis Mayencourt #ifdef IMAGE_BL2
2360a6e7e3bSLouis Mayencourt 
2370a6e7e3bSLouis Mayencourt #if TRUSTED_BOARD_BOOT
238990d972fSManish Pandey #define FCONF_ARM_IO_UUID_NUMBER	U(21)
2390a6e7e3bSLouis Mayencourt #else
240845db722SLouis Mayencourt #define FCONF_ARM_IO_UUID_NUMBER	U(10)
2410a6e7e3bSLouis Mayencourt #endif
2420a6e7e3bSLouis Mayencourt 
2430a6e7e3bSLouis Mayencourt static io_uuid_spec_t fconf_arm_uuids[FCONF_ARM_IO_UUID_NUMBER];
2440a6e7e3bSLouis Mayencourt static OBJECT_POOL_ARRAY(fconf_arm_uuids_pool, fconf_arm_uuids);
2450a6e7e3bSLouis Mayencourt 
2460a6e7e3bSLouis Mayencourt struct policies_load_info {
2470a6e7e3bSLouis Mayencourt 	unsigned int image_id;
2480a6e7e3bSLouis Mayencourt 	const char *name;
2490a6e7e3bSLouis Mayencourt };
2500a6e7e3bSLouis Mayencourt 
2510a6e7e3bSLouis Mayencourt /* image id to property name table */
2520a6e7e3bSLouis Mayencourt static const struct policies_load_info load_info[FCONF_ARM_IO_UUID_NUMBER] = {
2530a6e7e3bSLouis Mayencourt 	{SCP_BL2_IMAGE_ID, "scp_bl2_uuid"},
2540a6e7e3bSLouis Mayencourt 	{BL31_IMAGE_ID, "bl31_uuid"},
2550a6e7e3bSLouis Mayencourt 	{BL32_IMAGE_ID, "bl32_uuid"},
2560a6e7e3bSLouis Mayencourt 	{BL32_EXTRA1_IMAGE_ID, "bl32_extra1_uuid"},
2570a6e7e3bSLouis Mayencourt 	{BL32_EXTRA2_IMAGE_ID, "bl32_extra2_uuid"},
2580a6e7e3bSLouis Mayencourt 	{BL33_IMAGE_ID, "bl33_uuid"},
2590a6e7e3bSLouis Mayencourt 	{HW_CONFIG_ID, "hw_cfg_uuid"},
2600a6e7e3bSLouis Mayencourt 	{SOC_FW_CONFIG_ID, "soc_fw_cfg_uuid"},
2610a6e7e3bSLouis Mayencourt 	{TOS_FW_CONFIG_ID, "tos_fw_cfg_uuid"},
2620a6e7e3bSLouis Mayencourt 	{NT_FW_CONFIG_ID, "nt_fw_cfg_uuid"},
2630a6e7e3bSLouis Mayencourt #if TRUSTED_BOARD_BOOT
2640a6e7e3bSLouis Mayencourt 	{TRUSTED_KEY_CERT_ID, "t_key_cert_uuid"},
2650a6e7e3bSLouis Mayencourt 	{SCP_FW_KEY_CERT_ID, "scp_fw_key_uuid"},
2660a6e7e3bSLouis Mayencourt 	{SOC_FW_KEY_CERT_ID, "soc_fw_key_uuid"},
2670a6e7e3bSLouis Mayencourt 	{TRUSTED_OS_FW_KEY_CERT_ID, "tos_fw_key_cert_uuid"},
2680a6e7e3bSLouis Mayencourt 	{NON_TRUSTED_FW_KEY_CERT_ID, "nt_fw_key_cert_uuid"},
2690a6e7e3bSLouis Mayencourt 	{SCP_FW_CONTENT_CERT_ID, "scp_fw_content_cert_uuid"},
2700a6e7e3bSLouis Mayencourt 	{SOC_FW_CONTENT_CERT_ID, "soc_fw_content_cert_uuid"},
2710a6e7e3bSLouis Mayencourt 	{TRUSTED_OS_FW_CONTENT_CERT_ID, "tos_fw_content_cert_uuid"},
2720a6e7e3bSLouis Mayencourt 	{NON_TRUSTED_FW_CONTENT_CERT_ID, "nt_fw_content_cert_uuid"},
27344f1aa8eSManish Pandey #if defined(SPD_spmd)
27403a5225cSManish Pandey 	{SIP_SP_CONTENT_CERT_ID, "sip_sp_content_cert_uuid"},
275990d972fSManish Pandey 	{PLAT_SP_CONTENT_CERT_ID, "plat_sp_content_cert_uuid"},
27644f1aa8eSManish Pandey #endif
2770a6e7e3bSLouis Mayencourt #endif /* TRUSTED_BOARD_BOOT */
2780a6e7e3bSLouis Mayencourt };
2790a6e7e3bSLouis Mayencourt 
2800a6e7e3bSLouis Mayencourt int fconf_populate_arm_io_policies(uintptr_t config)
2810a6e7e3bSLouis Mayencourt {
2820a6e7e3bSLouis Mayencourt 	int err, node;
2830a6e7e3bSLouis Mayencourt 	unsigned int i;
2840d4120d8SRuari Phipps 	unsigned int j;
2850a6e7e3bSLouis Mayencourt 
2860a6e7e3bSLouis Mayencourt 	union uuid_helper_t uuid_helper;
2870a6e7e3bSLouis Mayencourt 	io_uuid_spec_t *uuid_ptr;
2880a6e7e3bSLouis Mayencourt 
2890a6e7e3bSLouis Mayencourt 	/* As libfdt uses void *, we can't avoid this cast */
2900a6e7e3bSLouis Mayencourt 	const void *dtb = (void *)config;
2910a6e7e3bSLouis Mayencourt 
2920a6e7e3bSLouis Mayencourt 	/* Assert the node offset point to "arm,io-fip-handle" compatible property */
2930a6e7e3bSLouis Mayencourt 	const char *compatible_str = "arm,io-fip-handle";
2940a6e7e3bSLouis Mayencourt 	node = fdt_node_offset_by_compatible(dtb, -1, compatible_str);
2950a6e7e3bSLouis Mayencourt 	if (node < 0) {
2960a6e7e3bSLouis Mayencourt 		ERROR("FCONF: Can't find %s compatible in dtb\n", compatible_str);
2970a6e7e3bSLouis Mayencourt 		return node;
2980a6e7e3bSLouis Mayencourt 	}
2990a6e7e3bSLouis Mayencourt 
3000a6e7e3bSLouis Mayencourt 	/* Locate the uuid cells and read the value for all the load info uuid */
3010a6e7e3bSLouis Mayencourt 	for (i = 0; i < FCONF_ARM_IO_UUID_NUMBER; i++) {
3020a6e7e3bSLouis Mayencourt 		uuid_ptr = pool_alloc(&fconf_arm_uuids_pool);
3036e3a89f4SAndre Przywara 		err = fdt_read_uint32_array(dtb, node, load_info[i].name,
3046e3a89f4SAndre Przywara 					    4, uuid_helper.word);
3050a6e7e3bSLouis Mayencourt 		if (err < 0) {
3060a6e7e3bSLouis Mayencourt 			WARN("FCONF: Read cell failed for %s\n", load_info[i].name);
3070a6e7e3bSLouis Mayencourt 			return err;
3080a6e7e3bSLouis Mayencourt 		}
3090a6e7e3bSLouis Mayencourt 
3100d4120d8SRuari Phipps 		/* Convert uuid from big endian to little endian */
3110d4120d8SRuari Phipps 		for (j = 0U; j < 4U; j++) {
3120d4120d8SRuari Phipps 			uuid_helper.word[j] =
3130d4120d8SRuari Phipps 				((uuid_helper.word[j] >> 24U) & 0xff) |
3140d4120d8SRuari Phipps 				((uuid_helper.word[j] << 8U) & 0xff0000) |
3150d4120d8SRuari Phipps 				((uuid_helper.word[j] >> 8U) & 0xff00) |
3160d4120d8SRuari Phipps 				((uuid_helper.word[j] << 24U) & 0xff000000);
3170d4120d8SRuari Phipps 		}
3180d4120d8SRuari Phipps 
3190a6e7e3bSLouis Mayencourt 		VERBOSE("FCONF: arm-io_policies.%s cell found with value = 0x%x 0x%x 0x%x 0x%x\n",
3200a6e7e3bSLouis Mayencourt 			load_info[i].name,
3210a6e7e3bSLouis Mayencourt 			uuid_helper.word[0], uuid_helper.word[1],
3220a6e7e3bSLouis Mayencourt 			uuid_helper.word[2], uuid_helper.word[3]);
3230a6e7e3bSLouis Mayencourt 
3240a6e7e3bSLouis Mayencourt 		uuid_ptr->uuid = uuid_helper.uuid_struct;
3250a6e7e3bSLouis Mayencourt 		policies[load_info[i].image_id].image_spec = (uintptr_t)uuid_ptr;
3260a6e7e3bSLouis Mayencourt 		policies[load_info[i].image_id].dev_handle = &fip_dev_handle;
3270a6e7e3bSLouis Mayencourt 		policies[load_info[i].image_id].check = open_fip;
3280a6e7e3bSLouis Mayencourt 	}
3290a6e7e3bSLouis Mayencourt 	return 0;
3300a6e7e3bSLouis Mayencourt }
3310a6e7e3bSLouis Mayencourt 
332a6de824fSLouis Mayencourt #if ARM_IO_IN_DTB
33325d740c4SMadhukar Pappireddy FCONF_REGISTER_POPULATOR(TB_FW, arm_io, fconf_populate_arm_io_policies);
334a6de824fSLouis Mayencourt #endif /* ARM_IO_IN_DTB */
3350a6e7e3bSLouis Mayencourt 
3360a6e7e3bSLouis Mayencourt #endif /* IMAGE_BL2 */
337