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