blob: d6064b5f012e57221ac6cd5ee6cc90f1351df816 [file] [log] [blame]
Soby Mathewb4c6df42022-11-09 11:13:29 +00001/*
2 * SPDX-License-Identifier: BSD-3-Clause
3 * SPDX-FileCopyrightText: Copyright TF-RMM Contributors.
4 */
5
6#ifndef SMC_RSI_H
7#define SMC_RSI_H
8
9#include <smc.h>
Soby Mathewb4c6df42022-11-09 11:13:29 +000010
11/*
12 * This file describes the Realm Services Interface (RSI) Application Binary
13 * Interface (ABI) for SMC calls made from within the Realm to the RMM and
14 * serviced by the RMM.
Soby Mathewb4c6df42022-11-09 11:13:29 +000015 */
16
17/*
18 * The major version number of the RSI implementation. Increase this whenever
19 * the binary format or semantics of the SMC calls change.
20 */
21#define RSI_ABI_VERSION_MAJOR 12U
22
23/*
24 * The minor version number of the RSI implementation. Increase this when
25 * a bug is fixed, or a feature is added without breaking binary compatibility.
26 */
27#define RSI_ABI_VERSION_MINOR 0
28
29#define RSI_ABI_VERSION ((RSI_ABI_VERSION_MAJOR << 16U) | \
30 RSI_ABI_VERSION_MINOR)
31
32#define RSI_ABI_VERSION_GET_MAJOR(_version) ((_version) >> 16U)
33#define RSI_ABI_VERSION_GET_MINOR(_version) ((_version) & 0xFFFFU)
34
35#define IS_SMC64_RSI_FID(_fid) IS_SMC64_STD_FAST_IN_RANGE(RSI, _fid)
36
37#define SMC64_RSI_FID(_offset) SMC64_STD_FID(RSI, _offset)
38
39#define SMC_RSI_ABI_VERSION SMC64_RSI_FID(U(0x0))
40
41/* RSI Status code enumeration as per Section D4.3.6 of the RMM Spec */
Soby Mathew40852d22023-01-17 04:16:07 +000042/* Command completed successfully */
43#define RSI_SUCCESS 0U
Soby Mathewb4c6df42022-11-09 11:13:29 +000044
Soby Mathew40852d22023-01-17 04:16:07 +000045/* The value of a command input value caused the command to fail */
46#define RSI_ERROR_INPUT 1U
Soby Mathewb4c6df42022-11-09 11:13:29 +000047
Soby Mathew40852d22023-01-17 04:16:07 +000048/*
49 * The state of the current Realm or current REC
50 * does not match the state expected by the command
51 */
52#define RSI_ERROR_STATE 2U
Soby Mathewb4c6df42022-11-09 11:13:29 +000053
Soby Mathew40852d22023-01-17 04:16:07 +000054/* The operation requested by the command is not complete */
55#define RSI_INCOMPLETE 3U
Soby Mathewb4c6df42022-11-09 11:13:29 +000056
Soby Mathew40852d22023-01-17 04:16:07 +000057#define RSI_ERROR_COUNT 4U
Soby Mathewb4c6df42022-11-09 11:13:29 +000058
59/*
60 * Returns a measurement.
61 * arg1: Measurement index (0..4), measurement (RIM or REM) to read
62 * ret0: Status / error
63 * ret1: Measurement value, bytes: 0 - 7
64 * ret2: Measurement value, bytes: 7 - 15
65 * ret3: Measurement value, bytes: 16 - 23
66 * ret4: Measurement value, bytes: 24 - 31
67 * ret5: Measurement value, bytes: 32 - 39
68 * ret6: Measurement value, bytes: 40 - 47
69 * ret7: Measurement value, bytes: 48 - 55
70 * ret8: Measurement value, bytes: 56 - 63
71 */
72#define SMC_RSI_MEASUREMENT_READ SMC64_RSI_FID(U(0x2))
73
74/*
75 * Extends a REM.
76 * arg0: Measurement index (1..4), measurement (REM) to extend
77 * arg1: Measurement size in bytes
78 * arg3: Challenge value, bytes: 0 - 7
79 * arg4: Challenge value, bytes: 7 - 15
80 * arg5: Challenge value, bytes: 16 - 23
81 * arg6: Challenge value, bytes: 24 - 31
82 * arg7: Challenge value, bytes: 32 - 39
83 * arg8: Challenge value, bytes: 40 - 47
84 * arg9: Challenge value, bytes: 48 - 55
85 * arg10: Challenge value, bytes: 56 - 63
86 * ret0: Status / error
87 */
88#define SMC_RSI_MEASUREMENT_EXTEND SMC64_RSI_FID(U(0x3))
89
90/*
91 * Initialize the operation to retrieve an attestation token.
92 * arg1: The IPA of token buffer
93 * arg2: Challenge value, bytes: 0 - 7
94 * arg3: Challenge value, bytes: 7 - 15
95 * arg4: Challenge value, bytes: 16 - 23
96 * arg5: Challenge value, bytes: 24 - 31
97 * arg6: Challenge value, bytes: 32 - 39
98 * arg7: Challenge value, bytes: 40 - 47
99 * arg8: Challenge value, bytes: 48 - 55
100 * arg9: Challenge value, bytes: 56 - 63
101 * ret0: Status / error
102 * ret1: Size of completed token in bytes
103 */
104#define SMC_RSI_ATTEST_TOKEN_INIT SMC64_RSI_FID(U(0x4))
105
106/*
107 * Continue the operation to retrieve an attestation token.
108 * arg1: The IPA of token buffer
109 * ret0: Status / error
110 * ret1: Size of completed token in bytes
111 */
112#define SMC_RSI_ATTEST_TOKEN_CONTINUE SMC64_RSI_FID(U(0x5))
113
Soby Mathew5216d172023-01-17 04:09:33 +0000114/*
115 * Defines member of structure and reserves space
116 * for the next member with specified offset.
117 */
118#define SET_MEMBER_RSI SET_MEMBER
119
Soby Mathewb4c6df42022-11-09 11:13:29 +0000120struct rsi_realm_config {
121 /* IPA width in bits */
Soby Mathew5216d172023-01-17 04:09:33 +0000122 SET_MEMBER_RSI(unsigned long ipa_width, 0, 0x1000); /* Offset 0 */
Soby Mathewb4c6df42022-11-09 11:13:29 +0000123};
124
Soby Mathewb4c6df42022-11-09 11:13:29 +0000125/*
126 * arg0 == struct rsi_realm_config address
127 */
128#define SMC_RSI_REALM_CONFIG SMC64_RSI_FID(U(0x6))
129
130/*
131 * arg0 == IPA address of target region
132 * arg1 == Size of target region in bytes
133 * arg2 == RIPAS value
134 * ret0 == Status / error
135 * ret1 == Top of modified IPA range
136 */
137#define SMC_RSI_IPA_STATE_SET SMC64_RSI_FID(U(0x7))
138
139/*
140 * arg0 == IPA
141 * ret0 == Status / error
142 * ret1 == RIPAS value
143 */
144#define SMC_RSI_IPA_STATE_GET SMC64_RSI_FID(U(0x8))
145
146#define RSI_HOST_CALL_NR_GPRS 7U
147
148struct rsi_host_call {
Soby Mathew5216d172023-01-17 04:09:33 +0000149 SET_MEMBER_RSI(struct {
Soby Mathewb4c6df42022-11-09 11:13:29 +0000150 /* Immediate value */
151 unsigned int imm; /* Offset 0 */
152 /* Registers */
153 unsigned long gprs[RSI_HOST_CALL_NR_GPRS];
154 }, 0, 0x100);
155};
156
Soby Mathewb4c6df42022-11-09 11:13:29 +0000157/*
158 * arg0 == struct rsi_host_call addr
159 */
160#define SMC_RSI_HOST_CALL SMC64_RSI_FID(U(0x9))
161
162#endif /* SMC_RSI_H */