[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH v2 3/5] xen/arm: ffa: Add buffer full notification support



Hi Bertrand,

On Mon, Mar 10, 2025 at 3:51 PM Bertrand Marquis
<bertrand.marquis@xxxxxxx> wrote:
>
> Add support to raise a Rx buffer full notification to a VM.
> This function will be used for indirect message support between VM and
> is only activated if CONFIG_FFA_VM_TO_VM is selected.
>
> Even if there are 32 framework notifications possible, right now only
> one is defined so the implementation is simplified to only handle the
> buffer full notification using a boolean. If other framework
> notifications have to be supported one day, the design will have to be
> modified to handle it properly.
>
> Signed-off-by: Bertrand Marquis <bertrand.marquis@xxxxxxx>
> ---
> Changes in v2:
> - Code style fix
> ---
>  xen/arch/arm/tee/ffa_notif.c   | 26 +++++++++++++++++++++-----
>  xen/arch/arm/tee/ffa_private.h | 13 +++++++++++++
>  2 files changed, 34 insertions(+), 5 deletions(-)
>
> diff --git a/xen/arch/arm/tee/ffa_notif.c b/xen/arch/arm/tee/ffa_notif.c
> index 00efaf8f7353..d19aa5c5bef6 100644
> --- a/xen/arch/arm/tee/ffa_notif.c
> +++ b/xen/arch/arm/tee/ffa_notif.c
> @@ -93,6 +93,7 @@ void ffa_handle_notification_info_get(struct cpu_user_regs 
> *regs)
>  void ffa_handle_notification_get(struct cpu_user_regs *regs)
>  {
>      struct domain *d = current->domain;
> +    struct ffa_ctx *ctx = d->arch.tee;
>      uint32_t recv = get_user_reg(regs, 1);
>      uint32_t flags = get_user_reg(regs, 2);
>      uint32_t w2 = 0;
> @@ -132,11 +133,7 @@ void ffa_handle_notification_get(struct cpu_user_regs 
> *regs)
>           */
>          if ( ( flags  & FFA_NOTIF_FLAG_BITMAP_SP ) &&
>               ( flags & FFA_NOTIF_FLAG_BITMAP_SPM ) )
> -        {
> -                struct ffa_ctx *ctx = d->arch.tee;
> -
> -                ACCESS_ONCE(ctx->notif.secure_pending) = false;
> -        }
> +            ACCESS_ONCE(ctx->notif.secure_pending) = false;
>
>          arm_smccc_1_2_smc(&arg, &resp);
>          e = ffa_get_ret_code(&resp);
> @@ -156,6 +153,12 @@ void ffa_handle_notification_get(struct cpu_user_regs 
> *regs)
>              w6 = resp.a6;
>      }
>
> +#ifdef CONFIG_FFA_VM_TO_VM
> +    if ( flags & FFA_NOTIF_FLAG_BITMAP_HYP &&
> +          test_and_clear_bool(ctx->notif.buff_full_pending) )
> +        w7 = FFA_NOTIF_RX_BUFFER_FULL;
> +#endif
> +
>      ffa_set_regs(regs, FFA_SUCCESS_32, 0, w2, w3, w4, w5, w6, w7);
>  }
>
> @@ -178,6 +181,19 @@ int ffa_handle_notification_set(struct cpu_user_regs 
> *regs)
>                             bitmap_hi);
>  }
>
> +#ifdef CONFIG_FFA_VM_TO_VM
> +void ffa_raise_rx_buffer_full(struct domain *d)
> +{
> +    struct ffa_ctx *ctx = d->arch.tee;
> +
> +    if ( !ctx )
> +        return;
> +
> +    if ( !test_and_set_bool(ctx->notif.buff_full_pending) )
> +        vgic_inject_irq(d, d->vcpu[0], notif_sri_irq, true);
> +}
> +#endif
> +
>  /*
>   * Extract a 16-bit ID (index n) from the successful return value from
>   * FFA_NOTIFICATION_INFO_GET_64 or FFA_NOTIFICATION_INFO_GET_32. IDs are
> diff --git a/xen/arch/arm/tee/ffa_private.h b/xen/arch/arm/tee/ffa_private.h
> index bd6877d8c632..1f5067d5d0c9 100644
> --- a/xen/arch/arm/tee/ffa_private.h
> +++ b/xen/arch/arm/tee/ffa_private.h
> @@ -210,6 +210,8 @@
>  #define FFA_NOTIF_INFO_GET_ID_COUNT_SHIFT   7
>  #define FFA_NOTIF_INFO_GET_ID_COUNT_MASK    0x1F
>
> +#define FFA_NOTIF_RX_BUFFER_FULL        BIT(0, U)
> +
>  /* Feature IDs used with FFA_FEATURES */
>  #define FFA_FEATURE_NOTIF_PEND_INTR     0x1U
>  #define FFA_FEATURE_SCHEDULE_RECV_INTR  0x2U
> @@ -298,6 +300,13 @@ struct ffa_ctx_notif {
>       * pending global notifications.
>       */
>      bool secure_pending;
> +
> +#ifdef CONFIG_FFA_VM_TO_VM
> +    /*
> +     * Pending Hypervisor framework notifications
> +     */
> +    bool buff_full_pending;
> +#endif

It doesn't matter if there are one or two bools in this struct.
However, the ifdef prevents using IS_ENABLED(CONFIG_FFA_VM_TO_VM)
instead of an ifdef in the logic controlling access to this field.

Cheers,
Jens

>  };
>
>  struct ffa_ctx {
> @@ -369,6 +378,10 @@ void ffa_handle_notification_info_get(struct 
> cpu_user_regs *regs);
>  void ffa_handle_notification_get(struct cpu_user_regs *regs);
>  int ffa_handle_notification_set(struct cpu_user_regs *regs);
>
> +#ifdef CONFIG_FFA_VM_TO_VM
> +void ffa_raise_rx_buffer_full(struct domain *d);
> +#endif
> +
>  void ffa_handle_msg_send_direct_req(struct cpu_user_regs *regs, uint32_t 
> fid);
>  int32_t ffa_handle_msg_send2(struct cpu_user_regs *regs);
>
> --
> 2.47.1
>



 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.