net/mlx5: support flow count action handle
[dpdk.git] / drivers / net / mlx5 / mlx5_flow_aso.c
index cd2cc01..da513a6 100644 (file)
@@ -191,7 +191,6 @@ mlx5_aso_mtr_init_sq(struct mlx5_aso_sq *sq)
        volatile struct mlx5_aso_wqe *restrict wqe;
        int i;
        int size = 1 << sq->log_desc_n;
-       uint32_t idx;
 
        /* All the next fields state should stay constant. */
        for (i = 0, wqe = &sq->sq_obj.aso_wqes[0]; i < size; ++i, ++wqe) {
@@ -204,11 +203,6 @@ mlx5_aso_mtr_init_sq(struct mlx5_aso_sq *sq)
                         (BYTEWISE_64BYTE << ASO_CSEG_DATA_MASK_MODE_OFFSET));
                wqe->general_cseg.flags = RTE_BE32(MLX5_COMP_ALWAYS <<
                                                         MLX5_COMP_MODE_OFFSET);
-               for (idx = 0; idx < MLX5_ASO_METERS_PER_WQE;
-                       idx++)
-                       wqe->aso_dseg.mtrs[idx].v_bo_sc_bbog_mm =
-                               RTE_BE32((1 << ASO_DSEG_VALID_OFFSET) |
-                               (MLX5_FLOW_COLOR_GREEN << ASO_DSEG_SC_OFFSET));
        }
 }
 
@@ -311,11 +305,11 @@ mlx5_aso_queue_init(struct mlx5_dev_ctx_shared *sh,
                mlx5_aso_age_init_sq(&sh->aso_age_mng->aso_sq);
                break;
        case ASO_OPC_MOD_POLICER:
-               if (mlx5_aso_sq_create(sh->ctx, &sh->mtrmng->sq, 0,
+               if (mlx5_aso_sq_create(sh->ctx, &sh->mtrmng->pools_mng.sq, 0,
                                  sh->tx_uar, sh->pdn, MLX5_ASO_QUEUE_LOG_DESC,
                                  sh->sq_ts_format))
                        return -1;
-               mlx5_aso_mtr_init_sq(&sh->mtrmng->sq);
+               mlx5_aso_mtr_init_sq(&sh->mtrmng->pools_mng.sq);
                break;
        default:
                DRV_LOG(ERR, "Unknown ASO operation mode");
@@ -342,7 +336,7 @@ mlx5_aso_queue_uninit(struct mlx5_dev_ctx_shared *sh,
                sq = &sh->aso_age_mng->aso_sq;
                break;
        case ASO_OPC_MOD_POLICER:
-               sq = &sh->mtrmng->sq;
+               sq = &sh->mtrmng->pools_mng.sq;
                break;
        default:
                DRV_LOG(ERR, "Unknown ASO operation mode");
@@ -664,6 +658,7 @@ mlx5_aso_mtr_sq_enqueue_single(struct mlx5_aso_sq *sq,
 {
        volatile struct mlx5_aso_wqe *wqe = NULL;
        struct mlx5_flow_meter_info *fm = NULL;
+       struct mlx5_flow_meter_profile *fmp;
        uint16_t size = 1 << sq->log_desc_n;
        uint16_t mask = size - 1;
        uint16_t res;
@@ -704,6 +699,16 @@ mlx5_aso_mtr_sq_enqueue_single(struct mlx5_aso_sq *sq,
                        RTE_BE32(MLX5_IFC_FLOW_METER_DISABLE_CBS_CIR_VAL);
                wqe->aso_dseg.mtrs[dseg_idx].ebs_eir = 0;
        }
+       fmp = fm->profile;
+       if (fmp->profile.packet_mode)
+               wqe->aso_dseg.mtrs[dseg_idx].v_bo_sc_bbog_mm =
+                               RTE_BE32((1 << ASO_DSEG_VALID_OFFSET) |
+                               (MLX5_FLOW_COLOR_GREEN << ASO_DSEG_SC_OFFSET) |
+                               (MLX5_METER_MODE_PKT << ASO_DSEG_MTR_MODE));
+       else
+               wqe->aso_dseg.mtrs[dseg_idx].v_bo_sc_bbog_mm =
+                               RTE_BE32((1 << ASO_DSEG_VALID_OFFSET) |
+                               (MLX5_FLOW_COLOR_GREEN << ASO_DSEG_SC_OFFSET));
        sq->head++;
        sq->pi += 2;/* Each WQE contains 2 WQEBB's. */
        rte_io_wmb();
@@ -798,7 +803,7 @@ int
 mlx5_aso_meter_update_by_wqe(struct mlx5_dev_ctx_shared *sh,
                        struct mlx5_aso_mtr *mtr)
 {
-       struct mlx5_aso_sq *sq = &sh->mtrmng->sq;
+       struct mlx5_aso_sq *sq = &sh->mtrmng->pools_mng.sq;
        uint32_t poll_wqe_times = MLX5_MTR_POLL_WQE_CQE_TIMES;
 
        do {
@@ -808,8 +813,8 @@ mlx5_aso_meter_update_by_wqe(struct mlx5_dev_ctx_shared *sh,
                /* Waiting for wqe resource. */
                rte_delay_us_sleep(MLX5_ASO_WQE_CQE_RESPONSE_DELAY);
        } while (--poll_wqe_times);
-       DRV_LOG(ERR, "Fail to send WQE for ASO meter %d",
-                       mtr->fm.meter_id);
+       DRV_LOG(ERR, "Fail to send WQE for ASO meter offset %d",
+                       mtr->offset);
        return -1;
 }
 
@@ -830,7 +835,7 @@ int
 mlx5_aso_mtr_wait(struct mlx5_dev_ctx_shared *sh,
                        struct mlx5_aso_mtr *mtr)
 {
-       struct mlx5_aso_sq *sq = &sh->mtrmng->sq;
+       struct mlx5_aso_sq *sq = &sh->mtrmng->pools_mng.sq;
        uint32_t poll_cqe_times = MLX5_MTR_POLL_WQE_CQE_TIMES;
 
        if (__atomic_load_n(&mtr->state, __ATOMIC_RELAXED) ==
@@ -844,7 +849,7 @@ mlx5_aso_mtr_wait(struct mlx5_dev_ctx_shared *sh,
                /* Waiting for CQE ready. */
                rte_delay_us_sleep(MLX5_ASO_WQE_CQE_RESPONSE_DELAY);
        } while (--poll_cqe_times);
-       DRV_LOG(ERR, "Fail to poll CQE ready for ASO meter %d",
-                       mtr->fm.meter_id);
+       DRV_LOG(ERR, "Fail to poll CQE ready for ASO meter offset %d",
+                       mtr->offset);
        return -1;
 }