| From 4052287a75eb3fc0f487fcc5f768a38bede455c8 Mon Sep 17 00:00:00 2001 |
| From: Shirish S <shirish.s@amd.com> |
| Date: Fri, 11 Mar 2022 20:30:17 +0530 |
| Subject: amd/display: set backlight only if required |
| |
| From: Shirish S <shirish.s@amd.com> |
| |
| commit 4052287a75eb3fc0f487fcc5f768a38bede455c8 upstream. |
| |
| [Why] |
| comparing pwm bl values (coverted) with user brightness(converted) |
| levels in commit_tail leads to continuous setting of backlight via dmub |
| as they don't to match. |
| This leads overdrive in queuing of commands to DMCU that sometimes lead |
| to depending on load on DMCU fw: |
| |
| "[drm:dc_dmub_srv_wait_idle] *ERROR* Error waiting for DMUB idle: status=3" |
| |
| [How] |
| Store last successfully set backlight value and compare with it instead |
| of pwm reads which is not what we should compare with. |
| |
| Signed-off-by: Shirish S <shirish.s@amd.com> |
| Reviewed-by: Harry Wentland <harry.wentland@amd.com> |
| Signed-off-by: Alex Deucher <alexander.deucher@amd.com> |
| Cc: stable@vger.kernel.org |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 7 ++++--- |
| drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h | 6 ++++++ |
| 2 files changed, 10 insertions(+), 3 deletions(-) |
| |
| --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c |
| +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c |
| @@ -3924,7 +3924,7 @@ static u32 convert_brightness_to_user(co |
| max - min); |
| } |
| |
| -static int amdgpu_dm_backlight_set_level(struct amdgpu_display_manager *dm, |
| +static void amdgpu_dm_backlight_set_level(struct amdgpu_display_manager *dm, |
| int bl_idx, |
| u32 user_brightness) |
| { |
| @@ -3955,7 +3955,8 @@ static int amdgpu_dm_backlight_set_level |
| DRM_DEBUG("DM: Failed to update backlight on eDP[%d]\n", bl_idx); |
| } |
| |
| - return rc ? 0 : 1; |
| + if (rc) |
| + dm->actual_brightness[bl_idx] = user_brightness; |
| } |
| |
| static int amdgpu_dm_backlight_update_status(struct backlight_device *bd) |
| @@ -9804,7 +9805,7 @@ static void amdgpu_dm_atomic_commit_tail |
| /* restore the backlight level */ |
| for (i = 0; i < dm->num_of_edps; i++) { |
| if (dm->backlight_dev[i] && |
| - (amdgpu_dm_backlight_get_level(dm, i) != dm->brightness[i])) |
| + (dm->actual_brightness[i] != dm->brightness[i])) |
| amdgpu_dm_backlight_set_level(dm, i, dm->brightness[i]); |
| } |
| #endif |
| --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h |
| +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h |
| @@ -540,6 +540,12 @@ struct amdgpu_display_manager { |
| * cached backlight values. |
| */ |
| u32 brightness[AMDGPU_DM_MAX_NUM_EDP]; |
| + /** |
| + * @actual_brightness: |
| + * |
| + * last successfully applied backlight values. |
| + */ |
| + u32 actual_brightness[AMDGPU_DM_MAX_NUM_EDP]; |
| }; |
| |
| enum dsc_clock_force_state { |