xref: /freebsd/sys/arm64/include/rsi.h (revision 76a2904c352b497b32fc902523e3e485f7b06ffd)
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