1 /* 2 * Copyright (c) 2024-2025, Arm Limited and Contributors. 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/css/sds.h> 11 #include <drivers/delay_timer.h> 12 #include <drivers/generic_delay_timer.h> 13 #include <drivers/measured_boot/metadata.h> 14 #include <drivers/measured_boot/rse/dice_prot_env.h> 15 #include <plat/arm/common/plat_arm.h> 16 #include <plat/common/platform.h> 17 #include <platform_def.h> 18 #include <tools_share/zero_oid.h> 19 20 #include "tc_dpe.h" 21 #include <tc_rse_comms.h> 22 23 struct dpe_metadata tc_dpe_metadata[] = { 24 { 25 .id = FW_CONFIG_ID, 26 .cert_id = DPE_AP_FW_CERT_ID, 27 .signer_id_size = SIGNER_ID_MIN_SIZE, 28 .sw_type = MBOOT_FW_CONFIG_STRING, 29 .allow_new_context_to_derive = false, 30 .retain_parent_context = true, 31 .create_certificate = false, 32 .target_locality = LOCALITY_NONE, /* won't derive don't care */ 33 .pk_oid = ZERO_OID }, 34 { 35 .id = TB_FW_CONFIG_ID, 36 .cert_id = DPE_AP_FW_CERT_ID, 37 .signer_id_size = SIGNER_ID_MIN_SIZE, 38 .sw_type = MBOOT_TB_FW_CONFIG_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 = ZERO_OID }, 44 { 45 .id = BL2_IMAGE_ID, 46 .cert_id = DPE_AP_FW_CERT_ID, 47 .signer_id_size = SIGNER_ID_MIN_SIZE, 48 .sw_type = MBOOT_BL2_IMAGE_STRING, 49 .allow_new_context_to_derive = true, 50 .retain_parent_context = true, /* To handle restart */ 51 .target_locality = LOCALITY_AP_S, 52 .create_certificate = false, 53 .pk_oid = ZERO_OID }, 54 { 55 .id = DPE_INVALID_ID } 56 }; 57 58 /* Effective timeout of 10000 ms */ 59 #define RSE_DPE_BOOT_10US_RETRIES 1000000 60 #define TC2_SDS_DPE_CTX_HANDLE_STRUCT_ID 0x0000000A 61 62 /* Context handle is meant to be used by BL2. Sharing it via TB_FW_CONFIG */ 63 static int new_ctx_handle; 64 /* Save a valid parent context handle to be able to send commands to DPE service 65 * in case of an AP cold restart. 66 */ 67 static int new_parent_ctx_handle; 68 69 void plat_dpe_share_context_handle(int *ctx_handle, int *parent_ctx_handle) 70 { 71 new_ctx_handle = *ctx_handle; 72 new_parent_ctx_handle = *parent_ctx_handle; 73 } 74 75 void plat_dpe_get_context_handle(int *ctx_handle) 76 { 77 int retry = RSE_DPE_BOOT_10US_RETRIES; 78 int ret; 79 80 /* Initialize System level generic or SP804 timer */ 81 generic_delay_timer_init(); 82 83 /* Check the initialization of the Shared Data Storage area between RSE 84 * and AP. Since AP_BL1 is executed first then a bit later the RSE 85 * runtime, which initialize this area, therefore AP needs to check it 86 * in a loop until it gets written by RSE Secure Runtime. 87 */ 88 VERBOSE("Waiting for DPE service initialization in RSE Secure Runtime\n"); 89 while (retry > 0) { 90 ret = sds_init(SDS_RSE_AP_REGION_ID); 91 if (ret != SDS_OK) { 92 udelay(10); 93 retry--; 94 } else { 95 break; 96 } 97 } 98 99 if (retry == 0) { 100 ERROR("DPE init timeout\n"); 101 plat_panic_handler(); 102 } else { 103 VERBOSE("DPE init succeeded in %dms.\n", 104 (RSE_DPE_BOOT_10US_RETRIES - retry) / 100); 105 } 106 107 /* TODO: call this in a loop to avoid reading unfinished data */ 108 ret = sds_struct_read(SDS_RSE_AP_REGION_ID, 109 TC2_SDS_DPE_CTX_HANDLE_STRUCT_ID, 110 0, 111 ctx_handle, 112 sizeof(*ctx_handle), 113 SDS_ACCESS_MODE_NON_CACHED); 114 if (ret != SDS_OK) { 115 ERROR("Unable to get DPE context handle from SDS area\n"); 116 plat_panic_handler(); 117 } 118 119 VERBOSE("Received DPE context handle: 0x%x\n", *ctx_handle); 120 } 121 122 void bl1_plat_mboot_init(void) 123 { 124 /* Initialize the communication channel between AP and RSE */ 125 (void)plat_rse_comms_init(); 126 127 dpe_init(tc_dpe_metadata); 128 } 129 130 void bl1_plat_mboot_finish(void) 131 { 132 int rc; 133 134 VERBOSE("Share DPE context handle with BL2: 0x%x\n", new_ctx_handle); 135 rc = arm_set_tb_fw_info(&new_ctx_handle); 136 if (rc != 0) { 137 ERROR("Unable to set DPE context handle in TB_FW_CONFIG\n"); 138 /* 139 * It is a fatal error because on TC platform, BL2 software 140 * assumes that a valid DPE context_handle is passed through 141 * the DTB object by BL1. 142 */ 143 plat_panic_handler(); 144 } 145 146 VERBOSE("Save parent context handle: 0x%x\n", new_parent_ctx_handle); 147 rc = sds_struct_write(SDS_RSE_AP_REGION_ID, 148 TC2_SDS_DPE_CTX_HANDLE_STRUCT_ID, 149 0, 150 &new_parent_ctx_handle, 151 sizeof(new_parent_ctx_handle), 152 SDS_ACCESS_MODE_NON_CACHED); 153 if (rc != SDS_OK) { 154 ERROR("Unable to save DPE parent context handle to SDS area\n"); 155 plat_panic_handler(); 156 } 157 } 158