xref: /openbmc/linux/drivers/firmware/arm_ffa/smccc.c (revision 762f99f4f3cb41a775b5157dd761217beba65873)
1*714be77eSSudeep Holla // SPDX-License-Identifier: GPL-2.0-only
2*714be77eSSudeep Holla /*
3*714be77eSSudeep Holla  * Copyright (C) 2021 ARM Ltd.
4*714be77eSSudeep Holla  */
5*714be77eSSudeep Holla 
6*714be77eSSudeep Holla #include <linux/printk.h>
7*714be77eSSudeep Holla 
8*714be77eSSudeep Holla #include "common.h"
9*714be77eSSudeep Holla 
__arm_ffa_fn_smc(ffa_value_t args,ffa_value_t * res)10*714be77eSSudeep Holla static void __arm_ffa_fn_smc(ffa_value_t args, ffa_value_t *res)
11*714be77eSSudeep Holla {
12*714be77eSSudeep Holla 	arm_smccc_1_2_smc(&args, res);
13*714be77eSSudeep Holla }
14*714be77eSSudeep Holla 
__arm_ffa_fn_hvc(ffa_value_t args,ffa_value_t * res)15*714be77eSSudeep Holla static void __arm_ffa_fn_hvc(ffa_value_t args, ffa_value_t *res)
16*714be77eSSudeep Holla {
17*714be77eSSudeep Holla 	arm_smccc_1_2_hvc(&args, res);
18*714be77eSSudeep Holla }
19*714be77eSSudeep Holla 
ffa_transport_init(ffa_fn ** invoke_ffa_fn)20*714be77eSSudeep Holla int __init ffa_transport_init(ffa_fn **invoke_ffa_fn)
21*714be77eSSudeep Holla {
22*714be77eSSudeep Holla 	enum arm_smccc_conduit conduit;
23*714be77eSSudeep Holla 
24*714be77eSSudeep Holla 	if (arm_smccc_get_version() < ARM_SMCCC_VERSION_1_2)
25*714be77eSSudeep Holla 		return -EOPNOTSUPP;
26*714be77eSSudeep Holla 
27*714be77eSSudeep Holla 	conduit = arm_smccc_1_1_get_conduit();
28*714be77eSSudeep Holla 	if (conduit == SMCCC_CONDUIT_NONE) {
29*714be77eSSudeep Holla 		pr_err("%s: invalid SMCCC conduit\n", __func__);
30*714be77eSSudeep Holla 		return -EOPNOTSUPP;
31*714be77eSSudeep Holla 	}
32*714be77eSSudeep Holla 
33*714be77eSSudeep Holla 	if (conduit == SMCCC_CONDUIT_SMC)
34*714be77eSSudeep Holla 		*invoke_ffa_fn = __arm_ffa_fn_smc;
35*714be77eSSudeep Holla 	else
36*714be77eSSudeep Holla 		*invoke_ffa_fn = __arm_ffa_fn_hvc;
37*714be77eSSudeep Holla 
38*714be77eSSudeep Holla 	return 0;
39*714be77eSSudeep Holla }
40