|
|
1.1 ! root 1: #include "definitions" ! 2: #define BEVEC 128 /* offset in scb block for Bus error*/ ! 3: #define ecczero 0x00000028 ! 4: #define eccone 0x0000012d ! 5: #define MEMUNIT 64 * 1024 ! 6: #include "test4.h" ! 7: ! 8: extern struct OPTIONS OPTIONS; ! 9: extern long maxmem,endprog,scb; ! 10: extern long eccloc(), cycle,test_no,errcnt; ! 11: extern long loop_flg,hlt_flg,prt_flg; ! 12: extern long ber1, ber2; ! 13: extern long exp_ecc[]; ! 14: long abmax; ! 15: subtest4() ! 16: { ! 17: register long *mcr = (long *)0xffffb000; ! 18: register long *mcbr = (long *)0xffffb008; ! 19: register long delay, *addr, bit, ckbits, dpat; ! 20: long oldstatus, data, code, wcnt, cnt, actual, eccloc(); ! 21: char *msg; ! 22: ! 23: if (OPTIONS.header) ! 24: writes("\n** Subtest4 : ECC single bit error correction."); ! 25: oldstatus = *mcr; /* save old status */ ! 26: dpat = 0; ! 27: ckbits = 0xc; /* Check bits for data 0 */ ! 28: addr = (long *)abmax - 102400; /* Only check the last 100k */ ! 29: for(wcnt=0;addr <= (long *)abmax;addr++, wcnt++) ! 30: { ! 31: again: ! 32: /* Write data and known good check bits pattern */ ! 33: data = dpat; /* Test data pattern */ ! 34: *mcbr = ckbits; /* Check bits of data 0 */ ! 35: *mcr = 0xc4; /* Turn ON diag_write */ ! 36: delay = *mcr; ! 37: *addr = data; /* Write Data with check */ ! 38: /* bits taken from MCBR */ ! 39: *mcr = 0; /* Turn OFF Diag_write */ ! 40: delay = *mcr; ! 41: code = eccloc(addr); /* Read back data */ ! 42: if ((code == -1) && prt_flg) { /* Got an unexpected DCE */ ! 43: *mcr = 0xc0; /* Turn OFF ECC, clear err. */ ! 44: writes("\nUnexpected DCE.<Diag_wr failed>"); ! 45: writes("\nAddress : "); writeh(addr); ! 46: writes("\nLword count : "); writed(wcnt); ! 47: wr_mibreg(); ! 48: if (loop_flg) goto again; ! 49: else if (hlt_flg) Halt(); ! 50: else continue; ! 51: } ! 52: if ((code == -2) && prt_flg) { ! 53: *mcr = 0; /* Turn OFF ECC logic */ ! 54: writes("\nUnexpected Buser."); ! 55: wr_mibreg(); ! 56: if (loop_flg) goto again; ! 57: else if (hlt_flg) Halt(); ! 58: else continue; ! 59: } ! 60: actual = *addr; /* Read data back to check */ ! 61: if ((actual != data)&& prt_flg) { ! 62: writes("\nDiag_wr failed. Wrong data read back."); ! 63: writes("\nExpected "); writeh(data); ! 64: writes(", Actual "); writeh(actual); ! 65: if (loop_flg) goto again; ! 66: else if (hlt_flg) Halt(); ! 67: else continue; ! 68: } ! 69: for(bit=1,cnt=0;cnt<32; bit <<= 1, cnt++) { ! 70: repeat: ! 71: /* Write data and known good check bits pattern */ ! 72: data = dpat; /* Test data pattern */ ! 73: data |= bit; /* Change 1 bit in data pattern */ ! 74: *mcbr = ckbits; /* Check bits of data 0 */ ! 75: *mcr = 4; /* Turn ON diag_write */ ! 76: delay = *mcr; ! 77: *addr = data; /* Write Bad data back */ ! 78: *mcr = 0; /* Turn OFF Diag_write */ ! 79: delay = *mcr; ! 80: code = ecccor(addr,&actual); /* Read back data */ ! 81: if ((code == -1) && prt_flg) { ! 82: /* Didnot correct bad data */ ! 83: writes("\nGot DCE with single bit error while correction is enable.."); ! 84: writes("\n\tData written : "); ! 85: writeh(data); ! 86: writes("\n\tCheck bits written in MCBR : "); ! 87: writeh(ckbits); ! 88: writes("\n\tAddress : "); writeh(addr); ! 89: wr_mibreg(); ! 90: if (loop_flg) goto repeat; ! 91: else if (hlt_flg) Halt(); ! 92: else continue; ! 93: } ! 94: if ((code == -2) && prt_flg) { ! 95: writes("\nUnexpected Buser"); ! 96: wr_mibreg(); ! 97: if (loop_flg) goto repeat; ! 98: else if (hlt_flg) Halt(); ! 99: else continue; ! 100: } ! 101: /* Did not get DCE, now check the corrected data */ ! 102: if ((actual != dpat) && prt_flg ) { ! 103: *mcr = 0xc0; /* Turn OFF ECC, clear err.*/ ! 104: writes("\nError in corrected data."); ! 105: writes("\nExpected : "); writeh(dpat); ! 106: writes(", Actual : "); writeh(actual); ! 107: writes("\nAddress : "); writeh(addr); ! 108: writes("\nNumber Longwords passed "); ! 109: writed(wcnt); writes("\n"); ! 110: if (loop_flg) goto repeat; ! 111: else if (hlt_flg) Halt(); ! 112: } ! 113: } ! 114: } ! 115: *mcr = oldstatus; /* old status */ ! 116: } ! 117: ! 118: wr_mibreg() ! 119: { ! 120: writes("\n\tBuser par0 (MER) : "); writeh(ber2); ! 121: writes("\n\tBuser par1 (MCBR) : "); writeh(ber1); ! 122: writes("\n"); ! 123: } ! 124:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.