|  | Overview | 
|  | ======== | 
|  |  | 
|  | The overall usage pattern for ECC diagnostic commands is the following: | 
|  |  | 
|  | * (injecting errors is initially disabled) | 
|  |  | 
|  | * define inject mask (which tells the DDR controller what type of errors | 
|  | we'll be injecting: single/multiple bit etc.) | 
|  |  | 
|  | * enable injecting errors - from now on the controller injects errors as | 
|  | indicated in the inject mask | 
|  |  | 
|  | IMPORTANT NOTICE: enabling injecting multiple-bit errors is potentially | 
|  | dangerous as such errors are NOT corrected by the controller. Therefore caution | 
|  | should be taken when enabling the injection of multiple-bit errors: it is only | 
|  | safe when used on a carefully selected memory area and used under control of | 
|  | the 'ecc test' command (see example 'Injecting Multiple-Bit Errors' below). In | 
|  | particular, when you simply set the multiple-bit errors in inject mask and | 
|  | enable injection, U-Boot is very likely to hang quickly as the errors will be | 
|  | injected when it accesses its code, data etc. | 
|  |  | 
|  |  | 
|  | Use cases for DDR 'ecc' command: | 
|  | ================================ | 
|  |  | 
|  | Before executing particular tests reset target board or clear status registers: | 
|  |  | 
|  | => ecc captureclear | 
|  | => ecc errdetectclr all | 
|  | => ecc sbecnt 0 | 
|  |  | 
|  |  | 
|  | Injecting Single-Bit Errors | 
|  | --------------------------- | 
|  |  | 
|  | 1. Set 1 bit in Data Path Error Inject Mask | 
|  |  | 
|  | => ecc injectdatahi 1 | 
|  |  | 
|  | 2. Run test over some memory region | 
|  |  | 
|  | => ecc test 200000 10 | 
|  |  | 
|  | 3. Check ECC status | 
|  |  | 
|  | => ecc status | 
|  | ... | 
|  | Memory Data Path Error Injection Mask High/Low: 00000001 00000000 | 
|  | ... | 
|  | Memory Single-Bit Error Management (0..255): | 
|  | Single-Bit Error Threshold: 255 | 
|  | Single Bit Error Counter: 16 | 
|  | ... | 
|  | Memory Error Detect: | 
|  | Multiple Memory Errors: 0 | 
|  | Multiple-Bit Error: 0 | 
|  | Single-Bit Error: 0 | 
|  | ... | 
|  |  | 
|  | 16 errors were generated, Single-Bit Error flag was not set as Single Bit Error | 
|  | Counter did not reach  Single-Bit Error Threshold. | 
|  |  | 
|  | 4. Make sure used memory region got re-initialized with 0xcafecafe pattern | 
|  |  | 
|  | => md 200000 | 
|  | 00200000: cafecafe cafecafe cafecafe cafecafe    ................ | 
|  | 00200010: cafecafe cafecafe cafecafe cafecafe    ................ | 
|  | 00200020: cafecafe cafecafe cafecafe cafecafe    ................ | 
|  | 00200030: cafecafe cafecafe cafecafe cafecafe    ................ | 
|  | 00200040: cafecafe cafecafe cafecafe cafecafe    ................ | 
|  | 00200050: cafecafe cafecafe cafecafe cafecafe    ................ | 
|  | 00200060: cafecafe cafecafe cafecafe cafecafe    ................ | 
|  | 00200070: cafecafe cafecafe cafecafe cafecafe    ................ | 
|  | 00200080: deadbeef deadbeef deadbeef deadbeef    ................ | 
|  | 00200090: deadbeef deadbeef deadbeef deadbeef    ................ | 
|  |  | 
|  |  | 
|  | Injecting Multiple-Bit Errors | 
|  | ----------------------------- | 
|  |  | 
|  | 1. Set more than 1 bit in Data Path Error Inject Mask | 
|  |  | 
|  | => ecc injectdatahi 5 | 
|  |  | 
|  | 2. Run test over some memory region | 
|  |  | 
|  | => ecc test 200000 10 | 
|  |  | 
|  | 3. Check ECC status | 
|  |  | 
|  | => ecc status | 
|  | ... | 
|  | Memory Data Path Error Injection Mask High/Low: 00000005 00000000 | 
|  | ... | 
|  | Memory Error Detect: | 
|  | Multiple Memory Errors: 1 | 
|  | Multiple-Bit Error: 1 | 
|  | Single-Bit Error: 0 | 
|  | ... | 
|  |  | 
|  | Observe that both Multiple Memory Errors and Multiple-Bit Error flags are set. | 
|  |  | 
|  | 4. Make sure used memory region got re-initialized with 0xcafecafe pattern | 
|  |  | 
|  | => md 200000 | 
|  | 00200000: cafecafe cafecafe cafecafe cafecafe    ................ | 
|  | 00200010: cafecafe cafecafe cafecafe cafecafe    ................ | 
|  | 00200020: cafecafe cafecafe cafecafe cafecafe    ................ | 
|  | 00200030: cafecafe cafecafe cafecafe cafecafe    ................ | 
|  | 00200040: cafecafe cafecafe cafecafe cafecafe    ................ | 
|  | 00200050: cafecafe cafecafe cafecafe cafecafe    ................ | 
|  | 00200060: cafecafe cafecafe cafecafe cafecafe    ................ | 
|  | 00200070: cafecafe cafecafe cafecafe cafecafe    ................ | 
|  | 00200080: deadbeef deadbeef deadbeef deadbeef    ................ | 
|  | 00200090: deadbeef deadbeef deadbeef deadbeef    ................ | 
|  |  | 
|  |  | 
|  | Test Single-Bit Error Counter and Threshold | 
|  | ------------------------------------------- | 
|  |  | 
|  | 1. Set 1 bit in Data Path Error Inject Mask | 
|  |  | 
|  | => ecc injectdatahi 1 | 
|  |  | 
|  | 2. Enable error injection | 
|  |  | 
|  | => ecc inject en | 
|  |  | 
|  | 3. Let u-boot run for a with Single-Bit error injection enabled | 
|  |  | 
|  | 4. Disable error injection | 
|  |  | 
|  | => ecc inject dis | 
|  |  | 
|  | 4. Check status | 
|  |  | 
|  | => ecc status | 
|  |  | 
|  | ... | 
|  | Memory Single-Bit Error Management (0..255): | 
|  | Single-Bit Error Threshold: 255 | 
|  | Single Bit Error Counter: 60 | 
|  |  | 
|  | Memory Error Detect: | 
|  | Multiple Memory Errors: 1 | 
|  | Multiple-Bit Error: 0 | 
|  | Single-Bit Error: 1 | 
|  | ... | 
|  |  | 
|  | Observe that Single-Bit Error is 'on' which means that Single-Bit Error Counter | 
|  | reached Single-Bit Error Threshold. Multiple Memory Errors bit is also 'on', that | 
|  | is Counter reached Threshold more than one time (it wraps back after reaching | 
|  | Threshold). |