common/mlx5: create ASO flow meter object with DevX

Add DevX API to create ASO flow meter object.

Signed-off-by: Li Zhang <lizh@nvidia.com>
Acked-by: Matan Azrad <matan@nvidia.com>
This commit is contained in:
Li Zhang 2021-04-20 13:55:15 +03:00 committed by Raslan Darawsheh
parent 5b9e24ae14
commit 894711d3fe
3 changed files with 72 additions and 1 deletions

View 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.
*

View File

@ -556,7 +556,6 @@ int mlx5_devx_cmd_query_virtio_q_counters(struct mlx5_devx_obj *couners_obj,
__rte_internal
struct mlx5_devx_obj *mlx5_devx_cmd_create_flow_hit_aso_obj(void *ctx,
uint32_t pd);
__rte_internal
struct mlx5_devx_obj *mlx5_devx_cmd_alloc_pd(void *ctx);
@ -568,4 +567,21 @@ struct mlx5_devx_obj *mlx5_devx_cmd_queue_counter_alloc(void *ctx);
__rte_internal
int mlx5_devx_cmd_queue_counter_query(struct mlx5_devx_obj *dcs, int clear,
uint32_t *out_of_buffers);
/**
* Create general object of type FLOW_METER_ASO using DevX API..
*
* @param[in] ctx
* Device context.
* @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.
*/
__rte_internal
struct mlx5_devx_obj *mlx5_devx_cmd_create_flow_meter_aso_obj(void *ctx,
uint32_t pd, uint32_t log_obj_size);
#endif /* RTE_PMD_MLX5_DEVX_CMDS_H_ */

View File

@ -25,6 +25,7 @@ INTERNAL {
mlx5_devx_cmd_create_virtio_q_counters; # WINDOWS_NO_EXPORT
mlx5_devx_cmd_create_virtq;
mlx5_devx_cmd_create_flow_hit_aso_obj;
mlx5_devx_cmd_create_flow_meter_aso_obj;
mlx5_devx_cmd_create_geneve_tlv_option;
mlx5_devx_cmd_destroy;
mlx5_devx_cmd_flow_counter_alloc;