Commit 8f328694 authored by Shirish S's avatar Shirish S Committed by Alex Deucher

amd/display: set backlight only if required

[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: default avatarShirish S <shirish.s@amd.com>
Reviewed-by: default avatarHarry Wentland <harry.wentland@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent 6452c544
...@@ -3973,7 +3973,7 @@ static u32 convert_brightness_to_user(const struct amdgpu_dm_backlight_caps *cap ...@@ -3973,7 +3973,7 @@ static u32 convert_brightness_to_user(const struct amdgpu_dm_backlight_caps *cap
max - min); 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, int bl_idx,
u32 user_brightness) u32 user_brightness)
{ {
...@@ -4004,7 +4004,8 @@ static int amdgpu_dm_backlight_set_level(struct amdgpu_display_manager *dm, ...@@ -4004,7 +4004,8 @@ static int amdgpu_dm_backlight_set_level(struct amdgpu_display_manager *dm,
DRM_DEBUG("DM: Failed to update backlight on eDP[%d]\n", bl_idx); 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) static int amdgpu_dm_backlight_update_status(struct backlight_device *bd)
...@@ -9948,7 +9949,7 @@ static void amdgpu_dm_atomic_commit_tail(struct drm_atomic_state *state) ...@@ -9948,7 +9949,7 @@ static void amdgpu_dm_atomic_commit_tail(struct drm_atomic_state *state)
/* restore the backlight level */ /* restore the backlight level */
for (i = 0; i < dm->num_of_edps; i++) { for (i = 0; i < dm->num_of_edps; i++) {
if (dm->backlight_dev[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]); amdgpu_dm_backlight_set_level(dm, i, dm->brightness[i]);
} }
#endif #endif
......
...@@ -540,6 +540,12 @@ struct amdgpu_display_manager { ...@@ -540,6 +540,12 @@ struct amdgpu_display_manager {
* cached backlight values. * cached backlight values.
*/ */
u32 brightness[AMDGPU_DM_MAX_NUM_EDP]; 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 { enum dsc_clock_force_state {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment