[PATCH] test/py: i2c: Add tests for i2c command

Add below test cases for i2c commands: i2c_bus - To show i2c bus info, i2c_dev - To set or show the current bus, i2c_probe - To probe the i2c device, i2c_eeprom - To test i2c eeprom device, i2c_probe_all_buses - To list down all the buses and probes it
Signed-off-by: Love Kumar love.kumar@amd.com --- test/py/tests/test_i2c.py | 107 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 107 insertions(+) create mode 100644 test/py/tests/test_i2c.py
diff --git a/test/py/tests/test_i2c.py b/test/py/tests/test_i2c.py new file mode 100644 index 000000000000..d4f533a3ba5e --- /dev/null +++ b/test/py/tests/test_i2c.py @@ -0,0 +1,107 @@ +# SPDX-License-Identifier: GPL-2.0 +# (C) Copyright 2023, Advanced Micro Devices, Inc. + +import pytest +import random +import re + +""" +Note: This test doesn't rely on boardenv_* configuration value but they can +change test behavior. + +For example: + +# Setup env__i2c_device_test_skip to True if tests with i2c devices should be +# skipped. For example: Missing QEMU model or broken i2c device +env__i2c_device_test_skip = True + +# Setup env__i2c_eeprom_device_test to set the i2c bus number and eeprom +# address for i2c_eeprom test case. Test will be skipped if +# env__i2c_eeprom_device_test is not set +env__i2c_eeprom_device_test = { + "bus": 3, + "eeprom_addr": 0x54, +} + +# Setup env__i2c_device_test to provide the i2c bus list to test against it +# for i2c_probe_all_buses case instead of probing all the buses available. If +# it is not set, it list down all the buses and probes it +env__i2c_device_test = { + "bus_list": [0, 2, 5, 12, 16, 18] +} +""" + +@pytest.mark.buildconfigspec("cmd_i2c") +def test_i2c_bus(u_boot_console): + if u_boot_console.config.env.get("env__i2c_device_test_skip", False): + pytest.skip("I2C device test is not enabled!") + expected_response = "Bus" + response = u_boot_console.run_command("i2c bus") + assert expected_response in response + +@pytest.mark.buildconfigspec("cmd_i2c") +def test_i2c_dev(u_boot_console): + if u_boot_console.config.env.get("env__i2c_device_test_skip", False): + pytest.skip("I2C device test is not enabled!") + expected_response = "Current bus" + response = u_boot_console.run_command("i2c dev") + assert expected_response in response + +@pytest.mark.buildconfigspec("cmd_i2c") +def test_i2c_probe(u_boot_console): + if u_boot_console.config.env.get("env__i2c_device_test_skip", False): + pytest.skip("I2C device test is not enabled!") + expected_response = "Setting bus to 0" + response = u_boot_console.run_command("i2c dev 0") + assert expected_response in response + expected_response = "Valid chip addresses:" + response = u_boot_console.run_command("i2c probe") + assert expected_response in response + +@pytest.mark.buildconfigspec("cmd_i2c") +def test_i2c_eeprom(u_boot_console): + f = u_boot_console.config.env.get("env__i2c_eeprom_device_test", None) + if not f: + pytest.skip("No I2C eeprom to test!") + + bus = f.get("bus", 0) + if bus < 0: + pytest.fail("No bus specified via env__i2c_eeprom_device_test!") + + addr = f.get("eeprom_addr", -1) + if addr < 0: + pytest.fail("No eeprom address specified via env__i2c_eeprom_device_test!") + + # Enable i2c mux bridge + u_boot_console.run_command("i2c dev %x" % bus) + u_boot_console.run_command("i2c probe") + val_int = random.randint(0, 255) + value = format(val_int, "02x") + u_boot_console.run_command("i2c mw %x 0 %x 5" % (addr, val_int)) + expected_response = f"0000: {value} {value} {value} {value} {value} " + response = u_boot_console.run_command("i2c md %x 0 5" % addr) + assert expected_response in response + +@pytest.mark.buildconfigspec("cmd_i2c") +def test_i2c_probe_all_buses(u_boot_console): + if u_boot_console.config.env.get("env__i2c_device_test_skip", False): + pytest.skip("I2C device test is not enabled!") + expected_response = "Bus" + response = u_boot_console.run_command("i2c bus") + assert expected_response in response + + # Get all the bus list + f = u_boot_console.config.env.get("env__i2c_device_test", None) + if f: + bus_list = f.get("bus_list") + else: + buses = re.findall("Bus (.+?):", response) + bus_list = [int(x) for x in buses] + + for dev in bus_list: + expected_response = f"Setting bus to {dev}" + response = u_boot_console.run_command(f"i2c dev {dev}") + assert expected_response in response + expected_response = "Valid chip addresses:" + response = u_boot_console.run_command("i2c probe") + assert expected_response in response

On Wed, Nov 15, 2023 at 12:08:38PM +0530, Love Kumar wrote:
Add below test cases for i2c commands: i2c_bus - To show i2c bus info, i2c_dev - To set or show the current bus, i2c_probe - To probe the i2c device, i2c_eeprom - To test i2c eeprom device, i2c_probe_all_buses - To list down all the buses and probes it
Signed-off-by: Love Kumar love.kumar@amd.com
test/py/tests/test_i2c.py | 107 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 107 insertions(+) create mode 100644 test/py/tests/test_i2c.py
I'm mostly happy with this test. I enabled it for one of my platforms with an EEPROM and:
+@pytest.mark.buildconfigspec("cmd_i2c") +def test_i2c_eeprom(u_boot_console):
- f = u_boot_console.config.env.get("env__i2c_eeprom_device_test", None)
- if not f:
pytest.skip("No I2C eeprom to test!")
- bus = f.get("bus", 0)
- if bus < 0:
pytest.fail("No bus specified via env__i2c_eeprom_device_test!")
- addr = f.get("eeprom_addr", -1)
- if addr < 0:
pytest.fail("No eeprom address specified via env__i2c_eeprom_device_test!")
- # Enable i2c mux bridge
- u_boot_console.run_command("i2c dev %x" % bus)
- u_boot_console.run_command("i2c probe")
- val_int = random.randint(0, 255)
- value = format(val_int, "02x")
- u_boot_console.run_command("i2c mw %x 0 %x 5" % (addr, val_int))
- expected_response = f"0000: {value} {value} {value} {value} {value} "
- response = u_boot_console.run_command("i2c md %x 0 5" % addr)
- assert expected_response in response
So this is a destructive test, yes? That's fine for QEMU but on real hardware that's a problem. Doubly so since I need the contents to be correct as they already are. Can we change this such that we probe the eeprom and then read back the configured correct value instead?
participants (2)
-
Love Kumar
-
Tom Rini