summaryrefslogtreecommitdiff
path: root/drivers/gpu
diff options
context:
space:
mode:
authorJouni Högander <jouni.hogander@intel.com>2026-11-02 12:00:49 +0200
committerJoonas Lahtinen <joonas.lahtinen@linux.intel.com>2026-11-11 10:15:01 +0200
commit4247f4e2c10eac8c17fc23c2db0e14911b1ba5ff (patch)
tree10df0b9fb34a9b9e7d3ff04af525d8726681df75 /drivers/gpu
parentf1f5942c3fdac3bb553d0019f60d11ca35f9b836 (diff)
downloadlinux-4247f4e2c10eac8c17fc23c2db0e14911b1ba5ff.tar.gz
linux-4247f4e2c10eac8c17fc23c2db0e14911b1ba5ff.zip
drm/i915/psr: Re-arm PSR after flush
An ORIGIN_FLIP flush can clear the last busy frontbuffer bits without queuing the work that re-arms PSR. Queue the re-arm work after each flush when PSR is inactive and no frontbuffers are busy. Move also pipe_frontbuffer_bits ==0 check to done right after pipe frontbuffer bits are figured out. Anyways nothing is currently done after in intel_psr_flush if the bits are 0. v2: Do not re-activate PSR on other pipe frontbuffer bits. Fixes: ef39826c12b4 ("drm/i915/display: Fix glitches when moving cursor with PSR2 selective fetch enabled") Cc: <stable@vger.kernel.org> # v5.16+ Tested-by: Ambica Pramod <ambica.pramod@intel.com> Signed-off-by: Jouni Högander <jouni.hogander@intel.com> Reviewed-by: Mika Kahola <mika.kahola@intel.com> Link: https://patch.msgid.link/20261102100051.272137-3-jouni.hogander@intel.com (cherry picked from commit 731ed8af13bdead02924b39a8c01d5f60d6a2e68) Signed-off-by: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
Diffstat (limited to 'drivers/gpu')
-rw-r--r--drivers/gpu/drm/i915/display/intel_psr.c16
1 files changed, 9 insertions, 7 deletions
diff --git a/drivers/gpu/drm/i915/display/intel_psr.c b/drivers/gpu/drm/i915/display/intel_psr.c
index ad57a1209825..5bb9432e8deb 100644
--- a/drivers/gpu/drm/i915/display/intel_psr.c
+++ b/drivers/gpu/drm/i915/display/intel_psr.c
@@ -3669,9 +3669,6 @@ static void _psr_flush_handle(struct intel_dp *intel_dp)
*/
intel_psr_force_update(intel_dp);
}
-
- if (!intel_dp->psr.active && !intel_dp->psr.busy_frontbuffer_bits)
- queue_work(display->wq.unordered, &intel_dp->psr.work);
}
/**
@@ -3704,6 +3701,10 @@ void intel_psr_flush(struct intel_display *display,
pipe_frontbuffer_bits &=
INTEL_FRONTBUFFER_ALL_MASK(intel_dp->psr.pipe);
+
+ if (pipe_frontbuffer_bits == 0)
+ goto unlock;
+
intel_dp->psr.busy_frontbuffer_bits &= ~pipe_frontbuffer_bits;
/*
@@ -3718,13 +3719,14 @@ void intel_psr_flush(struct intel_display *display,
psr2_dc3co_flush_locked(intel_dp, frontbuffer_bits);
if (origin == ORIGIN_FLIP)
- goto unlock;
-
- if (pipe_frontbuffer_bits == 0)
- goto unlock;
+ goto rearm;
/* By definition flush = invalidate + flush */
_psr_flush_handle(intel_dp);
+
+rearm:
+ if (!intel_dp->psr.active && !intel_dp->psr.busy_frontbuffer_bits)
+ queue_work(display->wq.unordered, &intel_dp->psr.work);
unlock:
mutex_unlock(&intel_dp->psr.lock);
}