1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132
|
/* SPDX-License-Identifier: GPL-2.0 OR BSD-2-Clause */
/*
* Copyright 2019-2024 Amazon.com, Inc. or its affiliates. All rights reserved.
*/
#ifndef __EFADV_H__
#define __EFADV_H__
#include <stdio.h>
#include <sys/types.h>
#include <stdbool.h>
#include <infiniband/verbs.h>
#ifdef __cplusplus
extern "C" {
#endif
enum {
/* Values must match the values in efa-abi.h */
EFADV_QP_DRIVER_TYPE_SRD = 0,
};
struct ibv_qp *efadv_create_driver_qp(struct ibv_pd *ibvpd,
struct ibv_qp_init_attr *attr,
uint32_t driver_qp_type);
enum {
EFADV_QP_FLAGS_UNSOLICITED_WRITE_RECV = 1 << 0,
};
struct efadv_qp_init_attr {
uint64_t comp_mask;
uint32_t driver_qp_type;
uint16_t flags;
uint8_t sl;
uint8_t reserved[1];
};
struct ibv_qp *efadv_create_qp_ex(struct ibv_context *ibvctx,
struct ibv_qp_init_attr_ex *attr_ex,
struct efadv_qp_init_attr *efa_attr,
uint32_t inlen);
enum {
EFADV_DEVICE_ATTR_CAPS_RDMA_READ = 1 << 0,
EFADV_DEVICE_ATTR_CAPS_RNR_RETRY = 1 << 1,
EFADV_DEVICE_ATTR_CAPS_CQ_WITH_SGID = 1 << 2,
EFADV_DEVICE_ATTR_CAPS_RDMA_WRITE = 1 << 3,
EFADV_DEVICE_ATTR_CAPS_UNSOLICITED_WRITE_RECV = 1 << 4,
};
struct efadv_device_attr {
uint64_t comp_mask;
uint32_t max_sq_wr;
uint32_t max_rq_wr;
uint16_t max_sq_sge;
uint16_t max_rq_sge;
uint16_t inline_buf_size;
uint8_t reserved[2];
uint32_t device_caps;
uint32_t max_rdma_size;
};
int efadv_query_device(struct ibv_context *ibvctx,
struct efadv_device_attr *attr,
uint32_t inlen);
struct efadv_ah_attr {
uint64_t comp_mask;
uint16_t ahn;
uint8_t reserved[6];
};
int efadv_query_ah(struct ibv_ah *ibvah, struct efadv_ah_attr *attr,
uint32_t inlen);
struct efadv_cq {
uint64_t comp_mask;
int (*wc_read_sgid)(struct efadv_cq *efadv_cq, union ibv_gid *sgid);
bool (*wc_is_unsolicited)(struct efadv_cq *efadv_cq);
};
enum {
EFADV_WC_EX_WITH_SGID = 1 << 0,
EFADV_WC_EX_WITH_IS_UNSOLICITED = 1 << 1,
};
struct efadv_cq_init_attr {
uint64_t comp_mask;
uint64_t wc_flags;
};
struct ibv_cq_ex *efadv_create_cq(struct ibv_context *ibvctx,
struct ibv_cq_init_attr_ex *attr_ex,
struct efadv_cq_init_attr *efa_attr,
uint32_t inlen);
struct efadv_cq *efadv_cq_from_ibv_cq_ex(struct ibv_cq_ex *ibvcqx);
static inline int efadv_wc_read_sgid(struct efadv_cq *efadv_cq,
union ibv_gid *sgid)
{
return efadv_cq->wc_read_sgid(efadv_cq, sgid);
}
static inline bool efadv_wc_is_unsolicited(struct efadv_cq *efadv_cq)
{
return efadv_cq->wc_is_unsolicited(efadv_cq);
}
enum {
EFADV_MR_ATTR_VALIDITY_RECV_IC_ID = 1 << 0,
EFADV_MR_ATTR_VALIDITY_RDMA_READ_IC_ID = 1 << 1,
EFADV_MR_ATTR_VALIDITY_RDMA_RECV_IC_ID = 1 << 2,
};
struct efadv_mr_attr {
uint64_t comp_mask;
uint16_t ic_id_validity;
uint16_t recv_ic_id;
uint16_t rdma_read_ic_id;
uint16_t rdma_recv_ic_id;
};
int efadv_query_mr(struct ibv_mr *ibvmr, struct efadv_mr_attr *attr, uint32_t inlen);
#ifdef __cplusplus
}
#endif
#endif /* __EFADV_H__ */
|