1 /* 2 * RDMA device: Definitions of Resource Manager functions 3 * 4 * Copyright (C) 2018 Oracle 5 * Copyright (C) 2018 Red Hat Inc 6 * 7 * Authors: 8 * Yuval Shaia <yuval.shaia@oracle.com> 9 * Marcel Apfelbaum <marcel@redhat.com> 10 * 11 * This work is licensed under the terms of the GNU GPL, version 2 or later. 12 * See the COPYING file in the top-level directory. 13 * 14 */ 15 16 #ifndef RDMA_RM_H 17 #define RDMA_RM_H 18 19 #include "qapi/error.h" 20 #include "rdma_backend_defs.h" 21 #include "rdma_rm_defs.h" 22 23 int rdma_rm_init(RdmaDeviceResources *dev_res, struct ibv_device_attr *dev_attr, 24 Error **errp); 25 void rdma_rm_fini(RdmaDeviceResources *dev_res, RdmaBackendDev *backend_dev, 26 const char *ifname); 27 28 int rdma_rm_alloc_pd(RdmaDeviceResources *dev_res, RdmaBackendDev *backend_dev, 29 uint32_t *pd_handle, uint32_t ctx_handle); 30 RdmaRmPD *rdma_rm_get_pd(RdmaDeviceResources *dev_res, uint32_t pd_handle); 31 void rdma_rm_dealloc_pd(RdmaDeviceResources *dev_res, uint32_t pd_handle); 32 33 int rdma_rm_alloc_mr(RdmaDeviceResources *dev_res, uint32_t pd_handle, 34 uint64_t guest_start, size_t guest_length, void *host_virt, 35 int access_flags, uint32_t *mr_handle, uint32_t *lkey, 36 uint32_t *rkey); 37 RdmaRmMR *rdma_rm_get_mr(RdmaDeviceResources *dev_res, uint32_t mr_handle); 38 void rdma_rm_dealloc_mr(RdmaDeviceResources *dev_res, uint32_t mr_handle); 39 40 int rdma_rm_alloc_uc(RdmaDeviceResources *dev_res, uint32_t pfn, 41 uint32_t *uc_handle); 42 RdmaRmUC *rdma_rm_get_uc(RdmaDeviceResources *dev_res, uint32_t uc_handle); 43 void rdma_rm_dealloc_uc(RdmaDeviceResources *dev_res, uint32_t uc_handle); 44 45 int rdma_rm_alloc_cq(RdmaDeviceResources *dev_res, RdmaBackendDev *backend_dev, 46 uint32_t cqe, uint32_t *cq_handle, void *opaque); 47 RdmaRmCQ *rdma_rm_get_cq(RdmaDeviceResources *dev_res, uint32_t cq_handle); 48 void rdma_rm_req_notify_cq(RdmaDeviceResources *dev_res, uint32_t cq_handle, 49 bool notify); 50 void rdma_rm_dealloc_cq(RdmaDeviceResources *dev_res, uint32_t cq_handle); 51 52 int rdma_rm_alloc_qp(RdmaDeviceResources *dev_res, uint32_t pd_handle, 53 uint8_t qp_type, uint32_t max_send_wr, 54 uint32_t max_send_sge, uint32_t send_cq_handle, 55 uint32_t max_recv_wr, uint32_t max_recv_sge, 56 uint32_t recv_cq_handle, void *opaque, uint32_t *qpn); 57 RdmaRmQP *rdma_rm_get_qp(RdmaDeviceResources *dev_res, uint32_t qpn); 58 int rdma_rm_modify_qp(RdmaDeviceResources *dev_res, RdmaBackendDev *backend_dev, 59 uint32_t qp_handle, uint32_t attr_mask, uint8_t sgid_idx, 60 union ibv_gid *dgid, uint32_t dqpn, 61 enum ibv_qp_state qp_state, uint32_t qkey, 62 uint32_t rq_psn, uint32_t sq_psn); 63 int rdma_rm_query_qp(RdmaDeviceResources *dev_res, RdmaBackendDev *backend_dev, 64 uint32_t qp_handle, struct ibv_qp_attr *attr, 65 int attr_mask, struct ibv_qp_init_attr *init_attr); 66 void rdma_rm_dealloc_qp(RdmaDeviceResources *dev_res, uint32_t qp_handle); 67 68 int rdma_rm_alloc_cqe_ctx(RdmaDeviceResources *dev_res, uint32_t *cqe_ctx_id, 69 void *ctx); 70 void *rdma_rm_get_cqe_ctx(RdmaDeviceResources *dev_res, uint32_t cqe_ctx_id); 71 void rdma_rm_dealloc_cqe_ctx(RdmaDeviceResources *dev_res, uint32_t cqe_ctx_id); 72 73 int rdma_rm_add_gid(RdmaDeviceResources *dev_res, RdmaBackendDev *backend_dev, 74 const char *ifname, union ibv_gid *gid, int gid_idx); 75 int rdma_rm_del_gid(RdmaDeviceResources *dev_res, RdmaBackendDev *backend_dev, 76 const char *ifname, int gid_idx); 77 int rdma_rm_get_backend_gid_index(RdmaDeviceResources *dev_res, 78 RdmaBackendDev *backend_dev, int sgid_idx); 79 static inline union ibv_gid *rdma_rm_get_gid(RdmaDeviceResources *dev_res, 80 int sgid_idx) 81 { 82 return &dev_res->port.gid_tbl[sgid_idx].gid; 83 } 84 85 #endif 86