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 <qi...@yunsilicon.com>
Signed-off-by: Renyong Wan <wa...@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

Reply via email to