add support primary/secondary process,<br />and secondary process ops only support get stats/infos.<br /> <br />Signed-off-by: Junlong Wang <wang.junlong1@zte.com.cn> <br />---<br /> drivers/net/zxdh/zxdh_ethdev.c     | 29 ++++++++++++++++--<br /> drivers/net/zxdh/zxdh_ethdev.h     |  1 +<br /> drivers/net/zxdh/zxdh_ethdev_ops.c | 49 +++++++++++++++++++-----------<br /> drivers/net/zxdh/zxdh_queue.h      |  1 -<br /> drivers/net/zxdh/zxdh_rxtx.c       |  2 +-<br /> 5 files changed, 60 insertions(+), 22 deletions(-)<br /> <br />diff --git a/drivers/net/zxdh/zxdh_ethdev.c b/drivers/net/zxdh/zxdh_ethdev.c<br />index 823b1ffb5c..cd29162070 100644<br />--- a/drivers/net/zxdh/zxdh_ethdev.c<br />+++ b/drivers/net/zxdh/zxdh_ethdev.c<br />@@ -23,7 +23,6 @@ struct zxdh_hw_internal zxdh_hw_internal[RTE_MAX_ETHPORTS];<br /> struct zxdh_dev_nic_shared_data dev_nic_sd[ZXDH_SLOT_MAX];<br /> static rte_spinlock_t zxdh_shared_data_lock = RTE_SPINLOCK_INITIALIZER;<br /> struct zxdh_shared_data *zxdh_shared_data;<br />-struct zxdh_net_hdr_dl g_net_hdr_dl[RTE_MAX_ETHPORTS];<br /> struct zxdh_mtr_res g_mtr_res;<br />  <br /> #define ZXDH_INVALID_DTBQUE      0xFFFF<br />@@ -409,7 +408,7 @@ zxdh_configure_intr(struct rte_eth_dev *dev)<br /> static void<br /> zxdh_update_net_hdr_dl(struct zxdh_hw *hw)<br /> {<br />-    struct zxdh_net_hdr_dl *net_hdr_dl = &g_net_hdr_dl[hw->port_id];<br />+    struct zxdh_net_hdr_dl *net_hdr_dl = hw->net_hdr_dl;<br />     memset(net_hdr_dl, 0, ZXDH_DL_NET_HDR_SIZE);<br />  <br />     if (zxdh_tx_offload_enabled(hw)) {<br />@@ -1229,6 +1228,9 @@ zxdh_priv_res_free(struct zxdh_hw *priv)<br />  <br />     rte_free(priv->queue_conf);<br />     priv->queue_conf = NULL;<br />+<br />+    rte_free(priv->net_hdr_dl);<br />+    priv->net_hdr_dl = NULL;<br /> }<br />  <br /> static int<br />@@ -1555,6 +1557,16 @@ static const struct eth_dev_ops zxdh_eth_dev_ops = {<br />     .flow_ops_get             = zxdh_flow_ops_get,<br /> };<br />  <br />+const struct eth_dev_ops zxdh_eth_dev_secondary_ops = {<br />+    .dev_infos_get             = zxdh_dev_infos_get,<br />+    .stats_get                 = zxdh_dev_stats_get,<br />+    .xstats_get                 = zxdh_dev_xstats_get,<br />+    .xstats_get_names         = zxdh_dev_xstats_get_names,<br />+    .rxq_info_get             = zxdh_rxq_info_get,<br />+    .txq_info_get             = zxdh_txq_info_get,<br />+    .dev_supported_ptypes_get = zxdh_dev_supported_ptypes_get,<br />+};<br />+<br /> static int32_t<br /> zxdh_init_device(struct rte_eth_dev *eth_dev)<br /> {<br />@@ -2136,6 +2148,13 @@ zxdh_priv_res_init(struct zxdh_hw *hw)<br />         return -ENOMEM;<br />     }<br />  <br />+    hw->net_hdr_dl = rte_zmalloc("zxdh_net_hdr_dl", sizeof(struct zxdh_net_hdr_dl), 0);<br />+    if (hw->net_hdr_dl == NULL) {<br />+        PMD_DRV_LOG(ERR, "Failed to allocate %ld bytes store queue conf",<br />+                    sizeof(struct zxdh_net_hdr_dl));<br />+        return -ENOMEM;<br />+    }<br />+<br />     return 0;<br /> }<br />  <br />@@ -2173,6 +2192,12 @@ zxdh_eth_dev_init(struct rte_eth_dev *eth_dev)<br />  <br />     eth_dev->dev_ops = &zxdh_eth_dev_ops;<br />  <br />+    if (rte_eal_process_type() == RTE_PROC_SECONDARY) {<br />+        eth_dev->dev_ops = &zxdh_eth_dev_secondary_ops;<br />+        ZXDH_VTPCI_OPS(hw) = &zxdh_dev_pci_ops;<br />+        return 0;<br />+    }<br />+<br />     /* Allocate memory for storing MAC addresses */<br />     eth_dev->data->mac_addrs = rte_zmalloc("zxdh_mac",<br />             ZXDH_MAX_MAC_ADDRS * RTE_ETHER_ADDR_LEN, 0);<br />diff --git a/drivers/net/zxdh/zxdh_ethdev.h b/drivers/net/zxdh/zxdh_ethdev.h<br />index 81b385ecb8..41fa89d20c 100644<br />--- a/drivers/net/zxdh/zxdh_ethdev.h<br />+++ b/drivers/net/zxdh/zxdh_ethdev.h<br />@@ -120,6 +120,7 @@ struct zxdh_hw {<br />     struct zxdh_dev_nic_shared_data *dev_nic_sd;<br />     struct vfinfo *vfinfo;<br />     struct zxdh_queue_conf *queue_conf;<br />+    struct zxdh_net_hdr_dl *net_hdr_dl;<br />  <br />     uint64_t bar_addr[ZXDH_NUM_BARS];<br />     uint64_t host_features;<br />diff --git a/drivers/net/zxdh/zxdh_ethdev_ops.c b/drivers/net/zxdh/zxdh_ethdev_ops.c<br />index 8fb315eeac..068dd21876 100644<br />--- a/drivers/net/zxdh/zxdh_ethdev_ops.c<br />+++ b/drivers/net/zxdh/zxdh_ethdev_ops.c<br />@@ -1802,22 +1802,26 @@ zxdh_dev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats,<br />     struct zxdh_hw_mac_bytes mac_bytes = {0};<br />     uint32_t i = 0;<br />  <br />-    zxdh_hw_vqm_stats_get(dev, ZXDH_VQM_DEV_STATS_GET,  &vqm_stats);<br />-    if (hw->is_pf)<br />-        zxdh_hw_mac_stats_get(dev, &mac_stats, &mac_bytes);<br />+    if (rte_eal_process_type() == RTE_PROC_PRIMARY) {<br />+        zxdh_hw_vqm_stats_get(dev, ZXDH_VQM_DEV_STATS_GET,  &vqm_stats);<br />+        if (hw->is_pf)<br />+            zxdh_hw_mac_stats_get(dev, &mac_stats, &mac_bytes);<br />  <br />-    zxdh_hw_np_stats_get(dev, &np_stats);<br />+        zxdh_hw_np_stats_get(dev, &np_stats);<br />  <br />-    stats->ipackets = vqm_stats.rx_total;<br />-    stats->opackets = vqm_stats.tx_total;<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.rx_mtu_drop_pkts;<br />-    stats->oerrors = vqm_stats.tx_error + mac_stats.tx_error + np_stats.tx_mtu_drop_pkts;<br />+        stats->ipackets = vqm_stats.rx_total;<br />+        stats->opackets = vqm_stats.tx_total;<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 +<br />+            mac_stats.rx_error + np_stats.rx_mtu_drop_pkts;<br />+        stats->oerrors = vqm_stats.tx_error +<br />+            mac_stats.tx_error + np_stats.tx_mtu_drop_pkts;<br />  <br />-    if (hw->i_mtr_en || hw->e_mtr_en)<br />-        stats->imissed  += np_stats.rx_mtr_drop_pkts;<br />+        if (hw->i_mtr_en || hw->e_mtr_en)<br />+            stats->imissed  += np_stats.rx_mtr_drop_pkts;<br />+    }<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 />@@ -2093,14 +2097,20 @@ zxdh_dev_xstats_get(struct rte_eth_dev *dev, struct rte_eth_xstat *xstats, uint3<br />     uint32_t count = 0;<br />     uint32_t t = 0;<br />  <br />-    if (hw->is_pf) {<br />+    if (hw->is_pf)<br />         nstats += ZXDH_MAC_XSTATS + ZXDH_MAC_BYTES;<br />-        zxdh_hw_mac_stats_get(dev, &mac_stats, &mac_bytes);<br />-    }<br />+<br />     if (n < nstats)<br />         return nstats;<br />-    zxdh_hw_vqm_stats_get(dev, ZXDH_VQM_DEV_STATS_GET,  &vqm_stats);<br />-    zxdh_hw_np_stats_get(dev, &np_stats);<br />+<br />+    if (rte_eal_process_type() == RTE_PROC_PRIMARY) {<br />+        if (hw->is_pf)<br />+            zxdh_hw_mac_stats_get(dev, &mac_stats, &mac_bytes);<br />+<br />+        zxdh_hw_vqm_stats_get(dev, ZXDH_VQM_DEV_STATS_GET,  &vqm_stats);<br />+        zxdh_hw_np_stats_get(dev, &np_stats);<br />+    }<br />+<br />     for (i = 0; i < ZXDH_NP_XSTATS; i++) {<br />         xstats[count].value = *(uint64_t *)(((char *)&np_stats)<br />                          + zxdh_np_stat_strings[i].offset);<br />@@ -2235,6 +2245,9 @@ zxdh_dev_fw_version_get(struct rte_eth_dev *dev,<br />     char fw_ver[ZXDH_FWVERS_LEN] = {0};<br />     uint32_t ret = 0;<br />  <br />+    if (rte_eal_process_type() != RTE_PROC_PRIMARY)<br />+        return -EPERM;<br />+<br />     zxdh_agent_msg_build(hw, ZXDH_FLASH_FIR_VERSION_GET, &msg_info);<br />  <br />     ret = zxdh_send_msg_to_riscv(dev, &msg_info, sizeof(struct zxdh_msg_info),<br />diff --git a/drivers/net/zxdh/zxdh_queue.h b/drivers/net/zxdh/zxdh_queue.h<br />index 3c89687d45..1a0c8a0d90 100644<br />--- a/drivers/net/zxdh/zxdh_queue.h<br />+++ b/drivers/net/zxdh/zxdh_queue.h<br />@@ -410,7 +410,6 @@ zxdh_queue_kick_prepare_packed(struct zxdh_virtqueue *vq)<br />     return (flags != ZXDH_RING_EVENT_FLAGS_DISABLE);<br /> }<br />  <br />-extern struct zxdh_net_hdr_dl g_net_hdr_dl[RTE_MAX_ETHPORTS];<br />  <br /> struct rte_mbuf *zxdh_queue_detach_unused(struct zxdh_virtqueue *vq);<br /> int32_t zxdh_free_queues(struct rte_eth_dev *dev);<br />diff --git a/drivers/net/zxdh/zxdh_rxtx.c b/drivers/net/zxdh/zxdh_rxtx.c<br />index 6071f5ef93..3ccef8fd0b 100644<br />--- a/drivers/net/zxdh/zxdh_rxtx.c<br />+++ b/drivers/net/zxdh/zxdh_rxtx.c<br />@@ -256,7 +256,7 @@ zxdh_xmit_fill_net_hdr(struct zxdh_virtqueue *vq, struct rte_mbuf *cookie,<br />     struct zxdh_pi_hdr *pi_hdr = NULL;<br />     struct zxdh_pd_hdr_dl *pd_hdr = NULL;<br />     struct zxdh_hw *hw = vq->hw;<br />-    struct zxdh_net_hdr_dl *net_hdr_dl = &g_net_hdr_dl[hw->port_id];<br />+    struct zxdh_net_hdr_dl *net_hdr_dl = hw->net_hdr_dl;<br />     uint8_t hdr_len = hw->dl_net_hdr_len;<br />     uint32_t ol_flag = 0;<br />  <br />--  <br />2.27.0<br />