1*d9c52522SMasahiro Yamada /* SPDX-License-Identifier: ((GPL-2.0 WITH Linux-syscall-note) OR BSD-3-Clause) */ 2239b0e52SKamenee Arumugam 3239b0e52SKamenee Arumugam /* 4239b0e52SKamenee Arumugam * This file contains defines, structures, etc. that are used 5239b0e52SKamenee Arumugam * to communicate between kernel and user code. 6239b0e52SKamenee Arumugam */ 7239b0e52SKamenee Arumugam 8239b0e52SKamenee Arumugam #ifndef RVT_ABI_USER_H 9239b0e52SKamenee Arumugam #define RVT_ABI_USER_H 10239b0e52SKamenee Arumugam 11239b0e52SKamenee Arumugam #include <linux/types.h> 12239b0e52SKamenee Arumugam #include <rdma/ib_user_verbs.h> 13239b0e52SKamenee Arumugam #ifndef RDMA_ATOMIC_UAPI 14239b0e52SKamenee Arumugam #define RDMA_ATOMIC_UAPI(_type, _name) struct{ _type val; } _name 15239b0e52SKamenee Arumugam #endif 16239b0e52SKamenee Arumugam 17f10ff380SJason Gunthorpe struct rvt_wqe_sge { 18f10ff380SJason Gunthorpe __aligned_u64 addr; 19f10ff380SJason Gunthorpe __u32 length; 20f10ff380SJason Gunthorpe __u32 lkey; 21f10ff380SJason Gunthorpe }; 22f10ff380SJason Gunthorpe 23239b0e52SKamenee Arumugam /* 24239b0e52SKamenee Arumugam * This structure is used to contain the head pointer, tail pointer, 25239b0e52SKamenee Arumugam * and completion queue entries as a single memory allocation so 26239b0e52SKamenee Arumugam * it can be mmap'ed into user space. 27239b0e52SKamenee Arumugam */ 28239b0e52SKamenee Arumugam struct rvt_cq_wc { 29239b0e52SKamenee Arumugam /* index of next entry to fill */ 30239b0e52SKamenee Arumugam RDMA_ATOMIC_UAPI(__u32, head); 31239b0e52SKamenee Arumugam /* index of next ib_poll_cq() entry */ 32239b0e52SKamenee Arumugam RDMA_ATOMIC_UAPI(__u32, tail); 33239b0e52SKamenee Arumugam 34239b0e52SKamenee Arumugam /* these are actually size ibcq.cqe + 1 */ 35239b0e52SKamenee Arumugam struct ib_uverbs_wc uqueue[]; 36239b0e52SKamenee Arumugam }; 37239b0e52SKamenee Arumugam 38dabac6e4SKamenee Arumugam /* 39dabac6e4SKamenee Arumugam * Receive work request queue entry. 40dabac6e4SKamenee Arumugam * The size of the sg_list is determined when the QP (or SRQ) is created 41dabac6e4SKamenee Arumugam * and stored in qp->r_rq.max_sge (or srq->rq.max_sge). 42dabac6e4SKamenee Arumugam */ 43dabac6e4SKamenee Arumugam struct rvt_rwqe { 44dabac6e4SKamenee Arumugam __u64 wr_id; 45dabac6e4SKamenee Arumugam __u8 num_sge; 46dabac6e4SKamenee Arumugam __u8 padding[7]; 47f10ff380SJason Gunthorpe struct rvt_wqe_sge sg_list[]; 48dabac6e4SKamenee Arumugam }; 49dabac6e4SKamenee Arumugam 50dabac6e4SKamenee Arumugam /* 51dabac6e4SKamenee Arumugam * This structure is used to contain the head pointer, tail pointer, 52dabac6e4SKamenee Arumugam * and receive work queue entries as a single memory allocation so 53dabac6e4SKamenee Arumugam * it can be mmap'ed into user space. 54dabac6e4SKamenee Arumugam * Note that the wq array elements are variable size so you can't 55dabac6e4SKamenee Arumugam * just index into the array to get the N'th element; 56dabac6e4SKamenee Arumugam * use get_rwqe_ptr() for user space and rvt_get_rwqe_ptr() 57dabac6e4SKamenee Arumugam * for kernel space. 58dabac6e4SKamenee Arumugam */ 59dabac6e4SKamenee Arumugam struct rvt_rwq { 60dabac6e4SKamenee Arumugam /* new work requests posted to the head */ 61dabac6e4SKamenee Arumugam RDMA_ATOMIC_UAPI(__u32, head); 62dabac6e4SKamenee Arumugam /* receives pull requests from here. */ 63dabac6e4SKamenee Arumugam RDMA_ATOMIC_UAPI(__u32, tail); 64dabac6e4SKamenee Arumugam struct rvt_rwqe wq[]; 65dabac6e4SKamenee Arumugam }; 66239b0e52SKamenee Arumugam #endif /* RVT_ABI_USER_H */ 67