Commit 988fe286 authored by Leo Li's avatar Leo Li Committed by Alex Deucher
Browse files

drm/amd/display: Lock DC and exit IPS when changing backlight



Backlight updates require aux and/or register access. Therefore, driver
needs to disallow IPS beforehand.

So, acquire the dc lock before calling into dc to update backlight - we
should be doing this regardless of IPS. Then, while the lock is held,
disallow IPS before calling into dc, then allow IPS afterwards (if it
was previously allowed).

Reviewed-by: default avatarAurabindo Pillai <aurabindo.pillai@amd.com>
Reviewed-by: default avatarRoman Li <roman.li@amd.com>
Signed-off-by: default avatarLeo Li <sunpeng.li@amd.com>
Signed-off-by: default avatarHamza Mahfooz <hamza.mahfooz@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent c66db9e9
Loading
Loading
Loading
Loading
+12 −1
Original line number Diff line number Diff line
@@ -4536,7 +4536,7 @@ static void amdgpu_dm_backlight_set_level(struct amdgpu_display_manager *dm,
	struct amdgpu_dm_backlight_caps caps;
	struct dc_link *link;
	u32 brightness;
	bool rc;
	bool rc, reallow_idle = false;

	amdgpu_dm_update_backlight_caps(dm, bl_idx);
	caps = dm->backlight_caps[bl_idx];
@@ -4549,6 +4549,12 @@ static void amdgpu_dm_backlight_set_level(struct amdgpu_display_manager *dm,
	link = (struct dc_link *)dm->backlight_link[bl_idx];

	/* Change brightness based on AUX property */
	mutex_lock(&dm->dc_lock);
	if (dm->dc->caps.ips_support && dm->dc->ctx->dmub_srv->idle_allowed) {
		dc_allow_idle_optimizations(dm->dc, false);
		reallow_idle = true;
	}

	if (caps.aux_support) {
		rc = dc_link_set_backlight_level_nits(link, true, brightness,
						      AUX_BL_DEFAULT_TRANSITION_TIME_MS);
@@ -4560,6 +4566,11 @@ static void amdgpu_dm_backlight_set_level(struct amdgpu_display_manager *dm,
			DRM_DEBUG("DM: Failed to update backlight on eDP[%d]\n", bl_idx);
	}

	if (dm->dc->caps.ips_support && reallow_idle)
		dc_allow_idle_optimizations(dm->dc, true);

	mutex_unlock(&dm->dc_lock);

	if (rc)
		dm->actual_brightness[bl_idx] = user_brightness;
}