xref: /arm-trusted-firmware/services/spd/opteed/teesmc_opteed.h (revision 91f16700b400a8c0651d24a598fc48ee2997a0d7)
1*91f16700Schasinglulu /*
2*91f16700Schasinglulu  * Copyright (c) 2014-2023, ARM Limited and Contributors. All rights reserved.
3*91f16700Schasinglulu  *
4*91f16700Schasinglulu  * SPDX-License-Identifier: BSD-3-Clause
5*91f16700Schasinglulu  */
6*91f16700Schasinglulu 
7*91f16700Schasinglulu /* Copyright (c) 2014, Linaro Limited. All rights reserved. */
8*91f16700Schasinglulu 
9*91f16700Schasinglulu #ifndef TEESMC_OPTEED_H
10*91f16700Schasinglulu #define TEESMC_OPTEED_H
11*91f16700Schasinglulu 
12*91f16700Schasinglulu #include "teesmc_opteed_macros.h"
13*91f16700Schasinglulu 
14*91f16700Schasinglulu /*
15*91f16700Schasinglulu  * This section specifies SMC function IDs used when returning from TEE to the
16*91f16700Schasinglulu  * secure monitor.
17*91f16700Schasinglulu  *
18*91f16700Schasinglulu  * All SMC Function IDs indicates SMC32 Calling Convention but will carry
19*91f16700Schasinglulu  * full 64 bit values in the argument registers if invoked from Aarch64
20*91f16700Schasinglulu  * mode. This violates the SMC Calling Convention, but since this
21*91f16700Schasinglulu  * convention only coveres API towards Normal World it's something that
22*91f16700Schasinglulu  * only concerns the OP-TEE Dispatcher in Trusted Firmware-A and OP-TEE
23*91f16700Schasinglulu  * OS at Secure EL1.
24*91f16700Schasinglulu  */
25*91f16700Schasinglulu 
26*91f16700Schasinglulu /*
27*91f16700Schasinglulu  * Issued when returning from initial entry.
28*91f16700Schasinglulu  *
29*91f16700Schasinglulu  * Register usage:
30*91f16700Schasinglulu  * r0/x0	SMC Function ID, TEESMC_OPTEED_RETURN_ENTRY_DONE
31*91f16700Schasinglulu  * r1/x1	Pointer to entry vector
32*91f16700Schasinglulu  */
33*91f16700Schasinglulu #define TEESMC_OPTEED_FUNCID_RETURN_ENTRY_DONE		0
34*91f16700Schasinglulu #define TEESMC_OPTEED_RETURN_ENTRY_DONE \
35*91f16700Schasinglulu 	TEESMC_OPTEED_RV(TEESMC_OPTEED_FUNCID_RETURN_ENTRY_DONE)
36*91f16700Schasinglulu 
37*91f16700Schasinglulu 
38*91f16700Schasinglulu 
39*91f16700Schasinglulu /*
40*91f16700Schasinglulu  * Issued when returning from "cpu_on" vector
41*91f16700Schasinglulu  *
42*91f16700Schasinglulu  * Register usage:
43*91f16700Schasinglulu  * r0/x0	SMC Function ID, TEESMC_OPTEED_RETURN_ON_DONE
44*91f16700Schasinglulu  * r1/x1	0 on success and anything else to indicate error condition
45*91f16700Schasinglulu  */
46*91f16700Schasinglulu #define TEESMC_OPTEED_FUNCID_RETURN_ON_DONE		1
47*91f16700Schasinglulu #define TEESMC_OPTEED_RETURN_ON_DONE \
48*91f16700Schasinglulu 	TEESMC_OPTEED_RV(TEESMC_OPTEED_FUNCID_RETURN_ON_DONE)
49*91f16700Schasinglulu 
50*91f16700Schasinglulu /*
51*91f16700Schasinglulu  * Issued when returning from "cpu_off" vector
52*91f16700Schasinglulu  *
53*91f16700Schasinglulu  * Register usage:
54*91f16700Schasinglulu  * r0/x0	SMC Function ID, TEESMC_OPTEED_RETURN_OFF_DONE
55*91f16700Schasinglulu  * r1/x1	0 on success and anything else to indicate error condition
56*91f16700Schasinglulu  */
57*91f16700Schasinglulu #define TEESMC_OPTEED_FUNCID_RETURN_OFF_DONE		2
58*91f16700Schasinglulu #define TEESMC_OPTEED_RETURN_OFF_DONE \
59*91f16700Schasinglulu 	TEESMC_OPTEED_RV(TEESMC_OPTEED_FUNCID_RETURN_OFF_DONE)
60*91f16700Schasinglulu 
61*91f16700Schasinglulu /*
62*91f16700Schasinglulu  * Issued when returning from "cpu_suspend" vector
63*91f16700Schasinglulu  *
64*91f16700Schasinglulu  * Register usage:
65*91f16700Schasinglulu  * r0/x0	SMC Function ID, TEESMC_OPTEED_RETURN_SUSPEND_DONE
66*91f16700Schasinglulu  * r1/x1	0 on success and anything else to indicate error condition
67*91f16700Schasinglulu  */
68*91f16700Schasinglulu #define TEESMC_OPTEED_FUNCID_RETURN_SUSPEND_DONE	3
69*91f16700Schasinglulu #define TEESMC_OPTEED_RETURN_SUSPEND_DONE \
70*91f16700Schasinglulu 	TEESMC_OPTEED_RV(TEESMC_OPTEED_FUNCID_RETURN_SUSPEND_DONE)
71*91f16700Schasinglulu 
72*91f16700Schasinglulu /*
73*91f16700Schasinglulu  * Issued when returning from "cpu_resume" vector
74*91f16700Schasinglulu  *
75*91f16700Schasinglulu  * Register usage:
76*91f16700Schasinglulu  * r0/x0	SMC Function ID, TEESMC_OPTEED_RETURN_RESUME_DONE
77*91f16700Schasinglulu  * r1/x1	0 on success and anything else to indicate error condition
78*91f16700Schasinglulu  */
79*91f16700Schasinglulu #define TEESMC_OPTEED_FUNCID_RETURN_RESUME_DONE		4
80*91f16700Schasinglulu #define TEESMC_OPTEED_RETURN_RESUME_DONE \
81*91f16700Schasinglulu 	TEESMC_OPTEED_RV(TEESMC_OPTEED_FUNCID_RETURN_RESUME_DONE)
82*91f16700Schasinglulu 
83*91f16700Schasinglulu /*
84*91f16700Schasinglulu  * Issued when returning from "std_smc" or "fast_smc" vector
85*91f16700Schasinglulu  *
86*91f16700Schasinglulu  * Register usage:
87*91f16700Schasinglulu  * r0/x0	SMC Function ID, TEESMC_OPTEED_RETURN_CALL_DONE
88*91f16700Schasinglulu  * r1-4/x1-4	Return value 0-3 which will passed to normal world in
89*91f16700Schasinglulu  *		r0-3/x0-3
90*91f16700Schasinglulu  */
91*91f16700Schasinglulu #define TEESMC_OPTEED_FUNCID_RETURN_CALL_DONE		5
92*91f16700Schasinglulu #define TEESMC_OPTEED_RETURN_CALL_DONE \
93*91f16700Schasinglulu 	TEESMC_OPTEED_RV(TEESMC_OPTEED_FUNCID_RETURN_CALL_DONE)
94*91f16700Schasinglulu 
95*91f16700Schasinglulu /*
96*91f16700Schasinglulu  * Issued when returning from "fiq" vector
97*91f16700Schasinglulu  *
98*91f16700Schasinglulu  * Register usage:
99*91f16700Schasinglulu  * r0/x0	SMC Function ID, TEESMC_OPTEED_RETURN_FIQ_DONE
100*91f16700Schasinglulu  */
101*91f16700Schasinglulu #define TEESMC_OPTEED_FUNCID_RETURN_FIQ_DONE		6
102*91f16700Schasinglulu #define TEESMC_OPTEED_RETURN_FIQ_DONE \
103*91f16700Schasinglulu 	TEESMC_OPTEED_RV(TEESMC_OPTEED_FUNCID_RETURN_FIQ_DONE)
104*91f16700Schasinglulu 
105*91f16700Schasinglulu /*
106*91f16700Schasinglulu  * Issued when returning from "system_off" vector
107*91f16700Schasinglulu  *
108*91f16700Schasinglulu  * Register usage:
109*91f16700Schasinglulu  * r0/x0	SMC Function ID, TEESMC_OPTEED_RETURN_SYSTEM_OFF_DONE
110*91f16700Schasinglulu  */
111*91f16700Schasinglulu #define TEESMC_OPTEED_FUNCID_RETURN_SYSTEM_OFF_DONE	7
112*91f16700Schasinglulu #define TEESMC_OPTEED_RETURN_SYSTEM_OFF_DONE \
113*91f16700Schasinglulu 	TEESMC_OPTEED_RV(TEESMC_OPTEED_FUNCID_RETURN_SYSTEM_OFF_DONE)
114*91f16700Schasinglulu 
115*91f16700Schasinglulu /*
116*91f16700Schasinglulu  * Issued when returning from "system_reset" vector
117*91f16700Schasinglulu  *
118*91f16700Schasinglulu  * Register usage:
119*91f16700Schasinglulu  * r0/x0	SMC Function ID, TEESMC_OPTEED_RETURN_SYSTEM_RESET_DONE
120*91f16700Schasinglulu  */
121*91f16700Schasinglulu #define TEESMC_OPTEED_FUNCID_RETURN_SYSTEM_RESET_DONE	8
122*91f16700Schasinglulu #define TEESMC_OPTEED_RETURN_SYSTEM_RESET_DONE \
123*91f16700Schasinglulu 	TEESMC_OPTEED_RV(TEESMC_OPTEED_FUNCID_RETURN_SYSTEM_RESET_DONE)
124*91f16700Schasinglulu 
125*91f16700Schasinglulu /*
126*91f16700Schasinglulu  * This section specifies SMC function IDs used when the secure monitor is
127*91f16700Schasinglulu  * invoked from the non-secure world.
128*91f16700Schasinglulu  */
129*91f16700Schasinglulu 
130*91f16700Schasinglulu /*
131*91f16700Schasinglulu  * Load OP-TEE image from the payload specified in the registers.
132*91f16700Schasinglulu  *
133*91f16700Schasinglulu  * WARNING: Use this cautiously as it could lead to insecure loading of the
134*91f16700Schasinglulu  * Trusted OS. Further details are in opteed.mk.
135*91f16700Schasinglulu  *
136*91f16700Schasinglulu  * Call register usage:
137*91f16700Schasinglulu  * x0 SMC Function ID, OPTEE_SMC_CALL_LOAD_IMAGE
138*91f16700Schasinglulu  * x1 Upper 32bit of a 64bit size for the payload
139*91f16700Schasinglulu  * x2 Lower 32bit of a 64bit size for the payload
140*91f16700Schasinglulu  * x3 Upper 32bit of the physical address for the payload
141*91f16700Schasinglulu  * x4 Lower 32bit of the physical address for the payload
142*91f16700Schasinglulu  *
143*91f16700Schasinglulu  * The payload consists of a optee_header struct that contains optee_image
144*91f16700Schasinglulu  * structs in a flex array, immediately following that in memory is the data
145*91f16700Schasinglulu  * referenced by the optee_image structs.
146*91f16700Schasinglulu  * Example:
147*91f16700Schasinglulu  *
148*91f16700Schasinglulu  * struct optee_header (with n images specified)
149*91f16700Schasinglulu  * image 0 data
150*91f16700Schasinglulu  * image 1 data
151*91f16700Schasinglulu  * ...
152*91f16700Schasinglulu  * image n-1 data
153*91f16700Schasinglulu  *
154*91f16700Schasinglulu  * Returns 0 on success and an error code otherwise.
155*91f16700Schasinglulu  */
156*91f16700Schasinglulu #define NSSMC_OPTEED_FUNCID_LOAD_IMAGE 2
157*91f16700Schasinglulu #define NSSMC_OPTEED_CALL_LOAD_IMAGE \
158*91f16700Schasinglulu 	NSSMC_OPTEED_CALL(NSSMC_OPTEED_FUNCID_LOAD_IMAGE)
159*91f16700Schasinglulu 
160*91f16700Schasinglulu /*
161*91f16700Schasinglulu  * Returns the UID of the OP-TEE image loading service if image loading is
162*91f16700Schasinglulu  * enabled and the image had not been loaded yet. Otherwise this call will be
163*91f16700Schasinglulu  * passed through to OP-TEE where it will return the OP-TEE UID.
164*91f16700Schasinglulu  */
165*91f16700Schasinglulu #define NSSMC_OPTEED_FUNCID_CALLS_UID 0xFF01
166*91f16700Schasinglulu #define NSSMC_OPTEED_CALL_UID \
167*91f16700Schasinglulu 	NSSMC_OPTEED_CALL(NSSMC_OPTEED_FUNCID_CALLS_UID)
168*91f16700Schasinglulu 
169*91f16700Schasinglulu #endif /*TEESMC_OPTEED_H*/
170