xref: /rk3399_ARM-atf/services/spd/opteed/teesmc_opteed.h (revision 18459571328c6b09954f4278a86aefc20348f42b)
1aa5da461SJens Wiklander /*
205c69cf7SJeffrey 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 
1205c69cf7SJeffrey Kardatzke #include "teesmc_opteed_macros.h"
1305c69cf7SJeffrey Kardatzke 
14aa5da461SJens Wiklander /*
1505c69cf7SJeffrey 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 
12505c69cf7SJeffrey Kardatzke /*
12605c69cf7SJeffrey Kardatzke  * This section specifies SMC function IDs used when the secure monitor is
12705c69cf7SJeffrey Kardatzke  * invoked from the non-secure world.
12805c69cf7SJeffrey Kardatzke  */
12905c69cf7SJeffrey Kardatzke 
13005c69cf7SJeffrey Kardatzke /*
13105c69cf7SJeffrey Kardatzke  * Load OP-TEE image from the payload specified in the registers.
13205c69cf7SJeffrey Kardatzke  *
13305c69cf7SJeffrey Kardatzke  * WARNING: Use this cautiously as it could lead to insecure loading of the
13405c69cf7SJeffrey Kardatzke  * Trusted OS. Further details are in opteed.mk.
13505c69cf7SJeffrey Kardatzke  *
13605c69cf7SJeffrey Kardatzke  * Call register usage:
13705c69cf7SJeffrey Kardatzke  * x0 SMC Function ID, OPTEE_SMC_CALL_LOAD_IMAGE
13805c69cf7SJeffrey Kardatzke  * x1 Upper 32bit of a 64bit size for the payload
13905c69cf7SJeffrey Kardatzke  * x2 Lower 32bit of a 64bit size for the payload
14005c69cf7SJeffrey Kardatzke  * x3 Upper 32bit of the physical address for the payload
14105c69cf7SJeffrey Kardatzke  * x4 Lower 32bit of the physical address for the payload
14205c69cf7SJeffrey Kardatzke  *
14305c69cf7SJeffrey Kardatzke  * The payload consists of a optee_header struct that contains optee_image
14405c69cf7SJeffrey Kardatzke  * structs in a flex array, immediately following that in memory is the data
14505c69cf7SJeffrey Kardatzke  * referenced by the optee_image structs.
14605c69cf7SJeffrey Kardatzke  * Example:
14705c69cf7SJeffrey Kardatzke  *
14805c69cf7SJeffrey Kardatzke  * struct optee_header (with n images specified)
14905c69cf7SJeffrey Kardatzke  * image 0 data
15005c69cf7SJeffrey Kardatzke  * image 1 data
15105c69cf7SJeffrey Kardatzke  * ...
15205c69cf7SJeffrey Kardatzke  * image n-1 data
15305c69cf7SJeffrey Kardatzke  *
15405c69cf7SJeffrey Kardatzke  * Returns 0 on success and an error code otherwise.
15505c69cf7SJeffrey Kardatzke  */
15605c69cf7SJeffrey Kardatzke #define NSSMC_OPTEED_FUNCID_LOAD_IMAGE 2
15705c69cf7SJeffrey Kardatzke #define NSSMC_OPTEED_CALL_LOAD_IMAGE \
15805c69cf7SJeffrey Kardatzke 	NSSMC_OPTEED_CALL(NSSMC_OPTEED_FUNCID_LOAD_IMAGE)
15905c69cf7SJeffrey Kardatzke 
160*85ab8823SJeffrey Kardatzke /*
161*85ab8823SJeffrey Kardatzke  * Returns the UID of the OP-TEE image loading service if image loading is
162*85ab8823SJeffrey Kardatzke  * enabled and the image had not been loaded yet. Otherwise this call will be
163*85ab8823SJeffrey Kardatzke  * passed through to OP-TEE where it will return the OP-TEE UID.
164*85ab8823SJeffrey Kardatzke  */
165*85ab8823SJeffrey Kardatzke #define NSSMC_OPTEED_FUNCID_CALLS_UID 0xFF01
166*85ab8823SJeffrey Kardatzke #define NSSMC_OPTEED_CALL_UID \
167*85ab8823SJeffrey Kardatzke 	NSSMC_OPTEED_CALL(NSSMC_OPTEED_FUNCID_CALLS_UID)
168*85ab8823SJeffrey Kardatzke 
169aa5da461SJens Wiklander #endif /*TEESMC_OPTEED_H*/
170