optimize basic stats ops.<br /> <br />Signed-off-by: Junlong Wang <wang.junlong1@zte.com.cn> <br />---<br /> drivers/net/zxdh/zxdh_ethdev.c     |   1 +<br /> drivers/net/zxdh/zxdh_ethdev.h     |   1 +<br /> drivers/net/zxdh/zxdh_ethdev_ops.c | 241 +++++++++++++++++++++++---<br /> drivers/net/zxdh/zxdh_ethdev_ops.h |  43 +++--<br /> drivers/net/zxdh/zxdh_msg.c        | 143 ++++++++++++++++<br /> drivers/net/zxdh/zxdh_msg.h        |   5 +<br /> drivers/net/zxdh/zxdh_np.c         | 263 +++++++++++++++++++++++++++++<br /> drivers/net/zxdh/zxdh_np.h         |  40 +++++<br /> drivers/net/zxdh/zxdh_tables.h     |  16 +-<br /> 9 files changed, 711 insertions(+), 42 deletions(-)<br /> <br />diff --git a/drivers/net/zxdh/zxdh_ethdev.c b/drivers/net/zxdh/zxdh_ethdev.c<br />index 731e1629b4..e170da7d07 100644<br />--- a/drivers/net/zxdh/zxdh_ethdev.c<br />+++ b/drivers/net/zxdh/zxdh_ethdev.c<br />@@ -1481,6 +1481,7 @@ static int zxdh_init_dev_share_data(struct rte_eth_dev *eth_dev)<br />         return -EINVAL;<br />  <br />     hw->slot_id = slot_id;<br />+    hw->dev_id = (hw->pcie_id << 16) | (hw->slot_id & 0xffff);<br />     g_dev_sd[slot_id].serial_id = serial_id;<br />     hw->dev_sd = &g_dev_sd[slot_id];<br />  <br />diff --git a/drivers/net/zxdh/zxdh_ethdev.h b/drivers/net/zxdh/zxdh_ethdev.h<br />index be026d5b72..30df1eefe3 100644<br />--- a/drivers/net/zxdh/zxdh_ethdev.h<br />+++ b/drivers/net/zxdh/zxdh_ethdev.h<br />@@ -127,6 +127,7 @@ struct zxdh_hw {<br />     uint8_t rss_enable;<br />     uint8_t rss_init;<br />     uint16_t slot_id;<br />+    uint32_t dev_id;<br />  <br />     uint8_t queue_set_flag;<br />     uint16_t queue_pool_count;<br />diff --git a/drivers/net/zxdh/zxdh_ethdev_ops.c b/drivers/net/zxdh/zxdh_ethdev_ops.c<br />index 5398607c6e..65bd176762 100644<br />--- a/drivers/net/zxdh/zxdh_ethdev_ops.c<br />+++ b/drivers/net/zxdh/zxdh_ethdev_ops.c<br />@@ -83,11 +83,6 @@ struct zxdh_hw_mac_bytes {<br />     uint64_t tx_good_bytes;<br /> };<br />  <br />-struct zxdh_np_stats_data {<br />-    uint64_t n_pkts_dropped;<br />-    uint64_t n_bytes_dropped;<br />-};<br />-<br /> struct zxdh_xstats_name_off {<br />     char name[RTE_ETH_XSTATS_NAME_SIZE];<br />     unsigned int offset;<br />@@ -1305,9 +1300,10 @@ zxdh_hw_vqm_stats_get(struct rte_eth_dev *dev, enum zxdh_agent_msg_type opcode,<br />     return 0;<br /> }<br />  <br />-static int zxdh_hw_mac_stats_get(struct rte_eth_dev *dev,<br />-                struct zxdh_hw_mac_stats *mac_stats,<br />-                struct zxdh_hw_mac_bytes *mac_bytes)<br />+static int<br />+zxdh_hw_mac_stats_get(struct rte_eth_dev *dev,<br />+        struct zxdh_hw_mac_stats *mac_stats,<br />+        struct zxdh_hw_mac_bytes *mac_bytes)<br /> {<br />     struct zxdh_hw *hw = dev->data->dev_private;<br />     uint64_t virt_addr = (uint64_t)(hw->bar_addr[ZXDH_BAR0_INDEX] + ZXDH_MAC_OFFSET);<br />@@ -1327,7 +1323,8 @@ static int zxdh_hw_mac_stats_get(struct rte_eth_dev *dev,<br />     return 0;<br /> }<br />  <br />-static void zxdh_data_hi_to_lo(uint64_t *data)<br />+void<br />+zxdh_data_hi_to_lo(uint64_t *data)<br /> {<br />     uint32_t n_data_hi;<br />     uint32_t n_data_lo;<br />@@ -1338,7 +1335,8 @@ static void zxdh_data_hi_to_lo(uint64_t *data)<br />                 rte_le_to_cpu_32(n_data_lo);<br /> }<br />  <br />-static int zxdh_np_stats_get(struct rte_eth_dev *dev, struct zxdh_hw_np_stats *np_stats)<br />+static int<br />+zxdh_np_stats_get(struct rte_eth_dev *dev, struct zxdh_hw_np_stats *np_stats)<br /> {<br />     struct zxdh_hw *hw = dev->data->dev_private;<br />     struct zxdh_dtb_shared_data *dtb_data = &hw->dev_sd->dtb_sd;<br />@@ -1348,19 +1346,70 @@ static int zxdh_np_stats_get(struct rte_eth_dev *dev, struct zxdh_hw_np_stats *n<br />     int ret = 0;<br />  <br />     idx = stats_id + ZXDH_BROAD_STATS_EGRESS_BASE;<br />+    memset(&stats_data, 0, sizeof(stats_data));<br />     ret = zxdh_np_dtb_stats_get(hw->slot_id, dtb_data->queueid,<br />-                0, idx, (uint32_t *)&np_stats->np_tx_broadcast);<br />+                0, idx, (uint32_t *)&stats_data);<br />     if (ret)<br />         return ret;<br />-    zxdh_data_hi_to_lo(&np_stats->np_tx_broadcast);<br />+    np_stats->tx_broadcast_pkts = stats_data.n_pkts_dropped;<br />+    np_stats->tx_broadcast_bytes = stats_data.n_bytes_dropped;<br />+    zxdh_data_hi_to_lo(&np_stats->tx_broadcast_pkts);<br />+    zxdh_data_hi_to_lo(&np_stats->tx_broadcast_bytes);<br />  <br />     idx = stats_id + ZXDH_BROAD_STATS_INGRESS_BASE;<br />     memset(&stats_data, 0, sizeof(stats_data));<br />     ret = zxdh_np_dtb_stats_get(hw->slot_id, dtb_data->queueid,<br />-                0, idx, (uint32_t *)&np_stats->np_rx_broadcast);<br />+                0, idx, (uint32_t *)&stats_data);<br />+    if (ret)<br />+        return ret;<br />+    np_stats->rx_broadcast_pkts = stats_data.n_pkts_dropped;<br />+    np_stats->rx_broadcast_bytes = stats_data.n_bytes_dropped;<br />+    zxdh_data_hi_to_lo(&np_stats->rx_broadcast_pkts);<br />+    zxdh_data_hi_to_lo(&np_stats->rx_broadcast_bytes);<br />+<br />+    idx = stats_id + ZXDH_MULTICAST_STATS_EGRESS_BASE;<br />+    memset(&stats_data, 0, sizeof(stats_data));<br />+    ret = zxdh_np_dtb_stats_get(hw->slot_id, dtb_data->queueid,<br />+                0, idx, (uint32_t *)&stats_data);<br />+    if (ret)<br />+        return ret;<br />+    np_stats->tx_multicast_pkts = stats_data.n_pkts_dropped;<br />+    np_stats->tx_multicast_bytes = stats_data.n_bytes_dropped;<br />+    zxdh_data_hi_to_lo(&np_stats->tx_multicast_pkts);<br />+    zxdh_data_hi_to_lo(&np_stats->tx_multicast_bytes);<br />+<br />+    idx = stats_id + ZXDH_MULTICAST_STATS_INGRESS_BASE;<br />+    memset(&stats_data, 0, sizeof(stats_data));<br />+    ret = zxdh_np_dtb_stats_get(hw->slot_id, dtb_data->queueid,<br />+                0, idx, (uint32_t *)&stats_data);<br />+    if (ret)<br />+        return ret;<br />+    np_stats->rx_multicast_pkts = stats_data.n_pkts_dropped;<br />+    np_stats->rx_multicast_bytes = stats_data.n_bytes_dropped;<br />+    zxdh_data_hi_to_lo(&np_stats->rx_multicast_pkts);<br />+    zxdh_data_hi_to_lo(&np_stats->rx_multicast_bytes);<br />+<br />+    idx = stats_id + ZXDH_UNICAST_STATS_EGRESS_BASE;<br />+    memset(&stats_data, 0, sizeof(stats_data));<br />+    ret = zxdh_np_dtb_stats_get(hw->slot_id, dtb_data->queueid,<br />+                0, idx, (uint32_t *)&stats_data);<br />+    if (ret)<br />+        return ret;<br />+    np_stats->tx_unicast_pkts = stats_data.n_pkts_dropped;<br />+    np_stats->tx_unicast_bytes = stats_data.n_bytes_dropped;<br />+    zxdh_data_hi_to_lo(&np_stats->tx_unicast_pkts);<br />+    zxdh_data_hi_to_lo(&np_stats->tx_unicast_bytes);<br />+<br />+    idx = stats_id + ZXDH_UNICAST_STATS_INGRESS_BASE;<br />+    memset(&stats_data, 0, sizeof(stats_data));<br />+    ret = zxdh_np_dtb_stats_get(hw->slot_id, dtb_data->queueid,<br />+                0, idx, (uint32_t *)&stats_data);<br />     if (ret)<br />         return ret;<br />-    zxdh_data_hi_to_lo(&np_stats->np_rx_broadcast);<br />+    np_stats->rx_unicast_pkts = stats_data.n_pkts_dropped;<br />+    np_stats->rx_unicast_bytes = stats_data.n_bytes_dropped;<br />+    zxdh_data_hi_to_lo(&np_stats->rx_unicast_pkts);<br />+    zxdh_data_hi_to_lo(&np_stats->rx_unicast_bytes);<br />  <br />     idx = stats_id + ZXDH_MTU_STATS_EGRESS_BASE;<br />     memset(&stats_data, 0, sizeof(stats_data));<br />@@ -1368,11 +1417,10 @@ static int zxdh_np_stats_get(struct rte_eth_dev *dev, struct zxdh_hw_np_stats *n<br />                 1, idx, (uint32_t *)&stats_data);<br />     if (ret)<br />         return ret;<br />-<br />-    np_stats->np_tx_mtu_drop_pkts = stats_data.n_pkts_dropped;<br />-    np_stats->np_tx_mtu_drop_bytes = stats_data.n_bytes_dropped;<br />-    zxdh_data_hi_to_lo(&np_stats->np_tx_mtu_drop_pkts);<br />-    zxdh_data_hi_to_lo(&np_stats->np_tx_mtu_drop_bytes);<br />+    np_stats->tx_mtu_drop_pkts = stats_data.n_pkts_dropped;<br />+    np_stats->tx_mtu_drop_bytes = stats_data.n_bytes_dropped;<br />+    zxdh_data_hi_to_lo(&np_stats->tx_mtu_drop_pkts);<br />+    zxdh_data_hi_to_lo(&np_stats->tx_mtu_drop_bytes);<br />  <br />     idx = stats_id + ZXDH_MTU_STATS_INGRESS_BASE;<br />     memset(&stats_data, 0, sizeof(stats_data));<br />@@ -1380,10 +1428,32 @@ static int zxdh_np_stats_get(struct rte_eth_dev *dev, struct zxdh_hw_np_stats *n<br />                 1, idx, (uint32_t *)&stats_data);<br />     if (ret)<br />         return ret;<br />-    np_stats->np_rx_mtu_drop_pkts = stats_data.n_pkts_dropped;<br />-    np_stats->np_rx_mtu_drop_bytes = stats_data.n_bytes_dropped;<br />-    zxdh_data_hi_to_lo(&np_stats->np_rx_mtu_drop_pkts);<br />-    zxdh_data_hi_to_lo(&np_stats->np_rx_mtu_drop_bytes);<br />+    np_stats->rx_mtu_drop_pkts = stats_data.n_pkts_dropped;<br />+    np_stats->rx_mtu_drop_bytes = stats_data.n_bytes_dropped;<br />+    zxdh_data_hi_to_lo(&np_stats->rx_mtu_drop_pkts);<br />+    zxdh_data_hi_to_lo(&np_stats->rx_mtu_drop_bytes);<br />+<br />+    idx = stats_id + ZXDH_MTR_STATS_EGRESS_BASE;<br />+    memset(&stats_data, 0, sizeof(stats_data));<br />+    ret = zxdh_np_dtb_stats_get(hw->slot_id, dtb_data->queueid,<br />+                1, idx, (uint32_t *)&stats_data);<br />+    if (ret)<br />+        return ret;<br />+    np_stats->tx_mtr_drop_pkts = stats_data.n_pkts_dropped;<br />+    np_stats->tx_mtr_drop_bytes = stats_data.n_bytes_dropped;<br />+    zxdh_data_hi_to_lo(&np_stats->tx_mtr_drop_pkts);<br />+    zxdh_data_hi_to_lo(&np_stats->tx_mtr_drop_bytes);<br />+<br />+    idx = stats_id + ZXDH_MTR_STATS_INGRESS_BASE;<br />+    memset(&stats_data, 0, sizeof(stats_data));<br />+    ret = zxdh_np_dtb_stats_get(hw->slot_id, dtb_data->queueid,<br />+                1, idx, (uint32_t *)&stats_data);<br />+    if (ret)<br />+        return ret;<br />+    np_stats->rx_mtr_drop_pkts = stats_data.n_pkts_dropped;<br />+    np_stats->rx_mtr_drop_bytes = stats_data.n_bytes_dropped;<br />+    zxdh_data_hi_to_lo(&np_stats->rx_mtr_drop_pkts);<br />+    zxdh_data_hi_to_lo(&np_stats->rx_mtr_drop_bytes);<br />  <br />     return 0;<br /> }<br />@@ -1408,8 +1478,7 @@ zxdh_hw_np_stats_get(struct rte_eth_dev *dev, struct zxdh_hw_np_stats *np_stats)<br />                     &reply_info, sizeof(struct zxdh_msg_reply_info));<br />         if (ret) {<br />             PMD_DRV_LOG(ERR,<br />-                "%s Failed to send msg: port 0x%x msg type",<br />-                __func__, hw->vport.vport);<br />+                "Failed to send msg: port 0x%x msg type", hw->vport.vport);<br />             return -1;<br />         }<br />         memcpy(np_stats, &reply_info.reply_body.np_stats, sizeof(struct zxdh_hw_np_stats));<br />@@ -1438,8 +1507,8 @@ zxdh_dev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)<br />     stats->ibytes = vqm_stats.rx_bytes;<br />     stats->obytes = vqm_stats.tx_bytes;<br />     stats->imissed = vqm_stats.rx_drop + mac_stats.rx_drop;<br />-    stats->ierrors = vqm_stats.rx_error + mac_stats.rx_error + np_stats.np_rx_mtu_drop_pkts;<br />-    stats->oerrors = vqm_stats.tx_error + mac_stats.tx_error + np_stats.np_tx_mtu_drop_pkts;<br />+    stats->ierrors = vqm_stats.rx_error + mac_stats.rx_error + np_stats.rx_mtu_drop_pkts;<br />+    stats->oerrors = vqm_stats.tx_error + mac_stats.tx_error + np_stats.tx_mtu_drop_pkts;<br />  <br />     stats->rx_nombuf = dev->data->rx_mbuf_alloc_failed;<br />     for (i = 0; (i < dev->data->nb_rx_queues) && (i < RTE_ETHDEV_QUEUE_STAT_CNTRS); i++) {<br />@@ -1474,7 +1543,8 @@ zxdh_dev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)<br />     return 0;<br /> }<br />  <br />-static int zxdh_hw_stats_reset(struct rte_eth_dev *dev, enum zxdh_agent_msg_type opcode)<br />+static int<br />+zxdh_hw_stats_reset(struct rte_eth_dev *dev, enum zxdh_agent_msg_type opcode)<br /> {<br />     struct zxdh_hw *hw = dev->data->dev_private;<br />     struct zxdh_msg_info msg_info = {0};<br />@@ -1505,13 +1575,128 @@ static int zxdh_hw_stats_reset(struct rte_eth_dev *dev, enum zxdh_agent_msg_type<br />     return 0;<br /> }<br />  <br />+int<br />+zxdh_hw_np_stats_pf_reset(struct rte_eth_dev *dev, uint32_t stats_id)<br />+{<br />+    struct zxdh_hw *hw = dev->data->dev_private;<br />+    struct zxdh_hw_stats_data stats_data;<br />+    uint32_t idx = 0;<br />+    int ret = 0;<br />+<br />+    idx = stats_id + ZXDH_UNICAST_STATS_EGRESS_BASE;<br />+    ret = zxdh_np_stat_ppu_cnt_get_ex(hw->dev_id, 1, idx,<br />+            1, (uint32_t *)&stats_data);<br />+    if (ret)<br />+        return ret;<br />+<br />+    idx = stats_id + ZXDH_UNICAST_STATS_INGRESS_BASE;<br />+    ret = zxdh_np_stat_ppu_cnt_get_ex(hw->dev_id, 1, idx,<br />+            1, (uint32_t *)&stats_data);<br />+    if (ret)<br />+        return ret;<br />+<br />+    idx = stats_id + ZXDH_MULTICAST_STATS_EGRESS_BASE;<br />+    ret = zxdh_np_stat_ppu_cnt_get_ex(hw->dev_id, 1, idx,<br />+            1, (uint32_t *)&stats_data);<br />+    if (ret)<br />+        return ret;<br />+<br />+    idx = stats_id + ZXDH_MULTICAST_STATS_INGRESS_BASE;<br />+    ret = zxdh_np_stat_ppu_cnt_get_ex(hw->dev_id, 1, idx,<br />+            1, (uint32_t *)&stats_data);<br />+    if (ret)<br />+        return ret;<br />+<br />+    idx = stats_id + ZXDH_BROAD_STATS_EGRESS_BASE;<br />+    ret = zxdh_np_stat_ppu_cnt_get_ex(hw->dev_id, 1, idx,<br />+            1, (uint32_t *)&stats_data);<br />+    if (ret)<br />+        return ret;<br />+<br />+    idx = stats_id + ZXDH_BROAD_STATS_INGRESS_BASE;<br />+    ret = zxdh_np_stat_ppu_cnt_get_ex(hw->dev_id, 1, idx,<br />+            1, (uint32_t *)&stats_data);<br />+    if (ret)<br />+        return ret;<br />+<br />+    idx = stats_id + ZXDH_MTU_STATS_EGRESS_BASE;<br />+    ret = zxdh_np_stat_ppu_cnt_get_ex(hw->dev_id, 1, idx,<br />+            1, (uint32_t *)&stats_data);<br />+    if (ret)<br />+        return ret;<br />+<br />+    idx = stats_id + ZXDH_MTU_STATS_INGRESS_BASE;<br />+    ret = zxdh_np_stat_ppu_cnt_get_ex(hw->dev_id, 1, idx,<br />+            1, (uint32_t *)&stats_data);<br />+    if (ret)<br />+        return ret;<br />+<br />+    idx = stats_id + ZXDH_MTR_STATS_EGRESS_BASE;<br />+    ret = zxdh_np_stat_ppu_cnt_get_ex(hw->dev_id, 1, idx,<br />+            1, (uint32_t *)&stats_data);<br />+    if (ret)<br />+        return ret;<br />+<br />+    idx = stats_id + ZXDH_MTR_STATS_INGRESS_BASE;<br />+    ret = zxdh_np_stat_ppu_cnt_get_ex(hw->dev_id, 1, idx,<br />+            1, (uint32_t *)&stats_data);<br />+<br />+    return ret;<br />+}<br />+<br />+static int<br />+zxdh_hw_np_stats_vf_reset(struct rte_eth_dev *dev)<br />+{<br />+    struct zxdh_hw *hw = dev->data->dev_private;<br />+    struct zxdh_msg_info msg_info = {0};<br />+    struct zxdh_msg_reply_info reply_info = {0};<br />+    int ret = 0;<br />+<br />+    msg_info.data.np_stats_query.clear_mode = 1;<br />+    zxdh_msg_head_build(hw, ZXDH_GET_NP_STATS, &msg_info);<br />+    ret = zxdh_vf_send_msg_to_pf(dev, &msg_info, sizeof(struct zxdh_msg_info),<br />+            &reply_info, sizeof(reply_info));<br />+    if (ret)<br />+        PMD_DRV_LOG(ERR, "Failed to send ZXDH_PORT_METER_STAT_GET msg. code:%d", ret);<br />+<br />+    return ret;<br />+}<br />+<br />+static int<br />+zxdh_np_stats_reset(struct rte_eth_dev *dev)<br />+{<br />+    struct zxdh_hw *hw = dev->data->dev_private;<br />+    uint32_t stats_id = zxdh_vport_to_vfid(hw->vport);<br />+    int ret;<br />+<br />+    if (hw->is_pf)<br />+        ret = zxdh_hw_np_stats_pf_reset(dev, stats_id);<br />+    else<br />+        ret = zxdh_hw_np_stats_vf_reset(dev);<br />+    return ret;<br />+}<br />+<br /> int zxdh_dev_stats_reset(struct rte_eth_dev *dev)<br /> {<br />     struct zxdh_hw *hw = dev->data->dev_private;<br />+    int i = 0;<br />  <br />     zxdh_hw_stats_reset(dev, ZXDH_VQM_DEV_STATS_RESET);<br />     if (hw->is_pf)<br />         zxdh_hw_stats_reset(dev, ZXDH_MAC_STATS_RESET);<br />+    zxdh_np_stats_reset(dev);<br />+    for (i = 0; ((i < dev->data->nb_rx_queues) && (i < RTE_ETHDEV_QUEUE_STAT_CNTRS)); i++) {<br />+        struct zxdh_virtnet_rx *rxvq = dev->data->rx_queues[i];<br />+        if (rxvq == NULL)<br />+            continue;<br />+        memset(&rxvq->stats, 0, sizeof(struct zxdh_virtnet_stats));<br />+    }<br />+    for (i = 0; ((i < dev->data->nb_tx_queues) && (i < RTE_ETHDEV_QUEUE_STAT_CNTRS)); i++) {<br />+        struct zxdh_virtnet_tx *txvq = dev->data->tx_queues[i];<br />+        if (txvq == NULL)<br />+            continue;<br />+        memset(&txvq->stats, 0, sizeof(struct zxdh_virtnet_stats));<br />+    }<br />  <br />     return 0;<br /> }<br />diff --git a/drivers/net/zxdh/zxdh_ethdev_ops.h b/drivers/net/zxdh/zxdh_ethdev_ops.h<br />index 8dbd73e2a5..9ab323fde1 100644<br />--- a/drivers/net/zxdh/zxdh_ethdev_ops.h<br />+++ b/drivers/net/zxdh/zxdh_ethdev_ops.h<br />@@ -28,17 +28,38 @@<br />  <br /> #define ZXDH_ETHER_MIN_MTU      68<br />  <br />+struct zxdh_np_stats_data {<br />+    uint64_t n_pkts_dropped;<br />+    uint64_t n_bytes_dropped;<br />+};<br />+<br />+struct zxdh_hw_stats_data {<br />+    uint64_t n_pkts_dropped;<br />+    uint64_t n_bytes_dropped;<br />+};<br />+<br /> struct zxdh_hw_np_stats {<br />-    uint64_t np_rx_broadcast;<br />-    uint64_t np_tx_broadcast;<br />-    uint64_t np_rx_mtu_drop_pkts;<br />-    uint64_t np_tx_mtu_drop_pkts;<br />-    uint64_t np_rx_mtu_drop_bytes;<br />-    uint64_t np_tx_mtu_drop_bytes;<br />-    uint64_t np_rx_mtr_drop_pkts;<br />-    uint64_t np_tx_mtr_drop_pkts;<br />-    uint64_t np_rx_mtr_drop_bytes;<br />-    uint64_t np_tx_mtr_drop_bytes;<br />+    uint64_t rx_unicast_pkts;<br />+    uint64_t tx_unicast_pkts;<br />+    uint64_t rx_unicast_bytes;<br />+    uint64_t tx_unicast_bytes;<br />+    uint64_t rx_multicast_pkts;<br />+    uint64_t tx_multicast_pkts;<br />+    uint64_t rx_multicast_bytes;<br />+    uint64_t tx_multicast_bytes;<br />+    uint64_t rx_broadcast_pkts;<br />+    uint64_t tx_broadcast_pkts;<br />+    uint64_t rx_broadcast_bytes;<br />+    uint64_t tx_broadcast_bytes;<br />+    uint64_t rx_mtu_drop_pkts;<br />+    uint64_t tx_mtu_drop_pkts;<br />+    uint64_t rx_mtu_drop_bytes;<br />+    uint64_t tx_mtu_drop_bytes;<br />+    uint64_t rx_mtr_drop_pkts;<br />+    uint64_t tx_mtr_drop_pkts;<br />+    uint64_t rx_mtr_drop_bytes;<br />+    uint64_t tx_mtr_drop_bytes;<br />+    uint64_t tx_ssvpc_pkts;<br /> };<br />  <br /> struct zxdh_hw_vqm_stats {<br />@@ -76,5 +97,7 @@ int zxdh_rss_configure(struct rte_eth_dev *dev);<br /> int zxdh_dev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats);<br /> int zxdh_dev_stats_reset(struct rte_eth_dev *dev);<br /> int zxdh_dev_mtu_set(struct rte_eth_dev *dev, uint16_t new_mtu);<br />+int zxdh_hw_np_stats_pf_reset(struct rte_eth_dev *dev, uint32_t stats_id);<br />+void zxdh_data_hi_to_lo(uint64_t *data);<br />  <br /> #endif /* ZXDH_ETHDEV_OPS_H */<br />diff --git a/drivers/net/zxdh/zxdh_msg.c b/drivers/net/zxdh/zxdh_msg.c<br />index 9f59b13bf3..4367c25ac2 100644<br />--- a/drivers/net/zxdh/zxdh_msg.c<br />+++ b/drivers/net/zxdh/zxdh_msg.c<br />@@ -16,6 +16,7 @@<br /> #include "zxdh_msg.h" <br /> #include "zxdh_pci.h" <br /> #include "zxdh_tables.h" <br />+#include "zxdh_np.h" <br />  <br /> #define ZXDH_REPS_INFO_FLAG_USABLE  0x00<br /> #define ZXDH_BAR_SEQID_NUM_MAX      256<br />@@ -1711,6 +1712,147 @@ zxdh_vf_port_attr_set(struct zxdh_hw *pf_hw, uint16_t vport, void *cfg_data,<br />     return ret;<br /> }<br />  <br />+static int<br />+zxdh_vf_np_stats_update(struct zxdh_hw *pf_hw, uint16_t vport,<br />+        void *cfg_data __rte_unused,<br />+        struct zxdh_msg_reply_body *res_info __rte_unused,<br />+        uint16_t *res_len __rte_unused)<br />+{<br />+    struct zxdh_np_stats_updata_msg *np_stats_query =<br />+             (struct zxdh_np_stats_updata_msg  *)cfg_data;<br />+    union zxdh_virport_num vport_num = {.vport = vport};<br />+    struct zxdh_hw_stats_data stats_data;<br />+    uint32_t is_clr = np_stats_query->clear_mode;<br />+    uint32_t idx = 0;<br />+    int ret = 0;<br />+<br />+    if (!res_len || !res_info) {<br />+        PMD_DRV_LOG(ERR, "get stat invalid inparams");<br />+        return -1;<br />+    }<br />+    if (is_clr == 1) {<br />+        ret = zxdh_hw_np_stats_pf_reset(pf_hw->eth_dev, zxdh_vport_to_vfid(vport_num));<br />+        return ret;<br />+    }<br />+    idx = zxdh_vport_to_vfid(vport_num) + ZXDH_UNICAST_STATS_EGRESS_BASE;<br />+    ret = zxdh_np_dtb_stats_get(pf_hw->dev_id, pf_hw->dev_sd->dtb_sd.queueid,<br />+            0, idx, (uint32_t *)&stats_data);<br />+    if (ret) {<br />+        PMD_DRV_LOG(ERR, "get stats failed. code:%d", ret);<br />+        return ret;<br />+    }<br />+    zxdh_data_hi_to_lo(&res_info->np_stats.tx_unicast_pkts);<br />+    zxdh_data_hi_to_lo(&res_info->np_stats.tx_unicast_bytes);<br />+<br />+    idx = zxdh_vport_to_vfid(vport_num) + ZXDH_UNICAST_STATS_INGRESS_BASE;<br />+    memset(&stats_data, 0, sizeof(stats_data));<br />+    ret = zxdh_np_dtb_stats_get(pf_hw->dev_id, pf_hw->dev_sd->dtb_sd.queueid,<br />+            0, idx, (uint32_t *)&stats_data);<br />+    if (ret) {<br />+        PMD_DRV_LOG(ERR, "get stats failed. code:%d", ret);<br />+        return ret;<br />+    }<br />+    zxdh_data_hi_to_lo(&res_info->np_stats.rx_unicast_pkts);<br />+    zxdh_data_hi_to_lo(&res_info->np_stats.rx_unicast_bytes);<br />+<br />+    idx = zxdh_vport_to_vfid(vport_num) + ZXDH_MULTICAST_STATS_EGRESS_BASE;<br />+    ret = zxdh_np_dtb_stats_get(pf_hw->dev_id, pf_hw->dev_sd->dtb_sd.queueid,<br />+            0, idx, (uint32_t *)&stats_data);<br />+    if (ret) {<br />+        PMD_DRV_LOG(ERR, "get stats failed. code:%d", ret);<br />+        return ret;<br />+    }<br />+    zxdh_data_hi_to_lo(&res_info->np_stats.tx_multicast_pkts);<br />+    zxdh_data_hi_to_lo(&res_info->np_stats.tx_multicast_bytes);<br />+<br />+    idx = zxdh_vport_to_vfid(vport_num) + ZXDH_MULTICAST_STATS_INGRESS_BASE;<br />+    memset(&stats_data, 0, sizeof(stats_data));<br />+    ret = zxdh_np_dtb_stats_get(pf_hw->dev_id, pf_hw->dev_sd->dtb_sd.queueid,<br />+            0, idx, (uint32_t *)&stats_data);<br />+    if (ret) {<br />+        PMD_DRV_LOG(ERR, "get stats failed. code:%d", ret);<br />+        return ret;<br />+    }<br />+    zxdh_data_hi_to_lo(&res_info->np_stats.rx_multicast_pkts);<br />+    zxdh_data_hi_to_lo(&res_info->np_stats.rx_multicast_bytes);<br />+<br />+    idx = zxdh_vport_to_vfid(vport_num) + ZXDH_BROAD_STATS_EGRESS_BASE;<br />+    ret = zxdh_np_dtb_stats_get(pf_hw->dev_id, pf_hw->dev_sd->dtb_sd.queueid,<br />+            0, idx, (uint32_t *)&stats_data);<br />+    if (ret) {<br />+        PMD_DRV_LOG(ERR, "get stats failed. code:%d", ret);<br />+        return ret;<br />+    }<br />+    zxdh_data_hi_to_lo(&res_info->np_stats.tx_broadcast_pkts);<br />+    zxdh_data_hi_to_lo(&res_info->np_stats.tx_broadcast_bytes);<br />+<br />+    idx = zxdh_vport_to_vfid(vport_num) + ZXDH_BROAD_STATS_INGRESS_BASE;<br />+    memset(&stats_data, 0, sizeof(stats_data));<br />+    ret = zxdh_np_dtb_stats_get(pf_hw->dev_id, pf_hw->dev_sd->dtb_sd.queueid,<br />+            0, idx, (uint32_t *)&stats_data);<br />+    if (ret) {<br />+        PMD_DRV_LOG(ERR, "get stats failed. code:%d", ret);<br />+        return ret;<br />+    }<br />+    zxdh_data_hi_to_lo(&res_info->np_stats.rx_broadcast_pkts);<br />+    zxdh_data_hi_to_lo(&res_info->np_stats.rx_broadcast_bytes);<br />+<br />+    idx = zxdh_vport_to_vfid(vport_num) + ZXDH_MTU_STATS_EGRESS_BASE;<br />+    memset(&stats_data, 0, sizeof(stats_data));<br />+    ret = zxdh_np_dtb_stats_get(pf_hw->dev_id, pf_hw->dev_sd->dtb_sd.queueid,<br />+            1, idx, (uint32_t *)&stats_data);<br />+    if (ret) {<br />+        PMD_DRV_LOG(ERR, "get stats failed. code:%d", ret);<br />+        return ret;<br />+    }<br />+    res_info->np_stats.tx_mtu_drop_pkts = stats_data.n_pkts_dropped;<br />+    res_info->np_stats.tx_mtu_drop_bytes = stats_data.n_bytes_dropped;<br />+    zxdh_data_hi_to_lo(&res_info->np_stats.tx_mtu_drop_pkts);<br />+    zxdh_data_hi_to_lo(&res_info->np_stats.tx_mtu_drop_bytes);<br />+<br />+    idx = zxdh_vport_to_vfid(vport_num) + ZXDH_MTU_STATS_INGRESS_BASE;<br />+    memset(&stats_data, 0, sizeof(stats_data));<br />+    ret = zxdh_np_dtb_stats_get(pf_hw->dev_id, pf_hw->dev_sd->dtb_sd.queueid,<br />+            1, idx, (uint32_t *)&stats_data);<br />+    if (ret) {<br />+        PMD_DRV_LOG(ERR, "get stats failed. code:%d", ret);<br />+        return ret;<br />+    }<br />+    res_info->np_stats.rx_mtu_drop_pkts = stats_data.n_pkts_dropped;<br />+    res_info->np_stats.rx_mtu_drop_bytes = stats_data.n_bytes_dropped;<br />+    zxdh_data_hi_to_lo(&res_info->np_stats.rx_mtu_drop_pkts);<br />+    zxdh_data_hi_to_lo(&res_info->np_stats.rx_mtu_drop_bytes);<br />+<br />+    idx = zxdh_vport_to_vfid(vport_num) + ZXDH_MTR_STATS_EGRESS_BASE;<br />+    memset(&stats_data, 0, sizeof(stats_data));<br />+    ret = zxdh_np_dtb_stats_get(pf_hw->dev_id, pf_hw->dev_sd->dtb_sd.queueid,<br />+            1, idx, (uint32_t *)&stats_data);<br />+    if (ret) {<br />+        PMD_DRV_LOG(ERR, "get stats failed. code:%d", ret);<br />+        return ret;<br />+    }<br />+    res_info->np_stats.tx_mtr_drop_pkts = stats_data.n_pkts_dropped;<br />+    res_info->np_stats.tx_mtr_drop_bytes = stats_data.n_bytes_dropped;<br />+    zxdh_data_hi_to_lo(&res_info->np_stats.tx_mtr_drop_pkts);<br />+    zxdh_data_hi_to_lo(&res_info->np_stats.tx_mtr_drop_bytes);<br />+<br />+    idx = zxdh_vport_to_vfid(vport_num) + ZXDH_MTR_STATS_INGRESS_BASE;<br />+    memset(&stats_data, 0, sizeof(stats_data));<br />+    ret = zxdh_np_dtb_stats_get(pf_hw->dev_id, pf_hw->dev_sd->dtb_sd.queueid,<br />+            1, idx, (uint32_t *)&stats_data);<br />+    if (ret) {<br />+        PMD_DRV_LOG(ERR, "get stats failed. code:%d", ret);<br />+        return ret;<br />+    }<br />+    res_info->np_stats.rx_mtr_drop_pkts = stats_data.n_pkts_dropped;<br />+    res_info->np_stats.rx_mtr_drop_bytes = stats_data.n_bytes_dropped;<br />+    zxdh_data_hi_to_lo(&res_info->np_stats.rx_mtr_drop_pkts);<br />+    zxdh_data_hi_to_lo(&res_info->np_stats.rx_mtr_drop_bytes);<br />+    *res_len = sizeof(struct zxdh_hw_np_stats);<br />+<br />+    return 0;<br />+}<br />+<br /> zxdh_msg_process_callback zxdh_proc_cb[] = {<br />     [ZXDH_NULL] = NULL,<br />     [ZXDH_VF_PORT_INIT] = zxdh_vf_port_init,<br />@@ -1728,6 +1870,7 @@ zxdh_msg_process_callback zxdh_proc_cb[] = {<br />     [ZXDH_RSS_HF_GET] = zxdh_vf_rss_hf_get,<br />     [ZXDH_VLAN_OFFLOAD] = zxdh_vf_set_vlan_offload,<br />     [ZXDH_PORT_ATTRS_SET] = zxdh_vf_port_attr_set,<br />+    [ZXDH_GET_NP_STATS] = zxdh_vf_np_stats_update,<br /> };<br />  <br /> static inline int<br />diff --git a/drivers/net/zxdh/zxdh_msg.h b/drivers/net/zxdh/zxdh_msg.h<br />index 5a7085ad7b..7c0d2adc4c 100644<br />--- a/drivers/net/zxdh/zxdh_msg.h<br />+++ b/drivers/net/zxdh/zxdh_msg.h<br />@@ -316,6 +316,10 @@ enum zxdh_reps_flag {<br />     ZXDH_REPS_INVALID = 0xee,<br /> };<br />  <br />+struct zxdh_np_stats_updata_msg {<br />+    uint32_t clear_mode;<br />+};<br />+<br /> struct zxdh_link_info_msg {<br />     uint8_t autoneg;<br />     uint8_t link_state;<br />@@ -432,6 +436,7 @@ struct zxdh_msg_info {<br />         struct zxdh_rss_reta rss_reta;<br />         struct zxdh_rss_enable rss_enable;<br />         struct zxdh_rss_hf rss_hf;<br />+        struct zxdh_np_stats_updata_msg np_stats_query;<br />     } data;<br /> };<br />  <br />diff --git a/drivers/net/zxdh/zxdh_np.c b/drivers/net/zxdh/zxdh_np.c<br />index 01237aba70..b9b8398f24 100644<br />--- a/drivers/net/zxdh/zxdh_np.c<br />+++ b/drivers/net/zxdh/zxdh_np.c<br />@@ -1993,3 +1993,266 @@ zxdh_np_dtb_stats_get(uint32_t dev_id,<br />  <br />     return rc;<br /> }<br />+<br />+static uint32_t<br />+zxdh_np_se_done_status_check(uint32_t dev_id, uint32_t reg_no, uint32_t pos)<br />+{<br />+    uint32_t rc = 0;<br />+<br />+    uint32_t data = 0;<br />+    uint32_t rd_cnt = 0;<br />+    uint32_t done_flag = 0;<br />+<br />+    while (!done_flag) {<br />+        rc = zxdh_np_reg_read(dev_id, reg_no, 0, 0, &data);<br />+        if (rc != 0) {<br />+            PMD_DRV_LOG(ERR, " [ErrorCode:0x%x] !-- zxdh_np_reg_read Fail!", rc);<br />+            return rc;<br />+        }<br />+<br />+        done_flag = (data >> pos) & 0x1;<br />+<br />+        if (done_flag)<br />+            break;<br />+<br />+        if (rd_cnt > ZXDH_RD_CNT_MAX * ZXDH_RD_CNT_MAX)<br />+            return -1;<br />+<br />+        rd_cnt++;<br />+    }<br />+<br />+    return rc;<br />+}<br />+<br />+static uint32_t<br />+zxdh_np_se_smmu0_ind_read(uint32_t dev_id,<br />+                        uint32_t base_addr,<br />+                        uint32_t index,<br />+                        uint32_t rd_mode,<br />+                        uint32_t rd_clr_mode,<br />+                        uint32_t *p_data)<br />+{<br />+    uint32_t rc = 0;<br />+    uint32_t i = 0;<br />+    uint32_t row_index = 0;<br />+    uint32_t col_index = 0;<br />+    uint32_t temp_data[4] = {0};<br />+    uint32_t *p_temp_data = NULL;<br />+    ZXDH_SMMU0_SMMU0_CPU_IND_CMD_T cpu_ind_cmd = {0};<br />+<br />+    rc = zxdh_np_se_done_status_check(dev_id, ZXDH_SMMU0_SMMU0_WR_ARB_CPU_RDYR, 0);<br />+<br />+    if (rd_clr_mode == ZXDH_RD_MODE_HOLD) {<br />+        cpu_ind_cmd.cpu_ind_rw = ZXDH_SE_OPR_RD;<br />+        cpu_ind_cmd.cpu_ind_rd_mode = ZXDH_RD_MODE_HOLD;<br />+        cpu_ind_cmd.cpu_req_mode = ZXDH_ERAM128_OPR_128b;<br />+<br />+        switch (rd_mode) {<br />+        case ZXDH_ERAM128_OPR_128b:<br />+        {<br />+            if ((0xFFFFFFFF - (base_addr)) < (index))<br />+                return ZXDH_PAR_CHK_INVALID_INDEX;<br />+<br />+            if (base_addr + index > ZXDH_SE_SMMU0_ERAM_ADDR_NUM_TOTAL - 1) {<br />+                PMD_DRV_LOG(ERR, "%s : index out of range !", __func__);<br />+                return -1;<br />+            }<br />+<br />+            row_index = (index << 7) & ZXDH_ERAM128_BADDR_MASK;<br />+            break;<br />+        }<br />+<br />+        case ZXDH_ERAM128_OPR_64b:<br />+        {<br />+            if ((base_addr + (index >> 1)) > ZXDH_SE_SMMU0_ERAM_ADDR_NUM_TOTAL - 1) {<br />+                PMD_DRV_LOG(ERR, "%s : index out of range !", __func__);<br />+                return -1;<br />+            }<br />+<br />+            row_index = (index << 6) & ZXDH_ERAM128_BADDR_MASK;<br />+            col_index = index & 0x1;<br />+            break;<br />+        }<br />+<br />+        case ZXDH_ERAM128_OPR_32b:<br />+        {<br />+            if ((base_addr + (index >> 2)) > ZXDH_SE_SMMU0_ERAM_ADDR_NUM_TOTAL - 1) {<br />+                PMD_DRV_LOG(ERR, "%s : index out of range !", __func__);<br />+                return -1;<br />+            }<br />+<br />+            row_index = (index << 5) & ZXDH_ERAM128_BADDR_MASK;<br />+            col_index = index & 0x3;<br />+            break;<br />+        }<br />+<br />+        case ZXDH_ERAM128_OPR_1b:<br />+        {<br />+            if ((base_addr + (index >> 7)) > ZXDH_SE_SMMU0_ERAM_ADDR_NUM_TOTAL - 1) {<br />+                PMD_DRV_LOG(ERR, "%s : index out of range !", __func__);<br />+                return -1;<br />+            }<br />+            row_index = index & ZXDH_ERAM128_BADDR_MASK;<br />+            col_index = index & 0x7F;<br />+            break;<br />+        }<br />+        }<br />+<br />+        cpu_ind_cmd.cpu_ind_addr = ((base_addr << 7) & ZXDH_ERAM128_BADDR_MASK) + row_index;<br />+    } else {<br />+        cpu_ind_cmd.cpu_ind_rw = ZXDH_SE_OPR_RD;<br />+        cpu_ind_cmd.cpu_ind_rd_mode = ZXDH_RD_MODE_CLEAR;<br />+<br />+        switch (rd_mode) {<br />+        case ZXDH_ERAM128_OPR_128b:<br />+        {<br />+            if ((0xFFFFFFFF - (base_addr)) < (index)) {<br />+                PMD_DRV_LOG(ERR, "%s : index 0x%x is invalid!", __func__, index);<br />+                return ZXDH_PAR_CHK_INVALID_INDEX;<br />+            }<br />+            if (base_addr + index > ZXDH_SE_SMMU0_ERAM_ADDR_NUM_TOTAL - 1) {<br />+                PMD_DRV_LOG(ERR, "%s : index out of range !", __func__);<br />+                return -1;<br />+            }<br />+            row_index = (index << 7);<br />+            cpu_ind_cmd.cpu_req_mode = ZXDH_ERAM128_OPR_128b;<br />+            break;<br />+        }<br />+        case ZXDH_ERAM128_OPR_64b:<br />+        {<br />+            if ((base_addr + (index >> 1)) > ZXDH_SE_SMMU0_ERAM_ADDR_NUM_TOTAL - 1) {<br />+                PMD_DRV_LOG(ERR, "%s : index out of range !", __func__);<br />+                return -1;<br />+            }<br />+<br />+            row_index = (index << 6);<br />+            cpu_ind_cmd.cpu_req_mode = 2;<br />+            break;<br />+        }<br />+        case ZXDH_ERAM128_OPR_32b:<br />+        {<br />+            if ((base_addr + (index >> 2)) > ZXDH_SE_SMMU0_ERAM_ADDR_NUM_TOTAL - 1) {<br />+                PMD_DRV_LOG(ERR, "%s : index out of range !", __func__);<br />+                return -1;<br />+            }<br />+            row_index = (index << 5);<br />+            cpu_ind_cmd.cpu_req_mode = 1;<br />+            break;<br />+        }<br />+        case ZXDH_ERAM128_OPR_1b:<br />+        {<br />+            PMD_DRV_LOG(ERR, "rd_clr_mode[%d] or rd_mode[%d] error! ",<br />+                rd_clr_mode, rd_mode);<br />+            return -1;<br />+        }<br />+        }<br />+        cpu_ind_cmd.cpu_ind_addr = ((base_addr << 7) & ZXDH_ERAM128_BADDR_MASK) + row_index;<br />+    }<br />+<br />+    rc = zxdh_np_reg_write(dev_id,<br />+                        ZXDH_SMMU0_SMMU0_CPU_IND_CMDR,<br />+                        0,<br />+                        0,<br />+                        &cpu_ind_cmd);<br />+<br />+    rc = zxdh_np_se_done_status_check(dev_id, ZXDH_SMMU0_SMMU0_RD_CPU_IND_DONER, 0);<br />+<br />+    p_temp_data = temp_data;<br />+    for (i = 0; i < 4; i++) {<br />+        rc = zxdh_np_reg_read(dev_id,<br />+                            ZXDH_SMMU0_SMMU0_CPU_IND_RDAT0R + i,<br />+                            0,<br />+                            0,<br />+                            p_temp_data + 3 - i);<br />+    }<br />+<br />+    if (rd_clr_mode == ZXDH_RD_MODE_HOLD) {<br />+        switch (rd_mode) {<br />+        case ZXDH_ERAM128_OPR_128b:<br />+        {<br />+            rte_memcpy(p_data, p_temp_data, (128 / 8));<br />+            break;<br />+        }<br />+        case ZXDH_ERAM128_OPR_64b:<br />+        {<br />+            rte_memcpy(p_data, p_temp_data + ((1 - col_index) << 1), (64 / 8));<br />+            break;<br />+        }<br />+        case ZXDH_ERAM128_OPR_32b:<br />+        {<br />+            rte_memcpy(p_data, p_temp_data + ((3 - col_index)), (32 / 8));<br />+            break;<br />+        }<br />+        case ZXDH_ERAM128_OPR_1b:<br />+        {<br />+            ZXDH_COMM_UINT32_GET_BITS(p_data[0],<br />+                *(p_temp_data + (3 - col_index / 32)), (col_index % 32), 1);<br />+            break;<br />+        }<br />+        }<br />+    } else {<br />+        switch (rd_mode) {<br />+        case ZXDH_ERAM128_OPR_128b:<br />+        {<br />+            rte_memcpy(p_data, p_temp_data, (128 / 8));<br />+            break;<br />+        }<br />+        case ZXDH_ERAM128_OPR_64b:<br />+        {<br />+            rte_memcpy(p_data, p_temp_data, (64 / 8));<br />+            break;<br />+        }<br />+        case ZXDH_ERAM128_OPR_32b:<br />+        {<br />+            rte_memcpy(p_data, p_temp_data, (64 / 8));<br />+            break;<br />+        }<br />+        }<br />+    }<br />+<br />+    return rc;<br />+}<br />+<br />+uint32_t<br />+zxdh_np_stat_ppu_cnt_get_ex(uint32_t dev_id,<br />+                ZXDH_STAT_CNT_MODE_E rd_mode,<br />+                uint32_t index,<br />+                uint32_t clr_mode,<br />+                uint32_t *p_data)<br />+{<br />+    uint32_t rc = 0;<br />+    uint32_t ppu_eram_baddr = 0;<br />+    uint32_t ppu_eram_depth = 0;<br />+    uint32_t eram_rd_mode   = 0;<br />+    uint32_t eram_clr_mode  = 0;<br />+    ZXDH_PPU_STAT_CFG_T stat_cfg = {0};<br />+<br />+    zxdh_np_stat_cfg_soft_get(dev_id, &stat_cfg);<br />+<br />+    ppu_eram_depth = stat_cfg.eram_depth;<br />+    ppu_eram_baddr = stat_cfg.eram_baddr;<br />+<br />+    if ((index >> (ZXDH_STAT_128_MODE - rd_mode)) < ppu_eram_depth) {<br />+        if (rd_mode == ZXDH_STAT_128_MODE)<br />+            eram_rd_mode = ZXDH_ERAM128_OPR_128b;<br />+        else<br />+            eram_rd_mode = ZXDH_ERAM128_OPR_64b;<br />+<br />+        if (clr_mode == ZXDH_STAT_RD_CLR_MODE_UNCLR)<br />+            eram_clr_mode = ZXDH_RD_MODE_HOLD;<br />+        else<br />+            eram_clr_mode = ZXDH_RD_MODE_CLEAR;<br />+<br />+        rc = zxdh_np_se_smmu0_ind_read(dev_id,<br />+                                    ppu_eram_baddr,<br />+                                    index,<br />+                                    eram_rd_mode,<br />+                                    eram_clr_mode,<br />+                                    p_data);<br />+        ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_se_smmu0_ind_read");<br />+    } else {<br />+        PMD_DRV_LOG(ERR, "DPDK DON'T HAVE DDR STAT.");<br />+    }<br />+<br />+    return rc;<br />+}<br />diff --git a/drivers/net/zxdh/zxdh_np.h b/drivers/net/zxdh/zxdh_np.h<br />index 7da29cf7bd..d793189657 100644<br />--- a/drivers/net/zxdh/zxdh_np.h<br />+++ b/drivers/net/zxdh/zxdh_np.h<br />@@ -12,6 +12,9 @@<br /> #define ZXDH_PORT_NAME_MAX                    (32)<br /> #define ZXDH_DEV_CHANNEL_MAX                  (2)<br /> #define ZXDH_DEV_SDT_ID_MAX                   (256U)<br />+<br />+#define ZXDH_RD_CNT_MAX                       (128)<br />+<br /> /*DTB*/<br /> #define ZXDH_DTB_QUEUE_ITEM_NUM_MAX           (32)<br /> #define ZXDH_DTB_QUEUE_NUM_MAX                (128)<br />@@ -562,6 +565,38 @@ typedef enum zxdh_stat_cnt_mode_e {<br />     ZXDH_STAT_MAX_MODE,<br /> } ZXDH_STAT_CNT_MODE_E;<br />  <br />+typedef struct zxdh_smmu0_smmu0_cpu_ind_cmd_t {<br />+    uint32_t cpu_ind_rw;<br />+    uint32_t cpu_ind_rd_mode;<br />+    uint32_t cpu_req_mode;<br />+    uint32_t cpu_ind_addr;<br />+} ZXDH_SMMU0_SMMU0_CPU_IND_CMD_T;<br />+<br />+typedef enum zxdh_smmu0_smmu0_type_e {<br />+    ZXDH_DEV_MUTEX_T_SMMU0             = 0,<br />+    ZXDH_SMMU0_SMMU0_CPU_IND_CMDR      = 1,<br />+    ZXDH_SMMU0_SMMU0_CPU_IND_RDAT0R    = 2,<br />+    ZXDH_SMMU0_SMMU0_RD_CPU_IND_DONER  = 3,<br />+    ZXDH_SMMU0_SMMU0_WR_ARB_CPU_RDYR   = 4,<br />+    ZXDH_SMMU0_SMMU0_ED_ARB_CPU_RDYR   = 5,<br />+} ZXDH_SEMMU0_SEMMU0_TYPE_E;<br />+<br />+typedef enum zxdh_stat_rd_clr_mode_e {<br />+    ZXDH_STAT_RD_CLR_MODE_UNCLR = 0,<br />+    ZXDH_STAT_RD_CLR_MODE_CLR   = 1,<br />+    ZXDH_STAT_RD_CLR_MODE_MAX,<br />+} STAT_RD_CLR_MODE_E;<br />+<br />+typedef enum zxdh_eram128_rd_clr_mode_e {<br />+    ZXDH_RD_MODE_HOLD   = 0,<br />+    ZXDH_RD_MODE_CLEAR  = 1,<br />+} ZXDH_ERAM128_RD_CLR_MODE_E;<br />+<br />+typedef enum zxdh_se_opr_mode_e {<br />+    ZXDH_SE_OPR_RD      = 0,<br />+    ZXDH_SE_OPR_WR      = 1,<br />+} ZXDH_SE_OPR_MODE_E;<br />+<br /> int zxdh_np_host_init(uint32_t dev_id, ZXDH_DEV_INIT_CTRL_T *p_dev_init_ctrl);<br /> int zxdh_np_online_uninit(uint32_t dev_id, char *port_name, uint32_t queue_id);<br /> int zxdh_np_dtb_table_entry_write(uint32_t dev_id, uint32_t queue_id,<br />@@ -575,5 +610,10 @@ int zxdh_np_dtb_stats_get(uint32_t dev_id,<br />             ZXDH_STAT_CNT_MODE_E rd_mode,<br />             uint32_t index,<br />             uint32_t *p_data);<br />+uint32_t zxdh_np_stat_ppu_cnt_get_ex(uint32_t dev_id,<br />+            ZXDH_STAT_CNT_MODE_E rd_mode,<br />+            uint32_t index,<br />+            uint32_t clr_mode,<br />+            uint32_t *p_data);<br />  <br /> #endif /* ZXDH_NP_H */<br />diff --git a/drivers/net/zxdh/zxdh_tables.h b/drivers/net/zxdh/zxdh_tables.h<br />index cd666a9251..f44f444bd9 100644<br />--- a/drivers/net/zxdh/zxdh_tables.h<br />+++ b/drivers/net/zxdh/zxdh_tables.h<br />@@ -65,10 +65,18 @@<br /> #define ZXDH_PORT_RSS_EN_OFF_FLAG                 42<br /> #define ZXDH_PORT_MTU_OFFLOAD_EN_OFF_FLAG         43<br />  <br />-#define ZXDH_MTU_STATS_EGRESS_BASE        0x8481<br />-#define ZXDH_MTU_STATS_INGRESS_BASE       0x8981<br />-#define ZXDH_BROAD_STATS_EGRESS_BASE      0xC902<br />-#define ZXDH_BROAD_STATS_INGRESS_BASE     0xD102<br />+#define ZXDH_MTU_STATS_EGRESS_BASE           0x8481<br />+#define ZXDH_MTU_STATS_INGRESS_BASE          0x8981<br />+#define ZXDH_BROAD_STATS_EGRESS_BASE         0xA8C1<br />+#define ZXDH_BROAD_STATS_INGRESS_BASE        0xA3C1<br />+#define ZXDH_MTR_STATS_EGRESS_BASE           0x7481<br />+#define ZXDH_MTR_STATS_INGRESS_BASE          0x7C81<br />+#define ZXDH_MULTICAST_STATS_EGRESS_BASE     0x9EC1<br />+#define ZXDH_MULTICAST_STATS_INGRESS_BASE    0x99C1<br />+#define ZXDH_UNICAST_STATS_EGRESS_BASE       0x94C1<br />+#define ZXDH_UNICAST_STATS_INGRESS_BASE      0x8FC1<br />+<br />+#define ZXDH_FLOW_STATS_INGRESS_BASE         0xADC1<br />  <br /> extern struct zxdh_dtb_shared_data g_dtb_data;<br />  <br />--  <br />2.27.0<br />