714be77e97
There are requests to keep the transport separate in order to allow other possible transports like virtio. So let us keep the SMCCC transport specific routines abstracted. It is kept simple for now. Once we add another transport, we can develop better abstraction. Link: https://lore.kernel.org/r/20210521151033.181846-4-sudeep.holla@arm.com Tested-by: Jens Wiklander <jens.wiklander@linaro.org> Reviewed-by: Jens Wiklander <jens.wiklander@linaro.org> Signed-off-by: Sudeep Holla <sudeep.holla@arm.com>
40 lines
783 B
C
40 lines
783 B
C
// SPDX-License-Identifier: GPL-2.0-only
|
|
/*
|
|
* Copyright (C) 2021 ARM Ltd.
|
|
*/
|
|
|
|
#include <linux/printk.h>
|
|
|
|
#include "common.h"
|
|
|
|
static void __arm_ffa_fn_smc(ffa_value_t args, ffa_value_t *res)
|
|
{
|
|
arm_smccc_1_2_smc(&args, res);
|
|
}
|
|
|
|
static void __arm_ffa_fn_hvc(ffa_value_t args, ffa_value_t *res)
|
|
{
|
|
arm_smccc_1_2_hvc(&args, res);
|
|
}
|
|
|
|
int __init ffa_transport_init(ffa_fn **invoke_ffa_fn)
|
|
{
|
|
enum arm_smccc_conduit conduit;
|
|
|
|
if (arm_smccc_get_version() < ARM_SMCCC_VERSION_1_2)
|
|
return -EOPNOTSUPP;
|
|
|
|
conduit = arm_smccc_1_1_get_conduit();
|
|
if (conduit == SMCCC_CONDUIT_NONE) {
|
|
pr_err("%s: invalid SMCCC conduit\n", __func__);
|
|
return -EOPNOTSUPP;
|
|
}
|
|
|
|
if (conduit == SMCCC_CONDUIT_SMC)
|
|
*invoke_ffa_fn = __arm_ffa_fn_smc;
|
|
else
|
|
*invoke_ffa_fn = __arm_ffa_fn_hvc;
|
|
|
|
return 0;
|
|
}
|