# SPDX-License-Identifier: GPL-2.0 # (C) Copyright 2023, Advanced Micro Devices, Inc. import pytest import random import re """ Note: This test relies on boardenv_* containing configuration values to define the i2c device info including the bus list and eeprom address/value. This test will be automatically skipped without this. For example: # Setup env__i2c_device_test to set the i2c bus list and probe_all boolean # parameter. For i2c_probe_all_buses case, if probe_all parameter is set to # False then it probes all the buses listed in bus_list instead of probing all # the buses available. env__i2c_device_test = { 'bus_list': [0, 2, 5, 12, 16, 18], 'probe_all': False, } # Setup env__i2c_eeprom_device_test to set the i2c bus number, eeprom address # and configured value 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, 'eeprom_val': '30 31', } """ def get_i2c_test_env(u_boot_console): f = u_boot_console.config.env.get("env__i2c_device_test", None) if not f: pytest.skip("No I2C device to test!") else: bus_list = f.get("bus_list", None) if not bus_list: pytest.skip("I2C bus list is not provided!") probe_all = f.get("probe_all", False) return bus_list, probe_all @pytest.mark.buildconfigspec("cmd_i2c") def test_i2c_bus(u_boot_console): bus_list, probe = get_i2c_test_env(u_boot_console) bus = random.choice(bus_list) expected_response = f"Bus {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): bus_list, probe = get_i2c_test_env(u_boot_console) expected_response = "Current bus is" 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): bus_list, probe = get_i2c_test_env(u_boot_console) bus = random.choice(bus_list) expected_response = f"Setting bus to {bus}" response = u_boot_console.run_command(f"i2c dev {bus}") 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!") value = f.get("eeprom_val") if not value: pytest.fail( "No eeprom configured value provided 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") output = u_boot_console.run_command("i2c md %x 0 5" % addr) assert value in output @pytest.mark.buildconfigspec("cmd_i2c") def test_i2c_probe_all_buses(u_boot_console): bus_list, probe = get_i2c_test_env(u_boot_console) bus = random.choice(bus_list) expected_response = f"Bus {bus}:" response = u_boot_console.run_command("i2c bus") assert expected_response in response # Get all the bus list if probe: 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