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.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 .target_locality = LOCALITY_NONE, /* won't derive don't care */ 43 .pk_oid = BL31_IMAGE_KEY_OID }, 44 { 45 .id = BL32_IMAGE_ID, 46 .cert_id = DPE_CERT_ID_SAME_AS_PARENT, /* AP_BL2: DPE_AP_FW_CERT_ID */ 47 .signer_id_size = SIGNER_ID_MIN_SIZE, 48 .sw_type = MBOOT_BL32_IMAGE_STRING, 49 .allow_new_context_to_derive = false, 50 .retain_parent_context = true, 51 .create_certificate = false, 52 .target_locality = LOCALITY_NONE, /* won't derive don't care */ 53 .pk_oid = BL32_IMAGE_KEY_OID }, 54 { 55 .id = BL33_IMAGE_ID, 56 .cert_id = DPE_HYPERVISOR_CERT_ID, 57 .signer_id_size = SIGNER_ID_MIN_SIZE, 58 .sw_type = MBOOT_BL33_IMAGE_STRING, 59 .allow_new_context_to_derive = true, 60 .retain_parent_context = true, 61 .create_certificate = false, 62 .target_locality = LOCALITY_AP_NS, 63 .pk_oid = BL33_IMAGE_KEY_OID }, 64 65 { 66 .id = HW_CONFIG_ID, 67 .cert_id = DPE_CERT_ID_SAME_AS_PARENT, /* AP_BL2: DPE_AP_FW_CERT_ID */ 68 .signer_id_size = SIGNER_ID_MIN_SIZE, 69 .sw_type = MBOOT_HW_CONFIG_STRING, 70 .allow_new_context_to_derive = false, 71 .retain_parent_context = true, 72 .create_certificate = false, 73 .target_locality = LOCALITY_NONE, /* won't derive don't care */ 74 .pk_oid = HW_CONFIG_KEY_OID }, 75 { 76 .id = NT_FW_CONFIG_ID, 77 .cert_id = DPE_HYPERVISOR_CERT_ID, 78 .signer_id_size = SIGNER_ID_MIN_SIZE, 79 .sw_type = MBOOT_NT_FW_CONFIG_STRING, 80 .allow_new_context_to_derive = false, 81 .retain_parent_context = true, 82 .create_certificate = false, 83 .target_locality = LOCALITY_NONE, /* won't derive don't care */ 84 .pk_oid = NT_FW_CONFIG_KEY_OID }, 85 { 86 .id = SCP_BL2_IMAGE_ID, 87 .cert_id = DPE_CERT_ID_SAME_AS_PARENT, /* AP_BL2: DPE_AP_FW_CERT_ID */ 88 .signer_id_size = SIGNER_ID_MIN_SIZE, 89 .sw_type = MBOOT_SCP_BL2_IMAGE_STRING, 90 .allow_new_context_to_derive = false, 91 .retain_parent_context = true, 92 .create_certificate = false, 93 .target_locality = LOCALITY_NONE, /* won't derive don't care */ 94 .pk_oid = SCP_BL2_IMAGE_KEY_OID }, 95 { 96 .id = SOC_FW_CONFIG_ID, 97 .cert_id = DPE_CERT_ID_SAME_AS_PARENT, /* AP_BL2: DPE_AP_FW_CERT_ID */ 98 .signer_id_size = SIGNER_ID_MIN_SIZE, 99 .sw_type = MBOOT_SOC_FW_CONFIG_STRING, 100 .allow_new_context_to_derive = false, 101 .retain_parent_context = true, 102 .create_certificate = false, 103 .target_locality = LOCALITY_NONE, /* won't derive don't care */ 104 .pk_oid = SOC_FW_CONFIG_KEY_OID }, 105 { 106 .id = TOS_FW_CONFIG_ID, 107 .cert_id = DPE_CERT_ID_SAME_AS_PARENT, /* AP_BL2: DPE_AP_FW_CERT_ID */ 108 .signer_id_size = SIGNER_ID_MIN_SIZE, 109 .sw_type = MBOOT_TOS_FW_CONFIG_STRING, 110 .allow_new_context_to_derive = false, 111 .retain_parent_context = true, 112 .create_certificate = false, 113 .target_locality = LOCALITY_NONE, /* won't derive don't care */ 114 .pk_oid = TOS_FW_CONFIG_KEY_OID }, 115 #if defined(SPD_spmd) 116 { 117 .id = SP_PKG1_ID, 118 .cert_id = DPE_CERT_ID_SAME_AS_PARENT, /* AP_BL2: DPE_AP_FW_CERT_ID */ 119 .signer_id_size = SIGNER_ID_MIN_SIZE, 120 .sw_type = MBOOT_SP1_STRING, 121 .allow_new_context_to_derive = false, 122 .retain_parent_context = true, 123 .create_certificate = true, /* With Trusty only one SP is loaded */ 124 .target_locality = LOCALITY_NONE, /* won't derive don't care */ 125 .pk_oid = NULL }, 126 { 127 .id = SP_PKG2_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_SP2_STRING, 131 .allow_new_context_to_derive = false, 132 .retain_parent_context = true, 133 .create_certificate = false, 134 .target_locality = LOCALITY_NONE, /* won't derive don't care */ 135 .pk_oid = NULL }, 136 { 137 .id = SP_PKG3_ID, 138 .cert_id = DPE_CERT_ID_SAME_AS_PARENT, /* AP_BL2: DPE_AP_FW_CERT_ID */ 139 .signer_id_size = SIGNER_ID_MIN_SIZE, 140 .sw_type = MBOOT_SP3_STRING, 141 .allow_new_context_to_derive = false, 142 .retain_parent_context = true, 143 .create_certificate = false, 144 .target_locality = LOCALITY_NONE, /* won't derive don't care */ 145 .pk_oid = NULL }, 146 { 147 .id = SP_PKG4_ID, 148 .cert_id = DPE_CERT_ID_SAME_AS_PARENT, /* AP_BL2: DPE_AP_FW_CERT_ID */ 149 .signer_id_size = SIGNER_ID_MIN_SIZE, 150 .sw_type = MBOOT_SP4_STRING, 151 .allow_new_context_to_derive = false, 152 .retain_parent_context = true, 153 .create_certificate = false, 154 .target_locality = LOCALITY_NONE, /* won't derive don't care */ 155 .pk_oid = NULL }, 156 { 157 .id = SP_PKG5_ID, 158 .cert_id = DPE_CERT_ID_SAME_AS_PARENT, /* AP_BL2: DPE_AP_FW_CERT_ID */ 159 .signer_id_size = SIGNER_ID_MIN_SIZE, 160 .sw_type = MBOOT_SP5_STRING, 161 .allow_new_context_to_derive = false, 162 .retain_parent_context = true, 163 .create_certificate = false, 164 .target_locality = LOCALITY_NONE, /* won't derive don't care */ 165 .pk_oid = NULL }, 166 { 167 .id = SP_PKG6_ID, 168 .cert_id = DPE_CERT_ID_SAME_AS_PARENT, /* AP_BL2: DPE_AP_FW_CERT_ID */ 169 .signer_id_size = SIGNER_ID_MIN_SIZE, 170 .sw_type = MBOOT_SP6_STRING, 171 .allow_new_context_to_derive = false, 172 .retain_parent_context = true, 173 .create_certificate = false, 174 .target_locality = LOCALITY_NONE, /* won't derive don't care */ 175 .pk_oid = NULL }, 176 { 177 .id = SP_PKG7_ID, 178 .cert_id = DPE_CERT_ID_SAME_AS_PARENT, /* AP_BL2: DPE_AP_FW_CERT_ID */ 179 .signer_id_size = SIGNER_ID_MIN_SIZE, 180 .sw_type = MBOOT_SP7_STRING, 181 .allow_new_context_to_derive = false, 182 .retain_parent_context = true, 183 .create_certificate = false, 184 .target_locality = LOCALITY_NONE, /* won't derive don't care */ 185 .pk_oid = NULL }, 186 { 187 .id = SP_PKG8_ID, 188 .cert_id = DPE_CERT_ID_SAME_AS_PARENT, /* AP_BL2: DPE_AP_FW_CERT_ID */ 189 .signer_id_size = SIGNER_ID_MIN_SIZE, 190 .sw_type = MBOOT_SP8_STRING, 191 .allow_new_context_to_derive = false, 192 .retain_parent_context = true, 193 .create_certificate = false, 194 .target_locality = LOCALITY_NONE, /* won't derive don't care */ 195 .pk_oid = NULL }, 196 197 #endif 198 { 199 .id = DPE_INVALID_ID } 200 }; 201 202 /* Context handle is meant to be used by BL33. Sharing it via NT_FW_CONFIG */ 203 static int new_ctx_handle; 204 205 void plat_dpe_share_context_handle(int *ctx_handle, int *parent_ctx_handle) 206 { 207 new_ctx_handle = *ctx_handle; 208 209 /* Irrelevant in BL2 because cold restart resumes CPU in BL1 */ 210 (void)parent_ctx_handle; 211 } 212 213 void plat_dpe_get_context_handle(int *ctx_handle) 214 { 215 int rc; 216 217 rc = arm_get_tb_fw_info(ctx_handle); 218 if (rc != 0) { 219 ERROR("Unable to get DPE context handle from TB_FW_CONFIG\n"); 220 /* 221 * It is a fatal error because on FVP platform, BL2 software 222 * assumes that a valid DPE context_handle is passed through 223 * the DTB object by BL1. 224 */ 225 plat_panic_handler(); 226 } 227 228 VERBOSE("Received DPE context handle: 0x%x\n", *ctx_handle); 229 } 230 231 void bl2_plat_mboot_init(void) 232 { 233 /* Initialize the communication channel between AP and RSE */ 234 (void)rse_comms_init(PLAT_RSE_AP_SND_MHU_BASE, 235 PLAT_RSE_AP_RCV_MHU_BASE); 236 237 dpe_init(tc_dpe_metadata); 238 } 239 240 void bl2_plat_mboot_finish(void) 241 { 242 int rc; 243 244 VERBOSE("Share DPE context handle with BL33: 0x%x\n", new_ctx_handle); 245 rc = arm_set_nt_fw_info(&new_ctx_handle); 246 if (rc != 0) { 247 ERROR("Unable to set DPE context handle in NT_FW_CONFIG\n"); 248 /* 249 * It is a fatal error because on TC platform, BL33 software 250 * assumes that a valid DPE context_handle is passed through 251 * the DTB object by BL2. 252 */ 253 plat_panic_handler(); 254 } 255 } 256