public inbox for linux-rdma@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCH for-next 0/6] RDMA/bnxt_re: driver update for supporting low latency push
@ 2023-04-10 11:11 Selvin Xavier
  2023-04-10 11:11 ` [PATCH for-next 1/6] RDMA/bnxt_re: Use the common mmap helper functions Selvin Xavier
                   ` (6 more replies)
  0 siblings, 7 replies; 17+ messages in thread
From: Selvin Xavier @ 2023-04-10 11:11 UTC (permalink / raw)
  To: jgg, leon; +Cc: linux-rdma, andrew.gospodarek, Selvin Xavier

[-- Attachment #1: Type: text/plain, Size: 1435 bytes --]

The series aims to add support for Low latency push path in
some of the bnxt devices. The low latency implementation is
supported only for the user applications. Also, the code
is modified to use  common mmap helper functions exported
by IB core. 

User library changes are added in the pull request
https://github.com/linux-rdma/rdma-core/pull/1321

Please review.

Thanks,
Selvin Xavier

Selvin Xavier (6):
  RDMA/bnxt_re: Use the common mmap helper functions
  RDMA/bnxt_re: Add disassociate ucontext support
  RDMA/bnxt_re: Query function capabilities from firmware
  RDMA/bnxt_re: Move the interface version to chip context structure
  RDMA/bnxt_re: Reorg the bar mapping
  RDMA/bnxt_re: Enable low latency push

 drivers/infiniband/hw/bnxt_re/ib_verbs.c   | 160 +++++++++++++++++++++---
 drivers/infiniband/hw/bnxt_re/ib_verbs.h   |  17 +++
 drivers/infiniband/hw/bnxt_re/main.c       | 123 +++++++++++++++++-
 drivers/infiniband/hw/bnxt_re/qplib_fp.c   |  14 +--
 drivers/infiniband/hw/bnxt_re/qplib_rcfw.c |   2 +-
 drivers/infiniband/hw/bnxt_re/qplib_rcfw.h |   1 +
 drivers/infiniband/hw/bnxt_re/qplib_res.c  | 192 +++++++++++++++++++----------
 drivers/infiniband/hw/bnxt_re/qplib_res.h  |  33 +++--
 drivers/infiniband/hw/bnxt_re/qplib_sp.c   |   3 +
 drivers/infiniband/hw/bnxt_re/qplib_sp.h   |   1 +
 include/uapi/rdma/bnxt_re-abi.h            |   9 ++
 11 files changed, 449 insertions(+), 106 deletions(-)

-- 
2.5.5


[-- Attachment #2: S/MIME Cryptographic Signature --]
[-- Type: application/pkcs7-signature, Size: 4224 bytes --]

^ permalink raw reply	[flat|nested] 17+ messages in thread

* [PATCH for-next 1/6] RDMA/bnxt_re: Use the common mmap helper functions
  2023-04-10 11:11 [PATCH for-next 0/6] RDMA/bnxt_re: driver update for supporting low latency push Selvin Xavier
@ 2023-04-10 11:11 ` Selvin Xavier
  2023-04-10 12:20   ` Leon Romanovsky
  2023-04-11 16:53   ` Jason Gunthorpe
  2023-04-10 11:11 ` [PATCH for-next 2/6] RDMA/bnxt_re: Add disassociate ucontext support Selvin Xavier
                   ` (5 subsequent siblings)
  6 siblings, 2 replies; 17+ messages in thread
From: Selvin Xavier @ 2023-04-10 11:11 UTC (permalink / raw)
  To: jgg, leon; +Cc: linux-rdma, andrew.gospodarek, Selvin Xavier

[-- Attachment #1: Type: text/plain, Size: 9877 bytes --]

Replace the mmap handling function with common code in
IB core. Create rdma_user_mmap_entry for each mmap
resource and add to the ib_core mmap list. Add mmap_free
verb support. Also, use rdma_user_mmap_io while mapping
Doorbell pages.

Signed-off-by: Selvin Xavier <selvin.xavier@broadcom.com>
---
 drivers/infiniband/hw/bnxt_re/ib_verbs.c  | 110 ++++++++++++++++++++++++++----
 drivers/infiniband/hw/bnxt_re/ib_verbs.h  |  15 ++++
 drivers/infiniband/hw/bnxt_re/main.c      |   1 +
 drivers/infiniband/hw/bnxt_re/qplib_fp.c  |  10 +--
 drivers/infiniband/hw/bnxt_re/qplib_res.c |   2 +-
 5 files changed, 115 insertions(+), 23 deletions(-)

diff --git a/drivers/infiniband/hw/bnxt_re/ib_verbs.c b/drivers/infiniband/hw/bnxt_re/ib_verbs.c
index e86afec..c9d134c 100644
--- a/drivers/infiniband/hw/bnxt_re/ib_verbs.c
+++ b/drivers/infiniband/hw/bnxt_re/ib_verbs.c
@@ -533,12 +533,42 @@ static int bnxt_re_create_fence_mr(struct bnxt_re_pd *pd)
 	return rc;
 }
 
+static struct rdma_user_mmap_entry*
+bnxt_re_mmap_entry_insert(struct bnxt_re_ucontext *uctx, u64 mem_offset,
+			  enum bnxt_re_mmap_flag mmap_flag, u64 *offset)
+{
+	struct bnxt_re_user_mmap_entry *entry = kzalloc(sizeof(*entry), GFP_KERNEL);
+	int ret;
+
+	if (!entry)
+		return NULL;
+
+	entry->mem_offset = mem_offset;
+	entry->mmap_flag = mmap_flag;
+
+	ret = rdma_user_mmap_entry_insert(&uctx->ib_uctx,
+					  &entry->rdma_entry, PAGE_SIZE);
+	if (ret) {
+		kfree(entry);
+		return NULL;
+	}
+	if (offset)
+		*offset = rdma_user_mmap_get_offset(&entry->rdma_entry);
+
+	return &entry->rdma_entry;
+}
+
 /* Protection Domains */
 int bnxt_re_dealloc_pd(struct ib_pd *ib_pd, struct ib_udata *udata)
 {
 	struct bnxt_re_pd *pd = container_of(ib_pd, struct bnxt_re_pd, ib_pd);
 	struct bnxt_re_dev *rdev = pd->rdev;
 
+	if (udata) {
+		rdma_user_mmap_entry_remove(pd->pd_db_mmap);
+		pd->pd_db_mmap = NULL;
+	}
+
 	bnxt_re_destroy_fence_mr(pd);
 
 	if (pd->qplib_pd.id) {
@@ -557,7 +587,7 @@ int bnxt_re_alloc_pd(struct ib_pd *ibpd, struct ib_udata *udata)
 	struct bnxt_re_ucontext *ucntx = rdma_udata_to_drv_context(
 		udata, struct bnxt_re_ucontext, ib_uctx);
 	struct bnxt_re_pd *pd = container_of(ibpd, struct bnxt_re_pd, ib_pd);
-	int rc;
+	int rc = 0;
 
 	pd->rdev = rdev;
 	if (bnxt_qplib_alloc_pd(&rdev->qplib_res.pd_tbl, &pd->qplib_pd)) {
@@ -567,7 +597,7 @@ int bnxt_re_alloc_pd(struct ib_pd *ibpd, struct ib_udata *udata)
 	}
 
 	if (udata) {
-		struct bnxt_re_pd_resp resp;
+		struct bnxt_re_pd_resp resp = {};
 
 		if (!ucntx->dpi.dbr) {
 			/* Allocate DPI in alloc_pd to avoid failing of
@@ -584,12 +614,23 @@ int bnxt_re_alloc_pd(struct ib_pd *ibpd, struct ib_udata *udata)
 		resp.pdid = pd->qplib_pd.id;
 		/* Still allow mapping this DBR to the new user PD. */
 		resp.dpi = ucntx->dpi.dpi;
-		resp.dbr = (u64)ucntx->dpi.umdbr;
 
-		rc = ib_copy_to_udata(udata, &resp, sizeof(resp));
+		pd->pd_db_mmap = bnxt_re_mmap_entry_insert(ucntx, (u64)ucntx->dpi.umdbr,
+							   BNXT_RE_MMAP_UC_DB, &resp.dbr);
+
+		if (!pd->pd_db_mmap) {
+			ibdev_err(&rdev->ibdev,
+				  "Failed to insert mmap entry\n");
+			rc = -ENOMEM;
+			goto dbfail;
+		}
+
+		rc = ib_copy_to_udata(udata, &resp, min(sizeof(resp), udata->outlen));
 		if (rc) {
 			ibdev_err(&rdev->ibdev,
 				  "Failed to copy user response\n");
+			rdma_user_mmap_entry_remove(pd->pd_db_mmap);
+			rc = -EFAULT;
 			goto dbfail;
 		}
 	}
@@ -3994,6 +4035,13 @@ int bnxt_re_alloc_ucontext(struct ib_ucontext *ctx, struct ib_udata *udata)
 	resp.comp_mask |= BNXT_RE_UCNTX_CMASK_HAVE_MODE;
 	resp.mode = rdev->chip_ctx->modes.wqe_mode;
 
+	uctx->shpage_mmap = bnxt_re_mmap_entry_insert(uctx, 0, BNXT_RE_MMAP_SH_PAGE, NULL);
+	if (!uctx->shpage_mmap) {
+		ibdev_err(ibdev, "Failed to create mmap entry for shared page\n");
+		rc = -ENOMEM;
+		goto cfail;
+	}
+
 	rc = ib_copy_to_udata(udata, &resp, min(udata->outlen, sizeof(resp)));
 	if (rc) {
 		ibdev_err(ibdev, "Failed to copy user context");
@@ -4017,6 +4065,8 @@ void bnxt_re_dealloc_ucontext(struct ib_ucontext *ib_uctx)
 
 	struct bnxt_re_dev *rdev = uctx->rdev;
 
+	rdma_user_mmap_entry_remove(uctx->shpage_mmap);
+	uctx->shpage_mmap = NULL;
 	if (uctx->shpg)
 		free_page((unsigned long)uctx->shpg);
 
@@ -4036,27 +4086,57 @@ int bnxt_re_mmap(struct ib_ucontext *ib_uctx, struct vm_area_struct *vma)
 	struct bnxt_re_ucontext *uctx = container_of(ib_uctx,
 						   struct bnxt_re_ucontext,
 						   ib_uctx);
+	struct bnxt_re_user_mmap_entry *bnxt_entry;
+	struct rdma_user_mmap_entry *rdma_entry;
 	struct bnxt_re_dev *rdev = uctx->rdev;
+	int ret = 0;
 	u64 pfn;
 
-	if (vma->vm_end - vma->vm_start != PAGE_SIZE)
+	rdma_entry = rdma_user_mmap_entry_get(&uctx->ib_uctx, vma);
+	if (!rdma_entry) {
+		ibdev_err(&rdev->ibdev,
+			  "%s: No valid rdma_entry pgoffset = 0x%lx\n",
+			  __func__, vma->vm_pgoff);
 		return -EINVAL;
+	}
 
-	if (vma->vm_pgoff) {
-		vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot);
-		if (io_remap_pfn_range(vma, vma->vm_start, vma->vm_pgoff,
-				       PAGE_SIZE, vma->vm_page_prot)) {
-			ibdev_err(&rdev->ibdev, "Failed to map DPI");
-			return -EAGAIN;
-		}
-	} else {
+	bnxt_entry = container_of(rdma_entry, struct bnxt_re_user_mmap_entry,
+				  rdma_entry);
+
+	switch (bnxt_entry->mmap_flag) {
+	case BNXT_RE_MMAP_UC_DB:
+		pfn = bnxt_entry->mem_offset >> PAGE_SHIFT;
+		ret = rdma_user_mmap_io(ib_uctx, vma, pfn, PAGE_SIZE,
+					pgprot_noncached(vma->vm_page_prot),
+				rdma_entry);
+		if (ret)
+			ibdev_err(&rdev->ibdev, "Failed to map shared page");
+		break;
+	case BNXT_RE_MMAP_SH_PAGE:
 		pfn = virt_to_phys(uctx->shpg) >> PAGE_SHIFT;
 		if (remap_pfn_range(vma, vma->vm_start,
 				    pfn, PAGE_SIZE, vma->vm_page_prot)) {
 			ibdev_err(&rdev->ibdev, "Failed to map shared page");
-			return -EAGAIN;
+			ret =  -EAGAIN;
 		}
+		break;
+	default:
+		ibdev_err(&rdev->ibdev,
+			  "%s: invalid mmap flag = 0x%x\n", __func__, bnxt_entry->mmap_flag);
+		ret = -EINVAL;
+		break;
 	}
 
-	return 0;
+	rdma_user_mmap_entry_put(rdma_entry);
+	return ret;
+}
+
+void bnxt_re_mmap_free(struct rdma_user_mmap_entry *rdma_entry)
+{
+	struct bnxt_re_user_mmap_entry *bnxt_entry;
+
+	bnxt_entry = container_of(rdma_entry, struct bnxt_re_user_mmap_entry,
+				  rdma_entry);
+
+	kfree(bnxt_entry);
 }
diff --git a/drivers/infiniband/hw/bnxt_re/ib_verbs.h b/drivers/infiniband/hw/bnxt_re/ib_verbs.h
index 31f7e34..dcd31ae 100644
--- a/drivers/infiniband/hw/bnxt_re/ib_verbs.h
+++ b/drivers/infiniband/hw/bnxt_re/ib_verbs.h
@@ -60,6 +60,7 @@ struct bnxt_re_pd {
 	struct bnxt_re_dev	*rdev;
 	struct bnxt_qplib_pd	qplib_pd;
 	struct bnxt_re_fence_data fence;
+	struct rdma_user_mmap_entry *pd_db_mmap;
 };
 
 struct bnxt_re_ah {
@@ -136,6 +137,18 @@ struct bnxt_re_ucontext {
 	struct bnxt_qplib_dpi	dpi;
 	void			*shpg;
 	spinlock_t		sh_lock;	/* protect shpg */
+	struct rdma_user_mmap_entry *shpage_mmap;
+};
+
+enum bnxt_re_mmap_flag {
+	BNXT_RE_MMAP_SH_PAGE,
+	BNXT_RE_MMAP_UC_DB,
+};
+
+struct bnxt_re_user_mmap_entry {
+	struct rdma_user_mmap_entry rdma_entry;
+	u64 mem_offset;
+	u8 mmap_flag;
 };
 
 static inline u16 bnxt_re_get_swqe_size(int nsge)
@@ -213,6 +226,8 @@ struct ib_mr *bnxt_re_reg_user_mr(struct ib_pd *pd, u64 start, u64 length,
 int bnxt_re_alloc_ucontext(struct ib_ucontext *ctx, struct ib_udata *udata);
 void bnxt_re_dealloc_ucontext(struct ib_ucontext *context);
 int bnxt_re_mmap(struct ib_ucontext *context, struct vm_area_struct *vma);
+void bnxt_re_mmap_free(struct rdma_user_mmap_entry *rdma_entry);
+
 
 unsigned long bnxt_re_lock_cqs(struct bnxt_re_qp *qp);
 void bnxt_re_unlock_cqs(struct bnxt_re_qp *qp, unsigned long flags);
diff --git a/drivers/infiniband/hw/bnxt_re/main.c b/drivers/infiniband/hw/bnxt_re/main.c
index b9e2f89..1d361eb 100644
--- a/drivers/infiniband/hw/bnxt_re/main.c
+++ b/drivers/infiniband/hw/bnxt_re/main.c
@@ -539,6 +539,7 @@ static const struct ib_device_ops bnxt_re_dev_ops = {
 	.get_port_immutable = bnxt_re_get_port_immutable,
 	.map_mr_sg = bnxt_re_map_mr_sg,
 	.mmap = bnxt_re_mmap,
+	.mmap_free = bnxt_re_mmap_free,
 	.modify_qp = bnxt_re_modify_qp,
 	.modify_srq = bnxt_re_modify_srq,
 	.poll_cq = bnxt_re_poll_cq,
diff --git a/drivers/infiniband/hw/bnxt_re/qplib_fp.c b/drivers/infiniband/hw/bnxt_re/qplib_fp.c
index f139d4c..ade858f 100644
--- a/drivers/infiniband/hw/bnxt_re/qplib_fp.c
+++ b/drivers/infiniband/hw/bnxt_re/qplib_fp.c
@@ -471,7 +471,6 @@ static int bnxt_qplib_map_nq_db(struct bnxt_qplib_nq *nq,  u32 reg_offt)
 	resource_size_t reg_base;
 	struct bnxt_qplib_nq_db *nq_db;
 	struct pci_dev *pdev;
-	int rc = 0;
 
 	pdev = nq->pdev;
 	nq_db = &nq->nq_db;
@@ -481,8 +480,7 @@ static int bnxt_qplib_map_nq_db(struct bnxt_qplib_nq *nq,  u32 reg_offt)
 	if (!nq_db->reg.bar_base) {
 		dev_err(&pdev->dev, "QPLIB: NQ BAR region %d resc start is 0!",
 			nq_db->reg.bar_id);
-		rc = -ENOMEM;
-		goto fail;
+		return -ENOMEM;
 	}
 
 	reg_base = nq_db->reg.bar_base + reg_offt;
@@ -492,15 +490,13 @@ static int bnxt_qplib_map_nq_db(struct bnxt_qplib_nq *nq,  u32 reg_offt)
 	if (!nq_db->reg.bar_reg) {
 		dev_err(&pdev->dev, "QPLIB: NQ BAR region %d mapping failed",
 			nq_db->reg.bar_id);
-		rc = -ENOMEM;
-		goto fail;
+		return -ENOMEM;
 	}
 
 	nq_db->dbinfo.db = nq_db->reg.bar_reg;
 	nq_db->dbinfo.hwq = &nq->hwq;
 	nq_db->dbinfo.xid = nq->ring_id;
-fail:
-	return rc;
+	return 0;
 }
 
 int bnxt_qplib_enable_nq(struct pci_dev *pdev, struct bnxt_qplib_nq *nq,
diff --git a/drivers/infiniband/hw/bnxt_re/qplib_res.c b/drivers/infiniband/hw/bnxt_re/qplib_res.c
index 126d4f2..920ab87 100644
--- a/drivers/infiniband/hw/bnxt_re/qplib_res.c
+++ b/drivers/infiniband/hw/bnxt_re/qplib_res.c
@@ -813,7 +813,7 @@ static int bnxt_qplib_alloc_dpi_tbl(struct bnxt_qplib_res     *res,
 	return 0;
 
 unmap_io:
-	pci_iounmap(res->pdev, dpit->dbr_bar_reg_iomem);
+	iounmap(dpit->dbr_bar_reg_iomem);
 	dpit->dbr_bar_reg_iomem = NULL;
 	return -ENOMEM;
 }
-- 
2.5.5


[-- Attachment #2: S/MIME Cryptographic Signature --]
[-- Type: application/pkcs7-signature, Size: 4224 bytes --]

^ permalink raw reply related	[flat|nested] 17+ messages in thread

* [PATCH for-next 2/6] RDMA/bnxt_re: Add disassociate ucontext support
  2023-04-10 11:11 [PATCH for-next 0/6] RDMA/bnxt_re: driver update for supporting low latency push Selvin Xavier
  2023-04-10 11:11 ` [PATCH for-next 1/6] RDMA/bnxt_re: Use the common mmap helper functions Selvin Xavier
@ 2023-04-10 11:11 ` Selvin Xavier
  2023-04-10 12:27   ` Leon Romanovsky
  2023-04-10 11:11 ` [PATCH for-next 3/6] RDMA/bnxt_re: Query function capabilities from firmware Selvin Xavier
                   ` (4 subsequent siblings)
  6 siblings, 1 reply; 17+ messages in thread
From: Selvin Xavier @ 2023-04-10 11:11 UTC (permalink / raw)
  To: jgg, leon; +Cc: linux-rdma, andrew.gospodarek, Selvin Xavier

[-- Attachment #1: Type: text/plain, Size: 1082 bytes --]

Add empty stub for disassociate ucontext as done in other vendor
drivers.

Signed-off-by: Selvin Xavier <selvin.xavier@broadcom.com>
---
 drivers/infiniband/hw/bnxt_re/main.c | 5 +++++
 1 file changed, 5 insertions(+)

diff --git a/drivers/infiniband/hw/bnxt_re/main.c b/drivers/infiniband/hw/bnxt_re/main.c
index 1d361eb..a866951 100644
--- a/drivers/infiniband/hw/bnxt_re/main.c
+++ b/drivers/infiniband/hw/bnxt_re/main.c
@@ -466,6 +466,10 @@ static int bnxt_re_net_stats_ctx_alloc(struct bnxt_re_dev *rdev,
 	return rc;
 }
 
+static void bnxt_re_disassociate_ucontext(struct ib_ucontext *ibcontext)
+{
+}
+
 /* Device */
 
 static struct bnxt_re_dev *bnxt_re_from_netdev(struct net_device *netdev)
@@ -532,6 +536,7 @@ static const struct ib_device_ops bnxt_re_dev_ops = {
 	.destroy_qp = bnxt_re_destroy_qp,
 	.destroy_srq = bnxt_re_destroy_srq,
 	.device_group = &bnxt_re_dev_attr_group,
+	.disassociate_ucontext = bnxt_re_disassociate_ucontext,
 	.get_dev_fw_str = bnxt_re_query_fw_str,
 	.get_dma_mr = bnxt_re_get_dma_mr,
 	.get_hw_stats = bnxt_re_ib_get_hw_stats,
-- 
2.5.5


[-- Attachment #2: S/MIME Cryptographic Signature --]
[-- Type: application/pkcs7-signature, Size: 4224 bytes --]

^ permalink raw reply related	[flat|nested] 17+ messages in thread

* [PATCH for-next 3/6] RDMA/bnxt_re: Query function capabilities from firmware
  2023-04-10 11:11 [PATCH for-next 0/6] RDMA/bnxt_re: driver update for supporting low latency push Selvin Xavier
  2023-04-10 11:11 ` [PATCH for-next 1/6] RDMA/bnxt_re: Use the common mmap helper functions Selvin Xavier
  2023-04-10 11:11 ` [PATCH for-next 2/6] RDMA/bnxt_re: Add disassociate ucontext support Selvin Xavier
@ 2023-04-10 11:11 ` Selvin Xavier
  2023-04-10 12:28   ` Leon Romanovsky
  2023-04-10 11:11 ` [PATCH for-next 4/6] RDMA/bnxt_re: Move the interface version to chip context structure Selvin Xavier
                   ` (3 subsequent siblings)
  6 siblings, 1 reply; 17+ messages in thread
From: Selvin Xavier @ 2023-04-10 11:11 UTC (permalink / raw)
  To: jgg, leon; +Cc: linux-rdma, andrew.gospodarek, Selvin Xavier

[-- Attachment #1: Type: text/plain, Size: 2224 bytes --]

Query Function capabilities to enable advanced features.

Signed-off-by: Selvin Xavier <selvin.xavier@broadcom.com>
---
 drivers/infiniband/hw/bnxt_re/main.c | 30 ++++++++++++++++++++++++++++++
 1 file changed, 30 insertions(+)

diff --git a/drivers/infiniband/hw/bnxt_re/main.c b/drivers/infiniband/hw/bnxt_re/main.c
index a866951..1b69198 100644
--- a/drivers/infiniband/hw/bnxt_re/main.c
+++ b/drivers/infiniband/hw/bnxt_re/main.c
@@ -83,6 +83,7 @@ static int bnxt_re_netdev_event(struct notifier_block *notifier,
 				unsigned long event, void *ptr);
 static struct bnxt_re_dev *bnxt_re_from_netdev(struct net_device *netdev);
 static void bnxt_re_dev_uninit(struct bnxt_re_dev *rdev);
+static int bnxt_re_hwrm_qcaps(struct bnxt_re_dev *rdev);
 
 static void bnxt_re_set_drv_mode(struct bnxt_re_dev *rdev, u8 mode)
 {
@@ -91,6 +92,9 @@ static void bnxt_re_set_drv_mode(struct bnxt_re_dev *rdev, u8 mode)
 	cctx = rdev->chip_ctx;
 	cctx->modes.wqe_mode = bnxt_qplib_is_chip_gen_p5(rdev->chip_ctx) ?
 			       mode : BNXT_QPLIB_WQE_MODE_STATIC;
+	if (bnxt_re_hwrm_qcaps(rdev))
+		dev_err(rdev_to_dev(rdev),
+			"Failed to query hwrm qcaps\n");
 }
 
 static void bnxt_re_destroy_chip_ctx(struct bnxt_re_dev *rdev)
@@ -334,6 +338,32 @@ static void bnxt_re_fill_fw_msg(struct bnxt_fw_msg *fw_msg, void *msg,
 	fw_msg->timeout = timeout;
 }
 
+/* Query function capabilities using common hwrm */
+int bnxt_re_hwrm_qcaps(struct bnxt_re_dev *rdev)
+{
+	struct bnxt_en_dev *en_dev = rdev->en_dev;
+	struct hwrm_func_qcaps_output resp = {0};
+	struct hwrm_func_qcaps_input req = {0};
+	struct bnxt_qplib_chip_ctx *cctx;
+	struct bnxt_fw_msg fw_msg;
+	int rc;
+
+	cctx = rdev->chip_ctx;
+	memset(&fw_msg, 0, sizeof(fw_msg));
+	bnxt_re_init_hwrm_hdr(rdev, (void *)&req,
+			      HWRM_FUNC_QCAPS, -1, -1);
+	req.fid = cpu_to_le16(0xffff);
+	bnxt_re_fill_fw_msg(&fw_msg, (void *)&req, sizeof(req), (void *)&resp,
+			    sizeof(resp), DFLT_HWRM_CMD_TIMEOUT);
+	rc = bnxt_send_msg(en_dev, &fw_msg);
+	if (rc) {
+		dev_err(rdev_to_dev(rdev),
+			"Failed to query capabilities, rc = %#x", rc);
+		return rc;
+	}
+	return 0;
+}
+
 static int bnxt_re_net_ring_free(struct bnxt_re_dev *rdev,
 				 u16 fw_ring_id, int type)
 {
-- 
2.5.5


[-- Attachment #2: S/MIME Cryptographic Signature --]
[-- Type: application/pkcs7-signature, Size: 4224 bytes --]

^ permalink raw reply related	[flat|nested] 17+ messages in thread

* [PATCH for-next 4/6] RDMA/bnxt_re: Move the interface version to chip context structure
  2023-04-10 11:11 [PATCH for-next 0/6] RDMA/bnxt_re: driver update for supporting low latency push Selvin Xavier
                   ` (2 preceding siblings ...)
  2023-04-10 11:11 ` [PATCH for-next 3/6] RDMA/bnxt_re: Query function capabilities from firmware Selvin Xavier
@ 2023-04-10 11:11 ` Selvin Xavier
  2023-04-10 11:11 ` [PATCH for-next 5/6] RDMA/bnxt_re: Reorg the bar mapping Selvin Xavier
                   ` (2 subsequent siblings)
  6 siblings, 0 replies; 17+ messages in thread
From: Selvin Xavier @ 2023-04-10 11:11 UTC (permalink / raw)
  To: jgg, leon; +Cc: linux-rdma, andrew.gospodarek, Selvin Xavier

[-- Attachment #1: Type: text/plain, Size: 1504 bytes --]

FW interface version check is required for multiple features. Moving
the interface version to chip context structure.

Signed-off-by: Selvin Xavier <selvin.xavier@broadcom.com>
---
 drivers/infiniband/hw/bnxt_re/main.c       | 2 +-
 drivers/infiniband/hw/bnxt_re/qplib_rcfw.c | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/infiniband/hw/bnxt_re/main.c b/drivers/infiniband/hw/bnxt_re/main.c
index 1b69198..ecaa69cb 100644
--- a/drivers/infiniband/hw/bnxt_re/main.c
+++ b/drivers/infiniband/hw/bnxt_re/main.c
@@ -1094,7 +1094,7 @@ static void bnxt_re_query_hwrm_intf_version(struct bnxt_re_dev *rdev)
 			  rc);
 		return;
 	}
-	rdev->qplib_ctx.hwrm_intf_ver =
+	rdev->chip_ctx->hwrm_intf_ver =
 		(u64)le16_to_cpu(resp.hwrm_intf_major) << 48 |
 		(u64)le16_to_cpu(resp.hwrm_intf_minor) << 32 |
 		(u64)le16_to_cpu(resp.hwrm_intf_build) << 16 |
diff --git a/drivers/infiniband/hw/bnxt_re/qplib_rcfw.c b/drivers/infiniband/hw/bnxt_re/qplib_rcfw.c
index de90691..f610199 100644
--- a/drivers/infiniband/hw/bnxt_re/qplib_rcfw.c
+++ b/drivers/infiniband/hw/bnxt_re/qplib_rcfw.c
@@ -593,7 +593,7 @@ int bnxt_qplib_alloc_rcfw_channel(struct bnxt_qplib_res *res,
 			"HW channel CREQ allocation failed\n");
 		goto fail;
 	}
-	if (ctx->hwrm_intf_ver < HWRM_VERSION_RCFW_CMDQ_DEPTH_CHECK)
+	if (res->cctx->hwrm_intf_ver < HWRM_VERSION_RCFW_CMDQ_DEPTH_CHECK)
 		rcfw->cmdq_depth = BNXT_QPLIB_CMDQE_MAX_CNT_256;
 	else
 		rcfw->cmdq_depth = BNXT_QPLIB_CMDQE_MAX_CNT_8192;
-- 
2.5.5


[-- Attachment #2: S/MIME Cryptographic Signature --]
[-- Type: application/pkcs7-signature, Size: 4224 bytes --]

^ permalink raw reply related	[flat|nested] 17+ messages in thread

* [PATCH for-next 5/6] RDMA/bnxt_re: Reorg the bar mapping
  2023-04-10 11:11 [PATCH for-next 0/6] RDMA/bnxt_re: driver update for supporting low latency push Selvin Xavier
                   ` (3 preceding siblings ...)
  2023-04-10 11:11 ` [PATCH for-next 4/6] RDMA/bnxt_re: Move the interface version to chip context structure Selvin Xavier
@ 2023-04-10 11:11 ` Selvin Xavier
  2023-04-10 11:11 ` [PATCH for-next 6/6] RDMA/bnxt_re: Enable low latency push Selvin Xavier
  2023-04-10 12:32 ` [PATCH for-next 0/6] RDMA/bnxt_re: driver update for supporting " Leon Romanovsky
  6 siblings, 0 replies; 17+ messages in thread
From: Selvin Xavier @ 2023-04-10 11:11 UTC (permalink / raw)
  To: jgg, leon; +Cc: linux-rdma, andrew.gospodarek, Selvin Xavier

[-- Attachment #1: Type: text/plain, Size: 19121 bytes --]

Reorganize the code for allocation and mapping of
Doorbell pages. Implements new HW command to get the BAR length
used by L2 driver. These changes are used by the future patch
which maps the WC Doorbell pages.

Also, introduced a new lock dpi_tbl_lock for synchronize the
DB page allocation between differnt users.

Signed-off-by: Selvin Xavier <selvin.xavier@broadcom.com>
---
 drivers/infiniband/hw/bnxt_re/ib_verbs.c   |   7 +-
 drivers/infiniband/hw/bnxt_re/main.c       |  75 +++++++++++-
 drivers/infiniband/hw/bnxt_re/qplib_fp.c   |   4 +-
 drivers/infiniband/hw/bnxt_re/qplib_rcfw.h |   1 +
 drivers/infiniband/hw/bnxt_re/qplib_res.c  | 189 +++++++++++++++++++----------
 drivers/infiniband/hw/bnxt_re/qplib_res.h  |  30 +++--
 drivers/infiniband/hw/bnxt_re/qplib_sp.c   |   3 +
 drivers/infiniband/hw/bnxt_re/qplib_sp.h   |   1 +
 8 files changed, 229 insertions(+), 81 deletions(-)

diff --git a/drivers/infiniband/hw/bnxt_re/ib_verbs.c b/drivers/infiniband/hw/bnxt_re/ib_verbs.c
index c9d134c..e2468b8 100644
--- a/drivers/infiniband/hw/bnxt_re/ib_verbs.c
+++ b/drivers/infiniband/hw/bnxt_re/ib_verbs.c
@@ -604,8 +604,8 @@ int bnxt_re_alloc_pd(struct ib_pd *ibpd, struct ib_udata *udata)
 			 * ibv_devinfo and family of application when DPIs
 			 * are depleted.
 			 */
-			if (bnxt_qplib_alloc_dpi(&rdev->qplib_res.dpi_tbl,
-						 &ucntx->dpi, ucntx)) {
+			if (bnxt_qplib_alloc_dpi(&rdev->qplib_res,
+						 &ucntx->dpi, ucntx, BNXT_QPLIB_DPI_TYPE_UC)) {
 				rc = -ENOMEM;
 				goto dbfail;
 			}
@@ -4074,8 +4074,7 @@ void bnxt_re_dealloc_ucontext(struct ib_ucontext *ib_uctx)
 		/* Free DPI only if this is the first PD allocated by the
 		 * application and mark the context dpi as NULL
 		 */
-		bnxt_qplib_dealloc_dpi(&rdev->qplib_res,
-				       &rdev->qplib_res.dpi_tbl, &uctx->dpi);
+		bnxt_qplib_dealloc_dpi(&rdev->qplib_res, &uctx->dpi);
 		uctx->dpi.dbr = NULL;
 	}
 }
diff --git a/drivers/infiniband/hw/bnxt_re/main.c b/drivers/infiniband/hw/bnxt_re/main.c
index ecaa69cb..cfd3708 100644
--- a/drivers/infiniband/hw/bnxt_re/main.c
+++ b/drivers/infiniband/hw/bnxt_re/main.c
@@ -85,6 +85,40 @@ static struct bnxt_re_dev *bnxt_re_from_netdev(struct net_device *netdev);
 static void bnxt_re_dev_uninit(struct bnxt_re_dev *rdev);
 static int bnxt_re_hwrm_qcaps(struct bnxt_re_dev *rdev);
 
+static int bnxt_re_hwrm_qcfg(struct bnxt_re_dev *rdev, u32 *db_len,
+			     u32 *offset);
+static void bnxt_re_set_db_offset(struct bnxt_re_dev *rdev)
+{
+	struct bnxt_qplib_chip_ctx *cctx;
+	struct bnxt_en_dev *en_dev;
+	struct bnxt_qplib_res *res;
+	u32 l2db_len = 0;
+	u32 offset = 0;
+	u32 barlen;
+	int rc;
+
+	res = &rdev->qplib_res;
+	en_dev = rdev->en_dev;
+	cctx = rdev->chip_ctx;
+
+	/* Issue qcfg */
+	rc = bnxt_re_hwrm_qcfg(rdev, &l2db_len, &offset);
+	if (rc)
+		dev_info(rdev_to_dev(rdev),
+			 "Couldn't get DB bar size, Low latency framework is disabled\n");
+	/* set register offsets for both UC and WC */
+	res->dpi_tbl.ucreg.offset = res->is_vf ? BNXT_QPLIB_DBR_VF_DB_OFFSET :
+						 BNXT_QPLIB_DBR_PF_DB_OFFSET;
+	res->dpi_tbl.wcreg.offset = res->dpi_tbl.ucreg.offset;
+
+	/* If WC mapping is disabled by L2 driver then en_dev->l2_db_size
+	 * is equal to the DB-Bar actual size. This indicates that L2
+	 * is mapping entire bar as UC-. RoCE driver can't enable WC mapping
+	 * in such cases and DB-push will be disabled.
+	 */
+	barlen = pci_resource_len(res->pdev, RCFW_DBR_PCI_BAR_REGION);
+}
+
 static void bnxt_re_set_drv_mode(struct bnxt_re_dev *rdev, u8 mode)
 {
 	struct bnxt_qplib_chip_ctx *cctx;
@@ -116,6 +150,7 @@ static int bnxt_re_setup_chip_ctx(struct bnxt_re_dev *rdev, u8 wqe_mode)
 {
 	struct bnxt_qplib_chip_ctx *chip_ctx;
 	struct bnxt_en_dev *en_dev;
+	int rc = 0;
 
 	en_dev = rdev->en_dev;
 
@@ -134,6 +169,12 @@ static int bnxt_re_setup_chip_ctx(struct bnxt_re_dev *rdev, u8 wqe_mode)
 	rdev->qplib_res.is_vf = BNXT_EN_VF(en_dev);
 
 	bnxt_re_set_drv_mode(rdev, wqe_mode);
+
+	bnxt_re_set_db_offset(rdev);
+	rc = bnxt_qplib_map_db_bar(&rdev->qplib_res);
+	if (rc)
+		return rc;
+
 	if (bnxt_qplib_determine_atomics(en_dev->pdev))
 		ibdev_info(&rdev->ibdev,
 			   "platform doesn't support global atomics.");
@@ -338,6 +379,34 @@ static void bnxt_re_fill_fw_msg(struct bnxt_fw_msg *fw_msg, void *msg,
 	fw_msg->timeout = timeout;
 }
 
+/* Query device config using common hwrm */
+static int bnxt_re_hwrm_qcfg(struct bnxt_re_dev *rdev, u32 *db_len,
+			     u32 *offset)
+{
+	struct bnxt_en_dev *en_dev = rdev->en_dev;
+	struct hwrm_func_qcfg_output resp = {0};
+	struct hwrm_func_qcfg_input req = {0};
+	struct bnxt_fw_msg fw_msg;
+	int rc;
+
+	memset(&fw_msg, 0, sizeof(fw_msg));
+	bnxt_re_init_hwrm_hdr(rdev, (void *)&req,
+			      HWRM_FUNC_QCFG, -1, -1);
+	req.fid = cpu_to_le16(0xffff);
+	bnxt_re_fill_fw_msg(&fw_msg, (void *)&req, sizeof(req), (void *)&resp,
+			    sizeof(resp), DFLT_HWRM_CMD_TIMEOUT);
+	rc = bnxt_send_msg(en_dev, &fw_msg);
+	if (rc) {
+		dev_err(rdev_to_dev(rdev),
+			"Failed to query config, rc = %#x", rc);
+		return rc;
+	}
+
+	*db_len = PAGE_ALIGN(le16_to_cpu(resp.l2_doorbell_bar_size_kb) * 1024);
+	*offset = PAGE_ALIGN(le16_to_cpu(resp.legacy_l2_db_size_kb) * 1024);
+	return 0;
+}
+
 /* Query function capabilities using common hwrm */
 int bnxt_re_hwrm_qcaps(struct bnxt_re_dev *rdev)
 {
@@ -858,7 +927,6 @@ static void bnxt_re_free_res(struct bnxt_re_dev *rdev)
 
 	if (rdev->qplib_res.dpi_tbl.max) {
 		bnxt_qplib_dealloc_dpi(&rdev->qplib_res,
-				       &rdev->qplib_res.dpi_tbl,
 				       &rdev->dpi_privileged);
 	}
 	if (rdev->qplib_res.rcfw) {
@@ -886,9 +954,9 @@ static int bnxt_re_alloc_res(struct bnxt_re_dev *rdev)
 	if (rc)
 		goto fail;
 
-	rc = bnxt_qplib_alloc_dpi(&rdev->qplib_res.dpi_tbl,
+	rc = bnxt_qplib_alloc_dpi(&rdev->qplib_res,
 				  &rdev->dpi_privileged,
-				  rdev);
+				  rdev, BNXT_QPLIB_DPI_TYPE_KERNEL);
 	if (rc)
 		goto dealloc_res;
 
@@ -928,7 +996,6 @@ static int bnxt_re_alloc_res(struct bnxt_re_dev *rdev)
 		bnxt_qplib_free_nq(&rdev->nq[i]);
 	}
 	bnxt_qplib_dealloc_dpi(&rdev->qplib_res,
-			       &rdev->qplib_res.dpi_tbl,
 			       &rdev->dpi_privileged);
 dealloc_res:
 	bnxt_qplib_free_res(&rdev->qplib_res);
diff --git a/drivers/infiniband/hw/bnxt_re/qplib_fp.c b/drivers/infiniband/hw/bnxt_re/qplib_fp.c
index ade858f..719bdc6 100644
--- a/drivers/infiniband/hw/bnxt_re/qplib_fp.c
+++ b/drivers/infiniband/hw/bnxt_re/qplib_fp.c
@@ -655,7 +655,7 @@ int bnxt_qplib_create_srq(struct bnxt_qplib_res *res,
 	srq->dbinfo.xid = srq->id;
 	srq->dbinfo.db = srq->dpi->dbr;
 	srq->dbinfo.max_slot = 1;
-	srq->dbinfo.priv_db = res->dpi_tbl.dbr_bar_reg_iomem;
+	srq->dbinfo.priv_db = res->dpi_tbl.priv_db;
 	if (srq->threshold)
 		bnxt_qplib_armen_db(&srq->dbinfo, DBC_DBC_TYPE_SRQ_ARMENA);
 	srq->arm_req = false;
@@ -2099,7 +2099,7 @@ int bnxt_qplib_create_cq(struct bnxt_qplib_res *res, struct bnxt_qplib_cq *cq)
 	cq->dbinfo.hwq = &cq->hwq;
 	cq->dbinfo.xid = cq->id;
 	cq->dbinfo.db = cq->dpi->dbr;
-	cq->dbinfo.priv_db = res->dpi_tbl.dbr_bar_reg_iomem;
+	cq->dbinfo.priv_db = res->dpi_tbl.priv_db;
 
 	bnxt_qplib_armen_db(&cq->dbinfo, DBC_DBC_TYPE_CQ_ARMENA);
 
diff --git a/drivers/infiniband/hw/bnxt_re/qplib_rcfw.h b/drivers/infiniband/hw/bnxt_re/qplib_rcfw.h
index dd56514..4d1ccf1 100644
--- a/drivers/infiniband/hw/bnxt_re/qplib_rcfw.h
+++ b/drivers/infiniband/hw/bnxt_re/qplib_rcfw.h
@@ -111,6 +111,7 @@ static inline u32 bnxt_qplib_set_cmd_slots(struct cmdq_base *req)
 #define RCFW_BLOCKED_CMD_WAIT_COUNT	20000000UL /* 20 sec */
 
 #define HWRM_VERSION_RCFW_CMDQ_DEPTH_CHECK 0x1000900020011ULL
+#define HWRM_VERSION_DEV_ATTR_MAX_DPI  0x1000A0000000DULL
 
 /* Crsq buf is 1024-Byte */
 struct bnxt_qplib_crsbe {
diff --git a/drivers/infiniband/hw/bnxt_re/qplib_res.c b/drivers/infiniband/hw/bnxt_re/qplib_res.c
index 920ab87..bb3087d 100644
--- a/drivers/infiniband/hw/bnxt_re/qplib_res.c
+++ b/drivers/infiniband/hw/bnxt_re/qplib_res.c
@@ -704,45 +704,79 @@ static int bnxt_qplib_alloc_pd_tbl(struct bnxt_qplib_res *res,
 }
 
 /* DPIs */
-int bnxt_qplib_alloc_dpi(struct bnxt_qplib_dpi_tbl *dpit,
-			 struct bnxt_qplib_dpi     *dpi,
-			 void                      *app)
+int bnxt_qplib_alloc_dpi(struct bnxt_qplib_res *res,
+			 struct bnxt_qplib_dpi *dpi,
+			 void *app, u8 type)
 {
+	struct bnxt_qplib_dpi_tbl *dpit = &res->dpi_tbl;
+	struct bnxt_qplib_reg_desc *reg;
 	u32 bit_num;
+	u64 umaddr;
+	int rc = 0;
+
+	reg = &dpit->wcreg;
+	mutex_lock(&res->dpi_tbl_lock);
 
 	bit_num = find_first_bit(dpit->tbl, dpit->max);
-	if (bit_num == dpit->max)
-		return -ENOMEM;
+	if (bit_num == dpit->max) {
+		rc = -ENOMEM;
+		goto fail;
+	}
 
 	/* Found unused DPI */
 	clear_bit(bit_num, dpit->tbl);
 	dpit->app_tbl[bit_num] = app;
 
-	dpi->dpi = bit_num;
-	dpi->dbr = dpit->dbr_bar_reg_iomem + (bit_num * PAGE_SIZE);
-	dpi->umdbr = dpit->unmapped_dbr + (bit_num * PAGE_SIZE);
+	dpi->bit = bit_num;
+	dpi->dpi = bit_num + (reg->offset - dpit->ucreg.offset) / PAGE_SIZE;
+
+	umaddr = reg->bar_base + reg->offset + bit_num * PAGE_SIZE;
+	dpi->umdbr = umaddr;
+
+	switch (type) {
+	case BNXT_QPLIB_DPI_TYPE_KERNEL:
+		/* priviledged dbr was already mapped just initialize it. */
+		dpi->umdbr = dpit->ucreg.bar_base +
+			     dpit->ucreg.offset + bit_num * PAGE_SIZE;
+		dpi->dbr = dpit->priv_db;
+		dpi->dpi = dpi->bit;
+		break;
+	default:
+		dpi->dbr = ioremap(umaddr, PAGE_SIZE);
+		break;
+	}
+
+	dpi->type = type;
+fail:
+	mutex_unlock(&res->dpi_tbl_lock);
+	return rc;
 
-	return 0;
 }
 
 int bnxt_qplib_dealloc_dpi(struct bnxt_qplib_res *res,
-			   struct bnxt_qplib_dpi_tbl *dpit,
-			   struct bnxt_qplib_dpi     *dpi)
+			   struct bnxt_qplib_dpi *dpi)
 {
-	if (dpi->dpi >= dpit->max) {
-		dev_warn(&res->pdev->dev, "Invalid DPI? dpi = %d\n", dpi->dpi);
-		return -EINVAL;
-	}
-	if (test_and_set_bit(dpi->dpi, dpit->tbl)) {
-		dev_warn(&res->pdev->dev, "Freeing an unused DPI? dpi = %d\n",
-			 dpi->dpi);
-		return -EINVAL;
+	struct bnxt_qplib_dpi_tbl *dpit = &res->dpi_tbl;
+	int rc = 0;
+
+	mutex_lock(&res->dpi_tbl_lock);
+
+	if (dpi->dpi && dpi->type != BNXT_QPLIB_DPI_TYPE_KERNEL)
+		pci_iounmap(res->pdev, dpi->dbr);
+
+	if (test_and_set_bit(dpi->bit, dpit->tbl)) {
+		dev_warn(&res->pdev->dev,
+			 "Freeing an unused DPI? dpi = %d, bit = %d\n",
+				dpi->dpi, dpi->bit);
+		rc = -EINVAL;
+		goto fail;
 	}
 	if (dpit->app_tbl)
-		dpit->app_tbl[dpi->dpi] = NULL;
+		dpit->app_tbl[dpi->bit] = NULL;
 	memset(dpi, 0, sizeof(*dpi));
-
-	return 0;
+fail:
+	mutex_unlock(&res->dpi_tbl_lock);
+	return rc;
 }
 
 static void bnxt_qplib_free_dpi_tbl(struct bnxt_qplib_res     *res,
@@ -750,53 +784,42 @@ static void bnxt_qplib_free_dpi_tbl(struct bnxt_qplib_res     *res,
 {
 	kfree(dpit->tbl);
 	kfree(dpit->app_tbl);
-	if (dpit->dbr_bar_reg_iomem)
-		pci_iounmap(res->pdev, dpit->dbr_bar_reg_iomem);
-	memset(dpit, 0, sizeof(*dpit));
+	dpit->tbl = NULL;
+	dpit->app_tbl = NULL;
+	dpit->max = 0;
 }
 
-static int bnxt_qplib_alloc_dpi_tbl(struct bnxt_qplib_res     *res,
-				    struct bnxt_qplib_dpi_tbl *dpit,
-				    u32                       dbr_offset)
+static int bnxt_qplib_alloc_dpi_tbl(struct bnxt_qplib_res *res,
+				    struct bnxt_qplib_dev_attr *dev_attr)
 {
-	u32 dbr_bar_reg = RCFW_DBR_PCI_BAR_REGION;
-	resource_size_t bar_reg_base;
-	u32 dbr_len, bytes;
-
-	if (dpit->dbr_bar_reg_iomem) {
-		dev_err(&res->pdev->dev, "DBR BAR region %d already mapped\n",
-			dbr_bar_reg);
-		return -EALREADY;
-	}
+	struct bnxt_qplib_dpi_tbl *dpit;
+	struct bnxt_qplib_reg_desc *reg;
+	unsigned long bar_len;
+	u32 dbr_offset;
+	u32 bytes;
 
-	bar_reg_base = pci_resource_start(res->pdev, dbr_bar_reg);
-	if (!bar_reg_base) {
-		dev_err(&res->pdev->dev, "BAR region %d resc start failed\n",
-			dbr_bar_reg);
-		return -ENOMEM;
-	}
+	dpit = &res->dpi_tbl;
+	reg = &dpit->wcreg;
 
-	dbr_len = pci_resource_len(res->pdev, dbr_bar_reg) - dbr_offset;
-	if (!dbr_len || ((dbr_len & (PAGE_SIZE - 1)) != 0)) {
-		dev_err(&res->pdev->dev, "Invalid DBR length %d\n", dbr_len);
-		return -ENOMEM;
+	if (!bnxt_qplib_is_chip_gen_p5(res->cctx)) {
+		/* Offest should come from L2 driver */
+		dbr_offset = dev_attr->l2_db_size;
+		dpit->ucreg.offset = dbr_offset;
+		dpit->wcreg.offset = dbr_offset;
 	}
 
-	dpit->dbr_bar_reg_iomem = ioremap(bar_reg_base + dbr_offset,
-						  dbr_len);
-	if (!dpit->dbr_bar_reg_iomem) {
+	bar_len = pci_resource_len(res->pdev, reg->bar_id);
+	dpit->max = (bar_len - reg->offset) / PAGE_SIZE;
+	if (dev_attr->max_dpi)
+		dpit->max = min_t(u32, dpit->max, dev_attr->max_dpi);
+
+	dpit->app_tbl = kcalloc(dpit->max,  sizeof(void *), GFP_KERNEL);
+	if (!dpit->app_tbl) {
 		dev_err(&res->pdev->dev,
-			"FP: DBR BAR region %d mapping failed\n", dbr_bar_reg);
+			"QPLIB: DPI app tbl allocation failed");
 		return -ENOMEM;
 	}
 
-	dpit->unmapped_dbr = bar_reg_base + dbr_offset;
-	dpit->max = dbr_len / PAGE_SIZE;
-
-	dpit->app_tbl = kcalloc(dpit->max, sizeof(void *), GFP_KERNEL);
-	if (!dpit->app_tbl)
-		goto unmap_io;
-
 	bytes = dpit->max >> 3;
 	if (!bytes)
 		bytes = 1;
@@ -805,17 +828,14 @@ static int bnxt_qplib_alloc_dpi_tbl(struct bnxt_qplib_res     *res,
 	if (!dpit->tbl) {
 		kfree(dpit->app_tbl);
 		dpit->app_tbl = NULL;
-		goto unmap_io;
+		return -ENOMEM;
 	}
 
 	memset((u8 *)dpit->tbl, 0xFF, bytes);
+	dpit->priv_db = dpit->ucreg.bar_reg + dpit->ucreg.offset;
 
 	return 0;
 
-unmap_io:
-	iounmap(dpit->dbr_bar_reg_iomem);
-	dpit->dbr_bar_reg_iomem = NULL;
-	return -ENOMEM;
 }
 
 /* Stats */
@@ -882,7 +902,7 @@ int bnxt_qplib_alloc_res(struct bnxt_qplib_res *res, struct pci_dev *pdev,
 	if (rc)
 		goto fail;
 
-	rc = bnxt_qplib_alloc_dpi_tbl(res, &res->dpi_tbl, dev_attr->l2_db_size);
+	rc = bnxt_qplib_alloc_dpi_tbl(res, dev_attr);
 	if (rc)
 		goto fail;
 
@@ -892,6 +912,47 @@ int bnxt_qplib_alloc_res(struct bnxt_qplib_res *res, struct pci_dev *pdev,
 	return rc;
 }
 
+void bnxt_qplib_unmap_db_bar(struct bnxt_qplib_res *res)
+{
+	struct bnxt_qplib_reg_desc *reg;
+
+	reg = &res->dpi_tbl.ucreg;
+	if (reg->bar_reg)
+		pci_iounmap(res->pdev, reg->bar_reg);
+	reg->bar_reg = NULL;
+	reg->bar_base = 0;
+	reg->len = 0;
+	reg->bar_id = 0; /* Zero? or ff */
+}
+
+int bnxt_qplib_map_db_bar(struct bnxt_qplib_res *res)
+{
+	struct bnxt_qplib_reg_desc *ucreg;
+	struct bnxt_qplib_reg_desc *wcreg;
+
+	wcreg = &res->dpi_tbl.wcreg;
+	wcreg->bar_id = RCFW_DBR_PCI_BAR_REGION;
+	wcreg->bar_base = pci_resource_start(res->pdev, wcreg->bar_id);
+	/* No need to set the wcreg->len here */
+
+	ucreg = &res->dpi_tbl.ucreg;
+	ucreg->bar_id = RCFW_DBR_PCI_BAR_REGION;
+	ucreg->bar_base = pci_resource_start(res->pdev, ucreg->bar_id);
+	ucreg->len = ucreg->offset + PAGE_SIZE;
+	if (!ucreg->len || ((ucreg->len & (PAGE_SIZE - 1)) != 0)) {
+		dev_err(&res->pdev->dev, "QPLIB: invalid dbr length %d",
+			(int)ucreg->len);
+		return -EINVAL;
+	}
+	ucreg->bar_reg = ioremap(ucreg->bar_base, ucreg->len);
+	if (!ucreg->bar_reg) {
+		dev_err(&res->pdev->dev, "priviledged dpi map failed!");
+		return -ENOMEM;
+	}
+
+	return 0;
+}
+
 int bnxt_qplib_determine_atomics(struct pci_dev *dev)
 {
 	int comp;
diff --git a/drivers/infiniband/hw/bnxt_re/qplib_res.h b/drivers/infiniband/hw/bnxt_re/qplib_res.h
index 982e2c9..95b1d6c 100644
--- a/drivers/infiniband/hw/bnxt_re/qplib_res.h
+++ b/drivers/infiniband/hw/bnxt_re/qplib_res.h
@@ -56,8 +56,12 @@ struct bnxt_qplib_chip_ctx {
 	u8	chip_metal;
 	u16	hw_stats_size;
 	struct bnxt_qplib_drv_modes modes;
+	u64 hwrm_intf_ver;
 };
 
+#define BNXT_QPLIB_DBR_PF_DB_OFFSET     0x10000
+#define BNXT_QPLIB_DBR_VF_DB_OFFSET     0x4000
+
 #define PTR_CNT_PER_PG		(PAGE_SIZE / sizeof(void *))
 #define PTR_MAX_IDX_PER_PG	(PTR_CNT_PER_PG - 1)
 #define PTR_PG(x)		(((x) & ~PTR_MAX_IDX_PER_PG) / PTR_CNT_PER_PG)
@@ -109,6 +113,7 @@ enum bnxt_qplib_hwrm_pg_size {
 struct bnxt_qplib_reg_desc {
 	u8		bar_id;
 	resource_size_t	bar_base;
+	unsigned long	offset;
 	void __iomem	*bar_reg;
 	size_t		len;
 };
@@ -185,18 +190,26 @@ struct bnxt_qplib_sgid_tbl {
 	u8				*vlan;
 };
 
+enum {
+	BNXT_QPLIB_DPI_TYPE_KERNEL      = 0,
+	BNXT_QPLIB_DPI_TYPE_UC          = 1,
+};
+
 struct bnxt_qplib_dpi {
 	u32				dpi;
+	u32				bit;
 	void __iomem			*dbr;
 	u64				umdbr;
+	u8				type;
 };
 
 struct bnxt_qplib_dpi_tbl {
 	void				**app_tbl;
 	unsigned long			*tbl;
 	u16				max;
-	void __iomem			*dbr_bar_reg_iomem;
-	u64				unmapped_dbr;
+	struct bnxt_qplib_reg_desc	ucreg; /* Hold entire DB bar. */
+	struct bnxt_qplib_reg_desc	wcreg;
+	void __iomem			*priv_db;
 };
 
 struct bnxt_qplib_stats {
@@ -241,7 +254,6 @@ struct bnxt_qplib_ctx {
 	struct bnxt_qplib_tqm_ctx	tqm_ctx;
 	struct bnxt_qplib_stats		stats;
 	struct bnxt_qplib_vf_res	vf_res;
-	u64				hwrm_intf_ver;
 };
 
 struct bnxt_qplib_res {
@@ -253,6 +265,8 @@ struct bnxt_qplib_res {
 	struct bnxt_qplib_pd_tbl	pd_tbl;
 	struct bnxt_qplib_sgid_tbl	sgid_tbl;
 	struct bnxt_qplib_dpi_tbl	dpi_tbl;
+	/* To protect the dpi table bit map */
+	struct mutex                    dpi_tbl_lock;
 	bool				prio;
 	bool                            is_vf;
 };
@@ -344,11 +358,10 @@ int bnxt_qplib_alloc_pd(struct bnxt_qplib_pd_tbl *pd_tbl,
 int bnxt_qplib_dealloc_pd(struct bnxt_qplib_res *res,
 			  struct bnxt_qplib_pd_tbl *pd_tbl,
 			  struct bnxt_qplib_pd *pd);
-int bnxt_qplib_alloc_dpi(struct bnxt_qplib_dpi_tbl *dpit,
-			 struct bnxt_qplib_dpi     *dpi,
-			 void                      *app);
+int bnxt_qplib_alloc_dpi(struct bnxt_qplib_res *res,
+			 struct bnxt_qplib_dpi *dpi,
+			 void *app, u8 type);
 int bnxt_qplib_dealloc_dpi(struct bnxt_qplib_res *res,
-			   struct bnxt_qplib_dpi_tbl *dpi_tbl,
 			   struct bnxt_qplib_dpi *dpi);
 void bnxt_qplib_cleanup_res(struct bnxt_qplib_res *res);
 int bnxt_qplib_init_res(struct bnxt_qplib_res *res);
@@ -361,6 +374,9 @@ void bnxt_qplib_free_ctx(struct bnxt_qplib_res *res,
 int bnxt_qplib_alloc_ctx(struct bnxt_qplib_res *res,
 			 struct bnxt_qplib_ctx *ctx,
 			 bool virt_fn, bool is_p5);
+int bnxt_qplib_map_db_bar(struct bnxt_qplib_res *res);
+void bnxt_qplib_unmap_db_bar(struct bnxt_qplib_res *res);
+
 int bnxt_qplib_determine_atomics(struct pci_dev *dev);
 
 static inline void bnxt_qplib_hwq_incr_prod(struct bnxt_qplib_hwq *hwq, u32 cnt)
diff --git a/drivers/infiniband/hw/bnxt_re/qplib_sp.c b/drivers/infiniband/hw/bnxt_re/qplib_sp.c
index 1714a1e..fe3a22d 100644
--- a/drivers/infiniband/hw/bnxt_re/qplib_sp.c
+++ b/drivers/infiniband/hw/bnxt_re/qplib_sp.c
@@ -170,6 +170,9 @@ int bnxt_qplib_get_dev_attr(struct bnxt_qplib_rcfw *rcfw,
 		attr->tqm_alloc_reqs[i * 4 + 3] = *(++tqm_alloc);
 	}
 
+	if (rcfw->res->cctx->hwrm_intf_ver >= HWRM_VERSION_DEV_ATTR_MAX_DPI)
+		attr->max_dpi = le32_to_cpu(sb->max_dpi);
+
 	attr->is_atomic = bnxt_qplib_is_atomic_cap(rcfw);
 bail:
 	bnxt_qplib_rcfw_free_sbuf(rcfw, sbuf);
diff --git a/drivers/infiniband/hw/bnxt_re/qplib_sp.h b/drivers/infiniband/hw/bnxt_re/qplib_sp.h
index 5de87465..0efd464 100644
--- a/drivers/infiniband/hw/bnxt_re/qplib_sp.h
+++ b/drivers/infiniband/hw/bnxt_re/qplib_sp.h
@@ -72,6 +72,7 @@ struct bnxt_qplib_dev_attr {
 	u8				tqm_alloc_reqs[MAX_TQM_ALLOC_REQ];
 	bool				is_atomic;
 	u16                             dev_cap_flags;
+	u32                             max_dpi;
 };
 
 struct bnxt_qplib_pd {
-- 
2.5.5


[-- Attachment #2: S/MIME Cryptographic Signature --]
[-- Type: application/pkcs7-signature, Size: 4224 bytes --]

^ permalink raw reply related	[flat|nested] 17+ messages in thread

* [PATCH for-next 6/6] RDMA/bnxt_re: Enable low latency push
  2023-04-10 11:11 [PATCH for-next 0/6] RDMA/bnxt_re: driver update for supporting low latency push Selvin Xavier
                   ` (4 preceding siblings ...)
  2023-04-10 11:11 ` [PATCH for-next 5/6] RDMA/bnxt_re: Reorg the bar mapping Selvin Xavier
@ 2023-04-10 11:11 ` Selvin Xavier
  2023-04-11 16:56   ` Jason Gunthorpe
  2023-04-10 12:32 ` [PATCH for-next 0/6] RDMA/bnxt_re: driver update for supporting " Leon Romanovsky
  6 siblings, 1 reply; 17+ messages in thread
From: Selvin Xavier @ 2023-04-10 11:11 UTC (permalink / raw)
  To: jgg, leon; +Cc: linux-rdma, andrew.gospodarek, Selvin Xavier

[-- Attachment #1: Type: text/plain, Size: 8397 bytes --]

Enabling the low latency push in Gen P5 adapters for small
packets. This is supported only for the user space QPs.
Introduce new mmap flag for write combine buffers.
Allocate separate Write Combine pages from BAR when Low
latency push mode is enabled in HW.

Signed-off-by: Selvin Xavier <selvin.xavier@broadcom.com>
---
 drivers/infiniband/hw/bnxt_re/ib_verbs.c  | 43 +++++++++++++++++++++++++++++++
 drivers/infiniband/hw/bnxt_re/ib_verbs.h  |  4 ++-
 drivers/infiniband/hw/bnxt_re/main.c      | 10 +++++++
 drivers/infiniband/hw/bnxt_re/qplib_res.c |  3 +++
 drivers/infiniband/hw/bnxt_re/qplib_res.h |  3 ++-
 include/uapi/rdma/bnxt_re-abi.h           |  9 +++++++
 6 files changed, 70 insertions(+), 2 deletions(-)

diff --git a/drivers/infiniband/hw/bnxt_re/ib_verbs.c b/drivers/infiniband/hw/bnxt_re/ib_verbs.c
index e2468b8..591ee82 100644
--- a/drivers/infiniband/hw/bnxt_re/ib_verbs.c
+++ b/drivers/infiniband/hw/bnxt_re/ib_verbs.c
@@ -566,6 +566,9 @@ int bnxt_re_dealloc_pd(struct ib_pd *ib_pd, struct ib_udata *udata)
 
 	if (udata) {
 		rdma_user_mmap_entry_remove(pd->pd_db_mmap);
+		if (pd->pd_wcdb_mmap)
+			rdma_user_mmap_entry_remove(pd->pd_wcdb_mmap);
+		pd->pd_wcdb_mmap = NULL;
 		pd->pd_db_mmap = NULL;
 	}
 
@@ -597,6 +600,7 @@ int bnxt_re_alloc_pd(struct ib_pd *ibpd, struct ib_udata *udata)
 	}
 
 	if (udata) {
+		struct bnxt_qplib_chip_ctx *cctx = rdev->chip_ctx;
 		struct bnxt_re_pd_resp resp = {};
 
 		if (!ucntx->dpi.dbr) {
@@ -606,9 +610,23 @@ int bnxt_re_alloc_pd(struct ib_pd *ibpd, struct ib_udata *udata)
 			 */
 			if (bnxt_qplib_alloc_dpi(&rdev->qplib_res,
 						 &ucntx->dpi, ucntx, BNXT_QPLIB_DPI_TYPE_UC)) {
+				dev_err(rdev_to_dev(rdev), "DP alloc failed");
 				rc = -ENOMEM;
 				goto dbfail;
 			}
+			if (cctx->modes.db_push) {
+				rc = bnxt_qplib_alloc_dpi(&rdev->qplib_res, &ucntx->wcdpi,
+							  ucntx, BNXT_QPLIB_DPI_TYPE_WC);
+				if (rc) {
+					dev_err(rdev_to_dev(rdev), "push dp alloc failed");
+					bnxt_qplib_dealloc_dpi(&rdev->qplib_res, &ucntx->dpi);
+					ucntx->dpi.dbr = NULL;
+					rc = -ENOMEM;
+					goto dbfail;
+				}
+				resp.wcdpi = ucntx->wcdpi.dpi;
+				resp.comp_mask = BNXT_RE_COMP_MASK_PD_HAS_WC_DPI;
+			}
 		}
 
 		resp.pdid = pd->qplib_pd.id;
@@ -625,6 +643,16 @@ int bnxt_re_alloc_pd(struct ib_pd *ibpd, struct ib_udata *udata)
 			goto dbfail;
 		}
 
+		pd->pd_wcdb_mmap = bnxt_re_mmap_entry_insert(ucntx, (u64)ucntx->wcdpi.umdbr,
+							     BNXT_RE_MMAP_WC_DB, &resp.wcdbr);
+
+		if (!pd->pd_wcdb_mmap) {
+			ibdev_err(&rdev->ibdev,
+				  "Failed to insert mmap entry\n");
+			rc = -ENOMEM;
+			goto dbfail;
+		}
+
 		rc = ib_copy_to_udata(udata, &resp, min(sizeof(resp), udata->outlen));
 		if (rc) {
 			ibdev_err(&rdev->ibdev,
@@ -4035,6 +4063,9 @@ int bnxt_re_alloc_ucontext(struct ib_ucontext *ctx, struct ib_udata *udata)
 	resp.comp_mask |= BNXT_RE_UCNTX_CMASK_HAVE_MODE;
 	resp.mode = rdev->chip_ctx->modes.wqe_mode;
 
+	if (rdev->chip_ctx->modes.db_push)
+		resp.comp_mask |= BNXT_RE_UCNTX_CMASK_WC_DPI_ENABLED;
+
 	uctx->shpage_mmap = bnxt_re_mmap_entry_insert(uctx, 0, BNXT_RE_MMAP_SH_PAGE, NULL);
 	if (!uctx->shpage_mmap) {
 		ibdev_err(ibdev, "Failed to create mmap entry for shared page\n");
@@ -4074,6 +4105,10 @@ void bnxt_re_dealloc_ucontext(struct ib_ucontext *ib_uctx)
 		/* Free DPI only if this is the first PD allocated by the
 		 * application and mark the context dpi as NULL
 		 */
+		if (uctx->wcdpi.dbr) {
+			bnxt_qplib_dealloc_dpi(&rdev->qplib_res, &uctx->wcdpi);
+			uctx->wcdpi.dbr = NULL;
+		}
 		bnxt_qplib_dealloc_dpi(&rdev->qplib_res, &uctx->dpi);
 		uctx->dpi.dbr = NULL;
 	}
@@ -4103,6 +4138,14 @@ int bnxt_re_mmap(struct ib_ucontext *ib_uctx, struct vm_area_struct *vma)
 				  rdma_entry);
 
 	switch (bnxt_entry->mmap_flag) {
+	case BNXT_RE_MMAP_WC_DB:
+		pfn = bnxt_entry->mem_offset >> PAGE_SHIFT;
+		ret = rdma_user_mmap_io(ib_uctx, vma, pfn, PAGE_SIZE,
+					pgprot_writecombine(vma->vm_page_prot),
+					rdma_entry);
+		if (ret)
+			ibdev_err(&rdev->ibdev, "Failed to map WC DB");
+		break;
 	case BNXT_RE_MMAP_UC_DB:
 		pfn = bnxt_entry->mem_offset >> PAGE_SHIFT;
 		ret = rdma_user_mmap_io(ib_uctx, vma, pfn, PAGE_SIZE,
diff --git a/drivers/infiniband/hw/bnxt_re/ib_verbs.h b/drivers/infiniband/hw/bnxt_re/ib_verbs.h
index dcd31ae..faf1481 100644
--- a/drivers/infiniband/hw/bnxt_re/ib_verbs.h
+++ b/drivers/infiniband/hw/bnxt_re/ib_verbs.h
@@ -61,6 +61,7 @@ struct bnxt_re_pd {
 	struct bnxt_qplib_pd	qplib_pd;
 	struct bnxt_re_fence_data fence;
 	struct rdma_user_mmap_entry *pd_db_mmap;
+	struct rdma_user_mmap_entry *pd_wcdb_mmap;
 };
 
 struct bnxt_re_ah {
@@ -135,6 +136,7 @@ struct bnxt_re_ucontext {
 	struct ib_ucontext      ib_uctx;
 	struct bnxt_re_dev	*rdev;
 	struct bnxt_qplib_dpi	dpi;
+	struct bnxt_qplib_dpi   wcdpi;
 	void			*shpg;
 	spinlock_t		sh_lock;	/* protect shpg */
 	struct rdma_user_mmap_entry *shpage_mmap;
@@ -143,6 +145,7 @@ struct bnxt_re_ucontext {
 enum bnxt_re_mmap_flag {
 	BNXT_RE_MMAP_SH_PAGE,
 	BNXT_RE_MMAP_UC_DB,
+	BNXT_RE_MMAP_WC_DB,
 };
 
 struct bnxt_re_user_mmap_entry {
@@ -228,7 +231,6 @@ void bnxt_re_dealloc_ucontext(struct ib_ucontext *context);
 int bnxt_re_mmap(struct ib_ucontext *context, struct vm_area_struct *vma);
 void bnxt_re_mmap_free(struct rdma_user_mmap_entry *rdma_entry);
 
-
 unsigned long bnxt_re_lock_cqs(struct bnxt_re_qp *qp);
 void bnxt_re_unlock_cqs(struct bnxt_re_qp *qp, unsigned long flags);
 #endif /* __BNXT_RE_IB_VERBS_H__ */
diff --git a/drivers/infiniband/hw/bnxt_re/main.c b/drivers/infiniband/hw/bnxt_re/main.c
index cfd3708..824dc3b 100644
--- a/drivers/infiniband/hw/bnxt_re/main.c
+++ b/drivers/infiniband/hw/bnxt_re/main.c
@@ -117,6 +117,11 @@ static void bnxt_re_set_db_offset(struct bnxt_re_dev *rdev)
 	 * in such cases and DB-push will be disabled.
 	 */
 	barlen = pci_resource_len(res->pdev, RCFW_DBR_PCI_BAR_REGION);
+	if (cctx->modes.db_push && l2db_len && en_dev->l2_db_size != barlen) {
+		res->dpi_tbl.wcreg.offset = en_dev->l2_db_size;
+		dev_info(rdev_to_dev(rdev),
+			 "Low latency framework is enabled\n");
+	}
 }
 
 static void bnxt_re_set_drv_mode(struct bnxt_re_dev *rdev, u8 mode)
@@ -430,6 +435,11 @@ int bnxt_re_hwrm_qcaps(struct bnxt_re_dev *rdev)
 			"Failed to query capabilities, rc = %#x", rc);
 		return rc;
 	}
+	cctx->modes.db_push = le32_to_cpu(resp.flags) & FUNC_QCAPS_RESP_FLAGS_WCB_PUSH_MODE;
+
+	if (cctx->modes.db_push)
+		ibdev_dbg(&rdev->ibdev, "DB push enabled");
+
 	return 0;
 }
 
diff --git a/drivers/infiniband/hw/bnxt_re/qplib_res.c b/drivers/infiniband/hw/bnxt_re/qplib_res.c
index bb3087d..5483778 100644
--- a/drivers/infiniband/hw/bnxt_re/qplib_res.c
+++ b/drivers/infiniband/hw/bnxt_re/qplib_res.c
@@ -741,6 +741,9 @@ int bnxt_qplib_alloc_dpi(struct bnxt_qplib_res *res,
 		dpi->dbr = dpit->priv_db;
 		dpi->dpi = dpi->bit;
 		break;
+	case BNXT_QPLIB_DPI_TYPE_WC:
+		dpi->dbr = ioremap_wc(umaddr, PAGE_SIZE);
+		break;
 	default:
 		dpi->dbr = ioremap(umaddr, PAGE_SIZE);
 		break;
diff --git a/drivers/infiniband/hw/bnxt_re/qplib_res.h b/drivers/infiniband/hw/bnxt_re/qplib_res.h
index 95b1d6c..dc39f67 100644
--- a/drivers/infiniband/hw/bnxt_re/qplib_res.h
+++ b/drivers/infiniband/hw/bnxt_re/qplib_res.h
@@ -47,7 +47,7 @@ extern const struct bnxt_qplib_gid bnxt_qplib_gid_zero;
 
 struct bnxt_qplib_drv_modes {
 	u8	wqe_mode;
-	/* Other modes to follow here */
+	bool db_push;
 };
 
 struct bnxt_qplib_chip_ctx {
@@ -193,6 +193,7 @@ struct bnxt_qplib_sgid_tbl {
 enum {
 	BNXT_QPLIB_DPI_TYPE_KERNEL      = 0,
 	BNXT_QPLIB_DPI_TYPE_UC          = 1,
+	BNXT_QPLIB_DPI_TYPE_WC          = 2
 };
 
 struct bnxt_qplib_dpi {
diff --git a/include/uapi/rdma/bnxt_re-abi.h b/include/uapi/rdma/bnxt_re-abi.h
index c4e9077..719f1fe 100644
--- a/include/uapi/rdma/bnxt_re-abi.h
+++ b/include/uapi/rdma/bnxt_re-abi.h
@@ -51,6 +51,7 @@
 enum {
 	BNXT_RE_UCNTX_CMASK_HAVE_CCTX = 0x1ULL,
 	BNXT_RE_UCNTX_CMASK_HAVE_MODE = 0x02ULL,
+	BNXT_RE_UCNTX_CMASK_WC_DPI_ENABLED = 0x04ULL,
 };
 
 enum bnxt_re_wqe_mode {
@@ -78,10 +79,18 @@ struct bnxt_re_uctx_resp {
  * not 8 byted aligned. To avoid undesired padding in various cases we have to
  * set this struct to packed.
  */
+enum {
+	BNXT_RE_COMP_MASK_PD_HAS_WC_DPI = 0x01,
+};
+
 struct bnxt_re_pd_resp {
 	__u32 pdid;
 	__u32 dpi;
 	__u64 dbr;
+	__u64 comp_mask;
+	__u32 rsvd;
+	__u32 wcdpi;
+	__u64 wcdbr;
 } __attribute__((packed, aligned(4)));
 
 struct bnxt_re_cq_req {
-- 
2.5.5


[-- Attachment #2: S/MIME Cryptographic Signature --]
[-- Type: application/pkcs7-signature, Size: 4224 bytes --]

^ permalink raw reply related	[flat|nested] 17+ messages in thread

* Re: [PATCH for-next 1/6] RDMA/bnxt_re: Use the common mmap helper functions
  2023-04-10 11:11 ` [PATCH for-next 1/6] RDMA/bnxt_re: Use the common mmap helper functions Selvin Xavier
@ 2023-04-10 12:20   ` Leon Romanovsky
  2023-04-11 16:53   ` Jason Gunthorpe
  1 sibling, 0 replies; 17+ messages in thread
From: Leon Romanovsky @ 2023-04-10 12:20 UTC (permalink / raw)
  To: Selvin Xavier; +Cc: jgg, linux-rdma, andrew.gospodarek

On Mon, Apr 10, 2023 at 04:11:50AM -0700, Selvin Xavier wrote:
> Replace the mmap handling function with common code in
> IB core. Create rdma_user_mmap_entry for each mmap
> resource and add to the ib_core mmap list. Add mmap_free
> verb support. Also, use rdma_user_mmap_io while mapping
> Doorbell pages.
> 
> Signed-off-by: Selvin Xavier <selvin.xavier@broadcom.com>
> ---
>  drivers/infiniband/hw/bnxt_re/ib_verbs.c  | 110 ++++++++++++++++++++++++++----
>  drivers/infiniband/hw/bnxt_re/ib_verbs.h  |  15 ++++
>  drivers/infiniband/hw/bnxt_re/main.c      |   1 +
>  drivers/infiniband/hw/bnxt_re/qplib_fp.c  |  10 +--
>  drivers/infiniband/hw/bnxt_re/qplib_res.c |   2 +-
>  5 files changed, 115 insertions(+), 23 deletions(-)
> 
> diff --git a/drivers/infiniband/hw/bnxt_re/ib_verbs.c b/drivers/infiniband/hw/bnxt_re/ib_verbs.c
> index e86afec..c9d134c 100644
> --- a/drivers/infiniband/hw/bnxt_re/ib_verbs.c
> +++ b/drivers/infiniband/hw/bnxt_re/ib_verbs.c
> @@ -533,12 +533,42 @@ static int bnxt_re_create_fence_mr(struct bnxt_re_pd *pd)
>  	return rc;
>  }
>  
> +static struct rdma_user_mmap_entry*
> +bnxt_re_mmap_entry_insert(struct bnxt_re_ucontext *uctx, u64 mem_offset,
> +			  enum bnxt_re_mmap_flag mmap_flag, u64 *offset)
> +{
> +	struct bnxt_re_user_mmap_entry *entry = kzalloc(sizeof(*entry), GFP_KERNEL);

Please separate calls to kzalloc() and variable initialization.

Thanks

^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: [PATCH for-next 2/6] RDMA/bnxt_re: Add disassociate ucontext support
  2023-04-10 11:11 ` [PATCH for-next 2/6] RDMA/bnxt_re: Add disassociate ucontext support Selvin Xavier
@ 2023-04-10 12:27   ` Leon Romanovsky
  2023-04-11 16:49     ` Jason Gunthorpe
  0 siblings, 1 reply; 17+ messages in thread
From: Leon Romanovsky @ 2023-04-10 12:27 UTC (permalink / raw)
  To: Selvin Xavier; +Cc: jgg, linux-rdma, andrew.gospodarek

On Mon, Apr 10, 2023 at 04:11:51AM -0700, Selvin Xavier wrote:
> Add empty stub for disassociate ucontext as done in other vendor
> drivers.

It will be great to mention in commit message that the reason to this
stub is because you use rdma_user_mmap_io().

Thanks

> 
> Signed-off-by: Selvin Xavier <selvin.xavier@broadcom.com>
> ---
>  drivers/infiniband/hw/bnxt_re/main.c | 5 +++++
>  1 file changed, 5 insertions(+)
> 
> diff --git a/drivers/infiniband/hw/bnxt_re/main.c b/drivers/infiniband/hw/bnxt_re/main.c
> index 1d361eb..a866951 100644
> --- a/drivers/infiniband/hw/bnxt_re/main.c
> +++ b/drivers/infiniband/hw/bnxt_re/main.c
> @@ -466,6 +466,10 @@ static int bnxt_re_net_stats_ctx_alloc(struct bnxt_re_dev *rdev,
>  	return rc;
>  }
>  
> +static void bnxt_re_disassociate_ucontext(struct ib_ucontext *ibcontext)
> +{
> +}
> +
>  /* Device */
>  
>  static struct bnxt_re_dev *bnxt_re_from_netdev(struct net_device *netdev)
> @@ -532,6 +536,7 @@ static const struct ib_device_ops bnxt_re_dev_ops = {
>  	.destroy_qp = bnxt_re_destroy_qp,
>  	.destroy_srq = bnxt_re_destroy_srq,
>  	.device_group = &bnxt_re_dev_attr_group,
> +	.disassociate_ucontext = bnxt_re_disassociate_ucontext,
>  	.get_dev_fw_str = bnxt_re_query_fw_str,
>  	.get_dma_mr = bnxt_re_get_dma_mr,
>  	.get_hw_stats = bnxt_re_ib_get_hw_stats,
> -- 
> 2.5.5
> 



^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: [PATCH for-next 3/6] RDMA/bnxt_re: Query function capabilities from firmware
  2023-04-10 11:11 ` [PATCH for-next 3/6] RDMA/bnxt_re: Query function capabilities from firmware Selvin Xavier
@ 2023-04-10 12:28   ` Leon Romanovsky
  0 siblings, 0 replies; 17+ messages in thread
From: Leon Romanovsky @ 2023-04-10 12:28 UTC (permalink / raw)
  To: Selvin Xavier; +Cc: jgg, linux-rdma, andrew.gospodarek

On Mon, Apr 10, 2023 at 04:11:52AM -0700, Selvin Xavier wrote:
> Query Function capabilities to enable advanced features.
> 
> Signed-off-by: Selvin Xavier <selvin.xavier@broadcom.com>
> ---
>  drivers/infiniband/hw/bnxt_re/main.c | 30 ++++++++++++++++++++++++++++++
>  1 file changed, 30 insertions(+)
> 
> diff --git a/drivers/infiniband/hw/bnxt_re/main.c b/drivers/infiniband/hw/bnxt_re/main.c
> index a866951..1b69198 100644
> --- a/drivers/infiniband/hw/bnxt_re/main.c
> +++ b/drivers/infiniband/hw/bnxt_re/main.c
> @@ -83,6 +83,7 @@ static int bnxt_re_netdev_event(struct notifier_block *notifier,
>  				unsigned long event, void *ptr);
>  static struct bnxt_re_dev *bnxt_re_from_netdev(struct net_device *netdev);
>  static void bnxt_re_dev_uninit(struct bnxt_re_dev *rdev);
> +static int bnxt_re_hwrm_qcaps(struct bnxt_re_dev *rdev);
>  
>  static void bnxt_re_set_drv_mode(struct bnxt_re_dev *rdev, u8 mode)
>  {
> @@ -91,6 +92,9 @@ static void bnxt_re_set_drv_mode(struct bnxt_re_dev *rdev, u8 mode)
>  	cctx = rdev->chip_ctx;
>  	cctx->modes.wqe_mode = bnxt_qplib_is_chip_gen_p5(rdev->chip_ctx) ?
>  			       mode : BNXT_QPLIB_WQE_MODE_STATIC;
> +	if (bnxt_re_hwrm_qcaps(rdev))
> +		dev_err(rdev_to_dev(rdev),
> +			"Failed to query hwrm qcaps\n");

You already print error in bnxt_re_hwrm_qcaps()

>  }

<...>

> +/* Query function capabilities using common hwrm */
> +int bnxt_re_hwrm_qcaps(struct bnxt_re_dev *rdev)

<...>

> +	if (rc) {
> +		dev_err(rdev_to_dev(rdev),
> +			"Failed to query capabilities, rc = %#x", rc);
> +		return rc;
> +	}
> +	return 0;
> +}
> +
>  static int bnxt_re_net_ring_free(struct bnxt_re_dev *rdev,
>  				 u16 fw_ring_id, int type)
>  {
> -- 
> 2.5.5
> 



^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: [PATCH for-next 0/6] RDMA/bnxt_re: driver update for supporting low latency push
  2023-04-10 11:11 [PATCH for-next 0/6] RDMA/bnxt_re: driver update for supporting low latency push Selvin Xavier
                   ` (5 preceding siblings ...)
  2023-04-10 11:11 ` [PATCH for-next 6/6] RDMA/bnxt_re: Enable low latency push Selvin Xavier
@ 2023-04-10 12:32 ` Leon Romanovsky
  2023-04-11  2:29   ` Selvin Xavier
  6 siblings, 1 reply; 17+ messages in thread
From: Leon Romanovsky @ 2023-04-10 12:32 UTC (permalink / raw)
  To: Selvin Xavier; +Cc: jgg, linux-rdma, andrew.gospodarek

On Mon, Apr 10, 2023 at 04:11:49AM -0700, Selvin Xavier wrote:
> The series aims to add support for Low latency push path in
> some of the bnxt devices. The low latency implementation is
> supported only for the user applications. Also, the code
> is modified to use  common mmap helper functions exported
> by IB core. 

What does it mean "low latency push"?

Thanks

> 
> User library changes are added in the pull request
> https://github.com/linux-rdma/rdma-core/pull/1321
> 
> Please review.
> 
> Thanks,
> Selvin Xavier
> 
> Selvin Xavier (6):
>   RDMA/bnxt_re: Use the common mmap helper functions
>   RDMA/bnxt_re: Add disassociate ucontext support
>   RDMA/bnxt_re: Query function capabilities from firmware
>   RDMA/bnxt_re: Move the interface version to chip context structure
>   RDMA/bnxt_re: Reorg the bar mapping
>   RDMA/bnxt_re: Enable low latency push
> 
>  drivers/infiniband/hw/bnxt_re/ib_verbs.c   | 160 +++++++++++++++++++++---
>  drivers/infiniband/hw/bnxt_re/ib_verbs.h   |  17 +++
>  drivers/infiniband/hw/bnxt_re/main.c       | 123 +++++++++++++++++-
>  drivers/infiniband/hw/bnxt_re/qplib_fp.c   |  14 +--
>  drivers/infiniband/hw/bnxt_re/qplib_rcfw.c |   2 +-
>  drivers/infiniband/hw/bnxt_re/qplib_rcfw.h |   1 +
>  drivers/infiniband/hw/bnxt_re/qplib_res.c  | 192 +++++++++++++++++++----------
>  drivers/infiniband/hw/bnxt_re/qplib_res.h  |  33 +++--
>  drivers/infiniband/hw/bnxt_re/qplib_sp.c   |   3 +
>  drivers/infiniband/hw/bnxt_re/qplib_sp.h   |   1 +
>  include/uapi/rdma/bnxt_re-abi.h            |   9 ++
>  11 files changed, 449 insertions(+), 106 deletions(-)
> 
> -- 
> 2.5.5
> 



^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: [PATCH for-next 0/6] RDMA/bnxt_re: driver update for supporting low latency push
  2023-04-10 12:32 ` [PATCH for-next 0/6] RDMA/bnxt_re: driver update for supporting " Leon Romanovsky
@ 2023-04-11  2:29   ` Selvin Xavier
  0 siblings, 0 replies; 17+ messages in thread
From: Selvin Xavier @ 2023-04-11  2:29 UTC (permalink / raw)
  To: Leon Romanovsky; +Cc: jgg, linux-rdma, andrew.gospodarek

[-- Attachment #1: Type: text/plain, Size: 2103 bytes --]

On Mon, Apr 10, 2023 at 6:02 PM Leon Romanovsky <leon@kernel.org> wrote:
>
> On Mon, Apr 10, 2023 at 04:11:49AM -0700, Selvin Xavier wrote:
> > The series aims to add support for Low latency push path in
> > some of the bnxt devices. The low latency implementation is
> > supported only for the user applications. Also, the code
> > is modified to use  common mmap helper functions exported
> > by IB core.
>
> What does it mean "low latency push"?

It is a hardware channel that can be used for transmitting smaller
buffers (<=96 bytes) with lower latency. This is by pushing the data
to HW buffers directly from the host (instead of DMA by the HW to get
the data to be transmitted). Hence the name "low latency push".
>
> Thanks
>
> >
> > User library changes are added in the pull request
> > https://github.com/linux-rdma/rdma-core/pull/1321
> >
> > Please review.
> >
> > Thanks,
> > Selvin Xavier
> >
> > Selvin Xavier (6):
> >   RDMA/bnxt_re: Use the common mmap helper functions
> >   RDMA/bnxt_re: Add disassociate ucontext support
> >   RDMA/bnxt_re: Query function capabilities from firmware
> >   RDMA/bnxt_re: Move the interface version to chip context structure
> >   RDMA/bnxt_re: Reorg the bar mapping
> >   RDMA/bnxt_re: Enable low latency push
> >
> >  drivers/infiniband/hw/bnxt_re/ib_verbs.c   | 160 +++++++++++++++++++++---
> >  drivers/infiniband/hw/bnxt_re/ib_verbs.h   |  17 +++
> >  drivers/infiniband/hw/bnxt_re/main.c       | 123 +++++++++++++++++-
> >  drivers/infiniband/hw/bnxt_re/qplib_fp.c   |  14 +--
> >  drivers/infiniband/hw/bnxt_re/qplib_rcfw.c |   2 +-
> >  drivers/infiniband/hw/bnxt_re/qplib_rcfw.h |   1 +
> >  drivers/infiniband/hw/bnxt_re/qplib_res.c  | 192 +++++++++++++++++++----------
> >  drivers/infiniband/hw/bnxt_re/qplib_res.h  |  33 +++--
> >  drivers/infiniband/hw/bnxt_re/qplib_sp.c   |   3 +
> >  drivers/infiniband/hw/bnxt_re/qplib_sp.h   |   1 +
> >  include/uapi/rdma/bnxt_re-abi.h            |   9 ++
> >  11 files changed, 449 insertions(+), 106 deletions(-)
> >
> > --
> > 2.5.5
> >
>
>

[-- Attachment #2: S/MIME Cryptographic Signature --]
[-- Type: application/pkcs7-signature, Size: 4224 bytes --]

^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: [PATCH for-next 2/6] RDMA/bnxt_re: Add disassociate ucontext support
  2023-04-10 12:27   ` Leon Romanovsky
@ 2023-04-11 16:49     ` Jason Gunthorpe
  0 siblings, 0 replies; 17+ messages in thread
From: Jason Gunthorpe @ 2023-04-11 16:49 UTC (permalink / raw)
  To: Leon Romanovsky; +Cc: Selvin Xavier, linux-rdma, andrew.gospodarek

On Mon, Apr 10, 2023 at 03:27:01PM +0300, Leon Romanovsky wrote:
> On Mon, Apr 10, 2023 at 04:11:51AM -0700, Selvin Xavier wrote:
> > Add empty stub for disassociate ucontext as done in other vendor
> > drivers.
> 
> It will be great to mention in commit message that the reason to this
> stub is because you use rdma_user_mmap_io().

That isn't the reason to do this stub..

It is some yet-to-be-cleaned-up way for the driver to indicate it
*fully* supports driver disassociation.

rdma_user_mmap_io() is part of that support, but the whole
functionality should be tested before setting this.

Jason

^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: [PATCH for-next 1/6] RDMA/bnxt_re: Use the common mmap helper functions
  2023-04-10 11:11 ` [PATCH for-next 1/6] RDMA/bnxt_re: Use the common mmap helper functions Selvin Xavier
  2023-04-10 12:20   ` Leon Romanovsky
@ 2023-04-11 16:53   ` Jason Gunthorpe
  2023-04-12  6:49     ` Selvin Xavier
  1 sibling, 1 reply; 17+ messages in thread
From: Jason Gunthorpe @ 2023-04-11 16:53 UTC (permalink / raw)
  To: Selvin Xavier; +Cc: leon, linux-rdma, andrew.gospodarek

On Mon, Apr 10, 2023 at 04:11:50AM -0700, Selvin Xavier wrote:
> -		rc = ib_copy_to_udata(udata, &resp, sizeof(resp));
> +		pd->pd_db_mmap = bnxt_re_mmap_entry_insert(ucntx, (u64)ucntx->dpi.umdbr,
> +							   BNXT_RE_MMAP_UC_DB, &resp.dbr);
> +
> +		if (!pd->pd_db_mmap) {
> +			ibdev_err(&rdev->ibdev,
> +				  "Failed to insert mmap entry\n");

No prints from drivers on failure paths. dbg at worst.

> +	switch (bnxt_entry->mmap_flag) {
> +	case BNXT_RE_MMAP_UC_DB:
> +		pfn = bnxt_entry->mem_offset >> PAGE_SHIFT;
> +		ret = rdma_user_mmap_io(ib_uctx, vma, pfn, PAGE_SIZE,
> +					pgprot_noncached(vma->vm_page_prot),
> +				rdma_entry);
> +		if (ret)
> +			ibdev_err(&rdev->ibdev, "Failed to map shared page");
> +		break;
> +	case BNXT_RE_MMAP_SH_PAGE:
>  		pfn = virt_to_phys(uctx->shpg) >> PAGE_SHIFT;
>  		if (remap_pfn_range(vma, vma->vm_start,
>  				    pfn, PAGE_SIZE, vma->vm_page_prot)) {
>  			ibdev_err(&rdev->ibdev, "Failed to map shared page");
> -			return -EAGAIN;
> +			ret =  -EAGAIN;
>  		}
> +		break;

What is this? You can't enable disassociate support until all the mmap's
in the driver have been fixed.

Jason


^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: [PATCH for-next 6/6] RDMA/bnxt_re: Enable low latency push
  2023-04-10 11:11 ` [PATCH for-next 6/6] RDMA/bnxt_re: Enable low latency push Selvin Xavier
@ 2023-04-11 16:56   ` Jason Gunthorpe
  2023-04-12  5:58     ` Selvin Xavier
  0 siblings, 1 reply; 17+ messages in thread
From: Jason Gunthorpe @ 2023-04-11 16:56 UTC (permalink / raw)
  To: Selvin Xavier; +Cc: leon, linux-rdma, andrew.gospodarek

On Mon, Apr 10, 2023 at 04:11:55AM -0700, Selvin Xavier wrote:
> Enabling the low latency push in Gen P5 adapters for small
> packets. This is supported only for the user space QPs.
> Introduce new mmap flag for write combine buffers.
> Allocate separate Write Combine pages from BAR when Low
> latency push mode is enabled in HW.

No new mmap flags.

This looks like it is basically the same as mlx5, I expect you'll run
into all the same issues and needs as mlx5 did.

Follow the modern mlx5 design, add a new API to allocate one of these
pages and have it return back the mmap cookie to use. Let userspace
allocate as many as it needs.

Jason

^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: [PATCH for-next 6/6] RDMA/bnxt_re: Enable low latency push
  2023-04-11 16:56   ` Jason Gunthorpe
@ 2023-04-12  5:58     ` Selvin Xavier
  0 siblings, 0 replies; 17+ messages in thread
From: Selvin Xavier @ 2023-04-12  5:58 UTC (permalink / raw)
  To: Jason Gunthorpe; +Cc: leon, linux-rdma, andrew.gospodarek

[-- Attachment #1: Type: text/plain, Size: 843 bytes --]

On Tue, Apr 11, 2023 at 10:26 PM Jason Gunthorpe <jgg@ziepe.ca> wrote:
>
> On Mon, Apr 10, 2023 at 04:11:55AM -0700, Selvin Xavier wrote:
> > Enabling the low latency push in Gen P5 adapters for small
> > packets. This is supported only for the user space QPs.
> > Introduce new mmap flag for write combine buffers.
> > Allocate separate Write Combine pages from BAR when Low
> > latency push mode is enabled in HW.
>
> No new mmap flags.
>
> This looks like it is basically the same as mlx5, I expect you'll run
> into all the same issues and needs as mlx5 did.
>
> Follow the modern mlx5 design, add a new API to allocate one of these
> pages and have it return back the mmap cookie to use. Let userspace
> allocate as many as it needs.
Thanks Jason for the pointers. Will review this and rework on the patch
>
> Jason

[-- Attachment #2: S/MIME Cryptographic Signature --]
[-- Type: application/pkcs7-signature, Size: 4224 bytes --]

^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: [PATCH for-next 1/6] RDMA/bnxt_re: Use the common mmap helper functions
  2023-04-11 16:53   ` Jason Gunthorpe
@ 2023-04-12  6:49     ` Selvin Xavier
  0 siblings, 0 replies; 17+ messages in thread
From: Selvin Xavier @ 2023-04-12  6:49 UTC (permalink / raw)
  To: Jason Gunthorpe; +Cc: leon, linux-rdma, andrew.gospodarek

[-- Attachment #1: Type: text/plain, Size: 1747 bytes --]

On Tue, Apr 11, 2023 at 10:23 PM Jason Gunthorpe <jgg@ziepe.ca> wrote:
>
> On Mon, Apr 10, 2023 at 04:11:50AM -0700, Selvin Xavier wrote:
> > -             rc = ib_copy_to_udata(udata, &resp, sizeof(resp));
> > +             pd->pd_db_mmap = bnxt_re_mmap_entry_insert(ucntx, (u64)ucntx->dpi.umdbr,
> > +                                                        BNXT_RE_MMAP_UC_DB, &resp.dbr);
> > +
> > +             if (!pd->pd_db_mmap) {
> > +                     ibdev_err(&rdev->ibdev,
> > +                               "Failed to insert mmap entry\n");
>
> No prints from drivers on failure paths. dbg at worst.
>
> > +     switch (bnxt_entry->mmap_flag) {
> > +     case BNXT_RE_MMAP_UC_DB:
> > +             pfn = bnxt_entry->mem_offset >> PAGE_SHIFT;
> > +             ret = rdma_user_mmap_io(ib_uctx, vma, pfn, PAGE_SIZE,
> > +                                     pgprot_noncached(vma->vm_page_prot),
> > +                             rdma_entry);
> > +             if (ret)
> > +                     ibdev_err(&rdev->ibdev, "Failed to map shared page");
> > +             break;
> > +     case BNXT_RE_MMAP_SH_PAGE:
> >               pfn = virt_to_phys(uctx->shpg) >> PAGE_SHIFT;
> >               if (remap_pfn_range(vma, vma->vm_start,
> >                                   pfn, PAGE_SIZE, vma->vm_page_prot)) {
> >                       ibdev_err(&rdev->ibdev, "Failed to map shared page");
> > -                     return -EAGAIN;
> > +                     ret =  -EAGAIN;
> >               }
> > +             break;
>
> What is this? You can't enable disassociate support until all the mmap's
> in the driver have been fixed.
Noted. Will modify this also to use rdma mmap apis.
>
> Jason
>

[-- Attachment #2: S/MIME Cryptographic Signature --]
[-- Type: application/pkcs7-signature, Size: 4224 bytes --]

^ permalink raw reply	[flat|nested] 17+ messages in thread

end of thread, other threads:[~2023-04-12  6:49 UTC | newest]

Thread overview: 17+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2023-04-10 11:11 [PATCH for-next 0/6] RDMA/bnxt_re: driver update for supporting low latency push Selvin Xavier
2023-04-10 11:11 ` [PATCH for-next 1/6] RDMA/bnxt_re: Use the common mmap helper functions Selvin Xavier
2023-04-10 12:20   ` Leon Romanovsky
2023-04-11 16:53   ` Jason Gunthorpe
2023-04-12  6:49     ` Selvin Xavier
2023-04-10 11:11 ` [PATCH for-next 2/6] RDMA/bnxt_re: Add disassociate ucontext support Selvin Xavier
2023-04-10 12:27   ` Leon Romanovsky
2023-04-11 16:49     ` Jason Gunthorpe
2023-04-10 11:11 ` [PATCH for-next 3/6] RDMA/bnxt_re: Query function capabilities from firmware Selvin Xavier
2023-04-10 12:28   ` Leon Romanovsky
2023-04-10 11:11 ` [PATCH for-next 4/6] RDMA/bnxt_re: Move the interface version to chip context structure Selvin Xavier
2023-04-10 11:11 ` [PATCH for-next 5/6] RDMA/bnxt_re: Reorg the bar mapping Selvin Xavier
2023-04-10 11:11 ` [PATCH for-next 6/6] RDMA/bnxt_re: Enable low latency push Selvin Xavier
2023-04-11 16:56   ` Jason Gunthorpe
2023-04-12  5:58     ` Selvin Xavier
2023-04-10 12:32 ` [PATCH for-next 0/6] RDMA/bnxt_re: driver update for supporting " Leon Romanovsky
2023-04-11  2:29   ` Selvin Xavier

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox