* [PATCH v4] [CI-ONLY][DONOT-REVIEW] Access counter squash
@ 2026-09-10 11:43 Himal Prasad Ghimiray
2026-09-10 11:53 ` ✗ CI.checkpatch: warning for Access counter squash (rev4) Patchwork
` (4 more replies)
0 siblings, 5 replies; 6+ messages in thread
From: Himal Prasad Ghimiray @ 2026-09-10 11:43 UTC (permalink / raw)
To: intel-xe; +Cc: Himal Prasad Ghimiray
---
drivers/gpu/drm/xe/Makefile | 4 +-
drivers/gpu/drm/xe/regs/xe_gtt_defs.h | 1 +
drivers/gpu/drm/xe/regs/xe_lrc_layout.h | 10 +
drivers/gpu/drm/xe/xe_access_counter.c | 366 +++++++++++++++++++
drivers/gpu/drm/xe/xe_access_counter.h | 17 +
drivers/gpu/drm/xe/xe_access_counter_types.h | 143 ++++++++
drivers/gpu/drm/xe/xe_device.c | 30 ++
drivers/gpu/drm/xe/xe_device.h | 1 +
drivers/gpu/drm/xe/xe_device_types.h | 12 +
drivers/gpu/drm/xe/xe_exec_queue.c | 35 +-
drivers/gpu/drm/xe/xe_exec_queue_types.h | 9 +
drivers/gpu/drm/xe/xe_execlist.c | 2 +-
drivers/gpu/drm/xe/xe_guc_access_counter.c | 74 ++++
drivers/gpu/drm/xe/xe_guc_access_counter.h | 15 +
drivers/gpu/drm/xe/xe_guc_ct.c | 4 +
drivers/gpu/drm/xe/xe_guc_fwif.h | 1 +
drivers/gpu/drm/xe/xe_lrc.c | 35 +-
drivers/gpu/drm/xe/xe_lrc.h | 5 +-
drivers/gpu/drm/xe/xe_pagefault.c | 78 +---
drivers/gpu/drm/xe/xe_pt.c | 21 ++
drivers/gpu/drm/xe/xe_svm.c | 197 ++++++++--
drivers/gpu/drm/xe/xe_svm.h | 49 +++
drivers/gpu/drm/xe/xe_trace_bo.h | 32 +-
drivers/gpu/drm/xe/xe_usm_queue.h | 127 +++++++
drivers/gpu/drm/xe/xe_vm.c | 130 ++++++-
drivers/gpu/drm/xe/xe_vm.h | 6 +
drivers/gpu/drm/xe/xe_vm_types.h | 11 +
include/uapi/drm/xe_drm.h | 205 +++++++++++
28 files changed, 1505 insertions(+), 115 deletions(-)
create mode 100644 drivers/gpu/drm/xe/xe_access_counter.c
create mode 100644 drivers/gpu/drm/xe/xe_access_counter.h
create mode 100644 drivers/gpu/drm/xe/xe_access_counter_types.h
create mode 100644 drivers/gpu/drm/xe/xe_guc_access_counter.c
create mode 100644 drivers/gpu/drm/xe/xe_guc_access_counter.h
create mode 100644 drivers/gpu/drm/xe/xe_usm_queue.h
diff --git a/drivers/gpu/drm/xe/Makefile b/drivers/gpu/drm/xe/Makefile
index adc2de37e768..ad1acc67ee0b 100644
--- a/drivers/gpu/drm/xe/Makefile
+++ b/drivers/gpu/drm/xe/Makefile
@@ -32,7 +32,8 @@ $(obj)/generated/%_device_wa_oob.c $(obj)/generated/%_device_wa_oob.h: $(obj)/xe
# core driver code
-xe-y += xe_bb.o \
+xe-y += xe_access_counter.o \
+ xe_bb.o \
xe_bo.o \
xe_bo_evict.o \
xe_dep_scheduler.o \
@@ -73,6 +74,7 @@ xe-y += xe_bb.o \
xe_guc_id_mgr.o \
xe_guc_klv_helpers.o \
xe_guc_log.o \
+ xe_guc_access_counter.o \
xe_guc_pagefault.o \
xe_guc_pc.o \
xe_guc_rc.o \
diff --git a/drivers/gpu/drm/xe/regs/xe_gtt_defs.h b/drivers/gpu/drm/xe/regs/xe_gtt_defs.h
index d6bc19ef277b..1286ef346504 100644
--- a/drivers/gpu/drm/xe/regs/xe_gtt_defs.h
+++ b/drivers/gpu/drm/xe/regs/xe_gtt_defs.h
@@ -30,6 +30,7 @@
#define XE_PDE_IPS_64K BIT_ULL(11)
#define XE_GGTT_PTE_DM BIT_ULL(1)
+#define XE_PPGTT_PTE_NC BIT_ULL(5)
#define XE_USM_PPGTT_PTE_AE BIT_ULL(10)
#define XE_PPGTT_PTE_DM BIT_ULL(11)
#define XE_PDE_64K BIT_ULL(6)
diff --git a/drivers/gpu/drm/xe/regs/xe_lrc_layout.h b/drivers/gpu/drm/xe/regs/xe_lrc_layout.h
index 6f7abc0181b5..c32e47e87f88 100644
--- a/drivers/gpu/drm/xe/regs/xe_lrc_layout.h
+++ b/drivers/gpu/drm/xe/regs/xe_lrc_layout.h
@@ -45,4 +45,14 @@
#define INDIRECT_CTX_RING_START_UDW (0x08 + 1)
#define INDIRECT_CTX_RING_CTL (0x0a + 1)
+/* Fields for CTX_ACC_CTR_THOLD */
+#define ACC_TRIGGER_MASK REG_GENMASK(15, 0)
+#define ACC_TRIGGER_VAL(x) REG_FIELD_PREP(ACC_TRIGGER_MASK, x)
+#define ACC_NOTIFY_MASK REG_GENMASK(31, 16)
+#define ACC_NOTIFY_VAL(x) REG_FIELD_PREP(ACC_NOTIFY_MASK, x)
+
+/* Fields for CTX_ASID */
+#define ACC_GRANULARITY_MASK REG_GENMASK(22, 20)
+#define ACC_GRANULARITY_VAL(x) REG_FIELD_PREP(ACC_GRANULARITY_MASK, x)
+
#endif
diff --git a/drivers/gpu/drm/xe/xe_access_counter.c b/drivers/gpu/drm/xe/xe_access_counter.c
new file mode 100644
index 000000000000..ed1ed6091ac5
--- /dev/null
+++ b/drivers/gpu/drm/xe/xe_access_counter.c
@@ -0,0 +1,366 @@
+// SPDX-License-Identifier: MIT
+/*
+ * Copyright © 2026 Intel Corporation
+ */
+
+#include <linux/circ_buf.h>
+
+#include <drm/drm_exec.h>
+#include <drm/drm_managed.h>
+
+#include "xe_access_counter.h"
+#include "xe_access_counter_types.h"
+#include "xe_device.h"
+#include "xe_gt_printk.h"
+#include "xe_hw_engine.h"
+#include "xe_svm.h"
+#include "xe_trace_bo.h"
+#include "xe_usm_queue.h"
+#include "xe_vm.h"
+
+/**
+ * DOC: Xe access counters
+ *
+ * Xe access counters are handled in two layers with one-way communication.
+ * The producer layer interacts with hardware or firmware to receive and parse
+ * access counter notifications into struct xe_access_counter, then forwards them
+ * to the consumer. The consumer layer services the notifications (e.g., memory
+ * migration hints, binding decisions). No acknowledgment is sent back to the
+ * producer. The consumer uses an access counter queue sized to absorb all potential
+ * notifications and a multi-threaded worker to process them. Multiple producers
+ * are supported, with a single shared consumer.
+ *
+ * Each access counter notification covers a VA window of size determined by the
+ * hardware granularity field (64K / 2M / 16M / 64M). That window may span
+ * multiple VMAs or SVM ranges. To avoid starving higher-priority page-fault
+ * handlers that share the same workqueue, the consumer services **one** VMA or
+ * SVM range per work-item invocation. When additional VMAs remain within the
+ * granularity window, a continuation event (with the VA cursor advanced past the
+ * just-serviced VMA) is pushed back into the access counter queue and a new
+ * work item is scheduled. Page-fault work items sharing @pagefault_wq may therefore
+ * jump the queue between consecutive access counter events for the same window.
+ *
+ * xe_access_counter.c implements the consumer layer.
+ */
+static void xe_access_counter_print(struct xe_access_counter *ac)
+{
+ xe_gt_dbg(ac->gt, "\n\tASID: %d\n"
+ "\tVA: 0x%08x%08x\n"
+ "\tCounter Type: %d\n"
+ "\tGranularity: %d\n"
+ "\tSub-Granularity: 0x%08x\n"
+ "\tEngineClass: %d %s\n"
+ "\tEngineInstance: %d\n",
+ ac->consumer.asid,
+ upper_32_bits(ac->consumer.page_va),
+ lower_32_bits(ac->consumer.page_va),
+ ac->consumer.counter_type,
+ ac->consumer.granularity,
+ ac->consumer.sub_granularity,
+ ac->consumer.engine_class,
+ xe_hw_engine_class_to_str(ac->consumer.engine_class),
+ ac->consumer.engine_instance);
+}
+
+static int xe_access_counter_vma_setup(struct xe_vm *vm, struct xe_vma *vma,
+ struct xe_gt *gt)
+{
+ struct xe_tile *tile = gt_to_tile(gt);
+ struct xe_validation_ctx ctx;
+ struct drm_exec exec;
+ struct dma_fence *fence = NULL;
+ int err = 0;
+
+ /*TODO : Handle userptr move to vram */
+ if (xe_vma_has_no_bo(vma))
+ return 0;
+
+ /*
+ * ac_move_fence is also read/cleared by the page-fault handler under
+ * fault_lock; serialize against it since vm->lock is held in read mode.
+ */
+ guard(mutex)(&vma->fault_lock);
+
+ /* Drop duplicate event if migration/rebind is already in-flight */
+ if (vma->ac_move_fence && !dma_fence_is_signaled(vma->ac_move_fence))
+ return 0;
+
+ /* Previous migration completed; release its fence before starting a new one */
+ dma_fence_put(vma->ac_move_fence);
+ vma->ac_move_fence = NULL;
+
+ /*
+ * Ignore duplicate locks: the eligibility check below needs the BO
+ * resv held, so we lock the VMA explicitly and xe_vma_lock_and_validate()
+ * then locks the same BO again.
+ */
+ xe_validation_ctx_init(&ctx, &vm->xe->val, &exec,
+ (struct xe_val_flags) { .exec_ignore_duplicates = true });
+ drm_exec_until_all_locked(&exec) {
+ err = xe_vm_lock_vma(&exec, vma);
+ drm_exec_retry_on_contention(&exec);
+ if (err)
+ break;
+
+ if (!xe_vma_supports_access_ctr(vm->xe, vma, tile))
+ break;
+
+ err = xe_vma_lock_and_validate(&exec, vma, tile->mem.vram, true);
+ drm_exec_retry_on_contention(&exec);
+ xe_validation_retry_on_oom(&ctx, &err);
+ if (err)
+ break;
+
+ xe_vm_set_validation_exec(vm, &exec);
+ fence = xe_vma_rebind(vm, vma, BIT(tile->id));
+ xe_vm_set_validation_exec(vm, NULL);
+ if (IS_ERR(fence))
+ err = PTR_ERR(fence);
+ }
+
+ /*
+ * Migrations and binds are pipelined GPU operations with no H2G ack;
+ * store the fence on the VMA so the page-fault handler can wait on it
+ * if needed, rather than blocking here under vm->lock.
+ */
+ if (!err && fence && !IS_ERR(fence))
+ vma->ac_move_fence = fence;
+
+ xe_validation_ctx_fini(&ctx);
+
+ return err;
+}
+
+static int xe_access_counter_service(struct xe_access_counter *ac)
+{
+ struct xe_gt *gt = ac->gt;
+ struct xe_device *xe = gt_to_xe(gt);
+ struct xe_vm *vm;
+ struct xe_vma *vma;
+ u64 page_va;
+ u64 gran_end;
+ u64 hint_va;
+ int err = 0;
+
+ if (!ac->gran_end || ac->gran_end <= ac->consumer.page_va)
+ return -EINVAL;
+
+ vm = xe_device_asid_to_fault_vm(xe, ac->consumer.asid);
+ if (IS_ERR(vm))
+ return PTR_ERR(vm);
+
+ down_read(&vm->lock);
+
+ if (xe_vm_is_closed(vm)) {
+ err = -ENOENT;
+ goto unlock_vm;
+ }
+
+ if (!IS_DGFX(xe)) {
+ /* Access counter migration hints target device VRAM only. */
+ ac->consumer.page_va = ac->gran_end;
+ goto unlock_vm;
+ }
+
+ page_va = ac->consumer.page_va;
+ gran_end = ac->gran_end;
+
+ /*
+ * Find the first VMA that overlaps the remaining portion of the
+ * granularity window [page_va, gran_end). drm_gpuva_find_first()
+ * skips any unmapped holes and returns the next mapped VMA.
+ * We service exactly one VMA (BO) or one SVM range (cpu_addr_mirror)
+ * per invocation to allow higher-priority page-fault handlers sharing
+ * pagefault_wq to interleave.
+ */
+ vma = xe_vm_find_overlapping_vma(vm, page_va, gran_end - page_va);
+ if (!vma) {
+ /*
+ * No VMA in [page_va, gran_end) — either the entire original
+ * window is unmapped, or all remaining bytes are a trailing
+ * hole after the last serviced VMA. Access counter notifications
+ * are advisory; advance the cursor to gran_end so the caller
+ * sees the window as exhausted and skips any further continuation.
+ */
+ ac->consumer.page_va = gran_end;
+ goto unlock_vm;
+ }
+
+ /*
+ * The found VMA may start *after* page_va — there is a leading hole
+ * in the window at [page_va, xe_vma_start(vma)). Clamp the hint
+ * address to the VMA's actual start so the setup functions receive a
+ * VA that is valid within the VMA.
+ */
+ hint_va = max(page_va, xe_vma_start(vma));
+
+ trace_xe_vma_acc(vma, ac->consumer.counter_type);
+
+ if (xe_vma_is_cpu_addr_mirror(vma)) {
+ struct xe_svm_range *range;
+
+ if (!xe_vma_supports_access_ctr(xe, vma, gt_to_tile(gt))) {
+ ac->consumer.page_va = min(xe_vma_end(vma), gran_end);
+ goto unlock_vm;
+ }
+
+ /*
+ * Find the first existing SVM range in [hint_va, gran_end).
+ * We use range_find (not find_or_insert) because AC events are
+ * fired only after the GPU has already accessed a region; an SVM
+ * range must already exist. Holes and unaccessed addresses are
+ * skipped automatically by the interval tree walk.
+ *
+ * If no range exists, the window is exhausted — advance to
+ * gran_end so no continuation is stored.
+ */
+ range = xe_svm_range_find_first(vm, hint_va, min(xe_vma_end(vma), gran_end));
+ if (!range) {
+ ac->consumer.page_va = min(xe_vma_end(vma), gran_end);
+ goto unlock_vm;
+ }
+
+ err = xe_svm_range_setup(vm, vma, NULL, gt, xe_svm_range_start(range),
+ (struct xe_svm_range_setup_flags) {
+ .atomic = false,
+ .acc_ctr_trigger = true,
+ });
+
+ if (!err)
+ ac->consumer.page_va = min_t(u64,
+ xe_svm_range_end(range),
+ gran_end);
+ xe_svm_range_put(range);
+ } else {
+ err = xe_access_counter_vma_setup(vm, vma, gt);
+ if (!err)
+ ac->consumer.page_va = min(xe_vma_end(vma), gran_end);
+ }
+
+unlock_vm:
+ up_read(&vm->lock);
+ xe_vm_put(vm);
+
+ return err;
+}
+
+static void xe_access_counter_queue_work_func(struct work_struct *w)
+{
+ struct xe_ac_worker *acw = container_of(w, struct xe_ac_worker, work);
+ struct xe_device *xe = acw->xe;
+ struct xe_usm_queue *ac_queue = &xe->usm.ac_queue;
+ struct xe_access_counter ac;
+
+ if (acw->pending.gran_end) {
+ if (acw->pending.consumer.page_va < acw->pending.gran_end) {
+ ac = acw->pending;
+ memset(&acw->pending, 0, sizeof(acw->pending));
+ goto service;
+ }
+ memset(&acw->pending, 0, sizeof(acw->pending));
+ }
+
+ if (!xe_usm_queue_pop(ac_queue, &ac))
+ return;
+
+service:
+ if (ac.gt) {
+ int err = xe_access_counter_service(&ac);
+
+ if (err) {
+ xe_access_counter_print(&ac);
+ xe_gt_dbg(ac.gt, "Access counter handling: Unsuccessful %pe\n",
+ ERR_PTR(err));
+ } else if (ac.consumer.page_va < ac.gran_end) {
+ acw->pending = ac;
+ queue_work(xe->usm.pagefault_wq, w);
+ return;
+ }
+ }
+
+ if (xe_usm_queue_peek(ac_queue))
+ queue_work(xe->usm.pagefault_wq, w);
+}
+
+static void xe_access_counter_queue_init(struct xe_device *xe,
+ struct xe_usm_queue *ac_queue)
+{
+ int i;
+
+ for (i = 0; i < XE_ACCESS_COUNTER_WORKER_COUNT; i++) {
+ xe->usm.ac_workers[i].xe = xe;
+ INIT_WORK(&xe->usm.ac_workers[i].work, xe_access_counter_queue_work_func);
+ }
+}
+
+/**
+ * xe_access_counter_init - Initialize access counter consumer layer
+ * @xe: xe device
+ *
+ * Return: 0 on success, negative error code on error
+ */
+int xe_access_counter_init(struct xe_device *xe)
+{
+ struct xe_usm_queue *ac_queue = &xe->usm.ac_queue;
+
+ if (!xe->info.has_usm)
+ return 0;
+
+ ac_queue->data_size = sizeof(struct xe_access_counter);
+ ac_queue->entry_size = roundup_pow_of_two(ac_queue->data_size);
+#define XE_ACCESS_COUNTER_QUEUE_NUM_ENTRIES 128
+ ac_queue->size = XE_ACCESS_COUNTER_QUEUE_NUM_ENTRIES *
+ ac_queue->entry_size;
+#undef XE_ACCESS_COUNTER_QUEUE_NUM_ENTRIES
+
+ /*
+ * drmm-managed so it outlives destroy_workqueue(pagefault_wq), which
+ * drains the shared AC workers during xe_pagefault_fini.
+ */
+ ac_queue->data = drmm_kzalloc(&xe->drm, ac_queue->size, GFP_KERNEL);
+ if (!ac_queue->data)
+ return -ENOMEM;
+
+ spin_lock_init(&ac_queue->lock);
+ xe_access_counter_queue_init(xe, ac_queue);
+
+ return 0;
+}
+
+static int xe_access_counter_work_index(struct xe_device *xe)
+{
+ lockdep_assert_held(&xe->usm.ac_queue.lock);
+ return xe->usm.ac_workers_indx++ % XE_ACCESS_COUNTER_WORKER_COUNT;
+}
+
+/**
+ * xe_access_counter_handler - Handle an access counter notification
+ * @xe: xe device
+ * @ac: access counter notification
+ *
+ * Sink the access counter notification to a queue and queue a worker
+ * to service it.
+ *
+ * Return: 0 on success, negative error code on error
+ */
+int xe_access_counter_handler(struct xe_device *xe, struct xe_access_counter *ac)
+{
+ struct xe_usm_queue *ac_queue = &xe->usm.ac_queue;
+ int idx;
+ unsigned long flags;
+ bool full;
+
+ spin_lock_irqsave(&ac_queue->lock, flags);
+ idx = xe_access_counter_work_index(xe);
+ full = xe_usm_queue_full(ac_queue);
+ if (!full) {
+ xe_usm_queue_push(ac_queue, ac);
+ queue_work(xe->usm.pagefault_wq, &xe->usm.ac_workers[idx].work);
+ } else {
+ drm_warn(&xe->drm,
+ "AccessCounter Queue full, shouldn't be possible\n");
+ }
+ spin_unlock_irqrestore(&ac_queue->lock, flags);
+
+ return full ? -ENOSPC : 0;
+}
diff --git a/drivers/gpu/drm/xe/xe_access_counter.h b/drivers/gpu/drm/xe/xe_access_counter.h
new file mode 100644
index 000000000000..b3a331687f13
--- /dev/null
+++ b/drivers/gpu/drm/xe/xe_access_counter.h
@@ -0,0 +1,17 @@
+/* SPDX-License-Identifier: MIT */
+/*
+ * Copyright © 2026 Intel Corporation
+ */
+
+#ifndef _XE_ACCESS_COUNTER_H_
+#define _XE_ACCESS_COUNTER_H_
+
+struct xe_device;
+struct xe_gt;
+struct xe_access_counter;
+
+int xe_access_counter_init(struct xe_device *xe);
+
+int xe_access_counter_handler(struct xe_device *xe, struct xe_access_counter *ac);
+
+#endif
diff --git a/drivers/gpu/drm/xe/xe_access_counter_types.h b/drivers/gpu/drm/xe/xe_access_counter_types.h
new file mode 100644
index 000000000000..955d63e2c204
--- /dev/null
+++ b/drivers/gpu/drm/xe/xe_access_counter_types.h
@@ -0,0 +1,143 @@
+/* SPDX-License-Identifier: MIT */
+/*
+ * Copyright © 2026 Intel Corporation
+ */
+
+#ifndef _XE_ACCESS_COUNTER_TYPES_H_
+#define _XE_ACCESS_COUNTER_TYPES_H_
+
+#include <linux/sizes.h>
+#include <linux/types.h>
+#include <linux/workqueue.h>
+
+struct xe_device;
+struct xe_gt;
+struct xe_access_counter;
+
+/** enum xe_access_counter_type - Xe access counter type */
+enum xe_access_counter_type {
+ /** @XE_ACCESS_COUNTER_TYPE_TRIGGER */
+ XE_ACCESS_COUNTER_TYPE_TRIGGER = 0,
+ /** @XE_ACCESS_COUNTER_TYPE_NOTIFY*/
+ XE_ACCESS_COUNTER_TYPE_NOTIFY = 1,
+};
+
+/**
+ * enum xe_access_counter_granularity - Granularity of an AC notification
+ *
+ * Encodes the size of the hot virtual-address window reported by the hardware.
+ * The window starts at &xe_access_counter.consumer.page_va and extends for
+ * the corresponding number of bytes.
+ */
+enum xe_access_counter_granularity {
+ /** @XE_ACCESS_COUNTER_GRANULARITY_128K: 128 KiB window */
+ XE_ACCESS_COUNTER_GRANULARITY_128K = 0,
+ /** @XE_ACCESS_COUNTER_GRANULARITY_2M: 2 MiB window */
+ XE_ACCESS_COUNTER_GRANULARITY_2M = 1,
+ /** @XE_ACCESS_COUNTER_GRANULARITY_16M: 16 MiB window */
+ XE_ACCESS_COUNTER_GRANULARITY_16M = 2,
+ /** @XE_ACCESS_COUNTER_GRANULARITY_64M: 64 MiB window */
+ XE_ACCESS_COUNTER_GRANULARITY_64M = 3,
+};
+
+static inline u64 xe_access_counter_granularity_to_size(u8 granularity)
+{
+ switch (granularity) {
+ case XE_ACCESS_COUNTER_GRANULARITY_128K: return SZ_128K;
+ case XE_ACCESS_COUNTER_GRANULARITY_2M: return SZ_2M;
+ case XE_ACCESS_COUNTER_GRANULARITY_16M: return SZ_16M;
+ case XE_ACCESS_COUNTER_GRANULARITY_64M: return SZ_64M;
+ default:
+ return SZ_128K;
+ }
+}
+
+/**
+ * struct xe_access_counter - Xe access counter
+ *
+ * Generic access counter structure for communication between producer and consumer.
+ * Sized to exactly 64 bytes (roundup_pow_of_two(sizeof(*this)) == 64) so each
+ * queue entry occupies one cache line. Upon a device access counter notification,
+ * the producer populates this structure, and the consumer copies it into the access
+ * counter queue for deferred handling.
+ */
+struct xe_access_counter {
+ /**
+ * @gt: GT of access counter
+ */
+ struct xe_gt *gt;
+ /**
+ * @consumer: State for the software handling the access counter.
+ * Populated by the producer and may be modified by the consumer to
+ * communicate information back to the producer upon acknowledgment.
+ */
+ struct {
+ /** @consumer.page_va: virtual address of page */
+ u64 page_va;
+ /** @consumer.sub_granularity: sub-granularity */
+ u32 sub_granularity;
+ /**
+ * @consumer.counter_type: counter type, u8 rather than enum to
+ * keep size compact
+ */
+ u8 counter_type;
+ /**
+ * @consumer.granularity: access granularity, u8 rather than enum
+ * to keep size compact
+ */
+ u8 granularity;
+ /** @consumer.reserved: reserved bits for alignment */
+ u8 reserved[2];
+ /** @consumer.asid: address space ID */
+ u32 asid;
+ /** @consumer.engine_class: engine class */
+ u8 engine_class;
+ /** @consumer.engine_instance: engine instance */
+ u8 engine_instance;
+ /** @consumer.vfid: VFID */
+ u8 vfid;
+ /** @consumer.reserved1: reserved bits */
+ u8 reserved1;
+ } consumer;
+ /**
+ * @gran_end: end address (exclusive) of the hot VA window.
+ *
+ * Derived by the consumer on first receipt as
+ * ``consumer.page_va + granularity_size``. Preserved across
+ * re-queued continuation events so that @consumer.page_va can
+ * advance through multiple VMAs without losing the original window
+ * boundary. Zero when populated by the producer.
+ */
+ u64 gran_end;
+};
+
+/**
+ * struct xe_ac_worker - Access counter worker context
+ *
+ * Each worker pulls entries from the shared access counter queue
+ * concurrently, eliminating head-of-queue blocking when one event
+ * takes a long time to process.
+ *
+ * Multi-VMA granularity windows are handled iteratively: after servicing
+ * one VMA the worker stores the remaining window state in @pending and
+ * re-queues itself on pf_wq, allowing page-fault handlers to interleave.
+ * @pending is private to this worker — it is never pushed back into the
+ * shared queue — so it cannot be stolen by another ac_worker.
+ */
+struct xe_ac_worker {
+ /** @xe: back-pointer to xe_device */
+ struct xe_device *xe;
+ /** @work: work item scheduled on the USM workqueue */
+ struct work_struct work;
+ /**
+ * @pending: continuation event for the current granularity window.
+ *
+ * Non-zero @pending.gran_end means this worker has more VMAs to
+ * service in an ongoing window. Checked before popping from the
+ * shared queue so the continuation cannot be stolen by peer workers.
+ * Zeroed once the window is fully serviced or on error.
+ */
+ struct xe_access_counter pending;
+};
+
+#endif
diff --git a/drivers/gpu/drm/xe/xe_device.c b/drivers/gpu/drm/xe/xe_device.c
index 205cb4e7f9e8..0bab46f0e4e0 100644
--- a/drivers/gpu/drm/xe/xe_device.c
+++ b/drivers/gpu/drm/xe/xe_device.c
@@ -23,6 +23,7 @@
#include "instructions/xe_gpu_commands.h"
#include "regs/xe_gt_regs.h"
#include "regs/xe_regs.h"
+#include "xe_access_counter.h"
#include "xe_bo.h"
#include "xe_bo_evict.h"
#include "xe_configfs.h"
@@ -997,6 +998,10 @@ int xe_device_probe(struct xe_device *xe)
if (err)
return err;
+ err = xe_access_counter_init(xe);
+ if (err)
+ return err;
+
if (xe->tiles->media_gt &&
XE_GT_WA(xe->tiles->media_gt, 15015404425_disable))
XE_DEVICE_WA_DISABLE(xe, 15015404425);
@@ -1501,3 +1506,28 @@ struct xe_vm *xe_device_asid_to_vm(struct xe_device *xe, u32 asid)
return vm;
}
+
+/**
+ * xe_device_asid_to_fault_vm() - Find FAULT VM from ASID
+ * @xe: the &xe_device
+ * @asid: Address space ID
+ *
+ * Find a FAULTING VM from ASID and take a reference to VM which
+ * caller must drop. Reclaim safe.
+ *
+ * Return: VM on success, ERR_PTR on failure
+ */
+struct xe_vm *xe_device_asid_to_fault_vm(struct xe_device *xe, u32 asid)
+{
+ struct xe_vm *vm;
+
+ down_read(&xe->usm.lock);
+ vm = xa_load(&xe->usm.asid_to_vm, asid);
+ if (vm && xe_vm_in_fault_mode(vm))
+ xe_vm_get(vm);
+ else
+ vm = ERR_PTR(-EINVAL);
+ up_read(&xe->usm.lock);
+
+ return vm;
+}
diff --git a/drivers/gpu/drm/xe/xe_device.h b/drivers/gpu/drm/xe/xe_device.h
index 6d3d6d5eba29..42ddd4a21b48 100644
--- a/drivers/gpu/drm/xe/xe_device.h
+++ b/drivers/gpu/drm/xe/xe_device.h
@@ -273,6 +273,7 @@ int xe_is_injection_active(void);
bool xe_is_xe_file(const struct file *file);
struct xe_vm *xe_device_asid_to_vm(struct xe_device *xe, u32 asid);
+struct xe_vm *xe_device_asid_to_fault_vm(struct xe_device *xe, u32 asid);
#ifdef CONFIG_PCI_IOV
bool xe_device_is_admin_only(const struct xe_device *xe);
diff --git a/drivers/gpu/drm/xe/xe_device_types.h b/drivers/gpu/drm/xe/xe_device_types.h
index f88bacf63c83..3d0e3cc54878 100644
--- a/drivers/gpu/drm/xe/xe_device_types.h
+++ b/drivers/gpu/drm/xe/xe_device_types.h
@@ -12,6 +12,7 @@
#include <drm/drm_file.h>
#include <drm/ttm/ttm_device.h>
+#include "xe_access_counter_types.h"
#include "xe_devcoredump_types.h"
#include "xe_drm_ras_types.h"
#include "xe_heci_gsc.h"
@@ -29,6 +30,7 @@
#include "xe_survivability_mode_types.h"
#include "xe_sysctrl_types.h"
#include "xe_tile_types.h"
+#include "xe_usm_queue.h"
#include "xe_validation.h"
#if IS_ENABLED(CONFIG_DRM_XE_DEBUG)
@@ -336,6 +338,16 @@ struct xe_device {
struct xe_pagefault_work pf_workers[XE_PAGEFAULT_WORK_MAX];
/** @usm.pf_queue: Page fault queue */
struct xe_pagefault_queue pf_queue;
+ /**
+ * @usm.ac_workers_indx: Round-robin index selecting the
+ * next access-counter worker to wake.
+ */
+ u32 ac_workers_indx;
+#define XE_ACCESS_COUNTER_WORKER_COUNT 4
+ /** @usm.ac_workers: Access counter workers */
+ struct xe_ac_worker ac_workers[XE_ACCESS_COUNTER_WORKER_COUNT];
+ /** @usm.ac_queue: Access counter queue */
+ struct xe_usm_queue ac_queue;
#if IS_ENABLED(CONFIG_DRM_XE_PAGEMAP)
/** @usm.dpagemap_shrinker: Shrinker for unused pagemaps */
struct drm_pagemap_shrinker *dpagemap_shrinker;
diff --git a/drivers/gpu/drm/xe/xe_exec_queue.c b/drivers/gpu/drm/xe/xe_exec_queue.c
index e63559a2f582..390288e09b40 100644
--- a/drivers/gpu/drm/xe/xe_exec_queue.c
+++ b/drivers/gpu/drm/xe/xe_exec_queue.c
@@ -436,7 +436,7 @@ static int __xe_exec_queue_init(struct xe_exec_queue *q, u32 exec_queue_flags)
marker = xe_gt_sriov_vf_wait_valid_ggtt(q->gt);
- lrc = xe_lrc_create(q->hwe, q->vm, q->replay_state,
+ lrc = xe_lrc_create(q, q->hwe, q->vm, q->replay_state,
xe_lrc_ring_size(), q->msix_vec, flags);
if (IS_ERR(lrc)) {
err = PTR_ERR(lrc);
@@ -1153,6 +1153,38 @@ static int exec_queue_user_ext_check_final(struct xe_exec_queue *q, u64 properti
return 0;
}
+static int exec_queue_user_ext_set_acc_param(struct xe_device *xe,
+ struct xe_exec_queue *q,
+ u64 extension, u64 *properties)
+{
+ u64 __user *address = u64_to_user_ptr(extension);
+ struct drm_xe_exec_queue_set_acc_param ext;
+ int err;
+
+ if (!xe->info.has_access_counter)
+ return -EINVAL;
+
+ err = copy_from_user(&ext, address, sizeof(ext));
+ if (XE_IOCTL_DBG(xe, err))
+ return -EFAULT;
+
+ if (XE_IOCTL_DBG(xe, ext.pad1 || ext.pad2))
+ return -EINVAL;
+
+ if (XE_IOCTL_DBG(xe, ext.granularity > DRM_XE_ACCESS_COUNTER_GRANULARITY_64M))
+ return -EINVAL;
+
+ if (XE_IOCTL_DBG(xe, ext.notify > ext.trigger))
+ return -EINVAL;
+
+ /* Store access counter parameters in exec queue */
+ q->acc.trigger = ext.trigger;
+ q->acc.notify = ext.notify;
+ q->acc.granularity = ext.granularity;
+
+ return 0;
+}
+
static int exec_queue_user_ext_set_property(struct xe_device *xe,
struct xe_exec_queue *q,
u64 extension, u64 *properties)
@@ -1199,6 +1231,7 @@ typedef int (*xe_exec_queue_user_extension_fn)(struct xe_device *xe,
static const xe_exec_queue_user_extension_fn exec_queue_user_extension_funcs[] = {
[DRM_XE_EXEC_QUEUE_EXTENSION_SET_PROPERTY] = exec_queue_user_ext_set_property,
+ [DRM_XE_EXEC_QUEUE_EXTENSION_SET_ACC_PARAM] = exec_queue_user_ext_set_acc_param,
};
#define MAX_USER_EXTENSIONS 16
diff --git a/drivers/gpu/drm/xe/xe_exec_queue_types.h b/drivers/gpu/drm/xe/xe_exec_queue_types.h
index 836f88fc0faa..c5777689eead 100644
--- a/drivers/gpu/drm/xe/xe_exec_queue_types.h
+++ b/drivers/gpu/drm/xe/xe_exec_queue_types.h
@@ -265,6 +265,15 @@ struct xe_exec_queue {
/** @replay_state: GPU hang replay state */
void *replay_state;
+ /** @acc: Access counter parameters */
+ struct {
+ /** @acc.trigger: Access counter trigger threshold */
+ u16 trigger;
+ /** @acc.notify: Access counter notify threshold */
+ u16 notify;
+ /** @acc.granularity: Access counter granularity */
+ u8 granularity;
+ } acc;
/** @ops: submission backend exec queue operations */
const struct xe_exec_queue_ops *ops;
diff --git a/drivers/gpu/drm/xe/xe_execlist.c b/drivers/gpu/drm/xe/xe_execlist.c
index a36db39dcda8..14d5f90e234d 100644
--- a/drivers/gpu/drm/xe/xe_execlist.c
+++ b/drivers/gpu/drm/xe/xe_execlist.c
@@ -259,7 +259,7 @@ struct xe_execlist_port *xe_execlist_port_create(struct xe_device *xe,
port->hwe = hwe;
- port->lrc = xe_lrc_create(hwe, NULL, NULL, SZ_16K, XE_IRQ_DEFAULT_MSIX, 0);
+ port->lrc = xe_lrc_create(NULL, hwe, NULL, NULL, SZ_16K, XE_IRQ_DEFAULT_MSIX, 0);
if (IS_ERR(port->lrc)) {
err = PTR_ERR(port->lrc);
goto err;
diff --git a/drivers/gpu/drm/xe/xe_guc_access_counter.c b/drivers/gpu/drm/xe/xe_guc_access_counter.c
new file mode 100644
index 000000000000..7e9b835e1ed6
--- /dev/null
+++ b/drivers/gpu/drm/xe/xe_guc_access_counter.c
@@ -0,0 +1,74 @@
+// SPDX-License-Identifier: MIT
+/*
+ * Copyright © 2026 Intel Corporation
+ */
+
+#include "xe_guc_access_counter.h"
+
+#include "xe_access_counter.h"
+#include "xe_device.h"
+#include "xe_exec_queue.h"
+#include "xe_gt.h"
+#include "xe_guc.h"
+#include "xe_guc_fwif.h"
+#include "xe_guc_submit.h"
+#include "xe_printk.h"
+
+static u64 xe_guc_access_counter_page_va(struct xe_device *xe, u64 addr, u8 gran)
+{
+ u64 gran_size = xe_access_counter_granularity_to_size(gran);
+ u64 sub_gran_size = gran_size / 32;
+ u64 region_base = ALIGN_DOWN(addr, gran_size);
+ u64 offset_in_subchunk = addr & (sub_gran_size - 1);
+ u64 page_va = region_base + offset_in_subchunk;
+
+ xe_dbg(xe, "gran_size = %llx, addr = = %llx, region_base = %llx, page_va=%llx\n",
+ gran_size, addr, region_base, page_va);
+ return page_va;
+}
+
+/**
+ * xe_guc_access_counter_handler() - G2H access counter handler
+ * @guc: GuC object
+ * @msg: G2H message
+ * @len: Length of G2H message
+ *
+ * Parse GuC to host (G2H) message into a struct xe_access_counter and forward
+ * onto the Xe access counter layer.
+ *
+ * Return: 0 on success, negative error code on failure
+ */
+int xe_guc_access_counter_handler(struct xe_guc *guc, u32 *msg, u32 len)
+{
+ struct xe_access_counter ac = {};
+ struct xe_device *xe = guc_to_xe(guc);
+ u64 addr;
+#define GUC_ACC_MSG_LEN_DW \
+ (sizeof(struct xe_guc_acc_desc) / sizeof(u32))
+
+ if (len != GUC_ACC_MSG_LEN_DW)
+ return -EPROTO;
+
+ ac.gt = guc_to_gt(guc);
+
+ /* Parse access counter descriptor */
+ ac.consumer.granularity = FIELD_GET(ACC_GRANULARITY, msg[2]);
+ ac.consumer.sub_granularity = FIELD_GET(ACC_SUBG_HI, msg[1]) << ACC_SUBG_LO_WIDTH |
+ FIELD_GET(ACC_SUBG_LO, msg[0]);
+ ac.consumer.counter_type = FIELD_GET(ACC_TYPE, msg[0]);
+ if (ac.consumer.counter_type > XE_ACCESS_COUNTER_TYPE_NOTIFY)
+ return -EINVAL;
+
+ addr = ((u64)(msg[3] & ACC_VIRTUAL_ADDR_RANGE_HI) << 32) |
+ (msg[2] & ACC_VIRTUAL_ADDR_RANGE_LO);
+ ac.consumer.page_va = xe_guc_access_counter_page_va(xe, addr, ac.consumer.granularity);
+ ac.gran_end = ac.consumer.page_va +
+ xe_access_counter_granularity_to_size(ac.consumer.granularity);
+ ac.consumer.asid = FIELD_GET(ACC_ASID, msg[1]);
+ ac.consumer.engine_class = FIELD_GET(ACC_ENG_CLASS, msg[1]);
+ ac.consumer.engine_instance = FIELD_GET(ACC_ENG_INSTANCE, msg[1]);
+ ac.consumer.vfid = FIELD_GET(ACC_VFID, msg[2]);
+#undef GUC_ACC_MSG_LEN_DW
+
+ return xe_access_counter_handler(xe, &ac);
+}
diff --git a/drivers/gpu/drm/xe/xe_guc_access_counter.h b/drivers/gpu/drm/xe/xe_guc_access_counter.h
new file mode 100644
index 000000000000..1ac8e76398d2
--- /dev/null
+++ b/drivers/gpu/drm/xe/xe_guc_access_counter.h
@@ -0,0 +1,15 @@
+/* SPDX-License-Identifier: MIT */
+/*
+ * Copyright © 2025 Intel Corporation
+ */
+
+#ifndef _XE_GUC_ACCESS_COUNTER_H_
+#define _XE_GUC_ACCESS_COUNTER_H_
+
+#include <linux/types.h>
+
+struct xe_guc;
+
+int xe_guc_access_counter_handler(struct xe_guc *guc, u32 *msg, u32 len);
+
+#endif
diff --git a/drivers/gpu/drm/xe/xe_guc_ct.c b/drivers/gpu/drm/xe/xe_guc_ct.c
index 5c4733da385c..3068cbbff8c7 100644
--- a/drivers/gpu/drm/xe/xe_guc_ct.c
+++ b/drivers/gpu/drm/xe/xe_guc_ct.c
@@ -26,6 +26,7 @@
#include "xe_gt_sriov_pf_monitor.h"
#include "xe_guc.h"
#include "xe_guc_log.h"
+#include "xe_guc_access_counter.h"
#include "xe_guc_pagefault.h"
#include "xe_guc_relay.h"
#include "xe_guc_submit.h"
@@ -1753,6 +1754,9 @@ static int process_g2h_msg(struct xe_guc_ct *ct, u32 *msg, u32 len)
case XE_GUC_ACTION_REPORT_PAGE_FAULT_REQ_DESC:
ret = xe_guc_pagefault_handler(guc, payload, adj_len);
break;
+ case XE_GUC_ACTION_ACCESS_COUNTER_NOTIFY:
+ ret = xe_guc_access_counter_handler(guc, payload, adj_len);
+ break;
case XE_GUC_ACTION_TLB_INVALIDATION_DONE:
ret = xe_guc_tlb_inval_done_handler(guc, payload, adj_len);
break;
diff --git a/drivers/gpu/drm/xe/xe_guc_fwif.h b/drivers/gpu/drm/xe/xe_guc_fwif.h
index 971b850f2136..a2a77b252d3e 100644
--- a/drivers/gpu/drm/xe/xe_guc_fwif.h
+++ b/drivers/gpu/drm/xe/xe_guc_fwif.h
@@ -299,6 +299,7 @@ struct xe_guc_acc_desc {
#define ACC_TRIGGER 0
#define ACC_NOTIFY 1
#define ACC_SUBG_LO GENMASK(31, 1)
+#define ACC_SUBG_LO_WIDTH 31
u32 dw1;
#define ACC_SUBG_HI BIT(0)
diff --git a/drivers/gpu/drm/xe/xe_lrc.c b/drivers/gpu/drm/xe/xe_lrc.c
index f1cf1463f1b2..991a17f283de 100644
--- a/drivers/gpu/drm/xe/xe_lrc.c
+++ b/drivers/gpu/drm/xe/xe_lrc.c
@@ -1516,8 +1516,10 @@ static void xe_lrc_set_gpgpu_preemption_level(struct xe_lrc *lrc, struct xe_gt *
xe_lrc_write_ctx_reg(lrc, CTX_CS_CHICKEN1, val);
}
-static int xe_lrc_ctx_init(struct xe_lrc *lrc, struct xe_hw_engine *hwe, struct xe_vm *vm,
- void *replay_state, u16 msix_vec, u32 init_flags)
+static int xe_lrc_ctx_init(struct xe_lrc *lrc, struct xe_exec_queue *q,
+ struct xe_hw_engine *hwe, struct xe_vm *vm,
+ void *replay_state,
+ u16 msix_vec, u32 init_flags)
{
struct xe_gt *gt = hwe->gt;
struct xe_tile *tile = gt_to_tile(gt);
@@ -1616,8 +1618,20 @@ static int xe_lrc_ctx_init(struct xe_lrc *lrc, struct xe_hw_engine *hwe, struct
xe_lrc_write_ctx_reg(lrc, CTX_QUEUE_TIMESTAMP_UDW, 0);
}
- if (xe->info.has_asid && vm)
- xe_lrc_write_ctx_reg(lrc, CTX_ASID, vm->usm.asid);
+ if (xe->info.has_asid && vm) {
+ u32 asid;
+
+ if (q)
+ asid = vm->usm.asid | ACC_GRANULARITY_VAL(q->acc.granularity);
+ else
+ asid = vm->usm.asid;
+ xe_lrc_write_ctx_reg(lrc, CTX_ASID, asid);
+ }
+
+ if (q && xe->info.has_access_counter && vm)
+ xe_lrc_write_ctx_reg(lrc, CTX_ACC_CTR_THOLD,
+ ACC_NOTIFY_VAL(q->acc.notify) |
+ ACC_TRIGGER_VAL(q->acc.trigger));
if (GRAPHICS_VER(xe) >= 20 && hwe->class == XE_ENGINE_CLASS_RENDER)
xe_lrc_set_gpgpu_preemption_level(lrc, gt);
@@ -1662,7 +1676,8 @@ static int xe_lrc_ctx_init(struct xe_lrc *lrc, struct xe_hw_engine *hwe, struct
return err;
}
-static int xe_lrc_init(struct xe_lrc *lrc, struct xe_hw_engine *hwe, struct xe_vm *vm,
+static int xe_lrc_init(struct xe_lrc *lrc, struct xe_exec_queue *q,
+ struct xe_hw_engine *hwe, struct xe_vm *vm,
void *replay_state, u32 ring_size, u16 msix_vec, u32 init_flags)
{
struct xe_gt *gt = hwe->gt;
@@ -1718,7 +1733,7 @@ static int xe_lrc_init(struct xe_lrc *lrc, struct xe_hw_engine *hwe, struct xe_v
xe_hw_fence_ctx_init(&lrc->fence_ctx, hwe->gt,
hwe->fence_irq, hwe->name);
- err = xe_lrc_ctx_init(lrc, hwe, vm, replay_state, msix_vec, init_flags);
+ err = xe_lrc_ctx_init(lrc, q, hwe, vm, replay_state, msix_vec, init_flags);
if (err)
goto err_lrc_finish;
@@ -1734,6 +1749,7 @@ static int xe_lrc_init(struct xe_lrc *lrc, struct xe_hw_engine *hwe, struct xe_v
/**
* xe_lrc_create - Create a LRC
+ * @q: Exec queue (can be NULL for kernel queues)
* @hwe: Hardware Engine
* @vm: The VM (address space)
* @replay_state: GPU hang replay state
@@ -1746,8 +1762,9 @@ static int xe_lrc_init(struct xe_lrc *lrc, struct xe_hw_engine *hwe, struct xe_v
* Return pointer to created LRC upon success and an error pointer
* upon failure.
*/
-struct xe_lrc *xe_lrc_create(struct xe_hw_engine *hwe, struct xe_vm *vm,
- void *replay_state, u32 ring_size, u16 msix_vec, u32 flags)
+struct xe_lrc *xe_lrc_create(struct xe_exec_queue *q, struct xe_hw_engine *hwe,
+ struct xe_vm *vm, void *replay_state, u32 ring_size,
+ u16 msix_vec, u32 flags)
{
struct xe_lrc *lrc;
int err;
@@ -1756,7 +1773,7 @@ struct xe_lrc *xe_lrc_create(struct xe_hw_engine *hwe, struct xe_vm *vm,
if (!lrc)
return ERR_PTR(-ENOMEM);
- err = xe_lrc_init(lrc, hwe, vm, replay_state, ring_size, msix_vec, flags);
+ err = xe_lrc_init(lrc, q, hwe, vm, replay_state, ring_size, msix_vec, flags);
if (err) {
kfree(lrc);
return ERR_PTR(err);
diff --git a/drivers/gpu/drm/xe/xe_lrc.h b/drivers/gpu/drm/xe/xe_lrc.h
index a8ff4e59a1f4..006b3628f360 100644
--- a/drivers/gpu/drm/xe/xe_lrc.h
+++ b/drivers/gpu/drm/xe/xe_lrc.h
@@ -61,8 +61,9 @@ struct xe_lrc_snapshot {
#define XE_LRC_CREATE_USER_CTX BIT(2)
#define XE_LRC_DISABLE_STATE_CACHE_PERF_FIX BIT(3)
-struct xe_lrc *xe_lrc_create(struct xe_hw_engine *hwe, struct xe_vm *vm,
- void *replay_state, u32 ring_size, u16 msix_vec, u32 flags);
+struct xe_lrc *xe_lrc_create(struct xe_exec_queue *q, struct xe_hw_engine *hwe,
+ struct xe_vm *vm, void *replay_state,
+ u32 ring_size, u16 msix_vec, u32 flags);
void xe_lrc_destroy(struct kref *ref);
/**
diff --git a/drivers/gpu/drm/xe/xe_pagefault.c b/drivers/gpu/drm/xe/xe_pagefault.c
index c82b8bc8bc70..58ad38aeb75c 100644
--- a/drivers/gpu/drm/xe/xe_pagefault.c
+++ b/drivers/gpu/drm/xe/xe_pagefault.c
@@ -114,37 +114,6 @@ static int xe_pagefault_entry_size(void)
return roundup_pow_of_two(sizeof(struct xe_pagefault));
}
-static int xe_pagefault_begin(struct drm_exec *exec, struct xe_vma *vma,
- struct xe_vram_region *vram, bool need_vram_move)
-{
- struct xe_bo *bo = xe_vma_bo(vma);
- struct xe_vm *vm = xe_vma_vm(vma);
- int err;
-
- err = xe_vm_lock_vma(exec, vma);
- if (err)
- return err;
-
- if (!bo)
- return 0;
-
- /*
- * Skip validate/migrate for DONTNEED/purged BOs - repopulating
- * their pages would prevent the shrinker from reclaiming them.
- * For non-scratch VMs there is no safe fallback so fail the fault.
- * For scratch VMs let xe_vma_rebind() run normally; it will install
- * scratch PTEs so the GPU gets safe zero reads instead of faulting.
- */
- if (unlikely(xe_bo_madv_is_dontneed(bo) || xe_bo_is_purged(bo))) {
- if (!xe_vm_has_scratch(vm))
- return -EACCES;
- return 0;
- }
-
- return need_vram_move ? xe_bo_migrate(bo, vram->placement, NULL, exec) :
- xe_bo_validate(bo, vm, true, exec);
-}
-
static int xe_pagefault_handle_vma(struct xe_gt *gt, struct xe_vma *vma,
struct xe_pagefault *pf, bool atomic)
{
@@ -168,6 +137,15 @@ static int xe_pagefault_handle_vma(struct xe_gt *gt, struct xe_vma *vma,
trace_xe_vma_pagefault(vma);
guard(mutex)(&vma->fault_lock);
+ /*
+ * If an access-counter triggered migration is in-flight, wait for it
+ * to complete before checking whether the GPU mapping is already valid.
+ */
+ if (vma->ac_move_fence) {
+ dma_fence_wait(vma->ac_move_fence, false);
+ dma_fence_put(vma->ac_move_fence);
+ vma->ac_move_fence = NULL;
+ }
/* Check if VMA is valid, opportunistic check only */
if (xe_vm_has_valid_gpu_mapping(tile, vma->tile_present,
@@ -191,8 +169,8 @@ static int xe_pagefault_handle_vma(struct xe_gt *gt, struct xe_vma *vma,
xe_validation_ctx_init(&ctx, &vm->xe->val, &exec,
(struct xe_val_flags) {});
drm_exec_until_all_locked(&exec) {
- err = xe_pagefault_begin(&exec, vma, tile->mem.vram,
- needs_vram == 1);
+ err = xe_vma_lock_and_validate(&exec, vma, tile->mem.vram,
+ needs_vram == 1);
drm_exec_retry_on_contention(&exec);
xe_validation_retry_on_oom(&ctx, &err);
if (err)
@@ -230,21 +208,6 @@ xe_pagefault_access_is_atomic(enum xe_pagefault_access_type access_type)
return (access_type & XE_PAGEFAULT_ACCESS_TYPE_MASK) == XE_PAGEFAULT_ACCESS_TYPE_ATOMIC;
}
-static struct xe_vm *xe_pagefault_asid_to_vm(struct xe_device *xe, u32 asid)
-{
- struct xe_vm *vm;
-
- down_read(&xe->usm.lock);
- vm = xa_load(&xe->usm.asid_to_vm, asid);
- if (vm && xe_vm_in_fault_mode(vm))
- xe_vm_get(vm);
- else
- vm = ERR_PTR(-EINVAL);
- up_read(&xe->usm.lock);
-
- return vm;
-}
-
static int xe_pagefault_service(struct xe_pagefault *pf)
{
struct xe_gt *gt = pf->gt;
@@ -259,7 +222,7 @@ static int xe_pagefault_service(struct xe_pagefault *pf)
if (pf->consumer.fault_type_level == XE_PAGEFAULT_TYPE_LEVEL_NACK)
return -EFAULT;
- vm = xe_pagefault_asid_to_vm(xe, asid);
+ vm = xe_device_asid_to_fault_vm(xe, asid);
if (IS_ERR(vm))
return PTR_ERR(vm);
@@ -576,26 +539,13 @@ static void xe_pagefault_print(struct xe_pagefault *pf)
static void xe_pagefault_save_to_vm(struct xe_device *xe, struct xe_pagefault *pf)
{
struct xe_vm *vm;
+ u32 asid = FIELD_GET(XE_PAGEFAULT_ASID_MASK, pf->consumer.id);
- /*
- * Pagefault may be asociated to VM that is not in fault mode.
- * Perform asid_to_vm behavior, except if VM is not in fault
- * mode, return VM anyways.
- */
- down_read(&xe->usm.lock);
- vm = xa_load(&xe->usm.asid_to_vm,
- FIELD_GET(XE_PAGEFAULT_ASID_MASK, pf->consumer.id));
- if (vm)
- xe_vm_get(vm);
- else
- vm = ERR_PTR(-EINVAL);
- up_read(&xe->usm.lock);
-
+ vm = xe_device_asid_to_vm(xe, asid);
if (IS_ERR(vm))
return;
xe_vm_add_fault_entry_pf(vm, pf);
-
xe_vm_put(vm);
}
diff --git a/drivers/gpu/drm/xe/xe_pt.c b/drivers/gpu/drm/xe/xe_pt.c
index 7fb2fe1f826c..5dee40d82ee1 100644
--- a/drivers/gpu/drm/xe/xe_pt.c
+++ b/drivers/gpu/drm/xe/xe_pt.c
@@ -862,6 +862,27 @@ xe_pt_stage_bind(struct xe_tile *tile, struct xe_vma *vma,
XE_USM_PPGTT_PTE_AE : 0;
}
+ if (!xe_vma_supports_access_ctr(xe, vma, tile)) {
+ xe_walk.default_vram_pte |= XE_PPGTT_PTE_NC;
+ xe_walk.default_system_pte |= XE_PPGTT_PTE_NC;
+ }
+
+ if (range) {
+ /*
+ * Always set NC (no-count) on VRAM PTEs for SVM ranges so
+ * this GPU does not generate access counter events for memory
+ * it is already responsible for. Today default_vram_pte
+ * covers only local VRAM; once UAL lands, remote-device VRAM
+ * pages will also flow through default_vram_pte — NC remains
+ * the right setting there too, as the owning device handles
+ * AC for its own local memory. Update this comment when UAL
+ * support is added and adjust if the semantics change.
+ */
+ xe_walk.default_vram_pte |= XE_PPGTT_PTE_NC;
+ if (!xe_svm_range_allowed_in_devmem(range))
+ xe_walk.default_system_pte |= XE_PPGTT_PTE_NC;
+ }
+
xe_walk.default_vram_pte |= XE_PPGTT_PTE_DM;
xe_walk.dma_offset = (bo && !is_purged) ? vram_region_gpu_offset(bo->ttm.resource) : 0;
if (!range)
diff --git a/drivers/gpu/drm/xe/xe_svm.c b/drivers/gpu/drm/xe/xe_svm.c
index 6c3033fc4db7..2aafeedf0514 100644
--- a/drivers/gpu/drm/xe/xe_svm.c
+++ b/drivers/gpu/drm/xe/xe_svm.c
@@ -31,6 +31,41 @@
#define XE_PEER_PAGEMAP ((void *)0ul)
#define XE_PEER_VM ((void *)1ul)
+/**
+ * DOC: SVM access counter migration policy
+ *
+ * Access counters are a hardware mechanism that tracks how frequently the GPU
+ * accesses memory regions. When counters become hot, the kernel driver can
+ * migrate memory to device-local VRAM for better performance. The policy
+ * governing when and where AC-triggered migration happens is as follows:
+ *
+ * 1. Explicit preferred location (set via madvise DRM_XE_MEM_RANGE_ATTR_PREFERRED_LOC):
+ *
+ * - If the preferred location resolves to a specific GPU tile, only that
+ * tile's PTEs have the NC (no-count) bit clear, so only that GPU generates
+ * AC events and triggers migration. All other GPUs map the memory with
+ * NC set and never generate AC events for it.
+ * - If the preferred location is system memory (DRM_XE_PREFERRED_LOC_DEFAULT_SYSTEM),
+ * all GPUs map with NC set — no AC-triggered migration occurs.
+ *
+ * 2. No explicit preference (default — DRM_XE_PREFERRED_LOC_DEFAULT_DEVICE or unset):
+ *
+ * First-touch-then-migrate-on-hot policy:
+ * - The first GPU to fault the range migrates it to that GPU's local VRAM
+ * (device-side first-touch placement).
+ * - NC is left clear on all tiles, so any other GPU that subsequently
+ * accesses the range keeps counting; once its access counter becomes
+ * hot the range is migrated to that GPU's local VRAM.
+ * - The GPU that fires the AC event wins placement.
+ *
+ * 3. Migrate only once hot (opt-in via DRM_XE_VM_BIND_FLAG_MIGRATE_ON_ACCESS_COUNTER):
+ *
+ * Like policy 2, but the eager first-touch migration is skipped: the range
+ * stays where the CPU placed it on the initial GPU page fault and is
+ * migrated to a GPU's local VRAM only once that GPU's access counter
+ * reports it hot, avoiding unnecessary early migrations.
+ */
+
/**
* DOC: drm_pagemap reference-counting in xe:
*
@@ -1265,9 +1300,10 @@ DECL_SVM_RANGE_US_STATS(get_pages, GET_PAGES)
DECL_SVM_RANGE_US_STATS(bind, BIND)
DECL_SVM_RANGE_US_STATS(fault, PAGEFAULT)
-static int __xe_svm_handle_pagefault(struct xe_vm *vm, struct xe_vma *vma,
- struct xe_pagefault *pf, struct xe_gt *gt,
- u64 fault_addr, bool need_vram)
+static int __xe_svm_range_setup(struct xe_vm *vm, struct xe_vma *vma,
+ struct xe_pagefault *pf, struct xe_gt *gt,
+ u64 fault_addr, bool need_vram,
+ bool acc_ctr_trigger)
{
int devmem_possible = IS_DGFX(vm->xe) &&
IS_ENABLED(CONFIG_DRM_XE_PAGEMAP);
@@ -1275,7 +1311,7 @@ static int __xe_svm_handle_pagefault(struct xe_vm *vm, struct xe_vma *vma,
.read_only = xe_vma_read_only(vma),
.devmem_possible = devmem_possible,
.check_pages_threshold = devmem_possible ? SZ_64K : 0,
- .devmem_only = need_vram && devmem_possible,
+ .devmem_only = (need_vram || acc_ctr_trigger) && devmem_possible,
.timeslice_ms = need_vram && devmem_possible ?
vm->xe->atomic_svm_timeslice_ms : 0,
};
@@ -1293,7 +1329,8 @@ static int __xe_svm_handle_pagefault(struct xe_vm *vm, struct xe_vma *vma,
lockdep_assert_held(&vm->lock);
xe_assert(vm->xe, xe_vma_is_cpu_addr_mirror(vma));
- xe_gt_stats_incr(gt, XE_GT_STATS_ID_SVM_PAGEFAULT_COUNT, 1);
+ if (!acc_ctr_trigger)
+ xe_gt_stats_incr(gt, XE_GT_STATS_ID_SVM_PAGEFAULT_COUNT, 1);
retry:
/* Release old range */
@@ -1315,7 +1352,8 @@ static int __xe_svm_handle_pagefault(struct xe_vm *vm, struct xe_vma *vma,
if (IS_ERR(range))
return PTR_ERR(range);
- xe_svm_range_fault_count_stats_incr(gt, range);
+ if (!acc_ctr_trigger)
+ xe_svm_range_fault_count_stats_incr(gt, range);
mutex_lock(&range->lock);
@@ -1331,13 +1369,32 @@ static int __xe_svm_handle_pagefault(struct xe_vm *vm, struct xe_vma *vma,
if (xe_svm_range_is_valid(range, tile, ctx.devmem_only, dpagemap)) {
xe_svm_range_valid_fault_count_stats_incr(gt, range);
- range_debug(range, "PAGE FAULT - VALID");
+ range_debug(range, acc_ctr_trigger ?
+ "ACCESS COUNTER TRIGGERED - VALID" :
+ "PAGE FAULT - VALID");
goto out;
}
- range_debug(range, "PAGE FAULT");
+ range_debug(range, acc_ctr_trigger ?
+ "ACCESS COUNTER TRIGGERED" : "PAGE FAULT");
+
+ /*
+ * AC-triggered setup: if the range is already in device memory a
+ * rebind is all that's needed. Otherwise proceed to the
+ * migration path — with no explicit madvise preferred location, the
+ * default first-touch-then-migrate-on-hot policy applies and we
+ * should attempt VRAM placement for this hot range.
+ */
+ if (acc_ctr_trigger && !range_flags.migrate_devmem)
+ goto out;
+ /*
+ * With MIGRATE_ON_ACCESS_COUNTER, defer first placement to access
+ * counters: skip the eager migrate on a normal page fault, but still
+ * migrate when this setup was itself triggered by an AC event.
+ */
if (--migrate_try_count >= 0 &&
+ (acc_ctr_trigger || !(vma->gpuva.flags & XE_VMA_MIGRATE_ON_ACC)) &&
xe_svm_range_needs_migrate_to_vram(range, vma, dpagemap)) {
ktime_t migrate_start = xe_gt_stats_ktime_get();
@@ -1375,6 +1432,10 @@ static int __xe_svm_handle_pagefault(struct xe_vm *vm, struct xe_vma *vma,
range_debug(range, "GET PAGES");
err = xe_svm_range_get_pages(vm, range, &ctx);
+ if (err == -EOPNOTSUPP)
+ range_debug(range, acc_ctr_trigger ?
+ "ACCESS COUNTER TRIGGERED - EVICTED PAGES" :
+ "PAGE FAULT - EVICTED PAGES");
/* Corner where CPU mappings have changed */
if (err == -EOPNOTSUPP || err == -EFAULT || err == -EPERM) {
ctx.timeslice_ms <<= 1; /* Double timeslice if we have to retry */
@@ -1382,7 +1443,9 @@ static int __xe_svm_handle_pagefault(struct xe_vm *vm, struct xe_vma *vma,
drm_dbg(&vm->xe->drm,
"Get pages failed, falling back to retrying, asid=%u, gpusvm=%p, errno=%pe\n",
vm->usm.asid, &vm->svm.gpusvm, ERR_PTR(err));
- range_debug(range, "PAGE FAULT - RETRY PAGES");
+ range_debug(range, acc_ctr_trigger ?
+ "ACCESS COUNTER TRIGGERED - RETRY PAGES" :
+ "PAGE FAULT - RETRY PAGES");
goto retry;
} else {
xe_log_err(gt, PAGEFAULT, err,
@@ -1391,7 +1454,9 @@ static int __xe_svm_handle_pagefault(struct xe_vm *vm, struct xe_vma *vma,
}
}
if (err) {
- range_debug(range, "PAGE FAULT - FAIL PAGE COLLECT");
+ range_debug(range, acc_ctr_trigger ?
+ "ACCESS COUNTER TRIGGERED - FAIL PAGE COLLECT" :
+ "PAGE FAULT - FAIL PAGE COLLECT");
goto err_out;
} else if (IS_ENABLED(CONFIG_DRM_XE_DEBUG_VM)) {
drm_dbg(&vm->xe->drm, "After page collect data location is %sin \"%s\".\n",
@@ -1400,7 +1465,9 @@ static int __xe_svm_handle_pagefault(struct xe_vm *vm, struct xe_vma *vma,
}
xe_svm_range_get_pages_us_stats_incr(gt, range, get_pages_start);
- range_debug(range, "PAGE FAULT - BIND");
+
+ range_debug(range, acc_ctr_trigger ?
+ "ACCESS COUNTER TRIGGERED - BIND" : "PAGE FAULT - BIND");
bind_start = xe_gt_stats_ktime_get();
xe_validation_guard(&vctx, &vm->xe->val, &exec, (struct xe_val_flags) {}, err) {
@@ -1426,11 +1493,12 @@ static int __xe_svm_handle_pagefault(struct xe_vm *vm, struct xe_vma *vma,
xe_svm_range_bind_us_stats_incr(gt, range, bind_start);
out:
- /* Give hint to immediately ack faults */
- xe_pagefault_set_start_addr(pf, xe_svm_range_start(range));
- xe_pagefault_set_end_addr(pf, xe_svm_range_end(range));
-
- xe_svm_range_fault_us_stats_incr(gt, range, start);
+ if (!acc_ctr_trigger) {
+ /* Give hint to immediately ack faults */
+ xe_pagefault_set_start_addr(pf, xe_svm_range_start(range));
+ xe_pagefault_set_end_addr(pf, xe_svm_range_end(range));
+ xe_svm_range_fault_us_stats_incr(gt, range, start);
+ }
mutex_unlock(&range->lock);
drm_gpusvm_range_put(&range->base);
return 0;
@@ -1438,7 +1506,9 @@ static int __xe_svm_handle_pagefault(struct xe_vm *vm, struct xe_vma *vma,
err_out:
if (err == -EAGAIN) {
ctx.timeslice_ms <<= 1; /* Double timeslice if we have to retry */
- range_debug(range, "PAGE FAULT - RETRY BIND");
+ range_debug(range, acc_ctr_trigger ?
+ "ACCESS COUNTER TRIGGERED - RETRY BIND" :
+ "PAGE FAULT - RETRY BIND");
goto retry;
}
@@ -1449,37 +1519,38 @@ static int __xe_svm_handle_pagefault(struct xe_vm *vm, struct xe_vma *vma,
}
/**
- * xe_svm_handle_pagefault() - SVM handle page fault
+ * xe_svm_range_setup - Setup range for GPU access
* @vm: The VM.
* @vma: The CPU address mirror VMA.
* @pf: Pagefault structure
- * @gt: The gt upon the fault occurred.
- * @fault_addr: The GPU fault address.
- * @atomic: The fault atomic access bit.
+ * @gt: The gt for which binding.
+ * @addr: Addr for which need to bind svm range.
+ * @flags: struct xe_svm_range_setup_flags
*
- * Create GPU bindings for a SVM page fault. Optionally migrate to device
+ * Create GPU bindings for a SVM vma. Optionally migrate to device
* memory.
*
* Return: 0 on success, negative error code on error.
*/
-int xe_svm_handle_pagefault(struct xe_vm *vm, struct xe_vma *vma,
- struct xe_pagefault *pf, struct xe_gt *gt,
- u64 fault_addr, bool atomic)
+int xe_svm_range_setup(struct xe_vm *vm, struct xe_vma *vma,
+ struct xe_pagefault *pf, struct xe_gt *gt,
+ u64 addr, struct xe_svm_range_setup_flags flags)
{
int need_vram, ret;
retry:
- need_vram = xe_vma_need_vram_for_atomic(vm->xe, vma, atomic);
+ need_vram = xe_vma_need_vram_for_atomic(vm->xe, vma, flags.atomic);
if (need_vram < 0)
return need_vram;
- ret = __xe_svm_handle_pagefault(vm, vma, pf, gt, fault_addr,
- need_vram ? true : false);
+ ret = __xe_svm_range_setup(vm, vma, pf, gt, addr,
+ need_vram ? true : false,
+ flags.acc_ctr_trigger);
if (ret == -EAGAIN) {
/*
* Retry once on -EAGAIN to re-lookup the VMA, as the original VMA
* may have been split by xe_svm_range_set_default_attr.
*/
- vma = xe_vm_find_vma_by_addr(vm, fault_addr);
+ vma = xe_vm_find_vma_by_addr(vm, addr);
if (!vma)
return -EINVAL;
@@ -1488,6 +1559,70 @@ int xe_svm_handle_pagefault(struct xe_vm *vm, struct xe_vma *vma,
return ret;
}
+/**
+ * xe_svm_handle_pagefault() - SVM handle page fault
+ * @vm: The VM.
+ * @vma: The CPU address mirror VMA.
+ * @pf: Pagefault structure.
+ * @gt: The gt upon the fault occurred.
+ * @fault_addr: The GPU fault address.
+ * @atomic: The fault atomic access bit.
+ *
+ * Create GPU bindings for a SVM page fault. Optionally migrate to device
+ * memory.
+ *
+ * Return: 0 on success, negative error code on error.
+ */
+int xe_svm_handle_pagefault(struct xe_vm *vm, struct xe_vma *vma,
+ struct xe_pagefault *pf, struct xe_gt *gt,
+ u64 fault_addr, bool atomic)
+{
+ return xe_svm_range_setup(vm, vma, pf, gt, fault_addr,
+ (struct xe_svm_range_setup_flags) {
+ .atomic = atomic,
+ .acc_ctr_trigger = false,
+ });
+}
+
+/**
+ * xe_svm_range_find_first() - Find first existing SVM range in a VA window
+ * @vm: The VM.
+ * @start: Start of the VA window.
+ * @end: End (exclusive) of the VA window.
+ *
+ * Returns the first already-existing SVM range whose address overlaps
+ * [start, end), skipping holes natively via the interval tree. Does NOT
+ * create a new range if none exists (unlike xe_svm_range_find_or_insert).
+ *
+ * May be called with vm->lock held in read mode; range_lock is taken to guard
+ * the interval-tree walk against concurrent insert/remove.
+ *
+ * Return: Referenced pointer to the range (drop with xe_svm_range_put()), or
+ * NULL if no range exists in the window.
+ */
+struct xe_svm_range *xe_svm_range_find_first(struct xe_vm *vm,
+ u64 start, u64 end)
+{
+ struct drm_gpusvm_notifier *notifier;
+
+ lockdep_assert_held(&vm->lock);
+
+ guard(mutex)(&vm->svm.range_lock);
+
+ drm_gpusvm_for_each_notifier(notifier, &vm->svm.gpusvm, start, end) {
+ u64 n_end = min_t(u64, end, drm_gpusvm_notifier_end(notifier));
+ struct drm_gpusvm_range *r;
+
+ r = drm_gpusvm_range_find(notifier, start, n_end);
+ if (r) {
+ drm_gpusvm_range_get(r);
+ return to_xe_range(r);
+ }
+ }
+
+ return NULL;
+}
+
/**
* xe_svm_has_mapping() - SVM has mappings
* @vm: The VM.
@@ -1604,10 +1739,8 @@ int xe_svm_range_get_pages(struct xe_vm *vm, struct xe_svm_range *range,
&range->base.notifier->notifier,
drm_gpusvm_range_start(&range->base),
drm_gpusvm_range_end(&range->base), ctx);
- if (err == -EOPNOTSUPP) {
- range_debug(range, "PAGE FAULT - EVICT PAGES");
+ if (err == -EOPNOTSUPP)
drm_gpusvm_range_evict(&vm->svm.gpusvm, &range->base);
- }
return err;
}
diff --git a/drivers/gpu/drm/xe/xe_svm.h b/drivers/gpu/drm/xe/xe_svm.h
index 2ef4ef026ccd..4c218bd1f9bd 100644
--- a/drivers/gpu/drm/xe/xe_svm.h
+++ b/drivers/gpu/drm/xe/xe_svm.h
@@ -28,6 +28,14 @@ struct xe_vm;
struct xe_vma;
struct xe_vram_region;
+/** struct xe_svm_range_setup_flags -flags for range setup */
+struct xe_svm_range_setup_flags {
+ /** @atomic: is atomic access */
+ u32 atomic : 1;
+ /** @acc_ctr_trigger: is called by access ctr trigger */
+ u32 acc_ctr_trigger : 1;
+};
+
/** struct xe_svm_range - SVM range */
struct xe_svm_range {
/** @base: base drm_gpusvm_range */
@@ -109,6 +117,12 @@ void xe_svm_fini(struct xe_vm *vm);
void xe_svm_close(struct xe_vm *vm);
+int xe_svm_range_setup(struct xe_vm *vm, struct xe_vma *vma,
+ struct xe_pagefault *pf, struct xe_gt *gt,
+ u64 addr, struct xe_svm_range_setup_flags flags);
+
+struct xe_svm_range *xe_svm_range_find_first(struct xe_vm *vm, u64 start, u64 end);
+
int xe_svm_handle_pagefault(struct xe_vm *vm, struct xe_vma *vma,
struct xe_pagefault *pf, struct xe_gt *gt,
u64 fault_addr, bool atomic);
@@ -220,6 +234,17 @@ static inline unsigned long xe_svm_range_size(struct xe_svm_range *range)
return drm_gpusvm_range_size(&range->base);
}
+/**
+ * xe_svm_range_allowed_in_devmem() - Whether a range's pages may migrate to devmem
+ * @range: SVM range
+ *
+ * Return: true if the range's pages are allowed to migrate to device memory.
+ */
+static inline bool xe_svm_range_allowed_in_devmem(struct xe_svm_range *range)
+{
+ return range->base.flags.migrate_devmem;
+}
+
/**
* xe_svm_range_first_dma() - Resolve the device address array of a SVM range
* @range: SVM range
@@ -270,6 +295,11 @@ struct xe_svm_range {
u32 tile_invalidated;
};
+struct xe_svm_range_setup_flags {
+ u32 atomic : 1;
+ u32 acc_ctr_trigger : 1;
+};
+
static inline void xe_svm_range_put(struct xe_svm_range *range)
{
}
@@ -279,6 +309,11 @@ static inline bool xe_svm_range_pages_valid(struct xe_svm_range *range)
return false;
}
+static inline bool xe_svm_range_allowed_in_devmem(struct xe_svm_range *range)
+{
+ return false;
+}
+
static inline
int xe_devm_add(struct xe_tile *tile, struct xe_vram_region *vr)
{
@@ -318,6 +353,20 @@ int xe_svm_handle_pagefault(struct xe_vm *vm, struct xe_vma *vma,
return 0;
}
+static inline
+int xe_svm_range_setup(struct xe_vm *vm, struct xe_vma *vma,
+ struct xe_pagefault *pf, struct xe_gt *gt,
+ u64 addr, struct xe_svm_range_setup_flags flags)
+{
+ return 0;
+}
+
+static inline
+struct xe_svm_range *xe_svm_range_find_first(struct xe_vm *vm, u64 start, u64 end)
+{
+ return NULL;
+}
+
static inline
bool xe_svm_has_mapping(struct xe_vm *vm, u64 start, u64 end)
{
diff --git a/drivers/gpu/drm/xe/xe_trace_bo.h b/drivers/gpu/drm/xe/xe_trace_bo.h
index 86323cf3be2c..eae5a5d0dbdc 100644
--- a/drivers/gpu/drm/xe/xe_trace_bo.h
+++ b/drivers/gpu/drm/xe/xe_trace_bo.h
@@ -12,6 +12,7 @@
#include <linux/tracepoint.h>
#include <linux/types.h>
+#include "xe_access_counter_types.h"
#include "xe_bo.h"
#include "xe_bo_types.h"
#include "xe_vm.h"
@@ -125,9 +126,34 @@ DEFINE_EVENT(xe_vma, xe_vma_pagefault,
TP_ARGS(vma)
);
-DEFINE_EVENT(xe_vma, xe_vma_acc,
- TP_PROTO(struct xe_vma *vma),
- TP_ARGS(vma)
+TRACE_EVENT(xe_vma_acc,
+ TP_PROTO(struct xe_vma *vma, u8 counter_type),
+ TP_ARGS(vma, counter_type),
+
+ TP_STRUCT__entry(
+ __string(dev, __dev_name_vma(vma))
+ __field(struct xe_vma *, vma)
+ __field(struct xe_vm *, vm)
+ __field(u32, asid)
+ __field(u64, start)
+ __field(u64, end)
+ __field(u8, counter_type)
+ ),
+
+ TP_fast_assign(
+ __assign_str(dev);
+ __entry->vma = vma;
+ __entry->vm = xe_vma_vm(vma);
+ __entry->asid = xe_vma_vm(vma)->usm.asid;
+ __entry->start = xe_vma_start(vma);
+ __entry->end = xe_vma_end(vma) - 1;
+ __entry->counter_type = counter_type;
+ ),
+
+ TP_printk("dev=%s, vma=%p, vm=%p, asid=0x%05x, start=0x%012llx, end=0x%012llx, type=%s",
+ __get_str(dev), __entry->vma, __entry->vm,
+ __entry->asid, __entry->start, __entry->end,
+ __entry->counter_type == XE_ACCESS_COUNTER_TYPE_NOTIFY ? "NOTIFY" : "TRIGGER")
);
DEFINE_EVENT(xe_vma, xe_vma_bind,
diff --git a/drivers/gpu/drm/xe/xe_usm_queue.h b/drivers/gpu/drm/xe/xe_usm_queue.h
new file mode 100644
index 000000000000..64f708a5f835
--- /dev/null
+++ b/drivers/gpu/drm/xe/xe_usm_queue.h
@@ -0,0 +1,127 @@
+/* SPDX-License-Identifier: MIT */
+/*
+ * Copyright © 2026 Intel Corporation
+ */
+
+#ifndef _XE_USM_QUEUE_H_
+#define _XE_USM_QUEUE_H_
+
+#include <linux/circ_buf.h>
+#include <linux/spinlock.h>
+#include <linux/workqueue.h>
+
+/**
+ * struct xe_usm_queue - Generic USM circular FIFO queue
+ *
+ * A lock-protected circular buffer used by the access counter
+ * consumer. Producers push fixed-size entries from IRQ context;
+ * workers process them asynchronously.
+ */
+struct xe_usm_queue {
+ /**
+ * @data: Raw byte buffer backing the queue, protected by @lock
+ */
+ void *data;
+ /** @size: Total size of @data in bytes */
+ u32 size;
+ /** @head: Write cursor in bytes, moved by producer, protected by @lock */
+ u32 head;
+ /** @tail: Read cursor in bytes, moved by consumer, protected by @lock */
+ u32 tail;
+ /**
+ * @entry_size: Slot size in bytes (power of two); governs head/tail
+ * arithmetic. Always >= @data_size.
+ */
+ u32 entry_size;
+ /**
+ * @data_size: Actual number of bytes of live data per entry.
+ * memcpy in push/pop uses this value so callers never need to
+ * over-allocate their stack buffers to entry_size.
+ */
+ u32 data_size;
+ /** @lock: Protects the queue head/tail */
+ spinlock_t lock;
+};
+
+/**
+ * xe_usm_queue_full - Check whether the queue has no room for one more entry
+ * @q: queue
+ *
+ * Must be called with @q->lock held.
+ *
+ * Return: true if the queue is full
+ */
+static inline bool xe_usm_queue_full(struct xe_usm_queue *q)
+{
+ lockdep_assert_held(&q->lock);
+
+ return CIRC_SPACE(q->head, q->tail, q->size) <= q->entry_size;
+}
+
+/**
+ * xe_usm_queue_pop - Pop one entry from the queue into @out
+ * @q: queue
+ * @out: destination buffer, must be at least @q->data_size bytes
+ *
+ * Copies exactly @q->data_size bytes into @out (the actual live data
+ * size), while advancing the tail by @q->entry_size (the padded slot
+ * size). This prevents stack overflows when @entry_size > @data_size.
+ *
+ * Acquires @q->lock internally with spin_lock_irq().
+ *
+ * Return: true if an entry was dequeued, false if the queue was empty
+ */
+static inline bool xe_usm_queue_pop(struct xe_usm_queue *q, void *out)
+{
+ bool found = false;
+
+ spin_lock_irq(&q->lock);
+ if (q->tail != q->head) {
+ memcpy(out, q->data + q->tail, q->data_size);
+ q->tail = (q->tail + q->entry_size) % q->size;
+ found = true;
+ }
+ spin_unlock_irq(&q->lock);
+
+ return found;
+}
+
+/**
+ * xe_usm_queue_peek - Check whether the queue has at least one entry
+ * @q: queue
+ *
+ * Acquires @q->lock internally with spin_lock_irq().
+ *
+ * Return: true if the queue is non-empty
+ */
+static inline bool xe_usm_queue_peek(struct xe_usm_queue *q)
+{
+ bool found;
+
+ spin_lock_irq(&q->lock);
+ found = q->tail != q->head;
+ spin_unlock_irq(&q->lock);
+
+ return found;
+}
+
+/**
+ * xe_usm_queue_push - Push one entry into the queue
+ * @q: queue
+ * @in: source buffer, must be at least @q->data_size bytes
+ *
+ * Copies exactly @q->data_size bytes from @in into the next slot
+ * (which is @q->entry_size bytes wide; any padding bytes are left
+ * uninitialised and are never read back by pop).
+ *
+ * Must be called with @q->lock held.
+ * Caller must check xe_usm_queue_full() before calling.
+ */
+static inline void xe_usm_queue_push(struct xe_usm_queue *q, const void *in)
+{
+ lockdep_assert_held(&q->lock);
+
+ memcpy(q->data + q->head, in, q->data_size);
+ q->head = (q->head + q->entry_size) % q->size;
+}
+#endif
diff --git a/drivers/gpu/drm/xe/xe_vm.c b/drivers/gpu/drm/xe/xe_vm.c
index 753a5fc55baa..15f20cfaa444 100644
--- a/drivers/gpu/drm/xe/xe_vm.c
+++ b/drivers/gpu/drm/xe/xe_vm.c
@@ -752,7 +752,8 @@ static void xe_vma_ops_incr_pt_update_ops(struct xe_vma_ops *vops, u8 tile_mask,
XE_VMA_DUMPABLE | \
XE_VMA_SYSTEM_ALLOCATOR | \
DRM_GPUVA_SPARSE | \
- XE_VMA_MADV_AUTORESET)
+ XE_VMA_MADV_AUTORESET | \
+ XE_VMA_MIGRATE_ON_ACC)
static void xe_vm_populate_rebind(struct xe_vma_op *op, struct xe_vma *vma,
u8 tile_mask)
@@ -1219,6 +1220,8 @@ static void xe_vma_destroy_late(struct xe_vma *vma)
vma->ufence = NULL;
}
+ dma_fence_put(vma->ac_move_fence);
+
if (xe_vma_is_userptr(vma)) {
struct xe_userptr_vma *uvma = to_userptr_vma(vma);
@@ -1318,6 +1321,50 @@ int xe_vm_lock_vma(struct drm_exec *exec, struct xe_vma *vma)
return err;
}
+/**
+ * xe_vma_lock_and_validate - Lock Vma and Validate bo location
+ * @exec: drm execution context
+ * @vma: VMA to prepare
+ * @vram: target VRAM region
+ * @need_vram_move: true if BO must be moved to VRAM
+ *
+ * Locks the VMA and its associated BO, then ensures the BO is in the correct
+ * memory location for GPU access. If need_vram_move is true, migrates the BO
+ * to VRAM; otherwise validates it in its current location.
+ *
+ * Return: 0 on success, negative error code on failure
+ */
+int xe_vma_lock_and_validate(struct drm_exec *exec, struct xe_vma *vma,
+ struct xe_vram_region *vram, bool need_vram_move)
+{
+ struct xe_bo *bo = xe_vma_bo(vma);
+ struct xe_vm *vm = xe_vma_vm(vma);
+ int err;
+
+ err = xe_vm_lock_vma(exec, vma);
+ if (err)
+ return err;
+
+ if (!bo)
+ return 0;
+
+ /*
+ * Skip validate/migrate for DONTNEED/purged BOs - repopulating
+ * their pages would prevent the shrinker from reclaiming them.
+ * For non-scratch VMs there is no safe fallback so fail the fault.
+ * For scratch VMs let xe_vma_rebind() run normally; it will install
+ * scratch PTEs so the GPU gets safe zero reads instead of faulting.
+ */
+ if (unlikely(xe_bo_madv_is_dontneed(bo) || xe_bo_is_purged(bo))) {
+ if (!xe_vm_has_scratch(vm))
+ return -EACCES;
+ return 0;
+ }
+
+ return need_vram_move ? xe_bo_migrate(bo, vram->placement, NULL, exec) :
+ xe_bo_validate(bo, vm, true, exec);
+}
+
static void xe_vma_destroy_unlocked(struct xe_vma *vma)
{
struct xe_device *xe = xe_vma_vm(vma)->xe;
@@ -2517,6 +2564,8 @@ vm_bind_ioctl_ops_create(struct xe_vm *vm, struct xe_vma_ops *vops,
op->map.vma_flags |= XE_VMA_DUMPABLE;
if (flags & DRM_XE_VM_BIND_FLAG_MADVISE_AUTORESET)
op->map.vma_flags |= XE_VMA_MADV_AUTORESET;
+ if (flags & DRM_XE_VM_BIND_FLAG_MIGRATE_ON_ACCESS_COUNTER)
+ op->map.vma_flags |= XE_VMA_MIGRATE_ON_ACC;
op->map.request_decompress = flags & DRM_XE_VM_BIND_FLAG_DECOMPRESS;
op->map.pat_index = pat_index;
op->map.invalidate_on_bind =
@@ -3219,6 +3268,8 @@ static void prefetch_thread_func(struct prefetch_thread *thread)
if (err) {
drm_dbg(&vm->xe->drm, "Get pages failed, asid=%u, gpusvm=%p, errno=%pe\n",
vm->usm.asid, &vm->svm.gpusvm, ERR_PTR(err));
+ if (err == -EOPNOTSUPP)
+ xe_svm_range_debug(svm_range, "PREFETCH - EVICTED PAGES");
if (err == -EOPNOTSUPP || err == -EFAULT || err == -EPERM)
err = -ENODATA;
thread->err = err;
@@ -3739,7 +3790,8 @@ ALLOW_ERROR_INJECTION(vm_bind_ioctl_ops_execute, ERRNO);
DRM_XE_VM_BIND_FLAG_CHECK_PXP | \
DRM_XE_VM_BIND_FLAG_CPU_ADDR_MIRROR | \
DRM_XE_VM_BIND_FLAG_MADVISE_AUTORESET | \
- DRM_XE_VM_BIND_FLAG_DECOMPRESS)
+ DRM_XE_VM_BIND_FLAG_DECOMPRESS | \
+ DRM_XE_VM_BIND_FLAG_MIGRATE_ON_ACCESS_COUNTER)
#ifdef TEST_VM_OPS_ERROR
#define SUPPORTED_FLAGS (SUPPORTED_FLAGS_STUB | FORCE_OP_ERROR)
@@ -3873,6 +3925,8 @@ static int vm_bind_ioctl_check_args(struct xe_device *xe, struct xe_vm *vm,
XE_IOCTL_DBG(xe, obj &&
op == DRM_XE_VM_BIND_OP_UNMAP) ||
XE_IOCTL_DBG(xe, (flags & DRM_XE_VM_BIND_FLAG_MADVISE_AUTORESET) &&
+ (!is_cpu_addr_mirror || op != DRM_XE_VM_BIND_OP_MAP)) ||
+ XE_IOCTL_DBG(xe, (flags & DRM_XE_VM_BIND_FLAG_MIGRATE_ON_ACCESS_COUNTER) &&
(!is_cpu_addr_mirror || op != DRM_XE_VM_BIND_OP_MAP))) {
err = -EINVAL;
goto free_bind_ops;
@@ -4828,6 +4882,78 @@ void xe_vm_snapshot_free(struct xe_vm_snapshot *snap)
kvfree(snap);
}
+/**
+ * xe_vma_supports_access_ctr - Determine if VMA is eligible for access counting
+ * @xe: Pointer to the Xe device structure
+ * @vma: The VMA
+ * @tile: Tile with which VMA bound is associated to
+ *
+ * For CPU address mirror VMAs the decision is policy-driven:
+ *
+ * - If madvise has set an explicit preferred location that resolves to a
+ * pagemap belonging to a *different* tile, this tile should not generate
+ * access counter events (the user declared where the memory lives). Set
+ * NC so AC events are suppressed.
+ * - If the preferred location is system memory (DEFAULT_SYSTEM), no GPU
+ * should migrate via AC; suppress on all tiles.
+ * - Otherwise (no preference / DEFAULT_DEVICE) apply first-touch-then-hot
+ * policy: enable AC so this tile can migrate the range once it becomes hot.
+ *
+ * Note, access counters are not used unless enabled in LRC.
+ */
+bool xe_vma_supports_access_ctr(struct xe_device *xe,
+ struct xe_vma *vma,
+ struct xe_tile *tile)
+{
+ struct xe_bo *bo = xe_vma_bo(vma);
+ struct ttm_resource *res;
+
+ if (!IS_DGFX(xe))
+ return false;
+
+ if (xe_vma_is_cpu_addr_mirror(vma)) {
+ struct drm_pagemap *preferred = xe_vma_resolve_pagemap(vma, tile);
+
+ /*
+ * Explicit system preference: no AC on any GPU — the user
+ * has stated memory should remain in system RAM.
+ */
+ if (vma->attr.preferred_loc.devmem_fd == DRM_XE_PREFERRED_LOC_DEFAULT_SYSTEM)
+ return false;
+
+ /*
+ * Explicit device preference pointing at a *different* tile:
+ * suppress AC on this tile so migrates only happen on the
+ * owning GPU.
+ */
+ if (preferred && preferred != xe_tile_local_pagemap(tile))
+ return false;
+
+ /* No preference or this tile is preferred: enable AC. */
+ return true;
+ }
+
+ /* userptr or using null vma */
+ if (!bo)
+ return false;
+
+ xe_bo_assert_held(bo);
+ res = bo->ttm.resource;
+ /* if for some reason no backing store, nothing to migrate */
+ if (!res)
+ return false;
+
+ /* cannot migrate if single placement */
+ if (bo->placement.num_placement <= 1)
+ return false;
+
+ /* cannot migrate to ourself (already in VRAM local to @tile) */
+ if (!tile->mem.vram || res->mem_type == tile->mem.vram->placement)
+ return false;
+
+ return true;
+}
+
/**
* xe_vma_need_vram_for_atomic - Check if VMA needs VRAM migration for atomic operations
* @xe: Pointer to the Xe device structure
diff --git a/drivers/gpu/drm/xe/xe_vm.h b/drivers/gpu/drm/xe/xe_vm.h
index c5b900f38ded..2a5ae0aacc97 100644
--- a/drivers/gpu/drm/xe/xe_vm.h
+++ b/drivers/gpu/drm/xe/xe_vm.h
@@ -185,6 +185,9 @@ struct xe_vma *xe_vm_find_vma_by_addr(struct xe_vm *vm, u64 page_addr);
int xe_vma_need_vram_for_atomic(struct xe_device *xe, struct xe_vma *vma, bool is_atomic);
+bool xe_vma_supports_access_ctr(struct xe_device *xe, struct xe_vma *vma,
+ struct xe_tile *tile);
+
int xe_vm_alloc_madvise_vma(struct xe_vm *vm, uint64_t addr, uint64_t size);
int xe_vm_alloc_cpu_addr_mirror_vma(struct xe_vm *vm, uint64_t addr, uint64_t size);
@@ -281,6 +284,9 @@ static inline void xe_vm_reactivate_rebind(struct xe_vm *vm)
int xe_vm_lock_vma(struct drm_exec *exec, struct xe_vma *vma);
+int xe_vma_lock_and_validate(struct drm_exec *exec, struct xe_vma *vma,
+ struct xe_vram_region *vram, bool need_vram_move);
+
int xe_vm_validate_rebind(struct xe_vm *vm, struct drm_exec *exec,
unsigned int num_fences);
diff --git a/drivers/gpu/drm/xe/xe_vm_types.h b/drivers/gpu/drm/xe/xe_vm_types.h
index 648031e64145..a88e20329e9f 100644
--- a/drivers/gpu/drm/xe/xe_vm_types.h
+++ b/drivers/gpu/drm/xe/xe_vm_types.h
@@ -52,6 +52,7 @@ struct xe_vm_pgtable_update_op;
#define XE_VMA_DUMPABLE (DRM_GPUVA_USERBITS << 8)
#define XE_VMA_SYSTEM_ALLOCATOR (DRM_GPUVA_USERBITS << 9)
#define XE_VMA_MADV_AUTORESET (DRM_GPUVA_USERBITS << 10)
+#define XE_VMA_MIGRATE_ON_ACC (DRM_GPUVA_USERBITS << 11)
/**
* struct xe_vma_mem_attr - memory attributes associated with vma
@@ -175,6 +176,16 @@ struct xe_vma {
*/
struct xe_user_fence *ufence;
+ /**
+ * @ac_move_fence: Fence for an in-progress access-counter triggered
+ * migration/rebind. Written by the AC service and read+cleared by the
+ * page-fault handler, both under down_read(&vm->lock) + @fault_lock;
+ * any access under the read lock MUST also hold @fault_lock. The final
+ * put on VMA destroy (xe_vma_destroy_late()) is unlocked - safe as no
+ * other reference to the VMA remains.
+ */
+ struct dma_fence *ac_move_fence;
+
/**
* @attr: The attributes of vma which determines the migration policy
* and encoding of the PTEs for this vma.
diff --git a/include/uapi/drm/xe_drm.h b/include/uapi/drm/xe_drm.h
index 578f0c1eb43e..5f37415239b9 100644
--- a/include/uapi/drm/xe_drm.h
+++ b/include/uapi/drm/xe_drm.h
@@ -1073,6 +1073,15 @@ struct drm_xe_vm_destroy {
* "no-compression" PAT. Only meaningful for VRAM-backed BOs on devices that
* support Flat CCS and the required HW generation XE2+.
*
+ * - %DRM_XE_VM_BIND_FLAG_MIGRATE_ON_ACCESS_COUNTER - Can be used in combination
+ * with %DRM_XE_VM_BIND_FLAG_CPU_ADDR_MIRROR to defer device placement to
+ * access counters: skip the eager first-touch migration on the initial GPU
+ * page fault and migrate the range to a GPU's local VRAM only once that
+ * GPU's access counter reports it hot. Ignored when madvise has set an
+ * explicit preferred device location (placement is already pinned) and never
+ * overrides migrations required for correctness, such as device atomics.
+ * Only valid for DRM_XE_VM_BIND_OP_MAP.
+ *
* The @prefetch_mem_region_instance for %DRM_XE_VM_BIND_OP_PREFETCH can also be:
* - %DRM_XE_CONSULT_MEM_ADVISE_PREF_LOC, which ensures prefetching occurs in
* the memory region advised by madvise.
@@ -1182,6 +1191,7 @@ struct drm_xe_vm_bind_op {
#define DRM_XE_VM_BIND_FLAG_CPU_ADDR_MIRROR (1 << 5)
#define DRM_XE_VM_BIND_FLAG_MADVISE_AUTORESET (1 << 6)
#define DRM_XE_VM_BIND_FLAG_DECOMPRESS (1 << 7)
+#define DRM_XE_VM_BIND_FLAG_MIGRATE_ON_ACCESS_COUNTER (1 << 8)
/** @flags: Bind flags */
__u32 flags;
@@ -1432,6 +1442,7 @@ struct drm_xe_vm_get_property {
*/
struct drm_xe_exec_queue_create {
#define DRM_XE_EXEC_QUEUE_EXTENSION_SET_PROPERTY 0
+#define DRM_XE_EXEC_QUEUE_EXTENSION_SET_ACC_PARAM 1
#define DRM_XE_EXEC_QUEUE_SET_PROPERTY_PRIORITY 0
#define DRM_XE_EXEC_QUEUE_SET_PROPERTY_TIMESLICE 1
#define DRM_XE_EXEC_QUEUE_SET_PROPERTY_PXP_TYPE 2
@@ -1472,6 +1483,200 @@ struct drm_xe_exec_queue_create {
__u64 reserved[2];
};
+/**
+ * enum drm_xe_access_counter_granularity - VA window size for access counter notifications
+ *
+ * Selects the size of the virtual address region that the hardware groups
+ * together when counting memory accesses and reporting notifications. A
+ * larger granularity means the hardware reports a coarser region but
+ * generates fewer notifications; a smaller granularity is more precise but
+ * may produce more events under a scattered access pattern.
+ */
+enum drm_xe_access_counter_granularity {
+ /** @DRM_XE_ACCESS_COUNTER_GRANULARITY_128K: 128K granularity */
+ DRM_XE_ACCESS_COUNTER_GRANULARITY_128K,
+ /** @DRM_XE_ACCESS_COUNTER_GRANULARITY_2M: 2M granularity */
+ DRM_XE_ACCESS_COUNTER_GRANULARITY_2M,
+ /** @DRM_XE_ACCESS_COUNTER_GRANULARITY_16M: 16M granularity */
+ DRM_XE_ACCESS_COUNTER_GRANULARITY_16M,
+ /** @DRM_XE_ACCESS_COUNTER_GRANULARITY_64M: 64M granularity */
+ DRM_XE_ACCESS_COUNTER_GRANULARITY_64M,
+};
+
+/**
+ * struct drm_xe_exec_queue_set_acc_param - Access counter parameters extension
+ *
+ * **What are access counters?**
+ *
+ * Access counters are a hardware mechanism that tracks how frequently the GPU
+ * accesses memory regions over time. When a virtual address (VA) window
+ * accumulates enough accesses, the hardware notifies the kernel driver, which
+ * can then take advisory action — typically migrating the hot memory region
+ * from system RAM to device-local VRAM so future GPU accesses avoid costly
+ * PCIe transfers.
+ *
+ * Access counter notifications are purely **advisory and transparent** to
+ * userspace. Workloads execute identically with or without them; the only
+ * observable effect is potentially improved performance if the kernel succeeds
+ * in migrating memory closer to the GPU.
+ *
+ * **Enabling access counters on an exec queue**
+ *
+ * Access counters are configured at exec queue creation time by attaching a
+ * &drm_xe_exec_queue_set_acc_param extension to &DRM_IOCTL_XE_EXEC_QUEUE_CREATE
+ * via %DRM_XE_EXEC_QUEUE_EXTENSION_SET_ACC_PARAM. Once set, the parameters
+ * are baked into the engine's Logical Ring Context (LRC) registers
+ * (%CTX_ACC_CTR_THOLD and %CTX_ASID) and remain active for the lifetime of
+ * the exec queue. There is no separate ioctl to change or remove the
+ * parameters after creation; destroy and recreate the exec queue instead.
+ *
+ * The only behavioural change visible to userspace is that workloads submitted
+ * to this exec queue may run with slightly different memory locality over time
+ * as the kernel responds to hotness hints.
+ *
+ * **Typical usage pattern**
+ *
+ * .. code-block:: c
+ *
+ * // Step 1: build the extension
+ * struct drm_xe_exec_queue_set_acc_param acc = {
+ * .base.name = DRM_XE_EXEC_QUEUE_EXTENSION_SET_ACC_PARAM,
+ * .trigger = 100, // report trigger notification at 100 accesses
+ * .notify = 20, // notify on LRU de-alloc if >= 20 accesses
+ * .granularity = DRM_XE_ACCESS_COUNTER_GRANULARITY_2M,
+ * };
+ *
+ * // Step 2: chain it onto exec queue creation
+ * struct drm_xe_exec_queue_create eq = {
+ * .extensions = (uintptr_t)&acc,
+ * .vm_id = vm_id,
+ * .width = 1,
+ * .num_placements = 1,
+ * .instances = (uintptr_t)&instance,
+ * };
+ * ioctl(fd, DRM_IOCTL_XE_EXEC_QUEUE_CREATE, &eq);
+ *
+ * // Step 3: submit work as normal — AC tracking is automatic
+ * ioctl(fd, DRM_IOCTL_XE_EXEC, &exec);
+ *
+ * **How @trigger works**
+ *
+ * The hardware maintains a finite pool of counters, each tracking accesses to
+ * one @granularity-aligned VA window. When the accumulated access count for
+ * a counter reaches @trigger, the hardware immediately reports it to the
+ * driver as an **access counter trigger notification**. This is the primary,
+ * high-priority path: the region is identified as hot and the driver acts on
+ * it promptly (e.g., migrating memory to VRAM).
+ *
+ * **How @notify works**
+ *
+ * Because the hardware counter pool is finite, a counter may be de-allocated
+ * under capacity pressure using an LRU policy before its count ever reaches
+ * @trigger. At de-allocation time, the hardware compares the current count
+ * of the de-allocated counter against @notify. If count >= @notify,
+ * the hardware reports it as an **access counter notify notification**.
+ * The driver treats notify notifications with lower priority than trigger
+ * notifications — they indicate moderate interest and are serviced
+ * opportunistically. If count < @notify, the de-allocation is silent.
+ *
+ * Both @trigger and @notify are absolute access counts (16-bit unsigned).
+ *
+ * Example (hardware counter pool under pressure)::
+ *
+ * CTR 10 is being de-allocated (LRU). It was tracking a VA window with
+ * notify=0x14 (20), trigger=0x64 (100).
+ *
+ * CTR 10 count == 0x0A (10): count < notify → silent de-allocation.
+ * CTR 10 count == 0x1E (30): count >= notify → NOTIFY reported to driver.
+ *
+ * Setting @notify > @trigger is meaningless: the counter is de-allocated
+ * (via trigger notification or LRU) before its count can ever reach @notify.
+ * Always set @notify <= @trigger.
+ *
+ * **Do notifications reach userspace?**
+ *
+ * No. Notifications are handled entirely inside the kernel driver. The
+ * driver emits kernel trace events (``trace_xe_vma_acc`` via ftrace) that are
+ * visible through the standard Linux tracing infrastructure, but no signal,
+ * udev event, or file descriptor event is delivered to the process.
+ *
+ * **What if access counters are not supported?**
+ *
+ * Attaching this extension on hardware that does not support access counters
+ * (i.e., when ``xe.info.has_access_counter`` is zero) causes
+ * %DRM_IOCTL_XE_EXEC_QUEUE_CREATE to return ``-EINVAL``. Applications should
+ * either verify hardware capability using %DRM_IOCTL_XE_DEVICE_QUERY before
+ * using this extension, or be prepared to handle ``-EINVAL`` and fall back to
+ * creating the exec queue without the extension.
+ *
+ * **Reset and removal**
+ *
+ * Access counter parameters cannot be removed or changed after the exec queue
+ * is created. During a GT reset the kernel squashes any in-flight access
+ * counter notifications for that GT (pending work items are discarded), but
+ * the LRC register values are not cleared — they are restored by the GuC
+ * context save/restore mechanism when the engine recovers.
+ */
+struct drm_xe_exec_queue_set_acc_param {
+ /** @base: base user extension */
+ struct drm_xe_user_extension base;
+
+ /**
+ * @trigger: Active count threshold for trigger notifications.
+ *
+ * When the hardware counter for a @granularity-aligned VA window
+ * reaches this value, the hardware immediately reports an access
+ * counter **trigger** notification to the driver. Trigger
+ * notifications are high priority — the region is confirmed hot.
+ * Absolute count, 16-bit unsigned (e.g. 0x64 = 100 accesses).
+ */
+ __u16 trigger;
+
+ /**
+ * @notify: De-allocation count threshold for notify notifications.
+ *
+ * When a counter is de-allocated from the finite hardware pool under
+ * LRU pressure, the hardware compares its accumulated count against
+ * this value. If count >= @notify, an access counter **notify**
+ * notification is reported to the driver (lower priority than trigger).
+ * If count < @notify, the de-allocation is silent.
+ * Absolute count, 16-bit unsigned (e.g. 0x14 = 20 accesses).
+ *
+ * Must be <= @trigger. A counter is de-allocated once it either fires
+ * a trigger notification or is de-allocated by LRU; in either case its
+ * count never exceeds @trigger, so a @notify value larger than @trigger
+ * can never be satisfied.
+ */
+ __u16 notify;
+
+ /**
+ * @granularity: VA window size, one of &enum drm_xe_access_counter_granularity.
+ *
+ * Determines the alignment and size of the virtual address regions
+ * that the hardware tracks and reports. Each notification covers one
+ * aligned window of this size. Possible values:
+ *
+ * - %DRM_XE_ACCESS_COUNTER_GRANULARITY_128K: 128 KiB windows.
+ * Finest granularity; best for workloads with small, scattered hot
+ * allocations where precise locality matters.
+ * - %DRM_XE_ACCESS_COUNTER_GRANULARITY_2M: 2 MiB windows.
+ * Matches the typical huge-page size; good general-purpose choice.
+ * - %DRM_XE_ACCESS_COUNTER_GRANULARITY_16M: 16 MiB windows.
+ * Coarser tracking; suitable for large buffer workloads where
+ * per-allocation granularity is sufficient.
+ * - %DRM_XE_ACCESS_COUNTER_GRANULARITY_64M: 64 MiB windows.
+ * Coarsest granularity; fewest notifications, lowest overhead,
+ * best for very large contiguous allocations.
+ */
+ __u8 granularity;
+
+ /** @pad1: MBZ */
+ __u8 pad1;
+
+ /** @pad2: MBZ */
+ __u16 pad2;
+};
+
/**
* struct drm_xe_exec_queue_destroy - Input of &DRM_IOCTL_XE_EXEC_QUEUE_DESTROY
*/
--
2.43.0
^ permalink raw reply related [flat|nested] 6+ messages in thread
* ✗ CI.checkpatch: warning for Access counter squash (rev4)
2026-09-10 11:43 [PATCH v4] [CI-ONLY][DONOT-REVIEW] Access counter squash Himal Prasad Ghimiray
@ 2026-09-10 11:53 ` Patchwork
2026-09-10 11:55 ` ✓ CI.KUnit: success " Patchwork
` (3 subsequent siblings)
4 siblings, 0 replies; 6+ messages in thread
From: Patchwork @ 2026-09-10 11:53 UTC (permalink / raw)
To: Himal Prasad Ghimiray; +Cc: intel-xe
== Series Details ==
Series: Access counter squash (rev4)
URL : https://patchwork.freedesktop.org/series/173728/
State : warning
== Summary ==
+ KERNEL=/kernel
+ git clone https://gitlab.freedesktop.org/drm/maintainer-tools mt
Cloning into 'mt'...
warning: redirecting to https://gitlab.freedesktop.org/drm/maintainer-tools.git/
+ git -C mt rev-list -n1 origin/master
d875049d2b299159a272bd5151994970cdcd1e31
+ cd /kernel
+ git config --global --add safe.directory /kernel
+ git log -n1
commit 5f63bd3333516dd30989442ba4f7b6b2a3a831fe
Author: Himal Prasad Ghimiray <himal.prasad.ghimiray@intel.com>
Date: Thu Sep 10 17:13:30 2026 +0530
Access counter squash
+ /mt/dim checkpatch 926dada6864ecdce77fbf2fc9c23d0c58d2f55d8 drm-intel
5f63bd333351 Access counter squash
-:8: WARNING:COMMIT_MESSAGE: Missing commit description - Add an appropriate one
-:61: WARNING:FILE_PATH_CHANGES: added, moved or deleted file(s), does MAINTAINERS need updating?
#61:
new file mode 100644
-:1647: CHECK:OPEN_ENDED_LINE: Lines should not end with a '('
#1647: FILE: drivers/gpu/drm/xe/xe_trace_bo.h:133:
+ TP_STRUCT__entry(
-:1657: CHECK:OPEN_ENDED_LINE: Lines should not end with a '('
#1657: FILE: drivers/gpu/drm/xe/xe_trace_bo.h:143:
+ TP_fast_assign(
-:2286: ERROR:MISSING_SIGN_OFF: Missing Signed-off-by: line(s)
total: 1 errors, 2 warnings, 2 checks, 2083 lines checked
^ permalink raw reply [flat|nested] 6+ messages in thread
* ✓ CI.KUnit: success for Access counter squash (rev4)
2026-09-10 11:43 [PATCH v4] [CI-ONLY][DONOT-REVIEW] Access counter squash Himal Prasad Ghimiray
2026-09-10 11:53 ` ✗ CI.checkpatch: warning for Access counter squash (rev4) Patchwork
@ 2026-09-10 11:55 ` Patchwork
2026-09-10 12:05 ` [PATCH v4] [CI-ONLY][DONOT-REVIEW] Access counter squash sashiko-bot
` (2 subsequent siblings)
4 siblings, 0 replies; 6+ messages in thread
From: Patchwork @ 2026-09-10 11:55 UTC (permalink / raw)
To: Himal Prasad Ghimiray; +Cc: intel-xe
== Series Details ==
Series: Access counter squash (rev4)
URL : https://patchwork.freedesktop.org/series/173728/
State : success
== Summary ==
+ trap cleanup EXIT
+ kunitconfigs=('/kernel/drivers/gpu/tests/.kunitconfig' '/kernel/drivers/gpu/drm/xe/.kunitconfig' '/kernel/drivers/gpu/drm/tests/.kunitconfig' '/kernel/drivers/gpu/drm/ttm/tests/.kunitconfig' '/kernel/drivers/dma-buf/.kunitconfig')
+ for kcfg in "${kunitconfigs[@]}"
+ [[ ! -f /kernel/drivers/gpu/tests/.kunitconfig ]]
+ /kernel/tools/testing/kunit/kunit.py run --kunitconfig /kernel/drivers/gpu/tests/.kunitconfig
[11:53:43] Configuring KUnit Kernel ...
Generating .config ...
Populating config with:
$ make ARCH=um O=.kunit olddefconfig
[11:53:47] 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
[11:54:07] Starting KUnit Kernel (1/1)...
[11:54:07] ============================================================
Running tests with:
$ .kunit/linux kunit.enable=1 mem=1G console=tty kunit_shutdown=halt
[11:54:07] ============= refcount_interrupt (4 subtests) ==============
[11:54:07] [PASSED] test_single_irq_change
[11:54:07] [PASSED] test_nested_irq_change
[11:54:07] [PASSED] test_multiple_irq_change
[11:54:07] [PASSED] test_irq_save
[11:54:07] =============== [PASSED] refcount_interrupt ================
[11:54:07] ================= gpu_buddy (14 subtests) ==================
[11:54:07] [PASSED] gpu_test_buddy_alloc_limit
[11:54:07] [PASSED] gpu_test_buddy_alloc_optimistic
[11:54:07] [PASSED] gpu_test_buddy_alloc_pessimistic
[11:54:07] [PASSED] gpu_test_buddy_alloc_pathological
[11:54:07] [PASSED] gpu_test_buddy_alloc_contiguous
[11:54:07] [PASSED] gpu_test_buddy_alloc_clear
[11:54:07] [PASSED] gpu_test_buddy_alloc_range
[11:54:07] [PASSED] gpu_test_buddy_alloc_range_bias
[11:54:08] [PASSED] gpu_test_buddy_fragmentation_performance
[11:54:09] [PASSED] gpu_test_buddy_dirty_tracker_performance
[11:54:09] [PASSED] gpu_test_buddy_alloc_exceeds_max_order
[11:54:09] [PASSED] gpu_test_buddy_offset_aligned_allocation
[11:54:09] [PASSED] gpu_test_buddy_subtree_offset_alignment_stress
[11:54:09] [PASSED] gpu_test_buddy_addr_to_block
[11:54:09] ==================== [PASSED] gpu_buddy ====================
[11:54:09] ============================================================
[11:54:09] Testing complete. Ran 18 tests: passed: 18
[11:54:09] Elapsed time: 26.020s total, 4.391s configuring, 19.661s building, 1.921s running
+ for kcfg in "${kunitconfigs[@]}"
+ [[ ! -f /kernel/drivers/gpu/drm/xe/.kunitconfig ]]
+ /kernel/tools/testing/kunit/kunit.py run --kunitconfig /kernel/drivers/gpu/drm/xe/.kunitconfig
[11:54:09] Configuring KUnit Kernel ...
Regenerating .config ...
Populating config with:
$ make ARCH=um O=.kunit olddefconfig
[11:54:11] Building KUnit Kernel ...
Populating config with:
$ make ARCH=um O=.kunit olddefconfig
Building with:
$ make all compile_commands.json scripts_gdb ARCH=um O=.kunit --jobs=48
[11:54:44] Starting KUnit Kernel (1/1)...
[11:54:44] ============================================================
Running tests with:
$ .kunit/linux kunit.enable=1 mem=1G console=tty kunit_shutdown=halt
[11:54:44] ============= refcount_interrupt (4 subtests) ==============
[11:54:44] [PASSED] test_single_irq_change
[11:54:44] [PASSED] test_nested_irq_change
[11:54:44] [PASSED] test_multiple_irq_change
[11:54:44] [PASSED] test_irq_save
[11:54:44] =============== [PASSED] refcount_interrupt ================
[11:54:44] ================== guc_buf (11 subtests) ===================
[11:54:44] [PASSED] test_smallest
[11:54:44] [PASSED] test_largest
[11:54:44] [PASSED] test_granular
[11:54:44] [PASSED] test_unique
[11:54:44] [PASSED] test_overlap
[11:54:44] [PASSED] test_reusable
[11:54:44] [PASSED] test_too_big
[11:54:44] [PASSED] test_flush
[11:54:44] [PASSED] test_lookup
[11:54:44] [PASSED] test_data
[11:54:44] [PASSED] test_class
[11:54:44] ===================== [PASSED] guc_buf =====================
[11:54:44] =================== guc_dbm (7 subtests) ===================
[11:54:44] [PASSED] test_empty
[11:54:44] [PASSED] test_default
[11:54:44] ======================== test_size ========================
[11:54:44] [PASSED] 4
[11:54:44] [PASSED] 8
[11:54:44] [PASSED] 32
[11:54:44] [PASSED] 256
[11:54:44] ==================== [PASSED] test_size ====================
[11:54:44] ======================= test_reuse ========================
[11:54:44] [PASSED] 4
[11:54:44] [PASSED] 8
[11:54:44] [PASSED] 32
[11:54:44] [PASSED] 256
[11:54:44] =================== [PASSED] test_reuse ====================
[11:54:44] =================== test_range_overlap ====================
[11:54:44] [PASSED] 4
[11:54:44] [PASSED] 8
[11:54:44] [PASSED] 32
[11:54:44] [PASSED] 256
[11:54:44] =============== [PASSED] test_range_overlap ================
[11:54:44] =================== test_range_compact ====================
[11:54:44] [PASSED] 4
[11:54:44] [PASSED] 8
[11:54:44] [PASSED] 32
[11:54:44] [PASSED] 256
[11:54:44] =============== [PASSED] test_range_compact ================
[11:54:44] ==================== test_range_spare =====================
[11:54:44] [PASSED] 4
[11:54:44] [PASSED] 8
[11:54:44] [PASSED] 32
[11:54:44] [PASSED] 256
[11:54:44] ================ [PASSED] test_range_spare =================
[11:54:44] ===================== [PASSED] guc_dbm =====================
[11:54:44] =================== guc_idm (6 subtests) ===================
[11:54:44] [PASSED] bad_init
[11:54:44] [PASSED] no_init
[11:54:44] [PASSED] init_fini
[11:54:44] [PASSED] check_used
[11:54:44] [PASSED] check_quota
[11:54:44] [PASSED] check_all
[11:54:44] ===================== [PASSED] guc_idm =====================
[11:54:44] =============== guc_klv_helpers (9 subtests) ===============
[11:54:44] [PASSED] test_count
[11:54:44] [PASSED] test_encode_u32
[11:54:44] [PASSED] test_encode_u64
[11:54:44] [PASSED] test_encode_string
[11:54:44] [PASSED] test_encode_object_raw
[11:54:44] [PASSED] test_encode_object_klv
[11:54:44] [PASSED] test_encode_object_nested
[11:54:44] [PASSED] test_encode_object_basic
[11:54:44] [PASSED] test_print
[11:54:44] ================= [PASSED] guc_klv_helpers =================
[11:54:44] =================== xe_log (4 subtests) ====================
[11:54:44] [PASSED] demo_cper
[11:54:44] [PASSED] demo_dmesg
[11:54:44] ======================= test_dmesg ========================
[11:54:44] [PASSED] test_fatal
[11:54:44] [PASSED] test_fatal_tile
[11:54:44] [PASSED] test_fatal_gt
[11:54:44] [PASSED] test_fatal_comp
[11:54:44] [PASSED] test_fatal_comp_tile
[11:54:44] [PASSED] test_fatal_comp_gt
[11:54:44] [PASSED] test_fatal_all
[11:54:44] [PASSED] test_recoverable
[11:54:44] [PASSED] test_recoverable_tile
[11:54:44] [PASSED] test_recoverable_gt
[11:54:44] [PASSED] test_recoverable_comp
[11:54:44] [PASSED] test_recoverable_comp_tile
[11:54:44] [PASSED] test_recoverable_comp_gt
[11:54:44] [PASSED] test_recoverable_all
[11:54:44] [PASSED] test_info
[11:54:44] [PASSED] test_info_tile
[11:54:44] [PASSED] test_info_gt
[11:54:44] [PASSED] test_info_err
[11:54:44] [PASSED] test_info_comp
[11:54:44] [PASSED] test_info_comp_tile
[11:54:44] [PASSED] test_info_comp_gt
[11:54:44] [PASSED] test_info_all
[11:54:44] [PASSED] test_hw_fatal
[11:54:44] [PASSED] test_hw_recoverable
[11:54:44] [PASSED] test_hw_corrected
[11:54:44] [PASSED] test_hw_informational
[11:54:44] =================== [PASSED] test_dmesg ====================
[11:54:44] ====================== test_invalid =======================
[11:54:44] [SKIPPED] no-component no-location no-warn (requires CONFIG_DRM_XE_DEBUG)
[11:54:44] [SKIPPED] reserved location (requires CONFIG_DRM_XE_DEBUG)
[11:54:44] [SKIPPED] unknown location (requires CONFIG_DRM_XE_DEBUG)
[11:54:44] [SKIPPED] nonzero-device-id location (requires CONFIG_DRM_XE_DEBUG)
[11:54:44] [SKIPPED] invalid-tile-id location (requires CONFIG_DRM_XE_DEBUG)
[11:54:44] [SKIPPED] invalid-gt-id location (requires CONFIG_DRM_XE_DEBUG)
[11:54:44] [SKIPPED] unknown component class (requires CONFIG_DRM_XE_DEBUG)
[11:54:44] [SKIPPED] unknown system component (requires CONFIG_DRM_XE_DEBUG)
[11:54:44] [SKIPPED] unknown hardware component (requires CONFIG_DRM_XE_DEBUG)
[11:54:44] [SKIPPED] unknown component and location (requires CONFIG_DRM_XE_DEBUG)
[11:54:44] ================== [SKIPPED] test_invalid ==================
[11:54:44] ===================== [PASSED] xe_log ======================
[11:54:44] ================== no_relay (3 subtests) ===================
[11:54:44] [PASSED] xe_drops_guc2pf_if_not_ready
[11:54:44] [PASSED] xe_drops_guc2vf_if_not_ready
[11:54:44] [PASSED] xe_rejects_send_if_not_ready
[11:54:44] ==================== [PASSED] no_relay =====================
[11:54:44] ================== pf_relay (14 subtests) ==================
[11:54:44] [PASSED] pf_rejects_guc2pf_too_short
[11:54:44] [PASSED] pf_rejects_guc2pf_too_long
[11:54:44] [PASSED] pf_rejects_guc2pf_no_payload
[11:54:44] [PASSED] pf_fails_no_payload
[11:54:44] [PASSED] pf_fails_bad_origin
[11:54:44] [PASSED] pf_fails_bad_type
[11:54:44] [PASSED] pf_txn_reports_error
[11:54:44] [PASSED] pf_txn_sends_pf2guc
[11:54:44] [PASSED] pf_sends_pf2guc
[11:54:44] [SKIPPED] pf_loopback_nop (requires CONFIG_DRM_XE_DEBUG_SRIOV)
[11:54:44] [SKIPPED] pf_loopback_echo (requires CONFIG_DRM_XE_DEBUG_SRIOV)
[11:54:44] [SKIPPED] pf_loopback_fail (requires CONFIG_DRM_XE_DEBUG_SRIOV)
[11:54:44] [SKIPPED] pf_loopback_busy (requires CONFIG_DRM_XE_DEBUG_SRIOV)
[11:54:44] [SKIPPED] pf_loopback_retry (requires CONFIG_DRM_XE_DEBUG_SRIOV)
[11:54:44] ==================== [PASSED] pf_relay =====================
[11:54:44] ================== vf_relay (3 subtests) ===================
[11:54:44] [PASSED] vf_rejects_guc2vf_too_short
[11:54:44] [PASSED] vf_rejects_guc2vf_too_long
[11:54:44] [PASSED] vf_rejects_guc2vf_no_payload
[11:54:44] ==================== [PASSED] vf_relay =====================
[11:54:44] ================ pf_gt_config (9 subtests) =================
[11:54:44] [PASSED] fair_contexts_1vf
[11:54:44] [PASSED] fair_doorbells_1vf
[11:54:44] [PASSED] fair_ggtt_1vf
[11:54:44] ====================== fair_vram_1vf ======================
[11:54:44] [PASSED] 3.50 GiB
[11:54:44] [PASSED] 11.5 GiB
[11:54:44] [PASSED] 15.5 GiB
[11:54:44] [PASSED] 31.5 GiB
[11:54:44] [PASSED] 63.5 GiB
[11:54:44] [PASSED] 1.91 GiB
[11:54:44] ================== [PASSED] fair_vram_1vf ==================
[11:54:44] ================ fair_vram_1vf_admin_only =================
[11:54:44] [PASSED] 3.50 GiB
[11:54:44] [PASSED] 11.5 GiB
[11:54:44] [PASSED] 15.5 GiB
[11:54:44] [PASSED] 31.5 GiB
[11:54:44] [PASSED] 63.5 GiB
[11:54:44] [PASSED] 1.91 GiB
[11:54:44] ============ [PASSED] fair_vram_1vf_admin_only =============
[11:54:44] ====================== fair_contexts ======================
[11:54:44] [PASSED] 1 VF
[11:54:44] [PASSED] 2 VFs
[11:54:44] [PASSED] 3 VFs
[11:54:44] [PASSED] 4 VFs
[11:54:44] [PASSED] 5 VFs
[11:54:44] [PASSED] 6 VFs
[11:54:44] [PASSED] 7 VFs
[11:54:44] [PASSED] 8 VFs
[11:54:44] [PASSED] 9 VFs
[11:54:44] [PASSED] 10 VFs
[11:54:44] [PASSED] 11 VFs
[11:54:44] [PASSED] 12 VFs
[11:54:44] [PASSED] 13 VFs
[11:54:44] [PASSED] 14 VFs
[11:54:44] [PASSED] 15 VFs
[11:54:44] [PASSED] 16 VFs
[11:54:44] [PASSED] 17 VFs
[11:54:44] [PASSED] 18 VFs
[11:54:44] [PASSED] 19 VFs
[11:54:44] [PASSED] 20 VFs
[11:54:44] [PASSED] 21 VFs
[11:54:44] [PASSED] 22 VFs
[11:54:44] [PASSED] 23 VFs
[11:54:44] [PASSED] 24 VFs
[11:54:44] [PASSED] 25 VFs
[11:54:44] [PASSED] 26 VFs
[11:54:44] [PASSED] 27 VFs
[11:54:44] [PASSED] 28 VFs
[11:54:44] [PASSED] 29 VFs
[11:54:44] [PASSED] 30 VFs
[11:54:44] [PASSED] 31 VFs
[11:54:44] [PASSED] 32 VFs
[11:54:44] [PASSED] 33 VFs
[11:54:44] [PASSED] 34 VFs
[11:54:44] [PASSED] 35 VFs
[11:54:44] [PASSED] 36 VFs
[11:54:44] [PASSED] 37 VFs
[11:54:44] [PASSED] 38 VFs
[11:54:44] [PASSED] 39 VFs
[11:54:44] [PASSED] 40 VFs
[11:54:44] [PASSED] 41 VFs
[11:54:44] [PASSED] 42 VFs
[11:54:44] [PASSED] 43 VFs
[11:54:44] [PASSED] 44 VFs
[11:54:44] [PASSED] 45 VFs
[11:54:44] [PASSED] 46 VFs
[11:54:44] [PASSED] 47 VFs
[11:54:44] [PASSED] 48 VFs
[11:54:44] [PASSED] 49 VFs
[11:54:44] [PASSED] 50 VFs
[11:54:44] [PASSED] 51 VFs
[11:54:44] [PASSED] 52 VFs
[11:54:44] [PASSED] 53 VFs
[11:54:44] [PASSED] 54 VFs
[11:54:44] [PASSED] 55 VFs
[11:54:44] [PASSED] 56 VFs
[11:54:44] [PASSED] 57 VFs
[11:54:44] [PASSED] 58 VFs
[11:54:44] [PASSED] 59 VFs
[11:54:44] [PASSED] 60 VFs
[11:54:45] [PASSED] 61 VFs
[11:54:45] [PASSED] 62 VFs
[11:54:45] [PASSED] 63 VFs
[11:54:45] ================== [PASSED] fair_contexts ==================
[11:54:45] ===================== fair_doorbells ======================
[11:54:45] [PASSED] 1 VF
[11:54:45] [PASSED] 2 VFs
[11:54:45] [PASSED] 3 VFs
[11:54:45] [PASSED] 4 VFs
[11:54:45] [PASSED] 5 VFs
[11:54:45] [PASSED] 6 VFs
[11:54:45] [PASSED] 7 VFs
[11:54:45] [PASSED] 8 VFs
[11:54:45] [PASSED] 9 VFs
[11:54:45] [PASSED] 10 VFs
[11:54:45] [PASSED] 11 VFs
[11:54:45] [PASSED] 12 VFs
[11:54:45] [PASSED] 13 VFs
[11:54:45] [PASSED] 14 VFs
[11:54:45] [PASSED] 15 VFs
[11:54:45] [PASSED] 16 VFs
[11:54:45] [PASSED] 17 VFs
[11:54:45] [PASSED] 18 VFs
[11:54:45] [PASSED] 19 VFs
[11:54:45] [PASSED] 20 VFs
[11:54:45] [PASSED] 21 VFs
[11:54:45] [PASSED] 22 VFs
[11:54:45] [PASSED] 23 VFs
[11:54:45] [PASSED] 24 VFs
[11:54:45] [PASSED] 25 VFs
[11:54:45] [PASSED] 26 VFs
[11:54:45] [PASSED] 27 VFs
[11:54:45] [PASSED] 28 VFs
[11:54:45] [PASSED] 29 VFs
[11:54:45] [PASSED] 30 VFs
[11:54:45] [PASSED] 31 VFs
[11:54:45] [PASSED] 32 VFs
[11:54:45] [PASSED] 33 VFs
[11:54:45] [PASSED] 34 VFs
[11:54:45] [PASSED] 35 VFs
[11:54:45] [PASSED] 36 VFs
[11:54:45] [PASSED] 37 VFs
[11:54:45] [PASSED] 38 VFs
[11:54:45] [PASSED] 39 VFs
[11:54:45] [PASSED] 40 VFs
[11:54:45] [PASSED] 41 VFs
[11:54:45] [PASSED] 42 VFs
[11:54:45] [PASSED] 43 VFs
[11:54:45] [PASSED] 44 VFs
[11:54:45] [PASSED] 45 VFs
[11:54:45] [PASSED] 46 VFs
[11:54:45] [PASSED] 47 VFs
[11:54:45] [PASSED] 48 VFs
[11:54:45] [PASSED] 49 VFs
[11:54:45] [PASSED] 50 VFs
[11:54:45] [PASSED] 51 VFs
[11:54:45] [PASSED] 52 VFs
[11:54:45] [PASSED] 53 VFs
[11:54:45] [PASSED] 54 VFs
[11:54:45] [PASSED] 55 VFs
[11:54:45] [PASSED] 56 VFs
[11:54:45] [PASSED] 57 VFs
[11:54:45] [PASSED] 58 VFs
[11:54:45] [PASSED] 59 VFs
[11:54:45] [PASSED] 60 VFs
[11:54:45] [PASSED] 61 VFs
[11:54:45] [PASSED] 62 VFs
[11:54:45] [PASSED] 63 VFs
[11:54:45] ================= [PASSED] fair_doorbells ==================
[11:54:45] ======================== fair_ggtt ========================
[11:54:45] [PASSED] 1 VF
[11:54:45] [PASSED] 2 VFs
[11:54:45] [PASSED] 3 VFs
[11:54:45] [PASSED] 4 VFs
[11:54:45] [PASSED] 5 VFs
[11:54:45] [PASSED] 6 VFs
[11:54:45] [PASSED] 7 VFs
[11:54:45] [PASSED] 8 VFs
[11:54:45] [PASSED] 9 VFs
[11:54:45] [PASSED] 10 VFs
[11:54:45] [PASSED] 11 VFs
[11:54:45] [PASSED] 12 VFs
[11:54:45] [PASSED] 13 VFs
[11:54:45] [PASSED] 14 VFs
[11:54:45] [PASSED] 15 VFs
[11:54:45] [PASSED] 16 VFs
[11:54:45] [PASSED] 17 VFs
[11:54:45] [PASSED] 18 VFs
[11:54:45] [PASSED] 19 VFs
[11:54:45] [PASSED] 20 VFs
[11:54:45] [PASSED] 21 VFs
[11:54:45] [PASSED] 22 VFs
[11:54:45] [PASSED] 23 VFs
[11:54:45] [PASSED] 24 VFs
[11:54:45] [PASSED] 25 VFs
[11:54:45] [PASSED] 26 VFs
[11:54:45] [PASSED] 27 VFs
[11:54:45] [PASSED] 28 VFs
[11:54:45] [PASSED] 29 VFs
[11:54:45] [PASSED] 30 VFs
[11:54:45] [PASSED] 31 VFs
[11:54:45] [PASSED] 32 VFs
[11:54:45] [PASSED] 33 VFs
[11:54:45] [PASSED] 34 VFs
[11:54:45] [PASSED] 35 VFs
[11:54:45] [PASSED] 36 VFs
[11:54:45] [PASSED] 37 VFs
[11:54:45] [PASSED] 38 VFs
[11:54:45] [PASSED] 39 VFs
[11:54:45] [PASSED] 40 VFs
[11:54:45] [PASSED] 41 VFs
[11:54:45] [PASSED] 42 VFs
[11:54:45] [PASSED] 43 VFs
[11:54:45] [PASSED] 44 VFs
[11:54:45] [PASSED] 45 VFs
[11:54:45] [PASSED] 46 VFs
[11:54:45] [PASSED] 47 VFs
[11:54:45] [PASSED] 48 VFs
[11:54:45] [PASSED] 49 VFs
[11:54:45] [PASSED] 50 VFs
[11:54:45] [PASSED] 51 VFs
[11:54:45] [PASSED] 52 VFs
[11:54:45] [PASSED] 53 VFs
[11:54:45] [PASSED] 54 VFs
[11:54:45] [PASSED] 55 VFs
[11:54:45] [PASSED] 56 VFs
[11:54:45] [PASSED] 57 VFs
[11:54:45] [PASSED] 58 VFs
[11:54:45] [PASSED] 59 VFs
[11:54:45] [PASSED] 60 VFs
[11:54:45] [PASSED] 61 VFs
[11:54:45] [PASSED] 62 VFs
[11:54:45] [PASSED] 63 VFs
[11:54:45] ==================== [PASSED] fair_ggtt ====================
[11:54:45] ======================== fair_vram ========================
[11:54:45] [PASSED] 1 VF
[11:54:45] [PASSED] 2 VFs
[11:54:45] [PASSED] 3 VFs
[11:54:45] [PASSED] 4 VFs
[11:54:45] [PASSED] 5 VFs
[11:54:45] [PASSED] 6 VFs
[11:54:45] [PASSED] 7 VFs
[11:54:45] [PASSED] 8 VFs
[11:54:45] [PASSED] 9 VFs
[11:54:45] [PASSED] 10 VFs
[11:54:45] [PASSED] 11 VFs
[11:54:45] [PASSED] 12 VFs
[11:54:45] [PASSED] 13 VFs
[11:54:45] [PASSED] 14 VFs
[11:54:45] [PASSED] 15 VFs
[11:54:45] [PASSED] 16 VFs
[11:54:45] [PASSED] 17 VFs
[11:54:45] [PASSED] 18 VFs
[11:54:45] [PASSED] 19 VFs
[11:54:45] [PASSED] 20 VFs
[11:54:45] [PASSED] 21 VFs
[11:54:45] [PASSED] 22 VFs
[11:54:45] [PASSED] 23 VFs
[11:54:45] [PASSED] 24 VFs
[11:54:45] [PASSED] 25 VFs
[11:54:45] [PASSED] 26 VFs
[11:54:45] [PASSED] 27 VFs
[11:54:45] [PASSED] 28 VFs
[11:54:45] [PASSED] 29 VFs
[11:54:45] [PASSED] 30 VFs
[11:54:45] [PASSED] 31 VFs
[11:54:45] [PASSED] 32 VFs
[11:54:45] [PASSED] 33 VFs
[11:54:45] [PASSED] 34 VFs
[11:54:45] [PASSED] 35 VFs
[11:54:45] [PASSED] 36 VFs
[11:54:45] [PASSED] 37 VFs
[11:54:45] [PASSED] 38 VFs
[11:54:45] [PASSED] 39 VFs
[11:54:45] [PASSED] 40 VFs
[11:54:45] [PASSED] 41 VFs
[11:54:45] [PASSED] 42 VFs
[11:54:45] [PASSED] 43 VFs
[11:54:45] [PASSED] 44 VFs
[11:54:45] [PASSED] 45 VFs
[11:54:45] [PASSED] 46 VFs
[11:54:45] [PASSED] 47 VFs
[11:54:45] [PASSED] 48 VFs
[11:54:45] [PASSED] 49 VFs
[11:54:45] [PASSED] 50 VFs
[11:54:45] [PASSED] 51 VFs
[11:54:45] [PASSED] 52 VFs
[11:54:45] [PASSED] 53 VFs
[11:54:45] [PASSED] 54 VFs
[11:54:45] [PASSED] 55 VFs
[11:54:45] [PASSED] 56 VFs
[11:54:45] [PASSED] 57 VFs
[11:54:45] [PASSED] 58 VFs
[11:54:45] [PASSED] 59 VFs
[11:54:45] [PASSED] 60 VFs
[11:54:45] [PASSED] 61 VFs
[11:54:45] [PASSED] 62 VFs
[11:54:45] [PASSED] 63 VFs
[11:54:45] ==================== [PASSED] fair_vram ====================
[11:54:45] ================== [PASSED] pf_gt_config ===================
[11:54:45] ===================== lmtt (1 subtest) =====================
[11:54:45] ======================== test_ops =========================
[11:54:45] [PASSED] 2-level
[11:54:45] [PASSED] multi-level
[11:54:45] ==================== [PASSED] test_ops =====================
[11:54:45] ====================== [PASSED] lmtt =======================
[11:54:45] ================= sriov_packet (1 subtest) =================
[11:54:45] [PASSED] test_descriptor_init
[11:54:45] ================== [PASSED] sriov_packet ===================
[11:54:45] ================= pf_service (11 subtests) =================
[11:54:45] [PASSED] pf_negotiate_any
[11:54:45] [PASSED] pf_negotiate_base_match
[11:54:45] [PASSED] pf_negotiate_base_newer
[11:54:45] [PASSED] pf_negotiate_base_next
[11:54:45] [SKIPPED] pf_negotiate_base_older (no older minor)
[11:54:45] [PASSED] pf_negotiate_base_prev
[11:54:45] [PASSED] pf_negotiate_latest_match
[11:54:45] [PASSED] pf_negotiate_latest_newer
[11:54:45] [PASSED] pf_negotiate_latest_next
[11:54:45] [SKIPPED] pf_negotiate_latest_older (no older minor)
[11:54:45] [SKIPPED] pf_negotiate_latest_prev (no prev major)
[11:54:45] =================== [PASSED] pf_service ====================
[11:54:45] ================= xe_guc_g2g (2 subtests) ==================
[11:54:45] ============== xe_live_guc_g2g_kunit_default ==============
[11:54:45] ========= [SKIPPED] xe_live_guc_g2g_kunit_default ==========
[11:54:45] ============== xe_live_guc_g2g_kunit_allmem ===============
[11:54:45] ========== [SKIPPED] xe_live_guc_g2g_kunit_allmem ==========
[11:54:45] =================== [SKIPPED] xe_guc_g2g ===================
[11:54:45] =================== xe_mocs (2 subtests) ===================
[11:54:45] ================ xe_live_mocs_kernel_kunit ================
[11:54:45] =========== [SKIPPED] xe_live_mocs_kernel_kunit ============
[11:54:45] ================ xe_live_mocs_reset_kunit =================
[11:54:45] ============ [SKIPPED] xe_live_mocs_reset_kunit ============
[11:54:45] ==================== [SKIPPED] xe_mocs =====================
[11:54:45] ================= xe_migrate (2 subtests) ==================
[11:54:45] ================= xe_migrate_sanity_kunit =================
[11:54:45] ============ [SKIPPED] xe_migrate_sanity_kunit =============
[11:54:45] ================== xe_validate_ccs_kunit ==================
[11:54:45] ============= [SKIPPED] xe_validate_ccs_kunit ==============
[11:54:45] =================== [SKIPPED] xe_migrate ===================
[11:54:45] ================== xe_dma_buf (1 subtest) ==================
[11:54:45] ==================== xe_dma_buf_kunit =====================
[11:54:45] ================ [SKIPPED] xe_dma_buf_kunit ================
[11:54:45] =================== [SKIPPED] xe_dma_buf ===================
[11:54:45] ================= xe_bo_shrink (1 subtest) =================
[11:54:45] =================== xe_bo_shrink_kunit ====================
[11:54:45] =============== [SKIPPED] xe_bo_shrink_kunit ===============
[11:54:45] ================== [SKIPPED] xe_bo_shrink ==================
[11:54:45] ==================== xe_bo (2 subtests) ====================
[11:54:45] ================== xe_ccs_migrate_kunit ===================
[11:54:45] ============== [SKIPPED] xe_ccs_migrate_kunit ==============
[11:54:45] ==================== xe_bo_evict_kunit ====================
[11:54:45] =============== [SKIPPED] xe_bo_evict_kunit ================
[11:54:45] ===================== [SKIPPED] xe_bo ======================
[11:54:45] =================== xe_any (9 subtests) ====================
[11:54:45] [PASSED] test_to_xe
[11:54:45] [PASSED] test_to_dev
[11:54:45] [PASSED] test_to_pdev
[11:54:45] [PASSED] test_to_drm
[11:54:45] [PASSED] test_if_pdev
[11:54:45] [PASSED] test_if_xe
[11:54:45] [PASSED] test_if_tile
[11:54:45] [PASSED] test_if_gt
[11:54:45] [PASSED] test_to_id
[11:54:45] ===================== [PASSED] xe_any ======================
[11:54:45] ==================== args (13 subtests) ====================
[11:54:45] [PASSED] count_args_test
[11:54:45] [PASSED] call_args_example
[11:54:45] [PASSED] call_args_test
[11:54:45] [PASSED] drop_first_arg_example
[11:54:45] [PASSED] drop_first_arg_test
[11:54:45] [PASSED] first_arg_example
[11:54:45] [PASSED] first_arg_test
[11:54:45] [PASSED] last_arg_example
[11:54:45] [PASSED] last_arg_test
[11:54:45] [PASSED] pick_arg_example
[11:54:45] [PASSED] if_args_example
[11:54:45] [PASSED] if_args_test
[11:54:45] [PASSED] sep_comma_example
[11:54:45] ====================== [PASSED] args =======================
[11:54:45] =================== xe_pci (3 subtests) ====================
[11:54:45] ==================== check_graphics_ip ====================
[11:54:45] [PASSED] 12.00 Xe_LP
[11:54:45] [PASSED] 12.10 Xe_LP+
[11:54:45] [PASSED] 12.55 Xe_HPG
[11:54:45] [PASSED] 12.60 Xe_HPC
[11:54:45] [PASSED] 12.70 Xe_LPG
[11:54:45] [PASSED] 12.71 Xe_LPG
[11:54:45] [PASSED] 12.74 Xe_LPG+
[11:54:45] [PASSED] 20.01 Xe2_HPG
[11:54:45] [PASSED] 20.02 Xe2_HPG
[11:54:45] [PASSED] 20.04 Xe2_LPG
[11:54:45] [PASSED] 30.00 Xe3_LPG
[11:54:45] [PASSED] 30.01 Xe3_LPG
[11:54:45] [PASSED] 30.03 Xe3_LPG
[11:54:45] [PASSED] 30.04 Xe3_LPG
[11:54:45] [PASSED] 30.05 Xe3_LPG
[11:54:45] [PASSED] 35.10 Xe3p_LPG
[11:54:45] [PASSED] 35.11 Xe3p_XPC
[11:54:45] ================ [PASSED] check_graphics_ip ================
[11:54:45] ===================== check_media_ip ======================
[11:54:45] [PASSED] 12.00 Xe_M
[11:54:45] [PASSED] 12.55 Xe_HPM
[11:54:45] [PASSED] 13.00 Xe_LPM+
[11:54:45] [PASSED] 13.01 Xe2_HPM
[11:54:45] [PASSED] 20.00 Xe2_LPM
[11:54:45] [PASSED] 30.00 Xe3_LPM
[11:54:45] [PASSED] 30.02 Xe3_LPM
[11:54:45] [PASSED] 35.00 Xe3p_LPM
[11:54:45] [PASSED] 35.03 Xe3p_HPM
[11:54:45] ================= [PASSED] check_media_ip ==================
[11:54:45] =================== check_platform_desc ===================
[11:54:45] [PASSED] 0x9A60 (TIGERLAKE)
[11:54:45] [PASSED] 0x9A68 (TIGERLAKE)
[11:54:45] [PASSED] 0x9A70 (TIGERLAKE)
[11:54:45] [PASSED] 0x9A40 (TIGERLAKE)
[11:54:45] [PASSED] 0x9A49 (TIGERLAKE)
[11:54:45] [PASSED] 0x9A59 (TIGERLAKE)
[11:54:45] [PASSED] 0x9A78 (TIGERLAKE)
[11:54:45] [PASSED] 0x9AC0 (TIGERLAKE)
[11:54:45] [PASSED] 0x9AC9 (TIGERLAKE)
[11:54:45] [PASSED] 0x9AD9 (TIGERLAKE)
[11:54:45] [PASSED] 0x9AF8 (TIGERLAKE)
[11:54:45] [PASSED] 0x4C80 (ROCKETLAKE)
[11:54:45] [PASSED] 0x4C8A (ROCKETLAKE)
[11:54:45] [PASSED] 0x4C8B (ROCKETLAKE)
[11:54:45] [PASSED] 0x4C8C (ROCKETLAKE)
[11:54:45] [PASSED] 0x4C90 (ROCKETLAKE)
[11:54:45] [PASSED] 0x4C9A (ROCKETLAKE)
[11:54:45] [PASSED] 0x4680 (ALDERLAKE_S)
[11:54:45] [PASSED] 0x4682 (ALDERLAKE_S)
[11:54:45] [PASSED] 0x4688 (ALDERLAKE_S)
[11:54:45] [PASSED] 0x468A (ALDERLAKE_S)
[11:54:45] [PASSED] 0x468B (ALDERLAKE_S)
[11:54:45] [PASSED] 0x4690 (ALDERLAKE_S)
[11:54:45] [PASSED] 0x4692 (ALDERLAKE_S)
[11:54:45] [PASSED] 0x4693 (ALDERLAKE_S)
[11:54:45] [PASSED] 0x46A0 (ALDERLAKE_P)
[11:54:45] [PASSED] 0x46A1 (ALDERLAKE_P)
[11:54:45] [PASSED] 0x46A2 (ALDERLAKE_P)
[11:54:45] [PASSED] 0x46A3 (ALDERLAKE_P)
[11:54:45] [PASSED] 0x46A6 (ALDERLAKE_P)
[11:54:45] [PASSED] 0x46A8 (ALDERLAKE_P)
[11:54:45] [PASSED] 0x46AA (ALDERLAKE_P)
[11:54:45] [PASSED] 0x462A (ALDERLAKE_P)
[11:54:45] [PASSED] 0x4626 (ALDERLAKE_P)
[11:54:45] [PASSED] 0x4628 (ALDERLAKE_P)
[11:54:45] [PASSED] 0x46B0 (ALDERLAKE_P)
[11:54:45] [PASSED] 0x46B1 (ALDERLAKE_P)
[11:54:45] [PASSED] 0x46B2 (ALDERLAKE_P)
[11:54:45] [PASSED] 0x46B3 (ALDERLAKE_P)
[11:54:45] [PASSED] 0x46C0 (ALDERLAKE_P)
[11:54:45] [PASSED] 0x46C1 (ALDERLAKE_P)
[11:54:45] [PASSED] 0x46C2 (ALDERLAKE_P)
[11:54:45] [PASSED] 0x46C3 (ALDERLAKE_P)
[11:54:45] [PASSED] 0x46D0 (ALDERLAKE_N)
[11:54:45] [PASSED] 0x46D1 (ALDERLAKE_N)
[11:54:45] [PASSED] 0x46D2 (ALDERLAKE_N)
[11:54:45] [PASSED] 0x46D3 (ALDERLAKE_N)
[11:54:45] [PASSED] 0x46D4 (ALDERLAKE_N)
[11:54:45] [PASSED] 0xA721 (ALDERLAKE_P)
[11:54:45] [PASSED] 0xA7A1 (ALDERLAKE_P)
[11:54:45] [PASSED] 0xA7A9 (ALDERLAKE_P)
[11:54:45] [PASSED] 0xA7AC (ALDERLAKE_P)
[11:54:45] [PASSED] 0xA7AD (ALDERLAKE_P)
[11:54:45] [PASSED] 0xA720 (ALDERLAKE_P)
[11:54:45] [PASSED] 0xA7A0 (ALDERLAKE_P)
[11:54:45] [PASSED] 0xA7A8 (ALDERLAKE_P)
[11:54:45] [PASSED] 0xA7AA (ALDERLAKE_P)
[11:54:45] [PASSED] 0xA7AB (ALDERLAKE_P)
[11:54:45] [PASSED] 0xA780 (ALDERLAKE_S)
[11:54:45] [PASSED] 0xA781 (ALDERLAKE_S)
[11:54:45] [PASSED] 0xA782 (ALDERLAKE_S)
[11:54:45] [PASSED] 0xA783 (ALDERLAKE_S)
[11:54:45] [PASSED] 0xA788 (ALDERLAKE_S)
[11:54:45] [PASSED] 0xA789 (ALDERLAKE_S)
[11:54:45] [PASSED] 0xA78A (ALDERLAKE_S)
[11:54:45] [PASSED] 0xA78B (ALDERLAKE_S)
[11:54:45] [PASSED] 0x4905 (DG1)
[11:54:45] [PASSED] 0x4906 (DG1)
[11:54:45] [PASSED] 0x4907 (DG1)
[11:54:45] [PASSED] 0x4908 (DG1)
[11:54:45] [PASSED] 0x4909 (DG1)
[11:54:45] [PASSED] 0x56C0 (DG2)
[11:54:45] [PASSED] 0x56C2 (DG2)
[11:54:45] [PASSED] 0x56C1 (DG2)
[11:54:45] [PASSED] 0x7D51 (METEORLAKE)
[11:54:45] [PASSED] 0x7DD1 (METEORLAKE)
[11:54:45] [PASSED] 0x7D41 (METEORLAKE)
[11:54:45] [PASSED] 0x7D67 (METEORLAKE)
[11:54:45] [PASSED] 0xB640 (METEORLAKE)
[11:54:45] [PASSED] 0x56A0 (DG2)
[11:54:45] [PASSED] 0x56A1 (DG2)
[11:54:45] [PASSED] 0x56A2 (DG2)
[11:54:45] [PASSED] 0x56BE (DG2)
[11:54:45] [PASSED] 0x56BF (DG2)
[11:54:45] [PASSED] 0x5690 (DG2)
[11:54:45] [PASSED] 0x5691 (DG2)
[11:54:45] [PASSED] 0x5692 (DG2)
[11:54:45] [PASSED] 0x56A5 (DG2)
[11:54:45] [PASSED] 0x56A6 (DG2)
[11:54:45] [PASSED] 0x56B0 (DG2)
[11:54:45] [PASSED] 0x56B1 (DG2)
[11:54:45] [PASSED] 0x56BA (DG2)
[11:54:45] [PASSED] 0x56BB (DG2)
[11:54:45] [PASSED] 0x56BC (DG2)
[11:54:45] [PASSED] 0x56BD (DG2)
[11:54:45] [PASSED] 0x5693 (DG2)
[11:54:45] [PASSED] 0x5694 (DG2)
[11:54:45] [PASSED] 0x5695 (DG2)
[11:54:45] [PASSED] 0x56A3 (DG2)
[11:54:45] [PASSED] 0x56A4 (DG2)
[11:54:45] [PASSED] 0x56B2 (DG2)
[11:54:45] [PASSED] 0x56B3 (DG2)
[11:54:45] [PASSED] 0x5696 (DG2)
[11:54:45] [PASSED] 0x5697 (DG2)
[11:54:45] [PASSED] 0xB69 (PVC)
[11:54:45] [PASSED] 0xB6E (PVC)
[11:54:45] [PASSED] 0xBD4 (PVC)
[11:54:45] [PASSED] 0xBD5 (PVC)
[11:54:45] [PASSED] 0xBD6 (PVC)
[11:54:45] [PASSED] 0xBD7 (PVC)
[11:54:45] [PASSED] 0xBD8 (PVC)
[11:54:45] [PASSED] 0xBD9 (PVC)
[11:54:45] [PASSED] 0xBDA (PVC)
[11:54:45] [PASSED] 0xBDB (PVC)
[11:54:45] [PASSED] 0xBE0 (PVC)
[11:54:45] [PASSED] 0xBE1 (PVC)
[11:54:45] [PASSED] 0xBE5 (PVC)
[11:54:45] [PASSED] 0x7D40 (METEORLAKE)
[11:54:45] [PASSED] 0x7D45 (METEORLAKE)
[11:54:45] [PASSED] 0x7D55 (METEORLAKE)
[11:54:45] [PASSED] 0x7D60 (METEORLAKE)
[11:54:45] [PASSED] 0x7DD5 (METEORLAKE)
[11:54:45] [PASSED] 0x6420 (LUNARLAKE)
[11:54:45] [PASSED] 0x64A0 (LUNARLAKE)
[11:54:45] [PASSED] 0x64B0 (LUNARLAKE)
[11:54:45] [PASSED] 0xE202 (BATTLEMAGE)
[11:54:45] [PASSED] 0xE209 (BATTLEMAGE)
[11:54:45] [PASSED] 0xE20B (BATTLEMAGE)
[11:54:45] [PASSED] 0xE20C (BATTLEMAGE)
[11:54:45] [PASSED] 0xE20D (BATTLEMAGE)
[11:54:45] [PASSED] 0xE210 (BATTLEMAGE)
[11:54:45] [PASSED] 0xE211 (BATTLEMAGE)
[11:54:45] [PASSED] 0xE212 (BATTLEMAGE)
[11:54:45] [PASSED] 0xE216 (BATTLEMAGE)
[11:54:45] [PASSED] 0xE220 (BATTLEMAGE)
[11:54:45] [PASSED] 0xE221 (BATTLEMAGE)
[11:54:45] [PASSED] 0xE222 (BATTLEMAGE)
[11:54:45] [PASSED] 0xE223 (BATTLEMAGE)
[11:54:45] [PASSED] 0xB080 (PANTHERLAKE)
[11:54:45] [PASSED] 0xB081 (PANTHERLAKE)
[11:54:45] [PASSED] 0xB082 (PANTHERLAKE)
[11:54:45] [PASSED] 0xB083 (PANTHERLAKE)
[11:54:45] [PASSED] 0xB084 (PANTHERLAKE)
[11:54:45] [PASSED] 0xB085 (PANTHERLAKE)
[11:54:45] [PASSED] 0xB086 (PANTHERLAKE)
[11:54:45] [PASSED] 0xB087 (PANTHERLAKE)
[11:54:45] [PASSED] 0xB08F (PANTHERLAKE)
[11:54:45] [PASSED] 0xB090 (PANTHERLAKE)
[11:54:45] [PASSED] 0xB0A0 (PANTHERLAKE)
[11:54:45] [PASSED] 0xB0B0 (PANTHERLAKE)
[11:54:45] [PASSED] 0xFD80 (PANTHERLAKE)
[11:54:45] [PASSED] 0xFD81 (PANTHERLAKE)
[11:54:45] [PASSED] 0xD740 (NOVALAKE_S)
[11:54:45] [PASSED] 0xD741 (NOVALAKE_S)
[11:54:45] [PASSED] 0xD742 (NOVALAKE_S)
[11:54:45] [PASSED] 0xD743 (NOVALAKE_S)
[11:54:45] [PASSED] 0xD745 (NOVALAKE_S)
[11:54:45] [PASSED] 0xD74A (NOVALAKE_S)
[11:54:45] [PASSED] 0xD74B (NOVALAKE_S)
[11:54:45] [PASSED] 0x674C (CRESCENTISLAND)
[11:54:45] [PASSED] 0x674D (CRESCENTISLAND)
[11:54:45] [PASSED] 0x674E (CRESCENTISLAND)
[11:54:45] [PASSED] 0x674F (CRESCENTISLAND)
[11:54:45] [PASSED] 0x6750 (CRESCENTISLAND)
[11:54:45] [PASSED] 0xD750 (NOVALAKE_P)
[11:54:45] [PASSED] 0xD751 (NOVALAKE_P)
[11:54:45] [PASSED] 0xD752 (NOVALAKE_P)
[11:54:45] [PASSED] 0xD753 (NOVALAKE_P)
[11:54:45] [PASSED] 0xD754 (NOVALAKE_P)
[11:54:45] [PASSED] 0xD755 (NOVALAKE_P)
[11:54:45] [PASSED] 0xD756 (NOVALAKE_P)
[11:54:45] [PASSED] 0xD757 (NOVALAKE_P)
[11:54:45] [PASSED] 0xD75F (NOVALAKE_P)
[11:54:45] =============== [PASSED] check_platform_desc ===============
[11:54:45] ===================== [PASSED] xe_pci ======================
[11:54:45] ============= xe_rtp_tables_test (5 subtests) ==============
[11:54:45] ================== xe_rtp_table_gt_test ===================
[11:54:45] [PASSED] gt_was/14011060649
[11:54:45] [PASSED] gt_was/14011059788
[11:54:45] [PASSED] gt_was/14015795083
[11:54:45] [PASSED] gt_was/16021867713
[11:54:45] [PASSED] gt_was/14019449301
[11:54:45] [PASSED] gt_was/16028005424
[11:54:45] [PASSED] gt_was/14026578760
[11:54:45] [PASSED] gt_was/1409420604
[11:54:45] [PASSED] gt_was/1408615072
[11:54:45] [PASSED] gt_was/22010523718
[11:54:45] [PASSED] gt_was/14011006942
[11:54:45] [PASSED] gt_was/14014830051
[11:54:45] [PASSED] gt_was/18018781329
[11:54:45] [PASSED] gt_was/1509235366
[11:54:45] [PASSED] gt_was/18018781329
[11:54:45] [PASSED] gt_was/16016694945
[11:54:45] [PASSED] gt_was/14018575942
[11:54:45] [PASSED] gt_was/22016670082
[11:54:45] [PASSED] gt_was/22016670082
[11:54:45] [PASSED] gt_was/14017421178
[11:54:45] [PASSED] gt_was/16025250150
[11:54:45] [PASSED] gt_was/14021871409
[11:54:45] [PASSED] gt_was/16021865536
[11:54:45] [PASSED] gt_was/14021486841
[11:54:45] [PASSED] gt_was/14025160223
[11:54:45] [PASSED] gt_was/14026144927, 16029437861, 14026127056
[11:54:45] [PASSED] gt_was/14025635424
[11:54:45] [PASSED] gt_was/16028005424
[11:54:45] ============== [PASSED] xe_rtp_table_gt_test ===============
[11:54:45] ================== xe_rtp_table_gt_test ===================
[11:54:45] [PASSED] gt_tunings/Tuning: Blend Fill Caching Optimization Disable
[11:54:45] [PASSED] gt_tunings/Tuning: 32B Access Enable
[11:54:45] [PASSED] gt_tunings/Tuning: L3 cache
[11:54:45] [PASSED] gt_tunings/Tuning: L3 cache - media
[11:54:45] [PASSED] gt_tunings/Tuning: Compression Overfetch
[11:54:45] [PASSED] gt_tunings/Tuning: Compression Overfetch - media
[11:54:45] [PASSED] gt_tunings/Tuning: Enable compressible partial write overfetch in L3
[11:54:45] [PASSED] gt_tunings/Tuning: Enable compressible partial write overfetch in L3 - media
[11:54:45] [PASSED] gt_tunings/Tuning: L2 Overfetch Compressible Only
[11:54:45] [PASSED] gt_tunings/Tuning: L2 Overfetch Compressible Only - media
[11:54:45] [PASSED] gt_tunings/Tuning: Stateless compression control
[11:54:45] [PASSED] gt_tunings/Tuning: Stateless compression control - media
[11:54:45] [PASSED] gt_tunings/Tuning: L3 RW flush all Cache
[11:54:45] [PASSED] gt_tunings/Tuning: L3 RW flush all cache - media
[11:54:45] [PASSED] gt_tunings/Tuning: Set STLB Bank Hash Mode to 4KB
[11:54:45] ============== [PASSED] xe_rtp_table_gt_test ===============
[11:54:45] ================== xe_rtp_table_oob_test ==================
[11:54:45] [PASSED] oob_was/1607983814
[11:54:45] [PASSED] oob_was/16010904313
[11:54:45] [PASSED] oob_was/18022495364
[11:54:45] [PASSED] oob_was/22012773006
[11:54:45] [PASSED] oob_was/14014475959
[11:54:45] [PASSED] oob_was/22011391025
[11:54:45] [PASSED] oob_was/22012727170
[11:54:45] [PASSED] oob_was/22012727685
[11:54:45] [PASSED] oob_was/22016596838
[11:54:45] [PASSED] oob_was/18020744125
[11:54:45] [PASSED] oob_was/1409600907
[11:54:45] [PASSED] oob_was/22014953428
[11:54:45] [PASSED] oob_was/16017236439
[11:54:45] [PASSED] oob_was/14019821291
[11:54:45] [PASSED] oob_was/14015076503
[11:54:45] [PASSED] oob_was/14018913170
[11:54:45] [PASSED] oob_was/14018094691
[11:54:45] [PASSED] oob_was/18024947630
[11:54:45] [PASSED] oob_was/16022287689
[11:54:45] [PASSED] oob_was/13011645652
[11:54:45] [PASSED] oob_was/14022293748
[11:54:45] [PASSED] oob_was/22019794406
[11:54:45] [PASSED] oob_was/22019338487
[11:54:45] [PASSED] oob_was/16023588340
[11:54:45] [PASSED] oob_was/14019789679
[11:54:45] [PASSED] oob_was/14022866841
[11:54:45] [PASSED] oob_was/16021333562
[11:54:45] [PASSED] oob_was/14016712196
[11:54:45] [PASSED] oob_was/14015568240
[11:54:45] [PASSED] oob_was/18013179988
[11:54:45] [PASSED] oob_was/1508761755
[11:54:45] [PASSED] oob_was/16023105232
[11:54:45] [PASSED] oob_was/16026508708
[11:54:45] [PASSED] oob_was/14020001231
[11:54:45] [PASSED] oob_was/16023683509
[11:54:45] [PASSED] oob_was/14025515070
[11:54:45] [PASSED] oob_was/15015404425_disable
[11:54:45] [PASSED] oob_was/16026007364
[11:54:45] [PASSED] oob_was/14020316580
[11:54:45] [PASSED] oob_was/14025883347
[11:54:45] [PASSED] oob_was/16029380221
[11:54:45] [PASSED] oob_was/22022079272
[11:54:45] [PASSED] oob_was/16029897822
[11:54:45] [PASSED] oob_was/14027054324
[11:54:45] ============== [PASSED] xe_rtp_table_oob_test ==============
[11:54:45] ================ xe_rtp_table_dev_oob_test ================
[11:54:45] [PASSED] device_oob_was/22010954014
[11:54:45] [PASSED] device_oob_was/15015404425
[11:54:45] [PASSED] device_oob_was/22019338487_display
[11:54:45] [PASSED] device_oob_was/14022085890
[11:54:45] [PASSED] device_oob_was/14026539277
[11:54:45] [PASSED] device_oob_was/14026633728
[11:54:45] [PASSED] device_oob_was/14026746987
[11:54:45] [PASSED] device_oob_was/14026779378
[11:54:45] ============ [PASSED] xe_rtp_table_dev_oob_test ============
[11:54:45] ========== xe_rtp_table_missing_upper_bound_test ==========
[11:54:45] [PASSED] register_whitelist/WaAllowPMDepthAndInvocationCountAccessFromUMD, 1408556865
[11:54:45] [PASSED] register_whitelist/1508744258, 14012131227, 1808121037
[11:54:45] [PASSED] register_whitelist/1806527549
[11:54:45] [PASSED] register_whitelist/allow_read_ctx_timestamp
[11:54:45] [PASSED] register_whitelist/allow_read_queue_timestamp
[11:54:45] [PASSED] register_whitelist/16014440446
[11:54:45] [PASSED] register_whitelist/16017236439
[11:54:45] [PASSED] register_whitelist/16020183090
[11:54:45] [PASSED] register_whitelist/14024997852
[11:54:45] [PASSED] register_whitelist/14024997852
[11:54:45] ====== [PASSED] xe_rtp_table_missing_upper_bound_test ======
[11:54:45] =============== [PASSED] xe_rtp_tables_test ================
[11:54:45] =================== xe_rtp (3 subtests) ====================
[11:54:45] =================== xe_rtp_rules_tests ====================
[11:54:45] [PASSED] no
[11:54:45] [PASSED] yes
[11:54:45] [PASSED] no-and-no
[11:54:45] [PASSED] no-and-yes
[11:54:45] [PASSED] yes-and-no
[11:54:45] [PASSED] yes-and-yes
[11:54:45] [PASSED] no-or-no
[11:54:45] [PASSED] no-or-yes
[11:54:45] [PASSED] yes-or-no
[11:54:45] [PASSED] yes-or-yes
[11:54:45] [PASSED] no-yes-or-yes-no
[11:54:45] [PASSED] no-yes-or-yes-yes
[11:54:45] [PASSED] yes-yes-or-no-yes
[11:54:45] [PASSED] yes-yes-or-yes-yes
[11:54:45] [PASSED] no-no-or-yes-or-no
[11:54:45] [PASSED] or
[11:54:45] [PASSED] or-yes
[11:54:45] [PASSED] or-no
[11:54:45] [PASSED] yes-or
[11:54:45] [PASSED] no-or
[11:54:45] [PASSED] no-or-or-yes
[11:54:45] [PASSED] yes-or-or-no
[11:54:45] [PASSED] no-or-or-no
[11:54:45] [PASSED] missing-context-engine-class
[11:54:45] [PASSED] missing-context-engine-class-or-yes
[11:54:45] [PASSED] missing-context-engine-class-or-or-yes
[11:54:45] =============== [PASSED] xe_rtp_rules_tests ================
[11:54:45] =============== xe_rtp_process_to_sr_tests ================
[11:54:45] [PASSED] coalesce-same-reg
[11:54:45] [PASSED] coalesce-same-reg-literal-and-func
[11:54:45] [PASSED] no-match-no-add
[11:54:45] [PASSED] two-regs-two-entries
[11:54:45] [PASSED] clr-one-set-other
[11:54:45] [PASSED] set-field
[11:54:45] [PASSED] conflict-duplicate
[11:54:45] [PASSED] conflict-not-disjoint
[11:54:45] [PASSED] conflict-not-disjoint-literal-and-func
[11:54:45] [PASSED] conflict-reg-type
[11:54:45] [PASSED] bad-mcr-reg-forced-to-regular
[11:54:45] [PASSED] bad-regular-reg-forced-to-mcr
[11:54:45] =========== [PASSED] xe_rtp_process_to_sr_tests ============
[11:54:45] ================== xe_rtp_process_tests ===================
[11:54:45] [PASSED] active1
[11:54:45] [PASSED] active2
[11:54:45] [PASSED] active-inactive
[11:54:45] [PASSED] inactive-active
[11:54:45] [PASSED] inactive-active-inactive
[11:54:45] [PASSED] inactive-inactive-inactive
[11:54:45] ============== [PASSED] xe_rtp_process_tests ===============
[11:54:45] ===================== [PASSED] xe_rtp ======================
[11:54:45] ==================== xe_wa (1 subtest) =====================
[11:54:45] ======================== xe_wa_gt =========================
[11:54:45] [PASSED] TIGERLAKE B0
[11:54:45] [PASSED] DG1 A0
[11:54:45] [PASSED] DG1 B0
[11:54:45] [PASSED] ALDERLAKE_S A0
[11:54:45] [PASSED] ALDERLAKE_S B0
[11:54:45] [PASSED] ALDERLAKE_S C0
[11:54:45] [PASSED] ALDERLAKE_S D0
[11:54:45] [PASSED] ALDERLAKE_P A0
[11:54:45] [PASSED] ALDERLAKE_P B0
[11:54:45] [PASSED] ALDERLAKE_P C0
[11:54:45] [PASSED] ALDERLAKE_S RPLS D0
[11:54:45] [PASSED] ALDERLAKE_P RPLU E0
[11:54:45] [PASSED] DG2 G10 C0
[11:54:45] [PASSED] DG2 G11 B1
[11:54:45] [PASSED] DG2 G12 A1
[11:54:45] [PASSED] METEORLAKE 12.70(Xe_LPG) A0 13.00(Xe_LPM+) A0
[11:54:45] [PASSED] METEORLAKE 12.71(Xe_LPG) A0 13.00(Xe_LPM+) A0
[11:54:45] [PASSED] METEORLAKE 12.74(Xe_LPG+) A0 13.00(Xe_LPM+) A0
[11:54:45] [PASSED] LUNARLAKE 20.04(Xe2_LPG) A0 20.00(Xe2_LPM) A0
[11:54:45] [PASSED] LUNARLAKE 20.04(Xe2_LPG) B0 20.00(Xe2_LPM) A0
[11:54:45] [PASSED] BATTLEMAGE 20.01(Xe2_HPG) A0 13.01(Xe2_HPM) A1
[11:54:45] [PASSED] PANTHERLAKE 30.00(Xe3_LPG) A0 30.00(Xe3_LPM) A0
[11:54:45] ==================== [PASSED] xe_wa_gt =====================
[11:54:45] ====================== [PASSED] xe_wa ======================
[11:54:45] ============================================================
[11:54:45] Testing complete. Ran 793 tests: passed: 765, skipped: 28
[11:54:45] Elapsed time: 36.093s total, 1.805s configuring, 33.570s building, 0.711s running
+ for kcfg in "${kunitconfigs[@]}"
+ [[ ! -f /kernel/drivers/gpu/drm/tests/.kunitconfig ]]
+ /kernel/tools/testing/kunit/kunit.py run --kunitconfig /kernel/drivers/gpu/drm/tests/.kunitconfig
[11:54:45] Configuring KUnit Kernel ...
Regenerating .config ...
Populating config with:
$ make ARCH=um O=.kunit olddefconfig
[11:54:47] 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
[11:55:12] Starting KUnit Kernel (1/1)...
[11:55:12] ============================================================
Running tests with:
$ .kunit/linux kunit.enable=1 mem=1G console=tty kunit_shutdown=halt
[11:55:12] ============= refcount_interrupt (4 subtests) ==============
[11:55:12] [PASSED] test_single_irq_change
[11:55:12] [PASSED] test_nested_irq_change
[11:55:12] [PASSED] test_multiple_irq_change
[11:55:12] [PASSED] test_irq_save
[11:55:12] =============== [PASSED] refcount_interrupt ================
[11:55:12] ============ drm_test_pick_cmdline (2 subtests) ============
[11:55:12] [PASSED] drm_test_pick_cmdline_res_1920_1080_60
[11:55:12] =============== drm_test_pick_cmdline_named ===============
[11:55:12] [PASSED] NTSC
[11:55:12] [PASSED] NTSC-J
[11:55:12] [PASSED] PAL
[11:55:12] [PASSED] PAL-M
[11:55:12] =========== [PASSED] drm_test_pick_cmdline_named ===========
[11:55:12] ============== [PASSED] drm_test_pick_cmdline ==============
[11:55:12] == drm_test_atomic_get_connector_for_encoder (1 subtest) ===
[11:55:12] [PASSED] drm_test_drm_atomic_get_connector_for_encoder
[11:55:12] ==== [PASSED] drm_test_atomic_get_connector_for_encoder ====
[11:55:12] =========== drm_validate_clone_mode (2 subtests) ===========
[11:55:12] ============== drm_test_check_in_clone_mode ===============
[11:55:12] [PASSED] in_clone_mode
[11:55:12] [PASSED] not_in_clone_mode
[11:55:12] ========== [PASSED] drm_test_check_in_clone_mode ===========
[11:55:12] =============== drm_test_check_valid_clones ===============
[11:55:12] [PASSED] not_in_clone_mode
[11:55:12] [PASSED] valid_clone
[11:55:12] [PASSED] invalid_clone
[11:55:12] =========== [PASSED] drm_test_check_valid_clones ===========
[11:55:12] ============= [PASSED] drm_validate_clone_mode =============
[11:55:12] ============= drm_validate_modeset (1 subtest) =============
[11:55:12] [PASSED] drm_test_check_connector_changed_modeset
[11:55:12] ============== [PASSED] drm_validate_modeset ===============
[11:55:12] ====== drm_test_bridge_get_current_state (1 subtest) =======
[11:55:12] [PASSED] drm_test_drm_bridge_get_current_state_atomic
[11:55:12] ======== [PASSED] drm_test_bridge_get_current_state ========
[11:55:12] ====== drm_test_bridge_helper_reset_crtc (3 subtests) ======
[11:55:12] [PASSED] drm_test_drm_bridge_helper_reset_crtc_atomic
[11:55:12] [PASSED] drm_test_drm_bridge_helper_reset_crtc_atomic_disabled
[11:55:12] [PASSED] drm_test_drm_bridge_helper_hdmi_output_bus_fmts
[11:55:12] ======== [PASSED] drm_test_bridge_helper_reset_crtc ========
[11:55:12] ============== drm_bridge_alloc (2 subtests) ===============
[11:55:12] [PASSED] drm_test_drm_bridge_alloc_basic
[11:55:12] [PASSED] drm_test_drm_bridge_alloc_get_put
[11:55:12] ================ [PASSED] drm_bridge_alloc =================
[11:55:12] ============= drm_bridge_bus_fmt (5 subtests) ==============
[11:55:12] [PASSED] drm_test_bridge_rgb_yuv_rgb
[11:55:12] [PASSED] drm_test_bridge_must_convert_to_yuv444
[11:55:12] [PASSED] drm_test_bridge_hdmi_auto_rgb
[11:55:12] [PASSED] drm_test_bridge_auto_first
[11:55:12] [PASSED] drm_test_bridge_rgb_yuv_no_path
[11:55:12] =============== [PASSED] drm_bridge_bus_fmt ================
[11:55:12] ============= drm_cmdline_parser (40 subtests) =============
[11:55:12] [PASSED] drm_test_cmdline_force_d_only
[11:55:12] [PASSED] drm_test_cmdline_force_D_only_dvi
[11:55:12] [PASSED] drm_test_cmdline_force_D_only_hdmi
[11:55:12] [PASSED] drm_test_cmdline_force_D_only_not_digital
[11:55:12] [PASSED] drm_test_cmdline_force_e_only
[11:55:12] [PASSED] drm_test_cmdline_res
[11:55:12] [PASSED] drm_test_cmdline_res_vesa
[11:55:12] [PASSED] drm_test_cmdline_res_vesa_rblank
[11:55:12] [PASSED] drm_test_cmdline_res_rblank
[11:55:12] [PASSED] drm_test_cmdline_res_bpp
[11:55:12] [PASSED] drm_test_cmdline_res_refresh
[11:55:12] [PASSED] drm_test_cmdline_res_bpp_refresh
[11:55:12] [PASSED] drm_test_cmdline_res_bpp_refresh_interlaced
[11:55:12] [PASSED] drm_test_cmdline_res_bpp_refresh_margins
[11:55:12] [PASSED] drm_test_cmdline_res_bpp_refresh_force_off
[11:55:12] [PASSED] drm_test_cmdline_res_bpp_refresh_force_on
[11:55:12] [PASSED] drm_test_cmdline_res_bpp_refresh_force_on_analog
[11:55:12] [PASSED] drm_test_cmdline_res_bpp_refresh_force_on_digital
[11:55:12] [PASSED] drm_test_cmdline_res_bpp_refresh_interlaced_margins_force_on
[11:55:12] [PASSED] drm_test_cmdline_res_margins_force_on
[11:55:12] [PASSED] drm_test_cmdline_res_vesa_margins
[11:55:12] [PASSED] drm_test_cmdline_name
[11:55:12] [PASSED] drm_test_cmdline_name_bpp
[11:55:12] [PASSED] drm_test_cmdline_name_option
[11:55:12] [PASSED] drm_test_cmdline_name_bpp_option
[11:55:12] [PASSED] drm_test_cmdline_rotate_0
[11:55:12] [PASSED] drm_test_cmdline_rotate_90
[11:55:12] [PASSED] drm_test_cmdline_rotate_180
[11:55:12] [PASSED] drm_test_cmdline_rotate_270
[11:55:12] [PASSED] drm_test_cmdline_hmirror
[11:55:12] [PASSED] drm_test_cmdline_vmirror
[11:55:12] [PASSED] drm_test_cmdline_margin_options
[11:55:12] [PASSED] drm_test_cmdline_multiple_options
[11:55:12] [PASSED] drm_test_cmdline_bpp_extra_and_option
[11:55:12] [PASSED] drm_test_cmdline_extra_and_option
[11:55:12] [PASSED] drm_test_cmdline_freestanding_options
[11:55:12] [PASSED] drm_test_cmdline_freestanding_force_e_and_options
[11:55:12] [PASSED] drm_test_cmdline_panel_orientation
[11:55:12] ================ drm_test_cmdline_invalid =================
[11:55:12] [PASSED] margin_only
[11:55:12] [PASSED] interlace_only
[11:55:12] [PASSED] res_missing_x
[11:55:12] [PASSED] res_missing_y
[11:55:12] [PASSED] res_bad_y
[11:55:12] [PASSED] res_missing_y_bpp
[11:55:12] [PASSED] res_bad_bpp
[11:55:12] [PASSED] res_bad_refresh
[11:55:12] [PASSED] res_bpp_refresh_force_on_off
[11:55:12] [PASSED] res_invalid_mode
[11:55:12] [PASSED] res_bpp_wrong_place_mode
[11:55:12] [PASSED] name_bpp_refresh
[11:55:12] [PASSED] name_refresh
[11:55:12] [PASSED] name_refresh_wrong_mode
[11:55:12] [PASSED] name_refresh_invalid_mode
[11:55:12] [PASSED] rotate_multiple
[11:55:12] [PASSED] rotate_invalid_val
[11:55:12] [PASSED] rotate_truncated
[11:55:12] [PASSED] invalid_option
[11:55:12] [PASSED] invalid_tv_option
[11:55:12] [PASSED] truncated_tv_option
[11:55:12] ============ [PASSED] drm_test_cmdline_invalid =============
[11:55:12] =============== drm_test_cmdline_tv_options ===============
[11:55:12] [PASSED] NTSC
[11:55:12] [PASSED] NTSC_443
[11:55:12] [PASSED] NTSC_J
[11:55:12] [PASSED] PAL
[11:55:12] [PASSED] PAL_M
[11:55:12] [PASSED] PAL_N
[11:55:12] [PASSED] SECAM
[11:55:12] [PASSED] MONO_525
[11:55:12] [PASSED] MONO_625
[11:55:12] =========== [PASSED] drm_test_cmdline_tv_options ===========
[11:55:12] =============== [PASSED] drm_cmdline_parser ================
[11:55:12] ========== drmm_connector_hdmi_init (20 subtests) ==========
[11:55:12] [PASSED] drm_test_connector_hdmi_init_valid
[11:55:12] [PASSED] drm_test_connector_hdmi_init_bpc_8
[11:55:12] [PASSED] drm_test_connector_hdmi_init_bpc_10
[11:55:12] [PASSED] drm_test_connector_hdmi_init_bpc_12
[11:55:12] [PASSED] drm_test_connector_hdmi_init_bpc_invalid
[11:55:12] [PASSED] drm_test_connector_hdmi_init_bpc_null
[11:55:12] [PASSED] drm_test_connector_hdmi_init_formats_empty
[11:55:12] [PASSED] drm_test_connector_hdmi_init_formats_no_rgb
[11:55:12] === drm_test_connector_hdmi_init_formats_yuv420_allowed ===
[11:55:12] [PASSED] supported_formats=0x9 yuv420_allowed=1
[11:55:12] [PASSED] supported_formats=0x9 yuv420_allowed=0
[11:55:12] [PASSED] supported_formats=0x5 yuv420_allowed=1
[11:55:12] [PASSED] supported_formats=0x5 yuv420_allowed=0
[11:55:12] === [PASSED] drm_test_connector_hdmi_init_formats_yuv420_allowed ===
[11:55:12] [PASSED] drm_test_connector_hdmi_init_null_ddc
[11:55:12] [PASSED] drm_test_connector_hdmi_init_null_product
[11:55:12] [PASSED] drm_test_connector_hdmi_init_null_vendor
[11:55:12] [PASSED] drm_test_connector_hdmi_init_product_length_exact
[11:55:12] [PASSED] drm_test_connector_hdmi_init_product_length_too_long
[11:55:12] [PASSED] drm_test_connector_hdmi_init_product_valid
[11:55:12] [PASSED] drm_test_connector_hdmi_init_vendor_length_exact
[11:55:12] [PASSED] drm_test_connector_hdmi_init_vendor_length_too_long
[11:55:12] [PASSED] drm_test_connector_hdmi_init_vendor_valid
[11:55:12] ========= drm_test_connector_hdmi_init_type_valid =========
[11:55:12] [PASSED] HDMI-A
[11:55:12] [PASSED] HDMI-B
[11:55:12] ===== [PASSED] drm_test_connector_hdmi_init_type_valid =====
[11:55:12] ======== drm_test_connector_hdmi_init_type_invalid ========
[11:55:12] [PASSED] Unknown
[11:55:12] [PASSED] VGA
[11:55:12] [PASSED] DVI-I
[11:55:12] [PASSED] DVI-D
[11:55:12] [PASSED] DVI-A
[11:55:12] [PASSED] Composite
[11:55:12] [PASSED] SVIDEO
[11:55:12] [PASSED] LVDS
[11:55:12] [PASSED] Component
[11:55:12] [PASSED] DIN
[11:55:12] [PASSED] DP
[11:55:12] [PASSED] TV
[11:55:12] [PASSED] eDP
[11:55:12] [PASSED] Virtual
[11:55:12] [PASSED] DSI
[11:55:12] [PASSED] DPI
[11:55:12] [PASSED] Writeback
[11:55:12] [PASSED] SPI
[11:55:12] [PASSED] USB
[11:55:12] ==== [PASSED] drm_test_connector_hdmi_init_type_invalid ====
[11:55:12] ============ [PASSED] drmm_connector_hdmi_init =============
[11:55:12] ============= drmm_connector_init (3 subtests) =============
[11:55:12] [PASSED] drm_test_drmm_connector_init
[11:55:12] [PASSED] drm_test_drmm_connector_init_null_ddc
[11:55:12] ========= drm_test_drmm_connector_init_type_valid =========
[11:55:12] [PASSED] Unknown
[11:55:12] [PASSED] VGA
[11:55:12] [PASSED] DVI-I
[11:55:12] [PASSED] DVI-D
[11:55:12] [PASSED] DVI-A
[11:55:12] [PASSED] Composite
[11:55:12] [PASSED] SVIDEO
[11:55:12] [PASSED] LVDS
[11:55:12] [PASSED] Component
[11:55:12] [PASSED] DIN
[11:55:12] [PASSED] DP
[11:55:12] [PASSED] HDMI-A
[11:55:12] [PASSED] HDMI-B
[11:55:12] [PASSED] TV
[11:55:12] [PASSED] eDP
[11:55:12] [PASSED] Virtual
[11:55:12] [PASSED] DSI
[11:55:12] [PASSED] DPI
[11:55:12] [PASSED] Writeback
[11:55:12] [PASSED] SPI
[11:55:12] [PASSED] USB
[11:55:12] ===== [PASSED] drm_test_drmm_connector_init_type_valid =====
[11:55:12] =============== [PASSED] drmm_connector_init ===============
[11:55:12] ========= drm_connector_dynamic_init (6 subtests) ==========
[11:55:12] [PASSED] drm_test_drm_connector_dynamic_init
[11:55:12] [PASSED] drm_test_drm_connector_dynamic_init_null_ddc
[11:55:12] [PASSED] drm_test_drm_connector_dynamic_init_not_added
[11:55:12] [PASSED] drm_test_drm_connector_dynamic_init_properties
[11:55:12] ===== drm_test_drm_connector_dynamic_init_type_valid ======
[11:55:12] [PASSED] Unknown
[11:55:12] [PASSED] VGA
[11:55:12] [PASSED] DVI-I
[11:55:12] [PASSED] DVI-D
[11:55:12] [PASSED] DVI-A
[11:55:12] [PASSED] Composite
[11:55:12] [PASSED] SVIDEO
[11:55:12] [PASSED] LVDS
[11:55:12] [PASSED] Component
[11:55:12] [PASSED] DIN
[11:55:12] [PASSED] DP
[11:55:12] [PASSED] HDMI-A
[11:55:12] [PASSED] HDMI-B
[11:55:12] [PASSED] TV
[11:55:12] [PASSED] eDP
[11:55:12] [PASSED] Virtual
[11:55:12] [PASSED] DSI
[11:55:12] [PASSED] DPI
[11:55:12] [PASSED] Writeback
[11:55:12] [PASSED] SPI
[11:55:12] [PASSED] USB
[11:55:12] = [PASSED] drm_test_drm_connector_dynamic_init_type_valid ==
[11:55:12] ======== drm_test_drm_connector_dynamic_init_name =========
[11:55:12] [PASSED] Unknown
[11:55:12] [PASSED] VGA
[11:55:12] [PASSED] DVI-I
[11:55:12] [PASSED] DVI-D
[11:55:12] [PASSED] DVI-A
[11:55:12] [PASSED] Composite
[11:55:12] [PASSED] SVIDEO
[11:55:12] [PASSED] LVDS
[11:55:12] [PASSED] Component
[11:55:12] [PASSED] DIN
[11:55:12] [PASSED] DP
[11:55:12] [PASSED] HDMI-A
[11:55:12] [PASSED] HDMI-B
[11:55:12] [PASSED] TV
[11:55:12] [PASSED] eDP
[11:55:12] [PASSED] Virtual
[11:55:12] [PASSED] DSI
[11:55:12] [PASSED] DPI
[11:55:12] [PASSED] Writeback
[11:55:12] [PASSED] SPI
[11:55:12] [PASSED] USB
[11:55:12] ==== [PASSED] drm_test_drm_connector_dynamic_init_name =====
[11:55:12] =========== [PASSED] drm_connector_dynamic_init ============
[11:55:12] ==== drm_connector_dynamic_register_early (4 subtests) =====
[11:55:12] [PASSED] drm_test_drm_connector_dynamic_register_early_on_list
[11:55:12] [PASSED] drm_test_drm_connector_dynamic_register_early_defer
[11:55:12] [PASSED] drm_test_drm_connector_dynamic_register_early_no_init
[11:55:12] [PASSED] drm_test_drm_connector_dynamic_register_early_no_mode_object
[11:55:12] ====== [PASSED] drm_connector_dynamic_register_early =======
[11:55:12] ======= drm_connector_dynamic_register (7 subtests) ========
[11:55:12] [PASSED] drm_test_drm_connector_dynamic_register_on_list
[11:55:12] [PASSED] drm_test_drm_connector_dynamic_register_no_defer
[11:55:12] [PASSED] drm_test_drm_connector_dynamic_register_no_init
[11:55:12] [PASSED] drm_test_drm_connector_dynamic_register_mode_object
[11:55:12] [PASSED] drm_test_drm_connector_dynamic_register_sysfs
[11:55:12] [PASSED] drm_test_drm_connector_dynamic_register_sysfs_name
[11:55:12] [PASSED] drm_test_drm_connector_dynamic_register_debugfs
[11:55:12] ========= [PASSED] drm_connector_dynamic_register ==========
[11:55:12] = drm_connector_attach_broadcast_rgb_property (2 subtests) =
[11:55:12] [PASSED] drm_test_drm_connector_attach_broadcast_rgb_property
[11:55:12] [PASSED] drm_test_drm_connector_attach_broadcast_rgb_property_hdmi_connector
[11:55:12] === [PASSED] drm_connector_attach_broadcast_rgb_property ===
[11:55:12] ========== drm_get_tv_mode_from_name (2 subtests) ==========
[11:55:12] ========== drm_test_get_tv_mode_from_name_valid ===========
[11:55:12] [PASSED] NTSC
[11:55:12] [PASSED] NTSC-443
[11:55:12] [PASSED] NTSC-J
[11:55:12] [PASSED] PAL
[11:55:12] [PASSED] PAL-M
[11:55:12] [PASSED] PAL-N
[11:55:12] [PASSED] SECAM
[11:55:12] [PASSED] Mono
[11:55:12] ====== [PASSED] drm_test_get_tv_mode_from_name_valid =======
[11:55:12] [PASSED] drm_test_get_tv_mode_from_name_truncated
[11:55:12] ============ [PASSED] drm_get_tv_mode_from_name ============
[11:55:12] = drm_test_connector_hdmi_compute_mode_clock (12 subtests) =
[11:55:12] [PASSED] drm_test_drm_hdmi_compute_mode_clock_rgb
[11:55:12] [PASSED] drm_test_drm_hdmi_compute_mode_clock_rgb_10bpc
[11:55:12] [PASSED] drm_test_drm_hdmi_compute_mode_clock_rgb_10bpc_vic_1
[11:55:12] [PASSED] drm_test_drm_hdmi_compute_mode_clock_rgb_12bpc
[11:55:12] [PASSED] drm_test_drm_hdmi_compute_mode_clock_rgb_12bpc_vic_1
[11:55:12] [PASSED] drm_test_drm_hdmi_compute_mode_clock_rgb_double
[11:55:12] = drm_test_connector_hdmi_compute_mode_clock_yuv420_valid =
[11:55:12] [PASSED] VIC 96
[11:55:12] [PASSED] VIC 97
[11:55:12] [PASSED] VIC 101
[11:55:12] [PASSED] VIC 102
[11:55:12] [PASSED] VIC 106
[11:55:12] [PASSED] VIC 107
[11:55:12] === [PASSED] drm_test_connector_hdmi_compute_mode_clock_yuv420_valid ===
[11:55:12] [PASSED] drm_test_connector_hdmi_compute_mode_clock_yuv420_10_bpc
[11:55:12] [PASSED] drm_test_connector_hdmi_compute_mode_clock_yuv420_12_bpc
[11:55:12] [PASSED] drm_test_connector_hdmi_compute_mode_clock_yuv422_8_bpc
[11:55:12] [PASSED] drm_test_connector_hdmi_compute_mode_clock_yuv422_10_bpc
[11:55:12] [PASSED] drm_test_connector_hdmi_compute_mode_clock_yuv422_12_bpc
[11:55:12] === [PASSED] drm_test_connector_hdmi_compute_mode_clock ====
[11:55:12] == drm_hdmi_connector_get_broadcast_rgb_name (2 subtests) ==
[11:55:12] === drm_test_drm_hdmi_connector_get_broadcast_rgb_name ====
[11:55:12] [PASSED] Automatic
[11:55:12] [PASSED] Full
[11:55:12] [PASSED] Limited 16:235
[11:55:12] === [PASSED] drm_test_drm_hdmi_connector_get_broadcast_rgb_name ===
[11:55:12] [PASSED] drm_test_drm_hdmi_connector_get_broadcast_rgb_name_invalid
[11:55:12] ==== [PASSED] drm_hdmi_connector_get_broadcast_rgb_name ====
[11:55:12] == drm_hdmi_connector_get_output_format_name (2 subtests) ==
[11:55:12] === drm_test_drm_hdmi_connector_get_output_format_name ====
[11:55:12] [PASSED] RGB
[11:55:12] [PASSED] YUV 4:2:0
[11:55:12] [PASSED] YUV 4:2:2
[11:55:12] [PASSED] YUV 4:4:4
[11:55:12] === [PASSED] drm_test_drm_hdmi_connector_get_output_format_name ===
[11:55:12] [PASSED] drm_test_drm_hdmi_connector_get_output_format_name_invalid
[11:55:12] ==== [PASSED] drm_hdmi_connector_get_output_format_name ====
[11:55:12] ============= drm_damage_helper (21 subtests) ==============
[11:55:12] [PASSED] drm_test_damage_iter_no_damage
[11:55:12] [PASSED] drm_test_damage_iter_no_damage_fractional_src
[11:55:12] [PASSED] drm_test_damage_iter_no_damage_src_moved
[11:55:12] [PASSED] drm_test_damage_iter_no_damage_fractional_src_moved
[11:55:12] [PASSED] drm_test_damage_iter_no_damage_not_visible
[11:55:12] [PASSED] drm_test_damage_iter_no_damage_no_crtc
[11:55:12] [PASSED] drm_test_damage_iter_no_damage_no_fb
[11:55:12] [PASSED] drm_test_damage_iter_simple_damage
[11:55:12] [PASSED] drm_test_damage_iter_single_damage
[11:55:12] [PASSED] drm_test_damage_iter_single_damage_intersect_src
[11:55:12] [PASSED] drm_test_damage_iter_single_damage_outside_src
[11:55:12] [PASSED] drm_test_damage_iter_single_damage_fractional_src
[11:55:12] [PASSED] drm_test_damage_iter_single_damage_intersect_fractional_src
[11:55:12] [PASSED] drm_test_damage_iter_single_damage_outside_fractional_src
[11:55:12] [PASSED] drm_test_damage_iter_single_damage_src_moved
[11:55:12] [PASSED] drm_test_damage_iter_single_damage_fractional_src_moved
[11:55:12] [PASSED] drm_test_damage_iter_damage
[11:55:12] [PASSED] drm_test_damage_iter_damage_one_intersect
[11:55:12] [PASSED] drm_test_damage_iter_damage_one_outside
[11:55:12] [PASSED] drm_test_damage_iter_damage_src_moved
[11:55:12] [PASSED] drm_test_damage_iter_damage_not_visible
[11:55:12] ================ [PASSED] drm_damage_helper ================
[11:55:12] ============== drm_dp_mst_helper (3 subtests) ==============
[11:55:12] ============== drm_test_dp_mst_calc_pbn_mode ==============
[11:55:12] [PASSED] Clock 154000 BPP 30 DSC disabled
[11:55:12] [PASSED] Clock 234000 BPP 30 DSC disabled
[11:55:12] [PASSED] Clock 297000 BPP 24 DSC disabled
[11:55:12] [PASSED] Clock 332880 BPP 24 DSC enabled
[11:55:12] [PASSED] Clock 324540 BPP 24 DSC enabled
[11:55:12] ========== [PASSED] drm_test_dp_mst_calc_pbn_mode ==========
[11:55:12] ============== drm_test_dp_mst_calc_pbn_div ===============
[11:55:12] [PASSED] Link rate 2000000 lane count 4
[11:55:12] [PASSED] Link rate 2000000 lane count 2
[11:55:12] [PASSED] Link rate 2000000 lane count 1
[11:55:12] [PASSED] Link rate 1350000 lane count 4
[11:55:12] [PASSED] Link rate 1350000 lane count 2
[11:55:12] [PASSED] Link rate 1350000 lane count 1
[11:55:12] [PASSED] Link rate 1000000 lane count 4
[11:55:12] [PASSED] Link rate 1000000 lane count 2
[11:55:12] [PASSED] Link rate 1000000 lane count 1
[11:55:12] [PASSED] Link rate 810000 lane count 4
[11:55:12] [PASSED] Link rate 810000 lane count 2
[11:55:12] [PASSED] Link rate 810000 lane count 1
[11:55:12] [PASSED] Link rate 540000 lane count 4
[11:55:12] [PASSED] Link rate 540000 lane count 2
[11:55:12] [PASSED] Link rate 540000 lane count 1
[11:55:12] [PASSED] Link rate 270000 lane count 4
[11:55:12] [PASSED] Link rate 270000 lane count 2
[11:55:12] [PASSED] Link rate 270000 lane count 1
[11:55:12] [PASSED] Link rate 162000 lane count 4
[11:55:12] [PASSED] Link rate 162000 lane count 2
[11:55:12] [PASSED] Link rate 162000 lane count 1
[11:55:12] ========== [PASSED] drm_test_dp_mst_calc_pbn_div ===========
[11:55:12] ========= drm_test_dp_mst_sideband_msg_req_decode =========
[11:55:12] [PASSED] DP_ENUM_PATH_RESOURCES with port number
[11:55:12] [PASSED] DP_POWER_UP_PHY with port number
[11:55:12] [PASSED] DP_POWER_DOWN_PHY with port number
[11:55:12] [PASSED] DP_ALLOCATE_PAYLOAD with SDP stream sinks
[11:55:12] [PASSED] DP_ALLOCATE_PAYLOAD with port number
[11:55:12] [PASSED] DP_ALLOCATE_PAYLOAD with VCPI
[11:55:12] [PASSED] DP_ALLOCATE_PAYLOAD with PBN
[11:55:12] [PASSED] DP_QUERY_PAYLOAD with port number
[11:55:12] [PASSED] DP_QUERY_PAYLOAD with VCPI
[11:55:12] [PASSED] DP_REMOTE_DPCD_READ with port number
[11:55:12] [PASSED] DP_REMOTE_DPCD_READ with DPCD address
[11:55:12] [PASSED] DP_REMOTE_DPCD_READ with max number of bytes
[11:55:12] [PASSED] DP_REMOTE_DPCD_WRITE with port number
[11:55:12] [PASSED] DP_REMOTE_DPCD_WRITE with DPCD address
[11:55:12] [PASSED] DP_REMOTE_DPCD_WRITE with data array
[11:55:12] [PASSED] DP_REMOTE_I2C_READ with port number
[11:55:12] [PASSED] DP_REMOTE_I2C_READ with I2C device ID
[11:55:12] [PASSED] DP_REMOTE_I2C_READ with transactions array
[11:55:12] [PASSED] DP_REMOTE_I2C_WRITE with port number
[11:55:12] [PASSED] DP_REMOTE_I2C_WRITE with I2C device ID
[11:55:12] [PASSED] DP_REMOTE_I2C_WRITE with data array
[11:55:12] [PASSED] DP_QUERY_STREAM_ENC_STATUS with stream ID
[11:55:12] [PASSED] DP_QUERY_STREAM_ENC_STATUS with client ID
[11:55:12] [PASSED] DP_QUERY_STREAM_ENC_STATUS with stream event
[11:55:12] [PASSED] DP_QUERY_STREAM_ENC_STATUS with valid stream event
[11:55:12] [PASSED] DP_QUERY_STREAM_ENC_STATUS with stream behavior
[11:55:12] [PASSED] DP_QUERY_STREAM_ENC_STATUS with a valid stream behavior
[11:55:12] ===== [PASSED] drm_test_dp_mst_sideband_msg_req_decode =====
[11:55:12] ================ [PASSED] drm_dp_mst_helper ================
[11:55:12] ================== drm_exec (7 subtests) ===================
[11:55:12] [PASSED] sanitycheck
[11:55:12] [PASSED] test_lock
[11:55:12] [PASSED] test_lock_unlock
[11:55:12] [PASSED] test_duplicates
[11:55:12] [PASSED] test_prepare
[11:55:12] [PASSED] test_prepare_array
[11:55:12] [PASSED] test_multiple_loops
[11:55:12] ==================== [PASSED] drm_exec =====================
[11:55:12] =========== drm_format_helper_test (17 subtests) ===========
[11:55:12] ============== drm_test_fb_xrgb8888_to_gray8 ==============
[11:55:12] [PASSED] single_pixel_source_buffer
[11:55:12] [PASSED] single_pixel_clip_rectangle
[11:55:12] [PASSED] well_known_colors
[11:55:12] [PASSED] destination_pitch
[11:55:12] ========== [PASSED] drm_test_fb_xrgb8888_to_gray8 ==========
[11:55:12] ============= drm_test_fb_xrgb8888_to_rgb332 ==============
[11:55:12] [PASSED] single_pixel_source_buffer
[11:55:12] [PASSED] single_pixel_clip_rectangle
[11:55:12] [PASSED] well_known_colors
[11:55:12] [PASSED] destination_pitch
[11:55:12] ========= [PASSED] drm_test_fb_xrgb8888_to_rgb332 ==========
[11:55:12] ============= drm_test_fb_xrgb8888_to_rgb565 ==============
[11:55:12] [PASSED] single_pixel_source_buffer
[11:55:12] [PASSED] single_pixel_clip_rectangle
[11:55:12] [PASSED] well_known_colors
[11:55:12] [PASSED] destination_pitch
[11:55:12] ========= [PASSED] drm_test_fb_xrgb8888_to_rgb565 ==========
[11:55:12] ============ drm_test_fb_xrgb8888_to_xrgb1555 =============
[11:55:12] [PASSED] single_pixel_source_buffer
[11:55:12] [PASSED] single_pixel_clip_rectangle
[11:55:12] [PASSED] well_known_colors
[11:55:12] [PASSED] destination_pitch
[11:55:12] ======== [PASSED] drm_test_fb_xrgb8888_to_xrgb1555 =========
[11:55:12] ============ drm_test_fb_xrgb8888_to_argb1555 =============
[11:55:12] [PASSED] single_pixel_source_buffer
[11:55:12] [PASSED] single_pixel_clip_rectangle
[11:55:12] [PASSED] well_known_colors
[11:55:12] [PASSED] destination_pitch
[11:55:12] ======== [PASSED] drm_test_fb_xrgb8888_to_argb1555 =========
[11:55:12] ============ drm_test_fb_xrgb8888_to_rgba5551 =============
[11:55:12] [PASSED] single_pixel_source_buffer
[11:55:12] [PASSED] single_pixel_clip_rectangle
[11:55:12] [PASSED] well_known_colors
[11:55:12] [PASSED] destination_pitch
[11:55:12] ======== [PASSED] drm_test_fb_xrgb8888_to_rgba5551 =========
[11:55:12] ============= drm_test_fb_xrgb8888_to_rgb888 ==============
[11:55:12] [PASSED] single_pixel_source_buffer
[11:55:12] [PASSED] single_pixel_clip_rectangle
[11:55:12] [PASSED] well_known_colors
[11:55:12] [PASSED] destination_pitch
[11:55:12] ========= [PASSED] drm_test_fb_xrgb8888_to_rgb888 ==========
[11:55:12] ============= drm_test_fb_xrgb8888_to_bgr888 ==============
[11:55:12] [PASSED] single_pixel_source_buffer
[11:55:12] [PASSED] single_pixel_clip_rectangle
[11:55:12] [PASSED] well_known_colors
[11:55:12] [PASSED] destination_pitch
[11:55:12] ========= [PASSED] drm_test_fb_xrgb8888_to_bgr888 ==========
[11:55:12] ============ drm_test_fb_xrgb8888_to_argb8888 =============
[11:55:12] [PASSED] single_pixel_source_buffer
[11:55:12] [PASSED] single_pixel_clip_rectangle
[11:55:12] [PASSED] well_known_colors
[11:55:12] [PASSED] destination_pitch
[11:55:12] ======== [PASSED] drm_test_fb_xrgb8888_to_argb8888 =========
[11:55:12] =========== drm_test_fb_xrgb8888_to_xrgb2101010 ===========
[11:55:12] [PASSED] single_pixel_source_buffer
[11:55:12] [PASSED] single_pixel_clip_rectangle
[11:55:12] [PASSED] well_known_colors
[11:55:12] [PASSED] destination_pitch
[11:55:12] ======= [PASSED] drm_test_fb_xrgb8888_to_xrgb2101010 =======
[11:55:12] =========== drm_test_fb_xrgb8888_to_argb2101010 ===========
[11:55:12] [PASSED] single_pixel_source_buffer
[11:55:12] [PASSED] single_pixel_clip_rectangle
[11:55:12] [PASSED] well_known_colors
[11:55:12] [PASSED] destination_pitch
[11:55:12] ======= [PASSED] drm_test_fb_xrgb8888_to_argb2101010 =======
[11:55:12] ============== drm_test_fb_xrgb8888_to_mono ===============
[11:55:12] [PASSED] single_pixel_source_buffer
[11:55:12] [PASSED] single_pixel_clip_rectangle
[11:55:12] [PASSED] well_known_colors
[11:55:12] [PASSED] destination_pitch
[11:55:12] ========== [PASSED] drm_test_fb_xrgb8888_to_mono ===========
[11:55:12] ==================== drm_test_fb_swab =====================
[11:55:12] [PASSED] single_pixel_source_buffer
[11:55:12] [PASSED] single_pixel_clip_rectangle
[11:55:12] [PASSED] well_known_colors
[11:55:12] [PASSED] destination_pitch
[11:55:12] ================ [PASSED] drm_test_fb_swab =================
[11:55:12] ============ drm_test_fb_xrgb8888_to_xbgr8888 =============
[11:55:12] [PASSED] single_pixel_source_buffer
[11:55:12] [PASSED] single_pixel_clip_rectangle
[11:55:12] [PASSED] well_known_colors
[11:55:12] [PASSED] destination_pitch
[11:55:12] ======== [PASSED] drm_test_fb_xrgb8888_to_xbgr8888 =========
[11:55:12] ============ drm_test_fb_xrgb8888_to_abgr8888 =============
[11:55:12] [PASSED] single_pixel_source_buffer
[11:55:12] [PASSED] single_pixel_clip_rectangle
[11:55:12] [PASSED] well_known_colors
[11:55:12] [PASSED] destination_pitch
[11:55:12] ======== [PASSED] drm_test_fb_xrgb8888_to_abgr8888 =========
[11:55:12] ================= drm_test_fb_clip_offset =================
[11:55:12] [PASSED] pass through
[11:55:12] [PASSED] horizontal offset
[11:55:12] [PASSED] vertical offset
[11:55:12] [PASSED] horizontal and vertical offset
[11:55:12] [PASSED] horizontal offset (custom pitch)
[11:55:12] [PASSED] vertical offset (custom pitch)
[11:55:12] [PASSED] horizontal and vertical offset (custom pitch)
[11:55:12] ============= [PASSED] drm_test_fb_clip_offset =============
[11:55:12] =================== drm_test_fb_memcpy ====================
[11:55:12] [PASSED] single_pixel_source_buffer: XR24 little-endian (0x34325258)
[11:55:12] [PASSED] single_pixel_source_buffer: XRA8 little-endian (0x38415258)
[11:55:12] [PASSED] single_pixel_source_buffer: YU24 little-endian (0x34325559)
[11:55:12] [PASSED] single_pixel_clip_rectangle: XB24 little-endian (0x34324258)
[11:55:12] [PASSED] single_pixel_clip_rectangle: XRA8 little-endian (0x38415258)
[11:55:12] [PASSED] single_pixel_clip_rectangle: YU24 little-endian (0x34325559)
[11:55:12] [PASSED] well_known_colors: XB24 little-endian (0x34324258)
[11:55:12] [PASSED] well_known_colors: XRA8 little-endian (0x38415258)
[11:55:12] [PASSED] well_known_colors: YU24 little-endian (0x34325559)
[11:55:12] [PASSED] destination_pitch: XB24 little-endian (0x34324258)
[11:55:12] [PASSED] destination_pitch: XRA8 little-endian (0x38415258)
[11:55:12] [PASSED] destination_pitch: YU24 little-endian (0x34325559)
[11:55:12] =============== [PASSED] drm_test_fb_memcpy ================
[11:55:12] ============= [PASSED] drm_format_helper_test ==============
[11:55:12] ================= drm_format (18 subtests) =================
[11:55:12] [PASSED] drm_test_format_block_width_invalid
[11:55:12] [PASSED] drm_test_format_block_width_one_plane
[11:55:12] [PASSED] drm_test_format_block_width_two_plane
[11:55:12] [PASSED] drm_test_format_block_width_three_plane
[11:55:12] [PASSED] drm_test_format_block_width_tiled
[11:55:12] [PASSED] drm_test_format_block_height_invalid
[11:55:12] [PASSED] drm_test_format_block_height_one_plane
[11:55:12] [PASSED] drm_test_format_block_height_two_plane
[11:55:12] [PASSED] drm_test_format_block_height_three_plane
[11:55:12] [PASSED] drm_test_format_block_height_tiled
[11:55:12] [PASSED] drm_test_format_min_pitch_invalid
[11:55:12] [PASSED] drm_test_format_min_pitch_one_plane_8bpp
[11:55:12] [PASSED] drm_test_format_min_pitch_one_plane_16bpp
[11:55:12] [PASSED] drm_test_format_min_pitch_one_plane_24bpp
[11:55:12] [PASSED] drm_test_format_min_pitch_one_plane_32bpp
[11:55:12] [PASSED] drm_test_format_min_pitch_two_plane
[11:55:12] [PASSED] drm_test_format_min_pitch_three_plane_8bpp
[11:55:12] [PASSED] drm_test_format_min_pitch_tiled
[11:55:12] =================== [PASSED] drm_format ====================
[11:55:12] ============== drm_framebuffer (10 subtests) ===============
[11:55:12] ========== drm_test_framebuffer_check_src_coords ==========
[11:55:12] [PASSED] Success: source fits into fb
[11:55:12] [PASSED] Fail: overflowing fb with x-axis coordinate
[11:55:12] [PASSED] Fail: overflowing fb with y-axis coordinate
[11:55:12] [PASSED] Fail: overflowing fb with source width
[11:55:12] [PASSED] Fail: overflowing fb with source height
[11:55:12] ====== [PASSED] drm_test_framebuffer_check_src_coords ======
[11:55:12] [PASSED] drm_test_framebuffer_cleanup
[11:55:12] =============== drm_test_framebuffer_create ===============
[11:55:12] [PASSED] ABGR8888 normal sizes
[11:55:12] [PASSED] ABGR8888 max sizes
[11:55:12] [PASSED] ABGR8888 pitch greater than min required
[11:55:12] [PASSED] ABGR8888 pitch less than min required
[11:55:12] [PASSED] ABGR8888 Invalid width
[11:55:12] [PASSED] ABGR8888 Invalid buffer handle
[11:55:12] [PASSED] No pixel format
[11:55:12] [PASSED] ABGR8888 Width 0
[11:55:12] [PASSED] ABGR8888 Height 0
[11:55:12] [PASSED] ABGR8888 Out of bound height * pitch combination
[11:55:12] [PASSED] ABGR8888 Large buffer offset
[11:55:12] [PASSED] ABGR8888 Buffer offset for inexistent plane
[11:55:12] [PASSED] ABGR8888 Invalid flag
[11:55:12] [PASSED] ABGR8888 Set DRM_MODE_FB_MODIFIERS without modifiers
[11:55:12] [PASSED] ABGR8888 Valid buffer modifier
[11:55:12] [PASSED] ABGR8888 Invalid buffer modifier(DRM_FORMAT_MOD_SAMSUNG_64_32_TILE)
[11:55:12] [PASSED] ABGR8888 Extra pitches without DRM_MODE_FB_MODIFIERS
[11:55:12] [PASSED] ABGR8888 Extra pitches with DRM_MODE_FB_MODIFIERS
[11:55:12] [PASSED] NV12 Normal sizes
[11:55:12] [PASSED] NV12 Max sizes
[11:55:12] [PASSED] NV12 Invalid pitch
[11:55:12] [PASSED] NV12 Invalid modifier/missing DRM_MODE_FB_MODIFIERS flag
[11:55:12] [PASSED] NV12 different modifier per-plane
[11:55:12] [PASSED] NV12 with DRM_FORMAT_MOD_SAMSUNG_64_32_TILE
[11:55:12] [PASSED] NV12 Valid modifiers without DRM_MODE_FB_MODIFIERS
[11:55:12] [PASSED] NV12 Modifier for inexistent plane
[11:55:12] [PASSED] NV12 Handle for inexistent plane
[11:55:12] [PASSED] NV12 Handle for inexistent plane without DRM_MODE_FB_MODIFIERS
[11:55:12] [PASSED] YVU420 DRM_MODE_FB_MODIFIERS set without modifier
[11:55:12] [PASSED] YVU420 Normal sizes
[11:55:12] [PASSED] YVU420 Max sizes
[11:55:12] [PASSED] YVU420 Invalid pitch
[11:55:12] [PASSED] YVU420 Different pitches
[11:55:12] [PASSED] YVU420 Different buffer offsets/pitches
[11:55:12] [PASSED] YVU420 Modifier set just for plane 0, without DRM_MODE_FB_MODIFIERS
[11:55:12] [PASSED] YVU420 Modifier set just for planes 0, 1, without DRM_MODE_FB_MODIFIERS
[11:55:12] [PASSED] YVU420 Modifier set just for plane 0, 1, with DRM_MODE_FB_MODIFIERS
[11:55:12] [PASSED] YVU420 Valid modifier
[11:55:12] [PASSED] YVU420 Different modifiers per plane
[11:55:12] [PASSED] YVU420 Modifier for inexistent plane
[11:55:12] [PASSED] YUV420_10BIT Invalid modifier(DRM_FORMAT_MOD_LINEAR)
[11:55:12] [PASSED] X0L2 Normal sizes
[11:55:12] [PASSED] X0L2 Max sizes
[11:55:12] [PASSED] X0L2 Invalid pitch
[11:55:12] [PASSED] X0L2 Pitch greater than minimum required
[11:55:12] [PASSED] X0L2 Handle for inexistent plane
[11:55:12] [PASSED] X0L2 Offset for inexistent plane, without DRM_MODE_FB_MODIFIERS set
[11:55:12] [PASSED] X0L2 Modifier without DRM_MODE_FB_MODIFIERS set
[11:55:12] [PASSED] X0L2 Valid modifier
[11:55:12] [PASSED] X0L2 Modifier for inexistent plane
[11:55:12] =========== [PASSED] drm_test_framebuffer_create ===========
[11:55:12] [PASSED] drm_test_framebuffer_free
[11:55:12] [PASSED] drm_test_framebuffer_init
[11:55:12] [PASSED] drm_test_framebuffer_init_bad_format
[11:55:12] [PASSED] drm_test_framebuffer_init_dev_mismatch
[11:55:12] [PASSED] drm_test_framebuffer_lookup
[11:55:12] [PASSED] drm_test_framebuffer_lookup_inexistent
[11:55:12] [PASSED] drm_test_framebuffer_modifiers_not_supported
[11:55:12] ================= [PASSED] drm_framebuffer =================
[11:55:12] ================ drm_gem_shmem (8 subtests) ================
[11:55:12] [PASSED] drm_gem_shmem_test_obj_create
[11:55:12] [PASSED] drm_gem_shmem_test_obj_create_private
[11:55:12] [PASSED] drm_gem_shmem_test_pin_pages
[11:55:12] [PASSED] drm_gem_shmem_test_vmap
[11:55:12] [PASSED] drm_gem_shmem_test_get_sg_table
[11:55:12] [PASSED] drm_gem_shmem_test_get_pages_sgt
[11:55:12] [PASSED] drm_gem_shmem_test_madvise
[11:55:12] [PASSED] drm_gem_shmem_test_purge
[11:55:12] ================== [PASSED] drm_gem_shmem ==================
[11:55:12] === drm_atomic_helper_connector_hdmi_check (29 subtests) ===
[11:55:12] [PASSED] drm_test_check_broadcast_rgb_auto_cea_mode
[11:55:12] [PASSED] drm_test_check_broadcast_rgb_auto_cea_mode_vic_1
[11:55:12] [PASSED] drm_test_check_broadcast_rgb_full_cea_mode
[11:55:12] [PASSED] drm_test_check_broadcast_rgb_full_cea_mode_vic_1
[11:55:12] [PASSED] drm_test_check_broadcast_rgb_limited_cea_mode
[11:55:12] [PASSED] drm_test_check_broadcast_rgb_limited_cea_mode_vic_1
[11:55:12] ====== drm_test_check_broadcast_rgb_cea_mode_yuv420 =======
[11:55:12] [PASSED] Automatic
[11:55:12] [PASSED] Full
[11:55:12] [PASSED] Limited 16:235
[11:55:12] == [PASSED] drm_test_check_broadcast_rgb_cea_mode_yuv420 ===
[11:55:12] [PASSED] drm_test_check_broadcast_rgb_crtc_mode_changed
[11:55:12] [PASSED] drm_test_check_broadcast_rgb_crtc_mode_not_changed
[11:55:12] [PASSED] drm_test_check_disable_connector
[11:55:12] [PASSED] drm_test_check_hdmi_funcs_reject_rate
[11:55:12] [PASSED] drm_test_check_max_tmds_rate_bpc_fallback_rgb
[11:55:12] [PASSED] drm_test_check_max_tmds_rate_bpc_fallback_yuv420
[11:55:12] [PASSED] drm_test_check_max_tmds_rate_bpc_fallback_ignore_yuv422
[11:55:12] [PASSED] drm_test_check_max_tmds_rate_bpc_fallback_ignore_yuv420
[11:55:12] [PASSED] drm_test_check_driver_unsupported_fallback_yuv420
[11:55:12] [PASSED] drm_test_check_output_bpc_crtc_mode_changed
[11:55:12] [PASSED] drm_test_check_output_bpc_crtc_mode_not_changed
[11:55:12] [PASSED] drm_test_check_output_bpc_dvi
[11:55:12] [PASSED] drm_test_check_output_bpc_format_vic_1
[11:55:12] [PASSED] drm_test_check_output_bpc_format_display_8bpc_only
[11:55:12] [PASSED] drm_test_check_output_bpc_format_display_rgb_only
[11:55:12] [PASSED] drm_test_check_output_bpc_format_driver_8bpc_only
[11:55:12] [PASSED] drm_test_check_output_bpc_format_driver_rgb_only
[11:55:12] [PASSED] drm_test_check_tmds_char_rate_rgb_8bpc
[11:55:12] [PASSED] drm_test_check_tmds_char_rate_rgb_10bpc
[11:55:12] [PASSED] drm_test_check_tmds_char_rate_rgb_12bpc
[11:55:12] ============ drm_test_check_hdmi_color_format =============
[11:55:12] [PASSED] AUTO -> RGB
[11:55:12] [PASSED] YCBCR422 -> YUV422
[11:55:12] [PASSED] YCBCR420 -> YUV420
[11:55:12] [PASSED] YCBCR444 -> YUV444
[11:55:12] [PASSED] RGB -> RGB
[11:55:12] ======== [PASSED] drm_test_check_hdmi_color_format =========
[11:55:12] ======== drm_test_check_hdmi_color_format_420_only ========
[11:55:12] [PASSED] RGB should fail
[11:55:12] [PASSED] YUV444 should fail
[11:55:12] [PASSED] YUV422 should fail
[11:55:12] [PASSED] YUV420 should work
[11:55:12] ==== [PASSED] drm_test_check_hdmi_color_format_420_only ====
[11:55:12] ===== [PASSED] drm_atomic_helper_connector_hdmi_check ======
[11:55:12] === drm_atomic_helper_connector_hdmi_reset (6 subtests) ====
[11:55:12] [PASSED] drm_test_check_broadcast_rgb_value
[11:55:12] [PASSED] drm_test_check_bpc_8_value
[11:55:12] [PASSED] drm_test_check_bpc_10_value
[11:55:12] [PASSED] drm_test_check_bpc_12_value
[11:55:12] [PASSED] drm_test_check_format_value
[11:55:12] [PASSED] drm_test_check_tmds_char_value
[11:55:12] ===== [PASSED] drm_atomic_helper_connector_hdmi_reset ======
[11:55:12] = drm_atomic_helper_connector_hdmi_mode_valid (7 subtests) =
[11:55:12] [PASSED] drm_test_check_mode_valid
[11:55:12] [PASSED] drm_test_check_mode_valid_reject
[11:55:12] [PASSED] drm_test_check_mode_valid_reject_rate
[11:55:12] [PASSED] drm_test_check_mode_valid_reject_max_clock
[11:55:12] [PASSED] drm_test_check_mode_valid_yuv420_only_max_clock
[11:55:12] [PASSED] drm_test_check_mode_valid_reject_yuv420_only_connector
[11:55:12] [PASSED] drm_test_check_mode_valid_accept_yuv420_also_connector_rgb
[11:55:12] === [PASSED] drm_atomic_helper_connector_hdmi_mode_valid ===
[11:55:12] = drm_atomic_helper_connector_hdmi_infoframes (5 subtests) =
[11:55:12] [PASSED] drm_test_check_infoframes
[11:55:12] [PASSED] drm_test_check_reject_avi_infoframe
[11:55:12] [PASSED] drm_test_check_reject_hdr_infoframe_bpc_8
[11:55:12] [PASSED] drm_test_check_reject_hdr_infoframe_bpc_10
[11:55:12] [PASSED] drm_test_check_reject_audio_infoframe
[11:55:12] === [PASSED] drm_atomic_helper_connector_hdmi_infoframes ===
[11:55:12] ================= drm_managed (2 subtests) =================
[11:55:12] [PASSED] drm_test_managed_release_action
[11:55:12] [PASSED] drm_test_managed_run_action
[11:55:12] =================== [PASSED] drm_managed ===================
[11:55:12] =================== drm_mm (6 subtests) ====================
[11:55:12] [PASSED] drm_test_mm_init
[11:55:12] [PASSED] drm_test_mm_debug
[11:55:12] [PASSED] drm_test_mm_align32
[11:55:12] [PASSED] drm_test_mm_align64
[11:55:12] [PASSED] drm_test_mm_lowest
[11:55:12] [PASSED] drm_test_mm_highest
[11:55:12] ===================== [PASSED] drm_mm ======================
[11:55:12] ============= drm_modes_analog_tv (5 subtests) =============
[11:55:12] [PASSED] drm_test_modes_analog_tv_mono_576i
[11:55:12] [PASSED] drm_test_modes_analog_tv_ntsc_480i
[11:55:12] [PASSED] drm_test_modes_analog_tv_ntsc_480i_inlined
[11:55:12] [PASSED] drm_test_modes_analog_tv_pal_576i
[11:55:12] [PASSED] drm_test_modes_analog_tv_pal_576i_inlined
[11:55:12] =============== [PASSED] drm_modes_analog_tv ===============
[11:55:12] ============== drm_plane_helper (2 subtests) ===============
[11:55:12] =============== drm_test_check_plane_state ================
[11:55:12] [PASSED] clipping_simple
[11:55:12] [PASSED] clipping_rotate_reflect
[11:55:12] [PASSED] positioning_simple
[11:55:12] [PASSED] upscaling
[11:55:12] [PASSED] downscaling
[11:55:12] [PASSED] rounding1
[11:55:12] [PASSED] rounding2
[11:55:12] [PASSED] rounding3
[11:55:12] [PASSED] rounding4
[11:55:12] =========== [PASSED] drm_test_check_plane_state ============
[11:55:12] =========== drm_test_check_invalid_plane_state ============
[11:55:12] [PASSED] positioning_invalid
[11:55:12] [PASSED] upscaling_invalid
[11:55:12] [PASSED] downscaling_invalid
[11:55:12] ======= [PASSED] drm_test_check_invalid_plane_state ========
[11:55:12] ================ [PASSED] drm_plane_helper =================
[11:55:12] ====== drm_connector_helper_tv_get_modes (1 subtest) =======
[11:55:12] ====== drm_test_connector_helper_tv_get_modes_check =======
[11:55:12] [PASSED] None
[11:55:12] [PASSED] PAL
[11:55:12] [PASSED] NTSC
[11:55:12] [PASSED] Both, NTSC Default
[11:55:12] [PASSED] Both, PAL Default
[11:55:12] [PASSED] Both, NTSC Default, with PAL on command-line
[11:55:12] [PASSED] Both, PAL Default, with NTSC on command-line
[11:55:12] == [PASSED] drm_test_connector_helper_tv_get_modes_check ===
[11:55:12] ======== [PASSED] drm_connector_helper_tv_get_modes ========
[11:55:12] ================== drm_rect (9 subtests) ===================
[11:55:12] [PASSED] drm_test_rect_clip_scaled_div_by_zero
[11:55:12] [PASSED] drm_test_rect_clip_scaled_not_clipped
[11:55:12] [PASSED] drm_test_rect_clip_scaled_clipped
[11:55:12] [PASSED] drm_test_rect_clip_scaled_signed_vs_unsigned
[11:55:12] ================= drm_test_rect_intersect =================
[11:55:12] [PASSED] top-left x bottom-right: 2x2+1+1 x 2x2+0+0
[11:55:12] [PASSED] top-right x bottom-left: 2x2+0+0 x 2x2+1-1
[11:55:12] [PASSED] bottom-left x top-right: 2x2+1-1 x 2x2+0+0
[11:55:12] [PASSED] bottom-right x top-left: 2x2+0+0 x 2x2+1+1
[11:55:12] [PASSED] right x left: 2x1+0+0 x 3x1+1+0
[11:55:12] [PASSED] left x right: 3x1+1+0 x 2x1+0+0
[11:55:12] [PASSED] up x bottom: 1x2+0+0 x 1x3+0-1
[11:55:12] [PASSED] bottom x up: 1x3+0-1 x 1x2+0+0
[11:55:12] [PASSED] touching corner: 1x1+0+0 x 2x2+1+1
[11:55:12] [PASSED] touching side: 1x1+0+0 x 1x1+1+0
[11:55:12] [PASSED] equal rects: 2x2+0+0 x 2x2+0+0
[11:55:12] [PASSED] inside another: 2x2+0+0 x 1x1+1+1
[11:55:12] [PASSED] far away: 1x1+0+0 x 1x1+3+6
[11:55:12] [PASSED] points intersecting: 0x0+5+10 x 0x0+5+10
[11:55:12] [PASSED] points not intersecting: 0x0+0+0 x 0x0+5+10
[11:55:12] ============= [PASSED] drm_test_rect_intersect =============
[11:55:12] ================ drm_test_rect_calc_hscale ================
[11:55:12] [PASSED] normal use
[11:55:12] [PASSED] out of max range
[11:55:12] [PASSED] out of min range
[11:55:12] [PASSED] zero dst
[11:55:12] [PASSED] negative src
[11:55:12] [PASSED] negative dst
[11:55:12] ============ [PASSED] drm_test_rect_calc_hscale ============
[11:55:12] ================ drm_test_rect_calc_vscale ================
[11:55:12] [PASSED] normal use
[11:55:12] [PASSED] out of max range
[11:55:12] [PASSED] out of min range
[11:55:12] [PASSED] zero dst
[11:55:12] [PASSED] negative src
[11:55:12] [PASSED] negative dst
[11:55:12] ============ [PASSED] drm_test_rect_calc_vscale ============
[11:55:12] ================== drm_test_rect_rotate ===================
[11:55:12] [PASSED] reflect-x
[11:55:12] [PASSED] reflect-y
[11:55:12] [PASSED] rotate-0
[11:55:12] [PASSED] rotate-90
[11:55:12] [PASSED] rotate-180
[11:55:12] [PASSED] rotate-270
[11:55:12] ============== [PASSED] drm_test_rect_rotate ===============
[11:55:12] ================ drm_test_rect_rotate_inv =================
[11:55:12] [PASSED] reflect-x
[11:55:12] [PASSED] reflect-y
[11:55:12] [PASSED] rotate-0
[11:55:12] [PASSED] rotate-90
[11:55:12] [PASSED] rotate-180
[11:55:12] [PASSED] rotate-270
[11:55:12] ============ [PASSED] drm_test_rect_rotate_inv =============
[11:55:12] ==================== [PASSED] drm_rect =====================
[11:55:12] ============ drm_sysfb_modeset_test (1 subtest) ============
[11:55:12] ============ drm_test_sysfb_build_fourcc_list =============
[11:55:12] [PASSED] no native formats
[11:55:12] [PASSED] XRGB8888 as native format
[11:55:12] [PASSED] remove duplicates
[11:55:12] [PASSED] convert alpha formats
[11:55:12] [PASSED] random formats
[11:55:12] ======== [PASSED] drm_test_sysfb_build_fourcc_list =========
[11:55:12] ============= [PASSED] drm_sysfb_modeset_test ==============
[11:55:12] ================== drm_fixp (2 subtests) ===================
[11:55:12] [PASSED] drm_test_int2fixp
[11:55:12] [PASSED] drm_test_sm2fixp
[11:55:12] ==================== [PASSED] drm_fixp =====================
[11:55:12] ============================================================
[11:55:12] Testing complete. Ran 641 tests: passed: 641
[11:55:12] Elapsed time: 26.880s total, 1.791s configuring, 24.920s building, 0.147s running
+ for kcfg in "${kunitconfigs[@]}"
+ [[ ! -f /kernel/drivers/gpu/drm/ttm/tests/.kunitconfig ]]
+ /kernel/tools/testing/kunit/kunit.py run --kunitconfig /kernel/drivers/gpu/drm/ttm/tests/.kunitconfig
[11:55:12] Configuring KUnit Kernel ...
Regenerating .config ...
Populating config with:
$ make ARCH=um O=.kunit olddefconfig
[11:55:14] 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
[11:55:24] Starting KUnit Kernel (1/1)...
[11:55:24] ============================================================
Running tests with:
$ .kunit/linux kunit.enable=1 mem=1G console=tty kunit_shutdown=halt
[11:55:24] ============= refcount_interrupt (4 subtests) ==============
[11:55:24] [PASSED] test_single_irq_change
[11:55:24] [PASSED] test_nested_irq_change
[11:55:24] [PASSED] test_multiple_irq_change
[11:55:24] [PASSED] test_irq_save
[11:55:24] =============== [PASSED] refcount_interrupt ================
[11:55:24] ================= ttm_device (5 subtests) ==================
[11:55:24] [PASSED] ttm_device_init_basic
[11:55:24] [PASSED] ttm_device_init_multiple
[11:55:24] [PASSED] ttm_device_fini_basic
[11:55:24] [PASSED] ttm_device_init_no_vma_man
[11:55:24] ================== ttm_device_init_pools ==================
[11:55:24] [PASSED] No DMA allocations, no DMA32 required
[11:55:24] [PASSED] DMA allocations, DMA32 required
[11:55:24] [PASSED] No DMA allocations, DMA32 required
[11:55:24] [PASSED] DMA allocations, no DMA32 required
[11:55:24] ============== [PASSED] ttm_device_init_pools ==============
[11:55:24] =================== [PASSED] ttm_device ====================
[11:55:24] ================== ttm_pool (8 subtests) ===================
[11:55:24] ================== ttm_pool_alloc_basic ===================
[11:55:24] [PASSED] One page
[11:55:24] [PASSED] More than one page
[11:55:24] [PASSED] Above the allocation limit
[11:55:24] [PASSED] One page, with coherent DMA mappings enabled
[11:55:24] [PASSED] Above the allocation limit, with coherent DMA mappings enabled
[11:55:24] ============== [PASSED] ttm_pool_alloc_basic ===============
[11:55:24] ============== ttm_pool_alloc_basic_dma_addr ==============
[11:55:24] [PASSED] One page
[11:55:24] [PASSED] More than one page
[11:55:24] [PASSED] Above the allocation limit
[11:55:24] [PASSED] One page, with coherent DMA mappings enabled
[11:55:24] [PASSED] Above the allocation limit, with coherent DMA mappings enabled
[11:55:24] ========== [PASSED] ttm_pool_alloc_basic_dma_addr ==========
[11:55:24] [PASSED] ttm_pool_alloc_order_caching_match
[11:55:24] [PASSED] ttm_pool_alloc_caching_mismatch
[11:55:24] [PASSED] ttm_pool_alloc_order_mismatch
[11:55:24] [PASSED] ttm_pool_free_dma_alloc
[11:55:24] [PASSED] ttm_pool_free_no_dma_alloc
[11:55:24] [PASSED] ttm_pool_fini_basic
[11:55:24] ==================== [PASSED] ttm_pool =====================
[11:55:24] ================ ttm_resource (8 subtests) =================
[11:55:24] ================= ttm_resource_init_basic =================
[11:55:24] [PASSED] Init resource in TTM_PL_SYSTEM
[11:55:24] [PASSED] Init resource in TTM_PL_VRAM
[11:55:24] [PASSED] Init resource in a private placement
[11:55:24] [PASSED] Init resource in TTM_PL_SYSTEM, set placement flags
[11:55:24] ============= [PASSED] ttm_resource_init_basic =============
[11:55:24] [PASSED] ttm_resource_init_pinned
[11:55:24] [PASSED] ttm_resource_fini_basic
[11:55:24] [PASSED] ttm_resource_manager_init_basic
[11:55:24] [PASSED] ttm_resource_manager_usage_basic
[11:55:24] [PASSED] ttm_resource_manager_set_used_basic
[11:55:24] [PASSED] ttm_sys_man_alloc_basic
[11:55:24] [PASSED] ttm_sys_man_free_basic
[11:55:24] ================== [PASSED] ttm_resource ===================
[11:55:24] =================== ttm_tt (15 subtests) ===================
[11:55:24] ==================== ttm_tt_init_basic ====================
[11:55:24] [PASSED] Page-aligned size
[11:55:24] [PASSED] Extra pages requested
[11:55:24] ================ [PASSED] ttm_tt_init_basic ================
[11:55:24] [PASSED] ttm_tt_init_misaligned
[11:55:24] [PASSED] ttm_tt_fini_basic
[11:55:24] [PASSED] ttm_tt_fini_sg
[11:55:24] [PASSED] ttm_tt_fini_shmem
[11:55:24] [PASSED] ttm_tt_create_basic
[11:55:24] [PASSED] ttm_tt_create_invalid_bo_type
[11:55:24] [PASSED] ttm_tt_create_ttm_exists
[11:55:24] [PASSED] ttm_tt_create_failed
[11:55:24] [PASSED] ttm_tt_destroy_basic
[11:55:24] [PASSED] ttm_tt_populate_null_ttm
[11:55:24] [PASSED] ttm_tt_populate_populated_ttm
[11:55:24] [PASSED] ttm_tt_unpopulate_basic
[11:55:24] [PASSED] ttm_tt_unpopulate_empty_ttm
[11:55:24] [PASSED] ttm_tt_swapin_basic
[11:55:24] ===================== [PASSED] ttm_tt ======================
[11:55:24] =================== ttm_bo (14 subtests) ===================
[11:55:24] =========== ttm_bo_reserve_optimistic_no_ticket ===========
[11:55:24] [PASSED] Cannot be interrupted and sleeps
[11:55:24] [PASSED] Cannot be interrupted, locks straight away
[11:55:24] [PASSED] Can be interrupted, sleeps
[11:55:24] ======= [PASSED] ttm_bo_reserve_optimistic_no_ticket =======
[11:55:24] [PASSED] ttm_bo_reserve_locked_no_sleep
[11:55:24] [PASSED] ttm_bo_reserve_no_wait_ticket
[11:55:24] [PASSED] ttm_bo_reserve_double_resv
[11:55:24] [PASSED] ttm_bo_reserve_interrupted
[11:55:24] [PASSED] ttm_bo_reserve_deadlock
[11:55:24] [PASSED] ttm_bo_unreserve_basic
[11:55:24] [PASSED] ttm_bo_unreserve_pinned
[11:55:24] [PASSED] ttm_bo_unreserve_bulk
[11:55:24] [PASSED] ttm_bo_fini_basic
[11:55:24] [PASSED] ttm_bo_fini_shared_resv
[11:55:24] [PASSED] ttm_bo_pin_basic
[11:55:24] [PASSED] ttm_bo_pin_unpin_resource
[11:55:24] [PASSED] ttm_bo_multiple_pin_one_unpin
[11:55:24] ===================== [PASSED] ttm_bo ======================
[11:55:24] ============== ttm_bo_validate (22 subtests) ===============
[11:55:24] ============== ttm_bo_init_reserved_sys_man ===============
[11:55:24] [PASSED] Buffer object for userspace
[11:55:24] [PASSED] Kernel buffer object
[11:55:24] [PASSED] Shared buffer object
[11:55:24] ========== [PASSED] ttm_bo_init_reserved_sys_man ===========
[11:55:24] ============== ttm_bo_init_reserved_mock_man ==============
[11:55:24] [PASSED] Buffer object for userspace
[11:55:24] [PASSED] Kernel buffer object
[11:55:24] [PASSED] Shared buffer object
[11:55:24] ========== [PASSED] ttm_bo_init_reserved_mock_man ==========
[11:55:24] [PASSED] ttm_bo_init_reserved_resv
[11:55:24] ================== ttm_bo_validate_basic ==================
[11:55:24] [PASSED] Buffer object for userspace
[11:55:24] [PASSED] Kernel buffer object
[11:55:24] [PASSED] Shared buffer object
[11:55:24] ============== [PASSED] ttm_bo_validate_basic ==============
[11:55:24] [PASSED] ttm_bo_validate_invalid_placement
[11:55:24] ============= ttm_bo_validate_same_placement ==============
[11:55:24] [PASSED] System manager
[11:55:24] [PASSED] VRAM manager
[11:55:24] ========= [PASSED] ttm_bo_validate_same_placement ==========
[11:55:24] [PASSED] ttm_bo_validate_failed_alloc
[11:55:24] [PASSED] ttm_bo_validate_pinned
[11:55:24] [PASSED] ttm_bo_validate_busy_placement
[11:55:24] ================ ttm_bo_validate_multihop =================
[11:55:24] [PASSED] Buffer object for userspace
[11:55:24] [PASSED] Kernel buffer object
[11:55:24] [PASSED] Shared buffer object
[11:55:24] ============ [PASSED] ttm_bo_validate_multihop =============
[11:55:24] ========== ttm_bo_validate_no_placement_signaled ==========
[11:55:24] [PASSED] Buffer object in system domain, no page vector
[11:55:24] [PASSED] Buffer object in system domain with an existing page vector
[11:55:24] ====== [PASSED] ttm_bo_validate_no_placement_signaled ======
[11:55:24] ======== ttm_bo_validate_no_placement_not_signaled ========
[11:55:24] [PASSED] Buffer object for userspace
[11:55:24] [PASSED] Kernel buffer object
[11:55:24] [PASSED] Shared buffer object
[11:55:24] ==== [PASSED] ttm_bo_validate_no_placement_not_signaled ====
[11:55:24] [PASSED] ttm_bo_validate_move_fence_signaled
[11:55:24] ========= ttm_bo_validate_move_fence_not_signaled =========
[11:55:24] [PASSED] Waits for GPU
[11:55:24] [PASSED] Tries to lock straight away
[11:55:24] ===== [PASSED] ttm_bo_validate_move_fence_not_signaled =====
[11:55:24] [PASSED] ttm_bo_validate_swapout
[11:55:24] [PASSED] ttm_bo_validate_happy_evict
[11:55:24] [PASSED] ttm_bo_validate_all_pinned_evict
[11:55:24] [PASSED] ttm_bo_validate_allowed_only_evict
[11:55:24] [PASSED] ttm_bo_validate_deleted_evict
[11:55:24] [PASSED] ttm_bo_validate_busy_domain_evict
[11:55:24] [PASSED] ttm_bo_validate_evict_gutting
[11:55:24] [PASSED] ttm_bo_validate_recrusive_evict
[11:55:24] ================= [PASSED] ttm_bo_validate =================
[11:55:24] ============================================================
[11:55:24] Testing complete. Ran 106 tests: passed: 106
[11:55:24] Elapsed time: 11.958s total, 1.800s configuring, 9.893s building, 0.214s running
+ for kcfg in "${kunitconfigs[@]}"
+ [[ ! -f /kernel/drivers/dma-buf/.kunitconfig ]]
+ /kernel/tools/testing/kunit/kunit.py run --kunitconfig /kernel/drivers/dma-buf/.kunitconfig
[11:55:24] Configuring KUnit Kernel ...
Regenerating .config ...
Populating config with:
$ make ARCH=um O=.kunit olddefconfig
[11:55:26] 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
[11:55:34] Starting KUnit Kernel (1/1)...
[11:55:34] ============================================================
Running tests with:
$ .kunit/linux kunit.enable=1 mem=1G console=tty kunit_shutdown=halt
[11:55:35] ============= refcount_interrupt (4 subtests) ==============
[11:55:35] [PASSED] test_single_irq_change
[11:55:35] [PASSED] test_nested_irq_change
[11:55:35] [PASSED] test_multiple_irq_change
[11:55:35] [PASSED] test_irq_save
[11:55:35] =============== [PASSED] refcount_interrupt ================
[11:55:35] =============== dma-buf-fence (12 subtests) ================
[11:55:35] [PASSED] test_sanitycheck
[11:55:35] [PASSED] test_signaling
[11:55:35] [PASSED] test_add_callback
[11:55:35] [PASSED] test_late_add_callback
[11:55:35] [PASSED] test_rm_callback
[11:55:35] [PASSED] test_late_rm_callback
[11:55:35] [PASSED] test_status
[11:55:35] [PASSED] test_error
[11:55:35] [PASSED] test_wait
[11:55:35] [PASSED] test_wait_timeout
[11:55:35] [PASSED] test_stub
[11:55:35] [SKIPPED] test_race_signal_callback (requires at least 2 CPUs)
[11:55:35] ================== [PASSED] dma-buf-fence ==================
[11:55:35] ============ dma-buf-fence-chain (11 subtests) =============
[11:55:35] [PASSED] test_sanitycheck
[11:55:35] [PASSED] test_find_seqno
[11:55:35] [PASSED] test_find_signaled
[11:55:35] [PASSED] test_find_out_of_order
[11:55:40] [PASSED] test_find_gap
[11:55:40] [PASSED] test_find_race
[11:55:40] [PASSED] test_signal_forward
[11:55:40] [PASSED] test_signal_backward
[11:55:40] [PASSED] test_wait_forward
[11:55:40] [PASSED] test_wait_backward
[11:55:40] [PASSED] test_wait_random
[11:55:40] =============== [PASSED] dma-buf-fence-chain ===============
[11:55:40] ============ dma-buf-fence-unwrap (10 subtests) ============
[11:55:40] [PASSED] test_sanitycheck
[11:55:40] [PASSED] test_unwrap_array
[11:55:40] [PASSED] test_unwrap_chain
[11:55:40] [PASSED] test_unwrap_chain_array
[11:55:40] [PASSED] test_unwrap_merge
[11:55:40] [PASSED] test_unwrap_merge_duplicate
[11:55:40] [PASSED] test_unwrap_merge_seqno
[11:55:40] [PASSED] test_unwrap_merge_order
[11:55:40] [PASSED] test_unwrap_merge_complex
[11:55:40] [PASSED] test_unwrap_merge_complex_seqno
[11:55:40] ============== [PASSED] dma-buf-fence-unwrap ===============
[11:55:40] ================ dma-buf-resv (5 subtests) =================
[11:55:40] [PASSED] test_sanitycheck
[11:55:40] ===================== test_signaling ======================
[11:55:40] [PASSED] kernel
[11:55:40] [PASSED] write
[11:55:40] [PASSED] read
[11:55:40] [PASSED] bookkeep
[11:55:40] ================= [PASSED] test_signaling ==================
[11:55:40] ====================== test_for_each ======================
[11:55:40] [PASSED] kernel
[11:55:40] [PASSED] write
[11:55:40] [PASSED] read
[11:55:40] [PASSED] bookkeep
[11:55:40] ================== [PASSED] test_for_each ==================
[11:55:40] ================= test_for_each_unlocked ==================
[11:55:40] [PASSED] kernel
[11:55:40] [PASSED] write
[11:55:40] [PASSED] read
[11:55:40] [PASSED] bookkeep
[11:55:40] ============= [PASSED] test_for_each_unlocked ==============
[11:55:40] ===================== test_get_fences =====================
[11:55:40] [PASSED] kernel
[11:55:40] [PASSED] write
[11:55:40] [PASSED] read
[11:55:40] [PASSED] bookkeep
[11:55:40] ================= [PASSED] test_get_fences =================
[11:55:40] ================== [PASSED] dma-buf-resv ===================
[11:55:40] ============================================================
[11:55:40] Testing complete. Ran 54 tests: passed: 53, skipped: 1
[11:55:40] Elapsed time: 15.729s total, 1.779s configuring, 8.627s building, 5.284s running
+ cleanup
++ stat -c %u:%g /kernel
+ chown -R 1003:1003 /kernel
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH v4] [CI-ONLY][DONOT-REVIEW] Access counter squash
2026-09-10 11:43 [PATCH v4] [CI-ONLY][DONOT-REVIEW] Access counter squash Himal Prasad Ghimiray
2026-09-10 11:53 ` ✗ CI.checkpatch: warning for Access counter squash (rev4) Patchwork
2026-09-10 11:55 ` ✓ CI.KUnit: success " Patchwork
@ 2026-09-10 12:05 ` sashiko-bot
2026-09-10 12:57 ` ✓ Xe.CI.BAT: success for Access counter squash (rev4) Patchwork
2026-09-10 17:35 ` ✓ Xe.CI.FULL: " Patchwork
4 siblings, 0 replies; 6+ messages in thread
From: sashiko-bot @ 2026-09-10 12:05 UTC (permalink / raw)
To: Himal Prasad Ghimiray; +Cc: intel-xe
Thank you for your contribution! Sashiko AI review found 7 potential issue(s) to consider:
- [Critical] Returning -ENOSPC from `xe_access_counter_handler` when the queue is full causes a fatal GuC CT crash.
- [High] Incorrect calculation of `page_va` drops the sub-granularity index and shifts the processing window.
- [High] Access counter events are silently dropped for non-faulting VMs because the handler strictly requires fault mode.
- [High] AC-triggered migrations for non-migratable ranges unconditionally fail with `-EACCES`, prematurely aborting the rest of the window.
- [High] Missing error check after `xe_vm_drm_exec_lock` allows rebind without holding locks.
- [High] The `XE_VMA_MIGRATE_ON_ACC` flag incorrectly skips VRAM migration on first-touch for device atomics, causing an infinite fault loop.
- [Medium] Missing access counter queue reset during GT reset violates UAPI documentation guarantees.
--
commit 3591a7b3a4219975acccb43af71c55d2243241d9
Author: Himal Prasad Ghimiray <himal.prasad.ghimiray@intel.com>
Access counter squash
The commit introduces hardware access counters handling for the Xe driver. It
includes queue management, VM integration, SVM range setup based on counters,
and user API extensions to control access counter parameters.
> diff --git a/drivers/gpu/drm/xe/xe_access_counter.c b/drivers/gpu/drm/xe/xe_access_counter.c
> --- /dev/null
> +++ b/drivers/gpu/drm/xe/xe_access_counter.c
[ ... ]
> +static int xe_access_counter_service(struct xe_access_counter *ac)
> +{
[ ... ]
> + vm = xe_device_asid_to_fault_vm(xe, ac->consumer.asid);
> + if (IS_ERR(vm))
> + return PTR_ERR(vm);
[Severity: High]
Does strict usage of xe_device_asid_to_fault_vm() here unintentionally drop
events for normal (non-SVM) buffer objects? xe_device_asid_to_fault_vm()
requires xe_vm_in_fault_mode(vm) to be true, but xe_vma_supports_access_ctr()
indicates access counters are also supported for standard VMs.
[ ... ]
> +int xe_access_counter_handler(struct xe_device *xe, struct xe_access_counter *ac)
> +{
[ ... ]
> + spin_lock_irqsave(&ac_queue->lock, flags);
> + idx = xe_access_counter_work_index(xe);
> + full = xe_usm_queue_full(ac_queue);
> + if (!full) {
> + xe_usm_queue_push(ac_queue, ac);
> + queue_work(xe->usm.pagefault_wq, &xe->usm.ac_workers[idx].work);
> + } else {
> + drm_warn(&xe->drm,
> + "AccessCounter Queue full, shouldn't be possible\n");
> + }
> + spin_unlock_irqrestore(&ac_queue->lock, flags);
> +
> + return full ? -ENOSPC : 0;
> +}
[Severity: Critical]
Is it safe to return -ENOSPC when the access counter queue is full? If this
error propagates to process_g2h_msg() in the GuC CT layer, it treats any
non-zero return value as a fatal error and calls CT_DEAD(), wedging the
device. Should we safely drop the event and return 0 instead of crashing the
GPU under heavy access counter loads?
> diff --git a/drivers/gpu/drm/xe/xe_guc_access_counter.c b/drivers/gpu/drm/xe/xe_guc_access_counter.c
> --- /dev/null
> +++ b/drivers/gpu/drm/xe/xe_guc_access_counter.c
[ ... ]
> +static u64 xe_guc_access_counter_page_va(struct xe_device *xe, u64 addr, u8 gran)
> +{
> + u64 gran_size = xe_access_counter_granularity_to_size(gran);
> + u64 sub_gran_size = gran_size / 32;
> + u64 region_base = ALIGN_DOWN(addr, gran_size);
> + u64 offset_in_subchunk = addr & (sub_gran_size - 1);
> + u64 page_va = region_base + offset_in_subchunk;
[Severity: High]
Is this calculation for page_va correct? It extracts offset_in_subchunk using
addr & (sub_gran_size - 1), but adding this directly to region_base discards
the higher bits of the subchunk index. Does this cause the sliding window
bounds [page_va, gran_end) to shift to unaligned addresses, corrupting the
migration target?
> diff --git a/drivers/gpu/drm/xe/xe_svm.c b/drivers/gpu/drm/xe/xe_svm.c
> --- a/drivers/gpu/drm/xe/xe_svm.c
> +++ b/drivers/gpu/drm/xe/xe_svm.c
[ ... ]
> +static int __xe_svm_range_setup(struct xe_vm *vm, struct xe_vma *vma,
[ ... ]
> + /* READ_ONCE pairs with WRITE_ONCE in drm_gpusvm_range_set_unmapped() */
> + range_flags.__flags = READ_ONCE(range->base.flags.__flags);
> + if (ctx.devmem_only && !range_flags.migrate_devmem) {
> + err = -EACCES;
> + goto err_out;
> + }
[Severity: High]
Does this early check cause unintended failures for AC triggers? When triggered
by an AC event, ctx.devmem_only is forced to true. If this encounters a
non-migratable range, it returns -EACCES and aborts the entire window
iteration. Should this be safely skipped instead, since the code later tries
to handle if (acc_ctr_trigger && !range_flags.migrate_devmem) goto out;?
[ ... ]
> + /*
> + * With MIGRATE_ON_ACCESS_COUNTER, defer first placement to access
> + * counters: skip the eager migrate on a normal page fault, but still
> + * migrate when this setup was itself triggered by an AC event.
> + */
> if (--migrate_try_count >= 0 &&
> + (acc_ctr_trigger || !(vma->gpuva.flags & XE_VMA_MIGRATE_ON_ACC)) &&
> xe_svm_range_needs_migrate_to_vram(range, vma, dpagemap)) {
[Severity: High]
Does applying the XE_VMA_MIGRATE_ON_ACC flag break device atomic accesses? If
a normal page fault is triggered for a device atomic operation, VRAM placement
is required for correctness. However, this condition suppresses VRAM migration
on first-touch if MIGRATE_ON_ACC is set, causing an infinite fault loop when
xe_svm_range_get_pages() subsequently fails.
[ ... ]
> + bind_start = xe_gt_stats_ktime_get();
> + xe_validation_guard(&vctx, &vm->xe->val, &exec, (struct xe_val_flags) {}, err) {
> + err = xe_vm_drm_exec_lock(vm, &exec);
> + drm_exec_retry_on_contention(&exec);
> +
> + xe_vm_set_validation_exec(vm, &exec);
> + fence = xe_vm_range_rebind(vm, vma, range, BIT(tile->id));
[Severity: High]
What happens if xe_vm_drm_exec_lock() fails with a non-contention error (like
-EINTR)? There doesn't seem to be an error check before calling
xe_vm_range_rebind(). Could this lead to VMA rebinding proceeding without
holding the necessary locks, causing use-after-free or data corruption?
> diff --git a/include/uapi/drm/xe_drm.h b/include/uapi/drm/xe_drm.h
> --- a/include/uapi/drm/xe_drm.h
> +++ b/include/uapi/drm/xe_drm.h
[ ... ]
> + * Access counter parameters cannot be removed or changed after the exec queue
> + * is created. During a GT reset the kernel squashes any in-flight access
> + * counter notifications for that GT (pending work items are discarded), but
[Severity: Medium]
The uAPI documentation for DRM_XE_EXEC_QUEUE_EXTENSION_SET_ACC_PARAM
guarantees that in-flight access counter notifications are squashed during a
GT reset. I don't see a reset or squash hook in xe_access_counter.c to clear
xe->usm.ac_queue. Are stale access counter events persisting across GT resets?
--
Sashiko AI review · https://sashiko.dev/#/patchset/20260910114407.1801795-2-himal.prasad.ghimiray@intel.com?part=1
^ permalink raw reply [flat|nested] 6+ messages in thread
* ✓ Xe.CI.BAT: success for Access counter squash (rev4)
2026-09-10 11:43 [PATCH v4] [CI-ONLY][DONOT-REVIEW] Access counter squash Himal Prasad Ghimiray
` (2 preceding siblings ...)
2026-09-10 12:05 ` [PATCH v4] [CI-ONLY][DONOT-REVIEW] Access counter squash sashiko-bot
@ 2026-09-10 12:57 ` Patchwork
2026-09-10 17:35 ` ✓ Xe.CI.FULL: " Patchwork
4 siblings, 0 replies; 6+ messages in thread
From: Patchwork @ 2026-09-10 12:57 UTC (permalink / raw)
To: Himal Prasad Ghimiray; +Cc: intel-xe
[-- Attachment #1: Type: text/plain, Size: 935 bytes --]
== Series Details ==
Series: Access counter squash (rev4)
URL : https://patchwork.freedesktop.org/series/173728/
State : success
== Summary ==
CI Bug Log - changes from xe-5718-03ba909762f8b1e4c1a82fb67232987fc40e6163_BAT -> xe-pw-173728v4_BAT
====================================================
Summary
-------
**SUCCESS**
No regressions found.
Participating hosts (15 -> 14)
------------------------------
Missing (1): bat-ptl-1
Changes
-------
No changes found
Build changes
-------------
* Linux: xe-5718-03ba909762f8b1e4c1a82fb67232987fc40e6163 -> xe-pw-173728v4
IGT_9088: 55a88d20e327d5c440cd3f3d661684fb83f29027 @ https://gitlab.freedesktop.org/drm/igt-gpu-tools.git
xe-5718-03ba909762f8b1e4c1a82fb67232987fc40e6163: 03ba909762f8b1e4c1a82fb67232987fc40e6163
xe-pw-173728v4: 173728v4
== Logs ==
For more details see: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-173728v4/index.html
[-- Attachment #2: Type: text/html, Size: 1483 bytes --]
^ permalink raw reply [flat|nested] 6+ messages in thread
* ✓ Xe.CI.FULL: success for Access counter squash (rev4)
2026-09-10 11:43 [PATCH v4] [CI-ONLY][DONOT-REVIEW] Access counter squash Himal Prasad Ghimiray
` (3 preceding siblings ...)
2026-09-10 12:57 ` ✓ Xe.CI.BAT: success for Access counter squash (rev4) Patchwork
@ 2026-09-10 17:35 ` Patchwork
4 siblings, 0 replies; 6+ messages in thread
From: Patchwork @ 2026-09-10 17:35 UTC (permalink / raw)
To: Himal Prasad Ghimiray; +Cc: intel-xe
[-- Attachment #1: Type: text/plain, Size: 45887 bytes --]
== Series Details ==
Series: Access counter squash (rev4)
URL : https://patchwork.freedesktop.org/series/173728/
State : success
== Summary ==
CI Bug Log - changes from xe-5718-03ba909762f8b1e4c1a82fb67232987fc40e6163_FULL -> xe-pw-173728v4_FULL
====================================================
Summary
-------
**SUCCESS**
No regressions found.
Participating hosts (2 -> 2)
------------------------------
No changes in participating hosts
Known issues
------------
Here are the changes found in xe-pw-173728v4_FULL that come from known issues:
### IGT changes ###
#### Issues hit ####
* igt@intel_hwmon@hwmon-write:
- shard-lnl: NOTRUN -> [SKIP][1] ([Intel XE#1125] / [Intel XE#7312])
[1]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-173728v4/shard-lnl-3/igt@intel_hwmon@hwmon-write.html
* igt@kms_addfb_basic@addfb25-y-tiled-small-legacy:
- shard-lnl: NOTRUN -> [SKIP][2] ([Intel XE#1466])
[2]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-173728v4/shard-lnl-5/igt@kms_addfb_basic@addfb25-y-tiled-small-legacy.html
* igt@kms_big_fb@4-tiled-8bpp-rotate-90:
- shard-lnl: NOTRUN -> [SKIP][3] ([Intel XE#1407]) +6 other tests skip
[3]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-173728v4/shard-lnl-2/igt@kms_big_fb@4-tiled-8bpp-rotate-90.html
* igt@kms_big_fb@4-tiled-max-hw-stride-32bpp-rotate-180-hflip-async-flip:
- shard-lnl: NOTRUN -> [SKIP][4] ([Intel XE#3658] / [Intel XE#7360])
[4]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-173728v4/shard-lnl-3/igt@kms_big_fb@4-tiled-max-hw-stride-32bpp-rotate-180-hflip-async-flip.html
* igt@kms_big_fb@linear-max-hw-stride-64bpp-rotate-0-hflip:
- shard-lnl: NOTRUN -> [SKIP][5] ([Intel XE#7059] / [Intel XE#7085])
[5]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-173728v4/shard-lnl-3/igt@kms_big_fb@linear-max-hw-stride-64bpp-rotate-0-hflip.html
* igt@kms_big_fb@y-tiled-addfb:
- shard-lnl: NOTRUN -> [SKIP][6] ([Intel XE#1467] / [Intel XE#7367])
[6]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-173728v4/shard-lnl-3/igt@kms_big_fb@y-tiled-addfb.html
* igt@kms_big_fb@yf-tiled-addfb-size-overflow:
- shard-lnl: NOTRUN -> [SKIP][7] ([Intel XE#1428] / [Intel XE#7387])
[7]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-173728v4/shard-lnl-5/igt@kms_big_fb@yf-tiled-addfb-size-overflow.html
* igt@kms_big_fb@yf-tiled-max-hw-stride-64bpp-rotate-0-hflip-async-flip:
- shard-lnl: NOTRUN -> [SKIP][8] ([Intel XE#1124]) +8 other tests skip
[8]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-173728v4/shard-lnl-1/igt@kms_big_fb@yf-tiled-max-hw-stride-64bpp-rotate-0-hflip-async-flip.html
* igt@kms_bw@connected-linear-tiling-3-displays-target-2160x1440p:
- shard-lnl: NOTRUN -> [SKIP][9] ([Intel XE#7679])
[9]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-173728v4/shard-lnl-3/igt@kms_bw@connected-linear-tiling-3-displays-target-2160x1440p.html
* igt@kms_bw@connected-linear-tiling-4-displays-target-2560x1440p:
- shard-lnl: NOTRUN -> [SKIP][10] ([Intel XE#8365]) +1 other test skip
[10]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-173728v4/shard-lnl-3/igt@kms_bw@connected-linear-tiling-4-displays-target-2560x1440p.html
* igt@kms_bw@linear-tiling-2-displays-target-2160x1440p:
- shard-lnl: NOTRUN -> [SKIP][11] ([Intel XE#367]) +1 other test skip
[11]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-173728v4/shard-lnl-1/igt@kms_bw@linear-tiling-2-displays-target-2160x1440p.html
* igt@kms_ccs@bad-rotation-90-4-tiled-mtl-rc-ccs-cc:
- shard-lnl: NOTRUN -> [SKIP][12] ([Intel XE#2887]) +11 other tests skip
[12]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-173728v4/shard-lnl-1/igt@kms_ccs@bad-rotation-90-4-tiled-mtl-rc-ccs-cc.html
* igt@kms_ccs@crc-primary-suspend-4-tiled-bmg-ccs:
- shard-bmg: [PASS][13] -> [INCOMPLETE][14] ([Intel XE#7084] / [Intel XE#8150]) +1 other test incomplete
[13]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5718-03ba909762f8b1e4c1a82fb67232987fc40e6163/shard-bmg-9/igt@kms_ccs@crc-primary-suspend-4-tiled-bmg-ccs.html
[14]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-173728v4/shard-bmg-2/igt@kms_ccs@crc-primary-suspend-4-tiled-bmg-ccs.html
* igt@kms_ccs@crc-primary-suspend-4-tiled-mtl-rc-ccs:
- shard-lnl: NOTRUN -> [SKIP][15] ([Intel XE#3432]) +1 other test skip
[15]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-173728v4/shard-lnl-3/igt@kms_ccs@crc-primary-suspend-4-tiled-mtl-rc-ccs.html
* igt@kms_ccs@random-ccs-data-4-tiled-bmg-ccs:
- shard-lnl: NOTRUN -> [SKIP][16] ([Intel XE#2669] / [Intel XE#7389]) +7 other tests skip
[16]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-173728v4/shard-lnl-5/igt@kms_ccs@random-ccs-data-4-tiled-bmg-ccs.html
* igt@kms_cdclk@plane-scaling:
- shard-lnl: NOTRUN -> [SKIP][17] ([Intel XE#9204] / [Intel XE#9219]) +1 other test skip
[17]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-173728v4/shard-lnl-3/igt@kms_cdclk@plane-scaling.html
* igt@kms_cdclk@plane-scaling@pipe-b-edp-1:
- shard-lnl: NOTRUN -> [SKIP][18] ([Intel XE#9219]) +1 other test skip
[18]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-173728v4/shard-lnl-3/igt@kms_cdclk@plane-scaling@pipe-b-edp-1.html
* igt@kms_chamelium_color@ctm-blue-to-red:
- shard-lnl: NOTRUN -> [SKIP][19] ([Intel XE#306] / [Intel XE#7358]) +1 other test skip
[19]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-173728v4/shard-lnl-2/igt@kms_chamelium_color@ctm-blue-to-red.html
* igt@kms_chamelium_color_pipeline@plane-lut1d-post-ctm3x4:
- shard-lnl: NOTRUN -> [SKIP][20] ([Intel XE#7358])
[20]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-173728v4/shard-lnl-3/igt@kms_chamelium_color_pipeline@plane-lut1d-post-ctm3x4.html
* igt@kms_chamelium_frames@hdmi-frame-dump:
- shard-lnl: NOTRUN -> [SKIP][21] ([Intel XE#373]) +8 other tests skip
[21]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-173728v4/shard-lnl-1/igt@kms_chamelium_frames@hdmi-frame-dump.html
* igt@kms_content_protection@dp-mst-lic-type-0-hdcp14:
- shard-lnl: NOTRUN -> [SKIP][22] ([Intel XE#6974])
[22]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-173728v4/shard-lnl-3/igt@kms_content_protection@dp-mst-lic-type-0-hdcp14.html
* igt@kms_content_protection@lic-type-1:
- shard-lnl: NOTRUN -> [SKIP][23] ([Intel XE#7642]) +3 other tests skip
[23]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-173728v4/shard-lnl-2/igt@kms_content_protection@lic-type-1.html
* igt@kms_cursor_crc@cursor-sliding-32x10:
- shard-lnl: NOTRUN -> [SKIP][24] ([Intel XE#1424]) +4 other tests skip
[24]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-173728v4/shard-lnl-2/igt@kms_cursor_crc@cursor-sliding-32x10.html
* igt@kms_cursor_legacy@2x-flip-vs-cursor-legacy:
- shard-lnl: NOTRUN -> [SKIP][25] ([Intel XE#309] / [Intel XE#7343]) +5 other tests skip
[25]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-173728v4/shard-lnl-2/igt@kms_cursor_legacy@2x-flip-vs-cursor-legacy.html
* igt@kms_cursor_legacy@short-busy-flip-before-cursor-atomic-transitions-varying-size:
- shard-lnl: NOTRUN -> [SKIP][26] ([Intel XE#323] / [Intel XE#6035])
[26]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-173728v4/shard-lnl-3/igt@kms_cursor_legacy@short-busy-flip-before-cursor-atomic-transitions-varying-size.html
* igt@kms_dp_link_training@non-uhbr-sst:
- shard-lnl: NOTRUN -> [SKIP][27] ([Intel XE#4354] / [Intel XE#7450])
[27]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-173728v4/shard-lnl-1/igt@kms_dp_link_training@non-uhbr-sst.html
* igt@kms_dsc@dsc-with-output-formats-bigjoiner:
- shard-lnl: NOTRUN -> [SKIP][28] ([Intel XE#8265]) +5 other tests skip
[28]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-173728v4/shard-lnl-3/igt@kms_dsc@dsc-with-output-formats-bigjoiner.html
* igt@kms_feature_discovery@display-4x:
- shard-lnl: NOTRUN -> [SKIP][29] ([Intel XE#1138] / [Intel XE#7344])
[29]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-173728v4/shard-lnl-3/igt@kms_feature_discovery@display-4x.html
* igt@kms_feature_discovery@dsc:
- shard-lnl: NOTRUN -> [SKIP][30] ([Intel XE#8586])
[30]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-173728v4/shard-lnl-1/igt@kms_feature_discovery@dsc.html
* igt@kms_flip@2x-nonexisting-fb-interruptible:
- shard-lnl: NOTRUN -> [SKIP][31] ([Intel XE#1421]) +3 other tests skip
[31]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-173728v4/shard-lnl-3/igt@kms_flip@2x-nonexisting-fb-interruptible.html
* igt@kms_flip@flip-vs-expired-vblank-interruptible:
- shard-lnl: NOTRUN -> [FAIL][32] ([Intel XE#301]) +1 other test fail
[32]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-173728v4/shard-lnl-2/igt@kms_flip@flip-vs-expired-vblank-interruptible.html
* igt@kms_flip_scaled_crc@flip-32bpp-xtile-to-64bpp-xtile-downscaling:
- shard-lnl: NOTRUN -> [SKIP][33] ([Intel XE#1397] / [Intel XE#1745] / [Intel XE#7385] / [Intel XE#9144])
[33]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-173728v4/shard-lnl-1/igt@kms_flip_scaled_crc@flip-32bpp-xtile-to-64bpp-xtile-downscaling.html
* igt@kms_flip_scaled_crc@flip-32bpp-xtile-to-64bpp-xtile-downscaling@pipe-a-default-mode:
- shard-lnl: NOTRUN -> [SKIP][34] ([Intel XE#1397] / [Intel XE#7385] / [Intel XE#9144])
[34]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-173728v4/shard-lnl-1/igt@kms_flip_scaled_crc@flip-32bpp-xtile-to-64bpp-xtile-downscaling@pipe-a-default-mode.html
* igt@kms_flip_scaled_crc@flip-32bpp-ytile-to-64bpp-ytile-downscaling:
- shard-lnl: NOTRUN -> [SKIP][35] ([Intel XE#7178] / [Intel XE#7351]) +5 other tests skip
[35]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-173728v4/shard-lnl-5/igt@kms_flip_scaled_crc@flip-32bpp-ytile-to-64bpp-ytile-downscaling.html
* igt@kms_force_connector_basic@prune-stale-modes:
- shard-lnl: NOTRUN -> [SKIP][36] ([Intel XE#352]) +2 other tests skip
[36]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-173728v4/shard-lnl-1/igt@kms_force_connector_basic@prune-stale-modes.html
* igt@kms_frontbuffer_tracking@drrs-modesetfrombusy:
- shard-lnl: NOTRUN -> [SKIP][37] ([Intel XE#6312] / [Intel XE#651]) +16 other tests skip
[37]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-173728v4/shard-lnl-3/igt@kms_frontbuffer_tracking@drrs-modesetfrombusy.html
* igt@kms_frontbuffer_tracking@fbc-tiling-y:
- shard-lnl: NOTRUN -> [SKIP][38] ([Intel XE#1469] / [Intel XE#7399])
[38]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-173728v4/shard-lnl-5/igt@kms_frontbuffer_tracking@fbc-tiling-y.html
* igt@kms_frontbuffer_tracking@fbcdrrshdr-tiling-linear:
- shard-lnl: NOTRUN -> [SKIP][39] ([Intel XE#6312]) +13 other tests skip
[39]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-173728v4/shard-lnl-3/igt@kms_frontbuffer_tracking@fbcdrrshdr-tiling-linear.html
* igt@kms_frontbuffer_tracking@fbcpsrhdr-2p-rte:
- shard-lnl: NOTRUN -> [SKIP][40] ([Intel XE#7905]) +52 other tests skip
[40]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-173728v4/shard-lnl-1/igt@kms_frontbuffer_tracking@fbcpsrhdr-2p-rte.html
* igt@kms_frontbuffer_tracking@fbcpsrhdr-argb161616f-draw-render:
- shard-lnl: NOTRUN -> [SKIP][41] ([Intel XE#7061]) +7 other tests skip
[41]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-173728v4/shard-lnl-3/igt@kms_frontbuffer_tracking@fbcpsrhdr-argb161616f-draw-render.html
* igt@kms_frontbuffer_tracking@hdr-1p-rte:
- shard-lnl: NOTRUN -> [SKIP][42] ([Intel XE#7865]) +25 other tests skip
[42]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-173728v4/shard-lnl-2/igt@kms_frontbuffer_tracking@hdr-1p-rte.html
* igt@kms_frontbuffer_tracking@psr-2p-scndscrn-shrfb-plflip-blt:
- shard-lnl: NOTRUN -> [SKIP][43] ([Intel XE#656] / [Intel XE#7905]) +40 other tests skip
[43]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-173728v4/shard-lnl-1/igt@kms_frontbuffer_tracking@psr-2p-scndscrn-shrfb-plflip-blt.html
* igt@kms_frontbuffer_tracking@psr-argb161616f-draw-blt:
- shard-lnl: NOTRUN -> [SKIP][44] ([Intel XE#7061] / [Intel XE#7356]) +4 other tests skip
[44]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-173728v4/shard-lnl-3/igt@kms_frontbuffer_tracking@psr-argb161616f-draw-blt.html
* igt@kms_hdr@brightness-with-hdr:
- shard-lnl: NOTRUN -> [SKIP][45] ([Intel XE#3374] / [Intel XE#3544])
[45]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-173728v4/shard-lnl-2/igt@kms_hdr@brightness-with-hdr.html
* igt@kms_joiner@basic-force-ultra-joiner:
- shard-lnl: NOTRUN -> [SKIP][46] ([Intel XE#6900] / [Intel XE#7362])
[46]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-173728v4/shard-lnl-3/igt@kms_joiner@basic-force-ultra-joiner.html
* igt@kms_mst@mst-suspend-read-crc:
- shard-lnl: NOTRUN -> [SKIP][47] ([Intel XE#8348])
[47]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-173728v4/shard-lnl-1/igt@kms_mst@mst-suspend-read-crc.html
* igt@kms_pipe_stress@stress-xrgb8888-ytiled:
- shard-lnl: NOTRUN -> [SKIP][48] ([Intel XE#4329] / [Intel XE#6912] / [Intel XE#7375])
[48]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-173728v4/shard-lnl-3/igt@kms_pipe_stress@stress-xrgb8888-ytiled.html
* igt@kms_plane@pixel-format-4-tiled-dg2-rc-ccs-modifier:
- shard-lnl: NOTRUN -> [SKIP][49] ([Intel XE#7283]) +4 other tests skip
[49]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-173728v4/shard-lnl-2/igt@kms_plane@pixel-format-4-tiled-dg2-rc-ccs-modifier.html
* igt@kms_plane_multiple@2x-tiling-none:
- shard-lnl: NOTRUN -> [SKIP][50] ([Intel XE#4596] / [Intel XE#5854])
[50]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-173728v4/shard-lnl-3/igt@kms_plane_multiple@2x-tiling-none.html
* igt@kms_plane_scaling@intel-max-src-size:
- shard-lnl: NOTRUN -> [SKIP][51] ([Intel XE#3307])
[51]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-173728v4/shard-lnl-1/igt@kms_plane_scaling@intel-max-src-size.html
* igt@kms_plane_scaling@planes-downscale-factor-0-5-upscale-factor-0-25:
- shard-lnl: NOTRUN -> [SKIP][52] ([Intel XE#2763] / [Intel XE#6886]) +15 other tests skip
[52]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-173728v4/shard-lnl-2/igt@kms_plane_scaling@planes-downscale-factor-0-5-upscale-factor-0-25.html
* igt@kms_pm_dc@dc3co-after-dc6@pr-xrgb8888:
- shard-lnl: NOTRUN -> [SKIP][53] ([Intel XE#8395] / [Intel XE#8396]) +1 other test skip
[53]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-173728v4/shard-lnl-2/igt@kms_pm_dc@dc3co-after-dc6@pr-xrgb8888.html
* igt@kms_pm_dc@dc3co-after-dc6@psr2-yuv420:
- shard-lnl: NOTRUN -> [SKIP][54] ([Intel XE#8396]) +1 other test skip
[54]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-173728v4/shard-lnl-2/igt@kms_pm_dc@dc3co-after-dc6@psr2-yuv420.html
* igt@kms_pm_rpm@package-g7:
- shard-lnl: NOTRUN -> [SKIP][55] ([Intel XE#6813])
[55]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-173728v4/shard-lnl-1/igt@kms_pm_rpm@package-g7.html
* igt@kms_psr2_sf@fbc-pr-overlay-primary-update-sf-dmg-area:
- shard-lnl: NOTRUN -> [SKIP][56] ([Intel XE#2893] / [Intel XE#7304]) +3 other tests skip
[56]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-173728v4/shard-lnl-1/igt@kms_psr2_sf@fbc-pr-overlay-primary-update-sf-dmg-area.html
* igt@kms_psr2_sf@fbc-psr2-cursor-plane-move-continuous-exceed-sf:
- shard-lnl: NOTRUN -> [SKIP][57] ([Intel XE#2893] / [Intel XE#4608] / [Intel XE#7304]) +1 other test skip
[57]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-173728v4/shard-lnl-2/igt@kms_psr2_sf@fbc-psr2-cursor-plane-move-continuous-exceed-sf.html
* igt@kms_psr2_sf@fbc-psr2-cursor-plane-move-continuous-exceed-sf@pipe-a-edp-1:
- shard-lnl: NOTRUN -> [SKIP][58] ([Intel XE#4608]) +1 other test skip
[58]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-173728v4/shard-lnl-2/igt@kms_psr2_sf@fbc-psr2-cursor-plane-move-continuous-exceed-sf@pipe-a-edp-1.html
* igt@kms_psr2_sf@fbc-psr2-overlay-plane-update-continuous-sf@pipe-b-edp-1:
- shard-lnl: NOTRUN -> [SKIP][59] ([Intel XE#4608] / [Intel XE#7304]) +1 other test skip
[59]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-173728v4/shard-lnl-3/igt@kms_psr2_sf@fbc-psr2-overlay-plane-update-continuous-sf@pipe-b-edp-1.html
* igt@kms_psr@fbc-psr2-primary-blt:
- shard-lnl: NOTRUN -> [SKIP][60] ([Intel XE#1406] / [Intel XE#7345]) +1 other test skip
[60]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-173728v4/shard-lnl-1/igt@kms_psr@fbc-psr2-primary-blt.html
* igt@kms_psr@fbc-psr2-primary-blt@edp-1:
- shard-lnl: NOTRUN -> [SKIP][61] ([Intel XE#1406] / [Intel XE#4609] / [Intel XE#7345]) +1 other test skip
[61]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-173728v4/shard-lnl-1/igt@kms_psr@fbc-psr2-primary-blt@edp-1.html
* igt@kms_psr@pr-sprite-render:
- shard-lnl: NOTRUN -> [SKIP][62] ([Intel XE#1406]) +4 other tests skip
[62]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-173728v4/shard-lnl-3/igt@kms_psr@pr-sprite-render.html
* igt@kms_rotation_crc@primary-yf-tiled-reflect-x-0:
- shard-lnl: NOTRUN -> [SKIP][63] ([Intel XE#1127] / [Intel XE#5813]) +1 other test skip
[63]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-173728v4/shard-lnl-1/igt@kms_rotation_crc@primary-yf-tiled-reflect-x-0.html
* igt@kms_rotation_crc@primary-yf-tiled-reflect-x-270:
- shard-lnl: NOTRUN -> [SKIP][64] ([Intel XE#3414] / [Intel XE#3904] / [Intel XE#7342]) +2 other tests skip
[64]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-173728v4/shard-lnl-3/igt@kms_rotation_crc@primary-yf-tiled-reflect-x-270.html
* igt@kms_tiled_display@basic-test-pattern:
- shard-lnl: NOTRUN -> [SKIP][65] ([Intel XE#362] / [Intel XE#5848])
[65]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-173728v4/shard-lnl-3/igt@kms_tiled_display@basic-test-pattern.html
* igt@sriov_basic@enable-vfs-bind-unbind-each-numvfs-all:
- shard-lnl: NOTRUN -> [SKIP][66] ([Intel XE#1091] / [Intel XE#2849]) +1 other test skip
[66]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-173728v4/shard-lnl-3/igt@sriov_basic@enable-vfs-bind-unbind-each-numvfs-all.html
* igt@xe_evict@evict-large-multi-vm:
- shard-lnl: NOTRUN -> [SKIP][67] ([Intel XE#6540] / [Intel XE#688]) +12 other tests skip
[67]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-173728v4/shard-lnl-3/igt@xe_evict@evict-large-multi-vm.html
* igt@xe_exec_balancer@no-exec-cm-parallel-rebind:
- shard-lnl: NOTRUN -> [SKIP][68] ([Intel XE#7482]) +21 other tests skip
[68]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-173728v4/shard-lnl-3/igt@xe_exec_balancer@no-exec-cm-parallel-rebind.html
* igt@xe_exec_basic@multigpu-no-exec-userptr:
- shard-lnl: NOTRUN -> [SKIP][69] ([Intel XE#1392]) +9 other tests skip
[69]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-173728v4/shard-lnl-3/igt@xe_exec_basic@multigpu-no-exec-userptr.html
* igt@xe_exec_fault_mode@many-execqueues-multi-queue-prefetch:
- shard-lnl: NOTRUN -> [SKIP][70] ([Intel XE#8374]) +12 other tests skip
[70]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-173728v4/shard-lnl-1/igt@xe_exec_fault_mode@many-execqueues-multi-queue-prefetch.html
* igt@xe_exec_multi_queue@many-queues-preempt-mode-fault-close-fd:
- shard-lnl: NOTRUN -> [SKIP][71] ([Intel XE#8364]) +28 other tests skip
[71]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-173728v4/shard-lnl-5/igt@xe_exec_multi_queue@many-queues-preempt-mode-fault-close-fd.html
* igt@xe_exec_reset@multi-queue-cat-error:
- shard-lnl: NOTRUN -> [SKIP][72] ([Intel XE#8369]) +4 other tests skip
[72]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-173728v4/shard-lnl-5/igt@xe_exec_reset@multi-queue-cat-error.html
* igt@xe_exec_system_allocator@pat-index-madvise-pat-idx-uc-comp-single-vma:
- shard-lnl: NOTRUN -> [SKIP][73] ([Intel XE#6196])
[73]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-173728v4/shard-lnl-3/igt@xe_exec_system_allocator@pat-index-madvise-pat-idx-uc-comp-single-vma.html
* igt@xe_exec_threads@threads-multi-queue-mixed-shared-vm-rebind:
- shard-lnl: NOTRUN -> [SKIP][74] ([Intel XE#8378]) +11 other tests skip
[74]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-173728v4/shard-lnl-3/igt@xe_exec_threads@threads-multi-queue-mixed-shared-vm-rebind.html
* igt@xe_live_ktest@xe_bo@xe_bo_evict_kunit:
- shard-lnl: NOTRUN -> [SKIP][75] ([Intel XE#2229])
[75]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-173728v4/shard-lnl-2/igt@xe_live_ktest@xe_bo@xe_bo_evict_kunit.html
* igt@xe_madvise@atomic-cpu:
- shard-lnl: NOTRUN -> [SKIP][76] ([Intel XE#7980]) +1 other test skip
[76]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-173728v4/shard-lnl-3/igt@xe_madvise@atomic-cpu.html
* igt@xe_mmap@pci-membarrier:
- shard-lnl: NOTRUN -> [SKIP][77] ([Intel XE#5100] / [Intel XE#7322] / [Intel XE#7408])
[77]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-173728v4/shard-lnl-3/igt@xe_mmap@pci-membarrier.html
* igt@xe_multigpu_svm@mgpu-coherency-fail-basic:
- shard-lnl: NOTRUN -> [SKIP][78] ([Intel XE#6964]) +3 other tests skip
[78]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-173728v4/shard-lnl-1/igt@xe_multigpu_svm@mgpu-coherency-fail-basic.html
* igt@xe_page_reclaim@binds-null-vma:
- shard-lnl: NOTRUN -> [SKIP][79] ([Intel XE#7793])
[79]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-173728v4/shard-lnl-3/igt@xe_page_reclaim@binds-null-vma.html
* igt@xe_peer2peer@read:
- shard-lnl: NOTRUN -> [SKIP][80] ([Intel XE#1061] / [Intel XE#7326] / [Intel XE#7353])
[80]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-173728v4/shard-lnl-5/igt@xe_peer2peer@read.html
* igt@xe_pm@d3cold-mmap-vram:
- shard-lnl: NOTRUN -> [SKIP][81] ([Intel XE#2284] / [Intel XE#366] / [Intel XE#7370]) +2 other tests skip
[81]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-173728v4/shard-lnl-2/igt@xe_pm@d3cold-mmap-vram.html
* igt@xe_pm@d3hot-i2c:
- shard-lnl: NOTRUN -> [SKIP][82] ([Intel XE#5742] / [Intel XE#7328] / [Intel XE#7400])
[82]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-173728v4/shard-lnl-3/igt@xe_pm@d3hot-i2c.html
* igt@xe_pm@d3hot-mmap-vram:
- shard-lnl: NOTRUN -> [SKIP][83] ([Intel XE#1948])
[83]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-173728v4/shard-lnl-1/igt@xe_pm@d3hot-mmap-vram.html
* igt@xe_pm@s3-basic:
- shard-lnl: NOTRUN -> [SKIP][84] ([Intel XE#584] / [Intel XE#7369]) +1 other test skip
[84]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-173728v4/shard-lnl-3/igt@xe_pm@s3-basic.html
* igt@xe_prefetch_fault@l2-prefetch-fault:
- shard-lnl: NOTRUN -> [SKIP][85] ([Intel XE#8815])
[85]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-173728v4/shard-lnl-1/igt@xe_prefetch_fault@l2-prefetch-fault.html
* igt@xe_query@multigpu-query-pxp-status:
- shard-lnl: NOTRUN -> [SKIP][86] ([Intel XE#944]) +3 other tests skip
[86]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-173728v4/shard-lnl-2/igt@xe_query@multigpu-query-pxp-status.html
* igt@xe_sriov_admin@default-sched-attributes-vfs-disabled:
- shard-lnl: NOTRUN -> [SKIP][87] ([Intel XE#7174])
[87]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-173728v4/shard-lnl-5/igt@xe_sriov_admin@default-sched-attributes-vfs-disabled.html
* igt@xe_sriov_auto_provisioning@selfconfig-basic:
- shard-lnl: NOTRUN -> [SKIP][88] ([Intel XE#4130] / [Intel XE#7366])
[88]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-173728v4/shard-lnl-3/igt@xe_sriov_auto_provisioning@selfconfig-basic.html
* igt@xe_sriov_flr@flr-basic:
- shard-lnl: NOTRUN -> [SKIP][89] ([Intel XE#7569])
[89]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-173728v4/shard-lnl-2/igt@xe_sriov_flr@flr-basic.html
* igt@xe_sriov_flr@flr-each-isolation:
- shard-lnl: NOTRUN -> [SKIP][90] ([Intel XE#3342])
[90]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-173728v4/shard-lnl-1/igt@xe_sriov_flr@flr-each-isolation.html
* igt@xe_sriov_vfio@bind-unbind-vfs:
- shard-lnl: NOTRUN -> [SKIP][91] ([Intel XE#7724]) +1 other test skip
[91]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-173728v4/shard-lnl-3/igt@xe_sriov_vfio@bind-unbind-vfs.html
* igt@xe_sriov_vram@vf-access-after-resize-down:
- shard-lnl: NOTRUN -> [SKIP][92] ([Intel XE#6376] / [Intel XE#7330] / [Intel XE#7422])
[92]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-173728v4/shard-lnl-2/igt@xe_sriov_vram@vf-access-after-resize-down.html
* igt@xe_survivability@runtime-survivability:
- shard-lnl: NOTRUN -> [SKIP][93] ([Intel XE#8415])
[93]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-173728v4/shard-lnl-1/igt@xe_survivability@runtime-survivability.html
* igt@xe_vm@overcommit-nonfault-vram-lr-external-nodefer:
- shard-lnl: NOTRUN -> [SKIP][94] ([Intel XE#7892])
[94]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-173728v4/shard-lnl-3/igt@xe_vm@overcommit-nonfault-vram-lr-external-nodefer.html
* igt@xe_wedged@basic-wedged:
- shard-lnl: NOTRUN -> [DMESG-WARN][95] ([Intel XE#8963])
[95]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-173728v4/shard-lnl-3/igt@xe_wedged@basic-wedged.html
#### Possible fixes ####
* igt@kms_async_flips@alternate-sync-async-flip:
- shard-bmg: [FAIL][96] ([Intel XE#3718] / [Intel XE#6078]) -> [PASS][97]
[96]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5718-03ba909762f8b1e4c1a82fb67232987fc40e6163/shard-bmg-4/igt@kms_async_flips@alternate-sync-async-flip.html
[97]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-173728v4/shard-bmg-10/igt@kms_async_flips@alternate-sync-async-flip.html
* igt@kms_async_flips@alternate-sync-async-flip@pipe-b-dp-2:
- shard-bmg: [FAIL][98] ([Intel XE#6078]) -> [PASS][99]
[98]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5718-03ba909762f8b1e4c1a82fb67232987fc40e6163/shard-bmg-4/igt@kms_async_flips@alternate-sync-async-flip@pipe-b-dp-2.html
[99]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-173728v4/shard-bmg-10/igt@kms_async_flips@alternate-sync-async-flip@pipe-b-dp-2.html
* igt@kms_hdr@invalid-hdr:
- shard-bmg: [SKIP][100] ([Intel XE#1503]) -> [PASS][101]
[100]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5718-03ba909762f8b1e4c1a82fb67232987fc40e6163/shard-bmg-3/igt@kms_hdr@invalid-hdr.html
[101]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-173728v4/shard-bmg-7/igt@kms_hdr@invalid-hdr.html
* igt@kms_pm_dc@dc6-dpms:
- shard-lnl: [FAIL][102] ([Intel XE#8399]) -> [PASS][103]
[102]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5718-03ba909762f8b1e4c1a82fb67232987fc40e6163/shard-lnl-2/igt@kms_pm_dc@dc6-dpms.html
[103]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-173728v4/shard-lnl-2/igt@kms_pm_dc@dc6-dpms.html
* igt@xe_module_load@load:
- shard-lnl: ([PASS][104], [PASS][105], [PASS][106], [PASS][107], [PASS][108], [PASS][109], [PASS][110], [PASS][111], [PASS][112], [SKIP][113], [PASS][114], [PASS][115], [PASS][116], [PASS][117], [PASS][118], [PASS][119], [PASS][120], [PASS][121], [PASS][122], [PASS][123], [PASS][124], [PASS][125]) ([Intel XE#378] / [Intel XE#7405]) -> ([PASS][126], [PASS][127], [PASS][128], [PASS][129], [PASS][130], [PASS][131], [PASS][132], [PASS][133], [PASS][134], [PASS][135], [PASS][136], [PASS][137], [PASS][138], [PASS][139], [PASS][140], [PASS][141], [PASS][142], [PASS][143], [PASS][144], [PASS][145], [PASS][146])
[104]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5718-03ba909762f8b1e4c1a82fb67232987fc40e6163/shard-lnl-8/igt@xe_module_load@load.html
[105]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5718-03ba909762f8b1e4c1a82fb67232987fc40e6163/shard-lnl-1/igt@xe_module_load@load.html
[106]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5718-03ba909762f8b1e4c1a82fb67232987fc40e6163/shard-lnl-1/igt@xe_module_load@load.html
[107]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5718-03ba909762f8b1e4c1a82fb67232987fc40e6163/shard-lnl-8/igt@xe_module_load@load.html
[108]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5718-03ba909762f8b1e4c1a82fb67232987fc40e6163/shard-lnl-4/igt@xe_module_load@load.html
[109]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5718-03ba909762f8b1e4c1a82fb67232987fc40e6163/shard-lnl-8/igt@xe_module_load@load.html
[110]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5718-03ba909762f8b1e4c1a82fb67232987fc40e6163/shard-lnl-5/igt@xe_module_load@load.html
[111]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5718-03ba909762f8b1e4c1a82fb67232987fc40e6163/shard-lnl-3/igt@xe_module_load@load.html
[112]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5718-03ba909762f8b1e4c1a82fb67232987fc40e6163/shard-lnl-4/igt@xe_module_load@load.html
[113]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5718-03ba909762f8b1e4c1a82fb67232987fc40e6163/shard-lnl-4/igt@xe_module_load@load.html
[114]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5718-03ba909762f8b1e4c1a82fb67232987fc40e6163/shard-lnl-5/igt@xe_module_load@load.html
[115]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5718-03ba909762f8b1e4c1a82fb67232987fc40e6163/shard-lnl-5/igt@xe_module_load@load.html
[116]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5718-03ba909762f8b1e4c1a82fb67232987fc40e6163/shard-lnl-3/igt@xe_module_load@load.html
[117]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5718-03ba909762f8b1e4c1a82fb67232987fc40e6163/shard-lnl-7/igt@xe_module_load@load.html
[118]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5718-03ba909762f8b1e4c1a82fb67232987fc40e6163/shard-lnl-7/igt@xe_module_load@load.html
[119]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5718-03ba909762f8b1e4c1a82fb67232987fc40e6163/shard-lnl-7/igt@xe_module_load@load.html
[120]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5718-03ba909762f8b1e4c1a82fb67232987fc40e6163/shard-lnl-2/igt@xe_module_load@load.html
[121]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5718-03ba909762f8b1e4c1a82fb67232987fc40e6163/shard-lnl-2/igt@xe_module_load@load.html
[122]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5718-03ba909762f8b1e4c1a82fb67232987fc40e6163/shard-lnl-4/igt@xe_module_load@load.html
[123]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5718-03ba909762f8b1e4c1a82fb67232987fc40e6163/shard-lnl-2/igt@xe_module_load@load.html
[124]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5718-03ba909762f8b1e4c1a82fb67232987fc40e6163/shard-lnl-1/igt@xe_module_load@load.html
[125]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5718-03ba909762f8b1e4c1a82fb67232987fc40e6163/shard-lnl-3/igt@xe_module_load@load.html
[126]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-173728v4/shard-lnl-7/igt@xe_module_load@load.html
[127]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-173728v4/shard-lnl-7/igt@xe_module_load@load.html
[128]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-173728v4/shard-lnl-7/igt@xe_module_load@load.html
[129]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-173728v4/shard-lnl-2/igt@xe_module_load@load.html
[130]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-173728v4/shard-lnl-2/igt@xe_module_load@load.html
[131]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-173728v4/shard-lnl-2/igt@xe_module_load@load.html
[132]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-173728v4/shard-lnl-3/igt@xe_module_load@load.html
[133]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-173728v4/shard-lnl-3/igt@xe_module_load@load.html
[134]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-173728v4/shard-lnl-3/igt@xe_module_load@load.html
[135]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-173728v4/shard-lnl-5/igt@xe_module_load@load.html
[136]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-173728v4/shard-lnl-5/igt@xe_module_load@load.html
[137]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-173728v4/shard-lnl-5/igt@xe_module_load@load.html
[138]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-173728v4/shard-lnl-4/igt@xe_module_load@load.html
[139]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-173728v4/shard-lnl-4/igt@xe_module_load@load.html
[140]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-173728v4/shard-lnl-4/igt@xe_module_load@load.html
[141]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-173728v4/shard-lnl-8/igt@xe_module_load@load.html
[142]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-173728v4/shard-lnl-8/igt@xe_module_load@load.html
[143]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-173728v4/shard-lnl-8/igt@xe_module_load@load.html
[144]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-173728v4/shard-lnl-1/igt@xe_module_load@load.html
[145]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-173728v4/shard-lnl-1/igt@xe_module_load@load.html
[146]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-173728v4/shard-lnl-1/igt@xe_module_load@load.html
#### Warnings ####
* igt@kms_cursor_legacy@cursorb-vs-flipb-atomic-transitions:
- shard-lnl: [SKIP][147] ([Intel XE#309] / [Intel XE#7343]) -> [SKIP][148] ([Intel XE#309] / [Intel XE#7343] / [Intel XE#7935])
[147]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5718-03ba909762f8b1e4c1a82fb67232987fc40e6163/shard-lnl-3/igt@kms_cursor_legacy@cursorb-vs-flipb-atomic-transitions.html
[148]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-173728v4/shard-lnl-8/igt@kms_cursor_legacy@cursorb-vs-flipb-atomic-transitions.html
* igt@xe_exec_reset@gt-reset-fault-injection:
- shard-lnl: [ABORT][149] ([Intel XE#9140] / [Intel XE#9145]) -> [DMESG-WARN][150] ([Intel XE#9130])
[149]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-5718-03ba909762f8b1e4c1a82fb67232987fc40e6163/shard-lnl-1/igt@xe_exec_reset@gt-reset-fault-injection.html
[150]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-173728v4/shard-lnl-5/igt@xe_exec_reset@gt-reset-fault-injection.html
[Intel XE#1061]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1061
[Intel XE#1091]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1091
[Intel XE#1124]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1124
[Intel XE#1125]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1125
[Intel XE#1127]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1127
[Intel XE#1138]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1138
[Intel XE#1392]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1392
[Intel XE#1397]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1397
[Intel XE#1406]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1406
[Intel XE#1407]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1407
[Intel XE#1421]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1421
[Intel XE#1424]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1424
[Intel XE#1428]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1428
[Intel XE#1466]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1466
[Intel XE#1467]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1467
[Intel XE#1469]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1469
[Intel XE#1503]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1503
[Intel XE#1745]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1745
[Intel XE#1948]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1948
[Intel XE#2229]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2229
[Intel XE#2284]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2284
[Intel XE#2669]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2669
[Intel XE#2763]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2763
[Intel XE#2849]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2849
[Intel XE#2887]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2887
[Intel XE#2893]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2893
[Intel XE#301]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/301
[Intel XE#306]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/306
[Intel XE#309]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/309
[Intel XE#323]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/323
[Intel XE#3307]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3307
[Intel XE#3342]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3342
[Intel XE#3374]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3374
[Intel XE#3414]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3414
[Intel XE#3432]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3432
[Intel XE#352]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/352
[Intel XE#3544]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3544
[Intel XE#362]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/362
[Intel XE#3658]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3658
[Intel XE#366]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/366
[Intel XE#367]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/367
[Intel XE#3718]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3718
[Intel XE#373]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/373
[Intel XE#378]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/378
[Intel XE#3904]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3904
[Intel XE#4130]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4130
[Intel XE#4329]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4329
[Intel XE#4354]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4354
[Intel XE#4596]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4596
[Intel XE#4608]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4608
[Intel XE#4609]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4609
[Intel XE#5100]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/5100
[Intel XE#5742]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/5742
[Intel XE#5813]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/5813
[Intel XE#584]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/584
[Intel XE#5848]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/5848
[Intel XE#5854]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/5854
[Intel XE#6035]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/6035
[Intel XE#6078]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/6078
[Intel XE#6196]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/6196
[Intel XE#6312]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/6312
[Intel XE#6376]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/6376
[Intel XE#651]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/651
[Intel XE#6540]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/6540
[Intel XE#656]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/656
[Intel XE#6813]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/6813
[Intel XE#688]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/688
[Intel XE#6886]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/6886
[Intel XE#6900]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/6900
[Intel XE#6912]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/6912
[Intel XE#6964]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/6964
[Intel XE#6974]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/6974
[Intel XE#7059]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7059
[Intel XE#7061]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7061
[Intel XE#7084]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7084
[Intel XE#7085]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7085
[Intel XE#7174]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7174
[Intel XE#7178]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7178
[Intel XE#7283]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7283
[Intel XE#7304]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7304
[Intel XE#7312]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7312
[Intel XE#7322]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7322
[Intel XE#7326]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7326
[Intel XE#7328]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7328
[Intel XE#7330]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7330
[Intel XE#7342]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7342
[Intel XE#7343]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7343
[Intel XE#7344]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7344
[Intel XE#7345]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7345
[Intel XE#7351]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7351
[Intel XE#7353]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7353
[Intel XE#7356]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7356
[Intel XE#7358]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7358
[Intel XE#7360]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7360
[Intel XE#7362]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7362
[Intel XE#7366]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7366
[Intel XE#7367]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7367
[Intel XE#7369]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7369
[Intel XE#7370]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7370
[Intel XE#7375]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7375
[Intel XE#7385]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7385
[Intel XE#7387]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7387
[Intel XE#7389]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7389
[Intel XE#7399]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7399
[Intel XE#7400]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7400
[Intel XE#7405]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7405
[Intel XE#7408]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7408
[Intel XE#7422]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7422
[Intel XE#7450]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7450
[Intel XE#7482]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7482
[Intel XE#7569]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7569
[Intel XE#7642]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7642
[Intel XE#7679]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7679
[Intel XE#7724]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7724
[Intel XE#7793]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7793
[Intel XE#7865]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7865
[Intel XE#7892]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7892
[Intel XE#7905]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7905
[Intel XE#7935]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7935
[Intel XE#7980]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/7980
[Intel XE#8150]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/8150
[Intel XE#8265]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/8265
[Intel XE#8348]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/8348
[Intel XE#8364]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/8364
[Intel XE#8365]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/8365
[Intel XE#8369]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/8369
[Intel XE#8374]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/8374
[Intel XE#8378]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/8378
[Intel XE#8395]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/8395
[Intel XE#8396]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/8396
[Intel XE#8399]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/8399
[Intel XE#8415]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/8415
[Intel XE#8586]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/8586
[Intel XE#8815]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/8815
[Intel XE#8963]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/8963
[Intel XE#9130]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/9130
[Intel XE#9140]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/9140
[Intel XE#9144]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/9144
[Intel XE#9145]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/9145
[Intel XE#9204]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/9204
[Intel XE#9219]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/9219
[Intel XE#944]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/944
Build changes
-------------
* Linux: xe-5718-03ba909762f8b1e4c1a82fb67232987fc40e6163 -> xe-pw-173728v4
IGT_9088: 55a88d20e327d5c440cd3f3d661684fb83f29027 @ https://gitlab.freedesktop.org/drm/igt-gpu-tools.git
xe-5718-03ba909762f8b1e4c1a82fb67232987fc40e6163: 03ba909762f8b1e4c1a82fb67232987fc40e6163
xe-pw-173728v4: 173728v4
== Logs ==
For more details see: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-173728v4/index.html
[-- Attachment #2: Type: text/html, Size: 50439 bytes --]
^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2026-09-10 17:35 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-09-10 11:43 [PATCH v4] [CI-ONLY][DONOT-REVIEW] Access counter squash Himal Prasad Ghimiray
2026-09-10 11:53 ` ✗ CI.checkpatch: warning for Access counter squash (rev4) Patchwork
2026-09-10 11:55 ` ✓ CI.KUnit: success " Patchwork
2026-09-10 12:05 ` [PATCH v4] [CI-ONLY][DONOT-REVIEW] Access counter squash sashiko-bot
2026-09-10 12:57 ` ✓ Xe.CI.BAT: success for Access counter squash (rev4) Patchwork
2026-09-10 17:35 ` ✓ Xe.CI.FULL: " Patchwork
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox