2 * Copyright (c) 2013-2015, Mellanox Technologies, Ltd. All rights reserved.
4 * This software is available to you under a choice of one of two
5 * licenses. You may choose to be licensed under the terms of the GNU
6 * General Public License (GPL) Version 2, available from the file
7 * COPYING in the main directory of this source tree, or the
8 * OpenIB.org BSD license below:
10 * Redistribution and use in source and binary forms, with or
11 * without modification, are permitted provided that the following
14 * - Redistributions of source code must retain the above
15 * copyright notice, this list of conditions and the following
18 * - Redistributions in binary form must reproduce the above
19 * copyright notice, this list of conditions and the following
20 * disclaimer in the documentation and/or other materials
21 * provided with the distribution.
23 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
24 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
25 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
26 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
27 * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
28 * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
29 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
33 #include <linux/mlx5/driver.h>
34 #include "mlx5_core.h"
35 #include <linux/mlx5/transobj.h>
37 int mlx5_core_alloc_transport_domain(struct mlx5_core_dev
*dev
, u32
*tdn
)
39 u32 in
[MLX5_ST_SZ_DW(alloc_transport_domain_in
)];
40 u32 out
[MLX5_ST_SZ_DW(alloc_transport_domain_out
)];
43 memset(in
, 0, sizeof(in
));
44 memset(out
, 0, sizeof(out
));
46 MLX5_SET(alloc_transport_domain_in
, in
, opcode
,
47 MLX5_CMD_OP_ALLOC_TRANSPORT_DOMAIN
);
49 err
= mlx5_cmd_exec_check_status(dev
, in
, sizeof(in
), out
, sizeof(out
));
51 *tdn
= MLX5_GET(alloc_transport_domain_out
, out
,
56 EXPORT_SYMBOL(mlx5_core_alloc_transport_domain
);
58 void mlx5_core_dealloc_transport_domain(struct mlx5_core_dev
*dev
, u32 tdn
)
60 u32 in
[MLX5_ST_SZ_DW(dealloc_transport_domain_in
)];
61 u32 out
[MLX5_ST_SZ_DW(dealloc_transport_domain_out
)];
63 memset(in
, 0, sizeof(in
));
64 memset(out
, 0, sizeof(out
));
66 MLX5_SET(dealloc_transport_domain_in
, in
, opcode
,
67 MLX5_CMD_OP_DEALLOC_TRANSPORT_DOMAIN
);
68 MLX5_SET(dealloc_transport_domain_in
, in
, transport_domain
, tdn
);
70 mlx5_cmd_exec_check_status(dev
, in
, sizeof(in
), out
, sizeof(out
));
72 EXPORT_SYMBOL(mlx5_core_dealloc_transport_domain
);
74 int mlx5_core_create_rq(struct mlx5_core_dev
*dev
, u32
*in
, int inlen
, u32
*rqn
)
76 u32 out
[MLX5_ST_SZ_DW(create_rq_out
)];
79 MLX5_SET(create_rq_in
, in
, opcode
, MLX5_CMD_OP_CREATE_RQ
);
81 memset(out
, 0, sizeof(out
));
82 err
= mlx5_cmd_exec_check_status(dev
, in
, inlen
, out
, sizeof(out
));
84 *rqn
= MLX5_GET(create_rq_out
, out
, rqn
);
88 EXPORT_SYMBOL(mlx5_core_create_rq
);
90 int mlx5_core_modify_rq(struct mlx5_core_dev
*dev
, u32 rqn
, u32
*in
, int inlen
)
92 u32 out
[MLX5_ST_SZ_DW(modify_rq_out
)];
94 MLX5_SET(modify_rq_in
, in
, rqn
, rqn
);
95 MLX5_SET(modify_rq_in
, in
, opcode
, MLX5_CMD_OP_MODIFY_RQ
);
97 memset(out
, 0, sizeof(out
));
98 return mlx5_cmd_exec_check_status(dev
, in
, inlen
, out
, sizeof(out
));
100 EXPORT_SYMBOL(mlx5_core_modify_rq
);
102 void mlx5_core_destroy_rq(struct mlx5_core_dev
*dev
, u32 rqn
)
104 u32 in
[MLX5_ST_SZ_DW(destroy_rq_in
)];
105 u32 out
[MLX5_ST_SZ_DW(destroy_rq_out
)];
107 memset(in
, 0, sizeof(in
));
109 MLX5_SET(destroy_rq_in
, in
, opcode
, MLX5_CMD_OP_DESTROY_RQ
);
110 MLX5_SET(destroy_rq_in
, in
, rqn
, rqn
);
112 mlx5_cmd_exec_check_status(dev
, in
, sizeof(in
), out
, sizeof(out
));
114 EXPORT_SYMBOL(mlx5_core_destroy_rq
);
116 int mlx5_core_query_rq(struct mlx5_core_dev
*dev
, u32 rqn
, u32
*out
)
118 u32 in
[MLX5_ST_SZ_DW(query_rq_in
)] = {0};
119 int outlen
= MLX5_ST_SZ_BYTES(query_rq_out
);
121 MLX5_SET(query_rq_in
, in
, opcode
, MLX5_CMD_OP_QUERY_RQ
);
122 MLX5_SET(query_rq_in
, in
, rqn
, rqn
);
124 return mlx5_cmd_exec_check_status(dev
, in
, sizeof(in
), out
, outlen
);
126 EXPORT_SYMBOL(mlx5_core_query_rq
);
128 int mlx5_core_create_sq(struct mlx5_core_dev
*dev
, u32
*in
, int inlen
, u32
*sqn
)
130 u32 out
[MLX5_ST_SZ_DW(create_sq_out
)];
133 MLX5_SET(create_sq_in
, in
, opcode
, MLX5_CMD_OP_CREATE_SQ
);
135 memset(out
, 0, sizeof(out
));
136 err
= mlx5_cmd_exec_check_status(dev
, in
, inlen
, out
, sizeof(out
));
138 *sqn
= MLX5_GET(create_sq_out
, out
, sqn
);
143 int mlx5_core_modify_sq(struct mlx5_core_dev
*dev
, u32 sqn
, u32
*in
, int inlen
)
145 u32 out
[MLX5_ST_SZ_DW(modify_sq_out
)];
147 MLX5_SET(modify_sq_in
, in
, sqn
, sqn
);
148 MLX5_SET(modify_sq_in
, in
, opcode
, MLX5_CMD_OP_MODIFY_SQ
);
150 memset(out
, 0, sizeof(out
));
151 return mlx5_cmd_exec_check_status(dev
, in
, inlen
, out
, sizeof(out
));
153 EXPORT_SYMBOL(mlx5_core_modify_sq
);
155 void mlx5_core_destroy_sq(struct mlx5_core_dev
*dev
, u32 sqn
)
157 u32 in
[MLX5_ST_SZ_DW(destroy_sq_in
)];
158 u32 out
[MLX5_ST_SZ_DW(destroy_sq_out
)];
160 memset(in
, 0, sizeof(in
));
162 MLX5_SET(destroy_sq_in
, in
, opcode
, MLX5_CMD_OP_DESTROY_SQ
);
163 MLX5_SET(destroy_sq_in
, in
, sqn
, sqn
);
165 mlx5_cmd_exec_check_status(dev
, in
, sizeof(in
), out
, sizeof(out
));
168 int mlx5_core_query_sq(struct mlx5_core_dev
*dev
, u32 sqn
, u32
*out
)
170 u32 in
[MLX5_ST_SZ_DW(query_sq_in
)] = {0};
171 int outlen
= MLX5_ST_SZ_BYTES(query_sq_out
);
173 MLX5_SET(query_sq_in
, in
, opcode
, MLX5_CMD_OP_QUERY_SQ
);
174 MLX5_SET(query_sq_in
, in
, sqn
, sqn
);
176 return mlx5_cmd_exec_check_status(dev
, in
, sizeof(in
), out
, outlen
);
178 EXPORT_SYMBOL(mlx5_core_query_sq
);
180 int mlx5_core_create_tir(struct mlx5_core_dev
*dev
, u32
*in
, int inlen
,
183 u32 out
[MLX5_ST_SZ_DW(create_tir_out
)];
186 MLX5_SET(create_tir_in
, in
, opcode
, MLX5_CMD_OP_CREATE_TIR
);
188 memset(out
, 0, sizeof(out
));
189 err
= mlx5_cmd_exec_check_status(dev
, in
, inlen
, out
, sizeof(out
));
191 *tirn
= MLX5_GET(create_tir_out
, out
, tirn
);
195 EXPORT_SYMBOL(mlx5_core_create_tir
);
197 int mlx5_core_modify_tir(struct mlx5_core_dev
*dev
, u32 tirn
, u32
*in
,
200 u32 out
[MLX5_ST_SZ_DW(modify_tir_out
)];
202 MLX5_SET(modify_tir_in
, in
, tirn
, tirn
);
203 MLX5_SET(modify_tir_in
, in
, opcode
, MLX5_CMD_OP_MODIFY_TIR
);
205 memset(out
, 0, sizeof(out
));
206 return mlx5_cmd_exec_check_status(dev
, in
, inlen
, out
, sizeof(out
));
209 void mlx5_core_destroy_tir(struct mlx5_core_dev
*dev
, u32 tirn
)
211 u32 in
[MLX5_ST_SZ_DW(destroy_tir_in
)];
212 u32 out
[MLX5_ST_SZ_DW(destroy_tir_out
)];
214 memset(in
, 0, sizeof(in
));
216 MLX5_SET(destroy_tir_in
, in
, opcode
, MLX5_CMD_OP_DESTROY_TIR
);
217 MLX5_SET(destroy_tir_in
, in
, tirn
, tirn
);
219 mlx5_cmd_exec_check_status(dev
, in
, sizeof(in
), out
, sizeof(out
));
221 EXPORT_SYMBOL(mlx5_core_destroy_tir
);
223 int mlx5_core_create_tis(struct mlx5_core_dev
*dev
, u32
*in
, int inlen
,
226 u32 out
[MLX5_ST_SZ_DW(create_tis_out
)];
229 MLX5_SET(create_tis_in
, in
, opcode
, MLX5_CMD_OP_CREATE_TIS
);
231 memset(out
, 0, sizeof(out
));
232 err
= mlx5_cmd_exec_check_status(dev
, in
, inlen
, out
, sizeof(out
));
234 *tisn
= MLX5_GET(create_tis_out
, out
, tisn
);
238 EXPORT_SYMBOL(mlx5_core_create_tis
);
240 int mlx5_core_modify_tis(struct mlx5_core_dev
*dev
, u32 tisn
, u32
*in
,
243 u32 out
[MLX5_ST_SZ_DW(modify_tis_out
)] = {0};
245 MLX5_SET(modify_tis_in
, in
, tisn
, tisn
);
246 MLX5_SET(modify_tis_in
, in
, opcode
, MLX5_CMD_OP_MODIFY_TIS
);
248 return mlx5_cmd_exec_check_status(dev
, in
, inlen
, out
, sizeof(out
));
250 EXPORT_SYMBOL(mlx5_core_modify_tis
);
252 void mlx5_core_destroy_tis(struct mlx5_core_dev
*dev
, u32 tisn
)
254 u32 in
[MLX5_ST_SZ_DW(destroy_tis_in
)];
255 u32 out
[MLX5_ST_SZ_DW(destroy_tis_out
)];
257 memset(in
, 0, sizeof(in
));
259 MLX5_SET(destroy_tis_in
, in
, opcode
, MLX5_CMD_OP_DESTROY_TIS
);
260 MLX5_SET(destroy_tis_in
, in
, tisn
, tisn
);
262 mlx5_cmd_exec_check_status(dev
, in
, sizeof(in
), out
, sizeof(out
));
264 EXPORT_SYMBOL(mlx5_core_destroy_tis
);
266 int mlx5_core_create_rmp(struct mlx5_core_dev
*dev
, u32
*in
, int inlen
,
269 u32 out
[MLX5_ST_SZ_DW(create_rmp_out
)];
272 MLX5_SET(create_rmp_in
, in
, opcode
, MLX5_CMD_OP_CREATE_RMP
);
274 memset(out
, 0, sizeof(out
));
275 err
= mlx5_cmd_exec_check_status(dev
, in
, inlen
, out
, sizeof(out
));
277 *rmpn
= MLX5_GET(create_rmp_out
, out
, rmpn
);
282 int mlx5_core_modify_rmp(struct mlx5_core_dev
*dev
, u32
*in
, int inlen
)
284 u32 out
[MLX5_ST_SZ_DW(modify_rmp_out
)];
286 MLX5_SET(modify_rmp_in
, in
, opcode
, MLX5_CMD_OP_MODIFY_RMP
);
288 memset(out
, 0, sizeof(out
));
289 return mlx5_cmd_exec_check_status(dev
, in
, inlen
, out
, sizeof(out
));
292 int mlx5_core_destroy_rmp(struct mlx5_core_dev
*dev
, u32 rmpn
)
294 u32 in
[MLX5_ST_SZ_DW(destroy_rmp_in
)];
295 u32 out
[MLX5_ST_SZ_DW(destroy_rmp_out
)];
297 memset(in
, 0, sizeof(in
));
299 MLX5_SET(destroy_rmp_in
, in
, opcode
, MLX5_CMD_OP_DESTROY_RMP
);
300 MLX5_SET(destroy_rmp_in
, in
, rmpn
, rmpn
);
302 return mlx5_cmd_exec_check_status(dev
, in
, sizeof(in
), out
,
306 int mlx5_core_query_rmp(struct mlx5_core_dev
*dev
, u32 rmpn
, u32
*out
)
308 u32 in
[MLX5_ST_SZ_DW(query_rmp_in
)];
309 int outlen
= MLX5_ST_SZ_BYTES(query_rmp_out
);
311 memset(in
, 0, sizeof(in
));
312 MLX5_SET(query_rmp_in
, in
, opcode
, MLX5_CMD_OP_QUERY_RMP
);
313 MLX5_SET(query_rmp_in
, in
, rmpn
, rmpn
);
315 return mlx5_cmd_exec_check_status(dev
, in
, sizeof(in
), out
, outlen
);
318 int mlx5_core_arm_rmp(struct mlx5_core_dev
*dev
, u32 rmpn
, u16 lwm
)
326 in
= mlx5_vzalloc(MLX5_ST_SZ_BYTES(modify_rmp_in
));
330 rmpc
= MLX5_ADDR_OF(modify_rmp_in
, in
, ctx
);
331 bitmask
= MLX5_ADDR_OF(modify_rmp_in
, in
, bitmask
);
332 wq
= MLX5_ADDR_OF(rmpc
, rmpc
, wq
);
334 MLX5_SET(modify_rmp_in
, in
, rmp_state
, MLX5_RMPC_STATE_RDY
);
335 MLX5_SET(modify_rmp_in
, in
, rmpn
, rmpn
);
336 MLX5_SET(wq
, wq
, lwm
, lwm
);
337 MLX5_SET(rmp_bitmask
, bitmask
, lwm
, 1);
338 MLX5_SET(rmpc
, rmpc
, state
, MLX5_RMPC_STATE_RDY
);
340 err
= mlx5_core_modify_rmp(dev
, in
, MLX5_ST_SZ_BYTES(modify_rmp_in
));
347 int mlx5_core_create_xsrq(struct mlx5_core_dev
*dev
, u32
*in
, int inlen
,
350 u32 out
[MLX5_ST_SZ_DW(create_xrc_srq_out
)];
353 MLX5_SET(create_xrc_srq_in
, in
, opcode
, MLX5_CMD_OP_CREATE_XRC_SRQ
);
355 memset(out
, 0, sizeof(out
));
356 err
= mlx5_cmd_exec_check_status(dev
, in
, inlen
, out
, sizeof(out
));
358 *xsrqn
= MLX5_GET(create_xrc_srq_out
, out
, xrc_srqn
);
363 int mlx5_core_destroy_xsrq(struct mlx5_core_dev
*dev
, u32 xsrqn
)
365 u32 in
[MLX5_ST_SZ_DW(destroy_xrc_srq_in
)];
366 u32 out
[MLX5_ST_SZ_DW(destroy_xrc_srq_out
)];
368 memset(in
, 0, sizeof(in
));
369 memset(out
, 0, sizeof(out
));
371 MLX5_SET(destroy_xrc_srq_in
, in
, opcode
, MLX5_CMD_OP_DESTROY_XRC_SRQ
);
372 MLX5_SET(destroy_xrc_srq_in
, in
, xrc_srqn
, xsrqn
);
374 return mlx5_cmd_exec_check_status(dev
, in
, sizeof(in
), out
,
378 int mlx5_core_query_xsrq(struct mlx5_core_dev
*dev
, u32 xsrqn
, u32
*out
)
380 u32 in
[MLX5_ST_SZ_DW(query_xrc_srq_in
)];
385 memset(in
, 0, sizeof(in
));
386 MLX5_SET(query_xrc_srq_in
, in
, opcode
, MLX5_CMD_OP_QUERY_XRC_SRQ
);
387 MLX5_SET(query_xrc_srq_in
, in
, xrc_srqn
, xsrqn
);
389 err
= mlx5_cmd_exec_check_status(dev
, in
, sizeof(in
),
391 MLX5_ST_SZ_BYTES(query_xrc_srq_out
));
393 xrc_srqc
= MLX5_ADDR_OF(query_xrc_srq_out
, out
,
394 xrc_srq_context_entry
);
395 srqc
= MLX5_ADDR_OF(query_srq_out
, out
, srq_context_entry
);
396 memcpy(srqc
, xrc_srqc
, MLX5_ST_SZ_BYTES(srqc
));
402 int mlx5_core_arm_xsrq(struct mlx5_core_dev
*dev
, u32 xsrqn
, u16 lwm
)
404 u32 in
[MLX5_ST_SZ_DW(arm_xrc_srq_in
)];
405 u32 out
[MLX5_ST_SZ_DW(arm_xrc_srq_out
)];
407 memset(in
, 0, sizeof(in
));
408 memset(out
, 0, sizeof(out
));
410 MLX5_SET(arm_xrc_srq_in
, in
, opcode
, MLX5_CMD_OP_ARM_XRC_SRQ
);
411 MLX5_SET(arm_xrc_srq_in
, in
, xrc_srqn
, xsrqn
);
412 MLX5_SET(arm_xrc_srq_in
, in
, lwm
, lwm
);
413 MLX5_SET(arm_xrc_srq_in
, in
, op_mod
,
414 MLX5_ARM_XRC_SRQ_IN_OP_MOD_XRC_SRQ
);
416 return mlx5_cmd_exec_check_status(dev
, in
, sizeof(in
), out
,
420 int mlx5_core_create_rqt(struct mlx5_core_dev
*dev
, u32
*in
, int inlen
,
423 u32 out
[MLX5_ST_SZ_DW(create_rqt_out
)];
426 MLX5_SET(create_rqt_in
, in
, opcode
, MLX5_CMD_OP_CREATE_RQT
);
428 memset(out
, 0, sizeof(out
));
429 err
= mlx5_cmd_exec_check_status(dev
, in
, inlen
, out
, sizeof(out
));
431 *rqtn
= MLX5_GET(create_rqt_out
, out
, rqtn
);
435 EXPORT_SYMBOL(mlx5_core_create_rqt
);
437 int mlx5_core_modify_rqt(struct mlx5_core_dev
*dev
, u32 rqtn
, u32
*in
,
440 u32 out
[MLX5_ST_SZ_DW(modify_rqt_out
)];
442 MLX5_SET(modify_rqt_in
, in
, rqtn
, rqtn
);
443 MLX5_SET(modify_rqt_in
, in
, opcode
, MLX5_CMD_OP_MODIFY_RQT
);
445 memset(out
, 0, sizeof(out
));
446 return mlx5_cmd_exec_check_status(dev
, in
, inlen
, out
, sizeof(out
));
449 void mlx5_core_destroy_rqt(struct mlx5_core_dev
*dev
, u32 rqtn
)
451 u32 in
[MLX5_ST_SZ_DW(destroy_rqt_in
)];
452 u32 out
[MLX5_ST_SZ_DW(destroy_rqt_out
)];
454 memset(in
, 0, sizeof(in
));
456 MLX5_SET(destroy_rqt_in
, in
, opcode
, MLX5_CMD_OP_DESTROY_RQT
);
457 MLX5_SET(destroy_rqt_in
, in
, rqtn
, rqtn
);
459 mlx5_cmd_exec_check_status(dev
, in
, sizeof(in
), out
, sizeof(out
));
461 EXPORT_SYMBOL(mlx5_core_destroy_rqt
);