Add zxdh get device backend infos,<br />use msg chan to send msg get.<br /> <br />Signed-off-by: Junlong Wang <wang.junlong1@zte.com.cn> <br />---<br /> drivers/net/zxdh/meson.build   |   1 +<br /> drivers/net/zxdh/zxdh_common.c | 249 +++++++++++++++++++++++++++++++++<br /> drivers/net/zxdh/zxdh_common.h |  30 ++++<br /> drivers/net/zxdh/zxdh_ethdev.c |  35 +++++<br /> drivers/net/zxdh/zxdh_ethdev.h |   5 +<br /> drivers/net/zxdh/zxdh_msg.c    |   3 -<br /> drivers/net/zxdh/zxdh_msg.h    |  24 ++++<br /> 7 files changed, 344 insertions(+), 3 deletions(-)<br /> create mode 100644 drivers/net/zxdh/zxdh_common.c<br /> create mode 100644 drivers/net/zxdh/zxdh_common.h<br /> <br />diff --git a/drivers/net/zxdh/meson.build b/drivers/net/zxdh/meson.build<br />index 2e0c8fddae..a16db47f89 100644<br />--- a/drivers/net/zxdh/meson.build<br />+++ b/drivers/net/zxdh/meson.build<br />@@ -17,4 +17,5 @@ sources = files(<br />         'zxdh_ethdev.c',<br />         'zxdh_pci.c',<br />         'zxdh_msg.c',<br />+        'zxdh_common.c',<br /> )<br />diff --git a/drivers/net/zxdh/zxdh_common.c b/drivers/net/zxdh/zxdh_common.c<br />new file mode 100644<br />index 0000000000..61993980c3<br />--- /dev/null<br />+++ b/drivers/net/zxdh/zxdh_common.c<br />@@ -0,0 +1,249 @@<br />+/* SPDX-License-Identifier: BSD-3-Clause<br />+ * Copyright(c) 2024 ZTE Corporation<br />+ */<br />+<br />+#include <stdint.h> <br />+#include <string.h> <br />+<br />+#include <ethdev_driver.h> <br />+#include <rte_malloc.h> <br />+#include <rte_memcpy.h> <br />+<br />+#include "zxdh_ethdev.h" <br />+#include "zxdh_logs.h" <br />+#include "zxdh_msg.h" <br />+#include "zxdh_common.h" <br />+<br />+#define ZXDH_MSG_RSP_SIZE_MAX  512<br />+<br />+#define ZXDH_COMMON_TABLE_READ   0<br />+#define ZXDH_COMMON_TABLE_WRITE  1<br />+<br />+#define ZXDH_COMMON_FIELD_PHYPORT  6<br />+<br />+#define RSC_TBL_CONTENT_LEN_MAX  (257 * 2)<br />+<br />+#define REPS_HEADER_PAYLOAD_OFFSET  4<br />+#define TBL_MSG_PRO_SUCCESS  0xaa<br />+<br />+struct zxdh_common_msg {<br />+    uint8_t  type;    /* 0:read table 1:write table */<br />+    uint8_t  field;<br />+    uint16_t pcie_id;<br />+    uint16_t slen;    /* Data length for write table */<br />+    uint16_t reserved;<br />+} __rte_packed;<br />+<br />+struct zxdh_common_rsp_hdr {<br />+    uint8_t  rsp_status;<br />+    uint16_t rsp_len;<br />+    uint8_t  reserved;<br />+    uint8_t  payload_status;<br />+    uint8_t  rsv;<br />+    uint16_t payload_len;<br />+} __rte_packed;<br />+<br />+struct tbl_msg_header {<br />+    uint8_t  type;  /* r/w */<br />+    uint8_t  field;<br />+    uint16_t pcieid;<br />+    uint16_t slen;<br />+    uint16_t rsv;<br />+};<br />+struct tbl_msg_reps_header {<br />+    uint8_t  check;<br />+    uint8_t  rsv;<br />+    uint16_t len;<br />+};<br />+<br />+static int32_t zxdh_fill_common_msg(struct zxdh_hw *hw,<br />+    struct zxdh_pci_bar_msg *desc,<br />+    uint8_t        type,<br />+    uint8_t        field,<br />+    void          *buff,<br />+    uint16_t       buff_size)<br />+{<br />+    uint64_t msg_len = sizeof(struct zxdh_common_msg) + buff_size;<br />+<br />+    desc->payload_addr = rte_zmalloc(NULL, msg_len, 0);<br />+    if (unlikely(desc->payload_addr == NULL)) {<br />+        PMD_DRV_LOG(ERR, "Failed to allocate msg_data");<br />+        return -ENOMEM;<br />+    }<br />+    memset(desc->payload_addr, 0, msg_len);<br />+    desc->payload_len = msg_len;<br />+    struct zxdh_common_msg *msg_data = (struct zxdh_common_msg *)desc->payload_addr;<br />+<br />+    msg_data->type = type;<br />+    msg_data->field = field;<br />+    msg_data->pcie_id = hw->pcie_id;<br />+    msg_data->slen = buff_size;<br />+    if (buff_size != 0)<br />+        rte_memcpy(msg_data + 1, buff, buff_size);<br />+<br />+    return 0;<br />+}<br />+<br />+static int32_t zxdh_send_command(struct zxdh_hw *hw,<br />+    struct zxdh_pci_bar_msg      *desc,<br />+    enum bar_module_id            module_id,<br />+    struct zxdh_msg_recviver_mem *msg_rsp)<br />+{<br />+    desc->virt_addr = (uint64_t)(hw->bar_addr[ZXDH_BAR0_INDEX] + ZXDH_CTRLCH_OFFSET);<br />+    desc->src = hw->is_pf ? MSG_CHAN_END_PF : MSG_CHAN_END_VF;<br />+    desc->dst = MSG_CHAN_END_RISC;<br />+    desc->module_id = module_id;<br />+    desc->src_pcieid = hw->pcie_id;<br />+<br />+    msg_rsp->buffer_len  = ZXDH_MSG_RSP_SIZE_MAX;<br />+    msg_rsp->recv_buffer = rte_zmalloc(NULL, msg_rsp->buffer_len, 0);<br />+    if (unlikely(msg_rsp->recv_buffer == NULL)) {<br />+        PMD_DRV_LOG(ERR, "Failed to allocate messages response");<br />+        return -ENOMEM;<br />+    }<br />+<br />+    if (zxdh_bar_chan_sync_msg_send(desc, msg_rsp) != BAR_MSG_OK) {<br />+        PMD_DRV_LOG(ERR, "Failed to send sync messages or receive response");<br />+        rte_free(msg_rsp->recv_buffer);<br />+        return -1;<br />+    }<br />+<br />+    return 0;<br />+}<br />+<br />+static int32_t zxdh_common_rsp_check(struct zxdh_msg_recviver_mem *msg_rsp,<br />+        void *buff, uint16_t len)<br />+{<br />+    struct zxdh_common_rsp_hdr *rsp_hdr = (struct zxdh_common_rsp_hdr *)msg_rsp->recv_buffer;<br />+<br />+    if (rsp_hdr->payload_status != 0xaa || rsp_hdr->payload_len != len) {<br />+        PMD_DRV_LOG(ERR, "Common response is invalid, status:0x%x rsp_len:%d",<br />+                    rsp_hdr->payload_status, rsp_hdr->payload_len);<br />+        return -1;<br />+    }<br />+    if (len != 0)<br />+        rte_memcpy(buff, rsp_hdr + 1, len);<br />+<br />+    return 0;<br />+}<br />+<br />+static int32_t zxdh_common_table_read(struct zxdh_hw *hw, uint8_t field,<br />+            void *buff, uint16_t buff_size)<br />+{<br />+    struct zxdh_msg_recviver_mem msg_rsp;<br />+    struct zxdh_pci_bar_msg desc;<br />+    int32_t ret = 0;<br />+<br />+    if (!hw->msg_chan_init) {<br />+        PMD_DRV_LOG(ERR, "Bar messages channel not initialized");<br />+        return -1;<br />+    }<br />+<br />+    ret = zxdh_fill_common_msg(hw, &desc, ZXDH_COMMON_TABLE_READ, field, NULL, 0);<br />+    if (ret != 0) {<br />+        PMD_DRV_LOG(ERR, "Failed to fill common msg");<br />+        return ret;<br />+    }<br />+<br />+    ret = zxdh_send_command(hw, &desc, BAR_MODULE_TBL, &msg_rsp);<br />+    if (ret != 0)<br />+        goto free_msg_data;<br />+<br />+    ret = zxdh_common_rsp_check(&msg_rsp, buff, buff_size);<br />+    if (ret != 0)<br />+        goto free_rsp_data;<br />+<br />+free_rsp_data:<br />+    rte_free(msg_rsp.recv_buffer);<br />+free_msg_data:<br />+    rte_free(desc.payload_addr);<br />+    return ret;<br />+}<br />+<br />+int32_t zxdh_phyport_get(struct rte_eth_dev *dev, uint8_t *phyport)<br />+{<br />+    struct zxdh_hw *hw = dev->data->dev_private;<br />+<br />+    int32_t ret = zxdh_common_table_read(hw, ZXDH_COMMON_FIELD_PHYPORT,<br />+                    (void *)phyport, sizeof(*phyport));<br />+    return ret;<br />+}<br />+<br />+static inline void zxdh_fill_res_para(struct rte_eth_dev *dev, struct zxdh_res_para *param)<br />+{<br />+    struct zxdh_hw *hw = dev->data->dev_private;<br />+<br />+    param->pcie_id   = hw->pcie_id;<br />+    param->virt_addr = hw->bar_addr[0] + ZXDH_CTRLCH_OFFSET;<br />+    param->src_type  = BAR_MODULE_TBL;<br />+}<br />+<br />+static int zxdh_get_res_info(struct zxdh_res_para *dev, uint8_t field, uint8_t *res, uint16_t *len)<br />+{<br />+    if (!res || !dev)<br />+        return BAR_MSG_ERR_NULL;<br />+<br />+    struct tbl_msg_header tbl_msg = {<br />+        .type = TBL_TYPE_READ,<br />+        .field = field,<br />+        .pcieid = dev->pcie_id,<br />+        .slen = 0,<br />+        .rsv = 0,<br />+    };<br />+<br />+    struct zxdh_pci_bar_msg in = {0};<br />+<br />+    in.virt_addr = dev->virt_addr;<br />+    in.payload_addr = &tbl_msg;<br />+    in.payload_len = sizeof(tbl_msg);<br />+    in.src = dev->src_type;<br />+    in.dst = MSG_CHAN_END_RISC;<br />+    in.module_id = BAR_MODULE_TBL;<br />+    in.src_pcieid = dev->pcie_id;<br />+<br />+    uint8_t recv_buf[RSC_TBL_CONTENT_LEN_MAX + 8] = {0};<br />+    struct zxdh_msg_recviver_mem result = {<br />+        .recv_buffer = recv_buf,<br />+        .buffer_len = sizeof(recv_buf),<br />+    };<br />+    int ret = zxdh_bar_chan_sync_msg_send(&in, &result);<br />+<br />+    if (ret != BAR_MSG_OK) {<br />+        PMD_DRV_LOG(ERR,<br />+            "send sync_msg failed. pcieid: 0x%x, ret: %d.", dev->pcie_id, ret);<br />+        return ret;<br />+    }<br />+    struct tbl_msg_reps_header *tbl_reps =<br />+        (struct tbl_msg_reps_header *)(recv_buf + REPS_HEADER_PAYLOAD_OFFSET);<br />+<br />+    if (tbl_reps->check != TBL_MSG_PRO_SUCCESS) {<br />+        PMD_DRV_LOG(ERR,<br />+            "get resource_field failed. pcieid: 0x%x, ret: %d.", dev->pcie_id, ret);<br />+        return ret;<br />+    }<br />+    *len = tbl_reps->len;<br />+    memcpy(res,<br />+        (recv_buf + REPS_HEADER_PAYLOAD_OFFSET + sizeof(struct tbl_msg_reps_header)), *len);<br />+    return ret;<br />+}<br />+<br />+static int zxdh_get_res_panel_id(struct zxdh_res_para *in, uint8_t *panel_id)<br />+{<br />+    uint8_t reps = 0;<br />+    uint16_t reps_len = 0;<br />+<br />+    if (zxdh_get_res_info(in, TBL_FIELD_PNLID, &reps, &reps_len) != BAR_MSG_OK)<br />+        return -1;<br />+<br />+    *panel_id = reps;<br />+    return BAR_MSG_OK;<br />+}<br />+<br />+int32_t zxdh_pannelid_get(struct rte_eth_dev *dev, uint8_t *pannelid)<br />+{<br />+    struct zxdh_res_para param;<br />+<br />+    zxdh_fill_res_para(dev, &param);<br />+    int32_t ret = zxdh_get_res_panel_id(&param, pannelid);<br />+    return ret;<br />+}<br />diff --git a/drivers/net/zxdh/zxdh_common.h b/drivers/net/zxdh/zxdh_common.h<br />new file mode 100644<br />index 0000000000..ec7011e820<br />--- /dev/null<br />+++ b/drivers/net/zxdh/zxdh_common.h<br />@@ -0,0 +1,30 @@<br />+/* SPDX-License-Identifier: BSD-3-Clause<br />+ * Copyright(c) 2024 ZTE Corporation<br />+ */<br />+<br />+#ifndef _ZXDH_COMMON_H_<br />+#define _ZXDH_COMMON_H_<br />+<br />+#ifdef __cplusplus<br />+extern "C" {<br />+#endif<br />+<br />+#include <stdint.h> <br />+#include <rte_ethdev.h> <br />+<br />+#include "zxdh_ethdev.h" <br />+<br />+struct zxdh_res_para {<br />+    uint64_t virt_addr;<br />+    uint16_t pcie_id;<br />+    uint16_t src_type; /* refer to BAR_DRIVER_TYPE */<br />+};<br />+<br />+int32_t zxdh_phyport_get(struct rte_eth_dev *dev, uint8_t *phyport);<br />+int32_t zxdh_pannelid_get(struct rte_eth_dev *dev, uint8_t *pannelid);<br />+<br />+#ifdef __cplusplus<br />+}<br />+#endif<br />+<br />+#endif /* _ZXDH_COMMON_H_ */<br />diff --git a/drivers/net/zxdh/zxdh_ethdev.c b/drivers/net/zxdh/zxdh_ethdev.c<br />index 5002e76e23..e282012afb 100644<br />--- a/drivers/net/zxdh/zxdh_ethdev.c<br />+++ b/drivers/net/zxdh/zxdh_ethdev.c<br />@@ -10,9 +10,21 @@<br /> #include "zxdh_logs.h" <br /> #include "zxdh_pci.h" <br /> #include "zxdh_msg.h" <br />+#include "zxdh_common.h" <br />  <br /> struct zxdh_hw_internal zxdh_hw_internal[RTE_MAX_ETHPORTS];<br />  <br />+uint16_t vport_to_vfid(union VPORT v)<br />+{<br />+    /* epid > 4 is local soft queue. return 1192 */<br />+    if (v.epid > 4)<br />+        return 1192;<br />+    if (v.vf_flag)<br />+        return v.epid * 256 + v.vfid;<br />+    else<br />+        return (v.epid * 8 + v.pfid) + 1152;<br />+}<br />+<br /> static int32_t zxdh_init_device(struct rte_eth_dev *eth_dev)<br /> {<br />     struct zxdh_hw *hw = eth_dev->data->dev_private;<br />@@ -44,6 +56,25 @@ static int32_t zxdh_init_device(struct rte_eth_dev *eth_dev)<br />     return ret;<br /> }<br />  <br />+static int zxdh_agent_comm(struct rte_eth_dev *eth_dev, struct zxdh_hw *hw)<br />+{<br />+    if (zxdh_phyport_get(eth_dev, &hw->phyport) != 0) {<br />+        PMD_INIT_LOG(ERR, "Failed to get phyport");<br />+        return -1;<br />+    }<br />+    PMD_INIT_LOG(INFO, "Get phyport success: 0x%x", hw->phyport);<br />+<br />+    hw->vfid = vport_to_vfid(hw->vport);<br />+<br />+    if (zxdh_pannelid_get(eth_dev, &hw->panel_id) != 0) {<br />+        PMD_INIT_LOG(ERR, "Failed to get panel_id");<br />+        return -1;<br />+    }<br />+    PMD_INIT_LOG(INFO, "Get panel id success: 0x%x", hw->panel_id);<br />+<br />+    return 0;<br />+}<br />+<br /> static int zxdh_eth_dev_init(struct rte_eth_dev *eth_dev)<br /> {<br />     struct rte_pci_device *pci_dev = RTE_ETH_DEV_TO_PCI(eth_dev);<br />@@ -103,6 +134,10 @@ static int zxdh_eth_dev_init(struct rte_eth_dev *eth_dev)<br />         goto err_zxdh_init;<br />     }<br />  <br />+    ret = zxdh_agent_comm(eth_dev, hw);<br />+    if (ret != 0)<br />+        goto err_zxdh_init;<br />+<br />     return ret;<br />  <br /> err_zxdh_init:<br />diff --git a/drivers/net/zxdh/zxdh_ethdev.h b/drivers/net/zxdh/zxdh_ethdev.h<br />index a51181f1ce..2351393009 100644<br />--- a/drivers/net/zxdh/zxdh_ethdev.h<br />+++ b/drivers/net/zxdh/zxdh_ethdev.h<br />@@ -56,6 +56,7 @@ struct zxdh_hw {<br />     uint16_t pcie_id;<br />     uint16_t device_id;<br />     uint16_t port_id;<br />+    uint16_t vfid;<br />  <br />     uint8_t *isr;<br />     uint8_t weak_barriers;<br />@@ -63,9 +64,13 @@ struct zxdh_hw {<br />     uint8_t mac_addr[RTE_ETHER_ADDR_LEN];<br />     uint8_t duplex;<br />     uint8_t is_pf;<br />+    uint8_t phyport;<br />+    uint8_t panel_id;<br />     uint8_t msg_chan_init;<br /> };<br />  <br />+uint16_t vport_to_vfid(union VPORT v);<br />+<br /> #ifdef __cplusplus<br /> }<br /> #endif<br />diff --git a/drivers/net/zxdh/zxdh_msg.c b/drivers/net/zxdh/zxdh_msg.c<br />index 3ac4c8d796..e243f97703 100644<br />--- a/drivers/net/zxdh/zxdh_msg.c<br />+++ b/drivers/net/zxdh/zxdh_msg.c<br />@@ -18,8 +18,6 @@<br /> #define REPS_INFO_FLAG_USABLE  0x00<br /> #define BAR_SEQID_NUM_MAX  256<br />  <br />-#define ZXDH_BAR0_INDEX  0<br />-<br /> #define PCIEID_IS_PF_MASK   (0x0800)<br /> #define PCIEID_PF_IDX_MASK  (0x0700)<br /> #define PCIEID_VF_IDX_MASK  (0x00ff)<br />@@ -43,7 +41,6 @@<br /> #define FW_SHRD_OFFSET                     (0x5000)<br /> #define FW_SHRD_INNER_HW_LABEL_PAT         (0x800)<br /> #define HW_LABEL_OFFSET                    (FW_SHRD_OFFSET + FW_SHRD_INNER_HW_LABEL_PAT)<br />-#define ZXDH_CTRLCH_OFFSET           (0x2000)<br /> #define CHAN_RISC_SPINLOCK_OFFSET    (BAR0_SPINLOCK_OFFSET - BAR0_CHAN_RISC_OFFSET)<br /> #define CHAN_PFVF_SPINLOCK_OFFSET    (BAR0_SPINLOCK_OFFSET - BAR0_CHAN_PFVF_OFFSET)<br /> #define CHAN_RISC_LABEL_OFFSET       (HW_LABEL_OFFSET - BAR0_CHAN_RISC_OFFSET)<br />diff --git a/drivers/net/zxdh/zxdh_msg.h b/drivers/net/zxdh/zxdh_msg.h<br />index 06be0f18c8..7379f57d17 100644<br />--- a/drivers/net/zxdh/zxdh_msg.h<br />+++ b/drivers/net/zxdh/zxdh_msg.h<br />@@ -13,6 +13,9 @@ extern "C" {<br />  <br /> #include <ethdev_driver.h> <br />  <br />+#define ZXDH_BAR0_INDEX          0<br />+<br />+#define ZXDH_CTRLCH_OFFSET          (0x2000)<br /> #define ZXDH_MSIX_INTR_MSG_VEC_BASE  1<br />  <br /> #define BAR_MSG_POLLING_SPAN     100<br />@@ -103,6 +106,27 @@ enum bar_module_id {<br />     BAR_MSG_MODULE_NUM = 100,<br /> };<br />  <br />+enum RES_TBL_FILED {<br />+    TBL_FIELD_PCIEID     = 0,<br />+    TBL_FIELD_BDF        = 1,<br />+    TBL_FIELD_MSGCH      = 2,<br />+    TBL_FIELD_DATACH     = 3,<br />+    TBL_FIELD_VPORT      = 4,<br />+    TBL_FIELD_PNLID      = 5,<br />+    TBL_FIELD_PHYPORT    = 6,<br />+    TBL_FIELD_SERDES_NUM = 7,<br />+    TBL_FIELD_NP_PORT    = 8,<br />+    TBL_FIELD_SPEED      = 9,<br />+    TBL_FIELD_HASHID     = 10,<br />+    TBL_FIELD_NON,<br />+};<br />+<br />+enum TBL_MSG_TYPE {<br />+    TBL_TYPE_READ,<br />+    TBL_TYPE_WRITE,<br />+    TBL_TYPE_NON,<br />+};<br />+<br /> struct msix_para {<br />     uint16_t pcie_id;<br />     uint16_t vector_risc;<br />--  <br />2.27.0<br />