Re: [Intel-gfx] [PATCH v8 1/2] ACPI / bus: Introduce a list of ids for "always present" devices
On Friday, April 21, 2017 01:43:51 PM Hans de Goede wrote: > Hi, > > On 21-04-17 13:38, Andy Shevchenko wrote: > > On Fri, 2017-04-21 at 12:47 +0200, Hans de Goede wrote: > >> Several Bay / Cherry Trail devices (all of which ship with Windows 10) > >> hide > >> the LPSS PWM controller in ACPI, typically the _STA method looks like > >> this: > >> > >> Method (_STA, 0, NotSerialized) // _STA: Status > >> { > >> If (OSID == One) > >> { > >> Return (Zero) > >> } > >> > >> Return (0x0F) > >> } > >> > >> Where OSID is some dark magic seen in all Cherry Trail ACPI tables > >> making > >> the machine behave differently depending on which OS it *thinks* it is > >> booting, this gets set in a number of ways which we cannot control, on > >> some newer machines it simple hardcoded to "One" aka win10. > >> > >> This causes the PWM controller to get hidden, which means Linux cannot > >> control the backlight level on cht based tablets / laptops. > >> > >> Since loading the driver for this does no harm (the only in kernel > >> user > >> of it is the i915 driver, which will only uses it when it needs it), > >> this > >> commit makes acpi_bus_get_status() always set status to > >> ACPI_STA_DEFAULT > >> for the LPSS PWM device, fixing the lack of backlight control. > >> > > > >> drivers/acpi/Makefile| 1 + > >> drivers/acpi/bus.c | 5 +++ > >> drivers/acpi/x86/x86_utils.c | 85 > >> > > > > Perhaps .../x86/utils.c ? > > I thought that utils.c would be too generic, > but that was mainly thinking about module kernel > cmdline options which do not apply here, still > having a somewhat unique basename seems useful. I renamed it to util.c while applying the patches. Thanks, Rafael ___ Intel-gfx mailing list Intel-gfx@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/intel-gfx
Re: [Intel-gfx] [PATCH v8 1/2] ACPI / bus: Introduce a list of ids for "always present" devices
Hi, On 21-04-17 13:38, Andy Shevchenko wrote: On Fri, 2017-04-21 at 12:47 +0200, Hans de Goede wrote: Several Bay / Cherry Trail devices (all of which ship with Windows 10) hide the LPSS PWM controller in ACPI, typically the _STA method looks like this: Method (_STA, 0, NotSerialized) // _STA: Status { If (OSID == One) { Return (Zero) } Return (0x0F) } Where OSID is some dark magic seen in all Cherry Trail ACPI tables making the machine behave differently depending on which OS it *thinks* it is booting, this gets set in a number of ways which we cannot control, on some newer machines it simple hardcoded to "One" aka win10. This causes the PWM controller to get hidden, which means Linux cannot control the backlight level on cht based tablets / laptops. Since loading the driver for this does no harm (the only in kernel user of it is the i915 driver, which will only uses it when it needs it), this commit makes acpi_bus_get_status() always set status to ACPI_STA_DEFAULT for the LPSS PWM device, fixing the lack of backlight control. drivers/acpi/Makefile| 1 + drivers/acpi/bus.c | 5 +++ drivers/acpi/x86/x86_utils.c | 85 Perhaps .../x86/utils.c ? I thought that utils.c would be too generic, but that was mainly thinking about module kernel cmdline options which do not apply here, still having a somewhat unique basename seems useful. include/acpi/acpi_bus.h | 9 + diff --git a/drivers/acpi/bus.c b/drivers/acpi/bus.c index 34fbe02..784bda6 100644 --- a/drivers/acpi/bus.c +++ b/drivers/acpi/bus.c @@ -114,6 +114,11 @@ int acpi_bus_get_status(struct acpi_device *device) acpi_status status; unsigned long long sta; + if (acpi_device_always_present(device)) { + acpi_set_device_status(device, ACPI_STA_DEFAULT); + return 0; + } + status = acpi_bus_get_status_handle(device->handle, ); if (ACPI_FAILURE(status)) return -ENODEV; +#define ICPU(model){ X86_VENDOR_INTEL, 6, model, X86_FEATURE_ANY, } + +#define ENTRY(hid, uid, cpu_models) { cpu_models -> cpu_model ? Or I missed that it's an array? It may be an array, e.g. : ENTRY("INT0002", "1", (ICPU(INTEL_FAM6_ATOM_SILVERMONT1), ICPU(INTEL_FAM6_ATOM_AIRMONT)) ), Note this is a theoretical example (for now). Regards, Hans ___ Intel-gfx mailing list Intel-gfx@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/intel-gfx
Re: [Intel-gfx] [PATCH v8 1/2] ACPI / bus: Introduce a list of ids for "always present" devices
On Fri, 2017-04-21 at 12:47 +0200, Hans de Goede wrote: > Several Bay / Cherry Trail devices (all of which ship with Windows 10) > hide > the LPSS PWM controller in ACPI, typically the _STA method looks like > this: > > Method (_STA, 0, NotSerialized) // _STA: Status > { > If (OSID == One) > { > Return (Zero) > } > > Return (0x0F) > } > > Where OSID is some dark magic seen in all Cherry Trail ACPI tables > making > the machine behave differently depending on which OS it *thinks* it is > booting, this gets set in a number of ways which we cannot control, on > some newer machines it simple hardcoded to "One" aka win10. > > This causes the PWM controller to get hidden, which means Linux cannot > control the backlight level on cht based tablets / laptops. > > Since loading the driver for this does no harm (the only in kernel > user > of it is the i915 driver, which will only uses it when it needs it), > this > commit makes acpi_bus_get_status() always set status to > ACPI_STA_DEFAULT > for the LPSS PWM device, fixing the lack of backlight control. > > drivers/acpi/Makefile| 1 + > drivers/acpi/bus.c | 5 +++ > drivers/acpi/x86/x86_utils.c | 85 > Perhaps .../x86/utils.c ? > include/acpi/acpi_bus.h | 9 + > diff --git a/drivers/acpi/bus.c b/drivers/acpi/bus.c > index 34fbe02..784bda6 100644 > --- a/drivers/acpi/bus.c > +++ b/drivers/acpi/bus.c > @@ -114,6 +114,11 @@ int acpi_bus_get_status(struct acpi_device > *device) > acpi_status status; > unsigned long long sta; > > + if (acpi_device_always_present(device)) { > + acpi_set_device_status(device, ACPI_STA_DEFAULT); > + return 0; > + } > + > status = acpi_bus_get_status_handle(device->handle, ); > if (ACPI_FAILURE(status)) > return -ENODEV; > > +#define ICPU(model) { X86_VENDOR_INTEL, 6, model, > X86_FEATURE_ANY, } > + > +#define ENTRY(hid, uid, cpu_models) { cpu_models -> cpu_model ? Or I missed that it's an array? -- Andy ShevchenkoIntel Finland Oy ___ Intel-gfx mailing list Intel-gfx@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/intel-gfx
[Intel-gfx] [PATCH v8 1/2] ACPI / bus: Introduce a list of ids for "always present" devices
Several Bay / Cherry Trail devices (all of which ship with Windows 10) hide the LPSS PWM controller in ACPI, typically the _STA method looks like this: Method (_STA, 0, NotSerialized) // _STA: Status { If (OSID == One) { Return (Zero) } Return (0x0F) } Where OSID is some dark magic seen in all Cherry Trail ACPI tables making the machine behave differently depending on which OS it *thinks* it is booting, this gets set in a number of ways which we cannot control, on some newer machines it simple hardcoded to "One" aka win10. This causes the PWM controller to get hidden, which means Linux cannot control the backlight level on cht based tablets / laptops. Since loading the driver for this does no harm (the only in kernel user of it is the i915 driver, which will only uses it when it needs it), this commit makes acpi_bus_get_status() always set status to ACPI_STA_DEFAULT for the LPSS PWM device, fixing the lack of backlight control. Signed-off-by: Hans de Goede--- Changes in v2: -Use pr_debug instead of ACPI_DEBUG_PRINT Changes in v3: -Un-inline acpi_set_device_status and do the always_present_device_ids table check inside the un-inlined version of it Changes in v4: -Use dev_info instead of pr_debug -Not only check for ACPI HID but also for CPU (SoC) model so as to not for devices present on other models then for which the quirk is intended and to avoid enabling unrelated ACPI devices which happen to use the same HID Changes in v5: -Only do the dev_info once per device (acpi_set_device_status gets called multiple times per device during boot) Changes in v6: -Allow specifying more then one CPU-model for a single HID -Not only match the HID but also the UID, like on Cherry Trail, on some Bay Trail Windows 10 tablets we need to enable the PWM controller to get working backlight even though _STA returns 0. The Bay Trail SoC has 2 PWM controllers and we only need the first one. UID matching will allows adding an entry for Bay Trail which only enables the first PWM controller Changes in v7: -Put the actual x86 specific matching code and table with always present device HID + UID + CPU model entries in a new x86/x86_utils.c file which provides an acpi_device_always_present() helper function on x86, on non x86 a stub which always returns false is provided -Squash in the addition of the Bay Trail PWM entry in the table as it is there for the same reasons as the Cherry Trail entry is there Changes in v8: -Move the acpi_device_always_present() check to acpi_bus_get_status(), leave acpi_set_device_status unchanged --- drivers/acpi/Makefile| 1 + drivers/acpi/bus.c | 5 +++ drivers/acpi/x86/x86_utils.c | 85 include/acpi/acpi_bus.h | 9 + 4 files changed, 100 insertions(+) create mode 100644 drivers/acpi/x86/x86_utils.c diff --git a/drivers/acpi/Makefile b/drivers/acpi/Makefile index d78065c..f3940ac 100644 --- a/drivers/acpi/Makefile +++ b/drivers/acpi/Makefile @@ -50,6 +50,7 @@ acpi-$(CONFIG_ACPI_REDUCED_HARDWARE_ONLY) += evged.o acpi-y += sysfs.o acpi-y += property.o acpi-$(CONFIG_X86) += acpi_cmos_rtc.o +acpi-$(CONFIG_X86) += x86/x86_utils.o acpi-$(CONFIG_DEBUG_FS)+= debugfs.o acpi-$(CONFIG_ACPI_NUMA) += numa.o acpi-$(CONFIG_ACPI_PROCFS_POWER) += cm_sbs.o diff --git a/drivers/acpi/bus.c b/drivers/acpi/bus.c index 34fbe02..784bda6 100644 --- a/drivers/acpi/bus.c +++ b/drivers/acpi/bus.c @@ -114,6 +114,11 @@ int acpi_bus_get_status(struct acpi_device *device) acpi_status status; unsigned long long sta; + if (acpi_device_always_present(device)) { + acpi_set_device_status(device, ACPI_STA_DEFAULT); + return 0; + } + status = acpi_bus_get_status_handle(device->handle, ); if (ACPI_FAILURE(status)) return -ENODEV; diff --git a/drivers/acpi/x86/x86_utils.c b/drivers/acpi/x86/x86_utils.c new file mode 100644 index 000..74f1237 --- /dev/null +++ b/drivers/acpi/x86/x86_utils.c @@ -0,0 +1,85 @@ +/* + * X86 ACPI Utility Functions + * + * Copyright (C) 2017 Hans de Goede + * + * Based on various non upstream patches to support the CHT Whiskey Cove PMIC: + * Copyright (C) 2013-2015 Intel Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#include +#include +#include +#include "../internal.h" + +/* + * Some ACPI devices are hidden (status == 0x0) in recent BIOS-es because + * some recent Windows drivers bind to one device but poke at multiple + * devices at the same time, so the others get hidden. + * We work around this by always reporting ACPI_STA_DEFAULT for