1 /* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */ 2 /* 3 * Copyright(c) 2016 - 2018 Intel Corporation. 4 */ 5 6 #ifndef DEF_RDMAVT_INCCQ_H 7 #define DEF_RDMAVT_INCCQ_H 8 9 #include <linux/kthread.h> 10 #include <rdma/ib_user_verbs.h> 11 #include <rdma/ib_verbs.h> 12 13 /* 14 * Define an ib_cq_notify value that is not valid so we know when CQ 15 * notifications are armed. 16 */ 17 #define RVT_CQ_NONE (IB_CQ_NEXT_COMP + 1) 18 19 /* 20 * Define read macro that apply smp_load_acquire memory barrier 21 * when reading indice of circular buffer that mmaped to user space. 22 */ 23 #define RDMA_READ_UAPI_ATOMIC(member) smp_load_acquire(&(member).val) 24 25 /* 26 * Define write macro that uses smp_store_release memory barrier 27 * when writing indice of circular buffer that mmaped to user space. 28 */ 29 #define RDMA_WRITE_UAPI_ATOMIC(member, x) smp_store_release(&(member).val, x) 30 #include <rdma/rvt-abi.h> 31 32 /* 33 * This structure is used to contain the head pointer, tail pointer, 34 * and completion queue entries as a single memory allocation so 35 * it can be mmap'ed into user space. 36 */ 37 struct rvt_k_cq_wc { 38 u32 head; /* index of next entry to fill */ 39 u32 tail; /* index of next ib_poll_cq() entry */ 40 struct ib_wc kqueue[]; 41 }; 42 43 /* 44 * The completion queue structure. 45 */ 46 struct rvt_cq { 47 struct ib_cq ibcq; 48 struct work_struct comptask; 49 spinlock_t lock; /* protect changes in this struct */ 50 u8 notify; 51 u8 triggered; 52 u8 cq_full; 53 int comp_vector_cpu; 54 struct rvt_dev_info *rdi; 55 struct rvt_cq_wc *queue; 56 struct rvt_mmap_info *ip; 57 struct rvt_k_cq_wc *kqueue; 58 }; 59 60 static inline struct rvt_cq *ibcq_to_rvtcq(struct ib_cq *ibcq) 61 { 62 return container_of(ibcq, struct rvt_cq, ibcq); 63 } 64 65 bool rvt_cq_enter(struct rvt_cq *cq, struct ib_wc *entry, bool solicited); 66 67 #endif /* DEF_RDMAVT_INCCQH */ 68