ABM connector property changes currently set connectors_changed on the
associated CRTC. DRM treats that flag as requiring a modeset, so each
ABM change tears down and recreates the stream and visibly blanks the
panel.
drm_atomic_get_crtc_state() already adds the affected CRTC to the
atomic state. dm_update_crtc_state() then copies the connector ABM level
to the CRTC state, allowing the commit tail to program it with the
existing stream update path.
Stop marking the CRTC as connectors_changed for ABM changes. Continue
doing so for scaling changes.
This makes runtime ABM changes practical for desktop power management,
for example when switching between AC, battery and low-battery
profiles.
Tested on a Phoenix1 system with DCN 3.1.4 and an internal eDP panel.
Changing ABM through the panel_power_savings sysfs property was
confirmed visually and by measuring the resulting change in system
power consumption. It no longer caused the black-screen flicker from
the forced modeset.
Fixes: c5892a102182 ("drm/amd/display: Fix dmesg warning from setting abm
level")
Assisted-by: Codex:gpt-5.6-sol
Signed-off-by: David Weber <[email protected]>
---
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 5 ++---
1 file changed, 2 insertions(+), 3 deletions(-)
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 13101a6be437..40099bff153a 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
@@ -13168,7 +13168,7 @@ static int amdgpu_dm_atomic_check(struct drm_device
*dev,
struct dm_connector_state *dm_old_con_state =
to_dm_connector_state(old_con_state);
struct dm_connector_state *dm_new_con_state =
to_dm_connector_state(new_con_state);
- /* Skip connectors that are disabled or part of modeset
already. */
+ /* Skip connectors without a CRTC. */
if (!new_con_state->crtc)
continue;
@@ -13179,8 +13179,7 @@ static int amdgpu_dm_atomic_check(struct drm_device
*dev,
goto fail;
}
- if (dm_old_con_state->abm_level != dm_new_con_state->abm_level
||
- dm_old_con_state->scaling != dm_new_con_state->scaling)
+ if (dm_old_con_state->scaling != dm_new_con_state->scaling)
new_crtc_state->connectors_changed = true;
}
--
2.54.0