Hardware: HP Pavilion Gaming Laptop 17-cd0xxx (board 85FF, BIOS F.12
08/02/2019),
Intel i7-9750H, Cannon Lake PCH
Kernel: linux-image-7.2.11+deb14-amd64 7.2.11-1. The current upstream
(linux-pm linux-next)
ec_dmi_table has no entry for this model either.
Problem
-------
The Fn brightness keys never worked reliably. Key presses are delivered late
and in bursts: they show up on the "Video Bus" input device only when some
unrelated EC transaction happens (for example opening the hp_accel /
lis3lv02d accelerometer input device releases all queued presses at once).
Cause
-----
The ECDT and the DSDT disagree about the EC GPE:
ECDT: GPE bit = 0x17, EC_ID \_SB.PCI0.LPCB.H_EC
DSDT: Device (\_SB.PCI0.LPCB.EC0) { Name (_HID, EisaId ("PNP0C09"))
Name (_GPE, 0x14) ... }
The kernel uses the ECDT value ("ACPI: EC: GPE=0x17"). GPE 0x17 never fires;
the EC raises GPE 0x14, which has no handler. After ~58 minutes of uptime:
/sys/firmware/acpi/interrupts/sci: 5
/sys/firmware/acpi/interrupts/gpe17: 0 EN enabled unmasked
/sys/firmware/acpi/interrupts/gpe14: 0 STS invalid unmasked
This is the same situation as the HP Pavilion Gaming 15-cx0xxx (bug 209989)
and 15-dk1xxx, which got ec_honor_dsdt_gpe quirk entries in
drivers/acpi/ec.c.
Verification
------------
Overriding the ECDT through the initrd (CONFIG_ACPI_TABLE_UPGRADE) with a
copy
whose GPE byte is changed to 0x14 (OEM revision bumped, checksum fixed)
fixes
the problem completely. Two minutes after boot:
sci: 367
gpe14: 362 EN enabled unmasked
gpe17: 0 invalid unmasked
and the brightness keys respond immediately. So the following entry in
ec_dmi_table should fix it (I have not built or booted a kernel with it):
{
/*
* HP Pavilion Gaming Laptop 17-cd0xxx
*/
.callback = ec_honor_dsdt_gpe,
.matches = {
DMI_MATCH(DMI_SYS_VENDOR, "HP"),
DMI_MATCH(DMI_PRODUCT_NAME, "HP Pavilion Gaming Laptop 17-cd0xxx"),
},
},
DMI: sys_vendor "HP", product_name "HP Pavilion Gaming Laptop 17-cd0xxx".
Attachments
-----------
dmesg-with-override.txt boot log (kernel), ECDT override active
ecdt-dsdt.tar.gz original ECDT and DSDT binaries
gpe-counters.txt /sys/firmware/acpi/interrupts snapshot
(The analysis was done with the help of an AI assistant; the measurements
above are from my machine.)