I2C Controller Wierdness
Posted: Thu Feb 05, 2026 8:00 am
Hey,
On my test system, my trackpad is wired up via I2C (MS HID over I2C).
The machine is an Alder Lake Dell Laptop, so series 600/700 PCH chipset I believe.
PCI enumeration gives me two I2C controllers.
I use ACPI ASL to identify the controller parameters and associated I2C devices (slave address, speed etc).
Sofar so good.. now, things go wierd.
If I try to access the I2C controller MMIO space I read back all 1's - I verified the BARs for both controllers look to be valid and initliased by firmware, also ensure bus master/memory access etc is enabled.
I then checked the PCI power management capability to find they're in D3, so I bring them into D0 (odd this - as you'd think the trackpad would be on by default?) - still read back 1's.
I then even tried using the LPSS additional registers to do the reset assert/de-assert .. no change.
The only way I can get access to the MMIO space is if I allocate my own MMIO BAR memory and re-program the device with that range as well as the D3->D0 transition.
I even tried enabling UEFI Pointer Protocol first to see if that would jumpstart anything but it made no difference.
Is there some sort of other gating mechanism that prevents access to the I2C controllers?
I also extracted all the GPIO configuration from ACPI as the I2C controllers should be setup to trigger GPEs via GPIO - what a convoluted mess that is that I can't make head nor tail of, and the 600/700 series PCH datasheet registers don't seem to align with what the ACPI _INI method does at all!
Hoping someone has some insight into how to actually get I2C from the PCH working - specifically for HID/trackpad really, and any insight into the GPIO wiring!
On my test system, my trackpad is wired up via I2C (MS HID over I2C).
The machine is an Alder Lake Dell Laptop, so series 600/700 PCH chipset I believe.
PCI enumeration gives me two I2C controllers.
I use ACPI ASL to identify the controller parameters and associated I2C devices (slave address, speed etc).
Sofar so good.. now, things go wierd.
If I try to access the I2C controller MMIO space I read back all 1's - I verified the BARs for both controllers look to be valid and initliased by firmware, also ensure bus master/memory access etc is enabled.
I then checked the PCI power management capability to find they're in D3, so I bring them into D0 (odd this - as you'd think the trackpad would be on by default?) - still read back 1's.
I then even tried using the LPSS additional registers to do the reset assert/de-assert .. no change.
The only way I can get access to the MMIO space is if I allocate my own MMIO BAR memory and re-program the device with that range as well as the D3->D0 transition.
I even tried enabling UEFI Pointer Protocol first to see if that would jumpstart anything but it made no difference.
Is there some sort of other gating mechanism that prevents access to the I2C controllers?
I also extracted all the GPIO configuration from ACPI as the I2C controllers should be setup to trigger GPEs via GPIO - what a convoluted mess that is that I can't make head nor tail of, and the 600/700 series PCH datasheet registers don't seem to align with what the ACPI _INI method does at all!
Hoping someone has some insight into how to actually get I2C from the PCH working - specifically for HID/trackpad really, and any insight into the GPIO wiring!