1*76a2904cSSarah Walker /*- 2*76a2904cSSarah Walker * SPDX-License-Identifier: BSD-2-Clause 3*76a2904cSSarah Walker * 4*76a2904cSSarah Walker * Copyright (c) 2026 Arm Ltd 5*76a2904cSSarah Walker * 6*76a2904cSSarah Walker * Redistribution and use in source and binary forms, with or without 7*76a2904cSSarah Walker * modification, are permitted provided that the following conditions 8*76a2904cSSarah Walker * are met: 9*76a2904cSSarah Walker * 1. Redistributions of source code must retain the above copyright 10*76a2904cSSarah Walker * notice, this list of conditions and the following disclaimer. 11*76a2904cSSarah Walker * 2. Redistributions in binary form must reproduce the above copyright 12*76a2904cSSarah Walker * notice, this list of conditions and the following disclaimer in the 13*76a2904cSSarah Walker * documentation and/or other materials provided with the distribution. 14*76a2904cSSarah Walker * 15*76a2904cSSarah Walker * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 16*76a2904cSSarah Walker * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 17*76a2904cSSarah Walker * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 18*76a2904cSSarah Walker * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 19*76a2904cSSarah Walker * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 20*76a2904cSSarah Walker * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 21*76a2904cSSarah Walker * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 22*76a2904cSSarah Walker * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 23*76a2904cSSarah Walker * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 24*76a2904cSSarah Walker * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 25*76a2904cSSarah Walker * SUCH DAMAGE. 26*76a2904cSSarah Walker */ 27*76a2904cSSarah Walker 28*76a2904cSSarah Walker #ifndef _MACHINE_RSI_H_ 29*76a2904cSSarah Walker #define _MACHINE_RSI_H_ 30*76a2904cSSarah Walker 31*76a2904cSSarah Walker extern uint64_t prot_ns_shared; 32*76a2904cSSarah Walker 33*76a2904cSSarah Walker bool in_realm(void); 34*76a2904cSSarah Walker 35*76a2904cSSarah Walker void arm64_rsi_setup_memory(void); 36*76a2904cSSarah Walker 37*76a2904cSSarah Walker /* 38*76a2904cSSarah Walker * The major version number of the RSI implementation. This is increased when 39*76a2904cSSarah Walker * the binary format or semantics of the SMC calls change. 40*76a2904cSSarah Walker */ 41*76a2904cSSarah Walker #define RSI_ABI_VERSION_MAJOR UL(1) 42*76a2904cSSarah Walker 43*76a2904cSSarah Walker /* 44*76a2904cSSarah Walker * The minor version number of the RSI implementation. This is increased when 45*76a2904cSSarah Walker * a bug is fixed, or a feature is added without breaking binary compatibility. 46*76a2904cSSarah Walker */ 47*76a2904cSSarah Walker #define RSI_ABI_VERSION_MINOR UL(0) 48*76a2904cSSarah Walker 49*76a2904cSSarah Walker #define RSI_ABI_VERSION ((RSI_ABI_VERSION_MAJOR << 16) | \ 50*76a2904cSSarah Walker RSI_ABI_VERSION_MINOR) 51*76a2904cSSarah Walker 52*76a2904cSSarah Walker #define RSI_ABI_VERSION_GET_MAJOR(_version) ((_version) >> 16) 53*76a2904cSSarah Walker #define RSI_ABI_VERSION_GET_MINOR(_version) ((_version) & 0xFFFF) 54*76a2904cSSarah Walker 55*76a2904cSSarah Walker #define RSI_SUCCESS UL(0) 56*76a2904cSSarah Walker #define RSI_ERROR_INPUT UL(1) 57*76a2904cSSarah Walker #define RSI_ERROR_STATE UL(2) 58*76a2904cSSarah Walker #define RSI_INCOMPLETE UL(3) 59*76a2904cSSarah Walker #define RSI_ERROR_UNKNOWN UL(4) 60*76a2904cSSarah Walker 61*76a2904cSSarah Walker #define SMC_RSI_FID(n) SMCCC_FUNC_ID(SMCCC_FAST_CALL, \ 62*76a2904cSSarah Walker SMCCC_64BIT_CALL, \ 63*76a2904cSSarah Walker SMCCC_STD_SECURE_SERVICE_CALLS, \ 64*76a2904cSSarah Walker n) 65*76a2904cSSarah Walker 66*76a2904cSSarah Walker /* 67*76a2904cSSarah Walker * Returns RSI version. 68*76a2904cSSarah Walker * 69*76a2904cSSarah Walker * arg1 == Requested interface revision 70*76a2904cSSarah Walker * ret0 == Status / error 71*76a2904cSSarah Walker * ret1 == Lower implemented interface revision 72*76a2904cSSarah Walker * ret2 == Higher implemented interface revision 73*76a2904cSSarah Walker */ 74*76a2904cSSarah Walker #define SMC_RSI_ABI_VERSION SMC_RSI_FID(0x190) 75*76a2904cSSarah Walker 76*76a2904cSSarah Walker /* 77*76a2904cSSarah Walker * Read configuration for the current Realm. 78*76a2904cSSarah Walker * 79*76a2904cSSarah Walker * arg1 == struct realm_config addr 80*76a2904cSSarah Walker * ret0 == Status / error 81*76a2904cSSarah Walker */ 82*76a2904cSSarah Walker #define SMC_RSI_REALM_CONFIG SMC_RSI_FID(0x196) 83*76a2904cSSarah Walker 84*76a2904cSSarah Walker struct realm_config { 85*76a2904cSSarah Walker union { 86*76a2904cSSarah Walker struct { 87*76a2904cSSarah Walker unsigned long ipa_bits; /* Width of IPA in bits */ 88*76a2904cSSarah Walker unsigned long hash_algo; /* Hash algorithm */ 89*76a2904cSSarah Walker }; 90*76a2904cSSarah Walker uint8_t pad[0x200]; 91*76a2904cSSarah Walker }; 92*76a2904cSSarah Walker union { 93*76a2904cSSarah Walker uint8_t rpv[64]; /* Realm Personalization Value */ 94*76a2904cSSarah Walker uint8_t pad2[0xe00]; 95*76a2904cSSarah Walker }; 96*76a2904cSSarah Walker /* 97*76a2904cSSarah Walker * The RMM requires the configuration structure to be aligned to a 4k 98*76a2904cSSarah Walker * boundary, ensure this happens by aligning this structure. 99*76a2904cSSarah Walker */ 100*76a2904cSSarah Walker } __aligned(0x1000); 101*76a2904cSSarah Walker 102*76a2904cSSarah Walker /* 103*76a2904cSSarah Walker * Request RIPAS of a target IPA range to be changed to a specified value. 104*76a2904cSSarah Walker * 105*76a2904cSSarah Walker * arg1 == Base IPA address of target region 106*76a2904cSSarah Walker * arg2 == Top of the region 107*76a2904cSSarah Walker * arg3 == RIPAS value 108*76a2904cSSarah Walker * arg4 == flags 109*76a2904cSSarah Walker * ret0 == Status / error 110*76a2904cSSarah Walker * ret1 == Top of modified IPA range 111*76a2904cSSarah Walker * ret2 == Whether the Host accepted or rejected the request 112*76a2904cSSarah Walker */ 113*76a2904cSSarah Walker #define SMC_RSI_IPA_STATE_SET SMC_RSI_FID(0x197) 114*76a2904cSSarah Walker 115*76a2904cSSarah Walker #define RSI_NO_CHANGE_DESTROYED UL(0) 116*76a2904cSSarah Walker #define RSI_CHANGE_DESTROYED UL(1) 117*76a2904cSSarah Walker 118*76a2904cSSarah Walker #define RSI_ACCEPT UL(0) 119*76a2904cSSarah Walker #define RSI_REJECT UL(1) 120*76a2904cSSarah Walker 121*76a2904cSSarah Walker enum ripas { 122*76a2904cSSarah Walker RSI_RIPAS_EMPTY = 0, 123*76a2904cSSarah Walker RSI_RIPAS_RAM 124*76a2904cSSarah Walker }; 125*76a2904cSSarah Walker 126*76a2904cSSarah Walker unsigned long rsi_set_addr_range_state(vm_paddr_t start, vm_paddr_t end, 127*76a2904cSSarah Walker enum ripas state, unsigned long flags, vm_paddr_t *top); 128*76a2904cSSarah Walker 129*76a2904cSSarah Walker #endif /* !_MACHINE_RSI_H_ */ 130