efa.h 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  1. /* SPDX-License-Identifier: GPL-2.0 OR BSD-2-Clause */
  2. /*
  3. * Copyright 2018-2021 Amazon.com, Inc. or its affiliates. All rights reserved.
  4. */
  5. #ifndef _EFA_H_
  6. #define _EFA_H_
  7. #include <linux/bitops.h>
  8. #include <linux/interrupt.h>
  9. #include <linux/pci.h>
  10. #include <rdma/efa-abi.h>
  11. #include <rdma/ib_verbs.h>
  12. #include "efa_com_cmd.h"
  13. #define DRV_MODULE_NAME "efa"
  14. #define DEVICE_NAME "Elastic Fabric Adapter (EFA)"
  15. #define EFA_IRQNAME_SIZE 40
  16. #define EFA_MGMNT_MSIX_VEC_IDX 0
  17. #define EFA_COMP_EQS_VEC_BASE 1
  18. struct efa_irq {
  19. irq_handler_t handler;
  20. void *data;
  21. u32 irqn;
  22. u32 vector;
  23. cpumask_t affinity_hint_mask;
  24. char name[EFA_IRQNAME_SIZE];
  25. };
  26. /* Don't use anything other than atomic64 */
  27. struct efa_stats {
  28. atomic64_t alloc_pd_err;
  29. atomic64_t create_qp_err;
  30. atomic64_t create_cq_err;
  31. atomic64_t reg_mr_err;
  32. atomic64_t alloc_ucontext_err;
  33. atomic64_t create_ah_err;
  34. atomic64_t mmap_err;
  35. atomic64_t keep_alive_rcvd;
  36. };
  37. struct efa_dev {
  38. struct ib_device ibdev;
  39. struct efa_com_dev edev;
  40. struct pci_dev *pdev;
  41. struct efa_com_get_device_attr_result dev_attr;
  42. u64 reg_bar_addr;
  43. u64 reg_bar_len;
  44. u64 mem_bar_addr;
  45. u64 mem_bar_len;
  46. u64 db_bar_addr;
  47. u64 db_bar_len;
  48. int admin_msix_vector_idx;
  49. struct efa_irq admin_irq;
  50. struct efa_stats stats;
  51. /* Array of completion EQs */
  52. struct efa_eq *eqs;
  53. unsigned int neqs;
  54. /* Only stores CQs with interrupts enabled */
  55. struct xarray cqs_xa;
  56. };
  57. struct efa_ucontext {
  58. struct ib_ucontext ibucontext;
  59. u16 uarn;
  60. };
  61. struct efa_pd {
  62. struct ib_pd ibpd;
  63. u16 pdn;
  64. };
  65. struct efa_mr {
  66. struct ib_mr ibmr;
  67. struct ib_umem *umem;
  68. };
  69. struct efa_cq {
  70. struct ib_cq ibcq;
  71. struct efa_ucontext *ucontext;
  72. dma_addr_t dma_addr;
  73. void *cpu_addr;
  74. struct rdma_user_mmap_entry *mmap_entry;
  75. struct rdma_user_mmap_entry *db_mmap_entry;
  76. size_t size;
  77. u16 cq_idx;
  78. /* NULL when no interrupts requested */
  79. struct efa_eq *eq;
  80. };
  81. struct efa_qp {
  82. struct ib_qp ibqp;
  83. dma_addr_t rq_dma_addr;
  84. void *rq_cpu_addr;
  85. size_t rq_size;
  86. enum ib_qp_state state;
  87. /* Used for saving mmap_xa entries */
  88. struct rdma_user_mmap_entry *sq_db_mmap_entry;
  89. struct rdma_user_mmap_entry *llq_desc_mmap_entry;
  90. struct rdma_user_mmap_entry *rq_db_mmap_entry;
  91. struct rdma_user_mmap_entry *rq_mmap_entry;
  92. u32 qp_handle;
  93. u32 max_send_wr;
  94. u32 max_recv_wr;
  95. u32 max_send_sge;
  96. u32 max_recv_sge;
  97. u32 max_inline_data;
  98. };
  99. struct efa_ah {
  100. struct ib_ah ibah;
  101. u16 ah;
  102. /* dest_addr */
  103. u8 id[EFA_GID_SIZE];
  104. };
  105. struct efa_eq {
  106. struct efa_com_eq eeq;
  107. struct efa_irq irq;
  108. };
  109. int efa_query_device(struct ib_device *ibdev,
  110. struct ib_device_attr *props,
  111. struct ib_udata *udata);
  112. int efa_query_port(struct ib_device *ibdev, u32 port,
  113. struct ib_port_attr *props);
  114. int efa_query_qp(struct ib_qp *ibqp, struct ib_qp_attr *qp_attr,
  115. int qp_attr_mask,
  116. struct ib_qp_init_attr *qp_init_attr);
  117. int efa_query_gid(struct ib_device *ibdev, u32 port, int index,
  118. union ib_gid *gid);
  119. int efa_query_pkey(struct ib_device *ibdev, u32 port, u16 index,
  120. u16 *pkey);
  121. int efa_alloc_pd(struct ib_pd *ibpd, struct ib_udata *udata);
  122. int efa_dealloc_pd(struct ib_pd *ibpd, struct ib_udata *udata);
  123. int efa_destroy_qp(struct ib_qp *ibqp, struct ib_udata *udata);
  124. int efa_create_qp(struct ib_qp *ibqp, struct ib_qp_init_attr *init_attr,
  125. struct ib_udata *udata);
  126. int efa_destroy_cq(struct ib_cq *ibcq, struct ib_udata *udata);
  127. int efa_create_cq(struct ib_cq *ibcq, const struct ib_cq_init_attr *attr,
  128. struct ib_udata *udata);
  129. struct ib_mr *efa_reg_mr(struct ib_pd *ibpd, u64 start, u64 length,
  130. u64 virt_addr, int access_flags,
  131. struct ib_udata *udata);
  132. struct ib_mr *efa_reg_user_mr_dmabuf(struct ib_pd *ibpd, u64 start,
  133. u64 length, u64 virt_addr,
  134. int fd, int access_flags,
  135. struct ib_udata *udata);
  136. int efa_dereg_mr(struct ib_mr *ibmr, struct ib_udata *udata);
  137. int efa_get_port_immutable(struct ib_device *ibdev, u32 port_num,
  138. struct ib_port_immutable *immutable);
  139. int efa_alloc_ucontext(struct ib_ucontext *ibucontext, struct ib_udata *udata);
  140. void efa_dealloc_ucontext(struct ib_ucontext *ibucontext);
  141. int efa_mmap(struct ib_ucontext *ibucontext,
  142. struct vm_area_struct *vma);
  143. void efa_mmap_free(struct rdma_user_mmap_entry *rdma_entry);
  144. int efa_create_ah(struct ib_ah *ibah,
  145. struct rdma_ah_init_attr *init_attr,
  146. struct ib_udata *udata);
  147. int efa_destroy_ah(struct ib_ah *ibah, u32 flags);
  148. int efa_modify_qp(struct ib_qp *ibqp, struct ib_qp_attr *qp_attr,
  149. int qp_attr_mask, struct ib_udata *udata);
  150. enum rdma_link_layer efa_port_link_layer(struct ib_device *ibdev,
  151. u32 port_num);
  152. struct rdma_hw_stats *efa_alloc_hw_port_stats(struct ib_device *ibdev, u32 port_num);
  153. struct rdma_hw_stats *efa_alloc_hw_device_stats(struct ib_device *ibdev);
  154. int efa_get_hw_stats(struct ib_device *ibdev, struct rdma_hw_stats *stats,
  155. u32 port_num, int index);
  156. #endif /* _EFA_H_ */