1dc7e38acSHans Petter Selasky /*- 27b9b93a8SHans Petter Selasky * Copyright (c) 2013-2017, Mellanox Technologies, Ltd. All rights reserved. 3dc7e38acSHans Petter Selasky * 4dc7e38acSHans Petter Selasky * Redistribution and use in source and binary forms, with or without 5dc7e38acSHans Petter Selasky * modification, are permitted provided that the following conditions 6dc7e38acSHans Petter Selasky * are met: 7dc7e38acSHans Petter Selasky * 1. Redistributions of source code must retain the above copyright 8dc7e38acSHans Petter Selasky * notice, this list of conditions and the following disclaimer. 9dc7e38acSHans Petter Selasky * 2. Redistributions in binary form must reproduce the above copyright 10dc7e38acSHans Petter Selasky * notice, this list of conditions and the following disclaimer in the 11dc7e38acSHans Petter Selasky * documentation and/or other materials provided with the distribution. 12dc7e38acSHans Petter Selasky * 13dc7e38acSHans Petter Selasky * THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS `AS IS' AND 14dc7e38acSHans Petter Selasky * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 15dc7e38acSHans Petter Selasky * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 16dc7e38acSHans Petter Selasky * ARE DISCLAIMED. IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE 17dc7e38acSHans Petter Selasky * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 18dc7e38acSHans Petter Selasky * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 19dc7e38acSHans Petter Selasky * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 20dc7e38acSHans Petter Selasky * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 21dc7e38acSHans Petter Selasky * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 22dc7e38acSHans Petter Selasky * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 23dc7e38acSHans Petter Selasky * SUCH DAMAGE. 24dc7e38acSHans Petter Selasky * 25dc7e38acSHans Petter Selasky * $FreeBSD$ 26dc7e38acSHans Petter Selasky */ 27dc7e38acSHans Petter Selasky 28dc7e38acSHans Petter Selasky #ifndef __MLX5_WQ_H__ 29dc7e38acSHans Petter Selasky #define __MLX5_WQ_H__ 30dc7e38acSHans Petter Selasky 31dc7e38acSHans Petter Selasky #include <dev/mlx5/mlx5_ifc.h> 32dc7e38acSHans Petter Selasky 33dc7e38acSHans Petter Selasky struct mlx5_wq_param { 34dc7e38acSHans Petter Selasky int linear; 35dc7e38acSHans Petter Selasky int buf_numa_node; 36dc7e38acSHans Petter Selasky int db_numa_node; 37dc7e38acSHans Petter Selasky }; 38dc7e38acSHans Petter Selasky 39dc7e38acSHans Petter Selasky struct mlx5_wq_ctrl { 40dc7e38acSHans Petter Selasky struct mlx5_core_dev *mdev; 41dc7e38acSHans Petter Selasky struct mlx5_buf buf; 42dc7e38acSHans Petter Selasky struct mlx5_db db; 43dc7e38acSHans Petter Selasky }; 44dc7e38acSHans Petter Selasky 45e9dcd831SSlava Shwartsman struct mlx5_frag_wq_ctrl { 46e9dcd831SSlava Shwartsman struct mlx5_core_dev *mdev; 47e9dcd831SSlava Shwartsman struct mlx5_frag_buf frag_buf; 48e9dcd831SSlava Shwartsman struct mlx5_db db; 49e9dcd831SSlava Shwartsman }; 50e9dcd831SSlava Shwartsman 51dc7e38acSHans Petter Selasky struct mlx5_wq_cyc { 52dc7e38acSHans Petter Selasky void *buf; 53dc7e38acSHans Petter Selasky __be32 *db; 54dc7e38acSHans Petter Selasky u16 sz_m1; 55dc7e38acSHans Petter Selasky u8 log_stride; 56dc7e38acSHans Petter Selasky }; 57dc7e38acSHans Petter Selasky 58e9dcd831SSlava Shwartsman struct mlx5_wq_qp { 59e9dcd831SSlava Shwartsman struct mlx5_wq_cyc rq; 60e9dcd831SSlava Shwartsman struct mlx5_wq_cyc sq; 61e9dcd831SSlava Shwartsman }; 62e9dcd831SSlava Shwartsman 63dc7e38acSHans Petter Selasky struct mlx5_cqwq { 64dc7e38acSHans Petter Selasky void *buf; 65dc7e38acSHans Petter Selasky __be32 *db; 66dc7e38acSHans Petter Selasky u32 sz_m1; 67dc7e38acSHans Petter Selasky u32 cc; /* consumer counter */ 68dc7e38acSHans Petter Selasky u8 log_sz; 69dc7e38acSHans Petter Selasky u8 log_stride; 70dc7e38acSHans Petter Selasky }; 71dc7e38acSHans Petter Selasky 72dc7e38acSHans Petter Selasky struct mlx5_wq_ll { 73dc7e38acSHans Petter Selasky void *buf; 74dc7e38acSHans Petter Selasky __be32 *db; 75dc7e38acSHans Petter Selasky __be16 *tail_next; 76dc7e38acSHans Petter Selasky u16 sz_m1; 77dc7e38acSHans Petter Selasky u16 head; 78dc7e38acSHans Petter Selasky u16 wqe_ctr; 79dc7e38acSHans Petter Selasky u16 cur_sz; 80dc7e38acSHans Petter Selasky u8 log_stride; 81dc7e38acSHans Petter Selasky }; 82dc7e38acSHans Petter Selasky 83dc7e38acSHans Petter Selasky int mlx5_wq_cyc_create(struct mlx5_core_dev *mdev, struct mlx5_wq_param *param, 84dc7e38acSHans Petter Selasky void *wqc, struct mlx5_wq_cyc *wq, 85dc7e38acSHans Petter Selasky struct mlx5_wq_ctrl *wq_ctrl); 86dc7e38acSHans Petter Selasky u32 mlx5_wq_cyc_get_size(struct mlx5_wq_cyc *wq); 87dc7e38acSHans Petter Selasky 88dc7e38acSHans Petter Selasky int mlx5_cqwq_create(struct mlx5_core_dev *mdev, struct mlx5_wq_param *param, 89dc7e38acSHans Petter Selasky void *cqc, struct mlx5_cqwq *wq, 90dc7e38acSHans Petter Selasky struct mlx5_wq_ctrl *wq_ctrl); 91dc7e38acSHans Petter Selasky u32 mlx5_cqwq_get_size(struct mlx5_cqwq *wq); 92dc7e38acSHans Petter Selasky 93dc7e38acSHans Petter Selasky int mlx5_wq_ll_create(struct mlx5_core_dev *mdev, struct mlx5_wq_param *param, 94dc7e38acSHans Petter Selasky void *wqc, struct mlx5_wq_ll *wq, 95dc7e38acSHans Petter Selasky struct mlx5_wq_ctrl *wq_ctrl); 96dc7e38acSHans Petter Selasky u32 mlx5_wq_ll_get_size(struct mlx5_wq_ll *wq); 97dc7e38acSHans Petter Selasky 98dc7e38acSHans Petter Selasky void mlx5_wq_destroy(struct mlx5_wq_ctrl *wq_ctrl); 99dc7e38acSHans Petter Selasky 100dc7e38acSHans Petter Selasky static inline u16 mlx5_wq_cyc_ctr2ix(struct mlx5_wq_cyc *wq, u16 ctr) 101dc7e38acSHans Petter Selasky { 102dc7e38acSHans Petter Selasky return ctr & wq->sz_m1; 103dc7e38acSHans Petter Selasky } 104dc7e38acSHans Petter Selasky 105dc7e38acSHans Petter Selasky static inline void *mlx5_wq_cyc_get_wqe(struct mlx5_wq_cyc *wq, u16 ix) 106dc7e38acSHans Petter Selasky { 107dc7e38acSHans Petter Selasky return wq->buf + (ix << wq->log_stride); 108dc7e38acSHans Petter Selasky } 109dc7e38acSHans Petter Selasky 110dc7e38acSHans Petter Selasky static inline int mlx5_wq_cyc_cc_bigger(u16 cc1, u16 cc2) 111dc7e38acSHans Petter Selasky { 112dc7e38acSHans Petter Selasky int equal = (cc1 == cc2); 113dc7e38acSHans Petter Selasky int smaller = 0x8000 & (cc1 - cc2); 114dc7e38acSHans Petter Selasky 115dc7e38acSHans Petter Selasky return !equal && !smaller; 116dc7e38acSHans Petter Selasky } 117dc7e38acSHans Petter Selasky 118dc7e38acSHans Petter Selasky static inline u32 mlx5_cqwq_get_ci(struct mlx5_cqwq *wq) 119dc7e38acSHans Petter Selasky { 120dc7e38acSHans Petter Selasky return wq->cc & wq->sz_m1; 121dc7e38acSHans Petter Selasky } 122dc7e38acSHans Petter Selasky 123dc7e38acSHans Petter Selasky static inline void *mlx5_cqwq_get_wqe(struct mlx5_cqwq *wq, u32 ix) 124dc7e38acSHans Petter Selasky { 125dc7e38acSHans Petter Selasky return wq->buf + (ix << wq->log_stride); 126dc7e38acSHans Petter Selasky } 127dc7e38acSHans Petter Selasky 128dc7e38acSHans Petter Selasky static inline u32 mlx5_cqwq_get_wrap_cnt(struct mlx5_cqwq *wq) 129dc7e38acSHans Petter Selasky { 130dc7e38acSHans Petter Selasky return wq->cc >> wq->log_sz; 131dc7e38acSHans Petter Selasky } 132dc7e38acSHans Petter Selasky 133dc7e38acSHans Petter Selasky static inline void mlx5_cqwq_pop(struct mlx5_cqwq *wq) 134dc7e38acSHans Petter Selasky { 135dc7e38acSHans Petter Selasky wq->cc++; 136dc7e38acSHans Petter Selasky } 137dc7e38acSHans Petter Selasky 138dc7e38acSHans Petter Selasky static inline void mlx5_cqwq_update_db_record(struct mlx5_cqwq *wq) 139dc7e38acSHans Petter Selasky { 140dc7e38acSHans Petter Selasky *wq->db = cpu_to_be32(wq->cc & 0xffffff); 141dc7e38acSHans Petter Selasky } 142dc7e38acSHans Petter Selasky 143dc7e38acSHans Petter Selasky static inline int mlx5_wq_ll_is_full(struct mlx5_wq_ll *wq) 144dc7e38acSHans Petter Selasky { 145dc7e38acSHans Petter Selasky return wq->cur_sz == wq->sz_m1; 146dc7e38acSHans Petter Selasky } 147dc7e38acSHans Petter Selasky 148dc7e38acSHans Petter Selasky static inline int mlx5_wq_ll_is_empty(struct mlx5_wq_ll *wq) 149dc7e38acSHans Petter Selasky { 150dc7e38acSHans Petter Selasky return !wq->cur_sz; 151dc7e38acSHans Petter Selasky } 152dc7e38acSHans Petter Selasky 153dc7e38acSHans Petter Selasky static inline void mlx5_wq_ll_push(struct mlx5_wq_ll *wq, u16 head_next) 154dc7e38acSHans Petter Selasky { 155dc7e38acSHans Petter Selasky wq->head = head_next; 156dc7e38acSHans Petter Selasky wq->wqe_ctr++; 157dc7e38acSHans Petter Selasky wq->cur_sz++; 158dc7e38acSHans Petter Selasky } 159dc7e38acSHans Petter Selasky 160dc7e38acSHans Petter Selasky static inline void mlx5_wq_ll_pop(struct mlx5_wq_ll *wq, __be16 ix, 161dc7e38acSHans Petter Selasky __be16 *next_tail_next) 162dc7e38acSHans Petter Selasky { 163dc7e38acSHans Petter Selasky *wq->tail_next = ix; 164dc7e38acSHans Petter Selasky wq->tail_next = next_tail_next; 165dc7e38acSHans Petter Selasky wq->cur_sz--; 166dc7e38acSHans Petter Selasky } 167dc7e38acSHans Petter Selasky static inline void mlx5_wq_ll_update_db_record(struct mlx5_wq_ll *wq) 168dc7e38acSHans Petter Selasky { 169dc7e38acSHans Petter Selasky *wq->db = cpu_to_be32(wq->wqe_ctr); 170dc7e38acSHans Petter Selasky } 171dc7e38acSHans Petter Selasky 172dc7e38acSHans Petter Selasky static inline void *mlx5_wq_ll_get_wqe(struct mlx5_wq_ll *wq, u16 ix) 173dc7e38acSHans Petter Selasky { 174dc7e38acSHans Petter Selasky return wq->buf + (ix << wq->log_stride); 175dc7e38acSHans Petter Selasky } 176dc7e38acSHans Petter Selasky 177dc7e38acSHans Petter Selasky #endif /* __MLX5_WQ_H__ */ 178