[Intel-gfx] [PATCH] drm/i915: expose a fixed brightness range to userspace

Jani Nikula jani.nikula at linux.intel.com
Thu Nov 20 09:57:34 CET 2014


On Wed, 19 Nov 2014, "Eoff, Ullysses A" <ullysses.a.eoff at intel.com> wrote:
> Jani,
>
> First of all, thank you for your explanation.  I was unaware of the
> motivations behind the current implementation.  You are exactly
> right that the whole reason for all this is that userspace is expecting
> actual_brightness to always match the brightness it set.
>
> I would like to point out that I never meant to suggest there was a
> "functional" bug in the driver.  And my motivations were more about
> testability via sysfs than anything else and the assumption that brightness
> was supposed to always equal actual_brightness.  I really should have
> been more explicit in pointing this out much sooner if it wasn't clear.

Maybe you missed it, but we did have a reported bug [1] which was fixed
(or worked around) by your

commit 673e7bbdb3920b62cfc6c710bea626b0a9b0f43a
Author: U. Artie Eoff <ullysses.a.eoff at intel.com>
Date:   Mon Sep 29 15:49:32 2014 -0700

    drm/i915: intel_backlight scale() math WA

and there was the same discussion about scaling problems as here. It's a
real issue, no need for regrets on your part.

[1] https://bugzilla.kernel.org/show_bug.cgi?id=85861

> Thanks for providing a link to the documentation... I wish I had been
> more diligent in looking for this in the first place.  I'm always more
> inclined to defer to the documentation.  And in light of it, I stand
> corrected.
>
> Although your new patch would likely work, I don't think it's necessary
> anymore to make brightness==actual_brightness always hold true; since
> testing for that is the incorrect thing to do in the first place (based on
> the documentation).  Nonetheless, testing brightness from userspace will
> just have to get a little more creative.

I don't think there's anything really horribly wrong with the patch, so
I'm starting to think maybe we should just apply it. I assume it would
help your scenario too. If there's still userspace out there that makes
the assumption anyway, and fails because of it, we may not even have a
choice.

Thoughts?

> Apologies for all the noise... now I'll go make some elsewhere. ;)

Oh, never mind about that.


BR,
Jani.

>
> U. Artie
>
>> -----Original Message-----
>> From: Jani Nikula [mailto:jani.nikula at linux.intel.com]
>> Sent: Wednesday, November 19, 2014 12:57 AM
>> To: Eoff, Ullysses A; Stéphane Marchesin
>> Cc: Jesse Barnes; intel-gfx at lists.freedesktop.org
>> Subject: RE: [Intel-gfx] [PATCH] drm/i915: expose a fixed brightness range to userspace
>> 
>> On Wed, 19 Nov 2014, "Eoff, Ullysses A" <ullysses.a.eoff at intel.com> wrote:
>> >> -----Original Message-----
>> >> From: Stéphane Marchesin [mailto:stephane.marchesin at gmail.com]
>> >> Sent: Tuesday, November 18, 2014 3:53 PM
>> >> To: Eoff, Ullysses A
>> >> Cc: Jani Nikula; Jesse Barnes; intel-gfx at lists.freedesktop.org
>> >> Subject: Re: [Intel-gfx] [PATCH] drm/i915: expose a fixed brightness range to userspace
>> >>
>> >> On Tue, Nov 18, 2014 at 3:18 PM, Eoff, Ullysses A
>> >> <ullysses.a.eoff at intel.com> wrote:
>> >> > Thanks Jesse for the ack.
>> >> >
>> >> > Unfortunately I just learned from Stéphane that there
>> >> > are certain devices which only support 256 levels, so this
>> >> > patch would do us no good at solving the real issue for
>> >> > such devices.
>> >> >
>> >> > Why can't we just use a dynamic 1:1 mapping as was
>> >> > suggested before?  I would vote for that instead.
>> >> >
>> >>
>> >> Right, from my (consumer's) perspective, a 1:1 mapping is simpler. But
>> >> the confusing part for me is that (as far as I can see) the current
>> >> mapping should be 1:1 (because the user and hw ranges are the same),
>> >> even though it goes through the scale logic. Is the scale() function
>> >> maybe not the identity? If it isn't, maybe we just need to make it
>> >> so...
>> >>
>> >
>> > Yes, if the user and hw ranges are the same, then there will be a
>> > 1:1 mapping, currently, and no issue.  It's the other case where
>> > the hw range is smaller than the user range we end up with
>> > brightness != actual_brightness in sysfs.  The scale logic rounds
>> > into discrete values of the ranges where multiple user values can
>> > scale to the same hw value in this case.  Right now, user range is
>> > [0..max hw] and hw range is [min_hw..max_hw].  If min_hw > 0,
>> > then we encounter the problem.  The proposal is to set the user
>> > range to [0..(hw_max - hw_min)].
>> 
>> Some things to consider.
>> 
>> Have you heard of any requirements to support changing backlight PWM
>> frequency run time? We currently don't support it, and it would require
>> a fixed range. The backlight class interface does not support changing
>> max brightness on the fly. Sure, we can implement this later if
>> required, but we now have most of what's needed for this in place.
>> 
>> The luminance of the backlight is not a linear function of the
>> brightness value set. Currently a single brightness step has a different
>> luminance change depending on the absolute value. There's been talk
>> about letting userspace fix this, but I'm not convinced the userspace
>> has any chance of abstracting the plethora of hardware out there. As it
>> happens, the ACPI opregion the driver has access to, does have a lookup
>> table for this. We could fix this in the driver, but not if we commit to
>> having 1:1 mapping.
>> 
>> Another thing to consider is that the max value we currently expose is
>> quite meaningless to the userspace. I question the point of exposing a
>> range of, say, 0..10000 when in reality you'll only get maybe 100
>> distinct levels of brightness, depending on the backlight frequency.
>> 
>> An interesting and perhaps counter intuitive detail, the higher the PWM
>> frequency, i.e. the higher the exposed max, the fewer user
>> distinguishable levels you can actually get from the backlight. This is
>> due to the rise and fall times in the backlight following the PWM
>> signal.
>> 
>> Finally, it seems to me the problem with the scaling boils down to
>> userspace expecting actual_brightness to always match the brightness it
>> set. That's the value read back from the hardware. The ABI explicitly
>> says the brightness stored in the driver may not be the actual
>> brightness [1]. I don't think there are guarantees that all hardware
>> would or could maintain the precision either. I think that's broken in
>> userspace, but we're not supposed to say such things.
>> 
>> Soo... here's an attempt to be constructive after all the whining
>> above. ;) How about this to always return the same value if the actual
>> brightness duty cycle in the hardware has not changed? Totally untested,
>> of course.
>> 
>> diff --git a/drivers/gpu/drm/i915/intel_panel.c b/drivers/gpu/drm/i915/intel_panel.c
>> index 4d63839bd9b4..8678467d5d83 100644
>> --- a/drivers/gpu/drm/i915/intel_panel.c
>> +++ b/drivers/gpu/drm/i915/intel_panel.c
>> @@ -1024,7 +1024,12 @@ static int intel_backlight_device_get_brightness(struct backlight_device *bd)
>>  	drm_modeset_lock(&dev->mode_config.connection_mutex, NULL);
>> 
>>  	hw_level = intel_panel_get_backlight(connector);
>> -	ret = scale_hw_to_user(connector, hw_level, bd->props.max_brightness);
>> +	if (hw_level == scale_user_to_hw(connector, bd->props.brightness,
>> +					 bd->props.max_brightness))
>> +		ret = bd->props.brightness;
>> +	else
>> +		ret = scale_hw_to_user(connector, hw_level,
>> +				       bd->props.max_brightness);
>> 
>>  	drm_modeset_unlock(&dev->mode_config.connection_mutex);
>>  	intel_runtime_pm_put(dev_priv);
>> 
>> 
>> BR,
>> Jani.
>> 
>> 
>> 
>> [1] http://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/tree/Documentation/ABI/stable/sysfs-class-backlight
>> 
>> 
>> --
>> Jani Nikula, Intel Open Source Technology Center

-- 
Jani Nikula, Intel Open Source Technology Center



More information about the Intel-gfx mailing list