hc
2023-12-11 d2ccde1c8e90d38cee87a1b0309ad2827f3fd30d
kernel/drivers/infiniband/hw/qedr/qedr.h
....@@ -33,17 +33,18 @@
3333 #define __QEDR_H__
3434
3535 #include <linux/pci.h>
36
-#include <linux/idr.h>
36
+#include <linux/xarray.h>
3737 #include <rdma/ib_addr.h>
3838 #include <linux/qed/qed_if.h>
3939 #include <linux/qed/qed_chain.h>
4040 #include <linux/qed/qed_rdma_if.h>
4141 #include <linux/qed/qede_rdma.h>
4242 #include <linux/qed/roce_common.h>
43
+#include <linux/completion.h>
4344 #include "qedr_hsi_rdma.h"
4445
4546 #define QEDR_NODE_DESC "QLogic 579xx RoCE HCA"
46
-#define DP_NAME(dev) ((dev)->ibdev.name)
47
+#define DP_NAME(_dev) dev_name(&(_dev)->ibdev.dev)
4748 #define IS_IWARP(_dev) ((_dev)->rdma_type == QED_RDMA_TYPE_IWARP)
4849 #define IS_ROCE(_dev) ((_dev)->rdma_type == QED_RDMA_TYPE_ROCE)
4950
....@@ -102,7 +103,6 @@
102103 u64 max_mr_size;
103104 u32 max_cqe;
104105 u32 max_mw;
105
- u32 max_fmr;
106106 u32 max_mr_mw_fmr_pbl;
107107 u64 max_mr_mw_fmr_size;
108108 u32 max_pd;
....@@ -122,11 +122,6 @@
122122 };
123123
124124 #define QEDR_ENET_STATE_BIT (0)
125
-
126
-struct qedr_idr {
127
- spinlock_t idr_lock; /* Protect idr data-structure */
128
- struct idr idr;
129
-};
130125
131126 struct qedr_dev {
132127 struct ib_device ibdev;
....@@ -162,6 +157,8 @@
162157 u32 dp_module;
163158 u8 dp_level;
164159 u8 num_hwfns;
160
+#define QEDR_IS_CMT(dev) ((dev)->num_hwfns > 1)
161
+ u8 affin_hwfn_idx;
165162 u8 gsi_ll2_handle;
166163
167164 uint wq_multiplier;
....@@ -171,8 +168,8 @@
171168 struct qedr_cq *gsi_rqcq;
172169 struct qedr_qp *gsi_qp;
173170 enum qed_rdma_type rdma_type;
174
- struct qedr_idr qpidr;
175
- struct qedr_idr srqidr;
171
+ struct xarray qps;
172
+ struct xarray srqs;
176173 struct workqueue_struct *iwarp_wq;
177174 u16 iwarp_max_mtu;
178175
....@@ -232,15 +229,18 @@
232229 struct ib_ucontext ibucontext;
233230 struct qedr_dev *dev;
234231 struct qedr_pd *pd;
235
- u64 dpi_addr;
232
+ void __iomem *dpi_addr;
233
+ struct rdma_user_mmap_entry *db_mmap_entry;
236234 u64 dpi_phys_addr;
237235 u32 dpi_size;
238236 u16 dpi;
237
+ bool db_rec;
238
+ u8 edpm_mode;
239
+};
239240
240
- struct list_head mm_head;
241
-
242
- /* Lock to protect mm list */
243
- struct mutex mm_list_lock;
241
+union db_prod32 {
242
+ struct rdma_pwm_val16_data data;
243
+ u32 raw;
244244 };
245245
246246 union db_prod64 {
....@@ -268,6 +268,13 @@
268268 struct qedr_pbl *pbl_tbl;
269269 u64 buf_addr;
270270 size_t buf_len;
271
+
272
+ /* doorbell recovery */
273
+ void __iomem *db_addr;
274
+ struct qedr_user_db_rec *db_rec_data;
275
+ struct rdma_user_mmap_entry *db_mmap_entry;
276
+ void __iomem *db_rec_db2_addr;
277
+ union db_prod32 db_rec_db2_data;
271278 };
272279
273280 struct qedr_cq {
....@@ -303,17 +310,9 @@
303310 struct qedr_ucontext *uctx;
304311 };
305312
306
-struct qedr_mm {
307
- struct {
308
- u64 phy_addr;
309
- unsigned long len;
310
- } key;
311
- struct list_head entry;
312
-};
313
-
314
-union db_prod32 {
315
- struct rdma_pwm_val16_data data;
316
- u32 raw;
313
+struct qedr_xrcd {
314
+ struct ib_xrcd ibxrcd;
315
+ u16 xrcd_id;
317316 };
318317
319318 struct qedr_qp_hwq_info {
....@@ -367,6 +366,7 @@
367366 struct ib_umem *prod_umem;
368367 u16 srq_id;
369368 u32 srq_limit;
369
+ bool is_xrc;
370370 /* lock to protect srq recv post */
371371 spinlock_t lock;
372372 };
....@@ -380,10 +380,20 @@
380380 QEDR_QP_ERR_RQ_PBL_FULL = 32,
381381 };
382382
383
+enum qedr_qp_create_type {
384
+ QEDR_QP_CREATE_NONE,
385
+ QEDR_QP_CREATE_USER,
386
+ QEDR_QP_CREATE_KERNEL,
387
+};
388
+
389
+enum qedr_iwarp_cm_flags {
390
+ QEDR_IWARP_CM_WAIT_FOR_CONNECT = BIT(0),
391
+ QEDR_IWARP_CM_WAIT_FOR_DISCONNECT = BIT(1),
392
+};
393
+
383394 struct qedr_qp {
384395 struct ib_qp ibqp; /* must be first */
385396 struct qedr_dev *dev;
386
- struct qedr_iw_ep *ep;
387397 struct qedr_qp_hwq_info sq;
388398 struct qedr_qp_hwq_info rq;
389399
....@@ -398,6 +408,7 @@
398408 u32 id;
399409 struct qedr_pd *pd;
400410 enum ib_qp_type qp_type;
411
+ enum qedr_qp_create_type create_type;
401412 struct qed_rdma_qp *qed_qp;
402413 u32 qp_id;
403414 u16 icid;
....@@ -407,6 +418,7 @@
407418 u32 sq_psn;
408419 u32 qkey;
409420 u32 dest_qp_num;
421
+ u8 timeout;
410422
411423 /* Relevant to qps created from kernel space only (ULPs) */
412424 u8 prev_wqe_size;
....@@ -440,8 +452,11 @@
440452 /* Relevant to qps created from user space only (applications) */
441453 struct qedr_userq usq;
442454 struct qedr_userq urq;
443
- atomic_t refcnt;
444
- bool destroyed;
455
+
456
+ /* synchronization objects used with iwarp ep */
457
+ struct kref refcnt;
458
+ struct completion iwarp_cm_comp;
459
+ unsigned long iwarp_cm_flags; /* enum iwarp_cm_flags */
445460 };
446461
447462 struct qedr_ah {
....@@ -477,6 +492,18 @@
477492
478493 u64 *pages;
479494 u32 npages;
495
+};
496
+
497
+struct qedr_user_mmap_entry {
498
+ struct rdma_user_mmap_entry rdma_entry;
499
+ struct qedr_dev *dev;
500
+ union {
501
+ u64 io_address;
502
+ void *address;
503
+ };
504
+ size_t length;
505
+ u16 dpi;
506
+ u8 mmap_flag;
480507 };
481508
482509 #define SET_FIELD2(value, name, flag) ((value) |= ((flag) << (name ## _SHIFT)))
....@@ -534,7 +561,7 @@
534561 struct iw_cm_id *cm_id;
535562 struct qedr_qp *qp;
536563 void *qed_context;
537
- u8 during_connect;
564
+ struct kref refcnt;
538565 };
539566
540567 static inline
....@@ -551,6 +578,11 @@
551578 static inline struct qedr_pd *get_qedr_pd(struct ib_pd *ibpd)
552579 {
553580 return container_of(ibpd, struct qedr_pd, ibpd);
581
+}
582
+
583
+static inline struct qedr_xrcd *get_qedr_xrcd(struct ib_xrcd *ibxrcd)
584
+{
585
+ return container_of(ibxrcd, struct qedr_xrcd, ibxrcd);
554586 }
555587
556588 static inline struct qedr_cq *get_qedr_cq(struct ib_cq *ibcq)
....@@ -577,4 +609,33 @@
577609 {
578610 return container_of(ibsrq, struct qedr_srq, ibsrq);
579611 }
612
+
613
+static inline bool qedr_qp_has_srq(struct qedr_qp *qp)
614
+{
615
+ return qp->srq;
616
+}
617
+
618
+static inline bool qedr_qp_has_sq(struct qedr_qp *qp)
619
+{
620
+ if (qp->qp_type == IB_QPT_GSI || qp->qp_type == IB_QPT_XRC_TGT)
621
+ return 0;
622
+
623
+ return 1;
624
+}
625
+
626
+static inline bool qedr_qp_has_rq(struct qedr_qp *qp)
627
+{
628
+ if (qp->qp_type == IB_QPT_GSI || qp->qp_type == IB_QPT_XRC_INI ||
629
+ qp->qp_type == IB_QPT_XRC_TGT || qedr_qp_has_srq(qp))
630
+ return 0;
631
+
632
+ return 1;
633
+}
634
+
635
+static inline struct qedr_user_mmap_entry *
636
+get_qedr_mmap_entry(struct rdma_user_mmap_entry *rdma_entry)
637
+{
638
+ return container_of(rdma_entry, struct qedr_user_mmap_entry,
639
+ rdma_entry);
640
+}
580641 #endif