Add agent channel to access (np)network processor registers<br />that are not mapped by PCIE.<br /> <br />Signed-off-by: Bingbin Chen <chen.bingbin@zte.com.cn> <br />---<br /> drivers/net/zxdh/zxdh_np.c | 449 +++++++++++++++++++++++++++++++------<br /> drivers/net/zxdh/zxdh_np.h |  63 +++++-<br /> 2 files changed, 442 insertions(+), 70 deletions(-)<br /> <br />diff --git a/drivers/net/zxdh/zxdh_np.c b/drivers/net/zxdh/zxdh_np.c<br />index 5ed78fde82..8113332310 100644<br />--- a/drivers/net/zxdh/zxdh_np.c<br />+++ b/drivers/net/zxdh/zxdh_np.c<br />@@ -394,6 +394,70 @@ zxdh_np_dev_init(void)<br />     return 0;<br /> }<br />  <br />+static void<br />+zxdh_np_dev_vport_get(uint32_t dev_id, uint32_t *vport)<br />+{<br />+    ZXDH_DEV_MGR_T *p_dev_mgr = &g_dev_mgr;<br />+    ZXDH_DEV_CFG_T *p_dev_info = p_dev_mgr->p_dev_array[dev_id];<br />+<br />+    *vport = p_dev_info->vport;<br />+}<br />+<br />+static void<br />+zxdh_np_dev_agent_addr_get(uint32_t dev_id, uint64_t *agent_addr)<br />+{<br />+    ZXDH_DEV_MGR_T *p_dev_mgr = &g_dev_mgr;<br />+    ZXDH_DEV_CFG_T *p_dev_info = p_dev_mgr->p_dev_array[dev_id];<br />+<br />+    *agent_addr = p_dev_info->agent_addr;<br />+}<br />+<br />+static void<br />+zxdh_np_dev_fw_bar_msg_num_set(uint32_t dev_id, uint32_t bar_msg_num)<br />+{<br />+    ZXDH_DEV_MGR_T *p_dev_mgr = &g_dev_mgr;<br />+    ZXDH_DEV_CFG_T *p_dev_info = p_dev_mgr->p_dev_array[dev_id];<br />+<br />+    p_dev_info->fw_bar_msg_num = bar_msg_num;<br />+<br />+    PMD_DRV_LOG(INFO, "fw_bar_msg_num_set:fw support agent msg num = %u!", bar_msg_num);<br />+}<br />+<br />+static void<br />+zxdh_np_dev_fw_bar_msg_num_get(uint32_t dev_id, uint32_t *bar_msg_num)<br />+{<br />+    ZXDH_DEV_MGR_T *p_dev_mgr = &g_dev_mgr;<br />+    ZXDH_DEV_CFG_T *p_dev_info = p_dev_mgr->p_dev_array[dev_id];<br />+<br />+    *bar_msg_num = p_dev_info->fw_bar_msg_num;<br />+}<br />+<br />+static uint32_t<br />+zxdh_np_dev_opr_spinlock_get(uint32_t dev_id, uint32_t type, ZXDH_SPINLOCK_T **p_spinlock_out)<br />+{<br />+    ZXDH_DEV_MGR_T *p_dev_mgr = &g_dev_mgr;<br />+    ZXDH_DEV_CFG_T *p_dev_info = p_dev_mgr->p_dev_array[dev_id];<br />+<br />+    if (p_dev_info == NULL) {<br />+        PMD_DRV_LOG(ERR, "Get dev_info[ %d ] fail!", dev_id);<br />+        return ZXDH_DEV_TYPE_INVALID;<br />+    }<br />+<br />+    switch (type) {<br />+    case ZXDH_DEV_SPINLOCK_T_DTB:<br />+        *p_spinlock_out = &p_dev_info->dtb_spinlock;<br />+        break;<br />+    case ZXDH_DEV_SPINLOCK_T_SMMU0:<br />+        *p_spinlock_out = &p_dev_info->smmu0_spinlock;<br />+        break;<br />+    default:<br />+        PMD_DRV_LOG(ERR, "spinlock type is invalid!");<br />+        return ZXDH_ERR;<br />+    }<br />+<br />+    return ZXDH_OK;<br />+}<br />+<br /> static uint32_t<br /> zxdh_np_dev_read_channel(uint32_t dev_id, uint32_t addr, uint32_t size, uint32_t *p_data)<br /> {<br />@@ -827,6 +891,9 @@ zxdh_np_dev_add(uint32_t  dev_id, ZXDH_DEV_TYPE_E dev_type,<br />     p_dev_info->p_pcie_write_fun = zxdh_np_dev_pcie_default_write;<br />     p_dev_info->p_pcie_read_fun  = zxdh_np_dev_pcie_default_read;<br />  <br />+    rte_spinlock_init(&p_dev_info->dtb_spinlock.spinlock);<br />+    rte_spinlock_init(&p_dev_info->smmu0_spinlock.spinlock);<br />+<br />     return 0;<br /> }<br />  <br />@@ -918,6 +985,269 @@ zxdh_np_ppu_parse_cls_bitmap(uint32_t dev_id,<br />     }<br /> }<br />  <br />+static void<br />+zxdh_np_agent_msg_prt(uint8_t type, uint32_t rtn)<br />+{<br />+    switch (rtn) {<br />+    case ZXDH_RC_CTRLCH_MSG_LEN_ZERO:<br />+        PMD_DRV_LOG(ERR, "type[%u]:msg len is zero!", type);<br />+        break;<br />+    case ZXDH_RC_CTRLCH_MSG_PRO_ERR:<br />+        PMD_DRV_LOG(ERR, "type[%u]:msg process error!", type);<br />+        break;<br />+    case ZXDH_RC_CTRLCH_MSG_TYPE_NOT_SUPPORT:<br />+        PMD_DRV_LOG(ERR, "type[%u]:fw not support the msg!", type);<br />+        break;<br />+    case ZXDH_RC_CTRLCH_MSG_OPER_NOT_SUPPORT:<br />+        PMD_DRV_LOG(ERR, "type[%u]:fw not support opr of the msg!", type);<br />+        break;<br />+    case ZXDH_RC_CTRLCH_MSG_DROP:<br />+        PMD_DRV_LOG(ERR, "type[%u]:fw not support,drop msg!", type);<br />+        break;<br />+    default:<br />+        break;<br />+    }<br />+}<br />+<br />+static uint32_t<br />+zxdh_np_agent_bar_msg_check(uint32_t dev_id, ZXDH_AGENT_CHANNEL_MSG_T *p_msg)<br />+{<br />+    uint8_t type = 0;<br />+    uint32_t bar_msg_num = 0;<br />+<br />+    type = *((uint8_t *)(p_msg->msg) + 1);<br />+    if (type != ZXDH_PCIE_BAR_MSG) {<br />+        zxdh_np_dev_fw_bar_msg_num_get(dev_id, &bar_msg_num);<br />+        if (type >= bar_msg_num) {<br />+            PMD_DRV_LOG(ERR, "type[%u] > fw_bar_msg_num[%u]!", type, bar_msg_num);<br />+            return ZXDH_RC_CTRLCH_MSG_TYPE_NOT_SUPPORT;<br />+        }<br />+    }<br />+<br />+    return ZXDH_OK;<br />+}<br />+<br />+static uint32_t<br />+zxdh_np_agent_channel_sync_send(uint32_t dev_id,<br />+                ZXDH_AGENT_CHANNEL_MSG_T *p_msg,<br />+                uint32_t *p_data,<br />+                uint32_t rep_len)<br />+{<br />+    uint32_t ret = ZXDH_OK;<br />+    uint32_t vport = 0;<br />+    struct zxdh_pci_bar_msg in = {0};<br />+    struct zxdh_msg_recviver_mem result = {0};<br />+    uint32_t *recv_buffer = NULL;<br />+    uint8_t *reply_ptr = NULL;<br />+    uint16_t reply_msg_len = 0;<br />+    uint64_t agent_addr = 0;<br />+<br />+    ret = zxdh_np_agent_bar_msg_check(dev_id, p_msg);<br />+    if (ret != ZXDH_OK) {<br />+        PMD_DRV_LOG(ERR, "zxdh_np_agent_bar_msg_check failed!");<br />+        return ret;<br />+    }<br />+<br />+    zxdh_np_dev_vport_get(dev_id, &vport);<br />+    zxdh_np_dev_agent_addr_get(dev_id, &agent_addr);<br />+<br />+    if (ZXDH_IS_PF(vport))<br />+        in.src = ZXDH_MSG_CHAN_END_PF;<br />+    else<br />+        in.src = ZXDH_MSG_CHAN_END_VF;<br />+<br />+    in.virt_addr = agent_addr;<br />+    in.payload_addr = p_msg->msg;<br />+    in.payload_len = p_msg->msg_len;<br />+    in.dst = ZXDH_MSG_CHAN_END_RISC;<br />+    in.module_id = ZXDH_BAR_MDOULE_NPSDK;<br />+<br />+    recv_buffer = (uint32_t *)rte_zmalloc(NULL, rep_len + ZXDH_CHANNEL_REPS_LEN, 0);<br />+    if (recv_buffer == NULL) {<br />+        PMD_DRV_LOG(ERR, "malloc memory failed");<br />+        return ZXDH_PAR_CHK_POINT_NULL;<br />+    }<br />+<br />+    result.buffer_len = rep_len + ZXDH_CHANNEL_REPS_LEN;<br />+    result.recv_buffer = recv_buffer;<br />+<br />+    ret = zxdh_bar_chan_sync_msg_send(&in, &result);<br />+    if (ret == ZXDH_BAR_MSG_OK) {<br />+        reply_ptr = (uint8_t *)(result.recv_buffer);<br />+        if (*reply_ptr == 0XFF) {<br />+            reply_msg_len = *(uint16_t *)(reply_ptr + 1);<br />+            memcpy(p_data, reply_ptr + 4,<br />+                ((reply_msg_len > rep_len) ? rep_len : reply_msg_len));<br />+        } else {<br />+            PMD_DRV_LOG(ERR, "Message not replied");<br />+        }<br />+    } else {<br />+        PMD_DRV_LOG(ERR, "Error[0x%x], bar msg send failed!", ret);<br />+    }<br />+<br />+    rte_free(recv_buffer);<br />+    return ret;<br />+}<br />+<br />+static uint32_t<br />+zxdh_np_agent_channel_reg_sync_send(uint32_t dev_id,<br />+    ZXDH_AGENT_CHANNEL_REG_MSG_T *p_msg, uint32_t *p_data, uint32_t rep_len)<br />+{<br />+    uint32_t ret = ZXDH_OK;<br />+    ZXDH_COMM_CHECK_DEV_POINT(dev_id, p_msg);<br />+    ZXDH_AGENT_CHANNEL_MSG_T agent_msg = {<br />+        .msg = (void *)p_msg,<br />+        .msg_len = sizeof(ZXDH_AGENT_CHANNEL_REG_MSG_T),<br />+    };<br />+<br />+    ret = zxdh_np_agent_channel_sync_send(dev_id, &agent_msg, p_data, rep_len);<br />+    if (ret != ZXDH_OK) {<br />+        PMD_DRV_LOG(ERR, "zxdh_np_agent_channel_sync_send failed");<br />+        return ZXDH_ERR;<br />+    }<br />+<br />+    ret = *p_data;<br />+    if (ret != ZXDH_OK) {<br />+        PMD_DRV_LOG(ERR, "zxdh_np_agent_channel_sync_send failed in buffer");<br />+        return ZXDH_ERR;<br />+    }<br />+<br />+    return ret;<br />+}<br />+<br />+static uint32_t<br />+zxdh_np_agent_channel_pcie_bar_request(uint32_t dev_id,<br />+                                    uint32_t *p_bar_msg_num)<br />+{<br />+    uint32_t rc = ZXDH_OK;<br />+    uint32_t rsp_buff[2] = {0};<br />+    uint32_t msg_result = 0;<br />+    uint32_t bar_msg_num = 0;<br />+    ZXDH_AGENT_PCIE_BAR_MSG_T msgcfg = {<br />+        .dev_id = 0,<br />+        .type   = ZXDH_PCIE_BAR_MSG,<br />+        .oper   = ZXDH_BAR_MSG_NUM_REQ,<br />+    };<br />+    ZXDH_AGENT_CHANNEL_MSG_T agent_msg = {<br />+        .msg = (void *)&msgcfg,<br />+        .msg_len = sizeof(ZXDH_AGENT_PCIE_BAR_MSG_T),<br />+    };<br />+<br />+    rc = zxdh_np_agent_channel_sync_send(dev_id, &agent_msg, rsp_buff, sizeof(rsp_buff));<br />+    if (rc != ZXDH_OK) {<br />+        PMD_DRV_LOG(ERR, "zxdh_np_agent_channel_sync_send failed!");<br />+        return rc;<br />+    }<br />+<br />+    msg_result = rsp_buff[0];<br />+    bar_msg_num = rsp_buff[1];<br />+<br />+    zxdh_np_agent_msg_prt(msgcfg.type, msg_result);<br />+<br />+    *p_bar_msg_num = bar_msg_num;<br />+<br />+    return msg_result;<br />+}<br />+<br />+static uint32_t<br />+zxdh_np_agent_channel_reg_read(uint32_t dev_id,<br />+                            uint32_t reg_type,<br />+                            uint32_t reg_no,<br />+                            uint32_t reg_width,<br />+                            uint32_t addr,<br />+                            uint32_t *p_data)<br />+{<br />+    uint32_t ret = 0;<br />+    ZXDH_AGENT_CHANNEL_REG_MSG_T msgcfg = {<br />+        .dev_id  = 0,<br />+        .type    = ZXDH_REG_MSG,<br />+        .subtype = reg_type,<br />+        .oper    = ZXDH_RD,<br />+        .reg_no  = reg_no,<br />+        .addr     = addr,<br />+        .val_len = reg_width / 4,<br />+    };<br />+<br />+    uint32_t resp_len = reg_width + 4;<br />+    uint8_t *resp_buffer = (uint8_t *)rte_zmalloc(NULL, resp_len, 0);<br />+    if (resp_buffer == NULL) {<br />+        PMD_DRV_LOG(ERR, "malloc memory failed");<br />+        return ZXDH_PAR_CHK_POINT_NULL;<br />+    }<br />+<br />+    ret = zxdh_np_agent_channel_reg_sync_send(dev_id,<br />+        &msgcfg, (uint32_t *)resp_buffer, resp_len);<br />+    if (ret != ZXDH_OK) {<br />+        PMD_DRV_LOG(ERR, "dev id %d reg_no %d send agent read failed.", dev_id, reg_no);<br />+        rte_free(resp_buffer);<br />+        return ZXDH_ERR;<br />+    }<br />+<br />+    if (*((uint32_t *)resp_buffer) != ZXDH_OK) {<br />+        PMD_DRV_LOG(ERR, "dev id %d reg_no %d agent read resp err %d .",<br />+            dev_id, reg_no, *((uint32_t *)resp_buffer));<br />+        rte_free(resp_buffer);<br />+        return ZXDH_ERR;<br />+    }<br />+<br />+    memcpy(p_data, resp_buffer + 4, reg_width);<br />+<br />+    rte_free(resp_buffer);<br />+<br />+    return ret;<br />+}<br />+<br />+static uint32_t<br />+zxdh_np_agent_channel_reg_write(uint32_t dev_id,<br />+                            uint32_t reg_type,<br />+                            uint32_t reg_no,<br />+                            uint32_t reg_width,<br />+                            uint32_t addr,<br />+                            uint32_t *p_data)<br />+{<br />+    uint32_t ret = ZXDH_OK;<br />+    ZXDH_AGENT_CHANNEL_REG_MSG_T msgcfg = {<br />+        .dev_id  = 0,<br />+        .type    = ZXDH_REG_MSG,<br />+        .subtype = reg_type,<br />+        .oper    = ZXDH_WR,<br />+        .reg_no  = reg_no,<br />+        .addr     = addr,<br />+        .val_len = reg_width / 4,<br />+    };<br />+<br />+    memcpy(msgcfg.val, p_data, reg_width);<br />+<br />+    uint32_t resp_len = reg_width + 4;<br />+    uint8_t *resp_buffer = (uint8_t *)rte_zmalloc(NULL, resp_len, 0);<br />+    if (resp_buffer == NULL) {<br />+        PMD_DRV_LOG(ERR, "malloc memory failed");<br />+        return ZXDH_PAR_CHK_POINT_NULL;<br />+    }<br />+<br />+    ret = zxdh_np_agent_channel_reg_sync_send(dev_id,<br />+        &msgcfg, (uint32_t *)resp_buffer, resp_len);<br />+<br />+    if (ret != ZXDH_OK) {<br />+        PMD_DRV_LOG(ERR, "dev id %d reg_no %d send agent write failed.", dev_id, reg_no);<br />+        rte_free(resp_buffer);<br />+        return ZXDH_ERR;<br />+    }<br />+<br />+    if (*((uint32_t *)resp_buffer) != ZXDH_OK) {<br />+        PMD_DRV_LOG(ERR, "dev id %d reg_no %d agent write resp err %d .",<br />+            dev_id, reg_no, *((uint32_t *)resp_buffer));<br />+        rte_free(resp_buffer);<br />+        return ZXDH_ERR;<br />+    }<br />+<br />+    memcpy(p_data, resp_buffer + 4, reg_width);<br />+<br />+    rte_free(resp_buffer);<br />+<br />+    return ret;<br />+}<br />+<br /> static ZXDH_DTB_MGR_T *<br /> zxdh_np_dtb_mgr_get(uint32_t dev_id)<br /> {<br />@@ -1128,6 +1458,24 @@ zxdh_np_np_sdk_version_compatible_check(uint32_t dev_id)<br />     return ZXDH_OK;<br /> }<br />  <br />+static uint32_t<br />+zxdh_np_pcie_bar_msg_num_get(uint32_t dev_id, uint32_t *p_bar_msg_num)<br />+{<br />+    uint32_t rc = ZXDH_OK;<br />+    ZXDH_SPINLOCK_T *p_dtb_spinlock = NULL;<br />+    ZXDH_DEV_SPINLOCK_TYPE_E spinlock = ZXDH_DEV_SPINLOCK_T_DTB;<br />+<br />+    rc = zxdh_np_dev_opr_spinlock_get(dev_id, (uint32_t)spinlock, &p_dtb_spinlock);<br />+    ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_dev_opr_spinlock_get");<br />+<br />+    rte_spinlock_lock(&p_dtb_spinlock->spinlock);<br />+    rc = zxdh_np_agent_channel_pcie_bar_request(dev_id, p_bar_msg_num);<br />+    ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_agent_channel_pcie_bar_request");<br />+    rte_spinlock_unlock(&p_dtb_spinlock->spinlock);<br />+<br />+    return rc;<br />+}<br />+<br /> static ZXDH_RISCV_DTB_MGR *<br /> zxdh_np_riscv_dtb_queue_mgr_get(uint32_t dev_id)<br /> {<br />@@ -1246,12 +1594,19 @@ zxdh_np_reg_read(uint32_t dev_id, uint32_t reg_no,<br />     uint32_t i;<br />     uint32_t addr = 0;<br />     uint32_t reg_module = p_reg_info->module_no;<br />+    uint32_t reg_width = p_reg_info->width;<br />+    uint32_t reg_real_no = p_reg_info->reg_no;<br />+    uint32_t reg_type = p_reg_info->flags;<br />  <br />     addr = zxdh_np_reg_get_reg_addr(reg_no, m_offset, n_offset);<br />  <br />     if (reg_module == DTB4K) {<br />         rc = p_reg_info->p_read_fun(dev_id, addr, p_buff);<br />         ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "p_reg_info->p_read_fun");<br />+    } else {<br />+        rc = zxdh_np_agent_channel_reg_read(dev_id,<br />+            reg_type, reg_real_no, reg_width, addr, p_buff);<br />+        ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_agent_channel_reg_read");<br />     }<br />  <br />     if (!zxdh_np_comm_is_big_endian()) {<br />@@ -1383,6 +1738,9 @@ zxdh_np_reg_write(uint32_t dev_id, uint32_t reg_no,<br />     uint32_t i;<br />     uint32_t addr = 0;<br />     uint32_t reg_module = p_reg_info->module_no;<br />+    uint32_t reg_width = p_reg_info->width;<br />+    uint32_t reg_type = p_reg_info->flags;<br />+    uint32_t reg_real_no = p_reg_info->reg_no;<br />  <br />     for (i = 0; i < p_reg_info->field_num; i++) {<br />         if (p_field_info[i].len <= 32) {<br />@@ -1417,6 +1775,10 @@ zxdh_np_reg_write(uint32_t dev_id, uint32_t reg_no,<br />     if (reg_module == DTB4K) {<br />         rc = p_reg_info->p_write_fun(dev_id, addr, p_buff);<br />         ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "p_reg_info->p_write_fun");<br />+    } else {<br />+        rc = zxdh_np_agent_channel_reg_write(dev_id,<br />+            reg_type, reg_real_no, reg_width, addr, p_buff);<br />+        ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_agent_channel_reg_write");<br />     }<br />  <br />     return rc;<br />@@ -1790,7 +2152,7 @@ zxdh_np_dtb_eram_one_entry(uint32_t dev_id,<br />     uint32_t base_addr;<br />     uint32_t index;<br />     uint32_t opr_mode;<br />-    uint32_t rc;<br />+    uint32_t rc = ZXDH_OK;<br />  <br />     ZXDH_COMM_CHECK_POINT(pdata);<br />     ZXDH_COMM_CHECK_POINT(p_dtb_one_entry);<br />@@ -2687,6 +3049,7 @@ zxdh_np_host_init(uint32_t dev_id,<br />     ZXDH_SYS_INIT_CTRL_T sys_init_ctrl = {0};<br />     uint32_t rc;<br />     uint64_t agent_addr;<br />+    uint32_t bar_msg_num = 0;<br />  <br />     ZXDH_COMM_CHECK_DEV_POINT(dev_id, p_dev_init_ctrl);<br />  <br />@@ -2708,6 +3071,11 @@ zxdh_np_host_init(uint32_t dev_id,<br />     rc = zxdh_np_np_sdk_version_compatible_check(dev_id);<br />     ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_np_sdk_version_compatible_check");<br />  <br />+    rc = zxdh_np_pcie_bar_msg_num_get(dev_id, &bar_msg_num);<br />+    ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_pcie_bar_msg_num_get");<br />+<br />+    zxdh_np_dev_fw_bar_msg_num_set(dev_id, bar_msg_num);<br />+<br />     return 0;<br /> }<br />  <br />@@ -2942,59 +3310,7 @@ zxdh_np_stat_ppu_cnt_get_ex(uint32_t dev_id,<br /> }<br />  <br /> static uint32_t<br />-zxdh_np_agent_channel_sync_send(ZXDH_AGENT_CHANNEL_MSG_T *p_msg,<br />-                uint32_t *p_data,<br />-                uint32_t rep_len)<br />-{<br />-    uint32_t ret = 0;<br />-    uint32_t vport = 0;<br />-    struct zxdh_pci_bar_msg in = {0};<br />-    struct zxdh_msg_recviver_mem result = {0};<br />-    uint32_t *recv_buffer;<br />-    uint8_t *reply_ptr = NULL;<br />-    uint16_t reply_msg_len = 0;<br />-    uint64_t agent_addr = 0;<br />-<br />-    if (ZXDH_IS_PF(vport))<br />-        in.src = ZXDH_MSG_CHAN_END_PF;<br />-    else<br />-        in.src = ZXDH_MSG_CHAN_END_VF;<br />-<br />-    in.virt_addr = agent_addr;<br />-    in.payload_addr = p_msg->msg;<br />-    in.payload_len = p_msg->msg_len;<br />-    in.dst = ZXDH_MSG_CHAN_END_RISC;<br />-    in.module_id = ZXDH_BAR_MDOULE_NPSDK;<br />-<br />-    recv_buffer = (uint32_t *)rte_zmalloc(NULL, rep_len + ZXDH_CHANNEL_REPS_LEN, 0);<br />-    if (recv_buffer == NULL) {<br />-        PMD_DRV_LOG(ERR, "%s point null!", __func__);<br />-        return ZXDH_PAR_CHK_POINT_NULL;<br />-    }<br />-<br />-    result.buffer_len = rep_len + ZXDH_CHANNEL_REPS_LEN;<br />-    result.recv_buffer = recv_buffer;<br />-<br />-    ret = zxdh_bar_chan_sync_msg_send(&in, &result);<br />-    if (ret == ZXDH_BAR_MSG_OK) {<br />-        reply_ptr = (uint8_t *)(result.recv_buffer);<br />-        if (*reply_ptr == 0XFF) {<br />-            reply_msg_len = *(uint16_t *)(reply_ptr + 1);<br />-            memcpy(p_data, reply_ptr + 4,<br />-                ((reply_msg_len > rep_len) ? rep_len : reply_msg_len));<br />-        } else {<br />-            PMD_DRV_LOG(ERR, "Message not replied");<br />-        }<br />-    } else {<br />-        PMD_DRV_LOG(ERR, "Error[0x%x], %s failed!", ret, __func__);<br />-    }<br />-<br />-    rte_free(recv_buffer);<br />-    return ret;<br />-}<br />-<br />-static uint32_t<br />-zxdh_np_agent_channel_plcr_sync_send(ZXDH_AGENT_CHANNEL_PLCR_MSG_T *p_msg,<br />+zxdh_np_agent_channel_plcr_sync_send(uint32_t dev_id, ZXDH_AGENT_CHANNEL_PLCR_MSG_T *p_msg,<br />         uint32_t *p_data, uint32_t rep_len)<br /> {<br />     uint32_t ret = 0;<br />@@ -3003,7 +3319,7 @@ zxdh_np_agent_channel_plcr_sync_send(ZXDH_AGENT_CHANNEL_PLCR_MSG_T *p_msg,<br />     agent_msg.msg = (void *)p_msg;<br />     agent_msg.msg_len = sizeof(ZXDH_AGENT_CHANNEL_PLCR_MSG_T);<br />  <br />-    ret = zxdh_np_agent_channel_sync_send(&agent_msg, p_data, rep_len);<br />+    ret = zxdh_np_agent_channel_sync_send(dev_id, &agent_msg, p_data, rep_len);<br />     if (ret != 0)    {<br />         PMD_DRV_LOG(ERR, "%s: agent_channel_sync_send failed.", __func__);<br />         return 1;<br />@@ -3013,7 +3329,7 @@ zxdh_np_agent_channel_plcr_sync_send(ZXDH_AGENT_CHANNEL_PLCR_MSG_T *p_msg,<br /> }<br />  <br /> static uint32_t<br />-zxdh_np_agent_channel_plcr_profileid_request(uint32_t vport,<br />+zxdh_np_agent_channel_plcr_profileid_request(uint32_t dev_id, uint32_t vport,<br />     uint32_t car_type, uint32_t *p_profileid)<br /> {<br />     uint32_t ret = 0;<br />@@ -3028,7 +3344,7 @@ zxdh_np_agent_channel_plcr_profileid_request(uint32_t vport,<br />     msgcfg.car_type = car_type;<br />     msgcfg.profile_id = 0xFFFF;<br />  <br />-    ret = zxdh_np_agent_channel_plcr_sync_send(&msgcfg,<br />+    ret = zxdh_np_agent_channel_plcr_sync_send(dev_id, &msgcfg,<br />         resp_buffer, sizeof(resp_buffer));<br />     if (ret != 0)    {<br />         PMD_DRV_LOG(ERR, "%s: agent_channel_plcr_sync_send failed.", __func__);<br />@@ -3041,7 +3357,8 @@ zxdh_np_agent_channel_plcr_profileid_request(uint32_t vport,<br /> }<br />  <br /> static uint32_t<br />-zxdh_np_agent_channel_plcr_car_rate(uint32_t car_type,<br />+zxdh_np_agent_channel_plcr_car_rate(uint32_t dev_id,<br />+        uint32_t car_type,<br />         uint32_t pkt_sign,<br />         uint32_t profile_id __rte_unused,<br />         void *p_car_profile_cfg)<br />@@ -3071,7 +3388,7 @@ zxdh_np_agent_channel_plcr_car_rate(uint32_t car_type,<br />         agent_msg.msg = (void *)&msgpktcfg;<br />         agent_msg.msg_len = sizeof(ZXDH_AGENT_CAR_PKT_PROFILE_MSG_T);<br />  <br />-        ret = zxdh_np_agent_channel_sync_send(&agent_msg, resp_buffer, resp_len);<br />+        ret = zxdh_np_agent_channel_sync_send(dev_id, &agent_msg, resp_buffer, resp_len);<br />         if (ret != 0)    {<br />             PMD_DRV_LOG(ERR, "%s: stat_car_a_type failed.", __func__);<br />             return 1;<br />@@ -3105,7 +3422,7 @@ zxdh_np_agent_channel_plcr_car_rate(uint32_t car_type,<br />         agent_msg.msg = (void *)&msgcfg;<br />         agent_msg.msg_len = sizeof(ZXDH_AGENT_CAR_PROFILE_MSG_T);<br />  <br />-        ret = zxdh_np_agent_channel_sync_send(&agent_msg, resp_buffer, resp_len);<br />+        ret = zxdh_np_agent_channel_sync_send(dev_id, &agent_msg, resp_buffer, resp_len);<br />         if (ret != 0)    {<br />             PMD_DRV_LOG(ERR, "%s: stat_car_b_type failed.", __func__);<br />             return 1;<br />@@ -3118,7 +3435,7 @@ zxdh_np_agent_channel_plcr_car_rate(uint32_t car_type,<br /> }<br />  <br /> static uint32_t<br />-zxdh_np_agent_channel_plcr_profileid_release(uint32_t vport,<br />+zxdh_np_agent_channel_plcr_profileid_release(uint32_t dev_id, uint32_t vport,<br />         uint32_t car_type __rte_unused,<br />         uint32_t profileid)<br /> {<br />@@ -3133,7 +3450,7 @@ zxdh_np_agent_channel_plcr_profileid_release(uint32_t vport,<br />     msgcfg.vport = vport;<br />     msgcfg.profile_id = profileid;<br />  <br />-    ret = zxdh_np_agent_channel_plcr_sync_send(&msgcfg,<br />+    ret = zxdh_np_agent_channel_plcr_sync_send(dev_id, &msgcfg,<br />         resp_buffer, sizeof(resp_buffer));<br />     if (ret != 0)    {<br />         PMD_DRV_LOG(ERR, "%s: agent_channel_plcr_sync_send failed.", __func__);<br />@@ -3234,7 +3551,7 @@ zxdh_np_car_profile_id_add(uint32_t vport_id,<br />         PMD_DRV_LOG(ERR, "%s: profile_id point null!", __func__);<br />         return ZXDH_PAR_CHK_POINT_NULL;<br />     }<br />-    ret = zxdh_np_agent_channel_plcr_profileid_request(vport_id, flags, profile_id);<br />+    ret = zxdh_np_agent_channel_plcr_profileid_request(0, vport_id, flags, profile_id);<br />  <br />     profile_id_h = *(profile_id + 1);<br />     profile_id_l = *profile_id;<br />@@ -3259,8 +3576,9 @@ zxdh_np_car_profile_cfg_set(uint32_t vport_id __rte_unused,<br />         void *p_car_profile_cfg)<br /> {<br />     uint32_t ret = 0;<br />+    uint32_t dev_id = 0;<br />  <br />-    ret = zxdh_np_agent_channel_plcr_car_rate(car_type,<br />+    ret = zxdh_np_agent_channel_plcr_car_rate(dev_id, car_type,<br />         pkt_sign, profile_id, p_car_profile_cfg);<br />     if (ret != 0) {<br />         PMD_DRV_LOG(ERR, "%s: plcr_car_rate set failed!", __func__);<br />@@ -3276,10 +3594,11 @@ zxdh_np_car_profile_id_delete(uint32_t vport_id,<br /> {<br />     uint32_t ret = 0;<br />     uint32_t profileid = 0;<br />+    uint32_t dev_id = 0;<br />  <br />     profileid = profile_id & 0xFFFF;<br />  <br />-    ret = zxdh_np_agent_channel_plcr_profileid_release(vport_id, flags, profileid);<br />+    ret = zxdh_np_agent_channel_plcr_profileid_release(dev_id, vport_id, flags, profileid);<br />     if (ret != 0) {<br />         PMD_DRV_LOG(ERR, "%s: plcr profiled id release failed!", __func__);<br />         return 1;<br />diff --git a/drivers/net/zxdh/zxdh_np.h b/drivers/net/zxdh/zxdh_np.h<br />index d6ceecf3f8..c8fc8ea613 100644<br />--- a/drivers/net/zxdh/zxdh_np.h<br />+++ b/drivers/net/zxdh/zxdh_np.h<br />@@ -112,9 +112,17 @@<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 />+#define ZXDH_CHANNEL_REPS_LEN                   (4)<br />+<br /> #define ZXDH_NPSDK_COMPAT_ITEM_ID               (10)<br /> #define ZXDH_DPU_NO_DEBUG_PF_COMPAT_REG_OFFSET  (0x5400)<br />  <br />+#define ZXDH_VF_ACTIVE(VPORT)                   (((VPORT) & 0x0800) >> 11)<br />+#define ZXDH_EPID_BY(VPORT)                     (((VPORT) & 0x7000) >> 12)<br />+#define ZXDH_FUNC_NUM(VPORT)                    (((VPORT) & 0x0700) >> 8)<br />+#define ZXDH_VFUNC_NUM(VPORT)                   (((VPORT) & 0x00FF))<br />+#define ZXDH_IS_PF(VPORT)                       (!ZXDH_VF_ACTIVE(VPORT))<br />+<br /> /**errco code */<br /> #define ZXDH_RC_BASE                            (0x1000U)<br /> #define ZXDH_PARAMETER_CHK_BASE                 (ZXDH_RC_BASE            | 0x200)<br />@@ -127,6 +135,12 @@<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_SPIN_LOCK_BASE                     (ZXDH_RC_BASE            | 0x300)<br />+#define ZXDH_SPIN_LOCK_INIT_FAIL                (ZXDH_SPIN_LOCK_BASE     | 0x001)<br />+#define ZXDH_SPIN_LOCK_LOCK_FAIL                (ZXDH_SPIN_LOCK_BASE     | 0x002)<br />+#define ZXDH_SPIN_LOCK_ULOCK_FAIL               (ZXDH_SPIN_LOCK_BASE     | 0X003)<br />+#define ZXDH_SPIN_LOCK_DESTROY_FAIL             (ZXDH_SPIN_LOCK_BASE     | 0X004)<br />+<br /> #define ZXDH_ERAM128_BADDR_MASK                 (0x3FFFF80)<br />  <br /> #define ZXDH_DTB_TABLE_MODE_ERAM                (0)<br />@@ -164,6 +178,13 @@<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 />+#define ZXDH_RC_CTRLCH_BASE                     (0xf00)<br />+#define ZXDH_RC_CTRLCH_MSG_LEN_ZERO             (ZXDH_RC_CTRLCH_BASE | 0x0)<br />+#define ZXDH_RC_CTRLCH_MSG_PRO_ERR              (ZXDH_RC_CTRLCH_BASE | 0x1)<br />+#define ZXDH_RC_CTRLCH_MSG_TYPE_NOT_SUPPORT     (ZXDH_RC_CTRLCH_BASE | 0x2)<br />+#define ZXDH_RC_CTRLCH_MSG_OPER_NOT_SUPPORT     (ZXDH_RC_CTRLCH_BASE | 0x3)<br />+#define ZXDH_RC_CTRLCH_MSG_DROP                 (ZXDH_RC_CTRLCH_BASE | 0x4)<br />+<br /> #define ZXDH_SCHE_RSP_LEN                       (2)<br /> #define ZXDH_G_PROFILE_ID_LEN                   (8)<br />  <br />@@ -380,6 +401,7 @@ typedef struct dpp_dev_cfg_t {<br />     uint32_t access_type;<br />     uint32_t agent_flag;<br />     uint32_t vport;<br />+    uint32_t fw_bar_msg_num;<br />     uint64_t pcie_addr;<br />     uint64_t riscv_addr;<br />     uint64_t dma_vir_addr;<br />@@ -388,6 +410,8 @@ typedef struct dpp_dev_cfg_t {<br />     uint32_t init_flags[ZXDH_MODULE_INIT_MAX];<br />     ZXDH_DEV_WRITE_FUNC p_pcie_write_fun;<br />     ZXDH_DEV_READ_FUNC  p_pcie_read_fun;<br />+    ZXDH_SPINLOCK_T dtb_spinlock;<br />+    ZXDH_SPINLOCK_T smmu0_spinlock;<br /> } ZXDH_DEV_CFG_T;<br />  <br /> typedef struct zxdh_dev_mngr_t {<br />@@ -662,6 +686,17 @@ typedef enum zxdh_stat_cnt_mode_e {<br />     ZXDH_STAT_MAX_MODE,<br /> } ZXDH_STAT_CNT_MODE_E;<br />  <br />+typedef enum  zxdh_agent_pcie_bar_e {<br />+    ZXDH_BAR_MSG_NUM_REQ = 0,<br />+    ZXDH_PCIE_BAR_MAX<br />+} ZXDH_MSG_PCIE_BAR_E;<br />+<br />+typedef enum zxdh_agent_msg_oper_e {<br />+    ZXDH_WR = 0,<br />+    ZXDH_RD,<br />+    ZXDH_WR_RD_MAX<br />+} ZXDH_MSG_OPER_E;<br />+<br /> typedef struct zxdh_smmu0_smmu0_cpu_ind_cmd_t {<br />     uint32_t cpu_ind_rw;<br />     uint32_t cpu_ind_rd_mode;<br />@@ -776,11 +811,6 @@ typedef struct dpp_agent_car_pkt_profile_msg {<br />     uint32_t pri[ZXDH_CAR_PRI_MAX];<br /> } ZXDH_AGENT_CAR_PKT_PROFILE_MSG_T;<br />  <br />-typedef struct zxdh_agent_channel_msg_t {<br />-    uint32_t msg_len;<br />-    void *msg;<br />-} ZXDH_AGENT_CHANNEL_MSG_T;<br />-<br /> typedef struct zxdh_agent_channel_plcr_msg {<br />     uint8_t dev_id;<br />     uint8_t type;<br />@@ -858,6 +888,29 @@ typedef struct __rte_aligned(2) zxdh_version_compatible_reg_t {<br />     uint8_t rsv[2];<br /> } ZXDH_VERSION_COMPATIBLE_REG_T;<br />  <br />+typedef struct __rte_aligned(2) zxdh_agent_channel_pcie_bar_msg_t {<br />+    uint8_t dev_id;<br />+    uint8_t type;<br />+    uint8_t oper;<br />+    uint8_t rsv;<br />+} ZXDH_AGENT_PCIE_BAR_MSG_T;<br />+<br />+typedef struct __rte_aligned(2) zxdh_agent_channel_reg_msg {<br />+    uint8_t dev_id;<br />+    uint8_t type;<br />+    uint8_t subtype;<br />+    uint8_t oper;<br />+    uint32_t reg_no;<br />+    uint32_t addr;<br />+    uint32_t val_len;<br />+    uint32_t val[32];<br />+} ZXDH_AGENT_CHANNEL_REG_MSG_T;<br />+<br />+typedef struct __rte_aligned(2) zxdh_agent_channel_msg_t {<br />+    uint32_t msg_len;<br />+    void *msg;<br />+} ZXDH_AGENT_CHANNEL_MSG_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 />--  <br />2.27.0<br />