blob: e269f077a8287542e6c4a55aa640193d765a21cc [file] [log] [blame]
/*
* SPDX-License-Identifier: BSD-3-Clause
* SPDX-FileCopyrightText: Copyright TF-RMM Contributors.
*/
#ifndef SMC_RSI_H
#define SMC_RSI_H
#include <smc.h>
#include <stddef.h>
#include <utils_def.h>
/*
* This file describes the Realm Services Interface (RSI) Application Binary
* Interface (ABI) for SMC calls made from within the Realm to the RMM and
* serviced by the RMM.
*
* See doc/rmm_interface.md for more details.
*/
/*
* The major version number of the RSI implementation. Increase this whenever
* the binary format or semantics of the SMC calls change.
*/
#define RSI_ABI_VERSION_MAJOR 12U
/*
* The minor version number of the RSI implementation. Increase this when
* a bug is fixed, or a feature is added without breaking binary compatibility.
*/
#define RSI_ABI_VERSION_MINOR 0
#define RSI_ABI_VERSION ((RSI_ABI_VERSION_MAJOR << 16U) | \
RSI_ABI_VERSION_MINOR)
#define RSI_ABI_VERSION_GET_MAJOR(_version) ((_version) >> 16U)
#define RSI_ABI_VERSION_GET_MINOR(_version) ((_version) & 0xFFFFU)
#define IS_SMC64_RSI_FID(_fid) IS_SMC64_STD_FAST_IN_RANGE(RSI, _fid)
#define SMC64_RSI_FID(_offset) SMC64_STD_FID(RSI, _offset)
#define SMC_RSI_ABI_VERSION SMC64_RSI_FID(U(0x0))
/* RSI Status code enumeration as per Section D4.3.6 of the RMM Spec */
typedef enum {
/* Command completed successfully */
RSI_SUCCESS = 0U,
/*
* The value of a command input value
* caused the command to fail
*/
RSI_ERROR_INPUT = 1U,
/*
* The state of the current Realm or current REC
* does not match the state expected by the command
*/
RSI_ERROR_STATE = 2U,
/* The operation requested by the command is not complete */
RSI_INCOMPLETE = 3U,
RSI_ERROR_COUNT
} rsi_status_t;
/*
* Returns a measurement.
* arg1: Measurement index (0..4), measurement (RIM or REM) to read
* ret0: Status / error
* ret1: Measurement value, bytes: 0 - 7
* ret2: Measurement value, bytes: 7 - 15
* ret3: Measurement value, bytes: 16 - 23
* ret4: Measurement value, bytes: 24 - 31
* ret5: Measurement value, bytes: 32 - 39
* ret6: Measurement value, bytes: 40 - 47
* ret7: Measurement value, bytes: 48 - 55
* ret8: Measurement value, bytes: 56 - 63
*/
#define SMC_RSI_MEASUREMENT_READ SMC64_RSI_FID(U(0x2))
/*
* Extends a REM.
* arg0: Measurement index (1..4), measurement (REM) to extend
* arg1: Measurement size in bytes
* arg3: Challenge value, bytes: 0 - 7
* arg4: Challenge value, bytes: 7 - 15
* arg5: Challenge value, bytes: 16 - 23
* arg6: Challenge value, bytes: 24 - 31
* arg7: Challenge value, bytes: 32 - 39
* arg8: Challenge value, bytes: 40 - 47
* arg9: Challenge value, bytes: 48 - 55
* arg10: Challenge value, bytes: 56 - 63
* ret0: Status / error
*/
#define SMC_RSI_MEASUREMENT_EXTEND SMC64_RSI_FID(U(0x3))
/*
* Initialize the operation to retrieve an attestation token.
* arg1: The IPA of token buffer
* arg2: Challenge value, bytes: 0 - 7
* arg3: Challenge value, bytes: 7 - 15
* arg4: Challenge value, bytes: 16 - 23
* arg5: Challenge value, bytes: 24 - 31
* arg6: Challenge value, bytes: 32 - 39
* arg7: Challenge value, bytes: 40 - 47
* arg8: Challenge value, bytes: 48 - 55
* arg9: Challenge value, bytes: 56 - 63
* ret0: Status / error
* ret1: Size of completed token in bytes
*/
#define SMC_RSI_ATTEST_TOKEN_INIT SMC64_RSI_FID(U(0x4))
/*
* Continue the operation to retrieve an attestation token.
* arg1: The IPA of token buffer
* ret0: Status / error
* ret1: Size of completed token in bytes
*/
#define SMC_RSI_ATTEST_TOKEN_CONTINUE SMC64_RSI_FID(U(0x5))
struct rsi_realm_config {
/* IPA width in bits */
SET_MEMBER(unsigned long ipa_width, 0, 0x1000); /* Offset 0 */
};
COMPILER_ASSERT(sizeof(struct rsi_realm_config) == 0x1000);
COMPILER_ASSERT(offsetof(struct rsi_realm_config, ipa_width) == 0);
/*
* arg0 == struct rsi_realm_config address
*/
#define SMC_RSI_REALM_CONFIG SMC64_RSI_FID(U(0x6))
/*
* arg0 == IPA address of target region
* arg1 == Size of target region in bytes
* arg2 == RIPAS value
* ret0 == Status / error
* ret1 == Top of modified IPA range
*/
#define SMC_RSI_IPA_STATE_SET SMC64_RSI_FID(U(0x7))
/*
* arg0 == IPA
* ret0 == Status / error
* ret1 == RIPAS value
*/
#define SMC_RSI_IPA_STATE_GET SMC64_RSI_FID(U(0x8))
#define RSI_HOST_CALL_NR_GPRS 7U
struct rsi_host_call {
SET_MEMBER(struct {
/* Immediate value */
unsigned int imm; /* Offset 0 */
/* Registers */
unsigned long gprs[RSI_HOST_CALL_NR_GPRS];
}, 0, 0x100);
};
COMPILER_ASSERT(sizeof(struct rsi_host_call) == 0x100);
COMPILER_ASSERT(offsetof(struct rsi_host_call, imm) == 0);
COMPILER_ASSERT(offsetof(struct rsi_host_call, gprs[0]) == 8);
COMPILER_ASSERT(offsetof(struct rsi_host_call,
gprs[RSI_HOST_CALL_NR_GPRS - 1]) ==
8 * RSI_HOST_CALL_NR_GPRS);
/*
* arg0 == struct rsi_host_call addr
*/
#define SMC_RSI_HOST_CALL SMC64_RSI_FID(U(0x9))
#endif /* SMC_RSI_H */