diff options
author | Benjamin Herrenschmidt <benh@kernel.crashing.org> | 2017-07-12 12:06:40 +1000 |
---|---|---|
committer | Stewart Smith <stewart@linux.vnet.ibm.com> | 2017-07-13 10:19:45 +1000 |
commit | 877b9176b09edce9567ebcd7bce7347cc0edf600 (patch) | |
tree | e6dc6e1054f632cc255432dc87cf4cea8e0d56eb | |
parent | 94186aa05229aa060cf80b91714bbaf0c331bd96 (diff) | |
download | skiboot-877b9176b09edce9567ebcd7bce7347cc0edf600.zip skiboot-877b9176b09edce9567ebcd7bce7347cc0edf600.tar.gz skiboot-877b9176b09edce9567ebcd7bce7347cc0edf600.tar.bz2 |
phb4: Print more info when PHB fences
For now at PHBERR level. We don't have room in the diags data
passed to Linux for these unfortunately.
Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Signed-off-by: Michael Neuling <mikey@neuling.org>
Signed-off-by: Stewart Smith <stewart@linux.vnet.ibm.com>
-rw-r--r-- | hw/phb4.c | 44 |
1 files changed, 37 insertions, 7 deletions
@@ -166,15 +166,45 @@ static inline void phb4_ioda_sel(struct phb4 *p, uint32_t table, /* Check if AIB is fenced via PBCQ NFIR */ static bool phb4_fenced(struct phb4 *p) { - uint64_t nfir; + uint64_t nfir_p, nfir_n, err_aib; + uint64_t err_rpt0, err_rpt1; - xscom_read(p->chip_id, p->pe_stk_xscom + 0x0, &nfir); - if (nfir & PPC_BIT(16)) { - p->flags |= PHB4_AIB_FENCED; - p->state = PHB4_STATE_FENCED; + /* Already fenced ? */ + if (p->flags & PHB4_AIB_FENCED) return true; - } - return false; + + /* + * An all 1's from the PHB indicates a PHB freeze/fence. We + * don't really differenciate them at this point. + */ + if (in_be64(p->regs + PHB_CPU_LOADSTORE_STATUS)!= 0xfffffffffffffffful) + return false; + + PHBERR(p, "PHB Freeze/Fence detected !\n"); + + /* We read the PCI and NEST FIRs and dump them */ + xscom_read(p->chip_id, + p->pci_stk_xscom + XPEC_PCI_STK_PCI_FIR, &nfir_p); + xscom_read(p->chip_id, + p->pe_stk_xscom + XPEC_NEST_STK_PCI_NFIR, &nfir_n); + xscom_read(p->chip_id, + p->pe_stk_xscom + XPEC_NEST_STK_ERR_RPT0, &err_rpt0); + xscom_read(p->chip_id, + p->pe_stk_xscom + XPEC_NEST_STK_ERR_RPT1, &err_rpt1); + xscom_read(p->chip_id, + p->pci_stk_xscom + XPEC_PCI_STK_PBAIB_ERR_REPORT, &err_aib); + + PHBERR(p, " PCI FIR=%016llx\n", nfir_p); + PHBERR(p, "NEST FIR=%016llx\n", nfir_n); + PHBERR(p, "ERR RPT0=%016llx\n", err_rpt0); + PHBERR(p, "ERR RPT1=%016llx\n", err_rpt1); + PHBERR(p, " AIB ERR=%016llx\n", err_aib); + + /* Mark ourselves fenced */ + p->flags |= PHB4_AIB_FENCED; + p->state = PHB4_STATE_FENCED; + + return true; } /* |