[PATCH v5] cmd: mem: fix range of bitflip test
Stefan Roese
sr at denx.de
Thu Sep 10 07:09:41 CEST 2020
On 09.09.20 18:10, Ralph Siemsen wrote:
> The bitflip test uses two equal sized memory buffers. This is achieved
> by splitting the range of memory into two pieces. The address of the
> second buffer, as well as the length of each buffer, were not correctly
> calculated. This caused bitflip test to access beyond the end of range.
> This patch fixes the pointer arithmetic problem.
>
> A second problem arises because u-boot "mtest" command expects the
> ending address to be inclusive. When computing (end - start) this
> results in missing 1 byte of the requested length. The bitflip test
> expects a count rather than an "ending" address. Thus it fails to test
> the last word of the requested range. Fixed by using (end - start + 1).
>
> Added Kconfig option to optionally disable the bitflip test, since it
> does add significantly to the time taken for "mtest".
>
> Fixes: 8e434cb705d463bc8cff935160e4fb4c77cb99ab ("cmd: mem: Add bitflip
> memory test to alternate mtest")
>
> Signed-off-by: Ralph Siemsen <ralph.siemsen at linaro.org>
Reviewed-by: Stefan Roese <sr at denx.de>
Thanks,
Stefan
> --
>
> Changes in v5:
> - Correct logic for updating error count
>
> Changes in v4:
> - Avoid #ifdef in the code
>
> Change-Id: Ie641d04e731fc5bc6a3bbef914bf7fad136cdc94
> ---
> cmd/Kconfig | 12 ++++++++++++
> cmd/mem.c | 21 ++++++++++++++++-----
> 2 files changed, 28 insertions(+), 5 deletions(-)
>
> diff --git a/cmd/Kconfig b/cmd/Kconfig
> index d54acf2cfd..275bf7fbfe 100644
> --- a/cmd/Kconfig
> +++ b/cmd/Kconfig
> @@ -779,6 +779,18 @@ config SYS_ALT_MEMTEST
> help
> Use a more complete alternative memory test.
>
> +if SYS_ALT_MEMTEST
> +
> +config SYS_ALT_MEMTEST_BITFLIP
> + bool "Bitflip test"
> + default y
> + help
> + The alternative memory test includes bitflip test since 2020.07.
> + The bitflip test significantly increases the overall test time.
> + Bitflip test can optionally be disabled here.
> +
> +endif
> +
> config SYS_MEMTEST_START
> hex "default start address for mtest"
> default 0
> diff --git a/cmd/mem.c b/cmd/mem.c
> index 9b97f7bf69..dc4a0ffab3 100644
> --- a/cmd/mem.c
> +++ b/cmd/mem.c
> @@ -867,6 +867,18 @@ static ulong test_bitflip_comparison(volatile unsigned long *bufa,
> return errs;
> }
>
> +static ulong mem_test_bitflip(vu_long *buf, ulong start, ulong end)
> +{
> + /*
> + * Split the specified range into two halves.
> + * Note that mtest range is inclusive of start,end.
> + * Bitflip test instead uses a count (of 32-bit words).
> + */
> + ulong half_size = (end - start + 1) / 2 / sizeof(unsigned long);
> +
> + return test_bitflip_comparison(buf, buf + half_size, half_size);
> +}
> +
> static ulong mem_test_quick(vu_long *buf, ulong start_addr, ulong end_addr,
> vu_long pattern, int iteration)
> {
> @@ -986,11 +998,10 @@ static int do_mem_mtest(struct cmd_tbl *cmdtp, int flag, int argc,
> errs = mem_test_alt(buf, start, end, dummy);
> if (errs == -1UL)
> break;
> - count += errs;
> - errs = test_bitflip_comparison(buf,
> - buf + (end - start) / 2,
> - (end - start) /
> - sizeof(unsigned long));
> + if (IS_ENABLED(CONFIG_SYS_ALT_MEMTEST_BITFLIP)) {
> + count += errs;
> + errs = mem_test_bitflip(buf, start, end);
> + }
> } else {
> errs = mem_test_quick(buf, start, end, pattern,
> iteration);
>
More information about the U-Boot
mailing list