mlx5_transobj.c revision 290650
1219974Smav/*-
2219974Smav * Copyright (c) 2013-2015, Mellanox Technologies, Ltd.  All rights reserved.
3219974Smav *
4219974Smav * Redistribution and use in source and binary forms, with or without
5219974Smav * modification, are permitted provided that the following conditions
6219974Smav * are met:
7219974Smav * 1. Redistributions of source code must retain the above copyright
8219974Smav *    notice, this list of conditions and the following disclaimer.
9219974Smav * 2. Redistributions in binary form must reproduce the above copyright
10219974Smav *    notice, this list of conditions and the following disclaimer in the
11219974Smav *    documentation and/or other materials provided with the distribution.
12219974Smav *
13219974Smav * THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS `AS IS' AND
14219974Smav * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15219974Smav * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
16219974Smav * ARE DISCLAIMED.  IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE
17219974Smav * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
18219974Smav * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
19219974Smav * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
20219974Smav * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
21219974Smav * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
22219974Smav * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
23219974Smav * SUCH DAMAGE.
24219974Smav *
25219974Smav * $FreeBSD: head/sys/dev/mlx5/mlx5_core/mlx5_transobj.c 290650 2015-11-10 12:20:22Z hselasky $
26219974Smav */
27249092Sjoel
28219974Smav#include <dev/mlx5/driver.h>
29219974Smav
30219974Smav#include "mlx5_core.h"
31219974Smav#include "transobj.h"
32219974Smav
33219974Smavint mlx5_alloc_transport_domain(struct mlx5_core_dev *dev, u32 *tdn)
34219974Smav{
35219974Smav	u32 in[MLX5_ST_SZ_DW(alloc_transport_domain_in)];
36219974Smav	u32 out[MLX5_ST_SZ_DW(alloc_transport_domain_out)];
37234940Smav	int err;
38219974Smav
39219974Smav	memset(in, 0, sizeof(in));
40219974Smav	memset(out, 0, sizeof(out));
41219974Smav
42219974Smav	MLX5_SET(alloc_transport_domain_in, in, opcode,
43219974Smav		 MLX5_CMD_OP_ALLOC_TRANSPORT_DOMAIN);
44219974Smav
45219974Smav	err = mlx5_cmd_exec_check_status(dev, in, sizeof(in), out, sizeof(out));
46219974Smav	if (!err)
47219974Smav		*tdn = MLX5_GET(alloc_transport_domain_out, out,
48219974Smav				transport_domain);
49219974Smav
50219974Smav	return err;
51219974Smav}
52219974Smav
53219974Smavvoid mlx5_dealloc_transport_domain(struct mlx5_core_dev *dev, u32 tdn)
54219974Smav{
55219974Smav	u32 in[MLX5_ST_SZ_DW(dealloc_transport_domain_in)];
56219974Smav	u32 out[MLX5_ST_SZ_DW(dealloc_transport_domain_out)];
57219974Smav
58219974Smav	memset(in, 0, sizeof(in));
59219974Smav	memset(out, 0, sizeof(out));
60219974Smav
61219974Smav	MLX5_SET(dealloc_transport_domain_in, in, opcode,
62219974Smav		 MLX5_CMD_OP_DEALLOC_TRANSPORT_DOMAIN);
63219974Smav	MLX5_SET(dealloc_transport_domain_in, in, transport_domain, tdn);
64219974Smav
65219974Smav	mlx5_cmd_exec_check_status(dev, in, sizeof(in), out, sizeof(out));
66219974Smav}
67219974Smav
68219974Smavint mlx5_core_create_rq(struct mlx5_core_dev *dev, u32 *in, int inlen, u32 *rqn)
69219974Smav{
70219974Smav	u32 out[MLX5_ST_SZ_DW(create_rq_out)];
71219974Smav	int err;
72219974Smav
73219974Smav	MLX5_SET(create_rq_in, in, opcode, MLX5_CMD_OP_CREATE_RQ);
74219974Smav
75219974Smav	memset(out, 0, sizeof(out));
76219974Smav	err = mlx5_cmd_exec_check_status(dev, in, inlen, out, sizeof(out));
77219974Smav	if (!err)
78219974Smav		*rqn = MLX5_GET(create_rq_out, out, rqn);
79219974Smav
80219974Smav	return err;
81219974Smav}
82219974Smav
83219974Smavint mlx5_core_modify_rq(struct mlx5_core_dev *dev, u32 *in, int inlen)
84219974Smav{
85219974Smav	u32 out[MLX5_ST_SZ_DW(modify_rq_out)];
86219974Smav
87219974Smav	MLX5_SET(modify_rq_in, in, opcode, MLX5_CMD_OP_MODIFY_RQ);
88237620Swblock
89219974Smav	memset(out, 0, sizeof(out));
90219974Smav	return mlx5_cmd_exec_check_status(dev, in, inlen, out, sizeof(out));
91219974Smav}
92219974Smav
93219974Smavvoid mlx5_core_destroy_rq(struct mlx5_core_dev *dev, u32 rqn)
94219974Smav{
95219974Smav	u32 in[MLX5_ST_SZ_DW(destroy_rq_in)];
96219974Smav	u32 out[MLX5_ST_SZ_DW(destroy_rq_out)];
97219974Smav
98219974Smav	memset(in, 0, sizeof(in));
99219974Smav
100219974Smav	MLX5_SET(destroy_rq_in, in, opcode, MLX5_CMD_OP_DESTROY_RQ);
101219974Smav	MLX5_SET(destroy_rq_in, in, rqn, rqn);
102219974Smav
103219974Smav	mlx5_cmd_exec_check_status(dev, in, sizeof(in), out, sizeof(out));
104219974Smav}
105219974Smav
106219974Smavint mlx5_core_create_sq(struct mlx5_core_dev *dev, u32 *in, int inlen, u32 *sqn)
107219974Smav{
108219974Smav	u32 out[MLX5_ST_SZ_DW(create_sq_out)];
109219974Smav	int err;
110219974Smav
111219974Smav	MLX5_SET(create_sq_in, in, opcode, MLX5_CMD_OP_CREATE_SQ);
112219974Smav
113219974Smav	memset(out, 0, sizeof(out));
114219974Smav	err = mlx5_cmd_exec_check_status(dev, in, inlen, out, sizeof(out));
115219974Smav	if (!err)
116219974Smav		*sqn = MLX5_GET(create_sq_out, out, sqn);
117219974Smav
118219974Smav	return err;
119219974Smav}
120219974Smav
121219974Smavint mlx5_core_modify_sq(struct mlx5_core_dev *dev, u32 *in, int inlen)
122219974Smav{
123234940Smav	u32 out[MLX5_ST_SZ_DW(modify_sq_out)];
124234940Smav
125219974Smav	MLX5_SET(modify_sq_in, in, opcode, MLX5_CMD_OP_MODIFY_SQ);
126219974Smav
127219974Smav	memset(out, 0, sizeof(out));
128219974Smav	return mlx5_cmd_exec_check_status(dev, in, inlen, out, sizeof(out));
129219974Smav}
130219974Smav
131219974Smavvoid mlx5_core_destroy_sq(struct mlx5_core_dev *dev, u32 sqn)
132219974Smav{
133219974Smav	u32 in[MLX5_ST_SZ_DW(destroy_sq_in)];
134219974Smav	u32 out[MLX5_ST_SZ_DW(destroy_sq_out)];
135219974Smav
136219974Smav	memset(in, 0, sizeof(in));
137219974Smav
138219974Smav	MLX5_SET(destroy_sq_in, in, opcode, MLX5_CMD_OP_DESTROY_SQ);
139219974Smav	MLX5_SET(destroy_sq_in, in, sqn, sqn);
140219974Smav
141219974Smav	mlx5_cmd_exec_check_status(dev, in, sizeof(in), out, sizeof(out));
142219974Smav}
143219974Smav
144219974Smavint mlx5_core_create_tir(struct mlx5_core_dev *dev, u32 *in, int inlen,
145219974Smav			 u32 *tirn)
146219974Smav{
147219974Smav	u32 out[MLX5_ST_SZ_DW(create_tir_out)];
148219974Smav	int err;
149219974Smav
150219974Smav	MLX5_SET(create_tir_in, in, opcode, MLX5_CMD_OP_CREATE_TIR);
151219974Smav
152219974Smav	memset(out, 0, sizeof(out));
153219974Smav	err = mlx5_cmd_exec_check_status(dev, in, inlen, out, sizeof(out));
154219974Smav	if (!err)
155219974Smav		*tirn = MLX5_GET(create_tir_out, out, tirn);
156219974Smav
157219974Smav	return err;
158219974Smav}
159219974Smav
160219974Smavvoid mlx5_core_destroy_tir(struct mlx5_core_dev *dev, u32 tirn)
161219974Smav{
162219974Smav	u32 in[MLX5_ST_SZ_DW(destroy_tir_in)];
163219974Smav	u32 out[MLX5_ST_SZ_DW(destroy_tir_out)];
164219974Smav
165219974Smav	memset(in, 0, sizeof(in));
166219974Smav
167219974Smav	MLX5_SET(destroy_tir_in, in, opcode, MLX5_CMD_OP_DESTROY_TIR);
168219974Smav	MLX5_SET(destroy_tir_in, in, tirn, tirn);
169219974Smav
170219974Smav	mlx5_cmd_exec_check_status(dev, in, sizeof(in), out, sizeof(out));
171219974Smav}
172219974Smav
173219974Smavint mlx5_core_create_tis(struct mlx5_core_dev *dev, u32 *in, int inlen,
174219974Smav			 u32 *tisn)
175219974Smav{
176219974Smav	u32 out[MLX5_ST_SZ_DW(create_tis_out)];
177219974Smav	int err;
178219974Smav
179219974Smav	MLX5_SET(create_tis_in, in, opcode, MLX5_CMD_OP_CREATE_TIS);
180219974Smav
181219974Smav	memset(out, 0, sizeof(out));
182219974Smav	err = mlx5_cmd_exec_check_status(dev, in, inlen, out, sizeof(out));
183219974Smav	if (!err)
184219974Smav		*tisn = MLX5_GET(create_tis_out, out, tisn);
185219974Smav
186219974Smav	return err;
187219974Smav}
188219974Smav
189219974Smavvoid mlx5_core_destroy_tis(struct mlx5_core_dev *dev, u32 tisn)
190219974Smav{
191219974Smav	u32 in[MLX5_ST_SZ_DW(destroy_tis_in)];
192219974Smav	u32 out[MLX5_ST_SZ_DW(destroy_tis_out)];
193219974Smav
194219974Smav	memset(in, 0, sizeof(in));
195219974Smav
196219974Smav	MLX5_SET(destroy_tis_in, in, opcode, MLX5_CMD_OP_DESTROY_TIS);
197219974Smav	MLX5_SET(destroy_tis_in, in, tisn, tisn);
198219974Smav
199219974Smav	mlx5_cmd_exec_check_status(dev, in, sizeof(in), out, sizeof(out));
200219974Smav}
201219974Smav
202219974Smavint mlx5_core_create_rmp(struct mlx5_core_dev *dev, u32 *in, int inlen, u32 *rmpn)
203219974Smav{
204219974Smav	u32 out[MLX5_ST_SZ_DW(create_rmp_out)];
205219974Smav	int err;
206234848Smav
207234848Smav	MLX5_SET(create_rmp_in, in, opcode, MLX5_CMD_OP_CREATE_RMP);
208234848Smav
209234848Smav	memset(out, 0, sizeof(out));
210234848Smav	err = mlx5_cmd_exec_check_status(dev, in, inlen, out, sizeof(out));
211234940Smav	if (!err)
212234940Smav		*rmpn = MLX5_GET(create_rmp_out, out, rmpn);
213234848Smav
214234848Smav	return err;
215234848Smav}
216234848Smav
217234848Smavint mlx5_core_modify_rmp(struct mlx5_core_dev *dev, u32 *in, int inlen)
218235076Smav{
219234940Smav	u32 out[MLX5_ST_SZ_DW(modify_rmp_out)];
220234940Smav
221234940Smav	MLX5_SET(modify_rmp_in, in, opcode, MLX5_CMD_OP_MODIFY_RMP);
222234940Smav
223219974Smav	memset(out, 0, sizeof(out));
224219974Smav	return mlx5_cmd_exec_check_status(dev, in, inlen, out, sizeof(out));
225219974Smav}
226219974Smav
227219974Smavint mlx5_core_destroy_rmp(struct mlx5_core_dev *dev, u32 rmpn)
228219974Smav{
229219974Smav	u32 in[MLX5_ST_SZ_DW(destroy_rmp_in)];
230219974Smav	u32 out[MLX5_ST_SZ_DW(destroy_rmp_out)];
231219974Smav
232219974Smav	memset(in, 0, sizeof(in));
233219974Smav
234219974Smav	MLX5_SET(destroy_rmp_in, in, opcode, MLX5_CMD_OP_DESTROY_RMP);
235219974Smav	MLX5_SET(destroy_rmp_in, in, rmpn, rmpn);
236219974Smav
237219974Smav	return mlx5_cmd_exec_check_status(dev, in, sizeof(in), out, sizeof(out));
238219974Smav}
239219974Smav
240219974Smavint mlx5_core_query_rmp(struct mlx5_core_dev *dev, u32 rmpn, u32 *out)
241219974Smav{
242219974Smav	u32 in[MLX5_ST_SZ_DW(query_rmp_in)];
243219974Smav	int outlen = MLX5_ST_SZ_BYTES(query_rmp_out);
244219974Smav
245249087Sjoel	memset(in, 0, sizeof(in));
246219974Smav	MLX5_SET(query_rmp_in, in, opcode, MLX5_CMD_OP_QUERY_RMP);
247219974Smav	MLX5_SET(query_rmp_in, in, rmpn,   rmpn);
248219974Smav
249219974Smav	return mlx5_cmd_exec_check_status(dev, in, sizeof(in), out, outlen);
250219974Smav}
251219974Smav
252219974Smavint mlx5_core_arm_rmp(struct mlx5_core_dev *dev, u32 rmpn, u16 lwm)
253219974Smav{
254219974Smav	void *in;
255219974Smav	void *rmpc;
256219974Smav	void *wq;
257219974Smav	void *bitmask;
258219974Smav	int  err;
259219974Smav
260219974Smav	in = mlx5_vzalloc(MLX5_ST_SZ_BYTES(modify_rmp_in));
261219974Smav	if (!in)
262219974Smav		return -ENOMEM;
263234993Smav
264234993Smav	rmpc    = MLX5_ADDR_OF(modify_rmp_in,   in,   ctx);
265234993Smav	bitmask = MLX5_ADDR_OF(modify_rmp_in,   in,   bitmask);
266235076Smav	wq      = MLX5_ADDR_OF(rmpc,	        rmpc, wq);
267235076Smav
268219974Smav	MLX5_SET(modify_rmp_in, in,	 rmp_state, MLX5_RMPC_STATE_RDY);
269219974Smav	MLX5_SET(modify_rmp_in, in,	 rmpn,      rmpn);
270219974Smav	MLX5_SET(wq,		wq,	 lwm,	    lwm);
271219974Smav	MLX5_SET(rmp_bitmask,	bitmask, lwm,	    1);
272219974Smav	MLX5_SET(rmpc,		rmpc,	 state,	    MLX5_RMPC_STATE_RDY);
273219974Smav
274219974Smav	err =  mlx5_core_modify_rmp(dev, in, MLX5_ST_SZ_BYTES(modify_rmp_in));
275226816Smav
276226816Smav	kvfree(in);
277235071Smav
278235071Smav	return err;
279235071Smav}
280235071Smav
281235071Smavint mlx5_core_create_xsrq(struct mlx5_core_dev *dev, u32 *in, int inlen, u32 *xsrqn)
282235071Smav{
283235071Smav	u32 out[MLX5_ST_SZ_DW(create_xrc_srq_out)];
284235071Smav	int err;
285235071Smav
286235071Smav	MLX5_SET(create_xrc_srq_in, in, opcode,     MLX5_CMD_OP_CREATE_XRC_SRQ);
287235071Smav
288235071Smav	memset(out, 0, sizeof(out));
289235071Smav	err = mlx5_cmd_exec_check_status(dev, in, inlen, out, sizeof(out));
290235071Smav	if (!err)
291235071Smav		*xsrqn = MLX5_GET(create_xrc_srq_out, out, xrc_srqn);
292235071Smav
293235071Smav	return err;
294240465Smav}
295240465Smav
296235071Smavint mlx5_core_destroy_xsrq(struct mlx5_core_dev *dev, u32 xsrqn)
297235873Swblock{
298235071Smav	u32 in[MLX5_ST_SZ_DW(destroy_xrc_srq_in)];
299235071Smav	u32 out[MLX5_ST_SZ_DW(destroy_xrc_srq_out)];
300235071Smav
301235071Smav	memset(in, 0, sizeof(in));
302235071Smav	memset(out, 0, sizeof(out));
303235071Smav
304235071Smav	MLX5_SET(destroy_xrc_srq_in, in, opcode,   MLX5_CMD_OP_DESTROY_XRC_SRQ);
305240465Smav	MLX5_SET(destroy_xrc_srq_in, in, xrc_srqn, xsrqn);
306240465Smav
307248068Ssbruno	return mlx5_cmd_exec_check_status(dev, in, sizeof(in), out,
308249092Sjoel					  sizeof(out));
309248068Ssbruno}
310235071Smav
311219974Smavint mlx5_core_query_xsrq(struct mlx5_core_dev *dev, u32 xsrqn, u32 *out)
312219974Smav{
313219974Smav	u32 in[MLX5_ST_SZ_DW(query_xrc_srq_in)];
314219974Smav	void *srqc;
315219974Smav	void *xrc_srqc;
316248385Sjoel	int err;
317219974Smav
318219974Smav	memset(in, 0, sizeof(in));
319219974Smav	MLX5_SET(query_xrc_srq_in, in, opcode,   MLX5_CMD_OP_QUERY_XRC_SRQ);
320219974Smav	MLX5_SET(query_xrc_srq_in, in, xrc_srqn, xsrqn);
321219974Smav
322219974Smav	err =  mlx5_cmd_exec_check_status(dev, in, sizeof(in),
323219974Smav					  out,
324219974Smav					  MLX5_ST_SZ_BYTES(query_xrc_srq_out));
325	if (!err) {
326		xrc_srqc = MLX5_ADDR_OF(query_xrc_srq_out, out,
327					xrc_srq_context_entry);
328		srqc = MLX5_ADDR_OF(query_srq_out, out, srq_context_entry);
329		memcpy(srqc, xrc_srqc, MLX5_ST_SZ_BYTES(srqc));
330	}
331
332	return err;
333}
334
335int mlx5_core_arm_xsrq(struct mlx5_core_dev *dev, u32 xsrqn, u16 lwm)
336{
337	u32 in[MLX5_ST_SZ_DW(arm_xrc_srq_in)];
338	u32 out[MLX5_ST_SZ_DW(arm_xrc_srq_out)];
339
340	memset(in, 0, sizeof(in));
341	memset(out, 0, sizeof(out));
342
343	MLX5_SET(arm_xrc_srq_in, in, opcode,   MLX5_CMD_OP_ARM_XRC_SRQ);
344	MLX5_SET(arm_xrc_srq_in, in, xrc_srqn, xsrqn);
345	MLX5_SET(arm_xrc_srq_in, in, lwm,      lwm);
346	MLX5_SET(arm_xrc_srq_in, in, op_mod,
347		 MLX5_ARM_XRC_SRQ_IN_OP_MOD_XRC_SRQ);
348
349	return  mlx5_cmd_exec_check_status(dev, in, sizeof(in), out,
350					   sizeof(out));
351
352}
353
354int mlx5_core_create_rqt(struct mlx5_core_dev *dev, u32 *in, int inlen,
355			 u32 *rqtn)
356{
357	u32 out[MLX5_ST_SZ_DW(create_rqt_out)];
358	int err;
359
360	MLX5_SET(create_rqt_in, in, opcode, MLX5_CMD_OP_CREATE_RQT);
361
362	memset(out, 0, sizeof(out));
363	err = mlx5_cmd_exec_check_status(dev, in, inlen, out, sizeof(out));
364	if (!err)
365		*rqtn = MLX5_GET(create_rqt_out, out, rqtn);
366
367	return err;
368}
369
370int mlx5_core_modify_rqt(struct mlx5_core_dev *dev, u32 rqtn, u32 *in,
371			 int inlen)
372{
373	u32 out[MLX5_ST_SZ_DW(modify_rqt_out)];
374
375	MLX5_SET(modify_rqt_in, in, rqtn, rqtn);
376	MLX5_SET(modify_rqt_in, in, opcode, MLX5_CMD_OP_MODIFY_RQT);
377
378	memset(out, 0, sizeof(out));
379	return mlx5_cmd_exec_check_status(dev, in, inlen, out, sizeof(out));
380}
381
382void mlx5_core_destroy_rqt(struct mlx5_core_dev *dev, u32 rqtn)
383{
384	u32 in[MLX5_ST_SZ_DW(destroy_rqt_in)];
385	u32 out[MLX5_ST_SZ_DW(destroy_rqt_out)];
386
387	memset(in, 0, sizeof(in));
388
389	MLX5_SET(destroy_rqt_in, in, opcode, MLX5_CMD_OP_DESTROY_RQT);
390	MLX5_SET(destroy_rqt_in, in, rqtn, rqtn);
391
392	mlx5_cmd_exec_check_status(dev, in, sizeof(in), out, sizeof(out));
393}
394