1*4882a593SmuzhiyunOverview 2*4882a593Smuzhiyun======== 3*4882a593Smuzhiyun 4*4882a593SmuzhiyunThe overall usage pattern for ECC diagnostic commands is the following: 5*4882a593Smuzhiyun 6*4882a593Smuzhiyun * (injecting errors is initially disabled) 7*4882a593Smuzhiyun 8*4882a593Smuzhiyun * define inject mask (which tells the DDR controller what type of errors 9*4882a593Smuzhiyun we'll be injecting: single/multiple bit etc.) 10*4882a593Smuzhiyun 11*4882a593Smuzhiyun * enable injecting errors - from now on the controller injects errors as 12*4882a593Smuzhiyun indicated in the inject mask 13*4882a593Smuzhiyun 14*4882a593SmuzhiyunIMPORTANT NOTICE: enabling injecting multiple-bit errors is potentially 15*4882a593Smuzhiyundangerous as such errors are NOT corrected by the controller. Therefore caution 16*4882a593Smuzhiyunshould be taken when enabling the injection of multiple-bit errors: it is only 17*4882a593Smuzhiyunsafe when used on a carefully selected memory area and used under control of 18*4882a593Smuzhiyunthe 'ecc testdw' 'ecc testword' command (see example 'Injecting Multiple-Bit 19*4882a593SmuzhiyunErrors' below). In particular, when you simply set the multiple-bit errors in 20*4882a593Smuzhiyuninject mask and enable injection, U-Boot is very likely to hang quickly as the 21*4882a593Smuzhiyunerrors will be injected when it accesses its code, data etc. 22*4882a593Smuzhiyun 23*4882a593Smuzhiyun 24*4882a593SmuzhiyunUse cases for DDR 'ecc' command: 25*4882a593Smuzhiyun================================ 26*4882a593Smuzhiyun 27*4882a593SmuzhiyunBefore executing particular tests reset target board or clear status registers: 28*4882a593Smuzhiyun 29*4882a593Smuzhiyun=> ecc captureclear 30*4882a593Smuzhiyun=> ecc errdetectclr all 31*4882a593Smuzhiyun=> ecc sbecnt 0 32*4882a593Smuzhiyun 33*4882a593Smuzhiyun 34*4882a593SmuzhiyunInjecting Single-Bit Errors 35*4882a593Smuzhiyun--------------------------- 36*4882a593Smuzhiyun 37*4882a593Smuzhiyun1. Set 1 bit in Data Path Error Inject Mask 38*4882a593Smuzhiyun 39*4882a593Smuzhiyun=> ecc injectdatahi 1 40*4882a593Smuzhiyun 41*4882a593Smuzhiyun2. Run test over some memory region 42*4882a593Smuzhiyun 43*4882a593Smuzhiyun=> ecc testdw 200000 10 44*4882a593Smuzhiyun 45*4882a593Smuzhiyun3. Check ECC status 46*4882a593Smuzhiyun 47*4882a593Smuzhiyun=> ecc status 48*4882a593Smuzhiyun... 49*4882a593SmuzhiyunMemory Data Path Error Injection Mask High/Low: 00000001 00000000 50*4882a593Smuzhiyun... 51*4882a593SmuzhiyunMemory Single-Bit Error Management (0..255): 52*4882a593Smuzhiyun Single-Bit Error Threshold: 255 53*4882a593Smuzhiyun Single Bit Error Counter: 16 54*4882a593Smuzhiyun... 55*4882a593SmuzhiyunMemory Error Detect: 56*4882a593Smuzhiyun Multiple Memory Errors: 0 57*4882a593Smuzhiyun Multiple-Bit Error: 0 58*4882a593Smuzhiyun Single-Bit Error: 0 59*4882a593Smuzhiyun... 60*4882a593Smuzhiyun 61*4882a593Smuzhiyun16 errors were generated, Single-Bit Error flag was not set as Single Bit Error 62*4882a593SmuzhiyunCounter did not reach Single-Bit Error Threshold. 63*4882a593Smuzhiyun 64*4882a593Smuzhiyun4. Make sure used memory region got re-initialized with 0x0123456789abcdef 65*4882a593Smuzhiyun 66*4882a593Smuzhiyun=> md 200000 67*4882a593Smuzhiyun00200000: 01234567 89abcdef 01234567 89abcdef .#Eg.....#Eg.... 68*4882a593Smuzhiyun00200010: 01234567 89abcdef 01234567 89abcdef .#Eg.....#Eg.... 69*4882a593Smuzhiyun00200020: 01234567 89abcdef 01234567 89abcdef .#Eg.....#Eg.... 70*4882a593Smuzhiyun00200030: 01234567 89abcdef 01234567 89abcdef .#Eg.....#Eg.... 71*4882a593Smuzhiyun00200040: 01234567 89abcdef 01234567 89abcdef .#Eg.....#Eg.... 72*4882a593Smuzhiyun00200050: 01234567 89abcdef 01234567 89abcdef .#Eg.....#Eg.... 73*4882a593Smuzhiyun00200060: 01234567 89abcdef 01234567 89abcdef .#Eg.....#Eg.... 74*4882a593Smuzhiyun00200070: 01234567 89abcdef 01234567 89abcdef .#Eg.....#Eg.... 75*4882a593Smuzhiyun00200080: deadbeef deadbeef deadbeef deadbeef ................ 76*4882a593Smuzhiyun00200090: deadbeef deadbeef deadbeef deadbeef ................ 77*4882a593Smuzhiyun 78*4882a593SmuzhiyunInjecting Multiple-Bit Errors 79*4882a593Smuzhiyun----------------------------- 80*4882a593Smuzhiyun 81*4882a593Smuzhiyun1. Set more than 1 bit in Data Path Error Inject Mask 82*4882a593Smuzhiyun 83*4882a593Smuzhiyun=> ecc injectdatahi 1 84*4882a593Smuzhiyun=> ecc injectdatalo 1 85*4882a593Smuzhiyun 86*4882a593Smuzhiyun2. Run test over some memory region 87*4882a593Smuzhiyun 88*4882a593Smuzhiyun=> ecc testword 200000 1 89*4882a593Smuzhiyun 90*4882a593Smuzhiyun3. Check ECC status 91*4882a593Smuzhiyun 92*4882a593Smuzhiyun=> ecc status 93*4882a593Smuzhiyun... 94*4882a593SmuzhiyunMemory Data Path Error Injection Mask High/Low: 00000001 00000001 95*4882a593Smuzhiyun... 96*4882a593SmuzhiyunMemory Error Detect: 97*4882a593Smuzhiyun Multiple Memory Errors: 0 98*4882a593Smuzhiyun Multiple-Bit Error: 1 99*4882a593Smuzhiyun Single-Bit Error: 0 100*4882a593Smuzhiyun... 101*4882a593Smuzhiyun 102*4882a593SmuzhiyunThe Multiple Memory Errors flags not set and Multiple-Bit Error flags are set. 103*4882a593Smuzhiyun 104*4882a593Smuzhiyun4. Make sure used memory region got re-initialized with 0x0123456789abcdef 105*4882a593Smuzhiyun 106*4882a593Smuzhiyun=> md 200000 107*4882a593Smuzhiyun00200000: 01234567 89abcdef 01234567 89abcdef .#Eg.....#Eg.... 108*4882a593Smuzhiyun00200010: 01234567 89abcdef 01234567 89abcdef .#Eg.....#Eg.... 109*4882a593Smuzhiyun00200020: 01234567 89abcdef 01234567 89abcdef .#Eg.....#Eg.... 110*4882a593Smuzhiyun00200030: 01234567 89abcdef 01234567 89abcdef .#Eg.....#Eg.... 111*4882a593Smuzhiyun00200040: 01234567 89abcdef 01234567 89abcdef .#Eg.....#Eg.... 112*4882a593Smuzhiyun00200050: 01234567 89abcdef 01234567 89abcdef .#Eg.....#Eg.... 113*4882a593Smuzhiyun00200060: 01234567 89abcdef 01234567 89abcdef .#Eg.....#Eg.... 114*4882a593Smuzhiyun00200070: 01234567 89abcdef 01234567 89abcdef .#Eg.....#Eg.... 115*4882a593Smuzhiyun00200080: deadbeef deadbeef deadbeef deadbeef ................ 116*4882a593Smuzhiyun00200090: deadbeef deadbeef deadbeef deadbeef ................ 117*4882a593Smuzhiyun 118*4882a593Smuzhiyun 119*4882a593SmuzhiyunTest Single-Bit Error Counter and Threshold 120*4882a593Smuzhiyun------------------------------------------- 121*4882a593Smuzhiyun 122*4882a593Smuzhiyun1. Set 1 bit in Data Path Error Inject Mask 123*4882a593Smuzhiyun 124*4882a593Smuzhiyun=> ecc injectdatahi 1 125*4882a593Smuzhiyun 126*4882a593Smuzhiyun2. Enable error injection 127*4882a593Smuzhiyun 128*4882a593Smuzhiyun=> ecc inject en 129*4882a593Smuzhiyun 130*4882a593Smuzhiyun3. Let u-boot run for a with Single-Bit error injection enabled 131*4882a593Smuzhiyun 132*4882a593Smuzhiyun4. Disable error injection 133*4882a593Smuzhiyun 134*4882a593Smuzhiyun=> ecc inject dis 135*4882a593Smuzhiyun 136*4882a593Smuzhiyun4. Check status 137*4882a593Smuzhiyun 138*4882a593Smuzhiyun=> ecc status 139*4882a593Smuzhiyun 140*4882a593Smuzhiyun... 141*4882a593SmuzhiyunMemory Single-Bit Error Management (0..255): 142*4882a593Smuzhiyun Single-Bit Error Threshold: 255 143*4882a593Smuzhiyun Single Bit Error Counter: 199 144*4882a593Smuzhiyun 145*4882a593SmuzhiyunMemory Error Detect: 146*4882a593Smuzhiyun Multiple Memory Errors: 1 147*4882a593Smuzhiyun Multiple-Bit Error: 0 148*4882a593Smuzhiyun Single-Bit Error: 1 149*4882a593Smuzhiyun... 150*4882a593Smuzhiyun 151*4882a593SmuzhiyunObserve that Single-Bit Error is 'on' which means that Single-Bit Error Counter 152*4882a593Smuzhiyunreached Single-Bit Error Threshold. Multiple Memory Errors bit is also 'on', that 153*4882a593Smuzhiyunis Counter reached Threshold more than one time (it wraps back after reaching 154*4882a593SmuzhiyunThreshold). 155