insert port tables in host.<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_ethdev.c |  24 ++<br /> drivers/net/zxdh/zxdh_msg.c    |  65 ++++<br /> drivers/net/zxdh/zxdh_msg.h    |  72 ++++<br /> drivers/net/zxdh/zxdh_np.c     | 648 ++++++++++++++++++++++++++++++++-<br /> drivers/net/zxdh/zxdh_np.h     | 210 +++++++++++<br /> drivers/net/zxdh/zxdh_pci.h    |   2 +<br /> drivers/net/zxdh/zxdh_tables.c | 105 ++++++<br /> drivers/net/zxdh/zxdh_tables.h | 148 ++++++++<br /> 9 files changed, 1274 insertions(+), 1 deletion(-)<br /> create mode 100644 drivers/net/zxdh/zxdh_tables.c<br /> create mode 100644 drivers/net/zxdh/zxdh_tables.h<br /> <br />diff --git a/drivers/net/zxdh/meson.build b/drivers/net/zxdh/meson.build<br />index ab24a3145c..5b3af87c5b 100644<br />--- a/drivers/net/zxdh/meson.build<br />+++ b/drivers/net/zxdh/meson.build<br />@@ -20,4 +20,5 @@ sources = files(<br />         'zxdh_pci.c',<br />         'zxdh_queue.c',<br />         'zxdh_np.c',<br />+        'zxdh_tables.c',<br /> )<br />diff --git a/drivers/net/zxdh/zxdh_ethdev.c b/drivers/net/zxdh/zxdh_ethdev.c<br />index 4e114d95da..ff44816384 100644<br />--- a/drivers/net/zxdh/zxdh_ethdev.c<br />+++ b/drivers/net/zxdh/zxdh_ethdev.c<br />@@ -14,6 +14,7 @@<br /> #include "zxdh_common.h" <br /> #include "zxdh_queue.h" <br /> #include "zxdh_np.h" <br />+#include "zxdh_tables.h" <br />  <br /> struct zxdh_hw_internal zxdh_hw_internal[RTE_MAX_ETHPORTS];<br /> struct zxdh_shared_data *zxdh_shared_data;<br />@@ -1144,6 +1145,25 @@ zxdh_np_init(struct rte_eth_dev *eth_dev)<br />     return 0;<br /> }<br />  <br />+static int<br />+zxdh_tables_init(struct rte_eth_dev *dev)<br />+{<br />+    int ret = 0;<br />+<br />+    ret = zxdh_port_attr_init(dev);<br />+    if (ret) {<br />+        PMD_DRV_LOG(ERR, "zxdh_port_attr_init failed");<br />+        return ret;<br />+    }<br />+<br />+    ret = zxdh_panel_table_init(dev);<br />+    if (ret) {<br />+        PMD_DRV_LOG(ERR, " panel table init failed");<br />+        return ret;<br />+    }<br />+    return ret;<br />+}<br />+<br /> static int<br /> zxdh_eth_dev_init(struct rte_eth_dev *eth_dev)<br /> {<br />@@ -1220,6 +1240,10 @@ zxdh_eth_dev_init(struct rte_eth_dev *eth_dev)<br />     if (ret != 0)<br />         goto err_zxdh_init;<br />  <br />+    ret = zxdh_tables_init(eth_dev);<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_msg.c b/drivers/net/zxdh/zxdh_msg.c<br />index dd7a518a51..aa2e10fd45 100644<br />--- a/drivers/net/zxdh/zxdh_msg.c<br />+++ b/drivers/net/zxdh/zxdh_msg.c<br />@@ -14,6 +14,7 @@<br /> #include "zxdh_ethdev.h" <br /> #include "zxdh_logs.h" <br /> #include "zxdh_msg.h" <br />+#include "zxdh_pci.h" <br />  <br /> #define ZXDH_REPS_INFO_FLAG_USABLE  0x00<br /> #define ZXDH_BAR_SEQID_NUM_MAX      256<br />@@ -100,6 +101,7 @@<br /> #define ZXDH_BAR_CHAN_MSG_EMEC     1<br /> #define ZXDH_BAR_CHAN_MSG_NO_ACK   0<br /> #define ZXDH_BAR_CHAN_MSG_ACK      1<br />+#define ZXDH_MSG_REPS_OK           0xff<br />  <br /> uint8_t subchan_id_tbl[ZXDH_BAR_MSG_SRC_NUM][ZXDH_BAR_MSG_DST_NUM] = {<br />     {ZXDH_BAR_CHAN_INDEX_SEND, ZXDH_BAR_CHAN_INDEX_SEND, ZXDH_BAR_CHAN_INDEX_SEND},<br />@@ -1079,3 +1081,66 @@ int zxdh_get_bar_offset(struct zxdh_bar_offset_params *paras,<br />     res->bar_length = recv_msg.offset_reps.length;<br />     return ZXDH_BAR_MSG_OK;<br /> }<br />+<br />+int zxdh_vf_send_msg_to_pf(struct rte_eth_dev *dev,  void *msg_req,<br />+            uint16_t msg_req_len, void *reply, uint16_t reply_len)<br />+{<br />+    struct zxdh_hw *hw  = dev->data->dev_private;<br />+    struct zxdh_msg_recviver_mem result = {0};<br />+    struct zxdh_msg_reply_info reply_info = {0};<br />+    int ret = 0;<br />+<br />+    if (reply) {<br />+        RTE_ASSERT(reply_len < sizeof(zxdh_msg_reply_info));<br />+        result.recv_buffer  = reply;<br />+        result.buffer_len = reply_len;<br />+    } else {<br />+        result.recv_buffer = &reply_info;<br />+        result.buffer_len = sizeof(reply_info);<br />+    }<br />+<br />+    struct zxdh_msg_reply_head *reply_head =<br />+                &(((struct zxdh_msg_reply_info *)result.recv_buffer)->reply_head);<br />+    struct zxdh_msg_reply_body *reply_body =<br />+                &(((struct zxdh_msg_reply_info *)result.recv_buffer)->reply_body);<br />+<br />+    struct zxdh_pci_bar_msg in = {<br />+        .virt_addr = (uint64_t)(hw->bar_addr[ZXDH_BAR0_INDEX] +<br />+                ZXDH_MSG_CHAN_PFVFSHARE_OFFSET),<br />+        .payload_addr = msg_req,<br />+        .payload_len = msg_req_len,<br />+        .src = ZXDH_MSG_CHAN_END_VF,<br />+        .dst = ZXDH_MSG_CHAN_END_PF,<br />+        .module_id = ZXDH_MODULE_BAR_MSG_TO_PF,<br />+        .src_pcieid = hw->pcie_id,<br />+        .dst_pcieid = ZXDH_PF_PCIE_ID(hw->pcie_id),<br />+    };<br />+<br />+    ret = zxdh_bar_chan_sync_msg_send(&in, &result);<br />+    if (ret != ZXDH_BAR_MSG_OK) {<br />+        PMD_MSG_LOG(ERR,<br />+            "vf[%d] send bar msg to pf failed.ret %d", hw->vport.vfid, ret);<br />+        return -1;<br />+    }<br />+    if (reply_head->flag != ZXDH_MSG_REPS_OK) {<br />+        PMD_MSG_LOG(ERR, "vf[%d] get pf reply failed: reply_head flag : 0x%x(0xff is OK).replylen %d",<br />+                hw->vport.vfid, reply_head->flag, reply_head->reps_len);<br />+        return -1;<br />+    }<br />+    if (reply_body->flag != ZXDH_REPS_SUCC) {<br />+        PMD_MSG_LOG(ERR, "vf[%d] msg processing failed", hw->vfid);<br />+        return -1;<br />+    }<br />+    return 0;<br />+}<br />+<br />+void zxdh_msg_head_build(struct zxdh_hw *hw, enum zxdh_msg_type type,<br />+        struct zxdh_msg_info *msg_info)<br />+{<br />+    struct zxdh_msg_head *msghead = &msg_info->msg_head;<br />+<br />+    msghead->msg_type = type;<br />+    msghead->vport    = hw->vport.vport;<br />+    msghead->vf_id    = hw->vport.vfid;<br />+    msghead->pcieid   = hw->pcie_id;<br />+}<br />diff --git a/drivers/net/zxdh/zxdh_msg.h b/drivers/net/zxdh/zxdh_msg.h<br />index 025bce78ca..3387a339b4 100644<br />--- a/drivers/net/zxdh/zxdh_msg.h<br />+++ b/drivers/net/zxdh/zxdh_msg.h<br />@@ -33,6 +33,19 @@<br /> #define ZXDH_BAR_MSG_PAYLOAD_MAX_LEN     \<br />     (ZXDH_BAR_MSG_ADDR_CHAN_INTERVAL - sizeof(struct zxdh_bar_msg_header))<br />  <br />+#define ZXDH_MSG_ADDR_CHAN_INTERVAL       (2 * 1024) /* channel size */<br />+#define ZXDH_MSG_PAYLOAD_MAX_LEN \<br />+        (ZXDH_MSG_ADDR_CHAN_INTERVAL - sizeof(struct zxdh_bar_msg_header))<br />+<br />+#define ZXDH_MSG_REPLYBODY_HEAD    sizeof(enum zxdh_reps_flag)<br />+#define ZXDH_MSG_HEADER_SIZE       4<br />+#define ZXDH_MSG_REPLY_BODY_MAX_LEN  \<br />+        (ZXDH_MSG_PAYLOAD_MAX_LEN - sizeof(struct zxdh_msg_reply_head))<br />+<br />+#define ZXDH_MSG_HEAD_LEN 8<br />+#define ZXDH_MSG_REQ_BODY_MAX_LEN  \<br />+        (ZXDH_MSG_PAYLOAD_MAX_LEN - ZXDH_MSG_HEAD_LEN)<br />+<br /> enum ZXDH_DRIVER_TYPE {<br />     ZXDH_MSG_CHAN_END_MPF = 0,<br />     ZXDH_MSG_CHAN_END_PF,<br />@@ -151,6 +164,13 @@ enum pciebar_layout_type {<br />     ZXDH_URI_MAX,<br /> };<br />  <br />+enum zxdh_msg_type {<br />+    ZXDH_NULL = 0,<br />+    ZXDH_VF_PORT_INIT = 1,<br />+<br />+    ZXDH_MSG_TYPE_END,<br />+};<br />+<br /> struct zxdh_msix_para {<br />     uint16_t pcie_id;<br />     uint16_t vector_risc;<br />@@ -240,6 +260,54 @@ struct zxdh_offset_get_msg {<br />     uint16_t type;<br /> };<br />  <br />+struct __rte_packed_begin zxdh_msg_reply_head {<br />+    uint8_t flag;<br />+    uint16_t reps_len;<br />+    uint8_t resvd;<br />+} __rte_packed_end;<br />+<br />+enum zxdh_reps_flag {<br />+    ZXDH_REPS_FAIL,<br />+    ZXDH_REPS_SUCC = 0xaa,<br />+};<br />+<br />+struct __rte_packed_begin zxdh_msg_reply_body {<br />+    enum zxdh_reps_flag flag;<br />+    union __rte_packed_begin {<br />+        uint8_t reply_data[ZXDH_MSG_REPLY_BODY_MAX_LEN - sizeof(enum zxdh_reps_flag)];<br />+    } __rte_packed_end;<br />+} __rte_packed_end;<br />+<br />+struct __rte_packed_begin zxdh_msg_reply_info {<br />+    struct zxdh_msg_reply_head reply_head;<br />+    struct zxdh_msg_reply_body reply_body;<br />+} __rte_packed_end;<br />+<br />+struct __rte_packed_begin zxdh_vf_init_msg {<br />+    uint8_t link_up;<br />+    uint8_t rsv;<br />+    uint16_t base_qid;<br />+    uint8_t rss_enable;<br />+} __rte_packed_end;<br />+<br />+struct __rte_packed_begin zxdh_msg_head {<br />+    enum zxdh_msg_type msg_type;<br />+    uint16_t  vport;<br />+    uint16_t  vf_id;<br />+    uint16_t pcieid;<br />+} __rte_packed_end;<br />+<br />+struct __rte_packed_begin zxdh_msg_info {<br />+    union {<br />+        uint8_t head_len[ZXDH_MSG_HEAD_LEN];<br />+        struct zxdh_msg_head msg_head;<br />+    };<br />+    union __rte_packed_begin {<br />+        uint8_t datainfo[ZXDH_MSG_REQ_BODY_MAX_LEN];<br />+        struct zxdh_vf_init_msg vf_init_msg;<br />+    } __rte_packed_end data;<br />+} __rte_packed_end;<br />+<br /> typedef int (*zxdh_bar_chan_msg_recv_callback)(void *pay_load, uint16_t len,<br />         void *reps_buffer, uint16_t *reps_len, void *dev);<br />  <br />@@ -253,5 +321,9 @@ int zxdh_bar_chan_sync_msg_send(struct zxdh_pci_bar_msg *in,<br />         struct zxdh_msg_recviver_mem *result);<br />  <br /> int zxdh_bar_irq_recv(uint8_t src, uint8_t dst, uint64_t virt_addr, void *dev);<br />+void zxdh_msg_head_build(struct zxdh_hw *hw, enum zxdh_msg_type type,<br />+        struct zxdh_msg_info *msg_info);<br />+int zxdh_vf_send_msg_to_pf(struct rte_eth_dev *dev,  void *msg_req,<br />+            uint16_t msg_req_len, void *reply, uint16_t reply_len);<br />  <br /> #endif /* ZXDH_MSG_H */<br />diff --git a/drivers/net/zxdh/zxdh_np.c b/drivers/net/zxdh/zxdh_np.c<br />index 28728b0c68..db536d96e3 100644<br />--- a/drivers/net/zxdh/zxdh_np.c<br />+++ b/drivers/net/zxdh/zxdh_np.c<br />@@ -9,6 +9,7 @@<br /> #include <rte_log.h> <br /> #include <rte_debug.h> <br /> #include <rte_malloc.h> <br />+#include <rte_memcpy.h> <br />  <br /> #include "zxdh_np.h" <br /> #include "zxdh_logs.h" <br />@@ -16,11 +17,14 @@<br /> static uint64_t g_np_bar_offset;<br /> static ZXDH_DEV_MGR_T g_dev_mgr;<br /> static ZXDH_SDT_MGR_T g_sdt_mgr;<br />+static uint32_t g_dpp_dtb_int_enable;<br />+static uint32_t g_table_type[ZXDH_DEV_CHANNEL_MAX][ZXDH_DEV_SDT_ID_MAX];<br /> ZXDH_PPU_CLS_BITMAP_T g_ppu_cls_bit_map[ZXDH_DEV_CHANNEL_MAX];<br /> ZXDH_DTB_MGR_T *p_dpp_dtb_mgr[ZXDH_DEV_CHANNEL_MAX];<br /> ZXDH_RISCV_DTB_MGR *p_riscv_dtb_queue_mgr[ZXDH_DEV_CHANNEL_MAX];<br /> ZXDH_TLB_MGR_T *g_p_dpp_tlb_mgr[ZXDH_DEV_CHANNEL_MAX];<br /> ZXDH_REG_T g_dpp_reg_info[4];<br />+ZXDH_DTB_TABLE_T g_dpp_dtb_table_info[4];<br />  <br /> #define ZXDH_SDT_MGR_PTR_GET()    (&g_sdt_mgr)<br /> #define ZXDH_SDT_SOFT_TBL_GET(id) (g_sdt_mgr.sdt_tbl_array[id])<br />@@ -76,6 +80,92 @@ do {\<br />     } \<br /> } while (0)<br />  <br />+#define ZXDH_COMM_CHECK_POINT(point)\<br />+do {\<br />+    if ((point) == NULL) {\<br />+        PMD_DRV_LOG(ERR, "ZXIC %s:%d[Error:POINT NULL] ! FUNCTION : %s!",\<br />+        __FILE__, __LINE__, __func__);\<br />+        RTE_ASSERT(0);\<br />+    } \<br />+} while (0)<br />+<br />+<br />+#define ZXDH_COMM_CHECK_POINT_MEMORY_FREE(point, ptr)\<br />+do {\<br />+    if ((point) == NULL) {\<br />+        PMD_DRV_LOG(ERR, "ZXIC %s:%d[Error:POINT NULL] !"\<br />+        "FUNCTION : %s!", __FILE__, __LINE__, __func__);\<br />+        rte_free(ptr);\<br />+        RTE_ASSERT(0);\<br />+    } \<br />+} while (0)<br />+<br />+#define ZXDH_COMM_CHECK_RC_MEMORY_FREE_NO_ASSERT(rc, becall, ptr)\<br />+do {\<br />+    if ((rc) != 0) {\<br />+        PMD_DRV_LOG(ERR, "ZXICP  %s:%d, %s Call"\<br />+        " %s Fail!", __FILE__, __LINE__, __func__, becall);\<br />+        rte_free(ptr);\<br />+    } \<br />+} while (0)<br />+<br />+#define ZXDH_COMM_CONVERT16(w_data) \<br />+            (((w_data) & 0xff) << 8)<br />+<br />+#define ZXDH_DTB_TAB_UP_VIR_ADDR_GET(DEV_ID, QUEUE_ID, INDEX)     \<br />+        ((INDEX) * p_dpp_dtb_mgr[(DEV_ID)]->queue_info[(QUEUE_ID)].tab_up.item_size)<br />+<br />+#define ZXDH_DTB_TAB_DOWN_VIR_ADDR_GET(DEV_ID, QUEUE_ID, INDEX)   \<br />+        ((INDEX) * p_dpp_dtb_mgr[(DEV_ID)]->queue_info[(QUEUE_ID)].tab_down.item_size)<br />+<br />+#define ZXDH_DTB_TAB_DOWN_WR_INDEX_GET(DEV_ID, QUEUE_ID)       \<br />+        (p_dpp_dtb_mgr[(DEV_ID)]->queue_info[(QUEUE_ID)].tab_down.wr_index)<br />+<br />+#define ZXDH_DTB_QUEUE_INIT_FLAG_GET(DEV_ID, QUEUE_ID)       \<br />+        (p_dpp_dtb_mgr[(DEV_ID)]->queue_info[(QUEUE_ID)].init_flag)<br />+<br />+static uint32_t<br />+zxdh_np_comm_is_big_endian(void)<br />+{<br />+    ZXDH_ENDIAN_U c_data;<br />+<br />+    c_data.a = 1;<br />+<br />+    if (c_data.b == 1)<br />+        return 0;<br />+    else<br />+        return 1;<br />+}<br />+<br />+static void<br />+zxdh_np_comm_swap(uint8_t *p_uc_data, uint32_t dw_byte_len)<br />+{<br />+    uint16_t *p_w_tmp = NULL;<br />+    uint32_t *p_dw_tmp = NULL;<br />+    uint32_t dw_byte_num;<br />+    uint8_t uc_byte_mode;<br />+    uint32_t uc_is_big_flag;<br />+    uint32_t i;<br />+<br />+    p_dw_tmp = (uint32_t *)(p_uc_data);<br />+    uc_is_big_flag = zxdh_np_comm_is_big_endian();<br />+    if (uc_is_big_flag)<br />+        return;<br />+<br />+    dw_byte_num  = dw_byte_len >> 2;<br />+    uc_byte_mode = dw_byte_len % 4 & 0xff;<br />+<br />+    for (i = 0; i < dw_byte_num; i++) {<br />+        (*p_dw_tmp) = ZXDH_COMM_CONVERT16(*p_dw_tmp);<br />+        p_dw_tmp++;<br />+    }<br />+<br />+    if (uc_byte_mode > 1) {<br />+        p_w_tmp = (uint16_t *)(p_dw_tmp);<br />+        (*p_w_tmp) = ZXDH_COMM_CONVERT16(*p_w_tmp);<br />+    }<br />+}<br />+<br /> static uint32_t<br /> zxdh_np_dev_init(void)<br /> {<br />@@ -503,7 +593,7 @@ zxdh_np_dtb_queue_vm_info_get(uint32_t dev_id,<br />     p_vm_info->func_num = vm_info.cfg_func_num;<br />     p_vm_info->vfunc_active = vm_info.cfg_vfunc_active;<br />  <br />-    return 0;<br />+    return rc;<br /> }<br />  <br /> static uint32_t<br />@@ -808,3 +898,559 @@ zxdh_np_online_uninit(uint32_t dev_id,<br />  <br />     return 0;<br /> }<br />+<br />+static uint32_t<br />+zxdh_np_sdt_tbl_type_get(uint32_t dev_id, uint32_t sdt_no)<br />+{<br />+    return g_table_type[dev_id][sdt_no];<br />+}<br />+<br />+<br />+static ZXDH_DTB_TABLE_T *<br />+zxdh_np_table_info_get(uint32_t table_type)<br />+{<br />+    return &g_dpp_dtb_table_info[table_type];<br />+}<br />+<br />+static uint32_t<br />+zxdh_np_dtb_write_table_cmd(uint32_t dev_id,<br />+            ZXDH_DTB_TABLE_INFO_E table_type,<br />+            void *p_cmd_data,<br />+            void *p_cmd_buff)<br />+{<br />+    uint32_t         field_cnt;<br />+    ZXDH_DTB_TABLE_T     *p_table_info = NULL;<br />+    ZXDH_DTB_FIELD_T     *p_field_info = NULL;<br />+    uint32_t         temp_data;<br />+    uint32_t         rc;<br />+<br />+    ZXDH_COMM_CHECK_POINT(p_cmd_data);<br />+    ZXDH_COMM_CHECK_POINT(p_cmd_buff);<br />+    p_table_info = zxdh_np_table_info_get(table_type);<br />+    p_field_info = p_table_info->p_fields;<br />+    ZXDH_COMM_CHECK_DEV_POINT(dev_id, p_table_info);<br />+<br />+    for (field_cnt = 0; field_cnt < p_table_info->field_num; field_cnt++) {<br />+        temp_data = *((uint32_t *)p_cmd_data + field_cnt) & ZXDH_COMM_GET_BIT_MASK(uint32_t,<br />+            p_field_info[field_cnt].len);<br />+<br />+        rc = zxdh_np_comm_write_bits_ex((uint8_t *)p_cmd_buff,<br />+                    ZXDH_DTB_TABLE_CMD_SIZE_BIT,<br />+                    temp_data,<br />+                    p_field_info[field_cnt].lsb_pos,<br />+                    p_field_info[field_cnt].len);<br />+<br />+        ZXDH_COMM_CHECK_RC_NO_ASSERT(rc, "zxic_comm_write_bits");<br />+    }<br />+<br />+    return rc;<br />+}<br />+<br />+static uint32_t<br />+zxdh_np_dtb_smmu0_write_entry_data(uint32_t dev_id,<br />+        uint32_t mode,<br />+        uint32_t addr,<br />+        uint32_t *p_data,<br />+        ZXDH_DTB_ENTRY_T *p_entry)<br />+{<br />+    ZXDH_DTB_ERAM_TABLE_FORM_T dtb_eram_form_info = {0};<br />+    uint32_t  rc = 0;<br />+<br />+    dtb_eram_form_info.valid = ZXDH_DTB_TABLE_VALID;<br />+    dtb_eram_form_info.type_mode = ZXDH_DTB_TABLE_MODE_ERAM;<br />+    dtb_eram_form_info.data_mode = mode;<br />+    dtb_eram_form_info.cpu_wr = 1;<br />+    dtb_eram_form_info.addr = addr;<br />+    dtb_eram_form_info.cpu_rd = 0;<br />+    dtb_eram_form_info.cpu_rd_mode = 0;<br />+<br />+    if (ZXDH_ERAM128_OPR_128b == mode) {<br />+        p_entry->data_in_cmd_flag = 0;<br />+        p_entry->data_size = 128 / 8;<br />+<br />+        rc = zxdh_np_dtb_write_table_cmd(dev_id, ZXDH_DTB_TABLE_ERAM_128,<br />+            &dtb_eram_form_info, p_entry->cmd);<br />+        ZXDH_COMM_CHECK_RC_NO_ASSERT(rc, "dpp_dtb_write_table_cmd");<br />+<br />+        memcpy(p_entry->data, p_data, 128 / 8);<br />+    } else if (ZXDH_ERAM128_OPR_64b == mode) {<br />+        p_entry->data_in_cmd_flag = 1;<br />+        p_entry->data_size  = 64 / 8;<br />+        dtb_eram_form_info.data_l = *(p_data + 1);<br />+        dtb_eram_form_info.data_h = *(p_data);<br />+<br />+        rc = zxdh_np_dtb_write_table_cmd(dev_id, ZXDH_DTB_TABLE_ERAM_64,<br />+            &dtb_eram_form_info, p_entry->cmd);<br />+        ZXDH_COMM_CHECK_RC_NO_ASSERT(rc, "dpp_dtb_write_table_cmd");<br />+<br />+    } else if (ZXDH_ERAM128_OPR_1b == mode) {<br />+        p_entry->data_in_cmd_flag = 1;<br />+        p_entry->data_size  = 1;<br />+        dtb_eram_form_info.data_h = *(p_data);<br />+<br />+        rc = zxdh_np_dtb_write_table_cmd(dev_id, ZXDH_DTB_TABLE_ERAM_1,<br />+            &dtb_eram_form_info, p_entry->cmd);<br />+        ZXDH_COMM_CHECK_RC_NO_ASSERT(rc, "dpp_dtb_write_table_cmd");<br />+    }<br />+<br />+    return rc;<br />+}<br />+<br />+static uint32_t<br />+zxdh_np_dtb_se_smmu0_ind_write(uint32_t dev_id,<br />+        uint32_t base_addr,<br />+        uint32_t index,<br />+        uint32_t wrt_mode,<br />+        uint32_t *p_data,<br />+        ZXDH_DTB_ENTRY_T *p_entry)<br />+{<br />+    uint32_t temp_idx;<br />+    uint32_t dtb_ind_addr;<br />+    uint32_t rc;<br />+<br />+    switch (wrt_mode) {<br />+    case ZXDH_ERAM128_OPR_128b:<br />+    {<br />+        if ((0xFFFFFFFF - (base_addr)) < (index)) {<br />+            PMD_DRV_LOG(ERR,  "ICM %s:%d[Error:VALUE[val0=0x%x]" <br />+                "INVALID] [val1=0x%x] ! FUNCTION :%s !", __FILE__, __LINE__,<br />+                base_addr, index, __func__);<br />+<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, "dpp_se_smmu0_ind_write : index out of range !");<br />+            return 1;<br />+        }<br />+        temp_idx = index << 7;<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, "dpp_se_smmu0_ind_write : index out of range !");<br />+            return 1;<br />+        }<br />+        temp_idx = index << 6;<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, "dpp_se_smmu0_ind_write : index out of range !");<br />+            return 1;<br />+        }<br />+<br />+        temp_idx = index;<br />+    }<br />+    }<br />+<br />+    dtb_ind_addr = ((base_addr << 7) & ZXDH_ERAM128_BADDR_MASK) + temp_idx;<br />+<br />+    PMD_DRV_LOG(INFO, " dtb eram item 1bit addr: 0x%x", dtb_ind_addr);<br />+<br />+    rc = zxdh_np_dtb_smmu0_write_entry_data(dev_id,<br />+                          wrt_mode,<br />+                          dtb_ind_addr,<br />+                          p_data,<br />+                          p_entry);<br />+    ZXDH_COMM_CHECK_RC_NO_ASSERT(rc, "dpp_dtb_smmu0_write_entry_data");<br />+<br />+    return rc;<br />+}<br />+<br />+static uint32_t<br />+zxdh_np_eram_dtb_len_get(uint32_t mode)<br />+{<br />+    uint32_t dtb_len = 0;<br />+<br />+    switch (mode) {<br />+    case ZXDH_ERAM128_OPR_128b:<br />+    {<br />+        dtb_len += 2;<br />+        break;<br />+    }<br />+    case ZXDH_ERAM128_OPR_64b:<br />+    case ZXDH_ERAM128_OPR_1b:<br />+    {<br />+        dtb_len += 1;<br />+        break;<br />+    }<br />+    default:<br />+        break;<br />+    }<br />+<br />+    return dtb_len;<br />+}<br />+<br />+static uint32_t<br />+zxdh_np_dtb_eram_one_entry(uint32_t dev_id,<br />+        uint32_t sdt_no,<br />+        uint32_t del_en,<br />+        void *pdata,<br />+        uint32_t *p_dtb_len,<br />+        ZXDH_DTB_ENTRY_T *p_dtb_one_entry)<br />+{<br />+    uint32_t buff[ZXDH_SMMU0_READ_REG_MAX_NUM]      = {0};<br />+    ZXDH_SDTTBL_ERAM_T sdt_eram           = {0};<br />+    ZXDH_DTB_ERAM_ENTRY_INFO_T *peramdata = NULL;<br />+    uint32_t base_addr;<br />+    uint32_t index;<br />+    uint32_t opr_mode;<br />+    uint32_t rc;<br />+<br />+    ZXDH_COMM_CHECK_POINT(pdata);<br />+    ZXDH_COMM_CHECK_POINT(p_dtb_one_entry);<br />+    ZXDH_COMM_CHECK_POINT(p_dtb_len);<br />+<br />+    peramdata = (ZXDH_DTB_ERAM_ENTRY_INFO_T *)pdata;<br />+    index = peramdata->index;<br />+    base_addr = sdt_eram.eram_base_addr;<br />+    opr_mode = sdt_eram.eram_mode;<br />+<br />+    switch (opr_mode) {<br />+    case ZXDH_ERAM128_TBL_128b:<br />+    {<br />+        opr_mode = ZXDH_ERAM128_OPR_128b;<br />+        break;<br />+    }<br />+    case ZXDH_ERAM128_TBL_64b:<br />+    {<br />+        opr_mode = ZXDH_ERAM128_OPR_64b;<br />+        break;<br />+    }<br />+<br />+    case ZXDH_ERAM128_TBL_1b:<br />+    {<br />+        opr_mode = ZXDH_ERAM128_OPR_1b;<br />+        break;<br />+    }<br />+    }<br />+<br />+    if (del_en) {<br />+        memset((uint8_t *)buff, 0, sizeof(buff));<br />+        rc = zxdh_np_dtb_se_smmu0_ind_write(dev_id,<br />+                        base_addr,<br />+                        index,<br />+                        opr_mode,<br />+                        buff,<br />+                        p_dtb_one_entry);<br />+        ZXDH_COMM_CHECK_DEV_RC(sdt_no, rc, "zxdh_dtb_se_smmu0_ind_write");<br />+    } else {<br />+        rc = zxdh_np_dtb_se_smmu0_ind_write(dev_id,<br />+                                   base_addr,<br />+                                   index,<br />+                                   opr_mode,<br />+                                   peramdata->p_data,<br />+                                   p_dtb_one_entry);<br />+        ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_dtb_se_smmu0_ind_write");<br />+    }<br />+    *p_dtb_len = zxdh_np_eram_dtb_len_get(opr_mode);<br />+<br />+    return rc;<br />+}<br />+<br />+static uint32_t<br />+zxdh_np_dtb_data_write(uint8_t *p_data_buff,<br />+            uint32_t addr_offset,<br />+            ZXDH_DTB_ENTRY_T *entry)<br />+{<br />+    ZXDH_COMM_CHECK_POINT(p_data_buff);<br />+    ZXDH_COMM_CHECK_POINT(entry);<br />+<br />+    uint8_t *p_cmd = p_data_buff + addr_offset;<br />+    uint32_t cmd_size = ZXDH_DTB_TABLE_CMD_SIZE_BIT / 8;<br />+<br />+    uint8_t *p_data = p_cmd + cmd_size;<br />+    uint32_t data_size = entry->data_size;<br />+<br />+    uint8_t *cmd = (uint8_t *)entry->cmd;<br />+    uint8_t *data = (uint8_t *)entry->data;<br />+<br />+    rte_memcpy(p_cmd, cmd, cmd_size);<br />+<br />+    if (!entry->data_in_cmd_flag) {<br />+        zxdh_np_comm_swap(data, data_size);<br />+        rte_memcpy(p_data, data, data_size);<br />+    }<br />+<br />+    return 0;<br />+}<br />+<br />+static uint32_t<br />+zxdh_np_dtb_queue_enable_get(uint32_t dev_id,<br />+        uint32_t queue_id,<br />+        uint32_t *enable)<br />+{<br />+    uint32_t rc = 0;<br />+    ZXDH_DTB_QUEUE_VM_INFO_T vm_info = {0};<br />+<br />+    rc = zxdh_np_dtb_queue_vm_info_get(dev_id, queue_id, &vm_info);<br />+    ZXDH_COMM_CHECK_RC_NO_ASSERT(rc, "zxdh_dtb_queue_vm_info_get");<br />+<br />+    *enable = vm_info.queue_en;<br />+    return rc;<br />+}<br />+<br />+static uint32_t<br />+zxdh_np_dtb_item_buff_wr(uint32_t dev_id,<br />+        uint32_t queue_id,<br />+        uint32_t dir_flag,<br />+        uint32_t index,<br />+        uint32_t pos,<br />+        uint32_t len,<br />+        uint32_t *p_data)<br />+{<br />+    uint64_t addr;<br />+<br />+    if (dir_flag == 1)<br />+        addr = ZXDH_DTB_TAB_UP_VIR_ADDR_GET(dev_id, queue_id, index) +<br />+            ZXDH_DTB_ITEM_ACK_SIZE + pos * 4;<br />+    else<br />+        addr = ZXDH_DTB_TAB_DOWN_VIR_ADDR_GET(dev_id, queue_id, index) +<br />+            ZXDH_DTB_ITEM_ACK_SIZE + pos * 4;<br />+<br />+    memcpy((uint8_t *)(addr), p_data, len * 4);<br />+<br />+    return 0;<br />+}<br />+<br />+static uint32_t<br />+zxdh_np_dtb_item_ack_rd(uint32_t dev_id,<br />+        uint32_t queue_id,<br />+        uint32_t dir_flag,<br />+        uint32_t index,<br />+        uint32_t pos,<br />+        uint32_t *p_data)<br />+{<br />+    uint64_t addr;<br />+    uint32_t val;<br />+<br />+    if (dir_flag == 1)<br />+        addr = ZXDH_DTB_TAB_UP_VIR_ADDR_GET(dev_id, queue_id, index) + pos * 4;<br />+    else<br />+        addr = ZXDH_DTB_TAB_DOWN_VIR_ADDR_GET(dev_id, queue_id, index) + pos * 4;<br />+<br />+    val = *((volatile uint32_t *)(addr));<br />+<br />+    *p_data = val;<br />+<br />+    return 0;<br />+}<br />+<br />+static uint32_t<br />+zxdh_np_dtb_item_ack_wr(uint32_t dev_id,<br />+        uint32_t queue_id,<br />+        uint32_t dir_flag,<br />+        uint32_t index,<br />+        uint32_t pos,<br />+        uint32_t data)<br />+{<br />+    uint64_t addr;<br />+<br />+    if (dir_flag == 1)<br />+        addr = ZXDH_DTB_TAB_UP_VIR_ADDR_GET(dev_id, queue_id, index) + pos * 4;<br />+    else<br />+        addr = ZXDH_DTB_TAB_DOWN_VIR_ADDR_GET(dev_id, queue_id, index) + pos * 4;<br />+<br />+    *((volatile uint32_t *)(addr)) = data;<br />+<br />+    return 0;<br />+}<br />+<br />+static uint32_t<br />+zxdh_np_dtb_queue_item_info_set(uint32_t dev_id,<br />+        uint32_t queue_id,<br />+        ZXDH_DTB_QUEUE_ITEM_INFO_T *p_item_info)<br />+{<br />+    ZXDH_DTB_QUEUE_LEN_T dtb_len = {0};<br />+    uint32_t rc;<br />+<br />+    dtb_len.cfg_dtb_cmd_type = p_item_info->cmd_type;<br />+    dtb_len.cfg_dtb_cmd_int_en = p_item_info->int_en;<br />+    dtb_len.cfg_queue_dtb_len = p_item_info->data_len;<br />+<br />+    rc = zxdh_np_reg_write(dev_id, ZXDH_DTB_CFG_QUEUE_DTB_LEN,<br />+                        0, queue_id, (void *)&dtb_len);<br />+    ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "dpp_reg_write");<br />+    return rc;<br />+}<br />+<br />+static uint32_t<br />+zxdh_np_dtb_tab_down_info_set(uint32_t dev_id,<br />+        uint32_t queue_id,<br />+        uint32_t int_flag,<br />+        uint32_t data_len,<br />+        uint32_t *p_data,<br />+        uint32_t *p_item_index)<br />+{<br />+    ZXDH_DTB_QUEUE_ITEM_INFO_T item_info = {0};<br />+    uint32_t unused_item_num = 0;<br />+    uint32_t queue_en = 0;<br />+    uint32_t ack_vale = 0;<br />+    uint64_t phy_addr;<br />+    uint32_t item_index;<br />+    uint32_t i;<br />+    uint32_t rc;<br />+<br />+    if (ZXDH_DTB_QUEUE_INIT_FLAG_GET(dev_id, queue_id) == 0) {<br />+        PMD_DRV_LOG(ERR, "dtb queue %d is not init.", queue_id);<br />+        return ZXDH_RC_DTB_QUEUE_IS_NOT_INIT;<br />+    }<br />+<br />+    if (data_len % 4 != 0)<br />+        return ZXDH_RC_DTB_PARA_INVALID;<br />+<br />+    rc = zxdh_np_dtb_queue_enable_get(dev_id, queue_id, &queue_en);<br />+    if (!queue_en) {<br />+        PMD_DRV_LOG(ERR, "the queue %d is not enable!,rc=%d", queue_id, rc);<br />+        return ZXDH_RC_DTB_QUEUE_NOT_ENABLE;<br />+    }<br />+<br />+    rc = zxdh_np_dtb_queue_unused_item_num_get(dev_id, queue_id, &unused_item_num);<br />+    if (unused_item_num == 0)<br />+        return ZXDH_RC_DTB_QUEUE_ITEM_HW_EMPTY;<br />+<br />+    for (i = 0; i < ZXDH_DTB_QUEUE_ITEM_NUM_MAX; i++) {<br />+        item_index = ZXDH_DTB_TAB_DOWN_WR_INDEX_GET(dev_id, queue_id) %<br />+            ZXDH_DTB_QUEUE_ITEM_NUM_MAX;<br />+<br />+        rc = zxdh_np_dtb_item_ack_rd(dev_id, queue_id, 0,<br />+            item_index, 0, &ack_vale);<br />+<br />+        ZXDH_DTB_TAB_DOWN_WR_INDEX_GET(dev_id, queue_id)++;<br />+<br />+        if ((ack_vale >> 8) == ZXDH_DTB_TAB_ACK_UNUSED_MASK)<br />+            break;<br />+    }<br />+<br />+    if (i == ZXDH_DTB_QUEUE_ITEM_NUM_MAX)<br />+        return ZXDH_RC_DTB_QUEUE_ITEM_SW_EMPTY;<br />+<br />+    rc = zxdh_np_dtb_item_buff_wr(dev_id, queue_id, 0,<br />+        item_index, 0, data_len, p_data);<br />+<br />+    rc = zxdh_np_dtb_item_ack_wr(dev_id, queue_id, 0,<br />+        item_index, 0, ZXDH_DTB_TAB_ACK_IS_USING_MASK);<br />+<br />+    item_info.cmd_vld = 1;<br />+    item_info.cmd_type = 0;<br />+    item_info.int_en = int_flag;<br />+    item_info.data_len = data_len / 4;<br />+    phy_addr = p_dpp_dtb_mgr[dev_id]->queue_info[queue_id].tab_down.start_phy_addr +<br />+        item_index * p_dpp_dtb_mgr[dev_id]->queue_info[queue_id].tab_down.item_size;<br />+    item_info.data_hddr = ((phy_addr >> 4) >> 32) & 0xffffffff;<br />+    item_info.data_laddr = (phy_addr >> 4) & 0xffffffff;<br />+<br />+    rc = zxdh_np_dtb_queue_item_info_set(dev_id, queue_id, &item_info);<br />+    *p_item_index = item_index;<br />+<br />+    return rc;<br />+}<br />+<br />+static uint32_t<br />+zxdh_np_dtb_write_down_table_data(uint32_t dev_id,<br />+        uint32_t queue_id,<br />+        uint32_t down_table_len,<br />+        uint8_t *p_down_table_buff,<br />+        uint32_t *p_element_id)<br />+{<br />+    uint32_t  rc = 0;<br />+    uint32_t dtb_interrupt_status = 0;<br />+<br />+    dtb_interrupt_status = g_dpp_dtb_int_enable;<br />+<br />+    rc = zxdh_np_dtb_tab_down_info_set(dev_id,<br />+                    queue_id,<br />+                    dtb_interrupt_status,<br />+                    down_table_len / 4,<br />+                    (uint32_t *)p_down_table_buff,<br />+                    p_element_id);<br />+    return rc;<br />+}<br />+<br />+int<br />+zxdh_np_dtb_table_entry_write(uint32_t dev_id,<br />+            uint32_t queue_id,<br />+            uint32_t entrynum,<br />+            ZXDH_DTB_USER_ENTRY_T *down_entries)<br />+{<br />+    ZXDH_DTB_USER_ENTRY_T *pentry = NULL;<br />+    ZXDH_DTB_ENTRY_T   dtb_one_entry = {0};<br />+    uint8_t entry_cmd[ZXDH_DTB_TABLE_CMD_SIZE_BIT] = {0};<br />+    uint8_t entry_data[ZXDH_ETCAM_WIDTH_MAX] = {0};<br />+    uint8_t *p_data_buff = NULL;<br />+    uint8_t *p_data_buff_ex = NULL;<br />+    uint32_t element_id = 0xff;<br />+    uint32_t one_dtb_len = 0;<br />+    uint32_t dtb_len = 0;<br />+    uint32_t entry_index;<br />+    uint32_t sdt_no;<br />+    uint32_t tbl_type;<br />+    uint32_t addr_offset;<br />+    uint32_t max_size;<br />+    uint32_t rc;<br />+<br />+    p_data_buff = rte_zmalloc(NULL, ZXDH_DTB_TABLE_DATA_BUFF_SIZE, 0);<br />+    ZXDH_COMM_CHECK_POINT(p_data_buff);<br />+<br />+    p_data_buff_ex = rte_zmalloc(NULL, ZXDH_DTB_TABLE_DATA_BUFF_SIZE, 0);<br />+    ZXDH_COMM_CHECK_POINT_MEMORY_FREE(p_data_buff_ex, p_data_buff);<br />+<br />+    dtb_one_entry.cmd = entry_cmd;<br />+    dtb_one_entry.data = entry_data;<br />+<br />+    max_size = (ZXDH_DTB_TABLE_DATA_BUFF_SIZE / 16) - 1;<br />+<br />+    for (entry_index = 0; entry_index < entrynum; entry_index++) {<br />+        pentry = down_entries + entry_index;<br />+        sdt_no = pentry->sdt_no;<br />+        tbl_type = zxdh_np_sdt_tbl_type_get(dev_id, sdt_no);<br />+        switch (tbl_type) {<br />+        case ZXDH_SDT_TBLT_ERAM:<br />+        {<br />+            rc = zxdh_np_dtb_eram_one_entry(dev_id, sdt_no, ZXDH_DTB_ITEM_ADD_OR_UPDATE,<br />+                pentry->p_entry_data, &one_dtb_len, &dtb_one_entry);<br />+            break;<br />+        }<br />+        default:<br />+        {<br />+            PMD_DRV_LOG(ERR, "SDT table_type[ %d ] is invalid!", tbl_type);<br />+            rte_free(p_data_buff);<br />+            rte_free(p_data_buff_ex);<br />+            return 1;<br />+        }<br />+        }<br />+<br />+        addr_offset = dtb_len * ZXDH_DTB_LEN_POS_SETP;<br />+        dtb_len += one_dtb_len;<br />+        if (dtb_len > max_size) {<br />+            rte_free(p_data_buff);<br />+            rte_free(p_data_buff_ex);<br />+            PMD_DRV_LOG(ERR, " %s error dtb_len>%u!", __func__,<br />+                max_size);<br />+            return ZXDH_RC_DTB_DOWN_LEN_INVALID;<br />+        }<br />+        rc = zxdh_np_dtb_data_write(p_data_buff, addr_offset, &dtb_one_entry);<br />+        memset(entry_cmd, 0x0, sizeof(entry_cmd));<br />+        memset(entry_data, 0x0, sizeof(entry_data));<br />+    }<br />+<br />+    if (dtb_len == 0) {<br />+        rte_free(p_data_buff);<br />+        rte_free(p_data_buff_ex);<br />+        return ZXDH_RC_DTB_DOWN_LEN_INVALID;<br />+    }<br />+<br />+    rc = zxdh_np_dtb_write_down_table_data(dev_id,<br />+                    queue_id,<br />+                    dtb_len * 16,<br />+                    p_data_buff,<br />+                    &element_id);<br />+    rte_free(p_data_buff);<br />+    rte_free(p_data_buff_ex);<br />+<br />+    return rc;<br />+}<br />diff --git a/drivers/net/zxdh/zxdh_np.h b/drivers/net/zxdh/zxdh_np.h<br />index dc0e867827..40961c02a2 100644<br />--- a/drivers/net/zxdh/zxdh_np.h<br />+++ b/drivers/net/zxdh/zxdh_np.h<br />@@ -7,6 +7,8 @@<br />  <br /> #include <stdint.h> <br />  <br />+#define ZXDH_DISABLE                          (0)<br />+#define ZXDH_ENABLE                           (1)<br /> #define ZXDH_PORT_NAME_MAX                    (32)<br /> #define ZXDH_DEV_CHANNEL_MAX                  (2)<br /> #define ZXDH_DEV_SDT_ID_MAX                   (256U)<br />@@ -52,6 +54,94 @@<br /> #define ZXDH_ACL_TBL_ID_NUM             (8U)<br /> #define ZXDH_ACL_BLOCK_NUM              (8U)<br />  <br />+#define ZXDH_SMMU0_READ_REG_MAX_NUM              (4)<br />+<br />+#define ZXDH_DTB_ITEM_ACK_SIZE                   (16)<br />+#define ZXDH_DTB_ITEM_BUFF_SIZE                  (16 * 1024)<br />+#define ZXDH_DTB_ITEM_SIZE                       (16 + 16 * 1024)<br />+#define ZXDH_DTB_TAB_UP_SIZE                     ((16 + 16 * 1024) * 32)<br />+#define ZXDH_DTB_TAB_DOWN_SIZE                   ((16 + 16 * 1024) * 32)<br />+<br />+#define ZXDH_DTB_TAB_UP_ACK_VLD_MASK             (0x555555)<br />+#define ZXDH_DTB_TAB_DOWN_ACK_VLD_MASK           (0x5a5a5a)<br />+#define ZXDH_DTB_TAB_ACK_IS_USING_MASK           (0x11111100)<br />+#define ZXDH_DTB_TAB_ACK_UNUSED_MASK             (0x0)<br />+#define ZXDH_DTB_TAB_ACK_SUCCESS_MASK            (0xff)<br />+#define ZXDH_DTB_TAB_ACK_FAILED_MASK             (0x1)<br />+#define ZXDH_DTB_TAB_ACK_CHECK_VALUE             (0x12345678)<br />+<br />+#define ZXDH_DTB_TAB_ACK_VLD_SHIFT               (104)<br />+#define ZXDH_DTB_TAB_ACK_STATUS_SHIFT            (96)<br />+#define ZXDH_DTB_LEN_POS_SETP                    (16)<br />+#define ZXDH_DTB_ITEM_ADD_OR_UPDATE              (0)<br />+#define ZXDH_DTB_ITEM_DELETE                     (1)<br />+<br />+#define ZXDH_ETCAM_LEN_SIZE            (6)<br />+#define ZXDH_ETCAM_BLOCK_NUM           (8)<br />+#define ZXDH_ETCAM_TBLID_NUM           (8)<br />+#define ZXDH_ETCAM_RAM_NUM             (8)<br />+#define ZXDH_ETCAM_RAM_WIDTH           (80U)<br />+#define ZXDH_ETCAM_WR_MASK_MAX         (((uint32_t)1 << ZXDH_ETCAM_RAM_NUM) - 1)<br />+#define ZXDH_ETCAM_WIDTH_MIN           (ZXDH_ETCAM_RAM_WIDTH)<br />+#define ZXDH_ETCAM_WIDTH_MAX           (ZXDH_ETCAM_RAM_NUM * ZXDH_ETCAM_RAM_WIDTH)<br />+<br />+#define ZXDH_DTB_TABLE_DATA_BUFF_SIZE           (16384)<br />+#define ZXDH_DTB_TABLE_CMD_SIZE_BIT             (128)<br />+<br />+#define ZXDH_SE_SMMU0_ERAM_BLOCK_NUM            (32)<br />+#define ZXDH_SE_SMMU0_ERAM_ADDR_NUM_PER_BLOCK   (0x4000)<br />+#define ZXDH_SE_SMMU0_ERAM_ADDR_NUM_TOTAL  \<br />+        (ZXDH_SE_SMMU0_ERAM_BLOCK_NUM * ZXDH_SE_SMMU0_ERAM_ADDR_NUM_PER_BLOCK)<br />+<br />+/**errco code */<br />+#define ZXDH_RC_BASE                            (0x1000U)<br />+#define ZXDH_PARAMETER_CHK_BASE                 (ZXDH_RC_BASE            | 0x200)<br />+#define ZXDH_PAR_CHK_POINT_NULL                 (ZXDH_PARAMETER_CHK_BASE | 0x001)<br />+#define ZXDH_PAR_CHK_ARGIN_ZERO                 (ZXDH_PARAMETER_CHK_BASE | 0x002)<br />+#define ZXDH_PAR_CHK_ARGIN_OVERFLOW             (ZXDH_PARAMETER_CHK_BASE | 0x003)<br />+#define ZXDH_PAR_CHK_ARGIN_ERROR                (ZXDH_PARAMETER_CHK_BASE | 0x004)<br />+#define ZXDH_PAR_CHK_INVALID_INDEX              (ZXDH_PARAMETER_CHK_BASE | 0x005)<br />+#define ZXDH_PAR_CHK_INVALID_RANGE              (ZXDH_PARAMETER_CHK_BASE | 0x006)<br />+#define ZXDH_PAR_CHK_INVALID_DEV_ID             (ZXDH_PARAMETER_CHK_BASE | 0x007)<br />+#define ZXDH_PAR_CHK_INVALID_PARA               (ZXDH_PARAMETER_CHK_BASE | 0x008)<br />+<br />+#define ZXDH_ERAM128_BADDR_MASK                 (0x3FFFF80)<br />+<br />+#define ZXDH_DTB_TABLE_MODE_ERAM                (0)<br />+#define ZXDH_DTB_TABLE_MODE_DDR                 (1)<br />+#define ZXDH_DTB_TABLE_MODE_ZCAM                (2)<br />+#define ZXDH_DTB_TABLE_MODE_ETCAM               (3)<br />+#define ZXDH_DTB_TABLE_MODE_MC_HASH             (4)<br />+#define ZXDH_DTB_TABLE_VALID                    (1)<br />+<br />+/* DTB module error code */<br />+#define ZXDH_RC_DTB_BASE                        (0xd00)<br />+#define ZXDH_RC_DTB_MGR_EXIST                   (ZXDH_RC_DTB_BASE | 0x0)<br />+#define ZXDH_RC_DTB_MGR_NOT_EXIST               (ZXDH_RC_DTB_BASE | 0x1)<br />+#define ZXDH_RC_DTB_QUEUE_RES_EMPTY             (ZXDH_RC_DTB_BASE | 0x2)<br />+#define ZXDH_RC_DTB_QUEUE_BUFF_SIZE_ERR         (ZXDH_RC_DTB_BASE | 0x3)<br />+#define ZXDH_RC_DTB_QUEUE_ITEM_HW_EMPTY         (ZXDH_RC_DTB_BASE | 0x4)<br />+#define ZXDH_RC_DTB_QUEUE_ITEM_SW_EMPTY         (ZXDH_RC_DTB_BASE | 0x5)<br />+#define ZXDH_RC_DTB_TAB_UP_BUFF_EMPTY           (ZXDH_RC_DTB_BASE | 0x6)<br />+#define ZXDH_RC_DTB_TAB_DOWN_BUFF_EMPTY         (ZXDH_RC_DTB_BASE | 0x7)<br />+#define ZXDH_RC_DTB_TAB_UP_TRANS_ERR            (ZXDH_RC_DTB_BASE | 0x8)<br />+#define ZXDH_RC_DTB_TAB_DOWN_TRANS_ERR          (ZXDH_RC_DTB_BASE | 0x9)<br />+#define ZXDH_RC_DTB_QUEUE_IS_WORKING            (ZXDH_RC_DTB_BASE | 0xa)<br />+#define ZXDH_RC_DTB_QUEUE_IS_NOT_INIT           (ZXDH_RC_DTB_BASE | 0xb)<br />+#define ZXDH_RC_DTB_MEMORY_ALLOC_ERR            (ZXDH_RC_DTB_BASE | 0xc)<br />+#define ZXDH_RC_DTB_PARA_INVALID                (ZXDH_RC_DTB_BASE | 0xd)<br />+#define ZXDH_RC_DMA_RANGE_INVALID               (ZXDH_RC_DTB_BASE | 0xe)<br />+#define ZXDH_RC_DMA_RCV_DATA_EMPTY              (ZXDH_RC_DTB_BASE | 0xf)<br />+#define ZXDH_RC_DTB_LPM_INSERT_FAIL             (ZXDH_RC_DTB_BASE | 0x10)<br />+#define ZXDH_RC_DTB_LPM_DELETE_FAIL             (ZXDH_RC_DTB_BASE | 0x11)<br />+#define ZXDH_RC_DTB_DOWN_LEN_INVALID            (ZXDH_RC_DTB_BASE | 0x12)<br />+#define ZXDH_RC_DTB_DOWN_HASH_CONFLICT          (ZXDH_RC_DTB_BASE | 0x13)<br />+#define ZXDH_RC_DTB_QUEUE_NOT_ALLOC             (ZXDH_RC_DTB_BASE | 0x14)<br />+#define ZXDH_RC_DTB_QUEUE_NAME_ERROR            (ZXDH_RC_DTB_BASE | 0x15)<br />+#define ZXDH_RC_DTB_DUMP_SIZE_SMALL             (ZXDH_RC_DTB_BASE | 0x16)<br />+#define ZXDH_RC_DTB_SEARCH_VPORT_QUEUE_ZERO     (ZXDH_RC_DTB_BASE | 0x17)<br />+#define ZXDH_RC_DTB_QUEUE_NOT_ENABLE            (ZXDH_RC_DTB_BASE | 0x18)<br />+<br /> typedef enum zxdh_module_init_e {<br />     ZXDH_MODULE_INIT_NPPU = 0,<br />     ZXDH_MODULE_INIT_PPU,<br />@@ -299,7 +389,127 @@ typedef struct zxdh_tlb_mgr_t {<br />     uint32_t pa_width;<br /> } ZXDH_TLB_MGR_T;<br />  <br />+typedef enum zxdh_eram128_tbl_mode_e {<br />+    ZXDH_ERAM128_TBL_1b   = 0,<br />+    ZXDH_ERAM128_TBL_32b  = 1,<br />+    ZXDH_ERAM128_TBL_64b  = 2,<br />+    ZXDH_ERAM128_TBL_128b = 3,<br />+    ZXDH_ERAM128_TBL_2b   = 4,<br />+    ZXDH_ERAM128_TBL_4b   = 5,<br />+    ZXDH_ERAM128_TBL_8b   = 6,<br />+    ZXDH_ERAM128_TBL_16b  = 7<br />+} ZXDH_ERAM128_TBL_MODE_E;<br />+<br />+typedef enum zxdh_eram128_opr_mode_e {<br />+    ZXDH_ERAM128_OPR_128b = 0,<br />+    ZXDH_ERAM128_OPR_64b  = 1,<br />+    ZXDH_ERAM128_OPR_1b   = 2,<br />+    ZXDH_ERAM128_OPR_32b  = 3<br />+<br />+} ZXDH_ERAM128_OPR_MODE_E;<br />+<br />+typedef enum zxdh_dtb_table_info_e {<br />+    ZXDH_DTB_TABLE_DDR           = 0,<br />+    ZXDH_DTB_TABLE_ERAM_1        = 1,<br />+    ZXDH_DTB_TABLE_ERAM_64       = 2,<br />+    ZXDH_DTB_TABLE_ERAM_128      = 3,<br />+    ZXDH_DTB_TABLE_ZCAM          = 4,<br />+    ZXDH_DTB_TABLE_ETCAM         = 5,<br />+    ZXDH_DTB_TABLE_MC_HASH       = 6,<br />+    ZXDH_DTB_TABLE_ENUM_MAX<br />+} ZXDH_DTB_TABLE_INFO_E;<br />+<br />+typedef enum zxdh_sdt_table_type_e {<br />+    ZXDH_SDT_TBLT_INVALID = 0,<br />+    ZXDH_SDT_TBLT_ERAM    = 1,<br />+    ZXDH_SDT_TBLT_DDR3    = 2,<br />+    ZXDH_SDT_TBLT_HASH    = 3,<br />+    ZXDH_SDT_TBLT_LPM     = 4,<br />+    ZXDH_SDT_TBLT_ETCAM   = 5,<br />+    ZXDH_SDT_TBLT_PORTTBL = 6,<br />+    ZXDH_SDT_TBLT_MAX     = 7,<br />+} ZXDH_SDT_TABLE_TYPE_E;<br />+<br />+typedef struct zxdh_dtb_lpm_entry_t {<br />+    uint32_t dtb_len0;<br />+    uint8_t *p_data_buff0;<br />+    uint32_t dtb_len1;<br />+    uint8_t *p_data_buff1;<br />+} ZXDH_DTB_LPM_ENTRY_T;<br />+<br />+typedef struct zxdh_dtb_entry_t {<br />+    uint8_t *cmd;<br />+    uint8_t *data;<br />+    uint32_t data_in_cmd_flag;<br />+    uint32_t data_size;<br />+} ZXDH_DTB_ENTRY_T;<br />+<br />+typedef struct zxdh_dtb_eram_table_form_t {<br />+    uint32_t valid;<br />+    uint32_t type_mode;<br />+    uint32_t data_mode;<br />+    uint32_t cpu_wr;<br />+    uint32_t cpu_rd;<br />+    uint32_t cpu_rd_mode;<br />+    uint32_t addr;<br />+    uint32_t data_h;<br />+    uint32_t data_l;<br />+} ZXDH_DTB_ERAM_TABLE_FORM_T;<br />+<br />+typedef struct zxdh_sdt_tbl_eram_t {<br />+    uint32_t table_type;<br />+    uint32_t eram_mode;<br />+    uint32_t eram_base_addr;<br />+    uint32_t eram_table_depth;<br />+    uint32_t eram_clutch_en;<br />+} ZXDH_SDTTBL_ERAM_T;<br />+<br />+typedef union zxdh_endian_u {<br />+    unsigned int     a;<br />+    unsigned char    b;<br />+} ZXDH_ENDIAN_U;<br />+<br />+typedef struct zxdh_dtb_field_t {<br />+    const char    *p_name;<br />+    uint16_t  lsb_pos;<br />+    uint16_t  len;<br />+} ZXDH_DTB_FIELD_T;<br />+<br />+typedef struct zxdh_dtb_table_t {<br />+    const char    *table_type;<br />+    uint32_t  table_no;<br />+    uint32_t  field_num;<br />+    ZXDH_DTB_FIELD_T *p_fields;<br />+} ZXDH_DTB_TABLE_T;<br />+<br />+typedef struct zxdh_dtb_queue_item_info_t {<br />+    uint32_t cmd_vld;<br />+    uint32_t cmd_type;<br />+    uint32_t int_en;<br />+    uint32_t data_len;<br />+    uint32_t data_laddr;<br />+    uint32_t data_hddr;<br />+} ZXDH_DTB_QUEUE_ITEM_INFO_T;<br />+<br />+typedef struct zxdh_dtb_queue_len_t {<br />+    uint32_t cfg_dtb_cmd_type;<br />+    uint32_t cfg_dtb_cmd_int_en;<br />+    uint32_t cfg_queue_dtb_len;<br />+} ZXDH_DTB_QUEUE_LEN_T;<br />+<br />+typedef struct zxdh_dtb_eram_entry_info_t {<br />+    uint32_t index;<br />+    uint32_t *p_data;<br />+} ZXDH_DTB_ERAM_ENTRY_INFO_T;<br />+<br />+typedef struct zxdh_dtb_user_entry_t {<br />+    uint32_t sdt_no;<br />+    void *p_entry_data;<br />+} ZXDH_DTB_USER_ENTRY_T;<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 />+            uint32_t entrynum, ZXDH_DTB_USER_ENTRY_T *down_entries);<br />  <br /> #endif /* ZXDH_NP_H */<br />diff --git a/drivers/net/zxdh/zxdh_pci.h b/drivers/net/zxdh/zxdh_pci.h<br />index c635b19161..8b9ab649a8 100644<br />--- a/drivers/net/zxdh/zxdh_pci.h<br />+++ b/drivers/net/zxdh/zxdh_pci.h<br />@@ -12,6 +12,8 @@<br />  <br /> #include "zxdh_ethdev.h" <br />  <br />+#define ZXDH_PF_PCIE_ID(pcie_id)  (((pcie_id) & 0xff00) | 1 << 11)<br />+<br /> enum zxdh_msix_status {<br />     ZXDH_MSIX_NONE     = 0,<br />     ZXDH_MSIX_DISABLED = 1,<br />diff --git a/drivers/net/zxdh/zxdh_tables.c b/drivers/net/zxdh/zxdh_tables.c<br />new file mode 100644<br />index 0000000000..91376e6ec0<br />--- /dev/null<br />+++ b/drivers/net/zxdh/zxdh_tables.c<br />@@ -0,0 +1,105 @@<br />+/* SPDX-License-Identifier: BSD-3-Clause<br />+ * Copyright(c) 2024 ZTE Corporation<br />+ */<br />+<br />+#include "zxdh_ethdev.h" <br />+#include "zxdh_msg.h" <br />+#include "zxdh_np.h" <br />+#include "zxdh_tables.h" <br />+#include "zxdh_logs.h" <br />+<br />+#define ZXDH_SDT_VPORT_ATT_TABLE          1<br />+#define ZXDH_SDT_PANEL_ATT_TABLE          2<br />+<br />+int zxdh_set_port_attr(uint16_t vfid, struct zxdh_port_attr_table *port_attr)<br />+{<br />+    int ret = 0;<br />+<br />+    ZXDH_DTB_ERAM_ENTRY_INFO_T entry = {vfid, (uint32_t *)port_attr};<br />+    ZXDH_DTB_USER_ENTRY_T user_entry_write = {ZXDH_SDT_VPORT_ATT_TABLE, (void *)&entry};<br />+<br />+    ret = zxdh_np_dtb_table_entry_write(ZXDH_DEVICE_NO,<br />+                g_dtb_data.queueid, 1, &user_entry_write);<br />+    if (ret != 0)<br />+        PMD_DRV_LOG(ERR, "write vport_att failed vfid:%d failed", vfid);<br />+<br />+    return ret;<br />+}<br />+<br />+int<br />+zxdh_port_attr_init(struct rte_eth_dev *dev)<br />+{<br />+    struct zxdh_hw *hw = dev->data->dev_private;<br />+    struct zxdh_port_attr_table port_attr = {0};<br />+    struct zxdh_msg_info msg_info = {0};<br />+    int ret;<br />+<br />+    if (hw->is_pf) {<br />+        port_attr.hit_flag = 1;<br />+        port_attr.phy_port = hw->phyport;<br />+        port_attr.pf_vfid = zxdh_vport_to_vfid(hw->vport);<br />+        port_attr.rss_enable = 0;<br />+        if (!hw->is_pf)<br />+            port_attr.is_vf = 1;<br />+<br />+        port_attr.mtu = dev->data->mtu;<br />+        port_attr.mtu_enable = 1;<br />+        port_attr.is_up = 0;<br />+        if (!port_attr.rss_enable)<br />+            port_attr.port_base_qid = 0;<br />+<br />+        ret = zxdh_set_port_attr(hw->vfid, &port_attr);<br />+        if (ret) {<br />+            PMD_DRV_LOG(ERR, "write port_attr failed");<br />+            ret = -1;<br />+        }<br />+    } else {<br />+        struct zxdh_vf_init_msg *vf_init_msg = &msg_info.data.vf_init_msg;<br />+<br />+        zxdh_msg_head_build(hw, ZXDH_VF_PORT_INIT, &msg_info);<br />+        msg_info.msg_head.msg_type = ZXDH_VF_PORT_INIT;<br />+        vf_init_msg->link_up = 1;<br />+        vf_init_msg->base_qid = 0;<br />+        vf_init_msg->rss_enable = 0;<br />+        ret = zxdh_vf_send_msg_to_pf(dev, &msg_info, sizeof(msg_info), NULL, 0);<br />+        if (ret) {<br />+            PMD_DRV_LOG(ERR, "vf port_init failed");<br />+            ret = -1;<br />+        }<br />+    }<br />+    return ret;<br />+};<br />+<br />+int zxdh_panel_table_init(struct rte_eth_dev *dev)<br />+{<br />+    struct zxdh_hw *hw = dev->data->dev_private;<br />+    int ret;<br />+<br />+    if (!hw->is_pf)<br />+        return 0;<br />+<br />+    struct zxdh_panel_table panel;<br />+<br />+    memset(&panel, 0, sizeof(panel));<br />+    panel.hit_flag = 1;<br />+    panel.pf_vfid = zxdh_vport_to_vfid(hw->vport);<br />+    panel.mtu_enable = 1;<br />+    panel.mtu = dev->data->mtu;<br />+<br />+    ZXDH_DTB_ERAM_ENTRY_INFO_T panel_entry = {<br />+        .index = hw->phyport,<br />+        .p_data = (uint32_t *)&panel<br />+    };<br />+    ZXDH_DTB_USER_ENTRY_T entry = {<br />+        .sdt_no = ZXDH_SDT_PANEL_ATT_TABLE,<br />+        .p_entry_data = (void *)&panel_entry<br />+    };<br />+    ret = zxdh_np_dtb_table_entry_write(ZXDH_DEVICE_NO, g_dtb_data.queueid, 1, &entry);<br />+<br />+    if (ret) {<br />+        PMD_DRV_LOG(ERR, "Insert eram-panel failed, code:%u", ret);<br />+        ret = -1;<br />+    }<br />+<br />+    return ret;<br />+}<br />diff --git a/drivers/net/zxdh/zxdh_tables.h b/drivers/net/zxdh/zxdh_tables.h<br />new file mode 100644<br />index 0000000000..5d34af2f05<br />--- /dev/null<br />+++ b/drivers/net/zxdh/zxdh_tables.h<br />@@ -0,0 +1,148 @@<br />+/* SPDX-License-Identifier: BSD-3-Clause<br />+ * Copyright(c) 2024 ZTE Corporation<br />+ */<br />+<br />+#ifndef ZXDH_TABLES_H<br />+#define ZXDH_TABLES_H<br />+<br />+#include <stdint.h> <br />+<br />+extern struct zxdh_dtb_shared_data g_dtb_data;<br />+<br />+#define ZXDH_DEVICE_NO                    0<br />+<br />+struct zxdh_port_attr_table {<br />+#if RTE_BYTE_ORDER == RTE_LITTLE_ENDIAN<br />+    uint8_t byte4_rsv1: 1;<br />+    uint8_t ingress_meter_enable: 1;<br />+    uint8_t egress_meter_enable: 1;<br />+    uint8_t byte4_rsv2: 2;<br />+    uint8_t fd_enable: 1;<br />+    uint8_t vepa_enable: 1;<br />+    uint8_t spoof_check_enable: 1;<br />+<br />+    uint8_t inline_sec_offload: 1;<br />+    uint8_t ovs_enable: 1;<br />+    uint8_t lag_enable: 1;<br />+    uint8_t is_passthrough: 1;<br />+    uint8_t is_vf: 1;<br />+    uint8_t virtion_version: 2;<br />+    uint8_t virtio_enable: 1;<br />+<br />+    uint8_t accelerator_offload_flag: 1;<br />+    uint8_t lro_offload: 1;<br />+    uint8_t ip_fragment_offload: 1;<br />+    uint8_t tcp_udp_checksum_offload: 1;<br />+    uint8_t ip_checksum_offload: 1;<br />+    uint8_t outer_ip_checksum_offload: 1;<br />+    uint8_t is_up: 1;<br />+    uint8_t rsv1: 1;<br />+<br />+    uint8_t rsv3 : 1;<br />+    uint8_t rdma_offload_enable: 1;<br />+    uint8_t vlan_filter_enable: 1;<br />+    uint8_t vlan_strip_offload: 1;<br />+    uint8_t qinq_valn_strip_offload: 1;<br />+    uint8_t rss_enable: 1;<br />+    uint8_t mtu_enable: 1;<br />+    uint8_t hit_flag: 1;<br />+<br />+    uint16_t mtu;<br />+<br />+    uint16_t port_base_qid : 12;<br />+    uint16_t hash_search_index : 3;<br />+    uint16_t rsv: 1;<br />+<br />+    uint8_t rss_hash_factor;<br />+<br />+    uint8_t hash_alg: 4;<br />+    uint8_t phy_port: 4;<br />+<br />+    uint16_t lag_id : 3;<br />+    uint16_t pf_vfid : 11;<br />+    uint16_t ingress_tm_enable : 1;<br />+    uint16_t egress_tm_enable : 1;<br />+<br />+    uint16_t tpid;<br />+<br />+    uint16_t vhca : 10;<br />+    uint16_t uplink_port : 6;<br />+#else<br />+    uint8_t rsv3 : 1;<br />+    uint8_t rdma_offload_enable: 1;<br />+    uint8_t vlan_filter_enable: 1;<br />+    uint8_t vlan_strip_offload: 1;<br />+    uint8_t qinq_valn_strip_offload: 1;<br />+    uint8_t rss_enable: 1;<br />+    uint8_t mtu_enable: 1;<br />+    uint8_t hit_flag: 1;<br />+<br />+    uint8_t accelerator_offload_flag: 1;<br />+    uint8_t lro_offload: 1;<br />+    uint8_t ip_fragment_offload: 1;<br />+    uint8_t tcp_udp_checksum_offload: 1;<br />+    uint8_t ip_checksum_offload: 1;<br />+    uint8_t outer_ip_checksum_offload: 1;<br />+    uint8_t is_up: 1;<br />+    uint8_t rsv1: 1;<br />+<br />+    uint8_t inline_sec_offload: 1;<br />+    uint8_t ovs_enable: 1;<br />+    uint8_t lag_enable: 1;<br />+    uint8_t is_passthrough: 1;<br />+    uint8_t is_vf: 1;<br />+    uint8_t virtion_version: 2;<br />+    uint8_t virtio_enable: 1;<br />+<br />+    uint8_t byte4_rsv1: 1;<br />+    uint8_t ingress_meter_enable: 1;<br />+    uint8_t egress_meter_enable: 1;<br />+    uint8_t byte4_rsv2: 2;<br />+    uint8_t fd_enable: 1;<br />+    uint8_t vepa_enable: 1;<br />+    uint8_t spoof_check_enable: 1;<br />+<br />+    uint16_t port_base_qid : 12;<br />+    uint16_t hash_search_index : 3;<br />+    uint16_t rsv: 1;<br />+<br />+    uint16_t mtu;<br />+<br />+    uint16_t lag_id : 3;<br />+    uint16_t pf_vfid : 11;<br />+    uint16_t ingress_tm_enable : 1;<br />+    uint16_t egress_tm_enable : 1;<br />+<br />+    uint8_t hash_alg: 4;<br />+    uint8_t phy_port: 4;<br />+<br />+    uint8_t rss_hash_factor;<br />+<br />+    uint16_t tpid;<br />+<br />+    uint16_t vhca : 10;<br />+    uint16_t uplink_port : 6;<br />+#endif<br />+};<br />+<br />+struct zxdh_panel_table {<br />+    uint16_t port_vfid_1588 : 11,<br />+             rsv2           : 5;<br />+    uint16_t pf_vfid        : 11,<br />+             rsv1           : 1,<br />+             enable_1588_tc : 2,<br />+             trust_mode     : 1,<br />+             hit_flag       : 1;<br />+    uint32_t mtu            : 16,<br />+             mtu_enable     : 1,<br />+             rsv            : 3,<br />+             tm_base_queue  : 12;<br />+    uint32_t rsv_1;<br />+    uint32_t rsv_2;<br />+}; /* 16B */<br />+<br />+int zxdh_port_attr_init(struct rte_eth_dev *dev);<br />+int zxdh_panel_table_init(struct rte_eth_dev *dev);<br />+int zxdh_set_port_attr(uint16_t vfid, struct zxdh_port_attr_table *port_attr);<br />+<br />+#endif /* ZXDH_TABLES_H */<br />--  <br />2.27.0<br />