diff --git a/include/sbi_utils/mpxy/fdt_mpxy_rpmi_mbox.h b/include/sbi_utils/mpxy/fdt_mpxy_rpmi_mbox.h index 17b50557..df81a73d 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 #include +#include #include #include @@ -63,6 +64,17 @@ struct mpxy_rpmi_mbox_data { u32 num_services; u32 notifications_support; struct mpxy_rpmi_service_data *service_data; + + /** 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); }; /** Common probe function for MPXY RPMI drivers */ diff --git a/lib/utils/mpxy/fdt_mpxy_rpmi_mbox.c b/lib/utils/mpxy/fdt_mpxy_rpmi_mbox.c index 7034fb9e..6db750fb 100644 --- a/lib/utils/mpxy/fdt_mpxy_rpmi_mbox.c +++ b/lib/utils/mpxy/fdt_mpxy_rpmi_mbox.c @@ -13,7 +13,6 @@ #include #include #include -#include #include /** @@ -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->xfer_group) + ret = data->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->setup_group) { + rc = data->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->cleanup_group) + data->cleanup_group(rmb->group_context); mbox_controller_free_chan(chan); sbi_free(rmb); return rc;