* [PATCH 0/4] drm/xe: Fix LR exec queue suspend/resume for S3/S4
@ 2026-05-21 14:48 Thomas Hellström
2026-05-21 14:48 ` [PATCH 1/4] drm/xe/guc: Add suspend refcount to exec queue ops Thomas Hellström
` (4 more replies)
0 siblings, 5 replies; 10+ messages in thread
From: Thomas Hellström @ 2026-05-21 14:48 UTC (permalink / raw)
To: intel-xe
Cc: Thomas Hellström, Matthew Brost, Francois Dugast,
Matthew Auld, Rodrigo Vivi, Maarten Lankhorst
Long Running (LR) exec queues — used by compute workloads with SVM
(fault-mode) and by preempt-fence-mode — were not surviving S3/S4
suspend/resume correctly. Four distinct problems are addressed:
1. Exec queue ops (guc_exec_queue_suspend/resume) lacked coordination
when multiple paths (PM, mode switching, preempt fences) needed to
hold the queue suspended simultaneously. A suspend refcount ensures
the GuC SUSPEND message is only sent when the first caller suspends,
and the RESUME message only when the last caller resumes.
2. During PM suspend, guc_exec_queue_stop() banned any user exec queue
that had a started-but-incomplete job. For LR queues this is always
true — their jobs are designed to run indefinitely — so every PM
suspend permanently banned the queue. The ban is now suppressed for
LR VM exec queues during PM suspend or hibernation while being
preserved for GT reset (legitimate hang detection).
3. Userspace LRC buffer objects carried XE_BO_FLAG_PINNED_LATE_RESTORE,
deferring their VRAM restore to after xe_gt_resume(). However,
xe_gt_resume() drives context registration, which requires valid LRC
VRAM. Dropping the flag moves the restore to xe_bo_restore_early(),
a CPU/BAR copy that runs before xe_gt_resume(), fixing the ordering.
4. Fault-mode (SVM) VMs use GPU page faults to access memory. A
running fault-mode job can re-fault pages torn down by VRAM eviction,
racing with the eviction. A new xe_suspend_all_faulting_lr_jobs()
call in the PM notifier stops all fault-mode queues and waits for GuC
acknowledgement before eviction begins. On resume,
xe_resume_all_faulting_lr_jobs() mirrors the same iteration to
re-register and resume exactly those queues. A per-group pm_suspended
flag (protected by mode_sem) prevents new fault-mode exec queues from
slipping through unsuspended while PM suspend is in progress.
Note: A prerequisite revert ("Revert drm/xe: Skip exec queue schedule
toggle if queue is idle during suspend") was already sent as a separate
patch and is not included here.
Thomas Hellström (4):
drm/xe/guc: Add suspend refcount to exec queue ops
drm/xe/guc: Don't ban LR VM exec queues on PM suspend
drm/xe: Restore userspace LRC BOs early on resume
drm/xe: Suspend fault-mode LR jobs before VRAM eviction on S3/S4
drivers/gpu/drm/xe/xe_exec_queue_types.h | 7 +
drivers/gpu/drm/xe/xe_guc_exec_queue_types.h | 7 +
drivers/gpu/drm/xe/xe_guc_submit.c | 60 +++++--
drivers/gpu/drm/xe/xe_guc_submit.h | 1 +
drivers/gpu/drm/xe/xe_hw_engine_group.c | 158 +++++++++++++++++-
drivers/gpu/drm/xe/xe_hw_engine_group.h | 3 +
drivers/gpu/drm/xe/xe_hw_engine_group_types.h | 7 +
drivers/gpu/drm/xe/xe_lrc.c | 2 +-
drivers/gpu/drm/xe/xe_pm.c | 15 +-
9 files changed, 239 insertions(+), 21 deletions(-)
--
2.54.0
^ permalink raw reply [flat|nested] 10+ messages in thread
* [PATCH 1/4] drm/xe/guc: Add suspend refcount to exec queue ops
2026-05-21 14:48 [PATCH 0/4] drm/xe: Fix LR exec queue suspend/resume for S3/S4 Thomas Hellström
@ 2026-05-21 14:48 ` Thomas Hellström
2026-05-21 14:48 ` [PATCH 2/4] drm/xe/guc: Don't ban LR VM exec queues on PM suspend Thomas Hellström
` (3 subsequent siblings)
4 siblings, 0 replies; 10+ messages in thread
From: Thomas Hellström @ 2026-05-21 14:48 UTC (permalink / raw)
To: intel-xe
Cc: Thomas Hellström, Matthew Brost, Francois Dugast,
Matthew Auld, Rodrigo Vivi, Maarten Lankhorst
Concurrent call sites that suspend exec queues (PM, mode switching,
preempt fences) each need to pair their own suspend/resume without
caring about other callers. Without coordination, a resume from one
path can prematurely re-enable a queue still suspended by another.
Add suspend_count to xe_guc_exec_queue. The SUSPEND message is only
sent on the 0->1 transition; the RESUME message is only sent on the
1->0 transition. Callers simply pair suspend and resume. The existing
sched.msg_lock spinlock serialises concurrent calls so neither side
needs to know about the other.
Assisted-by: GitHub_Copilot:claude-sonnet-4.6
Signed-off-by: Thomas Hellström <thomas.hellstrom@linux.intel.com>
---
drivers/gpu/drm/xe/xe_guc_exec_queue_types.h | 7 ++++++
drivers/gpu/drm/xe/xe_guc_submit.c | 24 ++++++++++++--------
2 files changed, 22 insertions(+), 9 deletions(-)
diff --git a/drivers/gpu/drm/xe/xe_guc_exec_queue_types.h b/drivers/gpu/drm/xe/xe_guc_exec_queue_types.h
index e5e53b421f29..8ee76f958dc2 100644
--- a/drivers/gpu/drm/xe/xe_guc_exec_queue_types.h
+++ b/drivers/gpu/drm/xe/xe_guc_exec_queue_types.h
@@ -49,6 +49,13 @@ struct xe_guc_exec_queue {
wait_queue_head_t suspend_wait;
/** @suspend_pending: a suspend of the exec_queue is pending */
bool suspend_pending;
+ /**
+ * @suspend_count: number of active suspend requests, protected by
+ * @sched.msg_lock. The exec_queue is kept suspended as long as this
+ * is non-zero. Transitions 0->1 send the SUSPEND message; transitions
+ * 1->0 send the RESUME message.
+ */
+ int suspend_count;
/**
* @needs_cleanup: Needs a cleanup message during VF post migration
* recovery.
diff --git a/drivers/gpu/drm/xe/xe_guc_submit.c b/drivers/gpu/drm/xe/xe_guc_submit.c
index 4d32b430bc15..50b622cf0c30 100644
--- a/drivers/gpu/drm/xe/xe_guc_submit.c
+++ b/drivers/gpu/drm/xe/xe_guc_submit.c
@@ -2131,15 +2131,18 @@ static int guc_exec_queue_set_multi_queue_priority(struct xe_exec_queue *q,
static int guc_exec_queue_suspend(struct xe_exec_queue *q)
{
- struct xe_gpu_scheduler *sched = &q->guc->sched;
- struct xe_sched_msg *msg = q->guc->static_msgs + STATIC_MSG_SUSPEND;
+ struct xe_guc_exec_queue *ge = q->guc;
+ struct xe_gpu_scheduler *sched = &ge->sched;
+ struct xe_sched_msg *msg = ge->static_msgs + STATIC_MSG_SUSPEND;
if (exec_queue_killed_or_banned_or_wedged(q))
return -EINVAL;
xe_sched_msg_lock(sched);
- if (guc_exec_queue_try_add_msg(q, msg, SUSPEND))
- q->guc->suspend_pending = true;
+ if (++ge->suspend_count == 1) {
+ if (guc_exec_queue_try_add_msg(q, msg, SUSPEND))
+ ge->suspend_pending = true;
+ }
xe_sched_msg_unlock(sched);
return 0;
@@ -2190,14 +2193,17 @@ static int guc_exec_queue_suspend_wait(struct xe_exec_queue *q)
static void guc_exec_queue_resume(struct xe_exec_queue *q)
{
- struct xe_gpu_scheduler *sched = &q->guc->sched;
- struct xe_sched_msg *msg = q->guc->static_msgs + STATIC_MSG_RESUME;
+ struct xe_guc_exec_queue *ge = q->guc;
+ struct xe_gpu_scheduler *sched = &ge->sched;
+ struct xe_sched_msg *msg = ge->static_msgs + STATIC_MSG_RESUME;
struct xe_guc *guc = exec_queue_to_guc(q);
- xe_gt_assert(guc_to_gt(guc), !q->guc->suspend_pending);
-
xe_sched_msg_lock(sched);
- guc_exec_queue_try_add_msg(q, msg, RESUME);
+ xe_gt_assert(guc_to_gt(guc), ge->suspend_count > 0);
+ if (--ge->suspend_count == 0) {
+ xe_gt_assert(guc_to_gt(guc), !ge->suspend_pending);
+ guc_exec_queue_try_add_msg(q, msg, RESUME);
+ }
xe_sched_msg_unlock(sched);
}
--
2.54.0
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [PATCH 2/4] drm/xe/guc: Don't ban LR VM exec queues on PM suspend
2026-05-21 14:48 [PATCH 0/4] drm/xe: Fix LR exec queue suspend/resume for S3/S4 Thomas Hellström
2026-05-21 14:48 ` [PATCH 1/4] drm/xe/guc: Add suspend refcount to exec queue ops Thomas Hellström
@ 2026-05-21 14:48 ` Thomas Hellström
2026-05-21 14:48 ` [PATCH 3/4] drm/xe: Restore userspace LRC BOs early on resume Thomas Hellström
` (2 subsequent siblings)
4 siblings, 0 replies; 10+ messages in thread
From: Thomas Hellström @ 2026-05-21 14:48 UTC (permalink / raw)
To: intel-xe
Cc: Thomas Hellström, Matthew Brost, Tomasz Lis, Rodrigo Vivi,
stable, Francois Dugast, Matthew Auld, Maarten Lankhorst
When xe_guc_submit_stop() is called during an S3/S4 suspend or GT reset,
guc_exec_queue_stop() bans any user exec queue that has a job which has
started but not yet completed. For normal (non-LR) exec queues this is
the correct behaviour: a started-but-incomplete job at reset time may
indicate a hung workload.
For exec queues attached to Long Running (LR) VMs the same condition is
always true during normal operation: LR jobs are designed to run
indefinitely and are never "completed" in the DRM scheduler sense —
they are preempted and resumed via the preempt-fence mechanism.
Banning such an exec queue on PM suspend permanently prevents the job
from restarting after resume, causing the userspace compute workload to
fail silently.
Fix this by skipping the ban for LR VM exec queues when a system
suspend or hibernation is in progress (pm_sleep_transition_in_progress()).
On GT reset the ban logic is preserved: a hung LR workload should still
be caught.
Fixes: f6375fb3aa94 ("drm/xe: Track LR jobs in DRM scheduler pending list")
Cc: Matthew Brost <matthew.brost@intel.com>
Cc: Tomasz Lis <tomasz.lis@intel.com>
Cc: Rodrigo Vivi <rodrigo.vivi@intel.com>
Cc: <stable@vger.kernel.org> # v6.19+
Signed-off-by: Thomas Hellström <thomas.hellstrom@linux.intel.com>
Assisted-by: GitHub_Copilot:claude-sonnet-4.6
---
drivers/gpu/drm/xe/xe_guc_exec_queue_types.h | 8 ++++----
drivers/gpu/drm/xe/xe_guc_submit.c | 11 ++++++++++-
2 files changed, 14 insertions(+), 5 deletions(-)
diff --git a/drivers/gpu/drm/xe/xe_guc_exec_queue_types.h b/drivers/gpu/drm/xe/xe_guc_exec_queue_types.h
index 8ee76f958dc2..1207d51cf770 100644
--- a/drivers/gpu/drm/xe/xe_guc_exec_queue_types.h
+++ b/drivers/gpu/drm/xe/xe_guc_exec_queue_types.h
@@ -50,10 +50,10 @@ struct xe_guc_exec_queue {
/** @suspend_pending: a suspend of the exec_queue is pending */
bool suspend_pending;
/**
- * @suspend_count: number of active suspend requests, protected by
- * @sched.msg_lock. The exec_queue is kept suspended as long as this
- * is non-zero. Transitions 0->1 send the SUSPEND message; transitions
- * 1->0 send the RESUME message.
+ * @suspend_count: Reference count of active suspend requests. The
+ * exec_queue remains suspended while this is non-zero, allowing
+ * multiple concurrent callers to independently hold a suspend without
+ * prematurely re-enabling the queue. Protected by @sched.msg_lock.
*/
int suspend_count;
/**
diff --git a/drivers/gpu/drm/xe/xe_guc_submit.c b/drivers/gpu/drm/xe/xe_guc_submit.c
index 50b622cf0c30..d1111b80fbed 100644
--- a/drivers/gpu/drm/xe/xe_guc_submit.c
+++ b/drivers/gpu/drm/xe/xe_guc_submit.c
@@ -9,6 +9,7 @@
#include <linux/bitmap.h>
#include <linux/circ_buf.h>
#include <linux/dma-fence-array.h>
+#include <linux/suspend.h>
#include <drm/drm_managed.h>
@@ -2274,8 +2275,16 @@ static void guc_exec_queue_stop(struct xe_guc *guc, struct xe_exec_queue *q)
* Ban any engine (aside from kernel and engines used for VM ops) with a
* started but not complete job or if a job has gone through a GT reset
* more than twice.
+ *
+ * LR VM exec queues are excluded from this ban during PM suspend: their
+ * jobs are intentionally long-running and are preempted and resumed via
+ * the preempt-fence mechanism. Banning them on PM suspend would
+ * permanently prevent the job from restarting after resume.
+ * On GT reset however we do want to ban them, as that may indicate a
+ * genuinely hung workload.
*/
- if (!(q->flags & (EXEC_QUEUE_FLAG_KERNEL | EXEC_QUEUE_FLAG_VM))) {
+ if (!(q->flags & (EXEC_QUEUE_FLAG_KERNEL | EXEC_QUEUE_FLAG_VM)) &&
+ !(q->vm && xe_vm_in_lr_mode(q->vm) && pm_sleep_transition_in_progress())) {
struct xe_sched_job *job = xe_sched_first_pending_job(sched);
bool ban = false;
--
2.54.0
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [PATCH 3/4] drm/xe: Restore userspace LRC BOs early on resume
2026-05-21 14:48 [PATCH 0/4] drm/xe: Fix LR exec queue suspend/resume for S3/S4 Thomas Hellström
2026-05-21 14:48 ` [PATCH 1/4] drm/xe/guc: Add suspend refcount to exec queue ops Thomas Hellström
2026-05-21 14:48 ` [PATCH 2/4] drm/xe/guc: Don't ban LR VM exec queues on PM suspend Thomas Hellström
@ 2026-05-21 14:48 ` Thomas Hellström
2026-05-21 16:09 ` Matthew Auld
2026-05-21 14:48 ` [PATCH 4/4] drm/xe: Suspend fault-mode LR jobs before VRAM eviction on S3/S4 Thomas Hellström
2026-05-21 14:56 ` ✓ CI.KUnit: success for drm/xe: Fix LR exec queue suspend/resume for S3/S4 Patchwork
4 siblings, 1 reply; 10+ messages in thread
From: Thomas Hellström @ 2026-05-21 14:48 UTC (permalink / raw)
To: intel-xe
Cc: Thomas Hellström, Matthew Brost, Francois Dugast,
Matthew Auld, Rodrigo Vivi, Maarten Lankhorst
When GuC registers a context (REGISTER_CONTEXT G2H action), the LRC
buffer object must already be present in VRAM with valid content.
Userspace LRC BOs currently carry XE_BO_FLAG_PINNED_LATE_RESTORE, which
defers their restore to xe_bo_restore_late() — a blitter copy that runs
after xe_gt_resume(). However, xe_gt_resume() itself calls
xe_guc_submit_start(), which drives guc_exec_queue_start() ->
xe_sched_resubmit_jobs() -> guc_exec_queue_run_job() ->
register_exec_queue(), all before xe_bo_restore_late() has had a chance
to repopulate the BO. The result is that GuC reads LRC state from
uninitialised VRAM and raises an exception.
Fix this by dropping XE_BO_FLAG_PINNED_LATE_RESTORE from the userspace
LRC BO flags. Without that flag, the BO lands in the
pinned.early.kernel_bo_present list and is restored by
xe_bo_restore_early() via CPU/BAR copy before xe_gt_resume() is entered.
By the time any context registration fires the LRC VRAM is valid.
xe_bo_create_pin_map_novm() already adds XE_BO_FLAG_NEEDS_CPU_ACCESS and
XE_BO_FLAG_PINNED, satisfying the requirements of the CPU copy path.
Dropping XE_BO_FLAG_PINNED_LATE_RESTORE also makes force_contiguous()
return true for these BOs (PINNED without LATE_RESTORE), which is already
required for the GGTT mapping they carry.
Assisted-by: GitHub_Copilot:claude-sonnet-4.6
Signed-off-by: Thomas Hellström <thomas.hellstrom@linux.intel.com>
---
drivers/gpu/drm/xe/xe_lrc.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/gpu/drm/xe/xe_lrc.c b/drivers/gpu/drm/xe/xe_lrc.c
index a4292a11391d..c9ea5a3e5365 100644
--- a/drivers/gpu/drm/xe/xe_lrc.c
+++ b/drivers/gpu/drm/xe/xe_lrc.c
@@ -1661,7 +1661,7 @@ static int xe_lrc_init(struct xe_lrc *lrc, struct xe_hw_engine *hwe, struct xe_v
XE_BO_FLAG_GGTT_INVALIDATE;
if ((vm && vm->xef) || init_flags & XE_LRC_CREATE_USER_CTX) /* userspace */
- bo_flags |= XE_BO_FLAG_PINNED_LATE_RESTORE | XE_BO_FLAG_FORCE_USER_VRAM;
+ bo_flags |= XE_BO_FLAG_FORCE_USER_VRAM;
bo = xe_bo_create_pin_map_novm(xe, tile, bo_size,
ttm_bo_type_kernel,
--
2.54.0
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [PATCH 4/4] drm/xe: Suspend fault-mode LR jobs before VRAM eviction on S3/S4
2026-05-21 14:48 [PATCH 0/4] drm/xe: Fix LR exec queue suspend/resume for S3/S4 Thomas Hellström
` (2 preceding siblings ...)
2026-05-21 14:48 ` [PATCH 3/4] drm/xe: Restore userspace LRC BOs early on resume Thomas Hellström
@ 2026-05-21 14:48 ` Thomas Hellström
2026-05-21 14:56 ` ✓ CI.KUnit: success for drm/xe: Fix LR exec queue suspend/resume for S3/S4 Patchwork
4 siblings, 0 replies; 10+ messages in thread
From: Thomas Hellström @ 2026-05-21 14:48 UTC (permalink / raw)
To: intel-xe
Cc: Thomas Hellström, Matthew Brost, Francois Dugast,
Matthew Auld, Rodrigo Vivi, Maarten Lankhorst
Fault-mode (SVM) exec queues run persistent LR jobs that can re-fault
GPU page table entries at any time. During S3/S4 suspend, VRAM eviction
calls xe_vm_invalidate_vma() to unmap GPU VMAs, but a running fault-mode
job can immediately re-fault those pages back in, creating a race between
the GPU and the eviction.
Introduce xe_suspend_all_faulting_lr_jobs() which iterates all hw engine
groups across all GTs, suspends every fault-mode exec queue and waits for
the GuC to acknowledge the suspend before returning. This is called before
xe_bo_evict_all_user() in the PM notifier (user BO eviction) and before
xe_bo_evict_all() in xe_pm_suspend() (kernel/pinned BO eviction), ensuring
the GPU is idle before any mappings are torn down.
Unlike preempt-fence-mode VMs, fault-mode VMs don't use the rebind worker
on resume — rebinding happens lazily through GPU page fault handlers.
Therefore xe_resume_all_faulting_lr_jobs() is introduced to explicitly
re-register and resume all queues whose pm_suspended flag is set, mirroring
the same hw engine group iteration as the suspend path to ensure exact 1:1
pairing without relying on incidental GuC suspend state.
To prevent a new fault-mode exec queue from being added while PM suspend
is in progress, a pm_suspended flag is added to xe_hw_engine_group and
set under mode_sem before releasing the group lock in
xe_suspend_all_faulting_lr_jobs(). xe_hw_engine_group_add_exec_queue()
checks this flag under mode_sem: if set, the new queue is immediately
suspended (with lr.pm_suspended marked) so that the resume path picks it
up. If the group is additionally in EXEC_MODE_DMA_FENCE mode, a second
suspend is issued to match the mode-switch resumer, preserving the
one-suspend-per-resumer invariant from the suspend refcount. If the
queue is destroyed while PM-suspended, del_exec_queue() clears pm_suspended
under mode_sem so the resume path skips it cleanly.
The existing comment "FIXME: Super racey..." on xe_bo_evict_all() was
describing exactly this class of problem.
Assisted-by: GitHub_Copilot:claude-sonnet-4.6
Signed-off-by: Thomas Hellström <thomas.hellstrom@linux.intel.com>
---
drivers/gpu/drm/xe/xe_exec_queue_types.h | 7 +
drivers/gpu/drm/xe/xe_guc_submit.c | 25 +++
drivers/gpu/drm/xe/xe_guc_submit.h | 1 +
drivers/gpu/drm/xe/xe_hw_engine_group.c | 158 +++++++++++++++++-
drivers/gpu/drm/xe/xe_hw_engine_group.h | 3 +
drivers/gpu/drm/xe/xe_hw_engine_group_types.h | 7 +
drivers/gpu/drm/xe/xe_pm.c | 15 +-
7 files changed, 206 insertions(+), 10 deletions(-)
diff --git a/drivers/gpu/drm/xe/xe_exec_queue_types.h b/drivers/gpu/drm/xe/xe_exec_queue_types.h
index 2f5ccf294675..77f2bc5ff2f6 100644
--- a/drivers/gpu/drm/xe/xe_exec_queue_types.h
+++ b/drivers/gpu/drm/xe/xe_exec_queue_types.h
@@ -200,6 +200,13 @@ struct xe_exec_queue {
u32 seqno;
/** @lr.link: link into VM's list of exec queues */
struct list_head link;
+ /**
+ * @lr.pm_suspended: Marks that this fault-mode exec
+ * queue was suspended for PM and must be resumed on
+ * PM post-suspend. Protected by the hw engine group's
+ * mode_sem.
+ */
+ bool pm_suspended;
} lr;
#define XE_EXEC_QUEUE_TLB_INVAL_PRIMARY_GT 0
diff --git a/drivers/gpu/drm/xe/xe_guc_submit.c b/drivers/gpu/drm/xe/xe_guc_submit.c
index d1111b80fbed..9bb66fe6e215 100644
--- a/drivers/gpu/drm/xe/xe_guc_submit.c
+++ b/drivers/gpu/drm/xe/xe_guc_submit.c
@@ -2573,6 +2573,31 @@ int xe_guc_submit_start(struct xe_guc *guc)
return 0;
}
+/**
+ * xe_guc_submit_pm_resume_exec_queue() - Re-enable a fault-mode exec queue after PM resume
+ * @q: the exec queue to resume
+ *
+ * Re-enables a fault-mode LR exec queue for execution after PM resume.
+ * Has no effect if GuC is stopped or if the queue is in a terminal state
+ * (killed, banned, wedged, or destroyed).
+ */
+void xe_guc_submit_pm_resume_exec_queue(struct xe_exec_queue *q)
+{
+ struct xe_guc *guc = exec_queue_to_guc(q);
+
+ if (!guc->submission_state.initialized)
+ return;
+
+ mutex_lock(&guc->submission_state.lock);
+ if (!xe_guc_read_stopped(guc) &&
+ !exec_queue_killed_or_banned_or_wedged(q) && !exec_queue_destroyed(q)) {
+ if (!exec_queue_registered(q))
+ register_exec_queue(q, GUC_CONTEXT_NORMAL);
+ q->ops->resume(q);
+ }
+ mutex_unlock(&guc->submission_state.lock);
+}
+
static void guc_exec_queue_unpause_prepare(struct xe_guc *guc,
struct xe_exec_queue *q)
{
diff --git a/drivers/gpu/drm/xe/xe_guc_submit.h b/drivers/gpu/drm/xe/xe_guc_submit.h
index b3839a90c142..b860a52b0f70 100644
--- a/drivers/gpu/drm/xe/xe_guc_submit.h
+++ b/drivers/gpu/drm/xe/xe_guc_submit.h
@@ -20,6 +20,7 @@ int xe_guc_submit_reset_prepare(struct xe_guc *guc);
void xe_guc_submit_reset_wait(struct xe_guc *guc);
void xe_guc_submit_stop(struct xe_guc *guc);
int xe_guc_submit_start(struct xe_guc *guc);
+void xe_guc_submit_pm_resume_exec_queue(struct xe_exec_queue *q);
void xe_guc_submit_pause(struct xe_guc *guc);
void xe_guc_submit_pause_abort(struct xe_guc *guc);
void xe_guc_submit_pause_vf(struct xe_guc *guc);
diff --git a/drivers/gpu/drm/xe/xe_hw_engine_group.c b/drivers/gpu/drm/xe/xe_hw_engine_group.c
index 791be6edd0a4..006d75e56722 100644
--- a/drivers/gpu/drm/xe/xe_hw_engine_group.c
+++ b/drivers/gpu/drm/xe/xe_hw_engine_group.c
@@ -6,11 +6,14 @@
#include <drm/drm_managed.h>
#include "xe_assert.h"
+#include "xe_device.h"
#include "xe_device_types.h"
#include "xe_exec_queue.h"
#include "xe_gt.h"
#include "xe_gt_stats.h"
+#include "xe_guc_submit.h"
#include "xe_hw_engine_group.h"
+#include "xe_hw_engine_types.h"
#include "xe_sync.h"
#include "xe_vm.h"
@@ -126,7 +129,7 @@ int xe_hw_engine_setup_groups(struct xe_gt *gt)
int xe_hw_engine_group_add_exec_queue(struct xe_hw_engine_group *group, struct xe_exec_queue *q)
{
int err;
- struct xe_device *xe = gt_to_xe(q->gt);
+ struct xe_device *xe __maybe_unused = gt_to_xe(q->gt);
xe_assert(xe, group);
xe_assert(xe, !(q->flags & EXEC_QUEUE_FLAG_VM));
@@ -139,13 +142,22 @@ int xe_hw_engine_group_add_exec_queue(struct xe_hw_engine_group *group, struct x
if (err)
return err;
- if (xe_vm_in_fault_mode(q->vm) && group->cur_mode == EXEC_MODE_DMA_FENCE) {
- q->ops->suspend(q);
- err = q->ops->suspend_wait(q);
- if (err)
- goto err_suspend;
+ if (xe_vm_in_fault_mode(q->vm)) {
+ if (group->pm_suspended) {
+ q->lr.pm_suspended = true;
+ q->ops->suspend(q);
+ err = q->ops->suspend_wait(q);
+ if (err)
+ goto err_suspend;
+ }
+ if (group->cur_mode == EXEC_MODE_DMA_FENCE) {
+ q->ops->suspend(q);
+ err = q->ops->suspend_wait(q);
+ if (err)
+ goto err_suspend;
- xe_hw_engine_group_resume_faulting_lr_jobs(group);
+ xe_hw_engine_group_resume_faulting_lr_jobs(group);
+ }
}
list_add(&q->hw_engine_group_link, &group->exec_queue_list);
@@ -174,7 +186,9 @@ void xe_hw_engine_group_del_exec_queue(struct xe_hw_engine_group *group, struct
down_write(&group->mode_sem);
if (!list_empty(&q->hw_engine_group_link))
- list_del(&q->hw_engine_group_link);
+ list_del_init(&q->hw_engine_group_link);
+
+ q->lr.pm_suspended = false;
up_write(&group->mode_sem);
}
@@ -189,6 +203,134 @@ void xe_hw_engine_group_resume_faulting_lr_jobs(struct xe_hw_engine_group *group
queue_work(group->resume_wq, &group->resume_work);
}
+/**
+ * xe_suspend_all_faulting_lr_jobs() - Suspend all fault-mode exec queues on the device
+ * @xe: the xe device
+ *
+ * Suspends all fault-mode LR exec queues across all GTs before VRAM eviction
+ * during PM suspend. Fault-mode jobs can re-fault GPU page table entries at
+ * any time, racing with the eviction process. Must be paired with
+ * xe_resume_all_faulting_lr_jobs() after hardware is restored on resume.
+ *
+ * Return: 0 on success, negative error code on failure.
+ */
+int xe_suspend_all_faulting_lr_jobs(struct xe_device *xe)
+{
+ struct xe_hw_engine_group *visited[XE_ENGINE_CLASS_MAX] = {};
+ int n_visited = 0;
+ struct xe_gt *gt;
+ u8 gt_id;
+ int err;
+
+ for_each_gt(gt, xe, gt_id) {
+ struct xe_hw_engine *hwe;
+ enum xe_hw_engine_id hwe_id;
+
+ for_each_hw_engine(hwe, gt, hwe_id) {
+ struct xe_hw_engine_group *group = hwe->hw_engine_group;
+ struct xe_exec_queue *q;
+ bool already_seen = false;
+ int i;
+
+ if (!group)
+ continue;
+
+ for (i = 0; i < n_visited; i++) {
+ if (visited[i] == group) {
+ already_seen = true;
+ break;
+ }
+ }
+ if (already_seen)
+ continue;
+
+ visited[n_visited++] = group;
+
+ err = down_write_killable(&group->mode_sem);
+ if (err)
+ goto err_resume;
+
+ group->pm_suspended = true;
+ list_for_each_entry(q, &group->exec_queue_list, hw_engine_group_link) {
+ if (xe_vm_in_fault_mode(q->vm)) {
+ q->lr.pm_suspended = true;
+ q->ops->suspend(q);
+ }
+ }
+
+ list_for_each_entry(q, &group->exec_queue_list, hw_engine_group_link) {
+ if (!xe_vm_in_fault_mode(q->vm))
+ continue;
+
+ err = q->ops->suspend_wait(q);
+ if (err) {
+ up_write(&group->mode_sem);
+ goto err_resume;
+ }
+ }
+
+ up_write(&group->mode_sem);
+ }
+ }
+
+ return 0;
+
+err_resume:
+ xe_resume_all_faulting_lr_jobs(xe);
+ return err;
+}
+
+/**
+ * xe_resume_all_faulting_lr_jobs() - Resume all fault-mode exec queues on the device
+ * @xe: the xe device
+ *
+ * Re-enables all fault-mode LR exec queues that were suspended for PM. Must be
+ * called after hardware is restored and page fault handlers are free to run.
+ */
+void xe_resume_all_faulting_lr_jobs(struct xe_device *xe)
+{
+ struct xe_hw_engine_group *visited[XE_ENGINE_CLASS_MAX] = {};
+ int n_visited = 0;
+ struct xe_gt *gt;
+ u8 gt_id;
+
+ for_each_gt(gt, xe, gt_id) {
+ struct xe_hw_engine *hwe;
+ enum xe_hw_engine_id hwe_id;
+
+ for_each_hw_engine(hwe, gt, hwe_id) {
+ struct xe_hw_engine_group *group = hwe->hw_engine_group;
+ struct xe_exec_queue *q;
+ bool already_seen = false;
+ int i;
+
+ if (!group)
+ continue;
+
+ for (i = 0; i < n_visited; i++) {
+ if (visited[i] == group) {
+ already_seen = true;
+ break;
+ }
+ }
+ if (already_seen)
+ continue;
+
+ visited[n_visited++] = group;
+
+ down_write(&group->mode_sem);
+ group->pm_suspended = false;
+ list_for_each_entry(q, &group->exec_queue_list, hw_engine_group_link) {
+ if (!q->lr.pm_suspended)
+ continue;
+ q->lr.pm_suspended = false;
+ xe_guc_submit_pm_resume_exec_queue(q);
+ }
+ up_write(&group->mode_sem);
+ }
+ }
+}
+
/**
* xe_hw_engine_group_suspend_faulting_lr_jobs() - Suspend the faulting LR jobs of this group
* @group: The hw engine group
diff --git a/drivers/gpu/drm/xe/xe_hw_engine_group.h b/drivers/gpu/drm/xe/xe_hw_engine_group.h
index 8b17ccd30b70..67807d67530c 100644
--- a/drivers/gpu/drm/xe/xe_hw_engine_group.h
+++ b/drivers/gpu/drm/xe/xe_hw_engine_group.h
@@ -9,6 +9,7 @@
#include "xe_hw_engine_group_types.h"
struct drm_device;
+struct xe_device;
struct xe_exec_queue;
struct xe_gt;
struct xe_sync_entry;
@@ -27,5 +28,7 @@ void xe_hw_engine_group_put(struct xe_hw_engine_group *group);
enum xe_hw_engine_group_execution_mode
xe_hw_engine_group_find_exec_mode(struct xe_exec_queue *q);
void xe_hw_engine_group_resume_faulting_lr_jobs(struct xe_hw_engine_group *group);
+int xe_suspend_all_faulting_lr_jobs(struct xe_device *xe);
+void xe_resume_all_faulting_lr_jobs(struct xe_device *xe);
#endif
diff --git a/drivers/gpu/drm/xe/xe_hw_engine_group_types.h b/drivers/gpu/drm/xe/xe_hw_engine_group_types.h
index 92b6e0712c03..5f1a51ce1daf 100644
--- a/drivers/gpu/drm/xe/xe_hw_engine_group_types.h
+++ b/drivers/gpu/drm/xe/xe_hw_engine_group_types.h
@@ -46,6 +46,13 @@ struct xe_hw_engine_group {
struct rw_semaphore mode_sem;
/** @cur_mode: current execution mode of this hw engine group */
enum xe_hw_engine_group_execution_mode cur_mode;
+ /**
+ * @pm_suspended: true while PM suspend is in progress for this group.
+ * New fault-mode exec queues added while this is set are immediately
+ * suspended (with @lr.pm_suspended marked) and resumed by
+ * xe_resume_all_faulting_lr_jobs(). Protected by @mode_sem.
+ */
+ bool pm_suspended;
};
#endif
diff --git a/drivers/gpu/drm/xe/xe_pm.c b/drivers/gpu/drm/xe/xe_pm.c
index d4672eb07476..2f34152aaf97 100644
--- a/drivers/gpu/drm/xe/xe_pm.c
+++ b/drivers/gpu/drm/xe/xe_pm.c
@@ -20,6 +20,7 @@
#include "xe_ggtt.h"
#include "xe_gt.h"
#include "xe_gt_idle.h"
+#include "xe_hw_engine_group.h"
#include "xe_i2c.h"
#include "xe_irq.h"
#include "xe_late_bind_fw.h"
@@ -408,9 +409,18 @@ static int xe_pm_notifier_callback(struct notifier_block *nb,
{
struct xe_validation_ctx ctx;
- reinit_completion(&xe->pm_block);
- xe_pm_block_begin_signalling();
xe_pm_runtime_get(xe);
+ xe_pm_block_begin_signalling();
+ reinit_completion(&xe->pm_block);
+
+ err = xe_suspend_all_faulting_lr_jobs(xe);
+ if (err) {
+ drm_err(&xe->drm, "Notifier suspend faulting LR jobs failed (%d)\n", err);
+ complete_all(&xe->pm_block);
+ xe_pm_block_end_signalling();
+ xe_pm_runtime_put(xe);
+ return notifier_from_errno(err);
+ }
(void)xe_validation_ctx_init(&ctx, &xe->val, NULL,
(struct xe_val_flags) {.exclusive = true});
err = xe_bo_evict_all_user(xe);
@@ -434,6 +444,7 @@ static int xe_pm_notifier_callback(struct notifier_block *nb,
complete_all(&xe->pm_block);
xe_pm_wake_rebind_workers(xe);
xe_bo_notifier_unprepare_all_pinned(xe);
+ xe_resume_all_faulting_lr_jobs(xe);
xe_pm_runtime_put(xe);
break;
}
--
2.54.0
^ permalink raw reply related [flat|nested] 10+ messages in thread
* ✓ CI.KUnit: success for drm/xe: Fix LR exec queue suspend/resume for S3/S4
2026-05-21 14:48 [PATCH 0/4] drm/xe: Fix LR exec queue suspend/resume for S3/S4 Thomas Hellström
` (3 preceding siblings ...)
2026-05-21 14:48 ` [PATCH 4/4] drm/xe: Suspend fault-mode LR jobs before VRAM eviction on S3/S4 Thomas Hellström
@ 2026-05-21 14:56 ` Patchwork
4 siblings, 0 replies; 10+ messages in thread
From: Patchwork @ 2026-05-21 14:56 UTC (permalink / raw)
To: Thomas Hellström; +Cc: intel-xe
== Series Details ==
Series: drm/xe: Fix LR exec queue suspend/resume for S3/S4
URL : https://patchwork.freedesktop.org/series/167032/
State : success
== Summary ==
+ trap cleanup EXIT
+ /kernel/tools/testing/kunit/kunit.py run --kunitconfig /kernel/drivers/gpu/drm/xe/.kunitconfig
[14:55:01] Configuring KUnit Kernel ...
Generating .config ...
Populating config with:
$ make ARCH=um O=.kunit olddefconfig
[14:55:05] 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
[14:55:37] Starting KUnit Kernel (1/1)...
[14:55:37] ============================================================
Running tests with:
$ .kunit/linux kunit.enable=1 mem=1G console=tty kunit_shutdown=halt
[14:55:37] ================== guc_buf (11 subtests) ===================
[14:55:37] [PASSED] test_smallest
[14:55:37] [PASSED] test_largest
[14:55:37] [PASSED] test_granular
[14:55:37] [PASSED] test_unique
[14:55:37] [PASSED] test_overlap
[14:55:37] [PASSED] test_reusable
[14:55:37] [PASSED] test_too_big
[14:55:37] [PASSED] test_flush
[14:55:37] [PASSED] test_lookup
[14:55:37] [PASSED] test_data
[14:55:37] [PASSED] test_class
[14:55:37] ===================== [PASSED] guc_buf =====================
[14:55:37] =================== guc_dbm (7 subtests) ===================
[14:55:37] [PASSED] test_empty
[14:55:37] [PASSED] test_default
[14:55:37] ======================== test_size ========================
[14:55:37] [PASSED] 4
[14:55:37] [PASSED] 8
[14:55:37] [PASSED] 32
[14:55:37] [PASSED] 256
[14:55:37] ==================== [PASSED] test_size ====================
[14:55:37] ======================= test_reuse ========================
[14:55:37] [PASSED] 4
[14:55:37] [PASSED] 8
[14:55:37] [PASSED] 32
[14:55:37] [PASSED] 256
[14:55:37] =================== [PASSED] test_reuse ====================
[14:55:37] =================== test_range_overlap ====================
[14:55:37] [PASSED] 4
[14:55:37] [PASSED] 8
[14:55:37] [PASSED] 32
[14:55:37] [PASSED] 256
[14:55:37] =============== [PASSED] test_range_overlap ================
[14:55:37] =================== test_range_compact ====================
[14:55:37] [PASSED] 4
[14:55:37] [PASSED] 8
[14:55:37] [PASSED] 32
[14:55:37] [PASSED] 256
[14:55:37] =============== [PASSED] test_range_compact ================
[14:55:37] ==================== test_range_spare =====================
[14:55:37] [PASSED] 4
[14:55:37] [PASSED] 8
[14:55:37] [PASSED] 32
[14:55:37] [PASSED] 256
[14:55:37] ================ [PASSED] test_range_spare =================
[14:55:37] ===================== [PASSED] guc_dbm =====================
[14:55:37] =================== guc_idm (6 subtests) ===================
[14:55:37] [PASSED] bad_init
[14:55:37] [PASSED] no_init
[14:55:37] [PASSED] init_fini
[14:55:37] [PASSED] check_used
[14:55:37] [PASSED] check_quota
[14:55:37] [PASSED] check_all
[14:55:37] ===================== [PASSED] guc_idm =====================
[14:55:37] ================== no_relay (3 subtests) ===================
[14:55:37] [PASSED] xe_drops_guc2pf_if_not_ready
[14:55:37] [PASSED] xe_drops_guc2vf_if_not_ready
[14:55:37] [PASSED] xe_rejects_send_if_not_ready
[14:55:37] ==================== [PASSED] no_relay =====================
[14:55:37] ================== pf_relay (14 subtests) ==================
[14:55:37] [PASSED] pf_rejects_guc2pf_too_short
[14:55:37] [PASSED] pf_rejects_guc2pf_too_long
[14:55:37] [PASSED] pf_rejects_guc2pf_no_payload
[14:55:37] [PASSED] pf_fails_no_payload
[14:55:37] [PASSED] pf_fails_bad_origin
[14:55:37] [PASSED] pf_fails_bad_type
[14:55:37] [PASSED] pf_txn_reports_error
[14:55:37] [PASSED] pf_txn_sends_pf2guc
[14:55:37] [PASSED] pf_sends_pf2guc
[14:55:37] [SKIPPED] pf_loopback_nop
[14:55:37] [SKIPPED] pf_loopback_echo
[14:55:37] [SKIPPED] pf_loopback_fail
[14:55:37] [SKIPPED] pf_loopback_busy
[14:55:37] [SKIPPED] pf_loopback_retry
[14:55:37] ==================== [PASSED] pf_relay =====================
[14:55:37] ================== vf_relay (3 subtests) ===================
[14:55:37] [PASSED] vf_rejects_guc2vf_too_short
[14:55:37] [PASSED] vf_rejects_guc2vf_too_long
[14:55:37] [PASSED] vf_rejects_guc2vf_no_payload
[14:55:37] ==================== [PASSED] vf_relay =====================
[14:55:37] ================ pf_gt_config (9 subtests) =================
[14:55:37] [PASSED] fair_contexts_1vf
[14:55:37] [PASSED] fair_doorbells_1vf
[14:55:37] [PASSED] fair_ggtt_1vf
[14:55:37] ====================== fair_vram_1vf ======================
[14:55:37] [PASSED] 3.50 GiB
[14:55:37] [PASSED] 11.5 GiB
[14:55:37] [PASSED] 15.5 GiB
[14:55:37] [PASSED] 31.5 GiB
[14:55:37] [PASSED] 63.5 GiB
[14:55:37] [PASSED] 1.91 GiB
[14:55:37] ================== [PASSED] fair_vram_1vf ==================
[14:55:37] ================ fair_vram_1vf_admin_only =================
[14:55:37] [PASSED] 3.50 GiB
[14:55:37] [PASSED] 11.5 GiB
[14:55:37] [PASSED] 15.5 GiB
[14:55:37] [PASSED] 31.5 GiB
[14:55:37] [PASSED] 63.5 GiB
[14:55:37] [PASSED] 1.91 GiB
[14:55:37] ============ [PASSED] fair_vram_1vf_admin_only =============
[14:55:37] ====================== fair_contexts ======================
[14:55:37] [PASSED] 1 VF
[14:55:37] [PASSED] 2 VFs
[14:55:37] [PASSED] 3 VFs
[14:55:37] [PASSED] 4 VFs
[14:55:37] [PASSED] 5 VFs
[14:55:37] [PASSED] 6 VFs
[14:55:37] [PASSED] 7 VFs
[14:55:37] [PASSED] 8 VFs
[14:55:37] [PASSED] 9 VFs
[14:55:37] [PASSED] 10 VFs
[14:55:37] [PASSED] 11 VFs
[14:55:37] [PASSED] 12 VFs
[14:55:37] [PASSED] 13 VFs
[14:55:37] [PASSED] 14 VFs
[14:55:37] [PASSED] 15 VFs
[14:55:37] [PASSED] 16 VFs
[14:55:37] [PASSED] 17 VFs
[14:55:37] [PASSED] 18 VFs
[14:55:37] [PASSED] 19 VFs
[14:55:37] [PASSED] 20 VFs
[14:55:37] [PASSED] 21 VFs
[14:55:37] [PASSED] 22 VFs
[14:55:37] [PASSED] 23 VFs
[14:55:37] [PASSED] 24 VFs
[14:55:37] [PASSED] 25 VFs
[14:55:37] [PASSED] 26 VFs
[14:55:37] [PASSED] 27 VFs
[14:55:37] [PASSED] 28 VFs
[14:55:37] [PASSED] 29 VFs
[14:55:37] [PASSED] 30 VFs
[14:55:37] [PASSED] 31 VFs
[14:55:37] [PASSED] 32 VFs
[14:55:37] [PASSED] 33 VFs
[14:55:37] [PASSED] 34 VFs
[14:55:37] [PASSED] 35 VFs
[14:55:37] [PASSED] 36 VFs
[14:55:37] [PASSED] 37 VFs
[14:55:37] [PASSED] 38 VFs
[14:55:37] [PASSED] 39 VFs
[14:55:37] [PASSED] 40 VFs
[14:55:37] [PASSED] 41 VFs
[14:55:37] [PASSED] 42 VFs
[14:55:37] [PASSED] 43 VFs
[14:55:37] [PASSED] 44 VFs
[14:55:37] [PASSED] 45 VFs
[14:55:37] [PASSED] 46 VFs
[14:55:37] [PASSED] 47 VFs
[14:55:37] [PASSED] 48 VFs
[14:55:37] [PASSED] 49 VFs
[14:55:37] [PASSED] 50 VFs
[14:55:37] [PASSED] 51 VFs
[14:55:37] [PASSED] 52 VFs
[14:55:37] [PASSED] 53 VFs
[14:55:37] [PASSED] 54 VFs
[14:55:37] [PASSED] 55 VFs
[14:55:37] [PASSED] 56 VFs
[14:55:37] [PASSED] 57 VFs
[14:55:37] [PASSED] 58 VFs
[14:55:37] [PASSED] 59 VFs
[14:55:37] [PASSED] 60 VFs
[14:55:37] [PASSED] 61 VFs
[14:55:37] [PASSED] 62 VFs
[14:55:37] [PASSED] 63 VFs
[14:55:37] ================== [PASSED] fair_contexts ==================
[14:55:37] ===================== fair_doorbells ======================
[14:55:37] [PASSED] 1 VF
[14:55:37] [PASSED] 2 VFs
[14:55:37] [PASSED] 3 VFs
[14:55:37] [PASSED] 4 VFs
[14:55:37] [PASSED] 5 VFs
[14:55:37] [PASSED] 6 VFs
[14:55:37] [PASSED] 7 VFs
[14:55:37] [PASSED] 8 VFs
[14:55:37] [PASSED] 9 VFs
[14:55:37] [PASSED] 10 VFs
[14:55:37] [PASSED] 11 VFs
[14:55:37] [PASSED] 12 VFs
[14:55:37] [PASSED] 13 VFs
[14:55:37] [PASSED] 14 VFs
[14:55:37] [PASSED] 15 VFs
[14:55:37] [PASSED] 16 VFs
[14:55:37] [PASSED] 17 VFs
[14:55:37] [PASSED] 18 VFs
[14:55:37] [PASSED] 19 VFs
[14:55:37] [PASSED] 20 VFs
[14:55:37] [PASSED] 21 VFs
[14:55:37] [PASSED] 22 VFs
[14:55:37] [PASSED] 23 VFs
[14:55:37] [PASSED] 24 VFs
[14:55:37] [PASSED] 25 VFs
[14:55:37] [PASSED] 26 VFs
[14:55:37] [PASSED] 27 VFs
[14:55:37] [PASSED] 28 VFs
[14:55:37] [PASSED] 29 VFs
[14:55:37] [PASSED] 30 VFs
[14:55:37] [PASSED] 31 VFs
[14:55:37] [PASSED] 32 VFs
[14:55:37] [PASSED] 33 VFs
[14:55:37] [PASSED] 34 VFs
[14:55:37] [PASSED] 35 VFs
[14:55:37] [PASSED] 36 VFs
[14:55:37] [PASSED] 37 VFs
[14:55:37] [PASSED] 38 VFs
[14:55:37] [PASSED] 39 VFs
[14:55:37] [PASSED] 40 VFs
[14:55:37] [PASSED] 41 VFs
[14:55:37] [PASSED] 42 VFs
[14:55:37] [PASSED] 43 VFs
[14:55:37] [PASSED] 44 VFs
[14:55:37] [PASSED] 45 VFs
[14:55:37] [PASSED] 46 VFs
[14:55:37] [PASSED] 47 VFs
[14:55:37] [PASSED] 48 VFs
[14:55:37] [PASSED] 49 VFs
[14:55:37] [PASSED] 50 VFs
[14:55:37] [PASSED] 51 VFs
[14:55:37] [PASSED] 52 VFs
[14:55:37] [PASSED] 53 VFs
[14:55:37] [PASSED] 54 VFs
[14:55:37] [PASSED] 55 VFs
[14:55:37] [PASSED] 56 VFs
[14:55:37] [PASSED] 57 VFs
[14:55:37] [PASSED] 58 VFs
[14:55:37] [PASSED] 59 VFs
[14:55:37] [PASSED] 60 VFs
[14:55:37] [PASSED] 61 VFs
[14:55:37] [PASSED] 62 VFs
[14:55:37] [PASSED] 63 VFs
[14:55:37] ================= [PASSED] fair_doorbells ==================
[14:55:37] ======================== fair_ggtt ========================
[14:55:37] [PASSED] 1 VF
[14:55:37] [PASSED] 2 VFs
[14:55:37] [PASSED] 3 VFs
[14:55:37] [PASSED] 4 VFs
[14:55:37] [PASSED] 5 VFs
[14:55:37] [PASSED] 6 VFs
[14:55:37] [PASSED] 7 VFs
[14:55:37] [PASSED] 8 VFs
[14:55:37] [PASSED] 9 VFs
[14:55:37] [PASSED] 10 VFs
[14:55:37] [PASSED] 11 VFs
[14:55:37] [PASSED] 12 VFs
[14:55:37] [PASSED] 13 VFs
[14:55:37] [PASSED] 14 VFs
[14:55:37] [PASSED] 15 VFs
[14:55:37] [PASSED] 16 VFs
[14:55:37] [PASSED] 17 VFs
[14:55:37] [PASSED] 18 VFs
[14:55:37] [PASSED] 19 VFs
[14:55:37] [PASSED] 20 VFs
[14:55:37] [PASSED] 21 VFs
[14:55:37] [PASSED] 22 VFs
[14:55:37] [PASSED] 23 VFs
[14:55:37] [PASSED] 24 VFs
[14:55:37] [PASSED] 25 VFs
[14:55:37] [PASSED] 26 VFs
[14:55:37] [PASSED] 27 VFs
[14:55:37] [PASSED] 28 VFs
[14:55:37] [PASSED] 29 VFs
[14:55:37] [PASSED] 30 VFs
[14:55:37] [PASSED] 31 VFs
[14:55:37] [PASSED] 32 VFs
[14:55:37] [PASSED] 33 VFs
[14:55:37] [PASSED] 34 VFs
[14:55:37] [PASSED] 35 VFs
[14:55:37] [PASSED] 36 VFs
[14:55:37] [PASSED] 37 VFs
[14:55:37] [PASSED] 38 VFs
[14:55:37] [PASSED] 39 VFs
[14:55:37] [PASSED] 40 VFs
[14:55:37] [PASSED] 41 VFs
[14:55:37] [PASSED] 42 VFs
[14:55:37] [PASSED] 43 VFs
[14:55:37] [PASSED] 44 VFs
[14:55:37] [PASSED] 45 VFs
[14:55:37] [PASSED] 46 VFs
[14:55:37] [PASSED] 47 VFs
[14:55:37] [PASSED] 48 VFs
[14:55:37] [PASSED] 49 VFs
[14:55:37] [PASSED] 50 VFs
[14:55:37] [PASSED] 51 VFs
[14:55:37] [PASSED] 52 VFs
[14:55:37] [PASSED] 53 VFs
[14:55:37] [PASSED] 54 VFs
[14:55:37] [PASSED] 55 VFs
[14:55:37] [PASSED] 56 VFs
[14:55:37] [PASSED] 57 VFs
[14:55:37] [PASSED] 58 VFs
[14:55:37] [PASSED] 59 VFs
[14:55:37] [PASSED] 60 VFs
[14:55:37] [PASSED] 61 VFs
[14:55:37] [PASSED] 62 VFs
[14:55:37] [PASSED] 63 VFs
[14:55:37] ==================== [PASSED] fair_ggtt ====================
[14:55:37] ======================== fair_vram ========================
[14:55:37] [PASSED] 1 VF
[14:55:37] [PASSED] 2 VFs
[14:55:37] [PASSED] 3 VFs
[14:55:37] [PASSED] 4 VFs
[14:55:37] [PASSED] 5 VFs
[14:55:37] [PASSED] 6 VFs
[14:55:37] [PASSED] 7 VFs
[14:55:37] [PASSED] 8 VFs
[14:55:37] [PASSED] 9 VFs
[14:55:37] [PASSED] 10 VFs
[14:55:37] [PASSED] 11 VFs
[14:55:37] [PASSED] 12 VFs
[14:55:37] [PASSED] 13 VFs
[14:55:37] [PASSED] 14 VFs
[14:55:37] [PASSED] 15 VFs
[14:55:37] [PASSED] 16 VFs
[14:55:37] [PASSED] 17 VFs
[14:55:37] [PASSED] 18 VFs
[14:55:37] [PASSED] 19 VFs
[14:55:37] [PASSED] 20 VFs
[14:55:37] [PASSED] 21 VFs
[14:55:37] [PASSED] 22 VFs
[14:55:37] [PASSED] 23 VFs
[14:55:37] [PASSED] 24 VFs
[14:55:37] [PASSED] 25 VFs
[14:55:37] [PASSED] 26 VFs
[14:55:37] [PASSED] 27 VFs
[14:55:37] [PASSED] 28 VFs
[14:55:37] [PASSED] 29 VFs
[14:55:37] [PASSED] 30 VFs
[14:55:37] [PASSED] 31 VFs
[14:55:37] [PASSED] 32 VFs
[14:55:37] [PASSED] 33 VFs
[14:55:37] [PASSED] 34 VFs
[14:55:37] [PASSED] 35 VFs
[14:55:37] [PASSED] 36 VFs
[14:55:37] [PASSED] 37 VFs
[14:55:37] [PASSED] 38 VFs
[14:55:37] [PASSED] 39 VFs
[14:55:37] [PASSED] 40 VFs
[14:55:37] [PASSED] 41 VFs
[14:55:37] [PASSED] 42 VFs
[14:55:37] [PASSED] 43 VFs
[14:55:37] [PASSED] 44 VFs
[14:55:37] [PASSED] 45 VFs
[14:55:37] [PASSED] 46 VFs
[14:55:37] [PASSED] 47 VFs
[14:55:37] [PASSED] 48 VFs
[14:55:37] [PASSED] 49 VFs
[14:55:37] [PASSED] 50 VFs
[14:55:37] [PASSED] 51 VFs
[14:55:37] [PASSED] 52 VFs
[14:55:37] [PASSED] 53 VFs
[14:55:37] [PASSED] 54 VFs
[14:55:37] [PASSED] 55 VFs
[14:55:37] [PASSED] 56 VFs
[14:55:37] [PASSED] 57 VFs
[14:55:37] [PASSED] 58 VFs
[14:55:37] [PASSED] 59 VFs
[14:55:37] [PASSED] 60 VFs
[14:55:37] [PASSED] 61 VFs
[14:55:37] [PASSED] 62 VFs
[14:55:37] [PASSED] 63 VFs
[14:55:37] ==================== [PASSED] fair_vram ====================
[14:55:37] ================== [PASSED] pf_gt_config ===================
[14:55:37] ===================== lmtt (1 subtest) =====================
[14:55:37] ======================== test_ops =========================
[14:55:37] [PASSED] 2-level
[14:55:37] [PASSED] multi-level
[14:55:37] ==================== [PASSED] test_ops =====================
[14:55:37] ====================== [PASSED] lmtt =======================
[14:55:37] ================= pf_service (11 subtests) =================
[14:55:37] [PASSED] pf_negotiate_any
[14:55:37] [PASSED] pf_negotiate_base_match
[14:55:37] [PASSED] pf_negotiate_base_newer
[14:55:37] [PASSED] pf_negotiate_base_next
[14:55:37] [SKIPPED] pf_negotiate_base_older
[14:55:37] [PASSED] pf_negotiate_base_prev
[14:55:37] [PASSED] pf_negotiate_latest_match
[14:55:37] [PASSED] pf_negotiate_latest_newer
[14:55:37] [PASSED] pf_negotiate_latest_next
[14:55:37] [SKIPPED] pf_negotiate_latest_older
[14:55:37] [SKIPPED] pf_negotiate_latest_prev
[14:55:37] =================== [PASSED] pf_service ====================
[14:55:37] ================= xe_guc_g2g (2 subtests) ==================
[14:55:37] ============== xe_live_guc_g2g_kunit_default ==============
[14:55:37] ========= [SKIPPED] xe_live_guc_g2g_kunit_default ==========
[14:55:37] ============== xe_live_guc_g2g_kunit_allmem ===============
[14:55:37] ========== [SKIPPED] xe_live_guc_g2g_kunit_allmem ==========
[14:55:37] =================== [SKIPPED] xe_guc_g2g ===================
[14:55:37] =================== xe_mocs (2 subtests) ===================
[14:55:37] ================ xe_live_mocs_kernel_kunit ================
[14:55:37] =========== [SKIPPED] xe_live_mocs_kernel_kunit ============
[14:55:37] ================ xe_live_mocs_reset_kunit =================
[14:55:37] ============ [SKIPPED] xe_live_mocs_reset_kunit ============
[14:55:37] ==================== [SKIPPED] xe_mocs =====================
[14:55:37] ================= xe_migrate (2 subtests) ==================
[14:55:37] ================= xe_migrate_sanity_kunit =================
[14:55:37] ============ [SKIPPED] xe_migrate_sanity_kunit =============
[14:55:37] ================== xe_validate_ccs_kunit ==================
[14:55:37] ============= [SKIPPED] xe_validate_ccs_kunit ==============
[14:55:37] =================== [SKIPPED] xe_migrate ===================
[14:55:37] ================== xe_dma_buf (1 subtest) ==================
[14:55:37] ==================== xe_dma_buf_kunit =====================
[14:55:37] ================ [SKIPPED] xe_dma_buf_kunit ================
[14:55:37] =================== [SKIPPED] xe_dma_buf ===================
[14:55:37] ================= xe_bo_shrink (1 subtest) =================
[14:55:37] =================== xe_bo_shrink_kunit ====================
[14:55:37] =============== [SKIPPED] xe_bo_shrink_kunit ===============
[14:55:37] ================== [SKIPPED] xe_bo_shrink ==================
[14:55:37] ==================== xe_bo (2 subtests) ====================
[14:55:37] ================== xe_ccs_migrate_kunit ===================
[14:55:37] ============== [SKIPPED] xe_ccs_migrate_kunit ==============
[14:55:37] ==================== xe_bo_evict_kunit ====================
[14:55:37] =============== [SKIPPED] xe_bo_evict_kunit ================
[14:55:37] ===================== [SKIPPED] xe_bo ======================
[14:55:37] ==================== args (13 subtests) ====================
[14:55:37] [PASSED] count_args_test
[14:55:37] [PASSED] call_args_example
[14:55:37] [PASSED] call_args_test
[14:55:37] [PASSED] drop_first_arg_example
[14:55:37] [PASSED] drop_first_arg_test
[14:55:37] [PASSED] first_arg_example
[14:55:37] [PASSED] first_arg_test
[14:55:37] [PASSED] last_arg_example
[14:55:37] [PASSED] last_arg_test
[14:55:37] [PASSED] pick_arg_example
[14:55:37] [PASSED] if_args_example
[14:55:37] [PASSED] if_args_test
[14:55:37] [PASSED] sep_comma_example
[14:55:37] ====================== [PASSED] args =======================
[14:55:37] =================== xe_pci (3 subtests) ====================
[14:55:37] ==================== check_graphics_ip ====================
[14:55:37] [PASSED] 12.00 Xe_LP
[14:55:37] [PASSED] 12.10 Xe_LP+
[14:55:37] [PASSED] 12.55 Xe_HPG
[14:55:37] [PASSED] 12.60 Xe_HPC
[14:55:37] [PASSED] 12.70 Xe_LPG
[14:55:37] [PASSED] 12.71 Xe_LPG
[14:55:37] [PASSED] 12.74 Xe_LPG+
[14:55:37] [PASSED] 20.01 Xe2_HPG
[14:55:37] [PASSED] 20.02 Xe2_HPG
[14:55:37] [PASSED] 20.04 Xe2_LPG
[14:55:37] [PASSED] 30.00 Xe3_LPG
[14:55:37] [PASSED] 30.01 Xe3_LPG
[14:55:37] [PASSED] 30.03 Xe3_LPG
[14:55:37] [PASSED] 30.04 Xe3_LPG
[14:55:37] [PASSED] 30.05 Xe3_LPG
[14:55:37] [PASSED] 35.10 Xe3p_LPG
[14:55:37] [PASSED] 35.11 Xe3p_XPC
[14:55:37] ================ [PASSED] check_graphics_ip ================
[14:55:37] ===================== check_media_ip ======================
[14:55:37] [PASSED] 12.00 Xe_M
[14:55:37] [PASSED] 12.55 Xe_HPM
[14:55:37] [PASSED] 13.00 Xe_LPM+
[14:55:37] [PASSED] 13.01 Xe2_HPM
[14:55:37] [PASSED] 20.00 Xe2_LPM
[14:55:37] [PASSED] 30.00 Xe3_LPM
[14:55:37] [PASSED] 30.02 Xe3_LPM
[14:55:37] [PASSED] 35.00 Xe3p_LPM
[14:55:37] [PASSED] 35.03 Xe3p_HPM
[14:55:37] ================= [PASSED] check_media_ip ==================
[14:55:37] =================== check_platform_desc ===================
[14:55:37] [PASSED] 0x9A60 (TIGERLAKE)
[14:55:37] [PASSED] 0x9A68 (TIGERLAKE)
[14:55:37] [PASSED] 0x9A70 (TIGERLAKE)
[14:55:37] [PASSED] 0x9A40 (TIGERLAKE)
[14:55:37] [PASSED] 0x9A49 (TIGERLAKE)
[14:55:37] [PASSED] 0x9A59 (TIGERLAKE)
[14:55:37] [PASSED] 0x9A78 (TIGERLAKE)
[14:55:37] [PASSED] 0x9AC0 (TIGERLAKE)
[14:55:37] [PASSED] 0x9AC9 (TIGERLAKE)
[14:55:37] [PASSED] 0x9AD9 (TIGERLAKE)
[14:55:37] [PASSED] 0x9AF8 (TIGERLAKE)
[14:55:37] [PASSED] 0x4C80 (ROCKETLAKE)
[14:55:37] [PASSED] 0x4C8A (ROCKETLAKE)
[14:55:37] [PASSED] 0x4C8B (ROCKETLAKE)
[14:55:37] [PASSED] 0x4C8C (ROCKETLAKE)
[14:55:37] [PASSED] 0x4C90 (ROCKETLAKE)
[14:55:37] [PASSED] 0x4C9A (ROCKETLAKE)
[14:55:37] [PASSED] 0x4680 (ALDERLAKE_S)
[14:55:37] [PASSED] 0x4682 (ALDERLAKE_S)
[14:55:37] [PASSED] 0x4688 (ALDERLAKE_S)
[14:55:37] [PASSED] 0x468A (ALDERLAKE_S)
[14:55:37] [PASSED] 0x468B (ALDERLAKE_S)
[14:55:37] [PASSED] 0x4690 (ALDERLAKE_S)
[14:55:37] [PASSED] 0x4692 (ALDERLAKE_S)
[14:55:37] [PASSED] 0x4693 (ALDERLAKE_S)
[14:55:37] [PASSED] 0x46A0 (ALDERLAKE_P)
[14:55:37] [PASSED] 0x46A1 (ALDERLAKE_P)
[14:55:37] [PASSED] 0x46A2 (ALDERLAKE_P)
[14:55:37] [PASSED] 0x46A3 (ALDERLAKE_P)
[14:55:37] [PASSED] 0x46A6 (ALDERLAKE_P)
[14:55:37] [PASSED] 0x46A8 (ALDERLAKE_P)
[14:55:37] [PASSED] 0x46AA (ALDERLAKE_P)
[14:55:37] [PASSED] 0x462A (ALDERLAKE_P)
[14:55:37] [PASSED] 0x4626 (ALDERLAKE_P)
[14:55:37] [PASSED] 0x4628 (ALDERLAKE_P)
[14:55:37] [PASSED] 0x46B0 (ALDERLAKE_P)
[14:55:37] [PASSED] 0x46B1 (ALDERLAKE_P)
[14:55:37] [PASSED] 0x46B2 (ALDERLAKE_P)
[14:55:37] [PASSED] 0x46B3 (ALDERLAKE_P)
[14:55:37] [PASSED] 0x46C0 (ALDERLAKE_P)
[14:55:37] [PASSED] 0x46C1 (ALDERLAKE_P)
[14:55:37] [PASSED] 0x46C2 (ALDERLAKE_P)
[14:55:37] [PASSED] 0x46C3 (ALDERLAKE_P)
[14:55:37] [PASSED] 0x46D0 (ALDERLAKE_N)
[14:55:37] [PASSED] 0x46D1 (ALDERLAKE_N)
[14:55:37] [PASSED] 0x46D2 (ALDERLAKE_N)
[14:55:37] [PASSED] 0x46D3 (ALDERLAKE_N)
[14:55:37] [PASSED] 0x46D4 (ALDERLAKE_N)
[14:55:37] [PASSED] 0xA721 (ALDERLAKE_P)
[14:55:37] [PASSED] 0xA7A1 (ALDERLAKE_P)
[14:55:37] [PASSED] 0xA7A9 (ALDERLAKE_P)
[14:55:37] [PASSED] 0xA7AC (ALDERLAKE_P)
[14:55:37] [PASSED] 0xA7AD (ALDERLAKE_P)
[14:55:37] [PASSED] 0xA720 (ALDERLAKE_P)
[14:55:37] [PASSED] 0xA7A0 (ALDERLAKE_P)
[14:55:37] [PASSED] 0xA7A8 (ALDERLAKE_P)
[14:55:37] [PASSED] 0xA7AA (ALDERLAKE_P)
[14:55:37] [PASSED] 0xA7AB (ALDERLAKE_P)
[14:55:37] [PASSED] 0xA780 (ALDERLAKE_S)
[14:55:37] [PASSED] 0xA781 (ALDERLAKE_S)
[14:55:37] [PASSED] 0xA782 (ALDERLAKE_S)
[14:55:37] [PASSED] 0xA783 (ALDERLAKE_S)
[14:55:37] [PASSED] 0xA788 (ALDERLAKE_S)
[14:55:37] [PASSED] 0xA789 (ALDERLAKE_S)
[14:55:37] [PASSED] 0xA78A (ALDERLAKE_S)
[14:55:37] [PASSED] 0xA78B (ALDERLAKE_S)
[14:55:37] [PASSED] 0x4905 (DG1)
[14:55:37] [PASSED] 0x4906 (DG1)
[14:55:37] [PASSED] 0x4907 (DG1)
[14:55:37] [PASSED] 0x4908 (DG1)
[14:55:37] [PASSED] 0x4909 (DG1)
[14:55:37] [PASSED] 0x56C0 (DG2)
[14:55:37] [PASSED] 0x56C2 (DG2)
[14:55:37] [PASSED] 0x56C1 (DG2)
[14:55:37] [PASSED] 0x7D51 (METEORLAKE)
[14:55:37] [PASSED] 0x7DD1 (METEORLAKE)
[14:55:37] [PASSED] 0x7D41 (METEORLAKE)
[14:55:37] [PASSED] 0x7D67 (METEORLAKE)
[14:55:37] [PASSED] 0xB640 (METEORLAKE)
[14:55:37] [PASSED] 0x56A0 (DG2)
[14:55:37] [PASSED] 0x56A1 (DG2)
[14:55:37] [PASSED] 0x56A2 (DG2)
[14:55:37] [PASSED] 0x56BE (DG2)
[14:55:37] [PASSED] 0x56BF (DG2)
[14:55:37] [PASSED] 0x5690 (DG2)
[14:55:37] [PASSED] 0x5691 (DG2)
[14:55:37] [PASSED] 0x5692 (DG2)
[14:55:37] [PASSED] 0x56A5 (DG2)
[14:55:37] [PASSED] 0x56A6 (DG2)
[14:55:37] [PASSED] 0x56B0 (DG2)
[14:55:37] [PASSED] 0x56B1 (DG2)
[14:55:37] [PASSED] 0x56BA (DG2)
[14:55:37] [PASSED] 0x56BB (DG2)
[14:55:37] [PASSED] 0x56BC (DG2)
[14:55:37] [PASSED] 0x56BD (DG2)
[14:55:37] [PASSED] 0x5693 (DG2)
[14:55:37] [PASSED] 0x5694 (DG2)
[14:55:37] [PASSED] 0x5695 (DG2)
[14:55:37] [PASSED] 0x56A3 (DG2)
[14:55:37] [PASSED] 0x56A4 (DG2)
[14:55:37] [PASSED] 0x56B2 (DG2)
[14:55:37] [PASSED] 0x56B3 (DG2)
[14:55:37] [PASSED] 0x5696 (DG2)
[14:55:37] [PASSED] 0x5697 (DG2)
[14:55:37] [PASSED] 0xB69 (PVC)
[14:55:37] [PASSED] 0xB6E (PVC)
[14:55:37] [PASSED] 0xBD4 (PVC)
[14:55:37] [PASSED] 0xBD5 (PVC)
[14:55:37] [PASSED] 0xBD6 (PVC)
[14:55:37] [PASSED] 0xBD7 (PVC)
[14:55:37] [PASSED] 0xBD8 (PVC)
[14:55:37] [PASSED] 0xBD9 (PVC)
[14:55:37] [PASSED] 0xBDA (PVC)
[14:55:37] [PASSED] 0xBDB (PVC)
[14:55:37] [PASSED] 0xBE0 (PVC)
[14:55:37] [PASSED] 0xBE1 (PVC)
[14:55:37] [PASSED] 0xBE5 (PVC)
[14:55:37] [PASSED] 0x7D40 (METEORLAKE)
[14:55:37] [PASSED] 0x7D45 (METEORLAKE)
[14:55:37] [PASSED] 0x7D55 (METEORLAKE)
[14:55:37] [PASSED] 0x7D60 (METEORLAKE)
[14:55:37] [PASSED] 0x7DD5 (METEORLAKE)
[14:55:37] [PASSED] 0x6420 (LUNARLAKE)
[14:55:37] [PASSED] 0x64A0 (LUNARLAKE)
[14:55:37] [PASSED] 0x64B0 (LUNARLAKE)
[14:55:37] [PASSED] 0xE202 (BATTLEMAGE)
[14:55:37] [PASSED] 0xE209 (BATTLEMAGE)
[14:55:37] [PASSED] 0xE20B (BATTLEMAGE)
[14:55:37] [PASSED] 0xE20C (BATTLEMAGE)
[14:55:37] [PASSED] 0xE20D (BATTLEMAGE)
[14:55:37] [PASSED] 0xE210 (BATTLEMAGE)
[14:55:37] [PASSED] 0xE211 (BATTLEMAGE)
[14:55:37] [PASSED] 0xE212 (BATTLEMAGE)
[14:55:37] [PASSED] 0xE216 (BATTLEMAGE)
[14:55:37] [PASSED] 0xE220 (BATTLEMAGE)
[14:55:37] [PASSED] 0xE221 (BATTLEMAGE)
[14:55:37] [PASSED] 0xE222 (BATTLEMAGE)
[14:55:37] [PASSED] 0xE223 (BATTLEMAGE)
[14:55:37] [PASSED] 0xB080 (PANTHERLAKE)
[14:55:37] [PASSED] 0xB081 (PANTHERLAKE)
[14:55:37] [PASSED] 0xB082 (PANTHERLAKE)
[14:55:37] [PASSED] 0xB083 (PANTHERLAKE)
[14:55:37] [PASSED] 0xB084 (PANTHERLAKE)
[14:55:37] [PASSED] 0xB085 (PANTHERLAKE)
[14:55:37] [PASSED] 0xB086 (PANTHERLAKE)
[14:55:37] [PASSED] 0xB087 (PANTHERLAKE)
[14:55:37] [PASSED] 0xB08F (PANTHERLAKE)
[14:55:37] [PASSED] 0xB090 (PANTHERLAKE)
[14:55:37] [PASSED] 0xB0A0 (PANTHERLAKE)
[14:55:37] [PASSED] 0xB0B0 (PANTHERLAKE)
[14:55:37] [PASSED] 0xFD80 (PANTHERLAKE)
[14:55:37] [PASSED] 0xFD81 (PANTHERLAKE)
[14:55:37] [PASSED] 0xD740 (NOVALAKE_S)
[14:55:37] [PASSED] 0xD741 (NOVALAKE_S)
[14:55:37] [PASSED] 0xD742 (NOVALAKE_S)
[14:55:37] [PASSED] 0xD743 (NOVALAKE_S)
[14:55:37] [PASSED] 0xD744 (NOVALAKE_S)
[14:55:37] [PASSED] 0xD745 (NOVALAKE_S)
[14:55:37] [PASSED] 0x674C (CRESCENTISLAND)
[14:55:37] [PASSED] 0x674D (CRESCENTISLAND)
[14:55:37] [PASSED] 0x674E (CRESCENTISLAND)
[14:55:37] [PASSED] 0x674F (CRESCENTISLAND)
[14:55:37] [PASSED] 0x6750 (CRESCENTISLAND)
[14:55:37] [PASSED] 0xD750 (NOVALAKE_P)
[14:55:37] [PASSED] 0xD751 (NOVALAKE_P)
[14:55:37] [PASSED] 0xD752 (NOVALAKE_P)
[14:55:37] [PASSED] 0xD753 (NOVALAKE_P)
[14:55:37] [PASSED] 0xD754 (NOVALAKE_P)
[14:55:37] [PASSED] 0xD755 (NOVALAKE_P)
[14:55:37] [PASSED] 0xD756 (NOVALAKE_P)
[14:55:37] [PASSED] 0xD757 (NOVALAKE_P)
[14:55:37] [PASSED] 0xD75F (NOVALAKE_P)
[14:55:37] =============== [PASSED] check_platform_desc ===============
[14:55:37] ===================== [PASSED] xe_pci ======================
[14:55:37] =================== xe_rtp (2 subtests) ====================
[14:55:37] =============== xe_rtp_process_to_sr_tests ================
[14:55:37] [PASSED] coalesce-same-reg
[14:55:37] [PASSED] no-match-no-add
[14:55:37] [PASSED] match-or
[14:55:37] [PASSED] match-or-xfail
[14:55:37] [PASSED] no-match-no-add-multiple-rules
[14:55:37] [PASSED] two-regs-two-entries
[14:55:37] [PASSED] clr-one-set-other
[14:55:37] [PASSED] set-field
[14:55:37] [PASSED] conflict-duplicate
[14:55:37] [PASSED] conflict-not-disjoint
[14:55:37] [PASSED] conflict-reg-type
[14:55:37] [PASSED] bad-mcr-reg-forced-to-regular
[14:55:37] [PASSED] bad-regular-reg-forced-to-mcr
[14:55:37] =========== [PASSED] xe_rtp_process_to_sr_tests ============
[14:55:37] ================== xe_rtp_process_tests ===================
[14:55:37] [PASSED] active1
[14:55:37] [PASSED] active2
[14:55:37] [PASSED] active-inactive
[14:55:37] [PASSED] inactive-active
[14:55:37] [PASSED] inactive-1st_or_active-inactive
[14:55:37] [PASSED] inactive-2nd_or_active-inactive
[14:55:37] [PASSED] inactive-last_or_active-inactive
[14:55:37] [PASSED] inactive-no_or_active-inactive
[14:55:37] ============== [PASSED] xe_rtp_process_tests ===============
[14:55:37] ===================== [PASSED] xe_rtp ======================
[14:55:37] ==================== xe_wa (1 subtest) =====================
[14:55:37] ======================== xe_wa_gt =========================
[14:55:37] [PASSED] TIGERLAKE B0
[14:55:37] [PASSED] DG1 A0
[14:55:37] [PASSED] DG1 B0
[14:55:37] [PASSED] ALDERLAKE_S A0
[14:55:37] [PASSED] ALDERLAKE_S B0
[14:55:37] [PASSED] ALDERLAKE_S C0
[14:55:37] [PASSED] ALDERLAKE_S D0
[14:55:37] [PASSED] ALDERLAKE_P A0
[14:55:37] [PASSED] ALDERLAKE_P B0
[14:55:37] [PASSED] ALDERLAKE_P C0
[14:55:37] [PASSED] ALDERLAKE_S RPLS D0
[14:55:37] [PASSED] ALDERLAKE_P RPLU E0
[14:55:37] [PASSED] DG2 G10 C0
[14:55:37] [PASSED] DG2 G11 B1
[14:55:37] [PASSED] DG2 G12 A1
[14:55:37] [PASSED] METEORLAKE 12.70(Xe_LPG) A0 13.00(Xe_LPM+) A0
[14:55:37] [PASSED] METEORLAKE 12.71(Xe_LPG) A0 13.00(Xe_LPM+) A0
[14:55:37] [PASSED] METEORLAKE 12.74(Xe_LPG+) A0 13.00(Xe_LPM+) A0
[14:55:37] [PASSED] LUNARLAKE 20.04(Xe2_LPG) A0 20.00(Xe2_LPM) A0
[14:55:37] [PASSED] LUNARLAKE 20.04(Xe2_LPG) B0 20.00(Xe2_LPM) A0
[14:55:37] [PASSED] BATTLEMAGE 20.01(Xe2_HPG) A0 13.01(Xe2_HPM) A1
[14:55:37] [PASSED] PANTHERLAKE 30.00(Xe3_LPG) A0 30.00(Xe3_LPM) A0
[14:55:37] ==================== [PASSED] xe_wa_gt =====================
[14:55:37] ====================== [PASSED] xe_wa ======================
[14:55:37] ============================================================
[14:55:37] Testing complete. Ran 603 tests: passed: 585, skipped: 18
[14:55:37] Elapsed time: 36.444s total, 4.277s configuring, 31.451s building, 0.688s running
+ /kernel/tools/testing/kunit/kunit.py run --kunitconfig /kernel/drivers/gpu/drm/tests/.kunitconfig
[14:55:38] Configuring KUnit Kernel ...
Regenerating .config ...
Populating config with:
$ make ARCH=um O=.kunit olddefconfig
[14:55:39] 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
[14:56:03] Starting KUnit Kernel (1/1)...
[14:56:03] ============================================================
Running tests with:
$ .kunit/linux kunit.enable=1 mem=1G console=tty kunit_shutdown=halt
[14:56:03] ============ drm_test_pick_cmdline (2 subtests) ============
[14:56:03] [PASSED] drm_test_pick_cmdline_res_1920_1080_60
[14:56:04] =============== drm_test_pick_cmdline_named ===============
[14:56:04] [PASSED] NTSC
[14:56:04] [PASSED] NTSC-J
[14:56:04] [PASSED] PAL
[14:56:04] [PASSED] PAL-M
[14:56:04] =========== [PASSED] drm_test_pick_cmdline_named ===========
[14:56:04] ============== [PASSED] drm_test_pick_cmdline ==============
[14:56:04] == drm_test_atomic_get_connector_for_encoder (1 subtest) ===
[14:56:04] [PASSED] drm_test_drm_atomic_get_connector_for_encoder
[14:56:04] ==== [PASSED] drm_test_atomic_get_connector_for_encoder ====
[14:56:04] =========== drm_validate_clone_mode (2 subtests) ===========
[14:56:04] ============== drm_test_check_in_clone_mode ===============
[14:56:04] [PASSED] in_clone_mode
[14:56:04] [PASSED] not_in_clone_mode
[14:56:04] ========== [PASSED] drm_test_check_in_clone_mode ===========
[14:56:04] =============== drm_test_check_valid_clones ===============
[14:56:04] [PASSED] not_in_clone_mode
[14:56:04] [PASSED] valid_clone
[14:56:04] [PASSED] invalid_clone
[14:56:04] =========== [PASSED] drm_test_check_valid_clones ===========
[14:56:04] ============= [PASSED] drm_validate_clone_mode =============
[14:56:04] ============= drm_validate_modeset (1 subtest) =============
[14:56:04] [PASSED] drm_test_check_connector_changed_modeset
[14:56:04] ============== [PASSED] drm_validate_modeset ===============
[14:56:04] ====== drm_test_bridge_get_current_state (2 subtests) ======
[14:56:04] [PASSED] drm_test_drm_bridge_get_current_state_atomic
[14:56:04] [PASSED] drm_test_drm_bridge_get_current_state_legacy
[14:56:04] ======== [PASSED] drm_test_bridge_get_current_state ========
[14:56:04] ====== drm_test_bridge_helper_reset_crtc (3 subtests) ======
[14:56:04] [PASSED] drm_test_drm_bridge_helper_reset_crtc_atomic
[14:56:04] [PASSED] drm_test_drm_bridge_helper_reset_crtc_atomic_disabled
[14:56:04] [PASSED] drm_test_drm_bridge_helper_reset_crtc_legacy
[14:56:04] ======== [PASSED] drm_test_bridge_helper_reset_crtc ========
[14:56:04] ============== drm_bridge_alloc (2 subtests) ===============
[14:56:04] [PASSED] drm_test_drm_bridge_alloc_basic
[14:56:04] [PASSED] drm_test_drm_bridge_alloc_get_put
[14:56:04] ================ [PASSED] drm_bridge_alloc =================
[14:56:04] ============= drm_cmdline_parser (40 subtests) =============
[14:56:04] [PASSED] drm_test_cmdline_force_d_only
[14:56:04] [PASSED] drm_test_cmdline_force_D_only_dvi
[14:56:04] [PASSED] drm_test_cmdline_force_D_only_hdmi
[14:56:04] [PASSED] drm_test_cmdline_force_D_only_not_digital
[14:56:04] [PASSED] drm_test_cmdline_force_e_only
[14:56:04] [PASSED] drm_test_cmdline_res
[14:56:04] [PASSED] drm_test_cmdline_res_vesa
[14:56:04] [PASSED] drm_test_cmdline_res_vesa_rblank
[14:56:04] [PASSED] drm_test_cmdline_res_rblank
[14:56:04] [PASSED] drm_test_cmdline_res_bpp
[14:56:04] [PASSED] drm_test_cmdline_res_refresh
[14:56:04] [PASSED] drm_test_cmdline_res_bpp_refresh
[14:56:04] [PASSED] drm_test_cmdline_res_bpp_refresh_interlaced
[14:56:04] [PASSED] drm_test_cmdline_res_bpp_refresh_margins
[14:56:04] [PASSED] drm_test_cmdline_res_bpp_refresh_force_off
[14:56:04] [PASSED] drm_test_cmdline_res_bpp_refresh_force_on
[14:56:04] [PASSED] drm_test_cmdline_res_bpp_refresh_force_on_analog
[14:56:04] [PASSED] drm_test_cmdline_res_bpp_refresh_force_on_digital
[14:56:04] [PASSED] drm_test_cmdline_res_bpp_refresh_interlaced_margins_force_on
[14:56:04] [PASSED] drm_test_cmdline_res_margins_force_on
[14:56:04] [PASSED] drm_test_cmdline_res_vesa_margins
[14:56:04] [PASSED] drm_test_cmdline_name
[14:56:04] [PASSED] drm_test_cmdline_name_bpp
[14:56:04] [PASSED] drm_test_cmdline_name_option
[14:56:04] [PASSED] drm_test_cmdline_name_bpp_option
[14:56:04] [PASSED] drm_test_cmdline_rotate_0
[14:56:04] [PASSED] drm_test_cmdline_rotate_90
[14:56:04] [PASSED] drm_test_cmdline_rotate_180
[14:56:04] [PASSED] drm_test_cmdline_rotate_270
[14:56:04] [PASSED] drm_test_cmdline_hmirror
[14:56:04] [PASSED] drm_test_cmdline_vmirror
[14:56:04] [PASSED] drm_test_cmdline_margin_options
[14:56:04] [PASSED] drm_test_cmdline_multiple_options
[14:56:04] [PASSED] drm_test_cmdline_bpp_extra_and_option
[14:56:04] [PASSED] drm_test_cmdline_extra_and_option
[14:56:04] [PASSED] drm_test_cmdline_freestanding_options
[14:56:04] [PASSED] drm_test_cmdline_freestanding_force_e_and_options
[14:56:04] [PASSED] drm_test_cmdline_panel_orientation
[14:56:04] ================ drm_test_cmdline_invalid =================
[14:56:04] [PASSED] margin_only
[14:56:04] [PASSED] interlace_only
[14:56:04] [PASSED] res_missing_x
[14:56:04] [PASSED] res_missing_y
[14:56:04] [PASSED] res_bad_y
[14:56:04] [PASSED] res_missing_y_bpp
[14:56:04] [PASSED] res_bad_bpp
[14:56:04] [PASSED] res_bad_refresh
[14:56:04] [PASSED] res_bpp_refresh_force_on_off
[14:56:04] [PASSED] res_invalid_mode
[14:56:04] [PASSED] res_bpp_wrong_place_mode
[14:56:04] [PASSED] name_bpp_refresh
[14:56:04] [PASSED] name_refresh
[14:56:04] [PASSED] name_refresh_wrong_mode
[14:56:04] [PASSED] name_refresh_invalid_mode
[14:56:04] [PASSED] rotate_multiple
[14:56:04] [PASSED] rotate_invalid_val
[14:56:04] [PASSED] rotate_truncated
[14:56:04] [PASSED] invalid_option
[14:56:04] [PASSED] invalid_tv_option
[14:56:04] [PASSED] truncated_tv_option
[14:56:04] ============ [PASSED] drm_test_cmdline_invalid =============
[14:56:04] =============== drm_test_cmdline_tv_options ===============
[14:56:04] [PASSED] NTSC
[14:56:04] [PASSED] NTSC_443
[14:56:04] [PASSED] NTSC_J
[14:56:04] [PASSED] PAL
[14:56:04] [PASSED] PAL_M
[14:56:04] [PASSED] PAL_N
[14:56:04] [PASSED] SECAM
[14:56:04] [PASSED] MONO_525
[14:56:04] [PASSED] MONO_625
[14:56:04] =========== [PASSED] drm_test_cmdline_tv_options ===========
[14:56:04] =============== [PASSED] drm_cmdline_parser ================
[14:56:04] ========== drmm_connector_hdmi_init (20 subtests) ==========
[14:56:04] [PASSED] drm_test_connector_hdmi_init_valid
[14:56:04] [PASSED] drm_test_connector_hdmi_init_bpc_8
[14:56:04] [PASSED] drm_test_connector_hdmi_init_bpc_10
[14:56:04] [PASSED] drm_test_connector_hdmi_init_bpc_12
[14:56:04] [PASSED] drm_test_connector_hdmi_init_bpc_invalid
[14:56:04] [PASSED] drm_test_connector_hdmi_init_bpc_null
[14:56:04] [PASSED] drm_test_connector_hdmi_init_formats_empty
[14:56:04] [PASSED] drm_test_connector_hdmi_init_formats_no_rgb
[14:56:04] === drm_test_connector_hdmi_init_formats_yuv420_allowed ===
[14:56:04] [PASSED] supported_formats=0x9 yuv420_allowed=1
[14:56:04] [PASSED] supported_formats=0x9 yuv420_allowed=0
[14:56:04] [PASSED] supported_formats=0x5 yuv420_allowed=1
[14:56:04] [PASSED] supported_formats=0x5 yuv420_allowed=0
[14:56:04] === [PASSED] drm_test_connector_hdmi_init_formats_yuv420_allowed ===
[14:56:04] [PASSED] drm_test_connector_hdmi_init_null_ddc
[14:56:04] [PASSED] drm_test_connector_hdmi_init_null_product
[14:56:04] [PASSED] drm_test_connector_hdmi_init_null_vendor
[14:56:04] [PASSED] drm_test_connector_hdmi_init_product_length_exact
[14:56:04] [PASSED] drm_test_connector_hdmi_init_product_length_too_long
[14:56:04] [PASSED] drm_test_connector_hdmi_init_product_valid
[14:56:04] [PASSED] drm_test_connector_hdmi_init_vendor_length_exact
[14:56:04] [PASSED] drm_test_connector_hdmi_init_vendor_length_too_long
[14:56:04] [PASSED] drm_test_connector_hdmi_init_vendor_valid
[14:56:04] ========= drm_test_connector_hdmi_init_type_valid =========
[14:56:04] [PASSED] HDMI-A
[14:56:04] [PASSED] HDMI-B
[14:56:04] ===== [PASSED] drm_test_connector_hdmi_init_type_valid =====
[14:56:04] ======== drm_test_connector_hdmi_init_type_invalid ========
[14:56:04] [PASSED] Unknown
[14:56:04] [PASSED] VGA
[14:56:04] [PASSED] DVI-I
[14:56:04] [PASSED] DVI-D
[14:56:04] [PASSED] DVI-A
[14:56:04] [PASSED] Composite
[14:56:04] [PASSED] SVIDEO
[14:56:04] [PASSED] LVDS
[14:56:04] [PASSED] Component
[14:56:04] [PASSED] DIN
[14:56:04] [PASSED] DP
[14:56:04] [PASSED] TV
[14:56:04] [PASSED] eDP
[14:56:04] [PASSED] Virtual
[14:56:04] [PASSED] DSI
[14:56:04] [PASSED] DPI
[14:56:04] [PASSED] Writeback
[14:56:04] [PASSED] SPI
[14:56:04] [PASSED] USB
[14:56:04] ==== [PASSED] drm_test_connector_hdmi_init_type_invalid ====
[14:56:04] ============ [PASSED] drmm_connector_hdmi_init =============
[14:56:04] ============= drmm_connector_init (3 subtests) =============
[14:56:04] [PASSED] drm_test_drmm_connector_init
[14:56:04] [PASSED] drm_test_drmm_connector_init_null_ddc
[14:56:04] ========= drm_test_drmm_connector_init_type_valid =========
[14:56:04] [PASSED] Unknown
[14:56:04] [PASSED] VGA
[14:56:04] [PASSED] DVI-I
[14:56:04] [PASSED] DVI-D
[14:56:04] [PASSED] DVI-A
[14:56:04] [PASSED] Composite
[14:56:04] [PASSED] SVIDEO
[14:56:04] [PASSED] LVDS
[14:56:04] [PASSED] Component
[14:56:04] [PASSED] DIN
[14:56:04] [PASSED] DP
[14:56:04] [PASSED] HDMI-A
[14:56:04] [PASSED] HDMI-B
[14:56:04] [PASSED] TV
[14:56:04] [PASSED] eDP
[14:56:04] [PASSED] Virtual
[14:56:04] [PASSED] DSI
[14:56:04] [PASSED] DPI
[14:56:04] [PASSED] Writeback
[14:56:04] [PASSED] SPI
[14:56:04] [PASSED] USB
[14:56:04] ===== [PASSED] drm_test_drmm_connector_init_type_valid =====
[14:56:04] =============== [PASSED] drmm_connector_init ===============
[14:56:04] ========= drm_connector_dynamic_init (6 subtests) ==========
[14:56:04] [PASSED] drm_test_drm_connector_dynamic_init
[14:56:04] [PASSED] drm_test_drm_connector_dynamic_init_null_ddc
[14:56:04] [PASSED] drm_test_drm_connector_dynamic_init_not_added
[14:56:04] [PASSED] drm_test_drm_connector_dynamic_init_properties
[14:56:04] ===== drm_test_drm_connector_dynamic_init_type_valid ======
[14:56:04] [PASSED] Unknown
[14:56:04] [PASSED] VGA
[14:56:04] [PASSED] DVI-I
[14:56:04] [PASSED] DVI-D
[14:56:04] [PASSED] DVI-A
[14:56:04] [PASSED] Composite
[14:56:04] [PASSED] SVIDEO
[14:56:04] [PASSED] LVDS
[14:56:04] [PASSED] Component
[14:56:04] [PASSED] DIN
[14:56:04] [PASSED] DP
[14:56:04] [PASSED] HDMI-A
[14:56:04] [PASSED] HDMI-B
[14:56:04] [PASSED] TV
[14:56:04] [PASSED] eDP
[14:56:04] [PASSED] Virtual
[14:56:04] [PASSED] DSI
[14:56:04] [PASSED] DPI
[14:56:04] [PASSED] Writeback
[14:56:04] [PASSED] SPI
[14:56:04] [PASSED] USB
[14:56:04] = [PASSED] drm_test_drm_connector_dynamic_init_type_valid ==
[14:56:04] ======== drm_test_drm_connector_dynamic_init_name =========
[14:56:04] [PASSED] Unknown
[14:56:04] [PASSED] VGA
[14:56:04] [PASSED] DVI-I
[14:56:04] [PASSED] DVI-D
[14:56:04] [PASSED] DVI-A
[14:56:04] [PASSED] Composite
[14:56:04] [PASSED] SVIDEO
[14:56:04] [PASSED] LVDS
[14:56:04] [PASSED] Component
[14:56:04] [PASSED] DIN
[14:56:04] [PASSED] DP
[14:56:04] [PASSED] HDMI-A
[14:56:04] [PASSED] HDMI-B
[14:56:04] [PASSED] TV
[14:56:04] [PASSED] eDP
[14:56:04] [PASSED] Virtual
[14:56:04] [PASSED] DSI
[14:56:04] [PASSED] DPI
[14:56:04] [PASSED] Writeback
[14:56:04] [PASSED] SPI
[14:56:04] [PASSED] USB
[14:56:04] ==== [PASSED] drm_test_drm_connector_dynamic_init_name =====
[14:56:04] =========== [PASSED] drm_connector_dynamic_init ============
[14:56:04] ==== drm_connector_dynamic_register_early (4 subtests) =====
[14:56:04] [PASSED] drm_test_drm_connector_dynamic_register_early_on_list
[14:56:04] [PASSED] drm_test_drm_connector_dynamic_register_early_defer
[14:56:04] [PASSED] drm_test_drm_connector_dynamic_register_early_no_init
[14:56:04] [PASSED] drm_test_drm_connector_dynamic_register_early_no_mode_object
[14:56:04] ====== [PASSED] drm_connector_dynamic_register_early =======
[14:56:04] ======= drm_connector_dynamic_register (7 subtests) ========
[14:56:04] [PASSED] drm_test_drm_connector_dynamic_register_on_list
[14:56:04] [PASSED] drm_test_drm_connector_dynamic_register_no_defer
[14:56:04] [PASSED] drm_test_drm_connector_dynamic_register_no_init
[14:56:04] [PASSED] drm_test_drm_connector_dynamic_register_mode_object
[14:56:04] [PASSED] drm_test_drm_connector_dynamic_register_sysfs
[14:56:04] [PASSED] drm_test_drm_connector_dynamic_register_sysfs_name
[14:56:04] [PASSED] drm_test_drm_connector_dynamic_register_debugfs
[14:56:04] ========= [PASSED] drm_connector_dynamic_register ==========
[14:56:04] = drm_connector_attach_broadcast_rgb_property (2 subtests) =
[14:56:04] [PASSED] drm_test_drm_connector_attach_broadcast_rgb_property
[14:56:04] [PASSED] drm_test_drm_connector_attach_broadcast_rgb_property_hdmi_connector
[14:56:04] === [PASSED] drm_connector_attach_broadcast_rgb_property ===
[14:56:04] ========== drm_get_tv_mode_from_name (2 subtests) ==========
[14:56:04] ========== drm_test_get_tv_mode_from_name_valid ===========
[14:56:04] [PASSED] NTSC
[14:56:04] [PASSED] NTSC-443
[14:56:04] [PASSED] NTSC-J
[14:56:04] [PASSED] PAL
[14:56:04] [PASSED] PAL-M
[14:56:04] [PASSED] PAL-N
[14:56:04] [PASSED] SECAM
[14:56:04] [PASSED] Mono
[14:56:04] ====== [PASSED] drm_test_get_tv_mode_from_name_valid =======
[14:56:04] [PASSED] drm_test_get_tv_mode_from_name_truncated
[14:56:04] ============ [PASSED] drm_get_tv_mode_from_name ============
[14:56:04] = drm_test_connector_hdmi_compute_mode_clock (12 subtests) =
[14:56:04] [PASSED] drm_test_drm_hdmi_compute_mode_clock_rgb
[14:56:04] [PASSED] drm_test_drm_hdmi_compute_mode_clock_rgb_10bpc
[14:56:04] [PASSED] drm_test_drm_hdmi_compute_mode_clock_rgb_10bpc_vic_1
[14:56:04] [PASSED] drm_test_drm_hdmi_compute_mode_clock_rgb_12bpc
[14:56:04] [PASSED] drm_test_drm_hdmi_compute_mode_clock_rgb_12bpc_vic_1
[14:56:04] [PASSED] drm_test_drm_hdmi_compute_mode_clock_rgb_double
[14:56:04] = drm_test_connector_hdmi_compute_mode_clock_yuv420_valid =
[14:56:04] [PASSED] VIC 96
[14:56:04] [PASSED] VIC 97
[14:56:04] [PASSED] VIC 101
[14:56:04] [PASSED] VIC 102
[14:56:04] [PASSED] VIC 106
[14:56:04] [PASSED] VIC 107
[14:56:04] === [PASSED] drm_test_connector_hdmi_compute_mode_clock_yuv420_valid ===
[14:56:04] [PASSED] drm_test_connector_hdmi_compute_mode_clock_yuv420_10_bpc
[14:56:04] [PASSED] drm_test_connector_hdmi_compute_mode_clock_yuv420_12_bpc
[14:56:04] [PASSED] drm_test_connector_hdmi_compute_mode_clock_yuv422_8_bpc
[14:56:04] [PASSED] drm_test_connector_hdmi_compute_mode_clock_yuv422_10_bpc
[14:56:04] [PASSED] drm_test_connector_hdmi_compute_mode_clock_yuv422_12_bpc
[14:56:04] === [PASSED] drm_test_connector_hdmi_compute_mode_clock ====
[14:56:04] == drm_hdmi_connector_get_broadcast_rgb_name (2 subtests) ==
[14:56:04] === drm_test_drm_hdmi_connector_get_broadcast_rgb_name ====
[14:56:04] [PASSED] Automatic
[14:56:04] [PASSED] Full
[14:56:04] [PASSED] Limited 16:235
[14:56:04] === [PASSED] drm_test_drm_hdmi_connector_get_broadcast_rgb_name ===
[14:56:04] [PASSED] drm_test_drm_hdmi_connector_get_broadcast_rgb_name_invalid
[14:56:04] ==== [PASSED] drm_hdmi_connector_get_broadcast_rgb_name ====
[14:56:04] == drm_hdmi_connector_get_output_format_name (2 subtests) ==
[14:56:04] === drm_test_drm_hdmi_connector_get_output_format_name ====
[14:56:04] [PASSED] RGB
[14:56:04] [PASSED] YUV 4:2:0
[14:56:04] [PASSED] YUV 4:2:2
[14:56:04] [PASSED] YUV 4:4:4
[14:56:04] === [PASSED] drm_test_drm_hdmi_connector_get_output_format_name ===
[14:56:04] [PASSED] drm_test_drm_hdmi_connector_get_output_format_name_invalid
[14:56:04] ==== [PASSED] drm_hdmi_connector_get_output_format_name ====
[14:56:04] ============= drm_damage_helper (21 subtests) ==============
[14:56:04] [PASSED] drm_test_damage_iter_no_damage
[14:56:04] [PASSED] drm_test_damage_iter_no_damage_fractional_src
[14:56:04] [PASSED] drm_test_damage_iter_no_damage_src_moved
[14:56:04] [PASSED] drm_test_damage_iter_no_damage_fractional_src_moved
[14:56:04] [PASSED] drm_test_damage_iter_no_damage_not_visible
[14:56:04] [PASSED] drm_test_damage_iter_no_damage_no_crtc
[14:56:04] [PASSED] drm_test_damage_iter_no_damage_no_fb
[14:56:04] [PASSED] drm_test_damage_iter_simple_damage
[14:56:04] [PASSED] drm_test_damage_iter_single_damage
[14:56:04] [PASSED] drm_test_damage_iter_single_damage_intersect_src
[14:56:04] [PASSED] drm_test_damage_iter_single_damage_outside_src
[14:56:04] [PASSED] drm_test_damage_iter_single_damage_fractional_src
[14:56:04] [PASSED] drm_test_damage_iter_single_damage_intersect_fractional_src
[14:56:04] [PASSED] drm_test_damage_iter_single_damage_outside_fractional_src
[14:56:04] [PASSED] drm_test_damage_iter_single_damage_src_moved
[14:56:04] [PASSED] drm_test_damage_iter_single_damage_fractional_src_moved
[14:56:04] [PASSED] drm_test_damage_iter_damage
[14:56:04] [PASSED] drm_test_damage_iter_damage_one_intersect
[14:56:04] [PASSED] drm_test_damage_iter_damage_one_outside
[14:56:04] [PASSED] drm_test_damage_iter_damage_src_moved
[14:56:04] [PASSED] drm_test_damage_iter_damage_not_visible
[14:56:04] ================ [PASSED] drm_damage_helper ================
[14:56:04] ============== drm_dp_mst_helper (3 subtests) ==============
[14:56:04] ============== drm_test_dp_mst_calc_pbn_mode ==============
[14:56:04] [PASSED] Clock 154000 BPP 30 DSC disabled
[14:56:04] [PASSED] Clock 234000 BPP 30 DSC disabled
[14:56:04] [PASSED] Clock 297000 BPP 24 DSC disabled
[14:56:04] [PASSED] Clock 332880 BPP 24 DSC enabled
[14:56:04] [PASSED] Clock 324540 BPP 24 DSC enabled
[14:56:04] ========== [PASSED] drm_test_dp_mst_calc_pbn_mode ==========
[14:56:04] ============== drm_test_dp_mst_calc_pbn_div ===============
[14:56:04] [PASSED] Link rate 2000000 lane count 4
[14:56:04] [PASSED] Link rate 2000000 lane count 2
[14:56:04] [PASSED] Link rate 2000000 lane count 1
[14:56:04] [PASSED] Link rate 1350000 lane count 4
[14:56:04] [PASSED] Link rate 1350000 lane count 2
[14:56:04] [PASSED] Link rate 1350000 lane count 1
[14:56:04] [PASSED] Link rate 1000000 lane count 4
[14:56:04] [PASSED] Link rate 1000000 lane count 2
[14:56:04] [PASSED] Link rate 1000000 lane count 1
[14:56:04] [PASSED] Link rate 810000 lane count 4
[14:56:04] [PASSED] Link rate 810000 lane count 2
[14:56:04] [PASSED] Link rate 810000 lane count 1
[14:56:04] [PASSED] Link rate 540000 lane count 4
[14:56:04] [PASSED] Link rate 540000 lane count 2
[14:56:04] [PASSED] Link rate 540000 lane count 1
[14:56:04] [PASSED] Link rate 270000 lane count 4
[14:56:04] [PASSED] Link rate 270000 lane count 2
[14:56:04] [PASSED] Link rate 270000 lane count 1
[14:56:04] [PASSED] Link rate 162000 lane count 4
[14:56:04] [PASSED] Link rate 162000 lane count 2
[14:56:04] [PASSED] Link rate 162000 lane count 1
[14:56:04] ========== [PASSED] drm_test_dp_mst_calc_pbn_div ===========
[14:56:04] ========= drm_test_dp_mst_sideband_msg_req_decode =========
[14:56:04] [PASSED] DP_ENUM_PATH_RESOURCES with port number
[14:56:04] [PASSED] DP_POWER_UP_PHY with port number
[14:56:04] [PASSED] DP_POWER_DOWN_PHY with port number
[14:56:04] [PASSED] DP_ALLOCATE_PAYLOAD with SDP stream sinks
[14:56:04] [PASSED] DP_ALLOCATE_PAYLOAD with port number
[14:56:04] [PASSED] DP_ALLOCATE_PAYLOAD with VCPI
[14:56:04] [PASSED] DP_ALLOCATE_PAYLOAD with PBN
[14:56:04] [PASSED] DP_QUERY_PAYLOAD with port number
[14:56:04] [PASSED] DP_QUERY_PAYLOAD with VCPI
[14:56:04] [PASSED] DP_REMOTE_DPCD_READ with port number
[14:56:04] [PASSED] DP_REMOTE_DPCD_READ with DPCD address
[14:56:04] [PASSED] DP_REMOTE_DPCD_READ with max number of bytes
[14:56:04] [PASSED] DP_REMOTE_DPCD_WRITE with port number
[14:56:04] [PASSED] DP_REMOTE_DPCD_WRITE with DPCD address
[14:56:04] [PASSED] DP_REMOTE_DPCD_WRITE with data array
[14:56:04] [PASSED] DP_REMOTE_I2C_READ with port number
[14:56:04] [PASSED] DP_REMOTE_I2C_READ with I2C device ID
[14:56:04] [PASSED] DP_REMOTE_I2C_READ with transactions array
[14:56:04] [PASSED] DP_REMOTE_I2C_WRITE with port number
[14:56:04] [PASSED] DP_REMOTE_I2C_WRITE with I2C device ID
[14:56:04] [PASSED] DP_REMOTE_I2C_WRITE with data array
[14:56:04] [PASSED] DP_QUERY_STREAM_ENC_STATUS with stream ID
[14:56:04] [PASSED] DP_QUERY_STREAM_ENC_STATUS with client ID
[14:56:04] [PASSED] DP_QUERY_STREAM_ENC_STATUS with stream event
[14:56:04] [PASSED] DP_QUERY_STREAM_ENC_STATUS with valid stream event
[14:56:04] [PASSED] DP_QUERY_STREAM_ENC_STATUS with stream behavior
[14:56:04] [PASSED] DP_QUERY_STREAM_ENC_STATUS with a valid stream behavior
[14:56:04] ===== [PASSED] drm_test_dp_mst_sideband_msg_req_decode =====
[14:56:04] ================ [PASSED] drm_dp_mst_helper ================
[14:56:04] ================== drm_exec (7 subtests) ===================
[14:56:04] [PASSED] sanitycheck
[14:56:04] [PASSED] test_lock
[14:56:04] [PASSED] test_lock_unlock
[14:56:04] [PASSED] test_duplicates
[14:56:04] [PASSED] test_prepare
[14:56:04] [PASSED] test_prepare_array
[14:56:04] [PASSED] test_multiple_loops
[14:56:04] ==================== [PASSED] drm_exec =====================
[14:56:04] =========== drm_format_helper_test (17 subtests) ===========
[14:56:04] ============== drm_test_fb_xrgb8888_to_gray8 ==============
[14:56:04] [PASSED] single_pixel_source_buffer
[14:56:04] [PASSED] single_pixel_clip_rectangle
[14:56:04] [PASSED] well_known_colors
[14:56:04] [PASSED] destination_pitch
[14:56:04] ========== [PASSED] drm_test_fb_xrgb8888_to_gray8 ==========
[14:56:04] ============= drm_test_fb_xrgb8888_to_rgb332 ==============
[14:56:04] [PASSED] single_pixel_source_buffer
[14:56:04] [PASSED] single_pixel_clip_rectangle
[14:56:04] [PASSED] well_known_colors
[14:56:04] [PASSED] destination_pitch
[14:56:04] ========= [PASSED] drm_test_fb_xrgb8888_to_rgb332 ==========
[14:56:04] ============= drm_test_fb_xrgb8888_to_rgb565 ==============
[14:56:04] [PASSED] single_pixel_source_buffer
[14:56:04] [PASSED] single_pixel_clip_rectangle
[14:56:04] [PASSED] well_known_colors
[14:56:04] [PASSED] destination_pitch
[14:56:04] ========= [PASSED] drm_test_fb_xrgb8888_to_rgb565 ==========
[14:56:04] ============ drm_test_fb_xrgb8888_to_xrgb1555 =============
[14:56:04] [PASSED] single_pixel_source_buffer
[14:56:04] [PASSED] single_pixel_clip_rectangle
[14:56:04] [PASSED] well_known_colors
[14:56:04] [PASSED] destination_pitch
[14:56:04] ======== [PASSED] drm_test_fb_xrgb8888_to_xrgb1555 =========
[14:56:04] ============ drm_test_fb_xrgb8888_to_argb1555 =============
[14:56:04] [PASSED] single_pixel_source_buffer
[14:56:04] [PASSED] single_pixel_clip_rectangle
[14:56:04] [PASSED] well_known_colors
[14:56:04] [PASSED] destination_pitch
[14:56:04] ======== [PASSED] drm_test_fb_xrgb8888_to_argb1555 =========
[14:56:04] ============ drm_test_fb_xrgb8888_to_rgba5551 =============
[14:56:04] [PASSED] single_pixel_source_buffer
[14:56:04] [PASSED] single_pixel_clip_rectangle
[14:56:04] [PASSED] well_known_colors
[14:56:04] [PASSED] destination_pitch
[14:56:04] ======== [PASSED] drm_test_fb_xrgb8888_to_rgba5551 =========
[14:56:04] ============= drm_test_fb_xrgb8888_to_rgb888 ==============
[14:56:04] [PASSED] single_pixel_source_buffer
[14:56:04] [PASSED] single_pixel_clip_rectangle
[14:56:04] [PASSED] well_known_colors
[14:56:04] [PASSED] destination_pitch
[14:56:04] ========= [PASSED] drm_test_fb_xrgb8888_to_rgb888 ==========
[14:56:04] ============= drm_test_fb_xrgb8888_to_bgr888 ==============
[14:56:04] [PASSED] single_pixel_source_buffer
[14:56:04] [PASSED] single_pixel_clip_rectangle
[14:56:04] [PASSED] well_known_colors
[14:56:04] [PASSED] destination_pitch
[14:56:04] ========= [PASSED] drm_test_fb_xrgb8888_to_bgr888 ==========
[14:56:04] ============ drm_test_fb_xrgb8888_to_argb8888 =============
[14:56:04] [PASSED] single_pixel_source_buffer
[14:56:04] [PASSED] single_pixel_clip_rectangle
[14:56:04] [PASSED] well_known_colors
[14:56:04] [PASSED] destination_pitch
[14:56:04] ======== [PASSED] drm_test_fb_xrgb8888_to_argb8888 =========
[14:56:04] =========== drm_test_fb_xrgb8888_to_xrgb2101010 ===========
[14:56:04] [PASSED] single_pixel_source_buffer
[14:56:04] [PASSED] single_pixel_clip_rectangle
[14:56:04] [PASSED] well_known_colors
[14:56:04] [PASSED] destination_pitch
[14:56:04] ======= [PASSED] drm_test_fb_xrgb8888_to_xrgb2101010 =======
[14:56:04] =========== drm_test_fb_xrgb8888_to_argb2101010 ===========
[14:56:04] [PASSED] single_pixel_source_buffer
[14:56:04] [PASSED] single_pixel_clip_rectangle
[14:56:04] [PASSED] well_known_colors
[14:56:04] [PASSED] destination_pitch
[14:56:04] ======= [PASSED] drm_test_fb_xrgb8888_to_argb2101010 =======
[14:56:04] ============== drm_test_fb_xrgb8888_to_mono ===============
[14:56:04] [PASSED] single_pixel_source_buffer
[14:56:04] [PASSED] single_pixel_clip_rectangle
[14:56:04] [PASSED] well_known_colors
[14:56:04] [PASSED] destination_pitch
[14:56:04] ========== [PASSED] drm_test_fb_xrgb8888_to_mono ===========
[14:56:04] ==================== drm_test_fb_swab =====================
[14:56:04] [PASSED] single_pixel_source_buffer
[14:56:04] [PASSED] single_pixel_clip_rectangle
[14:56:04] [PASSED] well_known_colors
[14:56:04] [PASSED] destination_pitch
[14:56:04] ================ [PASSED] drm_test_fb_swab =================
[14:56:04] ============ drm_test_fb_xrgb8888_to_xbgr8888 =============
[14:56:04] [PASSED] single_pixel_source_buffer
[14:56:04] [PASSED] single_pixel_clip_rectangle
[14:56:04] [PASSED] well_known_colors
[14:56:04] [PASSED] destination_pitch
[14:56:04] ======== [PASSED] drm_test_fb_xrgb8888_to_xbgr8888 =========
[14:56:04] ============ drm_test_fb_xrgb8888_to_abgr8888 =============
[14:56:04] [PASSED] single_pixel_source_buffer
[14:56:04] [PASSED] single_pixel_clip_rectangle
[14:56:04] [PASSED] well_known_colors
[14:56:04] [PASSED] destination_pitch
[14:56:04] ======== [PASSED] drm_test_fb_xrgb8888_to_abgr8888 =========
[14:56:04] ================= drm_test_fb_clip_offset =================
[14:56:04] [PASSED] pass through
[14:56:04] [PASSED] horizontal offset
[14:56:04] [PASSED] vertical offset
[14:56:04] [PASSED] horizontal and vertical offset
[14:56:04] [PASSED] horizontal offset (custom pitch)
[14:56:04] [PASSED] vertical offset (custom pitch)
[14:56:04] [PASSED] horizontal and vertical offset (custom pitch)
[14:56:04] ============= [PASSED] drm_test_fb_clip_offset =============
[14:56:04] =================== drm_test_fb_memcpy ====================
[14:56:04] [PASSED] single_pixel_source_buffer: XR24 little-endian (0x34325258)
[14:56:04] [PASSED] single_pixel_source_buffer: XRA8 little-endian (0x38415258)
[14:56:04] [PASSED] single_pixel_source_buffer: YU24 little-endian (0x34325559)
[14:56:04] [PASSED] single_pixel_clip_rectangle: XB24 little-endian (0x34324258)
[14:56:04] [PASSED] single_pixel_clip_rectangle: XRA8 little-endian (0x38415258)
[14:56:04] [PASSED] single_pixel_clip_rectangle: YU24 little-endian (0x34325559)
[14:56:04] [PASSED] well_known_colors: XB24 little-endian (0x34324258)
[14:56:04] [PASSED] well_known_colors: XRA8 little-endian (0x38415258)
[14:56:04] [PASSED] well_known_colors: YU24 little-endian (0x34325559)
[14:56:04] [PASSED] destination_pitch: XB24 little-endian (0x34324258)
[14:56:04] [PASSED] destination_pitch: XRA8 little-endian (0x38415258)
[14:56:04] [PASSED] destination_pitch: YU24 little-endian (0x34325559)
[14:56:04] =============== [PASSED] drm_test_fb_memcpy ================
[14:56:04] ============= [PASSED] drm_format_helper_test ==============
[14:56:04] ================= drm_format (18 subtests) =================
[14:56:04] [PASSED] drm_test_format_block_width_invalid
[14:56:04] [PASSED] drm_test_format_block_width_one_plane
[14:56:04] [PASSED] drm_test_format_block_width_two_plane
[14:56:04] [PASSED] drm_test_format_block_width_three_plane
[14:56:04] [PASSED] drm_test_format_block_width_tiled
[14:56:04] [PASSED] drm_test_format_block_height_invalid
[14:56:04] [PASSED] drm_test_format_block_height_one_plane
[14:56:04] [PASSED] drm_test_format_block_height_two_plane
[14:56:04] [PASSED] drm_test_format_block_height_three_plane
[14:56:04] [PASSED] drm_test_format_block_height_tiled
[14:56:04] [PASSED] drm_test_format_min_pitch_invalid
[14:56:04] [PASSED] drm_test_format_min_pitch_one_plane_8bpp
[14:56:04] [PASSED] drm_test_format_min_pitch_one_plane_16bpp
[14:56:04] [PASSED] drm_test_format_min_pitch_one_plane_24bpp
[14:56:04] [PASSED] drm_test_format_min_pitch_one_plane_32bpp
[14:56:04] [PASSED] drm_test_format_min_pitch_two_plane
[14:56:04] [PASSED] drm_test_format_min_pitch_three_plane_8bpp
[14:56:04] [PASSED] drm_test_format_min_pitch_tiled
[14:56:04] =================== [PASSED] drm_format ====================
[14:56:04] ============== drm_framebuffer (10 subtests) ===============
[14:56:04] ========== drm_test_framebuffer_check_src_coords ==========
[14:56:04] [PASSED] Success: source fits into fb
[14:56:04] [PASSED] Fail: overflowing fb with x-axis coordinate
[14:56:04] [PASSED] Fail: overflowing fb with y-axis coordinate
[14:56:04] [PASSED] Fail: overflowing fb with source width
[14:56:04] [PASSED] Fail: overflowing fb with source height
[14:56:04] ====== [PASSED] drm_test_framebuffer_check_src_coords ======
[14:56:04] [PASSED] drm_test_framebuffer_cleanup
[14:56:04] =============== drm_test_framebuffer_create ===============
[14:56:04] [PASSED] ABGR8888 normal sizes
[14:56:04] [PASSED] ABGR8888 max sizes
[14:56:04] [PASSED] ABGR8888 pitch greater than min required
[14:56:04] [PASSED] ABGR8888 pitch less than min required
[14:56:04] [PASSED] ABGR8888 Invalid width
[14:56:04] [PASSED] ABGR8888 Invalid buffer handle
[14:56:04] [PASSED] No pixel format
[14:56:04] [PASSED] ABGR8888 Width 0
[14:56:04] [PASSED] ABGR8888 Height 0
[14:56:04] [PASSED] ABGR8888 Out of bound height * pitch combination
[14:56:04] [PASSED] ABGR8888 Large buffer offset
[14:56:04] [PASSED] ABGR8888 Buffer offset for inexistent plane
[14:56:04] [PASSED] ABGR8888 Invalid flag
[14:56:04] [PASSED] ABGR8888 Set DRM_MODE_FB_MODIFIERS without modifiers
[14:56:04] [PASSED] ABGR8888 Valid buffer modifier
[14:56:04] [PASSED] ABGR8888 Invalid buffer modifier(DRM_FORMAT_MOD_SAMSUNG_64_32_TILE)
[14:56:04] [PASSED] ABGR8888 Extra pitches without DRM_MODE_FB_MODIFIERS
[14:56:04] [PASSED] ABGR8888 Extra pitches with DRM_MODE_FB_MODIFIERS
[14:56:04] [PASSED] NV12 Normal sizes
[14:56:04] [PASSED] NV12 Max sizes
[14:56:04] [PASSED] NV12 Invalid pitch
[14:56:04] [PASSED] NV12 Invalid modifier/missing DRM_MODE_FB_MODIFIERS flag
[14:56:04] [PASSED] NV12 different modifier per-plane
[14:56:04] [PASSED] NV12 with DRM_FORMAT_MOD_SAMSUNG_64_32_TILE
[14:56:04] [PASSED] NV12 Valid modifiers without DRM_MODE_FB_MODIFIERS
[14:56:04] [PASSED] NV12 Modifier for inexistent plane
[14:56:04] [PASSED] NV12 Handle for inexistent plane
[14:56:04] [PASSED] NV12 Handle for inexistent plane without DRM_MODE_FB_MODIFIERS
[14:56:04] [PASSED] YVU420 DRM_MODE_FB_MODIFIERS set without modifier
[14:56:04] [PASSED] YVU420 Normal sizes
[14:56:04] [PASSED] YVU420 Max sizes
[14:56:04] [PASSED] YVU420 Invalid pitch
[14:56:04] [PASSED] YVU420 Different pitches
[14:56:04] [PASSED] YVU420 Different buffer offsets/pitches
[14:56:04] [PASSED] YVU420 Modifier set just for plane 0, without DRM_MODE_FB_MODIFIERS
[14:56:04] [PASSED] YVU420 Modifier set just for planes 0, 1, without DRM_MODE_FB_MODIFIERS
[14:56:04] [PASSED] YVU420 Modifier set just for plane 0, 1, with DRM_MODE_FB_MODIFIERS
[14:56:04] [PASSED] YVU420 Valid modifier
[14:56:04] [PASSED] YVU420 Different modifiers per plane
[14:56:04] [PASSED] YVU420 Modifier for inexistent plane
[14:56:04] [PASSED] YUV420_10BIT Invalid modifier(DRM_FORMAT_MOD_LINEAR)
[14:56:04] [PASSED] X0L2 Normal sizes
[14:56:04] [PASSED] X0L2 Max sizes
[14:56:04] [PASSED] X0L2 Invalid pitch
[14:56:04] [PASSED] X0L2 Pitch greater than minimum required
[14:56:04] [PASSED] X0L2 Handle for inexistent plane
[14:56:04] [PASSED] X0L2 Offset for inexistent plane, without DRM_MODE_FB_MODIFIERS set
[14:56:04] [PASSED] X0L2 Modifier without DRM_MODE_FB_MODIFIERS set
[14:56:04] [PASSED] X0L2 Valid modifier
[14:56:04] [PASSED] X0L2 Modifier for inexistent plane
[14:56:04] =========== [PASSED] drm_test_framebuffer_create ===========
[14:56:04] [PASSED] drm_test_framebuffer_free
[14:56:04] [PASSED] drm_test_framebuffer_init
[14:56:04] [PASSED] drm_test_framebuffer_init_bad_format
[14:56:04] [PASSED] drm_test_framebuffer_init_dev_mismatch
[14:56:04] [PASSED] drm_test_framebuffer_lookup
[14:56:04] [PASSED] drm_test_framebuffer_lookup_inexistent
[14:56:04] [PASSED] drm_test_framebuffer_modifiers_not_supported
[14:56:04] ================= [PASSED] drm_framebuffer =================
[14:56:04] ================ drm_gem_shmem (8 subtests) ================
[14:56:04] [PASSED] drm_gem_shmem_test_obj_create
[14:56:04] [PASSED] drm_gem_shmem_test_obj_create_private
[14:56:04] [PASSED] drm_gem_shmem_test_pin_pages
[14:56:04] [PASSED] drm_gem_shmem_test_vmap
[14:56:04] [PASSED] drm_gem_shmem_test_get_sg_table
[14:56:04] [PASSED] drm_gem_shmem_test_get_pages_sgt
[14:56:04] [PASSED] drm_gem_shmem_test_madvise
[14:56:04] [PASSED] drm_gem_shmem_test_purge
[14:56:04] ================== [PASSED] drm_gem_shmem ==================
[14:56:04] === drm_atomic_helper_connector_hdmi_check (27 subtests) ===
[14:56:04] [PASSED] drm_test_check_broadcast_rgb_auto_cea_mode
[14:56:04] [PASSED] drm_test_check_broadcast_rgb_auto_cea_mode_vic_1
[14:56:04] [PASSED] drm_test_check_broadcast_rgb_full_cea_mode
[14:56:04] [PASSED] drm_test_check_broadcast_rgb_full_cea_mode_vic_1
[14:56:04] [PASSED] drm_test_check_broadcast_rgb_limited_cea_mode
[14:56:04] [PASSED] drm_test_check_broadcast_rgb_limited_cea_mode_vic_1
[14:56:04] ====== drm_test_check_broadcast_rgb_cea_mode_yuv420 =======
[14:56:04] [PASSED] Automatic
[14:56:04] [PASSED] Full
[14:56:04] [PASSED] Limited 16:235
[14:56:04] == [PASSED] drm_test_check_broadcast_rgb_cea_mode_yuv420 ===
[14:56:04] [PASSED] drm_test_check_broadcast_rgb_crtc_mode_changed
[14:56:04] [PASSED] drm_test_check_broadcast_rgb_crtc_mode_not_changed
[14:56:04] [PASSED] drm_test_check_disable_connector
[14:56:04] [PASSED] drm_test_check_hdmi_funcs_reject_rate
[14:56:04] [PASSED] drm_test_check_max_tmds_rate_bpc_fallback_rgb
[14:56:04] [PASSED] drm_test_check_max_tmds_rate_bpc_fallback_yuv420
[14:56:04] [PASSED] drm_test_check_max_tmds_rate_bpc_fallback_ignore_yuv422
[14:56:04] [PASSED] drm_test_check_max_tmds_rate_bpc_fallback_ignore_yuv420
[14:56:04] [PASSED] drm_test_check_driver_unsupported_fallback_yuv420
[14:56:04] [PASSED] drm_test_check_output_bpc_crtc_mode_changed
[14:56:04] [PASSED] drm_test_check_output_bpc_crtc_mode_not_changed
[14:56:04] [PASSED] drm_test_check_output_bpc_dvi
[14:56:04] [PASSED] drm_test_check_output_bpc_format_vic_1
[14:56:04] [PASSED] drm_test_check_output_bpc_format_display_8bpc_only
[14:56:04] [PASSED] drm_test_check_output_bpc_format_display_rgb_only
[14:56:04] [PASSED] drm_test_check_output_bpc_format_driver_8bpc_only
[14:56:04] [PASSED] drm_test_check_output_bpc_format_driver_rgb_only
[14:56:04] [PASSED] drm_test_check_tmds_char_rate_rgb_8bpc
[14:56:04] [PASSED] drm_test_check_tmds_char_rate_rgb_10bpc
[14:56:04] [PASSED] drm_test_check_tmds_char_rate_rgb_12bpc
[14:56:04] ===== [PASSED] drm_atomic_helper_connector_hdmi_check ======
[14:56:04] === drm_atomic_helper_connector_hdmi_reset (6 subtests) ====
[14:56:04] [PASSED] drm_test_check_broadcast_rgb_value
[14:56:04] [PASSED] drm_test_check_bpc_8_value
[14:56:04] [PASSED] drm_test_check_bpc_10_value
[14:56:04] [PASSED] drm_test_check_bpc_12_value
[14:56:04] [PASSED] drm_test_check_format_value
[14:56:04] [PASSED] drm_test_check_tmds_char_value
[14:56:04] ===== [PASSED] drm_atomic_helper_connector_hdmi_reset ======
[14:56:04] = drm_atomic_helper_connector_hdmi_mode_valid (4 subtests) =
[14:56:04] [PASSED] drm_test_check_mode_valid
[14:56:04] [PASSED] drm_test_check_mode_valid_reject
[14:56:04] [PASSED] drm_test_check_mode_valid_reject_rate
[14:56:04] [PASSED] drm_test_check_mode_valid_reject_max_clock
[14:56:04] === [PASSED] drm_atomic_helper_connector_hdmi_mode_valid ===
[14:56:04] = drm_atomic_helper_connector_hdmi_infoframes (5 subtests) =
[14:56:04] [PASSED] drm_test_check_infoframes
[14:56:04] [PASSED] drm_test_check_reject_avi_infoframe
[14:56:04] [PASSED] drm_test_check_reject_hdr_infoframe_bpc_8
[14:56:04] [PASSED] drm_test_check_reject_hdr_infoframe_bpc_10
[14:56:04] [PASSED] drm_test_check_reject_audio_infoframe
[14:56:04] === [PASSED] drm_atomic_helper_connector_hdmi_infoframes ===
[14:56:04] ================= drm_managed (2 subtests) =================
[14:56:04] [PASSED] drm_test_managed_release_action
[14:56:04] [PASSED] drm_test_managed_run_action
[14:56:04] =================== [PASSED] drm_managed ===================
[14:56:04] =================== drm_mm (6 subtests) ====================
[14:56:04] [PASSED] drm_test_mm_init
[14:56:04] [PASSED] drm_test_mm_debug
[14:56:04] [PASSED] drm_test_mm_align32
[14:56:04] [PASSED] drm_test_mm_align64
[14:56:04] [PASSED] drm_test_mm_lowest
[14:56:04] [PASSED] drm_test_mm_highest
[14:56:04] ===================== [PASSED] drm_mm ======================
[14:56:04] ============= drm_modes_analog_tv (5 subtests) =============
[14:56:04] [PASSED] drm_test_modes_analog_tv_mono_576i
[14:56:04] [PASSED] drm_test_modes_analog_tv_ntsc_480i
[14:56:04] [PASSED] drm_test_modes_analog_tv_ntsc_480i_inlined
[14:56:04] [PASSED] drm_test_modes_analog_tv_pal_576i
[14:56:04] [PASSED] drm_test_modes_analog_tv_pal_576i_inlined
[14:56:04] =============== [PASSED] drm_modes_analog_tv ===============
[14:56:04] ============== drm_plane_helper (2 subtests) ===============
[14:56:04] =============== drm_test_check_plane_state ================
[14:56:04] [PASSED] clipping_simple
[14:56:04] [PASSED] clipping_rotate_reflect
[14:56:04] [PASSED] positioning_simple
[14:56:04] [PASSED] upscaling
[14:56:04] [PASSED] downscaling
[14:56:04] [PASSED] rounding1
[14:56:04] [PASSED] rounding2
[14:56:04] [PASSED] rounding3
[14:56:04] [PASSED] rounding4
[14:56:04] =========== [PASSED] drm_test_check_plane_state ============
[14:56:04] =========== drm_test_check_invalid_plane_state ============
[14:56:04] [PASSED] positioning_invalid
[14:56:04] [PASSED] upscaling_invalid
[14:56:04] [PASSED] downscaling_invalid
[14:56:04] ======= [PASSED] drm_test_check_invalid_plane_state ========
[14:56:04] ================ [PASSED] drm_plane_helper =================
[14:56:04] ====== drm_connector_helper_tv_get_modes (1 subtest) =======
[14:56:04] ====== drm_test_connector_helper_tv_get_modes_check =======
[14:56:04] [PASSED] None
[14:56:04] [PASSED] PAL
[14:56:04] [PASSED] NTSC
[14:56:04] [PASSED] Both, NTSC Default
[14:56:04] [PASSED] Both, PAL Default
[14:56:04] [PASSED] Both, NTSC Default, with PAL on command-line
[14:56:04] [PASSED] Both, PAL Default, with NTSC on command-line
[14:56:04] == [PASSED] drm_test_connector_helper_tv_get_modes_check ===
[14:56:04] ======== [PASSED] drm_connector_helper_tv_get_modes ========
[14:56:04] ================== drm_rect (9 subtests) ===================
[14:56:04] [PASSED] drm_test_rect_clip_scaled_div_by_zero
[14:56:04] [PASSED] drm_test_rect_clip_scaled_not_clipped
[14:56:04] [PASSED] drm_test_rect_clip_scaled_clipped
[14:56:04] [PASSED] drm_test_rect_clip_scaled_signed_vs_unsigned
[14:56:04] ================= drm_test_rect_intersect =================
[14:56:04] [PASSED] top-left x bottom-right: 2x2+1+1 x 2x2+0+0
[14:56:04] [PASSED] top-right x bottom-left: 2x2+0+0 x 2x2+1-1
[14:56:04] [PASSED] bottom-left x top-right: 2x2+1-1 x 2x2+0+0
[14:56:04] [PASSED] bottom-right x top-left: 2x2+0+0 x 2x2+1+1
[14:56:04] [PASSED] right x left: 2x1+0+0 x 3x1+1+0
[14:56:04] [PASSED] left x right: 3x1+1+0 x 2x1+0+0
[14:56:04] [PASSED] up x bottom: 1x2+0+0 x 1x3+0-1
[14:56:04] [PASSED] bottom x up: 1x3+0-1 x 1x2+0+0
[14:56:04] [PASSED] touching corner: 1x1+0+0 x 2x2+1+1
[14:56:04] [PASSED] touching side: 1x1+0+0 x 1x1+1+0
[14:56:04] [PASSED] equal rects: 2x2+0+0 x 2x2+0+0
[14:56:04] [PASSED] inside another: 2x2+0+0 x 1x1+1+1
[14:56:04] [PASSED] far away: 1x1+0+0 x 1x1+3+6
[14:56:04] [PASSED] points intersecting: 0x0+5+10 x 0x0+5+10
[14:56:04] [PASSED] points not intersecting: 0x0+0+0 x 0x0+5+10
[14:56:04] ============= [PASSED] drm_test_rect_intersect =============
[14:56:04] ================ drm_test_rect_calc_hscale ================
[14:56:04] [PASSED] normal use
[14:56:04] [PASSED] out of max range
[14:56:04] [PASSED] out of min range
[14:56:04] [PASSED] zero dst
[14:56:04] [PASSED] negative src
[14:56:04] [PASSED] negative dst
[14:56:04] ============ [PASSED] drm_test_rect_calc_hscale ============
[14:56:04] ================ drm_test_rect_calc_vscale ================
[14:56:04] [PASSED] normal use
[14:56:04] [PASSED] out of max range
[14:56:04] [PASSED] out of min range
[14:56:04] [PASSED] zero dst
[14:56:04] [PASSED] negative src
[14:56:04] [PASSED] negative dst
[14:56:04] ============ [PASSED] drm_test_rect_calc_vscale ============
[14:56:04] ================== drm_test_rect_rotate ===================
[14:56:04] [PASSED] reflect-x
[14:56:04] [PASSED] reflect-y
[14:56:04] [PASSED] rotate-0
[14:56:04] [PASSED] rotate-90
[14:56:04] [PASSED] rotate-180
[14:56:04] [PASSED] rotate-270
[14:56:04] ============== [PASSED] drm_test_rect_rotate ===============
[14:56:04] ================ drm_test_rect_rotate_inv =================
[14:56:04] [PASSED] reflect-x
[14:56:04] [PASSED] reflect-y
[14:56:04] [PASSED] rotate-0
[14:56:04] [PASSED] rotate-90
[14:56:04] [PASSED] rotate-180
[14:56:04] [PASSED] rotate-270
[14:56:04] ============ [PASSED] drm_test_rect_rotate_inv =============
[14:56:04] ==================== [PASSED] drm_rect =====================
[14:56:04] ============ drm_sysfb_modeset_test (1 subtest) ============
[14:56:04] ============ drm_test_sysfb_build_fourcc_list =============
[14:56:04] [PASSED] no native formats
[14:56:04] [PASSED] XRGB8888 as native format
[14:56:04] [PASSED] remove duplicates
[14:56:04] [PASSED] convert alpha formats
[14:56:04] [PASSED] random formats
[14:56:04] ======== [PASSED] drm_test_sysfb_build_fourcc_list =========
[14:56:04] ============= [PASSED] drm_sysfb_modeset_test ==============
[14:56:04] ================== drm_fixp (2 subtests) ===================
[14:56:04] [PASSED] drm_test_int2fixp
[14:56:04] [PASSED] drm_test_sm2fixp
[14:56:04] ==================== [PASSED] drm_fixp =====================
[14:56:04] ============================================================
[14:56:04] Testing complete. Ran 621 tests: passed: 621
[14:56:04] Elapsed time: 26.004s total, 1.762s configuring, 24.070s building, 0.140s running
+ /kernel/tools/testing/kunit/kunit.py run --kunitconfig /kernel/drivers/gpu/drm/ttm/tests/.kunitconfig
[14:56:04] Configuring KUnit Kernel ...
Regenerating .config ...
Populating config with:
$ make ARCH=um O=.kunit olddefconfig
[14:56:05] 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
[14:56:15] Starting KUnit Kernel (1/1)...
[14:56:15] ============================================================
Running tests with:
$ .kunit/linux kunit.enable=1 mem=1G console=tty kunit_shutdown=halt
[14:56:15] ================= ttm_device (5 subtests) ==================
[14:56:15] [PASSED] ttm_device_init_basic
[14:56:15] [PASSED] ttm_device_init_multiple
[14:56:15] [PASSED] ttm_device_fini_basic
[14:56:15] [PASSED] ttm_device_init_no_vma_man
[14:56:15] ================== ttm_device_init_pools ==================
[14:56:15] [PASSED] No DMA allocations, no DMA32 required
[14:56:15] [PASSED] DMA allocations, DMA32 required
[14:56:15] [PASSED] No DMA allocations, DMA32 required
[14:56:15] [PASSED] DMA allocations, no DMA32 required
[14:56:15] ============== [PASSED] ttm_device_init_pools ==============
[14:56:15] =================== [PASSED] ttm_device ====================
[14:56:15] ================== ttm_pool (8 subtests) ===================
[14:56:15] ================== ttm_pool_alloc_basic ===================
[14:56:15] [PASSED] One page
[14:56:15] [PASSED] More than one page
[14:56:15] [PASSED] Above the allocation limit
[14:56:15] [PASSED] One page, with coherent DMA mappings enabled
[14:56:15] [PASSED] Above the allocation limit, with coherent DMA mappings enabled
[14:56:15] ============== [PASSED] ttm_pool_alloc_basic ===============
[14:56:15] ============== ttm_pool_alloc_basic_dma_addr ==============
[14:56:15] [PASSED] One page
[14:56:15] [PASSED] More than one page
[14:56:15] [PASSED] Above the allocation limit
[14:56:15] [PASSED] One page, with coherent DMA mappings enabled
[14:56:15] [PASSED] Above the allocation limit, with coherent DMA mappings enabled
[14:56:15] ========== [PASSED] ttm_pool_alloc_basic_dma_addr ==========
[14:56:15] [PASSED] ttm_pool_alloc_order_caching_match
[14:56:15] [PASSED] ttm_pool_alloc_caching_mismatch
[14:56:15] [PASSED] ttm_pool_alloc_order_mismatch
[14:56:15] [PASSED] ttm_pool_free_dma_alloc
[14:56:15] [PASSED] ttm_pool_free_no_dma_alloc
[14:56:15] [PASSED] ttm_pool_fini_basic
[14:56:15] ==================== [PASSED] ttm_pool =====================
[14:56:15] ================ ttm_resource (8 subtests) =================
[14:56:15] ================= ttm_resource_init_basic =================
[14:56:15] [PASSED] Init resource in TTM_PL_SYSTEM
[14:56:15] [PASSED] Init resource in TTM_PL_VRAM
[14:56:15] [PASSED] Init resource in a private placement
[14:56:15] [PASSED] Init resource in TTM_PL_SYSTEM, set placement flags
[14:56:15] ============= [PASSED] ttm_resource_init_basic =============
[14:56:15] [PASSED] ttm_resource_init_pinned
[14:56:15] [PASSED] ttm_resource_fini_basic
[14:56:15] [PASSED] ttm_resource_manager_init_basic
[14:56:15] [PASSED] ttm_resource_manager_usage_basic
[14:56:15] [PASSED] ttm_resource_manager_set_used_basic
[14:56:15] [PASSED] ttm_sys_man_alloc_basic
[14:56:15] [PASSED] ttm_sys_man_free_basic
[14:56:15] ================== [PASSED] ttm_resource ===================
[14:56:15] =================== ttm_tt (15 subtests) ===================
[14:56:15] ==================== ttm_tt_init_basic ====================
[14:56:15] [PASSED] Page-aligned size
[14:56:15] [PASSED] Extra pages requested
[14:56:15] ================ [PASSED] ttm_tt_init_basic ================
[14:56:15] [PASSED] ttm_tt_init_misaligned
[14:56:15] [PASSED] ttm_tt_fini_basic
[14:56:15] [PASSED] ttm_tt_fini_sg
[14:56:15] [PASSED] ttm_tt_fini_shmem
[14:56:15] [PASSED] ttm_tt_create_basic
[14:56:15] [PASSED] ttm_tt_create_invalid_bo_type
[14:56:15] [PASSED] ttm_tt_create_ttm_exists
[14:56:15] [PASSED] ttm_tt_create_failed
[14:56:15] [PASSED] ttm_tt_destroy_basic
[14:56:15] [PASSED] ttm_tt_populate_null_ttm
[14:56:15] [PASSED] ttm_tt_populate_populated_ttm
[14:56:15] [PASSED] ttm_tt_unpopulate_basic
[14:56:15] [PASSED] ttm_tt_unpopulate_empty_ttm
[14:56:15] [PASSED] ttm_tt_swapin_basic
[14:56:15] ===================== [PASSED] ttm_tt ======================
[14:56:15] =================== ttm_bo (14 subtests) ===================
[14:56:15] =========== ttm_bo_reserve_optimistic_no_ticket ===========
[14:56:15] [PASSED] Cannot be interrupted and sleeps
[14:56:15] [PASSED] Cannot be interrupted, locks straight away
[14:56:15] [PASSED] Can be interrupted, sleeps
[14:56:15] ======= [PASSED] ttm_bo_reserve_optimistic_no_ticket =======
[14:56:15] [PASSED] ttm_bo_reserve_locked_no_sleep
[14:56:15] [PASSED] ttm_bo_reserve_no_wait_ticket
[14:56:15] [PASSED] ttm_bo_reserve_double_resv
[14:56:15] [PASSED] ttm_bo_reserve_interrupted
[14:56:15] [PASSED] ttm_bo_reserve_deadlock
[14:56:15] [PASSED] ttm_bo_unreserve_basic
[14:56:15] [PASSED] ttm_bo_unreserve_pinned
[14:56:15] [PASSED] ttm_bo_unreserve_bulk
[14:56:15] [PASSED] ttm_bo_fini_basic
[14:56:15] [PASSED] ttm_bo_fini_shared_resv
[14:56:15] [PASSED] ttm_bo_pin_basic
[14:56:15] [PASSED] ttm_bo_pin_unpin_resource
[14:56:15] [PASSED] ttm_bo_multiple_pin_one_unpin
[14:56:15] ===================== [PASSED] ttm_bo ======================
[14:56:15] ============== ttm_bo_validate (22 subtests) ===============
[14:56:15] ============== ttm_bo_init_reserved_sys_man ===============
[14:56:15] [PASSED] Buffer object for userspace
[14:56:15] [PASSED] Kernel buffer object
[14:56:15] [PASSED] Shared buffer object
[14:56:15] ========== [PASSED] ttm_bo_init_reserved_sys_man ===========
[14:56:15] ============== ttm_bo_init_reserved_mock_man ==============
[14:56:15] [PASSED] Buffer object for userspace
[14:56:15] [PASSED] Kernel buffer object
[14:56:15] [PASSED] Shared buffer object
[14:56:15] ========== [PASSED] ttm_bo_init_reserved_mock_man ==========
[14:56:15] [PASSED] ttm_bo_init_reserved_resv
[14:56:15] ================== ttm_bo_validate_basic ==================
[14:56:15] [PASSED] Buffer object for userspace
[14:56:15] [PASSED] Kernel buffer object
[14:56:15] [PASSED] Shared buffer object
[14:56:15] ============== [PASSED] ttm_bo_validate_basic ==============
[14:56:15] [PASSED] ttm_bo_validate_invalid_placement
[14:56:15] ============= ttm_bo_validate_same_placement ==============
[14:56:15] [PASSED] System manager
[14:56:15] [PASSED] VRAM manager
[14:56:15] ========= [PASSED] ttm_bo_validate_same_placement ==========
[14:56:15] [PASSED] ttm_bo_validate_failed_alloc
[14:56:15] [PASSED] ttm_bo_validate_pinned
[14:56:15] [PASSED] ttm_bo_validate_busy_placement
[14:56:15] ================ ttm_bo_validate_multihop =================
[14:56:15] [PASSED] Buffer object for userspace
[14:56:15] [PASSED] Kernel buffer object
[14:56:15] [PASSED] Shared buffer object
[14:56:15] ============ [PASSED] ttm_bo_validate_multihop =============
[14:56:15] ========== ttm_bo_validate_no_placement_signaled ==========
[14:56:15] [PASSED] Buffer object in system domain, no page vector
[14:56:15] [PASSED] Buffer object in system domain with an existing page vector
[14:56:15] ====== [PASSED] ttm_bo_validate_no_placement_signaled ======
[14:56:15] ======== ttm_bo_validate_no_placement_not_signaled ========
[14:56:15] [PASSED] Buffer object for userspace
[14:56:15] [PASSED] Kernel buffer object
[14:56:15] [PASSED] Shared buffer object
[14:56:15] ==== [PASSED] ttm_bo_validate_no_placement_not_signaled ====
[14:56:15] [PASSED] ttm_bo_validate_move_fence_signaled
[14:56:15] ========= ttm_bo_validate_move_fence_not_signaled =========
[14:56:15] [PASSED] Waits for GPU
[14:56:15] [PASSED] Tries to lock straight away
[14:56:15] ===== [PASSED] ttm_bo_validate_move_fence_not_signaled =====
[14:56:15] [PASSED] ttm_bo_validate_swapout
[14:56:15] [PASSED] ttm_bo_validate_happy_evict
[14:56:15] [PASSED] ttm_bo_validate_all_pinned_evict
[14:56:15] [PASSED] ttm_bo_validate_allowed_only_evict
[14:56:15] [PASSED] ttm_bo_validate_deleted_evict
[14:56:15] [PASSED] ttm_bo_validate_busy_domain_evict
[14:56:15] [PASSED] ttm_bo_validate_evict_gutting
[14:56:15] [PASSED] ttm_bo_validate_recrusive_evict
[14:56:15] ================= [PASSED] ttm_bo_validate =================
[14:56:15] ============================================================
[14:56:15] Testing complete. Ran 102 tests: passed: 102
[14:56:15] Elapsed time: 11.435s total, 1.784s configuring, 9.436s building, 0.185s running
+ cleanup
++ stat -c %u:%g /kernel
+ chown -R 1003:1003 /kernel
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH 3/4] drm/xe: Restore userspace LRC BOs early on resume
2026-05-21 14:48 ` [PATCH 3/4] drm/xe: Restore userspace LRC BOs early on resume Thomas Hellström
@ 2026-05-21 16:09 ` Matthew Auld
2026-05-21 16:31 ` Thomas Hellström
0 siblings, 1 reply; 10+ messages in thread
From: Matthew Auld @ 2026-05-21 16:09 UTC (permalink / raw)
To: Thomas Hellström, intel-xe
Cc: Matthew Brost, Francois Dugast, Rodrigo Vivi, Maarten Lankhorst
On 21/05/2026 15:48, Thomas Hellström wrote:
> When GuC registers a context (REGISTER_CONTEXT G2H action), the LRC
> buffer object must already be present in VRAM with valid content.
> Userspace LRC BOs currently carry XE_BO_FLAG_PINNED_LATE_RESTORE, which
> defers their restore to xe_bo_restore_late() — a blitter copy that runs
> after xe_gt_resume(). However, xe_gt_resume() itself calls
> xe_guc_submit_start(), which drives guc_exec_queue_start() ->
> xe_sched_resubmit_jobs() -> guc_exec_queue_run_job() ->
> register_exec_queue(), all before xe_bo_restore_late() has had a chance
> to repopulate the BO. The result is that GuC reads LRC state from
> uninitialised VRAM and raises an exception.
Hmm, thinking out aloud here, but what stops the hw executing the ring
if we can get as far as run_job() this early? Thinking about non-LR, can
we not have pending jobs that get re-submitted, before we have had a
chance to restore the bb, page-tables, other user BOs etc, since that is
maybe late restore also.
>
> Fix this by dropping XE_BO_FLAG_PINNED_LATE_RESTORE from the userspace
> LRC BO flags. Without that flag, the BO lands in the
> pinned.early.kernel_bo_present list and is restored by
> xe_bo_restore_early() via CPU/BAR copy before xe_gt_resume() is entered.
> By the time any context registration fires the LRC VRAM is valid.
>
> xe_bo_create_pin_map_novm() already adds XE_BO_FLAG_NEEDS_CPU_ACCESS and
> XE_BO_FLAG_PINNED, satisfying the requirements of the CPU copy path.
> Dropping XE_BO_FLAG_PINNED_LATE_RESTORE also makes force_contiguous()
> return true for these BOs (PINNED without LATE_RESTORE), which is already
> required for the GGTT mapping they carry.
>
> Assisted-by: GitHub_Copilot:claude-sonnet-4.6
> Signed-off-by: Thomas Hellström <thomas.hellstrom@linux.intel.com>
> ---
> drivers/gpu/drm/xe/xe_lrc.c | 2 +-
> 1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/drivers/gpu/drm/xe/xe_lrc.c b/drivers/gpu/drm/xe/xe_lrc.c
> index a4292a11391d..c9ea5a3e5365 100644
> --- a/drivers/gpu/drm/xe/xe_lrc.c
> +++ b/drivers/gpu/drm/xe/xe_lrc.c
> @@ -1661,7 +1661,7 @@ static int xe_lrc_init(struct xe_lrc *lrc, struct xe_hw_engine *hwe, struct xe_v
> XE_BO_FLAG_GGTT_INVALIDATE;
>
> if ((vm && vm->xef) || init_flags & XE_LRC_CREATE_USER_CTX) /* userspace */
> - bo_flags |= XE_BO_FLAG_PINNED_LATE_RESTORE | XE_BO_FLAG_FORCE_USER_VRAM;
> + bo_flags |= XE_BO_FLAG_FORCE_USER_VRAM;
>
> bo = xe_bo_create_pin_map_novm(xe, tile, bo_size,
> ttm_bo_type_kernel,
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH 3/4] drm/xe: Restore userspace LRC BOs early on resume
2026-05-21 16:09 ` Matthew Auld
@ 2026-05-21 16:31 ` Thomas Hellström
2026-05-22 9:51 ` Thomas Hellström
0 siblings, 1 reply; 10+ messages in thread
From: Thomas Hellström @ 2026-05-21 16:31 UTC (permalink / raw)
To: Matthew Auld, intel-xe
Cc: Matthew Brost, Francois Dugast, Rodrigo Vivi, Maarten Lankhorst
On Thu, 2026-05-21 at 17:09 +0100, Matthew Auld wrote:
> On 21/05/2026 15:48, Thomas Hellström wrote:
> > When GuC registers a context (REGISTER_CONTEXT G2H action), the LRC
> > buffer object must already be present in VRAM with valid content.
> > Userspace LRC BOs currently carry XE_BO_FLAG_PINNED_LATE_RESTORE,
> > which
> > defers their restore to xe_bo_restore_late() — a blitter copy that
> > runs
> > after xe_gt_resume(). However, xe_gt_resume() itself calls
> > xe_guc_submit_start(), which drives guc_exec_queue_start() ->
> > xe_sched_resubmit_jobs() -> guc_exec_queue_run_job() ->
> > register_exec_queue(), all before xe_bo_restore_late() has had a
> > chance
> > to repopulate the BO. The result is that GuC reads LRC state from
> > uninitialised VRAM and raises an exception.
>
> Hmm, thinking out aloud here, but what stops the hw executing the
> ring
> if we can get as far as run_job() this early? Thinking about non-LR,
> can
> we not have pending jobs that get re-submitted, before we have had a
> chance to restore the bb, page-tables, other user BOs etc, since that
> is
> maybe late restore also.
Good point. Need to look at that.
/Thomas
>
> >
> > Fix this by dropping XE_BO_FLAG_PINNED_LATE_RESTORE from the
> > userspace
> > LRC BO flags. Without that flag, the BO lands in the
> > pinned.early.kernel_bo_present list and is restored by
> > xe_bo_restore_early() via CPU/BAR copy before xe_gt_resume() is
> > entered.
> > By the time any context registration fires the LRC VRAM is valid.
> >
> > xe_bo_create_pin_map_novm() already adds
> > XE_BO_FLAG_NEEDS_CPU_ACCESS and
> > XE_BO_FLAG_PINNED, satisfying the requirements of the CPU copy
> > path.
> > Dropping XE_BO_FLAG_PINNED_LATE_RESTORE also makes
> > force_contiguous()
> > return true for these BOs (PINNED without LATE_RESTORE), which is
> > already
> > required for the GGTT mapping they carry.
> >
> > Assisted-by: GitHub_Copilot:claude-sonnet-4.6
> > Signed-off-by: Thomas Hellström <thomas.hellstrom@linux.intel.com>
> > ---
> > drivers/gpu/drm/xe/xe_lrc.c | 2 +-
> > 1 file changed, 1 insertion(+), 1 deletion(-)
> >
> > diff --git a/drivers/gpu/drm/xe/xe_lrc.c
> > b/drivers/gpu/drm/xe/xe_lrc.c
> > index a4292a11391d..c9ea5a3e5365 100644
> > --- a/drivers/gpu/drm/xe/xe_lrc.c
> > +++ b/drivers/gpu/drm/xe/xe_lrc.c
> > @@ -1661,7 +1661,7 @@ static int xe_lrc_init(struct xe_lrc *lrc,
> > struct xe_hw_engine *hwe, struct xe_v
> > XE_BO_FLAG_GGTT_INVALIDATE;
> >
> > if ((vm && vm->xef) || init_flags &
> > XE_LRC_CREATE_USER_CTX) /* userspace */
> > - bo_flags |= XE_BO_FLAG_PINNED_LATE_RESTORE |
> > XE_BO_FLAG_FORCE_USER_VRAM;
> > + bo_flags |= XE_BO_FLAG_FORCE_USER_VRAM;
> >
> > bo = xe_bo_create_pin_map_novm(xe, tile, bo_size,
> > ttm_bo_type_kernel,
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH 3/4] drm/xe: Restore userspace LRC BOs early on resume
2026-05-21 16:31 ` Thomas Hellström
@ 2026-05-22 9:51 ` Thomas Hellström
2026-05-22 10:05 ` Matthew Auld
0 siblings, 1 reply; 10+ messages in thread
From: Thomas Hellström @ 2026-05-22 9:51 UTC (permalink / raw)
To: Matthew Auld, intel-xe
Cc: Matthew Brost, Francois Dugast, Rodrigo Vivi, Maarten Lankhorst
On Thu, 2026-05-21 at 18:31 +0200, Thomas Hellström wrote:
> On Thu, 2026-05-21 at 17:09 +0100, Matthew Auld wrote:
> > On 21/05/2026 15:48, Thomas Hellström wrote:
> > > When GuC registers a context (REGISTER_CONTEXT G2H action), the
> > > LRC
> > > buffer object must already be present in VRAM with valid content.
> > > Userspace LRC BOs currently carry XE_BO_FLAG_PINNED_LATE_RESTORE,
> > > which
> > > defers their restore to xe_bo_restore_late() — a blitter copy
> > > that
> > > runs
> > > after xe_gt_resume(). However, xe_gt_resume() itself calls
> > > xe_guc_submit_start(), which drives guc_exec_queue_start() ->
> > > xe_sched_resubmit_jobs() -> guc_exec_queue_run_job() ->
> > > register_exec_queue(), all before xe_bo_restore_late() has had a
> > > chance
> > > to repopulate the BO. The result is that GuC reads LRC state
> > > from
> > > uninitialised VRAM and raises an exception.
> >
> > Hmm, thinking out aloud here, but what stops the hw executing the
> > ring
> > if we can get as far as run_job() this early? Thinking about non-
> > LR,
> > can
> > we not have pending jobs that get re-submitted, before we have had
> > a
> > chance to restore the bb, page-tables, other user BOs etc, since
> > that
> > is
> > maybe late restore also.
>
> Good point. Need to look at that.
That's actually the case. I figure this might be hit if we use VRAM
page-tables for system BOs.
That case would potentially be fatal for preempt-fence mode as well,
I'll have to respin the fault mode patch to unconditionally suspend the
preempt-fence exec-queues, since with that case we might not see
eviction and hence no preempt-fences firing.
To me a decent fix would be to split up gt resume into two separate
steps. One registers migrate exec-queues and activates migrate
schedulers. Second does the same for user-space.
/Thomas
>
> /Thomas
>
> >
> > >
> > > Fix this by dropping XE_BO_FLAG_PINNED_LATE_RESTORE from the
> > > userspace
> > > LRC BO flags. Without that flag, the BO lands in the
> > > pinned.early.kernel_bo_present list and is restored by
> > > xe_bo_restore_early() via CPU/BAR copy before xe_gt_resume() is
> > > entered.
> > > By the time any context registration fires the LRC VRAM is valid.
> > >
> > > xe_bo_create_pin_map_novm() already adds
> > > XE_BO_FLAG_NEEDS_CPU_ACCESS and
> > > XE_BO_FLAG_PINNED, satisfying the requirements of the CPU copy
> > > path.
> > > Dropping XE_BO_FLAG_PINNED_LATE_RESTORE also makes
> > > force_contiguous()
> > > return true for these BOs (PINNED without LATE_RESTORE), which is
> > > already
> > > required for the GGTT mapping they carry.
> > >
> > > Assisted-by: GitHub_Copilot:claude-sonnet-4.6
> > > Signed-off-by: Thomas Hellström
> > > <thomas.hellstrom@linux.intel.com>
> > > ---
> > > drivers/gpu/drm/xe/xe_lrc.c | 2 +-
> > > 1 file changed, 1 insertion(+), 1 deletion(-)
> > >
> > > diff --git a/drivers/gpu/drm/xe/xe_lrc.c
> > > b/drivers/gpu/drm/xe/xe_lrc.c
> > > index a4292a11391d..c9ea5a3e5365 100644
> > > --- a/drivers/gpu/drm/xe/xe_lrc.c
> > > +++ b/drivers/gpu/drm/xe/xe_lrc.c
> > > @@ -1661,7 +1661,7 @@ static int xe_lrc_init(struct xe_lrc *lrc,
> > > struct xe_hw_engine *hwe, struct xe_v
> > > XE_BO_FLAG_GGTT_INVALIDATE;
> > >
> > > if ((vm && vm->xef) || init_flags &
> > > XE_LRC_CREATE_USER_CTX) /* userspace */
> > > - bo_flags |= XE_BO_FLAG_PINNED_LATE_RESTORE |
> > > XE_BO_FLAG_FORCE_USER_VRAM;
> > > + bo_flags |= XE_BO_FLAG_FORCE_USER_VRAM;
> > >
> > > bo = xe_bo_create_pin_map_novm(xe, tile, bo_size,
> > > ttm_bo_type_kernel,
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH 3/4] drm/xe: Restore userspace LRC BOs early on resume
2026-05-22 9:51 ` Thomas Hellström
@ 2026-05-22 10:05 ` Matthew Auld
0 siblings, 0 replies; 10+ messages in thread
From: Matthew Auld @ 2026-05-22 10:05 UTC (permalink / raw)
To: Thomas Hellström, intel-xe
Cc: Matthew Brost, Francois Dugast, Rodrigo Vivi, Maarten Lankhorst
On 22/05/2026 10:51, Thomas Hellström wrote:
> On Thu, 2026-05-21 at 18:31 +0200, Thomas Hellström wrote:
>> On Thu, 2026-05-21 at 17:09 +0100, Matthew Auld wrote:
>>> On 21/05/2026 15:48, Thomas Hellström wrote:
>>>> When GuC registers a context (REGISTER_CONTEXT G2H action), the
>>>> LRC
>>>> buffer object must already be present in VRAM with valid content.
>>>> Userspace LRC BOs currently carry XE_BO_FLAG_PINNED_LATE_RESTORE,
>>>> which
>>>> defers their restore to xe_bo_restore_late() — a blitter copy
>>>> that
>>>> runs
>>>> after xe_gt_resume(). However, xe_gt_resume() itself calls
>>>> xe_guc_submit_start(), which drives guc_exec_queue_start() ->
>>>> xe_sched_resubmit_jobs() -> guc_exec_queue_run_job() ->
>>>> register_exec_queue(), all before xe_bo_restore_late() has had a
>>>> chance
>>>> to repopulate the BO. The result is that GuC reads LRC state
>>>> from
>>>> uninitialised VRAM and raises an exception.
>>>
>>> Hmm, thinking out aloud here, but what stops the hw executing the
>>> ring
>>> if we can get as far as run_job() this early? Thinking about non-
>>> LR,
>>> can
>>> we not have pending jobs that get re-submitted, before we have had
>>> a
>>> chance to restore the bb, page-tables, other user BOs etc, since
>>> that
>>> is
>>> maybe late restore also.
>>
>> Good point. Need to look at that.
>
> That's actually the case. I figure this might be hit if we use VRAM
> page-tables for system BOs.
>
> That case would potentially be fatal for preempt-fence mode as well,
> I'll have to respin the fault mode patch to unconditionally suspend the
> preempt-fence exec-queues, since with that case we might not see
> eviction and hence no preempt-fences firing.
>
> To me a decent fix would be to split up gt resume into two separate
> steps. One registers migrate exec-queues and activates migrate
> schedulers. Second does the same for user-space.
Yeah, fully agreed. I was also thinking the same here.
>
> /Thomas
>
>>
>> /Thomas
>>
>>>
>>>>
>>>> Fix this by dropping XE_BO_FLAG_PINNED_LATE_RESTORE from the
>>>> userspace
>>>> LRC BO flags. Without that flag, the BO lands in the
>>>> pinned.early.kernel_bo_present list and is restored by
>>>> xe_bo_restore_early() via CPU/BAR copy before xe_gt_resume() is
>>>> entered.
>>>> By the time any context registration fires the LRC VRAM is valid.
>>>>
>>>> xe_bo_create_pin_map_novm() already adds
>>>> XE_BO_FLAG_NEEDS_CPU_ACCESS and
>>>> XE_BO_FLAG_PINNED, satisfying the requirements of the CPU copy
>>>> path.
>>>> Dropping XE_BO_FLAG_PINNED_LATE_RESTORE also makes
>>>> force_contiguous()
>>>> return true for these BOs (PINNED without LATE_RESTORE), which is
>>>> already
>>>> required for the GGTT mapping they carry.
>>>>
>>>> Assisted-by: GitHub_Copilot:claude-sonnet-4.6
>>>> Signed-off-by: Thomas Hellström
>>>> <thomas.hellstrom@linux.intel.com>
>>>> ---
>>>> drivers/gpu/drm/xe/xe_lrc.c | 2 +-
>>>> 1 file changed, 1 insertion(+), 1 deletion(-)
>>>>
>>>> diff --git a/drivers/gpu/drm/xe/xe_lrc.c
>>>> b/drivers/gpu/drm/xe/xe_lrc.c
>>>> index a4292a11391d..c9ea5a3e5365 100644
>>>> --- a/drivers/gpu/drm/xe/xe_lrc.c
>>>> +++ b/drivers/gpu/drm/xe/xe_lrc.c
>>>> @@ -1661,7 +1661,7 @@ static int xe_lrc_init(struct xe_lrc *lrc,
>>>> struct xe_hw_engine *hwe, struct xe_v
>>>> XE_BO_FLAG_GGTT_INVALIDATE;
>>>>
>>>> if ((vm && vm->xef) || init_flags &
>>>> XE_LRC_CREATE_USER_CTX) /* userspace */
>>>> - bo_flags |= XE_BO_FLAG_PINNED_LATE_RESTORE |
>>>> XE_BO_FLAG_FORCE_USER_VRAM;
>>>> + bo_flags |= XE_BO_FLAG_FORCE_USER_VRAM;
>>>>
>>>> bo = xe_bo_create_pin_map_novm(xe, tile, bo_size,
>>>> ttm_bo_type_kernel,
^ permalink raw reply [flat|nested] 10+ messages in thread
end of thread, other threads:[~2026-05-22 10:05 UTC | newest]
Thread overview: 10+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-05-21 14:48 [PATCH 0/4] drm/xe: Fix LR exec queue suspend/resume for S3/S4 Thomas Hellström
2026-05-21 14:48 ` [PATCH 1/4] drm/xe/guc: Add suspend refcount to exec queue ops Thomas Hellström
2026-05-21 14:48 ` [PATCH 2/4] drm/xe/guc: Don't ban LR VM exec queues on PM suspend Thomas Hellström
2026-05-21 14:48 ` [PATCH 3/4] drm/xe: Restore userspace LRC BOs early on resume Thomas Hellström
2026-05-21 16:09 ` Matthew Auld
2026-05-21 16:31 ` Thomas Hellström
2026-05-22 9:51 ` Thomas Hellström
2026-05-22 10:05 ` Matthew Auld
2026-05-21 14:48 ` [PATCH 4/4] drm/xe: Suspend fault-mode LR jobs before VRAM eviction on S3/S4 Thomas Hellström
2026-05-21 14:56 ` ✓ CI.KUnit: success for drm/xe: Fix LR exec queue suspend/resume for S3/S4 Patchwork
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox