11bb92983SJerome Forissier // SPDX-License-Identifier: BSD-2-Clause
25c781c55SJens Wiklander /*
3a94111b9SJens Wiklander * Copyright (c) 2015-2021, Linaro Limited
45c781c55SJens Wiklander * Copyright (c) 2014, STMicroelectronics International N.V.
55c781c55SJens Wiklander */
65c781c55SJens Wiklander
7a94111b9SJens Wiklander #include <config.h>
87d3ac186SLionel Debieve #include <drivers/wdt.h>
965401337SJens Wiklander #include <kernel/boot.h>
10c2d44948SJens Wiklander #include <kernel/notif.h>
115c781c55SJens Wiklander #include <kernel/tee_l2cc_mutex.h>
1234c1c806SVolodymyr Babchuk #include <kernel/virtualization.h>
135c781c55SJens Wiklander #include <mm/core_mmu.h>
14a94111b9SJens Wiklander #include <optee_msg.h>
15a94111b9SJens Wiklander #include <sm/optee_smc.h>
16a94111b9SJens Wiklander #include <tee/entry_fast.h>
175c781c55SJens Wiklander
188aeb6c94SJens Wiklander #ifdef CFG_CORE_RESERVED_SHM
tee_entry_get_shm_config(struct thread_smc_args * args)195c781c55SJens Wiklander static void tee_entry_get_shm_config(struct thread_smc_args *args)
205c781c55SJens Wiklander {
21e43888b8SJens Wiklander args->a0 = OPTEE_SMC_RETURN_OK;
225c781c55SJens Wiklander args->a1 = default_nsec_shm_paddr;
235c781c55SJens Wiklander args->a2 = default_nsec_shm_size;
245c781c55SJens Wiklander /* Should this be TEESMC cache attributes instead? */
255c781c55SJens Wiklander args->a3 = core_mmu_is_shm_cached();
265c781c55SJens Wiklander }
278aeb6c94SJens Wiklander #endif
285c781c55SJens Wiklander
29*00338334SJens Wiklander #if defined(CFG_SECURE_DATA_PATH) && !defined(CFG_CORE_DYN_PROTMEM)
tee_entry_get_protmem_config(struct thread_smc_args * args)3089f492f5SJens Wiklander static void tee_entry_get_protmem_config(struct thread_smc_args *args)
3189f492f5SJens Wiklander {
3289f492f5SJens Wiklander #if defined(CFG_TEE_SDP_MEM_BASE)
3389f492f5SJens Wiklander args->a0 = OPTEE_SMC_RETURN_OK;
3489f492f5SJens Wiklander args->a1 = CFG_TEE_SDP_MEM_BASE;
3589f492f5SJens Wiklander args->a2 = CFG_TEE_SDP_MEM_SIZE;
3689f492f5SJens Wiklander #elif defined(TEE_SDP_TEST_MEM_BASE)
3789f492f5SJens Wiklander args->a0 = OPTEE_SMC_RETURN_OK;
3889f492f5SJens Wiklander args->a1 = TEE_SDP_TEST_MEM_BASE;
3989f492f5SJens Wiklander args->a2 = TEE_SDP_TEST_MEM_SIZE;
4089f492f5SJens Wiklander #else
4189f492f5SJens Wiklander args->a0 = OPTEE_SMC_RETURN_ENOTAVAIL;
4289f492f5SJens Wiklander args->a1 = 0;
4389f492f5SJens Wiklander args->a2 = 0;
4489f492f5SJens Wiklander #endif
4589f492f5SJens Wiklander args->a3 = sizeof(long) * 8;
4689f492f5SJens Wiklander }
4789f492f5SJens Wiklander #endif
4889f492f5SJens Wiklander
tee_entry_fastcall_l2cc_mutex(struct thread_smc_args * args)495c781c55SJens Wiklander static void tee_entry_fastcall_l2cc_mutex(struct thread_smc_args *args)
505c781c55SJens Wiklander {
515c781c55SJens Wiklander #ifdef ARM32
52b51aaa62SClement Faure TEE_Result ret = TEE_ERROR_NOT_SUPPORTED;
53e43888b8SJens Wiklander paddr_t pa = 0;
54e43888b8SJens Wiklander
555c781c55SJens Wiklander switch (args->a1) {
56e43888b8SJens Wiklander case OPTEE_SMC_L2CC_MUTEX_GET_ADDR:
57e43888b8SJens Wiklander ret = tee_get_l2cc_mutex(&pa);
58e43888b8SJens Wiklander reg_pair_from_64(pa, &args->a2, &args->a3);
595c781c55SJens Wiklander break;
60e43888b8SJens Wiklander case OPTEE_SMC_L2CC_MUTEX_SET_ADDR:
61e43888b8SJens Wiklander pa = reg_pair_to_64(args->a2, args->a3);
62e43888b8SJens Wiklander ret = tee_set_l2cc_mutex(&pa);
635c781c55SJens Wiklander break;
64e43888b8SJens Wiklander case OPTEE_SMC_L2CC_MUTEX_ENABLE:
655c781c55SJens Wiklander ret = tee_enable_l2cc_mutex();
665c781c55SJens Wiklander break;
67e43888b8SJens Wiklander case OPTEE_SMC_L2CC_MUTEX_DISABLE:
685c781c55SJens Wiklander ret = tee_disable_l2cc_mutex();
695c781c55SJens Wiklander break;
705c781c55SJens Wiklander default:
71e43888b8SJens Wiklander args->a0 = OPTEE_SMC_RETURN_EBADCMD;
725c781c55SJens Wiklander return;
735c781c55SJens Wiklander }
74b51aaa62SClement Faure
755c781c55SJens Wiklander if (ret == TEE_ERROR_NOT_SUPPORTED)
76e43888b8SJens Wiklander args->a0 = OPTEE_SMC_RETURN_UNKNOWN_FUNCTION;
775c781c55SJens Wiklander else if (ret)
78e43888b8SJens Wiklander args->a0 = OPTEE_SMC_RETURN_EBADADDR;
795c781c55SJens Wiklander else
80e43888b8SJens Wiklander args->a0 = OPTEE_SMC_RETURN_OK;
81b51aaa62SClement Faure #else
82b51aaa62SClement Faure args->a0 = OPTEE_SMC_RETURN_UNKNOWN_FUNCTION;
83b51aaa62SClement Faure #endif
84e43888b8SJens Wiklander }
85e43888b8SJens Wiklander
tee_entry_exchange_capabilities(struct thread_smc_args * args)86e43888b8SJens Wiklander static void tee_entry_exchange_capabilities(struct thread_smc_args *args)
87e43888b8SJens Wiklander {
88d8f7685aSJerome Forissier bool res_shm_en = IS_ENABLED(CFG_CORE_RESERVED_SHM);
89b8889ee9SJerome Forissier bool dyn_shm_en __maybe_unused = false;
9055d6853cSVolodymyr Babchuk
91e43888b8SJens Wiklander /*
928d22aebbSJens Wiklander * Currently we ignore OPTEE_SMC_NSEC_CAP_UNIPROCESSOR.
93e43888b8SJens Wiklander *
94e43888b8SJens Wiklander * The memory mapping of shared memory is defined as normal
95e43888b8SJens Wiklander * shared memory for SMP systems and normal memory for UP
96e43888b8SJens Wiklander * systems. Currently we map all memory as shared in secure
97e43888b8SJens Wiklander * world.
988d22aebbSJens Wiklander *
998d22aebbSJens Wiklander * When translation tables are created with shared bit cleared for
1008d22aebbSJens Wiklander * uniprocessor systems we'll need to check
1018d22aebbSJens Wiklander * OPTEE_SMC_NSEC_CAP_UNIPROCESSOR.
102e43888b8SJens Wiklander */
1038d22aebbSJens Wiklander
1048d22aebbSJens Wiklander if (args->a1 & ~OPTEE_SMC_NSEC_CAP_UNIPROCESSOR) {
1058d22aebbSJens Wiklander /* Unknown capability. */
106e43888b8SJens Wiklander args->a0 = OPTEE_SMC_RETURN_ENOTAVAIL;
107e43888b8SJens Wiklander return;
108e43888b8SJens Wiklander }
109e43888b8SJens Wiklander
110e43888b8SJens Wiklander args->a0 = OPTEE_SMC_RETURN_OK;
1118aeb6c94SJens Wiklander args->a1 = 0;
112d8f7685aSJerome Forissier
113d8f7685aSJerome Forissier if (res_shm_en)
1148aeb6c94SJens Wiklander args->a1 |= OPTEE_SMC_SEC_CAP_HAVE_RESERVED_SHM;
115d8f7685aSJerome Forissier IMSG("Reserved shared memory is %sabled", res_shm_en ? "en" : "dis");
11655d6853cSVolodymyr Babchuk
1175c151b7eSJens Wiklander #if defined(CFG_CORE_DYN_SHM)
11855d6853cSVolodymyr Babchuk dyn_shm_en = core_mmu_nsec_ddr_is_defined();
11955d6853cSVolodymyr Babchuk if (dyn_shm_en)
12055d6853cSVolodymyr Babchuk args->a1 |= OPTEE_SMC_SEC_CAP_DYNAMIC_SHM;
121d81f93a7SVolodymyr Babchuk #endif
122d8f7685aSJerome Forissier IMSG("Dynamic shared memory is %sabled", dyn_shm_en ? "en" : "dis");
12355d6853cSVolodymyr Babchuk
124b76b2296SJerome Forissier if (IS_ENABLED(CFG_NS_VIRTUALIZATION))
125d8f7685aSJerome Forissier args->a1 |= OPTEE_SMC_SEC_CAP_VIRTUALIZATION;
126d8f7685aSJerome Forissier IMSG("Normal World virtualization support is %sabled",
127b76b2296SJerome Forissier IS_ENABLED(CFG_NS_VIRTUALIZATION) ? "en" : "dis");
128d8f7685aSJerome Forissier
129d8f7685aSJerome Forissier args->a1 |= OPTEE_SMC_SEC_CAP_MEMREF_NULL;
130d8f7685aSJerome Forissier
131d8f7685aSJerome Forissier if (IS_ENABLED(CFG_CORE_ASYNC_NOTIF)) {
132d8f7685aSJerome Forissier args->a1 |= OPTEE_SMC_SEC_CAP_ASYNC_NOTIF;
133d8f7685aSJerome Forissier args->a2 = NOTIF_VALUE_MAX;
134d8f7685aSJerome Forissier }
135d8f7685aSJerome Forissier IMSG("Asynchronous notifications are %sabled",
136d8f7685aSJerome Forissier IS_ENABLED(CFG_CORE_ASYNC_NOTIF) ? "en" : "dis");
137feb290a5SJens Wiklander
138*00338334SJens Wiklander if (IS_ENABLED(CFG_SECURE_DATA_PATH)) {
139*00338334SJens Wiklander if (IS_ENABLED(CFG_CORE_DYN_PROTMEM))
140*00338334SJens Wiklander args->a1 |= OPTEE_SMC_SEC_CAP_DYNAMIC_PROTMEM;
141*00338334SJens Wiklander else
14289f492f5SJens Wiklander args->a1 |= OPTEE_SMC_SEC_CAP_PROTMEM;
143*00338334SJens Wiklander }
14489f492f5SJens Wiklander
145feb290a5SJens Wiklander args->a1 |= OPTEE_SMC_SEC_CAP_RPC_ARG;
146feb290a5SJens Wiklander args->a3 = THREAD_RPC_MAX_NUM_PARAMS;
1478dfdf392SJens Wiklander
148b78dd3f2SJens Wiklander if (IS_ENABLED(CFG_RPMB_ANNOUNCE_PROBE_CAP))
1498dfdf392SJens Wiklander args->a1 |= OPTEE_SMC_SEC_CAP_RPMB_PROBE;
150e43888b8SJens Wiklander }
151e43888b8SJens Wiklander
tee_entry_disable_shm_cache(struct thread_smc_args * args)152e43888b8SJens Wiklander static void tee_entry_disable_shm_cache(struct thread_smc_args *args)
153e43888b8SJens Wiklander {
154e43888b8SJens Wiklander uint64_t cookie;
155e43888b8SJens Wiklander
156e43888b8SJens Wiklander if (!thread_disable_prealloc_rpc_cache(&cookie)) {
157e43888b8SJens Wiklander args->a0 = OPTEE_SMC_RETURN_EBUSY;
158e43888b8SJens Wiklander return;
159e43888b8SJens Wiklander }
160e43888b8SJens Wiklander
161e43888b8SJens Wiklander if (!cookie) {
162e43888b8SJens Wiklander args->a0 = OPTEE_SMC_RETURN_ENOTAVAIL;
163e43888b8SJens Wiklander return;
164e43888b8SJens Wiklander }
165e43888b8SJens Wiklander
166e43888b8SJens Wiklander args->a0 = OPTEE_SMC_RETURN_OK;
167e43888b8SJens Wiklander args->a1 = cookie >> 32;
168e43888b8SJens Wiklander args->a2 = cookie;
169e43888b8SJens Wiklander }
170e43888b8SJens Wiklander
tee_entry_enable_shm_cache(struct thread_smc_args * args)171e43888b8SJens Wiklander static void tee_entry_enable_shm_cache(struct thread_smc_args *args)
172e43888b8SJens Wiklander {
173e43888b8SJens Wiklander if (thread_enable_prealloc_rpc_cache())
174e43888b8SJens Wiklander args->a0 = OPTEE_SMC_RETURN_OK;
175e43888b8SJens Wiklander else
176e43888b8SJens Wiklander args->a0 = OPTEE_SMC_RETURN_EBUSY;
1775c781c55SJens Wiklander }
1785c781c55SJens Wiklander
tee_entry_boot_secondary(struct thread_smc_args * args)179cee96842Syanyan-wrs static void tee_entry_boot_secondary(struct thread_smc_args *args)
180cee96842Syanyan-wrs {
181cee96842Syanyan-wrs #if defined(CFG_BOOT_SECONDARY_REQUEST)
18265401337SJens Wiklander if (!boot_core_release(args->a1, (paddr_t)(args->a3)))
183cee96842Syanyan-wrs args->a0 = OPTEE_SMC_RETURN_OK;
184cee96842Syanyan-wrs else
185cee96842Syanyan-wrs args->a0 = OPTEE_SMC_RETURN_EBADCMD;
186cee96842Syanyan-wrs #else
187cee96842Syanyan-wrs args->a0 = OPTEE_SMC_RETURN_ENOTAVAIL;
188cee96842Syanyan-wrs #endif
189cee96842Syanyan-wrs }
190cee96842Syanyan-wrs
tee_entry_get_thread_count(struct thread_smc_args * args)19127b5e34bSVolodymyr Babchuk static void tee_entry_get_thread_count(struct thread_smc_args *args)
19227b5e34bSVolodymyr Babchuk {
19327b5e34bSVolodymyr Babchuk args->a0 = OPTEE_SMC_RETURN_OK;
19427b5e34bSVolodymyr Babchuk args->a1 = CFG_NUM_THREADS;
19527b5e34bSVolodymyr Babchuk }
19627b5e34bSVolodymyr Babchuk
197b76b2296SJerome Forissier #if defined(CFG_NS_VIRTUALIZATION)
tee_entry_vm_created(struct thread_smc_args * args)19834c1c806SVolodymyr Babchuk static void tee_entry_vm_created(struct thread_smc_args *args)
19934c1c806SVolodymyr Babchuk {
20034c1c806SVolodymyr Babchuk uint16_t guest_id = args->a1;
20134c1c806SVolodymyr Babchuk
20234c1c806SVolodymyr Babchuk /* Only hypervisor can issue this request */
20334c1c806SVolodymyr Babchuk if (args->a7 != HYP_CLNT_ID) {
20434c1c806SVolodymyr Babchuk args->a0 = OPTEE_SMC_RETURN_ENOTAVAIL;
20534c1c806SVolodymyr Babchuk return;
20634c1c806SVolodymyr Babchuk }
20734c1c806SVolodymyr Babchuk
208bddb2f89SJens Wiklander if (virt_guest_created(guest_id))
209bddb2f89SJens Wiklander args->a0 = OPTEE_SMC_RETURN_ENOTAVAIL;
210bddb2f89SJens Wiklander else
211bddb2f89SJens Wiklander args->a0 = OPTEE_SMC_RETURN_OK;
21234c1c806SVolodymyr Babchuk }
21334c1c806SVolodymyr Babchuk
tee_entry_vm_destroyed(struct thread_smc_args * args)21434c1c806SVolodymyr Babchuk static void tee_entry_vm_destroyed(struct thread_smc_args *args)
21534c1c806SVolodymyr Babchuk {
21634c1c806SVolodymyr Babchuk uint16_t guest_id = args->a1;
21734c1c806SVolodymyr Babchuk
21834c1c806SVolodymyr Babchuk /* Only hypervisor can issue this request */
21934c1c806SVolodymyr Babchuk if (args->a7 != HYP_CLNT_ID) {
22034c1c806SVolodymyr Babchuk args->a0 = OPTEE_SMC_RETURN_ENOTAVAIL;
22134c1c806SVolodymyr Babchuk return;
22234c1c806SVolodymyr Babchuk }
22334c1c806SVolodymyr Babchuk
224bddb2f89SJens Wiklander if (virt_guest_destroyed(guest_id))
225bddb2f89SJens Wiklander args->a0 = OPTEE_SMC_RETURN_ENOTAVAIL;
226bddb2f89SJens Wiklander else
227bddb2f89SJens Wiklander args->a0 = OPTEE_SMC_RETURN_OK;
22834c1c806SVolodymyr Babchuk }
22934c1c806SVolodymyr Babchuk #endif
23034c1c806SVolodymyr Babchuk
231612791d0SJens Wiklander /* Note: this function is weak to let platforms add special handling */
tee_entry_fast(struct thread_smc_args * args)232612791d0SJens Wiklander void __weak tee_entry_fast(struct thread_smc_args *args)
233612791d0SJens Wiklander {
234612791d0SJens Wiklander __tee_entry_fast(args);
235612791d0SJens Wiklander }
236612791d0SJens Wiklander
get_async_notif_value(struct thread_smc_args * args)237c2d44948SJens Wiklander static void get_async_notif_value(struct thread_smc_args *args)
238c2d44948SJens Wiklander {
239c2d44948SJens Wiklander bool value_valid = false;
240c2d44948SJens Wiklander bool value_pending = false;
241c2d44948SJens Wiklander
242c2d44948SJens Wiklander args->a0 = OPTEE_SMC_RETURN_OK;
243c2d44948SJens Wiklander args->a1 = notif_get_value(&value_valid, &value_pending);
244c2d44948SJens Wiklander args->a2 = 0;
245c2d44948SJens Wiklander if (value_valid)
246c2d44948SJens Wiklander args->a2 |= OPTEE_SMC_ASYNC_NOTIF_VALID;
247c2d44948SJens Wiklander if (value_pending)
248c2d44948SJens Wiklander args->a2 |= OPTEE_SMC_ASYNC_NOTIF_PENDING;
249c2d44948SJens Wiklander }
250c2d44948SJens Wiklander
tee_entry_watchdog(struct thread_smc_args * args)2517d3ac186SLionel Debieve static void tee_entry_watchdog(struct thread_smc_args *args)
2527d3ac186SLionel Debieve {
2537d3ac186SLionel Debieve #if defined(CFG_WDT_SM_HANDLER)
2547d3ac186SLionel Debieve __wdt_sm_handler(args);
2557d3ac186SLionel Debieve #else
2567d3ac186SLionel Debieve args->a0 = OPTEE_SMC_RETURN_UNKNOWN_FUNCTION;
2577d3ac186SLionel Debieve #endif
2587d3ac186SLionel Debieve }
2597d3ac186SLionel Debieve
260612791d0SJens Wiklander /*
261612791d0SJens Wiklander * If tee_entry_fast() is overridden, it's still supposed to call this
262612791d0SJens Wiklander * function.
263612791d0SJens Wiklander */
__tee_entry_fast(struct thread_smc_args * args)264612791d0SJens Wiklander void __tee_entry_fast(struct thread_smc_args *args)
2655c781c55SJens Wiklander {
2665c781c55SJens Wiklander switch (args->a0) {
2675c781c55SJens Wiklander
2685c781c55SJens Wiklander /* Generic functions */
269e43888b8SJens Wiklander case OPTEE_SMC_CALLS_COUNT:
2705c781c55SJens Wiklander tee_entry_get_api_call_count(args);
2715c781c55SJens Wiklander break;
272e43888b8SJens Wiklander case OPTEE_SMC_CALLS_UID:
2735c781c55SJens Wiklander tee_entry_get_api_uuid(args);
2745c781c55SJens Wiklander break;
275e43888b8SJens Wiklander case OPTEE_SMC_CALLS_REVISION:
2765c781c55SJens Wiklander tee_entry_get_api_revision(args);
2775c781c55SJens Wiklander break;
278e43888b8SJens Wiklander case OPTEE_SMC_CALL_GET_OS_UUID:
2795c781c55SJens Wiklander tee_entry_get_os_uuid(args);
2805c781c55SJens Wiklander break;
281e43888b8SJens Wiklander case OPTEE_SMC_CALL_GET_OS_REVISION:
2825c781c55SJens Wiklander tee_entry_get_os_revision(args);
2835c781c55SJens Wiklander break;
2845c781c55SJens Wiklander
2855c781c55SJens Wiklander /* OP-TEE specific SMC functions */
2868aeb6c94SJens Wiklander #ifdef CFG_CORE_RESERVED_SHM
287e43888b8SJens Wiklander case OPTEE_SMC_GET_SHM_CONFIG:
2885c781c55SJens Wiklander tee_entry_get_shm_config(args);
2895c781c55SJens Wiklander break;
2908aeb6c94SJens Wiklander #endif
291*00338334SJens Wiklander #if defined(CFG_SECURE_DATA_PATH) && !defined(CFG_CORE_DYN_PROTMEM)
29289f492f5SJens Wiklander case OPTEE_SMC_GET_PROTMEM_CONFIG:
29389f492f5SJens Wiklander tee_entry_get_protmem_config(args);
29489f492f5SJens Wiklander break;
29589f492f5SJens Wiklander #endif
296e43888b8SJens Wiklander case OPTEE_SMC_L2CC_MUTEX:
2975c781c55SJens Wiklander tee_entry_fastcall_l2cc_mutex(args);
2985c781c55SJens Wiklander break;
299e43888b8SJens Wiklander case OPTEE_SMC_EXCHANGE_CAPABILITIES:
300e43888b8SJens Wiklander tee_entry_exchange_capabilities(args);
301e43888b8SJens Wiklander break;
302e43888b8SJens Wiklander case OPTEE_SMC_DISABLE_SHM_CACHE:
303e43888b8SJens Wiklander tee_entry_disable_shm_cache(args);
304e43888b8SJens Wiklander break;
305e43888b8SJens Wiklander case OPTEE_SMC_ENABLE_SHM_CACHE:
306e43888b8SJens Wiklander tee_entry_enable_shm_cache(args);
307e43888b8SJens Wiklander break;
308cee96842Syanyan-wrs case OPTEE_SMC_BOOT_SECONDARY:
309cee96842Syanyan-wrs tee_entry_boot_secondary(args);
310cee96842Syanyan-wrs break;
31127b5e34bSVolodymyr Babchuk case OPTEE_SMC_GET_THREAD_COUNT:
31227b5e34bSVolodymyr Babchuk tee_entry_get_thread_count(args);
31327b5e34bSVolodymyr Babchuk break;
314e43888b8SJens Wiklander
315b76b2296SJerome Forissier #if defined(CFG_NS_VIRTUALIZATION)
31634c1c806SVolodymyr Babchuk case OPTEE_SMC_VM_CREATED:
31734c1c806SVolodymyr Babchuk tee_entry_vm_created(args);
31834c1c806SVolodymyr Babchuk break;
31934c1c806SVolodymyr Babchuk case OPTEE_SMC_VM_DESTROYED:
32034c1c806SVolodymyr Babchuk tee_entry_vm_destroyed(args);
32134c1c806SVolodymyr Babchuk break;
32234c1c806SVolodymyr Babchuk #endif
32334c1c806SVolodymyr Babchuk
324c2d44948SJens Wiklander case OPTEE_SMC_ENABLE_ASYNC_NOTIF:
325c2d44948SJens Wiklander if (IS_ENABLED(CFG_CORE_ASYNC_NOTIF)) {
3263399e5c1SYuvraj Sakshith uint16_t g_id = 0;
3273399e5c1SYuvraj Sakshith
3283399e5c1SYuvraj Sakshith if (IS_ENABLED(CFG_NS_VIRTUALIZATION))
3293399e5c1SYuvraj Sakshith g_id = args->a7;
3303399e5c1SYuvraj Sakshith
3313399e5c1SYuvraj Sakshith notif_deliver_atomic_event(NOTIF_EVENT_STARTED, g_id);
3323399e5c1SYuvraj Sakshith
333c2d44948SJens Wiklander args->a0 = OPTEE_SMC_RETURN_OK;
334c2d44948SJens Wiklander } else {
335c2d44948SJens Wiklander args->a0 = OPTEE_SMC_RETURN_UNKNOWN_FUNCTION;
336c2d44948SJens Wiklander }
337c2d44948SJens Wiklander break;
338c2d44948SJens Wiklander case OPTEE_SMC_GET_ASYNC_NOTIF_VALUE:
339c2d44948SJens Wiklander if (IS_ENABLED(CFG_CORE_ASYNC_NOTIF))
340c2d44948SJens Wiklander get_async_notif_value(args);
341c2d44948SJens Wiklander else
342c2d44948SJens Wiklander args->a0 = OPTEE_SMC_RETURN_UNKNOWN_FUNCTION;
343c2d44948SJens Wiklander break;
344c2d44948SJens Wiklander
3457d3ac186SLionel Debieve /* Watchdog entry if handler ID is defined in TOS range */
3467d3ac186SLionel Debieve case CFG_WDT_SM_HANDLER_ID:
3477d3ac186SLionel Debieve tee_entry_watchdog(args);
3487d3ac186SLionel Debieve break;
3497d3ac186SLionel Debieve
3505c781c55SJens Wiklander default:
351e43888b8SJens Wiklander args->a0 = OPTEE_SMC_RETURN_UNKNOWN_FUNCTION;
3525c781c55SJens Wiklander break;
3535c781c55SJens Wiklander }
3545c781c55SJens Wiklander }
3555c781c55SJens Wiklander
tee_entry_generic_get_api_call_count(void)3565c781c55SJens Wiklander size_t tee_entry_generic_get_api_call_count(void)
3575c781c55SJens Wiklander {
3585c781c55SJens Wiklander /*
3595c781c55SJens Wiklander * All the different calls handled in this file. If the specific
3605c781c55SJens Wiklander * target has additional calls it will call this function and
3615c781c55SJens Wiklander * add the number of calls the target has added.
3625c781c55SJens Wiklander */
36327b5e34bSVolodymyr Babchuk size_t ret = 12;
36434c1c806SVolodymyr Babchuk
365b76b2296SJerome Forissier if (IS_ENABLED(CFG_NS_VIRTUALIZATION))
36634c1c806SVolodymyr Babchuk ret += 2;
36734c1c806SVolodymyr Babchuk
36834c1c806SVolodymyr Babchuk return ret;
3695c781c55SJens Wiklander }
3705c781c55SJens Wiklander
tee_entry_get_api_call_count(struct thread_smc_args * args)3715c781c55SJens Wiklander void __weak tee_entry_get_api_call_count(struct thread_smc_args *args)
3725c781c55SJens Wiklander {
3735c781c55SJens Wiklander args->a0 = tee_entry_generic_get_api_call_count();
3745c781c55SJens Wiklander }
3755c781c55SJens Wiklander
tee_entry_get_api_uuid(struct thread_smc_args * args)3765c781c55SJens Wiklander void __weak tee_entry_get_api_uuid(struct thread_smc_args *args)
3775c781c55SJens Wiklander {
378e43888b8SJens Wiklander args->a0 = OPTEE_MSG_UID_0;
379e43888b8SJens Wiklander args->a1 = OPTEE_MSG_UID_1;
380e43888b8SJens Wiklander args->a2 = OPTEE_MSG_UID_2;
381e43888b8SJens Wiklander args->a3 = OPTEE_MSG_UID_3;
3825c781c55SJens Wiklander }
3835c781c55SJens Wiklander
tee_entry_get_api_revision(struct thread_smc_args * args)3845c781c55SJens Wiklander void __weak tee_entry_get_api_revision(struct thread_smc_args *args)
3855c781c55SJens Wiklander {
386e43888b8SJens Wiklander args->a0 = OPTEE_MSG_REVISION_MAJOR;
387e43888b8SJens Wiklander args->a1 = OPTEE_MSG_REVISION_MINOR;
3885c781c55SJens Wiklander }
3895c781c55SJens Wiklander
tee_entry_get_os_uuid(struct thread_smc_args * args)3905c781c55SJens Wiklander void __weak tee_entry_get_os_uuid(struct thread_smc_args *args)
3915c781c55SJens Wiklander {
392e43888b8SJens Wiklander args->a0 = OPTEE_MSG_OS_OPTEE_UUID_0;
393e43888b8SJens Wiklander args->a1 = OPTEE_MSG_OS_OPTEE_UUID_1;
394e43888b8SJens Wiklander args->a2 = OPTEE_MSG_OS_OPTEE_UUID_2;
395e43888b8SJens Wiklander args->a3 = OPTEE_MSG_OS_OPTEE_UUID_3;
3965c781c55SJens Wiklander }
3975c781c55SJens Wiklander
tee_entry_get_os_revision(struct thread_smc_args * args)3985c781c55SJens Wiklander void __weak tee_entry_get_os_revision(struct thread_smc_args *args)
3995c781c55SJens Wiklander {
400e43888b8SJens Wiklander args->a0 = CFG_OPTEE_REVISION_MAJOR;
401e43888b8SJens Wiklander args->a1 = CFG_OPTEE_REVISION_MINOR;
40229cff5cfSJerome Forissier args->a2 = TEE_IMPL_GIT_SHA1;
4035c781c55SJens Wiklander }
404