diff options
author | Sean Rhodes <sean@starlabs.systems> | 2024-03-19 14:31:09 +0000 |
---|---|---|
committer | Felix Held <felix-coreboot@felixheld.de> | 2024-07-29 20:24:41 +0000 |
commit | 89282af63e879bab47639d2f71de64033978ec10 (patch) | |
tree | 1a9f7e2be91514a527f967ae1d9de35d421dd681 | |
parent | e822d4b09315274d9820b507ba59644b1cec7e75 (diff) |
i2c/drivers/generic: Add support for including a CDM
Chip Direct Mapping is exclusive to Windows; it allows specifying the
position where a chip is mounted. There are 8 positions and a _CDM
method should return 0xabcd0X, where X is the position.
Tested by booting Windows 11 on the StarLite Mk V, rotating the device
and checking the orientation is correct, where previously, it was
inverted.
Change-Id: If70c25288d835df7064b4051c43abeb2d6531f3b
Signed-off-by: Sean Rhodes <sean@starlabs.systems>
Reviewed-on: https://review.coreboot.org/c/coreboot/+/81409
Reviewed-by: Angel Pons <th3fanbus@gmail.com>
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
-rw-r--r-- | src/drivers/i2c/generic/chip.h | 25 | ||||
-rw-r--r-- | src/drivers/i2c/generic/generic.c | 7 |
2 files changed, 32 insertions, 0 deletions
diff --git a/src/drivers/i2c/generic/chip.h b/src/drivers/i2c/generic/chip.h index 227cb61e18..69ce29dae4 100644 --- a/src/drivers/i2c/generic/chip.h +++ b/src/drivers/i2c/generic/chip.h @@ -81,6 +81,31 @@ struct drivers_i2c_generic_config { bool has_rotation_matrix; int rotation_matrix[9]; + /* + * Chip Direct Mapping is exclusive to Windows, a allows specifying the + * position where a chip is mounted. There are 8 positions: + * 1: 90 Degrees + * 2: 270 Degrees + * 3: 180 Degrees + * 4: 0 Degrees + * 5: 90 Degrees (Inverted) + * 6: 270 Degrees (Inverted) + * 7: 180 Degrees (Inverted) + * 8: 0 Degrees (Inverted) + * + * The _CDM method should return 0xabcd0X, where X is the position. + */ + enum { + CDM_NOT_PRESENT = 0, + CDM_ROT_90, + CDM_ROT_180, + CDM_ROT_270, + CDM_ROT_0, + CDM_ROT_90_INVERT, + CDM_ROT_180_INVERT, + CDM_ROT_270_INVERT, + CDM_ROT_0_INVERT, + } cdm_index; /* Generic properties for exporting device-specific data to the OS */ struct acpi_dp property_list[MAX_GENERIC_PROPERTY_LIST]; diff --git a/src/drivers/i2c/generic/generic.c b/src/drivers/i2c/generic/generic.c index 98c59e6a05..1875bacb2d 100644 --- a/src/drivers/i2c/generic/generic.c +++ b/src/drivers/i2c/generic/generic.c @@ -165,6 +165,13 @@ void i2c_generic_fill_ssdt(const struct device *dev, acpigen_pop_len(); } + /* Chip Direct Mapping */ + if (config->cdm_index != CDM_NOT_PRESENT) { + acpigen_write_method("_CDM", 1); + acpigen_write_return_integer(0xabcd00 | config->cdm_index); + acpigen_pop_len(); + } + /* Callback if any. */ if (callback) callback(dev); |