1 // © 2021 Qualcomm Innovation Center, Inc. All rights reserved.
2 //
3 // SPDX-License-Identifier: BSD-3-Clause
4
5 static inline psci_ret_t
psci_smc_fn_call(psci_function_t fn,register_t arg_0,register_t arg_1,register_t arg_2)6 psci_smc_fn_call(psci_function_t fn, register_t arg_0, register_t arg_1,
7 register_t arg_2)
8 {
9 smccc_function_id_t fn_id = smccc_function_id_default();
10 smccc_function_id_set_is_fast(&fn_id, true);
11 smccc_function_id_set_is_smc64(&fn_id, true);
12 smccc_function_id_set_owner_id(&fn_id, SMCCC_OWNER_ID_STANDARD);
13 smccc_function_id_set_function(&fn_id, (smccc_function_t)fn);
14
15 uint64_t hyp_args[6] = { arg_0, arg_1, arg_2, 0, 0, 0 };
16 uint64_t hyp_ret[4] = { 0 };
17
18 smccc_1_1_call(fn_id, &hyp_args, &hyp_ret, NULL, CLIENT_ID_HYP);
19
20 return (psci_ret_t)hyp_ret[0];
21 }
22
23 static inline psci_ret_t
psci_smc_fn_call32(psci_function_t fn,uint32_t arg_0,uint32_t arg_1,uint32_t arg_2)24 psci_smc_fn_call32(psci_function_t fn, uint32_t arg_0, uint32_t arg_1,
25 uint32_t arg_2)
26 {
27 smccc_function_id_t fn_id = smccc_function_id_default();
28 smccc_function_id_set_is_fast(&fn_id, true);
29 smccc_function_id_set_is_smc64(&fn_id, false);
30 smccc_function_id_set_owner_id(&fn_id, SMCCC_OWNER_ID_STANDARD);
31 smccc_function_id_set_function(&fn_id, (smccc_function_t)fn);
32
33 uint64_t hyp_args[6] = { arg_0, arg_1, arg_2, 0, 0, 0 };
34 uint64_t hyp_ret[4] = { 0 };
35
36 smccc_1_1_call(fn_id, &hyp_args, &hyp_ret, NULL, CLIENT_ID_HYP);
37
38 return (psci_ret_t)hyp_ret[0];
39 }
40
41 static inline register_t
psci_smc_fn_call_reg(psci_function_t fn,register_t arg_0,register_t arg_1,register_t arg_2)42 psci_smc_fn_call_reg(psci_function_t fn, register_t arg_0, register_t arg_1,
43 register_t arg_2)
44 {
45 smccc_function_id_t fn_id = smccc_function_id_default();
46 smccc_function_id_set_is_fast(&fn_id, true);
47 smccc_function_id_set_is_smc64(&fn_id, true);
48 smccc_function_id_set_owner_id(&fn_id, SMCCC_OWNER_ID_STANDARD);
49 smccc_function_id_set_function(&fn_id, (smccc_function_t)fn);
50
51 uint64_t hyp_args[6] = { arg_0, arg_1, arg_2, 0, 0, 0 };
52 uint64_t hyp_ret[4] = { 0 };
53
54 smccc_1_1_call(fn_id, &hyp_args, &hyp_ret, NULL, CLIENT_ID_HYP);
55
56 return hyp_ret[0];
57 }
58