mlx5_transobj.c revision 329213
1/*-
2 * Copyright (c) 2013-2017, Mellanox Technologies, Ltd.  All rights reserved.
3 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
6 * are met:
7 * 1. Redistributions of source code must retain the above copyright
8 *    notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright
10 *    notice, this list of conditions and the following disclaimer in the
11 *    documentation and/or other materials provided with the distribution.
12 *
13 * THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS `AS IS' AND
14 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
16 * ARE DISCLAIMED.  IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE
17 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
18 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
19 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
20 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
21 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
22 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
23 * SUCH DAMAGE.
24 *
25 * $FreeBSD: stable/11/sys/dev/mlx5/mlx5_core/mlx5_transobj.c 329213 2018-02-13 15:18:11Z hselasky $
26 */
27
28#include <dev/mlx5/driver.h>
29
30#include "mlx5_core.h"
31#include "transobj.h"
32
33int mlx5_alloc_transport_domain(struct mlx5_core_dev *dev, u32 *tdn)
34{
35	u32 in[MLX5_ST_SZ_DW(alloc_transport_domain_in)];
36	u32 out[MLX5_ST_SZ_DW(alloc_transport_domain_out)];
37	int err;
38
39	memset(in, 0, sizeof(in));
40	memset(out, 0, sizeof(out));
41
42	MLX5_SET(alloc_transport_domain_in, in, opcode,
43		 MLX5_CMD_OP_ALLOC_TRANSPORT_DOMAIN);
44
45	err = mlx5_cmd_exec_check_status(dev, in, sizeof(in), out, sizeof(out));
46	if (!err)
47		*tdn = MLX5_GET(alloc_transport_domain_out, out,
48				transport_domain);
49
50	return err;
51}
52
53void mlx5_dealloc_transport_domain(struct mlx5_core_dev *dev, u32 tdn)
54{
55	u32 in[MLX5_ST_SZ_DW(dealloc_transport_domain_in)];
56	u32 out[MLX5_ST_SZ_DW(dealloc_transport_domain_out)];
57
58	memset(in, 0, sizeof(in));
59	memset(out, 0, sizeof(out));
60
61	MLX5_SET(dealloc_transport_domain_in, in, opcode,
62		 MLX5_CMD_OP_DEALLOC_TRANSPORT_DOMAIN);
63	MLX5_SET(dealloc_transport_domain_in, in, transport_domain, tdn);
64
65	mlx5_cmd_exec_check_status(dev, in, sizeof(in), out, sizeof(out));
66}
67
68int mlx5_core_create_rq(struct mlx5_core_dev *dev, u32 *in, int inlen, u32 *rqn)
69{
70	u32 out[MLX5_ST_SZ_DW(create_rq_out)];
71	int err;
72
73	MLX5_SET(create_rq_in, in, opcode, MLX5_CMD_OP_CREATE_RQ);
74
75	memset(out, 0, sizeof(out));
76	err = mlx5_cmd_exec_check_status(dev, in, inlen, out, sizeof(out));
77	if (!err)
78		*rqn = MLX5_GET(create_rq_out, out, rqn);
79
80	return err;
81}
82
83int mlx5_core_modify_rq(struct mlx5_core_dev *dev, u32 *in, int inlen)
84{
85	u32 out[MLX5_ST_SZ_DW(modify_rq_out)];
86
87	MLX5_SET(modify_rq_in, in, opcode, MLX5_CMD_OP_MODIFY_RQ);
88
89	memset(out, 0, sizeof(out));
90	return mlx5_cmd_exec_check_status(dev, in, inlen, out, sizeof(out));
91}
92
93void mlx5_core_destroy_rq(struct mlx5_core_dev *dev, u32 rqn)
94{
95	u32 in[MLX5_ST_SZ_DW(destroy_rq_in)];
96	u32 out[MLX5_ST_SZ_DW(destroy_rq_out)];
97
98	memset(in, 0, sizeof(in));
99
100	MLX5_SET(destroy_rq_in, in, opcode, MLX5_CMD_OP_DESTROY_RQ);
101	MLX5_SET(destroy_rq_in, in, rqn, rqn);
102
103	mlx5_cmd_exec_check_status(dev, in, sizeof(in), out, sizeof(out));
104}
105
106int mlx5_core_query_rq(struct mlx5_core_dev *dev, u32 rqn, u32 *out)
107{
108	u32 in[MLX5_ST_SZ_DW(query_rq_in)];
109	int outlen = MLX5_ST_SZ_BYTES(query_rq_out);
110
111	memset(in, 0, sizeof(in));
112	MLX5_SET(query_rq_in, in, opcode, MLX5_CMD_OP_QUERY_RQ);
113	MLX5_SET(query_rq_in, in, rqn, rqn);
114
115	return mlx5_cmd_exec_check_status(dev, in, sizeof(in), out, outlen);
116}
117
118int mlx5_core_create_sq(struct mlx5_core_dev *dev, u32 *in, int inlen, u32 *sqn)
119{
120	u32 out[MLX5_ST_SZ_DW(create_sq_out)];
121	int err;
122
123	MLX5_SET(create_sq_in, in, opcode, MLX5_CMD_OP_CREATE_SQ);
124
125	memset(out, 0, sizeof(out));
126	err = mlx5_cmd_exec_check_status(dev, in, inlen, out, sizeof(out));
127	if (!err)
128		*sqn = MLX5_GET(create_sq_out, out, sqn);
129
130	return err;
131}
132
133int mlx5_core_modify_sq(struct mlx5_core_dev *dev, u32 *in, int inlen)
134{
135	u32 out[MLX5_ST_SZ_DW(modify_sq_out)];
136
137	MLX5_SET(modify_sq_in, in, opcode, MLX5_CMD_OP_MODIFY_SQ);
138
139	memset(out, 0, sizeof(out));
140	return mlx5_cmd_exec_check_status(dev, in, inlen, out, sizeof(out));
141}
142
143void mlx5_core_destroy_sq(struct mlx5_core_dev *dev, u32 sqn)
144{
145	u32 in[MLX5_ST_SZ_DW(destroy_sq_in)];
146	u32 out[MLX5_ST_SZ_DW(destroy_sq_out)];
147
148	memset(in, 0, sizeof(in));
149
150	MLX5_SET(destroy_sq_in, in, opcode, MLX5_CMD_OP_DESTROY_SQ);
151	MLX5_SET(destroy_sq_in, in, sqn, sqn);
152
153	mlx5_cmd_exec_check_status(dev, in, sizeof(in), out, sizeof(out));
154}
155
156int mlx5_core_query_sq(struct mlx5_core_dev *dev, u32 sqn, u32 *out)
157{
158	u32 in[MLX5_ST_SZ_DW(query_sq_in)];
159	int outlen = MLX5_ST_SZ_BYTES(query_sq_out);
160
161	memset(in, 0, sizeof(in));
162	MLX5_SET(query_sq_in, in, opcode, MLX5_CMD_OP_QUERY_SQ);
163	MLX5_SET(query_sq_in, in, sqn, sqn);
164
165	return mlx5_cmd_exec_check_status(dev, in, sizeof(in), out, outlen);
166}
167
168int mlx5_core_create_tir(struct mlx5_core_dev *dev, u32 *in, int inlen,
169			 u32 *tirn)
170{
171	u32 out[MLX5_ST_SZ_DW(create_tir_out)];
172	int err;
173
174	MLX5_SET(create_tir_in, in, opcode, MLX5_CMD_OP_CREATE_TIR);
175
176	memset(out, 0, sizeof(out));
177	err = mlx5_cmd_exec_check_status(dev, in, inlen, out, sizeof(out));
178	if (!err)
179		*tirn = MLX5_GET(create_tir_out, out, tirn);
180
181	return err;
182}
183
184void mlx5_core_destroy_tir(struct mlx5_core_dev *dev, u32 tirn)
185{
186	u32 in[MLX5_ST_SZ_DW(destroy_tir_in)];
187	u32 out[MLX5_ST_SZ_DW(destroy_tir_out)];
188
189	memset(in, 0, sizeof(in));
190
191	MLX5_SET(destroy_tir_in, in, opcode, MLX5_CMD_OP_DESTROY_TIR);
192	MLX5_SET(destroy_tir_in, in, tirn, tirn);
193
194	mlx5_cmd_exec_check_status(dev, in, sizeof(in), out, sizeof(out));
195}
196
197int mlx5_core_create_tis(struct mlx5_core_dev *dev, u32 *in, int inlen,
198			 u32 *tisn)
199{
200	u32 out[MLX5_ST_SZ_DW(create_tis_out)];
201	int err;
202
203	MLX5_SET(create_tis_in, in, opcode, MLX5_CMD_OP_CREATE_TIS);
204
205	memset(out, 0, sizeof(out));
206	err = mlx5_cmd_exec_check_status(dev, in, inlen, out, sizeof(out));
207	if (!err)
208		*tisn = MLX5_GET(create_tis_out, out, tisn);
209
210	return err;
211}
212
213int mlx5_core_modify_tis(struct mlx5_core_dev *dev, u32 tisn, u32 *in,
214			 int inlen)
215{
216	u32 out[MLX5_ST_SZ_DW(modify_tis_out)] = {0};
217
218	MLX5_SET(modify_tis_in, in, tisn, tisn);
219	MLX5_SET(modify_tis_in, in, opcode, MLX5_CMD_OP_MODIFY_TIS);
220
221	return mlx5_cmd_exec(dev, in, inlen, out, sizeof(out));
222}
223
224void mlx5_core_destroy_tis(struct mlx5_core_dev *dev, u32 tisn)
225{
226	u32 in[MLX5_ST_SZ_DW(destroy_tis_in)];
227	u32 out[MLX5_ST_SZ_DW(destroy_tis_out)];
228
229	memset(in, 0, sizeof(in));
230
231	MLX5_SET(destroy_tis_in, in, opcode, MLX5_CMD_OP_DESTROY_TIS);
232	MLX5_SET(destroy_tis_in, in, tisn, tisn);
233
234	mlx5_cmd_exec_check_status(dev, in, sizeof(in), out, sizeof(out));
235}
236
237int mlx5_core_create_rmp(struct mlx5_core_dev *dev, u32 *in, int inlen, u32 *rmpn)
238{
239	u32 out[MLX5_ST_SZ_DW(create_rmp_out)];
240	int err;
241
242	MLX5_SET(create_rmp_in, in, opcode, MLX5_CMD_OP_CREATE_RMP);
243
244	memset(out, 0, sizeof(out));
245	err = mlx5_cmd_exec_check_status(dev, in, inlen, out, sizeof(out));
246	if (!err)
247		*rmpn = MLX5_GET(create_rmp_out, out, rmpn);
248
249	return err;
250}
251
252int mlx5_core_modify_rmp(struct mlx5_core_dev *dev, u32 *in, int inlen)
253{
254	u32 out[MLX5_ST_SZ_DW(modify_rmp_out)];
255
256	MLX5_SET(modify_rmp_in, in, opcode, MLX5_CMD_OP_MODIFY_RMP);
257
258	memset(out, 0, sizeof(out));
259	return mlx5_cmd_exec_check_status(dev, in, inlen, out, sizeof(out));
260}
261
262int mlx5_core_destroy_rmp(struct mlx5_core_dev *dev, u32 rmpn)
263{
264	u32 in[MLX5_ST_SZ_DW(destroy_rmp_in)];
265	u32 out[MLX5_ST_SZ_DW(destroy_rmp_out)];
266
267	memset(in, 0, sizeof(in));
268
269	MLX5_SET(destroy_rmp_in, in, opcode, MLX5_CMD_OP_DESTROY_RMP);
270	MLX5_SET(destroy_rmp_in, in, rmpn, rmpn);
271
272	return mlx5_cmd_exec_check_status(dev, in, sizeof(in), out, sizeof(out));
273}
274
275int mlx5_core_query_rmp(struct mlx5_core_dev *dev, u32 rmpn, u32 *out)
276{
277	u32 in[MLX5_ST_SZ_DW(query_rmp_in)];
278	int outlen = MLX5_ST_SZ_BYTES(query_rmp_out);
279
280	memset(in, 0, sizeof(in));
281	MLX5_SET(query_rmp_in, in, opcode, MLX5_CMD_OP_QUERY_RMP);
282	MLX5_SET(query_rmp_in, in, rmpn,   rmpn);
283
284	return mlx5_cmd_exec_check_status(dev, in, sizeof(in), out, outlen);
285}
286
287int mlx5_core_arm_rmp(struct mlx5_core_dev *dev, u32 rmpn, u16 lwm)
288{
289	void *in;
290	void *rmpc;
291	void *wq;
292	void *bitmask;
293	int  err;
294
295	in = mlx5_vzalloc(MLX5_ST_SZ_BYTES(modify_rmp_in));
296	if (!in)
297		return -ENOMEM;
298
299	rmpc    = MLX5_ADDR_OF(modify_rmp_in,   in,   ctx);
300	bitmask = MLX5_ADDR_OF(modify_rmp_in,   in,   bitmask);
301	wq      = MLX5_ADDR_OF(rmpc,	        rmpc, wq);
302
303	MLX5_SET(modify_rmp_in, in,	 rmp_state, MLX5_RMPC_STATE_RDY);
304	MLX5_SET(modify_rmp_in, in,	 rmpn,      rmpn);
305	MLX5_SET(wq,		wq,	 lwm,	    lwm);
306	MLX5_SET(rmp_bitmask,	bitmask, lwm,	    1);
307	MLX5_SET(rmpc,		rmpc,	 state,	    MLX5_RMPC_STATE_RDY);
308
309	err =  mlx5_core_modify_rmp(dev, in, MLX5_ST_SZ_BYTES(modify_rmp_in));
310
311	kvfree(in);
312
313	return err;
314}
315
316int mlx5_core_create_xsrq(struct mlx5_core_dev *dev, u32 *in, int inlen, u32 *xsrqn)
317{
318	u32 out[MLX5_ST_SZ_DW(create_xrc_srq_out)];
319	int err;
320
321	MLX5_SET(create_xrc_srq_in, in, opcode,     MLX5_CMD_OP_CREATE_XRC_SRQ);
322
323	memset(out, 0, sizeof(out));
324	err = mlx5_cmd_exec_check_status(dev, in, inlen, out, sizeof(out));
325	if (!err)
326		*xsrqn = MLX5_GET(create_xrc_srq_out, out, xrc_srqn);
327
328	return err;
329}
330
331int mlx5_core_destroy_xsrq(struct mlx5_core_dev *dev, u32 xsrqn)
332{
333	u32 in[MLX5_ST_SZ_DW(destroy_xrc_srq_in)];
334	u32 out[MLX5_ST_SZ_DW(destroy_xrc_srq_out)];
335
336	memset(in, 0, sizeof(in));
337	memset(out, 0, sizeof(out));
338
339	MLX5_SET(destroy_xrc_srq_in, in, opcode,   MLX5_CMD_OP_DESTROY_XRC_SRQ);
340	MLX5_SET(destroy_xrc_srq_in, in, xrc_srqn, xsrqn);
341
342	return mlx5_cmd_exec_check_status(dev, in, sizeof(in), out,
343					  sizeof(out));
344}
345
346int mlx5_core_query_xsrq(struct mlx5_core_dev *dev, u32 xsrqn, u32 *out)
347{
348	u32 in[MLX5_ST_SZ_DW(query_xrc_srq_in)];
349	void *srqc;
350	void *xrc_srqc;
351	int err;
352
353	memset(in, 0, sizeof(in));
354	MLX5_SET(query_xrc_srq_in, in, opcode,   MLX5_CMD_OP_QUERY_XRC_SRQ);
355	MLX5_SET(query_xrc_srq_in, in, xrc_srqn, xsrqn);
356
357	err =  mlx5_cmd_exec_check_status(dev, in, sizeof(in),
358					  out,
359					  MLX5_ST_SZ_BYTES(query_xrc_srq_out));
360	if (!err) {
361		xrc_srqc = MLX5_ADDR_OF(query_xrc_srq_out, out,
362					xrc_srq_context_entry);
363		srqc = MLX5_ADDR_OF(query_srq_out, out, srq_context_entry);
364		memcpy(srqc, xrc_srqc, MLX5_ST_SZ_BYTES(srqc));
365	}
366
367	return err;
368}
369
370int mlx5_core_arm_xsrq(struct mlx5_core_dev *dev, u32 xsrqn, u16 lwm)
371{
372	u32 in[MLX5_ST_SZ_DW(arm_xrc_srq_in)];
373	u32 out[MLX5_ST_SZ_DW(arm_xrc_srq_out)];
374
375	memset(in, 0, sizeof(in));
376	memset(out, 0, sizeof(out));
377
378	MLX5_SET(arm_xrc_srq_in, in, opcode,   MLX5_CMD_OP_ARM_XRC_SRQ);
379	MLX5_SET(arm_xrc_srq_in, in, xrc_srqn, xsrqn);
380	MLX5_SET(arm_xrc_srq_in, in, lwm,      lwm);
381	MLX5_SET(arm_xrc_srq_in, in, op_mod,
382		 MLX5_ARM_XRC_SRQ_IN_OP_MOD_XRC_SRQ);
383
384	return  mlx5_cmd_exec_check_status(dev, in, sizeof(in), out,
385					   sizeof(out));
386
387}
388
389int mlx5_core_create_rqt(struct mlx5_core_dev *dev, u32 *in, int inlen,
390			 u32 *rqtn)
391{
392	u32 out[MLX5_ST_SZ_DW(create_rqt_out)];
393	int err;
394
395	MLX5_SET(create_rqt_in, in, opcode, MLX5_CMD_OP_CREATE_RQT);
396
397	memset(out, 0, sizeof(out));
398	err = mlx5_cmd_exec_check_status(dev, in, inlen, out, sizeof(out));
399	if (!err)
400		*rqtn = MLX5_GET(create_rqt_out, out, rqtn);
401
402	return err;
403}
404
405int mlx5_core_modify_rqt(struct mlx5_core_dev *dev, u32 rqtn, u32 *in,
406			 int inlen)
407{
408	u32 out[MLX5_ST_SZ_DW(modify_rqt_out)];
409
410	MLX5_SET(modify_rqt_in, in, rqtn, rqtn);
411	MLX5_SET(modify_rqt_in, in, opcode, MLX5_CMD_OP_MODIFY_RQT);
412
413	memset(out, 0, sizeof(out));
414	return mlx5_cmd_exec_check_status(dev, in, inlen, out, sizeof(out));
415}
416
417void mlx5_core_destroy_rqt(struct mlx5_core_dev *dev, u32 rqtn)
418{
419	u32 in[MLX5_ST_SZ_DW(destroy_rqt_in)];
420	u32 out[MLX5_ST_SZ_DW(destroy_rqt_out)];
421
422	memset(in, 0, sizeof(in));
423
424	MLX5_SET(destroy_rqt_in, in, opcode, MLX5_CMD_OP_DESTROY_RQT);
425	MLX5_SET(destroy_rqt_in, in, rqtn, rqtn);
426
427	mlx5_cmd_exec_check_status(dev, in, sizeof(in), out, sizeof(out));
428}
429