blob: ce9a12349011061e26ecacd320be95859b2ca0a9 [file] [edit]
/* SPDX-License-Identifier: GPL-2.0 or OpenIB.org BSD (MIT) See COPYING file */
/*
* Authors: Cheng Xu <chengyou@linux.alibaba.com>
* Copyright (c) 2020-2021, Alibaba Group.
*/
#ifndef __ERDMA_VERBS_H__
#define __ERDMA_VERBS_H__
#include <pthread.h>
#include <inttypes.h>
#include <stddef.h>
#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