1 /* *********************************************************************
2 * SB1250 Board Support Package
4 * L2 Cache Diagnostic File: diag_l2cache.S
6 * A diagnostic for the L2 cache. On pass2 parts, this diag
7 * will disable portions of the cache as necessary.
9 * Author: Zongbo Chen (zongbo@broadcom.com)
11 *********************************************************************
13 * Copyright 2000,2001,2002,2003
14 * Broadcom Corporation. All rights reserved.
16 * This software is furnished under license and may be used and
17 * copied only in accordance with the following terms and
18 * conditions. Subject to these conditions, you may download,
19 * copy, install, use, modify and distribute modified or unmodified
20 * copies of this software in source and/or binary form. No title
21 * or ownership is transferred hereby.
23 * 1) Any source code used, modified or distributed must reproduce
24 * and retain this copyright notice and list of conditions
25 * as they appear in the source file.
27 * 2) No right is granted to use any trade name, trademark, or
28 * logo of Broadcom Corporation. The "Broadcom Corporation"
29 * name may not be used to endorse or promote products derived
30 * from this software without the prior written permission of
31 * Broadcom Corporation.
33 * 3) THIS SOFTWARE IS PROVIDED "AS-IS" AND ANY EXPRESS OR
34 * IMPLIED WARRANTIES, INCLUDING BUT NOT LIMITED TO, ANY IMPLIED
35 * WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
36 * PURPOSE, OR NON-INFRINGEMENT ARE DISCLAIMED. IN NO EVENT
37 * SHALL BROADCOM BE LIABLE FOR ANY DAMAGES WHATSOEVER, AND IN
38 * PARTICULAR, BROADCOM SHALL NOT BE LIABLE FOR DIRECT, INDIRECT,
39 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
40 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
41 * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
42 * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
43 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
44 * TORT (INCLUDING NEGLIGENCE OR OTHERWISE), EVEN IF ADVISED OF
45 * THE POSSIBILITY OF SUCH DAMAGE.
46 ********************************************************************* */
48 #include "sb1250_defs.h" /* include definitions for MAKEMASK etc. */
49 #include "diag_l1cache.h"
50 #include "sb1250_l2c.h"
51 #include "sb1250_scd.h"
52 #include "sb1250_regs.h"
54 #include "diag_l2util.h"
55 #include "mipsmacros.h"
56 #include "sb1250_genbus.h"
57 #include "bsp_config.h"
59 /*#define _SIMULATOR_*/
62 * This lets us override the WID by poking values into our PromICE
65 #undef A_SCD_SYSTEM_REVISION
66 #define A_SCD_SYSTEM_REVISION 0x1FC00508
69 /* We'll always define pass2. This routine will not be run unless
70 we're on a pass2 cpu */
72 #ifndef _SB1250_PASS2_
73 #define _SB1250_PASS2_
77 #define C0_DataLo C0_TAGLO
78 #define C0_DataHi C0_TAGHI
79 #define C0_TagLo C0_TAGLO
80 #define C0_TagHi C0_TAGHI
82 #define DMTC0s(reg, c0reg, sel) \
83 dmtc0 reg, c0reg, sel; \
87 #define DMFC0s(reg, c0reg, sel) \
88 dmfc0 reg, c0reg, sel; \
92 #define MTC0s(reg, c0reg, sel) \
93 mtc0 reg, c0reg, sel; \
97 #define MFC0s(reg, c0reg, sel) \
98 mfc0 reg, c0reg, sel; \
102 #define DMFC0(reg, c0reg ) \
107 #define DMTC0(reg, c0reg) \
112 #undef MFC0 /* avoid redef'n of mipsmacros.h version */
113 #define MFC0(reg, c0reg ) \
118 #undef MTC0 /* avoid redef'n of mipsmacros.h version */
119 #define MTC0(reg, c0reg) \
125 #define LINES_TO_TEST 2
126 #define LOOP_COUNT 0x16
128 #define TEST_ALL_LINES
129 #define LOOP_COUNT 0x1600000
133 #define TOTAL_BLKS 16
135 #define XKPHYS_C_COH 0x8000000000000000
136 #define XKPHYS_U_ACC 0xb800000000000000
137 #define XKPHYS_C_COH_EXC 0xa000000000000000
138 #define XKPHYS_UNC 0x9000000000000000
140 #define L2_RAM_BASE_ADDR 0x00D0180000
141 #define L2M_READ_RAW_ACCESS 0x00200000
142 #define L2M_WRITE_LAST_ECC 0x00400000
143 #define L2M_WRITE_TAG 0x00200000
144 #define L2M_WRITE_TAG_LAST_ECC 0x00600000
146 #undef PHYS_TO_XKPHYS /* avoid redef'n of sbmips.h version */
147 #define PHYS_TO_XKPHYS(x) (0x8000000000000000|(x))
148 #define PHYS_TO_XKPHYS_UNC(x) (0x9000000000000000|(x))
150 #define C0_Status $12
151 #undef C0_SR /* avoid redef'n of sbmips.h version */
152 #define C0_SR C0_Status
153 #define C0_Debug C0_DEBUG
154 #define SR_KX (1 << 7)
162 #define LED_CHAR0 (32+8*3)
163 #define LED_CHAR1 (32+8*2)
164 #define LED_CHAR2 (32+8*1)
165 #define LED_CHAR3 (32+8*0)
167 #define MAC2_HASH0 0x10066240
169 #define SET_LEDS(leds, temp0, temp1) \
170 li temp0, PHYS_TO_K1(LEDS_PHYS); \
171 srl temp1, leds, 24; \
172 and temp1, temp1, 0xFF; \
173 sb temp1, LED_CHAR0(temp0); \
174 srl temp1, leds, 16; \
175 and temp1, temp1, 0xFF; \
176 sb temp1, LED_CHAR1(temp0); \
177 srl temp1, leds, 8; \
178 and temp1, temp1, 0xFF; \
179 sb temp1, LED_CHAR2(temp0); \
180 and temp1, leds, 0xFF; \
181 sb temp1, LED_CHAR3(temp0)
184 #define SET_LEDS_HI(leds, temp0, temp1) \
185 li temp0, PHYS_TO_XKPHYS_UNC(LEDS_PHYS); \
186 srl temp1, leds, 8; \
187 and temp1, temp1, 0xFF; \
188 sb temp1, LED_CHAR0(temp0); \
189 and temp1, leds, 0xFF; \
190 sb temp1, LED_CHAR1(temp0)
192 #define SET_LEDS_LO(leds, temp0, temp1) \
193 li temp0, PHYS_TO_XKPHYS_UNC(LEDS_PHYS); \
194 srl temp1, leds, 8; \
195 and temp1, temp1, 0xFF; \
196 sb temp1, LED_CHAR2(temp0); \
197 and temp1, leds, 0xFF; \
198 sb temp1, LED_CHAR3(temp0)
201 #define DATA_ECC_TEST
204 #define LED_CHAR0 (32+8*3)
205 #define LED_CHAR1 (32+8*2)
206 #define LED_CHAR2 (32+8*1)
207 #define LED_CHAR3 (32+8*0)
215 #define DISAB_TOP 0x800
216 #define DISAB_BOT 0x400
217 #define DISAB_RGT 0x200
218 #define DISAB_LFT 0x100
219 #define FAILURE 0xFFFFFFFF /* complete failure, cannot continue */
225 * This table maps failure modes to "disable" masks.
226 * For each combination of failed quadrants, disable half
227 * the cache that contains those quadrants. Note that since
228 * we can only disable top OR bottom and left OR right, not
229 * all combinations will work and will yield diagnostic failure.
232 .word 0 /* Entire cache functional */
233 .word DISAB_LFT /* BR=Good TR=Good BL=Good TL=BAD */
234 .word DISAB_LFT /* BR=Good TR=Good BL=BAD TL=Good */
235 .word DISAB_LFT /* BR=Good TR=Good BL=BAD TL=BAD */
236 .word DISAB_RGT /* BR=Good TR=BAD BL=Good TL=Good */
237 .word DISAB_TOP|DISAB_RGT /* BR=Good TR=BAD BL=Good TL=BAD */
238 .word DISAB_RGT|DISAB_BOT /* BR=Good TR=BAD BL=BAD TL=Good */
239 .word DISAB_LFT|DISAB_TOP /* BR=Good TR=BAD BL=BAD TL=BAD */
240 .word DISAB_RGT /* BR=BAD TR=Good BL=Good TL=Good */
241 .word DISAB_LFT|DISAB_BOT /* BR=BAD TR=Good BL=Good TL=BAD */
242 .word DISAB_BOT|DISAB_RGT /* BR=BAD TR=Good BL=BAD TL=Good */
243 .word DISAB_LFT|DISAB_BOT /* BR=BAD TR=Good BL=BAD TL=BAD */
244 .word DISAB_RGT /* BR=BAD TR=BAD BL=Good TL=Good */
245 .word DISAB_RGT|DISAB_TOP /* BR=BAD TR=BAD BL=Good TL=BAD */
246 .word DISAB_RGT|DISAB_BOT /* BR=BAD TR=BAD BL=BAD TL=Good */
247 .word FAILURE /* BR=BAD TR=BAD BL=BAD TL=BAD */
257 * Don't do any of this diagnostic unless we're greater than PASS2 SB1250.
260 la t0,PHYS_TO_K1(A_SCD_SYSTEM_REVISION)
261 ld t0,0(t0) /* get system revision */
263 and t1,t0,(0xF0FF << S_SYS_PART) /* ignore CPU count */
264 li t2,V_SYS_PART(0x1050) /* test against ignored count */
265 bne t2,t1,2f /* go if not a sb1x50 */
268 and t1,t0,M_SYS_REVISION
269 li t2,V_SYS_REVISION(K_SYS_REVISION_PASS3)
270 bge t1,t2,3f /* run diags if >= pass3 (0x20) */
272 li t2,V_SYS_REVISION(K_SYS_REVISION_PASS2)
273 bge t1,t2,1f /* go if pass2 or better (>= 0x03) */
278 1: dsrl t1,t0,S_SYS_WID /* Get Wafer ID register */
279 bne t1,zero,2b /* leave if register is set (no diags) */
280 /* Otherwise, run the diagnostic if the wafer ID is not set. */
281 /* Special case of A6 parts (revid==4 && wid!=0) will NOT run diags */
286 dli t8, (('J'<<24)|('U'<<16)|('M'<<8)|'P')
301 dli t8, (('C'<<24)|('A'<<16)|('S'<<8)|'H')
311 /* set up for 64 bit addressing */
316 MFC0s (t2,C0_Debug,2)
318 MTC0s (t1,C0_Debug,2)
320 /* initialize the cache */
321 jal sb1250_l2cache_init1
323 /* use mac2 hash0 reg as result reg, init it to 0 */
324 li t0, PHYS_TO_XKPHYS_UNC(MAC2_HASH0)
328 /* init quarter number to 0 */
334 jal l2dtest_bg_rw_uac
339 bne t0, $0, test_fail
341 /*bne v0, $0, data_fail*/
356 bne t0, $0, test_fail
358 /*bne v0, $0, ecc_fail*/
377 bne t0, $0, test_fail
379 /*bne v0, $0, tag_fail*/
393 bne t0, $0, test_fail
395 /*bne v0, $0, tagecc_fail*/
411 li t1, PHYS_TO_XKPHYS_UNC(MAC2_HASH0)
419 bne t0, zero, next_quarter
429 * Disable the bad quadrant(s) of the cache
432 li t1,PHYS_TO_K1(MAC2_HASH0)
434 LOADREL(t2,disab_table)
435 sll t1,2 /* make a word offset */
436 add t2,t2,t1 /* into the table */
437 lw t0,(t2) /* this is the disable mask */
438 blt t0,zero,diag_fail /* go if total failure */
441 li t1,PHYS_TO_K1(A_L2_CACHE_DISABLE)
442 or t1,t1,t0 /* OR in appropriate disable bits */
444 #ifdef _SB1250_PASS2_
445 sd t0,0(t1) /* disable the cache */
447 bne t0,zero,diag_fail /* on pass1, any failure is bad */
451 MFC0s (t2,C0_Debug,2) /* turn off things we defeatured */
453 MTC0s (t1,C0_Debug,2)
457 dli t8, (('D'<<24)|('O'<<16)|('N'<<8)|'E')
467 li t1,PHYS_TO_K1(MAC2_HASH0)
472 add t1,t1,('A'-('9'+1))
474 dli t8, (('L'<<24)|('2'<<16)|(' '<<8)|0)
485 #ifdef TEST_ALL_LINES
486 #define L2_LINES_PER_BLOCK 256
488 #define L2_LINES_PER_BLOCK LINES_TO_TEST
491 #define R_WRBC_RBLK s1
492 #define R_WRBC_LINE s2
493 #define R_WRBC_NEXT_WAY s3
494 #define R_WRBC_RADDR t5
495 #define R_WRBC_SCRATCH0 t6
496 #define R_WRBC_SCRATCH1 t7
497 #define R_WRBC_SCRATCH2 s6
498 #define R_WRBC_SCRATCH3 s7
500 #define R_PASS_FAIL t4
502 /********************************************************
503 * l2test_wr_uac_allblocks *
504 * Write all blocks of the L2 using uncached *
505 * accelerated writes in mgmt mode. *
506 * This also marks all blocks as valid and dirty. *
508 ********************************************************/
510 #define R_BG_PAT0_0 a0
511 #define R_BG_PAT0_1 a1
512 #define R_BG_PAT0_2 a2
513 #define R_BG_PAT0_3 a3
515 #define R_BG_PAT1_0 t0
516 #define R_BG_PAT1_1 t1
518 #define R_BG_PAT1_2 t2
519 #define R_BG_PAT1_3 t3
524 #define R_PATTERN_IND s0
526 #define R_BG_NEXT_WAY s3
527 #define R_BG_BLOCK s1
528 #define R_BG_WADDR t5
529 #define R_BG_RADDR t5
531 #define R_BG_SCRATCH0 t6
532 #define R_BG_SCRATCH1 t7
533 #define R_BG_SCRATCH2 t8
534 #define R_BG_SCRATCH3 t9
535 #define R_BG_SCRATCH4 s6
536 #define R_BG_SCRATCH5 s7
538 #define R_ERR_TABLE_0 v0
539 #define R_ERR_TABLE_1 v1
540 #define R_ERR_TABLE_2 s4
541 #define R_ERR_TABLE_3 s5
543 #define DATA_PATTERN0_0 0
544 #define DATA_PATTERN0_1 0
545 #define DATA_PATTERN0_2 0
546 #define DATA_PATTERN0_3 0
547 #define PATTERN0_INV0 0
548 #define PATTERN0_INV1 0
550 #define DATA_PATTERN1_0 0xffffffffffffffff
551 #define DATA_PATTERN1_1 0xffffffffffffffff
552 #define DATA_PATTERN1_2 0xffffffffffffffff
553 #define DATA_PATTERN1_3 0xffffffffffffffff
554 #define PATTERN1_INV0 0xffffffffffffffff
555 #define PATTERN1_INV1 0xffffffffffffffff
557 #define DATA_PATTERN2_0 0xffffffffffffffff
558 #define DATA_PATTERN2_1 0xffffffffffffffff
559 #define DATA_PATTERN2_2 0xffffffffffffffff
560 #define DATA_PATTERN2_3 0xffffffffffffffff
561 #define PATTERN2_INV0 0
562 #define PATTERN2_INV1 0xffffffffffffffff
564 #define DATA_PATTERN3_0 0x5555555555555555
565 #define DATA_PATTERN3_1 0x5555555555555555
566 #define DATA_PATTERN3_2 0x5555555555555555
567 #define DATA_PATTERN3_3 0x5555555555555555
568 #define PATTERN3_INV0 0
569 #define PATTERN3_INV1 0
571 #define DATA_PATTERN4_0 0x3333333333333333
572 #define DATA_PATTERN4_1 0x3333333333333333
573 #define DATA_PATTERN4_2 0x3333333333333333
574 #define DATA_PATTERN4_3 0x3333333333333333
575 #define PATTERN4_INV0 0
576 #define PATTERN4_INV1 0
578 #define DATA_PATTERN5_0 0x0f0f0f0f0f0f0f0f
579 #define DATA_PATTERN5_1 0x0f0f0f0f0f0f0f0f
580 #define DATA_PATTERN5_2 0x0f0f0f0f0f0f0f0f
581 #define DATA_PATTERN5_3 0x0f0f0f0f0f0f0f0f
582 #define PATTERN5_INV0 0
583 #define PATTERN5_INV1 0
585 #define DATA_PATTERN6_0 0x00ff00ff00ff00ff
586 #define DATA_PATTERN6_1 0x00ff00ff00ff00ff
587 #define DATA_PATTERN6_2 0x00ff00ff00ff00ff
588 #define DATA_PATTERN6_3 0x00ff00ff00ff00ff
589 #define PATTERN6_INV0 0
590 #define PATTERN6_INV1 0
592 #define DATA_PATTERN7_0 0x0000ffff0000ffff
593 #define DATA_PATTERN7_1 0x0000ffff0000ffff
594 #define DATA_PATTERN7_2 0x0000ffff0000ffff
595 #define DATA_PATTERN7_3 0x0000ffff0000ffff
596 #define PATTERN7_INV0 0
597 #define PATTERN7_INV1 0
599 #define DATA_PATTERN8_0 0x00000000ffffffff
600 #define DATA_PATTERN8_1 0x00000000ffffffff
601 #define DATA_PATTERN8_2 0x00000000ffffffff
602 #define DATA_PATTERN8_3 0x00000000ffffffff
603 #define PATTERN8_INV0 0
604 #define PATTERN8_INV1 0
606 #define DATA_PATTERN9_0 0xffffffffffffffff
607 #define DATA_PATTERN9_1 0x0000000000000000
608 #define DATA_PATTERN9_2 0xffffffffffffffff
609 #define DATA_PATTERN9_3 0x0000000000000000
610 #define PATTERN9_INV0 0
611 #define PATTERN9_INV1 0
613 #define DATA_PATTERNa_0 0xffffffffffffffff
614 #define DATA_PATTERNa_1 0xffffffffffffffff
615 #define DATA_PATTERNa_2 0x0000000000000000
616 #define DATA_PATTERNa_3 0x0000000000000000
617 #define PATTERNa_INV0 0
618 #define PATTERNa_INV1 0
620 #undef MAX_PATTERN /* avoid redef'n of diag_l1cache.h version */
621 #define MAX_PATTERN 11
623 #define BG_WRITE_PAT(addr,pattern0,pattern1,pattern2,pattern3,inv0,inv1) \
624 li R_BG_SCRATCH0, 2; \
625 1: sd pattern0, 0(addr); \
626 sd pattern1, 8(addr); \
627 sd pattern2, 16(addr); \
628 sd pattern3, 24(addr); \
629 cache L1CACHEOP(L1C_D,L1C_OP_HIT_WB_INVAL),0(addr); \
630 xor pattern0, pattern0, inv0; \
631 xor pattern1, pattern1, inv0; \
632 xor pattern2, pattern2, inv0; \
633 xor pattern3, pattern3, inv0; \
634 daddu addr, addr, R_BG_NEXT_WAY; \
635 sd pattern0, 0(addr); \
636 sd pattern1, 8(addr); \
637 sd pattern2, 16(addr); \
638 sd pattern3, 24(addr); \
639 cache L1CACHEOP(L1C_D,L1C_OP_HIT_WB_INVAL),0(addr); \
640 xor pattern0, pattern0, inv1; \
641 xor pattern1, pattern1, inv1; \
642 xor pattern2, pattern2, inv1; \
643 xor pattern3, pattern3, inv1; \
644 addi R_BG_SCRATCH0, R_BG_SCRATCH0, -1; \
645 bne R_BG_SCRATCH0, zero, 1b; \
646 daddu addr, addr, R_BG_NEXT_WAY; \
647 li R_BG_SCRATCH0, -4*2*65536; \
648 dadd addr, addr, R_BG_SCRATCH0 /* next line */
650 #define BG_INVAL_L1(addr) \
651 move R_BG_SCRATCH0, addr; \
652 cache L1CACHEOP(L1C_D,L1C_OP_HITINVAL),0(R_BG_SCRATCH0); \
653 daddu R_BG_SCRATCH0, R_BG_SCRATCH0, R_BG_NEXT_WAY; \
654 cache L1CACHEOP(L1C_D,L1C_OP_HITINVAL),0(R_BG_SCRATCH0); \
655 daddu R_BG_SCRATCH0, R_BG_SCRATCH0, R_BG_NEXT_WAY; \
656 cache L1CACHEOP(L1C_D,L1C_OP_HITINVAL),0(R_BG_SCRATCH0); \
657 daddu R_BG_SCRATCH0, R_BG_SCRATCH0, R_BG_NEXT_WAY; \
658 cache L1CACHEOP(L1C_D,L1C_OP_HITINVAL),0(R_BG_SCRATCH0)
660 #define BG_CHECK_PAT(addr,pattern0,pattern1,pattern2,pattern3,inv0,inv1) \
661 li R_BG_SCRATCH4, 2; \
662 dli R_BG_SCRATCH5, L2M_READ_RAW_ACCESS; \
663 or addr, addr, R_BG_SCRATCH5; \
664 1: ld R_BG_SCRATCH0, 0(addr); \
665 ld R_BG_SCRATCH1, 8(addr); \
666 sne R_BG_SCRATCH0, R_BG_SCRATCH0, pattern0; \
667 or R_PASS_FAIL, R_PASS_FAIL, R_BG_SCRATCH0; \
668 ld R_BG_SCRATCH2, 16(addr);\
669 sne R_BG_SCRATCH1, R_BG_SCRATCH1, pattern1; \
670 or R_PASS_FAIL, R_PASS_FAIL, R_BG_SCRATCH1; \
671 ld R_BG_SCRATCH3, 24(addr);\
672 sne R_BG_SCRATCH2, R_BG_SCRATCH2, pattern2; \
673 or R_PASS_FAIL, R_PASS_FAIL, R_BG_SCRATCH2; \
674 sne R_BG_SCRATCH3, R_BG_SCRATCH3, pattern3; \
675 or R_PASS_FAIL, R_PASS_FAIL, R_BG_SCRATCH3; \
676 xor pattern0, pattern0, inv0; \
677 xor pattern1, pattern1, inv0; \
678 xor pattern2, pattern2, inv0; \
679 xor pattern3, pattern3, inv0; \
680 daddu addr, addr, R_BG_NEXT_WAY; \
681 ld R_BG_SCRATCH0, 0(addr); \
682 ld R_BG_SCRATCH1, 8(addr); \
683 sne R_BG_SCRATCH0, R_BG_SCRATCH0, pattern0; \
684 or R_PASS_FAIL, R_PASS_FAIL, R_BG_SCRATCH0; \
685 ld R_BG_SCRATCH2, 16(addr);\
686 sne R_BG_SCRATCH1, R_BG_SCRATCH1, pattern1; \
687 or R_PASS_FAIL, R_PASS_FAIL, R_BG_SCRATCH1; \
688 ld R_BG_SCRATCH3, 24(addr);\
689 sne R_BG_SCRATCH2, R_BG_SCRATCH2, pattern2; \
690 or R_PASS_FAIL, R_PASS_FAIL, R_BG_SCRATCH2; \
691 sne R_BG_SCRATCH3, R_BG_SCRATCH3, pattern3; \
692 or R_PASS_FAIL, R_PASS_FAIL, R_BG_SCRATCH3; \
693 xor pattern0, pattern0, inv1; \
694 xor pattern1, pattern1, inv1; \
695 xor pattern2, pattern2, inv1; \
696 xor pattern3, pattern3, inv1; \
697 addi R_BG_SCRATCH4, R_BG_SCRATCH4, -1; \
698 bne R_BG_SCRATCH4, zero, 1b; \
699 daddu addr, addr, R_BG_NEXT_WAY; \
700 li R_BG_SCRATCH0, -4*2*65536; \
701 dadd addr, addr, R_BG_SCRATCH0; \
702 nor R_BG_SCRATCH5, R_BG_SCRATCH5, $0; \
703 and addr, addr, R_BG_SCRATCH5
705 #define BG_CHECK_PAT1(addr,pattern0,pattern1,pattern2,pattern3,inv0,inv1) \
706 li R_BG_SCRATCH4, 2; \
707 dli R_BG_SCRATCH5, 0x00200000; \
708 or addr, addr, R_BG_SCRATCH5; \
709 1: ld R_BG_SCRATCH0, 0(addr); \
710 cache L1CACHEOP(L1C_D,L1C_OP_HITINVAL),0(addr); \
711 ld R_BG_SCRATCH0, 0(addr); \
712 ld R_BG_SCRATCH1, 8(addr); \
713 sne R_BG_SCRATCH0, R_BG_SCRATCH0, pattern0; \
714 or R_PASS_FAIL, R_PASS_FAIL, R_BG_SCRATCH0; \
715 ld R_BG_SCRATCH2, 16(addr);\
716 sne R_BG_SCRATCH1, R_BG_SCRATCH1, pattern1; \
717 or R_PASS_FAIL, R_PASS_FAIL, R_BG_SCRATCH1; \
718 ld R_BG_SCRATCH3, 24(addr);\
719 sne R_BG_SCRATCH2, R_BG_SCRATCH2, pattern2; \
720 or R_PASS_FAIL, R_PASS_FAIL, R_BG_SCRATCH2; \
721 sne R_BG_SCRATCH3, R_BG_SCRATCH3, pattern3; \
722 or R_PASS_FAIL, R_PASS_FAIL, R_BG_SCRATCH3; \
723 xor pattern0, pattern0, inv0; \
724 xor pattern1, pattern1, inv0; \
725 xor pattern2, pattern2, inv0; \
726 xor pattern3, pattern3, inv0; \
727 daddu addr, addr, R_BG_NEXT_WAY; \
728 ld R_BG_SCRATCH0, 0(addr); \
729 cache L1CACHEOP(L1C_D,L1C_OP_HITINVAL),0(addr); \
730 ld R_BG_SCRATCH0, 0(addr); \
731 ld R_BG_SCRATCH1, 8(addr); \
732 sne R_BG_SCRATCH0, R_BG_SCRATCH0, pattern0; \
733 or R_PASS_FAIL, R_PASS_FAIL, R_BG_SCRATCH0; \
734 ld R_BG_SCRATCH2, 16(addr);\
735 sne R_BG_SCRATCH1, R_BG_SCRATCH1, pattern1; \
736 or R_PASS_FAIL, R_PASS_FAIL, R_BG_SCRATCH1; \
737 ld R_BG_SCRATCH3, 24(addr);\
738 sne R_BG_SCRATCH2, R_BG_SCRATCH2, pattern2; \
739 or R_PASS_FAIL, R_PASS_FAIL, R_BG_SCRATCH2; \
740 sne R_BG_SCRATCH3, R_BG_SCRATCH3, pattern3; \
741 or R_PASS_FAIL, R_PASS_FAIL, R_BG_SCRATCH3; \
742 xor pattern0, pattern0, inv1; \
743 xor pattern1, pattern1, inv1; \
744 xor pattern2, pattern2, inv1; \
745 xor pattern3, pattern3, inv1; \
746 addi R_BG_SCRATCH4, R_BG_SCRATCH4, -1; \
747 bne R_BG_SCRATCH4, zero, 1b; \
748 daddu addr, addr, R_BG_NEXT_WAY; \
749 li R_BG_SCRATCH0, -4*2*65536; \
750 dadd addr, addr, R_BG_SCRATCH0; \
751 nor R_BG_SCRATCH5, R_BG_SCRATCH5, $0; \
752 and addr, addr, R_BG_SCRATCH5
754 #define INV_PAT(pattern0, pattern1, pattern2, pattern3) \
755 not pattern0, pattern0; \
756 not pattern1, pattern1; \
757 not pattern2, pattern2; \
758 not pattern3, pattern3
760 #define SET_ERR_TABLE(pass_fail, line) \
761 li R_BG_SCRATCH0, 0x3f; \
762 and R_BG_SCRATCH0, R_BG_SCRATCH0, line; \
763 dsll R_BG_SCRATCH0, pass_fail, R_BG_SCRATCH0; \
764 dsrl R_BG_SCRATCH1, line, 6; \
765 bne R_BG_SCRATCH1, zero, 1f; \
766 li R_BG_SCRATCH2, 1; \
767 or R_ERR_TABLE_0, R_ERR_TABLE_0, R_BG_SCRATCH0; \
770 1: bne R_BG_SCRATCH1, R_BG_SCRATCH2, 2f; \
771 li R_BG_SCRATCH2, 2; \
772 or R_ERR_TABLE_1, R_ERR_TABLE_1, R_BG_SCRATCH0; \
775 2: bne R_BG_SCRATCH1, R_BG_SCRATCH2, 3f; \
776 li R_BG_SCRATCH2, 3; \
777 or R_ERR_TABLE_2, R_ERR_TABLE_2, R_BG_SCRATCH0; \
780 3: or R_ERR_TABLE_3, R_ERR_TABLE_3, R_BG_SCRATCH0; \
784 LEAF(l2dtest_bg_rw_uac)
785 /*li R_BG_BLOCK, START_BLK */
786 sll R_BG_BLOCK, k0, 2
787 li R_BG_NEXT_WAY,0x20000
788 move R_ERR_TABLE_0, $0
789 move R_ERR_TABLE_1, $0
790 move R_ERR_TABLE_2, $0
791 move R_ERR_TABLE_3, $0
797 addi R_BG_SCRATCH2, R_BG_BLOCK, '0'
798 or R_BG_SCRATCH2, R_BG_SCRATCH2, ('D' << 8)
799 SET_LEDS_HI(R_BG_SCRATCH2, R_BG_SCRATCH0, R_BG_SCRATCH1)
802 move R_PATTERN_IND, $0
806 addi R_BG_SCRATCH2, R_PATTERN_IND, '0'
807 or R_BG_SCRATCH2, R_BG_SCRATCH2, ('P' << 8)
808 SET_LEDS_LO(R_BG_SCRATCH2, R_BG_SCRATCH0, R_BG_SCRATCH1)
811 bne R_PATTERN_IND, $0, pattern_ne_0
812 dli R_BG_PAT0_0, DATA_PATTERN0_0 # data_pattern = pattern[0]
813 dli R_BG_PAT0_1, DATA_PATTERN0_1
814 dli R_BG_PAT0_2, DATA_PATTERN0_2
815 dli R_BG_PAT0_3, DATA_PATTERN0_3
816 dli R_INV_0, PATTERN0_INV0
817 dli R_INV_1, PATTERN0_INV1
822 bne R_PATTERN_IND, R_BG_SCRATCH0, pattern_ne_1
823 dli R_BG_PAT0_0, DATA_PATTERN1_0 # data_pattern = pattern[0]
824 dli R_BG_PAT0_1, DATA_PATTERN1_1
825 dli R_BG_PAT0_2, DATA_PATTERN1_2
826 dli R_BG_PAT0_3, DATA_PATTERN1_3
827 dli R_INV_0, PATTERN1_INV0
828 dli R_INV_1, PATTERN1_INV1
833 bne R_PATTERN_IND, R_BG_SCRATCH0, pattern_ne_2
834 dli R_BG_PAT0_0, DATA_PATTERN2_0 # data_pattern = pattern[0]
835 dli R_BG_PAT0_1, DATA_PATTERN2_1
836 dli R_BG_PAT0_2, DATA_PATTERN2_2
837 dli R_BG_PAT0_3, DATA_PATTERN2_3
838 dli R_INV_0, PATTERN2_INV0
839 dli R_INV_1, PATTERN2_INV1
844 bne R_PATTERN_IND, R_BG_SCRATCH0, pattern_ne_3
845 dli R_BG_PAT0_0, DATA_PATTERN3_0 # data_pattern = pattern[0]
846 dli R_BG_PAT0_1, DATA_PATTERN3_1
847 dli R_BG_PAT0_2, DATA_PATTERN3_2
848 dli R_BG_PAT0_3, DATA_PATTERN3_3
849 dli R_INV_0, PATTERN3_INV0
850 dli R_INV_1, PATTERN3_INV1
855 bne R_PATTERN_IND, R_BG_SCRATCH0, pattern_ne_4
856 dli R_BG_PAT0_0, DATA_PATTERN4_0 # data_pattern = pattern[0]
857 dli R_BG_PAT0_1, DATA_PATTERN4_1
858 dli R_BG_PAT0_2, DATA_PATTERN4_2
859 dli R_BG_PAT0_3, DATA_PATTERN4_3
860 dli R_INV_0, PATTERN4_INV0
861 dli R_INV_1, PATTERN4_INV1
866 bne R_PATTERN_IND, R_BG_SCRATCH0, pattern_ne_5
867 dli R_BG_PAT0_0, DATA_PATTERN5_0 # data_pattern = pattern[0]
868 dli R_BG_PAT0_1, DATA_PATTERN5_1
869 dli R_BG_PAT0_2, DATA_PATTERN5_2
870 dli R_BG_PAT0_3, DATA_PATTERN5_3
871 dli R_INV_0, PATTERN5_INV0
872 dli R_INV_1, PATTERN5_INV1
877 bne R_PATTERN_IND, R_BG_SCRATCH0, pattern_ne_6
878 dli R_BG_PAT0_0, DATA_PATTERN6_0 # data_pattern = pattern[0]
879 dli R_BG_PAT0_1, DATA_PATTERN6_1
880 dli R_BG_PAT0_2, DATA_PATTERN6_2
881 dli R_BG_PAT0_3, DATA_PATTERN6_3
882 dli R_INV_0, PATTERN6_INV0
883 dli R_INV_1, PATTERN6_INV1
888 bne R_PATTERN_IND, R_BG_SCRATCH0, pattern_ne_7
889 dli R_BG_PAT0_0, DATA_PATTERN7_0 # data_pattern = pattern[0]
890 dli R_BG_PAT0_1, DATA_PATTERN7_1
891 dli R_BG_PAT0_2, DATA_PATTERN7_2
892 dli R_BG_PAT0_3, DATA_PATTERN7_3
893 dli R_INV_0, PATTERN7_INV0
894 dli R_INV_1, PATTERN7_INV1
899 bne R_PATTERN_IND, R_BG_SCRATCH0, pattern_ne_8
900 dli R_BG_PAT0_0, DATA_PATTERN8_0 # data_pattern = pattern[0]
901 dli R_BG_PAT0_1, DATA_PATTERN8_1
902 dli R_BG_PAT0_2, DATA_PATTERN8_2
903 dli R_BG_PAT0_3, DATA_PATTERN8_3
904 dli R_INV_0, PATTERN8_INV0
905 dli R_INV_1, PATTERN8_INV1
910 bne R_PATTERN_IND, R_BG_SCRATCH0, pattern_ne_9
911 dli R_BG_PAT0_0, DATA_PATTERN9_0 # data_pattern = pattern[0]
912 dli R_BG_PAT0_1, DATA_PATTERN9_1
913 dli R_BG_PAT0_2, DATA_PATTERN9_2
914 dli R_BG_PAT0_3, DATA_PATTERN9_3
915 dli R_INV_0, PATTERN9_INV0
916 dli R_INV_1, PATTERN9_INV1
920 dli R_BG_PAT0_0, DATA_PATTERNa_0 # data_pattern = pattern[0]
921 dli R_BG_PAT0_1, DATA_PATTERNa_1
922 dli R_BG_PAT0_2, DATA_PATTERNa_2
923 dli R_BG_PAT0_3, DATA_PATTERNa_3
924 dli R_INV_0, PATTERNa_INV0
925 dli R_INV_1, PATTERNa_INV1
930 dli R_BG_WADDR, XKPHYS_C_COH_EXC /* uncached accelerated */
931 dli R_BG_SCRATCH0, L2_RAM_BASE_ADDR /* mgmt mode */
932 or R_BG_WADDR,R_BG_WADDR,R_BG_SCRATCH0
933 sll R_BG_SCRATCH0, R_BG_BLOCK, L2_BLOCK_SHIFT /* block number */
934 or R_BG_WADDR, R_BG_WADDR, R_BG_SCRATCH0
939 /*BG_WRITE_PAT0(R_BG_WADDR) */
940 BG_WRITE_PAT(R_BG_WADDR,R_BG_PAT0_0,R_BG_PAT0_1,R_BG_PAT0_2,R_BG_PAT0_3,R_INV_0,R_INV_1)
941 /* for (line = 0; line < max_lines_per_block; line++) */
943 li R_BG_SCRATCH0, (32)
944 dadd R_BG_WADDR, R_BG_WADDR, R_BG_SCRATCH0 /* next line */
945 slt R_BG_SCRATCH0,R_BG_LINE,L2_LINES_PER_BLOCK-1
946 bne R_BG_SCRATCH0,$0, bg_init_next_line
947 add R_BG_LINE,R_BG_LINE,1
950 /* march element 1 */
951 dli R_WRBC_RADDR, XKPHYS_C_COH_EXC
952 dli R_WRBC_SCRATCH0, L2_RAM_BASE_ADDR
953 or R_WRBC_RADDR, R_WRBC_RADDR, R_WRBC_SCRATCH0
954 /* form address for block to be read/written */
955 sll R_WRBC_SCRATCH1, R_WRBC_RBLK, L2_BLOCK_SHIFT
956 or R_WRBC_RADDR, R_WRBC_RADDR, R_WRBC_SCRATCH1
957 li R_WRBC_NEXT_WAY, 0x20000
960 /* for (line = 0; line < lines_per_block; line++) {*/
963 move R_PASS_FAIL, zero
964 BG_CHECK_PAT(R_BG_WADDR,R_BG_PAT0_0,R_BG_PAT0_1,R_BG_PAT0_2,R_BG_PAT0_3,R_INV_0,R_INV_1)
965 INV_PAT(R_BG_PAT0_0,R_BG_PAT0_1,R_BG_PAT0_2,R_BG_PAT0_3)
966 BG_WRITE_PAT(R_BG_WADDR,R_BG_PAT0_0,R_BG_PAT0_1,R_BG_PAT0_2,R_BG_PAT0_3,R_INV_0,R_INV_1)
967 BG_CHECK_PAT(R_BG_WADDR,R_BG_PAT0_0,R_BG_PAT0_1,R_BG_PAT0_2,R_BG_PAT0_3,R_INV_0,R_INV_1)
968 BG_INVAL_L1(R_BG_WADDR)
969 INV_PAT(R_BG_PAT0_0,R_BG_PAT0_1,R_BG_PAT0_2,R_BG_PAT0_3)
970 SET_ERR_TABLE(R_PASS_FAIL, R_WRBC_LINE)
971 daddiu R_WRBC_RADDR, R_WRBC_RADDR, 0x20
973 slt R_BG_SCRATCH0,R_BG_LINE,L2_LINES_PER_BLOCK-1
974 bne R_BG_SCRATCH0,$0,march1_w0
975 add R_BG_LINE,R_BG_LINE,1
977 /* march element 2 */
978 dli R_WRBC_RADDR, XKPHYS_C_COH_EXC
979 dli R_WRBC_SCRATCH0, L2_RAM_BASE_ADDR
980 or R_WRBC_RADDR, R_WRBC_RADDR, R_WRBC_SCRATCH0
981 /* form address for block to be read/written */
982 sll R_WRBC_SCRATCH1, R_WRBC_RBLK, L2_BLOCK_SHIFT
983 or R_WRBC_RADDR, R_WRBC_RADDR, R_WRBC_SCRATCH1
984 li R_WRBC_NEXT_WAY, 0x20000
986 /* for (line = 0; line < lines_per_block; line++) {*/
989 move R_PASS_FAIL, zero
990 INV_PAT(R_BG_PAT0_0,R_BG_PAT0_1,R_BG_PAT0_2,R_BG_PAT0_3)
991 BG_CHECK_PAT(R_BG_WADDR,R_BG_PAT0_0,R_BG_PAT0_1,R_BG_PAT0_2,R_BG_PAT0_3,R_INV_0,R_INV_1)
992 INV_PAT(R_BG_PAT0_0,R_BG_PAT0_1,R_BG_PAT0_2,R_BG_PAT0_3)
993 BG_WRITE_PAT(R_BG_WADDR,R_BG_PAT0_0,R_BG_PAT0_1,R_BG_PAT0_2,R_BG_PAT0_3,R_INV_0,R_INV_1)
994 BG_CHECK_PAT(R_BG_WADDR,R_BG_PAT0_0,R_BG_PAT0_1,R_BG_PAT0_2,R_BG_PAT0_3,R_INV_0,R_INV_1)
995 BG_INVAL_L1(R_BG_WADDR)
996 SET_ERR_TABLE(R_PASS_FAIL, R_WRBC_LINE)
997 daddiu R_WRBC_RADDR, R_WRBC_RADDR, 0x20
999 slt R_BG_SCRATCH0,R_BG_LINE,L2_LINES_PER_BLOCK-1
1000 bne R_BG_SCRATCH0,$0,march2_w0
1001 add R_BG_LINE,R_BG_LINE,1
1003 /* march element 3 */
1004 dli R_WRBC_RADDR, XKPHYS_C_COH_EXC
1005 dli R_WRBC_SCRATCH0, L2_RAM_BASE_ADDR
1006 or R_WRBC_RADDR, R_WRBC_RADDR, R_WRBC_SCRATCH0
1007 /* form address for block to be read/written */
1008 addi R_WRBC_SCRATCH0, R_WRBC_RBLK, 1
1009 #ifdef TEST_ALL_LINES
1010 sll R_WRBC_SCRATCH1, R_WRBC_SCRATCH0, L2_BLOCK_SHIFT
1012 sll R_WRBC_SCRATCH1, R_WRBC_RBLK, L2_BLOCK_SHIFT
1014 or R_WRBC_RADDR, R_WRBC_RADDR, R_WRBC_SCRATCH1
1015 #ifdef TEST_ALL_LINES
1016 daddiu R_WRBC_RADDR, R_WRBC_RADDR, -32
1018 daddiu R_WRBC_RADDR, R_WRBC_RADDR, L2_LINES_PER_BLOCK*32-32
1020 li R_WRBC_NEXT_WAY, 0x20000
1022 /* for (line = 0; line < lines_per_block; line++) {*/
1023 li R_WRBC_LINE,L2_LINES_PER_BLOCK-1
1025 move R_PASS_FAIL, zero
1026 BG_CHECK_PAT(R_BG_WADDR,R_BG_PAT0_0,R_BG_PAT0_1,R_BG_PAT0_2,R_BG_PAT0_3,R_INV_0,R_INV_1)
1027 INV_PAT(R_BG_PAT0_0,R_BG_PAT0_1,R_BG_PAT0_2,R_BG_PAT0_3)
1028 BG_WRITE_PAT(R_BG_WADDR,R_BG_PAT0_0,R_BG_PAT0_1,R_BG_PAT0_2,R_BG_PAT0_3,R_INV_0,R_INV_1)
1029 BG_CHECK_PAT(R_BG_WADDR,R_BG_PAT0_0,R_BG_PAT0_1,R_BG_PAT0_2,R_BG_PAT0_3,R_INV_0,R_INV_1)
1030 BG_INVAL_L1(R_BG_WADDR)
1031 INV_PAT(R_BG_PAT0_0,R_BG_PAT0_1,R_BG_PAT0_2,R_BG_PAT0_3)
1032 SET_ERR_TABLE(R_PASS_FAIL, R_WRBC_LINE)
1033 daddiu R_WRBC_RADDR, R_WRBC_RADDR, -32
1035 bne R_WRBC_LINE,$0, march3_w0
1036 add R_WRBC_LINE,R_WRBC_LINE,-1
1038 /* march element 4 */
1039 dli R_WRBC_RADDR, XKPHYS_C_COH_EXC
1040 dli R_WRBC_SCRATCH0, L2_RAM_BASE_ADDR
1041 or R_WRBC_RADDR, R_WRBC_RADDR, R_WRBC_SCRATCH0
1042 /* form address for block to be read/written */
1043 addi R_WRBC_SCRATCH0, R_WRBC_RBLK, 1
1044 #ifdef TEST_ALL_LINES
1045 sll R_WRBC_SCRATCH1, R_WRBC_SCRATCH0, L2_BLOCK_SHIFT
1047 sll R_WRBC_SCRATCH1, R_WRBC_RBLK, L2_BLOCK_SHIFT
1049 or R_WRBC_RADDR, R_WRBC_RADDR, R_WRBC_SCRATCH1
1050 #ifdef TEST_ALL_LINES
1051 daddiu R_WRBC_RADDR, R_WRBC_RADDR, -32
1053 daddiu R_WRBC_RADDR, R_WRBC_RADDR, L2_LINES_PER_BLOCK*32-32
1055 li R_WRBC_NEXT_WAY, 0x20000
1057 /* for (line = 0; line < lines_per_block; line++) {*/
1058 li R_WRBC_LINE,L2_LINES_PER_BLOCK-1
1060 move R_PASS_FAIL, zero
1061 INV_PAT(R_BG_PAT0_0,R_BG_PAT0_1,R_BG_PAT0_2,R_BG_PAT0_3)
1062 BG_CHECK_PAT(R_BG_WADDR,R_BG_PAT0_0,R_BG_PAT0_1,R_BG_PAT0_2,R_BG_PAT0_3,R_INV_0,R_INV_1)
1063 INV_PAT(R_BG_PAT0_0,R_BG_PAT0_1,R_BG_PAT0_2,R_BG_PAT0_3)
1064 BG_WRITE_PAT(R_BG_WADDR,R_BG_PAT0_0,R_BG_PAT0_1,R_BG_PAT0_2,R_BG_PAT0_3,R_INV_0,R_INV_1)
1065 BG_CHECK_PAT(R_BG_WADDR,R_BG_PAT0_0,R_BG_PAT0_1,R_BG_PAT0_2,R_BG_PAT0_3,R_INV_0,R_INV_1)
1066 BG_INVAL_L1(R_BG_WADDR)
1067 SET_ERR_TABLE(R_PASS_FAIL, R_WRBC_LINE)
1068 daddiu R_WRBC_RADDR, R_WRBC_RADDR, -32
1070 bne R_WRBC_LINE,$0, march4_w0
1071 add R_WRBC_LINE,R_WRBC_LINE,-1
1074 bne R_BG_PAT0_0, $0, 0f
1076 dli R_BG_PAT0_0, 0x5555555555555555
1077 move R_BG_PAT0_1, R_BG_PAT0_0
1078 move R_BG_PAT0_2, R_BG_PAT0_0
1079 move R_BG_PAT0_3, R_BG_PAT0_0
1083 beq R_BG_PAT0_2, $0, 3f
1085 bne R_BG_PAT0_3, $0, 4f
1087 move R_BG_PAT0_1, R_BG_PAT0_0
1088 move R_BG_PAT0_2, R_BG_PAT0_3
1091 dli R_BG_SCRATCH2, 0
1092 move R_BG_SCRATCH0, R_BG_PAT0_0
1094 dsrl R_BG_SCRATCH0, R_BG_SCRATCH0, 1
1095 and R_BG_SCRATCH1, R_BG_SCRATCH0, 1
1096 addi R_BG_SCRATCH2, R_BG_SCRATCH2, 1
1097 bne R_BG_SCRATCH1, $0, 1b
1100 dsll R_BG_SCRATCH2, R_BG_SCRATCH2, 1
1101 bne R_BG_SCRATCH2, 0x40, 6f
1103 move R_BG_PAT0_1, $0
1104 move R_BG_PAT0_2, R_BG_PAT0_0
1105 move R_BG_PAT0_3, $0
1108 dli R_BG_SCRATCH3, 1
1109 dsll R_BG_SCRATCH3, R_BG_SCRATCH3, R_BG_SCRATCH2
1110 daddiu R_BG_SCRATCH3, R_BG_SCRATCH3, -1
1112 dsll R_BG_SCRATCH2, R_BG_SCRATCH2, 1
1113 move R_BG_PAT0_0, R_BG_SCRATCH3
1114 beq R_BG_SCRATCH2, 0x40, 5f
1116 dsll R_BG_SCRATCH3, R_BG_SCRATCH3, R_BG_SCRATCH2
1117 or R_BG_PAT0_0, R_BG_PAT0_0, R_BG_SCRATCH3
1118 bne R_BG_SCRATCH3, $0, 2b
1122 move R_BG_PAT0_1, R_BG_PAT0_0
1123 move R_BG_PAT0_2, R_BG_PAT0_0
1124 move R_BG_PAT0_3, R_BG_PAT0_0
1130 addu R_PATTERN_IND, R_PATTERN_IND, 1
1131 slt R_BG_SCRATCH0, R_PATTERN_IND, MAX_PATTERN
1132 bne R_BG_SCRATCH0, $0, bg_next_patt
1136 dli R_BG_SCRATCH1, 2
1138 daddiu R_BG_SCRATCH1, R_BG_SCRATCH1, -1
1139 bne R_BG_SCRATCH1, $0, 2b
1141 daddiu R_BG_SCRATCH0, R_BG_SCRATCH0, -1
1142 bne R_BG_SCRATCH0, $0, 1b
1145 /* march element 5 */
1146 dli R_WRBC_RADDR, XKPHYS_C_COH_EXC
1147 dli R_WRBC_SCRATCH0, L2_RAM_BASE_ADDR
1148 or R_WRBC_RADDR, R_WRBC_RADDR, R_WRBC_SCRATCH0
1149 /* form address for block to be read/written */
1150 sll R_WRBC_SCRATCH1, R_WRBC_RBLK, L2_BLOCK_SHIFT
1151 or R_WRBC_RADDR, R_WRBC_RADDR, R_WRBC_SCRATCH1
1152 li R_WRBC_NEXT_WAY, 0x20000
1153 move R_WRBC_LINE,zero
1155 move R_PASS_FAIL, zero
1156 BG_CHECK_PAT(R_BG_WADDR,R_BG_PAT0_0,R_BG_PAT0_1,R_BG_PAT0_2,R_BG_PAT0_3,R_INV_0,R_INV_1)
1157 INV_PAT(R_BG_PAT0_0,R_BG_PAT0_1,R_BG_PAT0_2,R_BG_PAT0_3)
1158 BG_WRITE_PAT(R_BG_WADDR,R_BG_PAT0_0,R_BG_PAT0_1,R_BG_PAT0_2,R_BG_PAT0_3,R_INV_0,R_INV_1)
1159 INV_PAT(R_BG_PAT0_0,R_BG_PAT0_1,R_BG_PAT0_2,R_BG_PAT0_3)
1160 SET_ERR_TABLE(R_PASS_FAIL, R_WRBC_LINE)
1161 daddiu R_WRBC_RADDR, R_WRBC_RADDR, 32
1163 slt R_BG_SCRATCH0,R_BG_LINE,L2_LINES_PER_BLOCK-1
1164 bne R_BG_SCRATCH0,$0,march5_w0
1165 add R_BG_LINE,R_BG_LINE,1
1169 dli R_BG_SCRATCH1, 2
1171 daddiu R_BG_SCRATCH1, R_BG_SCRATCH1, -1
1172 bne R_BG_SCRATCH1, $0, 2b
1174 daddiu R_BG_SCRATCH0, R_BG_SCRATCH0, -1
1175 bne R_BG_SCRATCH0, $0, 1b
1178 /* march element 6 */
1179 dli R_WRBC_RADDR, XKPHYS_C_COH_EXC
1180 dli R_WRBC_SCRATCH0, L2_RAM_BASE_ADDR
1181 or R_WRBC_RADDR, R_WRBC_RADDR, R_WRBC_SCRATCH0
1182 /* form address for block to be read/written */
1183 sll R_WRBC_SCRATCH1, R_WRBC_RBLK, L2_BLOCK_SHIFT
1184 or R_WRBC_RADDR, R_WRBC_RADDR, R_WRBC_SCRATCH1
1185 li R_WRBC_NEXT_WAY, 0x20000
1186 move R_WRBC_LINE,zero
1188 move R_PASS_FAIL, zero
1189 INV_PAT(R_BG_PAT0_0,R_BG_PAT0_1,R_BG_PAT0_2,R_BG_PAT0_3)
1190 BG_CHECK_PAT(R_BG_WADDR,R_BG_PAT0_0,R_BG_PAT0_1,R_BG_PAT0_2,R_BG_PAT0_3,R_INV_0,R_INV_1)
1191 INV_PAT(R_BG_PAT0_0,R_BG_PAT0_1,R_BG_PAT0_2,R_BG_PAT0_3)
1192 SET_ERR_TABLE(R_PASS_FAIL, R_WRBC_LINE)
1193 daddiu R_WRBC_RADDR, R_WRBC_RADDR, 32
1195 slt R_BG_SCRATCH0,R_BG_LINE,L2_LINES_PER_BLOCK-1
1196 bne R_BG_SCRATCH0,$0,march6_w0
1197 add R_BG_LINE,R_BG_LINE,1
1199 /* if error, put test block info into s0 and return */
1200 or R_BG_SCRATCH0, R_ERR_TABLE_0, R_ERR_TABLE_1
1201 or R_BG_SCRATCH0, R_BG_SCRATCH0, R_ERR_TABLE_2
1202 or R_BG_SCRATCH0, R_BG_SCRATCH0, R_ERR_TABLE_3
1203 beq R_BG_SCRATCH0, zero, 1f
1211 addu R_BG_BLOCK,R_BG_BLOCK,1
1212 /*slt R_BG_SCRATCH0, R_BG_BLOCK, (L2_BLOCKS_PER_ROW * L2_BLOCK_ROWS)*/
1213 addi R_BG_SCRATCH1, k0, 1
1214 sll R_BG_SCRATCH1, R_BG_SCRATCH1, 2
1215 /*slt R_BG_SCRATCH0, R_BG_BLOCK, (START_BLK + TOTAL_BLKS)*/
1216 slt R_BG_SCRATCH0, R_BG_BLOCK, R_BG_SCRATCH1
1217 bne R_BG_SCRATCH0,$0, bg_next_block
1229 END(l2dtest_bg_rw_uac)
1233 #define SCD_BW_BASE 0x0010020880
1234 #define L2_BASE 0x0010040000
1235 #define L2_READ_TAG 0x18
1236 #define L2_ECC_TAG 0x38
1237 #define BUS_ERR_STATUS 0x00
1238 #define BUS_L2_ERRORS 0x40
1240 #define R_ECC_PAT0_0 a0
1241 #define R_ECC_PAT0_1 a1
1242 #define R_ECC_PAT0_2 a2
1243 #define R_ECC_PAT0_3 a3
1245 #define R_ECC_PAT1_0 t0
1246 #define R_ECC_PAT1_1 t1
1247 #define R_ECC_PAT1_2 t2
1248 #define R_ECC_PAT1_3 t3
1250 #define R_ECC_PATT_IND s0
1251 #define R_ECC_LINE s2
1252 #define R_ECC_NEXT_WAY s3
1253 #define R_ECC_BLOCK s1
1254 #define R_ECC_WADDR t5
1255 #define R_ECC_RADDR t5
1257 #define R_ECC_SCRATCH0 t6
1258 #define R_ECC_SCRATCH1 t7
1259 #define R_ECC_SCRATCH2 t8
1260 #define R_ECC_SCRATCH3 t9
1261 #define R_ECC_SCRATCH4 s6
1262 #define R_ECC_SCRATCH5 s7
1265 #define DATA_FOR_ECC_PATT0 0x0000
1266 #define DATA_FOR_ECC_PATT1 0x0020
1267 #define DATA_FOR_ECC_PATT2 0x1032
1268 #define DATA_FOR_ECC_PATT3 0x0017
1269 #define DATA_FOR_ECC_PATT4 0x1822
1271 #define DATA_FOR_ECC_INVPATT0 0x0036
1272 #define DATA_FOR_ECC_INVPATT1 0x0016
1273 #define DATA_FOR_ECC_INVPATT2 0x1004
1274 #define DATA_FOR_ECC_INVPATT3 0x0021
1275 #define DATA_FOR_ECC_INVPATT4 0x1814
1277 #define DATA_FOR_ECC_PATT0 0x0000
1278 #define DATA_FOR_ECC_PATT1 0x00ba
1279 #define DATA_FOR_ECC_PATT2 0x0438
1280 #define DATA_FOR_ECC_PATT3 0x05be
1281 #define DATA_FOR_ECC_PATT4 0x0099
1283 #define DATA_FOR_ECC_INVPATT0 0x059c
1284 #define DATA_FOR_ECC_INVPATT1 0x0526
1285 #define DATA_FOR_ECC_INVPATT2 0x01a4
1286 #define DATA_FOR_ECC_INVPATT3 0x0022
1287 #define DATA_FOR_ECC_INVPATT4 0x0505
1289 #define ECC_WRITE_PAT(addr, pattern0, pattern1, pattern2, pattern3)\
1290 dli R_ECC_SCRATCH2, 4; \
1291 /*dli R_ECC_SCRATCH0, 0x00400000;*/ \
1292 /*nor R_ECC_SCRATCH1, R_ECC_SCRATCH0, $0;*/ \
1293 1: sd pattern0, 0(addr); \
1295 sd zero, 16(addr); \
1296 sd zero, 24(addr); \
1297 cache L1CACHEOP(L1C_D,L1C_OP_HIT_WB_INVAL),0(addr); \
1298 /*or addr, R_ECC_SCRATCH0, addr;*/ \
1299 /*sd pattern0, 0(addr);*/ \
1300 /*sd zero, 8(addr);*/ \
1301 /*sd zero, 16(addr);*/ \
1302 /*sd zero, 24(addr);*/ \
1303 /*cache L1CACHEOP(L1C_D,L1C_OP_HIT_WB_INVAL),0(addr);*/ \
1304 /*and addr, addr, R_ECC_SCRATCH1;*/ \
1305 move R_ECC_SCRATCH3, pattern0; \
1306 move pattern0, pattern1; \
1307 move pattern1, pattern2; \
1308 move pattern2, pattern3; \
1309 move pattern3, R_ECC_SCRATCH3; \
1310 addi R_ECC_SCRATCH2, R_ECC_SCRATCH2, -1; \
1311 bne R_ECC_SCRATCH2, zero, 1b; \
1312 daddu addr, addr, R_BG_NEXT_WAY; \
1313 li R_ECC_SCRATCH0, -4*2*65536; \
1314 dadd addr, addr, R_ECC_SCRATCH0
1316 #define ECC_CHECK_PAT(addr,pattern0,pattern1,pattern2,pattern3,fail) \
1317 dli R_ECC_SCRATCH4, XKPHYS_UNC; \
1318 dli R_ECC_SCRATCH5, SCD_BW_BASE; \
1319 or R_ECC_SCRATCH4, R_ECC_SCRATCH4, R_ECC_SCRATCH5; \
1320 li R_ECC_SCRATCH5, 4; \
1321 sd zero, BUS_L2_ERRORS(R_ECC_SCRATCH4); \
1323 1: ld R_ECC_SCRATCH0, 0(addr); \
1324 ld R_ECC_SCRATCH1, 8(addr); \
1325 sne R_ECC_SCRATCH0, R_ECC_SCRATCH0, pattern0; \
1326 or R_PASS_FAIL, R_PASS_FAIL, R_ECC_SCRATCH0; \
1327 ld R_ECC_SCRATCH2, 16(addr);\
1328 sne R_ECC_SCRATCH1, R_ECC_SCRATCH1, zero; \
1329 or R_PASS_FAIL, R_PASS_FAIL, R_ECC_SCRATCH1; \
1330 ld R_ECC_SCRATCH3, 24(addr);\
1331 sne R_ECC_SCRATCH2, R_ECC_SCRATCH2, zero; \
1332 or R_PASS_FAIL, R_PASS_FAIL, R_ECC_SCRATCH2; \
1333 ld R_ECC_SCRATCH0, BUS_L2_ERRORS(R_ECC_SCRATCH4); \
1334 sne R_ECC_SCRATCH3, R_ECC_SCRATCH3, zero; \
1335 or R_PASS_FAIL, R_PASS_FAIL, R_ECC_SCRATCH3; \
1336 li R_ECC_SCRATCH2, 0xffff; \
1337 and R_ECC_SCRATCH0, R_ECC_SCRATCH2, R_ECC_SCRATCH0; \
1338 sne R_ECC_SCRATCH0, R_ECC_SCRATCH0, zero; \
1339 or R_PASS_FAIL, R_PASS_FAIL, R_ECC_SCRATCH0; \
1340 move R_ECC_SCRATCH3, pattern0; \
1341 move pattern0, pattern1; \
1342 move pattern1, pattern2; \
1343 move pattern2, pattern3; \
1344 move pattern3, R_ECC_SCRATCH3; \
1345 addi R_BG_SCRATCH5, R_BG_SCRATCH5, -1; \
1346 bne R_BG_SCRATCH5, zero, 1b; \
1347 daddu addr, addr, R_ECC_NEXT_WAY; \
1348 li R_ECC_SCRATCH0, -4*2*65536; \
1349 dadd addr, addr, R_ECC_SCRATCH0
1351 #define ECC_CHECK_PAT1(addr,pattern0,pattern1,pattern2,pattern3,fail) \
1352 dli R_ECC_SCRATCH4, XKPHYS_UNC; \
1353 dli R_ECC_SCRATCH5, SCD_BW_BASE; \
1354 or R_ECC_SCRATCH4, R_ECC_SCRATCH4, R_ECC_SCRATCH5; \
1355 li R_ECC_SCRATCH5, 4; \
1356 1: sd zero, BUS_L2_ERRORS(R_ECC_SCRATCH4); \
1357 ld R_ECC_SCRATCH0, 0(addr); \
1358 cache L1CACHEOP(L1C_D,L1C_OP_HITINVAL),0(addr); \
1359 ld R_ECC_SCRATCH0, 0(addr); \
1360 ld R_ECC_SCRATCH1, 8(addr); \
1361 sne R_ECC_SCRATCH0, R_ECC_SCRATCH0, pattern0; \
1362 or R_PASS_FAIL, R_PASS_FAIL, R_ECC_SCRATCH0; \
1363 ld R_ECC_SCRATCH2, 16(addr);\
1364 sne R_ECC_SCRATCH1, R_ECC_SCRATCH1, zero; \
1365 or R_PASS_FAIL, R_PASS_FAIL, R_ECC_SCRATCH1; \
1366 ld R_ECC_SCRATCH3, 24(addr);\
1367 sne R_ECC_SCRATCH2, R_ECC_SCRATCH2, zero; \
1368 or R_PASS_FAIL, R_PASS_FAIL, R_ECC_SCRATCH2; \
1369 ld R_ECC_SCRATCH0, BUS_L2_ERRORS(R_ECC_SCRATCH4); \
1370 sne R_ECC_SCRATCH3, R_ECC_SCRATCH3, zero; \
1371 or R_PASS_FAIL, R_PASS_FAIL, R_ECC_SCRATCH3; \
1372 sne R_ECC_SCRATCH0, R_ECC_SCRATCH0, zero; \
1373 or R_PASS_FAIL, R_PASS_FAIL, R_ECC_SCRATCH0; \
1374 move R_ECC_SCRATCH3, pattern0; \
1375 move pattern0, pattern1; \
1376 move pattern1, pattern2; \
1377 move pattern2, pattern3; \
1378 move pattern3, R_ECC_SCRATCH3; \
1379 addi R_BG_SCRATCH5, R_BG_SCRATCH5, -1; \
1380 bne R_BG_SCRATCH5, zero, 1b; \
1381 daddu addr, addr, R_ECC_NEXT_WAY; \
1382 li R_ECC_SCRATCH0, -4*2*65536; \
1383 dadd addr, addr, R_ECC_SCRATCH0
1386 #ifdef DATA_ECC_TEST
1387 LEAF(l2dtest_data_ecc)
1389 /*li R_ECC_BLOCK, START_BLK*/
1390 sll R_ECC_BLOCK, k0, 2
1391 li R_ECC_NEXT_WAY,0x20000
1394 addi R_BG_SCRATCH2, R_BG_BLOCK, '0'
1395 or R_BG_SCRATCH2, R_BG_SCRATCH2, ('E' << 8)
1396 SET_LEDS_HI(R_BG_SCRATCH2, R_BG_SCRATCH0, R_BG_SCRATCH1)
1399 move R_ECC_PATT_IND, $0
1400 dli R_ECC_PAT0_0, DATA_FOR_ECC_PATT0
1401 dli R_ECC_PAT0_1, DATA_FOR_ECC_PATT0
1402 dli R_ECC_PAT0_2, DATA_FOR_ECC_PATT0
1403 dli R_ECC_PAT0_3, DATA_FOR_ECC_PATT0
1404 dli R_ECC_PAT1_0, DATA_FOR_ECC_INVPATT0
1405 dli R_ECC_PAT1_1, DATA_FOR_ECC_INVPATT0
1406 dli R_ECC_PAT1_2, DATA_FOR_ECC_INVPATT0
1407 dli R_ECC_PAT1_3, DATA_FOR_ECC_INVPATT0
1411 addi R_BG_SCRATCH2, R_ECC_PATT_IND, '0'
1412 or R_BG_SCRATCH2, R_BG_SCRATCH2, ('P' << 8)
1413 SET_LEDS_LO(R_BG_SCRATCH2, R_BG_SCRATCH0, R_BG_SCRATCH1)
1416 dli R_ECC_WADDR, XKPHYS_C_COH_EXC /* uncached accelerated */
1417 dli R_ECC_SCRATCH0, L2_RAM_BASE_ADDR /* mgmt mode */
1418 or R_ECC_WADDR,R_ECC_WADDR,R_BG_SCRATCH0
1419 sll R_ECC_SCRATCH0, R_ECC_BLOCK, L2_BLOCK_SHIFT /* block number */
1420 or R_ECC_WADDR, R_ECC_WADDR, R_ECC_SCRATCH0
1424 move R_ECC_LINE, zero
1426 ECC_WRITE_PAT(R_ECC_WADDR,R_ECC_PAT0_0,R_ECC_PAT0_1,R_ECC_PAT0_2,R_ECC_PAT0_3)
1427 li R_ECC_SCRATCH0, (32)
1428 dadd R_ECC_WADDR, R_ECC_WADDR, R_ECC_SCRATCH0 /* next line */
1430 slt R_ECC_SCRATCH0,R_ECC_LINE,L2_LINES_PER_BLOCK-1
1431 bne R_ECC_SCRATCH0, $0, ecc_init_next_line
1432 add R_ECC_LINE, R_ECC_LINE,1
1434 dli R_ECC_RADDR, XKPHYS_C_COH_EXC
1435 dli R_ECC_SCRATCH0, L2_RAM_BASE_ADDR
1436 or R_ECC_RADDR, R_ECC_RADDR, R_WRBC_SCRATCH0
1437 sll R_ECC_SCRATCH1, R_ECC_BLOCK, L2_BLOCK_SHIFT
1438 or R_ECC_RADDR, R_ECC_RADDR, R_ECC_SCRATCH1
1439 li R_ECC_NEXT_WAY, 0x20000
1441 move R_ECC_LINE, zero
1443 move R_PASS_FAIL, zero
1444 ECC_CHECK_PAT(R_ECC_WADDR,R_ECC_PAT0_0,R_ECC_PAT0_1,R_ECC_PAT0_2,R_ECC_PAT0_3,ecc_err)
1445 ECC_WRITE_PAT(R_ECC_WADDR,R_ECC_PAT1_0,R_ECC_PAT1_1,R_ECC_PAT1_2,R_ECC_PAT1_3)
1446 ECC_CHECK_PAT(R_ECC_WADDR,R_ECC_PAT1_0,R_ECC_PAT1_1,R_ECC_PAT1_2,R_ECC_PAT1_3,ecc_err)
1447 BG_INVAL_L1(R_BG_WADDR)
1448 SET_ERR_TABLE(R_PASS_FAIL, R_ECC_LINE)
1449 daddiu R_ECC_RADDR, R_ECC_RADDR, 0x20
1451 slt R_ECC_SCRATCH0,R_ECC_LINE,L2_LINES_PER_BLOCK-1
1452 bne R_ECC_SCRATCH0, $0, ecc_march1
1453 add R_ECC_LINE, R_ECC_LINE,1
1455 dli R_ECC_RADDR, XKPHYS_C_COH_EXC
1456 dli R_ECC_SCRATCH0, L2_RAM_BASE_ADDR
1457 or R_ECC_RADDR, R_ECC_RADDR, R_WRBC_SCRATCH0
1458 sll R_ECC_SCRATCH1, R_ECC_BLOCK, L2_BLOCK_SHIFT
1459 or R_ECC_RADDR, R_ECC_RADDR, R_ECC_SCRATCH1
1460 li R_ECC_NEXT_WAY, 0x20000
1462 move R_ECC_LINE, zero
1464 move R_PASS_FAIL, zero
1465 ECC_CHECK_PAT(R_ECC_WADDR,R_ECC_PAT1_0,R_ECC_PAT1_1,R_ECC_PAT1_2,R_ECC_PAT1_3,ecc_err)
1466 ECC_WRITE_PAT(R_ECC_WADDR,R_ECC_PAT0_0,R_ECC_PAT0_1,R_ECC_PAT0_2,R_ECC_PAT0_3)
1467 ECC_CHECK_PAT(R_ECC_WADDR,R_ECC_PAT0_0,R_ECC_PAT0_1,R_ECC_PAT0_2,R_ECC_PAT0_3,ecc_err)
1468 BG_INVAL_L1(R_BG_WADDR)
1469 SET_ERR_TABLE(R_PASS_FAIL, R_ECC_LINE)
1470 daddiu R_ECC_RADDR, R_ECC_RADDR, 0x20
1472 slt R_ECC_SCRATCH0,R_ECC_LINE,L2_LINES_PER_BLOCK-1
1473 bne R_ECC_SCRATCH0, $0, ecc_march2
1474 add R_ECC_LINE, R_ECC_LINE,1
1476 dli R_ECC_RADDR, XKPHYS_C_COH_EXC
1477 dli R_ECC_SCRATCH0, L2_RAM_BASE_ADDR
1478 or R_ECC_RADDR, R_ECC_RADDR, R_ECC_SCRATCH0
1479 addi R_ECC_SCRATCH0, R_ECC_BLOCK, 1
1480 #ifdef TEST_ALL_LINES
1481 sll R_ECC_SCRATCH1, R_ECC_SCRATCH0, L2_BLOCK_SHIFT
1483 sll R_ECC_SCRATCH1, R_ECC_BLOCK, L2_BLOCK_SHIFT
1485 or R_ECC_RADDR, R_ECC_RADDR, R_ECC_SCRATCH1
1486 #ifdef TEST_ALL_LINES
1487 daddiu R_ECC_RADDR, R_ECC_RADDR, -32
1489 daddiu R_ECC_RADDR, R_ECC_RADDR, L2_LINES_PER_BLOCK*32-32
1491 li R_ECC_LINE,L2_LINES_PER_BLOCK-1
1493 move R_PASS_FAIL, zero
1494 ECC_CHECK_PAT(R_ECC_WADDR,R_ECC_PAT0_0,R_ECC_PAT0_1,R_ECC_PAT0_2,R_ECC_PAT0_3,ecc_err)
1495 ECC_WRITE_PAT(R_ECC_WADDR,R_ECC_PAT1_0,R_ECC_PAT1_1,R_ECC_PAT1_2,R_ECC_PAT1_3)
1496 ECC_CHECK_PAT(R_ECC_WADDR,R_ECC_PAT1_0,R_ECC_PAT1_1,R_ECC_PAT1_2,R_ECC_PAT1_3,ecc_err)
1497 BG_INVAL_L1(R_BG_WADDR)
1498 SET_ERR_TABLE(R_PASS_FAIL, R_ECC_LINE)
1499 daddiu R_ECC_RADDR, R_ECC_RADDR, -32
1501 bne R_ECC_LINE,$0, ecc_march3
1502 add R_ECC_LINE,R_ECC_LINE,-1
1504 dli R_ECC_RADDR, XKPHYS_C_COH_EXC
1505 dli R_ECC_SCRATCH0, L2_RAM_BASE_ADDR
1506 or R_ECC_RADDR, R_ECC_RADDR, R_ECC_SCRATCH0
1507 addi R_ECC_SCRATCH0, R_ECC_BLOCK, 1
1508 #ifdef TEST_ALL_LINES
1509 sll R_ECC_SCRATCH1, R_ECC_SCRATCH0, L2_BLOCK_SHIFT
1511 sll R_ECC_SCRATCH1, R_ECC_BLOCK, L2_BLOCK_SHIFT
1513 or R_ECC_RADDR, R_ECC_RADDR, R_ECC_SCRATCH1
1514 #ifdef TEST_ALL_LINES
1515 daddiu R_ECC_RADDR, R_ECC_RADDR, -32
1517 daddiu R_ECC_RADDR, R_ECC_RADDR, L2_LINES_PER_BLOCK*32-32
1519 li R_ECC_LINE,L2_LINES_PER_BLOCK-1
1521 move R_PASS_FAIL, zero
1522 ECC_CHECK_PAT(R_ECC_WADDR,R_ECC_PAT1_0,R_ECC_PAT1_1,R_ECC_PAT1_2,R_ECC_PAT1_3,ecc_err)
1523 ECC_WRITE_PAT(R_ECC_WADDR,R_ECC_PAT0_0,R_ECC_PAT0_1,R_ECC_PAT0_2,R_ECC_PAT0_3)
1524 ECC_CHECK_PAT(R_ECC_WADDR,R_ECC_PAT0_0,R_ECC_PAT0_1,R_ECC_PAT0_2,R_ECC_PAT0_3,ecc_err)
1525 BG_INVAL_L1(R_BG_WADDR)
1526 SET_ERR_TABLE(R_PASS_FAIL, R_ECC_LINE)
1527 daddiu R_ECC_RADDR, R_ECC_RADDR, -32
1529 bne R_ECC_LINE,$0, ecc_march4
1530 add R_ECC_LINE,R_ECC_LINE,-1
1532 addi R_ECC_PATT_IND, R_ECC_PATT_IND, 1
1533 li R_ECC_SCRATCH0, 1
1534 bne R_ECC_SCRATCH0, R_ECC_PATT_IND, 2f
1536 dli R_ECC_PAT0_0, DATA_FOR_ECC_INVPATT0
1537 dli R_ECC_PAT0_1, DATA_FOR_ECC_PATT0
1538 dli R_ECC_PAT0_2, DATA_FOR_ECC_INVPATT0
1539 dli R_ECC_PAT0_3, DATA_FOR_ECC_PATT0
1540 dli R_ECC_PAT1_0, DATA_FOR_ECC_PATT0
1541 dli R_ECC_PAT1_1, DATA_FOR_ECC_INVPATT0
1542 dli R_ECC_PAT1_2, DATA_FOR_ECC_PATT0
1543 dli R_ECC_PAT1_3, DATA_FOR_ECC_INVPATT0
1546 li R_ECC_SCRATCH0, 2
1547 bne R_ECC_SCRATCH0, R_ECC_PATT_IND, 3f
1549 dli R_ECC_PAT0_0, DATA_FOR_ECC_INVPATT0
1550 dli R_ECC_PAT0_1, DATA_FOR_ECC_INVPATT0
1551 dli R_ECC_PAT0_2, DATA_FOR_ECC_PATT0
1552 dli R_ECC_PAT0_3, DATA_FOR_ECC_PATT0
1553 dli R_ECC_PAT1_0, DATA_FOR_ECC_PATT0
1554 dli R_ECC_PAT1_1, DATA_FOR_ECC_PATT0
1555 dli R_ECC_PAT1_2, DATA_FOR_ECC_INVPATT0
1556 dli R_ECC_PAT1_3, DATA_FOR_ECC_INVPATT0
1560 li R_ECC_SCRATCH0, 3
1561 bne R_ECC_SCRATCH0, R_ECC_PATT_IND, 4f
1563 dli R_ECC_PAT0_0, DATA_FOR_ECC_PATT1
1564 dli R_ECC_PAT0_1, DATA_FOR_ECC_PATT1
1565 dli R_ECC_PAT0_2, DATA_FOR_ECC_PATT1
1566 dli R_ECC_PAT0_3, DATA_FOR_ECC_PATT1
1567 dli R_ECC_PAT1_0, DATA_FOR_ECC_INVPATT1
1568 dli R_ECC_PAT1_1, DATA_FOR_ECC_INVPATT1
1569 dli R_ECC_PAT1_2, DATA_FOR_ECC_INVPATT1
1570 dli R_ECC_PAT1_3, DATA_FOR_ECC_INVPATT1
1574 li R_ECC_SCRATCH0, 4
1575 bne R_ECC_SCRATCH0, R_ECC_PATT_IND, 5f
1577 dli R_ECC_PAT0_0, DATA_FOR_ECC_PATT2
1578 dli R_ECC_PAT0_1, DATA_FOR_ECC_PATT2
1579 dli R_ECC_PAT0_2, DATA_FOR_ECC_PATT2
1580 dli R_ECC_PAT0_3, DATA_FOR_ECC_PATT2
1581 dli R_ECC_PAT1_0, DATA_FOR_ECC_INVPATT2
1582 dli R_ECC_PAT1_1, DATA_FOR_ECC_INVPATT2
1583 dli R_ECC_PAT1_2, DATA_FOR_ECC_INVPATT2
1584 dli R_ECC_PAT1_3, DATA_FOR_ECC_INVPATT2
1588 li R_ECC_SCRATCH0, 5
1589 bne R_ECC_SCRATCH0, R_ECC_PATT_IND, 6f
1591 dli R_ECC_PAT0_0, DATA_FOR_ECC_PATT3
1592 dli R_ECC_PAT0_1, DATA_FOR_ECC_PATT3
1593 dli R_ECC_PAT0_2, DATA_FOR_ECC_PATT3
1594 dli R_ECC_PAT0_3, DATA_FOR_ECC_PATT3
1595 dli R_ECC_PAT1_0, DATA_FOR_ECC_INVPATT3
1596 dli R_ECC_PAT1_1, DATA_FOR_ECC_INVPATT3
1597 dli R_ECC_PAT1_2, DATA_FOR_ECC_INVPATT3
1598 dli R_ECC_PAT1_3, DATA_FOR_ECC_INVPATT3
1602 li R_ECC_SCRATCH0, 6
1603 bne R_ECC_SCRATCH0, R_ECC_PATT_IND, 7f
1605 dli R_ECC_PAT0_0, DATA_FOR_ECC_PATT4
1606 dli R_ECC_PAT0_1, DATA_FOR_ECC_PATT4
1607 dli R_ECC_PAT0_2, DATA_FOR_ECC_PATT4
1608 dli R_ECC_PAT0_3, DATA_FOR_ECC_PATT4
1609 dli R_ECC_PAT1_0, DATA_FOR_ECC_INVPATT4
1610 dli R_ECC_PAT1_1, DATA_FOR_ECC_INVPATT4
1611 dli R_ECC_PAT1_2, DATA_FOR_ECC_INVPATT4
1612 dli R_ECC_PAT1_3, DATA_FOR_ECC_INVPATT4
1619 dli R_BG_SCRATCH1, 2
1621 daddiu R_BG_SCRATCH1, R_BG_SCRATCH1, -1
1622 bne R_BG_SCRATCH1, $0, 2b
1624 daddiu R_BG_SCRATCH0, R_BG_SCRATCH0, -1
1625 bne R_BG_SCRATCH0, $0, 1b
1628 dli R_ECC_RADDR, XKPHYS_C_COH_EXC
1629 dli R_ECC_SCRATCH0, L2_RAM_BASE_ADDR
1630 or R_ECC_RADDR, R_ECC_RADDR, R_WRBC_SCRATCH0
1631 sll R_ECC_SCRATCH1, R_ECC_BLOCK, L2_BLOCK_SHIFT
1632 or R_ECC_RADDR, R_ECC_RADDR, R_ECC_SCRATCH1
1633 li R_ECC_NEXT_WAY, 0x20000
1635 move R_ECC_LINE,zero
1637 move R_PASS_FAIL, zero
1638 ECC_CHECK_PAT(R_ECC_WADDR,R_ECC_PAT0_0,R_ECC_PAT0_1,R_ECC_PAT0_2,R_ECC_PAT0_3,ecc_err)
1639 ECC_WRITE_PAT(R_ECC_WADDR,R_ECC_PAT1_0,R_ECC_PAT1_1,R_ECC_PAT1_2,R_ECC_PAT1_3)
1640 SET_ERR_TABLE(R_PASS_FAIL, R_ECC_LINE)
1641 daddiu R_ECC_RADDR, R_ECC_RADDR, 0x20
1643 slt R_ECC_SCRATCH0,R_ECC_LINE,L2_LINES_PER_BLOCK-1
1644 bne R_ECC_SCRATCH0, $0, ecc_march5
1645 add R_ECC_LINE, R_ECC_LINE,1
1647 dli R_ECC_RADDR, XKPHYS_C_COH_EXC
1648 dli R_ECC_SCRATCH0, L2_RAM_BASE_ADDR
1649 or R_ECC_RADDR, R_ECC_RADDR, R_WRBC_SCRATCH0
1650 sll R_ECC_SCRATCH1, R_ECC_BLOCK, L2_BLOCK_SHIFT
1651 or R_ECC_RADDR, R_ECC_RADDR, R_ECC_SCRATCH1
1652 li R_ECC_NEXT_WAY, 0x20000
1656 dli R_BG_SCRATCH1, 2
1658 daddiu R_BG_SCRATCH1, R_BG_SCRATCH1, -1
1659 bne R_BG_SCRATCH1, $0, 2b
1661 daddiu R_BG_SCRATCH0, R_BG_SCRATCH0, -1
1662 bne R_BG_SCRATCH0, $0, 1b
1665 move R_ECC_LINE,zero
1667 move R_PASS_FAIL, zero
1668 ECC_CHECK_PAT(R_ECC_WADDR,R_ECC_PAT1_0,R_ECC_PAT1_1,R_ECC_PAT1_2,R_ECC_PAT1_3,ecc_err)
1669 SET_ERR_TABLE(R_PASS_FAIL, R_ECC_LINE)
1670 daddiu R_ECC_RADDR, R_ECC_RADDR, 0x20
1672 slt R_ECC_SCRATCH0,R_ECC_LINE,L2_LINES_PER_BLOCK-1
1673 bne R_ECC_SCRATCH0, $0, ecc_march6
1674 add R_ECC_LINE, R_ECC_LINE,1
1676 /* if error, put test block info into s0 and return */
1677 or R_BG_SCRATCH0, R_ERR_TABLE_0, R_ERR_TABLE_1
1678 or R_BG_SCRATCH0, R_BG_SCRATCH0, R_ERR_TABLE_2
1679 or R_BG_SCRATCH0, R_BG_SCRATCH0, R_ERR_TABLE_3
1680 beq R_BG_SCRATCH0, zero, 1f
1688 addi R_ECC_BLOCK, R_ECC_BLOCK, 1
1689 /*slt R_ECC_SCRATCH0, R_ECC_BLOCK, (L2_BLOCKS_PER_ROW * L2_BLOCK_ROWS)*/
1690 addi R_ECC_SCRATCH1, k0, 1
1691 sll R_ECC_SCRATCH1, R_ECC_SCRATCH1, 2
1692 slt R_ECC_SCRATCH0, R_ECC_BLOCK, R_ECC_SCRATCH1
1693 /*slt R_ECC_SCRATCH0, R_ECC_BLOCK, (START_BLK + TOTAL_BLKS)*/
1694 bne R_ECC_SCRATCH0,$0, ecc_next_block
1707 END(l2dtest_data_ecc)
1714 #define L2_TAG_LINES 256
1715 #define L2_TAG_BLOCKS 8
1727 #define R_PATT_IND s0
1729 #define R_NEXT_WAY s3
1734 #define R_SCRATCH0 t6
1735 #define R_SCRATCH1 t7
1736 #define R_SCRATCH2 t8
1737 #define R_SCRATCH3 t9
1738 #define R_SCRATCH4 s6
1739 #define R_SCRATCH5 s7
1741 #ifndef _SB1250_PASS2_
1742 #define L2_READ_TAG_MASK 0x300fffffe0000
1744 #define L2_READ_TAG_MASK 0x3007fffff8000
1747 #ifndef _SB1250_PASS2_
1749 #define TAG_PATT0 0x0
1750 #define TAG_PATT1 0x1555555
1751 #define TAG_PATT2 0x1333333
1752 #define TAG_PATT3 0x10f0f0f
1753 #define TAG_PATT4 0x0ff00ff
1754 #define TAG_PATT5 0x0ffff
1756 #define TAG_INVPATT0 0x1ffffff
1757 #define TAG_INVPATT1 0x0aaaaaa
1758 #define TAG_INVPATT2 0x0cccccc
1759 #define TAG_INVPATT3 0x0f0f0f0
1760 #define TAG_INVPATT4 0x100ff00
1761 #define TAG_INVPATT5 0x1ff0000
1765 #define TAG_PATT0 0x0
1766 #define TAG_PATT1 0x1555555
1767 #define TAG_PATT2 0x3333333
1768 #define TAG_PATT3 0x10f0f0f
1769 #define TAG_PATT4 0x0ff00ff
1770 #define TAG_PATT5 0x0ffff
1772 #define TAG_INVPATT0 0x3ffffff
1773 #define TAG_INVPATT1 0x2aaaaaa
1774 #define TAG_INVPATT2 0x0cccccc
1775 #define TAG_INVPATT3 0x0f0f0f0
1776 #define TAG_INVPATT4 0x300ff00
1777 #define TAG_INVPATT5 0x3ff0000
1782 #define TAG_WRITE_PAT(addr, pattern0, pattern1)\
1783 dli R_SCRATCH0, L2M_WRITE_TAG; \
1784 or R_SCRATCH0, addr, R_SCRATCH0; \
1785 sd pattern0, 0x18(R_SCRATCH0); \
1786 cache L1CACHEOP(L1C_D,L1C_OP_HIT_WB_INVAL),0(R_SCRATCH0); \
1787 sd pattern1, 0x2018(R_SCRATCH0); \
1788 cache L1CACHEOP(L1C_D,L1C_OP_HIT_WB_INVAL),0x2000(R_SCRATCH0); \
1789 daddu R_SCRATCH0, R_SCRATCH0, R_NEXT_WAY; \
1790 sd pattern0, 0x18(R_SCRATCH0); \
1791 cache L1CACHEOP(L1C_D,L1C_OP_HIT_WB_INVAL),0(R_SCRATCH0); \
1792 sd pattern1, 0x2018(R_SCRATCH0); \
1793 cache L1CACHEOP(L1C_D,L1C_OP_HIT_WB_INVAL),0x2000(R_SCRATCH0); \
1794 daddu R_SCRATCH0, R_SCRATCH0, R_NEXT_WAY; \
1795 sd pattern0, 0x18(R_SCRATCH0); \
1796 cache L1CACHEOP(L1C_D,L1C_OP_HIT_WB_INVAL),0(R_SCRATCH0); \
1797 sd pattern1, 0x2018(R_SCRATCH0); \
1798 cache L1CACHEOP(L1C_D,L1C_OP_HIT_WB_INVAL),0x2000(R_SCRATCH0); \
1799 daddu R_SCRATCH0, R_SCRATCH0, R_NEXT_WAY; \
1800 sd pattern0, 0x18(R_SCRATCH0); \
1801 cache L1CACHEOP(L1C_D,L1C_OP_HIT_WB_INVAL),0(R_SCRATCH0); \
1802 sd pattern1, 0x2018(R_SCRATCH0); \
1803 cache L1CACHEOP(L1C_D,L1C_OP_HIT_WB_INVAL),0x2000(R_SCRATCH0)
1805 #ifndef _SB1250_PASS2_
1806 #define TAG_MAKE_PAT(pattern0, pattern1)\
1807 li R_SCRATCH4, 0x800000;\
1808 and R_SCRATCH2, R_SCRATCH4, pattern0;\
1809 dsll R_SCRATCH2, R_SCRATCH2, 26;\
1810 li R_SCRATCH4, 0x1000000;\
1811 and R_SCRATCH4, R_SCRATCH4, pattern0;\
1812 dsll R_SCRATCH4, R_SCRATCH4, 24;\
1813 or R_SCRATCH2, R_SCRATCH2, R_SCRATCH4;\
1814 li R_SCRATCH4, 0x7fffff;\
1815 and R_SCRATCH4, R_SCRATCH4, pattern0;\
1816 dsll R_SCRATCH4, R_SCRATCH4, 17;\
1817 or R_SCRATCH2, R_SCRATCH2, R_SCRATCH4;\
1818 dli R_SCRATCH4, L2_READ_TAG_MASK; \
1819 and pattern1, R_SCRATCH2, R_SCRATCH4;
1823 #define TAG_MAKE_PAT(pattern0, pattern1)\
1824 li R_SCRATCH4, 0x1000000;\
1825 and R_SCRATCH2, R_SCRATCH4, pattern0;\
1826 dsll R_SCRATCH2, R_SCRATCH2, 25;\
1827 li R_SCRATCH4, 0x2000000;\
1828 and R_SCRATCH4, R_SCRATCH4, pattern0;\
1829 dsll R_SCRATCH4, R_SCRATCH4, 23;\
1830 or R_SCRATCH2, R_SCRATCH2, R_SCRATCH4;\
1831 li R_SCRATCH4, 0x3fffff;\
1832 and R_SCRATCH4, R_SCRATCH4, pattern0;\
1833 dsll R_SCRATCH4, R_SCRATCH4, 17;\
1834 or R_SCRATCH2, R_SCRATCH2, R_SCRATCH4;\
1835 li R_SCRATCH4, 0xc00000;\
1836 and R_SCRATCH4, R_SCRATCH4, pattern0;\
1837 dsrl R_SCRATCH4, R_SCRATCH4, 7;\
1838 or R_SCRATCH2, R_SCRATCH2, R_SCRATCH4;\
1839 dli R_SCRATCH4, L2_READ_TAG_MASK; \
1840 and pattern1, R_SCRATCH2, R_SCRATCH4;
1844 #define TAG_CHECK_PAT(addr, pattern0, pattern1)\
1846 dli R_SCRATCH4, XKPHYS_UNC; \
1847 dli R_SCRATCH5, L2_BASE; \
1848 or R_SCRATCH4, R_SCRATCH4, R_SCRATCH5; \
1849 dli R_SCRATCH5, L2_READ_TAG_MASK;\
1850 dli R_SCRATCH0, L2M_READ_RAW_ACCESS; \
1851 or R_SCRATCH0, addr, R_SCRATCH0; \
1852 1: ld R_SCRATCH1, (R_SCRATCH0); \
1854 ld R_SCRATCH1, L2_READ_TAG(R_SCRATCH4); \
1855 and R_SCRATCH1, R_SCRATCH1, R_SCRATCH5; \
1856 sne R_SCRATCH1, R_SCRATCH1, pattern0; \
1857 or R_PASS_FAIL, R_PASS_FAIL, R_SCRATCH1; \
1858 ld R_SCRATCH1, 0x2000(R_SCRATCH0); \
1860 ld R_SCRATCH1, L2_READ_TAG(R_SCRATCH4); \
1861 and R_SCRATCH1, R_SCRATCH1, R_SCRATCH5; \
1862 sne R_SCRATCH1, R_SCRATCH1, pattern1; \
1863 or R_PASS_FAIL, R_PASS_FAIL, R_SCRATCH1; \
1864 addi R_SCRATCH2, R_SCRATCH2, -1; \
1865 bne R_SCRATCH2, zero, 1b; \
1866 daddu R_SCRATCH0, R_SCRATCH0, R_NEXT_WAY
1868 #define TAG_CHECK_PAT1(addr, pattern0, pattern1)\
1870 dli R_SCRATCH4, XKPHYS_UNC; \
1871 dli R_SCRATCH5, L2_BASE; \
1872 or R_SCRATCH4, R_SCRATCH4, R_SCRATCH5; \
1873 dli R_SCRATCH5, L2_READ_TAG_MASK;\
1874 dli R_SCRATCH0, 0x00200000; \
1875 or R_SCRATCH0, addr, R_SCRATCH0; \
1876 1: ld R_SCRATCH1, (R_SCRATCH0); \
1878 ld R_SCRATCH1, L2_READ_TAG(R_SCRATCH4); \
1879 and R_SCRATCH1, R_SCRATCH1, R_SCRATCH5; \
1880 sne R_SCRATCH1, R_SCRATCH1, pattern0; \
1881 or R_PASS_FAIL, R_PASS_FAIL, R_SCRATCH1; \
1882 ld R_SCRATCH1, 0x2000(R_SCRATCH0); \
1884 ld R_SCRATCH1, L2_READ_TAG(R_SCRATCH4); \
1885 and R_SCRATCH1, R_SCRATCH1, R_SCRATCH5; \
1886 sne R_SCRATCH1, R_SCRATCH1, pattern1; \
1887 or R_PASS_FAIL, R_PASS_FAIL, R_SCRATCH1; \
1888 addi R_SCRATCH2, R_SCRATCH2, -1; \
1889 bne R_SCRATCH2, zero, 1b; \
1890 daddu R_SCRATCH0, R_SCRATCH0, R_NEXT_WAY
1893 LEAF(l2dtest_tag_data)
1895 move R_ERR_TABLE_0, $0
1896 move R_ERR_TABLE_1, $0
1897 move R_ERR_TABLE_2, $0
1898 move R_ERR_TABLE_3, $0
1900 /*li R_BLOCK, START_BLK*/
1902 li R_NEXT_WAY,0x20000
1905 addi R_BG_SCRATCH2, R_BG_BLOCK, '0'
1906 or R_BG_SCRATCH2, R_BG_SCRATCH2, ('T' << 8)
1907 SET_LEDS_HI(R_BG_SCRATCH2, R_BG_SCRATCH0, R_BG_SCRATCH1)
1911 dli R_PAT0_0, TAG_PATT0
1912 dli R_PAT0_1, TAG_PATT0
1913 TAG_MAKE_PAT(R_PAT0_0, R_PAT0_2)
1914 TAG_MAKE_PAT(R_PAT0_1, R_PAT0_3)
1915 dli R_PAT1_0, TAG_INVPATT0
1916 dli R_PAT1_1, TAG_INVPATT0
1917 TAG_MAKE_PAT(R_PAT1_0, R_PAT1_2)
1918 TAG_MAKE_PAT(R_PAT1_1, R_PAT1_3)
1922 addi R_BG_SCRATCH2, R_PATT_IND, '0'
1923 or R_BG_SCRATCH2, R_BG_SCRATCH2, ('P' << 8)
1924 SET_LEDS_LO(R_BG_SCRATCH2, R_BG_SCRATCH0, R_BG_SCRATCH1)
1927 dli R_WADDR, XKPHYS_C_COH_EXC /* uncached accelerated */
1928 dli R_SCRATCH0, L2_RAM_BASE_ADDR /* mgmt mode */
1929 or R_WADDR,R_ECC_WADDR,R_BG_SCRATCH0
1930 sll R_SCRATCH0, R_BLOCK, L2_BLOCK_ROW_SHIFT /* block number */
1931 or R_WADDR, R_WADDR, R_SCRATCH0
1936 TAG_WRITE_PAT(R_WADDR,R_PAT0_0,R_PAT0_1)
1938 dadd R_WADDR, R_WADDR, R_SCRATCH0 /* next line */
1940 slt R_SCRATCH0,R_LINE,L2_LINES_PER_BLOCK-1
1941 bne R_SCRATCH0, $0, tag_init_next_line
1942 add R_LINE, R_LINE,1
1944 dli R_RADDR, XKPHYS_C_COH_EXC
1945 dli R_SCRATCH0, L2_RAM_BASE_ADDR
1946 or R_RADDR, R_RADDR, R_SCRATCH0
1947 sll R_SCRATCH1, R_BLOCK, L2_BLOCK_ROW_SHIFT
1948 or R_RADDR, R_RADDR, R_SCRATCH1
1949 li R_NEXT_WAY, 0x20000
1953 move R_PASS_FAIL, zero
1954 TAG_CHECK_PAT(R_WADDR,R_PAT0_2,R_PAT0_3)
1955 TAG_WRITE_PAT(R_WADDR,R_PAT1_0,R_PAT1_1)
1956 TAG_CHECK_PAT(R_WADDR,R_PAT1_2,R_PAT1_3)
1957 SET_ERR_TABLE(R_PASS_FAIL, R_LINE)
1958 daddiu R_RADDR, R_RADDR, 0x20
1960 slt R_SCRATCH0,R_LINE,L2_LINES_PER_BLOCK-1
1961 bne R_SCRATCH0, $0, tag_march1
1962 add R_LINE, R_LINE,1
1964 dli R_RADDR, XKPHYS_C_COH_EXC
1965 dli R_SCRATCH0, L2_RAM_BASE_ADDR
1966 or R_RADDR, R_RADDR, R_SCRATCH0
1967 sll R_SCRATCH1, R_BLOCK, L2_BLOCK_ROW_SHIFT
1968 or R_RADDR, R_RADDR, R_SCRATCH1
1972 move R_PASS_FAIL, zero
1973 TAG_CHECK_PAT(R_WADDR,R_PAT1_2,R_PAT1_3)
1974 TAG_WRITE_PAT(R_WADDR,R_PAT0_0,R_PAT0_1)
1975 TAG_CHECK_PAT(R_WADDR,R_PAT0_2,R_PAT0_3)
1976 SET_ERR_TABLE(R_PASS_FAIL, R_LINE)
1977 daddiu R_RADDR, R_RADDR, 0x20
1979 slt R_SCRATCH0,R_LINE,L2_LINES_PER_BLOCK-1
1980 bne R_SCRATCH0, $0, tag_march2
1981 add R_LINE, R_LINE,1
1983 dli R_RADDR, XKPHYS_C_COH_EXC
1984 dli R_SCRATCH0, L2_RAM_BASE_ADDR
1985 or R_RADDR, R_RADDR, R_SCRATCH0
1986 #ifdef TEST_ALL_LINES
1987 sll R_SCRATCH0, R_BLOCK, 1
1988 addi R_SCRATCH0, R_SCRATCH0, 1
1989 sll R_SCRATCH1, R_SCRATCH0, L2_BLOCK_SHIFT
1991 sll R_SCRATCH1, R_BLOCK, L2_BLOCK_ROW_SHIFT
1993 or R_RADDR, R_RADDR, R_SCRATCH1
1994 #ifdef TEST_ALL_LINES
1995 daddiu R_RADDR, R_RADDR, -32
1997 daddiu R_RADDR, R_RADDR, L2_LINES_PER_BLOCK*32-32
1999 li R_LINE,L2_LINES_PER_BLOCK-1
2001 move R_PASS_FAIL, zero
2002 TAG_CHECK_PAT(R_WADDR,R_PAT0_2,R_PAT0_3)
2003 TAG_WRITE_PAT(R_WADDR,R_PAT1_0,R_PAT1_1)
2004 TAG_CHECK_PAT(R_WADDR,R_PAT1_2,R_PAT1_3)
2005 SET_ERR_TABLE(R_PASS_FAIL, R_LINE)
2006 daddiu R_RADDR, R_RADDR, -32
2008 bne R_LINE,$0, tag_march3
2009 add R_LINE,R_LINE,-1
2011 dli R_RADDR, XKPHYS_C_COH_EXC
2012 dli R_SCRATCH0, L2_RAM_BASE_ADDR
2013 or R_RADDR, R_RADDR, R_SCRATCH0
2014 #ifdef TEST_ALL_LINES
2015 sll R_SCRATCH0, R_BLOCK, 1
2016 addi R_SCRATCH0, R_SCRATCH0, 1
2017 sll R_SCRATCH1, R_SCRATCH0, L2_BLOCK_SHIFT
2019 sll R_SCRATCH1, R_BLOCK, L2_BLOCK_ROW_SHIFT
2021 or R_RADDR, R_RADDR, R_SCRATCH1
2022 #ifdef TEST_ALL_LINES
2023 daddiu R_RADDR, R_RADDR, -32
2025 daddiu R_RADDR, R_RADDR, L2_LINES_PER_BLOCK*32-32
2027 li R_LINE,L2_LINES_PER_BLOCK-1
2029 move R_PASS_FAIL, zero
2030 TAG_CHECK_PAT(R_WADDR,R_PAT1_2,R_PAT1_3)
2031 TAG_WRITE_PAT(R_WADDR,R_PAT0_0,R_PAT0_1)
2032 TAG_CHECK_PAT(R_WADDR,R_PAT0_2,R_PAT0_3)
2033 SET_ERR_TABLE(R_PASS_FAIL, R_LINE)
2034 daddiu R_RADDR, R_RADDR, -32
2036 bne R_LINE,$0, tag_march4
2037 add R_LINE,R_LINE,-1
2039 addi R_PATT_IND, R_PATT_IND, 1
2041 bne R_SCRATCH0, R_PATT_IND, 2f
2043 dli R_PAT0_0, TAG_INVPATT0
2044 dli R_PAT0_1, TAG_PATT0
2045 TAG_MAKE_PAT(R_PAT0_0, R_PAT0_2)
2046 TAG_MAKE_PAT(R_PAT0_1, R_PAT0_3)
2047 dli R_PAT1_0, TAG_PATT0
2048 dli R_PAT1_1, TAG_INVPATT0
2049 TAG_MAKE_PAT(R_PAT1_0, R_PAT1_2)
2050 TAG_MAKE_PAT(R_PAT1_1, R_PAT1_3)
2055 bne R_SCRATCH0, R_PATT_IND, 3f
2058 dli R_PAT0_0, TAG_PATT2
2059 dli R_PAT0_1, TAG_PATT2
2060 TAG_MAKE_PAT(R_PAT0_0, R_PAT0_2)
2061 TAG_MAKE_PAT(R_PAT0_1, R_PAT0_3)
2062 dli R_PAT1_0, TAG_INVPATT2
2063 dli R_PAT1_1, TAG_INVPATT2
2064 TAG_MAKE_PAT(R_PAT1_0, R_PAT1_2)
2065 TAG_MAKE_PAT(R_PAT1_1, R_PAT1_3)
2069 bne R_SCRATCH0, R_PATT_IND, 4f
2072 dli R_PAT0_0, TAG_PATT3
2073 dli R_PAT0_1, TAG_PATT3
2074 TAG_MAKE_PAT(R_PAT0_0, R_PAT0_2)
2075 TAG_MAKE_PAT(R_PAT0_1, R_PAT0_3)
2076 dli R_PAT1_0, TAG_INVPATT3
2077 dli R_PAT1_1, TAG_INVPATT3
2078 TAG_MAKE_PAT(R_PAT1_0, R_PAT1_2)
2079 TAG_MAKE_PAT(R_PAT1_1, R_PAT1_3)
2083 bne R_SCRATCH0, R_PATT_IND, 5f
2086 dli R_PAT0_0, TAG_PATT4
2087 dli R_PAT0_1, TAG_PATT4
2088 TAG_MAKE_PAT(R_PAT0_0, R_PAT0_2)
2089 TAG_MAKE_PAT(R_PAT0_1, R_PAT0_3)
2090 dli R_PAT1_0, TAG_INVPATT4
2091 dli R_PAT1_1, TAG_INVPATT4
2092 TAG_MAKE_PAT(R_PAT1_0, R_PAT1_2)
2093 TAG_MAKE_PAT(R_PAT1_1, R_PAT1_3)
2097 bne R_SCRATCH0, R_PATT_IND, 6f
2100 dli R_PAT0_0, TAG_PATT5
2101 dli R_PAT0_1, TAG_PATT5
2102 TAG_MAKE_PAT(R_PAT0_0, R_PAT0_2)
2103 TAG_MAKE_PAT(R_PAT0_1, R_PAT0_3)
2104 dli R_PAT1_0, TAG_INVPATT5
2105 dli R_PAT1_1, TAG_INVPATT5
2106 TAG_MAKE_PAT(R_PAT1_0, R_PAT1_2)
2107 TAG_MAKE_PAT(R_PAT1_1, R_PAT1_3)
2115 daddiu R_SCRATCH1, R_SCRATCH1, -1
2116 bne R_SCRATCH1, $0, 2b
2118 daddiu R_SCRATCH0, R_SCRATCH0, -1
2119 bne R_SCRATCH0, $0, 1b
2122 dli R_RADDR, XKPHYS_C_COH_EXC
2123 dli R_SCRATCH0, L2_RAM_BASE_ADDR
2124 or R_RADDR, R_RADDR, R_SCRATCH0
2125 sll R_SCRATCH1, R_BLOCK, L2_BLOCK_ROW_SHIFT
2126 or R_RADDR, R_RADDR, R_SCRATCH1
2127 li R_NEXT_WAY, 0x20000
2131 move R_PASS_FAIL, zero
2132 TAG_CHECK_PAT(R_WADDR,R_PAT0_2,R_PAT0_3)
2133 TAG_WRITE_PAT(R_WADDR,R_PAT1_0,R_PAT1_1)
2134 SET_ERR_TABLE(R_PASS_FAIL, R_LINE)
2135 daddiu R_RADDR, R_RADDR, 0x20
2137 slt R_SCRATCH0,R_LINE,L2_LINES_PER_BLOCK-1
2138 bne R_SCRATCH0, $0, tag_march5
2139 add R_LINE, R_LINE,1
2145 daddiu R_SCRATCH1, R_SCRATCH1, -1
2146 bne R_SCRATCH1, $0, 2b
2148 daddiu R_SCRATCH0, R_SCRATCH0, -1
2149 bne R_SCRATCH0, $0, 1b
2152 dli R_RADDR, XKPHYS_C_COH_EXC
2153 dli R_SCRATCH0, L2_RAM_BASE_ADDR
2154 or R_RADDR, R_RADDR, R_SCRATCH0
2155 sll R_SCRATCH1, R_BLOCK, L2_BLOCK_ROW_SHIFT
2156 or R_RADDR, R_RADDR, R_SCRATCH1
2160 move R_PASS_FAIL, zero
2161 TAG_CHECK_PAT(R_WADDR,R_PAT1_2,R_PAT1_3)
2162 SET_ERR_TABLE(R_PASS_FAIL, R_LINE)
2163 daddiu R_RADDR, R_RADDR, 0x20
2165 slt R_SCRATCH0,R_LINE,L2_LINES_PER_BLOCK-1
2166 bne R_SCRATCH0, $0, tag_march6
2167 add R_LINE, R_LINE,1
2169 /* if error, put test block info into s0 and return */
2170 or R_BG_SCRATCH0, R_ERR_TABLE_0, R_ERR_TABLE_1
2171 or R_BG_SCRATCH0, R_BG_SCRATCH0, R_ERR_TABLE_2
2172 or R_BG_SCRATCH0, R_BG_SCRATCH0, R_ERR_TABLE_3
2173 beq R_BG_SCRATCH0, zero, 1f
2181 addi R_BLOCK, R_BLOCK, 1
2182 addi R_SCRATCH1, k0, 1
2183 sll R_SCRATCH1, R_SCRATCH1, 1
2184 /*slt R_SCRATCH0, R_BLOCK, START_BLK+TOTAL_BLKS/2*/
2185 slt R_SCRATCH0, R_BLOCK, R_SCRATCH1
2186 bne R_SCRATCH0,$0, tag_next_block
2197 END(l2dtest_tag_data)
2199 #define TAG_ECC_PATT0 0x0
2200 #define TAG_ECC_PATT1 0x0000003d
2201 #define TAG_ECC_PATT2 0x00000009
2202 #define TAG_ECC_PATT3 0x0000001d
2204 #define TAG_ECC_INVPATT0 0x0000000f
2205 #define TAG_ECC_INVPATT1 0x00000032
2206 #define TAG_ECC_INVPATT2 0x00000006
2207 #define TAG_ECC_INVPATT3 0x00000012
2210 #define TAG_ECC_WRITE_PAT(addr, pattern0, pattern1)\
2211 dli R_SCRATCH0, L2M_WRITE_TAG; \
2212 or R_SCRATCH0, addr, R_SCRATCH0; \
2213 sd pattern0, 0x18(R_SCRATCH0); \
2214 cache L1CACHEOP(L1C_D,L1C_OP_HIT_WB_INVAL),0(R_SCRATCH0); \
2216 sd pattern1, 0x2018(R_SCRATCH0); \
2217 cache L1CACHEOP(L1C_D,L1C_OP_HIT_WB_INVAL),0(R_SCRATCH0); \
2219 daddu R_SCRATCH0, R_SCRATCH0, R_NEXT_WAY; \
2220 sd pattern0, 0x18(R_SCRATCH0); \
2221 cache L1CACHEOP(L1C_D,L1C_OP_HIT_WB_INVAL),0(R_SCRATCH0); \
2223 sd pattern1, 0x2018(R_SCRATCH0); \
2224 cache L1CACHEOP(L1C_D,L1C_OP_HIT_WB_INVAL),0x2000(R_SCRATCH0); \
2226 daddu R_SCRATCH0, R_SCRATCH0, R_NEXT_WAY; \
2227 sd pattern0, 0x18(R_SCRATCH0); \
2228 cache L1CACHEOP(L1C_D,L1C_OP_HIT_WB_INVAL),0(R_SCRATCH0); \
2230 sd pattern1, 0x2018(R_SCRATCH0); \
2231 cache L1CACHEOP(L1C_D,L1C_OP_HIT_WB_INVAL),0x2000(R_SCRATCH0); \
2233 daddu R_SCRATCH0, R_SCRATCH0, R_NEXT_WAY; \
2234 sd pattern0, 0x18(R_SCRATCH0); \
2235 cache L1CACHEOP(L1C_D,L1C_OP_HIT_WB_INVAL),0(R_SCRATCH0); \
2237 sd pattern1, 0x2018(R_SCRATCH0); \
2238 cache L1CACHEOP(L1C_D,L1C_OP_HIT_WB_INVAL),0x2000(R_SCRATCH0);\
2241 #define TAG_ECC_CHECK_PAT(addr, pattern0, pattern1)\
2243 dli R_SCRATCH5, XKPHYS_UNC; \
2244 dli R_SCRATCH3, SCD_BW_BASE; \
2245 or R_SCRATCH3, R_SCRATCH3, R_SCRATCH5; \
2246 sd zero, BUS_L2_ERRORS(R_SCRATCH3); \
2248 dli R_SCRATCH4, L2_BASE; \
2249 or R_SCRATCH4, R_SCRATCH4, R_SCRATCH5; \
2250 move R_SCRATCH0, addr; \
2251 1: dli R_SCRATCH5, L2_READ_TAG_MASK;\
2252 ld R_SCRATCH1, (R_SCRATCH0); \
2254 ld R_SCRATCH1, L2_READ_TAG(R_SCRATCH4); \
2255 and R_SCRATCH1, R_SCRATCH1, R_SCRATCH5; \
2256 sne R_SCRATCH1, R_SCRATCH1, pattern0; \
2257 or R_PASS_FAIL, R_PASS_FAIL, R_SCRATCH1; \
2258 ld R_SCRATCH1, 0x2000(R_SCRATCH0); \
2260 ld R_SCRATCH1, L2_READ_TAG(R_SCRATCH4); \
2261 and R_SCRATCH1, R_SCRATCH1, R_SCRATCH5; \
2262 sne R_SCRATCH1, R_SCRATCH1, pattern1; \
2263 or R_PASS_FAIL, R_PASS_FAIL, R_SCRATCH1; \
2264 daddu R_SCRATCH0, R_SCRATCH0, R_NEXT_WAY;\
2265 ld R_SCRATCH1, (R_SCRATCH0); \
2267 ld R_SCRATCH1, L2_READ_TAG(R_SCRATCH4); \
2268 and R_SCRATCH1, R_SCRATCH1, R_SCRATCH5; \
2269 sne R_SCRATCH1, R_SCRATCH1, pattern0; \
2270 or R_PASS_FAIL, R_PASS_FAIL, R_SCRATCH1; \
2271 ld R_SCRATCH1, 0x2000(R_SCRATCH0); \
2273 ld R_SCRATCH1, L2_READ_TAG(R_SCRATCH4); \
2274 and R_SCRATCH1, R_SCRATCH1, R_SCRATCH5; \
2275 sne R_SCRATCH1, R_SCRATCH1, pattern1; \
2276 or R_PASS_FAIL, R_PASS_FAIL, R_SCRATCH1; \
2277 addi R_SCRATCH2, R_SCRATCH2, -1; \
2278 bne R_SCRATCH2, zero, 1b; \
2279 daddu R_SCRATCH0, R_SCRATCH0, R_NEXT_WAY;\
2280 /*TAG_CHECK_PAT(addr, pattern0, pattern1) ;*/ \
2281 dli R_SCRATCH5, XKPHYS_UNC; \
2282 dli R_SCRATCH3, SCD_BW_BASE; \
2283 or R_SCRATCH3, R_SCRATCH3, R_SCRATCH5; \
2284 ld R_SCRATCH5, BUS_L2_ERRORS(R_SCRATCH3); \
2285 dsrl R_SCRATCH5, R_SCRATCH5, 16; \
2286 sne R_SCRATCH5, R_ECC_SCRATCH5, $0; \
2287 or R_PASS_FAIL, R_PASS_FAIL, R_ECC_SCRATCH5
2289 LEAF(l2dtest_tag_ecc)
2291 /*li R_BLOCK, START_BLK*/
2293 li R_NEXT_WAY,0x20000
2296 addi R_BG_SCRATCH2, R_BG_BLOCK, '0'
2297 or R_BG_SCRATCH2, R_BG_SCRATCH2, ('P' << 8)
2298 SET_LEDS_HI(R_BG_SCRATCH2, R_BG_SCRATCH0, R_BG_SCRATCH1)
2302 dli R_PAT0_0, TAG_ECC_PATT0
2303 dli R_PAT0_1, TAG_ECC_PATT0
2304 TAG_MAKE_PAT(R_PAT0_0, R_PAT0_2)
2305 TAG_MAKE_PAT(R_PAT0_1, R_PAT0_3)
2306 dli R_PAT1_0, TAG_ECC_INVPATT0
2307 dli R_PAT1_1, TAG_ECC_INVPATT0
2308 TAG_MAKE_PAT(R_PAT1_0, R_PAT1_2)
2309 TAG_MAKE_PAT(R_PAT1_1, R_PAT1_3)
2311 tag_ecc_next_pattern:
2313 addi R_BG_SCRATCH2, R_PATT_IND, '0'
2314 or R_BG_SCRATCH2, R_BG_SCRATCH2, ('P' << 8)
2315 SET_LEDS_LO(R_BG_SCRATCH2, R_BG_SCRATCH0, R_BG_SCRATCH1)
2318 dli R_WADDR, XKPHYS_C_COH_EXC /* uncached accelerated */
2319 dli R_SCRATCH0, L2_RAM_BASE_ADDR /* mgmt mode */
2320 or R_WADDR,R_ECC_WADDR,R_BG_SCRATCH0
2321 sll R_SCRATCH0, R_BLOCK, L2_BLOCK_ROW_SHIFT /* block number */
2322 or R_WADDR, R_WADDR, R_SCRATCH0
2326 tag_ecc_init_next_line:
2327 TAG_ECC_WRITE_PAT(R_WADDR,R_PAT0_0,R_PAT0_1)
2329 dadd R_WADDR, R_WADDR, R_SCRATCH0 /* next line */
2331 slt R_SCRATCH0,R_LINE,L2_LINES_PER_BLOCK-1
2332 bne R_SCRATCH0, $0, tag_ecc_init_next_line
2333 add R_LINE, R_LINE,1
2335 dli R_RADDR, XKPHYS_C_COH_EXC
2336 dli R_SCRATCH0, L2_RAM_BASE_ADDR
2337 or R_RADDR, R_RADDR, R_SCRATCH0
2338 sll R_SCRATCH1, R_BLOCK, L2_BLOCK_ROW_SHIFT
2339 or R_RADDR, R_RADDR, R_SCRATCH1
2340 li R_NEXT_WAY, 0x20000
2344 move R_PASS_FAIL, zero
2345 TAG_ECC_CHECK_PAT(R_WADDR,R_PAT0_2,R_PAT0_3)
2346 TAG_ECC_WRITE_PAT(R_WADDR,R_PAT1_0,R_PAT1_1)
2347 TAG_ECC_CHECK_PAT(R_WADDR,R_PAT1_2,R_PAT1_3)
2348 SET_ERR_TABLE(R_PASS_FAIL, R_LINE)
2349 daddiu R_RADDR, R_RADDR, 0x20
2351 slt R_SCRATCH0,R_LINE,L2_LINES_PER_BLOCK-1
2352 bne R_SCRATCH0, $0, tag_ecc_march1
2353 add R_LINE, R_LINE,1
2356 dli R_RADDR, XKPHYS_C_COH_EXC
2357 dli R_SCRATCH0, L2_RAM_BASE_ADDR
2358 or R_RADDR, R_RADDR, R_SCRATCH0
2359 sll R_SCRATCH1, R_BLOCK, L2_BLOCK_ROW_SHIFT
2360 or R_RADDR, R_RADDR, R_SCRATCH1
2364 move R_PASS_FAIL, zero
2365 TAG_ECC_CHECK_PAT(R_WADDR,R_PAT1_2,R_PAT1_3)
2366 TAG_ECC_WRITE_PAT(R_WADDR,R_PAT0_0,R_PAT0_1)
2367 TAG_ECC_CHECK_PAT(R_WADDR,R_PAT0_2,R_PAT0_3)
2368 SET_ERR_TABLE(R_PASS_FAIL, R_LINE)
2369 daddiu R_RADDR, R_RADDR, 0x20
2371 slt R_SCRATCH0,R_LINE,L2_LINES_PER_BLOCK-1
2372 bne R_SCRATCH0, $0, tag_ecc_march2
2373 add R_LINE, R_LINE,1
2376 dli R_RADDR, XKPHYS_C_COH_EXC
2377 dli R_SCRATCH0, L2_RAM_BASE_ADDR
2378 or R_RADDR, R_RADDR, R_SCRATCH0
2379 #ifdef TEST_ALL_LINES
2380 sll R_SCRATCH0, R_BLOCK, 1
2381 addi R_SCRATCH0, R_SCRATCH0, 1
2382 sll R_SCRATCH1, R_SCRATCH0, L2_BLOCK_SHIFT
2384 sll R_SCRATCH1, R_BLOCK, L2_BLOCK_ROW_SHIFT
2386 or R_RADDR, R_RADDR, R_SCRATCH1
2387 #ifdef TEST_ALL_LINES
2388 daddiu R_RADDR, R_RADDR, -32
2390 daddiu R_RADDR, R_RADDR, L2_LINES_PER_BLOCK*32-32
2392 li R_LINE,L2_LINES_PER_BLOCK-1
2394 move R_PASS_FAIL, zero
2395 TAG_ECC_CHECK_PAT(R_WADDR,R_PAT0_2,R_PAT0_3)
2396 TAG_ECC_WRITE_PAT(R_WADDR,R_PAT1_0,R_PAT1_1)
2397 TAG_ECC_CHECK_PAT(R_WADDR,R_PAT1_2,R_PAT1_3)
2398 SET_ERR_TABLE(R_PASS_FAIL, R_LINE)
2399 daddiu R_RADDR, R_RADDR, -32
2401 bne R_LINE,$0, tag_ecc_march3
2402 add R_LINE,R_LINE,-1
2405 dli R_RADDR, XKPHYS_C_COH_EXC
2406 dli R_SCRATCH0, L2_RAM_BASE_ADDR
2407 or R_RADDR, R_RADDR, R_SCRATCH0
2408 #ifdef TEST_ALL_LINES
2409 sll R_SCRATCH0, R_BLOCK, 1
2410 addi R_SCRATCH0, R_SCRATCH0, 1
2411 sll R_SCRATCH1, R_SCRATCH0, L2_BLOCK_SHIFT
2413 sll R_SCRATCH1, R_BLOCK, L2_BLOCK_ROW_SHIFT
2415 or R_RADDR, R_RADDR, R_SCRATCH1
2416 #ifdef TEST_ALL_LINES
2417 daddiu R_RADDR, R_RADDR, -32
2419 daddiu R_RADDR, R_RADDR, L2_LINES_PER_BLOCK*32-32
2421 li R_LINE,L2_LINES_PER_BLOCK-1
2423 move R_PASS_FAIL, zero
2424 TAG_ECC_CHECK_PAT(R_WADDR,R_PAT1_2,R_PAT1_3)
2425 TAG_ECC_WRITE_PAT(R_WADDR,R_PAT0_0,R_PAT0_1)
2426 TAG_ECC_CHECK_PAT(R_WADDR,R_PAT0_2,R_PAT0_3)
2427 SET_ERR_TABLE(R_PASS_FAIL, R_LINE)
2428 daddiu R_RADDR, R_RADDR, -32
2430 bne R_LINE,$0, tag_ecc_march4
2431 add R_LINE,R_LINE,-1
2433 addi R_PATT_IND, R_PATT_IND, 1
2435 bne R_SCRATCH0, R_PATT_IND, 2f
2437 dli R_PAT0_0, TAG_ECC_INVPATT0
2438 dli R_PAT0_1, TAG_ECC_PATT0
2439 TAG_MAKE_PAT(R_PAT0_0, R_PAT0_2)
2440 TAG_MAKE_PAT(R_PAT0_1, R_PAT0_3)
2441 dli R_PAT1_0, TAG_ECC_PATT0
2442 dli R_PAT1_1, TAG_ECC_INVPATT0
2443 TAG_MAKE_PAT(R_PAT1_0, R_PAT1_2)
2444 TAG_MAKE_PAT(R_PAT1_1, R_PAT1_3)
2445 b tag_ecc_next_pattern
2448 bne R_SCRATCH0, R_PATT_IND, 3f
2450 dli R_PAT0_0, TAG_ECC_PATT1
2451 dli R_PAT0_1, TAG_ECC_PATT1
2452 TAG_MAKE_PAT(R_PAT0_0, R_PAT0_2)
2453 TAG_MAKE_PAT(R_PAT0_1, R_PAT0_3)
2454 dli R_PAT1_0, TAG_ECC_INVPATT1
2455 dli R_PAT1_1, TAG_ECC_INVPATT1
2456 TAG_MAKE_PAT(R_PAT1_0, R_PAT1_2)
2457 TAG_MAKE_PAT(R_PAT1_1, R_PAT1_3)
2458 b tag_ecc_next_pattern
2462 bne R_SCRATCH0, R_PATT_IND, 4f
2464 dli R_PAT0_0, TAG_ECC_PATT2
2465 dli R_PAT0_1, TAG_ECC_PATT2
2466 TAG_MAKE_PAT(R_PAT0_0, R_PAT0_2)
2467 TAG_MAKE_PAT(R_PAT0_1, R_PAT0_3)
2468 dli R_PAT1_0, TAG_ECC_INVPATT2
2469 dli R_PAT1_1, TAG_ECC_INVPATT2
2470 TAG_MAKE_PAT(R_PAT1_0, R_PAT1_2)
2471 TAG_MAKE_PAT(R_PAT1_1, R_PAT1_3)
2472 b tag_ecc_next_pattern
2476 bne R_SCRATCH0, R_PATT_IND, 5f
2478 dli R_PAT0_0, TAG_ECC_PATT3
2479 dli R_PAT0_1, TAG_ECC_PATT3
2480 TAG_MAKE_PAT(R_PAT0_0, R_PAT0_2)
2481 TAG_MAKE_PAT(R_PAT0_1, R_PAT0_3)
2482 dli R_PAT1_0, TAG_ECC_INVPATT3
2483 dli R_PAT1_1, TAG_ECC_INVPATT3
2484 TAG_MAKE_PAT(R_PAT1_0, R_PAT1_2)
2485 TAG_MAKE_PAT(R_PAT1_1, R_PAT1_3)
2486 b tag_ecc_next_pattern
2493 daddiu R_SCRATCH1, R_SCRATCH1, -1
2494 bne R_SCRATCH1, $0, 2b
2496 daddiu R_SCRATCH0, R_SCRATCH0, -1
2497 bne R_SCRATCH0, $0, 1b
2500 dli R_RADDR, XKPHYS_C_COH_EXC
2501 dli R_SCRATCH0, L2_RAM_BASE_ADDR
2502 or R_RADDR, R_RADDR, R_SCRATCH0
2503 sll R_SCRATCH1, R_BLOCK, L2_BLOCK_ROW_SHIFT
2504 or R_RADDR, R_RADDR, R_SCRATCH1
2505 li R_NEXT_WAY, 0x20000
2509 move R_PASS_FAIL, zero
2510 TAG_ECC_CHECK_PAT(R_WADDR,R_PAT0_2,R_PAT0_3)
2511 TAG_ECC_WRITE_PAT(R_WADDR,R_PAT1_0,R_PAT1_1)
2512 SET_ERR_TABLE(R_PASS_FAIL, R_LINE)
2513 daddiu R_RADDR, R_RADDR, 0x20
2515 slt R_SCRATCH0,R_LINE,L2_LINES_PER_BLOCK-1
2516 bne R_SCRATCH0, $0, tag_ecc_march5
2517 add R_LINE, R_LINE,1
2523 daddiu R_SCRATCH1, R_SCRATCH1, -1
2524 bne R_SCRATCH1, $0, 2b
2526 daddiu R_SCRATCH0, R_SCRATCH0, -1
2527 bne R_SCRATCH0, $0, 1b
2530 dli R_RADDR, XKPHYS_C_COH_EXC
2531 dli R_SCRATCH0, L2_RAM_BASE_ADDR
2532 or R_RADDR, R_RADDR, R_SCRATCH0
2533 sll R_SCRATCH1, R_BLOCK, L2_BLOCK_ROW_SHIFT
2534 or R_RADDR, R_RADDR, R_SCRATCH1
2538 move R_PASS_FAIL, zero
2539 TAG_ECC_CHECK_PAT(R_WADDR,R_PAT1_2,R_PAT1_3)
2540 SET_ERR_TABLE(R_PASS_FAIL, R_LINE)
2541 daddiu R_RADDR, R_RADDR, 0x20
2543 slt R_SCRATCH0,R_LINE,L2_LINES_PER_BLOCK-1
2544 bne R_SCRATCH0, $0, tag_ecc_march6
2545 add R_LINE, R_LINE,1
2547 /* if error, put test block info into s0 and return */
2548 or R_BG_SCRATCH0, R_ERR_TABLE_0, R_ERR_TABLE_1
2549 or R_BG_SCRATCH0, R_BG_SCRATCH0, R_ERR_TABLE_2
2550 or R_BG_SCRATCH0, R_BG_SCRATCH0, R_ERR_TABLE_3
2551 beq R_BG_SCRATCH0, zero, 1f
2559 addi R_BLOCK, R_BLOCK, 1
2560 addi R_SCRATCH1, k0, 1
2561 sll R_SCRATCH1, R_SCRATCH1, 1
2562 slt R_SCRATCH0, R_BLOCK, R_SCRATCH1
2563 /*slt R_SCRATCH0, R_BLOCK, START_BLK+TOTAL_BLKS/2*/
2564 bne R_SCRATCH0,$0, tag_ecc_next_block
2576 END(l2dtest_tag_ecc)
2580 LEAF(sb1250_l2cache_init1)
2581 #define CACHE_LINE_SIZE 32
2583 # Save the old status register, and set the KX bit.
2589 # Start the index at the base of the cache management
2590 # area, but leave the address bit for "Valid" zero.
2591 # Note that the management tags are at 00_D000_0000,
2592 # which cannot be expressed with the PHYS_TO_K1 macro,
2593 # so well need to use a 64-bit address to get to it.
2596 # dli t0,PHYS_TO_XKPHYS_UNC(L2C_MGMT_TAG_BASE)
2597 dli t8,PHYS_TO_XKPHYS_UNC(A_L2C_MGMT_TAG_BASE)
2602 # Loop through each entry and each way
2604 /* li t1,L2_LINES_PER_BLOCK*L2C_NUM_WAYS */
2607 # Write a zero to the cache management register at each
2610 li t1, L2_LINES_PER_BLOCK
2613 daddu t0,(CACHE_LINE_SIZE) # size of a cache line
2625 slt t0, t7, START_BLK+TOTAL_BLKS
2630 # Restore old KX bit setting
2635 j ra # return to caller
2640 END(sb1250_l2cache_init1)