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 } 62b34d8163SFrancis Kelly 63b34d8163SFrancis Kelly int 64b34d8163SFrancis Kelly mlx5_devx_regex_database_stop(void *ctx, uint8_t engine) 65b34d8163SFrancis Kelly { 66b34d8163SFrancis Kelly uint32_t out[MLX5_ST_SZ_DW(set_regexp_params_out)] = {0}; 67b34d8163SFrancis Kelly uint32_t in[MLX5_ST_SZ_DW(set_regexp_params_in)] = {0}; 68b34d8163SFrancis Kelly int ret; 69b34d8163SFrancis Kelly 70b34d8163SFrancis Kelly MLX5_SET(set_regexp_params_in, in, opcode, MLX5_CMD_SET_REGEX_PARAMS); 71b34d8163SFrancis Kelly MLX5_SET(set_regexp_params_in, in, engine_id, engine); 72b34d8163SFrancis Kelly MLX5_SET(set_regexp_params_in, in, regexp_params.stop_engine, 1); 73b34d8163SFrancis Kelly MLX5_SET(set_regexp_params_in, in, field_select.stop_engine, 1); 74b34d8163SFrancis Kelly ret = mlx5_glue->devx_general_cmd(ctx, in, sizeof(in), out, 75b34d8163SFrancis Kelly sizeof(out)); 76b34d8163SFrancis Kelly if (ret) { 77b34d8163SFrancis Kelly DRV_LOG(ERR, "Database stop failed %d", ret); 78b34d8163SFrancis Kelly rte_errno = errno; 79b34d8163SFrancis Kelly return -errno; 80b34d8163SFrancis Kelly } 81b34d8163SFrancis Kelly return 0; 82b34d8163SFrancis Kelly } 83b34d8163SFrancis Kelly 84b34d8163SFrancis Kelly int 85b34d8163SFrancis Kelly mlx5_devx_regex_database_resume(void *ctx, uint8_t engine) 86b34d8163SFrancis Kelly { 87b34d8163SFrancis Kelly uint32_t out[MLX5_ST_SZ_DW(set_regexp_params_out)] = {0}; 88b34d8163SFrancis Kelly uint32_t in[MLX5_ST_SZ_DW(set_regexp_params_in)] = {0}; 89b34d8163SFrancis Kelly int ret; 90b34d8163SFrancis Kelly 91b34d8163SFrancis Kelly MLX5_SET(set_regexp_params_in, in, opcode, MLX5_CMD_SET_REGEX_PARAMS); 92b34d8163SFrancis Kelly MLX5_SET(set_regexp_params_in, in, engine_id, engine); 93b34d8163SFrancis Kelly MLX5_SET(set_regexp_params_in, in, regexp_params.stop_engine, 0); 94b34d8163SFrancis Kelly MLX5_SET(set_regexp_params_in, in, field_select.stop_engine, 1); 95b34d8163SFrancis Kelly ret = mlx5_glue->devx_general_cmd(ctx, in, sizeof(in), out, 96b34d8163SFrancis Kelly sizeof(out)); 97b34d8163SFrancis Kelly if (ret) { 98b34d8163SFrancis Kelly DRV_LOG(ERR, "Database start failed %d", ret); 99b34d8163SFrancis Kelly rte_errno = errno; 100b34d8163SFrancis Kelly return -errno; 101b34d8163SFrancis Kelly } 102b34d8163SFrancis Kelly return 0; 103b34d8163SFrancis Kelly } 104b34d8163SFrancis Kelly 105b34d8163SFrancis Kelly int 106*1663c140SAdy Agbarih mlx5_devx_regex_rules_program(void *ctx, uint8_t engine, uint32_t rof_mkey, 107*1663c140SAdy Agbarih uint32_t rof_size, uint64_t rof_mkey_va) 108b34d8163SFrancis Kelly { 109b34d8163SFrancis Kelly uint32_t out[MLX5_ST_SZ_DW(set_regexp_params_out)] = {0}; 110b34d8163SFrancis Kelly uint32_t in[MLX5_ST_SZ_DW(set_regexp_params_in)] = {0}; 111b34d8163SFrancis Kelly int ret; 112b34d8163SFrancis Kelly 113b34d8163SFrancis Kelly MLX5_SET(set_regexp_params_in, in, opcode, MLX5_CMD_SET_REGEX_PARAMS); 114b34d8163SFrancis Kelly MLX5_SET(set_regexp_params_in, in, engine_id, engine); 115*1663c140SAdy Agbarih MLX5_SET(set_regexp_params_in, in, regexp_params.rof_mkey, rof_mkey); 116*1663c140SAdy Agbarih MLX5_SET(set_regexp_params_in, in, regexp_params.rof_size, rof_size); 117*1663c140SAdy Agbarih MLX5_SET64(set_regexp_params_in, in, regexp_params.rof_mkey_va, 118*1663c140SAdy Agbarih rof_mkey_va); 119*1663c140SAdy Agbarih MLX5_SET(set_regexp_params_in, in, field_select.rof_mkey, 1); 120b34d8163SFrancis Kelly ret = mlx5_glue->devx_general_cmd(ctx, in, sizeof(in), out, 121b34d8163SFrancis Kelly sizeof(out)); 122b34d8163SFrancis Kelly if (ret) { 123*1663c140SAdy Agbarih DRV_LOG(ERR, "Rules program failed %d", ret); 124b34d8163SFrancis Kelly rte_errno = errno; 125b34d8163SFrancis Kelly return -errno; 126b34d8163SFrancis Kelly } 127b34d8163SFrancis Kelly return 0; 128b34d8163SFrancis Kelly } 129