[PATCH v4-S3 30/65] bus/fslmc: add alloc/free DPIO API for non-affine portals

Prashant Gupta prashant.gupta_3 at nxp.com
Fri Oct 23 15:43:10 CEST 2026


From: Jun Yang <jun.yang at nxp.com>

Add rte_dpaa2_alloc_dpio_device() and rte_dpaa2_free_dpio_device() to
grab and release a DPIO software portal that is not tied to a specific
CPU affinity. The allocator reserves a free portal from the DPIO list,
sets up the DQRI interrupt when the event driver is built in, and the
release helper returns the portal via dpaa2_put_qbman_swp().

This lets consumers that manage their own threading (rather than the
per-lcore affine portals) obtain a dedicated portal handle.

Signed-off-by: Jun Yang <jun.yang at nxp.com>
---
 drivers/bus/fslmc/portal/dpaa2_hw_dpio.c | 40 ++++++++++++++++++++++++
 drivers/bus/fslmc/portal/dpaa2_hw_dpio.h |  8 +++++
 2 files changed, 48 insertions(+)

diff --git a/drivers/bus/fslmc/portal/dpaa2_hw_dpio.c b/drivers/bus/fslmc/portal/dpaa2_hw_dpio.c
index 8af8600935..63e1660686 100644
--- a/drivers/bus/fslmc/portal/dpaa2_hw_dpio.c
+++ b/drivers/bus/fslmc/portal/dpaa2_hw_dpio.c
@@ -422,6 +422,46 @@ static void dpaa2_portal_finish(void *arg)
 	pthread_setspecific(dpaa2_portal_key, NULL);
 }
 
+RTE_EXPORT_INTERNAL_SYMBOL(rte_dpaa2_alloc_dpio_device)
+struct dpaa2_dpio_dev *
+rte_dpaa2_alloc_dpio_device(void)
+{
+	struct dpaa2_dpio_dev *dpio_dev = NULL;
+	uint16_t expected = 0;
+
+	/* Get DPIO dev handle from list using index */
+	TAILQ_FOREACH(dpio_dev, &dpio_dev_list, next) {
+		if (dpio_dev &&
+			rte_atomic_compare_exchange_strong_explicit(&dpio_dev->ref_count,
+			&expected, 1, rte_memory_order_acquire, rte_memory_order_relaxed))
+			break;
+	}
+	if (!dpio_dev) {
+		DPAA2_BUS_ERR("No software portal resource left");
+		return NULL;
+	}
+
+	DPAA2_BUS_DEBUG("New Portal %p (%d) affined thread - %u",
+		dpio_dev, dpio_dev->index, rte_gettid());
+
+#ifdef RTE_EVENT_DPAA2
+	if (dpaa2_dpio_intr_init(dpio_dev, 1, 0, false)) {
+		DPAA2_BUS_ERR("Interrupt registration failed for dpio");
+		rte_atomic_store_explicit(&dpio_dev->ref_count, 0,
+			rte_memory_order_release);
+		return NULL;
+	}
+#endif
+
+	return dpio_dev;
+}
+
+RTE_EXPORT_INTERNAL_SYMBOL(rte_dpaa2_free_dpio_device)
+void rte_dpaa2_free_dpio_device(struct dpaa2_dpio_dev *dpio_dev)
+{
+	dpaa2_put_qbman_swp(dpio_dev);
+}
+
 static void
 dpaa2_close_dpio_device(int object_id)
 {
diff --git a/drivers/bus/fslmc/portal/dpaa2_hw_dpio.h b/drivers/bus/fslmc/portal/dpaa2_hw_dpio.h
index 0838254437..59a9d11955 100644
--- a/drivers/bus/fslmc/portal/dpaa2_hw_dpio.h
+++ b/drivers/bus/fslmc/portal/dpaa2_hw_dpio.h
@@ -70,4 +70,12 @@ __rte_internal
 uint32_t
 dpaa2_free_eq_descriptors(void);
 
+__rte_internal
+struct dpaa2_dpio_dev *
+rte_dpaa2_alloc_dpio_device(void);
+
+__rte_internal
+void
+rte_dpaa2_free_dpio_device(struct dpaa2_dpio_dev *dpio_dev);
+
 #endif /* _DPAA2_HW_DPIO_H_ */
-- 
2.43.0



More information about the dev mailing list