1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * Copyright (C) 2001,2002,2003 Broadcom Corporation
5 #include <linux/sched.h>
6 #include <asm/mipsregs.h>
7 #include <asm/sibyte/sb1250.h>
8 #include <asm/sibyte/sb1250_regs.h>
10 #if !defined(CONFIG_SIBYTE_BUS_WATCHER) || defined(CONFIG_SIBYTE_BW_TRACE)
12 #include <asm/sibyte/sb1250_scd.h>
16 * We'd like to dump the L2_ECC_TAG register on errors, but errata make
17 * that unsafe... So for now we don't. (BCM1250/BCM112x erratum SOC-48.)
19 #undef DUMP_L2_ECC_TAG_ON_ERROR
23 /* XXX should come from config1 XXX */
24 #define SB1_CACHE_INDEX_MASK 0x1fe0
26 #define CP0_ERRCTL_RECOVERABLE (1 << 31)
27 #define CP0_ERRCTL_DCACHE (1 << 30)
28 #define CP0_ERRCTL_ICACHE (1 << 29)
29 #define CP0_ERRCTL_MULTIBUS (1 << 23)
30 #define CP0_ERRCTL_MC_TLB (1 << 15)
31 #define CP0_ERRCTL_MC_TIMEOUT (1 << 14)
33 #define CP0_CERRI_TAG_PARITY (1 << 29)
34 #define CP0_CERRI_DATA_PARITY (1 << 28)
35 #define CP0_CERRI_EXTERNAL (1 << 26)
37 #define CP0_CERRI_IDX_VALID(c) (!((c) & CP0_CERRI_EXTERNAL))
38 #define CP0_CERRI_DATA (CP0_CERRI_DATA_PARITY)
40 #define CP0_CERRD_MULTIPLE (1 << 31)
41 #define CP0_CERRD_TAG_STATE (1 << 30)
42 #define CP0_CERRD_TAG_ADDRESS (1 << 29)
43 #define CP0_CERRD_DATA_SBE (1 << 28)
44 #define CP0_CERRD_DATA_DBE (1 << 27)
45 #define CP0_CERRD_EXTERNAL (1 << 26)
46 #define CP0_CERRD_LOAD (1 << 25)
47 #define CP0_CERRD_STORE (1 << 24)
48 #define CP0_CERRD_FILLWB (1 << 23)
49 #define CP0_CERRD_COHERENCY (1 << 22)
50 #define CP0_CERRD_DUPTAG (1 << 21)
52 #define CP0_CERRD_DPA_VALID(c) (!((c) & CP0_CERRD_EXTERNAL))
53 #define CP0_CERRD_IDX_VALID(c) \
54 (((c) & (CP0_CERRD_LOAD | CP0_CERRD_STORE)) ? (!((c) & CP0_CERRD_EXTERNAL)) : 0)
55 #define CP0_CERRD_CAUSES \
56 (CP0_CERRD_LOAD | CP0_CERRD_STORE | CP0_CERRD_FILLWB | CP0_CERRD_COHERENCY | CP0_CERRD_DUPTAG)
57 #define CP0_CERRD_TYPES \
58 (CP0_CERRD_TAG_STATE | CP0_CERRD_TAG_ADDRESS | CP0_CERRD_DATA_SBE | CP0_CERRD_DATA_DBE | CP0_CERRD_EXTERNAL)
59 #define CP0_CERRD_DATA (CP0_CERRD_DATA_SBE | CP0_CERRD_DATA_DBE)
61 static uint32_t extract_ic(unsigned short addr
, int data
);
62 static uint32_t extract_dc(unsigned short addr
, int data
);
64 static inline void breakout_errctl(unsigned int val
)
66 if (val
& CP0_ERRCTL_RECOVERABLE
)
67 printk(" recoverable");
68 if (val
& CP0_ERRCTL_DCACHE
)
70 if (val
& CP0_ERRCTL_ICACHE
)
72 if (val
& CP0_ERRCTL_MULTIBUS
)
73 printk(" multiple-buserr");
77 static inline void breakout_cerri(unsigned int val
)
79 if (val
& CP0_CERRI_TAG_PARITY
)
80 printk(" tag-parity");
81 if (val
& CP0_CERRI_DATA_PARITY
)
82 printk(" data-parity");
83 if (val
& CP0_CERRI_EXTERNAL
)
88 static inline void breakout_cerrd(unsigned int val
)
90 switch (val
& CP0_CERRD_CAUSES
) {
97 case CP0_CERRD_FILLWB
:
100 case CP0_CERRD_COHERENCY
:
101 printk(" coherency,");
103 case CP0_CERRD_DUPTAG
:
107 printk(" NO CAUSE,");
110 if (!(val
& CP0_CERRD_TYPES
))
113 if (val
& CP0_CERRD_MULTIPLE
)
114 printk(" multi-err");
115 if (val
& CP0_CERRD_TAG_STATE
)
116 printk(" tag-state");
117 if (val
& CP0_CERRD_TAG_ADDRESS
)
118 printk(" tag-address");
119 if (val
& CP0_CERRD_DATA_SBE
)
121 if (val
& CP0_CERRD_DATA_DBE
)
123 if (val
& CP0_CERRD_EXTERNAL
)
129 #ifndef CONFIG_SIBYTE_BUS_WATCHER
131 static void check_bus_watcher(void)
133 uint32_t status
, l2_err
, memio_err
;
134 #ifdef DUMP_L2_ECC_TAG_ON_ERROR
138 /* Destructive read, clears register and interrupt */
139 status
= csr_in32(IOADDR(A_SCD_BUS_ERR_STATUS
));
140 /* Bit 31 is always on, but there's no #define for that */
141 if (status
& ~(1UL << 31)) {
142 l2_err
= csr_in32(IOADDR(A_BUS_L2_ERRORS
));
143 #ifdef DUMP_L2_ECC_TAG_ON_ERROR
144 l2_tag
= in64(IOADDR(A_L2_ECC_TAG
));
146 memio_err
= csr_in32(IOADDR(A_BUS_MEM_IO_ERRORS
));
147 printk("Bus watcher error counters: %08x %08x\n", l2_err
, memio_err
);
148 printk("\nLast recorded signature:\n");
149 printk("Request %02x from %d, answered by %d with Dcode %d\n",
150 (unsigned int)(G_SCD_BERR_TID(status
) & 0x3f),
151 (int)(G_SCD_BERR_TID(status
) >> 6),
152 (int)G_SCD_BERR_RID(status
),
153 (int)G_SCD_BERR_DCODE(status
));
154 #ifdef DUMP_L2_ECC_TAG_ON_ERROR
155 printk("Last L2 tag w/ bad ECC: %016llx\n", l2_tag
);
158 printk("Bus watcher indicates no error\n");
162 extern void check_bus_watcher(void);
165 asmlinkage
void sb1_cache_error(void)
167 uint32_t errctl
, cerr_i
, cerr_d
, dpalo
, dpahi
, eepc
, res
;
168 unsigned long long cerr_dpa
;
170 #ifdef CONFIG_SIBYTE_BW_TRACE
171 /* Freeze the trace buffer now */
172 csr_out32(M_SCD_TRACE_CFG_FREEZE
, IOADDR(A_SCD_TRACE_CFG
));
173 printk("Trace buffer frozen\n");
176 printk("Cache error exception on CPU %x:\n",
177 (read_c0_prid() >> 25) & 0x7);
179 __asm__
__volatile__ (
185 " mfc0 %2, $27, 1\n\t"
186 " dmfc0 $1, $27, 3\n\t"
187 " dsrl32 %3, $1, 0 \n\t"
188 " sll %4, $1, 0 \n\t"
191 : "=r" (errctl
), "=r" (cerr_i
), "=r" (cerr_d
),
192 "=r" (dpahi
), "=r" (dpalo
), "=r" (eepc
));
194 cerr_dpa
= (((uint64_t)dpahi
) << 32) | dpalo
;
195 printk(" c0_errorepc == %08x\n", eepc
);
196 printk(" c0_errctl == %08x", errctl
);
197 breakout_errctl(errctl
);
198 if (errctl
& CP0_ERRCTL_ICACHE
) {
199 printk(" c0_cerr_i == %08x", cerr_i
);
200 breakout_cerri(cerr_i
);
201 if (CP0_CERRI_IDX_VALID(cerr_i
)) {
202 /* Check index of EPC, allowing for delay slot */
203 if (((eepc
& SB1_CACHE_INDEX_MASK
) != (cerr_i
& SB1_CACHE_INDEX_MASK
)) &&
204 ((eepc
& SB1_CACHE_INDEX_MASK
) != ((cerr_i
& SB1_CACHE_INDEX_MASK
) - 4)))
205 printk(" cerr_i idx doesn't match eepc\n");
207 res
= extract_ic(cerr_i
& SB1_CACHE_INDEX_MASK
,
208 (cerr_i
& CP0_CERRI_DATA
) != 0);
210 printk("...didn't see indicated icache problem\n");
214 if (errctl
& CP0_ERRCTL_DCACHE
) {
215 printk(" c0_cerr_d == %08x", cerr_d
);
216 breakout_cerrd(cerr_d
);
217 if (CP0_CERRD_DPA_VALID(cerr_d
)) {
218 printk(" c0_cerr_dpa == %010llx\n", cerr_dpa
);
219 if (!CP0_CERRD_IDX_VALID(cerr_d
)) {
220 res
= extract_dc(cerr_dpa
& SB1_CACHE_INDEX_MASK
,
221 (cerr_d
& CP0_CERRD_DATA
) != 0);
223 printk("...didn't see indicated dcache problem\n");
225 if ((cerr_dpa
& SB1_CACHE_INDEX_MASK
) != (cerr_d
& SB1_CACHE_INDEX_MASK
))
226 printk(" cerr_d idx doesn't match cerr_dpa\n");
228 res
= extract_dc(cerr_d
& SB1_CACHE_INDEX_MASK
,
229 (cerr_d
& CP0_CERRD_DATA
) != 0);
231 printk("...didn't see indicated problem\n");
240 * Calling panic() when a fatal cache error occurs scrambles the
241 * state of the system (and the cache), making it difficult to
242 * investigate after the fact. However, if you just stall the CPU,
243 * the other CPU may keep on running, which is typically very
246 #ifdef CONFIG_SB1_CERR_STALL
250 panic("unhandled cache error");
255 /* Parity lookup table. */
256 static const uint8_t parity
[256] = {
257 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0,
258 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1,
259 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1,
260 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0,
261 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1,
262 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0,
263 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0,
264 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1,
265 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1,
266 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0,
267 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0,
268 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1,
269 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0,
270 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1,
271 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1,
272 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0
275 /* Masks to select bits for Hamming parity, mask_72_64[i] for bit[i] */
276 static const uint64_t mask_72_64
[8] = {
277 0x0738C808099264FFULL
,
278 0x38C808099264FF07ULL
,
279 0xC808099264FF0738ULL
,
280 0x08099264FF0738C8ULL
,
281 0x099264FF0738C808ULL
,
282 0x9264FF0738C80809ULL
,
283 0x64FF0738C8080992ULL
,
284 0xFF0738C808099264ULL
287 /* Calculate the parity on a range of bits */
288 static char range_parity(uint64_t dword
, int max
, int min
)
293 for (i
=max
-min
; i
>=0; i
--) {
301 /* Calculate the 4-bit even byte-parity for an instruction */
302 static unsigned char inst_parity(uint32_t word
)
306 for (j
=0; j
<4; j
++) {
307 char byte_parity
= 0;
308 for (i
=0; i
<8; i
++) {
309 if (word
& 0x80000000)
310 byte_parity
= !byte_parity
;
314 parity
|= byte_parity
;
319 static uint32_t extract_ic(unsigned short addr
, int data
)
323 uint32_t taghi
, taglolo
, taglohi
;
324 unsigned long long taglo
, va
;
329 printk("Icache index 0x%04x ", addr
);
330 for (way
= 0; way
< 4; way
++) {
331 /* Index-load-tag-I */
332 __asm__
__volatile__ (
334 " .set noreorder \n\t"
337 " cache 4, 0(%3) \n\t"
339 " dmfc0 $1, $28 \n\t"
340 " dsrl32 %1, $1, 0 \n\t"
341 " sll %2, $1, 0 \n\t"
343 : "=r" (taghi
), "=r" (taglohi
), "=r" (taglolo
)
344 : "r" ((way
<< 13) | addr
));
346 taglo
= ((unsigned long long)taglohi
<< 32) | taglolo
;
348 lru
= (taghi
>> 14) & 0xff;
349 printk("[Bank %d Set 0x%02x] LRU > %d %d %d %d > MRU\n",
350 ((addr
>> 5) & 0x3), /* bank */
351 ((addr
>> 7) & 0x3f), /* index */
357 va
= (taglo
& 0xC0000FFFFFFFE000ULL
) | addr
;
358 if ((taglo
& (1 << 31)) && (((taglo
>> 62) & 0x3) == 3))
359 va
|= 0x3FFFF00000000000ULL
;
360 valid
= ((taghi
>> 29) & 1);
362 tlo_tmp
= taglo
& 0xfff3ff;
363 if (((taglo
>> 10) & 1) ^ range_parity(tlo_tmp
, 23, 0)) {
364 printk(" ** bad parity in VTag0/G/ASID\n");
365 res
|= CP0_CERRI_TAG_PARITY
;
367 if (((taglo
>> 11) & 1) ^ range_parity(taglo
, 63, 24)) {
368 printk(" ** bad parity in R/VTag1\n");
369 res
|= CP0_CERRI_TAG_PARITY
;
372 if (valid
^ ((taghi
>> 27) & 1)) {
373 printk(" ** bad parity for valid bit\n");
374 res
|= CP0_CERRI_TAG_PARITY
;
376 printk(" %d [VA %016llx] [Vld? %d] raw tags: %08X-%016llX\n",
377 way
, va
, valid
, taghi
, taglo
);
380 uint32_t datahi
, insta
, instb
;
384 /* (hit all banks and ways) */
385 for (offset
= 0; offset
< 4; offset
++) {
386 /* Index-load-data-I */
387 __asm__
__volatile__ (
389 " .set noreorder\n\t"
392 " cache 6, 0(%3) \n\t"
393 " mfc0 %0, $29, 1\n\t"
394 " dmfc0 $1, $28, 1\n\t"
395 " dsrl32 %1, $1, 0 \n\t"
396 " sll %2, $1, 0 \n\t"
398 : "=r" (datahi
), "=r" (insta
), "=r" (instb
)
399 : "r" ((way
<< 13) | addr
| (offset
<< 3)));
400 predecode
= (datahi
>> 8) & 0xff;
401 if (((datahi
>> 16) & 1) != (uint32_t)range_parity(predecode
, 7, 0)) {
402 printk(" ** bad parity in predecode\n");
403 res
|= CP0_CERRI_DATA_PARITY
;
405 /* XXXKW should/could check predecode bits themselves */
406 if (((datahi
>> 4) & 0xf) ^ inst_parity(insta
)) {
407 printk(" ** bad parity in instruction a\n");
408 res
|= CP0_CERRI_DATA_PARITY
;
410 if ((datahi
& 0xf) ^ inst_parity(instb
)) {
411 printk(" ** bad parity in instruction b\n");
412 res
|= CP0_CERRI_DATA_PARITY
;
414 printk(" %05X-%08X%08X", datahi
, insta
, instb
);
422 /* Compute the ECC for a data doubleword */
423 static uint8_t dc_ecc(uint64_t dword
)
431 for (i
= 7; i
>= 0; i
--)
434 t
= dword
& mask_72_64
[i
];
435 w
= (uint32_t)(t
>> 32);
436 p
^= (parity
[w
>>24] ^ parity
[(w
>>16) & 0xFF]
437 ^ parity
[(w
>>8) & 0xFF] ^ parity
[w
& 0xFF]);
438 w
= (uint32_t)(t
& 0xFFFFFFFF);
439 p
^= (parity
[w
>>24] ^ parity
[(w
>>16) & 0xFF]
440 ^ parity
[(w
>>8) & 0xFF] ^ parity
[w
& 0xFF]);
450 static struct dc_state dc_states
[] = {
460 #define DC_TAG_VALID(state) \
461 (((state) == 0x0) || ((state) == 0xf) || ((state) == 0x13) || \
462 ((state) == 0x19) || ((state) == 0x16) || ((state) == 0x1c))
464 static char *dc_state_str(unsigned char state
)
466 struct dc_state
*dsc
= dc_states
;
467 while (dsc
->val
!= 0xff) {
468 if (dsc
->val
== state
)
475 static uint32_t extract_dc(unsigned short addr
, int data
)
479 uint32_t taghi
, taglolo
, taglohi
;
480 unsigned long long taglo
, pa
;
484 printk("Dcache index 0x%04x ", addr
);
485 for (way
= 0; way
< 4; way
++) {
486 __asm__
__volatile__ (
488 " .set noreorder\n\t"
491 " cache 5, 0(%3)\n\t" /* Index-load-tag-D */
492 " mfc0 %0, $29, 2\n\t"
493 " dmfc0 $1, $28, 2\n\t"
494 " dsrl32 %1, $1, 0\n\t"
497 : "=r" (taghi
), "=r" (taglohi
), "=r" (taglolo
)
498 : "r" ((way
<< 13) | addr
));
500 taglo
= ((unsigned long long)taglohi
<< 32) | taglolo
;
501 pa
= (taglo
& 0xFFFFFFE000ULL
) | addr
;
503 lru
= (taghi
>> 14) & 0xff;
504 printk("[Bank %d Set 0x%02x] LRU > %d %d %d %d > MRU\n",
505 ((addr
>> 11) & 0x2) | ((addr
>> 5) & 1), /* bank */
506 ((addr
>> 6) & 0x3f), /* index */
512 state
= (taghi
>> 25) & 0x1f;
513 valid
= DC_TAG_VALID(state
);
514 printk(" %d [PA %010llx] [state %s (%02x)] raw tags: %08X-%016llX\n",
515 way
, pa
, dc_state_str(state
), state
, taghi
, taglo
);
517 if (((taglo
>> 11) & 1) ^ range_parity(taglo
, 39, 26)) {
518 printk(" ** bad parity in PTag1\n");
519 res
|= CP0_CERRD_TAG_ADDRESS
;
521 if (((taglo
>> 10) & 1) ^ range_parity(taglo
, 25, 13)) {
522 printk(" ** bad parity in PTag0\n");
523 res
|= CP0_CERRD_TAG_ADDRESS
;
526 res
|= CP0_CERRD_TAG_STATE
;
530 uint32_t datalohi
, datalolo
, datahi
;
531 unsigned long long datalo
;
535 for (offset
= 0; offset
< 4; offset
++) {
536 /* Index-load-data-D */
537 __asm__
__volatile__ (
539 " .set noreorder\n\t"
542 " cache 7, 0(%3)\n\t" /* Index-load-data-D */
543 " mfc0 %0, $29, 3\n\t"
544 " dmfc0 $1, $28, 3\n\t"
545 " dsrl32 %1, $1, 0 \n\t"
546 " sll %2, $1, 0 \n\t"
548 : "=r" (datahi
), "=r" (datalohi
), "=r" (datalolo
)
549 : "r" ((way
<< 13) | addr
| (offset
<< 3)));
550 datalo
= ((unsigned long long)datalohi
<< 32) | datalolo
;
551 ecc
= dc_ecc(datalo
);
554 bad_ecc
|= 1 << (3-offset
);
556 bits
= hweight8(ecc
);
557 res
|= (bits
== 1) ? CP0_CERRD_DATA_SBE
: CP0_CERRD_DATA_DBE
;
559 printk(" %02X-%016llX", datahi
, datalo
);
563 printk(" dwords w/ bad ECC: %d %d %d %d\n",
564 !!(bad_ecc
& 8), !!(bad_ecc
& 4),
565 !!(bad_ecc
& 2), !!(bad_ecc
& 1));