Love Kumar | 44f1368 | 2024-01-03 15:59:42 +0530 | [diff] [blame] | 1 | # SPDX-License-Identifier: GPL-2.0 |
| 2 | # (C) Copyright 2023, Advanced Micro Devices, Inc. |
| 3 | |
| 4 | import pytest |
| 5 | |
| 6 | """ |
| 7 | Note: This test relies on boardenv_* containing configuration values to define |
| 8 | the memory test parameters such as start address, memory size, pattern, |
| 9 | iterations and timeout. This test will be automatically skipped without this. |
| 10 | |
| 11 | For example: |
| 12 | |
| 13 | # Setup env__memtest to set the start address of the memory range, size of the |
| 14 | # memory range to test from starting address, pattern to be written to memory, |
| 15 | # number of test iterations, and expected time to complete the test of mtest |
| 16 | # command. start address, size, and pattern parameters value should be in hex |
| 17 | # and rest of the params value should be integer. |
| 18 | env__memtest = { |
| 19 | 'start_addr': 0x0, |
| 20 | 'size': 0x1000, |
| 21 | 'pattern': 0x0, |
| 22 | 'iteration': 16, |
| 23 | 'timeout': 50000, |
| 24 | } |
| 25 | """ |
| 26 | |
| 27 | def get_memtest_env(u_boot_console): |
| 28 | f = u_boot_console.config.env.get("env__memtest", None) |
| 29 | if not f: |
| 30 | pytest.skip("memtest is not enabled!") |
| 31 | else: |
| 32 | start = f.get("start_addr", 0x0) |
| 33 | size = f.get("size", 0x1000) |
| 34 | pattern = f.get("pattern", 0x0) |
| 35 | iteration = f.get("iteration", 2) |
| 36 | timeout = f.get("timeout", 50000) |
| 37 | end = hex(int(start) + int(size)) |
| 38 | return start, end, pattern, iteration, timeout |
| 39 | |
| 40 | @pytest.mark.buildconfigspec("cmd_memtest") |
| 41 | def test_memtest_negative(u_boot_console): |
| 42 | """Negative testcase where end address is smaller than starting address and |
| 43 | pattern is invalid.""" |
| 44 | start, end, pattern, iteration, timeout = get_memtest_env(u_boot_console) |
| 45 | expected_response = "Refusing to do empty test" |
| 46 | response = u_boot_console.run_command( |
| 47 | f"mtest 2000 1000 {pattern} {hex(iteration)}" |
| 48 | ) |
| 49 | assert expected_response in response |
| 50 | output = u_boot_console.run_command("echo $?") |
| 51 | assert not output.endswith("0") |
| 52 | u_boot_console.run_command(f"mtest {start} {end} 'xyz' {hex(iteration)}") |
| 53 | output = u_boot_console.run_command("echo $?") |
| 54 | assert not output.endswith("0") |
| 55 | |
| 56 | @pytest.mark.buildconfigspec("cmd_memtest") |
| 57 | def test_memtest_ddr(u_boot_console): |
| 58 | """Test that md reads memory as expected, and that memory can be modified |
| 59 | using the mw command.""" |
| 60 | start, end, pattern, iteration, timeout = get_memtest_env(u_boot_console) |
| 61 | expected_response = f"Tested {str(iteration)} iteration(s) with 0 errors." |
| 62 | with u_boot_console.temporary_timeout(timeout): |
| 63 | response = u_boot_console.run_command( |
| 64 | f"mtest {start} {end} {pattern} {hex(iteration)}" |
| 65 | ) |
| 66 | assert expected_response in response |
| 67 | output = u_boot_console.run_command("echo $?") |
| 68 | assert output.endswith("0") |