[PATCH 05/11] lib: utils/mpxy: Introduce mpxy_rpmi_no_mbox_init() function

Pawandeep Oza pawandeep.oza at oss.qualcomm.com
Tue Oct 13 12:46:34 PDT 2026


On Tue, Sep 22, 2026 at 8:24 PM Anup Patel <anup.patel at oss.qualcomm.com> wrote:
>
> Add new mpxy_rpmi_no_mbox_init() function to instantiate MPXY RPMI
> channel without any mailbox channel backing. This new function can
> be used by MPXY RPMI drivers that want to emulate MPXY channels in
> software.
>
> Signed-off-by: Anup Patel <anup.patel at oss.qualcomm.com>
> ---
>  include/sbi_utils/mpxy/fdt_mpxy_rpmi.h |   6 +-
>  lib/utils/mpxy/fdt_mpxy_rpmi.c         | 119 ++++++++++++++++---------
>  2 files changed, 83 insertions(+), 42 deletions(-)
>
> diff --git a/include/sbi_utils/mpxy/fdt_mpxy_rpmi.h b/include/sbi_utils/mpxy/fdt_mpxy_rpmi.h
> index a3968e87..c4e6897f 100644
> --- a/include/sbi_utils/mpxy/fdt_mpxy_rpmi.h
> +++ b/include/sbi_utils/mpxy/fdt_mpxy_rpmi.h
> @@ -84,7 +84,11 @@ struct mpxy_rpmi_data {
>         void (*cleanup_group)(void *context);
>  };
>
> -/** Common probe function for MPXY RPMI drivers */
> +/** Function to instantiate MPXY RPMI channel */
> +int mpxy_rpmi_no_mbox_init(const struct mpxy_rpmi_data *data, u32 mpxy_channel_id,
> +                          const char *dom_name);
> +
> +/** FDT probe function to instantiate MPXY RPMI channel */
>  int fdt_mpxy_rpmi_init(const void *fdt, int nodeoff, const struct fdt_match *match);
>
>  #endif
> diff --git a/lib/utils/mpxy/fdt_mpxy_rpmi.c b/lib/utils/mpxy/fdt_mpxy_rpmi.c
> index 9b8e69e1..103ded13 100644
> --- a/lib/utils/mpxy/fdt_mpxy_rpmi.c
> +++ b/lib/utils/mpxy/fdt_mpxy_rpmi.c
> @@ -219,44 +219,37 @@ static int mpxy_rpmi_get_attribute(struct mpxy_rpmi *rmb,
>         return rc;
>  }
>
> -int fdt_mpxy_rpmi_init(const void *fdt, int nodeoff, const struct fdt_match *match)
> +static int __mpxy_rpmi_init(const struct mpxy_rpmi_data *data,
> +                           struct mbox_chan *chan, u32 mpxy_channel_id,
> +                           struct sbi_domain *dom)
>  {
> -       u32 channel_id, servicegrp_ver, pro_ver, max_data_len, tx_tout, rx_tout;
> -       u32 impl_id, impl_ver;
> -       const struct mpxy_rpmi_data *data = match->data;
> +       u32 servicegrp_ver, pro_ver, max_data_len, tx_tout, rx_tout;
>         struct mpxy_rpmi *rmb;
> -       struct mbox_chan *chan;
> -       const fdt32_t *val;
> -       int rc, len;
> +       u32 impl_id, impl_ver;
> +       int rc;
> +
> +       if (!data || !dom)
> +               return SBI_EINVAL;
> +
> +       /*
> +        * When mailbox channel is not available, both get_attribute_group() and
> +        * xfer_group() callbacks must be available.
> +        */
> +       if (!chan && (!data->get_attribute_group || !data->xfer_group))
> +               return SBI_EINVAL;
>
>         /* Allocate context for MPXY RPMI instance */
>         rmb = sbi_zalloc(sizeof(*rmb));
>         if (!rmb)
>                 return SBI_ENOMEM;
>         rmb->data = data;
> -
> -       /*
> -        * If channel request failed then other end does not support
> -        * service group so do nothing.
> -        */
> -       rc = fdt_mailbox_request_chan(fdt, nodeoff, 0, &chan);
> -       if (rc) {
> -               rc = SBI_ENODEV;
> -               goto fail_free_client;
> -       }
>         rmb->chan = chan;
>
> -       /* Match channel service group id */
> -       if (data->servicegrp_id != chan->chan_args[0]) {
> -               rc = SBI_EINVAL;
> -               goto fail_free_chan;
> -       }
> -
>         /* Setup RPMI service group context */
>         if (data->setup_group) {
>                 rc = data->setup_group(&rmb->group_context, chan, data);
>                 if (rc)
> -                       goto fail_free_chan;
> +                       goto fail_free_client;
>         }
>
>         /* Get channel protocol version */
> @@ -301,24 +294,11 @@ int fdt_mpxy_rpmi_init(const void *fdt, int nodeoff, const struct fdt_match *mat
>         if (rc)
>                 goto fail_cleanup_group;
>
> -       /*
> -        * The "riscv,sbi-mpxy-channel-id" DT property is mandatory
> -        * for MPXY RPMI drivers so if this is not present then try
> -        * other drivers.
> -        */
> -       val = fdt_getprop(fdt, nodeoff, "riscv,sbi-mpxy-channel-id", &len);
> -       if (len > 0 && val) {
> -               channel_id = fdt32_to_cpu(*val);
> -       } else {
> -               rc = SBI_ENODEV;
> -               goto fail_cleanup_group;
> -       }
> -
>         /* Setup MPXY RPMI channel */
>         /* Channel ID*/
> -       rmb->channel.channel_id = channel_id;
> +       rmb->channel.channel_id = mpxy_channel_id;
>         /* Set the owner domain */
> -       rmb->channel.owner_domain = &root;
> +       rmb->channel.owner_domain = dom;
>         /* Callback for read RPMI attributes */
>         rmb->channel.read_attributes = mpxy_read_attributes;
>         /* Callback for write RPMI attributes */
> @@ -360,9 +340,66 @@ int fdt_mpxy_rpmi_init(const void *fdt, int nodeoff, const struct fdt_match *mat
>  fail_cleanup_group:
>         if (data->cleanup_group)
>                 data->cleanup_group(rmb->group_context);
> -fail_free_chan:
> -       mbox_controller_free_chan(chan);
>  fail_free_client:
>         sbi_free(rmb);
>         return rc;
>  }
> +
> +int mpxy_rpmi_no_mbox_init(const struct mpxy_rpmi_data *data, u32 mpxy_channel_id,
> +                          const char *dom_name)
> +{
> +       /* Create MPXY RPMI instance without mailbox channel */
> +       return __mpxy_rpmi_init(data, NULL, mpxy_channel_id, sbi_domain_find_by_name(dom_name));
> +}
> +
> +int fdt_mpxy_rpmi_init(const void *fdt, int nodeoff, const struct fdt_match *match)
> +{
> +       const struct mpxy_rpmi_data *data = match->data;
> +       struct mbox_chan *chan = NULL;
> +       const fdt32_t *val;
> +       u32 channel_id;
> +       int rc, len;
> +
> +       /* Request mailbox channel when available */
> +       val = fdt_getprop(fdt, nodeoff, "mboxes", &len);
> +       if (val) {
> +               /*
> +                * If channel request failed then other end does not support
> +                * service group so do nothing.
> +                */
> +               rc = fdt_mailbox_request_chan(fdt, nodeoff, 0, &chan);
> +               if (rc)
> +                       return SBI_ENODEV;
> +
> +               /* Match channel service group id */
> +               if (data->servicegrp_id != chan->chan_args[0]) {
> +                       rc = SBI_EINVAL;
> +                       goto fail_free_chan;
> +               }
> +       }
> +
> +       /*
> +        * The "riscv,sbi-mpxy-channel-id" DT property is mandatory
> +        * for MPXY RPMI drivers so if this is not present then try
> +        * other drivers.
> +        */
> +       val = fdt_getprop(fdt, nodeoff, "riscv,sbi-mpxy-channel-id", &len);
> +       if (len > 0 && val) {
> +               channel_id = fdt32_to_cpu(*val);
> +       } else {
> +               rc = SBI_ENODEV;
> +               goto fail_free_chan;
> +       }
> +
> +       /* Create MPXY RPMI instance with mailbox channel discovered from DT */
> +       rc = __mpxy_rpmi_init(data, chan, channel_id, &root);
> +       if (rc)
> +               goto fail_free_chan;
> +
> +       return SBI_OK;
> +
> +fail_free_chan:
> +       if (chan)
> +               mbox_controller_free_chan(chan);
> +       return rc;
> +}
> --
> 2.43.0
>
>
> --
> opensbi mailing list
> opensbi at lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/opensbi

Reviewed-by: Pawandeep Oza <pawandeep.oza at oss.qualcomm.com>
Tested-by: Pawandeep Oza <pawandeep.oza at oss.qualcomm.com>



More information about the opensbi mailing list