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
36 #include <linux/mlx5/mlx5_ifc.h>
37 #include <linux/mlx5/cq.h>
38 #include <linux/mlx5/qp.h>
40 struct mlx5_wq_param
{
47 struct mlx5_core_dev
*mdev
;
52 struct mlx5_frag_wq_ctrl
{
53 struct mlx5_core_dev
*mdev
;
54 struct mlx5_frag_buf frag_buf
;
66 struct mlx5_wq_cyc rq
;
67 struct mlx5_wq_cyc sq
;
71 struct mlx5_frag_buf frag_buf
;
75 u32 cc
; /* consumer counter */
92 int mlx5_wq_cyc_create(struct mlx5_core_dev
*mdev
, struct mlx5_wq_param
*param
,
93 void *wqc
, struct mlx5_wq_cyc
*wq
,
94 struct mlx5_wq_ctrl
*wq_ctrl
);
95 u32
mlx5_wq_cyc_get_size(struct mlx5_wq_cyc
*wq
);
97 int mlx5_wq_qp_create(struct mlx5_core_dev
*mdev
, struct mlx5_wq_param
*param
,
98 void *qpc
, struct mlx5_wq_qp
*wq
,
99 struct mlx5_wq_ctrl
*wq_ctrl
);
101 int mlx5_cqwq_create(struct mlx5_core_dev
*mdev
, struct mlx5_wq_param
*param
,
102 void *cqc
, struct mlx5_cqwq
*wq
,
103 struct mlx5_frag_wq_ctrl
*wq_ctrl
);
104 u32
mlx5_cqwq_get_size(struct mlx5_cqwq
*wq
);
106 int mlx5_wq_ll_create(struct mlx5_core_dev
*mdev
, struct mlx5_wq_param
*param
,
107 void *wqc
, struct mlx5_wq_ll
*wq
,
108 struct mlx5_wq_ctrl
*wq_ctrl
);
109 u32
mlx5_wq_ll_get_size(struct mlx5_wq_ll
*wq
);
111 void mlx5_wq_destroy(struct mlx5_wq_ctrl
*wq_ctrl
);
112 void mlx5_cqwq_destroy(struct mlx5_frag_wq_ctrl
*wq_ctrl
);
114 static inline u16
mlx5_wq_cyc_ctr2ix(struct mlx5_wq_cyc
*wq
, u16 ctr
)
116 return ctr
& wq
->sz_m1
;
119 static inline void *mlx5_wq_cyc_get_wqe(struct mlx5_wq_cyc
*wq
, u16 ix
)
121 return wq
->buf
+ (ix
<< wq
->log_stride
);
124 static inline int mlx5_wq_cyc_cc_bigger(u16 cc1
, u16 cc2
)
126 int equal
= (cc1
== cc2
);
127 int smaller
= 0x8000 & (cc1
- cc2
);
129 return !equal
&& !smaller
;
132 static inline u32
mlx5_cqwq_get_ci(struct mlx5_cqwq
*wq
)
134 return wq
->cc
& wq
->sz_m1
;
137 static inline void *mlx5_cqwq_get_wqe(struct mlx5_cqwq
*wq
, u32 ix
)
139 unsigned int frag
= (ix
>> wq
->log_frag_strides
);
141 return wq
->frag_buf
.frags
[frag
].buf
+
142 ((wq
->frag_sz_m1
& ix
) << wq
->log_stride
);
145 static inline u32
mlx5_cqwq_get_wrap_cnt(struct mlx5_cqwq
*wq
)
147 return wq
->cc
>> wq
->log_sz
;
150 static inline void mlx5_cqwq_pop(struct mlx5_cqwq
*wq
)
155 static inline void mlx5_cqwq_update_db_record(struct mlx5_cqwq
*wq
)
157 *wq
->db
= cpu_to_be32(wq
->cc
& 0xffffff);
160 static inline struct mlx5_cqe64
*mlx5_cqwq_get_cqe(struct mlx5_cqwq
*wq
)
162 u32 ci
= mlx5_cqwq_get_ci(wq
);
163 struct mlx5_cqe64
*cqe
= mlx5_cqwq_get_wqe(wq
, ci
);
164 u8 cqe_ownership_bit
= cqe
->op_own
& MLX5_CQE_OWNER_MASK
;
165 u8 sw_ownership_val
= mlx5_cqwq_get_wrap_cnt(wq
) & 1;
167 if (cqe_ownership_bit
!= sw_ownership_val
)
170 /* ensure cqe content is read after cqe ownership bit */
176 static inline int mlx5_wq_ll_is_full(struct mlx5_wq_ll
*wq
)
178 return wq
->cur_sz
== wq
->sz_m1
;
181 static inline int mlx5_wq_ll_is_empty(struct mlx5_wq_ll
*wq
)
186 static inline void *mlx5_wq_ll_get_wqe(struct mlx5_wq_ll
*wq
, u16 ix
)
188 return wq
->buf
+ (ix
<< wq
->log_stride
);
191 static inline void mlx5_wq_ll_push(struct mlx5_wq_ll
*wq
, u16 head_next
)
193 wq
->head
= head_next
;
198 static inline void mlx5_wq_ll_pop(struct mlx5_wq_ll
*wq
, __be16 ix
,
199 __be16
*next_tail_next
)
202 wq
->tail_next
= next_tail_next
;
206 static inline void mlx5_wq_ll_update_db_record(struct mlx5_wq_ll
*wq
)
208 *wq
->db
= cpu_to_be32(wq
->wqe_ctr
);
211 #endif /* __MLX5_WQ_H__ */