|
@@ -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,
|