Message ID | 20230119172441.623918-1-hdegoede@redhat.com |
---|---|
State | Accepted |
Commit | e6b3086fddc0065a5ffb947d4d29dd0e6efc327b |
Headers | show |
Series | ACPI: video: Add backlight=native DMI quirk for Asus U46E | expand |
On Thu, Jan 19, 2023 at 6:24 PM Hans de Goede <hdegoede@redhat.com> wrote: > > The Asus U46E backlight tables have a set of interesting problems: > > 1. Its ACPI tables do make _OSI ("Windows 2012") checks, so > acpi_osi_is_win8() should return true. > > But the tables have 2 sets of _OSI calls, one from the usual global > _INI method setting a global OSYS variable and a second set of _OSI > calls from a MSOS method and the MSOS method is the only one calling > _OSI ("Windows 2012"). > > The MSOS method only gets called in the following cases: > 1. From some Asus specific WMI methods > 2. From _DOD, which only runs after acpi_video_get_backlight_type() > has already been called by the i915 driver > 3. From other ACPI video bus methods which never run (see below) > 4. From some EC query callbacks > > So when i915 calls acpi_video_get_backlight_type() MSOS has never run > and acpi_osi_is_win8() returns false, so acpi_video_get_backlight_type() > returns acpi_video as the desired backlight type, which causes > the intel_backlight device to not register. > > 2. _DOD effectively does this: > > Return (Package (0x01) > { > 0x0400 > }) > > causing acpi_video_device_in_dod() to return false, which causes > the acpi_video backlight device to not register. > > Leaving the user with no backlight device at all. Note that before 6.1.y > the i915 driver would register the intel_backlight device unconditionally > and since that then was the only backlight device userspace would use that. > > Add a backlight=native DMI quirk for this special laptop to restore > the old (and working) behavior of the intel_backlight device registering. > > Fixes: fb1836c91317 ("ACPI: video: Prefer native over vendor") > Signed-off-by: Hans de Goede <hdegoede@redhat.com> > --- > drivers/acpi/video_detect.c | 8 ++++++++ > 1 file changed, 8 insertions(+) > > diff --git a/drivers/acpi/video_detect.c b/drivers/acpi/video_detect.c > index aa6196e5e574..64eab35037c3 100644 > --- a/drivers/acpi/video_detect.c > +++ b/drivers/acpi/video_detect.c > @@ -610,6 +610,14 @@ static const struct dmi_system_id video_detect_dmi_table[] = { > DMI_MATCH(DMI_PRODUCT_NAME, "GA503"), > }, > }, > + { > + .callback = video_detect_force_native, > + /* Asus U46E */ > + .matches = { > + DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK Computer Inc."), > + DMI_MATCH(DMI_PRODUCT_NAME, "U46E"), > + }, > + }, > { > .callback = video_detect_force_native, > /* Asus UX303UB */ > -- Applied as 6.2-rcf material, thanks!
diff --git a/drivers/acpi/video_detect.c b/drivers/acpi/video_detect.c index aa6196e5e574..64eab35037c3 100644 --- a/drivers/acpi/video_detect.c +++ b/drivers/acpi/video_detect.c @@ -610,6 +610,14 @@ static const struct dmi_system_id video_detect_dmi_table[] = { DMI_MATCH(DMI_PRODUCT_NAME, "GA503"), }, }, + { + .callback = video_detect_force_native, + /* Asus U46E */ + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK Computer Inc."), + DMI_MATCH(DMI_PRODUCT_NAME, "U46E"), + }, + }, { .callback = video_detect_force_native, /* Asus UX303UB */
The Asus U46E backlight tables have a set of interesting problems: 1. Its ACPI tables do make _OSI ("Windows 2012") checks, so acpi_osi_is_win8() should return true. But the tables have 2 sets of _OSI calls, one from the usual global _INI method setting a global OSYS variable and a second set of _OSI calls from a MSOS method and the MSOS method is the only one calling _OSI ("Windows 2012"). The MSOS method only gets called in the following cases: 1. From some Asus specific WMI methods 2. From _DOD, which only runs after acpi_video_get_backlight_type() has already been called by the i915 driver 3. From other ACPI video bus methods which never run (see below) 4. From some EC query callbacks So when i915 calls acpi_video_get_backlight_type() MSOS has never run and acpi_osi_is_win8() returns false, so acpi_video_get_backlight_type() returns acpi_video as the desired backlight type, which causes the intel_backlight device to not register. 2. _DOD effectively does this: Return (Package (0x01) { 0x0400 }) causing acpi_video_device_in_dod() to return false, which causes the acpi_video backlight device to not register. Leaving the user with no backlight device at all. Note that before 6.1.y the i915 driver would register the intel_backlight device unconditionally and since that then was the only backlight device userspace would use that. Add a backlight=native DMI quirk for this special laptop to restore the old (and working) behavior of the intel_backlight device registering. Fixes: fb1836c91317 ("ACPI: video: Prefer native over vendor") Signed-off-by: Hans de Goede <hdegoede@redhat.com> --- drivers/acpi/video_detect.c | 8 ++++++++ 1 file changed, 8 insertions(+)