19428310aSOri Kam /* SPDX-License-Identifier: BSD-3-Clause 29428310aSOri Kam * Copyright 2020 Mellanox Technologies, Ltd 39428310aSOri Kam */ 49428310aSOri Kam 59428310aSOri Kam #include <rte_errno.h> 69428310aSOri Kam #include <rte_log.h> 79428310aSOri Kam 89428310aSOri Kam #include <mlx5_glue.h> 99428310aSOri Kam #include <mlx5_devx_cmds.h> 109428310aSOri Kam #include <mlx5_prm.h> 119428310aSOri Kam 129428310aSOri Kam #include "mlx5_regex.h" 139428310aSOri Kam #include "mlx5_regex_utils.h" 149428310aSOri Kam 159428310aSOri Kam int 169428310aSOri Kam mlx5_devx_regex_register_write(struct ibv_context *ctx, int engine_id, 179428310aSOri Kam uint32_t addr, uint32_t data) 189428310aSOri Kam { 199428310aSOri Kam uint32_t out[MLX5_ST_SZ_DW(set_regexp_register_out)] = {0}; 209428310aSOri Kam uint32_t in[MLX5_ST_SZ_DW(set_regexp_register_in)] = {0}; 219428310aSOri Kam int ret; 229428310aSOri Kam 239428310aSOri Kam MLX5_SET(set_regexp_register_in, in, opcode, 249428310aSOri Kam MLX5_CMD_SET_REGEX_REGISTERS); 259428310aSOri Kam MLX5_SET(set_regexp_register_in, in, engine_id, engine_id); 269428310aSOri Kam MLX5_SET(set_regexp_register_in, in, register_address, addr); 279428310aSOri Kam MLX5_SET(set_regexp_register_in, in, register_data, data); 289428310aSOri Kam 299428310aSOri Kam ret = mlx5_glue->devx_general_cmd(ctx, in, sizeof(in), out, 309428310aSOri Kam sizeof(out)); 319428310aSOri Kam if (ret) { 329428310aSOri Kam DRV_LOG(ERR, "Set regexp register failed %d", ret); 339428310aSOri Kam rte_errno = errno; 349428310aSOri Kam return -errno; 359428310aSOri Kam } 369428310aSOri Kam return 0; 379428310aSOri Kam } 389428310aSOri Kam 399428310aSOri Kam int 409428310aSOri Kam mlx5_devx_regex_register_read(struct ibv_context *ctx, int engine_id, 419428310aSOri Kam uint32_t addr, uint32_t *data) 429428310aSOri Kam { 439428310aSOri Kam uint32_t out[MLX5_ST_SZ_DW(query_regexp_register_out)] = {0}; 449428310aSOri Kam uint32_t in[MLX5_ST_SZ_DW(query_regexp_register_in)] = {0}; 459428310aSOri Kam int ret; 469428310aSOri Kam 479428310aSOri Kam MLX5_SET(query_regexp_register_in, in, opcode, 489428310aSOri Kam MLX5_CMD_QUERY_REGEX_REGISTERS); 499428310aSOri Kam MLX5_SET(query_regexp_register_in, in, engine_id, engine_id); 509428310aSOri Kam MLX5_SET(query_regexp_register_in, in, register_address, addr); 519428310aSOri Kam 529428310aSOri Kam ret = mlx5_glue->devx_general_cmd(ctx, in, sizeof(in), out, 539428310aSOri Kam sizeof(out)); 549428310aSOri Kam if (ret) { 559428310aSOri Kam DRV_LOG(ERR, "Query regexp register failed %d", ret); 569428310aSOri Kam rte_errno = errno; 579428310aSOri Kam return -errno; 589428310aSOri Kam } 599428310aSOri Kam *data = MLX5_GET(query_regexp_register_out, out, register_data); 609428310aSOri Kam return 0; 619428310aSOri Kam } 62*b34d8163SFrancis Kelly 63*b34d8163SFrancis Kelly int 64*b34d8163SFrancis Kelly mlx5_devx_regex_database_stop(void *ctx, uint8_t engine) 65*b34d8163SFrancis Kelly { 66*b34d8163SFrancis Kelly uint32_t out[MLX5_ST_SZ_DW(set_regexp_params_out)] = {0}; 67*b34d8163SFrancis Kelly uint32_t in[MLX5_ST_SZ_DW(set_regexp_params_in)] = {0}; 68*b34d8163SFrancis Kelly int ret; 69*b34d8163SFrancis Kelly 70*b34d8163SFrancis Kelly MLX5_SET(set_regexp_params_in, in, opcode, MLX5_CMD_SET_REGEX_PARAMS); 71*b34d8163SFrancis Kelly MLX5_SET(set_regexp_params_in, in, engine_id, engine); 72*b34d8163SFrancis Kelly MLX5_SET(set_regexp_params_in, in, regexp_params.stop_engine, 1); 73*b34d8163SFrancis Kelly MLX5_SET(set_regexp_params_in, in, field_select.stop_engine, 1); 74*b34d8163SFrancis Kelly ret = mlx5_glue->devx_general_cmd(ctx, in, sizeof(in), out, 75*b34d8163SFrancis Kelly sizeof(out)); 76*b34d8163SFrancis Kelly if (ret) { 77*b34d8163SFrancis Kelly DRV_LOG(ERR, "Database stop failed %d", ret); 78*b34d8163SFrancis Kelly rte_errno = errno; 79*b34d8163SFrancis Kelly return -errno; 80*b34d8163SFrancis Kelly } 81*b34d8163SFrancis Kelly return 0; 82*b34d8163SFrancis Kelly } 83*b34d8163SFrancis Kelly 84*b34d8163SFrancis Kelly int 85*b34d8163SFrancis Kelly mlx5_devx_regex_database_resume(void *ctx, uint8_t engine) 86*b34d8163SFrancis Kelly { 87*b34d8163SFrancis Kelly uint32_t out[MLX5_ST_SZ_DW(set_regexp_params_out)] = {0}; 88*b34d8163SFrancis Kelly uint32_t in[MLX5_ST_SZ_DW(set_regexp_params_in)] = {0}; 89*b34d8163SFrancis Kelly int ret; 90*b34d8163SFrancis Kelly 91*b34d8163SFrancis Kelly MLX5_SET(set_regexp_params_in, in, opcode, MLX5_CMD_SET_REGEX_PARAMS); 92*b34d8163SFrancis Kelly MLX5_SET(set_regexp_params_in, in, engine_id, engine); 93*b34d8163SFrancis Kelly MLX5_SET(set_regexp_params_in, in, regexp_params.stop_engine, 0); 94*b34d8163SFrancis Kelly MLX5_SET(set_regexp_params_in, in, field_select.stop_engine, 1); 95*b34d8163SFrancis Kelly ret = mlx5_glue->devx_general_cmd(ctx, in, sizeof(in), out, 96*b34d8163SFrancis Kelly sizeof(out)); 97*b34d8163SFrancis Kelly if (ret) { 98*b34d8163SFrancis Kelly DRV_LOG(ERR, "Database start failed %d", ret); 99*b34d8163SFrancis Kelly rte_errno = errno; 100*b34d8163SFrancis Kelly return -errno; 101*b34d8163SFrancis Kelly } 102*b34d8163SFrancis Kelly return 0; 103*b34d8163SFrancis Kelly } 104*b34d8163SFrancis Kelly 105*b34d8163SFrancis Kelly int 106*b34d8163SFrancis Kelly mlx5_devx_regex_database_program(void *ctx, uint8_t engine, uint32_t umem_id, 107*b34d8163SFrancis Kelly uint64_t umem_offset) 108*b34d8163SFrancis Kelly { 109*b34d8163SFrancis Kelly uint32_t out[MLX5_ST_SZ_DW(set_regexp_params_out)] = {0}; 110*b34d8163SFrancis Kelly uint32_t in[MLX5_ST_SZ_DW(set_regexp_params_in)] = {0}; 111*b34d8163SFrancis Kelly int ret; 112*b34d8163SFrancis Kelly 113*b34d8163SFrancis Kelly MLX5_SET(set_regexp_params_in, in, opcode, MLX5_CMD_SET_REGEX_PARAMS); 114*b34d8163SFrancis Kelly MLX5_SET(set_regexp_params_in, in, engine_id, engine); 115*b34d8163SFrancis Kelly MLX5_SET(set_regexp_params_in, in, regexp_params.db_umem_id, umem_id); 116*b34d8163SFrancis Kelly MLX5_SET64(set_regexp_params_in, in, regexp_params.db_umem_offset, 117*b34d8163SFrancis Kelly umem_offset); 118*b34d8163SFrancis Kelly MLX5_SET(set_regexp_params_in, in, field_select.db_umem_id, 1); 119*b34d8163SFrancis Kelly ret = mlx5_glue->devx_general_cmd(ctx, in, sizeof(in), out, 120*b34d8163SFrancis Kelly sizeof(out)); 121*b34d8163SFrancis Kelly if (ret) { 122*b34d8163SFrancis Kelly DRV_LOG(ERR, "Database program failed %d", ret); 123*b34d8163SFrancis Kelly rte_errno = errno; 124*b34d8163SFrancis Kelly return -errno; 125*b34d8163SFrancis Kelly } 126*b34d8163SFrancis Kelly return 0; 127*b34d8163SFrancis Kelly } 128