lkml.org 
[lkml]   [2024]   [Apr]   [3]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v2 2/2] PCI: Create helper to print TLP Header and Prefix Log
    Date
    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() but 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.c | 32 ++++++++++++++++++++++++++++++++
    drivers/pci/pcie/aer.c | 10 ++--------
    drivers/pci/pcie/dpc.c | 5 +----
    include/linux/aer.h | 2 ++
    4 files changed, 37 insertions(+), 12 deletions(-)

    diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c
    index af230e6e5557..54d4872d14b8 100644
    --- a/drivers/pci/pci.c
    +++ b/drivers/pci/pci.c
    @@ -9,6 +9,7 @@
    */

    #include <linux/acpi.h>
    +#include <linux/array_size.h>
    #include <linux/kernel.h>
    #include <linux/delay.h>
    #include <linux/dmi.h>
    @@ -1116,6 +1117,37 @@ int pcie_read_tlp_log(struct pci_dev *dev, int where, int where2,
    }
    EXPORT_SYMBOL_GPL(pcie_read_tlp_log);

    +/**
    + * pcie_print_tlp_log - Print TLP Header / Prefix Log contents
    + * @dev: PCIe device
    + * @tlp_log: TLP Log structure
    + * @pfx: Internal string prefix (for indentation)
    + *
    + * Prints TLP Header and Prefix Log information held by @tlp_log.
    + */
    +void pcie_print_tlp_log(const struct pci_dev *dev,
    + const struct pcie_tlp_log *tlp_log, const char *pfx)
    +{
    + char buf[(10 + 1) * (4 + ARRAY_SIZE(tlp_log->prefix)) + 14 + 1];
    + unsigned int i;
    + int len;
    +
    + len = scnprintf(buf, sizeof(buf), "%#010x %#010x %#010x %#010x",
    + tlp_log->dw[0], tlp_log->dw[1], tlp_log->dw[2],
    + tlp_log->dw[3]);
    +
    + if (tlp_log->prefix[0])
    + len += scnprintf(buf + len, sizeof(buf) - len, " E-E Prefixes:");
    + for (i = 0; i < ARRAY_SIZE(tlp_log->prefix); i++) {
    + if (!tlp_log->prefix[i])
    + break;
    + len += scnprintf(buf + len, sizeof(buf) - len,
    + " %#010x", tlp_log->prefix[i]);
    + }
    +
    + pci_err(dev, "%sTLP Header: %s\n", pfx, buf);
    +}
    +
    /**
    * 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/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 80b1456f95fe..3f8e3b6c7948 100644
    --- a/drivers/pci/pcie/dpc.c
    +++ b/drivers/pci/pcie/dpc.c
    @@ -229,10 +229,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/include/linux/aer.h b/include/linux/aer.h
    index 2484056feb8d..1e8c61deca65 100644
    --- a/include/linux/aer.h
    +++ b/include/linux/aer.h
    @@ -41,6 +41,8 @@ struct aer_capability_regs {
    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 *tlp_log, const char *pfx);

    #if defined(CONFIG_PCIEAER)
    int pci_aer_clear_nonfatal_status(struct pci_dev *dev);
    --
    2.39.2

    \
     
     \ /
      Last update: 2024-05-27 16:20    [W:2.562 / U:0.004 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site