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