/* SPDX-License-Identifier: GPL-2.0 or OpenIB.org BSD (MIT) See COPYING file */ /* * Authors: Cheng Xu * Copyright (c) 2020-2021, Alibaba Group. */ #ifndef __ERDMA_VERBS_H__ #define __ERDMA_VERBS_H__ #include #include #include #include "erdma.h" #include "erdma_hw.h" #define ERDMA_MAX_SEND_SGE 6 #define ERDMA_MAX_RECV_SGE 1 struct erdma_queue { void *qbuf; void *db; uint16_t rsvd0; uint16_t depth; uint32_t size; uint16_t pi; uint16_t ci; uint32_t rsvd1; uint64_t *wr_tbl; void *db_record; }; struct erdma_qp { struct ibv_qp base_qp; struct erdma_device *erdma_dev; uint32_t id; /* qpn */ pthread_spinlock_t sq_lock; pthread_spinlock_t rq_lock; int sq_sig_all; struct erdma_queue sq; struct erdma_queue rq; void *qbuf; size_t qbuf_size; uint64_t *db_records; }; struct erdma_cq { struct ibv_cq base_cq; struct erdma_device *erdma_dev; uint32_t id; uint32_t event_stats; uint32_t depth; uint32_t ci; struct erdma_cqe *queue; void *db; uint16_t db_offset; void *db_record; uint32_t cmdsn; uint32_t comp_vector; uint32_t db_index; pthread_spinlock_t lock; }; static inline struct erdma_qp *to_eqp(struct ibv_qp *base) { return container_of(base, struct erdma_qp, base_qp); } static inline struct erdma_cq *to_ecq(struct ibv_cq *base) { return container_of(base, struct erdma_cq, base_cq); } static inline void *get_sq_wqebb(struct erdma_qp *qp, uint16_t idx) { idx &= (qp->sq.depth - 1); return qp->sq.qbuf + (idx << SQEBB_SHIFT); } static inline void __kick_sq_db(struct erdma_qp *qp, uint16_t pi) { uint64_t db_data; db_data = FIELD_PREP(ERDMA_SQE_HDR_QPN_MASK, qp->id) | FIELD_PREP(ERDMA_SQE_HDR_WQEBB_INDEX_MASK, pi); *(__le64 *)qp->sq.db_record = htole64(db_data); udma_to_device_barrier(); mmio_write64_le(qp->sq.db, htole64(db_data)); } struct ibv_pd *erdma_alloc_pd(struct ibv_context *ctx); int erdma_free_pd(struct ibv_pd *pd); int erdma_query_device(struct ibv_context *ctx, const struct ibv_query_device_ex_input *input, struct ibv_device_attr_ex *attr, size_t attr_size); int erdma_query_port(struct ibv_context *ctx, uint8_t port, struct ibv_port_attr *attr); struct ibv_mr *erdma_reg_mr(struct ibv_pd *pd, void *addr, size_t len, uint64_t hca_va, int access); int erdma_dereg_mr(struct verbs_mr *vmr); struct ibv_qp *erdma_create_qp(struct ibv_pd *pd, struct ibv_qp_init_attr *attr); int erdma_modify_qp(struct ibv_qp *base_qp, struct ibv_qp_attr *attr, int attr_mask); int erdma_query_qp(struct ibv_qp *qp, struct ibv_qp_attr *attr, int attr_mask, struct ibv_qp_init_attr *init_attr); int erdma_post_send(struct ibv_qp *base_qp, struct ibv_send_wr *wr, struct ibv_send_wr **bad_wr); int erdma_post_recv(struct ibv_qp *base_qp, struct ibv_recv_wr *wr, struct ibv_recv_wr **bad_wr); int erdma_destroy_qp(struct ibv_qp *base_qp); void erdma_free_context(struct ibv_context *ibv_ctx); struct ibv_cq *erdma_create_cq(struct ibv_context *ctx, int num_cqe, struct ibv_comp_channel *channel, int comp_vector); int erdma_destroy_cq(struct ibv_cq *base_cq); int erdma_notify_cq(struct ibv_cq *ibcq, int solicited); void erdma_cq_event(struct ibv_cq *ibcq); int erdma_poll_cq(struct ibv_cq *ibcq, int num_entries, struct ibv_wc *wc); #endif