net/mlx5: allocate flow meter registers
[dpdk.git] / drivers / net / mlx5 / mlx5.c
index 062666c..3b30169 100644 (file)
@@ -2290,6 +2290,30 @@ mlx5_dev_spawn(struct rte_device *dpdk_dev,
                        DRV_LOG(DEBUG, "LRO session timeout set to %d usec",
                                config.lro.timeout);
                }
+#if defined(HAVE_MLX5DV_DR) && defined(HAVE_MLX5_DR_CREATE_ACTION_FLOW_METER)
+               if (config.hca_attr.qos.sup && config.hca_attr.qos.srtcm_sup &&
+                   config.dv_flow_en) {
+                       uint8_t reg_c_mask =
+                               config.hca_attr.qos.flow_meter_reg_c_ids;
+                       /*
+                        * Meter needs two REG_C's for color match and pre-sfx
+                        * flow match. Here get the REG_C for color match.
+                        * REG_C_0 and REG_C_1 is reserved for metadata feature.
+                        */
+                       reg_c_mask &= 0xfc;
+                       if (__builtin_popcount(reg_c_mask) < 1) {
+                               priv->mtr_en = 0;
+                               DRV_LOG(WARNING, "No available register for"
+                                       " meter.");
+                       } else {
+                               priv->mtr_color_reg = ffs(reg_c_mask) - 1 +
+                                                     REG_C_0;
+                               priv->mtr_en = 1;
+                               DRV_LOG(DEBUG, "The REG_C meter uses is %d",
+                                       priv->mtr_color_reg);
+                       }
+               }
+#endif
        }
        if (config.mprq.enabled && mprq) {
                if (config.mprq.stride_num_n > mprq_max_stride_num_n ||