xref: /rk3399_ARM-atf/plat/arm/common/fconf/arm_fconf_io.c (revision e208f3244b311a23b3e7fa1c03b3e98a6228714a)
10a6e7e3bSLouis Mayencourt /*
2*e208f324SRob Hughes  * Copyright (c) 2019-2023, 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},
709d870b79SZelalem 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
75d5de70ceSlaurenw-arm 	[CCA_CONTENT_CERT_ID] = {UUID_CCA_CONTENT_CERT},
76d5de70ceSlaurenw-arm 	[CORE_SWD_KEY_CERT_ID] = {UUID_CORE_SWD_KEY_CERT},
77d5de70ceSlaurenw-arm 	[PLAT_KEY_CERT_ID] = {UUID_PLAT_KEY_CERT},
78a6de824fSLouis Mayencourt 	[TRUSTED_KEY_CERT_ID] = {UUID_TRUSTED_KEY_CERT},
79a6de824fSLouis Mayencourt 	[SCP_FW_KEY_CERT_ID] = {UUID_SCP_FW_KEY_CERT},
80a6de824fSLouis Mayencourt 	[SOC_FW_KEY_CERT_ID] = {UUID_SOC_FW_KEY_CERT},
81a6de824fSLouis Mayencourt 	[TRUSTED_OS_FW_KEY_CERT_ID] = {UUID_TRUSTED_OS_FW_KEY_CERT},
82a6de824fSLouis Mayencourt 	[NON_TRUSTED_FW_KEY_CERT_ID] = {UUID_NON_TRUSTED_FW_KEY_CERT},
83a6de824fSLouis Mayencourt 	[SCP_FW_CONTENT_CERT_ID] = {UUID_SCP_FW_CONTENT_CERT},
84a6de824fSLouis Mayencourt 	[SOC_FW_CONTENT_CERT_ID] = {UUID_SOC_FW_CONTENT_CERT},
85a6de824fSLouis Mayencourt 	[TRUSTED_OS_FW_CONTENT_CERT_ID] = {UUID_TRUSTED_OS_FW_CONTENT_CERT},
86a6de824fSLouis Mayencourt 	[NON_TRUSTED_FW_CONTENT_CERT_ID] = {UUID_NON_TRUSTED_FW_CONTENT_CERT},
8744f1aa8eSManish Pandey #if defined(SPD_spmd)
8803a5225cSManish Pandey 	[SIP_SP_CONTENT_CERT_ID] = {UUID_SIP_SECURE_PARTITION_CONTENT_CERT},
89990d972fSManish Pandey 	[PLAT_SP_CONTENT_CERT_ID] = {UUID_PLAT_SECURE_PARTITION_CONTENT_CERT},
9044f1aa8eSManish Pandey #endif
91a6de824fSLouis Mayencourt #endif /* ARM_IO_IN_DTB */
920a6e7e3bSLouis Mayencourt #endif /* TRUSTED_BOARD_BOOT */
930a6e7e3bSLouis Mayencourt };
940a6e7e3bSLouis Mayencourt 
950a6e7e3bSLouis Mayencourt /* By default, ARM platforms load images from the FIP */
960a6e7e3bSLouis Mayencourt struct plat_io_policy policies[MAX_NUMBER_IDS] = {
97ef1daa42SManish V Badarkhe #if ARM_GPT_SUPPORT
98ef1daa42SManish V Badarkhe 	[GPT_IMAGE_ID] = {
99ef1daa42SManish V Badarkhe 		&memmap_dev_handle,
100ef1daa42SManish V Badarkhe 		(uintptr_t)&gpt_spec,
101ef1daa42SManish V Badarkhe 		open_memmap
102ef1daa42SManish V Badarkhe 	},
103ef1daa42SManish V Badarkhe #endif /* ARM_GPT_SUPPORT */
1042f1177b2SManish V Badarkhe #if PSA_FWU_SUPPORT
1052f1177b2SManish V Badarkhe 	[FWU_METADATA_IMAGE_ID] = {
1062f1177b2SManish V Badarkhe 		&memmap_dev_handle,
1072f1177b2SManish V Badarkhe 		/* filled runtime from partition information */
1082f1177b2SManish V Badarkhe 		(uintptr_t)&fwu_metadata_spec,
1092f1177b2SManish V Badarkhe 		open_memmap
1102f1177b2SManish V Badarkhe 	},
1112f1177b2SManish V Badarkhe 	[BKUP_FWU_METADATA_IMAGE_ID] = {
1122f1177b2SManish V Badarkhe 		&memmap_dev_handle,
1132f1177b2SManish V Badarkhe 		/* filled runtime from partition information */
1142f1177b2SManish V Badarkhe 		(uintptr_t)&fwu_metadata_spec,
1152f1177b2SManish V Badarkhe 		open_memmap
1162f1177b2SManish V Badarkhe 	},
1172f1177b2SManish V Badarkhe #endif /* PSA_FWU_SUPPORT */
1180a6e7e3bSLouis Mayencourt 	[FIP_IMAGE_ID] = {
1190a6e7e3bSLouis Mayencourt 		&memmap_dev_handle,
1200a6e7e3bSLouis Mayencourt 		(uintptr_t)&fip_block_spec,
1210a6e7e3bSLouis Mayencourt 		open_memmap
1220a6e7e3bSLouis Mayencourt 	},
1230a6e7e3bSLouis Mayencourt 	[BL2_IMAGE_ID] = {
1240a6e7e3bSLouis Mayencourt 		&fip_dev_handle,
1250a6e7e3bSLouis Mayencourt 		(uintptr_t)&arm_uuid_spec[BL2_IMAGE_ID],
1260a6e7e3bSLouis Mayencourt 		open_fip
1270a6e7e3bSLouis Mayencourt 	},
1280a6e7e3bSLouis Mayencourt 	[TB_FW_CONFIG_ID] = {
1290a6e7e3bSLouis Mayencourt 		&fip_dev_handle,
1300a6e7e3bSLouis Mayencourt 		(uintptr_t)&arm_uuid_spec[TB_FW_CONFIG_ID],
1310a6e7e3bSLouis Mayencourt 		open_fip
1320a6e7e3bSLouis Mayencourt 	},
133243875eaSLouis Mayencourt 	[FW_CONFIG_ID] = {
134243875eaSLouis Mayencourt 		&fip_dev_handle,
135243875eaSLouis Mayencourt 		(uintptr_t)&arm_uuid_spec[FW_CONFIG_ID],
136243875eaSLouis Mayencourt 		open_fip
137243875eaSLouis Mayencourt 	},
138a6de824fSLouis Mayencourt #if !ARM_IO_IN_DTB
139a6de824fSLouis Mayencourt 	[SCP_BL2_IMAGE_ID] = {
140a6de824fSLouis Mayencourt 		&fip_dev_handle,
141a6de824fSLouis Mayencourt 		(uintptr_t)&arm_uuid_spec[SCP_BL2_IMAGE_ID],
142a6de824fSLouis Mayencourt 		open_fip
143a6de824fSLouis Mayencourt 	},
144a6de824fSLouis Mayencourt 	[BL31_IMAGE_ID] = {
145a6de824fSLouis Mayencourt 		&fip_dev_handle,
146a6de824fSLouis Mayencourt 		(uintptr_t)&arm_uuid_spec[BL31_IMAGE_ID],
147a6de824fSLouis Mayencourt 		open_fip
148a6de824fSLouis Mayencourt 	},
149a6de824fSLouis Mayencourt 	[BL32_IMAGE_ID] = {
150a6de824fSLouis Mayencourt 		&fip_dev_handle,
151a6de824fSLouis Mayencourt 		(uintptr_t)&arm_uuid_spec[BL32_IMAGE_ID],
152a6de824fSLouis Mayencourt 		open_fip
153a6de824fSLouis Mayencourt 	},
154a6de824fSLouis Mayencourt 	[BL32_EXTRA1_IMAGE_ID] = {
155a6de824fSLouis Mayencourt 		&fip_dev_handle,
156a6de824fSLouis Mayencourt 		(uintptr_t)&arm_uuid_spec[BL32_EXTRA1_IMAGE_ID],
157a6de824fSLouis Mayencourt 		open_fip
158a6de824fSLouis Mayencourt 	},
159a6de824fSLouis Mayencourt 	[BL32_EXTRA2_IMAGE_ID] = {
160a6de824fSLouis Mayencourt 		&fip_dev_handle,
161a6de824fSLouis Mayencourt 		(uintptr_t)&arm_uuid_spec[BL32_EXTRA2_IMAGE_ID],
162a6de824fSLouis Mayencourt 		open_fip
163a6de824fSLouis Mayencourt 	},
164a6de824fSLouis Mayencourt 	[BL33_IMAGE_ID] = {
165a6de824fSLouis Mayencourt 		&fip_dev_handle,
166a6de824fSLouis Mayencourt 		(uintptr_t)&arm_uuid_spec[BL33_IMAGE_ID],
167a6de824fSLouis Mayencourt 		open_fip
168a6de824fSLouis Mayencourt 	},
1699d870b79SZelalem Aweke 	[RMM_IMAGE_ID] = {
1709d870b79SZelalem Aweke 		&fip_dev_handle,
1719d870b79SZelalem Aweke 		(uintptr_t)&arm_uuid_spec[RMM_IMAGE_ID],
1729d870b79SZelalem Aweke 		open_fip
1739d870b79SZelalem Aweke 	},
174a6de824fSLouis Mayencourt 	[HW_CONFIG_ID] = {
175a6de824fSLouis Mayencourt 		&fip_dev_handle,
176a6de824fSLouis Mayencourt 		(uintptr_t)&arm_uuid_spec[HW_CONFIG_ID],
177a6de824fSLouis Mayencourt 		open_fip
178a6de824fSLouis Mayencourt 	},
179a6de824fSLouis Mayencourt 	[SOC_FW_CONFIG_ID] = {
180a6de824fSLouis Mayencourt 		&fip_dev_handle,
181a6de824fSLouis Mayencourt 		(uintptr_t)&arm_uuid_spec[SOC_FW_CONFIG_ID],
182a6de824fSLouis Mayencourt 		open_fip
183a6de824fSLouis Mayencourt 	},
184a6de824fSLouis Mayencourt 	[TOS_FW_CONFIG_ID] = {
185a6de824fSLouis Mayencourt 		&fip_dev_handle,
186a6de824fSLouis Mayencourt 		(uintptr_t)&arm_uuid_spec[TOS_FW_CONFIG_ID],
187a6de824fSLouis Mayencourt 		open_fip
188a6de824fSLouis Mayencourt 	},
189a6de824fSLouis Mayencourt 	[NT_FW_CONFIG_ID] = {
190a6de824fSLouis Mayencourt 		&fip_dev_handle,
191a6de824fSLouis Mayencourt 		(uintptr_t)&arm_uuid_spec[NT_FW_CONFIG_ID],
192a6de824fSLouis Mayencourt 		open_fip
193a6de824fSLouis Mayencourt 	},
194a6de824fSLouis Mayencourt #endif /* ARM_IO_IN_DTB */
1950a6e7e3bSLouis Mayencourt #if TRUSTED_BOARD_BOOT
1960a6e7e3bSLouis Mayencourt 	[TRUSTED_BOOT_FW_CERT_ID] = {
1970a6e7e3bSLouis Mayencourt 		&fip_dev_handle,
1980a6e7e3bSLouis Mayencourt 		(uintptr_t)&arm_uuid_spec[TRUSTED_BOOT_FW_CERT_ID],
1990a6e7e3bSLouis Mayencourt 		open_fip
2000a6e7e3bSLouis Mayencourt 	},
201a6de824fSLouis Mayencourt #if !ARM_IO_IN_DTB
202d5de70ceSlaurenw-arm 	[CCA_CONTENT_CERT_ID] = {
203d5de70ceSlaurenw-arm 		&fip_dev_handle,
204d5de70ceSlaurenw-arm 		(uintptr_t)&arm_uuid_spec[CCA_CONTENT_CERT_ID],
205d5de70ceSlaurenw-arm 		open_fip
206d5de70ceSlaurenw-arm 	},
207d5de70ceSlaurenw-arm 	[CORE_SWD_KEY_CERT_ID] = {
208d5de70ceSlaurenw-arm 		&fip_dev_handle,
209d5de70ceSlaurenw-arm 		(uintptr_t)&arm_uuid_spec[CORE_SWD_KEY_CERT_ID],
210d5de70ceSlaurenw-arm 		open_fip
211d5de70ceSlaurenw-arm 	},
212d5de70ceSlaurenw-arm 	[PLAT_KEY_CERT_ID] = {
213d5de70ceSlaurenw-arm 		&fip_dev_handle,
214d5de70ceSlaurenw-arm 		(uintptr_t)&arm_uuid_spec[PLAT_KEY_CERT_ID],
215d5de70ceSlaurenw-arm 		open_fip
216d5de70ceSlaurenw-arm 	},
217a6de824fSLouis Mayencourt 	[TRUSTED_KEY_CERT_ID] = {
218a6de824fSLouis Mayencourt 		&fip_dev_handle,
219a6de824fSLouis Mayencourt 		(uintptr_t)&arm_uuid_spec[TRUSTED_KEY_CERT_ID],
220a6de824fSLouis Mayencourt 		open_fip
221a6de824fSLouis Mayencourt 	},
222a6de824fSLouis Mayencourt 	[SCP_FW_KEY_CERT_ID] = {
223a6de824fSLouis Mayencourt 		&fip_dev_handle,
224a6de824fSLouis Mayencourt 		(uintptr_t)&arm_uuid_spec[SCP_FW_KEY_CERT_ID],
225a6de824fSLouis Mayencourt 		open_fip
226a6de824fSLouis Mayencourt 	},
227a6de824fSLouis Mayencourt 	[SOC_FW_KEY_CERT_ID] = {
228a6de824fSLouis Mayencourt 		&fip_dev_handle,
229a6de824fSLouis Mayencourt 		(uintptr_t)&arm_uuid_spec[SOC_FW_KEY_CERT_ID],
230a6de824fSLouis Mayencourt 		open_fip
231a6de824fSLouis Mayencourt 	},
232a6de824fSLouis Mayencourt 	[TRUSTED_OS_FW_KEY_CERT_ID] = {
233a6de824fSLouis Mayencourt 		&fip_dev_handle,
234a6de824fSLouis Mayencourt 		(uintptr_t)&arm_uuid_spec[TRUSTED_OS_FW_KEY_CERT_ID],
235a6de824fSLouis Mayencourt 		open_fip
236a6de824fSLouis Mayencourt 	},
237a6de824fSLouis Mayencourt 	[NON_TRUSTED_FW_KEY_CERT_ID] = {
238a6de824fSLouis Mayencourt 		&fip_dev_handle,
239a6de824fSLouis Mayencourt 		(uintptr_t)&arm_uuid_spec[NON_TRUSTED_FW_KEY_CERT_ID],
240a6de824fSLouis Mayencourt 		open_fip
241a6de824fSLouis Mayencourt 	},
242a6de824fSLouis Mayencourt 	[SCP_FW_CONTENT_CERT_ID] = {
243a6de824fSLouis Mayencourt 		&fip_dev_handle,
244a6de824fSLouis Mayencourt 		(uintptr_t)&arm_uuid_spec[SCP_FW_CONTENT_CERT_ID],
245a6de824fSLouis Mayencourt 		open_fip
246a6de824fSLouis Mayencourt 	},
247a6de824fSLouis Mayencourt 	[SOC_FW_CONTENT_CERT_ID] = {
248a6de824fSLouis Mayencourt 		&fip_dev_handle,
249a6de824fSLouis Mayencourt 		(uintptr_t)&arm_uuid_spec[SOC_FW_CONTENT_CERT_ID],
250a6de824fSLouis Mayencourt 		open_fip
251a6de824fSLouis Mayencourt 	},
252a6de824fSLouis Mayencourt 	[TRUSTED_OS_FW_CONTENT_CERT_ID] = {
253a6de824fSLouis Mayencourt 		&fip_dev_handle,
254a6de824fSLouis Mayencourt 		(uintptr_t)&arm_uuid_spec[TRUSTED_OS_FW_CONTENT_CERT_ID],
255a6de824fSLouis Mayencourt 		open_fip
256a6de824fSLouis Mayencourt 	},
257a6de824fSLouis Mayencourt 	[NON_TRUSTED_FW_CONTENT_CERT_ID] = {
258a6de824fSLouis Mayencourt 		&fip_dev_handle,
259a6de824fSLouis Mayencourt 		(uintptr_t)&arm_uuid_spec[NON_TRUSTED_FW_CONTENT_CERT_ID],
260a6de824fSLouis Mayencourt 		open_fip
261a6de824fSLouis Mayencourt 	},
26244f1aa8eSManish Pandey #if defined(SPD_spmd)
26303a5225cSManish Pandey 	[SIP_SP_CONTENT_CERT_ID] = {
26444f1aa8eSManish Pandey 		&fip_dev_handle,
26503a5225cSManish Pandey 		(uintptr_t)&arm_uuid_spec[SIP_SP_CONTENT_CERT_ID],
26644f1aa8eSManish Pandey 		open_fip
26744f1aa8eSManish Pandey 	},
268990d972fSManish Pandey 	[PLAT_SP_CONTENT_CERT_ID] = {
269990d972fSManish Pandey 		&fip_dev_handle,
270990d972fSManish Pandey 		(uintptr_t)&arm_uuid_spec[PLAT_SP_CONTENT_CERT_ID],
271990d972fSManish Pandey 		open_fip
272990d972fSManish Pandey 	},
27344f1aa8eSManish Pandey #endif
274a6de824fSLouis Mayencourt #endif /* ARM_IO_IN_DTB */
2750a6e7e3bSLouis Mayencourt #endif /* TRUSTED_BOARD_BOOT */
2760a6e7e3bSLouis Mayencourt };
2770a6e7e3bSLouis Mayencourt 
2780a6e7e3bSLouis Mayencourt #ifdef IMAGE_BL2
2790a6e7e3bSLouis Mayencourt 
280*e208f324SRob Hughes #define FCONF_ARM_IO_UUID_NUM_BASE	U(10)
281*e208f324SRob Hughes 
2820a6e7e3bSLouis Mayencourt #if TRUSTED_BOARD_BOOT
283*e208f324SRob Hughes #define FCONF_ARM_IO_UUID_NUM_TBB	U(12)
2840a6e7e3bSLouis Mayencourt #else
285*e208f324SRob Hughes #define FCONF_ARM_IO_UUID_NUM_TBB	U(0)
286*e208f324SRob Hughes #endif /* TRUSTED_BOARD_BOOT */
287*e208f324SRob Hughes 
288*e208f324SRob Hughes #if TRUSTED_BOARD_BOOT && defined(SPD_spmd)
289*e208f324SRob Hughes #define FCONF_ARM_IO_UUID_NUM_SPD	U(2)
290*e208f324SRob Hughes #else
291*e208f324SRob Hughes #define FCONF_ARM_IO_UUID_NUM_SPD	U(0)
292*e208f324SRob Hughes #endif /* TRUSTED_BOARD_BOOT && defined(SPD_spmd) */
293*e208f324SRob Hughes 
294*e208f324SRob Hughes #define FCONF_ARM_IO_UUID_NUMBER	FCONF_ARM_IO_UUID_NUM_BASE + \
295*e208f324SRob Hughes 					FCONF_ARM_IO_UUID_NUM_TBB + FCONF_ARM_IO_UUID_NUM_SPD
2960a6e7e3bSLouis Mayencourt 
2970a6e7e3bSLouis Mayencourt static io_uuid_spec_t fconf_arm_uuids[FCONF_ARM_IO_UUID_NUMBER];
2980a6e7e3bSLouis Mayencourt static OBJECT_POOL_ARRAY(fconf_arm_uuids_pool, fconf_arm_uuids);
2990a6e7e3bSLouis Mayencourt 
3000a6e7e3bSLouis Mayencourt struct policies_load_info {
3010a6e7e3bSLouis Mayencourt 	unsigned int image_id;
3020a6e7e3bSLouis Mayencourt 	const char *name;
3030a6e7e3bSLouis Mayencourt };
3040a6e7e3bSLouis Mayencourt 
3050a6e7e3bSLouis Mayencourt /* image id to property name table */
3060a6e7e3bSLouis Mayencourt static const struct policies_load_info load_info[FCONF_ARM_IO_UUID_NUMBER] = {
3070a6e7e3bSLouis Mayencourt 	{SCP_BL2_IMAGE_ID, "scp_bl2_uuid"},
3080a6e7e3bSLouis Mayencourt 	{BL31_IMAGE_ID, "bl31_uuid"},
3090a6e7e3bSLouis Mayencourt 	{BL32_IMAGE_ID, "bl32_uuid"},
3100a6e7e3bSLouis Mayencourt 	{BL32_EXTRA1_IMAGE_ID, "bl32_extra1_uuid"},
3110a6e7e3bSLouis Mayencourt 	{BL32_EXTRA2_IMAGE_ID, "bl32_extra2_uuid"},
3120a6e7e3bSLouis Mayencourt 	{BL33_IMAGE_ID, "bl33_uuid"},
3130a6e7e3bSLouis Mayencourt 	{HW_CONFIG_ID, "hw_cfg_uuid"},
3140a6e7e3bSLouis Mayencourt 	{SOC_FW_CONFIG_ID, "soc_fw_cfg_uuid"},
3150a6e7e3bSLouis Mayencourt 	{TOS_FW_CONFIG_ID, "tos_fw_cfg_uuid"},
3160a6e7e3bSLouis Mayencourt 	{NT_FW_CONFIG_ID, "nt_fw_cfg_uuid"},
3170a6e7e3bSLouis Mayencourt #if TRUSTED_BOARD_BOOT
318d5de70ceSlaurenw-arm 	{CCA_CONTENT_CERT_ID, "cca_cert_uuid"},
319d5de70ceSlaurenw-arm 	{CORE_SWD_KEY_CERT_ID, "core_swd_cert_uuid"},
320d5de70ceSlaurenw-arm 	{PLAT_KEY_CERT_ID, "plat_cert_uuid"},
3210a6e7e3bSLouis Mayencourt 	{TRUSTED_KEY_CERT_ID, "t_key_cert_uuid"},
3220a6e7e3bSLouis Mayencourt 	{SCP_FW_KEY_CERT_ID, "scp_fw_key_uuid"},
3230a6e7e3bSLouis Mayencourt 	{SOC_FW_KEY_CERT_ID, "soc_fw_key_uuid"},
3240a6e7e3bSLouis Mayencourt 	{TRUSTED_OS_FW_KEY_CERT_ID, "tos_fw_key_cert_uuid"},
3250a6e7e3bSLouis Mayencourt 	{NON_TRUSTED_FW_KEY_CERT_ID, "nt_fw_key_cert_uuid"},
3260a6e7e3bSLouis Mayencourt 	{SCP_FW_CONTENT_CERT_ID, "scp_fw_content_cert_uuid"},
3270a6e7e3bSLouis Mayencourt 	{SOC_FW_CONTENT_CERT_ID, "soc_fw_content_cert_uuid"},
3280a6e7e3bSLouis Mayencourt 	{TRUSTED_OS_FW_CONTENT_CERT_ID, "tos_fw_content_cert_uuid"},
3290a6e7e3bSLouis Mayencourt 	{NON_TRUSTED_FW_CONTENT_CERT_ID, "nt_fw_content_cert_uuid"},
33044f1aa8eSManish Pandey #if defined(SPD_spmd)
33103a5225cSManish Pandey 	{SIP_SP_CONTENT_CERT_ID, "sip_sp_content_cert_uuid"},
332990d972fSManish Pandey 	{PLAT_SP_CONTENT_CERT_ID, "plat_sp_content_cert_uuid"},
33344f1aa8eSManish Pandey #endif
3340a6e7e3bSLouis Mayencourt #endif /* TRUSTED_BOARD_BOOT */
3350a6e7e3bSLouis Mayencourt };
3360a6e7e3bSLouis Mayencourt 
3370a6e7e3bSLouis Mayencourt int fconf_populate_arm_io_policies(uintptr_t config)
3380a6e7e3bSLouis Mayencourt {
3390a6e7e3bSLouis Mayencourt 	int err, node;
3400a6e7e3bSLouis Mayencourt 	unsigned int i;
3410a6e7e3bSLouis Mayencourt 
3420a6e7e3bSLouis Mayencourt 	union uuid_helper_t uuid_helper;
3430a6e7e3bSLouis Mayencourt 	io_uuid_spec_t *uuid_ptr;
3440a6e7e3bSLouis Mayencourt 
3450a6e7e3bSLouis Mayencourt 	/* As libfdt uses void *, we can't avoid this cast */
3460a6e7e3bSLouis Mayencourt 	const void *dtb = (void *)config;
3470a6e7e3bSLouis Mayencourt 
3480a6e7e3bSLouis Mayencourt 	/* Assert the node offset point to "arm,io-fip-handle" compatible property */
3490a6e7e3bSLouis Mayencourt 	const char *compatible_str = "arm,io-fip-handle";
3500a6e7e3bSLouis Mayencourt 	node = fdt_node_offset_by_compatible(dtb, -1, compatible_str);
3510a6e7e3bSLouis Mayencourt 	if (node < 0) {
3520a6e7e3bSLouis Mayencourt 		ERROR("FCONF: Can't find %s compatible in dtb\n", compatible_str);
3530a6e7e3bSLouis Mayencourt 		return node;
3540a6e7e3bSLouis Mayencourt 	}
3550a6e7e3bSLouis Mayencourt 
3560a6e7e3bSLouis Mayencourt 	/* Locate the uuid cells and read the value for all the load info uuid */
3570a6e7e3bSLouis Mayencourt 	for (i = 0; i < FCONF_ARM_IO_UUID_NUMBER; i++) {
3580a6e7e3bSLouis Mayencourt 		uuid_ptr = pool_alloc(&fconf_arm_uuids_pool);
3597d111d99SDavid Horstmann 		err = fdtw_read_uuid(dtb, node, load_info[i].name, 16,
3607d111d99SDavid Horstmann 				     (uint8_t *)&uuid_helper);
3610a6e7e3bSLouis Mayencourt 		if (err < 0) {
3620a6e7e3bSLouis Mayencourt 			WARN("FCONF: Read cell failed for %s\n", load_info[i].name);
3630a6e7e3bSLouis Mayencourt 			return err;
3640a6e7e3bSLouis Mayencourt 		}
3650a6e7e3bSLouis Mayencourt 
3667d111d99SDavid Horstmann 		VERBOSE("FCONF: arm-io_policies.%s cell found with value = "
3677d111d99SDavid Horstmann 			"%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x\n",
3680a6e7e3bSLouis Mayencourt 			load_info[i].name,
3697d111d99SDavid Horstmann 			uuid_helper.uuid_struct.time_low[0], uuid_helper.uuid_struct.time_low[1],
3707d111d99SDavid Horstmann 			uuid_helper.uuid_struct.time_low[2], uuid_helper.uuid_struct.time_low[3],
3717d111d99SDavid Horstmann 			uuid_helper.uuid_struct.time_mid[0], uuid_helper.uuid_struct.time_mid[1],
3727d111d99SDavid Horstmann 			uuid_helper.uuid_struct.time_hi_and_version[0],
3737d111d99SDavid Horstmann 			uuid_helper.uuid_struct.time_hi_and_version[1],
3747d111d99SDavid Horstmann 			uuid_helper.uuid_struct.clock_seq_hi_and_reserved,
3757d111d99SDavid Horstmann 			uuid_helper.uuid_struct.clock_seq_low,
3767d111d99SDavid Horstmann 			uuid_helper.uuid_struct.node[0], uuid_helper.uuid_struct.node[1],
3777d111d99SDavid Horstmann 			uuid_helper.uuid_struct.node[2], uuid_helper.uuid_struct.node[3],
3787d111d99SDavid Horstmann 			uuid_helper.uuid_struct.node[4], uuid_helper.uuid_struct.node[5]);
3790a6e7e3bSLouis Mayencourt 
3800a6e7e3bSLouis Mayencourt 		uuid_ptr->uuid = uuid_helper.uuid_struct;
3810a6e7e3bSLouis Mayencourt 		policies[load_info[i].image_id].image_spec = (uintptr_t)uuid_ptr;
3820a6e7e3bSLouis Mayencourt 		policies[load_info[i].image_id].dev_handle = &fip_dev_handle;
3830a6e7e3bSLouis Mayencourt 		policies[load_info[i].image_id].check = open_fip;
3840a6e7e3bSLouis Mayencourt 	}
3850a6e7e3bSLouis Mayencourt 	return 0;
3860a6e7e3bSLouis Mayencourt }
3870a6e7e3bSLouis Mayencourt 
388a6de824fSLouis Mayencourt #if ARM_IO_IN_DTB
38925d740c4SMadhukar Pappireddy FCONF_REGISTER_POPULATOR(TB_FW, arm_io, fconf_populate_arm_io_policies);
390a6de824fSLouis Mayencourt #endif /* ARM_IO_IN_DTB */
3910a6e7e3bSLouis Mayencourt 
3920a6e7e3bSLouis Mayencourt #endif /* IMAGE_BL2 */
393