📄 diag_l2cache.s
字号:
nop#endif#ifdef RUN_FROM_K0 li t0, LOOP_COUNT1: addi t0, t0, -1 bne t0, zero, 1b nop#endiftest_fail: addi t0, zero, 1 sll t0, t0, k0 dli t1, PHYS_TO_XKPHYS_UNC(MAC2_HASH0) ld t2, 0(t1) or t0, t0, t2 sd t0, 0(t1)test_success: addi k0, k0, 1 slt t0, k0, 4 bne t0, zero, next_quarter DMFC0 (t2,C0_SR) li t0, SR_KX not t0, t0 and t1,t2,t0 DMTC0 (t1,C0_SR)/* * Disable the bad quadrant(s) of the cache */ li t1,PHYS_TO_K1(MAC2_HASH0) ld t1,0(t1) la t2,disab_table sll t1,2 /* make a word offset */ add t2,t2,t1 /* into the table */ lw t0,(t2) /* this is the disable mask */ blt t0,zero,diag_fail /* go if total failure */ nop li t1,PHYS_TO_K1(A_L2_CACHE_DISABLE) or t1,t1,t0 /* OR in appropriate disable bits */#ifdef _SB1250_PASS2_ sd t0,0(t1) /* disable the cache */#else bne t0,zero,diag_fail /* on pass1, any failure is bad */ nop#endif MFC0s (t2,C0_Debug,2) /* turn off things we defeatured */#ifdef _DEFEATURE_ECC_ and t1, t2, ~0x0004#else and t1, t2, ~0x3004#endif MTC0s (t1,C0_Debug,2) #ifdef USE_LEDS dli t8, (('D'<<24)|('O'<<16)|('N'<<8)|'E') SET_LEDS(t8, t6, t7)#endif move ra, fp j ra nop diag_fail: li t1,PHYS_TO_K1(MAC2_HASH0) ld t1,0(t1) add t1,t1,'0' ble t1,'9',1f nop add t1,t1,('A'-('9'+1))1: dli t8, (('L'<<24)|('2'<<16)|(' '<<8)|0) or t8,t8,t1#ifdef USE_LEDS SET_LEDS(t8, t6, t7)#endif1: b 1bEND(diag_main) #ifdef TEST_ALL_LINES#define L2_LINES_PER_BLOCK 256 #else#define L2_LINES_PER_BLOCK LINES_TO_TEST #endif#define R_WRBC_RBLK s1#define R_WRBC_LINE s2#define R_WRBC_NEXT_WAY s3 #define R_WRBC_RADDR t5#define R_WRBC_SCRATCH0 t6#define R_WRBC_SCRATCH1 t7#define R_WRBC_SCRATCH2 s6#define R_WRBC_SCRATCH3 s7#define R_PASS_FAIL t4 /******************************************************** * l2test_wr_uac_allblocks * * Write all blocks of the L2 using uncached * * accelerated writes in mgmt mode. * * This also marks all blocks as valid and dirty. * * * ********************************************************/ #define R_BG_PAT0_0 a0 #define R_BG_PAT0_1 a1 #define R_BG_PAT0_2 a2 #define R_BG_PAT0_3 a3 #define R_BG_PAT1_0 t0 #define R_BG_PAT1_1 t1 /*#define R_BG_PAT1_2 t2 #define R_BG_PAT1_3 t3 */#define R_INV_0 t2 #define R_INV_1 t3 #define R_PATTERN_IND s0#define R_BG_LINE s2 #define R_BG_NEXT_WAY s3 #define R_BG_BLOCK s1 #define R_BG_WADDR t5 #define R_BG_RADDR t5 #define R_BG_SCRATCH0 t6 #define R_BG_SCRATCH1 t7 #define R_BG_SCRATCH2 t8 #define R_BG_SCRATCH3 t9 #define R_BG_SCRATCH4 s6 #define R_BG_SCRATCH5 s7 #define R_ERR_TABLE_0 v0#define R_ERR_TABLE_1 v1#define R_ERR_TABLE_2 s4#define R_ERR_TABLE_3 s5#define DATA_PATTERN0_0 0#define DATA_PATTERN0_1 0#define DATA_PATTERN0_2 0#define DATA_PATTERN0_3 0#define PATTERN0_INV0 0#define PATTERN0_INV1 0#define DATA_PATTERN1_0 0xffffffffffffffff#define DATA_PATTERN1_1 0xffffffffffffffff#define DATA_PATTERN1_2 0xffffffffffffffff#define DATA_PATTERN1_3 0xffffffffffffffff#define PATTERN1_INV0 0xffffffffffffffff#define PATTERN1_INV1 0xffffffffffffffff#define DATA_PATTERN2_0 0xffffffffffffffff#define DATA_PATTERN2_1 0xffffffffffffffff#define DATA_PATTERN2_2 0xffffffffffffffff#define DATA_PATTERN2_3 0xffffffffffffffff#define PATTERN2_INV0 0 #define PATTERN2_INV1 0xffffffffffffffff#define DATA_PATTERN3_0 0x5555555555555555#define DATA_PATTERN3_1 0x5555555555555555#define DATA_PATTERN3_2 0x5555555555555555#define DATA_PATTERN3_3 0x5555555555555555#define PATTERN3_INV0 0 #define PATTERN3_INV1 0#define DATA_PATTERN4_0 0x3333333333333333#define DATA_PATTERN4_1 0x3333333333333333#define DATA_PATTERN4_2 0x3333333333333333#define DATA_PATTERN4_3 0x3333333333333333#define PATTERN4_INV0 0 #define PATTERN4_INV1 0#define DATA_PATTERN5_0 0x0f0f0f0f0f0f0f0f#define DATA_PATTERN5_1 0x0f0f0f0f0f0f0f0f#define DATA_PATTERN5_2 0x0f0f0f0f0f0f0f0f#define DATA_PATTERN5_3 0x0f0f0f0f0f0f0f0f#define PATTERN5_INV0 0 #define PATTERN5_INV1 0#define DATA_PATTERN6_0 0x00ff00ff00ff00ff#define DATA_PATTERN6_1 0x00ff00ff00ff00ff#define DATA_PATTERN6_2 0x00ff00ff00ff00ff#define DATA_PATTERN6_3 0x00ff00ff00ff00ff#define PATTERN6_INV0 0 #define PATTERN6_INV1 0#define DATA_PATTERN7_0 0x0000ffff0000ffff#define DATA_PATTERN7_1 0x0000ffff0000ffff#define DATA_PATTERN7_2 0x0000ffff0000ffff#define DATA_PATTERN7_3 0x0000ffff0000ffff#define PATTERN7_INV0 0 #define PATTERN7_INV1 0#define DATA_PATTERN8_0 0x00000000ffffffff#define DATA_PATTERN8_1 0x00000000ffffffff#define DATA_PATTERN8_2 0x00000000ffffffff#define DATA_PATTERN8_3 0x00000000ffffffff#define PATTERN8_INV0 0 #define PATTERN8_INV1 0#define DATA_PATTERN9_0 0xffffffffffffffff#define DATA_PATTERN9_1 0x0000000000000000#define DATA_PATTERN9_2 0xffffffffffffffff#define DATA_PATTERN9_3 0x0000000000000000#define PATTERN9_INV0 0 #define PATTERN9_INV1 0#define DATA_PATTERNa_0 0xffffffffffffffff#define DATA_PATTERNa_1 0xffffffffffffffff#define DATA_PATTERNa_2 0x0000000000000000#define DATA_PATTERNa_3 0x0000000000000000#define PATTERNa_INV0 0 #define PATTERNa_INV1 0#undef MAX_PATTERN /* avoid redef'n of diag_l1cache.h version */#define MAX_PATTERN 11#define BG_WRITE_PAT(addr,pattern0,pattern1,pattern2,pattern3,inv0,inv1) \ li R_BG_SCRATCH0, 2; \1: sd pattern0, 0(addr); \ sd pattern1, 8(addr); \ sd pattern2, 16(addr); \ sd pattern3, 24(addr); \ cache L1CACHEOP(L1C_D,L1C_OP_HIT_WB_INVAL),0(addr); \ xor pattern0, pattern0, inv0; \ xor pattern1, pattern1, inv0; \ xor pattern2, pattern2, inv0; \ xor pattern3, pattern3, inv0; \ daddu addr, addr, R_BG_NEXT_WAY; \ sd pattern0, 0(addr); \ sd pattern1, 8(addr); \ sd pattern2, 16(addr); \ sd pattern3, 24(addr); \ cache L1CACHEOP(L1C_D,L1C_OP_HIT_WB_INVAL),0(addr); \ xor pattern0, pattern0, inv1; \ xor pattern1, pattern1, inv1; \ xor pattern2, pattern2, inv1; \ xor pattern3, pattern3, inv1; \ addi R_BG_SCRATCH0, R_BG_SCRATCH0, -1; \ bne R_BG_SCRATCH0, zero, 1b; \ daddu addr, addr, R_BG_NEXT_WAY; \ li R_BG_SCRATCH0, -4*2*65536; \ dadd addr, addr, R_BG_SCRATCH0 /* next line */#define BG_INVAL_L1(addr) \ move R_BG_SCRATCH0, addr; \ cache L1CACHEOP(L1C_D,L1C_OP_HITINVAL),0(R_BG_SCRATCH0); \ daddu R_BG_SCRATCH0, R_BG_SCRATCH0, R_BG_NEXT_WAY; \ cache L1CACHEOP(L1C_D,L1C_OP_HITINVAL),0(R_BG_SCRATCH0); \ daddu R_BG_SCRATCH0, R_BG_SCRATCH0, R_BG_NEXT_WAY; \ cache L1CACHEOP(L1C_D,L1C_OP_HITINVAL),0(R_BG_SCRATCH0); \ daddu R_BG_SCRATCH0, R_BG_SCRATCH0, R_BG_NEXT_WAY; \ cache L1CACHEOP(L1C_D,L1C_OP_HITINVAL),0(R_BG_SCRATCH0)#define BG_CHECK_PAT(addr,pattern0,pattern1,pattern2,pattern3,inv0,inv1) \ li R_BG_SCRATCH4, 2; \ dli R_BG_SCRATCH5, L2M_READ_RAW_ACCESS; \ or addr, addr, R_BG_SCRATCH5; \1: ld R_BG_SCRATCH0, 0(addr); \ ld R_BG_SCRATCH1, 8(addr); \ sne R_BG_SCRATCH0, R_BG_SCRATCH0, pattern0; \ or R_PASS_FAIL, R_PASS_FAIL, R_BG_SCRATCH0; \ ld R_BG_SCRATCH2, 16(addr);\ sne R_BG_SCRATCH1, R_BG_SCRATCH1, pattern1; \ or R_PASS_FAIL, R_PASS_FAIL, R_BG_SCRATCH1; \ ld R_BG_SCRATCH3, 24(addr);\ sne R_BG_SCRATCH2, R_BG_SCRATCH2, pattern2; \ or R_PASS_FAIL, R_PASS_FAIL, R_BG_SCRATCH2; \ sne R_BG_SCRATCH3, R_BG_SCRATCH3, pattern3; \ or R_PASS_FAIL, R_PASS_FAIL, R_BG_SCRATCH3; \ xor pattern0, pattern0, inv0; \ xor pattern1, pattern1, inv0; \ xor pattern2, pattern2, inv0; \ xor pattern3, pattern3, inv0; \ daddu addr, addr, R_BG_NEXT_WAY; \ ld R_BG_SCRATCH0, 0(addr); \ ld R_BG_SCRATCH1, 8(addr); \ sne R_BG_SCRATCH0, R_BG_SCRATCH0, pattern0; \ or R_PASS_FAIL, R_PASS_FAIL, R_BG_SCRATCH0; \ ld R_BG_SCRATCH2, 16(addr);\ sne R_BG_SCRATCH1, R_BG_SCRATCH1, pattern1; \ or R_PASS_FAIL, R_PASS_FAIL, R_BG_SCRATCH1; \ ld R_BG_SCRATCH3, 24(addr);\ sne R_BG_SCRATCH2, R_BG_SCRATCH2, pattern2; \ or R_PASS_FAIL, R_PASS_FAIL, R_BG_SCRATCH2; \ sne R_BG_SCRATCH3, R_BG_SCRATCH3, pattern3; \ or R_PASS_FAIL, R_PASS_FAIL, R_BG_SCRATCH3; \ xor pattern0, pattern0, inv1; \ xor pattern1, pattern1, inv1; \ xor pattern2, pattern2, inv1; \ xor pattern3, pattern3, inv1; \ addi R_BG_SCRATCH4, R_BG_SCRATCH4, -1; \ bne R_BG_SCRATCH4, zero, 1b; \ daddu addr, addr, R_BG_NEXT_WAY; \ li R_BG_SCRATCH0, -4*2*65536; \ dadd addr, addr, R_BG_SCRATCH0; \ nor R_BG_SCRATCH5, R_BG_SCRATCH5, $0; \ and addr, addr, R_BG_SCRATCH5#define BG_CHECK_PAT1(addr,pattern0,pattern1,pattern2,pattern3,inv0,inv1) \ li R_BG_SCRATCH4, 2; \ dli R_BG_SCRATCH5, 0x00200000; \ or addr, addr, R_BG_SCRATCH5; \1: ld R_BG_SCRATCH0, 0(addr); \ cache L1CACHEOP(L1C_D,L1C_OP_HITINVAL),0(addr); \ ld R_BG_SCRATCH0, 0(addr); \ ld R_BG_SCRATCH1, 8(addr); \ sne R_BG_SCRATCH0, R_BG_SCRATCH0, pattern0; \ or R_PASS_FAIL, R_PASS_FAIL, R_BG_SCRATCH0; \ ld R_BG_SCRATCH2, 16(addr);\ sne R_BG_SCRATCH1, R_BG_SCRATCH1, pattern1; \ or R_PASS_FAIL, R_PASS_FAIL, R_BG_SCRATCH1; \ ld R_BG_SCRATCH3, 24(addr);\ sne R_BG_SCRATCH2, R_BG_SCRATCH2, pattern2; \ or R_PASS_FAIL, R_PASS_FAIL, R_BG_SCRATCH2; \ sne R_BG_SCRATCH3, R_BG_SCRATCH3, pattern3; \ or R_PASS_FAIL, R_PASS_FAIL, R_BG_SCRATCH3; \ xor pattern0, pattern0, inv0; \ xor pattern1, pattern1, inv0; \ xor pattern2, pattern2, inv0; \ xor pattern3, pattern3, inv0; \ daddu addr, addr, R_BG_NEXT_WAY; \ ld R_BG_SCRATCH0, 0(addr); \ cache L1CACHEOP(L1C_D,L1C_OP_HITINVAL),0(addr); \ ld R_BG_SCRATCH0, 0(addr); \ ld R_BG_SCRATCH1, 8(addr); \ sne R_BG_SCRATCH0, R_BG_SCRATCH0, pattern0; \ or R_PASS_FAIL, R_PASS_FAIL, R_BG_SCRATCH0; \ ld R_BG_SCRATCH2, 16(addr);\ sne R_BG_SCRATCH1, R_BG_SCRATCH1, pattern1; \ or R_PASS_FAIL, R_PASS_FAIL, R_BG_SCRATCH1; \ ld R_BG_SCRATCH3, 24(addr);\ sne R_BG_SCRATCH2, R_BG_SCRATCH2, pattern2; \ or R_PASS_FAIL, R_PASS_FAIL, R_BG_SCRATCH2; \ sne R_BG_SCRATCH3, R_BG_SCRATCH3, pattern3; \ or R_PASS_FAIL, R_PASS_FAIL, R_BG_SCRATCH3; \ xor pattern0, pattern0, inv1; \ xor pattern1, pattern1, inv1; \ xor pattern2, pattern2, inv1; \ xor pattern3, pattern3, inv1; \ addi R_BG_SCRATCH4, R_BG_SCRATCH4, -1; \ bne R_BG_SCRATCH4, zero, 1b; \ daddu addr, addr, R_BG_NEXT_WAY; \ li R_BG_SCRATCH0, -4*2*65536; \ dadd addr, addr, R_BG_SCRATCH0; \ nor R_BG_SCRATCH5, R_BG_SCRATCH5, $0; \ and addr, addr, R_BG_SCRATCH5#define INV_PAT(pattern0, pattern1, pattern2, pattern3) \ not pattern0, pattern0; \ not pattern1, pattern1; \ not pattern2, pattern2; \ not pattern3, pattern3#define SET_ERR_TABLE(pass_fail, line) \ li R_BG_SCRATCH0, 0x3f; \ and R_BG_SCRATCH0, R_BG_SCRATCH0, line; \ dsll R_BG_SCRATCH0, pass_fail, R_BG_SCRATCH0; \ dsrl R_BG_SCRATCH1, line, 6; \ bne R_BG_SCRATCH1, zero, 1f; \ li R_BG_SCRATCH2, 1; \ or R_ERR_TABLE_0, R_ERR_TABLE_0, R_BG_SCRATCH0; \ b 4f; \ nop; \1: bne R_BG_SCRATCH1, R_BG_SCRATCH2, 2f; \ li R_BG_SCRATCH2, 2; \ or R_ERR_TABLE_1, R_ERR_TABLE_1, R_BG_SCRATCH0; \ b 4f; \ nop; \2: bne R_BG_SCRATCH1, R_BG_SCRATCH2, 3f; \ li R_BG_SCRATCH2, 3; \ or R_ERR_TABLE_2, R_ERR_TABLE_2, R_BG_SCRATCH0; \ b 4f; \ nop; \3: or R_ERR_TABLE_3, R_ERR_TABLE_3, R_BG_SCRATCH0; \4: #ifdef DATA_TEST l2dtest_bg_rw_uac: /*li R_BG_BLOCK, START_BLK */ sll R_BG_BLOCK, k0, 2 li R_BG_NEXT_WAY,0x20000 move R_ERR_TABLE_0, $0 move R_ERR_TABLE_1, $0 move R_ERR_TABLE_2, $0 move R_ERR_TABLE_3, $0bg_next_block: /* form address */#ifdef USE_LEDS addi R_BG_SCRATCH2, R_BG_BLOCK, '0' or R_BG_SCRATCH2, R_BG_SCRATCH2, ('D' << 8) SET_LEDS_HI(R_BG_SCRATCH2, R_BG_SCRATCH0, R_BG_SCRATCH1)#endif move R_PATTERN_IND, $0bg_next_patt:#ifdef USE_LEDS addi R_BG_SCRATCH2, R_PATTERN_IND, '0' or R_BG_SCRATCH2, R_BG_SCRATCH2, ('P' << 8) SET_LEDS_LO(R_BG_SCRATCH2, R_BG_SCRATCH0, R_BG_SCRATCH1)#endif bne R_PATTERN_IND, $0, pattern_ne_0 dli R_BG_PAT0_0, DATA_PATTERN0_0 # data_pattern = pattern[0] dli R_BG_PAT0_1, DATA_PATTERN0_1 dli R_BG_PAT0_2, DATA_PATTERN0_2 dli R_BG_PAT0_3, DATA_PATTERN0_3 dli R_INV_0, PATTERN0_INV0 dli R_INV_1, PATTERN0_INV1 j test_0 noppattern_ne_0: li R_BG_SCRATCH0, 1
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -