1*14c0df4eSMarouene Boubakri // SPDX-License-Identifier: BSD-2-Clause
2*14c0df4eSMarouene Boubakri /*
3*14c0df4eSMarouene Boubakri * Copyright (c) 2016-2020, Linaro Limited
4*14c0df4eSMarouene Boubakri * Copyright (c) 2014, STMicroelectronics International N.V.
5*14c0df4eSMarouene Boubakri */
6*14c0df4eSMarouene Boubakri
7*14c0df4eSMarouene Boubakri #include <compiler.h>
8*14c0df4eSMarouene Boubakri #include <kernel/tee_time.h>
9*14c0df4eSMarouene Boubakri #include <kernel/thread.h>
10*14c0df4eSMarouene Boubakri #include <mm/core_mmu.h>
11*14c0df4eSMarouene Boubakri #include <optee_rpc_cmd.h>
12*14c0df4eSMarouene Boubakri #include <stdlib.h>
13*14c0df4eSMarouene Boubakri
tee_time_wait(uint32_t milliseconds_delay)14*14c0df4eSMarouene Boubakri void tee_time_wait(uint32_t milliseconds_delay)
15*14c0df4eSMarouene Boubakri {
16*14c0df4eSMarouene Boubakri struct thread_param params =
17*14c0df4eSMarouene Boubakri THREAD_PARAM_VALUE(IN, milliseconds_delay, 0, 0);
18*14c0df4eSMarouene Boubakri
19*14c0df4eSMarouene Boubakri thread_rpc_cmd(OPTEE_RPC_CMD_SUSPEND, 1, ¶ms);
20*14c0df4eSMarouene Boubakri }
21*14c0df4eSMarouene Boubakri
22*14c0df4eSMarouene Boubakri /*
23*14c0df4eSMarouene Boubakri * tee_time_get_ree_time(): this function implements the GP Internal API
24*14c0df4eSMarouene Boubakri * function TEE_GetREETime()
25*14c0df4eSMarouene Boubakri * Goal is to get the time of the Rich Execution Environment
26*14c0df4eSMarouene Boubakri * This is why this time is provided through the supplicant
27*14c0df4eSMarouene Boubakri */
tee_time_get_ree_time(TEE_Time * time)28*14c0df4eSMarouene Boubakri TEE_Result tee_time_get_ree_time(TEE_Time *time)
29*14c0df4eSMarouene Boubakri {
30*14c0df4eSMarouene Boubakri struct thread_param params = THREAD_PARAM_VALUE(OUT, 0, 0, 0);
31*14c0df4eSMarouene Boubakri TEE_Result res = TEE_SUCCESS;
32*14c0df4eSMarouene Boubakri
33*14c0df4eSMarouene Boubakri if (!time)
34*14c0df4eSMarouene Boubakri return TEE_ERROR_BAD_PARAMETERS;
35*14c0df4eSMarouene Boubakri
36*14c0df4eSMarouene Boubakri res = thread_rpc_cmd(OPTEE_RPC_CMD_GET_TIME, 1, ¶ms);
37*14c0df4eSMarouene Boubakri if (res == TEE_SUCCESS) {
38*14c0df4eSMarouene Boubakri time->seconds = params.u.value.a;
39*14c0df4eSMarouene Boubakri time->millis = params.u.value.b / 1000000;
40*14c0df4eSMarouene Boubakri }
41*14c0df4eSMarouene Boubakri
42*14c0df4eSMarouene Boubakri return res;
43*14c0df4eSMarouene Boubakri }
44