[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