xref: /dpdk/drivers/regex/mlx5/mlx5_regex_devx.c (revision ce6b8c31548b4d71a986d9807cd06cf3a616d1ab)
1 /* SPDX-License-Identifier: BSD-3-Clause
2  * Copyright 2020 Mellanox Technologies, Ltd
3  */
4 
5 #include <rte_errno.h>
6 #include <rte_log.h>
7 
8 #include <mlx5_glue.h>
9 #include <mlx5_devx_cmds.h>
10 #include <mlx5_prm.h>
11 
12 #include "mlx5_regex.h"
13 #include "mlx5_regex_utils.h"
14 
15 int
16 mlx5_devx_regex_register_write(struct ibv_context *ctx, int engine_id,
17 			       uint32_t addr, uint32_t data)
18 {
19 	uint32_t out[MLX5_ST_SZ_DW(set_regexp_register_out)] = {0};
20 	uint32_t in[MLX5_ST_SZ_DW(set_regexp_register_in)] = {0};
21 	int ret;
22 
23 	MLX5_SET(set_regexp_register_in, in, opcode,
24 		 MLX5_CMD_SET_REGEX_REGISTERS);
25 	MLX5_SET(set_regexp_register_in, in, engine_id, engine_id);
26 	MLX5_SET(set_regexp_register_in, in, register_address, addr);
27 	MLX5_SET(set_regexp_register_in, in, register_data, data);
28 
29 	ret = mlx5_glue->devx_general_cmd(ctx, in, sizeof(in), out,
30 					  sizeof(out));
31 	if (ret) {
32 		DRV_LOG(ERR, "Set regexp register failed %d", ret);
33 		rte_errno = errno;
34 		return -errno;
35 	}
36 	return 0;
37 }
38 
39 int
40 mlx5_devx_regex_register_read(struct ibv_context *ctx, int engine_id,
41 			      uint32_t addr, uint32_t *data)
42 {
43 	uint32_t out[MLX5_ST_SZ_DW(query_regexp_register_out)] = {0};
44 	uint32_t in[MLX5_ST_SZ_DW(query_regexp_register_in)] = {0};
45 	int ret;
46 
47 	MLX5_SET(query_regexp_register_in, in, opcode,
48 		 MLX5_CMD_QUERY_REGEX_REGISTERS);
49 	MLX5_SET(query_regexp_register_in, in, engine_id, engine_id);
50 	MLX5_SET(query_regexp_register_in, in, register_address, addr);
51 
52 	ret = mlx5_glue->devx_general_cmd(ctx, in, sizeof(in), out,
53 					  sizeof(out));
54 	if (ret) {
55 		DRV_LOG(ERR, "Query regexp register failed %d", ret);
56 		rte_errno = errno;
57 		return -errno;
58 	}
59 	*data = MLX5_GET(query_regexp_register_out, out, register_data);
60 	return 0;
61 }
62 
63 int
64 mlx5_devx_regex_database_stop(void *ctx, uint8_t engine)
65 {
66 	uint32_t out[MLX5_ST_SZ_DW(set_regexp_params_out)] = {0};
67 	uint32_t in[MLX5_ST_SZ_DW(set_regexp_params_in)] = {0};
68 	int ret;
69 
70 	MLX5_SET(set_regexp_params_in, in, opcode, MLX5_CMD_SET_REGEX_PARAMS);
71 	MLX5_SET(set_regexp_params_in, in, engine_id, engine);
72 	MLX5_SET(set_regexp_params_in, in, regexp_params.stop_engine, 1);
73 	MLX5_SET(set_regexp_params_in, in, field_select.stop_engine, 1);
74 	ret = mlx5_glue->devx_general_cmd(ctx, in, sizeof(in), out,
75 					  sizeof(out));
76 	if (ret) {
77 		DRV_LOG(ERR, "Database stop failed %d", ret);
78 		rte_errno = errno;
79 		return -errno;
80 	}
81 	return 0;
82 }
83 
84 int
85 mlx5_devx_regex_database_resume(void *ctx, uint8_t engine)
86 {
87 	uint32_t out[MLX5_ST_SZ_DW(set_regexp_params_out)] = {0};
88 	uint32_t in[MLX5_ST_SZ_DW(set_regexp_params_in)] = {0};
89 	int ret;
90 
91 	MLX5_SET(set_regexp_params_in, in, opcode, MLX5_CMD_SET_REGEX_PARAMS);
92 	MLX5_SET(set_regexp_params_in, in, engine_id, engine);
93 	MLX5_SET(set_regexp_params_in, in, regexp_params.stop_engine, 0);
94 	MLX5_SET(set_regexp_params_in, in, field_select.stop_engine, 1);
95 	ret = mlx5_glue->devx_general_cmd(ctx, in, sizeof(in), out,
96 					  sizeof(out));
97 	if (ret) {
98 		DRV_LOG(ERR, "Database start failed %d", ret);
99 		rte_errno = errno;
100 		return -errno;
101 	}
102 	return 0;
103 }
104 
105 int
106 mlx5_devx_regex_database_program(void *ctx, uint8_t engine, uint32_t umem_id,
107 				 uint64_t umem_offset)
108 {
109 	uint32_t out[MLX5_ST_SZ_DW(set_regexp_params_out)] = {0};
110 	uint32_t in[MLX5_ST_SZ_DW(set_regexp_params_in)] = {0};
111 	int ret;
112 
113 	MLX5_SET(set_regexp_params_in, in, opcode, MLX5_CMD_SET_REGEX_PARAMS);
114 	MLX5_SET(set_regexp_params_in, in, engine_id, engine);
115 	MLX5_SET(set_regexp_params_in, in, regexp_params.db_umem_id, umem_id);
116 	MLX5_SET64(set_regexp_params_in, in, regexp_params.db_umem_offset,
117 		   umem_offset);
118 	MLX5_SET(set_regexp_params_in, in, field_select.db_umem_id, 1);
119 	ret = mlx5_glue->devx_general_cmd(ctx, in, sizeof(in), out,
120 					  sizeof(out));
121 	if (ret) {
122 		DRV_LOG(ERR, "Database program failed %d", ret);
123 		rte_errno = errno;
124 		return -errno;
125 	}
126 	return 0;
127 }
128