DPDK patches and discussions
 help / color / mirror / Atom feed
* [PATCH v1] net/zxdh: support multiple PF process flow table
@ 2025-09-24  8:23 Tianhao Zhang
  2025-09-24 20:28 ` Stephen Hemminger
                   ` (4 more replies)
  0 siblings, 5 replies; 6+ messages in thread
From: Tianhao Zhang @ 2025-09-24  8:23 UTC (permalink / raw)
  To: stephen, wang.junlong1, yang.yonggang; +Cc: dev, Tianhao Zhang


[-- Attachment #1.1.1: Type: text/plain, Size: 61569 bytes --]

Support multiple PF process flow table.

Signed-off-by: Tianhao Zhang <zhang.tianhao2@zte.com.cn>
---
 drivers/net/zxdh/meson.build       |  10 +-
 drivers/net/zxdh/zxdh_ethdev.c     | 138 ++++++++-------
 drivers/net/zxdh/zxdh_ethdev.h     |   9 +-
 drivers/net/zxdh/zxdh_ethdev_ops.c |  20 +--
 drivers/net/zxdh/zxdh_np.c         | 269 +++++++++++++++++------------
 drivers/net/zxdh/zxdh_np.h         |  18 +-
 drivers/net/zxdh/zxdh_tables.c     |  72 ++++----
 7 files changed, 299 insertions(+), 237 deletions(-)

diff --git a/drivers/net/zxdh/meson.build b/drivers/net/zxdh/meson.build
index 7554d4dc60..0213ccb2fa 100644
--- a/drivers/net/zxdh/meson.build
+++ b/drivers/net/zxdh/meson.build
@@ -1,15 +1,9 @@
 # SPDX-License-Identifier: BSD-3-Clause
 # Copyright(c) 2024 ZTE Corporation
 
-if not is_linux
+if not is_linux or not dpdk_conf.get('RTE_ARCH_64')
     build = false
-    reason = 'only supported on Linux'
-    subdir_done()
-endif
-
-if arch_subdir != 'x86' and arch_subdir != 'arm' or not dpdk_conf.get('RTE_ARCH_64')
-    build = false
-    reason = 'only supported on x86_64 and aarch64'
+    reason = 'only supported on 64-bit Linux'
     subdir_done()
 endif
 
diff --git a/drivers/net/zxdh/zxdh_ethdev.c b/drivers/net/zxdh/zxdh_ethdev.c
index 0429bd0333..4d54e92d39 100644
--- a/drivers/net/zxdh/zxdh_ethdev.c
+++ b/drivers/net/zxdh/zxdh_ethdev.c
@@ -20,7 +20,7 @@
 #include "zxdh_ethdev_ops.h"
 
 struct zxdh_hw_internal zxdh_hw_internal[RTE_MAX_ETHPORTS];
-struct zxdh_dev_shared_data g_dev_sd[ZXDH_SLOT_MAX];
+struct zxdh_dev_nic_shared_data dev_nic_sd[ZXDH_SLOT_MAX];
 static rte_spinlock_t zxdh_shared_data_lock = RTE_SPINLOCK_INITIALIZER;
 struct zxdh_shared_data *zxdh_shared_data;
 struct zxdh_net_hdr_dl g_net_hdr_dl[RTE_MAX_ETHPORTS];
@@ -1141,26 +1141,26 @@ zxdh_np_dtb_data_res_free(struct zxdh_hw *hw)
 	int i;
 
 	if (dtb_data->init_done && dtb_data->bind_device == dev) {
-		ret = zxdh_np_online_uninit(hw->slot_id, dev->data->name, dtb_data->queueid);
+		ret = zxdh_np_online_uninit(hw->dev_id, dev->data->name, dtb_data->queueid);
 		if (ret)
 			PMD_DRV_LOG(ERR, "%s dpp_np_online_uninstall failed", dev->data->name);
 
-		rte_memzone_free(dtb_data->dtb_table_conf_mz);
-		dtb_data->dtb_table_conf_mz = NULL;
-		rte_memzone_free(dtb_data->dtb_table_dump_mz);
-		dtb_data->dtb_table_dump_mz = NULL;
-
-		for (i = 0; i < ZXDH_MAX_BASE_DTB_TABLE_COUNT; i++) {
-			if (dtb_data->dtb_table_bulk_dump_mz[i]) {
-				rte_memzone_free(dtb_data->dtb_table_bulk_dump_mz[i]);
-				dtb_data->dtb_table_bulk_dump_mz[i] = NULL;
-			}
-		}
+		hw->dev_nic_sd->dtb_used_num--;
 		dtb_data->init_done = 0;
 		dtb_data->bind_device = NULL;
 	}
-	if (zxdh_shared_data != NULL)
-		zxdh_shared_data->np_init_done = 0;
+
+	rte_memzone_free(dtb_data->dtb_table_conf_mz);
+	dtb_data->dtb_table_conf_mz = NULL;
+	rte_memzone_free(dtb_data->dtb_table_dump_mz);
+	dtb_data->dtb_table_dump_mz = NULL;
+
+	for (i = 0; i < ZXDH_MAX_BASE_DTB_TABLE_COUNT; i++) {
+		if (dtb_data->dtb_table_bulk_dump_mz[i]) {
+			rte_memzone_free(dtb_data->dtb_table_bulk_dump_mz[i]);
+			dtb_data->dtb_table_bulk_dump_mz[i] = NULL;
+		}
+	}
 }
 
 static int
@@ -1191,17 +1191,19 @@ static void
 zxdh_np_uninit(struct rte_eth_dev *dev)
 {
 	struct zxdh_hw *hw = dev->data->dev_private;
-	struct zxdh_dtb_shared_data *dtb_data = &hw->dev_sd->dtb_sd;
 
 	if (!hw->is_pf)
 		return;
-	if (!dtb_data->init_done && !dtb_data->dev_refcnt)
-		return;
 
 	zxdh_tbl_entry_online_destroy(dev);
+	zxdh_np_dtb_data_res_free(hw);
+
+	if (hw->dev_nic_sd->init_done && hw->dev_nic_sd->dtb_used_num == 0) {
+		zxdh_np_soft_res_uninstall(hw->dev_id);
+		hw->dev_nic_sd->init_done = 0;
+	}
+	PMD_DRV_LOG(DEBUG, "zxdh_np_destroy: dtb_used_num %d", hw->dev_nic_sd->dtb_used_num);
 
-	if (--dtb_data->dev_refcnt == 0)
-		zxdh_np_dtb_data_res_free(hw);
 }
 
 static int
@@ -1254,6 +1256,17 @@ zxdh_dev_stop(struct rte_eth_dev *dev)
 	return ret;
 }
 
+static void
+zxdh_priv_res_free(struct zxdh_hw *priv)
+{
+	rte_free(priv->vfinfo);
+	priv->vfinfo = NULL;
+	if (priv->channel_context != NULL) {
+		rte_free(priv->channel_context);
+		priv->channel_context = NULL;
+	}
+}
+
 static int
 zxdh_dev_close(struct rte_eth_dev *dev)
 {
@@ -1285,7 +1298,9 @@ zxdh_dev_close(struct rte_eth_dev *dev)
 	zxdh_free_queues(dev);
 
 	zxdh_bar_msg_chan_exit();
+	zxdh_priv_res_free(hw);
 
+	rte_free(hw->dev_sd);
 	if (dev->data->mac_addrs != NULL) {
 		rte_free(dev->data->mac_addrs);
 		dev->data->mac_addrs = NULL;
@@ -1615,6 +1630,7 @@ zxdh_np_dtb_res_init(struct rte_eth_dev *dev)
 	struct zxdh_bar_offset_res res = {0};
 	char buf[ZXDH_MAX_NAME_LEN] = {0};
 	struct zxdh_dtb_shared_data *dtb_data = &hw->dev_sd->dtb_sd;
+	struct zxdh_dev_nic_shared_data *dev_nic_sd = hw->dev_nic_sd;
 	int ret = 0;
 
 	if (dtb_data->init_done) {
@@ -1625,15 +1641,13 @@ zxdh_np_dtb_res_init(struct rte_eth_dev *dev)
 
 	dtb_data->queueid = ZXDH_INVALID_DTBQUE;
 	dtb_data->bind_device = dev;
-	dtb_data->dev_refcnt++;
-	dtb_data->init_done = 1;
 
 	ZXDH_DEV_INIT_CTRL_T *dpp_ctrl = rte_zmalloc(NULL, sizeof(*dpp_ctrl) +
 			sizeof(ZXDH_DTB_ADDR_INFO_T) * 256, 0);
 	if (dpp_ctrl == NULL) {
 		PMD_DRV_LOG(ERR, "dev %s annot allocate memory for dpp_ctrl", dev->device->name);
 		ret = -ENOMEM;
-		goto free_res;
+		return ret;
 	}
 	dpp_ctrl->queue_id = 0xff;
 	dpp_ctrl->vport = hw->vport.vport;
@@ -1694,7 +1708,7 @@ zxdh_np_dtb_res_init(struct rte_eth_dev *dev)
 		goto free_res;
 	}
 
-	ret = zxdh_np_host_init(hw->slot_id, dpp_ctrl);
+	ret = zxdh_np_host_init(hw->dev_id, dpp_ctrl);
 	if (ret) {
 		PMD_DRV_LOG(ERR, "dev %s dpp host np init failed", dev->device->name);
 		goto free_res;
@@ -1703,6 +1717,9 @@ zxdh_np_dtb_res_init(struct rte_eth_dev *dev)
 	PMD_DRV_LOG(DEBUG, "dev %s dpp host np init ok.dtb queue %u",
 		dev->device->name, dpp_ctrl->queue_id);
 	dtb_data->queueid = dpp_ctrl->queue_id;
+	dtb_data->dev_refcnt++;
+	dev_nic_sd->dtb_used_num++;
+	dtb_data->init_done = 1;
 	rte_free(dpp_ctrl);
 	return 0;
 
@@ -1717,11 +1734,11 @@ zxdh_get_dev_shared_data_idx(uint32_t dev_serial_id)
 {
 	uint16_t idx = 0;
 	for (; idx < ZXDH_SLOT_MAX; idx++) {
-		if (g_dev_sd[idx].serial_id == dev_serial_id || g_dev_sd[idx].serial_id == 0)
+		if (dev_nic_sd[idx].serial_id == dev_serial_id || dev_nic_sd[idx].serial_id == 0)
 			return idx;
 	}
 
-	PMD_DRV_LOG(ERR, "dev serial_id[%u] can not found in global dev_share_data arrays",
+	PMD_DRV_LOG(ERR, "dev serial_id[%u] can not found in global dev_nic_share_data arrays",
 		dev_serial_id);
 	return ZXDH_INVALID_SLOT_IDX;
 }
@@ -1744,9 +1761,10 @@ static int zxdh_init_dev_share_data(struct rte_eth_dev *eth_dev)
 		return -EINVAL;
 
 	hw->slot_id = slot_id;
-	hw->dev_id = (hw->pcie_id << 16) | (hw->slot_id & 0xffff);
-	g_dev_sd[slot_id].serial_id = serial_id;
-	hw->dev_sd = &g_dev_sd[slot_id];
+	hw->dev_id = hw->pcie_id;
+	dev_nic_sd[slot_id].serial_id = serial_id;
+	hw->dev_nic_sd = &dev_nic_sd[slot_id];
+	hw->dev_sd = rte_zmalloc("zxdh_dtb", sizeof(struct zxdh_dev_shared_data), 0);
 
 	return 0;
 }
@@ -1938,41 +1956,39 @@ zxdh_np_init(struct rte_eth_dev *eth_dev)
 {
 	struct zxdh_hw *hw = eth_dev->data->dev_private;
 	struct zxdh_dtb_shared_data *dtb_data = &hw->dev_sd->dtb_sd;
+	struct zxdh_dev_nic_shared_data *dev_nic_sd = hw->dev_nic_sd;
 	int ret = 0;
 
-	if (hw->is_pf && dtb_data->init_done) {
-		dtb_data->dev_refcnt++;
-		zxdh_tbl_entry_offline_destroy(hw);
-		PMD_DRV_LOG(INFO, "no need to init dtb  dtb chanenl %d devref %d",
-			dtb_data->queueid, dtb_data->dev_refcnt);
+	if (!hw->is_pf)
 		return 0;
-	}
 
-	if (hw->is_pf) {
-		ret = zxdh_np_dtb_res_init(eth_dev);
-		if (ret) {
-			PMD_DRV_LOG(ERR, "np dtb init failed, ret:%d", ret);
-			return ret;
-		}
+	hw->dev_id = (hw->pcie_id << 16) | (hw->slot_id & 0xffff);
+
+	ret = zxdh_np_dtb_res_init(eth_dev);
+	if (ret) {
+		PMD_DRV_LOG(ERR, "np dtb init failed, ret:%d", ret);
+		return ret;
 	}
 
-	if (hw->is_pf) {
-		ret = zxdh_np_se_res_get_and_init(hw->dev_id, ZXDH_SE_STD_NIC_RES_TYPE);
-		if (ret) {
-			PMD_DRV_LOG(ERR, "dpp apt init failed, code:%d ", ret);
-			return -ret;
-		}
-		if (!hw->switchoffload) {
-			if (hw->hash_search_index >= ZXDH_HASHIDX_MAX) {
-				PMD_DRV_LOG(ERR, "invalid hash idx %d", hw->hash_search_index);
-				return -1;
-			}
-			zxdh_tbl_entry_offline_destroy(hw);
+	if (dev_nic_sd->init_done) {
+		zxdh_tbl_entry_offline_destroy(hw);
+		PMD_DRV_LOG(ERR, "no need to init apt res. slot_id %d dtb chanenl %d dtb_used_num %d",
+			hw->slot_id, dtb_data->queueid, hw->dev_nic_sd->dtb_used_num);
+		return 0;
+	}
+	ret = zxdh_np_se_res_get_and_init(hw->dev_id, ZXDH_SE_STD_NIC_RES_TYPE);
+	if (ret) {
+		PMD_DRV_LOG(ERR, "dpp apt init failed, code:%d ", ret);
+		return -ret;
+	}
+	if (!hw->switchoffload) {
+		if (hw->hash_search_index >= ZXDH_HASHIDX_MAX) {
+			PMD_DRV_LOG(ERR, "invalid hash idx %d", hw->hash_search_index);
+			return -1;
 		}
+		zxdh_tbl_entry_offline_destroy(hw);
 	}
-
-	if (zxdh_shared_data != NULL)
-		zxdh_shared_data->np_init_done = 1;
+	dev_nic_sd->init_done = 1;
 
 	PMD_DRV_LOG(DEBUG, "np init ok");
 	return 0;
@@ -2069,16 +2085,6 @@ zxdh_priv_res_init(struct zxdh_hw *hw)
 	return 0;
 }
 
-static void
-zxdh_priv_res_free(struct zxdh_hw *priv)
-{
-	rte_free(priv->vfinfo);
-	priv->vfinfo = NULL;
-	if (priv->channel_context != NULL) {
-		rte_free(priv->channel_context);
-		priv->channel_context = NULL;
-	}
-}
 
 static uint8_t
 is_pf(uint16_t device_id)
diff --git a/drivers/net/zxdh/zxdh_ethdev.h b/drivers/net/zxdh/zxdh_ethdev.h
index a2d7b14601..a269199540 100644
--- a/drivers/net/zxdh/zxdh_ethdev.h
+++ b/drivers/net/zxdh/zxdh_ethdev.h
@@ -103,6 +103,7 @@ struct zxdh_hw {
 	struct zxdh_virtqueue **vqs;
 	struct zxdh_chnl_context *channel_context;
 	struct zxdh_dev_shared_data *dev_sd;
+	struct zxdh_dev_nic_shared_data *dev_nic_sd;
 	struct vfinfo *vfinfo;
 
 	uint64_t bar_addr[ZXDH_NUM_BARS];
@@ -183,7 +184,6 @@ struct zxdh_shared_data {
 	int32_t init_done;       /* Whether primary has done initialization. */
 	unsigned int secondary_cnt; /* Number of secondary processes init'd. */
 
-	int32_t np_init_done;
 	uint32_t dev_refcnt;
 	struct zxdh_dtb_shared_data *dtb_data;
 	struct rte_mempool *flow_mp;
@@ -196,10 +196,15 @@ struct zxdh_shared_data {
 };
 
 struct zxdh_dev_shared_data {
-	uint32_t serial_id;
 	struct zxdh_dtb_shared_data dtb_sd;
 };
 
+struct zxdh_dev_nic_shared_data {
+	uint32_t serial_id;
+	uint16_t dtb_used_num;
+	uint16_t init_done;
+};
+
 struct zxdh_dtb_bulk_dump_info {
 	const char *mz_name;
 	uint32_t mz_size;
diff --git a/drivers/net/zxdh/zxdh_ethdev_ops.c b/drivers/net/zxdh/zxdh_ethdev_ops.c
index da32512b03..ee5d7304ef 100644
--- a/drivers/net/zxdh/zxdh_ethdev_ops.c
+++ b/drivers/net/zxdh/zxdh_ethdev_ops.c
@@ -1556,7 +1556,7 @@ zxdh_np_stats_get(struct rte_eth_dev *dev, struct zxdh_hw_np_stats *np_stats)
 
 	idx = stats_id + ZXDH_BROAD_STATS_EGRESS_BASE;
 	memset(&stats_data, 0, sizeof(stats_data));
-	ret = zxdh_np_dtb_stats_get(hw->slot_id, dtb_data->queueid,
+	ret = zxdh_np_dtb_stats_get(hw->dev_id, dtb_data->queueid,
 				0, idx, (uint32_t *)&stats_data);
 	if (ret)
 		return ret;
@@ -1567,7 +1567,7 @@ zxdh_np_stats_get(struct rte_eth_dev *dev, struct zxdh_hw_np_stats *np_stats)
 
 	idx = stats_id + ZXDH_BROAD_STATS_INGRESS_BASE;
 	memset(&stats_data, 0, sizeof(stats_data));
-	ret = zxdh_np_dtb_stats_get(hw->slot_id, dtb_data->queueid,
+	ret = zxdh_np_dtb_stats_get(hw->dev_id, dtb_data->queueid,
 				0, idx, (uint32_t *)&stats_data);
 	if (ret)
 		return ret;
@@ -1578,7 +1578,7 @@ zxdh_np_stats_get(struct rte_eth_dev *dev, struct zxdh_hw_np_stats *np_stats)
 
 	idx = stats_id + ZXDH_MULTICAST_STATS_EGRESS_BASE;
 	memset(&stats_data, 0, sizeof(stats_data));
-	ret = zxdh_np_dtb_stats_get(hw->slot_id, dtb_data->queueid,
+	ret = zxdh_np_dtb_stats_get(hw->dev_id, dtb_data->queueid,
 				0, idx, (uint32_t *)&stats_data);
 	if (ret)
 		return ret;
@@ -1589,7 +1589,7 @@ zxdh_np_stats_get(struct rte_eth_dev *dev, struct zxdh_hw_np_stats *np_stats)
 
 	idx = stats_id + ZXDH_MULTICAST_STATS_INGRESS_BASE;
 	memset(&stats_data, 0, sizeof(stats_data));
-	ret = zxdh_np_dtb_stats_get(hw->slot_id, dtb_data->queueid,
+	ret = zxdh_np_dtb_stats_get(hw->dev_id, dtb_data->queueid,
 				0, idx, (uint32_t *)&stats_data);
 	if (ret)
 		return ret;
@@ -1600,7 +1600,7 @@ zxdh_np_stats_get(struct rte_eth_dev *dev, struct zxdh_hw_np_stats *np_stats)
 
 	idx = stats_id + ZXDH_UNICAST_STATS_EGRESS_BASE;
 	memset(&stats_data, 0, sizeof(stats_data));
-	ret = zxdh_np_dtb_stats_get(hw->slot_id, dtb_data->queueid,
+	ret = zxdh_np_dtb_stats_get(hw->dev_id, dtb_data->queueid,
 				0, idx, (uint32_t *)&stats_data);
 	if (ret)
 		return ret;
@@ -1611,7 +1611,7 @@ zxdh_np_stats_get(struct rte_eth_dev *dev, struct zxdh_hw_np_stats *np_stats)
 
 	idx = stats_id + ZXDH_UNICAST_STATS_INGRESS_BASE;
 	memset(&stats_data, 0, sizeof(stats_data));
-	ret = zxdh_np_dtb_stats_get(hw->slot_id, dtb_data->queueid,
+	ret = zxdh_np_dtb_stats_get(hw->dev_id, dtb_data->queueid,
 				0, idx, (uint32_t *)&stats_data);
 	if (ret)
 		return ret;
@@ -1622,7 +1622,7 @@ zxdh_np_stats_get(struct rte_eth_dev *dev, struct zxdh_hw_np_stats *np_stats)
 
 	idx = stats_id + ZXDH_MTU_STATS_EGRESS_BASE;
 	memset(&stats_data, 0, sizeof(stats_data));
-	ret = zxdh_np_dtb_stats_get(hw->slot_id, dtb_data->queueid,
+	ret = zxdh_np_dtb_stats_get(hw->dev_id, dtb_data->queueid,
 				1, idx, (uint32_t *)&stats_data);
 	if (ret)
 		return ret;
@@ -1633,7 +1633,7 @@ zxdh_np_stats_get(struct rte_eth_dev *dev, struct zxdh_hw_np_stats *np_stats)
 
 	idx = stats_id + ZXDH_MTU_STATS_INGRESS_BASE;
 	memset(&stats_data, 0, sizeof(stats_data));
-	ret = zxdh_np_dtb_stats_get(hw->slot_id, dtb_data->queueid,
+	ret = zxdh_np_dtb_stats_get(hw->dev_id, dtb_data->queueid,
 				1, idx, (uint32_t *)&stats_data);
 	if (ret)
 		return ret;
@@ -1644,7 +1644,7 @@ zxdh_np_stats_get(struct rte_eth_dev *dev, struct zxdh_hw_np_stats *np_stats)
 
 	idx = stats_id + ZXDH_MTR_STATS_EGRESS_BASE;
 	memset(&stats_data, 0, sizeof(stats_data));
-	ret = zxdh_np_dtb_stats_get(hw->slot_id, dtb_data->queueid,
+	ret = zxdh_np_dtb_stats_get(hw->dev_id, dtb_data->queueid,
 				1, idx, (uint32_t *)&stats_data);
 	if (ret)
 		return ret;
@@ -1655,7 +1655,7 @@ zxdh_np_stats_get(struct rte_eth_dev *dev, struct zxdh_hw_np_stats *np_stats)
 
 	idx = stats_id + ZXDH_MTR_STATS_INGRESS_BASE;
 	memset(&stats_data, 0, sizeof(stats_data));
-	ret = zxdh_np_dtb_stats_get(hw->slot_id, dtb_data->queueid,
+	ret = zxdh_np_dtb_stats_get(hw->dev_id, dtb_data->queueid,
 				1, idx, (uint32_t *)&stats_data);
 	if (ret)
 		return ret;
diff --git a/drivers/net/zxdh/zxdh_np.c b/drivers/net/zxdh/zxdh_np.c
index 21c749c67a..024da113e2 100644
--- a/drivers/net/zxdh/zxdh_np.c
+++ b/drivers/net/zxdh/zxdh_np.c
@@ -300,8 +300,8 @@ static const ZXDH_DTB_TABLE_T g_dpp_dtb_dump_info[] = {
 };
 
 #define ZXDH_SDT_MGR_PTR_GET()    (&g_sdt_mgr)
-#define ZXDH_SDT_SOFT_TBL_GET(id) (g_sdt_mgr.sdt_tbl_array[id])
-#define ZXDH_DEV_INFO_GET(id) (g_dev_mgr.p_dev_array[id])
+#define ZXDH_SDT_SOFT_TBL_GET(id) (g_sdt_mgr.sdt_tbl_array[ZXDH_DEV_SLOT_ID(id)])
+#define ZXDH_DEV_INFO_GET(id) (g_dev_mgr.p_dev_array[ZXDH_DEV_SLOT_ID(id)])
 
 #define ZXDH_DTB_LEN(cmd_type, int_en, data_len) \
 	(((data_len) & 0x3ff) | \
@@ -384,45 +384,55 @@ zxdh_np_comm_convert32(uint32_t dw_data)
 #define ZXDH_COMM_CONVERT32(w_data) \
 			zxdh_np_comm_convert32(w_data)
 
-#define ZXDH_DTB_TAB_UP_WR_INDEX_GET(DEV_ID, QUEUE_ID)       \
-		(p_dpp_dtb_mgr[(DEV_ID)]->queue_info[(QUEUE_ID)].tab_up.wr_index)
+#define ZXDH_DTB_TAB_UP_WR_INDEX_GET(DEV_ID, QUEUE_ID) \
+		(p_dpp_dtb_mgr[(ZXDH_DEV_SLOT_ID(DEV_ID))]->queue_info[(QUEUE_ID)].tab_up.wr_index)
 
-#define ZXDH_DTB_TAB_UP_USER_PHY_ADDR_FLAG_GET(DEV_ID, QUEUE_ID, INDEX)     \
-	(p_dpp_dtb_mgr[(DEV_ID)]->queue_info[(QUEUE_ID)].tab_up.user_addr[(INDEX)].user_flag)
+#define ZXDH_DTB_TAB_UP_USER_PHY_ADDR_FLAG_GET(DEV_ID, QUEUE_ID, INDEX)    \
+		(p_dpp_dtb_mgr[(ZXDH_DEV_SLOT_ID(DEV_ID))]->                       \
+		queue_info[(QUEUE_ID)].tab_up.user_addr[(INDEX)].user_flag)
 
-#define ZXDH_DTB_TAB_UP_USER_PHY_ADDR_GET(DEV_ID, QUEUE_ID, INDEX)     \
-		(p_dpp_dtb_mgr[(DEV_ID)]->queue_info[(QUEUE_ID)].tab_up.user_addr[(INDEX)].phy_addr)
+#define ZXDH_DTB_TAB_UP_USER_PHY_ADDR_GET(DEV_ID, QUEUE_ID, INDEX)         \
+		(p_dpp_dtb_mgr[(ZXDH_DEV_SLOT_ID(DEV_ID))]->                       \
+		queue_info[(QUEUE_ID)].tab_up.user_addr[(INDEX)].phy_addr)
 
-#define ZXDH_DTB_TAB_UP_DATA_LEN_GET(DEV_ID, QUEUE_ID, INDEX)       \
-		(p_dpp_dtb_mgr[(DEV_ID)]->queue_info[(QUEUE_ID)].tab_up.data_len[(INDEX)])
+#define ZXDH_DTB_TAB_UP_DATA_LEN_GET(DEV_ID, QUEUE_ID, INDEX)              \
+		(p_dpp_dtb_mgr[(ZXDH_DEV_SLOT_ID(DEV_ID))]->                       \
+		queue_info[(QUEUE_ID)].tab_up.data_len[(INDEX)])
 
-#define ZXDH_DTB_TAB_UP_VIR_ADDR_GET(DEV_ID, QUEUE_ID, INDEX)     \
-		(p_dpp_dtb_mgr[(DEV_ID)]->queue_info[(QUEUE_ID)].tab_up.start_vir_addr + \
-		(INDEX) * p_dpp_dtb_mgr[(DEV_ID)]->queue_info[(QUEUE_ID)].tab_up.item_size)
+#define ZXDH_DTB_TAB_UP_VIR_ADDR_GET(DEV_ID, QUEUE_ID, INDEX)   \
+		(p_dpp_dtb_mgr[(ZXDH_DEV_SLOT_ID(DEV_ID))]->            \
+		queue_info[(QUEUE_ID)].tab_up.start_vir_addr +          \
+		(INDEX) * p_dpp_dtb_mgr[(ZXDH_DEV_SLOT_ID(DEV_ID))]->   \
+		queue_info[(QUEUE_ID)].tab_up.item_size)
 
-#define ZXDH_DTB_TAB_DOWN_VIR_ADDR_GET(DEV_ID, QUEUE_ID, INDEX)   \
-		(p_dpp_dtb_mgr[DEV_ID]->queue_info[QUEUE_ID].tab_down.start_vir_addr + \
-		INDEX * p_dpp_dtb_mgr[DEV_ID]->queue_info[QUEUE_ID].tab_down.item_size)
+#define ZXDH_DTB_TAB_DOWN_VIR_ADDR_GET(DEV_ID, QUEUE_ID, INDEX) \
+		(p_dpp_dtb_mgr[ZXDH_DEV_SLOT_ID(DEV_ID)]->              \
+		queue_info[QUEUE_ID].tab_down.start_vir_addr +          \
+		(INDEX) * p_dpp_dtb_mgr[ZXDH_DEV_SLOT_ID(DEV_ID)]->     \
+		queue_info[QUEUE_ID].tab_down.item_size)
 
-#define ZXDH_DTB_TAB_DOWN_WR_INDEX_GET(DEV_ID, QUEUE_ID)       \
-		(p_dpp_dtb_mgr[(DEV_ID)]->queue_info[(QUEUE_ID)].tab_down.wr_index)
+#define ZXDH_DTB_TAB_DOWN_WR_INDEX_GET(DEV_ID, QUEUE_ID)        \
+		(p_dpp_dtb_mgr[(ZXDH_DEV_SLOT_ID(DEV_ID))]->            \
+		queue_info[(QUEUE_ID)].tab_down.wr_index)
 
-#define ZXDH_DTB_QUEUE_INIT_FLAG_GET(DEV_ID, QUEUE_ID)       \
-		(p_dpp_dtb_mgr[(DEV_ID)]->queue_info[(QUEUE_ID)].init_flag)
+#define ZXDH_DTB_QUEUE_INIT_FLAG_GET(DEV_ID, QUEUE_ID)          \
+		(p_dpp_dtb_mgr[(ZXDH_DEV_SLOT_ID(DEV_ID))]->            \
+		queue_info[(QUEUE_ID)].init_flag)
 
-#define ZXDH_DTB_TAB_UP_USER_VIR_ADDR_GET(DEV_ID, QUEUE_ID, INDEX)     \
-		(p_dpp_dtb_mgr[DEV_ID]->queue_info[QUEUE_ID].tab_up.user_addr[INDEX].vir_addr)
+#define ZXDH_DTB_TAB_UP_USER_VIR_ADDR_GET(DEV_ID, QUEUE_ID, INDEX)          \
+		(p_dpp_dtb_mgr[ZXDH_DEV_SLOT_ID(DEV_ID)]->                          \
+		queue_info[QUEUE_ID].tab_up.user_addr[INDEX].vir_addr)
 
-#define ZXDH_DTB_TAB_UP_USER_ADDR_FLAG_SET(DEV_ID, QUEUE_ID, INDEX, VAL)     \
-		(p_dpp_dtb_mgr[DEV_ID]->queue_info[QUEUE_ID].tab_up.user_addr[INDEX].user_flag = \
-		VAL)
+#define ZXDH_DTB_TAB_UP_USER_ADDR_FLAG_SET(DEV_ID, QUEUE_ID, INDEX, VAL)    \
+		(p_dpp_dtb_mgr[ZXDH_DEV_SLOT_ID(DEV_ID)]->                          \
+		queue_info[QUEUE_ID].tab_up.user_addr[INDEX].user_flag = VAL)
 
 static inline uint64_t
 zxdh_np_dtb_tab_down_phy_addr_get(uint32_t DEV_ID, uint32_t QUEUE_ID,
 	uint32_t INDEX)
 {
-	return p_dpp_dtb_mgr[DEV_ID]->queue_info[QUEUE_ID].tab_down.start_phy_addr +
-		INDEX * p_dpp_dtb_mgr[DEV_ID]->queue_info[QUEUE_ID].tab_down.item_size;
+	return p_dpp_dtb_mgr[ZXDH_DEV_SLOT_ID(DEV_ID)]->queue_info[QUEUE_ID].tab_down.start_phy_addr
+	+ INDEX * p_dpp_dtb_mgr[ZXDH_DEV_SLOT_ID(DEV_ID)]->queue_info[QUEUE_ID].tab_down.item_size;
 }
 
 #define ZXDH_DTB_TAB_DOWN_PHY_ADDR_GET(DEV_ID, QUEUE_ID, INDEX)   \
@@ -432,8 +442,8 @@ static inline uint64_t
 zxdh_np_dtb_tab_up_phy_addr_get(uint32_t DEV_ID, uint32_t QUEUE_ID,
 	uint32_t INDEX)
 {
-	return p_dpp_dtb_mgr[DEV_ID]->queue_info[QUEUE_ID].tab_up.start_phy_addr +
-		INDEX * p_dpp_dtb_mgr[DEV_ID]->queue_info[QUEUE_ID].tab_up.item_size;
+	return p_dpp_dtb_mgr[ZXDH_DEV_SLOT_ID(DEV_ID)]->queue_info[QUEUE_ID].tab_up.start_phy_addr
+	+ INDEX * p_dpp_dtb_mgr[ZXDH_DEV_SLOT_ID(DEV_ID)]->queue_info[QUEUE_ID].tab_up.item_size;
 }
 
 #define ZXDH_DTB_TAB_UP_PHY_ADDR_GET(DEV_ID, QUEUE_ID, INDEX)	 \
@@ -517,7 +527,8 @@ zxdh_np_get_tn_color(ZXDH_RB_TN *p_tn)
 
 #define ZXDH_ACL_KEYSIZE_GET(key_mode) (2 * ZXDH_ETCAM_ENTRY_SIZE_GET(key_mode))
 
-#define GET_HASH_TBL_ID_INFO(dev_id, fun_id, tbl_id) (&g_tbl_id_info[dev_id][fun_id][tbl_id])
+#define GET_HASH_TBL_ID_INFO(dev_id, fun_id, tbl_id) \
+	(&g_tbl_id_info[ZXDH_DEV_SLOT_ID(dev_id)][fun_id][tbl_id])
 
 #define ZXDH_GET_HASH_TBL_ID(p_key)    ((p_key)[0] & 0x1F)
 
@@ -1830,25 +1841,34 @@ static void
 zxdh_np_dev_vport_get(uint32_t dev_id, uint32_t *vport)
 {
 	ZXDH_DEV_MGR_T *p_dev_mgr = &g_dev_mgr;
-	ZXDH_DEV_CFG_T *p_dev_info = p_dev_mgr->p_dev_array[dev_id];
+	ZXDH_DEV_CFG_T *p_dev_info = p_dev_mgr->p_dev_array[ZXDH_DEV_SLOT_ID(dev_id)];
 
-	*vport = p_dev_info->vport;
+	*vport = p_dev_info->vport[ZXDH_DEV_PF_INDEX(dev_id)];
 }
 
 static void
 zxdh_np_dev_agent_addr_get(uint32_t dev_id, uint64_t *agent_addr)
 {
 	ZXDH_DEV_MGR_T *p_dev_mgr = &g_dev_mgr;
-	ZXDH_DEV_CFG_T *p_dev_info = p_dev_mgr->p_dev_array[dev_id];
+	ZXDH_DEV_CFG_T *p_dev_info = p_dev_mgr->p_dev_array[ZXDH_DEV_SLOT_ID(dev_id)];
 
-	*agent_addr = p_dev_info->agent_addr;
+	*agent_addr = p_dev_info->agent_addr[ZXDH_DEV_PF_INDEX(dev_id)];
+}
+
+static void
+zxdh_np_dev_bar_pcie_id_get(uint32_t dev_id, uint16_t *p_pcie_id)
+{
+	ZXDH_DEV_MGR_T *p_dev_mgr = &g_dev_mgr;
+	ZXDH_DEV_CFG_T *p_dev_info = p_dev_mgr->p_dev_array[ZXDH_DEV_SLOT_ID(dev_id)];
+
+	*p_pcie_id = p_dev_info->pcie_id[ZXDH_DEV_PF_INDEX(dev_id)];
 }
 
 static void
 zxdh_np_dev_fw_bar_msg_num_set(uint32_t dev_id, uint32_t bar_msg_num)
 {
 	ZXDH_DEV_MGR_T *p_dev_mgr = &g_dev_mgr;
-	ZXDH_DEV_CFG_T *p_dev_info = p_dev_mgr->p_dev_array[dev_id];
+	ZXDH_DEV_CFG_T *p_dev_info = p_dev_mgr->p_dev_array[ZXDH_DEV_SLOT_ID(dev_id)];
 
 	p_dev_info->fw_bar_msg_num = bar_msg_num;
 
@@ -1859,7 +1879,7 @@ static void
 zxdh_np_dev_fw_bar_msg_num_get(uint32_t dev_id, uint32_t *bar_msg_num)
 {
 	ZXDH_DEV_MGR_T *p_dev_mgr = &g_dev_mgr;
-	ZXDH_DEV_CFG_T *p_dev_info = p_dev_mgr->p_dev_array[dev_id];
+	ZXDH_DEV_CFG_T *p_dev_info = p_dev_mgr->p_dev_array[ZXDH_DEV_SLOT_ID(dev_id)];
 
 	*bar_msg_num = p_dev_info->fw_bar_msg_num;
 }
@@ -1868,7 +1888,7 @@ static uint32_t
 zxdh_np_dev_opr_spinlock_get(uint32_t dev_id, uint32_t type, ZXDH_SPINLOCK_T **p_spinlock_out)
 {
 	ZXDH_DEV_MGR_T *p_dev_mgr = &g_dev_mgr;
-	ZXDH_DEV_CFG_T *p_dev_info = p_dev_mgr->p_dev_array[dev_id];
+	ZXDH_DEV_CFG_T *p_dev_info = p_dev_mgr->p_dev_array[ZXDH_DEV_SLOT_ID(dev_id)];
 
 	if (p_dev_info == NULL) {
 		PMD_DRV_LOG(ERR, "Get dev_info[ %u ] fail!", dev_id);
@@ -1895,7 +1915,7 @@ zxdh_np_dev_dtb_opr_spinlock_get(uint32_t dev_id, uint32_t type,
 			uint32_t index, ZXDH_SPINLOCK_T **p_spinlock_out)
 {
 	ZXDH_DEV_MGR_T *p_dev_mgr = &g_dev_mgr;
-	ZXDH_DEV_CFG_T *p_dev_info = p_dev_mgr->p_dev_array[dev_id];
+	ZXDH_DEV_CFG_T *p_dev_info = p_dev_mgr->p_dev_array[ZXDH_DEV_SLOT_ID(dev_id)];
 
 	switch (type) {
 	case ZXDH_DEV_SPINLOCK_T_DTB:
@@ -1914,7 +1934,7 @@ zxdh_np_dev_hash_opr_spinlock_get(uint32_t dev_id,
 	uint32_t fun_id, ZXDH_SPINLOCK_T **p_spinlock_out)
 {
 	ZXDH_DEV_MGR_T *p_dev_mgr = &g_dev_mgr;
-	ZXDH_DEV_CFG_T *p_dev_info = p_dev_mgr->p_dev_array[dev_id];
+	ZXDH_DEV_CFG_T *p_dev_info = p_dev_mgr->p_dev_array[ZXDH_DEV_SLOT_ID(dev_id)];
 
 	*p_spinlock_out = &p_dev_info->hash_spinlock[fun_id];
 }
@@ -2000,12 +2020,12 @@ zxdh_np_dev_get_pcie_addr(uint32_t dev_id)
 	ZXDH_DEV_CFG_T *p_dev_info = NULL;
 
 	p_dev_mgr = &g_dev_mgr;
-	p_dev_info = p_dev_mgr->p_dev_array[dev_id];
+	p_dev_info = p_dev_mgr->p_dev_array[ZXDH_DEV_SLOT_ID(dev_id)];
 
 	if (p_dev_info == NULL)
 		return ZXDH_DEV_TYPE_INVALID;
 
-	return p_dev_info->pcie_addr;
+	return p_dev_info->pcie_addr[ZXDH_DEV_PF_INDEX(dev_id)];
 }
 
 static void
@@ -2322,10 +2342,10 @@ zxdh_np_dev_add(uint32_t  dev_id, ZXDH_DEV_TYPE_E dev_type,
 		return ZXDH_RC_DEV_MGR_NOT_INIT;
 	}
 
-	if (p_dev_mgr->p_dev_array[dev_id] != NULL) {
+	if (p_dev_mgr->p_dev_array[ZXDH_DEV_SLOT_ID(dev_id)] != NULL) {
 		/* device is already exist. */
 		PMD_DRV_LOG(ERR, "Device is added again");
-		p_dev_info = p_dev_mgr->p_dev_array[dev_id];
+		p_dev_info = p_dev_mgr->p_dev_array[ZXDH_DEV_SLOT_ID(dev_id)];
 	} else {
 		/* device is new. */
 		p_dev_info = rte_malloc(NULL, sizeof(ZXDH_DEV_CFG_T), 0);
@@ -2333,14 +2353,15 @@ zxdh_np_dev_add(uint32_t  dev_id, ZXDH_DEV_TYPE_E dev_type,
 			PMD_DRV_LOG(ERR, "malloc memory failed");
 			return ZXDH_PAR_CHK_POINT_NULL;
 		}
-		p_dev_mgr->p_dev_array[dev_id] = p_dev_info;
+		p_dev_mgr->p_dev_array[ZXDH_DEV_SLOT_ID(dev_id)] = p_dev_info;
 		p_dev_mgr->device_num++;
 	}
 
-	p_dev_info->device_id   = dev_id;
+	p_dev_info->slot_id   = ZXDH_DEV_SLOT_ID(dev_id);
 	p_dev_info->dev_type    = dev_type;
 	p_dev_info->access_type = access_type;
-	p_dev_info->pcie_addr   = pcie_addr;
+	p_dev_info->pcie_addr[ZXDH_DEV_PF_INDEX(dev_id)] = pcie_addr;
+	p_dev_info->pcie_id[ZXDH_DEV_PF_INDEX(dev_id)] = ZXDH_DEV_PCIE_ID(dev_id);
 	p_dev_info->riscv_addr   = riscv_addr;
 	p_dev_info->dma_vir_addr = dma_vir_addr;
 	p_dev_info->dma_phy_addr = dma_phy_addr;
@@ -2368,7 +2389,7 @@ zxdh_np_dev_agent_status_set(uint32_t dev_id, uint32_t agent_flag)
 	ZXDH_DEV_CFG_T *p_dev_info = NULL;
 
 	p_dev_mgr = &g_dev_mgr;
-	p_dev_info = p_dev_mgr->p_dev_array[dev_id];
+	p_dev_info = p_dev_mgr->p_dev_array[ZXDH_DEV_SLOT_ID(dev_id)];
 
 	if (p_dev_info == NULL)
 		return ZXDH_DEV_TYPE_INVALID;
@@ -2490,9 +2511,9 @@ zxdh_np_soft_sdt_tbl_set(uint32_t dev_id,
 						uint32_t table_type,
 						ZXDH_SDT_TBL_DATA_T *p_sdt_info)
 {
-	g_table_type[dev_id][sdt_no] = table_type;
-	g_sdt_info[dev_id][sdt_no].data_high32 = p_sdt_info->data_high32;
-	g_sdt_info[dev_id][sdt_no].data_low32  = p_sdt_info->data_low32;
+	g_table_type[ZXDH_DEV_SLOT_ID(dev_id)][sdt_no] = table_type;
+	g_sdt_info[ZXDH_DEV_SLOT_ID(dev_id)][sdt_no].data_high32 = p_sdt_info->data_high32;
+	g_sdt_info[ZXDH_DEV_SLOT_ID(dev_id)][sdt_no].data_low32  = p_sdt_info->data_low32;
 }
 
 static uint32_t
@@ -2666,12 +2687,13 @@ zxdh_np_ppu_parse_cls_bitmap(uint32_t dev_id,
 
 	for (cls_id = 0; cls_id < ZXDH_PPU_CLUSTER_NUM; cls_id++) {
 		cls_use = (bitmap >> cls_id) & 0x1;
-		g_ppu_cls_bit_map[dev_id].cls_use[cls_id] = cls_use;
+		g_ppu_cls_bit_map[ZXDH_DEV_SLOT_ID(dev_id)].cls_use[cls_id] = cls_use;
 	}
 
 	for (mem_id = 0; mem_id < ZXDH_PPU_INSTR_MEM_NUM; mem_id++) {
 		instr_mem = (bitmap >> (mem_id * 2)) & 0x3;
-		g_ppu_cls_bit_map[dev_id].instr_mem[mem_id] = ((instr_mem > 0) ? 1 : 0);
+		g_ppu_cls_bit_map[ZXDH_DEV_SLOT_ID(dev_id)].instr_mem[mem_id] =
+		((instr_mem > 0) ? 1 : 0);
 	}
 }
 
@@ -2731,6 +2753,7 @@ zxdh_np_agent_channel_sync_send(uint32_t dev_id,
 	uint8_t *reply_ptr = NULL;
 	uint16_t reply_msg_len = 0;
 	uint64_t agent_addr = 0;
+	uint16_t bar_pcie_id = 0;
 
 	ret = zxdh_np_agent_bar_msg_check(dev_id, p_msg);
 	if (ret != ZXDH_OK) {
@@ -2740,6 +2763,7 @@ zxdh_np_agent_channel_sync_send(uint32_t dev_id,
 
 	zxdh_np_dev_vport_get(dev_id, &vport);
 	zxdh_np_dev_agent_addr_get(dev_id, &agent_addr);
+	zxdh_np_dev_bar_pcie_id_get(dev_id, &bar_pcie_id);
 
 	if (ZXDH_IS_PF(vport))
 		in.src = ZXDH_MSG_CHAN_END_PF;
@@ -2751,6 +2775,7 @@ zxdh_np_agent_channel_sync_send(uint32_t dev_id,
 	in.payload_len = p_msg->msg_len;
 	in.dst = ZXDH_MSG_CHAN_END_RISC;
 	in.module_id = ZXDH_BAR_MDOULE_NPSDK;
+	in.src_pcieid = bar_pcie_id;
 
 	recv_buffer = rte_zmalloc(NULL, rep_len + ZXDH_CHANNEL_REPS_LEN, 0);
 	if (recv_buffer == NULL) {
@@ -3124,23 +3149,23 @@ zxdh_np_agent_channel_acl_index_release(uint32_t dev_id, uint32_t rel_type,
 static ZXDH_DTB_MGR_T *
 zxdh_np_dtb_mgr_get(uint32_t dev_id)
 {
-	if (dev_id >= ZXDH_DEV_CHANNEL_MAX)
+	if (ZXDH_DEV_SLOT_ID(dev_id) >= ZXDH_DEV_CHANNEL_MAX)
 		return NULL;
 	else
-		return p_dpp_dtb_mgr[dev_id];
+		return p_dpp_dtb_mgr[ZXDH_DEV_SLOT_ID(dev_id)];
 }
 
 static uint32_t
 zxdh_np_dtb_mgr_create(uint32_t dev_id)
 {
-	if (p_dpp_dtb_mgr[dev_id] != NULL) {
+	if (p_dpp_dtb_mgr[ZXDH_DEV_SLOT_ID(dev_id)] != NULL) {
 		PMD_DRV_LOG(ERR, "ErrorCode[0x%x]: Dma Manager"
 			" is exist!!!", ZXDH_RC_DTB_MGR_EXIST);
 		return ZXDH_RC_DTB_MGR_EXIST;
 	}
 
-	p_dpp_dtb_mgr[dev_id] = rte_zmalloc(NULL, sizeof(ZXDH_DTB_MGR_T), 0);
-	if (p_dpp_dtb_mgr[dev_id] == NULL) {
+	p_dpp_dtb_mgr[ZXDH_DEV_SLOT_ID(dev_id)] = rte_zmalloc(NULL, sizeof(ZXDH_DTB_MGR_T), 0);
+	if (p_dpp_dtb_mgr[ZXDH_DEV_SLOT_ID(dev_id)] == NULL) {
 		PMD_DRV_LOG(ERR, "malloc memory failed");
 		return ZXDH_PAR_CHK_POINT_NULL;
 	}
@@ -3153,7 +3178,7 @@ zxdh_np_dtb_soft_init(uint32_t dev_id)
 {
 	ZXDH_DTB_MGR_T *p_dtb_mgr = NULL;
 
-	if (dev_id >= ZXDH_DEV_CHANNEL_MAX)
+	if (ZXDH_DEV_SLOT_ID(dev_id) >= ZXDH_DEV_CHANNEL_MAX)
 		return 1;
 
 	p_dtb_mgr = zxdh_np_dtb_mgr_get(dev_id);
@@ -3220,8 +3245,8 @@ zxdh_np_dev_vport_set(uint32_t dev_id, uint32_t vport)
 	ZXDH_DEV_CFG_T *p_dev_info = NULL;
 
 	p_dev_mgr =  &g_dev_mgr;
-	p_dev_info = p_dev_mgr->p_dev_array[dev_id];
-	p_dev_info->vport = vport;
+	p_dev_info = p_dev_mgr->p_dev_array[ZXDH_DEV_SLOT_ID(dev_id)];
+	p_dev_info->vport[ZXDH_DEV_PF_INDEX(dev_id)] = vport;
 }
 
 static void
@@ -3231,8 +3256,8 @@ zxdh_np_dev_agent_addr_set(uint32_t dev_id, uint64_t agent_addr)
 	ZXDH_DEV_CFG_T *p_dev_info = NULL;
 
 	p_dev_mgr =  &g_dev_mgr;
-	p_dev_info = p_dev_mgr->p_dev_array[dev_id];
-	p_dev_info->agent_addr = agent_addr;
+	p_dev_info = p_dev_mgr->p_dev_array[ZXDH_DEV_SLOT_ID(dev_id)];
+	p_dev_info->agent_addr[ZXDH_DEV_PF_INDEX(dev_id)] = agent_addr;
 }
 
 static uint64_t
@@ -3259,13 +3284,13 @@ zxdh_np_pf_fw_compatible_addr_set(uint32_t dev_id, uint64_t pcie_vir_baddr)
 
 	compatible_addr = zxdh_np_fw_compatible_addr_calc(pcie_vir_baddr, compatible_offset);
 
-	g_np_fw_compat_addr[dev_id] = compatible_addr;
+	g_np_fw_compat_addr[ZXDH_DEV_SLOT_ID(dev_id)] = compatible_addr;
 }
 
 static void
 zxdh_np_fw_compatible_addr_get(uint32_t dev_id, uint64_t *p_compatible_addr)
 {
-	*p_compatible_addr = g_np_fw_compat_addr[dev_id];
+	*p_compatible_addr = g_np_fw_compat_addr[ZXDH_DEV_SLOT_ID(dev_id)];
 }
 
 static void
@@ -3684,7 +3709,7 @@ zxdh_np_dtb_queue_id_free(uint32_t dev_id,
 	ZXDH_DTB_MGR_T *p_dtb_mgr = NULL;
 	uint32_t rc;
 
-	p_dtb_mgr = p_dpp_dtb_mgr[dev_id];
+	p_dtb_mgr = p_dpp_dtb_mgr[ZXDH_DEV_SLOT_ID(dev_id)];
 	if (p_dtb_mgr == NULL)
 		return 1;
 
@@ -3706,13 +3731,13 @@ zxdh_np_dtb_queue_id_free(uint32_t dev_id,
 static ZXDH_RB_CFG *
 zxdh_np_dtb_dump_addr_rb_get(uint32_t dev_id, uint32_t queue_id)
 {
-	return g_dtb_dump_addr_rb[dev_id][queue_id];
+	return g_dtb_dump_addr_rb[ZXDH_DEV_SLOT_ID(dev_id)][queue_id];
 }
 
 static uint32_t
 zxdh_np_dtb_dump_addr_rb_set(uint32_t dev_id, uint32_t queue_id, ZXDH_RB_CFG *p_dump_addr_rb)
 {
-	g_dtb_dump_addr_rb[dev_id][queue_id] = p_dump_addr_rb;
+	g_dtb_dump_addr_rb[ZXDH_DEV_SLOT_ID(dev_id)][queue_id] = p_dump_addr_rb;
 	return ZXDH_OK;
 }
 
@@ -3880,9 +3905,9 @@ zxdh_np_dtb_queue_release(uint32_t devid,
 static void
 zxdh_np_dtb_mgr_destroy(uint32_t dev_id)
 {
-	if (p_dpp_dtb_mgr[dev_id] != NULL) {
-		rte_free(p_dpp_dtb_mgr[dev_id]);
-		p_dpp_dtb_mgr[dev_id] = NULL;
+	if (p_dpp_dtb_mgr[ZXDH_DEV_SLOT_ID(dev_id)] != NULL) {
+		rte_free(p_dpp_dtb_mgr[ZXDH_DEV_SLOT_ID(dev_id)]);
+		p_dpp_dtb_mgr[ZXDH_DEV_SLOT_ID(dev_id)] = NULL;
 	}
 }
 
@@ -3909,11 +3934,11 @@ zxdh_np_dev_del(uint32_t dev_id)
 	ZXDH_DEV_MGR_T *p_dev_mgr  = NULL;
 
 	p_dev_mgr = &g_dev_mgr;
-	p_dev_info = p_dev_mgr->p_dev_array[dev_id];
+	p_dev_info = p_dev_mgr->p_dev_array[ZXDH_DEV_SLOT_ID(dev_id)];
 
 	if (p_dev_info != NULL) {
 		rte_free(p_dev_info);
-		p_dev_mgr->p_dev_array[dev_id] = NULL;
+		p_dev_mgr->p_dev_array[ZXDH_DEV_SLOT_ID(dev_id)] = NULL;
 		p_dev_mgr->device_num--;
 	}
 }
@@ -4057,7 +4082,7 @@ zxdh_np_one_hash_soft_uninstall(uint32_t dev_id, uint32_t hash_id)
 	uint32_t i = 0;
 
 	ZXDH_D_NODE *p_node = NULL;
-	ZXDH_SE_CFG *p_se_cfg = dpp_se_cfg[dev_id];
+	ZXDH_SE_CFG *p_se_cfg = dpp_se_cfg[ZXDH_DEV_SLOT_ID(dev_id)];
 	ZXDH_RB_TN *p_rb_tn = NULL;
 	ZXDH_RB_TN *p_rb_tn_rtn = NULL;
 	HASH_DDR_CFG *p_rbkey = NULL;
@@ -4111,7 +4136,7 @@ zxdh_np_one_hash_soft_uninstall(uint32_t dev_id, uint32_t hash_id)
 	rc = zxdh_np_se_fun_deinit(p_se_cfg, (hash_id & 0xff), ZXDH_FUN_HASH);
 	ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_se_fun_deinit");
 
-	memset(g_tbl_id_info[dev_id][hash_id], 0,
+	memset(g_tbl_id_info[ZXDH_DEV_SLOT_ID(dev_id)][hash_id], 0,
 		ZXDH_HASH_TBL_ID_NUM * sizeof(ZXDH_HASH_TBL_ID_INFO));
 
 	return rc;
@@ -4134,13 +4159,13 @@ zxdh_np_hash_soft_uninstall(uint32_t dev_id)
 static uint32_t
 zxdh_np_acl_cfg_get(uint32_t dev_id, ZXDH_ACL_CFG_EX_T **p_acl_cfg)
 {
-	if (g_p_acl_ex_cfg[dev_id] == NULL) {
+	if (g_p_acl_ex_cfg[ZXDH_DEV_SLOT_ID(dev_id)] == NULL) {
 		PMD_DRV_LOG(ERR, "etcam_is not init!");
 		RTE_ASSERT(0);
 		return ZXDH_ACL_RC_ETCAMID_NOT_INIT;
 	}
 
-	*p_acl_cfg = g_p_acl_ex_cfg[dev_id];
+	*p_acl_cfg = g_p_acl_ex_cfg[ZXDH_DEV_SLOT_ID(dev_id)];
 
 	return ZXDH_OK;
 }
@@ -4190,6 +4215,16 @@ zxdh_np_acl_res_destroy(uint32_t dev_id)
 	return ZXDH_OK;
 }
 
+static void
+zxdh_np_apt_hash_global_res_uninit(uint32_t dev_id)
+{
+	if (g_apt_se_cfg[ZXDH_DEV_SLOT_ID(dev_id)] != NULL) {
+		rte_free(g_apt_se_cfg[ZXDH_DEV_SLOT_ID(dev_id)]);
+		g_apt_se_cfg[ZXDH_DEV_SLOT_ID(dev_id)] = NULL;
+		dpp_se_cfg[ZXDH_DEV_SLOT_ID(dev_id)] = NULL;
+	}
+}
+
 int
 zxdh_np_online_uninit(uint32_t dev_id,
 			char *port_name,
@@ -4201,22 +4236,35 @@ zxdh_np_online_uninit(uint32_t dev_id,
 	if (rc != 0)
 		PMD_DRV_LOG(ERR, "dtb release port name %s queue id %u", port_name, queue_id);
 
+	rc = zxdh_np_soft_res_uninstall(dev_id);
+	if (rc != 0)
+		PMD_DRV_LOG(ERR, "zxdh_np_soft_res_uninstall failed");
+
+	return 0;
+}
+
+uint32_t
+zxdh_np_soft_res_uninstall(uint32_t dev_id)
+{
+	uint32_t rc;
+
 	rc = zxdh_np_hash_soft_uninstall(dev_id);
 	if (rc != ZXDH_OK)
 		PMD_DRV_LOG(ERR, "zxdh_np_hash_soft_uninstall error! ");
 
+	zxdh_np_apt_hash_global_res_uninit(dev_id);
 	zxdh_np_acl_res_destroy(dev_id);
 	zxdh_np_dtb_mgr_destroy(dev_id);
 	zxdh_np_sdt_mgr_destroy(dev_id);
 	zxdh_np_dev_del(dev_id);
 
-	return 0;
+	return rc;
 }
 
 static uint32_t
 zxdh_np_sdt_tbl_type_get(uint32_t dev_id, uint32_t sdt_no)
 {
-	return g_table_type[dev_id][sdt_no];
+	return g_table_type[ZXDH_DEV_SLOT_ID(dev_id)][sdt_no];
 }
 
 
@@ -4697,8 +4745,8 @@ zxdh_np_eram_dtb_len_get(uint32_t mode)
 static void
 zxdh_np_sdt_tbl_data_get(uint32_t dev_id, uint32_t sdt_no, ZXDH_SDT_TBL_DATA_T *p_sdt_data)
 {
-	p_sdt_data->data_high32 = g_sdt_info[dev_id][sdt_no].data_high32;
-	p_sdt_data->data_low32  = g_sdt_info[dev_id][sdt_no].data_low32;
+	p_sdt_data->data_high32 = g_sdt_info[ZXDH_DEV_SLOT_ID(dev_id)][sdt_no].data_high32;
+	p_sdt_data->data_low32  = g_sdt_info[ZXDH_DEV_SLOT_ID(dev_id)][sdt_no].data_low32;
 }
 
 static uint32_t
@@ -5196,8 +5244,10 @@ zxdh_np_dtb_tab_down_info_set(uint32_t dev_id,
 	item_info.cmd_type = 0;
 	item_info.int_en = int_flag;
 	item_info.data_len = data_len / 4;
-	phy_addr = p_dpp_dtb_mgr[dev_id]->queue_info[queue_id].tab_down.start_phy_addr +
-		item_index * p_dpp_dtb_mgr[dev_id]->queue_info[queue_id].tab_down.item_size;
+	phy_addr = p_dpp_dtb_mgr[ZXDH_DEV_SLOT_ID(dev_id)]->queue_info[queue_id].
+		tab_down.start_phy_addr +
+		item_index * p_dpp_dtb_mgr[ZXDH_DEV_SLOT_ID(dev_id)]->queue_info[queue_id].
+		tab_down.item_size;
 	item_info.data_hddr = ((phy_addr >> 4) >> 32) & 0xffffffff;
 	item_info.data_laddr = (phy_addr >> 4) & 0xffffffff;
 
@@ -5368,7 +5418,7 @@ zxdh_np_hash_get_hash_info_from_sdt(uint32_t dev_id,
 	p_hash_entry_cfg->rst_by_size = ZXDH_GET_RST_SIZE(p_hash_entry_cfg->key_type,
 		p_hash_entry_cfg->actu_key_size);
 
-	p_se_cfg = dpp_se_cfg[dev_id];
+	p_se_cfg = dpp_se_cfg[ZXDH_DEV_SLOT_ID(dev_id)];
 	p_hash_entry_cfg->p_se_cfg = p_se_cfg;
 
 	p_func_info = ZXDH_GET_FUN_INFO(p_se_cfg, p_hash_entry_cfg->fun_id);
@@ -6048,7 +6098,7 @@ zxdh_np_apt_get_sdt_partner(uint32_t dev_id, uint32_t sdt_no)
 {
 	SE_APT_CALLBACK_T *p_apt_callback = NULL;
 
-	p_apt_callback = &g_apt_se_callback[dev_id][sdt_no];
+	p_apt_callback = &g_apt_se_callback[ZXDH_DEV_SLOT_ID(dev_id)][sdt_no];
 
 	if (p_apt_callback->table_type == ZXDH_SDT_TBLT_HASH)
 		return  p_apt_callback->se_func_info.hash_func.sdt_partner;
@@ -6639,10 +6689,10 @@ zxdh_np_stat_cfg_soft_get(uint32_t dev_id,
 {
 	ZXDH_COMM_CHECK_DEV_POINT(dev_id, p_stat_cfg);
 
-	p_stat_cfg->ddr_base_addr = g_ppu_stat_cfg[dev_id].ddr_base_addr;
-	p_stat_cfg->eram_baddr = g_ppu_stat_cfg[dev_id].eram_baddr;
-	p_stat_cfg->eram_depth = g_ppu_stat_cfg[dev_id].eram_depth;
-	p_stat_cfg->ppu_addr_offset = g_ppu_stat_cfg[dev_id].ppu_addr_offset;
+	p_stat_cfg->ddr_base_addr = g_ppu_stat_cfg[ZXDH_DEV_SLOT_ID(dev_id)].ddr_base_addr;
+	p_stat_cfg->eram_baddr = g_ppu_stat_cfg[ZXDH_DEV_SLOT_ID(dev_id)].eram_baddr;
+	p_stat_cfg->eram_depth = g_ppu_stat_cfg[ZXDH_DEV_SLOT_ID(dev_id)].eram_depth;
+	p_stat_cfg->ppu_addr_offset = g_ppu_stat_cfg[ZXDH_DEV_SLOT_ID(dev_id)].ppu_addr_offset;
 }
 
 static uint32_t
@@ -8809,7 +8859,7 @@ static void *
 zxdh_np_dev_get_se_res_ptr(uint32_t dev_id, uint32_t type)
 {
 	ZXDH_DEV_MGR_T *p_dev_mgr = &g_dev_mgr;
-	ZXDH_DEV_CFG_T *p_dev_info = p_dev_mgr->p_dev_array[dev_id];
+	ZXDH_DEV_CFG_T *p_dev_info = p_dev_mgr->p_dev_array[ZXDH_DEV_SLOT_ID(dev_id)];
 
 	if (type == ZXDH_SE_STD_NIC_RES_TYPE)
 		return (void *)&p_dev_info->dev_apt_se_tbl_res.std_nic_res;
@@ -8872,7 +8922,7 @@ zxdh_np_se_init_ex(uint32_t dev_id, ZXDH_SE_CFG *p_se_cfg)
 	ZXDH_SE_ZBLK_CFG *p_zblk_cfg = NULL;
 	ZXDH_SE_ZCELL_CFG *p_zcell_cfg = NULL;
 
-	if (dpp_se_cfg[dev_id] != NULL) {
+	if (dpp_se_cfg[ZXDH_DEV_SLOT_ID(dev_id)] != NULL) {
 		PMD_DRV_LOG(DEBUG, "SE global config is already initialized.");
 		return ZXDH_OK;
 	}
@@ -8880,7 +8930,7 @@ zxdh_np_se_init_ex(uint32_t dev_id, ZXDH_SE_CFG *p_se_cfg)
 	memset(p_se_cfg, 0, sizeof(ZXDH_SE_CFG));
 
 	p_se_cfg->dev_id = dev_id;
-	dpp_se_cfg[p_se_cfg->dev_id] = p_se_cfg;
+	dpp_se_cfg[ZXDH_DEV_SLOT_ID(p_se_cfg->dev_id)] = p_se_cfg;
 
 	p_se_cfg->p_as_rslt_wrt_fun = NULL;
 	p_se_cfg->p_client = ZXDH_COMM_VAL_TO_PTR(dev_id);
@@ -8913,16 +8963,16 @@ zxdh_np_se_init_ex(uint32_t dev_id, ZXDH_SE_CFG *p_se_cfg)
 static uint32_t
 zxdh_np_apt_hash_global_res_init(uint32_t dev_id)
 {
-	if (g_apt_se_cfg[dev_id] == NULL) {
-		g_apt_se_cfg[dev_id] = rte_zmalloc(NULL, sizeof(ZXDH_SE_CFG), 0);
-		if (g_apt_se_cfg[dev_id] == NULL) {
+	if (g_apt_se_cfg[ZXDH_DEV_SLOT_ID(dev_id)] == NULL) {
+		g_apt_se_cfg[ZXDH_DEV_SLOT_ID(dev_id)] = rte_zmalloc(NULL, sizeof(ZXDH_SE_CFG), 0);
+		if (g_apt_se_cfg[ZXDH_DEV_SLOT_ID(dev_id)] == NULL) {
 			PMD_DRV_LOG(ERR, "malloc memory failed");
 			return ZXDH_PAR_CHK_POINT_NULL;
 		}
 
-		zxdh_np_se_init_ex(dev_id, g_apt_se_cfg[dev_id]);
+		zxdh_np_se_init_ex(dev_id, g_apt_se_cfg[ZXDH_DEV_SLOT_ID(dev_id)]);
 
-		g_apt_se_cfg[dev_id]->p_client = ZXDH_COMM_VAL_TO_PTR(dev_id);
+		g_apt_se_cfg[ZXDH_DEV_SLOT_ID(dev_id)]->p_client = ZXDH_COMM_VAL_TO_PTR(dev_id);
 	}
 
 	return ZXDH_OK;
@@ -9204,7 +9254,7 @@ zxdh_np_hash_init(ZXDH_SE_CFG *p_se_cfg,
 	ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_comm_rb_init");
 
 	for (i = 0; i < zblk_num; i++)
-		g_hash_zblk_idx[dev_id][fun_id][i] = zblk_idx[i];
+		g_hash_zblk_idx[ZXDH_DEV_SLOT_ID(dev_id)][fun_id][i] = zblk_idx[i];
 
 	return rc;
 }
@@ -9219,7 +9269,7 @@ zxdh_np_apt_hash_func_res_init(uint32_t dev_id, uint32_t func_num,
 	ZXDH_APT_HASH_FUNC_RES_T *p_hash_func_res_temp = NULL;
 	ZXDH_SE_CFG *p_se_cfg = NULL;
 
-	p_se_cfg = g_apt_se_cfg[dev_id];
+	p_se_cfg = g_apt_se_cfg[ZXDH_DEV_SLOT_ID(dev_id)];
 
 	for (index = 0; index < func_num; index++) {
 		memset(zblk_idx, 0, sizeof(zblk_idx));
@@ -9474,7 +9524,7 @@ zxdh_np_apt_hash_bulk_res_init(uint32_t dev_id, uint32_t bulk_num,
 	ZXDH_HASH_DDR_RESC_CFG_T ddr_resc_cfg = {0};
 	ZXDH_SE_CFG *p_se_cfg = NULL;
 
-	p_se_cfg = g_apt_se_cfg[dev_id];
+	p_se_cfg = g_apt_se_cfg[ZXDH_DEV_SLOT_ID(dev_id)];
 
 	for (index = 0; index < bulk_num; index++) {
 		memset(&ddr_resc_cfg, 0, sizeof(ZXDH_HASH_DDR_RESC_CFG_T));
@@ -9504,7 +9554,7 @@ zxdh_np_apt_set_callback(uint32_t dev_id, uint32_t sdt_no, uint32_t table_type,
 {
 	SE_APT_CALLBACK_T *apt_func = NULL;
 
-	apt_func = &g_apt_se_callback[dev_id][sdt_no];
+	apt_func = &g_apt_se_callback[ZXDH_DEV_SLOT_ID(dev_id)][sdt_no];
 
 	apt_func->sdt_no = sdt_no;
 	apt_func->table_type = table_type;
@@ -9598,7 +9648,7 @@ zxdh_np_apt_hash_tbl_res_init(uint32_t dev_id, uint32_t tbl_num,
 	ZXDH_APT_HASH_TABLE_T *p_hash_tbl_temp = NULL;
 	ZXDH_SE_CFG *p_se_cfg = NULL;
 
-	p_se_cfg = g_apt_se_cfg[dev_id];
+	p_se_cfg = g_apt_se_cfg[ZXDH_DEV_SLOT_ID(dev_id)];
 
 	for (index = 0; index < tbl_num; index++) {
 		p_hash_tbl_temp = p_hash_tbl + index;
@@ -9688,7 +9738,7 @@ zxdh_np_acl_cfg_init_ex(ZXDH_ACL_CFG_EX_T *p_acl_cfg,
 	p_acl_cfg->dev_id = (uint32_t)(ZXDH_COMM_PTR_TO_VAL(p_acl_cfg->p_client) & 0xFFFFFFFF);
 	p_acl_cfg->flags = flags;
 
-	g_p_acl_ex_cfg[p_acl_cfg->dev_id] = p_acl_cfg;
+	g_p_acl_ex_cfg[ZXDH_DEV_SLOT_ID(p_acl_cfg->dev_id)] = p_acl_cfg;
 
 	if (flags & ZXDH_ACL_FLAG_ETCAM0_EN) {
 		p_acl_cfg->acl_etcamids.is_valid = 1;
@@ -9726,7 +9776,7 @@ zxdh_np_acl_tbl_init_ex(ZXDH_ACL_CFG_EX_T *p_acl_cfg,
 	uint32_t rc = 0;
 	uint32_t i = 0;
 
-	g_p_acl_ex_cfg[p_acl_cfg->dev_id] = p_acl_cfg;
+	g_p_acl_ex_cfg[ZXDH_DEV_SLOT_ID(p_acl_cfg->dev_id)] = p_acl_cfg;
 
 	if (p_acl_cfg->acl_tbls[table_id].is_used) {
 		PMD_DRV_LOG(ERR, "table_id[ %u ] is already used!", table_id);
@@ -9817,7 +9867,7 @@ zxdh_np_apt_acl_res_init(uint32_t dev_id, uint32_t tbl_num, ZXDH_APT_ACL_TABLE_T
 	uint8_t index = 0;
 	ZXDH_APT_ACL_TABLE_T *p_temp_acl_tbl = NULL;
 
-	rc = zxdh_np_acl_cfg_init_ex(&g_apt_acl_cfg[dev_id],
+	rc = zxdh_np_acl_cfg_init_ex(&g_apt_acl_cfg[ZXDH_DEV_SLOT_ID(dev_id)],
 						(void *)ZXDH_COMM_VAL_TO_PTR(dev_id),
 						ZXDH_ACL_FLAG_ETCAM0_EN,
 						NULL);
@@ -9832,7 +9882,7 @@ zxdh_np_apt_acl_res_init(uint32_t dev_id, uint32_t tbl_num, ZXDH_APT_ACL_TABLE_T
 						ZXDH_SDT_OPER_ADD);
 		ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_sdt_tbl_write");
 
-		 rc = zxdh_np_acl_tbl_init_ex(&g_apt_acl_cfg[dev_id],
+		 rc = zxdh_np_acl_tbl_init_ex(&g_apt_acl_cfg[ZXDH_DEV_SLOT_ID(dev_id)],
 					p_temp_acl_tbl->acl_sdt.etcam_table_id,
 					p_temp_acl_tbl->acl_sdt.as_en,
 					p_temp_acl_tbl->acl_res.entry_num,
@@ -9857,12 +9907,13 @@ zxdh_np_apt_acl_res_init(uint32_t dev_id, uint32_t tbl_num, ZXDH_APT_ACL_TABLE_T
 static void
 zxdh_np_apt_stat_res_init(uint32_t dev_id, uint32_t type, ZXDH_APT_STAT_RES_INIT_T *stat_res_init)
 {
-	g_ppu_stat_cfg[dev_id].eram_baddr = stat_res_init->eram_baddr;
-	g_ppu_stat_cfg[dev_id].eram_depth = stat_res_init->eram_depth;
+	g_ppu_stat_cfg[ZXDH_DEV_SLOT_ID(dev_id)].eram_baddr = stat_res_init->eram_baddr;
+	g_ppu_stat_cfg[ZXDH_DEV_SLOT_ID(dev_id)].eram_depth = stat_res_init->eram_depth;
 
 	if (type == ZXDH_SE_NON_STD_NIC_RES_TYPE) {
-		g_ppu_stat_cfg[dev_id].ddr_base_addr = stat_res_init->ddr_baddr;
-		g_ppu_stat_cfg[dev_id].ppu_addr_offset = stat_res_init->ppu_ddr_offset;
+		g_ppu_stat_cfg[ZXDH_DEV_SLOT_ID(dev_id)].ddr_base_addr = stat_res_init->ddr_baddr;
+		g_ppu_stat_cfg[ZXDH_DEV_SLOT_ID(dev_id)].ppu_addr_offset =
+			stat_res_init->ppu_ddr_offset;
 	}
 }
 
diff --git a/drivers/net/zxdh/zxdh_np.h b/drivers/net/zxdh/zxdh_np.h
index 6a5d6a2fdb..b0823192e7 100644
--- a/drivers/net/zxdh/zxdh_np.h
+++ b/drivers/net/zxdh/zxdh_np.h
@@ -15,9 +15,13 @@
 #define ZXDH_DISABLE                          (0)
 #define ZXDH_ENABLE                           (1)
 #define ZXDH_PORT_NAME_MAX                    (32)
-#define ZXDH_DEV_CHANNEL_MAX                  (2)
+#define ZXDH_DEV_CHANNEL_MAX                  (16)
 #define ZXDH_DEV_SDT_ID_MAX                   (256U)
-
+#define ZXDH_DEV_PF_NUM_MAX                   (8)
+#define ZXDH_DEV_SLOT_ID(DEVICE_ID)           ((DEVICE_ID) & (ZXDH_DEV_CHANNEL_MAX - 1))
+#define ZXDH_DEV_PCIE_ID(DEVICE_ID)           (((DEVICE_ID) >> 16) & 0xFFFF)
+#define ZXDH_DEV_VF_INDEX(DEVICE_ID)          (ZXDH_DEV_PCIE_ID(DEVICE_ID) & 0xFF)
+#define ZXDH_DEV_PF_INDEX(DEVICE_ID)          ((ZXDH_DEV_PCIE_ID(DEVICE_ID) >> 8) & 0x7)
 
 /*DTB*/
 #define ZXDH_DTB_QUEUE_ITEM_NUM_MAX           (32)
@@ -1130,18 +1134,19 @@ typedef struct zxdh_sys_init_ctrl_t {
 } ZXDH_SYS_INIT_CTRL_T;
 
 typedef struct dpp_dev_cfg_t {
-	uint32_t device_id;
+	uint32_t slot_id;
+	uint16_t pcie_id[ZXDH_DEV_PF_NUM_MAX];
 	ZXDH_DEV_TYPE_E dev_type;
 	uint32_t chip_ver;
 	uint32_t access_type;
 	uint32_t agent_flag;
-	uint32_t vport;
+	uint32_t vport[ZXDH_DEV_PF_NUM_MAX];
 	uint32_t fw_bar_msg_num;
-	uint64_t pcie_addr;
+	uint64_t pcie_addr[ZXDH_DEV_PF_NUM_MAX];
 	uint64_t riscv_addr;
 	uint64_t dma_vir_addr;
 	uint64_t dma_phy_addr;
-	uint64_t agent_addr;
+	uint64_t agent_addr[ZXDH_DEV_PF_NUM_MAX];
 	uint32_t init_flags[ZXDH_MODULE_INIT_MAX];
 	ZXDH_DEV_WRITE_FUNC p_pcie_write_fun;
 	ZXDH_DEV_READ_FUNC  p_pcie_read_fun;
@@ -1949,6 +1954,7 @@ int zxdh_np_dtb_stats_get(uint32_t dev_id,
 			ZXDH_STAT_CNT_MODE_E rd_mode,
 			uint32_t index,
 			uint32_t *p_data);
+uint32_t zxdh_np_soft_res_uninstall(uint32_t dev_id);
 uint32_t zxdh_np_stat_ppu_cnt_get_ex(uint32_t dev_id,
 			ZXDH_STAT_CNT_MODE_E rd_mode,
 			uint32_t index,
diff --git a/drivers/net/zxdh/zxdh_tables.c b/drivers/net/zxdh/zxdh_tables.c
index 2d2dd26499..233d53a7e8 100644
--- a/drivers/net/zxdh/zxdh_tables.c
+++ b/drivers/net/zxdh/zxdh_tables.c
@@ -37,7 +37,7 @@ zxdh_set_port_attr(struct zxdh_hw *hw, uint16_t vport, struct zxdh_port_attr_tab
 	ZXDH_DTB_ERAM_ENTRY_INFO_T entry = {vfid, (uint32_t *)port_attr};
 	ZXDH_DTB_USER_ENTRY_T user_entry_write = {ZXDH_SDT_VPORT_ATT_TABLE, (void *)&entry};
 
-	ret = zxdh_np_dtb_table_entry_write(hw->slot_id,
+	ret = zxdh_np_dtb_table_entry_write(hw->dev_id,
 				dtb_data->queueid, 1, &user_entry_write);
 	if (ret != 0)
 		PMD_DRV_LOG(ERR, "write vport_att failed vfid:%d failed", vfid);
@@ -105,7 +105,7 @@ zxdh_port_attr_uninit(struct rte_eth_dev *dev)
 			.sdt_no = ZXDH_SDT_VPORT_ATT_TABLE,
 			.p_entry_data = (void *)&port_attr_entry
 		};
-		ret = zxdh_np_dtb_table_entry_delete(hw->slot_id, dtb_data->queueid, 1, &entry);
+		ret = zxdh_np_dtb_table_entry_delete(hw->dev_id, dtb_data->queueid, 1, &entry);
 		if (ret) {
 			PMD_DRV_LOG(ERR, "delete port attr table failed");
 			ret = -1;
@@ -147,7 +147,7 @@ int zxdh_panel_table_init(struct rte_eth_dev *dev)
 		.sdt_no = ZXDH_SDT_PANEL_ATT_TABLE,
 		.p_entry_data = (void *)&panel_entry
 	};
-	ret = zxdh_np_dtb_table_entry_write(hw->slot_id, dtb_data->queueid, 1, &entry);
+	ret = zxdh_np_dtb_table_entry_write(hw->dev_id, dtb_data->queueid, 1, &entry);
 
 	if (ret) {
 		PMD_DRV_LOG(ERR, "Insert eram-panel failed, code:%u", ret);
@@ -171,7 +171,7 @@ int zxdh_get_panel_attr(struct rte_eth_dev *dev, struct zxdh_panel_table *panel_
 		.sdt_no = ZXDH_SDT_PANEL_ATT_TABLE,
 		.p_entry_data = (void *)&panel_entry
 	};
-	int ret = zxdh_np_dtb_table_entry_get(hw->slot_id, dtb_data->queueid, &entry, 1);
+	int ret = zxdh_np_dtb_table_entry_get(hw->dev_id, dtb_data->queueid, &entry, 1);
 
 	if (ret != 0)
 		PMD_DRV_LOG(ERR, "get panel table failed");
@@ -193,7 +193,7 @@ int zxdh_set_panel_attr(struct rte_eth_dev *dev, struct zxdh_panel_table *panel_
 		.sdt_no = ZXDH_SDT_PANEL_ATT_TABLE,
 		.p_entry_data = (void *)&panel_entry
 	};
-	int ret = zxdh_np_dtb_table_entry_write(hw->slot_id, dtb_data->queueid, 1, &entry);
+	int ret = zxdh_np_dtb_table_entry_write(hw->dev_id, dtb_data->queueid, 1, &entry);
 
 	if (ret)
 		PMD_DRV_LOG(ERR, "Insert panel table failed");
@@ -211,7 +211,7 @@ zxdh_get_port_attr(struct zxdh_hw *hw, uint16_t vport, struct zxdh_port_attr_tab
 	ZXDH_DTB_USER_ENTRY_T user_entry_get = {ZXDH_SDT_VPORT_ATT_TABLE, &entry};
 	int ret;
 
-	ret = zxdh_np_dtb_table_entry_get(hw->slot_id, dtb_data->queueid, &user_entry_get, 1);
+	ret = zxdh_np_dtb_table_entry_get(hw->dev_id, dtb_data->queueid, &user_entry_get, 1);
 	if (ret != 0)
 		PMD_DRV_LOG(ERR, "get port_attr vfid:%d failed, ret:%d", vfid, ret);
 
@@ -230,7 +230,7 @@ zxdh_delete_port_attr(struct zxdh_hw *hw, uint16_t vport,
 		.sdt_no = ZXDH_SDT_VPORT_ATT_TABLE,
 		.p_entry_data = (void *)&entry
 	};
-	int ret = zxdh_np_dtb_table_entry_delete(hw->slot_id, dtb_data->queueid, 1, &user_entry);
+	int ret = zxdh_np_dtb_table_entry_delete(hw->dev_id, dtb_data->queueid, 1, &user_entry);
 	if (ret != 0)
 		PMD_DRV_LOG(ERR, "delete port attr failed, vfid:%u", vport_num.vfid);
 	return ret;
@@ -261,7 +261,7 @@ zxdh_add_mac_table(struct zxdh_hw *hw, uint16_t vport, struct rte_ether_addr *ad
 			.p_entry_data = (void *)&dtb_hash_entry
 		};
 
-		ret = zxdh_np_dtb_table_entry_get(hw->slot_id, hw->dev_sd->dtb_sd.queueid,
+		ret = zxdh_np_dtb_table_entry_get(hw->dev_id, hw->dev_sd->dtb_sd.queueid,
 				&entry_get, 1);
 		if (ret == 0) {
 			if (unicast_table.entry.hit_flag != 0 &&
@@ -277,7 +277,7 @@ zxdh_add_mac_table(struct zxdh_hw *hw, uint16_t vport, struct rte_ether_addr *ad
 
 		unicast_table.entry.vfid = rte_cpu_to_be_16(vfid);
 		unicast_table.entry.hit_flag = 1;
-		ret = zxdh_np_dtb_table_entry_write(hw->slot_id,
+		ret = zxdh_np_dtb_table_entry_write(hw->dev_id,
 					hw->dev_sd->dtb_sd.queueid, 1, &entry_get);
 		if (ret) {
 			PMD_DRV_LOG(ERR, "Insert mac_table failed");
@@ -298,7 +298,7 @@ zxdh_add_mac_table(struct zxdh_hw *hw, uint16_t vport, struct rte_ether_addr *ad
 				.p_entry_data = (void *)&dtb_hash_entry
 			};
 
-			ret = zxdh_np_dtb_table_entry_get(hw->slot_id, hw->dev_sd->dtb_sd.queueid,
+			ret = zxdh_np_dtb_table_entry_get(hw->dev_id, hw->dev_sd->dtb_sd.queueid,
 					&entry_get, 1);
 			uint8_t index = (vport_num.vfid % 64) / 32;
 			uint8_t value = (vport_num.vfid % 64) % 32;
@@ -330,7 +330,7 @@ zxdh_add_mac_table(struct zxdh_hw *hw, uint16_t vport, struct rte_ether_addr *ad
 						multicast_table.entry.mc_pf_enable = false;
 				}
 			}
-			ret = zxdh_np_dtb_table_entry_write(hw->slot_id, hw->dev_sd->dtb_sd.queueid,
+			ret = zxdh_np_dtb_table_entry_write(hw->dev_id, hw->dev_sd->dtb_sd.queueid,
 						1, &entry_get);
 			if (ret) {
 				PMD_DRV_LOG(ERR, "add mac_table failed, code:%d", ret);
@@ -368,7 +368,7 @@ zxdh_del_mac_table(struct zxdh_hw *hw, uint16_t vport, struct rte_ether_addr *ad
 			.sdt_no = ZXDH_UNICAST_MAC_HASH_INDEX(hash_search_idx),
 			.p_entry_data = (void *)&dtb_hash_entry
 		};
-		ret = zxdh_np_dtb_table_entry_get(hw->slot_id, hw->dev_sd->dtb_sd.queueid,
+		ret = zxdh_np_dtb_table_entry_get(hw->dev_id, hw->dev_sd->dtb_sd.queueid,
 				&entry_get, 1);
 		if (ret == 0) {
 			if (unicast_table.entry.hit_flag != 0 &&
@@ -377,7 +377,7 @@ zxdh_del_mac_table(struct zxdh_hw *hw, uint16_t vport, struct rte_ether_addr *ad
 			}
 		}
 
-		ret = zxdh_np_dtb_table_entry_delete(hw->slot_id, hw->dev_sd->dtb_sd.queueid,
+		ret = zxdh_np_dtb_table_entry_delete(hw->dev_id, hw->dev_sd->dtb_sd.queueid,
 				1, &entry_get);
 		if (ret) {
 			PMD_DRV_LOG(ERR, "delete l2_fwd_hash_table failed, code:%d", ret);
@@ -397,7 +397,7 @@ zxdh_del_mac_table(struct zxdh_hw *hw, uint16_t vport, struct rte_ether_addr *ad
 			.p_entry_data = (void *)&dtb_hash_entry
 		};
 
-		ret = zxdh_np_dtb_table_entry_get(hw->slot_id, hw->dev_sd->dtb_sd.queueid,
+		ret = zxdh_np_dtb_table_entry_get(hw->dev_id, hw->dev_sd->dtb_sd.queueid,
 				&entry_get, 1);
 		uint8_t index = (vport_num.vfid % 64) / 32;
 		uint8_t value = (vport_num.vfid % 64) % 32;
@@ -407,7 +407,7 @@ zxdh_del_mac_table(struct zxdh_hw *hw, uint16_t vport, struct rte_ether_addr *ad
 		else
 			multicast_table.entry.mc_pf_enable = 0;
 
-		ret = zxdh_np_dtb_table_entry_write(hw->slot_id, hw->dev_sd->dtb_sd.queueid,
+		ret = zxdh_np_dtb_table_entry_write(hw->dev_id, hw->dev_sd->dtb_sd.queueid,
 				1, &entry_get);
 		if (ret) {
 			PMD_DRV_LOG(ERR, "mac_addr_add mc_table failed, code:%d", ret);
@@ -427,7 +427,7 @@ zxdh_del_mac_table(struct zxdh_hw *hw, uint16_t vport, struct rte_ether_addr *ad
 				.p_entry_data = (void *)&dtb_hash_entry
 			};
 
-			ret = zxdh_np_dtb_table_entry_get(hw->slot_id, hw->dev_sd->dtb_sd.queueid,
+			ret = zxdh_np_dtb_table_entry_get(hw->dev_id, hw->dev_sd->dtb_sd.queueid,
 					&entry_get, 1);
 			if (multicast_table.entry.mc_bitmap[0] == 0 &&
 				multicast_table.entry.mc_bitmap[1] == 0 &&
@@ -452,7 +452,7 @@ zxdh_del_mac_table(struct zxdh_hw *hw, uint16_t vport, struct rte_ether_addr *ad
 					.p_entry_data = (void *)&dtb_hash_entry
 				};
 
-				ret = zxdh_np_dtb_table_entry_delete(hw->slot_id,
+				ret = zxdh_np_dtb_table_entry_delete(hw->dev_id,
 						hw->dev_sd->dtb_sd.queueid, 1, &entry_get);
 			}
 		}
@@ -484,7 +484,7 @@ zxdh_promisc_table_init(struct rte_eth_dev *dev)
 			.p_entry_data = (void *)&eram_brocast_entry
 		};
 
-		ret = zxdh_np_dtb_table_entry_write(hw->slot_id,
+		ret = zxdh_np_dtb_table_entry_write(hw->dev_id,
 					dtb_data->queueid, 1, &entry_brocast);
 		if (ret) {
 			PMD_DRV_LOG(ERR, "write brocast table failed");
@@ -501,7 +501,7 @@ zxdh_promisc_table_init(struct rte_eth_dev *dev)
 			.p_entry_data = (void *)&eram_uc_entry
 		};
 
-		ret = zxdh_np_dtb_table_entry_write(hw->slot_id,
+		ret = zxdh_np_dtb_table_entry_write(hw->dev_id,
 					dtb_data->queueid, 1, &entry_unicast);
 		if (ret) {
 			PMD_DRV_LOG(ERR, "write unicast table failed");
@@ -518,7 +518,7 @@ zxdh_promisc_table_init(struct rte_eth_dev *dev)
 			.p_entry_data = (void *)&eram_mc_entry
 		};
 
-		ret = zxdh_np_dtb_table_entry_write(hw->slot_id, dtb_data->queueid,
+		ret = zxdh_np_dtb_table_entry_write(hw->dev_id, dtb_data->queueid,
 					1, &entry_multicast);
 		if (ret) {
 			PMD_DRV_LOG(ERR, "write multicast table failed");
@@ -553,7 +553,7 @@ zxdh_promisc_table_uninit(struct rte_eth_dev *dev)
 			.p_entry_data = (void *)&eram_brocast_entry
 		};
 
-		ret = zxdh_np_dtb_table_entry_delete(hw->slot_id,
+		ret = zxdh_np_dtb_table_entry_delete(hw->dev_id,
 				dtb_data->queueid, 1, &entry_brocast);
 		if (ret) {
 			PMD_DRV_LOG(ERR, "write brocast table failed");
@@ -570,7 +570,7 @@ zxdh_promisc_table_uninit(struct rte_eth_dev *dev)
 			.p_entry_data = (void *)&eram_uc_entry
 		};
 
-		ret = zxdh_np_dtb_table_entry_delete(hw->slot_id,
+		ret = zxdh_np_dtb_table_entry_delete(hw->dev_id,
 				dtb_data->queueid, 1, &entry_unicast);
 		if (ret) {
 			PMD_DRV_LOG(ERR, "write unicast table failed");
@@ -587,7 +587,7 @@ zxdh_promisc_table_uninit(struct rte_eth_dev *dev)
 			.p_entry_data = (void *)&eram_mc_entry
 		};
 
-		ret = zxdh_np_dtb_table_entry_delete(hw->slot_id, dtb_data->queueid,
+		ret = zxdh_np_dtb_table_entry_delete(hw->dev_id, dtb_data->queueid,
 					1, &entry_multicast);
 		if (ret) {
 			PMD_DRV_LOG(ERR, "write multicast table failed");
@@ -617,7 +617,7 @@ zxdh_dev_unicast_table_set(struct zxdh_hw *hw, uint16_t vport, bool enable)
 		.p_entry_data = (void *)&uc_table_entry
 	};
 
-	ret = zxdh_np_dtb_table_entry_get(hw->slot_id, dtb_data->queueid, &entry, 1);
+	ret = zxdh_np_dtb_table_entry_get(hw->dev_id, dtb_data->queueid, &entry, 1);
 	if (ret) {
 		PMD_DRV_LOG(ERR, "unicast_table_get_failed:%d", vfid);
 		return -ret;
@@ -634,7 +634,7 @@ zxdh_dev_unicast_table_set(struct zxdh_hw *hw, uint16_t vport, bool enable)
 		uc_table.uc_flood_pf_enable = rte_be_to_cpu_32(ZXDH_TABLE_HIT_FLAG + (enable << 6));
 	}
 
-	ret = zxdh_np_dtb_table_entry_write(hw->slot_id, dtb_data->queueid, 1, &entry);
+	ret = zxdh_np_dtb_table_entry_write(hw->dev_id, dtb_data->queueid, 1, &entry);
 	if (ret) {
 		PMD_DRV_LOG(ERR, "unicast_table_set_failed:%d", vfid);
 		return -ret;
@@ -673,7 +673,7 @@ zxdh_dev_multicast_table_set(struct zxdh_hw *hw, uint16_t vport, bool enable)
 		.p_entry_data = (void *)&mc_table_entry
 	};
 
-	ret = zxdh_np_dtb_table_entry_get(hw->slot_id, dtb_data->queueid, &entry, 1);
+	ret = zxdh_np_dtb_table_entry_get(hw->dev_id, dtb_data->queueid, &entry, 1);
 	if (ret) {
 		PMD_DRV_LOG(ERR, "allmulti_table_get_failed:%d", hw->vfid);
 		return -ret;
@@ -690,7 +690,7 @@ zxdh_dev_multicast_table_set(struct zxdh_hw *hw, uint16_t vport, bool enable)
 	} else {
 		mc_table.mc_flood_pf_enable = rte_be_to_cpu_32(ZXDH_TABLE_HIT_FLAG + (enable << 6));
 	}
-	ret = zxdh_np_dtb_table_entry_write(hw->slot_id, dtb_data->queueid, 1, &entry);
+	ret = zxdh_np_dtb_table_entry_write(hw->dev_id, dtb_data->queueid, 1, &entry);
 	if (ret) {
 		PMD_DRV_LOG(ERR, "allmulti_table_set_failed:%d", hw->vfid);
 		return -ret;
@@ -725,7 +725,7 @@ zxdh_vlan_filter_table_init(struct zxdh_hw *hw, uint16_t vport)
 		};
 		ZXDH_DTB_USER_ENTRY_T user_entry = {ZXDH_SDT_VLAN_ATT_TABLE, &entry_data};
 
-		ret = zxdh_np_dtb_table_entry_write(hw->slot_id,
+		ret = zxdh_np_dtb_table_entry_write(hw->dev_id,
 					dtb_data->queueid, 1, &user_entry);
 		if (ret != 0) {
 			PMD_DRV_LOG(ERR,
@@ -761,7 +761,7 @@ zxdh_vlan_filter_table_set(struct zxdh_hw *hw, uint16_t vport, uint16_t vlan_id,
 	ZXDH_DTB_ERAM_ENTRY_INFO_T entry_data = {index, (uint32_t *)&vlan_table};
 	ZXDH_DTB_USER_ENTRY_T user_entry_get = {ZXDH_SDT_VLAN_ATT_TABLE, &entry_data};
 
-	ret = zxdh_np_dtb_table_entry_get(hw->slot_id, dtb_data->queueid, &user_entry_get, 1);
+	ret = zxdh_np_dtb_table_entry_get(hw->dev_id, dtb_data->queueid, &user_entry_get, 1);
 	if (ret) {
 		PMD_DRV_LOG(ERR, "get vlan table failed");
 		return -1;
@@ -787,7 +787,7 @@ zxdh_vlan_filter_table_set(struct zxdh_hw *hw, uint16_t vport, uint16_t vlan_id,
 		.p_entry_data = &entry_data
 	};
 
-	ret = zxdh_np_dtb_table_entry_write(hw->slot_id,
+	ret = zxdh_np_dtb_table_entry_write(hw->dev_id,
 				dtb_data->queueid, 1, &user_entry_write);
 	if (ret != 0) {
 		PMD_DRV_LOG(ERR, "write vlan table failed");
@@ -830,7 +830,7 @@ zxdh_rss_table_set(struct zxdh_hw *hw, uint16_t vport, struct zxdh_rss_reta *rss
 			.sdt_no = ZXDH_SDT_RSS_ATT_TABLE,
 			.p_entry_data = &entry
 		};
-		ret = zxdh_np_dtb_table_entry_write(hw->slot_id,
+		ret = zxdh_np_dtb_table_entry_write(hw->dev_id,
 					dtb_data->queueid, 1, &user_entry_write);
 		if (ret != 0) {
 			PMD_DRV_LOG(ERR, "write rss base qid failed vfid:%d", vfid);
@@ -853,7 +853,7 @@ zxdh_rss_table_get(struct zxdh_hw *hw, uint16_t vport, struct zxdh_rss_reta *rss
 		ZXDH_DTB_ERAM_ENTRY_INFO_T entry = {vfid * 32 + i, (uint32_t *)&rss_vqid};
 		ZXDH_DTB_USER_ENTRY_T user_entry = {ZXDH_SDT_RSS_ATT_TABLE, &entry};
 
-		ret = zxdh_np_dtb_table_entry_get(hw->slot_id,
+		ret = zxdh_np_dtb_table_entry_get(hw->dev_id,
 					dtb_data->queueid, &user_entry, 1);
 		if (ret != 0) {
 			PMD_DRV_LOG(ERR, "get rss tbl failed, vfid:%d", vfid);
@@ -897,7 +897,7 @@ zxdh_dev_broadcast_set(struct zxdh_hw *hw, uint16_t vport, bool enable)
 			.sdt_no = ZXDH_SDT_BROCAST_ATT_TABLE,
 			.p_entry_data = (void *)&eram_entry};
 
-	ret = zxdh_np_dtb_table_entry_get(hw->slot_id, dtb_data->queueid, &entry_get, 1);
+	ret = zxdh_np_dtb_table_entry_get(hw->dev_id, dtb_data->queueid, &entry_get, 1);
 	if (ret == 0) {
 		if (enable)
 			brocast_table.bitmap[(vport_num.vfid % 64) / 32] |=
@@ -906,7 +906,7 @@ zxdh_dev_broadcast_set(struct zxdh_hw *hw, uint16_t vport, bool enable)
 			brocast_table.bitmap[(vport_num.vfid % 64) / 32] &=
 					~((UINT32_C(1) << (31 - (vport_num.vfid % 64) % 32)));
 
-		ret = zxdh_np_dtb_table_entry_write(hw->slot_id, dtb_data->queueid, 1, &entry_get);
+		ret = zxdh_np_dtb_table_entry_write(hw->dev_id, dtb_data->queueid, 1, &entry_get);
 		if (ret) {
 			PMD_DRV_LOG(ERR, "brocast_table_write_failed. code:%d", ret);
 			return -ret;
@@ -968,7 +968,7 @@ zxdh_set_port_vlan_attr(struct zxdh_hw *hw, uint16_t vport,
 		.p_entry_data = (void *)&port_entry
 	};
 
-	ret = zxdh_np_dtb_table_entry_write(hw->slot_id, hw->dev_sd->dtb_sd.queueid, 1, &entry);
+	ret = zxdh_np_dtb_table_entry_write(hw->dev_id, hw->dev_sd->dtb_sd.queueid, 1, &entry);
 	if (ret)
 		PMD_DRV_LOG(ERR, "write port_vlan tbl failed, ret:%d ", ret);
 	return ret;
@@ -991,7 +991,7 @@ zxdh_get_port_vlan_attr(struct zxdh_hw *hw, uint16_t vport,
 		.p_entry_data = (void *)&port_entry
 	};
 
-	ret = zxdh_np_dtb_table_entry_get(hw->slot_id, hw->dev_sd->dtb_sd.queueid,
+	ret = zxdh_np_dtb_table_entry_get(hw->dev_id, hw->dev_sd->dtb_sd.queueid,
 			&entry, 1);
 	if (ret)
 		PMD_DRV_LOG(ERR, "get port vlan tbl failed, ret:%d ", ret);
-- 
2.27.0

[-- Attachment #1.1.2: Type: text/html , Size: 133159 bytes --]

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

* Re: [PATCH v1] net/zxdh: support multiple PF process flow table
  2025-09-24  8:23 [PATCH v1] net/zxdh: support multiple PF process flow table Tianhao Zhang
@ 2025-09-24 20:28 ` Stephen Hemminger
  2025-09-24 20:31 ` Stephen Hemminger
                   ` (3 subsequent siblings)
  4 siblings, 0 replies; 6+ messages in thread
From: Stephen Hemminger @ 2025-09-24 20:28 UTC (permalink / raw)
  To: Tianhao Zhang; +Cc: wang.junlong1, yang.yonggang, dev

On Wed, 24 Sep 2025 16:23:31 +0800
Tianhao Zhang <zhang.tianhao2@zte.com.cn> wrote:

> diff --git a/drivers/net/zxdh/meson.build b/drivers/net/zxdh/meson.build
> index 7554d4dc60..0213ccb2fa 100644
> --- a/drivers/net/zxdh/meson.build
> +++ b/drivers/net/zxdh/meson.build
> @@ -1,15 +1,9 @@
>  # SPDX-License-Identifier: BSD-3-Clause
>  # Copyright(c) 2024 ZTE Corporation
>  
> -if not is_linux
> +if not is_linux or not dpdk_conf.get('RTE_ARCH_64')
>      build = false
> -    reason = 'only supported on Linux'
> -    subdir_done()
> -endif
> -
> -if arch_subdir != 'x86' and arch_subdir != 'arm' or not dpdk_conf.get('RTE_ARCH_64')
> -    build = false
> -    reason = 'only supported on x86_64 and aarch64'
> +    reason = 'only supported on 64-bit Linux'
>      subdir_done()
>  endif
>  

This seems unrelated to the PF process flow table.
Should be split into a separate patch

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

* Re: [PATCH v1] net/zxdh: support multiple PF process flow table
  2025-09-24  8:23 [PATCH v1] net/zxdh: support multiple PF process flow table Tianhao Zhang
  2025-09-24 20:28 ` Stephen Hemminger
@ 2025-09-24 20:31 ` Stephen Hemminger
  2025-09-25  2:45 ` [PATCH v1] " Tianhao Zhang
                   ` (2 subsequent siblings)
  4 siblings, 0 replies; 6+ messages in thread
From: Stephen Hemminger @ 2025-09-24 20:31 UTC (permalink / raw)
  To: Tianhao Zhang; +Cc: wang.junlong1, yang.yonggang, dev

On Wed, 24 Sep 2025 16:23:31 +0800
Tianhao Zhang <zhang.tianhao2@zte.com.cn> wrote:

> +static void
> +zxdh_priv_res_free(struct zxdh_hw *priv)
> +{
> +	rte_free(priv->vfinfo);
> +	priv->vfinfo = NULL;
> +	if (priv->channel_context != NULL) {
> +		rte_free(priv->channel_context);
> +		priv->channel_context = NULL;
> +	}
> +}
> +

You don't need the check for channel_context.
It is better to make both pieces consistent:

Like:

static void
zxdh_priv_res_free(struct zxdh_hw *priv)
{
	rte_free(priv->vfinfo);
	priv->vfinfo = NULL;

	rte_free(priv->channel_context);
	priv->channel_context = NULL;
}

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

* [PATCH v1] support multiple PF process flow table
  2025-09-24  8:23 [PATCH v1] net/zxdh: support multiple PF process flow table Tianhao Zhang
  2025-09-24 20:28 ` Stephen Hemminger
  2025-09-24 20:31 ` Stephen Hemminger
@ 2025-09-25  2:45 ` Tianhao Zhang
  2025-09-26  1:04 ` Tianhao Zhang
  2025-09-26  1:28 ` [PATCH v2] net/zxdh: " Tianhao Zhang
  4 siblings, 0 replies; 6+ messages in thread
From: Tianhao Zhang @ 2025-09-25  2:45 UTC (permalink / raw)
  To: stephen, wang.junlong1, yang.yonggang; +Cc: dev, Tianhao Zhang


[-- Attachment #1.1.1: Type: text/plain, Size: 60791 bytes --]

Support multiple PF process flow table.

Signed-off-by: Tianhao Zhang <zhang.tianhao2@zte.com.cn>
---
 drivers/net/zxdh/zxdh_ethdev.c     | 137 ++++++++-------
 drivers/net/zxdh/zxdh_ethdev.h     |   9 +-
 drivers/net/zxdh/zxdh_ethdev_ops.c |  20 +--
 drivers/net/zxdh/zxdh_np.c         | 269 +++++++++++++++++------------
 drivers/net/zxdh/zxdh_np.h         |  18 +-
 drivers/net/zxdh/zxdh_tables.c     |  72 ++++----
 6 files changed, 296 insertions(+), 229 deletions(-)

diff --git a/drivers/net/zxdh/zxdh_ethdev.c b/drivers/net/zxdh/zxdh_ethdev.c
index 0429bd0333..bc929bacc5 100644
--- a/drivers/net/zxdh/zxdh_ethdev.c
+++ b/drivers/net/zxdh/zxdh_ethdev.c
@@ -20,7 +20,7 @@
 #include "zxdh_ethdev_ops.h"
 
 struct zxdh_hw_internal zxdh_hw_internal[RTE_MAX_ETHPORTS];
-struct zxdh_dev_shared_data g_dev_sd[ZXDH_SLOT_MAX];
+struct zxdh_dev_nic_shared_data dev_nic_sd[ZXDH_SLOT_MAX];
 static rte_spinlock_t zxdh_shared_data_lock = RTE_SPINLOCK_INITIALIZER;
 struct zxdh_shared_data *zxdh_shared_data;
 struct zxdh_net_hdr_dl g_net_hdr_dl[RTE_MAX_ETHPORTS];
@@ -1141,26 +1141,26 @@ zxdh_np_dtb_data_res_free(struct zxdh_hw *hw)
 	int i;
 
 	if (dtb_data->init_done && dtb_data->bind_device == dev) {
-		ret = zxdh_np_online_uninit(hw->slot_id, dev->data->name, dtb_data->queueid);
+		ret = zxdh_np_online_uninit(hw->dev_id, dev->data->name, dtb_data->queueid);
 		if (ret)
 			PMD_DRV_LOG(ERR, "%s dpp_np_online_uninstall failed", dev->data->name);
 
-		rte_memzone_free(dtb_data->dtb_table_conf_mz);
-		dtb_data->dtb_table_conf_mz = NULL;
-		rte_memzone_free(dtb_data->dtb_table_dump_mz);
-		dtb_data->dtb_table_dump_mz = NULL;
-
-		for (i = 0; i < ZXDH_MAX_BASE_DTB_TABLE_COUNT; i++) {
-			if (dtb_data->dtb_table_bulk_dump_mz[i]) {
-				rte_memzone_free(dtb_data->dtb_table_bulk_dump_mz[i]);
-				dtb_data->dtb_table_bulk_dump_mz[i] = NULL;
-			}
-		}
+		hw->dev_nic_sd->dtb_used_num--;
 		dtb_data->init_done = 0;
 		dtb_data->bind_device = NULL;
 	}
-	if (zxdh_shared_data != NULL)
-		zxdh_shared_data->np_init_done = 0;
+
+	rte_memzone_free(dtb_data->dtb_table_conf_mz);
+	dtb_data->dtb_table_conf_mz = NULL;
+	rte_memzone_free(dtb_data->dtb_table_dump_mz);
+	dtb_data->dtb_table_dump_mz = NULL;
+
+	for (i = 0; i < ZXDH_MAX_BASE_DTB_TABLE_COUNT; i++) {
+		if (dtb_data->dtb_table_bulk_dump_mz[i]) {
+			rte_memzone_free(dtb_data->dtb_table_bulk_dump_mz[i]);
+			dtb_data->dtb_table_bulk_dump_mz[i] = NULL;
+		}
+	}
 }
 
 static int
@@ -1191,17 +1191,19 @@ static void
 zxdh_np_uninit(struct rte_eth_dev *dev)
 {
 	struct zxdh_hw *hw = dev->data->dev_private;
-	struct zxdh_dtb_shared_data *dtb_data = &hw->dev_sd->dtb_sd;
 
 	if (!hw->is_pf)
 		return;
-	if (!dtb_data->init_done && !dtb_data->dev_refcnt)
-		return;
 
 	zxdh_tbl_entry_online_destroy(dev);
+	zxdh_np_dtb_data_res_free(hw);
+
+	if (hw->dev_nic_sd->init_done && hw->dev_nic_sd->dtb_used_num == 0) {
+		zxdh_np_soft_res_uninstall(hw->dev_id);
+		hw->dev_nic_sd->init_done = 0;
+	}
+	PMD_DRV_LOG(DEBUG, "zxdh_np_destroy: dtb_used_num %d", hw->dev_nic_sd->dtb_used_num);
 
-	if (--dtb_data->dev_refcnt == 0)
-		zxdh_np_dtb_data_res_free(hw);
 }
 
 static int
@@ -1254,6 +1256,16 @@ zxdh_dev_stop(struct rte_eth_dev *dev)
 	return ret;
 }
 
+static void
+zxdh_priv_res_free(struct zxdh_hw *priv)
+{
+	rte_free(priv->vfinfo);
+	priv->vfinfo = NULL;
+
+	rte_free(priv->channel_context);
+	priv->channel_context = NULL;
+}
+
 static int
 zxdh_dev_close(struct rte_eth_dev *dev)
 {
@@ -1285,7 +1297,9 @@ zxdh_dev_close(struct rte_eth_dev *dev)
 	zxdh_free_queues(dev);
 
 	zxdh_bar_msg_chan_exit();
+	zxdh_priv_res_free(hw);
 
+	rte_free(hw->dev_sd);
 	if (dev->data->mac_addrs != NULL) {
 		rte_free(dev->data->mac_addrs);
 		dev->data->mac_addrs = NULL;
@@ -1615,6 +1629,7 @@ zxdh_np_dtb_res_init(struct rte_eth_dev *dev)
 	struct zxdh_bar_offset_res res = {0};
 	char buf[ZXDH_MAX_NAME_LEN] = {0};
 	struct zxdh_dtb_shared_data *dtb_data = &hw->dev_sd->dtb_sd;
+	struct zxdh_dev_nic_shared_data *dev_nic_sd = hw->dev_nic_sd;
 	int ret = 0;
 
 	if (dtb_data->init_done) {
@@ -1625,15 +1640,13 @@ zxdh_np_dtb_res_init(struct rte_eth_dev *dev)
 
 	dtb_data->queueid = ZXDH_INVALID_DTBQUE;
 	dtb_data->bind_device = dev;
-	dtb_data->dev_refcnt++;
-	dtb_data->init_done = 1;
 
 	ZXDH_DEV_INIT_CTRL_T *dpp_ctrl = rte_zmalloc(NULL, sizeof(*dpp_ctrl) +
 			sizeof(ZXDH_DTB_ADDR_INFO_T) * 256, 0);
 	if (dpp_ctrl == NULL) {
 		PMD_DRV_LOG(ERR, "dev %s annot allocate memory for dpp_ctrl", dev->device->name);
 		ret = -ENOMEM;
-		goto free_res;
+		return ret;
 	}
 	dpp_ctrl->queue_id = 0xff;
 	dpp_ctrl->vport = hw->vport.vport;
@@ -1694,7 +1707,7 @@ zxdh_np_dtb_res_init(struct rte_eth_dev *dev)
 		goto free_res;
 	}
 
-	ret = zxdh_np_host_init(hw->slot_id, dpp_ctrl);
+	ret = zxdh_np_host_init(hw->dev_id, dpp_ctrl);
 	if (ret) {
 		PMD_DRV_LOG(ERR, "dev %s dpp host np init failed", dev->device->name);
 		goto free_res;
@@ -1703,6 +1716,9 @@ zxdh_np_dtb_res_init(struct rte_eth_dev *dev)
 	PMD_DRV_LOG(DEBUG, "dev %s dpp host np init ok.dtb queue %u",
 		dev->device->name, dpp_ctrl->queue_id);
 	dtb_data->queueid = dpp_ctrl->queue_id;
+	dtb_data->dev_refcnt++;
+	dev_nic_sd->dtb_used_num++;
+	dtb_data->init_done = 1;
 	rte_free(dpp_ctrl);
 	return 0;
 
@@ -1717,11 +1733,11 @@ zxdh_get_dev_shared_data_idx(uint32_t dev_serial_id)
 {
 	uint16_t idx = 0;
 	for (; idx < ZXDH_SLOT_MAX; idx++) {
-		if (g_dev_sd[idx].serial_id == dev_serial_id || g_dev_sd[idx].serial_id == 0)
+		if (dev_nic_sd[idx].serial_id == dev_serial_id || dev_nic_sd[idx].serial_id == 0)
 			return idx;
 	}
 
-	PMD_DRV_LOG(ERR, "dev serial_id[%u] can not found in global dev_share_data arrays",
+	PMD_DRV_LOG(ERR, "dev serial_id[%u] can not found in global dev_nic_share_data arrays",
 		dev_serial_id);
 	return ZXDH_INVALID_SLOT_IDX;
 }
@@ -1744,9 +1760,10 @@ static int zxdh_init_dev_share_data(struct rte_eth_dev *eth_dev)
 		return -EINVAL;
 
 	hw->slot_id = slot_id;
-	hw->dev_id = (hw->pcie_id << 16) | (hw->slot_id & 0xffff);
-	g_dev_sd[slot_id].serial_id = serial_id;
-	hw->dev_sd = &g_dev_sd[slot_id];
+	hw->dev_id = hw->pcie_id;
+	dev_nic_sd[slot_id].serial_id = serial_id;
+	hw->dev_nic_sd = &dev_nic_sd[slot_id];
+	hw->dev_sd = rte_zmalloc("zxdh_dtb", sizeof(struct zxdh_dev_shared_data), 0);
 
 	return 0;
 }
@@ -1938,41 +1955,39 @@ zxdh_np_init(struct rte_eth_dev *eth_dev)
 {
 	struct zxdh_hw *hw = eth_dev->data->dev_private;
 	struct zxdh_dtb_shared_data *dtb_data = &hw->dev_sd->dtb_sd;
+	struct zxdh_dev_nic_shared_data *dev_nic_sd = hw->dev_nic_sd;
 	int ret = 0;
 
-	if (hw->is_pf && dtb_data->init_done) {
-		dtb_data->dev_refcnt++;
-		zxdh_tbl_entry_offline_destroy(hw);
-		PMD_DRV_LOG(INFO, "no need to init dtb  dtb chanenl %d devref %d",
-			dtb_data->queueid, dtb_data->dev_refcnt);
+	if (!hw->is_pf)
 		return 0;
-	}
 
-	if (hw->is_pf) {
-		ret = zxdh_np_dtb_res_init(eth_dev);
-		if (ret) {
-			PMD_DRV_LOG(ERR, "np dtb init failed, ret:%d", ret);
-			return ret;
-		}
+	hw->dev_id = (hw->pcie_id << 16) | (hw->slot_id & 0xffff);
+
+	ret = zxdh_np_dtb_res_init(eth_dev);
+	if (ret) {
+		PMD_DRV_LOG(ERR, "np dtb init failed, ret:%d", ret);
+		return ret;
 	}
 
-	if (hw->is_pf) {
-		ret = zxdh_np_se_res_get_and_init(hw->dev_id, ZXDH_SE_STD_NIC_RES_TYPE);
-		if (ret) {
-			PMD_DRV_LOG(ERR, "dpp apt init failed, code:%d ", ret);
-			return -ret;
-		}
-		if (!hw->switchoffload) {
-			if (hw->hash_search_index >= ZXDH_HASHIDX_MAX) {
-				PMD_DRV_LOG(ERR, "invalid hash idx %d", hw->hash_search_index);
-				return -1;
-			}
-			zxdh_tbl_entry_offline_destroy(hw);
+	if (dev_nic_sd->init_done) {
+		zxdh_tbl_entry_offline_destroy(hw);
+		PMD_DRV_LOG(ERR, "no need to init apt res. slot_id %d dtb chanenl %d dtb_used_num %d",
+			hw->slot_id, dtb_data->queueid, hw->dev_nic_sd->dtb_used_num);
+		return 0;
+	}
+	ret = zxdh_np_se_res_get_and_init(hw->dev_id, ZXDH_SE_STD_NIC_RES_TYPE);
+	if (ret) {
+		PMD_DRV_LOG(ERR, "dpp apt init failed, code:%d ", ret);
+		return -ret;
+	}
+	if (!hw->switchoffload) {
+		if (hw->hash_search_index >= ZXDH_HASHIDX_MAX) {
+			PMD_DRV_LOG(ERR, "invalid hash idx %d", hw->hash_search_index);
+			return -1;
 		}
+		zxdh_tbl_entry_offline_destroy(hw);
 	}
-
-	if (zxdh_shared_data != NULL)
-		zxdh_shared_data->np_init_done = 1;
+	dev_nic_sd->init_done = 1;
 
 	PMD_DRV_LOG(DEBUG, "np init ok");
 	return 0;
@@ -2069,16 +2084,6 @@ zxdh_priv_res_init(struct zxdh_hw *hw)
 	return 0;
 }
 
-static void
-zxdh_priv_res_free(struct zxdh_hw *priv)
-{
-	rte_free(priv->vfinfo);
-	priv->vfinfo = NULL;
-	if (priv->channel_context != NULL) {
-		rte_free(priv->channel_context);
-		priv->channel_context = NULL;
-	}
-}
 
 static uint8_t
 is_pf(uint16_t device_id)
diff --git a/drivers/net/zxdh/zxdh_ethdev.h b/drivers/net/zxdh/zxdh_ethdev.h
index a2d7b14601..a269199540 100644
--- a/drivers/net/zxdh/zxdh_ethdev.h
+++ b/drivers/net/zxdh/zxdh_ethdev.h
@@ -103,6 +103,7 @@ struct zxdh_hw {
 	struct zxdh_virtqueue **vqs;
 	struct zxdh_chnl_context *channel_context;
 	struct zxdh_dev_shared_data *dev_sd;
+	struct zxdh_dev_nic_shared_data *dev_nic_sd;
 	struct vfinfo *vfinfo;
 
 	uint64_t bar_addr[ZXDH_NUM_BARS];
@@ -183,7 +184,6 @@ struct zxdh_shared_data {
 	int32_t init_done;       /* Whether primary has done initialization. */
 	unsigned int secondary_cnt; /* Number of secondary processes init'd. */
 
-	int32_t np_init_done;
 	uint32_t dev_refcnt;
 	struct zxdh_dtb_shared_data *dtb_data;
 	struct rte_mempool *flow_mp;
@@ -196,10 +196,15 @@ struct zxdh_shared_data {
 };
 
 struct zxdh_dev_shared_data {
-	uint32_t serial_id;
 	struct zxdh_dtb_shared_data dtb_sd;
 };
 
+struct zxdh_dev_nic_shared_data {
+	uint32_t serial_id;
+	uint16_t dtb_used_num;
+	uint16_t init_done;
+};
+
 struct zxdh_dtb_bulk_dump_info {
 	const char *mz_name;
 	uint32_t mz_size;
diff --git a/drivers/net/zxdh/zxdh_ethdev_ops.c b/drivers/net/zxdh/zxdh_ethdev_ops.c
index da32512b03..ee5d7304ef 100644
--- a/drivers/net/zxdh/zxdh_ethdev_ops.c
+++ b/drivers/net/zxdh/zxdh_ethdev_ops.c
@@ -1556,7 +1556,7 @@ zxdh_np_stats_get(struct rte_eth_dev *dev, struct zxdh_hw_np_stats *np_stats)
 
 	idx = stats_id + ZXDH_BROAD_STATS_EGRESS_BASE;
 	memset(&stats_data, 0, sizeof(stats_data));
-	ret = zxdh_np_dtb_stats_get(hw->slot_id, dtb_data->queueid,
+	ret = zxdh_np_dtb_stats_get(hw->dev_id, dtb_data->queueid,
 				0, idx, (uint32_t *)&stats_data);
 	if (ret)
 		return ret;
@@ -1567,7 +1567,7 @@ zxdh_np_stats_get(struct rte_eth_dev *dev, struct zxdh_hw_np_stats *np_stats)
 
 	idx = stats_id + ZXDH_BROAD_STATS_INGRESS_BASE;
 	memset(&stats_data, 0, sizeof(stats_data));
-	ret = zxdh_np_dtb_stats_get(hw->slot_id, dtb_data->queueid,
+	ret = zxdh_np_dtb_stats_get(hw->dev_id, dtb_data->queueid,
 				0, idx, (uint32_t *)&stats_data);
 	if (ret)
 		return ret;
@@ -1578,7 +1578,7 @@ zxdh_np_stats_get(struct rte_eth_dev *dev, struct zxdh_hw_np_stats *np_stats)
 
 	idx = stats_id + ZXDH_MULTICAST_STATS_EGRESS_BASE;
 	memset(&stats_data, 0, sizeof(stats_data));
-	ret = zxdh_np_dtb_stats_get(hw->slot_id, dtb_data->queueid,
+	ret = zxdh_np_dtb_stats_get(hw->dev_id, dtb_data->queueid,
 				0, idx, (uint32_t *)&stats_data);
 	if (ret)
 		return ret;
@@ -1589,7 +1589,7 @@ zxdh_np_stats_get(struct rte_eth_dev *dev, struct zxdh_hw_np_stats *np_stats)
 
 	idx = stats_id + ZXDH_MULTICAST_STATS_INGRESS_BASE;
 	memset(&stats_data, 0, sizeof(stats_data));
-	ret = zxdh_np_dtb_stats_get(hw->slot_id, dtb_data->queueid,
+	ret = zxdh_np_dtb_stats_get(hw->dev_id, dtb_data->queueid,
 				0, idx, (uint32_t *)&stats_data);
 	if (ret)
 		return ret;
@@ -1600,7 +1600,7 @@ zxdh_np_stats_get(struct rte_eth_dev *dev, struct zxdh_hw_np_stats *np_stats)
 
 	idx = stats_id + ZXDH_UNICAST_STATS_EGRESS_BASE;
 	memset(&stats_data, 0, sizeof(stats_data));
-	ret = zxdh_np_dtb_stats_get(hw->slot_id, dtb_data->queueid,
+	ret = zxdh_np_dtb_stats_get(hw->dev_id, dtb_data->queueid,
 				0, idx, (uint32_t *)&stats_data);
 	if (ret)
 		return ret;
@@ -1611,7 +1611,7 @@ zxdh_np_stats_get(struct rte_eth_dev *dev, struct zxdh_hw_np_stats *np_stats)
 
 	idx = stats_id + ZXDH_UNICAST_STATS_INGRESS_BASE;
 	memset(&stats_data, 0, sizeof(stats_data));
-	ret = zxdh_np_dtb_stats_get(hw->slot_id, dtb_data->queueid,
+	ret = zxdh_np_dtb_stats_get(hw->dev_id, dtb_data->queueid,
 				0, idx, (uint32_t *)&stats_data);
 	if (ret)
 		return ret;
@@ -1622,7 +1622,7 @@ zxdh_np_stats_get(struct rte_eth_dev *dev, struct zxdh_hw_np_stats *np_stats)
 
 	idx = stats_id + ZXDH_MTU_STATS_EGRESS_BASE;
 	memset(&stats_data, 0, sizeof(stats_data));
-	ret = zxdh_np_dtb_stats_get(hw->slot_id, dtb_data->queueid,
+	ret = zxdh_np_dtb_stats_get(hw->dev_id, dtb_data->queueid,
 				1, idx, (uint32_t *)&stats_data);
 	if (ret)
 		return ret;
@@ -1633,7 +1633,7 @@ zxdh_np_stats_get(struct rte_eth_dev *dev, struct zxdh_hw_np_stats *np_stats)
 
 	idx = stats_id + ZXDH_MTU_STATS_INGRESS_BASE;
 	memset(&stats_data, 0, sizeof(stats_data));
-	ret = zxdh_np_dtb_stats_get(hw->slot_id, dtb_data->queueid,
+	ret = zxdh_np_dtb_stats_get(hw->dev_id, dtb_data->queueid,
 				1, idx, (uint32_t *)&stats_data);
 	if (ret)
 		return ret;
@@ -1644,7 +1644,7 @@ zxdh_np_stats_get(struct rte_eth_dev *dev, struct zxdh_hw_np_stats *np_stats)
 
 	idx = stats_id + ZXDH_MTR_STATS_EGRESS_BASE;
 	memset(&stats_data, 0, sizeof(stats_data));
-	ret = zxdh_np_dtb_stats_get(hw->slot_id, dtb_data->queueid,
+	ret = zxdh_np_dtb_stats_get(hw->dev_id, dtb_data->queueid,
 				1, idx, (uint32_t *)&stats_data);
 	if (ret)
 		return ret;
@@ -1655,7 +1655,7 @@ zxdh_np_stats_get(struct rte_eth_dev *dev, struct zxdh_hw_np_stats *np_stats)
 
 	idx = stats_id + ZXDH_MTR_STATS_INGRESS_BASE;
 	memset(&stats_data, 0, sizeof(stats_data));
-	ret = zxdh_np_dtb_stats_get(hw->slot_id, dtb_data->queueid,
+	ret = zxdh_np_dtb_stats_get(hw->dev_id, dtb_data->queueid,
 				1, idx, (uint32_t *)&stats_data);
 	if (ret)
 		return ret;
diff --git a/drivers/net/zxdh/zxdh_np.c b/drivers/net/zxdh/zxdh_np.c
index 21c749c67a..024da113e2 100644
--- a/drivers/net/zxdh/zxdh_np.c
+++ b/drivers/net/zxdh/zxdh_np.c
@@ -300,8 +300,8 @@ static const ZXDH_DTB_TABLE_T g_dpp_dtb_dump_info[] = {
 };
 
 #define ZXDH_SDT_MGR_PTR_GET()    (&g_sdt_mgr)
-#define ZXDH_SDT_SOFT_TBL_GET(id) (g_sdt_mgr.sdt_tbl_array[id])
-#define ZXDH_DEV_INFO_GET(id) (g_dev_mgr.p_dev_array[id])
+#define ZXDH_SDT_SOFT_TBL_GET(id) (g_sdt_mgr.sdt_tbl_array[ZXDH_DEV_SLOT_ID(id)])
+#define ZXDH_DEV_INFO_GET(id) (g_dev_mgr.p_dev_array[ZXDH_DEV_SLOT_ID(id)])
 
 #define ZXDH_DTB_LEN(cmd_type, int_en, data_len) \
 	(((data_len) & 0x3ff) | \
@@ -384,45 +384,55 @@ zxdh_np_comm_convert32(uint32_t dw_data)
 #define ZXDH_COMM_CONVERT32(w_data) \
 			zxdh_np_comm_convert32(w_data)
 
-#define ZXDH_DTB_TAB_UP_WR_INDEX_GET(DEV_ID, QUEUE_ID)       \
-		(p_dpp_dtb_mgr[(DEV_ID)]->queue_info[(QUEUE_ID)].tab_up.wr_index)
+#define ZXDH_DTB_TAB_UP_WR_INDEX_GET(DEV_ID, QUEUE_ID) \
+		(p_dpp_dtb_mgr[(ZXDH_DEV_SLOT_ID(DEV_ID))]->queue_info[(QUEUE_ID)].tab_up.wr_index)
 
-#define ZXDH_DTB_TAB_UP_USER_PHY_ADDR_FLAG_GET(DEV_ID, QUEUE_ID, INDEX)     \
-	(p_dpp_dtb_mgr[(DEV_ID)]->queue_info[(QUEUE_ID)].tab_up.user_addr[(INDEX)].user_flag)
+#define ZXDH_DTB_TAB_UP_USER_PHY_ADDR_FLAG_GET(DEV_ID, QUEUE_ID, INDEX)    \
+		(p_dpp_dtb_mgr[(ZXDH_DEV_SLOT_ID(DEV_ID))]->                       \
+		queue_info[(QUEUE_ID)].tab_up.user_addr[(INDEX)].user_flag)
 
-#define ZXDH_DTB_TAB_UP_USER_PHY_ADDR_GET(DEV_ID, QUEUE_ID, INDEX)     \
-		(p_dpp_dtb_mgr[(DEV_ID)]->queue_info[(QUEUE_ID)].tab_up.user_addr[(INDEX)].phy_addr)
+#define ZXDH_DTB_TAB_UP_USER_PHY_ADDR_GET(DEV_ID, QUEUE_ID, INDEX)         \
+		(p_dpp_dtb_mgr[(ZXDH_DEV_SLOT_ID(DEV_ID))]->                       \
+		queue_info[(QUEUE_ID)].tab_up.user_addr[(INDEX)].phy_addr)
 
-#define ZXDH_DTB_TAB_UP_DATA_LEN_GET(DEV_ID, QUEUE_ID, INDEX)       \
-		(p_dpp_dtb_mgr[(DEV_ID)]->queue_info[(QUEUE_ID)].tab_up.data_len[(INDEX)])
+#define ZXDH_DTB_TAB_UP_DATA_LEN_GET(DEV_ID, QUEUE_ID, INDEX)              \
+		(p_dpp_dtb_mgr[(ZXDH_DEV_SLOT_ID(DEV_ID))]->                       \
+		queue_info[(QUEUE_ID)].tab_up.data_len[(INDEX)])
 
-#define ZXDH_DTB_TAB_UP_VIR_ADDR_GET(DEV_ID, QUEUE_ID, INDEX)     \
-		(p_dpp_dtb_mgr[(DEV_ID)]->queue_info[(QUEUE_ID)].tab_up.start_vir_addr + \
-		(INDEX) * p_dpp_dtb_mgr[(DEV_ID)]->queue_info[(QUEUE_ID)].tab_up.item_size)
+#define ZXDH_DTB_TAB_UP_VIR_ADDR_GET(DEV_ID, QUEUE_ID, INDEX)   \
+		(p_dpp_dtb_mgr[(ZXDH_DEV_SLOT_ID(DEV_ID))]->            \
+		queue_info[(QUEUE_ID)].tab_up.start_vir_addr +          \
+		(INDEX) * p_dpp_dtb_mgr[(ZXDH_DEV_SLOT_ID(DEV_ID))]->   \
+		queue_info[(QUEUE_ID)].tab_up.item_size)
 
-#define ZXDH_DTB_TAB_DOWN_VIR_ADDR_GET(DEV_ID, QUEUE_ID, INDEX)   \
-		(p_dpp_dtb_mgr[DEV_ID]->queue_info[QUEUE_ID].tab_down.start_vir_addr + \
-		INDEX * p_dpp_dtb_mgr[DEV_ID]->queue_info[QUEUE_ID].tab_down.item_size)
+#define ZXDH_DTB_TAB_DOWN_VIR_ADDR_GET(DEV_ID, QUEUE_ID, INDEX) \
+		(p_dpp_dtb_mgr[ZXDH_DEV_SLOT_ID(DEV_ID)]->              \
+		queue_info[QUEUE_ID].tab_down.start_vir_addr +          \
+		(INDEX) * p_dpp_dtb_mgr[ZXDH_DEV_SLOT_ID(DEV_ID)]->     \
+		queue_info[QUEUE_ID].tab_down.item_size)
 
-#define ZXDH_DTB_TAB_DOWN_WR_INDEX_GET(DEV_ID, QUEUE_ID)       \
-		(p_dpp_dtb_mgr[(DEV_ID)]->queue_info[(QUEUE_ID)].tab_down.wr_index)
+#define ZXDH_DTB_TAB_DOWN_WR_INDEX_GET(DEV_ID, QUEUE_ID)        \
+		(p_dpp_dtb_mgr[(ZXDH_DEV_SLOT_ID(DEV_ID))]->            \
+		queue_info[(QUEUE_ID)].tab_down.wr_index)
 
-#define ZXDH_DTB_QUEUE_INIT_FLAG_GET(DEV_ID, QUEUE_ID)       \
-		(p_dpp_dtb_mgr[(DEV_ID)]->queue_info[(QUEUE_ID)].init_flag)
+#define ZXDH_DTB_QUEUE_INIT_FLAG_GET(DEV_ID, QUEUE_ID)          \
+		(p_dpp_dtb_mgr[(ZXDH_DEV_SLOT_ID(DEV_ID))]->            \
+		queue_info[(QUEUE_ID)].init_flag)
 
-#define ZXDH_DTB_TAB_UP_USER_VIR_ADDR_GET(DEV_ID, QUEUE_ID, INDEX)     \
-		(p_dpp_dtb_mgr[DEV_ID]->queue_info[QUEUE_ID].tab_up.user_addr[INDEX].vir_addr)
+#define ZXDH_DTB_TAB_UP_USER_VIR_ADDR_GET(DEV_ID, QUEUE_ID, INDEX)          \
+		(p_dpp_dtb_mgr[ZXDH_DEV_SLOT_ID(DEV_ID)]->                          \
+		queue_info[QUEUE_ID].tab_up.user_addr[INDEX].vir_addr)
 
-#define ZXDH_DTB_TAB_UP_USER_ADDR_FLAG_SET(DEV_ID, QUEUE_ID, INDEX, VAL)     \
-		(p_dpp_dtb_mgr[DEV_ID]->queue_info[QUEUE_ID].tab_up.user_addr[INDEX].user_flag = \
-		VAL)
+#define ZXDH_DTB_TAB_UP_USER_ADDR_FLAG_SET(DEV_ID, QUEUE_ID, INDEX, VAL)    \
+		(p_dpp_dtb_mgr[ZXDH_DEV_SLOT_ID(DEV_ID)]->                          \
+		queue_info[QUEUE_ID].tab_up.user_addr[INDEX].user_flag = VAL)
 
 static inline uint64_t
 zxdh_np_dtb_tab_down_phy_addr_get(uint32_t DEV_ID, uint32_t QUEUE_ID,
 	uint32_t INDEX)
 {
-	return p_dpp_dtb_mgr[DEV_ID]->queue_info[QUEUE_ID].tab_down.start_phy_addr +
-		INDEX * p_dpp_dtb_mgr[DEV_ID]->queue_info[QUEUE_ID].tab_down.item_size;
+	return p_dpp_dtb_mgr[ZXDH_DEV_SLOT_ID(DEV_ID)]->queue_info[QUEUE_ID].tab_down.start_phy_addr
+	+ INDEX * p_dpp_dtb_mgr[ZXDH_DEV_SLOT_ID(DEV_ID)]->queue_info[QUEUE_ID].tab_down.item_size;
 }
 
 #define ZXDH_DTB_TAB_DOWN_PHY_ADDR_GET(DEV_ID, QUEUE_ID, INDEX)   \
@@ -432,8 +442,8 @@ static inline uint64_t
 zxdh_np_dtb_tab_up_phy_addr_get(uint32_t DEV_ID, uint32_t QUEUE_ID,
 	uint32_t INDEX)
 {
-	return p_dpp_dtb_mgr[DEV_ID]->queue_info[QUEUE_ID].tab_up.start_phy_addr +
-		INDEX * p_dpp_dtb_mgr[DEV_ID]->queue_info[QUEUE_ID].tab_up.item_size;
+	return p_dpp_dtb_mgr[ZXDH_DEV_SLOT_ID(DEV_ID)]->queue_info[QUEUE_ID].tab_up.start_phy_addr
+	+ INDEX * p_dpp_dtb_mgr[ZXDH_DEV_SLOT_ID(DEV_ID)]->queue_info[QUEUE_ID].tab_up.item_size;
 }
 
 #define ZXDH_DTB_TAB_UP_PHY_ADDR_GET(DEV_ID, QUEUE_ID, INDEX)	 \
@@ -517,7 +527,8 @@ zxdh_np_get_tn_color(ZXDH_RB_TN *p_tn)
 
 #define ZXDH_ACL_KEYSIZE_GET(key_mode) (2 * ZXDH_ETCAM_ENTRY_SIZE_GET(key_mode))
 
-#define GET_HASH_TBL_ID_INFO(dev_id, fun_id, tbl_id) (&g_tbl_id_info[dev_id][fun_id][tbl_id])
+#define GET_HASH_TBL_ID_INFO(dev_id, fun_id, tbl_id) \
+	(&g_tbl_id_info[ZXDH_DEV_SLOT_ID(dev_id)][fun_id][tbl_id])
 
 #define ZXDH_GET_HASH_TBL_ID(p_key)    ((p_key)[0] & 0x1F)
 
@@ -1830,25 +1841,34 @@ static void
 zxdh_np_dev_vport_get(uint32_t dev_id, uint32_t *vport)
 {
 	ZXDH_DEV_MGR_T *p_dev_mgr = &g_dev_mgr;
-	ZXDH_DEV_CFG_T *p_dev_info = p_dev_mgr->p_dev_array[dev_id];
+	ZXDH_DEV_CFG_T *p_dev_info = p_dev_mgr->p_dev_array[ZXDH_DEV_SLOT_ID(dev_id)];
 
-	*vport = p_dev_info->vport;
+	*vport = p_dev_info->vport[ZXDH_DEV_PF_INDEX(dev_id)];
 }
 
 static void
 zxdh_np_dev_agent_addr_get(uint32_t dev_id, uint64_t *agent_addr)
 {
 	ZXDH_DEV_MGR_T *p_dev_mgr = &g_dev_mgr;
-	ZXDH_DEV_CFG_T *p_dev_info = p_dev_mgr->p_dev_array[dev_id];
+	ZXDH_DEV_CFG_T *p_dev_info = p_dev_mgr->p_dev_array[ZXDH_DEV_SLOT_ID(dev_id)];
 
-	*agent_addr = p_dev_info->agent_addr;
+	*agent_addr = p_dev_info->agent_addr[ZXDH_DEV_PF_INDEX(dev_id)];
+}
+
+static void
+zxdh_np_dev_bar_pcie_id_get(uint32_t dev_id, uint16_t *p_pcie_id)
+{
+	ZXDH_DEV_MGR_T *p_dev_mgr = &g_dev_mgr;
+	ZXDH_DEV_CFG_T *p_dev_info = p_dev_mgr->p_dev_array[ZXDH_DEV_SLOT_ID(dev_id)];
+
+	*p_pcie_id = p_dev_info->pcie_id[ZXDH_DEV_PF_INDEX(dev_id)];
 }
 
 static void
 zxdh_np_dev_fw_bar_msg_num_set(uint32_t dev_id, uint32_t bar_msg_num)
 {
 	ZXDH_DEV_MGR_T *p_dev_mgr = &g_dev_mgr;
-	ZXDH_DEV_CFG_T *p_dev_info = p_dev_mgr->p_dev_array[dev_id];
+	ZXDH_DEV_CFG_T *p_dev_info = p_dev_mgr->p_dev_array[ZXDH_DEV_SLOT_ID(dev_id)];
 
 	p_dev_info->fw_bar_msg_num = bar_msg_num;
 
@@ -1859,7 +1879,7 @@ static void
 zxdh_np_dev_fw_bar_msg_num_get(uint32_t dev_id, uint32_t *bar_msg_num)
 {
 	ZXDH_DEV_MGR_T *p_dev_mgr = &g_dev_mgr;
-	ZXDH_DEV_CFG_T *p_dev_info = p_dev_mgr->p_dev_array[dev_id];
+	ZXDH_DEV_CFG_T *p_dev_info = p_dev_mgr->p_dev_array[ZXDH_DEV_SLOT_ID(dev_id)];
 
 	*bar_msg_num = p_dev_info->fw_bar_msg_num;
 }
@@ -1868,7 +1888,7 @@ static uint32_t
 zxdh_np_dev_opr_spinlock_get(uint32_t dev_id, uint32_t type, ZXDH_SPINLOCK_T **p_spinlock_out)
 {
 	ZXDH_DEV_MGR_T *p_dev_mgr = &g_dev_mgr;
-	ZXDH_DEV_CFG_T *p_dev_info = p_dev_mgr->p_dev_array[dev_id];
+	ZXDH_DEV_CFG_T *p_dev_info = p_dev_mgr->p_dev_array[ZXDH_DEV_SLOT_ID(dev_id)];
 
 	if (p_dev_info == NULL) {
 		PMD_DRV_LOG(ERR, "Get dev_info[ %u ] fail!", dev_id);
@@ -1895,7 +1915,7 @@ zxdh_np_dev_dtb_opr_spinlock_get(uint32_t dev_id, uint32_t type,
 			uint32_t index, ZXDH_SPINLOCK_T **p_spinlock_out)
 {
 	ZXDH_DEV_MGR_T *p_dev_mgr = &g_dev_mgr;
-	ZXDH_DEV_CFG_T *p_dev_info = p_dev_mgr->p_dev_array[dev_id];
+	ZXDH_DEV_CFG_T *p_dev_info = p_dev_mgr->p_dev_array[ZXDH_DEV_SLOT_ID(dev_id)];
 
 	switch (type) {
 	case ZXDH_DEV_SPINLOCK_T_DTB:
@@ -1914,7 +1934,7 @@ zxdh_np_dev_hash_opr_spinlock_get(uint32_t dev_id,
 	uint32_t fun_id, ZXDH_SPINLOCK_T **p_spinlock_out)
 {
 	ZXDH_DEV_MGR_T *p_dev_mgr = &g_dev_mgr;
-	ZXDH_DEV_CFG_T *p_dev_info = p_dev_mgr->p_dev_array[dev_id];
+	ZXDH_DEV_CFG_T *p_dev_info = p_dev_mgr->p_dev_array[ZXDH_DEV_SLOT_ID(dev_id)];
 
 	*p_spinlock_out = &p_dev_info->hash_spinlock[fun_id];
 }
@@ -2000,12 +2020,12 @@ zxdh_np_dev_get_pcie_addr(uint32_t dev_id)
 	ZXDH_DEV_CFG_T *p_dev_info = NULL;
 
 	p_dev_mgr = &g_dev_mgr;
-	p_dev_info = p_dev_mgr->p_dev_array[dev_id];
+	p_dev_info = p_dev_mgr->p_dev_array[ZXDH_DEV_SLOT_ID(dev_id)];
 
 	if (p_dev_info == NULL)
 		return ZXDH_DEV_TYPE_INVALID;
 
-	return p_dev_info->pcie_addr;
+	return p_dev_info->pcie_addr[ZXDH_DEV_PF_INDEX(dev_id)];
 }
 
 static void
@@ -2322,10 +2342,10 @@ zxdh_np_dev_add(uint32_t  dev_id, ZXDH_DEV_TYPE_E dev_type,
 		return ZXDH_RC_DEV_MGR_NOT_INIT;
 	}
 
-	if (p_dev_mgr->p_dev_array[dev_id] != NULL) {
+	if (p_dev_mgr->p_dev_array[ZXDH_DEV_SLOT_ID(dev_id)] != NULL) {
 		/* device is already exist. */
 		PMD_DRV_LOG(ERR, "Device is added again");
-		p_dev_info = p_dev_mgr->p_dev_array[dev_id];
+		p_dev_info = p_dev_mgr->p_dev_array[ZXDH_DEV_SLOT_ID(dev_id)];
 	} else {
 		/* device is new. */
 		p_dev_info = rte_malloc(NULL, sizeof(ZXDH_DEV_CFG_T), 0);
@@ -2333,14 +2353,15 @@ zxdh_np_dev_add(uint32_t  dev_id, ZXDH_DEV_TYPE_E dev_type,
 			PMD_DRV_LOG(ERR, "malloc memory failed");
 			return ZXDH_PAR_CHK_POINT_NULL;
 		}
-		p_dev_mgr->p_dev_array[dev_id] = p_dev_info;
+		p_dev_mgr->p_dev_array[ZXDH_DEV_SLOT_ID(dev_id)] = p_dev_info;
 		p_dev_mgr->device_num++;
 	}
 
-	p_dev_info->device_id   = dev_id;
+	p_dev_info->slot_id   = ZXDH_DEV_SLOT_ID(dev_id);
 	p_dev_info->dev_type    = dev_type;
 	p_dev_info->access_type = access_type;
-	p_dev_info->pcie_addr   = pcie_addr;
+	p_dev_info->pcie_addr[ZXDH_DEV_PF_INDEX(dev_id)] = pcie_addr;
+	p_dev_info->pcie_id[ZXDH_DEV_PF_INDEX(dev_id)] = ZXDH_DEV_PCIE_ID(dev_id);
 	p_dev_info->riscv_addr   = riscv_addr;
 	p_dev_info->dma_vir_addr = dma_vir_addr;
 	p_dev_info->dma_phy_addr = dma_phy_addr;
@@ -2368,7 +2389,7 @@ zxdh_np_dev_agent_status_set(uint32_t dev_id, uint32_t agent_flag)
 	ZXDH_DEV_CFG_T *p_dev_info = NULL;
 
 	p_dev_mgr = &g_dev_mgr;
-	p_dev_info = p_dev_mgr->p_dev_array[dev_id];
+	p_dev_info = p_dev_mgr->p_dev_array[ZXDH_DEV_SLOT_ID(dev_id)];
 
 	if (p_dev_info == NULL)
 		return ZXDH_DEV_TYPE_INVALID;
@@ -2490,9 +2511,9 @@ zxdh_np_soft_sdt_tbl_set(uint32_t dev_id,
 						uint32_t table_type,
 						ZXDH_SDT_TBL_DATA_T *p_sdt_info)
 {
-	g_table_type[dev_id][sdt_no] = table_type;
-	g_sdt_info[dev_id][sdt_no].data_high32 = p_sdt_info->data_high32;
-	g_sdt_info[dev_id][sdt_no].data_low32  = p_sdt_info->data_low32;
+	g_table_type[ZXDH_DEV_SLOT_ID(dev_id)][sdt_no] = table_type;
+	g_sdt_info[ZXDH_DEV_SLOT_ID(dev_id)][sdt_no].data_high32 = p_sdt_info->data_high32;
+	g_sdt_info[ZXDH_DEV_SLOT_ID(dev_id)][sdt_no].data_low32  = p_sdt_info->data_low32;
 }
 
 static uint32_t
@@ -2666,12 +2687,13 @@ zxdh_np_ppu_parse_cls_bitmap(uint32_t dev_id,
 
 	for (cls_id = 0; cls_id < ZXDH_PPU_CLUSTER_NUM; cls_id++) {
 		cls_use = (bitmap >> cls_id) & 0x1;
-		g_ppu_cls_bit_map[dev_id].cls_use[cls_id] = cls_use;
+		g_ppu_cls_bit_map[ZXDH_DEV_SLOT_ID(dev_id)].cls_use[cls_id] = cls_use;
 	}
 
 	for (mem_id = 0; mem_id < ZXDH_PPU_INSTR_MEM_NUM; mem_id++) {
 		instr_mem = (bitmap >> (mem_id * 2)) & 0x3;
-		g_ppu_cls_bit_map[dev_id].instr_mem[mem_id] = ((instr_mem > 0) ? 1 : 0);
+		g_ppu_cls_bit_map[ZXDH_DEV_SLOT_ID(dev_id)].instr_mem[mem_id] =
+		((instr_mem > 0) ? 1 : 0);
 	}
 }
 
@@ -2731,6 +2753,7 @@ zxdh_np_agent_channel_sync_send(uint32_t dev_id,
 	uint8_t *reply_ptr = NULL;
 	uint16_t reply_msg_len = 0;
 	uint64_t agent_addr = 0;
+	uint16_t bar_pcie_id = 0;
 
 	ret = zxdh_np_agent_bar_msg_check(dev_id, p_msg);
 	if (ret != ZXDH_OK) {
@@ -2740,6 +2763,7 @@ zxdh_np_agent_channel_sync_send(uint32_t dev_id,
 
 	zxdh_np_dev_vport_get(dev_id, &vport);
 	zxdh_np_dev_agent_addr_get(dev_id, &agent_addr);
+	zxdh_np_dev_bar_pcie_id_get(dev_id, &bar_pcie_id);
 
 	if (ZXDH_IS_PF(vport))
 		in.src = ZXDH_MSG_CHAN_END_PF;
@@ -2751,6 +2775,7 @@ zxdh_np_agent_channel_sync_send(uint32_t dev_id,
 	in.payload_len = p_msg->msg_len;
 	in.dst = ZXDH_MSG_CHAN_END_RISC;
 	in.module_id = ZXDH_BAR_MDOULE_NPSDK;
+	in.src_pcieid = bar_pcie_id;
 
 	recv_buffer = rte_zmalloc(NULL, rep_len + ZXDH_CHANNEL_REPS_LEN, 0);
 	if (recv_buffer == NULL) {
@@ -3124,23 +3149,23 @@ zxdh_np_agent_channel_acl_index_release(uint32_t dev_id, uint32_t rel_type,
 static ZXDH_DTB_MGR_T *
 zxdh_np_dtb_mgr_get(uint32_t dev_id)
 {
-	if (dev_id >= ZXDH_DEV_CHANNEL_MAX)
+	if (ZXDH_DEV_SLOT_ID(dev_id) >= ZXDH_DEV_CHANNEL_MAX)
 		return NULL;
 	else
-		return p_dpp_dtb_mgr[dev_id];
+		return p_dpp_dtb_mgr[ZXDH_DEV_SLOT_ID(dev_id)];
 }
 
 static uint32_t
 zxdh_np_dtb_mgr_create(uint32_t dev_id)
 {
-	if (p_dpp_dtb_mgr[dev_id] != NULL) {
+	if (p_dpp_dtb_mgr[ZXDH_DEV_SLOT_ID(dev_id)] != NULL) {
 		PMD_DRV_LOG(ERR, "ErrorCode[0x%x]: Dma Manager"
 			" is exist!!!", ZXDH_RC_DTB_MGR_EXIST);
 		return ZXDH_RC_DTB_MGR_EXIST;
 	}
 
-	p_dpp_dtb_mgr[dev_id] = rte_zmalloc(NULL, sizeof(ZXDH_DTB_MGR_T), 0);
-	if (p_dpp_dtb_mgr[dev_id] == NULL) {
+	p_dpp_dtb_mgr[ZXDH_DEV_SLOT_ID(dev_id)] = rte_zmalloc(NULL, sizeof(ZXDH_DTB_MGR_T), 0);
+	if (p_dpp_dtb_mgr[ZXDH_DEV_SLOT_ID(dev_id)] == NULL) {
 		PMD_DRV_LOG(ERR, "malloc memory failed");
 		return ZXDH_PAR_CHK_POINT_NULL;
 	}
@@ -3153,7 +3178,7 @@ zxdh_np_dtb_soft_init(uint32_t dev_id)
 {
 	ZXDH_DTB_MGR_T *p_dtb_mgr = NULL;
 
-	if (dev_id >= ZXDH_DEV_CHANNEL_MAX)
+	if (ZXDH_DEV_SLOT_ID(dev_id) >= ZXDH_DEV_CHANNEL_MAX)
 		return 1;
 
 	p_dtb_mgr = zxdh_np_dtb_mgr_get(dev_id);
@@ -3220,8 +3245,8 @@ zxdh_np_dev_vport_set(uint32_t dev_id, uint32_t vport)
 	ZXDH_DEV_CFG_T *p_dev_info = NULL;
 
 	p_dev_mgr =  &g_dev_mgr;
-	p_dev_info = p_dev_mgr->p_dev_array[dev_id];
-	p_dev_info->vport = vport;
+	p_dev_info = p_dev_mgr->p_dev_array[ZXDH_DEV_SLOT_ID(dev_id)];
+	p_dev_info->vport[ZXDH_DEV_PF_INDEX(dev_id)] = vport;
 }
 
 static void
@@ -3231,8 +3256,8 @@ zxdh_np_dev_agent_addr_set(uint32_t dev_id, uint64_t agent_addr)
 	ZXDH_DEV_CFG_T *p_dev_info = NULL;
 
 	p_dev_mgr =  &g_dev_mgr;
-	p_dev_info = p_dev_mgr->p_dev_array[dev_id];
-	p_dev_info->agent_addr = agent_addr;
+	p_dev_info = p_dev_mgr->p_dev_array[ZXDH_DEV_SLOT_ID(dev_id)];
+	p_dev_info->agent_addr[ZXDH_DEV_PF_INDEX(dev_id)] = agent_addr;
 }
 
 static uint64_t
@@ -3259,13 +3284,13 @@ zxdh_np_pf_fw_compatible_addr_set(uint32_t dev_id, uint64_t pcie_vir_baddr)
 
 	compatible_addr = zxdh_np_fw_compatible_addr_calc(pcie_vir_baddr, compatible_offset);
 
-	g_np_fw_compat_addr[dev_id] = compatible_addr;
+	g_np_fw_compat_addr[ZXDH_DEV_SLOT_ID(dev_id)] = compatible_addr;
 }
 
 static void
 zxdh_np_fw_compatible_addr_get(uint32_t dev_id, uint64_t *p_compatible_addr)
 {
-	*p_compatible_addr = g_np_fw_compat_addr[dev_id];
+	*p_compatible_addr = g_np_fw_compat_addr[ZXDH_DEV_SLOT_ID(dev_id)];
 }
 
 static void
@@ -3684,7 +3709,7 @@ zxdh_np_dtb_queue_id_free(uint32_t dev_id,
 	ZXDH_DTB_MGR_T *p_dtb_mgr = NULL;
 	uint32_t rc;
 
-	p_dtb_mgr = p_dpp_dtb_mgr[dev_id];
+	p_dtb_mgr = p_dpp_dtb_mgr[ZXDH_DEV_SLOT_ID(dev_id)];
 	if (p_dtb_mgr == NULL)
 		return 1;
 
@@ -3706,13 +3731,13 @@ zxdh_np_dtb_queue_id_free(uint32_t dev_id,
 static ZXDH_RB_CFG *
 zxdh_np_dtb_dump_addr_rb_get(uint32_t dev_id, uint32_t queue_id)
 {
-	return g_dtb_dump_addr_rb[dev_id][queue_id];
+	return g_dtb_dump_addr_rb[ZXDH_DEV_SLOT_ID(dev_id)][queue_id];
 }
 
 static uint32_t
 zxdh_np_dtb_dump_addr_rb_set(uint32_t dev_id, uint32_t queue_id, ZXDH_RB_CFG *p_dump_addr_rb)
 {
-	g_dtb_dump_addr_rb[dev_id][queue_id] = p_dump_addr_rb;
+	g_dtb_dump_addr_rb[ZXDH_DEV_SLOT_ID(dev_id)][queue_id] = p_dump_addr_rb;
 	return ZXDH_OK;
 }
 
@@ -3880,9 +3905,9 @@ zxdh_np_dtb_queue_release(uint32_t devid,
 static void
 zxdh_np_dtb_mgr_destroy(uint32_t dev_id)
 {
-	if (p_dpp_dtb_mgr[dev_id] != NULL) {
-		rte_free(p_dpp_dtb_mgr[dev_id]);
-		p_dpp_dtb_mgr[dev_id] = NULL;
+	if (p_dpp_dtb_mgr[ZXDH_DEV_SLOT_ID(dev_id)] != NULL) {
+		rte_free(p_dpp_dtb_mgr[ZXDH_DEV_SLOT_ID(dev_id)]);
+		p_dpp_dtb_mgr[ZXDH_DEV_SLOT_ID(dev_id)] = NULL;
 	}
 }
 
@@ -3909,11 +3934,11 @@ zxdh_np_dev_del(uint32_t dev_id)
 	ZXDH_DEV_MGR_T *p_dev_mgr  = NULL;
 
 	p_dev_mgr = &g_dev_mgr;
-	p_dev_info = p_dev_mgr->p_dev_array[dev_id];
+	p_dev_info = p_dev_mgr->p_dev_array[ZXDH_DEV_SLOT_ID(dev_id)];
 
 	if (p_dev_info != NULL) {
 		rte_free(p_dev_info);
-		p_dev_mgr->p_dev_array[dev_id] = NULL;
+		p_dev_mgr->p_dev_array[ZXDH_DEV_SLOT_ID(dev_id)] = NULL;
 		p_dev_mgr->device_num--;
 	}
 }
@@ -4057,7 +4082,7 @@ zxdh_np_one_hash_soft_uninstall(uint32_t dev_id, uint32_t hash_id)
 	uint32_t i = 0;
 
 	ZXDH_D_NODE *p_node = NULL;
-	ZXDH_SE_CFG *p_se_cfg = dpp_se_cfg[dev_id];
+	ZXDH_SE_CFG *p_se_cfg = dpp_se_cfg[ZXDH_DEV_SLOT_ID(dev_id)];
 	ZXDH_RB_TN *p_rb_tn = NULL;
 	ZXDH_RB_TN *p_rb_tn_rtn = NULL;
 	HASH_DDR_CFG *p_rbkey = NULL;
@@ -4111,7 +4136,7 @@ zxdh_np_one_hash_soft_uninstall(uint32_t dev_id, uint32_t hash_id)
 	rc = zxdh_np_se_fun_deinit(p_se_cfg, (hash_id & 0xff), ZXDH_FUN_HASH);
 	ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_se_fun_deinit");
 
-	memset(g_tbl_id_info[dev_id][hash_id], 0,
+	memset(g_tbl_id_info[ZXDH_DEV_SLOT_ID(dev_id)][hash_id], 0,
 		ZXDH_HASH_TBL_ID_NUM * sizeof(ZXDH_HASH_TBL_ID_INFO));
 
 	return rc;
@@ -4134,13 +4159,13 @@ zxdh_np_hash_soft_uninstall(uint32_t dev_id)
 static uint32_t
 zxdh_np_acl_cfg_get(uint32_t dev_id, ZXDH_ACL_CFG_EX_T **p_acl_cfg)
 {
-	if (g_p_acl_ex_cfg[dev_id] == NULL) {
+	if (g_p_acl_ex_cfg[ZXDH_DEV_SLOT_ID(dev_id)] == NULL) {
 		PMD_DRV_LOG(ERR, "etcam_is not init!");
 		RTE_ASSERT(0);
 		return ZXDH_ACL_RC_ETCAMID_NOT_INIT;
 	}
 
-	*p_acl_cfg = g_p_acl_ex_cfg[dev_id];
+	*p_acl_cfg = g_p_acl_ex_cfg[ZXDH_DEV_SLOT_ID(dev_id)];
 
 	return ZXDH_OK;
 }
@@ -4190,6 +4215,16 @@ zxdh_np_acl_res_destroy(uint32_t dev_id)
 	return ZXDH_OK;
 }
 
+static void
+zxdh_np_apt_hash_global_res_uninit(uint32_t dev_id)
+{
+	if (g_apt_se_cfg[ZXDH_DEV_SLOT_ID(dev_id)] != NULL) {
+		rte_free(g_apt_se_cfg[ZXDH_DEV_SLOT_ID(dev_id)]);
+		g_apt_se_cfg[ZXDH_DEV_SLOT_ID(dev_id)] = NULL;
+		dpp_se_cfg[ZXDH_DEV_SLOT_ID(dev_id)] = NULL;
+	}
+}
+
 int
 zxdh_np_online_uninit(uint32_t dev_id,
 			char *port_name,
@@ -4201,22 +4236,35 @@ zxdh_np_online_uninit(uint32_t dev_id,
 	if (rc != 0)
 		PMD_DRV_LOG(ERR, "dtb release port name %s queue id %u", port_name, queue_id);
 
+	rc = zxdh_np_soft_res_uninstall(dev_id);
+	if (rc != 0)
+		PMD_DRV_LOG(ERR, "zxdh_np_soft_res_uninstall failed");
+
+	return 0;
+}
+
+uint32_t
+zxdh_np_soft_res_uninstall(uint32_t dev_id)
+{
+	uint32_t rc;
+
 	rc = zxdh_np_hash_soft_uninstall(dev_id);
 	if (rc != ZXDH_OK)
 		PMD_DRV_LOG(ERR, "zxdh_np_hash_soft_uninstall error! ");
 
+	zxdh_np_apt_hash_global_res_uninit(dev_id);
 	zxdh_np_acl_res_destroy(dev_id);
 	zxdh_np_dtb_mgr_destroy(dev_id);
 	zxdh_np_sdt_mgr_destroy(dev_id);
 	zxdh_np_dev_del(dev_id);
 
-	return 0;
+	return rc;
 }
 
 static uint32_t
 zxdh_np_sdt_tbl_type_get(uint32_t dev_id, uint32_t sdt_no)
 {
-	return g_table_type[dev_id][sdt_no];
+	return g_table_type[ZXDH_DEV_SLOT_ID(dev_id)][sdt_no];
 }
 
 
@@ -4697,8 +4745,8 @@ zxdh_np_eram_dtb_len_get(uint32_t mode)
 static void
 zxdh_np_sdt_tbl_data_get(uint32_t dev_id, uint32_t sdt_no, ZXDH_SDT_TBL_DATA_T *p_sdt_data)
 {
-	p_sdt_data->data_high32 = g_sdt_info[dev_id][sdt_no].data_high32;
-	p_sdt_data->data_low32  = g_sdt_info[dev_id][sdt_no].data_low32;
+	p_sdt_data->data_high32 = g_sdt_info[ZXDH_DEV_SLOT_ID(dev_id)][sdt_no].data_high32;
+	p_sdt_data->data_low32  = g_sdt_info[ZXDH_DEV_SLOT_ID(dev_id)][sdt_no].data_low32;
 }
 
 static uint32_t
@@ -5196,8 +5244,10 @@ zxdh_np_dtb_tab_down_info_set(uint32_t dev_id,
 	item_info.cmd_type = 0;
 	item_info.int_en = int_flag;
 	item_info.data_len = data_len / 4;
-	phy_addr = p_dpp_dtb_mgr[dev_id]->queue_info[queue_id].tab_down.start_phy_addr +
-		item_index * p_dpp_dtb_mgr[dev_id]->queue_info[queue_id].tab_down.item_size;
+	phy_addr = p_dpp_dtb_mgr[ZXDH_DEV_SLOT_ID(dev_id)]->queue_info[queue_id].
+		tab_down.start_phy_addr +
+		item_index * p_dpp_dtb_mgr[ZXDH_DEV_SLOT_ID(dev_id)]->queue_info[queue_id].
+		tab_down.item_size;
 	item_info.data_hddr = ((phy_addr >> 4) >> 32) & 0xffffffff;
 	item_info.data_laddr = (phy_addr >> 4) & 0xffffffff;
 
@@ -5368,7 +5418,7 @@ zxdh_np_hash_get_hash_info_from_sdt(uint32_t dev_id,
 	p_hash_entry_cfg->rst_by_size = ZXDH_GET_RST_SIZE(p_hash_entry_cfg->key_type,
 		p_hash_entry_cfg->actu_key_size);
 
-	p_se_cfg = dpp_se_cfg[dev_id];
+	p_se_cfg = dpp_se_cfg[ZXDH_DEV_SLOT_ID(dev_id)];
 	p_hash_entry_cfg->p_se_cfg = p_se_cfg;
 
 	p_func_info = ZXDH_GET_FUN_INFO(p_se_cfg, p_hash_entry_cfg->fun_id);
@@ -6048,7 +6098,7 @@ zxdh_np_apt_get_sdt_partner(uint32_t dev_id, uint32_t sdt_no)
 {
 	SE_APT_CALLBACK_T *p_apt_callback = NULL;
 
-	p_apt_callback = &g_apt_se_callback[dev_id][sdt_no];
+	p_apt_callback = &g_apt_se_callback[ZXDH_DEV_SLOT_ID(dev_id)][sdt_no];
 
 	if (p_apt_callback->table_type == ZXDH_SDT_TBLT_HASH)
 		return  p_apt_callback->se_func_info.hash_func.sdt_partner;
@@ -6639,10 +6689,10 @@ zxdh_np_stat_cfg_soft_get(uint32_t dev_id,
 {
 	ZXDH_COMM_CHECK_DEV_POINT(dev_id, p_stat_cfg);
 
-	p_stat_cfg->ddr_base_addr = g_ppu_stat_cfg[dev_id].ddr_base_addr;
-	p_stat_cfg->eram_baddr = g_ppu_stat_cfg[dev_id].eram_baddr;
-	p_stat_cfg->eram_depth = g_ppu_stat_cfg[dev_id].eram_depth;
-	p_stat_cfg->ppu_addr_offset = g_ppu_stat_cfg[dev_id].ppu_addr_offset;
+	p_stat_cfg->ddr_base_addr = g_ppu_stat_cfg[ZXDH_DEV_SLOT_ID(dev_id)].ddr_base_addr;
+	p_stat_cfg->eram_baddr = g_ppu_stat_cfg[ZXDH_DEV_SLOT_ID(dev_id)].eram_baddr;
+	p_stat_cfg->eram_depth = g_ppu_stat_cfg[ZXDH_DEV_SLOT_ID(dev_id)].eram_depth;
+	p_stat_cfg->ppu_addr_offset = g_ppu_stat_cfg[ZXDH_DEV_SLOT_ID(dev_id)].ppu_addr_offset;
 }
 
 static uint32_t
@@ -8809,7 +8859,7 @@ static void *
 zxdh_np_dev_get_se_res_ptr(uint32_t dev_id, uint32_t type)
 {
 	ZXDH_DEV_MGR_T *p_dev_mgr = &g_dev_mgr;
-	ZXDH_DEV_CFG_T *p_dev_info = p_dev_mgr->p_dev_array[dev_id];
+	ZXDH_DEV_CFG_T *p_dev_info = p_dev_mgr->p_dev_array[ZXDH_DEV_SLOT_ID(dev_id)];
 
 	if (type == ZXDH_SE_STD_NIC_RES_TYPE)
 		return (void *)&p_dev_info->dev_apt_se_tbl_res.std_nic_res;
@@ -8872,7 +8922,7 @@ zxdh_np_se_init_ex(uint32_t dev_id, ZXDH_SE_CFG *p_se_cfg)
 	ZXDH_SE_ZBLK_CFG *p_zblk_cfg = NULL;
 	ZXDH_SE_ZCELL_CFG *p_zcell_cfg = NULL;
 
-	if (dpp_se_cfg[dev_id] != NULL) {
+	if (dpp_se_cfg[ZXDH_DEV_SLOT_ID(dev_id)] != NULL) {
 		PMD_DRV_LOG(DEBUG, "SE global config is already initialized.");
 		return ZXDH_OK;
 	}
@@ -8880,7 +8930,7 @@ zxdh_np_se_init_ex(uint32_t dev_id, ZXDH_SE_CFG *p_se_cfg)
 	memset(p_se_cfg, 0, sizeof(ZXDH_SE_CFG));
 
 	p_se_cfg->dev_id = dev_id;
-	dpp_se_cfg[p_se_cfg->dev_id] = p_se_cfg;
+	dpp_se_cfg[ZXDH_DEV_SLOT_ID(p_se_cfg->dev_id)] = p_se_cfg;
 
 	p_se_cfg->p_as_rslt_wrt_fun = NULL;
 	p_se_cfg->p_client = ZXDH_COMM_VAL_TO_PTR(dev_id);
@@ -8913,16 +8963,16 @@ zxdh_np_se_init_ex(uint32_t dev_id, ZXDH_SE_CFG *p_se_cfg)
 static uint32_t
 zxdh_np_apt_hash_global_res_init(uint32_t dev_id)
 {
-	if (g_apt_se_cfg[dev_id] == NULL) {
-		g_apt_se_cfg[dev_id] = rte_zmalloc(NULL, sizeof(ZXDH_SE_CFG), 0);
-		if (g_apt_se_cfg[dev_id] == NULL) {
+	if (g_apt_se_cfg[ZXDH_DEV_SLOT_ID(dev_id)] == NULL) {
+		g_apt_se_cfg[ZXDH_DEV_SLOT_ID(dev_id)] = rte_zmalloc(NULL, sizeof(ZXDH_SE_CFG), 0);
+		if (g_apt_se_cfg[ZXDH_DEV_SLOT_ID(dev_id)] == NULL) {
 			PMD_DRV_LOG(ERR, "malloc memory failed");
 			return ZXDH_PAR_CHK_POINT_NULL;
 		}
 
-		zxdh_np_se_init_ex(dev_id, g_apt_se_cfg[dev_id]);
+		zxdh_np_se_init_ex(dev_id, g_apt_se_cfg[ZXDH_DEV_SLOT_ID(dev_id)]);
 
-		g_apt_se_cfg[dev_id]->p_client = ZXDH_COMM_VAL_TO_PTR(dev_id);
+		g_apt_se_cfg[ZXDH_DEV_SLOT_ID(dev_id)]->p_client = ZXDH_COMM_VAL_TO_PTR(dev_id);
 	}
 
 	return ZXDH_OK;
@@ -9204,7 +9254,7 @@ zxdh_np_hash_init(ZXDH_SE_CFG *p_se_cfg,
 	ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_comm_rb_init");
 
 	for (i = 0; i < zblk_num; i++)
-		g_hash_zblk_idx[dev_id][fun_id][i] = zblk_idx[i];
+		g_hash_zblk_idx[ZXDH_DEV_SLOT_ID(dev_id)][fun_id][i] = zblk_idx[i];
 
 	return rc;
 }
@@ -9219,7 +9269,7 @@ zxdh_np_apt_hash_func_res_init(uint32_t dev_id, uint32_t func_num,
 	ZXDH_APT_HASH_FUNC_RES_T *p_hash_func_res_temp = NULL;
 	ZXDH_SE_CFG *p_se_cfg = NULL;
 
-	p_se_cfg = g_apt_se_cfg[dev_id];
+	p_se_cfg = g_apt_se_cfg[ZXDH_DEV_SLOT_ID(dev_id)];
 
 	for (index = 0; index < func_num; index++) {
 		memset(zblk_idx, 0, sizeof(zblk_idx));
@@ -9474,7 +9524,7 @@ zxdh_np_apt_hash_bulk_res_init(uint32_t dev_id, uint32_t bulk_num,
 	ZXDH_HASH_DDR_RESC_CFG_T ddr_resc_cfg = {0};
 	ZXDH_SE_CFG *p_se_cfg = NULL;
 
-	p_se_cfg = g_apt_se_cfg[dev_id];
+	p_se_cfg = g_apt_se_cfg[ZXDH_DEV_SLOT_ID(dev_id)];
 
 	for (index = 0; index < bulk_num; index++) {
 		memset(&ddr_resc_cfg, 0, sizeof(ZXDH_HASH_DDR_RESC_CFG_T));
@@ -9504,7 +9554,7 @@ zxdh_np_apt_set_callback(uint32_t dev_id, uint32_t sdt_no, uint32_t table_type,
 {
 	SE_APT_CALLBACK_T *apt_func = NULL;
 
-	apt_func = &g_apt_se_callback[dev_id][sdt_no];
+	apt_func = &g_apt_se_callback[ZXDH_DEV_SLOT_ID(dev_id)][sdt_no];
 
 	apt_func->sdt_no = sdt_no;
 	apt_func->table_type = table_type;
@@ -9598,7 +9648,7 @@ zxdh_np_apt_hash_tbl_res_init(uint32_t dev_id, uint32_t tbl_num,
 	ZXDH_APT_HASH_TABLE_T *p_hash_tbl_temp = NULL;
 	ZXDH_SE_CFG *p_se_cfg = NULL;
 
-	p_se_cfg = g_apt_se_cfg[dev_id];
+	p_se_cfg = g_apt_se_cfg[ZXDH_DEV_SLOT_ID(dev_id)];
 
 	for (index = 0; index < tbl_num; index++) {
 		p_hash_tbl_temp = p_hash_tbl + index;
@@ -9688,7 +9738,7 @@ zxdh_np_acl_cfg_init_ex(ZXDH_ACL_CFG_EX_T *p_acl_cfg,
 	p_acl_cfg->dev_id = (uint32_t)(ZXDH_COMM_PTR_TO_VAL(p_acl_cfg->p_client) & 0xFFFFFFFF);
 	p_acl_cfg->flags = flags;
 
-	g_p_acl_ex_cfg[p_acl_cfg->dev_id] = p_acl_cfg;
+	g_p_acl_ex_cfg[ZXDH_DEV_SLOT_ID(p_acl_cfg->dev_id)] = p_acl_cfg;
 
 	if (flags & ZXDH_ACL_FLAG_ETCAM0_EN) {
 		p_acl_cfg->acl_etcamids.is_valid = 1;
@@ -9726,7 +9776,7 @@ zxdh_np_acl_tbl_init_ex(ZXDH_ACL_CFG_EX_T *p_acl_cfg,
 	uint32_t rc = 0;
 	uint32_t i = 0;
 
-	g_p_acl_ex_cfg[p_acl_cfg->dev_id] = p_acl_cfg;
+	g_p_acl_ex_cfg[ZXDH_DEV_SLOT_ID(p_acl_cfg->dev_id)] = p_acl_cfg;
 
 	if (p_acl_cfg->acl_tbls[table_id].is_used) {
 		PMD_DRV_LOG(ERR, "table_id[ %u ] is already used!", table_id);
@@ -9817,7 +9867,7 @@ zxdh_np_apt_acl_res_init(uint32_t dev_id, uint32_t tbl_num, ZXDH_APT_ACL_TABLE_T
 	uint8_t index = 0;
 	ZXDH_APT_ACL_TABLE_T *p_temp_acl_tbl = NULL;
 
-	rc = zxdh_np_acl_cfg_init_ex(&g_apt_acl_cfg[dev_id],
+	rc = zxdh_np_acl_cfg_init_ex(&g_apt_acl_cfg[ZXDH_DEV_SLOT_ID(dev_id)],
 						(void *)ZXDH_COMM_VAL_TO_PTR(dev_id),
 						ZXDH_ACL_FLAG_ETCAM0_EN,
 						NULL);
@@ -9832,7 +9882,7 @@ zxdh_np_apt_acl_res_init(uint32_t dev_id, uint32_t tbl_num, ZXDH_APT_ACL_TABLE_T
 						ZXDH_SDT_OPER_ADD);
 		ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_sdt_tbl_write");
 
-		 rc = zxdh_np_acl_tbl_init_ex(&g_apt_acl_cfg[dev_id],
+		 rc = zxdh_np_acl_tbl_init_ex(&g_apt_acl_cfg[ZXDH_DEV_SLOT_ID(dev_id)],
 					p_temp_acl_tbl->acl_sdt.etcam_table_id,
 					p_temp_acl_tbl->acl_sdt.as_en,
 					p_temp_acl_tbl->acl_res.entry_num,
@@ -9857,12 +9907,13 @@ zxdh_np_apt_acl_res_init(uint32_t dev_id, uint32_t tbl_num, ZXDH_APT_ACL_TABLE_T
 static void
 zxdh_np_apt_stat_res_init(uint32_t dev_id, uint32_t type, ZXDH_APT_STAT_RES_INIT_T *stat_res_init)
 {
-	g_ppu_stat_cfg[dev_id].eram_baddr = stat_res_init->eram_baddr;
-	g_ppu_stat_cfg[dev_id].eram_depth = stat_res_init->eram_depth;
+	g_ppu_stat_cfg[ZXDH_DEV_SLOT_ID(dev_id)].eram_baddr = stat_res_init->eram_baddr;
+	g_ppu_stat_cfg[ZXDH_DEV_SLOT_ID(dev_id)].eram_depth = stat_res_init->eram_depth;
 
 	if (type == ZXDH_SE_NON_STD_NIC_RES_TYPE) {
-		g_ppu_stat_cfg[dev_id].ddr_base_addr = stat_res_init->ddr_baddr;
-		g_ppu_stat_cfg[dev_id].ppu_addr_offset = stat_res_init->ppu_ddr_offset;
+		g_ppu_stat_cfg[ZXDH_DEV_SLOT_ID(dev_id)].ddr_base_addr = stat_res_init->ddr_baddr;
+		g_ppu_stat_cfg[ZXDH_DEV_SLOT_ID(dev_id)].ppu_addr_offset =
+			stat_res_init->ppu_ddr_offset;
 	}
 }
 
diff --git a/drivers/net/zxdh/zxdh_np.h b/drivers/net/zxdh/zxdh_np.h
index d2f9f68ca9..2e065b625f 100644
--- a/drivers/net/zxdh/zxdh_np.h
+++ b/drivers/net/zxdh/zxdh_np.h
@@ -15,9 +15,13 @@
 #define ZXDH_DISABLE                          (0)
 #define ZXDH_ENABLE                           (1)
 #define ZXDH_PORT_NAME_MAX                    (32)
-#define ZXDH_DEV_CHANNEL_MAX                  (2)
+#define ZXDH_DEV_CHANNEL_MAX                  (16)
 #define ZXDH_DEV_SDT_ID_MAX                   (256U)
-
+#define ZXDH_DEV_PF_NUM_MAX                   (8)
+#define ZXDH_DEV_SLOT_ID(DEVICE_ID)           ((DEVICE_ID) & (ZXDH_DEV_CHANNEL_MAX - 1))
+#define ZXDH_DEV_PCIE_ID(DEVICE_ID)           (((DEVICE_ID) >> 16) & 0xFFFF)
+#define ZXDH_DEV_VF_INDEX(DEVICE_ID)          (ZXDH_DEV_PCIE_ID(DEVICE_ID) & 0xFF)
+#define ZXDH_DEV_PF_INDEX(DEVICE_ID)          ((ZXDH_DEV_PCIE_ID(DEVICE_ID) >> 8) & 0x7)
 
 /*DTB*/
 #define ZXDH_DTB_QUEUE_ITEM_NUM_MAX           (32)
@@ -1130,18 +1134,19 @@ typedef struct zxdh_sys_init_ctrl_t {
 } ZXDH_SYS_INIT_CTRL_T;
 
 typedef struct dpp_dev_cfg_t {
-	uint32_t device_id;
+	uint32_t slot_id;
+	uint16_t pcie_id[ZXDH_DEV_PF_NUM_MAX];
 	ZXDH_DEV_TYPE_E dev_type;
 	uint32_t chip_ver;
 	uint32_t access_type;
 	uint32_t agent_flag;
-	uint32_t vport;
+	uint32_t vport[ZXDH_DEV_PF_NUM_MAX];
 	uint32_t fw_bar_msg_num;
-	uint64_t pcie_addr;
+	uint64_t pcie_addr[ZXDH_DEV_PF_NUM_MAX];
 	uint64_t riscv_addr;
 	uint64_t dma_vir_addr;
 	uint64_t dma_phy_addr;
-	uint64_t agent_addr;
+	uint64_t agent_addr[ZXDH_DEV_PF_NUM_MAX];
 	uint32_t init_flags[ZXDH_MODULE_INIT_MAX];
 	ZXDH_DEV_WRITE_FUNC p_pcie_write_fun;
 	ZXDH_DEV_READ_FUNC  p_pcie_read_fun;
@@ -1949,6 +1954,7 @@ int zxdh_np_dtb_stats_get(uint32_t dev_id,
 			ZXDH_STAT_CNT_MODE_E rd_mode,
 			uint32_t index,
 			uint32_t *p_data);
+uint32_t zxdh_np_soft_res_uninstall(uint32_t dev_id);
 uint32_t zxdh_np_stat_ppu_cnt_get_ex(uint32_t dev_id,
 			ZXDH_STAT_CNT_MODE_E rd_mode,
 			uint32_t index,
diff --git a/drivers/net/zxdh/zxdh_tables.c b/drivers/net/zxdh/zxdh_tables.c
index 2d2dd26499..233d53a7e8 100644
--- a/drivers/net/zxdh/zxdh_tables.c
+++ b/drivers/net/zxdh/zxdh_tables.c
@@ -37,7 +37,7 @@ zxdh_set_port_attr(struct zxdh_hw *hw, uint16_t vport, struct zxdh_port_attr_tab
 	ZXDH_DTB_ERAM_ENTRY_INFO_T entry = {vfid, (uint32_t *)port_attr};
 	ZXDH_DTB_USER_ENTRY_T user_entry_write = {ZXDH_SDT_VPORT_ATT_TABLE, (void *)&entry};
 
-	ret = zxdh_np_dtb_table_entry_write(hw->slot_id,
+	ret = zxdh_np_dtb_table_entry_write(hw->dev_id,
 				dtb_data->queueid, 1, &user_entry_write);
 	if (ret != 0)
 		PMD_DRV_LOG(ERR, "write vport_att failed vfid:%d failed", vfid);
@@ -105,7 +105,7 @@ zxdh_port_attr_uninit(struct rte_eth_dev *dev)
 			.sdt_no = ZXDH_SDT_VPORT_ATT_TABLE,
 			.p_entry_data = (void *)&port_attr_entry
 		};
-		ret = zxdh_np_dtb_table_entry_delete(hw->slot_id, dtb_data->queueid, 1, &entry);
+		ret = zxdh_np_dtb_table_entry_delete(hw->dev_id, dtb_data->queueid, 1, &entry);
 		if (ret) {
 			PMD_DRV_LOG(ERR, "delete port attr table failed");
 			ret = -1;
@@ -147,7 +147,7 @@ int zxdh_panel_table_init(struct rte_eth_dev *dev)
 		.sdt_no = ZXDH_SDT_PANEL_ATT_TABLE,
 		.p_entry_data = (void *)&panel_entry
 	};
-	ret = zxdh_np_dtb_table_entry_write(hw->slot_id, dtb_data->queueid, 1, &entry);
+	ret = zxdh_np_dtb_table_entry_write(hw->dev_id, dtb_data->queueid, 1, &entry);
 
 	if (ret) {
 		PMD_DRV_LOG(ERR, "Insert eram-panel failed, code:%u", ret);
@@ -171,7 +171,7 @@ int zxdh_get_panel_attr(struct rte_eth_dev *dev, struct zxdh_panel_table *panel_
 		.sdt_no = ZXDH_SDT_PANEL_ATT_TABLE,
 		.p_entry_data = (void *)&panel_entry
 	};
-	int ret = zxdh_np_dtb_table_entry_get(hw->slot_id, dtb_data->queueid, &entry, 1);
+	int ret = zxdh_np_dtb_table_entry_get(hw->dev_id, dtb_data->queueid, &entry, 1);
 
 	if (ret != 0)
 		PMD_DRV_LOG(ERR, "get panel table failed");
@@ -193,7 +193,7 @@ int zxdh_set_panel_attr(struct rte_eth_dev *dev, struct zxdh_panel_table *panel_
 		.sdt_no = ZXDH_SDT_PANEL_ATT_TABLE,
 		.p_entry_data = (void *)&panel_entry
 	};
-	int ret = zxdh_np_dtb_table_entry_write(hw->slot_id, dtb_data->queueid, 1, &entry);
+	int ret = zxdh_np_dtb_table_entry_write(hw->dev_id, dtb_data->queueid, 1, &entry);
 
 	if (ret)
 		PMD_DRV_LOG(ERR, "Insert panel table failed");
@@ -211,7 +211,7 @@ zxdh_get_port_attr(struct zxdh_hw *hw, uint16_t vport, struct zxdh_port_attr_tab
 	ZXDH_DTB_USER_ENTRY_T user_entry_get = {ZXDH_SDT_VPORT_ATT_TABLE, &entry};
 	int ret;
 
-	ret = zxdh_np_dtb_table_entry_get(hw->slot_id, dtb_data->queueid, &user_entry_get, 1);
+	ret = zxdh_np_dtb_table_entry_get(hw->dev_id, dtb_data->queueid, &user_entry_get, 1);
 	if (ret != 0)
 		PMD_DRV_LOG(ERR, "get port_attr vfid:%d failed, ret:%d", vfid, ret);
 
@@ -230,7 +230,7 @@ zxdh_delete_port_attr(struct zxdh_hw *hw, uint16_t vport,
 		.sdt_no = ZXDH_SDT_VPORT_ATT_TABLE,
 		.p_entry_data = (void *)&entry
 	};
-	int ret = zxdh_np_dtb_table_entry_delete(hw->slot_id, dtb_data->queueid, 1, &user_entry);
+	int ret = zxdh_np_dtb_table_entry_delete(hw->dev_id, dtb_data->queueid, 1, &user_entry);
 	if (ret != 0)
 		PMD_DRV_LOG(ERR, "delete port attr failed, vfid:%u", vport_num.vfid);
 	return ret;
@@ -261,7 +261,7 @@ zxdh_add_mac_table(struct zxdh_hw *hw, uint16_t vport, struct rte_ether_addr *ad
 			.p_entry_data = (void *)&dtb_hash_entry
 		};
 
-		ret = zxdh_np_dtb_table_entry_get(hw->slot_id, hw->dev_sd->dtb_sd.queueid,
+		ret = zxdh_np_dtb_table_entry_get(hw->dev_id, hw->dev_sd->dtb_sd.queueid,
 				&entry_get, 1);
 		if (ret == 0) {
 			if (unicast_table.entry.hit_flag != 0 &&
@@ -277,7 +277,7 @@ zxdh_add_mac_table(struct zxdh_hw *hw, uint16_t vport, struct rte_ether_addr *ad
 
 		unicast_table.entry.vfid = rte_cpu_to_be_16(vfid);
 		unicast_table.entry.hit_flag = 1;
-		ret = zxdh_np_dtb_table_entry_write(hw->slot_id,
+		ret = zxdh_np_dtb_table_entry_write(hw->dev_id,
 					hw->dev_sd->dtb_sd.queueid, 1, &entry_get);
 		if (ret) {
 			PMD_DRV_LOG(ERR, "Insert mac_table failed");
@@ -298,7 +298,7 @@ zxdh_add_mac_table(struct zxdh_hw *hw, uint16_t vport, struct rte_ether_addr *ad
 				.p_entry_data = (void *)&dtb_hash_entry
 			};
 
-			ret = zxdh_np_dtb_table_entry_get(hw->slot_id, hw->dev_sd->dtb_sd.queueid,
+			ret = zxdh_np_dtb_table_entry_get(hw->dev_id, hw->dev_sd->dtb_sd.queueid,
 					&entry_get, 1);
 			uint8_t index = (vport_num.vfid % 64) / 32;
 			uint8_t value = (vport_num.vfid % 64) % 32;
@@ -330,7 +330,7 @@ zxdh_add_mac_table(struct zxdh_hw *hw, uint16_t vport, struct rte_ether_addr *ad
 						multicast_table.entry.mc_pf_enable = false;
 				}
 			}
-			ret = zxdh_np_dtb_table_entry_write(hw->slot_id, hw->dev_sd->dtb_sd.queueid,
+			ret = zxdh_np_dtb_table_entry_write(hw->dev_id, hw->dev_sd->dtb_sd.queueid,
 						1, &entry_get);
 			if (ret) {
 				PMD_DRV_LOG(ERR, "add mac_table failed, code:%d", ret);
@@ -368,7 +368,7 @@ zxdh_del_mac_table(struct zxdh_hw *hw, uint16_t vport, struct rte_ether_addr *ad
 			.sdt_no = ZXDH_UNICAST_MAC_HASH_INDEX(hash_search_idx),
 			.p_entry_data = (void *)&dtb_hash_entry
 		};
-		ret = zxdh_np_dtb_table_entry_get(hw->slot_id, hw->dev_sd->dtb_sd.queueid,
+		ret = zxdh_np_dtb_table_entry_get(hw->dev_id, hw->dev_sd->dtb_sd.queueid,
 				&entry_get, 1);
 		if (ret == 0) {
 			if (unicast_table.entry.hit_flag != 0 &&
@@ -377,7 +377,7 @@ zxdh_del_mac_table(struct zxdh_hw *hw, uint16_t vport, struct rte_ether_addr *ad
 			}
 		}
 
-		ret = zxdh_np_dtb_table_entry_delete(hw->slot_id, hw->dev_sd->dtb_sd.queueid,
+		ret = zxdh_np_dtb_table_entry_delete(hw->dev_id, hw->dev_sd->dtb_sd.queueid,
 				1, &entry_get);
 		if (ret) {
 			PMD_DRV_LOG(ERR, "delete l2_fwd_hash_table failed, code:%d", ret);
@@ -397,7 +397,7 @@ zxdh_del_mac_table(struct zxdh_hw *hw, uint16_t vport, struct rte_ether_addr *ad
 			.p_entry_data = (void *)&dtb_hash_entry
 		};
 
-		ret = zxdh_np_dtb_table_entry_get(hw->slot_id, hw->dev_sd->dtb_sd.queueid,
+		ret = zxdh_np_dtb_table_entry_get(hw->dev_id, hw->dev_sd->dtb_sd.queueid,
 				&entry_get, 1);
 		uint8_t index = (vport_num.vfid % 64) / 32;
 		uint8_t value = (vport_num.vfid % 64) % 32;
@@ -407,7 +407,7 @@ zxdh_del_mac_table(struct zxdh_hw *hw, uint16_t vport, struct rte_ether_addr *ad
 		else
 			multicast_table.entry.mc_pf_enable = 0;
 
-		ret = zxdh_np_dtb_table_entry_write(hw->slot_id, hw->dev_sd->dtb_sd.queueid,
+		ret = zxdh_np_dtb_table_entry_write(hw->dev_id, hw->dev_sd->dtb_sd.queueid,
 				1, &entry_get);
 		if (ret) {
 			PMD_DRV_LOG(ERR, "mac_addr_add mc_table failed, code:%d", ret);
@@ -427,7 +427,7 @@ zxdh_del_mac_table(struct zxdh_hw *hw, uint16_t vport, struct rte_ether_addr *ad
 				.p_entry_data = (void *)&dtb_hash_entry
 			};
 
-			ret = zxdh_np_dtb_table_entry_get(hw->slot_id, hw->dev_sd->dtb_sd.queueid,
+			ret = zxdh_np_dtb_table_entry_get(hw->dev_id, hw->dev_sd->dtb_sd.queueid,
 					&entry_get, 1);
 			if (multicast_table.entry.mc_bitmap[0] == 0 &&
 				multicast_table.entry.mc_bitmap[1] == 0 &&
@@ -452,7 +452,7 @@ zxdh_del_mac_table(struct zxdh_hw *hw, uint16_t vport, struct rte_ether_addr *ad
 					.p_entry_data = (void *)&dtb_hash_entry
 				};
 
-				ret = zxdh_np_dtb_table_entry_delete(hw->slot_id,
+				ret = zxdh_np_dtb_table_entry_delete(hw->dev_id,
 						hw->dev_sd->dtb_sd.queueid, 1, &entry_get);
 			}
 		}
@@ -484,7 +484,7 @@ zxdh_promisc_table_init(struct rte_eth_dev *dev)
 			.p_entry_data = (void *)&eram_brocast_entry
 		};
 
-		ret = zxdh_np_dtb_table_entry_write(hw->slot_id,
+		ret = zxdh_np_dtb_table_entry_write(hw->dev_id,
 					dtb_data->queueid, 1, &entry_brocast);
 		if (ret) {
 			PMD_DRV_LOG(ERR, "write brocast table failed");
@@ -501,7 +501,7 @@ zxdh_promisc_table_init(struct rte_eth_dev *dev)
 			.p_entry_data = (void *)&eram_uc_entry
 		};
 
-		ret = zxdh_np_dtb_table_entry_write(hw->slot_id,
+		ret = zxdh_np_dtb_table_entry_write(hw->dev_id,
 					dtb_data->queueid, 1, &entry_unicast);
 		if (ret) {
 			PMD_DRV_LOG(ERR, "write unicast table failed");
@@ -518,7 +518,7 @@ zxdh_promisc_table_init(struct rte_eth_dev *dev)
 			.p_entry_data = (void *)&eram_mc_entry
 		};
 
-		ret = zxdh_np_dtb_table_entry_write(hw->slot_id, dtb_data->queueid,
+		ret = zxdh_np_dtb_table_entry_write(hw->dev_id, dtb_data->queueid,
 					1, &entry_multicast);
 		if (ret) {
 			PMD_DRV_LOG(ERR, "write multicast table failed");
@@ -553,7 +553,7 @@ zxdh_promisc_table_uninit(struct rte_eth_dev *dev)
 			.p_entry_data = (void *)&eram_brocast_entry
 		};
 
-		ret = zxdh_np_dtb_table_entry_delete(hw->slot_id,
+		ret = zxdh_np_dtb_table_entry_delete(hw->dev_id,
 				dtb_data->queueid, 1, &entry_brocast);
 		if (ret) {
 			PMD_DRV_LOG(ERR, "write brocast table failed");
@@ -570,7 +570,7 @@ zxdh_promisc_table_uninit(struct rte_eth_dev *dev)
 			.p_entry_data = (void *)&eram_uc_entry
 		};
 
-		ret = zxdh_np_dtb_table_entry_delete(hw->slot_id,
+		ret = zxdh_np_dtb_table_entry_delete(hw->dev_id,
 				dtb_data->queueid, 1, &entry_unicast);
 		if (ret) {
 			PMD_DRV_LOG(ERR, "write unicast table failed");
@@ -587,7 +587,7 @@ zxdh_promisc_table_uninit(struct rte_eth_dev *dev)
 			.p_entry_data = (void *)&eram_mc_entry
 		};
 
-		ret = zxdh_np_dtb_table_entry_delete(hw->slot_id, dtb_data->queueid,
+		ret = zxdh_np_dtb_table_entry_delete(hw->dev_id, dtb_data->queueid,
 					1, &entry_multicast);
 		if (ret) {
 			PMD_DRV_LOG(ERR, "write multicast table failed");
@@ -617,7 +617,7 @@ zxdh_dev_unicast_table_set(struct zxdh_hw *hw, uint16_t vport, bool enable)
 		.p_entry_data = (void *)&uc_table_entry
 	};
 
-	ret = zxdh_np_dtb_table_entry_get(hw->slot_id, dtb_data->queueid, &entry, 1);
+	ret = zxdh_np_dtb_table_entry_get(hw->dev_id, dtb_data->queueid, &entry, 1);
 	if (ret) {
 		PMD_DRV_LOG(ERR, "unicast_table_get_failed:%d", vfid);
 		return -ret;
@@ -634,7 +634,7 @@ zxdh_dev_unicast_table_set(struct zxdh_hw *hw, uint16_t vport, bool enable)
 		uc_table.uc_flood_pf_enable = rte_be_to_cpu_32(ZXDH_TABLE_HIT_FLAG + (enable << 6));
 	}
 
-	ret = zxdh_np_dtb_table_entry_write(hw->slot_id, dtb_data->queueid, 1, &entry);
+	ret = zxdh_np_dtb_table_entry_write(hw->dev_id, dtb_data->queueid, 1, &entry);
 	if (ret) {
 		PMD_DRV_LOG(ERR, "unicast_table_set_failed:%d", vfid);
 		return -ret;
@@ -673,7 +673,7 @@ zxdh_dev_multicast_table_set(struct zxdh_hw *hw, uint16_t vport, bool enable)
 		.p_entry_data = (void *)&mc_table_entry
 	};
 
-	ret = zxdh_np_dtb_table_entry_get(hw->slot_id, dtb_data->queueid, &entry, 1);
+	ret = zxdh_np_dtb_table_entry_get(hw->dev_id, dtb_data->queueid, &entry, 1);
 	if (ret) {
 		PMD_DRV_LOG(ERR, "allmulti_table_get_failed:%d", hw->vfid);
 		return -ret;
@@ -690,7 +690,7 @@ zxdh_dev_multicast_table_set(struct zxdh_hw *hw, uint16_t vport, bool enable)
 	} else {
 		mc_table.mc_flood_pf_enable = rte_be_to_cpu_32(ZXDH_TABLE_HIT_FLAG + (enable << 6));
 	}
-	ret = zxdh_np_dtb_table_entry_write(hw->slot_id, dtb_data->queueid, 1, &entry);
+	ret = zxdh_np_dtb_table_entry_write(hw->dev_id, dtb_data->queueid, 1, &entry);
 	if (ret) {
 		PMD_DRV_LOG(ERR, "allmulti_table_set_failed:%d", hw->vfid);
 		return -ret;
@@ -725,7 +725,7 @@ zxdh_vlan_filter_table_init(struct zxdh_hw *hw, uint16_t vport)
 		};
 		ZXDH_DTB_USER_ENTRY_T user_entry = {ZXDH_SDT_VLAN_ATT_TABLE, &entry_data};
 
-		ret = zxdh_np_dtb_table_entry_write(hw->slot_id,
+		ret = zxdh_np_dtb_table_entry_write(hw->dev_id,
 					dtb_data->queueid, 1, &user_entry);
 		if (ret != 0) {
 			PMD_DRV_LOG(ERR,
@@ -761,7 +761,7 @@ zxdh_vlan_filter_table_set(struct zxdh_hw *hw, uint16_t vport, uint16_t vlan_id,
 	ZXDH_DTB_ERAM_ENTRY_INFO_T entry_data = {index, (uint32_t *)&vlan_table};
 	ZXDH_DTB_USER_ENTRY_T user_entry_get = {ZXDH_SDT_VLAN_ATT_TABLE, &entry_data};
 
-	ret = zxdh_np_dtb_table_entry_get(hw->slot_id, dtb_data->queueid, &user_entry_get, 1);
+	ret = zxdh_np_dtb_table_entry_get(hw->dev_id, dtb_data->queueid, &user_entry_get, 1);
 	if (ret) {
 		PMD_DRV_LOG(ERR, "get vlan table failed");
 		return -1;
@@ -787,7 +787,7 @@ zxdh_vlan_filter_table_set(struct zxdh_hw *hw, uint16_t vport, uint16_t vlan_id,
 		.p_entry_data = &entry_data
 	};
 
-	ret = zxdh_np_dtb_table_entry_write(hw->slot_id,
+	ret = zxdh_np_dtb_table_entry_write(hw->dev_id,
 				dtb_data->queueid, 1, &user_entry_write);
 	if (ret != 0) {
 		PMD_DRV_LOG(ERR, "write vlan table failed");
@@ -830,7 +830,7 @@ zxdh_rss_table_set(struct zxdh_hw *hw, uint16_t vport, struct zxdh_rss_reta *rss
 			.sdt_no = ZXDH_SDT_RSS_ATT_TABLE,
 			.p_entry_data = &entry
 		};
-		ret = zxdh_np_dtb_table_entry_write(hw->slot_id,
+		ret = zxdh_np_dtb_table_entry_write(hw->dev_id,
 					dtb_data->queueid, 1, &user_entry_write);
 		if (ret != 0) {
 			PMD_DRV_LOG(ERR, "write rss base qid failed vfid:%d", vfid);
@@ -853,7 +853,7 @@ zxdh_rss_table_get(struct zxdh_hw *hw, uint16_t vport, struct zxdh_rss_reta *rss
 		ZXDH_DTB_ERAM_ENTRY_INFO_T entry = {vfid * 32 + i, (uint32_t *)&rss_vqid};
 		ZXDH_DTB_USER_ENTRY_T user_entry = {ZXDH_SDT_RSS_ATT_TABLE, &entry};
 
-		ret = zxdh_np_dtb_table_entry_get(hw->slot_id,
+		ret = zxdh_np_dtb_table_entry_get(hw->dev_id,
 					dtb_data->queueid, &user_entry, 1);
 		if (ret != 0) {
 			PMD_DRV_LOG(ERR, "get rss tbl failed, vfid:%d", vfid);
@@ -897,7 +897,7 @@ zxdh_dev_broadcast_set(struct zxdh_hw *hw, uint16_t vport, bool enable)
 			.sdt_no = ZXDH_SDT_BROCAST_ATT_TABLE,
 			.p_entry_data = (void *)&eram_entry};
 
-	ret = zxdh_np_dtb_table_entry_get(hw->slot_id, dtb_data->queueid, &entry_get, 1);
+	ret = zxdh_np_dtb_table_entry_get(hw->dev_id, dtb_data->queueid, &entry_get, 1);
 	if (ret == 0) {
 		if (enable)
 			brocast_table.bitmap[(vport_num.vfid % 64) / 32] |=
@@ -906,7 +906,7 @@ zxdh_dev_broadcast_set(struct zxdh_hw *hw, uint16_t vport, bool enable)
 			brocast_table.bitmap[(vport_num.vfid % 64) / 32] &=
 					~((UINT32_C(1) << (31 - (vport_num.vfid % 64) % 32)));
 
-		ret = zxdh_np_dtb_table_entry_write(hw->slot_id, dtb_data->queueid, 1, &entry_get);
+		ret = zxdh_np_dtb_table_entry_write(hw->dev_id, dtb_data->queueid, 1, &entry_get);
 		if (ret) {
 			PMD_DRV_LOG(ERR, "brocast_table_write_failed. code:%d", ret);
 			return -ret;
@@ -968,7 +968,7 @@ zxdh_set_port_vlan_attr(struct zxdh_hw *hw, uint16_t vport,
 		.p_entry_data = (void *)&port_entry
 	};
 
-	ret = zxdh_np_dtb_table_entry_write(hw->slot_id, hw->dev_sd->dtb_sd.queueid, 1, &entry);
+	ret = zxdh_np_dtb_table_entry_write(hw->dev_id, hw->dev_sd->dtb_sd.queueid, 1, &entry);
 	if (ret)
 		PMD_DRV_LOG(ERR, "write port_vlan tbl failed, ret:%d ", ret);
 	return ret;
@@ -991,7 +991,7 @@ zxdh_get_port_vlan_attr(struct zxdh_hw *hw, uint16_t vport,
 		.p_entry_data = (void *)&port_entry
 	};
 
-	ret = zxdh_np_dtb_table_entry_get(hw->slot_id, hw->dev_sd->dtb_sd.queueid,
+	ret = zxdh_np_dtb_table_entry_get(hw->dev_id, hw->dev_sd->dtb_sd.queueid,
 			&entry, 1);
 	if (ret)
 		PMD_DRV_LOG(ERR, "get port vlan tbl failed, ret:%d ", ret);
-- 
2.27.0

[-- Attachment #1.1.2: Type: text/html , Size: 131590 bytes --]

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

* [PATCH v1] support multiple PF process flow table
  2025-09-24  8:23 [PATCH v1] net/zxdh: support multiple PF process flow table Tianhao Zhang
                   ` (2 preceding siblings ...)
  2025-09-25  2:45 ` [PATCH v1] " Tianhao Zhang
@ 2025-09-26  1:04 ` Tianhao Zhang
  2025-09-26  1:28 ` [PATCH v2] net/zxdh: " Tianhao Zhang
  4 siblings, 0 replies; 6+ messages in thread
From: Tianhao Zhang @ 2025-09-26  1:04 UTC (permalink / raw)
  To: stephen, wang.junlong1, yang.yonggang; +Cc: dev, Tianhao Zhang


[-- Attachment #1.1.1: Type: text/plain, Size: 60791 bytes --]

Support multiple PF process flow table.

Signed-off-by: Tianhao Zhang <zhang.tianhao2@zte.com.cn>
---
 drivers/net/zxdh/zxdh_ethdev.c     | 137 ++++++++-------
 drivers/net/zxdh/zxdh_ethdev.h     |   9 +-
 drivers/net/zxdh/zxdh_ethdev_ops.c |  20 +--
 drivers/net/zxdh/zxdh_np.c         | 269 +++++++++++++++++------------
 drivers/net/zxdh/zxdh_np.h         |  18 +-
 drivers/net/zxdh/zxdh_tables.c     |  72 ++++----
 6 files changed, 296 insertions(+), 229 deletions(-)

diff --git a/drivers/net/zxdh/zxdh_ethdev.c b/drivers/net/zxdh/zxdh_ethdev.c
index 0429bd0333..bc929bacc5 100644
--- a/drivers/net/zxdh/zxdh_ethdev.c
+++ b/drivers/net/zxdh/zxdh_ethdev.c
@@ -20,7 +20,7 @@
 #include "zxdh_ethdev_ops.h"
 
 struct zxdh_hw_internal zxdh_hw_internal[RTE_MAX_ETHPORTS];
-struct zxdh_dev_shared_data g_dev_sd[ZXDH_SLOT_MAX];
+struct zxdh_dev_nic_shared_data dev_nic_sd[ZXDH_SLOT_MAX];
 static rte_spinlock_t zxdh_shared_data_lock = RTE_SPINLOCK_INITIALIZER;
 struct zxdh_shared_data *zxdh_shared_data;
 struct zxdh_net_hdr_dl g_net_hdr_dl[RTE_MAX_ETHPORTS];
@@ -1141,26 +1141,26 @@ zxdh_np_dtb_data_res_free(struct zxdh_hw *hw)
 	int i;
 
 	if (dtb_data->init_done && dtb_data->bind_device == dev) {
-		ret = zxdh_np_online_uninit(hw->slot_id, dev->data->name, dtb_data->queueid);
+		ret = zxdh_np_online_uninit(hw->dev_id, dev->data->name, dtb_data->queueid);
 		if (ret)
 			PMD_DRV_LOG(ERR, "%s dpp_np_online_uninstall failed", dev->data->name);
 
-		rte_memzone_free(dtb_data->dtb_table_conf_mz);
-		dtb_data->dtb_table_conf_mz = NULL;
-		rte_memzone_free(dtb_data->dtb_table_dump_mz);
-		dtb_data->dtb_table_dump_mz = NULL;
-
-		for (i = 0; i < ZXDH_MAX_BASE_DTB_TABLE_COUNT; i++) {
-			if (dtb_data->dtb_table_bulk_dump_mz[i]) {
-				rte_memzone_free(dtb_data->dtb_table_bulk_dump_mz[i]);
-				dtb_data->dtb_table_bulk_dump_mz[i] = NULL;
-			}
-		}
+		hw->dev_nic_sd->dtb_used_num--;
 		dtb_data->init_done = 0;
 		dtb_data->bind_device = NULL;
 	}
-	if (zxdh_shared_data != NULL)
-		zxdh_shared_data->np_init_done = 0;
+
+	rte_memzone_free(dtb_data->dtb_table_conf_mz);
+	dtb_data->dtb_table_conf_mz = NULL;
+	rte_memzone_free(dtb_data->dtb_table_dump_mz);
+	dtb_data->dtb_table_dump_mz = NULL;
+
+	for (i = 0; i < ZXDH_MAX_BASE_DTB_TABLE_COUNT; i++) {
+		if (dtb_data->dtb_table_bulk_dump_mz[i]) {
+			rte_memzone_free(dtb_data->dtb_table_bulk_dump_mz[i]);
+			dtb_data->dtb_table_bulk_dump_mz[i] = NULL;
+		}
+	}
 }
 
 static int
@@ -1191,17 +1191,19 @@ static void
 zxdh_np_uninit(struct rte_eth_dev *dev)
 {
 	struct zxdh_hw *hw = dev->data->dev_private;
-	struct zxdh_dtb_shared_data *dtb_data = &hw->dev_sd->dtb_sd;
 
 	if (!hw->is_pf)
 		return;
-	if (!dtb_data->init_done && !dtb_data->dev_refcnt)
-		return;
 
 	zxdh_tbl_entry_online_destroy(dev);
+	zxdh_np_dtb_data_res_free(hw);
+
+	if (hw->dev_nic_sd->init_done && hw->dev_nic_sd->dtb_used_num == 0) {
+		zxdh_np_soft_res_uninstall(hw->dev_id);
+		hw->dev_nic_sd->init_done = 0;
+	}
+	PMD_DRV_LOG(DEBUG, "zxdh_np_destroy: dtb_used_num %d", hw->dev_nic_sd->dtb_used_num);
 
-	if (--dtb_data->dev_refcnt == 0)
-		zxdh_np_dtb_data_res_free(hw);
 }
 
 static int
@@ -1254,6 +1256,16 @@ zxdh_dev_stop(struct rte_eth_dev *dev)
 	return ret;
 }
 
+static void
+zxdh_priv_res_free(struct zxdh_hw *priv)
+{
+	rte_free(priv->vfinfo);
+	priv->vfinfo = NULL;
+
+	rte_free(priv->channel_context);
+	priv->channel_context = NULL;
+}
+
 static int
 zxdh_dev_close(struct rte_eth_dev *dev)
 {
@@ -1285,7 +1297,9 @@ zxdh_dev_close(struct rte_eth_dev *dev)
 	zxdh_free_queues(dev);
 
 	zxdh_bar_msg_chan_exit();
+	zxdh_priv_res_free(hw);
 
+	rte_free(hw->dev_sd);
 	if (dev->data->mac_addrs != NULL) {
 		rte_free(dev->data->mac_addrs);
 		dev->data->mac_addrs = NULL;
@@ -1615,6 +1629,7 @@ zxdh_np_dtb_res_init(struct rte_eth_dev *dev)
 	struct zxdh_bar_offset_res res = {0};
 	char buf[ZXDH_MAX_NAME_LEN] = {0};
 	struct zxdh_dtb_shared_data *dtb_data = &hw->dev_sd->dtb_sd;
+	struct zxdh_dev_nic_shared_data *dev_nic_sd = hw->dev_nic_sd;
 	int ret = 0;
 
 	if (dtb_data->init_done) {
@@ -1625,15 +1640,13 @@ zxdh_np_dtb_res_init(struct rte_eth_dev *dev)
 
 	dtb_data->queueid = ZXDH_INVALID_DTBQUE;
 	dtb_data->bind_device = dev;
-	dtb_data->dev_refcnt++;
-	dtb_data->init_done = 1;
 
 	ZXDH_DEV_INIT_CTRL_T *dpp_ctrl = rte_zmalloc(NULL, sizeof(*dpp_ctrl) +
 			sizeof(ZXDH_DTB_ADDR_INFO_T) * 256, 0);
 	if (dpp_ctrl == NULL) {
 		PMD_DRV_LOG(ERR, "dev %s annot allocate memory for dpp_ctrl", dev->device->name);
 		ret = -ENOMEM;
-		goto free_res;
+		return ret;
 	}
 	dpp_ctrl->queue_id = 0xff;
 	dpp_ctrl->vport = hw->vport.vport;
@@ -1694,7 +1707,7 @@ zxdh_np_dtb_res_init(struct rte_eth_dev *dev)
 		goto free_res;
 	}
 
-	ret = zxdh_np_host_init(hw->slot_id, dpp_ctrl);
+	ret = zxdh_np_host_init(hw->dev_id, dpp_ctrl);
 	if (ret) {
 		PMD_DRV_LOG(ERR, "dev %s dpp host np init failed", dev->device->name);
 		goto free_res;
@@ -1703,6 +1716,9 @@ zxdh_np_dtb_res_init(struct rte_eth_dev *dev)
 	PMD_DRV_LOG(DEBUG, "dev %s dpp host np init ok.dtb queue %u",
 		dev->device->name, dpp_ctrl->queue_id);
 	dtb_data->queueid = dpp_ctrl->queue_id;
+	dtb_data->dev_refcnt++;
+	dev_nic_sd->dtb_used_num++;
+	dtb_data->init_done = 1;
 	rte_free(dpp_ctrl);
 	return 0;
 
@@ -1717,11 +1733,11 @@ zxdh_get_dev_shared_data_idx(uint32_t dev_serial_id)
 {
 	uint16_t idx = 0;
 	for (; idx < ZXDH_SLOT_MAX; idx++) {
-		if (g_dev_sd[idx].serial_id == dev_serial_id || g_dev_sd[idx].serial_id == 0)
+		if (dev_nic_sd[idx].serial_id == dev_serial_id || dev_nic_sd[idx].serial_id == 0)
 			return idx;
 	}
 
-	PMD_DRV_LOG(ERR, "dev serial_id[%u] can not found in global dev_share_data arrays",
+	PMD_DRV_LOG(ERR, "dev serial_id[%u] can not found in global dev_nic_share_data arrays",
 		dev_serial_id);
 	return ZXDH_INVALID_SLOT_IDX;
 }
@@ -1744,9 +1760,10 @@ static int zxdh_init_dev_share_data(struct rte_eth_dev *eth_dev)
 		return -EINVAL;
 
 	hw->slot_id = slot_id;
-	hw->dev_id = (hw->pcie_id << 16) | (hw->slot_id & 0xffff);
-	g_dev_sd[slot_id].serial_id = serial_id;
-	hw->dev_sd = &g_dev_sd[slot_id];
+	hw->dev_id = hw->pcie_id;
+	dev_nic_sd[slot_id].serial_id = serial_id;
+	hw->dev_nic_sd = &dev_nic_sd[slot_id];
+	hw->dev_sd = rte_zmalloc("zxdh_dtb", sizeof(struct zxdh_dev_shared_data), 0);
 
 	return 0;
 }
@@ -1938,41 +1955,39 @@ zxdh_np_init(struct rte_eth_dev *eth_dev)
 {
 	struct zxdh_hw *hw = eth_dev->data->dev_private;
 	struct zxdh_dtb_shared_data *dtb_data = &hw->dev_sd->dtb_sd;
+	struct zxdh_dev_nic_shared_data *dev_nic_sd = hw->dev_nic_sd;
 	int ret = 0;
 
-	if (hw->is_pf && dtb_data->init_done) {
-		dtb_data->dev_refcnt++;
-		zxdh_tbl_entry_offline_destroy(hw);
-		PMD_DRV_LOG(INFO, "no need to init dtb  dtb chanenl %d devref %d",
-			dtb_data->queueid, dtb_data->dev_refcnt);
+	if (!hw->is_pf)
 		return 0;
-	}
 
-	if (hw->is_pf) {
-		ret = zxdh_np_dtb_res_init(eth_dev);
-		if (ret) {
-			PMD_DRV_LOG(ERR, "np dtb init failed, ret:%d", ret);
-			return ret;
-		}
+	hw->dev_id = (hw->pcie_id << 16) | (hw->slot_id & 0xffff);
+
+	ret = zxdh_np_dtb_res_init(eth_dev);
+	if (ret) {
+		PMD_DRV_LOG(ERR, "np dtb init failed, ret:%d", ret);
+		return ret;
 	}
 
-	if (hw->is_pf) {
-		ret = zxdh_np_se_res_get_and_init(hw->dev_id, ZXDH_SE_STD_NIC_RES_TYPE);
-		if (ret) {
-			PMD_DRV_LOG(ERR, "dpp apt init failed, code:%d ", ret);
-			return -ret;
-		}
-		if (!hw->switchoffload) {
-			if (hw->hash_search_index >= ZXDH_HASHIDX_MAX) {
-				PMD_DRV_LOG(ERR, "invalid hash idx %d", hw->hash_search_index);
-				return -1;
-			}
-			zxdh_tbl_entry_offline_destroy(hw);
+	if (dev_nic_sd->init_done) {
+		zxdh_tbl_entry_offline_destroy(hw);
+		PMD_DRV_LOG(ERR, "no need to init apt res. slot_id %d dtb chanenl %d dtb_used_num %d",
+			hw->slot_id, dtb_data->queueid, hw->dev_nic_sd->dtb_used_num);
+		return 0;
+	}
+	ret = zxdh_np_se_res_get_and_init(hw->dev_id, ZXDH_SE_STD_NIC_RES_TYPE);
+	if (ret) {
+		PMD_DRV_LOG(ERR, "dpp apt init failed, code:%d ", ret);
+		return -ret;
+	}
+	if (!hw->switchoffload) {
+		if (hw->hash_search_index >= ZXDH_HASHIDX_MAX) {
+			PMD_DRV_LOG(ERR, "invalid hash idx %d", hw->hash_search_index);
+			return -1;
 		}
+		zxdh_tbl_entry_offline_destroy(hw);
 	}
-
-	if (zxdh_shared_data != NULL)
-		zxdh_shared_data->np_init_done = 1;
+	dev_nic_sd->init_done = 1;
 
 	PMD_DRV_LOG(DEBUG, "np init ok");
 	return 0;
@@ -2069,16 +2084,6 @@ zxdh_priv_res_init(struct zxdh_hw *hw)
 	return 0;
 }
 
-static void
-zxdh_priv_res_free(struct zxdh_hw *priv)
-{
-	rte_free(priv->vfinfo);
-	priv->vfinfo = NULL;
-	if (priv->channel_context != NULL) {
-		rte_free(priv->channel_context);
-		priv->channel_context = NULL;
-	}
-}
 
 static uint8_t
 is_pf(uint16_t device_id)
diff --git a/drivers/net/zxdh/zxdh_ethdev.h b/drivers/net/zxdh/zxdh_ethdev.h
index a2d7b14601..a269199540 100644
--- a/drivers/net/zxdh/zxdh_ethdev.h
+++ b/drivers/net/zxdh/zxdh_ethdev.h
@@ -103,6 +103,7 @@ struct zxdh_hw {
 	struct zxdh_virtqueue **vqs;
 	struct zxdh_chnl_context *channel_context;
 	struct zxdh_dev_shared_data *dev_sd;
+	struct zxdh_dev_nic_shared_data *dev_nic_sd;
 	struct vfinfo *vfinfo;
 
 	uint64_t bar_addr[ZXDH_NUM_BARS];
@@ -183,7 +184,6 @@ struct zxdh_shared_data {
 	int32_t init_done;       /* Whether primary has done initialization. */
 	unsigned int secondary_cnt; /* Number of secondary processes init'd. */
 
-	int32_t np_init_done;
 	uint32_t dev_refcnt;
 	struct zxdh_dtb_shared_data *dtb_data;
 	struct rte_mempool *flow_mp;
@@ -196,10 +196,15 @@ struct zxdh_shared_data {
 };
 
 struct zxdh_dev_shared_data {
-	uint32_t serial_id;
 	struct zxdh_dtb_shared_data dtb_sd;
 };
 
+struct zxdh_dev_nic_shared_data {
+	uint32_t serial_id;
+	uint16_t dtb_used_num;
+	uint16_t init_done;
+};
+
 struct zxdh_dtb_bulk_dump_info {
 	const char *mz_name;
 	uint32_t mz_size;
diff --git a/drivers/net/zxdh/zxdh_ethdev_ops.c b/drivers/net/zxdh/zxdh_ethdev_ops.c
index da32512b03..ee5d7304ef 100644
--- a/drivers/net/zxdh/zxdh_ethdev_ops.c
+++ b/drivers/net/zxdh/zxdh_ethdev_ops.c
@@ -1556,7 +1556,7 @@ zxdh_np_stats_get(struct rte_eth_dev *dev, struct zxdh_hw_np_stats *np_stats)
 
 	idx = stats_id + ZXDH_BROAD_STATS_EGRESS_BASE;
 	memset(&stats_data, 0, sizeof(stats_data));
-	ret = zxdh_np_dtb_stats_get(hw->slot_id, dtb_data->queueid,
+	ret = zxdh_np_dtb_stats_get(hw->dev_id, dtb_data->queueid,
 				0, idx, (uint32_t *)&stats_data);
 	if (ret)
 		return ret;
@@ -1567,7 +1567,7 @@ zxdh_np_stats_get(struct rte_eth_dev *dev, struct zxdh_hw_np_stats *np_stats)
 
 	idx = stats_id + ZXDH_BROAD_STATS_INGRESS_BASE;
 	memset(&stats_data, 0, sizeof(stats_data));
-	ret = zxdh_np_dtb_stats_get(hw->slot_id, dtb_data->queueid,
+	ret = zxdh_np_dtb_stats_get(hw->dev_id, dtb_data->queueid,
 				0, idx, (uint32_t *)&stats_data);
 	if (ret)
 		return ret;
@@ -1578,7 +1578,7 @@ zxdh_np_stats_get(struct rte_eth_dev *dev, struct zxdh_hw_np_stats *np_stats)
 
 	idx = stats_id + ZXDH_MULTICAST_STATS_EGRESS_BASE;
 	memset(&stats_data, 0, sizeof(stats_data));
-	ret = zxdh_np_dtb_stats_get(hw->slot_id, dtb_data->queueid,
+	ret = zxdh_np_dtb_stats_get(hw->dev_id, dtb_data->queueid,
 				0, idx, (uint32_t *)&stats_data);
 	if (ret)
 		return ret;
@@ -1589,7 +1589,7 @@ zxdh_np_stats_get(struct rte_eth_dev *dev, struct zxdh_hw_np_stats *np_stats)
 
 	idx = stats_id + ZXDH_MULTICAST_STATS_INGRESS_BASE;
 	memset(&stats_data, 0, sizeof(stats_data));
-	ret = zxdh_np_dtb_stats_get(hw->slot_id, dtb_data->queueid,
+	ret = zxdh_np_dtb_stats_get(hw->dev_id, dtb_data->queueid,
 				0, idx, (uint32_t *)&stats_data);
 	if (ret)
 		return ret;
@@ -1600,7 +1600,7 @@ zxdh_np_stats_get(struct rte_eth_dev *dev, struct zxdh_hw_np_stats *np_stats)
 
 	idx = stats_id + ZXDH_UNICAST_STATS_EGRESS_BASE;
 	memset(&stats_data, 0, sizeof(stats_data));
-	ret = zxdh_np_dtb_stats_get(hw->slot_id, dtb_data->queueid,
+	ret = zxdh_np_dtb_stats_get(hw->dev_id, dtb_data->queueid,
 				0, idx, (uint32_t *)&stats_data);
 	if (ret)
 		return ret;
@@ -1611,7 +1611,7 @@ zxdh_np_stats_get(struct rte_eth_dev *dev, struct zxdh_hw_np_stats *np_stats)
 
 	idx = stats_id + ZXDH_UNICAST_STATS_INGRESS_BASE;
 	memset(&stats_data, 0, sizeof(stats_data));
-	ret = zxdh_np_dtb_stats_get(hw->slot_id, dtb_data->queueid,
+	ret = zxdh_np_dtb_stats_get(hw->dev_id, dtb_data->queueid,
 				0, idx, (uint32_t *)&stats_data);
 	if (ret)
 		return ret;
@@ -1622,7 +1622,7 @@ zxdh_np_stats_get(struct rte_eth_dev *dev, struct zxdh_hw_np_stats *np_stats)
 
 	idx = stats_id + ZXDH_MTU_STATS_EGRESS_BASE;
 	memset(&stats_data, 0, sizeof(stats_data));
-	ret = zxdh_np_dtb_stats_get(hw->slot_id, dtb_data->queueid,
+	ret = zxdh_np_dtb_stats_get(hw->dev_id, dtb_data->queueid,
 				1, idx, (uint32_t *)&stats_data);
 	if (ret)
 		return ret;
@@ -1633,7 +1633,7 @@ zxdh_np_stats_get(struct rte_eth_dev *dev, struct zxdh_hw_np_stats *np_stats)
 
 	idx = stats_id + ZXDH_MTU_STATS_INGRESS_BASE;
 	memset(&stats_data, 0, sizeof(stats_data));
-	ret = zxdh_np_dtb_stats_get(hw->slot_id, dtb_data->queueid,
+	ret = zxdh_np_dtb_stats_get(hw->dev_id, dtb_data->queueid,
 				1, idx, (uint32_t *)&stats_data);
 	if (ret)
 		return ret;
@@ -1644,7 +1644,7 @@ zxdh_np_stats_get(struct rte_eth_dev *dev, struct zxdh_hw_np_stats *np_stats)
 
 	idx = stats_id + ZXDH_MTR_STATS_EGRESS_BASE;
 	memset(&stats_data, 0, sizeof(stats_data));
-	ret = zxdh_np_dtb_stats_get(hw->slot_id, dtb_data->queueid,
+	ret = zxdh_np_dtb_stats_get(hw->dev_id, dtb_data->queueid,
 				1, idx, (uint32_t *)&stats_data);
 	if (ret)
 		return ret;
@@ -1655,7 +1655,7 @@ zxdh_np_stats_get(struct rte_eth_dev *dev, struct zxdh_hw_np_stats *np_stats)
 
 	idx = stats_id + ZXDH_MTR_STATS_INGRESS_BASE;
 	memset(&stats_data, 0, sizeof(stats_data));
-	ret = zxdh_np_dtb_stats_get(hw->slot_id, dtb_data->queueid,
+	ret = zxdh_np_dtb_stats_get(hw->dev_id, dtb_data->queueid,
 				1, idx, (uint32_t *)&stats_data);
 	if (ret)
 		return ret;
diff --git a/drivers/net/zxdh/zxdh_np.c b/drivers/net/zxdh/zxdh_np.c
index 21c749c67a..024da113e2 100644
--- a/drivers/net/zxdh/zxdh_np.c
+++ b/drivers/net/zxdh/zxdh_np.c
@@ -300,8 +300,8 @@ static const ZXDH_DTB_TABLE_T g_dpp_dtb_dump_info[] = {
 };
 
 #define ZXDH_SDT_MGR_PTR_GET()    (&g_sdt_mgr)
-#define ZXDH_SDT_SOFT_TBL_GET(id) (g_sdt_mgr.sdt_tbl_array[id])
-#define ZXDH_DEV_INFO_GET(id) (g_dev_mgr.p_dev_array[id])
+#define ZXDH_SDT_SOFT_TBL_GET(id) (g_sdt_mgr.sdt_tbl_array[ZXDH_DEV_SLOT_ID(id)])
+#define ZXDH_DEV_INFO_GET(id) (g_dev_mgr.p_dev_array[ZXDH_DEV_SLOT_ID(id)])
 
 #define ZXDH_DTB_LEN(cmd_type, int_en, data_len) \
 	(((data_len) & 0x3ff) | \
@@ -384,45 +384,55 @@ zxdh_np_comm_convert32(uint32_t dw_data)
 #define ZXDH_COMM_CONVERT32(w_data) \
 			zxdh_np_comm_convert32(w_data)
 
-#define ZXDH_DTB_TAB_UP_WR_INDEX_GET(DEV_ID, QUEUE_ID)       \
-		(p_dpp_dtb_mgr[(DEV_ID)]->queue_info[(QUEUE_ID)].tab_up.wr_index)
+#define ZXDH_DTB_TAB_UP_WR_INDEX_GET(DEV_ID, QUEUE_ID) \
+		(p_dpp_dtb_mgr[(ZXDH_DEV_SLOT_ID(DEV_ID))]->queue_info[(QUEUE_ID)].tab_up.wr_index)
 
-#define ZXDH_DTB_TAB_UP_USER_PHY_ADDR_FLAG_GET(DEV_ID, QUEUE_ID, INDEX)     \
-	(p_dpp_dtb_mgr[(DEV_ID)]->queue_info[(QUEUE_ID)].tab_up.user_addr[(INDEX)].user_flag)
+#define ZXDH_DTB_TAB_UP_USER_PHY_ADDR_FLAG_GET(DEV_ID, QUEUE_ID, INDEX)    \
+		(p_dpp_dtb_mgr[(ZXDH_DEV_SLOT_ID(DEV_ID))]->                       \
+		queue_info[(QUEUE_ID)].tab_up.user_addr[(INDEX)].user_flag)
 
-#define ZXDH_DTB_TAB_UP_USER_PHY_ADDR_GET(DEV_ID, QUEUE_ID, INDEX)     \
-		(p_dpp_dtb_mgr[(DEV_ID)]->queue_info[(QUEUE_ID)].tab_up.user_addr[(INDEX)].phy_addr)
+#define ZXDH_DTB_TAB_UP_USER_PHY_ADDR_GET(DEV_ID, QUEUE_ID, INDEX)         \
+		(p_dpp_dtb_mgr[(ZXDH_DEV_SLOT_ID(DEV_ID))]->                       \
+		queue_info[(QUEUE_ID)].tab_up.user_addr[(INDEX)].phy_addr)
 
-#define ZXDH_DTB_TAB_UP_DATA_LEN_GET(DEV_ID, QUEUE_ID, INDEX)       \
-		(p_dpp_dtb_mgr[(DEV_ID)]->queue_info[(QUEUE_ID)].tab_up.data_len[(INDEX)])
+#define ZXDH_DTB_TAB_UP_DATA_LEN_GET(DEV_ID, QUEUE_ID, INDEX)              \
+		(p_dpp_dtb_mgr[(ZXDH_DEV_SLOT_ID(DEV_ID))]->                       \
+		queue_info[(QUEUE_ID)].tab_up.data_len[(INDEX)])
 
-#define ZXDH_DTB_TAB_UP_VIR_ADDR_GET(DEV_ID, QUEUE_ID, INDEX)     \
-		(p_dpp_dtb_mgr[(DEV_ID)]->queue_info[(QUEUE_ID)].tab_up.start_vir_addr + \
-		(INDEX) * p_dpp_dtb_mgr[(DEV_ID)]->queue_info[(QUEUE_ID)].tab_up.item_size)
+#define ZXDH_DTB_TAB_UP_VIR_ADDR_GET(DEV_ID, QUEUE_ID, INDEX)   \
+		(p_dpp_dtb_mgr[(ZXDH_DEV_SLOT_ID(DEV_ID))]->            \
+		queue_info[(QUEUE_ID)].tab_up.start_vir_addr +          \
+		(INDEX) * p_dpp_dtb_mgr[(ZXDH_DEV_SLOT_ID(DEV_ID))]->   \
+		queue_info[(QUEUE_ID)].tab_up.item_size)
 
-#define ZXDH_DTB_TAB_DOWN_VIR_ADDR_GET(DEV_ID, QUEUE_ID, INDEX)   \
-		(p_dpp_dtb_mgr[DEV_ID]->queue_info[QUEUE_ID].tab_down.start_vir_addr + \
-		INDEX * p_dpp_dtb_mgr[DEV_ID]->queue_info[QUEUE_ID].tab_down.item_size)
+#define ZXDH_DTB_TAB_DOWN_VIR_ADDR_GET(DEV_ID, QUEUE_ID, INDEX) \
+		(p_dpp_dtb_mgr[ZXDH_DEV_SLOT_ID(DEV_ID)]->              \
+		queue_info[QUEUE_ID].tab_down.start_vir_addr +          \
+		(INDEX) * p_dpp_dtb_mgr[ZXDH_DEV_SLOT_ID(DEV_ID)]->     \
+		queue_info[QUEUE_ID].tab_down.item_size)
 
-#define ZXDH_DTB_TAB_DOWN_WR_INDEX_GET(DEV_ID, QUEUE_ID)       \
-		(p_dpp_dtb_mgr[(DEV_ID)]->queue_info[(QUEUE_ID)].tab_down.wr_index)
+#define ZXDH_DTB_TAB_DOWN_WR_INDEX_GET(DEV_ID, QUEUE_ID)        \
+		(p_dpp_dtb_mgr[(ZXDH_DEV_SLOT_ID(DEV_ID))]->            \
+		queue_info[(QUEUE_ID)].tab_down.wr_index)
 
-#define ZXDH_DTB_QUEUE_INIT_FLAG_GET(DEV_ID, QUEUE_ID)       \
-		(p_dpp_dtb_mgr[(DEV_ID)]->queue_info[(QUEUE_ID)].init_flag)
+#define ZXDH_DTB_QUEUE_INIT_FLAG_GET(DEV_ID, QUEUE_ID)          \
+		(p_dpp_dtb_mgr[(ZXDH_DEV_SLOT_ID(DEV_ID))]->            \
+		queue_info[(QUEUE_ID)].init_flag)
 
-#define ZXDH_DTB_TAB_UP_USER_VIR_ADDR_GET(DEV_ID, QUEUE_ID, INDEX)     \
-		(p_dpp_dtb_mgr[DEV_ID]->queue_info[QUEUE_ID].tab_up.user_addr[INDEX].vir_addr)
+#define ZXDH_DTB_TAB_UP_USER_VIR_ADDR_GET(DEV_ID, QUEUE_ID, INDEX)          \
+		(p_dpp_dtb_mgr[ZXDH_DEV_SLOT_ID(DEV_ID)]->                          \
+		queue_info[QUEUE_ID].tab_up.user_addr[INDEX].vir_addr)
 
-#define ZXDH_DTB_TAB_UP_USER_ADDR_FLAG_SET(DEV_ID, QUEUE_ID, INDEX, VAL)     \
-		(p_dpp_dtb_mgr[DEV_ID]->queue_info[QUEUE_ID].tab_up.user_addr[INDEX].user_flag = \
-		VAL)
+#define ZXDH_DTB_TAB_UP_USER_ADDR_FLAG_SET(DEV_ID, QUEUE_ID, INDEX, VAL)    \
+		(p_dpp_dtb_mgr[ZXDH_DEV_SLOT_ID(DEV_ID)]->                          \
+		queue_info[QUEUE_ID].tab_up.user_addr[INDEX].user_flag = VAL)
 
 static inline uint64_t
 zxdh_np_dtb_tab_down_phy_addr_get(uint32_t DEV_ID, uint32_t QUEUE_ID,
 	uint32_t INDEX)
 {
-	return p_dpp_dtb_mgr[DEV_ID]->queue_info[QUEUE_ID].tab_down.start_phy_addr +
-		INDEX * p_dpp_dtb_mgr[DEV_ID]->queue_info[QUEUE_ID].tab_down.item_size;
+	return p_dpp_dtb_mgr[ZXDH_DEV_SLOT_ID(DEV_ID)]->queue_info[QUEUE_ID].tab_down.start_phy_addr
+	+ INDEX * p_dpp_dtb_mgr[ZXDH_DEV_SLOT_ID(DEV_ID)]->queue_info[QUEUE_ID].tab_down.item_size;
 }
 
 #define ZXDH_DTB_TAB_DOWN_PHY_ADDR_GET(DEV_ID, QUEUE_ID, INDEX)   \
@@ -432,8 +442,8 @@ static inline uint64_t
 zxdh_np_dtb_tab_up_phy_addr_get(uint32_t DEV_ID, uint32_t QUEUE_ID,
 	uint32_t INDEX)
 {
-	return p_dpp_dtb_mgr[DEV_ID]->queue_info[QUEUE_ID].tab_up.start_phy_addr +
-		INDEX * p_dpp_dtb_mgr[DEV_ID]->queue_info[QUEUE_ID].tab_up.item_size;
+	return p_dpp_dtb_mgr[ZXDH_DEV_SLOT_ID(DEV_ID)]->queue_info[QUEUE_ID].tab_up.start_phy_addr
+	+ INDEX * p_dpp_dtb_mgr[ZXDH_DEV_SLOT_ID(DEV_ID)]->queue_info[QUEUE_ID].tab_up.item_size;
 }
 
 #define ZXDH_DTB_TAB_UP_PHY_ADDR_GET(DEV_ID, QUEUE_ID, INDEX)	 \
@@ -517,7 +527,8 @@ zxdh_np_get_tn_color(ZXDH_RB_TN *p_tn)
 
 #define ZXDH_ACL_KEYSIZE_GET(key_mode) (2 * ZXDH_ETCAM_ENTRY_SIZE_GET(key_mode))
 
-#define GET_HASH_TBL_ID_INFO(dev_id, fun_id, tbl_id) (&g_tbl_id_info[dev_id][fun_id][tbl_id])
+#define GET_HASH_TBL_ID_INFO(dev_id, fun_id, tbl_id) \
+	(&g_tbl_id_info[ZXDH_DEV_SLOT_ID(dev_id)][fun_id][tbl_id])
 
 #define ZXDH_GET_HASH_TBL_ID(p_key)    ((p_key)[0] & 0x1F)
 
@@ -1830,25 +1841,34 @@ static void
 zxdh_np_dev_vport_get(uint32_t dev_id, uint32_t *vport)
 {
 	ZXDH_DEV_MGR_T *p_dev_mgr = &g_dev_mgr;
-	ZXDH_DEV_CFG_T *p_dev_info = p_dev_mgr->p_dev_array[dev_id];
+	ZXDH_DEV_CFG_T *p_dev_info = p_dev_mgr->p_dev_array[ZXDH_DEV_SLOT_ID(dev_id)];
 
-	*vport = p_dev_info->vport;
+	*vport = p_dev_info->vport[ZXDH_DEV_PF_INDEX(dev_id)];
 }
 
 static void
 zxdh_np_dev_agent_addr_get(uint32_t dev_id, uint64_t *agent_addr)
 {
 	ZXDH_DEV_MGR_T *p_dev_mgr = &g_dev_mgr;
-	ZXDH_DEV_CFG_T *p_dev_info = p_dev_mgr->p_dev_array[dev_id];
+	ZXDH_DEV_CFG_T *p_dev_info = p_dev_mgr->p_dev_array[ZXDH_DEV_SLOT_ID(dev_id)];
 
-	*agent_addr = p_dev_info->agent_addr;
+	*agent_addr = p_dev_info->agent_addr[ZXDH_DEV_PF_INDEX(dev_id)];
+}
+
+static void
+zxdh_np_dev_bar_pcie_id_get(uint32_t dev_id, uint16_t *p_pcie_id)
+{
+	ZXDH_DEV_MGR_T *p_dev_mgr = &g_dev_mgr;
+	ZXDH_DEV_CFG_T *p_dev_info = p_dev_mgr->p_dev_array[ZXDH_DEV_SLOT_ID(dev_id)];
+
+	*p_pcie_id = p_dev_info->pcie_id[ZXDH_DEV_PF_INDEX(dev_id)];
 }
 
 static void
 zxdh_np_dev_fw_bar_msg_num_set(uint32_t dev_id, uint32_t bar_msg_num)
 {
 	ZXDH_DEV_MGR_T *p_dev_mgr = &g_dev_mgr;
-	ZXDH_DEV_CFG_T *p_dev_info = p_dev_mgr->p_dev_array[dev_id];
+	ZXDH_DEV_CFG_T *p_dev_info = p_dev_mgr->p_dev_array[ZXDH_DEV_SLOT_ID(dev_id)];
 
 	p_dev_info->fw_bar_msg_num = bar_msg_num;
 
@@ -1859,7 +1879,7 @@ static void
 zxdh_np_dev_fw_bar_msg_num_get(uint32_t dev_id, uint32_t *bar_msg_num)
 {
 	ZXDH_DEV_MGR_T *p_dev_mgr = &g_dev_mgr;
-	ZXDH_DEV_CFG_T *p_dev_info = p_dev_mgr->p_dev_array[dev_id];
+	ZXDH_DEV_CFG_T *p_dev_info = p_dev_mgr->p_dev_array[ZXDH_DEV_SLOT_ID(dev_id)];
 
 	*bar_msg_num = p_dev_info->fw_bar_msg_num;
 }
@@ -1868,7 +1888,7 @@ static uint32_t
 zxdh_np_dev_opr_spinlock_get(uint32_t dev_id, uint32_t type, ZXDH_SPINLOCK_T **p_spinlock_out)
 {
 	ZXDH_DEV_MGR_T *p_dev_mgr = &g_dev_mgr;
-	ZXDH_DEV_CFG_T *p_dev_info = p_dev_mgr->p_dev_array[dev_id];
+	ZXDH_DEV_CFG_T *p_dev_info = p_dev_mgr->p_dev_array[ZXDH_DEV_SLOT_ID(dev_id)];
 
 	if (p_dev_info == NULL) {
 		PMD_DRV_LOG(ERR, "Get dev_info[ %u ] fail!", dev_id);
@@ -1895,7 +1915,7 @@ zxdh_np_dev_dtb_opr_spinlock_get(uint32_t dev_id, uint32_t type,
 			uint32_t index, ZXDH_SPINLOCK_T **p_spinlock_out)
 {
 	ZXDH_DEV_MGR_T *p_dev_mgr = &g_dev_mgr;
-	ZXDH_DEV_CFG_T *p_dev_info = p_dev_mgr->p_dev_array[dev_id];
+	ZXDH_DEV_CFG_T *p_dev_info = p_dev_mgr->p_dev_array[ZXDH_DEV_SLOT_ID(dev_id)];
 
 	switch (type) {
 	case ZXDH_DEV_SPINLOCK_T_DTB:
@@ -1914,7 +1934,7 @@ zxdh_np_dev_hash_opr_spinlock_get(uint32_t dev_id,
 	uint32_t fun_id, ZXDH_SPINLOCK_T **p_spinlock_out)
 {
 	ZXDH_DEV_MGR_T *p_dev_mgr = &g_dev_mgr;
-	ZXDH_DEV_CFG_T *p_dev_info = p_dev_mgr->p_dev_array[dev_id];
+	ZXDH_DEV_CFG_T *p_dev_info = p_dev_mgr->p_dev_array[ZXDH_DEV_SLOT_ID(dev_id)];
 
 	*p_spinlock_out = &p_dev_info->hash_spinlock[fun_id];
 }
@@ -2000,12 +2020,12 @@ zxdh_np_dev_get_pcie_addr(uint32_t dev_id)
 	ZXDH_DEV_CFG_T *p_dev_info = NULL;
 
 	p_dev_mgr = &g_dev_mgr;
-	p_dev_info = p_dev_mgr->p_dev_array[dev_id];
+	p_dev_info = p_dev_mgr->p_dev_array[ZXDH_DEV_SLOT_ID(dev_id)];
 
 	if (p_dev_info == NULL)
 		return ZXDH_DEV_TYPE_INVALID;
 
-	return p_dev_info->pcie_addr;
+	return p_dev_info->pcie_addr[ZXDH_DEV_PF_INDEX(dev_id)];
 }
 
 static void
@@ -2322,10 +2342,10 @@ zxdh_np_dev_add(uint32_t  dev_id, ZXDH_DEV_TYPE_E dev_type,
 		return ZXDH_RC_DEV_MGR_NOT_INIT;
 	}
 
-	if (p_dev_mgr->p_dev_array[dev_id] != NULL) {
+	if (p_dev_mgr->p_dev_array[ZXDH_DEV_SLOT_ID(dev_id)] != NULL) {
 		/* device is already exist. */
 		PMD_DRV_LOG(ERR, "Device is added again");
-		p_dev_info = p_dev_mgr->p_dev_array[dev_id];
+		p_dev_info = p_dev_mgr->p_dev_array[ZXDH_DEV_SLOT_ID(dev_id)];
 	} else {
 		/* device is new. */
 		p_dev_info = rte_malloc(NULL, sizeof(ZXDH_DEV_CFG_T), 0);
@@ -2333,14 +2353,15 @@ zxdh_np_dev_add(uint32_t  dev_id, ZXDH_DEV_TYPE_E dev_type,
 			PMD_DRV_LOG(ERR, "malloc memory failed");
 			return ZXDH_PAR_CHK_POINT_NULL;
 		}
-		p_dev_mgr->p_dev_array[dev_id] = p_dev_info;
+		p_dev_mgr->p_dev_array[ZXDH_DEV_SLOT_ID(dev_id)] = p_dev_info;
 		p_dev_mgr->device_num++;
 	}
 
-	p_dev_info->device_id   = dev_id;
+	p_dev_info->slot_id   = ZXDH_DEV_SLOT_ID(dev_id);
 	p_dev_info->dev_type    = dev_type;
 	p_dev_info->access_type = access_type;
-	p_dev_info->pcie_addr   = pcie_addr;
+	p_dev_info->pcie_addr[ZXDH_DEV_PF_INDEX(dev_id)] = pcie_addr;
+	p_dev_info->pcie_id[ZXDH_DEV_PF_INDEX(dev_id)] = ZXDH_DEV_PCIE_ID(dev_id);
 	p_dev_info->riscv_addr   = riscv_addr;
 	p_dev_info->dma_vir_addr = dma_vir_addr;
 	p_dev_info->dma_phy_addr = dma_phy_addr;
@@ -2368,7 +2389,7 @@ zxdh_np_dev_agent_status_set(uint32_t dev_id, uint32_t agent_flag)
 	ZXDH_DEV_CFG_T *p_dev_info = NULL;
 
 	p_dev_mgr = &g_dev_mgr;
-	p_dev_info = p_dev_mgr->p_dev_array[dev_id];
+	p_dev_info = p_dev_mgr->p_dev_array[ZXDH_DEV_SLOT_ID(dev_id)];
 
 	if (p_dev_info == NULL)
 		return ZXDH_DEV_TYPE_INVALID;
@@ -2490,9 +2511,9 @@ zxdh_np_soft_sdt_tbl_set(uint32_t dev_id,
 						uint32_t table_type,
 						ZXDH_SDT_TBL_DATA_T *p_sdt_info)
 {
-	g_table_type[dev_id][sdt_no] = table_type;
-	g_sdt_info[dev_id][sdt_no].data_high32 = p_sdt_info->data_high32;
-	g_sdt_info[dev_id][sdt_no].data_low32  = p_sdt_info->data_low32;
+	g_table_type[ZXDH_DEV_SLOT_ID(dev_id)][sdt_no] = table_type;
+	g_sdt_info[ZXDH_DEV_SLOT_ID(dev_id)][sdt_no].data_high32 = p_sdt_info->data_high32;
+	g_sdt_info[ZXDH_DEV_SLOT_ID(dev_id)][sdt_no].data_low32  = p_sdt_info->data_low32;
 }
 
 static uint32_t
@@ -2666,12 +2687,13 @@ zxdh_np_ppu_parse_cls_bitmap(uint32_t dev_id,
 
 	for (cls_id = 0; cls_id < ZXDH_PPU_CLUSTER_NUM; cls_id++) {
 		cls_use = (bitmap >> cls_id) & 0x1;
-		g_ppu_cls_bit_map[dev_id].cls_use[cls_id] = cls_use;
+		g_ppu_cls_bit_map[ZXDH_DEV_SLOT_ID(dev_id)].cls_use[cls_id] = cls_use;
 	}
 
 	for (mem_id = 0; mem_id < ZXDH_PPU_INSTR_MEM_NUM; mem_id++) {
 		instr_mem = (bitmap >> (mem_id * 2)) & 0x3;
-		g_ppu_cls_bit_map[dev_id].instr_mem[mem_id] = ((instr_mem > 0) ? 1 : 0);
+		g_ppu_cls_bit_map[ZXDH_DEV_SLOT_ID(dev_id)].instr_mem[mem_id] =
+		((instr_mem > 0) ? 1 : 0);
 	}
 }
 
@@ -2731,6 +2753,7 @@ zxdh_np_agent_channel_sync_send(uint32_t dev_id,
 	uint8_t *reply_ptr = NULL;
 	uint16_t reply_msg_len = 0;
 	uint64_t agent_addr = 0;
+	uint16_t bar_pcie_id = 0;
 
 	ret = zxdh_np_agent_bar_msg_check(dev_id, p_msg);
 	if (ret != ZXDH_OK) {
@@ -2740,6 +2763,7 @@ zxdh_np_agent_channel_sync_send(uint32_t dev_id,
 
 	zxdh_np_dev_vport_get(dev_id, &vport);
 	zxdh_np_dev_agent_addr_get(dev_id, &agent_addr);
+	zxdh_np_dev_bar_pcie_id_get(dev_id, &bar_pcie_id);
 
 	if (ZXDH_IS_PF(vport))
 		in.src = ZXDH_MSG_CHAN_END_PF;
@@ -2751,6 +2775,7 @@ zxdh_np_agent_channel_sync_send(uint32_t dev_id,
 	in.payload_len = p_msg->msg_len;
 	in.dst = ZXDH_MSG_CHAN_END_RISC;
 	in.module_id = ZXDH_BAR_MDOULE_NPSDK;
+	in.src_pcieid = bar_pcie_id;
 
 	recv_buffer = rte_zmalloc(NULL, rep_len + ZXDH_CHANNEL_REPS_LEN, 0);
 	if (recv_buffer == NULL) {
@@ -3124,23 +3149,23 @@ zxdh_np_agent_channel_acl_index_release(uint32_t dev_id, uint32_t rel_type,
 static ZXDH_DTB_MGR_T *
 zxdh_np_dtb_mgr_get(uint32_t dev_id)
 {
-	if (dev_id >= ZXDH_DEV_CHANNEL_MAX)
+	if (ZXDH_DEV_SLOT_ID(dev_id) >= ZXDH_DEV_CHANNEL_MAX)
 		return NULL;
 	else
-		return p_dpp_dtb_mgr[dev_id];
+		return p_dpp_dtb_mgr[ZXDH_DEV_SLOT_ID(dev_id)];
 }
 
 static uint32_t
 zxdh_np_dtb_mgr_create(uint32_t dev_id)
 {
-	if (p_dpp_dtb_mgr[dev_id] != NULL) {
+	if (p_dpp_dtb_mgr[ZXDH_DEV_SLOT_ID(dev_id)] != NULL) {
 		PMD_DRV_LOG(ERR, "ErrorCode[0x%x]: Dma Manager"
 			" is exist!!!", ZXDH_RC_DTB_MGR_EXIST);
 		return ZXDH_RC_DTB_MGR_EXIST;
 	}
 
-	p_dpp_dtb_mgr[dev_id] = rte_zmalloc(NULL, sizeof(ZXDH_DTB_MGR_T), 0);
-	if (p_dpp_dtb_mgr[dev_id] == NULL) {
+	p_dpp_dtb_mgr[ZXDH_DEV_SLOT_ID(dev_id)] = rte_zmalloc(NULL, sizeof(ZXDH_DTB_MGR_T), 0);
+	if (p_dpp_dtb_mgr[ZXDH_DEV_SLOT_ID(dev_id)] == NULL) {
 		PMD_DRV_LOG(ERR, "malloc memory failed");
 		return ZXDH_PAR_CHK_POINT_NULL;
 	}
@@ -3153,7 +3178,7 @@ zxdh_np_dtb_soft_init(uint32_t dev_id)
 {
 	ZXDH_DTB_MGR_T *p_dtb_mgr = NULL;
 
-	if (dev_id >= ZXDH_DEV_CHANNEL_MAX)
+	if (ZXDH_DEV_SLOT_ID(dev_id) >= ZXDH_DEV_CHANNEL_MAX)
 		return 1;
 
 	p_dtb_mgr = zxdh_np_dtb_mgr_get(dev_id);
@@ -3220,8 +3245,8 @@ zxdh_np_dev_vport_set(uint32_t dev_id, uint32_t vport)
 	ZXDH_DEV_CFG_T *p_dev_info = NULL;
 
 	p_dev_mgr =  &g_dev_mgr;
-	p_dev_info = p_dev_mgr->p_dev_array[dev_id];
-	p_dev_info->vport = vport;
+	p_dev_info = p_dev_mgr->p_dev_array[ZXDH_DEV_SLOT_ID(dev_id)];
+	p_dev_info->vport[ZXDH_DEV_PF_INDEX(dev_id)] = vport;
 }
 
 static void
@@ -3231,8 +3256,8 @@ zxdh_np_dev_agent_addr_set(uint32_t dev_id, uint64_t agent_addr)
 	ZXDH_DEV_CFG_T *p_dev_info = NULL;
 
 	p_dev_mgr =  &g_dev_mgr;
-	p_dev_info = p_dev_mgr->p_dev_array[dev_id];
-	p_dev_info->agent_addr = agent_addr;
+	p_dev_info = p_dev_mgr->p_dev_array[ZXDH_DEV_SLOT_ID(dev_id)];
+	p_dev_info->agent_addr[ZXDH_DEV_PF_INDEX(dev_id)] = agent_addr;
 }
 
 static uint64_t
@@ -3259,13 +3284,13 @@ zxdh_np_pf_fw_compatible_addr_set(uint32_t dev_id, uint64_t pcie_vir_baddr)
 
 	compatible_addr = zxdh_np_fw_compatible_addr_calc(pcie_vir_baddr, compatible_offset);
 
-	g_np_fw_compat_addr[dev_id] = compatible_addr;
+	g_np_fw_compat_addr[ZXDH_DEV_SLOT_ID(dev_id)] = compatible_addr;
 }
 
 static void
 zxdh_np_fw_compatible_addr_get(uint32_t dev_id, uint64_t *p_compatible_addr)
 {
-	*p_compatible_addr = g_np_fw_compat_addr[dev_id];
+	*p_compatible_addr = g_np_fw_compat_addr[ZXDH_DEV_SLOT_ID(dev_id)];
 }
 
 static void
@@ -3684,7 +3709,7 @@ zxdh_np_dtb_queue_id_free(uint32_t dev_id,
 	ZXDH_DTB_MGR_T *p_dtb_mgr = NULL;
 	uint32_t rc;
 
-	p_dtb_mgr = p_dpp_dtb_mgr[dev_id];
+	p_dtb_mgr = p_dpp_dtb_mgr[ZXDH_DEV_SLOT_ID(dev_id)];
 	if (p_dtb_mgr == NULL)
 		return 1;
 
@@ -3706,13 +3731,13 @@ zxdh_np_dtb_queue_id_free(uint32_t dev_id,
 static ZXDH_RB_CFG *
 zxdh_np_dtb_dump_addr_rb_get(uint32_t dev_id, uint32_t queue_id)
 {
-	return g_dtb_dump_addr_rb[dev_id][queue_id];
+	return g_dtb_dump_addr_rb[ZXDH_DEV_SLOT_ID(dev_id)][queue_id];
 }
 
 static uint32_t
 zxdh_np_dtb_dump_addr_rb_set(uint32_t dev_id, uint32_t queue_id, ZXDH_RB_CFG *p_dump_addr_rb)
 {
-	g_dtb_dump_addr_rb[dev_id][queue_id] = p_dump_addr_rb;
+	g_dtb_dump_addr_rb[ZXDH_DEV_SLOT_ID(dev_id)][queue_id] = p_dump_addr_rb;
 	return ZXDH_OK;
 }
 
@@ -3880,9 +3905,9 @@ zxdh_np_dtb_queue_release(uint32_t devid,
 static void
 zxdh_np_dtb_mgr_destroy(uint32_t dev_id)
 {
-	if (p_dpp_dtb_mgr[dev_id] != NULL) {
-		rte_free(p_dpp_dtb_mgr[dev_id]);
-		p_dpp_dtb_mgr[dev_id] = NULL;
+	if (p_dpp_dtb_mgr[ZXDH_DEV_SLOT_ID(dev_id)] != NULL) {
+		rte_free(p_dpp_dtb_mgr[ZXDH_DEV_SLOT_ID(dev_id)]);
+		p_dpp_dtb_mgr[ZXDH_DEV_SLOT_ID(dev_id)] = NULL;
 	}
 }
 
@@ -3909,11 +3934,11 @@ zxdh_np_dev_del(uint32_t dev_id)
 	ZXDH_DEV_MGR_T *p_dev_mgr  = NULL;
 
 	p_dev_mgr = &g_dev_mgr;
-	p_dev_info = p_dev_mgr->p_dev_array[dev_id];
+	p_dev_info = p_dev_mgr->p_dev_array[ZXDH_DEV_SLOT_ID(dev_id)];
 
 	if (p_dev_info != NULL) {
 		rte_free(p_dev_info);
-		p_dev_mgr->p_dev_array[dev_id] = NULL;
+		p_dev_mgr->p_dev_array[ZXDH_DEV_SLOT_ID(dev_id)] = NULL;
 		p_dev_mgr->device_num--;
 	}
 }
@@ -4057,7 +4082,7 @@ zxdh_np_one_hash_soft_uninstall(uint32_t dev_id, uint32_t hash_id)
 	uint32_t i = 0;
 
 	ZXDH_D_NODE *p_node = NULL;
-	ZXDH_SE_CFG *p_se_cfg = dpp_se_cfg[dev_id];
+	ZXDH_SE_CFG *p_se_cfg = dpp_se_cfg[ZXDH_DEV_SLOT_ID(dev_id)];
 	ZXDH_RB_TN *p_rb_tn = NULL;
 	ZXDH_RB_TN *p_rb_tn_rtn = NULL;
 	HASH_DDR_CFG *p_rbkey = NULL;
@@ -4111,7 +4136,7 @@ zxdh_np_one_hash_soft_uninstall(uint32_t dev_id, uint32_t hash_id)
 	rc = zxdh_np_se_fun_deinit(p_se_cfg, (hash_id & 0xff), ZXDH_FUN_HASH);
 	ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_se_fun_deinit");
 
-	memset(g_tbl_id_info[dev_id][hash_id], 0,
+	memset(g_tbl_id_info[ZXDH_DEV_SLOT_ID(dev_id)][hash_id], 0,
 		ZXDH_HASH_TBL_ID_NUM * sizeof(ZXDH_HASH_TBL_ID_INFO));
 
 	return rc;
@@ -4134,13 +4159,13 @@ zxdh_np_hash_soft_uninstall(uint32_t dev_id)
 static uint32_t
 zxdh_np_acl_cfg_get(uint32_t dev_id, ZXDH_ACL_CFG_EX_T **p_acl_cfg)
 {
-	if (g_p_acl_ex_cfg[dev_id] == NULL) {
+	if (g_p_acl_ex_cfg[ZXDH_DEV_SLOT_ID(dev_id)] == NULL) {
 		PMD_DRV_LOG(ERR, "etcam_is not init!");
 		RTE_ASSERT(0);
 		return ZXDH_ACL_RC_ETCAMID_NOT_INIT;
 	}
 
-	*p_acl_cfg = g_p_acl_ex_cfg[dev_id];
+	*p_acl_cfg = g_p_acl_ex_cfg[ZXDH_DEV_SLOT_ID(dev_id)];
 
 	return ZXDH_OK;
 }
@@ -4190,6 +4215,16 @@ zxdh_np_acl_res_destroy(uint32_t dev_id)
 	return ZXDH_OK;
 }
 
+static void
+zxdh_np_apt_hash_global_res_uninit(uint32_t dev_id)
+{
+	if (g_apt_se_cfg[ZXDH_DEV_SLOT_ID(dev_id)] != NULL) {
+		rte_free(g_apt_se_cfg[ZXDH_DEV_SLOT_ID(dev_id)]);
+		g_apt_se_cfg[ZXDH_DEV_SLOT_ID(dev_id)] = NULL;
+		dpp_se_cfg[ZXDH_DEV_SLOT_ID(dev_id)] = NULL;
+	}
+}
+
 int
 zxdh_np_online_uninit(uint32_t dev_id,
 			char *port_name,
@@ -4201,22 +4236,35 @@ zxdh_np_online_uninit(uint32_t dev_id,
 	if (rc != 0)
 		PMD_DRV_LOG(ERR, "dtb release port name %s queue id %u", port_name, queue_id);
 
+	rc = zxdh_np_soft_res_uninstall(dev_id);
+	if (rc != 0)
+		PMD_DRV_LOG(ERR, "zxdh_np_soft_res_uninstall failed");
+
+	return 0;
+}
+
+uint32_t
+zxdh_np_soft_res_uninstall(uint32_t dev_id)
+{
+	uint32_t rc;
+
 	rc = zxdh_np_hash_soft_uninstall(dev_id);
 	if (rc != ZXDH_OK)
 		PMD_DRV_LOG(ERR, "zxdh_np_hash_soft_uninstall error! ");
 
+	zxdh_np_apt_hash_global_res_uninit(dev_id);
 	zxdh_np_acl_res_destroy(dev_id);
 	zxdh_np_dtb_mgr_destroy(dev_id);
 	zxdh_np_sdt_mgr_destroy(dev_id);
 	zxdh_np_dev_del(dev_id);
 
-	return 0;
+	return rc;
 }
 
 static uint32_t
 zxdh_np_sdt_tbl_type_get(uint32_t dev_id, uint32_t sdt_no)
 {
-	return g_table_type[dev_id][sdt_no];
+	return g_table_type[ZXDH_DEV_SLOT_ID(dev_id)][sdt_no];
 }
 
 
@@ -4697,8 +4745,8 @@ zxdh_np_eram_dtb_len_get(uint32_t mode)
 static void
 zxdh_np_sdt_tbl_data_get(uint32_t dev_id, uint32_t sdt_no, ZXDH_SDT_TBL_DATA_T *p_sdt_data)
 {
-	p_sdt_data->data_high32 = g_sdt_info[dev_id][sdt_no].data_high32;
-	p_sdt_data->data_low32  = g_sdt_info[dev_id][sdt_no].data_low32;
+	p_sdt_data->data_high32 = g_sdt_info[ZXDH_DEV_SLOT_ID(dev_id)][sdt_no].data_high32;
+	p_sdt_data->data_low32  = g_sdt_info[ZXDH_DEV_SLOT_ID(dev_id)][sdt_no].data_low32;
 }
 
 static uint32_t
@@ -5196,8 +5244,10 @@ zxdh_np_dtb_tab_down_info_set(uint32_t dev_id,
 	item_info.cmd_type = 0;
 	item_info.int_en = int_flag;
 	item_info.data_len = data_len / 4;
-	phy_addr = p_dpp_dtb_mgr[dev_id]->queue_info[queue_id].tab_down.start_phy_addr +
-		item_index * p_dpp_dtb_mgr[dev_id]->queue_info[queue_id].tab_down.item_size;
+	phy_addr = p_dpp_dtb_mgr[ZXDH_DEV_SLOT_ID(dev_id)]->queue_info[queue_id].
+		tab_down.start_phy_addr +
+		item_index * p_dpp_dtb_mgr[ZXDH_DEV_SLOT_ID(dev_id)]->queue_info[queue_id].
+		tab_down.item_size;
 	item_info.data_hddr = ((phy_addr >> 4) >> 32) & 0xffffffff;
 	item_info.data_laddr = (phy_addr >> 4) & 0xffffffff;
 
@@ -5368,7 +5418,7 @@ zxdh_np_hash_get_hash_info_from_sdt(uint32_t dev_id,
 	p_hash_entry_cfg->rst_by_size = ZXDH_GET_RST_SIZE(p_hash_entry_cfg->key_type,
 		p_hash_entry_cfg->actu_key_size);
 
-	p_se_cfg = dpp_se_cfg[dev_id];
+	p_se_cfg = dpp_se_cfg[ZXDH_DEV_SLOT_ID(dev_id)];
 	p_hash_entry_cfg->p_se_cfg = p_se_cfg;
 
 	p_func_info = ZXDH_GET_FUN_INFO(p_se_cfg, p_hash_entry_cfg->fun_id);
@@ -6048,7 +6098,7 @@ zxdh_np_apt_get_sdt_partner(uint32_t dev_id, uint32_t sdt_no)
 {
 	SE_APT_CALLBACK_T *p_apt_callback = NULL;
 
-	p_apt_callback = &g_apt_se_callback[dev_id][sdt_no];
+	p_apt_callback = &g_apt_se_callback[ZXDH_DEV_SLOT_ID(dev_id)][sdt_no];
 
 	if (p_apt_callback->table_type == ZXDH_SDT_TBLT_HASH)
 		return  p_apt_callback->se_func_info.hash_func.sdt_partner;
@@ -6639,10 +6689,10 @@ zxdh_np_stat_cfg_soft_get(uint32_t dev_id,
 {
 	ZXDH_COMM_CHECK_DEV_POINT(dev_id, p_stat_cfg);
 
-	p_stat_cfg->ddr_base_addr = g_ppu_stat_cfg[dev_id].ddr_base_addr;
-	p_stat_cfg->eram_baddr = g_ppu_stat_cfg[dev_id].eram_baddr;
-	p_stat_cfg->eram_depth = g_ppu_stat_cfg[dev_id].eram_depth;
-	p_stat_cfg->ppu_addr_offset = g_ppu_stat_cfg[dev_id].ppu_addr_offset;
+	p_stat_cfg->ddr_base_addr = g_ppu_stat_cfg[ZXDH_DEV_SLOT_ID(dev_id)].ddr_base_addr;
+	p_stat_cfg->eram_baddr = g_ppu_stat_cfg[ZXDH_DEV_SLOT_ID(dev_id)].eram_baddr;
+	p_stat_cfg->eram_depth = g_ppu_stat_cfg[ZXDH_DEV_SLOT_ID(dev_id)].eram_depth;
+	p_stat_cfg->ppu_addr_offset = g_ppu_stat_cfg[ZXDH_DEV_SLOT_ID(dev_id)].ppu_addr_offset;
 }
 
 static uint32_t
@@ -8809,7 +8859,7 @@ static void *
 zxdh_np_dev_get_se_res_ptr(uint32_t dev_id, uint32_t type)
 {
 	ZXDH_DEV_MGR_T *p_dev_mgr = &g_dev_mgr;
-	ZXDH_DEV_CFG_T *p_dev_info = p_dev_mgr->p_dev_array[dev_id];
+	ZXDH_DEV_CFG_T *p_dev_info = p_dev_mgr->p_dev_array[ZXDH_DEV_SLOT_ID(dev_id)];
 
 	if (type == ZXDH_SE_STD_NIC_RES_TYPE)
 		return (void *)&p_dev_info->dev_apt_se_tbl_res.std_nic_res;
@@ -8872,7 +8922,7 @@ zxdh_np_se_init_ex(uint32_t dev_id, ZXDH_SE_CFG *p_se_cfg)
 	ZXDH_SE_ZBLK_CFG *p_zblk_cfg = NULL;
 	ZXDH_SE_ZCELL_CFG *p_zcell_cfg = NULL;
 
-	if (dpp_se_cfg[dev_id] != NULL) {
+	if (dpp_se_cfg[ZXDH_DEV_SLOT_ID(dev_id)] != NULL) {
 		PMD_DRV_LOG(DEBUG, "SE global config is already initialized.");
 		return ZXDH_OK;
 	}
@@ -8880,7 +8930,7 @@ zxdh_np_se_init_ex(uint32_t dev_id, ZXDH_SE_CFG *p_se_cfg)
 	memset(p_se_cfg, 0, sizeof(ZXDH_SE_CFG));
 
 	p_se_cfg->dev_id = dev_id;
-	dpp_se_cfg[p_se_cfg->dev_id] = p_se_cfg;
+	dpp_se_cfg[ZXDH_DEV_SLOT_ID(p_se_cfg->dev_id)] = p_se_cfg;
 
 	p_se_cfg->p_as_rslt_wrt_fun = NULL;
 	p_se_cfg->p_client = ZXDH_COMM_VAL_TO_PTR(dev_id);
@@ -8913,16 +8963,16 @@ zxdh_np_se_init_ex(uint32_t dev_id, ZXDH_SE_CFG *p_se_cfg)
 static uint32_t
 zxdh_np_apt_hash_global_res_init(uint32_t dev_id)
 {
-	if (g_apt_se_cfg[dev_id] == NULL) {
-		g_apt_se_cfg[dev_id] = rte_zmalloc(NULL, sizeof(ZXDH_SE_CFG), 0);
-		if (g_apt_se_cfg[dev_id] == NULL) {
+	if (g_apt_se_cfg[ZXDH_DEV_SLOT_ID(dev_id)] == NULL) {
+		g_apt_se_cfg[ZXDH_DEV_SLOT_ID(dev_id)] = rte_zmalloc(NULL, sizeof(ZXDH_SE_CFG), 0);
+		if (g_apt_se_cfg[ZXDH_DEV_SLOT_ID(dev_id)] == NULL) {
 			PMD_DRV_LOG(ERR, "malloc memory failed");
 			return ZXDH_PAR_CHK_POINT_NULL;
 		}
 
-		zxdh_np_se_init_ex(dev_id, g_apt_se_cfg[dev_id]);
+		zxdh_np_se_init_ex(dev_id, g_apt_se_cfg[ZXDH_DEV_SLOT_ID(dev_id)]);
 
-		g_apt_se_cfg[dev_id]->p_client = ZXDH_COMM_VAL_TO_PTR(dev_id);
+		g_apt_se_cfg[ZXDH_DEV_SLOT_ID(dev_id)]->p_client = ZXDH_COMM_VAL_TO_PTR(dev_id);
 	}
 
 	return ZXDH_OK;
@@ -9204,7 +9254,7 @@ zxdh_np_hash_init(ZXDH_SE_CFG *p_se_cfg,
 	ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_comm_rb_init");
 
 	for (i = 0; i < zblk_num; i++)
-		g_hash_zblk_idx[dev_id][fun_id][i] = zblk_idx[i];
+		g_hash_zblk_idx[ZXDH_DEV_SLOT_ID(dev_id)][fun_id][i] = zblk_idx[i];
 
 	return rc;
 }
@@ -9219,7 +9269,7 @@ zxdh_np_apt_hash_func_res_init(uint32_t dev_id, uint32_t func_num,
 	ZXDH_APT_HASH_FUNC_RES_T *p_hash_func_res_temp = NULL;
 	ZXDH_SE_CFG *p_se_cfg = NULL;
 
-	p_se_cfg = g_apt_se_cfg[dev_id];
+	p_se_cfg = g_apt_se_cfg[ZXDH_DEV_SLOT_ID(dev_id)];
 
 	for (index = 0; index < func_num; index++) {
 		memset(zblk_idx, 0, sizeof(zblk_idx));
@@ -9474,7 +9524,7 @@ zxdh_np_apt_hash_bulk_res_init(uint32_t dev_id, uint32_t bulk_num,
 	ZXDH_HASH_DDR_RESC_CFG_T ddr_resc_cfg = {0};
 	ZXDH_SE_CFG *p_se_cfg = NULL;
 
-	p_se_cfg = g_apt_se_cfg[dev_id];
+	p_se_cfg = g_apt_se_cfg[ZXDH_DEV_SLOT_ID(dev_id)];
 
 	for (index = 0; index < bulk_num; index++) {
 		memset(&ddr_resc_cfg, 0, sizeof(ZXDH_HASH_DDR_RESC_CFG_T));
@@ -9504,7 +9554,7 @@ zxdh_np_apt_set_callback(uint32_t dev_id, uint32_t sdt_no, uint32_t table_type,
 {
 	SE_APT_CALLBACK_T *apt_func = NULL;
 
-	apt_func = &g_apt_se_callback[dev_id][sdt_no];
+	apt_func = &g_apt_se_callback[ZXDH_DEV_SLOT_ID(dev_id)][sdt_no];
 
 	apt_func->sdt_no = sdt_no;
 	apt_func->table_type = table_type;
@@ -9598,7 +9648,7 @@ zxdh_np_apt_hash_tbl_res_init(uint32_t dev_id, uint32_t tbl_num,
 	ZXDH_APT_HASH_TABLE_T *p_hash_tbl_temp = NULL;
 	ZXDH_SE_CFG *p_se_cfg = NULL;
 
-	p_se_cfg = g_apt_se_cfg[dev_id];
+	p_se_cfg = g_apt_se_cfg[ZXDH_DEV_SLOT_ID(dev_id)];
 
 	for (index = 0; index < tbl_num; index++) {
 		p_hash_tbl_temp = p_hash_tbl + index;
@@ -9688,7 +9738,7 @@ zxdh_np_acl_cfg_init_ex(ZXDH_ACL_CFG_EX_T *p_acl_cfg,
 	p_acl_cfg->dev_id = (uint32_t)(ZXDH_COMM_PTR_TO_VAL(p_acl_cfg->p_client) & 0xFFFFFFFF);
 	p_acl_cfg->flags = flags;
 
-	g_p_acl_ex_cfg[p_acl_cfg->dev_id] = p_acl_cfg;
+	g_p_acl_ex_cfg[ZXDH_DEV_SLOT_ID(p_acl_cfg->dev_id)] = p_acl_cfg;
 
 	if (flags & ZXDH_ACL_FLAG_ETCAM0_EN) {
 		p_acl_cfg->acl_etcamids.is_valid = 1;
@@ -9726,7 +9776,7 @@ zxdh_np_acl_tbl_init_ex(ZXDH_ACL_CFG_EX_T *p_acl_cfg,
 	uint32_t rc = 0;
 	uint32_t i = 0;
 
-	g_p_acl_ex_cfg[p_acl_cfg->dev_id] = p_acl_cfg;
+	g_p_acl_ex_cfg[ZXDH_DEV_SLOT_ID(p_acl_cfg->dev_id)] = p_acl_cfg;
 
 	if (p_acl_cfg->acl_tbls[table_id].is_used) {
 		PMD_DRV_LOG(ERR, "table_id[ %u ] is already used!", table_id);
@@ -9817,7 +9867,7 @@ zxdh_np_apt_acl_res_init(uint32_t dev_id, uint32_t tbl_num, ZXDH_APT_ACL_TABLE_T
 	uint8_t index = 0;
 	ZXDH_APT_ACL_TABLE_T *p_temp_acl_tbl = NULL;
 
-	rc = zxdh_np_acl_cfg_init_ex(&g_apt_acl_cfg[dev_id],
+	rc = zxdh_np_acl_cfg_init_ex(&g_apt_acl_cfg[ZXDH_DEV_SLOT_ID(dev_id)],
 						(void *)ZXDH_COMM_VAL_TO_PTR(dev_id),
 						ZXDH_ACL_FLAG_ETCAM0_EN,
 						NULL);
@@ -9832,7 +9882,7 @@ zxdh_np_apt_acl_res_init(uint32_t dev_id, uint32_t tbl_num, ZXDH_APT_ACL_TABLE_T
 						ZXDH_SDT_OPER_ADD);
 		ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_sdt_tbl_write");
 
-		 rc = zxdh_np_acl_tbl_init_ex(&g_apt_acl_cfg[dev_id],
+		 rc = zxdh_np_acl_tbl_init_ex(&g_apt_acl_cfg[ZXDH_DEV_SLOT_ID(dev_id)],
 					p_temp_acl_tbl->acl_sdt.etcam_table_id,
 					p_temp_acl_tbl->acl_sdt.as_en,
 					p_temp_acl_tbl->acl_res.entry_num,
@@ -9857,12 +9907,13 @@ zxdh_np_apt_acl_res_init(uint32_t dev_id, uint32_t tbl_num, ZXDH_APT_ACL_TABLE_T
 static void
 zxdh_np_apt_stat_res_init(uint32_t dev_id, uint32_t type, ZXDH_APT_STAT_RES_INIT_T *stat_res_init)
 {
-	g_ppu_stat_cfg[dev_id].eram_baddr = stat_res_init->eram_baddr;
-	g_ppu_stat_cfg[dev_id].eram_depth = stat_res_init->eram_depth;
+	g_ppu_stat_cfg[ZXDH_DEV_SLOT_ID(dev_id)].eram_baddr = stat_res_init->eram_baddr;
+	g_ppu_stat_cfg[ZXDH_DEV_SLOT_ID(dev_id)].eram_depth = stat_res_init->eram_depth;
 
 	if (type == ZXDH_SE_NON_STD_NIC_RES_TYPE) {
-		g_ppu_stat_cfg[dev_id].ddr_base_addr = stat_res_init->ddr_baddr;
-		g_ppu_stat_cfg[dev_id].ppu_addr_offset = stat_res_init->ppu_ddr_offset;
+		g_ppu_stat_cfg[ZXDH_DEV_SLOT_ID(dev_id)].ddr_base_addr = stat_res_init->ddr_baddr;
+		g_ppu_stat_cfg[ZXDH_DEV_SLOT_ID(dev_id)].ppu_addr_offset =
+			stat_res_init->ppu_ddr_offset;
 	}
 }
 
diff --git a/drivers/net/zxdh/zxdh_np.h b/drivers/net/zxdh/zxdh_np.h
index d2f9f68ca9..2e065b625f 100644
--- a/drivers/net/zxdh/zxdh_np.h
+++ b/drivers/net/zxdh/zxdh_np.h
@@ -15,9 +15,13 @@
 #define ZXDH_DISABLE                          (0)
 #define ZXDH_ENABLE                           (1)
 #define ZXDH_PORT_NAME_MAX                    (32)
-#define ZXDH_DEV_CHANNEL_MAX                  (2)
+#define ZXDH_DEV_CHANNEL_MAX                  (16)
 #define ZXDH_DEV_SDT_ID_MAX                   (256U)
-
+#define ZXDH_DEV_PF_NUM_MAX                   (8)
+#define ZXDH_DEV_SLOT_ID(DEVICE_ID)           ((DEVICE_ID) & (ZXDH_DEV_CHANNEL_MAX - 1))
+#define ZXDH_DEV_PCIE_ID(DEVICE_ID)           (((DEVICE_ID) >> 16) & 0xFFFF)
+#define ZXDH_DEV_VF_INDEX(DEVICE_ID)          (ZXDH_DEV_PCIE_ID(DEVICE_ID) & 0xFF)
+#define ZXDH_DEV_PF_INDEX(DEVICE_ID)          ((ZXDH_DEV_PCIE_ID(DEVICE_ID) >> 8) & 0x7)
 
 /*DTB*/
 #define ZXDH_DTB_QUEUE_ITEM_NUM_MAX           (32)
@@ -1130,18 +1134,19 @@ typedef struct zxdh_sys_init_ctrl_t {
 } ZXDH_SYS_INIT_CTRL_T;
 
 typedef struct dpp_dev_cfg_t {
-	uint32_t device_id;
+	uint32_t slot_id;
+	uint16_t pcie_id[ZXDH_DEV_PF_NUM_MAX];
 	ZXDH_DEV_TYPE_E dev_type;
 	uint32_t chip_ver;
 	uint32_t access_type;
 	uint32_t agent_flag;
-	uint32_t vport;
+	uint32_t vport[ZXDH_DEV_PF_NUM_MAX];
 	uint32_t fw_bar_msg_num;
-	uint64_t pcie_addr;
+	uint64_t pcie_addr[ZXDH_DEV_PF_NUM_MAX];
 	uint64_t riscv_addr;
 	uint64_t dma_vir_addr;
 	uint64_t dma_phy_addr;
-	uint64_t agent_addr;
+	uint64_t agent_addr[ZXDH_DEV_PF_NUM_MAX];
 	uint32_t init_flags[ZXDH_MODULE_INIT_MAX];
 	ZXDH_DEV_WRITE_FUNC p_pcie_write_fun;
 	ZXDH_DEV_READ_FUNC  p_pcie_read_fun;
@@ -1949,6 +1954,7 @@ int zxdh_np_dtb_stats_get(uint32_t dev_id,
 			ZXDH_STAT_CNT_MODE_E rd_mode,
 			uint32_t index,
 			uint32_t *p_data);
+uint32_t zxdh_np_soft_res_uninstall(uint32_t dev_id);
 uint32_t zxdh_np_stat_ppu_cnt_get_ex(uint32_t dev_id,
 			ZXDH_STAT_CNT_MODE_E rd_mode,
 			uint32_t index,
diff --git a/drivers/net/zxdh/zxdh_tables.c b/drivers/net/zxdh/zxdh_tables.c
index 2d2dd26499..233d53a7e8 100644
--- a/drivers/net/zxdh/zxdh_tables.c
+++ b/drivers/net/zxdh/zxdh_tables.c
@@ -37,7 +37,7 @@ zxdh_set_port_attr(struct zxdh_hw *hw, uint16_t vport, struct zxdh_port_attr_tab
 	ZXDH_DTB_ERAM_ENTRY_INFO_T entry = {vfid, (uint32_t *)port_attr};
 	ZXDH_DTB_USER_ENTRY_T user_entry_write = {ZXDH_SDT_VPORT_ATT_TABLE, (void *)&entry};
 
-	ret = zxdh_np_dtb_table_entry_write(hw->slot_id,
+	ret = zxdh_np_dtb_table_entry_write(hw->dev_id,
 				dtb_data->queueid, 1, &user_entry_write);
 	if (ret != 0)
 		PMD_DRV_LOG(ERR, "write vport_att failed vfid:%d failed", vfid);
@@ -105,7 +105,7 @@ zxdh_port_attr_uninit(struct rte_eth_dev *dev)
 			.sdt_no = ZXDH_SDT_VPORT_ATT_TABLE,
 			.p_entry_data = (void *)&port_attr_entry
 		};
-		ret = zxdh_np_dtb_table_entry_delete(hw->slot_id, dtb_data->queueid, 1, &entry);
+		ret = zxdh_np_dtb_table_entry_delete(hw->dev_id, dtb_data->queueid, 1, &entry);
 		if (ret) {
 			PMD_DRV_LOG(ERR, "delete port attr table failed");
 			ret = -1;
@@ -147,7 +147,7 @@ int zxdh_panel_table_init(struct rte_eth_dev *dev)
 		.sdt_no = ZXDH_SDT_PANEL_ATT_TABLE,
 		.p_entry_data = (void *)&panel_entry
 	};
-	ret = zxdh_np_dtb_table_entry_write(hw->slot_id, dtb_data->queueid, 1, &entry);
+	ret = zxdh_np_dtb_table_entry_write(hw->dev_id, dtb_data->queueid, 1, &entry);
 
 	if (ret) {
 		PMD_DRV_LOG(ERR, "Insert eram-panel failed, code:%u", ret);
@@ -171,7 +171,7 @@ int zxdh_get_panel_attr(struct rte_eth_dev *dev, struct zxdh_panel_table *panel_
 		.sdt_no = ZXDH_SDT_PANEL_ATT_TABLE,
 		.p_entry_data = (void *)&panel_entry
 	};
-	int ret = zxdh_np_dtb_table_entry_get(hw->slot_id, dtb_data->queueid, &entry, 1);
+	int ret = zxdh_np_dtb_table_entry_get(hw->dev_id, dtb_data->queueid, &entry, 1);
 
 	if (ret != 0)
 		PMD_DRV_LOG(ERR, "get panel table failed");
@@ -193,7 +193,7 @@ int zxdh_set_panel_attr(struct rte_eth_dev *dev, struct zxdh_panel_table *panel_
 		.sdt_no = ZXDH_SDT_PANEL_ATT_TABLE,
 		.p_entry_data = (void *)&panel_entry
 	};
-	int ret = zxdh_np_dtb_table_entry_write(hw->slot_id, dtb_data->queueid, 1, &entry);
+	int ret = zxdh_np_dtb_table_entry_write(hw->dev_id, dtb_data->queueid, 1, &entry);
 
 	if (ret)
 		PMD_DRV_LOG(ERR, "Insert panel table failed");
@@ -211,7 +211,7 @@ zxdh_get_port_attr(struct zxdh_hw *hw, uint16_t vport, struct zxdh_port_attr_tab
 	ZXDH_DTB_USER_ENTRY_T user_entry_get = {ZXDH_SDT_VPORT_ATT_TABLE, &entry};
 	int ret;
 
-	ret = zxdh_np_dtb_table_entry_get(hw->slot_id, dtb_data->queueid, &user_entry_get, 1);
+	ret = zxdh_np_dtb_table_entry_get(hw->dev_id, dtb_data->queueid, &user_entry_get, 1);
 	if (ret != 0)
 		PMD_DRV_LOG(ERR, "get port_attr vfid:%d failed, ret:%d", vfid, ret);
 
@@ -230,7 +230,7 @@ zxdh_delete_port_attr(struct zxdh_hw *hw, uint16_t vport,
 		.sdt_no = ZXDH_SDT_VPORT_ATT_TABLE,
 		.p_entry_data = (void *)&entry
 	};
-	int ret = zxdh_np_dtb_table_entry_delete(hw->slot_id, dtb_data->queueid, 1, &user_entry);
+	int ret = zxdh_np_dtb_table_entry_delete(hw->dev_id, dtb_data->queueid, 1, &user_entry);
 	if (ret != 0)
 		PMD_DRV_LOG(ERR, "delete port attr failed, vfid:%u", vport_num.vfid);
 	return ret;
@@ -261,7 +261,7 @@ zxdh_add_mac_table(struct zxdh_hw *hw, uint16_t vport, struct rte_ether_addr *ad
 			.p_entry_data = (void *)&dtb_hash_entry
 		};
 
-		ret = zxdh_np_dtb_table_entry_get(hw->slot_id, hw->dev_sd->dtb_sd.queueid,
+		ret = zxdh_np_dtb_table_entry_get(hw->dev_id, hw->dev_sd->dtb_sd.queueid,
 				&entry_get, 1);
 		if (ret == 0) {
 			if (unicast_table.entry.hit_flag != 0 &&
@@ -277,7 +277,7 @@ zxdh_add_mac_table(struct zxdh_hw *hw, uint16_t vport, struct rte_ether_addr *ad
 
 		unicast_table.entry.vfid = rte_cpu_to_be_16(vfid);
 		unicast_table.entry.hit_flag = 1;
-		ret = zxdh_np_dtb_table_entry_write(hw->slot_id,
+		ret = zxdh_np_dtb_table_entry_write(hw->dev_id,
 					hw->dev_sd->dtb_sd.queueid, 1, &entry_get);
 		if (ret) {
 			PMD_DRV_LOG(ERR, "Insert mac_table failed");
@@ -298,7 +298,7 @@ zxdh_add_mac_table(struct zxdh_hw *hw, uint16_t vport, struct rte_ether_addr *ad
 				.p_entry_data = (void *)&dtb_hash_entry
 			};
 
-			ret = zxdh_np_dtb_table_entry_get(hw->slot_id, hw->dev_sd->dtb_sd.queueid,
+			ret = zxdh_np_dtb_table_entry_get(hw->dev_id, hw->dev_sd->dtb_sd.queueid,
 					&entry_get, 1);
 			uint8_t index = (vport_num.vfid % 64) / 32;
 			uint8_t value = (vport_num.vfid % 64) % 32;
@@ -330,7 +330,7 @@ zxdh_add_mac_table(struct zxdh_hw *hw, uint16_t vport, struct rte_ether_addr *ad
 						multicast_table.entry.mc_pf_enable = false;
 				}
 			}
-			ret = zxdh_np_dtb_table_entry_write(hw->slot_id, hw->dev_sd->dtb_sd.queueid,
+			ret = zxdh_np_dtb_table_entry_write(hw->dev_id, hw->dev_sd->dtb_sd.queueid,
 						1, &entry_get);
 			if (ret) {
 				PMD_DRV_LOG(ERR, "add mac_table failed, code:%d", ret);
@@ -368,7 +368,7 @@ zxdh_del_mac_table(struct zxdh_hw *hw, uint16_t vport, struct rte_ether_addr *ad
 			.sdt_no = ZXDH_UNICAST_MAC_HASH_INDEX(hash_search_idx),
 			.p_entry_data = (void *)&dtb_hash_entry
 		};
-		ret = zxdh_np_dtb_table_entry_get(hw->slot_id, hw->dev_sd->dtb_sd.queueid,
+		ret = zxdh_np_dtb_table_entry_get(hw->dev_id, hw->dev_sd->dtb_sd.queueid,
 				&entry_get, 1);
 		if (ret == 0) {
 			if (unicast_table.entry.hit_flag != 0 &&
@@ -377,7 +377,7 @@ zxdh_del_mac_table(struct zxdh_hw *hw, uint16_t vport, struct rte_ether_addr *ad
 			}
 		}
 
-		ret = zxdh_np_dtb_table_entry_delete(hw->slot_id, hw->dev_sd->dtb_sd.queueid,
+		ret = zxdh_np_dtb_table_entry_delete(hw->dev_id, hw->dev_sd->dtb_sd.queueid,
 				1, &entry_get);
 		if (ret) {
 			PMD_DRV_LOG(ERR, "delete l2_fwd_hash_table failed, code:%d", ret);
@@ -397,7 +397,7 @@ zxdh_del_mac_table(struct zxdh_hw *hw, uint16_t vport, struct rte_ether_addr *ad
 			.p_entry_data = (void *)&dtb_hash_entry
 		};
 
-		ret = zxdh_np_dtb_table_entry_get(hw->slot_id, hw->dev_sd->dtb_sd.queueid,
+		ret = zxdh_np_dtb_table_entry_get(hw->dev_id, hw->dev_sd->dtb_sd.queueid,
 				&entry_get, 1);
 		uint8_t index = (vport_num.vfid % 64) / 32;
 		uint8_t value = (vport_num.vfid % 64) % 32;
@@ -407,7 +407,7 @@ zxdh_del_mac_table(struct zxdh_hw *hw, uint16_t vport, struct rte_ether_addr *ad
 		else
 			multicast_table.entry.mc_pf_enable = 0;
 
-		ret = zxdh_np_dtb_table_entry_write(hw->slot_id, hw->dev_sd->dtb_sd.queueid,
+		ret = zxdh_np_dtb_table_entry_write(hw->dev_id, hw->dev_sd->dtb_sd.queueid,
 				1, &entry_get);
 		if (ret) {
 			PMD_DRV_LOG(ERR, "mac_addr_add mc_table failed, code:%d", ret);
@@ -427,7 +427,7 @@ zxdh_del_mac_table(struct zxdh_hw *hw, uint16_t vport, struct rte_ether_addr *ad
 				.p_entry_data = (void *)&dtb_hash_entry
 			};
 
-			ret = zxdh_np_dtb_table_entry_get(hw->slot_id, hw->dev_sd->dtb_sd.queueid,
+			ret = zxdh_np_dtb_table_entry_get(hw->dev_id, hw->dev_sd->dtb_sd.queueid,
 					&entry_get, 1);
 			if (multicast_table.entry.mc_bitmap[0] == 0 &&
 				multicast_table.entry.mc_bitmap[1] == 0 &&
@@ -452,7 +452,7 @@ zxdh_del_mac_table(struct zxdh_hw *hw, uint16_t vport, struct rte_ether_addr *ad
 					.p_entry_data = (void *)&dtb_hash_entry
 				};
 
-				ret = zxdh_np_dtb_table_entry_delete(hw->slot_id,
+				ret = zxdh_np_dtb_table_entry_delete(hw->dev_id,
 						hw->dev_sd->dtb_sd.queueid, 1, &entry_get);
 			}
 		}
@@ -484,7 +484,7 @@ zxdh_promisc_table_init(struct rte_eth_dev *dev)
 			.p_entry_data = (void *)&eram_brocast_entry
 		};
 
-		ret = zxdh_np_dtb_table_entry_write(hw->slot_id,
+		ret = zxdh_np_dtb_table_entry_write(hw->dev_id,
 					dtb_data->queueid, 1, &entry_brocast);
 		if (ret) {
 			PMD_DRV_LOG(ERR, "write brocast table failed");
@@ -501,7 +501,7 @@ zxdh_promisc_table_init(struct rte_eth_dev *dev)
 			.p_entry_data = (void *)&eram_uc_entry
 		};
 
-		ret = zxdh_np_dtb_table_entry_write(hw->slot_id,
+		ret = zxdh_np_dtb_table_entry_write(hw->dev_id,
 					dtb_data->queueid, 1, &entry_unicast);
 		if (ret) {
 			PMD_DRV_LOG(ERR, "write unicast table failed");
@@ -518,7 +518,7 @@ zxdh_promisc_table_init(struct rte_eth_dev *dev)
 			.p_entry_data = (void *)&eram_mc_entry
 		};
 
-		ret = zxdh_np_dtb_table_entry_write(hw->slot_id, dtb_data->queueid,
+		ret = zxdh_np_dtb_table_entry_write(hw->dev_id, dtb_data->queueid,
 					1, &entry_multicast);
 		if (ret) {
 			PMD_DRV_LOG(ERR, "write multicast table failed");
@@ -553,7 +553,7 @@ zxdh_promisc_table_uninit(struct rte_eth_dev *dev)
 			.p_entry_data = (void *)&eram_brocast_entry
 		};
 
-		ret = zxdh_np_dtb_table_entry_delete(hw->slot_id,
+		ret = zxdh_np_dtb_table_entry_delete(hw->dev_id,
 				dtb_data->queueid, 1, &entry_brocast);
 		if (ret) {
 			PMD_DRV_LOG(ERR, "write brocast table failed");
@@ -570,7 +570,7 @@ zxdh_promisc_table_uninit(struct rte_eth_dev *dev)
 			.p_entry_data = (void *)&eram_uc_entry
 		};
 
-		ret = zxdh_np_dtb_table_entry_delete(hw->slot_id,
+		ret = zxdh_np_dtb_table_entry_delete(hw->dev_id,
 				dtb_data->queueid, 1, &entry_unicast);
 		if (ret) {
 			PMD_DRV_LOG(ERR, "write unicast table failed");
@@ -587,7 +587,7 @@ zxdh_promisc_table_uninit(struct rte_eth_dev *dev)
 			.p_entry_data = (void *)&eram_mc_entry
 		};
 
-		ret = zxdh_np_dtb_table_entry_delete(hw->slot_id, dtb_data->queueid,
+		ret = zxdh_np_dtb_table_entry_delete(hw->dev_id, dtb_data->queueid,
 					1, &entry_multicast);
 		if (ret) {
 			PMD_DRV_LOG(ERR, "write multicast table failed");
@@ -617,7 +617,7 @@ zxdh_dev_unicast_table_set(struct zxdh_hw *hw, uint16_t vport, bool enable)
 		.p_entry_data = (void *)&uc_table_entry
 	};
 
-	ret = zxdh_np_dtb_table_entry_get(hw->slot_id, dtb_data->queueid, &entry, 1);
+	ret = zxdh_np_dtb_table_entry_get(hw->dev_id, dtb_data->queueid, &entry, 1);
 	if (ret) {
 		PMD_DRV_LOG(ERR, "unicast_table_get_failed:%d", vfid);
 		return -ret;
@@ -634,7 +634,7 @@ zxdh_dev_unicast_table_set(struct zxdh_hw *hw, uint16_t vport, bool enable)
 		uc_table.uc_flood_pf_enable = rte_be_to_cpu_32(ZXDH_TABLE_HIT_FLAG + (enable << 6));
 	}
 
-	ret = zxdh_np_dtb_table_entry_write(hw->slot_id, dtb_data->queueid, 1, &entry);
+	ret = zxdh_np_dtb_table_entry_write(hw->dev_id, dtb_data->queueid, 1, &entry);
 	if (ret) {
 		PMD_DRV_LOG(ERR, "unicast_table_set_failed:%d", vfid);
 		return -ret;
@@ -673,7 +673,7 @@ zxdh_dev_multicast_table_set(struct zxdh_hw *hw, uint16_t vport, bool enable)
 		.p_entry_data = (void *)&mc_table_entry
 	};
 
-	ret = zxdh_np_dtb_table_entry_get(hw->slot_id, dtb_data->queueid, &entry, 1);
+	ret = zxdh_np_dtb_table_entry_get(hw->dev_id, dtb_data->queueid, &entry, 1);
 	if (ret) {
 		PMD_DRV_LOG(ERR, "allmulti_table_get_failed:%d", hw->vfid);
 		return -ret;
@@ -690,7 +690,7 @@ zxdh_dev_multicast_table_set(struct zxdh_hw *hw, uint16_t vport, bool enable)
 	} else {
 		mc_table.mc_flood_pf_enable = rte_be_to_cpu_32(ZXDH_TABLE_HIT_FLAG + (enable << 6));
 	}
-	ret = zxdh_np_dtb_table_entry_write(hw->slot_id, dtb_data->queueid, 1, &entry);
+	ret = zxdh_np_dtb_table_entry_write(hw->dev_id, dtb_data->queueid, 1, &entry);
 	if (ret) {
 		PMD_DRV_LOG(ERR, "allmulti_table_set_failed:%d", hw->vfid);
 		return -ret;
@@ -725,7 +725,7 @@ zxdh_vlan_filter_table_init(struct zxdh_hw *hw, uint16_t vport)
 		};
 		ZXDH_DTB_USER_ENTRY_T user_entry = {ZXDH_SDT_VLAN_ATT_TABLE, &entry_data};
 
-		ret = zxdh_np_dtb_table_entry_write(hw->slot_id,
+		ret = zxdh_np_dtb_table_entry_write(hw->dev_id,
 					dtb_data->queueid, 1, &user_entry);
 		if (ret != 0) {
 			PMD_DRV_LOG(ERR,
@@ -761,7 +761,7 @@ zxdh_vlan_filter_table_set(struct zxdh_hw *hw, uint16_t vport, uint16_t vlan_id,
 	ZXDH_DTB_ERAM_ENTRY_INFO_T entry_data = {index, (uint32_t *)&vlan_table};
 	ZXDH_DTB_USER_ENTRY_T user_entry_get = {ZXDH_SDT_VLAN_ATT_TABLE, &entry_data};
 
-	ret = zxdh_np_dtb_table_entry_get(hw->slot_id, dtb_data->queueid, &user_entry_get, 1);
+	ret = zxdh_np_dtb_table_entry_get(hw->dev_id, dtb_data->queueid, &user_entry_get, 1);
 	if (ret) {
 		PMD_DRV_LOG(ERR, "get vlan table failed");
 		return -1;
@@ -787,7 +787,7 @@ zxdh_vlan_filter_table_set(struct zxdh_hw *hw, uint16_t vport, uint16_t vlan_id,
 		.p_entry_data = &entry_data
 	};
 
-	ret = zxdh_np_dtb_table_entry_write(hw->slot_id,
+	ret = zxdh_np_dtb_table_entry_write(hw->dev_id,
 				dtb_data->queueid, 1, &user_entry_write);
 	if (ret != 0) {
 		PMD_DRV_LOG(ERR, "write vlan table failed");
@@ -830,7 +830,7 @@ zxdh_rss_table_set(struct zxdh_hw *hw, uint16_t vport, struct zxdh_rss_reta *rss
 			.sdt_no = ZXDH_SDT_RSS_ATT_TABLE,
 			.p_entry_data = &entry
 		};
-		ret = zxdh_np_dtb_table_entry_write(hw->slot_id,
+		ret = zxdh_np_dtb_table_entry_write(hw->dev_id,
 					dtb_data->queueid, 1, &user_entry_write);
 		if (ret != 0) {
 			PMD_DRV_LOG(ERR, "write rss base qid failed vfid:%d", vfid);
@@ -853,7 +853,7 @@ zxdh_rss_table_get(struct zxdh_hw *hw, uint16_t vport, struct zxdh_rss_reta *rss
 		ZXDH_DTB_ERAM_ENTRY_INFO_T entry = {vfid * 32 + i, (uint32_t *)&rss_vqid};
 		ZXDH_DTB_USER_ENTRY_T user_entry = {ZXDH_SDT_RSS_ATT_TABLE, &entry};
 
-		ret = zxdh_np_dtb_table_entry_get(hw->slot_id,
+		ret = zxdh_np_dtb_table_entry_get(hw->dev_id,
 					dtb_data->queueid, &user_entry, 1);
 		if (ret != 0) {
 			PMD_DRV_LOG(ERR, "get rss tbl failed, vfid:%d", vfid);
@@ -897,7 +897,7 @@ zxdh_dev_broadcast_set(struct zxdh_hw *hw, uint16_t vport, bool enable)
 			.sdt_no = ZXDH_SDT_BROCAST_ATT_TABLE,
 			.p_entry_data = (void *)&eram_entry};
 
-	ret = zxdh_np_dtb_table_entry_get(hw->slot_id, dtb_data->queueid, &entry_get, 1);
+	ret = zxdh_np_dtb_table_entry_get(hw->dev_id, dtb_data->queueid, &entry_get, 1);
 	if (ret == 0) {
 		if (enable)
 			brocast_table.bitmap[(vport_num.vfid % 64) / 32] |=
@@ -906,7 +906,7 @@ zxdh_dev_broadcast_set(struct zxdh_hw *hw, uint16_t vport, bool enable)
 			brocast_table.bitmap[(vport_num.vfid % 64) / 32] &=
 					~((UINT32_C(1) << (31 - (vport_num.vfid % 64) % 32)));
 
-		ret = zxdh_np_dtb_table_entry_write(hw->slot_id, dtb_data->queueid, 1, &entry_get);
+		ret = zxdh_np_dtb_table_entry_write(hw->dev_id, dtb_data->queueid, 1, &entry_get);
 		if (ret) {
 			PMD_DRV_LOG(ERR, "brocast_table_write_failed. code:%d", ret);
 			return -ret;
@@ -968,7 +968,7 @@ zxdh_set_port_vlan_attr(struct zxdh_hw *hw, uint16_t vport,
 		.p_entry_data = (void *)&port_entry
 	};
 
-	ret = zxdh_np_dtb_table_entry_write(hw->slot_id, hw->dev_sd->dtb_sd.queueid, 1, &entry);
+	ret = zxdh_np_dtb_table_entry_write(hw->dev_id, hw->dev_sd->dtb_sd.queueid, 1, &entry);
 	if (ret)
 		PMD_DRV_LOG(ERR, "write port_vlan tbl failed, ret:%d ", ret);
 	return ret;
@@ -991,7 +991,7 @@ zxdh_get_port_vlan_attr(struct zxdh_hw *hw, uint16_t vport,
 		.p_entry_data = (void *)&port_entry
 	};
 
-	ret = zxdh_np_dtb_table_entry_get(hw->slot_id, hw->dev_sd->dtb_sd.queueid,
+	ret = zxdh_np_dtb_table_entry_get(hw->dev_id, hw->dev_sd->dtb_sd.queueid,
 			&entry, 1);
 	if (ret)
 		PMD_DRV_LOG(ERR, "get port vlan tbl failed, ret:%d ", ret);
-- 
2.27.0

[-- Attachment #1.1.2: Type: text/html , Size: 131590 bytes --]

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

* [PATCH v2] net/zxdh: support multiple PF process flow table
  2025-09-24  8:23 [PATCH v1] net/zxdh: support multiple PF process flow table Tianhao Zhang
                   ` (3 preceding siblings ...)
  2025-09-26  1:04 ` Tianhao Zhang
@ 2025-09-26  1:28 ` Tianhao Zhang
  4 siblings, 0 replies; 6+ messages in thread
From: Tianhao Zhang @ 2025-09-26  1:28 UTC (permalink / raw)
  To: stephen, wang.junlong1, yang.yonggang; +Cc: dev, Tianhao Zhang


[-- Attachment #1.1.1: Type: text/plain, Size: 61458 bytes --]

Support multiple PF process flow table.

Signed-off-by: Tianhao Zhang <zhang.tianhao2@zte.com.cn>
---
 drivers/net/zxdh/zxdh_ethdev.c     | 137 ++++++++-------
 drivers/net/zxdh/zxdh_ethdev.h     |   9 +-
 drivers/net/zxdh/zxdh_ethdev_ops.c |  20 +--
 drivers/net/zxdh/zxdh_np.c         | 272 +++++++++++++++++------------
 drivers/net/zxdh/zxdh_np.h         |  19 +-
 drivers/net/zxdh/zxdh_tables.c     |  72 ++++----
 6 files changed, 298 insertions(+), 231 deletions(-)

diff --git a/drivers/net/zxdh/zxdh_ethdev.c b/drivers/net/zxdh/zxdh_ethdev.c
index 0429bd0333..bc929bacc5 100644
--- a/drivers/net/zxdh/zxdh_ethdev.c
+++ b/drivers/net/zxdh/zxdh_ethdev.c
@@ -20,7 +20,7 @@
 #include "zxdh_ethdev_ops.h"
 
 struct zxdh_hw_internal zxdh_hw_internal[RTE_MAX_ETHPORTS];
-struct zxdh_dev_shared_data g_dev_sd[ZXDH_SLOT_MAX];
+struct zxdh_dev_nic_shared_data dev_nic_sd[ZXDH_SLOT_MAX];
 static rte_spinlock_t zxdh_shared_data_lock = RTE_SPINLOCK_INITIALIZER;
 struct zxdh_shared_data *zxdh_shared_data;
 struct zxdh_net_hdr_dl g_net_hdr_dl[RTE_MAX_ETHPORTS];
@@ -1141,26 +1141,26 @@ zxdh_np_dtb_data_res_free(struct zxdh_hw *hw)
 	int i;
 
 	if (dtb_data->init_done && dtb_data->bind_device == dev) {
-		ret = zxdh_np_online_uninit(hw->slot_id, dev->data->name, dtb_data->queueid);
+		ret = zxdh_np_online_uninit(hw->dev_id, dev->data->name, dtb_data->queueid);
 		if (ret)
 			PMD_DRV_LOG(ERR, "%s dpp_np_online_uninstall failed", dev->data->name);
 
-		rte_memzone_free(dtb_data->dtb_table_conf_mz);
-		dtb_data->dtb_table_conf_mz = NULL;
-		rte_memzone_free(dtb_data->dtb_table_dump_mz);
-		dtb_data->dtb_table_dump_mz = NULL;
-
-		for (i = 0; i < ZXDH_MAX_BASE_DTB_TABLE_COUNT; i++) {
-			if (dtb_data->dtb_table_bulk_dump_mz[i]) {
-				rte_memzone_free(dtb_data->dtb_table_bulk_dump_mz[i]);
-				dtb_data->dtb_table_bulk_dump_mz[i] = NULL;
-			}
-		}
+		hw->dev_nic_sd->dtb_used_num--;
 		dtb_data->init_done = 0;
 		dtb_data->bind_device = NULL;
 	}
-	if (zxdh_shared_data != NULL)
-		zxdh_shared_data->np_init_done = 0;
+
+	rte_memzone_free(dtb_data->dtb_table_conf_mz);
+	dtb_data->dtb_table_conf_mz = NULL;
+	rte_memzone_free(dtb_data->dtb_table_dump_mz);
+	dtb_data->dtb_table_dump_mz = NULL;
+
+	for (i = 0; i < ZXDH_MAX_BASE_DTB_TABLE_COUNT; i++) {
+		if (dtb_data->dtb_table_bulk_dump_mz[i]) {
+			rte_memzone_free(dtb_data->dtb_table_bulk_dump_mz[i]);
+			dtb_data->dtb_table_bulk_dump_mz[i] = NULL;
+		}
+	}
 }
 
 static int
@@ -1191,17 +1191,19 @@ static void
 zxdh_np_uninit(struct rte_eth_dev *dev)
 {
 	struct zxdh_hw *hw = dev->data->dev_private;
-	struct zxdh_dtb_shared_data *dtb_data = &hw->dev_sd->dtb_sd;
 
 	if (!hw->is_pf)
 		return;
-	if (!dtb_data->init_done && !dtb_data->dev_refcnt)
-		return;
 
 	zxdh_tbl_entry_online_destroy(dev);
+	zxdh_np_dtb_data_res_free(hw);
+
+	if (hw->dev_nic_sd->init_done && hw->dev_nic_sd->dtb_used_num == 0) {
+		zxdh_np_soft_res_uninstall(hw->dev_id);
+		hw->dev_nic_sd->init_done = 0;
+	}
+	PMD_DRV_LOG(DEBUG, "zxdh_np_destroy: dtb_used_num %d", hw->dev_nic_sd->dtb_used_num);
 
-	if (--dtb_data->dev_refcnt == 0)
-		zxdh_np_dtb_data_res_free(hw);
 }
 
 static int
@@ -1254,6 +1256,16 @@ zxdh_dev_stop(struct rte_eth_dev *dev)
 	return ret;
 }
 
+static void
+zxdh_priv_res_free(struct zxdh_hw *priv)
+{
+	rte_free(priv->vfinfo);
+	priv->vfinfo = NULL;
+
+	rte_free(priv->channel_context);
+	priv->channel_context = NULL;
+}
+
 static int
 zxdh_dev_close(struct rte_eth_dev *dev)
 {
@@ -1285,7 +1297,9 @@ zxdh_dev_close(struct rte_eth_dev *dev)
 	zxdh_free_queues(dev);
 
 	zxdh_bar_msg_chan_exit();
+	zxdh_priv_res_free(hw);
 
+	rte_free(hw->dev_sd);
 	if (dev->data->mac_addrs != NULL) {
 		rte_free(dev->data->mac_addrs);
 		dev->data->mac_addrs = NULL;
@@ -1615,6 +1629,7 @@ zxdh_np_dtb_res_init(struct rte_eth_dev *dev)
 	struct zxdh_bar_offset_res res = {0};
 	char buf[ZXDH_MAX_NAME_LEN] = {0};
 	struct zxdh_dtb_shared_data *dtb_data = &hw->dev_sd->dtb_sd;
+	struct zxdh_dev_nic_shared_data *dev_nic_sd = hw->dev_nic_sd;
 	int ret = 0;
 
 	if (dtb_data->init_done) {
@@ -1625,15 +1640,13 @@ zxdh_np_dtb_res_init(struct rte_eth_dev *dev)
 
 	dtb_data->queueid = ZXDH_INVALID_DTBQUE;
 	dtb_data->bind_device = dev;
-	dtb_data->dev_refcnt++;
-	dtb_data->init_done = 1;
 
 	ZXDH_DEV_INIT_CTRL_T *dpp_ctrl = rte_zmalloc(NULL, sizeof(*dpp_ctrl) +
 			sizeof(ZXDH_DTB_ADDR_INFO_T) * 256, 0);
 	if (dpp_ctrl == NULL) {
 		PMD_DRV_LOG(ERR, "dev %s annot allocate memory for dpp_ctrl", dev->device->name);
 		ret = -ENOMEM;
-		goto free_res;
+		return ret;
 	}
 	dpp_ctrl->queue_id = 0xff;
 	dpp_ctrl->vport = hw->vport.vport;
@@ -1694,7 +1707,7 @@ zxdh_np_dtb_res_init(struct rte_eth_dev *dev)
 		goto free_res;
 	}
 
-	ret = zxdh_np_host_init(hw->slot_id, dpp_ctrl);
+	ret = zxdh_np_host_init(hw->dev_id, dpp_ctrl);
 	if (ret) {
 		PMD_DRV_LOG(ERR, "dev %s dpp host np init failed", dev->device->name);
 		goto free_res;
@@ -1703,6 +1716,9 @@ zxdh_np_dtb_res_init(struct rte_eth_dev *dev)
 	PMD_DRV_LOG(DEBUG, "dev %s dpp host np init ok.dtb queue %u",
 		dev->device->name, dpp_ctrl->queue_id);
 	dtb_data->queueid = dpp_ctrl->queue_id;
+	dtb_data->dev_refcnt++;
+	dev_nic_sd->dtb_used_num++;
+	dtb_data->init_done = 1;
 	rte_free(dpp_ctrl);
 	return 0;
 
@@ -1717,11 +1733,11 @@ zxdh_get_dev_shared_data_idx(uint32_t dev_serial_id)
 {
 	uint16_t idx = 0;
 	for (; idx < ZXDH_SLOT_MAX; idx++) {
-		if (g_dev_sd[idx].serial_id == dev_serial_id || g_dev_sd[idx].serial_id == 0)
+		if (dev_nic_sd[idx].serial_id == dev_serial_id || dev_nic_sd[idx].serial_id == 0)
 			return idx;
 	}
 
-	PMD_DRV_LOG(ERR, "dev serial_id[%u] can not found in global dev_share_data arrays",
+	PMD_DRV_LOG(ERR, "dev serial_id[%u] can not found in global dev_nic_share_data arrays",
 		dev_serial_id);
 	return ZXDH_INVALID_SLOT_IDX;
 }
@@ -1744,9 +1760,10 @@ static int zxdh_init_dev_share_data(struct rte_eth_dev *eth_dev)
 		return -EINVAL;
 
 	hw->slot_id = slot_id;
-	hw->dev_id = (hw->pcie_id << 16) | (hw->slot_id & 0xffff);
-	g_dev_sd[slot_id].serial_id = serial_id;
-	hw->dev_sd = &g_dev_sd[slot_id];
+	hw->dev_id = hw->pcie_id;
+	dev_nic_sd[slot_id].serial_id = serial_id;
+	hw->dev_nic_sd = &dev_nic_sd[slot_id];
+	hw->dev_sd = rte_zmalloc("zxdh_dtb", sizeof(struct zxdh_dev_shared_data), 0);
 
 	return 0;
 }
@@ -1938,41 +1955,39 @@ zxdh_np_init(struct rte_eth_dev *eth_dev)
 {
 	struct zxdh_hw *hw = eth_dev->data->dev_private;
 	struct zxdh_dtb_shared_data *dtb_data = &hw->dev_sd->dtb_sd;
+	struct zxdh_dev_nic_shared_data *dev_nic_sd = hw->dev_nic_sd;
 	int ret = 0;
 
-	if (hw->is_pf && dtb_data->init_done) {
-		dtb_data->dev_refcnt++;
-		zxdh_tbl_entry_offline_destroy(hw);
-		PMD_DRV_LOG(INFO, "no need to init dtb  dtb chanenl %d devref %d",
-			dtb_data->queueid, dtb_data->dev_refcnt);
+	if (!hw->is_pf)
 		return 0;
-	}
 
-	if (hw->is_pf) {
-		ret = zxdh_np_dtb_res_init(eth_dev);
-		if (ret) {
-			PMD_DRV_LOG(ERR, "np dtb init failed, ret:%d", ret);
-			return ret;
-		}
+	hw->dev_id = (hw->pcie_id << 16) | (hw->slot_id & 0xffff);
+
+	ret = zxdh_np_dtb_res_init(eth_dev);
+	if (ret) {
+		PMD_DRV_LOG(ERR, "np dtb init failed, ret:%d", ret);
+		return ret;
 	}
 
-	if (hw->is_pf) {
-		ret = zxdh_np_se_res_get_and_init(hw->dev_id, ZXDH_SE_STD_NIC_RES_TYPE);
-		if (ret) {
-			PMD_DRV_LOG(ERR, "dpp apt init failed, code:%d ", ret);
-			return -ret;
-		}
-		if (!hw->switchoffload) {
-			if (hw->hash_search_index >= ZXDH_HASHIDX_MAX) {
-				PMD_DRV_LOG(ERR, "invalid hash idx %d", hw->hash_search_index);
-				return -1;
-			}
-			zxdh_tbl_entry_offline_destroy(hw);
+	if (dev_nic_sd->init_done) {
+		zxdh_tbl_entry_offline_destroy(hw);
+		PMD_DRV_LOG(ERR, "no need to init apt res. slot_id %d dtb chanenl %d dtb_used_num %d",
+			hw->slot_id, dtb_data->queueid, hw->dev_nic_sd->dtb_used_num);
+		return 0;
+	}
+	ret = zxdh_np_se_res_get_and_init(hw->dev_id, ZXDH_SE_STD_NIC_RES_TYPE);
+	if (ret) {
+		PMD_DRV_LOG(ERR, "dpp apt init failed, code:%d ", ret);
+		return -ret;
+	}
+	if (!hw->switchoffload) {
+		if (hw->hash_search_index >= ZXDH_HASHIDX_MAX) {
+			PMD_DRV_LOG(ERR, "invalid hash idx %d", hw->hash_search_index);
+			return -1;
 		}
+		zxdh_tbl_entry_offline_destroy(hw);
 	}
-
-	if (zxdh_shared_data != NULL)
-		zxdh_shared_data->np_init_done = 1;
+	dev_nic_sd->init_done = 1;
 
 	PMD_DRV_LOG(DEBUG, "np init ok");
 	return 0;
@@ -2069,16 +2084,6 @@ zxdh_priv_res_init(struct zxdh_hw *hw)
 	return 0;
 }
 
-static void
-zxdh_priv_res_free(struct zxdh_hw *priv)
-{
-	rte_free(priv->vfinfo);
-	priv->vfinfo = NULL;
-	if (priv->channel_context != NULL) {
-		rte_free(priv->channel_context);
-		priv->channel_context = NULL;
-	}
-}
 
 static uint8_t
 is_pf(uint16_t device_id)
diff --git a/drivers/net/zxdh/zxdh_ethdev.h b/drivers/net/zxdh/zxdh_ethdev.h
index a2d7b14601..a269199540 100644
--- a/drivers/net/zxdh/zxdh_ethdev.h
+++ b/drivers/net/zxdh/zxdh_ethdev.h
@@ -103,6 +103,7 @@ struct zxdh_hw {
 	struct zxdh_virtqueue **vqs;
 	struct zxdh_chnl_context *channel_context;
 	struct zxdh_dev_shared_data *dev_sd;
+	struct zxdh_dev_nic_shared_data *dev_nic_sd;
 	struct vfinfo *vfinfo;
 
 	uint64_t bar_addr[ZXDH_NUM_BARS];
@@ -183,7 +184,6 @@ struct zxdh_shared_data {
 	int32_t init_done;       /* Whether primary has done initialization. */
 	unsigned int secondary_cnt; /* Number of secondary processes init'd. */
 
-	int32_t np_init_done;
 	uint32_t dev_refcnt;
 	struct zxdh_dtb_shared_data *dtb_data;
 	struct rte_mempool *flow_mp;
@@ -196,10 +196,15 @@ struct zxdh_shared_data {
 };
 
 struct zxdh_dev_shared_data {
-	uint32_t serial_id;
 	struct zxdh_dtb_shared_data dtb_sd;
 };
 
+struct zxdh_dev_nic_shared_data {
+	uint32_t serial_id;
+	uint16_t dtb_used_num;
+	uint16_t init_done;
+};
+
 struct zxdh_dtb_bulk_dump_info {
 	const char *mz_name;
 	uint32_t mz_size;
diff --git a/drivers/net/zxdh/zxdh_ethdev_ops.c b/drivers/net/zxdh/zxdh_ethdev_ops.c
index da32512b03..ee5d7304ef 100644
--- a/drivers/net/zxdh/zxdh_ethdev_ops.c
+++ b/drivers/net/zxdh/zxdh_ethdev_ops.c
@@ -1556,7 +1556,7 @@ zxdh_np_stats_get(struct rte_eth_dev *dev, struct zxdh_hw_np_stats *np_stats)
 
 	idx = stats_id + ZXDH_BROAD_STATS_EGRESS_BASE;
 	memset(&stats_data, 0, sizeof(stats_data));
-	ret = zxdh_np_dtb_stats_get(hw->slot_id, dtb_data->queueid,
+	ret = zxdh_np_dtb_stats_get(hw->dev_id, dtb_data->queueid,
 				0, idx, (uint32_t *)&stats_data);
 	if (ret)
 		return ret;
@@ -1567,7 +1567,7 @@ zxdh_np_stats_get(struct rte_eth_dev *dev, struct zxdh_hw_np_stats *np_stats)
 
 	idx = stats_id + ZXDH_BROAD_STATS_INGRESS_BASE;
 	memset(&stats_data, 0, sizeof(stats_data));
-	ret = zxdh_np_dtb_stats_get(hw->slot_id, dtb_data->queueid,
+	ret = zxdh_np_dtb_stats_get(hw->dev_id, dtb_data->queueid,
 				0, idx, (uint32_t *)&stats_data);
 	if (ret)
 		return ret;
@@ -1578,7 +1578,7 @@ zxdh_np_stats_get(struct rte_eth_dev *dev, struct zxdh_hw_np_stats *np_stats)
 
 	idx = stats_id + ZXDH_MULTICAST_STATS_EGRESS_BASE;
 	memset(&stats_data, 0, sizeof(stats_data));
-	ret = zxdh_np_dtb_stats_get(hw->slot_id, dtb_data->queueid,
+	ret = zxdh_np_dtb_stats_get(hw->dev_id, dtb_data->queueid,
 				0, idx, (uint32_t *)&stats_data);
 	if (ret)
 		return ret;
@@ -1589,7 +1589,7 @@ zxdh_np_stats_get(struct rte_eth_dev *dev, struct zxdh_hw_np_stats *np_stats)
 
 	idx = stats_id + ZXDH_MULTICAST_STATS_INGRESS_BASE;
 	memset(&stats_data, 0, sizeof(stats_data));
-	ret = zxdh_np_dtb_stats_get(hw->slot_id, dtb_data->queueid,
+	ret = zxdh_np_dtb_stats_get(hw->dev_id, dtb_data->queueid,
 				0, idx, (uint32_t *)&stats_data);
 	if (ret)
 		return ret;
@@ -1600,7 +1600,7 @@ zxdh_np_stats_get(struct rte_eth_dev *dev, struct zxdh_hw_np_stats *np_stats)
 
 	idx = stats_id + ZXDH_UNICAST_STATS_EGRESS_BASE;
 	memset(&stats_data, 0, sizeof(stats_data));
-	ret = zxdh_np_dtb_stats_get(hw->slot_id, dtb_data->queueid,
+	ret = zxdh_np_dtb_stats_get(hw->dev_id, dtb_data->queueid,
 				0, idx, (uint32_t *)&stats_data);
 	if (ret)
 		return ret;
@@ -1611,7 +1611,7 @@ zxdh_np_stats_get(struct rte_eth_dev *dev, struct zxdh_hw_np_stats *np_stats)
 
 	idx = stats_id + ZXDH_UNICAST_STATS_INGRESS_BASE;
 	memset(&stats_data, 0, sizeof(stats_data));
-	ret = zxdh_np_dtb_stats_get(hw->slot_id, dtb_data->queueid,
+	ret = zxdh_np_dtb_stats_get(hw->dev_id, dtb_data->queueid,
 				0, idx, (uint32_t *)&stats_data);
 	if (ret)
 		return ret;
@@ -1622,7 +1622,7 @@ zxdh_np_stats_get(struct rte_eth_dev *dev, struct zxdh_hw_np_stats *np_stats)
 
 	idx = stats_id + ZXDH_MTU_STATS_EGRESS_BASE;
 	memset(&stats_data, 0, sizeof(stats_data));
-	ret = zxdh_np_dtb_stats_get(hw->slot_id, dtb_data->queueid,
+	ret = zxdh_np_dtb_stats_get(hw->dev_id, dtb_data->queueid,
 				1, idx, (uint32_t *)&stats_data);
 	if (ret)
 		return ret;
@@ -1633,7 +1633,7 @@ zxdh_np_stats_get(struct rte_eth_dev *dev, struct zxdh_hw_np_stats *np_stats)
 
 	idx = stats_id + ZXDH_MTU_STATS_INGRESS_BASE;
 	memset(&stats_data, 0, sizeof(stats_data));
-	ret = zxdh_np_dtb_stats_get(hw->slot_id, dtb_data->queueid,
+	ret = zxdh_np_dtb_stats_get(hw->dev_id, dtb_data->queueid,
 				1, idx, (uint32_t *)&stats_data);
 	if (ret)
 		return ret;
@@ -1644,7 +1644,7 @@ zxdh_np_stats_get(struct rte_eth_dev *dev, struct zxdh_hw_np_stats *np_stats)
 
 	idx = stats_id + ZXDH_MTR_STATS_EGRESS_BASE;
 	memset(&stats_data, 0, sizeof(stats_data));
-	ret = zxdh_np_dtb_stats_get(hw->slot_id, dtb_data->queueid,
+	ret = zxdh_np_dtb_stats_get(hw->dev_id, dtb_data->queueid,
 				1, idx, (uint32_t *)&stats_data);
 	if (ret)
 		return ret;
@@ -1655,7 +1655,7 @@ zxdh_np_stats_get(struct rte_eth_dev *dev, struct zxdh_hw_np_stats *np_stats)
 
 	idx = stats_id + ZXDH_MTR_STATS_INGRESS_BASE;
 	memset(&stats_data, 0, sizeof(stats_data));
-	ret = zxdh_np_dtb_stats_get(hw->slot_id, dtb_data->queueid,
+	ret = zxdh_np_dtb_stats_get(hw->dev_id, dtb_data->queueid,
 				1, idx, (uint32_t *)&stats_data);
 	if (ret)
 		return ret;
diff --git a/drivers/net/zxdh/zxdh_np.c b/drivers/net/zxdh/zxdh_np.c
index 98b95532cd..024da113e2 100644
--- a/drivers/net/zxdh/zxdh_np.c
+++ b/drivers/net/zxdh/zxdh_np.c
@@ -300,8 +300,8 @@ static const ZXDH_DTB_TABLE_T g_dpp_dtb_dump_info[] = {
 };
 
 #define ZXDH_SDT_MGR_PTR_GET()    (&g_sdt_mgr)
-#define ZXDH_SDT_SOFT_TBL_GET(id) (g_sdt_mgr.sdt_tbl_array[id])
-#define ZXDH_DEV_INFO_GET(id) (g_dev_mgr.p_dev_array[id])
+#define ZXDH_SDT_SOFT_TBL_GET(id) (g_sdt_mgr.sdt_tbl_array[ZXDH_DEV_SLOT_ID(id)])
+#define ZXDH_DEV_INFO_GET(id) (g_dev_mgr.p_dev_array[ZXDH_DEV_SLOT_ID(id)])
 
 #define ZXDH_DTB_LEN(cmd_type, int_en, data_len) \
 	(((data_len) & 0x3ff) | \
@@ -384,45 +384,55 @@ zxdh_np_comm_convert32(uint32_t dw_data)
 #define ZXDH_COMM_CONVERT32(w_data) \
 			zxdh_np_comm_convert32(w_data)
 
-#define ZXDH_DTB_TAB_UP_WR_INDEX_GET(DEV_ID, QUEUE_ID)       \
-		(p_dpp_dtb_mgr[(DEV_ID)]->queue_info[(QUEUE_ID)].tab_up.wr_index)
+#define ZXDH_DTB_TAB_UP_WR_INDEX_GET(DEV_ID, QUEUE_ID) \
+		(p_dpp_dtb_mgr[(ZXDH_DEV_SLOT_ID(DEV_ID))]->queue_info[(QUEUE_ID)].tab_up.wr_index)
 
-#define ZXDH_DTB_TAB_UP_USER_PHY_ADDR_FLAG_GET(DEV_ID, QUEUE_ID, INDEX)     \
-	(p_dpp_dtb_mgr[(DEV_ID)]->queue_info[(QUEUE_ID)].tab_up.user_addr[(INDEX)].user_flag)
+#define ZXDH_DTB_TAB_UP_USER_PHY_ADDR_FLAG_GET(DEV_ID, QUEUE_ID, INDEX)    \
+		(p_dpp_dtb_mgr[(ZXDH_DEV_SLOT_ID(DEV_ID))]->                       \
+		queue_info[(QUEUE_ID)].tab_up.user_addr[(INDEX)].user_flag)
 
-#define ZXDH_DTB_TAB_UP_USER_PHY_ADDR_GET(DEV_ID, QUEUE_ID, INDEX)     \
-		(p_dpp_dtb_mgr[(DEV_ID)]->queue_info[(QUEUE_ID)].tab_up.user_addr[(INDEX)].phy_addr)
+#define ZXDH_DTB_TAB_UP_USER_PHY_ADDR_GET(DEV_ID, QUEUE_ID, INDEX)         \
+		(p_dpp_dtb_mgr[(ZXDH_DEV_SLOT_ID(DEV_ID))]->                       \
+		queue_info[(QUEUE_ID)].tab_up.user_addr[(INDEX)].phy_addr)
 
-#define ZXDH_DTB_TAB_UP_DATA_LEN_GET(DEV_ID, QUEUE_ID, INDEX)       \
-		(p_dpp_dtb_mgr[(DEV_ID)]->queue_info[(QUEUE_ID)].tab_up.data_len[(INDEX)])
+#define ZXDH_DTB_TAB_UP_DATA_LEN_GET(DEV_ID, QUEUE_ID, INDEX)              \
+		(p_dpp_dtb_mgr[(ZXDH_DEV_SLOT_ID(DEV_ID))]->                       \
+		queue_info[(QUEUE_ID)].tab_up.data_len[(INDEX)])
 
-#define ZXDH_DTB_TAB_UP_VIR_ADDR_GET(DEV_ID, QUEUE_ID, INDEX)     \
-		(p_dpp_dtb_mgr[(DEV_ID)]->queue_info[(QUEUE_ID)].tab_up.start_vir_addr + \
-		(INDEX) * p_dpp_dtb_mgr[(DEV_ID)]->queue_info[(QUEUE_ID)].tab_up.item_size)
+#define ZXDH_DTB_TAB_UP_VIR_ADDR_GET(DEV_ID, QUEUE_ID, INDEX)   \
+		(p_dpp_dtb_mgr[(ZXDH_DEV_SLOT_ID(DEV_ID))]->            \
+		queue_info[(QUEUE_ID)].tab_up.start_vir_addr +          \
+		(INDEX) * p_dpp_dtb_mgr[(ZXDH_DEV_SLOT_ID(DEV_ID))]->   \
+		queue_info[(QUEUE_ID)].tab_up.item_size)
 
-#define ZXDH_DTB_TAB_DOWN_VIR_ADDR_GET(DEV_ID, QUEUE_ID, INDEX)   \
-		(p_dpp_dtb_mgr[DEV_ID]->queue_info[QUEUE_ID].tab_down.start_vir_addr + \
-		INDEX * p_dpp_dtb_mgr[DEV_ID]->queue_info[QUEUE_ID].tab_down.item_size)
+#define ZXDH_DTB_TAB_DOWN_VIR_ADDR_GET(DEV_ID, QUEUE_ID, INDEX) \
+		(p_dpp_dtb_mgr[ZXDH_DEV_SLOT_ID(DEV_ID)]->              \
+		queue_info[QUEUE_ID].tab_down.start_vir_addr +          \
+		(INDEX) * p_dpp_dtb_mgr[ZXDH_DEV_SLOT_ID(DEV_ID)]->     \
+		queue_info[QUEUE_ID].tab_down.item_size)
 
-#define ZXDH_DTB_TAB_DOWN_WR_INDEX_GET(DEV_ID, QUEUE_ID)       \
-		(p_dpp_dtb_mgr[(DEV_ID)]->queue_info[(QUEUE_ID)].tab_down.wr_index)
+#define ZXDH_DTB_TAB_DOWN_WR_INDEX_GET(DEV_ID, QUEUE_ID)        \
+		(p_dpp_dtb_mgr[(ZXDH_DEV_SLOT_ID(DEV_ID))]->            \
+		queue_info[(QUEUE_ID)].tab_down.wr_index)
 
-#define ZXDH_DTB_QUEUE_INIT_FLAG_GET(DEV_ID, QUEUE_ID)       \
-		(p_dpp_dtb_mgr[(DEV_ID)]->queue_info[(QUEUE_ID)].init_flag)
+#define ZXDH_DTB_QUEUE_INIT_FLAG_GET(DEV_ID, QUEUE_ID)          \
+		(p_dpp_dtb_mgr[(ZXDH_DEV_SLOT_ID(DEV_ID))]->            \
+		queue_info[(QUEUE_ID)].init_flag)
 
-#define ZXDH_DTB_TAB_UP_USER_VIR_ADDR_GET(DEV_ID, QUEUE_ID, INDEX)     \
-		(p_dpp_dtb_mgr[DEV_ID]->queue_info[QUEUE_ID].tab_up.user_addr[INDEX].vir_addr)
+#define ZXDH_DTB_TAB_UP_USER_VIR_ADDR_GET(DEV_ID, QUEUE_ID, INDEX)          \
+		(p_dpp_dtb_mgr[ZXDH_DEV_SLOT_ID(DEV_ID)]->                          \
+		queue_info[QUEUE_ID].tab_up.user_addr[INDEX].vir_addr)
 
-#define ZXDH_DTB_TAB_UP_USER_ADDR_FLAG_SET(DEV_ID, QUEUE_ID, INDEX, VAL)     \
-		(p_dpp_dtb_mgr[DEV_ID]->queue_info[QUEUE_ID].tab_up.user_addr[INDEX].user_flag = \
-		VAL)
+#define ZXDH_DTB_TAB_UP_USER_ADDR_FLAG_SET(DEV_ID, QUEUE_ID, INDEX, VAL)    \
+		(p_dpp_dtb_mgr[ZXDH_DEV_SLOT_ID(DEV_ID)]->                          \
+		queue_info[QUEUE_ID].tab_up.user_addr[INDEX].user_flag = VAL)
 
 static inline uint64_t
 zxdh_np_dtb_tab_down_phy_addr_get(uint32_t DEV_ID, uint32_t QUEUE_ID,
 	uint32_t INDEX)
 {
-	return p_dpp_dtb_mgr[DEV_ID]->queue_info[QUEUE_ID].tab_down.start_phy_addr +
-		INDEX * p_dpp_dtb_mgr[DEV_ID]->queue_info[QUEUE_ID].tab_down.item_size;
+	return p_dpp_dtb_mgr[ZXDH_DEV_SLOT_ID(DEV_ID)]->queue_info[QUEUE_ID].tab_down.start_phy_addr
+	+ INDEX * p_dpp_dtb_mgr[ZXDH_DEV_SLOT_ID(DEV_ID)]->queue_info[QUEUE_ID].tab_down.item_size;
 }
 
 #define ZXDH_DTB_TAB_DOWN_PHY_ADDR_GET(DEV_ID, QUEUE_ID, INDEX)   \
@@ -432,8 +442,8 @@ static inline uint64_t
 zxdh_np_dtb_tab_up_phy_addr_get(uint32_t DEV_ID, uint32_t QUEUE_ID,
 	uint32_t INDEX)
 {
-	return p_dpp_dtb_mgr[DEV_ID]->queue_info[QUEUE_ID].tab_up.start_phy_addr +
-		INDEX * p_dpp_dtb_mgr[DEV_ID]->queue_info[QUEUE_ID].tab_up.item_size;
+	return p_dpp_dtb_mgr[ZXDH_DEV_SLOT_ID(DEV_ID)]->queue_info[QUEUE_ID].tab_up.start_phy_addr
+	+ INDEX * p_dpp_dtb_mgr[ZXDH_DEV_SLOT_ID(DEV_ID)]->queue_info[QUEUE_ID].tab_up.item_size;
 }
 
 #define ZXDH_DTB_TAB_UP_PHY_ADDR_GET(DEV_ID, QUEUE_ID, INDEX)	 \
@@ -517,7 +527,8 @@ zxdh_np_get_tn_color(ZXDH_RB_TN *p_tn)
 
 #define ZXDH_ACL_KEYSIZE_GET(key_mode) (2 * ZXDH_ETCAM_ENTRY_SIZE_GET(key_mode))
 
-#define GET_HASH_TBL_ID_INFO(dev_id, fun_id, tbl_id) (&g_tbl_id_info[dev_id][fun_id][tbl_id])
+#define GET_HASH_TBL_ID_INFO(dev_id, fun_id, tbl_id) \
+	(&g_tbl_id_info[ZXDH_DEV_SLOT_ID(dev_id)][fun_id][tbl_id])
 
 #define ZXDH_GET_HASH_TBL_ID(p_key)    ((p_key)[0] & 0x1F)
 
@@ -1830,25 +1841,34 @@ static void
 zxdh_np_dev_vport_get(uint32_t dev_id, uint32_t *vport)
 {
 	ZXDH_DEV_MGR_T *p_dev_mgr = &g_dev_mgr;
-	ZXDH_DEV_CFG_T *p_dev_info = p_dev_mgr->p_dev_array[dev_id];
+	ZXDH_DEV_CFG_T *p_dev_info = p_dev_mgr->p_dev_array[ZXDH_DEV_SLOT_ID(dev_id)];
 
-	*vport = p_dev_info->vport;
+	*vport = p_dev_info->vport[ZXDH_DEV_PF_INDEX(dev_id)];
 }
 
 static void
 zxdh_np_dev_agent_addr_get(uint32_t dev_id, uint64_t *agent_addr)
 {
 	ZXDH_DEV_MGR_T *p_dev_mgr = &g_dev_mgr;
-	ZXDH_DEV_CFG_T *p_dev_info = p_dev_mgr->p_dev_array[dev_id];
+	ZXDH_DEV_CFG_T *p_dev_info = p_dev_mgr->p_dev_array[ZXDH_DEV_SLOT_ID(dev_id)];
 
-	*agent_addr = p_dev_info->agent_addr;
+	*agent_addr = p_dev_info->agent_addr[ZXDH_DEV_PF_INDEX(dev_id)];
+}
+
+static void
+zxdh_np_dev_bar_pcie_id_get(uint32_t dev_id, uint16_t *p_pcie_id)
+{
+	ZXDH_DEV_MGR_T *p_dev_mgr = &g_dev_mgr;
+	ZXDH_DEV_CFG_T *p_dev_info = p_dev_mgr->p_dev_array[ZXDH_DEV_SLOT_ID(dev_id)];
+
+	*p_pcie_id = p_dev_info->pcie_id[ZXDH_DEV_PF_INDEX(dev_id)];
 }
 
 static void
 zxdh_np_dev_fw_bar_msg_num_set(uint32_t dev_id, uint32_t bar_msg_num)
 {
 	ZXDH_DEV_MGR_T *p_dev_mgr = &g_dev_mgr;
-	ZXDH_DEV_CFG_T *p_dev_info = p_dev_mgr->p_dev_array[dev_id];
+	ZXDH_DEV_CFG_T *p_dev_info = p_dev_mgr->p_dev_array[ZXDH_DEV_SLOT_ID(dev_id)];
 
 	p_dev_info->fw_bar_msg_num = bar_msg_num;
 
@@ -1859,7 +1879,7 @@ static void
 zxdh_np_dev_fw_bar_msg_num_get(uint32_t dev_id, uint32_t *bar_msg_num)
 {
 	ZXDH_DEV_MGR_T *p_dev_mgr = &g_dev_mgr;
-	ZXDH_DEV_CFG_T *p_dev_info = p_dev_mgr->p_dev_array[dev_id];
+	ZXDH_DEV_CFG_T *p_dev_info = p_dev_mgr->p_dev_array[ZXDH_DEV_SLOT_ID(dev_id)];
 
 	*bar_msg_num = p_dev_info->fw_bar_msg_num;
 }
@@ -1868,7 +1888,7 @@ static uint32_t
 zxdh_np_dev_opr_spinlock_get(uint32_t dev_id, uint32_t type, ZXDH_SPINLOCK_T **p_spinlock_out)
 {
 	ZXDH_DEV_MGR_T *p_dev_mgr = &g_dev_mgr;
-	ZXDH_DEV_CFG_T *p_dev_info = p_dev_mgr->p_dev_array[dev_id];
+	ZXDH_DEV_CFG_T *p_dev_info = p_dev_mgr->p_dev_array[ZXDH_DEV_SLOT_ID(dev_id)];
 
 	if (p_dev_info == NULL) {
 		PMD_DRV_LOG(ERR, "Get dev_info[ %u ] fail!", dev_id);
@@ -1895,7 +1915,7 @@ zxdh_np_dev_dtb_opr_spinlock_get(uint32_t dev_id, uint32_t type,
 			uint32_t index, ZXDH_SPINLOCK_T **p_spinlock_out)
 {
 	ZXDH_DEV_MGR_T *p_dev_mgr = &g_dev_mgr;
-	ZXDH_DEV_CFG_T *p_dev_info = p_dev_mgr->p_dev_array[dev_id];
+	ZXDH_DEV_CFG_T *p_dev_info = p_dev_mgr->p_dev_array[ZXDH_DEV_SLOT_ID(dev_id)];
 
 	switch (type) {
 	case ZXDH_DEV_SPINLOCK_T_DTB:
@@ -1914,7 +1934,7 @@ zxdh_np_dev_hash_opr_spinlock_get(uint32_t dev_id,
 	uint32_t fun_id, ZXDH_SPINLOCK_T **p_spinlock_out)
 {
 	ZXDH_DEV_MGR_T *p_dev_mgr = &g_dev_mgr;
-	ZXDH_DEV_CFG_T *p_dev_info = p_dev_mgr->p_dev_array[dev_id];
+	ZXDH_DEV_CFG_T *p_dev_info = p_dev_mgr->p_dev_array[ZXDH_DEV_SLOT_ID(dev_id)];
 
 	*p_spinlock_out = &p_dev_info->hash_spinlock[fun_id];
 }
@@ -2000,12 +2020,12 @@ zxdh_np_dev_get_pcie_addr(uint32_t dev_id)
 	ZXDH_DEV_CFG_T *p_dev_info = NULL;
 
 	p_dev_mgr = &g_dev_mgr;
-	p_dev_info = p_dev_mgr->p_dev_array[dev_id];
+	p_dev_info = p_dev_mgr->p_dev_array[ZXDH_DEV_SLOT_ID(dev_id)];
 
 	if (p_dev_info == NULL)
 		return ZXDH_DEV_TYPE_INVALID;
 
-	return p_dev_info->pcie_addr;
+	return p_dev_info->pcie_addr[ZXDH_DEV_PF_INDEX(dev_id)];
 }
 
 static void
@@ -2322,10 +2342,10 @@ zxdh_np_dev_add(uint32_t  dev_id, ZXDH_DEV_TYPE_E dev_type,
 		return ZXDH_RC_DEV_MGR_NOT_INIT;
 	}
 
-	if (p_dev_mgr->p_dev_array[dev_id] != NULL) {
+	if (p_dev_mgr->p_dev_array[ZXDH_DEV_SLOT_ID(dev_id)] != NULL) {
 		/* device is already exist. */
 		PMD_DRV_LOG(ERR, "Device is added again");
-		p_dev_info = p_dev_mgr->p_dev_array[dev_id];
+		p_dev_info = p_dev_mgr->p_dev_array[ZXDH_DEV_SLOT_ID(dev_id)];
 	} else {
 		/* device is new. */
 		p_dev_info = rte_malloc(NULL, sizeof(ZXDH_DEV_CFG_T), 0);
@@ -2333,14 +2353,15 @@ zxdh_np_dev_add(uint32_t  dev_id, ZXDH_DEV_TYPE_E dev_type,
 			PMD_DRV_LOG(ERR, "malloc memory failed");
 			return ZXDH_PAR_CHK_POINT_NULL;
 		}
-		p_dev_mgr->p_dev_array[dev_id] = p_dev_info;
+		p_dev_mgr->p_dev_array[ZXDH_DEV_SLOT_ID(dev_id)] = p_dev_info;
 		p_dev_mgr->device_num++;
 	}
 
-	p_dev_info->device_id   = dev_id;
+	p_dev_info->slot_id   = ZXDH_DEV_SLOT_ID(dev_id);
 	p_dev_info->dev_type    = dev_type;
 	p_dev_info->access_type = access_type;
-	p_dev_info->pcie_addr   = pcie_addr;
+	p_dev_info->pcie_addr[ZXDH_DEV_PF_INDEX(dev_id)] = pcie_addr;
+	p_dev_info->pcie_id[ZXDH_DEV_PF_INDEX(dev_id)] = ZXDH_DEV_PCIE_ID(dev_id);
 	p_dev_info->riscv_addr   = riscv_addr;
 	p_dev_info->dma_vir_addr = dma_vir_addr;
 	p_dev_info->dma_phy_addr = dma_phy_addr;
@@ -2368,7 +2389,7 @@ zxdh_np_dev_agent_status_set(uint32_t dev_id, uint32_t agent_flag)
 	ZXDH_DEV_CFG_T *p_dev_info = NULL;
 
 	p_dev_mgr = &g_dev_mgr;
-	p_dev_info = p_dev_mgr->p_dev_array[dev_id];
+	p_dev_info = p_dev_mgr->p_dev_array[ZXDH_DEV_SLOT_ID(dev_id)];
 
 	if (p_dev_info == NULL)
 		return ZXDH_DEV_TYPE_INVALID;
@@ -2490,9 +2511,9 @@ zxdh_np_soft_sdt_tbl_set(uint32_t dev_id,
 						uint32_t table_type,
 						ZXDH_SDT_TBL_DATA_T *p_sdt_info)
 {
-	g_table_type[dev_id][sdt_no] = table_type;
-	g_sdt_info[dev_id][sdt_no].data_high32 = p_sdt_info->data_high32;
-	g_sdt_info[dev_id][sdt_no].data_low32  = p_sdt_info->data_low32;
+	g_table_type[ZXDH_DEV_SLOT_ID(dev_id)][sdt_no] = table_type;
+	g_sdt_info[ZXDH_DEV_SLOT_ID(dev_id)][sdt_no].data_high32 = p_sdt_info->data_high32;
+	g_sdt_info[ZXDH_DEV_SLOT_ID(dev_id)][sdt_no].data_low32  = p_sdt_info->data_low32;
 }
 
 static uint32_t
@@ -2666,12 +2687,13 @@ zxdh_np_ppu_parse_cls_bitmap(uint32_t dev_id,
 
 	for (cls_id = 0; cls_id < ZXDH_PPU_CLUSTER_NUM; cls_id++) {
 		cls_use = (bitmap >> cls_id) & 0x1;
-		g_ppu_cls_bit_map[dev_id].cls_use[cls_id] = cls_use;
+		g_ppu_cls_bit_map[ZXDH_DEV_SLOT_ID(dev_id)].cls_use[cls_id] = cls_use;
 	}
 
 	for (mem_id = 0; mem_id < ZXDH_PPU_INSTR_MEM_NUM; mem_id++) {
 		instr_mem = (bitmap >> (mem_id * 2)) & 0x3;
-		g_ppu_cls_bit_map[dev_id].instr_mem[mem_id] = ((instr_mem > 0) ? 1 : 0);
+		g_ppu_cls_bit_map[ZXDH_DEV_SLOT_ID(dev_id)].instr_mem[mem_id] =
+		((instr_mem > 0) ? 1 : 0);
 	}
 }
 
@@ -2731,6 +2753,7 @@ zxdh_np_agent_channel_sync_send(uint32_t dev_id,
 	uint8_t *reply_ptr = NULL;
 	uint16_t reply_msg_len = 0;
 	uint64_t agent_addr = 0;
+	uint16_t bar_pcie_id = 0;
 
 	ret = zxdh_np_agent_bar_msg_check(dev_id, p_msg);
 	if (ret != ZXDH_OK) {
@@ -2740,6 +2763,7 @@ zxdh_np_agent_channel_sync_send(uint32_t dev_id,
 
 	zxdh_np_dev_vport_get(dev_id, &vport);
 	zxdh_np_dev_agent_addr_get(dev_id, &agent_addr);
+	zxdh_np_dev_bar_pcie_id_get(dev_id, &bar_pcie_id);
 
 	if (ZXDH_IS_PF(vport))
 		in.src = ZXDH_MSG_CHAN_END_PF;
@@ -2751,6 +2775,7 @@ zxdh_np_agent_channel_sync_send(uint32_t dev_id,
 	in.payload_len = p_msg->msg_len;
 	in.dst = ZXDH_MSG_CHAN_END_RISC;
 	in.module_id = ZXDH_BAR_MDOULE_NPSDK;
+	in.src_pcieid = bar_pcie_id;
 
 	recv_buffer = rte_zmalloc(NULL, rep_len + ZXDH_CHANNEL_REPS_LEN, 0);
 	if (recv_buffer == NULL) {
@@ -3124,23 +3149,23 @@ zxdh_np_agent_channel_acl_index_release(uint32_t dev_id, uint32_t rel_type,
 static ZXDH_DTB_MGR_T *
 zxdh_np_dtb_mgr_get(uint32_t dev_id)
 {
-	if (dev_id >= ZXDH_DEV_CHANNEL_MAX)
+	if (ZXDH_DEV_SLOT_ID(dev_id) >= ZXDH_DEV_CHANNEL_MAX)
 		return NULL;
 	else
-		return p_dpp_dtb_mgr[dev_id];
+		return p_dpp_dtb_mgr[ZXDH_DEV_SLOT_ID(dev_id)];
 }
 
 static uint32_t
 zxdh_np_dtb_mgr_create(uint32_t dev_id)
 {
-	if (p_dpp_dtb_mgr[dev_id] != NULL) {
+	if (p_dpp_dtb_mgr[ZXDH_DEV_SLOT_ID(dev_id)] != NULL) {
 		PMD_DRV_LOG(ERR, "ErrorCode[0x%x]: Dma Manager"
 			" is exist!!!", ZXDH_RC_DTB_MGR_EXIST);
 		return ZXDH_RC_DTB_MGR_EXIST;
 	}
 
-	p_dpp_dtb_mgr[dev_id] = rte_zmalloc(NULL, sizeof(ZXDH_DTB_MGR_T), 0);
-	if (p_dpp_dtb_mgr[dev_id] == NULL) {
+	p_dpp_dtb_mgr[ZXDH_DEV_SLOT_ID(dev_id)] = rte_zmalloc(NULL, sizeof(ZXDH_DTB_MGR_T), 0);
+	if (p_dpp_dtb_mgr[ZXDH_DEV_SLOT_ID(dev_id)] == NULL) {
 		PMD_DRV_LOG(ERR, "malloc memory failed");
 		return ZXDH_PAR_CHK_POINT_NULL;
 	}
@@ -3153,7 +3178,7 @@ zxdh_np_dtb_soft_init(uint32_t dev_id)
 {
 	ZXDH_DTB_MGR_T *p_dtb_mgr = NULL;
 
-	if (dev_id >= ZXDH_DEV_CHANNEL_MAX)
+	if (ZXDH_DEV_SLOT_ID(dev_id) >= ZXDH_DEV_CHANNEL_MAX)
 		return 1;
 
 	p_dtb_mgr = zxdh_np_dtb_mgr_get(dev_id);
@@ -3220,8 +3245,8 @@ zxdh_np_dev_vport_set(uint32_t dev_id, uint32_t vport)
 	ZXDH_DEV_CFG_T *p_dev_info = NULL;
 
 	p_dev_mgr =  &g_dev_mgr;
-	p_dev_info = p_dev_mgr->p_dev_array[dev_id];
-	p_dev_info->vport = vport;
+	p_dev_info = p_dev_mgr->p_dev_array[ZXDH_DEV_SLOT_ID(dev_id)];
+	p_dev_info->vport[ZXDH_DEV_PF_INDEX(dev_id)] = vport;
 }
 
 static void
@@ -3231,8 +3256,8 @@ zxdh_np_dev_agent_addr_set(uint32_t dev_id, uint64_t agent_addr)
 	ZXDH_DEV_CFG_T *p_dev_info = NULL;
 
 	p_dev_mgr =  &g_dev_mgr;
-	p_dev_info = p_dev_mgr->p_dev_array[dev_id];
-	p_dev_info->agent_addr = agent_addr;
+	p_dev_info = p_dev_mgr->p_dev_array[ZXDH_DEV_SLOT_ID(dev_id)];
+	p_dev_info->agent_addr[ZXDH_DEV_PF_INDEX(dev_id)] = agent_addr;
 }
 
 static uint64_t
@@ -3259,13 +3284,13 @@ zxdh_np_pf_fw_compatible_addr_set(uint32_t dev_id, uint64_t pcie_vir_baddr)
 
 	compatible_addr = zxdh_np_fw_compatible_addr_calc(pcie_vir_baddr, compatible_offset);
 
-	g_np_fw_compat_addr[dev_id] = compatible_addr;
+	g_np_fw_compat_addr[ZXDH_DEV_SLOT_ID(dev_id)] = compatible_addr;
 }
 
 static void
 zxdh_np_fw_compatible_addr_get(uint32_t dev_id, uint64_t *p_compatible_addr)
 {
-	*p_compatible_addr = g_np_fw_compat_addr[dev_id];
+	*p_compatible_addr = g_np_fw_compat_addr[ZXDH_DEV_SLOT_ID(dev_id)];
 }
 
 static void
@@ -3684,7 +3709,7 @@ zxdh_np_dtb_queue_id_free(uint32_t dev_id,
 	ZXDH_DTB_MGR_T *p_dtb_mgr = NULL;
 	uint32_t rc;
 
-	p_dtb_mgr = p_dpp_dtb_mgr[dev_id];
+	p_dtb_mgr = p_dpp_dtb_mgr[ZXDH_DEV_SLOT_ID(dev_id)];
 	if (p_dtb_mgr == NULL)
 		return 1;
 
@@ -3706,13 +3731,13 @@ zxdh_np_dtb_queue_id_free(uint32_t dev_id,
 static ZXDH_RB_CFG *
 zxdh_np_dtb_dump_addr_rb_get(uint32_t dev_id, uint32_t queue_id)
 {
-	return g_dtb_dump_addr_rb[dev_id][queue_id];
+	return g_dtb_dump_addr_rb[ZXDH_DEV_SLOT_ID(dev_id)][queue_id];
 }
 
 static uint32_t
 zxdh_np_dtb_dump_addr_rb_set(uint32_t dev_id, uint32_t queue_id, ZXDH_RB_CFG *p_dump_addr_rb)
 {
-	g_dtb_dump_addr_rb[dev_id][queue_id] = p_dump_addr_rb;
+	g_dtb_dump_addr_rb[ZXDH_DEV_SLOT_ID(dev_id)][queue_id] = p_dump_addr_rb;
 	return ZXDH_OK;
 }
 
@@ -3880,9 +3905,9 @@ zxdh_np_dtb_queue_release(uint32_t devid,
 static void
 zxdh_np_dtb_mgr_destroy(uint32_t dev_id)
 {
-	if (p_dpp_dtb_mgr[dev_id] != NULL) {
-		rte_free(p_dpp_dtb_mgr[dev_id]);
-		p_dpp_dtb_mgr[dev_id] = NULL;
+	if (p_dpp_dtb_mgr[ZXDH_DEV_SLOT_ID(dev_id)] != NULL) {
+		rte_free(p_dpp_dtb_mgr[ZXDH_DEV_SLOT_ID(dev_id)]);
+		p_dpp_dtb_mgr[ZXDH_DEV_SLOT_ID(dev_id)] = NULL;
 	}
 }
 
@@ -3909,11 +3934,11 @@ zxdh_np_dev_del(uint32_t dev_id)
 	ZXDH_DEV_MGR_T *p_dev_mgr  = NULL;
 
 	p_dev_mgr = &g_dev_mgr;
-	p_dev_info = p_dev_mgr->p_dev_array[dev_id];
+	p_dev_info = p_dev_mgr->p_dev_array[ZXDH_DEV_SLOT_ID(dev_id)];
 
 	if (p_dev_info != NULL) {
 		rte_free(p_dev_info);
-		p_dev_mgr->p_dev_array[dev_id] = NULL;
+		p_dev_mgr->p_dev_array[ZXDH_DEV_SLOT_ID(dev_id)] = NULL;
 		p_dev_mgr->device_num--;
 	}
 }
@@ -4057,7 +4082,7 @@ zxdh_np_one_hash_soft_uninstall(uint32_t dev_id, uint32_t hash_id)
 	uint32_t i = 0;
 
 	ZXDH_D_NODE *p_node = NULL;
-	ZXDH_SE_CFG *p_se_cfg = dpp_se_cfg[dev_id];
+	ZXDH_SE_CFG *p_se_cfg = dpp_se_cfg[ZXDH_DEV_SLOT_ID(dev_id)];
 	ZXDH_RB_TN *p_rb_tn = NULL;
 	ZXDH_RB_TN *p_rb_tn_rtn = NULL;
 	HASH_DDR_CFG *p_rbkey = NULL;
@@ -4111,7 +4136,7 @@ zxdh_np_one_hash_soft_uninstall(uint32_t dev_id, uint32_t hash_id)
 	rc = zxdh_np_se_fun_deinit(p_se_cfg, (hash_id & 0xff), ZXDH_FUN_HASH);
 	ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_se_fun_deinit");
 
-	memset(g_tbl_id_info[dev_id][hash_id], 0,
+	memset(g_tbl_id_info[ZXDH_DEV_SLOT_ID(dev_id)][hash_id], 0,
 		ZXDH_HASH_TBL_ID_NUM * sizeof(ZXDH_HASH_TBL_ID_INFO));
 
 	return rc;
@@ -4134,13 +4159,13 @@ zxdh_np_hash_soft_uninstall(uint32_t dev_id)
 static uint32_t
 zxdh_np_acl_cfg_get(uint32_t dev_id, ZXDH_ACL_CFG_EX_T **p_acl_cfg)
 {
-	if (g_p_acl_ex_cfg[dev_id] == NULL) {
+	if (g_p_acl_ex_cfg[ZXDH_DEV_SLOT_ID(dev_id)] == NULL) {
 		PMD_DRV_LOG(ERR, "etcam_is not init!");
 		RTE_ASSERT(0);
 		return ZXDH_ACL_RC_ETCAMID_NOT_INIT;
 	}
 
-	*p_acl_cfg = g_p_acl_ex_cfg[dev_id];
+	*p_acl_cfg = g_p_acl_ex_cfg[ZXDH_DEV_SLOT_ID(dev_id)];
 
 	return ZXDH_OK;
 }
@@ -4190,6 +4215,16 @@ zxdh_np_acl_res_destroy(uint32_t dev_id)
 	return ZXDH_OK;
 }
 
+static void
+zxdh_np_apt_hash_global_res_uninit(uint32_t dev_id)
+{
+	if (g_apt_se_cfg[ZXDH_DEV_SLOT_ID(dev_id)] != NULL) {
+		rte_free(g_apt_se_cfg[ZXDH_DEV_SLOT_ID(dev_id)]);
+		g_apt_se_cfg[ZXDH_DEV_SLOT_ID(dev_id)] = NULL;
+		dpp_se_cfg[ZXDH_DEV_SLOT_ID(dev_id)] = NULL;
+	}
+}
+
 int
 zxdh_np_online_uninit(uint32_t dev_id,
 			char *port_name,
@@ -4201,22 +4236,35 @@ zxdh_np_online_uninit(uint32_t dev_id,
 	if (rc != 0)
 		PMD_DRV_LOG(ERR, "dtb release port name %s queue id %u", port_name, queue_id);
 
+	rc = zxdh_np_soft_res_uninstall(dev_id);
+	if (rc != 0)
+		PMD_DRV_LOG(ERR, "zxdh_np_soft_res_uninstall failed");
+
+	return 0;
+}
+
+uint32_t
+zxdh_np_soft_res_uninstall(uint32_t dev_id)
+{
+	uint32_t rc;
+
 	rc = zxdh_np_hash_soft_uninstall(dev_id);
 	if (rc != ZXDH_OK)
 		PMD_DRV_LOG(ERR, "zxdh_np_hash_soft_uninstall error! ");
 
+	zxdh_np_apt_hash_global_res_uninit(dev_id);
 	zxdh_np_acl_res_destroy(dev_id);
 	zxdh_np_dtb_mgr_destroy(dev_id);
 	zxdh_np_sdt_mgr_destroy(dev_id);
 	zxdh_np_dev_del(dev_id);
 
-	return 0;
+	return rc;
 }
 
 static uint32_t
 zxdh_np_sdt_tbl_type_get(uint32_t dev_id, uint32_t sdt_no)
 {
-	return g_table_type[dev_id][sdt_no];
+	return g_table_type[ZXDH_DEV_SLOT_ID(dev_id)][sdt_no];
 }
 
 
@@ -4697,8 +4745,8 @@ zxdh_np_eram_dtb_len_get(uint32_t mode)
 static void
 zxdh_np_sdt_tbl_data_get(uint32_t dev_id, uint32_t sdt_no, ZXDH_SDT_TBL_DATA_T *p_sdt_data)
 {
-	p_sdt_data->data_high32 = g_sdt_info[dev_id][sdt_no].data_high32;
-	p_sdt_data->data_low32  = g_sdt_info[dev_id][sdt_no].data_low32;
+	p_sdt_data->data_high32 = g_sdt_info[ZXDH_DEV_SLOT_ID(dev_id)][sdt_no].data_high32;
+	p_sdt_data->data_low32  = g_sdt_info[ZXDH_DEV_SLOT_ID(dev_id)][sdt_no].data_low32;
 }
 
 static uint32_t
@@ -5196,8 +5244,10 @@ zxdh_np_dtb_tab_down_info_set(uint32_t dev_id,
 	item_info.cmd_type = 0;
 	item_info.int_en = int_flag;
 	item_info.data_len = data_len / 4;
-	phy_addr = p_dpp_dtb_mgr[dev_id]->queue_info[queue_id].tab_down.start_phy_addr +
-		item_index * p_dpp_dtb_mgr[dev_id]->queue_info[queue_id].tab_down.item_size;
+	phy_addr = p_dpp_dtb_mgr[ZXDH_DEV_SLOT_ID(dev_id)]->queue_info[queue_id].
+		tab_down.start_phy_addr +
+		item_index * p_dpp_dtb_mgr[ZXDH_DEV_SLOT_ID(dev_id)]->queue_info[queue_id].
+		tab_down.item_size;
 	item_info.data_hddr = ((phy_addr >> 4) >> 32) & 0xffffffff;
 	item_info.data_laddr = (phy_addr >> 4) & 0xffffffff;
 
@@ -5368,7 +5418,7 @@ zxdh_np_hash_get_hash_info_from_sdt(uint32_t dev_id,
 	p_hash_entry_cfg->rst_by_size = ZXDH_GET_RST_SIZE(p_hash_entry_cfg->key_type,
 		p_hash_entry_cfg->actu_key_size);
 
-	p_se_cfg = dpp_se_cfg[dev_id];
+	p_se_cfg = dpp_se_cfg[ZXDH_DEV_SLOT_ID(dev_id)];
 	p_hash_entry_cfg->p_se_cfg = p_se_cfg;
 
 	p_func_info = ZXDH_GET_FUN_INFO(p_se_cfg, p_hash_entry_cfg->fun_id);
@@ -6048,7 +6098,7 @@ zxdh_np_apt_get_sdt_partner(uint32_t dev_id, uint32_t sdt_no)
 {
 	SE_APT_CALLBACK_T *p_apt_callback = NULL;
 
-	p_apt_callback = &g_apt_se_callback[dev_id][sdt_no];
+	p_apt_callback = &g_apt_se_callback[ZXDH_DEV_SLOT_ID(dev_id)][sdt_no];
 
 	if (p_apt_callback->table_type == ZXDH_SDT_TBLT_HASH)
 		return  p_apt_callback->se_func_info.hash_func.sdt_partner;
@@ -6639,10 +6689,10 @@ zxdh_np_stat_cfg_soft_get(uint32_t dev_id,
 {
 	ZXDH_COMM_CHECK_DEV_POINT(dev_id, p_stat_cfg);
 
-	p_stat_cfg->ddr_base_addr = g_ppu_stat_cfg[dev_id].ddr_base_addr;
-	p_stat_cfg->eram_baddr = g_ppu_stat_cfg[dev_id].eram_baddr;
-	p_stat_cfg->eram_depth = g_ppu_stat_cfg[dev_id].eram_depth;
-	p_stat_cfg->ppu_addr_offset = g_ppu_stat_cfg[dev_id].ppu_addr_offset;
+	p_stat_cfg->ddr_base_addr = g_ppu_stat_cfg[ZXDH_DEV_SLOT_ID(dev_id)].ddr_base_addr;
+	p_stat_cfg->eram_baddr = g_ppu_stat_cfg[ZXDH_DEV_SLOT_ID(dev_id)].eram_baddr;
+	p_stat_cfg->eram_depth = g_ppu_stat_cfg[ZXDH_DEV_SLOT_ID(dev_id)].eram_depth;
+	p_stat_cfg->ppu_addr_offset = g_ppu_stat_cfg[ZXDH_DEV_SLOT_ID(dev_id)].ppu_addr_offset;
 }
 
 static uint32_t
@@ -8809,7 +8859,7 @@ static void *
 zxdh_np_dev_get_se_res_ptr(uint32_t dev_id, uint32_t type)
 {
 	ZXDH_DEV_MGR_T *p_dev_mgr = &g_dev_mgr;
-	ZXDH_DEV_CFG_T *p_dev_info = p_dev_mgr->p_dev_array[dev_id];
+	ZXDH_DEV_CFG_T *p_dev_info = p_dev_mgr->p_dev_array[ZXDH_DEV_SLOT_ID(dev_id)];
 
 	if (type == ZXDH_SE_STD_NIC_RES_TYPE)
 		return (void *)&p_dev_info->dev_apt_se_tbl_res.std_nic_res;
@@ -8872,7 +8922,7 @@ zxdh_np_se_init_ex(uint32_t dev_id, ZXDH_SE_CFG *p_se_cfg)
 	ZXDH_SE_ZBLK_CFG *p_zblk_cfg = NULL;
 	ZXDH_SE_ZCELL_CFG *p_zcell_cfg = NULL;
 
-	if (dpp_se_cfg[dev_id] != NULL) {
+	if (dpp_se_cfg[ZXDH_DEV_SLOT_ID(dev_id)] != NULL) {
 		PMD_DRV_LOG(DEBUG, "SE global config is already initialized.");
 		return ZXDH_OK;
 	}
@@ -8880,7 +8930,7 @@ zxdh_np_se_init_ex(uint32_t dev_id, ZXDH_SE_CFG *p_se_cfg)
 	memset(p_se_cfg, 0, sizeof(ZXDH_SE_CFG));
 
 	p_se_cfg->dev_id = dev_id;
-	dpp_se_cfg[p_se_cfg->dev_id] = p_se_cfg;
+	dpp_se_cfg[ZXDH_DEV_SLOT_ID(p_se_cfg->dev_id)] = p_se_cfg;
 
 	p_se_cfg->p_as_rslt_wrt_fun = NULL;
 	p_se_cfg->p_client = ZXDH_COMM_VAL_TO_PTR(dev_id);
@@ -8913,16 +8963,16 @@ zxdh_np_se_init_ex(uint32_t dev_id, ZXDH_SE_CFG *p_se_cfg)
 static uint32_t
 zxdh_np_apt_hash_global_res_init(uint32_t dev_id)
 {
-	if (g_apt_se_cfg[dev_id] == NULL) {
-		g_apt_se_cfg[dev_id] = rte_zmalloc(NULL, sizeof(ZXDH_SE_CFG), 0);
-		if (g_apt_se_cfg[dev_id] == NULL) {
+	if (g_apt_se_cfg[ZXDH_DEV_SLOT_ID(dev_id)] == NULL) {
+		g_apt_se_cfg[ZXDH_DEV_SLOT_ID(dev_id)] = rte_zmalloc(NULL, sizeof(ZXDH_SE_CFG), 0);
+		if (g_apt_se_cfg[ZXDH_DEV_SLOT_ID(dev_id)] == NULL) {
 			PMD_DRV_LOG(ERR, "malloc memory failed");
 			return ZXDH_PAR_CHK_POINT_NULL;
 		}
 
-		zxdh_np_se_init_ex(dev_id, g_apt_se_cfg[dev_id]);
+		zxdh_np_se_init_ex(dev_id, g_apt_se_cfg[ZXDH_DEV_SLOT_ID(dev_id)]);
 
-		g_apt_se_cfg[dev_id]->p_client = ZXDH_COMM_VAL_TO_PTR(dev_id);
+		g_apt_se_cfg[ZXDH_DEV_SLOT_ID(dev_id)]->p_client = ZXDH_COMM_VAL_TO_PTR(dev_id);
 	}
 
 	return ZXDH_OK;
@@ -9204,7 +9254,7 @@ zxdh_np_hash_init(ZXDH_SE_CFG *p_se_cfg,
 	ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_comm_rb_init");
 
 	for (i = 0; i < zblk_num; i++)
-		g_hash_zblk_idx[dev_id][fun_id][i] = zblk_idx[i];
+		g_hash_zblk_idx[ZXDH_DEV_SLOT_ID(dev_id)][fun_id][i] = zblk_idx[i];
 
 	return rc;
 }
@@ -9219,7 +9269,7 @@ zxdh_np_apt_hash_func_res_init(uint32_t dev_id, uint32_t func_num,
 	ZXDH_APT_HASH_FUNC_RES_T *p_hash_func_res_temp = NULL;
 	ZXDH_SE_CFG *p_se_cfg = NULL;
 
-	p_se_cfg = g_apt_se_cfg[dev_id];
+	p_se_cfg = g_apt_se_cfg[ZXDH_DEV_SLOT_ID(dev_id)];
 
 	for (index = 0; index < func_num; index++) {
 		memset(zblk_idx, 0, sizeof(zblk_idx));
@@ -9474,7 +9524,7 @@ zxdh_np_apt_hash_bulk_res_init(uint32_t dev_id, uint32_t bulk_num,
 	ZXDH_HASH_DDR_RESC_CFG_T ddr_resc_cfg = {0};
 	ZXDH_SE_CFG *p_se_cfg = NULL;
 
-	p_se_cfg = g_apt_se_cfg[dev_id];
+	p_se_cfg = g_apt_se_cfg[ZXDH_DEV_SLOT_ID(dev_id)];
 
 	for (index = 0; index < bulk_num; index++) {
 		memset(&ddr_resc_cfg, 0, sizeof(ZXDH_HASH_DDR_RESC_CFG_T));
@@ -9504,7 +9554,7 @@ zxdh_np_apt_set_callback(uint32_t dev_id, uint32_t sdt_no, uint32_t table_type,
 {
 	SE_APT_CALLBACK_T *apt_func = NULL;
 
-	apt_func = &g_apt_se_callback[dev_id][sdt_no];
+	apt_func = &g_apt_se_callback[ZXDH_DEV_SLOT_ID(dev_id)][sdt_no];
 
 	apt_func->sdt_no = sdt_no;
 	apt_func->table_type = table_type;
@@ -9598,7 +9648,7 @@ zxdh_np_apt_hash_tbl_res_init(uint32_t dev_id, uint32_t tbl_num,
 	ZXDH_APT_HASH_TABLE_T *p_hash_tbl_temp = NULL;
 	ZXDH_SE_CFG *p_se_cfg = NULL;
 
-	p_se_cfg = g_apt_se_cfg[dev_id];
+	p_se_cfg = g_apt_se_cfg[ZXDH_DEV_SLOT_ID(dev_id)];
 
 	for (index = 0; index < tbl_num; index++) {
 		p_hash_tbl_temp = p_hash_tbl + index;
@@ -9688,7 +9738,7 @@ zxdh_np_acl_cfg_init_ex(ZXDH_ACL_CFG_EX_T *p_acl_cfg,
 	p_acl_cfg->dev_id = (uint32_t)(ZXDH_COMM_PTR_TO_VAL(p_acl_cfg->p_client) & 0xFFFFFFFF);
 	p_acl_cfg->flags = flags;
 
-	g_p_acl_ex_cfg[p_acl_cfg->dev_id] = p_acl_cfg;
+	g_p_acl_ex_cfg[ZXDH_DEV_SLOT_ID(p_acl_cfg->dev_id)] = p_acl_cfg;
 
 	if (flags & ZXDH_ACL_FLAG_ETCAM0_EN) {
 		p_acl_cfg->acl_etcamids.is_valid = 1;
@@ -9726,7 +9776,7 @@ zxdh_np_acl_tbl_init_ex(ZXDH_ACL_CFG_EX_T *p_acl_cfg,
 	uint32_t rc = 0;
 	uint32_t i = 0;
 
-	g_p_acl_ex_cfg[p_acl_cfg->dev_id] = p_acl_cfg;
+	g_p_acl_ex_cfg[ZXDH_DEV_SLOT_ID(p_acl_cfg->dev_id)] = p_acl_cfg;
 
 	if (p_acl_cfg->acl_tbls[table_id].is_used) {
 		PMD_DRV_LOG(ERR, "table_id[ %u ] is already used!", table_id);
@@ -9817,7 +9867,7 @@ zxdh_np_apt_acl_res_init(uint32_t dev_id, uint32_t tbl_num, ZXDH_APT_ACL_TABLE_T
 	uint8_t index = 0;
 	ZXDH_APT_ACL_TABLE_T *p_temp_acl_tbl = NULL;
 
-	rc = zxdh_np_acl_cfg_init_ex(&g_apt_acl_cfg[dev_id],
+	rc = zxdh_np_acl_cfg_init_ex(&g_apt_acl_cfg[ZXDH_DEV_SLOT_ID(dev_id)],
 						(void *)ZXDH_COMM_VAL_TO_PTR(dev_id),
 						ZXDH_ACL_FLAG_ETCAM0_EN,
 						NULL);
@@ -9832,7 +9882,7 @@ zxdh_np_apt_acl_res_init(uint32_t dev_id, uint32_t tbl_num, ZXDH_APT_ACL_TABLE_T
 						ZXDH_SDT_OPER_ADD);
 		ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_sdt_tbl_write");
 
-		 rc = zxdh_np_acl_tbl_init_ex(&g_apt_acl_cfg[dev_id],
+		 rc = zxdh_np_acl_tbl_init_ex(&g_apt_acl_cfg[ZXDH_DEV_SLOT_ID(dev_id)],
 					p_temp_acl_tbl->acl_sdt.etcam_table_id,
 					p_temp_acl_tbl->acl_sdt.as_en,
 					p_temp_acl_tbl->acl_res.entry_num,
@@ -9857,12 +9907,13 @@ zxdh_np_apt_acl_res_init(uint32_t dev_id, uint32_t tbl_num, ZXDH_APT_ACL_TABLE_T
 static void
 zxdh_np_apt_stat_res_init(uint32_t dev_id, uint32_t type, ZXDH_APT_STAT_RES_INIT_T *stat_res_init)
 {
-	g_ppu_stat_cfg[dev_id].eram_baddr = stat_res_init->eram_baddr;
-	g_ppu_stat_cfg[dev_id].eram_depth = stat_res_init->eram_depth;
+	g_ppu_stat_cfg[ZXDH_DEV_SLOT_ID(dev_id)].eram_baddr = stat_res_init->eram_baddr;
+	g_ppu_stat_cfg[ZXDH_DEV_SLOT_ID(dev_id)].eram_depth = stat_res_init->eram_depth;
 
 	if (type == ZXDH_SE_NON_STD_NIC_RES_TYPE) {
-		g_ppu_stat_cfg[dev_id].ddr_base_addr = stat_res_init->ddr_baddr;
-		g_ppu_stat_cfg[dev_id].ppu_addr_offset = stat_res_init->ppu_ddr_offset;
+		g_ppu_stat_cfg[ZXDH_DEV_SLOT_ID(dev_id)].ddr_base_addr = stat_res_init->ddr_baddr;
+		g_ppu_stat_cfg[ZXDH_DEV_SLOT_ID(dev_id)].ppu_addr_offset =
+			stat_res_init->ppu_ddr_offset;
 	}
 }
 
@@ -12330,7 +12381,8 @@ zxdh_np_dtb_acl_data_clear(uint32_t dev_id, uint32_t queue_id,
 				&element_id);
 	free(data_buff);
 	free(mask_buff);
-	free(eram_buff);
+	if (eram_buff)
+		free(eram_buff);
 
 	free(p_entry_arr);
 	ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_dtb_acl_dma_insert");
diff --git a/drivers/net/zxdh/zxdh_np.h b/drivers/net/zxdh/zxdh_np.h
index d2f9f68ca9..b0823192e7 100644
--- a/drivers/net/zxdh/zxdh_np.h
+++ b/drivers/net/zxdh/zxdh_np.h
@@ -15,9 +15,13 @@
 #define ZXDH_DISABLE                          (0)
 #define ZXDH_ENABLE                           (1)
 #define ZXDH_PORT_NAME_MAX                    (32)
-#define ZXDH_DEV_CHANNEL_MAX                  (2)
+#define ZXDH_DEV_CHANNEL_MAX                  (16)
 #define ZXDH_DEV_SDT_ID_MAX                   (256U)
-
+#define ZXDH_DEV_PF_NUM_MAX                   (8)
+#define ZXDH_DEV_SLOT_ID(DEVICE_ID)           ((DEVICE_ID) & (ZXDH_DEV_CHANNEL_MAX - 1))
+#define ZXDH_DEV_PCIE_ID(DEVICE_ID)           (((DEVICE_ID) >> 16) & 0xFFFF)
+#define ZXDH_DEV_VF_INDEX(DEVICE_ID)          (ZXDH_DEV_PCIE_ID(DEVICE_ID) & 0xFF)
+#define ZXDH_DEV_PF_INDEX(DEVICE_ID)          ((ZXDH_DEV_PCIE_ID(DEVICE_ID) >> 8) & 0x7)
 
 /*DTB*/
 #define ZXDH_DTB_QUEUE_ITEM_NUM_MAX           (32)
@@ -1130,18 +1134,19 @@ typedef struct zxdh_sys_init_ctrl_t {
 } ZXDH_SYS_INIT_CTRL_T;
 
 typedef struct dpp_dev_cfg_t {
-	uint32_t device_id;
+	uint32_t slot_id;
+	uint16_t pcie_id[ZXDH_DEV_PF_NUM_MAX];
 	ZXDH_DEV_TYPE_E dev_type;
 	uint32_t chip_ver;
 	uint32_t access_type;
 	uint32_t agent_flag;
-	uint32_t vport;
+	uint32_t vport[ZXDH_DEV_PF_NUM_MAX];
 	uint32_t fw_bar_msg_num;
-	uint64_t pcie_addr;
+	uint64_t pcie_addr[ZXDH_DEV_PF_NUM_MAX];
 	uint64_t riscv_addr;
 	uint64_t dma_vir_addr;
 	uint64_t dma_phy_addr;
-	uint64_t agent_addr;
+	uint64_t agent_addr[ZXDH_DEV_PF_NUM_MAX];
 	uint32_t init_flags[ZXDH_MODULE_INIT_MAX];
 	ZXDH_DEV_WRITE_FUNC p_pcie_write_fun;
 	ZXDH_DEV_READ_FUNC  p_pcie_read_fun;
@@ -1949,6 +1954,7 @@ int zxdh_np_dtb_stats_get(uint32_t dev_id,
 			ZXDH_STAT_CNT_MODE_E rd_mode,
 			uint32_t index,
 			uint32_t *p_data);
+uint32_t zxdh_np_soft_res_uninstall(uint32_t dev_id);
 uint32_t zxdh_np_stat_ppu_cnt_get_ex(uint32_t dev_id,
 			ZXDH_STAT_CNT_MODE_E rd_mode,
 			uint32_t index,
@@ -1988,5 +1994,4 @@ uint32_t zxdh_np_dtb_acl_table_dump_by_vport(uint32_t dev_id, uint32_t queue_id,
 	uint32_t sdt_no, uint32_t vport, uint32_t *entry_num, uint8_t *p_dump_data);
 uint32_t zxdh_np_dtb_acl_offline_delete(uint32_t dev_id, uint32_t queue_id,
 	uint32_t sdt_no, uint32_t vport, uint32_t counter_id, uint32_t rd_mode);
-
 #endif /* ZXDH_NP_H */
diff --git a/drivers/net/zxdh/zxdh_tables.c b/drivers/net/zxdh/zxdh_tables.c
index 2d2dd26499..233d53a7e8 100644
--- a/drivers/net/zxdh/zxdh_tables.c
+++ b/drivers/net/zxdh/zxdh_tables.c
@@ -37,7 +37,7 @@ zxdh_set_port_attr(struct zxdh_hw *hw, uint16_t vport, struct zxdh_port_attr_tab
 	ZXDH_DTB_ERAM_ENTRY_INFO_T entry = {vfid, (uint32_t *)port_attr};
 	ZXDH_DTB_USER_ENTRY_T user_entry_write = {ZXDH_SDT_VPORT_ATT_TABLE, (void *)&entry};
 
-	ret = zxdh_np_dtb_table_entry_write(hw->slot_id,
+	ret = zxdh_np_dtb_table_entry_write(hw->dev_id,
 				dtb_data->queueid, 1, &user_entry_write);
 	if (ret != 0)
 		PMD_DRV_LOG(ERR, "write vport_att failed vfid:%d failed", vfid);
@@ -105,7 +105,7 @@ zxdh_port_attr_uninit(struct rte_eth_dev *dev)
 			.sdt_no = ZXDH_SDT_VPORT_ATT_TABLE,
 			.p_entry_data = (void *)&port_attr_entry
 		};
-		ret = zxdh_np_dtb_table_entry_delete(hw->slot_id, dtb_data->queueid, 1, &entry);
+		ret = zxdh_np_dtb_table_entry_delete(hw->dev_id, dtb_data->queueid, 1, &entry);
 		if (ret) {
 			PMD_DRV_LOG(ERR, "delete port attr table failed");
 			ret = -1;
@@ -147,7 +147,7 @@ int zxdh_panel_table_init(struct rte_eth_dev *dev)
 		.sdt_no = ZXDH_SDT_PANEL_ATT_TABLE,
 		.p_entry_data = (void *)&panel_entry
 	};
-	ret = zxdh_np_dtb_table_entry_write(hw->slot_id, dtb_data->queueid, 1, &entry);
+	ret = zxdh_np_dtb_table_entry_write(hw->dev_id, dtb_data->queueid, 1, &entry);
 
 	if (ret) {
 		PMD_DRV_LOG(ERR, "Insert eram-panel failed, code:%u", ret);
@@ -171,7 +171,7 @@ int zxdh_get_panel_attr(struct rte_eth_dev *dev, struct zxdh_panel_table *panel_
 		.sdt_no = ZXDH_SDT_PANEL_ATT_TABLE,
 		.p_entry_data = (void *)&panel_entry
 	};
-	int ret = zxdh_np_dtb_table_entry_get(hw->slot_id, dtb_data->queueid, &entry, 1);
+	int ret = zxdh_np_dtb_table_entry_get(hw->dev_id, dtb_data->queueid, &entry, 1);
 
 	if (ret != 0)
 		PMD_DRV_LOG(ERR, "get panel table failed");
@@ -193,7 +193,7 @@ int zxdh_set_panel_attr(struct rte_eth_dev *dev, struct zxdh_panel_table *panel_
 		.sdt_no = ZXDH_SDT_PANEL_ATT_TABLE,
 		.p_entry_data = (void *)&panel_entry
 	};
-	int ret = zxdh_np_dtb_table_entry_write(hw->slot_id, dtb_data->queueid, 1, &entry);
+	int ret = zxdh_np_dtb_table_entry_write(hw->dev_id, dtb_data->queueid, 1, &entry);
 
 	if (ret)
 		PMD_DRV_LOG(ERR, "Insert panel table failed");
@@ -211,7 +211,7 @@ zxdh_get_port_attr(struct zxdh_hw *hw, uint16_t vport, struct zxdh_port_attr_tab
 	ZXDH_DTB_USER_ENTRY_T user_entry_get = {ZXDH_SDT_VPORT_ATT_TABLE, &entry};
 	int ret;
 
-	ret = zxdh_np_dtb_table_entry_get(hw->slot_id, dtb_data->queueid, &user_entry_get, 1);
+	ret = zxdh_np_dtb_table_entry_get(hw->dev_id, dtb_data->queueid, &user_entry_get, 1);
 	if (ret != 0)
 		PMD_DRV_LOG(ERR, "get port_attr vfid:%d failed, ret:%d", vfid, ret);
 
@@ -230,7 +230,7 @@ zxdh_delete_port_attr(struct zxdh_hw *hw, uint16_t vport,
 		.sdt_no = ZXDH_SDT_VPORT_ATT_TABLE,
 		.p_entry_data = (void *)&entry
 	};
-	int ret = zxdh_np_dtb_table_entry_delete(hw->slot_id, dtb_data->queueid, 1, &user_entry);
+	int ret = zxdh_np_dtb_table_entry_delete(hw->dev_id, dtb_data->queueid, 1, &user_entry);
 	if (ret != 0)
 		PMD_DRV_LOG(ERR, "delete port attr failed, vfid:%u", vport_num.vfid);
 	return ret;
@@ -261,7 +261,7 @@ zxdh_add_mac_table(struct zxdh_hw *hw, uint16_t vport, struct rte_ether_addr *ad
 			.p_entry_data = (void *)&dtb_hash_entry
 		};
 
-		ret = zxdh_np_dtb_table_entry_get(hw->slot_id, hw->dev_sd->dtb_sd.queueid,
+		ret = zxdh_np_dtb_table_entry_get(hw->dev_id, hw->dev_sd->dtb_sd.queueid,
 				&entry_get, 1);
 		if (ret == 0) {
 			if (unicast_table.entry.hit_flag != 0 &&
@@ -277,7 +277,7 @@ zxdh_add_mac_table(struct zxdh_hw *hw, uint16_t vport, struct rte_ether_addr *ad
 
 		unicast_table.entry.vfid = rte_cpu_to_be_16(vfid);
 		unicast_table.entry.hit_flag = 1;
-		ret = zxdh_np_dtb_table_entry_write(hw->slot_id,
+		ret = zxdh_np_dtb_table_entry_write(hw->dev_id,
 					hw->dev_sd->dtb_sd.queueid, 1, &entry_get);
 		if (ret) {
 			PMD_DRV_LOG(ERR, "Insert mac_table failed");
@@ -298,7 +298,7 @@ zxdh_add_mac_table(struct zxdh_hw *hw, uint16_t vport, struct rte_ether_addr *ad
 				.p_entry_data = (void *)&dtb_hash_entry
 			};
 
-			ret = zxdh_np_dtb_table_entry_get(hw->slot_id, hw->dev_sd->dtb_sd.queueid,
+			ret = zxdh_np_dtb_table_entry_get(hw->dev_id, hw->dev_sd->dtb_sd.queueid,
 					&entry_get, 1);
 			uint8_t index = (vport_num.vfid % 64) / 32;
 			uint8_t value = (vport_num.vfid % 64) % 32;
@@ -330,7 +330,7 @@ zxdh_add_mac_table(struct zxdh_hw *hw, uint16_t vport, struct rte_ether_addr *ad
 						multicast_table.entry.mc_pf_enable = false;
 				}
 			}
-			ret = zxdh_np_dtb_table_entry_write(hw->slot_id, hw->dev_sd->dtb_sd.queueid,
+			ret = zxdh_np_dtb_table_entry_write(hw->dev_id, hw->dev_sd->dtb_sd.queueid,
 						1, &entry_get);
 			if (ret) {
 				PMD_DRV_LOG(ERR, "add mac_table failed, code:%d", ret);
@@ -368,7 +368,7 @@ zxdh_del_mac_table(struct zxdh_hw *hw, uint16_t vport, struct rte_ether_addr *ad
 			.sdt_no = ZXDH_UNICAST_MAC_HASH_INDEX(hash_search_idx),
 			.p_entry_data = (void *)&dtb_hash_entry
 		};
-		ret = zxdh_np_dtb_table_entry_get(hw->slot_id, hw->dev_sd->dtb_sd.queueid,
+		ret = zxdh_np_dtb_table_entry_get(hw->dev_id, hw->dev_sd->dtb_sd.queueid,
 				&entry_get, 1);
 		if (ret == 0) {
 			if (unicast_table.entry.hit_flag != 0 &&
@@ -377,7 +377,7 @@ zxdh_del_mac_table(struct zxdh_hw *hw, uint16_t vport, struct rte_ether_addr *ad
 			}
 		}
 
-		ret = zxdh_np_dtb_table_entry_delete(hw->slot_id, hw->dev_sd->dtb_sd.queueid,
+		ret = zxdh_np_dtb_table_entry_delete(hw->dev_id, hw->dev_sd->dtb_sd.queueid,
 				1, &entry_get);
 		if (ret) {
 			PMD_DRV_LOG(ERR, "delete l2_fwd_hash_table failed, code:%d", ret);
@@ -397,7 +397,7 @@ zxdh_del_mac_table(struct zxdh_hw *hw, uint16_t vport, struct rte_ether_addr *ad
 			.p_entry_data = (void *)&dtb_hash_entry
 		};
 
-		ret = zxdh_np_dtb_table_entry_get(hw->slot_id, hw->dev_sd->dtb_sd.queueid,
+		ret = zxdh_np_dtb_table_entry_get(hw->dev_id, hw->dev_sd->dtb_sd.queueid,
 				&entry_get, 1);
 		uint8_t index = (vport_num.vfid % 64) / 32;
 		uint8_t value = (vport_num.vfid % 64) % 32;
@@ -407,7 +407,7 @@ zxdh_del_mac_table(struct zxdh_hw *hw, uint16_t vport, struct rte_ether_addr *ad
 		else
 			multicast_table.entry.mc_pf_enable = 0;
 
-		ret = zxdh_np_dtb_table_entry_write(hw->slot_id, hw->dev_sd->dtb_sd.queueid,
+		ret = zxdh_np_dtb_table_entry_write(hw->dev_id, hw->dev_sd->dtb_sd.queueid,
 				1, &entry_get);
 		if (ret) {
 			PMD_DRV_LOG(ERR, "mac_addr_add mc_table failed, code:%d", ret);
@@ -427,7 +427,7 @@ zxdh_del_mac_table(struct zxdh_hw *hw, uint16_t vport, struct rte_ether_addr *ad
 				.p_entry_data = (void *)&dtb_hash_entry
 			};
 
-			ret = zxdh_np_dtb_table_entry_get(hw->slot_id, hw->dev_sd->dtb_sd.queueid,
+			ret = zxdh_np_dtb_table_entry_get(hw->dev_id, hw->dev_sd->dtb_sd.queueid,
 					&entry_get, 1);
 			if (multicast_table.entry.mc_bitmap[0] == 0 &&
 				multicast_table.entry.mc_bitmap[1] == 0 &&
@@ -452,7 +452,7 @@ zxdh_del_mac_table(struct zxdh_hw *hw, uint16_t vport, struct rte_ether_addr *ad
 					.p_entry_data = (void *)&dtb_hash_entry
 				};
 
-				ret = zxdh_np_dtb_table_entry_delete(hw->slot_id,
+				ret = zxdh_np_dtb_table_entry_delete(hw->dev_id,
 						hw->dev_sd->dtb_sd.queueid, 1, &entry_get);
 			}
 		}
@@ -484,7 +484,7 @@ zxdh_promisc_table_init(struct rte_eth_dev *dev)
 			.p_entry_data = (void *)&eram_brocast_entry
 		};
 
-		ret = zxdh_np_dtb_table_entry_write(hw->slot_id,
+		ret = zxdh_np_dtb_table_entry_write(hw->dev_id,
 					dtb_data->queueid, 1, &entry_brocast);
 		if (ret) {
 			PMD_DRV_LOG(ERR, "write brocast table failed");
@@ -501,7 +501,7 @@ zxdh_promisc_table_init(struct rte_eth_dev *dev)
 			.p_entry_data = (void *)&eram_uc_entry
 		};
 
-		ret = zxdh_np_dtb_table_entry_write(hw->slot_id,
+		ret = zxdh_np_dtb_table_entry_write(hw->dev_id,
 					dtb_data->queueid, 1, &entry_unicast);
 		if (ret) {
 			PMD_DRV_LOG(ERR, "write unicast table failed");
@@ -518,7 +518,7 @@ zxdh_promisc_table_init(struct rte_eth_dev *dev)
 			.p_entry_data = (void *)&eram_mc_entry
 		};
 
-		ret = zxdh_np_dtb_table_entry_write(hw->slot_id, dtb_data->queueid,
+		ret = zxdh_np_dtb_table_entry_write(hw->dev_id, dtb_data->queueid,
 					1, &entry_multicast);
 		if (ret) {
 			PMD_DRV_LOG(ERR, "write multicast table failed");
@@ -553,7 +553,7 @@ zxdh_promisc_table_uninit(struct rte_eth_dev *dev)
 			.p_entry_data = (void *)&eram_brocast_entry
 		};
 
-		ret = zxdh_np_dtb_table_entry_delete(hw->slot_id,
+		ret = zxdh_np_dtb_table_entry_delete(hw->dev_id,
 				dtb_data->queueid, 1, &entry_brocast);
 		if (ret) {
 			PMD_DRV_LOG(ERR, "write brocast table failed");
@@ -570,7 +570,7 @@ zxdh_promisc_table_uninit(struct rte_eth_dev *dev)
 			.p_entry_data = (void *)&eram_uc_entry
 		};
 
-		ret = zxdh_np_dtb_table_entry_delete(hw->slot_id,
+		ret = zxdh_np_dtb_table_entry_delete(hw->dev_id,
 				dtb_data->queueid, 1, &entry_unicast);
 		if (ret) {
 			PMD_DRV_LOG(ERR, "write unicast table failed");
@@ -587,7 +587,7 @@ zxdh_promisc_table_uninit(struct rte_eth_dev *dev)
 			.p_entry_data = (void *)&eram_mc_entry
 		};
 
-		ret = zxdh_np_dtb_table_entry_delete(hw->slot_id, dtb_data->queueid,
+		ret = zxdh_np_dtb_table_entry_delete(hw->dev_id, dtb_data->queueid,
 					1, &entry_multicast);
 		if (ret) {
 			PMD_DRV_LOG(ERR, "write multicast table failed");
@@ -617,7 +617,7 @@ zxdh_dev_unicast_table_set(struct zxdh_hw *hw, uint16_t vport, bool enable)
 		.p_entry_data = (void *)&uc_table_entry
 	};
 
-	ret = zxdh_np_dtb_table_entry_get(hw->slot_id, dtb_data->queueid, &entry, 1);
+	ret = zxdh_np_dtb_table_entry_get(hw->dev_id, dtb_data->queueid, &entry, 1);
 	if (ret) {
 		PMD_DRV_LOG(ERR, "unicast_table_get_failed:%d", vfid);
 		return -ret;
@@ -634,7 +634,7 @@ zxdh_dev_unicast_table_set(struct zxdh_hw *hw, uint16_t vport, bool enable)
 		uc_table.uc_flood_pf_enable = rte_be_to_cpu_32(ZXDH_TABLE_HIT_FLAG + (enable << 6));
 	}
 
-	ret = zxdh_np_dtb_table_entry_write(hw->slot_id, dtb_data->queueid, 1, &entry);
+	ret = zxdh_np_dtb_table_entry_write(hw->dev_id, dtb_data->queueid, 1, &entry);
 	if (ret) {
 		PMD_DRV_LOG(ERR, "unicast_table_set_failed:%d", vfid);
 		return -ret;
@@ -673,7 +673,7 @@ zxdh_dev_multicast_table_set(struct zxdh_hw *hw, uint16_t vport, bool enable)
 		.p_entry_data = (void *)&mc_table_entry
 	};
 
-	ret = zxdh_np_dtb_table_entry_get(hw->slot_id, dtb_data->queueid, &entry, 1);
+	ret = zxdh_np_dtb_table_entry_get(hw->dev_id, dtb_data->queueid, &entry, 1);
 	if (ret) {
 		PMD_DRV_LOG(ERR, "allmulti_table_get_failed:%d", hw->vfid);
 		return -ret;
@@ -690,7 +690,7 @@ zxdh_dev_multicast_table_set(struct zxdh_hw *hw, uint16_t vport, bool enable)
 	} else {
 		mc_table.mc_flood_pf_enable = rte_be_to_cpu_32(ZXDH_TABLE_HIT_FLAG + (enable << 6));
 	}
-	ret = zxdh_np_dtb_table_entry_write(hw->slot_id, dtb_data->queueid, 1, &entry);
+	ret = zxdh_np_dtb_table_entry_write(hw->dev_id, dtb_data->queueid, 1, &entry);
 	if (ret) {
 		PMD_DRV_LOG(ERR, "allmulti_table_set_failed:%d", hw->vfid);
 		return -ret;
@@ -725,7 +725,7 @@ zxdh_vlan_filter_table_init(struct zxdh_hw *hw, uint16_t vport)
 		};
 		ZXDH_DTB_USER_ENTRY_T user_entry = {ZXDH_SDT_VLAN_ATT_TABLE, &entry_data};
 
-		ret = zxdh_np_dtb_table_entry_write(hw->slot_id,
+		ret = zxdh_np_dtb_table_entry_write(hw->dev_id,
 					dtb_data->queueid, 1, &user_entry);
 		if (ret != 0) {
 			PMD_DRV_LOG(ERR,
@@ -761,7 +761,7 @@ zxdh_vlan_filter_table_set(struct zxdh_hw *hw, uint16_t vport, uint16_t vlan_id,
 	ZXDH_DTB_ERAM_ENTRY_INFO_T entry_data = {index, (uint32_t *)&vlan_table};
 	ZXDH_DTB_USER_ENTRY_T user_entry_get = {ZXDH_SDT_VLAN_ATT_TABLE, &entry_data};
 
-	ret = zxdh_np_dtb_table_entry_get(hw->slot_id, dtb_data->queueid, &user_entry_get, 1);
+	ret = zxdh_np_dtb_table_entry_get(hw->dev_id, dtb_data->queueid, &user_entry_get, 1);
 	if (ret) {
 		PMD_DRV_LOG(ERR, "get vlan table failed");
 		return -1;
@@ -787,7 +787,7 @@ zxdh_vlan_filter_table_set(struct zxdh_hw *hw, uint16_t vport, uint16_t vlan_id,
 		.p_entry_data = &entry_data
 	};
 
-	ret = zxdh_np_dtb_table_entry_write(hw->slot_id,
+	ret = zxdh_np_dtb_table_entry_write(hw->dev_id,
 				dtb_data->queueid, 1, &user_entry_write);
 	if (ret != 0) {
 		PMD_DRV_LOG(ERR, "write vlan table failed");
@@ -830,7 +830,7 @@ zxdh_rss_table_set(struct zxdh_hw *hw, uint16_t vport, struct zxdh_rss_reta *rss
 			.sdt_no = ZXDH_SDT_RSS_ATT_TABLE,
 			.p_entry_data = &entry
 		};
-		ret = zxdh_np_dtb_table_entry_write(hw->slot_id,
+		ret = zxdh_np_dtb_table_entry_write(hw->dev_id,
 					dtb_data->queueid, 1, &user_entry_write);
 		if (ret != 0) {
 			PMD_DRV_LOG(ERR, "write rss base qid failed vfid:%d", vfid);
@@ -853,7 +853,7 @@ zxdh_rss_table_get(struct zxdh_hw *hw, uint16_t vport, struct zxdh_rss_reta *rss
 		ZXDH_DTB_ERAM_ENTRY_INFO_T entry = {vfid * 32 + i, (uint32_t *)&rss_vqid};
 		ZXDH_DTB_USER_ENTRY_T user_entry = {ZXDH_SDT_RSS_ATT_TABLE, &entry};
 
-		ret = zxdh_np_dtb_table_entry_get(hw->slot_id,
+		ret = zxdh_np_dtb_table_entry_get(hw->dev_id,
 					dtb_data->queueid, &user_entry, 1);
 		if (ret != 0) {
 			PMD_DRV_LOG(ERR, "get rss tbl failed, vfid:%d", vfid);
@@ -897,7 +897,7 @@ zxdh_dev_broadcast_set(struct zxdh_hw *hw, uint16_t vport, bool enable)
 			.sdt_no = ZXDH_SDT_BROCAST_ATT_TABLE,
 			.p_entry_data = (void *)&eram_entry};
 
-	ret = zxdh_np_dtb_table_entry_get(hw->slot_id, dtb_data->queueid, &entry_get, 1);
+	ret = zxdh_np_dtb_table_entry_get(hw->dev_id, dtb_data->queueid, &entry_get, 1);
 	if (ret == 0) {
 		if (enable)
 			brocast_table.bitmap[(vport_num.vfid % 64) / 32] |=
@@ -906,7 +906,7 @@ zxdh_dev_broadcast_set(struct zxdh_hw *hw, uint16_t vport, bool enable)
 			brocast_table.bitmap[(vport_num.vfid % 64) / 32] &=
 					~((UINT32_C(1) << (31 - (vport_num.vfid % 64) % 32)));
 
-		ret = zxdh_np_dtb_table_entry_write(hw->slot_id, dtb_data->queueid, 1, &entry_get);
+		ret = zxdh_np_dtb_table_entry_write(hw->dev_id, dtb_data->queueid, 1, &entry_get);
 		if (ret) {
 			PMD_DRV_LOG(ERR, "brocast_table_write_failed. code:%d", ret);
 			return -ret;
@@ -968,7 +968,7 @@ zxdh_set_port_vlan_attr(struct zxdh_hw *hw, uint16_t vport,
 		.p_entry_data = (void *)&port_entry
 	};
 
-	ret = zxdh_np_dtb_table_entry_write(hw->slot_id, hw->dev_sd->dtb_sd.queueid, 1, &entry);
+	ret = zxdh_np_dtb_table_entry_write(hw->dev_id, hw->dev_sd->dtb_sd.queueid, 1, &entry);
 	if (ret)
 		PMD_DRV_LOG(ERR, "write port_vlan tbl failed, ret:%d ", ret);
 	return ret;
@@ -991,7 +991,7 @@ zxdh_get_port_vlan_attr(struct zxdh_hw *hw, uint16_t vport,
 		.p_entry_data = (void *)&port_entry
 	};
 
-	ret = zxdh_np_dtb_table_entry_get(hw->slot_id, hw->dev_sd->dtb_sd.queueid,
+	ret = zxdh_np_dtb_table_entry_get(hw->dev_id, hw->dev_sd->dtb_sd.queueid,
 			&entry, 1);
 	if (ret)
 		PMD_DRV_LOG(ERR, "get port vlan tbl failed, ret:%d ", ret);
-- 
2.27.0

[-- Attachment #1.1.2: Type: text/html , Size: 132903 bytes --]

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

end of thread, other threads:[~2025-09-26  1:42 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2025-09-24  8:23 [PATCH v1] net/zxdh: support multiple PF process flow table Tianhao Zhang
2025-09-24 20:28 ` Stephen Hemminger
2025-09-24 20:31 ` Stephen Hemminger
2025-09-25  2:45 ` [PATCH v1] " Tianhao Zhang
2025-09-26  1:04 ` Tianhao Zhang
2025-09-26  1:28 ` [PATCH v2] net/zxdh: " Tianhao Zhang

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).