AMD-GFX Archive on lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 7.1.y] drm/amd/display: Exit idle optimizations before programming
       [not found] <2026080547-scoff-that-5ce1@gregkh>
@ 2026-08-05 16:33 ` sunpeng.li
  2026-08-06 11:36   ` Sasha Levin
  2026-08-07 11:45   ` Sasha Levin
  0 siblings, 2 replies; 6+ messages in thread
From: sunpeng.li @ 2026-08-05 16:33 UTC (permalink / raw)
  To: stable; +Cc: amd-gfx, Leo Li, David Weber, Mario Limonciello (AMD),
	Alex Deucher

From: Leo Li <sunpeng.li@amd.com>

[Why]

We need to exit PSR/IPS before programming. Before calling DC for
programming in amdgpu_dm_commit_planes(), there's a
vblank_control_workqueue flush. This waits for IPS and PSR exit. (See
drm_vblank_on/off() > amdgpu_dm_crtc_set_vblank() --queue_work()->
amdgpu_dm_crtc_vblank_control_worker())

Prior to the tagged "Fixes:" change, drm_vblank_get() was called before
the workqueue flush. This ordering ensures that PSR exit occurred before
programming. After the "Fixes:" change, drm_vblank_get() is called after
the workqueue flush, leading to programming while idle optimizations are
still active. This can lead to incorrect flip_pending detection used by
vblank event delivery.

[How]

Split the vblank_get() component of `dm_arm_vblank_event()` into
`dm_arm_vblank_event_pre_programming()`, which is called before
programming. Call it before the vblank_control_workqueue flush.

Includes a drive-by cleanup of prepare_flip_isr(): the only caller is
dm_arm_vblank_event() and it's simple enough to roll-in.

v2: Fix checkpatch formatting warning on
    drm_arm_vblank_event_pre_programming() arg alignment.

Fixes: 48ab86360af1 ("drm/amd/display: check GRPH_FLIP status before sending event")
Cc: stable@vger.kernel.org
Link: https://gitlab.freedesktop.org/drm/amd/-/work_items/4141#note_3583205
Link: https://gitlab.freedesktop.org/drm/amd/-/work_items/5527
Assisted-by: Codex:gpt-5.6-sol
Assisted-by: Claude:opus-5
Suggested-by: David Weber <weber.aulendorf@gmail.com>
Signed-off-by: Leo Li <sunpeng.li@amd.com>
Reviewed-by: Mario Limonciello (AMD) <superm1@kernel.org>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
(cherry picked from commit 05984e29520a28c27f5a2388742c957a6a87ee7a)
(cherry picked from commit 8419331e64d92a8de5fc4feef0e305f201fb8b33)
---
 .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 78 +++++++++++--------
 1 file changed, 46 insertions(+), 32 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 11affddbb2650..40d82a3eeec05 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
@@ -9656,25 +9656,6 @@ static void remove_stream(struct amdgpu_device *adev,
 	acrtc->enabled = false;
 }
 
-static void prepare_flip_isr(struct amdgpu_crtc *acrtc)
-{
-
-	assert_spin_locked(&acrtc->base.dev->event_lock);
-	WARN_ON(acrtc->event);
-
-	acrtc->event = acrtc->base.state->event;
-
-	/* Set the flip status */
-	acrtc->pflip_status = AMDGPU_FLIP_SUBMITTED;
-
-	/* Mark this event as consumed */
-	acrtc->base.state->event = NULL;
-
-	drm_dbg_state(acrtc->base.dev,
-		      "crtc:%d, pflip_stat:AMDGPU_FLIP_SUBMITTED\n",
-		      acrtc->crtc_id);
-}
-
 static void update_freesync_state_on_stream(
 	struct amdgpu_display_manager *dm,
 	struct dm_crtc_state *new_crtc_state,
@@ -10023,17 +10004,47 @@ static void dm_arm_vblank_event(struct amdgpu_crtc *acrtc,
 		return;
 
 	if (pflip_update) {
-		drm_crtc_vblank_get(&acrtc->base);
 		WARN_ON(acrtc->pflip_status != AMDGPU_FLIP_NONE);
-		/* Arm flip completion handling and event delivery after programming. */
-		prepare_flip_isr(acrtc);
+		WARN_ON(acrtc->event);
+
+		acrtc->pflip_status = AMDGPU_FLIP_SUBMITTED;
+		acrtc->event = acrtc->base.state->event;
+		acrtc->base.state->event = NULL;
+
+		drm_dbg_state(acrtc->base.dev,
+			      "crtc:%d, pflip_stat:AMDGPU_FLIP_SUBMITTED\n",
+			      acrtc->crtc_id);
 	} else if (cursor_update) {
-		drm_crtc_vblank_get(&acrtc->base);
 		acrtc->event = acrtc->base.state->event;
 		acrtc->base.state->event = NULL;
 	}
 }
 
+/**
+ * dm_arm_vblank_event_pre_programming - Prepare for programming
+ * @acrtc: The amdgpu CRTC to prepare
+ * @acrtc_state: The new CRTC state
+ * @pflip_update: Whether a page flip is being programmed
+ * @cursor_update: Whether a cursor update is being programmed
+ *
+ * Grab a reference on the vblank counter if a page flip or cursor update is to
+ * be programmed. Do this before programming so the HW is not in any
+ * idle-optimized state (such as PSR).
+ */
+static void dm_arm_vblank_event_pre_programming(struct amdgpu_crtc *acrtc,
+						struct dm_crtc_state *acrtc_state,
+						bool pflip_update,
+						bool cursor_update)
+{
+	assert_spin_locked(&acrtc->base.dev->event_lock);
+
+	if (!acrtc->base.state->event || acrtc_state->active_planes == 0)
+		return;
+
+	if (pflip_update || cursor_update)
+		drm_crtc_vblank_get(&acrtc->base);
+}
+
 static void amdgpu_dm_commit_planes(struct drm_atomic_state *state,
 				    struct drm_device *dev,
 				    struct amdgpu_display_manager *dm,
@@ -10301,16 +10312,19 @@ static void amdgpu_dm_commit_planes(struct drm_atomic_state *state,
 		}
 	}
 
-	/*
-	 * DCE depends on a combination of GRPH_FLIP, VLINE0, and VUPDATE for
-	 * event delivery. Only GRPH_FLIP handler can send pflip events, and it
-	 * only fires if HW latched to the flip. Maintain legacy behavior by
-	 * arming event before programming.
-	 */
-	if (amdgpu_ip_version(dm->adev, DCE_HWIP, 0) == 0) {
-		scoped_guard(spinlock_irqsave, &pcrtc->dev->event_lock) {
+	scoped_guard(spinlock_irqsave, &pcrtc->dev->event_lock) {
+		dm_arm_vblank_event_pre_programming(acrtc_attach, acrtc_state,
+						    pflip_present,
+						    cursor_update);
+		/*
+		 * DCE depends on a combination of GRPH_FLIP, VLINE0, and
+		 * VUPDATE for event delivery. Only GRPH_FLIP handler can send
+		 * pflip events, and it only fires if HW latched to the flip.
+		 * Maintain legacy behavior by arming event before programming.
+		 */
+		if (amdgpu_ip_version(dm->adev, DCE_HWIP, 0) == 0) {
 			dm_arm_vblank_event(acrtc_attach, acrtc_state,
-					pflip_present, cursor_update);
+					    pflip_present, cursor_update);
 		}
 	}
 
-- 
2.54.0


^ permalink raw reply related	[flat|nested] 6+ messages in thread

* Re: [PATCH 7.1.y] drm/amd/display: Exit idle optimizations before programming
  2026-08-05 16:33 ` [PATCH 7.1.y] drm/amd/display: Exit idle optimizations before programming sunpeng.li
@ 2026-08-06 11:36   ` Sasha Levin
  2026-08-06 13:42     ` Leo Li
  2026-08-07 11:45   ` Sasha Levin
  1 sibling, 1 reply; 6+ messages in thread
From: Sasha Levin @ 2026-08-06 11:36 UTC (permalink / raw)
  To: stable
  Cc: Sasha Levin, amd-gfx, Leo Li, David Weber,
	Mario Limonciello (AMD), Alex Deucher

This doesn't apply cleanly to 7.1?

-- 
Thanks,
Sasha

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH 7.1.y] drm/amd/display: Exit idle optimizations before programming
  2026-08-06 11:36   ` Sasha Levin
@ 2026-08-06 13:42     ` Leo Li
  2026-08-07  9:20       ` Greg KH
  0 siblings, 1 reply; 6+ messages in thread
From: Leo Li @ 2026-08-06 13:42 UTC (permalink / raw)
  To: Sasha Levin, stable
  Cc: amd-gfx, David Weber, Mario Limonciello (AMD), Alex Deucher



On 2026-08-06 07:36, Sasha Levin wrote:
> This doesn't apply cleanly to 7.1?
> 

Hi Sasha,

Looks like the tagged "Fixes:" hasn't landed in 7.1 yet. This patch depends on it.
See the 7.1 backport of it here: https://lore.kernel.org/stable/3956c589-2fbb-49af-b0bb-8aeff0cd56db@amd.com/

Thanks,
Leo


^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH 7.1.y] drm/amd/display: Exit idle optimizations before programming
  2026-08-06 13:42     ` Leo Li
@ 2026-08-07  9:20       ` Greg KH
  2026-08-07 13:36         ` Leo Li
  0 siblings, 1 reply; 6+ messages in thread
From: Greg KH @ 2026-08-07  9:20 UTC (permalink / raw)
  To: Leo Li
  Cc: Sasha Levin, stable, amd-gfx, David Weber,
	Mario Limonciello (AMD), Alex Deucher

On Thu, Aug 06, 2026 at 09:42:42AM -0400, Leo Li wrote:
> 
> 
> On 2026-08-06 07:36, Sasha Levin wrote:
> > This doesn't apply cleanly to 7.1?
> > 
> 
> Hi Sasha,
> 
> Looks like the tagged "Fixes:" hasn't landed in 7.1 yet. This patch depends on it.
> See the 7.1 backport of it here: https://lore.kernel.org/stable/3956c589-2fbb-49af-b0bb-8aeff0cd56db@amd.com/

So what are we supposed to do here?

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH 7.1.y] drm/amd/display: Exit idle optimizations before programming
  2026-08-05 16:33 ` [PATCH 7.1.y] drm/amd/display: Exit idle optimizations before programming sunpeng.li
  2026-08-06 11:36   ` Sasha Levin
@ 2026-08-07 11:45   ` Sasha Levin
  1 sibling, 0 replies; 6+ messages in thread
From: Sasha Levin @ 2026-08-07 11:45 UTC (permalink / raw)
  To: stable
  Cc: Sasha Levin, amd-gfx, Leo Li, David Weber,
	Mario Limonciello (AMD), Alex Deucher

On Wed, Aug 05, 2026 at 12:33:14PM -0400, sunpeng.li@amd.com wrote:
> Prior to the tagged "Fixes:" change, drm_vblank_get() was called before
> the workqueue flush. This ordering ensures that PSR exit occurred before
> programming. After the "Fixes:" change, drm_vblank_get() is called after
> the workqueue flush, leading to programming while idle optimizations are
> still active.

Queued for 7.1 and 6.18, with the "check GRPH_FLIP status before sending
event" prerequisite applied ahead of it on both trees, thanks.

-- 
Thanks,
Sasha

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH 7.1.y] drm/amd/display: Exit idle optimizations before programming
  2026-08-07  9:20       ` Greg KH
@ 2026-08-07 13:36         ` Leo Li
  0 siblings, 0 replies; 6+ messages in thread
From: Leo Li @ 2026-08-07 13:36 UTC (permalink / raw)
  To: Greg KH
  Cc: Sasha Levin, stable, amd-gfx, David Weber,
	Mario Limonciello (AMD), Alex Deucher



On 2026-08-07 05:20, Greg KH wrote:
> On Thu, Aug 06, 2026 at 09:42:42AM -0400, Leo Li wrote:
>>
>>
>> On 2026-08-06 07:36, Sasha Levin wrote:
>>> This doesn't apply cleanly to 7.1?
>>>
>>
>> Hi Sasha,
>>
>> Looks like the tagged "Fixes:" hasn't landed in 7.1 yet. This patch depends on it.
>> See the 7.1 backport of it here: https://lore.kernel.org/stable/3956c589-2fbb-49af-b0bb-8aeff0cd56db@amd.com/
> 
> So what are we supposed to do here?

Hi Greg,

The two remaining fixes for 7.1 and 6.18 are this patch, and

[PATCH 7.1.y] drm/amd/display: check GRPH_FLIP status before sending event
    https://lore.kernel.org/stable/20260729173742.950965-2-sunpeng.li@amd.com/

[PATCH 6.18.y] drm/amd/display: check GRPH_FLIP status before sending event
    https://lore.kernel.org/stable/20260729175748.981393-1-sunpeng.li@amd.com/

Looks like Sasha queued them just now:
https://lore.kernel.org/stable/20260806234000.stable-0001@kernel.org/

Thanks, and sorry for the confusion!
Leo


^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2026-08-10  6:42 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
     [not found] <2026080547-scoff-that-5ce1@gregkh>
2026-08-05 16:33 ` [PATCH 7.1.y] drm/amd/display: Exit idle optimizations before programming sunpeng.li
2026-08-06 11:36   ` Sasha Levin
2026-08-06 13:42     ` Leo Li
2026-08-07  9:20       ` Greg KH
2026-08-07 13:36         ` Leo Li
2026-08-07 11:45   ` Sasha Levin

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox