DPDK patches and discussions
 help / color / mirror / Atom feed
* [v1 00/10] DPAA specific fixes
@ 2025-05-28 10:39 vanshika.shukla
  2025-05-28 10:39 ` [v1 01/10] bus/dpaa: avoid using same structure and variable name vanshika.shukla
                   ` (9 more replies)
  0 siblings, 10 replies; 14+ messages in thread
From: vanshika.shukla @ 2025-05-28 10:39 UTC (permalink / raw)
  To: dev

From: Vanshika Shukla <vanshika.shukla@nxp.com>

This series includes fixes for NXP DPAA drivers.

Gagandeep Singh (1):
  bus/dpaa: improve DPAA cleanup

Hemant Agrawal (2):
  bus/dpaa: avoid using same structure and variable name
  bus/dpaa: optimize qman enqueue check

Jun Yang (5):
  bus/dpaa: add FMan node
  bus/dpaa: enhance DPAA SoC version
  bus/dpaa: optimize bman acquire/release
  mempool/dpaa: fast acquire and release
  mempool/dpaa: adjust pool element for LS1043A errata

Vanshika Shukla (1):
  net/dpaa: add devargs for enabling err packets on main queue

Vinod Pullabhatla (1):
  net/dpaa: add Tx rate limiting DPAA PMD API

 .mailmap                                  |   1 +
 doc/guides/nics/dpaa.rst                  |   3 +
 drivers/bus/dpaa/base/fman/fman.c         | 278 ++++++++++++---------
 drivers/bus/dpaa/base/fman/netcfg_layer.c |   8 +-
 drivers/bus/dpaa/base/qbman/bman.c        | 149 +++++++++--
 drivers/bus/dpaa/base/qbman/qman.c        |  50 ++--
 drivers/bus/dpaa/base/qbman/qman_driver.c |   2 -
 drivers/bus/dpaa/bus_dpaa_driver.h        |   9 +-
 drivers/bus/dpaa/dpaa_bus.c               | 179 +++++++++----
 drivers/bus/dpaa/include/fman.h           |  40 +--
 drivers/bus/dpaa/include/fsl_bman.h       |  20 +-
 drivers/bus/dpaa/include/fsl_qman.h       |   2 +-
 drivers/bus/dpaa/include/netcfg.h         |  14 --
 drivers/mempool/dpaa/dpaa_mempool.c       | 230 +++++++++++++----
 drivers/mempool/dpaa/dpaa_mempool.h       |  13 +-
 drivers/net/dpaa/dpaa_ethdev.c            | 291 +++++++++++++++-------
 drivers/net/dpaa/dpaa_flow.c              |  87 ++++++-
 drivers/net/dpaa/dpaa_ptp.c               |  12 +-
 drivers/net/dpaa/dpaa_rxtx.c              |   4 +-
 drivers/net/dpaa/fmlib/fm_lib.c           |  30 +++
 drivers/net/dpaa/fmlib/fm_port_ext.h      |   2 +-
 drivers/net/dpaa/rte_pmd_dpaa.h           |  21 +-
 22 files changed, 1022 insertions(+), 423 deletions(-)

-- 
2.25.1


^ permalink raw reply	[flat|nested] 14+ messages in thread

* [v1 01/10] bus/dpaa: avoid using same structure and variable name
  2025-05-28 10:39 [v1 00/10] DPAA specific fixes vanshika.shukla
@ 2025-05-28 10:39 ` vanshika.shukla
  2025-05-28 10:39 ` [v1 02/10] bus/dpaa: add FMan node vanshika.shukla
                   ` (8 subsequent siblings)
  9 siblings, 0 replies; 14+ messages in thread
From: vanshika.shukla @ 2025-05-28 10:39 UTC (permalink / raw)
  To: dev, Hemant Agrawal, Sachin Saxena; +Cc: Jun Yang

From: Hemant Agrawal <hemant.agrawal@nxp.com>

rte_dpaa_bus was being used as structure and variable name both.

Signed-off-by: Jun Yang <jun.yang@nxp.com>
Signed-off-by: Hemant Agrawal <hemant.agrawal@nxp.com>
---
 drivers/bus/dpaa/dpaa_bus.c | 56 ++++++++++++++++++-------------------
 1 file changed, 28 insertions(+), 28 deletions(-)

diff --git a/drivers/bus/dpaa/dpaa_bus.c b/drivers/bus/dpaa/dpaa_bus.c
index 5420733019..f5ce4a2761 100644
--- a/drivers/bus/dpaa/dpaa_bus.c
+++ b/drivers/bus/dpaa/dpaa_bus.c
@@ -54,7 +54,7 @@ struct rte_dpaa_bus {
 	int detected;
 };
 
-static struct rte_dpaa_bus rte_dpaa_bus;
+static struct rte_dpaa_bus s_rte_dpaa_bus;
 struct netcfg_info *dpaa_netcfg;
 
 /* define a variable to hold the portal_key, once created.*/
@@ -120,7 +120,7 @@ dpaa_add_to_device_list(struct rte_dpaa_device *newdev)
 	struct rte_dpaa_device *dev = NULL;
 	struct rte_dpaa_device *tdev = NULL;
 
-	RTE_TAILQ_FOREACH_SAFE(dev, &rte_dpaa_bus.device_list, next, tdev) {
+	RTE_TAILQ_FOREACH_SAFE(dev, &s_rte_dpaa_bus.device_list, next, tdev) {
 		comp = compare_dpaa_devices(newdev, dev);
 		if (comp < 0) {
 			TAILQ_INSERT_BEFORE(dev, newdev, next);
@@ -130,7 +130,7 @@ dpaa_add_to_device_list(struct rte_dpaa_device *newdev)
 	}
 
 	if (!inserted)
-		TAILQ_INSERT_TAIL(&rte_dpaa_bus.device_list, newdev, next);
+		TAILQ_INSERT_TAIL(&s_rte_dpaa_bus.device_list, newdev, next);
 }
 
 /*
@@ -176,7 +176,7 @@ dpaa_create_device_list(void)
 	struct fm_eth_port_cfg *cfg;
 	struct fman_if *fman_intf;
 
-	rte_dpaa_bus.device_count = 0;
+	s_rte_dpaa_bus.device_count = 0;
 
 	/* Creating Ethernet Devices */
 	for (i = 0; dpaa_netcfg && (i < dpaa_netcfg->num_ethports); i++) {
@@ -187,7 +187,7 @@ dpaa_create_device_list(void)
 			goto cleanup;
 		}
 
-		dev->device.bus = &rte_dpaa_bus.bus;
+		dev->device.bus = &s_rte_dpaa_bus.bus;
 		dev->device.numa_node = SOCKET_ID_ANY;
 
 		/* Allocate interrupt handle instance */
@@ -226,7 +226,7 @@ dpaa_create_device_list(void)
 		dpaa_add_to_device_list(dev);
 	}
 
-	rte_dpaa_bus.device_count += i;
+	s_rte_dpaa_bus.device_count += i;
 
 	/* Unlike case of ETH, RTE_LIBRTE_DPAA_MAX_CRYPTODEV SEC devices are
 	 * constantly created only if "sec" property is found in the device
@@ -259,7 +259,7 @@ dpaa_create_device_list(void)
 		}
 
 		dev->device_type = FSL_DPAA_CRYPTO;
-		dev->id.dev_id = rte_dpaa_bus.device_count + i;
+		dev->id.dev_id = s_rte_dpaa_bus.device_count + i;
 
 		/* Even though RTE_CRYPTODEV_NAME_MAX_LEN is valid length of
 		 * crypto PMD, using RTE_ETH_NAME_MAX_LEN as that is the size
@@ -274,7 +274,7 @@ dpaa_create_device_list(void)
 		dpaa_add_to_device_list(dev);
 	}
 
-	rte_dpaa_bus.device_count += i;
+	s_rte_dpaa_bus.device_count += i;
 
 qdma_dpaa:
 	/* Creating QDMA Device */
@@ -287,7 +287,7 @@ dpaa_create_device_list(void)
 		}
 
 		dev->device_type = FSL_DPAA_QDMA;
-		dev->id.dev_id = rte_dpaa_bus.device_count + i;
+		dev->id.dev_id = s_rte_dpaa_bus.device_count + i;
 
 		memset(dev->name, 0, RTE_ETH_NAME_MAX_LEN);
 		sprintf(dev->name, "dpaa_qdma-%d", i+1);
@@ -297,7 +297,7 @@ dpaa_create_device_list(void)
 
 		dpaa_add_to_device_list(dev);
 	}
-	rte_dpaa_bus.device_count += i;
+	s_rte_dpaa_bus.device_count += i;
 
 	return 0;
 
@@ -312,8 +312,8 @@ dpaa_clean_device_list(void)
 	struct rte_dpaa_device *dev = NULL;
 	struct rte_dpaa_device *tdev = NULL;
 
-	RTE_TAILQ_FOREACH_SAFE(dev, &rte_dpaa_bus.device_list, next, tdev) {
-		TAILQ_REMOVE(&rte_dpaa_bus.device_list, dev, next);
+	RTE_TAILQ_FOREACH_SAFE(dev, &s_rte_dpaa_bus.device_list, next, tdev) {
+		TAILQ_REMOVE(&s_rte_dpaa_bus.device_list, dev, next);
 		rte_intr_instance_free(dev->intr_handle);
 		free(dev);
 		dev = NULL;
@@ -537,10 +537,10 @@ rte_dpaa_bus_scan(void)
 		return 0;
 	}
 
-	if (rte_dpaa_bus.detected)
+	if (s_rte_dpaa_bus.detected)
 		return 0;
 
-	rte_dpaa_bus.detected = 1;
+	s_rte_dpaa_bus.detected = 1;
 
 	/* create the key, supplying a function that'll be invoked
 	 * when a portal affined thread will be deleted.
@@ -564,7 +564,7 @@ rte_dpaa_driver_register(struct rte_dpaa_driver *driver)
 
 	BUS_INIT_FUNC_TRACE();
 
-	TAILQ_INSERT_TAIL(&rte_dpaa_bus.driver_list, driver, next);
+	TAILQ_INSERT_TAIL(&s_rte_dpaa_bus.driver_list, driver, next);
 }
 
 /* un-register a dpaa bus based dpaa driver */
@@ -574,7 +574,7 @@ rte_dpaa_driver_unregister(struct rte_dpaa_driver *driver)
 {
 	BUS_INIT_FUNC_TRACE();
 
-	TAILQ_REMOVE(&rte_dpaa_bus.driver_list, driver, next);
+	TAILQ_REMOVE(&s_rte_dpaa_bus.driver_list, driver, next);
 }
 
 static int
@@ -663,11 +663,11 @@ rte_dpaa_bus_probe(void)
 	struct rte_dpaa_driver *drv;
 	FILE *svr_file = NULL;
 	unsigned int svr_ver;
-	int probe_all = rte_dpaa_bus.bus.conf.scan_mode != RTE_BUS_SCAN_ALLOWLIST;
+	int probe_all = s_rte_dpaa_bus.bus.conf.scan_mode != RTE_BUS_SCAN_ALLOWLIST;
 	static int process_once;
 
 	/* If DPAA bus is not present nothing needs to be done */
-	if (!rte_dpaa_bus.detected)
+	if (!s_rte_dpaa_bus.detected)
 		return 0;
 
 	/* Device list creation is only done once */
@@ -690,7 +690,7 @@ rte_dpaa_bus_probe(void)
 	process_once = 1;
 
 	/* If no device present on DPAA bus nothing needs to be done */
-	if (TAILQ_EMPTY(&rte_dpaa_bus.device_list))
+	if (TAILQ_EMPTY(&s_rte_dpaa_bus.device_list))
 		return 0;
 
 	/* Register DPAA mempool ops only if any DPAA device has
@@ -705,7 +705,7 @@ rte_dpaa_bus_probe(void)
 		fclose(svr_file);
 	}
 
-	TAILQ_FOREACH(dev, &rte_dpaa_bus.device_list, next) {
+	TAILQ_FOREACH(dev, &s_rte_dpaa_bus.device_list, next) {
 		if (dev->device_type == FSL_DPAA_ETH) {
 			ret = rte_dpaa_setup_intr(dev->intr_handle);
 			if (ret)
@@ -717,8 +717,8 @@ rte_dpaa_bus_probe(void)
 	dpaax_iova_table_populate();
 
 	/* For each registered driver, and device, call the driver->probe */
-	TAILQ_FOREACH(dev, &rte_dpaa_bus.device_list, next) {
-		TAILQ_FOREACH(drv, &rte_dpaa_bus.driver_list, next) {
+	TAILQ_FOREACH(dev, &s_rte_dpaa_bus.device_list, next) {
+		TAILQ_FOREACH(drv, &s_rte_dpaa_bus.driver_list, next) {
 			ret = rte_dpaa_device_match(drv, dev);
 			if (ret)
 				continue;
@@ -765,7 +765,7 @@ rte_dpaa_find_device(const struct rte_device *start, rte_dev_cmp_t cmp,
 		dstart = RTE_DEV_TO_DPAA_CONST(start);
 		dev = TAILQ_NEXT(dstart, next);
 	} else {
-		dev = TAILQ_FIRST(&rte_dpaa_bus.device_list);
+		dev = TAILQ_FIRST(&s_rte_dpaa_bus.device_list);
 	}
 
 	while (dev != NULL) {
@@ -838,7 +838,7 @@ dpaa_bus_dev_iterate(const void *start, const char *str,
 		dstart = RTE_DEV_TO_DPAA_CONST(start);
 		dev = TAILQ_NEXT(dstart, next);
 	} else {
-		dev = TAILQ_FIRST(&rte_dpaa_bus.device_list);
+		dev = TAILQ_FIRST(&s_rte_dpaa_bus.device_list);
 	}
 
 	while (dev != NULL) {
@@ -853,7 +853,7 @@ dpaa_bus_dev_iterate(const void *start, const char *str,
 	return NULL;
 }
 
-static struct rte_dpaa_bus rte_dpaa_bus = {
+static struct rte_dpaa_bus s_rte_dpaa_bus = {
 	.bus = {
 		.scan = rte_dpaa_bus_scan,
 		.probe = rte_dpaa_bus_probe,
@@ -864,10 +864,10 @@ static struct rte_dpaa_bus rte_dpaa_bus = {
 		.unplug = dpaa_bus_unplug,
 		.dev_iterate = dpaa_bus_dev_iterate,
 	},
-	.device_list = TAILQ_HEAD_INITIALIZER(rte_dpaa_bus.device_list),
-	.driver_list = TAILQ_HEAD_INITIALIZER(rte_dpaa_bus.driver_list),
+	.device_list = TAILQ_HEAD_INITIALIZER(s_rte_dpaa_bus.device_list),
+	.driver_list = TAILQ_HEAD_INITIALIZER(s_rte_dpaa_bus.driver_list),
 	.device_count = 0,
 };
 
-RTE_REGISTER_BUS(FSL_DPAA_BUS_NAME, rte_dpaa_bus.bus);
+RTE_REGISTER_BUS(FSL_DPAA_BUS_NAME, s_rte_dpaa_bus.bus);
 RTE_LOG_REGISTER_DEFAULT(dpaa_logtype_bus, NOTICE);
-- 
2.25.1


^ permalink raw reply	[flat|nested] 14+ messages in thread

* [v1 02/10] bus/dpaa: add FMan node
  2025-05-28 10:39 [v1 00/10] DPAA specific fixes vanshika.shukla
  2025-05-28 10:39 ` [v1 01/10] bus/dpaa: avoid using same structure and variable name vanshika.shukla
@ 2025-05-28 10:39 ` vanshika.shukla
  2025-05-28 10:39 ` [v1 03/10] bus/dpaa: enhance DPAA SoC version vanshika.shukla
                   ` (7 subsequent siblings)
  9 siblings, 0 replies; 14+ messages in thread
From: vanshika.shukla @ 2025-05-28 10:39 UTC (permalink / raw)
  To: dev, Hemant Agrawal, Sachin Saxena; +Cc: Jun Yang

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

Add FMan node(s) and associate FMan to it's interface(port).
This method describes FMan attributes and avoid accessing FMan from
port directly.
Logically, something like IEEE 1588 is FMan global resource,
which is in range of 0xF_E000–0xF_EFFF.
Port specific resource is in range of 0x8_0000–0xB_FFFF.

Signed-off-by: Jun Yang <jun.yang@nxp.com>
---
 drivers/bus/dpaa/base/fman/fman.c         | 278 ++++++++++++----------
 drivers/bus/dpaa/base/fman/netcfg_layer.c |   8 +-
 drivers/bus/dpaa/dpaa_bus.c               |  17 +-
 drivers/bus/dpaa/include/fman.h           |  40 ++--
 drivers/bus/dpaa/include/netcfg.h         |  14 --
 drivers/net/dpaa/dpaa_ethdev.c            |  18 +-
 drivers/net/dpaa/dpaa_ptp.c               |  12 +-
 7 files changed, 206 insertions(+), 181 deletions(-)

diff --git a/drivers/bus/dpaa/base/fman/fman.c b/drivers/bus/dpaa/base/fman/fman.c
index d49339d81e..1b3b8836a5 100644
--- a/drivers/bus/dpaa/base/fman/fman.c
+++ b/drivers/bus/dpaa/base/fman/fman.c
@@ -16,24 +16,15 @@
 #include <rte_dpaa_logs.h>
 #include <rte_string_fns.h>
 
-#define QMI_PORT_REGS_OFFSET		0x400
-
-/* CCSR map address to access ccsr based register */
-void *fman_ccsr_map;
-/* fman version info */
-u16 fman_ip_rev;
-static int get_once;
-u32 fman_dealloc_bufs_mask_hi;
-u32 fman_dealloc_bufs_mask_lo;
-
 int fman_ccsr_map_fd = -1;
 static COMPAT_LIST_HEAD(__ifs);
-void *rtc_map;
+static COMPAT_LIST_HEAD(__fmans);
 
 /* This is the (const) global variable that callers have read-only access to.
  * Internally, we have read-write access directly to __ifs.
  */
 const struct list_head *fman_if_list = &__ifs;
+const struct list_head *fman_list = &__fmans;
 
 static void
 if_destructor(struct __fman_if *__if)
@@ -55,40 +46,99 @@ if_destructor(struct __fman_if *__if)
 }
 
 static int
-fman_get_ip_rev(const struct device_node *fman_node)
+_fman_init(const struct device_node *fman_node, int fd)
 {
-	const uint32_t *fman_addr;
-	uint64_t phys_addr;
-	uint64_t regs_size;
+	const struct device_node *ptp_node;
+	const uint32_t *fman_addr, *ptp_addr, *cell_idx;
+	uint64_t phys_addr, regs_size, lenp;
+	void *vir_addr;
 	uint32_t ip_rev_1;
-	int _errno;
+	int _errno = 0;
+	struct __fman *fman;
+
+	fman = rte_zmalloc(NULL, sizeof(struct __fman), 0);
+	if (!fman) {
+		FMAN_ERR(-ENOMEM, "malloc fman");
+		return -ENOMEM;
+	}
+
+	cell_idx = of_get_property(fman_node, "cell-index", &lenp);
+	if (!cell_idx) {
+		FMAN_ERR(-ENXIO, "%s: no cell-index", fman_node->full_name);
+		return -ENXIO;
+	}
+	assert(lenp == sizeof(*cell_idx));
+	fman->idx = of_read_number(cell_idx, lenp / sizeof(phandle));
 
 	fman_addr = of_get_address(fman_node, 0, &regs_size, NULL);
 	if (!fman_addr) {
-		pr_err("of_get_address cannot return fman address\n");
+		FMAN_ERR(-EINVAL, "Get fman's CCSR failed");
 		return -EINVAL;
 	}
 	phys_addr = of_translate_address(fman_node, fman_addr);
 	if (!phys_addr) {
-		pr_err("of_translate_address failed\n");
+		FMAN_ERR(-EINVAL, "Translate fman's CCSR failed");
 		return -EINVAL;
 	}
-	fman_ccsr_map = mmap(NULL, regs_size, PROT_READ | PROT_WRITE,
-			     MAP_SHARED, fman_ccsr_map_fd, phys_addr);
-	if (fman_ccsr_map == MAP_FAILED) {
-		pr_err("Can not map FMan ccsr base");
+	vir_addr = mmap(NULL, regs_size, PROT_READ | PROT_WRITE,
+		MAP_SHARED, fd, phys_addr);
+	if (vir_addr == MAP_FAILED) {
+		FMAN_ERR(-EINVAL, "Map fman's CCSR failed");
 		return -EINVAL;
 	}
+	fman->ccsr_phy = phys_addr;
+	fman->ccsr_size = regs_size;
+	fman->ccsr_vir = vir_addr;
+
+	fman->time_phy = 0;
+	for_each_compatible_node(ptp_node, NULL, "fsl,fman-ptp-timer") {
+		ptp_addr = of_get_address(ptp_node, 0, &regs_size, NULL);
+		if (!ptp_addr)
+			continue;
+		phys_addr = of_translate_address(ptp_node, ptp_addr);
+		if (phys_addr != (fman->ccsr_phy + fman->ccsr_size))
+			continue;
+		vir_addr = mmap(NULL, regs_size, PROT_READ | PROT_WRITE,
+			MAP_SHARED, fd, phys_addr);
+		if (vir_addr == MAP_FAILED) {
+			FMAN_ERR(-EINVAL, "Map fman's IEEE 1588 failed");
+			return -EINVAL;
+		}
+		fman->time_phy = phys_addr;
+		fman->time_size = regs_size;
+		fman->time_vir = vir_addr;
+		break;
+	}
 
-	ip_rev_1 = in_be32(fman_ccsr_map + FMAN_IP_REV_1);
-	fman_ip_rev = (ip_rev_1 & FMAN_IP_REV_1_MAJOR_MASK) >>
-			FMAN_IP_REV_1_MAJOR_SHIFT;
+	if (!fman->time_phy) {
+		FMAN_ERR(-EINVAL, "Map fman's IEEE 1588 failed");
+		return -EINVAL;
+	}
 
-	_errno = munmap(fman_ccsr_map, regs_size);
-	if (_errno)
-		pr_err("munmap() of FMan ccsr failed");
+	ip_rev_1 = in_be32((uint8_t *)fman->ccsr_vir + FMAN_IP_REV_1);
+	fman->ip_rev = ip_rev_1 >> FMAN_IP_REV_1_MAJOR_SHIFT;
+	fman->ip_rev &=	FMAN_IP_REV_1_MAJOR_MASK;
+	DPAA_BUS_LOG(NOTICE, "FMan version is 0x%02x", fman->ip_rev);
 
-	return 0;
+	if (fman->ip_rev >= FMAN_V3) {
+		/*
+		 * Set A2V, OVOM, EBD bits in contextA to allow external
+		 * buffer deallocation by fman.
+		 */
+		fman->dealloc_bufs_mask_hi =
+			DPAA_FQD_CTX_A_A2_FIELD_VALID |
+			DPAA_FQD_CTX_A_OVERRIDE_OMB;
+		fman->dealloc_bufs_mask_lo = DPAA_FQD_CTX_A2_EBD_BIT;
+	} else {
+		fman->dealloc_bufs_mask_hi = 0;
+		fman->dealloc_bufs_mask_lo = 0;
+	}
+
+	fman->fman_node = fman_node;
+
+	list_add_tail(&fman->node, &__fmans);
+
+	return _errno;
 }
 
 static int
@@ -227,7 +277,7 @@ static void fman_if_vsp_init(struct __fman_if *__if)
 }
 
 static int
-fman_if_init(const struct device_node *dpa_node)
+fman_if_init(const struct device_node *dpa_node, int fd)
 {
 	const char *rprop, *mprop;
 	uint64_t phys_addr;
@@ -251,12 +301,13 @@ fman_if_init(const struct device_node *dpa_node)
 	const struct device_node *rx_node = NULL, *tx_node = NULL;
 	const struct device_node *oh_node = NULL;
 	const uint32_t *regs_addr = NULL;
-	const char *mname, *fname;
+	const char *mname;
 	const char *dname = dpa_node->full_name;
 	size_t lenp;
-	int _errno, is_shared = 0, is_offline = 0;
+	int _errno, is_shared = 0, is_offline = 0, find_fman = false;
 	const char *char_prop;
 	uint32_t na;
+	struct __fman *fman, *tmp_fman;
 
 	if (of_device_is_available(dpa_node) == false)
 		return 0;
@@ -414,8 +465,7 @@ fman_if_init(const struct device_node *dpa_node)
 		goto err;
 	}
 	__if->ccsr_map = mmap(NULL, __if->regs_size,
-			      PROT_READ | PROT_WRITE, MAP_SHARED,
-			      fman_ccsr_map_fd, phys_addr);
+		PROT_READ | PROT_WRITE, MAP_SHARED, fd, phys_addr);
 	if (__if->ccsr_map == MAP_FAILED) {
 		FMAN_ERR(-errno, "mmap(0x%"PRIx64")", phys_addr);
 		goto err;
@@ -426,51 +476,24 @@ fman_if_init(const struct device_node *dpa_node)
 
 	/* Get the index of the Fman this i/f belongs to */
 	fman_node = of_get_parent(mac_node);
-	na = of_n_addr_cells(mac_node);
-	if (!fman_node) {
-		FMAN_ERR(-ENXIO, "of_get_parent(%s)", mname);
-		goto err;
+	list_for_each_entry_safe(fman, tmp_fman, &__fmans, node) {
+		if (fman_node == fman->fman_node) {
+			find_fman = true;
+			break;
+		}
 	}
-	fname = fman_node->full_name;
-	cell_idx = of_get_property(fman_node, "cell-index", &lenp);
-	if (!cell_idx) {
-		FMAN_ERR(-ENXIO, "%s: no cell-index)", fname);
+	if (!find_fman) {
+		FMAN_ERR(-ENXIO, "Failed to get parent of %s", mname);
 		goto err;
 	}
-	assert(lenp == sizeof(*cell_idx));
-	cell_idx_host = of_read_number(cell_idx, lenp / sizeof(phandle));
-	__if->__if.fman_idx = cell_idx_host;
-	if (!get_once) {
-		_errno = fman_get_ip_rev(fman_node);
-		if (_errno) {
-			FMAN_ERR(-ENXIO, "%s: ip_rev is not available",
-				 fname);
-			goto err;
-		}
-	}
+	__if->__if.fman = fman;
 
-	if (fman_ip_rev >= FMAN_V3) {
-		/*
-		 * Set A2V, OVOM, EBD bits in contextA to allow external
-		 * buffer deallocation by fman.
-		 */
-		fman_dealloc_bufs_mask_hi = DPAA_FQD_CTX_A_A2_FIELD_VALID |
-					    DPAA_FQD_CTX_A_OVERRIDE_OMB;
-		fman_dealloc_bufs_mask_lo = DPAA_FQD_CTX_A2_EBD_BIT;
-	} else {
-		fman_dealloc_bufs_mask_hi = 0;
-		fman_dealloc_bufs_mask_lo = 0;
-	}
 	/* Is the MAC node 1G, 2.5G, 10G or offline? */
 	__if->__if.is_memac = 0;
 
-	if (is_offline)
+	if (is_offline) {
 		__if->__if.mac_type = fman_offline_internal;
-	else if (of_device_is_compatible(mac_node, "fsl,fman-1g-mac"))
-		__if->__if.mac_type = fman_mac_1g;
-	else if (of_device_is_compatible(mac_node, "fsl,fman-10g-mac"))
-		__if->__if.mac_type = fman_mac_10g;
-	else if (of_device_is_compatible(mac_node, "fsl,fman-memac")) {
+	} else if (of_device_is_compatible(mac_node, "fsl,fman-memac")) {
 		__if->__if.is_memac = 1;
 		char_prop = of_get_property(mac_node, "phy-connection-type",
 					    NULL);
@@ -490,7 +513,7 @@ fman_if_init(const struct device_node *dpa_node)
 				__if->__if.mac_type = fman_mac_10g;
 		}
 	} else {
-		FMAN_ERR(-EINVAL, "%s: unknown MAC type", mname);
+		FMAN_ERR(-ENOTSUP, "%s: Unsupported MAC type", mname);
 		goto err;
 	}
 
@@ -574,9 +597,9 @@ fman_if_init(const struct device_node *dpa_node)
 			 mname, regs_addr);
 		goto err;
 	}
+
 	__if->bmi_map = mmap(NULL, __if->regs_size,
-				 PROT_READ | PROT_WRITE, MAP_SHARED,
-				 fman_ccsr_map_fd, phys_addr);
+		PROT_READ | PROT_WRITE, MAP_SHARED, fd, phys_addr);
 	if (__if->bmi_map == MAP_FAILED) {
 		FMAN_ERR(-errno, "mmap(0x%"PRIx64")", phys_addr);
 		goto err;
@@ -597,28 +620,13 @@ fman_if_init(const struct device_node *dpa_node)
 		}
 
 		__if->tx_bmi_map = mmap(NULL, __if->regs_size,
-					PROT_READ | PROT_WRITE, MAP_SHARED,
-					fman_ccsr_map_fd, phys_addr);
+			PROT_READ | PROT_WRITE, MAP_SHARED, fd, phys_addr);
 		if (__if->tx_bmi_map == MAP_FAILED) {
 			FMAN_ERR(-errno, "mmap(0x%"PRIx64")", phys_addr);
 			goto err;
 		}
 	}
 
-	if (!rtc_map) {
-		__if->rtc_map = mmap(NULL, FMAN_IEEE_1588_SIZE,
-				PROT_READ | PROT_WRITE, MAP_SHARED,
-				fman_ccsr_map_fd, FMAN_IEEE_1588_OFFSET);
-		if (__if->rtc_map == MAP_FAILED) {
-			pr_err("Can not map FMan RTC regs base\n");
-			_errno = -EINVAL;
-			goto err;
-		}
-		rtc_map = __if->rtc_map;
-	} else {
-		__if->rtc_map = rtc_map;
-	}
-
 	/* Extract the Rx FQIDs. (Note, the device representation is silly,
 	 * there are "counts" that must always be 1.)
 	 */
@@ -788,7 +796,7 @@ fman_if_init(const struct device_node *dpa_node)
 	/* Parsing of the network interface is complete, add it to the list */
 	DPAA_BUS_LOG(DEBUG, "Found %s, Tx Channel = %x, FMAN = %x,"
 		    "Port ID = %x",
-		    dname, __if->__if.tx_channel_id, __if->__if.fman_idx,
+		    dname, __if->__if.tx_channel_id, __if->__if.fman->idx,
 		    __if->__if.mac_idx);
 
 	/* Don't add OH port to the port list since they will be used by ONIC
@@ -823,6 +831,8 @@ static int fman_if_init_onic(const struct device_node *dpa_node)
 	uint32_t na = OF_DEFAULT_NA;
 	uint64_t rx_phandle_host[4] = {0};
 	uint64_t cell_idx_host = 0;
+	struct __fman *fman, *tmp_fman;
+	int find_fman = false;
 
 	if (of_device_is_available(dpa_node) == false)
 		return 0;
@@ -950,15 +960,18 @@ static int fman_if_init_onic(const struct device_node *dpa_node)
 	__if->__if.mac_idx = cell_idx_host;
 
 	fman_node = of_get_parent(fman_tx_oh_node);
-	cell_idx = of_get_property(fman_node, "cell-index", &lenp);
-	if (!cell_idx) {
-		FMAN_ERR(-ENXIO, "%s: no cell-index)", tx_oh_node->full_name);
+	list_for_each_entry_safe(fman, tmp_fman, &__fmans, node) {
+		if (fman_node == fman->fman_node) {
+			find_fman = true;
+			break;
+		}
+	}
+	if (!find_fman) {
+		FMAN_ERR(-ENXIO, "Failed to get parent of %s",
+			fman_tx_oh_node->full_name);
 		goto err;
 	}
-	assert(lenp == sizeof(*cell_idx));
-
-	cell_idx_host = of_read_number(cell_idx, lenp / sizeof(phandle));
-	__if->__if.fman_idx = cell_idx_host;
+	__if->__if.fman = fman;
 
 	rx_phandle = of_get_property(tx_oh_node, "fsl,qman-frame-queues-oh",
 				     &lenp);
@@ -1075,7 +1088,7 @@ static int fman_if_init_onic(const struct device_node *dpa_node)
 	/* Parsing of the network interface is complete, add it to the list. */
 	DPAA_BUS_DEBUG("Found %s, Tx Channel = %x, FMAN = %x, Port ID = %x",
 		       dpa_node->full_name, __if->__if.tx_channel_id,
-		       __if->__if.fman_idx, __if->__if.mac_idx);
+		       __if->__if.fman->idx, __if->__if.mac_idx);
 
 	list_add_tail(&__if->__if.node, &__ifs);
 	return 0;
@@ -1087,20 +1100,18 @@ static int fman_if_init_onic(const struct device_node *dpa_node)
 int
 fman_init(void)
 {
-	const struct device_node *dpa_node, *parent_node;
-	int _errno;
+	const struct device_node *dpa_node, *parent_node, *fman_node;
+	int _errno, fd, ret;
 
-	/* If multiple dependencies try to initialise the Fman driver, don't
-	 * panic.
-	 */
-	if (fman_ccsr_map_fd != -1)
+	if (fman_ccsr_map_fd >= 0)
 		return 0;
 
-	fman_ccsr_map_fd = open(FMAN_DEVICE_PATH, O_RDWR);
-	if (unlikely(fman_ccsr_map_fd < 0)) {
-		DPAA_BUS_LOG(ERR, "Unable to open (/dev/mem)");
-		return fman_ccsr_map_fd;
+	fd = open(FMAN_DEVICE_PATH, O_RDWR);
+	if (unlikely(fd < 0)) {
+		DPAA_BUS_LOG(ERR, "Unable to open (%s)", FMAN_DEVICE_PATH);
+		return fd;
 	}
+	fman_ccsr_map_fd = fd;
 
 	parent_node = of_find_compatible_node(NULL, NULL, "fsl,dpaa");
 	if (!parent_node) {
@@ -1108,11 +1119,17 @@ fman_init(void)
 		return -ENODEV;
 	}
 
+	for_each_compatible_node(fman_node, NULL, "fsl,fman") {
+		ret = _fman_init(fman_node, fd);
+		if (ret)
+			return ret;
+	}
+
 	for_each_child_node(parent_node, dpa_node) {
-		_errno = fman_if_init(dpa_node);
+		_errno = fman_if_init(dpa_node, fd);
 		if (_errno) {
 			FMAN_ERR(_errno, "if_init(%s)", dpa_node->full_name);
-			goto err;
+			return _errno;
 		}
 	}
 
@@ -1124,33 +1141,36 @@ fman_init(void)
 	}
 
 	return 0;
-err:
-	fman_finish();
-	return _errno;
 }
 
 void
 fman_finish(void)
 {
 	struct __fman_if *__if, *tmpif;
+	struct __fman *fman, *tmpfman;
+	int _errno;
+	struct memac_regs *regs;
+	uint32_t cfg;
 
 	assert(fman_ccsr_map_fd != -1);
 
 	list_for_each_entry_safe(__if, tmpif, &__ifs, __if.node) {
-		int _errno;
-
 		/* No need to disable Offline port */
 		if (__if->__if.mac_type == fman_offline_internal)
 			continue;
 
+		if (!__if->__if.is_memac) {
+			DPAA_BUS_ERR("FM%d-MAC%d's MAC is not memac!",
+				__if->__if.fman->idx, __if->__if.mac_idx);
+			continue;
+		}
+
 		/* disable Rx and Tx */
-		if ((__if->__if.mac_type == fman_mac_1g) &&
-		    (!__if->__if.is_memac))
-			out_be32(__if->ccsr_map + 0x100,
-				 in_be32(__if->ccsr_map + 0x100) & ~(u32)0x5);
-		else
-			out_be32(__if->ccsr_map + 8,
-				 in_be32(__if->ccsr_map + 8) & ~(u32)3);
+		regs = __if->ccsr_map;
+		cfg = in_be32(&regs->command_config);
+		out_be32(&regs->command_config,
+			cfg & (~(MEMAC_RX_ENABLE | MEMAC_TX_ENABLE)));
+
 		/* release the mapping */
 		_errno = munmap(__if->ccsr_map, __if->regs_size);
 		if (unlikely(_errno < 0))
@@ -1160,6 +1180,18 @@ fman_finish(void)
 		rte_free(__if);
 	}
 
+	list_for_each_entry_safe(fman, tmpfman, &__fmans, node) {
+		/* release the mapping */
+		_errno = munmap(fman->ccsr_vir, fman->ccsr_size);
+		if (unlikely(_errno < 0))
+			FMAN_ERR(_errno, "munmap() = (%s)", strerror(errno));
+		_errno = munmap(fman->time_vir, fman->time_size);
+		if (unlikely(_errno < 0))
+			FMAN_ERR(_errno, "munmap() = (%s)", strerror(errno));
+		list_del(&fman->node);
+		rte_free(fman);
+	}
+
 	close(fman_ccsr_map_fd);
 	fman_ccsr_map_fd = -1;
 }
diff --git a/drivers/bus/dpaa/base/fman/netcfg_layer.c b/drivers/bus/dpaa/base/fman/netcfg_layer.c
index ffb37825c2..4cc9cb815c 100644
--- a/drivers/bus/dpaa/base/fman/netcfg_layer.c
+++ b/drivers/bus/dpaa/base/fman/netcfg_layer.c
@@ -43,10 +43,10 @@ dump_netcfg(struct netcfg_info *cfg_ptr, FILE *f)
 		struct fman_if *__if = p_cfg->fman_if;
 
 		fprintf(f, "\n+ Fman %d, MAC %d (%s);\n",
-		       __if->fman_idx, __if->mac_idx,
-		       (__if->mac_type == fman_offline_internal) ? "OFFLINE" :
-		       (__if->mac_type == fman_mac_1g) ? "1G" :
-		       (__if->mac_type == fman_mac_2_5g) ? "2.5G" : "10G");
+			__if->fman->idx, __if->mac_idx,
+			(__if->mac_type == fman_offline_internal) ? "OFFLINE" :
+			(__if->mac_type == fman_mac_1g) ? "1G" :
+			(__if->mac_type == fman_mac_2_5g) ? "2.5G" : "10G");
 
 		fprintf(f, "\tmac_addr: " RTE_ETHER_ADDR_PRT_FMT "\n",
 		       RTE_ETHER_ADDR_BYTES(&__if->mac_addr));
diff --git a/drivers/bus/dpaa/dpaa_bus.c b/drivers/bus/dpaa/dpaa_bus.c
index f5ce4a2761..ed1f77bab7 100644
--- a/drivers/bus/dpaa/dpaa_bus.c
+++ b/drivers/bus/dpaa/dpaa_bus.c
@@ -55,7 +55,7 @@ struct rte_dpaa_bus {
 };
 
 static struct rte_dpaa_bus s_rte_dpaa_bus;
-struct netcfg_info *dpaa_netcfg;
+static struct netcfg_info *dpaa_netcfg;
 
 /* define a variable to hold the portal_key, once created.*/
 static pthread_key_t dpaa_portal_key;
@@ -204,22 +204,23 @@ dpaa_create_device_list(void)
 		fman_intf = cfg->fman_if;
 
 		/* Device identifiers */
-		dev->id.fman_id = fman_intf->fman_idx + 1;
+		dev->id.fman_id = fman_intf->fman->idx + 1;
 		dev->id.mac_id = fman_intf->mac_idx;
 		dev->device_type = FSL_DPAA_ETH;
 		dev->id.dev_id = i;
 
 		/* Create device name */
 		memset(dev->name, 0, RTE_ETH_NAME_MAX_LEN);
-		if (fman_intf->mac_type == fman_offline_internal)
+		if (fman_intf->mac_type == fman_offline_internal) {
 			sprintf(dev->name, "fm%d-oh%d",
-				(fman_intf->fman_idx + 1), fman_intf->mac_idx);
-		else if (fman_intf->mac_type == fman_onic)
+				(fman_intf->fman->idx + 1), fman_intf->mac_idx);
+		} else if (fman_intf->mac_type == fman_onic) {
 			sprintf(dev->name, "fm%d-onic%d",
-				(fman_intf->fman_idx + 1), fman_intf->mac_idx);
-		else
+				(fman_intf->fman->idx + 1), fman_intf->mac_idx);
+		} else {
 			sprintf(dev->name, "fm%d-mac%d",
-				(fman_intf->fman_idx + 1), fman_intf->mac_idx);
+				(fman_intf->fman->idx + 1), fman_intf->mac_idx);
+		}
 		dev->device.name = dev->name;
 		dev->device.devargs = dpaa_devargs_lookup(dev);
 
diff --git a/drivers/bus/dpaa/include/fman.h b/drivers/bus/dpaa/include/fman.h
index 134f0dc8ff..4d4a7c1756 100644
--- a/drivers/bus/dpaa/include/fman.h
+++ b/drivers/bus/dpaa/include/fman.h
@@ -2,7 +2,7 @@
  *
  * Copyright 2010-2012 Freescale Semiconductor, Inc.
  * All rights reserved.
- * Copyright 2019-2023 NXP
+ * Copyright 2019-2024 NXP
  *
  */
 
@@ -67,14 +67,6 @@
 #define FMAN_RTC_MAX_NUM_OF_ALARMS		3
 #define FMAN_RTC_MAX_NUM_OF_PERIODIC_PULSES	4
 #define FMAN_RTC_MAX_NUM_OF_EXT_TRIGGERS	3
-#define FMAN_IEEE_1588_OFFSET			0X1AFE000
-#define FMAN_IEEE_1588_SIZE			4096
-
-/* Pre definitions of FMAN interface and Bpool structures */
-struct __fman_if;
-struct fman_if_bpool;
-/* Lists of fman interfaces and bpools */
-TAILQ_HEAD(rte_fman_if_list, __fman_if);
 
 /* Represents the different flavour of network interface */
 enum fman_mac_type {
@@ -90,6 +82,8 @@ struct mac_addr {
 	uint32_t   mac_addr_u;	/**< Upper 16 bits of 48-bit MAC address */
 };
 
+#define MEMAC_RX_ENABLE ((uint32_t)0x2)
+#define MEMAC_TX_ENABLE ((uint32_t)0x1)
 struct memac_regs {
 	/* General Control and Status */
 	uint32_t res0000[2];
@@ -381,7 +375,7 @@ struct onic_port_cfg {
  */
 struct fman_if {
 	/* Which Fman this interface belongs to */
-	uint8_t fman_idx;
+	struct __fman *fman;
 	/* The type/speed of the interface */
 	enum fman_mac_type mac_type;
 	/* Boolean, set when mac type is memac */
@@ -441,6 +435,24 @@ struct fman_if_ic_params {
 	uint16_t icsz;
 };
 
+#define FMAN_ADDRESS_NUM 2
+struct __fman {
+	const struct device_node *fman_node;
+	uint64_t ccsr_phy;
+	uint64_t ccsr_size;
+	void *ccsr_vir;
+
+	uint64_t time_phy;
+	uint64_t time_size;
+	void *time_vir;
+
+	uint8_t idx;
+	uint32_t ip_rev;
+	uint32_t dealloc_bufs_mask_hi;
+	uint32_t dealloc_bufs_mask_lo;
+	struct list_head node;
+};
+
 /* The exported "struct fman_if" type contains the subset of fields we want
  * exposed. This struct is embedded in a larger "struct __fman_if" which
  * contains the extra bits we *don't* want exposed.
@@ -453,9 +465,7 @@ struct __fman_if {
 	void *ccsr_map;
 	void *bmi_map;
 	void *tx_bmi_map;
-	void *rtc_map;
 	void *qmi_map;
-	struct list_head node;
 };
 
 /* And this is the base list node that the interfaces are added to. (See
@@ -484,7 +494,7 @@ extern int fman_ccsr_map_fd;
 	} while (0)
 
 #define FMAN_IP_REV_1	0xC30C4
-#define FMAN_IP_REV_1_MAJOR_MASK 0x0000FF00
+#define FMAN_IP_REV_1_MAJOR_MASK 0xff
 #define FMAN_IP_REV_1_MAJOR_SHIFT 8
 #define FMAN_V3	0x06
 
@@ -511,10 +521,6 @@ extern int fman_ccsr_map_fd;
 #define DPAA_FQD_CTX_A2_RESERVED_BIT	(0x02 << DPAA_FQD_CTX_A_SHIFT_BITS)
 #define DPAA_FQD_CTX_A2_VSPE_BIT	(0x01 << DPAA_FQD_CTX_A_SHIFT_BITS)
 
-extern u16 fman_ip_rev;
-extern u32 fman_dealloc_bufs_mask_hi;
-extern u32 fman_dealloc_bufs_mask_lo;
-
 /**
  * Initialize the FMAN driver
  *
diff --git a/drivers/bus/dpaa/include/netcfg.h b/drivers/bus/dpaa/include/netcfg.h
index ebbbaf6d10..4a902670fc 100644
--- a/drivers/bus/dpaa/include/netcfg.h
+++ b/drivers/bus/dpaa/include/netcfg.h
@@ -29,20 +29,6 @@ struct netcfg_info {
 	/**< Variable structure array of size num_ethports */
 };
 
-struct interface_info {
-	char *name;
-	struct rte_ether_addr mac_addr;
-	struct rte_ether_addr peer_mac;
-	int mac_present;
-	int fman_enabled_mac_interface;
-};
-
-struct netcfg_interface {
-	uint8_t numof_netcfg_interface;
-	uint8_t numof_fman_enabled_macless;
-	struct interface_info interface_info[];
-};
-
 /* pcd_file: FMC netpcd XML ("policy") file, that contains PCD information.
  * cfg_file: FMC config XML file
  * Returns the configuration information in newly allocated memory.
diff --git a/drivers/net/dpaa/dpaa_ethdev.c b/drivers/net/dpaa/dpaa_ethdev.c
index 00b57cb715..66d62485af 100644
--- a/drivers/net/dpaa/dpaa_ethdev.c
+++ b/drivers/net/dpaa/dpaa_ethdev.c
@@ -593,10 +593,11 @@ static int dpaa_eth_dev_close(struct rte_eth_dev *dev)
 }
 
 static int
-dpaa_fw_version_get(struct rte_eth_dev *dev __rte_unused,
+dpaa_fw_version_get(struct rte_eth_dev *dev,
 		     char *fw_version,
 		     size_t fw_size)
 {
+	struct fman_if *fif = dev->process_private;
 	int ret;
 	FILE *svr_file = NULL;
 	unsigned int svr_ver = 0;
@@ -616,7 +617,7 @@ dpaa_fw_version_get(struct rte_eth_dev *dev __rte_unused,
 	fclose(svr_file);
 
 	ret = snprintf(fw_version, fw_size, "SVR:%x-fman-v%x",
-		       svr_ver, fman_ip_rev);
+		       svr_ver, fif->fman->ip_rev);
 	if (ret < 0)
 		return -EINVAL;
 
@@ -1954,15 +1955,18 @@ static int dpaa_tx_queue_init(struct qman_fq *fq,
 	opts.fqd.context_b = 0;
 	if (dpaa_ieee_1588) {
 		opts.fqd.context_a.lo = 0;
-		opts.fqd.context_a.hi = fman_dealloc_bufs_mask_hi;
+		opts.fqd.context_a.hi =
+			fman_intf->fman->dealloc_bufs_mask_hi;
 	} else {
 		/* no tx-confirmation */
-		opts.fqd.context_a.lo = fman_dealloc_bufs_mask_lo;
-		opts.fqd.context_a.hi = DPAA_FQD_CTX_A_OVERRIDE_FQ |
-					fman_dealloc_bufs_mask_hi;
+		opts.fqd.context_a.lo =
+			fman_intf->fman->dealloc_bufs_mask_lo;
+		opts.fqd.context_a.hi =
+			DPAA_FQD_CTX_A_OVERRIDE_FQ |
+			fman_intf->fman->dealloc_bufs_mask_hi;
 	}
 
-	if (fman_ip_rev >= FMAN_V3)
+	if (fman_intf->fman->ip_rev >= FMAN_V3)
 		/* Set B0V bit in contextA to set ASPID to 0 */
 		opts.fqd.context_a.hi |= DPAA_FQD_CTX_A_B0_FIELD_VALID;
 
diff --git a/drivers/net/dpaa/dpaa_ptp.c b/drivers/net/dpaa/dpaa_ptp.c
index 48e29e22eb..8482666745 100644
--- a/drivers/net/dpaa/dpaa_ptp.c
+++ b/drivers/net/dpaa/dpaa_ptp.c
@@ -33,15 +33,13 @@ dpaa_timesync_read_time(struct rte_eth_dev *dev,
 					struct timespec *timestamp)
 {
 	uint32_t *tmr_cnt_h, *tmr_cnt_l;
-	struct __fman_if *__fif;
 	struct fman_if *fif;
 	uint64_t time;
 
 	fif = dev->process_private;
-	__fif = container_of(fif, struct __fman_if, __if);
 
-	tmr_cnt_h = &((struct rtc_regs *)__fif->rtc_map)->tmr_cnt_h;
-	tmr_cnt_l = &((struct rtc_regs *)__fif->rtc_map)->tmr_cnt_l;
+	tmr_cnt_h = &((struct rtc_regs *)fif->fman->time_vir)->tmr_cnt_h;
+	tmr_cnt_l = &((struct rtc_regs *)fif->fman->time_vir)->tmr_cnt_l;
 
 	time = (uint64_t)in_be32(tmr_cnt_l);
 	time |= ((uint64_t)in_be32(tmr_cnt_h) << 32);
@@ -55,15 +53,13 @@ dpaa_timesync_write_time(struct rte_eth_dev *dev,
 					const struct timespec *ts)
 {
 	uint32_t *tmr_cnt_h, *tmr_cnt_l;
-	struct __fman_if *__fif;
 	struct fman_if *fif;
 	uint64_t time;
 
 	fif = dev->process_private;
-	__fif = container_of(fif, struct __fman_if, __if);
 
-	tmr_cnt_h = &((struct rtc_regs *)__fif->rtc_map)->tmr_cnt_h;
-	tmr_cnt_l = &((struct rtc_regs *)__fif->rtc_map)->tmr_cnt_l;
+	tmr_cnt_h = &((struct rtc_regs *)fif->fman->time_vir)->tmr_cnt_h;
+	tmr_cnt_l = &((struct rtc_regs *)fif->fman->time_vir)->tmr_cnt_l;
 
 	time = rte_timespec_to_ns(ts);
 
-- 
2.25.1


^ permalink raw reply	[flat|nested] 14+ messages in thread

* [v1 03/10] bus/dpaa: enhance DPAA SoC version
  2025-05-28 10:39 [v1 00/10] DPAA specific fixes vanshika.shukla
  2025-05-28 10:39 ` [v1 01/10] bus/dpaa: avoid using same structure and variable name vanshika.shukla
  2025-05-28 10:39 ` [v1 02/10] bus/dpaa: add FMan node vanshika.shukla
@ 2025-05-28 10:39 ` vanshika.shukla
  2025-05-28 14:28   ` Stephen Hemminger
  2025-05-28 10:39 ` [v1 04/10] bus/dpaa: optimize bman acquire/release vanshika.shukla
                   ` (6 subsequent siblings)
  9 siblings, 1 reply; 14+ messages in thread
From: vanshika.shukla @ 2025-05-28 10:39 UTC (permalink / raw)
  To: dev, Hemant Agrawal, Sachin Saxena; +Cc: Jun Yang

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

Provide internal API to identify DPAA1 SoC version instead of accessing
global variable directly.

Signed-off-by: Jun Yang <jun.yang@nxp.com>
---
 drivers/bus/dpaa/base/qbman/qman.c |  9 +++---
 drivers/bus/dpaa/bus_dpaa_driver.h |  9 +++---
 drivers/bus/dpaa/dpaa_bus.c        | 48 ++++++++++++++++++++++--------
 drivers/net/dpaa/dpaa_ethdev.c     | 29 +++++-------------
 drivers/net/dpaa/dpaa_rxtx.c       |  4 +--
 5 files changed, 54 insertions(+), 45 deletions(-)

diff --git a/drivers/bus/dpaa/base/qbman/qman.c b/drivers/bus/dpaa/base/qbman/qman.c
index 11fabcaff5..fbce0638b7 100644
--- a/drivers/bus/dpaa/base/qbman/qman.c
+++ b/drivers/bus/dpaa/base/qbman/qman.c
@@ -1,7 +1,7 @@
 /* SPDX-License-Identifier: (BSD-3-Clause OR GPL-2.0)
  *
  * Copyright 2008-2016 Freescale Semiconductor Inc.
- * Copyright 2017,2019-2024 NXP
+ * Copyright 2017,2019-2025 NXP
  *
  */
 
@@ -520,11 +520,12 @@ qman_init_portal(struct qman_portal *portal,
 	if (!c)
 		c = portal->config;
 
-	if (dpaa_svr_family == SVR_LS1043A_FAMILY)
+	if (dpaa_soc_ver() == SVR_LS1043A_FAMILY) {
 		portal->use_eqcr_ci_stashing = 3;
-	else
+	} else {
 		portal->use_eqcr_ci_stashing =
-					((qman_ip_rev >= QMAN_REV30) ? 1 : 0);
+			(qman_ip_rev >= QMAN_REV30 ? 1 : 0);
+	}
 
 	/*
 	 * prep the low-level portal struct with the mapped addresses from the
diff --git a/drivers/bus/dpaa/bus_dpaa_driver.h b/drivers/bus/dpaa/bus_dpaa_driver.h
index 26a83b2cdf..d64a8e80e0 100644
--- a/drivers/bus/dpaa/bus_dpaa_driver.h
+++ b/drivers/bus/dpaa/bus_dpaa_driver.h
@@ -1,6 +1,6 @@
 /* SPDX-License-Identifier: BSD-3-Clause
  *
- *   Copyright 2017-2022 NXP
+ *   Copyright 2017-2022, 2025 NXP
  *
  */
 #ifndef BUS_DPAA_DRIVER_H
@@ -55,11 +55,9 @@ dpaa_seqn(struct rte_mbuf *mbuf)
 /* DPAA SoC identifier; If this is not available, it can be concluded
  * that board is non-DPAA. Single slot is currently supported.
  */
-#define DPAA_SOC_ID_FILE	"/sys/devices/soc0/soc_id"
 
 #define SVR_LS1043A_FAMILY	0x87920000
 #define SVR_LS1046A_FAMILY	0x87070000
-#define SVR_MASK		0xffff0000
 
 /** Device driver supports link state interrupt */
 #define RTE_DPAA_DRV_INTR_LSC  0x0008
@@ -70,8 +68,6 @@ dpaa_seqn(struct rte_mbuf *mbuf)
 #define RTE_DEV_TO_DPAA_CONST(ptr) \
 	container_of(ptr, const struct rte_dpaa_device, device)
 
-extern unsigned int dpaa_svr_family;
-
 struct rte_dpaa_device;
 struct rte_dpaa_driver;
 
@@ -250,6 +246,9 @@ RTE_PMD_EXPORT_NAME(nm, __COUNTER__)
 __rte_internal
 struct fm_eth_port_cfg *dpaa_get_eth_port_cfg(int dev_id);
 
+__rte_internal
+uint32_t dpaa_soc_ver(void);
+
 #ifdef __cplusplus
 }
 #endif
diff --git a/drivers/bus/dpaa/dpaa_bus.c b/drivers/bus/dpaa/dpaa_bus.c
index ed1f77bab7..7abc2235e7 100644
--- a/drivers/bus/dpaa/dpaa_bus.c
+++ b/drivers/bus/dpaa/dpaa_bus.c
@@ -1,6 +1,6 @@
 /* SPDX-License-Identifier: BSD-3-Clause
  *
- *   Copyright 2017-2020 NXP
+ * Copyright 2017-2025 NXP
  *
  */
 /* System headers */
@@ -46,12 +46,16 @@
 #include <netcfg.h>
 #include <fman.h>
 
+#define DPAA_SOC_ID_FILE	"/sys/devices/soc0/soc_id"
+#define DPAA_SVR_MASK 0xffff0000
+
 struct rte_dpaa_bus {
 	struct rte_bus bus;
 	TAILQ_HEAD(, rte_dpaa_device) device_list;
 	TAILQ_HEAD(, rte_dpaa_driver) driver_list;
 	int device_count;
 	int detected;
+	uint32_t svr_ver;
 };
 
 static struct rte_dpaa_bus s_rte_dpaa_bus;
@@ -60,9 +64,6 @@ static struct netcfg_info *dpaa_netcfg;
 /* define a variable to hold the portal_key, once created.*/
 static pthread_key_t dpaa_portal_key;
 
-RTE_EXPORT_INTERNAL_SYMBOL(dpaa_svr_family)
-unsigned int dpaa_svr_family;
-
 #define FSL_DPAA_BUS_NAME	dpaa_bus
 
 RTE_EXPORT_INTERNAL_SYMBOL(per_lcore_dpaa_io)
@@ -73,6 +74,13 @@ RTE_EXPORT_INTERNAL_SYMBOL(dpaa_seqn_dynfield_offset)
 int dpaa_seqn_dynfield_offset = -1;
 
 RTE_EXPORT_INTERNAL_SYMBOL(dpaa_get_eth_port_cfg)
+
+RTE_EXPORT_INTERNAL_SYMBOL(dpaa_soc_ver)
+uint32_t dpaa_soc_ver(void)
+{
+	return s_rte_dpaa_bus.svr_ver;
+}
+
 struct fm_eth_port_cfg *
 dpaa_get_eth_port_cfg(int dev_id)
 {
@@ -663,7 +671,7 @@ rte_dpaa_bus_probe(void)
 	struct rte_dpaa_device *dev;
 	struct rte_dpaa_driver *drv;
 	FILE *svr_file = NULL;
-	unsigned int svr_ver;
+	uint32_t svr_ver;
 	int probe_all = s_rte_dpaa_bus.bus.conf.scan_mode != RTE_BUS_SCAN_ALLOWLIST;
 	static int process_once;
 
@@ -671,6 +679,29 @@ rte_dpaa_bus_probe(void)
 	if (!s_rte_dpaa_bus.detected)
 		return 0;
 
+	if (s_rte_dpaa_bus.bus.conf.scan_mode != RTE_BUS_SCAN_ALLOWLIST)
+		probe_all = true;
+
+	svr_file = fopen(DPAA_SOC_ID_FILE, "r");
+	if (svr_file) {
+		if (fscanf(svr_file, "svr:%x", &svr_ver) > 0)
+			s_rte_dpaa_bus.svr_ver = svr_ver & DPAA_SVR_MASK;
+		else
+			s_rte_dpaa_bus.svr_ver = 0;
+		fclose(svr_file);
+	} else {
+		s_rte_dpaa_bus.svr_ver = 0;
+	}
+	if (s_rte_dpaa_bus.svr_ver == SVR_LS1046A_FAMILY) {
+		DPAA_BUS_LOG(NOTICE, "This is LS1046A family SoC.");
+	} else if (s_rte_dpaa_bus.svr_ver == SVR_LS1043A_FAMILY) {
+		DPAA_BUS_LOG(NOTICE, "This is LS1043A family SoC.");
+	} else {
+		DPAA_BUS_LOG(WARNING,
+			"This is Unknown(%08x) DPAA1 family SoC.",
+			s_rte_dpaa_bus.svr_ver);
+	}
+
 	/* Device list creation is only done once */
 	if (!process_once) {
 		rte_dpaa_bus_dev_build();
@@ -699,13 +730,6 @@ rte_dpaa_bus_probe(void)
 	 */
 	rte_mbuf_set_platform_mempool_ops(DPAA_MEMPOOL_OPS_NAME);
 
-	svr_file = fopen(DPAA_SOC_ID_FILE, "r");
-	if (svr_file) {
-		if (fscanf(svr_file, "svr:%x", &svr_ver) > 0)
-			dpaa_svr_family = svr_ver & SVR_MASK;
-		fclose(svr_file);
-	}
-
 	TAILQ_FOREACH(dev, &s_rte_dpaa_bus.device_list, next) {
 		if (dev->device_type == FSL_DPAA_ETH) {
 			ret = rte_dpaa_setup_intr(dev->intr_handle);
diff --git a/drivers/net/dpaa/dpaa_ethdev.c b/drivers/net/dpaa/dpaa_ethdev.c
index 66d62485af..7d0f830204 100644
--- a/drivers/net/dpaa/dpaa_ethdev.c
+++ b/drivers/net/dpaa/dpaa_ethdev.c
@@ -1,7 +1,7 @@
 /* SPDX-License-Identifier: BSD-3-Clause
  *
  *   Copyright 2016 Freescale Semiconductor, Inc. All rights reserved.
- *   Copyright 2017-2020,2022-2024 NXP
+ *   Copyright 2017-2020,2022-2025 NXP
  *
  */
 /* System headers */
@@ -173,7 +173,7 @@ dpaa_poll_queue_default_config(struct qm_mcc_initfq *opts)
 	opts->fqd.fq_ctrl = QM_FQCTRL_AVOIDBLOCK | QM_FQCTRL_CTXASTASHING |
 			   QM_FQCTRL_PREFERINCACHE;
 	opts->fqd.context_a.stashing.exclusive = 0;
-	if (dpaa_svr_family != SVR_LS1046A_FAMILY)
+	if (dpaa_soc_ver() != SVR_LS1046A_FAMILY)
 		opts->fqd.context_a.stashing.annotation_cl =
 						DPAA_IF_RX_ANNOTATION_STASH;
 	opts->fqd.context_a.stashing.data_cl = DPAA_IF_RX_DATA_STASH;
@@ -594,30 +594,15 @@ static int dpaa_eth_dev_close(struct rte_eth_dev *dev)
 
 static int
 dpaa_fw_version_get(struct rte_eth_dev *dev,
-		     char *fw_version,
-		     size_t fw_size)
+	char *fw_version, size_t fw_size)
 {
 	struct fman_if *fif = dev->process_private;
 	int ret;
-	FILE *svr_file = NULL;
-	unsigned int svr_ver = 0;
 
 	PMD_INIT_FUNC_TRACE();
 
-	svr_file = fopen(DPAA_SOC_ID_FILE, "r");
-	if (!svr_file) {
-		DPAA_PMD_ERR("Unable to open SoC device");
-		return -ENOTSUP; /* Not supported on this infra */
-	}
-	if (fscanf(svr_file, "svr:%x", &svr_ver) > 0)
-		dpaa_svr_family = svr_ver & SVR_MASK;
-	else
-		DPAA_PMD_ERR("Unable to read SoC device");
-
-	fclose(svr_file);
-
 	ret = snprintf(fw_version, fw_size, "SVR:%x-fman-v%x",
-		       svr_ver, fif->fman->ip_rev);
+			dpaa_soc_ver(), fif->fman->ip_rev);
 	if (ret < 0)
 		return -EINVAL;
 
@@ -1190,7 +1175,7 @@ int dpaa_eth_rx_queue_setup(struct rte_eth_dev *dev, uint16_t queue_idx,
 		/* In multicore scenario stashing becomes a bottleneck on LS1046.
 		 * So do not enable stashing in this case
 		 */
-		if (dpaa_svr_family != SVR_LS1046A_FAMILY)
+		if (dpaa_soc_ver() != SVR_LS1046A_FAMILY)
 			opts.fqd.context_a.stashing.annotation_cl =
 						DPAA_IF_RX_ANNOTATION_STASH;
 		opts.fqd.context_a.stashing.data_cl = DPAA_IF_RX_DATA_STASH;
@@ -1218,7 +1203,7 @@ int dpaa_eth_rx_queue_setup(struct rte_eth_dev *dev, uint16_t queue_idx,
 				"ret:%d(%s)", rxq->fqid, ret, strerror(ret));
 			return ret;
 		}
-		if (dpaa_svr_family == SVR_LS1043A_FAMILY) {
+		if (dpaa_soc_ver() == SVR_LS1043A_FAMILY) {
 			rxq->cb.dqrr_dpdk_pull_cb = dpaa_rx_cb_no_prefetch;
 		} else {
 			rxq->cb.dqrr_dpdk_pull_cb = dpaa_rx_cb;
@@ -2520,7 +2505,7 @@ rte_dpaa_probe(struct rte_dpaa_driver *dpaa_drv,
 		}
 
 		/* disabling the default push mode for LS1043 */
-		if (dpaa_svr_family == SVR_LS1043A_FAMILY)
+		if (dpaa_soc_ver() == SVR_LS1043A_FAMILY)
 			dpaa_push_mode_max_queue = 0;
 
 		/* if push mode queues to be enabled. Currently we are allowing
diff --git a/drivers/net/dpaa/dpaa_rxtx.c b/drivers/net/dpaa/dpaa_rxtx.c
index 05bd73becf..4dca63ea7e 100644
--- a/drivers/net/dpaa/dpaa_rxtx.c
+++ b/drivers/net/dpaa/dpaa_rxtx.c
@@ -1,7 +1,7 @@
 /* SPDX-License-Identifier: BSD-3-Clause
  *
  *   Copyright 2016 Freescale Semiconductor, Inc. All rights reserved.
- *   Copyright 2017,2019-2024 NXP
+ *   Copyright 2017,2019-2025 NXP
  *
  */
 
@@ -1268,7 +1268,7 @@ dpaa_eth_ls1043a_mbuf_realloc(struct rte_mbuf *mbuf)
 {
 	uint64_t len, offset;
 
-	if (dpaa_svr_family != SVR_LS1043A_FAMILY)
+	if (dpaa_soc_ver() != SVR_LS1043A_FAMILY)
 		return 0;
 
 	while (mbuf) {
-- 
2.25.1


^ permalink raw reply	[flat|nested] 14+ messages in thread

* [v1 04/10] bus/dpaa: optimize bman acquire/release
  2025-05-28 10:39 [v1 00/10] DPAA specific fixes vanshika.shukla
                   ` (2 preceding siblings ...)
  2025-05-28 10:39 ` [v1 03/10] bus/dpaa: enhance DPAA SoC version vanshika.shukla
@ 2025-05-28 10:39 ` vanshika.shukla
  2025-05-28 14:30   ` Stephen Hemminger
  2025-05-28 10:39 ` [v1 05/10] mempool/dpaa: fast acquire and release vanshika.shukla
                   ` (5 subsequent siblings)
  9 siblings, 1 reply; 14+ messages in thread
From: vanshika.shukla @ 2025-05-28 10:39 UTC (permalink / raw)
  To: dev, Hemant Agrawal, Sachin Saxena; +Cc: Jun Yang

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

1) Reduce byte swap between big endian and little endian.
2) Reduce ci(cache invalid) access by 128bit R/W instructions.
These methods improve ~10% buffer acquire/release performance.

Signed-off-by: Jun Yang <jun.yang@nxp.com>
---
 drivers/bus/dpaa/base/qbman/bman.c  | 149 ++++++++++++++++++++++++----
 drivers/bus/dpaa/include/fsl_bman.h |  20 +++-
 2 files changed, 150 insertions(+), 19 deletions(-)

diff --git a/drivers/bus/dpaa/base/qbman/bman.c b/drivers/bus/dpaa/base/qbman/bman.c
index 8a6290734f..13f535a679 100644
--- a/drivers/bus/dpaa/base/qbman/bman.c
+++ b/drivers/bus/dpaa/base/qbman/bman.c
@@ -1,18 +1,38 @@
 /* SPDX-License-Identifier: (BSD-3-Clause OR GPL-2.0)
  *
  * Copyright 2008-2016 Freescale Semiconductor Inc.
- * Copyright 2017 NXP
+ * Copyright 2017, 2024 NXP
  *
  */
+#include <rte_memcpy.h>
+#include <rte_branch_prediction.h>
+#include <eal_export.h>
 
 #include "bman.h"
-#include <rte_branch_prediction.h>
 
 /* Compilation constants */
 #define RCR_THRESH	2	/* reread h/w CI when running out of space */
 #define IRQNAME		"BMan portal %d"
 #define MAX_IRQNAME	16	/* big enough for "BMan portal %d" */
 
+#ifndef MAX_U16
+#define MAX_U16 0xffff
+#endif
+#ifndef BIT_SIZE
+#define BIT_SIZE(t) (sizeof(t) * 8)
+#endif
+#ifndef MAX_U32
+#define MAX_U32 \
+	((((uint32_t)MAX_U16) << BIT_SIZE(uint16_t)) | MAX_U16)
+#endif
+#define MAX_U48 \
+	((((uint64_t)MAX_U16) << BIT_SIZE(uint32_t)) | MAX_U32)
+#define HI16_OF_U48(x) \
+	(((x) >> BIT_SIZE(rte_be32_t)) & MAX_U16)
+#define LO32_OF_U48(x) ((x) & MAX_U32)
+#define U48_BY_HI16_LO32(hi, lo) \
+	(((hi) << BIT_SIZE(uint32_t)) | (lo))
+
 struct bman_portal {
 	struct bm_portal p;
 	/* 2-element array. pools[0] is mask, pools[1] is snapshot. */
@@ -246,7 +266,52 @@ static void update_rcr_ci(struct bman_portal *p, int avail)
 		bm_rcr_cce_update(&p->p);
 }
 
-#define BMAN_BUF_MASK 0x0000fffffffffffful
+RTE_EXPORT_INTERNAL_SYMBOL(bman_release_fast)
+int
+bman_release_fast(struct bman_pool *pool, const uint64_t *bufs,
+	uint8_t num)
+{
+	struct bman_portal *p;
+	struct bm_rcr_entry *r;
+	uint8_t i, avail;
+	uint64_t bpid = pool->params.bpid;
+	struct bm_hw_buf_desc bm_bufs[FSL_BM_BURST_MAX];
+
+#ifdef RTE_LIBRTE_DPAA_HWDEBUG
+	if (!num || (num > FSL_BM_BURST_MAX))
+		return -EINVAL;
+	if (pool->params.flags & BMAN_POOL_FLAG_NO_RELEASE)
+		return -EINVAL;
+#endif
+
+	p = get_affine_portal();
+	avail = bm_rcr_get_avail(&p->p);
+	if (avail < 2)
+		update_rcr_ci(p, avail);
+	r = bm_rcr_start(&p->p);
+	if (unlikely(!r))
+		return -EBUSY;
+
+	/*
+	 * we can copy all but the first entry, as this can trigger badness
+	 * with the valid-bit
+	 */
+	bm_bufs[0].bpid = bpid;
+	bm_bufs[0].hi_addr = cpu_to_be16(HI16_OF_U48(bufs[0]));
+	bm_bufs[0].lo_addr = cpu_to_be32(LO32_OF_U48(bufs[0]));
+	for (i = 1; i < num; i++) {
+		bm_bufs[i].hi_addr = cpu_to_be16(HI16_OF_U48(bufs[i]));
+		bm_bufs[i].lo_addr = cpu_to_be32(LO32_OF_U48(bufs[i]));
+	}
+
+	rte_memcpy(r->bufs, bm_bufs, sizeof(struct bm_buffer) * num);
+
+	bm_rcr_pvb_commit(&p->p, BM_RCR_VERB_CMD_BPID_SINGLE |
+		(num & BM_RCR_VERB_BUFCOUNT_MASK));
+
+	return 0;
+}
+
 int bman_release(struct bman_pool *pool, const struct bm_buffer *bufs, u8 num,
 		 u32 flags __maybe_unused)
 {
@@ -256,7 +321,7 @@ int bman_release(struct bman_pool *pool, const struct bm_buffer *bufs, u8 num,
 	u8 avail;
 
 #ifdef RTE_LIBRTE_DPAA_HWDEBUG
-	if (!num || (num > 8))
+	if (!num || (num > FSL_BM_BURST_MAX))
 		return -EINVAL;
 	if (pool->params.flags & BMAN_POOL_FLAG_NO_RELEASE)
 		return -EINVAL;
@@ -276,11 +341,11 @@ int bman_release(struct bman_pool *pool, const struct bm_buffer *bufs, u8 num,
 	 */
 	r->bufs[0].opaque =
 		cpu_to_be64(((u64)pool->params.bpid << 48) |
-			    (bufs[0].opaque & BMAN_BUF_MASK));
+			    (bufs[0].opaque & MAX_U48));
 	if (i) {
 		for (i = 1; i < num; i++)
 			r->bufs[i].opaque =
-				cpu_to_be64(bufs[i].opaque & BMAN_BUF_MASK);
+				cpu_to_be64(bufs[i].opaque & MAX_U48);
 	}
 
 	bm_rcr_pvb_commit(&p->p, BM_RCR_VERB_CMD_BPID_SINGLE |
@@ -289,16 +354,70 @@ int bman_release(struct bman_pool *pool, const struct bm_buffer *bufs, u8 num,
 	return 0;
 }
 
+static inline uint64_t
+bman_extract_addr(struct bm_buffer *buf)
+{
+	buf->opaque = be64_to_cpu(buf->opaque);
+
+	return buf->addr;
+}
+
+static inline uint64_t
+bman_hw_extract_addr(struct bm_hw_buf_desc *buf)
+{
+	uint64_t hi, lo;
+
+	hi = be16_to_cpu(buf->hi_addr);
+	lo = be32_to_cpu(buf->lo_addr);
+	return U48_BY_HI16_LO32(hi, lo);
+}
+
+RTE_EXPORT_INTERNAL_SYMBOL(bman_acquire_fast)
+int
+bman_acquire_fast(struct bman_pool *pool, uint64_t *bufs, uint8_t num)
+{
+	struct bman_portal *p = get_affine_portal();
+	struct bm_mc_command *mcc;
+	struct bm_mc_result *mcr;
+	uint8_t i, rst;
+	struct bm_hw_buf_desc bm_bufs[FSL_BM_BURST_MAX];
+
+#ifdef RTE_LIBRTE_DPAA_HWDEBUG
+	if (!num || (num > FSL_BM_BURST_MAX))
+		return -EINVAL;
+	if (pool->params.flags & BMAN_POOL_FLAG_ONLY_RELEASE)
+		return -EINVAL;
+#endif
+
+	mcc = bm_mc_start(&p->p);
+	mcc->acquire.bpid = pool->params.bpid;
+	bm_mc_commit(&p->p, BM_MCC_VERB_CMD_ACQUIRE |
+			(num & BM_MCC_VERB_ACQUIRE_BUFCOUNT));
+	while (!(mcr = bm_mc_result(&p->p)))
+		;
+	rst = mcr->verb & BM_MCR_VERB_ACQUIRE_BUFCOUNT;
+	if (unlikely(!rst))
+		return 0;
+
+	rte_memcpy(bm_bufs, mcr->acquire.bufs,
+		sizeof(struct bm_buffer) * rst);
+
+	for (i = 0; i < rst; i++)
+		bufs[i] = bman_hw_extract_addr(&bm_bufs[i]);
+
+	return rst;
+}
+
 int bman_acquire(struct bman_pool *pool, struct bm_buffer *bufs, u8 num,
 		 u32 flags __maybe_unused)
 {
 	struct bman_portal *p = get_affine_portal();
 	struct bm_mc_command *mcc;
 	struct bm_mc_result *mcr;
-	int ret, i;
+	uint8_t rst, i;
 
 #ifdef RTE_LIBRTE_DPAA_HWDEBUG
-	if (!num || (num > 8))
+	if (!num || (num > FSL_BM_BURST_MAX))
 		return -EINVAL;
 	if (pool->params.flags & BMAN_POOL_FLAG_ONLY_RELEASE)
 		return -EINVAL;
@@ -310,15 +429,11 @@ int bman_acquire(struct bman_pool *pool, struct bm_buffer *bufs, u8 num,
 			(num & BM_MCC_VERB_ACQUIRE_BUFCOUNT));
 	while (!(mcr = bm_mc_result(&p->p)))
 		cpu_relax();
-	ret = mcr->verb & BM_MCR_VERB_ACQUIRE_BUFCOUNT;
-	if (bufs) {
-		for (i = 0; i < num; i++)
-			bufs[i].opaque =
-				be64_to_cpu(mcr->acquire.bufs[i].opaque);
-	}
-	if (ret != num)
-		ret = -ENOMEM;
-	return ret;
+	rst = mcr->verb & BM_MCR_VERB_ACQUIRE_BUFCOUNT;
+	for (i = 0; i < rst; i++)
+		bufs[i].opaque = be64_to_cpu(mcr->acquire.bufs[i].opaque);
+
+	return rst;
 }
 
 int bman_query_pools(struct bm_pool_state *state)
diff --git a/drivers/bus/dpaa/include/fsl_bman.h b/drivers/bus/dpaa/include/fsl_bman.h
index c0760149e1..5ee9533434 100644
--- a/drivers/bus/dpaa/include/fsl_bman.h
+++ b/drivers/bus/dpaa/include/fsl_bman.h
@@ -1,6 +1,7 @@
 /* SPDX-License-Identifier: (BSD-3-Clause OR GPL-2.0)
  *
  * Copyright 2008-2012 Freescale Semiconductor, Inc.
+ * Copyright 2024 NXP
  *
  */
 
@@ -68,6 +69,14 @@ struct __rte_aligned(8) bm_buffer {
 		u64 opaque;
 	};
 };
+
+struct __rte_packed bm_hw_buf_desc {
+	uint8_t rsv;
+	uint8_t bpid;
+	rte_be16_t hi_addr; /* High 16-bits of 48-bit address */
+	rte_be32_t lo_addr; /* Low 32-bits of 48-bit address */
+};
+
 static inline u64 bm_buffer_get64(const struct bm_buffer *buf)
 {
 	return buf->addr;
@@ -85,6 +94,8 @@ static inline dma_addr_t bm_buf_addr(const struct bm_buffer *buf)
 		__buf931->lo = lower_32_bits(v); \
 	} while (0)
 
+#define FSL_BM_BURST_MAX 8
+
 /* See 1.5.3.5.4: "Release Command" */
 struct __rte_packed_begin bm_rcr_entry {
 	union {
@@ -93,7 +104,7 @@ struct __rte_packed_begin bm_rcr_entry {
 			u8 bpid; /* used with BM_RCR_VERB_CMD_BPID_SINGLE */
 			u8 __reserved1[62];
 		};
-		struct bm_buffer bufs[8];
+		struct bm_buffer bufs[FSL_BM_BURST_MAX];
 	};
 } __rte_packed_end;
 #define BM_RCR_VERB_VBIT		0x80
@@ -148,7 +159,7 @@ struct __rte_packed_begin bm_mc_result {
 				u8 bpid;
 				u8 __reserved2[62];
 			};
-			struct bm_buffer bufs[8];
+			struct bm_buffer bufs[FSL_BM_BURST_MAX];
 		} acquire;
 		struct bm_pool_state query;
 	};
@@ -297,6 +308,9 @@ const struct bman_pool_params *bman_get_params(const struct bman_pool *pool);
 __rte_internal
 int bman_release(struct bman_pool *pool, const struct bm_buffer *bufs, u8 num,
 		 u32 flags);
+__rte_internal
+int bman_release_fast(struct bman_pool *pool, const uint64_t *bufs,
+	uint8_t num);
 
 /**
  * bman_acquire - Acquire buffer(s) from a buffer pool
@@ -311,6 +325,8 @@ int bman_release(struct bman_pool *pool, const struct bm_buffer *bufs, u8 num,
 __rte_internal
 int bman_acquire(struct bman_pool *pool, struct bm_buffer *bufs, u8 num,
 		 u32 flags);
+__rte_internal
+int bman_acquire_fast(struct bman_pool *pool, uint64_t *bufs, uint8_t num);
 
 /**
  * bman_query_pools - Query all buffer pool states
-- 
2.25.1


^ permalink raw reply	[flat|nested] 14+ messages in thread

* [v1 05/10] mempool/dpaa: fast acquire and release
  2025-05-28 10:39 [v1 00/10] DPAA specific fixes vanshika.shukla
                   ` (3 preceding siblings ...)
  2025-05-28 10:39 ` [v1 04/10] bus/dpaa: optimize bman acquire/release vanshika.shukla
@ 2025-05-28 10:39 ` vanshika.shukla
  2025-05-28 10:39 ` [v1 06/10] mempool/dpaa: adjust pool element for LS1043A errata vanshika.shukla
                   ` (4 subsequent siblings)
  9 siblings, 0 replies; 14+ messages in thread
From: vanshika.shukla @ 2025-05-28 10:39 UTC (permalink / raw)
  To: dev, Hemant Agrawal, Sachin Saxena; +Cc: Jun Yang

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

Use new BMan APIs to improve performance and support burst release.
Improve release performance ~90% by burst release.

Signed-off-by: Jun Yang <jun.yang@nxp.com>
---
 drivers/mempool/dpaa/dpaa_mempool.c | 85 ++++++++++++-----------------
 drivers/mempool/dpaa/dpaa_mempool.h |  2 +-
 2 files changed, 36 insertions(+), 51 deletions(-)

diff --git a/drivers/mempool/dpaa/dpaa_mempool.c b/drivers/mempool/dpaa/dpaa_mempool.c
index 7dacaa9513..6c850f5cb2 100644
--- a/drivers/mempool/dpaa/dpaa_mempool.c
+++ b/drivers/mempool/dpaa/dpaa_mempool.c
@@ -157,61 +157,46 @@ dpaa_mbuf_free_pool(struct rte_mempool *mp)
 	}
 }
 
-static void
-dpaa_buf_free(struct dpaa_bp_info *bp_info, uint64_t addr)
-{
-	struct bm_buffer buf;
-	int ret;
-
-	DPAA_MEMPOOL_DPDEBUG("Free 0x%" PRIx64 " to bpid: %d",
-			   addr, bp_info->bpid);
-
-	bm_buffer_set64(&buf, addr);
-retry:
-	ret = bman_release(bp_info->bp, &buf, 1, 0);
-	if (ret) {
-		DPAA_MEMPOOL_DEBUG("BMAN busy. Retrying...");
-		cpu_spin(CPU_SPIN_BACKOFF_CYCLES);
-		goto retry;
-	}
-}
-
 static int
 dpaa_mbuf_free_bulk(struct rte_mempool *pool,
 		    void *const *obj_table,
-		    unsigned int n)
+		    unsigned int count)
 {
 	struct dpaa_bp_info *bp_info = DPAA_MEMPOOL_TO_POOL_INFO(pool);
 	int ret;
-	unsigned int i = 0;
+	uint32_t n = 0, i, left;
+	uint64_t phys[DPAA_MBUF_MAX_ACQ_REL];
 
 	DPAA_MEMPOOL_DPDEBUG("Request to free %d buffers in bpid = %d",
-			     n, bp_info->bpid);
+			     count, bp_info->bpid);
 
 	if (unlikely(!DPAA_PER_LCORE_PORTAL)) {
 		ret = rte_dpaa_portal_init((void *)0);
 		if (ret) {
 			DPAA_MEMPOOL_ERR("rte_dpaa_portal_init failed with ret: %d",
 					 ret);
-			return 0;
+			return ret;
 		}
 	}
 
-	while (i < n) {
-		uint64_t phy = rte_mempool_virt2iova(obj_table[i]);
-
-		if (unlikely(!bp_info->ptov_off)) {
-			/* buffers are from single mem segment */
-			if (bp_info->flags & DPAA_MPOOL_SINGLE_SEGMENT) {
-				bp_info->ptov_off = (size_t)obj_table[i] - phy;
-				rte_dpaa_bpid_info[bp_info->bpid].ptov_off
-						= bp_info->ptov_off;
-			}
+	while (n < count) {
+		/* Acquire is all-or-nothing, so we drain in 7s,
+		 * then the remainder.
+		 */
+		if ((count - n) > DPAA_MBUF_MAX_ACQ_REL)
+			left = DPAA_MBUF_MAX_ACQ_REL;
+		else
+			left = count - n;
+
+		for (i = 0; i < left; i++) {
+			phys[i] = rte_mempool_virt2iova(obj_table[n]);
+			phys[i] += bp_info->meta_data_size;
+			n++;
 		}
-
-		dpaa_buf_free(bp_info,
-			      (uint64_t)phy + bp_info->meta_data_size);
-		i = i + 1;
+release_again:
+		ret = bman_release_fast(bp_info->bp, phys, left);
+		if (unlikely(ret))
+			goto release_again;
 	}
 
 	DPAA_MEMPOOL_DPDEBUG("freed %d buffers in bpid =%d",
@@ -226,9 +211,9 @@ dpaa_mbuf_alloc_bulk(struct rte_mempool *pool,
 		     unsigned int count)
 {
 	struct rte_mbuf **m = (struct rte_mbuf **)obj_table;
-	struct bm_buffer bufs[DPAA_MBUF_MAX_ACQ_REL];
+	uint64_t bufs[DPAA_MBUF_MAX_ACQ_REL];
 	struct dpaa_bp_info *bp_info;
-	void *bufaddr;
+	uint8_t *bufaddr;
 	int i, ret;
 	unsigned int n = 0;
 
@@ -240,7 +225,7 @@ dpaa_mbuf_alloc_bulk(struct rte_mempool *pool,
 	if (unlikely(count >= (RTE_MEMPOOL_CACHE_MAX_SIZE * 2))) {
 		DPAA_MEMPOOL_ERR("Unable to allocate requested (%u) buffers",
 				 count);
-		return -1;
+		return -EINVAL;
 	}
 
 	if (unlikely(!DPAA_PER_LCORE_PORTAL)) {
@@ -248,7 +233,7 @@ dpaa_mbuf_alloc_bulk(struct rte_mempool *pool,
 		if (ret) {
 			DPAA_MEMPOOL_ERR("rte_dpaa_portal_init failed with ret: %d",
 					 ret);
-			return -1;
+			return ret;
 		}
 	}
 
@@ -257,10 +242,11 @@ dpaa_mbuf_alloc_bulk(struct rte_mempool *pool,
 		 * then the remainder.
 		 */
 		if ((count - n) > DPAA_MBUF_MAX_ACQ_REL) {
-			ret = bman_acquire(bp_info->bp, bufs,
-					   DPAA_MBUF_MAX_ACQ_REL, 0);
+			ret = bman_acquire_fast(bp_info->bp, bufs,
+				DPAA_MBUF_MAX_ACQ_REL);
 		} else {
-			ret = bman_acquire(bp_info->bp, bufs, count - n, 0);
+			ret = bman_acquire_fast(bp_info->bp, bufs,
+				count - n);
 		}
 		/* In case of less than requested number of buffers available
 		 * in pool, qbman_swp_acquire returns 0
@@ -275,16 +261,15 @@ dpaa_mbuf_alloc_bulk(struct rte_mempool *pool,
 			return -ENOBUFS;
 		}
 		/* assigning mbuf from the acquired objects */
-		for (i = 0; (i < ret) && bufs[i].addr; i++) {
+		for (i = 0; (i < ret) && bufs[i]; i++) {
 			/* TODO-errata - observed that bufs may be null
 			 * i.e. first buffer is valid, remaining 6 buffers
 			 * may be null.
 			 */
-			bufaddr = DPAA_MEMPOOL_PTOV(bp_info, bufs[i].addr);
-			m[n] = (struct rte_mbuf *)((char *)bufaddr
-						- bp_info->meta_data_size);
-			DPAA_MEMPOOL_DPDEBUG("Paddr (%p), FD (%p) from BMAN",
-					     (void *)bufaddr, (void *)m[n]);
+			bufaddr = DPAA_MEMPOOL_PTOV(bp_info, bufs[i]);
+			m[n] = (void *)(bufaddr - bp_info->meta_data_size);
+			DPAA_MEMPOOL_DPDEBUG("Vaddr(%p), mbuf(%p) from BMAN",
+				bufaddr, m[n]);
 			n++;
 		}
 	}
diff --git a/drivers/mempool/dpaa/dpaa_mempool.h b/drivers/mempool/dpaa/dpaa_mempool.h
index 0877068fdd..5ca53c7ff9 100644
--- a/drivers/mempool/dpaa/dpaa_mempool.h
+++ b/drivers/mempool/dpaa/dpaa_mempool.h
@@ -26,7 +26,7 @@
 #define DPAA_MAX_BPOOLS	256
 
 /* Maximum release/acquire from BMAN */
-#define DPAA_MBUF_MAX_ACQ_REL  8
+#define DPAA_MBUF_MAX_ACQ_REL  FSL_BM_BURST_MAX
 
 /* Buffers are allocated from single mem segment i.e. phys contiguous */
 #define DPAA_MPOOL_SINGLE_SEGMENT  0x01
-- 
2.25.1


^ permalink raw reply	[flat|nested] 14+ messages in thread

* [v1 06/10] mempool/dpaa: adjust pool element for LS1043A errata
  2025-05-28 10:39 [v1 00/10] DPAA specific fixes vanshika.shukla
                   ` (4 preceding siblings ...)
  2025-05-28 10:39 ` [v1 05/10] mempool/dpaa: fast acquire and release vanshika.shukla
@ 2025-05-28 10:39 ` vanshika.shukla
  2025-05-28 10:39 ` [v1 07/10] net/dpaa: add Tx rate limiting DPAA PMD API vanshika.shukla
                   ` (3 subsequent siblings)
  9 siblings, 0 replies; 14+ messages in thread
From: vanshika.shukla @ 2025-05-28 10:39 UTC (permalink / raw)
  To: dev, Hemant Agrawal, Sachin Saxena; +Cc: Jun Yang

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

Adjust every element of pool by populate callback.
1) Make sure start DMA address is aligned with 16B.
2) For buffer across 4KB boundary, make sure start DMA address is
   aligned with 256B.

Signed-off-by: Jun Yang <jun.yang@nxp.com>
---
 drivers/mempool/dpaa/dpaa_mempool.c | 145 +++++++++++++++++++++++++++-
 drivers/mempool/dpaa/dpaa_mempool.h |  11 ++-
 2 files changed, 150 insertions(+), 6 deletions(-)

diff --git a/drivers/mempool/dpaa/dpaa_mempool.c b/drivers/mempool/dpaa/dpaa_mempool.c
index 6c850f5cb2..2af6ebcee2 100644
--- a/drivers/mempool/dpaa/dpaa_mempool.c
+++ b/drivers/mempool/dpaa/dpaa_mempool.c
@@ -1,6 +1,6 @@
 /* SPDX-License-Identifier: BSD-3-Clause
  *
- *   Copyright 2017,2019,2023 NXP
+ *   Copyright 2017,2019,2023-2025 NXP
  *
  */
 
@@ -13,6 +13,7 @@
 #include <signal.h>
 #include <pthread.h>
 #include <sys/types.h>
+
 #include <sys/syscall.h>
 
 #include <eal_export.h>
@@ -29,6 +30,9 @@
 #include <dpaa_mempool.h>
 #include <dpaax_iova_table.h>
 
+#define FMAN_ERRATA_BOUNDARY ((uint64_t)4096)
+#define FMAN_ERRATA_BOUNDARY_MASK (~(FMAN_ERRATA_BOUNDARY - 1))
+
 /* List of all the memseg information locally maintained in dpaa driver. This
  * is to optimize the PA_to_VA searches until a better mechanism (algo) is
  * available.
@@ -51,6 +55,7 @@ dpaa_mbuf_create_pool(struct rte_mempool *mp)
 	struct dpaa_bp_info *bp_info;
 	uint8_t bpid;
 	int num_bufs = 0, ret = 0;
+	uint16_t elem_max_size;
 	struct bman_pool_params params = {
 		.flags = BMAN_POOL_FLAG_DYNAMIC_BPID
 	};
@@ -101,9 +106,11 @@ dpaa_mbuf_create_pool(struct rte_mempool *mp)
 		}
 	}
 
+	elem_max_size = rte_pktmbuf_data_room_size(mp);
+
 	rte_dpaa_bpid_info[bpid].mp = mp;
 	rte_dpaa_bpid_info[bpid].bpid = bpid;
-	rte_dpaa_bpid_info[bpid].size = mp->elt_size;
+	rte_dpaa_bpid_info[bpid].size = elem_max_size;
 	rte_dpaa_bpid_info[bpid].bp = bp;
 	rte_dpaa_bpid_info[bpid].meta_data_size =
 		sizeof(struct rte_mbuf) + rte_pktmbuf_priv_size(mp);
@@ -296,6 +303,130 @@ dpaa_mbuf_get_count(const struct rte_mempool *mp)
 	return bman_query_free_buffers(bp_info->bp);
 }
 
+static int
+dpaa_check_obj_bounds(char *obj, size_t pg_sz, size_t elt_sz)
+{
+	if (!pg_sz || elt_sz > pg_sz)
+		return true;
+
+	if (RTE_PTR_ALIGN(obj, pg_sz) !=
+		RTE_PTR_ALIGN(obj + elt_sz - 1, pg_sz))
+		return false;
+	return true;
+}
+
+static void
+dpaa_adjust_obj_bounds(char *va, size_t *offset,
+	size_t pg_sz, size_t total, uint32_t flags)
+{
+	size_t off = *offset;
+
+	if (dpaa_check_obj_bounds(va + off, pg_sz, total) == false) {
+		off += RTE_PTR_ALIGN_CEIL(va + off, pg_sz) - (va + off);
+		if (flags & RTE_MEMPOOL_POPULATE_F_ALIGN_OBJ)
+			off += total - ((((size_t)va + off - 1) % total) + 1);
+	}
+
+	*offset = off;
+}
+
+static int
+dpaa_mbuf_ls1043a_errata_obj_adjust(uint8_t **pobj,
+	uint32_t header_size, size_t *poff, size_t data_room)
+{
+	uint8_t *obj = *pobj;
+	size_t off = *poff, buf_addr, end;
+
+	if (RTE_PKTMBUF_HEADROOM % FMAN_ERRATA_BUF_START_ALIGN) {
+		DPAA_MEMPOOL_ERR("RTE_PKTMBUF_HEADROOM(%d) NOT aligned to %d",
+			RTE_PKTMBUF_HEADROOM,
+			FMAN_ERRATA_BUF_START_ALIGN);
+		return -1;
+	}
+	if (header_size % FMAN_ERRATA_BUF_START_ALIGN) {
+		DPAA_MEMPOOL_ERR("Header size(%d) NOT aligned to %d",
+			header_size,
+			FMAN_ERRATA_BUF_START_ALIGN);
+		return -1;
+	}
+
+	/** All FMAN DMA start addresses (for example, BMAN buffer
+	 * address, FD[address] + FD[offset]) are 16B aligned.
+	 */
+	buf_addr = (size_t)obj + header_size;
+	while (!rte_is_aligned((void *)buf_addr,
+		FMAN_ERRATA_BUF_START_ALIGN)) {
+		off++;
+		obj++;
+		buf_addr = (size_t)obj + header_size;
+	}
+
+	/** Frame buffers must not span a 4KB address boundary,
+	 * unless the frame start address is 256 byte aligned.
+	 */
+	end = buf_addr + data_room;
+	if (((buf_addr + RTE_PKTMBUF_HEADROOM) &
+		FMAN_ERRATA_BOUNDARY_MASK) ==
+		(end & FMAN_ERRATA_BOUNDARY_MASK))
+		goto quit;
+
+	while (!rte_is_aligned((void *)(buf_addr + RTE_PKTMBUF_HEADROOM),
+		FMAN_ERRATA_4K_SPAN_ADDR_ALIGN)) {
+		off++;
+		obj++;
+		buf_addr = (size_t)obj + header_size;
+	}
+quit:
+	*pobj = obj;
+	*poff = off;
+
+	return 0;
+}
+
+static int
+dpaa_mbuf_op_pop_helper(struct rte_mempool *mp, uint32_t flags,
+	uint32_t max_objs, void *vaddr, rte_iova_t iova,
+	size_t len, struct dpaa_bp_info *bp_info,
+	rte_mempool_populate_obj_cb_t *obj_cb, void *obj_cb_arg)
+{
+	char *va = vaddr;
+	size_t total_elt_sz, pg_sz, off;
+	uint32_t i;
+	void *obj;
+	int ret;
+	uint16_t data_room = rte_pktmbuf_data_room_size(mp);
+
+	ret = rte_mempool_get_page_size(mp, &pg_sz);
+	if (ret < 0)
+		return ret;
+
+	total_elt_sz = mp->header_size + mp->elt_size + mp->trailer_size;
+
+	if (flags & RTE_MEMPOOL_POPULATE_F_ALIGN_OBJ)
+		off = total_elt_sz - (((uintptr_t)(va - 1) % total_elt_sz) + 1);
+	else
+		off = 0;
+	for (i = 0; i < max_objs; i++) {
+		/* avoid objects to cross page boundaries */
+		dpaa_adjust_obj_bounds(va, &off, pg_sz, total_elt_sz, flags);
+		if (off + total_elt_sz > len)
+			break;
+
+		off += mp->header_size;
+		obj = va + off;
+		if (dpaa_soc_ver() == SVR_LS1043A_FAMILY) {
+			dpaa_mbuf_ls1043a_errata_obj_adjust((uint8_t **)&obj,
+				bp_info->meta_data_size, &off, data_room);
+		}
+		obj_cb(mp, obj_cb_arg, obj,
+			(iova == RTE_BAD_IOVA) ? RTE_BAD_IOVA : (iova + off));
+		rte_mempool_ops_enqueue_bulk(mp, &obj, 1);
+		off += mp->elt_size + mp->trailer_size;
+	}
+
+	return i;
+}
+
 static int
 dpaa_populate(struct rte_mempool *mp, unsigned int max_objs,
 	      void *vaddr, rte_iova_t paddr, size_t len,
@@ -303,9 +434,14 @@ dpaa_populate(struct rte_mempool *mp, unsigned int max_objs,
 {
 	struct dpaa_bp_info *bp_info;
 	unsigned int total_elt_sz;
+	struct dpaa_memseg *ms;
 
 	if (!mp || !mp->pool_data) {
 		DPAA_MEMPOOL_ERR("Invalid mempool provided");
+		if (dpaa_soc_ver() == SVR_LS1043A_FAMILY) {
+			/** populate must be successful for LS1043A*/
+			return -EINVAL;
+		}
 		return 0;
 	}
 
@@ -321,7 +457,6 @@ dpaa_populate(struct rte_mempool *mp, unsigned int max_objs,
 	/* Detect pool area has sufficient space for elements in this memzone */
 	if (len >= total_elt_sz * mp->size)
 		bp_info->flags |= DPAA_MPOOL_SINGLE_SEGMENT;
-	struct dpaa_memseg *ms;
 
 	/* For each memory chunk pinned to the Mempool, a linked list of the
 	 * contained memsegs is created for searching when PA to VA
@@ -347,8 +482,8 @@ dpaa_populate(struct rte_mempool *mp, unsigned int max_objs,
 	 */
 	TAILQ_INSERT_HEAD(&rte_dpaa_memsegs, ms, next);
 
-	return rte_mempool_op_populate_helper(mp, 0, max_objs, vaddr, paddr,
-					       len, obj_cb, obj_cb_arg);
+	return dpaa_mbuf_op_pop_helper(mp, 0, max_objs, vaddr, paddr,
+			len, bp_info, obj_cb, obj_cb_arg);
 }
 
 static const struct rte_mempool_ops dpaa_mpool_ops = {
diff --git a/drivers/mempool/dpaa/dpaa_mempool.h b/drivers/mempool/dpaa/dpaa_mempool.h
index 5ca53c7ff9..865b533b8f 100644
--- a/drivers/mempool/dpaa/dpaa_mempool.h
+++ b/drivers/mempool/dpaa/dpaa_mempool.h
@@ -1,6 +1,6 @@
 /* SPDX-License-Identifier: BSD-3-Clause
  *
- *   Copyright 2017,2019 NXP
+ *   Copyright 2017,2019,2024 -2025 NXP
  *
  */
 #ifndef __DPAA_MEMPOOL_H__
@@ -31,6 +31,15 @@
 /* Buffers are allocated from single mem segment i.e. phys contiguous */
 #define DPAA_MPOOL_SINGLE_SEGMENT  0x01
 
+#define FMAN_ERRATA_4K_SPAN_ADDR_ALIGN 256
+#define FMAN_ERRATA_4K_SPAN_ADDR_MASK \
+	(FMAN_ERRATA_4K_SPAN_ADDR_ALIGN - 1)
+
+#define FMAN_ERRATA_BUF_START_ALIGN 16
+#define FMAN_ERRATA_BUF_START_MASK (FMAN_ERRATA_BUF_START_ALIGN - 1)
+#define FMAN_ERRATA_SG_LEN_ALIGN 16
+#define FMAN_ERRATA_SG_LEN_MASK (FMAN_ERRATA_SG_LEN_ALIGN - 1)
+
 struct dpaa_bp_info {
 	struct rte_mempool *mp;
 	struct bman_pool *bp;
-- 
2.25.1


^ permalink raw reply	[flat|nested] 14+ messages in thread

* [v1 07/10] net/dpaa: add Tx rate limiting DPAA PMD API
  2025-05-28 10:39 [v1 00/10] DPAA specific fixes vanshika.shukla
                   ` (5 preceding siblings ...)
  2025-05-28 10:39 ` [v1 06/10] mempool/dpaa: adjust pool element for LS1043A errata vanshika.shukla
@ 2025-05-28 10:39 ` vanshika.shukla
  2025-05-28 10:39 ` [v1 08/10] net/dpaa: add devargs for enabling err packets on main queue vanshika.shukla
                   ` (2 subsequent siblings)
  9 siblings, 0 replies; 14+ messages in thread
From: vanshika.shukla @ 2025-05-28 10:39 UTC (permalink / raw)
  To: dev, Thomas Monjalon, Hemant Agrawal, Sachin Saxena
  Cc: Vinod Pullabhatla, Vanshika Shukla

From: Vinod Pullabhatla <vinod.pullabhatla@nxp.com>

Add support to set Tx rate on DPAA platform through PMD APIs

Signed-off-by: Vinod Pullabhatla <vinod.pullabhatla@nxp.com>
Signed-off-by: Vanshika Shukla <vanshika.shukla@nxp.com>
---
 .mailmap                             |  1 +
 drivers/net/dpaa/dpaa_flow.c         | 87 +++++++++++++++++++++++++++-
 drivers/net/dpaa/fmlib/fm_lib.c      | 30 ++++++++++
 drivers/net/dpaa/fmlib/fm_port_ext.h |  2 +-
 drivers/net/dpaa/rte_pmd_dpaa.h      | 21 ++++++-
 5 files changed, 137 insertions(+), 4 deletions(-)

diff --git a/.mailmap b/.mailmap
index 563f602bcc..d2d9ad2758 100644
--- a/.mailmap
+++ b/.mailmap
@@ -1635,6 +1635,7 @@ Vincent S. Cojot <vcojot@redhat.com>
 Vinh Tran <vinh.t.tran10@gmail.com>
 Vipin Padmam Ramesh <vipinp@vmware.com>
 Vinod Krishna <vinod.krishna@arm.com>
+Vinod Pullabhatla <vinod.pullabhatla@nxp.com>
 Vipin Varghese <vipin.varghese@amd.com> <vipin.varghese@intel.com>
 Vipul Ashri <vipul.ashri@oracle.com>
 Visa Hankala <visa@hankala.org>
diff --git a/drivers/net/dpaa/dpaa_flow.c b/drivers/net/dpaa/dpaa_flow.c
index 2a22b23c8f..eb4bbb097c 100644
--- a/drivers/net/dpaa/dpaa_flow.c
+++ b/drivers/net/dpaa/dpaa_flow.c
@@ -1,5 +1,5 @@
 /* SPDX-License-Identifier: BSD-3-Clause
- * Copyright 2017-2019,2021-2024 NXP
+ * Copyright 2017-2019,2021-2025 NXP
  */
 
 /* System headers */
@@ -669,6 +669,22 @@ static inline int get_rx_port_type(struct fman_if *fif)
 	return e_FM_PORT_TYPE_DUMMY;
 }
 
+static inline int get_tx_port_type(struct fman_if *fif)
+{
+	if (fif->mac_type == fman_offline_internal ||
+	    fif->mac_type == fman_onic)
+		return e_FM_PORT_TYPE_OH_OFFLINE_PARSING;
+	else if (fif->mac_type == fman_mac_1g)
+		return e_FM_PORT_TYPE_TX;
+	else if (fif->mac_type == fman_mac_2_5g)
+		return e_FM_PORT_TYPE_TX_2_5G;
+	else if (fif->mac_type == fman_mac_10g)
+		return e_FM_PORT_TYPE_TX_10G;
+
+	DPAA_PMD_ERR("MAC type unsupported");
+	return e_FM_PORT_TYPE_DUMMY;
+}
+
 static inline int set_fm_port_handle(struct dpaa_if *dpaa_intf,
 				     uint64_t req_dist_set,
 				     struct fman_if *fif)
@@ -889,9 +905,9 @@ int dpaa_fm_init(void)
 	/* FM PCD Enable */
 	ret = fm_pcd_enable(pcd_handle);
 	if (ret) {
-		fm_close(fman_handle);
 		fm_pcd_close(pcd_handle);
 		DPAA_PMD_ERR("fm_pcd_enable: Failed");
+		fm_close(fman_handle);
 		return -1;
 	}
 
@@ -1073,3 +1089,70 @@ int dpaa_port_vsp_cleanup(struct dpaa_if *dpaa_intf, struct fman_if *fif)
 
 	return E_OK;
 }
+
+int rte_pmd_dpaa_port_set_rate_limit(uint16_t port_id, uint16_t burst,
+				     uint32_t rate)
+{
+	t_fm_port_rate_limit port_rate_limit;
+	bool port_handle_exists = true;
+	void *handle;
+	uint32_t ret;
+	struct rte_eth_dev *dev;
+	struct dpaa_if *dpaa_intf;
+	struct fman_if *fif;
+
+	RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
+	dev = &rte_eth_devices[port_id];
+	dpaa_intf = dev->data->dev_private;
+	fif = dev->process_private;
+
+	memset(&port_rate_limit, 0, sizeof(port_rate_limit));
+	port_rate_limit.max_burst_size = burst;
+	port_rate_limit.rate_limit = rate;
+
+	DPAA_PMD_DEBUG("Port:%s: set max Burst =%u max Rate =%u",
+		dpaa_intf->name, burst, rate);
+
+	if (!dpaa_intf->port_handle) {
+		t_fm_port_params fm_port_params;
+
+		/* Memset FM port params */
+		memset(&fm_port_params, 0, sizeof(fm_port_params));
+
+		/* Set FM port params */
+		fm_port_params.h_fm = fm_open(0);
+		fm_port_params.port_type = get_tx_port_type(fif);
+		fm_port_params.port_id = mac_idx[fif->mac_idx];
+
+		/* FM PORT Open */
+		handle = fm_port_open(&fm_port_params);
+		fm_close(fm_port_params.h_fm);
+		if (!handle) {
+			DPAA_PMD_ERR("Can't open handle %p",
+				     fm_info.fman_handle);
+			return -ENODEV;
+		}
+
+		port_handle_exists = false;
+	} else {
+		handle = dpaa_intf->port_handle;
+	}
+
+	if (burst == 0 || rate == 0)
+		ret = fm_port_delete_rate_limit(handle);
+	else
+		ret = fm_port_set_rate_limit(handle, &port_rate_limit);
+
+	if (ret) {
+		DPAA_PMD_ERR("Failed to %s rate limit ret = %#x.",
+			(!burst || !rate) ? "del" : "set", ret);
+	} else {
+		DPAA_PMD_DEBUG("Success to %s rate limit,",
+			(!burst || !rate) ? "del" : "set");
+	}
+
+	if (!port_handle_exists)
+		fm_port_close(handle);
+
+	return -ret;
+}
diff --git a/drivers/net/dpaa/fmlib/fm_lib.c b/drivers/net/dpaa/fmlib/fm_lib.c
index b35feba004..d34993de38 100644
--- a/drivers/net/dpaa/fmlib/fm_lib.c
+++ b/drivers/net/dpaa/fmlib/fm_lib.c
@@ -558,3 +558,33 @@ get_device_id(t_handle h_dev)
 
 	return (t_handle)p_dev->id;
 }
+
+uint32_t
+fm_port_delete_rate_limit(t_handle h_fm_port)
+{
+	t_device        *p_dev = (t_device *)h_fm_port;
+
+	_fml_dbg("Calling...");
+
+	if (ioctl(p_dev->fd, FM_PORT_IOC_REMOVE_RATE_LIMIT))
+		RETURN_ERROR(MINOR, E_INVALID_OPERATION, NO_MSG);
+
+	_fml_dbg("Finishing.");
+
+	return E_OK;
+}
+
+uint32_t
+fm_port_set_rate_limit(t_handle h_fm_port, t_fm_port_rate_limit *p_rate_limit)
+{
+	t_device        *p_dev = (t_device *)h_fm_port;
+
+	_fml_dbg("Calling...");
+
+	if (ioctl(p_dev->fd, FM_PORT_IOC_SET_RATE_LIMIT, p_rate_limit))
+		RETURN_ERROR(MINOR, E_INVALID_OPERATION, NO_MSG);
+
+	_fml_dbg("Finishing.");
+
+	return E_OK;
+}
diff --git a/drivers/net/dpaa/fmlib/fm_port_ext.h b/drivers/net/dpaa/fmlib/fm_port_ext.h
index bb2e00222e..f1cbf37de3 100644
--- a/drivers/net/dpaa/fmlib/fm_port_ext.h
+++ b/drivers/net/dpaa/fmlib/fm_port_ext.h
@@ -274,7 +274,7 @@ typedef struct ioc_fm_port_congestion_groups_t {
  * @Return	0 on success; error code otherwise.
  */
 #define FM_PORT_IOC_SET_RATE_LIMIT \
-	IOW(FM_IOC_TYPE_BASE, FM_PORT_IOC_NUM(3), ioc_fm_port_rate_limit_t)
+	_IOW(FM_IOC_TYPE_BASE, FM_PORT_IOC_NUM(3), ioc_fm_port_rate_limit_t)
 
 /*
  * @Function	  fm_port_delete_rate_limit
diff --git a/drivers/net/dpaa/rte_pmd_dpaa.h b/drivers/net/dpaa/rte_pmd_dpaa.h
index ec45633ba2..1a847c4d43 100644
--- a/drivers/net/dpaa/rte_pmd_dpaa.h
+++ b/drivers/net/dpaa/rte_pmd_dpaa.h
@@ -1,5 +1,5 @@
 /* SPDX-License-Identifier: BSD-3-Clause
- * Copyright 2018 NXP
+ * Copyright 2018, 2022, 2024 NXP
  */
 
 #ifndef _PMD_DPAA_H_
@@ -31,4 +31,23 @@
 int
 rte_pmd_dpaa_set_tx_loopback(uint16_t port, uint8_t on);
 
+/**
+ * Set TX rate limit
+ *
+ * @param port_id
+ *    The port identifier of the Ethernet device.
+ * @param burst
+ *    Max burst size(KBytes) of the Ethernet device.
+ *    0 - Disable TX rate limit.
+ * @param rate
+ *    Max rate(Kb/sec) of the Ethernet device.
+ *    0 - Disable TX rate limit.
+ * @return
+ *    0 - if successful.
+ *    <0 - if failed, with proper error code.
+ */
+int
+rte_pmd_dpaa_port_set_rate_limit(uint16_t port_id, uint16_t burst,
+				 uint32_t rate);
+
 #endif /* _PMD_DPAA_H_ */
-- 
2.25.1


^ permalink raw reply	[flat|nested] 14+ messages in thread

* [v1 08/10] net/dpaa: add devargs for enabling err packets on main queue
  2025-05-28 10:39 [v1 00/10] DPAA specific fixes vanshika.shukla
                   ` (6 preceding siblings ...)
  2025-05-28 10:39 ` [v1 07/10] net/dpaa: add Tx rate limiting DPAA PMD API vanshika.shukla
@ 2025-05-28 10:39 ` vanshika.shukla
  2025-05-28 10:39 ` [v1 09/10] bus/dpaa: improve DPAA cleanup vanshika.shukla
  2025-05-28 10:39 ` [v1 10/10] bus/dpaa: optimize qman enqueue check vanshika.shukla
  9 siblings, 0 replies; 14+ messages in thread
From: vanshika.shukla @ 2025-05-28 10:39 UTC (permalink / raw)
  To: dev, Hemant Agrawal, Sachin Saxena; +Cc: Vanshika Shukla

From: Vanshika Shukla <vanshika.shukla@nxp.com>

Currently, error queue is mapped to the Rx queue and enabled by default.
This patch adds the devargs to control the err packets on main queue.
Also, in VSP mode the error queue should be disabled because the error
packets from kernel are diverted to the Rx queue/err queue causing crash.

Signed-off-by: Vanshika Shukla <vanshika.shukla@nxp.com>
---
 doc/guides/nics/dpaa.rst       |  3 +++
 drivers/net/dpaa/dpaa_ethdev.c | 29 +++++++++++++++++++++--------
 2 files changed, 24 insertions(+), 8 deletions(-)

diff --git a/doc/guides/nics/dpaa.rst b/doc/guides/nics/dpaa.rst
index de3ae96e07..cc9aef7f83 100644
--- a/doc/guides/nics/dpaa.rst
+++ b/doc/guides/nics/dpaa.rst
@@ -277,6 +277,9 @@ for details.
 
 * Use dev arg option ``drv_ieee1588=1`` to enable IEEE 1588 support
   at driver level, e.g. ``dpaa:fm1-mac3,drv_ieee1588=1``.
+* Use dev arg option ``recv_err_pkts=1`` to receive all packets including
+  error packets and thus disabling hardware based packet handing
+  at driver level, e.g. ``dpaa:fm1-mac3,recv_err_pkts=1``.
 
 FMAN Config
 -----------
diff --git a/drivers/net/dpaa/dpaa_ethdev.c b/drivers/net/dpaa/dpaa_ethdev.c
index 7d0f830204..62cafb7073 100644
--- a/drivers/net/dpaa/dpaa_ethdev.c
+++ b/drivers/net/dpaa/dpaa_ethdev.c
@@ -52,9 +52,10 @@
 #include <process.h>
 #include <fmlib/fm_ext.h>
 
-#define DRIVER_IEEE1588        "drv_ieee1588"
-#define CHECK_INTERVAL         100  /* 100ms */
-#define MAX_REPEAT_TIME        90   /* 9s (90 * 100ms) in total */
+#define DRIVER_IEEE1588         "drv_ieee1588"
+#define CHECK_INTERVAL          100  /* 100ms */
+#define MAX_REPEAT_TIME         90   /* 9s (90 * 100ms) in total */
+#define DRIVER_RECV_ERR_PKTS      "recv_err_pkts"
 
 /* Supported Rx offloads */
 static uint64_t dev_rx_offloads_sup =
@@ -87,6 +88,8 @@ static int is_global_init;
 static int fmc_q = 1;	/* Indicates the use of static fmc for distribution */
 static int default_q;	/* use default queue - FMC is not executed*/
 int dpaa_ieee_1588;	/* use to indicate if IEEE 1588 is enabled for the driver */
+bool dpaa_enable_recv_err_pkts; /* Enable main queue to receive error packets */
+
 /* At present we only allow up to 4 push mode queues as default - as each of
  * this queue need dedicated portal and we are short of portals.
  */
@@ -1273,10 +1276,12 @@ int dpaa_eth_rx_queue_setup(struct rte_eth_dev *dev, uint16_t queue_idx,
 		}
 	}
 
-	/* Enable main queue to receive error packets also by default */
+	/* Enable main queue to receive error packets */
 	if (fif->mac_type != fman_offline_internal &&
-	    fif->mac_type != fman_onic)
+			fif->mac_type != fman_onic &&
+			dpaa_enable_recv_err_pkts && !fif->is_shared_mac) {
 		fman_if_set_err_fqid(fif, rxq->fqid);
+	}
 
 	return 0;
 }
@@ -2191,6 +2196,9 @@ dpaa_dev_init(struct rte_eth_dev *eth_dev)
 	if (dpaa_get_devargs(dev->devargs, DRIVER_IEEE1588))
 		dpaa_ieee_1588 = 1;
 
+	if (dpaa_get_devargs(dev->devargs, DRIVER_RECV_ERR_PKTS))
+		dpaa_enable_recv_err_pkts = 1;
+
 	memset((char *)dev_rx_fqids, 0,
 		sizeof(uint32_t) * DPAA_MAX_NUM_PCD_QUEUES);
 
@@ -2418,8 +2426,12 @@ dpaa_dev_init(struct rte_eth_dev *eth_dev)
 	    fman_intf->mac_type != fman_offline_internal &&
 	    fman_intf->mac_type != fman_onic) {
 		/* Configure error packet handling */
-		fman_if_receive_rx_errors(fman_intf,
-					  FM_FD_RX_STATUS_ERR_MASK);
+#ifndef RTE_LIBRTE_DPAA_DEBUG_DRIVER
+			if (dpaa_enable_recv_err_pkts)
+#endif
+				fman_if_receive_rx_errors(fman_intf,
+						FM_FD_RX_STATUS_ERR_MASK);
+
 		/* Disable RX mode */
 		fman_if_disable_rx(fman_intf);
 		/* Disable promiscuous mode */
@@ -2619,5 +2631,6 @@ static struct rte_dpaa_driver rte_dpaa_pmd = {
 
 RTE_PMD_REGISTER_DPAA(net_dpaa, rte_dpaa_pmd);
 RTE_PMD_REGISTER_PARAM_STRING(net_dpaa,
-		DRIVER_IEEE1588 "=<int>");
+		DRIVER_IEEE1588 "=<int>"
+		DRIVER_RECV_ERR_PKTS "=<int>");
 RTE_LOG_REGISTER_DEFAULT(dpaa_logtype_pmd, NOTICE);
-- 
2.25.1


^ permalink raw reply	[flat|nested] 14+ messages in thread

* [v1 09/10] bus/dpaa: improve DPAA cleanup
  2025-05-28 10:39 [v1 00/10] DPAA specific fixes vanshika.shukla
                   ` (7 preceding siblings ...)
  2025-05-28 10:39 ` [v1 08/10] net/dpaa: add devargs for enabling err packets on main queue vanshika.shukla
@ 2025-05-28 10:39 ` vanshika.shukla
  2025-05-28 10:39 ` [v1 10/10] bus/dpaa: optimize qman enqueue check vanshika.shukla
  9 siblings, 0 replies; 14+ messages in thread
From: vanshika.shukla @ 2025-05-28 10:39 UTC (permalink / raw)
  To: dev, Hemant Agrawal, Sachin Saxena; +Cc: Gagandeep Singh

From: Gagandeep Singh <g.singh@nxp.com>

This patch addresses DPAA driver issues with the introduction of
rte_eal_cleanup, which caused driver-specific destructors to fail
due to memory cleanup.
To resolve this, we remove the driver destructor and relocate the
code to the bus cleanup function.

So, this patch also implements DPAA bus cleanup.

Signed-off-by: Gagandeep Singh <g.singh@nxp.com>
---
 drivers/bus/dpaa/base/qbman/qman_driver.c |   2 -
 drivers/bus/dpaa/dpaa_bus.c               |  58 ++++++
 drivers/net/dpaa/dpaa_ethdev.c            | 217 ++++++++++++++++------
 3 files changed, 215 insertions(+), 62 deletions(-)

diff --git a/drivers/bus/dpaa/base/qbman/qman_driver.c b/drivers/bus/dpaa/base/qbman/qman_driver.c
index 7a129a2d86..cdce6b777b 100644
--- a/drivers/bus/dpaa/base/qbman/qman_driver.c
+++ b/drivers/bus/dpaa/base/qbman/qman_driver.c
@@ -228,8 +228,6 @@ int fsl_qman_fq_portal_destroy(struct qman_portal *qp)
 	if (ret)
 		pr_err("qman_free_global_portal() (%d)\n", ret);
 
-	kfree(qp);
-
 	process_portal_irq_unmap(cfg->irq);
 
 	addr.cena = cfg->addr_virt[DPAA_PORTAL_CE];
diff --git a/drivers/bus/dpaa/dpaa_bus.c b/drivers/bus/dpaa/dpaa_bus.c
index 7abc2235e7..4d7e7ea3df 100644
--- a/drivers/bus/dpaa/dpaa_bus.c
+++ b/drivers/bus/dpaa/dpaa_bus.c
@@ -63,6 +63,9 @@ static struct netcfg_info *dpaa_netcfg;
 
 /* define a variable to hold the portal_key, once created.*/
 static pthread_key_t dpaa_portal_key;
+/* dpaa lcore specific  portals */
+struct dpaa_portal *dpaa_portals[RTE_MAX_LCORE] = {NULL};
+static int dpaa_bus_global_init;
 
 #define FSL_DPAA_BUS_NAME	dpaa_bus
 
@@ -402,6 +405,7 @@ int rte_dpaa_portal_init(void *arg)
 
 		return ret;
 	}
+	dpaa_portals[lcore] = DPAA_PER_LCORE_PORTAL;
 
 	DPAA_BUS_LOG(DEBUG, "QMAN thread initialized");
 
@@ -461,6 +465,8 @@ dpaa_portal_finish(void *arg)
 	rte_free(dpaa_io_portal);
 	dpaa_io_portal = NULL;
 	DPAA_PER_LCORE_PORTAL = NULL;
+	dpaa_portals[rte_lcore_id()] = NULL;
+	DPAA_BUS_DEBUG("Portal cleanup done for lcore = %d", rte_lcore_id());
 }
 
 static int
@@ -771,6 +777,7 @@ rte_dpaa_bus_probe(void)
 			break;
 		}
 	}
+	dpaa_bus_global_init = 1;
 
 	return 0;
 }
@@ -878,6 +885,56 @@ dpaa_bus_dev_iterate(const void *start, const char *str,
 	return NULL;
 }
 
+static int
+dpaa_bus_cleanup(void)
+{
+	struct rte_dpaa_device *dev, *tmp_dev;
+
+	BUS_INIT_FUNC_TRACE();
+	RTE_TAILQ_FOREACH_SAFE(dev, &s_rte_dpaa_bus.device_list, next, tmp_dev) {
+		struct rte_dpaa_driver *drv = dev->driver;
+		int ret = 0;
+
+		if (!rte_dev_is_probed(&dev->device))
+			continue;
+		if (!drv || !drv->remove)
+			continue;
+		ret = drv->remove(dev);
+		if (ret < 0) {
+			rte_errno = errno;
+			return -1;
+		}
+		dev->driver = NULL;
+		dev->device.driver = NULL;
+	}
+	dpaa_portal_finish((void *)DPAA_PER_LCORE_PORTAL);
+	dpaa_bus_global_init = 0;
+	DPAA_BUS_DEBUG("Bus cleanup done");
+
+	return 0;
+}
+
+/* Adding destructor for double check in case non-gracefully
+ * exit.
+ */
+static void __attribute__((destructor(102)))
+dpaa_cleanup(void)
+{
+	unsigned int lcore_id;
+
+	if (!dpaa_bus_global_init)
+		return;
+
+	/* cleanup portals in case non-gracefull exit */
+	RTE_LCORE_FOREACH_WORKER(lcore_id) {
+		/* Check for non zero id */
+		dpaa_portal_finish((void *)dpaa_portals[lcore_id]);
+	}
+	dpaa_portal_finish((void *)DPAA_PER_LCORE_PORTAL);
+	dpaa_bus_global_init = 0;
+	DPAA_BUS_DEBUG("Worker thread clean up done");
+}
+
 static struct rte_dpaa_bus s_rte_dpaa_bus = {
 	.bus = {
 		.scan = rte_dpaa_bus_scan,
@@ -888,6 +945,7 @@ static struct rte_dpaa_bus s_rte_dpaa_bus = {
 		.plug = dpaa_bus_plug,
 		.unplug = dpaa_bus_unplug,
 		.dev_iterate = dpaa_bus_dev_iterate,
+		.cleanup = dpaa_bus_cleanup,
 	},
 	.device_list = TAILQ_HEAD_INITIALIZER(s_rte_dpaa_bus.device_list),
 	.driver_list = TAILQ_HEAD_INITIALIZER(s_rte_dpaa_bus.driver_list),
diff --git a/drivers/net/dpaa/dpaa_ethdev.c b/drivers/net/dpaa/dpaa_ethdev.c
index 62cafb7073..85122c24b3 100644
--- a/drivers/net/dpaa/dpaa_ethdev.c
+++ b/drivers/net/dpaa/dpaa_ethdev.c
@@ -310,11 +310,12 @@ dpaa_eth_dev_configure(struct rte_eth_dev *dev)
 	}
 
 	if (!(default_q || fmc_q)) {
-		if (dpaa_fm_config(dev,
-			eth_conf->rx_adv_conf.rss_conf.rss_hf)) {
+		ret = dpaa_fm_config(dev,
+			eth_conf->rx_adv_conf.rss_conf.rss_hf);
+		if (ret) {
 			dpaa_write_fm_config_to_file();
-			DPAA_PMD_ERR("FM port configuration: Failed");
-			return -1;
+			DPAA_PMD_ERR("FM port configuration: Failed(%d)", ret);
+			return ret;
 		}
 		dpaa_write_fm_config_to_file();
 	}
@@ -517,6 +518,7 @@ static int dpaa_eth_dev_close(struct rte_eth_dev *dev)
 	struct rte_intr_handle *intr_handle;
 	struct rte_eth_link *link = &dev->data->dev_link;
 	struct dpaa_if *dpaa_intf = dev->data->dev_private;
+	struct qman_fq *fq;
 	int loop;
 	int ret;
 
@@ -526,14 +528,17 @@ static int dpaa_eth_dev_close(struct rte_eth_dev *dev)
 		return 0;
 
 	if (!dpaa_intf) {
-		DPAA_PMD_WARN("Already closed or not started");
-		return -1;
+		DPAA_PMD_DEBUG("Already closed or not started");
+		return -ENOENT;
 	}
 
 	/* DPAA FM deconfig */
 	if (!(default_q || fmc_q)) {
-		if (dpaa_fm_deconfig(dpaa_intf, dev->process_private))
-			DPAA_PMD_WARN("DPAA FM deconfig failed");
+		ret = dpaa_fm_deconfig(dpaa_intf, dev->process_private);
+		if (ret) {
+			DPAA_PMD_WARN("%s: FM deconfig failed(%d)",
+				dev->data->name, ret);
+		}
 	}
 
 	dpaa_dev = container_of(rdev, struct rte_dpaa_device, device);
@@ -541,21 +546,37 @@ static int dpaa_eth_dev_close(struct rte_eth_dev *dev)
 	__fif = container_of(fif, struct __fman_if, __if);
 
 	ret = dpaa_eth_dev_stop(dev);
+	if (ret) {
+		DPAA_PMD_WARN("%s: stop device failed(%d)",
+			dev->data->name, ret);
+	}
 
 	if (fif->mac_type == fman_offline_internal ||
 	    fif->mac_type == fman_onic)
 		return 0;
 
 	/* Reset link to autoneg */
-	if (link->link_status && !link->link_autoneg)
-		dpaa_restart_link_autoneg(__fif->node_name);
+	if (link->link_status && !link->link_autoneg) {
+		ret = dpaa_restart_link_autoneg(__fif->node_name);
+		if (ret) {
+			DPAA_PMD_WARN("%s: restart link failed(%d)",
+				dev->data->name, ret);
+		}
+	}
 
 	if (intr_handle && rte_intr_fd_get(intr_handle) &&
 	    dev->data->dev_conf.intr_conf.lsc != 0) {
-		dpaa_intr_disable(__fif->node_name);
-		rte_intr_callback_unregister(intr_handle,
-					     dpaa_interrupt_handler,
-					     (void *)dev);
+		ret = dpaa_intr_disable(__fif->node_name);
+		if (ret) {
+			DPAA_PMD_WARN("%s: disable interrupt failed(%d)",
+				dev->data->name, ret);
+		}
+		ret = rte_intr_callback_unregister(intr_handle,
+			dpaa_interrupt_handler, (void *)dev);
+		if (ret) {
+			DPAA_PMD_WARN("%s: unregister interrupt failed(%d)",
+				dev->data->name, ret);
+		}
 	}
 
 	/* release configuration memory */
@@ -563,33 +584,60 @@ static int dpaa_eth_dev_close(struct rte_eth_dev *dev)
 
 	/* Release RX congestion Groups */
 	if (dpaa_intf->cgr_rx) {
-		for (loop = 0; loop < dpaa_intf->nb_rx_queues; loop++)
-			qman_delete_cgr(&dpaa_intf->cgr_rx[loop]);
+		for (loop = 0; loop < dpaa_intf->nb_rx_queues; loop++) {
+			ret = qman_delete_cgr(&dpaa_intf->cgr_rx[loop]);
+			if (ret) {
+				DPAA_PMD_WARN("%s: delete rxq%d's cgr err(%d)",
+					dev->data->name, loop, ret);
+			}
+		}
 		rte_free(dpaa_intf->cgr_rx);
 		dpaa_intf->cgr_rx = NULL;
 	}
 
 	/* Release TX congestion Groups */
 	if (dpaa_intf->cgr_tx) {
-		for (loop = 0; loop < MAX_DPAA_CORES; loop++)
-			qman_delete_cgr(&dpaa_intf->cgr_tx[loop]);
+		for (loop = 0; loop < MAX_DPAA_CORES; loop++) {
+			ret = qman_delete_cgr(&dpaa_intf->cgr_tx[loop]);
+			if (ret) {
+				DPAA_PMD_WARN("%s: delete txq%d's cgr err(%d)",
+					dev->data->name, loop, ret);
+			}
+		}
 		rte_free(dpaa_intf->cgr_tx);
 		dpaa_intf->cgr_tx = NULL;
 	}
 
+	/* Freeing queue specific portals */
+	for (loop = 0; loop < dpaa_intf->nb_rx_queues; loop++) {
+		if (!dpaa_intf->rx_queues)
+			break;
+
+		fq = &dpaa_intf->rx_queues[loop];
+		if (fq->qp_initialized) {
+			rte_dpaa_portal_fq_close(fq);
+			fq->qp_initialized = 0;
+		}
+	}
+
 	rte_free(dpaa_intf->rx_queues);
 	dpaa_intf->rx_queues = NULL;
 
 	rte_free(dpaa_intf->tx_queues);
 	dpaa_intf->tx_queues = NULL;
 	if (dpaa_intf->port_handle) {
-		if (dpaa_fm_deconfig(dpaa_intf, fif))
-			DPAA_PMD_WARN("DPAA FM "
-				"deconfig failed");
+		ret = dpaa_fm_deconfig(dpaa_intf, fif);
+		if (ret) {
+			DPAA_PMD_WARN("%s: FM deconfig failed(%d)",
+				dev->data->name, ret);
+		}
 	}
 	if (fif->num_profiles) {
-		if (dpaa_port_vsp_cleanup(dpaa_intf, fif))
-			DPAA_PMD_WARN("DPAA FM vsp cleanup failed");
+		ret = dpaa_port_vsp_cleanup(dpaa_intf, fif);
+		if (ret) {
+			DPAA_PMD_WARN("%s: cleanup VSP failed(%d)",
+				dev->data->name, ret);
+		}
 	}
 
 	return ret;
@@ -1462,6 +1510,8 @@ dpaa_flow_ctrl_set(struct rte_eth_dev *dev,
 {
 	struct dpaa_if *dpaa_intf = dev->data->dev_private;
 	struct rte_eth_fc_conf *net_fc;
+	struct fman_if *fm_if = dev->process_private;
+	int ret;
 
 	PMD_INIT_FUNC_TRACE();
 
@@ -1480,19 +1530,31 @@ dpaa_flow_ctrl_set(struct rte_eth_dev *dev,
 		return -EINVAL;
 	}
 
-	if (fc_conf->mode == RTE_ETH_FC_NONE) {
+	if (fc_conf->mode == RTE_ETH_FC_NONE)
 		return 0;
-	} else if (fc_conf->mode == RTE_ETH_FC_TX_PAUSE ||
-		 fc_conf->mode == RTE_ETH_FC_FULL) {
-		fman_if_set_fc_threshold(dev->process_private,
+
+	if (fc_conf->mode != RTE_ETH_FC_TX_PAUSE &&
+		fc_conf->mode != RTE_ETH_FC_FULL)
+		goto save_fc;
+
+	ret = fman_if_set_fc_threshold(fm_if,
 					 fc_conf->high_water,
 					 fc_conf->low_water,
 					 dpaa_intf->bp_info->bpid);
-		if (fc_conf->pause_time)
-			fman_if_set_fc_quanta(dev->process_private,
-					      fc_conf->pause_time);
+	if (ret) {
+		DPAA_PMD_ERR("Set %s's fc on bpid(%d) err(%d)",
+				dev->data->name, dpaa_intf->bp_info->bpid,
+				ret);
+	}
+	if (fc_conf->pause_time) {
+		ret = fman_if_set_fc_quanta(fm_if, fc_conf->pause_time);
+		if (ret) {
+			DPAA_PMD_ERR("Set %s's fc pause time err(%d)",
+				dev->data->name, ret);
+		}
 	}
 
+save_fc:
 	/* Save the information in dpaa device */
 	net_fc->pause_time = fc_conf->pause_time;
 	net_fc->high_water = fc_conf->high_water;
@@ -1619,13 +1681,15 @@ dpaa_dev_rss_hash_update(struct rte_eth_dev *dev,
 {
 	struct rte_eth_dev_data *data = dev->data;
 	struct rte_eth_conf *eth_conf = &data->dev_conf;
+	int ret;
 
 	PMD_INIT_FUNC_TRACE();
 
 	if (!(default_q || fmc_q)) {
-		if (dpaa_fm_config(dev, rss_conf->rss_hf)) {
-			DPAA_PMD_ERR("FM port configuration: Failed");
-			return -1;
+		ret = dpaa_fm_config(dev, rss_conf->rss_hf);
+		if (ret) {
+			DPAA_PMD_ERR("FM port configuration: Failed(%d)", ret);
+			return ret;
 		}
 		eth_conf->rx_adv_conf.rss_conf.rss_hf = rss_conf->rss_hf;
 	} else {
@@ -2233,8 +2297,8 @@ dpaa_dev_init(struct rte_eth_dev *eth_dev)
 	/* Each device can not have more than DPAA_MAX_NUM_PCD_QUEUES RX
 	 * queues.
 	 */
-	if (num_rx_fqs < 0 || num_rx_fqs > DPAA_MAX_NUM_PCD_QUEUES) {
-		DPAA_PMD_ERR("Invalid number of RX queues");
+	if (num_rx_fqs > DPAA_MAX_NUM_PCD_QUEUES) {
+		DPAA_PMD_ERR("Invalid number of RX queues(%d)", num_rx_fqs);
 		return -EINVAL;
 	}
 
@@ -2494,8 +2558,8 @@ rte_dpaa_probe(struct rte_dpaa_driver *dpaa_drv,
 		eth_dev->dev_ops = &dpaa_devops;
 
 		ret = dpaa_dev_init_secondary(eth_dev);
-		if (ret != 0) {
-			DPAA_PMD_ERR("secondary dev init failed");
+		if (ret) {
+			DPAA_PMD_ERR("secondary dev init failed(%d)", ret);
 			return ret;
 		}
 
@@ -2510,9 +2574,10 @@ rte_dpaa_probe(struct rte_dpaa_driver *dpaa_drv,
 		}
 
 		if (!(default_q || fmc_q)) {
-			if (dpaa_fm_init()) {
-				DPAA_PMD_ERR("FM init failed");
-				return -1;
+			ret = dpaa_fm_init();
+			if (ret) {
+				DPAA_PMD_ERR("FM init failed(%d)", ret);
+				return ret;
 			}
 		}
 
@@ -2587,39 +2652,71 @@ rte_dpaa_probe(struct rte_dpaa_driver *dpaa_drv,
 	return diag;
 }
 
-static int
-rte_dpaa_remove(struct rte_dpaa_device *dpaa_dev)
+/* Adding destructor for double check in case non-gracefully
+ * exit.
+ */
+static void __attribute__((destructor(103)))
+dpaa_finish(void)
 {
-	struct rte_eth_dev *eth_dev;
-	int ret;
+	struct dpaa_if *dpaa_intf;
+	int loop;
+	struct qman_fq *fq;
+	uint16_t portid;
+	struct rte_eth_dev *dev;
 
 	PMD_INIT_FUNC_TRACE();
-
-	eth_dev = dpaa_dev->eth_dev;
-	dpaa_eth_dev_close(eth_dev);
-	dpaa_valid_dev--;
-	if (!dpaa_valid_dev)
-		rte_mempool_free(dpaa_tx_sg_pool);
-	ret = rte_eth_dev_release_port(eth_dev);
-
-	return ret;
-}
-
-static void __attribute__((destructor(102))) dpaa_finish(void)
-{
 	/* For secondary, primary will do all the cleanup */
 	if (rte_eal_process_type() != RTE_PROC_PRIMARY)
 		return;
 
+	if (!is_global_init)
+		return;
+
 	if (!(default_q || fmc_q)) {
-		if (is_global_init)
 			if (dpaa_fm_term())
 				DPAA_PMD_WARN("DPAA FM term failed");
 
-		is_global_init = 0;
-
 		DPAA_PMD_INFO("DPAA fman cleaned up");
 	}
+
+	RTE_ETH_FOREACH_DEV(portid) {
+		dev = &rte_eth_devices[portid];
+		if (strcmp(dev->device->driver->name,
+			rte_dpaa_pmd.driver.name))
+			continue;
+		dpaa_intf = dev->data->dev_private;
+		/* Freeing queue specific portals */
+		for (loop = 0; loop < dpaa_intf->nb_rx_queues; loop++) {
+			if (!dpaa_intf->rx_queues)
+				break;
+
+			fq = &dpaa_intf->rx_queues[loop];
+			if (fq->qp_initialized) {
+				rte_dpaa_portal_fq_close(fq);
+				fq->qp_initialized = 0;
+			}
+		}
+	}
+	is_global_init = 0;
+}
+
+static int
+rte_dpaa_remove(struct rte_dpaa_device *dpaa_dev)
+{
+	struct rte_eth_dev *eth_dev;
+	int ret;
+
+	PMD_INIT_FUNC_TRACE();
+
+	eth_dev = dpaa_dev->eth_dev;
+	dpaa_eth_dev_close(eth_dev);
+	ret = rte_eth_dev_release_port(eth_dev);
+	dpaa_valid_dev--;
+	if (!dpaa_valid_dev) {
+		rte_mempool_free(dpaa_tx_sg_pool);
+		dpaa_finish();
+	}
+	return ret;
 }
 
 static struct rte_dpaa_driver rte_dpaa_pmd = {
-- 
2.25.1


^ permalink raw reply	[flat|nested] 14+ messages in thread

* [v1 10/10] bus/dpaa: optimize qman enqueue check
  2025-05-28 10:39 [v1 00/10] DPAA specific fixes vanshika.shukla
                   ` (8 preceding siblings ...)
  2025-05-28 10:39 ` [v1 09/10] bus/dpaa: improve DPAA cleanup vanshika.shukla
@ 2025-05-28 10:39 ` vanshika.shukla
  9 siblings, 0 replies; 14+ messages in thread
From: vanshika.shukla @ 2025-05-28 10:39 UTC (permalink / raw)
  To: dev, Hemant Agrawal, Sachin Saxena; +Cc: Jun Yang

From: Hemant Agrawal <hemant.agrawal@nxp.com>

This patch improves data access during qman enequeue ring check.

Signed-off-by: Jun Yang <jun.yang@nxp.com>
Signed-off-by: Hemant Agrawal <hemant.agrawal@nxp.com>
---
 drivers/bus/dpaa/base/qbman/qman.c  | 41 ++++++++++++++++-------------
 drivers/bus/dpaa/include/fsl_qman.h |  2 +-
 2 files changed, 23 insertions(+), 20 deletions(-)

diff --git a/drivers/bus/dpaa/base/qbman/qman.c b/drivers/bus/dpaa/base/qbman/qman.c
index fbce0638b7..60087c55a1 100644
--- a/drivers/bus/dpaa/base/qbman/qman.c
+++ b/drivers/bus/dpaa/base/qbman/qman.c
@@ -1466,7 +1466,7 @@ int qman_create_fq(u32 fqid, u32 flags, struct qman_fq *fq)
 	}
 	spin_lock_init(&fq->fqlock);
 	fq->fqid = fqid;
-	fq->fqid_le = cpu_to_be32(fqid);
+	fq->fqid_be = cpu_to_be32(fqid);
 	fq->flags = flags;
 	fq->state = qman_fq_state_oos;
 	fq->cgr_groupid = 0;
@@ -2291,7 +2291,7 @@ int qman_enqueue_multi(struct qman_fq *fq,
 	struct qm_portal *portal = &p->p;
 
 	register struct qm_eqcr *eqcr = &portal->eqcr;
-	struct qm_eqcr_entry *eq = eqcr->cursor, *prev_eq;
+	struct qm_eqcr_entry *eq = eqcr->cursor;
 
 	u8 i = 0, diff, old_ci, sent = 0;
 
@@ -2307,7 +2307,7 @@ int qman_enqueue_multi(struct qman_fq *fq,
 
 	/* try to send as many frames as possible */
 	while (eqcr->available && frames_to_send--) {
-		eq->fqid = fq->fqid_le;
+		eq->fqid = fq->fqid_be;
 		eq->fd.opaque_addr = fd->opaque_addr;
 		eq->fd.addr = cpu_to_be40(fd->addr);
 		eq->fd.status = cpu_to_be32(fd->status);
@@ -2317,8 +2317,9 @@ int qman_enqueue_multi(struct qman_fq *fq,
 				((flags[i] >> 8) & QM_EQCR_DCA_IDXMASK);
 		}
 		i++;
-		eq = (void *)((unsigned long)(eq + 1) &
-			(~(unsigned long)(QM_EQCR_SIZE << 6)));
+		eq++;
+		if (unlikely(eq >= (eqcr->ring + QM_EQCR_SIZE)))
+			eq = eqcr->ring;
 		eqcr->available--;
 		sent++;
 		fd++;
@@ -2332,11 +2333,11 @@ int qman_enqueue_multi(struct qman_fq *fq,
 	for (i = 0; i < sent; i++) {
 		eq->__dont_write_directly__verb =
 			QM_EQCR_VERB_CMD_ENQUEUE | eqcr->vbit;
-		prev_eq = eq;
-		eq = (void *)((unsigned long)(eq + 1) &
-			(~(unsigned long)(QM_EQCR_SIZE << 6)));
-		if (unlikely((prev_eq + 1) != eq))
+		eq++;
+		if (unlikely(eq >= (eqcr->ring + QM_EQCR_SIZE))) {
 			eqcr->vbit ^= QM_EQCR_VERB_VBIT;
+			eq = eqcr->ring;
+		}
 	}
 
 	/* We need  to flush all the lines but without load/store operations
@@ -2361,7 +2362,7 @@ qman_enqueue_multi_fq(struct qman_fq *fq[], const struct qm_fd *fd,
 	struct qm_portal *portal = &p->p;
 
 	register struct qm_eqcr *eqcr = &portal->eqcr;
-	struct qm_eqcr_entry *eq = eqcr->cursor, *prev_eq;
+	struct qm_eqcr_entry *eq = eqcr->cursor;
 
 	u8 i = 0, diff, old_ci, sent = 0;
 
@@ -2377,7 +2378,7 @@ qman_enqueue_multi_fq(struct qman_fq *fq[], const struct qm_fd *fd,
 
 	/* try to send as many frames as possible */
 	while (eqcr->available && frames_to_send--) {
-		eq->fqid = fq[sent]->fqid_le;
+		eq->fqid = fq[sent]->fqid_be;
 		eq->fd.opaque_addr = fd->opaque_addr;
 		eq->fd.addr = cpu_to_be40(fd->addr);
 		eq->fd.status = cpu_to_be32(fd->status);
@@ -2388,8 +2389,9 @@ qman_enqueue_multi_fq(struct qman_fq *fq[], const struct qm_fd *fd,
 		}
 		i++;
 
-		eq = (void *)((unsigned long)(eq + 1) &
-			(~(unsigned long)(QM_EQCR_SIZE << 6)));
+		eq++;
+		if (unlikely(eq >= (eqcr->ring + QM_EQCR_SIZE)))
+			eq = eqcr->ring;
 		eqcr->available--;
 		sent++;
 		fd++;
@@ -2403,11 +2405,11 @@ qman_enqueue_multi_fq(struct qman_fq *fq[], const struct qm_fd *fd,
 	for (i = 0; i < sent; i++) {
 		eq->__dont_write_directly__verb =
 			QM_EQCR_VERB_CMD_ENQUEUE | eqcr->vbit;
-		prev_eq = eq;
-		eq = (void *)((unsigned long)(eq + 1) &
-			(~(unsigned long)(QM_EQCR_SIZE << 6)));
-		if (unlikely((prev_eq + 1) != eq))
+		eq++;
+		if (unlikely(eq >= (eqcr->ring + QM_EQCR_SIZE))) {
 			eqcr->vbit ^= QM_EQCR_VERB_VBIT;
+			eq = eqcr->ring;
+		}
 	}
 
 	/* We need  to flush all the lines but without load/store operations
@@ -2416,8 +2418,9 @@ qman_enqueue_multi_fq(struct qman_fq *fq[], const struct qm_fd *fd,
 	eq = eqcr->cursor;
 	for (i = 0; i < sent; i++) {
 		dcbf(eq);
-		eq = (void *)((unsigned long)(eq + 1) &
-			(~(unsigned long)(QM_EQCR_SIZE << 6)));
+		eq++;
+		if (unlikely(eq >= (eqcr->ring + QM_EQCR_SIZE)))
+			eq = eqcr->ring;
 	}
 	/* Update cursor for the next call */
 	eqcr->cursor = eq;
diff --git a/drivers/bus/dpaa/include/fsl_qman.h b/drivers/bus/dpaa/include/fsl_qman.h
index b949f2c893..71d5b16878 100644
--- a/drivers/bus/dpaa/include/fsl_qman.h
+++ b/drivers/bus/dpaa/include/fsl_qman.h
@@ -1225,7 +1225,7 @@ struct qman_fq {
 	/* Caller of qman_create_fq() provides these demux callbacks */
 	struct qman_fq_cb cb;
 
-	u32 fqid_le;
+	rte_be32_t fqid_be;
 	u32 fqid;
 
 	int q_fd;
-- 
2.25.1


^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [v1 03/10] bus/dpaa: enhance DPAA SoC version
  2025-05-28 10:39 ` [v1 03/10] bus/dpaa: enhance DPAA SoC version vanshika.shukla
@ 2025-05-28 14:28   ` Stephen Hemminger
  0 siblings, 0 replies; 14+ messages in thread
From: Stephen Hemminger @ 2025-05-28 14:28 UTC (permalink / raw)
  To: vanshika.shukla; +Cc: dev, Hemant Agrawal, Sachin Saxena, Jun Yang

On Wed, 28 May 2025 16:09:27 +0530
vanshika.shukla@nxp.com wrote:

> +	if (s_rte_dpaa_bus.bus.conf.scan_mode != RTE_BUS_SCAN_ALLOWLIST)
> +		probe_all = true;
> +
> +	svr_file = fopen(DPAA_SOC_ID_FILE, "r");
> +	if (svr_file) {
> +		if (fscanf(svr_file, "svr:%x", &svr_ver) > 0)
> +			s_rte_dpaa_bus.svr_ver = svr_ver & DPAA_SVR_MASK;
> +		else
> +			s_rte_dpaa_bus.svr_ver = 0;
> +		fclose(svr_file);
> +	} else {
> +		s_rte_dpaa_bus.svr_ver = 0;
> +	}
> +	if (s_rte_dpaa_bus.svr_ver == SVR_LS1046A_FAMILY) {
> +		DPAA_BUS_LOG(NOTICE, "This is LS1046A family SoC.");
> +	} else if (s_rte_dpaa_bus.svr_ver == SVR_LS1043A_FAMILY) {
> +		DPAA_BUS_LOG(NOTICE, "This is LS1043A family SoC.");

Should be INFO not NOTICE, this is normal condition.

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [v1 04/10] bus/dpaa: optimize bman acquire/release
  2025-05-28 10:39 ` [v1 04/10] bus/dpaa: optimize bman acquire/release vanshika.shukla
@ 2025-05-28 14:30   ` Stephen Hemminger
  2025-05-28 14:50     ` [EXT] " Jun Yang
  0 siblings, 1 reply; 14+ messages in thread
From: Stephen Hemminger @ 2025-05-28 14:30 UTC (permalink / raw)
  To: vanshika.shukla; +Cc: dev, Hemant Agrawal, Sachin Saxena, Jun Yang

On Wed, 28 May 2025 16:09:28 +0530
vanshika.shukla@nxp.com wrote:

> +RTE_EXPORT_INTERNAL_SYMBOL(bman_acquire_fast)
> +int
> +bman_acquire_fast(struct bman_pool *pool, uint64_t *bufs, uint8_t num)
> +{
> +	struct bman_portal *p = get_affine_portal();
> +	struct bm_mc_command *mcc;
> +	struct bm_mc_result *mcr;
> +	uint8_t i, rst;
> +	struct bm_hw_buf_desc bm_bufs[FSL_BM_BURST_MAX];
> +
> +#ifdef RTE_LIBRTE_DPAA_HWDEBUG
> +	if (!num || (num > FSL_BM_BURST_MAX))
> +		return -EINVAL;
> +	if (pool->params.flags & BMAN_POOL_FLAG_ONLY_RELEASE)
> +		return -EINVAL;
> +#endif
> +
> +	mcc = bm_mc_start(&p->p);
> +	mcc->acquire.bpid = pool->params.bpid;
> +	bm_mc_commit(&p->p, BM_MCC_VERB_CMD_ACQUIRE |
> +			(num & BM_MCC_VERB_ACQUIRE_BUFCOUNT));
> +	while (!(mcr = bm_mc_result(&p->p)))
> +		;
> +	rst = mcr->verb & BM_MCR_VERB_ACQUIRE_BUFCOUNT;
> +	if (unlikely(!rst))
> +		return 0;
> +
> +	rte_memcpy(bm_bufs, mcr->acquire.bufs,
> +		sizeof(struct bm_buffer) * rst);
> +
> +	for (i = 0; i < rst; i++)
> +		bufs[i] = bman_hw_extract_addr(&bm_bufs[i]);
> +

Why do you need multiple the local copy?
Does hw_extract_addr modify the buffers?

^ permalink raw reply	[flat|nested] 14+ messages in thread

* RE: [EXT] Re: [v1 04/10] bus/dpaa: optimize bman acquire/release
  2025-05-28 14:30   ` Stephen Hemminger
@ 2025-05-28 14:50     ` Jun Yang
  0 siblings, 0 replies; 14+ messages in thread
From: Jun Yang @ 2025-05-28 14:50 UTC (permalink / raw)
  To: Stephen Hemminger, Vanshika Shukla; +Cc: dev, Hemant Agrawal, Sachin Saxena

Hi,
> +     rte_memcpy(bm_bufs, mcr->acquire.bufs,
> +             sizeof(struct bm_buffer) * rst);
"mcr->acquire.bufs" is located in register space, it is supposed to improve performance to copy it to DDR(bm_bufs) to parse and read.

BR
Jun

-----Original Message-----
From: Stephen Hemminger <stephen@networkplumber.org> 
Sent: Wednesday, May 28, 2025 10:31 PM
To: Vanshika Shukla <vanshika.shukla@nxp.com>
Cc: dev@dpdk.org; Hemant Agrawal <hemant.agrawal@nxp.com>; Sachin Saxena <sachin.saxena@nxp.com>; Jun Yang <jun.yang@nxp.com>
Subject: [EXT] Re: [v1 04/10] bus/dpaa: optimize bman acquire/release

Caution: This is an external email. Please take care when clicking links or opening attachments. When in doubt, report the message using the 'Report this email' button


On Wed, 28 May 2025 16:09:28 +0530
vanshika.shukla@nxp.com wrote:

> +RTE_EXPORT_INTERNAL_SYMBOL(bman_acquire_fast)
> +int
> +bman_acquire_fast(struct bman_pool *pool, uint64_t *bufs, uint8_t 
> +num) {
> +     struct bman_portal *p = get_affine_portal();
> +     struct bm_mc_command *mcc;
> +     struct bm_mc_result *mcr;
> +     uint8_t i, rst;
> +     struct bm_hw_buf_desc bm_bufs[FSL_BM_BURST_MAX];
> +
> +#ifdef RTE_LIBRTE_DPAA_HWDEBUG
> +     if (!num || (num > FSL_BM_BURST_MAX))
> +             return -EINVAL;
> +     if (pool->params.flags & BMAN_POOL_FLAG_ONLY_RELEASE)
> +             return -EINVAL;
> +#endif
> +
> +     mcc = bm_mc_start(&p->p);
> +     mcc->acquire.bpid = pool->params.bpid;
> +     bm_mc_commit(&p->p, BM_MCC_VERB_CMD_ACQUIRE |
> +                     (num & BM_MCC_VERB_ACQUIRE_BUFCOUNT));
> +     while (!(mcr = bm_mc_result(&p->p)))
> +             ;
> +     rst = mcr->verb & BM_MCR_VERB_ACQUIRE_BUFCOUNT;
> +     if (unlikely(!rst))
> +             return 0;
> +
> +     rte_memcpy(bm_bufs, mcr->acquire.bufs,
> +             sizeof(struct bm_buffer) * rst);
> +
> +     for (i = 0; i < rst; i++)
> +             bufs[i] = bman_hw_extract_addr(&bm_bufs[i]);
> +

Why do you need multiple the local copy?
Does hw_extract_addr modify the buffers?

^ permalink raw reply	[flat|nested] 14+ messages in thread

end of thread, other threads:[~2025-05-29  9:56 UTC | newest]

Thread overview: 14+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2025-05-28 10:39 [v1 00/10] DPAA specific fixes vanshika.shukla
2025-05-28 10:39 ` [v1 01/10] bus/dpaa: avoid using same structure and variable name vanshika.shukla
2025-05-28 10:39 ` [v1 02/10] bus/dpaa: add FMan node vanshika.shukla
2025-05-28 10:39 ` [v1 03/10] bus/dpaa: enhance DPAA SoC version vanshika.shukla
2025-05-28 14:28   ` Stephen Hemminger
2025-05-28 10:39 ` [v1 04/10] bus/dpaa: optimize bman acquire/release vanshika.shukla
2025-05-28 14:30   ` Stephen Hemminger
2025-05-28 14:50     ` [EXT] " Jun Yang
2025-05-28 10:39 ` [v1 05/10] mempool/dpaa: fast acquire and release vanshika.shukla
2025-05-28 10:39 ` [v1 06/10] mempool/dpaa: adjust pool element for LS1043A errata vanshika.shukla
2025-05-28 10:39 ` [v1 07/10] net/dpaa: add Tx rate limiting DPAA PMD API vanshika.shukla
2025-05-28 10:39 ` [v1 08/10] net/dpaa: add devargs for enabling err packets on main queue vanshika.shukla
2025-05-28 10:39 ` [v1 09/10] bus/dpaa: improve DPAA cleanup vanshika.shukla
2025-05-28 10:39 ` [v1 10/10] bus/dpaa: optimize qman enqueue check vanshika.shukla

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).