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 Hollastatic 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 Hollastatic 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 Hollaint __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