common/mlx5: create ASO flow meter object with DevX
[dpdk.git] / drivers / common / mlx5 / mlx5_devx_cmds.c
index 88be7de..6c6f439 100644 (file)
@@ -2173,6 +2173,60 @@ mlx5_devx_cmd_alloc_pd(void *ctx)
        return ppd;
 }
 
+/**
+ * Create general object of type FLOW_METER_ASO using DevX API.
+ *
+ * @param[in] ctx
+ *   Context returned from mlx5 open_device() glue function.
+ * @param [in] pd
+ *   PD value to associate the FLOW_METER_ASO object with.
+ * @param [in] log_obj_size
+ *   log_obj_size define to allocate number of 2 * meters
+ *   in one FLOW_METER_ASO object.
+ *
+ * @return
+ *   The DevX object created, NULL otherwise and rte_errno is set.
+ */
+struct mlx5_devx_obj *
+mlx5_devx_cmd_create_flow_meter_aso_obj(void *ctx, uint32_t pd,
+                                               uint32_t log_obj_size)
+{
+       uint32_t in[MLX5_ST_SZ_DW(create_flow_meter_aso_in)] = {0};
+       uint32_t out[MLX5_ST_SZ_DW(general_obj_out_cmd_hdr)];
+       struct mlx5_devx_obj *flow_meter_aso_obj;
+       void *ptr;
+
+       flow_meter_aso_obj = mlx5_malloc(MLX5_MEM_ZERO,
+                                               sizeof(*flow_meter_aso_obj),
+                                               0, SOCKET_ID_ANY);
+       if (!flow_meter_aso_obj) {
+               DRV_LOG(ERR, "Failed to allocate FLOW_METER_ASO object data");
+               rte_errno = ENOMEM;
+               return NULL;
+       }
+       ptr = MLX5_ADDR_OF(create_flow_meter_aso_in, in, hdr);
+       MLX5_SET(general_obj_in_cmd_hdr, ptr, opcode,
+               MLX5_CMD_OP_CREATE_GENERAL_OBJECT);
+       MLX5_SET(general_obj_in_cmd_hdr, ptr, obj_type,
+               MLX5_GENERAL_OBJ_TYPE_FLOW_METER_ASO);
+       MLX5_SET(general_obj_in_cmd_hdr, ptr, log_obj_range,
+               log_obj_size);
+       ptr = MLX5_ADDR_OF(create_flow_meter_aso_in, in, flow_meter_aso);
+       MLX5_SET(flow_meter_aso, ptr, access_pd, pd);
+       flow_meter_aso_obj->obj = mlx5_glue->devx_obj_create(
+                                                       ctx, in, sizeof(in),
+                                                       out, sizeof(out));
+       if (!flow_meter_aso_obj->obj) {
+               rte_errno = errno;
+               DRV_LOG(ERR, "Failed to create FLOW_METER_ASO obj using DevX.");
+               mlx5_free(flow_meter_aso_obj);
+               return NULL;
+       }
+       flow_meter_aso_obj->id = MLX5_GET(general_obj_out_cmd_hdr,
+                                                               out, obj_id);
+       return flow_meter_aso_obj;
+}
+
 /**
  * Create general object of type GENEVE TLV option using DevX API.
  *