Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

powerpc/powernv: Refactor PHB diag-data dump

As Ben suggested, the patch prints PHB diag-data with multiple
fields in one line and omits the line if the fields of that
line are all zero.

With the patch applied, the PHB3 diag-data dump looks like:

PHB3 PHB#3 Diag-data (Version: 1)

brdgCtl: 00000002
RootSts: 0000000f 00400000 b0830008 00100147 00002000
nFir: 0000000000000000 0030006e00000000 0000000000000000
PhbSts: 0000001c00000000 0000000000000000
Lem: 0000000000100000 42498e327f502eae 0000000000000000
InAErr: 8000000000000000 8000000000000000 0402030000000000 0000000000000000
PE[ 8] A/B: 8480002b00000000 8000000000000000

[ The current diag data is so big that it overflows the printk
buffer pretty quickly in cases when we get a handful of errors
at once which can happen. --BenH
]

Signed-off-by: Gavin Shan <shangw@linux.vnet.ibm.com>
CC: <stable@vger.kernel.org>
Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>

authored by

Gavin Shan and committed by
Benjamin Herrenschmidt
af87d2fe 94716604

+125 -95
+125 -95
arch/powerpc/platforms/powernv/pci.c
··· 134 134 pr_info("P7IOC PHB#%d Diag-data (Version: %d)\n\n", 135 135 hose->global_number, common->version); 136 136 137 - pr_info(" brdgCtl: %08x\n", data->brdgCtl); 138 - 139 - pr_info(" portStatusReg: %08x\n", data->portStatusReg); 140 - pr_info(" rootCmplxStatus: %08x\n", data->rootCmplxStatus); 141 - pr_info(" busAgentStatus: %08x\n", data->busAgentStatus); 142 - 143 - pr_info(" deviceStatus: %08x\n", data->deviceStatus); 144 - pr_info(" slotStatus: %08x\n", data->slotStatus); 145 - pr_info(" linkStatus: %08x\n", data->linkStatus); 146 - pr_info(" devCmdStatus: %08x\n", data->devCmdStatus); 147 - pr_info(" devSecStatus: %08x\n", data->devSecStatus); 148 - 149 - pr_info(" rootErrorStatus: %08x\n", data->rootErrorStatus); 150 - pr_info(" uncorrErrorStatus: %08x\n", data->uncorrErrorStatus); 151 - pr_info(" corrErrorStatus: %08x\n", data->corrErrorStatus); 152 - pr_info(" tlpHdr1: %08x\n", data->tlpHdr1); 153 - pr_info(" tlpHdr2: %08x\n", data->tlpHdr2); 154 - pr_info(" tlpHdr3: %08x\n", data->tlpHdr3); 155 - pr_info(" tlpHdr4: %08x\n", data->tlpHdr4); 156 - pr_info(" sourceId: %08x\n", data->sourceId); 157 - pr_info(" errorClass: %016llx\n", data->errorClass); 158 - pr_info(" correlator: %016llx\n", data->correlator); 159 - pr_info(" p7iocPlssr: %016llx\n", data->p7iocPlssr); 160 - pr_info(" p7iocCsr: %016llx\n", data->p7iocCsr); 161 - pr_info(" lemFir: %016llx\n", data->lemFir); 162 - pr_info(" lemErrorMask: %016llx\n", data->lemErrorMask); 163 - pr_info(" lemWOF: %016llx\n", data->lemWOF); 164 - pr_info(" phbErrorStatus: %016llx\n", data->phbErrorStatus); 165 - pr_info(" phbFirstErrorStatus: %016llx\n", data->phbFirstErrorStatus); 166 - pr_info(" phbErrorLog0: %016llx\n", data->phbErrorLog0); 167 - pr_info(" phbErrorLog1: %016llx\n", data->phbErrorLog1); 168 - pr_info(" mmioErrorStatus: %016llx\n", data->mmioErrorStatus); 169 - pr_info(" mmioFirstErrorStatus: %016llx\n", data->mmioFirstErrorStatus); 170 - pr_info(" mmioErrorLog0: %016llx\n", data->mmioErrorLog0); 171 - pr_info(" mmioErrorLog1: %016llx\n", data->mmioErrorLog1); 172 - pr_info(" dma0ErrorStatus: %016llx\n", data->dma0ErrorStatus); 173 - pr_info(" dma0FirstErrorStatus: %016llx\n", data->dma0FirstErrorStatus); 174 - pr_info(" dma0ErrorLog0: %016llx\n", data->dma0ErrorLog0); 175 - pr_info(" dma0ErrorLog1: %016llx\n", data->dma0ErrorLog1); 176 - pr_info(" dma1ErrorStatus: %016llx\n", data->dma1ErrorStatus); 177 - pr_info(" dma1FirstErrorStatus: %016llx\n", data->dma1FirstErrorStatus); 178 - pr_info(" dma1ErrorLog0: %016llx\n", data->dma1ErrorLog0); 179 - pr_info(" dma1ErrorLog1: %016llx\n", data->dma1ErrorLog1); 137 + if (data->brdgCtl) 138 + pr_info(" brdgCtl: %08x\n", 139 + data->brdgCtl); 140 + if (data->portStatusReg || data->rootCmplxStatus || 141 + data->busAgentStatus) 142 + pr_info(" UtlSts: %08x %08x %08x\n", 143 + data->portStatusReg, data->rootCmplxStatus, 144 + data->busAgentStatus); 145 + if (data->deviceStatus || data->slotStatus || 146 + data->linkStatus || data->devCmdStatus || 147 + data->devSecStatus) 148 + pr_info(" RootSts: %08x %08x %08x %08x %08x\n", 149 + data->deviceStatus, data->slotStatus, 150 + data->linkStatus, data->devCmdStatus, 151 + data->devSecStatus); 152 + if (data->rootErrorStatus || data->uncorrErrorStatus || 153 + data->corrErrorStatus) 154 + pr_info(" RootErrSts: %08x %08x %08x\n", 155 + data->rootErrorStatus, data->uncorrErrorStatus, 156 + data->corrErrorStatus); 157 + if (data->tlpHdr1 || data->tlpHdr2 || 158 + data->tlpHdr3 || data->tlpHdr4) 159 + pr_info(" RootErrLog: %08x %08x %08x %08x\n", 160 + data->tlpHdr1, data->tlpHdr2, 161 + data->tlpHdr3, data->tlpHdr4); 162 + if (data->sourceId || data->errorClass || 163 + data->correlator) 164 + pr_info(" RootErrLog1: %08x %016llx %016llx\n", 165 + data->sourceId, data->errorClass, 166 + data->correlator); 167 + if (data->p7iocPlssr || data->p7iocCsr) 168 + pr_info(" PhbSts: %016llx %016llx\n", 169 + data->p7iocPlssr, data->p7iocCsr); 170 + if (data->lemFir || data->lemErrorMask || 171 + data->lemWOF) 172 + pr_info(" Lem: %016llx %016llx %016llx\n", 173 + data->lemFir, data->lemErrorMask, 174 + data->lemWOF); 175 + if (data->phbErrorStatus || data->phbFirstErrorStatus || 176 + data->phbErrorLog0 || data->phbErrorLog1) 177 + pr_info(" PhbErr: %016llx %016llx %016llx %016llx\n", 178 + data->phbErrorStatus, data->phbFirstErrorStatus, 179 + data->phbErrorLog0, data->phbErrorLog1); 180 + if (data->mmioErrorStatus || data->mmioFirstErrorStatus || 181 + data->mmioErrorLog0 || data->mmioErrorLog1) 182 + pr_info(" OutErr: %016llx %016llx %016llx %016llx\n", 183 + data->mmioErrorStatus, data->mmioFirstErrorStatus, 184 + data->mmioErrorLog0, data->mmioErrorLog1); 185 + if (data->dma0ErrorStatus || data->dma0FirstErrorStatus || 186 + data->dma0ErrorLog0 || data->dma0ErrorLog1) 187 + pr_info(" InAErr: %016llx %016llx %016llx %016llx\n", 188 + data->dma0ErrorStatus, data->dma0FirstErrorStatus, 189 + data->dma0ErrorLog0, data->dma0ErrorLog1); 190 + if (data->dma1ErrorStatus || data->dma1FirstErrorStatus || 191 + data->dma1ErrorLog0 || data->dma1ErrorLog1) 192 + pr_info(" InBErr: %016llx %016llx %016llx %016llx\n", 193 + data->dma1ErrorStatus, data->dma1FirstErrorStatus, 194 + data->dma1ErrorLog0, data->dma1ErrorLog1); 180 195 181 196 for (i = 0; i < OPAL_P7IOC_NUM_PEST_REGS; i++) { 182 197 if ((data->pestA[i] >> 63) == 0 && 183 198 (data->pestB[i] >> 63) == 0) 184 199 continue; 185 200 186 - pr_info(" PE[%3d] PESTA: %016llx\n", i, data->pestA[i]); 187 - pr_info(" PESTB: %016llx\n", data->pestB[i]); 201 + pr_info(" PE[%3d] A/B: %016llx %016llx\n", 202 + i, data->pestA[i], data->pestB[i]); 188 203 } 189 204 } 190 205 ··· 212 197 data = (struct OpalIoPhb3ErrorData*)common; 213 198 pr_info("PHB3 PHB#%d Diag-data (Version: %d)\n\n", 214 199 hose->global_number, common->version); 215 - 216 - pr_info(" brdgCtl: %08x\n", data->brdgCtl); 217 - 218 - pr_info(" portStatusReg: %08x\n", data->portStatusReg); 219 - pr_info(" rootCmplxStatus: %08x\n", data->rootCmplxStatus); 220 - pr_info(" busAgentStatus: %08x\n", data->busAgentStatus); 221 - 222 - pr_info(" deviceStatus: %08x\n", data->deviceStatus); 223 - pr_info(" slotStatus: %08x\n", data->slotStatus); 224 - pr_info(" linkStatus: %08x\n", data->linkStatus); 225 - pr_info(" devCmdStatus: %08x\n", data->devCmdStatus); 226 - pr_info(" devSecStatus: %08x\n", data->devSecStatus); 227 - 228 - pr_info(" rootErrorStatus: %08x\n", data->rootErrorStatus); 229 - pr_info(" uncorrErrorStatus: %08x\n", data->uncorrErrorStatus); 230 - pr_info(" corrErrorStatus: %08x\n", data->corrErrorStatus); 231 - pr_info(" tlpHdr1: %08x\n", data->tlpHdr1); 232 - pr_info(" tlpHdr2: %08x\n", data->tlpHdr2); 233 - pr_info(" tlpHdr3: %08x\n", data->tlpHdr3); 234 - pr_info(" tlpHdr4: %08x\n", data->tlpHdr4); 235 - pr_info(" sourceId: %08x\n", data->sourceId); 236 - pr_info(" errorClass: %016llx\n", data->errorClass); 237 - pr_info(" correlator: %016llx\n", data->correlator); 238 - 239 - pr_info(" nFir: %016llx\n", data->nFir); 240 - pr_info(" nFirMask: %016llx\n", data->nFirMask); 241 - pr_info(" nFirWOF: %016llx\n", data->nFirWOF); 242 - pr_info(" PhbPlssr: %016llx\n", data->phbPlssr); 243 - pr_info(" PhbCsr: %016llx\n", data->phbCsr); 244 - pr_info(" lemFir: %016llx\n", data->lemFir); 245 - pr_info(" lemErrorMask: %016llx\n", data->lemErrorMask); 246 - pr_info(" lemWOF: %016llx\n", data->lemWOF); 247 - pr_info(" phbErrorStatus: %016llx\n", data->phbErrorStatus); 248 - pr_info(" phbFirstErrorStatus: %016llx\n", data->phbFirstErrorStatus); 249 - pr_info(" phbErrorLog0: %016llx\n", data->phbErrorLog0); 250 - pr_info(" phbErrorLog1: %016llx\n", data->phbErrorLog1); 251 - pr_info(" mmioErrorStatus: %016llx\n", data->mmioErrorStatus); 252 - pr_info(" mmioFirstErrorStatus: %016llx\n", data->mmioFirstErrorStatus); 253 - pr_info(" mmioErrorLog0: %016llx\n", data->mmioErrorLog0); 254 - pr_info(" mmioErrorLog1: %016llx\n", data->mmioErrorLog1); 255 - pr_info(" dma0ErrorStatus: %016llx\n", data->dma0ErrorStatus); 256 - pr_info(" dma0FirstErrorStatus: %016llx\n", data->dma0FirstErrorStatus); 257 - pr_info(" dma0ErrorLog0: %016llx\n", data->dma0ErrorLog0); 258 - pr_info(" dma0ErrorLog1: %016llx\n", data->dma0ErrorLog1); 259 - pr_info(" dma1ErrorStatus: %016llx\n", data->dma1ErrorStatus); 260 - pr_info(" dma1FirstErrorStatus: %016llx\n", data->dma1FirstErrorStatus); 261 - pr_info(" dma1ErrorLog0: %016llx\n", data->dma1ErrorLog0); 262 - pr_info(" dma1ErrorLog1: %016llx\n", data->dma1ErrorLog1); 200 + if (data->brdgCtl) 201 + pr_info(" brdgCtl: %08x\n", 202 + data->brdgCtl); 203 + if (data->portStatusReg || data->rootCmplxStatus || 204 + data->busAgentStatus) 205 + pr_info(" UtlSts: %08x %08x %08x\n", 206 + data->portStatusReg, data->rootCmplxStatus, 207 + data->busAgentStatus); 208 + if (data->deviceStatus || data->slotStatus || 209 + data->linkStatus || data->devCmdStatus || 210 + data->devSecStatus) 211 + pr_info(" RootSts: %08x %08x %08x %08x %08x\n", 212 + data->deviceStatus, data->slotStatus, 213 + data->linkStatus, data->devCmdStatus, 214 + data->devSecStatus); 215 + if (data->rootErrorStatus || data->uncorrErrorStatus || 216 + data->corrErrorStatus) 217 + pr_info(" RootErrSts: %08x %08x %08x\n", 218 + data->rootErrorStatus, data->uncorrErrorStatus, 219 + data->corrErrorStatus); 220 + if (data->tlpHdr1 || data->tlpHdr2 || 221 + data->tlpHdr3 || data->tlpHdr4) 222 + pr_info(" RootErrLog: %08x %08x %08x %08x\n", 223 + data->tlpHdr1, data->tlpHdr2, 224 + data->tlpHdr3, data->tlpHdr4); 225 + if (data->sourceId || data->errorClass || 226 + data->correlator) 227 + pr_info(" RootErrLog1: %08x %016llx %016llx\n", 228 + data->sourceId, data->errorClass, 229 + data->correlator); 230 + if (data->nFir || data->nFirMask || 231 + data->nFirWOF) 232 + pr_info(" nFir: %016llx %016llx %016llx\n", 233 + data->nFir, data->nFirMask, 234 + data->nFirWOF); 235 + if (data->phbPlssr || data->phbCsr) 236 + pr_info(" PhbSts: %016llx %016llx\n", 237 + data->phbPlssr, data->phbCsr); 238 + if (data->lemFir || data->lemErrorMask || 239 + data->lemWOF) 240 + pr_info(" Lem: %016llx %016llx %016llx\n", 241 + data->lemFir, data->lemErrorMask, 242 + data->lemWOF); 243 + if (data->phbErrorStatus || data->phbFirstErrorStatus || 244 + data->phbErrorLog0 || data->phbErrorLog1) 245 + pr_info(" PhbErr: %016llx %016llx %016llx %016llx\n", 246 + data->phbErrorStatus, data->phbFirstErrorStatus, 247 + data->phbErrorLog0, data->phbErrorLog1); 248 + if (data->mmioErrorStatus || data->mmioFirstErrorStatus || 249 + data->mmioErrorLog0 || data->mmioErrorLog1) 250 + pr_info(" OutErr: %016llx %016llx %016llx %016llx\n", 251 + data->mmioErrorStatus, data->mmioFirstErrorStatus, 252 + data->mmioErrorLog0, data->mmioErrorLog1); 253 + if (data->dma0ErrorStatus || data->dma0FirstErrorStatus || 254 + data->dma0ErrorLog0 || data->dma0ErrorLog1) 255 + pr_info(" InAErr: %016llx %016llx %016llx %016llx\n", 256 + data->dma0ErrorStatus, data->dma0FirstErrorStatus, 257 + data->dma0ErrorLog0, data->dma0ErrorLog1); 258 + if (data->dma1ErrorStatus || data->dma1FirstErrorStatus || 259 + data->dma1ErrorLog0 || data->dma1ErrorLog1) 260 + pr_info(" InBErr: %016llx %016llx %016llx %016llx\n", 261 + data->dma1ErrorStatus, data->dma1FirstErrorStatus, 262 + data->dma1ErrorLog0, data->dma1ErrorLog1); 263 263 264 264 for (i = 0; i < OPAL_PHB3_NUM_PEST_REGS; i++) { 265 265 if ((data->pestA[i] >> 63) == 0 && 266 266 (data->pestB[i] >> 63) == 0) 267 267 continue; 268 268 269 - pr_info(" PE[%3d] PESTA: %016llx\n", i, data->pestA[i]); 270 - pr_info(" PESTB: %016llx\n", data->pestB[i]); 269 + pr_info(" PE[%3d] A/B: %016llx %016llx\n", 270 + i, data->pestA[i], data->pestB[i]); 271 271 } 272 272 } 273 273