Implement stat values clean operation by agent channel.<br /> <br />Signed-off-by: Bingbin Chen <chen.bingbin@zte.com.cn> <br />---<br /> drivers/net/zxdh/zxdh_ethdev_ops.c |   4 +<br /> drivers/net/zxdh/zxdh_np.c         | 302 +++++++++++++++++++++++++++++<br /> drivers/net/zxdh/zxdh_np.h         |  23 ++-<br /> 3 files changed, 328 insertions(+), 1 deletion(-)<br /> <br />diff --git a/drivers/net/zxdh/zxdh_ethdev_ops.c b/drivers/net/zxdh/zxdh_ethdev_ops.c<br />index 1a21ded58e..284bf27d10 100644<br />--- a/drivers/net/zxdh/zxdh_ethdev_ops.c<br />+++ b/drivers/net/zxdh/zxdh_ethdev_ops.c<br />@@ -1500,11 +1500,15 @@ static int zxdh_hw_stats_reset(struct rte_eth_dev *dev, enum zxdh_agent_msg_type<br /> int zxdh_dev_stats_reset(struct rte_eth_dev *dev)<br /> {<br />     struct zxdh_hw *hw = dev->data->dev_private;<br />+    uint64_t stats_data;<br />  <br />     zxdh_hw_stats_reset(dev, ZXDH_VQM_DEV_STATS_RESET);<br />     if (hw->is_pf)<br />         zxdh_hw_stats_reset(dev, ZXDH_MAC_STATS_RESET);<br />  <br />+    zxdh_np_stat_ppu_cnt_get_ex(0, ZXDH_STAT_64_MODE, 0,<br />+        ZXDH_STAT_RD_CLR_MODE_CLR, (uint32_t *)&stats_data);<br />+<br />     return 0;<br /> }<br />  <br />diff --git a/drivers/net/zxdh/zxdh_np.c b/drivers/net/zxdh/zxdh_np.c<br />index 760560d8b7..362814f410 100644<br />--- a/drivers/net/zxdh/zxdh_np.c<br />+++ b/drivers/net/zxdh/zxdh_np.c<br />@@ -2197,6 +2197,8 @@ zxdh_np_dev_add(uint32_t  dev_id, ZXDH_DEV_TYPE_E dev_type,<br />  <br />     zxdh_np_comm_spinlock_create(&p_dev_info->dtb_spinlock);<br />  <br />+    zxdh_np_comm_spinlock_create(&p_dev_info->smmu0_spinlock);<br />+<br />     for (i = 0; i < ZXDH_DTB_QUEUE_NUM_MAX; i++)<br />         zxdh_np_comm_spinlock_create(&p_dev_info->dtb_queue_spinlock[i]);<br />  <br />@@ -3238,6 +3240,32 @@ zxdh_np_reg_read(uint32_t dev_id, uint32_t reg_no,<br />     return rc;<br /> }<br />  <br />+static uint32_t<br />+zxdh_np_reg_read32(uint32_t dev_id, uint32_t reg_no,<br />+    uint32_t m_offset, uint32_t n_offset, uint32_t *p_data)<br />+{<br />+    uint32_t rc = 0;<br />+    uint32_t addr = 0;<br />+    ZXDH_REG_T *p_reg_info = &g_dpp_reg_info[reg_no];<br />+    uint32_t p_buff[ZXDH_REG_DATA_MAX] = {0};<br />+    uint32_t reg_real_no = p_reg_info->reg_no;<br />+    uint32_t reg_type = p_reg_info->flags;<br />+    uint32_t reg_module = p_reg_info->module_no;<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_data);<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, reg_type, reg_real_no, 4, addr, p_buff);<br />+        ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_agent_channel_reg_read");<br />+        *p_data = p_buff[0];<br />+    }<br />+<br />+    return rc;<br />+}<br />+<br /> static uint32_t<br /> zxdh_np_dtb_queue_vm_info_get(uint32_t dev_id,<br />         uint32_t queue_id,<br />@@ -10274,3 +10302,277 @@ zxdh_np_dtb_hash_offline_delete(uint32_t dev_id,<br />  <br />     return rc;<br /> }<br />+<br />+static uint32_t<br />+zxdh_np_se_done_status_check(uint32_t dev_id, uint32_t reg_no, uint32_t pos)<br />+{<br />+    uint32_t rc = ZXDH_OK;<br />+<br />+    uint32_t data = 0;<br />+    uint32_t rd_cnt = 0;<br />+    uint32_t done_flag = 0;<br />+<br />+    while (!done_flag) {<br />+        rc = zxdh_np_reg_read32(dev_id, reg_no, 0, 0, &data);<br />+        if (rc != ZXDH_OK) {<br />+            PMD_DRV_LOG(ERR, " [ErrorCode:0x%x] !-- zxdh_np_reg_read32 Fail!", rc);<br />+            return rc;<br />+        }<br />+<br />+        done_flag = (data >> pos) & 0x1;<br />+<br />+        if (done_flag)<br />+            break;<br />+<br />+        if (rd_cnt > ZXDH_RD_CNT_MAX * ZXDH_RD_CNT_MAX)<br />+            return ZXDH_ERR;<br />+<br />+        rd_cnt++;<br />+    }<br />+<br />+    return rc;<br />+}<br />+<br />+static uint32_t<br />+zxdh_np_se_smmu0_ind_read(uint32_t dev_id,<br />+                        uint32_t base_addr,<br />+                        uint32_t index,<br />+                        uint32_t rd_mode,<br />+                        uint32_t rd_clr_mode,<br />+                        uint32_t *p_data)<br />+{<br />+    uint32_t rc = ZXDH_OK;<br />+    uint32_t i = 0;<br />+    uint32_t row_index = 0;<br />+    uint32_t col_index = 0;<br />+    uint32_t temp_data[4] = {0};<br />+    uint32_t *p_temp_data = NULL;<br />+    ZXDH_SMMU0_SMMU0_CPU_IND_CMD_T cpu_ind_cmd = {0};<br />+    ZXDH_SPINLOCK_T *p_ind_spinlock = NULL;<br />+<br />+    rc = zxdh_np_dev_opr_spinlock_get(dev_id, ZXDH_DEV_SPINLOCK_T_SMMU0, &p_ind_spinlock);<br />+    ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_dev_opr_spinlock_get");<br />+<br />+    zxdh_np_comm_spinlock_lock(p_ind_spinlock);<br />+<br />+    rc = zxdh_np_se_done_status_check(dev_id, ZXDH_SMMU0_SMMU0_WR_ARB_CPU_RDYR, 0);<br />+    if (rc != ZXDH_OK) {<br />+        PMD_DRV_LOG(ERR, "se done status check failed, rc=0x%x.", rc);<br />+        zxdh_np_comm_spinlock_unlock(p_ind_spinlock);<br />+        return ZXDH_ERR;<br />+    }<br />+<br />+    if (rd_clr_mode == ZXDH_RD_MODE_HOLD) {<br />+        cpu_ind_cmd.cpu_ind_rw = ZXDH_SE_OPR_RD;<br />+        cpu_ind_cmd.cpu_ind_rd_mode = ZXDH_RD_MODE_HOLD;<br />+        cpu_ind_cmd.cpu_req_mode = ZXDH_ERAM128_OPR_128b;<br />+<br />+        switch (rd_mode) {<br />+        case ZXDH_ERAM128_OPR_128b:<br />+            if ((0xFFFFFFFF - (base_addr)) < (index)) {<br />+                zxdh_np_comm_spinlock_unlock(p_ind_spinlock);<br />+                PMD_DRV_LOG(ERR, "index 0x%x is invalid!", index);<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, "index out of range!");<br />+                zxdh_np_comm_spinlock_unlock(p_ind_spinlock);<br />+                return ZXDH_ERR;<br />+            }<br />+            row_index = (index << 7) & ZXDH_ERAM128_BADDR_MASK;<br />+            break;<br />+        case ZXDH_ERAM128_OPR_64b:<br />+            if ((base_addr + (index >> 1)) > ZXDH_SE_SMMU0_ERAM_ADDR_NUM_TOTAL - 1) {<br />+                PMD_DRV_LOG(ERR, "index out of range!");<br />+                zxdh_np_comm_spinlock_unlock(p_ind_spinlock);<br />+                return ZXDH_ERR;<br />+            }<br />+            row_index = (index << 6) & ZXDH_ERAM128_BADDR_MASK;<br />+            col_index = index & 0x1;<br />+            break;<br />+        case ZXDH_ERAM128_OPR_32b:<br />+            if ((base_addr + (index >> 2)) > ZXDH_SE_SMMU0_ERAM_ADDR_NUM_TOTAL - 1) {<br />+                PMD_DRV_LOG(ERR, "index out of range!");<br />+                zxdh_np_comm_spinlock_unlock(p_ind_spinlock);<br />+                return ZXDH_ERR;<br />+            }<br />+            row_index = (index << 5) & ZXDH_ERAM128_BADDR_MASK;<br />+            col_index = index & 0x3;<br />+            break;<br />+        case ZXDH_ERAM128_OPR_1b:<br />+            if ((base_addr + (index >> 7)) > ZXDH_SE_SMMU0_ERAM_ADDR_NUM_TOTAL - 1) {<br />+                PMD_DRV_LOG(ERR, "index out of range!");<br />+                zxdh_np_comm_spinlock_unlock(p_ind_spinlock);<br />+                return ZXDH_ERR;<br />+            }<br />+            row_index = index & ZXDH_ERAM128_BADDR_MASK;<br />+            col_index = index & 0x7F;<br />+            break;<br />+        default:<br />+            break;<br />+        }<br />+<br />+        cpu_ind_cmd.cpu_ind_addr = ((base_addr << 7) & ZXDH_ERAM128_BADDR_MASK) + row_index;<br />+    } else {<br />+        cpu_ind_cmd.cpu_ind_rw = ZXDH_SE_OPR_RD;<br />+        cpu_ind_cmd.cpu_ind_rd_mode = ZXDH_RD_MODE_CLEAR;<br />+<br />+        switch (rd_mode) {<br />+        case ZXDH_ERAM128_OPR_128b:<br />+            if ((0xFFFFFFFF - (base_addr)) < (index)) {<br />+                PMD_DRV_LOG(ERR, "index 0x%x is invalid!", index);<br />+                zxdh_np_comm_spinlock_unlock(p_ind_spinlock);<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, "index out of range!");<br />+                zxdh_np_comm_spinlock_unlock(p_ind_spinlock);<br />+                return ZXDH_ERR;<br />+            }<br />+            row_index = (index << 7);<br />+            cpu_ind_cmd.cpu_req_mode = ZXDH_ERAM128_OPR_128b;<br />+            break;<br />+        case ZXDH_ERAM128_OPR_64b:<br />+            if ((base_addr + (index >> 1)) > ZXDH_SE_SMMU0_ERAM_ADDR_NUM_TOTAL - 1) {<br />+                PMD_DRV_LOG(ERR, "index out of range!");<br />+                zxdh_np_comm_spinlock_unlock(p_ind_spinlock);<br />+                return ZXDH_ERR;<br />+            }<br />+            row_index = (index << 6);<br />+            cpu_ind_cmd.cpu_req_mode = 2;<br />+            break;<br />+        case ZXDH_ERAM128_OPR_32b:<br />+            if ((base_addr + (index >> 2)) > ZXDH_SE_SMMU0_ERAM_ADDR_NUM_TOTAL - 1) {<br />+                PMD_DRV_LOG(ERR, "index out of range!");<br />+                zxdh_np_comm_spinlock_unlock(p_ind_spinlock);<br />+                return ZXDH_ERR;<br />+            }<br />+            row_index = (index << 5);<br />+            cpu_ind_cmd.cpu_req_mode = 1;<br />+            break;<br />+        case ZXDH_ERAM128_OPR_1b:<br />+            PMD_DRV_LOG(ERR, "rd_clr_mode[%d] or rd_mode[%d] error!",<br />+                rd_clr_mode, rd_mode);<br />+            zxdh_np_comm_spinlock_unlock(p_ind_spinlock);<br />+            return ZXDH_ERR;<br />+        default:<br />+            break;<br />+        }<br />+<br />+        cpu_ind_cmd.cpu_ind_addr = ((base_addr << 7) & ZXDH_ERAM128_BADDR_MASK) + row_index;<br />+    }<br />+<br />+    rc = zxdh_np_reg_write(dev_id,<br />+            ZXDH_SMMU0_SMMU0_CPU_IND_CMDR,<br />+            0,<br />+            0,<br />+            &cpu_ind_cmd);<br />+    if (rc != ZXDH_OK) {<br />+        PMD_DRV_LOG(ERR, "zxdh_np_reg_write failed, rc=0x%x.", rc);<br />+        zxdh_np_comm_spinlock_unlock(p_ind_spinlock);<br />+        return ZXDH_ERR;<br />+    }<br />+<br />+    rc = zxdh_np_se_done_status_check(dev_id, ZXDH_SMMU0_SMMU0_CPU_IND_RD_DONER, 0);<br />+    if (rc != ZXDH_OK) {<br />+        PMD_DRV_LOG(ERR, "se done status check failed, rc=0x%x.", rc);<br />+        zxdh_np_comm_spinlock_unlock(p_ind_spinlock);<br />+        return ZXDH_ERR;<br />+    }<br />+<br />+    p_temp_data = temp_data;<br />+    for (i = 0; i < 4; i++) {<br />+        rc = zxdh_np_reg_read(dev_id,<br />+            ZXDH_SMMU0_SMMU0_CPU_IND_RDAT0R + i,<br />+            0,<br />+            0,<br />+            p_temp_data + 3 - i);<br />+        if (rc != ZXDH_OK) {<br />+            PMD_DRV_LOG(ERR, "zxdh_np_reg_write failed, rc=0x%x.", rc);<br />+            zxdh_np_comm_spinlock_unlock(p_ind_spinlock);<br />+            return ZXDH_ERR;<br />+        }<br />+    }<br />+<br />+    if (rd_clr_mode == ZXDH_RD_MODE_HOLD) {<br />+        switch (rd_mode) {<br />+        case ZXDH_ERAM128_OPR_128b:<br />+            memcpy(p_data, p_temp_data, (128 / 8));<br />+            break;<br />+        case ZXDH_ERAM128_OPR_64b:<br />+            memcpy(p_data, p_temp_data + ((1 - col_index) << 1), (64 / 8));<br />+            break;<br />+        case ZXDH_ERAM128_OPR_32b:<br />+            memcpy(p_data, p_temp_data + ((3 - col_index)), (32 / 8));<br />+            break;<br />+        case ZXDH_ERAM128_OPR_1b:<br />+            ZXDH_COMM_UINT32_GET_BITS(p_data[0],<br />+                *(p_temp_data + (3 - col_index / 32)), (col_index % 32), 1);<br />+            break;<br />+        default:<br />+            break;<br />+        }<br />+    } else {<br />+        switch (rd_mode) {<br />+        case ZXDH_ERAM128_OPR_128b:<br />+            memcpy(p_data, p_temp_data, (128 / 8));<br />+            break;<br />+        case ZXDH_ERAM128_OPR_64b:<br />+            memcpy(p_data, p_temp_data, (64 / 8));<br />+            break;<br />+        case ZXDH_ERAM128_OPR_32b:<br />+            memcpy(p_data, p_temp_data, (64 / 8));<br />+            break;<br />+        default:<br />+            break;<br />+        }<br />+    }<br />+<br />+    zxdh_np_comm_spinlock_unlock(p_ind_spinlock);<br />+<br />+    return rc;<br />+}<br />+<br />+uint32_t<br />+zxdh_np_stat_ppu_cnt_get_ex(uint32_t dev_id,<br />+                ZXDH_STAT_CNT_MODE_E rd_mode,<br />+                uint32_t index,<br />+                uint32_t clr_mode,<br />+                uint32_t *p_data)<br />+{<br />+    uint32_t rc = ZXDH_OK;<br />+    uint32_t ppu_eram_baddr = 0;<br />+    uint32_t ppu_eram_depth = 0;<br />+    uint32_t eram_rd_mode   = 0;<br />+    uint32_t eram_clr_mode  = 0;<br />+    ZXDH_PPU_STAT_CFG_T stat_cfg = {0};<br />+<br />+    zxdh_np_stat_cfg_soft_get(dev_id, &stat_cfg);<br />+<br />+    ppu_eram_depth = stat_cfg.eram_depth;<br />+    ppu_eram_baddr = stat_cfg.eram_baddr;<br />+<br />+    if ((index >> (ZXDH_STAT_128_MODE - rd_mode)) < ppu_eram_depth) {<br />+        if (rd_mode == ZXDH_STAT_128_MODE)<br />+            eram_rd_mode = ZXDH_ERAM128_OPR_128b;<br />+        else<br />+            eram_rd_mode = ZXDH_ERAM128_OPR_64b;<br />+<br />+        if (clr_mode == ZXDH_STAT_RD_CLR_MODE_UNCLR)<br />+            eram_clr_mode = ZXDH_RD_MODE_HOLD;<br />+        else<br />+            eram_clr_mode = ZXDH_RD_MODE_CLEAR;<br />+<br />+        rc = zxdh_np_se_smmu0_ind_read(dev_id,<br />+                                    ppu_eram_baddr,<br />+                                    index,<br />+                                    eram_rd_mode,<br />+                                    eram_clr_mode,<br />+                                    p_data);<br />+        ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_se_smmu0_ind_read");<br />+    } else {<br />+        PMD_DRV_LOG(ERR, "not have ddr stat.");<br />+    }<br />+<br />+    return rc;<br />+}<br />diff --git a/drivers/net/zxdh/zxdh_np.h b/drivers/net/zxdh/zxdh_np.h<br />index 5bff4530da..efec836bce 100644<br />--- a/drivers/net/zxdh/zxdh_np.h<br />+++ b/drivers/net/zxdh/zxdh_np.h<br />@@ -1193,6 +1193,12 @@ typedef struct zxdh_dtb4k_dtb_enq_cfg_epid_v_func_num_0_127_t {<br />     uint32_t cfg_vfunc_active;<br /> } ZXDH_DTB4K_DTB_ENQ_CFG_EPID_V_FUNC_NUM_0_127_T;<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 />+    uint32_t cpu_req_mode;<br />+    uint32_t cpu_ind_addr;<br />+} ZXDH_SMMU0_SMMU0_CPU_IND_CMD_T;<br />  <br /> typedef uint32_t (*ZXDH_REG_WRITE)(uint32_t dev_id, uint32_t addr, uint32_t *p_data);<br /> typedef uint32_t (*ZXDH_REG_READ)(uint32_t dev_id, uint32_t addr, uint32_t *p_data);<br />@@ -1503,6 +1509,17 @@ typedef enum zxdh_stat_cnt_mode_e {<br />     ZXDH_STAT_MAX_MODE,<br /> } ZXDH_STAT_CNT_MODE_E;<br />  <br />+typedef enum zxdh_stat_rd_clr_mode_e {<br />+    ZXDH_STAT_RD_CLR_MODE_UNCLR = 0,<br />+    ZXDH_STAT_RD_CLR_MODE_CLR   = 1,<br />+    ZXDH_STAT_RD_CLR_MODE_MAX,<br />+} STAT_RD_CLR_MODE_E;<br />+<br />+typedef enum zxdh_eram128_rd_clr_mode_e {<br />+    ZXDH_RD_MODE_HOLD   = 0,<br />+    ZXDH_RD_MODE_CLEAR  = 1,<br />+} ZXDH_ERAM128_RD_CLR_MODE_E;<br />+<br /> typedef enum zxdh_np_agent_msg_type_e {<br />     ZXDH_REG_MSG = 0,<br />     ZXDH_DTB_MSG,<br />@@ -1746,5 +1763,9 @@ uint32_t zxdh_np_dtb_hash_offline_delete(uint32_t dev_id,<br />                         uint32_t queue_id,<br />                         uint32_t sdt_no,<br />                         __rte_unused uint32_t flush_mode);<br />-<br />+uint32_t zxdh_np_stat_ppu_cnt_get_ex(uint32_t dev_id,<br />+                        ZXDH_STAT_CNT_MODE_E rd_mode,<br />+                        uint32_t index,<br />+                        uint32_t clr_mode,<br />+                        uint32_t *p_data);<br /> #endif /* ZXDH_NP_H */<br />--  <br />2.27.0<br />