Intel-XE Archive on lore.kernel.org
 help / color / mirror / Atom feed
* [i915-rt v2 00/16] drm/i915/display: All patches to make PREEMPT_RT work on i915 + xe.
@ 2025-12-16  9:22 Maarten Lankhorst
  2025-12-16  9:22 ` [i915-rt v2 01/16] drm/i915/display: Fix intel_lpe_audio_irq_handler for PREEMPT-RT Maarten Lankhorst
                   ` (17 more replies)
  0 siblings, 18 replies; 21+ messages in thread
From: Maarten Lankhorst @ 2025-12-16  9:22 UTC (permalink / raw)
  To: intel-xe; +Cc: intel-gfx

Grab all i915 required patches from the PREEMPT-RT series too.
Try 2, with vblank evasion hopefully fixed.

Maarten Lankhorst (11):
  drm/i915/display: Fix intel_lpe_audio_irq_handler for PREEMPT-RT
  drm/i915/display: Make get_vblank_counter use intel_de_read_fw()
  drm/i915/display: Use intel_de_write_fw in intel_pipe_fastset
  drm/i915/display: Make set_pipeconf use the fw variants
  drm/i915/display: Move vblank put until after critical section
  drm/i915/display: Remove locking from intel_vblank_evade critical
    section
  drm/i915/display: Handle vlv dsi workaround in scanline_in_safe_range
    too
  drm/i915/display: Make icl_dsi_frame_update use _fw too
  drm/i915/display: Enable interrupts earlier on PREEMPT_RT
  PREEMPT_RT injection
  drm/i915/display: Use intel_de_read_fw in colorops

Mike Galbraith (1):
  drm/i915: Use preempt_disable/enable_rt() where recommended

Sebastian Andrzej Siewior (4):
  drm/i915/gt: Use spin_lock_irq() instead of local_irq_disable() +
    spin_lock()
  drm/i915: Drop the irqs_disabled() check
  drm/i915/guc: Consider also RCU depth in busy loop.
  Revert "drm/i915: Depend on !PREEMPT_RT."

 drivers/gpu/drm/i915/Kconfig                  |   1 -
 drivers/gpu/drm/i915/Kconfig.debug            |  15 ---
 drivers/gpu/drm/i915/display/icl_dsi.c        |   4 +-
 drivers/gpu/drm/i915/display/intel_color.c    |   4 +-
 drivers/gpu/drm/i915/display/intel_crtc.c     |  12 +-
 drivers/gpu/drm/i915/display/intel_cursor.c   |   8 +-
 drivers/gpu/drm/i915/display/intel_display.c  |  46 +++----
 .../gpu/drm/i915/display/intel_lpe_audio.c    |   2 +-
 drivers/gpu/drm/i915/display/intel_vblank.c   | 114 +++++++++++-------
 drivers/gpu/drm/i915/display/intel_vblank.h   |   1 +
 drivers/gpu/drm/i915/display/intel_vrr.c      |  16 +--
 .../drm/i915/gt/intel_execlists_submission.c  |  17 +--
 drivers/gpu/drm/i915/gt/uc/intel_guc.h        |   2 +-
 drivers/gpu/drm/i915/i915_request.c           |   2 -
 drivers/gpu/drm/xe/Kconfig.debug              |   5 +
 kernel/Kconfig.preempt                        |   4 +-
 16 files changed, 137 insertions(+), 116 deletions(-)

-- 
2.51.0


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

* [i915-rt v2 01/16] drm/i915/display: Fix intel_lpe_audio_irq_handler for PREEMPT-RT
  2025-12-16  9:22 [i915-rt v2 00/16] drm/i915/display: All patches to make PREEMPT_RT work on i915 + xe Maarten Lankhorst
@ 2025-12-16  9:22 ` Maarten Lankhorst
  2025-12-16  9:22 ` [i915-rt v2 02/16] drm/i915/display: Make get_vblank_counter use intel_de_read_fw() Maarten Lankhorst
                   ` (16 subsequent siblings)
  17 siblings, 0 replies; 21+ messages in thread
From: Maarten Lankhorst @ 2025-12-16  9:22 UTC (permalink / raw)
  To: intel-xe; +Cc: intel-gfx

The LPE audio interrupt comes from the i915 interrupt handler. It
should be in irq disabled context.

With PREEMPT_RT enabled, the IRQ handler is threaded.
Because intel_lpe_audio_irq_handler() may be called in threaded IRQ context,
generic_handle_irq_safe API disables the interrupts before calling LPE's
interrupt top half handler.

This fixes braswell audio issues with RT enabled.

Signed-off-by: Maarten Lankhorst <dev@lankhorst.se>
Reviewed-by: Matthew Brost <matthew.brost@intel.com>
---
 drivers/gpu/drm/i915/display/intel_lpe_audio.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/i915/display/intel_lpe_audio.c b/drivers/gpu/drm/i915/display/intel_lpe_audio.c
index 5b41abe1c64d5..172c0062237eb 100644
--- a/drivers/gpu/drm/i915/display/intel_lpe_audio.c
+++ b/drivers/gpu/drm/i915/display/intel_lpe_audio.c
@@ -262,7 +262,7 @@ void intel_lpe_audio_irq_handler(struct intel_display *display)
 	if (!HAS_LPE_AUDIO(display))
 		return;
 
-	ret = generic_handle_irq(display->audio.lpe.irq);
+	ret = generic_handle_irq_safe(display->audio.lpe.irq);
 	if (ret)
 		drm_err_ratelimited(display->drm,
 				    "error handling LPE audio irq: %d\n", ret);
-- 
2.51.0


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

* [i915-rt v2 02/16] drm/i915/display: Make get_vblank_counter use intel_de_read_fw()
  2025-12-16  9:22 [i915-rt v2 00/16] drm/i915/display: All patches to make PREEMPT_RT work on i915 + xe Maarten Lankhorst
  2025-12-16  9:22 ` [i915-rt v2 01/16] drm/i915/display: Fix intel_lpe_audio_irq_handler for PREEMPT-RT Maarten Lankhorst
@ 2025-12-16  9:22 ` Maarten Lankhorst
  2025-12-16  9:22 ` [i915-rt v2 03/16] drm/i915/display: Use intel_de_write_fw in intel_pipe_fastset Maarten Lankhorst
                   ` (15 subsequent siblings)
  17 siblings, 0 replies; 21+ messages in thread
From: Maarten Lankhorst @ 2025-12-16  9:22 UTC (permalink / raw)
  To: intel-xe; +Cc: intel-gfx

Fixes the following lockdep splat on PREEMPT_RT:
<3> BUG: sleeping function called from invalid context at kernel/locking/spinlock_rt.c:48
<3> in_atomic(): 1, irqs_disabled(): 0, non_block: 0, pid: 1373, name: xe_module_load
<3> preempt_count: 1, expected: 0
<3> RCU nest depth: 0, expected: 0
<4> 11 locks held by xe_module_load/1373:
<4>  #0: ffff888107b691a0 (&dev->mutex){....}-{3:3}, at: __driver_attach+0x104/0x220
<4>  #1: ffff88813cd30280 (&dev->clientlist_mutex){+.+.}-{3:3}, at: drm_client_register+0x32/0xe0
<4>  #2: ffffffff837f88f8 (registration_lock){+.+.}-{3:3}, at: register_framebuffer+0x1b/0x50
<4>  #3: ffffffff835985e0 (console_lock){+.+.}-{0:0}, at: fbcon_fb_registered+0x6f/0x90
<4>  #4: ffff88812589e6a0 (&helper->lock){+.+.}-{3:3}, at: __drm_fb_helper_restore_fbdev_mode_unlocked+0x7b/0x110
<4>  #5: ffff88813cd30158 (&dev->master_mutex){+.+.}-{3:3}, at: drm_master_internal_acquire+0x20/0x50
<4>  #6: ffff88812589e488 (&client->modeset_mutex){+.+.}-{3:3}, at: drm_client_modeset_commit_locked+0x2a/0x1b0
<4>  #7: ffffc9000031eef0 (crtc_ww_class_acquire){+.+.}-{0:0}, at: drm_client_modeset_commit_atomic+0x4c/0x2b0
<4>  #8: ffffc9000031ef18 (crtc_ww_class_mutex){+.+.}-{3:3}, at: drm_client_modeset_commit_atomic+0x4c/0x2b0
<4>  #9: ffff888114f7b8b8 (&intel_dp->psr.lock){+.+.}-{3:3}, at: intel_psr_lock+0xc5/0xf0 [xe]
<4>  #10: ffff88812a0cbbc0 (&wl->lock){+.+.}-{2:2}, at: intel_dmc_wl_get+0x3c/0x140 [xe]

This splat will happen otherwise on all tracepoints too, for similar reasons.

Signed-off-by: Maarten Lankhorst <dev@lankhorst.se>
---
 drivers/gpu/drm/i915/display/intel_vblank.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/i915/display/intel_vblank.c b/drivers/gpu/drm/i915/display/intel_vblank.c
index 671f357c65638..2b106ffa3f5f5 100644
--- a/drivers/gpu/drm/i915/display/intel_vblank.c
+++ b/drivers/gpu/drm/i915/display/intel_vblank.c
@@ -133,7 +133,7 @@ u32 g4x_get_vblank_counter(struct drm_crtc *crtc)
 	if (!vblank->max_vblank_count)
 		return 0;
 
-	return intel_de_read(display, PIPE_FRMCOUNT_G4X(display, pipe));
+	return intel_de_read_fw(display, PIPE_FRMCOUNT_G4X(display, pipe));
 }
 
 static u32 intel_crtc_scanlines_since_frame_timestamp(struct intel_crtc *crtc)
-- 
2.51.0


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

* [i915-rt v2 03/16] drm/i915/display: Use intel_de_write_fw in intel_pipe_fastset
  2025-12-16  9:22 [i915-rt v2 00/16] drm/i915/display: All patches to make PREEMPT_RT work on i915 + xe Maarten Lankhorst
  2025-12-16  9:22 ` [i915-rt v2 01/16] drm/i915/display: Fix intel_lpe_audio_irq_handler for PREEMPT-RT Maarten Lankhorst
  2025-12-16  9:22 ` [i915-rt v2 02/16] drm/i915/display: Make get_vblank_counter use intel_de_read_fw() Maarten Lankhorst
@ 2025-12-16  9:22 ` Maarten Lankhorst
  2025-12-16  9:22 ` [i915-rt v2 04/16] drm/i915/display: Make set_pipeconf use the fw variants Maarten Lankhorst
                   ` (14 subsequent siblings)
  17 siblings, 0 replies; 21+ messages in thread
From: Maarten Lankhorst @ 2025-12-16  9:22 UTC (permalink / raw)
  To: intel-xe; +Cc: intel-gfx

intel_set_pipe_src_size(), hsw_set_linetime_wm(),
intel_cpu_transcoder_set_m1_n1() and intel_set_transcoder_timings_lrr()
are called from an atomic context on PREEMPT_RT, and should be using the
_fw functions.

This likely prevents a deadlock on i915.

Again noticed when trying to disable preemption in vblank evasion:
<3> BUG: sleeping function called from invalid context at kernel/locking/spinlock_rt.c:48
<3> in_atomic(): 1, irqs_disabled(): 0, non_block: 0, pid: 1505, name: kms_cursor_lega
<3> preempt_count: 1, expected: 0
<3> RCU nest depth: 0, expected: 0
<4> 4 locks held by kms_cursor_lega/1505:
<4>  #0: ffffc90003c6f988 (crtc_ww_class_acquire){+.+.}-{0:0}, at: drm_mode_atomic_ioctl+0x13b/0xe90
<4>  #1: ffffc90003c6f9b0 (crtc_ww_class_mutex){+.+.}-{3:3}, at: drm_mode_atomic_ioctl+0x13b/0xe90
<4>  #2: ffff888135b838b8 (&intel_dp->psr.lock){+.+.}-{3:3}, at: intel_psr_lock+0xc5/0xf0 [xe]
<4>  #3: ffff88812607bbc0 (&wl->lock){+.+.}-{2:2}, at: intel_dmc_wl_get+0x3c/0x140 [xe]
<4> CPU: 6 UID: 0 PID: 1505 Comm: kms_cursor_lega Tainted: G     U              6.18.0-rc3-lgci-xe-xe-pw-156729v1+ #1 PREEMPT_{RT,(lazy)}
<4> Tainted: [U]=USER
<4> Hardware name: Intel Corporation Panther Lake Client Platform/PTL-UH LP5 T3 RVP1, BIOS PTLPFWI1.R00.3383.D02.2509240621 09/24/2025
<4> Call Trace:
<4>  <TASK>
<4>  dump_stack_lvl+0xc1/0xf0
<4>  dump_stack+0x10/0x20
<4>  __might_resched+0x174/0x260
<4>  rt_spin_lock+0x63/0x200
<4>  ? intel_dmc_wl_get+0x3c/0x140 [xe]
<4>  intel_dmc_wl_get+0x3c/0x140 [xe]
<4>  intel_set_pipe_src_size+0x89/0xe0 [xe]
<4>  intel_update_crtc+0x3c1/0x950 [xe]
<4>  ? intel_pre_update_crtc+0x258/0x400 [xe]
<4>  skl_commit_modeset_enables+0x217/0x720 [xe]
<4>  intel_atomic_commit_tail+0xd4e/0x1af0 [xe]
<4>  ? lock_release+0xce/0x2a0
<4>  intel_atomic_commit+0x2e5/0x330 [xe]
<4>  ? intel_atomic_commit+0x2e5/0x330 [xe]
<4>  drm_atomic_commit+0xaf/0xf0
<4>  ? __pfx___drm_printfn_info+0x10/0x10
<4>  drm_mode_atomic_ioctl+0xbd5/0xe90
<4>  ? lock_acquire+0xc4/0x2e0
<4>  ? __pfx_drm_mode_atomic_ioctl+0x10/0x10
<4>  drm_ioctl_kernel+0xb6/0x120
<4>  drm_ioctl+0x2d7/0x5a0
<4>  ? __pfx_drm_mode_atomic_ioctl+0x10/0x10
<4>  ? rt_spin_unlock+0xa0/0x140
<4>  ? __pm_runtime_resume+0x53/0x90
<4>  xe_drm_ioctl+0x56/0x90 [xe]
<4>  __x64_sys_ioctl+0xa8/0x110
<4>  ? lock_acquire+0xc4/0x2e0
<4>  x64_sys_call+0x1144/0x26a0
<4>  do_syscall_64+0x93/0xae0
<4>  ? lock_release+0xce/0x2a0
<4>  ? __task_pid_nr_ns+0xd9/0x270
<4>  ? do_syscall_64+0x1b7/0xae0
<4>  ? find_held_lock+0x31/0x90
<4>  ? __task_pid_nr_ns+0xcf/0x270
<4>  ? __lock_acquire+0x43e/0x2860
<4>  ? __task_pid_nr_ns+0xd9/0x270
<4>  ? lock_acquire+0xc4/0x2e0
<4>  ? find_held_lock+0x31/0x90
<4>  ? __task_pid_nr_ns+0xcf/0x270
<4>  ? lock_release+0xce/0x2a0
<4>  ? __task_pid_nr_ns+0xd9/0x270
<4>  ? do_syscall_64+0x1b7/0xae0
<4>  ? do_syscall_64+0x1b7/0xae0
<4>  entry_SYSCALL_64_after_hwframe+0x76/0x7e

Signed-off-by: Maarten Lankhorst <dev@lankhorst.se>
---
 drivers/gpu/drm/i915/display/intel_display.c | 36 ++++++++++----------
 drivers/gpu/drm/i915/display/intel_vrr.c     | 16 ++++-----
 2 files changed, 26 insertions(+), 26 deletions(-)

diff --git a/drivers/gpu/drm/i915/display/intel_display.c b/drivers/gpu/drm/i915/display/intel_display.c
index 9c6d3ecdb589e..04e14eaeacdb2 100644
--- a/drivers/gpu/drm/i915/display/intel_display.c
+++ b/drivers/gpu/drm/i915/display/intel_display.c
@@ -1583,9 +1583,9 @@ static void hsw_set_linetime_wm(const struct intel_crtc_state *crtc_state)
 	struct intel_display *display = to_intel_display(crtc_state);
 	struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
 
-	intel_de_write(display, WM_LINETIME(crtc->pipe),
-		       HSW_LINETIME(crtc_state->linetime) |
-		       HSW_IPS_LINETIME(crtc_state->ips_linetime));
+	intel_de_write_fw(display, WM_LINETIME(crtc->pipe),
+			  HSW_LINETIME(crtc_state->linetime) |
+			  HSW_IPS_LINETIME(crtc_state->ips_linetime));
 }
 
 static void hsw_set_frame_start_delay(const struct intel_crtc_state *crtc_state)
@@ -2582,14 +2582,14 @@ void intel_set_m_n(struct intel_display *display,
 		   i915_reg_t data_m_reg, i915_reg_t data_n_reg,
 		   i915_reg_t link_m_reg, i915_reg_t link_n_reg)
 {
-	intel_de_write(display, data_m_reg, TU_SIZE(m_n->tu) | m_n->data_m);
-	intel_de_write(display, data_n_reg, m_n->data_n);
-	intel_de_write(display, link_m_reg, m_n->link_m);
+	intel_de_write_fw(display, data_m_reg, TU_SIZE(m_n->tu) | m_n->data_m);
+	intel_de_write_fw(display, data_n_reg, m_n->data_n);
+	intel_de_write_fw(display, link_m_reg, m_n->link_m);
 	/*
 	 * On BDW+ writing LINK_N arms the double buffered update
 	 * of all the M/N registers, so it must be written last.
 	 */
-	intel_de_write(display, link_n_reg, m_n->link_n);
+	intel_de_write_fw(display, link_n_reg, m_n->link_n);
 }
 
 bool intel_cpu_transcoder_has_m2_n2(struct intel_display *display,
@@ -2776,9 +2776,9 @@ static void intel_set_transcoder_timings_lrr(const struct intel_crtc_state *crtc
 	}
 
 	if (DISPLAY_VER(display) >= 13) {
-		intel_de_write(display,
-			       TRANS_SET_CONTEXT_LATENCY(display, cpu_transcoder),
-			       crtc_state->set_context_latency);
+		intel_de_write_fw(display,
+				  TRANS_SET_CONTEXT_LATENCY(display, cpu_transcoder),
+				  crtc_state->set_context_latency);
 
 		/*
 		 * VBLANK_START not used by hw, just clear it
@@ -2794,9 +2794,9 @@ static void intel_set_transcoder_timings_lrr(const struct intel_crtc_state *crtc
 	 * The hardware actually ignores TRANS_VBLANK.VBLANK_END in DP mode.
 	 * But let's write it anyway to keep the state checker happy.
 	 */
-	intel_de_write(display, TRANS_VBLANK(display, cpu_transcoder),
-		       VBLANK_START(crtc_vblank_start - 1) |
-		       VBLANK_END(crtc_vblank_end - 1));
+	intel_de_write_fw(display, TRANS_VBLANK(display, cpu_transcoder),
+			  VBLANK_START(crtc_vblank_start - 1) |
+			  VBLANK_END(crtc_vblank_end - 1));
 	/*
 	 * For platforms that always use VRR Timing Generator, the VTOTAL.Vtotal
 	 * bits are not required. Since the support for these bits is going to
@@ -2810,9 +2810,9 @@ static void intel_set_transcoder_timings_lrr(const struct intel_crtc_state *crtc
 	 * The double buffer latch point for TRANS_VTOTAL
 	 * is the transcoder's undelayed vblank.
 	 */
-	intel_de_write(display, TRANS_VTOTAL(display, cpu_transcoder),
-		       VACTIVE(crtc_vdisplay - 1) |
-		       VTOTAL(crtc_vtotal - 1));
+	intel_de_write_fw(display, TRANS_VTOTAL(display, cpu_transcoder),
+			  VACTIVE(crtc_vdisplay - 1) |
+			  VTOTAL(crtc_vtotal - 1));
 
 	intel_vrr_set_fixed_rr_timings(crtc_state);
 	intel_vrr_transcoder_enable(crtc_state);
@@ -2829,8 +2829,8 @@ static void intel_set_pipe_src_size(const struct intel_crtc_state *crtc_state)
 	/* pipesrc controls the size that is scaled from, which should
 	 * always be the user's requested size.
 	 */
-	intel_de_write(display, PIPESRC(display, pipe),
-		       PIPESRC_WIDTH(width - 1) | PIPESRC_HEIGHT(height - 1));
+	intel_de_write_fw(display, PIPESRC(display, pipe),
+			  PIPESRC_WIDTH(width - 1) | PIPESRC_HEIGHT(height - 1));
 }
 
 static bool intel_pipe_is_interlaced(const struct intel_crtc_state *crtc_state)
diff --git a/drivers/gpu/drm/i915/display/intel_vrr.c b/drivers/gpu/drm/i915/display/intel_vrr.c
index b92c42fde937f..5d8b419d1ae36 100644
--- a/drivers/gpu/drm/i915/display/intel_vrr.c
+++ b/drivers/gpu/drm/i915/display/intel_vrr.c
@@ -300,12 +300,12 @@ void intel_vrr_set_fixed_rr_timings(const struct intel_crtc_state *crtc_state)
 	if (!intel_vrr_possible(crtc_state))
 		return;
 
-	intel_de_write(display, TRANS_VRR_VMIN(display, cpu_transcoder),
-		       intel_vrr_fixed_rr_hw_vmin(crtc_state) - 1);
-	intel_de_write(display, TRANS_VRR_VMAX(display, cpu_transcoder),
-		       intel_vrr_fixed_rr_hw_vmax(crtc_state) - 1);
-	intel_de_write(display, TRANS_VRR_FLIPLINE(display, cpu_transcoder),
-		       intel_vrr_fixed_rr_hw_flipline(crtc_state) - 1);
+	intel_de_write_fw(display, TRANS_VRR_VMIN(display, cpu_transcoder),
+			  intel_vrr_fixed_rr_hw_vmin(crtc_state) - 1);
+	intel_de_write_fw(display, TRANS_VRR_VMAX(display, cpu_transcoder),
+			  intel_vrr_fixed_rr_hw_vmax(crtc_state) - 1);
+	intel_de_write_fw(display, TRANS_VRR_FLIPLINE(display, cpu_transcoder),
+			  intel_vrr_fixed_rr_hw_flipline(crtc_state) - 1);
 }
 
 static
@@ -693,7 +693,7 @@ static void intel_vrr_tg_enable(const struct intel_crtc_state *crtc_state,
 	enum transcoder cpu_transcoder = crtc_state->cpu_transcoder;
 	u32 vrr_ctl;
 
-	intel_de_write(display, TRANS_PUSH(display, cpu_transcoder), TRANS_PUSH_EN);
+	intel_de_write_fw(display, TRANS_PUSH(display, cpu_transcoder), TRANS_PUSH_EN);
 
 	vrr_ctl = VRR_CTL_VRR_ENABLE | trans_vrr_ctl(crtc_state);
 
@@ -705,7 +705,7 @@ static void intel_vrr_tg_enable(const struct intel_crtc_state *crtc_state,
 	if (cmrr_enable)
 		vrr_ctl |= VRR_CTL_CMRR_ENABLE;
 
-	intel_de_write(display, TRANS_VRR_CTL(display, cpu_transcoder), vrr_ctl);
+	intel_de_write_fw(display, TRANS_VRR_CTL(display, cpu_transcoder), vrr_ctl);
 }
 
 static void intel_vrr_tg_disable(const struct intel_crtc_state *old_crtc_state)
-- 
2.51.0


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

* [i915-rt v2 04/16] drm/i915/display: Make set_pipeconf use the fw variants
  2025-12-16  9:22 [i915-rt v2 00/16] drm/i915/display: All patches to make PREEMPT_RT work on i915 + xe Maarten Lankhorst
                   ` (2 preceding siblings ...)
  2025-12-16  9:22 ` [i915-rt v2 03/16] drm/i915/display: Use intel_de_write_fw in intel_pipe_fastset Maarten Lankhorst
@ 2025-12-16  9:22 ` Maarten Lankhorst
  2025-12-16  9:22 ` [i915-rt v2 05/16] drm/i915/display: Move vblank put until after critical section Maarten Lankhorst
                   ` (13 subsequent siblings)
  17 siblings, 0 replies; 21+ messages in thread
From: Maarten Lankhorst @ 2025-12-16  9:22 UTC (permalink / raw)
  To: intel-xe; +Cc: intel-gfx

The calls are used inside the critical section when updating
the gamma mode, and thus should use the _fw variants to prevent
locks.

Fixes following splat:
| BUG: sleeping function called from invalid context at kernel/locking/spinlock_rt.c:48
| in_atomic(): 0, irqs_disabled(): 1, non_block: 0, pid: 2115, name: modprobe
| preempt_count: 0, expected: 0
| RCU nest depth: 0, expected: 0
| 4 locks held by modprobe/2115:
|  #0: ffff99b9425161a0 (&dev->mutex){....}-{4:4}, at: __driver_attach+0xaf/0x1c0
|  #1: ffffaa224810f6c0 (crtc_ww_class_acquire){+.+.}-{0:0}, at: intel_initial_commit+0x4c/0x200 [i915]
|  #2: ffffaa224810f6e8 (crtc_ww_class_mutex){+.+.}-{4:4}, at: intel_initial_commit+0x4c/0x200 [i915]
|  #3: ffff99b94a6c9030 (&uncore->lock){+.+.}-{3:3}, at: gen6_write32+0x50/0x290 [i915]
| irq event stamp: 513344
| hardirqs last  enabled at (513343): [<ffffffff8ba8d84c>] _raw_spin_unlock_irqrestore+0x4c/0x60
| hardirqs last disabled at (513344): [<ffffffffc1543646>] intel_pipe_update_start+0x216/0x2c0 [i915]
| softirqs last  enabled at (512766): [<ffffffff8af045cf>] __local_bh_enable_ip+0x10f/0x170
| softirqs last disabled at (512712): [<ffffffffc14dfb6a>] __i915_request_queue+0x3a/0x70 [i915]
| CPU: 3 UID: 0 PID: 2115 Comm: modprobe Tainted: G        W           6.18.0-rc1+ #17 PREEMPT_{RT,(lazy)}
| Tainted: [W]=WARN
| Hardware name: To Be Filled By O.E.M. To Be Filled By O.E.M./Z68 Pro3-M, BIOS P2.30 06/29/2012
| Call Trace:
|  <TASK>
|  dump_stack_lvl+0x68/0x90
|  __might_resched.cold+0xf0/0x12b
|  rt_spin_lock+0x5f/0x200
|  gen6_write32+0x50/0x290 [i915]
|  ilk_set_pipeconf+0x12d/0x230 [i915]
|  ilk_color_commit_arm+0x2d/0x70 [i915]
|  intel_update_crtc+0x15b/0x690 [i915]
|  intel_commit_modeset_enables+0xa6/0xd0 [i915]
|  intel_atomic_commit_tail+0xd55/0x19a0 [i915]
|  intel_atomic_commit+0x25d/0x2a0 [i915]
|  drm_atomic_commit+0xad/0xe0 [drm]
|  intel_initial_commit+0x16c/0x200 [i915]
|  intel_display_driver_probe+0x2e/0x80 [i915]
|  i915_driver_probe+0x791/0xc10 [i915]
|  i915_pci_probe+0xd7/0x190 [i915]

Reported-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
Signed-off-by: Maarten Lankhorst <dev@lankhorst.se>
---
 drivers/gpu/drm/i915/display/intel_display.c | 10 ++++++----
 1 file changed, 6 insertions(+), 4 deletions(-)

diff --git a/drivers/gpu/drm/i915/display/intel_display.c b/drivers/gpu/drm/i915/display/intel_display.c
index 04e14eaeacdb2..58b42e09907f5 100644
--- a/drivers/gpu/drm/i915/display/intel_display.c
+++ b/drivers/gpu/drm/i915/display/intel_display.c
@@ -3013,8 +3013,9 @@ void i9xx_set_pipeconf(const struct intel_crtc_state *crtc_state)
 
 	val |= TRANSCONF_FRAME_START_DELAY(crtc_state->framestart_delay - 1);
 
-	intel_de_write(display, TRANSCONF(display, cpu_transcoder), val);
-	intel_de_posting_read(display, TRANSCONF(display, cpu_transcoder));
+	intel_de_write_fw(display, TRANSCONF(display, cpu_transcoder), val);
+	/* posting read */
+	intel_de_read_fw(display, TRANSCONF(display, cpu_transcoder));
 }
 
 static enum intel_output_format
@@ -3209,8 +3210,9 @@ void ilk_set_pipeconf(const struct intel_crtc_state *crtc_state)
 	val |= TRANSCONF_FRAME_START_DELAY(crtc_state->framestart_delay - 1);
 	val |= TRANSCONF_MSA_TIMING_DELAY(crtc_state->msa_timing_delay);
 
-	intel_de_write(display, TRANSCONF(display, cpu_transcoder), val);
-	intel_de_posting_read(display, TRANSCONF(display, cpu_transcoder));
+	intel_de_write_fw(display, TRANSCONF(display, cpu_transcoder), val);
+	/* posting read */
+	intel_de_read_fw(display, TRANSCONF(display, cpu_transcoder));
 }
 
 static void hsw_set_transconf(const struct intel_crtc_state *crtc_state)
-- 
2.51.0


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

* [i915-rt v2 05/16] drm/i915/display: Move vblank put until after critical section
  2025-12-16  9:22 [i915-rt v2 00/16] drm/i915/display: All patches to make PREEMPT_RT work on i915 + xe Maarten Lankhorst
                   ` (3 preceding siblings ...)
  2025-12-16  9:22 ` [i915-rt v2 04/16] drm/i915/display: Make set_pipeconf use the fw variants Maarten Lankhorst
@ 2025-12-16  9:22 ` Maarten Lankhorst
  2025-12-16  9:22 ` [i915-rt v2 06/16] drm/i915/display: Remove locking from intel_vblank_evade " Maarten Lankhorst
                   ` (12 subsequent siblings)
  17 siblings, 0 replies; 21+ messages in thread
From: Maarten Lankhorst @ 2025-12-16  9:22 UTC (permalink / raw)
  To: intel-xe; +Cc: intel-gfx

drm_crtc_vblank_put may take some locks, this should probably
not be the first thing we do after entering the time sensitive
part.

A better place is after programming is completed. Add a flag
to put the vblank after completion.

In the case of drm_vblank_work_schedule, we may not even need
to disable the vblank interrupt any more if it takes its own
reference.

Signed-off-by: Maarten Lankhorst <dev@lankhorst.se>
Reviewed-by: Uma Shankar <uma.shankar@intel.com>
---
 drivers/gpu/drm/i915/display/intel_cursor.c | 8 ++++++--
 1 file changed, 6 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/i915/display/intel_cursor.c b/drivers/gpu/drm/i915/display/intel_cursor.c
index 2c5d917fbd7e9..3e84a2078a0a7 100644
--- a/drivers/gpu/drm/i915/display/intel_cursor.c
+++ b/drivers/gpu/drm/i915/display/intel_cursor.c
@@ -816,6 +816,7 @@ intel_legacy_cursor_update(struct drm_plane *_plane,
 		to_intel_crtc_state(crtc->base.state);
 	struct intel_crtc_state *new_crtc_state;
 	struct intel_vblank_evade_ctx evade;
+	bool has_vblank = false;
 	int ret;
 
 	/*
@@ -913,6 +914,8 @@ intel_legacy_cursor_update(struct drm_plane *_plane,
 	intel_psr_lock(crtc_state);
 
 	if (!drm_WARN_ON(display->drm, drm_crtc_vblank_get(&crtc->base))) {
+		has_vblank = true;
+
 		/*
 		 * TODO: maybe check if we're still in PSR
 		 * and skip the vblank evasion entirely?
@@ -922,8 +925,6 @@ intel_legacy_cursor_update(struct drm_plane *_plane,
 		local_irq_disable();
 
 		intel_vblank_evade(&evade);
-
-		drm_crtc_vblank_put(&crtc->base);
 	} else {
 		local_irq_disable();
 	}
@@ -939,6 +940,9 @@ intel_legacy_cursor_update(struct drm_plane *_plane,
 
 	intel_psr_unlock(crtc_state);
 
+	if (has_vblank)
+		drm_crtc_vblank_put(&crtc->base);
+
 	if (old_plane_state->ggtt_vma != new_plane_state->ggtt_vma) {
 		drm_vblank_work_init(&old_plane_state->unpin_work, &crtc->base,
 				     intel_cursor_unpin_work);
-- 
2.51.0


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

* [i915-rt v2 06/16] drm/i915/display: Remove locking from intel_vblank_evade critical section
  2025-12-16  9:22 [i915-rt v2 00/16] drm/i915/display: All patches to make PREEMPT_RT work on i915 + xe Maarten Lankhorst
                   ` (4 preceding siblings ...)
  2025-12-16  9:22 ` [i915-rt v2 05/16] drm/i915/display: Move vblank put until after critical section Maarten Lankhorst
@ 2025-12-16  9:22 ` Maarten Lankhorst
  2025-12-16 20:15   ` [i915-rt v2.1] " Maarten Lankhorst
  2025-12-22 18:14   ` [i915-rt v2 06/16] " kernel test robot
  2025-12-16  9:22 ` [i915-rt v2 07/16] drm/i915/display: Handle vlv dsi workaround in scanline_in_safe_range too Maarten Lankhorst
                   ` (11 subsequent siblings)
  17 siblings, 2 replies; 21+ messages in thread
From: Maarten Lankhorst @ 2025-12-16  9:22 UTC (permalink / raw)
  To: intel-xe; +Cc: intel-gfx

finish_wait() may take a lock, which means that it can take any amount
of time. On PREEMPT-RT we should not be taking any lock after disabling
preemption, so ensure that the completion is done before disabling
interrupts.

This also has the benefit of making vblank evasion more deterministic,
by performing the final vblank check after all locking is done.

Signed-off-by: Maarten Lankhorst <dev@lankhorst.se>
---
 drivers/gpu/drm/i915/display/intel_crtc.c   |  2 +-
 drivers/gpu/drm/i915/display/intel_vblank.c | 33 +++++++++++----------
 drivers/gpu/drm/i915/display/intel_vblank.h |  1 +
 3 files changed, 19 insertions(+), 17 deletions(-)

diff --git a/drivers/gpu/drm/i915/display/intel_crtc.c b/drivers/gpu/drm/i915/display/intel_crtc.c
index 778ebc5095c38..cb31c9c1c2525 100644
--- a/drivers/gpu/drm/i915/display/intel_crtc.c
+++ b/drivers/gpu/drm/i915/display/intel_crtc.c
@@ -684,7 +684,7 @@ void intel_pipe_update_end(struct intel_atomic_state *state,
 	struct intel_crtc_state *new_crtc_state =
 		intel_atomic_get_new_crtc_state(state, crtc);
 	enum pipe pipe = crtc->pipe;
-	int scanline_end = intel_get_crtc_scanline(crtc);
+	int scanline_end = __intel_get_crtc_scanline(crtc);
 	u32 end_vbl_count = intel_crtc_get_vblank_counter(crtc);
 	ktime_t end_vbl_time = ktime_get();
 
diff --git a/drivers/gpu/drm/i915/display/intel_vblank.c b/drivers/gpu/drm/i915/display/intel_vblank.c
index 2b106ffa3f5f5..9eb59f793f2c5 100644
--- a/drivers/gpu/drm/i915/display/intel_vblank.c
+++ b/drivers/gpu/drm/i915/display/intel_vblank.c
@@ -708,6 +708,21 @@ void intel_vblank_evade_init(const struct intel_crtc_state *old_crtc_state,
 		evade->min -= vblank_delay;
 }
 
+static bool scanline_in_safe_range(struct intel_vblank_evade_ctx *evade, int *scanline, bool unlocked)
+{
+	unsigned long irqflags;
+
+	if (unlocked)
+		intel_vblank_section_enter_irqf(display, &irqflags);
+
+	position = __intel_get_crtc_scanline(crtc);
+
+	if (unlocked)
+		intel_vblank_section_exit_irqf(display, irqflags);
+
+	return *scanline < evade->min || *scanline > evade->max;
+}
+
 /* must be called with vblank interrupt already enabled! */
 int intel_vblank_evade(struct intel_vblank_evade_ctx *evade)
 {
@@ -715,24 +730,12 @@ int intel_vblank_evade(struct intel_vblank_evade_ctx *evade)
 	struct intel_display *display = to_intel_display(crtc);
 	long timeout = msecs_to_jiffies_timeout(1);
 	wait_queue_head_t *wq = drm_crtc_vblank_waitqueue(&crtc->base);
-	DEFINE_WAIT(wait);
 	int scanline;
 
 	if (evade->min <= 0 || evade->max <= 0)
 		return 0;
 
-	for (;;) {
-		/*
-		 * prepare_to_wait() has a memory barrier, which guarantees
-		 * other CPUs can see the task state update by the time we
-		 * read the scanline.
-		 */
-		prepare_to_wait(wq, &wait, TASK_UNINTERRUPTIBLE);
-
-		scanline = intel_get_crtc_scanline(crtc);
-		if (scanline < evade->min || scanline > evade->max)
-			break;
-
+	while (!scanline_in_safe_range(evade, &scanline, false)) {
 		if (!timeout) {
 			drm_dbg_kms(display->drm,
 				    "Potential atomic update failure on pipe %c\n",
@@ -742,13 +745,11 @@ int intel_vblank_evade(struct intel_vblank_evade_ctx *evade)
 
 		local_irq_enable();
 
-		timeout = schedule_timeout(timeout);
+		timeout = wait_event_timeout(*wq, scanline_in_safe_range(evade, &scanline, true), timeout);
 
 		local_irq_disable();
 	}
 
-	finish_wait(wq, &wait);
-
 	/*
 	 * On VLV/CHV DSI the scanline counter would appear to
 	 * increment approx. 1/3 of a scanline before start of vblank.
diff --git a/drivers/gpu/drm/i915/display/intel_vblank.h b/drivers/gpu/drm/i915/display/intel_vblank.h
index 98d04cacd65f8..aa1974400e9fc 100644
--- a/drivers/gpu/drm/i915/display/intel_vblank.h
+++ b/drivers/gpu/drm/i915/display/intel_vblank.h
@@ -38,6 +38,7 @@ u32 g4x_get_vblank_counter(struct drm_crtc *crtc);
 bool intel_crtc_get_vblank_timestamp(struct drm_crtc *crtc, int *max_error,
 				     ktime_t *vblank_time, bool in_vblank_irq);
 int intel_get_crtc_scanline(struct intel_crtc *crtc);
+int __intel_get_crtc_scanline(struct intel_crtc *crtc);
 void intel_wait_for_pipe_scanline_stopped(struct intel_crtc *crtc);
 void intel_wait_for_pipe_scanline_moving(struct intel_crtc *crtc);
 void intel_crtc_update_active_timings(const struct intel_crtc_state *crtc_state,
-- 
2.51.0


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

* [i915-rt v2 07/16] drm/i915/display: Handle vlv dsi workaround in scanline_in_safe_range too
  2025-12-16  9:22 [i915-rt v2 00/16] drm/i915/display: All patches to make PREEMPT_RT work on i915 + xe Maarten Lankhorst
                   ` (5 preceding siblings ...)
  2025-12-16  9:22 ` [i915-rt v2 06/16] drm/i915/display: Remove locking from intel_vblank_evade " Maarten Lankhorst
@ 2025-12-16  9:22 ` Maarten Lankhorst
  2025-12-16  9:22 ` [i915-rt v2 08/16] drm/i915/display: Make icl_dsi_frame_update use _fw too Maarten Lankhorst
                   ` (10 subsequent siblings)
  17 siblings, 0 replies; 21+ messages in thread
From: Maarten Lankhorst @ 2025-12-16  9:22 UTC (permalink / raw)
  To: intel-xe; +Cc: intel-gfx

Now that we have a macro, might as well handle the VLV dsi workaround
too.

This makes the vblank evasion code slightly more deterministic, by not
looping with interrupts disabled.

Signed-off-by: Maarten Lankhorst <dev@lankhorst.se>
---
 drivers/gpu/drm/i915/display/intel_vblank.c | 36 ++++++++++-----------
 1 file changed, 18 insertions(+), 18 deletions(-)

diff --git a/drivers/gpu/drm/i915/display/intel_vblank.c b/drivers/gpu/drm/i915/display/intel_vblank.c
index 9eb59f793f2c5..772024f1c344e 100644
--- a/drivers/gpu/drm/i915/display/intel_vblank.c
+++ b/drivers/gpu/drm/i915/display/intel_vblank.c
@@ -720,6 +720,24 @@ static bool scanline_in_safe_range(struct intel_vblank_evade_ctx *evade, int *sc
 	if (unlocked)
 		intel_vblank_section_exit_irqf(display, irqflags);
 
+	/*
+	 * On VLV/CHV DSI the scanline counter would appear to
+	 * increment approx. 1/3 of a scanline before start of vblank.
+	 * The registers still get latched at start of vblank however.
+	 * This means we must not write any registers on the first
+	 * line of vblank (since not the whole line is actually in
+	 * vblank). And unfortunately we can't use the interrupt to
+	 * wait here since it will fire too soon. We could use the
+	 * frame start interrupt instead since it will fire after the
+	 * critical scanline, but that would require more changes
+	 * in the interrupt code. So for now we'll just do the nasty
+	 * thing and poll for the bad scanline to pass us by.
+	 *
+	 * FIXME figure out if BXT+ DSI suffers from this as well
+	 */
+	if (evade->need_vlv_dsi_wa && *scanline == evade->vblank_start)
+		return false;
+
 	return *scanline < evade->min || *scanline > evade->max;
 }
 
@@ -750,24 +768,6 @@ int intel_vblank_evade(struct intel_vblank_evade_ctx *evade)
 		local_irq_disable();
 	}
 
-	/*
-	 * On VLV/CHV DSI the scanline counter would appear to
-	 * increment approx. 1/3 of a scanline before start of vblank.
-	 * The registers still get latched at start of vblank however.
-	 * This means we must not write any registers on the first
-	 * line of vblank (since not the whole line is actually in
-	 * vblank). And unfortunately we can't use the interrupt to
-	 * wait here since it will fire too soon. We could use the
-	 * frame start interrupt instead since it will fire after the
-	 * critical scanline, but that would require more changes
-	 * in the interrupt code. So for now we'll just do the nasty
-	 * thing and poll for the bad scanline to pass us by.
-	 *
-	 * FIXME figure out if BXT+ DSI suffers from this as well
-	 */
-	while (evade->need_vlv_dsi_wa && scanline == evade->vblank_start)
-		scanline = intel_get_crtc_scanline(crtc);
-
 	return scanline;
 }
 
-- 
2.51.0


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

* [i915-rt v2 08/16] drm/i915/display: Make icl_dsi_frame_update use _fw too
  2025-12-16  9:22 [i915-rt v2 00/16] drm/i915/display: All patches to make PREEMPT_RT work on i915 + xe Maarten Lankhorst
                   ` (6 preceding siblings ...)
  2025-12-16  9:22 ` [i915-rt v2 07/16] drm/i915/display: Handle vlv dsi workaround in scanline_in_safe_range too Maarten Lankhorst
@ 2025-12-16  9:22 ` Maarten Lankhorst
  2025-12-16  9:22 ` [i915-rt v2 09/16] drm/i915/display: Enable interrupts earlier on PREEMPT_RT Maarten Lankhorst
                   ` (9 subsequent siblings)
  17 siblings, 0 replies; 21+ messages in thread
From: Maarten Lankhorst @ 2025-12-16  9:22 UTC (permalink / raw)
  To: intel-xe; +Cc: intel-gfx

Don't use the dmc lock inside the vblank critical section,
not even as last call.

Signed-off-by: Maarten Lankhorst <dev@lankhorst.se>
---
 drivers/gpu/drm/i915/display/icl_dsi.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/i915/display/icl_dsi.c b/drivers/gpu/drm/i915/display/icl_dsi.c
index dac781f546617..adcd74f855f41 100644
--- a/drivers/gpu/drm/i915/display/icl_dsi.c
+++ b/drivers/gpu/drm/i915/display/icl_dsi.c
@@ -243,8 +243,8 @@ void icl_dsi_frame_update(struct intel_crtc_state *crtc_state)
 	else
 		return;
 
-	intel_de_rmw(display, DSI_CMD_FRMCTL(port), 0,
-		     DSI_FRAME_UPDATE_REQUEST);
+	intel_de_rmw_fw(display, DSI_CMD_FRMCTL(port), 0,
+			DSI_FRAME_UPDATE_REQUEST);
 }
 
 static void dsi_program_swing_and_deemphasis(struct intel_encoder *encoder)
-- 
2.51.0


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

* [i915-rt v2 09/16] drm/i915/display: Enable interrupts earlier on PREEMPT_RT
  2025-12-16  9:22 [i915-rt v2 00/16] drm/i915/display: All patches to make PREEMPT_RT work on i915 + xe Maarten Lankhorst
                   ` (7 preceding siblings ...)
  2025-12-16  9:22 ` [i915-rt v2 08/16] drm/i915/display: Make icl_dsi_frame_update use _fw too Maarten Lankhorst
@ 2025-12-16  9:22 ` Maarten Lankhorst
  2025-12-16  9:22 ` [i915-rt v2 10/16] drm/i915: Use preempt_disable/enable_rt() where recommended Maarten Lankhorst
                   ` (8 subsequent siblings)
  17 siblings, 0 replies; 21+ messages in thread
From: Maarten Lankhorst @ 2025-12-16  9:22 UTC (permalink / raw)
  To: intel-xe; +Cc: intel-gfx

The last part of the vblank evasion is about updating bookkeeping,
not programming hardware registers.

The interrupts cannot stay disabled here on PREEMPT_RT since the
spinlocks get converted to mutexes.

There's still a small race in VRR that needs to be addressed, and
in the other worst case there is a delay of a vblank completion if
the vblank is fired and we schedule on the next vblank, this needs
to be addressed separately.

Signed-off-by: Maarten Lankhorst <dev@lankhorst.se>
---
 drivers/gpu/drm/i915/display/intel_crtc.c | 10 ++++++++++
 1 file changed, 10 insertions(+)

diff --git a/drivers/gpu/drm/i915/display/intel_crtc.c b/drivers/gpu/drm/i915/display/intel_crtc.c
index cb31c9c1c2525..84ab737c50918 100644
--- a/drivers/gpu/drm/i915/display/intel_crtc.c
+++ b/drivers/gpu/drm/i915/display/intel_crtc.c
@@ -703,6 +703,14 @@ void intel_pipe_update_end(struct intel_atomic_state *state,
 	    intel_crtc_has_type(new_crtc_state, INTEL_OUTPUT_DSI))
 		icl_dsi_frame_update(new_crtc_state);
 
+#if IS_ENABLED(CONFIG_PREEMPT_RT)
+	/*
+	 * Timing sensitive register writing completed, non-deterministic
+	 * locking from here on out.
+	 */
+	local_irq_enable();
+#endif
+
 	/* We're still in the vblank-evade critical section, this can't race.
 	 * Would be slightly nice to just grab the vblank count and arm the
 	 * event outside of the critical section - the spinlock might spin for a
@@ -750,7 +758,9 @@ void intel_pipe_update_end(struct intel_atomic_state *state,
 	if (!state->base.legacy_cursor_update)
 		intel_vrr_send_push(NULL, new_crtc_state);
 
+#if !IS_ENABLED(CONFIG_PREEMPT_RT)
 	local_irq_enable();
+#endif
 
 	if (intel_parent_vgpu_active(display))
 		goto out;
-- 
2.51.0


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

* [i915-rt v2 10/16] drm/i915: Use preempt_disable/enable_rt() where recommended
  2025-12-16  9:22 [i915-rt v2 00/16] drm/i915/display: All patches to make PREEMPT_RT work on i915 + xe Maarten Lankhorst
                   ` (8 preceding siblings ...)
  2025-12-16  9:22 ` [i915-rt v2 09/16] drm/i915/display: Enable interrupts earlier on PREEMPT_RT Maarten Lankhorst
@ 2025-12-16  9:22 ` Maarten Lankhorst
  2025-12-16  9:22 ` [i915-rt v2 11/16] PREEMPT_RT injection Maarten Lankhorst
                   ` (7 subsequent siblings)
  17 siblings, 0 replies; 21+ messages in thread
From: Maarten Lankhorst @ 2025-12-16  9:22 UTC (permalink / raw)
  To: intel-xe; +Cc: intel-gfx

From: Mike Galbraith <umgwanakikbuti@gmail.com>

Mario Kleiner suggest in commit
  ad3543ede630f ("drm/intel: Push get_scanout_position() timestamping into kms driver.")

a spots where preemption should be disabled on PREEMPT_RT. The
difference is that on PREEMPT_RT the intel_uncore::lock disables neither
preemption nor interrupts and so region remains preemptible.

The area covers only register reads and writes. The part that worries me
is:
- __intel_get_crtc_scanline() the worst case is 100us if no match is
  found.

- intel_crtc_scanlines_since_frame_timestamp() not sure how long this
  may take in the worst case.

It was in the RT queue for a while and nobody complained.
Disable preemption on PREEPMPT_RT during timestamping.

[bigeasy: patch description.]

Cc: Mario Kleiner <mario.kleiner.de@gmail.com>
Signed-off-by: Mike Galbraith <umgwanakikbuti@gmail.com>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
Signed-off-by: Maarten Lankhorst <dev@lankhorst.se>
---
 drivers/gpu/drm/i915/display/intel_vblank.c | 43 ++++++++++++++++-----
 1 file changed, 33 insertions(+), 10 deletions(-)

diff --git a/drivers/gpu/drm/i915/display/intel_vblank.c b/drivers/gpu/drm/i915/display/intel_vblank.c
index 772024f1c344e..75f334fe25aaa 100644
--- a/drivers/gpu/drm/i915/display/intel_vblank.c
+++ b/drivers/gpu/drm/i915/display/intel_vblank.c
@@ -317,6 +317,20 @@ static void intel_vblank_section_exit(struct intel_display *display)
 	struct drm_i915_private *i915 = to_i915(display->drm);
 	spin_unlock(&i915->uncore.lock);
 }
+
+static void intel_vblank_section_enter_irqf(struct intel_display *display, unsigned long *flags)
+	__acquires(i915->uncore.lock)
+{
+	struct drm_i915_private *i915 = to_i915(display->drm);
+	spin_lock_irqsave(&i915->uncore.lock, *flags);
+}
+
+static void intel_vblank_section_exit_irqf(struct intel_display *display, unsigned long flags)
+	__releases(i915->uncore.lock)
+{
+	struct drm_i915_private *i915 = to_i915(display->drm);
+	spin_unlock_irqrestore(&i915->uncore.lock, flags);
+}
 #else
 static void intel_vblank_section_enter(struct intel_display *display)
 {
@@ -325,6 +339,17 @@ static void intel_vblank_section_enter(struct intel_display *display)
 static void intel_vblank_section_exit(struct intel_display *display)
 {
 }
+
+static void intel_vblank_section_enter_irqf(struct intel_display *display, unsigned long *flags)
+{
+	*flags = 0;
+}
+
+static void intel_vblank_section_exit_irqf(struct intel_display *display, unsigned long flags)
+{
+	if (flags)
+		return;
+}
 #endif
 
 static bool i915_get_crtc_scanoutpos(struct drm_crtc *_crtc,
@@ -361,10 +386,10 @@ static bool i915_get_crtc_scanoutpos(struct drm_crtc *_crtc,
 	 * timing critical raw register reads, potentially with
 	 * preemption disabled, so the following code must not block.
 	 */
-	local_irq_save(irqflags);
-	intel_vblank_section_enter(display);
+	intel_vblank_section_enter_irqf(display, &irqflags);
 
-	/* preempt_disable_rt() should go right here in PREEMPT_RT patchset. */
+	if (IS_ENABLED(CONFIG_PREEMPT_RT))
+		preempt_disable();
 
 	/* Get optional system timestamp before query. */
 	if (stime)
@@ -428,10 +453,10 @@ static bool i915_get_crtc_scanoutpos(struct drm_crtc *_crtc,
 	if (etime)
 		*etime = ktime_get();
 
-	/* preempt_enable_rt() should go right here in PREEMPT_RT patchset. */
+	if (IS_ENABLED(CONFIG_PREEMPT_RT))
+		preempt_enable();
 
-	intel_vblank_section_exit(display);
-	local_irq_restore(irqflags);
+	intel_vblank_section_exit_irqf(display, irqflags);
 
 	/*
 	 * While in vblank, position will be negative
@@ -469,13 +494,11 @@ int intel_get_crtc_scanline(struct intel_crtc *crtc)
 	unsigned long irqflags;
 	int position;
 
-	local_irq_save(irqflags);
-	intel_vblank_section_enter(display);
+	intel_vblank_section_enter_irqf(display, &irqflags);
 
 	position = __intel_get_crtc_scanline(crtc);
 
-	intel_vblank_section_exit(display);
-	local_irq_restore(irqflags);
+	intel_vblank_section_exit_irqf(display, irqflags);
 
 	return position;
 }
-- 
2.51.0


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

* [i915-rt v2 11/16] PREEMPT_RT injection
  2025-12-16  9:22 [i915-rt v2 00/16] drm/i915/display: All patches to make PREEMPT_RT work on i915 + xe Maarten Lankhorst
                   ` (9 preceding siblings ...)
  2025-12-16  9:22 ` [i915-rt v2 10/16] drm/i915: Use preempt_disable/enable_rt() where recommended Maarten Lankhorst
@ 2025-12-16  9:22 ` Maarten Lankhorst
  2025-12-16  9:22 ` [i915-rt v2 12/16] drm/i915/display: Use intel_de_read_fw in colorops Maarten Lankhorst
                   ` (6 subsequent siblings)
  17 siblings, 0 replies; 21+ messages in thread
From: Maarten Lankhorst @ 2025-12-16  9:22 UTC (permalink / raw)
  To: intel-xe; +Cc: intel-gfx

Signed-off-by: Maarten Lankhorst <dev@lankhorst.se>
---
 drivers/gpu/drm/i915/Kconfig.debug | 15 ---------------
 drivers/gpu/drm/xe/Kconfig.debug   |  5 +++++
 kernel/Kconfig.preempt             |  4 ++--
 3 files changed, 7 insertions(+), 17 deletions(-)

diff --git a/drivers/gpu/drm/i915/Kconfig.debug b/drivers/gpu/drm/i915/Kconfig.debug
index 3562a02ef7adc..0ab10ff41e38d 100644
--- a/drivers/gpu/drm/i915/Kconfig.debug
+++ b/drivers/gpu/drm/i915/Kconfig.debug
@@ -233,21 +233,6 @@ config DRM_I915_LOW_LEVEL_TRACEPOINTS
 
 	  If in doubt, say "N".
 
-config DRM_I915_DEBUG_VBLANK_EVADE
-	bool "Enable extra debug warnings for vblank evasion"
-	depends on DRM_I915
-	default n
-	help
-	  Choose this option to turn on extra debug warnings for the
-	  vblank evade mechanism. This gives a warning every time the
-	  the deadline allotted for the vblank evade critical section
-	  is exceeded, even if there isn't an actual risk of missing
-	  the vblank.
-
-	  Recommended for driver developers only.
-
-	  If in doubt, say "N".
-
 config DRM_I915_DEBUG_RUNTIME_PM
 	bool "Enable extra state checking for runtime PM"
 	depends on DRM_I915
diff --git a/drivers/gpu/drm/xe/Kconfig.debug b/drivers/gpu/drm/xe/Kconfig.debug
index 01227c77f6d70..1d5f11c6e88f3 100644
--- a/drivers/gpu/drm/xe/Kconfig.debug
+++ b/drivers/gpu/drm/xe/Kconfig.debug
@@ -30,6 +30,11 @@ config DRM_XE_DEBUG
 
 	  If in doubt, say "N".
 
+config DRM_I915_DEBUG_VBLANK_EVADE
+        def_bool y
+        depends on DRM_XE
+
+
 config DRM_XE_DEBUG_VM
 	bool "Enable extra VM debugging info"
 	default n
diff --git a/kernel/Kconfig.preempt b/kernel/Kconfig.preempt
index da326800c1c9b..68a6d42c55abe 100644
--- a/kernel/Kconfig.preempt
+++ b/kernel/Kconfig.preempt
@@ -87,9 +87,9 @@ config PREEMPT_LAZY
 endchoice
 
 config PREEMPT_RT
-	bool "Fully Preemptible Kernel (Real-Time)"
-	depends on EXPERT && ARCH_SUPPORTS_RT && !COMPILE_TEST
+	def_bool y
 	select PREEMPTION
+	depends on ARCH_SUPPORTS_RT
 	help
 	  This option turns the kernel into a real-time kernel by replacing
 	  various locking primitives (spinlocks, rwlocks, etc.) with
-- 
2.51.0


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

* [i915-rt v2 12/16] drm/i915/display: Use intel_de_read_fw in colorops
  2025-12-16  9:22 [i915-rt v2 00/16] drm/i915/display: All patches to make PREEMPT_RT work on i915 + xe Maarten Lankhorst
                   ` (10 preceding siblings ...)
  2025-12-16  9:22 ` [i915-rt v2 11/16] PREEMPT_RT injection Maarten Lankhorst
@ 2025-12-16  9:22 ` Maarten Lankhorst
  2025-12-16  9:22 ` [i915-rt v2 13/16] drm/i915/gt: Use spin_lock_irq() instead of local_irq_disable() + spin_lock() Maarten Lankhorst
                   ` (5 subsequent siblings)
  17 siblings, 0 replies; 21+ messages in thread
From: Maarten Lankhorst @ 2025-12-16  9:22 UTC (permalink / raw)
  To: intel-xe; +Cc: intel-gfx

This fixes a module load error on PTL:

<4> [363.690050] Call Trace:
<4> [363.690052]  <TASK>
<4> [363.690055]  dump_stack_lvl+0x91/0xf0
<4> [363.690067]  dump_stack+0x10/0x20
<4> [363.690074]  __might_resched+0x174/0x260
<4> [363.690087]  rt_spin_lock+0x63/0x200
<4> [363.690092]  ? intel_dmc_wl_get+0x3c/0x140 [xe]
<4> [363.690470]  ? __lock_acquire+0x1195/0x2860
<4> [363.690487]  intel_dmc_wl_get+0x3c/0x140 [xe]
<4> [363.690842]  intel_color_plane_commit_arm+0xbc/0x140 [xe]
<4> [363.691246]  icl_plane_update_arm+0x23f/0x280 [xe]
<4> [363.691605]  intel_plane_update_arm+0x74/0x170 [xe]
<4> [363.691970]  intel_crtc_planes_update_arm+0x3cb/0x4c0 [xe]
<4> [363.692338]  intel_update_crtc+0x1c3/0x840 [xe]
<4> [363.692742]  ? intel_pre_update_crtc+0x2ce/0x470 [xe]
<4> [363.693125]  ? intel_enable_crtc+0x123/0x150 [xe]
<4> [363.693508]  skl_commit_modeset_enables+0x4c4/0x720 [xe]
<4> [363.693888]  intel_atomic_commit_tail+0xd9d/0x1b30 [xe]
<4> [363.694274]  intel_atomic_commit+0x2e8/0x330 [xe]
<4> [363.694621]  ? intel_atomic_commit+0x2e8/0x330 [xe]
<4> [363.694956]  drm_atomic_commit+0xaf/0xf0
<4> [363.694962]  ? __pfx___drm_printfn_info+0x10/0x10
<4> [363.694978]  drm_client_modeset_commit_atomic+0x25c/0x2b0
<4> [363.695018]  drm_client_modeset_commit_locked+0x63/0x1b0
<4> [363.695029]  drm_client_modeset_commit+0x26/0x50
<4> [363.695035]  __drm_fb_helper_restore_fbdev_mode_unlocked+0xdc/0x110
<4> [363.695045]  drm_fb_helper_set_par+0x2f/0x50
<4> [363.695052]  intel_fbdev_set_par+0x39/0x90 [xe]
<4> [363.695365]  fbcon_init+0x283/0x680
<4> [363.695382]  visual_init+0xf2/0x190
<4> [363.695396]  do_bind_con_driver.isra.0+0x1f1/0x4c0
<4> [363.695416]  do_take_over_console+0x181/0x220
<4> [363.695422]  ? vprintk_default+0x1d/0x30
<4> [363.695436]  do_fbcon_takeover+0x85/0x160
<4> [363.695447]  do_fb_registered+0x24c/0x2b0
<4> [363.695460]  fbcon_fb_registered+0x3a/0x90
<4> [363.695469]  do_register_framebuffer+0x216/0x320
<4> [363.695488]  register_framebuffer+0x23/0x50
<4> [363.695494]  __drm_fb_helper_initial_config_and_unlock+0x3ea/0x670
<4> [363.695502]  ? trace_hardirqs_on+0x1e/0xd0
<4> [363.695526]  drm_fb_helper_initial_config+0x3f/0x50
<4> [363.695534]  drm_fbdev_client_hotplug+0x80/0xd0
<4> [363.695543]  drm_client_register+0x8a/0xe0
<4> [363.695556]  drm_fbdev_client_setup+0x127/0x1f0
<4> [363.695563]  drm_client_setup+0xa7/0xe0
<4> [363.695569]  drm_client_setup_with_color_mode+0x24/0x40
<4> [363.695575]  intel_fbdev_setup+0x1c6/0x510 [xe]
<4> [363.695857]  intel_display_driver_register+0xb5/0x100 [xe]
<4> [363.696188]  ? __pfx___drm_printfn_dbg+0x10/0x10
<4> [363.696194]  ? intel_display_driver_register+0x2e/0x100 [xe]
<4> [363.696515]  xe_display_register+0x29/0x40 [xe]
<4> [363.696858]  xe_device_probe+0x51a/0x9e0 [xe]
<4> [363.697102]  ? __drmm_add_action+0x98/0x110
<4> [363.697108]  ? __pfx___drmm_mutex_release+0x10/0x10
<4> [363.697116]  ? __drmm_add_action_or_reset+0x1e/0x50
<4> [363.697130]  xe_pci_probe+0x396/0x620 [xe]
<4> [363.697423]  local_pci_probe+0x47/0xb0
<4> [363.697431]  pci_device_probe+0xf3/0x260
<4> [363.697444]  really_probe+0xf1/0x3c0
<4> [363.697451]  __driver_probe_device+0x8c/0x180
<4> [363.697458]  driver_probe_device+0x24/0xd0
<4> [363.697464]  __driver_attach+0x10f/0x220
<4> [363.697468]  ? __pfx___driver_attach+0x10/0x10
<4> [363.697472]  bus_for_each_dev+0x7f/0xe0
<4> [363.697484]  driver_attach+0x1e/0x30
<4> [363.697487]  bus_add_driver+0x154/0x290
<4> [363.697498]  driver_register+0x5e/0x130
<4> [363.697504]  __pci_register_driver+0x84/0xa0
<4> [363.697509]  xe_register_pci_driver+0x23/0x30 [xe]
<4> [363.697762]  xe_init+0x2c/0x110 [xe]
<4> [363.698007]  ? __pfx_xe_init+0x10/0x10 [xe]
<4> [363.698239]  do_one_initcall+0x60/0x3f0
<4> [363.698250]  ? __kmalloc_cache_noprof+0x470/0x690
<4> [363.698267]  do_init_module+0x97/0x2b0
<4> [363.698275]  load_module+0x2d08/0x2e30
<4> [363.698280]  ? __kernel_read+0x164/0x310
<4> [363.698312]  ? kernel_read_file+0x2ca/0x340
<4> [363.698328]  init_module_from_file+0x96/0xe0
<4> [363.698330]  ? init_module_from_file+0x96/0xe0
<4> [363.698357]  idempotent_init_module+0x11d/0x340
<4> [363.698384]  __x64_sys_finit_module+0x73/0xe0
<4> [363.698393]  x64_sys_call+0x1e3d/0x26a0
<4> [363.698399]  do_syscall_64+0x93/0xab0
<4> [363.698413]  ? ext4_llseek+0xc3/0x130
<4> [363.698425]  ? ksys_lseek+0x55/0xd0
<4> [363.698438]  ? do_syscall_64+0x1b7/0xab0
<4> [363.698444]  ? switch_fpu_return+0xea/0x150
<4> [363.698454]  ? do_syscall_64+0x1b7/0xab0
<4> [363.698465]  ? kernfs_fop_read_iter+0x197/0x210
<4> [363.698470]  ? rw_verify_area+0x16f/0x200
<4> [363.698482]  ? vfs_read+0x22a/0x360
<4> [363.698498]  ? do_syscall_64+0x1b7/0xab0
<4> [363.698506]  ? ksys_read+0x72/0xf0
<4> [363.698520]  ? do_syscall_64+0x1b7/0xab0
<4> [363.698526]  ? do_syscall_64+0x1b7/0xab0
<4> [363.698532]  ? do_syscall_64+0x1b7/0xab0
<4> [363.698535]  ? exc_page_fault+0xbd/0x2c0
<4> [363.698545]  entry_SYSCALL_64_after_hwframe+0x76/0x7e
<4> [363.698549] RIP: 0033:0x715af255025d

Signed-off-by: Maarten Lankhorst <dev@lankhorst.se>
---
 drivers/gpu/drm/i915/display/intel_color.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/i915/display/intel_color.c b/drivers/gpu/drm/i915/display/intel_color.c
index e7950655434b8..d15f4e78ffa5e 100644
--- a/drivers/gpu/drm/i915/display/intel_color.c
+++ b/drivers/gpu/drm/i915/display/intel_color.c
@@ -4078,7 +4078,7 @@ static void glk_load_lut_3d(struct intel_dsb *dsb,
 	int i, lut_size = drm_color_lut32_size(blob);
 	enum pipe pipe = crtc->pipe;
 
-	if (!dsb && intel_de_read(display, LUT_3D_CTL(pipe)) & LUT_3D_READY) {
+	if (!dsb && intel_de_read_fw(display, LUT_3D_CTL(pipe)) & LUT_3D_READY) {
 		drm_err(display->drm, "[CRTC:%d:%s] 3D LUT not ready, not loading LUTs\n",
 			crtc->base.base.id, crtc->base.name);
 		return;
@@ -4096,7 +4096,7 @@ static void glk_lut_3d_commit(struct intel_dsb *dsb, struct intel_crtc *crtc, bo
 	enum pipe pipe = crtc->pipe;
 	u32 val = 0;
 
-	if (!dsb && intel_de_read(display, LUT_3D_CTL(pipe)) & LUT_3D_READY) {
+	if (!dsb && intel_de_read_fw(display, LUT_3D_CTL(pipe)) & LUT_3D_READY) {
 		drm_err(display->drm, "[CRTC:%d:%s] 3D LUT not ready, not committing change\n",
 			crtc->base.base.id, crtc->base.name);
 		return;
-- 
2.51.0


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

* [i915-rt v2 13/16] drm/i915/gt: Use spin_lock_irq() instead of local_irq_disable() + spin_lock()
  2025-12-16  9:22 [i915-rt v2 00/16] drm/i915/display: All patches to make PREEMPT_RT work on i915 + xe Maarten Lankhorst
                   ` (11 preceding siblings ...)
  2025-12-16  9:22 ` [i915-rt v2 12/16] drm/i915/display: Use intel_de_read_fw in colorops Maarten Lankhorst
@ 2025-12-16  9:22 ` Maarten Lankhorst
  2025-12-16  9:22 ` [i915-rt v2 14/16] drm/i915: Drop the irqs_disabled() check Maarten Lankhorst
                   ` (4 subsequent siblings)
  17 siblings, 0 replies; 21+ messages in thread
From: Maarten Lankhorst @ 2025-12-16  9:22 UTC (permalink / raw)
  To: intel-xe; +Cc: intel-gfx

From: Sebastian Andrzej Siewior <bigeasy@linutronix.de>

execlists_dequeue() is invoked from a function which uses
local_irq_disable() to disable interrupts so the spin_lock() behaves
like spin_lock_irq().
This breaks PREEMPT_RT because local_irq_disable() + spin_lock() is not
the same as spin_lock_irq().

execlists_dequeue_irq() and execlists_dequeue() has each one caller
only. If intel_engine_cs::active::lock is acquired and released with the
_irq suffix then it behaves almost as if execlists_dequeue() would be
invoked with disabled interrupts. The difference is the last part of the
function which is then invoked with enabled interrupts.
I can't tell if this makes a difference. From looking at it, it might
work to move the last unlock at the end of the function as I didn't find
anything that would acquire the lock again.

Reported-by: Clark Williams <williams@redhat.com>
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
Reviewed-by: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>
Signed-off-by: Maarten Lankhorst <dev@lankhorst.se>
---
 .../drm/i915/gt/intel_execlists_submission.c    | 17 +++++------------
 1 file changed, 5 insertions(+), 12 deletions(-)

diff --git a/drivers/gpu/drm/i915/gt/intel_execlists_submission.c b/drivers/gpu/drm/i915/gt/intel_execlists_submission.c
index 3df683b0402ad..948975e72d295 100644
--- a/drivers/gpu/drm/i915/gt/intel_execlists_submission.c
+++ b/drivers/gpu/drm/i915/gt/intel_execlists_submission.c
@@ -1300,7 +1300,7 @@ static void execlists_dequeue(struct intel_engine_cs *engine)
 	 * and context switches) submission.
 	 */
 
-	spin_lock(&sched_engine->lock);
+	spin_lock_irq(&sched_engine->lock);
 
 	/*
 	 * If the queue is higher priority than the last
@@ -1400,7 +1400,7 @@ static void execlists_dequeue(struct intel_engine_cs *engine)
 				 * Even if ELSP[1] is occupied and not worthy
 				 * of timeslices, our queue might be.
 				 */
-				spin_unlock(&sched_engine->lock);
+				spin_unlock_irq(&sched_engine->lock);
 				return;
 			}
 		}
@@ -1426,7 +1426,7 @@ static void execlists_dequeue(struct intel_engine_cs *engine)
 
 		if (last && !can_merge_rq(last, rq)) {
 			spin_unlock(&ve->base.sched_engine->lock);
-			spin_unlock(&engine->sched_engine->lock);
+			spin_unlock_irq(&engine->sched_engine->lock);
 			return; /* leave this for another sibling */
 		}
 
@@ -1588,7 +1588,7 @@ static void execlists_dequeue(struct intel_engine_cs *engine)
 	 */
 	sched_engine->queue_priority_hint = queue_prio(sched_engine);
 	i915_sched_engine_reset_on_empty(sched_engine);
-	spin_unlock(&sched_engine->lock);
+	spin_unlock_irq(&sched_engine->lock);
 
 	/*
 	 * We can skip poking the HW if we ended up with exactly the same set
@@ -1614,13 +1614,6 @@ static void execlists_dequeue(struct intel_engine_cs *engine)
 	}
 }
 
-static void execlists_dequeue_irq(struct intel_engine_cs *engine)
-{
-	local_irq_disable(); /* Suspend interrupts across request submission */
-	execlists_dequeue(engine);
-	local_irq_enable(); /* flush irq_work (e.g. breadcrumb enabling) */
-}
-
 static void clear_ports(struct i915_request **ports, int count)
 {
 	memset_p((void **)ports, NULL, count);
@@ -2475,7 +2468,7 @@ static void execlists_submission_tasklet(struct tasklet_struct *t)
 	}
 
 	if (!engine->execlists.pending[0]) {
-		execlists_dequeue_irq(engine);
+		execlists_dequeue(engine);
 		start_timeslice(engine);
 	}
 
-- 
2.51.0


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

* [i915-rt v2 14/16] drm/i915: Drop the irqs_disabled() check
  2025-12-16  9:22 [i915-rt v2 00/16] drm/i915/display: All patches to make PREEMPT_RT work on i915 + xe Maarten Lankhorst
                   ` (12 preceding siblings ...)
  2025-12-16  9:22 ` [i915-rt v2 13/16] drm/i915/gt: Use spin_lock_irq() instead of local_irq_disable() + spin_lock() Maarten Lankhorst
@ 2025-12-16  9:22 ` Maarten Lankhorst
  2025-12-16  9:22 ` [i915-rt v2 15/16] drm/i915/guc: Consider also RCU depth in busy loop Maarten Lankhorst
                   ` (3 subsequent siblings)
  17 siblings, 0 replies; 21+ messages in thread
From: Maarten Lankhorst @ 2025-12-16  9:22 UTC (permalink / raw)
  To: intel-xe; +Cc: intel-gfx

From: Sebastian Andrzej Siewior <bigeasy@linutronix.de>

The !irqs_disabled() check triggers on PREEMPT_RT even with
i915_sched_engine::lock acquired. The reason is the lock is transformed
into a sleeping lock on PREEMPT_RT and does not disable interrupts.

There is no need to check for disabled interrupts. The lockdep
annotation below already check if the lock has been acquired by the
caller and will yell if the interrupts are not disabled.

Remove the !irqs_disabled() check.

Reported-by: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>
Acked-by: Tvrtko Ursulin <tvrtko.ursulin@igalia.com>
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
Signed-off-by: Maarten Lankhorst <dev@lankhorst.se>
---
 drivers/gpu/drm/i915/i915_request.c | 2 --
 1 file changed, 2 deletions(-)

diff --git a/drivers/gpu/drm/i915/i915_request.c b/drivers/gpu/drm/i915/i915_request.c
index 4399941236cbf..d82105408bd8f 100644
--- a/drivers/gpu/drm/i915/i915_request.c
+++ b/drivers/gpu/drm/i915/i915_request.c
@@ -610,7 +610,6 @@ bool __i915_request_submit(struct i915_request *request)
 
 	RQ_TRACE(request, "\n");
 
-	GEM_BUG_ON(!irqs_disabled());
 	lockdep_assert_held(&engine->sched_engine->lock);
 
 	/*
@@ -719,7 +718,6 @@ void __i915_request_unsubmit(struct i915_request *request)
 	 */
 	RQ_TRACE(request, "\n");
 
-	GEM_BUG_ON(!irqs_disabled());
 	lockdep_assert_held(&engine->sched_engine->lock);
 
 	/*
-- 
2.51.0


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

* [i915-rt v2 15/16] drm/i915/guc: Consider also RCU depth in busy loop.
  2025-12-16  9:22 [i915-rt v2 00/16] drm/i915/display: All patches to make PREEMPT_RT work on i915 + xe Maarten Lankhorst
                   ` (13 preceding siblings ...)
  2025-12-16  9:22 ` [i915-rt v2 14/16] drm/i915: Drop the irqs_disabled() check Maarten Lankhorst
@ 2025-12-16  9:22 ` Maarten Lankhorst
  2025-12-16  9:22 ` [i915-rt v2 16/16] Revert "drm/i915: Depend on !PREEMPT_RT." Maarten Lankhorst
                   ` (2 subsequent siblings)
  17 siblings, 0 replies; 21+ messages in thread
From: Maarten Lankhorst @ 2025-12-16  9:22 UTC (permalink / raw)
  To: intel-xe; +Cc: intel-gfx

From: Sebastian Andrzej Siewior <bigeasy@linutronix.de>

intel_guc_send_busy_loop() looks at in_atomic() and irqs_disabled() to
decide if it should busy-spin while waiting or if it may sleep.
Both checks will report false on PREEMPT_RT if sleeping spinlocks are
acquired leading to RCU splats while the function sleeps.

Check also if RCU has been disabled.

Reported-by: "John B. Wyatt IV" <jwyatt@redhat.com>
Reviewed-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
Signed-off-by: Maarten Lankhorst <dev@lankhorst.se>
---
 drivers/gpu/drm/i915/gt/uc/intel_guc.h | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/i915/gt/uc/intel_guc.h b/drivers/gpu/drm/i915/gt/uc/intel_guc.h
index 053780f562c1a..b25fa8f4dc4bd 100644
--- a/drivers/gpu/drm/i915/gt/uc/intel_guc.h
+++ b/drivers/gpu/drm/i915/gt/uc/intel_guc.h
@@ -362,7 +362,7 @@ static inline int intel_guc_send_busy_loop(struct intel_guc *guc,
 {
 	int err;
 	unsigned int sleep_period_ms = 1;
-	bool not_atomic = !in_atomic() && !irqs_disabled();
+	bool not_atomic = !in_atomic() && !irqs_disabled() && !rcu_preempt_depth();
 
 	/*
 	 * FIXME: Have caller pass in if we are in an atomic context to avoid
-- 
2.51.0


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

* [i915-rt v2 16/16] Revert "drm/i915: Depend on !PREEMPT_RT."
  2025-12-16  9:22 [i915-rt v2 00/16] drm/i915/display: All patches to make PREEMPT_RT work on i915 + xe Maarten Lankhorst
                   ` (14 preceding siblings ...)
  2025-12-16  9:22 ` [i915-rt v2 15/16] drm/i915/guc: Consider also RCU depth in busy loop Maarten Lankhorst
@ 2025-12-16  9:22 ` Maarten Lankhorst
  2025-12-16 13:51 ` ✗ CI.checkpatch: warning for drm/i915/display: All patches to make PREEMPT_RT work on i915 + xe. (rev2) Patchwork
  2025-12-16 13:52 ` ✓ CI.KUnit: success " Patchwork
  17 siblings, 0 replies; 21+ messages in thread
From: Maarten Lankhorst @ 2025-12-16  9:22 UTC (permalink / raw)
  To: intel-xe; +Cc: intel-gfx

From: Sebastian Andrzej Siewior <bigeasy@linutronix.de>

Once the known issues are addressed, it should be safe to enable the
driver.

Acked-by: Tvrtko Ursulin <tvrtko.ursulin@igalia.com>
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
Signed-off-by: Maarten Lankhorst <dev@lankhorst.se>
---
 drivers/gpu/drm/i915/Kconfig | 1 -
 1 file changed, 1 deletion(-)

diff --git a/drivers/gpu/drm/i915/Kconfig b/drivers/gpu/drm/i915/Kconfig
index 5e939004b6463..40a9234e6e5dc 100644
--- a/drivers/gpu/drm/i915/Kconfig
+++ b/drivers/gpu/drm/i915/Kconfig
@@ -3,7 +3,6 @@ config DRM_I915
 	tristate "Intel 8xx/9xx/G3x/G4x/HD Graphics"
 	depends on DRM
 	depends on X86 && PCI
-	depends on !PREEMPT_RT
 	select INTEL_GTT if X86
 	select INTERVAL_TREE
 	# we need shmfs for the swappable backing store, and in particular
-- 
2.51.0


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

* ✗ CI.checkpatch: warning for drm/i915/display: All patches to make PREEMPT_RT work on i915 + xe. (rev2)
  2025-12-16  9:22 [i915-rt v2 00/16] drm/i915/display: All patches to make PREEMPT_RT work on i915 + xe Maarten Lankhorst
                   ` (15 preceding siblings ...)
  2025-12-16  9:22 ` [i915-rt v2 16/16] Revert "drm/i915: Depend on !PREEMPT_RT." Maarten Lankhorst
@ 2025-12-16 13:51 ` Patchwork
  2025-12-16 13:52 ` ✓ CI.KUnit: success " Patchwork
  17 siblings, 0 replies; 21+ messages in thread
From: Patchwork @ 2025-12-16 13:51 UTC (permalink / raw)
  To: Maarten Lankhorst; +Cc: intel-xe

== Series Details ==

Series: drm/i915/display: All patches to make PREEMPT_RT work on i915 + xe. (rev2)
URL   : https://patchwork.freedesktop.org/series/159034/
State : warning

== Summary ==

+ KERNEL=/kernel
+ git clone https://gitlab.freedesktop.org/drm/maintainer-tools mt
Cloning into 'mt'...
warning: redirecting to https://gitlab.freedesktop.org/drm/maintainer-tools.git/
+ git -C mt rev-list -n1 origin/master
8f50e69d0ce3656564bbdf8b3e213d61470d463f
+ cd /kernel
+ git config --global --add safe.directory /kernel
+ git log -n1
commit 644268f0458823ab3c4010bbf74d7d4b94dd4505
Author: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
Date:   Tue Dec 16 10:22:43 2025 +0100

    Revert "drm/i915: Depend on !PREEMPT_RT."
    
    Once the known issues are addressed, it should be safe to enable the
    driver.
    
    Acked-by: Tvrtko Ursulin <tvrtko.ursulin@igalia.com>
    Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
    Signed-off-by: Maarten Lankhorst <dev@lankhorst.se>
+ /mt/dim checkpatch 2dc4a4ece453df925f995df5eac747a29081c180 drm-intel
2dcbe9cc013b drm/i915/display: Fix intel_lpe_audio_irq_handler for PREEMPT-RT
-:11: WARNING:COMMIT_LOG_LONG_LINE: Prefer a maximum 75 chars per line (possible unwrapped commit description?)
#11: 
Because intel_lpe_audio_irq_handler() may be called in threaded IRQ context,

total: 0 errors, 1 warnings, 0 checks, 8 lines checked
9467b855df01 drm/i915/display: Make get_vblank_counter use intel_de_read_fw()
-:8: WARNING:COMMIT_LOG_LONG_LINE: Prefer a maximum 75 chars per line (possible unwrapped commit description?)
#8: 
<3> BUG: sleeping function called from invalid context at kernel/locking/spinlock_rt.c:48

total: 0 errors, 1 warnings, 0 checks, 8 lines checked
c761e19ec97c drm/i915/display: Use intel_de_write_fw in intel_pipe_fastset
-:14: WARNING:COMMIT_LOG_LONG_LINE: Prefer a maximum 75 chars per line (possible unwrapped commit description?)
#14: 
<3> BUG: sleeping function called from invalid context at kernel/locking/spinlock_rt.c:48

-:201: WARNING:MISSING_FIXES_TAG: The commit message has 'Call Trace:', perhaps it also needs a 'Fixes:' tag?

total: 0 errors, 2 warnings, 0 checks, 110 lines checked
cd203a5ac692 drm/i915/display: Make set_pipeconf use the fw variants
-:11: WARNING:COMMIT_LOG_LONG_LINE: Prefer a maximum 75 chars per line (possible unwrapped commit description?)
#11: 
| BUG: sleeping function called from invalid context at kernel/locking/spinlock_rt.c:48

-:46: WARNING:BAD_REPORTED_BY_LINK: Reported-by: should be immediately followed by Closes: with a URL to the report
#46: 
Reported-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
Signed-off-by: Maarten Lankhorst <dev@lankhorst.se>

-:76: WARNING:MISSING_FIXES_TAG: The commit message has 'Call Trace:', perhaps it also needs a 'Fixes:' tag?

total: 0 errors, 3 warnings, 0 checks, 22 lines checked
829cefaf0e40 drm/i915/display: Move vblank put until after critical section
64595979b552 drm/i915/display: Remove locking from intel_vblank_evade critical section
-:38: WARNING:LONG_LINE: line length of 102 exceeds 100 columns
#38: FILE: drivers/gpu/drm/i915/display/intel_vblank.c:711:
+static bool scanline_in_safe_range(struct intel_vblank_evade_ctx *evade, int *scanline, bool unlocked)

-:87: WARNING:LONG_LINE: line length of 107 exceeds 100 columns
#87: FILE: drivers/gpu/drm/i915/display/intel_vblank.c:748:
+		timeout = wait_event_timeout(*wq, scanline_in_safe_range(evade, &scanline, true), timeout);

total: 0 errors, 2 warnings, 0 checks, 75 lines checked
0f0bbd983332 drm/i915/display: Handle vlv dsi workaround in scanline_in_safe_range too
74009f693439 drm/i915/display: Make icl_dsi_frame_update use _fw too
0d274b086d73 drm/i915/display: Enable interrupts earlier on PREEMPT_RT
c9ae33eb092c drm/i915: Use preempt_disable/enable_rt() where recommended
-:7: WARNING:COMMIT_LOG_LONG_LINE: Prefer a maximum 75 chars per line (possible unwrapped commit description?)
#7: 
  ad3543ede630f ("drm/intel: Push get_scanout_position() timestamping into kms driver.")

-:45: WARNING:LINE_SPACING: Missing a blank line after declarations
#45: FILE: drivers/gpu/drm/i915/display/intel_vblank.c:325:
+	struct drm_i915_private *i915 = to_i915(display->drm);
+	spin_lock_irqsave(&i915->uncore.lock, *flags);

-:52: WARNING:LINE_SPACING: Missing a blank line after declarations
#52: FILE: drivers/gpu/drm/i915/display/intel_vblank.c:332:
+	struct drm_i915_private *i915 = to_i915(display->drm);
+	spin_unlock_irqrestore(&i915->uncore.lock, flags);

total: 0 errors, 3 warnings, 0 checks, 78 lines checked
c9eb4f763466 PREEMPT_RT injection
-:7: WARNING:COMMIT_MESSAGE: Missing commit description - Add an appropriate one

total: 0 errors, 1 warnings, 0 checks, 43 lines checked
ba5c92a868da drm/i915/display: Use intel_de_read_fw in colorops
-:131: WARNING:MISSING_FIXES_TAG: The commit message has 'Call Trace:', perhaps it also needs a 'Fixes:' tag?

total: 0 errors, 1 warnings, 0 checks, 16 lines checked
4efcfbb796df drm/i915/gt: Use spin_lock_irq() instead of local_irq_disable() + spin_lock()
-:22: WARNING:BAD_REPORTED_BY_LINK: Reported-by: should be immediately followed by Closes: with a URL to the report
#22: 
Reported-by: Clark Williams <williams@redhat.com>
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>

total: 0 errors, 1 warnings, 0 checks, 53 lines checked
382352a87a44 drm/i915: Drop the irqs_disabled() check
-:16: WARNING:BAD_REPORTED_BY_LINK: Reported-by: should be immediately followed by Closes: with a URL to the report
#16: 
Reported-by: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>
Acked-by: Tvrtko Ursulin <tvrtko.ursulin@igalia.com>

total: 0 errors, 1 warnings, 0 checks, 14 lines checked
42329db14a43 drm/i915/guc: Consider also RCU depth in busy loop.
-:13: WARNING:BAD_REPORTED_BY_LINK: Reported-by: should be immediately followed by Closes: with a URL to the report
#13: 
Reported-by: "John B. Wyatt IV" <jwyatt@redhat.com>
Reviewed-by: Rodrigo Vivi <rodrigo.vivi@intel.com>

-:27: ERROR:IN_ATOMIC: do not use in_atomic in drivers
#27: FILE: drivers/gpu/drm/i915/gt/uc/intel_guc.h:365:
+	bool not_atomic = !in_atomic() && !irqs_disabled() && !rcu_preempt_depth();

total: 1 errors, 1 warnings, 0 checks, 8 lines checked
644268f04588 Revert "drm/i915: Depend on !PREEMPT_RT."



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

* ✓ CI.KUnit: success for drm/i915/display: All patches to make PREEMPT_RT work on i915 + xe. (rev2)
  2025-12-16  9:22 [i915-rt v2 00/16] drm/i915/display: All patches to make PREEMPT_RT work on i915 + xe Maarten Lankhorst
                   ` (16 preceding siblings ...)
  2025-12-16 13:51 ` ✗ CI.checkpatch: warning for drm/i915/display: All patches to make PREEMPT_RT work on i915 + xe. (rev2) Patchwork
@ 2025-12-16 13:52 ` Patchwork
  17 siblings, 0 replies; 21+ messages in thread
From: Patchwork @ 2025-12-16 13:52 UTC (permalink / raw)
  To: Maarten Lankhorst; +Cc: intel-xe

== Series Details ==

Series: drm/i915/display: All patches to make PREEMPT_RT work on i915 + xe. (rev2)
URL   : https://patchwork.freedesktop.org/series/159034/
State : success

== Summary ==

+ trap cleanup EXIT
+ /kernel/tools/testing/kunit/kunit.py run --kunitconfig /kernel/drivers/gpu/drm/xe/.kunitconfig
[13:51:33] Configuring KUnit Kernel ...
Generating .config ...
Populating config with:
$ make ARCH=um O=.kunit olddefconfig
[13:51:37] Building KUnit Kernel ...
Populating config with:
$ make ARCH=um O=.kunit olddefconfig
Building with:
$ make all compile_commands.json scripts_gdb ARCH=um O=.kunit --jobs=48
[13:52:08] Starting KUnit Kernel (1/1)...
[13:52:08] ============================================================
Running tests with:
$ .kunit/linux kunit.enable=1 mem=1G console=tty kunit_shutdown=halt
[13:52:09] ================== guc_buf (11 subtests) ===================
[13:52:09] [PASSED] test_smallest
[13:52:09] [PASSED] test_largest
[13:52:09] [PASSED] test_granular
[13:52:09] [PASSED] test_unique
[13:52:09] [PASSED] test_overlap
[13:52:09] [PASSED] test_reusable
[13:52:09] [PASSED] test_too_big
[13:52:09] [PASSED] test_flush
[13:52:09] [PASSED] test_lookup
[13:52:09] [PASSED] test_data
[13:52:09] [PASSED] test_class
[13:52:09] ===================== [PASSED] guc_buf =====================
[13:52:09] =================== guc_dbm (7 subtests) ===================
[13:52:09] [PASSED] test_empty
[13:52:09] [PASSED] test_default
[13:52:09] ======================== test_size  ========================
[13:52:09] [PASSED] 4
[13:52:09] [PASSED] 8
[13:52:09] [PASSED] 32
[13:52:09] [PASSED] 256
[13:52:09] ==================== [PASSED] test_size ====================
[13:52:09] ======================= test_reuse  ========================
[13:52:09] [PASSED] 4
[13:52:09] [PASSED] 8
[13:52:09] [PASSED] 32
[13:52:09] [PASSED] 256
[13:52:09] =================== [PASSED] test_reuse ====================
[13:52:09] =================== test_range_overlap  ====================
[13:52:09] [PASSED] 4
[13:52:09] [PASSED] 8
[13:52:09] [PASSED] 32
[13:52:09] [PASSED] 256
[13:52:09] =============== [PASSED] test_range_overlap ================
[13:52:09] =================== test_range_compact  ====================
[13:52:09] [PASSED] 4
[13:52:09] [PASSED] 8
[13:52:09] [PASSED] 32
[13:52:09] [PASSED] 256
[13:52:09] =============== [PASSED] test_range_compact ================
[13:52:09] ==================== test_range_spare  =====================
[13:52:09] [PASSED] 4
[13:52:09] [PASSED] 8
[13:52:09] [PASSED] 32
[13:52:09] [PASSED] 256
[13:52:09] ================ [PASSED] test_range_spare =================
[13:52:09] ===================== [PASSED] guc_dbm =====================
[13:52:09] =================== guc_idm (6 subtests) ===================
[13:52:09] [PASSED] bad_init
[13:52:09] [PASSED] no_init
[13:52:09] [PASSED] init_fini
[13:52:09] [PASSED] check_used
[13:52:09] [PASSED] check_quota
[13:52:09] [PASSED] check_all
[13:52:09] ===================== [PASSED] guc_idm =====================
[13:52:09] ================== no_relay (3 subtests) ===================
[13:52:09] [PASSED] xe_drops_guc2pf_if_not_ready
[13:52:09] [PASSED] xe_drops_guc2vf_if_not_ready
[13:52:09] [PASSED] xe_rejects_send_if_not_ready
[13:52:09] ==================== [PASSED] no_relay =====================
[13:52:09] ================== pf_relay (14 subtests) ==================
[13:52:09] [PASSED] pf_rejects_guc2pf_too_short
[13:52:09] [PASSED] pf_rejects_guc2pf_too_long
[13:52:09] [PASSED] pf_rejects_guc2pf_no_payload
[13:52:09] [PASSED] pf_fails_no_payload
[13:52:09] [PASSED] pf_fails_bad_origin
[13:52:09] [PASSED] pf_fails_bad_type
[13:52:09] [PASSED] pf_txn_reports_error
[13:52:09] [PASSED] pf_txn_sends_pf2guc
[13:52:09] [PASSED] pf_sends_pf2guc
[13:52:09] [SKIPPED] pf_loopback_nop
[13:52:09] [SKIPPED] pf_loopback_echo
[13:52:09] [SKIPPED] pf_loopback_fail
[13:52:09] [SKIPPED] pf_loopback_busy
[13:52:09] [SKIPPED] pf_loopback_retry
[13:52:09] ==================== [PASSED] pf_relay =====================
[13:52:09] ================== vf_relay (3 subtests) ===================
[13:52:09] [PASSED] vf_rejects_guc2vf_too_short
[13:52:09] [PASSED] vf_rejects_guc2vf_too_long
[13:52:09] [PASSED] vf_rejects_guc2vf_no_payload
[13:52:09] ==================== [PASSED] vf_relay =====================
[13:52:09] ================ pf_gt_config (6 subtests) =================
[13:52:09] [PASSED] fair_contexts_1vf
[13:52:09] [PASSED] fair_doorbells_1vf
[13:52:09] [PASSED] fair_ggtt_1vf
[13:52:09] ====================== fair_contexts  ======================
[13:52:09] [PASSED] 1 VF
[13:52:09] [PASSED] 2 VFs
[13:52:09] [PASSED] 3 VFs
[13:52:09] [PASSED] 4 VFs
[13:52:09] [PASSED] 5 VFs
[13:52:09] [PASSED] 6 VFs
[13:52:09] [PASSED] 7 VFs
[13:52:09] [PASSED] 8 VFs
[13:52:09] [PASSED] 9 VFs
[13:52:09] [PASSED] 10 VFs
[13:52:09] [PASSED] 11 VFs
[13:52:09] [PASSED] 12 VFs
[13:52:09] [PASSED] 13 VFs
[13:52:09] [PASSED] 14 VFs
[13:52:09] [PASSED] 15 VFs
[13:52:09] [PASSED] 16 VFs
[13:52:09] [PASSED] 17 VFs
[13:52:09] [PASSED] 18 VFs
[13:52:09] [PASSED] 19 VFs
[13:52:09] [PASSED] 20 VFs
[13:52:09] [PASSED] 21 VFs
[13:52:09] [PASSED] 22 VFs
[13:52:09] [PASSED] 23 VFs
[13:52:09] [PASSED] 24 VFs
[13:52:09] [PASSED] 25 VFs
[13:52:09] [PASSED] 26 VFs
[13:52:09] [PASSED] 27 VFs
[13:52:09] [PASSED] 28 VFs
[13:52:09] [PASSED] 29 VFs
[13:52:09] [PASSED] 30 VFs
[13:52:09] [PASSED] 31 VFs
[13:52:09] [PASSED] 32 VFs
[13:52:09] [PASSED] 33 VFs
[13:52:09] [PASSED] 34 VFs
[13:52:09] [PASSED] 35 VFs
[13:52:09] [PASSED] 36 VFs
[13:52:09] [PASSED] 37 VFs
[13:52:09] [PASSED] 38 VFs
[13:52:09] [PASSED] 39 VFs
[13:52:09] [PASSED] 40 VFs
[13:52:09] [PASSED] 41 VFs
[13:52:09] [PASSED] 42 VFs
[13:52:09] [PASSED] 43 VFs
[13:52:09] [PASSED] 44 VFs
[13:52:09] [PASSED] 45 VFs
[13:52:09] [PASSED] 46 VFs
[13:52:09] [PASSED] 47 VFs
[13:52:09] [PASSED] 48 VFs
[13:52:09] [PASSED] 49 VFs
[13:52:09] [PASSED] 50 VFs
[13:52:09] [PASSED] 51 VFs
[13:52:09] [PASSED] 52 VFs
[13:52:09] [PASSED] 53 VFs
[13:52:09] [PASSED] 54 VFs
[13:52:09] [PASSED] 55 VFs
[13:52:09] [PASSED] 56 VFs
[13:52:09] [PASSED] 57 VFs
[13:52:09] [PASSED] 58 VFs
[13:52:09] [PASSED] 59 VFs
[13:52:09] [PASSED] 60 VFs
[13:52:09] [PASSED] 61 VFs
[13:52:09] [PASSED] 62 VFs
[13:52:09] [PASSED] 63 VFs
[13:52:09] ================== [PASSED] fair_contexts ==================
[13:52:09] ===================== fair_doorbells  ======================
[13:52:09] [PASSED] 1 VF
[13:52:09] [PASSED] 2 VFs
[13:52:09] [PASSED] 3 VFs
[13:52:09] [PASSED] 4 VFs
[13:52:09] [PASSED] 5 VFs
[13:52:09] [PASSED] 6 VFs
[13:52:09] [PASSED] 7 VFs
[13:52:09] [PASSED] 8 VFs
[13:52:09] [PASSED] 9 VFs
[13:52:09] [PASSED] 10 VFs
[13:52:09] [PASSED] 11 VFs
[13:52:09] [PASSED] 12 VFs
[13:52:09] [PASSED] 13 VFs
[13:52:09] [PASSED] 14 VFs
[13:52:09] [PASSED] 15 VFs
[13:52:09] [PASSED] 16 VFs
[13:52:09] [PASSED] 17 VFs
[13:52:09] [PASSED] 18 VFs
[13:52:09] [PASSED] 19 VFs
[13:52:09] [PASSED] 20 VFs
[13:52:09] [PASSED] 21 VFs
[13:52:09] [PASSED] 22 VFs
[13:52:09] [PASSED] 23 VFs
[13:52:09] [PASSED] 24 VFs
[13:52:09] [PASSED] 25 VFs
[13:52:09] [PASSED] 26 VFs
[13:52:09] [PASSED] 27 VFs
[13:52:09] [PASSED] 28 VFs
[13:52:09] [PASSED] 29 VFs
[13:52:09] [PASSED] 30 VFs
[13:52:09] [PASSED] 31 VFs
[13:52:09] [PASSED] 32 VFs
[13:52:09] [PASSED] 33 VFs
[13:52:09] [PASSED] 34 VFs
[13:52:09] [PASSED] 35 VFs
[13:52:09] [PASSED] 36 VFs
[13:52:09] [PASSED] 37 VFs
[13:52:09] [PASSED] 38 VFs
[13:52:09] [PASSED] 39 VFs
[13:52:09] [PASSED] 40 VFs
[13:52:09] [PASSED] 41 VFs
[13:52:09] [PASSED] 42 VFs
[13:52:09] [PASSED] 43 VFs
[13:52:09] [PASSED] 44 VFs
[13:52:09] [PASSED] 45 VFs
[13:52:09] [PASSED] 46 VFs
[13:52:09] [PASSED] 47 VFs
[13:52:09] [PASSED] 48 VFs
[13:52:09] [PASSED] 49 VFs
[13:52:09] [PASSED] 50 VFs
[13:52:09] [PASSED] 51 VFs
[13:52:09] [PASSED] 52 VFs
[13:52:09] [PASSED] 53 VFs
[13:52:09] [PASSED] 54 VFs
[13:52:09] [PASSED] 55 VFs
[13:52:09] [PASSED] 56 VFs
[13:52:09] [PASSED] 57 VFs
[13:52:09] [PASSED] 58 VFs
[13:52:09] [PASSED] 59 VFs
[13:52:09] [PASSED] 60 VFs
[13:52:09] [PASSED] 61 VFs
[13:52:09] [PASSED] 62 VFs
[13:52:09] [PASSED] 63 VFs
[13:52:09] ================= [PASSED] fair_doorbells ==================
[13:52:09] ======================== fair_ggtt  ========================
[13:52:09] [PASSED] 1 VF
[13:52:09] [PASSED] 2 VFs
[13:52:09] [PASSED] 3 VFs
[13:52:09] [PASSED] 4 VFs
[13:52:09] [PASSED] 5 VFs
[13:52:09] [PASSED] 6 VFs
[13:52:09] [PASSED] 7 VFs
[13:52:09] [PASSED] 8 VFs
[13:52:09] [PASSED] 9 VFs
[13:52:09] [PASSED] 10 VFs
[13:52:09] [PASSED] 11 VFs
[13:52:09] [PASSED] 12 VFs
[13:52:09] [PASSED] 13 VFs
[13:52:09] [PASSED] 14 VFs
[13:52:09] [PASSED] 15 VFs
[13:52:09] [PASSED] 16 VFs
[13:52:09] [PASSED] 17 VFs
[13:52:09] [PASSED] 18 VFs
[13:52:09] [PASSED] 19 VFs
[13:52:09] [PASSED] 20 VFs
[13:52:09] [PASSED] 21 VFs
[13:52:09] [PASSED] 22 VFs
[13:52:09] [PASSED] 23 VFs
[13:52:09] [PASSED] 24 VFs
[13:52:09] [PASSED] 25 VFs
[13:52:09] [PASSED] 26 VFs
[13:52:09] [PASSED] 27 VFs
[13:52:09] [PASSED] 28 VFs
[13:52:09] [PASSED] 29 VFs
[13:52:09] [PASSED] 30 VFs
[13:52:09] [PASSED] 31 VFs
[13:52:09] [PASSED] 32 VFs
[13:52:09] [PASSED] 33 VFs
[13:52:09] [PASSED] 34 VFs
[13:52:09] [PASSED] 35 VFs
[13:52:09] [PASSED] 36 VFs
[13:52:09] [PASSED] 37 VFs
[13:52:09] [PASSED] 38 VFs
[13:52:09] [PASSED] 39 VFs
[13:52:09] [PASSED] 40 VFs
[13:52:09] [PASSED] 41 VFs
[13:52:09] [PASSED] 42 VFs
[13:52:09] [PASSED] 43 VFs
[13:52:09] [PASSED] 44 VFs
[13:52:09] [PASSED] 45 VFs
[13:52:09] [PASSED] 46 VFs
[13:52:09] [PASSED] 47 VFs
[13:52:09] [PASSED] 48 VFs
[13:52:09] [PASSED] 49 VFs
[13:52:09] [PASSED] 50 VFs
[13:52:09] [PASSED] 51 VFs
[13:52:09] [PASSED] 52 VFs
[13:52:09] [PASSED] 53 VFs
[13:52:09] [PASSED] 54 VFs
[13:52:09] [PASSED] 55 VFs
[13:52:09] [PASSED] 56 VFs
[13:52:09] [PASSED] 57 VFs
[13:52:09] [PASSED] 58 VFs
[13:52:09] [PASSED] 59 VFs
[13:52:09] [PASSED] 60 VFs
[13:52:09] [PASSED] 61 VFs
[13:52:09] [PASSED] 62 VFs
[13:52:09] [PASSED] 63 VFs
[13:52:09] ==================== [PASSED] fair_ggtt ====================
[13:52:09] ================== [PASSED] pf_gt_config ===================
[13:52:09] ===================== lmtt (1 subtest) =====================
[13:52:09] ======================== test_ops  =========================
[13:52:09] [PASSED] 2-level
[13:52:09] [PASSED] multi-level
[13:52:09] ==================== [PASSED] test_ops =====================
[13:52:09] ====================== [PASSED] lmtt =======================
[13:52:09] ================= pf_service (11 subtests) =================
[13:52:09] [PASSED] pf_negotiate_any
[13:52:09] [PASSED] pf_negotiate_base_match
[13:52:09] [PASSED] pf_negotiate_base_newer
[13:52:09] [PASSED] pf_negotiate_base_next
[13:52:09] [SKIPPED] pf_negotiate_base_older
[13:52:09] [PASSED] pf_negotiate_base_prev
[13:52:09] [PASSED] pf_negotiate_latest_match
[13:52:09] [PASSED] pf_negotiate_latest_newer
[13:52:09] [PASSED] pf_negotiate_latest_next
[13:52:09] [SKIPPED] pf_negotiate_latest_older
[13:52:09] [SKIPPED] pf_negotiate_latest_prev
[13:52:09] =================== [PASSED] pf_service ====================
[13:52:09] ================= xe_guc_g2g (2 subtests) ==================
[13:52:09] ============== xe_live_guc_g2g_kunit_default  ==============
[13:52:09] ========= [SKIPPED] xe_live_guc_g2g_kunit_default ==========
[13:52:09] ============== xe_live_guc_g2g_kunit_allmem  ===============
[13:52:09] ========== [SKIPPED] xe_live_guc_g2g_kunit_allmem ==========
[13:52:09] =================== [SKIPPED] xe_guc_g2g ===================
[13:52:09] =================== xe_mocs (2 subtests) ===================
[13:52:09] ================ xe_live_mocs_kernel_kunit  ================
[13:52:09] =========== [SKIPPED] xe_live_mocs_kernel_kunit ============
[13:52:09] ================ xe_live_mocs_reset_kunit  =================
[13:52:09] ============ [SKIPPED] xe_live_mocs_reset_kunit ============
[13:52:09] ==================== [SKIPPED] xe_mocs =====================
[13:52:09] ================= xe_migrate (2 subtests) ==================
[13:52:09] ================= xe_migrate_sanity_kunit  =================
[13:52:09] ============ [SKIPPED] xe_migrate_sanity_kunit =============
[13:52:09] ================== xe_validate_ccs_kunit  ==================
[13:52:09] ============= [SKIPPED] xe_validate_ccs_kunit ==============
[13:52:09] =================== [SKIPPED] xe_migrate ===================
[13:52:09] ================== xe_dma_buf (1 subtest) ==================
[13:52:09] ==================== xe_dma_buf_kunit  =====================
[13:52:09] ================ [SKIPPED] xe_dma_buf_kunit ================
[13:52:09] =================== [SKIPPED] xe_dma_buf ===================
[13:52:09] ================= xe_bo_shrink (1 subtest) =================
[13:52:09] =================== xe_bo_shrink_kunit  ====================
[13:52:09] =============== [SKIPPED] xe_bo_shrink_kunit ===============
[13:52:09] ================== [SKIPPED] xe_bo_shrink ==================
[13:52:09] ==================== xe_bo (2 subtests) ====================
[13:52:09] ================== xe_ccs_migrate_kunit  ===================
[13:52:09] ============== [SKIPPED] xe_ccs_migrate_kunit ==============
[13:52:09] ==================== xe_bo_evict_kunit  ====================
[13:52:09] =============== [SKIPPED] xe_bo_evict_kunit ================
[13:52:09] ===================== [SKIPPED] xe_bo ======================
[13:52:09] ==================== args (11 subtests) ====================
[13:52:09] [PASSED] count_args_test
[13:52:09] [PASSED] call_args_example
[13:52:09] [PASSED] call_args_test
[13:52:09] [PASSED] drop_first_arg_example
[13:52:09] [PASSED] drop_first_arg_test
[13:52:09] [PASSED] first_arg_example
[13:52:09] [PASSED] first_arg_test
[13:52:09] [PASSED] last_arg_example
[13:52:09] [PASSED] last_arg_test
[13:52:09] [PASSED] pick_arg_example
[13:52:09] [PASSED] sep_comma_example
[13:52:09] ====================== [PASSED] args =======================
[13:52:09] =================== xe_pci (3 subtests) ====================
[13:52:09] ==================== check_graphics_ip  ====================
[13:52:09] [PASSED] 12.00 Xe_LP
[13:52:09] [PASSED] 12.10 Xe_LP+
[13:52:09] [PASSED] 12.55 Xe_HPG
[13:52:09] [PASSED] 12.60 Xe_HPC
[13:52:09] [PASSED] 12.70 Xe_LPG
[13:52:09] [PASSED] 12.71 Xe_LPG
[13:52:09] [PASSED] 12.74 Xe_LPG+
[13:52:09] [PASSED] 20.01 Xe2_HPG
[13:52:09] [PASSED] 20.02 Xe2_HPG
[13:52:09] [PASSED] 20.04 Xe2_LPG
[13:52:09] [PASSED] 30.00 Xe3_LPG
[13:52:09] [PASSED] 30.01 Xe3_LPG
[13:52:09] [PASSED] 30.03 Xe3_LPG
[13:52:09] [PASSED] 30.04 Xe3_LPG
[13:52:09] [PASSED] 30.05 Xe3_LPG
[13:52:09] [PASSED] 35.11 Xe3p_XPC
[13:52:09] ================ [PASSED] check_graphics_ip ================
[13:52:09] ===================== check_media_ip  ======================
[13:52:09] [PASSED] 12.00 Xe_M
[13:52:09] [PASSED] 12.55 Xe_HPM
[13:52:09] [PASSED] 13.00 Xe_LPM+
[13:52:09] [PASSED] 13.01 Xe2_HPM
[13:52:09] [PASSED] 20.00 Xe2_LPM
[13:52:09] [PASSED] 30.00 Xe3_LPM
[13:52:09] [PASSED] 30.02 Xe3_LPM
[13:52:09] [PASSED] 35.00 Xe3p_LPM
[13:52:09] [PASSED] 35.03 Xe3p_HPM
[13:52:09] ================= [PASSED] check_media_ip ==================
[13:52:09] =================== check_platform_desc  ===================
[13:52:09] [PASSED] 0x9A60 (TIGERLAKE)
[13:52:09] [PASSED] 0x9A68 (TIGERLAKE)
[13:52:09] [PASSED] 0x9A70 (TIGERLAKE)
[13:52:09] [PASSED] 0x9A40 (TIGERLAKE)
[13:52:09] [PASSED] 0x9A49 (TIGERLAKE)
[13:52:09] [PASSED] 0x9A59 (TIGERLAKE)
[13:52:09] [PASSED] 0x9A78 (TIGERLAKE)
[13:52:09] [PASSED] 0x9AC0 (TIGERLAKE)
[13:52:09] [PASSED] 0x9AC9 (TIGERLAKE)
[13:52:09] [PASSED] 0x9AD9 (TIGERLAKE)
[13:52:09] [PASSED] 0x9AF8 (TIGERLAKE)
[13:52:09] [PASSED] 0x4C80 (ROCKETLAKE)
[13:52:09] [PASSED] 0x4C8A (ROCKETLAKE)
[13:52:09] [PASSED] 0x4C8B (ROCKETLAKE)
[13:52:09] [PASSED] 0x4C8C (ROCKETLAKE)
[13:52:09] [PASSED] 0x4C90 (ROCKETLAKE)
[13:52:09] [PASSED] 0x4C9A (ROCKETLAKE)
[13:52:09] [PASSED] 0x4680 (ALDERLAKE_S)
[13:52:09] [PASSED] 0x4682 (ALDERLAKE_S)
[13:52:09] [PASSED] 0x4688 (ALDERLAKE_S)
[13:52:09] [PASSED] 0x468A (ALDERLAKE_S)
[13:52:09] [PASSED] 0x468B (ALDERLAKE_S)
[13:52:09] [PASSED] 0x4690 (ALDERLAKE_S)
[13:52:09] [PASSED] 0x4692 (ALDERLAKE_S)
[13:52:09] [PASSED] 0x4693 (ALDERLAKE_S)
[13:52:09] [PASSED] 0x46A0 (ALDERLAKE_P)
[13:52:09] [PASSED] 0x46A1 (ALDERLAKE_P)
[13:52:09] [PASSED] 0x46A2 (ALDERLAKE_P)
[13:52:09] [PASSED] 0x46A3 (ALDERLAKE_P)
[13:52:09] [PASSED] 0x46A6 (ALDERLAKE_P)
[13:52:09] [PASSED] 0x46A8 (ALDERLAKE_P)
[13:52:09] [PASSED] 0x46AA (ALDERLAKE_P)
[13:52:09] [PASSED] 0x462A (ALDERLAKE_P)
[13:52:09] [PASSED] 0x4626 (ALDERLAKE_P)
[13:52:09] [PASSED] 0x4628 (ALDERLAKE_P)
[13:52:09] [PASSED] 0x46B0 (ALDERLAKE_P)
stty: 'standard input': Inappropriate ioctl for device
[13:52:09] [PASSED] 0x46B1 (ALDERLAKE_P)
[13:52:09] [PASSED] 0x46B2 (ALDERLAKE_P)
[13:52:09] [PASSED] 0x46B3 (ALDERLAKE_P)
[13:52:09] [PASSED] 0x46C0 (ALDERLAKE_P)
[13:52:09] [PASSED] 0x46C1 (ALDERLAKE_P)
[13:52:09] [PASSED] 0x46C2 (ALDERLAKE_P)
[13:52:09] [PASSED] 0x46C3 (ALDERLAKE_P)
[13:52:09] [PASSED] 0x46D0 (ALDERLAKE_N)
[13:52:09] [PASSED] 0x46D1 (ALDERLAKE_N)
[13:52:09] [PASSED] 0x46D2 (ALDERLAKE_N)
[13:52:09] [PASSED] 0x46D3 (ALDERLAKE_N)
[13:52:09] [PASSED] 0x46D4 (ALDERLAKE_N)
[13:52:09] [PASSED] 0xA721 (ALDERLAKE_P)
[13:52:09] [PASSED] 0xA7A1 (ALDERLAKE_P)
[13:52:09] [PASSED] 0xA7A9 (ALDERLAKE_P)
[13:52:09] [PASSED] 0xA7AC (ALDERLAKE_P)
[13:52:09] [PASSED] 0xA7AD (ALDERLAKE_P)
[13:52:09] [PASSED] 0xA720 (ALDERLAKE_P)
[13:52:09] [PASSED] 0xA7A0 (ALDERLAKE_P)
[13:52:09] [PASSED] 0xA7A8 (ALDERLAKE_P)
[13:52:09] [PASSED] 0xA7AA (ALDERLAKE_P)
[13:52:09] [PASSED] 0xA7AB (ALDERLAKE_P)
[13:52:09] [PASSED] 0xA780 (ALDERLAKE_S)
[13:52:09] [PASSED] 0xA781 (ALDERLAKE_S)
[13:52:09] [PASSED] 0xA782 (ALDERLAKE_S)
[13:52:09] [PASSED] 0xA783 (ALDERLAKE_S)
[13:52:09] [PASSED] 0xA788 (ALDERLAKE_S)
[13:52:09] [PASSED] 0xA789 (ALDERLAKE_S)
[13:52:09] [PASSED] 0xA78A (ALDERLAKE_S)
[13:52:09] [PASSED] 0xA78B (ALDERLAKE_S)
[13:52:09] [PASSED] 0x4905 (DG1)
[13:52:09] [PASSED] 0x4906 (DG1)
[13:52:09] [PASSED] 0x4907 (DG1)
[13:52:09] [PASSED] 0x4908 (DG1)
[13:52:09] [PASSED] 0x4909 (DG1)
[13:52:09] [PASSED] 0x56C0 (DG2)
[13:52:09] [PASSED] 0x56C2 (DG2)
[13:52:09] [PASSED] 0x56C1 (DG2)
[13:52:09] [PASSED] 0x7D51 (METEORLAKE)
[13:52:09] [PASSED] 0x7DD1 (METEORLAKE)
[13:52:09] [PASSED] 0x7D41 (METEORLAKE)
[13:52:09] [PASSED] 0x7D67 (METEORLAKE)
[13:52:09] [PASSED] 0xB640 (METEORLAKE)
[13:52:09] [PASSED] 0x56A0 (DG2)
[13:52:09] [PASSED] 0x56A1 (DG2)
[13:52:09] [PASSED] 0x56A2 (DG2)
[13:52:09] [PASSED] 0x56BE (DG2)
[13:52:09] [PASSED] 0x56BF (DG2)
[13:52:09] [PASSED] 0x5690 (DG2)
[13:52:09] [PASSED] 0x5691 (DG2)
[13:52:09] [PASSED] 0x5692 (DG2)
[13:52:09] [PASSED] 0x56A5 (DG2)
[13:52:09] [PASSED] 0x56A6 (DG2)
[13:52:09] [PASSED] 0x56B0 (DG2)
[13:52:09] [PASSED] 0x56B1 (DG2)
[13:52:09] [PASSED] 0x56BA (DG2)
[13:52:09] [PASSED] 0x56BB (DG2)
[13:52:09] [PASSED] 0x56BC (DG2)
[13:52:09] [PASSED] 0x56BD (DG2)
[13:52:09] [PASSED] 0x5693 (DG2)
[13:52:09] [PASSED] 0x5694 (DG2)
[13:52:09] [PASSED] 0x5695 (DG2)
[13:52:09] [PASSED] 0x56A3 (DG2)
[13:52:09] [PASSED] 0x56A4 (DG2)
[13:52:09] [PASSED] 0x56B2 (DG2)
[13:52:09] [PASSED] 0x56B3 (DG2)
[13:52:09] [PASSED] 0x5696 (DG2)
[13:52:09] [PASSED] 0x5697 (DG2)
[13:52:09] [PASSED] 0xB69 (PVC)
[13:52:09] [PASSED] 0xB6E (PVC)
[13:52:09] [PASSED] 0xBD4 (PVC)
[13:52:09] [PASSED] 0xBD5 (PVC)
[13:52:09] [PASSED] 0xBD6 (PVC)
[13:52:09] [PASSED] 0xBD7 (PVC)
[13:52:09] [PASSED] 0xBD8 (PVC)
[13:52:09] [PASSED] 0xBD9 (PVC)
[13:52:09] [PASSED] 0xBDA (PVC)
[13:52:09] [PASSED] 0xBDB (PVC)
[13:52:09] [PASSED] 0xBE0 (PVC)
[13:52:09] [PASSED] 0xBE1 (PVC)
[13:52:09] [PASSED] 0xBE5 (PVC)
[13:52:09] [PASSED] 0x7D40 (METEORLAKE)
[13:52:09] [PASSED] 0x7D45 (METEORLAKE)
[13:52:09] [PASSED] 0x7D55 (METEORLAKE)
[13:52:09] [PASSED] 0x7D60 (METEORLAKE)
[13:52:09] [PASSED] 0x7DD5 (METEORLAKE)
[13:52:09] [PASSED] 0x6420 (LUNARLAKE)
[13:52:09] [PASSED] 0x64A0 (LUNARLAKE)
[13:52:09] [PASSED] 0x64B0 (LUNARLAKE)
[13:52:09] [PASSED] 0xE202 (BATTLEMAGE)
[13:52:09] [PASSED] 0xE209 (BATTLEMAGE)
[13:52:09] [PASSED] 0xE20B (BATTLEMAGE)
[13:52:09] [PASSED] 0xE20C (BATTLEMAGE)
[13:52:09] [PASSED] 0xE20D (BATTLEMAGE)
[13:52:09] [PASSED] 0xE210 (BATTLEMAGE)
[13:52:09] [PASSED] 0xE211 (BATTLEMAGE)
[13:52:09] [PASSED] 0xE212 (BATTLEMAGE)
[13:52:09] [PASSED] 0xE216 (BATTLEMAGE)
[13:52:09] [PASSED] 0xE220 (BATTLEMAGE)
[13:52:09] [PASSED] 0xE221 (BATTLEMAGE)
[13:52:09] [PASSED] 0xE222 (BATTLEMAGE)
[13:52:09] [PASSED] 0xE223 (BATTLEMAGE)
[13:52:09] [PASSED] 0xB080 (PANTHERLAKE)
[13:52:09] [PASSED] 0xB081 (PANTHERLAKE)
[13:52:09] [PASSED] 0xB082 (PANTHERLAKE)
[13:52:09] [PASSED] 0xB083 (PANTHERLAKE)
[13:52:09] [PASSED] 0xB084 (PANTHERLAKE)
[13:52:09] [PASSED] 0xB085 (PANTHERLAKE)
[13:52:09] [PASSED] 0xB086 (PANTHERLAKE)
[13:52:09] [PASSED] 0xB087 (PANTHERLAKE)
[13:52:09] [PASSED] 0xB08F (PANTHERLAKE)
[13:52:09] [PASSED] 0xB090 (PANTHERLAKE)
[13:52:09] [PASSED] 0xB0A0 (PANTHERLAKE)
[13:52:09] [PASSED] 0xB0B0 (PANTHERLAKE)
[13:52:09] [PASSED] 0xFD80 (PANTHERLAKE)
[13:52:09] [PASSED] 0xFD81 (PANTHERLAKE)
[13:52:09] [PASSED] 0xD740 (NOVALAKE_S)
[13:52:09] [PASSED] 0xD741 (NOVALAKE_S)
[13:52:09] [PASSED] 0xD742 (NOVALAKE_S)
[13:52:09] [PASSED] 0xD743 (NOVALAKE_S)
[13:52:09] [PASSED] 0xD744 (NOVALAKE_S)
[13:52:09] [PASSED] 0xD745 (NOVALAKE_S)
[13:52:09] [PASSED] 0x674C (CRESCENTISLAND)
[13:52:09] =============== [PASSED] check_platform_desc ===============
[13:52:09] ===================== [PASSED] xe_pci ======================
[13:52:09] =================== xe_rtp (2 subtests) ====================
[13:52:09] =============== xe_rtp_process_to_sr_tests  ================
[13:52:09] [PASSED] coalesce-same-reg
[13:52:09] [PASSED] no-match-no-add
[13:52:09] [PASSED] match-or
[13:52:09] [PASSED] match-or-xfail
[13:52:09] [PASSED] no-match-no-add-multiple-rules
[13:52:09] [PASSED] two-regs-two-entries
[13:52:09] [PASSED] clr-one-set-other
[13:52:09] [PASSED] set-field
[13:52:09] [PASSED] conflict-duplicate
[13:52:09] [PASSED] conflict-not-disjoint
[13:52:09] [PASSED] conflict-reg-type
[13:52:09] =========== [PASSED] xe_rtp_process_to_sr_tests ============
[13:52:09] ================== xe_rtp_process_tests  ===================
[13:52:09] [PASSED] active1
[13:52:09] [PASSED] active2
[13:52:09] [PASSED] active-inactive
[13:52:09] [PASSED] inactive-active
[13:52:09] [PASSED] inactive-1st_or_active-inactive
[13:52:09] [PASSED] inactive-2nd_or_active-inactive
[13:52:09] [PASSED] inactive-last_or_active-inactive
[13:52:09] [PASSED] inactive-no_or_active-inactive
[13:52:09] ============== [PASSED] xe_rtp_process_tests ===============
[13:52:09] ===================== [PASSED] xe_rtp ======================
[13:52:09] ==================== xe_wa (1 subtest) =====================
[13:52:09] ======================== xe_wa_gt  =========================
[13:52:09] [PASSED] TIGERLAKE B0
[13:52:09] [PASSED] DG1 A0
[13:52:09] [PASSED] DG1 B0
[13:52:09] [PASSED] ALDERLAKE_S A0
[13:52:09] [PASSED] ALDERLAKE_S B0
[13:52:09] [PASSED] ALDERLAKE_S C0
[13:52:09] [PASSED] ALDERLAKE_S D0
[13:52:09] [PASSED] ALDERLAKE_P A0
[13:52:09] [PASSED] ALDERLAKE_P B0
[13:52:09] [PASSED] ALDERLAKE_P C0
[13:52:09] [PASSED] ALDERLAKE_S RPLS D0
[13:52:09] [PASSED] ALDERLAKE_P RPLU E0
[13:52:09] [PASSED] DG2 G10 C0
[13:52:09] [PASSED] DG2 G11 B1
[13:52:09] [PASSED] DG2 G12 A1
[13:52:09] [PASSED] METEORLAKE 12.70(Xe_LPG) A0 13.00(Xe_LPM+) A0
[13:52:09] [PASSED] METEORLAKE 12.71(Xe_LPG) A0 13.00(Xe_LPM+) A0
[13:52:09] [PASSED] METEORLAKE 12.74(Xe_LPG+) A0 13.00(Xe_LPM+) A0
[13:52:09] [PASSED] LUNARLAKE 20.04(Xe2_LPG) A0 20.00(Xe2_LPM) A0
[13:52:09] [PASSED] LUNARLAKE 20.04(Xe2_LPG) B0 20.00(Xe2_LPM) A0
[13:52:09] [PASSED] BATTLEMAGE 20.01(Xe2_HPG) A0 13.01(Xe2_HPM) A1
[13:52:09] [PASSED] PANTHERLAKE 30.00(Xe3_LPG) A0 30.00(Xe3_LPM) A0
[13:52:09] ==================== [PASSED] xe_wa_gt =====================
[13:52:09] ====================== [PASSED] xe_wa ======================
[13:52:09] ============================================================
[13:52:09] Testing complete. Ran 510 tests: passed: 492, skipped: 18
[13:52:09] Elapsed time: 36.124s total, 4.219s configuring, 31.437s building, 0.461s running

+ /kernel/tools/testing/kunit/kunit.py run --kunitconfig /kernel/drivers/gpu/drm/tests/.kunitconfig
[13:52:09] Configuring KUnit Kernel ...
Regenerating .config ...
Populating config with:
$ make ARCH=um O=.kunit olddefconfig
[13:52:11] Building KUnit Kernel ...
Populating config with:
$ make ARCH=um O=.kunit olddefconfig
Building with:
$ make all compile_commands.json scripts_gdb ARCH=um O=.kunit --jobs=48
[13:52:36] Starting KUnit Kernel (1/1)...
[13:52:36] ============================================================
Running tests with:
$ .kunit/linux kunit.enable=1 mem=1G console=tty kunit_shutdown=halt
[13:52:36] ============ drm_test_pick_cmdline (2 subtests) ============
[13:52:36] [PASSED] drm_test_pick_cmdline_res_1920_1080_60
[13:52:36] =============== drm_test_pick_cmdline_named  ===============
[13:52:36] [PASSED] NTSC
[13:52:36] [PASSED] NTSC-J
[13:52:36] [PASSED] PAL
[13:52:36] [PASSED] PAL-M
[13:52:36] =========== [PASSED] drm_test_pick_cmdline_named ===========
[13:52:36] ============== [PASSED] drm_test_pick_cmdline ==============
[13:52:36] == drm_test_atomic_get_connector_for_encoder (1 subtest) ===
[13:52:36] [PASSED] drm_test_drm_atomic_get_connector_for_encoder
[13:52:36] ==== [PASSED] drm_test_atomic_get_connector_for_encoder ====
[13:52:36] =========== drm_validate_clone_mode (2 subtests) ===========
[13:52:36] ============== drm_test_check_in_clone_mode  ===============
[13:52:36] [PASSED] in_clone_mode
[13:52:36] [PASSED] not_in_clone_mode
[13:52:36] ========== [PASSED] drm_test_check_in_clone_mode ===========
[13:52:36] =============== drm_test_check_valid_clones  ===============
[13:52:36] [PASSED] not_in_clone_mode
[13:52:36] [PASSED] valid_clone
[13:52:36] [PASSED] invalid_clone
[13:52:36] =========== [PASSED] drm_test_check_valid_clones ===========
[13:52:36] ============= [PASSED] drm_validate_clone_mode =============
[13:52:36] ============= drm_validate_modeset (1 subtest) =============
[13:52:36] [PASSED] drm_test_check_connector_changed_modeset
[13:52:36] ============== [PASSED] drm_validate_modeset ===============
[13:52:36] ====== drm_test_bridge_get_current_state (2 subtests) ======
[13:52:36] [PASSED] drm_test_drm_bridge_get_current_state_atomic
[13:52:36] [PASSED] drm_test_drm_bridge_get_current_state_legacy
[13:52:36] ======== [PASSED] drm_test_bridge_get_current_state ========
[13:52:36] ====== drm_test_bridge_helper_reset_crtc (3 subtests) ======
[13:52:36] [PASSED] drm_test_drm_bridge_helper_reset_crtc_atomic
[13:52:36] [PASSED] drm_test_drm_bridge_helper_reset_crtc_atomic_disabled
[13:52:36] [PASSED] drm_test_drm_bridge_helper_reset_crtc_legacy
[13:52:36] ======== [PASSED] drm_test_bridge_helper_reset_crtc ========
[13:52:36] ============== drm_bridge_alloc (2 subtests) ===============
[13:52:36] [PASSED] drm_test_drm_bridge_alloc_basic
[13:52:36] [PASSED] drm_test_drm_bridge_alloc_get_put
[13:52:36] ================ [PASSED] drm_bridge_alloc =================
[13:52:36] ================== drm_buddy (8 subtests) ==================
[13:52:36] [PASSED] drm_test_buddy_alloc_limit
[13:52:36] [PASSED] drm_test_buddy_alloc_optimistic
[13:52:36] [PASSED] drm_test_buddy_alloc_pessimistic
[13:52:36] [PASSED] drm_test_buddy_alloc_pathological
[13:52:36] [PASSED] drm_test_buddy_alloc_contiguous
[13:52:36] [PASSED] drm_test_buddy_alloc_clear
[13:52:36] [PASSED] drm_test_buddy_alloc_range_bias
[13:52:36] [PASSED] drm_test_buddy_fragmentation_performance
[13:52:36] ==================== [PASSED] drm_buddy ====================
[13:52:36] ============= drm_cmdline_parser (40 subtests) =============
[13:52:36] [PASSED] drm_test_cmdline_force_d_only
[13:52:36] [PASSED] drm_test_cmdline_force_D_only_dvi
[13:52:36] [PASSED] drm_test_cmdline_force_D_only_hdmi
[13:52:36] [PASSED] drm_test_cmdline_force_D_only_not_digital
[13:52:36] [PASSED] drm_test_cmdline_force_e_only
[13:52:36] [PASSED] drm_test_cmdline_res
[13:52:36] [PASSED] drm_test_cmdline_res_vesa
[13:52:36] [PASSED] drm_test_cmdline_res_vesa_rblank
[13:52:36] [PASSED] drm_test_cmdline_res_rblank
[13:52:36] [PASSED] drm_test_cmdline_res_bpp
[13:52:36] [PASSED] drm_test_cmdline_res_refresh
[13:52:36] [PASSED] drm_test_cmdline_res_bpp_refresh
[13:52:36] [PASSED] drm_test_cmdline_res_bpp_refresh_interlaced
[13:52:36] [PASSED] drm_test_cmdline_res_bpp_refresh_margins
[13:52:36] [PASSED] drm_test_cmdline_res_bpp_refresh_force_off
[13:52:36] [PASSED] drm_test_cmdline_res_bpp_refresh_force_on
[13:52:36] [PASSED] drm_test_cmdline_res_bpp_refresh_force_on_analog
[13:52:36] [PASSED] drm_test_cmdline_res_bpp_refresh_force_on_digital
[13:52:36] [PASSED] drm_test_cmdline_res_bpp_refresh_interlaced_margins_force_on
[13:52:36] [PASSED] drm_test_cmdline_res_margins_force_on
[13:52:36] [PASSED] drm_test_cmdline_res_vesa_margins
[13:52:36] [PASSED] drm_test_cmdline_name
[13:52:36] [PASSED] drm_test_cmdline_name_bpp
[13:52:36] [PASSED] drm_test_cmdline_name_option
[13:52:36] [PASSED] drm_test_cmdline_name_bpp_option
[13:52:36] [PASSED] drm_test_cmdline_rotate_0
[13:52:36] [PASSED] drm_test_cmdline_rotate_90
[13:52:36] [PASSED] drm_test_cmdline_rotate_180
[13:52:36] [PASSED] drm_test_cmdline_rotate_270
[13:52:36] [PASSED] drm_test_cmdline_hmirror
[13:52:36] [PASSED] drm_test_cmdline_vmirror
[13:52:36] [PASSED] drm_test_cmdline_margin_options
[13:52:36] [PASSED] drm_test_cmdline_multiple_options
[13:52:36] [PASSED] drm_test_cmdline_bpp_extra_and_option
[13:52:36] [PASSED] drm_test_cmdline_extra_and_option
[13:52:36] [PASSED] drm_test_cmdline_freestanding_options
[13:52:36] [PASSED] drm_test_cmdline_freestanding_force_e_and_options
[13:52:36] [PASSED] drm_test_cmdline_panel_orientation
[13:52:36] ================ drm_test_cmdline_invalid  =================
[13:52:36] [PASSED] margin_only
[13:52:36] [PASSED] interlace_only
[13:52:36] [PASSED] res_missing_x
[13:52:36] [PASSED] res_missing_y
[13:52:36] [PASSED] res_bad_y
[13:52:36] [PASSED] res_missing_y_bpp
[13:52:36] [PASSED] res_bad_bpp
[13:52:36] [PASSED] res_bad_refresh
[13:52:36] [PASSED] res_bpp_refresh_force_on_off
[13:52:36] [PASSED] res_invalid_mode
[13:52:36] [PASSED] res_bpp_wrong_place_mode
[13:52:36] [PASSED] name_bpp_refresh
[13:52:36] [PASSED] name_refresh
[13:52:36] [PASSED] name_refresh_wrong_mode
[13:52:36] [PASSED] name_refresh_invalid_mode
[13:52:36] [PASSED] rotate_multiple
[13:52:36] [PASSED] rotate_invalid_val
[13:52:36] [PASSED] rotate_truncated
[13:52:36] [PASSED] invalid_option
[13:52:36] [PASSED] invalid_tv_option
[13:52:36] [PASSED] truncated_tv_option
[13:52:36] ============ [PASSED] drm_test_cmdline_invalid =============
[13:52:36] =============== drm_test_cmdline_tv_options  ===============
[13:52:36] [PASSED] NTSC
[13:52:36] [PASSED] NTSC_443
[13:52:36] [PASSED] NTSC_J
[13:52:36] [PASSED] PAL
[13:52:36] [PASSED] PAL_M
[13:52:36] [PASSED] PAL_N
[13:52:36] [PASSED] SECAM
[13:52:36] [PASSED] MONO_525
[13:52:36] [PASSED] MONO_625
[13:52:36] =========== [PASSED] drm_test_cmdline_tv_options ===========
[13:52:36] =============== [PASSED] drm_cmdline_parser ================
[13:52:36] ========== drmm_connector_hdmi_init (20 subtests) ==========
[13:52:36] [PASSED] drm_test_connector_hdmi_init_valid
[13:52:36] [PASSED] drm_test_connector_hdmi_init_bpc_8
[13:52:36] [PASSED] drm_test_connector_hdmi_init_bpc_10
[13:52:36] [PASSED] drm_test_connector_hdmi_init_bpc_12
[13:52:36] [PASSED] drm_test_connector_hdmi_init_bpc_invalid
[13:52:36] [PASSED] drm_test_connector_hdmi_init_bpc_null
[13:52:36] [PASSED] drm_test_connector_hdmi_init_formats_empty
[13:52:36] [PASSED] drm_test_connector_hdmi_init_formats_no_rgb
[13:52:36] === drm_test_connector_hdmi_init_formats_yuv420_allowed  ===
[13:52:36] [PASSED] supported_formats=0x9 yuv420_allowed=1
[13:52:36] [PASSED] supported_formats=0x9 yuv420_allowed=0
[13:52:36] [PASSED] supported_formats=0x3 yuv420_allowed=1
[13:52:36] [PASSED] supported_formats=0x3 yuv420_allowed=0
[13:52:36] === [PASSED] drm_test_connector_hdmi_init_formats_yuv420_allowed ===
[13:52:36] [PASSED] drm_test_connector_hdmi_init_null_ddc
[13:52:36] [PASSED] drm_test_connector_hdmi_init_null_product
[13:52:36] [PASSED] drm_test_connector_hdmi_init_null_vendor
[13:52:36] [PASSED] drm_test_connector_hdmi_init_product_length_exact
[13:52:36] [PASSED] drm_test_connector_hdmi_init_product_length_too_long
[13:52:36] [PASSED] drm_test_connector_hdmi_init_product_valid
[13:52:36] [PASSED] drm_test_connector_hdmi_init_vendor_length_exact
[13:52:36] [PASSED] drm_test_connector_hdmi_init_vendor_length_too_long
[13:52:36] [PASSED] drm_test_connector_hdmi_init_vendor_valid
[13:52:36] ========= drm_test_connector_hdmi_init_type_valid  =========
[13:52:36] [PASSED] HDMI-A
[13:52:36] [PASSED] HDMI-B
[13:52:36] ===== [PASSED] drm_test_connector_hdmi_init_type_valid =====
[13:52:36] ======== drm_test_connector_hdmi_init_type_invalid  ========
[13:52:36] [PASSED] Unknown
[13:52:36] [PASSED] VGA
[13:52:36] [PASSED] DVI-I
[13:52:36] [PASSED] DVI-D
[13:52:36] [PASSED] DVI-A
[13:52:36] [PASSED] Composite
[13:52:36] [PASSED] SVIDEO
[13:52:36] [PASSED] LVDS
[13:52:36] [PASSED] Component
[13:52:36] [PASSED] DIN
[13:52:36] [PASSED] DP
[13:52:36] [PASSED] TV
[13:52:36] [PASSED] eDP
[13:52:36] [PASSED] Virtual
[13:52:36] [PASSED] DSI
[13:52:36] [PASSED] DPI
[13:52:36] [PASSED] Writeback
[13:52:36] [PASSED] SPI
[13:52:36] [PASSED] USB
[13:52:36] ==== [PASSED] drm_test_connector_hdmi_init_type_invalid ====
[13:52:36] ============ [PASSED] drmm_connector_hdmi_init =============
[13:52:36] ============= drmm_connector_init (3 subtests) =============
[13:52:36] [PASSED] drm_test_drmm_connector_init
[13:52:36] [PASSED] drm_test_drmm_connector_init_null_ddc
[13:52:36] ========= drm_test_drmm_connector_init_type_valid  =========
[13:52:36] [PASSED] Unknown
[13:52:36] [PASSED] VGA
[13:52:36] [PASSED] DVI-I
[13:52:36] [PASSED] DVI-D
[13:52:36] [PASSED] DVI-A
[13:52:36] [PASSED] Composite
[13:52:36] [PASSED] SVIDEO
[13:52:36] [PASSED] LVDS
[13:52:36] [PASSED] Component
[13:52:36] [PASSED] DIN
[13:52:36] [PASSED] DP
[13:52:36] [PASSED] HDMI-A
[13:52:36] [PASSED] HDMI-B
[13:52:36] [PASSED] TV
[13:52:36] [PASSED] eDP
[13:52:36] [PASSED] Virtual
[13:52:36] [PASSED] DSI
[13:52:36] [PASSED] DPI
[13:52:36] [PASSED] Writeback
[13:52:36] [PASSED] SPI
[13:52:36] [PASSED] USB
[13:52:36] ===== [PASSED] drm_test_drmm_connector_init_type_valid =====
[13:52:36] =============== [PASSED] drmm_connector_init ===============
[13:52:36] ========= drm_connector_dynamic_init (6 subtests) ==========
[13:52:36] [PASSED] drm_test_drm_connector_dynamic_init
[13:52:36] [PASSED] drm_test_drm_connector_dynamic_init_null_ddc
[13:52:36] [PASSED] drm_test_drm_connector_dynamic_init_not_added
[13:52:36] [PASSED] drm_test_drm_connector_dynamic_init_properties
[13:52:36] ===== drm_test_drm_connector_dynamic_init_type_valid  ======
[13:52:36] [PASSED] Unknown
[13:52:36] [PASSED] VGA
[13:52:36] [PASSED] DVI-I
[13:52:36] [PASSED] DVI-D
[13:52:36] [PASSED] DVI-A
[13:52:36] [PASSED] Composite
[13:52:36] [PASSED] SVIDEO
[13:52:36] [PASSED] LVDS
[13:52:36] [PASSED] Component
[13:52:36] [PASSED] DIN
[13:52:36] [PASSED] DP
[13:52:36] [PASSED] HDMI-A
[13:52:36] [PASSED] HDMI-B
[13:52:36] [PASSED] TV
[13:52:36] [PASSED] eDP
[13:52:36] [PASSED] Virtual
[13:52:36] [PASSED] DSI
[13:52:36] [PASSED] DPI
[13:52:36] [PASSED] Writeback
[13:52:36] [PASSED] SPI
[13:52:36] [PASSED] USB
[13:52:36] = [PASSED] drm_test_drm_connector_dynamic_init_type_valid ==
[13:52:36] ======== drm_test_drm_connector_dynamic_init_name  =========
[13:52:36] [PASSED] Unknown
[13:52:36] [PASSED] VGA
[13:52:36] [PASSED] DVI-I
[13:52:36] [PASSED] DVI-D
[13:52:36] [PASSED] DVI-A
[13:52:36] [PASSED] Composite
[13:52:36] [PASSED] SVIDEO
[13:52:36] [PASSED] LVDS
[13:52:36] [PASSED] Component
[13:52:36] [PASSED] DIN
[13:52:36] [PASSED] DP
[13:52:36] [PASSED] HDMI-A
[13:52:36] [PASSED] HDMI-B
[13:52:36] [PASSED] TV
[13:52:36] [PASSED] eDP
[13:52:36] [PASSED] Virtual
[13:52:36] [PASSED] DSI
[13:52:36] [PASSED] DPI
[13:52:36] [PASSED] Writeback
[13:52:36] [PASSED] SPI
[13:52:36] [PASSED] USB
[13:52:36] ==== [PASSED] drm_test_drm_connector_dynamic_init_name =====
[13:52:36] =========== [PASSED] drm_connector_dynamic_init ============
[13:52:36] ==== drm_connector_dynamic_register_early (4 subtests) =====
[13:52:36] [PASSED] drm_test_drm_connector_dynamic_register_early_on_list
[13:52:36] [PASSED] drm_test_drm_connector_dynamic_register_early_defer
[13:52:36] [PASSED] drm_test_drm_connector_dynamic_register_early_no_init
[13:52:36] [PASSED] drm_test_drm_connector_dynamic_register_early_no_mode_object
[13:52:36] ====== [PASSED] drm_connector_dynamic_register_early =======
[13:52:36] ======= drm_connector_dynamic_register (7 subtests) ========
[13:52:36] [PASSED] drm_test_drm_connector_dynamic_register_on_list
[13:52:36] [PASSED] drm_test_drm_connector_dynamic_register_no_defer
[13:52:36] [PASSED] drm_test_drm_connector_dynamic_register_no_init
[13:52:36] [PASSED] drm_test_drm_connector_dynamic_register_mode_object
[13:52:36] [PASSED] drm_test_drm_connector_dynamic_register_sysfs
[13:52:36] [PASSED] drm_test_drm_connector_dynamic_register_sysfs_name
[13:52:36] [PASSED] drm_test_drm_connector_dynamic_register_debugfs
[13:52:36] ========= [PASSED] drm_connector_dynamic_register ==========
[13:52:36] = drm_connector_attach_broadcast_rgb_property (2 subtests) =
[13:52:36] [PASSED] drm_test_drm_connector_attach_broadcast_rgb_property
[13:52:36] [PASSED] drm_test_drm_connector_attach_broadcast_rgb_property_hdmi_connector
[13:52:36] === [PASSED] drm_connector_attach_broadcast_rgb_property ===
[13:52:36] ========== drm_get_tv_mode_from_name (2 subtests) ==========
[13:52:36] ========== drm_test_get_tv_mode_from_name_valid  ===========
[13:52:36] [PASSED] NTSC
[13:52:36] [PASSED] NTSC-443
[13:52:36] [PASSED] NTSC-J
[13:52:36] [PASSED] PAL
[13:52:36] [PASSED] PAL-M
[13:52:36] [PASSED] PAL-N
[13:52:36] [PASSED] SECAM
[13:52:36] [PASSED] Mono
[13:52:36] ====== [PASSED] drm_test_get_tv_mode_from_name_valid =======
[13:52:36] [PASSED] drm_test_get_tv_mode_from_name_truncated
[13:52:36] ============ [PASSED] drm_get_tv_mode_from_name ============
[13:52:36] = drm_test_connector_hdmi_compute_mode_clock (12 subtests) =
[13:52:36] [PASSED] drm_test_drm_hdmi_compute_mode_clock_rgb
[13:52:36] [PASSED] drm_test_drm_hdmi_compute_mode_clock_rgb_10bpc
[13:52:36] [PASSED] drm_test_drm_hdmi_compute_mode_clock_rgb_10bpc_vic_1
[13:52:36] [PASSED] drm_test_drm_hdmi_compute_mode_clock_rgb_12bpc
[13:52:36] [PASSED] drm_test_drm_hdmi_compute_mode_clock_rgb_12bpc_vic_1
[13:52:36] [PASSED] drm_test_drm_hdmi_compute_mode_clock_rgb_double
[13:52:36] = drm_test_connector_hdmi_compute_mode_clock_yuv420_valid  =
[13:52:36] [PASSED] VIC 96
[13:52:36] [PASSED] VIC 97
[13:52:36] [PASSED] VIC 101
[13:52:36] [PASSED] VIC 102
[13:52:36] [PASSED] VIC 106
[13:52:36] [PASSED] VIC 107
[13:52:36] === [PASSED] drm_test_connector_hdmi_compute_mode_clock_yuv420_valid ===
[13:52:36] [PASSED] drm_test_connector_hdmi_compute_mode_clock_yuv420_10_bpc
[13:52:36] [PASSED] drm_test_connector_hdmi_compute_mode_clock_yuv420_12_bpc
[13:52:36] [PASSED] drm_test_connector_hdmi_compute_mode_clock_yuv422_8_bpc
[13:52:36] [PASSED] drm_test_connector_hdmi_compute_mode_clock_yuv422_10_bpc
[13:52:36] [PASSED] drm_test_connector_hdmi_compute_mode_clock_yuv422_12_bpc
[13:52:36] === [PASSED] drm_test_connector_hdmi_compute_mode_clock ====
[13:52:36] == drm_hdmi_connector_get_broadcast_rgb_name (2 subtests) ==
[13:52:36] === drm_test_drm_hdmi_connector_get_broadcast_rgb_name  ====
[13:52:36] [PASSED] Automatic
[13:52:36] [PASSED] Full
[13:52:36] [PASSED] Limited 16:235
[13:52:36] === [PASSED] drm_test_drm_hdmi_connector_get_broadcast_rgb_name ===
[13:52:36] [PASSED] drm_test_drm_hdmi_connector_get_broadcast_rgb_name_invalid
[13:52:36] ==== [PASSED] drm_hdmi_connector_get_broadcast_rgb_name ====
[13:52:36] == drm_hdmi_connector_get_output_format_name (2 subtests) ==
[13:52:36] === drm_test_drm_hdmi_connector_get_output_format_name  ====
[13:52:36] [PASSED] RGB
[13:52:36] [PASSED] YUV 4:2:0
[13:52:36] [PASSED] YUV 4:2:2
[13:52:36] [PASSED] YUV 4:4:4
[13:52:36] === [PASSED] drm_test_drm_hdmi_connector_get_output_format_name ===
[13:52:36] [PASSED] drm_test_drm_hdmi_connector_get_output_format_name_invalid
[13:52:36] ==== [PASSED] drm_hdmi_connector_get_output_format_name ====
[13:52:36] ============= drm_damage_helper (21 subtests) ==============
[13:52:36] [PASSED] drm_test_damage_iter_no_damage
[13:52:36] [PASSED] drm_test_damage_iter_no_damage_fractional_src
[13:52:36] [PASSED] drm_test_damage_iter_no_damage_src_moved
[13:52:36] [PASSED] drm_test_damage_iter_no_damage_fractional_src_moved
[13:52:36] [PASSED] drm_test_damage_iter_no_damage_not_visible
[13:52:36] [PASSED] drm_test_damage_iter_no_damage_no_crtc
[13:52:36] [PASSED] drm_test_damage_iter_no_damage_no_fb
[13:52:36] [PASSED] drm_test_damage_iter_simple_damage
[13:52:36] [PASSED] drm_test_damage_iter_single_damage
[13:52:36] [PASSED] drm_test_damage_iter_single_damage_intersect_src
[13:52:36] [PASSED] drm_test_damage_iter_single_damage_outside_src
[13:52:36] [PASSED] drm_test_damage_iter_single_damage_fractional_src
[13:52:36] [PASSED] drm_test_damage_iter_single_damage_intersect_fractional_src
[13:52:36] [PASSED] drm_test_damage_iter_single_damage_outside_fractional_src
[13:52:36] [PASSED] drm_test_damage_iter_single_damage_src_moved
[13:52:36] [PASSED] drm_test_damage_iter_single_damage_fractional_src_moved
[13:52:36] [PASSED] drm_test_damage_iter_damage
[13:52:36] [PASSED] drm_test_damage_iter_damage_one_intersect
[13:52:36] [PASSED] drm_test_damage_iter_damage_one_outside
[13:52:36] [PASSED] drm_test_damage_iter_damage_src_moved
[13:52:36] [PASSED] drm_test_damage_iter_damage_not_visible
[13:52:36] ================ [PASSED] drm_damage_helper ================
[13:52:36] ============== drm_dp_mst_helper (3 subtests) ==============
[13:52:36] ============== drm_test_dp_mst_calc_pbn_mode  ==============
[13:52:36] [PASSED] Clock 154000 BPP 30 DSC disabled
[13:52:36] [PASSED] Clock 234000 BPP 30 DSC disabled
[13:52:36] [PASSED] Clock 297000 BPP 24 DSC disabled
[13:52:36] [PASSED] Clock 332880 BPP 24 DSC enabled
[13:52:36] [PASSED] Clock 324540 BPP 24 DSC enabled
[13:52:36] ========== [PASSED] drm_test_dp_mst_calc_pbn_mode ==========
[13:52:36] ============== drm_test_dp_mst_calc_pbn_div  ===============
[13:52:36] [PASSED] Link rate 2000000 lane count 4
[13:52:36] [PASSED] Link rate 2000000 lane count 2
[13:52:36] [PASSED] Link rate 2000000 lane count 1
[13:52:36] [PASSED] Link rate 1350000 lane count 4
[13:52:36] [PASSED] Link rate 1350000 lane count 2
[13:52:36] [PASSED] Link rate 1350000 lane count 1
[13:52:36] [PASSED] Link rate 1000000 lane count 4
[13:52:36] [PASSED] Link rate 1000000 lane count 2
[13:52:36] [PASSED] Link rate 1000000 lane count 1
[13:52:36] [PASSED] Link rate 810000 lane count 4
[13:52:36] [PASSED] Link rate 810000 lane count 2
[13:52:36] [PASSED] Link rate 810000 lane count 1
[13:52:36] [PASSED] Link rate 540000 lane count 4
[13:52:36] [PASSED] Link rate 540000 lane count 2
[13:52:36] [PASSED] Link rate 540000 lane count 1
[13:52:36] [PASSED] Link rate 270000 lane count 4
[13:52:36] [PASSED] Link rate 270000 lane count 2
[13:52:36] [PASSED] Link rate 270000 lane count 1
[13:52:36] [PASSED] Link rate 162000 lane count 4
[13:52:36] [PASSED] Link rate 162000 lane count 2
[13:52:36] [PASSED] Link rate 162000 lane count 1
[13:52:36] ========== [PASSED] drm_test_dp_mst_calc_pbn_div ===========
[13:52:36] ========= drm_test_dp_mst_sideband_msg_req_decode  =========
[13:52:36] [PASSED] DP_ENUM_PATH_RESOURCES with port number
[13:52:36] [PASSED] DP_POWER_UP_PHY with port number
[13:52:36] [PASSED] DP_POWER_DOWN_PHY with port number
[13:52:36] [PASSED] DP_ALLOCATE_PAYLOAD with SDP stream sinks
[13:52:36] [PASSED] DP_ALLOCATE_PAYLOAD with port number
[13:52:36] [PASSED] DP_ALLOCATE_PAYLOAD with VCPI
[13:52:36] [PASSED] DP_ALLOCATE_PAYLOAD with PBN
[13:52:36] [PASSED] DP_QUERY_PAYLOAD with port number
[13:52:36] [PASSED] DP_QUERY_PAYLOAD with VCPI
[13:52:36] [PASSED] DP_REMOTE_DPCD_READ with port number
[13:52:36] [PASSED] DP_REMOTE_DPCD_READ with DPCD address
[13:52:36] [PASSED] DP_REMOTE_DPCD_READ with max number of bytes
[13:52:36] [PASSED] DP_REMOTE_DPCD_WRITE with port number
[13:52:36] [PASSED] DP_REMOTE_DPCD_WRITE with DPCD address
[13:52:36] [PASSED] DP_REMOTE_DPCD_WRITE with data array
[13:52:36] [PASSED] DP_REMOTE_I2C_READ with port number
[13:52:36] [PASSED] DP_REMOTE_I2C_READ with I2C device ID
[13:52:36] [PASSED] DP_REMOTE_I2C_READ with transactions array
[13:52:36] [PASSED] DP_REMOTE_I2C_WRITE with port number
[13:52:36] [PASSED] DP_REMOTE_I2C_WRITE with I2C device ID
[13:52:36] [PASSED] DP_REMOTE_I2C_WRITE with data array
[13:52:36] [PASSED] DP_QUERY_STREAM_ENC_STATUS with stream ID
[13:52:36] [PASSED] DP_QUERY_STREAM_ENC_STATUS with client ID
[13:52:36] [PASSED] DP_QUERY_STREAM_ENC_STATUS with stream event
[13:52:36] [PASSED] DP_QUERY_STREAM_ENC_STATUS with valid stream event
[13:52:36] [PASSED] DP_QUERY_STREAM_ENC_STATUS with stream behavior
[13:52:36] [PASSED] DP_QUERY_STREAM_ENC_STATUS with a valid stream behavior
[13:52:36] ===== [PASSED] drm_test_dp_mst_sideband_msg_req_decode =====
[13:52:36] ================ [PASSED] drm_dp_mst_helper ================
[13:52:36] ================== drm_exec (7 subtests) ===================
[13:52:36] [PASSED] sanitycheck
[13:52:36] [PASSED] test_lock
[13:52:36] [PASSED] test_lock_unlock
[13:52:36] [PASSED] test_duplicates
[13:52:36] [PASSED] test_prepare
[13:52:36] [PASSED] test_prepare_array
[13:52:36] [PASSED] test_multiple_loops
[13:52:36] ==================== [PASSED] drm_exec =====================
[13:52:36] =========== drm_format_helper_test (17 subtests) ===========
[13:52:36] ============== drm_test_fb_xrgb8888_to_gray8  ==============
[13:52:36] [PASSED] single_pixel_source_buffer
[13:52:36] [PASSED] single_pixel_clip_rectangle
[13:52:36] [PASSED] well_known_colors
[13:52:36] [PASSED] destination_pitch
[13:52:36] ========== [PASSED] drm_test_fb_xrgb8888_to_gray8 ==========
[13:52:36] ============= drm_test_fb_xrgb8888_to_rgb332  ==============
[13:52:36] [PASSED] single_pixel_source_buffer
[13:52:36] [PASSED] single_pixel_clip_rectangle
[13:52:36] [PASSED] well_known_colors
[13:52:36] [PASSED] destination_pitch
[13:52:36] ========= [PASSED] drm_test_fb_xrgb8888_to_rgb332 ==========
[13:52:36] ============= drm_test_fb_xrgb8888_to_rgb565  ==============
[13:52:36] [PASSED] single_pixel_source_buffer
[13:52:36] [PASSED] single_pixel_clip_rectangle
[13:52:36] [PASSED] well_known_colors
[13:52:36] [PASSED] destination_pitch
[13:52:36] ========= [PASSED] drm_test_fb_xrgb8888_to_rgb565 ==========
[13:52:36] ============ drm_test_fb_xrgb8888_to_xrgb1555  =============
[13:52:36] [PASSED] single_pixel_source_buffer
[13:52:36] [PASSED] single_pixel_clip_rectangle
[13:52:36] [PASSED] well_known_colors
[13:52:36] [PASSED] destination_pitch
[13:52:36] ======== [PASSED] drm_test_fb_xrgb8888_to_xrgb1555 =========
[13:52:36] ============ drm_test_fb_xrgb8888_to_argb1555  =============
[13:52:36] [PASSED] single_pixel_source_buffer
[13:52:36] [PASSED] single_pixel_clip_rectangle
[13:52:36] [PASSED] well_known_colors
[13:52:36] [PASSED] destination_pitch
[13:52:36] ======== [PASSED] drm_test_fb_xrgb8888_to_argb1555 =========
[13:52:36] ============ drm_test_fb_xrgb8888_to_rgba5551  =============
[13:52:36] [PASSED] single_pixel_source_buffer
[13:52:36] [PASSED] single_pixel_clip_rectangle
[13:52:36] [PASSED] well_known_colors
[13:52:36] [PASSED] destination_pitch
[13:52:36] ======== [PASSED] drm_test_fb_xrgb8888_to_rgba5551 =========
[13:52:36] ============= drm_test_fb_xrgb8888_to_rgb888  ==============
[13:52:36] [PASSED] single_pixel_source_buffer
[13:52:36] [PASSED] single_pixel_clip_rectangle
[13:52:36] [PASSED] well_known_colors
[13:52:36] [PASSED] destination_pitch
[13:52:36] ========= [PASSED] drm_test_fb_xrgb8888_to_rgb888 ==========
[13:52:36] ============= drm_test_fb_xrgb8888_to_bgr888  ==============
[13:52:36] [PASSED] single_pixel_source_buffer
[13:52:36] [PASSED] single_pixel_clip_rectangle
[13:52:36] [PASSED] well_known_colors
[13:52:36] [PASSED] destination_pitch
[13:52:36] ========= [PASSED] drm_test_fb_xrgb8888_to_bgr888 ==========
[13:52:36] ============ drm_test_fb_xrgb8888_to_argb8888  =============
[13:52:36] [PASSED] single_pixel_source_buffer
[13:52:36] [PASSED] single_pixel_clip_rectangle
[13:52:36] [PASSED] well_known_colors
[13:52:36] [PASSED] destination_pitch
[13:52:36] ======== [PASSED] drm_test_fb_xrgb8888_to_argb8888 =========
[13:52:36] =========== drm_test_fb_xrgb8888_to_xrgb2101010  ===========
[13:52:36] [PASSED] single_pixel_source_buffer
[13:52:36] [PASSED] single_pixel_clip_rectangle
[13:52:36] [PASSED] well_known_colors
[13:52:36] [PASSED] destination_pitch
[13:52:36] ======= [PASSED] drm_test_fb_xrgb8888_to_xrgb2101010 =======
[13:52:36] =========== drm_test_fb_xrgb8888_to_argb2101010  ===========
[13:52:36] [PASSED] single_pixel_source_buffer
[13:52:36] [PASSED] single_pixel_clip_rectangle
[13:52:36] [PASSED] well_known_colors
[13:52:36] [PASSED] destination_pitch
[13:52:36] ======= [PASSED] drm_test_fb_xrgb8888_to_argb2101010 =======
[13:52:36] ============== drm_test_fb_xrgb8888_to_mono  ===============
[13:52:36] [PASSED] single_pixel_source_buffer
[13:52:36] [PASSED] single_pixel_clip_rectangle
[13:52:36] [PASSED] well_known_colors
[13:52:36] [PASSED] destination_pitch
[13:52:36] ========== [PASSED] drm_test_fb_xrgb8888_to_mono ===========
[13:52:36] ==================== drm_test_fb_swab  =====================
[13:52:36] [PASSED] single_pixel_source_buffer
[13:52:36] [PASSED] single_pixel_clip_rectangle
[13:52:36] [PASSED] well_known_colors
[13:52:36] [PASSED] destination_pitch
[13:52:36] ================ [PASSED] drm_test_fb_swab =================
[13:52:36] ============ drm_test_fb_xrgb8888_to_xbgr8888  =============
[13:52:36] [PASSED] single_pixel_source_buffer
[13:52:36] [PASSED] single_pixel_clip_rectangle
[13:52:36] [PASSED] well_known_colors
[13:52:36] [PASSED] destination_pitch
[13:52:36] ======== [PASSED] drm_test_fb_xrgb8888_to_xbgr8888 =========
[13:52:36] ============ drm_test_fb_xrgb8888_to_abgr8888  =============
[13:52:36] [PASSED] single_pixel_source_buffer
[13:52:36] [PASSED] single_pixel_clip_rectangle
[13:52:36] [PASSED] well_known_colors
[13:52:36] [PASSED] destination_pitch
[13:52:36] ======== [PASSED] drm_test_fb_xrgb8888_to_abgr8888 =========
[13:52:36] ================= drm_test_fb_clip_offset  =================
[13:52:36] [PASSED] pass through
[13:52:36] [PASSED] horizontal offset
[13:52:36] [PASSED] vertical offset
[13:52:36] [PASSED] horizontal and vertical offset
[13:52:36] [PASSED] horizontal offset (custom pitch)
[13:52:36] [PASSED] vertical offset (custom pitch)
[13:52:36] [PASSED] horizontal and vertical offset (custom pitch)
[13:52:36] ============= [PASSED] drm_test_fb_clip_offset =============
[13:52:36] =================== drm_test_fb_memcpy  ====================
[13:52:36] [PASSED] single_pixel_source_buffer: XR24 little-endian (0x34325258)
[13:52:36] [PASSED] single_pixel_source_buffer: XRA8 little-endian (0x38415258)
[13:52:36] [PASSED] single_pixel_source_buffer: YU24 little-endian (0x34325559)
[13:52:36] [PASSED] single_pixel_clip_rectangle: XB24 little-endian (0x34324258)
[13:52:36] [PASSED] single_pixel_clip_rectangle: XRA8 little-endian (0x38415258)
[13:52:36] [PASSED] single_pixel_clip_rectangle: YU24 little-endian (0x34325559)
[13:52:36] [PASSED] well_known_colors: XB24 little-endian (0x34324258)
[13:52:36] [PASSED] well_known_colors: XRA8 little-endian (0x38415258)
[13:52:36] [PASSED] well_known_colors: YU24 little-endian (0x34325559)
[13:52:36] [PASSED] destination_pitch: XB24 little-endian (0x34324258)
[13:52:36] [PASSED] destination_pitch: XRA8 little-endian (0x38415258)
[13:52:36] [PASSED] destination_pitch: YU24 little-endian (0x34325559)
[13:52:36] =============== [PASSED] drm_test_fb_memcpy ================
[13:52:36] ============= [PASSED] drm_format_helper_test ==============
[13:52:36] ================= drm_format (18 subtests) =================
[13:52:36] [PASSED] drm_test_format_block_width_invalid
[13:52:36] [PASSED] drm_test_format_block_width_one_plane
[13:52:36] [PASSED] drm_test_format_block_width_two_plane
[13:52:36] [PASSED] drm_test_format_block_width_three_plane
[13:52:36] [PASSED] drm_test_format_block_width_tiled
[13:52:36] [PASSED] drm_test_format_block_height_invalid
[13:52:36] [PASSED] drm_test_format_block_height_one_plane
[13:52:36] [PASSED] drm_test_format_block_height_two_plane
[13:52:36] [PASSED] drm_test_format_block_height_three_plane
[13:52:36] [PASSED] drm_test_format_block_height_tiled
[13:52:36] [PASSED] drm_test_format_min_pitch_invalid
[13:52:36] [PASSED] drm_test_format_min_pitch_one_plane_8bpp
[13:52:36] [PASSED] drm_test_format_min_pitch_one_plane_16bpp
[13:52:36] [PASSED] drm_test_format_min_pitch_one_plane_24bpp
[13:52:36] [PASSED] drm_test_format_min_pitch_one_plane_32bpp
[13:52:36] [PASSED] drm_test_format_min_pitch_two_plane
[13:52:36] [PASSED] drm_test_format_min_pitch_three_plane_8bpp
[13:52:36] [PASSED] drm_test_format_min_pitch_tiled
[13:52:36] =================== [PASSED] drm_format ====================
[13:52:36] ============== drm_framebuffer (10 subtests) ===============
[13:52:36] ========== drm_test_framebuffer_check_src_coords  ==========
[13:52:36] [PASSED] Success: source fits into fb
[13:52:36] [PASSED] Fail: overflowing fb with x-axis coordinate
[13:52:36] [PASSED] Fail: overflowing fb with y-axis coordinate
[13:52:36] [PASSED] Fail: overflowing fb with source width
[13:52:36] [PASSED] Fail: overflowing fb with source height
[13:52:36] ====== [PASSED] drm_test_framebuffer_check_src_coords ======
[13:52:36] [PASSED] drm_test_framebuffer_cleanup
[13:52:36] =============== drm_test_framebuffer_create  ===============
[13:52:36] [PASSED] ABGR8888 normal sizes
[13:52:36] [PASSED] ABGR8888 max sizes
[13:52:36] [PASSED] ABGR8888 pitch greater than min required
[13:52:36] [PASSED] ABGR8888 pitch less than min required
[13:52:36] [PASSED] ABGR8888 Invalid width
[13:52:36] [PASSED] ABGR8888 Invalid buffer handle
[13:52:36] [PASSED] No pixel format
[13:52:36] [PASSED] ABGR8888 Width 0
[13:52:36] [PASSED] ABGR8888 Height 0
[13:52:36] [PASSED] ABGR8888 Out of bound height * pitch combination
[13:52:36] [PASSED] ABGR8888 Large buffer offset
[13:52:36] [PASSED] ABGR8888 Buffer offset for inexistent plane
[13:52:36] [PASSED] ABGR8888 Invalid flag
[13:52:36] [PASSED] ABGR8888 Set DRM_MODE_FB_MODIFIERS without modifiers
[13:52:36] [PASSED] ABGR8888 Valid buffer modifier
[13:52:36] [PASSED] ABGR8888 Invalid buffer modifier(DRM_FORMAT_MOD_SAMSUNG_64_32_TILE)
[13:52:36] [PASSED] ABGR8888 Extra pitches without DRM_MODE_FB_MODIFIERS
[13:52:36] [PASSED] ABGR8888 Extra pitches with DRM_MODE_FB_MODIFIERS
[13:52:36] [PASSED] NV12 Normal sizes
[13:52:36] [PASSED] NV12 Max sizes
[13:52:36] [PASSED] NV12 Invalid pitch
[13:52:36] [PASSED] NV12 Invalid modifier/missing DRM_MODE_FB_MODIFIERS flag
[13:52:36] [PASSED] NV12 different  modifier per-plane
[13:52:36] [PASSED] NV12 with DRM_FORMAT_MOD_SAMSUNG_64_32_TILE
[13:52:36] [PASSED] NV12 Valid modifiers without DRM_MODE_FB_MODIFIERS
[13:52:36] [PASSED] NV12 Modifier for inexistent plane
[13:52:36] [PASSED] NV12 Handle for inexistent plane
[13:52:36] [PASSED] NV12 Handle for inexistent plane without DRM_MODE_FB_MODIFIERS
[13:52:36] [PASSED] YVU420 DRM_MODE_FB_MODIFIERS set without modifier
[13:52:36] [PASSED] YVU420 Normal sizes
[13:52:36] [PASSED] YVU420 Max sizes
[13:52:36] [PASSED] YVU420 Invalid pitch
[13:52:36] [PASSED] YVU420 Different pitches
[13:52:36] [PASSED] YVU420 Different buffer offsets/pitches
[13:52:36] [PASSED] YVU420 Modifier set just for plane 0, without DRM_MODE_FB_MODIFIERS
[13:52:36] [PASSED] YVU420 Modifier set just for planes 0, 1, without DRM_MODE_FB_MODIFIERS
[13:52:36] [PASSED] YVU420 Modifier set just for plane 0, 1, with DRM_MODE_FB_MODIFIERS
[13:52:36] [PASSED] YVU420 Valid modifier
[13:52:36] [PASSED] YVU420 Different modifiers per plane
[13:52:36] [PASSED] YVU420 Modifier for inexistent plane
[13:52:36] [PASSED] YUV420_10BIT Invalid modifier(DRM_FORMAT_MOD_LINEAR)
[13:52:36] [PASSED] X0L2 Normal sizes
[13:52:36] [PASSED] X0L2 Max sizes
[13:52:36] [PASSED] X0L2 Invalid pitch
[13:52:36] [PASSED] X0L2 Pitch greater than minimum required
[13:52:36] [PASSED] X0L2 Handle for inexistent plane
[13:52:36] [PASSED] X0L2 Offset for inexistent plane, without DRM_MODE_FB_MODIFIERS set
[13:52:36] [PASSED] X0L2 Modifier without DRM_MODE_FB_MODIFIERS set
[13:52:36] [PASSED] X0L2 Valid modifier
[13:52:36] [PASSED] X0L2 Modifier for inexistent plane
[13:52:36] =========== [PASSED] drm_test_framebuffer_create ===========
[13:52:36] [PASSED] drm_test_framebuffer_free
[13:52:36] [PASSED] drm_test_framebuffer_init
[13:52:36] [PASSED] drm_test_framebuffer_init_bad_format
[13:52:36] [PASSED] drm_test_framebuffer_init_dev_mismatch
[13:52:36] [PASSED] drm_test_framebuffer_lookup
[13:52:36] [PASSED] drm_test_framebuffer_lookup_inexistent
[13:52:36] [PASSED] drm_test_framebuffer_modifiers_not_supported
[13:52:36] ================= [PASSED] drm_framebuffer =================
[13:52:36] ================ drm_gem_shmem (8 subtests) ================
[13:52:36] [PASSED] drm_gem_shmem_test_obj_create
[13:52:36] [PASSED] drm_gem_shmem_test_obj_create_private
[13:52:36] [PASSED] drm_gem_shmem_test_pin_pages
[13:52:36] [PASSED] drm_gem_shmem_test_vmap
[13:52:36] [PASSED] drm_gem_shmem_test_get_pages_sgt
[13:52:36] [PASSED] drm_gem_shmem_test_get_sg_table
[13:52:36] [PASSED] drm_gem_shmem_test_madvise
[13:52:36] [PASSED] drm_gem_shmem_test_purge
[13:52:36] ================== [PASSED] drm_gem_shmem ==================
[13:52:36] === drm_atomic_helper_connector_hdmi_check (27 subtests) ===
[13:52:36] [PASSED] drm_test_check_broadcast_rgb_auto_cea_mode
[13:52:36] [PASSED] drm_test_check_broadcast_rgb_auto_cea_mode_vic_1
[13:52:36] [PASSED] drm_test_check_broadcast_rgb_full_cea_mode
[13:52:36] [PASSED] drm_test_check_broadcast_rgb_full_cea_mode_vic_1
[13:52:36] [PASSED] drm_test_check_broadcast_rgb_limited_cea_mode
[13:52:36] [PASSED] drm_test_check_broadcast_rgb_limited_cea_mode_vic_1
[13:52:36] ====== drm_test_check_broadcast_rgb_cea_mode_yuv420  =======
[13:52:36] [PASSED] Automatic
[13:52:36] [PASSED] Full
[13:52:36] [PASSED] Limited 16:235
[13:52:36] == [PASSED] drm_test_check_broadcast_rgb_cea_mode_yuv420 ===
[13:52:36] [PASSED] drm_test_check_broadcast_rgb_crtc_mode_changed
[13:52:36] [PASSED] drm_test_check_broadcast_rgb_crtc_mode_not_changed
[13:52:36] [PASSED] drm_test_check_disable_connector
[13:52:36] [PASSED] drm_test_check_hdmi_funcs_reject_rate
[13:52:36] [PASSED] drm_test_check_max_tmds_rate_bpc_fallback_rgb
[13:52:36] [PASSED] drm_test_check_max_tmds_rate_bpc_fallback_yuv420
[13:52:36] [PASSED] drm_test_check_max_tmds_rate_bpc_fallback_ignore_yuv422
[13:52:36] [PASSED] drm_test_check_max_tmds_rate_bpc_fallback_ignore_yuv420
[13:52:36] [PASSED] drm_test_check_driver_unsupported_fallback_yuv420
[13:52:36] [PASSED] drm_test_check_output_bpc_crtc_mode_changed
[13:52:36] [PASSED] drm_test_check_output_bpc_crtc_mode_not_changed
[13:52:36] [PASSED] drm_test_check_output_bpc_dvi
[13:52:36] [PASSED] drm_test_check_output_bpc_format_vic_1
[13:52:36] [PASSED] drm_test_check_output_bpc_format_display_8bpc_only
[13:52:36] [PASSED] drm_test_check_output_bpc_format_display_rgb_only
[13:52:36] [PASSED] drm_test_check_output_bpc_format_driver_8bpc_only
[13:52:36] [PASSED] drm_test_check_output_bpc_format_driver_rgb_only
[13:52:36] [PASSED] drm_test_check_tmds_char_rate_rgb_8bpc
[13:52:36] [PASSED] drm_test_check_tmds_char_rate_rgb_10bpc
[13:52:36] [PASSED] drm_test_check_tmds_char_rate_rgb_12bpc
[13:52:36] ===== [PASSED] drm_atomic_helper_connector_hdmi_check ======
[13:52:36] === drm_atomic_helper_connector_hdmi_reset (6 subtests) ====
[13:52:36] [PASSED] drm_test_check_broadcast_rgb_value
[13:52:36] [PASSED] drm_test_check_bpc_8_value
[13:52:36] [PASSED] drm_test_check_bpc_10_value
[13:52:36] [PASSED] drm_test_check_bpc_12_value
[13:52:36] [PASSED] drm_test_check_format_value
[13:52:36] [PASSED] drm_test_check_tmds_char_value
[13:52:36] ===== [PASSED] drm_atomic_helper_connector_hdmi_reset ======
[13:52:36] = drm_atomic_helper_connector_hdmi_mode_valid (4 subtests) =
[13:52:36] [PASSED] drm_test_check_mode_valid
[13:52:36] [PASSED] drm_test_check_mode_valid_reject
[13:52:36] [PASSED] drm_test_check_mode_valid_reject_rate
[13:52:36] [PASSED] drm_test_check_mode_valid_reject_max_clock
[13:52:36] === [PASSED] drm_atomic_helper_connector_hdmi_mode_valid ===
[13:52:36] ================= drm_managed (2 subtests) =================
[13:52:36] [PASSED] drm_test_managed_release_action
[13:52:36] [PASSED] drm_test_managed_run_action
[13:52:36] =================== [PASSED] drm_managed ===================
[13:52:36] =================== drm_mm (6 subtests) ====================
[13:52:36] [PASSED] drm_test_mm_init
[13:52:36] [PASSED] drm_test_mm_debug
[13:52:36] [PASSED] drm_test_mm_align32
[13:52:36] [PASSED] drm_test_mm_align64
[13:52:36] [PASSED] drm_test_mm_lowest
[13:52:36] [PASSED] drm_test_mm_highest
[13:52:36] ===================== [PASSED] drm_mm ======================
[13:52:36] ============= drm_modes_analog_tv (5 subtests) =============
[13:52:36] [PASSED] drm_test_modes_analog_tv_mono_576i
[13:52:36] [PASSED] drm_test_modes_analog_tv_ntsc_480i
[13:52:36] [PASSED] drm_test_modes_analog_tv_ntsc_480i_inlined
[13:52:36] [PASSED] drm_test_modes_analog_tv_pal_576i
[13:52:36] [PASSED] drm_test_modes_analog_tv_pal_576i_inlined
[13:52:36] =============== [PASSED] drm_modes_analog_tv ===============
[13:52:36] ============== drm_plane_helper (2 subtests) ===============
[13:52:36] =============== drm_test_check_plane_state  ================
[13:52:36] [PASSED] clipping_simple
[13:52:36] [PASSED] clipping_rotate_reflect
[13:52:36] [PASSED] positioning_simple
[13:52:36] [PASSED] upscaling
[13:52:36] [PASSED] downscaling
[13:52:36] [PASSED] rounding1
[13:52:36] [PASSED] rounding2
[13:52:36] [PASSED] rounding3
[13:52:36] [PASSED] rounding4
[13:52:36] =========== [PASSED] drm_test_check_plane_state ============
[13:52:36] =========== drm_test_check_invalid_plane_state  ============
[13:52:36] [PASSED] positioning_invalid
[13:52:36] [PASSED] upscaling_invalid
[13:52:36] [PASSED] downscaling_invalid
[13:52:36] ======= [PASSED] drm_test_check_invalid_plane_state ========
[13:52:36] ================ [PASSED] drm_plane_helper =================
[13:52:36] ====== drm_connector_helper_tv_get_modes (1 subtest) =======
[13:52:36] ====== drm_test_connector_helper_tv_get_modes_check  =======
[13:52:36] [PASSED] None
[13:52:36] [PASSED] PAL
[13:52:36] [PASSED] NTSC
[13:52:36] [PASSED] Both, NTSC Default
[13:52:36] [PASSED] Both, PAL Default
[13:52:36] [PASSED] Both, NTSC Default, with PAL on command-line
[13:52:36] [PASSED] Both, PAL Default, with NTSC on command-line
[13:52:36] == [PASSED] drm_test_connector_helper_tv_get_modes_check ===
[13:52:36] ======== [PASSED] drm_connector_helper_tv_get_modes ========
[13:52:36] ================== drm_rect (9 subtests) ===================
[13:52:36] [PASSED] drm_test_rect_clip_scaled_div_by_zero
[13:52:36] [PASSED] drm_test_rect_clip_scaled_not_clipped
[13:52:36] [PASSED] drm_test_rect_clip_scaled_clipped
[13:52:36] [PASSED] drm_test_rect_clip_scaled_signed_vs_unsigned
[13:52:36] ================= drm_test_rect_intersect  =================
[13:52:36] [PASSED] top-left x bottom-right: 2x2+1+1 x 2x2+0+0
[13:52:36] [PASSED] top-right x bottom-left: 2x2+0+0 x 2x2+1-1
[13:52:36] [PASSED] bottom-left x top-right: 2x2+1-1 x 2x2+0+0
[13:52:36] [PASSED] bottom-right x top-left: 2x2+0+0 x 2x2+1+1
[13:52:36] [PASSED] right x left: 2x1+0+0 x 3x1+1+0
[13:52:36] [PASSED] left x right: 3x1+1+0 x 2x1+0+0
[13:52:36] [PASSED] up x bottom: 1x2+0+0 x 1x3+0-1
[13:52:36] [PASSED] bottom x up: 1x3+0-1 x 1x2+0+0
[13:52:36] [PASSED] touching corner: 1x1+0+0 x 2x2+1+1
[13:52:36] [PASSED] touching side: 1x1+0+0 x 1x1+1+0
[13:52:36] [PASSED] equal rects: 2x2+0+0 x 2x2+0+0
[13:52:36] [PASSED] inside another: 2x2+0+0 x 1x1+1+1
[13:52:36] [PASSED] far away: 1x1+0+0 x 1x1+3+6
[13:52:36] [PASSED] points intersecting: 0x0+5+10 x 0x0+5+10
[13:52:36] [PASSED] points not intersecting: 0x0+0+0 x 0x0+5+10
[13:52:36] ============= [PASSED] drm_test_rect_intersect =============
[13:52:36] ================ drm_test_rect_calc_hscale  ================
[13:52:36] [PASSED] normal use
[13:52:36] [PASSED] out of max range
[13:52:36] [PASSED] out of min range
[13:52:36] [PASSED] zero dst
[13:52:36] [PASSED] negative src
[13:52:36] [PASSED] negative dst
[13:52:36] ============ [PASSED] drm_test_rect_calc_hscale ============
[13:52:36] ================ drm_test_rect_calc_vscale  ================
[13:52:36] [PASSED] normal use
stty: 'standard input': Inappropriate ioctl for device
[13:52:36] [PASSED] out of max range
[13:52:36] [PASSED] out of min range
[13:52:36] [PASSED] zero dst
[13:52:36] [PASSED] negative src
[13:52:36] [PASSED] negative dst
[13:52:36] ============ [PASSED] drm_test_rect_calc_vscale ============
[13:52:36] ================== drm_test_rect_rotate  ===================
[13:52:36] [PASSED] reflect-x
[13:52:36] [PASSED] reflect-y
[13:52:36] [PASSED] rotate-0
[13:52:36] [PASSED] rotate-90
[13:52:36] [PASSED] rotate-180
[13:52:36] [PASSED] rotate-270
[13:52:36] ============== [PASSED] drm_test_rect_rotate ===============
[13:52:36] ================ drm_test_rect_rotate_inv  =================
[13:52:36] [PASSED] reflect-x
[13:52:36] [PASSED] reflect-y
[13:52:36] [PASSED] rotate-0
[13:52:36] [PASSED] rotate-90
[13:52:36] [PASSED] rotate-180
[13:52:36] [PASSED] rotate-270
[13:52:36] ============ [PASSED] drm_test_rect_rotate_inv =============
[13:52:36] ==================== [PASSED] drm_rect =====================
[13:52:36] ============ drm_sysfb_modeset_test (1 subtest) ============
[13:52:36] ============ drm_test_sysfb_build_fourcc_list  =============
[13:52:36] [PASSED] no native formats
[13:52:36] [PASSED] XRGB8888 as native format
[13:52:36] [PASSED] remove duplicates
[13:52:36] [PASSED] convert alpha formats
[13:52:36] [PASSED] random formats
[13:52:36] ======== [PASSED] drm_test_sysfb_build_fourcc_list =========
[13:52:36] ============= [PASSED] drm_sysfb_modeset_test ==============
[13:52:36] ================== drm_fixp (2 subtests) ===================
[13:52:36] [PASSED] drm_test_int2fixp
[13:52:36] [PASSED] drm_test_sm2fixp
[13:52:36] ==================== [PASSED] drm_fixp =====================
[13:52:36] ============================================================
[13:52:36] Testing complete. Ran 624 tests: passed: 624
[13:52:36] Elapsed time: 27.216s total, 1.666s configuring, 25.131s building, 0.408s running

+ /kernel/tools/testing/kunit/kunit.py run --kunitconfig /kernel/drivers/gpu/drm/ttm/tests/.kunitconfig
[13:52:36] Configuring KUnit Kernel ...
Regenerating .config ...
Populating config with:
$ make ARCH=um O=.kunit olddefconfig
[13:52:38] Building KUnit Kernel ...
Populating config with:
$ make ARCH=um O=.kunit olddefconfig
Building with:
$ make all compile_commands.json scripts_gdb ARCH=um O=.kunit --jobs=48
[13:52:47] Starting KUnit Kernel (1/1)...
[13:52:47] ============================================================
Running tests with:
$ .kunit/linux kunit.enable=1 mem=1G console=tty kunit_shutdown=halt
[13:52:48] ================= ttm_device (5 subtests) ==================
[13:52:48] [PASSED] ttm_device_init_basic
[13:52:48] [PASSED] ttm_device_init_multiple
[13:52:48] [PASSED] ttm_device_fini_basic
[13:52:48] [PASSED] ttm_device_init_no_vma_man
[13:52:48] ================== ttm_device_init_pools  ==================
[13:52:48] [PASSED] No DMA allocations, no DMA32 required
[13:52:48] [PASSED] DMA allocations, DMA32 required
[13:52:48] [PASSED] No DMA allocations, DMA32 required
[13:52:48] [PASSED] DMA allocations, no DMA32 required
[13:52:48] ============== [PASSED] ttm_device_init_pools ==============
[13:52:48] =================== [PASSED] ttm_device ====================
[13:52:48] ================== ttm_pool (8 subtests) ===================
[13:52:48] ================== ttm_pool_alloc_basic  ===================
[13:52:48] [PASSED] One page
[13:52:48] [PASSED] More than one page
[13:52:48] [PASSED] Above the allocation limit
[13:52:48] [PASSED] One page, with coherent DMA mappings enabled
[13:52:48] [PASSED] Above the allocation limit, with coherent DMA mappings enabled
[13:52:48] ============== [PASSED] ttm_pool_alloc_basic ===============
[13:52:48] ============== ttm_pool_alloc_basic_dma_addr  ==============
[13:52:48] [PASSED] One page
[13:52:48] [PASSED] More than one page
[13:52:48] [PASSED] Above the allocation limit
[13:52:48] [PASSED] One page, with coherent DMA mappings enabled
[13:52:48] [PASSED] Above the allocation limit, with coherent DMA mappings enabled
[13:52:48] ========== [PASSED] ttm_pool_alloc_basic_dma_addr ==========
[13:52:48] [PASSED] ttm_pool_alloc_order_caching_match
[13:52:48] [PASSED] ttm_pool_alloc_caching_mismatch
[13:52:48] [PASSED] ttm_pool_alloc_order_mismatch
[13:52:48] [PASSED] ttm_pool_free_dma_alloc
[13:52:48] [PASSED] ttm_pool_free_no_dma_alloc
[13:52:48] [PASSED] ttm_pool_fini_basic
[13:52:48] ==================== [PASSED] ttm_pool =====================
[13:52:48] ================ ttm_resource (8 subtests) =================
[13:52:48] ================= ttm_resource_init_basic  =================
[13:52:48] [PASSED] Init resource in TTM_PL_SYSTEM
[13:52:48] [PASSED] Init resource in TTM_PL_VRAM
[13:52:48] [PASSED] Init resource in a private placement
[13:52:48] [PASSED] Init resource in TTM_PL_SYSTEM, set placement flags
[13:52:48] ============= [PASSED] ttm_resource_init_basic =============
[13:52:48] [PASSED] ttm_resource_init_pinned
[13:52:48] [PASSED] ttm_resource_fini_basic
[13:52:48] [PASSED] ttm_resource_manager_init_basic
[13:52:48] [PASSED] ttm_resource_manager_usage_basic
[13:52:48] [PASSED] ttm_resource_manager_set_used_basic
[13:52:48] [PASSED] ttm_sys_man_alloc_basic
[13:52:48] [PASSED] ttm_sys_man_free_basic
[13:52:48] ================== [PASSED] ttm_resource ===================
[13:52:48] =================== ttm_tt (15 subtests) ===================
[13:52:48] ==================== ttm_tt_init_basic  ====================
[13:52:48] [PASSED] Page-aligned size
[13:52:48] [PASSED] Extra pages requested
[13:52:48] ================ [PASSED] ttm_tt_init_basic ================
[13:52:48] [PASSED] ttm_tt_init_misaligned
[13:52:48] [PASSED] ttm_tt_fini_basic
[13:52:48] [PASSED] ttm_tt_fini_sg
[13:52:48] [PASSED] ttm_tt_fini_shmem
[13:52:48] [PASSED] ttm_tt_create_basic
[13:52:48] [PASSED] ttm_tt_create_invalid_bo_type
[13:52:48] [PASSED] ttm_tt_create_ttm_exists
[13:52:48] [PASSED] ttm_tt_create_failed
[13:52:48] [PASSED] ttm_tt_destroy_basic
[13:52:48] [PASSED] ttm_tt_populate_null_ttm
[13:52:48] [PASSED] ttm_tt_populate_populated_ttm
[13:52:48] [PASSED] ttm_tt_unpopulate_basic
[13:52:48] [PASSED] ttm_tt_unpopulate_empty_ttm
[13:52:48] [PASSED] ttm_tt_swapin_basic
[13:52:48] ===================== [PASSED] ttm_tt ======================
[13:52:48] =================== ttm_bo (14 subtests) ===================
[13:52:48] =========== ttm_bo_reserve_optimistic_no_ticket  ===========
[13:52:48] [PASSED] Cannot be interrupted and sleeps
[13:52:48] [PASSED] Cannot be interrupted, locks straight away
[13:52:48] [PASSED] Can be interrupted, sleeps
[13:52:48] ======= [PASSED] ttm_bo_reserve_optimistic_no_ticket =======
[13:52:48] [PASSED] ttm_bo_reserve_locked_no_sleep
[13:52:48] [PASSED] ttm_bo_reserve_no_wait_ticket
[13:52:48] [PASSED] ttm_bo_reserve_double_resv
[13:52:48] [PASSED] ttm_bo_reserve_interrupted
[13:52:48] [PASSED] ttm_bo_reserve_deadlock
[13:52:48] [PASSED] ttm_bo_unreserve_basic
[13:52:48] [PASSED] ttm_bo_unreserve_pinned
[13:52:48] [PASSED] ttm_bo_unreserve_bulk
[13:52:48] [PASSED] ttm_bo_fini_basic
[13:52:48] [PASSED] ttm_bo_fini_shared_resv
[13:52:48] [PASSED] ttm_bo_pin_basic
[13:52:48] [PASSED] ttm_bo_pin_unpin_resource
[13:52:48] [PASSED] ttm_bo_multiple_pin_one_unpin
[13:52:48] ===================== [PASSED] ttm_bo ======================
[13:52:48] ============== ttm_bo_validate (21 subtests) ===============
[13:52:48] ============== ttm_bo_init_reserved_sys_man  ===============
[13:52:48] [PASSED] Buffer object for userspace
[13:52:48] [PASSED] Kernel buffer object
[13:52:48] [PASSED] Shared buffer object
[13:52:48] ========== [PASSED] ttm_bo_init_reserved_sys_man ===========
[13:52:48] ============== ttm_bo_init_reserved_mock_man  ==============
[13:52:48] [PASSED] Buffer object for userspace
[13:52:48] [PASSED] Kernel buffer object
[13:52:48] [PASSED] Shared buffer object
[13:52:48] ========== [PASSED] ttm_bo_init_reserved_mock_man ==========
[13:52:48] [PASSED] ttm_bo_init_reserved_resv
[13:52:48] ================== ttm_bo_validate_basic  ==================
[13:52:48] [PASSED] Buffer object for userspace
[13:52:48] [PASSED] Kernel buffer object
[13:52:48] [PASSED] Shared buffer object
[13:52:48] ============== [PASSED] ttm_bo_validate_basic ==============
[13:52:48] [PASSED] ttm_bo_validate_invalid_placement
[13:52:48] ============= ttm_bo_validate_same_placement  ==============
[13:52:48] [PASSED] System manager
[13:52:48] [PASSED] VRAM manager
[13:52:48] ========= [PASSED] ttm_bo_validate_same_placement ==========
[13:52:48] [PASSED] ttm_bo_validate_failed_alloc
[13:52:48] [PASSED] ttm_bo_validate_pinned
[13:52:48] [PASSED] ttm_bo_validate_busy_placement
[13:52:48] ================ ttm_bo_validate_multihop  =================
[13:52:48] [PASSED] Buffer object for userspace
[13:52:48] [PASSED] Kernel buffer object
[13:52:48] [PASSED] Shared buffer object
[13:52:48] ============ [PASSED] ttm_bo_validate_multihop =============
[13:52:48] ========== ttm_bo_validate_no_placement_signaled  ==========
[13:52:48] [PASSED] Buffer object in system domain, no page vector
[13:52:48] [PASSED] Buffer object in system domain with an existing page vector
[13:52:48] ====== [PASSED] ttm_bo_validate_no_placement_signaled ======
[13:52:48] ======== ttm_bo_validate_no_placement_not_signaled  ========
[13:52:48] [PASSED] Buffer object for userspace
[13:52:48] [PASSED] Kernel buffer object
[13:52:48] [PASSED] Shared buffer object
[13:52:48] ==== [PASSED] ttm_bo_validate_no_placement_not_signaled ====
[13:52:48] [PASSED] ttm_bo_validate_move_fence_signaled
[13:52:48] ========= ttm_bo_validate_move_fence_not_signaled  =========
[13:52:48] [PASSED] Waits for GPU
[13:52:48] [PASSED] Tries to lock straight away
[13:52:48] ===== [PASSED] ttm_bo_validate_move_fence_not_signaled =====
[13:52:48] [PASSED] ttm_bo_validate_happy_evict
[13:52:48] [PASSED] ttm_bo_validate_all_pinned_evict
[13:52:48] [PASSED] ttm_bo_validate_allowed_only_evict
[13:52:48] [PASSED] ttm_bo_validate_deleted_evict
[13:52:48] [PASSED] ttm_bo_validate_busy_domain_evict
[13:52:48] [PASSED] ttm_bo_validate_evict_gutting
[13:52:48] [PASSED] ttm_bo_validate_recrusive_evict
stty: 'standard input': Inappropriate ioctl for device
[13:52:48] ================= [PASSED] ttm_bo_validate =================
[13:52:48] ============================================================
[13:52:48] Testing complete. Ran 101 tests: passed: 101
[13:52:48] Elapsed time: 11.403s total, 1.652s configuring, 9.535s building, 0.177s running

+ cleanup
++ stat -c %u:%g /kernel
+ chown -R 1003:1003 /kernel



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

* [i915-rt v2.1] drm/i915/display: Remove locking from intel_vblank_evade critical section
  2025-12-16  9:22 ` [i915-rt v2 06/16] drm/i915/display: Remove locking from intel_vblank_evade " Maarten Lankhorst
@ 2025-12-16 20:15   ` Maarten Lankhorst
  2025-12-22 18:14   ` [i915-rt v2 06/16] " kernel test robot
  1 sibling, 0 replies; 21+ messages in thread
From: Maarten Lankhorst @ 2025-12-16 20:15 UTC (permalink / raw)
  To: intel-xe; +Cc: intel-gfx

finish_wait() may take a lock, which means that it can take any amount
of time. On PREEMPT-RT we should not be taking any lock after disabling
preemption, so ensure that the completion is done before disabling
interrupts.

This also has the benefit of making vblank evasion more deterministic,
by performing the final vblank check after all locking is done.

Signed-off-by: Maarten Lankhorst <dev@lankhorst.se>
---
 drivers/gpu/drm/i915/display/intel_crtc.c   |  2 +-
 drivers/gpu/drm/i915/display/intel_vblank.c | 30 +++++++++------------
 drivers/gpu/drm/i915/display/intel_vblank.h |  1 +
 3 files changed, 15 insertions(+), 18 deletions(-)

diff --git a/drivers/gpu/drm/i915/display/intel_crtc.c b/drivers/gpu/drm/i915/display/intel_crtc.c
index 778ebc5095c38..cb31c9c1c2525 100644
--- a/drivers/gpu/drm/i915/display/intel_crtc.c
+++ b/drivers/gpu/drm/i915/display/intel_crtc.c
@@ -684,7 +684,7 @@ void intel_pipe_update_end(struct intel_atomic_state *state,
 	struct intel_crtc_state *new_crtc_state =
 		intel_atomic_get_new_crtc_state(state, crtc);
 	enum pipe pipe = crtc->pipe;
-	int scanline_end = intel_get_crtc_scanline(crtc);
+	int scanline_end = __intel_get_crtc_scanline(crtc);
 	u32 end_vbl_count = intel_crtc_get_vblank_counter(crtc);
 	ktime_t end_vbl_time = ktime_get();
 
diff --git a/drivers/gpu/drm/i915/display/intel_vblank.c b/drivers/gpu/drm/i915/display/intel_vblank.c
index 2b106ffa3f5f5..289f390762b7c 100644
--- a/drivers/gpu/drm/i915/display/intel_vblank.c
+++ b/drivers/gpu/drm/i915/display/intel_vblank.c
@@ -242,7 +242,7 @@ int intel_crtc_scanline_offset(const struct intel_crtc_state *crtc_state)
  * intel_de_read_fw(), only for fast reads of display block, no need for
  * forcewake etc.
  */
-static int __intel_get_crtc_scanline(struct intel_crtc *crtc)
+int __intel_get_crtc_scanline(struct intel_crtc *crtc)
 {
 	struct intel_display *display = to_intel_display(crtc);
 	struct drm_vblank_crtc *vblank = drm_crtc_vblank_crtc(&crtc->base);
@@ -708,6 +708,16 @@ void intel_vblank_evade_init(const struct intel_crtc_state *old_crtc_state,
 		evade->min -= vblank_delay;
 }
 
+static bool scanline_in_safe_range(struct intel_vblank_evade_ctx *evade, int *scanline, bool unlocked)
+{
+	if (unlocked)
+		*scanline = intel_get_crtc_scanline(evade->crtc);
+	else
+		*scanline = __intel_get_crtc_scanline(evade->crtc);
+
+	return *scanline < evade->min || *scanline > evade->max;
+}
+
 /* must be called with vblank interrupt already enabled! */
 int intel_vblank_evade(struct intel_vblank_evade_ctx *evade)
 {
@@ -715,24 +725,12 @@ int intel_vblank_evade(struct intel_vblank_evade_ctx *evade)
 	struct intel_display *display = to_intel_display(crtc);
 	long timeout = msecs_to_jiffies_timeout(1);
 	wait_queue_head_t *wq = drm_crtc_vblank_waitqueue(&crtc->base);
-	DEFINE_WAIT(wait);
 	int scanline;
 
 	if (evade->min <= 0 || evade->max <= 0)
 		return 0;
 
-	for (;;) {
-		/*
-		 * prepare_to_wait() has a memory barrier, which guarantees
-		 * other CPUs can see the task state update by the time we
-		 * read the scanline.
-		 */
-		prepare_to_wait(wq, &wait, TASK_UNINTERRUPTIBLE);
-
-		scanline = intel_get_crtc_scanline(crtc);
-		if (scanline < evade->min || scanline > evade->max)
-			break;
-
+	while (!scanline_in_safe_range(evade, &scanline, false)) {
 		if (!timeout) {
 			drm_dbg_kms(display->drm,
 				    "Potential atomic update failure on pipe %c\n",
@@ -742,13 +740,11 @@ int intel_vblank_evade(struct intel_vblank_evade_ctx *evade)
 
 		local_irq_enable();
 
-		timeout = schedule_timeout(timeout);
+		timeout = wait_event_timeout(*wq, scanline_in_safe_range(evade, &scanline, true), timeout);
 
 		local_irq_disable();
 	}
 
-	finish_wait(wq, &wait);
-
 	/*
 	 * On VLV/CHV DSI the scanline counter would appear to
 	 * increment approx. 1/3 of a scanline before start of vblank.
diff --git a/drivers/gpu/drm/i915/display/intel_vblank.h b/drivers/gpu/drm/i915/display/intel_vblank.h
index 98d04cacd65f8..aa1974400e9fc 100644
--- a/drivers/gpu/drm/i915/display/intel_vblank.h
+++ b/drivers/gpu/drm/i915/display/intel_vblank.h
@@ -38,6 +38,7 @@ u32 g4x_get_vblank_counter(struct drm_crtc *crtc);
 bool intel_crtc_get_vblank_timestamp(struct drm_crtc *crtc, int *max_error,
 				     ktime_t *vblank_time, bool in_vblank_irq);
 int intel_get_crtc_scanline(struct intel_crtc *crtc);
+int __intel_get_crtc_scanline(struct intel_crtc *crtc);
 void intel_wait_for_pipe_scanline_stopped(struct intel_crtc *crtc);
 void intel_wait_for_pipe_scanline_moving(struct intel_crtc *crtc);
 void intel_crtc_update_active_timings(const struct intel_crtc_state *crtc_state,
-- 
2.51.0


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

* Re: [i915-rt v2 06/16] drm/i915/display: Remove locking from intel_vblank_evade critical section
  2025-12-16  9:22 ` [i915-rt v2 06/16] drm/i915/display: Remove locking from intel_vblank_evade " Maarten Lankhorst
  2025-12-16 20:15   ` [i915-rt v2.1] " Maarten Lankhorst
@ 2025-12-22 18:14   ` kernel test robot
  1 sibling, 0 replies; 21+ messages in thread
From: kernel test robot @ 2025-12-22 18:14 UTC (permalink / raw)
  To: Maarten Lankhorst, intel-xe; +Cc: oe-kbuild-all, intel-gfx

Hi Maarten,

kernel test robot noticed the following build errors:

[auto build test ERROR on drm-i915/for-linux-next]
[also build test ERROR on drm-i915/for-linux-next-fixes drm-xe/drm-xe-next drm-tip/drm-tip next-20251219]
[cannot apply to linus/master v6.16-rc1]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]

url:    https://github.com/intel-lab-lkp/linux/commits/Maarten-Lankhorst/drm-i915-display-Fix-intel_lpe_audio_irq_handler-for-PREEMPT-RT/20251216-212722
base:   https://gitlab.freedesktop.org/drm/i915/kernel.git for-linux-next
patch link:    https://lore.kernel.org/r/20251216092226.1777909-24-dev%40lankhorst.se
patch subject: [i915-rt v2 06/16] drm/i915/display: Remove locking from intel_vblank_evade critical section
config: x86_64-rhel-9.4-ltp (https://download.01.org/0day-ci/archive/20251222/202512221945.2ncUer0c-lkp@intel.com/config)
compiler: gcc-14 (Debian 14.2.0-19) 14.2.0
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20251222/202512221945.2ncUer0c-lkp@intel.com/reproduce)

If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202512221945.2ncUer0c-lkp@intel.com/

All errors (new ones prefixed by >>):

>> drivers/gpu/drm/i915/display/intel_vblank.c:245:12: error: static declaration of '__intel_get_crtc_scanline' follows non-static declaration
     245 | static int __intel_get_crtc_scanline(struct intel_crtc *crtc)
         |            ^~~~~~~~~~~~~~~~~~~~~~~~~
   In file included from drivers/gpu/drm/i915/display/intel_vblank.c:19:
   drivers/gpu/drm/i915/display/intel_vblank.h:41:5: note: previous declaration of '__intel_get_crtc_scanline' with type 'int(struct intel_crtc *)'
      41 | int __intel_get_crtc_scanline(struct intel_crtc *crtc);
         |     ^~~~~~~~~~~~~~~~~~~~~~~~~
   drivers/gpu/drm/i915/display/intel_vblank.c: In function 'scanline_in_safe_range':
   drivers/gpu/drm/i915/display/intel_vblank.c:716:17: error: implicit declaration of function 'intel_vblank_section_enter_irqf'; did you mean 'intel_vblank_section_enter'? [-Wimplicit-function-declaration]
     716 |                 intel_vblank_section_enter_irqf(display, &irqflags);
         |                 ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
         |                 intel_vblank_section_enter
>> drivers/gpu/drm/i915/display/intel_vblank.c:716:49: error: 'display' undeclared (first use in this function)
     716 |                 intel_vblank_section_enter_irqf(display, &irqflags);
         |                                                 ^~~~~~~
   drivers/gpu/drm/i915/display/intel_vblank.c:716:49: note: each undeclared identifier is reported only once for each function it appears in
>> drivers/gpu/drm/i915/display/intel_vblank.c:718:9: error: 'position' undeclared (first use in this function)
     718 |         position = __intel_get_crtc_scanline(crtc);
         |         ^~~~~~~~
>> drivers/gpu/drm/i915/display/intel_vblank.c:718:46: error: 'crtc' undeclared (first use in this function)
     718 |         position = __intel_get_crtc_scanline(crtc);
         |                                              ^~~~
   drivers/gpu/drm/i915/display/intel_vblank.c:721:17: error: implicit declaration of function 'intel_vblank_section_exit_irqf'; did you mean 'intel_vblank_section_exit'? [-Wimplicit-function-declaration]
     721 |                 intel_vblank_section_exit_irqf(display, irqflags);
         |                 ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
         |                 intel_vblank_section_exit


vim +/__intel_get_crtc_scanline +245 drivers/gpu/drm/i915/display/intel_vblank.c

5b7f65acf1b083 Ville Syrjälä 2024-05-28  240  
62fe4515cf2027 Jani Nikula   2023-01-16  241  /*
62fe4515cf2027 Jani Nikula   2023-01-16  242   * intel_de_read_fw(), only for fast reads of display block, no need for
62fe4515cf2027 Jani Nikula   2023-01-16  243   * forcewake etc.
62fe4515cf2027 Jani Nikula   2023-01-16  244   */
62fe4515cf2027 Jani Nikula   2023-01-16 @245  static int __intel_get_crtc_scanline(struct intel_crtc *crtc)
62fe4515cf2027 Jani Nikula   2023-01-16  246  {
aa451ae76fda24 Jani Nikula   2024-08-22  247  	struct intel_display *display = to_intel_display(crtc);
0097ecd06d9dcf Ville Syrjälä 2024-04-08  248  	struct drm_vblank_crtc *vblank = drm_crtc_vblank_crtc(&crtc->base);
0097ecd06d9dcf Ville Syrjälä 2024-04-08  249  	const struct drm_display_mode *mode = &vblank->hwmode;
62fe4515cf2027 Jani Nikula   2023-01-16  250  	enum pipe pipe = crtc->pipe;
62fe4515cf2027 Jani Nikula   2023-01-16  251  	int position, vtotal;
62fe4515cf2027 Jani Nikula   2023-01-16  252  
62fe4515cf2027 Jani Nikula   2023-01-16  253  	if (!crtc->active)
62fe4515cf2027 Jani Nikula   2023-01-16  254  		return 0;
62fe4515cf2027 Jani Nikula   2023-01-16  255  
62fe4515cf2027 Jani Nikula   2023-01-16  256  	if (crtc->mode_flags & I915_MODE_FLAG_GET_SCANLINE_FROM_TIMESTAMP)
62fe4515cf2027 Jani Nikula   2023-01-16  257  		return __intel_get_crtc_scanline_from_timestamp(crtc);
62fe4515cf2027 Jani Nikula   2023-01-16  258  
9677dd01ca1ada Ville Syrjälä 2024-05-28  259  	vtotal = intel_mode_vtotal(mode);
62fe4515cf2027 Jani Nikula   2023-01-16  260  
aa451ae76fda24 Jani Nikula   2024-08-22  261  	position = intel_de_read_fw(display, PIPEDSL(display, pipe)) & PIPEDSL_LINE_MASK;
62fe4515cf2027 Jani Nikula   2023-01-16  262  
62fe4515cf2027 Jani Nikula   2023-01-16  263  	/*
62fe4515cf2027 Jani Nikula   2023-01-16  264  	 * On HSW, the DSL reg (0x70000) appears to return 0 if we
62fe4515cf2027 Jani Nikula   2023-01-16  265  	 * read it just before the start of vblank.  So try it again
62fe4515cf2027 Jani Nikula   2023-01-16  266  	 * so we don't accidentally end up spanning a vblank frame
62fe4515cf2027 Jani Nikula   2023-01-16  267  	 * increment, causing the pipe_update_end() code to squak at us.
62fe4515cf2027 Jani Nikula   2023-01-16  268  	 *
62fe4515cf2027 Jani Nikula   2023-01-16  269  	 * The nature of this problem means we can't simply check the ISR
62fe4515cf2027 Jani Nikula   2023-01-16  270  	 * bit and return the vblank start value; nor can we use the scanline
62fe4515cf2027 Jani Nikula   2023-01-16  271  	 * debug register in the transcoder as it appears to have the same
62fe4515cf2027 Jani Nikula   2023-01-16  272  	 * problem.  We may need to extend this to include other platforms,
62fe4515cf2027 Jani Nikula   2023-01-16  273  	 * but so far testing only shows the problem on HSW.
62fe4515cf2027 Jani Nikula   2023-01-16  274  	 */
aa451ae76fda24 Jani Nikula   2024-08-22  275  	if (HAS_DDI(display) && !position) {
62fe4515cf2027 Jani Nikula   2023-01-16  276  		int i, temp;
62fe4515cf2027 Jani Nikula   2023-01-16  277  
62fe4515cf2027 Jani Nikula   2023-01-16  278  		for (i = 0; i < 100; i++) {
62fe4515cf2027 Jani Nikula   2023-01-16  279  			udelay(1);
aa451ae76fda24 Jani Nikula   2024-08-22  280  			temp = intel_de_read_fw(display,
aa451ae76fda24 Jani Nikula   2024-08-22  281  						PIPEDSL(display, pipe)) & PIPEDSL_LINE_MASK;
62fe4515cf2027 Jani Nikula   2023-01-16  282  			if (temp != position) {
62fe4515cf2027 Jani Nikula   2023-01-16  283  				position = temp;
62fe4515cf2027 Jani Nikula   2023-01-16  284  				break;
62fe4515cf2027 Jani Nikula   2023-01-16  285  			}
62fe4515cf2027 Jani Nikula   2023-01-16  286  		}
62fe4515cf2027 Jani Nikula   2023-01-16  287  	}
62fe4515cf2027 Jani Nikula   2023-01-16  288  
62fe4515cf2027 Jani Nikula   2023-01-16  289  	/*
62fe4515cf2027 Jani Nikula   2023-01-16  290  	 * See update_scanline_offset() for the details on the
62fe4515cf2027 Jani Nikula   2023-01-16  291  	 * scanline_offset adjustment.
62fe4515cf2027 Jani Nikula   2023-01-16  292  	 */
5316dd0d617bb9 Ville Syrjälä 2024-05-28  293  	return (position + vtotal + crtc->scanline_offset) % vtotal;
62fe4515cf2027 Jani Nikula   2023-01-16  294  }
62fe4515cf2027 Jani Nikula   2023-01-16  295  

-- 
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki

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

end of thread, other threads:[~2025-12-22 18:14 UTC | newest]

Thread overview: 21+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-12-16  9:22 [i915-rt v2 00/16] drm/i915/display: All patches to make PREEMPT_RT work on i915 + xe Maarten Lankhorst
2025-12-16  9:22 ` [i915-rt v2 01/16] drm/i915/display: Fix intel_lpe_audio_irq_handler for PREEMPT-RT Maarten Lankhorst
2025-12-16  9:22 ` [i915-rt v2 02/16] drm/i915/display: Make get_vblank_counter use intel_de_read_fw() Maarten Lankhorst
2025-12-16  9:22 ` [i915-rt v2 03/16] drm/i915/display: Use intel_de_write_fw in intel_pipe_fastset Maarten Lankhorst
2025-12-16  9:22 ` [i915-rt v2 04/16] drm/i915/display: Make set_pipeconf use the fw variants Maarten Lankhorst
2025-12-16  9:22 ` [i915-rt v2 05/16] drm/i915/display: Move vblank put until after critical section Maarten Lankhorst
2025-12-16  9:22 ` [i915-rt v2 06/16] drm/i915/display: Remove locking from intel_vblank_evade " Maarten Lankhorst
2025-12-16 20:15   ` [i915-rt v2.1] " Maarten Lankhorst
2025-12-22 18:14   ` [i915-rt v2 06/16] " kernel test robot
2025-12-16  9:22 ` [i915-rt v2 07/16] drm/i915/display: Handle vlv dsi workaround in scanline_in_safe_range too Maarten Lankhorst
2025-12-16  9:22 ` [i915-rt v2 08/16] drm/i915/display: Make icl_dsi_frame_update use _fw too Maarten Lankhorst
2025-12-16  9:22 ` [i915-rt v2 09/16] drm/i915/display: Enable interrupts earlier on PREEMPT_RT Maarten Lankhorst
2025-12-16  9:22 ` [i915-rt v2 10/16] drm/i915: Use preempt_disable/enable_rt() where recommended Maarten Lankhorst
2025-12-16  9:22 ` [i915-rt v2 11/16] PREEMPT_RT injection Maarten Lankhorst
2025-12-16  9:22 ` [i915-rt v2 12/16] drm/i915/display: Use intel_de_read_fw in colorops Maarten Lankhorst
2025-12-16  9:22 ` [i915-rt v2 13/16] drm/i915/gt: Use spin_lock_irq() instead of local_irq_disable() + spin_lock() Maarten Lankhorst
2025-12-16  9:22 ` [i915-rt v2 14/16] drm/i915: Drop the irqs_disabled() check Maarten Lankhorst
2025-12-16  9:22 ` [i915-rt v2 15/16] drm/i915/guc: Consider also RCU depth in busy loop Maarten Lankhorst
2025-12-16  9:22 ` [i915-rt v2 16/16] Revert "drm/i915: Depend on !PREEMPT_RT." Maarten Lankhorst
2025-12-16 13:51 ` ✗ CI.checkpatch: warning for drm/i915/display: All patches to make PREEMPT_RT work on i915 + xe. (rev2) Patchwork
2025-12-16 13:52 ` ✓ CI.KUnit: success " Patchwork

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