On Thu, 26 Oct 2023 at 13:34, Jens Wiklander jens.wiklander@linaro.org wrote:
Provides optee_do_bottom_half() and optee_stop_async_notif() as common functions callable from the FF-A ABI part of the driver too.
Signed-off-by: Jens Wiklander jens.wiklander@linaro.org
drivers/tee/optee/call.c | 31 +++++++++++++++++++++++++- drivers/tee/optee/optee_private.h | 5 ++++- drivers/tee/optee/smc_abi.c | 36 ++++--------------------------- 3 files changed, 38 insertions(+), 34 deletions(-)
Reviewed-by: Sumit Garg sumit.garg@linaro.org
-Sumit
diff --git a/drivers/tee/optee/call.c b/drivers/tee/optee/call.c index df5fb5410b72..5afc759794ce 100644 --- a/drivers/tee/optee/call.c +++ b/drivers/tee/optee/call.c @@ -1,6 +1,6 @@ // SPDX-License-Identifier: GPL-2.0-only /*
- Copyright (c) 2015-2021, Linaro Limited
*/
- Copyright (c) 2015-2021, 2023 Linaro Limited
#include <linux/device.h> #include <linux/err.h> @@ -524,3 +524,32 @@ int optee_check_mem_type(unsigned long start, size_t num_pages)
return rc;
}
+static int simple_call_with_arg(struct tee_context *ctx, u32 cmd) +{
struct optee *optee = tee_get_drvdata(ctx->teedev);
struct optee_shm_arg_entry *entry;
struct optee_msg_arg *msg_arg;
struct tee_shm *shm;
u_int offs;
msg_arg = optee_get_msg_arg(ctx, 0, &entry, &shm, &offs);
if (IS_ERR(msg_arg))
return PTR_ERR(msg_arg);
msg_arg->cmd = cmd;
optee->ops->do_call_with_arg(ctx, shm, offs);
optee_free_msg_arg(ctx, entry, offs);
return 0;
+}
+int optee_do_bottom_half(struct tee_context *ctx) +{
return simple_call_with_arg(ctx, OPTEE_MSG_CMD_DO_BOTTOM_HALF);
+}
+int optee_stop_async_notif(struct tee_context *ctx) +{
return simple_call_with_arg(ctx, OPTEE_MSG_CMD_STOP_ASYNC_NOTIF);
+} diff --git a/drivers/tee/optee/optee_private.h b/drivers/tee/optee/optee_private.h index 72685ee0d53f..2165bd11e6ac 100644 --- a/drivers/tee/optee/optee_private.h +++ b/drivers/tee/optee/optee_private.h @@ -1,6 +1,6 @@ /* SPDX-License-Identifier: GPL-2.0-only */ /*
- Copyright (c) 2015-2021, Linaro Limited
*/
- Copyright (c) 2015-2021, 2023 Linaro Limited
#ifndef OPTEE_PRIVATE_H @@ -325,6 +325,9 @@ void optee_rpc_cmd_free_suppl(struct tee_context *ctx, struct tee_shm *shm); void optee_rpc_cmd(struct tee_context *ctx, struct optee *optee, struct optee_msg_arg *arg);
+int optee_do_bottom_half(struct tee_context *ctx); +int optee_stop_async_notif(struct tee_context *ctx);
/*
- Small helpers
*/ diff --git a/drivers/tee/optee/smc_abi.c b/drivers/tee/optee/smc_abi.c index d5b28fd35d66..94e96803a722 100644 --- a/drivers/tee/optee/smc_abi.c +++ b/drivers/tee/optee/smc_abi.c @@ -1,6 +1,6 @@ // SPDX-License-Identifier: GPL-2.0-only /*
- Copyright (c) 2015-2021, Linaro Limited
*/
- Copyright (c) 2015-2021, 2023 Linaro Limited
- Copyright (c) 2016, EPAM Systems
@@ -965,34 +965,6 @@ static int optee_smc_do_call_with_arg(struct tee_context *ctx, return rc; }
-static int simple_call_with_arg(struct tee_context *ctx, u32 cmd) -{
struct optee_shm_arg_entry *entry;
struct optee_msg_arg *msg_arg;
struct tee_shm *shm;
u_int offs;
msg_arg = optee_get_msg_arg(ctx, 0, &entry, &shm, &offs);
if (IS_ERR(msg_arg))
return PTR_ERR(msg_arg);
msg_arg->cmd = cmd;
optee_smc_do_call_with_arg(ctx, shm, offs);
optee_free_msg_arg(ctx, entry, offs);
return 0;
-}
-static int optee_smc_do_bottom_half(struct tee_context *ctx) -{
return simple_call_with_arg(ctx, OPTEE_MSG_CMD_DO_BOTTOM_HALF);
-}
-static int optee_smc_stop_async_notif(struct tee_context *ctx) -{
return simple_call_with_arg(ctx, OPTEE_MSG_CMD_STOP_ASYNC_NOTIF);
-}
/*
- Asynchronous notification
*/ @@ -1048,7 +1020,7 @@ static irqreturn_t notif_irq_thread_fn(int irq, void *dev_id) { struct optee *optee = dev_id;
optee_smc_do_bottom_half(optee->ctx);
optee_do_bottom_half(optee->ctx); return IRQ_HANDLED;
} @@ -1086,7 +1058,7 @@ static void notif_pcpu_irq_work_fn(struct work_struct *work) notif_pcpu_work); struct optee *optee = container_of(optee_smc, struct optee, smc);
optee_smc_do_bottom_half(optee->ctx);
optee_do_bottom_half(optee->ctx);
}
static int init_pcpu_irq(struct optee *optee, u_int irq) @@ -1158,7 +1130,7 @@ static void uninit_pcpu_irq(struct optee *optee) static void optee_smc_notif_uninit_irq(struct optee *optee) { if (optee->smc.sec_caps & OPTEE_SMC_SEC_CAP_ASYNC_NOTIF) {
optee_smc_stop_async_notif(optee->ctx);
optee_stop_async_notif(optee->ctx); if (optee->smc.notif_irq) { if (irq_is_percpu_devid(optee->smc.notif_irq)) uninit_pcpu_irq(optee);
-- 2.34.1