Re: [PATCH 1/2] optee: provide optee_do_bottom_half() as a common function

From: Sumit Garg
Date: Mon Oct 30 2023 - 02:54:12 EST


On Thu, 26 Oct 2023 at 13:34, Jens Wiklander <jens.wiklander@xxxxxxxxxx> 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@xxxxxxxxxx>
> ---
> 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@xxxxxxxxxx>

-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);
> -}
> -
> /*
> * 5. 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
>