1 /* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */
5 /* Copyright (c) 2020-2022, Alibaba Group. */
10 #include <linux/bitfield.h>
11 #include <linux/netdevice.h>
12 #include <linux/xarray.h>
13 #include <rdma/ib_verbs.h>
17 #define DRV_MODULE_NAME "erdma"
18 #define ERDMA_NODE_DESC "Elastic RDMA(iWARP) stack"
22 dma_addr_t qbuf_dma_addr;
32 atomic64_t notify_num;
38 struct erdma_cmdq_sq {
40 dma_addr_t qbuf_dma_addr;
53 struct erdma_cmdq_cq {
55 dma_addr_t qbuf_dma_addr;
69 ERDMA_CMD_STATUS_INIT,
70 ERDMA_CMD_STATUS_ISSUED,
71 ERDMA_CMD_STATUS_FINISHED,
72 ERDMA_CMD_STATUS_TIMEOUT
75 struct erdma_comp_wait {
76 struct completion wait_event;
86 ERDMA_CMDQ_STATE_OK_BIT = 0,
87 ERDMA_CMDQ_STATE_TIMEOUT_BIT = 1,
88 ERDMA_CMDQ_STATE_CTX_ERR_BIT = 2,
91 #define ERDMA_CMDQ_TIMEOUT_MS 15000
92 #define ERDMA_REG_ACCESS_WAIT_MS 20
93 #define ERDMA_WAIT_DEV_DONE_CNT 500
96 unsigned long *comp_wait_bitmap;
97 struct erdma_comp_wait *wait_pool;
102 struct erdma_cmdq_sq sq;
103 struct erdma_cmdq_cq cq;
108 struct semaphore credits;
109 u16 max_outstandings;
112 #define COMPROMISE_CC ERDMA_CC_CUBIC
114 ERDMA_CC_NEWRENO = 0,
122 struct erdma_devattr {
125 unsigned char peer_addr[ETH_ALEN];
128 enum erdma_cc_alg cc;
154 #define ERDMA_IRQNAME_SIZE 50
157 char name[ERDMA_IRQNAME_SIZE];
159 cpumask_t affinity_hint_mask;
164 void *dev; /* All EQs use this fields to get erdma_dev struct */
165 struct erdma_irq irq;
167 struct tasklet_struct tasklet;
170 struct erdma_resource_cb {
171 unsigned long *bitmap;
178 ERDMA_RES_TYPE_PD = 0,
179 ERDMA_RES_TYPE_STAG_IDX = 1,
183 #define ERDMA_EXTRA_BUFFER_SIZE ERDMA_DB_SIZE
184 #define WARPPED_BUFSIZE(size) ((size) + ERDMA_EXTRA_BUFFER_SIZE)
187 struct ib_device ibdev;
188 struct net_device *netdev;
189 struct pci_dev *pdev;
190 struct notifier_block netdev_nb;
192 resource_size_t func_bar_addr;
193 resource_size_t func_bar_len;
194 u8 __iomem *func_bar;
196 struct erdma_devattr attrs;
197 /* physical port state (only one port per device) */
198 enum ib_port_state state;
200 /* cmdq and aeq use the same msix vector */
201 struct erdma_irq comm_irq;
202 struct erdma_cmdq cmdq;
204 struct erdma_eq_cb ceqs[ERDMA_NUM_MSIX_VEC - 1];
207 struct erdma_resource_cb res_cb[ERDMA_RES_CNT];
214 spinlock_t db_bitmap_lock;
215 /* We provide max 64 uContexts that each has one SQ doorbell Page. */
216 DECLARE_BITMAP(sdb_page, ERDMA_DWQE_TYPE0_CNT);
218 * We provide max 496 uContexts that each has one SQ normal Db,
219 * and one directWQE db。
221 DECLARE_BITMAP(sdb_entry, ERDMA_DWQE_TYPE1_CNT);
224 struct list_head cep_list;
227 static inline void *get_queue_entry(void *qbuf, u32 idx, u32 depth, u32 shift)
231 return qbuf + (idx << shift);
234 static inline struct erdma_dev *to_edev(struct ib_device *ibdev)
236 return container_of(ibdev, struct erdma_dev, ibdev);
239 static inline u32 erdma_reg_read32(struct erdma_dev *dev, u32 reg)
241 return readl(dev->func_bar + reg);
244 static inline u64 erdma_reg_read64(struct erdma_dev *dev, u32 reg)
246 return readq(dev->func_bar + reg);
249 static inline void erdma_reg_write32(struct erdma_dev *dev, u32 reg, u32 value)
251 writel(value, dev->func_bar + reg);
254 static inline void erdma_reg_write64(struct erdma_dev *dev, u32 reg, u64 value)
256 writeq(value, dev->func_bar + reg);
259 static inline u32 erdma_reg_read32_filed(struct erdma_dev *dev, u32 reg,
262 u32 val = erdma_reg_read32(dev, reg);
264 return FIELD_GET(filed_mask, val);
267 int erdma_cmdq_init(struct erdma_dev *dev);
268 void erdma_finish_cmdq_init(struct erdma_dev *dev);
269 void erdma_cmdq_destroy(struct erdma_dev *dev);
271 void erdma_cmdq_build_reqhdr(u64 *hdr, u32 mod, u32 op);
272 int erdma_post_cmd_wait(struct erdma_cmdq *cmdq, u64 *req, u32 req_size,
273 u64 *resp0, u64 *resp1);
274 void erdma_cmdq_completion_handler(struct erdma_cmdq *cmdq);
276 int erdma_ceqs_init(struct erdma_dev *dev);
277 void erdma_ceqs_uninit(struct erdma_dev *dev);
278 void notify_eq(struct erdma_eq *eq);
279 void *get_next_valid_eqe(struct erdma_eq *eq);
281 int erdma_aeq_init(struct erdma_dev *dev);
282 void erdma_aeq_destroy(struct erdma_dev *dev);
284 void erdma_aeq_event_handler(struct erdma_dev *dev);
285 void erdma_ceq_completion_handler(struct erdma_eq_cb *ceq_cb);