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>
35 #include "mlx5_core.h"
37 u32
mlx5_wq_cyc_get_size(struct mlx5_wq_cyc
*wq
)
39 return (u32
)wq
->sz_m1
+ 1;
42 u32
mlx5_cqwq_get_size(struct mlx5_cqwq
*wq
)
47 u32
mlx5_wq_ll_get_size(struct mlx5_wq_ll
*wq
)
49 return (u32
)wq
->sz_m1
+ 1;
52 static u32
mlx5_wq_cyc_get_byte_size(struct mlx5_wq_cyc
*wq
)
54 return mlx5_wq_cyc_get_size(wq
) << wq
->log_stride
;
57 static u32
mlx5_cqwq_get_byte_size(struct mlx5_cqwq
*wq
)
59 return mlx5_cqwq_get_size(wq
) << wq
->log_stride
;
62 static u32
mlx5_wq_ll_get_byte_size(struct mlx5_wq_ll
*wq
)
64 return mlx5_wq_ll_get_size(wq
) << wq
->log_stride
;
67 int mlx5_wq_cyc_create(struct mlx5_core_dev
*mdev
, struct mlx5_wq_param
*param
,
68 void *wqc
, struct mlx5_wq_cyc
*wq
,
69 struct mlx5_wq_ctrl
*wq_ctrl
)
73 wq
->log_stride
= MLX5_GET(wq
, wqc
, log_wq_stride
);
74 wq
->sz_m1
= (1 << MLX5_GET(wq
, wqc
, log_wq_sz
)) - 1;
76 err
= mlx5_db_alloc_node(mdev
, &wq_ctrl
->db
, param
->db_numa_node
);
78 mlx5_core_warn(mdev
, "mlx5_db_alloc() failed, %d\n", err
);
82 err
= mlx5_buf_alloc_node(mdev
, mlx5_wq_cyc_get_byte_size(wq
),
83 &wq_ctrl
->buf
, param
->buf_numa_node
);
85 mlx5_core_warn(mdev
, "mlx5_buf_alloc() failed, %d\n", err
);
89 wq
->buf
= wq_ctrl
->buf
.direct
.buf
;
90 wq
->db
= wq_ctrl
->db
.db
;
97 mlx5_db_free(mdev
, &wq_ctrl
->db
);
102 int mlx5_cqwq_create(struct mlx5_core_dev
*mdev
, struct mlx5_wq_param
*param
,
103 void *cqc
, struct mlx5_cqwq
*wq
,
104 struct mlx5_wq_ctrl
*wq_ctrl
)
108 wq
->log_stride
= 6 + MLX5_GET(cqc
, cqc
, cqe_sz
);
109 wq
->log_sz
= MLX5_GET(cqc
, cqc
, log_cq_size
);
110 wq
->sz_m1
= (1 << wq
->log_sz
) - 1;
112 err
= mlx5_db_alloc_node(mdev
, &wq_ctrl
->db
, param
->db_numa_node
);
114 mlx5_core_warn(mdev
, "mlx5_db_alloc() failed, %d\n", err
);
118 err
= mlx5_buf_alloc_node(mdev
, mlx5_cqwq_get_byte_size(wq
),
119 &wq_ctrl
->buf
, param
->buf_numa_node
);
121 mlx5_core_warn(mdev
, "mlx5_buf_alloc() failed, %d\n", err
);
125 wq
->buf
= wq_ctrl
->buf
.direct
.buf
;
126 wq
->db
= wq_ctrl
->db
.db
;
128 wq_ctrl
->mdev
= mdev
;
133 mlx5_db_free(mdev
, &wq_ctrl
->db
);
138 int mlx5_wq_ll_create(struct mlx5_core_dev
*mdev
, struct mlx5_wq_param
*param
,
139 void *wqc
, struct mlx5_wq_ll
*wq
,
140 struct mlx5_wq_ctrl
*wq_ctrl
)
142 struct mlx5_wqe_srq_next_seg
*next_seg
;
146 wq
->log_stride
= MLX5_GET(wq
, wqc
, log_wq_stride
);
147 wq
->sz_m1
= (1 << MLX5_GET(wq
, wqc
, log_wq_sz
)) - 1;
149 err
= mlx5_db_alloc_node(mdev
, &wq_ctrl
->db
, param
->db_numa_node
);
151 mlx5_core_warn(mdev
, "mlx5_db_alloc() failed, %d\n", err
);
155 err
= mlx5_buf_alloc(mdev
, mlx5_wq_ll_get_byte_size(wq
), &wq_ctrl
->buf
);
157 mlx5_core_warn(mdev
, "mlx5_buf_alloc() failed, %d\n", err
);
161 wq
->buf
= wq_ctrl
->buf
.direct
.buf
;
162 wq
->db
= wq_ctrl
->db
.db
;
164 for (i
= 0; i
< wq
->sz_m1
; i
++) {
165 next_seg
= mlx5_wq_ll_get_wqe(wq
, i
);
166 next_seg
->next_wqe_index
= cpu_to_be16(i
+ 1);
168 next_seg
= mlx5_wq_ll_get_wqe(wq
, i
);
169 wq
->tail_next
= &next_seg
->next_wqe_index
;
171 wq_ctrl
->mdev
= mdev
;
176 mlx5_db_free(mdev
, &wq_ctrl
->db
);
181 void mlx5_wq_destroy(struct mlx5_wq_ctrl
*wq_ctrl
)
183 mlx5_buf_free(wq_ctrl
->mdev
, &wq_ctrl
->buf
);
184 mlx5_db_free(wq_ctrl
->mdev
, &wq_ctrl
->db
);