xref: /rk3399_ARM-atf/plat/arm/board/tc/tc_bl2_dpe.c (revision de6b79d8b5e15262b328051095e15ad4c67518eb)
1 /*
2  * Copyright (c) 2024, Arm Limited. All rights reserved.
3  *
4  * SPDX-License-Identifier: BSD-3-Clause
5  */
6 
7 #include <stdint.h>
8 
9 #include <common/debug.h>
10 #include <drivers/arm/rse_comms.h>
11 #include <drivers/measured_boot/metadata.h>
12 #include <drivers/measured_boot/rse/dice_prot_env.h>
13 #include <plat/arm/common/plat_arm.h>
14 #include <plat/common/platform.h>
15 #include <platform_def.h>
16 #include <tools_share/tbbr_oid.h>
17 
18 #include "tc_dpe_cert.h"
19 
20 /*
21  * The content and the values of this array depends on:
22  * - build config: Which components are loaded: SPMD, TOS, SPx, etc ?
23  * - boot order: the last element in a layer should be treated differently.
24  */
25 
26 /*
27  * TODO:
28  *     - The content of the array must be tailored according to the build
29  *       config (TOS, SPMD, etc). All loaded components (executables and
30  *       config blobs) must be present in this array.
31  *     - Current content is according to the Trusty build config.
32  */
33 struct dpe_metadata tc_dpe_metadata[] = {
34 	{
35 		.id = BL31_IMAGE_ID,
36 		.cert_id = DPE_CERT_ID_SAME_AS_PARENT, /* AP_BL2: DPE_AP_FW_CERT_ID */
37 		.signer_id_size = SIGNER_ID_MIN_SIZE,
38 		.sw_type = MBOOT_BL31_IMAGE_STRING,
39 		.allow_new_context_to_derive = false,
40 		.retain_parent_context = true,
41 		.create_certificate = false,
42 		.pk_oid = BL31_IMAGE_KEY_OID },
43 	{
44 		.id = BL32_IMAGE_ID,
45 		.cert_id =  DPE_CERT_ID_SAME_AS_PARENT, /* AP_BL2: DPE_AP_FW_CERT_ID */
46 		.signer_id_size = SIGNER_ID_MIN_SIZE,
47 		.sw_type = MBOOT_BL32_IMAGE_STRING,
48 		.allow_new_context_to_derive = false,
49 		.retain_parent_context = true,
50 		.create_certificate = false,
51 		.pk_oid = BL32_IMAGE_KEY_OID },
52 	{
53 		.id = BL33_IMAGE_ID,
54 		.cert_id = DPE_HYPERVISOR_CERT_ID,
55 		.signer_id_size = SIGNER_ID_MIN_SIZE,
56 		.sw_type = MBOOT_BL33_IMAGE_STRING,
57 		.allow_new_context_to_derive = true,
58 		.retain_parent_context = true,
59 		.create_certificate = false,
60 		.pk_oid = BL33_IMAGE_KEY_OID },
61 
62 	{
63 		.id = HW_CONFIG_ID,
64 		.cert_id = DPE_CERT_ID_SAME_AS_PARENT, /* AP_BL2: DPE_AP_FW_CERT_ID */
65 		.signer_id_size = SIGNER_ID_MIN_SIZE,
66 		.sw_type = MBOOT_HW_CONFIG_STRING,
67 		.allow_new_context_to_derive = false,
68 		.retain_parent_context = true,
69 		.create_certificate = false,
70 		.pk_oid = HW_CONFIG_KEY_OID },
71 	{
72 		.id = NT_FW_CONFIG_ID,
73 		.cert_id = DPE_HYPERVISOR_CERT_ID,
74 		.signer_id_size = SIGNER_ID_MIN_SIZE,
75 		.sw_type = MBOOT_NT_FW_CONFIG_STRING,
76 		.allow_new_context_to_derive = false,
77 		.retain_parent_context = true,
78 		.create_certificate = false,
79 		.pk_oid = NT_FW_CONFIG_KEY_OID },
80 	{
81 		.id = SCP_BL2_IMAGE_ID,
82 		.cert_id = DPE_CERT_ID_SAME_AS_PARENT, /* AP_BL2: DPE_AP_FW_CERT_ID */
83 		.signer_id_size = SIGNER_ID_MIN_SIZE,
84 		.sw_type = MBOOT_SCP_BL2_IMAGE_STRING,
85 		.allow_new_context_to_derive = false,
86 		.retain_parent_context = true,
87 		.create_certificate = false,
88 		.pk_oid = SCP_BL2_IMAGE_KEY_OID },
89 	{
90 		.id = SOC_FW_CONFIG_ID,
91 		.cert_id = DPE_CERT_ID_SAME_AS_PARENT, /* AP_BL2: DPE_AP_FW_CERT_ID */
92 		.signer_id_size = SIGNER_ID_MIN_SIZE,
93 		.sw_type = MBOOT_SOC_FW_CONFIG_STRING,
94 		.allow_new_context_to_derive = false,
95 		.retain_parent_context = true,
96 		.create_certificate = false,
97 		.pk_oid = SOC_FW_CONFIG_KEY_OID },
98 	{
99 		.id = TOS_FW_CONFIG_ID,
100 		.cert_id = DPE_CERT_ID_SAME_AS_PARENT, /* AP_BL2: DPE_AP_FW_CERT_ID */
101 		.signer_id_size = SIGNER_ID_MIN_SIZE,
102 		.sw_type = MBOOT_TOS_FW_CONFIG_STRING,
103 		.allow_new_context_to_derive = false,
104 		.retain_parent_context = true,
105 		.create_certificate = false,
106 		.pk_oid = TOS_FW_CONFIG_KEY_OID },
107 #if defined(SPD_spmd)
108 	{
109 		.id = SP_PKG1_ID,
110 		.cert_id = DPE_CERT_ID_SAME_AS_PARENT, /* AP_BL2: DPE_AP_FW_CERT_ID */
111 		.signer_id_size = SIGNER_ID_MIN_SIZE,
112 		.sw_type = MBOOT_SP1_STRING,
113 		.allow_new_context_to_derive = false,
114 		.retain_parent_context = true,
115 		.create_certificate = true, /* With Trusty only one SP is loaded */
116 		.pk_oid = NULL },
117 	{
118 		.id = SP_PKG2_ID,
119 		.cert_id = DPE_CERT_ID_SAME_AS_PARENT, /* AP_BL2: DPE_AP_FW_CERT_ID */
120 		.signer_id_size = SIGNER_ID_MIN_SIZE,
121 		.sw_type = MBOOT_SP2_STRING,
122 		.allow_new_context_to_derive = false,
123 		.retain_parent_context = true,
124 		.create_certificate = false,
125 		.pk_oid = NULL },
126 	{
127 		.id = SP_PKG3_ID,
128 		.cert_id = DPE_CERT_ID_SAME_AS_PARENT, /* AP_BL2: DPE_AP_FW_CERT_ID */
129 		.signer_id_size = SIGNER_ID_MIN_SIZE,
130 		.sw_type = MBOOT_SP3_STRING,
131 		.allow_new_context_to_derive = false,
132 		.retain_parent_context = true,
133 		.create_certificate = false,
134 		.pk_oid = NULL },
135 	{
136 		.id = SP_PKG4_ID,
137 		.cert_id = DPE_CERT_ID_SAME_AS_PARENT, /* AP_BL2: DPE_AP_FW_CERT_ID */
138 		.signer_id_size = SIGNER_ID_MIN_SIZE,
139 		.sw_type = MBOOT_SP4_STRING,
140 		.allow_new_context_to_derive = false,
141 		.retain_parent_context = true,
142 		.create_certificate = false,
143 		.pk_oid = NULL },
144 	{
145 		.id = SP_PKG5_ID,
146 		.cert_id = DPE_CERT_ID_SAME_AS_PARENT, /* AP_BL2: DPE_AP_FW_CERT_ID */
147 		.signer_id_size = SIGNER_ID_MIN_SIZE,
148 		.sw_type = MBOOT_SP5_STRING,
149 		.allow_new_context_to_derive = false,
150 		.retain_parent_context = true,
151 		.create_certificate = false,
152 		.pk_oid = NULL },
153 	{
154 		.id = SP_PKG6_ID,
155 		.cert_id = DPE_CERT_ID_SAME_AS_PARENT, /* AP_BL2: DPE_AP_FW_CERT_ID */
156 		.signer_id_size = SIGNER_ID_MIN_SIZE,
157 		.sw_type = MBOOT_SP6_STRING,
158 		.allow_new_context_to_derive = false,
159 		.retain_parent_context = true,
160 		.create_certificate = false,
161 		.pk_oid = NULL },
162 	{
163 		.id = SP_PKG7_ID,
164 		.cert_id = DPE_CERT_ID_SAME_AS_PARENT, /* AP_BL2: DPE_AP_FW_CERT_ID */
165 		.signer_id_size = SIGNER_ID_MIN_SIZE,
166 		.sw_type = MBOOT_SP7_STRING,
167 		.allow_new_context_to_derive = false,
168 		.retain_parent_context = true,
169 		.create_certificate = false,
170 		.pk_oid = NULL },
171 	{
172 		.id = SP_PKG8_ID,
173 		.cert_id = DPE_CERT_ID_SAME_AS_PARENT, /* AP_BL2: DPE_AP_FW_CERT_ID */
174 		.signer_id_size = SIGNER_ID_MIN_SIZE,
175 		.sw_type = MBOOT_SP8_STRING,
176 		.allow_new_context_to_derive = false,
177 		.retain_parent_context = true,
178 		.create_certificate = false,
179 		.pk_oid = NULL },
180 
181 #endif
182 	{
183 		.id = DPE_INVALID_ID }
184 };
185 
186 /* Context handle is meant to be used by BL33. Sharing it via NT_FW_CONFIG */
187 static int new_ctx_handle;
188 
189 void plat_dpe_share_context_handle(int *ctx_handle)
190 {
191 	new_ctx_handle = *ctx_handle;
192 }
193 
194 void plat_dpe_get_context_handle(int *ctx_handle)
195 {
196 	int rc;
197 
198 	rc = arm_get_tb_fw_info(ctx_handle);
199 	if (rc != 0) {
200 		ERROR("Unable to get DPE context handle from TB_FW_CONFIG\n");
201 		/*
202 		 * It is a fatal error because on FVP platform, BL2 software
203 		 * assumes that a valid DPE context_handle is passed through
204 		 * the DTB object by BL1.
205 		 */
206 		plat_panic_handler();
207 	}
208 
209 	VERBOSE("Received DPE context handle: 0x%x\n", *ctx_handle);
210 }
211 
212 void bl2_plat_mboot_init(void)
213 {
214 	/* Initialize the communication channel between AP and RSE */
215 	(void)rse_comms_init(PLAT_RSE_AP_SND_MHU_BASE,
216 			     PLAT_RSE_AP_RCV_MHU_BASE);
217 
218 	dpe_init(tc_dpe_metadata);
219 }
220 
221 void bl2_plat_mboot_finish(void)
222 {
223 	int rc;
224 
225 	VERBOSE("Share DPE context handle with BL33: 0x%x\n", new_ctx_handle);
226 	rc = arm_set_nt_fw_info(&new_ctx_handle);
227 	if (rc != 0) {
228 		ERROR("Unable to set DPE context handle in NT_FW_CONFIG\n");
229 		/*
230 		 * It is a fatal error because on TC platform, BL33 software
231 		 * assumes that a valid DPE context_handle is passed through
232 		 * the DTB object by BL2.
233 		 */
234 		plat_panic_handler();
235 	}
236 }
237