blob: 2c9fafbb6f506a547686300a251de9bf085ca23e [file] [log] [blame]
AlexeiFedorovb8851a72025-04-24 11:40:28 +01001/*
2 * Copyright (c) 2025, Arm Limited. All rights reserved.
3 * SPDX-License-Identifier: BSD-3-Clause
4 */
5
6#include <assert.h>
7#include <stdlib.h>
8
9#include <realm_da_helpers.h>
10#include <realm_rsi.h>
11
12#include <arch.h>
13#include <arch_features.h>
14#include <arch_helpers.h>
15#include <debug.h>
16#include <host_shared_data.h>
17#include <sync.h>
18
19/* Get inst id for a known Realm device id RDEV_ID */
20unsigned long realm_rdev_init(struct rdev *rdev, unsigned long rdev_id)
21{
22 u_register_t rsi_rc;
23 u_register_t rdev_inst_id;
24
25 memset(rdev, 0, sizeof(struct rdev));
26 realm_printf("In test_realm_da_rsi_calls\n");
27
28 rsi_rc = rsi_rdev_get_instance_id(rdev_id, &rdev_inst_id);
29 if (rsi_rc != RSI_SUCCESS) {
30 realm_printf("RSI_RDEV_GET_INSTANCE_ID failed: rdev_id: 0x%lx"
31 " rsi_rc: 0x%lx\n", rdev_id, rsi_rc);
32 return rsi_rc;
33 }
34
35 rdev->id = rdev_id;
36 rdev->inst_id = rdev_inst_id;
37
38 realm_printf("RSI_RDEV_GET_INSTANCE_ID: rdev_id: 0x%lx, "
39 "inst_id: 0x%lx\n", rdev_id, rdev_inst_id);
40
41 return RSI_SUCCESS;
42}
43
44unsigned long realm_rsi_rdev_get_state(struct rdev *rdev)
45{
46 u_register_t rdev_rsi_state;
47 unsigned long rsi_rc;
48
49 rsi_rc = rsi_rdev_get_state(rdev->id, rdev->inst_id, &rdev_rsi_state);
50 if (rsi_rc != RSI_SUCCESS) {
51 ERROR("RSI_RDEV_GET_STATE failed 0x%lx\n", rsi_rc);
52 return rsi_rc;
53 }
54
55 INFO("Realm: RSI_RDEV_GET_STATE completed. RDEV state: 0x%lx\n",
56 rdev_rsi_state);
57
58 return RSI_SUCCESS;
59}
60
61int realm_verify_device_attestation(struct rdev *rdev,
62 struct rsi_dev_info *rdev_info)
63{
64 /*
65 * todo: Implement RHI call to get cached device certificate,
66 * measurement from host and verify the digest against RMM
67 */
68 return 0;
69}
70
71unsigned long realm_rsi_rdev_get_info(struct rdev *rdev,
72 struct rsi_dev_info *rdev_info)
73{
74 unsigned long rsi_rc;
75
76 memset(rdev_info, 0, sizeof(struct rsi_dev_info));
77 rsi_rc = rsi_rdev_get_info(rdev->id, rdev->inst_id,
78 (u_register_t)rdev_info);
79 if (rsi_rc != RSI_SUCCESS) {
80 ERROR("RSI_RDEV_GET_INFO failed 0x%lx\n", rsi_rc);
81 return rsi_rc;
82 }
83
84 /* Print RDEV info */
85 INFO("RSI_RDEV_GET_INFO:\n");
86 INFO("\tflags: 0x%lx\n", rdev_info->flags);
87 INFO("\tattest_type: 0x%lx\n", rdev_info->attest_type);
88 INFO("\tcert_id: 0x%lx\n", rdev_info->cert_id);
89 INFO("\thash_algo: 0x%lx\n", rdev_info->hash_algo);
90
91 return RSI_SUCCESS;
92}
93
94unsigned long realm_rsi_rdev_get_measurements(struct rdev *rdev,
95 struct rsi_dev_measure_params *mparams)
96{
97 unsigned long rsi_rc;
98
99 INFO("Realm: Call RSI_RDEV_GET_MEASUREMENTS\n");
100
101 /* Set measurement parameters */
102 memset(mparams, 0, sizeof(struct rsi_dev_measure_params));
103 mparams->flags = (INPLACE(RSI_DEV_MEASURE_FLAGS_ALL,
104 RSI_DEV_MEASURE_ALL) |
105 INPLACE(RSI_DEV_MEASURE_FLAGS_SIGNED,
106 RSI_DEV_MEASURE_NOT_SIGNED) |
107 INPLACE(RSI_DEV_MEASURE_FLAGS_RAW,
108 RSI_DEV_MEASURE_NOT_RAW));
109
110
111 rsi_rc = rsi_rdev_get_measurements(rdev->id, rdev->inst_id,
112 (u_register_t)mparams);
113 if (rsi_rc != RSI_SUCCESS) {
114 ERROR("RSI_RDEV_GET_MEASUREMENTS failed\n");
115 return RSI_ERROR_STATE;
116 }
117
118 INFO("Host Realm: RDEV state after submitting meas request\n");
119 (void)realm_rsi_rdev_get_state(rdev);
120
121 /* Do RSI RDEV continue call */
122 do {
123 rsi_rc = rsi_rdev_continue(rdev->id, rdev->inst_id);
124 } while (rsi_rc == RSI_INCOMPLETE);
125
126 INFO("Host Realm: RDEV state after host completing meas request\n");
127 (void)realm_rsi_rdev_get_state(rdev);
128
129 return rsi_rc;
130}
131
132unsigned long realm_rsi_rdev_lock(struct rdev *rdev)
133{
134 unsigned long rsi_rc;
135
136 INFO("Realm: Call RSI_RDEV_LOCK\n");
137
138 rsi_rc = rsi_rdev_lock(rdev->id, rdev->inst_id);
139 if (rsi_rc != RSI_SUCCESS) {
140 ERROR("RSI_RDEV_LOCK failed\n");
141 return RSI_ERROR_STATE;
142 }
143
144 INFO("Realm: RDEV state after submitting lock request\n");
145 (void)realm_rsi_rdev_get_state(rdev);
146
147 /* Do RSI RDEV continue call */
148 do {
149 rsi_rc = rsi_rdev_continue(rdev->id, rdev->inst_id);
150 } while (rsi_rc == RSI_INCOMPLETE);
151
152 INFO("Realm: RDEV state after host completing lock request\n");
153 (void)realm_rsi_rdev_get_state(rdev);
154
155 return rsi_rc;
156}
157
158unsigned long realm_rsi_rdev_get_interface_report(struct rdev *rdev)
159{
160 unsigned long rsi_rc;
161
162 INFO("Realm: Call RSI_RDEV_GET_IFC_REPORT\n");
163
164 rsi_rc = rsi_rdev_get_interface_report(rdev->id, rdev->inst_id,
165 RDEV_TDISP_VERSION_MAX);
166 if (rsi_rc != RSI_SUCCESS) {
167 ERROR("RSI_RDEV_GET_IFC_REPORT failed\n");
168 return RSI_ERROR_STATE;
169 }
170
171 INFO("Realm: RDEV state after submitting IFC_REPORT request\n");
172 (void)realm_rsi_rdev_get_state(rdev);
173
174 /* Do RSI RDEV continue call */
175 do {
176 rsi_rc = rsi_rdev_continue(rdev->id, rdev->inst_id);
177 } while (rsi_rc == RSI_INCOMPLETE);
178
179 INFO("Realm: RDEV state after host completing IFC_REPORT request\n");
180 (void)realm_rsi_rdev_get_state(rdev);
181
182 return rsi_rc;
183}
184
185unsigned long realm_rsi_rdev_start(struct rdev *rdev)
186{
187 unsigned long rsi_rc;
188
189 INFO("Realm: Call RSI_RDEV_start\n");
190
191 rsi_rc = rsi_rdev_start(rdev->id, rdev->inst_id);
192 if (rsi_rc != RSI_SUCCESS) {
193 ERROR("RSI_RDEV_START failed\n");
194 return RSI_ERROR_STATE;
195 }
196
197 INFO("Realm: RDEV state after submitting start request\n");
198 (void)realm_rsi_rdev_get_state(rdev);
199
200 /* Do RSI RDEV continue call */
201 do {
202 rsi_rc = rsi_rdev_continue(rdev->id, rdev->inst_id);
203 } while (rsi_rc == RSI_INCOMPLETE);
204
205 INFO("Realm: RDEV state after host completing start request\n");
206 (void)realm_rsi_rdev_get_state(rdev);
207
208 return rsi_rc;
209}
210
211unsigned long realm_rsi_rdev_stop(struct rdev *rdev)
212{
213 unsigned long rsi_rc;
214
215 INFO("Realm: Call RSI_RDEV_STOP\n");
216
217 rsi_rc = rsi_rdev_stop(rdev->id, rdev->inst_id);
218 if (rsi_rc != RSI_SUCCESS) {
219 ERROR("RSI_RDEV_STOP failed\n");
220 return RSI_ERROR_STATE;
221 }
222
223 INFO("Realm: RDEV state after submitting stop request\n");
224 (void)realm_rsi_rdev_get_state(rdev);
225
226 /* Do RSI RDEV continue call */
227 do {
228 rsi_rc = rsi_rdev_continue(rdev->id, rdev->inst_id);
229 } while (rsi_rc == RSI_INCOMPLETE);
230
231 INFO("Realm: RDEV state after host completing stop request\n");
232 (void)realm_rsi_rdev_get_state(rdev);
233
234 return rsi_rc;
235}