erdma.h 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289
  1. /* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */
  2. /* Authors: Cheng Xu <[email protected]> */
  3. /* Kai Shen <[email protected]> */
  4. /* Copyright (c) 2020-2022, Alibaba Group. */
  5. #ifndef __ERDMA_H__
  6. #define __ERDMA_H__
  7. #include <linux/bitfield.h>
  8. #include <linux/netdevice.h>
  9. #include <linux/pci.h>
  10. #include <linux/xarray.h>
  11. #include <rdma/ib_verbs.h>
  12. #include "erdma_hw.h"
  13. #define DRV_MODULE_NAME "erdma"
  14. #define ERDMA_NODE_DESC "Elastic RDMA(iWARP) stack"
  15. struct erdma_eq {
  16. void *qbuf;
  17. dma_addr_t qbuf_dma_addr;
  18. spinlock_t lock;
  19. u32 depth;
  20. u16 ci;
  21. u16 rsvd;
  22. atomic64_t event_num;
  23. atomic64_t notify_num;
  24. u64 __iomem *db_addr;
  25. u64 *db_record;
  26. };
  27. struct erdma_cmdq_sq {
  28. void *qbuf;
  29. dma_addr_t qbuf_dma_addr;
  30. spinlock_t lock;
  31. u32 depth;
  32. u16 ci;
  33. u16 pi;
  34. u16 wqebb_cnt;
  35. u64 *db_record;
  36. };
  37. struct erdma_cmdq_cq {
  38. void *qbuf;
  39. dma_addr_t qbuf_dma_addr;
  40. spinlock_t lock;
  41. u32 depth;
  42. u32 ci;
  43. u32 cmdsn;
  44. u64 *db_record;
  45. atomic64_t armed_num;
  46. };
  47. enum {
  48. ERDMA_CMD_STATUS_INIT,
  49. ERDMA_CMD_STATUS_ISSUED,
  50. ERDMA_CMD_STATUS_FINISHED,
  51. ERDMA_CMD_STATUS_TIMEOUT
  52. };
  53. struct erdma_comp_wait {
  54. struct completion wait_event;
  55. u32 cmd_status;
  56. u32 ctx_id;
  57. u16 sq_pi;
  58. u8 comp_status;
  59. u8 rsvd;
  60. u32 comp_data[4];
  61. };
  62. enum {
  63. ERDMA_CMDQ_STATE_OK_BIT = 0,
  64. ERDMA_CMDQ_STATE_TIMEOUT_BIT = 1,
  65. ERDMA_CMDQ_STATE_CTX_ERR_BIT = 2,
  66. };
  67. #define ERDMA_CMDQ_TIMEOUT_MS 15000
  68. #define ERDMA_REG_ACCESS_WAIT_MS 20
  69. #define ERDMA_WAIT_DEV_DONE_CNT 500
  70. struct erdma_cmdq {
  71. unsigned long *comp_wait_bitmap;
  72. struct erdma_comp_wait *wait_pool;
  73. spinlock_t lock;
  74. bool use_event;
  75. struct erdma_cmdq_sq sq;
  76. struct erdma_cmdq_cq cq;
  77. struct erdma_eq eq;
  78. unsigned long state;
  79. struct semaphore credits;
  80. u16 max_outstandings;
  81. };
  82. #define COMPROMISE_CC ERDMA_CC_CUBIC
  83. enum erdma_cc_alg {
  84. ERDMA_CC_NEWRENO = 0,
  85. ERDMA_CC_CUBIC,
  86. ERDMA_CC_HPCC_RTT,
  87. ERDMA_CC_HPCC_ECN,
  88. ERDMA_CC_HPCC_INT,
  89. ERDMA_CC_METHODS_NUM
  90. };
  91. struct erdma_devattr {
  92. u32 fw_version;
  93. unsigned char peer_addr[ETH_ALEN];
  94. int numa_node;
  95. enum erdma_cc_alg cc;
  96. u32 grp_num;
  97. u32 irq_num;
  98. bool disable_dwqe;
  99. u16 dwqe_pages;
  100. u16 dwqe_entries;
  101. u32 max_qp;
  102. u32 max_send_wr;
  103. u32 max_recv_wr;
  104. u32 max_ord;
  105. u32 max_ird;
  106. u32 max_send_sge;
  107. u32 max_recv_sge;
  108. u32 max_sge_rd;
  109. u32 max_cq;
  110. u32 max_cqe;
  111. u64 max_mr_size;
  112. u32 max_mr;
  113. u32 max_pd;
  114. u32 max_mw;
  115. u32 local_dma_key;
  116. };
  117. #define ERDMA_IRQNAME_SIZE 50
  118. struct erdma_irq {
  119. char name[ERDMA_IRQNAME_SIZE];
  120. u32 msix_vector;
  121. cpumask_t affinity_hint_mask;
  122. };
  123. struct erdma_eq_cb {
  124. bool ready;
  125. void *dev; /* All EQs use this fields to get erdma_dev struct */
  126. struct erdma_irq irq;
  127. struct erdma_eq eq;
  128. struct tasklet_struct tasklet;
  129. };
  130. struct erdma_resource_cb {
  131. unsigned long *bitmap;
  132. spinlock_t lock;
  133. u32 next_alloc_idx;
  134. u32 max_cap;
  135. };
  136. enum {
  137. ERDMA_RES_TYPE_PD = 0,
  138. ERDMA_RES_TYPE_STAG_IDX = 1,
  139. ERDMA_RES_CNT = 2,
  140. };
  141. #define ERDMA_EXTRA_BUFFER_SIZE ERDMA_DB_SIZE
  142. #define WARPPED_BUFSIZE(size) ((size) + ERDMA_EXTRA_BUFFER_SIZE)
  143. struct erdma_dev {
  144. struct ib_device ibdev;
  145. struct net_device *netdev;
  146. struct pci_dev *pdev;
  147. struct notifier_block netdev_nb;
  148. resource_size_t func_bar_addr;
  149. resource_size_t func_bar_len;
  150. u8 __iomem *func_bar;
  151. struct erdma_devattr attrs;
  152. /* physical port state (only one port per device) */
  153. enum ib_port_state state;
  154. u32 mtu;
  155. /* cmdq and aeq use the same msix vector */
  156. struct erdma_irq comm_irq;
  157. struct erdma_cmdq cmdq;
  158. struct erdma_eq aeq;
  159. struct erdma_eq_cb ceqs[ERDMA_NUM_MSIX_VEC - 1];
  160. spinlock_t lock;
  161. struct erdma_resource_cb res_cb[ERDMA_RES_CNT];
  162. struct xarray qp_xa;
  163. struct xarray cq_xa;
  164. u32 next_alloc_qpn;
  165. u32 next_alloc_cqn;
  166. spinlock_t db_bitmap_lock;
  167. /* We provide max 64 uContexts that each has one SQ doorbell Page. */
  168. DECLARE_BITMAP(sdb_page, ERDMA_DWQE_TYPE0_CNT);
  169. /*
  170. * We provide max 496 uContexts that each has one SQ normal Db,
  171. * and one directWQE db。
  172. */
  173. DECLARE_BITMAP(sdb_entry, ERDMA_DWQE_TYPE1_CNT);
  174. atomic_t num_ctx;
  175. struct list_head cep_list;
  176. };
  177. static inline void *get_queue_entry(void *qbuf, u32 idx, u32 depth, u32 shift)
  178. {
  179. idx &= (depth - 1);
  180. return qbuf + (idx << shift);
  181. }
  182. static inline struct erdma_dev *to_edev(struct ib_device *ibdev)
  183. {
  184. return container_of(ibdev, struct erdma_dev, ibdev);
  185. }
  186. static inline u32 erdma_reg_read32(struct erdma_dev *dev, u32 reg)
  187. {
  188. return readl(dev->func_bar + reg);
  189. }
  190. static inline u64 erdma_reg_read64(struct erdma_dev *dev, u32 reg)
  191. {
  192. return readq(dev->func_bar + reg);
  193. }
  194. static inline void erdma_reg_write32(struct erdma_dev *dev, u32 reg, u32 value)
  195. {
  196. writel(value, dev->func_bar + reg);
  197. }
  198. static inline void erdma_reg_write64(struct erdma_dev *dev, u32 reg, u64 value)
  199. {
  200. writeq(value, dev->func_bar + reg);
  201. }
  202. static inline u32 erdma_reg_read32_filed(struct erdma_dev *dev, u32 reg,
  203. u32 filed_mask)
  204. {
  205. u32 val = erdma_reg_read32(dev, reg);
  206. return FIELD_GET(filed_mask, val);
  207. }
  208. int erdma_cmdq_init(struct erdma_dev *dev);
  209. void erdma_finish_cmdq_init(struct erdma_dev *dev);
  210. void erdma_cmdq_destroy(struct erdma_dev *dev);
  211. void erdma_cmdq_build_reqhdr(u64 *hdr, u32 mod, u32 op);
  212. int erdma_post_cmd_wait(struct erdma_cmdq *cmdq, void *req, u32 req_size,
  213. u64 *resp0, u64 *resp1);
  214. void erdma_cmdq_completion_handler(struct erdma_cmdq *cmdq);
  215. int erdma_ceqs_init(struct erdma_dev *dev);
  216. void erdma_ceqs_uninit(struct erdma_dev *dev);
  217. void notify_eq(struct erdma_eq *eq);
  218. void *get_next_valid_eqe(struct erdma_eq *eq);
  219. int erdma_aeq_init(struct erdma_dev *dev);
  220. void erdma_aeq_destroy(struct erdma_dev *dev);
  221. void erdma_aeq_event_handler(struct erdma_dev *dev);
  222. void erdma_ceq_completion_handler(struct erdma_eq_cb *ceq_cb);
  223. #endif