summaryrefslogtreecommitdiff
path: root/src/drivers/i2c/generic
diff options
context:
space:
mode:
authorSean Rhodes <sean@starlabs.systems>2024-03-19 14:31:09 +0000
committerFelix Held <felix-coreboot@felixheld.de>2024-07-29 20:24:41 +0000
commit89282af63e879bab47639d2f71de64033978ec10 (patch)
tree1a9f7e2be91514a527f967ae1d9de35d421dd681 /src/drivers/i2c/generic
parente822d4b09315274d9820b507ba59644b1cec7e75 (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>
Diffstat (limited to 'src/drivers/i2c/generic')
-rw-r--r--src/drivers/i2c/generic/chip.h25
-rw-r--r--src/drivers/i2c/generic/generic.c7
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);