From: "Mario Limonciello (AMD)" <[email protected]>

[WHY]
When a laptop lid is closed the connector is disabled but userspace
can still try to change brightness.  This doesn't work because the
panel is turned off. It will eventually time out, but there is a lot
of stutter along the way.

[How]
Iterate all connectors to check whether the matching one for the backlight
index is enabled.

Closes: https://gitlab.freedesktop.org/drm/amd/-/issues/4675

Cc: Mario Limonciello <[email protected]>
Cc: Alex Deucher <[email protected]>
Cc: [email protected]
Reviewed-by: Ray Wu <[email protected]>
Signed-off-by: Mario Limonciello (AMD) <[email protected]>
Signed-off-by: Alex Hung <[email protected]>
---
 drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 15 +++++++++++++++
 1 file changed, 15 insertions(+)

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 8a0555365719..424020c0756d 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
@@ -5108,6 +5108,21 @@ static void amdgpu_dm_backlight_set_level(struct 
amdgpu_display_manager *dm,
        struct dc_link *link;
        u32 brightness;
        bool rc, reallow_idle = false;
+       struct drm_connector *connector;
+
+       list_for_each_entry(connector, &dm->ddev->mode_config.connector_list, 
head) {
+               struct amdgpu_dm_connector *aconnector = 
to_amdgpu_dm_connector(connector);
+
+               if (aconnector->bl_idx != bl_idx)
+                       continue;
+
+               /* if connector is off, save the brightness for next time it's 
on */
+               if (!aconnector->base.encoder) {
+                       dm->brightness[bl_idx] = user_brightness;
+                       dm->actual_brightness[bl_idx] = 0;
+                       return;
+               }
+       }
 
        amdgpu_dm_update_backlight_caps(dm, bl_idx);
        caps = &dm->backlight_caps[bl_idx];
-- 
2.43.0

Reply via email to