[PATCH 03/12] lib: utils: Introduce optional MPXY RPMI service group operations

Samuel Holland samuel.holland at sifive.com
Sun Jan 19 14:58:08 PST 2025


Hi Anup,

On 2025-01-16 9:56 AM, Anup Patel wrote:
> Some of the RPMI service groups may additional contex and special
> handling when transfering message to underlying mailbox channel

typos: context, transferring

> so introduce optional MPXY RPMI service group operations for this
> purpose.
> 
> Signed-off-by: Anup Patel <apatel at ventanamicro.com>
> ---
>  include/sbi_utils/mpxy/fdt_mpxy_rpmi_mbox.h | 18 ++++++++++++++++
>  lib/utils/mpxy/fdt_mpxy_rpmi_clock.c        |  4 ++++
>  lib/utils/mpxy/fdt_mpxy_rpmi_mbox.c         | 24 +++++++++++++++++----
>  3 files changed, 42 insertions(+), 4 deletions(-)
> 
> diff --git a/include/sbi_utils/mpxy/fdt_mpxy_rpmi_mbox.h b/include/sbi_utils/mpxy/fdt_mpxy_rpmi_mbox.h
> index e4ca0151..08b32a0a 100644
> --- a/include/sbi_utils/mpxy/fdt_mpxy_rpmi_mbox.h
> +++ b/include/sbi_utils/mpxy/fdt_mpxy_rpmi_mbox.h
> @@ -12,6 +12,7 @@
>  
>  #include <sbi/sbi_types.h>
>  #include <sbi/sbi_mpxy.h>
> +#include <sbi_utils/mailbox/fdt_mailbox.h>
>  #include <sbi_utils/mailbox/rpmi_msgprot.h>
>  #include <sbi_utils/mpxy/fdt_mpxy.h>
>  
> @@ -56,12 +57,29 @@ struct mpxy_rpmi_service_data {
>  	u32 max_rx_len;
>  };
>  
> +struct mpxy_rpmi_mbox_data;
> +
> +/** MPXY RPMI service group operations */
> +struct mpxy_rpmi_service_group_ops {
> +	/** Transfer RPMI service group message */
> +	int (*xfer_group)(void *context, struct mbox_chan *chan,
> +			  struct mbox_xfer *xfer);
> +
> +	/** Setup RPMI service group context for MPXY */
> +	int (*setup_group)(void **context, struct mbox_chan *chan,
> +			   const struct mpxy_rpmi_mbox_data *data);
> +
> +	/** Cleanup RPMI service group context for MPXY */
> +	void (*cleanup_group)(void *context);
> +};
> +
>  /** MPXY RPMI mbox data for each service group */
>  struct mpxy_rpmi_mbox_data {
>  	u32 servicegrp_id;
>  	u32 num_services;
>  	u32 notifications_support;
>  	struct mpxy_rpmi_service_data *service_data;
> +	struct mpxy_rpmi_service_group_ops *group_ops;

Do you expect several service groups to share a mpxy_rpmi_service_group_ops? If
not, I would suggest to reduce pointer chasing by putting the function pointers
directly in mpxy_rpmi_mbox_data.

If you do keep it as a pointer, it should be a pointer to const.

Regards,
Samuel

>  };
>  
>  /** Common probe function for MPXY RPMI drivers */
> diff --git a/lib/utils/mpxy/fdt_mpxy_rpmi_clock.c b/lib/utils/mpxy/fdt_mpxy_rpmi_clock.c
> index 1f5c6e75..3d275cd8 100644
> --- a/lib/utils/mpxy/fdt_mpxy_rpmi_clock.c
> +++ b/lib/utils/mpxy/fdt_mpxy_rpmi_clock.c
> @@ -10,6 +10,9 @@
>  
>  #include <sbi_utils/mpxy/fdt_mpxy_rpmi_mbox.h>
>  
> +static struct mpxy_rpmi_service_group_ops clock_ops = {
> +};
> +
>  static struct mpxy_rpmi_service_data clock_services[] = {
>  {
>  	.id = RPMI_CLOCK_SRV_ENABLE_NOTIFICATION,
> @@ -74,6 +77,7 @@ static struct mpxy_rpmi_mbox_data clock_data = {
>  	.num_services = RPMI_CLOCK_SRV_MAX_COUNT,
>  	.notifications_support = 1,
>  	.service_data = clock_services,
> +	.group_ops = &clock_ops,
>  };
>  
>  static const struct fdt_match clock_match[] = {
> diff --git a/lib/utils/mpxy/fdt_mpxy_rpmi_mbox.c b/lib/utils/mpxy/fdt_mpxy_rpmi_mbox.c
> index 7034fb9e..8d892cef 100644
> --- a/lib/utils/mpxy/fdt_mpxy_rpmi_mbox.c
> +++ b/lib/utils/mpxy/fdt_mpxy_rpmi_mbox.c
> @@ -13,7 +13,6 @@
>  #include <sbi/sbi_heap.h>
>  #include <sbi_utils/fdt/fdt_helper.h>
>  #include <sbi_utils/mpxy/fdt_mpxy_rpmi_mbox.h>
> -#include <sbi_utils/mailbox/fdt_mailbox.h>
>  #include <sbi/sbi_console.h>
>  
>  /**
> @@ -25,6 +24,7 @@ struct mpxy_rpmi_mbox {
>  	const struct mpxy_rpmi_mbox_data *mbox_data;
>  	struct mpxy_rpmi_channel_attrs msgprot_attrs;
>  	struct sbi_mpxy_channel channel;
> +	void *group_context;
>  };
>  
>  /**
> @@ -146,8 +146,9 @@ static int __mpxy_mbox_send_message(struct sbi_mpxy_channel *channel,
>  	struct rpmi_message_args args = {0};
>  	struct mpxy_rpmi_mbox *rmb =
>  		container_of(channel, struct mpxy_rpmi_mbox, channel);
> +	const struct mpxy_rpmi_mbox_data *data = rmb->mbox_data;
>  	const struct mpxy_rpmi_service_data *srv =
> -		mpxy_find_rpmi_srvid(message_id, rmb->mbox_data);
> +		mpxy_find_rpmi_srvid(message_id, data);
>  
>  	if (!srv)
>  		return SBI_ENOTSUPP;
> @@ -183,7 +184,10 @@ static int __mpxy_mbox_send_message(struct sbi_mpxy_channel *channel,
>  				  tx, tx_len, RPMI_DEF_TX_TIMEOUT);
>  	}
>  
> -	ret = mbox_chan_xfer(rmb->chan, &xfer);
> +	if (data->group_ops->xfer_group)
> +		ret = data->group_ops->xfer_group(rmb->group_context, rmb->chan, &xfer);
> +	else
> +		ret = mbox_chan_xfer(rmb->chan, &xfer);
>  	if (ret)
>  		return ret;
>  
> @@ -303,9 +307,21 @@ int mpxy_rpmi_mbox_init(const void *fdt, int nodeoff, const struct fdt_match *ma
>  	rmb->mbox_data = data;
>  	rmb->chan = chan;
>  
> -	/* Register RPXY service group */
> +	/* Setup RPMI service group context */
> +	if (data->group_ops->setup_group) {
> +		rc = data->group_ops->setup_group(&rmb->group_context, chan, data);
> +		if (rc) {
> +			mbox_controller_free_chan(chan);
> +			sbi_free(rmb);
> +			return rc;
> +		}
> +	}
> +
> +	/* Register RPMI service group */
>  	rc = sbi_mpxy_register_channel(&rmb->channel);
>  	if (rc) {
> +		if (data->group_ops->cleanup_group)
> +			data->group_ops->cleanup_group(rmb->group_context);
>  		mbox_controller_free_chan(chan);
>  		sbi_free(rmb);
>  		return rc;




More information about the opensbi mailing list