Re: ACPI/i915: Cannot configure display brightness on Dell Latitude E6440

From: Hans de Goede
Date: Wed Sep 24 2014 - 08:05:00 EST


Hi,

On 09/24/2014 11:14 AM, Pali RohÃr wrote:
> On Wednesday 24 September 2014 10:59:41 Pali RohÃr wrote:
>> On Wednesday 24 September 2014 10:19:38 Hans de Goede wrote:
>>> Hi,
>>>
>>> On 09/23/2014 10:44 PM, Pali RohÃr wrote:
>>>> On Tuesday 23 September 2014 22:31:31 you wrote:
>>>>> Hi,
>>>>>
>>>>> On 09/23/2014 10:06 PM, Pali RohÃr wrote:
>>>>>> Hello,
>>>>>>
>>>>>> after big changes in acpi video/i915 code I cannot
>>>>>> change display brightness on my Dell Latitude E6440
>>>>>> with kernel 3.17-rc6. With kernel 3.13 everything
>>>>>> worked fine.
>>>>>>
>>>>>> More information about this problem:
>>>>>>
>>>>>> For configuring brightness on Dell laptops there are 4
>>>>>> ways: 1) via acpi video driver
>>>>>> 2) via dell-laptop driver
>>>>>> 3) via i915 drm driver
>>>>>> 4) from userspace with special dell SMI call
>>>>>>
>>>>>> (e.g with program dellLcdBrightness from libsmbios
>>>>>> package)
>>>>>>
>>>>>> Methods 2) and 4) are same, both making special SMI call
>>>>>> and Bios handing this request (just 2 is from kernel and
>>>>>> 4 from userspace)
>>>>>>
>>>>>> Method 1) via acpi video driver working, but is not
>>>>>> perfect. Driver can be used to change brightness (but
>>>>>> only some levels, probably this depends on acpi/DSDT
>>>>>> tables), but cannot be used to retrieve current
>>>>>> brightness (when BIOS/SMI change brightness acpi driver
>>>>>> report old incorrect value). So I prefer dell-laptop
>>>>>> driver instead acpi video.
>>>>>>
>>>>>> Method 3) working even with 3.17-rc6 kernel but because
>>>>>> that backlight device exported by i915 is marked as raw,
>>>>>> desktop programs prefer to use other devices.
>>>>>>
>>>>>> Moreover it looks like that methods 1) 2) and 4) just
>>>>>> forward request to method 3). So in any cased brightness
>>>>>> is changed by i915 drm driver.
>>>>>>
>>>>>> I'm not sure (correct me if I'm wrong!) but I think that
>>>>>> intel i915 drm driver accept changes (file
>>>>>> intel_opregion.c) only if acpi function
>>>>>> acpi_video_verify_backlight_support() returns true.
>>>>>>
>>>>>> Function acpi_video_verify_backlight_support() returns
>>>>>> true iff: function acpi_video_backlight_support()
>>>>>> returns true AND at least one of these functions
>>>>>> returns false: acpi_osi_is_win8()
>>>>>> acpi_video_use_native_backlight()
>>>>>> backlight_device_registered(BACKLIGHT_RAW)
>>>>>>
>>>>>> On my notebook acpi_osi_is_win8() returns true (as is
>>>>>> win8 compliant),
>>>>>> backlight_device_registered(BACKLIGHT_RAW) returns true
>>>>>> as I'm using intel i915 drm driver with raw backlight
>>>>>> device and acpi_video_use_native_backlight() returns
>>>>>> true/false depending on
>>>>>> "video.use_native_backlight" kernel param. Default is
>>>>>> true.
>>>>>>
>>>>>> So if I want to have working acpi video driver with
>>>>>> display brightness support I need to boot kernel with
>>>>>> param: "video.use_native_backlight=0". I tested it with
>>>>>> kernel 3.17-rc6 and this param really enabled display
>>>>>> brightness support via acpi video driver -- which is
>>>>>> good.
>>>>>>
>>>>>> Driver dell-laptop creating backligh device for
>>>>>> brightness control only if
>>>>>> acpi_video_backlight_support() returns false. There is
>>>>>> complicated condition for it and when kernel is booted
>>>>>> with "video.use_native_backlight=0" that function
>>>>>> returns true.
>>>>>>
>>>>>> So conclusion is: With current code in kernel 3.17-rc6
>>>>>> it is not possible to control brightness of display
>>>>>> with native driver dell-laptop on Dell Latitude E6440
>>>>>> (and probably on others too)!!!
>>>>>>
>>>>>> And Because laptop is win8 compliant and you create
>>>>>> decision to use native driver (instead acpi one) it is
>>>>>> not possible to control display brightness without
>>>>>> tweeks in kernel cmdline.
>>>>>>
>>>>>> As I wrote I would rather to use native dell-laptop
>>>>>> driver for controlling brightness, but it is not
>>>>>> possible.
>>>>>>
>>>>>> So how to solve this problem?
>>>>>>
>>>>>> Quick solution would be to set use_native_backlight
>>>>>> false for some Dell laptops which means, that acpi
>>>>>> video will be used and in this case intel i915 driver
>>>>>> will *not* drop backlight change request.
>>>>>>
>>>>>> Another solution could be to disable check in
>>>>>> dell_laptop driver and add use_native_backlight=0 to
>>>>>> hooks. But this create two backlight interfaces (which
>>>>>> is not good), but only way (for now) how to make
>>>>>> dell_laptop working again.
>>>>>>
>>>>>> Better and maybe only one proper solution would be to
>>>>>> teach intel drm i915 driver to not drop backlight change
>>>>>> request for Dell laptops (or all??). (This allows to
>>>>>> work both acpi video and dell_laptop drivers without
>>>>>> any change and with *any* value in param
>>>>>> use_native_backlight). I think that problematic code is
>>>>>> in function asle_set_backlight() in file
>>>>>> intel_opregion.c (but I'm not sure). My idea is that
>>>>>> "drop" event function it is caused by this commit
>>>>>> 0b9f7d93ca6109048a4eb06332b666b6e29df4fe (but I'm not
>>>>>> sure).
>>>>>>
>>>>>> At least something must be done as I think that I'm not
>>>>>> only one who has Dell laptop and brightness
>>>>>> configuration is really important...
>>>>>
>>>>> I don't understand your problem, the kernel is selecting
>>>>> the i915 backlight driver, making that the only one
>>>>> available to userspace, so the one problem you state with
>>>>> the i915 driver, that it is "raw" is not an issue, as
>>>>> userspace will pick it when it is the only one.
>>>>
>>>> It is not only one.
>>>
>>> Are you sure, if you do not specify any commandline
>>> parameters, then neither dell-laptop nor acpi-video should
>>> register a backlight interface.
>>>
>>> dell-laptop.c has:
>>>
>>> #ifdef CONFIG_ACPI
>>>
>>> /* In the event of an ACPI backlight being
>>> available,
>>>
>>> don't * register the platform controller.
>>>
>>> */
>>>
>>> if (acpi_video_backlight_support())
>>>
>>> return 0;
>>>
>>> #endif
>>>
>>> And acpi_video_backlight_support() will (normally) return
>>> true on acpi-backlight capable systems independent of
>>> use_native_backlight.
>>>
>>> And drivers/acpi/video.c has this:
>>> /* no warning message if acpi_backlight=vendor or a
>>>
>>> quirk is used */ if (!acpi_video_verify_backlight_support())
>>>
>>> return;
>>>
>>> ...
>>>
>>> bool acpi_video_verify_backlight_support(void)
>>> {
>>>
>>> if (acpi_osi_is_win8() &&
>>>
>>> acpi_video_use_native_backlight() &&
>>> backlight_device_registered(BACKLIGHT_RAW)) return false;
>>>
>>> return acpi_video_backlight_support();
>>>
>>> }
>>>
>>> So unlike the check in dell-laptop this one does depend on
>>> the use_native_backlight setting.
>>
>> It depends (see my previous mail). Here is code:
>>
>> static bool acpi_video_use_native_backlight(void)
>> {
>> if (use_native_backlight_param != -1)
>> return use_native_backlight_param;
>> else
>> return use_native_backlight_dmi;
>> }

Not sure what you're trying to say here, the default for
this is 1, so if you don't specify anything, then this:

bool acpi_video_verify_backlight_support(void)
{
if (acpi_osi_is_win8() && acpi_video_use_native_backlight() &&
backlight_device_registered(BACKLIGHT_RAW))
return false;
return acpi_video_backlight_support();
}

Will return false, and you won't get an acpi_video0 backlight interface,
only the intel_backlight one, and everything should just work
(except for the turning off on low settings).

Have you tried not using any kernel commandline options? What happens?

>>
>>> I've just checked 3.17 on my E6430 and there this works as
>>> it should, I only get the intel_backlight in
>>> /sys/class/backlight
>>>
>>>> Also dell-laptop (or acpi video) backlight
>>>> interface is created (depends on use_native_backlight
>>>> param). And userspace will pick dell-laptop (or acpi
>>>> video) to use (which cannot change brightness).
>>>>
>>>>> Why would you want to use dell-laptop despite the i915
>>>>> driver working fine ?
>>>>
>>>> i915 working only if I compile kernel without acpi video
>>>> dell- laptop support (distributions compile kernel with
>>>> these drivers) and i915 is not good for usage. First it
>>>> provides more then thousand brightness levels and lot of
>>>> (with low numbers) completely turn display off. And if
>>>> userspace map these thousand levels into 5-10 levels (as
>>>> nobody want to press brightness key up/down 1000x) two
>>>> lowest levels cause display off.
>>>
>>> More and more laptops will only have working backlight
>>> control at all when using i915, so userspace will need to
>>> learn to better deal with backlight controls with these
>>> ranges. And low pwm levels turning the backlight of is
>>> normal for raw interfaces, if userspace does not want this,
>>> then they should not go so low.
>>
>> So then kernel should report which low levels turn backlight
>> off so userspace will know which levels should avoid. But
>> this is not implemented yet.
>>
>>> I suggest that you file a bug against your desktop
>>> environment that it is not using the backlight controls in
>>> an optimal manner, from the kernel pov everything is
>>> working fine.
>>
>> Once I will know which levels should not DE use I can report
>> bug.
>>
>>>> With acpi
>>>> video and dell-laptop driver levels are mapped into small
>>>> level space in perfect way. So this is reason I want to
>>>> use dell-laptop for controlling brightness.
>>>
>>> If you want to use dell-laptop, specify
>>> acpi_backlight=vendor on the kernel commandline, that will
>>> give you dell_laptop + intel_backlight as backlight
>>> interfaces, and userspace should prefer dell_laptop.
>>
>> With acpi_backlight=vendor dell-laptop is not working, see my
>> previous mail. In this case intel i915 drm driver ignore bios
>> events for changing brightness. And userspace prefer to use
>> dell_laptop which do nothing!
>>
>
> Ok, that problematic commit is:
>
> ACPI / i915: ignore firmware requests for backlight change
> 0b9f7d93ca6109048a4eb06332b666b6e29df4fe
>
> When I reverted it acpi_backlight=vendor started working again
> (via dell_laptop). Without reverting that commit dell_laptop
> simply do nothing.
>
> Tested and on my laptop Dell Latitude E6440 driver dell_laptop
> does not work with above commit.

Hmm, interesting, so when dell-laptop registers and makes a few
calls using the dell-laptop acpi interface, then you either
stop getting key press events through the acpi-video-bus, or
dell-laptop is just a shim around the i915 interface with the
firmware calling into itself on these models. Given that dell-laptop
is ancient, the shim story is not that far fetched.

Do you still get an on screen display showing the brightness when
using a kernel without this patch + acpi_backlight=vendor ?

Regards,

Hans
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/