}
 #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",
                        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",
                        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,