blob: de5702a71bea54fb700d35b5631e82b937c6ae27 [file] [log] [blame]
Tamas Bana4260892023-06-07 13:35:04 +02001/*
2 * Copyright (c) 2024, Arm Limited. All rights reserved.
3 *
4 * SPDX-License-Identifier: BSD-3-Clause
5 */
6
7#include <stdint.h>
8
Tamas Ban0fbe8622023-06-12 11:33:47 +02009#include <common/debug.h>
Tamas Banae33fa92023-06-07 14:18:46 +020010#include <drivers/arm/css/sds.h>
Tamas Bandc15bf42024-02-22 11:35:28 +010011#include <drivers/arm/rse_comms.h>
Tamas Banae33fa92023-06-07 14:18:46 +020012#include <drivers/delay_timer.h>
13#include <drivers/generic_delay_timer.h>
Tamas Bana4260892023-06-07 13:35:04 +020014#include <drivers/measured_boot/metadata.h>
Tamas Bandc15bf42024-02-22 11:35:28 +010015#include <drivers/measured_boot/rse/dice_prot_env.h>
Tamas Bana4260892023-06-07 13:35:04 +020016#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
Tamas Ban1bac7b02024-06-14 14:24:15 +020021#include "tc_dpe.h"
Tamas Bana5d3ca82024-01-30 12:56:38 +010022
Tamas Bana4260892023-06-07 13:35:04 +020023struct dpe_metadata tc_dpe_metadata[] = {
24 {
25 .id = FW_CONFIG_ID,
Tamas Bana5d3ca82024-01-30 12:56:38 +010026 .cert_id = DPE_AP_FW_CERT_ID,
Tamas Bana4260892023-06-07 13:35:04 +020027 .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,
Tamas Ban817ede32024-06-14 14:55:31 +020032 .target_locality = LOCALITY_NONE, /* won't derive don't care */
Tamas Bana4260892023-06-07 13:35:04 +020033 .pk_oid = ZERO_OID },
34 {
35 .id = TB_FW_CONFIG_ID,
Tamas Bana5d3ca82024-01-30 12:56:38 +010036 .cert_id = DPE_AP_FW_CERT_ID,
Tamas Bana4260892023-06-07 13:35:04 +020037 .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,
Tamas Ban817ede32024-06-14 14:55:31 +020042 .target_locality = LOCALITY_NONE, /* won't derive don't care */
Tamas Bana4260892023-06-07 13:35:04 +020043 .pk_oid = ZERO_OID },
44 {
45 .id = BL2_IMAGE_ID,
Tamas Bana5d3ca82024-01-30 12:56:38 +010046 .cert_id = DPE_AP_FW_CERT_ID,
Tamas Bana4260892023-06-07 13:35:04 +020047 .signer_id_size = SIGNER_ID_MIN_SIZE,
48 .sw_type = MBOOT_BL2_IMAGE_STRING,
49 .allow_new_context_to_derive = true,
Tamas Ban14d82442024-06-03 16:51:49 +020050 .retain_parent_context = true, /* To handle restart */
Tamas Ban817ede32024-06-14 14:55:31 +020051 .target_locality = LOCALITY_AP_S,
Tamas Bana4260892023-06-07 13:35:04 +020052 .create_certificate = false,
53 .pk_oid = ZERO_OID },
54 {
55 .id = DPE_INVALID_ID }
56};
57
Tamas Banae33fa92023-06-07 14:18:46 +020058/* Effective timeout of 10000 ms */
Tamas Bandc15bf42024-02-22 11:35:28 +010059#define RSE_DPE_BOOT_10US_RETRIES 1000000
Tamas Banae33fa92023-06-07 14:18:46 +020060#define TC2_SDS_DPE_CTX_HANDLE_STRUCT_ID 0x0000000A
61
Tamas Ban0fbe8622023-06-12 11:33:47 +020062/* Context handle is meant to be used by BL2. Sharing it via TB_FW_CONFIG */
63static int new_ctx_handle;
Tamas Ban14d82442024-06-03 16:51:49 +020064/* Save a valid parent context handle to be able to send commands to DPE service
65 * in case of an AP cold restart.
66 */
67static int new_parent_ctx_handle;
Tamas Ban0fbe8622023-06-12 11:33:47 +020068
Tamas Ban14d82442024-06-03 16:51:49 +020069void plat_dpe_share_context_handle(int *ctx_handle, int *parent_ctx_handle)
Tamas Ban0fbe8622023-06-12 11:33:47 +020070{
71 new_ctx_handle = *ctx_handle;
Tamas Ban14d82442024-06-03 16:51:49 +020072 new_parent_ctx_handle = *parent_ctx_handle;
Tamas Ban0fbe8622023-06-12 11:33:47 +020073}
Tamas Bana4260892023-06-07 13:35:04 +020074
Tamas Banae33fa92023-06-07 14:18:46 +020075void plat_dpe_get_context_handle(int *ctx_handle)
76{
Tamas Bandc15bf42024-02-22 11:35:28 +010077 int retry = RSE_DPE_BOOT_10US_RETRIES;
Tamas Banae33fa92023-06-07 14:18:46 +020078 int ret;
79
80 /* Initialize System level generic or SP804 timer */
81 generic_delay_timer_init();
82
Tamas Bandc15bf42024-02-22 11:35:28 +010083 /* 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
Tamas Banae33fa92023-06-07 14:18:46 +020085 * runtime, which initialize this area, therefore AP needs to check it
Tamas Bandc15bf42024-02-22 11:35:28 +010086 * in a loop until it gets written by RSE Secure Runtime.
Tamas Banae33fa92023-06-07 14:18:46 +020087 */
Tamas Bandc15bf42024-02-22 11:35:28 +010088 VERBOSE("Waiting for DPE service initialization in RSE Secure Runtime\n");
Tamas Banae33fa92023-06-07 14:18:46 +020089 while (retry > 0) {
Tamas Bandc15bf42024-02-22 11:35:28 +010090 ret = sds_init(SDS_RSE_AP_REGION_ID);
Tamas Banae33fa92023-06-07 14:18:46 +020091 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",
Tamas Bandc15bf42024-02-22 11:35:28 +0100104 (RSE_DPE_BOOT_10US_RETRIES - retry) / 100);
Tamas Banae33fa92023-06-07 14:18:46 +0200105 }
106
107 /* TODO: call this in a loop to avoid reading unfinished data */
Tamas Bandc15bf42024-02-22 11:35:28 +0100108 ret = sds_struct_read(SDS_RSE_AP_REGION_ID,
Tamas Banae33fa92023-06-07 14:18:46 +0200109 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
Tamas Bana4260892023-06-07 13:35:04 +0200122void bl1_plat_mboot_init(void)
123{
Tamas Bandc15bf42024-02-22 11:35:28 +0100124 /* 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);
Tamas Bana4260892023-06-07 13:35:04 +0200127
128 dpe_init(tc_dpe_metadata);
129}
130
131void bl1_plat_mboot_finish(void)
132{
Tamas Ban0fbe8622023-06-12 11:33:47 +0200133 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 }
Tamas Ban14d82442024-06-03 16:51:49 +0200146
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 }
Tamas Bana4260892023-06-07 13:35:04 +0200158}