Intel-XE Archive on lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v8 0/6] drm/xe/xe_vm: Implement xe_vm_get_property_ioctl
@ 2025-03-13 18:34 Jonathan Cavitt
  2025-03-13 18:34 ` [PATCH v8 1/6] drm/xe/xe_gt_pagefault: Disallow writes to read-only VMAs Jonathan Cavitt
                   ` (13 more replies)
  0 siblings, 14 replies; 27+ messages in thread
From: Jonathan Cavitt @ 2025-03-13 18:34 UTC (permalink / raw)
  To: intel-xe
  Cc: saurabhg.gupta, alex.zuo, jonathan.cavitt, joonas.lahtinen,
	matthew.brost, jianxun.zhang, shuicheng.lin, dri-devel,
	Michal.Wajdeczko, michal.mzorek

Add additional information to each VM so they can report up to the first
50 seen faults.  Only pagefaults are saved this way currently, though in
the future, all faults should be tracked by the VM for future reporting.

Additionally, of the pagefaults reported, only failed pagefaults are
saved this way, as successful pagefaults should recover silently and not
need to be reported to userspace.

To allow userspace to access these faults, a new ioctl -
xe_vm_get_property_ioct - was created.

v2: (Matt Brost)
- Break full ban list request into a separate property.
- Reformat drm_xe_vm_get_property struct.
- Remove need for drm_xe_faults helper struct.
- Separate data pointer and scalar return value in ioctl.
- Get address type on pagefault report and save it to the pagefault.
- Correctly reject writes to read-only VMAs.
- Miscellaneous formatting fixes.

v3: (Matt Brost)
- Only allow querying of failed pagefaults

v4:
- Remove unnecessary size parameter from helper function, as it
  is a property of the arguments. (jcavitt)
- Remove unnecessary copy_from_user (Jainxun)
- Set address_precision to 1 (Jainxun)
- Report max size instead of dynamic size for memory allocation
  purposes.  Total memory usage is reported separately.

v5:
- Return int from xe_vm_get_property_size (Shuicheng)
- Fix memory leak (Shuicheng)
- Remove unnecessary size variable (jcavitt)

v6:
- Free vm after use (Shuicheng)
- Compress pf copy logic (Shuicheng)
- Update fault_unsuccessful before storing (Shuicheng)
- Fix old struct name in comments (Shuicheng)
- Keep first 50 pagefaults instead of last 50 (Jianxun)
- Rename ioctl to xe_vm_get_faults_ioctl (jcavitt)

v7:
- Avoid unnecessary execution by checking MAX_PFS earlier (jcavitt)
- Fix double-locking error (jcavitt)
- Assert kmemdump is successful (Shuicheng)
- Repair and move fill_faults break condition (Dan Carpenter)
- Free vm after use (jcavitt)
- Combine assertions (jcavitt)
- Expand size check in xe_vm_get_faults_ioctl (jcavitt)
- Remove return mask from fill_faults, as return is already -EFAULT or 0
  (jcavitt)

v8:
- Revert back to using drm_xe_vm_get_property_ioctl
- s/Migrate/Move (Michal)
- s/xe_pagefault/xe_gt_pagefault (Michal)
- Create new header file, xe_gt_pagefault_types.h (Michal)
- Add and fix kernel docs (Michal)
- Rename xe_vm.pfs to xe_vm.faults (jcavitt)
- Store fault data and not pagefault in xe_vm faults list (jcavitt)
- Store address, address type, and address precision per fault (jcavitt)
- Store engine class and instance data per fault (Jianxun)
- Properly handle kzalloc error (Michal W)
- s/MAX_PFS/MAX_FAULTS_SAVED_PER_VM (Michal W)
- Store fault level per fault (Micahl M)
- Apply better copy_to_user logic (jcavitt)

Signed-off-by: Jonathan Cavitt <joanthan.cavitt@intel.com>
Suggested-by: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
Suggested-by: Matthew Brost <matthew.brost@intel.com>
Cc: Zhang Jianxun <jianxun.zhang@intel.com>
Cc: Shuicheng Lin <shuicheng.lin@intel.com>
Cc: Michal Wajdeczko <Michal.Wajdeczko@intel.com>
Cc: Michal Mzorek <michal.mzorek@intel.com>

Jonathan Cavitt (6):
  drm/xe/xe_gt_pagefault: Disallow writes to read-only VMAs
  drm/xe/xe_gt_pagefault: Move pagefault struct to header
  drm/xe/uapi: Define drm_xe_vm_get_property
  drm/xe/xe_gt_pagefault: Add address_type field to pagefaults
  drm/xe/xe_vm: Add per VM fault info
  drm/xe/xe_vm: Implement xe_vm_get_property_ioctl

 drivers/gpu/drm/xe/xe_device.c             |   3 +
 drivers/gpu/drm/xe/xe_gt_pagefault.c       |  68 ++++----
 drivers/gpu/drm/xe/xe_gt_pagefault.h       |   2 +
 drivers/gpu/drm/xe/xe_gt_pagefault_types.h |  69 ++++++++
 drivers/gpu/drm/xe/xe_vm.c                 | 192 +++++++++++++++++++++
 drivers/gpu/drm/xe/xe_vm.h                 |  11 ++
 drivers/gpu/drm/xe/xe_vm_types.h           |  33 ++++
 include/uapi/drm/xe_drm.h                  |  69 ++++++++
 8 files changed, 414 insertions(+), 33 deletions(-)
 create mode 100644 drivers/gpu/drm/xe/xe_gt_pagefault_types.h

-- 
2.43.0


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

* [PATCH v8 1/6] drm/xe/xe_gt_pagefault: Disallow writes to read-only VMAs
  2025-03-13 18:34 [PATCH v8 0/6] drm/xe/xe_vm: Implement xe_vm_get_property_ioctl Jonathan Cavitt
@ 2025-03-13 18:34 ` Jonathan Cavitt
  2025-03-13 18:34 ` [PATCH v8 2/6] drm/xe/xe_gt_pagefault: Move pagefault struct to header Jonathan Cavitt
                   ` (12 subsequent siblings)
  13 siblings, 0 replies; 27+ messages in thread
From: Jonathan Cavitt @ 2025-03-13 18:34 UTC (permalink / raw)
  To: intel-xe
  Cc: saurabhg.gupta, alex.zuo, jonathan.cavitt, joonas.lahtinen,
	matthew.brost, jianxun.zhang, shuicheng.lin, dri-devel,
	Michal.Wajdeczko, michal.mzorek

The page fault handler should reject write/atomic access to read only
VMAs.  Add code to handle this in handle_pagefault after the VMA lookup.

Fixes: 3d420e9fa848 ("drm/xe: Rework GPU page fault handling")
Signed-off-by: Jonathan Cavitt <jonathan.cavitt@intel.com>
Suggested-by: Matthew Brost <matthew.brost@intel.com>
---
 drivers/gpu/drm/xe/xe_gt_pagefault.c | 5 +++++
 1 file changed, 5 insertions(+)

diff --git a/drivers/gpu/drm/xe/xe_gt_pagefault.c b/drivers/gpu/drm/xe/xe_gt_pagefault.c
index 9fa11e837dd1..3240890aac07 100644
--- a/drivers/gpu/drm/xe/xe_gt_pagefault.c
+++ b/drivers/gpu/drm/xe/xe_gt_pagefault.c
@@ -237,6 +237,11 @@ static int handle_pagefault(struct xe_gt *gt, struct pagefault *pf)
 		goto unlock_vm;
 	}
 
+	if (xe_vma_read_only(vma) && pf->access_type != ACCESS_TYPE_READ) {
+		err = -EPERM;
+		goto unlock_vm;
+	}
+
 	atomic = access_is_atomic(pf->access_type);
 
 	if (xe_vma_is_cpu_addr_mirror(vma))
-- 
2.43.0


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

* [PATCH v8 2/6] drm/xe/xe_gt_pagefault: Move pagefault struct to header
  2025-03-13 18:34 [PATCH v8 0/6] drm/xe/xe_vm: Implement xe_vm_get_property_ioctl Jonathan Cavitt
  2025-03-13 18:34 ` [PATCH v8 1/6] drm/xe/xe_gt_pagefault: Disallow writes to read-only VMAs Jonathan Cavitt
@ 2025-03-13 18:34 ` Jonathan Cavitt
  2025-03-14 17:01   ` Michal Wajdeczko
  2025-03-13 18:34 ` [PATCH v8 3/6] drm/xe/uapi: Define drm_xe_vm_get_property Jonathan Cavitt
                   ` (11 subsequent siblings)
  13 siblings, 1 reply; 27+ messages in thread
From: Jonathan Cavitt @ 2025-03-13 18:34 UTC (permalink / raw)
  To: intel-xe
  Cc: saurabhg.gupta, alex.zuo, jonathan.cavitt, joonas.lahtinen,
	matthew.brost, jianxun.zhang, shuicheng.lin, dri-devel,
	Michal.Wajdeczko, michal.mzorek

Move the pagefault struct from xe_gt_pagefault.c to the
xe_gt_pagefault_types.h header file, along with the associated enum values.

v2:
- Normalize names for common header (Matt Brost)

v3:
- s/Migrate/Move (Michal W)
- s/xe_pagefault/xe_gt_pagefault (Michal W)
- Create new header file, xe_gt_pagefault_types.h (Michal W)
- Add kernel docs (Michal W)

Signed-off-by: Jonathan Cavitt <jonathan.cavitt@intel.com>
Cc: Michal Wajdeczko <Michal.Wajdeczko@intel.com>
---
 drivers/gpu/drm/xe/xe_gt_pagefault.c       | 41 +++----------
 drivers/gpu/drm/xe/xe_gt_pagefault.h       |  2 +
 drivers/gpu/drm/xe/xe_gt_pagefault_types.h | 67 ++++++++++++++++++++++
 3 files changed, 76 insertions(+), 34 deletions(-)
 create mode 100644 drivers/gpu/drm/xe/xe_gt_pagefault_types.h

diff --git a/drivers/gpu/drm/xe/xe_gt_pagefault.c b/drivers/gpu/drm/xe/xe_gt_pagefault.c
index 3240890aac07..06a4e3fdc11d 100644
--- a/drivers/gpu/drm/xe/xe_gt_pagefault.c
+++ b/drivers/gpu/drm/xe/xe_gt_pagefault.c
@@ -23,33 +23,6 @@
 #include "xe_trace_bo.h"
 #include "xe_vm.h"
 
-struct pagefault {
-	u64 page_addr;
-	u32 asid;
-	u16 pdata;
-	u8 vfid;
-	u8 access_type;
-	u8 fault_type;
-	u8 fault_level;
-	u8 engine_class;
-	u8 engine_instance;
-	u8 fault_unsuccessful;
-	bool trva_fault;
-};
-
-enum access_type {
-	ACCESS_TYPE_READ = 0,
-	ACCESS_TYPE_WRITE = 1,
-	ACCESS_TYPE_ATOMIC = 2,
-	ACCESS_TYPE_RESERVED = 3,
-};
-
-enum fault_type {
-	NOT_PRESENT = 0,
-	WRITE_ACCESS_VIOLATION = 1,
-	ATOMIC_ACCESS_VIOLATION = 2,
-};
-
 struct acc {
 	u64 va_range_base;
 	u32 asid;
@@ -61,9 +34,9 @@ struct acc {
 	u8 engine_instance;
 };
 
-static bool access_is_atomic(enum access_type access_type)
+static bool access_is_atomic(enum xe_gt_pagefault_access_type access_type)
 {
-	return access_type == ACCESS_TYPE_ATOMIC;
+	return access_type == XE_GT_PAGEFAULT_ACCESS_TYPE_ATOMIC;
 }
 
 static bool vma_is_valid(struct xe_tile *tile, struct xe_vma *vma)
@@ -205,7 +178,7 @@ static struct xe_vm *asid_to_vm(struct xe_device *xe, u32 asid)
 	return vm;
 }
 
-static int handle_pagefault(struct xe_gt *gt, struct pagefault *pf)
+static int handle_pagefault(struct xe_gt *gt, struct xe_gt_pagefault *pf)
 {
 	struct xe_device *xe = gt_to_xe(gt);
 	struct xe_vm *vm;
@@ -237,7 +210,7 @@ static int handle_pagefault(struct xe_gt *gt, struct pagefault *pf)
 		goto unlock_vm;
 	}
 
-	if (xe_vma_read_only(vma) && pf->access_type != ACCESS_TYPE_READ) {
+	if (xe_vma_read_only(vma) && pf->access_type != XE_GT_PAGEFAULT_ACCESS_TYPE_READ) {
 		err = -EPERM;
 		goto unlock_vm;
 	}
@@ -271,7 +244,7 @@ static int send_pagefault_reply(struct xe_guc *guc,
 	return xe_guc_ct_send(&guc->ct, action, ARRAY_SIZE(action), 0, 0);
 }
 
-static void print_pagefault(struct xe_device *xe, struct pagefault *pf)
+static void print_pagefault(struct xe_device *xe, struct xe_gt_pagefault *pf)
 {
 	drm_dbg(&xe->drm, "\n\tASID: %d\n"
 		 "\tVFID: %d\n"
@@ -291,7 +264,7 @@ static void print_pagefault(struct xe_device *xe, struct pagefault *pf)
 
 #define PF_MSG_LEN_DW	4
 
-static bool get_pagefault(struct pf_queue *pf_queue, struct pagefault *pf)
+static bool get_pagefault(struct pf_queue *pf_queue, struct xe_gt_pagefault *pf)
 {
 	const struct xe_guc_pagefault_desc *desc;
 	bool ret = false;
@@ -378,7 +351,7 @@ static void pf_queue_work_func(struct work_struct *w)
 	struct xe_gt *gt = pf_queue->gt;
 	struct xe_device *xe = gt_to_xe(gt);
 	struct xe_guc_pagefault_reply reply = {};
-	struct pagefault pf = {};
+	struct xe_gt_pagefault pf = {};
 	unsigned long threshold;
 	int ret;
 
diff --git a/drivers/gpu/drm/xe/xe_gt_pagefault.h b/drivers/gpu/drm/xe/xe_gt_pagefault.h
index 839c065a5e4c..69b700c4915a 100644
--- a/drivers/gpu/drm/xe/xe_gt_pagefault.h
+++ b/drivers/gpu/drm/xe/xe_gt_pagefault.h
@@ -8,6 +8,8 @@
 
 #include <linux/types.h>
 
+#include "xe_gt_pagefault_types.h"
+
 struct xe_gt;
 struct xe_guc;
 
diff --git a/drivers/gpu/drm/xe/xe_gt_pagefault_types.h b/drivers/gpu/drm/xe/xe_gt_pagefault_types.h
new file mode 100644
index 000000000000..90b7085d4b8e
--- /dev/null
+++ b/drivers/gpu/drm/xe/xe_gt_pagefault_types.h
@@ -0,0 +1,67 @@
+/* SPDX-License-Identifier: MIT */
+/*
+ * Copyright © 2022-2025 Intel Corporation
+ */
+
+#ifndef _XE_GT_PAGEFAULT_TYPES_H_
+#define _XE_GT_PAGEFAULT_TYPES_H_
+
+/**
+ * struct xe_gt_pagefault - Structure of pagefaults returned by the
+ * pagefault handler
+ */
+struct xe_gt_pagefault {
+	/** @page_addr: faulted address of this pagefault */
+	u64 page_addr;
+	/** @asid: ASID of this pagefault */
+	u32 asid;
+	/** @pdata: PDATA of this pagefault */
+	u16 pdata;
+	/** @vfid: VFID of this pagefault */
+	u8 vfid;
+	/**
+	 * @access_type: access type of this pagefault, as a value
+	 * from xe_gt_pagefault_access_type
+	 */
+	u8 access_type;
+	/**
+	 * @fault_type: fault type of this pagefault, as a value
+	 * from xe_gt_pagefault_fault_type
+	 */
+	u8 fault_type;
+	/** @fault_level: fault level of this pagefault */
+	u8 fault_level;
+	/** @engine_class: engine class this pagefault was reported on */
+	u8 engine_class;
+	/** @engine_instance: engine instance this pagefault was reported on */
+	u8 engine_instance;
+	/** @fault_unsuccessful: flag for if the pagefault recovered or not */
+	u8 fault_unsuccessful;
+	/** @prefetch: unused */
+	bool prefetch;
+	/** @trva_fault: is set if this is a TRTT fault */
+	bool trva_fault;
+};
+
+/**
+ * enum xe_gt_pagefault_access_type - Access type reported to the xe_gt_pagefault
+ * struct.  Saved to xe_gt_pagefault@access_type
+ */
+enum xe_gt_pagefault_access_type {
+	XE_GT_PAGEFAULT_ACCESS_TYPE_READ = 0,
+	XE_GT_PAGEFAULT_ACCESS_TYPE_WRITE = 1,
+	XE_GT_PAGEFAULT_ACCESS_TYPE_ATOMIC = 2,
+	XE_GT_PAGEFAULT_ACCESS_TYPE_RESERVED = 3,
+};
+
+/**
+ * enum xe_gt_pagefault_fault_type - Fault type reported to the xe_gt_pagefault
+ * struct.  Saved to xe_gt_pagefault@fault_type
+ */
+enum xe_gt_pagefault_fault_type {
+	XE_GT_PAGEFAULT_TYPE_NOT_PRESENT = 0,
+	XE_GT_PAGEFAULT_TYPE_WRITE_ACCESS_VIOLATION = 1,
+	XE_GT_PAGEFAULT_TYPE_ATOMIC_ACCESS_VIOLATION = 2,
+};
+
+#endif
-- 
2.43.0


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

* [PATCH v8 3/6] drm/xe/uapi: Define drm_xe_vm_get_property
  2025-03-13 18:34 [PATCH v8 0/6] drm/xe/xe_vm: Implement xe_vm_get_property_ioctl Jonathan Cavitt
  2025-03-13 18:34 ` [PATCH v8 1/6] drm/xe/xe_gt_pagefault: Disallow writes to read-only VMAs Jonathan Cavitt
  2025-03-13 18:34 ` [PATCH v8 2/6] drm/xe/xe_gt_pagefault: Move pagefault struct to header Jonathan Cavitt
@ 2025-03-13 18:34 ` Jonathan Cavitt
  2025-03-13 22:10   ` Jianxun Zhang
  2025-03-13 18:34 ` [PATCH v8 4/6] drm/xe/xe_gt_pagefault: Add address_type field to pagefaults Jonathan Cavitt
                   ` (10 subsequent siblings)
  13 siblings, 1 reply; 27+ messages in thread
From: Jonathan Cavitt @ 2025-03-13 18:34 UTC (permalink / raw)
  To: intel-xe
  Cc: saurabhg.gupta, alex.zuo, jonathan.cavitt, joonas.lahtinen,
	matthew.brost, jianxun.zhang, shuicheng.lin, dri-devel,
	Michal.Wajdeczko, michal.mzorek

Add initial declarations for the drm_xe_vm_get_property ioctl.

Signed-off-by: Jonathan Cavitt <jonathan.cavitt@intel.com>
---
 include/uapi/drm/xe_drm.h | 69 +++++++++++++++++++++++++++++++++++++++
 1 file changed, 69 insertions(+)

diff --git a/include/uapi/drm/xe_drm.h b/include/uapi/drm/xe_drm.h
index 616916985e3f..0ed52666b4e9 100644
--- a/include/uapi/drm/xe_drm.h
+++ b/include/uapi/drm/xe_drm.h
@@ -81,6 +81,7 @@ extern "C" {
  *  - &DRM_IOCTL_XE_EXEC
  *  - &DRM_IOCTL_XE_WAIT_USER_FENCE
  *  - &DRM_IOCTL_XE_OBSERVATION
+ *  - &DRM_IOCTL_XE_VM_GET_PROPERTY
  */
 
 /*
@@ -102,6 +103,7 @@ extern "C" {
 #define DRM_XE_EXEC			0x09
 #define DRM_XE_WAIT_USER_FENCE		0x0a
 #define DRM_XE_OBSERVATION		0x0b
+#define DRM_XE_VM_GET_PROPERTY		0x0c
 
 /* Must be kept compact -- no holes */
 
@@ -117,6 +119,7 @@ extern "C" {
 #define DRM_IOCTL_XE_EXEC			DRM_IOW(DRM_COMMAND_BASE + DRM_XE_EXEC, struct drm_xe_exec)
 #define DRM_IOCTL_XE_WAIT_USER_FENCE		DRM_IOWR(DRM_COMMAND_BASE + DRM_XE_WAIT_USER_FENCE, struct drm_xe_wait_user_fence)
 #define DRM_IOCTL_XE_OBSERVATION		DRM_IOW(DRM_COMMAND_BASE + DRM_XE_OBSERVATION, struct drm_xe_observation_param)
+#define DRM_IOCTL_XE_VM_GET_PROPERTY	DRM_IOWR(DRM_COMMAND_BASE + DRM_XE_VM_GET_PROPERTY, struct drm_xe_vm_get_property)
 
 /**
  * DOC: Xe IOCTL Extensions
@@ -1189,6 +1192,72 @@ struct drm_xe_vm_bind {
 	__u64 reserved[2];
 };
 
+/** struct xe_vm_fault - Describes faults for %DRM_XE_VM_GET_PROPERTY_FAULTS */
+struct xe_vm_fault {
+	/** @address: Address of the fault */
+	__u64 address;
+#define DRM_XE_FAULT_ADDRESS_TYPE_NONE_EXT		0
+#define DRM_XE_FAULT_ADDRESS_TYPE_READ_INVALID_EXT	1
+#define DRM_XE_FAULT_ADDRESS_TYPE_WRITE_INVALID_EXT	2
+	/** @address_type: Type of address access that resulted in fault */
+	__u32 address_type;
+	/** @address_precision: Precision of faulted address */
+	__u32 address_precision;
+	/** @fault_level: fault level of the fault */
+	__u8 fault_level;
+	/** @engine_class: class of engine fault was reported on */
+	__u8 engine_class;
+	/** @engine_instance: instance of engine fault was reported on */
+	__u8 engine_instance;
+	/** @pad: MBZ */
+	__u8 pad[5];
+	/** @reserved: MBZ */
+	__u64 reserved[3];
+};
+
+/**
+ * struct drm_xe_vm_get_property - Input of &DRM_IOCTL_XE_VM_GET_PROPERTY
+ *
+ * The user provides a VM ID and a property to query for.  The ioctl will return
+ * the size of the data expected to be returned in @size.  Performing the query
+ * again with memory allocated to @data of size @size will return the requested
+ * data to the allocated memory.
+ *
+ * Some get property requests may be scalar values and require no memory allocation.
+ * In such cases, the first call to this ioctl will not set @size and will return
+ * the requested value to @value instead.
+ *
+ * The @property can be:
+ *  - %DRM_XE_VM_GET_PROPERTY_FAULTS
+ */
+struct drm_xe_vm_get_property {
+	/** @extensions: Pointer to the first extension struct, if any */
+	__u64 extensions;
+
+	/** @vm_id: The ID of the VM to query the properties of */
+	__u32 vm_id;
+
+#define DRM_XE_VM_GET_PROPERTY_FAULTS		0
+	/** @property: property to get */
+	__u32 property;
+
+	/** @size: Size to allocate for @data */
+	__u32 size;
+
+	/** @pad: MBZ */
+	__u32 pad;
+
+	union {
+		/** @data: Pointer to user-defined array of flexible size and type */
+		__u64 data;
+		/** @value: Return value for scalar queries */
+		__u64 value;
+	};
+
+	/** @reserved: MBZ */
+	__u64 reserved[3];
+};
+
 /**
  * struct drm_xe_exec_queue_create - Input of &DRM_IOCTL_XE_EXEC_QUEUE_CREATE
  *
-- 
2.43.0


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

* [PATCH v8 4/6] drm/xe/xe_gt_pagefault: Add address_type field to pagefaults
  2025-03-13 18:34 [PATCH v8 0/6] drm/xe/xe_vm: Implement xe_vm_get_property_ioctl Jonathan Cavitt
                   ` (2 preceding siblings ...)
  2025-03-13 18:34 ` [PATCH v8 3/6] drm/xe/uapi: Define drm_xe_vm_get_property Jonathan Cavitt
@ 2025-03-13 18:34 ` Jonathan Cavitt
  2025-03-13 18:34 ` [PATCH v8 5/6] drm/xe/xe_vm: Add per VM fault info Jonathan Cavitt
                   ` (9 subsequent siblings)
  13 siblings, 0 replies; 27+ messages in thread
From: Jonathan Cavitt @ 2025-03-13 18:34 UTC (permalink / raw)
  To: intel-xe
  Cc: saurabhg.gupta, alex.zuo, jonathan.cavitt, joonas.lahtinen,
	matthew.brost, jianxun.zhang, shuicheng.lin, dri-devel,
	Michal.Wajdeczko, michal.mzorek

Add a new field to the xe_pagefault struct, address_type, that tracks
the type of fault the pagefault incurred.

Signed-off-by: Jonathan Cavitt <jonathan.cavitt@intel.com>
---
 drivers/gpu/drm/xe/xe_gt_pagefault.c       | 3 +++
 drivers/gpu/drm/xe/xe_gt_pagefault_types.h | 2 ++
 2 files changed, 5 insertions(+)

diff --git a/drivers/gpu/drm/xe/xe_gt_pagefault.c b/drivers/gpu/drm/xe/xe_gt_pagefault.c
index 06a4e3fdc11d..e67ee7ac3df7 100644
--- a/drivers/gpu/drm/xe/xe_gt_pagefault.c
+++ b/drivers/gpu/drm/xe/xe_gt_pagefault.c
@@ -206,11 +206,13 @@ static int handle_pagefault(struct xe_gt *gt, struct xe_gt_pagefault *pf)
 
 	vma = lookup_vma(vm, pf->page_addr);
 	if (!vma) {
+		pf->address_type = DRM_XE_FAULT_ADDRESS_TYPE_NONE_EXT;
 		err = -EINVAL;
 		goto unlock_vm;
 	}
 
 	if (xe_vma_read_only(vma) && pf->access_type != XE_GT_PAGEFAULT_ACCESS_TYPE_READ) {
+		pf->address_type = DRM_XE_FAULT_ADDRESS_TYPE_WRITE_INVALID_EXT;
 		err = -EPERM;
 		goto unlock_vm;
 	}
@@ -284,6 +286,7 @@ static bool get_pagefault(struct pf_queue *pf_queue, struct xe_gt_pagefault *pf)
 		pf->asid = FIELD_GET(PFD_ASID, desc->dw1);
 		pf->vfid = FIELD_GET(PFD_VFID, desc->dw2);
 		pf->access_type = FIELD_GET(PFD_ACCESS_TYPE, desc->dw2);
+		pf->address_type = 0;
 		pf->fault_type = FIELD_GET(PFD_FAULT_TYPE, desc->dw2);
 		pf->page_addr = (u64)(FIELD_GET(PFD_VIRTUAL_ADDR_HI, desc->dw3)) <<
 			PFD_VIRTUAL_ADDR_HI_SHIFT;
diff --git a/drivers/gpu/drm/xe/xe_gt_pagefault_types.h b/drivers/gpu/drm/xe/xe_gt_pagefault_types.h
index 90b7085d4b8e..68721973debb 100644
--- a/drivers/gpu/drm/xe/xe_gt_pagefault_types.h
+++ b/drivers/gpu/drm/xe/xe_gt_pagefault_types.h
@@ -24,6 +24,8 @@ struct xe_gt_pagefault {
 	 * from xe_gt_pagefault_access_type
 	 */
 	u8 access_type;
+	/** @address_type: Type of address access that resulted in fault */
+	u8 address_type;
 	/**
 	 * @fault_type: fault type of this pagefault, as a value
 	 * from xe_gt_pagefault_fault_type
-- 
2.43.0


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

* [PATCH v8 5/6] drm/xe/xe_vm: Add per VM fault info
  2025-03-13 18:34 [PATCH v8 0/6] drm/xe/xe_vm: Implement xe_vm_get_property_ioctl Jonathan Cavitt
                   ` (3 preceding siblings ...)
  2025-03-13 18:34 ` [PATCH v8 4/6] drm/xe/xe_gt_pagefault: Add address_type field to pagefaults Jonathan Cavitt
@ 2025-03-13 18:34 ` Jonathan Cavitt
  2025-03-13 18:34 ` [PATCH v8 6/6] drm/xe/xe_vm: Implement xe_vm_get_property_ioctl Jonathan Cavitt
                   ` (8 subsequent siblings)
  13 siblings, 0 replies; 27+ messages in thread
From: Jonathan Cavitt @ 2025-03-13 18:34 UTC (permalink / raw)
  To: intel-xe
  Cc: saurabhg.gupta, alex.zuo, jonathan.cavitt, joonas.lahtinen,
	matthew.brost, jianxun.zhang, shuicheng.lin, dri-devel,
	Michal.Wajdeczko, michal.mzorek

Add additional information to each VM so they can report up to the first
50 seen faults.  Only pagefaults are saved this way currently, though in
the future, all faults should be tracked by the VM for future reporting.

Additionally, of the pagefaults reported, only failed pagefaults are
saved this way, as successful pagefaults should recover silently and not
need to be reported to userspace.

v2:
- Free vm after use (Shuicheng)
- Compress pf copy logic (Shuicheng)
- Update fault_unsuccessful before storing (Shuicheng)
- Fix old struct name in comments (Shuicheng)
- Keep first 50 pagefaults instead of last 50 (Jianxun)

v3:
- Avoid unnecessary execution by checking MAX_PFS earlier (jcavitt)
- Fix double-locking error (jcavitt)
- Assert kmemdump is successful (Shuicheng)

v4:
- Rename xe_vm.pfs to xe_vm.faults (jcavitt)
- Store fault data and not pagefault in xe_vm faults list (jcavitt)
- Store address, address type, and address precision per fault (jcavitt)
- Store engine class and instance data per fault (Jianxun)
- Add and fix kernel docs (Michal W)
- Properly handle kzalloc error (Michal W)
- s/MAX_PFS/MAX_FAULTS_SAVED_PER_VM (Michal W)
- Store fault level per fault (Micahl M)

Signed-off-by: Jonathan Cavitt <jonathan.cavitt@intel.com>
Suggested-by: Matthew Brost <matthew.brost@intel.com>
Cc: Shuicheng Lin <shuicheng.lin@intel.com>
Cc: Jianxun Zhang <jianxun.zhang@intel.com>
Cc: Michal Wajdeczko <Michal.Wajdeczko@intel.com>
Cc: Michal Mzorek <michal.mzorek@intel.com>
---
 drivers/gpu/drm/xe/xe_gt_pagefault.c | 21 ++++++++++
 drivers/gpu/drm/xe/xe_vm.c           | 58 ++++++++++++++++++++++++++++
 drivers/gpu/drm/xe/xe_vm.h           |  9 +++++
 drivers/gpu/drm/xe/xe_vm_types.h     | 33 ++++++++++++++++
 4 files changed, 121 insertions(+)

diff --git a/drivers/gpu/drm/xe/xe_gt_pagefault.c b/drivers/gpu/drm/xe/xe_gt_pagefault.c
index e67ee7ac3df7..927b83f7a384 100644
--- a/drivers/gpu/drm/xe/xe_gt_pagefault.c
+++ b/drivers/gpu/drm/xe/xe_gt_pagefault.c
@@ -346,6 +346,26 @@ int xe_guc_pagefault_handler(struct xe_guc *guc, u32 *msg, u32 len)
 	return full ? -ENOSPC : 0;
 }
 
+static void save_pagefault_to_vm(struct xe_device *xe, struct xe_gt_pagefault *pf)
+{
+	struct xe_vm *vm;
+
+	vm = asid_to_vm(xe, pf->asid);
+	if (IS_ERR(vm))
+		return;
+
+	spin_lock(&vm->faults.lock);
+
+	/**
+	 * Limit the number of faults in the fault list to prevent memory overuse.
+	 */
+	if (vm->faults.len < MAX_FAULTS_SAVED_PER_VM)
+		xe_vm_add_fault_entry_pf(vm, pf);
+
+	spin_unlock(&vm->faults.lock);
+	xe_vm_put(vm);
+}
+
 #define USM_QUEUE_MAX_RUNTIME_MS	20
 
 static void pf_queue_work_func(struct work_struct *w)
@@ -365,6 +385,7 @@ static void pf_queue_work_func(struct work_struct *w)
 		if (unlikely(ret)) {
 			print_pagefault(xe, &pf);
 			pf.fault_unsuccessful = 1;
+			save_pagefault_to_vm(xe, &pf);
 			drm_dbg(&xe->drm, "Fault response: Unsuccessful %d\n", ret);
 		}
 
diff --git a/drivers/gpu/drm/xe/xe_vm.c b/drivers/gpu/drm/xe/xe_vm.c
index 60303998bd61..067a9cedcad9 100644
--- a/drivers/gpu/drm/xe/xe_vm.c
+++ b/drivers/gpu/drm/xe/xe_vm.c
@@ -778,6 +778,59 @@ int xe_vm_userptr_check_repin(struct xe_vm *vm)
 		list_empty_careful(&vm->userptr.invalidated)) ? 0 : -EAGAIN;
 }
 
+/**
+ * xe_vm_add_fault_entry_pf() - Add pagefault to vm fault list
+ * @vm: The VM.
+ * @pf: The pagefault.
+ *
+ * This function takes the data from the pagefault @pf and saves it to @vm->faults.list.
+ *
+ * The function exits silently if the list is full, and reports a warning if the pagefault
+ * could not be saved to the list.
+ */
+void xe_vm_add_fault_entry_pf(struct xe_vm *vm, struct xe_gt_pagefault *pf)
+{
+	struct xe_vm_fault_entry *e = NULL;
+
+	spin_lock(&vm->faults.lock);
+
+	if (vm->faults.len >= MAX_FAULTS_SAVED_PER_VM)
+		goto out;
+
+	e = kzalloc(sizeof(*e), GFP_KERNEL);
+	if (!e) {
+		drm_warn(&vm->xe->drm,
+			 "Could not allocate memory for fault %i!",
+			 vm->faults.len);
+		goto out;
+	}
+
+	e->address = pf->page_addr;
+	e->address_type = pf->address_type;
+	e->address_precision = 1;
+	e->fault_level = pf->fault_level;
+	e->engine_class = pf->engine_class;
+	e->engine_instance = pf->engine_instance;
+
+	list_add_tail(&e->list, &vm->faults.list);
+	vm->faults.len++;
+out:
+	spin_unlock(&vm->faults.lock);
+}
+
+static void xe_vm_clear_fault_entries(struct xe_vm *vm)
+{
+	struct xe_vm_fault_entry *e, *tmp;
+
+	spin_lock(&vm->faults.lock);
+	list_for_each_entry_safe(e, tmp, &vm->faults.list, list) {
+		list_del(&e->list);
+		kfree(e);
+	}
+	vm->faults.len = 0;
+	spin_unlock(&vm->faults.lock);
+}
+
 static int xe_vma_ops_alloc(struct xe_vma_ops *vops, bool array_of_binds)
 {
 	int i;
@@ -1660,6 +1713,9 @@ struct xe_vm *xe_vm_create(struct xe_device *xe, u32 flags)
 	init_rwsem(&vm->userptr.notifier_lock);
 	spin_lock_init(&vm->userptr.invalidated_lock);
 
+	INIT_LIST_HEAD(&vm->faults.list);
+	spin_lock_init(&vm->faults.lock);
+
 	ttm_lru_bulk_move_init(&vm->lru_bulk_move);
 
 	INIT_WORK(&vm->destroy_work, vm_destroy_work_func);
@@ -1930,6 +1986,8 @@ void xe_vm_close_and_put(struct xe_vm *vm)
 	}
 	up_write(&xe->usm.lock);
 
+	xe_vm_clear_fault_entries(vm);
+
 	for_each_tile(tile, xe, id)
 		xe_range_fence_tree_fini(&vm->rftree[id]);
 
diff --git a/drivers/gpu/drm/xe/xe_vm.h b/drivers/gpu/drm/xe/xe_vm.h
index 0ef811fc2bde..9bd7e93824da 100644
--- a/drivers/gpu/drm/xe/xe_vm.h
+++ b/drivers/gpu/drm/xe/xe_vm.h
@@ -12,6 +12,12 @@
 #include "xe_map.h"
 #include "xe_vm_types.h"
 
+/**
+ * MAX_FAULTS_SAVED_PER_VM - Maximum number of faults each vm can store before future
+ * faults are discarded to prevent memory overuse
+ */
+#define MAX_FAULTS_SAVED_PER_VM	50
+
 struct drm_device;
 struct drm_printer;
 struct drm_file;
@@ -22,6 +28,7 @@ struct dma_fence;
 
 struct xe_exec_queue;
 struct xe_file;
+struct xe_gt_pagefault;
 struct xe_sync_entry;
 struct xe_svm_range;
 struct drm_exec;
@@ -257,6 +264,8 @@ int xe_vma_userptr_pin_pages(struct xe_userptr_vma *uvma);
 
 int xe_vma_userptr_check_repin(struct xe_userptr_vma *uvma);
 
+void xe_vm_add_fault_entry_pf(struct xe_vm *vm, struct xe_gt_pagefault *pf);
+
 bool xe_vm_validate_should_retry(struct drm_exec *exec, int err, ktime_t *end);
 
 int xe_vm_lock_vma(struct drm_exec *exec, struct xe_vma *vma);
diff --git a/drivers/gpu/drm/xe/xe_vm_types.h b/drivers/gpu/drm/xe/xe_vm_types.h
index 84fa41b9fa20..da5beace981b 100644
--- a/drivers/gpu/drm/xe/xe_vm_types.h
+++ b/drivers/gpu/drm/xe/xe_vm_types.h
@@ -19,6 +19,7 @@
 #include "xe_range_fence.h"
 
 struct xe_bo;
+struct xe_pagefault;
 struct xe_svm_range;
 struct xe_sync_entry;
 struct xe_user_fence;
@@ -142,6 +143,26 @@ struct xe_userptr_vma {
 
 struct xe_device;
 
+/**
+ * struct xe_vm_fault_entry - Elements of vm->faults.list
+ * @list: link into @xe_vm.faults.list
+ * @address: address of the fault
+ * @address_type: type of address access that resulted in fault
+ * @address_precision: precision of faulted address
+ * @fault_level: fault level of the fault
+ * @engine_class: class of engine fault was reported on
+ * @engine_instance: instance of engine fault was reported on
+ */
+struct xe_vm_fault_entry {
+	struct list_head list;
+	u64 address;
+	u32 address_type;
+	u32 address_precision;
+	u8 fault_level;
+	u8 engine_class;
+	u8 engine_instance;
+};
+
 struct xe_vm {
 	/** @gpuvm: base GPUVM used to track VMAs */
 	struct drm_gpuvm gpuvm;
@@ -305,6 +326,18 @@ struct xe_vm {
 		bool capture_once;
 	} error_capture;
 
+	/**
+	 * @faults: List of all faults associated with this VM
+	 */
+	struct {
+		/** @faults.lock: lock protecting @faults.list */
+		spinlock_t lock;
+		/** @faults.list: list of xe_vm_fault_entry entries */
+		struct list_head list;
+		/** @faults.len: length of @faults.list */
+		unsigned int len;
+	} faults;
+
 	/**
 	 * @tlb_flush_seqno: Required TLB flush seqno for the next exec.
 	 * protected by the vm resv.
-- 
2.43.0


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

* [PATCH v8 6/6] drm/xe/xe_vm: Implement xe_vm_get_property_ioctl
  2025-03-13 18:34 [PATCH v8 0/6] drm/xe/xe_vm: Implement xe_vm_get_property_ioctl Jonathan Cavitt
                   ` (4 preceding siblings ...)
  2025-03-13 18:34 ` [PATCH v8 5/6] drm/xe/xe_vm: Add per VM fault info Jonathan Cavitt
@ 2025-03-13 18:34 ` Jonathan Cavitt
  2025-03-18 17:48   ` Jianxun Zhang
  2025-03-19 23:58   ` Jianxun Zhang
  2025-03-13 19:10 ` ✓ CI.Patch_applied: success for drm/xe/xe_vm: Implement xe_vm_get_property_ioctl (rev8) Patchwork
                   ` (7 subsequent siblings)
  13 siblings, 2 replies; 27+ messages in thread
From: Jonathan Cavitt @ 2025-03-13 18:34 UTC (permalink / raw)
  To: intel-xe
  Cc: saurabhg.gupta, alex.zuo, jonathan.cavitt, joonas.lahtinen,
	matthew.brost, jianxun.zhang, shuicheng.lin, dri-devel,
	Michal.Wajdeczko, michal.mzorek

Add support for userspace to request a list of observed faults
from a specified VM.

v2:
- Only allow querying of failed pagefaults (Matt Brost)

v3:
- Remove unnecessary size parameter from helper function, as it
  is a property of the arguments. (jcavitt)
- Remove unnecessary copy_from_user (Jainxun)
- Set address_precision to 1 (Jainxun)
- Report max size instead of dynamic size for memory allocation
  purposes.  Total memory usage is reported separately.

v4:
- Return int from xe_vm_get_property_size (Shuicheng)
- Fix memory leak (Shuicheng)
- Remove unnecessary size variable (jcavitt)

v5:
- Rename ioctl to xe_vm_get_faults_ioctl (jcavitt)
- Update fill_property_pfs to eliminate need for kzalloc (Jianxun)

v6:
- Repair and move fill_faults break condition (Dan Carpenter)
- Free vm after use (jcavitt)
- Combine assertions (jcavitt)
- Expand size check in xe_vm_get_faults_ioctl (jcavitt)
- Remove return mask from fill_faults, as return is already -EFAULT or 0
  (jcavitt)

v7:
- Revert back to using xe_vm_get_property_ioctl
- Apply better copy_to_user logic (jcavitt)

Signed-off-by: Jonathan Cavitt <jonathan.cavitt@intel.com>
Suggested-by: Matthew Brost <matthew.brost@intel.com>
Cc: Jainxun Zhang <jianxun.zhang@intel.com>
Cc: Shuicheng Lin <shuicheng.lin@intel.com>
---
 drivers/gpu/drm/xe/xe_device.c |   3 +
 drivers/gpu/drm/xe/xe_vm.c     | 134 +++++++++++++++++++++++++++++++++
 drivers/gpu/drm/xe/xe_vm.h     |   2 +
 3 files changed, 139 insertions(+)

diff --git a/drivers/gpu/drm/xe/xe_device.c b/drivers/gpu/drm/xe/xe_device.c
index b2f656b2a563..74e510cb0e47 100644
--- a/drivers/gpu/drm/xe/xe_device.c
+++ b/drivers/gpu/drm/xe/xe_device.c
@@ -194,6 +194,9 @@ static const struct drm_ioctl_desc xe_ioctls[] = {
 	DRM_IOCTL_DEF_DRV(XE_WAIT_USER_FENCE, xe_wait_user_fence_ioctl,
 			  DRM_RENDER_ALLOW),
 	DRM_IOCTL_DEF_DRV(XE_OBSERVATION, xe_observation_ioctl, DRM_RENDER_ALLOW),
+	DRM_IOCTL_DEF_DRV(XE_VM_GET_PROPERTY, xe_vm_get_property_ioctl,
+			  DRM_RENDER_ALLOW),
+
 };
 
 static long xe_drm_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
diff --git a/drivers/gpu/drm/xe/xe_vm.c b/drivers/gpu/drm/xe/xe_vm.c
index 067a9cedcad9..521f0032d9e2 100644
--- a/drivers/gpu/drm/xe/xe_vm.c
+++ b/drivers/gpu/drm/xe/xe_vm.c
@@ -42,6 +42,14 @@
 #include "xe_wa.h"
 #include "xe_hmm.h"
 
+static const u16 xe_to_user_engine_class[] = {
+	[XE_ENGINE_CLASS_RENDER] = DRM_XE_ENGINE_CLASS_RENDER,
+	[XE_ENGINE_CLASS_COPY] = DRM_XE_ENGINE_CLASS_COPY,
+	[XE_ENGINE_CLASS_VIDEO_DECODE] = DRM_XE_ENGINE_CLASS_VIDEO_DECODE,
+	[XE_ENGINE_CLASS_VIDEO_ENHANCE] = DRM_XE_ENGINE_CLASS_VIDEO_ENHANCE,
+	[XE_ENGINE_CLASS_COMPUTE] = DRM_XE_ENGINE_CLASS_COMPUTE,
+};
+
 static struct drm_gem_object *xe_vm_obj(struct xe_vm *vm)
 {
 	return vm->gpuvm.r_obj;
@@ -3551,6 +3559,132 @@ int xe_vm_bind_ioctl(struct drm_device *dev, void *data, struct drm_file *file)
 	return err;
 }
 
+static int xe_vm_get_property_size(struct xe_vm *vm, u32 property)
+{
+	int size = -EINVAL;
+
+	switch (property) {
+	case DRM_XE_VM_GET_PROPERTY_FAULTS:
+		spin_lock(&vm->faults.lock);
+		size = vm->faults.len * sizeof(struct xe_vm_fault);
+		spin_unlock(&vm->faults.lock);
+		break;
+	default:
+		break;
+	}
+	return size;
+}
+
+static int xe_vm_get_property_verify_size(struct xe_vm *vm, u32 property,
+					  int expected, int actual)
+{
+	switch (property) {
+	case DRM_XE_VM_GET_PROPERTY_FAULTS:
+		/*
+		 * Number of faults may increase between calls to
+		 * xe_vm_get_property_ioctl, so just report the
+		 * number of faults the user requests if it's less
+		 * than or equal to the number of faults in the VM
+		 * fault array.
+		 */
+		if (actual < expected)
+			return -EINVAL;
+		break;
+	default:
+		if (actual != expected)
+			return -EINVAL;
+		break;
+	}
+	return 0;
+}
+
+static int fill_faults(struct xe_vm *vm,
+		       struct drm_xe_vm_get_property *args)
+{
+	struct xe_vm_fault __user *usr_ptr = u64_to_user_ptr(args->data);
+	struct xe_vm_fault store = { 0 };
+	struct xe_vm_fault_entry *entry;
+	int ret = 0, i = 0, count;
+
+	count = args->size / sizeof(struct xe_vm_fault);
+
+	spin_lock(&vm->faults.lock);
+	list_for_each_entry(entry, &vm->faults.list, list) {
+		if (i++ == count)
+			break;
+
+		memset(&store, 0, sizeof(struct xe_vm_fault));
+
+		store.address = entry->address;
+		store.address_type = entry->address_type;
+		store.address_precision = entry->address_precision;
+		store.fault_level = entry->fault_level;
+		store.engine_class = xe_to_user_engine_class[entry->engine_class];
+		store.engine_instance = entry->engine_instance;
+
+		ret = copy_to_user(usr_ptr, &store, sizeof(struct xe_vm_fault));
+		if (ret)
+			break;
+
+		usr_ptr++;
+	}
+	spin_unlock(&vm->faults.lock);
+
+	return ret;
+}
+
+static int xe_vm_get_property_fill_data(struct xe_vm *vm,
+					struct drm_xe_vm_get_property *args)
+{
+	switch (args->property) {
+	case DRM_XE_VM_GET_PROPERTY_FAULTS:
+		return fill_faults(vm, args);
+	default:
+		break;
+	}
+	return -EINVAL;
+}
+
+int xe_vm_get_property_ioctl(struct drm_device *drm, void *data,
+			     struct drm_file *file)
+{
+	struct xe_device *xe = to_xe_device(drm);
+	struct xe_file *xef = to_xe_file(file);
+	struct drm_xe_vm_get_property *args = data;
+	struct xe_vm *vm;
+	int size, ret = 0;
+
+	if (XE_IOCTL_DBG(xe, args->reserved[0] || args->reserved[1]))
+		return -EINVAL;
+
+	vm = xe_vm_lookup(xef, args->vm_id);
+	if (XE_IOCTL_DBG(xe, !vm))
+		return -ENOENT;
+
+	size = xe_vm_get_property_size(vm, args->property);
+
+	if (size < 0) {
+		ret = size;
+		goto put_vm;
+	} else if (!args->size) {
+		args->size = size;
+		goto put_vm;
+	}
+
+	ret = xe_vm_get_property_verify_size(vm, args->property,
+					     args->size, size);
+	if (XE_IOCTL_DBG(xe, ret)) {
+		ret = -EINVAL;
+		goto put_vm;
+	}
+
+	ret = xe_vm_get_property_fill_data(vm, args);
+
+put_vm:
+	xe_vm_put(vm);
+	return ret;
+}
+
 /**
  * xe_vm_bind_kernel_bo - bind a kernel BO to a VM
  * @vm: VM to bind the BO to
diff --git a/drivers/gpu/drm/xe/xe_vm.h b/drivers/gpu/drm/xe/xe_vm.h
index 9bd7e93824da..63ec22458e04 100644
--- a/drivers/gpu/drm/xe/xe_vm.h
+++ b/drivers/gpu/drm/xe/xe_vm.h
@@ -196,6 +196,8 @@ int xe_vm_destroy_ioctl(struct drm_device *dev, void *data,
 			struct drm_file *file);
 int xe_vm_bind_ioctl(struct drm_device *dev, void *data,
 		     struct drm_file *file);
+int xe_vm_get_property_ioctl(struct drm_device *dev, void *data,
+			     struct drm_file *file);
 
 void xe_vm_close_and_put(struct xe_vm *vm);
 
-- 
2.43.0


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

* ✓ CI.Patch_applied: success for drm/xe/xe_vm: Implement xe_vm_get_property_ioctl (rev8)
  2025-03-13 18:34 [PATCH v8 0/6] drm/xe/xe_vm: Implement xe_vm_get_property_ioctl Jonathan Cavitt
                   ` (5 preceding siblings ...)
  2025-03-13 18:34 ` [PATCH v8 6/6] drm/xe/xe_vm: Implement xe_vm_get_property_ioctl Jonathan Cavitt
@ 2025-03-13 19:10 ` Patchwork
  2025-03-13 19:10 ` ✗ CI.checkpatch: warning " Patchwork
                   ` (6 subsequent siblings)
  13 siblings, 0 replies; 27+ messages in thread
From: Patchwork @ 2025-03-13 19:10 UTC (permalink / raw)
  To: Jonathan Cavitt; +Cc: intel-xe

== Series Details ==

Series: drm/xe/xe_vm: Implement xe_vm_get_property_ioctl (rev8)
URL   : https://patchwork.freedesktop.org/series/145529/
State : success

== Summary ==

=== Applying kernel patches on branch 'drm-tip' with base: ===
Base commit: 7e32e5705a5c drm-tip: 2025y-03m-13d-18h-35m-15s UTC integration manifest
=== git am output follows ===
Applying: drm/xe/xe_gt_pagefault: Disallow writes to read-only VMAs
Applying: drm/xe/xe_gt_pagefault: Move pagefault struct to header
Applying: drm/xe/uapi: Define drm_xe_vm_get_property
Applying: drm/xe/xe_gt_pagefault: Add address_type field to pagefaults
Applying: drm/xe/xe_vm: Add per VM fault info
Applying: drm/xe/xe_vm: Implement xe_vm_get_property_ioctl



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

* ✗ CI.checkpatch: warning for drm/xe/xe_vm: Implement xe_vm_get_property_ioctl (rev8)
  2025-03-13 18:34 [PATCH v8 0/6] drm/xe/xe_vm: Implement xe_vm_get_property_ioctl Jonathan Cavitt
                   ` (6 preceding siblings ...)
  2025-03-13 19:10 ` ✓ CI.Patch_applied: success for drm/xe/xe_vm: Implement xe_vm_get_property_ioctl (rev8) Patchwork
@ 2025-03-13 19:10 ` Patchwork
  2025-03-13 19:12 ` ✓ CI.KUnit: success " Patchwork
                   ` (5 subsequent siblings)
  13 siblings, 0 replies; 27+ messages in thread
From: Patchwork @ 2025-03-13 19:10 UTC (permalink / raw)
  To: Jonathan Cavitt; +Cc: intel-xe

== Series Details ==

Series: drm/xe/xe_vm: Implement xe_vm_get_property_ioctl (rev8)
URL   : https://patchwork.freedesktop.org/series/145529/
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
cbb4e4a079d89106c2736adc3c7de6f9dc56da07
+ cd /kernel
+ git config --global --add safe.directory /kernel
+ git log -n1
commit 85849c545e4a385517f2c0b89d6205f966a11c08
Author: Jonathan Cavitt <jonathan.cavitt@intel.com>
Date:   Thu Mar 13 18:34:08 2025 +0000

    drm/xe/xe_vm: Implement xe_vm_get_property_ioctl
    
    Add support for userspace to request a list of observed faults
    from a specified VM.
    
    v2:
    - Only allow querying of failed pagefaults (Matt Brost)
    
    v3:
    - Remove unnecessary size parameter from helper function, as it
      is a property of the arguments. (jcavitt)
    - Remove unnecessary copy_from_user (Jainxun)
    - Set address_precision to 1 (Jainxun)
    - Report max size instead of dynamic size for memory allocation
      purposes.  Total memory usage is reported separately.
    
    v4:
    - Return int from xe_vm_get_property_size (Shuicheng)
    - Fix memory leak (Shuicheng)
    - Remove unnecessary size variable (jcavitt)
    
    v5:
    - Rename ioctl to xe_vm_get_faults_ioctl (jcavitt)
    - Update fill_property_pfs to eliminate need for kzalloc (Jianxun)
    
    v6:
    - Repair and move fill_faults break condition (Dan Carpenter)
    - Free vm after use (jcavitt)
    - Combine assertions (jcavitt)
    - Expand size check in xe_vm_get_faults_ioctl (jcavitt)
    - Remove return mask from fill_faults, as return is already -EFAULT or 0
      (jcavitt)
    
    v7:
    - Revert back to using xe_vm_get_property_ioctl
    - Apply better copy_to_user logic (jcavitt)
    
    Signed-off-by: Jonathan Cavitt <jonathan.cavitt@intel.com>
    Suggested-by: Matthew Brost <matthew.brost@intel.com>
    Cc: Jainxun Zhang <jianxun.zhang@intel.com>
    Cc: Shuicheng Lin <shuicheng.lin@intel.com>
+ /mt/dim checkpatch 7e32e5705a5c8398e606a23eeba751a059a0b970 drm-intel
7fa3f43e6cae drm/xe/xe_gt_pagefault: Disallow writes to read-only VMAs
b2498cc99f73 drm/xe/xe_gt_pagefault: Move pagefault struct to header
-:130: WARNING:FILE_PATH_CHANGES: added, moved or deleted file(s), does MAINTAINERS need updating?
#130: 
new file mode 100644

total: 0 errors, 1 warnings, 0 checks, 159 lines checked
7abb24ba8c75 drm/xe/uapi: Define drm_xe_vm_get_property
-:34: WARNING:LONG_LINE: line length of 122 exceeds 100 columns
#34: FILE: include/uapi/drm/xe_drm.h:122:
+#define DRM_IOCTL_XE_VM_GET_PROPERTY	DRM_IOWR(DRM_COMMAND_BASE + DRM_XE_VM_GET_PROPERTY, struct drm_xe_vm_get_property)

total: 0 errors, 1 warnings, 0 checks, 93 lines checked
aaa56250f6cc drm/xe/xe_gt_pagefault: Add address_type field to pagefaults
805bf0961876 drm/xe/xe_vm: Add per VM fault info
-:111: WARNING:OOM_MESSAGE: Possible unnecessary 'out of memory' message
#111: FILE: drivers/gpu/drm/xe/xe_vm.c:802:
+	if (!e) {
+		drm_warn(&vm->xe->drm,

total: 0 errors, 1 warnings, 0 checks, 187 lines checked
85849c545e4a drm/xe/xe_vm: Implement xe_vm_get_property_ioctl



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

* ✓ CI.KUnit: success for drm/xe/xe_vm: Implement xe_vm_get_property_ioctl (rev8)
  2025-03-13 18:34 [PATCH v8 0/6] drm/xe/xe_vm: Implement xe_vm_get_property_ioctl Jonathan Cavitt
                   ` (7 preceding siblings ...)
  2025-03-13 19:10 ` ✗ CI.checkpatch: warning " Patchwork
@ 2025-03-13 19:12 ` Patchwork
  2025-03-13 19:24 ` ✗ CI.Build: failure " Patchwork
                   ` (4 subsequent siblings)
  13 siblings, 0 replies; 27+ messages in thread
From: Patchwork @ 2025-03-13 19:12 UTC (permalink / raw)
  To: Jonathan Cavitt; +Cc: intel-xe

== Series Details ==

Series: drm/xe/xe_vm: Implement xe_vm_get_property_ioctl (rev8)
URL   : https://patchwork.freedesktop.org/series/145529/
State : success

== Summary ==

+ trap cleanup EXIT
+ /kernel/tools/testing/kunit/kunit.py run --kunitconfig /kernel/drivers/gpu/drm/xe/.kunitconfig
[19:10:47] Configuring KUnit Kernel ...
Generating .config ...
Populating config with:
$ make ARCH=um O=.kunit olddefconfig
[19:10:51] Building KUnit Kernel ...
Populating config with:
$ make ARCH=um O=.kunit olddefconfig
Building with:
$ make all compile_commands.json ARCH=um O=.kunit --jobs=48
../lib/iomap.c:156:5: warning: no previous prototype for ‘ioread64_lo_hi’ [-Wmissing-prototypes]
  156 | u64 ioread64_lo_hi(const void __iomem *addr)
      |     ^~~~~~~~~~~~~~
../lib/iomap.c:163:5: warning: no previous prototype for ‘ioread64_hi_lo’ [-Wmissing-prototypes]
  163 | u64 ioread64_hi_lo(const void __iomem *addr)
      |     ^~~~~~~~~~~~~~
../lib/iomap.c:170:5: warning: no previous prototype for ‘ioread64be_lo_hi’ [-Wmissing-prototypes]
  170 | u64 ioread64be_lo_hi(const void __iomem *addr)
      |     ^~~~~~~~~~~~~~~~
../lib/iomap.c:178:5: warning: no previous prototype for ‘ioread64be_hi_lo’ [-Wmissing-prototypes]
  178 | u64 ioread64be_hi_lo(const void __iomem *addr)
      |     ^~~~~~~~~~~~~~~~
../lib/iomap.c:264:6: warning: no previous prototype for ‘iowrite64_lo_hi’ [-Wmissing-prototypes]
  264 | void iowrite64_lo_hi(u64 val, void __iomem *addr)
      |      ^~~~~~~~~~~~~~~
../lib/iomap.c:272:6: warning: no previous prototype for ‘iowrite64_hi_lo’ [-Wmissing-prototypes]
  272 | void iowrite64_hi_lo(u64 val, void __iomem *addr)
      |      ^~~~~~~~~~~~~~~
../lib/iomap.c:280:6: warning: no previous prototype for ‘iowrite64be_lo_hi’ [-Wmissing-prototypes]
  280 | void iowrite64be_lo_hi(u64 val, void __iomem *addr)
      |      ^~~~~~~~~~~~~~~~~
../lib/iomap.c:288:6: warning: no previous prototype for ‘iowrite64be_hi_lo’ [-Wmissing-prototypes]
  288 | void iowrite64be_hi_lo(u64 val, void __iomem *addr)
      |      ^~~~~~~~~~~~~~~~~

[19:11:31] Starting KUnit Kernel (1/1)...
[19:11:31] ============================================================
Running tests with:
$ .kunit/linux kunit.enable=1 mem=1G console=tty kunit_shutdown=halt
[19:11:31] ================== guc_buf (11 subtests) ===================
[19:11:31] [PASSED] test_smallest
[19:11:31] [PASSED] test_largest
[19:11:31] [PASSED] test_granular
[19:11:31] [PASSED] test_unique
[19:11:31] [PASSED] test_overlap
[19:11:31] [PASSED] test_reusable
[19:11:31] [PASSED] test_too_big
[19:11:31] [PASSED] test_flush
[19:11:31] [PASSED] test_lookup
[19:11:31] [PASSED] test_data
[19:11:31] [PASSED] test_class
[19:11:31] ===================== [PASSED] guc_buf =====================
[19:11:31] =================== guc_dbm (7 subtests) ===================
[19:11:31] [PASSED] test_empty
[19:11:31] [PASSED] test_default
[19:11:31] ======================== test_size  ========================
[19:11:31] [PASSED] 4
[19:11:31] [PASSED] 8
[19:11:31] [PASSED] 32
[19:11:31] [PASSED] 256
[19:11:31] ==================== [PASSED] test_size ====================
[19:11:31] ======================= test_reuse  ========================
[19:11:31] [PASSED] 4
[19:11:31] [PASSED] 8
[19:11:31] [PASSED] 32
[19:11:31] [PASSED] 256
[19:11:31] =================== [PASSED] test_reuse ====================
[19:11:31] =================== test_range_overlap  ====================
[19:11:31] [PASSED] 4
[19:11:31] [PASSED] 8
[19:11:31] [PASSED] 32
[19:11:31] [PASSED] 256
[19:11:31] =============== [PASSED] test_range_overlap ================
[19:11:31] =================== test_range_compact  ====================
[19:11:31] [PASSED] 4
[19:11:31] [PASSED] 8
[19:11:31] [PASSED] 32
[19:11:31] [PASSED] 256
[19:11:31] =============== [PASSED] test_range_compact ================
[19:11:31] ==================== test_range_spare  =====================
[19:11:31] [PASSED] 4
[19:11:31] [PASSED] 8
[19:11:31] [PASSED] 32
[19:11:31] [PASSED] 256
[19:11:31] ================ [PASSED] test_range_spare =================
[19:11:31] ===================== [PASSED] guc_dbm =====================
[19:11:31] =================== guc_idm (6 subtests) ===================
[19:11:31] [PASSED] bad_init
[19:11:31] [PASSED] no_init
[19:11:31] [PASSED] init_fini
[19:11:31] [PASSED] check_used
[19:11:31] [PASSED] check_quota
[19:11:31] [PASSED] check_all
[19:11:31] ===================== [PASSED] guc_idm =====================
[19:11:31] ================== no_relay (3 subtests) ===================
[19:11:31] [PASSED] xe_drops_guc2pf_if_not_ready
[19:11:31] [PASSED] xe_drops_guc2vf_if_not_ready
[19:11:31] [PASSED] xe_rejects_send_if_not_ready
[19:11:31] ==================== [PASSED] no_relay =====================
[19:11:31] ================== pf_relay (14 subtests) ==================
[19:11:31] [PASSED] pf_rejects_guc2pf_too_short
[19:11:31] [PASSED] pf_rejects_guc2pf_too_long
[19:11:31] [PASSED] pf_rejects_guc2pf_no_payload
[19:11:31] [PASSED] pf_fails_no_payload
[19:11:31] [PASSED] pf_fails_bad_origin
[19:11:31] [PASSED] pf_fails_bad_type
[19:11:31] [PASSED] pf_txn_reports_error
[19:11:31] [PASSED] pf_txn_sends_pf2guc
[19:11:31] [PASSED] pf_sends_pf2guc
[19:11:31] [SKIPPED] pf_loopback_nop
[19:11:31] [SKIPPED] pf_loopback_echo
[19:11:31] [SKIPPED] pf_loopback_fail
[19:11:31] [SKIPPED] pf_loopback_busy
[19:11:31] [SKIPPED] pf_loopback_retry
[19:11:31] ==================== [PASSED] pf_relay =====================
[19:11:31] ================== vf_relay (3 subtests) ===================
[19:11:31] [PASSED] vf_rejects_guc2vf_too_short
[19:11:31] [PASSED] vf_rejects_guc2vf_too_long
[19:11:31] [PASSED] vf_rejects_guc2vf_no_payload
[19:11:31] ==================== [PASSED] vf_relay =====================
[19:11:31] ================= pf_service (11 subtests) =================
[19:11:31] [PASSED] pf_negotiate_any
[19:11:31] [PASSED] pf_negotiate_base_match
[19:11:31] [PASSED] pf_negotiate_base_newer
[19:11:31] [PASSED] pf_negotiate_base_next
[19:11:31] [SKIPPED] pf_negotiate_base_older
[19:11:31] [PASSED] pf_negotiate_base_prev
[19:11:31] [PASSED] pf_negotiate_latest_match
[19:11:31] [PASSED] pf_negotiate_latest_newer
[19:11:31] [PASSED] pf_negotiate_latest_next
[19:11:31] [SKIPPED] pf_negotiate_latest_older
[19:11:31] [SKIPPED] pf_negotiate_latest_prev
[19:11:31] =================== [PASSED] pf_service ====================
[19:11:31] ===================== lmtt (1 subtest) =====================
[19:11:31] ======================== test_ops  =========================
[19:11:31] [PASSED] 2-level
[19:11:31] [PASSED] multi-level
[19:11:31] ==================== [PASSED] test_ops =====================
[19:11:31] ====================== [PASSED] lmtt =======================
[19:11:31] =================== xe_mocs (2 subtests) ===================
[19:11:31] ================ xe_live_mocs_kernel_kunit  ================
[19:11:31] =========== [SKIPPED] xe_live_mocs_kernel_kunit ============
[19:11:31] ================ xe_live_mocs_reset_kunit  =================
[19:11:31] ============ [SKIPPED] xe_live_mocs_reset_kunit ============
[19:11:31] ==================== [SKIPPED] xe_mocs =====================
[19:11:31] ================= xe_migrate (2 subtests) ==================
[19:11:31] ================= xe_migrate_sanity_kunit  =================
[19:11:31] ============ [SKIPPED] xe_migrate_sanity_kunit =============
[19:11:31] ================== xe_validate_ccs_kunit  ==================
[19:11:31] ============= [SKIPPED] xe_validate_ccs_kunit ==============
[19:11:31] =================== [SKIPPED] xe_migrate ===================
[19:11:31] ================== xe_dma_buf (1 subtest) ==================
[19:11:31] ==================== xe_dma_buf_kunit  =====================
[19:11:31] ================ [SKIPPED] xe_dma_buf_kunit ================
[19:11:31] =================== [SKIPPED] xe_dma_buf ===================
[19:11:31] ================= xe_bo_shrink (1 subtest) =================
[19:11:31] =================== xe_bo_shrink_kunit  ====================
[19:11:31] =============== [SKIPPED] xe_bo_shrink_kunit ===============
[19:11:31] ================== [SKIPPED] xe_bo_shrink ==================
[19:11:31] ==================== xe_bo (2 subtests) ====================
[19:11:31] ================== xe_ccs_migrate_kunit  ===================
[19:11:31] ============== [SKIPPED] xe_ccs_migrate_kunit ==============
stty: 'standard input': Inappropriate ioctl for device
[19:11:31] ==================== xe_bo_evict_kunit  ====================
[19:11:31] =============== [SKIPPED] xe_bo_evict_kunit ================
[19:11:31] ===================== [SKIPPED] xe_bo ======================
[19:11:31] ==================== args (11 subtests) ====================
[19:11:31] [PASSED] count_args_test
[19:11:31] [PASSED] call_args_example
[19:11:31] [PASSED] call_args_test
[19:11:31] [PASSED] drop_first_arg_example
[19:11:31] [PASSED] drop_first_arg_test
[19:11:31] [PASSED] first_arg_example
[19:11:31] [PASSED] first_arg_test
[19:11:31] [PASSED] last_arg_example
[19:11:31] [PASSED] last_arg_test
[19:11:31] [PASSED] pick_arg_example
[19:11:31] [PASSED] sep_comma_example
[19:11:31] ====================== [PASSED] args =======================
[19:11:31] =================== xe_pci (2 subtests) ====================
[19:11:31] [PASSED] xe_gmdid_graphics_ip
[19:11:31] [PASSED] xe_gmdid_media_ip
[19:11:31] ===================== [PASSED] xe_pci ======================
[19:11:31] =================== xe_rtp (2 subtests) ====================
[19:11:31] =============== xe_rtp_process_to_sr_tests  ================
[19:11:31] [PASSED] coalesce-same-reg
[19:11:31] [PASSED] no-match-no-add
[19:11:31] [PASSED] match-or
[19:11:31] [PASSED] match-or-xfail
[19:11:31] [PASSED] no-match-no-add-multiple-rules
[19:11:31] [PASSED] two-regs-two-entries
[19:11:31] [PASSED] clr-one-set-other
[19:11:31] [PASSED] set-field
[19:11:31] [PASSED] conflict-duplicate
[19:11:31] [PASSED] conflict-not-disjoint
[19:11:31] [PASSED] conflict-reg-type
[19:11:31] =========== [PASSED] xe_rtp_process_to_sr_tests ============
[19:11:31] ================== xe_rtp_process_tests  ===================
[19:11:31] [PASSED] active1
[19:11:31] [PASSED] active2
[19:11:31] [PASSED] active-inactive
[19:11:31] [PASSED] inactive-active
[19:11:31] [PASSED] inactive-1st_or_active-inactive
[19:11:31] [PASSED] inactive-2nd_or_active-inactive
[19:11:31] [PASSED] inactive-last_or_active-inactive
[19:11:31] [PASSED] inactive-no_or_active-inactive
[19:11:31] ============== [PASSED] xe_rtp_process_tests ===============
[19:11:31] ===================== [PASSED] xe_rtp ======================
[19:11:31] ==================== xe_wa (1 subtest) =====================
[19:11:31] ======================== xe_wa_gt  =========================
[19:11:31] [PASSED] TIGERLAKE (B0)
[19:11:31] [PASSED] DG1 (A0)
[19:11:31] [PASSED] DG1 (B0)
[19:11:31] [PASSED] ALDERLAKE_S (A0)
[19:11:31] [PASSED] ALDERLAKE_S (B0)
[19:11:31] [PASSED] ALDERLAKE_S (C0)
[19:11:31] [PASSED] ALDERLAKE_S (D0)
[19:11:31] [PASSED] ALDERLAKE_P (A0)
[19:11:31] [PASSED] ALDERLAKE_P (B0)
[19:11:31] [PASSED] ALDERLAKE_P (C0)
[19:11:31] [PASSED] ALDERLAKE_S_RPLS (D0)
[19:11:31] [PASSED] ALDERLAKE_P_RPLU (E0)
[19:11:31] [PASSED] DG2_G10 (C0)
[19:11:31] [PASSED] DG2_G11 (B1)
[19:11:31] [PASSED] DG2_G12 (A1)
[19:11:31] [PASSED] METEORLAKE (g:A0, m:A0)
[19:11:31] [PASSED] METEORLAKE (g:A0, m:A0)
[19:11:31] [PASSED] METEORLAKE (g:A0, m:A0)
[19:11:31] [PASSED] LUNARLAKE (g:A0, m:A0)
[19:11:31] [PASSED] LUNARLAKE (g:B0, m:A0)
[19:11:31] [PASSED] BATTLEMAGE (g:A0, m:A1)
[19:11:31] ==================== [PASSED] xe_wa_gt =====================
[19:11:31] ====================== [PASSED] xe_wa ======================
[19:11:31] ============================================================
[19:11:31] Testing complete. Ran 133 tests: passed: 117, skipped: 16
[19:11:31] Elapsed time: 44.171s total, 4.687s configuring, 39.217s building, 0.256s running

+ /kernel/tools/testing/kunit/kunit.py run --kunitconfig /kernel/drivers/gpu/drm/tests/.kunitconfig
[19:11:31] Configuring KUnit Kernel ...
Regenerating .config ...
Populating config with:
$ make ARCH=um O=.kunit olddefconfig
[19:11:33] Building KUnit Kernel ...
Populating config with:
$ make ARCH=um O=.kunit olddefconfig
Building with:
$ make all compile_commands.json ARCH=um O=.kunit --jobs=48
../lib/iomap.c:156:5: warning: no previous prototype for ‘ioread64_lo_hi’ [-Wmissing-prototypes]
  156 | u64 ioread64_lo_hi(const void __iomem *addr)
      |     ^~~~~~~~~~~~~~
../lib/iomap.c:163:5: warning: no previous prototype for ‘ioread64_hi_lo’ [-Wmissing-prototypes]
  163 | u64 ioread64_hi_lo(const void __iomem *addr)
      |     ^~~~~~~~~~~~~~
../lib/iomap.c:170:5: warning: no previous prototype for ‘ioread64be_lo_hi’ [-Wmissing-prototypes]
  170 | u64 ioread64be_lo_hi(const void __iomem *addr)
      |     ^~~~~~~~~~~~~~~~
../lib/iomap.c:178:5: warning: no previous prototype for ‘ioread64be_hi_lo’ [-Wmissing-prototypes]
  178 | u64 ioread64be_hi_lo(const void __iomem *addr)
      |     ^~~~~~~~~~~~~~~~
../lib/iomap.c:264:6: warning: no previous prototype for ‘iowrite64_lo_hi’ [-Wmissing-prototypes]
  264 | void iowrite64_lo_hi(u64 val, void __iomem *addr)
      |      ^~~~~~~~~~~~~~~
../lib/iomap.c:272:6: warning: no previous prototype for ‘iowrite64_hi_lo’ [-Wmissing-prototypes]
  272 | void iowrite64_hi_lo(u64 val, void __iomem *addr)
      |      ^~~~~~~~~~~~~~~
../lib/iomap.c:280:6: warning: no previous prototype for ‘iowrite64be_lo_hi’ [-Wmissing-prototypes]
  280 | void iowrite64be_lo_hi(u64 val, void __iomem *addr)
      |      ^~~~~~~~~~~~~~~~~
../lib/iomap.c:288:6: warning: no previous prototype for ‘iowrite64be_hi_lo’ [-Wmissing-prototypes]
  288 | void iowrite64be_hi_lo(u64 val, void __iomem *addr)
      |      ^~~~~~~~~~~~~~~~~

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

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

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



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

* ✗ CI.Build: failure for drm/xe/xe_vm: Implement xe_vm_get_property_ioctl (rev8)
  2025-03-13 18:34 [PATCH v8 0/6] drm/xe/xe_vm: Implement xe_vm_get_property_ioctl Jonathan Cavitt
                   ` (8 preceding siblings ...)
  2025-03-13 19:12 ` ✓ CI.KUnit: success " Patchwork
@ 2025-03-13 19:24 ` Patchwork
  2025-03-13 21:26   ` Cavitt, Jonathan
  2025-03-13 22:12 ` ✓ CI.Patch_applied: success for drm/xe/xe_vm: Implement xe_vm_get_property_ioctl (rev9) Patchwork
                   ` (3 subsequent siblings)
  13 siblings, 1 reply; 27+ messages in thread
From: Patchwork @ 2025-03-13 19:24 UTC (permalink / raw)
  To: Jonathan Cavitt; +Cc: intel-xe

== Series Details ==

Series: drm/xe/xe_vm: Implement xe_vm_get_property_ioctl (rev8)
URL   : https://patchwork.freedesktop.org/series/145529/
State : failure

== Summary ==

CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/dml2/dml21/src/dml2_top/dml2_top_interfaces.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/dml2/dml21/src/dml2_top/dml2_top_soc15.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/dml2/dml21/src/inc/dml2_debug.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/dml2/dml21/src/dml2_core/dml2_core_dcn4.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/dml2/dml21/src/dml2_core/dml2_core_factory.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/dml2/dml21/src/dml2_core/dml2_core_dcn4_calcs.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/dml2/dml21/src/dml2_dpmm/dml2_dpmm_dcn4.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/dml2/dml21/src/dml2_dpmm/dml2_dpmm_factory.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/dml2/dml21/src/dml2_mcg/dml2_mcg_dcn4.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/dml2/dml21/src/dml2_mcg/dml2_mcg_factory.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/dml2/dml21/src/dml2_pmo/dml2_pmo_dcn3.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/dml2/dml21/src/dml2_pmo/dml2_pmo_factory.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/dml2/dml21/src/dml2_pmo/dml2_pmo_dcn4_fams2.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/dml2/dml21/src/dml2_standalone_libraries/lib_float_math.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/dml2/dml21/dml21_translation_helper.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/dml2/dml21/dml21_wrapper.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/dml2/dml21/dml21_utils.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/dce120/dce120_timing_generator.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/dce112/dce112_compressor.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/dce110/dce110_timing_generator.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/dce110/dce110_compressor.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/dce110/dce110_opp_regamma_v.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/dce110/dce110_opp_csc_v.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/dce110/dce110_timing_generator_v.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/dce110/dce110_mem_input_v.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/dce110/dce110_opp_v.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/dce110/dce110_transform_v.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/dce80/dce80_timing_generator.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/dce60/dce60_timing_generator.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/dce60/dce60_hw_sequencer.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/dce60/dce60_resource.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/hdcp/hdcp_msg.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/sspl/dc_spl.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/sspl/dc_spl_scl_filters.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/sspl/dc_spl_scl_easf_filters.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/sspl/dc_spl_isharp_filters.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/sspl/dc_spl_filters.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/sspl/spl_fixpt31_32.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/sspl/spl_custom_float.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/core/dc.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/core/dc_stat.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/core/dc_resource.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/core/dc_hw_sequencer.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/core/dc_sink.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/core/dc_surface.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/core/dc_debug.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/core/dc_stream.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/core/dc_link_enc_cfg.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/core/dc_link_exports.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/core/dc_state.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/core/dc_vm_helper.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/dc_helper.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/dc_dmub_srv.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/dc_edid_parser.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/dc_spl_translate.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/modules/freesync/freesync.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/modules/color/color_gamma.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/modules/color/color_table.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/modules/info_packet/info_packet.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/modules/power/power_helpers.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dmub/src/dmub_srv.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dmub/src/dmub_srv_stat.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dmub/src/dmub_reg.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dmub/src/dmub_dcn20.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dmub/src/dmub_dcn21.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dmub/src/dmub_dcn30.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dmub/src/dmub_dcn301.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dmub/src/dmub_dcn302.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dmub/src/dmub_dcn303.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dmub/src/dmub_dcn31.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dmub/src/dmub_dcn314.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dmub/src/dmub_dcn315.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dmub/src/dmub_dcn316.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dmub/src/dmub_dcn32.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dmub/src/dmub_dcn35.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dmub/src/dmub_dcn351.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dmub/src/dmub_dcn36.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dmub/src/dmub_dcn401.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/modules/hdcp/hdcp_ddc.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/modules/hdcp/hdcp_log.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/modules/hdcp/hdcp_psp.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/modules/hdcp/hdcp.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/modules/hdcp/hdcp1_execution.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/modules/hdcp/hdcp1_transition.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/modules/hdcp/hdcp2_execution.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/modules/hdcp/hdcp2_transition.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/amdgpu_isp.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/isp_v4_1_0.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/isp_v4_1_1.o
  LD [M]  drivers/gpu/drm/amd/amdgpu/amdgpu.o
make[5]: *** [../scripts/Makefile.build:465: drivers/gpu/drm] Error 2
make[4]: *** [../scripts/Makefile.build:465: drivers/gpu] Error 2
make[3]: *** [../scripts/Makefile.build:465: drivers] Error 2
make[2]: *** [/kernel/Makefile:1994: .] Error 2
make[1]: *** [/kernel/Makefile:251: __sub-make] Error 2
make[1]: Leaving directory '/kernel/build64-default'
make: *** [Makefile:251: __sub-make] Error 2
+ cleanup
++ stat -c %u:%g /kernel
+ chown -R 1003:1003 /kernel



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

* RE: ✗ CI.Build: failure for drm/xe/xe_vm: Implement xe_vm_get_property_ioctl (rev8)
  2025-03-13 19:24 ` ✗ CI.Build: failure " Patchwork
@ 2025-03-13 21:26   ` Cavitt, Jonathan
  0 siblings, 0 replies; 27+ messages in thread
From: Cavitt, Jonathan @ 2025-03-13 21:26 UTC (permalink / raw)
  To: intel-xe@lists.freedesktop.org

-----Original Message-----
From: Patchwork <patchwork@emeril.freedesktop.org> 
Sent: Thursday, March 13, 2025 12:25 PM
To: Cavitt, Jonathan <jonathan.cavitt@intel.com>
Cc: intel-xe@lists.freedesktop.org
Subject: ✗ CI.Build: failure for drm/xe/xe_vm: Implement xe_vm_get_property_ioctl (rev8)
> 
> == Series Details ==
> 
> Series: drm/xe/xe_vm: Implement xe_vm_get_property_ioctl (rev8)
> URL   : https://patchwork.freedesktop.org/series/145529/
> State : failure
> 
> == Summary ==
> 
> CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/dml2/dml21/src/dml2_top/dml2_top_interfaces.o
>   CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/dml2/dml21/src/dml2_top/dml2_top_soc15.o
>   CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/dml2/dml21/src/inc/dml2_debug.o
>   CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/dml2/dml21/src/dml2_core/dml2_core_dcn4.o
>   CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/dml2/dml21/src/dml2_core/dml2_core_factory.o
>   CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/dml2/dml21/src/dml2_core/dml2_core_dcn4_calcs.o
>   CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/dml2/dml21/src/dml2_dpmm/dml2_dpmm_dcn4.o
>   CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/dml2/dml21/src/dml2_dpmm/dml2_dpmm_factory.o
>   CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/dml2/dml21/src/dml2_mcg/dml2_mcg_dcn4.o
>   CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/dml2/dml21/src/dml2_mcg/dml2_mcg_factory.o
>   CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/dml2/dml21/src/dml2_pmo/dml2_pmo_dcn3.o
>   CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/dml2/dml21/src/dml2_pmo/dml2_pmo_factory.o
>   CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/dml2/dml21/src/dml2_pmo/dml2_pmo_dcn4_fams2.o
>   CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/dml2/dml21/src/dml2_standalone_libraries/lib_float_math.o
>   CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/dml2/dml21/dml21_translation_helper.o
>   CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/dml2/dml21/dml21_wrapper.o
>   CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/dml2/dml21/dml21_utils.o
>   CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/dce120/dce120_timing_generator.o
>   CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/dce112/dce112_compressor.o
>   CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/dce110/dce110_timing_generator.o
>   CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/dce110/dce110_compressor.o
>   CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/dce110/dce110_opp_regamma_v.o
>   CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/dce110/dce110_opp_csc_v.o
>   CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/dce110/dce110_timing_generator_v.o
>   CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/dce110/dce110_mem_input_v.o
>   CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/dce110/dce110_opp_v.o
>   CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/dce110/dce110_transform_v.o
>   CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/dce80/dce80_timing_generator.o
>   CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/dce60/dce60_timing_generator.o
>   CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/dce60/dce60_hw_sequencer.o
>   CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/dce60/dce60_resource.o
>   CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/hdcp/hdcp_msg.o
>   CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/sspl/dc_spl.o
>   CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/sspl/dc_spl_scl_filters.o
>   CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/sspl/dc_spl_scl_easf_filters.o
>   CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/sspl/dc_spl_isharp_filters.o
>   CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/sspl/dc_spl_filters.o
>   CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/sspl/spl_fixpt31_32.o
>   CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/sspl/spl_custom_float.o
>   CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/core/dc.o
>   CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/core/dc_stat.o
>   CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/core/dc_resource.o
>   CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/core/dc_hw_sequencer.o
>   CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/core/dc_sink.o
>   CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/core/dc_surface.o
>   CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/core/dc_debug.o
>   CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/core/dc_stream.o
>   CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/core/dc_link_enc_cfg.o
>   CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/core/dc_link_exports.o
>   CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/core/dc_state.o
>   CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/core/dc_vm_helper.o
>   CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/dc_helper.o
>   CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/dc_dmub_srv.o
>   CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/dc_edid_parser.o
>   CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/dc_spl_translate.o
>   CC [M]  drivers/gpu/drm/amd/amdgpu/../display/modules/freesync/freesync.o
>   CC [M]  drivers/gpu/drm/amd/amdgpu/../display/modules/color/color_gamma.o
>   CC [M]  drivers/gpu/drm/amd/amdgpu/../display/modules/color/color_table.o
>   CC [M]  drivers/gpu/drm/amd/amdgpu/../display/modules/info_packet/info_packet.o
>   CC [M]  drivers/gpu/drm/amd/amdgpu/../display/modules/power/power_helpers.o
>   CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dmub/src/dmub_srv.o
>   CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dmub/src/dmub_srv_stat.o
>   CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dmub/src/dmub_reg.o
>   CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dmub/src/dmub_dcn20.o
>   CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dmub/src/dmub_dcn21.o
>   CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dmub/src/dmub_dcn30.o
>   CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dmub/src/dmub_dcn301.o
>   CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dmub/src/dmub_dcn302.o
>   CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dmub/src/dmub_dcn303.o
>   CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dmub/src/dmub_dcn31.o
>   CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dmub/src/dmub_dcn314.o
>   CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dmub/src/dmub_dcn315.o
>   CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dmub/src/dmub_dcn316.o
>   CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dmub/src/dmub_dcn32.o
>   CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dmub/src/dmub_dcn35.o
>   CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dmub/src/dmub_dcn351.o
>   CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dmub/src/dmub_dcn36.o
>   CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dmub/src/dmub_dcn401.o
>   CC [M]  drivers/gpu/drm/amd/amdgpu/../display/modules/hdcp/hdcp_ddc.o
>   CC [M]  drivers/gpu/drm/amd/amdgpu/../display/modules/hdcp/hdcp_log.o
>   CC [M]  drivers/gpu/drm/amd/amdgpu/../display/modules/hdcp/hdcp_psp.o
>   CC [M]  drivers/gpu/drm/amd/amdgpu/../display/modules/hdcp/hdcp.o
>   CC [M]  drivers/gpu/drm/amd/amdgpu/../display/modules/hdcp/hdcp1_execution.o
>   CC [M]  drivers/gpu/drm/amd/amdgpu/../display/modules/hdcp/hdcp1_transition.o
>   CC [M]  drivers/gpu/drm/amd/amdgpu/../display/modules/hdcp/hdcp2_execution.o
>   CC [M]  drivers/gpu/drm/amd/amdgpu/../display/modules/hdcp/hdcp2_transition.o
>   CC [M]  drivers/gpu/drm/amd/amdgpu/amdgpu_isp.o
>   CC [M]  drivers/gpu/drm/amd/amdgpu/isp_v4_1_0.o
>   CC [M]  drivers/gpu/drm/amd/amdgpu/isp_v4_1_1.o
>   LD [M]  drivers/gpu/drm/amd/amdgpu/amdgpu.o
> make[5]: *** [../scripts/Makefile.build:465: drivers/gpu/drm] Error 2
> make[4]: *** [../scripts/Makefile.build:465: drivers/gpu] Error 2
> make[3]: *** [../scripts/Makefile.build:465: drivers] Error 2
> make[2]: *** [/kernel/Makefile:1994: .] Error 2
> make[1]: *** [/kernel/Makefile:251: __sub-make] Error 2
> make[1]: Leaving directory '/kernel/build64-default'
> make: *** [Makefile:251: __sub-make] Error 2
> + cleanup
> ++ stat -c %u:%g /kernel
> + chown -R 1003:1003 /kernel

As far as I can tell, this build failure was apropos of nothing, so I'm going to send a resubmission request
and see if compilation fails again.
-Jonathan Cavitt

> 
> 
> 

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

* Re: [PATCH v8 3/6] drm/xe/uapi: Define drm_xe_vm_get_property
  2025-03-13 18:34 ` [PATCH v8 3/6] drm/xe/uapi: Define drm_xe_vm_get_property Jonathan Cavitt
@ 2025-03-13 22:10   ` Jianxun Zhang
  0 siblings, 0 replies; 27+ messages in thread
From: Jianxun Zhang @ 2025-03-13 22:10 UTC (permalink / raw)
  To: Jonathan Cavitt, intel-xe
  Cc: saurabhg.gupta, alex.zuo, joonas.lahtinen, matthew.brost,
	shuicheng.lin, dri-devel, Michal.Wajdeczko, michal.mzorek



On 3/13/25 11:34, Jonathan Cavitt wrote:
> Add initial declarations for the drm_xe_vm_get_property ioctl.
> 
> Signed-off-by: Jonathan Cavitt <jonathan.cavitt@intel.com>
> ---
>   include/uapi/drm/xe_drm.h | 69 +++++++++++++++++++++++++++++++++++++++
>   1 file changed, 69 insertions(+)
> 
> diff --git a/include/uapi/drm/xe_drm.h b/include/uapi/drm/xe_drm.h
> index 616916985e3f..0ed52666b4e9 100644
> --- a/include/uapi/drm/xe_drm.h
> +++ b/include/uapi/drm/xe_drm.h
> @@ -81,6 +81,7 @@ extern "C" {
>    *  - &DRM_IOCTL_XE_EXEC
>    *  - &DRM_IOCTL_XE_WAIT_USER_FENCE
>    *  - &DRM_IOCTL_XE_OBSERVATION
> + *  - &DRM_IOCTL_XE_VM_GET_PROPERTY
>    */
>   
>   /*
> @@ -102,6 +103,7 @@ extern "C" {
>   #define DRM_XE_EXEC			0x09
>   #define DRM_XE_WAIT_USER_FENCE		0x0a
>   #define DRM_XE_OBSERVATION		0x0b
> +#define DRM_XE_VM_GET_PROPERTY		0x0c
>   
>   /* Must be kept compact -- no holes */
>   
> @@ -117,6 +119,7 @@ extern "C" {
>   #define DRM_IOCTL_XE_EXEC			DRM_IOW(DRM_COMMAND_BASE + DRM_XE_EXEC, struct drm_xe_exec)
>   #define DRM_IOCTL_XE_WAIT_USER_FENCE		DRM_IOWR(DRM_COMMAND_BASE + DRM_XE_WAIT_USER_FENCE, struct drm_xe_wait_user_fence)
>   #define DRM_IOCTL_XE_OBSERVATION		DRM_IOW(DRM_COMMAND_BASE + DRM_XE_OBSERVATION, struct drm_xe_observation_param)
> +#define DRM_IOCTL_XE_VM_GET_PROPERTY	DRM_IOWR(DRM_COMMAND_BASE + DRM_XE_VM_GET_PROPERTY, struct drm_xe_vm_get_property)
>   
>   /**
>    * DOC: Xe IOCTL Extensions
> @@ -1189,6 +1192,72 @@ struct drm_xe_vm_bind {
>   	__u64 reserved[2];
>   };
>   
> +/** struct xe_vm_fault - Describes faults for %DRM_XE_VM_GET_PROPERTY_FAULTS */
> +struct xe_vm_fault {
> +	/** @address: Address of the fault */
> +	__u64 address;
> +#define DRM_XE_FAULT_ADDRESS_TYPE_NONE_EXT		0
> +#define DRM_XE_FAULT_ADDRESS_TYPE_READ_INVALID_EXT	1
> +#define DRM_XE_FAULT_ADDRESS_TYPE_WRITE_INVALID_EXT	2
> +	/** @address_type: Type of address access that resulted in fault */
> +	__u32 address_type;
> +	/** @address_precision: Precision of faulted address */
> +	__u32 address_precision;
> +	/** @fault_level: fault level of the fault */
> +	__u8 fault_level;
> +	/** @engine_class: class of engine fault was reported on */
> +	__u8 engine_class;
> +	/** @engine_instance: instance of engine fault was reported on */
> +	__u8 engine_instance;
> +	/** @pad: MBZ */
> +	__u8 pad[5];
> +	/** @reserved: MBZ */
> +	__u64 reserved[3];
> +};
> +
> +/**
> + * struct drm_xe_vm_get_property - Input of &DRM_IOCTL_XE_VM_GET_PROPERTY
> + *
> + * The user provides a VM ID and a property to query for.  The ioctl will return
> + * the size of the data expected to be returned in @size.  Performing the query
> + * again with memory allocated to @data of size @size will return the requested
> + * data to the allocated memory.
> + *
> + * Some get property requests may be scalar values and require no memory allocation.
> + * In such cases, the first call to this ioctl will not set @size and will return
> + * the requested value to @value instead.
A kernel driver cannot assume user space always plays nicely (two calls 
in the expected order). Instead, the design should be able to deal with 
all possibilities.

I suggest rewording this comment from another angle for two different 
behaviors. Something like "caller passes size with zero, ioctl returns 
actual size of a property only; caller passes a non-zero size, ioctl returns
error if size < prop's size, otherwise the size of prop and fills the 
data in memory"

In this way, the usage doesn't rely on the order of calls from user space.
> + *
> + * The @property can be:
> + *  - %DRM_XE_VM_GET_PROPERTY_FAULTS
> + */
> +struct drm_xe_vm_get_property {
> +	/** @extensions: Pointer to the first extension struct, if any */
> +	__u64 extensions;
> +
> +	/** @vm_id: The ID of the VM to query the properties of */
> +	__u32 vm_id;
> +
> +#define DRM_XE_VM_GET_PROPERTY_FAULTS		0
> +	/** @property: property to get */
> +	__u32 property;
> +
> +	/** @size: Size to allocate for @data */
> +	__u32 size;
> +
> +	/** @pad: MBZ */
> +	__u32 pad;
> +
> +	union {
> +		/** @data: Pointer to user-defined array of flexible size and type */
> +		__u64 data;
> +		/** @value: Return value for scalar queries */
> +		__u64 value;
> +	};
> +
> +	/** @reserved: MBZ */
> +	__u64 reserved[3];
> +};
> +
>   /**
>    * struct drm_xe_exec_queue_create - Input of &DRM_IOCTL_XE_EXEC_QUEUE_CREATE
>    *


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

* ✓ CI.Patch_applied: success for drm/xe/xe_vm: Implement xe_vm_get_property_ioctl (rev9)
  2025-03-13 18:34 [PATCH v8 0/6] drm/xe/xe_vm: Implement xe_vm_get_property_ioctl Jonathan Cavitt
                   ` (9 preceding siblings ...)
  2025-03-13 19:24 ` ✗ CI.Build: failure " Patchwork
@ 2025-03-13 22:12 ` Patchwork
  2025-03-13 22:12 ` ✗ CI.checkpatch: warning " Patchwork
                   ` (2 subsequent siblings)
  13 siblings, 0 replies; 27+ messages in thread
From: Patchwork @ 2025-03-13 22:12 UTC (permalink / raw)
  To: Jonathan Cavitt; +Cc: intel-xe

== Series Details ==

Series: drm/xe/xe_vm: Implement xe_vm_get_property_ioctl (rev9)
URL   : https://patchwork.freedesktop.org/series/145529/
State : success

== Summary ==

=== Applying kernel patches on branch 'drm-tip' with base: ===
Base commit: d7e9873f7923 drm-tip: 2025y-03m-13d-20h-15m-42s UTC integration manifest
=== git am output follows ===
Applying: drm/xe/xe_gt_pagefault: Disallow writes to read-only VMAs
Applying: drm/xe/xe_gt_pagefault: Move pagefault struct to header
Applying: drm/xe/uapi: Define drm_xe_vm_get_property
Applying: drm/xe/xe_gt_pagefault: Add address_type field to pagefaults
Applying: drm/xe/xe_vm: Add per VM fault info
Applying: drm/xe/xe_vm: Implement xe_vm_get_property_ioctl



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

* ✗ CI.checkpatch: warning for drm/xe/xe_vm: Implement xe_vm_get_property_ioctl (rev9)
  2025-03-13 18:34 [PATCH v8 0/6] drm/xe/xe_vm: Implement xe_vm_get_property_ioctl Jonathan Cavitt
                   ` (10 preceding siblings ...)
  2025-03-13 22:12 ` ✓ CI.Patch_applied: success for drm/xe/xe_vm: Implement xe_vm_get_property_ioctl (rev9) Patchwork
@ 2025-03-13 22:12 ` Patchwork
  2025-03-13 22:13 ` ✓ CI.KUnit: success " Patchwork
  2025-03-13 22:19 ` ✗ CI.Build: failure " Patchwork
  13 siblings, 0 replies; 27+ messages in thread
From: Patchwork @ 2025-03-13 22:12 UTC (permalink / raw)
  To: Jonathan Cavitt; +Cc: intel-xe

== Series Details ==

Series: drm/xe/xe_vm: Implement xe_vm_get_property_ioctl (rev9)
URL   : https://patchwork.freedesktop.org/series/145529/
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
cbb4e4a079d89106c2736adc3c7de6f9dc56da07
+ cd /kernel
+ git config --global --add safe.directory /kernel
+ git log -n1
commit 5a0289c4e5ca49d20e1fced46dd8340a63ec3c98
Author: Jonathan Cavitt <jonathan.cavitt@intel.com>
Date:   Thu Mar 13 18:34:08 2025 +0000

    drm/xe/xe_vm: Implement xe_vm_get_property_ioctl
    
    Add support for userspace to request a list of observed faults
    from a specified VM.
    
    v2:
    - Only allow querying of failed pagefaults (Matt Brost)
    
    v3:
    - Remove unnecessary size parameter from helper function, as it
      is a property of the arguments. (jcavitt)
    - Remove unnecessary copy_from_user (Jainxun)
    - Set address_precision to 1 (Jainxun)
    - Report max size instead of dynamic size for memory allocation
      purposes.  Total memory usage is reported separately.
    
    v4:
    - Return int from xe_vm_get_property_size (Shuicheng)
    - Fix memory leak (Shuicheng)
    - Remove unnecessary size variable (jcavitt)
    
    v5:
    - Rename ioctl to xe_vm_get_faults_ioctl (jcavitt)
    - Update fill_property_pfs to eliminate need for kzalloc (Jianxun)
    
    v6:
    - Repair and move fill_faults break condition (Dan Carpenter)
    - Free vm after use (jcavitt)
    - Combine assertions (jcavitt)
    - Expand size check in xe_vm_get_faults_ioctl (jcavitt)
    - Remove return mask from fill_faults, as return is already -EFAULT or 0
      (jcavitt)
    
    v7:
    - Revert back to using xe_vm_get_property_ioctl
    - Apply better copy_to_user logic (jcavitt)
    
    Signed-off-by: Jonathan Cavitt <jonathan.cavitt@intel.com>
    Suggested-by: Matthew Brost <matthew.brost@intel.com>
    Cc: Jainxun Zhang <jianxun.zhang@intel.com>
    Cc: Shuicheng Lin <shuicheng.lin@intel.com>
+ /mt/dim checkpatch d7e9873f7923d139bdd258f4061751b5bfae468f drm-intel
c6f1f2df0aef drm/xe/xe_gt_pagefault: Disallow writes to read-only VMAs
d2c670df01c2 drm/xe/xe_gt_pagefault: Move pagefault struct to header
-:130: WARNING:FILE_PATH_CHANGES: added, moved or deleted file(s), does MAINTAINERS need updating?
#130: 
new file mode 100644

total: 0 errors, 1 warnings, 0 checks, 159 lines checked
d9649a32af5d drm/xe/uapi: Define drm_xe_vm_get_property
-:34: WARNING:LONG_LINE: line length of 122 exceeds 100 columns
#34: FILE: include/uapi/drm/xe_drm.h:122:
+#define DRM_IOCTL_XE_VM_GET_PROPERTY	DRM_IOWR(DRM_COMMAND_BASE + DRM_XE_VM_GET_PROPERTY, struct drm_xe_vm_get_property)

total: 0 errors, 1 warnings, 0 checks, 93 lines checked
9c2996a78e05 drm/xe/xe_gt_pagefault: Add address_type field to pagefaults
5df38095bba7 drm/xe/xe_vm: Add per VM fault info
-:111: WARNING:OOM_MESSAGE: Possible unnecessary 'out of memory' message
#111: FILE: drivers/gpu/drm/xe/xe_vm.c:802:
+	if (!e) {
+		drm_warn(&vm->xe->drm,

total: 0 errors, 1 warnings, 0 checks, 187 lines checked
5a0289c4e5ca drm/xe/xe_vm: Implement xe_vm_get_property_ioctl



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

* ✓ CI.KUnit: success for drm/xe/xe_vm: Implement xe_vm_get_property_ioctl (rev9)
  2025-03-13 18:34 [PATCH v8 0/6] drm/xe/xe_vm: Implement xe_vm_get_property_ioctl Jonathan Cavitt
                   ` (11 preceding siblings ...)
  2025-03-13 22:12 ` ✗ CI.checkpatch: warning " Patchwork
@ 2025-03-13 22:13 ` Patchwork
  2025-03-13 22:19 ` ✗ CI.Build: failure " Patchwork
  13 siblings, 0 replies; 27+ messages in thread
From: Patchwork @ 2025-03-13 22:13 UTC (permalink / raw)
  To: Jonathan Cavitt; +Cc: intel-xe

== Series Details ==

Series: drm/xe/xe_vm: Implement xe_vm_get_property_ioctl (rev9)
URL   : https://patchwork.freedesktop.org/series/145529/
State : success

== Summary ==

+ trap cleanup EXIT
+ /kernel/tools/testing/kunit/kunit.py run --kunitconfig /kernel/drivers/gpu/drm/xe/.kunitconfig
[22:12:21] Configuring KUnit Kernel ...
Generating .config ...
Populating config with:
$ make ARCH=um O=.kunit olddefconfig
[22:12:25] Building KUnit Kernel ...
Populating config with:
$ make ARCH=um O=.kunit olddefconfig
Building with:
$ make all compile_commands.json ARCH=um O=.kunit --jobs=48
../lib/iomap.c:156:5: warning: no previous prototype for ‘ioread64_lo_hi’ [-Wmissing-prototypes]
  156 | u64 ioread64_lo_hi(const void __iomem *addr)
      |     ^~~~~~~~~~~~~~
../lib/iomap.c:163:5: warning: no previous prototype for ‘ioread64_hi_lo’ [-Wmissing-prototypes]
  163 | u64 ioread64_hi_lo(const void __iomem *addr)
      |     ^~~~~~~~~~~~~~
../lib/iomap.c:170:5: warning: no previous prototype for ‘ioread64be_lo_hi’ [-Wmissing-prototypes]
  170 | u64 ioread64be_lo_hi(const void __iomem *addr)
      |     ^~~~~~~~~~~~~~~~
../lib/iomap.c:178:5: warning: no previous prototype for ‘ioread64be_hi_lo’ [-Wmissing-prototypes]
  178 | u64 ioread64be_hi_lo(const void __iomem *addr)
      |     ^~~~~~~~~~~~~~~~
../lib/iomap.c:264:6: warning: no previous prototype for ‘iowrite64_lo_hi’ [-Wmissing-prototypes]
  264 | void iowrite64_lo_hi(u64 val, void __iomem *addr)
      |      ^~~~~~~~~~~~~~~
../lib/iomap.c:272:6: warning: no previous prototype for ‘iowrite64_hi_lo’ [-Wmissing-prototypes]
  272 | void iowrite64_hi_lo(u64 val, void __iomem *addr)
      |      ^~~~~~~~~~~~~~~
../lib/iomap.c:280:6: warning: no previous prototype for ‘iowrite64be_lo_hi’ [-Wmissing-prototypes]
  280 | void iowrite64be_lo_hi(u64 val, void __iomem *addr)
      |      ^~~~~~~~~~~~~~~~~
../lib/iomap.c:288:6: warning: no previous prototype for ‘iowrite64be_hi_lo’ [-Wmissing-prototypes]
  288 | void iowrite64be_hi_lo(u64 val, void __iomem *addr)
      |      ^~~~~~~~~~~~~~~~~

[22:12:51] Starting KUnit Kernel (1/1)...
[22:12:51] ============================================================
Running tests with:
$ .kunit/linux kunit.enable=1 mem=1G console=tty kunit_shutdown=halt
[22:12:52] ================== guc_buf (11 subtests) ===================
[22:12:52] [PASSED] test_smallest
[22:12:52] [PASSED] test_largest
[22:12:52] [PASSED] test_granular
[22:12:52] [PASSED] test_unique
[22:12:52] [PASSED] test_overlap
[22:12:52] [PASSED] test_reusable
[22:12:52] [PASSED] test_too_big
[22:12:52] [PASSED] test_flush
[22:12:52] [PASSED] test_lookup
[22:12:52] [PASSED] test_data
[22:12:52] [PASSED] test_class
[22:12:52] ===================== [PASSED] guc_buf =====================
[22:12:52] =================== guc_dbm (7 subtests) ===================
[22:12:52] [PASSED] test_empty
[22:12:52] [PASSED] test_default
[22:12:52] ======================== test_size  ========================
[22:12:52] [PASSED] 4
[22:12:52] [PASSED] 8
[22:12:52] [PASSED] 32
[22:12:52] [PASSED] 256
[22:12:52] ==================== [PASSED] test_size ====================
[22:12:52] ======================= test_reuse  ========================
[22:12:52] [PASSED] 4
[22:12:52] [PASSED] 8
[22:12:52] [PASSED] 32
[22:12:52] [PASSED] 256
[22:12:52] =================== [PASSED] test_reuse ====================
[22:12:52] =================== test_range_overlap  ====================
[22:12:52] [PASSED] 4
[22:12:52] [PASSED] 8
[22:12:52] [PASSED] 32
[22:12:52] [PASSED] 256
[22:12:52] =============== [PASSED] test_range_overlap ================
[22:12:52] =================== test_range_compact  ====================
[22:12:52] [PASSED] 4
[22:12:52] [PASSED] 8
[22:12:52] [PASSED] 32
[22:12:52] [PASSED] 256
[22:12:52] =============== [PASSED] test_range_compact ================
[22:12:52] ==================== test_range_spare  =====================
[22:12:52] [PASSED] 4
[22:12:52] [PASSED] 8
[22:12:52] [PASSED] 32
[22:12:52] [PASSED] 256
[22:12:52] ================ [PASSED] test_range_spare =================
[22:12:52] ===================== [PASSED] guc_dbm =====================
[22:12:52] =================== guc_idm (6 subtests) ===================
[22:12:52] [PASSED] bad_init
[22:12:52] [PASSED] no_init
[22:12:52] [PASSED] init_fini
[22:12:52] [PASSED] check_used
[22:12:52] [PASSED] check_quota
[22:12:52] [PASSED] check_all
[22:12:52] ===================== [PASSED] guc_idm =====================
[22:12:52] ================== no_relay (3 subtests) ===================
[22:12:52] [PASSED] xe_drops_guc2pf_if_not_ready
[22:12:52] [PASSED] xe_drops_guc2vf_if_not_ready
[22:12:52] [PASSED] xe_rejects_send_if_not_ready
[22:12:52] ==================== [PASSED] no_relay =====================
[22:12:52] ================== pf_relay (14 subtests) ==================
[22:12:52] [PASSED] pf_rejects_guc2pf_too_short
[22:12:52] [PASSED] pf_rejects_guc2pf_too_long
[22:12:52] [PASSED] pf_rejects_guc2pf_no_payload
[22:12:52] [PASSED] pf_fails_no_payload
[22:12:52] [PASSED] pf_fails_bad_origin
[22:12:52] [PASSED] pf_fails_bad_type
[22:12:52] [PASSED] pf_txn_reports_error
[22:12:52] [PASSED] pf_txn_sends_pf2guc
[22:12:52] [PASSED] pf_sends_pf2guc
[22:12:52] [SKIPPED] pf_loopback_nop
[22:12:52] [SKIPPED] pf_loopback_echo
[22:12:52] [SKIPPED] pf_loopback_fail
[22:12:52] [SKIPPED] pf_loopback_busy
[22:12:52] [SKIPPED] pf_loopback_retry
[22:12:52] ==================== [PASSED] pf_relay =====================
[22:12:52] ================== vf_relay (3 subtests) ===================
[22:12:52] [PASSED] vf_rejects_guc2vf_too_short
[22:12:52] [PASSED] vf_rejects_guc2vf_too_long
[22:12:52] [PASSED] vf_rejects_guc2vf_no_payload
[22:12:52] ==================== [PASSED] vf_relay =====================
[22:12:52] ================= pf_service (11 subtests) =================
[22:12:52] [PASSED] pf_negotiate_any
[22:12:52] [PASSED] pf_negotiate_base_match
[22:12:52] [PASSED] pf_negotiate_base_newer
[22:12:52] [PASSED] pf_negotiate_base_next
[22:12:52] [SKIPPED] pf_negotiate_base_older
[22:12:52] [PASSED] pf_negotiate_base_prev
[22:12:52] [PASSED] pf_negotiate_latest_match
[22:12:52] [PASSED] pf_negotiate_latest_newer
[22:12:52] [PASSED] pf_negotiate_latest_next
[22:12:52] [SKIPPED] pf_negotiate_latest_older
[22:12:52] [SKIPPED] pf_negotiate_latest_prev
[22:12:52] =================== [PASSED] pf_service ====================
[22:12:52] ===================== lmtt (1 subtest) =====================
[22:12:52] ======================== test_ops  =========================
[22:12:52] [PASSED] 2-level
[22:12:52] [PASSED] multi-level
[22:12:52] ==================== [PASSED] test_ops =====================
[22:12:52] ====================== [PASSED] lmtt =======================
[22:12:52] =================== xe_mocs (2 subtests) ===================
[22:12:52] ================ xe_live_mocs_kernel_kunit  ================
[22:12:52] =========== [SKIPPED] xe_live_mocs_kernel_kunit ============
[22:12:52] ================ xe_live_mocs_reset_kunit  =================
[22:12:52] ============ [SKIPPED] xe_live_mocs_reset_kunit ============
[22:12:52] ==================== [SKIPPED] xe_mocs =====================
[22:12:52] ================= xe_migrate (2 subtests) ==================
[22:12:52] ================= xe_migrate_sanity_kunit  =================
[22:12:52] ============ [SKIPPED] xe_migrate_sanity_kunit =============
[22:12:52] ================== xe_validate_ccs_kunit  ==================
[22:12:52] ============= [SKIPPED] xe_validate_ccs_kunit ==============
[22:12:52] =================== [SKIPPED] xe_migrate ===================
[22:12:52] ================== xe_dma_buf (1 subtest) ==================
[22:12:52] ==================== xe_dma_buf_kunit  =====================
[22:12:52] ================ [SKIPPED] xe_dma_buf_kunit ================
[22:12:52] =================== [SKIPPED] xe_dma_buf ===================
[22:12:52] ================= xe_bo_shrink (1 subtest) =================
[22:12:52] =================== xe_bo_shrink_kunit  ====================
[22:12:52] =============== [SKIPPED] xe_bo_shrink_kunit ===============
[22:12:52] ================== [SKIPPED] xe_bo_shrink ==================
[22:12:52] ==================== xe_bo (2 subtests) ====================
[22:12:52] ================== xe_ccs_migrate_kunit  ===================
[22:12:52] ============== [SKIPPED] xe_ccs_migrate_kunit ==============
stty: 'standard input': Inappropriate ioctl for device
[22:12:52] ==================== xe_bo_evict_kunit  ====================
[22:12:52] =============== [SKIPPED] xe_bo_evict_kunit ================
[22:12:52] ===================== [SKIPPED] xe_bo ======================
[22:12:52] ==================== args (11 subtests) ====================
[22:12:52] [PASSED] count_args_test
[22:12:52] [PASSED] call_args_example
[22:12:52] [PASSED] call_args_test
[22:12:52] [PASSED] drop_first_arg_example
[22:12:52] [PASSED] drop_first_arg_test
[22:12:52] [PASSED] first_arg_example
[22:12:52] [PASSED] first_arg_test
[22:12:52] [PASSED] last_arg_example
[22:12:52] [PASSED] last_arg_test
[22:12:52] [PASSED] pick_arg_example
[22:12:52] [PASSED] sep_comma_example
[22:12:52] ====================== [PASSED] args =======================
[22:12:52] =================== xe_pci (2 subtests) ====================
[22:12:52] [PASSED] xe_gmdid_graphics_ip
[22:12:52] [PASSED] xe_gmdid_media_ip
[22:12:52] ===================== [PASSED] xe_pci ======================
[22:12:52] =================== xe_rtp (2 subtests) ====================
[22:12:52] =============== xe_rtp_process_to_sr_tests  ================
[22:12:52] [PASSED] coalesce-same-reg
[22:12:52] [PASSED] no-match-no-add
[22:12:52] [PASSED] match-or
[22:12:52] [PASSED] match-or-xfail
[22:12:52] [PASSED] no-match-no-add-multiple-rules
[22:12:52] [PASSED] two-regs-two-entries
[22:12:52] [PASSED] clr-one-set-other
[22:12:52] [PASSED] set-field
[22:12:52] [PASSED] conflict-duplicate
[22:12:52] [PASSED] conflict-not-disjoint
[22:12:52] [PASSED] conflict-reg-type
[22:12:52] =========== [PASSED] xe_rtp_process_to_sr_tests ============
[22:12:52] ================== xe_rtp_process_tests  ===================
[22:12:52] [PASSED] active1
[22:12:52] [PASSED] active2
[22:12:52] [PASSED] active-inactive
[22:12:52] [PASSED] inactive-active
[22:12:52] [PASSED] inactive-1st_or_active-inactive
[22:12:52] [PASSED] inactive-2nd_or_active-inactive
[22:12:52] [PASSED] inactive-last_or_active-inactive
[22:12:52] [PASSED] inactive-no_or_active-inactive
[22:12:52] ============== [PASSED] xe_rtp_process_tests ===============
[22:12:52] ===================== [PASSED] xe_rtp ======================
[22:12:52] ==================== xe_wa (1 subtest) =====================
[22:12:52] ======================== xe_wa_gt  =========================
[22:12:52] [PASSED] TIGERLAKE (B0)
[22:12:52] [PASSED] DG1 (A0)
[22:12:52] [PASSED] DG1 (B0)
[22:12:52] [PASSED] ALDERLAKE_S (A0)
[22:12:52] [PASSED] ALDERLAKE_S (B0)
[22:12:52] [PASSED] ALDERLAKE_S (C0)
[22:12:52] [PASSED] ALDERLAKE_S (D0)
[22:12:52] [PASSED] ALDERLAKE_P (A0)
[22:12:52] [PASSED] ALDERLAKE_P (B0)
[22:12:52] [PASSED] ALDERLAKE_P (C0)
[22:12:52] [PASSED] ALDERLAKE_S_RPLS (D0)
[22:12:52] [PASSED] ALDERLAKE_P_RPLU (E0)
[22:12:52] [PASSED] DG2_G10 (C0)
[22:12:52] [PASSED] DG2_G11 (B1)
[22:12:52] [PASSED] DG2_G12 (A1)
[22:12:52] [PASSED] METEORLAKE (g:A0, m:A0)
[22:12:52] [PASSED] METEORLAKE (g:A0, m:A0)
[22:12:52] [PASSED] METEORLAKE (g:A0, m:A0)
[22:12:52] [PASSED] LUNARLAKE (g:A0, m:A0)
[22:12:52] [PASSED] LUNARLAKE (g:B0, m:A0)
[22:12:52] [PASSED] BATTLEMAGE (g:A0, m:A1)
[22:12:52] ==================== [PASSED] xe_wa_gt =====================
[22:12:52] ====================== [PASSED] xe_wa ======================
[22:12:52] ============================================================
[22:12:52] Testing complete. Ran 133 tests: passed: 117, skipped: 16
[22:12:52] Elapsed time: 30.626s total, 4.136s configuring, 26.224s building, 0.250s running

+ /kernel/tools/testing/kunit/kunit.py run --kunitconfig /kernel/drivers/gpu/drm/tests/.kunitconfig
[22:12:52] Configuring KUnit Kernel ...
Regenerating .config ...
Populating config with:
$ make ARCH=um O=.kunit olddefconfig
[22:12:53] Building KUnit Kernel ...
Populating config with:
$ make ARCH=um O=.kunit olddefconfig
Building with:
$ make all compile_commands.json ARCH=um O=.kunit --jobs=48
../lib/iomap.c:156:5: warning: no previous prototype for ‘ioread64_lo_hi’ [-Wmissing-prototypes]
  156 | u64 ioread64_lo_hi(const void __iomem *addr)
      |     ^~~~~~~~~~~~~~
../lib/iomap.c:163:5: warning: no previous prototype for ‘ioread64_hi_lo’ [-Wmissing-prototypes]
  163 | u64 ioread64_hi_lo(const void __iomem *addr)
      |     ^~~~~~~~~~~~~~
../lib/iomap.c:170:5: warning: no previous prototype for ‘ioread64be_lo_hi’ [-Wmissing-prototypes]
  170 | u64 ioread64be_lo_hi(const void __iomem *addr)
      |     ^~~~~~~~~~~~~~~~
../lib/iomap.c:178:5: warning: no previous prototype for ‘ioread64be_hi_lo’ [-Wmissing-prototypes]
  178 | u64 ioread64be_hi_lo(const void __iomem *addr)
      |     ^~~~~~~~~~~~~~~~
../lib/iomap.c:264:6: warning: no previous prototype for ‘iowrite64_lo_hi’ [-Wmissing-prototypes]
  264 | void iowrite64_lo_hi(u64 val, void __iomem *addr)
      |      ^~~~~~~~~~~~~~~
../lib/iomap.c:272:6: warning: no previous prototype for ‘iowrite64_hi_lo’ [-Wmissing-prototypes]
  272 | void iowrite64_hi_lo(u64 val, void __iomem *addr)
      |      ^~~~~~~~~~~~~~~
../lib/iomap.c:280:6: warning: no previous prototype for ‘iowrite64be_lo_hi’ [-Wmissing-prototypes]
  280 | void iowrite64be_lo_hi(u64 val, void __iomem *addr)
      |      ^~~~~~~~~~~~~~~~~
../lib/iomap.c:288:6: warning: no previous prototype for ‘iowrite64be_hi_lo’ [-Wmissing-prototypes]
  288 | void iowrite64be_hi_lo(u64 val, void __iomem *addr)
      |      ^~~~~~~~~~~~~~~~~

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

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

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



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

* ✗ CI.Build: failure for drm/xe/xe_vm: Implement xe_vm_get_property_ioctl (rev9)
  2025-03-13 18:34 [PATCH v8 0/6] drm/xe/xe_vm: Implement xe_vm_get_property_ioctl Jonathan Cavitt
                   ` (12 preceding siblings ...)
  2025-03-13 22:13 ` ✓ CI.KUnit: success " Patchwork
@ 2025-03-13 22:19 ` Patchwork
  13 siblings, 0 replies; 27+ messages in thread
From: Patchwork @ 2025-03-13 22:19 UTC (permalink / raw)
  To: Jonathan Cavitt; +Cc: intel-xe

== Series Details ==

Series: drm/xe/xe_vm: Implement xe_vm_get_property_ioctl (rev9)
URL   : https://patchwork.freedesktop.org/series/145529/
State : failure

== Summary ==

CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/dml2/dml21/src/dml2_top/dml2_top_interfaces.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/dml2/dml21/src/dml2_top/dml2_top_soc15.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/dml2/dml21/src/inc/dml2_debug.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/dml2/dml21/src/dml2_core/dml2_core_dcn4.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/dml2/dml21/src/dml2_core/dml2_core_factory.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/dml2/dml21/src/dml2_core/dml2_core_dcn4_calcs.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/dml2/dml21/src/dml2_dpmm/dml2_dpmm_dcn4.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/dml2/dml21/src/dml2_dpmm/dml2_dpmm_factory.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/dml2/dml21/src/dml2_mcg/dml2_mcg_dcn4.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/dml2/dml21/src/dml2_mcg/dml2_mcg_factory.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/dml2/dml21/src/dml2_pmo/dml2_pmo_dcn3.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/dml2/dml21/src/dml2_pmo/dml2_pmo_factory.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/dml2/dml21/src/dml2_pmo/dml2_pmo_dcn4_fams2.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/dml2/dml21/src/dml2_standalone_libraries/lib_float_math.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/dml2/dml21/dml21_translation_helper.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/dml2/dml21/dml21_wrapper.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/dml2/dml21/dml21_utils.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/dce120/dce120_timing_generator.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/dce112/dce112_compressor.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/dce110/dce110_timing_generator.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/dce110/dce110_compressor.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/dce110/dce110_opp_regamma_v.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/dce110/dce110_opp_csc_v.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/dce110/dce110_timing_generator_v.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/dce110/dce110_mem_input_v.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/dce110/dce110_opp_v.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/dce110/dce110_transform_v.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/dce80/dce80_timing_generator.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/dce60/dce60_timing_generator.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/dce60/dce60_hw_sequencer.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/dce60/dce60_resource.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/hdcp/hdcp_msg.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/sspl/dc_spl.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/sspl/dc_spl_scl_filters.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/sspl/dc_spl_scl_easf_filters.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/sspl/dc_spl_isharp_filters.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/sspl/dc_spl_filters.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/sspl/spl_fixpt31_32.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/sspl/spl_custom_float.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/core/dc.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/core/dc_stat.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/core/dc_resource.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/core/dc_hw_sequencer.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/core/dc_sink.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/core/dc_surface.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/core/dc_debug.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/core/dc_stream.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/core/dc_link_enc_cfg.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/core/dc_link_exports.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/core/dc_state.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/core/dc_vm_helper.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/dc_helper.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/dc_dmub_srv.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/dc_edid_parser.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/dc_spl_translate.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/modules/freesync/freesync.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/modules/color/color_gamma.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/modules/color/color_table.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/modules/info_packet/info_packet.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/modules/power/power_helpers.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dmub/src/dmub_srv.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dmub/src/dmub_srv_stat.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dmub/src/dmub_reg.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dmub/src/dmub_dcn20.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dmub/src/dmub_dcn21.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dmub/src/dmub_dcn30.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dmub/src/dmub_dcn301.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dmub/src/dmub_dcn302.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dmub/src/dmub_dcn303.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dmub/src/dmub_dcn31.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dmub/src/dmub_dcn314.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dmub/src/dmub_dcn315.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dmub/src/dmub_dcn316.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dmub/src/dmub_dcn32.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dmub/src/dmub_dcn35.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dmub/src/dmub_dcn351.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dmub/src/dmub_dcn36.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dmub/src/dmub_dcn401.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/modules/hdcp/hdcp_ddc.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/modules/hdcp/hdcp_log.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/modules/hdcp/hdcp_psp.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/modules/hdcp/hdcp.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/modules/hdcp/hdcp1_execution.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/modules/hdcp/hdcp1_transition.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/modules/hdcp/hdcp2_execution.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/modules/hdcp/hdcp2_transition.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/amdgpu_isp.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/isp_v4_1_0.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/isp_v4_1_1.o
  LD [M]  drivers/gpu/drm/amd/amdgpu/amdgpu.o
make[5]: *** [../scripts/Makefile.build:465: drivers/gpu/drm] Error 2
make[4]: *** [../scripts/Makefile.build:465: drivers/gpu] Error 2
make[3]: *** [../scripts/Makefile.build:465: drivers] Error 2
make[2]: *** [/kernel/Makefile:1994: .] Error 2
make[1]: Leaving directory '/kernel/build64-default'
make[1]: *** [/kernel/Makefile:251: __sub-make] Error 2
make: *** [Makefile:251: __sub-make] Error 2
+ cleanup
++ stat -c %u:%g /kernel
+ chown -R 1003:1003 /kernel



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

* Re: [PATCH v8 2/6] drm/xe/xe_gt_pagefault: Move pagefault struct to header
  2025-03-13 18:34 ` [PATCH v8 2/6] drm/xe/xe_gt_pagefault: Move pagefault struct to header Jonathan Cavitt
@ 2025-03-14 17:01   ` Michal Wajdeczko
  2025-03-14 22:06     ` Cavitt, Jonathan
  0 siblings, 1 reply; 27+ messages in thread
From: Michal Wajdeczko @ 2025-03-14 17:01 UTC (permalink / raw)
  To: Jonathan Cavitt, intel-xe
  Cc: saurabhg.gupta, alex.zuo, joonas.lahtinen, matthew.brost,
	jianxun.zhang, shuicheng.lin, dri-devel, michal.mzorek



On 13.03.2025 19:34, Jonathan Cavitt wrote:
> Move the pagefault struct from xe_gt_pagefault.c to the
> xe_gt_pagefault_types.h header file, along with the associated enum values.
> 
> v2:
> - Normalize names for common header (Matt Brost)
> 
> v3:
> - s/Migrate/Move (Michal W)
> - s/xe_pagefault/xe_gt_pagefault (Michal W)
> - Create new header file, xe_gt_pagefault_types.h (Michal W)
> - Add kernel docs (Michal W)
> 
> Signed-off-by: Jonathan Cavitt <jonathan.cavitt@intel.com>
> Cc: Michal Wajdeczko <Michal.Wajdeczko@intel.com>
> ---

...

> diff --git a/drivers/gpu/drm/xe/xe_gt_pagefault.h b/drivers/gpu/drm/xe/xe_gt_pagefault.h
> index 839c065a5e4c..69b700c4915a 100644
> --- a/drivers/gpu/drm/xe/xe_gt_pagefault.h
> +++ b/drivers/gpu/drm/xe/xe_gt_pagefault.h
> @@ -8,6 +8,8 @@
>  
>  #include <linux/types.h>
>  
> +#include "xe_gt_pagefault_types.h"

it's not needed here, move it to .c

> +
>  struct xe_gt;
>  struct xe_guc;
>  
> diff --git a/drivers/gpu/drm/xe/xe_gt_pagefault_types.h b/drivers/gpu/drm/xe/xe_gt_pagefault_types.h
> new file mode 100644
> index 000000000000..90b7085d4b8e
> --- /dev/null
> +++ b/drivers/gpu/drm/xe/xe_gt_pagefault_types.h
> @@ -0,0 +1,67 @@
> +/* SPDX-License-Identifier: MIT */
> +/*
> + * Copyright © 2022-2025 Intel Corporation
> + */
> +
> +#ifndef _XE_GT_PAGEFAULT_TYPES_H_
> +#define _XE_GT_PAGEFAULT_TYPES_H_
> +

don't forget to

#include <linux/types.h>

> +/**
> + * struct xe_gt_pagefault - Structure of pagefaults returned by the
> + * pagefault handler
> + */
> +struct xe_gt_pagefault {
> +	/** @page_addr: faulted address of this pagefault */
> +	u64 page_addr;
> +	/** @asid: ASID of this pagefault */
> +	u32 asid;
> +	/** @pdata: PDATA of this pagefault */
> +	u16 pdata;
> +	/** @vfid: VFID of this pagefault */
> +	u8 vfid;

btw, IIRC the VFID from the descriptor will be zero'ed
does it make sense to keep it here?

> +	/**
> +	 * @access_type: access type of this pagefault, as a value
> +	 * from xe_gt_pagefault_access_type
> +	 */
> +	u8 access_type;
> +	/**
> +	 * @fault_type: fault type of this pagefault, as a value
> +	 * from xe_gt_pagefault_fault_type
> +	 */
> +	u8 fault_type;
> +	/** @fault_level: fault level of this pagefault */
> +	u8 fault_level;
> +	/** @engine_class: engine class this pagefault was reported on */
> +	u8 engine_class;
> +	/** @engine_instance: engine instance this pagefault was reported on */
> +	u8 engine_instance;
> +	/** @fault_unsuccessful: flag for if the pagefault recovered or not */
> +	u8 fault_unsuccessful;
> +	/** @prefetch: unused */
> +	bool prefetch;
> +	/** @trva_fault: is set if this is a TRTT fault */
> +	bool trva_fault;
> +};
> +
> +/**
> + * enum xe_gt_pagefault_access_type - Access type reported to the xe_gt_pagefault
> + * struct.  Saved to xe_gt_pagefault@access_type

this seems to be copied from G2H descriptor as-is.
so shouldn't this be part of the GuC ABI?
or based on HW ABI if GuC is just a proxy

> + */
> +enum xe_gt_pagefault_access_type {
> +	XE_GT_PAGEFAULT_ACCESS_TYPE_READ = 0,
> +	XE_GT_PAGEFAULT_ACCESS_TYPE_WRITE = 1,
> +	XE_GT_PAGEFAULT_ACCESS_TYPE_ATOMIC = 2,
> +	XE_GT_PAGEFAULT_ACCESS_TYPE_RESERVED = 3,
> +};
> +
> +/**
> + * enum xe_gt_pagefault_fault_type - Fault type reported to the xe_gt_pagefault
> + * struct.  Saved to xe_gt_pagefault@fault_type

ditto

> + */
> +enum xe_gt_pagefault_fault_type {
> +	XE_GT_PAGEFAULT_TYPE_NOT_PRESENT = 0,
> +	XE_GT_PAGEFAULT_TYPE_WRITE_ACCESS_VIOLATION = 1,
> +	XE_GT_PAGEFAULT_TYPE_ATOMIC_ACCESS_VIOLATION = 2,
> +};
> +
> +#endif


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

* RE: [PATCH v8 2/6] drm/xe/xe_gt_pagefault: Move pagefault struct to header
  2025-03-14 17:01   ` Michal Wajdeczko
@ 2025-03-14 22:06     ` Cavitt, Jonathan
  2025-03-15 14:45       ` Michal Wajdeczko
  0 siblings, 1 reply; 27+ messages in thread
From: Cavitt, Jonathan @ 2025-03-14 22:06 UTC (permalink / raw)
  To: Wajdeczko, Michal, intel-xe@lists.freedesktop.org
  Cc: Gupta, saurabhg, Zuo, Alex, joonas.lahtinen@linux.intel.com,
	Brost, Matthew, Zhang, Jianxun, Lin, Shuicheng,
	dri-devel@lists.freedesktop.org, michal.mzorek@intel.com,
	Cavitt, Jonathan

-----Original Message-----
From: Wajdeczko, Michal <Michal.Wajdeczko@intel.com> 
Sent: Friday, March 14, 2025 10:02 AM
To: Cavitt, Jonathan <jonathan.cavitt@intel.com>; intel-xe@lists.freedesktop.org
Cc: Gupta, saurabhg <saurabhg.gupta@intel.com>; Zuo, Alex <alex.zuo@intel.com>; joonas.lahtinen@linux.intel.com; Brost, Matthew <matthew.brost@intel.com>; Zhang, Jianxun <jianxun.zhang@intel.com>; Lin, Shuicheng <shuicheng.lin@intel.com>; dri-devel@lists.freedesktop.org; michal.mzorek@intel.com
Subject: Re: [PATCH v8 2/6] drm/xe/xe_gt_pagefault: Move pagefault struct to header
> 
> On 13.03.2025 19:34, Jonathan Cavitt wrote:
> > Move the pagefault struct from xe_gt_pagefault.c to the
> > xe_gt_pagefault_types.h header file, along with the associated enum values.
> > 
> > v2:
> > - Normalize names for common header (Matt Brost)
> > 
> > v3:
> > - s/Migrate/Move (Michal W)
> > - s/xe_pagefault/xe_gt_pagefault (Michal W)
> > - Create new header file, xe_gt_pagefault_types.h (Michal W)
> > - Add kernel docs (Michal W)
> > 
> > Signed-off-by: Jonathan Cavitt <jonathan.cavitt@intel.com>
> > Cc: Michal Wajdeczko <Michal.Wajdeczko@intel.com>
> > ---
> 
> ...
> 
> > diff --git a/drivers/gpu/drm/xe/xe_gt_pagefault.h b/drivers/gpu/drm/xe/xe_gt_pagefault.h
> > index 839c065a5e4c..69b700c4915a 100644
> > --- a/drivers/gpu/drm/xe/xe_gt_pagefault.h
> > +++ b/drivers/gpu/drm/xe/xe_gt_pagefault.h
> > @@ -8,6 +8,8 @@
> >  
> >  #include <linux/types.h>
> >  
> > +#include "xe_gt_pagefault_types.h"
> 
> it's not needed here, move it to .c
> 
> > +
> >  struct xe_gt;
> >  struct xe_guc;
> >  
> > diff --git a/drivers/gpu/drm/xe/xe_gt_pagefault_types.h b/drivers/gpu/drm/xe/xe_gt_pagefault_types.h
> > new file mode 100644
> > index 000000000000..90b7085d4b8e
> > --- /dev/null
> > +++ b/drivers/gpu/drm/xe/xe_gt_pagefault_types.h
> > @@ -0,0 +1,67 @@
> > +/* SPDX-License-Identifier: MIT */
> > +/*
> > + * Copyright (c) 2022-2025 Intel Corporation
> > + */
> > +
> > +#ifndef _XE_GT_PAGEFAULT_TYPES_H_
> > +#define _XE_GT_PAGEFAULT_TYPES_H_
> > +
> 
> don't forget to
> 
> #include <linux/types.h>

That explains why the kernel failed to compile on CI.  It was compiling just
fine locally, so that's why I missed this.

> 
> > +/**
> > + * struct xe_gt_pagefault - Structure of pagefaults returned by the
> > + * pagefault handler
> > + */
> > +struct xe_gt_pagefault {
> > +	/** @page_addr: faulted address of this pagefault */
> > +	u64 page_addr;
> > +	/** @asid: ASID of this pagefault */
> > +	u32 asid;
> > +	/** @pdata: PDATA of this pagefault */
> > +	u16 pdata;
> > +	/** @vfid: VFID of this pagefault */
> > +	u8 vfid;
> 
> btw, IIRC the VFID from the descriptor will be zero'ed
> does it make sense to keep it here?

Is the argument that every time pf->vfid is accessed, it's guaranteed to be
zero?  I can't counter that claim, but wouldn't it be safer to keep reporting
the VFID in case we ever hit a case where it's no longer zero?

Also, did we know it would always be zero when we were making the
pagefault struct originally?  If so, why did we include the vfid originally?

> 
> > +	/**
> > +	 * @access_type: access type of this pagefault, as a value
> > +	 * from xe_gt_pagefault_access_type
> > +	 */
> > +	u8 access_type;
> > +	/**
> > +	 * @fault_type: fault type of this pagefault, as a value
> > +	 * from xe_gt_pagefault_fault_type
> > +	 */
> > +	u8 fault_type;
> > +	/** @fault_level: fault level of this pagefault */
> > +	u8 fault_level;
> > +	/** @engine_class: engine class this pagefault was reported on */
> > +	u8 engine_class;
> > +	/** @engine_instance: engine instance this pagefault was reported on */
> > +	u8 engine_instance;
> > +	/** @fault_unsuccessful: flag for if the pagefault recovered or not */
> > +	u8 fault_unsuccessful;
> > +	/** @prefetch: unused */
> > +	bool prefetch;
> > +	/** @trva_fault: is set if this is a TRTT fault */
> > +	bool trva_fault;
> > +};
> > +
> > +/**
> > + * enum xe_gt_pagefault_access_type - Access type reported to the xe_gt_pagefault
> > + * struct.  Saved to xe_gt_pagefault@access_type
> 
> this seems to be copied from G2H descriptor as-is.
> so shouldn't this be part of the GuC ABI?
> or based on HW ABI if GuC is just a proxy

What information should I be including in the kernel docs for these enums?
-Jonathan Cavitt

> 
> > + */
> > +enum xe_gt_pagefault_access_type {
> > +	XE_GT_PAGEFAULT_ACCESS_TYPE_READ = 0,
> > +	XE_GT_PAGEFAULT_ACCESS_TYPE_WRITE = 1,
> > +	XE_GT_PAGEFAULT_ACCESS_TYPE_ATOMIC = 2,
> > +	XE_GT_PAGEFAULT_ACCESS_TYPE_RESERVED = 3,
> > +};
> > +
> > +/**
> > + * enum xe_gt_pagefault_fault_type - Fault type reported to the xe_gt_pagefault
> > + * struct.  Saved to xe_gt_pagefault@fault_type
> 
> ditto
> 
> > + */
> > +enum xe_gt_pagefault_fault_type {
> > +	XE_GT_PAGEFAULT_TYPE_NOT_PRESENT = 0,
> > +	XE_GT_PAGEFAULT_TYPE_WRITE_ACCESS_VIOLATION = 1,
> > +	XE_GT_PAGEFAULT_TYPE_ATOMIC_ACCESS_VIOLATION = 2,
> > +};
> > +
> > +#endif
> 
> 

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

* Re: [PATCH v8 2/6] drm/xe/xe_gt_pagefault: Move pagefault struct to header
  2025-03-14 22:06     ` Cavitt, Jonathan
@ 2025-03-15 14:45       ` Michal Wajdeczko
  2025-03-17 20:55         ` Cavitt, Jonathan
  0 siblings, 1 reply; 27+ messages in thread
From: Michal Wajdeczko @ 2025-03-15 14:45 UTC (permalink / raw)
  To: Cavitt, Jonathan, intel-xe@lists.freedesktop.org
  Cc: Gupta, saurabhg, Zuo, Alex, joonas.lahtinen@linux.intel.com,
	Brost, Matthew, Zhang, Jianxun, Lin, Shuicheng,
	dri-devel@lists.freedesktop.org, michal.mzorek@intel.com



On 14.03.2025 23:06, Cavitt, Jonathan wrote:
> -----Original Message-----
> From: Wajdeczko, Michal <Michal.Wajdeczko@intel.com> 
> Sent: Friday, March 14, 2025 10:02 AM
> To: Cavitt, Jonathan <jonathan.cavitt@intel.com>; intel-xe@lists.freedesktop.org
> Cc: Gupta, saurabhg <saurabhg.gupta@intel.com>; Zuo, Alex <alex.zuo@intel.com>; joonas.lahtinen@linux.intel.com; Brost, Matthew <matthew.brost@intel.com>; Zhang, Jianxun <jianxun.zhang@intel.com>; Lin, Shuicheng <shuicheng.lin@intel.com>; dri-devel@lists.freedesktop.org; michal.mzorek@intel.com
> Subject: Re: [PATCH v8 2/6] drm/xe/xe_gt_pagefault: Move pagefault struct to header
>>
>> On 13.03.2025 19:34, Jonathan Cavitt wrote:
>>> Move the pagefault struct from xe_gt_pagefault.c to the
>>> xe_gt_pagefault_types.h header file, along with the associated enum values.
>>>
>>> v2:
>>> - Normalize names for common header (Matt Brost)
>>>
>>> v3:
>>> - s/Migrate/Move (Michal W)
>>> - s/xe_pagefault/xe_gt_pagefault (Michal W)
>>> - Create new header file, xe_gt_pagefault_types.h (Michal W)
>>> - Add kernel docs (Michal W)
>>>
>>> Signed-off-by: Jonathan Cavitt <jonathan.cavitt@intel.com>
>>> Cc: Michal Wajdeczko <Michal.Wajdeczko@intel.com>
>>> ---
>>
>> ...
>>
>>> diff --git a/drivers/gpu/drm/xe/xe_gt_pagefault.h b/drivers/gpu/drm/xe/xe_gt_pagefault.h
>>> index 839c065a5e4c..69b700c4915a 100644
>>> --- a/drivers/gpu/drm/xe/xe_gt_pagefault.h
>>> +++ b/drivers/gpu/drm/xe/xe_gt_pagefault.h
>>> @@ -8,6 +8,8 @@
>>>  
>>>  #include <linux/types.h>
>>>  
>>> +#include "xe_gt_pagefault_types.h"
>>
>> it's not needed here, move it to .c
>>
>>> +
>>>  struct xe_gt;
>>>  struct xe_guc;
>>>  
>>> diff --git a/drivers/gpu/drm/xe/xe_gt_pagefault_types.h b/drivers/gpu/drm/xe/xe_gt_pagefault_types.h
>>> new file mode 100644
>>> index 000000000000..90b7085d4b8e
>>> --- /dev/null
>>> +++ b/drivers/gpu/drm/xe/xe_gt_pagefault_types.h
>>> @@ -0,0 +1,67 @@
>>> +/* SPDX-License-Identifier: MIT */
>>> +/*
>>> + * Copyright (c) 2022-2025 Intel Corporation
>>> + */
>>> +
>>> +#ifndef _XE_GT_PAGEFAULT_TYPES_H_
>>> +#define _XE_GT_PAGEFAULT_TYPES_H_
>>> +
>>
>> don't forget to
>>
>> #include <linux/types.h>
> 
> That explains why the kernel failed to compile on CI.  It was compiling just
> fine locally, so that's why I missed this.
> 
>>
>>> +/**
>>> + * struct xe_gt_pagefault - Structure of pagefaults returned by the
>>> + * pagefault handler
>>> + */
>>> +struct xe_gt_pagefault {
>>> +	/** @page_addr: faulted address of this pagefault */
>>> +	u64 page_addr;
>>> +	/** @asid: ASID of this pagefault */
>>> +	u32 asid;
>>> +	/** @pdata: PDATA of this pagefault */
>>> +	u16 pdata;
>>> +	/** @vfid: VFID of this pagefault */
>>> +	u8 vfid;
>>
>> btw, IIRC the VFID from the descriptor will be zero'ed
>> does it make sense to keep it here?
> 
> Is the argument that every time pf->vfid is accessed, it's guaranteed to be

it's FIELD_GET(PFD_VFID, desc->dw2) guaranteed to be zero

> zero?  I can't counter that claim, but wouldn't it be safer to keep reporting
> the VFID in case we ever hit a case where it's no longer zero?

it can't be non-zero, look at GuC ABI spec that says:

".. with the VF number being zero’d out in the descriptor."

> 
> Also, did we know it would always be zero when we were making the
> pagefault struct originally?  If so, why did we include the vfid originally?

dunno, ask authors, it was pushed part of the initial commit
dd08ebf6c352 that was *not* going through normal review cycle

> 
>>
>>> +	/**
>>> +	 * @access_type: access type of this pagefault, as a value
>>> +	 * from xe_gt_pagefault_access_type
>>> +	 */
>>> +	u8 access_type;
>>> +	/**
>>> +	 * @fault_type: fault type of this pagefault, as a value
>>> +	 * from xe_gt_pagefault_fault_type
>>> +	 */
>>> +	u8 fault_type;
>>> +	/** @fault_level: fault level of this pagefault */
>>> +	u8 fault_level;
>>> +	/** @engine_class: engine class this pagefault was reported on */
>>> +	u8 engine_class;
>>> +	/** @engine_instance: engine instance this pagefault was reported on */
>>> +	u8 engine_instance;
>>> +	/** @fault_unsuccessful: flag for if the pagefault recovered or not */
>>> +	u8 fault_unsuccessful;
>>> +	/** @prefetch: unused */
>>> +	bool prefetch;
>>> +	/** @trva_fault: is set if this is a TRTT fault */
>>> +	bool trva_fault;
>>> +};
>>> +
>>> +/**
>>> + * enum xe_gt_pagefault_access_type - Access type reported to the xe_gt_pagefault
>>> + * struct.  Saved to xe_gt_pagefault@access_type
>>
>> this seems to be copied from G2H descriptor as-is.
>> so shouldn't this be part of the GuC ABI?
>> or based on HW ABI if GuC is just a proxy
> 
> What information should I be including in the kernel docs for these enums?

are you asking about xe enums or GuC ABI defs/enums?

for the xe enums, we can say this is what HW/GuC provides
for the HW defs, we can likely drop kernel-doc
we can just point to the Bspec in the commit msg

> -Jonathan Cavitt
> 
>>
>>> + */
>>> +enum xe_gt_pagefault_access_type {
>>> +	XE_GT_PAGEFAULT_ACCESS_TYPE_READ = 0,
>>> +	XE_GT_PAGEFAULT_ACCESS_TYPE_WRITE = 1,
>>> +	XE_GT_PAGEFAULT_ACCESS_TYPE_ATOMIC = 2,
>>> +	XE_GT_PAGEFAULT_ACCESS_TYPE_RESERVED = 3,
>>> +};
>>> +
>>> +/**
>>> + * enum xe_gt_pagefault_fault_type - Fault type reported to the xe_gt_pagefault
>>> + * struct.  Saved to xe_gt_pagefault@fault_type
>>
>> ditto
>>
>>> + */
>>> +enum xe_gt_pagefault_fault_type {
>>> +	XE_GT_PAGEFAULT_TYPE_NOT_PRESENT = 0,
>>> +	XE_GT_PAGEFAULT_TYPE_WRITE_ACCESS_VIOLATION = 1,
>>> +	XE_GT_PAGEFAULT_TYPE_ATOMIC_ACCESS_VIOLATION = 2,
>>> +};
>>> +
>>> +#endif
>>
>>


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

* RE: [PATCH v8 2/6] drm/xe/xe_gt_pagefault: Move pagefault struct to header
  2025-03-15 14:45       ` Michal Wajdeczko
@ 2025-03-17 20:55         ` Cavitt, Jonathan
  2025-03-18  8:44           ` Michal Wajdeczko
  0 siblings, 1 reply; 27+ messages in thread
From: Cavitt, Jonathan @ 2025-03-17 20:55 UTC (permalink / raw)
  To: Wajdeczko, Michal, intel-xe@lists.freedesktop.org
  Cc: Gupta, saurabhg, Zuo, Alex, joonas.lahtinen@linux.intel.com,
	Brost, Matthew, Zhang, Jianxun, Lin, Shuicheng,
	dri-devel@lists.freedesktop.org, michal.mzorek@intel.com,
	Cavitt, Jonathan

-----Original Message-----
From: Wajdeczko, Michal <Michal.Wajdeczko@intel.com> 
Sent: Saturday, March 15, 2025 7:45 AM
To: Cavitt, Jonathan <jonathan.cavitt@intel.com>; intel-xe@lists.freedesktop.org
Cc: Gupta, saurabhg <saurabhg.gupta@intel.com>; Zuo, Alex <alex.zuo@intel.com>; joonas.lahtinen@linux.intel.com; Brost, Matthew <matthew.brost@intel.com>; Zhang, Jianxun <jianxun.zhang@intel.com>; Lin, Shuicheng <shuicheng.lin@intel.com>; dri-devel@lists.freedesktop.org; michal.mzorek@intel.com
Subject: Re: [PATCH v8 2/6] drm/xe/xe_gt_pagefault: Move pagefault struct to header
> 
> On 14.03.2025 23:06, Cavitt, Jonathan wrote:
> > -----Original Message-----
> > From: Wajdeczko, Michal <Michal.Wajdeczko@intel.com> 
> > Sent: Friday, March 14, 2025 10:02 AM
> > To: Cavitt, Jonathan <jonathan.cavitt@intel.com>; intel-xe@lists.freedesktop.org
> > Cc: Gupta, saurabhg <saurabhg.gupta@intel.com>; Zuo, Alex <alex.zuo@intel.com>; joonas.lahtinen@linux.intel.com; Brost, Matthew <matthew.brost@intel.com>; Zhang, Jianxun <jianxun.zhang@intel.com>; Lin, Shuicheng <shuicheng.lin@intel.com>; dri-devel@lists.freedesktop.org; michal.mzorek@intel.com
> > Subject: Re: [PATCH v8 2/6] drm/xe/xe_gt_pagefault: Move pagefault struct to header
> >>
> >> On 13.03.2025 19:34, Jonathan Cavitt wrote:
> >>> Move the pagefault struct from xe_gt_pagefault.c to the
> >>> xe_gt_pagefault_types.h header file, along with the associated enum values.
> >>>
> >>> v2:
> >>> - Normalize names for common header (Matt Brost)
> >>>
> >>> v3:
> >>> - s/Migrate/Move (Michal W)
> >>> - s/xe_pagefault/xe_gt_pagefault (Michal W)
> >>> - Create new header file, xe_gt_pagefault_types.h (Michal W)
> >>> - Add kernel docs (Michal W)
> >>>
> >>> Signed-off-by: Jonathan Cavitt <jonathan.cavitt@intel.com>
> >>> Cc: Michal Wajdeczko <Michal.Wajdeczko@intel.com>
> >>> ---
> >>
> >> ...
> >>
> >>> diff --git a/drivers/gpu/drm/xe/xe_gt_pagefault.h b/drivers/gpu/drm/xe/xe_gt_pagefault.h
> >>> index 839c065a5e4c..69b700c4915a 100644
> >>> --- a/drivers/gpu/drm/xe/xe_gt_pagefault.h
> >>> +++ b/drivers/gpu/drm/xe/xe_gt_pagefault.h
> >>> @@ -8,6 +8,8 @@
> >>>  
> >>>  #include <linux/types.h>
> >>>  
> >>> +#include "xe_gt_pagefault_types.h"
> >>
> >> it's not needed here, move it to .c
> >>
> >>> +
> >>>  struct xe_gt;
> >>>  struct xe_guc;
> >>>  
> >>> diff --git a/drivers/gpu/drm/xe/xe_gt_pagefault_types.h b/drivers/gpu/drm/xe/xe_gt_pagefault_types.h
> >>> new file mode 100644
> >>> index 000000000000..90b7085d4b8e
> >>> --- /dev/null
> >>> +++ b/drivers/gpu/drm/xe/xe_gt_pagefault_types.h
> >>> @@ -0,0 +1,67 @@
> >>> +/* SPDX-License-Identifier: MIT */
> >>> +/*
> >>> + * Copyright (c) 2022-2025 Intel Corporation
> >>> + */
> >>> +
> >>> +#ifndef _XE_GT_PAGEFAULT_TYPES_H_
> >>> +#define _XE_GT_PAGEFAULT_TYPES_H_
> >>> +
> >>
> >> don't forget to
> >>
> >> #include <linux/types.h>
> > 
> > That explains why the kernel failed to compile on CI.  It was compiling just
> > fine locally, so that's why I missed this.
> > 
> >>
> >>> +/**
> >>> + * struct xe_gt_pagefault - Structure of pagefaults returned by the
> >>> + * pagefault handler
> >>> + */
> >>> +struct xe_gt_pagefault {
> >>> +	/** @page_addr: faulted address of this pagefault */
> >>> +	u64 page_addr;
> >>> +	/** @asid: ASID of this pagefault */
> >>> +	u32 asid;
> >>> +	/** @pdata: PDATA of this pagefault */
> >>> +	u16 pdata;
> >>> +	/** @vfid: VFID of this pagefault */
> >>> +	u8 vfid;
> >>
> >> btw, IIRC the VFID from the descriptor will be zero'ed
> >> does it make sense to keep it here?
> > 
> > Is the argument that every time pf->vfid is accessed, it's guaranteed to be
> 
> it's FIELD_GET(PFD_VFID, desc->dw2) guaranteed to be zero
> 
> > zero?  I can't counter that claim, but wouldn't it be safer to keep reporting
> > the VFID in case we ever hit a case where it's no longer zero?
> 
> it can't be non-zero, look at GuC ABI spec that says:
> 
> ".. with the VF number being zero’d out in the descriptor."
> 
> > 
> > Also, did we know it would always be zero when we were making the
> > pagefault struct originally?  If so, why did we include the vfid originally?
> 
> dunno, ask authors, it was pushed part of the initial commit
> dd08ebf6c352 that was *not* going through normal review cycle
> 
> > 
> >>
> >>> +	/**
> >>> +	 * @access_type: access type of this pagefault, as a value
> >>> +	 * from xe_gt_pagefault_access_type
> >>> +	 */
> >>> +	u8 access_type;
> >>> +	/**
> >>> +	 * @fault_type: fault type of this pagefault, as a value
> >>> +	 * from xe_gt_pagefault_fault_type
> >>> +	 */
> >>> +	u8 fault_type;
> >>> +	/** @fault_level: fault level of this pagefault */
> >>> +	u8 fault_level;
> >>> +	/** @engine_class: engine class this pagefault was reported on */
> >>> +	u8 engine_class;
> >>> +	/** @engine_instance: engine instance this pagefault was reported on */
> >>> +	u8 engine_instance;
> >>> +	/** @fault_unsuccessful: flag for if the pagefault recovered or not */
> >>> +	u8 fault_unsuccessful;
> >>> +	/** @prefetch: unused */
> >>> +	bool prefetch;
> >>> +	/** @trva_fault: is set if this is a TRTT fault */
> >>> +	bool trva_fault;
> >>> +};
> >>> +
> >>> +/**
> >>> + * enum xe_gt_pagefault_access_type - Access type reported to the xe_gt_pagefault
> >>> + * struct.  Saved to xe_gt_pagefault@access_type
> >>
> >> this seems to be copied from G2H descriptor as-is.
> >> so shouldn't this be part of the GuC ABI?
> >> or based on HW ABI if GuC is just a proxy
> > 
> > What information should I be including in the kernel docs for these enums?
> 
> are you asking about xe enums or GuC ABI defs/enums?
> 
> for the xe enums, we can say this is what HW/GuC provides
> for the HW defs, we can likely drop kernel-doc
> we can just point to the Bspec in the commit msg

Could you please provide the bspec number for the pagefault
access and fault types?  I tried searching for them on my end but
wasn't able to find them.
-Jonathan Cavitt

> 
> > -Jonathan Cavitt
> > 
> >>
> >>> + */
> >>> +enum xe_gt_pagefault_access_type {
> >>> +	XE_GT_PAGEFAULT_ACCESS_TYPE_READ = 0,
> >>> +	XE_GT_PAGEFAULT_ACCESS_TYPE_WRITE = 1,
> >>> +	XE_GT_PAGEFAULT_ACCESS_TYPE_ATOMIC = 2,
> >>> +	XE_GT_PAGEFAULT_ACCESS_TYPE_RESERVED = 3,
> >>> +};
> >>> +
> >>> +/**
> >>> + * enum xe_gt_pagefault_fault_type - Fault type reported to the xe_gt_pagefault
> >>> + * struct.  Saved to xe_gt_pagefault@fault_type
> >>
> >> ditto
> >>
> >>> + */
> >>> +enum xe_gt_pagefault_fault_type {
> >>> +	XE_GT_PAGEFAULT_TYPE_NOT_PRESENT = 0,
> >>> +	XE_GT_PAGEFAULT_TYPE_WRITE_ACCESS_VIOLATION = 1,
> >>> +	XE_GT_PAGEFAULT_TYPE_ATOMIC_ACCESS_VIOLATION = 2,
> >>> +};
> >>> +
> >>> +#endif
> >>
> >>
> 
> 

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

* Re: [PATCH v8 2/6] drm/xe/xe_gt_pagefault: Move pagefault struct to header
  2025-03-17 20:55         ` Cavitt, Jonathan
@ 2025-03-18  8:44           ` Michal Wajdeczko
  0 siblings, 0 replies; 27+ messages in thread
From: Michal Wajdeczko @ 2025-03-18  8:44 UTC (permalink / raw)
  To: Cavitt, Jonathan, intel-xe@lists.freedesktop.org
  Cc: Gupta, saurabhg, Zuo, Alex, joonas.lahtinen@linux.intel.com,
	Brost, Matthew, Zhang, Jianxun, Lin, Shuicheng,
	dri-devel@lists.freedesktop.org



On 17.03.2025 21:55, Cavitt, Jonathan wrote:
> -----Original Message-----
> From: Wajdeczko, Michal <Michal.Wajdeczko@intel.com> 
> Sent: Saturday, March 15, 2025 7:45 AM
> To: Cavitt, Jonathan <jonathan.cavitt@intel.com>; intel-xe@lists.freedesktop.org
> Cc: Gupta, saurabhg <saurabhg.gupta@intel.com>; Zuo, Alex <alex.zuo@intel.com>; joonas.lahtinen@linux.intel.com; Brost, Matthew <matthew.brost@intel.com>; Zhang, Jianxun <jianxun.zhang@intel.com>; Lin, Shuicheng <shuicheng.lin@intel.com>; dri-devel@lists.freedesktop.org; michal.mzorek@intel.com
> Subject: Re: [PATCH v8 2/6] drm/xe/xe_gt_pagefault: Move pagefault struct to header
>>
>> On 14.03.2025 23:06, Cavitt, Jonathan wrote:
>>> -----Original Message-----
>>> From: Wajdeczko, Michal <Michal.Wajdeczko@intel.com> 
>>> Sent: Friday, March 14, 2025 10:02 AM
>>> To: Cavitt, Jonathan <jonathan.cavitt@intel.com>; intel-xe@lists.freedesktop.org
>>> Cc: Gupta, saurabhg <saurabhg.gupta@intel.com>; Zuo, Alex <alex.zuo@intel.com>; joonas.lahtinen@linux.intel.com; Brost, Matthew <matthew.brost@intel.com>; Zhang, Jianxun <jianxun.zhang@intel.com>; Lin, Shuicheng <shuicheng.lin@intel.com>; dri-devel@lists.freedesktop.org; michal.mzorek@intel.com
>>> Subject: Re: [PATCH v8 2/6] drm/xe/xe_gt_pagefault: Move pagefault struct to header
>>>>
>>>> On 13.03.2025 19:34, Jonathan Cavitt wrote:
>>>>> Move the pagefault struct from xe_gt_pagefault.c to the
>>>>> xe_gt_pagefault_types.h header file, along with the associated enum values.
>>>>>
>>>>> v2:
>>>>> - Normalize names for common header (Matt Brost)
>>>>>
>>>>> v3:
>>>>> - s/Migrate/Move (Michal W)
>>>>> - s/xe_pagefault/xe_gt_pagefault (Michal W)
>>>>> - Create new header file, xe_gt_pagefault_types.h (Michal W)
>>>>> - Add kernel docs (Michal W)
>>>>>
>>>>> Signed-off-by: Jonathan Cavitt <jonathan.cavitt@intel.com>
>>>>> Cc: Michal Wajdeczko <Michal.Wajdeczko@intel.com>
>>>>> ---
>>>>
>>>> ...
>>>>
>>>>> diff --git a/drivers/gpu/drm/xe/xe_gt_pagefault.h b/drivers/gpu/drm/xe/xe_gt_pagefault.h
>>>>> index 839c065a5e4c..69b700c4915a 100644
>>>>> --- a/drivers/gpu/drm/xe/xe_gt_pagefault.h
>>>>> +++ b/drivers/gpu/drm/xe/xe_gt_pagefault.h
>>>>> @@ -8,6 +8,8 @@
>>>>>  
>>>>>  #include <linux/types.h>
>>>>>  
>>>>> +#include "xe_gt_pagefault_types.h"
>>>>
>>>> it's not needed here, move it to .c
>>>>
>>>>> +
>>>>>  struct xe_gt;
>>>>>  struct xe_guc;
>>>>>  
>>>>> diff --git a/drivers/gpu/drm/xe/xe_gt_pagefault_types.h b/drivers/gpu/drm/xe/xe_gt_pagefault_types.h
>>>>> new file mode 100644
>>>>> index 000000000000..90b7085d4b8e
>>>>> --- /dev/null
>>>>> +++ b/drivers/gpu/drm/xe/xe_gt_pagefault_types.h
>>>>> @@ -0,0 +1,67 @@
>>>>> +/* SPDX-License-Identifier: MIT */
>>>>> +/*
>>>>> + * Copyright (c) 2022-2025 Intel Corporation
>>>>> + */
>>>>> +
>>>>> +#ifndef _XE_GT_PAGEFAULT_TYPES_H_
>>>>> +#define _XE_GT_PAGEFAULT_TYPES_H_
>>>>> +
>>>>
>>>> don't forget to
>>>>
>>>> #include <linux/types.h>
>>>
>>> That explains why the kernel failed to compile on CI.  It was compiling just
>>> fine locally, so that's why I missed this.
>>>
>>>>
>>>>> +/**
>>>>> + * struct xe_gt_pagefault - Structure of pagefaults returned by the
>>>>> + * pagefault handler
>>>>> + */
>>>>> +struct xe_gt_pagefault {
>>>>> +	/** @page_addr: faulted address of this pagefault */
>>>>> +	u64 page_addr;
>>>>> +	/** @asid: ASID of this pagefault */
>>>>> +	u32 asid;
>>>>> +	/** @pdata: PDATA of this pagefault */
>>>>> +	u16 pdata;
>>>>> +	/** @vfid: VFID of this pagefault */
>>>>> +	u8 vfid;
>>>>
>>>> btw, IIRC the VFID from the descriptor will be zero'ed
>>>> does it make sense to keep it here?
>>>
>>> Is the argument that every time pf->vfid is accessed, it's guaranteed to be
>>
>> it's FIELD_GET(PFD_VFID, desc->dw2) guaranteed to be zero
>>
>>> zero?  I can't counter that claim, but wouldn't it be safer to keep reporting
>>> the VFID in case we ever hit a case where it's no longer zero?
>>
>> it can't be non-zero, look at GuC ABI spec that says:
>>
>> ".. with the VF number being zero’d out in the descriptor."
>>
>>>
>>> Also, did we know it would always be zero when we were making the
>>> pagefault struct originally?  If so, why did we include the vfid originally?
>>
>> dunno, ask authors, it was pushed part of the initial commit
>> dd08ebf6c352 that was *not* going through normal review cycle
>>
>>>
>>>>
>>>>> +	/**
>>>>> +	 * @access_type: access type of this pagefault, as a value
>>>>> +	 * from xe_gt_pagefault_access_type
>>>>> +	 */
>>>>> +	u8 access_type;
>>>>> +	/**
>>>>> +	 * @fault_type: fault type of this pagefault, as a value
>>>>> +	 * from xe_gt_pagefault_fault_type
>>>>> +	 */
>>>>> +	u8 fault_type;
>>>>> +	/** @fault_level: fault level of this pagefault */
>>>>> +	u8 fault_level;
>>>>> +	/** @engine_class: engine class this pagefault was reported on */
>>>>> +	u8 engine_class;
>>>>> +	/** @engine_instance: engine instance this pagefault was reported on */
>>>>> +	u8 engine_instance;
>>>>> +	/** @fault_unsuccessful: flag for if the pagefault recovered or not */
>>>>> +	u8 fault_unsuccessful;
>>>>> +	/** @prefetch: unused */
>>>>> +	bool prefetch;
>>>>> +	/** @trva_fault: is set if this is a TRTT fault */
>>>>> +	bool trva_fault;
>>>>> +};
>>>>> +
>>>>> +/**
>>>>> + * enum xe_gt_pagefault_access_type - Access type reported to the xe_gt_pagefault
>>>>> + * struct.  Saved to xe_gt_pagefault@access_type
>>>>
>>>> this seems to be copied from G2H descriptor as-is.
>>>> so shouldn't this be part of the GuC ABI?
>>>> or based on HW ABI if GuC is just a proxy
>>>
>>> What information should I be including in the kernel docs for these enums?
>>
>> are you asking about xe enums or GuC ABI defs/enums?
>>
>> for the xe enums, we can say this is what HW/GuC provides
>> for the HW defs, we can likely drop kernel-doc
>> we can just point to the Bspec in the commit msg
> 
> Could you please provide the bspec number for the pagefault
> access and fault types?  I tried searching for them on my end but
> wasn't able to find them.

try this one

Bspec: 77412

> -Jonathan Cavitt
> 
>>
>>> -Jonathan Cavitt
>>>
>>>>
>>>>> + */
>>>>> +enum xe_gt_pagefault_access_type {
>>>>> +	XE_GT_PAGEFAULT_ACCESS_TYPE_READ = 0,
>>>>> +	XE_GT_PAGEFAULT_ACCESS_TYPE_WRITE = 1,
>>>>> +	XE_GT_PAGEFAULT_ACCESS_TYPE_ATOMIC = 2,
>>>>> +	XE_GT_PAGEFAULT_ACCESS_TYPE_RESERVED = 3,
>>>>> +};
>>>>> +
>>>>> +/**
>>>>> + * enum xe_gt_pagefault_fault_type - Fault type reported to the xe_gt_pagefault
>>>>> + * struct.  Saved to xe_gt_pagefault@fault_type
>>>>
>>>> ditto
>>>>
>>>>> + */
>>>>> +enum xe_gt_pagefault_fault_type {
>>>>> +	XE_GT_PAGEFAULT_TYPE_NOT_PRESENT = 0,
>>>>> +	XE_GT_PAGEFAULT_TYPE_WRITE_ACCESS_VIOLATION = 1,
>>>>> +	XE_GT_PAGEFAULT_TYPE_ATOMIC_ACCESS_VIOLATION = 2,
>>>>> +};
>>>>> +
>>>>> +#endif
>>>>
>>>>
>>
>>


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

* Re: [PATCH v8 6/6] drm/xe/xe_vm: Implement xe_vm_get_property_ioctl
  2025-03-13 18:34 ` [PATCH v8 6/6] drm/xe/xe_vm: Implement xe_vm_get_property_ioctl Jonathan Cavitt
@ 2025-03-18 17:48   ` Jianxun Zhang
  2025-03-18 18:12     ` Cavitt, Jonathan
  2025-03-19 23:58   ` Jianxun Zhang
  1 sibling, 1 reply; 27+ messages in thread
From: Jianxun Zhang @ 2025-03-18 17:48 UTC (permalink / raw)
  To: Jonathan Cavitt, intel-xe
  Cc: saurabhg.gupta, alex.zuo, joonas.lahtinen, matthew.brost,
	shuicheng.lin, dri-devel, Michal.Wajdeczko, michal.mzorek



On 3/13/25 11:34, Jonathan Cavitt wrote:
> Add support for userspace to request a list of observed faults
> from a specified VM.
> 
> v2:
> - Only allow querying of failed pagefaults (Matt Brost)
> 
> v3:
> - Remove unnecessary size parameter from helper function, as it
>    is a property of the arguments. (jcavitt)
> - Remove unnecessary copy_from_user (Jainxun)
> - Set address_precision to 1 (Jainxun)
> - Report max size instead of dynamic size for memory allocation
>    purposes.  Total memory usage is reported separately.
> 
> v4:
> - Return int from xe_vm_get_property_size (Shuicheng)
> - Fix memory leak (Shuicheng)
> - Remove unnecessary size variable (jcavitt)
> 
> v5:
> - Rename ioctl to xe_vm_get_faults_ioctl (jcavitt)
> - Update fill_property_pfs to eliminate need for kzalloc (Jianxun)
> 
> v6:
> - Repair and move fill_faults break condition (Dan Carpenter)
> - Free vm after use (jcavitt)
> - Combine assertions (jcavitt)
> - Expand size check in xe_vm_get_faults_ioctl (jcavitt)
> - Remove return mask from fill_faults, as return is already -EFAULT or 0
>    (jcavitt)
> 
> v7:
> - Revert back to using xe_vm_get_property_ioctl
> - Apply better copy_to_user logic (jcavitt)
> 
> Signed-off-by: Jonathan Cavitt <jonathan.cavitt@intel.com>
> Suggested-by: Matthew Brost <matthew.brost@intel.com>
> Cc: Jainxun Zhang <jianxun.zhang@intel.com>
> Cc: Shuicheng Lin <shuicheng.lin@intel.com>
> ---
>   drivers/gpu/drm/xe/xe_device.c |   3 +
>   drivers/gpu/drm/xe/xe_vm.c     | 134 +++++++++++++++++++++++++++++++++
>   drivers/gpu/drm/xe/xe_vm.h     |   2 +
>   3 files changed, 139 insertions(+)
> 
> diff --git a/drivers/gpu/drm/xe/xe_device.c b/drivers/gpu/drm/xe/xe_device.c
> index b2f656b2a563..74e510cb0e47 100644
> --- a/drivers/gpu/drm/xe/xe_device.c
> +++ b/drivers/gpu/drm/xe/xe_device.c
> @@ -194,6 +194,9 @@ static const struct drm_ioctl_desc xe_ioctls[] = {
>   	DRM_IOCTL_DEF_DRV(XE_WAIT_USER_FENCE, xe_wait_user_fence_ioctl,
>   			  DRM_RENDER_ALLOW),
>   	DRM_IOCTL_DEF_DRV(XE_OBSERVATION, xe_observation_ioctl, DRM_RENDER_ALLOW),
> +	DRM_IOCTL_DEF_DRV(XE_VM_GET_PROPERTY, xe_vm_get_property_ioctl,
> +			  DRM_RENDER_ALLOW),
> +
>   };
>   
>   static long xe_drm_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
> diff --git a/drivers/gpu/drm/xe/xe_vm.c b/drivers/gpu/drm/xe/xe_vm.c
> index 067a9cedcad9..521f0032d9e2 100644
> --- a/drivers/gpu/drm/xe/xe_vm.c
> +++ b/drivers/gpu/drm/xe/xe_vm.c
> @@ -42,6 +42,14 @@
>   #include "xe_wa.h"
>   #include "xe_hmm.h"
>   
> +static const u16 xe_to_user_engine_class[] = {
> +	[XE_ENGINE_CLASS_RENDER] = DRM_XE_ENGINE_CLASS_RENDER,
> +	[XE_ENGINE_CLASS_COPY] = DRM_XE_ENGINE_CLASS_COPY,
> +	[XE_ENGINE_CLASS_VIDEO_DECODE] = DRM_XE_ENGINE_CLASS_VIDEO_DECODE,
> +	[XE_ENGINE_CLASS_VIDEO_ENHANCE] = DRM_XE_ENGINE_CLASS_VIDEO_ENHANCE,
> +	[XE_ENGINE_CLASS_COMPUTE] = DRM_XE_ENGINE_CLASS_COMPUTE,
> +};
> +
>   static struct drm_gem_object *xe_vm_obj(struct xe_vm *vm)
>   {
>   	return vm->gpuvm.r_obj;
> @@ -3551,6 +3559,132 @@ int xe_vm_bind_ioctl(struct drm_device *dev, void *data, struct drm_file *file)
>   	return err;
>   }
>   
> +static int xe_vm_get_property_size(struct xe_vm *vm, u32 property)
> +{
> +	int size = -EINVAL;
> +
> +	switch (property) {
> +	case DRM_XE_VM_GET_PROPERTY_FAULTS:
> +		spin_lock(&vm->faults.lock);
> +		size = vm->faults.len * sizeof(struct xe_vm_fault);
> +		spin_unlock(&vm->faults.lock);
> +		break;
> +	default:
> +		break;
> +	}
> +	return size;
> +}
> +
> +static int xe_vm_get_property_verify_size(struct xe_vm *vm, u32 property,
> +					  int expected, int actual)
> +{
> +	switch (property) {
> +	case DRM_XE_VM_GET_PROPERTY_FAULTS:
> +		/*
> +		 * Number of faults may increase between calls to
> +		 * xe_vm_get_property_ioctl, so just report the
> +		 * number of faults the user requests if it's less
> +		 * than or equal to the number of faults in the VM
> +		 * fault array.
> +		 */
> +		if (actual < expected)
> +			return -EINVAL;
Application should be allowed to provide more memory than the needed. In 
return, the driver should update the arg->size with number of bytes 
actually written to the memory.
> +		break;
> +	default:
> +		if (actual != expected)
> +			return -EINVAL;
> +		break;
> +	}
> +	return 0;
> +}
> +
> +static int fill_faults(struct xe_vm *vm,
> +		       struct drm_xe_vm_get_property *args)
> +{
> +	struct xe_vm_fault __user *usr_ptr = u64_to_user_ptr(args->data);
> +	struct xe_vm_fault store = { 0 };
> +	struct xe_vm_fault_entry *entry;
> +	int ret = 0, i = 0, count;
> +
> +	count = args->size / sizeof(struct xe_vm_fault);
> +
> +	spin_lock(&vm->faults.lock);
> +	list_for_each_entry(entry, &vm->faults.list, list) {
> +		if (i++ == count)
> +			break;
> +
> +		memset(&store, 0, sizeof(struct xe_vm_fault));
> +
> +		store.address = entry->address;
> +		store.address_type = entry->address_type;
> +		store.address_precision = entry->address_precision;
> +		store.fault_level = entry->fault_level;
> +		store.engine_class = xe_to_user_engine_class[entry->engine_class];
> +		store.engine_instance = entry->engine_instance;
> +
> +		ret = copy_to_user(usr_ptr, &store, sizeof(struct xe_vm_fault));
> +		if (ret)
> +			break;
> +
> +		usr_ptr++;
> +	}
> +	spin_unlock(&vm->faults.lock);
> +
Update the args->size with the amount of the written. Refer to my 
another comment above. Also document this in the comment of the interface.
> +	return ret;
> +}
> +
> +static int xe_vm_get_property_fill_data(struct xe_vm *vm,
> +					struct drm_xe_vm_get_property *args)
> +{
> +	switch (args->property) {
> +	case DRM_XE_VM_GET_PROPERTY_FAULTS:
> +		return fill_faults(vm, args);
> +	default:
> +		break;
> +	}
> +	return -EINVAL;
> +}
> +
> +int xe_vm_get_property_ioctl(struct drm_device *drm, void *data,
> +			     struct drm_file *file)
> +{
> +	struct xe_device *xe = to_xe_device(drm);
> +	struct xe_file *xef = to_xe_file(file);
> +	struct drm_xe_vm_get_property *args = data;
> +	struct xe_vm *vm;
> +	int size, ret = 0;
> +
> +	if (XE_IOCTL_DBG(xe, args->reserved[0] || args->reserved[1]))
> +		return -EINVAL;
> +
> +	vm = xe_vm_lookup(xef, args->vm_id);
> +	if (XE_IOCTL_DBG(xe, !vm))
> +		return -ENOENT;
> +
> +	size = xe_vm_get_property_size(vm, args->property);
> +
> +	if (size < 0) {
> +		ret = size;
> +		goto put_vm;
> +	} else if (!args->size) {
> +		args->size = size;
> +		goto put_vm;
> +	}
> +
> +	ret = xe_vm_get_property_verify_size(vm, args->property,
> +					     args->size, size);
> +	if (XE_IOCTL_DBG(xe, ret)) {
> +		ret = -EINVAL;
> +		goto put_vm;
> +	}
> +
> +	ret = xe_vm_get_property_fill_data(vm, args);
> +
> +put_vm:
> +	xe_vm_put(vm);
> +	return ret;
> +}
> +
>   /**
>    * xe_vm_bind_kernel_bo - bind a kernel BO to a VM
>    * @vm: VM to bind the BO to
> diff --git a/drivers/gpu/drm/xe/xe_vm.h b/drivers/gpu/drm/xe/xe_vm.h
> index 9bd7e93824da..63ec22458e04 100644
> --- a/drivers/gpu/drm/xe/xe_vm.h
> +++ b/drivers/gpu/drm/xe/xe_vm.h
> @@ -196,6 +196,8 @@ int xe_vm_destroy_ioctl(struct drm_device *dev, void *data,
>   			struct drm_file *file);
>   int xe_vm_bind_ioctl(struct drm_device *dev, void *data,
>   		     struct drm_file *file);
> +int xe_vm_get_property_ioctl(struct drm_device *dev, void *data,
> +			     struct drm_file *file);
>   
>   void xe_vm_close_and_put(struct xe_vm *vm);
>   


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

* RE: [PATCH v8 6/6] drm/xe/xe_vm: Implement xe_vm_get_property_ioctl
  2025-03-18 17:48   ` Jianxun Zhang
@ 2025-03-18 18:12     ` Cavitt, Jonathan
  2025-03-18 20:21       ` Jianxun Zhang
  0 siblings, 1 reply; 27+ messages in thread
From: Cavitt, Jonathan @ 2025-03-18 18:12 UTC (permalink / raw)
  To: Zhang, Jianxun, intel-xe@lists.freedesktop.org
  Cc: Gupta, saurabhg, Zuo, Alex, joonas.lahtinen@linux.intel.com,
	Brost, Matthew, Lin, Shuicheng, dri-devel@lists.freedesktop.org,
	Wajdeczko, Michal, michal.mzorek@intel.com, Cavitt, Jonathan

-----Original Message-----
From: Zhang, Jianxun <jianxun.zhang@intel.com> 
Sent: Tuesday, March 18, 2025 10:48 AM
To: Cavitt, Jonathan <jonathan.cavitt@intel.com>; intel-xe@lists.freedesktop.org
Cc: Gupta, saurabhg <saurabhg.gupta@intel.com>; Zuo, Alex <alex.zuo@intel.com>; joonas.lahtinen@linux.intel.com; Brost, Matthew <matthew.brost@intel.com>; Lin, Shuicheng <shuicheng.lin@intel.com>; dri-devel@lists.freedesktop.org; Wajdeczko, Michal <Michal.Wajdeczko@intel.com>; michal.mzorek@intel.com
Subject: Re: [PATCH v8 6/6] drm/xe/xe_vm: Implement xe_vm_get_property_ioctl
> 
> On 3/13/25 11:34, Jonathan Cavitt wrote:
> > Add support for userspace to request a list of observed faults
> > from a specified VM.
> > 
> > v2:
> > - Only allow querying of failed pagefaults (Matt Brost)
> > 
> > v3:
> > - Remove unnecessary size parameter from helper function, as it
> >    is a property of the arguments. (jcavitt)
> > - Remove unnecessary copy_from_user (Jainxun)
> > - Set address_precision to 1 (Jainxun)
> > - Report max size instead of dynamic size for memory allocation
> >    purposes.  Total memory usage is reported separately.
> > 
> > v4:
> > - Return int from xe_vm_get_property_size (Shuicheng)
> > - Fix memory leak (Shuicheng)
> > - Remove unnecessary size variable (jcavitt)
> > 
> > v5:
> > - Rename ioctl to xe_vm_get_faults_ioctl (jcavitt)
> > - Update fill_property_pfs to eliminate need for kzalloc (Jianxun)
> > 
> > v6:
> > - Repair and move fill_faults break condition (Dan Carpenter)
> > - Free vm after use (jcavitt)
> > - Combine assertions (jcavitt)
> > - Expand size check in xe_vm_get_faults_ioctl (jcavitt)
> > - Remove return mask from fill_faults, as return is already -EFAULT or 0
> >    (jcavitt)
> > 
> > v7:
> > - Revert back to using xe_vm_get_property_ioctl
> > - Apply better copy_to_user logic (jcavitt)
> > 
> > Signed-off-by: Jonathan Cavitt <jonathan.cavitt@intel.com>
> > Suggested-by: Matthew Brost <matthew.brost@intel.com>
> > Cc: Jainxun Zhang <jianxun.zhang@intel.com>
> > Cc: Shuicheng Lin <shuicheng.lin@intel.com>
> > ---
> >   drivers/gpu/drm/xe/xe_device.c |   3 +
> >   drivers/gpu/drm/xe/xe_vm.c     | 134 +++++++++++++++++++++++++++++++++
> >   drivers/gpu/drm/xe/xe_vm.h     |   2 +
> >   3 files changed, 139 insertions(+)
> > 
> > diff --git a/drivers/gpu/drm/xe/xe_device.c b/drivers/gpu/drm/xe/xe_device.c
> > index b2f656b2a563..74e510cb0e47 100644
> > --- a/drivers/gpu/drm/xe/xe_device.c
> > +++ b/drivers/gpu/drm/xe/xe_device.c
> > @@ -194,6 +194,9 @@ static const struct drm_ioctl_desc xe_ioctls[] = {
> >   	DRM_IOCTL_DEF_DRV(XE_WAIT_USER_FENCE, xe_wait_user_fence_ioctl,
> >   			  DRM_RENDER_ALLOW),
> >   	DRM_IOCTL_DEF_DRV(XE_OBSERVATION, xe_observation_ioctl, DRM_RENDER_ALLOW),
> > +	DRM_IOCTL_DEF_DRV(XE_VM_GET_PROPERTY, xe_vm_get_property_ioctl,
> > +			  DRM_RENDER_ALLOW),
> > +
> >   };
> >   
> >   static long xe_drm_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
> > diff --git a/drivers/gpu/drm/xe/xe_vm.c b/drivers/gpu/drm/xe/xe_vm.c
> > index 067a9cedcad9..521f0032d9e2 100644
> > --- a/drivers/gpu/drm/xe/xe_vm.c
> > +++ b/drivers/gpu/drm/xe/xe_vm.c
> > @@ -42,6 +42,14 @@
> >   #include "xe_wa.h"
> >   #include "xe_hmm.h"
> >   
> > +static const u16 xe_to_user_engine_class[] = {
> > +	[XE_ENGINE_CLASS_RENDER] = DRM_XE_ENGINE_CLASS_RENDER,
> > +	[XE_ENGINE_CLASS_COPY] = DRM_XE_ENGINE_CLASS_COPY,
> > +	[XE_ENGINE_CLASS_VIDEO_DECODE] = DRM_XE_ENGINE_CLASS_VIDEO_DECODE,
> > +	[XE_ENGINE_CLASS_VIDEO_ENHANCE] = DRM_XE_ENGINE_CLASS_VIDEO_ENHANCE,
> > +	[XE_ENGINE_CLASS_COMPUTE] = DRM_XE_ENGINE_CLASS_COMPUTE,
> > +};
> > +
> >   static struct drm_gem_object *xe_vm_obj(struct xe_vm *vm)
> >   {
> >   	return vm->gpuvm.r_obj;
> > @@ -3551,6 +3559,132 @@ int xe_vm_bind_ioctl(struct drm_device *dev, void *data, struct drm_file *file)
> >   	return err;
> >   }
> >   
> > +static int xe_vm_get_property_size(struct xe_vm *vm, u32 property)
> > +{
> > +	int size = -EINVAL;
> > +
> > +	switch (property) {
> > +	case DRM_XE_VM_GET_PROPERTY_FAULTS:
> > +		spin_lock(&vm->faults.lock);
> > +		size = vm->faults.len * sizeof(struct xe_vm_fault);
> > +		spin_unlock(&vm->faults.lock);
> > +		break;
> > +	default:
> > +		break;
> > +	}
> > +	return size;
> > +}
> > +
> > +static int xe_vm_get_property_verify_size(struct xe_vm *vm, u32 property,
> > +					  int expected, int actual)
> > +{
> > +	switch (property) {
> > +	case DRM_XE_VM_GET_PROPERTY_FAULTS:
> > +		/*
> > +		 * Number of faults may increase between calls to
> > +		 * xe_vm_get_property_ioctl, so just report the
> > +		 * number of faults the user requests if it's less
> > +		 * than or equal to the number of faults in the VM
> > +		 * fault array.
> > +		 */
> > +		if (actual < expected)
> > +			return -EINVAL;
> Application should be allowed to provide more memory than the needed. In 
> return, the driver should update the arg->size with number of bytes 
> actually written to the memory.

In an earlier discussion, we had decided that we should allow for the args->size
value to be less than the actual size value, since it would be impossible to prevent
additional faults from filling the fault list between calls to the get property ioctl.
And in such a case, we would only return in total the faults that could be stored
in the memory of said size.  In a sense, we had agreed that args->size would
express how many faults the user expects to read.

So, if the args->size is greater than the total size of the fault array, then user is
requesting more faults than there are faults available to be returned.  This
request cannot be satisfied, so we return -EINVAL.

-Jonathan Cavitt

> > +		break;
> > +	default:
> > +		if (actual != expected)
> > +			return -EINVAL;
> > +		break;
> > +	}
> > +	return 0;
> > +}
> > +
> > +static int fill_faults(struct xe_vm *vm,
> > +		       struct drm_xe_vm_get_property *args)
> > +{
> > +	struct xe_vm_fault __user *usr_ptr = u64_to_user_ptr(args->data);
> > +	struct xe_vm_fault store = { 0 };
> > +	struct xe_vm_fault_entry *entry;
> > +	int ret = 0, i = 0, count;
> > +
> > +	count = args->size / sizeof(struct xe_vm_fault);
> > +
> > +	spin_lock(&vm->faults.lock);
> > +	list_for_each_entry(entry, &vm->faults.list, list) {
> > +		if (i++ == count)
> > +			break;
> > +
> > +		memset(&store, 0, sizeof(struct xe_vm_fault));
> > +
> > +		store.address = entry->address;
> > +		store.address_type = entry->address_type;
> > +		store.address_precision = entry->address_precision;
> > +		store.fault_level = entry->fault_level;
> > +		store.engine_class = xe_to_user_engine_class[entry->engine_class];
> > +		store.engine_instance = entry->engine_instance;
> > +
> > +		ret = copy_to_user(usr_ptr, &store, sizeof(struct xe_vm_fault));
> > +		if (ret)
> > +			break;
> > +
> > +		usr_ptr++;
> > +	}
> > +	spin_unlock(&vm->faults.lock);
> > +
> Update the args->size with the amount of the written. Refer to my 
> another comment above. Also document this in the comment of the interface.
> > +	return ret;
> > +}
> > +
> > +static int xe_vm_get_property_fill_data(struct xe_vm *vm,
> > +					struct drm_xe_vm_get_property *args)
> > +{
> > +	switch (args->property) {
> > +	case DRM_XE_VM_GET_PROPERTY_FAULTS:
> > +		return fill_faults(vm, args);
> > +	default:
> > +		break;
> > +	}
> > +	return -EINVAL;
> > +}
> > +
> > +int xe_vm_get_property_ioctl(struct drm_device *drm, void *data,
> > +			     struct drm_file *file)
> > +{
> > +	struct xe_device *xe = to_xe_device(drm);
> > +	struct xe_file *xef = to_xe_file(file);
> > +	struct drm_xe_vm_get_property *args = data;
> > +	struct xe_vm *vm;
> > +	int size, ret = 0;
> > +
> > +	if (XE_IOCTL_DBG(xe, args->reserved[0] || args->reserved[1]))
> > +		return -EINVAL;
> > +
> > +	vm = xe_vm_lookup(xef, args->vm_id);
> > +	if (XE_IOCTL_DBG(xe, !vm))
> > +		return -ENOENT;
> > +
> > +	size = xe_vm_get_property_size(vm, args->property);
> > +
> > +	if (size < 0) {
> > +		ret = size;
> > +		goto put_vm;
> > +	} else if (!args->size) {
> > +		args->size = size;
> > +		goto put_vm;
> > +	}
> > +
> > +	ret = xe_vm_get_property_verify_size(vm, args->property,
> > +					     args->size, size);
> > +	if (XE_IOCTL_DBG(xe, ret)) {
> > +		ret = -EINVAL;
> > +		goto put_vm;
> > +	}
> > +
> > +	ret = xe_vm_get_property_fill_data(vm, args);
> > +
> > +put_vm:
> > +	xe_vm_put(vm);
> > +	return ret;
> > +}
> > +
> >   /**
> >    * xe_vm_bind_kernel_bo - bind a kernel BO to a VM
> >    * @vm: VM to bind the BO to
> > diff --git a/drivers/gpu/drm/xe/xe_vm.h b/drivers/gpu/drm/xe/xe_vm.h
> > index 9bd7e93824da..63ec22458e04 100644
> > --- a/drivers/gpu/drm/xe/xe_vm.h
> > +++ b/drivers/gpu/drm/xe/xe_vm.h
> > @@ -196,6 +196,8 @@ int xe_vm_destroy_ioctl(struct drm_device *dev, void *data,
> >   			struct drm_file *file);
> >   int xe_vm_bind_ioctl(struct drm_device *dev, void *data,
> >   		     struct drm_file *file);
> > +int xe_vm_get_property_ioctl(struct drm_device *dev, void *data,
> > +			     struct drm_file *file);
> >   
> >   void xe_vm_close_and_put(struct xe_vm *vm);
> >   
> 
> 

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

* Re: [PATCH v8 6/6] drm/xe/xe_vm: Implement xe_vm_get_property_ioctl
  2025-03-18 18:12     ` Cavitt, Jonathan
@ 2025-03-18 20:21       ` Jianxun Zhang
  0 siblings, 0 replies; 27+ messages in thread
From: Jianxun Zhang @ 2025-03-18 20:21 UTC (permalink / raw)
  To: Cavitt, Jonathan, intel-xe@lists.freedesktop.org
  Cc: Gupta, saurabhg, Zuo, Alex, joonas.lahtinen@linux.intel.com,
	Brost, Matthew, Lin, Shuicheng, dri-devel@lists.freedesktop.org,
	Wajdeczko, Michal, michal.mzorek@intel.com



On 3/18/25 11:12, Cavitt, Jonathan wrote:
> -----Original Message-----
> From: Zhang, Jianxun <jianxun.zhang@intel.com>
> Sent: Tuesday, March 18, 2025 10:48 AM
> To: Cavitt, Jonathan <jonathan.cavitt@intel.com>; intel-xe@lists.freedesktop.org
> Cc: Gupta, saurabhg <saurabhg.gupta@intel.com>; Zuo, Alex <alex.zuo@intel.com>; joonas.lahtinen@linux.intel.com; Brost, Matthew <matthew.brost@intel.com>; Lin, Shuicheng <shuicheng.lin@intel.com>; dri-devel@lists.freedesktop.org; Wajdeczko, Michal <Michal.Wajdeczko@intel.com>; michal.mzorek@intel.com
> Subject: Re: [PATCH v8 6/6] drm/xe/xe_vm: Implement xe_vm_get_property_ioctl
>>
>> On 3/13/25 11:34, Jonathan Cavitt wrote:
>>> Add support for userspace to request a list of observed faults
>>> from a specified VM.
>>>
>>> v2:
>>> - Only allow querying of failed pagefaults (Matt Brost)
>>>
>>> v3:
>>> - Remove unnecessary size parameter from helper function, as it
>>>     is a property of the arguments. (jcavitt)
>>> - Remove unnecessary copy_from_user (Jainxun)
>>> - Set address_precision to 1 (Jainxun)
>>> - Report max size instead of dynamic size for memory allocation
>>>     purposes.  Total memory usage is reported separately.
>>>
>>> v4:
>>> - Return int from xe_vm_get_property_size (Shuicheng)
>>> - Fix memory leak (Shuicheng)
>>> - Remove unnecessary size variable (jcavitt)
>>>
>>> v5:
>>> - Rename ioctl to xe_vm_get_faults_ioctl (jcavitt)
>>> - Update fill_property_pfs to eliminate need for kzalloc (Jianxun)
>>>
>>> v6:
>>> - Repair and move fill_faults break condition (Dan Carpenter)
>>> - Free vm after use (jcavitt)
>>> - Combine assertions (jcavitt)
>>> - Expand size check in xe_vm_get_faults_ioctl (jcavitt)
>>> - Remove return mask from fill_faults, as return is already -EFAULT or 0
>>>     (jcavitt)
>>>
>>> v7:
>>> - Revert back to using xe_vm_get_property_ioctl
>>> - Apply better copy_to_user logic (jcavitt)
>>>
>>> Signed-off-by: Jonathan Cavitt <jonathan.cavitt@intel.com>
>>> Suggested-by: Matthew Brost <matthew.brost@intel.com>
>>> Cc: Jainxun Zhang <jianxun.zhang@intel.com>
>>> Cc: Shuicheng Lin <shuicheng.lin@intel.com>
>>> ---
>>>    drivers/gpu/drm/xe/xe_device.c |   3 +
>>>    drivers/gpu/drm/xe/xe_vm.c     | 134 +++++++++++++++++++++++++++++++++
>>>    drivers/gpu/drm/xe/xe_vm.h     |   2 +
>>>    3 files changed, 139 insertions(+)
>>>
>>> diff --git a/drivers/gpu/drm/xe/xe_device.c b/drivers/gpu/drm/xe/xe_device.c
>>> index b2f656b2a563..74e510cb0e47 100644
>>> --- a/drivers/gpu/drm/xe/xe_device.c
>>> +++ b/drivers/gpu/drm/xe/xe_device.c
>>> @@ -194,6 +194,9 @@ static const struct drm_ioctl_desc xe_ioctls[] = {
>>>    	DRM_IOCTL_DEF_DRV(XE_WAIT_USER_FENCE, xe_wait_user_fence_ioctl,
>>>    			  DRM_RENDER_ALLOW),
>>>    	DRM_IOCTL_DEF_DRV(XE_OBSERVATION, xe_observation_ioctl, DRM_RENDER_ALLOW),
>>> +	DRM_IOCTL_DEF_DRV(XE_VM_GET_PROPERTY, xe_vm_get_property_ioctl,
>>> +			  DRM_RENDER_ALLOW),
>>> +
>>>    };
>>>    
>>>    static long xe_drm_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
>>> diff --git a/drivers/gpu/drm/xe/xe_vm.c b/drivers/gpu/drm/xe/xe_vm.c
>>> index 067a9cedcad9..521f0032d9e2 100644
>>> --- a/drivers/gpu/drm/xe/xe_vm.c
>>> +++ b/drivers/gpu/drm/xe/xe_vm.c
>>> @@ -42,6 +42,14 @@
>>>    #include "xe_wa.h"
>>>    #include "xe_hmm.h"
>>>    
>>> +static const u16 xe_to_user_engine_class[] = {
>>> +	[XE_ENGINE_CLASS_RENDER] = DRM_XE_ENGINE_CLASS_RENDER,
>>> +	[XE_ENGINE_CLASS_COPY] = DRM_XE_ENGINE_CLASS_COPY,
>>> +	[XE_ENGINE_CLASS_VIDEO_DECODE] = DRM_XE_ENGINE_CLASS_VIDEO_DECODE,
>>> +	[XE_ENGINE_CLASS_VIDEO_ENHANCE] = DRM_XE_ENGINE_CLASS_VIDEO_ENHANCE,
>>> +	[XE_ENGINE_CLASS_COMPUTE] = DRM_XE_ENGINE_CLASS_COMPUTE,
>>> +};
>>> +
>>>    static struct drm_gem_object *xe_vm_obj(struct xe_vm *vm)
>>>    {
>>>    	return vm->gpuvm.r_obj;
>>> @@ -3551,6 +3559,132 @@ int xe_vm_bind_ioctl(struct drm_device *dev, void *data, struct drm_file *file)
>>>    	return err;
>>>    }
>>>    
>>> +static int xe_vm_get_property_size(struct xe_vm *vm, u32 property)
>>> +{
>>> +	int size = -EINVAL;
>>> +
>>> +	switch (property) {
>>> +	case DRM_XE_VM_GET_PROPERTY_FAULTS:
>>> +		spin_lock(&vm->faults.lock);
>>> +		size = vm->faults.len * sizeof(struct xe_vm_fault);
>>> +		spin_unlock(&vm->faults.lock);
>>> +		break;
>>> +	default:
>>> +		break;
>>> +	}
>>> +	return size;
>>> +}
>>> +
>>> +static int xe_vm_get_property_verify_size(struct xe_vm *vm, u32 property,
>>> +					  int expected, int actual)
>>> +{
>>> +	switch (property) {
>>> +	case DRM_XE_VM_GET_PROPERTY_FAULTS:
>>> +		/*
>>> +		 * Number of faults may increase between calls to
>>> +		 * xe_vm_get_property_ioctl, so just report the
>>> +		 * number of faults the user requests if it's less
>>> +		 * than or equal to the number of faults in the VM
>>> +		 * fault array.
>>> +		 */
>>> +		if (actual < expected)
>>> +			return -EINVAL;
>> Application should be allowed to provide more memory than the needed. In
>> return, the driver should update the arg->size with number of bytes
>> actually written to the memory.
> 
> In an earlier discussion, we had decided that we should allow for the args->size
> value to be less than the actual size value, since it would be impossible to prevent
> additional faults from filling the fault list between calls to the get property ioctl.
> And in such a case, we would only return in total the faults that could be stored
> in the memory of said size.  In a sense, we had agreed that args->size would
> express how many faults the user expects to read.
> 
> So, if the args->size is greater than the total size of the fault array, then user is
> requesting more faults than there are faults available to be returned.  This
> request cannot be satisfied, so we return -EINVAL.

Yes. You are correct. We catpured this in 4) in the section "Execution 
Flow" in the design doc. There shouldn't be a valid case for UMD to 
query more than what from the first query on size, considering the fault 
list in KMD can only be increased and a query on size is always issued 
by UMD before fetching.

> 
> -Jonathan Cavitt
> 
>>> +		break;
>>> +	default:
>>> +		if (actual != expected)
>>> +			return -EINVAL;
>>> +		break;
>>> +	}
>>> +	return 0;
>>> +}
>>> +
>>> +static int fill_faults(struct xe_vm *vm,
>>> +		       struct drm_xe_vm_get_property *args)
>>> +{
>>> +	struct xe_vm_fault __user *usr_ptr = u64_to_user_ptr(args->data);
>>> +	struct xe_vm_fault store = { 0 };
>>> +	struct xe_vm_fault_entry *entry;
>>> +	int ret = 0, i = 0, count;
>>> +
>>> +	count = args->size / sizeof(struct xe_vm_fault);
>>> +
>>> +	spin_lock(&vm->faults.lock);
>>> +	list_for_each_entry(entry, &vm->faults.list, list) {
>>> +		if (i++ == count)
>>> +			break;
>>> +
>>> +		memset(&store, 0, sizeof(struct xe_vm_fault));
>>> +
>>> +		store.address = entry->address;
>>> +		store.address_type = entry->address_type;
>>> +		store.address_precision = entry->address_precision;
>>> +		store.fault_level = entry->fault_level;
>>> +		store.engine_class = xe_to_user_engine_class[entry->engine_class];
>>> +		store.engine_instance = entry->engine_instance;
>>> +
>>> +		ret = copy_to_user(usr_ptr, &store, sizeof(struct xe_vm_fault));
>>> +		if (ret)
>>> +			break;
>>> +
>>> +		usr_ptr++;
>>> +	}
>>> +	spin_unlock(&vm->faults.lock);
>>> +
>> Update the args->size with the amount of the written. Refer to my
>> another comment above. Also document this in the comment of the interface.
>>> +	return ret;
>>> +}
>>> +
>>> +static int xe_vm_get_property_fill_data(struct xe_vm *vm,
>>> +					struct drm_xe_vm_get_property *args)
>>> +{
>>> +	switch (args->property) {
>>> +	case DRM_XE_VM_GET_PROPERTY_FAULTS:
>>> +		return fill_faults(vm, args);
>>> +	default:
>>> +		break;
>>> +	}
>>> +	return -EINVAL;
>>> +}
>>> +
>>> +int xe_vm_get_property_ioctl(struct drm_device *drm, void *data,
>>> +			     struct drm_file *file)
>>> +{
>>> +	struct xe_device *xe = to_xe_device(drm);
>>> +	struct xe_file *xef = to_xe_file(file);
>>> +	struct drm_xe_vm_get_property *args = data;
>>> +	struct xe_vm *vm;
>>> +	int size, ret = 0;
>>> +
>>> +	if (XE_IOCTL_DBG(xe, args->reserved[0] || args->reserved[1]))
>>> +		return -EINVAL;
>>> +
>>> +	vm = xe_vm_lookup(xef, args->vm_id);
>>> +	if (XE_IOCTL_DBG(xe, !vm))
>>> +		return -ENOENT;
>>> +
>>> +	size = xe_vm_get_property_size(vm, args->property);
>>> +
>>> +	if (size < 0) {
>>> +		ret = size;
>>> +		goto put_vm;
>>> +	} else if (!args->size) {
>>> +		args->size = size;
>>> +		goto put_vm;
>>> +	}
>>> +
>>> +	ret = xe_vm_get_property_verify_size(vm, args->property,
>>> +					     args->size, size);
>>> +	if (XE_IOCTL_DBG(xe, ret)) {
>>> +		ret = -EINVAL;
>>> +		goto put_vm;
>>> +	}
>>> +
>>> +	ret = xe_vm_get_property_fill_data(vm, args);
>>> +
>>> +put_vm:
>>> +	xe_vm_put(vm);
>>> +	return ret;
>>> +}
>>> +
>>>    /**
>>>     * xe_vm_bind_kernel_bo - bind a kernel BO to a VM
>>>     * @vm: VM to bind the BO to
>>> diff --git a/drivers/gpu/drm/xe/xe_vm.h b/drivers/gpu/drm/xe/xe_vm.h
>>> index 9bd7e93824da..63ec22458e04 100644
>>> --- a/drivers/gpu/drm/xe/xe_vm.h
>>> +++ b/drivers/gpu/drm/xe/xe_vm.h
>>> @@ -196,6 +196,8 @@ int xe_vm_destroy_ioctl(struct drm_device *dev, void *data,
>>>    			struct drm_file *file);
>>>    int xe_vm_bind_ioctl(struct drm_device *dev, void *data,
>>>    		     struct drm_file *file);
>>> +int xe_vm_get_property_ioctl(struct drm_device *dev, void *data,
>>> +			     struct drm_file *file);
>>>    
>>>    void xe_vm_close_and_put(struct xe_vm *vm);
>>>    
>>
>>


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

* Re: [PATCH v8 6/6] drm/xe/xe_vm: Implement xe_vm_get_property_ioctl
  2025-03-13 18:34 ` [PATCH v8 6/6] drm/xe/xe_vm: Implement xe_vm_get_property_ioctl Jonathan Cavitt
  2025-03-18 17:48   ` Jianxun Zhang
@ 2025-03-19 23:58   ` Jianxun Zhang
  2025-03-20 14:10     ` Cavitt, Jonathan
  1 sibling, 1 reply; 27+ messages in thread
From: Jianxun Zhang @ 2025-03-19 23:58 UTC (permalink / raw)
  To: Jonathan Cavitt, intel-xe
  Cc: saurabhg.gupta, alex.zuo, joonas.lahtinen, matthew.brost,
	shuicheng.lin, dri-devel, Michal.Wajdeczko, michal.mzorek



On 3/13/25 11:34, Jonathan Cavitt wrote:
> Add support for userspace to request a list of observed faults
> from a specified VM.
> 
> v2:
> - Only allow querying of failed pagefaults (Matt Brost)
> 
> v3:
> - Remove unnecessary size parameter from helper function, as it
>    is a property of the arguments. (jcavitt)
> - Remove unnecessary copy_from_user (Jainxun)
> - Set address_precision to 1 (Jainxun)
> - Report max size instead of dynamic size for memory allocation
>    purposes.  Total memory usage is reported separately.
> 
> v4:
> - Return int from xe_vm_get_property_size (Shuicheng)
> - Fix memory leak (Shuicheng)
> - Remove unnecessary size variable (jcavitt)
> 
> v5:
> - Rename ioctl to xe_vm_get_faults_ioctl (jcavitt)
> - Update fill_property_pfs to eliminate need for kzalloc (Jianxun)
> 
> v6:
> - Repair and move fill_faults break condition (Dan Carpenter)
> - Free vm after use (jcavitt)
> - Combine assertions (jcavitt)
> - Expand size check in xe_vm_get_faults_ioctl (jcavitt)
> - Remove return mask from fill_faults, as return is already -EFAULT or 0
>    (jcavitt)
> 
> v7:
> - Revert back to using xe_vm_get_property_ioctl
> - Apply better copy_to_user logic (jcavitt)
> 
> Signed-off-by: Jonathan Cavitt <jonathan.cavitt@intel.com>
> Suggested-by: Matthew Brost <matthew.brost@intel.com>
> Cc: Jainxun Zhang <jianxun.zhang@intel.com>
> Cc: Shuicheng Lin <shuicheng.lin@intel.com>
> ---
>   drivers/gpu/drm/xe/xe_device.c |   3 +
>   drivers/gpu/drm/xe/xe_vm.c     | 134 +++++++++++++++++++++++++++++++++
>   drivers/gpu/drm/xe/xe_vm.h     |   2 +
>   3 files changed, 139 insertions(+)
> 
> diff --git a/drivers/gpu/drm/xe/xe_device.c b/drivers/gpu/drm/xe/xe_device.c
> index b2f656b2a563..74e510cb0e47 100644
> --- a/drivers/gpu/drm/xe/xe_device.c
> +++ b/drivers/gpu/drm/xe/xe_device.c
> @@ -194,6 +194,9 @@ static const struct drm_ioctl_desc xe_ioctls[] = {
>   	DRM_IOCTL_DEF_DRV(XE_WAIT_USER_FENCE, xe_wait_user_fence_ioctl,
>   			  DRM_RENDER_ALLOW),
>   	DRM_IOCTL_DEF_DRV(XE_OBSERVATION, xe_observation_ioctl, DRM_RENDER_ALLOW),
> +	DRM_IOCTL_DEF_DRV(XE_VM_GET_PROPERTY, xe_vm_get_property_ioctl,
> +			  DRM_RENDER_ALLOW),
> +
>   };
>   
>   static long xe_drm_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
> diff --git a/drivers/gpu/drm/xe/xe_vm.c b/drivers/gpu/drm/xe/xe_vm.c
> index 067a9cedcad9..521f0032d9e2 100644
> --- a/drivers/gpu/drm/xe/xe_vm.c
> +++ b/drivers/gpu/drm/xe/xe_vm.c
> @@ -42,6 +42,14 @@
>   #include "xe_wa.h"
>   #include "xe_hmm.h"
>   
> +static const u16 xe_to_user_engine_class[] = {
> +	[XE_ENGINE_CLASS_RENDER] = DRM_XE_ENGINE_CLASS_RENDER,
> +	[XE_ENGINE_CLASS_COPY] = DRM_XE_ENGINE_CLASS_COPY,
> +	[XE_ENGINE_CLASS_VIDEO_DECODE] = DRM_XE_ENGINE_CLASS_VIDEO_DECODE,
> +	[XE_ENGINE_CLASS_VIDEO_ENHANCE] = DRM_XE_ENGINE_CLASS_VIDEO_ENHANCE,
> +	[XE_ENGINE_CLASS_COMPUTE] = DRM_XE_ENGINE_CLASS_COMPUTE,
Not sure if this will be used to interpret engine_class that will be 
reported to UMD, so just a heads up. In bspec 77412 the compute engine 
class id is 5, instead of 4 as this macro defined.

There are other values so perhaps you can just report raw value of 
engine class and let UMD deals with it according to the bspec.
> +};
> +
>   static struct drm_gem_object *xe_vm_obj(struct xe_vm *vm)
>   {
>   	return vm->gpuvm.r_obj;
> @@ -3551,6 +3559,132 @@ int xe_vm_bind_ioctl(struct drm_device *dev, void *data, struct drm_file *file)
>   	return err;
>   }
>   
> +static int xe_vm_get_property_size(struct xe_vm *vm, u32 property)
> +{
> +	int size = -EINVAL;
> +
> +	switch (property) {
> +	case DRM_XE_VM_GET_PROPERTY_FAULTS:
> +		spin_lock(&vm->faults.lock);
> +		size = vm->faults.len * sizeof(struct xe_vm_fault);
> +		spin_unlock(&vm->faults.lock);
> +		break;
> +	default:
> +		break;
> +	}
> +	return size;
> +}
> +
> +static int xe_vm_get_property_verify_size(struct xe_vm *vm, u32 property,
> +					  int expected, int actual)
> +{
> +	switch (property) {
> +	case DRM_XE_VM_GET_PROPERTY_FAULTS:
> +		/*
> +		 * Number of faults may increase between calls to
> +		 * xe_vm_get_property_ioctl, so just report the
> +		 * number of faults the user requests if it's less
> +		 * than or equal to the number of faults in the VM
> +		 * fault array.
> +		 */
> +		if (actual < expected)
> +			return -EINVAL;
> +		break;
> +	default:
> +		if (actual != expected)
> +			return -EINVAL;
> +		break;
> +	}
> +	return 0;
> +}
> +
> +static int fill_faults(struct xe_vm *vm,
> +		       struct drm_xe_vm_get_property *args)
> +{
> +	struct xe_vm_fault __user *usr_ptr = u64_to_user_ptr(args->data);
> +	struct xe_vm_fault store = { 0 };
> +	struct xe_vm_fault_entry *entry;
> +	int ret = 0, i = 0, count;
> +
> +	count = args->size / sizeof(struct xe_vm_fault);
> +
> +	spin_lock(&vm->faults.lock);
> +	list_for_each_entry(entry, &vm->faults.list, list) {
> +		if (i++ == count)
> +			break;
> +
> +		memset(&store, 0, sizeof(struct xe_vm_fault));
> +
> +		store.address = entry->address;
> +		store.address_type = entry->address_type;
> +		store.address_precision = entry->address_precision;
> +		store.fault_level = entry->fault_level;
> +		store.engine_class = xe_to_user_engine_class[entry->engine_class];
> +		store.engine_instance = entry->engine_instance;
> +
> +		ret = copy_to_user(usr_ptr, &store, sizeof(struct xe_vm_fault));
> +		if (ret)
> +			break;
> +
> +		usr_ptr++;
> +	}
> +	spin_unlock(&vm->faults.lock);
> +
> +	return ret;
> +}
> +
> +static int xe_vm_get_property_fill_data(struct xe_vm *vm,
> +					struct drm_xe_vm_get_property *args)
> +{
> +	switch (args->property) {
> +	case DRM_XE_VM_GET_PROPERTY_FAULTS:
> +		return fill_faults(vm, args);
> +	default:
> +		break;
> +	}
> +	return -EINVAL;
> +}
> +
> +int xe_vm_get_property_ioctl(struct drm_device *drm, void *data,
> +			     struct drm_file *file)
> +{
> +	struct xe_device *xe = to_xe_device(drm);
> +	struct xe_file *xef = to_xe_file(file);
> +	struct drm_xe_vm_get_property *args = data;
> +	struct xe_vm *vm;
> +	int size, ret = 0;
> +
> +	if (XE_IOCTL_DBG(xe, args->reserved[0] || args->reserved[1]))
> +		return -EINVAL;
> +
> +	vm = xe_vm_lookup(xef, args->vm_id);
> +	if (XE_IOCTL_DBG(xe, !vm))
> +		return -ENOENT;
> +
> +	size = xe_vm_get_property_size(vm, args->property);
> +
> +	if (size < 0) {
> +		ret = size;
> +		goto put_vm;
> +	} else if (!args->size) {
> +		args->size = size;
> +		goto put_vm;
> +	}
> +
> +	ret = xe_vm_get_property_verify_size(vm, args->property,
> +					     args->size, size);
> +	if (XE_IOCTL_DBG(xe, ret)) {
> +		ret = -EINVAL;
> +		goto put_vm;
> +	}
> +
> +	ret = xe_vm_get_property_fill_data(vm, args);
> +
> +put_vm:
> +	xe_vm_put(vm);
> +	return ret;
> +}
> +
>   /**
>    * xe_vm_bind_kernel_bo - bind a kernel BO to a VM
>    * @vm: VM to bind the BO to
> diff --git a/drivers/gpu/drm/xe/xe_vm.h b/drivers/gpu/drm/xe/xe_vm.h
> index 9bd7e93824da..63ec22458e04 100644
> --- a/drivers/gpu/drm/xe/xe_vm.h
> +++ b/drivers/gpu/drm/xe/xe_vm.h
> @@ -196,6 +196,8 @@ int xe_vm_destroy_ioctl(struct drm_device *dev, void *data,
>   			struct drm_file *file);
>   int xe_vm_bind_ioctl(struct drm_device *dev, void *data,
>   		     struct drm_file *file);
> +int xe_vm_get_property_ioctl(struct drm_device *dev, void *data,
> +			     struct drm_file *file);
>   
>   void xe_vm_close_and_put(struct xe_vm *vm);
>   


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

* RE: [PATCH v8 6/6] drm/xe/xe_vm: Implement xe_vm_get_property_ioctl
  2025-03-19 23:58   ` Jianxun Zhang
@ 2025-03-20 14:10     ` Cavitt, Jonathan
  0 siblings, 0 replies; 27+ messages in thread
From: Cavitt, Jonathan @ 2025-03-20 14:10 UTC (permalink / raw)
  To: Zhang, Jianxun, intel-xe@lists.freedesktop.org
  Cc: Gupta, saurabhg, Zuo, Alex, joonas.lahtinen@linux.intel.com,
	Brost, Matthew, Lin, Shuicheng, dri-devel@lists.freedesktop.org,
	Wajdeczko, Michal, michal.mzorek@intel.com, Cavitt, Jonathan

-----Original Message-----
From: Zhang, Jianxun <jianxun.zhang@intel.com> 
Sent: Wednesday, March 19, 2025 4:58 PM
To: Cavitt, Jonathan <jonathan.cavitt@intel.com>; intel-xe@lists.freedesktop.org
Cc: Gupta, saurabhg <saurabhg.gupta@intel.com>; Zuo, Alex <alex.zuo@intel.com>; joonas.lahtinen@linux.intel.com; Brost, Matthew <matthew.brost@intel.com>; Lin, Shuicheng <shuicheng.lin@intel.com>; dri-devel@lists.freedesktop.org; Wajdeczko, Michal <Michal.Wajdeczko@intel.com>; michal.mzorek@intel.com
Subject: Re: [PATCH v8 6/6] drm/xe/xe_vm: Implement xe_vm_get_property_ioctl
> 
> On 3/13/25 11:34, Jonathan Cavitt wrote:
> > Add support for userspace to request a list of observed faults
> > from a specified VM.
> > 
> > v2:
> > - Only allow querying of failed pagefaults (Matt Brost)
> > 
> > v3:
> > - Remove unnecessary size parameter from helper function, as it
> >    is a property of the arguments. (jcavitt)
> > - Remove unnecessary copy_from_user (Jainxun)
> > - Set address_precision to 1 (Jainxun)
> > - Report max size instead of dynamic size for memory allocation
> >    purposes.  Total memory usage is reported separately.
> > 
> > v4:
> > - Return int from xe_vm_get_property_size (Shuicheng)
> > - Fix memory leak (Shuicheng)
> > - Remove unnecessary size variable (jcavitt)
> > 
> > v5:
> > - Rename ioctl to xe_vm_get_faults_ioctl (jcavitt)
> > - Update fill_property_pfs to eliminate need for kzalloc (Jianxun)
> > 
> > v6:
> > - Repair and move fill_faults break condition (Dan Carpenter)
> > - Free vm after use (jcavitt)
> > - Combine assertions (jcavitt)
> > - Expand size check in xe_vm_get_faults_ioctl (jcavitt)
> > - Remove return mask from fill_faults, as return is already -EFAULT or 0
> >    (jcavitt)
> > 
> > v7:
> > - Revert back to using xe_vm_get_property_ioctl
> > - Apply better copy_to_user logic (jcavitt)
> > 
> > Signed-off-by: Jonathan Cavitt <jonathan.cavitt@intel.com>
> > Suggested-by: Matthew Brost <matthew.brost@intel.com>
> > Cc: Jainxun Zhang <jianxun.zhang@intel.com>
> > Cc: Shuicheng Lin <shuicheng.lin@intel.com>
> > ---
> >   drivers/gpu/drm/xe/xe_device.c |   3 +
> >   drivers/gpu/drm/xe/xe_vm.c     | 134 +++++++++++++++++++++++++++++++++
> >   drivers/gpu/drm/xe/xe_vm.h     |   2 +
> >   3 files changed, 139 insertions(+)
> > 
> > diff --git a/drivers/gpu/drm/xe/xe_device.c b/drivers/gpu/drm/xe/xe_device.c
> > index b2f656b2a563..74e510cb0e47 100644
> > --- a/drivers/gpu/drm/xe/xe_device.c
> > +++ b/drivers/gpu/drm/xe/xe_device.c
> > @@ -194,6 +194,9 @@ static const struct drm_ioctl_desc xe_ioctls[] = {
> >   	DRM_IOCTL_DEF_DRV(XE_WAIT_USER_FENCE, xe_wait_user_fence_ioctl,
> >   			  DRM_RENDER_ALLOW),
> >   	DRM_IOCTL_DEF_DRV(XE_OBSERVATION, xe_observation_ioctl, DRM_RENDER_ALLOW),
> > +	DRM_IOCTL_DEF_DRV(XE_VM_GET_PROPERTY, xe_vm_get_property_ioctl,
> > +			  DRM_RENDER_ALLOW),
> > +
> >   };
> >   
> >   static long xe_drm_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
> > diff --git a/drivers/gpu/drm/xe/xe_vm.c b/drivers/gpu/drm/xe/xe_vm.c
> > index 067a9cedcad9..521f0032d9e2 100644
> > --- a/drivers/gpu/drm/xe/xe_vm.c
> > +++ b/drivers/gpu/drm/xe/xe_vm.c
> > @@ -42,6 +42,14 @@
> >   #include "xe_wa.h"
> >   #include "xe_hmm.h"
> >   
> > +static const u16 xe_to_user_engine_class[] = {
> > +	[XE_ENGINE_CLASS_RENDER] = DRM_XE_ENGINE_CLASS_RENDER,
> > +	[XE_ENGINE_CLASS_COPY] = DRM_XE_ENGINE_CLASS_COPY,
> > +	[XE_ENGINE_CLASS_VIDEO_DECODE] = DRM_XE_ENGINE_CLASS_VIDEO_DECODE,
> > +	[XE_ENGINE_CLASS_VIDEO_ENHANCE] = DRM_XE_ENGINE_CLASS_VIDEO_ENHANCE,
> > +	[XE_ENGINE_CLASS_COMPUTE] = DRM_XE_ENGINE_CLASS_COMPUTE,
> Not sure if this will be used to interpret engine_class that will be 
> reported to UMD, so just a heads up. In bspec 77412 the compute engine 
> class id is 5, instead of 4 as this macro defined.

xe_hw_engine_types.h
XE_ENGINE_CLASS_COMPUTE = 5,
-Jonathan Cavitt

> 
> There are other values so perhaps you can just report raw value of 
> engine class and let UMD deals with it according to the bspec.
> > +};
> > +
> >   static struct drm_gem_object *xe_vm_obj(struct xe_vm *vm)
> >   {
> >   	return vm->gpuvm.r_obj;
> > @@ -3551,6 +3559,132 @@ int xe_vm_bind_ioctl(struct drm_device *dev, void *data, struct drm_file *file)
> >   	return err;
> >   }
> >   
> > +static int xe_vm_get_property_size(struct xe_vm *vm, u32 property)
> > +{
> > +	int size = -EINVAL;
> > +
> > +	switch (property) {
> > +	case DRM_XE_VM_GET_PROPERTY_FAULTS:
> > +		spin_lock(&vm->faults.lock);
> > +		size = vm->faults.len * sizeof(struct xe_vm_fault);
> > +		spin_unlock(&vm->faults.lock);
> > +		break;
> > +	default:
> > +		break;
> > +	}
> > +	return size;
> > +}
> > +
> > +static int xe_vm_get_property_verify_size(struct xe_vm *vm, u32 property,
> > +					  int expected, int actual)
> > +{
> > +	switch (property) {
> > +	case DRM_XE_VM_GET_PROPERTY_FAULTS:
> > +		/*
> > +		 * Number of faults may increase between calls to
> > +		 * xe_vm_get_property_ioctl, so just report the
> > +		 * number of faults the user requests if it's less
> > +		 * than or equal to the number of faults in the VM
> > +		 * fault array.
> > +		 */
> > +		if (actual < expected)
> > +			return -EINVAL;
> > +		break;
> > +	default:
> > +		if (actual != expected)
> > +			return -EINVAL;
> > +		break;
> > +	}
> > +	return 0;
> > +}
> > +
> > +static int fill_faults(struct xe_vm *vm,
> > +		       struct drm_xe_vm_get_property *args)
> > +{
> > +	struct xe_vm_fault __user *usr_ptr = u64_to_user_ptr(args->data);
> > +	struct xe_vm_fault store = { 0 };
> > +	struct xe_vm_fault_entry *entry;
> > +	int ret = 0, i = 0, count;
> > +
> > +	count = args->size / sizeof(struct xe_vm_fault);
> > +
> > +	spin_lock(&vm->faults.lock);
> > +	list_for_each_entry(entry, &vm->faults.list, list) {
> > +		if (i++ == count)
> > +			break;
> > +
> > +		memset(&store, 0, sizeof(struct xe_vm_fault));
> > +
> > +		store.address = entry->address;
> > +		store.address_type = entry->address_type;
> > +		store.address_precision = entry->address_precision;
> > +		store.fault_level = entry->fault_level;
> > +		store.engine_class = xe_to_user_engine_class[entry->engine_class];
> > +		store.engine_instance = entry->engine_instance;
> > +
> > +		ret = copy_to_user(usr_ptr, &store, sizeof(struct xe_vm_fault));
> > +		if (ret)
> > +			break;
> > +
> > +		usr_ptr++;
> > +	}
> > +	spin_unlock(&vm->faults.lock);
> > +
> > +	return ret;
> > +}
> > +
> > +static int xe_vm_get_property_fill_data(struct xe_vm *vm,
> > +					struct drm_xe_vm_get_property *args)
> > +{
> > +	switch (args->property) {
> > +	case DRM_XE_VM_GET_PROPERTY_FAULTS:
> > +		return fill_faults(vm, args);
> > +	default:
> > +		break;
> > +	}
> > +	return -EINVAL;
> > +}
> > +
> > +int xe_vm_get_property_ioctl(struct drm_device *drm, void *data,
> > +			     struct drm_file *file)
> > +{
> > +	struct xe_device *xe = to_xe_device(drm);
> > +	struct xe_file *xef = to_xe_file(file);
> > +	struct drm_xe_vm_get_property *args = data;
> > +	struct xe_vm *vm;
> > +	int size, ret = 0;
> > +
> > +	if (XE_IOCTL_DBG(xe, args->reserved[0] || args->reserved[1]))
> > +		return -EINVAL;
> > +
> > +	vm = xe_vm_lookup(xef, args->vm_id);
> > +	if (XE_IOCTL_DBG(xe, !vm))
> > +		return -ENOENT;
> > +
> > +	size = xe_vm_get_property_size(vm, args->property);
> > +
> > +	if (size < 0) {
> > +		ret = size;
> > +		goto put_vm;
> > +	} else if (!args->size) {
> > +		args->size = size;
> > +		goto put_vm;
> > +	}
> > +
> > +	ret = xe_vm_get_property_verify_size(vm, args->property,
> > +					     args->size, size);
> > +	if (XE_IOCTL_DBG(xe, ret)) {
> > +		ret = -EINVAL;
> > +		goto put_vm;
> > +	}
> > +
> > +	ret = xe_vm_get_property_fill_data(vm, args);
> > +
> > +put_vm:
> > +	xe_vm_put(vm);
> > +	return ret;
> > +}
> > +
> >   /**
> >    * xe_vm_bind_kernel_bo - bind a kernel BO to a VM
> >    * @vm: VM to bind the BO to
> > diff --git a/drivers/gpu/drm/xe/xe_vm.h b/drivers/gpu/drm/xe/xe_vm.h
> > index 9bd7e93824da..63ec22458e04 100644
> > --- a/drivers/gpu/drm/xe/xe_vm.h
> > +++ b/drivers/gpu/drm/xe/xe_vm.h
> > @@ -196,6 +196,8 @@ int xe_vm_destroy_ioctl(struct drm_device *dev, void *data,
> >   			struct drm_file *file);
> >   int xe_vm_bind_ioctl(struct drm_device *dev, void *data,
> >   		     struct drm_file *file);
> > +int xe_vm_get_property_ioctl(struct drm_device *dev, void *data,
> > +			     struct drm_file *file);
> >   
> >   void xe_vm_close_and_put(struct xe_vm *vm);
> >   
> 
> 

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

end of thread, other threads:[~2025-03-20 14:10 UTC | newest]

Thread overview: 27+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-03-13 18:34 [PATCH v8 0/6] drm/xe/xe_vm: Implement xe_vm_get_property_ioctl Jonathan Cavitt
2025-03-13 18:34 ` [PATCH v8 1/6] drm/xe/xe_gt_pagefault: Disallow writes to read-only VMAs Jonathan Cavitt
2025-03-13 18:34 ` [PATCH v8 2/6] drm/xe/xe_gt_pagefault: Move pagefault struct to header Jonathan Cavitt
2025-03-14 17:01   ` Michal Wajdeczko
2025-03-14 22:06     ` Cavitt, Jonathan
2025-03-15 14:45       ` Michal Wajdeczko
2025-03-17 20:55         ` Cavitt, Jonathan
2025-03-18  8:44           ` Michal Wajdeczko
2025-03-13 18:34 ` [PATCH v8 3/6] drm/xe/uapi: Define drm_xe_vm_get_property Jonathan Cavitt
2025-03-13 22:10   ` Jianxun Zhang
2025-03-13 18:34 ` [PATCH v8 4/6] drm/xe/xe_gt_pagefault: Add address_type field to pagefaults Jonathan Cavitt
2025-03-13 18:34 ` [PATCH v8 5/6] drm/xe/xe_vm: Add per VM fault info Jonathan Cavitt
2025-03-13 18:34 ` [PATCH v8 6/6] drm/xe/xe_vm: Implement xe_vm_get_property_ioctl Jonathan Cavitt
2025-03-18 17:48   ` Jianxun Zhang
2025-03-18 18:12     ` Cavitt, Jonathan
2025-03-18 20:21       ` Jianxun Zhang
2025-03-19 23:58   ` Jianxun Zhang
2025-03-20 14:10     ` Cavitt, Jonathan
2025-03-13 19:10 ` ✓ CI.Patch_applied: success for drm/xe/xe_vm: Implement xe_vm_get_property_ioctl (rev8) Patchwork
2025-03-13 19:10 ` ✗ CI.checkpatch: warning " Patchwork
2025-03-13 19:12 ` ✓ CI.KUnit: success " Patchwork
2025-03-13 19:24 ` ✗ CI.Build: failure " Patchwork
2025-03-13 21:26   ` Cavitt, Jonathan
2025-03-13 22:12 ` ✓ CI.Patch_applied: success for drm/xe/xe_vm: Implement xe_vm_get_property_ioctl (rev9) Patchwork
2025-03-13 22:12 ` ✗ CI.checkpatch: warning " Patchwork
2025-03-13 22:13 ` ✓ CI.KUnit: success " Patchwork
2025-03-13 22:19 ` ✗ CI.Build: failure " Patchwork

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