I have a baremetal code that injects SBE errors into my DDR memory and generates an interrupts. The error injection and interrupt mechanism works well. However, reading the CAPTURE_ADDRESS & CAPTURE_EXT_ADDRESS registers does not give the expected result.
If I inject an error at address 0x80000000 then the value of CAPTURE_ADDRESS is 0. (seems correct)
If I inject an error at address 0x80000000 then the value of CAPTURE_ADDRESS is 0 (Seem invalid)
If I inject an error at address 0x80000020 then the value of CAPTURE_ADDRESS is 0x20
If I inject an error at address 0xFFFFFFFF then the value of CAPTURE_ADDRESS is 0x7ffffffe0
It seems that bits 4-0 of CAPTURE_ADDRESS are always zero. And precision of the CAPTURE_ADDRESS is in a block of 32 bytes.
Is this normal? and why?
I do my tests on the ls1046afrywy board
For doing up-date the the CAPTURE_ADDRESS register, is it need to clear
the ERR_DETECT register? You need to write '1' to reset bits in the ERR_DETECT.
The address/attributes/data capture registers will capture information for multi-bit ECC errors, single-bit ECC errors, or memory select errors. If a multi-bit ECC error is detected, then the capture registers will update and lock until the ERR_DETECT register is cleared.
If a memory select error is detected, then the capture registers will update and lock until the ERR_DETECT register is cleared.If a single-bit ECC error is detected, then the capture registers will update. They will only lock if the single-bit error counter (in
ERR_SBE) crosses the threshold, setting the single-bit error bit in the ERR_DETECT register. Otherwise, subsequent errors can overwrite the error capture registers.
Note: the CAPTURE_ATTRIBUTES return 0x12d02001. If I read this correctly the TSIZ ( transaction size error) report 2 double words or a transaction (or 8 bytes)
If I inject an error at address 0x80000008 then the value of CAPTURE_ADDRESS is 0