xref: /dpdk/drivers/regex/mlx5/mlx5_regex_devx.c (revision b34d816363b553a6098ef4647e91d5a02b66aca4)
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