All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 3/3] drm/xe/ggtt: invalidate engine GGTT TLBs for multi-queue GTs
  2026-08-21  7:42 [PATCH 0/3] drm/xe/ggtt: fix stale GGTT mappings on unmap tilak.tirumalesh.tangudu
@ 2026-08-21  7:42 ` tilak.tirumalesh.tangudu
  2026-08-21  7:56   ` sashiko-bot
  2026-08-24  0:56   ` Niranjana Vishwanathapura
  0 siblings, 2 replies; 17+ messages in thread
From: tilak.tirumalesh.tangudu @ 2026-08-21  7:42 UTC (permalink / raw)
  To: tilak.tirumalesh.tangudu, niranjana.vishwanathapura,
	matthew.brost, intel-xe

From: Tangudu Tilak Tirumalesh <tilak.tirumalesh.tangudu@intel.com>

Engines cache GGTT translations in their own TLBs, which the
xe_tlb_inval_ggtt() does not touch.
After a GGTT unmap the engines can still hit the stale translation and
read the old page.

Issue a FULL_INTRA_VF invalidation on GGTT unmap, gated on the GT
having any multi-queue engine class.

Assisted-by: Claude:claude-opus-4-8
Signed-off-by: Tangudu Tilak Tirumalesh <tilak.tirumalesh.tangudu@intel.com>
---
 drivers/gpu/drm/xe/xe_ggtt.c | 23 ++++++++++++++++++++++-
 1 file changed, 22 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/xe/xe_ggtt.c b/drivers/gpu/drm/xe/xe_ggtt.c
index 3564345fd740..60eb9a3d29cc 100644
--- a/drivers/gpu/drm/xe/xe_ggtt.c
+++ b/drivers/gpu/drm/xe/xe_ggtt.c
@@ -458,6 +458,7 @@ int xe_ggtt_init_early(struct xe_ggtt *ggtt)
 ALLOW_ERROR_INJECTION(xe_ggtt_init_early, ERRNO); /* See xe_pci_probe() */
 
 static void xe_ggtt_invalidate(struct xe_ggtt *ggtt);
+static void xe_ggtt_invalidate_engine(struct xe_ggtt *ggtt);
 
 static void xe_ggtt_initial_clear(struct xe_ggtt *ggtt)
 {
@@ -493,8 +494,11 @@ static void ggtt_node_remove(struct xe_ggtt_node *node)
 			      xe_ggtt_node_size(node), use_scratch);
 	drm_mm_remove_node(&node->base);
 	node->base.size = 0;
-	if (bound && node->invalidate_on_remove)
+	if (bound && node->invalidate_on_remove) {
 		xe_ggtt_invalidate(ggtt);
+		/* Drain engine TLBs so a recycled range can't hit a stale entry. */
+		xe_ggtt_invalidate_engine(ggtt);
+	}
 	mutex_unlock(&ggtt->lock);
 
 	ggtt_node_fini(node);
@@ -603,6 +607,23 @@ static void xe_ggtt_invalidate(struct xe_ggtt *ggtt)
 	ggtt_invalidate_gt_tlb(ggtt->tile->media_gt);
 }
 
+/*
+ * Drain engine-side GGTT TLBs on teardown so a recycled range's next
+ * occupant can't hit a predecessor's cached translation.
+ */
+static void xe_ggtt_invalidate_engine(struct xe_ggtt *ggtt)
+{
+	struct xe_gt *gt = ggtt->tile->primary_gt;
+	int err;
+
+	if (!gt || !gt->info.multi_queue_engine_class_mask)
+		return;
+
+	err = xe_tlb_inval_ggtt_full(&gt->tlb_inval);
+	xe_gt_WARN(gt, err, "Failed to invalidate engine GGTT TLBs (%pe)",
+		   ERR_PTR(err));
+}
+
 /**
  * xe_ggtt_shift_nodes() - Shift GGTT nodes to adjust for a change in usable address range.
  * @ggtt: the &xe_ggtt struct instance
-- 
2.46.0


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

* Re: [PATCH 3/3] drm/xe/ggtt: invalidate engine GGTT TLBs for multi-queue GTs
  2026-08-21  7:42 ` [PATCH 3/3] drm/xe/ggtt: invalidate engine GGTT TLBs for multi-queue GTs tilak.tirumalesh.tangudu
@ 2026-08-21  7:56   ` sashiko-bot
  2026-08-24  0:56   ` Niranjana Vishwanathapura
  1 sibling, 0 replies; 17+ messages in thread
From: sashiko-bot @ 2026-08-21  7:56 UTC (permalink / raw)
  To: tilak.tirumalesh.tangudu; +Cc: intel-xe

Thank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider:
- [High] Engine TLB invalidation is incorrectly gated on a mutable software configuration flag, leading to stale TLBs and memory corruption when multi-queue scheduling is disabled.
--

--- Patch [3]: [PATCH 3/3] drm/xe/ggtt: invalidate engine GGTT TLBs for multi-queue GTs ---
commit 1bb3febf0df767bbdf46eda5e034dfd13af1e727
Author: Tangudu Tilak Tirumalesh <tilak.tirumalesh.tangudu@intel.com>

drm/xe/ggtt: invalidate engine GGTT TLBs for multi-queue GTs

This commit introduces an engine TLB invalidation on GGTT unmap to ensure
that engines do not hit stale cached translations after the memory is freed.
The invalidation logic is gated on the GT having a multi-queue engine
class mask enabled.

> diff --git a/drivers/gpu/drm/xe/xe_ggtt.c b/drivers/gpu/drm/xe/xe_ggtt.c
> index 3564345fd7403..60eb9a3d29cc2 100644
> --- a/drivers/gpu/drm/xe/xe_ggtt.c
> +++ b/drivers/gpu/drm/xe/xe_ggtt.c

[ ... ]

> @@ -603,6 +607,23 @@ static void xe_ggtt_invalidate(struct xe_ggtt *ggtt)
>  	ggtt_invalidate_gt_tlb(ggtt->tile->media_gt);
>  }
>  
> +/*
> + * Drain engine-side GGTT TLBs on teardown so a recycled range's next
> + * occupant can't hit a predecessor's cached translation.
> + */
> +static void xe_ggtt_invalidate_engine(struct xe_ggtt *ggtt)
> +{
> +	struct xe_gt *gt = ggtt->tile->primary_gt;
> +	int err;
> +
> +	if (!gt || !gt->info.multi_queue_engine_class_mask)
> +		return;

[Severity: High]
Does this skip necessary hardware invalidation if the multi-queue scheduling
feature is disabled in software?

If a privileged user disables the multi-queue feature via configfs,
gt->info.multi_queue_engine_class_mask is cleared to 0. However, the hardware
physical capability of having independent engine TLBs does not disappear when
this software feature is disabled.

When the mask is cleared, xe_ggtt_invalidate_engine() will silently skip
the engine TLB invalidation on GGTT unmap, leaving the independent engine
TLBs unflushed and potentially causing data corruption or a use-after-free
when a recycled range is accessed. (Also note that in ggtt_node_remove(),
the unmap path falls back to writing a scratch PTE when this mask is 0,
which does not prevent engines from using their still-valid, stale TLB
entries.)

Should this check use an immutable hardware capability flag instead of the
active software configuration mask?

> +
> +	err = xe_tlb_inval_ggtt_full(&gt->tlb_inval);
> +	xe_gt_WARN(gt, err, "Failed to invalidate engine GGTT TLBs (%pe)",
> +		   ERR_PTR(err));
> +}

-- 
Sashiko AI review · https://sashiko.dev/#/patchset/20260821074238.3000501-1-tilak.tirumalesh.tangudu@intel.com?part=3

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

* Re: [PATCH 3/3] drm/xe/ggtt: invalidate engine GGTT TLBs for multi-queue GTs
  2026-08-21  7:42 ` [PATCH 3/3] drm/xe/ggtt: invalidate engine GGTT TLBs for multi-queue GTs tilak.tirumalesh.tangudu
  2026-08-21  7:56   ` sashiko-bot
@ 2026-08-24  0:56   ` Niranjana Vishwanathapura
  1 sibling, 0 replies; 17+ messages in thread
From: Niranjana Vishwanathapura @ 2026-08-24  0:56 UTC (permalink / raw)
  To: tilak.tirumalesh.tangudu; +Cc: matthew.brost, intel-xe

On Fri, Aug 21, 2026 at 01:12:38PM +0530, tilak.tirumalesh.tangudu@intel.com wrote:
>From: Tangudu Tilak Tirumalesh <tilak.tirumalesh.tangudu@intel.com>
>
>Engines cache GGTT translations in their own TLBs, which the
>xe_tlb_inval_ggtt() does not touch.
>After a GGTT unmap the engines can still hit the stale translation and
>read the old page.
>
>Issue a FULL_INTRA_VF invalidation on GGTT unmap, gated on the GT
>having any multi-queue engine class.

NIT...probably good to keep the name consistent.
"Issue a INVAL_FULL (intra vf) invalidation...."?

>
>Assisted-by: Claude:claude-opus-4-8
>Signed-off-by: Tangudu Tilak Tirumalesh <tilak.tirumalesh.tangudu@intel.com>
>---
> drivers/gpu/drm/xe/xe_ggtt.c | 23 ++++++++++++++++++++++-
> 1 file changed, 22 insertions(+), 1 deletion(-)
>
>diff --git a/drivers/gpu/drm/xe/xe_ggtt.c b/drivers/gpu/drm/xe/xe_ggtt.c
>index 3564345fd740..60eb9a3d29cc 100644
>--- a/drivers/gpu/drm/xe/xe_ggtt.c
>+++ b/drivers/gpu/drm/xe/xe_ggtt.c
>@@ -458,6 +458,7 @@ int xe_ggtt_init_early(struct xe_ggtt *ggtt)
> ALLOW_ERROR_INJECTION(xe_ggtt_init_early, ERRNO); /* See xe_pci_probe() */
>
> static void xe_ggtt_invalidate(struct xe_ggtt *ggtt);
>+static void xe_ggtt_invalidate_engine(struct xe_ggtt *ggtt);
>
> static void xe_ggtt_initial_clear(struct xe_ggtt *ggtt)
> {
>@@ -493,8 +494,11 @@ static void ggtt_node_remove(struct xe_ggtt_node *node)
> 			      xe_ggtt_node_size(node), use_scratch);
> 	drm_mm_remove_node(&node->base);
> 	node->base.size = 0;
>-	if (bound && node->invalidate_on_remove)
>+	if (bound && node->invalidate_on_remove) {
> 		xe_ggtt_invalidate(ggtt);
>+		/* Drain engine TLBs so a recycled range can't hit a stale entry. */
>+		xe_ggtt_invalidate_engine(ggtt);
>+	}
> 	mutex_unlock(&ggtt->lock);
>
> 	ggtt_node_fini(node);
>@@ -603,6 +607,23 @@ static void xe_ggtt_invalidate(struct xe_ggtt *ggtt)
> 	ggtt_invalidate_gt_tlb(ggtt->tile->media_gt);
> }
>
>+/*
>+ * Drain engine-side GGTT TLBs on teardown so a recycled range's next
>+ * occupant can't hit a predecessor's cached translation.
>+ */
>+static void xe_ggtt_invalidate_engine(struct xe_ggtt *ggtt)
>+{
>+	struct xe_gt *gt = ggtt->tile->primary_gt;
>+	int err;
>+
>+	if (!gt || !gt->info.multi_queue_engine_class_mask)
>+		return;
>+

As mentioned in other patch, probably good to abstract this into a
separate function with proper name and comment.

Niranjana

>+	err = xe_tlb_inval_ggtt_full(&gt->tlb_inval);
>+	xe_gt_WARN(gt, err, "Failed to invalidate engine GGTT TLBs (%pe)",
>+		   ERR_PTR(err));
>+}
>+
> /**
>  * xe_ggtt_shift_nodes() - Shift GGTT nodes to adjust for a change in usable address range.
>  * @ggtt: the &xe_ggtt struct instance
>-- 
>2.46.0
>

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

* [PATCH 0/3] drm/xe/ggtt: fix stale GGTT mappings on unmap
@ 2026-08-24 16:34 tilak.tirumalesh.tangudu
  2026-08-24 16:34 ` [PATCH 1/3] drm/xe/ggtt: stop mapping unmapped GGTT pages to scratch tilak.tirumalesh.tangudu
                   ` (4 more replies)
  0 siblings, 5 replies; 17+ messages in thread
From: tilak.tirumalesh.tangudu @ 2026-08-24 16:34 UTC (permalink / raw)
  To: tilak.tirumalesh.tangudu, niranjana.vishwanathapura,
	matthew.brost, intel-xe

From: Tangudu Tilak Tirumalesh <tilak.tirumalesh.tangudu@intel.com>

This series addresses two related GGTT teardown issues on multi-
queue platforms:

First issue: the unmap path mapped freed ranges to the scratch page.
Because scratch is a valid PTE, a re-walk of a freed range never
faults, so any stale TLB translation left behind is masked - the freed
range silently reads scratch instead of surfacing the problem. On
multi-queue platforms Patch 1 writes PTE=0 on unmap instead; other
platforms keep scratch, so free-hole and init-time handling are
unchanged.

Second issue: engines cache GGTT translations in their own TLBs. The
existing GGTT invalidation (xe_tlb_inval_ggtt()) does not reach those
engine-side TLBs, so after an unmap an engine can keep hitting the
stale translation and read the old page. Patches 2 and 3 add and use a
FULL_INTRA_VF invalidation to drain the engine TLBs on unmap.

Patch 1: drm/xe/ggtt: stop mapping unmapped GGTT pages to scratch
    On multi-queue platforms write PTE=0 on unmap so a stale-TLB
    access to a freed range faults instead of silently landing on
    scratch.

Patch 2: drm/xe/tlb_inval: add FULL_INTRA_VF GGTT invalidation helper
    xe_tlb_inval_ggtt_full() + GuC backend flush engine TLBs across
    all engines in the requesting VF partition.

Patch 3: drm/xe/ggtt: invalidate engine GGTT TLBs for multi-queue GTs
    Issue the FULL_INTRA_VF invalidation on the unmap path, gated on
    the GT having any multi-queue engine class. Draining the engine
    TLB on teardown guarantees a recycled range's next occupant cannot
    hit the predecessor's cached translation.

v2: Add xe_gt_has_multi_queue() helper and refactor.
    Add xe_tlb_inval_issue_op_wait and refactor.
    Other knits.

Tangudu Tilak Tirumalesh (3):
  drm/xe/ggtt: stop mapping unmapped GGTT pages to scratch
  drm/xe/tlb_inval: add xe_tlb_inval_ggtt_full() GGTT invalidation
    helper
  drm/xe/ggtt: invalidate engine GGTT TLBs for multi-queue GTs

 drivers/gpu/drm/xe/xe_ggtt.c            | 70 ++++++++++++++++++++-----
 drivers/gpu/drm/xe/xe_gt.h              | 13 +++++
 drivers/gpu/drm/xe/xe_guc_tlb_inval.c   | 21 ++++++++
 drivers/gpu/drm/xe/xe_tlb_inval.c       | 42 ++++++++++++---
 drivers/gpu/drm/xe/xe_tlb_inval.h       |  1 +
 drivers/gpu/drm/xe/xe_tlb_inval_types.h | 10 ++++
 6 files changed, 137 insertions(+), 20 deletions(-)

-- 
2.46.0


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

* [PATCH 1/3] drm/xe/ggtt: stop mapping unmapped GGTT pages to scratch
  2026-08-24 16:34 [PATCH 0/3] drm/xe/ggtt: fix stale GGTT mappings on unmap tilak.tirumalesh.tangudu
@ 2026-08-24 16:34 ` tilak.tirumalesh.tangudu
  2026-08-24 16:46   ` sashiko-bot
  2026-08-24 18:17   ` Niranjana Vishwanathapura
  2026-08-24 16:34 ` [PATCH 2/3] drm/xe/tlb_inval: add xe_tlb_inval_ggtt_full() GGTT invalidation helper tilak.tirumalesh.tangudu
                   ` (3 subsequent siblings)
  4 siblings, 2 replies; 17+ messages in thread
From: tilak.tirumalesh.tangudu @ 2026-08-24 16:34 UTC (permalink / raw)
  To: tilak.tirumalesh.tangudu, niranjana.vishwanathapura,
	matthew.brost, intel-xe

From: Tangudu Tilak Tirumalesh <tilak.tirumalesh.tangudu@intel.com>

xe_ggtt_clear() wrote a scratch PTE across the range for both
initial_clear() and the node_remove() unmap path.

On unmap the scratch PTE hides stale-TLB gaps: after the range is
invalidated a re-walk lands on the still-valid scratch PTE, so a stale
engine TLB translation for the freed range never faults and the
invalidation gap stays invisible.

Add an explicit use_scratch bool. initial_clear() keeps writing scratch.
On multi-queue platforms, where engines cache GGTT independently,
node_remove() writes PTE=0 so a stale translation to a freed range
faults and the gap becomes observable; other platforms keep scratch.

v2: Add xe_gt_has_multi_queue() helper and other knits-Niranjana

Assisted-by: Claude:claude-opus-4-8
Signed-off-by: Tangudu Tilak Tirumalesh <tilak.tirumalesh.tangudu@intel.com>
---
 drivers/gpu/drm/xe/xe_ggtt.c | 47 ++++++++++++++++++++++++++----------
 drivers/gpu/drm/xe/xe_gt.h   | 13 ++++++++++
 2 files changed, 47 insertions(+), 13 deletions(-)

diff --git a/drivers/gpu/drm/xe/xe_ggtt.c b/drivers/gpu/drm/xe/xe_ggtt.c
index 8ec23862477f..4cddd69f0e99 100644
--- a/drivers/gpu/drm/xe/xe_ggtt.c
+++ b/drivers/gpu/drm/xe/xe_ggtt.c
@@ -20,6 +20,7 @@
 #include "regs/xe_regs.h"
 #include "xe_assert.h"
 #include "xe_bo.h"
+#include "xe_gt.h"
 #include "xe_gt_printk.h"
 #include "xe_gt_types.h"
 #include "xe_map.h"
@@ -257,23 +258,36 @@ static u64 xe_ggtt_get_pte(struct xe_ggtt *ggtt, u64 addr)
 	return readq(&ggtt->gsm[addr >> XE_PTE_SHIFT]);
 }
 
-static void xe_ggtt_clear(struct xe_ggtt *ggtt, u64 start, u64 size)
+/**
+ * xe_ggtt_clear() - Clear a range of GGTT page-table entries
+ * @ggtt: the &xe_ggtt to clear
+ * @start: start of the range (GGTT address)
+ * @size: size of the range in bytes
+ * @use_scratch: true fills the range with the scratch PTE (init-time clear so
+ *		 engines walking free holes read zeros safely); false writes
+ *		 PTE=0 so a stale HW TLB entry faults instead of silently
+ *		 landing on scratch.
+ */
+static void xe_ggtt_clear(struct xe_ggtt *ggtt, u64 start, u64 size,
+			  bool use_scratch)
 {
-	u16 pat_index = xe_cache_pat_idx(tile_to_xe(ggtt->tile), XE_CACHE_WB);
 	u64 end = start + size - 1;
-	u64 scratch_pte;
+	u64 pte;
 
 	xe_tile_assert(ggtt->tile, start < end);
 
-	if (ggtt->scratch)
-		scratch_pte = xe_bo_addr(ggtt->scratch, 0, XE_PAGE_SIZE) |
-			      ggtt->pt_ops->pte_encode_flags(ggtt->scratch,
-							     pat_index);
-	else
-		scratch_pte = 0;
+	if (use_scratch && ggtt->scratch) {
+		u16 pat_index = xe_cache_pat_idx(tile_to_xe(ggtt->tile),
+						 XE_CACHE_WB);
+
+		pte = xe_bo_addr(ggtt->scratch, 0, XE_PAGE_SIZE) |
+		      ggtt->pt_ops->pte_encode_flags(ggtt->scratch, pat_index);
+	} else {
+		pte = 0;
+	}
 
 	while (start < end) {
-		ggtt->pt_ops->ggtt_set_pte(ggtt, start, scratch_pte);
+		ggtt->pt_ops->ggtt_set_pte(ggtt, start, pte);
 		start += XE_PAGE_SIZE;
 	}
 }
@@ -459,7 +473,7 @@ static void xe_ggtt_initial_clear(struct xe_ggtt *ggtt)
 	/* Display may have allocated inside ggtt, so be careful with clearing here */
 	mutex_lock(&ggtt->lock);
 	drm_mm_for_each_hole(hole, &ggtt->mm, start, end)
-		xe_ggtt_clear(ggtt, ggtt->start + start, end - start);
+		xe_ggtt_clear(ggtt, ggtt->start + start, end - start, true);
 
 	xe_ggtt_invalidate(ggtt);
 	mutex_unlock(&ggtt->lock);
@@ -473,12 +487,19 @@ static void ggtt_node_fini(struct xe_ggtt_node *node)
 static void ggtt_node_remove(struct xe_ggtt_node *node)
 {
 	struct xe_ggtt *ggtt = node->ggtt;
-	bool bound;
+	bool use_scratch, bound;
+
+	/*
+	 * Addition of a secondary queue while a multi-queue context is live on
+	 * HW requires proper GGTT TLB clearing, so use faulting PTEs here.
+	 */
+	use_scratch = !xe_gt_has_multi_queue(ggtt->tile->primary_gt);
 
 	mutex_lock(&ggtt->lock);
 	bound = ggtt->flags & XE_GGTT_FLAGS_ONLINE;
 	if (bound)
-		xe_ggtt_clear(ggtt, xe_ggtt_node_addr(node), xe_ggtt_node_size(node));
+		xe_ggtt_clear(ggtt, xe_ggtt_node_addr(node),
+			      xe_ggtt_node_size(node), use_scratch);
 	drm_mm_remove_node(&node->base);
 	node->base.size = 0;
 	if (bound && node->invalidate_on_remove)
diff --git a/drivers/gpu/drm/xe/xe_gt.h b/drivers/gpu/drm/xe/xe_gt.h
index 65a4655b0994..92d934d50244 100644
--- a/drivers/gpu/drm/xe/xe_gt.h
+++ b/drivers/gpu/drm/xe/xe_gt.h
@@ -160,4 +160,17 @@ static inline bool xe_gt_supports_multi_queue(const struct xe_gt *gt,
 	return gt->info.multi_queue_engine_class_mask & BIT(class);
 }
 
+/**
+ * xe_gt_has_multi_queue() - Check if gt supports multi-queue on
+ * any engine class.
+ *
+ * @gt: the GT object (may be NULL)
+ *
+ * Return: true if any engine class on @gt supports multi queue, else false
+ */
+static inline bool xe_gt_has_multi_queue(const struct xe_gt *gt)
+{
+	return gt && gt->info.multi_queue_engine_class_mask;
+}
+
 #endif
-- 
2.46.0


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

* [PATCH 2/3] drm/xe/tlb_inval: add xe_tlb_inval_ggtt_full() GGTT invalidation helper
  2026-08-24 16:34 [PATCH 0/3] drm/xe/ggtt: fix stale GGTT mappings on unmap tilak.tirumalesh.tangudu
  2026-08-24 16:34 ` [PATCH 1/3] drm/xe/ggtt: stop mapping unmapped GGTT pages to scratch tilak.tirumalesh.tangudu
@ 2026-08-24 16:34 ` tilak.tirumalesh.tangudu
  2026-08-24 18:20   ` Niranjana Vishwanathapura
  2026-08-25 18:08   ` Matthew Brost
  2026-08-24 16:34 ` [PATCH 3/3] drm/xe/ggtt: invalidate engine GGTT TLBs for multi-queue GTs tilak.tirumalesh.tangudu
                   ` (2 subsequent siblings)
  4 siblings, 2 replies; 17+ messages in thread
From: tilak.tirumalesh.tangudu @ 2026-08-24 16:34 UTC (permalink / raw)
  To: tilak.tirumalesh.tangudu, niranjana.vishwanathapura,
	matthew.brost, intel-xe

From: Tangudu Tilak Tirumalesh <tilak.tirumalesh.tangudu@intel.com>

Add xe_tlb_inval_ggtt_full() and its GuC backend
send_tlb_inval_ggtt_full() for full engine TLB invalidation
within the requesting VF across all engines.

v2: Refactor with new helper xe_tlb_inval_issue_op_wait()
    and other knits. -Niranjana

Assisted-by: Claude:claude-opus-4-8
Signed-off-by: Tangudu Tilak Tirumalesh <tilak.tirumalesh.tangudu@intel.com>
---
 drivers/gpu/drm/xe/xe_guc_tlb_inval.c   | 21 +++++++++++++
 drivers/gpu/drm/xe/xe_tlb_inval.c       | 42 +++++++++++++++++++++----
 drivers/gpu/drm/xe/xe_tlb_inval.h       |  1 +
 drivers/gpu/drm/xe/xe_tlb_inval_types.h | 10 ++++++
 4 files changed, 68 insertions(+), 6 deletions(-)

diff --git a/drivers/gpu/drm/xe/xe_guc_tlb_inval.c b/drivers/gpu/drm/xe/xe_guc_tlb_inval.c
index 046d0655122f..08dc2ee4cbff 100644
--- a/drivers/gpu/drm/xe/xe_guc_tlb_inval.c
+++ b/drivers/gpu/drm/xe/xe_guc_tlb_inval.c
@@ -98,6 +98,25 @@ static int send_tlb_inval_ggtt(struct xe_tlb_inval *tlb_inval, u32 seqno)
 	return -ECANCELED;
 }
 
+/*
+ * Emit INVAL_FULL (intra vf) to invalidate engine TLBs across all engines
+ * within the VF.
+ */
+static int send_tlb_inval_ggtt_full(struct xe_tlb_inval *tlb_inval, u32 seqno)
+{
+	struct xe_guc *guc = tlb_inval->private;
+	u32 action[] = {
+		XE_GUC_ACTION_TLB_INVALIDATION,
+		seqno,
+		MAKE_INVAL_OP(XE_GUC_TLB_INVAL_FULL),
+	};
+
+	if (!xe_guc_ct_enabled(&guc->ct) || !guc->submission_state.enabled)
+		return -ECANCELED;
+
+	return send_tlb_inval(guc, action, ARRAY_SIZE(action));
+}
+
 static int send_page_reclaim(struct xe_guc *guc, u32 seqno,
 			     u64 gpu_addr)
 {
@@ -346,6 +365,7 @@ static long tlb_inval_timeout_delay(struct xe_tlb_inval *tlb_inval)
 static const struct xe_tlb_inval_ops guc_tlb_inval_asid_ops = {
 	.all = send_tlb_inval_all,
 	.ggtt = send_tlb_inval_ggtt,
+	.ggtt_full = send_tlb_inval_ggtt_full,
 	.ppgtt = send_tlb_inval_asid_ppgtt,
 	.initialized = tlb_inval_initialized,
 	.flush = tlb_inval_flush,
@@ -354,6 +374,7 @@ static const struct xe_tlb_inval_ops guc_tlb_inval_asid_ops = {
 
 static const struct xe_tlb_inval_ops guc_tlb_inval_ctx_ops = {
 	.ggtt = send_tlb_inval_ggtt,
+	.ggtt_full = send_tlb_inval_ggtt_full,
 	.all = send_tlb_inval_all,
 	.ppgtt = send_tlb_inval_ctx_ppgtt,
 	.initialized = tlb_inval_initialized,
diff --git a/drivers/gpu/drm/xe/xe_tlb_inval.c b/drivers/gpu/drm/xe/xe_tlb_inval.c
index bbd21d393062..7c3bf32d9258 100644
--- a/drivers/gpu/drm/xe/xe_tlb_inval.c
+++ b/drivers/gpu/drm/xe/xe_tlb_inval.c
@@ -301,26 +301,56 @@ int xe_tlb_inval_all(struct xe_tlb_inval *tlb_inval,
 }
 
 /**
- * xe_tlb_inval_ggtt() - Issue a TLB invalidation for the GGTT
+ * xe_tlb_inval_issue_op_wait() - Issue a TLB invalidation and wait
  * @tlb_inval: TLB invalidation client
- *
- * Issue a TLB invalidation for the GGTT. Completion of TLB is asynchronous and
- * caller can use the invalidation fence to wait for completion.
+ * @op: backend invalidation hook to issue
  *
  * Return: 0 on success, negative error code on error
  */
-int xe_tlb_inval_ggtt(struct xe_tlb_inval *tlb_inval)
+static int xe_tlb_inval_issue_op_wait(struct xe_tlb_inval *tlb_inval,
+				      int (*op)(struct xe_tlb_inval *tlb_inval, u32 seqno))
 {
 	struct xe_tlb_inval_fence fence, *fence_ptr = &fence;
 	int ret;
 
 	xe_tlb_inval_fence_init(tlb_inval, fence_ptr, true);
-	ret = xe_tlb_inval_issue(tlb_inval, fence_ptr, tlb_inval->ops->ggtt);
+	ret = xe_tlb_inval_issue(tlb_inval, fence_ptr, op);
 	xe_tlb_inval_fence_wait(fence_ptr);
 
 	return ret;
 }
 
+/**
+ * xe_tlb_inval_ggtt() - Issue a TLB invalidation for the GGTT
+ * @tlb_inval: TLB invalidation client
+ *
+ * Issue a TLB invalidation for the GGTT. Completion of TLB is asynchronous and
+ * caller can use the invalidation fence to wait for completion.
+ *
+ * Return: 0 on success, negative error code on error
+ */
+int xe_tlb_inval_ggtt(struct xe_tlb_inval *tlb_inval)
+{
+	return xe_tlb_inval_issue_op_wait(tlb_inval, tlb_inval->ops->ggtt);
+}
+
+/**
+ * xe_tlb_inval_ggtt_full() - Full engine TLB invalidation within a VF
+ * @tlb_inval: TLB invalidation client
+ *
+ * Issue INVAL_FULL (intra vf) to flush engine TLBs across all engines
+ * within the requesting VF.
+ *
+ * Return: 0 on success, negative error code on error
+ */
+int xe_tlb_inval_ggtt_full(struct xe_tlb_inval *tlb_inval)
+{
+	if (!tlb_inval->ops->ggtt_full)
+		return -EOPNOTSUPP;
+
+	return xe_tlb_inval_issue_op_wait(tlb_inval, tlb_inval->ops->ggtt_full);
+}
+
 /**
  * xe_tlb_inval_range() - Issue a TLB invalidation for an address range
  * @tlb_inval: TLB invalidation client
diff --git a/drivers/gpu/drm/xe/xe_tlb_inval.h b/drivers/gpu/drm/xe/xe_tlb_inval.h
index a76b7823a5f2..665072b4b81d 100644
--- a/drivers/gpu/drm/xe/xe_tlb_inval.h
+++ b/drivers/gpu/drm/xe/xe_tlb_inval.h
@@ -20,6 +20,7 @@ void xe_tlb_inval_reset(struct xe_tlb_inval *tlb_inval);
 int xe_tlb_inval_all(struct xe_tlb_inval *tlb_inval,
 		     struct xe_tlb_inval_fence *fence);
 int xe_tlb_inval_ggtt(struct xe_tlb_inval *tlb_inval);
+int xe_tlb_inval_ggtt_full(struct xe_tlb_inval *tlb_inval);
 void xe_tlb_inval_vm(struct xe_tlb_inval *tlb_inval, struct xe_vm *vm);
 int xe_tlb_inval_range(struct xe_tlb_inval *tlb_inval,
 		       struct xe_tlb_inval_fence *fence,
diff --git a/drivers/gpu/drm/xe/xe_tlb_inval_types.h b/drivers/gpu/drm/xe/xe_tlb_inval_types.h
index 3d1797d186fd..d77be1aedc91 100644
--- a/drivers/gpu/drm/xe/xe_tlb_inval_types.h
+++ b/drivers/gpu/drm/xe/xe_tlb_inval_types.h
@@ -36,6 +36,16 @@ struct xe_tlb_inval_ops {
 	 */
 	int (*ggtt)(struct xe_tlb_inval *tlb_inval, u32 seqno);
 
+	/**
+	 * @ggtt_full: Full engine TLB invalidation within a VF
+	 * @tlb_inval: TLB invalidation client
+	 * @seqno: Seqno of TLB invalidation
+	 *
+	 * Return 0 on success, -ECANCELED if backend is mid-reset, error on
+	 * failure
+	 */
+	int (*ggtt_full)(struct xe_tlb_inval *tlb_inval, u32 seqno);
+
 	/**
 	 * @ppgtt: Invalidate per-process translation TLBs
 	 * @tlb_inval: TLB invalidation client
-- 
2.46.0


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

* [PATCH 3/3] drm/xe/ggtt: invalidate engine GGTT TLBs for multi-queue GTs
  2026-08-24 16:34 [PATCH 0/3] drm/xe/ggtt: fix stale GGTT mappings on unmap tilak.tirumalesh.tangudu
  2026-08-24 16:34 ` [PATCH 1/3] drm/xe/ggtt: stop mapping unmapped GGTT pages to scratch tilak.tirumalesh.tangudu
  2026-08-24 16:34 ` [PATCH 2/3] drm/xe/tlb_inval: add xe_tlb_inval_ggtt_full() GGTT invalidation helper tilak.tirumalesh.tangudu
@ 2026-08-24 16:34 ` tilak.tirumalesh.tangudu
  2026-08-24 16:48   ` sashiko-bot
                     ` (2 more replies)
  2026-08-24 20:44 ` ✓ CI.KUnit: success for drm/xe/ggtt: fix stale GGTT mappings on unmap (rev2) Patchwork
  2026-08-24 21:24 ` ✓ Xe.CI.BAT: " Patchwork
  4 siblings, 3 replies; 17+ messages in thread
From: tilak.tirumalesh.tangudu @ 2026-08-24 16:34 UTC (permalink / raw)
  To: tilak.tirumalesh.tangudu, niranjana.vishwanathapura,
	matthew.brost, intel-xe

From: Tangudu Tilak Tirumalesh <tilak.tirumalesh.tangudu@intel.com>

Engines cache GGTT translations in their own TLBs, which the
xe_tlb_inval_ggtt() does not touch.
After a GGTT unmap the engines can still hit the stale translation and
read the old page.

Issue an INVAL_FULL (intra vf) invalidation on GGTT unmap, gated on the
GT having any multi-queue engine class.

v2: Use xe_gt_has_multi_queue() helper and other knits. - Niranjana

Assisted-by: Claude:claude-opus-4-8
Signed-off-by: Tangudu Tilak Tirumalesh <tilak.tirumalesh.tangudu@intel.com>
---
 drivers/gpu/drm/xe/xe_ggtt.c | 23 ++++++++++++++++++++++-
 1 file changed, 22 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/xe/xe_ggtt.c b/drivers/gpu/drm/xe/xe_ggtt.c
index 4cddd69f0e99..0f8946fddbaa 100644
--- a/drivers/gpu/drm/xe/xe_ggtt.c
+++ b/drivers/gpu/drm/xe/xe_ggtt.c
@@ -464,6 +464,7 @@ int xe_ggtt_init_early(struct xe_ggtt *ggtt)
 ALLOW_ERROR_INJECTION(xe_ggtt_init_early, ERRNO); /* See xe_pci_probe() */
 
 static void xe_ggtt_invalidate(struct xe_ggtt *ggtt);
+static void xe_ggtt_invalidate_engine(struct xe_ggtt *ggtt);
 
 static void xe_ggtt_initial_clear(struct xe_ggtt *ggtt)
 {
@@ -502,8 +503,11 @@ static void ggtt_node_remove(struct xe_ggtt_node *node)
 			      xe_ggtt_node_size(node), use_scratch);
 	drm_mm_remove_node(&node->base);
 	node->base.size = 0;
-	if (bound && node->invalidate_on_remove)
+	if (bound && node->invalidate_on_remove) {
 		xe_ggtt_invalidate(ggtt);
+		/* Drain engine TLBs so a recycled range can't hit a stale entry. */
+		xe_ggtt_invalidate_engine(ggtt);
+	}
 	mutex_unlock(&ggtt->lock);
 
 	ggtt_node_fini(node);
@@ -612,6 +616,23 @@ static void xe_ggtt_invalidate(struct xe_ggtt *ggtt)
 	ggtt_invalidate_gt_tlb(ggtt->tile->media_gt);
 }
 
+/*
+ * Drain engine-side GGTT TLBs on teardown so a recycled range's next
+ * occupant can't hit a predecessor's cached translation.
+ */
+static void xe_ggtt_invalidate_engine(struct xe_ggtt *ggtt)
+{
+	struct xe_gt *gt = ggtt->tile->primary_gt;
+	int err;
+
+	if (!xe_gt_has_multi_queue(gt))
+		return;
+
+	err = xe_tlb_inval_ggtt_full(&gt->tlb_inval);
+	xe_gt_WARN(gt, err, "Failed to invalidate engine GGTT TLBs (%pe)",
+		   ERR_PTR(err));
+}
+
 /**
  * xe_ggtt_shift_nodes() - Shift GGTT nodes to adjust for a change in usable address range.
  * @ggtt: the &xe_ggtt struct instance
-- 
2.46.0


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

* Re: [PATCH 1/3] drm/xe/ggtt: stop mapping unmapped GGTT pages to scratch
  2026-08-24 16:34 ` [PATCH 1/3] drm/xe/ggtt: stop mapping unmapped GGTT pages to scratch tilak.tirumalesh.tangudu
@ 2026-08-24 16:46   ` sashiko-bot
  2026-08-24 18:17   ` Niranjana Vishwanathapura
  1 sibling, 0 replies; 17+ messages in thread
From: sashiko-bot @ 2026-08-24 16:46 UTC (permalink / raw)
  To: tilak.tirumalesh.tangudu; +Cc: intel-xe

Thank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider:
- [High] Writing faulting PTEs for recycled holes but scratch PTEs for virgin holes causes non-deterministic spurious hardware faults depending on memory allocation history.
--

--- Patch [1]: [PATCH 1/3] drm/xe/ggtt: stop mapping unmapped GGTT pages to scratch ---
commit 240e3aa087f4e7c9c8232bdeba69ae3fe654d294
Author: Tangudu Tilak Tirumalesh <tilak.tirumalesh.tangudu@intel.com>

drm/xe/ggtt: stop mapping unmapped GGTT pages to scratch

This commit updates xe_ggtt_clear() to take a use_scratch parameter, leaving
the init-time clear to use scratch PTEs while forcing PTE=0 during node 
removal on multi-queue platforms. This aims to expose stale hardware TLB 
entries as observable faults.

> diff --git a/drivers/gpu/drm/xe/xe_ggtt.c b/drivers/gpu/drm/xe/xe_ggtt.c
> index 8ec23862477fc..4cddd69f0e992 100644
> --- a/drivers/gpu/drm/xe/xe_ggtt.c
> +++ b/drivers/gpu/drm/xe/xe_ggtt.c

[ ... ]

> @@ -257,23 +258,36 @@ static u64 xe_ggtt_get_pte(struct xe_ggtt *ggtt, u64 addr)
>  	return readq(&ggtt->gsm[addr >> XE_PTE_SHIFT]);
>  }
>  
> -static void xe_ggtt_clear(struct xe_ggtt *ggtt, u64 start, u64 size)
> +/**
> + * xe_ggtt_clear() - Clear a range of GGTT page-table entries
> + * @ggtt: the &xe_ggtt to clear
> + * @start: start of the range (GGTT address)
> + * @size: size of the range in bytes
> + * @use_scratch: true fills the range with the scratch PTE (init-time clear so
> + *		 engines walking free holes read zeros safely); false writes
> + *		 PTE=0 so a stale HW TLB entry faults instead of silently
> + *		 landing on scratch.
> + */

[Severity: High]
Does this explanation imply that hardware prefetchers speculatively walk
into unmapped ranges?

If engines legitimately walk free holes (as stated here for the init-time
clear), the hardware prefetcher cannot distinguish between virgin holes and
recycled holes.

[ ... ]

> @@ -473,12 +487,19 @@ static void ggtt_node_fini(struct xe_ggtt_node *node)
>  static void ggtt_node_remove(struct xe_ggtt_node *node)
>  {
>  	struct xe_ggtt *ggtt = node->ggtt;
> -	bool bound;
> +	bool use_scratch, bound;
> +
> +	/*
> +	 * Addition of a secondary queue while a multi-queue context is live on
> +	 * HW requires proper GGTT TLB clearing, so use faulting PTEs here.
> +	 */
> +	use_scratch = !xe_gt_has_multi_queue(ggtt->tile->primary_gt);
>  
>  	mutex_lock(&ggtt->lock);
>  	bound = ggtt->flags & XE_GGTT_FLAGS_ONLINE;
>  	if (bound)
> -		xe_ggtt_clear(ggtt, xe_ggtt_node_addr(node), xe_ggtt_node_size(node));
> +		xe_ggtt_clear(ggtt, xe_ggtt_node_addr(node),
> +			      xe_ggtt_node_size(node), use_scratch);

[Severity: High]
Can writing PTE=0 here cause spurious GPU or IOMMU page faults on
multi-queue platforms?

Since a prefetching engine might speculatively read past its buffer boundary
into an adjacent recycled hole, stripping the scratch PTE protection for
recycled memory while keeping it for virgin memory creates a situation
where faults depend entirely on memory allocation history.

Could this lead to engine hangs or system instability when a prefetching
engine hits the PTE=0 in a recently freed node?

-- 
Sashiko AI review · https://sashiko.dev/#/patchset/20260824163458.3129935-1-tilak.tirumalesh.tangudu@intel.com?part=1

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

* Re: [PATCH 3/3] drm/xe/ggtt: invalidate engine GGTT TLBs for multi-queue GTs
  2026-08-24 16:34 ` [PATCH 3/3] drm/xe/ggtt: invalidate engine GGTT TLBs for multi-queue GTs tilak.tirumalesh.tangudu
@ 2026-08-24 16:48   ` sashiko-bot
  2026-08-24 18:25   ` Niranjana Vishwanathapura
  2026-08-25 18:21   ` Matthew Brost
  2 siblings, 0 replies; 17+ messages in thread
From: sashiko-bot @ 2026-08-24 16:48 UTC (permalink / raw)
  To: tilak.tirumalesh.tangudu; +Cc: intel-xe

Thank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider:
- [Medium] The newly introduced `xe_ggtt_invalidate_engine()` function hardcodes the primary GT for TLB invalidation, ignoring the media GT, which shares the same GGTT.
--

--- Patch [3]: [PATCH 3/3] drm/xe/ggtt: invalidate engine GGTT TLBs for multi-queue GTs ---
commit 167c9e87bd932fe22844ce91a7963cf6e1898546
Author: Tangudu Tilak Tirumalesh <tilak.tirumalesh.tangudu@intel.com>

drm/xe/ggtt: invalidate engine GGTT TLBs for multi-queue GTs

This commit adds engine-side GGTT TLB invalidation during GGTT unmap
operations to ensure engines don't hit stale translations. The invalidation
is only issued if the GT has multi-queue engine classes.

> diff --git a/drivers/gpu/drm/xe/xe_ggtt.c b/drivers/gpu/drm/xe/xe_ggtt.c
> index 4cddd69f0e992..0f8946fddbaad 100644
> --- a/drivers/gpu/drm/xe/xe_ggtt.c
> +++ b/drivers/gpu/drm/xe/xe_ggtt.c

[ ... ]

> @@ -612,6 +616,23 @@ static void xe_ggtt_invalidate(struct xe_ggtt *ggtt)
>  	ggtt_invalidate_gt_tlb(ggtt->tile->media_gt);
>  }
>  
> +/*
> + * Drain engine-side GGTT TLBs on teardown so a recycled range's next
> + * occupant can't hit a predecessor's cached translation.
> + */
> +static void xe_ggtt_invalidate_engine(struct xe_ggtt *ggtt)
> +{
> +	struct xe_gt *gt = ggtt->tile->primary_gt;

[Severity: Medium]
Will this miss invalidating the engine TLBs on the media GT? 

If the media GT has multi-queue engine classes, hardcoding primary_gt here
seems like it would skip the media engines entirely, even though the GGTT
is shared across the entire tile. For comparison, xe_ggtt_invalidate() just
above invalidates both the primary and media GTs.

> +	int err;
> +
> +	if (!xe_gt_has_multi_queue(gt))
> +		return;
> +
> +	err = xe_tlb_inval_ggtt_full(&gt->tlb_inval);
> +	xe_gt_WARN(gt, err, "Failed to invalidate engine GGTT TLBs (%pe)",
> +		   ERR_PTR(err));
> +}

-- 
Sashiko AI review · https://sashiko.dev/#/patchset/20260824163458.3129935-1-tilak.tirumalesh.tangudu@intel.com?part=3

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

* Re: [PATCH 1/3] drm/xe/ggtt: stop mapping unmapped GGTT pages to scratch
  2026-08-24 16:34 ` [PATCH 1/3] drm/xe/ggtt: stop mapping unmapped GGTT pages to scratch tilak.tirumalesh.tangudu
  2026-08-24 16:46   ` sashiko-bot
@ 2026-08-24 18:17   ` Niranjana Vishwanathapura
  2026-08-25 17:53     ` Matthew Brost
  1 sibling, 1 reply; 17+ messages in thread
From: Niranjana Vishwanathapura @ 2026-08-24 18:17 UTC (permalink / raw)
  To: tilak.tirumalesh.tangudu; +Cc: matthew.brost, intel-xe

On Mon, Aug 24, 2026 at 10:04:56PM +0530, tilak.tirumalesh.tangudu@intel.com wrote:
>From: Tangudu Tilak Tirumalesh <tilak.tirumalesh.tangudu@intel.com>
>
>xe_ggtt_clear() wrote a scratch PTE across the range for both
>initial_clear() and the node_remove() unmap path.
>
>On unmap the scratch PTE hides stale-TLB gaps: after the range is
>invalidated a re-walk lands on the still-valid scratch PTE, so a stale
>engine TLB translation for the freed range never faults and the
>invalidation gap stays invisible.
>
>Add an explicit use_scratch bool. initial_clear() keeps writing scratch.
>On multi-queue platforms, where engines cache GGTT independently,
>node_remove() writes PTE=0 so a stale translation to a freed range
>faults and the gap becomes observable; other platforms keep scratch.
>
>v2: Add xe_gt_has_multi_queue() helper and other knits-Niranjana
>
>Assisted-by: Claude:claude-opus-4-8
>Signed-off-by: Tangudu Tilak Tirumalesh <tilak.tirumalesh.tangudu@intel.com>
>---
> drivers/gpu/drm/xe/xe_ggtt.c | 47 ++++++++++++++++++++++++++----------
> drivers/gpu/drm/xe/xe_gt.h   | 13 ++++++++++
> 2 files changed, 47 insertions(+), 13 deletions(-)
>
>diff --git a/drivers/gpu/drm/xe/xe_ggtt.c b/drivers/gpu/drm/xe/xe_ggtt.c
>index 8ec23862477f..4cddd69f0e99 100644
>--- a/drivers/gpu/drm/xe/xe_ggtt.c
>+++ b/drivers/gpu/drm/xe/xe_ggtt.c
>@@ -20,6 +20,7 @@
> #include "regs/xe_regs.h"
> #include "xe_assert.h"
> #include "xe_bo.h"
>+#include "xe_gt.h"
> #include "xe_gt_printk.h"
> #include "xe_gt_types.h"
> #include "xe_map.h"
>@@ -257,23 +258,36 @@ static u64 xe_ggtt_get_pte(struct xe_ggtt *ggtt, u64 addr)
> 	return readq(&ggtt->gsm[addr >> XE_PTE_SHIFT]);
> }
>
>-static void xe_ggtt_clear(struct xe_ggtt *ggtt, u64 start, u64 size)
>+/**
>+ * xe_ggtt_clear() - Clear a range of GGTT page-table entries
>+ * @ggtt: the &xe_ggtt to clear
>+ * @start: start of the range (GGTT address)
>+ * @size: size of the range in bytes
>+ * @use_scratch: true fills the range with the scratch PTE (init-time clear so
>+ *		 engines walking free holes read zeros safely); false writes
>+ *		 PTE=0 so a stale HW TLB entry faults instead of silently
>+ *		 landing on scratch.
>+ */

NIT...Kernel-doc not really needed for static functions. General comment section
should be good. I prefer keeping it simple with general comment, but leaving it
as is is fine too.

In any case,
Reviewed-by: Niranjana Vishwanathapura <niranjana.vishwanathapura@intel.com>

>+static void xe_ggtt_clear(struct xe_ggtt *ggtt, u64 start, u64 size,
>+			  bool use_scratch)
> {
>-	u16 pat_index = xe_cache_pat_idx(tile_to_xe(ggtt->tile), XE_CACHE_WB);
> 	u64 end = start + size - 1;
>-	u64 scratch_pte;
>+	u64 pte;
>
> 	xe_tile_assert(ggtt->tile, start < end);
>
>-	if (ggtt->scratch)
>-		scratch_pte = xe_bo_addr(ggtt->scratch, 0, XE_PAGE_SIZE) |
>-			      ggtt->pt_ops->pte_encode_flags(ggtt->scratch,
>-							     pat_index);
>-	else
>-		scratch_pte = 0;
>+	if (use_scratch && ggtt->scratch) {
>+		u16 pat_index = xe_cache_pat_idx(tile_to_xe(ggtt->tile),
>+						 XE_CACHE_WB);
>+
>+		pte = xe_bo_addr(ggtt->scratch, 0, XE_PAGE_SIZE) |
>+		      ggtt->pt_ops->pte_encode_flags(ggtt->scratch, pat_index);
>+	} else {
>+		pte = 0;
>+	}
>
> 	while (start < end) {
>-		ggtt->pt_ops->ggtt_set_pte(ggtt, start, scratch_pte);
>+		ggtt->pt_ops->ggtt_set_pte(ggtt, start, pte);
> 		start += XE_PAGE_SIZE;
> 	}
> }
>@@ -459,7 +473,7 @@ static void xe_ggtt_initial_clear(struct xe_ggtt *ggtt)
> 	/* Display may have allocated inside ggtt, so be careful with clearing here */
> 	mutex_lock(&ggtt->lock);
> 	drm_mm_for_each_hole(hole, &ggtt->mm, start, end)
>-		xe_ggtt_clear(ggtt, ggtt->start + start, end - start);
>+		xe_ggtt_clear(ggtt, ggtt->start + start, end - start, true);
>
> 	xe_ggtt_invalidate(ggtt);
> 	mutex_unlock(&ggtt->lock);
>@@ -473,12 +487,19 @@ static void ggtt_node_fini(struct xe_ggtt_node *node)
> static void ggtt_node_remove(struct xe_ggtt_node *node)
> {
> 	struct xe_ggtt *ggtt = node->ggtt;
>-	bool bound;
>+	bool use_scratch, bound;
>+
>+	/*
>+	 * Addition of a secondary queue while a multi-queue context is live on
>+	 * HW requires proper GGTT TLB clearing, so use faulting PTEs here.
>+	 */
>+	use_scratch = !xe_gt_has_multi_queue(ggtt->tile->primary_gt);
>
> 	mutex_lock(&ggtt->lock);
> 	bound = ggtt->flags & XE_GGTT_FLAGS_ONLINE;
> 	if (bound)
>-		xe_ggtt_clear(ggtt, xe_ggtt_node_addr(node), xe_ggtt_node_size(node));
>+		xe_ggtt_clear(ggtt, xe_ggtt_node_addr(node),
>+			      xe_ggtt_node_size(node), use_scratch);
> 	drm_mm_remove_node(&node->base);
> 	node->base.size = 0;
> 	if (bound && node->invalidate_on_remove)
>diff --git a/drivers/gpu/drm/xe/xe_gt.h b/drivers/gpu/drm/xe/xe_gt.h
>index 65a4655b0994..92d934d50244 100644
>--- a/drivers/gpu/drm/xe/xe_gt.h
>+++ b/drivers/gpu/drm/xe/xe_gt.h
>@@ -160,4 +160,17 @@ static inline bool xe_gt_supports_multi_queue(const struct xe_gt *gt,
> 	return gt->info.multi_queue_engine_class_mask & BIT(class);
> }
>
>+/**
>+ * xe_gt_has_multi_queue() - Check if gt supports multi-queue on
>+ * any engine class.
>+ *
>+ * @gt: the GT object (may be NULL)
>+ *
>+ * Return: true if any engine class on @gt supports multi queue, else false
>+ */
>+static inline bool xe_gt_has_multi_queue(const struct xe_gt *gt)
>+{
>+	return gt && gt->info.multi_queue_engine_class_mask;
>+}
>+
> #endif
>-- 
>2.46.0
>

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

* Re: [PATCH 2/3] drm/xe/tlb_inval: add xe_tlb_inval_ggtt_full() GGTT invalidation helper
  2026-08-24 16:34 ` [PATCH 2/3] drm/xe/tlb_inval: add xe_tlb_inval_ggtt_full() GGTT invalidation helper tilak.tirumalesh.tangudu
@ 2026-08-24 18:20   ` Niranjana Vishwanathapura
  2026-08-25 18:08   ` Matthew Brost
  1 sibling, 0 replies; 17+ messages in thread
From: Niranjana Vishwanathapura @ 2026-08-24 18:20 UTC (permalink / raw)
  To: tilak.tirumalesh.tangudu; +Cc: matthew.brost, intel-xe

On Mon, Aug 24, 2026 at 10:04:57PM +0530, tilak.tirumalesh.tangudu@intel.com wrote:
>From: Tangudu Tilak Tirumalesh <tilak.tirumalesh.tangudu@intel.com>
>
>Add xe_tlb_inval_ggtt_full() and its GuC backend
>send_tlb_inval_ggtt_full() for full engine TLB invalidation
>within the requesting VF across all engines.
>
>v2: Refactor with new helper xe_tlb_inval_issue_op_wait()
>    and other knits. -Niranjana
>
>Assisted-by: Claude:claude-opus-4-8
>Signed-off-by: Tangudu Tilak Tirumalesh <tilak.tirumalesh.tangudu@intel.com>
>---
> drivers/gpu/drm/xe/xe_guc_tlb_inval.c   | 21 +++++++++++++
> drivers/gpu/drm/xe/xe_tlb_inval.c       | 42 +++++++++++++++++++++----
> drivers/gpu/drm/xe/xe_tlb_inval.h       |  1 +
> drivers/gpu/drm/xe/xe_tlb_inval_types.h | 10 ++++++
> 4 files changed, 68 insertions(+), 6 deletions(-)
>
>diff --git a/drivers/gpu/drm/xe/xe_guc_tlb_inval.c b/drivers/gpu/drm/xe/xe_guc_tlb_inval.c
>index 046d0655122f..08dc2ee4cbff 100644
>--- a/drivers/gpu/drm/xe/xe_guc_tlb_inval.c
>+++ b/drivers/gpu/drm/xe/xe_guc_tlb_inval.c
>@@ -98,6 +98,25 @@ static int send_tlb_inval_ggtt(struct xe_tlb_inval *tlb_inval, u32 seqno)
> 	return -ECANCELED;
> }
>
>+/*
>+ * Emit INVAL_FULL (intra vf) to invalidate engine TLBs across all engines
>+ * within the VF.
>+ */
>+static int send_tlb_inval_ggtt_full(struct xe_tlb_inval *tlb_inval, u32 seqno)
>+{
>+	struct xe_guc *guc = tlb_inval->private;
>+	u32 action[] = {
>+		XE_GUC_ACTION_TLB_INVALIDATION,
>+		seqno,
>+		MAKE_INVAL_OP(XE_GUC_TLB_INVAL_FULL),
>+	};
>+
>+	if (!xe_guc_ct_enabled(&guc->ct) || !guc->submission_state.enabled)
>+		return -ECANCELED;
>+
>+	return send_tlb_inval(guc, action, ARRAY_SIZE(action));
>+}
>+
> static int send_page_reclaim(struct xe_guc *guc, u32 seqno,
> 			     u64 gpu_addr)
> {
>@@ -346,6 +365,7 @@ static long tlb_inval_timeout_delay(struct xe_tlb_inval *tlb_inval)
> static const struct xe_tlb_inval_ops guc_tlb_inval_asid_ops = {
> 	.all = send_tlb_inval_all,
> 	.ggtt = send_tlb_inval_ggtt,
>+	.ggtt_full = send_tlb_inval_ggtt_full,
> 	.ppgtt = send_tlb_inval_asid_ppgtt,
> 	.initialized = tlb_inval_initialized,
> 	.flush = tlb_inval_flush,
>@@ -354,6 +374,7 @@ static const struct xe_tlb_inval_ops guc_tlb_inval_asid_ops = {
>
> static const struct xe_tlb_inval_ops guc_tlb_inval_ctx_ops = {
> 	.ggtt = send_tlb_inval_ggtt,
>+	.ggtt_full = send_tlb_inval_ggtt_full,
> 	.all = send_tlb_inval_all,
> 	.ppgtt = send_tlb_inval_ctx_ppgtt,
> 	.initialized = tlb_inval_initialized,
>diff --git a/drivers/gpu/drm/xe/xe_tlb_inval.c b/drivers/gpu/drm/xe/xe_tlb_inval.c
>index bbd21d393062..7c3bf32d9258 100644
>--- a/drivers/gpu/drm/xe/xe_tlb_inval.c
>+++ b/drivers/gpu/drm/xe/xe_tlb_inval.c
>@@ -301,26 +301,56 @@ int xe_tlb_inval_all(struct xe_tlb_inval *tlb_inval,
> }
>
> /**
>- * xe_tlb_inval_ggtt() - Issue a TLB invalidation for the GGTT
>+ * xe_tlb_inval_issue_op_wait() - Issue a TLB invalidation and wait
>  * @tlb_inval: TLB invalidation client
>- *
>- * Issue a TLB invalidation for the GGTT. Completion of TLB is asynchronous and
>- * caller can use the invalidation fence to wait for completion.
>+ * @op: backend invalidation hook to issue
>  *
>  * Return: 0 on success, negative error code on error
>  */

Kernel-doc not really required for static functions, general comment (or no comment)
would do.

Anycase, LGTM.
Reviewed-by: Niranjana Vishwanathapura <niranjana.vishwanathapura@intel.com>

>-int xe_tlb_inval_ggtt(struct xe_tlb_inval *tlb_inval)
>+static int xe_tlb_inval_issue_op_wait(struct xe_tlb_inval *tlb_inval,
>+				      int (*op)(struct xe_tlb_inval *tlb_inval, u32 seqno))
> {
> 	struct xe_tlb_inval_fence fence, *fence_ptr = &fence;
> 	int ret;
>
> 	xe_tlb_inval_fence_init(tlb_inval, fence_ptr, true);
>-	ret = xe_tlb_inval_issue(tlb_inval, fence_ptr, tlb_inval->ops->ggtt);
>+	ret = xe_tlb_inval_issue(tlb_inval, fence_ptr, op);
> 	xe_tlb_inval_fence_wait(fence_ptr);
>
> 	return ret;
> }
>
>+/**
>+ * xe_tlb_inval_ggtt() - Issue a TLB invalidation for the GGTT
>+ * @tlb_inval: TLB invalidation client
>+ *
>+ * Issue a TLB invalidation for the GGTT. Completion of TLB is asynchronous and
>+ * caller can use the invalidation fence to wait for completion.
>+ *
>+ * Return: 0 on success, negative error code on error
>+ */
>+int xe_tlb_inval_ggtt(struct xe_tlb_inval *tlb_inval)
>+{
>+	return xe_tlb_inval_issue_op_wait(tlb_inval, tlb_inval->ops->ggtt);
>+}
>+
>+/**
>+ * xe_tlb_inval_ggtt_full() - Full engine TLB invalidation within a VF
>+ * @tlb_inval: TLB invalidation client
>+ *
>+ * Issue INVAL_FULL (intra vf) to flush engine TLBs across all engines
>+ * within the requesting VF.
>+ *
>+ * Return: 0 on success, negative error code on error
>+ */
>+int xe_tlb_inval_ggtt_full(struct xe_tlb_inval *tlb_inval)
>+{
>+	if (!tlb_inval->ops->ggtt_full)
>+		return -EOPNOTSUPP;
>+
>+	return xe_tlb_inval_issue_op_wait(tlb_inval, tlb_inval->ops->ggtt_full);
>+}
>+
> /**
>  * xe_tlb_inval_range() - Issue a TLB invalidation for an address range
>  * @tlb_inval: TLB invalidation client
>diff --git a/drivers/gpu/drm/xe/xe_tlb_inval.h b/drivers/gpu/drm/xe/xe_tlb_inval.h
>index a76b7823a5f2..665072b4b81d 100644
>--- a/drivers/gpu/drm/xe/xe_tlb_inval.h
>+++ b/drivers/gpu/drm/xe/xe_tlb_inval.h
>@@ -20,6 +20,7 @@ void xe_tlb_inval_reset(struct xe_tlb_inval *tlb_inval);
> int xe_tlb_inval_all(struct xe_tlb_inval *tlb_inval,
> 		     struct xe_tlb_inval_fence *fence);
> int xe_tlb_inval_ggtt(struct xe_tlb_inval *tlb_inval);
>+int xe_tlb_inval_ggtt_full(struct xe_tlb_inval *tlb_inval);
> void xe_tlb_inval_vm(struct xe_tlb_inval *tlb_inval, struct xe_vm *vm);
> int xe_tlb_inval_range(struct xe_tlb_inval *tlb_inval,
> 		       struct xe_tlb_inval_fence *fence,
>diff --git a/drivers/gpu/drm/xe/xe_tlb_inval_types.h b/drivers/gpu/drm/xe/xe_tlb_inval_types.h
>index 3d1797d186fd..d77be1aedc91 100644
>--- a/drivers/gpu/drm/xe/xe_tlb_inval_types.h
>+++ b/drivers/gpu/drm/xe/xe_tlb_inval_types.h
>@@ -36,6 +36,16 @@ struct xe_tlb_inval_ops {
> 	 */
> 	int (*ggtt)(struct xe_tlb_inval *tlb_inval, u32 seqno);
>
>+	/**
>+	 * @ggtt_full: Full engine TLB invalidation within a VF
>+	 * @tlb_inval: TLB invalidation client
>+	 * @seqno: Seqno of TLB invalidation
>+	 *
>+	 * Return 0 on success, -ECANCELED if backend is mid-reset, error on
>+	 * failure
>+	 */
>+	int (*ggtt_full)(struct xe_tlb_inval *tlb_inval, u32 seqno);
>+
> 	/**
> 	 * @ppgtt: Invalidate per-process translation TLBs
> 	 * @tlb_inval: TLB invalidation client
>-- 
>2.46.0
>

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

* Re: [PATCH 3/3] drm/xe/ggtt: invalidate engine GGTT TLBs for multi-queue GTs
  2026-08-24 16:34 ` [PATCH 3/3] drm/xe/ggtt: invalidate engine GGTT TLBs for multi-queue GTs tilak.tirumalesh.tangudu
  2026-08-24 16:48   ` sashiko-bot
@ 2026-08-24 18:25   ` Niranjana Vishwanathapura
  2026-08-25 18:21   ` Matthew Brost
  2 siblings, 0 replies; 17+ messages in thread
From: Niranjana Vishwanathapura @ 2026-08-24 18:25 UTC (permalink / raw)
  To: tilak.tirumalesh.tangudu; +Cc: matthew.brost, intel-xe

On Mon, Aug 24, 2026 at 10:04:58PM +0530, tilak.tirumalesh.tangudu@intel.com wrote:
>From: Tangudu Tilak Tirumalesh <tilak.tirumalesh.tangudu@intel.com>
>
>Engines cache GGTT translations in their own TLBs, which the
>xe_tlb_inval_ggtt() does not touch.
>After a GGTT unmap the engines can still hit the stale translation and
>read the old page.
>
>Issue an INVAL_FULL (intra vf) invalidation on GGTT unmap, gated on the
>GT having any multi-queue engine class.
>
>v2: Use xe_gt_has_multi_queue() helper and other knits. - Niranjana
>
>Assisted-by: Claude:claude-opus-4-8
>Signed-off-by: Tangudu Tilak Tirumalesh <tilak.tirumalesh.tangudu@intel.com>
>---
> drivers/gpu/drm/xe/xe_ggtt.c | 23 ++++++++++++++++++++++-
> 1 file changed, 22 insertions(+), 1 deletion(-)
>
>diff --git a/drivers/gpu/drm/xe/xe_ggtt.c b/drivers/gpu/drm/xe/xe_ggtt.c
>index 4cddd69f0e99..0f8946fddbaa 100644
>--- a/drivers/gpu/drm/xe/xe_ggtt.c
>+++ b/drivers/gpu/drm/xe/xe_ggtt.c
>@@ -464,6 +464,7 @@ int xe_ggtt_init_early(struct xe_ggtt *ggtt)
> ALLOW_ERROR_INJECTION(xe_ggtt_init_early, ERRNO); /* See xe_pci_probe() */
>
> static void xe_ggtt_invalidate(struct xe_ggtt *ggtt);
>+static void xe_ggtt_invalidate_engine(struct xe_ggtt *ggtt);
>
> static void xe_ggtt_initial_clear(struct xe_ggtt *ggtt)
> {
>@@ -502,8 +503,11 @@ static void ggtt_node_remove(struct xe_ggtt_node *node)
> 			      xe_ggtt_node_size(node), use_scratch);
> 	drm_mm_remove_node(&node->base);
> 	node->base.size = 0;
>-	if (bound && node->invalidate_on_remove)
>+	if (bound && node->invalidate_on_remove) {
> 		xe_ggtt_invalidate(ggtt);
>+		/* Drain engine TLBs so a recycled range can't hit a stale entry. */

NIT...may be here or in xe_ggtt_invalidate_engine(), it is good to add a note
that for simplicity, flush the full TLB instead of context based invalidation?

>+		xe_ggtt_invalidate_engine(ggtt);
>+	}
> 	mutex_unlock(&ggtt->lock);
>
> 	ggtt_node_fini(node);
>@@ -612,6 +616,23 @@ static void xe_ggtt_invalidate(struct xe_ggtt *ggtt)
> 	ggtt_invalidate_gt_tlb(ggtt->tile->media_gt);
> }
>
>+/*
>+ * Drain engine-side GGTT TLBs on teardown so a recycled range's next
>+ * occupant can't hit a predecessor's cached translation.
>+ */

NIT...Given we have a has_multi_queue check in this function, perhaps add
"It is needed in multi-queue case because, ..."?

Anyway, LGTM
Reviewed-by: Niranjana Vishwanathapura <niranjana.vishwanathapura@intel.com>

Niranjana

>+static void xe_ggtt_invalidate_engine(struct xe_ggtt *ggtt)
>+{
>+	struct xe_gt *gt = ggtt->tile->primary_gt;
>+	int err;
>+
>+	if (!xe_gt_has_multi_queue(gt))
>+		return;
>+
>+	err = xe_tlb_inval_ggtt_full(&gt->tlb_inval);
>+	xe_gt_WARN(gt, err, "Failed to invalidate engine GGTT TLBs (%pe)",
>+		   ERR_PTR(err));
>+}
>+
> /**
>  * xe_ggtt_shift_nodes() - Shift GGTT nodes to adjust for a change in usable address range.
>  * @ggtt: the &xe_ggtt struct instance
>-- 
>2.46.0
>

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

* ✓ CI.KUnit: success for drm/xe/ggtt: fix stale GGTT mappings on unmap (rev2)
  2026-08-24 16:34 [PATCH 0/3] drm/xe/ggtt: fix stale GGTT mappings on unmap tilak.tirumalesh.tangudu
                   ` (2 preceding siblings ...)
  2026-08-24 16:34 ` [PATCH 3/3] drm/xe/ggtt: invalidate engine GGTT TLBs for multi-queue GTs tilak.tirumalesh.tangudu
@ 2026-08-24 20:44 ` Patchwork
  2026-08-24 21:24 ` ✓ Xe.CI.BAT: " Patchwork
  4 siblings, 0 replies; 17+ messages in thread
From: Patchwork @ 2026-08-24 20:44 UTC (permalink / raw)
  To: tilak.tirumalesh.tangudu; +Cc: intel-xe

== Series Details ==

Series: drm/xe/ggtt: fix stale GGTT mappings on unmap (rev2)
URL   : https://patchwork.freedesktop.org/series/172559/
State : success

== Summary ==

+ trap cleanup EXIT
+ /kernel/tools/testing/kunit/kunit.py run --kunitconfig /kernel/drivers/gpu/drm/xe/.kunitconfig
[20:43:14] Configuring KUnit Kernel ...
Generating .config ...
Populating config with:
$ make ARCH=um O=.kunit olddefconfig
[20:43:18] 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
[20:43:50] Starting KUnit Kernel (1/1)...
[20:43:50] ============================================================
Running tests with:
$ .kunit/linux kunit.enable=1 mem=1G console=tty kunit_shutdown=halt
[20:43:50] ================== guc_buf (11 subtests) ===================
[20:43:50] [PASSED] test_smallest
[20:43:50] [PASSED] test_largest
[20:43:51] [PASSED] test_granular
[20:43:51] [PASSED] test_unique
[20:43:51] [PASSED] test_overlap
[20:43:51] [PASSED] test_reusable
[20:43:51] [PASSED] test_too_big
[20:43:51] [PASSED] test_flush
[20:43:51] [PASSED] test_lookup
[20:43:51] [PASSED] test_data
[20:43:51] [PASSED] test_class
[20:43:51] ===================== [PASSED] guc_buf =====================
[20:43:51] =================== guc_dbm (7 subtests) ===================
[20:43:51] [PASSED] test_empty
[20:43:51] [PASSED] test_default
[20:43:51] ======================== test_size  ========================
[20:43:51] [PASSED] 4
[20:43:51] [PASSED] 8
[20:43:51] [PASSED] 32
[20:43:51] [PASSED] 256
[20:43:51] ==================== [PASSED] test_size ====================
[20:43:51] ======================= test_reuse  ========================
[20:43:51] [PASSED] 4
[20:43:51] [PASSED] 8
[20:43:51] [PASSED] 32
[20:43:51] [PASSED] 256
[20:43:51] =================== [PASSED] test_reuse ====================
[20:43:51] =================== test_range_overlap  ====================
[20:43:51] [PASSED] 4
[20:43:51] [PASSED] 8
[20:43:51] [PASSED] 32
[20:43:51] [PASSED] 256
[20:43:51] =============== [PASSED] test_range_overlap ================
[20:43:51] =================== test_range_compact  ====================
[20:43:51] [PASSED] 4
[20:43:51] [PASSED] 8
[20:43:51] [PASSED] 32
[20:43:51] [PASSED] 256
[20:43:51] =============== [PASSED] test_range_compact ================
[20:43:51] ==================== test_range_spare  =====================
[20:43:51] [PASSED] 4
[20:43:51] [PASSED] 8
[20:43:51] [PASSED] 32
[20:43:51] [PASSED] 256
[20:43:51] ================ [PASSED] test_range_spare =================
[20:43:51] ===================== [PASSED] guc_dbm =====================
[20:43:51] =================== guc_idm (6 subtests) ===================
[20:43:51] [PASSED] bad_init
[20:43:51] [PASSED] no_init
[20:43:51] [PASSED] init_fini
[20:43:51] [PASSED] check_used
[20:43:51] [PASSED] check_quota
[20:43:51] [PASSED] check_all
[20:43:51] ===================== [PASSED] guc_idm =====================
[20:43:51] =============== guc_klv_helpers (9 subtests) ===============
[20:43:51] [PASSED] test_count
[20:43:51] [PASSED] test_encode_u32
[20:43:51] [PASSED] test_encode_u64
[20:43:51] [PASSED] test_encode_string
[20:43:51] [PASSED] test_encode_object_raw
[20:43:51] [PASSED] test_encode_object_klv
[20:43:51] [PASSED] test_encode_object_nested
[20:43:51] [PASSED] test_encode_object_basic
[20:43:51] [PASSED] test_print
[20:43:51] ================= [PASSED] guc_klv_helpers =================
[20:43:51] =================== xe_log (4 subtests) ====================
[20:43:51] [PASSED] demo_cper
[20:43:51] [PASSED] demo_dmesg
[20:43:51] ======================= test_dmesg  ========================
[20:43:51] [PASSED] test_fatal
[20:43:51] [PASSED] test_fatal_tile
[20:43:51] [PASSED] test_fatal_gt
[20:43:51] [PASSED] test_fatal_comp
[20:43:51] [PASSED] test_fatal_comp_tile
[20:43:51] [PASSED] test_fatal_comp_gt
[20:43:51] [PASSED] test_fatal_all
[20:43:51] [PASSED] test_recoverable
[20:43:51] [PASSED] test_recoverable_tile
[20:43:51] [PASSED] test_recoverable_gt
[20:43:51] [PASSED] test_recoverable_comp
[20:43:51] [PASSED] test_recoverable_comp_tile
[20:43:51] [PASSED] test_recoverable_comp_gt
[20:43:51] [PASSED] test_recoverable_all
[20:43:51] [PASSED] test_info
[20:43:51] [PASSED] test_info_tile
[20:43:51] [PASSED] test_info_gt
[20:43:51] [PASSED] test_info_err
[20:43:51] [PASSED] test_info_comp
[20:43:51] [PASSED] test_info_comp_tile
[20:43:51] [PASSED] test_info_comp_gt
[20:43:51] [PASSED] test_info_all
[20:43:51] [PASSED] test_hw_fatal
[20:43:51] [PASSED] test_hw_recoverable
[20:43:51] [PASSED] test_hw_corrected
[20:43:51] [PASSED] test_hw_informational
[20:43:51] =================== [PASSED] test_dmesg ====================
[20:43:51] ====================== test_invalid  =======================
[20:43:51] [SKIPPED] no-component no-location no-warn (requires CONFIG_DRM_XE_DEBUG)
[20:43:51] [SKIPPED] reserved location (requires CONFIG_DRM_XE_DEBUG)
[20:43:51] [SKIPPED] unknown location (requires CONFIG_DRM_XE_DEBUG)
[20:43:51] [SKIPPED] nonzero-device-id location (requires CONFIG_DRM_XE_DEBUG)
[20:43:51] [SKIPPED] invalid-tile-id location (requires CONFIG_DRM_XE_DEBUG)
[20:43:51] [SKIPPED] invalid-gt-id location (requires CONFIG_DRM_XE_DEBUG)
[20:43:51] [SKIPPED] unknown component class (requires CONFIG_DRM_XE_DEBUG)
[20:43:51] [SKIPPED] unknown system component (requires CONFIG_DRM_XE_DEBUG)
[20:43:51] [SKIPPED] unknown hardware component (requires CONFIG_DRM_XE_DEBUG)
[20:43:51] [SKIPPED] unknown component and location (requires CONFIG_DRM_XE_DEBUG)
[20:43:51] ================== [SKIPPED] test_invalid ==================
[20:43:51] ===================== [PASSED] xe_log ======================
[20:43:51] ================== no_relay (3 subtests) ===================
[20:43:51] [PASSED] xe_drops_guc2pf_if_not_ready
[20:43:51] [PASSED] xe_drops_guc2vf_if_not_ready
[20:43:51] [PASSED] xe_rejects_send_if_not_ready
[20:43:51] ==================== [PASSED] no_relay =====================
[20:43:51] ================== pf_relay (14 subtests) ==================
[20:43:51] [PASSED] pf_rejects_guc2pf_too_short
[20:43:51] [PASSED] pf_rejects_guc2pf_too_long
[20:43:51] [PASSED] pf_rejects_guc2pf_no_payload
[20:43:51] [PASSED] pf_fails_no_payload
[20:43:51] [PASSED] pf_fails_bad_origin
[20:43:51] [PASSED] pf_fails_bad_type
[20:43:51] [PASSED] pf_txn_reports_error
[20:43:51] [PASSED] pf_txn_sends_pf2guc
[20:43:51] [PASSED] pf_sends_pf2guc
[20:43:51] [SKIPPED] pf_loopback_nop (requires CONFIG_DRM_XE_DEBUG_SRIOV)
[20:43:51] [SKIPPED] pf_loopback_echo (requires CONFIG_DRM_XE_DEBUG_SRIOV)
[20:43:51] [SKIPPED] pf_loopback_fail (requires CONFIG_DRM_XE_DEBUG_SRIOV)
[20:43:51] [SKIPPED] pf_loopback_busy (requires CONFIG_DRM_XE_DEBUG_SRIOV)
[20:43:51] [SKIPPED] pf_loopback_retry (requires CONFIG_DRM_XE_DEBUG_SRIOV)
[20:43:51] ==================== [PASSED] pf_relay =====================
[20:43:51] ================== vf_relay (3 subtests) ===================
[20:43:51] [PASSED] vf_rejects_guc2vf_too_short
[20:43:51] [PASSED] vf_rejects_guc2vf_too_long
[20:43:51] [PASSED] vf_rejects_guc2vf_no_payload
[20:43:51] ==================== [PASSED] vf_relay =====================
[20:43:51] ================ pf_gt_config (9 subtests) =================
[20:43:51] [PASSED] fair_contexts_1vf
[20:43:51] [PASSED] fair_doorbells_1vf
[20:43:51] [PASSED] fair_ggtt_1vf
[20:43:51] ====================== fair_vram_1vf  ======================
[20:43:51] [PASSED] 3.50 GiB
[20:43:51] [PASSED] 11.5 GiB
[20:43:51] [PASSED] 15.5 GiB
[20:43:51] [PASSED] 31.5 GiB
[20:43:51] [PASSED] 63.5 GiB
[20:43:51] [PASSED] 1.91 GiB
[20:43:51] ================== [PASSED] fair_vram_1vf ==================
[20:43:51] ================ fair_vram_1vf_admin_only  =================
[20:43:51] [PASSED] 3.50 GiB
[20:43:51] [PASSED] 11.5 GiB
[20:43:51] [PASSED] 15.5 GiB
[20:43:51] [PASSED] 31.5 GiB
[20:43:51] [PASSED] 63.5 GiB
[20:43:51] [PASSED] 1.91 GiB
[20:43:51] ============ [PASSED] fair_vram_1vf_admin_only =============
[20:43:51] ====================== fair_contexts  ======================
[20:43:51] [PASSED] 1 VF
[20:43:51] [PASSED] 2 VFs
[20:43:51] [PASSED] 3 VFs
[20:43:51] [PASSED] 4 VFs
[20:43:51] [PASSED] 5 VFs
[20:43:51] [PASSED] 6 VFs
[20:43:51] [PASSED] 7 VFs
[20:43:51] [PASSED] 8 VFs
[20:43:51] [PASSED] 9 VFs
[20:43:51] [PASSED] 10 VFs
[20:43:51] [PASSED] 11 VFs
[20:43:51] [PASSED] 12 VFs
[20:43:51] [PASSED] 13 VFs
[20:43:51] [PASSED] 14 VFs
[20:43:51] [PASSED] 15 VFs
[20:43:51] [PASSED] 16 VFs
[20:43:51] [PASSED] 17 VFs
[20:43:51] [PASSED] 18 VFs
[20:43:51] [PASSED] 19 VFs
[20:43:51] [PASSED] 20 VFs
[20:43:51] [PASSED] 21 VFs
[20:43:51] [PASSED] 22 VFs
[20:43:51] [PASSED] 23 VFs
[20:43:51] [PASSED] 24 VFs
[20:43:51] [PASSED] 25 VFs
[20:43:51] [PASSED] 26 VFs
[20:43:51] [PASSED] 27 VFs
[20:43:51] [PASSED] 28 VFs
[20:43:51] [PASSED] 29 VFs
[20:43:51] [PASSED] 30 VFs
[20:43:51] [PASSED] 31 VFs
[20:43:51] [PASSED] 32 VFs
[20:43:51] [PASSED] 33 VFs
[20:43:51] [PASSED] 34 VFs
[20:43:51] [PASSED] 35 VFs
[20:43:51] [PASSED] 36 VFs
[20:43:51] [PASSED] 37 VFs
[20:43:51] [PASSED] 38 VFs
[20:43:51] [PASSED] 39 VFs
[20:43:51] [PASSED] 40 VFs
[20:43:51] [PASSED] 41 VFs
[20:43:51] [PASSED] 42 VFs
[20:43:51] [PASSED] 43 VFs
[20:43:51] [PASSED] 44 VFs
[20:43:51] [PASSED] 45 VFs
[20:43:51] [PASSED] 46 VFs
[20:43:51] [PASSED] 47 VFs
[20:43:51] [PASSED] 48 VFs
[20:43:51] [PASSED] 49 VFs
[20:43:51] [PASSED] 50 VFs
[20:43:51] [PASSED] 51 VFs
[20:43:51] [PASSED] 52 VFs
[20:43:51] [PASSED] 53 VFs
[20:43:51] [PASSED] 54 VFs
[20:43:51] [PASSED] 55 VFs
[20:43:51] [PASSED] 56 VFs
[20:43:51] [PASSED] 57 VFs
[20:43:51] [PASSED] 58 VFs
[20:43:51] [PASSED] 59 VFs
[20:43:51] [PASSED] 60 VFs
[20:43:51] [PASSED] 61 VFs
[20:43:51] [PASSED] 62 VFs
[20:43:51] [PASSED] 63 VFs
[20:43:51] ================== [PASSED] fair_contexts ==================
[20:43:51] ===================== fair_doorbells  ======================
[20:43:51] [PASSED] 1 VF
[20:43:51] [PASSED] 2 VFs
[20:43:51] [PASSED] 3 VFs
[20:43:51] [PASSED] 4 VFs
[20:43:51] [PASSED] 5 VFs
[20:43:51] [PASSED] 6 VFs
[20:43:51] [PASSED] 7 VFs
[20:43:51] [PASSED] 8 VFs
[20:43:51] [PASSED] 9 VFs
[20:43:51] [PASSED] 10 VFs
[20:43:51] [PASSED] 11 VFs
[20:43:51] [PASSED] 12 VFs
[20:43:51] [PASSED] 13 VFs
[20:43:51] [PASSED] 14 VFs
[20:43:51] [PASSED] 15 VFs
[20:43:51] [PASSED] 16 VFs
[20:43:51] [PASSED] 17 VFs
[20:43:51] [PASSED] 18 VFs
[20:43:51] [PASSED] 19 VFs
[20:43:51] [PASSED] 20 VFs
[20:43:51] [PASSED] 21 VFs
[20:43:51] [PASSED] 22 VFs
[20:43:51] [PASSED] 23 VFs
[20:43:51] [PASSED] 24 VFs
[20:43:51] [PASSED] 25 VFs
[20:43:51] [PASSED] 26 VFs
[20:43:51] [PASSED] 27 VFs
[20:43:51] [PASSED] 28 VFs
[20:43:51] [PASSED] 29 VFs
[20:43:51] [PASSED] 30 VFs
[20:43:51] [PASSED] 31 VFs
[20:43:51] [PASSED] 32 VFs
[20:43:51] [PASSED] 33 VFs
[20:43:51] [PASSED] 34 VFs
[20:43:51] [PASSED] 35 VFs
[20:43:51] [PASSED] 36 VFs
[20:43:51] [PASSED] 37 VFs
[20:43:51] [PASSED] 38 VFs
[20:43:51] [PASSED] 39 VFs
[20:43:51] [PASSED] 40 VFs
[20:43:51] [PASSED] 41 VFs
[20:43:51] [PASSED] 42 VFs
[20:43:51] [PASSED] 43 VFs
[20:43:51] [PASSED] 44 VFs
[20:43:51] [PASSED] 45 VFs
[20:43:51] [PASSED] 46 VFs
[20:43:51] [PASSED] 47 VFs
[20:43:51] [PASSED] 48 VFs
[20:43:51] [PASSED] 49 VFs
[20:43:51] [PASSED] 50 VFs
[20:43:51] [PASSED] 51 VFs
[20:43:51] [PASSED] 52 VFs
[20:43:51] [PASSED] 53 VFs
[20:43:51] [PASSED] 54 VFs
[20:43:51] [PASSED] 55 VFs
[20:43:51] [PASSED] 56 VFs
[20:43:51] [PASSED] 57 VFs
[20:43:51] [PASSED] 58 VFs
[20:43:51] [PASSED] 59 VFs
[20:43:51] [PASSED] 60 VFs
[20:43:51] [PASSED] 61 VFs
[20:43:51] [PASSED] 62 VFs
[20:43:51] [PASSED] 63 VFs
[20:43:51] ================= [PASSED] fair_doorbells ==================
[20:43:51] ======================== fair_ggtt  ========================
[20:43:51] [PASSED] 1 VF
[20:43:51] [PASSED] 2 VFs
[20:43:51] [PASSED] 3 VFs
[20:43:51] [PASSED] 4 VFs
[20:43:51] [PASSED] 5 VFs
[20:43:51] [PASSED] 6 VFs
[20:43:51] [PASSED] 7 VFs
[20:43:51] [PASSED] 8 VFs
[20:43:51] [PASSED] 9 VFs
[20:43:51] [PASSED] 10 VFs
[20:43:51] [PASSED] 11 VFs
[20:43:51] [PASSED] 12 VFs
[20:43:51] [PASSED] 13 VFs
[20:43:51] [PASSED] 14 VFs
[20:43:51] [PASSED] 15 VFs
[20:43:51] [PASSED] 16 VFs
[20:43:51] [PASSED] 17 VFs
[20:43:51] [PASSED] 18 VFs
[20:43:51] [PASSED] 19 VFs
[20:43:51] [PASSED] 20 VFs
[20:43:51] [PASSED] 21 VFs
[20:43:51] [PASSED] 22 VFs
[20:43:51] [PASSED] 23 VFs
[20:43:51] [PASSED] 24 VFs
[20:43:51] [PASSED] 25 VFs
[20:43:51] [PASSED] 26 VFs
[20:43:51] [PASSED] 27 VFs
[20:43:51] [PASSED] 28 VFs
[20:43:51] [PASSED] 29 VFs
[20:43:51] [PASSED] 30 VFs
[20:43:51] [PASSED] 31 VFs
[20:43:51] [PASSED] 32 VFs
[20:43:51] [PASSED] 33 VFs
[20:43:51] [PASSED] 34 VFs
[20:43:51] [PASSED] 35 VFs
[20:43:51] [PASSED] 36 VFs
[20:43:51] [PASSED] 37 VFs
[20:43:51] [PASSED] 38 VFs
[20:43:51] [PASSED] 39 VFs
[20:43:51] [PASSED] 40 VFs
[20:43:51] [PASSED] 41 VFs
[20:43:51] [PASSED] 42 VFs
[20:43:51] [PASSED] 43 VFs
[20:43:51] [PASSED] 44 VFs
[20:43:51] [PASSED] 45 VFs
[20:43:51] [PASSED] 46 VFs
[20:43:51] [PASSED] 47 VFs
[20:43:51] [PASSED] 48 VFs
[20:43:51] [PASSED] 49 VFs
[20:43:51] [PASSED] 50 VFs
[20:43:51] [PASSED] 51 VFs
[20:43:51] [PASSED] 52 VFs
[20:43:51] [PASSED] 53 VFs
[20:43:51] [PASSED] 54 VFs
[20:43:51] [PASSED] 55 VFs
[20:43:51] [PASSED] 56 VFs
[20:43:51] [PASSED] 57 VFs
[20:43:51] [PASSED] 58 VFs
[20:43:51] [PASSED] 59 VFs
[20:43:51] [PASSED] 60 VFs
[20:43:51] [PASSED] 61 VFs
[20:43:51] [PASSED] 62 VFs
[20:43:51] [PASSED] 63 VFs
[20:43:51] ==================== [PASSED] fair_ggtt ====================
[20:43:51] ======================== fair_vram  ========================
[20:43:51] [PASSED] 1 VF
[20:43:51] [PASSED] 2 VFs
[20:43:51] [PASSED] 3 VFs
[20:43:51] [PASSED] 4 VFs
[20:43:51] [PASSED] 5 VFs
[20:43:51] [PASSED] 6 VFs
[20:43:51] [PASSED] 7 VFs
[20:43:51] [PASSED] 8 VFs
[20:43:51] [PASSED] 9 VFs
[20:43:51] [PASSED] 10 VFs
[20:43:51] [PASSED] 11 VFs
[20:43:51] [PASSED] 12 VFs
[20:43:51] [PASSED] 13 VFs
[20:43:51] [PASSED] 14 VFs
[20:43:51] [PASSED] 15 VFs
[20:43:51] [PASSED] 16 VFs
[20:43:51] [PASSED] 17 VFs
[20:43:51] [PASSED] 18 VFs
[20:43:51] [PASSED] 19 VFs
[20:43:51] [PASSED] 20 VFs
[20:43:51] [PASSED] 21 VFs
[20:43:51] [PASSED] 22 VFs
[20:43:51] [PASSED] 23 VFs
[20:43:51] [PASSED] 24 VFs
[20:43:51] [PASSED] 25 VFs
[20:43:51] [PASSED] 26 VFs
[20:43:51] [PASSED] 27 VFs
[20:43:51] [PASSED] 28 VFs
[20:43:51] [PASSED] 29 VFs
[20:43:51] [PASSED] 30 VFs
[20:43:51] [PASSED] 31 VFs
[20:43:51] [PASSED] 32 VFs
[20:43:51] [PASSED] 33 VFs
[20:43:51] [PASSED] 34 VFs
[20:43:51] [PASSED] 35 VFs
[20:43:51] [PASSED] 36 VFs
[20:43:51] [PASSED] 37 VFs
[20:43:51] [PASSED] 38 VFs
[20:43:51] [PASSED] 39 VFs
[20:43:51] [PASSED] 40 VFs
[20:43:51] [PASSED] 41 VFs
[20:43:51] [PASSED] 42 VFs
[20:43:51] [PASSED] 43 VFs
[20:43:51] [PASSED] 44 VFs
[20:43:51] [PASSED] 45 VFs
[20:43:51] [PASSED] 46 VFs
[20:43:51] [PASSED] 47 VFs
[20:43:51] [PASSED] 48 VFs
[20:43:51] [PASSED] 49 VFs
[20:43:51] [PASSED] 50 VFs
[20:43:51] [PASSED] 51 VFs
[20:43:51] [PASSED] 52 VFs
[20:43:51] [PASSED] 53 VFs
[20:43:51] [PASSED] 54 VFs
[20:43:51] [PASSED] 55 VFs
[20:43:51] [PASSED] 56 VFs
[20:43:51] [PASSED] 57 VFs
[20:43:51] [PASSED] 58 VFs
[20:43:51] [PASSED] 59 VFs
[20:43:51] [PASSED] 60 VFs
[20:43:51] [PASSED] 61 VFs
[20:43:51] [PASSED] 62 VFs
[20:43:51] [PASSED] 63 VFs
[20:43:51] ==================== [PASSED] fair_vram ====================
[20:43:51] ================== [PASSED] pf_gt_config ===================
[20:43:51] ===================== lmtt (1 subtest) =====================
[20:43:51] ======================== test_ops  =========================
[20:43:51] [PASSED] 2-level
[20:43:51] [PASSED] multi-level
[20:43:51] ==================== [PASSED] test_ops =====================
[20:43:51] ====================== [PASSED] lmtt =======================
[20:43:51] ================= sriov_packet (1 subtest) =================
[20:43:51] [PASSED] test_descriptor_init
[20:43:51] ================== [PASSED] sriov_packet ===================
[20:43:51] ================= pf_service (11 subtests) =================
[20:43:51] [PASSED] pf_negotiate_any
[20:43:51] [PASSED] pf_negotiate_base_match
[20:43:51] [PASSED] pf_negotiate_base_newer
[20:43:51] [PASSED] pf_negotiate_base_next
[20:43:51] [SKIPPED] pf_negotiate_base_older (no older minor)
[20:43:51] [PASSED] pf_negotiate_base_prev
[20:43:51] [PASSED] pf_negotiate_latest_match
[20:43:51] [PASSED] pf_negotiate_latest_newer
[20:43:51] [PASSED] pf_negotiate_latest_next
[20:43:51] [SKIPPED] pf_negotiate_latest_older (no older minor)
[20:43:51] [SKIPPED] pf_negotiate_latest_prev (no prev major)
[20:43:51] =================== [PASSED] pf_service ====================
[20:43:51] ================= xe_guc_g2g (2 subtests) ==================
[20:43:51] ============== xe_live_guc_g2g_kunit_default  ==============
[20:43:51] ========= [SKIPPED] xe_live_guc_g2g_kunit_default ==========
[20:43:51] ============== xe_live_guc_g2g_kunit_allmem  ===============
[20:43:51] ========== [SKIPPED] xe_live_guc_g2g_kunit_allmem ==========
[20:43:51] =================== [SKIPPED] xe_guc_g2g ===================
[20:43:51] =================== xe_mocs (2 subtests) ===================
[20:43:51] ================ xe_live_mocs_kernel_kunit  ================
[20:43:51] =========== [SKIPPED] xe_live_mocs_kernel_kunit ============
[20:43:51] ================ xe_live_mocs_reset_kunit  =================
[20:43:51] ============ [SKIPPED] xe_live_mocs_reset_kunit ============
[20:43:51] ==================== [SKIPPED] xe_mocs =====================
[20:43:51] ================= xe_migrate (2 subtests) ==================
[20:43:51] ================= xe_migrate_sanity_kunit  =================
[20:43:51] ============ [SKIPPED] xe_migrate_sanity_kunit =============
[20:43:51] ================== xe_validate_ccs_kunit  ==================
[20:43:51] ============= [SKIPPED] xe_validate_ccs_kunit ==============
[20:43:51] =================== [SKIPPED] xe_migrate ===================
[20:43:51] ================== xe_dma_buf (1 subtest) ==================
[20:43:51] ==================== xe_dma_buf_kunit  =====================
[20:43:51] ================ [SKIPPED] xe_dma_buf_kunit ================
[20:43:51] =================== [SKIPPED] xe_dma_buf ===================
[20:43:51] ================= xe_bo_shrink (1 subtest) =================
[20:43:51] =================== xe_bo_shrink_kunit  ====================
[20:43:51] =============== [SKIPPED] xe_bo_shrink_kunit ===============
[20:43:51] ================== [SKIPPED] xe_bo_shrink ==================
[20:43:51] ==================== xe_bo (2 subtests) ====================
[20:43:51] ================== xe_ccs_migrate_kunit  ===================
[20:43:51] ============== [SKIPPED] xe_ccs_migrate_kunit ==============
[20:43:51] ==================== xe_bo_evict_kunit  ====================
[20:43:51] =============== [SKIPPED] xe_bo_evict_kunit ================
[20:43:51] ===================== [SKIPPED] xe_bo ======================
[20:43:51] =================== xe_any (9 subtests) ====================
[20:43:51] [PASSED] test_to_xe
[20:43:51] [PASSED] test_to_dev
[20:43:51] [PASSED] test_to_pdev
[20:43:51] [PASSED] test_to_drm
[20:43:51] [PASSED] test_if_pdev
[20:43:51] [PASSED] test_if_xe
[20:43:51] [PASSED] test_if_tile
[20:43:51] [PASSED] test_if_gt
[20:43:51] [PASSED] test_to_id
[20:43:51] ===================== [PASSED] xe_any ======================
[20:43:51] ==================== args (13 subtests) ====================
[20:43:51] [PASSED] count_args_test
[20:43:51] [PASSED] call_args_example
[20:43:51] [PASSED] call_args_test
[20:43:51] [PASSED] drop_first_arg_example
[20:43:51] [PASSED] drop_first_arg_test
[20:43:51] [PASSED] first_arg_example
[20:43:51] [PASSED] first_arg_test
[20:43:51] [PASSED] last_arg_example
[20:43:51] [PASSED] last_arg_test
[20:43:51] [PASSED] pick_arg_example
[20:43:51] [PASSED] if_args_example
[20:43:51] [PASSED] if_args_test
[20:43:51] [PASSED] sep_comma_example
[20:43:51] ====================== [PASSED] args =======================
[20:43:51] =================== xe_pci (3 subtests) ====================
[20:43:51] ==================== check_graphics_ip  ====================
[20:43:51] [PASSED] 12.00 Xe_LP
[20:43:51] [PASSED] 12.10 Xe_LP+
[20:43:51] [PASSED] 12.55 Xe_HPG
[20:43:51] [PASSED] 12.60 Xe_HPC
[20:43:51] [PASSED] 12.70 Xe_LPG
[20:43:51] [PASSED] 12.71 Xe_LPG
[20:43:51] [PASSED] 12.74 Xe_LPG+
[20:43:51] [PASSED] 20.01 Xe2_HPG
[20:43:51] [PASSED] 20.02 Xe2_HPG
[20:43:51] [PASSED] 20.04 Xe2_LPG
[20:43:51] [PASSED] 30.00 Xe3_LPG
[20:43:51] [PASSED] 30.01 Xe3_LPG
[20:43:51] [PASSED] 30.03 Xe3_LPG
[20:43:51] [PASSED] 30.04 Xe3_LPG
[20:43:51] [PASSED] 30.05 Xe3_LPG
[20:43:51] [PASSED] 35.10 Xe3p_LPG
[20:43:51] [PASSED] 35.11 Xe3p_XPC
[20:43:51] ================ [PASSED] check_graphics_ip ================
[20:43:51] ===================== check_media_ip  ======================
[20:43:51] [PASSED] 12.00 Xe_M
[20:43:51] [PASSED] 12.55 Xe_HPM
[20:43:51] [PASSED] 13.00 Xe_LPM+
[20:43:51] [PASSED] 13.01 Xe2_HPM
[20:43:51] [PASSED] 20.00 Xe2_LPM
[20:43:51] [PASSED] 30.00 Xe3_LPM
[20:43:51] [PASSED] 30.02 Xe3_LPM
[20:43:51] [PASSED] 35.00 Xe3p_LPM
[20:43:51] [PASSED] 35.03 Xe3p_HPM
[20:43:51] ================= [PASSED] check_media_ip ==================
[20:43:51] =================== check_platform_desc  ===================
[20:43:51] [PASSED] 0x9A60 (TIGERLAKE)
[20:43:51] [PASSED] 0x9A68 (TIGERLAKE)
[20:43:51] [PASSED] 0x9A70 (TIGERLAKE)
[20:43:51] [PASSED] 0x9A40 (TIGERLAKE)
[20:43:51] [PASSED] 0x9A49 (TIGERLAKE)
[20:43:51] [PASSED] 0x9A59 (TIGERLAKE)
[20:43:51] [PASSED] 0x9A78 (TIGERLAKE)
[20:43:51] [PASSED] 0x9AC0 (TIGERLAKE)
[20:43:51] [PASSED] 0x9AC9 (TIGERLAKE)
[20:43:51] [PASSED] 0x9AD9 (TIGERLAKE)
[20:43:51] [PASSED] 0x9AF8 (TIGERLAKE)
[20:43:51] [PASSED] 0x4C80 (ROCKETLAKE)
[20:43:51] [PASSED] 0x4C8A (ROCKETLAKE)
[20:43:51] [PASSED] 0x4C8B (ROCKETLAKE)
[20:43:51] [PASSED] 0x4C8C (ROCKETLAKE)
[20:43:51] [PASSED] 0x4C90 (ROCKETLAKE)
[20:43:51] [PASSED] 0x4C9A (ROCKETLAKE)
[20:43:51] [PASSED] 0x4680 (ALDERLAKE_S)
[20:43:51] [PASSED] 0x4682 (ALDERLAKE_S)
[20:43:51] [PASSED] 0x4688 (ALDERLAKE_S)
[20:43:51] [PASSED] 0x468A (ALDERLAKE_S)
[20:43:51] [PASSED] 0x468B (ALDERLAKE_S)
[20:43:51] [PASSED] 0x4690 (ALDERLAKE_S)
[20:43:51] [PASSED] 0x4692 (ALDERLAKE_S)
[20:43:51] [PASSED] 0x4693 (ALDERLAKE_S)
[20:43:51] [PASSED] 0x46A0 (ALDERLAKE_P)
[20:43:51] [PASSED] 0x46A1 (ALDERLAKE_P)
[20:43:51] [PASSED] 0x46A2 (ALDERLAKE_P)
[20:43:51] [PASSED] 0x46A3 (ALDERLAKE_P)
[20:43:51] [PASSED] 0x46A6 (ALDERLAKE_P)
[20:43:51] [PASSED] 0x46A8 (ALDERLAKE_P)
[20:43:51] [PASSED] 0x46AA (ALDERLAKE_P)
[20:43:51] [PASSED] 0x462A (ALDERLAKE_P)
[20:43:51] [PASSED] 0x4626 (ALDERLAKE_P)
[20:43:51] [PASSED] 0x4628 (ALDERLAKE_P)
[20:43:51] [PASSED] 0x46B0 (ALDERLAKE_P)
[20:43:51] [PASSED] 0x46B1 (ALDERLAKE_P)
[20:43:51] [PASSED] 0x46B2 (ALDERLAKE_P)
[20:43:51] [PASSED] 0x46B3 (ALDERLAKE_P)
[20:43:51] [PASSED] 0x46C0 (ALDERLAKE_P)
[20:43:51] [PASSED] 0x46C1 (ALDERLAKE_P)
[20:43:51] [PASSED] 0x46C2 (ALDERLAKE_P)
[20:43:51] [PASSED] 0x46C3 (ALDERLAKE_P)
[20:43:51] [PASSED] 0x46D0 (ALDERLAKE_N)
[20:43:51] [PASSED] 0x46D1 (ALDERLAKE_N)
[20:43:51] [PASSED] 0x46D2 (ALDERLAKE_N)
[20:43:51] [PASSED] 0x46D3 (ALDERLAKE_N)
[20:43:51] [PASSED] 0x46D4 (ALDERLAKE_N)
[20:43:51] [PASSED] 0xA721 (ALDERLAKE_P)
[20:43:51] [PASSED] 0xA7A1 (ALDERLAKE_P)
[20:43:51] [PASSED] 0xA7A9 (ALDERLAKE_P)
[20:43:51] [PASSED] 0xA7AC (ALDERLAKE_P)
[20:43:51] [PASSED] 0xA7AD (ALDERLAKE_P)
[20:43:51] [PASSED] 0xA720 (ALDERLAKE_P)
[20:43:51] [PASSED] 0xA7A0 (ALDERLAKE_P)
[20:43:51] [PASSED] 0xA7A8 (ALDERLAKE_P)
[20:43:51] [PASSED] 0xA7AA (ALDERLAKE_P)
[20:43:51] [PASSED] 0xA7AB (ALDERLAKE_P)
[20:43:51] [PASSED] 0xA780 (ALDERLAKE_S)
[20:43:51] [PASSED] 0xA781 (ALDERLAKE_S)
[20:43:51] [PASSED] 0xA782 (ALDERLAKE_S)
[20:43:51] [PASSED] 0xA783 (ALDERLAKE_S)
[20:43:51] [PASSED] 0xA788 (ALDERLAKE_S)
[20:43:51] [PASSED] 0xA789 (ALDERLAKE_S)
[20:43:51] [PASSED] 0xA78A (ALDERLAKE_S)
[20:43:51] [PASSED] 0xA78B (ALDERLAKE_S)
[20:43:51] [PASSED] 0x4905 (DG1)
[20:43:51] [PASSED] 0x4906 (DG1)
[20:43:51] [PASSED] 0x4907 (DG1)
[20:43:51] [PASSED] 0x4908 (DG1)
[20:43:51] [PASSED] 0x4909 (DG1)
[20:43:51] [PASSED] 0x56C0 (DG2)
[20:43:51] [PASSED] 0x56C2 (DG2)
[20:43:51] [PASSED] 0x56C1 (DG2)
[20:43:51] [PASSED] 0x7D51 (METEORLAKE)
[20:43:51] [PASSED] 0x7DD1 (METEORLAKE)
[20:43:51] [PASSED] 0x7D41 (METEORLAKE)
[20:43:51] [PASSED] 0x7D67 (METEORLAKE)
[20:43:51] [PASSED] 0xB640 (METEORLAKE)
[20:43:51] [PASSED] 0x56A0 (DG2)
[20:43:51] [PASSED] 0x56A1 (DG2)
[20:43:51] [PASSED] 0x56A2 (DG2)
[20:43:51] [PASSED] 0x56BE (DG2)
[20:43:51] [PASSED] 0x56BF (DG2)
[20:43:51] [PASSED] 0x5690 (DG2)
[20:43:51] [PASSED] 0x5691 (DG2)
[20:43:51] [PASSED] 0x5692 (DG2)
[20:43:51] [PASSED] 0x56A5 (DG2)
[20:43:51] [PASSED] 0x56A6 (DG2)
[20:43:51] [PASSED] 0x56B0 (DG2)
[20:43:51] [PASSED] 0x56B1 (DG2)
[20:43:51] [PASSED] 0x56BA (DG2)
[20:43:51] [PASSED] 0x56BB (DG2)
[20:43:51] [PASSED] 0x56BC (DG2)
[20:43:51] [PASSED] 0x56BD (DG2)
[20:43:51] [PASSED] 0x5693 (DG2)
[20:43:51] [PASSED] 0x5694 (DG2)
[20:43:51] [PASSED] 0x5695 (DG2)
[20:43:51] [PASSED] 0x56A3 (DG2)
[20:43:51] [PASSED] 0x56A4 (DG2)
[20:43:51] [PASSED] 0x56B2 (DG2)
[20:43:51] [PASSED] 0x56B3 (DG2)
[20:43:51] [PASSED] 0x5696 (DG2)
[20:43:51] [PASSED] 0x5697 (DG2)
[20:43:51] [PASSED] 0xB69 (PVC)
[20:43:51] [PASSED] 0xB6E (PVC)
[20:43:51] [PASSED] 0xBD4 (PVC)
[20:43:51] [PASSED] 0xBD5 (PVC)
[20:43:51] [PASSED] 0xBD6 (PVC)
[20:43:51] [PASSED] 0xBD7 (PVC)
[20:43:51] [PASSED] 0xBD8 (PVC)
[20:43:51] [PASSED] 0xBD9 (PVC)
[20:43:51] [PASSED] 0xBDA (PVC)
[20:43:51] [PASSED] 0xBDB (PVC)
[20:43:51] [PASSED] 0xBE0 (PVC)
[20:43:51] [PASSED] 0xBE1 (PVC)
[20:43:51] [PASSED] 0xBE5 (PVC)
[20:43:51] [PASSED] 0x7D40 (METEORLAKE)
[20:43:51] [PASSED] 0x7D45 (METEORLAKE)
[20:43:51] [PASSED] 0x7D55 (METEORLAKE)
[20:43:51] [PASSED] 0x7D60 (METEORLAKE)
[20:43:51] [PASSED] 0x7DD5 (METEORLAKE)
[20:43:51] [PASSED] 0x6420 (LUNARLAKE)
[20:43:51] [PASSED] 0x64A0 (LUNARLAKE)
[20:43:51] [PASSED] 0x64B0 (LUNARLAKE)
[20:43:51] [PASSED] 0xE202 (BATTLEMAGE)
[20:43:51] [PASSED] 0xE209 (BATTLEMAGE)
[20:43:51] [PASSED] 0xE20B (BATTLEMAGE)
[20:43:51] [PASSED] 0xE20C (BATTLEMAGE)
[20:43:51] [PASSED] 0xE20D (BATTLEMAGE)
[20:43:51] [PASSED] 0xE210 (BATTLEMAGE)
[20:43:51] [PASSED] 0xE211 (BATTLEMAGE)
[20:43:51] [PASSED] 0xE212 (BATTLEMAGE)
[20:43:51] [PASSED] 0xE216 (BATTLEMAGE)
[20:43:51] [PASSED] 0xE220 (BATTLEMAGE)
[20:43:51] [PASSED] 0xE221 (BATTLEMAGE)
[20:43:51] [PASSED] 0xE222 (BATTLEMAGE)
[20:43:51] [PASSED] 0xE223 (BATTLEMAGE)
[20:43:51] [PASSED] 0xB080 (PANTHERLAKE)
[20:43:51] [PASSED] 0xB081 (PANTHERLAKE)
[20:43:51] [PASSED] 0xB082 (PANTHERLAKE)
[20:43:51] [PASSED] 0xB083 (PANTHERLAKE)
[20:43:51] [PASSED] 0xB084 (PANTHERLAKE)
[20:43:51] [PASSED] 0xB085 (PANTHERLAKE)
[20:43:51] [PASSED] 0xB086 (PANTHERLAKE)
[20:43:51] [PASSED] 0xB087 (PANTHERLAKE)
[20:43:51] [PASSED] 0xB08F (PANTHERLAKE)
[20:43:51] [PASSED] 0xB090 (PANTHERLAKE)
[20:43:51] [PASSED] 0xB0A0 (PANTHERLAKE)
[20:43:51] [PASSED] 0xB0B0 (PANTHERLAKE)
[20:43:51] [PASSED] 0xFD80 (PANTHERLAKE)
[20:43:51] [PASSED] 0xFD81 (PANTHERLAKE)
[20:43:51] [PASSED] 0xD740 (NOVALAKE_S)
[20:43:51] [PASSED] 0xD741 (NOVALAKE_S)
[20:43:51] [PASSED] 0xD742 (NOVALAKE_S)
[20:43:51] [PASSED] 0xD743 (NOVALAKE_S)
[20:43:51] [PASSED] 0xD745 (NOVALAKE_S)
[20:43:51] [PASSED] 0xD74A (NOVALAKE_S)
[20:43:51] [PASSED] 0xD74B (NOVALAKE_S)
[20:43:51] [PASSED] 0x674C (CRESCENTISLAND)
[20:43:51] [PASSED] 0x674D (CRESCENTISLAND)
[20:43:51] [PASSED] 0x674E (CRESCENTISLAND)
[20:43:51] [PASSED] 0x674F (CRESCENTISLAND)
[20:43:51] [PASSED] 0x6750 (CRESCENTISLAND)
[20:43:51] [PASSED] 0xD750 (NOVALAKE_P)
[20:43:51] [PASSED] 0xD751 (NOVALAKE_P)
[20:43:51] [PASSED] 0xD752 (NOVALAKE_P)
[20:43:51] [PASSED] 0xD753 (NOVALAKE_P)
[20:43:51] [PASSED] 0xD754 (NOVALAKE_P)
[20:43:51] [PASSED] 0xD755 (NOVALAKE_P)
[20:43:51] [PASSED] 0xD756 (NOVALAKE_P)
[20:43:51] [PASSED] 0xD757 (NOVALAKE_P)
[20:43:51] [PASSED] 0xD75F (NOVALAKE_P)
[20:43:51] =============== [PASSED] check_platform_desc ===============
[20:43:51] ===================== [PASSED] xe_pci ======================
[20:43:51] ============= xe_rtp_tables_test (5 subtests) ==============
[20:43:51] ================== xe_rtp_table_gt_test  ===================
[20:43:51] [PASSED] gt_was/14011060649
[20:43:51] [PASSED] gt_was/14011059788
[20:43:51] [PASSED] gt_was/14015795083
[20:43:51] [PASSED] gt_was/16021867713
[20:43:51] [PASSED] gt_was/14019449301
[20:43:51] [PASSED] gt_was/16028005424
[20:43:51] [PASSED] gt_was/14026578760
[20:43:51] [PASSED] gt_was/1409420604
[20:43:51] [PASSED] gt_was/1408615072
[20:43:51] [PASSED] gt_was/22010523718
[20:43:51] [PASSED] gt_was/14011006942
[20:43:51] [PASSED] gt_was/14014830051
[20:43:51] [PASSED] gt_was/18018781329
[20:43:51] [PASSED] gt_was/1509235366
[20:43:51] [PASSED] gt_was/18018781329
[20:43:51] [PASSED] gt_was/16016694945
[20:43:51] [PASSED] gt_was/14018575942
[20:43:51] [PASSED] gt_was/22016670082
[20:43:51] [PASSED] gt_was/22016670082
[20:43:51] [PASSED] gt_was/14017421178
[20:43:51] [PASSED] gt_was/16025250150
[20:43:51] [PASSED] gt_was/14021871409
[20:43:51] [PASSED] gt_was/16021865536
[20:43:51] [PASSED] gt_was/14021486841
[20:43:51] [PASSED] gt_was/14025160223
[20:43:51] [PASSED] gt_was/14026144927, 16029437861, 14026127056
[20:43:51] [PASSED] gt_was/14025635424
[20:43:51] [PASSED] gt_was/16028005424
[20:43:51] ============== [PASSED] xe_rtp_table_gt_test ===============
[20:43:51] ================== xe_rtp_table_gt_test  ===================
[20:43:51] [PASSED] gt_tunings/Tuning: Blend Fill Caching Optimization Disable
[20:43:51] [PASSED] gt_tunings/Tuning: 32B Access Enable
[20:43:51] [PASSED] gt_tunings/Tuning: L3 cache
[20:43:51] [PASSED] gt_tunings/Tuning: L3 cache - media
[20:43:51] [PASSED] gt_tunings/Tuning: Compression Overfetch
[20:43:51] [PASSED] gt_tunings/Tuning: Compression Overfetch - media
[20:43:51] [PASSED] gt_tunings/Tuning: Enable compressible partial write overfetch in L3
[20:43:51] [PASSED] gt_tunings/Tuning: Enable compressible partial write overfetch in L3 - media
[20:43:51] [PASSED] gt_tunings/Tuning: L2 Overfetch Compressible Only
[20:43:51] [PASSED] gt_tunings/Tuning: L2 Overfetch Compressible Only - media
[20:43:51] [PASSED] gt_tunings/Tuning: Stateless compression control
[20:43:51] [PASSED] gt_tunings/Tuning: Stateless compression control - media
[20:43:51] [PASSED] gt_tunings/Tuning: L3 RW flush all Cache
[20:43:51] [PASSED] gt_tunings/Tuning: L3 RW flush all cache - media
[20:43:51] [PASSED] gt_tunings/Tuning: Set STLB Bank Hash Mode to 4KB
[20:43:51] ============== [PASSED] xe_rtp_table_gt_test ===============
[20:43:51] ================== xe_rtp_table_oob_test  ==================
[20:43:51] [PASSED] oob_was/1607983814
[20:43:51] [PASSED] oob_was/16010904313
[20:43:51] [PASSED] oob_was/18022495364
[20:43:51] [PASSED] oob_was/22012773006
[20:43:51] [PASSED] oob_was/14014475959
[20:43:51] [PASSED] oob_was/22011391025
[20:43:51] [PASSED] oob_was/22012727170
[20:43:51] [PASSED] oob_was/22012727685
[20:43:51] [PASSED] oob_was/22016596838
[20:43:51] [PASSED] oob_was/18020744125
[20:43:51] [PASSED] oob_was/1409600907
[20:43:51] [PASSED] oob_was/22014953428
[20:43:51] [PASSED] oob_was/16017236439
[20:43:51] [PASSED] oob_was/14019821291
[20:43:51] [PASSED] oob_was/14015076503
[20:43:51] [PASSED] oob_was/14018913170
[20:43:51] [PASSED] oob_was/14018094691
[20:43:51] [PASSED] oob_was/18024947630
[20:43:51] [PASSED] oob_was/16022287689
[20:43:51] [PASSED] oob_was/13011645652
[20:43:51] [PASSED] oob_was/14022293748
[20:43:51] [PASSED] oob_was/22019794406
[20:43:51] [PASSED] oob_was/22019338487
[20:43:51] [PASSED] oob_was/16023588340
[20:43:51] [PASSED] oob_was/14019789679
[20:43:51] [PASSED] oob_was/14022866841
[20:43:51] [PASSED] oob_was/16021333562
[20:43:51] [PASSED] oob_was/14016712196
[20:43:51] [PASSED] oob_was/14015568240
[20:43:51] [PASSED] oob_was/18013179988
[20:43:51] [PASSED] oob_was/1508761755
[20:43:51] [PASSED] oob_was/16023105232
[20:43:51] [PASSED] oob_was/16026508708
[20:43:51] [PASSED] oob_was/14020001231
[20:43:51] [PASSED] oob_was/16023683509
[20:43:51] [PASSED] oob_was/14025515070
[20:43:51] [PASSED] oob_was/15015404425_disable
[20:43:51] [PASSED] oob_was/16026007364
[20:43:51] [PASSED] oob_was/14020316580
[20:43:51] [PASSED] oob_was/14025883347
[20:43:51] [PASSED] oob_was/16029380221
[20:43:51] [PASSED] oob_was/22022079272
[20:43:51] [PASSED] oob_was/16029897822
[20:43:51] [PASSED] oob_was/14027054324
[20:43:51] ============== [PASSED] xe_rtp_table_oob_test ==============
[20:43:51] ================ xe_rtp_table_dev_oob_test  ================
[20:43:51] [PASSED] device_oob_was/22010954014
[20:43:51] [PASSED] device_oob_was/15015404425
[20:43:51] [PASSED] device_oob_was/22019338487_display
[20:43:51] [PASSED] device_oob_was/14022085890
[20:43:51] [PASSED] device_oob_was/14026539277
[20:43:51] [PASSED] device_oob_was/14026633728
[20:43:51] [PASSED] device_oob_was/14026746987
[20:43:51] [PASSED] device_oob_was/14026779378
[20:43:51] ============ [PASSED] xe_rtp_table_dev_oob_test ============
[20:43:51] ========== xe_rtp_table_missing_upper_bound_test  ==========
[20:43:51] [PASSED] register_whitelist/WaAllowPMDepthAndInvocationCountAccessFromUMD, 1408556865
[20:43:51] [PASSED] register_whitelist/1508744258, 14012131227, 1808121037
[20:43:51] [PASSED] register_whitelist/1806527549
[20:43:51] [PASSED] register_whitelist/allow_read_ctx_timestamp
[20:43:51] [PASSED] register_whitelist/allow_read_queue_timestamp
[20:43:51] [PASSED] register_whitelist/16014440446
[20:43:51] [PASSED] register_whitelist/16017236439
[20:43:51] [PASSED] register_whitelist/16020183090
[20:43:51] [PASSED] register_whitelist/14024997852
[20:43:51] [PASSED] register_whitelist/14024997852
[20:43:51] ====== [PASSED] xe_rtp_table_missing_upper_bound_test ======
[20:43:51] =============== [PASSED] xe_rtp_tables_test ================
[20:43:51] =================== xe_rtp (3 subtests) ====================
[20:43:51] =================== xe_rtp_rules_tests  ====================
[20:43:51] [PASSED] no
[20:43:51] [PASSED] yes
[20:43:51] [PASSED] no-and-no
[20:43:51] [PASSED] no-and-yes
[20:43:51] [PASSED] yes-and-no
[20:43:51] [PASSED] yes-and-yes
[20:43:51] [PASSED] no-or-no
[20:43:51] [PASSED] no-or-yes
[20:43:51] [PASSED] yes-or-no
[20:43:51] [PASSED] yes-or-yes
[20:43:51] [PASSED] no-yes-or-yes-no
[20:43:51] [PASSED] no-yes-or-yes-yes
[20:43:51] [PASSED] yes-yes-or-no-yes
[20:43:51] [PASSED] yes-yes-or-yes-yes
[20:43:51] [PASSED] no-no-or-yes-or-no
[20:43:51] [PASSED] or
[20:43:51] [PASSED] or-yes
[20:43:51] [PASSED] or-no
[20:43:51] [PASSED] yes-or
[20:43:51] [PASSED] no-or
[20:43:51] [PASSED] no-or-or-yes
[20:43:51] [PASSED] yes-or-or-no
[20:43:51] [PASSED] no-or-or-no
[20:43:51] [PASSED] missing-context-engine-class
[20:43:51] [PASSED] missing-context-engine-class-or-yes
[20:43:51] [PASSED] missing-context-engine-class-or-or-yes
[20:43:51] =============== [PASSED] xe_rtp_rules_tests ================
[20:43:51] =============== xe_rtp_process_to_sr_tests  ================
[20:43:51] [PASSED] coalesce-same-reg
[20:43:51] [PASSED] coalesce-same-reg-literal-and-func
[20:43:51] [PASSED] no-match-no-add
[20:43:51] [PASSED] two-regs-two-entries
[20:43:51] [PASSED] clr-one-set-other
[20:43:51] [PASSED] set-field
[20:43:51] [PASSED] conflict-duplicate
[20:43:51] [PASSED] conflict-not-disjoint
[20:43:51] [PASSED] conflict-not-disjoint-literal-and-func
[20:43:51] [PASSED] conflict-reg-type
[20:43:51] [PASSED] bad-mcr-reg-forced-to-regular
[20:43:51] [PASSED] bad-regular-reg-forced-to-mcr
[20:43:51] =========== [PASSED] xe_rtp_process_to_sr_tests ============
[20:43:51] ================== xe_rtp_process_tests  ===================
[20:43:51] [PASSED] active1
[20:43:51] [PASSED] active2
[20:43:51] [PASSED] active-inactive
[20:43:51] [PASSED] inactive-active
[20:43:51] [PASSED] inactive-active-inactive
[20:43:51] [PASSED] inactive-inactive-inactive
[20:43:51] ============== [PASSED] xe_rtp_process_tests ===============
[20:43:51] ===================== [PASSED] xe_rtp ======================
[20:43:51] ==================== xe_wa (1 subtest) =====================
[20:43:51] ======================== xe_wa_gt  =========================
[20:43:51] [PASSED] TIGERLAKE B0
[20:43:51] [PASSED] DG1 A0
[20:43:51] [PASSED] DG1 B0
[20:43:51] [PASSED] ALDERLAKE_S A0
[20:43:51] [PASSED] ALDERLAKE_S B0
[20:43:51] [PASSED] ALDERLAKE_S C0
[20:43:51] [PASSED] ALDERLAKE_S D0
[20:43:51] [PASSED] ALDERLAKE_P A0
[20:43:51] [PASSED] ALDERLAKE_P B0
[20:43:51] [PASSED] ALDERLAKE_P C0
[20:43:51] [PASSED] ALDERLAKE_S RPLS D0
[20:43:51] [PASSED] ALDERLAKE_P RPLU E0
[20:43:51] [PASSED] DG2 G10 C0
[20:43:51] [PASSED] DG2 G11 B1
[20:43:51] [PASSED] DG2 G12 A1
[20:43:51] [PASSED] METEORLAKE 12.70(Xe_LPG) A0 13.00(Xe_LPM+) A0
[20:43:51] [PASSED] METEORLAKE 12.71(Xe_LPG) A0 13.00(Xe_LPM+) A0
[20:43:51] [PASSED] METEORLAKE 12.74(Xe_LPG+) A0 13.00(Xe_LPM+) A0
[20:43:51] [PASSED] LUNARLAKE 20.04(Xe2_LPG) A0 20.00(Xe2_LPM) A0
[20:43:51] [PASSED] LUNARLAKE 20.04(Xe2_LPG) B0 20.00(Xe2_LPM) A0
[20:43:51] [PASSED] BATTLEMAGE 20.01(Xe2_HPG) A0 13.01(Xe2_HPM) A1
[20:43:51] [PASSED] PANTHERLAKE 30.00(Xe3_LPG) A0 30.00(Xe3_LPM) A0
[20:43:51] ==================== [PASSED] xe_wa_gt =====================
[20:43:51] ====================== [PASSED] xe_wa ======================
[20:43:51] ============================================================
[20:43:51] Testing complete. Ran 789 tests: passed: 761, skipped: 28
[20:43:51] Elapsed time: 36.986s total, 4.433s configuring, 31.835s building, 0.681s running

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

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

+ /kernel/tools/testing/kunit/kunit.py run --kunitconfig /kernel/drivers/dma-buf/.kunitconfig
[20:44:30] Configuring KUnit Kernel ...
Regenerating .config ...
Populating config with:
$ make ARCH=um O=.kunit olddefconfig
[20:44:32] 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
[20:44:41] Starting KUnit Kernel (1/1)...
[20:44:41] ============================================================
Running tests with:
$ .kunit/linux kunit.enable=1 mem=1G console=tty kunit_shutdown=halt
[20:44:41] =============== dma-buf-fence (12 subtests) ================
[20:44:41] [PASSED] test_sanitycheck
[20:44:41] [PASSED] test_signaling
[20:44:41] [PASSED] test_add_callback
[20:44:41] [PASSED] test_late_add_callback
[20:44:41] [PASSED] test_rm_callback
[20:44:41] [PASSED] test_late_rm_callback
[20:44:41] [PASSED] test_status
[20:44:41] [PASSED] test_error
[20:44:41] [PASSED] test_wait
[20:44:41] [PASSED] test_wait_timeout
[20:44:41] [PASSED] test_stub
[20:44:41] [SKIPPED] test_race_signal_callback (requires at least 2 CPUs)
[20:44:41] ================== [PASSED] dma-buf-fence ==================
[20:44:41] ============ dma-buf-fence-chain (11 subtests) =============
[20:44:41] [PASSED] test_sanitycheck
[20:44:41] [PASSED] test_find_seqno
[20:44:41] [PASSED] test_find_signaled
[20:44:41] [PASSED] test_find_out_of_order
[20:44:46] [PASSED] test_find_gap
[20:44:46] [PASSED] test_find_race
[20:44:46] [PASSED] test_signal_forward
[20:44:46] [PASSED] test_signal_backward
[20:44:46] [PASSED] test_wait_forward
[20:44:46] [PASSED] test_wait_backward
[20:44:46] [PASSED] test_wait_random
[20:44:46] =============== [PASSED] dma-buf-fence-chain ===============
[20:44:46] ============ dma-buf-fence-unwrap (10 subtests) ============
[20:44:46] [PASSED] test_sanitycheck
[20:44:46] [PASSED] test_unwrap_array
[20:44:46] [PASSED] test_unwrap_chain
[20:44:46] [PASSED] test_unwrap_chain_array
[20:44:46] [PASSED] test_unwrap_merge
[20:44:46] [PASSED] test_unwrap_merge_duplicate
[20:44:46] [PASSED] test_unwrap_merge_seqno
[20:44:46] [PASSED] test_unwrap_merge_order
[20:44:46] [PASSED] test_unwrap_merge_complex
[20:44:46] [PASSED] test_unwrap_merge_complex_seqno
[20:44:46] ============== [PASSED] dma-buf-fence-unwrap ===============
[20:44:46] ================ dma-buf-resv (5 subtests) =================
[20:44:46] [PASSED] test_sanitycheck
[20:44:46] ===================== test_signaling  ======================
[20:44:46] [PASSED] kernel
[20:44:46] [PASSED] write
[20:44:46] [PASSED] read
[20:44:46] [PASSED] bookkeep
[20:44:46] ================= [PASSED] test_signaling ==================
[20:44:46] ====================== test_for_each  ======================
[20:44:46] [PASSED] kernel
[20:44:46] [PASSED] write
[20:44:46] [PASSED] read
[20:44:46] [PASSED] bookkeep
[20:44:46] ================== [PASSED] test_for_each ==================
[20:44:46] ================= test_for_each_unlocked  ==================
[20:44:46] [PASSED] kernel
[20:44:46] [PASSED] write
[20:44:46] [PASSED] read
[20:44:46] [PASSED] bookkeep
[20:44:46] ============= [PASSED] test_for_each_unlocked ==============
[20:44:46] ===================== test_get_fences  =====================
[20:44:46] [PASSED] kernel
[20:44:46] [PASSED] write
[20:44:46] [PASSED] read
[20:44:46] [PASSED] bookkeep
[20:44:46] ================= [PASSED] test_get_fences =================
[20:44:46] ================== [PASSED] dma-buf-resv ===================
[20:44:46] ============================================================
[20:44:46] Testing complete. Ran 50 tests: passed: 49, skipped: 1
[20:44:46] Elapsed time: 15.733s total, 1.758s configuring, 8.653s building, 5.275s running

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



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

* ✓ Xe.CI.BAT: success for drm/xe/ggtt: fix stale GGTT mappings on unmap (rev2)
  2026-08-24 16:34 [PATCH 0/3] drm/xe/ggtt: fix stale GGTT mappings on unmap tilak.tirumalesh.tangudu
                   ` (3 preceding siblings ...)
  2026-08-24 20:44 ` ✓ CI.KUnit: success for drm/xe/ggtt: fix stale GGTT mappings on unmap (rev2) Patchwork
@ 2026-08-24 21:24 ` Patchwork
  4 siblings, 0 replies; 17+ messages in thread
From: Patchwork @ 2026-08-24 21:24 UTC (permalink / raw)
  To: tilak.tirumalesh.tangudu; +Cc: intel-xe

[-- Attachment #1: Type: text/plain, Size: 1013 bytes --]

== Series Details ==

Series: drm/xe/ggtt: fix stale GGTT mappings on unmap (rev2)
URL   : https://patchwork.freedesktop.org/series/172559/
State : success

== Summary ==

CI Bug Log - changes from xe-5640-b830d7b865d1dcc0c199feef72cbe7bf7b208762_BAT -> xe-pw-172559v2_BAT
====================================================

Summary
-------

  **SUCCESS**

  No regressions found.

  

Participating hosts (13 -> 13)
------------------------------

  No changes in participating hosts


Changes
-------

  No changes found


Build changes
-------------

  * IGT: IGT_9070 -> IGT_9071
  * Linux: xe-5640-b830d7b865d1dcc0c199feef72cbe7bf7b208762 -> xe-pw-172559v2

  IGT_9070: 80b6e4c9b9cb853c63a9bcaa4784e0306d1f7fca @ https://gitlab.freedesktop.org/drm/igt-gpu-tools.git
  IGT_9071: 9071
  xe-5640-b830d7b865d1dcc0c199feef72cbe7bf7b208762: b830d7b865d1dcc0c199feef72cbe7bf7b208762
  xe-pw-172559v2: 172559v2

== Logs ==

For more details see: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-172559v2/index.html

[-- Attachment #2: Type: text/html, Size: 1575 bytes --]

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

* Re: [PATCH 1/3] drm/xe/ggtt: stop mapping unmapped GGTT pages to scratch
  2026-08-24 18:17   ` Niranjana Vishwanathapura
@ 2026-08-25 17:53     ` Matthew Brost
  0 siblings, 0 replies; 17+ messages in thread
From: Matthew Brost @ 2026-08-25 17:53 UTC (permalink / raw)
  To: Niranjana Vishwanathapura; +Cc: tilak.tirumalesh.tangudu, intel-xe

On Mon, Aug 24, 2026 at 11:17:57AM -0700, Niranjana Vishwanathapura wrote:
> On Mon, Aug 24, 2026 at 10:04:56PM +0530, tilak.tirumalesh.tangudu@intel.com wrote:
> > From: Tangudu Tilak Tirumalesh <tilak.tirumalesh.tangudu@intel.com>
> > 
> > xe_ggtt_clear() wrote a scratch PTE across the range for both
> > initial_clear() and the node_remove() unmap path.
> > 
> > On unmap the scratch PTE hides stale-TLB gaps: after the range is
> > invalidated a re-walk lands on the still-valid scratch PTE, so a stale
> > engine TLB translation for the freed range never faults and the
> > invalidation gap stays invisible.
> > 
> > Add an explicit use_scratch bool. initial_clear() keeps writing scratch.
> > On multi-queue platforms, where engines cache GGTT independently,
> > node_remove() writes PTE=0 so a stale translation to a freed range
> > faults and the gap becomes observable; other platforms keep scratch.
> > 
> > v2: Add xe_gt_has_multi_queue() helper and other knits-Niranjana
> > 

I'm a little confused about the rationale here. Can you elaborate on why
this is being done?

I also don't really like that we boot with the entire GGTT pointing to
scratch pages and then, over time, as we map and unmap entries in the
GGTT, it gradually becomes populated with unmapped entries that no
longer point to scratch.

This means the behavior can change over time. For example, immediately
after boot, prefetches into unmapped GGTT regions do not fault because
they hit scratch pages. Later on, the same prefetch may fault because
the corresponding GGTT entry no longer points to scratch.

The answer for scratch needs to be either "on" or "off", not something
that changes dynamically at unmap time. I'm fine with deciding to turn
this off, but the behavior needs to remain consistent for a given boot
and platform.

Matt

> > Assisted-by: Claude:claude-opus-4-8
> > Signed-off-by: Tangudu Tilak Tirumalesh <tilak.tirumalesh.tangudu@intel.com>
> > ---
> > drivers/gpu/drm/xe/xe_ggtt.c | 47 ++++++++++++++++++++++++++----------
> > drivers/gpu/drm/xe/xe_gt.h   | 13 ++++++++++
> > 2 files changed, 47 insertions(+), 13 deletions(-)
> > 
> > diff --git a/drivers/gpu/drm/xe/xe_ggtt.c b/drivers/gpu/drm/xe/xe_ggtt.c
> > index 8ec23862477f..4cddd69f0e99 100644
> > --- a/drivers/gpu/drm/xe/xe_ggtt.c
> > +++ b/drivers/gpu/drm/xe/xe_ggtt.c
> > @@ -20,6 +20,7 @@
> > #include "regs/xe_regs.h"
> > #include "xe_assert.h"
> > #include "xe_bo.h"
> > +#include "xe_gt.h"
> > #include "xe_gt_printk.h"
> > #include "xe_gt_types.h"
> > #include "xe_map.h"
> > @@ -257,23 +258,36 @@ static u64 xe_ggtt_get_pte(struct xe_ggtt *ggtt, u64 addr)
> > 	return readq(&ggtt->gsm[addr >> XE_PTE_SHIFT]);
> > }
> > 
> > -static void xe_ggtt_clear(struct xe_ggtt *ggtt, u64 start, u64 size)
> > +/**
> > + * xe_ggtt_clear() - Clear a range of GGTT page-table entries
> > + * @ggtt: the &xe_ggtt to clear
> > + * @start: start of the range (GGTT address)
> > + * @size: size of the range in bytes
> > + * @use_scratch: true fills the range with the scratch PTE (init-time clear so
> > + *		 engines walking free holes read zeros safely); false writes
> > + *		 PTE=0 so a stale HW TLB entry faults instead of silently
> > + *		 landing on scratch.
> > + */
> 
> NIT...Kernel-doc not really needed for static functions. General comment section
> should be good. I prefer keeping it simple with general comment, but leaving it
> as is is fine too.
> 
> In any case,
> Reviewed-by: Niranjana Vishwanathapura <niranjana.vishwanathapura@intel.com>
> 
> > +static void xe_ggtt_clear(struct xe_ggtt *ggtt, u64 start, u64 size,
> > +			  bool use_scratch)
> > {
> > -	u16 pat_index = xe_cache_pat_idx(tile_to_xe(ggtt->tile), XE_CACHE_WB);
> > 	u64 end = start + size - 1;
> > -	u64 scratch_pte;
> > +	u64 pte;
> > 
> > 	xe_tile_assert(ggtt->tile, start < end);
> > 
> > -	if (ggtt->scratch)
> > -		scratch_pte = xe_bo_addr(ggtt->scratch, 0, XE_PAGE_SIZE) |
> > -			      ggtt->pt_ops->pte_encode_flags(ggtt->scratch,
> > -							     pat_index);
> > -	else
> > -		scratch_pte = 0;
> > +	if (use_scratch && ggtt->scratch) {
> > +		u16 pat_index = xe_cache_pat_idx(tile_to_xe(ggtt->tile),
> > +						 XE_CACHE_WB);
> > +
> > +		pte = xe_bo_addr(ggtt->scratch, 0, XE_PAGE_SIZE) |
> > +		      ggtt->pt_ops->pte_encode_flags(ggtt->scratch, pat_index);
> > +	} else {
> > +		pte = 0;
> > +	}
> > 
> > 	while (start < end) {
> > -		ggtt->pt_ops->ggtt_set_pte(ggtt, start, scratch_pte);
> > +		ggtt->pt_ops->ggtt_set_pte(ggtt, start, pte);
> > 		start += XE_PAGE_SIZE;
> > 	}
> > }
> > @@ -459,7 +473,7 @@ static void xe_ggtt_initial_clear(struct xe_ggtt *ggtt)
> > 	/* Display may have allocated inside ggtt, so be careful with clearing here */
> > 	mutex_lock(&ggtt->lock);
> > 	drm_mm_for_each_hole(hole, &ggtt->mm, start, end)
> > -		xe_ggtt_clear(ggtt, ggtt->start + start, end - start);
> > +		xe_ggtt_clear(ggtt, ggtt->start + start, end - start, true);
> > 
> > 	xe_ggtt_invalidate(ggtt);
> > 	mutex_unlock(&ggtt->lock);
> > @@ -473,12 +487,19 @@ static void ggtt_node_fini(struct xe_ggtt_node *node)
> > static void ggtt_node_remove(struct xe_ggtt_node *node)
> > {
> > 	struct xe_ggtt *ggtt = node->ggtt;
> > -	bool bound;
> > +	bool use_scratch, bound;
> > +
> > +	/*
> > +	 * Addition of a secondary queue while a multi-queue context is live on
> > +	 * HW requires proper GGTT TLB clearing, so use faulting PTEs here.
> > +	 */
> > +	use_scratch = !xe_gt_has_multi_queue(ggtt->tile->primary_gt);
> > 
> > 	mutex_lock(&ggtt->lock);
> > 	bound = ggtt->flags & XE_GGTT_FLAGS_ONLINE;
> > 	if (bound)
> > -		xe_ggtt_clear(ggtt, xe_ggtt_node_addr(node), xe_ggtt_node_size(node));
> > +		xe_ggtt_clear(ggtt, xe_ggtt_node_addr(node),
> > +			      xe_ggtt_node_size(node), use_scratch);
> > 	drm_mm_remove_node(&node->base);
> > 	node->base.size = 0;
> > 	if (bound && node->invalidate_on_remove)
> > diff --git a/drivers/gpu/drm/xe/xe_gt.h b/drivers/gpu/drm/xe/xe_gt.h
> > index 65a4655b0994..92d934d50244 100644
> > --- a/drivers/gpu/drm/xe/xe_gt.h
> > +++ b/drivers/gpu/drm/xe/xe_gt.h
> > @@ -160,4 +160,17 @@ static inline bool xe_gt_supports_multi_queue(const struct xe_gt *gt,
> > 	return gt->info.multi_queue_engine_class_mask & BIT(class);
> > }
> > 
> > +/**
> > + * xe_gt_has_multi_queue() - Check if gt supports multi-queue on
> > + * any engine class.
> > + *
> > + * @gt: the GT object (may be NULL)
> > + *
> > + * Return: true if any engine class on @gt supports multi queue, else false
> > + */
> > +static inline bool xe_gt_has_multi_queue(const struct xe_gt *gt)
> > +{
> > +	return gt && gt->info.multi_queue_engine_class_mask;
> > +}
> > +
> > #endif
> > -- 
> > 2.46.0
> > 

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

* Re: [PATCH 2/3] drm/xe/tlb_inval: add xe_tlb_inval_ggtt_full() GGTT invalidation helper
  2026-08-24 16:34 ` [PATCH 2/3] drm/xe/tlb_inval: add xe_tlb_inval_ggtt_full() GGTT invalidation helper tilak.tirumalesh.tangudu
  2026-08-24 18:20   ` Niranjana Vishwanathapura
@ 2026-08-25 18:08   ` Matthew Brost
  1 sibling, 0 replies; 17+ messages in thread
From: Matthew Brost @ 2026-08-25 18:08 UTC (permalink / raw)
  To: tilak.tirumalesh.tangudu; +Cc: niranjana.vishwanathapura, intel-xe

On Mon, Aug 24, 2026 at 10:04:57PM +0530, tilak.tirumalesh.tangudu@intel.com wrote:
> From: Tangudu Tilak Tirumalesh <tilak.tirumalesh.tangudu@intel.com>
> 
> Add xe_tlb_inval_ggtt_full() and its GuC backend
> send_tlb_inval_ggtt_full() for full engine TLB invalidation
> within the requesting VF across all engines.
> 
> v2: Refactor with new helper xe_tlb_inval_issue_op_wait()
>     and other knits. -Niranjana
> 
> Assisted-by: Claude:claude-opus-4-8
> Signed-off-by: Tangudu Tilak Tirumalesh <tilak.tirumalesh.tangudu@intel.com>
> ---
>  drivers/gpu/drm/xe/xe_guc_tlb_inval.c   | 21 +++++++++++++
>  drivers/gpu/drm/xe/xe_tlb_inval.c       | 42 +++++++++++++++++++++----
>  drivers/gpu/drm/xe/xe_tlb_inval.h       |  1 +
>  drivers/gpu/drm/xe/xe_tlb_inval_types.h | 10 ++++++
>  4 files changed, 68 insertions(+), 6 deletions(-)
> 
> diff --git a/drivers/gpu/drm/xe/xe_guc_tlb_inval.c b/drivers/gpu/drm/xe/xe_guc_tlb_inval.c
> index 046d0655122f..08dc2ee4cbff 100644
> --- a/drivers/gpu/drm/xe/xe_guc_tlb_inval.c
> +++ b/drivers/gpu/drm/xe/xe_guc_tlb_inval.c
> @@ -98,6 +98,25 @@ static int send_tlb_inval_ggtt(struct xe_tlb_inval *tlb_inval, u32 seqno)
>  	return -ECANCELED;
>  }
>  
> +/*
> + * Emit INVAL_FULL (intra vf) to invalidate engine TLBs across all engines
> + * within the VF.
> + */
> +static int send_tlb_inval_ggtt_full(struct xe_tlb_inval *tlb_inval, u32 seqno)
> +{
> +	struct xe_guc *guc = tlb_inval->private;
> +	u32 action[] = {
> +		XE_GUC_ACTION_TLB_INVALIDATION,
> +		seqno,
> +		MAKE_INVAL_OP(XE_GUC_TLB_INVAL_FULL),
> +	};
> +
> +	if (!xe_guc_ct_enabled(&guc->ct) || !guc->submission_state.enabled)

This is a TOCTOU issue. For example, the CT state can change immediately
after the check,

send_tlb_inval_ggtt() has the same problem and likely isn't 100% correct
either.

I'd prefer that we don't make this situation any worse.

Would something like this work?

ret = send_tlb_inval(guc, action, ARRAY_SIZE(action));
if (ret)
	return -ECANCELED;

This would allow the CT layer, under the appropriate lock, to determine
whether it is still alive. If the GuC CT is no longer live, we know that
nothing can be running on the engines, so returning -ECANCELED would
signal the fence appropriately.

Everything else LGTM.

Matt

> +		return -ECANCELED;
> +
> +	return send_tlb_inval(guc, action, ARRAY_SIZE(action));
> +}
> +
>  static int send_page_reclaim(struct xe_guc *guc, u32 seqno,
>  			     u64 gpu_addr)
>  {
> @@ -346,6 +365,7 @@ static long tlb_inval_timeout_delay(struct xe_tlb_inval *tlb_inval)
>  static const struct xe_tlb_inval_ops guc_tlb_inval_asid_ops = {
>  	.all = send_tlb_inval_all,
>  	.ggtt = send_tlb_inval_ggtt,
> +	.ggtt_full = send_tlb_inval_ggtt_full,
>  	.ppgtt = send_tlb_inval_asid_ppgtt,
>  	.initialized = tlb_inval_initialized,
>  	.flush = tlb_inval_flush,
> @@ -354,6 +374,7 @@ static const struct xe_tlb_inval_ops guc_tlb_inval_asid_ops = {
>  
>  static const struct xe_tlb_inval_ops guc_tlb_inval_ctx_ops = {
>  	.ggtt = send_tlb_inval_ggtt,
> +	.ggtt_full = send_tlb_inval_ggtt_full,
>  	.all = send_tlb_inval_all,
>  	.ppgtt = send_tlb_inval_ctx_ppgtt,
>  	.initialized = tlb_inval_initialized,
> diff --git a/drivers/gpu/drm/xe/xe_tlb_inval.c b/drivers/gpu/drm/xe/xe_tlb_inval.c
> index bbd21d393062..7c3bf32d9258 100644
> --- a/drivers/gpu/drm/xe/xe_tlb_inval.c
> +++ b/drivers/gpu/drm/xe/xe_tlb_inval.c
> @@ -301,26 +301,56 @@ int xe_tlb_inval_all(struct xe_tlb_inval *tlb_inval,
>  }
>  
>  /**
> - * xe_tlb_inval_ggtt() - Issue a TLB invalidation for the GGTT
> + * xe_tlb_inval_issue_op_wait() - Issue a TLB invalidation and wait
>   * @tlb_inval: TLB invalidation client
> - *
> - * Issue a TLB invalidation for the GGTT. Completion of TLB is asynchronous and
> - * caller can use the invalidation fence to wait for completion.
> + * @op: backend invalidation hook to issue
>   *
>   * Return: 0 on success, negative error code on error
>   */
> -int xe_tlb_inval_ggtt(struct xe_tlb_inval *tlb_inval)
> +static int xe_tlb_inval_issue_op_wait(struct xe_tlb_inval *tlb_inval,
> +				      int (*op)(struct xe_tlb_inval *tlb_inval, u32 seqno))
>  {
>  	struct xe_tlb_inval_fence fence, *fence_ptr = &fence;
>  	int ret;
>  
>  	xe_tlb_inval_fence_init(tlb_inval, fence_ptr, true);
> -	ret = xe_tlb_inval_issue(tlb_inval, fence_ptr, tlb_inval->ops->ggtt);
> +	ret = xe_tlb_inval_issue(tlb_inval, fence_ptr, op);
>  	xe_tlb_inval_fence_wait(fence_ptr);
>  
>  	return ret;
>  }
>  
> +/**
> + * xe_tlb_inval_ggtt() - Issue a TLB invalidation for the GGTT
> + * @tlb_inval: TLB invalidation client
> + *
> + * Issue a TLB invalidation for the GGTT. Completion of TLB is asynchronous and
> + * caller can use the invalidation fence to wait for completion.
> + *
> + * Return: 0 on success, negative error code on error
> + */
> +int xe_tlb_inval_ggtt(struct xe_tlb_inval *tlb_inval)
> +{
> +	return xe_tlb_inval_issue_op_wait(tlb_inval, tlb_inval->ops->ggtt);
> +}
> +
> +/**
> + * xe_tlb_inval_ggtt_full() - Full engine TLB invalidation within a VF
> + * @tlb_inval: TLB invalidation client
> + *
> + * Issue INVAL_FULL (intra vf) to flush engine TLBs across all engines
> + * within the requesting VF.
> + *
> + * Return: 0 on success, negative error code on error
> + */
> +int xe_tlb_inval_ggtt_full(struct xe_tlb_inval *tlb_inval)
> +{
> +	if (!tlb_inval->ops->ggtt_full)
> +		return -EOPNOTSUPP;
> +
> +	return xe_tlb_inval_issue_op_wait(tlb_inval, tlb_inval->ops->ggtt_full);
> +}
> +
>  /**
>   * xe_tlb_inval_range() - Issue a TLB invalidation for an address range
>   * @tlb_inval: TLB invalidation client
> diff --git a/drivers/gpu/drm/xe/xe_tlb_inval.h b/drivers/gpu/drm/xe/xe_tlb_inval.h
> index a76b7823a5f2..665072b4b81d 100644
> --- a/drivers/gpu/drm/xe/xe_tlb_inval.h
> +++ b/drivers/gpu/drm/xe/xe_tlb_inval.h
> @@ -20,6 +20,7 @@ void xe_tlb_inval_reset(struct xe_tlb_inval *tlb_inval);
>  int xe_tlb_inval_all(struct xe_tlb_inval *tlb_inval,
>  		     struct xe_tlb_inval_fence *fence);
>  int xe_tlb_inval_ggtt(struct xe_tlb_inval *tlb_inval);
> +int xe_tlb_inval_ggtt_full(struct xe_tlb_inval *tlb_inval);
>  void xe_tlb_inval_vm(struct xe_tlb_inval *tlb_inval, struct xe_vm *vm);
>  int xe_tlb_inval_range(struct xe_tlb_inval *tlb_inval,
>  		       struct xe_tlb_inval_fence *fence,
> diff --git a/drivers/gpu/drm/xe/xe_tlb_inval_types.h b/drivers/gpu/drm/xe/xe_tlb_inval_types.h
> index 3d1797d186fd..d77be1aedc91 100644
> --- a/drivers/gpu/drm/xe/xe_tlb_inval_types.h
> +++ b/drivers/gpu/drm/xe/xe_tlb_inval_types.h
> @@ -36,6 +36,16 @@ struct xe_tlb_inval_ops {
>  	 */
>  	int (*ggtt)(struct xe_tlb_inval *tlb_inval, u32 seqno);
>  
> +	/**
> +	 * @ggtt_full: Full engine TLB invalidation within a VF
> +	 * @tlb_inval: TLB invalidation client
> +	 * @seqno: Seqno of TLB invalidation
> +	 *
> +	 * Return 0 on success, -ECANCELED if backend is mid-reset, error on
> +	 * failure
> +	 */
> +	int (*ggtt_full)(struct xe_tlb_inval *tlb_inval, u32 seqno);
> +
>  	/**
>  	 * @ppgtt: Invalidate per-process translation TLBs
>  	 * @tlb_inval: TLB invalidation client
> -- 
> 2.46.0
> 

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

* Re: [PATCH 3/3] drm/xe/ggtt: invalidate engine GGTT TLBs for multi-queue GTs
  2026-08-24 16:34 ` [PATCH 3/3] drm/xe/ggtt: invalidate engine GGTT TLBs for multi-queue GTs tilak.tirumalesh.tangudu
  2026-08-24 16:48   ` sashiko-bot
  2026-08-24 18:25   ` Niranjana Vishwanathapura
@ 2026-08-25 18:21   ` Matthew Brost
  2 siblings, 0 replies; 17+ messages in thread
From: Matthew Brost @ 2026-08-25 18:21 UTC (permalink / raw)
  To: tilak.tirumalesh.tangudu; +Cc: niranjana.vishwanathapura, intel-xe

On Mon, Aug 24, 2026 at 10:04:58PM +0530, tilak.tirumalesh.tangudu@intel.com wrote:
> From: Tangudu Tilak Tirumalesh <tilak.tirumalesh.tangudu@intel.com>
> 
> Engines cache GGTT translations in their own TLBs, which the
> xe_tlb_inval_ggtt() does not touch.
> After a GGTT unmap the engines can still hit the stale translation and
> read the old page.
> 
> Issue an INVAL_FULL (intra vf) invalidation on GGTT unmap, gated on the
> GT having any multi-queue engine class.
> 
> v2: Use xe_gt_has_multi_queue() helper and other knits. - Niranjana
> 
> Assisted-by: Claude:claude-opus-4-8
> Signed-off-by: Tangudu Tilak Tirumalesh <tilak.tirumalesh.tangudu@intel.com>
> ---
>  drivers/gpu/drm/xe/xe_ggtt.c | 23 ++++++++++++++++++++++-
>  1 file changed, 22 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/gpu/drm/xe/xe_ggtt.c b/drivers/gpu/drm/xe/xe_ggtt.c
> index 4cddd69f0e99..0f8946fddbaa 100644
> --- a/drivers/gpu/drm/xe/xe_ggtt.c
> +++ b/drivers/gpu/drm/xe/xe_ggtt.c
> @@ -464,6 +464,7 @@ int xe_ggtt_init_early(struct xe_ggtt *ggtt)
>  ALLOW_ERROR_INJECTION(xe_ggtt_init_early, ERRNO); /* See xe_pci_probe() */
>  
>  static void xe_ggtt_invalidate(struct xe_ggtt *ggtt);
> +static void xe_ggtt_invalidate_engine(struct xe_ggtt *ggtt);
>  
>  static void xe_ggtt_initial_clear(struct xe_ggtt *ggtt)
>  {
> @@ -502,8 +503,11 @@ static void ggtt_node_remove(struct xe_ggtt_node *node)
>  			      xe_ggtt_node_size(node), use_scratch);
>  	drm_mm_remove_node(&node->base);
>  	node->base.size = 0;
> -	if (bound && node->invalidate_on_remove)
> +	if (bound && node->invalidate_on_remove) {
>  		xe_ggtt_invalidate(ggtt);
> +		/* Drain engine TLBs so a recycled range can't hit a stale entry. */
> +		xe_ggtt_invalidate_engine(ggtt);
> +	}
>  	mutex_unlock(&ggtt->lock);
>  
>  	ggtt_node_fini(node);
> @@ -612,6 +616,23 @@ static void xe_ggtt_invalidate(struct xe_ggtt *ggtt)
>  	ggtt_invalidate_gt_tlb(ggtt->tile->media_gt);
>  }
>  
> +/*
> + * Drain engine-side GGTT TLBs on teardown so a recycled range's next
> + * occupant can't hit a predecessor's cached translation.
> + */
> +static void xe_ggtt_invalidate_engine(struct xe_ggtt *ggtt)
> +{
> +	struct xe_gt *gt = ggtt->tile->primary_gt;
> +	int err;
> +
> +	if (!xe_gt_has_multi_queue(gt))
> +		return;

For future-proofing, look similar too xe_ggtt_invalidate():

It should attempt to invalidate both the primary and media GTs. The
media GT will either be NULL or have xe_gt_has_multi_queue() == false,
in which case xe_tlb_inval_ggtt_full() will be skipped for that GT.

Sashiko also flagged this as a potential issue, not functional thing but
good feedback.

Matt

> +
> +	err = xe_tlb_inval_ggtt_full(&gt->tlb_inval);
> +	xe_gt_WARN(gt, err, "Failed to invalidate engine GGTT TLBs (%pe)",
> +		   ERR_PTR(err));
> +}
> +
>  /**
>   * xe_ggtt_shift_nodes() - Shift GGTT nodes to adjust for a change in usable address range.
>   * @ggtt: the &xe_ggtt struct instance
> -- 
> 2.46.0
> 

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

end of thread, other threads:[~2026-08-25 18:22 UTC | newest]

Thread overview: 17+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-08-24 16:34 [PATCH 0/3] drm/xe/ggtt: fix stale GGTT mappings on unmap tilak.tirumalesh.tangudu
2026-08-24 16:34 ` [PATCH 1/3] drm/xe/ggtt: stop mapping unmapped GGTT pages to scratch tilak.tirumalesh.tangudu
2026-08-24 16:46   ` sashiko-bot
2026-08-24 18:17   ` Niranjana Vishwanathapura
2026-08-25 17:53     ` Matthew Brost
2026-08-24 16:34 ` [PATCH 2/3] drm/xe/tlb_inval: add xe_tlb_inval_ggtt_full() GGTT invalidation helper tilak.tirumalesh.tangudu
2026-08-24 18:20   ` Niranjana Vishwanathapura
2026-08-25 18:08   ` Matthew Brost
2026-08-24 16:34 ` [PATCH 3/3] drm/xe/ggtt: invalidate engine GGTT TLBs for multi-queue GTs tilak.tirumalesh.tangudu
2026-08-24 16:48   ` sashiko-bot
2026-08-24 18:25   ` Niranjana Vishwanathapura
2026-08-25 18:21   ` Matthew Brost
2026-08-24 20:44 ` ✓ CI.KUnit: success for drm/xe/ggtt: fix stale GGTT mappings on unmap (rev2) Patchwork
2026-08-24 21:24 ` ✓ Xe.CI.BAT: " Patchwork
  -- strict thread matches above, loose matches on Subject: below --
2026-08-21  7:42 [PATCH 0/3] drm/xe/ggtt: fix stale GGTT mappings on unmap tilak.tirumalesh.tangudu
2026-08-21  7:42 ` [PATCH 3/3] drm/xe/ggtt: invalidate engine GGTT TLBs for multi-queue GTs tilak.tirumalesh.tangudu
2026-08-21  7:56   ` sashiko-bot
2026-08-24  0:56   ` Niranjana Vishwanathapura

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.