DPDK patches and discussions
 help / color / mirror / Atom feed
From: "Renyong Wan" <wanry@yunsilicon.com>
To: <dev@dpdk.org>
Cc: <thomas@monjalon.net>, <stephen@networkplumber.org>,
	 <qianr@yunsilicon.com>, <nana@yunsilicon.com>,
	<zhangxx@yunsilicon.com>,  <xudw@yunsilicon.com>,
	<jacky@yunsilicon.com>, <weihg@yunsilicon.com>,
	 <zhenghy@yunsilicon.com>
Subject: [PATCH 12/14] net/xsc: support per port for multi-process
Date: Fri, 29 Aug 2025 16:24:33 +0800	[thread overview]
Message-ID: <20250829082432.24369-13-wanry@yunsilicon.com> (raw)
In-Reply-To: <20250829082406.24369-1-wanry@yunsilicon.com>

Previously, the PCT manager was shared across all ports, which prevented
two ports from operating independently in separate DPDK processes. This
patch makes the PCT manager per-port, allowing each port to manage its
resources separately.

Signed-off-by: Rong Qian <qianr@yunsilicon.com>
Signed-off-by: Renyong Wan <wanry@yunsilicon.com>
---
 drivers/net/xsc/xsc_dev.c    | 40 +++++++++++++++++++++--
 drivers/net/xsc/xsc_dev.h    |  4 +++
 drivers/net/xsc/xsc_ethdev.c |  2 +-
 drivers/net/xsc/xsc_np.c     | 61 +++++++++++++++++++++---------------
 drivers/net/xsc/xsc_np.h     | 10 +++---
 5 files changed, 83 insertions(+), 34 deletions(-)

diff --git a/drivers/net/xsc/xsc_dev.c b/drivers/net/xsc/xsc_dev.c
index 6b24ea98d0..b92bed3a40 100644
--- a/drivers/net/xsc/xsc_dev.c
+++ b/drivers/net/xsc/xsc_dev.c
@@ -324,7 +324,7 @@ void
 xsc_dev_uninit(struct xsc_dev *xdev)
 {
 	PMD_INIT_FUNC_TRACE();
-	xsc_dev_pct_uninit();
+	xsc_dev_pct_uninit(xdev);
 	xsc_dev_close(xdev, XSC_DEV_REPR_ID_INVALID);
 	rte_free(xdev);
 }
@@ -363,7 +363,11 @@ xsc_dev_init(struct rte_pci_device *pci_dev, struct xsc_dev **xdev)
 		goto hwinfo_init_fail;
 	}
 
-	ret = xsc_dev_pct_init();
+	ret = xsc_dev_mac_port_init(d);
+	if (ret)
+		goto hwinfo_init_fail;
+
+	ret = xsc_dev_pct_init(d);
 	if (ret) {
 		PMD_DRV_LOG(ERR, "Failed to init xsc pct");
 		ret = -EINVAL;
@@ -689,3 +693,35 @@ xsc_dev_fec_set(struct xsc_dev *xdev, uint32_t mode)
 
 	return 0;
 }
+
+int
+xsc_dev_mac_port_init(struct xsc_dev *xdev)
+{
+	uint32_t i;
+	uint8_t num = 0;
+	uint32_t mac_port = xdev->hwinfo.mac_phy_port;
+	uint8_t mac_bit = xdev->hwinfo.mac_bit;
+	uint8_t *mac_idx = &xdev->hwinfo.mac_port_idx;
+	uint8_t *mac_num = &xdev->hwinfo.mac_port_num;
+	uint8_t bit_sz = sizeof(mac_bit) * 8;
+
+	*mac_idx = 0xff;
+	for (i = 0; i < bit_sz; i++) {
+		if (mac_bit & (1U << i)) {
+			if (i == mac_port)
+				*mac_idx = num;
+			num++;
+		}
+	}
+	*mac_num = num;
+
+	if (*mac_num == 0 || *mac_idx == 0xff) {
+		PMD_DRV_LOG(ERR, "Failed to parse mac port %u index, mac bit 0x%x",
+			    mac_port, mac_bit);
+		return -1;
+	}
+
+	PMD_DRV_LOG(DEBUG, "Mac port num %u, mac port %u, mac index %u",
+		    *mac_num, mac_port, *mac_idx);
+	return 0;
+}
diff --git a/drivers/net/xsc/xsc_dev.h b/drivers/net/xsc/xsc_dev.h
index e058ffdc21..fc356375f1 100644
--- a/drivers/net/xsc/xsc_dev.h
+++ b/drivers/net/xsc/xsc_dev.h
@@ -124,6 +124,8 @@ struct xsc_hwinfo {
 	uint8_t pct_compress_vld;
 	uint8_t mac_bit;
 	uint8_t esw_mode;
+	uint8_t mac_port_idx;
+	uint8_t mac_port_num;
 	char fw_ver[XSC_FW_VERS_LEN];
 };
 
@@ -185,6 +187,7 @@ struct xsc_dev {
 	int ctrl_fd;
 	rte_intr_callback_fn intr_cb;
 	void *intr_cb_arg;
+	struct xsc_dev_pct_mgr pct_mgr;
 };
 
 struct xsc_module_eeprom_query_params {
@@ -278,5 +281,6 @@ int xsc_dev_intr_handler_install(struct xsc_dev *xdev, rte_intr_callback_fn cb,
 int xsc_dev_intr_handler_uninstall(struct xsc_dev *xdev);
 int xsc_dev_fec_get(struct xsc_dev *xdev, uint32_t *fec_capa);
 int xsc_dev_fec_set(struct xsc_dev *xdev, uint32_t mode);
+int xsc_dev_mac_port_init(struct xsc_dev *xdev);
 
 #endif /* _XSC_DEV_H_ */
diff --git a/drivers/net/xsc/xsc_ethdev.c b/drivers/net/xsc/xsc_ethdev.c
index 70417b2d5b..6102c158e8 100644
--- a/drivers/net/xsc/xsc_ethdev.c
+++ b/drivers/net/xsc/xsc_ethdev.c
@@ -1091,7 +1091,7 @@ xsc_ethdev_uninit(struct rte_eth_dev *eth_dev)
 	}
 
 	ret |= xsc_ethdev_close(eth_dev);
-	xsc_dev_pct_uninit();
+	xsc_dev_pct_uninit(priv->xdev);
 	rte_free(priv->xdev);
 
 	return ret == 0 ? 0 : -EIO;
diff --git a/drivers/net/xsc/xsc_np.c b/drivers/net/xsc/xsc_np.c
index 2b85fd93f8..4f872daec1 100644
--- a/drivers/net/xsc/xsc_np.c
+++ b/drivers/net/xsc/xsc_np.c
@@ -15,10 +15,8 @@
 #define XSC_LOGIC_PORT_MASK		0x07FF
 
 #define XSC_DEV_DEF_PCT_IDX_MIN		128
-#define XSC_DEV_DEF_PCT_IDX_MAX		138
-
-/* Each board has a PCT manager*/
-static struct xsc_dev_pct_mgr xsc_pct_mgr;
+#define XSC_DEV_DEF_PCT_IDX_MAX		191
+#define XSC_DEV_DEF_PCT_NUM		(XSC_DEV_DEF_PCT_IDX_MAX - XSC_DEV_DEF_PCT_IDX_MIN + 1)
 
 enum xsc_np_type {
 	XSC_NP_IPAT		= 0,
@@ -207,13 +205,13 @@ xsc_dev_create_pct(struct xsc_dev *xdev, int repr_id,
 	add.key.logical_in_port = logical_in_port & XSC_LOGIC_PORT_MASK;
 	add.mask.logical_in_port = XSC_LOGIC_PORT_MASK;
 	add.action.dst_info = dst_info;
-	add.pct_idx = xsc_dev_pct_idx_alloc();
+	add.pct_idx = xsc_dev_pct_idx_alloc(xdev);
 	if (add.pct_idx == XSC_DEV_PCT_IDX_INVALID)
 		return -1;
 
 	ret = xsc_dev_np_exec(xdev, &add, sizeof(add), XSC_NP_PCT_V4, XSC_NP_OP_ADD);
 	if (unlikely(ret != 0)) {
-		xsc_dev_pct_idx_free(add.pct_idx);
+		xsc_dev_pct_idx_free(xdev, add.pct_idx);
 		return -1;
 	}
 
@@ -248,7 +246,7 @@ xsc_dev_clear_pct(struct xsc_dev *xdev, int repr_id)
 
 	while ((pct_entry = xsc_dev_pct_first_get(pct_list)) != NULL) {
 		xsc_dev_destroy_pct(xdev, pct_entry->logic_port, pct_entry->pct_idx);
-		xsc_dev_pct_entry_remove(pct_entry);
+		xsc_dev_pct_entry_remove(xdev, pct_entry);
 	}
 }
 
@@ -404,23 +402,23 @@ xsc_dev_create_vfos_baselp(struct xsc_dev *xdev)
 }
 
 void
-xsc_dev_pct_uninit(void)
+xsc_dev_pct_uninit(struct xsc_dev *xdev)
 {
-	rte_free(xsc_pct_mgr.bmp_mem);
-	xsc_pct_mgr.bmp_mem = NULL;
+	rte_free(xdev->pct_mgr.bmp_mem);
+	xdev->pct_mgr.bmp_mem = NULL;
 }
 
 int
-xsc_dev_pct_init(void)
+xsc_dev_pct_init(struct xsc_dev *xdev)
 {
 	int ret;
 	uint8_t *bmp_mem;
 	uint32_t pos, pct_sz, bmp_sz;
 
-	if (xsc_pct_mgr.bmp_mem != NULL)
+	if (xdev->pct_mgr.bmp_mem != NULL)
 		return 0;
 
-	pct_sz = XSC_DEV_DEF_PCT_IDX_MAX - XSC_DEV_DEF_PCT_IDX_MIN + 1;
+	pct_sz = XSC_DEV_DEF_PCT_NUM / xdev->hwinfo.mac_port_num;
 	bmp_sz = rte_bitmap_get_memory_footprint(pct_sz);
 	bmp_mem = rte_zmalloc(NULL, bmp_sz, RTE_CACHE_LINE_SIZE);
 	if (bmp_mem == NULL) {
@@ -429,9 +427,9 @@ xsc_dev_pct_init(void)
 		goto pct_init_fail;
 	}
 
-	xsc_pct_mgr.bmp_mem = bmp_mem;
-	xsc_pct_mgr.bmp_pct = rte_bitmap_init(pct_sz, bmp_mem, bmp_sz);
-	if (xsc_pct_mgr.bmp_pct == NULL) {
+	xdev->pct_mgr.bmp_mem = bmp_mem;
+	xdev->pct_mgr.bmp_pct = rte_bitmap_init(pct_sz, bmp_mem, bmp_sz);
+	if (xdev->pct_mgr.bmp_pct == NULL) {
 		PMD_DRV_LOG(ERR, "Failed to init pct bitmap");
 		ret = -EINVAL;
 		goto pct_init_fail;
@@ -439,27 +437,32 @@ xsc_dev_pct_init(void)
 
 	/* Mark all pct bitmap available */
 	for (pos = 0; pos < pct_sz; pos++)
-		rte_bitmap_set(xsc_pct_mgr.bmp_pct, pos);
+		rte_bitmap_set(xdev->pct_mgr.bmp_pct, pos);
 
 	return 0;
 
 pct_init_fail:
-	xsc_dev_pct_uninit();
+	xsc_dev_pct_uninit(xdev);
 	return ret;
 }
 
 uint32_t
-xsc_dev_pct_idx_alloc(void)
+xsc_dev_pct_idx_alloc(struct xsc_dev *xdev)
 {
 	int ret;
 	uint64_t slab = 0;
 	uint32_t pos = 0;
+	uint8_t mac_num = xdev->hwinfo.mac_port_num;
+	uint8_t mac_idx = xdev->hwinfo.mac_port_idx;
+	struct rte_bitmap *bmp_pct = xdev->pct_mgr.bmp_pct;
+	uint32_t pct_range = XSC_DEV_DEF_PCT_NUM / mac_num;
+	uint32_t pct_base = XSC_DEV_DEF_PCT_IDX_MIN + mac_idx * pct_range;
 
-	ret = rte_bitmap_scan(xsc_pct_mgr.bmp_pct, &pos, &slab);
+	ret = rte_bitmap_scan(bmp_pct, &pos, &slab);
 	if (ret != 0) {
 		pos += rte_bsf64(slab);
-		rte_bitmap_clear(xsc_pct_mgr.bmp_pct, pos);
-		return (pos + XSC_DEV_DEF_PCT_IDX_MIN);
+		rte_bitmap_clear(bmp_pct, pos);
+		return (pos + pct_base);
 	}
 
 	PMD_DRV_LOG(ERR, "Failed to alloc xsc pct idx");
@@ -467,9 +470,15 @@ xsc_dev_pct_idx_alloc(void)
 }
 
 void
-xsc_dev_pct_idx_free(uint32_t pct_idx)
+xsc_dev_pct_idx_free(struct xsc_dev *xdev, uint32_t pct_idx)
 {
-	rte_bitmap_set(xsc_pct_mgr.bmp_pct, pct_idx - XSC_DEV_DEF_PCT_IDX_MIN);
+	uint8_t mac_num = xdev->hwinfo.mac_port_num;
+	uint8_t mac_idx = xdev->hwinfo.mac_port_idx;
+	struct rte_bitmap *bmp_pct = xdev->pct_mgr.bmp_pct;
+	uint32_t pct_range = XSC_DEV_DEF_PCT_NUM / mac_num;
+	uint32_t pct_base = XSC_DEV_DEF_PCT_IDX_MIN + mac_idx * pct_range;
+
+	rte_bitmap_set(bmp_pct, pct_idx - pct_base);
 }
 
 int
@@ -501,12 +510,12 @@ xsc_dev_pct_first_get(struct xsc_dev_pct_list *pct_list)
 }
 
 int
-xsc_dev_pct_entry_remove(struct xsc_dev_pct_entry *pct_entry)
+xsc_dev_pct_entry_remove(struct xsc_dev *xdev, struct xsc_dev_pct_entry *pct_entry)
 {
 	if (pct_entry == NULL)
 		return -1;
 
-	xsc_dev_pct_idx_free(pct_entry->pct_idx);
+	xsc_dev_pct_idx_free(xdev, pct_entry->pct_idx);
 	LIST_REMOVE(pct_entry, next);
 	rte_free(pct_entry);
 
diff --git a/drivers/net/xsc/xsc_np.h b/drivers/net/xsc/xsc_np.h
index ca185c0a59..dadb24be46 100644
--- a/drivers/net/xsc/xsc_np.h
+++ b/drivers/net/xsc/xsc_np.h
@@ -148,13 +148,13 @@ int xsc_dev_modify_epat_mac_filter(struct xsc_dev *xdev, uint16_t dst_info,
 int xsc_dev_destroy_epat(struct xsc_dev *xdev, uint16_t dst_info);
 int xsc_dev_set_qpsetid(struct xsc_dev *xdev, uint32_t txqpn, uint16_t qp_set_id);
 int xsc_dev_create_vfos_baselp(struct xsc_dev *xdev);
-void xsc_dev_pct_uninit(void);
-int xsc_dev_pct_init(void);
-uint32_t xsc_dev_pct_idx_alloc(void);
-void xsc_dev_pct_idx_free(uint32_t pct_idx);
+void xsc_dev_pct_uninit(struct xsc_dev *xdev);
+int xsc_dev_pct_init(struct xsc_dev *xdev);
+uint32_t xsc_dev_pct_idx_alloc(struct xsc_dev *xdev);
+void xsc_dev_pct_idx_free(struct xsc_dev *xdev, uint32_t pct_idx);
 int xsc_dev_pct_entry_insert(struct xsc_dev_pct_list *pct_list,
 			     uint32_t logic_port, uint32_t pct_idx);
 struct xsc_dev_pct_entry *xsc_dev_pct_first_get(struct xsc_dev_pct_list *pct_list);
-int xsc_dev_pct_entry_remove(struct xsc_dev_pct_entry *pct_entry);
+int xsc_dev_pct_entry_remove(struct xsc_dev *xdev, struct xsc_dev_pct_entry *pct_entry);
 
 #endif /* _XSC_NP_H_ */
-- 
2.25.1

  parent reply	other threads:[~2025-08-29  8:25 UTC|newest]

Thread overview: 15+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-08-29  8:24 [PATCH 00/14] net/xsc: PMD updates Renyong Wan
2025-08-29  8:24 ` [PATCH 01/14] net/xsc: add FW version get support Renyong Wan
2025-08-29  8:24 ` [PATCH 02/14] net/xsc: add TSO support Renyong Wan
2025-08-29  8:24 ` [PATCH 03/14] net/xsc: support module EEPROM dump Renyong Wan
2025-08-29  8:24 ` [PATCH 04/14] net/xsc: support promiscuous mode Renyong Wan
2025-08-29  8:24 ` [PATCH 05/14] net/xsc: add link status support Renyong Wan
2025-08-29  8:24 ` [PATCH 06/14] net/xsc: add link status event support Renyong Wan
2025-08-29  8:24 ` [PATCH 07/14] net/xsc: add FEC get and set support Renyong Wan
2025-08-29  8:24 ` [PATCH 08/14] net/xsc: optimize RSS queue creation Renyong Wan
2025-08-29  8:24 ` [PATCH 09/14] net/xsc: optimize QP and CQ memory allocation Renyong Wan
2025-08-29  8:24 ` [PATCH 10/14] net/xsc: optimize Rx path Renyong Wan
2025-08-29  8:24 ` [PATCH 11/14] net/xsc: optimize stop and close Renyong Wan
2025-08-29  8:24 ` Renyong Wan [this message]
2025-08-29  8:24 ` [PATCH 13/14] net/xsc: fix uninitialized value Renyong Wan
2025-08-29  8:24 ` [PATCH 14/14] net/xsc: update release notes for xsc PMD Renyong Wan

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20250829082432.24369-13-wanry@yunsilicon.com \
    --to=wanry@yunsilicon.com \
    --cc=dev@dpdk.org \
    --cc=jacky@yunsilicon.com \
    --cc=nana@yunsilicon.com \
    --cc=qianr@yunsilicon.com \
    --cc=stephen@networkplumber.org \
    --cc=thomas@monjalon.net \
    --cc=weihg@yunsilicon.com \
    --cc=xudw@yunsilicon.com \
    --cc=zhangxx@yunsilicon.com \
    --cc=zhenghy@yunsilicon.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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).