summaryrefslogtreecommitdiff
path: root/src/soc/amd/common
diff options
context:
space:
mode:
authorFelix Held <felix-coreboot@felixheld.de>2023-09-04 18:02:32 +0200
committerFelix Held <felix-coreboot@felixheld.de>2023-09-06 19:51:26 +0000
commitbfd85218a72ef057a7c150358a0f6983639f86dc (patch)
treef425632a83ae0aef0aae952b6930317809c7a302 /src/soc/amd/common
parentfeb683d1b9fbf33fc22c9263b4d7ad935f90aeaf (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.c12
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,
};