[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