From patchwork Fri Feb 21 11:53:32 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Gavin Shan X-Patchwork-Id: 322567 Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from ozlabs.org (localhost [IPv6:::1]) by ozlabs.org (Postfix) with ESMTP id 283BF2C0331 for ; Fri, 21 Feb 2014 22:55:38 +1100 (EST) Received: by ozlabs.org (Postfix) id 7DAF92C01AE; Fri, 21 Feb 2014 22:53:54 +1100 (EST) Delivered-To: linuxppc-dev@ozlabs.org Received: from e8.ny.us.ibm.com (e8.ny.us.ibm.com [32.97.182.138]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 89FF02C0304 for ; Fri, 21 Feb 2014 22:53:53 +1100 (EST) Received: from /spool/local by e8.ny.us.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Fri, 21 Feb 2014 06:53:51 -0500 Received: from d01dlp02.pok.ibm.com (9.56.250.167) by e8.ny.us.ibm.com (192.168.1.108) with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted; Fri, 21 Feb 2014 06:53:50 -0500 Received: from b01cxnp23033.gho.pok.ibm.com (b01cxnp23033.gho.pok.ibm.com [9.57.198.28]) by d01dlp02.pok.ibm.com (Postfix) with ESMTP id 9881A6E803C for ; Fri, 21 Feb 2014 06:53:44 -0500 (EST) Received: from d01av02.pok.ibm.com (d01av02.pok.ibm.com [9.56.224.216]) by b01cxnp23033.gho.pok.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id s1LBrnjC8585502 for ; Fri, 21 Feb 2014 11:53:49 GMT Received: from d01av02.pok.ibm.com (localhost [127.0.0.1]) by d01av02.pok.ibm.com (8.14.4/8.14.4/NCO v10.0 AVout) with ESMTP id s1LBrnwl008565 for ; Fri, 21 Feb 2014 06:53:49 -0500 Received: from shangw (shangw.cn.ibm.com [9.125.213.121]) by d01av02.pok.ibm.com (8.14.4/8.14.4/NCO v10.0 AVin) with SMTP id s1LBrkh3008456; Fri, 21 Feb 2014 06:53:47 -0500 Received: by shangw (Postfix, from userid 1000) id 198633021D5; Fri, 21 Feb 2014 19:53:36 +0800 (CST) From: Gavin Shan To: linuxppc-dev@ozlabs.org Subject: [PATCH 5/5] powerpc/powernv: Make PHB diag-data output short Date: Fri, 21 Feb 2014 19:53:32 +0800 Message-Id: <1392983613-10090-5-git-send-email-shangw@linux.vnet.ibm.com> X-Mailer: git-send-email 1.7.10.4 In-Reply-To: <1392983613-10090-1-git-send-email-shangw@linux.vnet.ibm.com> References: <1392983613-10090-1-git-send-email-shangw@linux.vnet.ibm.com> X-TM-AS-MML: No X-Content-Scanned: Fidelis XPS MAILER x-cbid: 14022111-0320-0000-0000-00000284CECD Cc: Gavin Shan X-BeenThere: linuxppc-dev@lists.ozlabs.org X-Mailman-Version: 2.1.16 Precedence: list List-Id: Linux on PowerPC Developers Mail List List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: linuxppc-dev-bounces+patchwork-incoming=ozlabs.org@lists.ozlabs.org Sender: "Linuxppc-dev" According to Ben's suggestion, the patch makes the PHB diag-data dump looks a bit short by printing multiple values in one line and outputing "-" for zero fields. After the patch applied, the PHB diag-data dump looks like: PHB3 PHB#3 Diag-data (Version: 1) brdgCtl: 00000002 UtlSts: - - - RootSts: 0000000f 00400000 b0830008 00100147 00002000 RootErrSts: - - - RootErrLog: - - - - RootErrLog1: - - - nFir: - 0030006e00000000 - PhbSts: 0000001c00000000 - Lem: 0000000000100000 42498e327f502eae - PhbErr: - - - - OutErr: - - - - InAErr: 8000000000000000 8000000000000000 0402030000000000 - InBErr: - - - - PE[ 8] A/B: 8480002b00000000 8000000000000000 Signed-off-by: Gavin Shan --- arch/powerpc/platforms/powernv/pci.c | 238 ++++++++++++++++++++-------------- 1 file changed, 143 insertions(+), 95 deletions(-) diff --git a/arch/powerpc/platforms/powernv/pci.c b/arch/powerpc/platforms/powernv/pci.c index 67b2254..a5f236a 100644 --- a/arch/powerpc/platforms/powernv/pci.c +++ b/arch/powerpc/platforms/powernv/pci.c @@ -124,67 +124,103 @@ static void pnv_teardown_msi_irqs(struct pci_dev *pdev) } #endif /* CONFIG_PCI_MSI */ +static char *pnv_pci_diag_field(char *buf, int fmt, u64 val64) +{ + u32 val32 = (u32)val64; + + memset(buf, 0, 24); + switch (fmt) { + case 8: + if (val32) + sprintf(buf, "%08x", val32); + else + sprintf(buf, "%s", "-"); + break; + case 16: + if (val64) + sprintf(buf, "%016llx", val64); + else + sprintf(buf, "%s", "-"); + break; + default: + sprintf(buf, "%s", "-"); + } + + return buf; +} + static void pnv_pci_dump_p7ioc_diag_data(struct pci_controller *hose, struct OpalIoPhbErrorCommon *common) { struct OpalIoP7IOCPhbErrorData *data; + char buf[120]; int i; data = (struct OpalIoP7IOCPhbErrorData *)common; pr_info("P7IOC PHB#%d Diag-data (Version: %d)\n\n", hose->global_number, common->version); - pr_info(" brdgCtl: %08x\n", data->brdgCtl); - - pr_info(" portStatusReg: %08x\n", data->portStatusReg); - pr_info(" rootCmplxStatus: %08x\n", data->rootCmplxStatus); - pr_info(" busAgentStatus: %08x\n", data->busAgentStatus); - - pr_info(" deviceStatus: %08x\n", data->deviceStatus); - pr_info(" slotStatus: %08x\n", data->slotStatus); - pr_info(" linkStatus: %08x\n", data->linkStatus); - pr_info(" devCmdStatus: %08x\n", data->devCmdStatus); - pr_info(" devSecStatus: %08x\n", data->devSecStatus); - - pr_info(" rootErrorStatus: %08x\n", data->rootErrorStatus); - pr_info(" uncorrErrorStatus: %08x\n", data->uncorrErrorStatus); - pr_info(" corrErrorStatus: %08x\n", data->corrErrorStatus); - pr_info(" tlpHdr1: %08x\n", data->tlpHdr1); - pr_info(" tlpHdr2: %08x\n", data->tlpHdr2); - pr_info(" tlpHdr3: %08x\n", data->tlpHdr3); - pr_info(" tlpHdr4: %08x\n", data->tlpHdr4); - pr_info(" sourceId: %08x\n", data->sourceId); - pr_info(" errorClass: %016llx\n", data->errorClass); - pr_info(" correlator: %016llx\n", data->correlator); - pr_info(" p7iocPlssr: %016llx\n", data->p7iocPlssr); - pr_info(" p7iocCsr: %016llx\n", data->p7iocCsr); - pr_info(" lemFir: %016llx\n", data->lemFir); - pr_info(" lemErrorMask: %016llx\n", data->lemErrorMask); - pr_info(" lemWOF: %016llx\n", data->lemWOF); - pr_info(" phbErrorStatus: %016llx\n", data->phbErrorStatus); - pr_info(" phbFirstErrorStatus: %016llx\n", data->phbFirstErrorStatus); - pr_info(" phbErrorLog0: %016llx\n", data->phbErrorLog0); - pr_info(" phbErrorLog1: %016llx\n", data->phbErrorLog1); - pr_info(" mmioErrorStatus: %016llx\n", data->mmioErrorStatus); - pr_info(" mmioFirstErrorStatus: %016llx\n", data->mmioFirstErrorStatus); - pr_info(" mmioErrorLog0: %016llx\n", data->mmioErrorLog0); - pr_info(" mmioErrorLog1: %016llx\n", data->mmioErrorLog1); - pr_info(" dma0ErrorStatus: %016llx\n", data->dma0ErrorStatus); - pr_info(" dma0FirstErrorStatus: %016llx\n", data->dma0FirstErrorStatus); - pr_info(" dma0ErrorLog0: %016llx\n", data->dma0ErrorLog0); - pr_info(" dma0ErrorLog1: %016llx\n", data->dma0ErrorLog1); - pr_info(" dma1ErrorStatus: %016llx\n", data->dma1ErrorStatus); - pr_info(" dma1FirstErrorStatus: %016llx\n", data->dma1FirstErrorStatus); - pr_info(" dma1ErrorLog0: %016llx\n", data->dma1ErrorLog0); - pr_info(" dma1ErrorLog1: %016llx\n", data->dma1ErrorLog1); + pr_info(" brdgCtl: %s\n", + pnv_pci_diag_field(&buf[0], 8, data->brdgCtl)); + pr_info(" UtlSts: %s %s %s\n", + pnv_pci_diag_field(&buf[0], 8, data->portStatusReg), + pnv_pci_diag_field(&buf[1 * 24], 8, data->rootCmplxStatus), + pnv_pci_diag_field(&buf[2 * 24], 8, data->busAgentStatus)); + pr_info(" RootSts: %s %s %s %s %s\n", + pnv_pci_diag_field(&buf[0], 8, data->deviceStatus), + pnv_pci_diag_field(&buf[1 * 24], 8, data->slotStatus), + pnv_pci_diag_field(&buf[2 * 24], 8, data->linkStatus), + pnv_pci_diag_field(&buf[3 * 24], 8, data->devCmdStatus), + pnv_pci_diag_field(&buf[4 * 24], 8, data->devSecStatus)); + pr_info(" RootErrSts: %s %s %s\n", + pnv_pci_diag_field(&buf[0], 8, data->rootErrorStatus), + pnv_pci_diag_field(&buf[1 * 24], 8, data->uncorrErrorStatus), + pnv_pci_diag_field(&buf[2 * 24], 8, data->corrErrorStatus)); + pr_info(" RootErrLog: %s %s %s %s\n", + pnv_pci_diag_field(&buf[0], 8, data->tlpHdr1), + pnv_pci_diag_field(&buf[1 * 24], 8, data->tlpHdr2), + pnv_pci_diag_field(&buf[2 * 24], 8, data->tlpHdr3), + pnv_pci_diag_field(&buf[3 * 24], 8, data->tlpHdr4)); + pr_info(" RootErrLog1: %s %s %s\n", + pnv_pci_diag_field(&buf[0], 8, data->sourceId), + pnv_pci_diag_field(&buf[1 * 24], 16, data->errorClass), + pnv_pci_diag_field(&buf[2 * 24], 16, data->correlator)); + pr_info(" PhbSts: %s %s\n", + pnv_pci_diag_field(&buf[0], 16, data->p7iocPlssr), + pnv_pci_diag_field(&buf[1 * 24], 16, data->p7iocCsr)); + pr_info(" Lem: %s %s %s\n", + pnv_pci_diag_field(&buf[0], 16, data->lemFir), + pnv_pci_diag_field(&buf[1 * 24], 16, data->lemErrorMask), + pnv_pci_diag_field(&buf[2 * 24], 16, data->lemWOF)); + pr_info(" PhbErr: %s %s %s %s\n", + pnv_pci_diag_field(&buf[0], 16, data->phbErrorStatus), + pnv_pci_diag_field(&buf[1 * 24], 16, data->phbFirstErrorStatus), + pnv_pci_diag_field(&buf[2 * 24], 16, data->phbErrorLog0), + pnv_pci_diag_field(&buf[3 * 24], 16, data->phbErrorLog1)); + pr_info(" OutErr: %s %s %s %s\n", + pnv_pci_diag_field(&buf[0], 16, data->mmioErrorStatus), + pnv_pci_diag_field(&buf[1 * 24], 16, data->mmioFirstErrorStatus), + pnv_pci_diag_field(&buf[2 * 24], 16, data->mmioErrorLog0), + pnv_pci_diag_field(&buf[3 * 24], 16, data->mmioErrorLog1)); + pr_info(" InAErr: %s %s %s %s\n", + pnv_pci_diag_field(&buf[0], 16, data->dma0ErrorStatus), + pnv_pci_diag_field(&buf[1 * 24], 16, data->dma0FirstErrorStatus), + pnv_pci_diag_field(&buf[2 * 24], 16, data->dma0ErrorLog0), + pnv_pci_diag_field(&buf[3 * 24], 16, data->dma0ErrorLog1)); + pr_info(" InBErr: %s %s %s %s\n", + pnv_pci_diag_field(&buf[0], 16, data->dma1ErrorStatus), + pnv_pci_diag_field(&buf[1 * 24], 16, data->dma1FirstErrorStatus), + pnv_pci_diag_field(&buf[2 * 24], 16, data->dma1ErrorLog0), + pnv_pci_diag_field(&buf[3 * 24], 16, data->dma1ErrorLog1)); for (i = 0; i < OPAL_P7IOC_NUM_PEST_REGS; i++) { if ((data->pestA[i] >> 63) == 0 && (data->pestB[i] >> 63) == 0) continue; - pr_info(" PE[%3d] PESTA: %016llx\n", i, data->pestA[i]); - pr_info(" PESTB: %016llx\n", data->pestB[i]); + pr_info(" PE[%3d] A/B: %s %s\n", + i, pnv_pci_diag_field(&buf[0], 16, data->pestA[i]), + pnv_pci_diag_field(&buf[1 * 24], 16, data->pestB[i])); } } @@ -192,67 +228,79 @@ static void pnv_pci_dump_phb3_diag_data(struct pci_controller *hose, struct OpalIoPhbErrorCommon *common) { struct OpalIoPhb3ErrorData *data; - int i; + char buf[120]; + int i = 0; + memset(buf, 0, 120); data = (struct OpalIoPhb3ErrorData*)common; pr_info("PHB3 PHB#%d Diag-data (Version: %d)\n\n", hose->global_number, common->version); - pr_info(" brdgCtl: %08x\n", data->brdgCtl); - - pr_info(" portStatusReg: %08x\n", data->portStatusReg); - pr_info(" rootCmplxStatus: %08x\n", data->rootCmplxStatus); - pr_info(" busAgentStatus: %08x\n", data->busAgentStatus); - - pr_info(" deviceStatus: %08x\n", data->deviceStatus); - pr_info(" slotStatus: %08x\n", data->slotStatus); - pr_info(" linkStatus: %08x\n", data->linkStatus); - pr_info(" devCmdStatus: %08x\n", data->devCmdStatus); - pr_info(" devSecStatus: %08x\n", data->devSecStatus); - - pr_info(" rootErrorStatus: %08x\n", data->rootErrorStatus); - pr_info(" uncorrErrorStatus: %08x\n", data->uncorrErrorStatus); - pr_info(" corrErrorStatus: %08x\n", data->corrErrorStatus); - pr_info(" tlpHdr1: %08x\n", data->tlpHdr1); - pr_info(" tlpHdr2: %08x\n", data->tlpHdr2); - pr_info(" tlpHdr3: %08x\n", data->tlpHdr3); - pr_info(" tlpHdr4: %08x\n", data->tlpHdr4); - pr_info(" sourceId: %08x\n", data->sourceId); - pr_info(" errorClass: %016llx\n", data->errorClass); - pr_info(" correlator: %016llx\n", data->correlator); - - pr_info(" nFir: %016llx\n", data->nFir); - pr_info(" nFirMask: %016llx\n", data->nFirMask); - pr_info(" nFirWOF: %016llx\n", data->nFirWOF); - pr_info(" PhbPlssr: %016llx\n", data->phbPlssr); - pr_info(" PhbCsr: %016llx\n", data->phbCsr); - pr_info(" lemFir: %016llx\n", data->lemFir); - pr_info(" lemErrorMask: %016llx\n", data->lemErrorMask); - pr_info(" lemWOF: %016llx\n", data->lemWOF); - pr_info(" phbErrorStatus: %016llx\n", data->phbErrorStatus); - pr_info(" phbFirstErrorStatus: %016llx\n", data->phbFirstErrorStatus); - pr_info(" phbErrorLog0: %016llx\n", data->phbErrorLog0); - pr_info(" phbErrorLog1: %016llx\n", data->phbErrorLog1); - pr_info(" mmioErrorStatus: %016llx\n", data->mmioErrorStatus); - pr_info(" mmioFirstErrorStatus: %016llx\n", data->mmioFirstErrorStatus); - pr_info(" mmioErrorLog0: %016llx\n", data->mmioErrorLog0); - pr_info(" mmioErrorLog1: %016llx\n", data->mmioErrorLog1); - pr_info(" dma0ErrorStatus: %016llx\n", data->dma0ErrorStatus); - pr_info(" dma0FirstErrorStatus: %016llx\n", data->dma0FirstErrorStatus); - pr_info(" dma0ErrorLog0: %016llx\n", data->dma0ErrorLog0); - pr_info(" dma0ErrorLog1: %016llx\n", data->dma0ErrorLog1); - pr_info(" dma1ErrorStatus: %016llx\n", data->dma1ErrorStatus); - pr_info(" dma1FirstErrorStatus: %016llx\n", data->dma1FirstErrorStatus); - pr_info(" dma1ErrorLog0: %016llx\n", data->dma1ErrorLog0); - pr_info(" dma1ErrorLog1: %016llx\n", data->dma1ErrorLog1); + pr_info(" brdgCtl: %s\n", + pnv_pci_diag_field(&buf[0], 8, data->brdgCtl)); + pr_info(" UtlSts: %s %s %s\n", + pnv_pci_diag_field(&buf[0], 8, data->portStatusReg), + pnv_pci_diag_field(&buf[1 * 24], 8, data->rootCmplxStatus), + pnv_pci_diag_field(&buf[2 * 24], 8, data->busAgentStatus)); + pr_info(" RootSts: %s %s %s %s %s\n", + pnv_pci_diag_field(&buf[0], 8, data->deviceStatus), + pnv_pci_diag_field(&buf[1 * 24], 8, data->slotStatus), + pnv_pci_diag_field(&buf[2 * 24], 8, data->linkStatus), + pnv_pci_diag_field(&buf[3 * 24], 8, data->devCmdStatus), + pnv_pci_diag_field(&buf[4 * 24], 8, data->devSecStatus)); + pr_info(" RootErrSts: %s %s %s\n", + pnv_pci_diag_field(&buf[0], 8, data->rootErrorStatus), + pnv_pci_diag_field(&buf[1 * 24], 8, data->uncorrErrorStatus), + pnv_pci_diag_field(&buf[2 * 24], 8, data->corrErrorStatus)); + pr_info(" RootErrLog: %s %s %s %s\n", + pnv_pci_diag_field(&buf[0], 8, data->tlpHdr1), + pnv_pci_diag_field(&buf[1 * 24], 8, data->tlpHdr2), + pnv_pci_diag_field(&buf[2 * 24], 8, data->tlpHdr3), + pnv_pci_diag_field(&buf[3 * 24], 8, data->tlpHdr4)); + pr_info(" RootErrLog1: %s %s %s\n", + pnv_pci_diag_field(&buf[0], 8, data->sourceId), + pnv_pci_diag_field(&buf[1 * 24], 16, data->errorClass), + pnv_pci_diag_field(&buf[2 * 24], 16, data->correlator)); + pr_info(" nFir: %s %s %s\n", + pnv_pci_diag_field(&buf[0], 16, data->nFir), + pnv_pci_diag_field(&buf[1 * 24], 16, data->nFirMask), + pnv_pci_diag_field(&buf[2 * 24], 16, data->nFirWOF)); + pr_info(" PhbSts: %s %s\n", + pnv_pci_diag_field(&buf[0], 16, data->phbPlssr), + pnv_pci_diag_field(&buf[1 * 24], 16, data->phbCsr)); + pr_info(" Lem: %s %s %s\n", + pnv_pci_diag_field(&buf[0], 16, data->lemFir), + pnv_pci_diag_field(&buf[1 * 24], 16, data->lemErrorMask), + pnv_pci_diag_field(&buf[2 * 24], 16, data->lemWOF)); + pr_info(" PhbErr: %s %s %s %s\n", + pnv_pci_diag_field(&buf[0], 16, data->phbErrorStatus), + pnv_pci_diag_field(&buf[1 * 24], 16, data->phbFirstErrorStatus), + pnv_pci_diag_field(&buf[2 * 24], 16, data->phbErrorLog0), + pnv_pci_diag_field(&buf[3 * 24], 16, data->phbErrorLog1)); + pr_info(" OutErr: %s %s %s %s\n", + pnv_pci_diag_field(&buf[0], 16, data->mmioErrorStatus), + pnv_pci_diag_field(&buf[1 * 24], 16, data->mmioFirstErrorStatus), + pnv_pci_diag_field(&buf[2 * 24], 16, data->mmioErrorLog0), + pnv_pci_diag_field(&buf[3 * 24], 16, data->mmioErrorLog1)); + pr_info(" InAErr: %s %s %s %s\n", + pnv_pci_diag_field(&buf[0], 16, data->dma0ErrorStatus), + pnv_pci_diag_field(&buf[1 * 24], 16, data->dma0FirstErrorStatus), + pnv_pci_diag_field(&buf[2 * 24], 16, data->dma0ErrorLog0), + pnv_pci_diag_field(&buf[3 * 24], 16, data->dma0ErrorLog1)); + pr_info(" InBErr: %s %s %s %s\n", + pnv_pci_diag_field(&buf[0], 16, data->dma1ErrorStatus), + pnv_pci_diag_field(&buf[1 * 24], 16, data->dma1FirstErrorStatus), + pnv_pci_diag_field(&buf[2 * 24], 16, data->dma1ErrorLog0), + pnv_pci_diag_field(&buf[3 * 24], 16, data->dma1ErrorLog1)); for (i = 0; i < OPAL_PHB3_NUM_PEST_REGS; i++) { if ((data->pestA[i] >> 63) == 0 && (data->pestB[i] >> 63) == 0) continue; - pr_info(" PE[%3d] PESTA: %016llx\n", i, data->pestA[i]); - pr_info(" PESTB: %016llx\n", data->pestB[i]); + pr_info(" PE[%3d] A/B: %s %s\n", + i, pnv_pci_diag_field(&buf[0], 16, data->pestA[i]), + pnv_pci_diag_field(&buf[1 * 24], 16, data->pestB[i])); } }