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 testdw' 'ecc testword' 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 testdw 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 0x0123456789abcdef

=> md 200000
00200000: 01234567 89abcdef 01234567 89abcdef    .#Eg.....#Eg....
00200010: 01234567 89abcdef 01234567 89abcdef    .#Eg.....#Eg....
00200020: 01234567 89abcdef 01234567 89abcdef    .#Eg.....#Eg....
00200030: 01234567 89abcdef 01234567 89abcdef    .#Eg.....#Eg....
00200040: 01234567 89abcdef 01234567 89abcdef    .#Eg.....#Eg....
00200050: 01234567 89abcdef 01234567 89abcdef    .#Eg.....#Eg....
00200060: 01234567 89abcdef 01234567 89abcdef    .#Eg.....#Eg....
00200070: 01234567 89abcdef 01234567 89abcdef    .#Eg.....#Eg....
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 1
=> ecc injectdatalo 1

2. Run test over some memory region

=> ecc testword 200000 1

3. Check ECC status

=> ecc status
...
Memory Data Path Error Injection Mask High/Low: 00000001 00000001
...
Memory Error Detect:
  Multiple Memory Errors: 0
  Multiple-Bit Error: 1
  Single-Bit Error: 0
...

The Multiple Memory Errors flags not set and Multiple-Bit Error flags are set.

4. Make sure used memory region got re-initialized with 0x0123456789abcdef

=> md 200000
00200000: 01234567 89abcdef 01234567 89abcdef    .#Eg.....#Eg....
00200010: 01234567 89abcdef 01234567 89abcdef    .#Eg.....#Eg....
00200020: 01234567 89abcdef 01234567 89abcdef    .#Eg.....#Eg....
00200030: 01234567 89abcdef 01234567 89abcdef    .#Eg.....#Eg....
00200040: 01234567 89abcdef 01234567 89abcdef    .#Eg.....#Eg....
00200050: 01234567 89abcdef 01234567 89abcdef    .#Eg.....#Eg....
00200060: 01234567 89abcdef 01234567 89abcdef    .#Eg.....#Eg....
00200070: 01234567 89abcdef 01234567 89abcdef    .#Eg.....#Eg....
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: 199

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).