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