[RFC PATCH RESEND] drm/amd/display: Add back missing backlight level rounding

Li, Sun peng (Leo) Sunpeng.Li at amd.com
Thu Oct 17 17:25:57 UTC 2019


Thanks for the detailed notes! See reply inline.

On 2019-10-15 4:03 p.m., Lukáš Krejčí wrote:
> [Why]
> Having the rounding of the backlight value restored to the way it was
> seemingly gets rid of backlight flickering on certain Stoney Ridge
> laptops.
> 
> [How]
> Rescale the backlight level between min and max input signal value and
> round it to a number between 0x0 and 0xFF. Then, use the rounding mode
> that was previously in driver_set_backlight_level() and
> dmcu_set_backlight_level(), i.e. rescale the backlight level between 0x0
> and 0x1000 by multiplying it by 0x101 and use the most significant bit
> of the fraction (or in this case the 8th bit of the value because it's
> the same thing, e.g. C3 * 0x101 = 0xC3C3 and C3 * 0x10101 = 0xC3C3C3) to
> round it.
> 
> Fixes: 262485a50fd4 ("drm/amd/display: Expand dc to use 16.16 bit backlight")
> Bugzilla: https://bugzilla.kernel.org/show_bug.cgi?id=204957
> Signed-off-by: Lukáš Krejčí <lskrejci at gmail.com>
> ---
> 
> Notes:
>     Bug:
>     - Can be reproduced on HP 15-rb020nc (Stoney Ridge R2 E2-9000e APU) and
>       Acer Aspire 3 A315-21G-91JL (Stoney Ridge R3 A4-9120 APU).
>     
>     - For me, the bug is inconsistent - it does not happen on every boot,
>       but if it does happen, it's usually within three minutes after bootup.
>     
>     - It concerns the backlight. That means it can be reproduced on the
>       framebuffer console.
>     
>     - Reproduces on Arch Linux (custom built) live CD, linux kernel v5.3.2
>       and Ubuntu 19.04, kernel-ppa/mainline v5.0.0-rc1, v5.0.0, v5.3.2, v5.3.4,
>       v5.4-rc2.
>     
>     - Can not be reproduced on kernel v5.3.4 with this patch applied or on
>       v4.20.0, 4.20.17, 4.19.75 (this bug is a regression).
>     
>     - The other person that reproduced the issue (see the Bugzilla link
>       above) confirmed that the patch works for them too.
>     
>     Patch:
>     - Is the comment modified by this commit correct? Both
>       driver_set_backlight_level() and dmcu_set_backlight_level() check the
>       17th bit of `brightness` aka `backlight_pwm_u16_16`, but
>       262485a50fd4532a8d71165190adc7a0a19bcc9e ("drm/amd/display: Expand dc
>       to use 16.16 bit backlight") specifically mentions 0xFFFF as the max
>       backlight value>     
>     - use_smooth_brightness is false (no DMCU firmware available) on my
>       laptop, so the other code path (dmcu_set_backlight_level()) is
>       untested.
>     
>     - I'm not sure why the rounding fixes the issue and whether this
>       function is the right place to add back the rounding (and whether it
>       even is the right way to solve the issue), so that's why this patch is
>       RFC.

We've seen some similar issues when fractional duty cycles are enabled for backlight pwm.
I attached a hack to the bugzilla ticket that disables it, please give that patch a shot
first. I'd rather not change this calculation for all panels if the flickering issue is
only a quirk for some.

Thanks,
Leo

> 
>  .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c   | 17 +++++++++++------
>  1 file changed, 11 insertions(+), 6 deletions(-)
> 
> diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
> index a52f0b13a2c8..af9a5f46b671 100644
> --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
> +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
> @@ -2083,17 +2083,22 @@ static int amdgpu_dm_backlight_update_status(struct backlight_device *bd)
>  	 * The brightness input is in the range 0-255
>  	 * It needs to be rescaled to be between the
>  	 * requested min and max input signal
> -	 *
> -	 * It also needs to be scaled up by 0x101 to
> -	 * match the DC interface which has a range of
> -	 * 0 to 0xffff
>  	 */
>  	brightness =
>  		brightness
> -		* 0x101
> +		* 0x100
>  		* (caps.max_input_signal - caps.min_input_signal)
>  		/ AMDGPU_MAX_BL_LEVEL
> -		+ caps.min_input_signal * 0x101;
> +		+ caps.min_input_signal * 0x100;
> +
> +	brightness = (brightness >> 8) + ((brightness >> 7) & 1);
> +	/*
> +	 * It also needs to be scaled up by 0x101 and
> +	 * rounded off to match the DC interface which
> +	 * has a range of 0 to 0x10000
> +	 */
> +	brightness *= 0x101;
> +	brightness += (brightness >> 7) & 1;
>  
>  	if (dc_link_set_backlight_level(dm->backlight_link,
>  			brightness, 0))
> 


More information about the dri-devel mailing list