Linux RDMA and InfiniBand development
 help / color / mirror / Atom feed
From: Selvin Xavier <selvin.xavier@broadcom.com>
To: leon@kernel.org, jgg@ziepe.ca
Cc: linux-rdma@vger.kernel.org, andrew.gospodarek@broadcom.com,
	kalesh-anakkur.purayil@broadcom.com, netdev@vger.kernel.org,
	davem@davemloft.net, edumazet@google.com, kuba@kernel.org,
	abeni@redhat.com, horms@kernel.org, michael.chan@broadcom.com,
	Selvin Xavier <selvin.xavier@broadcom.com>
Subject: [PATCH rdma-next 5/9] bnxt_en: Introduce ULP coredump callbacks
Date: Thu, 20 Feb 2025 10:34:52 -0800	[thread overview]
Message-ID: <1740076496-14227-6-git-send-email-selvin.xavier@broadcom.com> (raw)
In-Reply-To: <1740076496-14227-1-git-send-email-selvin.xavier@broadcom.com>

From: Michael Chan <michael.chan@broadcom.com>

Add .ulp_get_dump_info() and .ulp_get_dump_data() callbacks to
struct bnxt_ulp_ops.  When ethtool -w is invoked to get the coredump,
these 2 callbacks to the bnxt_re auxbus driver will be called if
they are populated by the bnxt_re driver.  The first callback gets
the number of coredump segments and the size of each coredump
segment.  The 2nd callback copies the coredump data for each segment.

Signed-off-by: Michael Chan <michael.chan@broadcom.com>
Reviewed-by: Andy Gospodarek <andrew.gospodarek@broadcom.com>
Reviewed-by: Selvin Xavier <selvin.xavier@broadcom.com>
Signed-off-by: Selvin Xavier <selvin.xavier@broadcom.com>
---
 drivers/net/ethernet/broadcom/bnxt/bnxt_coredump.c | 12 ++++-
 drivers/net/ethernet/broadcom/bnxt/bnxt_ulp.c      | 57 ++++++++++++++++++++++
 drivers/net/ethernet/broadcom/bnxt/bnxt_ulp.h      | 22 +++++++++
 3 files changed, 89 insertions(+), 2 deletions(-)

diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt_coredump.c b/drivers/net/ethernet/broadcom/bnxt/bnxt_coredump.c
index 7236d8e..2106d0d 100644
--- a/drivers/net/ethernet/broadcom/bnxt/bnxt_coredump.c
+++ b/drivers/net/ethernet/broadcom/bnxt/bnxt_coredump.c
@@ -14,6 +14,7 @@
 #include "bnxt.h"
 #include "bnxt_hwrm.h"
 #include "bnxt_coredump.h"
+#include "bnxt_ulp.h"
 
 static const u16 bnxt_bstore_to_seg_id[] = {
 	[BNXT_CTX_QP]			= BNXT_CTX_MEM_SEG_QP,
@@ -414,13 +415,20 @@ static int __bnxt_get_coredump(struct bnxt *bp, u16 dump_type, void *buf,
 	}
 
 	if (dump_type == BNXT_DUMP_DRIVER) {
-		u32 drv_len, segs = 0;
+		u32 drv_len, drv_segs, segs = 0;
+		void *drv_buf = NULL;
 
 		drv_len = bnxt_get_ctx_coredump(bp, buf, offset, &segs);
+		drv_segs = segs;
+		segs = 0;
+		if (buf)
+			drv_buf = buf + offset + drv_len;
+		drv_len += bnxt_get_ulp_dump(bp, dump_type, drv_buf, &segs);
+		drv_segs += segs;
 		*dump_len += drv_len;
 		offset += drv_len;
 		if (buf)
-			coredump.total_segs += segs;
+			coredump.total_segs += drv_segs;
 		goto err;
 	}
 
diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt_ulp.c b/drivers/net/ethernet/broadcom/bnxt/bnxt_ulp.c
index e4a7f37..6f640b2 100644
--- a/drivers/net/ethernet/broadcom/bnxt/bnxt_ulp.c
+++ b/drivers/net/ethernet/broadcom/bnxt/bnxt_ulp.c
@@ -25,6 +25,7 @@
 #include "bnxt.h"
 #include "bnxt_hwrm.h"
 #include "bnxt_ulp.h"
+#include "bnxt_coredump.h"
 
 static DEFINE_IDA(bnxt_aux_dev_ids);
 
@@ -393,6 +394,62 @@ void bnxt_register_async_events(struct bnxt_en_dev *edev,
 }
 EXPORT_SYMBOL(bnxt_register_async_events);
 
+static void bnxt_ulp_fill_dump_hdr(struct bnxt *bp, void *buf, u32 seg_id,
+				   u32 seg_len)
+{
+	struct bnxt_coredump_segment_hdr seg_hdr;
+
+	bnxt_fill_coredump_seg_hdr(bp, &seg_hdr, NULL, seg_len, 0, 0, 0,
+				   BNXT_DRV_COMP_ID, seg_id);
+	memcpy(buf, &seg_hdr, sizeof(seg_hdr));
+}
+
+u32 bnxt_get_ulp_dump(struct bnxt *bp, u32 dump_flag, void *buf, u32 *segs)
+{
+	struct bnxt_en_dev *edev = bp->edev;
+	struct bnxt_ulp_dump *dump;
+	struct bnxt_ulp_ops *ops;
+	struct bnxt_ulp *ulp;
+	u32 i, dump_len = 0;
+
+	*segs = 0;
+	if (!edev || !bnxt_ulp_registered(edev))
+		return 0;
+
+	ulp = edev->ulp_tbl;
+	ops = rtnl_dereference(ulp->ulp_ops);
+	if (!ops || !ops->ulp_get_dump_info || !ops->ulp_get_dump_data)
+		return 0;
+
+	dump = &ulp->ulp_dump;
+	if (!buf) {
+		memset(dump, 0, sizeof(*dump));
+		ops->ulp_get_dump_info(ulp->handle, dump_flag, dump);
+		if (dump->segs > BNXT_ULP_MAX_DUMP_SEGS)
+			return 0;
+		for (i = 0; i < dump->segs; i++) {
+			dump_len += dump->seg_tbl[i].seg_len;
+			dump_len += BNXT_SEG_HDR_LEN;
+		}
+	} else {
+		for (i = 0; i < dump->segs; i++) {
+			struct bnxt_ulp_dump_tbl *tbl = &dump->seg_tbl[i];
+			u32 seg_len = tbl->seg_len;
+			u32 seg_id = tbl->seg_id;
+
+			bnxt_ulp_fill_dump_hdr(bp, buf, seg_id, seg_len);
+			buf += BNXT_SEG_HDR_LEN;
+			dump_len += BNXT_SEG_HDR_LEN;
+			ops->ulp_get_dump_data(ulp->handle, seg_id, buf,
+					       seg_len);
+			buf += seg_len;
+			dump_len += seg_len;
+		}
+	}
+	*segs = dump->segs;
+	return dump_len;
+}
+
 void bnxt_rdma_aux_device_uninit(struct bnxt *bp)
 {
 	struct bnxt_aux_priv *aux_priv;
diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt_ulp.h b/drivers/net/ethernet/broadcom/bnxt/bnxt_ulp.h
index 7fa3b8d..9298589 100644
--- a/drivers/net/ethernet/broadcom/bnxt/bnxt_ulp.h
+++ b/drivers/net/ethernet/broadcom/bnxt/bnxt_ulp.h
@@ -29,11 +29,31 @@ struct bnxt_msix_entry {
 	u32	db_offset;
 };
 
+#define BNXT_ULP_MAX_DUMP_SEGS	8
+
+/**
+ * struct bnxt_ulp_dump - bnxt ULP aux device coredump info
+ * @segs:	number of coredump segments with info in the seg_tbl
+ * @seg_tbl:	coredump segment table
+ * @seg_tbl.seg_id:	coredump segment ID
+ * @seg_tbl.seg_len:	coredump segment len
+ */
+struct bnxt_ulp_dump {
+	u32	segs;
+	struct bnxt_ulp_dump_tbl {
+		u32	seg_id;
+		u32	seg_len;
+	} seg_tbl[BNXT_ULP_MAX_DUMP_SEGS];
+};
+
 struct bnxt_ulp_ops {
 	/* async_notifier() cannot sleep (in BH context) */
 	void (*ulp_async_notifier)(void *, struct hwrm_async_event_cmpl *);
 	void (*ulp_irq_stop)(void *, bool);
 	void (*ulp_irq_restart)(void *, struct bnxt_msix_entry *);
+	void (*ulp_get_dump_info)(void *handle, u32 dump_flags,
+				  struct bnxt_ulp_dump *dump);
+	void (*ulp_get_dump_data)(void *handle, u32 seg_id, void *buf, u32 len);
 };
 
 struct bnxt_fw_msg {
@@ -51,6 +71,7 @@ struct bnxt_ulp {
 	u16		max_async_event_id;
 	u16		msix_requested;
 	atomic_t	ref_count;
+	struct bnxt_ulp_dump	ulp_dump;
 };
 
 struct bnxt_en_dev {
@@ -119,6 +140,7 @@ void bnxt_ulp_start(struct bnxt *bp, int err);
 void bnxt_ulp_sriov_cfg(struct bnxt *bp, int num_vfs);
 void bnxt_ulp_irq_stop(struct bnxt *bp);
 void bnxt_ulp_irq_restart(struct bnxt *bp, int err);
+u32 bnxt_get_ulp_dump(struct bnxt *bp, u32 dump_flag, void *buf, u32 *segs);
 void bnxt_ulp_async_events(struct bnxt *bp, struct hwrm_async_event_cmpl *cmpl);
 void bnxt_rdma_aux_device_uninit(struct bnxt *bp);
 void bnxt_rdma_aux_device_del(struct bnxt *bp);
-- 
2.5.5


  parent reply	other threads:[~2025-02-20 18:56 UTC|newest]

Thread overview: 15+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-02-20 18:34 [PATCH rdma-next 0/9] RDMA/bnxt_re: Driver Debug Enhancements Selvin Xavier
2025-02-20 18:34 ` [PATCH rdma-next 1/9] RDMA/bnxt_re: Add support for collecting the Queue dumps Selvin Xavier
2025-02-20 18:34 ` [PATCH rdma-next 2/9] RDMA/bnxt_re: Cache the QP information Selvin Xavier
2025-02-20 18:34 ` [PATCH rdma-next 3/9] RDMA/bnxt_re : Initialize the HW context dump collection Selvin Xavier
2025-02-20 18:34 ` [PATCH rdma-next 4/9] RDMA/bnxt_re: Get the resource contexts from the HW Selvin Xavier
2025-02-20 18:34 ` Selvin Xavier [this message]
2025-02-22  0:40   ` [PATCH rdma-next 5/9] bnxt_en: Introduce ULP coredump callbacks Jakub Kicinski
2025-02-20 18:34 ` [PATCH rdma-next 6/9] RDMA/bnxt_re: Support the dump infrastructure Selvin Xavier
2025-02-20 18:34 ` [PATCH rdma-next 7/9] RDMA/bnxt_re: Dump the debug information in snapdump Selvin Xavier
2025-02-20 18:34 ` [PATCH rdma-next 8/9] RDMA/bnxt_re: Dump the HW context information Selvin Xavier
2025-02-20 18:34 ` [PATCH rdma-next 9/9] RDMA/bnxt_re: Add support for changing the snap dump level Selvin Xavier
2025-02-23 13:34 ` [PATCH rdma-next 0/9] RDMA/bnxt_re: Driver Debug Enhancements Leon Romanovsky
2025-02-24  9:00   ` Selvin Xavier
2025-04-01 13:41     ` Jason Gunthorpe
2025-04-01 20:48       ` Andy Gospodarek

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1740076496-14227-6-git-send-email-selvin.xavier@broadcom.com \
    --to=selvin.xavier@broadcom.com \
    --cc=abeni@redhat.com \
    --cc=andrew.gospodarek@broadcom.com \
    --cc=davem@davemloft.net \
    --cc=edumazet@google.com \
    --cc=horms@kernel.org \
    --cc=jgg@ziepe.ca \
    --cc=kalesh-anakkur.purayil@broadcom.com \
    --cc=kuba@kernel.org \
    --cc=leon@kernel.org \
    --cc=linux-rdma@vger.kernel.org \
    --cc=michael.chan@broadcom.com \
    --cc=netdev@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox