blob: 381a1682b0359fae219db782fd7bbeb907fea341 [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 */
Yousuf Afa6c5212022-10-14 11:40:43 +010021#define RSI_ABI_VERSION_MAJOR U(12)
Soby Mathewb4c6df42022-11-09 11:13:29 +000022
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
Yousuf Afa6c5212022-10-14 11:40:43 +010029#define RSI_ABI_VERSION ((RSI_ABI_VERSION_MAJOR << U(16)) | \
Soby Mathewb4c6df42022-11-09 11:13:29 +000030 RSI_ABI_VERSION_MINOR)
31
Yousuf Afa6c5212022-10-14 11:40:43 +010032#define RSI_ABI_VERSION_GET_MAJOR(_version) ((_version) >> U(16))
33#define RSI_ABI_VERSION_GET_MINOR(_version) ((_version) & U(0xFFFF))
Soby Mathewb4c6df42022-11-09 11:13:29 +000034
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 */
Yousuf Afa6c5212022-10-14 11:40:43 +010043#define RSI_SUCCESS U(0)
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 */
Yousuf Afa6c5212022-10-14 11:40:43 +010046#define RSI_ERROR_INPUT U(1)
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 */
Yousuf Afa6c5212022-10-14 11:40:43 +010052#define RSI_ERROR_STATE U(2)
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 */
Yousuf Afa6c5212022-10-14 11:40:43 +010055#define RSI_INCOMPLETE U(3)
Soby Mathewb4c6df42022-11-09 11:13:29 +000056
Yousuf Afa6c5212022-10-14 11:40:43 +010057#define RSI_ERROR_COUNT U(4)
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
Yousuf Afa6c5212022-10-14 11:40:43 +0100114#ifndef __ASSEMBLER__
Soby Mathew5216d172023-01-17 04:09:33 +0000115/*
116 * Defines member of structure and reserves space
117 * for the next member with specified offset.
118 */
119#define SET_MEMBER_RSI SET_MEMBER
120
Soby Mathewb4c6df42022-11-09 11:13:29 +0000121struct rsi_realm_config {
122 /* IPA width in bits */
Soby Mathew5216d172023-01-17 04:09:33 +0000123 SET_MEMBER_RSI(unsigned long ipa_width, 0, 0x1000); /* Offset 0 */
Soby Mathewb4c6df42022-11-09 11:13:29 +0000124};
125
Yousuf Afa6c5212022-10-14 11:40:43 +0100126#endif /* __ASSEMBLER__ */
127
Soby Mathewb4c6df42022-11-09 11:13:29 +0000128/*
129 * arg0 == struct rsi_realm_config address
130 */
131#define SMC_RSI_REALM_CONFIG SMC64_RSI_FID(U(0x6))
132
133/*
134 * arg0 == IPA address of target region
135 * arg1 == Size of target region in bytes
136 * arg2 == RIPAS value
137 * ret0 == Status / error
138 * ret1 == Top of modified IPA range
139 */
140#define SMC_RSI_IPA_STATE_SET SMC64_RSI_FID(U(0x7))
141
142/*
143 * arg0 == IPA
144 * ret0 == Status / error
145 * ret1 == RIPAS value
146 */
147#define SMC_RSI_IPA_STATE_GET SMC64_RSI_FID(U(0x8))
148
Yousuf Afa6c5212022-10-14 11:40:43 +0100149#define RSI_HOST_CALL_NR_GPRS U(7)
Soby Mathewb4c6df42022-11-09 11:13:29 +0000150
Yousuf Afa6c5212022-10-14 11:40:43 +0100151#ifndef __ASSEMBLER__
Soby Mathewb4c6df42022-11-09 11:13:29 +0000152struct rsi_host_call {
Soby Mathew5216d172023-01-17 04:09:33 +0000153 SET_MEMBER_RSI(struct {
Soby Mathewb4c6df42022-11-09 11:13:29 +0000154 /* Immediate value */
155 unsigned int imm; /* Offset 0 */
156 /* Registers */
157 unsigned long gprs[RSI_HOST_CALL_NR_GPRS];
158 }, 0, 0x100);
159};
160
Yousuf Afa6c5212022-10-14 11:40:43 +0100161#endif /* __ASSEMBLER__ */
162
Soby Mathewb4c6df42022-11-09 11:13:29 +0000163/*
164 * arg0 == struct rsi_host_call addr
165 */
166#define SMC_RSI_HOST_CALL SMC64_RSI_FID(U(0x9))
167
168#endif /* SMC_RSI_H */