Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 28 May 2026 19:06:53 +0000
From:      Navdeep Parhar <np@FreeBSD.org>
To:        src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org
Subject:   git: a172f9e5b3cf - main - cxgbe(4): Improvements to the slow interrupt handler
Message-ID:  <6a18924d.1fcc9.67a666f1@gitrepo.freebsd.org>

index | next in thread | raw e-mail

The branch main has been updated by np:

URL: https://cgit.FreeBSD.org/src/commit/?id=a172f9e5b3cf41882f087f6c5311dc068d9d6b54

commit a172f9e5b3cf41882f087f6c5311dc068d9d6b54
Author:     Navdeep Parhar <np@FreeBSD.org>
AuthorDate: 2026-05-28 07:12:20 +0000
Commit:     Navdeep Parhar <np@FreeBSD.org>
CommitDate: 2026-05-28 19:05:57 +0000

    cxgbe(4): Improvements to the slow interrupt handler
    
    * Add a flag to indicate that an INT_CAUSE should not be cleared
      automatically in the generic handler.  This is to ensure correct
      operation of some INT_CAUSEs that are related to each other and must
      be cleared in a certain order.
    * Add decode for many more INT_CAUSE registers.
    
    MFC after:      1 week
    Sponsored by:   Chelsio Communications
---
 sys/dev/cxgbe/adapter.h      |    1 +
 sys/dev/cxgbe/common/t4_hw.c | 1835 +++++++++++++++++++++++++++++++++++++-----
 2 files changed, 1648 insertions(+), 188 deletions(-)

diff --git a/sys/dev/cxgbe/adapter.h b/sys/dev/cxgbe/adapter.h
index 24a482b74dfb..8c5cf052b689 100644
--- a/sys/dev/cxgbe/adapter.h
+++ b/sys/dev/cxgbe/adapter.h
@@ -194,6 +194,7 @@ enum {
 	IHF_CLR_ALL_SET		= (1 << 5),	/* Clear all set bits */
 	IHF_CLR_ALL_UNIGNORED	= (1 << 6),	/* Clear all unignored bits */
 	IHF_RUN_ALL_ACTIONS	= (1 << 7),	/* As if all cause are set */
+	IHF_CLR_DELAYED		= (1 << 9),	/* Cleared in a delayed call */
 };
 
 #define IS_DETACHING(vi)	((vi)->flags & VI_DETACHING)
diff --git a/sys/dev/cxgbe/common/t4_hw.c b/sys/dev/cxgbe/common/t4_hw.c
index f4eef54e5c6b..41606201ad39 100644
--- a/sys/dev/cxgbe/common/t4_hw.c
+++ b/sys/dev/cxgbe/common/t4_hw.c
@@ -4794,6 +4794,27 @@ struct intr_info {
 	const struct intr_action *actions;
 };
 
+/* Helper to clear interrupts that have IHF_CLR_DELAYED. */
+static void
+clear_int_cause_reg(struct adapter *sc, const struct intr_info *ii, int flags)
+{
+	u32 cause, ucause;
+
+	cause = ucause = t4_read_reg(sc, ii->cause_reg);
+	if (cause == 0)
+		return;
+	flags |= ii->flags;
+	if (flags & IHF_IGNORE_IF_DISABLED)
+		ucause &= t4_read_reg(sc, ii->enable_reg);
+	if (flags & IHF_CLR_ALL_SET) {
+		t4_write_reg(sc, ii->cause_reg, cause);
+		(void)t4_read_reg(sc, ii->cause_reg);
+	} else if (ucause != 0 && flags & IHF_CLR_ALL_UNIGNORED) {
+		t4_write_reg(sc, ii->cause_reg, ucause);
+		(void)t4_read_reg(sc, ii->cause_reg);
+	}
+}
+
 static inline char
 intr_alert_char(u32 cause, u32 enable, u32 fatal)
 {
@@ -4869,8 +4890,8 @@ t4_handle_intr(struct adapter *sc, const struct intr_info *ii, uint32_t acause,
 		}
 	}
 
-	/* clear */
-	if (cause != 0) {
+	/* Clear here unless delayed clear is requested. */
+	if (cause != 0 && (flags & IHF_CLR_DELAYED) == 0) {
 		if (flags & IHF_CLR_ALL_SET) {
 			t4_write_reg(sc, ii->cause_reg, cause);
 			(void)t4_read_reg(sc, ii->cause_reg);
@@ -5003,22 +5024,63 @@ static bool pcie_intr_handler(struct adapter *adap, int arg, int flags)
 		.details = NULL,
 		.actions = NULL,
 	};
+	static const struct intr_details pcie_intr_cause_ext_details[] = {
+		{ F_IPFORMQPERR, "PCIe IP FormQ Buffer PERR" },
+		{ F_IPFORMQCERR, "PCIe IP FormQ Buffer CERR" },
+		{ F_TRGT1GRPCERR, "TRGT1 Group FIFOs CERR" },
+		{ F_IPSOTCERR, "PCIe IP SOT Buffer SRAM CERR" },
+		{ F_IPRETRYCERR, "PCIe IP Replay Buffer CERR" },
+		{ F_IPRXDATAGRPCERR, "PCIe IP Rx Data Group SRAMs CERR" },
+		{ F_IPRXHDRGRPCERR, "PCIe IP Rx Header Group SRAMs CERR" },
+		{ F_A0ARBRSPORDFIFOPERR, "A0 Arbiter Response Order FIFO Parity Error" },
+		{ F_HRSPCERR, "Master HMA Channel Response Data SRAM CERR" },
+		{ F_HREQRDCERR, "Master HMA Channel Read Request SRAM CERR" },
+		{ F_HREQWRCERR, "Master HMA Channel Write Request SRAM CERR" },
+		{ F_DRSPCERR, "Master DMA Channel Response Data SRAM CERR" },
+		{ F_DREQRDCERR, "Master DMA Channel Read Request SRAM CERR" },
+		{ F_DREQWRCERR, "Master DMA Channel Write Request SRAM CERR" },
+		{ F_CRSPCERR, "Master CMD Channel Response Data SRAM CERR" },
+		{ F_ARSPPERR, "Master ARM Channel Response Data SRAM PERR" },
+		{ F_AREQRDPERR, "Master ARM Channel Read Request SRAM PERR" },
+		{ F_AREQWRPERR, "Master ARM Channel Write Request SRAM PERR" },
+		{ F_PIOREQGRPCERR, "PIO Request Group FIFOs CERR" },
+		{ F_ARSPCERR, "Master ARM Channel Response Data SRAM CERR" },
+		{ F_AREQRDCERR, "Master ARM Channel Read Request SRAM CERR" },
+		{ F_AREQWRCERR, "Master ARM Channel Write Request SRAM CERR" },
+		{ F_MARSPPERR, "INIC MA Ctrl and Data Rsp Perr" },
+		{ F_INICMAWDATAORDPERR, "INIC Ma Arb Write Ord Data Fifo Perr" },
+		{ F_EMUPERR, "CFG EMU SRAM PERR" },
+		{ F_ERRSPPERR, "CFG EMU SRAM CERR" },
+		{ F_MSTGRPCERR, "Master Data Path and Response Read Queue SRAM CERR" },
+		{ 0 }
+	};
 	struct intr_info pcie_int_cause_ext = {
 		.name = "PCIE_INT_CAUSE_EXT",
 		.cause_reg = A_PCIE_INT_CAUSE_EXT,
 		.enable_reg = A_PCIE_INT_ENABLE_EXT,
 		.fatal = 0,
 		.flags = 0,
-		.details = NULL,
+		.details = pcie_intr_cause_ext_details,
 		.actions = NULL,
 	};
+	static const struct intr_details pcie_intr_cause_x8_details[] = {
+		{ F_X8TGTGRPPERR, "x8 TGT Group FIFOs parity error" },
+		{ F_X8IPSOTPERR, "PCIe x8 IP SOT Buffer SRAM PERR" },
+		{ F_X8IPRETRYPERR, "PCIe x8 IP Replay Buffer PERR" },
+		{ F_X8IPRXDATAGRPPERR, "PCIe x8 IP Rx Data Group SRAMs PERR" },
+		{ F_X8IPRXHDRGRPPERR, "PCIe x8 IP Rx Header Group SRAMs PERR" },
+		{ F_X8IPCORECERR, "x8 IP SOT, Retry, RxData, RxHdr SRAM CERR" },
+		{ F_X8MSTGRPPERR, "x8 Master Data Path and Response Read Queue SRAM PERR" },
+		{ F_X8MSTGRPCERR, "x8 Master Data Path and Response Read Queue SRAM CERR" },
+		{ 0 }
+	};
 	struct intr_info pcie_int_cause_x8 = {
 		.name = "PCIE_INT_CAUSE_X8",
 		.cause_reg = A_PCIE_INT_CAUSE_X8,
 		.enable_reg = A_PCIE_INT_ENABLE_X8,
 		.fatal = 0,
 		.flags = 0,
-		.details = NULL,
+		.details = pcie_intr_cause_x8_details,
 		.actions = NULL,
 	};
 	bool fatal = false;
@@ -5050,80 +5112,247 @@ static bool tp_intr_handler(struct adapter *adap, int arg, int flags)
 		{ F_FLMTXFLSTEMPTY, "TP out of Tx pages" },
 		{ 0 }
 	};
-	static const struct intr_info tp_intr_info = {
+	static const struct intr_details t7_tp_intr_details[] = {
+		{ F_FLMTXFLSTEMPTY, "Offload memory manager Tx free list empty" },
+		{ F_TPCERR, "TP modules flagged Correctable Error" },
+		{ F_OTHERPERR, "TP Other modules (Core, TM, FLM, MMGR, DB) Parity Error" },
+		{ F_TPEING1PERR, "TP-ESide Ingress1 Parity Error" },
+		{ F_TPEING0PERR, "TP-ESide Ingress0 Parity Error" },
+		{ F_TPEEGPERR, "TP-ESide Egress Parity Error" },
+		{ F_TPCPERR, "TP-CSide Parity Error" },
+		{ 0 }
+	};
+	struct intr_info tp_intr_info = {
 		.name = "TP_INT_CAUSE",
 		.cause_reg = A_TP_INT_CAUSE,
 		.enable_reg = A_TP_INT_ENABLE,
 		.fatal = 0x7fffffff,
-		.flags = IHF_FATAL_IFF_ENABLED,
-		.details = tp_intr_details,
+		.flags = IHF_FATAL_IFF_ENABLED | IHF_CLR_DELAYED,
+		.details = NULL,
 		.actions = NULL,
 	};
-	static const struct intr_info tp_inic_perr_cause = {
-		.name = "TP_INIC_PERR_CAUSE",
-		.cause_reg = A_TP_INIC_PERR_CAUSE,
-		.enable_reg = A_TP_INIC_PERR_ENABLE,
+	static const struct intr_details tp_cerr_cause_details[] = {
+		{ F_TPCEGDATAFIFO, "TPCSide Egress Data FIFO" },
+		{ F_TPCLBKDATAFIFO, "TPCSide Loopback Data FIFO" },
+		{ F_RSSLKPSRAM, "RSS Lookup SRAM" },
+		{ F_SRQSRAM, "SRQ SRAM" },
+		{ F_ARPDASRAM, "ARP DA SRAM" },
+		{ F_ARPSASRAM, "ARP SA SRAM" },
+		{ F_ARPGRESRAM, "ARP GRE SRAM" },
+		{ F_ARPIPSECSRAM1, "ARP IPSec SRAM0" },
+		{ F_ARPIPSECSRAM0, "ARP IPSec SRAM1" },
+		{ 0 }
+	};
+	static const struct intr_info tp_cerr_cause = {
+		.name = "TP_CERR_CAUSE",
+		.cause_reg = A_TP_CERR_CAUSE,
+		.enable_reg = A_TP_CERR_ENABLE,
 		.fatal = 0xffffffff,
 		.flags = IHF_FATAL_IFF_ENABLED,
-		.details = NULL,
+		.details = tp_cerr_cause_details,
 		.actions = NULL,
 	};
+	static const struct intr_details tp_c_perr_details[] = {
+		{ F_DMXFIFOOVFL, "Demux FIFO Overflow" },
+		{ F_URX2TPCDDPINTF, "ULPRX to TPC DDP Interface and FIFO" },
+		{ F_TPCDISPTOKENFIFO, "TPC Dispatch Token FIFO" },
+		{ F_TPCDISPCPLFIFO3, "TPC Dispatch CPL FIFO Ch3" },
+		{ F_TPCDISPCPLFIFO2, "TPC Dispatch CPL FIFO Ch2" },
+		{ F_TPCDISPCPLFIFO1, "TPC Dispatch CPL FIFO Ch1" },
+		{ F_TPCDISPCPLFIFO0, "TPC Dispatch CPL FIFO Ch0" },
+		{ F_URXPLDINTFCRC3, "ULPRX to TPC Payload Interface CRC Error Ch3" },
+		{ F_URXPLDINTFCRC2, "ULPRX to TPC Payload Interface CRC Error Ch2" },
+		{ F_URXPLDINTFCRC1, "ULPRX to TPC Payload Interface CRC Error Ch1" },
+		{ F_URXPLDINTFCRC0, "ULPRX to TPC Payload Interface CRC Error Ch0" },
+		{ F_DMXDBFIFO, "Demux DB FIFO" },
+		{ F_DMXDBSRAM, "Demux DB SRAM" },
+		{ F_DMXCPLFIFO, "Demux CPL FIFO" },
+		{ F_DMXCPLSRAM, "Demux CPL SRAM" },
+		{ F_DMXCSUMFIFO, "Demux Checksum FIFO" },
+		{ F_DMXLENFIFO, "Demux Length FIFO" },
+		{ F_DMXCHECKFIFO, "Demux Check CRC16 FIFO" },
+		{ F_DMXWINFIFO, "Demux Winner FIFO" },
+		{ F_EGTOKENFIFO, "Egress Token FIFO Parity Error" },
+		{ F_EGDATAFIFO, "Egress FIFO Parity Error" },
+		{ F_UTX2TPCINTF3, "ULPTX to TPC Interface Parity Error Ch3" },
+		{ F_UTX2TPCINTF2, "ULPTX to TPC Interface Parity Error Ch2" },
+		{ F_UTX2TPCINTF1, "ULPTX to TPC Interface Parity Error Ch1" },
+		{ F_UTX2TPCINTF0, "ULPTX to TPC Interface Parity Error Ch0" },
+		{ F_LBKTOKENFIFO, "Loopback Token FIFO Parity Error" },
+		{ F_LBKDATAFIFO, "Loopback FIFO Parity Error" },
+		{ 0 }
+	};
 	static const struct intr_info tp_c_perr_cause = {
 		.name = "TP_C_PERR_CAUSE",
 		.cause_reg = A_TP_C_PERR_CAUSE,
 		.enable_reg = A_TP_C_PERR_ENABLE,
 		.fatal = 0xffffffff,
 		.flags = IHF_FATAL_IFF_ENABLED,
-		.details = NULL,
+		.details = tp_c_perr_details,
 		.actions = NULL,
 	};
+	static const struct intr_details tp_e_eg_perr_details[] = {
+		{ F_MPSLPBKTOKENFIFO, "MPS Loopback Token FIFO parity error" },
+		{ F_MPSMACTOKENFIFO, "MPS MAC Token FIFO parity error" },
+		{ F_DISPIPSECFIFO3, "Ch3 Dispatch IPSec FIFO parity error" },
+		{ F_DISPTCPFIFO3, "Ch3 Dispatch TCP FIFO parity error" },
+		{ F_DISPIPFIFO3, "Ch3 Dispatch IP FIFO parity error" },
+		{ F_DISPETHFIFO3, "Ch3 Dispatch ETH FIFO parity error" },
+		{ F_DISPGREFIFO3, "Ch3 Dispatch GRE FIFO parity error" },
+		{ F_DISPCPL5FIFO3, "Ch3 Dispatch CPL5 FIFO parity error" },
+		{ F_DISPIPSECFIFO2, "Ch2 Dispatch IPSec FIFO parity error" },
+		{ F_DISPTCPFIFO2, "Ch2 Dispatch TCP FIFO parity error" },
+		{ F_DISPIPFIFO2, "Ch2 Dispatch IP FIFO parity error" },
+		{ F_DISPETHFIFO2, "Ch2 Dispatch ETH FIFO parity error" },
+		{ F_DISPGREFIFO2, "Ch2 Dispatch GRE FIFO parity error" },
+		{ F_DISPCPL5FIFO2, "Ch2 Dispatch CPL5 FIFO parity error" },
+		{ F_DISPIPSECFIFO1, "Ch1 Dispatch IPSec FIFO parity error" },
+		{ F_DISPTCPFIFO1, "Ch1 Dispatch TCP FIFO parity error" },
+		{ F_DISPIPFIFO1, "Ch1 Dispatch IP FIFO parity error" },
+		{ F_DISPETHFIFO1, "Ch1 Dispatch ETH FIFO parity error" },
+		{ F_DISPGREFIFO1, "Ch1 Dispatch GRE FIFO parity error" },
+		{ F_DISPCPL5FIFO1, "Ch1 Dispatch CPL5 FIFO parity error" },
+		{ F_DISPIPSECFIFO0, "Ch0 Dispatch IPSec FIFO parity error" },
+		{ F_DISPTCPFIFO0, "Ch0 Dispatch TCP FIFO parity error" },
+		{ F_DISPIPFIFO0, "Ch0 Dispatch IP FIFO parity error" },
+		{ F_DISPETHFIFO0, "Ch0 Dispatch ETH FIFO parity error" },
+		{ F_DISPGREFIFO0, "Ch0 Dispatch GRE FIFO parity error" },
+		{ F_DISPCPL5FIFO0, "Ch0 Dispatch CPL5 FIFO parity error" },
+		{ 0 }
+	};
 	static const struct intr_info tp_e_eg_perr_cause = {
 		.name = "TP_E_EG_PERR_CAUSE",
 		.cause_reg = A_TP_E_EG_PERR_CAUSE,
 		.enable_reg = A_TP_E_EG_PERR_ENABLE,
 		.fatal = 0xffffffff,
 		.flags = IHF_FATAL_IFF_ENABLED,
-		.details = NULL,
+		.details = tp_e_eg_perr_details,
 		.actions = NULL,
 	};
+	static const struct intr_details tp_e_in0_perr_details[] = {
+		{ F_DMXISSFIFO, "Demux ISS FIFO parity error" },
+		{ F_DMXERRFIFO, "Demux Error FIFO parity error" },
+		{ F_DMXATTFIFO, "Demux Attributes FIFO parity error" },
+		{ F_DMXTCPFIFO, "Demux TCP Fields FIFO parity error" },
+		{ F_DMXMPAFIFO, "Demux MPA FIFO parity error" },
+		{ F_DMXOPTFIFO, "Demux TCP Options FIFO parity error" },
+		{ F_INGTOKENFIFO, "Demux Ingress Token FIFO parity error" },
+		{ F_DMXPLDCHKOVFL1, "Ch1 PLD TxCheck FIFO Overflow" },
+		{ F_DMXPLDCHKFIFO1, "Ch1 PLD TxCheck FIFO parity error" },
+		{ F_DMXOPTFIFO1, "Ch1 Options buffer parity error" },
+		{ F_DMXMPAFIFO1, "Ch1 MPA FIFO parity error" },
+		{ F_DMXDBFIFO1, "Ch1 DB FIFO parity error" },
+		{ F_DMXATTFIFO1, "Ch1 Attribute FIFO parity error" },
+		{ F_DMXISSFIFO1, "Ch1 ISS FIFO parity error" },
+		{ F_DMXTCPFIFO1, "Ch1 TCP Fields FIFO parity error" },
+		{ F_DMXERRFIFO1, "Ch1 Error FIFO parity error" },
+		{ F_MPS2TPINTF1, "Ch1 MPS2TP Interface parity error" },
+		{ F_DMXPLDCHKOVFL0, "Ch0 PLD TxCheck FIFO Overflow" },
+		{ F_DMXPLDCHKFIFO0, "Ch0 PLD TxCheck FIFO parity error" },
+		{ F_DMXOPTFIFO0, "Ch0 Options buffer parity error" },
+		{ F_DMXMPAFIFO0, "Ch0 MPA FIFO parity error" },
+		{ F_DMXDBFIFO0, "Ch0 DB FIFO parity error" },
+		{ F_DMXATTFIFO0, "Ch0 Attribute FIFO parity error" },
+		{ F_DMXISSFIFO0, "Ch0 ISS FIFO parity error" },
+		{ F_DMXTCPFIFO0, "Ch0 TCP Fields FIFO parity error" },
+		{ F_DMXERRFIFO0, "Ch0 Error FIFO parity error" },
+		{ F_MPS2TPINTF0, "Ch0 MPS2TP Interface parity error" },
+		{ 0 }
+	};
 	static const struct intr_info tp_e_in0_perr_cause = {
 		.name = "TP_E_IN0_PERR_CAUSE",
 		.cause_reg = A_TP_E_IN0_PERR_CAUSE,
 		.enable_reg = A_TP_E_IN0_PERR_ENABLE,
 		.fatal = 0xffffffff,
 		.flags = IHF_FATAL_IFF_ENABLED,
-		.details = NULL,
+		.details = tp_e_in0_perr_details,
 		.actions = NULL,
 	};
+	static const struct intr_details tp_e_in1_perr_details[] = {
+		{ F_DMXPLDCHKOVFL3, "Ch3 PLD TxCheck FIFO Overflow" },
+		{ F_DMXPLDCHKFIFO3, "Ch3 PLD TxCheck FIFO parity error" },
+		{ F_DMXOPTFIFO3, "Ch3 Options buffer parity error" },
+		{ F_DMXMPAFIFO3, "Ch3 MPA FIFO parity error" },
+		{ F_DMXDBFIFO3, "Ch3 DB FIFO parity error" },
+		{ F_DMXATTFIFO3, "Ch3 Attribute FIFO parity error" },
+		{ F_DMXISSFIFO3, "Ch3 ISS FIFO parity error" },
+		{ F_DMXTCPFIFO3, "Ch3 TCP Fields FIFO parity error" },
+		{ F_DMXERRFIFO3, "Ch3 Error FIFO parity error" },
+		{ F_MPS2TPINTF3, "Ch3 MPS2TP Interface parity error" },
+		{ F_DMXPLDCHKOVFL2, "Ch2 PLD TxCheck FIFO Overflow" },
+		{ F_DMXPLDCHKFIFO2, "Ch2 PLD TxCheck FIFO parity error" },
+		{ F_DMXOPTFIFO2, "Ch2 Options buffer parity error" },
+		{ F_DMXMPAFIFO2, "Ch2 MPA FIFO parity error" },
+		{ F_DMXDBFIFO2, "Ch2 DB FIFO parity error" },
+		{ F_DMXATTFIFO2, "Ch2 Attribute FIFO parity error" },
+		{ F_DMXISSFIFO2, "Ch2 ISS FIFO parity error" },
+		{ F_DMXTCPFIFO2, "Ch2 TCP Fields FIFO parity error" },
+		{ F_DMXERRFIFO2, "Ch2 Error FIFO parity error" },
+		{ F_MPS2TPINTF2, "Ch2 MPS2TP Interface parity error" },
+		{ 0 }
+	};
 	static const struct intr_info tp_e_in1_perr_cause = {
 		.name = "TP_E_IN1_PERR_CAUSE",
 		.cause_reg = A_TP_E_IN1_PERR_CAUSE,
 		.enable_reg = A_TP_E_IN1_PERR_ENABLE,
 		.fatal = 0xffffffff,
 		.flags = IHF_FATAL_IFF_ENABLED,
-		.details = NULL,
+		.details = tp_e_in1_perr_details,
 		.actions = NULL,
 	};
+	static const struct intr_details tp_other_perr_details[] = {
+		{ F_DMARBTPERR, "DMARBT MA Rsp Interface parity Error" },
+		{ F_MMGRCACHEDATASRAM, "TP MMGR Cache Data SRAM" },
+		{ F_MMGRCACHETAGFIFO, "TP MMGR Cache Tag FIFO" },
+		{ F_DBL2TLUTPERR, "TP DB Lookup Table" },
+		{ F_DBTXTIDPERR, "TP DB FIFOs" },
+		{ F_DBEXTPERR, "TP DB Extended Opcode FIFO" },
+		{ F_DBOPPERR, "TP DB Opcode FIFO" },
+		{ F_TMCACHEPERR, "TP TM Cache SRAM" },
+		{ F_TPPROTOSRAM, "TP Protocol SRAM" },
+		{ F_HSPSRAM, "HighSpeed SRAM" },
+		{ F_RATEGRPSRAM, "Rate Group SRAM" },
+		{ F_TXFBSEQFIFO, "Tx Feedback Sequence Number FIFO" },
+		{ F_CMDATASRAM, "Cache Data SRAM" },
+		{ F_CMTAGFIFO, "Cache Tag FIFO" },
+		{ F_RFCOPFIFO, "RCF Opcode FIFO" },
+		{ F_DELINVFIFO, "Delete Invalid FIFO" },
+		{ F_RSSCFGSRAM, "RSS Config or Round-Robin SRAM" },
+		{ F_RSSKEYSRAM, "RSS Key SRAM" },
+		{ F_RSSLKPSRAM, "RSS Lookup SRAM" },
+		{ F_SRQSRAM, "SRQ SRAM" },
+		{ F_ARPDASRAM, "ARP DA SRAM" },
+		{ F_ARPSASRAM, "ARP SA SRAM" },
+		{ F_ARPGRESRAM, "ARP GRE SRAM" },
+		{ F_ARPIPSECSRAM1, "ARP IPSec SRAM0" },
+		{ F_ARPIPSECSRAM0, "ARP IPSec SRAM1" },
+		{ 0 }
+	};
 	static const struct intr_info tp_o_perr_cause = {
 		.name = "TP_O_PERR_CAUSE",
 		.cause_reg = A_TP_O_PERR_CAUSE,
 		.enable_reg = A_TP_O_PERR_ENABLE,
 		.fatal = 0xffffffff,
 		.flags = IHF_FATAL_IFF_ENABLED,
-		.details = NULL,
+		.details = tp_other_perr_details,
 		.actions = NULL,
 	};
 	bool fatal;
 
-	fatal = t4_handle_intr(adap, &tp_intr_info, 0, flags);
 	if (chip_id(adap) > CHELSIO_T6) {
-		fatal |= t4_handle_intr(adap, &tp_inic_perr_cause, 0, flags);
+		tp_intr_info.details = t7_tp_intr_details;
+		fatal = t4_handle_intr(adap, &tp_intr_info, 0, flags);
+		fatal |= t4_handle_intr(adap, &tp_cerr_cause, 0, flags);
 		fatal |= t4_handle_intr(adap, &tp_c_perr_cause, 0, flags);
 		fatal |= t4_handle_intr(adap, &tp_e_eg_perr_cause, 0, flags);
 		fatal |= t4_handle_intr(adap, &tp_e_in0_perr_cause, 0, flags);
 		fatal |= t4_handle_intr(adap, &tp_e_in1_perr_cause, 0, flags);
 		fatal |= t4_handle_intr(adap, &tp_o_perr_cause, 0, flags);
+	} else {
+		tp_intr_info.details = tp_intr_details;
+		fatal = t4_handle_intr(adap, &tp_intr_info, 0, flags);
 	}
+	clear_int_cause_reg(adap, &tp_intr_info, flags);
 
 	return (fatal);
 }
@@ -5133,16 +5362,86 @@ static bool tp_intr_handler(struct adapter *adap, int arg, int flags)
  */
 static bool sge_intr_handler(struct adapter *adap, int arg, int flags)
 {
+	static const struct intr_details sge_int1_details[] = {
+		{ F_PERR_FLM_CREDITFIFO, "SGE FLM credit FIFO parity error" },
+		{ F_PERR_IMSG_HINT_FIFO, "SGE IMSG hint FIFO parity error" },
+		{ F_PERR_HEADERSPLIT_FIFO3 | F_PERR_HEADERSPLIT_FIFO2,
+			"SGE header split FIFO parity error" },
+		{ F_PERR_PAYLOAD_FIFO3 | F_PERR_PAYLOAD_FIFO2,
+			"SGE payload FIFO parity error" },
+		{ F_PERR_PC_RSP, "SGE PC response parity error" },
+		{ F_PERR_PC_REQ, "SGE PC request parity error" },
+		{ 0x003c0000, "SGE DBP PC response FIFO parity error" },
+		{ F_PERR_DMARBT, "SGE DMA RBT parity error" },
+		{ F_PERR_FLM_DBPFIFO, "SGE FLM DBP FIFO parity error" },
+		{ F_PERR_FLM_MCREQ_FIFO, "SGE FLM MC request FIFO parity error" },
+		{ F_PERR_FLM_HINTFIFO, "SGE FLM hint FIFO parity error" },
+		{ 0x00003c00, "SGE align control FIFO parity error" },
+		{ 0x000003c0, "SGE EDMA FIFO parity error" },
+		{ 0x0000003c, "SGE PD FIFO parity error" },
+		{ F_PERR_ING_CTXT_MIFRSP, "SGE Ingress context MIF response parity error" },
+		{ F_PERR_EGR_CTXT_MIFRSP, "SGE Egress context MIF response parity error" },
+		{ 0 }
+	};
 	static const struct intr_info sge_int1_info = {
 		.name = "SGE_INT_CAUSE1",
 		.cause_reg = A_SGE_INT_CAUSE1,
 		.enable_reg = A_SGE_INT_ENABLE1,
 		.fatal = 0xffffffff,
 		.flags = IHF_FATAL_IFF_ENABLED,
-		.details = NULL,
+		.details = sge_int1_details,
 		.actions = NULL,
 	};
-	static const struct intr_info sge_int2_info = {
+	static const struct intr_details t7_sge_int2_details[] = {
+		{ F_TF_FIFO_PERR, "SGE TF FIFO parity error" },
+		{ F_PERR_EGR_DBP_TX_COAL, "SGE egress DBP TX coal parity error" },
+		{ F_PERR_DBP_FL_FIFO, "SGE DBP FL FIFO parity error" },
+		{ F_DEQ_LL_PERR, "SGE linked list SRAM parity error" },
+		{ F_ENQ_PERR, "SGE enq tag SRAM parity error" },
+		{ F_DEQ_OUT_PERR, "SGE tbuf deq output FIFO parity error" },
+		{ F_BUF_PERR, "SGE tbuf main buffer parity error" },
+		{ F_PERR_CONM_SRAM, "SGE CONM SRAM parity error" },
+		{ F_PERR_ISW_IDMA3_FIFO | F_PERR_ISW_IDMA2_FIFO |
+		  F_PERR_ISW_IDMA1_FIFO | F_PERR_ISW_IDMA0_FIFO,
+		  "SGE ISW IDMA FIFO parity error" },
+		{ F_PERR_ISW_DBP_FIFO, "SGE ISW DBP FIFO parity error" },
+		{ F_PERR_ISW_GTS_FIFO, "SGE ISW GTS FIFO parity error" },
+		{ F_PERR_ITP_EVR, "SGE ITP EVR parity error" },
+		{ F_PERR_FLM_CNTXMEM, "SGE FLM context memory parity error" },
+		{ F_PERR_FLM_L1CACHE, "SGE FLM L1 cache parity error" },
+		{ F_SGE_IPP_FIFO_PERR, "SGE IPP FIFO parity error" },
+		{ F_PERR_DBP_HP_FIFO, "SGE DBP HP FIFO parity error" },
+		{ F_PERR_DB_FIFO, "SGE doorbell FIFO parity error" },
+		{ F_PERR_ING_CTXT_CACHE | F_PERR_EGR_CTXT_CACHE,
+		  "SGE context cache parity error" },
+		{ F_PERR_BASE_SIZE, "SGE base size parity error" },
+		{ 0 }
+	};
+	static const struct intr_details t6_sge_int2_details[] = {
+		{ F_PERR_DBP_HINT_FL_FIFO, "SGE DBP hint FL FIFO parity error" },
+		{ F_PERR_EGR_DBP_TX_COAL, "SGE egress DBP TX coal parity error" },
+		{ F_PERR_DBP_FL_FIFO, "SGE DBP FL FIFO parity error" },
+		{ F_DEQ_LL_PERR, "SGE tbuf dequeue linked list SRAM parity error" },
+		{ F_ENQ_PERR, "SGE tbuf enqueue tag SRAM parity error" },
+		{ F_DEQ_OUT_PERR, "SGE tbuf dequeue output FIFO parity error" },
+		{ F_BUF_PERR, "SGE tbuf main buffer parity error" },
+		{ F_PERR_CONM_SRAM, "SGE CONM SRAM parity error" },
+		{ F_PERR_ISW_IDMA1_FIFO, "SGE ISW IDMA FIFO parity error" },
+		{ F_PERR_ISW_IDMA0_FIFO, "SGE ISW IDMA FIFO parity error" },
+		{ F_PERR_ISW_DBP_FIFO, "SGE ISW DBP FIFO parity error" },
+		{ F_PERR_ISW_GTS_FIFO, "SGE ISW GTS FIFO parity error" },
+		{ F_PERR_ITP_EVR, "SGE ITP EVR parity error" },
+		{ F_PERR_FLM_CNTXMEM, "SGE FLM context memory parity error" },
+		{ F_PERR_FLM_L1CACHE, "SGE FLM L1 cache parity error" },
+		{ F_PERR_DBP_HINT_FIFO, "SGE DBP hint FIFO parity error" },
+		{ F_PERR_DBP_HP_FIFO, "SGE DBP high priority FIFO parity error" },
+		{ F_PERR_DB_FIFO, "SGE DBP merge DB FIFO parity error" },
+		{ F_PERR_ING_CTXT_CACHE, "SGE ingress context cache parity error" },
+		{ F_PERR_EGR_CTXT_CACHE, "SGE egress context cache parity error" },
+		{ F_PERR_BASE_SIZE, "SGE base size parity error" },
+		{ 0 }
+	};
+	struct intr_info sge_int2_info = {
 		.name = "SGE_INT_CAUSE2",
 		.cause_reg = A_SGE_INT_CAUSE2,
 		.enable_reg = A_SGE_INT_ENABLE2,
@@ -5231,16 +5530,105 @@ static bool sge_intr_handler(struct adapter *adap, int arg, int flags)
 		.details = NULL,
 		.actions = NULL,
 	};
+	static const struct intr_details sge_int4_details[] = {
+		{ F_ERR_ISHIFT_UR1 | F_ERR_ISHIFT_UR0, "SGE ishift underrun" },
+		{ F_BAR2_EGRESS_LEN_OR_ADDR_ERR, "SGE BAR2 PL access length or alignment error" },
+		{ F_ERR_CPL_EXCEED_MAX_IQE_SIZE1 | F_ERR_CPL_EXCEED_MAX_IQE_SIZE0,
+		  "SGE CPL exceeds max IQE size" },
+		{ F_ERR_WR_LEN_TOO_LARGE3 | F_ERR_WR_LEN_TOO_LARGE2 |
+		  F_ERR_WR_LEN_TOO_LARGE1 | F_ERR_WR_LEN_TOO_LARGE0,
+		  "SGE WR length too large" },
+		{ F_ERR_LARGE_MINFETCH_WITH_TXCOAL3 | F_ERR_LARGE_MINFETCH_WITH_TXCOAL2 |
+		  F_ERR_LARGE_MINFETCH_WITH_TXCOAL1 | F_ERR_LARGE_MINFETCH_WITH_TXCOAL0,
+		  "SGE invalid MinFetchBurst with TxCoalesce" },
+		{ F_COAL_WITH_HP_DISABLE_ERR, "SGE coalesce with HP disable error" },
+		{ F_BAR2_EGRESS_COAL0_ERR, "SGE BAR2 PL access addr offset 0" },
+		{ F_BAR2_EGRESS_SIZE_ERR, "SGE BAR2 illegal egress QID access" },
+		{ F_FLM_PC_RSP_ERR, "SGE FLM PC response error" },
+		{ F_ERR_TH3_MAX_FETCH | F_ERR_TH2_MAX_FETCH |
+		  F_ERR_TH1_MAX_FETCH | F_ERR_TH0_MAX_FETCH,
+		  "SGE max fetch violation" },
+		{ F_ERR_RX_CPL_PACKET_SIZE1 | F_ERR_RX_CPL_PACKET_SIZE0,
+		  "SGE CPL length mismatch error" },
+		{ F_ERR_BAD_UPFL_INC_CREDIT3 | F_ERR_BAD_UPFL_INC_CREDIT2 |
+		  F_ERR_BAD_UPFL_INC_CREDIT1 | F_ERR_BAD_UPFL_INC_CREDIT0,
+		  "SGE upfl credit wrap error" },
+		{ F_ERR_PHYSADDR_LEN0_IDMA1 | F_ERR_PHYSADDR_LEN0_IDMA0,
+		  "SGE CPL_RX_PHYS_ADDR length 0 error" },
+		{ F_ERR_FLM_INVALID_PKT_DROP1 | F_ERR_FLM_INVALID_PKT_DROP0,
+		  "SGE IDMA packet drop due to invalid FLM context" },
+		{ F_ERR_UNEXPECTED_TIMER, "SGE unexpected timer error" },
+		{ 0 }
+	};
 	static const struct intr_info sge_int4_info = {
 		.name = "SGE_INT_CAUSE4",
 		.cause_reg = A_SGE_INT_CAUSE4,
 		.enable_reg = A_SGE_INT_ENABLE4,
 		.fatal = 0,
 		.flags = 0,
-		.details = NULL,
+		.details = sge_int4_details,
 		.actions = NULL,
 	};
-	static const struct intr_info sge_int5_info = {
+	static const struct intr_details t7_sge_int5_details[] = {
+		{ F_ERR_T_RXCRC, "SGE RxCRC error" },
+		{ F_PERR_MC_RSPDATA, "SGE MC response data parity error" },
+		{ F_PERR_PC_RSPDATA, "SGE PC response data parity error" },
+		{ F_PERR_PD_RDRSPDATA, "SGE PD read response data parity error" },
+		{ F_PERR_U_RXDATA, "SGE U Rx data parity error" },
+		{ F_PERR_UD_RXDATA, "SGE UD Rx data parity error" },
+		{ F_PERR_UP_DATA, "SGE uP data parity error" },
+		{ F_PERR_CIM2SGE_RXDATA, "SGE CIM2SGE Rx data parity error" },
+		{ F_PERR_IMSG_PD_FIFO, "SGE IMSG PD FIFO parity error" },
+		{ F_PERR_ULPTX_FIFO1 | F_PERR_ULPTX_FIFO0, "SGE ULPTX FIFO parity error" },
+		{ F_PERR_IDMA2IMSG_FIFO3 | F_PERR_IDMA2IMSG_FIFO2 |
+		  F_PERR_IDMA2IMSG_FIFO1 | F_PERR_IDMA2IMSG_FIFO0,
+		  "SGE IDMA2IMSG FIFO parity error" },
+		{ F_PERR_POINTER_DATA_FIFO3 | F_PERR_POINTER_DATA_FIFO2 |
+		  F_PERR_POINTER_DATA_FIFO1 | F_PERR_POINTER_DATA_FIFO0,
+		  "SGE pointer data FIFO parity error" },
+		{ F_PERR_POINTER_HDR_FIFO3 | F_PERR_POINTER_HDR_FIFO2 |
+		  F_PERR_POINTER_HDR_FIFO1 | F_PERR_POINTER_HDR_FIFO0,
+		  "SGE pointer header FIFO parity error" },
+		{ F_PERR_PAYLOAD_FIFO1 | F_PERR_PAYLOAD_FIFO0,
+		  "SGE payload FIFO parity error" },
+		{ F_PERR_MGT_BAR2_FIFO, "SGE MGT BAR2 FIFO parity error" },
+		{ F_PERR_HEADERSPLIT_FIFO1 | F_PERR_HEADERSPLIT_FIFO0,
+		  "SGE header split FIFO parity error" },
+		{ F_PERR_HINT_DELAY_FIFO, "SGE hint delay FIFO parity error" },
+		{ 0 }
+	};
+	static const struct intr_details t6_sge_int5_details[] = {
+		{ F_ERR_T_RXCRC, "SGE T RxCRC parity error" },
+		{ F_PERR_MC_RSPDATA, "SGE MC response data parity error" },
+		{ F_PERR_PC_RSPDATA, "SGE PC response data parity error" },
+		{ F_PERR_U_RXDATA | F_PERR_UD_RXDATA, "SGE ULP Rx data parity error" },
+		{ F_PERR_UP_DATA, "SGE uP data parity error" },
+		{ F_PERR_CIM2SGE_RXDATA, "SGE CIM2SGE Rx data parity error" },
+		{ F_PERR_HINT_DELAY_FIFO1 | F_PERR_HINT_DELAY_FIFO0,
+		  "SGE hint delay FIFO parity error" },
+		{ F_PERR_IMSG_PD_FIFO, "SGE IMSG PD FIFO parity error" },
+		{ F_PERR_ULPTX_FIFO1 | F_PERR_ULPTX_FIFO0,
+		  "SGE ULPTX FIFO parity error" },
+		{ F_PERR_IDMA2IMSG_FIFO1 | F_PERR_IDMA2IMSG_FIFO0,
+		  "SGE IDMA2IMSG FIFO parity error" },
+		{ F_PERR_POINTER_DATA_FIFO1 | F_PERR_POINTER_DATA_FIFO0,
+		  "SGE pointer data FIFO parity error" },
+		{ F_PERR_POINTER_HDR_FIFO1 | F_PERR_POINTER_HDR_FIFO0,
+		  "SGE pointer header FIFO parity error" },
+		{ F_PERR_PAYLOAD_FIFO1 | F_PERR_PAYLOAD_FIFO0,
+		  "SGE payload FIFO parity error" },
+		{ F_PERR_EDMA_INPUT_FIFO3 | F_PERR_EDMA_INPUT_FIFO2 |
+		  F_PERR_EDMA_INPUT_FIFO1 | F_PERR_EDMA_INPUT_FIFO0,
+		  "SGE EDMA input FIFO parity error" },
+		{ F_PERR_MGT_BAR2_FIFO, "SGE MGT BAR2 FIFO parity error" },
+		{ F_PERR_HEADERSPLIT_FIFO1 | F_PERR_HEADERSPLIT_FIFO0,
+		  "SGE header split FIFO parity error" },
+		{ F_PERR_CIM_FIFO1 | F_PERR_CIM_FIFO0, "SGE CIM FIFO parity error" },
+		{ F_PERR_IDMA_SWITCH_OUTPUT_FIFO1 | F_PERR_IDMA_SWITCH_OUTPUT_FIFO0,
+		  "SGE IDMA switch output FIFO parity error" },
+		{ 0 }
+	};
+	struct intr_info sge_int5_info = {
 		.name = "SGE_INT_CAUSE5",
 		.cause_reg = A_SGE_INT_CAUSE5,
 		.enable_reg = A_SGE_INT_ENABLE5,
@@ -5249,31 +5637,94 @@ static bool sge_intr_handler(struct adapter *adap, int arg, int flags)
 		.details = NULL,
 		.actions = NULL,
 	};
+	static const struct intr_details sge_int6_details[] = {
+		/* T7+ */
+		{ 0xe0000000, "SGE fatal DEQ0 DRDY error" },
+		{ 0x1c000000, "SGE fatal OUT0 DRDY error" },
+		{ F_IMSG_DBG3_STUCK | F_IMSG_DBG2_STUCK |
+		  F_IMSG_DBG1_STUCK | F_IMSG_DBG0_STUCK,
+		  "SGE IMSG stuck due to insufficient credits" },
+		/* T6 + */
+		{ F_ERR_DB_SYNC, "SGE doorbell sync failed" },
+		{ F_ERR_GTS_SYNC, "SGE GTS sync failed" },
+		{ F_FATAL_LARGE_COAL, "SGE BAR2 payload too large" },
+		{ F_PL_BAR2_FRM_ERR, "SGE BAR2 framing error" },
+		{ F_SILENT_DROP_TX_COAL, "SGE silent drop of Tx coal WR" },
+		{ F_ERR_INV_CTXT4, "SGE context access for invalid queue thread 4" },
+		{ F_ERR_BAD_DB_PIDX4, "SGE doorbell pidx too large thread 4" },
+		{ F_ERR_BAD_UPFL_INC_CREDIT4, "SGE upfl credit wrap thread 4" },
+		{ F_FATAL_TAG_MISMATCH, "SGE doorbell tag mismatch" },
+		{ F_FATAL_ENQ_CTL_RDY, "SGE enq_ctl_fifo overflow" },
+		{ F_ERR_PC_RSP_LEN3 | F_ERR_PC_RSP_LEN2 |
+		  F_ERR_PC_RSP_LEN1 | F_ERR_PC_RSP_LEN0,
+		  "SGE PCIe response error for DBP threads" },
+		{ F_FATAL_ENQ2LL_VLD, "SGE tbuf fatal_enq2ll_vld" },
+		{ F_FATAL_LL_EMPTY, "SGE tbuf fatal_ll_empty" },
+		{ F_FATAL_OFF_WDENQ, "SGE tbuf fatal_off_wdenq" },
+		{ 0x00000018, "SGE tbuf fatal_deq1_drdy" },
+		{ 0x00000006, "SGE tbuf fatal_out1_drdy" },
+		{ F_FATAL_DEQ, "SGE tbuf fatal_deq" },
+		{ 0 }
+	};
 	static const struct intr_info sge_int6_info = {
 		.name = "SGE_INT_CAUSE6",
 		.cause_reg = A_SGE_INT_CAUSE6,
 		.enable_reg = A_SGE_INT_ENABLE6,
 		.fatal = 0,
 		.flags = 0,
-		.details = NULL,
+		.details = sge_int6_details,
 		.actions = NULL,
 	};
+	static const struct intr_details sge_int7_details[] = {
+		{ F_HINT_FIFO_FULL, "SGE hint FIFO full" },
+		{ F_CERR_HINT_DELAY_FIFO, "SGE hint delay FIFO ECC error" },
+		{ F_COAL_TIMER_FIFO_PERR, "SGE coalescing timer FIFO parity error" },
+		{ F_CMP_FIFO_PERR, "SGE CMP FIFO parity error" },
+		{ F_SGE_IPP_FIFO_CERR, "SGE IPP FIFO ECC error" },
+		{ F_CERR_ING_CTXT_CACHE | F_CERR_EGR_CTXT_CACHE,
+		  "SGE context cache ECC error" },
+		{ F_IMSG_CNTX_PERR, "SGE IMSG context parity error" },
+		{ F_PD_FIFO_PERR, "SGE PD FIFO parity error" },
+		{ F_IMSG_512_FIFO_PERR, "SGE IMSG 512 FIFO parity error" },
+		{ F_CPLSW_FIFO_PERR, "SGE CPLSW FIFO parity error" },
+		{ F_IMSG_FIFO_PERR, "SGE IMSG FIFO parity error" },
+		{ F_CERR_ITP_EVR, "SGE ITP EVR ECC error" },
+		{ F_CERR_CONM_SRAM, "SGE CONM SRAM ECC error" },
+		{ F_CERR_FLM_CNTXMEM, "SGE FLM context memory ECC error" },
+		{ F_CERR_FUNC_QBASE, "SGE function queue base ECC error" },
+		{ F_IMSG_CNTX_CERR, "SGE IMSG context ECC error" },
+		{ F_PD_FIFO_CERR, "SGE PD FIFO ECC error" },
+		{ F_IMSG_512_FIFO_CERR, "SGE IMSG 512 FIFO ECC error" },
+		{ F_CPLSW_FIFO_CERR, "SGE CPLSW FIFO ECC error" },
+		{ F_IMSG_FIFO_CERR, "SGE IMSG FIFO ECC error" },
+		{ 0x0000001e, "SGE header split FIFO ECC error" }, // Bits 4:1
+		{ F_CERR_FLM_L1CACHE, "SGE FLM L1 cache ECC error" },
+		{ 0 }
+	};
 	static const struct intr_info sge_int7_info = {
 		.name = "SGE_INT_CAUSE7",
 		.cause_reg = A_SGE_INT_CAUSE7,
 		.enable_reg = A_SGE_INT_ENABLE7,
 		.fatal = 0,
 		.flags = 0,
-		.details = NULL,
+		.details = sge_int7_details,
 		.actions = NULL,
 	};
+	static const struct intr_details sge_int8_details[] = {
+		{ F_TRACE_RXPERR, "SGE trace packet parity error" },
+		{ F_U3_RXPERR | F_U2_RXPERR | F_U1_RXPERR | F_U0_RXPERR,
+		  "SGE ULP interface parity error" },
+		{ F_T3_RXPERR | F_T2_RXPERR | F_T1_RXPERR | F_T0_RXPERR,
+		  "SGE TP interface parity error" },
+		{ 0 }
+	};
 	static const struct intr_info sge_int8_info = {
 		.name = "SGE_INT_CAUSE8",
 		.cause_reg = A_SGE_INT_CAUSE8,
 		.enable_reg = A_SGE_INT_ENABLE8,
 		.fatal = 0,
 		.flags = 0,
-		.details = NULL,
+		.details = sge_int8_details,
 		.actions = NULL,
 	};
 	bool fatal;
@@ -5281,8 +5732,14 @@ static bool sge_intr_handler(struct adapter *adap, int arg, int flags)
 
 	if (chip_id(adap) <= CHELSIO_T5) {
 		sge_int3_info.details = sge_int3_details;
+	} else if (chip_id(adap) == CHELSIO_T6) {
+		sge_int3_info.details = t6_sge_int3_details;
+		sge_int2_info.details = t6_sge_int2_details;
+		sge_int5_info.details = t6_sge_int5_details;
 	} else {
 		sge_int3_info.details = t6_sge_int3_details;
+		sge_int2_info.details = t7_sge_int2_details;
+		sge_int5_info.details = t7_sge_int5_details;
 	}
 
 	fatal = false;
@@ -5316,6 +5773,19 @@ static bool sge_intr_handler(struct adapter *adap, int arg, int flags)
  */
 static bool cim_intr_handler(struct adapter *adap, int arg, int flags)
 {
+	static const struct intr_details cim_host_t7_intr_details[] = {
+		{ F_CORE7ACCINT, "CIM slave core 7 access interrupt "},
+		{ F_CORE6ACCINT, "CIM slave core 6 access interrupt "},
+		{ F_CORE5ACCINT, "CIM slave core 5 access interrupt "},
+		{ F_CORE4ACCINT, "CIM slave core 4 access interrupt "},
+		{ F_CORE3ACCINT, "CIM slave core 3 access interrupt "},
+		{ F_CORE2ACCINT, "CIM slave core 2 access interrupt "},
+		{ F_CORE1ACCINT, "CIM slave core 1 access interrupt "},
+		{ F_TIMER1INT, "CIM TIMER0 interrupt" },
+		{ F_TIMER0INT, "CIM TIMER0 interrupt" },
+		{ F_PREFDROPINT, "CIM control register prefetch drop" },
+		{ 0}
+	};
 	static const struct intr_details cim_host_intr_details[] = {
 		/* T6+ */
 		{ F_PCIE2CIMINTFPARERR, "CIM IBQ PCIe interface parity error" },
@@ -5328,8 +5798,8 @@ static bool cim_intr_handler(struct adapter *adap, int arg, int flags)
 		{ F_SGE2CIMINTFPARERR, "CIM IBQ SGE interface parity error" },
 		{ F_ULP2CIMINTFPARERR, "CIM IBQ ULP_TX interface parity error" },
 		{ F_TP2CIMINTFPARERR, "CIM IBQ TP interface parity error" },
-		{ F_OBQSGERX1PARERR, "CIM OBQ SGE1_RX parity error" },
-		{ F_OBQSGERX0PARERR, "CIM OBQ SGE0_RX parity error" },
+		{ F_OBQSGERX1PARERR, "CIM OBQ PCIE_RX parity error" },
+		{ F_OBQSGERX0PARERR, "CIM OBQ SGE_RX parity error" },
 
 		/* T4+ */
 		{ F_TIEQOUTPARERRINT, "CIM TIEQ outgoing FIFO parity error" },
@@ -5354,16 +5824,17 @@ static bool cim_intr_handler(struct adapter *adap, int arg, int flags)
 		{ F_PREFDROPINT, "CIM control register prefetch drop" },
 		{ 0}
 	};
-	static const struct intr_info cim_host_intr_info = {
+	struct intr_info cim_host_intr_info = {
 		.name = "CIM_HOST_INT_CAUSE",
 		.cause_reg = A_CIM_HOST_INT_CAUSE,
 		.enable_reg = A_CIM_HOST_INT_ENABLE,
 		.fatal = 0x007fffe6,
 		.flags = IHF_FATAL_IFF_ENABLED,
-		.details = cim_host_intr_details,
+		.details = NULL,
 		.actions = NULL,
 	};
 	static const struct intr_details cim_host_upacc_intr_details[] = {
+		{ F_CONWRERRINT, "CIM condition write error "},
 		{ F_EEPROMWRINT, "CIM EEPROM came out of busy state" },
 		{ F_TIMEOUTMAINT, "CIM PIF MA timeout" },
 		{ F_TIMEOUTINT, "CIM PIF timeout" },
@@ -5423,18 +5894,54 @@ static bool cim_intr_handler(struct adapter *adap, int arg, int flags)
 		.details = NULL,
 		.actions = NULL,
 	};
+	static const struct intr_details cim_perr_cause_details[] = {
+		{ F_T7_MA_CIM_INTFPERR, "MA2CIM interface parity error" },
+		{ F_T7_MBHOSTPARERR, "Mailbox Host Read parity error" },
+		{ F_MAARBINVRSPTAG, "MA Arbiter Invalid Response Tag (Fatal)" },
+		{ F_MAARBFIFOPARERR, "MA Arbiter FIFO Parity Error" },
+		{ F_SEMSRAMPARERR, "Semaphore logic SRAM Parity Error" },
+		{ F_RSACPARERR, "RSA Code SRAM Parity Error" },
+		{ F_RSADPARERR, "RSA Data SRAM Parity Error" },
+		{ F_T7_PLCIM_MSTRSPDATAPARERR, "PL2CIM Master response data parity error" },
+		{ F_T7_PCIE2CIMINTFPARERR, "IBQ PCIE intf parity error" },
+		{ F_T7_NCSI2CIMINTFPARERR, "IBQ NCSI intf parity error" },
+		{ F_T7_SGE2CIMINTFPARERR, "IBQ SGE Intf Parity error" },
+		{ F_T7_ULP2CIMINTFPARERR, "IBQ ULP_TX intf parity error" },
+		{ F_T7_TP2CIMINTFPARERR, "IBQ TP intf parity error" },
+		{ F_CORE7PARERR, "Slave Core7 parity error" },
+		{ F_CORE6PARERR, "Slave Core6 parity error" },
+		{ F_CORE5PARERR, "Slave Core5 parity error" },
+		{ F_CORE4PARERR, "Slave Core4 parity error" },
+		{ F_CORE3PARERR, "Slave Core3 parity error" },
+		{ F_CORE2PARERR, "Slave Core2 parity error" },
+		{ F_CORE1PARERR, "Slave Core1 parity error" },
+		{ F_GFTPARERR, "GFT block Memory parity error" },
+		{ F_MPSRSPDATAPARERR, "MPS lookup interface Response parity error" },
+		{ F_ER_RSPDATAPARERR, "Expansion ROM/Flash Interface Response Parity Error" },
+		{ F_FLOWFIFOPARERR, "SGE FlowID Prefetch FIFO Parity Error" },
+		{ F_OBQSRAMPARERR, "OBQ SRAM Parity Error" },
+		{ F_TIEQOUTPARERR, "TIE Queue Outgoing FIFO parity error" },
+		{ F_TIEQINPARERR, "TIE Queue Incoming FIFO parity error" },
+		{ F_PIFRSPPARERR, "PIF Response interface FIFO Parity error" },
+		{ F_PIFREQPARERR, "PIF Request interface FIFO Parity error" },
+		{ 0 }
+	};
 	static const struct intr_info cim_perr_cause = {
 		.name = "CIM_PERR_CAUSE",
 		.cause_reg = A_CIM_PERR_CAUSE,
 		.enable_reg = A_CIM_PERR_ENABLE,
 		.fatal = 0xffffffff,
 		.flags = IHF_FATAL_IFF_ENABLED,
-		.details = NULL,
+		.details = cim_perr_cause_details,
 		.actions = NULL,
 	};
 	u32 val, fw_err;
 	bool fatal;
 
+	if (chip_id(adap) >= CHELSIO_T7)
+		cim_host_intr_info.details = cim_host_t7_intr_details;
+	else
+		cim_host_intr_info.details = cim_host_intr_details;
 	/*
 	 * When the Firmware detects an internal error which normally wouldn't
 	 * raise a Host Interrupt, it forces a CIM Timer0 interrupt in order
@@ -5477,62 +5984,237 @@ static bool ulprx_intr_handler(struct adapter *adap, int arg, int flags)
 		{ 0x007fffff, "ULPRX parity error" },
 		{ 0 }
 	};
-	static const struct intr_info ulprx_intr_info = {
+	static const struct intr_details t6_ulprx_int_cause_details[] = {
+		{ F_SE_CNT_MISMATCH_1, "SE count mismatch in channel1" },
+		{ F_SE_CNT_MISMATCH_0, "SE count mismatch in channel 0" },
+		{ F_CAUSE_CTX_1, "Context access error on channel 1" },
+		{ F_CAUSE_CTX_0, "Context access error on channel 0" },
+		{ F_CAUSE_FF, "filp-flop based fifos" },
+		{ F_CAUSE_APF_1, "Arb prefetch memory, channel 1" },
+		{ F_CAUSE_APF_0, "Arb prefetch memory, channel 0" },
+		{ F_CAUSE_AF_1, "Arb fetch memory, channel 1" },
+		{ F_CAUSE_AF_0, "Arb fetch memory, channel 0" },
+		{ F_CAUSE_DDPDF_1, "ddp_data_fifo Fifo, channel 1" },
+		{ F_CAUSE_DDPMF_1, "ddp_msg_fifo Fifo, channel 1" },
+		{ F_CAUSE_MEMRF_1, "mem_req_fifo_d Fifo, channel 1" },
+		{ F_CAUSE_PRSDF_1, "prsr_data_fifo Fifo, channel 1" },
+		{ F_CAUSE_DDPDF_0, "ddp_data_fifo Fifo, channel 0" },
+		{ F_CAUSE_DDPMF_0, "ddp_msg_fifo Fifo, channel 0" },
+		{ F_CAUSE_MEMRF_0, "mem_req_fifo_d Fifo, channel 0" },
+		{ F_CAUSE_PRSDF_0, "prsr_data_fifo Fifo, channel 0" },
+		{ F_CAUSE_PCMDF_1, "Pcmd Fifo, channel 1" },
+		{ F_CAUSE_TPTCF_1, "tpt_ctl_fifo Fifo, channel 1" },
+		{ F_CAUSE_DDPCF_1, "ddp_ctl_fifo Fifo, channel 1" },
+		{ F_CAUSE_MPARF_1, "mpar_ctl_fifo Fifo, channel 1" },
+		{ F_CAUSE_MPARC_1, "mpac_ctl_fifo Fifo, channel 1" },
+		{ F_CAUSE_PCMDF_0, "Pcmd Fifo, channel 0" },
+		{ F_CAUSE_TPTCF_0, "tpt_ctl_fifo Fifo, channel 0" },
+		{ F_CAUSE_DDPCF_0, "ddp_ctl_fifo Fifo, channel 0" },
+		{ F_CAUSE_MPARF_0, "mpar_ctl_fifo Fifo, channel 0" },
+		{ F_CAUSE_MPARC_0, "mpac_ctl_fifo Fifo, channel 0" },
+		{ 0 }
+	};
+	static const struct intr_details t7_ulprx_int_cause_details[] = {
+		{ F_CERR_PCMD_FIFO_3, "PCMD FIFO correctable Error3" },
+		{ F_CERR_PCMD_FIFO_2, "PCMD FIFO correctable Error2" },
+		{ F_CERR_PCMD_FIFO_1, "PCMD FIFO correctable Error1" },
+		{ F_CERR_PCMD_FIFO_0, "PCMD FIFO correctable Error0" },
+		{ F_CERR_DATA_FIFO_3, "DDP Data FIFO correctable Error3" },
+		{ F_CERR_DATA_FIFO_2, "DDP Data FIFO correctable Error2" },
+		{ F_CERR_DATA_FIFO_1, "DDP Data FIFO correctable Error1" },
+		{ F_CERR_DATA_FIFO_0, "DDP Data FIFO correctable Error0" },
+		{ F_SE_CNT_MISMATCH_3, "SE count mismatch in channel3" },
+		{ F_SE_CNT_MISMATCH_2, "SE count mismatch in channel2" },
+		{ F_T7_SE_CNT_MISMATCH_1, "SE count mismatch in channel1" },
+		{ F_T7_SE_CNT_MISMATCH_0, "SE count mismatch in channel 0" },
+		{ F_T7_ENABLE_CTX_3, "Context access error on channel 3" },
+		{ F_T7_ENABLE_CTX_2, "Context access error on channel 2" },
+		{ F_T7_ENABLE_CTX_1, "Context access error on channel 1" },
+		{ F_T7_ENABLE_CTX_0, "Context access error on channel 0" },
+		{ F_T7_ENABLE_ALN_SDC_ERR_3, "SDC error reported by aligner in channel3" },
+		{ F_T7_ENABLE_ALN_SDC_ERR_2, "SDC error reported by aligner in channel2" },
+		{ F_T7_ENABLE_ALN_SDC_ERR_1, "SDC error reported by aligner in channel1" },
+		{ F_T7_ENABLE_ALN_SDC_ERR_0, "SDC error reported by aligner in channel0" },
+		{ 0 }
+	};
+	struct intr_info ulprx_intr_info = {
 		.name = "ULP_RX_INT_CAUSE",
 		.cause_reg = A_ULP_RX_INT_CAUSE,
 		.enable_reg = A_ULP_RX_INT_ENABLE,
 		.fatal = 0x07ffffff,
 		.flags = IHF_FATAL_IFF_ENABLED,
-		.details = ulprx_intr_details,
+		.details = NULL,
 		.actions = NULL,
 	};
+	static const struct intr_details ulprx_int_cause_2_details[] = {
+		{ F_ULPRX2MA_INTFPERR, "SDC error reported by ULPRX2MA interface parity checker" },
+		{ F_ALN_SDC_ERR_1, "SDC error reported by aligner in channel 1" },
+		{ F_ALN_SDC_ERR_0, "SDC error reported by aligner in channel 0" },
+		{ F_PF_UNTAGGED_TPT_1, "Parity error from Untagged TPT prefetch fifo channel 1" },
+		{ F_PF_UNTAGGED_TPT_0, "Parity error from Untagged TPT prefetch fifo channel 0" },
+		{ F_PF_PBL_1, "Parity error from PBL prefetch fifo channel 1" },
+		{ F_PF_PBL_0, "Parity error from PBL prefetch fifo channel 0" },
+		{ F_DDP_HINT_1, "DDP hint fifo Perr in channel 1" },
+		{ F_DDP_HINT_0, "DDP hint fifo Perr in channel 0" },
+		{ 0 }
+	};
 	static const struct intr_info ulprx_intr2_info = {
 		.name = "ULP_RX_INT_CAUSE_2",
 		.cause_reg = A_ULP_RX_INT_CAUSE_2,
 		.enable_reg = A_ULP_RX_INT_ENABLE_2,
 		.fatal = 0,
 		.flags = 0,
-		.details = NULL,
+		.details = ulprx_int_cause_2_details,
 		.actions = NULL,
 	};
+	static const struct intr_details ulprx_int_cause_pcmd_details[] = {
+		{ F_CAUSE_PCMD_SFIFO_3, "Small FIFOs, channel 3" },
+		{ F_CAUSE_PCMD_FIFO_3, "pcmd_ctl_fifo, channel 3" },
+		{ F_CAUSE_PCMD_DDP_HINT_3, "ddp_hint_ctl_fifo FIFO, channel 3" },
+		{ F_CAUSE_PCMD_TPT_3, "tpt_ctl_fifo FIFO, channel 3" },
+		{ F_CAUSE_PCMD_DDP_3, "ddp_ctl_fifo FIFO, channel 3" },
+		{ F_CAUSE_PCMD_MPAR_3, "mpar_ctl_fifo FIFO, channel 3" },
+		{ F_CAUSE_PCMD_MPAC_3, "mpac_ctl_fifo FIFO, channel 3" },
+		{ F_CAUSE_PCMD_SFIFO_2, "Small FIFOs, channel 2" },
+		{ F_CAUSE_PCMD_FIFO_2, "pcmd_ctl_fifo, channel 2" },
+		{ F_CAUSE_PCMD_DDP_HINT_2, "ddp_hint_ctl_fifo FIFO, channel 2" },
+		{ F_CAUSE_PCMD_TPT_2, "tpt_ctl_fifo FIFO, channel 2" },
+		{ F_CAUSE_PCMD_DDP_2, "ddp_ctl_fifo FIFO, channel 2" },
+		{ F_CAUSE_PCMD_MPAR_2, "mpar_ctl_fifo FIFO, channel 2" },
+		{ F_CAUSE_PCMD_MPAC_2, "mpac_ctl_fifo FIFO, channel 2" },
+		{ F_CAUSE_PCMD_SFIFO_1, "Small FIFOs, channel 1" },
+		{ F_CAUSE_PCMD_FIFO_1, "pcmd_ctl_fifo, channel 1" },
+		{ F_CAUSE_PCMD_DDP_HINT_1, "ddp_hint_ctl_fifo FIFO, channel 1" },
+		{ F_CAUSE_PCMD_TPT_1, "tpt_ctl_fifo FIFO, channel 1" },
+		{ F_CAUSE_PCMD_DDP_1, "ddp_ctl_fifo FIFO, channel 1" },
+		{ F_CAUSE_PCMD_MPAR_1, "mpar_ctl_fifo FIFO, channel 1" },
+		{ F_CAUSE_PCMD_MPAC_1, "mpac_ctl_fifo FIFO, channel 1" },
+		{ F_CAUSE_PCMD_SFIFO_0, "Small FIFOs, channel 0" },
+		{ F_CAUSE_PCMD_FIFO_0, "pcmd_ctl_fifo, channel 0" },
+		{ F_CAUSE_PCMD_DDP_HINT_0, "ddp_hint_ctl_fifo FIFO, channel 0" },
+		{ F_CAUSE_PCMD_TPT_0, "tpt_ctl_fifo FIFO, channel 0" },
+		{ F_CAUSE_PCMD_DDP_0, "ddp_ctl_fifo FIFO, channel 0" },
+		{ F_CAUSE_PCMD_MPAR_0, "mpar_ctl_fifo FIFO, channel 0" },
+		{ F_CAUSE_PCMD_MPAC_0, "mpac_ctl_fifo FIFO, channel 0" },
+		{ 0 }
+	};
 	static const struct intr_info ulprx_int_cause_pcmd = {
 		.name = "ULP_RX_INT_CAUSE_PCMD",
 		.cause_reg = A_ULP_RX_INT_CAUSE_PCMD,
 		.enable_reg = A_ULP_RX_INT_ENABLE_PCMD,
 		.fatal = 0,
 		.flags = 0,
-		.details = NULL,
+		.details = ulprx_int_cause_pcmd_details,
 		.actions = NULL,
 	};
+	static const struct intr_details ulprx_int_cause_data_details[] = {
+		{ F_CAUSE_DATA_SNOOP_3, "Snoop FIFO, channel 3" },
+		{ F_CAUSE_DATA_SFIFO_3, "Small FIFO, channel 3" },
+		{ F_CAUSE_DATA_FIFO_3, "data_ctl_fifo FIFO, channel 3" },
+		{ F_CAUSE_DATA_DDP_3, "ddp_ctl_fifo FIFO, channel 3" },
+		{ F_CAUSE_DATA_CTX_3, "ctx_ctl_fifo FIFO, channel 3" },
+		{ F_CAUSE_DATA_PARSER_3, "parser_ctl_fifo FIFO, channel 3" },
+		{ F_CAUSE_DATA_SNOOP_2, "Snoop FIFO, channel 2" },
+		{ F_CAUSE_DATA_SFIFO_2, "Small FIFO, channel 2" },
+		{ F_CAUSE_DATA_FIFO_2, "data_ctl_fifo FIFO, channel 2" },
+		{ F_CAUSE_DATA_DDP_2, "ddp_ctl_fifo FIFO, channel 2" },
+		{ F_CAUSE_DATA_CTX_2, "ctx_ctl_fifo FIFO, channel 2" },
+		{ F_CAUSE_DATA_PARSER_2, "parser_ctl_fifo FIFO, channel 2" },
+		{ F_CAUSE_DATA_SNOOP_1, "Snoop FIFO, channel 1" },
+		{ F_CAUSE_DATA_SFIFO_1, "Small FIFO, channel 1" },
+		{ F_CAUSE_DATA_FIFO_1, "data_ctl_fifo FIFO, channel 1" },
+		{ F_CAUSE_DATA_DDP_1, "ddp_ctl_fifo FIFO, channel 1" },
+		{ F_CAUSE_DATA_CTX_1, "ctx_ctl_fifo FIFO, channel 1" },
+		{ F_CAUSE_DATA_PARSER_1, "parser_ctl_fifo FIFO, channel 1" },
+		{ F_CAUSE_DATA_SNOOP_0, "Snoop FIFO, channel 0" },
+		{ F_CAUSE_DATA_SFIFO_0, "Small FIFO, channel 0" },
+		{ F_CAUSE_DATA_FIFO_0, "data_ctl_fifo FIFO, channel 0" },
+		{ F_CAUSE_DATA_DDP_0, "ddp_ctl_fifo FIFO, channel 0" },
+		{ F_CAUSE_DATA_CTX_0, "ctx_ctl_fifo FIFO, channel 0" },
+		{ F_CAUSE_DATA_PARSER_0, "parser_ctl_fifo FIFO, channel 0" },
+		{ 0 }
+	};
 	static const struct intr_info ulprx_int_cause_data = {
 		.name = "ULP_RX_INT_CAUSE_DATA",
 		.cause_reg = A_ULP_RX_INT_CAUSE_DATA,
*** 1717 LINES SKIPPED ***


home | help

Want to link to this message? Use this
URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?6a18924d.1fcc9.67a666f1>