[PATCH] nouveau: fix ambiguous backlight controls

Hans de Goede hdegoede at redhat.com
Sun Dec 28 06:54:50 PST 2014


Hi,

On 28-12-14 15:30, Jeremiah Mahler wrote:
> Hans,
>
> On Sat, Dec 27, 2014 at 02:39:42PM +0100, Hans de Goede wrote:
>> Hi,
>>
>> On 27-12-14 00:51, Jeremiah Mahler wrote:
>>> Ilia,
>>>
>>> On Fri, Dec 26, 2014 at 04:39:08PM -0500, Ilia Mirkin wrote:
>>>> On Fri, Dec 26, 2014 at 4:26 PM, Jeremiah Mahler <jmmahler at gmail.com> wrote:
>>>>> If a display supports backlight control using the nouveau driver, and
>>>>> also supports standard ACPI backlight control, there will be two sets of
>>>>> controls.
>>>>>
>>>>> /sys/class/backlight/acpi_video0
>>>>> /sys/class/backlight/nv_backlight
>>>>>
>>>>> This creates ambiguity because these controls can be out of sync with
>>>>> each other.  One could be at 100% while the other is at 0% and the
>>>>> actual display brightness depends on which one was used last.  This also
>>>>> creates anomalies in Powertop which will show two values for brightness
>>>>> with potentially different values.
>>>>>
>>>>> Fix this ambiguity by having the nouveau driver only enable its
>>>>> backlight controls if the standard ACPI controls are not present.
>>>>>
>>>>> Signed-off-by: Jeremiah Mahler <jmmahler at gmail.com>
>>>>> ---
>>>>>   drivers/gpu/drm/nouveau/nouveau_backlight.c | 5 +++++
>>>>>   1 file changed, 5 insertions(+)
>>>>>
>>>>> diff --git a/drivers/gpu/drm/nouveau/nouveau_backlight.c b/drivers/gpu/drm/nouveau/nouveau_backlight.c
>>>>> index e566c5b..3a52bd4 100644
>>>>> --- a/drivers/gpu/drm/nouveau/nouveau_backlight.c
>>>>> +++ b/drivers/gpu/drm/nouveau/nouveau_backlight.c
>>>>> @@ -221,6 +221,11 @@ nouveau_backlight_init(struct drm_device *dev)
>>>>>          struct nvif_device *device = &drm->device;
>>>>>          struct drm_connector *connector;
>>>>>
>>>>> +       if (acpi_video_backlight_support()) {
>>>>
>>>> None of the other drivers have this. Is nouveau somehow different
>>>> than, say, radeon in this respect?
>>>>
>>>> Unfortunately the backlight situation is pretty fubar'd... sometimes
>>>> the acpi controls don't work, sometimes the card controls don't work,
>>>> sometimes they both work but in different ways (and then everyone's
>>>> favourite -- neither works, and there's some third platform thing).
>>>> I'm pretty sure this code existed before, but got removed. See commit
>>>> bee564430feec1175ee64bcfd4913cacc519f817 and the previous commit
>>>> 5bead799d3f8 before that. The ping-pong is probably not the right way
>>>> to go.
>>>>
>>>
>>> I was not aware of that change. But you are right, it took out what I
>>> was trying to put back in.
>>>
>>> Thanks for the helpful information.  I will have to rethink this fix.
>>
>> So first of all NAK to the original fix, but I think that much was
>> already clear.
>>
>> Let me explain how this currently works, most laptops have up to 3
>> backlight control interfaces (all talking to the same single backlight):
>>
>> acpi_video: a standardized acpi interface for backlight control, broken on most
>> win8 ready laptops.
>>
>> vendor: e.g. asus_wmi, dell_laptop, etc. typically not much better on
>> win8 ready laptops.
>>
>> native: e.g. intel_backlight, nv_backlight, usually your best bet on win8
>> laptops, but not so much on older models.
>>
>> Before windows8 only 2 of these 3 get registered / exported to userspace,
>> either you've:
>>
>> acpi_video + native:
>>
>> or:
>>
>> vendor + native:
>>
>> Since most vendor drivers contain:
>>
>> if (acpi_video_backlight_support())
>> 	return 0;
>>
>> And userspace backlight control code knows the prefer the firmware interfaces
>> over the native one and to simply ignore the native interface, unless there
>> is no firmware interface, so having 2 interfaces present in sysfs is not
>> really a problem as userspace knows how to deal with this.
>>
>> So along came Windows 8, breaking most acpi_video implementations. This got
>> fixed by a new module parameter to the acpi_video driver called use_native_backlight,
>> which now a days defaults to 1. When this parameter is true *and* the BIOS is
>> a win8 ready bios, then acpi_video will not register a backlight interface itself,
>> and acpi_video_backlight_support() will still return 1, causing the vendor interfaces
>> to not register. Leaving only the native interface.
>>
> So acpi_video_backlight_support() will return true for win8 even when ACPI
> isn't actually supported.

Well it is supported (the bios has an acpi_video backlight interface), but
drivers/acpi/video.c choses not to register the interface. Note that video-detect.c
knows nothing about that. As said this is not pretty.

> Could this have been fixed by updating
> acpi_video_backlight_support() function?

In retrospect it would probably have been best to do something akin to adding
a acpi_video_get_backlight_type function when the video.use_native_backlight
kernel option was first introduced.

>
>> Your proposed patch will break things on win8 laptops using nv_backlight, since in the
>> use_native_backlight case it will cause nv_backlight to not register resulting in
>> not having any backlight interface at all.
>>
>> I will happily admit that the combination of acpi_backlight=[video|vendor]
>> + video.use_native_backlight=[0|1] which has evolved over time is not the prettiest
>> solution. IMHO if you want to clean things up, and ensure only one interface gets
>> registered at a time, the solution would be to change acpi_backlight to also take
>> a native option, so that on the kernel commandline we end up with only:
>> acpi_backlight=[video|vendor|native] and move the use_native_backlight handling
>> from drivers/acpi/video.c to drivers/acpi/video_detect.c .
>>
> It is not ideal but I can see why it was done.  It is much better to have
> at least one working interface even if this means there are two in some
> cases.
>
> My complaint of two which can be out of sync with each other is a non-issue
> in most cases.
>
>> Code wise this would mean replacing acpi_video_backlight_support() with a function
>> called acpi_video_get_backlight_type which returns an enum which can be:
>>
>> acpi_video_backlight_acpi_video,
>> acpi_video_backlight_vendor,
>> acpi_video_backlight_native,
>>
>> And fix all callers to use that.
>>
> So all the detection would be done in drivers/acpi/video_detect.c and
> then acpi_video_backlight_type() could be called to determine the type.

Correct.

>> But, things are not that easy because there also is acpi_video_dmi_promote_vendor()
>> which is used by vendor drivers (mostly found under drivers/platform/x86) to tell
>> video_detect.c that the vendor driver knows that on this particular model laptop
>> it is better to use the vendor driver then acpi_video, and in some cases
>> this is used in combination with not actually registering the vendor backlight interface
>> to get the same end result as the new "native" option would give, but then on laptops
>> which need this despite not being win8 ready (and thus not automatically defaulting
>> to native).
>>
>> So you would need to replace this to with a acpi_video_set_dmi_backlight_type, which
>> should change the return of acpi_video_get_backlight_type, but only if not overridden
>> from the kernel commandline, as the commandline takes presedence over the dmi
>> quirks which are tracked in the various vendor drivers.
>>
> Ugh, this is a messy situation.

This is sort of this way by design, so that we can keep the quirks in per vendor
drivers, rather then having one gargantuan quirk table in video-detect.c

>
>> A cleanup to all this would certainly be welcome, but as outlined above it is not
>> trivial. I do not have time to actively work on this myself, but I will happily
>> review any patches you come up with for this.
>>
>> Regards,
>>
>> Hans
>
> Thanks for the very detailed description :)

You're welcome.

Regards,

Hans


More information about the dri-devel mailing list