[PATCH 11/11] lib: utils/mpxy: Use domain notifier for deferred creation of MPXY RPMI

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


The owner domain may not be available at the time of creating MPXY RPMI
instance so use domain notifier for deferred creation.

Signed-off-by: Anup Patel <anup.patel at oss.qualcomm.com>
---
 lib/utils/mpxy/fdt_mpxy_rpmi.c | 106 +++++++++++++++++++++++++++++++--
 1 file changed, 101 insertions(+), 5 deletions(-)

diff --git a/lib/utils/mpxy/fdt_mpxy_rpmi.c b/lib/utils/mpxy/fdt_mpxy_rpmi.c
index 69fd608a..4340b953 100644
--- a/lib/utils/mpxy/fdt_mpxy_rpmi.c
+++ b/lib/utils/mpxy/fdt_mpxy_rpmi.c
@@ -384,20 +384,92 @@ fail_free_client:
 	return rc;
 }
 
+struct __mpxy_rpmi_defer_init_priv {
+	const struct mpxy_rpmi_data *data;
+	struct mbox_chan *chan;
+	u32 mpxy_channel_id;
+	const char *dom_name;
+};
+
+static int __mpxy_rpmi_defer_notif(struct sbi_domain *dom,
+				   enum sbi_domain_notify_event event,
+				   void *priv)
+{
+	struct __mpxy_rpmi_defer_init_priv *ipriv = priv;
+	int rc;
+
+	/* Do nothing if domain name does not match */
+	if (sbi_strcmp(dom->name, ipriv->dom_name))
+		return 0;
+
+	/* Unregister notifier */
+	rc = sbi_domain_unregister_notifier(__mpxy_rpmi_defer_notif,
+					    SBI_DOMAIN_NOTIFY_EVENT_REGISTER, ipriv);
+	if (rc)
+		return rc;
+
+	/* Create MPXY RPMI instance */
+	rc = __mpxy_rpmi_init(ipriv->data, ipriv->chan, ipriv->mpxy_channel_id, dom);
+	if (rc)
+		return rc;
+
+	sbi_free(ipriv);
+	return 0;
+}
+
+static int __mpxy_rpmi_defer_init(const struct mpxy_rpmi_data *data,
+				  struct mbox_chan *chan, u32 mpxy_channel_id,
+				  const char *dom_name)
+{
+	struct __mpxy_rpmi_defer_init_priv *ipriv;
+	int rc;
+
+	if (!data || !dom_name)
+		return SBI_EINVAL;
+
+	/* Allocate defer init private data */
+	ipriv = sbi_zalloc(sizeof(*ipriv));
+	if (!ipriv)
+		return SBI_ENOMEM;
+	ipriv->data = data;
+	ipriv->chan = chan;
+	ipriv->mpxy_channel_id = mpxy_channel_id;
+	ipriv->dom_name = dom_name;
+
+	/* Register notifier */
+	rc = sbi_domain_register_notifier(__mpxy_rpmi_defer_notif,
+					  SBI_DOMAIN_NOTIFY_EVENT_REGISTER, ipriv);
+	if (rc) {
+		sbi_free(ipriv);
+		return rc;
+	}
+
+	return 0;
+}
+
 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));
+
+	struct sbi_domain *dom;
+
+	/* Direct/Deferred creation of MPXY RPMI instance with no mailbox channel */
+	dom = sbi_domain_find_by_name(dom_name);
+	if (dom)
+		return __mpxy_rpmi_init(data, NULL, mpxy_channel_id, dom);
+	else
+		return __mpxy_rpmi_defer_init(data, NULL, mpxy_channel_id, 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;
+	struct sbi_domain *dom;
+	const char *dom_name;
 	const fdt32_t *val;
+	int rc, noff, len;
 	u32 channel_id;
-	int rc, len;
 
 	/* Request mailbox channel when available */
 	val = fdt_getprop(fdt, nodeoff, "mboxes", &len);
@@ -430,8 +502,32 @@ int fdt_mpxy_rpmi_init(const void *fdt, int nodeoff, const struct fdt_match *mat
 		goto fail_free_chan;
 	}
 
-	/* Create MPXY RPMI instance with mailbox channel discovered from DT */
-	rc = __mpxy_rpmi_init(data, chan, channel_id, &root);
+	/*
+	 * The "riscv,domain" DT property is optional for MPXY RPMI
+	 * for MPXY RPMI drivers so if this is not present then assume
+	 * root domain.
+	 */
+	val = fdt_getprop(fdt, nodeoff, "riscv,domain", &len);
+	if (len > 0 && val) {
+		noff = fdt_node_offset_by_phandle(fdt, fdt32_to_cpu(*val));
+		if (noff < 0) {
+			rc = noff;
+			goto fail_free_chan;
+		}
+		dom_name = fdt_get_name(fdt, noff, NULL);
+	} else {
+		dom_name = "root";
+	}
+
+	/*
+	 * Direct/Deferred creation of MPXY RPMI instance with optional
+	 * mailbox channel discovered from DT
+	 */
+	dom = sbi_domain_find_by_name(dom_name);
+	if (dom)
+		rc = __mpxy_rpmi_init(data, chan, channel_id, dom);
+	else
+		rc = __mpxy_rpmi_defer_init(data, chan, channel_id, dom_name);
 	if (rc)
 		goto fail_free_chan;
 
-- 
2.43.0




More information about the opensbi mailing list