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