powerpc/powernv/pci: Reduce spam when dumping PEST
authorRussell Currey <ruscur@russell.cc>
Wed, 14 Jun 2017 04:19:58 +0000 (14:19 +1000)
committerMichael Ellerman <mpe@ellerman.id.au>
Tue, 27 Jun 2017 02:14:26 +0000 (12:14 +1000)
Dumping the PE State Tables (PEST) can be highly verbose if a number of PEs
are affected, especially in the case where the whole PHB is frozen and 512
lines get printed.  Check for duplicates when dumping the PEST to reduce
useless output.

For example:

    PE[0f8] A/B: 9700002600000000 80000080d00000f8
    PE[0f9] A/B: 8000000000000000 0000000000000000
    PE[..0fe] A/B: as above
    PE[0ff] A/B: 8440002b00000000 0000000000000000

instead of:

    PE[0f8] A/B: 9700002600000000 80000080d00000f8
    PE[0f9] A/B: 8000000000000000 0000000000000000
    PE[0fa] A/B: 8000000000000000 0000000000000000
    PE[0fb] A/B: 8000000000000000 0000000000000000
    PE[0fc] A/B: 8000000000000000 0000000000000000
    PE[0fd] A/B: 8000000000000000 0000000000000000
    PE[0fe] A/B: 8000000000000000 0000000000000000
    PE[0ff] A/B: 8440002b00000000 0000000000000000

and you can imagine how much worse it can get for 512 PEs.

Signed-off-by: Russell Currey <ruscur@russell.cc>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
arch/powerpc/platforms/powernv/pci.c
arch/powerpc/platforms/powernv/pci.h

index 935ccb249a8ae21a8e8ee9f9af4793a5bf6b7394..40071ad0bc4246755a510174dbd45736c328e44a 100644 (file)
@@ -227,11 +227,39 @@ void pnv_teardown_msi_irqs(struct pci_dev *pdev)
 }
 #endif /* CONFIG_PCI_MSI */
 
+/* Nicely print the contents of the PE State Tables (PEST). */
+static void pnv_pci_dump_pest(__be64 pestA[], __be64 pestB[], int pest_size)
+{
+       __be64 prevA = ULONG_MAX, prevB = ULONG_MAX;
+       bool dup = false;
+       int i;
+
+       for (i = 0; i < pest_size; i++) {
+               __be64 peA = be64_to_cpu(pestA[i]);
+               __be64 peB = be64_to_cpu(pestB[i]);
+
+               if (peA != prevA || peB != prevB) {
+                       if (dup) {
+                               pr_info("PE[..%03x] A/B: as above\n", i-1);
+                               dup = false;
+                       }
+                       prevA = peA;
+                       prevB = peB;
+                       if (peA & PNV_IODA_STOPPED_STATE ||
+                           peB & PNV_IODA_STOPPED_STATE)
+                               pr_info("PE[%03x] A/B: %016llx %016llx\n",
+                                       i, peA, peB);
+               } else if (!dup && (peA & PNV_IODA_STOPPED_STATE ||
+                                   peB & PNV_IODA_STOPPED_STATE)) {
+                       dup = true;
+               }
+       }
+}
+
 static void pnv_pci_dump_p7ioc_diag_data(struct pci_controller *hose,
                                         struct OpalIoPhbErrorCommon *common)
 {
        struct OpalIoP7IOCPhbErrorData *data;
-       int i;
 
        data = (struct OpalIoP7IOCPhbErrorData *)common;
        pr_info("P7IOC PHB#%x Diag-data (Version: %d)\n",
@@ -308,22 +336,13 @@ static void pnv_pci_dump_p7ioc_diag_data(struct pci_controller *hose,
                        be64_to_cpu(data->dma1ErrorLog0),
                        be64_to_cpu(data->dma1ErrorLog1));
 
-       for (i = 0; i < OPAL_P7IOC_NUM_PEST_REGS; i++) {
-               if ((be64_to_cpu(data->pestA[i]) >> 63) == 0 &&
-                   (be64_to_cpu(data->pestB[i]) >> 63) == 0)
-                       continue;
-
-               pr_info("PE[%3d] A/B: %016llx %016llx\n",
-                       i, be64_to_cpu(data->pestA[i]),
-                       be64_to_cpu(data->pestB[i]));
-       }
+       pnv_pci_dump_pest(data->pestA, data->pestB, OPAL_P7IOC_NUM_PEST_REGS);
 }
 
 static void pnv_pci_dump_phb3_diag_data(struct pci_controller *hose,
                                        struct OpalIoPhbErrorCommon *common)
 {
        struct OpalIoPhb3ErrorData *data;
-       int i;
 
        data = (struct OpalIoPhb3ErrorData*)common;
        pr_info("PHB3 PHB#%x Diag-data (Version: %d)\n",
@@ -404,15 +423,7 @@ static void pnv_pci_dump_phb3_diag_data(struct pci_controller *hose,
                        be64_to_cpu(data->dma1ErrorLog0),
                        be64_to_cpu(data->dma1ErrorLog1));
 
-       for (i = 0; i < OPAL_PHB3_NUM_PEST_REGS; i++) {
-               if ((be64_to_cpu(data->pestA[i]) >> 63) == 0 &&
-                   (be64_to_cpu(data->pestB[i]) >> 63) == 0)
-                       continue;
-
-               pr_info("PE[%3d] A/B: %016llx %016llx\n",
-                               i, be64_to_cpu(data->pestA[i]),
-                               be64_to_cpu(data->pestB[i]));
-       }
+       pnv_pci_dump_pest(data->pestA, data->pestB, OPAL_PHB3_NUM_PEST_REGS);
 }
 
 void pnv_pci_dump_phb_diag_data(struct pci_controller *hose,
index 18c8a2fa03b8fef1cc7bb6321b607dbacffc1e93..6abc77dd9261f5c3de6a0faf0f6e6deb518d7320 100644 (file)
@@ -33,6 +33,9 @@ enum pnv_phb_model {
 #define PNV_IODA_PE_SLAVE      (1 << 4)        /* Slave PE in compound case    */
 #define PNV_IODA_PE_VF         (1 << 5)        /* PE for one VF                */
 
+/* Indicates operations are frozen for a PE: MMIO in PESTA & DMA in PESTB. */
+#define PNV_IODA_STOPPED_STATE 0x8000000000000000
+
 /* Data associated with a PE, including IOMMU tracking etc.. */
 struct pnv_phb;
 struct pnv_ioda_pe {