]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
drm/amd/display: Lock DC and exit IPS when changing backlight
authorLeo Li <sunpeng.li@amd.com>
Tue, 20 Aug 2024 18:34:15 +0000 (14:34 -0400)
committerAlex Deucher <alexander.deucher@amd.com>
Mon, 2 Sep 2024 17:12:13 +0000 (13:12 -0400)
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: Aurabindo Pillai <aurabindo.pillai@amd.com>
Reviewed-by: Roman Li <roman.li@amd.com>
Signed-off-by: Leo Li <sunpeng.li@amd.com>
Signed-off-by: Hamza Mahfooz <hamza.mahfooz@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
(cherry picked from commit 988fe2862635c1b1b40e41c85c24db44ab337c13)
Cc: stable@vger.kernel.org # 6.10+
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c

index e6cea5b9bdb35d215a44ea22eae55484ed831709..5942fc4e1c8674edc0a03615ed99b7489085c5ab 100644 (file)
@@ -4516,7 +4516,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];
@@ -4529,6 +4529,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);
@@ -4540,6 +4546,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;
 }