[PATCH 03/11] lib: utils/mpxy: Introduce get_attribute_group() for MPXY RPMI data

Anup Patel anup.patel at oss.qualcomm.com
Tue Sep 22 20:23:51 PDT 2026


Fully emulated MPXY channels need a custom way to provide RPMI attributes
so introduce optional get_attribute_group() callback in MPXY RPMI data
for this purpose.

Signed-off-by: Anup Patel <anup.patel at oss.qualcomm.com>
---
 include/sbi_utils/mpxy/fdt_mpxy_rpmi.h |  5 ++++
 lib/utils/mpxy/fdt_mpxy_rpmi.c         | 34 ++++++++++++++++++--------
 2 files changed, 29 insertions(+), 10 deletions(-)

diff --git a/include/sbi_utils/mpxy/fdt_mpxy_rpmi.h b/include/sbi_utils/mpxy/fdt_mpxy_rpmi.h
index d1f5f9ca..a3968e87 100644
--- a/include/sbi_utils/mpxy/fdt_mpxy_rpmi.h
+++ b/include/sbi_utils/mpxy/fdt_mpxy_rpmi.h
@@ -67,6 +67,11 @@ struct mpxy_rpmi_data {
 	u32 num_services;
 	struct mpxy_rpmi_service_data *service_data;
 
+	/** Get RPMI service group attribute */
+	int (*get_attribute_group)(void *context, struct mbox_chan *chan,
+				   enum rpmi_channel_attribute_id attr_id,
+				   u32 *out_value);
+
 	/** Transfer RPMI service group message */
 	int (*xfer_group)(void *context, struct mbox_chan *chan,
 			  struct mbox_xfer *xfer);
diff --git a/lib/utils/mpxy/fdt_mpxy_rpmi.c b/lib/utils/mpxy/fdt_mpxy_rpmi.c
index bbeb7a79..9b8e69e1 100644
--- a/lib/utils/mpxy/fdt_mpxy_rpmi.c
+++ b/lib/utils/mpxy/fdt_mpxy_rpmi.c
@@ -204,6 +204,21 @@ static int mpxy_send_message_withoutresp(struct sbi_mpxy_channel *channel,
 				   NULL, 0, NULL);
 }
 
+static int mpxy_rpmi_get_attribute(struct mpxy_rpmi *rmb,
+				   enum rpmi_channel_attribute_id attr_id,
+				   u32 *out_value)
+{
+	const struct mpxy_rpmi_data *data = rmb->data;
+	struct mbox_chan *chan = rmb->chan;
+	int rc;
+
+	if (data->get_attribute_group)
+		rc = data->get_attribute_group(rmb->group_context, chan, attr_id, out_value);
+	else
+		rc = mbox_chan_get_attribute(chan, attr_id, out_value);
+	return rc;
+}
+
 int fdt_mpxy_rpmi_init(const void *fdt, int nodeoff, const struct fdt_match *match)
 {
 	u32 channel_id, servicegrp_ver, pro_ver, max_data_len, tx_tout, rx_tout;
@@ -218,6 +233,7 @@ int fdt_mpxy_rpmi_init(const void *fdt, int nodeoff, const struct fdt_match *mat
 	rmb = sbi_zalloc(sizeof(*rmb));
 	if (!rmb)
 		return SBI_ENOMEM;
+	rmb->data = data;
 
 	/*
 	 * If channel request failed then other end does not support
@@ -228,6 +244,7 @@ int fdt_mpxy_rpmi_init(const void *fdt, int nodeoff, const struct fdt_match *mat
 		rc = SBI_ENODEV;
 		goto fail_free_client;
 	}
+	rmb->chan = chan;
 
 	/* Match channel service group id */
 	if (data->servicegrp_id != chan->chan_args[0]) {
@@ -243,43 +260,43 @@ int fdt_mpxy_rpmi_init(const void *fdt, int nodeoff, const struct fdt_match *mat
 	}
 
 	/* Get channel protocol version */
-	rc = mbox_chan_get_attribute(chan, RPMI_CHANNEL_ATTR_PROTOCOL_VERSION,
+	rc = mpxy_rpmi_get_attribute(rmb, RPMI_CHANNEL_ATTR_PROTOCOL_VERSION,
 				     &pro_ver);
 	if (rc)
 		goto fail_cleanup_group;
 
 	/* Get channel maximum data length */
-	rc = mbox_chan_get_attribute(chan, RPMI_CHANNEL_ATTR_MAX_DATA_LEN,
+	rc = mpxy_rpmi_get_attribute(rmb, RPMI_CHANNEL_ATTR_MAX_DATA_LEN,
 				     &max_data_len);
 	if (rc)
 		goto fail_cleanup_group;
 
 	/* Get channel Tx timeout */
-	rc = mbox_chan_get_attribute(chan, RPMI_CHANNEL_ATTR_TX_TIMEOUT,
+	rc = mpxy_rpmi_get_attribute(rmb, RPMI_CHANNEL_ATTR_TX_TIMEOUT,
 				     &tx_tout);
 	if (rc)
 		goto fail_cleanup_group;
 
 	/* Get channel Rx timeout */
-	rc = mbox_chan_get_attribute(chan, RPMI_CHANNEL_ATTR_RX_TIMEOUT,
+	rc = mpxy_rpmi_get_attribute(rmb, RPMI_CHANNEL_ATTR_RX_TIMEOUT,
 				     &rx_tout);
 	if (rc)
 		goto fail_cleanup_group;
 
 	/* Get channel service group version */
-	rc = mbox_chan_get_attribute(chan, RPMI_CHANNEL_ATTR_SERVICEGROUP_VERSION,
+	rc = mpxy_rpmi_get_attribute(rmb, RPMI_CHANNEL_ATTR_SERVICEGROUP_VERSION,
 				     &servicegrp_ver);
 	if (rc)
 		goto fail_cleanup_group;
 
 	/* Get channel implementation id */
-	rc = mbox_chan_get_attribute(chan, RPMI_CHANNEL_ATTR_IMPL_ID,
+	rc = mpxy_rpmi_get_attribute(rmb, RPMI_CHANNEL_ATTR_IMPL_ID,
 				     &impl_id);
 	if (rc)
 		goto fail_cleanup_group;
 
 	/* Get channel implementation version */
-	rc = mbox_chan_get_attribute(chan, RPMI_CHANNEL_ATTR_IMPL_VERSION,
+	rc = mpxy_rpmi_get_attribute(rmb, RPMI_CHANNEL_ATTR_IMPL_VERSION,
 				     &impl_ver);
 	if (rc)
 		goto fail_cleanup_group;
@@ -333,9 +350,6 @@ int fdt_mpxy_rpmi_init(const void *fdt, int nodeoff, const struct fdt_match *mat
 	rmb->msgprot_attrs.impl_id = impl_id;
 	rmb->msgprot_attrs.impl_ver = impl_ver;
 
-	rmb->data = data;
-	rmb->chan = chan;
-
 	/* Register RPMI service group */
 	rc = sbi_mpxy_register_channel(&rmb->channel);
 	if (rc)
-- 
2.43.0




More information about the opensbi mailing list