xref: /rk3399_ARM-atf/plat/arm/common/fconf/arm_fconf_io.c (revision 3e6d245772ccb4b43f1ba6cd9d1bb8abe86a516c)
10a6e7e3bSLouis Mayencourt /*
2e208f324SRob 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 };
53*3e6d2457SGovindraj Raja 
54*3e6d2457SGovindraj Raja /*
55*3e6d2457SGovindraj Raja  * length will be assigned at runtime based on MBR header data.
56*3e6d2457SGovindraj Raja  * Backup GPT Header is present in Last LBA-1 and its entries
57*3e6d2457SGovindraj Raja  * are last 32 blocks starts at LBA-33, On runtime update these
58*3e6d2457SGovindraj Raja  * before device usage. Update offset to beginning LBA-33 and
59*3e6d2457SGovindraj Raja  * length to LBA-33.
60*3e6d2457SGovindraj Raja  */
61*3e6d2457SGovindraj Raja static io_block_spec_t bkup_gpt_spec = {
62*3e6d2457SGovindraj Raja 	.offset         = PLAT_ARM_FLASH_IMAGE_BASE,
63*3e6d2457SGovindraj Raja 	.length         = 0,
64*3e6d2457SGovindraj Raja };
65ef1daa42SManish V Badarkhe #endif /* ARM_GPT_SUPPORT */
66ef1daa42SManish V Badarkhe 
670a6e7e3bSLouis Mayencourt const io_uuid_spec_t arm_uuid_spec[MAX_NUMBER_IDS] = {
680a6e7e3bSLouis Mayencourt 	[BL2_IMAGE_ID] = {UUID_TRUSTED_BOOT_FIRMWARE_BL2},
690a6e7e3bSLouis Mayencourt 	[TB_FW_CONFIG_ID] = {UUID_TB_FW_CONFIG},
70243875eaSLouis Mayencourt 	[FW_CONFIG_ID] = {UUID_FW_CONFIG},
71a6de824fSLouis Mayencourt #if !ARM_IO_IN_DTB
72a6de824fSLouis Mayencourt 	[SCP_BL2_IMAGE_ID] = {UUID_SCP_FIRMWARE_SCP_BL2},
73a6de824fSLouis Mayencourt 	[BL31_IMAGE_ID] = {UUID_EL3_RUNTIME_FIRMWARE_BL31},
74a6de824fSLouis Mayencourt 	[BL32_IMAGE_ID] = {UUID_SECURE_PAYLOAD_BL32},
75a6de824fSLouis Mayencourt 	[BL32_EXTRA1_IMAGE_ID] = {UUID_SECURE_PAYLOAD_BL32_EXTRA1},
76a6de824fSLouis Mayencourt 	[BL32_EXTRA2_IMAGE_ID] = {UUID_SECURE_PAYLOAD_BL32_EXTRA2},
77a6de824fSLouis Mayencourt 	[BL33_IMAGE_ID] = {UUID_NON_TRUSTED_FIRMWARE_BL33},
78a6de824fSLouis Mayencourt 	[HW_CONFIG_ID] = {UUID_HW_CONFIG},
79a6de824fSLouis Mayencourt 	[SOC_FW_CONFIG_ID] = {UUID_SOC_FW_CONFIG},
80a6de824fSLouis Mayencourt 	[TOS_FW_CONFIG_ID] = {UUID_TOS_FW_CONFIG},
81a6de824fSLouis Mayencourt 	[NT_FW_CONFIG_ID] = {UUID_NT_FW_CONFIG},
829d870b79SZelalem Aweke 	[RMM_IMAGE_ID] = {UUID_REALM_MONITOR_MGMT_FIRMWARE},
83352366edSRajasekaran Kalidoss #if ETHOSN_NPU_TZMP1
84352366edSRajasekaran Kalidoss 	[ETHOSN_NPU_FW_IMAGE_ID] = {UUID_ETHOSN_FW},
85352366edSRajasekaran Kalidoss #endif /* ETHOSN_NPU_TZMP1 */
86a6de824fSLouis Mayencourt #endif /* ARM_IO_IN_DTB */
870a6e7e3bSLouis Mayencourt #if TRUSTED_BOARD_BOOT
880a6e7e3bSLouis Mayencourt 	[TRUSTED_BOOT_FW_CERT_ID] = {UUID_TRUSTED_BOOT_FW_CERT},
89a6de824fSLouis Mayencourt #if !ARM_IO_IN_DTB
90d5de70ceSlaurenw-arm 	[CCA_CONTENT_CERT_ID] = {UUID_CCA_CONTENT_CERT},
91d5de70ceSlaurenw-arm 	[CORE_SWD_KEY_CERT_ID] = {UUID_CORE_SWD_KEY_CERT},
92d5de70ceSlaurenw-arm 	[PLAT_KEY_CERT_ID] = {UUID_PLAT_KEY_CERT},
93a6de824fSLouis Mayencourt 	[TRUSTED_KEY_CERT_ID] = {UUID_TRUSTED_KEY_CERT},
94a6de824fSLouis Mayencourt 	[SCP_FW_KEY_CERT_ID] = {UUID_SCP_FW_KEY_CERT},
95a6de824fSLouis Mayencourt 	[SOC_FW_KEY_CERT_ID] = {UUID_SOC_FW_KEY_CERT},
96a6de824fSLouis Mayencourt 	[TRUSTED_OS_FW_KEY_CERT_ID] = {UUID_TRUSTED_OS_FW_KEY_CERT},
97a6de824fSLouis Mayencourt 	[NON_TRUSTED_FW_KEY_CERT_ID] = {UUID_NON_TRUSTED_FW_KEY_CERT},
98a6de824fSLouis Mayencourt 	[SCP_FW_CONTENT_CERT_ID] = {UUID_SCP_FW_CONTENT_CERT},
99a6de824fSLouis Mayencourt 	[SOC_FW_CONTENT_CERT_ID] = {UUID_SOC_FW_CONTENT_CERT},
100a6de824fSLouis Mayencourt 	[TRUSTED_OS_FW_CONTENT_CERT_ID] = {UUID_TRUSTED_OS_FW_CONTENT_CERT},
101a6de824fSLouis Mayencourt 	[NON_TRUSTED_FW_CONTENT_CERT_ID] = {UUID_NON_TRUSTED_FW_CONTENT_CERT},
10244f1aa8eSManish Pandey #if defined(SPD_spmd)
10303a5225cSManish Pandey 	[SIP_SP_CONTENT_CERT_ID] = {UUID_SIP_SECURE_PARTITION_CONTENT_CERT},
104990d972fSManish Pandey 	[PLAT_SP_CONTENT_CERT_ID] = {UUID_PLAT_SECURE_PARTITION_CONTENT_CERT},
10544f1aa8eSManish Pandey #endif
106352366edSRajasekaran Kalidoss #if ETHOSN_NPU_TZMP1
107352366edSRajasekaran Kalidoss 	[ETHOSN_NPU_FW_KEY_CERT_ID] = {UUID_ETHOSN_FW_KEY_CERTIFICATE},
108352366edSRajasekaran Kalidoss 	[ETHOSN_NPU_FW_CONTENT_CERT_ID] = {UUID_ETHOSN_FW_CONTENT_CERTIFICATE},
109352366edSRajasekaran Kalidoss #endif /* ETHOSN_NPU_TZMP1 */
110a6de824fSLouis Mayencourt #endif /* ARM_IO_IN_DTB */
1110a6e7e3bSLouis Mayencourt #endif /* TRUSTED_BOARD_BOOT */
1120a6e7e3bSLouis Mayencourt };
1130a6e7e3bSLouis Mayencourt 
1140a6e7e3bSLouis Mayencourt /* By default, ARM platforms load images from the FIP */
1150a6e7e3bSLouis Mayencourt struct plat_io_policy policies[MAX_NUMBER_IDS] = {
116ef1daa42SManish V Badarkhe #if ARM_GPT_SUPPORT
117ef1daa42SManish V Badarkhe 	[GPT_IMAGE_ID] = {
118ef1daa42SManish V Badarkhe 		&memmap_dev_handle,
119ef1daa42SManish V Badarkhe 		(uintptr_t)&gpt_spec,
120ef1daa42SManish V Badarkhe 		open_memmap
121ef1daa42SManish V Badarkhe 	},
122*3e6d2457SGovindraj Raja 	[BKUP_GPT_IMAGE_ID] = {
123*3e6d2457SGovindraj Raja 		&memmap_dev_handle,
124*3e6d2457SGovindraj Raja 		(uintptr_t)&bkup_gpt_spec,
125*3e6d2457SGovindraj Raja 		open_memmap
126*3e6d2457SGovindraj Raja 	},
127ef1daa42SManish V Badarkhe #endif /* ARM_GPT_SUPPORT */
1282f1177b2SManish V Badarkhe #if PSA_FWU_SUPPORT
1292f1177b2SManish V Badarkhe 	[FWU_METADATA_IMAGE_ID] = {
1302f1177b2SManish V Badarkhe 		&memmap_dev_handle,
1312f1177b2SManish V Badarkhe 		/* filled runtime from partition information */
1322f1177b2SManish V Badarkhe 		(uintptr_t)&fwu_metadata_spec,
1332f1177b2SManish V Badarkhe 		open_memmap
1342f1177b2SManish V Badarkhe 	},
1352f1177b2SManish V Badarkhe 	[BKUP_FWU_METADATA_IMAGE_ID] = {
1362f1177b2SManish V Badarkhe 		&memmap_dev_handle,
1372f1177b2SManish V Badarkhe 		/* filled runtime from partition information */
1382f1177b2SManish V Badarkhe 		(uintptr_t)&fwu_metadata_spec,
1392f1177b2SManish V Badarkhe 		open_memmap
1402f1177b2SManish V Badarkhe 	},
1412f1177b2SManish V Badarkhe #endif /* PSA_FWU_SUPPORT */
1420a6e7e3bSLouis Mayencourt 	[FIP_IMAGE_ID] = {
1430a6e7e3bSLouis Mayencourt 		&memmap_dev_handle,
1440a6e7e3bSLouis Mayencourt 		(uintptr_t)&fip_block_spec,
1450a6e7e3bSLouis Mayencourt 		open_memmap
1460a6e7e3bSLouis Mayencourt 	},
1470a6e7e3bSLouis Mayencourt 	[BL2_IMAGE_ID] = {
1480a6e7e3bSLouis Mayencourt 		&fip_dev_handle,
1490a6e7e3bSLouis Mayencourt 		(uintptr_t)&arm_uuid_spec[BL2_IMAGE_ID],
1500a6e7e3bSLouis Mayencourt 		open_fip
1510a6e7e3bSLouis Mayencourt 	},
1520a6e7e3bSLouis Mayencourt 	[TB_FW_CONFIG_ID] = {
1530a6e7e3bSLouis Mayencourt 		&fip_dev_handle,
1540a6e7e3bSLouis Mayencourt 		(uintptr_t)&arm_uuid_spec[TB_FW_CONFIG_ID],
1550a6e7e3bSLouis Mayencourt 		open_fip
1560a6e7e3bSLouis Mayencourt 	},
157243875eaSLouis Mayencourt 	[FW_CONFIG_ID] = {
158243875eaSLouis Mayencourt 		&fip_dev_handle,
159243875eaSLouis Mayencourt 		(uintptr_t)&arm_uuid_spec[FW_CONFIG_ID],
160243875eaSLouis Mayencourt 		open_fip
161243875eaSLouis Mayencourt 	},
162a6de824fSLouis Mayencourt #if !ARM_IO_IN_DTB
163a6de824fSLouis Mayencourt 	[SCP_BL2_IMAGE_ID] = {
164a6de824fSLouis Mayencourt 		&fip_dev_handle,
165a6de824fSLouis Mayencourt 		(uintptr_t)&arm_uuid_spec[SCP_BL2_IMAGE_ID],
166a6de824fSLouis Mayencourt 		open_fip
167a6de824fSLouis Mayencourt 	},
168a6de824fSLouis Mayencourt 	[BL31_IMAGE_ID] = {
169a6de824fSLouis Mayencourt 		&fip_dev_handle,
170a6de824fSLouis Mayencourt 		(uintptr_t)&arm_uuid_spec[BL31_IMAGE_ID],
171a6de824fSLouis Mayencourt 		open_fip
172a6de824fSLouis Mayencourt 	},
173a6de824fSLouis Mayencourt 	[BL32_IMAGE_ID] = {
174a6de824fSLouis Mayencourt 		&fip_dev_handle,
175a6de824fSLouis Mayencourt 		(uintptr_t)&arm_uuid_spec[BL32_IMAGE_ID],
176a6de824fSLouis Mayencourt 		open_fip
177a6de824fSLouis Mayencourt 	},
178a6de824fSLouis Mayencourt 	[BL32_EXTRA1_IMAGE_ID] = {
179a6de824fSLouis Mayencourt 		&fip_dev_handle,
180a6de824fSLouis Mayencourt 		(uintptr_t)&arm_uuid_spec[BL32_EXTRA1_IMAGE_ID],
181a6de824fSLouis Mayencourt 		open_fip
182a6de824fSLouis Mayencourt 	},
183a6de824fSLouis Mayencourt 	[BL32_EXTRA2_IMAGE_ID] = {
184a6de824fSLouis Mayencourt 		&fip_dev_handle,
185a6de824fSLouis Mayencourt 		(uintptr_t)&arm_uuid_spec[BL32_EXTRA2_IMAGE_ID],
186a6de824fSLouis Mayencourt 		open_fip
187a6de824fSLouis Mayencourt 	},
188a6de824fSLouis Mayencourt 	[BL33_IMAGE_ID] = {
189a6de824fSLouis Mayencourt 		&fip_dev_handle,
190a6de824fSLouis Mayencourt 		(uintptr_t)&arm_uuid_spec[BL33_IMAGE_ID],
191a6de824fSLouis Mayencourt 		open_fip
192a6de824fSLouis Mayencourt 	},
1939d870b79SZelalem Aweke 	[RMM_IMAGE_ID] = {
1949d870b79SZelalem Aweke 		&fip_dev_handle,
1959d870b79SZelalem Aweke 		(uintptr_t)&arm_uuid_spec[RMM_IMAGE_ID],
1969d870b79SZelalem Aweke 		open_fip
1979d870b79SZelalem Aweke 	},
198a6de824fSLouis Mayencourt 	[HW_CONFIG_ID] = {
199a6de824fSLouis Mayencourt 		&fip_dev_handle,
200a6de824fSLouis Mayencourt 		(uintptr_t)&arm_uuid_spec[HW_CONFIG_ID],
201a6de824fSLouis Mayencourt 		open_fip
202a6de824fSLouis Mayencourt 	},
203a6de824fSLouis Mayencourt 	[SOC_FW_CONFIG_ID] = {
204a6de824fSLouis Mayencourt 		&fip_dev_handle,
205a6de824fSLouis Mayencourt 		(uintptr_t)&arm_uuid_spec[SOC_FW_CONFIG_ID],
206a6de824fSLouis Mayencourt 		open_fip
207a6de824fSLouis Mayencourt 	},
208a6de824fSLouis Mayencourt 	[TOS_FW_CONFIG_ID] = {
209a6de824fSLouis Mayencourt 		&fip_dev_handle,
210a6de824fSLouis Mayencourt 		(uintptr_t)&arm_uuid_spec[TOS_FW_CONFIG_ID],
211a6de824fSLouis Mayencourt 		open_fip
212a6de824fSLouis Mayencourt 	},
213a6de824fSLouis Mayencourt 	[NT_FW_CONFIG_ID] = {
214a6de824fSLouis Mayencourt 		&fip_dev_handle,
215a6de824fSLouis Mayencourt 		(uintptr_t)&arm_uuid_spec[NT_FW_CONFIG_ID],
216a6de824fSLouis Mayencourt 		open_fip
217a6de824fSLouis Mayencourt 	},
218352366edSRajasekaran Kalidoss #if ETHOSN_NPU_TZMP1
219352366edSRajasekaran Kalidoss 	[ETHOSN_NPU_FW_IMAGE_ID] = {
22033bcaed1SRob Hughes 		&fip_dev_handle,
221352366edSRajasekaran Kalidoss 		(uintptr_t)&arm_uuid_spec[ETHOSN_NPU_FW_IMAGE_ID],
22233bcaed1SRob Hughes 		open_fip
22333bcaed1SRob Hughes 	},
224352366edSRajasekaran Kalidoss #endif /* ETHOSN_NPU_TZMP1 */
225a6de824fSLouis Mayencourt #endif /* ARM_IO_IN_DTB */
2260a6e7e3bSLouis Mayencourt #if TRUSTED_BOARD_BOOT
2270a6e7e3bSLouis Mayencourt 	[TRUSTED_BOOT_FW_CERT_ID] = {
2280a6e7e3bSLouis Mayencourt 		&fip_dev_handle,
2290a6e7e3bSLouis Mayencourt 		(uintptr_t)&arm_uuid_spec[TRUSTED_BOOT_FW_CERT_ID],
2300a6e7e3bSLouis Mayencourt 		open_fip
2310a6e7e3bSLouis Mayencourt 	},
232a6de824fSLouis Mayencourt #if !ARM_IO_IN_DTB
233d5de70ceSlaurenw-arm 	[CCA_CONTENT_CERT_ID] = {
234d5de70ceSlaurenw-arm 		&fip_dev_handle,
235d5de70ceSlaurenw-arm 		(uintptr_t)&arm_uuid_spec[CCA_CONTENT_CERT_ID],
236d5de70ceSlaurenw-arm 		open_fip
237d5de70ceSlaurenw-arm 	},
238d5de70ceSlaurenw-arm 	[CORE_SWD_KEY_CERT_ID] = {
239d5de70ceSlaurenw-arm 		&fip_dev_handle,
240d5de70ceSlaurenw-arm 		(uintptr_t)&arm_uuid_spec[CORE_SWD_KEY_CERT_ID],
241d5de70ceSlaurenw-arm 		open_fip
242d5de70ceSlaurenw-arm 	},
243d5de70ceSlaurenw-arm 	[PLAT_KEY_CERT_ID] = {
244d5de70ceSlaurenw-arm 		&fip_dev_handle,
245d5de70ceSlaurenw-arm 		(uintptr_t)&arm_uuid_spec[PLAT_KEY_CERT_ID],
246d5de70ceSlaurenw-arm 		open_fip
247d5de70ceSlaurenw-arm 	},
248a6de824fSLouis Mayencourt 	[TRUSTED_KEY_CERT_ID] = {
249a6de824fSLouis Mayencourt 		&fip_dev_handle,
250a6de824fSLouis Mayencourt 		(uintptr_t)&arm_uuid_spec[TRUSTED_KEY_CERT_ID],
251a6de824fSLouis Mayencourt 		open_fip
252a6de824fSLouis Mayencourt 	},
253a6de824fSLouis Mayencourt 	[SCP_FW_KEY_CERT_ID] = {
254a6de824fSLouis Mayencourt 		&fip_dev_handle,
255a6de824fSLouis Mayencourt 		(uintptr_t)&arm_uuid_spec[SCP_FW_KEY_CERT_ID],
256a6de824fSLouis Mayencourt 		open_fip
257a6de824fSLouis Mayencourt 	},
258a6de824fSLouis Mayencourt 	[SOC_FW_KEY_CERT_ID] = {
259a6de824fSLouis Mayencourt 		&fip_dev_handle,
260a6de824fSLouis Mayencourt 		(uintptr_t)&arm_uuid_spec[SOC_FW_KEY_CERT_ID],
261a6de824fSLouis Mayencourt 		open_fip
262a6de824fSLouis Mayencourt 	},
263a6de824fSLouis Mayencourt 	[TRUSTED_OS_FW_KEY_CERT_ID] = {
264a6de824fSLouis Mayencourt 		&fip_dev_handle,
265a6de824fSLouis Mayencourt 		(uintptr_t)&arm_uuid_spec[TRUSTED_OS_FW_KEY_CERT_ID],
266a6de824fSLouis Mayencourt 		open_fip
267a6de824fSLouis Mayencourt 	},
268a6de824fSLouis Mayencourt 	[NON_TRUSTED_FW_KEY_CERT_ID] = {
269a6de824fSLouis Mayencourt 		&fip_dev_handle,
270a6de824fSLouis Mayencourt 		(uintptr_t)&arm_uuid_spec[NON_TRUSTED_FW_KEY_CERT_ID],
271a6de824fSLouis Mayencourt 		open_fip
272a6de824fSLouis Mayencourt 	},
273a6de824fSLouis Mayencourt 	[SCP_FW_CONTENT_CERT_ID] = {
274a6de824fSLouis Mayencourt 		&fip_dev_handle,
275a6de824fSLouis Mayencourt 		(uintptr_t)&arm_uuid_spec[SCP_FW_CONTENT_CERT_ID],
276a6de824fSLouis Mayencourt 		open_fip
277a6de824fSLouis Mayencourt 	},
278a6de824fSLouis Mayencourt 	[SOC_FW_CONTENT_CERT_ID] = {
279a6de824fSLouis Mayencourt 		&fip_dev_handle,
280a6de824fSLouis Mayencourt 		(uintptr_t)&arm_uuid_spec[SOC_FW_CONTENT_CERT_ID],
281a6de824fSLouis Mayencourt 		open_fip
282a6de824fSLouis Mayencourt 	},
283a6de824fSLouis Mayencourt 	[TRUSTED_OS_FW_CONTENT_CERT_ID] = {
284a6de824fSLouis Mayencourt 		&fip_dev_handle,
285a6de824fSLouis Mayencourt 		(uintptr_t)&arm_uuid_spec[TRUSTED_OS_FW_CONTENT_CERT_ID],
286a6de824fSLouis Mayencourt 		open_fip
287a6de824fSLouis Mayencourt 	},
288a6de824fSLouis Mayencourt 	[NON_TRUSTED_FW_CONTENT_CERT_ID] = {
289a6de824fSLouis Mayencourt 		&fip_dev_handle,
290a6de824fSLouis Mayencourt 		(uintptr_t)&arm_uuid_spec[NON_TRUSTED_FW_CONTENT_CERT_ID],
291a6de824fSLouis Mayencourt 		open_fip
292a6de824fSLouis Mayencourt 	},
29344f1aa8eSManish Pandey #if defined(SPD_spmd)
29403a5225cSManish Pandey 	[SIP_SP_CONTENT_CERT_ID] = {
29544f1aa8eSManish Pandey 		&fip_dev_handle,
29603a5225cSManish Pandey 		(uintptr_t)&arm_uuid_spec[SIP_SP_CONTENT_CERT_ID],
29744f1aa8eSManish Pandey 		open_fip
29844f1aa8eSManish Pandey 	},
299990d972fSManish Pandey 	[PLAT_SP_CONTENT_CERT_ID] = {
300990d972fSManish Pandey 		&fip_dev_handle,
301990d972fSManish Pandey 		(uintptr_t)&arm_uuid_spec[PLAT_SP_CONTENT_CERT_ID],
302990d972fSManish Pandey 		open_fip
303990d972fSManish Pandey 	},
30444f1aa8eSManish Pandey #endif
305352366edSRajasekaran Kalidoss #if ETHOSN_NPU_TZMP1
306352366edSRajasekaran Kalidoss 	[ETHOSN_NPU_FW_KEY_CERT_ID] = {
30733bcaed1SRob Hughes 		&fip_dev_handle,
308352366edSRajasekaran Kalidoss 		(uintptr_t)&arm_uuid_spec[ETHOSN_NPU_FW_KEY_CERT_ID],
30933bcaed1SRob Hughes 		open_fip
31033bcaed1SRob Hughes 	},
311352366edSRajasekaran Kalidoss 	[ETHOSN_NPU_FW_CONTENT_CERT_ID] = {
31233bcaed1SRob Hughes 		&fip_dev_handle,
313352366edSRajasekaran Kalidoss 		(uintptr_t)&arm_uuid_spec[ETHOSN_NPU_FW_CONTENT_CERT_ID],
31433bcaed1SRob Hughes 		open_fip
31533bcaed1SRob Hughes 	},
316352366edSRajasekaran Kalidoss #endif /* ETHOSN_NPU_TZMP1 */
317a6de824fSLouis Mayencourt #endif /* ARM_IO_IN_DTB */
3180a6e7e3bSLouis Mayencourt #endif /* TRUSTED_BOARD_BOOT */
3190a6e7e3bSLouis Mayencourt };
3200a6e7e3bSLouis Mayencourt 
3210a6e7e3bSLouis Mayencourt #ifdef IMAGE_BL2
3220a6e7e3bSLouis Mayencourt 
323e208f324SRob Hughes #define FCONF_ARM_IO_UUID_NUM_BASE	U(10)
324e208f324SRob Hughes 
325352366edSRajasekaran Kalidoss #if ETHOSN_NPU_TZMP1
32633bcaed1SRob Hughes #define FCONF_ARM_IO_UUID_NUM_NPU	U(1)
32733bcaed1SRob Hughes #else
32833bcaed1SRob Hughes #define FCONF_ARM_IO_UUID_NUM_NPU	U(0)
329352366edSRajasekaran Kalidoss #endif /* ETHOSN_NPU_TZMP1 */
33033bcaed1SRob Hughes 
3310a6e7e3bSLouis Mayencourt #if TRUSTED_BOARD_BOOT
332e208f324SRob Hughes #define FCONF_ARM_IO_UUID_NUM_TBB	U(12)
3330a6e7e3bSLouis Mayencourt #else
334e208f324SRob Hughes #define FCONF_ARM_IO_UUID_NUM_TBB	U(0)
335e208f324SRob Hughes #endif /* TRUSTED_BOARD_BOOT */
336e208f324SRob Hughes 
337e208f324SRob Hughes #if TRUSTED_BOARD_BOOT && defined(SPD_spmd)
338e208f324SRob Hughes #define FCONF_ARM_IO_UUID_NUM_SPD	U(2)
339e208f324SRob Hughes #else
340e208f324SRob Hughes #define FCONF_ARM_IO_UUID_NUM_SPD	U(0)
341e208f324SRob Hughes #endif /* TRUSTED_BOARD_BOOT && defined(SPD_spmd) */
342e208f324SRob Hughes 
343352366edSRajasekaran Kalidoss #if TRUSTED_BOARD_BOOT && ETHOSN_NPU_TZMP1
34433bcaed1SRob Hughes #define FCONF_ARM_IO_UUID_NUM_NPU_TBB	U(2)
34533bcaed1SRob Hughes #else
34633bcaed1SRob Hughes #define FCONF_ARM_IO_UUID_NUM_NPU_TBB	U(0)
347352366edSRajasekaran Kalidoss #endif /* TRUSTED_BOARD_BOOT && ETHOSN_NPU_TZMP1 */
34833bcaed1SRob Hughes 
349e208f324SRob Hughes #define FCONF_ARM_IO_UUID_NUMBER	FCONF_ARM_IO_UUID_NUM_BASE + \
35033bcaed1SRob Hughes 					FCONF_ARM_IO_UUID_NUM_NPU + \
35133bcaed1SRob Hughes 					FCONF_ARM_IO_UUID_NUM_TBB + \
35233bcaed1SRob Hughes 					FCONF_ARM_IO_UUID_NUM_SPD + \
35333bcaed1SRob Hughes 					FCONF_ARM_IO_UUID_NUM_NPU_TBB
3540a6e7e3bSLouis Mayencourt 
3550a6e7e3bSLouis Mayencourt static io_uuid_spec_t fconf_arm_uuids[FCONF_ARM_IO_UUID_NUMBER];
3560a6e7e3bSLouis Mayencourt static OBJECT_POOL_ARRAY(fconf_arm_uuids_pool, fconf_arm_uuids);
3570a6e7e3bSLouis Mayencourt 
3580a6e7e3bSLouis Mayencourt struct policies_load_info {
3590a6e7e3bSLouis Mayencourt 	unsigned int image_id;
3600a6e7e3bSLouis Mayencourt 	const char *name;
3610a6e7e3bSLouis Mayencourt };
3620a6e7e3bSLouis Mayencourt 
3630a6e7e3bSLouis Mayencourt /* image id to property name table */
3640a6e7e3bSLouis Mayencourt static const struct policies_load_info load_info[FCONF_ARM_IO_UUID_NUMBER] = {
3650a6e7e3bSLouis Mayencourt 	{SCP_BL2_IMAGE_ID, "scp_bl2_uuid"},
3660a6e7e3bSLouis Mayencourt 	{BL31_IMAGE_ID, "bl31_uuid"},
3670a6e7e3bSLouis Mayencourt 	{BL32_IMAGE_ID, "bl32_uuid"},
3680a6e7e3bSLouis Mayencourt 	{BL32_EXTRA1_IMAGE_ID, "bl32_extra1_uuid"},
3690a6e7e3bSLouis Mayencourt 	{BL32_EXTRA2_IMAGE_ID, "bl32_extra2_uuid"},
3700a6e7e3bSLouis Mayencourt 	{BL33_IMAGE_ID, "bl33_uuid"},
3710a6e7e3bSLouis Mayencourt 	{HW_CONFIG_ID, "hw_cfg_uuid"},
3720a6e7e3bSLouis Mayencourt 	{SOC_FW_CONFIG_ID, "soc_fw_cfg_uuid"},
3730a6e7e3bSLouis Mayencourt 	{TOS_FW_CONFIG_ID, "tos_fw_cfg_uuid"},
3740a6e7e3bSLouis Mayencourt 	{NT_FW_CONFIG_ID, "nt_fw_cfg_uuid"},
375352366edSRajasekaran Kalidoss #if ETHOSN_NPU_TZMP1
376352366edSRajasekaran Kalidoss 	{ETHOSN_NPU_FW_IMAGE_ID, "ethosn_npu_fw_uuid"},
377352366edSRajasekaran Kalidoss #endif /* ETHOSN_NPU_TZMP1 */
3780a6e7e3bSLouis Mayencourt #if TRUSTED_BOARD_BOOT
379d5de70ceSlaurenw-arm 	{CCA_CONTENT_CERT_ID, "cca_cert_uuid"},
380d5de70ceSlaurenw-arm 	{CORE_SWD_KEY_CERT_ID, "core_swd_cert_uuid"},
381d5de70ceSlaurenw-arm 	{PLAT_KEY_CERT_ID, "plat_cert_uuid"},
3820a6e7e3bSLouis Mayencourt 	{TRUSTED_KEY_CERT_ID, "t_key_cert_uuid"},
3830a6e7e3bSLouis Mayencourt 	{SCP_FW_KEY_CERT_ID, "scp_fw_key_uuid"},
3840a6e7e3bSLouis Mayencourt 	{SOC_FW_KEY_CERT_ID, "soc_fw_key_uuid"},
3850a6e7e3bSLouis Mayencourt 	{TRUSTED_OS_FW_KEY_CERT_ID, "tos_fw_key_cert_uuid"},
3860a6e7e3bSLouis Mayencourt 	{NON_TRUSTED_FW_KEY_CERT_ID, "nt_fw_key_cert_uuid"},
3870a6e7e3bSLouis Mayencourt 	{SCP_FW_CONTENT_CERT_ID, "scp_fw_content_cert_uuid"},
3880a6e7e3bSLouis Mayencourt 	{SOC_FW_CONTENT_CERT_ID, "soc_fw_content_cert_uuid"},
3890a6e7e3bSLouis Mayencourt 	{TRUSTED_OS_FW_CONTENT_CERT_ID, "tos_fw_content_cert_uuid"},
3900a6e7e3bSLouis Mayencourt 	{NON_TRUSTED_FW_CONTENT_CERT_ID, "nt_fw_content_cert_uuid"},
39144f1aa8eSManish Pandey #if defined(SPD_spmd)
39203a5225cSManish Pandey 	{SIP_SP_CONTENT_CERT_ID, "sip_sp_content_cert_uuid"},
393990d972fSManish Pandey 	{PLAT_SP_CONTENT_CERT_ID, "plat_sp_content_cert_uuid"},
39444f1aa8eSManish Pandey #endif
395352366edSRajasekaran Kalidoss #if ETHOSN_NPU_TZMP1
396352366edSRajasekaran Kalidoss 	{ETHOSN_NPU_FW_KEY_CERT_ID, "ethosn_npu_fw_key_cert_uuid"},
397352366edSRajasekaran Kalidoss 	{ETHOSN_NPU_FW_CONTENT_CERT_ID, "ethosn_npu_fw_content_cert_uuid"},
398352366edSRajasekaran Kalidoss #endif /* ETHOSN_NPU_TZMP1 */
3990a6e7e3bSLouis Mayencourt #endif /* TRUSTED_BOARD_BOOT */
4000a6e7e3bSLouis Mayencourt };
4010a6e7e3bSLouis Mayencourt 
4020a6e7e3bSLouis Mayencourt int fconf_populate_arm_io_policies(uintptr_t config)
4030a6e7e3bSLouis Mayencourt {
4040a6e7e3bSLouis Mayencourt 	int err, node;
4050a6e7e3bSLouis Mayencourt 	unsigned int i;
4060a6e7e3bSLouis Mayencourt 
4070a6e7e3bSLouis Mayencourt 	union uuid_helper_t uuid_helper;
4080a6e7e3bSLouis Mayencourt 	io_uuid_spec_t *uuid_ptr;
4090a6e7e3bSLouis Mayencourt 
4100a6e7e3bSLouis Mayencourt 	/* As libfdt uses void *, we can't avoid this cast */
4110a6e7e3bSLouis Mayencourt 	const void *dtb = (void *)config;
4120a6e7e3bSLouis Mayencourt 
4130a6e7e3bSLouis Mayencourt 	/* Assert the node offset point to "arm,io-fip-handle" compatible property */
4140a6e7e3bSLouis Mayencourt 	const char *compatible_str = "arm,io-fip-handle";
4150a6e7e3bSLouis Mayencourt 	node = fdt_node_offset_by_compatible(dtb, -1, compatible_str);
4160a6e7e3bSLouis Mayencourt 	if (node < 0) {
4170a6e7e3bSLouis Mayencourt 		ERROR("FCONF: Can't find %s compatible in dtb\n", compatible_str);
4180a6e7e3bSLouis Mayencourt 		return node;
4190a6e7e3bSLouis Mayencourt 	}
4200a6e7e3bSLouis Mayencourt 
4210a6e7e3bSLouis Mayencourt 	/* Locate the uuid cells and read the value for all the load info uuid */
4220a6e7e3bSLouis Mayencourt 	for (i = 0; i < FCONF_ARM_IO_UUID_NUMBER; i++) {
4230a6e7e3bSLouis Mayencourt 		uuid_ptr = pool_alloc(&fconf_arm_uuids_pool);
4247d111d99SDavid Horstmann 		err = fdtw_read_uuid(dtb, node, load_info[i].name, 16,
4257d111d99SDavid Horstmann 				     (uint8_t *)&uuid_helper);
4260a6e7e3bSLouis Mayencourt 		if (err < 0) {
4270a6e7e3bSLouis Mayencourt 			WARN("FCONF: Read cell failed for %s\n", load_info[i].name);
4280a6e7e3bSLouis Mayencourt 			return err;
4290a6e7e3bSLouis Mayencourt 		}
4300a6e7e3bSLouis Mayencourt 
4317d111d99SDavid Horstmann 		VERBOSE("FCONF: arm-io_policies.%s cell found with value = "
4327d111d99SDavid Horstmann 			"%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x\n",
4330a6e7e3bSLouis Mayencourt 			load_info[i].name,
4347d111d99SDavid Horstmann 			uuid_helper.uuid_struct.time_low[0], uuid_helper.uuid_struct.time_low[1],
4357d111d99SDavid Horstmann 			uuid_helper.uuid_struct.time_low[2], uuid_helper.uuid_struct.time_low[3],
4367d111d99SDavid Horstmann 			uuid_helper.uuid_struct.time_mid[0], uuid_helper.uuid_struct.time_mid[1],
4377d111d99SDavid Horstmann 			uuid_helper.uuid_struct.time_hi_and_version[0],
4387d111d99SDavid Horstmann 			uuid_helper.uuid_struct.time_hi_and_version[1],
4397d111d99SDavid Horstmann 			uuid_helper.uuid_struct.clock_seq_hi_and_reserved,
4407d111d99SDavid Horstmann 			uuid_helper.uuid_struct.clock_seq_low,
4417d111d99SDavid Horstmann 			uuid_helper.uuid_struct.node[0], uuid_helper.uuid_struct.node[1],
4427d111d99SDavid Horstmann 			uuid_helper.uuid_struct.node[2], uuid_helper.uuid_struct.node[3],
4437d111d99SDavid Horstmann 			uuid_helper.uuid_struct.node[4], uuid_helper.uuid_struct.node[5]);
4440a6e7e3bSLouis Mayencourt 
4450a6e7e3bSLouis Mayencourt 		uuid_ptr->uuid = uuid_helper.uuid_struct;
4460a6e7e3bSLouis Mayencourt 		policies[load_info[i].image_id].image_spec = (uintptr_t)uuid_ptr;
4470a6e7e3bSLouis Mayencourt 		policies[load_info[i].image_id].dev_handle = &fip_dev_handle;
4480a6e7e3bSLouis Mayencourt 		policies[load_info[i].image_id].check = open_fip;
4490a6e7e3bSLouis Mayencourt 	}
4500a6e7e3bSLouis Mayencourt 	return 0;
4510a6e7e3bSLouis Mayencourt }
4520a6e7e3bSLouis Mayencourt 
453a6de824fSLouis Mayencourt #if ARM_IO_IN_DTB
45425d740c4SMadhukar Pappireddy FCONF_REGISTER_POPULATOR(TB_FW, arm_io, fconf_populate_arm_io_policies);
455a6de824fSLouis Mayencourt #endif /* ARM_IO_IN_DTB */
4560a6e7e3bSLouis Mayencourt 
4570a6e7e3bSLouis Mayencourt #endif /* IMAGE_BL2 */
458