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>
38 struct mlx5_wq_param
{
45 struct mlx5_core_dev
*mdev
;
61 u32 cc
; /* consumer counter */
77 int mlx5_wq_cyc_create(struct mlx5_core_dev
*mdev
, struct mlx5_wq_param
*param
,
78 void *wqc
, struct mlx5_wq_cyc
*wq
,
79 struct mlx5_wq_ctrl
*wq_ctrl
);
80 u32
mlx5_wq_cyc_get_size(struct mlx5_wq_cyc
*wq
);
82 int mlx5_cqwq_create(struct mlx5_core_dev
*mdev
, struct mlx5_wq_param
*param
,
83 void *cqc
, struct mlx5_cqwq
*wq
,
84 struct mlx5_wq_ctrl
*wq_ctrl
);
85 u32
mlx5_cqwq_get_size(struct mlx5_cqwq
*wq
);
87 int mlx5_wq_ll_create(struct mlx5_core_dev
*mdev
, struct mlx5_wq_param
*param
,
88 void *wqc
, struct mlx5_wq_ll
*wq
,
89 struct mlx5_wq_ctrl
*wq_ctrl
);
90 u32
mlx5_wq_ll_get_size(struct mlx5_wq_ll
*wq
);
92 void mlx5_wq_destroy(struct mlx5_wq_ctrl
*wq_ctrl
);
94 static inline u16
mlx5_wq_cyc_ctr2ix(struct mlx5_wq_cyc
*wq
, u16 ctr
)
96 return ctr
& wq
->sz_m1
;
99 static inline void *mlx5_wq_cyc_get_wqe(struct mlx5_wq_cyc
*wq
, u16 ix
)
101 return wq
->buf
+ (ix
<< wq
->log_stride
);
104 static inline int mlx5_wq_cyc_cc_bigger(u16 cc1
, u16 cc2
)
106 int equal
= (cc1
== cc2
);
107 int smaller
= 0x8000 & (cc1
- cc2
);
109 return !equal
&& !smaller
;
112 static inline u32
mlx5_cqwq_get_ci(struct mlx5_cqwq
*wq
)
114 return wq
->cc
& wq
->sz_m1
;
117 static inline void *mlx5_cqwq_get_wqe(struct mlx5_cqwq
*wq
, u32 ix
)
119 return wq
->buf
+ (ix
<< wq
->log_stride
);
122 static inline u32
mlx5_cqwq_get_wrap_cnt(struct mlx5_cqwq
*wq
)
124 return wq
->cc
>> wq
->log_sz
;
127 static inline void mlx5_cqwq_pop(struct mlx5_cqwq
*wq
)
132 static inline void mlx5_cqwq_update_db_record(struct mlx5_cqwq
*wq
)
134 *wq
->db
= cpu_to_be32(wq
->cc
& 0xffffff);
137 static inline int mlx5_wq_ll_is_full(struct mlx5_wq_ll
*wq
)
139 return wq
->cur_sz
== wq
->sz_m1
;
142 static inline int mlx5_wq_ll_is_empty(struct mlx5_wq_ll
*wq
)
147 static inline void *mlx5_wq_ll_get_wqe(struct mlx5_wq_ll
*wq
, u16 ix
)
149 return wq
->buf
+ (ix
<< wq
->log_stride
);
152 static inline void mlx5_wq_ll_push(struct mlx5_wq_ll
*wq
, u16 head_next
)
154 wq
->head
= head_next
;
159 static inline void mlx5_wq_ll_pop(struct mlx5_wq_ll
*wq
, __be16 ix
,
160 __be16
*next_tail_next
)
163 wq
->tail_next
= next_tail_next
;
167 static inline void mlx5_wq_ll_update_db_record(struct mlx5_wq_ll
*wq
)
169 *wq
->db
= cpu_to_be32(wq
->wqe_ctr
);
172 #endif /* __MLX5_WQ_H__ */