summaryrefslogtreecommitdiff
path: root/src/soc
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
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')
-rw-r--r--src/soc/amd/cezanne/acpi/mmio.asl13
-rw-r--r--src/soc/amd/common/block/i2c/i2c.c12
-rw-r--r--src/soc/amd/glinda/acpi/mmio.asl12
-rw-r--r--src/soc/amd/mendocino/acpi/mmio.asl13
-rw-r--r--src/soc/amd/phoenix/acpi/mmio.asl13
-rw-r--r--src/soc/amd/picasso/acpi/mmio.asl13
-rw-r--r--src/soc/amd/stoneyridge/acpi/mmio.asl14
7 files changed, 65 insertions, 25 deletions
diff --git a/src/soc/amd/cezanne/acpi/mmio.asl b/src/soc/amd/cezanne/acpi/mmio.asl
index 722f32d573..930ca169d3 100644
--- a/src/soc/amd/cezanne/acpi/mmio.asl
+++ b/src/soc/amd/cezanne/acpi/mmio.asl
@@ -161,9 +161,10 @@ Device (I2C0) {
}
}
+ Name (STAT, 0x0)
Method (_STA, 0x0, NotSerialized)
{
- Return (0x0F)
+ Return (STAT)
}
AOAC_DEVICE(FCH_AOAC_DEV_I2C0, 0)
@@ -197,9 +198,10 @@ Device (I2C1) {
}
}
+ Name (STAT, 0x0)
Method (_STA, 0x0, NotSerialized)
{
- Return (0x0F)
+ Return (STAT)
}
AOAC_DEVICE(FCH_AOAC_DEV_I2C1, 0)
@@ -233,9 +235,10 @@ Device (I2C2) {
}
}
+ Name (STAT, 0x0)
Method (_STA, 0x0, NotSerialized)
{
- Return (0x0F)
+ Return (STAT)
}
AOAC_DEVICE(FCH_AOAC_DEV_I2C2, 0)
@@ -273,9 +276,11 @@ Device (I2C3)
Return (Local0)
}
}
+
+ Name (STAT, 0x0)
Method (_STA, 0x0, NotSerialized)
{
- Return (0x0F)
+ Return (STAT)
}
/* If this device is shared with PSP, then PSP takes care of power management */
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,
};
diff --git a/src/soc/amd/glinda/acpi/mmio.asl b/src/soc/amd/glinda/acpi/mmio.asl
index eb1f1d9b1c..3d7b882efd 100644
--- a/src/soc/amd/glinda/acpi/mmio.asl
+++ b/src/soc/amd/glinda/acpi/mmio.asl
@@ -274,9 +274,10 @@ Device (I2C0) {
}
}
+ Name (STAT, 0x0)
Method (_STA, 0x0, NotSerialized)
{
- Return (0x0F)
+ Return (STAT)
}
AOAC_DEVICE(FCH_AOAC_DEV_I2C0, 0)
@@ -310,9 +311,10 @@ Device (I2C1) {
}
}
+ Name (STAT, 0x0)
Method (_STA, 0x0, NotSerialized)
{
- Return (0x0F)
+ Return (STAT)
}
AOAC_DEVICE(FCH_AOAC_DEV_I2C1, 0)
@@ -346,9 +348,10 @@ Device (I2C2) {
}
}
+ Name (STAT, 0x0)
Method (_STA, 0x0, NotSerialized)
{
- Return (0x0F)
+ Return (STAT)
}
AOAC_DEVICE(FCH_AOAC_DEV_I2C2, 0)
@@ -386,9 +389,10 @@ Device (I2C3)
Return (Local0)
}
}
+ Name (STAT, 0x0)
Method (_STA, 0x0, NotSerialized)
{
- Return (0x0F)
+ Return (STAT)
}
/* If this device is shared with PSP, then PSP takes care of power management */
diff --git a/src/soc/amd/mendocino/acpi/mmio.asl b/src/soc/amd/mendocino/acpi/mmio.asl
index 5c364d8800..d4459d66db 100644
--- a/src/soc/amd/mendocino/acpi/mmio.asl
+++ b/src/soc/amd/mendocino/acpi/mmio.asl
@@ -274,9 +274,10 @@ Device (I2C0) {
}
}
+ Name (STAT, 0x0)
Method (_STA, 0x0, NotSerialized)
{
- Return (0x0F)
+ Return (STAT)
}
AOAC_DEVICE(FCH_AOAC_DEV_I2C0, 0)
@@ -310,9 +311,10 @@ Device (I2C1) {
}
}
+ Name (STAT, 0x0)
Method (_STA, 0x0, NotSerialized)
{
- Return (0x0F)
+ Return (STAT)
}
AOAC_DEVICE(FCH_AOAC_DEV_I2C1, 0)
@@ -346,9 +348,10 @@ Device (I2C2) {
}
}
+ Name (STAT, 0x0)
Method (_STA, 0x0, NotSerialized)
{
- Return (0x0F)
+ Return (STAT)
}
AOAC_DEVICE(FCH_AOAC_DEV_I2C2, 0)
@@ -386,9 +389,11 @@ Device (I2C3)
Return (Local0)
}
}
+
+ Name (STAT, 0x0)
Method (_STA, 0x0, NotSerialized)
{
- Return (0x0F)
+ Return (STAT)
}
/* If this device is shared with PSP, then PSP takes care of power management */
diff --git a/src/soc/amd/phoenix/acpi/mmio.asl b/src/soc/amd/phoenix/acpi/mmio.asl
index f5b27d16ee..b0253b5ec9 100644
--- a/src/soc/amd/phoenix/acpi/mmio.asl
+++ b/src/soc/amd/phoenix/acpi/mmio.asl
@@ -274,9 +274,10 @@ Device (I2C0) {
}
}
+ Name (STAT, 0x0)
Method (_STA, 0x0, NotSerialized)
{
- Return (0x0F)
+ Return (STAT)
}
AOAC_DEVICE(FCH_AOAC_DEV_I2C0, 0)
@@ -310,9 +311,10 @@ Device (I2C1) {
}
}
+ Name (STAT, 0x0)
Method (_STA, 0x0, NotSerialized)
{
- Return (0x0F)
+ Return (STAT)
}
AOAC_DEVICE(FCH_AOAC_DEV_I2C1, 0)
@@ -346,9 +348,10 @@ Device (I2C2) {
}
}
+ Name (STAT, 0x0)
Method (_STA, 0x0, NotSerialized)
{
- Return (0x0F)
+ Return (STAT)
}
AOAC_DEVICE(FCH_AOAC_DEV_I2C2, 0)
@@ -386,9 +389,11 @@ Device (I2C3)
Return (Local0)
}
}
+
+ Name (STAT, 0x0)
Method (_STA, 0x0, NotSerialized)
{
- Return (0x0F)
+ Return (STAT)
}
/* If this device is shared with PSP, then PSP takes care of power management */
diff --git a/src/soc/amd/picasso/acpi/mmio.asl b/src/soc/amd/picasso/acpi/mmio.asl
index 86733c1a6f..f8f9d35489 100644
--- a/src/soc/amd/picasso/acpi/mmio.asl
+++ b/src/soc/amd/picasso/acpi/mmio.asl
@@ -279,9 +279,10 @@ Device (I2C0) {
}
}
+ Name (STAT, 0x0)
Method (_STA, 0x0, NotSerialized)
{
- Return (0x0F)
+ Return (STAT)
}
AOAC_DEVICE(5, 0)
@@ -315,9 +316,10 @@ Device (I2C1) {
}
}
+ Name (STAT, 0x0)
Method (_STA, 0x0, NotSerialized)
{
- Return (0x0F)
+ Return (STAT)
}
AOAC_DEVICE(6, 0)
@@ -352,9 +354,10 @@ Device (I2C2) {
}
}
+ Name (STAT, 0x0)
Method (_STA, 0x0, NotSerialized)
{
- Return (0x0F)
+ Return (STAT)
}
AOAC_DEVICE(FCH_AOAC_DEV_I2C2, 0)
@@ -388,9 +391,11 @@ Device (I2C3)
Return (Local0)
}
}
+
+ Name (STAT, 0x0)
Method (_STA, 0x0, NotSerialized)
{
- Return (0x0F)
+ Return (STAT)
}
AOAC_DEVICE(FCH_AOAC_DEV_I2C3, 0)
diff --git a/src/soc/amd/stoneyridge/acpi/mmio.asl b/src/soc/amd/stoneyridge/acpi/mmio.asl
index 362b9f5dbc..5e52543f67 100644
--- a/src/soc/amd/stoneyridge/acpi/mmio.asl
+++ b/src/soc/amd/stoneyridge/acpi/mmio.asl
@@ -78,9 +78,10 @@ Device (I2CA) {
Memory32Fixed (ReadWrite, APU_I2C0_BASE, 0x1000)
})
+ Name (STAT, 0x0)
Method (_STA, 0x0, NotSerialized)
{
- Return (0x0F)
+ Return (STAT)
}
}
@@ -93,9 +94,11 @@ Device (I2CB)
IRQ (Edge, ActiveHigh, Exclusive) { 15 }
Memory32Fixed (ReadWrite, APU_I2C1_BASE, 0x1000)
})
+
+ Name (STAT, 0x0)
Method (_STA, 0x0, NotSerialized)
{
- Return (0x0F)
+ Return (STAT)
}
}
@@ -108,9 +111,10 @@ Device (I2CC) {
Memory32Fixed (ReadWrite, APU_I2C2_BASE, 0x1000)
})
+ Name (STAT, 0x0)
Method (_STA, 0x0, NotSerialized)
{
- Return (0x0F)
+ Return (STAT)
}
}
@@ -122,9 +126,11 @@ Device (I2CD)
IRQ (Edge, ActiveHigh, Exclusive) { 14 }
Memory32Fixed(ReadWrite, APU_I2C3_BASE, 0x1000)
})
+
+ Name (STAT, 0x0)
Method (_STA, 0x0, NotSerialized)
{
- Return (0x0F)
+ Return (STAT)
}
}