diff options
author | Felix Held <felix-coreboot@felixheld.de> | 2023-09-04 18:02:32 +0200 |
---|---|---|
committer | Felix Held <felix-coreboot@felixheld.de> | 2023-09-06 19:51:26 +0000 |
commit | bfd85218a72ef057a7c150358a0f6983639f86dc (patch) | |
tree | f425632a83ae0aef0aae952b6930317809c7a302 /src/soc/amd/common | |
parent | feb683d1b9fbf33fc22c9263b4d7ad935f90aeaf (diff) |
soc/amd: correctly report I2C controller state in ACPI
Instead of reporting all I2C controllers in the system as enabled in the
corresponding ACPI device's _STA method, report the I2C devices that are
disabled in the devicetree as disabled in the corresponding _STA method
too. This is done by returning the contents of the STAT variable inside
each device's scope in the DSDT that have a default value of 0 (device
not present/disabled). For all enabled and hidden I2C devices
i2c_acpi_fill_ssdt gets called which then writes 0xf (device enabled and
visible) or 0xb (device enabled, but hidden) to the STAT name inside the
same scope, but in the SSDT. This object in the SSDT will then override
the default in the DSDT resulting in the _STA method returning the
correct status of each device. The code was inspired by
commit 7cf9c7451808 ("soc/amd/*: Fix UART ACPI device status").
TEST=On Mandolin all I2C controllers are disabled and with this patch
none shows up in the Windows 10 device manager. When enabling an I2C
controller in the devicetree for testing, it shows up again in the
Windows device manager.
Signed-off-by: Felix Held <felix-coreboot@felixheld.de>
Change-Id: I4cd9f447ded3a7f0b092218410c89767ec517417
Reviewed-on: https://review.coreboot.org/c/coreboot/+/77643
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Reviewed-by: Eric Lai <eric_lai@quanta.corp-partner.google.com>
Reviewed-by: Paul Menzel <paulepanter@mailbox.org>
Reviewed-by: Matt DeVillier <matt.devillier@gmail.com>
Diffstat (limited to 'src/soc/amd/common')
-rw-r--r-- | src/soc/amd/common/block/i2c/i2c.c | 12 |
1 files changed, 11 insertions, 1 deletions
diff --git a/src/soc/amd/common/block/i2c/i2c.c b/src/soc/amd/common/block/i2c/i2c.c index 88af20e972..57819fbe8f 100644 --- a/src/soc/amd/common/block/i2c/i2c.c +++ b/src/soc/amd/common/block/i2c/i2c.c @@ -1,5 +1,6 @@ /* SPDX-License-Identifier: GPL-2.0-only */ +#include <acpi/acpigen.h> #include <assert.h> #include <amdblocks/acpimmio.h> #include <amdblocks/gpio.h> @@ -62,6 +63,15 @@ static const char *i2c_acpi_name(const struct device *dev) return NULL; } +static void i2c_acpi_fill_ssdt(const struct device *dev) +{ + dw_i2c_acpi_fill_ssdt(dev); + + acpigen_write_scope(acpi_device_path(dev)); + acpigen_write_store_int_to_namestr(acpi_device_status(dev), "STAT"); + acpigen_pop_len(); /* Scope */ +} + int dw_i2c_soc_dev_to_bus(const struct device *dev) { size_t i; @@ -129,7 +139,7 @@ struct device_operations soc_amd_i2c_mmio_ops = { .set_resources = noop_set_resources, .scan_bus = scan_smbus, .acpi_name = i2c_acpi_name, - .acpi_fill_ssdt = dw_i2c_acpi_fill_ssdt, + .acpi_fill_ssdt = i2c_acpi_fill_ssdt, .ops_i2c_bus = &dw_i2c_bus_ops, }; |