• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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.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 
plat_dpe_share_context_handle(int * ctx_handle,int * parent_ctx_handle)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 
plat_dpe_get_context_handle(int * ctx_handle)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 
bl1_plat_mboot_init(void)122 void bl1_plat_mboot_init(void)
123 {
124 	/* Initialize the communication channel between AP and RSE */
125 	(void)rse_comms_init(PLAT_RSE_AP_SND_MHU_BASE,
126 			     PLAT_RSE_AP_RCV_MHU_BASE);
127 
128 	dpe_init(tc_dpe_metadata);
129 }
130 
bl1_plat_mboot_finish(void)131 void bl1_plat_mboot_finish(void)
132 {
133 	int rc;
134 
135 	VERBOSE("Share DPE context handle with BL2: 0x%x\n", new_ctx_handle);
136 	rc = arm_set_tb_fw_info(&new_ctx_handle);
137 	if (rc != 0) {
138 		ERROR("Unable to set DPE context handle in TB_FW_CONFIG\n");
139 		/*
140 		 * It is a fatal error because on TC platform, BL2 software
141 		 * assumes that a valid DPE context_handle is passed through
142 		 * the DTB object by BL1.
143 		 */
144 		plat_panic_handler();
145 	}
146 
147 	VERBOSE("Save parent context handle: 0x%x\n", new_parent_ctx_handle);
148 	rc = sds_struct_write(SDS_RSE_AP_REGION_ID,
149 			      TC2_SDS_DPE_CTX_HANDLE_STRUCT_ID,
150 			      0,
151 			      &new_parent_ctx_handle,
152 			      sizeof(new_parent_ctx_handle),
153 			      SDS_ACCESS_MODE_NON_CACHED);
154 	if (rc != SDS_OK) {
155 		ERROR("Unable to save DPE parent context handle to SDS area\n");
156 		plat_panic_handler();
157 	}
158 }
159