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