| From 6b7addaf573fcfd3711bcb41fbe33b23597274c9 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Thu, 8 Feb 2024 16:23:29 -0500 |
| Subject: drm/amdgpu: make damage clips support configurable |
| |
| From: Hamza Mahfooz <hamza.mahfooz@amd.com> |
| |
| [ Upstream commit fc184dbe9fd99ad2dfb197b6fe18768bae1774b1 ] |
| |
| We have observed that there are quite a number of PSR-SU panels on the |
| market that are unable to keep up with what user space throws at them, |
| resulting in hangs and random black screens. So, make damage clips |
| support configurable and disable it by default for PSR-SU displays. |
| |
| Cc: stable@vger.kernel.org |
| Reviewed-by: Mario Limonciello <mario.limonciello@amd.com> |
| Signed-off-by: Hamza Mahfooz <hamza.mahfooz@amd.com> |
| Signed-off-by: Alex Deucher <alexander.deucher@amd.com> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/gpu/drm/amd/amdgpu/amdgpu.h | 1 + |
| drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c | 13 +++++++++++++ |
| drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 7 +++++++ |
| 3 files changed, 21 insertions(+) |
| |
| diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu.h b/drivers/gpu/drm/amd/amdgpu/amdgpu.h |
| index 31d4b5a2c5e83..13c62a26aa19c 100644 |
| --- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h |
| +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h |
| @@ -198,6 +198,7 @@ extern uint amdgpu_dc_debug_mask; |
| extern uint amdgpu_dc_visual_confirm; |
| extern uint amdgpu_dm_abm_level; |
| extern int amdgpu_backlight; |
| +extern int amdgpu_damage_clips; |
| extern struct amdgpu_mgpu_info mgpu_info; |
| extern int amdgpu_ras_enable; |
| extern uint amdgpu_ras_mask; |
| diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c |
| index 10c4a8cfa18a0..855ab596323c7 100644 |
| --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c |
| +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c |
| @@ -209,6 +209,7 @@ int amdgpu_umsch_mm; |
| int amdgpu_seamless = -1; /* auto */ |
| uint amdgpu_debug_mask; |
| int amdgpu_agp = -1; /* auto */ |
| +int amdgpu_damage_clips = -1; /* auto */ |
| |
| static void amdgpu_drv_delayed_reset_work_handler(struct work_struct *work); |
| |
| @@ -857,6 +858,18 @@ int amdgpu_backlight = -1; |
| MODULE_PARM_DESC(backlight, "Backlight control (0 = pwm, 1 = aux, -1 auto (default))"); |
| module_param_named(backlight, amdgpu_backlight, bint, 0444); |
| |
| +/** |
| + * DOC: damageclips (int) |
| + * Enable or disable damage clips support. If damage clips support is disabled, |
| + * we will force full frame updates, irrespective of what user space sends to |
| + * us. |
| + * |
| + * Defaults to -1 (where it is enabled unless a PSR-SU display is detected). |
| + */ |
| +MODULE_PARM_DESC(damageclips, |
| + "Damage clips support (0 = disable, 1 = enable, -1 auto (default))"); |
| +module_param_named(damageclips, amdgpu_damage_clips, int, 0444); |
| + |
| /** |
| * DOC: tmz (int) |
| * Trusted Memory Zone (TMZ) is a method to protect data being written |
| 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 f5dceb4eb99a3..342e41c78fb34 100644 |
| --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c |
| +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c |
| @@ -5147,6 +5147,7 @@ static void fill_dc_dirty_rects(struct drm_plane *plane, |
| struct drm_plane_state *new_plane_state, |
| struct drm_crtc_state *crtc_state, |
| struct dc_flip_addrs *flip_addrs, |
| + bool is_psr_su, |
| bool *dirty_regions_changed) |
| { |
| struct dm_crtc_state *dm_crtc_state = to_dm_crtc_state(crtc_state); |
| @@ -5171,6 +5172,10 @@ static void fill_dc_dirty_rects(struct drm_plane *plane, |
| num_clips = drm_plane_get_damage_clips_count(new_plane_state); |
| clips = drm_plane_get_damage_clips(new_plane_state); |
| |
| + if (num_clips && (!amdgpu_damage_clips || (amdgpu_damage_clips < 0 && |
| + is_psr_su))) |
| + goto ffu; |
| + |
| if (!dm_crtc_state->mpo_requested) { |
| if (!num_clips || num_clips > DC_MAX_DIRTY_RECTS) |
| goto ffu; |
| @@ -8216,6 +8221,8 @@ static void amdgpu_dm_commit_planes(struct drm_atomic_state *state, |
| fill_dc_dirty_rects(plane, old_plane_state, |
| new_plane_state, new_crtc_state, |
| &bundle->flip_addrs[planes_count], |
| + acrtc_state->stream->link->psr_settings.psr_version == |
| + DC_PSR_VERSION_SU_1, |
| &dirty_rects_changed); |
| |
| /* |
| -- |
| 2.43.0 |
| |