provided msg(pfvf) intr callback for<br />support pf/vf in usermode.<br /> <br />Signed-off-by: Junlong Wang <wang.junlong1@zte.com.cn> <br />---<br /> drivers/net/zxdh/zxdh_ethdev.c |   1 +<br /> drivers/net/zxdh/zxdh_msg.c    | 186 +++++++++++++++++++++++++++++++--<br /> drivers/net/zxdh/zxdh_msg.h    |   9 ++<br /> drivers/net/zxdh/zxdh_tables.c |  17 +++<br /> drivers/net/zxdh/zxdh_tables.h |   2 +<br /> 5 files changed, 207 insertions(+), 8 deletions(-)<br /> <br />diff --git a/drivers/net/zxdh/zxdh_ethdev.c b/drivers/net/zxdh/zxdh_ethdev.c<br />index 255d4b5b79..6ac8df4b0d 100644<br />--- a/drivers/net/zxdh/zxdh_ethdev.c<br />+++ b/drivers/net/zxdh/zxdh_ethdev.c<br />@@ -1666,6 +1666,7 @@ zxdh_eth_dev_init(struct rte_eth_dev *eth_dev)<br />         goto err_zxdh_init;<br />  <br />     zxdh_queue_res_get(eth_dev);<br />+    zxdh_msg_cb_reg(hw);<br />     ret = zxdh_configure_intr(eth_dev);<br />     if (ret != 0)<br />         goto err_zxdh_init;<br />diff --git a/drivers/net/zxdh/zxdh_msg.c b/drivers/net/zxdh/zxdh_msg.c<br />index 32994b719f..c109a3601d 100644<br />--- a/drivers/net/zxdh/zxdh_msg.c<br />+++ b/drivers/net/zxdh/zxdh_msg.c<br />@@ -15,6 +15,7 @@<br /> #include "zxdh_logs.h" <br /> #include "zxdh_msg.h" <br /> #include "zxdh_pci.h" <br />+#include "zxdh_tables.h" <br />  <br /> #define ZXDH_REPS_INFO_FLAG_USABLE  0x00<br /> #define ZXDH_BAR_SEQID_NUM_MAX      256<br />@@ -145,7 +146,7 @@ static struct zxdh_seqid_ring g_seqid_ring;<br /> static uint8_t tmp_msg_header[ZXDH_BAR_MSG_ADDR_CHAN_INTERVAL];<br /> static rte_spinlock_t chan_lock;<br />  <br />-zxdh_bar_chan_msg_recv_callback msg_recv_func_tbl[ZXDH_BAR_MSG_MODULE_NUM];<br />+zxdh_bar_chan_msg_recv_callback zxdh_msg_recv_func_tbl[ZXDH_BAR_MSG_MODULE_NUM];<br />  <br /> static inline const char<br /> *zxdh_module_id_name(int val)<br />@@ -923,7 +924,7 @@ zxdh_bar_msg_sync_msg_proc(uint64_t reply_addr,<br />     if (reps_buffer == NULL)<br />         return;<br />  <br />-    zxdh_bar_chan_msg_recv_callback recv_func = msg_recv_func_tbl[msg_header->module_id];<br />+    zxdh_bar_chan_msg_recv_callback recv_func = zxdh_msg_recv_func_tbl[msg_header->module_id];<br />  <br />     recv_func(receiver_buff, msg_header->len, reps_buffer, &reps_len, dev);<br />     msg_header->ack = ZXDH_BAR_CHAN_MSG_ACK;<br />@@ -982,7 +983,7 @@ zxdh_bar_chan_msg_header_check(struct zxdh_bar_msg_header *msg_header)<br />         PMD_MSG_LOG(ERR, "recv header ERR: invalid mesg len: %u", len);<br />         return ZXDH_BAR_MSG_ERR_LEN;<br />     }<br />-    if (msg_recv_func_tbl[msg_header->module_id] == NULL) {<br />+    if (zxdh_msg_recv_func_tbl[msg_header->module_id] == NULL) {<br />         PMD_MSG_LOG(ERR, "recv header ERR: module:%s(%u) doesn't register",<br />                 zxdh_module_id_name(module_id), module_id);<br />         return ZXDH_BAR_MSG_ERR_MODULE_NOEXIST;<br />@@ -1038,7 +1039,8 @@ zxdh_bar_irq_recv(uint8_t src, uint8_t dst, uint64_t virt_addr, void *dev)<br />     return ZXDH_BAR_MSG_OK;<br /> }<br />  <br />-int zxdh_get_bar_offset(struct zxdh_bar_offset_params *paras,<br />+int<br />+zxdh_get_bar_offset(struct zxdh_bar_offset_params *paras,<br />         struct zxdh_bar_offset_res *res)<br /> {<br />     uint16_t check_token;<br />@@ -1082,7 +1084,8 @@ int zxdh_get_bar_offset(struct zxdh_bar_offset_params *paras,<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 />+int<br />+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 />@@ -1134,7 +1137,8 @@ int zxdh_vf_send_msg_to_pf(struct rte_eth_dev *dev,  void *msg_req,<br />     return 0;<br /> }<br />  <br />-int32_t zxdh_send_msg_to_riscv(struct rte_eth_dev *dev, void *msg_req,<br />+int32_t<br />+zxdh_send_msg_to_riscv(struct rte_eth_dev *dev, void *msg_req,<br />             uint16_t msg_req_len, void *reply, uint16_t reply_len,<br />             enum ZXDH_BAR_MODULE_ID module_id)<br /> {<br />@@ -1182,7 +1186,8 @@ int32_t zxdh_send_msg_to_riscv(struct rte_eth_dev *dev, void *msg_req,<br />     return 0;<br /> }<br />  <br />-void zxdh_msg_head_build(struct zxdh_hw *hw, enum zxdh_msg_type type,<br />+void<br />+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 />@@ -1193,7 +1198,8 @@ void zxdh_msg_head_build(struct zxdh_hw *hw, enum zxdh_msg_type type,<br />     msghead->pcieid   = hw->pcie_id;<br /> }<br />  <br />-void zxdh_agent_msg_build(struct zxdh_hw *hw, enum zxdh_agent_msg_type type,<br />+void<br />+zxdh_agent_msg_build(struct zxdh_hw *hw, enum zxdh_agent_msg_type type,<br />         struct zxdh_msg_info *msg_info)<br /> {<br />     struct zxdh_agent_msg_head *agent_head = &msg_info->agent_msg_head;<br />@@ -1204,3 +1210,167 @@ void zxdh_agent_msg_build(struct zxdh_hw *hw, enum zxdh_agent_msg_type type,<br />     agent_head->vf_id = hw->vfid;<br />     agent_head->pcie_id = hw->pcie_id;<br /> }<br />+<br />+static int<br />+zxdh_bar_chan_msg_recv_register(uint8_t module_id, zxdh_bar_chan_msg_recv_callback callback)<br />+{<br />+    if (module_id >= (uint16_t)ZXDH_BAR_MSG_MODULE_NUM) {<br />+        PMD_MSG_LOG(ERR, "register ERR: invalid module_id: %u.", module_id);<br />+        return ZXDH_BAR_MSG_ERR_MODULE;<br />+    }<br />+    if (callback == NULL) {<br />+        PMD_MSG_LOG(ERR, "register %s(%u) error: null callback.",<br />+                    zxdh_module_id_name(module_id), module_id);<br />+        return ZXDH_BAR_MEG_ERR_NULL_FUNC;<br />+    }<br />+    if (zxdh_msg_recv_func_tbl[module_id] != NULL) {<br />+        PMD_MSG_LOG(DEBUG, "register warning, event:%s(%u) already be registered.",<br />+                    zxdh_module_id_name(module_id), module_id);<br />+        return ZXDH_BAR_MSG_ERR_REPEAT_REGISTER;<br />+    }<br />+    zxdh_msg_recv_func_tbl[module_id] = callback;<br />+    return ZXDH_BAR_MSG_OK;<br />+}<br />+<br />+static int<br />+zxdh_vf_port_init(struct zxdh_hw *pf_hw, uint16_t vport, void *cfg_data,<br />+        struct zxdh_msg_reply_body *res_info __rte_unused,<br />+        uint16_t *res_len __rte_unused)<br />+{<br />+    struct zxdh_port_attr_table port_attr = {0};<br />+    union zxdh_virport_num port = {.vport = vport};<br />+    struct zxdh_vf_init_msg *vf_init_msg = (struct zxdh_vf_init_msg *)cfg_data;<br />+    int ret = 0;<br />+<br />+    RTE_ASSERT(!cfg_data || !pf_hw || !res_info || !res_len);<br />+    *res_len = ZXDH_MSG_REPLYBODY_HEAD;<br />+    port_attr.hit_flag = 1;<br />+    port_attr.is_vf = 1;<br />+    port_attr.phy_port = pf_hw->phyport;<br />+    port_attr.is_up = 1;<br />+    port_attr.rss_enable = 0;<br />+    port_attr.pf_vfid = pf_hw->vfid;<br />+    port_attr.hash_search_index = pf_hw->hash_search_index;<br />+    port_attr.port_base_qid = vf_init_msg->base_qid;<br />+    uint16_t vfid = zxdh_vport_to_vfid(port);<br />+<br />+    ret = zxdh_set_port_attr(pf_hw, vfid, &port_attr);<br />+    if (ret) {<br />+        PMD_DRV_LOG(ERR, "set vport attr failed, code:%d", ret);<br />+        goto proc_end;<br />+    }<br />+<br />+    res_info->flag = ZXDH_REPS_SUCC;<br />+    *res_len = sizeof(res_info->flag);<br />+<br />+    return ret;<br />+proc_end:<br />+    *res_len = sizeof(res_info->flag);<br />+    res_info->flag = ZXDH_REPS_FAIL;<br />+    return ret;<br />+}<br />+<br />+static int<br />+zxdh_vf_port_uninit(struct zxdh_hw *pf_hw,<br />+        uint16_t vport, void *cfg_data __rte_unused,<br />+        struct zxdh_msg_reply_body *res_info __rte_unused,<br />+        uint16_t *res_len __rte_unused)<br />+{<br />+    char str[ZXDH_MSG_REPLY_BODY_MAX_LEN] = "uninit";<br />+    struct zxdh_port_attr_table port_attr = {0};<br />+    int ret = 0;<br />+<br />+    *res_len =  ZXDH_MSG_REPLYBODY_HEAD;<br />+    RTE_ASSERT(!cfg_data || !pf_hw || !res_info || !res_len);<br />+<br />+    ret = zxdh_delete_port_attr(pf_hw, vport, &port_attr);<br />+    if (ret) {<br />+        PMD_DRV_LOG(ERR, "write port_attr_eram failed, code:%d", ret);<br />+        goto proc_end;<br />+    }<br />+<br />+    *res_len += strlen(str);<br />+    rte_memcpy(&res_info->reply_data, str, strlen(str) + 1);<br />+    res_info->flag = ZXDH_REPS_SUCC;<br />+    return ret;<br />+<br />+proc_end:<br />+    *res_len += strlen(str);<br />+    rte_memcpy(&res_info->reply_data, str, strlen(str) + 1);<br />+    res_info->flag = ZXDH_REPS_FAIL;<br />+    return ret;<br />+}<br />+<br />+zxdh_msg_process_callback zxdh_proc_cb[] = {<br />+    [ZXDH_NULL] = NULL,<br />+    [ZXDH_VF_PORT_INIT] = zxdh_vf_port_init,<br />+    [ZXDH_VF_PORT_UNINIT] = zxdh_vf_port_uninit,<br />+};<br />+<br />+static inline int<br />+zxdh_config_process_callback(struct zxdh_hw *hw, struct zxdh_msg_info *msg_info,<br />+    struct zxdh_msg_reply_body *res, uint16_t *res_len)<br />+{<br />+    struct zxdh_msg_head *msghead = &msg_info->msg_head;<br />+    int ret = -1;<br />+<br />+    if (!res || !res_len) {<br />+        PMD_DRV_LOG(ERR, " invalid param");<br />+        return -1;<br />+    }<br />+    if (zxdh_proc_cb[msghead->msg_type]) {<br />+        ret = zxdh_proc_cb[msghead->msg_type](hw, msghead->vport,<br />+                    (void *)&msg_info->data, res, res_len);<br />+        if (!ret)<br />+            res->flag = ZXDH_REPS_SUCC;<br />+        else<br />+            res->flag = ZXDH_REPS_FAIL;<br />+    } else {<br />+        res->flag = ZXDH_REPS_INVALID;<br />+    }<br />+    *res_len += sizeof(res->flag);<br />+    return ret;<br />+}<br />+<br />+static int<br />+pf_recv_bar_msg(void *pay_load, uint16_t len, void *reps_buffer,<br />+    uint16_t *reps_len, void *eth_dev __rte_unused)<br />+{<br />+    struct zxdh_msg_info *msg_info = (struct zxdh_msg_info *)pay_load;<br />+    struct zxdh_msg_reply_body *reply_body = reps_buffer;<br />+    struct rte_eth_dev *dev = (struct rte_eth_dev *)eth_dev;<br />+    int32_t ret = 0;<br />+    struct zxdh_hw *hw;<br />+    uint16_t reply_len = 0;<br />+<br />+    if (eth_dev == NULL) {<br />+        PMD_DRV_LOG(ERR, "param invalid, dev is null.");<br />+        ret = -2;<br />+        goto msg_proc_end;<br />+    }<br />+    hw = dev->data->dev_private;<br />+<br />+    if (msg_info->msg_head.msg_type >= ZXDH_MSG_TYPE_END) {<br />+        PMD_DRV_LOG(ERR, "len %u msg_type %d unsupported",<br />+            len, msg_info->msg_head.msg_type);<br />+        ret = -2;<br />+        goto msg_proc_end;<br />+    }<br />+<br />+    ret = zxdh_config_process_callback(hw, msg_info, reply_body, &reply_len);<br />+    *reps_len = reply_len + sizeof(struct zxdh_msg_reply_head);<br />+    return ret;<br />+<br />+msg_proc_end:<br />+    memcpy(reply_body->reply_data, &ret, sizeof(ret));<br />+    reply_len = sizeof(ret);<br />+    *reps_len = sizeof(struct zxdh_msg_reply_head) + reply_len;<br />+    return ret;<br />+}<br />+<br />+void<br />+zxdh_msg_cb_reg(struct zxdh_hw *hw)<br />+{<br />+    if (hw->is_pf)<br />+        zxdh_bar_chan_msg_recv_register(ZXDH_MODULE_BAR_MSG_TO_PF, pf_recv_bar_msg);<br />+}<br />diff --git a/drivers/net/zxdh/zxdh_msg.h b/drivers/net/zxdh/zxdh_msg.h<br />index 6f657da434..afe0474ebc 100644<br />--- a/drivers/net/zxdh/zxdh_msg.h<br />+++ b/drivers/net/zxdh/zxdh_msg.h<br />@@ -310,6 +310,7 @@ struct __rte_packed_begin zxdh_msg_reply_head {<br /> enum zxdh_reps_flag {<br />     ZXDH_REPS_FAIL,<br />     ZXDH_REPS_SUCC = 0xaa,<br />+    ZXDH_REPS_INVALID = 0xee,<br /> };<br />  <br /> struct __rte_packed_begin zxdh_link_info_msg {<br />@@ -428,6 +429,13 @@ struct __rte_packed_begin zxdh_msg_info {<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 />+typedef int (*zxdh_msg_process_callback)(struct zxdh_hw *hw, uint16_t vport, void *cfg_data,<br />+    struct zxdh_msg_reply_body *res_info, uint16_t *res_len);<br />+extern zxdh_msg_process_callback zxdh_proc_cb[];<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 />+extern zxdh_bar_chan_msg_recv_callback zxdh_msg_recv_func_tbl[ZXDH_BAR_MSG_MODULE_NUM];<br />  <br /> int zxdh_get_bar_offset(struct zxdh_bar_offset_params *paras, struct zxdh_bar_offset_res *res);<br /> int zxdh_msg_chan_init(void);<br />@@ -448,5 +456,6 @@ void zxdh_agent_msg_build(struct zxdh_hw *hw, enum zxdh_agent_msg_type type,<br /> int32_t zxdh_send_msg_to_riscv(struct rte_eth_dev *dev, void *msg_req,<br />             uint16_t msg_req_len, void *reply, uint16_t reply_len,<br />             enum ZXDH_BAR_MODULE_ID module_id);<br />+void zxdh_msg_cb_reg(struct zxdh_hw *hw);<br />  <br /> #endif /* ZXDH_MSG_H */<br />diff --git a/drivers/net/zxdh/zxdh_tables.c b/drivers/net/zxdh/zxdh_tables.c<br />index f169eca575..a5d598d022 100644<br />--- a/drivers/net/zxdh/zxdh_tables.c<br />+++ b/drivers/net/zxdh/zxdh_tables.c<br />@@ -214,6 +214,23 @@ zxdh_get_port_attr(struct zxdh_hw *hw, uint16_t vport, struct zxdh_port_attr_tab<br />     return ret;<br /> }<br />  <br />+int<br />+zxdh_delete_port_attr(struct zxdh_hw *hw, uint16_t vport,<br />+        struct zxdh_port_attr_table *port_attr)<br />+{<br />+    struct zxdh_dtb_shared_data *dtb_data = &hw->dev_sd->dtb_sd;<br />+    union zxdh_virport_num vport_num = (union zxdh_virport_num)vport;<br />+    ZXDH_DTB_ERAM_ENTRY_INFO_T entry = {vport_num.vfid, (uint32_t *)port_attr};<br />+    ZXDH_DTB_USER_ENTRY_T user_entry = {<br />+        .sdt_no = ZXDH_SDT_VPORT_ATT_TABLE,<br />+        .p_entry_data = (void *)&entry<br />+    };<br />+    int ret = zxdh_np_dtb_table_entry_delete(hw->slot_id, dtb_data->queueid, 1, &user_entry);<br />+    if (ret != 0)<br />+        PMD_DRV_LOG(ERR, "delete port attr failed, vfid:%u", vport_num.vfid);<br />+    return ret;<br />+}<br />+<br /> int<br /> zxdh_set_mac_table(struct zxdh_hw *hw, uint16_t vport,<br />         struct rte_ether_addr *addr, uint8_t hash_search_idx)<br />diff --git a/drivers/net/zxdh/zxdh_tables.h b/drivers/net/zxdh/zxdh_tables.h<br />index d800faee3e..f668dad434 100644<br />--- a/drivers/net/zxdh/zxdh_tables.h<br />+++ b/drivers/net/zxdh/zxdh_tables.h<br />@@ -216,6 +216,8 @@ int zxdh_set_port_attr(struct zxdh_hw *hw, uint16_t vport,<br /> int zxdh_port_attr_uninit(struct rte_eth_dev *dev);<br /> int zxdh_get_port_attr(struct zxdh_hw *hw, uint16_t vport,<br />         struct zxdh_port_attr_table *port_attr);<br />+int zxdh_delete_port_attr(struct zxdh_hw *hw, uint16_t vport,<br />+        struct zxdh_port_attr_table *port_attr);<br /> int zxdh_set_mac_table(struct zxdh_hw *hw, uint16_t vport,<br />         struct rte_ether_addr *addr,  uint8_t hash_search_idx);<br /> int zxdh_del_mac_table(struct zxdh_hw *hw, uint16_t vport,<br />--  <br />2.27.0<br />