162306a36Sopenharmony_ci/* SPDX-License-Identifier: ((GPL-2.0 WITH Linux-syscall-note) OR BSD-3-Clause) */ 262306a36Sopenharmony_ci 362306a36Sopenharmony_ci/* 462306a36Sopenharmony_ci * This file contains defines, structures, etc. that are used 562306a36Sopenharmony_ci * to communicate between kernel and user code. 662306a36Sopenharmony_ci */ 762306a36Sopenharmony_ci 862306a36Sopenharmony_ci#ifndef RVT_ABI_USER_H 962306a36Sopenharmony_ci#define RVT_ABI_USER_H 1062306a36Sopenharmony_ci 1162306a36Sopenharmony_ci#include <linux/types.h> 1262306a36Sopenharmony_ci#include <rdma/ib_user_verbs.h> 1362306a36Sopenharmony_ci#ifndef RDMA_ATOMIC_UAPI 1462306a36Sopenharmony_ci#define RDMA_ATOMIC_UAPI(_type, _name) struct{ _type val; } _name 1562306a36Sopenharmony_ci#endif 1662306a36Sopenharmony_ci 1762306a36Sopenharmony_cistruct rvt_wqe_sge { 1862306a36Sopenharmony_ci __aligned_u64 addr; 1962306a36Sopenharmony_ci __u32 length; 2062306a36Sopenharmony_ci __u32 lkey; 2162306a36Sopenharmony_ci}; 2262306a36Sopenharmony_ci 2362306a36Sopenharmony_ci/* 2462306a36Sopenharmony_ci * This structure is used to contain the head pointer, tail pointer, 2562306a36Sopenharmony_ci * and completion queue entries as a single memory allocation so 2662306a36Sopenharmony_ci * it can be mmap'ed into user space. 2762306a36Sopenharmony_ci */ 2862306a36Sopenharmony_cistruct rvt_cq_wc { 2962306a36Sopenharmony_ci /* index of next entry to fill */ 3062306a36Sopenharmony_ci RDMA_ATOMIC_UAPI(__u32, head); 3162306a36Sopenharmony_ci /* index of next ib_poll_cq() entry */ 3262306a36Sopenharmony_ci RDMA_ATOMIC_UAPI(__u32, tail); 3362306a36Sopenharmony_ci 3462306a36Sopenharmony_ci /* these are actually size ibcq.cqe + 1 */ 3562306a36Sopenharmony_ci struct ib_uverbs_wc uqueue[]; 3662306a36Sopenharmony_ci}; 3762306a36Sopenharmony_ci 3862306a36Sopenharmony_ci/* 3962306a36Sopenharmony_ci * Receive work request queue entry. 4062306a36Sopenharmony_ci * The size of the sg_list is determined when the QP (or SRQ) is created 4162306a36Sopenharmony_ci * and stored in qp->r_rq.max_sge (or srq->rq.max_sge). 4262306a36Sopenharmony_ci */ 4362306a36Sopenharmony_cistruct rvt_rwqe { 4462306a36Sopenharmony_ci __u64 wr_id; 4562306a36Sopenharmony_ci __u8 num_sge; 4662306a36Sopenharmony_ci __u8 padding[7]; 4762306a36Sopenharmony_ci struct rvt_wqe_sge sg_list[]; 4862306a36Sopenharmony_ci}; 4962306a36Sopenharmony_ci 5062306a36Sopenharmony_ci/* 5162306a36Sopenharmony_ci * This structure is used to contain the head pointer, tail pointer, 5262306a36Sopenharmony_ci * and receive work queue entries as a single memory allocation so 5362306a36Sopenharmony_ci * it can be mmap'ed into user space. 5462306a36Sopenharmony_ci * Note that the wq array elements are variable size so you can't 5562306a36Sopenharmony_ci * just index into the array to get the N'th element; 5662306a36Sopenharmony_ci * use get_rwqe_ptr() for user space and rvt_get_rwqe_ptr() 5762306a36Sopenharmony_ci * for kernel space. 5862306a36Sopenharmony_ci */ 5962306a36Sopenharmony_cistruct rvt_rwq { 6062306a36Sopenharmony_ci /* new work requests posted to the head */ 6162306a36Sopenharmony_ci RDMA_ATOMIC_UAPI(__u32, head); 6262306a36Sopenharmony_ci /* receives pull requests from here. */ 6362306a36Sopenharmony_ci RDMA_ATOMIC_UAPI(__u32, tail); 6462306a36Sopenharmony_ci struct rvt_rwqe wq[]; 6562306a36Sopenharmony_ci}; 6662306a36Sopenharmony_ci#endif /* RVT_ABI_USER_H */ 67