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