xref: /dpdk/drivers/regex/mlx5/mlx5_regex_devx.c (revision 9428310ae1f14e53a626636dab0493c47b303e66)
1*9428310aSOri Kam /* SPDX-License-Identifier: BSD-3-Clause
2*9428310aSOri Kam  * Copyright 2020 Mellanox Technologies, Ltd
3*9428310aSOri Kam  */
4*9428310aSOri Kam 
5*9428310aSOri Kam #include <rte_errno.h>
6*9428310aSOri Kam #include <rte_log.h>
7*9428310aSOri Kam 
8*9428310aSOri Kam #include <mlx5_glue.h>
9*9428310aSOri Kam #include <mlx5_devx_cmds.h>
10*9428310aSOri Kam #include <mlx5_prm.h>
11*9428310aSOri Kam 
12*9428310aSOri Kam #include "mlx5_regex.h"
13*9428310aSOri Kam #include "mlx5_regex_utils.h"
14*9428310aSOri Kam 
15*9428310aSOri Kam int
16*9428310aSOri Kam mlx5_devx_regex_register_write(struct ibv_context *ctx, int engine_id,
17*9428310aSOri Kam 			       uint32_t addr, uint32_t data)
18*9428310aSOri Kam {
19*9428310aSOri Kam 	uint32_t out[MLX5_ST_SZ_DW(set_regexp_register_out)] = {0};
20*9428310aSOri Kam 	uint32_t in[MLX5_ST_SZ_DW(set_regexp_register_in)] = {0};
21*9428310aSOri Kam 	int ret;
22*9428310aSOri Kam 
23*9428310aSOri Kam 	MLX5_SET(set_regexp_register_in, in, opcode,
24*9428310aSOri Kam 		 MLX5_CMD_SET_REGEX_REGISTERS);
25*9428310aSOri Kam 	MLX5_SET(set_regexp_register_in, in, engine_id, engine_id);
26*9428310aSOri Kam 	MLX5_SET(set_regexp_register_in, in, register_address, addr);
27*9428310aSOri Kam 	MLX5_SET(set_regexp_register_in, in, register_data, data);
28*9428310aSOri Kam 
29*9428310aSOri Kam 	ret = mlx5_glue->devx_general_cmd(ctx, in, sizeof(in), out,
30*9428310aSOri Kam 					  sizeof(out));
31*9428310aSOri Kam 	if (ret) {
32*9428310aSOri Kam 		DRV_LOG(ERR, "Set regexp register failed %d", ret);
33*9428310aSOri Kam 		rte_errno = errno;
34*9428310aSOri Kam 		return -errno;
35*9428310aSOri Kam 	}
36*9428310aSOri Kam 	return 0;
37*9428310aSOri Kam }
38*9428310aSOri Kam 
39*9428310aSOri Kam int
40*9428310aSOri Kam mlx5_devx_regex_register_read(struct ibv_context *ctx, int engine_id,
41*9428310aSOri Kam 			      uint32_t addr, uint32_t *data)
42*9428310aSOri Kam {
43*9428310aSOri Kam 	uint32_t out[MLX5_ST_SZ_DW(query_regexp_register_out)] = {0};
44*9428310aSOri Kam 	uint32_t in[MLX5_ST_SZ_DW(query_regexp_register_in)] = {0};
45*9428310aSOri Kam 	int ret;
46*9428310aSOri Kam 
47*9428310aSOri Kam 	MLX5_SET(query_regexp_register_in, in, opcode,
48*9428310aSOri Kam 		 MLX5_CMD_QUERY_REGEX_REGISTERS);
49*9428310aSOri Kam 	MLX5_SET(query_regexp_register_in, in, engine_id, engine_id);
50*9428310aSOri Kam 	MLX5_SET(query_regexp_register_in, in, register_address, addr);
51*9428310aSOri Kam 
52*9428310aSOri Kam 	ret = mlx5_glue->devx_general_cmd(ctx, in, sizeof(in), out,
53*9428310aSOri Kam 					  sizeof(out));
54*9428310aSOri Kam 	if (ret) {
55*9428310aSOri Kam 		DRV_LOG(ERR, "Query regexp register failed %d", ret);
56*9428310aSOri Kam 		rte_errno = errno;
57*9428310aSOri Kam 		return -errno;
58*9428310aSOri Kam 	}
59*9428310aSOri Kam 	*data = MLX5_GET(query_regexp_register_out, out, register_data);
60*9428310aSOri Kam 	return 0;
61*9428310aSOri Kam }
62