162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */ 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Copyright(c) 2016 - 2018 Intel Corporation. 462306a36Sopenharmony_ci */ 562306a36Sopenharmony_ci 662306a36Sopenharmony_ci#ifndef DEF_RDMAVT_INCCQ_H 762306a36Sopenharmony_ci#define DEF_RDMAVT_INCCQ_H 862306a36Sopenharmony_ci 962306a36Sopenharmony_ci#include <linux/kthread.h> 1062306a36Sopenharmony_ci#include <rdma/ib_user_verbs.h> 1162306a36Sopenharmony_ci#include <rdma/ib_verbs.h> 1262306a36Sopenharmony_ci 1362306a36Sopenharmony_ci/* 1462306a36Sopenharmony_ci * Define an ib_cq_notify value that is not valid so we know when CQ 1562306a36Sopenharmony_ci * notifications are armed. 1662306a36Sopenharmony_ci */ 1762306a36Sopenharmony_ci#define RVT_CQ_NONE (IB_CQ_NEXT_COMP + 1) 1862306a36Sopenharmony_ci 1962306a36Sopenharmony_ci/* 2062306a36Sopenharmony_ci * Define read macro that apply smp_load_acquire memory barrier 2162306a36Sopenharmony_ci * when reading indice of circular buffer that mmaped to user space. 2262306a36Sopenharmony_ci */ 2362306a36Sopenharmony_ci#define RDMA_READ_UAPI_ATOMIC(member) smp_load_acquire(&(member).val) 2462306a36Sopenharmony_ci 2562306a36Sopenharmony_ci/* 2662306a36Sopenharmony_ci * Define write macro that uses smp_store_release memory barrier 2762306a36Sopenharmony_ci * when writing indice of circular buffer that mmaped to user space. 2862306a36Sopenharmony_ci */ 2962306a36Sopenharmony_ci#define RDMA_WRITE_UAPI_ATOMIC(member, x) smp_store_release(&(member).val, x) 3062306a36Sopenharmony_ci#include <rdma/rvt-abi.h> 3162306a36Sopenharmony_ci 3262306a36Sopenharmony_ci/* 3362306a36Sopenharmony_ci * This structure is used to contain the head pointer, tail pointer, 3462306a36Sopenharmony_ci * and completion queue entries as a single memory allocation so 3562306a36Sopenharmony_ci * it can be mmap'ed into user space. 3662306a36Sopenharmony_ci */ 3762306a36Sopenharmony_cistruct rvt_k_cq_wc { 3862306a36Sopenharmony_ci u32 head; /* index of next entry to fill */ 3962306a36Sopenharmony_ci u32 tail; /* index of next ib_poll_cq() entry */ 4062306a36Sopenharmony_ci struct ib_wc kqueue[]; 4162306a36Sopenharmony_ci}; 4262306a36Sopenharmony_ci 4362306a36Sopenharmony_ci/* 4462306a36Sopenharmony_ci * The completion queue structure. 4562306a36Sopenharmony_ci */ 4662306a36Sopenharmony_cistruct rvt_cq { 4762306a36Sopenharmony_ci struct ib_cq ibcq; 4862306a36Sopenharmony_ci struct work_struct comptask; 4962306a36Sopenharmony_ci spinlock_t lock; /* protect changes in this struct */ 5062306a36Sopenharmony_ci u8 notify; 5162306a36Sopenharmony_ci u8 triggered; 5262306a36Sopenharmony_ci u8 cq_full; 5362306a36Sopenharmony_ci int comp_vector_cpu; 5462306a36Sopenharmony_ci struct rvt_dev_info *rdi; 5562306a36Sopenharmony_ci struct rvt_cq_wc *queue; 5662306a36Sopenharmony_ci struct rvt_mmap_info *ip; 5762306a36Sopenharmony_ci struct rvt_k_cq_wc *kqueue; 5862306a36Sopenharmony_ci}; 5962306a36Sopenharmony_ci 6062306a36Sopenharmony_cistatic inline struct rvt_cq *ibcq_to_rvtcq(struct ib_cq *ibcq) 6162306a36Sopenharmony_ci{ 6262306a36Sopenharmony_ci return container_of(ibcq, struct rvt_cq, ibcq); 6362306a36Sopenharmony_ci} 6462306a36Sopenharmony_ci 6562306a36Sopenharmony_cibool rvt_cq_enter(struct rvt_cq *cq, struct ib_wc *entry, bool solicited); 6662306a36Sopenharmony_ci 6762306a36Sopenharmony_ci#endif /* DEF_RDMAVT_INCCQH */ 68