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 | 256 +++++++++++++++++++++++++++++++++<br /> drivers/net/zxdh/zxdh_common.h |  30 ++++<br /> drivers/net/zxdh/zxdh_ethdev.c |  37 +++++<br /> drivers/net/zxdh/zxdh_ethdev.h |   5 +<br /> drivers/net/zxdh/zxdh_msg.h    |  21 +++<br /> 6 files changed, 350 insertions(+)<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..0d7ea4535d<br />--- /dev/null<br />+++ b/drivers/net/zxdh/zxdh_common.c<br />@@ -0,0 +1,256 @@<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 ZXDH_RSC_TBL_CONTENT_LEN_MAX  (257 * 2)<br />+<br />+#define ZXDH_REPS_HEADER_OFFSET       4<br />+#define ZXDH_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 zxdh_tbl_msg_header {<br />+    uint8_t  type;<br />+    uint8_t  field;<br />+    uint16_t pcieid;<br />+    uint16_t slen;<br />+    uint16_t rsv;<br />+};<br />+<br />+struct zxdh_tbl_msg_reps_header {<br />+    uint8_t  check;<br />+    uint8_t  rsv;<br />+    uint16_t len;<br />+};<br />+<br />+static int32_t<br />+zxdh_fill_common_msg(struct zxdh_hw *hw, struct zxdh_pci_bar_msg *desc,<br />+        uint8_t type, uint8_t field,<br />+        void *buff, 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<br />+zxdh_send_command(struct zxdh_hw *hw, struct zxdh_pci_bar_msg *desc,<br />+        enum ZXDH_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 ? ZXDH_MSG_CHAN_END_PF : ZXDH_MSG_CHAN_END_VF;<br />+    desc->dst = ZXDH_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) != ZXDH_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<br />+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<br />+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, ZXDH_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<br />+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<br />+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  = ZXDH_BAR_MODULE_TBL;<br />+}<br />+<br />+static int<br />+zxdh_get_res_info(struct zxdh_res_para *dev, uint8_t field, uint8_t *res, uint16_t *len)<br />+{<br />+    struct zxdh_pci_bar_msg in = {0};<br />+    uint8_t recv_buf[ZXDH_RSC_TBL_CONTENT_LEN_MAX + 8] = {0};<br />+    int ret = 0;<br />+<br />+    if (!res || !dev)<br />+        return ZXDH_BAR_MSG_ERR_NULL;<br />+<br />+    struct zxdh_tbl_msg_header tbl_msg = {<br />+        .type = ZXDH_TBL_TYPE_READ,<br />+        .field = field,<br />+        .pcieid = dev->pcie_id,<br />+        .slen = 0,<br />+        .rsv = 0,<br />+    };<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 = ZXDH_MSG_CHAN_END_RISC;<br />+    in.module_id = ZXDH_BAR_MODULE_TBL;<br />+    in.src_pcieid = dev->pcie_id;<br />+<br />+    struct zxdh_msg_recviver_mem result = {<br />+        .recv_buffer = recv_buf,<br />+        .buffer_len = sizeof(recv_buf),<br />+    };<br />+    ret = zxdh_bar_chan_sync_msg_send(&in, &result);<br />+<br />+    if (ret != ZXDH_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 zxdh_tbl_msg_reps_header *tbl_reps =<br />+        (struct zxdh_tbl_msg_reps_header *)(recv_buf + ZXDH_REPS_HEADER_OFFSET);<br />+<br />+    if (tbl_reps->check != ZXDH_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 />+    rte_memcpy(res, (recv_buf + ZXDH_REPS_HEADER_OFFSET +<br />+        sizeof(struct zxdh_tbl_msg_reps_header)), *len);<br />+    return ret;<br />+}<br />+<br />+static int<br />+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, ZXDH_TBL_FIELD_PNLID, &reps, &reps_len) != ZXDH_BAR_MSG_OK)<br />+        return -1;<br />+<br />+    *panel_id = reps;<br />+    return ZXDH_BAR_MSG_OK;<br />+}<br />+<br />+int32_t<br />+zxdh_panelid_get(struct rte_eth_dev *dev, uint8_t *panelid)<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, panelid);<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..ba29ca1dad<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 />+#include <stdint.h> <br />+#include <rte_ethdev.h> <br />+<br />+#include "zxdh_ethdev.h" <br />+<br />+#ifdef __cplusplus<br />+extern "C" {<br />+#endif<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_panelid_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 105c18f9e0..da5ac3ccd1 100644<br />--- a/drivers/net/zxdh/zxdh_ethdev.c<br />+++ b/drivers/net/zxdh/zxdh_ethdev.c<br />@@ -10,9 +10,22 @@<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<br />+zxdh_vport_to_vfid(union zxdh_virport_num 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<br /> zxdh_init_device(struct rte_eth_dev *eth_dev)<br /> {<br />@@ -45,6 +58,26 @@ zxdh_init_device(struct rte_eth_dev *eth_dev)<br />     return ret;<br /> }<br />  <br />+static int<br />+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_DRV_LOG(ERR, "Failed to get phyport");<br />+        return -1;<br />+    }<br />+    PMD_DRV_LOG(INFO, "Get phyport success: 0x%x", hw->phyport);<br />+<br />+    hw->vfid = zxdh_vport_to_vfid(hw->vport);<br />+<br />+    if (zxdh_panelid_get(eth_dev, &hw->panel_id) != 0) {<br />+        PMD_DRV_LOG(ERR, "Failed to get panel_id");<br />+        return -1;<br />+    }<br />+    PMD_DRV_LOG(INFO, "Get panel id success: 0x%x", hw->panel_id);<br />+<br />+    return 0;<br />+}<br />+<br /> static int<br /> zxdh_eth_dev_init(struct rte_eth_dev *eth_dev)<br /> {<br />@@ -105,6 +138,10 @@ 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 7434cc15d7..7b7bb16be8 100644<br />--- a/drivers/net/zxdh/zxdh_ethdev.h<br />+++ b/drivers/net/zxdh/zxdh_ethdev.h<br />@@ -55,6 +55,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 />@@ -64,8 +65,12 @@ struct zxdh_hw {<br />     uint8_t duplex;<br />     uint8_t is_pf;<br />     uint8_t msg_chan_init;<br />+    uint8_t phyport;<br />+    uint8_t panel_id;<br /> };<br />  <br />+uint16_t zxdh_vport_to_vfid(union zxdh_virport_num v);<br />+<br /> #ifdef __cplusplus<br /> }<br /> #endif<br />diff --git a/drivers/net/zxdh/zxdh_msg.h b/drivers/net/zxdh/zxdh_msg.h<br />index 83e2fe6d5b..b2beedec64 100644<br />--- a/drivers/net/zxdh/zxdh_msg.h<br />+++ b/drivers/net/zxdh/zxdh_msg.h<br />@@ -107,6 +107,27 @@ enum ZXDH_BAR_MODULE_ID {<br />     ZXDH_BAR_MSG_MODULE_NUM = 100,<br /> };<br />  <br />+enum ZXDH_RES_TBL_FILED {<br />+    ZXDH_TBL_FIELD_PCIEID     = 0,<br />+    ZXDH_TBL_FIELD_BDF        = 1,<br />+    ZXDH_TBL_FIELD_MSGCH      = 2,<br />+    ZXDH_TBL_FIELD_DATACH     = 3,<br />+    ZXDH_TBL_FIELD_VPORT      = 4,<br />+    ZXDH_TBL_FIELD_PNLID      = 5,<br />+    ZXDH_TBL_FIELD_PHYPORT    = 6,<br />+    ZXDH_TBL_FIELD_SERDES_NUM = 7,<br />+    ZXDH_TBL_FIELD_NP_PORT    = 8,<br />+    ZXDH_TBL_FIELD_SPEED      = 9,<br />+    ZXDH_TBL_FIELD_HASHID     = 10,<br />+    ZXDH_TBL_FIELD_NON,<br />+};<br />+<br />+enum ZXDH_TBL_MSG_TYPE {<br />+    ZXDH_TBL_TYPE_READ,<br />+    ZXDH_TBL_TYPE_WRITE,<br />+    ZXDH_TBL_TYPE_NON,<br />+};<br />+<br /> struct zxdh_msix_para {<br />     uint16_t pcie_id;<br />     uint16_t vector_risc;<br />--  <br />2.27.0<br />