* [PATCH v5 0/7] PCI: Consolidate TLP Log reading and printing
@ 2024-05-14 11:31 Ilpo Järvinen
2024-05-14 11:31 ` [PATCH v5 1/7] PCI: Don't expose pcie_read_tlp_log() outside of PCI subsystem Ilpo Järvinen
` (7 more replies)
0 siblings, 8 replies; 12+ messages in thread
From: Ilpo Järvinen @ 2024-05-14 11:31 UTC (permalink / raw)
To: linux-pci, Bjorn Helgaas, Mahesh J Salgaonkar,
Oliver O'Halloran, Lukas Wunner
Cc: Ilpo Järvinen, linuxppc-dev, linux-kernel
This series has the remaining patches of the AER & DPC TLP Log handling
consolidation and now includes a few minor improvements to the earlier
accepted TLP Logging code.
v5:
- Fix build with AER=y and DPC=n
- Match kerneldoc and function parameter name
v4:
- Added patches:
- Remove EXPORT of pcie_read_tlp_log()
- Moved code to pcie/tlp.c and build only with AER enabled
- Match variables in prototype and function
- int -> unsigned int conversion
- eetlp_prefix_max into own patch
- struct pcie_tlp_log param consistently called "log" within tlp.c
- Moved function prototypes into drivers/pci/pci.h
- Describe AER/DPC differences more clearly in one commit message
v3:
- Small rewording in a commit message
v2:
- Don't add EXPORT()s
- Don't include igxbe changes
- Don't use pr_cont() as it's incompatible with pci_err() and according
to Andy Shevchenko should not be used in the first place
Ilpo Järvinen (7):
PCI: Don't expose pcie_read_tlp_log() outside of PCI subsystem
PCI: Move TLP Log handling to own file
PCI: Make pcie_read_tlp_log() signature same
PCI: Use unsigned int i in pcie_read_tlp_log()
PCI: Store # of supported End-End TLP Prefixes
PCI: Add TLP Prefix reading into pcie_read_tlp_log()
PCI: Create helper to print TLP Header and Prefix Log
drivers/pci/ats.c | 2 +-
drivers/pci/pci.c | 28 ---------
drivers/pci/pci.h | 9 +++
drivers/pci/pcie/Makefile | 2 +-
drivers/pci/pcie/aer.c | 14 ++---
drivers/pci/pcie/dpc.c | 14 ++---
drivers/pci/pcie/tlp.c | 109 ++++++++++++++++++++++++++++++++++
drivers/pci/probe.c | 14 +++--
include/linux/aer.h | 3 +-
include/linux/pci.h | 2 +-
include/uapi/linux/pci_regs.h | 2 +
11 files changed, 143 insertions(+), 56 deletions(-)
create mode 100644 drivers/pci/pcie/tlp.c
--
2.39.2
^ permalink raw reply [flat|nested] 12+ messages in thread
* [PATCH v5 1/7] PCI: Don't expose pcie_read_tlp_log() outside of PCI subsystem
2024-05-14 11:31 [PATCH v5 0/7] PCI: Consolidate TLP Log reading and printing Ilpo Järvinen
@ 2024-05-14 11:31 ` Ilpo Järvinen
2024-05-14 11:31 ` [PATCH v5 2/7] PCI: Move TLP Log handling to own file Ilpo Järvinen
` (6 subsequent siblings)
7 siblings, 0 replies; 12+ messages in thread
From: Ilpo Järvinen @ 2024-05-14 11:31 UTC (permalink / raw)
To: linux-pci, Bjorn Helgaas, Mahesh J Salgaonkar,
Oliver O'Halloran, Lukas Wunner, linux-kernel
Cc: Ilpo Järvinen, linuxppc-dev
pcie_read_tlp_log() was exposed by the commit 0a5a46a6a61b ("PCI/AER:
Generalize TLP Header Log reading") but this is now considered a
mistake. No drivers outside of PCI subsystem should build their own
diagnostic logging but should rely on PCI core doing it for them.
There's currently one driver (ixgbe) doing it independently which was
the initial reason why the export was added but it was decided by the
PCI maintainer that it's something that should be eliminated.
Remove the unwanted EXPORT of pcie_read_tlp_log() and remove it from
include/linux/aer.h.
Link: https://lore.kernel.org/all/20240322193011.GA701027@bhelgaas/
Signed-off-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com>
---
drivers/pci/pci.c | 1 -
drivers/pci/pci.h | 4 ++++
include/linux/aer.h | 2 --
3 files changed, 4 insertions(+), 3 deletions(-)
diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c
index e5f243dd4288..54ab1d6b8e53 100644
--- a/drivers/pci/pci.c
+++ b/drivers/pci/pci.c
@@ -1092,7 +1092,6 @@ int pcie_read_tlp_log(struct pci_dev *dev, int where,
return 0;
}
-EXPORT_SYMBOL_GPL(pcie_read_tlp_log);
/**
* pci_restore_bars - restore a device's BAR values (e.g. after wake-up)
diff --git a/drivers/pci/pci.h b/drivers/pci/pci.h
index 17fed1846847..9c968df86a92 100644
--- a/drivers/pci/pci.h
+++ b/drivers/pci/pci.h
@@ -4,6 +4,8 @@
#include <linux/pci.h>
+struct pcie_tlp_log;
+
/* Number of possible devfns: 0.0 to 1f.7 inclusive */
#define MAX_NR_DEVFNS 256
@@ -419,6 +421,8 @@ int aer_get_device_error_info(struct pci_dev *dev, struct aer_err_info *info);
void aer_print_error(struct pci_dev *dev, struct aer_err_info *info);
#endif /* CONFIG_PCIEAER */
+int pcie_read_tlp_log(struct pci_dev *dev, int where, struct pcie_tlp_log *log);
+
#ifdef CONFIG_PCIEPORTBUS
/* Cached RCEC Endpoint Association */
struct rcec_ea {
diff --git a/include/linux/aer.h b/include/linux/aer.h
index 4b97f38f3fcf..190a0a2061cd 100644
--- a/include/linux/aer.h
+++ b/include/linux/aer.h
@@ -37,8 +37,6 @@ struct aer_capability_regs {
u16 uncor_err_source;
};
-int pcie_read_tlp_log(struct pci_dev *dev, int where, struct pcie_tlp_log *log);
-
#if defined(CONFIG_PCIEAER)
int pci_aer_clear_nonfatal_status(struct pci_dev *dev);
int pcie_aer_is_native(struct pci_dev *dev);
--
2.39.2
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH v5 2/7] PCI: Move TLP Log handling to own file
2024-05-14 11:31 [PATCH v5 0/7] PCI: Consolidate TLP Log reading and printing Ilpo Järvinen
2024-05-14 11:31 ` [PATCH v5 1/7] PCI: Don't expose pcie_read_tlp_log() outside of PCI subsystem Ilpo Järvinen
@ 2024-05-14 11:31 ` Ilpo Järvinen
2024-05-14 11:31 ` [PATCH v5 3/7] PCI: Make pcie_read_tlp_log() signature same Ilpo Järvinen
` (5 subsequent siblings)
7 siblings, 0 replies; 12+ messages in thread
From: Ilpo Järvinen @ 2024-05-14 11:31 UTC (permalink / raw)
To: linux-pci, Bjorn Helgaas, Mahesh J Salgaonkar,
Oliver O'Halloran, Lukas Wunner, linux-kernel
Cc: Ilpo Järvinen, linuxppc-dev
TLP Log is PCIe feature and is processed only by AER and DPC.
Configwise, DPC depends AER being enabled. In lack of better place, the
TLP Log handling code was initially placed into pci.c but it can be
easily placed in a separate file.
Move TLP Log handling code to own file under pcie/ subdirectory and
include it only when AER is enabled.
Signed-off-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com>
---
drivers/pci/pci.c | 27 ---------------------------
drivers/pci/pci.h | 2 +-
drivers/pci/pcie/Makefile | 2 +-
drivers/pci/pcie/tlp.c | 39 +++++++++++++++++++++++++++++++++++++++
4 files changed, 41 insertions(+), 29 deletions(-)
create mode 100644 drivers/pci/pcie/tlp.c
diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c
index 54ab1d6b8e53..2cc875f60fef 100644
--- a/drivers/pci/pci.c
+++ b/drivers/pci/pci.c
@@ -1066,33 +1066,6 @@ static void pci_enable_acs(struct pci_dev *dev)
pci_disable_acs_redir(dev);
}
-/**
- * pcie_read_tlp_log - read TLP Header Log
- * @dev: PCIe device
- * @where: PCI Config offset of TLP Header Log
- * @tlp_log: TLP Log structure to fill
- *
- * Fill @tlp_log from TLP Header Log registers, e.g., AER or DPC.
- *
- * Return: 0 on success and filled TLP Log structure, <0 on error.
- */
-int pcie_read_tlp_log(struct pci_dev *dev, int where,
- struct pcie_tlp_log *tlp_log)
-{
- int i, ret;
-
- memset(tlp_log, 0, sizeof(*tlp_log));
-
- for (i = 0; i < 4; i++) {
- ret = pci_read_config_dword(dev, where + i * 4,
- &tlp_log->dw[i]);
- if (ret)
- return pcibios_err_to_errno(ret);
- }
-
- return 0;
-}
-
/**
* pci_restore_bars - restore a device's BAR values (e.g. after wake-up)
* @dev: PCI device to have its BARs restored
diff --git a/drivers/pci/pci.h b/drivers/pci/pci.h
index 9c968df86a92..0e9917f8bf3f 100644
--- a/drivers/pci/pci.h
+++ b/drivers/pci/pci.h
@@ -419,9 +419,9 @@ struct aer_err_info {
int aer_get_device_error_info(struct pci_dev *dev, struct aer_err_info *info);
void aer_print_error(struct pci_dev *dev, struct aer_err_info *info);
-#endif /* CONFIG_PCIEAER */
int pcie_read_tlp_log(struct pci_dev *dev, int where, struct pcie_tlp_log *log);
+#endif /* CONFIG_PCIEAER */
#ifdef CONFIG_PCIEPORTBUS
/* Cached RCEC Endpoint Association */
diff --git a/drivers/pci/pcie/Makefile b/drivers/pci/pcie/Makefile
index 6461aa93fe76..591ef3177777 100644
--- a/drivers/pci/pcie/Makefile
+++ b/drivers/pci/pcie/Makefile
@@ -7,7 +7,7 @@ pcieportdrv-y := portdrv.o rcec.o
obj-$(CONFIG_PCIEPORTBUS) += pcieportdrv.o
obj-y += aspm.o
-obj-$(CONFIG_PCIEAER) += aer.o err.o
+obj-$(CONFIG_PCIEAER) += aer.o err.o tlp.o
obj-$(CONFIG_PCIEAER_INJECT) += aer_inject.o
obj-$(CONFIG_PCIE_PME) += pme.o
obj-$(CONFIG_PCIE_DPC) += dpc.o
diff --git a/drivers/pci/pcie/tlp.c b/drivers/pci/pcie/tlp.c
new file mode 100644
index 000000000000..3f053cc62290
--- /dev/null
+++ b/drivers/pci/pcie/tlp.c
@@ -0,0 +1,39 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * PCIe TLP Log handling
+ *
+ * Copyright (C) 2024 Intel Corporation
+ */
+
+#include <linux/aer.h>
+#include <linux/pci.h>
+#include <linux/string.h>
+
+#include "../pci.h"
+
+/**
+ * pcie_read_tlp_log - read TLP Header Log
+ * @dev: PCIe device
+ * @where: PCI Config offset of TLP Header Log
+ * @tlp_log: TLP Log structure to fill
+ *
+ * Fill @tlp_log from TLP Header Log registers, e.g., AER or DPC.
+ *
+ * Return: 0 on success and filled TLP Log structure, <0 on error.
+ */
+int pcie_read_tlp_log(struct pci_dev *dev, int where,
+ struct pcie_tlp_log *tlp_log)
+{
+ int i, ret;
+
+ memset(tlp_log, 0, sizeof(*tlp_log));
+
+ for (i = 0; i < 4; i++) {
+ ret = pci_read_config_dword(dev, where + i * 4,
+ &tlp_log->dw[i]);
+ if (ret)
+ return pcibios_err_to_errno(ret);
+ }
+
+ return 0;
+}
--
2.39.2
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH v5 3/7] PCI: Make pcie_read_tlp_log() signature same
2024-05-14 11:31 [PATCH v5 0/7] PCI: Consolidate TLP Log reading and printing Ilpo Järvinen
2024-05-14 11:31 ` [PATCH v5 1/7] PCI: Don't expose pcie_read_tlp_log() outside of PCI subsystem Ilpo Järvinen
2024-05-14 11:31 ` [PATCH v5 2/7] PCI: Move TLP Log handling to own file Ilpo Järvinen
@ 2024-05-14 11:31 ` Ilpo Järvinen
2024-05-14 11:31 ` [PATCH v5 4/7] PCI: Use unsigned int i in pcie_read_tlp_log() Ilpo Järvinen
` (4 subsequent siblings)
7 siblings, 0 replies; 12+ messages in thread
From: Ilpo Järvinen @ 2024-05-14 11:31 UTC (permalink / raw)
To: linux-pci, Bjorn Helgaas, Mahesh J Salgaonkar,
Oliver O'Halloran, Lukas Wunner, linux-kernel
Cc: Ilpo Järvinen, linuxppc-dev
pcie_read_tlp_log()'s prototype and function signature diverged due to
changes made while applying.
Make the parameters of pcie_read_tlp_log() named identically.
Signed-off-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com>
---
drivers/pci/pcie/tlp.c | 11 +++++------
1 file changed, 5 insertions(+), 6 deletions(-)
diff --git a/drivers/pci/pcie/tlp.c b/drivers/pci/pcie/tlp.c
index 3f053cc62290..2bf15749cd31 100644
--- a/drivers/pci/pcie/tlp.c
+++ b/drivers/pci/pcie/tlp.c
@@ -15,22 +15,21 @@
* pcie_read_tlp_log - read TLP Header Log
* @dev: PCIe device
* @where: PCI Config offset of TLP Header Log
- * @tlp_log: TLP Log structure to fill
+ * @log: TLP Log structure to fill
*
- * Fill @tlp_log from TLP Header Log registers, e.g., AER or DPC.
+ * Fill @log from TLP Header Log registers, e.g., AER or DPC.
*
* Return: 0 on success and filled TLP Log structure, <0 on error.
*/
int pcie_read_tlp_log(struct pci_dev *dev, int where,
- struct pcie_tlp_log *tlp_log)
+ struct pcie_tlp_log *log)
{
int i, ret;
- memset(tlp_log, 0, sizeof(*tlp_log));
+ memset(log, 0, sizeof(*log));
for (i = 0; i < 4; i++) {
- ret = pci_read_config_dword(dev, where + i * 4,
- &tlp_log->dw[i]);
+ ret = pci_read_config_dword(dev, where + i * 4, &log->dw[i]);
if (ret)
return pcibios_err_to_errno(ret);
}
--
2.39.2
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH v5 4/7] PCI: Use unsigned int i in pcie_read_tlp_log()
2024-05-14 11:31 [PATCH v5 0/7] PCI: Consolidate TLP Log reading and printing Ilpo Järvinen
` (2 preceding siblings ...)
2024-05-14 11:31 ` [PATCH v5 3/7] PCI: Make pcie_read_tlp_log() signature same Ilpo Järvinen
@ 2024-05-14 11:31 ` Ilpo Järvinen
2024-05-14 11:31 ` [PATCH v5 5/7] PCI: Store # of supported End-End TLP Prefixes Ilpo Järvinen
` (3 subsequent siblings)
7 siblings, 0 replies; 12+ messages in thread
From: Ilpo Järvinen @ 2024-05-14 11:31 UTC (permalink / raw)
To: linux-pci, Bjorn Helgaas, Mahesh J Salgaonkar,
Oliver O'Halloran, Lukas Wunner, linux-kernel
Cc: Ilpo Järvinen, linuxppc-dev
Loop variable i counting from 0 upwards does not need to be signed so
make it unsigned int.
Signed-off-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com>
---
drivers/pci/pcie/tlp.c | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/drivers/pci/pcie/tlp.c b/drivers/pci/pcie/tlp.c
index 2bf15749cd31..65ac7b5d8a87 100644
--- a/drivers/pci/pcie/tlp.c
+++ b/drivers/pci/pcie/tlp.c
@@ -24,7 +24,8 @@
int pcie_read_tlp_log(struct pci_dev *dev, int where,
struct pcie_tlp_log *log)
{
- int i, ret;
+ unsigned int i;
+ int ret;
memset(log, 0, sizeof(*log));
--
2.39.2
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH v5 5/7] PCI: Store # of supported End-End TLP Prefixes
2024-05-14 11:31 [PATCH v5 0/7] PCI: Consolidate TLP Log reading and printing Ilpo Järvinen
` (3 preceding siblings ...)
2024-05-14 11:31 ` [PATCH v5 4/7] PCI: Use unsigned int i in pcie_read_tlp_log() Ilpo Järvinen
@ 2024-05-14 11:31 ` Ilpo Järvinen
2024-05-14 11:31 ` [PATCH v5 6/7] PCI: Add TLP Prefix reading into pcie_read_tlp_log() Ilpo Järvinen
` (2 subsequent siblings)
7 siblings, 0 replies; 12+ messages in thread
From: Ilpo Järvinen @ 2024-05-14 11:31 UTC (permalink / raw)
To: linux-pci, Bjorn Helgaas, Mahesh J Salgaonkar,
Oliver O'Halloran, Lukas Wunner, linux-kernel
Cc: Ilpo Järvinen, linuxppc-dev
eetlp_prefix_path in the struct pci_dev tells if End-End TLP Prefixes
are supported by the path or not, the value is only calculated if
CONFIG_PCI_PASID is set.
The Max End-End TLP Prefixes field in the Device Capabilities Register
2 also tells how many (1-4) End-End TLP Prefixes are supported (PCIe r6
sec 7.5.3.15). The number of supported End-End Prefixes is useful for
reading correct number of DWORDs from TLP Prefix Log register in AER
capability (PCIe r6 sec 7.8.4.12).
Replace eetlp_prefix_path with eetlp_prefix_max and determine the
number of supported End-End Prefixes regardless of CONFIG_PCI_PASID so
that an upcoming commit generalizing TLP Prefix Log register reading
does not have to read extra DWORDs for End-End Prefixes that never will
be there.
Signed-off-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com>
---
drivers/pci/ats.c | 2 +-
drivers/pci/probe.c | 14 +++++++++-----
include/linux/pci.h | 2 +-
include/uapi/linux/pci_regs.h | 1 +
4 files changed, 12 insertions(+), 7 deletions(-)
diff --git a/drivers/pci/ats.c b/drivers/pci/ats.c
index c570892b2090..e13433dcfc82 100644
--- a/drivers/pci/ats.c
+++ b/drivers/pci/ats.c
@@ -377,7 +377,7 @@ int pci_enable_pasid(struct pci_dev *pdev, int features)
if (WARN_ON(pdev->pasid_enabled))
return -EBUSY;
- if (!pdev->eetlp_prefix_path && !pdev->pasid_no_tlp)
+ if (!pdev->eetlp_prefix_max && !pdev->pasid_no_tlp)
return -EINVAL;
if (!pasid)
diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c
index 1325fbae2f28..02035b005a53 100644
--- a/drivers/pci/probe.c
+++ b/drivers/pci/probe.c
@@ -2211,8 +2211,8 @@ static void pci_configure_relaxed_ordering(struct pci_dev *dev)
static void pci_configure_eetlp_prefix(struct pci_dev *dev)
{
-#ifdef CONFIG_PCI_PASID
struct pci_dev *bridge;
+ unsigned int eetlp_max;
int pcie_type;
u32 cap;
@@ -2224,15 +2224,19 @@ static void pci_configure_eetlp_prefix(struct pci_dev *dev)
return;
pcie_type = pci_pcie_type(dev);
+
+ eetlp_max = FIELD_GET(PCI_EXP_DEVCAP2_EE_PREFIX_MAX, cap);
+ /* 00b means 4 */
+ eetlp_max = eetlp_max ?: 4;
+
if (pcie_type == PCI_EXP_TYPE_ROOT_PORT ||
pcie_type == PCI_EXP_TYPE_RC_END)
- dev->eetlp_prefix_path = 1;
+ dev->eetlp_prefix_max = eetlp_max;
else {
bridge = pci_upstream_bridge(dev);
- if (bridge && bridge->eetlp_prefix_path)
- dev->eetlp_prefix_path = 1;
+ if (bridge && bridge->eetlp_prefix_max)
+ dev->eetlp_prefix_max = eetlp_max;
}
-#endif
}
static void pci_configure_serr(struct pci_dev *dev)
diff --git a/include/linux/pci.h b/include/linux/pci.h
index 16493426a04f..29c51325b1d9 100644
--- a/include/linux/pci.h
+++ b/include/linux/pci.h
@@ -397,7 +397,7 @@ struct pci_dev {
supported from root to here */
#endif
unsigned int pasid_no_tlp:1; /* PASID works without TLP Prefix */
- unsigned int eetlp_prefix_path:1; /* End-to-End TLP Prefix */
+ unsigned int eetlp_prefix_max:3; /* Max # of End-End TLP Prefixes, 0=not supported */
pci_channel_state_t error_state; /* Current connectivity state */
struct device dev; /* Generic device interface */
diff --git a/include/uapi/linux/pci_regs.h b/include/uapi/linux/pci_regs.h
index a39193213ff2..09e0c300c952 100644
--- a/include/uapi/linux/pci_regs.h
+++ b/include/uapi/linux/pci_regs.h
@@ -661,6 +661,7 @@
#define PCI_EXP_DEVCAP2_OBFF_MSG 0x00040000 /* New message signaling */
#define PCI_EXP_DEVCAP2_OBFF_WAKE 0x00080000 /* Re-use WAKE# for OBFF */
#define PCI_EXP_DEVCAP2_EE_PREFIX 0x00200000 /* End-End TLP Prefix */
+#define PCI_EXP_DEVCAP2_EE_PREFIX_MAX 0x00c00000 /* Max End-End TLP Prefixes */
#define PCI_EXP_DEVCTL2 0x28 /* Device Control 2 */
#define PCI_EXP_DEVCTL2_COMP_TIMEOUT 0x000f /* Completion Timeout Value */
#define PCI_EXP_DEVCTL2_COMP_TMOUT_DIS 0x0010 /* Completion Timeout Disable */
--
2.39.2
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH v5 6/7] PCI: Add TLP Prefix reading into pcie_read_tlp_log()
2024-05-14 11:31 [PATCH v5 0/7] PCI: Consolidate TLP Log reading and printing Ilpo Järvinen
` (4 preceding siblings ...)
2024-05-14 11:31 ` [PATCH v5 5/7] PCI: Store # of supported End-End TLP Prefixes Ilpo Järvinen
@ 2024-05-14 11:31 ` Ilpo Järvinen
2024-05-14 11:31 ` [PATCH v5 7/7] PCI: Create helper to print TLP Header and Prefix Log Ilpo Järvinen
2024-08-30 12:23 ` [PATCH v5 0/7] PCI: Consolidate TLP Log reading and printing Ilpo Järvinen
7 siblings, 0 replies; 12+ messages in thread
From: Ilpo Järvinen @ 2024-05-14 11:31 UTC (permalink / raw)
To: linux-pci, Bjorn Helgaas, Mahesh J Salgaonkar,
Oliver O'Halloran, Lukas Wunner, linux-kernel, linuxppc-dev
Cc: Ilpo Järvinen
pcie_read_tlp_log() handles only 4 Header Log DWORDs but TLP Prefix Log
(PCIe r6.1 secs 7.8.4.12 & 7.9.14.13) may also be present.
Generalize pcie_read_tlp_log() and struct pcie_tlp_log to handle also
TLP Prefix Log. The relevant registers are formatted identically in AER
and DPC Capability, but has these variations:
a) The offsets of TLP Prefix Log registers vary.
b) DPC RP PIO TLP Prefix Log register can be < 4 DWORDs.
Therefore callers must pass the offset of the TLP Prefix Log register
and the entire length to pcie_read_tlp_log() to be able to read the
correct number of TLP Prefix DWORDs from the correct offset.
Signed-off-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com>
---
drivers/pci/pci.h | 5 +++-
drivers/pci/pcie/aer.c | 4 ++-
drivers/pci/pcie/dpc.c | 13 +++++-----
drivers/pci/pcie/tlp.c | 49 +++++++++++++++++++++++++++++++----
include/linux/aer.h | 1 +
include/uapi/linux/pci_regs.h | 1 +
6 files changed, 59 insertions(+), 14 deletions(-)
diff --git a/drivers/pci/pci.h b/drivers/pci/pci.h
index 0e9917f8bf3f..7afdd71f9026 100644
--- a/drivers/pci/pci.h
+++ b/drivers/pci/pci.h
@@ -420,7 +420,9 @@ struct aer_err_info {
int aer_get_device_error_info(struct pci_dev *dev, struct aer_err_info *info);
void aer_print_error(struct pci_dev *dev, struct aer_err_info *info);
-int pcie_read_tlp_log(struct pci_dev *dev, int where, struct pcie_tlp_log *log);
+int pcie_read_tlp_log(struct pci_dev *dev, int where, int where2,
+ unsigned int tlp_len, struct pcie_tlp_log *log);
+unsigned int aer_tlp_log_len(struct pci_dev *dev);
#endif /* CONFIG_PCIEAER */
#ifdef CONFIG_PCIEPORTBUS
@@ -439,6 +441,7 @@ void pci_dpc_init(struct pci_dev *pdev);
void dpc_process_error(struct pci_dev *pdev);
pci_ers_result_t dpc_reset_link(struct pci_dev *pdev);
bool pci_dpc_recovered(struct pci_dev *pdev);
+unsigned int dpc_tlp_log_len(struct pci_dev *dev);
#else
static inline void pci_save_dpc_state(struct pci_dev *dev) { }
static inline void pci_restore_dpc_state(struct pci_dev *dev) { }
diff --git a/drivers/pci/pcie/aer.c b/drivers/pci/pcie/aer.c
index ac6293c24976..ecc1dea5a208 100644
--- a/drivers/pci/pcie/aer.c
+++ b/drivers/pci/pcie/aer.c
@@ -1245,7 +1245,9 @@ int aer_get_device_error_info(struct pci_dev *dev, struct aer_err_info *info)
if (info->status & AER_LOG_TLP_MASKS) {
info->tlp_header_valid = 1;
- pcie_read_tlp_log(dev, aer + PCI_ERR_HEADER_LOG, &info->tlp);
+ pcie_read_tlp_log(dev, aer + PCI_ERR_HEADER_LOG,
+ aer + PCI_ERR_PREFIX_LOG,
+ aer_tlp_log_len(dev), &info->tlp);
}
}
diff --git a/drivers/pci/pcie/dpc.c b/drivers/pci/pcie/dpc.c
index a668820696dc..5056cc6961ec 100644
--- a/drivers/pci/pcie/dpc.c
+++ b/drivers/pci/pcie/dpc.c
@@ -190,7 +190,7 @@ pci_ers_result_t dpc_reset_link(struct pci_dev *pdev)
static void dpc_process_rp_pio_error(struct pci_dev *pdev)
{
u16 cap = pdev->dpc_cap, dpc_status, first_error;
- u32 status, mask, sev, syserr, exc, log, prefix;
+ u32 status, mask, sev, syserr, exc, log;
struct pcie_tlp_log tlp_log;
int i;
@@ -217,20 +217,19 @@ static void dpc_process_rp_pio_error(struct pci_dev *pdev)
if (pdev->dpc_rp_log_size < 4)
goto clear_status;
- pcie_read_tlp_log(pdev, cap + PCI_EXP_DPC_RP_PIO_HEADER_LOG, &tlp_log);
+ pcie_read_tlp_log(pdev, cap + PCI_EXP_DPC_RP_PIO_HEADER_LOG,
+ cap + PCI_EXP_DPC_RP_PIO_TLPPREFIX_LOG,
+ dpc_tlp_log_len(pdev), &tlp_log);
pci_err(pdev, "TLP Header: %#010x %#010x %#010x %#010x\n",
tlp_log.dw[0], tlp_log.dw[1], tlp_log.dw[2], tlp_log.dw[3]);
+ for (i = 0; i < pdev->dpc_rp_log_size - 5; i++)
+ pci_err(pdev, "TLP Prefix Header: dw%d, %#010x\n", i, tlp_log.prefix[i]);
if (pdev->dpc_rp_log_size < 5)
goto clear_status;
pci_read_config_dword(pdev, cap + PCI_EXP_DPC_RP_PIO_IMPSPEC_LOG, &log);
pci_err(pdev, "RP PIO ImpSpec Log %#010x\n", log);
- for (i = 0; i < pdev->dpc_rp_log_size - 5; i++) {
- pci_read_config_dword(pdev,
- cap + PCI_EXP_DPC_RP_PIO_TLPPREFIX_LOG + i * 4, &prefix);
- pci_err(pdev, "TLP Prefix Header: dw%d, %#010x\n", i, prefix);
- }
clear_status:
pci_write_config_dword(pdev, cap + PCI_EXP_DPC_RP_PIO_STATUS, status);
}
diff --git a/drivers/pci/pcie/tlp.c b/drivers/pci/pcie/tlp.c
index 65ac7b5d8a87..def9dd7b73e8 100644
--- a/drivers/pci/pcie/tlp.c
+++ b/drivers/pci/pcie/tlp.c
@@ -11,26 +11,65 @@
#include "../pci.h"
+/**
+ * aer_tlp_log_len - Calculates AER Capability TLP Header/Prefix Log length
+ * @dev: PCIe device
+ *
+ * Return: TLP Header/Prefix Log length
+ */
+unsigned int aer_tlp_log_len(struct pci_dev *dev)
+{
+ return 4 + dev->eetlp_prefix_max;
+}
+
+#ifdef CONFIG_PCIE_DPC
+/**
+ * dpc_tlp_log_len - Calculates DPC RP PIO TLP Header/Prefix Log length
+ * @dev: PCIe device
+ *
+ * Return: TLP Header/Prefix Log length
+ */
+unsigned int dpc_tlp_log_len(struct pci_dev *dev)
+{
+ /* Remove ImpSpec Log register from the count */
+ if (dev->dpc_rp_log_size >= 5)
+ return dev->dpc_rp_log_size - 1;
+
+ return dev->dpc_rp_log_size;
+}
+#endif
+
/**
* pcie_read_tlp_log - read TLP Header Log
* @dev: PCIe device
* @where: PCI Config offset of TLP Header Log
+ * @where2: PCI Config offset of TLP Prefix Log
+ * @tlp_len: TLP Log length (Header Log + TLP Prefix Log in DWORDs)
* @log: TLP Log structure to fill
*
* Fill @log from TLP Header Log registers, e.g., AER or DPC.
*
* Return: 0 on success and filled TLP Log structure, <0 on error.
*/
-int pcie_read_tlp_log(struct pci_dev *dev, int where,
- struct pcie_tlp_log *log)
+int pcie_read_tlp_log(struct pci_dev *dev, int where, int where2,
+ unsigned int tlp_len, struct pcie_tlp_log *log)
{
unsigned int i;
- int ret;
+ int off, ret;
+ u32 *to;
memset(log, 0, sizeof(*log));
- for (i = 0; i < 4; i++) {
- ret = pci_read_config_dword(dev, where + i * 4, &log->dw[i]);
+ for (i = 0; i < tlp_len; i++) {
+ if (i < 4) {
+ off = where + i * 4;
+ to = &log->dw[i];
+ } else {
+ off = where2 + (i - 4) * 4;
+ to = &log->prefix[i - 4];
+ }
+
+ ret = pci_read_config_dword(dev, off, to);
if (ret)
return pcibios_err_to_errno(ret);
}
diff --git a/include/linux/aer.h b/include/linux/aer.h
index 190a0a2061cd..dc498adaa1c8 100644
--- a/include/linux/aer.h
+++ b/include/linux/aer.h
@@ -20,6 +20,7 @@ struct pci_dev;
struct pcie_tlp_log {
u32 dw[4];
+ u32 prefix[4];
};
struct aer_capability_regs {
diff --git a/include/uapi/linux/pci_regs.h b/include/uapi/linux/pci_regs.h
index 09e0c300c952..cf7a07fa4a3b 100644
--- a/include/uapi/linux/pci_regs.h
+++ b/include/uapi/linux/pci_regs.h
@@ -803,6 +803,7 @@
#define PCI_ERR_ROOT_FATAL_RCV 0x00000040 /* Fatal Received */
#define PCI_ERR_ROOT_AER_IRQ 0xf8000000 /* Advanced Error Interrupt Message Number */
#define PCI_ERR_ROOT_ERR_SRC 0x34 /* Error Source Identification */
+#define PCI_ERR_PREFIX_LOG 0x38 /* TLP Prefix LOG Register (up to 16 bytes) */
/* Virtual Channel */
#define PCI_VC_PORT_CAP1 0x04
--
2.39.2
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH v5 7/7] PCI: Create helper to print TLP Header and Prefix Log
2024-05-14 11:31 [PATCH v5 0/7] PCI: Consolidate TLP Log reading and printing Ilpo Järvinen
` (5 preceding siblings ...)
2024-05-14 11:31 ` [PATCH v5 6/7] PCI: Add TLP Prefix reading into pcie_read_tlp_log() Ilpo Järvinen
@ 2024-05-14 11:31 ` Ilpo Järvinen
2024-08-30 19:11 ` Bjorn Helgaas
2024-08-30 12:23 ` [PATCH v5 0/7] PCI: Consolidate TLP Log reading and printing Ilpo Järvinen
7 siblings, 1 reply; 12+ messages in thread
From: Ilpo Järvinen @ 2024-05-14 11:31 UTC (permalink / raw)
To: linux-pci, Bjorn Helgaas, Mahesh J Salgaonkar,
Oliver O'Halloran, Lukas Wunner, linux-kernel, linuxppc-dev
Cc: Ilpo Järvinen
Add pcie_print_tlp_log() helper to print TLP Header and Prefix Log.
Print End-End Prefixes only if they are non-zero.
Consolidate the few places which currently print TLP using custom
formatting.
The first attempt used pr_cont() instead of building a string first but
it turns out pr_cont() is not compatible with pci_err() and prints on a
separate line. When I asked about this, Andy Shevchenko suggested
pr_cont() should not be used in the first place (to eventually get rid
of it) so pr_cont() is now replaced with building the string first.
Signed-off-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com>
---
drivers/pci/pci.h | 2 ++
drivers/pci/pcie/aer.c | 10 ++--------
drivers/pci/pcie/dpc.c | 5 +----
drivers/pci/pcie/tlp.c | 31 +++++++++++++++++++++++++++++++
4 files changed, 36 insertions(+), 12 deletions(-)
diff --git a/drivers/pci/pci.h b/drivers/pci/pci.h
index 7afdd71f9026..45083e62892c 100644
--- a/drivers/pci/pci.h
+++ b/drivers/pci/pci.h
@@ -423,6 +423,8 @@ void aer_print_error(struct pci_dev *dev, struct aer_err_info *info);
int pcie_read_tlp_log(struct pci_dev *dev, int where, int where2,
unsigned int tlp_len, struct pcie_tlp_log *log);
unsigned int aer_tlp_log_len(struct pci_dev *dev);
+void pcie_print_tlp_log(const struct pci_dev *dev,
+ const struct pcie_tlp_log *log, const char *pfx);
#endif /* CONFIG_PCIEAER */
#ifdef CONFIG_PCIEPORTBUS
diff --git a/drivers/pci/pcie/aer.c b/drivers/pci/pcie/aer.c
index ecc1dea5a208..efb9e728fe94 100644
--- a/drivers/pci/pcie/aer.c
+++ b/drivers/pci/pcie/aer.c
@@ -664,12 +664,6 @@ static void pci_rootport_aer_stats_incr(struct pci_dev *pdev,
}
}
-static void __print_tlp_header(struct pci_dev *dev, struct pcie_tlp_log *t)
-{
- pci_err(dev, " TLP Header: %08x %08x %08x %08x\n",
- t->dw[0], t->dw[1], t->dw[2], t->dw[3]);
-}
-
static void __aer_print_error(struct pci_dev *dev,
struct aer_err_info *info)
{
@@ -724,7 +718,7 @@ void aer_print_error(struct pci_dev *dev, struct aer_err_info *info)
__aer_print_error(dev, info);
if (info->tlp_header_valid)
- __print_tlp_header(dev, &info->tlp);
+ pcie_print_tlp_log(dev, &info->tlp, " ");
out:
if (info->id && info->error_dev_num > 1 && info->id == id)
@@ -796,7 +790,7 @@ void pci_print_aer(struct pci_dev *dev, int aer_severity,
aer->uncor_severity);
if (tlp_header_valid)
- __print_tlp_header(dev, &aer->header_log);
+ pcie_print_tlp_log(dev, &aer->header_log, " ");
trace_aer_event(dev_name(&dev->dev), (status & ~mask),
aer_severity, tlp_header_valid, &aer->header_log);
diff --git a/drivers/pci/pcie/dpc.c b/drivers/pci/pcie/dpc.c
index 5056cc6961ec..598f74384471 100644
--- a/drivers/pci/pcie/dpc.c
+++ b/drivers/pci/pcie/dpc.c
@@ -220,10 +220,7 @@ static void dpc_process_rp_pio_error(struct pci_dev *pdev)
pcie_read_tlp_log(pdev, cap + PCI_EXP_DPC_RP_PIO_HEADER_LOG,
cap + PCI_EXP_DPC_RP_PIO_TLPPREFIX_LOG,
dpc_tlp_log_len(pdev), &tlp_log);
- pci_err(pdev, "TLP Header: %#010x %#010x %#010x %#010x\n",
- tlp_log.dw[0], tlp_log.dw[1], tlp_log.dw[2], tlp_log.dw[3]);
- for (i = 0; i < pdev->dpc_rp_log_size - 5; i++)
- pci_err(pdev, "TLP Prefix Header: dw%d, %#010x\n", i, tlp_log.prefix[i]);
+ pcie_print_tlp_log(pdev, &tlp_log, "");
if (pdev->dpc_rp_log_size < 5)
goto clear_status;
diff --git a/drivers/pci/pcie/tlp.c b/drivers/pci/pcie/tlp.c
index def9dd7b73e8..097ac8514e96 100644
--- a/drivers/pci/pcie/tlp.c
+++ b/drivers/pci/pcie/tlp.c
@@ -6,6 +6,7 @@
*/
#include <linux/aer.h>
+#include <linux/array_size.h>
#include <linux/pci.h>
#include <linux/string.h>
@@ -76,3 +77,33 @@ int pcie_read_tlp_log(struct pci_dev *dev, int where, int where2,
return 0;
}
+
+/**
+ * pcie_print_tlp_log - Print TLP Header / Prefix Log contents
+ * @dev: PCIe device
+ * @log: TLP Log structure
+ * @pfx: String prefix (for print out indentation)
+ *
+ * Prints TLP Header and Prefix Log information held by @log.
+ */
+void pcie_print_tlp_log(const struct pci_dev *dev,
+ const struct pcie_tlp_log *log, const char *pfx)
+{
+ char buf[(10 + 1) * (4 + ARRAY_SIZE(log->prefix)) + 14 + 1];
+ unsigned int i;
+ int len;
+
+ len = scnprintf(buf, sizeof(buf), "%#010x %#010x %#010x %#010x",
+ log->dw[0], log->dw[1], log->dw[2], log->dw[3]);
+
+ if (log->prefix[0])
+ len += scnprintf(buf + len, sizeof(buf) - len, " E-E Prefixes:");
+ for (i = 0; i < ARRAY_SIZE(log->prefix); i++) {
+ if (!log->prefix[i])
+ break;
+ len += scnprintf(buf + len, sizeof(buf) - len,
+ " %#010x", log->prefix[i]);
+ }
+
+ pci_err(dev, "%sTLP Header: %s\n", pfx, buf);
+}
--
2.39.2
^ permalink raw reply related [flat|nested] 12+ messages in thread
* Re: [PATCH v5 0/7] PCI: Consolidate TLP Log reading and printing
2024-05-14 11:31 [PATCH v5 0/7] PCI: Consolidate TLP Log reading and printing Ilpo Järvinen
` (6 preceding siblings ...)
2024-05-14 11:31 ` [PATCH v5 7/7] PCI: Create helper to print TLP Header and Prefix Log Ilpo Järvinen
@ 2024-08-30 12:23 ` Ilpo Järvinen
7 siblings, 0 replies; 12+ messages in thread
From: Ilpo Järvinen @ 2024-08-30 12:23 UTC (permalink / raw)
To: Bjorn Helgaas
Cc: linux-pci, Mahesh J Salgaonkar, Oliver O'Halloran,
Lukas Wunner, linuxppc-dev, LKML
[-- Attachment #1: Type: text/plain, Size: 2249 bytes --]
On Tue, 14 May 2024, Ilpo Järvinen wrote:
> This series has the remaining patches of the AER & DPC TLP Log handling
> consolidation and now includes a few minor improvements to the earlier
> accepted TLP Logging code.
>
> v5:
> - Fix build with AER=y and DPC=n
> - Match kerneldoc and function parameter name
Hi Bjorn,
A gentle reminder, could you take a look at this series (and perhaps also
the one which introduces the Flit mode support on top of this series).
--
i.
> v4:
> - Added patches:
> - Remove EXPORT of pcie_read_tlp_log()
> - Moved code to pcie/tlp.c and build only with AER enabled
> - Match variables in prototype and function
> - int -> unsigned int conversion
> - eetlp_prefix_max into own patch
> - struct pcie_tlp_log param consistently called "log" within tlp.c
> - Moved function prototypes into drivers/pci/pci.h
> - Describe AER/DPC differences more clearly in one commit message
>
> v3:
> - Small rewording in a commit message
>
> v2:
> - Don't add EXPORT()s
> - Don't include igxbe changes
> - Don't use pr_cont() as it's incompatible with pci_err() and according
> to Andy Shevchenko should not be used in the first place
>
> Ilpo Järvinen (7):
> PCI: Don't expose pcie_read_tlp_log() outside of PCI subsystem
> PCI: Move TLP Log handling to own file
> PCI: Make pcie_read_tlp_log() signature same
> PCI: Use unsigned int i in pcie_read_tlp_log()
> PCI: Store # of supported End-End TLP Prefixes
> PCI: Add TLP Prefix reading into pcie_read_tlp_log()
> PCI: Create helper to print TLP Header and Prefix Log
>
> drivers/pci/ats.c | 2 +-
> drivers/pci/pci.c | 28 ---------
> drivers/pci/pci.h | 9 +++
> drivers/pci/pcie/Makefile | 2 +-
> drivers/pci/pcie/aer.c | 14 ++---
> drivers/pci/pcie/dpc.c | 14 ++---
> drivers/pci/pcie/tlp.c | 109 ++++++++++++++++++++++++++++++++++
> drivers/pci/probe.c | 14 +++--
> include/linux/aer.h | 3 +-
> include/linux/pci.h | 2 +-
> include/uapi/linux/pci_regs.h | 2 +
> 11 files changed, 143 insertions(+), 56 deletions(-)
> create mode 100644 drivers/pci/pcie/tlp.c
>
>
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH v5 7/7] PCI: Create helper to print TLP Header and Prefix Log
2024-05-14 11:31 ` [PATCH v5 7/7] PCI: Create helper to print TLP Header and Prefix Log Ilpo Järvinen
@ 2024-08-30 19:11 ` Bjorn Helgaas
2024-09-02 17:20 ` Ilpo Järvinen
0 siblings, 1 reply; 12+ messages in thread
From: Bjorn Helgaas @ 2024-08-30 19:11 UTC (permalink / raw)
To: Ilpo Järvinen
Cc: linux-pci, Bjorn Helgaas, Mahesh J Salgaonkar,
Oliver O'Halloran, Lukas Wunner, linux-kernel, linuxppc-dev
On Tue, May 14, 2024 at 02:31:09PM +0300, Ilpo Järvinen wrote:
> Add pcie_print_tlp_log() helper to print TLP Header and Prefix Log.
> Print End-End Prefixes only if they are non-zero.
>
> Consolidate the few places which currently print TLP using custom
> formatting.
>
> The first attempt used pr_cont() instead of building a string first but
> it turns out pr_cont() is not compatible with pci_err() and prints on a
> separate line. When I asked about this, Andy Shevchenko suggested
> pr_cont() should not be used in the first place (to eventually get rid
> of it) so pr_cont() is now replaced with building the string first.
>
> Signed-off-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com>
> ---
> drivers/pci/pci.h | 2 ++
> drivers/pci/pcie/aer.c | 10 ++--------
> drivers/pci/pcie/dpc.c | 5 +----
> drivers/pci/pcie/tlp.c | 31 +++++++++++++++++++++++++++++++
> 4 files changed, 36 insertions(+), 12 deletions(-)
>
> diff --git a/drivers/pci/pci.h b/drivers/pci/pci.h
> index 7afdd71f9026..45083e62892c 100644
> --- a/drivers/pci/pci.h
> +++ b/drivers/pci/pci.h
> @@ -423,6 +423,8 @@ void aer_print_error(struct pci_dev *dev, struct aer_err_info *info);
> int pcie_read_tlp_log(struct pci_dev *dev, int where, int where2,
> unsigned int tlp_len, struct pcie_tlp_log *log);
> unsigned int aer_tlp_log_len(struct pci_dev *dev);
> +void pcie_print_tlp_log(const struct pci_dev *dev,
> + const struct pcie_tlp_log *log, const char *pfx);
> #endif /* CONFIG_PCIEAER */
>
> #ifdef CONFIG_PCIEPORTBUS
> diff --git a/drivers/pci/pcie/aer.c b/drivers/pci/pcie/aer.c
> index ecc1dea5a208..efb9e728fe94 100644
> --- a/drivers/pci/pcie/aer.c
> +++ b/drivers/pci/pcie/aer.c
> @@ -664,12 +664,6 @@ static void pci_rootport_aer_stats_incr(struct pci_dev *pdev,
> }
> }
>
> -static void __print_tlp_header(struct pci_dev *dev, struct pcie_tlp_log *t)
> -{
> - pci_err(dev, " TLP Header: %08x %08x %08x %08x\n",
> - t->dw[0], t->dw[1], t->dw[2], t->dw[3]);
> -}
> -
> static void __aer_print_error(struct pci_dev *dev,
> struct aer_err_info *info)
> {
> @@ -724,7 +718,7 @@ void aer_print_error(struct pci_dev *dev, struct aer_err_info *info)
> __aer_print_error(dev, info);
>
> if (info->tlp_header_valid)
> - __print_tlp_header(dev, &info->tlp);
> + pcie_print_tlp_log(dev, &info->tlp, " ");
I see you went to some trouble to preserve the previous output, down
to the number of spaces prefixing it.
But more than the leading spaces, I think what people will notice is
that previously AER and DPC dmesgs contain the "AER: " or "DPC: "
prefixes implicitly added by the dev_fmt definitions [1], where now
IIUC they won't.
I think adding dev_fmt("") here should take care of that, e.g.,
pcie_print_tlp_log(dev, &info->tlp, dev_fmt(""));
[1] https://bugs.launchpad.net/ubuntu/+source/linux/+bug/1990272
> out:
> if (info->id && info->error_dev_num > 1 && info->id == id)
> @@ -796,7 +790,7 @@ void pci_print_aer(struct pci_dev *dev, int aer_severity,
> aer->uncor_severity);
>
> if (tlp_header_valid)
> - __print_tlp_header(dev, &aer->header_log);
> + pcie_print_tlp_log(dev, &aer->header_log, " ");
>
> trace_aer_event(dev_name(&dev->dev), (status & ~mask),
> aer_severity, tlp_header_valid, &aer->header_log);
> diff --git a/drivers/pci/pcie/dpc.c b/drivers/pci/pcie/dpc.c
> index 5056cc6961ec..598f74384471 100644
> --- a/drivers/pci/pcie/dpc.c
> +++ b/drivers/pci/pcie/dpc.c
> @@ -220,10 +220,7 @@ static void dpc_process_rp_pio_error(struct pci_dev *pdev)
> pcie_read_tlp_log(pdev, cap + PCI_EXP_DPC_RP_PIO_HEADER_LOG,
> cap + PCI_EXP_DPC_RP_PIO_TLPPREFIX_LOG,
> dpc_tlp_log_len(pdev), &tlp_log);
> - pci_err(pdev, "TLP Header: %#010x %#010x %#010x %#010x\n",
> - tlp_log.dw[0], tlp_log.dw[1], tlp_log.dw[2], tlp_log.dw[3]);
> - for (i = 0; i < pdev->dpc_rp_log_size - 5; i++)
> - pci_err(pdev, "TLP Prefix Header: dw%d, %#010x\n", i, tlp_log.prefix[i]);
> + pcie_print_tlp_log(pdev, &tlp_log, "");
>
> if (pdev->dpc_rp_log_size < 5)
> goto clear_status;
> diff --git a/drivers/pci/pcie/tlp.c b/drivers/pci/pcie/tlp.c
> index def9dd7b73e8..097ac8514e96 100644
> --- a/drivers/pci/pcie/tlp.c
> +++ b/drivers/pci/pcie/tlp.c
> @@ -6,6 +6,7 @@
> */
>
> #include <linux/aer.h>
> +#include <linux/array_size.h>
> #include <linux/pci.h>
> #include <linux/string.h>
>
> @@ -76,3 +77,33 @@ int pcie_read_tlp_log(struct pci_dev *dev, int where, int where2,
>
> return 0;
> }
> +
> +/**
> + * pcie_print_tlp_log - Print TLP Header / Prefix Log contents
> + * @dev: PCIe device
> + * @log: TLP Log structure
> + * @pfx: String prefix (for print out indentation)
> + *
> + * Prints TLP Header and Prefix Log information held by @log.
> + */
> +void pcie_print_tlp_log(const struct pci_dev *dev,
> + const struct pcie_tlp_log *log, const char *pfx)
> +{
> + char buf[(10 + 1) * (4 + ARRAY_SIZE(log->prefix)) + 14 + 1];
> + unsigned int i;
> + int len;
> +
> + len = scnprintf(buf, sizeof(buf), "%#010x %#010x %#010x %#010x",
> + log->dw[0], log->dw[1], log->dw[2], log->dw[3]);
> +
> + if (log->prefix[0])
> + len += scnprintf(buf + len, sizeof(buf) - len, " E-E Prefixes:");
> + for (i = 0; i < ARRAY_SIZE(log->prefix); i++) {
> + if (!log->prefix[i])
> + break;
> + len += scnprintf(buf + len, sizeof(buf) - len,
> + " %#010x", log->prefix[i]);
> + }
> +
> + pci_err(dev, "%sTLP Header: %s\n", pfx, buf);
> +}
> --
> 2.39.2
>
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH v5 7/7] PCI: Create helper to print TLP Header and Prefix Log
2024-08-30 19:11 ` Bjorn Helgaas
@ 2024-09-02 17:20 ` Ilpo Järvinen
2024-09-02 18:52 ` Bjorn Helgaas
0 siblings, 1 reply; 12+ messages in thread
From: Ilpo Järvinen @ 2024-09-02 17:20 UTC (permalink / raw)
To: Bjorn Helgaas
Cc: linux-pci, Bjorn Helgaas, Mahesh J Salgaonkar,
Oliver O'Halloran, Lukas Wunner, LKML, linuxppc-dev
[-- Attachment #1: Type: text/plain, Size: 3360 bytes --]
On Fri, 30 Aug 2024, Bjorn Helgaas wrote:
> On Tue, May 14, 2024 at 02:31:09PM +0300, Ilpo Järvinen wrote:
> > Add pcie_print_tlp_log() helper to print TLP Header and Prefix Log.
> > Print End-End Prefixes only if they are non-zero.
> >
> > Consolidate the few places which currently print TLP using custom
> > formatting.
> >
> > The first attempt used pr_cont() instead of building a string first but
> > it turns out pr_cont() is not compatible with pci_err() and prints on a
> > separate line. When I asked about this, Andy Shevchenko suggested
> > pr_cont() should not be used in the first place (to eventually get rid
> > of it) so pr_cont() is now replaced with building the string first.
> >
> > Signed-off-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com>
> > ---
> > drivers/pci/pci.h | 2 ++
> > drivers/pci/pcie/aer.c | 10 ++--------
> > drivers/pci/pcie/dpc.c | 5 +----
> > drivers/pci/pcie/tlp.c | 31 +++++++++++++++++++++++++++++++
> > 4 files changed, 36 insertions(+), 12 deletions(-)
> >
> > diff --git a/drivers/pci/pci.h b/drivers/pci/pci.h
> > index 7afdd71f9026..45083e62892c 100644
> > --- a/drivers/pci/pci.h
> > +++ b/drivers/pci/pci.h
> > @@ -423,6 +423,8 @@ void aer_print_error(struct pci_dev *dev, struct aer_err_info *info);
> > int pcie_read_tlp_log(struct pci_dev *dev, int where, int where2,
> > unsigned int tlp_len, struct pcie_tlp_log *log);
> > unsigned int aer_tlp_log_len(struct pci_dev *dev);
> > +void pcie_print_tlp_log(const struct pci_dev *dev,
> > + const struct pcie_tlp_log *log, const char *pfx);
> > #endif /* CONFIG_PCIEAER */
> >
> > #ifdef CONFIG_PCIEPORTBUS
> > diff --git a/drivers/pci/pcie/aer.c b/drivers/pci/pcie/aer.c
> > index ecc1dea5a208..efb9e728fe94 100644
> > --- a/drivers/pci/pcie/aer.c
> > +++ b/drivers/pci/pcie/aer.c
> > @@ -664,12 +664,6 @@ static void pci_rootport_aer_stats_incr(struct pci_dev *pdev,
> > }
> > }
> >
> > -static void __print_tlp_header(struct pci_dev *dev, struct pcie_tlp_log *t)
> > -{
> > - pci_err(dev, " TLP Header: %08x %08x %08x %08x\n",
> > - t->dw[0], t->dw[1], t->dw[2], t->dw[3]);
> > -}
> > -
> > static void __aer_print_error(struct pci_dev *dev,
> > struct aer_err_info *info)
> > {
> > @@ -724,7 +718,7 @@ void aer_print_error(struct pci_dev *dev, struct aer_err_info *info)
> > __aer_print_error(dev, info);
> >
> > if (info->tlp_header_valid)
> > - __print_tlp_header(dev, &info->tlp);
> > + pcie_print_tlp_log(dev, &info->tlp, " ");
>
> I see you went to some trouble to preserve the previous output, down
> to the number of spaces prefixing it.
>
> But more than the leading spaces, I think what people will notice is
> that previously AER and DPC dmesgs contain the "AER: " or "DPC: "
> prefixes implicitly added by the dev_fmt definitions [1], where now
> IIUC they won't.
>
> I think adding dev_fmt("") here should take care of that, e.g.,
>
> pcie_print_tlp_log(dev, &info->tlp, dev_fmt(""));
>
> [1] https://bugs.launchpad.net/ubuntu/+source/linux/+bug/1990272
Okay, I'll fix it and resend but looking into that output, it doesn't
look very consistent when it comes to prefixes as the lines in between do
not start with "AER: " either. Perhaps those lines should be changed as
well?
--
i.
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH v5 7/7] PCI: Create helper to print TLP Header and Prefix Log
2024-09-02 17:20 ` Ilpo Järvinen
@ 2024-09-02 18:52 ` Bjorn Helgaas
0 siblings, 0 replies; 12+ messages in thread
From: Bjorn Helgaas @ 2024-09-02 18:52 UTC (permalink / raw)
To: Ilpo Järvinen
Cc: linux-pci, Bjorn Helgaas, Mahesh J Salgaonkar,
Oliver O'Halloran, Lukas Wunner, LKML, linuxppc-dev
On Mon, Sep 02, 2024 at 08:20:41PM +0300, Ilpo Järvinen wrote:
> On Fri, 30 Aug 2024, Bjorn Helgaas wrote:
>
> > On Tue, May 14, 2024 at 02:31:09PM +0300, Ilpo Järvinen wrote:
> > > Add pcie_print_tlp_log() helper to print TLP Header and Prefix Log.
> > > Print End-End Prefixes only if they are non-zero.
> > >
> > > Consolidate the few places which currently print TLP using custom
> > > formatting.
> > >
> > > The first attempt used pr_cont() instead of building a string first but
> > > it turns out pr_cont() is not compatible with pci_err() and prints on a
> > > separate line. When I asked about this, Andy Shevchenko suggested
> > > pr_cont() should not be used in the first place (to eventually get rid
> > > of it) so pr_cont() is now replaced with building the string first.
> > >
> > > Signed-off-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com>
> > > ---
> > > drivers/pci/pci.h | 2 ++
> > > drivers/pci/pcie/aer.c | 10 ++--------
> > > drivers/pci/pcie/dpc.c | 5 +----
> > > drivers/pci/pcie/tlp.c | 31 +++++++++++++++++++++++++++++++
> > > 4 files changed, 36 insertions(+), 12 deletions(-)
> > >
> > > diff --git a/drivers/pci/pci.h b/drivers/pci/pci.h
> > > index 7afdd71f9026..45083e62892c 100644
> > > --- a/drivers/pci/pci.h
> > > +++ b/drivers/pci/pci.h
> > > @@ -423,6 +423,8 @@ void aer_print_error(struct pci_dev *dev, struct aer_err_info *info);
> > > int pcie_read_tlp_log(struct pci_dev *dev, int where, int where2,
> > > unsigned int tlp_len, struct pcie_tlp_log *log);
> > > unsigned int aer_tlp_log_len(struct pci_dev *dev);
> > > +void pcie_print_tlp_log(const struct pci_dev *dev,
> > > + const struct pcie_tlp_log *log, const char *pfx);
> > > #endif /* CONFIG_PCIEAER */
> > >
> > > #ifdef CONFIG_PCIEPORTBUS
> > > diff --git a/drivers/pci/pcie/aer.c b/drivers/pci/pcie/aer.c
> > > index ecc1dea5a208..efb9e728fe94 100644
> > > --- a/drivers/pci/pcie/aer.c
> > > +++ b/drivers/pci/pcie/aer.c
> > > @@ -664,12 +664,6 @@ static void pci_rootport_aer_stats_incr(struct pci_dev *pdev,
> > > }
> > > }
> > >
> > > -static void __print_tlp_header(struct pci_dev *dev, struct pcie_tlp_log *t)
> > > -{
> > > - pci_err(dev, " TLP Header: %08x %08x %08x %08x\n",
> > > - t->dw[0], t->dw[1], t->dw[2], t->dw[3]);
> > > -}
> > > -
> > > static void __aer_print_error(struct pci_dev *dev,
> > > struct aer_err_info *info)
> > > {
> > > @@ -724,7 +718,7 @@ void aer_print_error(struct pci_dev *dev, struct aer_err_info *info)
> > > __aer_print_error(dev, info);
> > >
> > > if (info->tlp_header_valid)
> > > - __print_tlp_header(dev, &info->tlp);
> > > + pcie_print_tlp_log(dev, &info->tlp, " ");
> >
> > I see you went to some trouble to preserve the previous output, down
> > to the number of spaces prefixing it.
> >
> > But more than the leading spaces, I think what people will notice is
> > that previously AER and DPC dmesgs contain the "AER: " or "DPC: "
> > prefixes implicitly added by the dev_fmt definitions [1], where now
> > IIUC they won't.
> >
> > I think adding dev_fmt("") here should take care of that, e.g.,
> >
> > pcie_print_tlp_log(dev, &info->tlp, dev_fmt(""));
> >
> > [1] https://bugs.launchpad.net/ubuntu/+source/linux/+bug/1990272
>
> Okay, I'll fix it and resend but looking into that output, it doesn't
> look very consistent when it comes to prefixes as the lines in between do
> not start with "AER: " either. Perhaps those lines should be changed as
> well?
True. Possibility for future patches.
^ permalink raw reply [flat|nested] 12+ messages in thread
end of thread, other threads:[~2024-09-02 18:52 UTC | newest]
Thread overview: 12+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-05-14 11:31 [PATCH v5 0/7] PCI: Consolidate TLP Log reading and printing Ilpo Järvinen
2024-05-14 11:31 ` [PATCH v5 1/7] PCI: Don't expose pcie_read_tlp_log() outside of PCI subsystem Ilpo Järvinen
2024-05-14 11:31 ` [PATCH v5 2/7] PCI: Move TLP Log handling to own file Ilpo Järvinen
2024-05-14 11:31 ` [PATCH v5 3/7] PCI: Make pcie_read_tlp_log() signature same Ilpo Järvinen
2024-05-14 11:31 ` [PATCH v5 4/7] PCI: Use unsigned int i in pcie_read_tlp_log() Ilpo Järvinen
2024-05-14 11:31 ` [PATCH v5 5/7] PCI: Store # of supported End-End TLP Prefixes Ilpo Järvinen
2024-05-14 11:31 ` [PATCH v5 6/7] PCI: Add TLP Prefix reading into pcie_read_tlp_log() Ilpo Järvinen
2024-05-14 11:31 ` [PATCH v5 7/7] PCI: Create helper to print TLP Header and Prefix Log Ilpo Järvinen
2024-08-30 19:11 ` Bjorn Helgaas
2024-09-02 17:20 ` Ilpo Järvinen
2024-09-02 18:52 ` Bjorn Helgaas
2024-08-30 12:23 ` [PATCH v5 0/7] PCI: Consolidate TLP Log reading and printing Ilpo Järvinen
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).