xref: /arm-trusted-firmware/plat/arm/common/fconf/arm_fconf_io.c (revision 91f16700b400a8c0651d24a598fc48ee2997a0d7)
1*91f16700Schasinglulu /*
2*91f16700Schasinglulu  * Copyright (c) 2019-2023, ARM Limited. All rights reserved.
3*91f16700Schasinglulu  *
4*91f16700Schasinglulu  * SPDX-License-Identifier: BSD-3-Clause
5*91f16700Schasinglulu  */
6*91f16700Schasinglulu 
7*91f16700Schasinglulu #include <assert.h>
8*91f16700Schasinglulu 
9*91f16700Schasinglulu #include <common/debug.h>
10*91f16700Schasinglulu #include <common/fdt_wrappers.h>
11*91f16700Schasinglulu #include <drivers/io/io_storage.h>
12*91f16700Schasinglulu #include <drivers/partition/partition.h>
13*91f16700Schasinglulu #include <lib/object_pool.h>
14*91f16700Schasinglulu #include <libfdt.h>
15*91f16700Schasinglulu #include <tools_share/firmware_image_package.h>
16*91f16700Schasinglulu 
17*91f16700Schasinglulu #include <plat/arm/common/arm_fconf_getter.h>
18*91f16700Schasinglulu #include <plat/arm/common/arm_fconf_io_storage.h>
19*91f16700Schasinglulu #include <platform_def.h>
20*91f16700Schasinglulu 
21*91f16700Schasinglulu #if PSA_FWU_SUPPORT
22*91f16700Schasinglulu /* metadata entry details */
23*91f16700Schasinglulu static io_block_spec_t fwu_metadata_spec;
24*91f16700Schasinglulu #endif /* PSA_FWU_SUPPORT */
25*91f16700Schasinglulu 
26*91f16700Schasinglulu io_block_spec_t fip_block_spec = {
27*91f16700Schasinglulu /*
28*91f16700Schasinglulu  * This is fixed FIP address used by BL1, BL2 loads partition table
29*91f16700Schasinglulu  * to get FIP address.
30*91f16700Schasinglulu  */
31*91f16700Schasinglulu #if ARM_GPT_SUPPORT
32*91f16700Schasinglulu 	.offset = PLAT_ARM_FLASH_IMAGE_BASE + PLAT_ARM_FIP_OFFSET_IN_GPT,
33*91f16700Schasinglulu #else
34*91f16700Schasinglulu 	.offset = PLAT_ARM_FLASH_IMAGE_BASE,
35*91f16700Schasinglulu #endif /* ARM_GPT_SUPPORT */
36*91f16700Schasinglulu 	.length = PLAT_ARM_FLASH_IMAGE_MAX_SIZE
37*91f16700Schasinglulu };
38*91f16700Schasinglulu 
39*91f16700Schasinglulu #if ARM_GPT_SUPPORT
40*91f16700Schasinglulu static const io_block_spec_t gpt_spec = {
41*91f16700Schasinglulu 	.offset         = PLAT_ARM_FLASH_IMAGE_BASE,
42*91f16700Schasinglulu 	/*
43*91f16700Schasinglulu 	 * PLAT_PARTITION_BLOCK_SIZE = 512
44*91f16700Schasinglulu 	 * PLAT_PARTITION_MAX_ENTRIES = 128
45*91f16700Schasinglulu 	 * each sector has 4 partition entries, and there are
46*91f16700Schasinglulu 	 * 2 reserved sectors i.e. protective MBR and primary
47*91f16700Schasinglulu 	 * GPT header hence length gets calculated as,
48*91f16700Schasinglulu 	 * length = PLAT_PARTITION_BLOCK_SIZE * (128/4 + 2)
49*91f16700Schasinglulu 	 */
50*91f16700Schasinglulu 	.length         = LBA(PLAT_PARTITION_MAX_ENTRIES / 4 + 2),
51*91f16700Schasinglulu };
52*91f16700Schasinglulu 
53*91f16700Schasinglulu /*
54*91f16700Schasinglulu  * length will be assigned at runtime based on MBR header data.
55*91f16700Schasinglulu  * Backup GPT Header is present in Last LBA-1 and its entries
56*91f16700Schasinglulu  * are last 32 blocks starts at LBA-33, On runtime update these
57*91f16700Schasinglulu  * before device usage. Update offset to beginning LBA-33 and
58*91f16700Schasinglulu  * length to LBA-33.
59*91f16700Schasinglulu  */
60*91f16700Schasinglulu static io_block_spec_t bkup_gpt_spec = {
61*91f16700Schasinglulu 	.offset         = PLAT_ARM_FLASH_IMAGE_BASE,
62*91f16700Schasinglulu 	.length         = 0,
63*91f16700Schasinglulu };
64*91f16700Schasinglulu #endif /* ARM_GPT_SUPPORT */
65*91f16700Schasinglulu 
66*91f16700Schasinglulu const io_uuid_spec_t arm_uuid_spec[MAX_NUMBER_IDS] = {
67*91f16700Schasinglulu 	[BL2_IMAGE_ID] = {UUID_TRUSTED_BOOT_FIRMWARE_BL2},
68*91f16700Schasinglulu 	[TB_FW_CONFIG_ID] = {UUID_TB_FW_CONFIG},
69*91f16700Schasinglulu 	[FW_CONFIG_ID] = {UUID_FW_CONFIG},
70*91f16700Schasinglulu #if !ARM_IO_IN_DTB
71*91f16700Schasinglulu 	[SCP_BL2_IMAGE_ID] = {UUID_SCP_FIRMWARE_SCP_BL2},
72*91f16700Schasinglulu 	[BL31_IMAGE_ID] = {UUID_EL3_RUNTIME_FIRMWARE_BL31},
73*91f16700Schasinglulu 	[BL32_IMAGE_ID] = {UUID_SECURE_PAYLOAD_BL32},
74*91f16700Schasinglulu 	[BL32_EXTRA1_IMAGE_ID] = {UUID_SECURE_PAYLOAD_BL32_EXTRA1},
75*91f16700Schasinglulu 	[BL32_EXTRA2_IMAGE_ID] = {UUID_SECURE_PAYLOAD_BL32_EXTRA2},
76*91f16700Schasinglulu 	[BL33_IMAGE_ID] = {UUID_NON_TRUSTED_FIRMWARE_BL33},
77*91f16700Schasinglulu 	[HW_CONFIG_ID] = {UUID_HW_CONFIG},
78*91f16700Schasinglulu 	[SOC_FW_CONFIG_ID] = {UUID_SOC_FW_CONFIG},
79*91f16700Schasinglulu 	[TOS_FW_CONFIG_ID] = {UUID_TOS_FW_CONFIG},
80*91f16700Schasinglulu 	[NT_FW_CONFIG_ID] = {UUID_NT_FW_CONFIG},
81*91f16700Schasinglulu 	[RMM_IMAGE_ID] = {UUID_REALM_MONITOR_MGMT_FIRMWARE},
82*91f16700Schasinglulu #if ETHOSN_NPU_TZMP1
83*91f16700Schasinglulu 	[ETHOSN_NPU_FW_IMAGE_ID] = {UUID_ETHOSN_FW},
84*91f16700Schasinglulu #endif /* ETHOSN_NPU_TZMP1 */
85*91f16700Schasinglulu #endif /* ARM_IO_IN_DTB */
86*91f16700Schasinglulu #if TRUSTED_BOARD_BOOT
87*91f16700Schasinglulu 	[TRUSTED_BOOT_FW_CERT_ID] = {UUID_TRUSTED_BOOT_FW_CERT},
88*91f16700Schasinglulu #if !ARM_IO_IN_DTB
89*91f16700Schasinglulu 	[CCA_CONTENT_CERT_ID] = {UUID_CCA_CONTENT_CERT},
90*91f16700Schasinglulu 	[CORE_SWD_KEY_CERT_ID] = {UUID_CORE_SWD_KEY_CERT},
91*91f16700Schasinglulu 	[PLAT_KEY_CERT_ID] = {UUID_PLAT_KEY_CERT},
92*91f16700Schasinglulu 	[TRUSTED_KEY_CERT_ID] = {UUID_TRUSTED_KEY_CERT},
93*91f16700Schasinglulu 	[SCP_FW_KEY_CERT_ID] = {UUID_SCP_FW_KEY_CERT},
94*91f16700Schasinglulu 	[SOC_FW_KEY_CERT_ID] = {UUID_SOC_FW_KEY_CERT},
95*91f16700Schasinglulu 	[TRUSTED_OS_FW_KEY_CERT_ID] = {UUID_TRUSTED_OS_FW_KEY_CERT},
96*91f16700Schasinglulu 	[NON_TRUSTED_FW_KEY_CERT_ID] = {UUID_NON_TRUSTED_FW_KEY_CERT},
97*91f16700Schasinglulu 	[SCP_FW_CONTENT_CERT_ID] = {UUID_SCP_FW_CONTENT_CERT},
98*91f16700Schasinglulu 	[SOC_FW_CONTENT_CERT_ID] = {UUID_SOC_FW_CONTENT_CERT},
99*91f16700Schasinglulu 	[TRUSTED_OS_FW_CONTENT_CERT_ID] = {UUID_TRUSTED_OS_FW_CONTENT_CERT},
100*91f16700Schasinglulu 	[NON_TRUSTED_FW_CONTENT_CERT_ID] = {UUID_NON_TRUSTED_FW_CONTENT_CERT},
101*91f16700Schasinglulu #if defined(SPD_spmd)
102*91f16700Schasinglulu 	[SIP_SP_CONTENT_CERT_ID] = {UUID_SIP_SECURE_PARTITION_CONTENT_CERT},
103*91f16700Schasinglulu 	[PLAT_SP_CONTENT_CERT_ID] = {UUID_PLAT_SECURE_PARTITION_CONTENT_CERT},
104*91f16700Schasinglulu #endif
105*91f16700Schasinglulu #if ETHOSN_NPU_TZMP1
106*91f16700Schasinglulu 	[ETHOSN_NPU_FW_KEY_CERT_ID] = {UUID_ETHOSN_FW_KEY_CERTIFICATE},
107*91f16700Schasinglulu 	[ETHOSN_NPU_FW_CONTENT_CERT_ID] = {UUID_ETHOSN_FW_CONTENT_CERTIFICATE},
108*91f16700Schasinglulu #endif /* ETHOSN_NPU_TZMP1 */
109*91f16700Schasinglulu #endif /* ARM_IO_IN_DTB */
110*91f16700Schasinglulu #endif /* TRUSTED_BOARD_BOOT */
111*91f16700Schasinglulu };
112*91f16700Schasinglulu 
113*91f16700Schasinglulu /* By default, ARM platforms load images from the FIP */
114*91f16700Schasinglulu struct plat_io_policy policies[MAX_NUMBER_IDS] = {
115*91f16700Schasinglulu #if ARM_GPT_SUPPORT
116*91f16700Schasinglulu 	[GPT_IMAGE_ID] = {
117*91f16700Schasinglulu 		&memmap_dev_handle,
118*91f16700Schasinglulu 		(uintptr_t)&gpt_spec,
119*91f16700Schasinglulu 		open_memmap
120*91f16700Schasinglulu 	},
121*91f16700Schasinglulu 	[BKUP_GPT_IMAGE_ID] = {
122*91f16700Schasinglulu 		&memmap_dev_handle,
123*91f16700Schasinglulu 		(uintptr_t)&bkup_gpt_spec,
124*91f16700Schasinglulu 		open_memmap
125*91f16700Schasinglulu 	},
126*91f16700Schasinglulu #endif /* ARM_GPT_SUPPORT */
127*91f16700Schasinglulu #if PSA_FWU_SUPPORT
128*91f16700Schasinglulu 	[FWU_METADATA_IMAGE_ID] = {
129*91f16700Schasinglulu 		&memmap_dev_handle,
130*91f16700Schasinglulu 		/* filled runtime from partition information */
131*91f16700Schasinglulu 		(uintptr_t)&fwu_metadata_spec,
132*91f16700Schasinglulu 		open_memmap
133*91f16700Schasinglulu 	},
134*91f16700Schasinglulu 	[BKUP_FWU_METADATA_IMAGE_ID] = {
135*91f16700Schasinglulu 		&memmap_dev_handle,
136*91f16700Schasinglulu 		/* filled runtime from partition information */
137*91f16700Schasinglulu 		(uintptr_t)&fwu_metadata_spec,
138*91f16700Schasinglulu 		open_memmap
139*91f16700Schasinglulu 	},
140*91f16700Schasinglulu #endif /* PSA_FWU_SUPPORT */
141*91f16700Schasinglulu 	[FIP_IMAGE_ID] = {
142*91f16700Schasinglulu 		&memmap_dev_handle,
143*91f16700Schasinglulu 		(uintptr_t)&fip_block_spec,
144*91f16700Schasinglulu 		open_memmap
145*91f16700Schasinglulu 	},
146*91f16700Schasinglulu 	[BL2_IMAGE_ID] = {
147*91f16700Schasinglulu 		&fip_dev_handle,
148*91f16700Schasinglulu 		(uintptr_t)&arm_uuid_spec[BL2_IMAGE_ID],
149*91f16700Schasinglulu 		open_fip
150*91f16700Schasinglulu 	},
151*91f16700Schasinglulu 	[TB_FW_CONFIG_ID] = {
152*91f16700Schasinglulu 		&fip_dev_handle,
153*91f16700Schasinglulu 		(uintptr_t)&arm_uuid_spec[TB_FW_CONFIG_ID],
154*91f16700Schasinglulu 		open_fip
155*91f16700Schasinglulu 	},
156*91f16700Schasinglulu 	[FW_CONFIG_ID] = {
157*91f16700Schasinglulu 		&fip_dev_handle,
158*91f16700Schasinglulu 		(uintptr_t)&arm_uuid_spec[FW_CONFIG_ID],
159*91f16700Schasinglulu 		open_fip
160*91f16700Schasinglulu 	},
161*91f16700Schasinglulu #if !ARM_IO_IN_DTB
162*91f16700Schasinglulu 	[SCP_BL2_IMAGE_ID] = {
163*91f16700Schasinglulu 		&fip_dev_handle,
164*91f16700Schasinglulu 		(uintptr_t)&arm_uuid_spec[SCP_BL2_IMAGE_ID],
165*91f16700Schasinglulu 		open_fip
166*91f16700Schasinglulu 	},
167*91f16700Schasinglulu 	[BL31_IMAGE_ID] = {
168*91f16700Schasinglulu 		&fip_dev_handle,
169*91f16700Schasinglulu 		(uintptr_t)&arm_uuid_spec[BL31_IMAGE_ID],
170*91f16700Schasinglulu 		open_fip
171*91f16700Schasinglulu 	},
172*91f16700Schasinglulu 	[BL32_IMAGE_ID] = {
173*91f16700Schasinglulu 		&fip_dev_handle,
174*91f16700Schasinglulu 		(uintptr_t)&arm_uuid_spec[BL32_IMAGE_ID],
175*91f16700Schasinglulu 		open_fip
176*91f16700Schasinglulu 	},
177*91f16700Schasinglulu 	[BL32_EXTRA1_IMAGE_ID] = {
178*91f16700Schasinglulu 		&fip_dev_handle,
179*91f16700Schasinglulu 		(uintptr_t)&arm_uuid_spec[BL32_EXTRA1_IMAGE_ID],
180*91f16700Schasinglulu 		open_fip
181*91f16700Schasinglulu 	},
182*91f16700Schasinglulu 	[BL32_EXTRA2_IMAGE_ID] = {
183*91f16700Schasinglulu 		&fip_dev_handle,
184*91f16700Schasinglulu 		(uintptr_t)&arm_uuid_spec[BL32_EXTRA2_IMAGE_ID],
185*91f16700Schasinglulu 		open_fip
186*91f16700Schasinglulu 	},
187*91f16700Schasinglulu 	[BL33_IMAGE_ID] = {
188*91f16700Schasinglulu 		&fip_dev_handle,
189*91f16700Schasinglulu 		(uintptr_t)&arm_uuid_spec[BL33_IMAGE_ID],
190*91f16700Schasinglulu 		open_fip
191*91f16700Schasinglulu 	},
192*91f16700Schasinglulu 	[RMM_IMAGE_ID] = {
193*91f16700Schasinglulu 		&fip_dev_handle,
194*91f16700Schasinglulu 		(uintptr_t)&arm_uuid_spec[RMM_IMAGE_ID],
195*91f16700Schasinglulu 		open_fip
196*91f16700Schasinglulu 	},
197*91f16700Schasinglulu 	[HW_CONFIG_ID] = {
198*91f16700Schasinglulu 		&fip_dev_handle,
199*91f16700Schasinglulu 		(uintptr_t)&arm_uuid_spec[HW_CONFIG_ID],
200*91f16700Schasinglulu 		open_fip
201*91f16700Schasinglulu 	},
202*91f16700Schasinglulu 	[SOC_FW_CONFIG_ID] = {
203*91f16700Schasinglulu 		&fip_dev_handle,
204*91f16700Schasinglulu 		(uintptr_t)&arm_uuid_spec[SOC_FW_CONFIG_ID],
205*91f16700Schasinglulu 		open_fip
206*91f16700Schasinglulu 	},
207*91f16700Schasinglulu 	[TOS_FW_CONFIG_ID] = {
208*91f16700Schasinglulu 		&fip_dev_handle,
209*91f16700Schasinglulu 		(uintptr_t)&arm_uuid_spec[TOS_FW_CONFIG_ID],
210*91f16700Schasinglulu 		open_fip
211*91f16700Schasinglulu 	},
212*91f16700Schasinglulu 	[NT_FW_CONFIG_ID] = {
213*91f16700Schasinglulu 		&fip_dev_handle,
214*91f16700Schasinglulu 		(uintptr_t)&arm_uuid_spec[NT_FW_CONFIG_ID],
215*91f16700Schasinglulu 		open_fip
216*91f16700Schasinglulu 	},
217*91f16700Schasinglulu #if ETHOSN_NPU_TZMP1
218*91f16700Schasinglulu 	[ETHOSN_NPU_FW_IMAGE_ID] = {
219*91f16700Schasinglulu 		&fip_dev_handle,
220*91f16700Schasinglulu 		(uintptr_t)&arm_uuid_spec[ETHOSN_NPU_FW_IMAGE_ID],
221*91f16700Schasinglulu 		open_fip
222*91f16700Schasinglulu 	},
223*91f16700Schasinglulu #endif /* ETHOSN_NPU_TZMP1 */
224*91f16700Schasinglulu #endif /* ARM_IO_IN_DTB */
225*91f16700Schasinglulu #if TRUSTED_BOARD_BOOT
226*91f16700Schasinglulu 	[TRUSTED_BOOT_FW_CERT_ID] = {
227*91f16700Schasinglulu 		&fip_dev_handle,
228*91f16700Schasinglulu 		(uintptr_t)&arm_uuid_spec[TRUSTED_BOOT_FW_CERT_ID],
229*91f16700Schasinglulu 		open_fip
230*91f16700Schasinglulu 	},
231*91f16700Schasinglulu #if !ARM_IO_IN_DTB
232*91f16700Schasinglulu 	[CCA_CONTENT_CERT_ID] = {
233*91f16700Schasinglulu 		&fip_dev_handle,
234*91f16700Schasinglulu 		(uintptr_t)&arm_uuid_spec[CCA_CONTENT_CERT_ID],
235*91f16700Schasinglulu 		open_fip
236*91f16700Schasinglulu 	},
237*91f16700Schasinglulu 	[CORE_SWD_KEY_CERT_ID] = {
238*91f16700Schasinglulu 		&fip_dev_handle,
239*91f16700Schasinglulu 		(uintptr_t)&arm_uuid_spec[CORE_SWD_KEY_CERT_ID],
240*91f16700Schasinglulu 		open_fip
241*91f16700Schasinglulu 	},
242*91f16700Schasinglulu 	[PLAT_KEY_CERT_ID] = {
243*91f16700Schasinglulu 		&fip_dev_handle,
244*91f16700Schasinglulu 		(uintptr_t)&arm_uuid_spec[PLAT_KEY_CERT_ID],
245*91f16700Schasinglulu 		open_fip
246*91f16700Schasinglulu 	},
247*91f16700Schasinglulu 	[TRUSTED_KEY_CERT_ID] = {
248*91f16700Schasinglulu 		&fip_dev_handle,
249*91f16700Schasinglulu 		(uintptr_t)&arm_uuid_spec[TRUSTED_KEY_CERT_ID],
250*91f16700Schasinglulu 		open_fip
251*91f16700Schasinglulu 	},
252*91f16700Schasinglulu 	[SCP_FW_KEY_CERT_ID] = {
253*91f16700Schasinglulu 		&fip_dev_handle,
254*91f16700Schasinglulu 		(uintptr_t)&arm_uuid_spec[SCP_FW_KEY_CERT_ID],
255*91f16700Schasinglulu 		open_fip
256*91f16700Schasinglulu 	},
257*91f16700Schasinglulu 	[SOC_FW_KEY_CERT_ID] = {
258*91f16700Schasinglulu 		&fip_dev_handle,
259*91f16700Schasinglulu 		(uintptr_t)&arm_uuid_spec[SOC_FW_KEY_CERT_ID],
260*91f16700Schasinglulu 		open_fip
261*91f16700Schasinglulu 	},
262*91f16700Schasinglulu 	[TRUSTED_OS_FW_KEY_CERT_ID] = {
263*91f16700Schasinglulu 		&fip_dev_handle,
264*91f16700Schasinglulu 		(uintptr_t)&arm_uuid_spec[TRUSTED_OS_FW_KEY_CERT_ID],
265*91f16700Schasinglulu 		open_fip
266*91f16700Schasinglulu 	},
267*91f16700Schasinglulu 	[NON_TRUSTED_FW_KEY_CERT_ID] = {
268*91f16700Schasinglulu 		&fip_dev_handle,
269*91f16700Schasinglulu 		(uintptr_t)&arm_uuid_spec[NON_TRUSTED_FW_KEY_CERT_ID],
270*91f16700Schasinglulu 		open_fip
271*91f16700Schasinglulu 	},
272*91f16700Schasinglulu 	[SCP_FW_CONTENT_CERT_ID] = {
273*91f16700Schasinglulu 		&fip_dev_handle,
274*91f16700Schasinglulu 		(uintptr_t)&arm_uuid_spec[SCP_FW_CONTENT_CERT_ID],
275*91f16700Schasinglulu 		open_fip
276*91f16700Schasinglulu 	},
277*91f16700Schasinglulu 	[SOC_FW_CONTENT_CERT_ID] = {
278*91f16700Schasinglulu 		&fip_dev_handle,
279*91f16700Schasinglulu 		(uintptr_t)&arm_uuid_spec[SOC_FW_CONTENT_CERT_ID],
280*91f16700Schasinglulu 		open_fip
281*91f16700Schasinglulu 	},
282*91f16700Schasinglulu 	[TRUSTED_OS_FW_CONTENT_CERT_ID] = {
283*91f16700Schasinglulu 		&fip_dev_handle,
284*91f16700Schasinglulu 		(uintptr_t)&arm_uuid_spec[TRUSTED_OS_FW_CONTENT_CERT_ID],
285*91f16700Schasinglulu 		open_fip
286*91f16700Schasinglulu 	},
287*91f16700Schasinglulu 	[NON_TRUSTED_FW_CONTENT_CERT_ID] = {
288*91f16700Schasinglulu 		&fip_dev_handle,
289*91f16700Schasinglulu 		(uintptr_t)&arm_uuid_spec[NON_TRUSTED_FW_CONTENT_CERT_ID],
290*91f16700Schasinglulu 		open_fip
291*91f16700Schasinglulu 	},
292*91f16700Schasinglulu #if defined(SPD_spmd)
293*91f16700Schasinglulu 	[SIP_SP_CONTENT_CERT_ID] = {
294*91f16700Schasinglulu 		&fip_dev_handle,
295*91f16700Schasinglulu 		(uintptr_t)&arm_uuid_spec[SIP_SP_CONTENT_CERT_ID],
296*91f16700Schasinglulu 		open_fip
297*91f16700Schasinglulu 	},
298*91f16700Schasinglulu 	[PLAT_SP_CONTENT_CERT_ID] = {
299*91f16700Schasinglulu 		&fip_dev_handle,
300*91f16700Schasinglulu 		(uintptr_t)&arm_uuid_spec[PLAT_SP_CONTENT_CERT_ID],
301*91f16700Schasinglulu 		open_fip
302*91f16700Schasinglulu 	},
303*91f16700Schasinglulu #endif
304*91f16700Schasinglulu #if ETHOSN_NPU_TZMP1
305*91f16700Schasinglulu 	[ETHOSN_NPU_FW_KEY_CERT_ID] = {
306*91f16700Schasinglulu 		&fip_dev_handle,
307*91f16700Schasinglulu 		(uintptr_t)&arm_uuid_spec[ETHOSN_NPU_FW_KEY_CERT_ID],
308*91f16700Schasinglulu 		open_fip
309*91f16700Schasinglulu 	},
310*91f16700Schasinglulu 	[ETHOSN_NPU_FW_CONTENT_CERT_ID] = {
311*91f16700Schasinglulu 		&fip_dev_handle,
312*91f16700Schasinglulu 		(uintptr_t)&arm_uuid_spec[ETHOSN_NPU_FW_CONTENT_CERT_ID],
313*91f16700Schasinglulu 		open_fip
314*91f16700Schasinglulu 	},
315*91f16700Schasinglulu #endif /* ETHOSN_NPU_TZMP1 */
316*91f16700Schasinglulu #endif /* ARM_IO_IN_DTB */
317*91f16700Schasinglulu #endif /* TRUSTED_BOARD_BOOT */
318*91f16700Schasinglulu };
319*91f16700Schasinglulu 
320*91f16700Schasinglulu #ifdef IMAGE_BL2
321*91f16700Schasinglulu 
322*91f16700Schasinglulu #define FCONF_ARM_IO_UUID_NUM_BASE	U(10)
323*91f16700Schasinglulu 
324*91f16700Schasinglulu #if ETHOSN_NPU_TZMP1
325*91f16700Schasinglulu #define FCONF_ARM_IO_UUID_NUM_NPU	U(1)
326*91f16700Schasinglulu #else
327*91f16700Schasinglulu #define FCONF_ARM_IO_UUID_NUM_NPU	U(0)
328*91f16700Schasinglulu #endif /* ETHOSN_NPU_TZMP1 */
329*91f16700Schasinglulu 
330*91f16700Schasinglulu #if TRUSTED_BOARD_BOOT
331*91f16700Schasinglulu #define FCONF_ARM_IO_UUID_NUM_TBB	U(12)
332*91f16700Schasinglulu #else
333*91f16700Schasinglulu #define FCONF_ARM_IO_UUID_NUM_TBB	U(0)
334*91f16700Schasinglulu #endif /* TRUSTED_BOARD_BOOT */
335*91f16700Schasinglulu 
336*91f16700Schasinglulu #if TRUSTED_BOARD_BOOT && defined(SPD_spmd)
337*91f16700Schasinglulu #define FCONF_ARM_IO_UUID_NUM_SPD	U(2)
338*91f16700Schasinglulu #else
339*91f16700Schasinglulu #define FCONF_ARM_IO_UUID_NUM_SPD	U(0)
340*91f16700Schasinglulu #endif /* TRUSTED_BOARD_BOOT && defined(SPD_spmd) */
341*91f16700Schasinglulu 
342*91f16700Schasinglulu #if TRUSTED_BOARD_BOOT && ETHOSN_NPU_TZMP1
343*91f16700Schasinglulu #define FCONF_ARM_IO_UUID_NUM_NPU_TBB	U(2)
344*91f16700Schasinglulu #else
345*91f16700Schasinglulu #define FCONF_ARM_IO_UUID_NUM_NPU_TBB	U(0)
346*91f16700Schasinglulu #endif /* TRUSTED_BOARD_BOOT && ETHOSN_NPU_TZMP1 */
347*91f16700Schasinglulu 
348*91f16700Schasinglulu #define FCONF_ARM_IO_UUID_NUMBER	FCONF_ARM_IO_UUID_NUM_BASE + \
349*91f16700Schasinglulu 					FCONF_ARM_IO_UUID_NUM_NPU + \
350*91f16700Schasinglulu 					FCONF_ARM_IO_UUID_NUM_TBB + \
351*91f16700Schasinglulu 					FCONF_ARM_IO_UUID_NUM_SPD + \
352*91f16700Schasinglulu 					FCONF_ARM_IO_UUID_NUM_NPU_TBB
353*91f16700Schasinglulu 
354*91f16700Schasinglulu static io_uuid_spec_t fconf_arm_uuids[FCONF_ARM_IO_UUID_NUMBER];
355*91f16700Schasinglulu static OBJECT_POOL_ARRAY(fconf_arm_uuids_pool, fconf_arm_uuids);
356*91f16700Schasinglulu 
357*91f16700Schasinglulu struct policies_load_info {
358*91f16700Schasinglulu 	unsigned int image_id;
359*91f16700Schasinglulu 	const char *name;
360*91f16700Schasinglulu };
361*91f16700Schasinglulu 
362*91f16700Schasinglulu /* image id to property name table */
363*91f16700Schasinglulu static const struct policies_load_info load_info[FCONF_ARM_IO_UUID_NUMBER] = {
364*91f16700Schasinglulu 	{SCP_BL2_IMAGE_ID, "scp_bl2_uuid"},
365*91f16700Schasinglulu 	{BL31_IMAGE_ID, "bl31_uuid"},
366*91f16700Schasinglulu 	{BL32_IMAGE_ID, "bl32_uuid"},
367*91f16700Schasinglulu 	{BL32_EXTRA1_IMAGE_ID, "bl32_extra1_uuid"},
368*91f16700Schasinglulu 	{BL32_EXTRA2_IMAGE_ID, "bl32_extra2_uuid"},
369*91f16700Schasinglulu 	{BL33_IMAGE_ID, "bl33_uuid"},
370*91f16700Schasinglulu 	{HW_CONFIG_ID, "hw_cfg_uuid"},
371*91f16700Schasinglulu 	{SOC_FW_CONFIG_ID, "soc_fw_cfg_uuid"},
372*91f16700Schasinglulu 	{TOS_FW_CONFIG_ID, "tos_fw_cfg_uuid"},
373*91f16700Schasinglulu 	{NT_FW_CONFIG_ID, "nt_fw_cfg_uuid"},
374*91f16700Schasinglulu #if ETHOSN_NPU_TZMP1
375*91f16700Schasinglulu 	{ETHOSN_NPU_FW_IMAGE_ID, "ethosn_npu_fw_uuid"},
376*91f16700Schasinglulu #endif /* ETHOSN_NPU_TZMP1 */
377*91f16700Schasinglulu #if TRUSTED_BOARD_BOOT
378*91f16700Schasinglulu 	{CCA_CONTENT_CERT_ID, "cca_cert_uuid"},
379*91f16700Schasinglulu 	{CORE_SWD_KEY_CERT_ID, "core_swd_cert_uuid"},
380*91f16700Schasinglulu 	{PLAT_KEY_CERT_ID, "plat_cert_uuid"},
381*91f16700Schasinglulu 	{TRUSTED_KEY_CERT_ID, "t_key_cert_uuid"},
382*91f16700Schasinglulu 	{SCP_FW_KEY_CERT_ID, "scp_fw_key_uuid"},
383*91f16700Schasinglulu 	{SOC_FW_KEY_CERT_ID, "soc_fw_key_uuid"},
384*91f16700Schasinglulu 	{TRUSTED_OS_FW_KEY_CERT_ID, "tos_fw_key_cert_uuid"},
385*91f16700Schasinglulu 	{NON_TRUSTED_FW_KEY_CERT_ID, "nt_fw_key_cert_uuid"},
386*91f16700Schasinglulu 	{SCP_FW_CONTENT_CERT_ID, "scp_fw_content_cert_uuid"},
387*91f16700Schasinglulu 	{SOC_FW_CONTENT_CERT_ID, "soc_fw_content_cert_uuid"},
388*91f16700Schasinglulu 	{TRUSTED_OS_FW_CONTENT_CERT_ID, "tos_fw_content_cert_uuid"},
389*91f16700Schasinglulu 	{NON_TRUSTED_FW_CONTENT_CERT_ID, "nt_fw_content_cert_uuid"},
390*91f16700Schasinglulu #if defined(SPD_spmd)
391*91f16700Schasinglulu 	{SIP_SP_CONTENT_CERT_ID, "sip_sp_content_cert_uuid"},
392*91f16700Schasinglulu 	{PLAT_SP_CONTENT_CERT_ID, "plat_sp_content_cert_uuid"},
393*91f16700Schasinglulu #endif
394*91f16700Schasinglulu #if ETHOSN_NPU_TZMP1
395*91f16700Schasinglulu 	{ETHOSN_NPU_FW_KEY_CERT_ID, "ethosn_npu_fw_key_cert_uuid"},
396*91f16700Schasinglulu 	{ETHOSN_NPU_FW_CONTENT_CERT_ID, "ethosn_npu_fw_content_cert_uuid"},
397*91f16700Schasinglulu #endif /* ETHOSN_NPU_TZMP1 */
398*91f16700Schasinglulu #endif /* TRUSTED_BOARD_BOOT */
399*91f16700Schasinglulu };
400*91f16700Schasinglulu 
401*91f16700Schasinglulu int fconf_populate_arm_io_policies(uintptr_t config)
402*91f16700Schasinglulu {
403*91f16700Schasinglulu 	int err, node;
404*91f16700Schasinglulu 	unsigned int i;
405*91f16700Schasinglulu 
406*91f16700Schasinglulu 	union uuid_helper_t uuid_helper;
407*91f16700Schasinglulu 	io_uuid_spec_t *uuid_ptr;
408*91f16700Schasinglulu 
409*91f16700Schasinglulu 	/* As libfdt uses void *, we can't avoid this cast */
410*91f16700Schasinglulu 	const void *dtb = (void *)config;
411*91f16700Schasinglulu 
412*91f16700Schasinglulu 	/* Assert the node offset point to "arm,io-fip-handle" compatible property */
413*91f16700Schasinglulu 	const char *compatible_str = "arm,io-fip-handle";
414*91f16700Schasinglulu 	node = fdt_node_offset_by_compatible(dtb, -1, compatible_str);
415*91f16700Schasinglulu 	if (node < 0) {
416*91f16700Schasinglulu 		ERROR("FCONF: Can't find %s compatible in dtb\n", compatible_str);
417*91f16700Schasinglulu 		return node;
418*91f16700Schasinglulu 	}
419*91f16700Schasinglulu 
420*91f16700Schasinglulu 	/* Locate the uuid cells and read the value for all the load info uuid */
421*91f16700Schasinglulu 	for (i = 0; i < FCONF_ARM_IO_UUID_NUMBER; i++) {
422*91f16700Schasinglulu 		uuid_ptr = pool_alloc(&fconf_arm_uuids_pool);
423*91f16700Schasinglulu 		err = fdtw_read_uuid(dtb, node, load_info[i].name, 16,
424*91f16700Schasinglulu 				     (uint8_t *)&uuid_helper);
425*91f16700Schasinglulu 		if (err < 0) {
426*91f16700Schasinglulu 			WARN("FCONF: Read cell failed for %s\n", load_info[i].name);
427*91f16700Schasinglulu 			return err;
428*91f16700Schasinglulu 		}
429*91f16700Schasinglulu 
430*91f16700Schasinglulu 		VERBOSE("FCONF: arm-io_policies.%s cell found with value = "
431*91f16700Schasinglulu 			"%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x\n",
432*91f16700Schasinglulu 			load_info[i].name,
433*91f16700Schasinglulu 			uuid_helper.uuid_struct.time_low[0], uuid_helper.uuid_struct.time_low[1],
434*91f16700Schasinglulu 			uuid_helper.uuid_struct.time_low[2], uuid_helper.uuid_struct.time_low[3],
435*91f16700Schasinglulu 			uuid_helper.uuid_struct.time_mid[0], uuid_helper.uuid_struct.time_mid[1],
436*91f16700Schasinglulu 			uuid_helper.uuid_struct.time_hi_and_version[0],
437*91f16700Schasinglulu 			uuid_helper.uuid_struct.time_hi_and_version[1],
438*91f16700Schasinglulu 			uuid_helper.uuid_struct.clock_seq_hi_and_reserved,
439*91f16700Schasinglulu 			uuid_helper.uuid_struct.clock_seq_low,
440*91f16700Schasinglulu 			uuid_helper.uuid_struct.node[0], uuid_helper.uuid_struct.node[1],
441*91f16700Schasinglulu 			uuid_helper.uuid_struct.node[2], uuid_helper.uuid_struct.node[3],
442*91f16700Schasinglulu 			uuid_helper.uuid_struct.node[4], uuid_helper.uuid_struct.node[5]);
443*91f16700Schasinglulu 
444*91f16700Schasinglulu 		uuid_ptr->uuid = uuid_helper.uuid_struct;
445*91f16700Schasinglulu 		policies[load_info[i].image_id].image_spec = (uintptr_t)uuid_ptr;
446*91f16700Schasinglulu 		policies[load_info[i].image_id].dev_handle = &fip_dev_handle;
447*91f16700Schasinglulu 		policies[load_info[i].image_id].check = open_fip;
448*91f16700Schasinglulu 	}
449*91f16700Schasinglulu 	return 0;
450*91f16700Schasinglulu }
451*91f16700Schasinglulu 
452*91f16700Schasinglulu #if ARM_IO_IN_DTB
453*91f16700Schasinglulu FCONF_REGISTER_POPULATOR(TB_FW, arm_io, fconf_populate_arm_io_policies);
454*91f16700Schasinglulu #endif /* ARM_IO_IN_DTB */
455*91f16700Schasinglulu 
456*91f16700Schasinglulu #endif /* IMAGE_BL2 */
457