Intel-XE Archive on lore.kernel.org
 help / color / mirror / Atom feed
From: Ville Syrjala <ville.syrjala@linux.intel.com>
To: intel-gfx@lists.freedesktop.org
Cc: intel-xe@lists.freedesktop.org
Subject: [PATCH v4 18/21] drm/i915/flipq: Implement Wa_16018781658 for LNL-A0
Date: Mon,  9 Jun 2025 17:10:43 +0300	[thread overview]
Message-ID: <20250609141046.6244-19-ville.syrjala@linux.intel.com> (raw)
In-Reply-To: <20250609141046.6244-1-ville.syrjala@linux.intel.com>

From: Ville Syrjälä <ville.syrjala@linux.intel.com>

The normal flip queue completion interrupt doesn't work on LNL-A0,
and instead the firmware implements a workaround via the delayed
vblank event handler. Implement said workaround on the driver side
by enabling the appropriate event and handling the result interrupt
vector value in the PIPEDMC irq handler.

Included here just for reference since LNL-A0 is pre-production
and we don't actually care about it anymore.

v2: Ignore INT_VECTOR if there is a real PIPEDMC interrupt
    (nothing in the hw appears to clear INT_VECTOR)

Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
---
 drivers/gpu/drm/i915/display/intel_dmc.c   | 19 ++++++++++++++++++-
 drivers/gpu/drm/i915/display/intel_flipq.c | 12 ++++++++++++
 2 files changed, 30 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/i915/display/intel_dmc.c b/drivers/gpu/drm/i915/display/intel_dmc.c
index f786666720de..10db095d5b27 100644
--- a/drivers/gpu/drm/i915/display/intel_dmc.c
+++ b/drivers/gpu/drm/i915/display/intel_dmc.c
@@ -1554,9 +1554,26 @@ void intel_pipedmc_irq_handler(struct intel_display *display, enum pipe pipe)
 	}
 
 	int_vector = intel_de_read(display, PIPEDMC_STATUS(pipe)) & PIPEDMC_INT_VECTOR_MASK;
-	if (tmp == 0 && int_vector != 0)
+	/* Wa_16018781658 */
+	if (tmp == 0 && int_vector == PIPEDMC_INT_VECTOR_FLIPQ_PROG_DONE) {
+		spin_lock(&display->drm->event_lock);
+
+		if (crtc->flipq_event) {
+			/*
+			 * Update vblank counter/timestamp in case it
+			 * hasn't been done yet for this frame.
+			 */
+			drm_crtc_accurate_vblank_count(&crtc->base);
+
+			drm_crtc_send_vblank_event(&crtc->base, crtc->flipq_event);
+			crtc->flipq_event = NULL;
+		}
+
+		spin_unlock(&display->drm->event_lock);
+	} else if (tmp == 0 && int_vector != 0) {
 		drm_err(display->drm, "[CRTC:%d:%s]] PIPEDMC interrupt vector 0x%x\n",
 			crtc->base.base.id, crtc->base.name, tmp);
+	}
 }
 
 void intel_pipedmc_enable_event(struct intel_crtc *crtc,
diff --git a/drivers/gpu/drm/i915/display/intel_flipq.c b/drivers/gpu/drm/i915/display/intel_flipq.c
index 3a5a1fdb876b..2b0fb1e78d7d 100644
--- a/drivers/gpu/drm/i915/display/intel_flipq.c
+++ b/drivers/gpu/drm/i915/display/intel_flipq.c
@@ -247,6 +247,14 @@ void intel_flipq_enable(const struct intel_crtc_state *crtc_state)
 
 	intel_pipedmc_enable_event(crtc, flipq_event_id(display));
 
+	/*
+	 * Wa_16018781658
+	 * PIPEDMC_FPQ_CTL2 bit 1 isn't working, firmware implements
+	 * a workaround via the delayed vblank handler.
+	 */
+	if (display->platform.lunarlake && IS_DISPLAY_STEP(display, STEP_A0, STEP_B0))
+		intel_pipedmc_enable_event(crtc, PIPEDMC_EVENT_DELAYED_VBLANK);
+
 	intel_de_write(display, PIPEDMC_FQ_CTRL(crtc->pipe), PIPEDMC_FQ_CTRL_ENABLE);
 }
 
@@ -259,6 +267,10 @@ void intel_flipq_disable(const struct intel_crtc_state *crtc_state)
 
 	intel_de_write(display, PIPEDMC_FQ_CTRL(crtc->pipe), 0);
 
+	/* Wa_16018781658 */
+	if (display->platform.lunarlake && IS_DISPLAY_STEP(display, STEP_A0, STEP_B0))
+		intel_pipedmc_disable_event(crtc, PIPEDMC_EVENT_DELAYED_VBLANK);
+
 	intel_pipedmc_disable_event(crtc, flipq_event_id(display));
 
 	intel_de_write(display, PIPEDMC_SCANLINECMPLOWER(crtc->pipe), 0);
-- 
2.49.0


  parent reply	other threads:[~2025-06-09 14:11 UTC|newest]

Thread overview: 51+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-06-09 14:10 [PATCH v4 00/21] drm/i915/flipq: Rough flip queue implementation Ville Syrjala
2025-06-09 14:10 ` [PATCH v4 01/21] drm/i915/dsb: Use intel_dsb_ins_align() in intel_dsb_align_tail() Ville Syrjala
2025-06-10 21:24   ` Shankar, Uma
2025-06-09 14:10 ` [PATCH v4 02/21] drm/i915/dsb: Provide intel_dsb_head() and intel_dsb_size() Ville Syrjala
2025-06-10 21:28   ` Shankar, Uma
2025-06-09 14:10 ` [PATCH v4 03/21] drm/i915/dsb: Introduce intel_dsb_exec_time_us() Ville Syrjala
2025-06-10 21:32   ` Shankar, Uma
2025-06-09 14:10 ` [PATCH v4 04/21] drm/i915/dsb: Garbage collect the MMIO DEwake stuff Ville Syrjala
2025-06-10 21:41   ` Shankar, Uma
2025-06-09 14:10 ` [PATCH v4 05/21] drm/i915/dsb: Move the DSB_PMCTRL* reset out of intel_dsb_finish() Ville Syrjala
2025-06-10 21:50   ` Shankar, Uma
2025-06-09 14:10 ` [PATCH v4 06/21] drm/i915/dsb: Disable the GOSUB interrupt Ville Syrjala
2025-06-10 21:53   ` Shankar, Uma
2025-06-09 14:10 ` [PATCH v4 07/21] drm/i915/dmc: Limit PIPEDMC clock gating w/a to just ADL/DG2/MTL Ville Syrjala
2025-06-10 22:06   ` Shankar, Uma
2025-06-11 13:30     ` Ville Syrjälä
2025-06-12  5:12       ` Shankar, Uma
2025-06-09 14:10 ` [PATCH v4 08/21] drm/i915/dmc: Parametrize MTL_PIPEDMC_GATING_DIS Ville Syrjala
2025-06-10 22:07   ` Shankar, Uma
2025-06-09 14:10 ` [PATCH v4 09/21] drm/i915: Set PKG_C_LATENCY.added_wake_time to 0 Ville Syrjala
2025-06-10 22:18   ` Shankar, Uma
2025-06-09 14:10 ` [PATCH v4 10/21] drm/i915: Try to program PKG_C_LATENCY more correctly Ville Syrjala
2025-06-09 14:10 ` [PATCH v4 11/21] drm/i915/dmc: Shuffle code around Ville Syrjala
2025-06-10 22:20   ` Shankar, Uma
2025-06-09 14:10 ` [PATCH v4 12/21] drm/i915/dmc: Reload PIPEDMC MMIO registers for pipe C/D on PTL+ Ville Syrjala
2025-06-10 23:24   ` Shankar, Uma
2025-06-11 14:25     ` Ville Syrjälä
2025-06-12  5:05       ` Shankar, Uma
2025-06-09 14:10 ` [PATCH v4 13/21] drm/i915/dmc: Assert DMC is loaded harder Ville Syrjala
2025-06-09 14:10 ` [PATCH v4 14/21] drm/i915/dmc: Define flip queue related PIPEDMC registers Ville Syrjala
2025-06-19  7:29   ` Shankar, Uma
2025-06-09 14:10 ` [PATCH v4 15/21] drm/i915/flipq: Provide the nuts and bolts code for flip queue Ville Syrjala
2025-06-23 19:54   ` Shankar, Uma
2025-06-09 14:10 ` [PATCH v4 16/21] drm/i915/flipq: Implement flip queue based commit path Ville Syrjala
2025-06-23 19:58   ` Shankar, Uma
2025-06-09 14:10 ` [PATCH v4 17/21] drm/i915/flipq: Implement Wa_18034343758 Ville Syrjala
2025-06-23 20:05   ` Shankar, Uma
2025-06-09 14:10 ` Ville Syrjala [this message]
2025-06-23 20:08   ` [PATCH v4 18/21] drm/i915/flipq: Implement Wa_16018781658 for LNL-A0 Shankar, Uma
2025-06-09 14:10 ` [PATCH v4 19/21] drm/i915/flipq: Add intel_flipq_dump() Ville Syrjala
2025-06-23 20:09   ` Shankar, Uma
2025-06-09 14:10 ` [PATCH v4 20/21] drm/i915/flipq: Enable flipq by default for testing Ville Syrjala
2025-06-09 14:10 ` [PATCH v4 21/21] drm/i915/flipq: Disable PSR for extra flip queue coverage Ville Syrjala
2025-06-09 19:22 ` ✓ CI.Patch_applied: success for drm/i915/flipq: Rough flip queue implementation (rev6) Patchwork
2025-06-09 19:23 ` ✗ CI.checkpatch: warning " Patchwork
2025-06-09 19:24 ` ✓ CI.KUnit: success " Patchwork
2025-06-09 19:35 ` ✓ CI.Build: " Patchwork
2025-06-09 19:37 ` ✓ CI.Hooks: " Patchwork
2025-06-09 19:39 ` ✗ CI.checksparse: warning " Patchwork
2025-06-09 20:01 ` ✗ Xe.CI.BAT: failure " Patchwork
2025-06-09 21:50 ` ✗ Xe.CI.Full: " Patchwork

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20250609141046.6244-19-ville.syrjala@linux.intel.com \
    --to=ville.syrjala@linux.intel.com \
    --cc=intel-gfx@lists.freedesktop.org \
    --cc=intel-xe@lists.freedesktop.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox