[PATCH] firmware: arm_ffa: Add support for MEM_LEND

Jens Wiklander jens.wiklander at linaro.org
Fri Oct 8 00:48:48 PDT 2021


Hi Marc,

On Thu, Oct 7, 2021 at 7:44 PM Marc Bonnici <marc.bonnici at arm.com> wrote:
>
> As part of the FF-A spec, an endpoint is allowed to
> transfer access of, or lend, a memory region to one
> or more borrowers.
>
> Extend the existing memory sharing implementation to
> support FF-A MEM_LEND functionality and expose this
> to other kernel drivers.
>
> Signed-off-by: Marc Bonnici <marc.bonnici at arm.com>
> ---
>  drivers/firmware/arm_ffa/driver.c | 10 ++++++++++
>  include/linux/arm_ffa.h           |  2 ++
>  2 files changed, 12 insertions(+)

This is similar to MEM_SHARE, but with one significant difference, the
memory lent may become inaccessible by the kernel once this has
succeeded. In case there's no hypervisor in the system the
responsibility falls on the kernel itself to make sure that it will
keep off the lent memory. Even if it may not be the responsibility of
this driver to enforce this it might be worth a comment to help the
caller on the right track.

Cheers,
Jens

>
> diff --git a/drivers/firmware/arm_ffa/driver.c b/drivers/firmware/arm_ffa/driver.c
> index 6e0c883ab708..41661ae4ee04 100644
> --- a/drivers/firmware/arm_ffa/driver.c
> +++ b/drivers/firmware/arm_ffa/driver.c
> @@ -613,6 +613,15 @@ ffa_memory_share(struct ffa_device *dev, struct ffa_mem_ops_args *args)
>         return ffa_memory_ops(FFA_FN_NATIVE(MEM_SHARE), args);
>  }
>
> +static int
> +ffa_memory_lend(struct ffa_device *dev, struct ffa_mem_ops_args *args)
> +{
> +       if (dev->mode_32bit)
> +               return ffa_memory_ops(FFA_MEM_LEND, args);
> +
> +       return ffa_memory_ops(FFA_FN_NATIVE(MEM_LEND), args);
> +}
> +
>  static const struct ffa_dev_ops ffa_ops = {
>         .api_version_get = ffa_api_version_get,
>         .partition_info_get = ffa_partition_info_get,
> @@ -620,6 +629,7 @@ static const struct ffa_dev_ops ffa_ops = {
>         .sync_send_receive = ffa_sync_send_receive,
>         .memory_reclaim = ffa_memory_reclaim,
>         .memory_share = ffa_memory_share,
> +       .memory_lend = ffa_memory_lend,
>  };
>
>  const struct ffa_dev_ops *ffa_dev_ops_get(struct ffa_device *dev)
> diff --git a/include/linux/arm_ffa.h b/include/linux/arm_ffa.h
> index 505c679b6a9b..85651e41ded8 100644
> --- a/include/linux/arm_ffa.h
> +++ b/include/linux/arm_ffa.h
> @@ -262,6 +262,8 @@ struct ffa_dev_ops {
>         int (*memory_reclaim)(u64 g_handle, u32 flags);
>         int (*memory_share)(struct ffa_device *dev,
>                             struct ffa_mem_ops_args *args);
> +       int (*memory_lend)(struct ffa_device *dev,
> +                          struct ffa_mem_ops_args *args);
>  };
>
>  #endif /* _LINUX_ARM_FFA_H */
> --
> 2.25.1
>



More information about the linux-arm-kernel mailing list