Intel-XE Archive on lore.kernel.org
 help / color / mirror / Atom feed
* [Intel-xe] [PATCH V9 0/6] drm/xe: Add engine scheduler control interface
@ 2023-07-27  8:22 Tejas Upadhyay
  2023-07-27  8:22 ` [Intel-xe] [PATCH V9 1/6] drm/xe: Add sysfs entries for engines under its GT Tejas Upadhyay
                   ` (12 more replies)
  0 siblings, 13 replies; 30+ messages in thread
From: Tejas Upadhyay @ 2023-07-27  8:22 UTC (permalink / raw)
  To: intel-xe

Patch series introduces this in several patches,
1. Add basic directory engine class under its GT, as below
   DUT# cat /sys/class/drm/cardX/device/tileN/gtN/engines/
   ccs/ bcs/
2. Add default entries with its value for user to go back
   to default
3,4,5 : Add individual engine properties sysfs entry
6: Introduce min/max to control in what range these properties
   can be set for elevated and non-elevated users.

VLK-46764, VLK-46767

V9 :
   - Rebase to use s/xe_engine/xe_hw_engine/ - Matt
   - Remove init_done from class_intf instead check member 
     is initialized - Matt
V8 :
   - Modify enforce_sched_limit logic - Niranjana
   - make sure min < max - Niranjana
   - Push all errors to common err path - Niranjana
V7 :
   - access engine class interface inplace of hw engine - Niranjana
   - Use some API to lower down duplication of code
   - Return EINVAL in place of EPERM
V6 :
   - Scheduling props should apply per class engine not per hardware engine - Matt
   - Do not record value of job_timeout_ms if changed based on dma_fence - Matt
   - Removed timeout validation check as range validation covers it
   - Rebase all the patches based on above changes
V5 :
   - Rebase to resolve conflicts - CI
V4 :
    - Rebase the series
    - Add CONFIG option to enable/disable min/max limitation on
      elevated user - Matt/Joonas
    - Movement of engine related code to its own file
V3 :
    - Improve class_mask logic
V2 :
    - Rebase to solve conflicts
    - Use sysfs_create_files in this patch - Niranjana
    - Handle prototype error for xe_add_engine_defaults - CI hooks
    - Remove unused member sysfs_hwe - Niranjana
    - Restric min/max setting to #define default min/max for
         elevated user - Himal
    - Remove some unrelated changes from patch - Niranjana

Testcase: https://gitlab.freedesktop.org/drm/igt-gpu-tools/-/commit/94ccbe7cdf8651d5b76588102eca545cb74caad8
Testcase: https://gitlab.freedesktop.org/drm/igt-gpu-tools/-/commit/0753ddf646df691cd1d2219192ce3a629f3e7e3f
Updated Testcase: https://patchwork.freedesktop.org/series/121046/
Tested-by: Priyanka Dandamudi <priyanka.dandamudi@intel.com>
Signed-off-by: Tejas Upadhyay <tejas.upadhyay@intel.com>

Tejas Upadhyay (6):
  drm/xe: Add sysfs entries for engines under its GT
  drm/xe: Add sysfs for default engine scheduler properties
  drm/xe: Add job timeout engine property to sysfs
  drm/xe: Add timeslice duration engine property to sysfs
  drm/xe: Add sysfs for preempt reset timeout
  drm/xe: Add min/max cap for engine scheduler properties

 drivers/gpu/drm/xe/Kconfig                    |   6 +
 drivers/gpu/drm/xe/Kconfig.profile            |  46 ++
 drivers/gpu/drm/xe/Makefile                   |   1 +
 drivers/gpu/drm/xe/xe_engine.c                |  31 +-
 drivers/gpu/drm/xe/xe_gt.c                    |   7 +
 drivers/gpu/drm/xe/xe_gt_types.h              |   3 +
 drivers/gpu/drm/xe/xe_guc_submit.c            |   3 +-
 drivers/gpu/drm/xe/xe_hw_engine.c             |  17 +
 drivers/gpu/drm/xe/xe_hw_engine.h             |  31 +
 drivers/gpu/drm/xe/xe_hw_engine_class_sysfs.c | 640 ++++++++++++++++++
 drivers/gpu/drm/xe/xe_hw_engine_class_sysfs.h |  35 +
 drivers/gpu/drm/xe/xe_hw_engine_types.h       |  37 +
 12 files changed, 847 insertions(+), 10 deletions(-)
 create mode 100644 drivers/gpu/drm/xe/Kconfig.profile
 create mode 100644 drivers/gpu/drm/xe/xe_hw_engine_class_sysfs.c
 create mode 100644 drivers/gpu/drm/xe/xe_hw_engine_class_sysfs.h

-- 
2.25.1


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

* [Intel-xe] [PATCH V9 1/6] drm/xe: Add sysfs entries for engines under its GT
  2023-07-27  8:22 [Intel-xe] [PATCH V9 0/6] drm/xe: Add engine scheduler control interface Tejas Upadhyay
@ 2023-07-27  8:22 ` Tejas Upadhyay
  2023-07-27 14:41   ` Matthew Brost
  2023-07-27  8:22 ` [Intel-xe] [PATCH V9 2/6] drm/xe: Add sysfs for default engine scheduler properties Tejas Upadhyay
                   ` (11 subsequent siblings)
  12 siblings, 1 reply; 30+ messages in thread
From: Tejas Upadhyay @ 2023-07-27  8:22 UTC (permalink / raw)
  To: intel-xe

Add engines sysfs directory under its GT and
create sub directory for all engine class
(note its not per instance) present on GT.

For example,
DUT# cat /sys/class/drm/cardX/device/tileN/gtN/engines/
bcs/ ccs/

V5 :
   - replace xe_engine with xe_hw_engine - Matt
V4 :
   - Rebase to resolve conflicts - CI
V3 :
   - Move code in its own file
   - Rename API name
V2 :
   - Correct class mask logic - Himal
   - Remove extra parenthesis

Signed-off-by: Tejas Upadhyay <tejas.upadhyay@intel.com>
---
 drivers/gpu/drm/xe/Makefile                   |   1 +
 drivers/gpu/drm/xe/xe_gt.c                    |   7 ++
 drivers/gpu/drm/xe/xe_hw_engine_class_sysfs.c | 111 ++++++++++++++++++
 drivers/gpu/drm/xe/xe_hw_engine_class_sysfs.h |  13 ++
 4 files changed, 132 insertions(+)
 create mode 100644 drivers/gpu/drm/xe/xe_hw_engine_class_sysfs.c
 create mode 100644 drivers/gpu/drm/xe/xe_hw_engine_class_sysfs.h

diff --git a/drivers/gpu/drm/xe/Makefile b/drivers/gpu/drm/xe/Makefile
index 4ea9e3150c20..a3099a4fd56b 100644
--- a/drivers/gpu/drm/xe/Makefile
+++ b/drivers/gpu/drm/xe/Makefile
@@ -52,6 +52,7 @@ xe-y += xe_bb.o \
 	xe_device_sysfs.o \
 	xe_dma_buf.o \
 	xe_engine.o \
+	xe_hw_engine_class_sysfs.o \
 	xe_exec.o \
 	xe_execlist.o \
 	xe_force_wake.o \
diff --git a/drivers/gpu/drm/xe/xe_gt.c b/drivers/gpu/drm/xe/xe_gt.c
index 3e32d38aeeea..d52eb45896a7 100644
--- a/drivers/gpu/drm/xe/xe_gt.c
+++ b/drivers/gpu/drm/xe/xe_gt.c
@@ -27,6 +27,7 @@
 #include "xe_gt_topology.h"
 #include "xe_guc_engine_types.h"
 #include "xe_hw_fence.h"
+#include "xe_hw_engine_class_sysfs.h"
 #include "xe_irq.h"
 #include "xe_lrc.h"
 #include "xe_map.h"
@@ -322,6 +323,12 @@ static int gt_fw_domain_init(struct xe_gt *gt)
 	if (err)
 		goto err_force_wake;
 
+	err = xe_hw_engine_class_sysfs_init(gt);
+	if (err)
+		drm_warn(&gt_to_xe(gt)->drm,
+			 "failed to register engines sysfs directory, err: %d\n",
+			 err);
+
 	err = xe_force_wake_put(gt_to_fw(gt), XE_FW_GT);
 	XE_WARN_ON(err);
 	xe_device_mem_access_put(gt_to_xe(gt));
diff --git a/drivers/gpu/drm/xe/xe_hw_engine_class_sysfs.c b/drivers/gpu/drm/xe/xe_hw_engine_class_sysfs.c
new file mode 100644
index 000000000000..c2f092b54af1
--- /dev/null
+++ b/drivers/gpu/drm/xe/xe_hw_engine_class_sysfs.c
@@ -0,0 +1,111 @@
+// SPDX-License-Identifier: MIT
+/*
+ * Copyright © 2023 Intel Corporation
+ */
+
+#include <drm/drm_managed.h>
+#include <linux/kobject.h>
+#include <linux/sysfs.h>
+
+#include "xe_hw_engine_class_sysfs.h"
+
+static void kobj_xe_hw_engine_release(struct kobject *kobj)
+{
+	kfree(kobj);
+}
+
+static const struct kobj_type kobj_xe_hw_engine_type = {
+	.release = kobj_xe_hw_engine_release,
+	.sysfs_ops = &kobj_sysfs_ops
+};
+
+static struct kobject *
+kobj_xe_hw_engine(struct kobject *parent, char *name)
+{
+	struct kobject *kobj;
+
+	kobj = kzalloc(sizeof(*kobj), GFP_KERNEL);
+	if (!kobj)
+		return NULL;
+
+	kobject_init(kobj, &kobj_xe_hw_engine_type);
+	if (kobject_add(kobj, parent, "%s", name)) {
+		kobject_put(kobj);
+		return NULL;
+	}
+
+	return kobj;
+}
+
+static void xe_hw_engine_sysfs_kobj_release(struct kobject *kobj)
+{
+	kfree(kobj);
+}
+
+static const struct kobj_type xe_hw_engine_sysfs_kobj_type = {
+	.release = xe_hw_engine_sysfs_kobj_release,
+	.sysfs_ops = &kobj_sysfs_ops,
+};
+
+int xe_hw_engine_class_sysfs_init(struct xe_gt *gt)
+{
+	struct xe_hw_engine *hwe;
+	enum xe_hw_engine_id id;
+	struct kobject *kobj;
+	u16 class_mask = 0;
+	int err = 0;
+
+	kobj = kzalloc(sizeof(*kobj), GFP_KERNEL);
+	if (!kobj)
+		return -ENOMEM;
+
+	kobject_init(kobj, &xe_hw_engine_sysfs_kobj_type);
+
+	err = kobject_add(kobj, gt->sysfs, "engines");
+	if (err) {
+		kobject_put(kobj);
+		return err;
+	}
+
+	for_each_hw_engine(hwe, gt, id) {
+		char name[MAX_ENGINE_CLASS_NAME_LEN];
+		struct kobject *khwe;
+
+		if (hwe->class == XE_ENGINE_CLASS_OTHER ||
+		    hwe->class == XE_ENGINE_CLASS_MAX)
+			continue;
+
+		if ((class_mask >> hwe->class) & 1)
+			continue;
+
+		class_mask |= 1 << hwe->class;
+
+		switch (hwe->class) {
+		case XE_ENGINE_CLASS_RENDER:
+			strcpy(name, "rcs");
+			break;
+		case XE_ENGINE_CLASS_VIDEO_DECODE:
+			strcpy(name, "vcs");
+			break;
+		case XE_ENGINE_CLASS_VIDEO_ENHANCE:
+			strcpy(name, "vecs");
+			break;
+		case XE_ENGINE_CLASS_COPY:
+			strcpy(name, "bcs");
+			break;
+		case XE_ENGINE_CLASS_COMPUTE:
+			strcpy(name, "ccs");
+			break;
+		default:
+			kobject_put(kobj);
+			return -EINVAL;
+		}
+
+		khwe = kobj_xe_hw_engine(kobj, name);
+		if (!khwe) {
+			kobject_put(kobj);
+			return -EINVAL;
+		}
+	}
+	return err;
+}
diff --git a/drivers/gpu/drm/xe/xe_hw_engine_class_sysfs.h b/drivers/gpu/drm/xe/xe_hw_engine_class_sysfs.h
new file mode 100644
index 000000000000..c461fac717c2
--- /dev/null
+++ b/drivers/gpu/drm/xe/xe_hw_engine_class_sysfs.h
@@ -0,0 +1,13 @@
+/* SPDX-License-Identifier: MIT */
+/*
+ * Copyright © 2023 Intel Corporation
+ */
+
+#ifndef _XE_ENGINE_CLASS_SYSFS_H_
+#define _XE_ENGINE_CLASS_SYSFS_H__
+
+#include "xe_gt.h"
+
+#define MAX_ENGINE_CLASS_NAME_LEN    16
+int xe_hw_engine_class_sysfs_init(struct xe_gt *gt);
+#endif
-- 
2.25.1


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

* [Intel-xe] [PATCH V9 2/6] drm/xe: Add sysfs for default engine scheduler properties
  2023-07-27  8:22 [Intel-xe] [PATCH V9 0/6] drm/xe: Add engine scheduler control interface Tejas Upadhyay
  2023-07-27  8:22 ` [Intel-xe] [PATCH V9 1/6] drm/xe: Add sysfs entries for engines under its GT Tejas Upadhyay
@ 2023-07-27  8:22 ` Tejas Upadhyay
  2023-07-27 14:47   ` Matthew Brost
  2023-07-27  8:22 ` [Intel-xe] [PATCH V9 3/6] drm/xe: Add job timeout engine property to sysfs Tejas Upadhyay
                   ` (10 subsequent siblings)
  12 siblings, 1 reply; 30+ messages in thread
From: Tejas Upadhyay @ 2023-07-27  8:22 UTC (permalink / raw)
  To: intel-xe

For each HW engine under GT we are adding defaults sysfs
entry to list all engine scheduler properties and its
default values. So that it will be easier for user to
fetch default values of these properties anytime to go
back to default.

For example,
DUT# cat /sys/class/drm/card1/device/tileN/gtN/engines/bcs/.defaults/
job_timeout_ms         preempt_timeout_us     timeslice_duration_us

where,
@job_timeout_ms: The time after which a job is removed from the scheduler.
@preempt_timeout_us: How long to wait (in microseconds) for a preemption
                     event to occur when submitting a new context.
@timeslice_duration_us: Each context is scheduled for execution for the
                        timeslice duration, before switching to the next
                        context.

V8 :
   - replace xe_engine with xe_hw_engine - Matt
V7 :
   - Push all errors to one error path at every places - Niranjana
   - Describe struct member to resolve kernel doc err - CI hooks
V6 :
   - Use engine class interface instead of hw engine
     in sysfs for better interfacing readability - Niranjana
V5 :
   - Scheduling props should apply per class engine not per hardware engine - Matt
   - Do not record value of job_timeout_ms if changed based on dma_fence - Matt
V4 :
   - Resolve merge conflicts - CI
V3 :
   - Rearrange code in its own file
   - Rebase
   - Update commit message to reflect tile addition
V2 :
   - Use sysfs_create_files in this patch - Niranjana
   - Handle prototype error for xe_add_engine_defaults - CI hooks
   - Remove unused member sysfs_hwe - Niranjana

Signed-off-by: Tejas Upadhyay <tejas.upadhyay@intel.com>
---
 drivers/gpu/drm/xe/xe_engine.c                |   6 +-
 drivers/gpu/drm/xe/xe_gt_types.h              |   3 +
 drivers/gpu/drm/xe/xe_guc_submit.c            |   3 +-
 drivers/gpu/drm/xe/xe_hw_engine.c             |   9 ++
 drivers/gpu/drm/xe/xe_hw_engine_class_sysfs.c | 118 +++++++++++++++---
 drivers/gpu/drm/xe/xe_hw_engine_class_sysfs.h |  20 +++
 drivers/gpu/drm/xe/xe_hw_engine_types.h       |  37 ++++++
 7 files changed, 173 insertions(+), 23 deletions(-)

diff --git a/drivers/gpu/drm/xe/xe_engine.c b/drivers/gpu/drm/xe/xe_engine.c
index 0102dad16e29..9e167b113963 100644
--- a/drivers/gpu/drm/xe/xe_engine.c
+++ b/drivers/gpu/drm/xe/xe_engine.c
@@ -53,9 +53,9 @@ static struct xe_engine *__xe_engine_create(struct xe_device *xe,
 	INIT_LIST_HEAD(&e->compute.link);
 	INIT_LIST_HEAD(&e->multi_gt_link);
 
-	/* FIXME: Wire up to configurable default value */
-	e->sched_props.timeslice_us = 1 * 1000;
-	e->sched_props.preempt_timeout_us = 640 * 1000;
+	e->sched_props.timeslice_us = hwe->eclass->sched_props.timeslice_us;
+	e->sched_props.preempt_timeout_us =
+				hwe->eclass->sched_props.preempt_timeout_us;
 
 	if (xe_engine_is_parallel(e)) {
 		e->parallel.composite_fence_ctx = dma_fence_context_alloc(1);
diff --git a/drivers/gpu/drm/xe/xe_gt_types.h b/drivers/gpu/drm/xe/xe_gt_types.h
index 78a9fe9f0bd3..d70460feeb96 100644
--- a/drivers/gpu/drm/xe/xe_gt_types.h
+++ b/drivers/gpu/drm/xe/xe_gt_types.h
@@ -286,6 +286,9 @@ struct xe_gt {
 	/** @hw_engines: hardware engines on the GT */
 	struct xe_hw_engine hw_engines[XE_NUM_HW_ENGINES];
 
+	/** @eclass: per hardware engine class interface on the GT */
+	struct xe_hw_engine_class_intf  eclass[XE_ENGINE_CLASS_MAX];
+
 	/** @pcode: GT's PCODE */
 	struct {
 		/** @lock: protecting GT's PCODE mailbox data */
diff --git a/drivers/gpu/drm/xe/xe_guc_submit.c b/drivers/gpu/drm/xe/xe_guc_submit.c
index 911d4965c27c..7978f7efd702 100644
--- a/drivers/gpu/drm/xe/xe_guc_submit.c
+++ b/drivers/gpu/drm/xe/xe_guc_submit.c
@@ -1128,7 +1128,8 @@ static int guc_engine_init(struct xe_engine *e)
 	ge->engine = e;
 	init_waitqueue_head(&ge->suspend_wait);
 
-	timeout = xe_vm_no_dma_fences(e->vm) ? MAX_SCHEDULE_TIMEOUT : HZ * 5;
+	timeout = xe_vm_no_dma_fences(e->vm) ? MAX_SCHEDULE_TIMEOUT :
+		  e->hwe->eclass->sched_props.job_timeout_ms;
 	err = drm_sched_init(&ge->sched, &drm_sched_ops, NULL,
 			     e->lrc[0].ring.size / MAX_JOB_SIZE_BYTES,
 			     64, timeout, guc_to_gt(guc)->ordered_wq, NULL,
diff --git a/drivers/gpu/drm/xe/xe_hw_engine.c b/drivers/gpu/drm/xe/xe_hw_engine.c
index 1af5cccd1142..afa7d25c3852 100644
--- a/drivers/gpu/drm/xe/xe_hw_engine.c
+++ b/drivers/gpu/drm/xe/xe_hw_engine.c
@@ -362,6 +362,15 @@ static void hw_engine_init_early(struct xe_gt *gt, struct xe_hw_engine *hwe,
 	hwe->fence_irq = &gt->fence_irq[info->class];
 	hwe->engine_id = id;
 
+	if (!gt->eclass[hwe->class].sched_props.job_timeout_ms) {
+		gt->eclass[hwe->class].sched_props.job_timeout_ms = HZ * 5;
+		gt->eclass[hwe->class].sched_props.timeslice_us = 1 * 1000;
+		gt->eclass[hwe->class].sched_props.preempt_timeout_us = 640 * 1000;
+		/* Record default props */
+		gt->eclass[hwe->class].defaults = gt->eclass[hwe->class].sched_props;
+	}
+	hwe->eclass = &gt->eclass[hwe->class];
+
 	xe_reg_sr_init(&hwe->reg_sr, hwe->name, gt_to_xe(gt));
 	xe_wa_process_engine(hwe);
 	hw_engine_setup_default_state(hwe);
diff --git a/drivers/gpu/drm/xe/xe_hw_engine_class_sysfs.c b/drivers/gpu/drm/xe/xe_hw_engine_class_sysfs.c
index c2f092b54af1..15c2b0b9f1fd 100644
--- a/drivers/gpu/drm/xe/xe_hw_engine_class_sysfs.c
+++ b/drivers/gpu/drm/xe/xe_hw_engine_class_sysfs.c
@@ -9,6 +9,8 @@
 
 #include "xe_hw_engine_class_sysfs.h"
 
+static int xe_add_hw_engine_class_defaults(struct kobject *parent);
+
 static void kobj_xe_hw_engine_release(struct kobject *kobj)
 {
 	kfree(kobj);
@@ -19,22 +21,88 @@ static const struct kobj_type kobj_xe_hw_engine_type = {
 	.sysfs_ops = &kobj_sysfs_ops
 };
 
-static struct kobject *
-kobj_xe_hw_engine(struct kobject *parent, char *name)
+static struct kobj_eclass *
+kobj_xe_hw_engine_class(struct kobject *parent, char *name)
+{
+	struct kobj_eclass *keclass;
+
+	keclass = kzalloc(sizeof(*keclass), GFP_KERNEL);
+	if (!keclass)
+		return NULL;
+
+	kobject_init(&keclass->base, &kobj_xe_hw_engine_type);
+	if (kobject_add(&keclass->base, parent, "%s", name)) {
+		kobject_put(&keclass->base);
+		return NULL;
+	}
+
+	return keclass;
+}
+
+static ssize_t job_timeout_default(struct kobject *kobj,
+				   struct kobj_attribute *attr, char *buf)
+{
+	struct xe_hw_engine_class_intf *eclass = kobj_to_eclass(kobj->parent);
+
+	return sprintf(buf, "%u\n", eclass->defaults.job_timeout_ms);
+}
+
+static struct kobj_attribute job_timeout_def =
+__ATTR(job_timeout_ms, 0444, job_timeout_default, NULL);
+
+static ssize_t timeslice_default(struct kobject *kobj,
+				 struct kobj_attribute *attr, char *buf)
+{
+	struct xe_hw_engine_class_intf *eclass = kobj_to_eclass(kobj->parent);
+
+	return sprintf(buf, "%u\n", eclass->defaults.timeslice_us);
+}
+
+static struct kobj_attribute timeslice_duration_def =
+__ATTR(timeslice_duration_us, 0444, timeslice_default, NULL);
+
+static ssize_t preempt_timeout_default(struct kobject *kobj,
+				       struct kobj_attribute *attr,
+				       char *buf)
+{
+	struct xe_hw_engine_class_intf *eclass = kobj_to_eclass(kobj->parent);
+
+	return sprintf(buf, "%u\n", eclass->defaults.preempt_timeout_us);
+}
+
+static struct kobj_attribute preempt_timeout_def =
+__ATTR(preempt_timeout_us, 0444, preempt_timeout_default, NULL);
+
+static const struct attribute *defaults[] = {
+	&job_timeout_def.attr,
+	&timeslice_duration_def.attr,
+	&preempt_timeout_def.attr,
+	NULL
+};
+
+static int xe_add_hw_engine_class_defaults(struct kobject *parent)
 {
 	struct kobject *kobj;
+	int err = 0;
 
 	kobj = kzalloc(sizeof(*kobj), GFP_KERNEL);
 	if (!kobj)
-		return NULL;
+		return -ENOMEM;
 
 	kobject_init(kobj, &kobj_xe_hw_engine_type);
-	if (kobject_add(kobj, parent, "%s", name)) {
-		kobject_put(kobj);
-		return NULL;
-	}
 
-	return kobj;
+	err = kobject_add(kobj, parent, "%s", ".defaults");
+	if (err)
+		goto err_object;
+
+	err = sysfs_create_files(kobj, defaults);
+	if (err)
+		goto err_object;
+
+	return err;
+err_object:
+	kobject_put(kobj);
+	return err;
 }
 
 static void xe_hw_engine_sysfs_kobj_release(struct kobject *kobj)
@@ -62,14 +130,12 @@ int xe_hw_engine_class_sysfs_init(struct xe_gt *gt)
 	kobject_init(kobj, &xe_hw_engine_sysfs_kobj_type);
 
 	err = kobject_add(kobj, gt->sysfs, "engines");
-	if (err) {
-		kobject_put(kobj);
-		return err;
-	}
+	if (err)
+		goto err_object;
 
 	for_each_hw_engine(hwe, gt, id) {
 		char name[MAX_ENGINE_CLASS_NAME_LEN];
-		struct kobject *khwe;
+		struct kobj_eclass *keclass;
 
 		if (hwe->class == XE_ENGINE_CLASS_OTHER ||
 		    hwe->class == XE_ENGINE_CLASS_MAX)
@@ -97,15 +163,29 @@ int xe_hw_engine_class_sysfs_init(struct xe_gt *gt)
 			strcpy(name, "ccs");
 			break;
 		default:
-			kobject_put(kobj);
-			return -EINVAL;
+			err = -EINVAL;
+			goto err_object;
 		}
 
-		khwe = kobj_xe_hw_engine(kobj, name);
-		if (!khwe) {
-			kobject_put(kobj);
-			return -EINVAL;
+		keclass = kobj_xe_hw_engine_class(kobj, name);
+		if (!keclass) {
+			err = -EINVAL;
+			goto err_object;
 		}
+
+		keclass->eclass = hwe->eclass;
+		err = xe_add_hw_engine_class_defaults(&keclass->base);
+		if (err) {
+			drm_warn(&gt_to_xe(gt)->drm,
+				 "Warning: adding .defaults to engines failed!, err: %d\n",
+				 err);
+			goto err_object;
+		}
+
 	}
+
+	return err;
+err_object:
+	kobject_put(kobj);
 	return err;
 }
diff --git a/drivers/gpu/drm/xe/xe_hw_engine_class_sysfs.h b/drivers/gpu/drm/xe/xe_hw_engine_class_sysfs.h
index c461fac717c2..757136614672 100644
--- a/drivers/gpu/drm/xe/xe_hw_engine_class_sysfs.h
+++ b/drivers/gpu/drm/xe/xe_hw_engine_class_sysfs.h
@@ -10,4 +10,24 @@
 
 #define MAX_ENGINE_CLASS_NAME_LEN    16
 int xe_hw_engine_class_sysfs_init(struct xe_gt *gt);
+
+/**
+ * struct kobj_eclass - A eclass's kobject struct that connects the kobject and the
+ * eclass.
+ *
+ * When dealing with multiple eclass, this struct helps to understand which eclass
+ * needs to be addressed on a given sysfs call.
+ */
+struct kobj_eclass {
+	/** @base: The actual kobject */
+	struct kobject base;
+	/** @eclass: A pointer to the hw engine class interface */
+	struct xe_hw_engine_class_intf *eclass;
+};
+
+static inline struct xe_hw_engine_class_intf *kobj_to_eclass(struct kobject *kobj)
+{
+	return container_of(kobj, struct kobj_eclass, base)->eclass;
+}
+
 #endif
diff --git a/drivers/gpu/drm/xe/xe_hw_engine_types.h b/drivers/gpu/drm/xe/xe_hw_engine_types.h
index 803d557cf5aa..97d9ba31b5fc 100644
--- a/drivers/gpu/drm/xe/xe_hw_engine_types.h
+++ b/drivers/gpu/drm/xe/xe_hw_engine_types.h
@@ -63,6 +63,41 @@ struct xe_bo;
 struct xe_execlist_port;
 struct xe_gt;
 
+/**
+ * struct xe_hw_engine_class_intf - per hw engine class struct interface
+ *
+ * Contains all the hw engine properties per engine class.
+ *
+ * @sched_props: scheduling properties
+ * @defaults: default scheduling properties
+ */
+struct xe_hw_engine_class_intf {
+	/**
+	 * @sched_props: scheduling properties
+	 * @defaults: default scheduling properties
+	 */
+	struct {
+		/** @set_job_timeout: Set job timeout in ms for engine */
+		u32 job_timeout_ms;
+		/** @job_timeout_min: Min job timeout in ms for engine */
+		u32 job_timeout_min;
+		/** @job_timeout_max: Max job timeout in ms for engine */
+		u32 job_timeout_max;
+		/** @timeslice_us: timeslice period in micro-seconds */
+		u32 timeslice_us;
+		/** @timeslice_min: min timeslice period in micro-seconds */
+		u32 timeslice_min;
+		/** @timeslice_max: max timeslice period in micro-seconds */
+		u32 timeslice_max;
+		/** @preempt_timeout_us: preemption timeout in micro-seconds */
+		u32 preempt_timeout_us;
+		/** @preempt_timeout_min: min preemption timeout in micro-seconds */
+		u32 preempt_timeout_min;
+		/** @preempt_timeout_max: max preemption timeout in micro-seconds */
+		u32 preempt_timeout_max;
+	} sched_props, defaults;
+};
+
 /**
  * struct xe_hw_engine - Hardware engine
  *
@@ -107,6 +142,8 @@ struct xe_hw_engine {
 	void (*irq_handler)(struct xe_hw_engine *hwe, u16 intr_vec);
 	/** @engine_id: id  for this hw engine */
 	enum xe_hw_engine_id engine_id;
+	/** @eclass: pointer to per hw engine class interface */
+	struct xe_hw_engine_class_intf *eclass;
 };
 
 /**
-- 
2.25.1


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

* [Intel-xe] [PATCH V9 3/6] drm/xe: Add job timeout engine property to sysfs
  2023-07-27  8:22 [Intel-xe] [PATCH V9 0/6] drm/xe: Add engine scheduler control interface Tejas Upadhyay
  2023-07-27  8:22 ` [Intel-xe] [PATCH V9 1/6] drm/xe: Add sysfs entries for engines under its GT Tejas Upadhyay
  2023-07-27  8:22 ` [Intel-xe] [PATCH V9 2/6] drm/xe: Add sysfs for default engine scheduler properties Tejas Upadhyay
@ 2023-07-27  8:22 ` Tejas Upadhyay
  2023-07-27 14:51   ` Matthew Brost
  2023-07-27  8:22 ` [Intel-xe] [PATCH V9 4/6] drm/xe: Add timeslice duration " Tejas Upadhyay
                   ` (9 subsequent siblings)
  12 siblings, 1 reply; 30+ messages in thread
From: Tejas Upadhyay @ 2023-07-27  8:22 UTC (permalink / raw)
  To: intel-xe

The time after which a job is removed from the scheduler.
Add sysfs entry to provide user defined job timeout to
scheduler.

The job timeout can be adjusted per-engine class using,

/sys/class/drm/cardX/device/tileN/gtN/engines/ccs/job_timeout_ms

V7:
  - Rebase to use s/xe_engine/xe_hw_engine/ - Matt
V6:
  - Remove timeout validation, not relevant - Niranjana
  - Rebase to use common error path
V5:
  - Rebase to use engine class interface instead of hw engine
V4:
  - Rebase to per class engine props interface
V3:
  - Rebase
  - Update commit message to reflect tile update
V2:
  - Use sysfs_create_files as part of this patch

Signed-off-by: Tejas Upadhyay <tejas.upadhyay@intel.com>
---
 drivers/gpu/drm/xe/xe_hw_engine_class_sysfs.c | 36 +++++++++++++++++++
 1 file changed, 36 insertions(+)

diff --git a/drivers/gpu/drm/xe/xe_hw_engine_class_sysfs.c b/drivers/gpu/drm/xe/xe_hw_engine_class_sysfs.c
index 15c2b0b9f1fd..5e2dba0be8eb 100644
--- a/drivers/gpu/drm/xe/xe_hw_engine_class_sysfs.c
+++ b/drivers/gpu/drm/xe/xe_hw_engine_class_sysfs.c
@@ -39,6 +39,34 @@ kobj_xe_hw_engine_class(struct kobject *parent, char *name)
 	return keclass;
 }
 
+static ssize_t job_timeout_store(struct kobject *kobj,
+				 struct kobj_attribute *attr,
+				 const char *buf, size_t count)
+{
+	struct xe_hw_engine_class_intf *eclass = kobj_to_eclass(kobj);
+	u32 timeout;
+	int err;
+
+	err = kstrtou32(buf, 0, &timeout);
+	if (err)
+		return err;
+
+	WRITE_ONCE(eclass->sched_props.job_timeout_ms, timeout);
+
+	return count;
+}
+
+static ssize_t job_timeout_show(struct kobject *kobj,
+				struct kobj_attribute *attr, char *buf)
+{
+	struct xe_hw_engine_class_intf *eclass = kobj_to_eclass(kobj);
+
+	return sprintf(buf, "%u\n", eclass->sched_props.job_timeout_ms);
+}
+
+static struct kobj_attribute job_timeout_attr =
+__ATTR(job_timeout_ms, 0644, job_timeout_show, job_timeout_store);
+
 static ssize_t job_timeout_default(struct kobject *kobj,
 				   struct kobj_attribute *attr, char *buf)
 {
@@ -80,6 +108,11 @@ static const struct attribute *defaults[] = {
 	NULL
 };
 
+static const struct attribute *files[] = {
+	&job_timeout_attr.attr,
+	NULL
+};
+
 static int xe_add_hw_engine_class_defaults(struct kobject *parent)
 {
 	struct kobject *kobj;
@@ -182,6 +215,9 @@ int xe_hw_engine_class_sysfs_init(struct xe_gt *gt)
 			goto err_object;
 		}
 
+		err = sysfs_create_files(&keclass->base, files);
+		if (err)
+			goto err_object;
 	}
 
 	return err;
-- 
2.25.1


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

* [Intel-xe] [PATCH V9 4/6] drm/xe: Add timeslice duration engine property to sysfs
  2023-07-27  8:22 [Intel-xe] [PATCH V9 0/6] drm/xe: Add engine scheduler control interface Tejas Upadhyay
                   ` (2 preceding siblings ...)
  2023-07-27  8:22 ` [Intel-xe] [PATCH V9 3/6] drm/xe: Add job timeout engine property to sysfs Tejas Upadhyay
@ 2023-07-27  8:22 ` Tejas Upadhyay
  2023-07-27 14:52   ` Matthew Brost
  2023-07-27  8:22 ` [Intel-xe] [PATCH V9 5/6] drm/xe: Add sysfs for preempt reset timeout Tejas Upadhyay
                   ` (8 subsequent siblings)
  12 siblings, 1 reply; 30+ messages in thread
From: Tejas Upadhyay @ 2023-07-27  8:22 UTC (permalink / raw)
  To: intel-xe

Timeslices between multiple context is supported via
guc scheduling. Add sysfs entry to provide user defined
timeslice duration to guc scheduling.

The timeslice duration can be adjusted per-engine class using,

/sys/class/drm/cardX/device/tileN/gtN/engines/ccs/timeslice_duration_us

V7:
  - Rebase to use s/xe_engine/xe_hw_engine/ - Matt
V6:
  - Remove duration validation, not relevant - Niranjana
V5:
  - Rebase to replace hw engine with eclass interface
V4:
  - Rebase to per class engine props interface
V3:
  - Rebase
  - Update commit messge to add tile
V2:
  - Rebase

Signed-off-by: Tejas Upadhyay <tejas.upadhyay@intel.com>
---
 drivers/gpu/drm/xe/xe_hw_engine_class_sysfs.c | 30 +++++++++++++++++++
 1 file changed, 30 insertions(+)

diff --git a/drivers/gpu/drm/xe/xe_hw_engine_class_sysfs.c b/drivers/gpu/drm/xe/xe_hw_engine_class_sysfs.c
index 5e2dba0be8eb..b1c13d27bcf4 100644
--- a/drivers/gpu/drm/xe/xe_hw_engine_class_sysfs.c
+++ b/drivers/gpu/drm/xe/xe_hw_engine_class_sysfs.c
@@ -78,6 +78,35 @@ static ssize_t job_timeout_default(struct kobject *kobj,
 static struct kobj_attribute job_timeout_def =
 __ATTR(job_timeout_ms, 0444, job_timeout_default, NULL);
 
+static ssize_t timeslice_duration_store(struct kobject *kobj,
+					struct kobj_attribute *attr,
+					const char *buf, size_t count)
+{
+	struct xe_hw_engine_class_intf *eclass = kobj_to_eclass(kobj);
+	u32 duration;
+	int err;
+
+	err = kstrtou32(buf, 0, &duration);
+	if (err)
+		return err;
+
+	WRITE_ONCE(eclass->sched_props.timeslice_us, duration);
+
+	return count;
+}
+
+static ssize_t timeslice_duration_show(struct kobject *kobj,
+		struct kobj_attribute *attr, char *buf)
+{
+	struct xe_hw_engine_class_intf *eclass = kobj_to_eclass(kobj);
+
+	return sprintf(buf, "%u\n", eclass->sched_props.timeslice_us);
+}
+
+static struct kobj_attribute timeslice_duration_attr =
+	__ATTR(timeslice_duration_us, 0644, timeslice_duration_show,
+	       timeslice_duration_store);
+
 static ssize_t timeslice_default(struct kobject *kobj,
 				 struct kobj_attribute *attr, char *buf)
 {
@@ -110,6 +139,7 @@ static const struct attribute *defaults[] = {
 
 static const struct attribute *files[] = {
 	&job_timeout_attr.attr,
+	&timeslice_duration_attr.attr,
 	NULL
 };
 
-- 
2.25.1


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

* [Intel-xe] [PATCH V9 5/6] drm/xe: Add sysfs for preempt reset timeout
  2023-07-27  8:22 [Intel-xe] [PATCH V9 0/6] drm/xe: Add engine scheduler control interface Tejas Upadhyay
                   ` (3 preceding siblings ...)
  2023-07-27  8:22 ` [Intel-xe] [PATCH V9 4/6] drm/xe: Add timeslice duration " Tejas Upadhyay
@ 2023-07-27  8:22 ` Tejas Upadhyay
  2023-07-27 14:54   ` Matthew Brost
  2023-07-27  8:22 ` [Intel-xe] [PATCH V9 6/6] drm/xe: Add min/max cap for engine scheduler properties Tejas Upadhyay
                   ` (7 subsequent siblings)
  12 siblings, 1 reply; 30+ messages in thread
From: Tejas Upadhyay @ 2023-07-27  8:22 UTC (permalink / raw)
  To: intel-xe

The preemption request and timeout is used for
higher priority context or kill hung context and reset
gpu.

The preempt timeout can be adjusted per-engine class using,

/sys/class/drm/cardX/device/tileN/gtN/engines/ccs/preempt_timeout_us

and can be disabled by setting it to 0.

V6:
  - Rebase to use s/xe_engine/xe_hw_engine/ - Matt
V5:
  - Remove timeout validation, not relevant - Niranjana
V4:
  - Rebase to replace hw engine with eclass interface
V3:
  - Rebase to per class engine props interface
V2:
  - Rebase
  - Update commit message to add tile

Signed-off-by: Tejas Upadhyay <tejas.upadhyay@intel.com>
---
 drivers/gpu/drm/xe/xe_hw_engine_class_sysfs.c | 29 +++++++++++++++++++
 1 file changed, 29 insertions(+)

diff --git a/drivers/gpu/drm/xe/xe_hw_engine_class_sysfs.c b/drivers/gpu/drm/xe/xe_hw_engine_class_sysfs.c
index b1c13d27bcf4..990bb675d1e0 100644
--- a/drivers/gpu/drm/xe/xe_hw_engine_class_sysfs.c
+++ b/drivers/gpu/drm/xe/xe_hw_engine_class_sysfs.c
@@ -118,6 +118,34 @@ static ssize_t timeslice_default(struct kobject *kobj,
 static struct kobj_attribute timeslice_duration_def =
 __ATTR(timeslice_duration_us, 0444, timeslice_default, NULL);
 
+static ssize_t preempt_timeout_store(struct kobject *kobj,
+				     struct kobj_attribute *attr,
+				     const char *buf, size_t count)
+{
+	struct xe_hw_engine_class_intf *eclass = kobj_to_eclass(kobj);
+	u32 timeout;
+	int err;
+
+	err = kstrtou32(buf, 0, &timeout);
+	if (err)
+		return err;
+
+	WRITE_ONCE(eclass->sched_props.preempt_timeout_us, timeout);
+
+	return count;
+}
+
+static ssize_t preempt_timeout_show(struct kobject *kobj,
+				    struct kobj_attribute *attr, char *buf)
+{
+	struct xe_hw_engine_class_intf *eclass = kobj_to_eclass(kobj);
+
+	return sprintf(buf, "%u\n", eclass->sched_props.preempt_timeout_us);
+}
+
+static struct kobj_attribute preempt_timeout_attr =
+__ATTR(preempt_timeout_us, 0644, preempt_timeout_show, preempt_timeout_store);
+
 static ssize_t preempt_timeout_default(struct kobject *kobj,
 				       struct kobj_attribute *attr,
 				       char *buf)
@@ -140,6 +168,7 @@ static const struct attribute *defaults[] = {
 static const struct attribute *files[] = {
 	&job_timeout_attr.attr,
 	&timeslice_duration_attr.attr,
+	&preempt_timeout_attr.attr,
 	NULL
 };
 
-- 
2.25.1


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

* [Intel-xe] [PATCH V9 6/6] drm/xe: Add min/max cap for engine scheduler properties
  2023-07-27  8:22 [Intel-xe] [PATCH V9 0/6] drm/xe: Add engine scheduler control interface Tejas Upadhyay
                   ` (4 preceding siblings ...)
  2023-07-27  8:22 ` [Intel-xe] [PATCH V9 5/6] drm/xe: Add sysfs for preempt reset timeout Tejas Upadhyay
@ 2023-07-27  8:22 ` Tejas Upadhyay
  2023-07-27 15:26   ` Matthew Brost
  2023-07-27  8:59 ` [Intel-xe] ✓ CI.Patch_applied: success for drm/xe: Add engine scheduler control interface (rev9) Patchwork
                   ` (6 subsequent siblings)
  12 siblings, 1 reply; 30+ messages in thread
From: Tejas Upadhyay @ 2023-07-27  8:22 UTC (permalink / raw)
  To: intel-xe

Add sysfs entries for the min, max, and defaults for each of
engine scheduler controls for every hardware engine class.

Non-elevated user IOCTLs to set these controls must be within
the min-max ranges of the sysfs entries, elevated user can set
these controls to any value. However, introduced compile time
CONFIG min-max values which restricts elevated user to be in
compile time min-max range if at all sysfs min/max are violated.

Sysfs entries examples are,
DUT# cat /sys/class/drm/cardX/device/tileN/gtN/engines/ccs/.defaults/
job_timeout_max         job_timeout_ms          preempt_timeout_min     timeslice_duration_max  timeslice_duration_us
job_timeout_min         preempt_timeout_max     preempt_timeout_us      timeslice_duration_min

DUT# cat /sys/class/drm/card1/device/tileN/gtN/engines/ccs/
.defaults/              job_timeout_min         preempt_timeout_max     preempt_timeout_us      timeslice_duration_min
job_timeout_max         job_timeout_ms          preempt_timeout_min     timeslice_duration_max  timeslice_duration_us

V9 :
   - Rebase to use s/xe_engine/xe_hw_engine/ - Matt
V8 :
   - fix enforce_sched_limit and avoid code duplication - Niranjana
   - Make sure min < max - Niranjana
V7 :
   - Rebase to replace hw engine with eclass interface
   - return EINVAL in place of EPERM
   - Use some APIs to avoid code duplication
V6 :
   - Rebase changes to reflect per engine class props interface - MattB
   - Use #if ENABLED - MattB
   - Remove MAX_SCHED_TIMEOUT check as range validation is enough
V5 :
   - Rebase to resolve conflicts - CI
V4 :
   - Rebase
   - Update commit to reflect tile addition
   - Use XE_HW macro directly as they are already filtered
     for CONFIG checks - Niranjana
   - Add CONFIG for enable/disable min/max limitation
     on elevated user. Default is enable - Matt/Joonas
V3 :
   - Resolve CI hooks warning for kernel-doc
V2 :
   - Restric min/max setting to #define default min/max for
     elevated user - Himal
   - Remove unrelated changes from patch - Niranjana

Signed-off-by: Tejas Upadhyay <tejas.upadhyay@intel.com>
---
 drivers/gpu/drm/xe/Kconfig                    |   6 +
 drivers/gpu/drm/xe/Kconfig.profile            |  46 +++
 drivers/gpu/drm/xe/xe_engine.c                |  25 +-
 drivers/gpu/drm/xe/xe_hw_engine.c             |   8 +
 drivers/gpu/drm/xe/xe_hw_engine.h             |  31 ++
 drivers/gpu/drm/xe/xe_hw_engine_class_sysfs.c | 354 ++++++++++++++++++
 drivers/gpu/drm/xe/xe_hw_engine_class_sysfs.h |   2 +
 7 files changed, 466 insertions(+), 6 deletions(-)
 create mode 100644 drivers/gpu/drm/xe/Kconfig.profile

diff --git a/drivers/gpu/drm/xe/Kconfig b/drivers/gpu/drm/xe/Kconfig
index d44794f99338..0a4ea965645b 100644
--- a/drivers/gpu/drm/xe/Kconfig
+++ b/drivers/gpu/drm/xe/Kconfig
@@ -83,3 +83,9 @@ depends on DRM_XE
 depends on EXPERT
 source "drivers/gpu/drm/xe/Kconfig.debug"
 endmenu
+
+menu "drm/xe Profile Guided Optimisation"
+	visible if EXPERT
+	depends on DRM_XE
+	source "drivers/gpu/drm/xe/Kconfig.profile"
+endmenu
diff --git a/drivers/gpu/drm/xe/Kconfig.profile b/drivers/gpu/drm/xe/Kconfig.profile
new file mode 100644
index 000000000000..e72f15ec4bf6
--- /dev/null
+++ b/drivers/gpu/drm/xe/Kconfig.profile
@@ -0,0 +1,46 @@
+config DRM_XE_JOB_TIMEOUT_MAX
+       int "Default max job timeout (ms)"
+       default 10000 # milliseconds
+       help
+         Configures the default max job timeout after which job will
+         be forcefully taken away from scheduler.
+config DRM_XE_JOB_TIMEOUT_MIN
+       int "Default max job timeout (ms)"
+       default 1 # milliseconds
+       help
+         Configures the default min job timeout after which job will
+         be forcefully taken away from scheduler.
+config DRM_XE_TIMESLICE_MAX
+       int "Default max timeslice duration (us)"
+       default 10000000 # microseconds
+       help
+         Configures the default max timeslice duration between multiple
+         contexts by guc scheduling.
+config DRM_XE_TIMESLICE_MIN
+       int "Default min timeslice duration (us)"
+       default 1 # microseconds
+       help
+         Configures the default min timeslice duration between multiple
+         contexts by guc scheduling.
+config DRM_XE_PREEMPT_TIMEOUT_MAX
+       int "Default max  preempt timeout (us)"
+       default 10000000 # microseconds
+       help
+         Configures the default max preempt timeout after which context
+         will be forcefully taken away and higher priority context will
+         run.
+config DRM_XE_PREEMPT_TIMEOUT_MIN
+       int "Default min  preempt timeout (us)"
+       default 1 # microseconds
+       help
+         Configures the default min preempt timeout after which context
+         will be forcefully taken away and higher priority context will
+         run.
+config DRM_XE_ENABLE_SCHEDTIMEOUT_LIMIT
+       bool "Default configuration of limitation on scheduler timeout"
+       default y
+       help
+	 Configures the enablement of limitation on scheduler timeout
+	 to apply to applicable user. For elevated user, all above MIN
+	 and MAX values will apply when this configuration is enable to
+	 apply limitation. By default limitation is applied.
diff --git a/drivers/gpu/drm/xe/xe_engine.c b/drivers/gpu/drm/xe/xe_engine.c
index 9e167b113963..d934196eb79f 100644
--- a/drivers/gpu/drm/xe/xe_engine.c
+++ b/drivers/gpu/drm/xe/xe_engine.c
@@ -13,6 +13,7 @@
 
 #include "xe_device.h"
 #include "xe_gt.h"
+#include "xe_hw_engine_class_sysfs.h"
 #include "xe_hw_fence.h"
 #include "xe_lrc.h"
 #include "xe_macros.h"
@@ -191,8 +192,12 @@ static int engine_set_priority(struct xe_device *xe, struct xe_engine *e,
 static int engine_set_timeslice(struct xe_device *xe, struct xe_engine *e,
 				u64 value, bool create)
 {
-	if (!capable(CAP_SYS_NICE))
-		return -EPERM;
+	u32 min = e->hwe->eclass->sched_props.timeslice_min;
+	u32 max = e->hwe->eclass->sched_props.timeslice_max;
+
+	if (enforce_schedule_limit() &&
+	    !engine_timeout_in_range(value, min, max))
+		return -EINVAL;
 
 	return e->ops->set_timeslice(e, value);
 }
@@ -201,8 +206,12 @@ static int engine_set_preemption_timeout(struct xe_device *xe,
 					 struct xe_engine *e, u64 value,
 					 bool create)
 {
-	if (!capable(CAP_SYS_NICE))
-		return -EPERM;
+	u32 min = e->hwe->eclass->sched_props.preempt_timeout_min;
+	u32 max = e->hwe->eclass->sched_props.preempt_timeout_max;
+
+	if (enforce_schedule_limit() &&
+	    !engine_timeout_in_range(value, min, max))
+		return -EINVAL;
 
 	return e->ops->set_preempt_timeout(e, value);
 }
@@ -266,11 +275,15 @@ static int engine_set_persistence(struct xe_device *xe, struct xe_engine *e,
 static int engine_set_job_timeout(struct xe_device *xe, struct xe_engine *e,
 				  u64 value, bool create)
 {
+	u32 min = e->hwe->eclass->sched_props.job_timeout_min;
+	u32 max = e->hwe->eclass->sched_props.job_timeout_max;
+
 	if (XE_IOCTL_DBG(xe, !create))
 		return -EINVAL;
 
-	if (!capable(CAP_SYS_NICE))
-		return -EPERM;
+	if (enforce_schedule_limit() &&
+	    !engine_timeout_in_range(value, min, max))
+		return -EINVAL;
 
 	return e->ops->set_job_timeout(e, value);
 }
diff --git a/drivers/gpu/drm/xe/xe_hw_engine.c b/drivers/gpu/drm/xe/xe_hw_engine.c
index afa7d25c3852..e601bffe3b13 100644
--- a/drivers/gpu/drm/xe/xe_hw_engine.c
+++ b/drivers/gpu/drm/xe/xe_hw_engine.c
@@ -364,8 +364,16 @@ static void hw_engine_init_early(struct xe_gt *gt, struct xe_hw_engine *hwe,
 
 	if (!gt->eclass[hwe->class].sched_props.job_timeout_ms) {
 		gt->eclass[hwe->class].sched_props.job_timeout_ms = HZ * 5;
+		gt->eclass[hwe->class].sched_props.job_timeout_min = XE_HW_ENGINE_JOB_TIMEOUT_MIN;
+		gt->eclass[hwe->class].sched_props.job_timeout_max = XE_HW_ENGINE_JOB_TIMEOUT_MAX;
 		gt->eclass[hwe->class].sched_props.timeslice_us = 1 * 1000;
+		gt->eclass[hwe->class].sched_props.timeslice_min = XE_HW_ENGINE_TIMESLICE_MIN;
+		gt->eclass[hwe->class].sched_props.timeslice_max = XE_HW_ENGINE_TIMESLICE_MAX;
 		gt->eclass[hwe->class].sched_props.preempt_timeout_us = 640 * 1000;
+		gt->eclass[hwe->class].sched_props.preempt_timeout_min =
+								XE_HW_ENGINE_PREEMPT_TIMEOUT_MIN;
+		gt->eclass[hwe->class].sched_props.preempt_timeout_max =
+								XE_HW_ENGINE_PREEMPT_TIMEOUT_MAX;
 		/* Record default props */
 		gt->eclass[hwe->class].defaults = gt->eclass[hwe->class].sched_props;
 	}
diff --git a/drivers/gpu/drm/xe/xe_hw_engine.h b/drivers/gpu/drm/xe/xe_hw_engine.h
index 7eca9d53c7b1..3d37d6d44261 100644
--- a/drivers/gpu/drm/xe/xe_hw_engine.h
+++ b/drivers/gpu/drm/xe/xe_hw_engine.h
@@ -10,6 +10,37 @@
 
 struct drm_printer;
 
+#ifdef CONFIG_DRM_XE_JOB_TIMEOUT_MIN
+#define XE_HW_ENGINE_JOB_TIMEOUT_MIN CONFIG_DRM_XE_JOB_TIMEOUT_MIN
+#else
+#define XE_HW_ENGINE_JOB_TIMEOUT_MIN 1
+#endif
+#ifdef CONFIG_DRM_XE_JOB_TIMEOUT_MAX
+#define XE_HW_ENGINE_JOB_TIMEOUT_MAX CONFIG_DRM_XE_JOB_TIMEOUT_MAX
+#else
+#define XE_HW_ENGINE_JOB_TIMEOUT_MAX (10 * 1000)
+#endif
+#ifdef CONFIG_DRM_XE_TIMESLICE_MIN
+#define XE_HW_ENGINE_TIMESLICE_MIN CONFIG_DRM_XE_TIMESLICE_MIN
+#else
+#define XE_HW_ENGINE_TIMESLICE_MIN 1
+#endif
+#ifdef CONFIG_DRM_XE_TIMESLICE_MAX
+#define XE_HW_ENGINE_TIMESLICE_MAX CONFIG_DRM_XE_TIMESLICE_MAX
+#else
+#define XE_HW_ENGINE_TIMESLICE_MAX (10 * 1000 * 1000)
+#endif
+#ifdef CONFIG_DRM_XE_PREEMPT_TIMEOUT_MIN
+#define XE_HW_ENGINE_PREEMPT_TIMEOUT_MIN CONFIG_DRM_XE_PREEMPT_TIMEOUT_MIN
+#else
+#define XE_HW_ENGINE_PREEMPT_TIMEOUT_MIN 1
+#endif
+#ifdef CONFIG_DRM_XE_PREEMPT_TIMEOUT_MAX
+#define XE_HW_ENGINE_PREEMPT_TIMEOUT_MAX CONFIG_DRM_XE_PREEMPT_TIMEOUT_MAX
+#else
+#define XE_HW_ENGINE_PREEMPT_TIMEOUT_MAX (10 * 1000 * 1000)
+#endif
+
 int xe_hw_engines_init_early(struct xe_gt *gt);
 int xe_hw_engines_init(struct xe_gt *gt);
 void xe_hw_engine_handle_irq(struct xe_hw_engine *hwe, u16 intr_vec);
diff --git a/drivers/gpu/drm/xe/xe_hw_engine_class_sysfs.c b/drivers/gpu/drm/xe/xe_hw_engine_class_sysfs.c
index 990bb675d1e0..2b7ac4e02db6 100644
--- a/drivers/gpu/drm/xe/xe_hw_engine_class_sysfs.c
+++ b/drivers/gpu/drm/xe/xe_hw_engine_class_sysfs.c
@@ -11,6 +11,20 @@
 
 static int xe_add_hw_engine_class_defaults(struct kobject *parent);
 
+bool enforce_schedule_limit(void)
+{
+#if IS_ENABLED(CONFIG_DRM_XE_ENABLE_SCHEDTIMEOUT_LIMIT)
+	return true;
+#else
+	return !capable(CAP_SYS_NICE);
+#endif
+}
+
+bool engine_timeout_in_range(u64 timeout, u64 min, u64 max)
+{
+	return timeout >= min && timeout <= max;
+}
+
 static void kobj_xe_hw_engine_release(struct kobject *kobj)
 {
 	kfree(kobj);
@@ -39,11 +53,92 @@ kobj_xe_hw_engine_class(struct kobject *parent, char *name)
 	return keclass;
 }
 
+static ssize_t job_timeout_max_store(struct kobject *kobj,
+				     struct kobj_attribute *attr,
+				     const char *buf, size_t count)
+{
+	struct xe_hw_engine_class_intf *eclass = kobj_to_eclass(kobj);
+	u32 timeout;
+	int err;
+
+	err = kstrtou32(buf, 0, &timeout);
+	if (err)
+		return err;
+
+	if (timeout < eclass->sched_props.job_timeout_min)
+		return -EINVAL;
+
+	if (enforce_schedule_limit() &&
+	    !engine_timeout_in_range(timeout,
+				     XE_HW_ENGINE_JOB_TIMEOUT_MIN,
+				     XE_HW_ENGINE_JOB_TIMEOUT_MAX))
+		return -EINVAL;
+
+	WRITE_ONCE(eclass->sched_props.job_timeout_max, timeout);
+
+	return count;
+}
+
+static ssize_t job_timeout_max_show(struct kobject *kobj,
+				    struct kobj_attribute *attr, char *buf)
+{
+	struct xe_hw_engine_class_intf *eclass = kobj_to_eclass(kobj);
+
+	return sprintf(buf, "%u\n", eclass->sched_props.job_timeout_max);
+}
+
+static struct kobj_attribute job_timeout_max_attr =
+__ATTR(job_timeout_max, 0644, job_timeout_max_show, job_timeout_max_store);
+
+static ssize_t job_timeout_min_store(struct kobject *kobj,
+				     struct kobj_attribute *attr,
+				     const char *buf, size_t count)
+{
+	struct xe_hw_engine_class_intf *eclass = kobj_to_eclass(kobj);
+	u32 timeout;
+	int err;
+
+	err = kstrtou32(buf, 0, &timeout);
+	if (err)
+		return err;
+
+	if (timeout > eclass->sched_props.job_timeout_max)
+		return -EINVAL;
+
+	if (enforce_schedule_limit() &&
+	    !engine_timeout_in_range(timeout,
+				     XE_HW_ENGINE_JOB_TIMEOUT_MIN,
+				     XE_HW_ENGINE_JOB_TIMEOUT_MAX))
+		return -EINVAL;
+
+	WRITE_ONCE(eclass->sched_props.job_timeout_min, timeout);
+
+	return count;
+}
+
+static ssize_t job_timeout_min_show(struct kobject *kobj,
+				    struct kobj_attribute *attr, char *buf)
+{
+	struct xe_hw_engine_class_intf *eclass = kobj_to_eclass(kobj);
+
+	return sprintf(buf, "%u\n", eclass->sched_props.job_timeout_min);
+}
+
+static struct kobj_attribute job_timeout_min_attr =
+__ATTR(job_timeout_min, 0644, job_timeout_min_show, job_timeout_min_store);
+
 static ssize_t job_timeout_store(struct kobject *kobj,
 				 struct kobj_attribute *attr,
 				 const char *buf, size_t count)
 {
 	struct xe_hw_engine_class_intf *eclass = kobj_to_eclass(kobj);
+#if IS_ENABLED(CONFIG_DRM_XE_ENABLE_SCHEDTIMEOUT_LIMIT)
+	u32 min = XE_HW_ENGINE_JOB_TIMEOUT_MIN;
+	u32 max = XE_HW_ENGINE_JOB_TIMEOUT_MAX;
+#else
+	u32 min = e->hwe->eclass->sched_props.job_timeout_min;
+	u32 max = e->hwe->eclass->sched_props.job_timeout_max;
+#endif
 	u32 timeout;
 	int err;
 
@@ -51,6 +146,10 @@ static ssize_t job_timeout_store(struct kobject *kobj,
 	if (err)
 		return err;
 
+	if (enforce_schedule_limit() &&
+	    !engine_timeout_in_range(timeout, min, max))
+		return -EINVAL;
+
 	WRITE_ONCE(eclass->sched_props.job_timeout_ms, timeout);
 
 	return count;
@@ -78,11 +177,40 @@ static ssize_t job_timeout_default(struct kobject *kobj,
 static struct kobj_attribute job_timeout_def =
 __ATTR(job_timeout_ms, 0444, job_timeout_default, NULL);
 
+static ssize_t job_timeout_min_default(struct kobject *kobj,
+				       struct kobj_attribute *attr, char *buf)
+{
+	struct xe_hw_engine_class_intf *eclass = kobj_to_eclass(kobj->parent);
+
+	return sprintf(buf, "%u\n", eclass->defaults.job_timeout_min);
+}
+
+static struct kobj_attribute job_timeout_min_def =
+__ATTR(job_timeout_min, 0444, job_timeout_min_default, NULL);
+
+static ssize_t job_timeout_max_default(struct kobject *kobj,
+				       struct kobj_attribute *attr, char *buf)
+{
+	struct xe_hw_engine_class_intf *eclass = kobj_to_eclass(kobj->parent);
+
+	return sprintf(buf, "%u\n", eclass->defaults.job_timeout_max);
+}
+
+static struct kobj_attribute job_timeout_max_def =
+__ATTR(job_timeout_max, 0444, job_timeout_max_default, NULL);
+
 static ssize_t timeslice_duration_store(struct kobject *kobj,
 					struct kobj_attribute *attr,
 					const char *buf, size_t count)
 {
 	struct xe_hw_engine_class_intf *eclass = kobj_to_eclass(kobj);
+#if IS_ENABLED(CONFIG_DRM_XE_ENABLE_SCHEDTIMEOUT_LIMIT)
+	u32 min = XE_HW_ENGINE_TIMESLICE_MIN;
+	u32 max = XE_HW_ENGINE_TIMESLICE_MAX;
+#else
+	u32 min = e->hwe->eclass->sched_props.timeslice_min;
+	u32 max = e->hwe->eclass->sched_props.timeslice_max;
+#endif
 	u32 duration;
 	int err;
 
@@ -90,11 +218,92 @@ static ssize_t timeslice_duration_store(struct kobject *kobj,
 	if (err)
 		return err;
 
+	if (enforce_schedule_limit() &&
+	    !engine_timeout_in_range(duration, min, max))
+		return -EINVAL;
+
 	WRITE_ONCE(eclass->sched_props.timeslice_us, duration);
 
 	return count;
 }
 
+static ssize_t timeslice_duration_max_store(struct kobject *kobj,
+					    struct kobj_attribute *attr,
+					    const char *buf, size_t count)
+{
+	struct xe_hw_engine_class_intf *eclass = kobj_to_eclass(kobj);
+	u32 duration;
+	int err;
+
+	err = kstrtou32(buf, 0, &duration);
+	if (err)
+		return err;
+
+	if (duration < eclass->sched_props.timeslice_min)
+		return -EINVAL;
+
+	if (enforce_schedule_limit() &&
+	    !engine_timeout_in_range(duration,
+				     XE_HW_ENGINE_TIMESLICE_MIN,
+				     XE_HW_ENGINE_TIMESLICE_MAX))
+		return -EINVAL;
+
+	WRITE_ONCE(eclass->sched_props.timeslice_max, duration);
+
+	return count;
+}
+
+static ssize_t timeslice_duration_max_show(struct kobject *kobj,
+					   struct kobj_attribute *attr,
+					   char *buf)
+{
+	struct xe_hw_engine_class_intf *eclass = kobj_to_eclass(kobj);
+
+	return sprintf(buf, "%u\n", eclass->sched_props.timeslice_max);
+}
+
+static struct kobj_attribute timeslice_duration_max_attr =
+	__ATTR(timeslice_duration_max, 0644, timeslice_duration_max_show,
+	       timeslice_duration_max_store);
+
+static ssize_t timeslice_duration_min_store(struct kobject *kobj,
+					    struct kobj_attribute *attr,
+					    const char *buf, size_t count)
+{
+	struct xe_hw_engine_class_intf *eclass = kobj_to_eclass(kobj);
+	u32 duration;
+	int err;
+
+	err = kstrtou32(buf, 0, &duration);
+	if (err)
+		return err;
+
+	if (duration > eclass->sched_props.timeslice_max)
+		return -EINVAL;
+
+	if (enforce_schedule_limit() &&
+	    !engine_timeout_in_range(duration,
+				     XE_HW_ENGINE_TIMESLICE_MIN,
+				     XE_HW_ENGINE_TIMESLICE_MAX))
+		return -EINVAL;
+
+	WRITE_ONCE(eclass->sched_props.timeslice_min, duration);
+
+	return count;
+}
+
+static ssize_t timeslice_duration_min_show(struct kobject *kobj,
+					   struct kobj_attribute *attr, char *buf)
+{
+	struct xe_hw_engine_class_intf *eclass = kobj_to_eclass(kobj);
+
+	return sprintf(buf, "%u\n", eclass->sched_props.timeslice_min);
+}
+
+static struct kobj_attribute timeslice_duration_min_attr =
+	__ATTR(timeslice_duration_min, 0644, timeslice_duration_min_show,
+	       timeslice_duration_min_store);
+
 static ssize_t timeslice_duration_show(struct kobject *kobj,
 		struct kobj_attribute *attr, char *buf)
 {
@@ -118,11 +327,40 @@ static ssize_t timeslice_default(struct kobject *kobj,
 static struct kobj_attribute timeslice_duration_def =
 __ATTR(timeslice_duration_us, 0444, timeslice_default, NULL);
 
+static ssize_t timeslice_min_default(struct kobject *kobj,
+				     struct kobj_attribute *attr, char *buf)
+{
+	struct xe_hw_engine_class_intf *eclass = kobj_to_eclass(kobj->parent);
+
+	return sprintf(buf, "%u\n", eclass->defaults.timeslice_min);
+}
+
+static struct kobj_attribute timeslice_duration_min_def =
+__ATTR(timeslice_duration_min, 0444, timeslice_min_default, NULL);
+
+static ssize_t timeslice_max_default(struct kobject *kobj,
+				     struct kobj_attribute *attr, char *buf)
+{
+	struct xe_hw_engine_class_intf *eclass = kobj_to_eclass(kobj->parent);
+
+	return sprintf(buf, "%u\n", eclass->defaults.timeslice_max);
+}
+
+static struct kobj_attribute timeslice_duration_max_def =
+__ATTR(timeslice_duration_max, 0444, timeslice_max_default, NULL);
+
 static ssize_t preempt_timeout_store(struct kobject *kobj,
 				     struct kobj_attribute *attr,
 				     const char *buf, size_t count)
 {
 	struct xe_hw_engine_class_intf *eclass = kobj_to_eclass(kobj);
+#if IS_ENABLED(CONFIG_DRM_XE_ENABLE_SCHEDTIMEOUT_LIMIT)
+	u32 min = XE_HW_ENGINE_PREEMPT_TIMEOUT_MIN;
+	u32 max = XE_HW_ENGINE_PREEMPT_TIMEOUT_MAX;
+#else
+	u32 min = e->hwe->eclass->sched_props.preempt_timeout_min;
+	u32 max = e->hwe->eclass->sched_props.preempt_timeout_max;
+#endif
 	u32 timeout;
 	int err;
 
@@ -130,6 +368,10 @@ static ssize_t preempt_timeout_store(struct kobject *kobj,
 	if (err)
 		return err;
 
+	if (enforce_schedule_limit() &&
+	    !engine_timeout_in_range(timeout, min, max))
+		return -EINVAL;
+
 	WRITE_ONCE(eclass->sched_props.preempt_timeout_us, timeout);
 
 	return count;
@@ -158,17 +400,129 @@ static ssize_t preempt_timeout_default(struct kobject *kobj,
 static struct kobj_attribute preempt_timeout_def =
 __ATTR(preempt_timeout_us, 0444, preempt_timeout_default, NULL);
 
+static ssize_t preempt_timeout_min_default(struct kobject *kobj,
+					   struct kobj_attribute *attr,
+					   char *buf)
+{
+	struct xe_hw_engine_class_intf *eclass = kobj_to_eclass(kobj->parent);
+
+	return sprintf(buf, "%u\n", eclass->defaults.preempt_timeout_min);
+}
+
+static struct kobj_attribute preempt_timeout_min_def =
+__ATTR(preempt_timeout_min, 0444, preempt_timeout_min_default, NULL);
+
+static ssize_t preempt_timeout_max_default(struct kobject *kobj,
+					   struct kobj_attribute *attr,
+					   char *buf)
+{
+	struct xe_hw_engine_class_intf *eclass = kobj_to_eclass(kobj->parent);
+
+	return sprintf(buf, "%u\n", eclass->defaults.preempt_timeout_max);
+}
+
+static struct kobj_attribute preempt_timeout_max_def =
+__ATTR(preempt_timeout_max, 0444, preempt_timeout_max_default, NULL);
+
+static ssize_t preempt_timeout_max_store(struct kobject *kobj,
+					 struct kobj_attribute *attr,
+					 const char *buf, size_t count)
+{
+	struct xe_hw_engine_class_intf *eclass = kobj_to_eclass(kobj);
+	u32 timeout;
+	int err;
+
+	err = kstrtou32(buf, 0, &timeout);
+	if (err)
+		return err;
+
+	if (timeout < eclass->sched_props.preempt_timeout_min)
+		return -EINVAL;
+
+	if (enforce_schedule_limit() &&
+	    !engine_timeout_in_range(timeout,
+				     XE_HW_ENGINE_PREEMPT_TIMEOUT_MIN,
+				     XE_HW_ENGINE_PREEMPT_TIMEOUT_MAX))
+		return -EINVAL;
+
+	WRITE_ONCE(eclass->sched_props.preempt_timeout_max, timeout);
+
+	return count;
+}
+
+static ssize_t preempt_timeout_max_show(struct kobject *kobj,
+					struct kobj_attribute *attr, char *buf)
+{
+	struct xe_hw_engine_class_intf *eclass = kobj_to_eclass(kobj);
+
+	return sprintf(buf, "%u\n", eclass->sched_props.preempt_timeout_max);
+}
+
+static struct kobj_attribute preempt_timeout_max_attr =
+	__ATTR(preempt_timeout_max, 0644, preempt_timeout_max_show,
+	       preempt_timeout_max_store);
+
+static ssize_t preempt_timeout_min_store(struct kobject *kobj,
+					 struct kobj_attribute *attr,
+					 const char *buf, size_t count)
+{
+	struct xe_hw_engine_class_intf *eclass = kobj_to_eclass(kobj);
+	u32 timeout;
+	int err;
+
+	err = kstrtou32(buf, 0, &timeout);
+	if (err)
+		return err;
+
+	if (timeout > eclass->sched_props.preempt_timeout_max)
+		return -EINVAL;
+
+	if (enforce_schedule_limit() &&
+	    !engine_timeout_in_range(timeout,
+				     XE_HW_ENGINE_PREEMPT_TIMEOUT_MIN,
+				     XE_HW_ENGINE_PREEMPT_TIMEOUT_MAX))
+		return -EINVAL;
+
+	WRITE_ONCE(eclass->sched_props.preempt_timeout_min, timeout);
+
+	return count;
+}
+
+static ssize_t preempt_timeout_min_show(struct kobject *kobj,
+					struct kobj_attribute *attr, char *buf)
+{
+	struct xe_hw_engine_class_intf *eclass = kobj_to_eclass(kobj);
+
+	return sprintf(buf, "%u\n", eclass->sched_props.preempt_timeout_min);
+}
+
+static struct kobj_attribute preempt_timeout_min_attr =
+	__ATTR(preempt_timeout_min, 0644, preempt_timeout_min_show,
+	       preempt_timeout_min_store);
+
 static const struct attribute *defaults[] = {
 	&job_timeout_def.attr,
+	&job_timeout_min_def.attr,
+	&job_timeout_max_def.attr,
 	&timeslice_duration_def.attr,
+	&timeslice_duration_min_def.attr,
+	&timeslice_duration_max_def.attr,
 	&preempt_timeout_def.attr,
+	&preempt_timeout_min_def.attr,
+	&preempt_timeout_max_def.attr,
 	NULL
 };
 
 static const struct attribute *files[] = {
 	&job_timeout_attr.attr,
+	&job_timeout_min_attr.attr,
+	&job_timeout_max_attr.attr,
 	&timeslice_duration_attr.attr,
+	&timeslice_duration_min_attr.attr,
+	&timeslice_duration_max_attr.attr,
 	&preempt_timeout_attr.attr,
+	&preempt_timeout_min_attr.attr,
+	&preempt_timeout_max_attr.attr,
 	NULL
 };
 
diff --git a/drivers/gpu/drm/xe/xe_hw_engine_class_sysfs.h b/drivers/gpu/drm/xe/xe_hw_engine_class_sysfs.h
index 757136614672..2e2ab351a991 100644
--- a/drivers/gpu/drm/xe/xe_hw_engine_class_sysfs.h
+++ b/drivers/gpu/drm/xe/xe_hw_engine_class_sysfs.h
@@ -10,6 +10,8 @@
 
 #define MAX_ENGINE_CLASS_NAME_LEN    16
 int xe_hw_engine_class_sysfs_init(struct xe_gt *gt);
+bool enforce_schedule_limit(void);
+bool engine_timeout_in_range(u64 timeout, u64 min, u64 max);
 
 /**
  * struct kobj_eclass - A eclass's kobject struct that connects the kobject and the
-- 
2.25.1


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

* [Intel-xe] ✓ CI.Patch_applied: success for drm/xe: Add engine scheduler control interface (rev9)
  2023-07-27  8:22 [Intel-xe] [PATCH V9 0/6] drm/xe: Add engine scheduler control interface Tejas Upadhyay
                   ` (5 preceding siblings ...)
  2023-07-27  8:22 ` [Intel-xe] [PATCH V9 6/6] drm/xe: Add min/max cap for engine scheduler properties Tejas Upadhyay
@ 2023-07-27  8:59 ` Patchwork
  2023-07-27  9:00 ` [Intel-xe] ✗ CI.checkpatch: warning " Patchwork
                   ` (5 subsequent siblings)
  12 siblings, 0 replies; 30+ messages in thread
From: Patchwork @ 2023-07-27  8:59 UTC (permalink / raw)
  To: Tejas Upadhyay; +Cc: intel-xe

== Series Details ==

Series: drm/xe: Add engine scheduler control interface (rev9)
URL   : https://patchwork.freedesktop.org/series/119392/
State : success

== Summary ==

=== Applying kernel patches on branch 'drm-xe-next' with base: ===
Base commit: 20a2578d3 drm/xe/engine: add missing rpm for bind engines
=== git am output follows ===
Applying: drm/xe: Add sysfs entries for engines under its GT
Applying: drm/xe: Add sysfs for default engine scheduler properties
Applying: drm/xe: Add job timeout engine property to sysfs
Applying: drm/xe: Add timeslice duration engine property to sysfs
Applying: drm/xe: Add sysfs for preempt reset timeout
Applying: drm/xe: Add min/max cap for engine scheduler properties



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

* [Intel-xe] ✗ CI.checkpatch: warning for drm/xe: Add engine scheduler control interface (rev9)
  2023-07-27  8:22 [Intel-xe] [PATCH V9 0/6] drm/xe: Add engine scheduler control interface Tejas Upadhyay
                   ` (6 preceding siblings ...)
  2023-07-27  8:59 ` [Intel-xe] ✓ CI.Patch_applied: success for drm/xe: Add engine scheduler control interface (rev9) Patchwork
@ 2023-07-27  9:00 ` Patchwork
  2023-07-27  9:01 ` [Intel-xe] ✓ CI.KUnit: success " Patchwork
                   ` (4 subsequent siblings)
  12 siblings, 0 replies; 30+ messages in thread
From: Patchwork @ 2023-07-27  9:00 UTC (permalink / raw)
  To: Tejas Upadhyay; +Cc: intel-xe

== Series Details ==

Series: drm/xe: Add engine scheduler control interface (rev9)
URL   : https://patchwork.freedesktop.org/series/119392/
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
c7d32770e3cd31d9fc134ce41f329b10aa33ee15
+ cd /kernel
+ git config --global --add safe.directory /kernel
+ git log -n1
commit b57496f27c8bfc9d9fc1b208ce9b5de8cc536ca6
Author: Tejas Upadhyay <tejas.upadhyay@intel.com>
Date:   Thu Jul 27 13:52:35 2023 +0530

    drm/xe: Add min/max cap for engine scheduler properties
    
    Add sysfs entries for the min, max, and defaults for each of
    engine scheduler controls for every hardware engine class.
    
    Non-elevated user IOCTLs to set these controls must be within
    the min-max ranges of the sysfs entries, elevated user can set
    these controls to any value. However, introduced compile time
    CONFIG min-max values which restricts elevated user to be in
    compile time min-max range if at all sysfs min/max are violated.
    
    Sysfs entries examples are,
    DUT# cat /sys/class/drm/cardX/device/tileN/gtN/engines/ccs/.defaults/
    job_timeout_max         job_timeout_ms          preempt_timeout_min     timeslice_duration_max  timeslice_duration_us
    job_timeout_min         preempt_timeout_max     preempt_timeout_us      timeslice_duration_min
    
    DUT# cat /sys/class/drm/card1/device/tileN/gtN/engines/ccs/
    .defaults/              job_timeout_min         preempt_timeout_max     preempt_timeout_us      timeslice_duration_min
    job_timeout_max         job_timeout_ms          preempt_timeout_min     timeslice_duration_max  timeslice_duration_us
    
    V9 :
       - Rebase to use s/xe_engine/xe_hw_engine/ - Matt
    V8 :
       - fix enforce_sched_limit and avoid code duplication - Niranjana
       - Make sure min < max - Niranjana
    V7 :
       - Rebase to replace hw engine with eclass interface
       - return EINVAL in place of EPERM
       - Use some APIs to avoid code duplication
    V6 :
       - Rebase changes to reflect per engine class props interface - MattB
       - Use #if ENABLED - MattB
       - Remove MAX_SCHED_TIMEOUT check as range validation is enough
    V5 :
       - Rebase to resolve conflicts - CI
    V4 :
       - Rebase
       - Update commit to reflect tile addition
       - Use XE_HW macro directly as they are already filtered
         for CONFIG checks - Niranjana
       - Add CONFIG for enable/disable min/max limitation
         on elevated user. Default is enable - Matt/Joonas
    V3 :
       - Resolve CI hooks warning for kernel-doc
    V2 :
       - Restric min/max setting to #define default min/max for
         elevated user - Himal
       - Remove unrelated changes from patch - Niranjana
    
    Signed-off-by: Tejas Upadhyay <tejas.upadhyay@intel.com>
+ /mt/dim checkpatch 20a2578d3a889f6e1dd4a6514924661557c2f9f6 drm-intel
3463737cf drm/xe: Add sysfs entries for engines under its GT
Traceback (most recent call last):
  File "scripts/spdxcheck.py", line 6, in <module>
    from ply import lex, yacc
ModuleNotFoundError: No module named 'ply'
Traceback (most recent call last):
  File "scripts/spdxcheck.py", line 6, in <module>
    from ply import lex, yacc
ModuleNotFoundError: No module named 'ply'
-:65: WARNING:FILE_PATH_CHANGES: added, moved or deleted file(s), does MAINTAINERS need updating?
#65: 
new file mode 100644

total: 0 errors, 1 warnings, 0 checks, 150 lines checked
fce2387a4 drm/xe: Add sysfs for default engine scheduler properties
-:33: WARNING:COMMIT_LOG_LONG_LINE: Possible unwrapped commit description (prefer a maximum 75 chars per line)
#33: 
   - Scheduling props should apply per class engine not per hardware engine - Matt

total: 0 errors, 1 warnings, 0 checks, 274 lines checked
ac638a9fe drm/xe: Add job timeout engine property to sysfs
db2968de7 drm/xe: Add timeslice duration engine property to sysfs
-:56: CHECK:PARENTHESIS_ALIGNMENT: Alignment should match open parenthesis
#56: FILE: drivers/gpu/drm/xe/xe_hw_engine_class_sysfs.c:99:
+static ssize_t timeslice_duration_show(struct kobject *kobj,
+		struct kobj_attribute *attr, char *buf)

total: 0 errors, 0 warnings, 1 checks, 42 lines checked
39b6f67a5 drm/xe: Add sysfs for preempt reset timeout
b57496f27 drm/xe: Add min/max cap for engine scheduler properties
-:17: WARNING:COMMIT_LOG_LONG_LINE: Possible unwrapped commit description (prefer a maximum 75 chars per line)
#17: 
job_timeout_max         job_timeout_ms          preempt_timeout_min     timeslice_duration_max  timeslice_duration_us

-:67: WARNING:EMBEDDED_FILENAME: It's generally not useful to have the filename in the file
#67: FILE: drivers/gpu/drm/xe/Kconfig:90:
+	source "drivers/gpu/drm/xe/Kconfig.profile"

-:70: WARNING:FILE_PATH_CHANGES: added, moved or deleted file(s), does MAINTAINERS need updating?
#70: 
new file mode 100644

total: 0 errors, 3 warnings, 0 checks, 601 lines checked



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

* [Intel-xe] ✓ CI.KUnit: success for drm/xe: Add engine scheduler control interface (rev9)
  2023-07-27  8:22 [Intel-xe] [PATCH V9 0/6] drm/xe: Add engine scheduler control interface Tejas Upadhyay
                   ` (7 preceding siblings ...)
  2023-07-27  9:00 ` [Intel-xe] ✗ CI.checkpatch: warning " Patchwork
@ 2023-07-27  9:01 ` Patchwork
  2023-07-27  9:05 ` [Intel-xe] ✓ CI.Build: " Patchwork
                   ` (3 subsequent siblings)
  12 siblings, 0 replies; 30+ messages in thread
From: Patchwork @ 2023-07-27  9:01 UTC (permalink / raw)
  To: Tejas Upadhyay; +Cc: intel-xe

== Series Details ==

Series: drm/xe: Add engine scheduler control interface (rev9)
URL   : https://patchwork.freedesktop.org/series/119392/
State : success

== Summary ==

+ trap cleanup EXIT
+ /kernel/tools/testing/kunit/kunit.py run --kunitconfig /kernel/drivers/gpu/drm/xe/.kunitconfig
stty: 'standard input': Inappropriate ioctl for device
[09:00:13] Configuring KUnit Kernel ...
Generating .config ...
Populating config with:
$ make ARCH=um O=.kunit olddefconfig
[09:00:17] Building KUnit Kernel ...
Populating config with:
$ make ARCH=um O=.kunit olddefconfig
Building with:
$ make ARCH=um O=.kunit --jobs=48
[09:00:37] Starting KUnit Kernel (1/1)...
[09:00:37] ============================================================
[09:00:37] ==================== xe_bo (2 subtests) ====================
[09:00:37] [SKIPPED] xe_ccs_migrate_kunit
[09:00:37] [SKIPPED] xe_bo_evict_kunit
[09:00:37] ===================== [SKIPPED] xe_bo ======================
[09:00:37] ================== xe_dma_buf (1 subtest) ==================
[09:00:37] [SKIPPED] xe_dma_buf_kunit
[09:00:37] =================== [SKIPPED] xe_dma_buf ===================
[09:00:37] ================== xe_migrate (1 subtest) ==================
[09:00:37] [SKIPPED] xe_migrate_sanity_kunit
[09:00:37] =================== [SKIPPED] xe_migrate ===================
[09:00:37] =================== xe_pci (2 subtests) ====================
[09:00:37] [PASSED] xe_gmdid_graphics_ip
[09:00:37] [PASSED] xe_gmdid_media_ip
[09:00:37] ===================== [PASSED] xe_pci ======================
[09:00:37] ==================== xe_rtp (1 subtest) ====================
[09:00:37] ================== xe_rtp_process_tests  ===================
[09:00:37] [PASSED] coalesce-same-reg
[09:00:37] [PASSED] no-match-no-add
[09:00:37] [PASSED] no-match-no-add-multiple-rules
[09:00:37] [PASSED] two-regs-two-entries
[09:00:37] [PASSED] clr-one-set-other
[09:00:37] [PASSED] set-field
[09:00:37] [PASSED] conflict-duplicate
[09:00:37] [PASSED] conflict-not-disjoint
[09:00:37] [PASSED] conflict-reg-type
[09:00:37] ============== [PASSED] xe_rtp_process_tests ===============
[09:00:37] ===================== [PASSED] xe_rtp ======================
[09:00:37] ==================== xe_wa (1 subtest) =====================
[09:00:37] ======================== xe_wa_gt  =========================
[09:00:37] [PASSED] TIGERLAKE (B0)
[09:00:37] [PASSED] DG1 (A0)
[09:00:37] [PASSED] DG1 (B0)
[09:00:37] [PASSED] ALDERLAKE_S (A0)
[09:00:37] [PASSED] ALDERLAKE_S (B0)
[09:00:37] [PASSED] ALDERLAKE_S (C0)
[09:00:37] [PASSED] ALDERLAKE_S (D0)
[09:00:37] [PASSED] ALDERLAKE_P (A0)
[09:00:37] [PASSED] ALDERLAKE_P (B0)
[09:00:37] [PASSED] ALDERLAKE_P (C0)
[09:00:37] [PASSED] DG2_G10 (A0)
[09:00:37] [PASSED] DG2_G10 (A1)
[09:00:37] [PASSED] DG2_G10 (B0)
[09:00:37] [PASSED] DG2_G10 (C0)
[09:00:37] [PASSED] DG2_G11 (A0)
[09:00:37] [PASSED] DG2_G11 (B0)
[09:00:37] [PASSED] DG2_G11 (B1)
[09:00:37] [PASSED] DG2_G12 (A0)
[09:00:37] [PASSED] DG2_G12 (A1)
[09:00:37] [PASSED] PVC (B0)
[09:00:37] [PASSED] PVC (B1)
[09:00:37] [PASSED] PVC (C0)
[09:00:37] ==================== [PASSED] xe_wa_gt =====================
[09:00:37] ====================== [PASSED] xe_wa ======================
[09:00:37] ============================================================
[09:00:37] Testing complete. Ran 37 tests: passed: 33, skipped: 4
[09:00:37] Elapsed time: 23.603s total, 4.211s configuring, 19.272s building, 0.096s running

+ /kernel/tools/testing/kunit/kunit.py run --kunitconfig /kernel/drivers/gpu/drm/tests/.kunitconfig
[09:00:37] Configuring KUnit Kernel ...
Regenerating .config ...
Populating config with:
$ make ARCH=um O=.kunit olddefconfig
[09:00:38] Building KUnit Kernel ...
Populating config with:
$ make ARCH=um O=.kunit olddefconfig
Building with:
$ make ARCH=um O=.kunit --jobs=48
[09:00:57] Starting KUnit Kernel (1/1)...
[09:00:57] ============================================================
[09:00:57] ============ drm_test_pick_cmdline (2 subtests) ============
[09:00:57] [PASSED] drm_test_pick_cmdline_res_1920_1080_60
[09:00:57] =============== drm_test_pick_cmdline_named  ===============
[09:00:57] [PASSED] NTSC
[09:00:57] [PASSED] NTSC-J
[09:00:57] [PASSED] PAL
[09:00:57] [PASSED] PAL-M
[09:00:57] =========== [PASSED] drm_test_pick_cmdline_named ===========
[09:00:57] ============== [PASSED] drm_test_pick_cmdline ==============
[09:00:57] ================== drm_buddy (6 subtests) ==================
[09:00:57] [PASSED] drm_test_buddy_alloc_limit
[09:00:57] [PASSED] drm_test_buddy_alloc_range
[09:00:57] [PASSED] drm_test_buddy_alloc_optimistic
[09:00:57] [PASSED] drm_test_buddy_alloc_pessimistic
[09:00:57] [PASSED] drm_test_buddy_alloc_smoke
[09:00:57] [PASSED] drm_test_buddy_alloc_pathological
[09:00:57] ==================== [PASSED] drm_buddy ====================
[09:00:57] ============= drm_cmdline_parser (40 subtests) =============
[09:00:57] [PASSED] drm_test_cmdline_force_d_only
[09:00:57] [PASSED] drm_test_cmdline_force_D_only_dvi
[09:00:57] [PASSED] drm_test_cmdline_force_D_only_hdmi
[09:00:57] [PASSED] drm_test_cmdline_force_D_only_not_digital
[09:00:57] [PASSED] drm_test_cmdline_force_e_only
[09:00:57] [PASSED] drm_test_cmdline_res
[09:00:57] [PASSED] drm_test_cmdline_res_vesa
[09:00:57] [PASSED] drm_test_cmdline_res_vesa_rblank
[09:00:57] [PASSED] drm_test_cmdline_res_rblank
[09:00:57] [PASSED] drm_test_cmdline_res_bpp
[09:00:57] [PASSED] drm_test_cmdline_res_refresh
[09:00:57] [PASSED] drm_test_cmdline_res_bpp_refresh
[09:00:57] [PASSED] drm_test_cmdline_res_bpp_refresh_interlaced
[09:00:57] [PASSED] drm_test_cmdline_res_bpp_refresh_margins
[09:00:57] [PASSED] drm_test_cmdline_res_bpp_refresh_force_off
[09:00:57] [PASSED] drm_test_cmdline_res_bpp_refresh_force_on
[09:00:57] [PASSED] drm_test_cmdline_res_bpp_refresh_force_on_analog
[09:00:57] [PASSED] drm_test_cmdline_res_bpp_refresh_force_on_digital
[09:00:57] [PASSED] drm_test_cmdline_res_bpp_refresh_interlaced_margins_force_on
[09:00:57] [PASSED] drm_test_cmdline_res_margins_force_on
[09:00:57] [PASSED] drm_test_cmdline_res_vesa_margins
[09:00:57] [PASSED] drm_test_cmdline_name
[09:00:57] [PASSED] drm_test_cmdline_name_bpp
[09:00:57] [PASSED] drm_test_cmdline_name_option
[09:00:57] [PASSED] drm_test_cmdline_name_bpp_option
[09:00:57] [PASSED] drm_test_cmdline_rotate_0
[09:00:57] [PASSED] drm_test_cmdline_rotate_90
[09:00:57] [PASSED] drm_test_cmdline_rotate_180
[09:00:57] [PASSED] drm_test_cmdline_rotate_270
[09:00:57] [PASSED] drm_test_cmdline_hmirror
[09:00:57] [PASSED] drm_test_cmdline_vmirror
[09:00:57] [PASSED] drm_test_cmdline_margin_options
[09:00:57] [PASSED] drm_test_cmdline_multiple_options
[09:00:57] [PASSED] drm_test_cmdline_bpp_extra_and_option
[09:00:57] [PASSED] drm_test_cmdline_extra_and_option
[09:00:57] [PASSED] drm_test_cmdline_freestanding_options
[09:00:57] [PASSED] drm_test_cmdline_freestanding_force_e_and_options
[09:00:57] [PASSED] drm_test_cmdline_panel_orientation
[09:00:57] ================ drm_test_cmdline_invalid  =================
[09:00:57] [PASSED] margin_only
[09:00:57] [PASSED] interlace_only
[09:00:57] [PASSED] res_missing_x
[09:00:57] [PASSED] res_missing_y
[09:00:57] [PASSED] res_bad_y
[09:00:57] [PASSED] res_missing_y_bpp
[09:00:57] [PASSED] res_bad_bpp
[09:00:57] [PASSED] res_bad_refresh
[09:00:57] [PASSED] res_bpp_refresh_force_on_off
[09:00:57] [PASSED] res_invalid_mode
[09:00:57] [PASSED] res_bpp_wrong_place_mode
[09:00:57] [PASSED] name_bpp_refresh
[09:00:57] [PASSED] name_refresh
[09:00:57] [PASSED] name_refresh_wrong_mode
[09:00:57] [PASSED] name_refresh_invalid_mode
[09:00:57] [PASSED] rotate_multiple
[09:00:57] [PASSED] rotate_invalid_val
[09:00:57] [PASSED] rotate_truncated
[09:00:57] [PASSED] invalid_option
[09:00:57] [PASSED] invalid_tv_option
[09:00:57] [PASSED] truncated_tv_option
[09:00:57] ============ [PASSED] drm_test_cmdline_invalid =============
[09:00:57] =============== drm_test_cmdline_tv_options  ===============
[09:00:57] [PASSED] NTSC
[09:00:57] [PASSED] NTSC_443
[09:00:57] [PASSED] NTSC_J
[09:00:57] [PASSED] PAL
[09:00:57] [PASSED] PAL_M
[09:00:57] [PASSED] PAL_N
[09:00:57] [PASSED] SECAM
[09:00:57] =========== [PASSED] drm_test_cmdline_tv_options ===========
[09:00:57] =============== [PASSED] drm_cmdline_parser ================
[09:00:57] ========== drm_get_tv_mode_from_name (2 subtests) ==========
[09:00:57] ========== drm_test_get_tv_mode_from_name_valid  ===========
[09:00:57] [PASSED] NTSC
[09:00:57] [PASSED] NTSC-443
[09:00:57] [PASSED] NTSC-J
[09:00:57] [PASSED] PAL
[09:00:57] [PASSED] PAL-M
[09:00:57] [PASSED] PAL-N
[09:00:57] [PASSED] SECAM
[09:00:57] ====== [PASSED] drm_test_get_tv_mode_from_name_valid =======
[09:00:57] [PASSED] drm_test_get_tv_mode_from_name_truncated
[09:00:57] ============ [PASSED] drm_get_tv_mode_from_name ============
[09:00:57] ============= drm_damage_helper (21 subtests) ==============
[09:00:57] [PASSED] drm_test_damage_iter_no_damage
[09:00:57] [PASSED] drm_test_damage_iter_no_damage_fractional_src
[09:00:57] [PASSED] drm_test_damage_iter_no_damage_src_moved
[09:00:57] [PASSED] drm_test_damage_iter_no_damage_fractional_src_moved
[09:00:57] [PASSED] drm_test_damage_iter_no_damage_not_visible
[09:00:57] [PASSED] drm_test_damage_iter_no_damage_no_crtc
[09:00:57] [PASSED] drm_test_damage_iter_no_damage_no_fb
[09:00:57] [PASSED] drm_test_damage_iter_simple_damage
[09:00:57] [PASSED] drm_test_damage_iter_single_damage
[09:00:57] [PASSED] drm_test_damage_iter_single_damage_intersect_src
[09:00:57] [PASSED] drm_test_damage_iter_single_damage_outside_src
[09:00:57] [PASSED] drm_test_damage_iter_single_damage_fractional_src
[09:00:57] [PASSED] drm_test_damage_iter_single_damage_intersect_fractional_src
[09:00:57] [PASSED] drm_test_damage_iter_single_damage_outside_fractional_src
[09:00:57] [PASSED] drm_test_damage_iter_single_damage_src_moved
[09:00:57] [PASSED] drm_test_damage_iter_single_damage_fractional_src_moved
[09:00:57] [PASSED] drm_test_damage_iter_damage
[09:00:57] [PASSED] drm_test_damage_iter_damage_one_intersect
[09:00:57] [PASSED] drm_test_damage_iter_damage_one_outside
[09:00:57] [PASSED] drm_test_damage_iter_damage_src_moved
[09:00:57] [PASSED] drm_test_damage_iter_damage_not_visible
[09:00:57] ================ [PASSED] drm_damage_helper ================
[09:00:57] ============== drm_dp_mst_helper (2 subtests) ==============
[09:00:57] ============== drm_test_dp_mst_calc_pbn_mode  ==============
[09:00:57] [PASSED] Clock 154000 BPP 30 DSC disabled
[09:00:57] [PASSED] Clock 234000 BPP 30 DSC disabled
[09:00:57] [PASSED] Clock 297000 BPP 24 DSC disabled
[09:00:57] [PASSED] Clock 332880 BPP 24 DSC enabled
[09:00:57] [PASSED] Clock 324540 BPP 24 DSC enabled
[09:00:57] ========== [PASSED] drm_test_dp_mst_calc_pbn_mode ==========
[09:00:57] ========= drm_test_dp_mst_sideband_msg_req_decode  =========
[09:00:57] [PASSED] DP_ENUM_PATH_RESOURCES with port number
[09:00:57] [PASSED] DP_POWER_UP_PHY with port number
[09:00:57] [PASSED] DP_POWER_DOWN_PHY with port number
[09:00:57] [PASSED] DP_ALLOCATE_PAYLOAD with SDP stream sinks
[09:00:57] [PASSED] DP_ALLOCATE_PAYLOAD with port number
[09:00:57] [PASSED] DP_ALLOCATE_PAYLOAD with VCPI
[09:00:57] [PASSED] DP_ALLOCATE_PAYLOAD with PBN
[09:00:57] [PASSED] DP_QUERY_PAYLOAD with port number
[09:00:57] [PASSED] DP_QUERY_PAYLOAD with VCPI
[09:00:57] [PASSED] DP_REMOTE_DPCD_READ with port number
[09:00:57] [PASSED] DP_REMOTE_DPCD_READ with DPCD address
[09:00:57] [PASSED] DP_REMOTE_DPCD_READ with max number of bytes
[09:00:57] [PASSED] DP_REMOTE_DPCD_WRITE with port number
[09:00:57] [PASSED] DP_REMOTE_DPCD_WRITE with DPCD address
[09:00:57] [PASSED] DP_REMOTE_DPCD_WRITE with data array
[09:00:57] [PASSED] DP_REMOTE_I2C_READ with port number
[09:00:57] [PASSED] DP_REMOTE_I2C_READ with I2C device ID
[09:00:57] [PASSED] DP_REMOTE_I2C_READ with transactions array
[09:00:57] [PASSED] DP_REMOTE_I2C_WRITE with port number
[09:00:57] [PASSED] DP_REMOTE_I2C_WRITE with I2C device ID
[09:00:57] [PASSED] DP_REMOTE_I2C_WRITE with data array
[09:00:57] [PASSED] DP_QUERY_STREAM_ENC_STATUS with stream ID
[09:00:57] [PASSED] DP_QUERY_STREAM_ENC_STATUS with client ID
[09:00:57] [PASSED] DP_QUERY_STREAM_ENC_STATUS with stream event
[09:00:57] [PASSED] DP_QUERY_STREAM_ENC_STATUS with valid stream event
[09:00:57] [PASSED] DP_QUERY_STREAM_ENC_STATUS with stream behavior
[09:00:57] [PASSED] DP_QUERY_STREAM_ENC_STATUS with a valid stream behavior
[09:00:57] ===== [PASSED] drm_test_dp_mst_sideband_msg_req_decode =====
[09:00:57] ================ [PASSED] drm_dp_mst_helper ================
[09:00:57] =========== drm_format_helper_test (11 subtests) ===========
[09:00:57] ============== drm_test_fb_xrgb8888_to_gray8  ==============
[09:00:57] [PASSED] single_pixel_source_buffer
[09:00:57] [PASSED] single_pixel_clip_rectangle
[09:00:57] [PASSED] well_known_colors
[09:00:57] [PASSED] destination_pitch
[09:00:57] ========== [PASSED] drm_test_fb_xrgb8888_to_gray8 ==========
[09:00:57] ============= drm_test_fb_xrgb8888_to_rgb332  ==============
[09:00:57] [PASSED] single_pixel_source_buffer
[09:00:57] [PASSED] single_pixel_clip_rectangle
[09:00:57] [PASSED] well_known_colors
[09:00:57] [PASSED] destination_pitch
[09:00:57] ========= [PASSED] drm_test_fb_xrgb8888_to_rgb332 ==========
[09:00:57] ============= drm_test_fb_xrgb8888_to_rgb565  ==============
[09:00:57] [PASSED] single_pixel_source_buffer
[09:00:57] [PASSED] single_pixel_clip_rectangle
[09:00:57] [PASSED] well_known_colors
[09:00:57] [PASSED] destination_pitch
[09:00:57] ========= [PASSED] drm_test_fb_xrgb8888_to_rgb565 ==========
[09:00:57] ============ drm_test_fb_xrgb8888_to_xrgb1555  =============
[09:00:57] [PASSED] single_pixel_source_buffer
[09:00:57] [PASSED] single_pixel_clip_rectangle
[09:00:57] [PASSED] well_known_colors
[09:00:57] [PASSED] destination_pitch
[09:00:57] ======== [PASSED] drm_test_fb_xrgb8888_to_xrgb1555 =========
[09:00:57] ============ drm_test_fb_xrgb8888_to_argb1555  =============
[09:00:57] [PASSED] single_pixel_source_buffer
[09:00:57] [PASSED] single_pixel_clip_rectangle
[09:00:57] [PASSED] well_known_colors
[09:00:57] [PASSED] destination_pitch
[09:00:57] ======== [PASSED] drm_test_fb_xrgb8888_to_argb1555 =========
[09:00:57] ============ drm_test_fb_xrgb8888_to_rgba5551  =============
[09:00:57] [PASSED] single_pixel_source_buffer
[09:00:57] [PASSED] single_pixel_clip_rectangle
[09:00:57] [PASSED] well_known_colors
[09:00:57] [PASSED] destination_pitch
[09:00:57] ======== [PASSED] drm_test_fb_xrgb8888_to_rgba5551 =========
[09:00:57] ============= drm_test_fb_xrgb8888_to_rgb888  ==============
[09:00:57] [PASSED] single_pixel_source_buffer
[09:00:57] [PASSED] single_pixel_clip_rectangle
[09:00:57] [PASSED] well_known_colors
[09:00:57] [PASSED] destination_pitch
[09:00:57] ========= [PASSED] drm_test_fb_xrgb8888_to_rgb888 ==========
[09:00:57] ============ drm_test_fb_xrgb8888_to_argb8888  =============
[09:00:57] [PASSED] single_pixel_source_buffer
[09:00:57] [PASSED] single_pixel_clip_rectangle
[09:00:57] [PASSED] well_known_colors
[09:00:57] [PASSED] destination_pitch
[09:00:57] ======== [PASSED] drm_test_fb_xrgb8888_to_argb8888 =========
[09:00:57] =========== drm_test_fb_xrgb8888_to_xrgb2101010  ===========
[09:00:57] [PASSED] single_pixel_source_buffer
[09:00:57] [PASSED] single_pixel_clip_rectangle
[09:00:57] [PASSED] well_known_colors
[09:00:57] [PASSED] destination_pitch
[09:00:57] ======= [PASSED] drm_test_fb_xrgb8888_to_xrgb2101010 =======
[09:00:57] =========== drm_test_fb_xrgb8888_to_argb2101010  ===========
[09:00:57] [PASSED] single_pixel_source_buffer
[09:00:57] [PASSED] single_pixel_clip_rectangle
[09:00:57] [PASSED] well_known_colors
[09:00:57] [PASSED] destination_pitch
[09:00:57] ======= [PASSED] drm_test_fb_xrgb8888_to_argb2101010 =======
[09:00:57] ============== drm_test_fb_xrgb8888_to_mono  ===============
[09:00:57] [PASSED] single_pixel_source_buffer
[09:00:57] [PASSED] single_pixel_clip_rectangle
[09:00:57] [PASSED] well_known_colors
[09:00:57] [PASSED] destination_pitch
[09:00:57] ========== [PASSED] drm_test_fb_xrgb8888_to_mono ===========
[09:00:57] ============= [PASSED] drm_format_helper_test ==============
[09:00:57] ================= drm_format (18 subtests) =================
[09:00:57] [PASSED] drm_test_format_block_width_invalid
[09:00:57] [PASSED] drm_test_format_block_width_one_plane
[09:00:57] [PASSED] drm_test_format_block_width_two_plane
[09:00:57] [PASSED] drm_test_format_block_width_three_plane
[09:00:57] [PASSED] drm_test_format_block_width_tiled
[09:00:57] [PASSED] drm_test_format_block_height_invalid
[09:00:57] [PASSED] drm_test_format_block_height_one_plane
[09:00:57] [PASSED] drm_test_format_block_height_two_plane
[09:00:57] [PASSED] drm_test_format_block_height_three_plane
[09:00:57] [PASSED] drm_test_format_block_height_tiled
[09:00:57] [PASSED] drm_test_format_min_pitch_invalid
[09:00:57] [PASSED] drm_test_format_min_pitch_one_plane_8bpp
[09:00:57] [PASSED] drm_test_format_min_pitch_one_plane_16bpp
[09:00:57] [PASSED] drm_test_format_min_pitch_one_plane_24bpp
[09:00:57] [PASSED] drm_test_format_min_pitch_one_plane_32bpp
[09:00:57] [PASSED] drm_test_format_min_pitch_two_plane
[09:00:57] [PASSED] drm_test_format_min_pitch_three_plane_8bpp
[09:00:57] [PASSED] drm_test_format_min_pitch_tiled
[09:00:57] =================== [PASSED] drm_format ====================
[09:00:57] =============== drm_framebuffer (1 subtest) ================
[09:00:57] =============== drm_test_framebuffer_create  ===============
[09:00:57] [PASSED] ABGR8888 normal sizes
[09:00:57] [PASSED] ABGR8888 max sizes
[09:00:57] [PASSED] ABGR8888 pitch greater than min required
[09:00:57] [PASSED] ABGR8888 pitch less than min required
[09:00:57] [PASSED] ABGR8888 Invalid width
[09:00:57] [PASSED] ABGR8888 Invalid buffer handle
[09:00:57] [PASSED] No pixel format
[09:00:57] [PASSED] ABGR8888 Width 0
[09:00:57] [PASSED] ABGR8888 Height 0
[09:00:57] [PASSED] ABGR8888 Out of bound height * pitch combination
[09:00:57] [PASSED] ABGR8888 Large buffer offset
[09:00:57] [PASSED] ABGR8888 Set DRM_MODE_FB_MODIFIERS without modifiers
[09:00:57] [PASSED] ABGR8888 Valid buffer modifier
[09:00:57] [PASSED] ABGR8888 Invalid buffer modifier(DRM_FORMAT_MOD_SAMSUNG_64_32_TILE)
[09:00:57] [PASSED] ABGR8888 Extra pitches without DRM_MODE_FB_MODIFIERS
[09:00:57] [PASSED] ABGR8888 Extra pitches with DRM_MODE_FB_MODIFIERS
[09:00:57] [PASSED] NV12 Normal sizes
[09:00:57] [PASSED] NV12 Max sizes
[09:00:57] [PASSED] NV12 Invalid pitch
[09:00:57] [PASSED] NV12 Invalid modifier/missing DRM_MODE_FB_MODIFIERS flag
[09:00:57] [PASSED] NV12 different  modifier per-plane
[09:00:57] [PASSED] NV12 with DRM_FORMAT_MOD_SAMSUNG_64_32_TILE
[09:00:57] [PASSED] NV12 Valid modifiers without DRM_MODE_FB_MODIFIERS
[09:00:57] [PASSED] NV12 Modifier for inexistent plane
[09:00:57] [PASSED] NV12 Handle for inexistent plane
[09:00:57] [PASSED] NV12 Handle for inexistent plane without DRM_MODE_FB_MODIFIERS
[09:00:57] [PASSED] YVU420 DRM_MODE_FB_MODIFIERS set without modifier
[09:00:57] [PASSED] YVU420 Normal sizes
[09:00:57] [PASSED] YVU420 Max sizes
[09:00:57] [PASSED] YVU420 Invalid pitch
[09:00:57] [PASSED] YVU420 Different pitches
[09:00:57] [PASSED] YVU420 Different buffer offsets/pitches
[09:00:57] [PASSED] YVU420 Modifier set just for plane 0, without DRM_MODE_FB_MODIFIERS
[09:00:57] [PASSED] YVU420 Modifier set just for planes 0, 1, without DRM_MODE_FB_MODIFIERS
[09:00:57] [PASSED] YVU420 Modifier set just for plane 0, 1, with DRM_MODE_FB_MODIFIERS
[09:00:57] [PASSED] YVU420 Valid modifier
[09:00:57] [PASSED] YVU420 Different modifiers per plane
[09:00:57] [PASSED] YVU420 Modifier for inexistent plane
[09:00:57] [PASSED] X0L2 Normal sizes
[09:00:57] [PASSED] X0L2 Max sizes
[09:00:57] [PASSED] X0L2 Invalid pitch
[09:00:57] [PASSED] X0L2 Pitch greater than minimum required
stty: 'standard input': Inappropriate ioctl for device
[09:00:57] [PASSED] X0L2 Handle for inexistent plane
[09:00:57] [PASSED] X0L2 Offset for inexistent plane, without DRM_MODE_FB_MODIFIERS set
[09:00:57] [PASSED] X0L2 Modifier without DRM_MODE_FB_MODIFIERS set
[09:00:57] [PASSED] X0L2 Valid modifier
[09:00:57] [PASSED] X0L2 Modifier for inexistent plane
[09:00:57] =========== [PASSED] drm_test_framebuffer_create ===========
[09:00:57] ================= [PASSED] drm_framebuffer =================
[09:00:57] =============== drm-test-managed (1 subtest) ===============
[09:00:57] [PASSED] drm_test_managed_run_action
[09:00:57] ================ [PASSED] drm-test-managed =================
[09:00:57] =================== drm_mm (19 subtests) ===================
[09:00:57] [PASSED] drm_test_mm_init
[09:00:57] [PASSED] drm_test_mm_debug
[09:01:07] [PASSED] drm_test_mm_reserve
[09:01:17] [PASSED] drm_test_mm_insert
[09:01:17] [PASSED] drm_test_mm_replace
[09:01:17] [PASSED] drm_test_mm_insert_range
[09:01:17] [PASSED] drm_test_mm_frag
[09:01:17] [PASSED] drm_test_mm_align
[09:01:17] [PASSED] drm_test_mm_align32
[09:01:18] [PASSED] drm_test_mm_align64
[09:01:18] [PASSED] drm_test_mm_evict
[09:01:18] [PASSED] drm_test_mm_evict_range
[09:01:18] [PASSED] drm_test_mm_topdown
[09:01:18] [PASSED] drm_test_mm_bottomup
[09:01:18] [PASSED] drm_test_mm_lowest
[09:01:18] [PASSED] drm_test_mm_highest
[09:01:19] [PASSED] drm_test_mm_color
[09:01:19] [PASSED] drm_test_mm_color_evict
[09:01:19] [PASSED] drm_test_mm_color_evict_range
[09:01:19] ===================== [PASSED] drm_mm ======================
[09:01:19] ============= drm_modes_analog_tv (4 subtests) =============
[09:01:19] [PASSED] drm_test_modes_analog_tv_ntsc_480i
[09:01:19] [PASSED] drm_test_modes_analog_tv_ntsc_480i_inlined
[09:01:19] [PASSED] drm_test_modes_analog_tv_pal_576i
[09:01:19] [PASSED] drm_test_modes_analog_tv_pal_576i_inlined
[09:01:19] =============== [PASSED] drm_modes_analog_tv ===============
[09:01:19] ============== drm_plane_helper (2 subtests) ===============
[09:01:19] =============== drm_test_check_plane_state  ================
[09:01:19] [PASSED] clipping_simple
[09:01:19] [PASSED] clipping_rotate_reflect
[09:01:19] [PASSED] positioning_simple
[09:01:19] [PASSED] upscaling
[09:01:19] [PASSED] downscaling
[09:01:19] [PASSED] rounding1
[09:01:19] [PASSED] rounding2
[09:01:19] [PASSED] rounding3
[09:01:19] [PASSED] rounding4
[09:01:19] =========== [PASSED] drm_test_check_plane_state ============
[09:01:19] =========== drm_test_check_invalid_plane_state  ============
[09:01:19] [PASSED] positioning_invalid
[09:01:19] [PASSED] upscaling_invalid
[09:01:19] [PASSED] downscaling_invalid
[09:01:19] ======= [PASSED] drm_test_check_invalid_plane_state ========
[09:01:19] ================ [PASSED] drm_plane_helper =================
[09:01:19] ====== drm_connector_helper_tv_get_modes (1 subtest) =======
[09:01:19] ====== drm_test_connector_helper_tv_get_modes_check  =======
[09:01:19] [PASSED] None
[09:01:19] [PASSED] PAL
[09:01:19] [PASSED] NTSC
[09:01:19] [PASSED] Both, NTSC Default
[09:01:19] [PASSED] Both, PAL Default
[09:01:19] [PASSED] Both, NTSC Default, with PAL on command-line
[09:01:19] [PASSED] Both, PAL Default, with NTSC on command-line
[09:01:19] == [PASSED] drm_test_connector_helper_tv_get_modes_check ===
[09:01:19] ======== [PASSED] drm_connector_helper_tv_get_modes ========
[09:01:19] ================== drm_rect (9 subtests) ===================
[09:01:19] [PASSED] drm_test_rect_clip_scaled_div_by_zero
[09:01:19] [PASSED] drm_test_rect_clip_scaled_not_clipped
[09:01:19] [PASSED] drm_test_rect_clip_scaled_clipped
[09:01:19] [PASSED] drm_test_rect_clip_scaled_signed_vs_unsigned
[09:01:19] ================= drm_test_rect_intersect  =================
[09:01:19] [PASSED] top-left x bottom-right: 2x2+1+1 x 2x2+0+0
[09:01:19] [PASSED] top-right x bottom-left: 2x2+0+0 x 2x2+1-1
[09:01:19] [PASSED] bottom-left x top-right: 2x2+1-1 x 2x2+0+0
[09:01:19] [PASSED] bottom-right x top-left: 2x2+0+0 x 2x2+1+1
[09:01:19] [PASSED] right x left: 2x1+0+0 x 3x1+1+0
[09:01:19] [PASSED] left x right: 3x1+1+0 x 2x1+0+0
[09:01:19] [PASSED] up x bottom: 1x2+0+0 x 1x3+0-1
[09:01:19] [PASSED] bottom x up: 1x3+0-1 x 1x2+0+0
[09:01:19] [PASSED] touching corner: 1x1+0+0 x 2x2+1+1
[09:01:19] [PASSED] touching side: 1x1+0+0 x 1x1+1+0
[09:01:19] [PASSED] equal rects: 2x2+0+0 x 2x2+0+0
[09:01:19] [PASSED] inside another: 2x2+0+0 x 1x1+1+1
[09:01:19] [PASSED] far away: 1x1+0+0 x 1x1+3+6
[09:01:19] [PASSED] points intersecting: 0x0+5+10 x 0x0+5+10
[09:01:19] [PASSED] points not intersecting: 0x0+0+0 x 0x0+5+10
[09:01:19] ============= [PASSED] drm_test_rect_intersect =============
[09:01:19] ================ drm_test_rect_calc_hscale  ================
[09:01:19] [PASSED] normal use
[09:01:19] [PASSED] out of max range
[09:01:19] [PASSED] out of min range
[09:01:19] [PASSED] zero dst
[09:01:19] [PASSED] negative src
[09:01:19] [PASSED] negative dst
[09:01:19] ============ [PASSED] drm_test_rect_calc_hscale ============
[09:01:19] ================ drm_test_rect_calc_vscale  ================
[09:01:19] [PASSED] normal use
[09:01:19] [PASSED] out of max range
[09:01:19] [PASSED] out of min range
[09:01:19] [PASSED] zero dst
[09:01:19] [PASSED] negative src
[09:01:19] [PASSED] negative dst
[09:01:19] ============ [PASSED] drm_test_rect_calc_vscale ============
[09:01:19] ================== drm_test_rect_rotate  ===================
[09:01:19] [PASSED] reflect-x
[09:01:19] [PASSED] reflect-y
[09:01:19] [PASSED] rotate-0
[09:01:19] [PASSED] rotate-90
[09:01:19] [PASSED] rotate-180
[09:01:19] [PASSED] rotate-270
[09:01:19] ============== [PASSED] drm_test_rect_rotate ===============
[09:01:19] ================ drm_test_rect_rotate_inv  =================
[09:01:19] [PASSED] reflect-x
[09:01:19] [PASSED] reflect-y
[09:01:19] [PASSED] rotate-0
[09:01:19] [PASSED] rotate-90
[09:01:19] [PASSED] rotate-180
[09:01:19] [PASSED] rotate-270
[09:01:19] ============ [PASSED] drm_test_rect_rotate_inv =============
[09:01:19] ==================== [PASSED] drm_rect =====================
[09:01:19] ============================================================
[09:01:19] Testing complete. Ran 333 tests: passed: 333
[09:01:19] Elapsed time: 42.744s total, 1.723s configuring, 18.343s building, 22.663s running

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



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

* [Intel-xe] ✓ CI.Build: success for drm/xe: Add engine scheduler control interface (rev9)
  2023-07-27  8:22 [Intel-xe] [PATCH V9 0/6] drm/xe: Add engine scheduler control interface Tejas Upadhyay
                   ` (8 preceding siblings ...)
  2023-07-27  9:01 ` [Intel-xe] ✓ CI.KUnit: success " Patchwork
@ 2023-07-27  9:05 ` Patchwork
  2023-07-27  9:05 ` [Intel-xe] ✓ CI.Hooks: " Patchwork
                   ` (2 subsequent siblings)
  12 siblings, 0 replies; 30+ messages in thread
From: Patchwork @ 2023-07-27  9:05 UTC (permalink / raw)
  To: Tejas Upadhyay; +Cc: intel-xe

== Series Details ==

Series: drm/xe: Add engine scheduler control interface (rev9)
URL   : https://patchwork.freedesktop.org/series/119392/
State : success

== Summary ==

+ trap cleanup EXIT
+ cd /kernel
+ git clone https://gitlab.freedesktop.org/drm/xe/ci.git .ci
Cloning into '.ci'...
++ date +%s
+ echo -e '\e[0Ksection_start:1690448489:build_x86_64[collapsed=true]\r\e[0KBuild x86-64'
+ mkdir -p build64
^[[0Ksection_start:1690448489:build_x86_64[collapsed=true]
^[[0KBuild x86-64
+ cat .ci/kernel/kconfig
+ make O=build64 olddefconfig
make[1]: Entering directory '/kernel/build64'
  GEN     Makefile
  HOSTCC  scripts/basic/fixdep
  HOSTCC  scripts/kconfig/conf.o
  HOSTCC  scripts/kconfig/confdata.o
  HOSTCC  scripts/kconfig/expr.o
  LEX     scripts/kconfig/lexer.lex.c
  YACC    scripts/kconfig/parser.tab.[ch]
  HOSTCC  scripts/kconfig/lexer.lex.o
  HOSTCC  scripts/kconfig/menu.o
  HOSTCC  scripts/kconfig/parser.tab.o
  HOSTCC  scripts/kconfig/preprocess.o
  HOSTCC  scripts/kconfig/symbol.o
  HOSTCC  scripts/kconfig/util.o
  HOSTLD  scripts/kconfig/conf
#
# configuration written to .config
#
make[1]: Leaving directory '/kernel/build64'
++ nproc
+ make O=build64 -j48
make[1]: Entering directory '/kernel/build64'
  GEN     Makefile
  WRAP    arch/x86/include/generated/uapi/asm/bpf_perf_event.h
  WRAP    arch/x86/include/generated/uapi/asm/errno.h
  WRAP    arch/x86/include/generated/uapi/asm/fcntl.h
  SYSHDR  arch/x86/include/generated/uapi/asm/unistd_32.h
  WRAP    arch/x86/include/generated/uapi/asm/ioctl.h
  SYSHDR  arch/x86/include/generated/uapi/asm/unistd_x32.h
  GEN     arch/x86/include/generated/asm/orc_hash.h
  SYSHDR  arch/x86/include/generated/uapi/asm/unistd_64.h
  WRAP    arch/x86/include/generated/uapi/asm/ioctls.h
  SYSTBL  arch/x86/include/generated/asm/syscalls_32.h
  WRAP    arch/x86/include/generated/uapi/asm/ipcbuf.h
  SYSHDR  arch/x86/include/generated/asm/unistd_32_ia32.h
  WRAP    arch/x86/include/generated/uapi/asm/param.h
  SYSHDR  arch/x86/include/generated/asm/unistd_64_x32.h
  SYSTBL  arch/x86/include/generated/asm/syscalls_64.h
  WRAP    arch/x86/include/generated/uapi/asm/poll.h
  WRAP    arch/x86/include/generated/uapi/asm/resource.h
  WRAP    arch/x86/include/generated/uapi/asm/socket.h
  WRAP    arch/x86/include/generated/uapi/asm/sockios.h
  WRAP    arch/x86/include/generated/uapi/asm/termbits.h
  WRAP    arch/x86/include/generated/uapi/asm/termios.h
  WRAP    arch/x86/include/generated/uapi/asm/types.h
  HOSTCC  arch/x86/tools/relocs_32.o
  HOSTCC  arch/x86/tools/relocs_64.o
  HOSTCC  arch/x86/tools/relocs_common.o
  WRAP    arch/x86/include/generated/asm/export.h
  WRAP    arch/x86/include/generated/asm/early_ioremap.h
  WRAP    arch/x86/include/generated/asm/mcs_spinlock.h
  WRAP    arch/x86/include/generated/asm/irq_regs.h
  WRAP    arch/x86/include/generated/asm/kmap_size.h
  WRAP    arch/x86/include/generated/asm/local64.h
  WRAP    arch/x86/include/generated/asm/mmiowb.h
  WRAP    arch/x86/include/generated/asm/module.lds.h
  WRAP    arch/x86/include/generated/asm/rwonce.h
  WRAP    arch/x86/include/generated/asm/unaligned.h
  UPD     include/generated/uapi/linux/version.h
  UPD     include/config/kernel.release
  UPD     include/generated/compile.h
  HOSTCC  scripts/unifdef
  HOSTCC  scripts/kallsyms
  HOSTCC  scripts/sorttable
  UPD     include/generated/utsrelease.h
  HOSTCC  scripts/asn1_compiler
  DESCEND objtool
  HOSTCC  /kernel/build64/tools/objtool/fixdep.o
  HOSTLD  /kernel/build64/tools/objtool/fixdep-in.o
  LINK    /kernel/build64/tools/objtool/fixdep
  HOSTLD  arch/x86/tools/relocs
  INSTALL /kernel/build64/tools/objtool/libsubcmd/include/subcmd/exec-cmd.h
  INSTALL /kernel/build64/tools/objtool/libsubcmd/include/subcmd/help.h
  INSTALL /kernel/build64/tools/objtool/libsubcmd/include/subcmd/pager.h
  INSTALL /kernel/build64/tools/objtool/libsubcmd/include/subcmd/parse-options.h
  INSTALL /kernel/build64/tools/objtool/libsubcmd/include/subcmd/run-command.h
  CC      /kernel/build64/tools/objtool/libsubcmd/exec-cmd.o
  CC      /kernel/build64/tools/objtool/libsubcmd/help.o
  CC      /kernel/build64/tools/objtool/libsubcmd/pager.o
  INSTALL libsubcmd_headers
  CC      /kernel/build64/tools/objtool/libsubcmd/parse-options.o
  CC      /kernel/build64/tools/objtool/libsubcmd/run-command.o
  CC      /kernel/build64/tools/objtool/libsubcmd/sigchain.o
  CC      /kernel/build64/tools/objtool/libsubcmd/subcmd-config.o
  CC      scripts/mod/empty.o
  HOSTCC  scripts/mod/mk_elfconfig
  CC      scripts/mod/devicetable-offsets.s
  HDRINST usr/include/video/edid.h
  HDRINST usr/include/video/uvesafb.h
  HDRINST usr/include/video/sisfb.h
  HDRINST usr/include/drm/amdgpu_drm.h
  HDRINST usr/include/drm/qaic_accel.h
  HDRINST usr/include/drm/i915_drm.h
  HDRINST usr/include/drm/vgem_drm.h
  HDRINST usr/include/drm/xe_drm.h
  HDRINST usr/include/drm/virtgpu_drm.h
  HDRINST usr/include/drm/omap_drm.h
  HDRINST usr/include/drm/radeon_drm.h
  HDRINST usr/include/drm/tegra_drm.h
  HDRINST usr/include/drm/drm_mode.h
  HDRINST usr/include/drm/ivpu_accel.h
  HDRINST usr/include/drm/exynos_drm.h
  HDRINST usr/include/drm/drm_sarea.h
  HDRINST usr/include/drm/qxl_drm.h
  HDRINST usr/include/drm/v3d_drm.h
  HDRINST usr/include/drm/nouveau_drm.h
  HDRINST usr/include/drm/drm_fourcc.h
  HDRINST usr/include/drm/habanalabs_accel.h
  HDRINST usr/include/drm/vmwgfx_drm.h
  HDRINST usr/include/drm/msm_drm.h
  HDRINST usr/include/drm/etnaviv_drm.h
  HDRINST usr/include/drm/vc4_drm.h
  HDRINST usr/include/drm/panfrost_drm.h
  HDRINST usr/include/drm/lima_drm.h
  HDRINST usr/include/drm/drm.h
  HDRINST usr/include/drm/armada_drm.h
  HDRINST usr/include/mtd/inftl-user.h
  HDRINST usr/include/mtd/nftl-user.h
  HDRINST usr/include/mtd/mtd-user.h
  HDRINST usr/include/mtd/ubi-user.h
  HDRINST usr/include/mtd/mtd-abi.h
  HDRINST usr/include/xen/gntalloc.h
  HDRINST usr/include/xen/gntdev.h
  HDRINST usr/include/xen/evtchn.h
  HDRINST usr/include/xen/privcmd.h
  HDRINST usr/include/asm-generic/auxvec.h
  HDRINST usr/include/asm-generic/bitsperlong.h
  HDRINST usr/include/asm-generic/posix_types.h
  HDRINST usr/include/asm-generic/ioctls.h
  HDRINST usr/include/asm-generic/mman.h
  HDRINST usr/include/asm-generic/shmbuf.h
  HDRINST usr/include/asm-generic/bpf_perf_event.h
  HDRINST usr/include/asm-generic/types.h
  HDRINST usr/include/asm-generic/poll.h
  HDRINST usr/include/asm-generic/msgbuf.h
  HDRINST usr/include/asm-generic/swab.h
  HDRINST usr/include/asm-generic/statfs.h
  HDRINST usr/include/asm-generic/unistd.h
  HDRINST usr/include/asm-generic/hugetlb_encode.h
  HDRINST usr/include/asm-generic/resource.h
  HDRINST usr/include/asm-generic/param.h
  HDRINST usr/include/asm-generic/termbits-common.h
  HDRINST usr/include/asm-generic/sockios.h
  HDRINST usr/include/asm-generic/kvm_para.h
  HDRINST usr/include/asm-generic/errno.h
  HDRINST usr/include/asm-generic/termios.h
  HDRINST usr/include/asm-generic/mman-common.h
  HDRINST usr/include/asm-generic/ioctl.h
  HDRINST usr/include/asm-generic/socket.h
  HDRINST usr/include/asm-generic/signal-defs.h
  HDRINST usr/include/asm-generic/termbits.h
  HDRINST usr/include/asm-generic/int-ll64.h
  HDRINST usr/include/asm-generic/signal.h
  HDRINST usr/include/asm-generic/siginfo.h
  HDRINST usr/include/asm-generic/stat.h
  HDRINST usr/include/asm-generic/int-l64.h
  HDRINST usr/include/asm-generic/errno-base.h
  HDRINST usr/include/asm-generic/fcntl.h
  HDRINST usr/include/asm-generic/setup.h
  HDRINST usr/include/asm-generic/ipcbuf.h
  HDRINST usr/include/asm-generic/sembuf.h
  HDRINST usr/include/asm-generic/ucontext.h
  HDRINST usr/include/rdma/mlx5_user_ioctl_cmds.h
  HDRINST usr/include/rdma/irdma-abi.h
  HDRINST usr/include/rdma/mana-abi.h
  HDRINST usr/include/rdma/hfi/hfi1_user.h
  HDRINST usr/include/rdma/hfi/hfi1_ioctl.h
  HDRINST usr/include/rdma/rdma_user_rxe.h
  HDRINST usr/include/rdma/rdma_user_ioctl.h
  HDRINST usr/include/rdma/mlx5_user_ioctl_verbs.h
  HDRINST usr/include/rdma/bnxt_re-abi.h
  HDRINST usr/include/rdma/hns-abi.h
  HDRINST usr/include/rdma/qedr-abi.h
  HDRINST usr/include/rdma/ib_user_ioctl_cmds.h
  HDRINST usr/include/rdma/vmw_pvrdma-abi.h
  HDRINST usr/include/rdma/ib_user_sa.h
  HDRINST usr/include/rdma/ib_user_ioctl_verbs.h
  HDRINST usr/include/rdma/rvt-abi.h
  HDRINST usr/include/rdma/mlx5-abi.h
  HDRINST usr/include/rdma/rdma_netlink.h
  HDRINST usr/include/rdma/erdma-abi.h
  HDRINST usr/include/rdma/rdma_user_ioctl_cmds.h
  HDRINST usr/include/rdma/rdma_user_cm.h
  HDRINST usr/include/rdma/ib_user_verbs.h
  HDRINST usr/include/rdma/efa-abi.h
  HDRINST usr/include/rdma/siw-abi.h
  HDRINST usr/include/rdma/mlx4-abi.h
  HDRINST usr/include/rdma/mthca-abi.h
  HDRINST usr/include/rdma/ib_user_mad.h
  HDRINST usr/include/rdma/ocrdma-abi.h
  HDRINST usr/include/rdma/cxgb4-abi.h
  HDRINST usr/include/misc/xilinx_sdfec.h
  HDRINST usr/include/misc/uacce/hisi_qm.h
  HDRINST usr/include/misc/uacce/uacce.h
  HDRINST usr/include/misc/cxl.h
  HDRINST usr/include/misc/ocxl.h
  HDRINST usr/include/misc/fastrpc.h
  HDRINST usr/include/misc/pvpanic.h
  HDRINST usr/include/linux/i8k.h
  HDRINST usr/include/linux/acct.h
  HDRINST usr/include/linux/atmmpc.h
  HDRINST usr/include/linux/fs.h
  HDRINST usr/include/linux/cifs/cifs_mount.h
  HDRINST usr/include/linux/cifs/cifs_netlink.h
  HDRINST usr/include/linux/if_packet.h
  HDRINST usr/include/linux/route.h
  HDRINST usr/include/linux/patchkey.h
  HDRINST usr/include/linux/tc_ematch/tc_em_cmp.h
  HDRINST usr/include/linux/tc_ematch/tc_em_ipt.h
  HDRINST usr/include/linux/tc_ematch/tc_em_meta.h
  HDRINST usr/include/linux/tc_ematch/tc_em_nbyte.h
  HDRINST usr/include/linux/tc_ematch/tc_em_text.h
  HDRINST usr/include/linux/virtio_pmem.h
  HDRINST usr/include/linux/rkisp1-config.h
  HDRINST usr/include/linux/vhost.h
  HDRINST usr/include/linux/cec-funcs.h
  HDRINST usr/include/linux/ppdev.h
  HDRINST usr/include/linux/isdn/capicmd.h
  HDRINST usr/include/linux/virtio_fs.h
  HDRINST usr/include/linux/netfilter_ipv6.h
  HDRINST usr/include/linux/lirc.h
  HDRINST usr/include/linux/mroute6.h
  HDRINST usr/include/linux/nl80211-vnd-intel.h
  HDRINST usr/include/linux/ivtvfb.h
  UPD     scripts/mod/devicetable-offsets.h
  HDRINST usr/include/linux/auxvec.h
  HDRINST usr/include/linux/dm-log-userspace.h
  HDRINST usr/include/linux/dccp.h
  HDRINST usr/include/linux/virtio_scmi.h
  HDRINST usr/include/linux/atmarp.h
  HDRINST usr/include/linux/arcfb.h
  HDRINST usr/include/linux/nbd-netlink.h
  HDRINST usr/include/linux/sched/types.h
  HDRINST usr/include/linux/tcp.h
  HDRINST usr/include/linux/neighbour.h
  HDRINST usr/include/linux/dlm_device.h
  HDRINST usr/include/linux/wmi.h
  HDRINST usr/include/linux/btrfs_tree.h
  HDRINST usr/include/linux/virtio_crypto.h
  HDRINST usr/include/linux/vbox_err.h
  HDRINST usr/include/linux/edd.h
  HDRINST usr/include/linux/loop.h
  HDRINST usr/include/linux/nvme_ioctl.h
  HDRINST usr/include/linux/mmtimer.h
  HDRINST usr/include/linux/if_pppol2tp.h
  HDRINST usr/include/linux/mtio.h
  HDRINST usr/include/linux/if_arcnet.h
  HDRINST usr/include/linux/romfs_fs.h
  HDRINST usr/include/linux/posix_types.h
  HDRINST usr/include/linux/rtc.h
  HDRINST usr/include/linux/landlock.h
  HDRINST usr/include/linux/gpio.h
  HDRINST usr/include/linux/selinux_netlink.h
  HDRINST usr/include/linux/pps.h
  HDRINST usr/include/linux/ndctl.h
  HDRINST usr/include/linux/virtio_gpu.h
  HDRINST usr/include/linux/android/binderfs.h
  HDRINST usr/include/linux/android/binder.h
  HDRINST usr/include/linux/virtio_vsock.h
  HDRINST usr/include/linux/sound.h
  HDRINST usr/include/linux/vtpm_proxy.h
  HDRINST usr/include/linux/nfs_fs.h
  HDRINST usr/include/linux/elf-fdpic.h
  HDRINST usr/include/linux/adfs_fs.h
  HDRINST usr/include/linux/target_core_user.h
  HDRINST usr/include/linux/netlink_diag.h
  HDRINST usr/include/linux/const.h
  HDRINST usr/include/linux/firewire-cdev.h
  HDRINST usr/include/linux/vdpa.h
  HDRINST usr/include/linux/if_infiniband.h
  HDRINST usr/include/linux/serial.h
  MKELF   scripts/mod/elfconfig.h
  HDRINST usr/include/linux/iio/types.h
  HDRINST usr/include/linux/iio/buffer.h
  HDRINST usr/include/linux/iio/events.h
  HDRINST usr/include/linux/baycom.h
  HDRINST usr/include/linux/major.h
  HDRINST usr/include/linux/atmppp.h
  HDRINST usr/include/linux/ipv6_route.h
  HOSTCC  scripts/mod/modpost.o
  HDRINST usr/include/linux/spi/spidev.h
  HOSTCC  scripts/mod/file2alias.o
  HOSTCC  scripts/mod/sumversion.o
  HDRINST usr/include/linux/spi/spi.h
  HDRINST usr/include/linux/virtio_ring.h
  HDRINST usr/include/linux/hdlc/ioctl.h
  HDRINST usr/include/linux/remoteproc_cdev.h
  HDRINST usr/include/linux/hyperv.h
  HDRINST usr/include/linux/rpl_iptunnel.h
  HDRINST usr/include/linux/sync_file.h
  HDRINST usr/include/linux/igmp.h
  HDRINST usr/include/linux/v4l2-dv-timings.h
  HDRINST usr/include/linux/virtio_i2c.h
  HDRINST usr/include/linux/xfrm.h
  HDRINST usr/include/linux/capability.h
  HDRINST usr/include/linux/gtp.h
  HDRINST usr/include/linux/xdp_diag.h
  HDRINST usr/include/linux/pkt_cls.h
  HDRINST usr/include/linux/suspend_ioctls.h
  HDRINST usr/include/linux/vt.h
  HDRINST usr/include/linux/loadpin.h
  HDRINST usr/include/linux/dlm_plock.h
  HDRINST usr/include/linux/fb.h
  HDRINST usr/include/linux/max2175.h
  HDRINST usr/include/linux/sunrpc/debug.h
  HDRINST usr/include/linux/gsmmux.h
  HDRINST usr/include/linux/watchdog.h
  HDRINST usr/include/linux/vhost_types.h
  HDRINST usr/include/linux/vduse.h
  HDRINST usr/include/linux/ila.h
  HDRINST usr/include/linux/tdx-guest.h
  HDRINST usr/include/linux/close_range.h
  HDRINST usr/include/linux/ivtv.h
  HDRINST usr/include/linux/cryptouser.h
  HDRINST usr/include/linux/netfilter/xt_string.h
  HDRINST usr/include/linux/netfilter/nfnetlink_compat.h
  HDRINST usr/include/linux/netfilter/nf_nat.h
  HDRINST usr/include/linux/netfilter/xt_recent.h
  HDRINST usr/include/linux/netfilter/xt_addrtype.h
  HDRINST usr/include/linux/netfilter/nf_conntrack_tcp.h
  HDRINST usr/include/linux/netfilter/xt_MARK.h
  HDRINST usr/include/linux/netfilter/xt_SYNPROXY.h
  HDRINST usr/include/linux/netfilter/xt_multiport.h
  HDRINST usr/include/linux/netfilter/nfnetlink.h
  HDRINST usr/include/linux/netfilter/xt_cgroup.h
  HDRINST usr/include/linux/netfilter/nf_synproxy.h
  HDRINST usr/include/linux/netfilter/xt_TCPOPTSTRIP.h
  HDRINST usr/include/linux/netfilter/nfnetlink_log.h
  HDRINST usr/include/linux/netfilter/xt_TPROXY.h
  HDRINST usr/include/linux/netfilter/xt_u32.h
  HDRINST usr/include/linux/netfilter/nfnetlink_osf.h
  HDRINST usr/include/linux/netfilter/xt_ecn.h
  HDRINST usr/include/linux/netfilter/xt_esp.h
  HDRINST usr/include/linux/netfilter/nfnetlink_hook.h
  HDRINST usr/include/linux/netfilter/xt_mac.h
  HDRINST usr/include/linux/netfilter/xt_comment.h
  HDRINST usr/include/linux/netfilter/xt_NFQUEUE.h
  HDRINST usr/include/linux/netfilter/xt_osf.h
  HDRINST usr/include/linux/netfilter/xt_hashlimit.h
  HDRINST usr/include/linux/netfilter/nf_conntrack_sctp.h
  HDRINST usr/include/linux/netfilter/xt_socket.h
  HDRINST usr/include/linux/netfilter/xt_connmark.h
  HDRINST usr/include/linux/netfilter/xt_sctp.h
  HDRINST usr/include/linux/netfilter/xt_tcpudp.h
  HDRINST usr/include/linux/netfilter/xt_DSCP.h
  HDRINST usr/include/linux/netfilter/xt_time.h
  HDRINST usr/include/linux/netfilter/xt_IDLETIMER.h
  HDRINST usr/include/linux/netfilter/xt_policy.h
  HDRINST usr/include/linux/netfilter/xt_rpfilter.h
  HDRINST usr/include/linux/netfilter/xt_nfacct.h
  HDRINST usr/include/linux/netfilter/xt_SECMARK.h
  HDRINST usr/include/linux/netfilter/xt_length.h
  HDRINST usr/include/linux/netfilter/nfnetlink_cthelper.h
  HDRINST usr/include/linux/netfilter/xt_quota.h
  HDRINST usr/include/linux/netfilter/xt_CLASSIFY.h
  HDRINST usr/include/linux/netfilter/xt_ipcomp.h
  HDRINST usr/include/linux/netfilter/xt_iprange.h
  HDRINST usr/include/linux/netfilter/xt_bpf.h
  HDRINST usr/include/linux/netfilter/xt_LOG.h
  HDRINST usr/include/linux/netfilter/xt_rateest.h
  HDRINST usr/include/linux/netfilter/xt_CONNSECMARK.h
  HDRINST usr/include/linux/netfilter/xt_HMARK.h
  HDRINST usr/include/linux/netfilter/xt_CONNMARK.h
  HDRINST usr/include/linux/netfilter/xt_pkttype.h
  HDRINST usr/include/linux/netfilter/xt_ipvs.h
  HDRINST usr/include/linux/netfilter/xt_devgroup.h
  HDRINST usr/include/linux/netfilter/xt_AUDIT.h
  HDRINST usr/include/linux/netfilter/xt_realm.h
  HDRINST usr/include/linux/netfilter/nf_conntrack_common.h
  HDRINST usr/include/linux/netfilter/xt_set.h
  HDRINST usr/include/linux/netfilter/xt_LED.h
  HDRINST usr/include/linux/netfilter/xt_connlabel.h
  HDRINST usr/include/linux/netfilter/xt_owner.h
  HDRINST usr/include/linux/netfilter/xt_dccp.h
  HDRINST usr/include/linux/netfilter/xt_limit.h
  HDRINST usr/include/linux/netfilter/xt_conntrack.h
  HDRINST usr/include/linux/netfilter/xt_TEE.h
  HDRINST usr/include/linux/netfilter/xt_RATEEST.h
  HDRINST usr/include/linux/netfilter/xt_connlimit.h
  HDRINST usr/include/linux/netfilter/ipset/ip_set.h
  HDRINST usr/include/linux/netfilter/ipset/ip_set_list.h
  HDRINST usr/include/linux/netfilter/ipset/ip_set_hash.h
  HDRINST usr/include/linux/netfilter/ipset/ip_set_bitmap.h
  HDRINST usr/include/linux/netfilter/x_tables.h
  HDRINST usr/include/linux/netfilter/xt_dscp.h
  HDRINST usr/include/linux/netfilter/xt_cluster.h
  HDRINST usr/include/linux/netfilter/nf_conntrack_ftp.h
  HDRINST usr/include/linux/netfilter/nf_conntrack_tuple_common.h
  HDRINST usr/include/linux/netfilter/nf_log.h
  HDRINST usr/include/linux/netfilter/xt_tcpmss.h
  HDRINST usr/include/linux/netfilter/xt_NFLOG.h
  HDRINST usr/include/linux/netfilter/xt_l2tp.h
  HDRINST usr/include/linux/netfilter/xt_helper.h
  HDRINST usr/include/linux/netfilter/xt_statistic.h
  HDRINST usr/include/linux/netfilter/nfnetlink_queue.h
  HDRINST usr/include/linux/netfilter/nfnetlink_cttimeout.h
  HDRINST usr/include/linux/netfilter/xt_CT.h
  HDRINST usr/include/linux/netfilter/xt_CHECKSUM.h
  HDRINST usr/include/linux/netfilter/xt_connbytes.h
  HDRINST usr/include/linux/netfilter/xt_state.h
  HDRINST usr/include/linux/netfilter/nf_tables.h
  HDRINST usr/include/linux/netfilter/xt_mark.h
  HDRINST usr/include/linux/netfilter/xt_cpu.h
  HDRINST usr/include/linux/netfilter/nf_tables_compat.h
  HDRINST usr/include/linux/netfilter/xt_physdev.h
  HDRINST usr/include/linux/netfilter/nfnetlink_conntrack.h
  HDRINST usr/include/linux/netfilter/nfnetlink_acct.h
  HDRINST usr/include/linux/netfilter/xt_TCPMSS.h
  HDRINST usr/include/linux/tty_flags.h
  HDRINST usr/include/linux/if_phonet.h
  HDRINST usr/include/linux/elf-em.h
  HDRINST usr/include/linux/vm_sockets.h
  HDRINST usr/include/linux/dlmconstants.h
  HDRINST usr/include/linux/bsg.h
  HDRINST usr/include/linux/matroxfb.h
  HDRINST usr/include/linux/sysctl.h
  HDRINST usr/include/linux/unix_diag.h
  HDRINST usr/include/linux/pcitest.h
  HDRINST usr/include/linux/mman.h
  HDRINST usr/include/linux/if_plip.h
  HDRINST usr/include/linux/virtio_balloon.h
  HDRINST usr/include/linux/pidfd.h
  HDRINST usr/include/linux/f2fs.h
  HDRINST usr/include/linux/x25.h
  HDRINST usr/include/linux/if_cablemodem.h
  HDRINST usr/include/linux/utsname.h
  HDRINST usr/include/linux/counter.h
  HDRINST usr/include/linux/atm_tcp.h
  HDRINST usr/include/linux/atalk.h
  HDRINST usr/include/linux/virtio_rng.h
  HDRINST usr/include/linux/vboxguest.h
  HDRINST usr/include/linux/bpf_perf_event.h
  HDRINST usr/include/linux/ipmi_ssif_bmc.h
  HDRINST usr/include/linux/nfs_mount.h
  HDRINST usr/include/linux/sonet.h
  HDRINST usr/include/linux/netfilter.h
  HDRINST usr/include/linux/keyctl.h
  HDRINST usr/include/linux/nl80211.h
  HDRINST usr/include/linux/misc/bcm_vk.h
  HDRINST usr/include/linux/audit.h
  HDRINST usr/include/linux/tipc_config.h
  HDRINST usr/include/linux/tipc_sockets_diag.h
  HDRINST usr/include/linux/futex.h
  HDRINST usr/include/linux/sev-guest.h
  HDRINST usr/include/linux/ublk_cmd.h
  HDRINST usr/include/linux/types.h
  HDRINST usr/include/linux/virtio_input.h
  HDRINST usr/include/linux/if_slip.h
  HDRINST usr/include/linux/personality.h
  HDRINST usr/include/linux/openat2.h
  HDRINST usr/include/linux/poll.h
  HDRINST usr/include/linux/posix_acl.h
  HDRINST usr/include/linux/smc_diag.h
  HDRINST usr/include/linux/snmp.h
  HDRINST usr/include/linux/errqueue.h
  HDRINST usr/include/linux/if_tunnel.h
  HDRINST usr/include/linux/fanotify.h
  HDRINST usr/include/linux/kernel.h
  HDRINST usr/include/linux/rtnetlink.h
  HDRINST usr/include/linux/rpl.h
  HDRINST usr/include/linux/memfd.h
  HDRINST usr/include/linux/serial_core.h
  HDRINST usr/include/linux/dns_resolver.h
  HDRINST usr/include/linux/pr.h
  HDRINST usr/include/linux/atm_eni.h
  HDRINST usr/include/linux/lp.h
  HDRINST usr/include/linux/virtio_mem.h
  HDRINST usr/include/linux/ultrasound.h
  HDRINST usr/include/linux/sctp.h
  HDRINST usr/include/linux/uio.h
  HDRINST usr/include/linux/tcp_metrics.h
  HDRINST usr/include/linux/wwan.h
  HDRINST usr/include/linux/atmbr2684.h
  HDRINST usr/include/linux/in_route.h
  HDRINST usr/include/linux/qemu_fw_cfg.h
  HDRINST usr/include/linux/if_macsec.h
  HDRINST usr/include/linux/usb/charger.h
  HDRINST usr/include/linux/usb/g_uvc.h
  HDRINST usr/include/linux/usb/gadgetfs.h
  HDRINST usr/include/linux/usb/raw_gadget.h
  HDRINST usr/include/linux/usb/cdc-wdm.h
  HDRINST usr/include/linux/usb/g_printer.h
  HDRINST usr/include/linux/usb/midi.h
  HDRINST usr/include/linux/usb/tmc.h
  HDRINST usr/include/linux/usb/video.h
  HDRINST usr/include/linux/usb/functionfs.h
  HDRINST usr/include/linux/usb/audio.h
  HDRINST usr/include/linux/usb/ch11.h
  HDRINST usr/include/linux/usb/ch9.h
  HDRINST usr/include/linux/usb/cdc.h
  HDRINST usr/include/linux/jffs2.h
  HDRINST usr/include/linux/ax25.h
  HDRINST usr/include/linux/auto_fs.h
  HDRINST usr/include/linux/tiocl.h
  HDRINST usr/include/linux/scc.h
  HDRINST usr/include/linux/psci.h
  HDRINST usr/include/linux/swab.h
  HDRINST usr/include/linux/cec.h
  HDRINST usr/include/linux/kfd_ioctl.h
  HDRINST usr/include/linux/smc.h
  HDRINST usr/include/linux/qrtr.h
  HDRINST usr/include/linux/screen_info.h
  HDRINST usr/include/linux/nfsacl.h
  HDRINST usr/include/linux/seg6_hmac.h
  HDRINST usr/include/linux/gameport.h
  HDRINST usr/include/linux/wireless.h
  HDRINST usr/include/linux/fdreg.h
  HDRINST usr/include/linux/cciss_defs.h
  HDRINST usr/include/linux/serial_reg.h
  HDRINST usr/include/linux/perf_event.h
  HDRINST usr/include/linux/in6.h
  HDRINST usr/include/linux/hid.h
  HDRINST usr/include/linux/netlink.h
  HDRINST usr/include/linux/fuse.h
  HDRINST usr/include/linux/magic.h
  HDRINST usr/include/linux/ioam6_iptunnel.h
  HDRINST usr/include/linux/stm.h
  HDRINST usr/include/linux/vsockmon.h
  HDRINST usr/include/linux/seg6.h
  HDRINST usr/include/linux/idxd.h
  HDRINST usr/include/linux/nitro_enclaves.h
  HDRINST usr/include/linux/ptrace.h
  HDRINST usr/include/linux/ioam6_genl.h
  HDRINST usr/include/linux/qnx4_fs.h
  HDRINST usr/include/linux/fsl_mc.h
  HDRINST usr/include/linux/net_tstamp.h
  HDRINST usr/include/linux/msg.h
  HDRINST usr/include/linux/netfilter_ipv4/ipt_TTL.h
  HDRINST usr/include/linux/netfilter_ipv4/ipt_ttl.h
  HDRINST usr/include/linux/netfilter_ipv4/ipt_ah.h
  HDRINST usr/include/linux/netfilter_ipv4/ipt_ECN.h
  HDRINST usr/include/linux/netfilter_ipv4/ip_tables.h
  HDRINST usr/include/linux/netfilter_ipv4/ipt_ecn.h
  HDRINST usr/include/linux/netfilter_ipv4/ipt_CLUSTERIP.h
  HDRINST usr/include/linux/netfilter_ipv4/ipt_REJECT.h
  HDRINST usr/include/linux/netfilter_ipv4/ipt_LOG.h
  HDRINST usr/include/linux/sem.h
  HDRINST usr/include/linux/net_namespace.h
  HDRINST usr/include/linux/radeonfb.h
  HDRINST usr/include/linux/tee.h
  HDRINST usr/include/linux/udp.h
  HDRINST usr/include/linux/virtio_bt.h
  HDRINST usr/include/linux/v4l2-subdev.h
  HDRINST usr/include/linux/posix_acl_xattr.h
  HDRINST usr/include/linux/v4l2-mediabus.h
  HDRINST usr/include/linux/atmapi.h
  HDRINST usr/include/linux/raid/md_p.h
  HDRINST usr/include/linux/raid/md_u.h
  HDRINST usr/include/linux/zorro_ids.h
  HDRINST usr/include/linux/nbd.h
  HDRINST usr/include/linux/isst_if.h
  HDRINST usr/include/linux/rxrpc.h
  HDRINST usr/include/linux/unistd.h
  HDRINST usr/include/linux/if_arp.h
  HDRINST usr/include/linux/atm_zatm.h
  HDRINST usr/include/linux/io_uring.h
  HDRINST usr/include/linux/if_fddi.h
  HDRINST usr/include/linux/bpqether.h
  HDRINST usr/include/linux/sysinfo.h
  HDRINST usr/include/linux/auto_dev-ioctl.h
  HDRINST usr/include/linux/nfs4_mount.h
  HDRINST usr/include/linux/keyboard.h
  HDRINST usr/include/linux/virtio_mmio.h
  HDRINST usr/include/linux/input.h
  HDRINST usr/include/linux/qnxtypes.h
  HDRINST usr/include/linux/mdio.h
  HDRINST usr/include/linux/lwtunnel.h
  HDRINST usr/include/linux/gfs2_ondisk.h
  HDRINST usr/include/linux/nfs4.h
  HDRINST usr/include/linux/ptp_clock.h
  HDRINST usr/include/linux/nubus.h
  HDRINST usr/include/linux/if_bonding.h
  HDRINST usr/include/linux/kcov.h
  HDRINST usr/include/linux/fadvise.h
  HDRINST usr/include/linux/taskstats.h
  HDRINST usr/include/linux/veth.h
  HDRINST usr/include/linux/atm.h
  HDRINST usr/include/linux/ipmi.h
  HDRINST usr/include/linux/kdev_t.h
  HDRINST usr/include/linux/mount.h
  HDRINST usr/include/linux/shm.h
  HDRINST usr/include/linux/resource.h
  HDRINST usr/include/linux/prctl.h
  HDRINST usr/include/linux/watch_queue.h
  HDRINST usr/include/linux/sched.h
  HDRINST usr/include/linux/phonet.h
  HDRINST usr/include/linux/random.h
  HDRINST usr/include/linux/tty.h
  HDRINST usr/include/linux/apm_bios.h
  HDRINST usr/include/linux/fd.h
  HDRINST usr/include/linux/um_timetravel.h
  HDRINST usr/include/linux/tls.h
  HDRINST usr/include/linux/rpmsg_types.h
  HDRINST usr/include/linux/pfrut.h
  HDRINST usr/include/linux/mei.h
  HDRINST usr/include/linux/fsi.h
  HDRINST usr/include/linux/rds.h
  HDRINST usr/include/linux/if_x25.h
  HDRINST usr/include/linux/param.h
  HDRINST usr/include/linux/netdevice.h
  HDRINST usr/include/linux/binfmts.h
  HDRINST usr/include/linux/if_pppox.h
  HDRINST usr/include/linux/sockios.h
  HDRINST usr/include/linux/kcm.h
  HDRINST usr/include/linux/virtio_9p.h
  HDRINST usr/include/linux/genwqe/genwqe_card.h
  HDRINST usr/include/linux/if_tun.h
  HDRINST usr/include/linux/ext4.h
  HDRINST usr/include/linux/if_ether.h
  HDRINST usr/include/linux/kvm_para.h
  HDRINST usr/include/linux/kernel-page-flags.h
  HDRINST usr/include/linux/cdrom.h
  HDRINST usr/include/linux/un.h
  HDRINST usr/include/linux/module.h
  HDRINST usr/include/linux/mqueue.h
  HDRINST usr/include/linux/a.out.h
  HDRINST usr/include/linux/input-event-codes.h
  HDRINST usr/include/linux/coda.h
  HDRINST usr/include/linux/rio_mport_cdev.h
  HDRINST usr/include/linux/ipsec.h
  HDRINST usr/include/linux/blkpg.h
  HDRINST usr/include/linux/blkzoned.h
  HDRINST usr/include/linux/netfilter_bridge/ebt_arpreply.h
  HDRINST usr/include/linux/netfilter_bridge/ebt_redirect.h
  HDRINST usr/include/linux/netfilter_bridge/ebt_nflog.h
  HDRINST usr/include/linux/netfilter_bridge/ebt_802_3.h
  HDRINST usr/include/linux/netfilter_bridge/ebt_nat.h
  HDRINST usr/include/linux/netfilter_bridge/ebt_mark_m.h
  HDRINST usr/include/linux/netfilter_bridge/ebtables.h
  HDRINST usr/include/linux/netfilter_bridge/ebt_vlan.h
  HDRINST usr/include/linux/netfilter_bridge/ebt_limit.h
  HDRINST usr/include/linux/netfilter_bridge/ebt_log.h
  HDRINST usr/include/linux/netfilter_bridge/ebt_stp.h
  HDRINST usr/include/linux/netfilter_bridge/ebt_pkttype.h
  HDRINST usr/include/linux/netfilter_bridge/ebt_ip.h
  HDRINST usr/include/linux/netfilter_bridge/ebt_ip6.h
  HDRINST usr/include/linux/netfilter_bridge/ebt_arp.h
  HDRINST usr/include/linux/netfilter_bridge/ebt_mark_t.h
  HDRINST usr/include/linux/netfilter_bridge/ebt_among.h
  HDRINST usr/include/linux/reiserfs_fs.h
  HDRINST usr/include/linux/cciss_ioctl.h
  HDRINST usr/include/linux/fsmap.h
  HDRINST usr/include/linux/smiapp.h
  HDRINST usr/include/linux/switchtec_ioctl.h
  HDRINST usr/include/linux/atmdev.h
  HDRINST usr/include/linux/hpet.h
  HDRINST usr/include/linux/virtio_config.h
  HDRINST usr/include/linux/string.h
  HDRINST usr/include/linux/kfd_sysfs.h
  HDRINST usr/include/linux/inet_diag.h
  HDRINST usr/include/linux/netdev.h
  LD      /kernel/build64/tools/objtool/libsubcmd/libsubcmd-in.o
  HDRINST usr/include/linux/xattr.h
  HDRINST usr/include/linux/iommufd.h
  HDRINST usr/include/linux/user_events.h
  HDRINST usr/include/linux/errno.h
  HDRINST usr/include/linux/icmp.h
  HDRINST usr/include/linux/i2o-dev.h
  HDRINST usr/include/linux/pg.h
  HDRINST usr/include/linux/if_bridge.h
  HDRINST usr/include/linux/thermal.h
  HDRINST usr/include/linux/uinput.h
  HDRINST usr/include/linux/handshake.h
  HDRINST usr/include/linux/dqblk_xfs.h
  HDRINST usr/include/linux/v4l2-common.h
  HDRINST usr/include/linux/nvram.h
  HDRINST usr/include/linux/if_vlan.h
  HDRINST usr/include/linux/uhid.h
  HDRINST usr/include/linux/omap3isp.h
  HDRINST usr/include/linux/rose.h
  HDRINST usr/include/linux/phantom.h
  HDRINST usr/include/linux/ipmi_msgdefs.h
  HDRINST usr/include/linux/bcm933xx_hcs.h
  HDRINST usr/include/linux/bpf.h
  HDRINST usr/include/linux/mempolicy.h
  HDRINST usr/include/linux/efs_fs_sb.h
  HDRINST usr/include/linux/nexthop.h
  HDRINST usr/include/linux/net_dropmon.h
  HDRINST usr/include/linux/surface_aggregator/cdev.h
  HDRINST usr/include/linux/surface_aggregator/dtx.h
  HDRINST usr/include/linux/net.h
  AR      /kernel/build64/tools/objtool/libsubcmd/libsubcmd.a
  HDRINST usr/include/linux/mii.h
  HDRINST usr/include/linux/virtio_pcidev.h
  HDRINST usr/include/linux/termios.h
  HDRINST usr/include/linux/cgroupstats.h
  HDRINST usr/include/linux/mpls.h
  HDRINST usr/include/linux/iommu.h
  HDRINST usr/include/linux/toshiba.h
  HDRINST usr/include/linux/virtio_scsi.h
  HDRINST usr/include/linux/zorro.h
  HDRINST usr/include/linux/chio.h
  HDRINST usr/include/linux/pkt_sched.h
  HDRINST usr/include/linux/cramfs_fs.h
  HDRINST usr/include/linux/nfs3.h
  HDRINST usr/include/linux/vfio_ccw.h
  HDRINST usr/include/linux/atm_nicstar.h
  HDRINST usr/include/linux/ncsi.h
  HDRINST usr/include/linux/virtio_net.h
  HDRINST usr/include/linux/ioctl.h
  HDRINST usr/include/linux/stddef.h
  HDRINST usr/include/linux/limits.h
  HDRINST usr/include/linux/ipmi_bmc.h
  HDRINST usr/include/linux/netfilter_arp.h
  HDRINST usr/include/linux/if_addr.h
  HDRINST usr/include/linux/rpmsg.h
  HDRINST usr/include/linux/media-bus-format.h
  HDRINST usr/include/linux/kernelcapi.h
  HDRINST usr/include/linux/ppp_defs.h
  HDRINST usr/include/linux/ethtool.h
  HDRINST usr/include/linux/aspeed-video.h
  HDRINST usr/include/linux/hdlc.h
  HDRINST usr/include/linux/fscrypt.h
  HDRINST usr/include/linux/batadv_packet.h
  HDRINST usr/include/linux/uuid.h
  HDRINST usr/include/linux/capi.h
  HDRINST usr/include/linux/mptcp.h
  HDRINST usr/include/linux/hidraw.h
  HDRINST usr/include/linux/virtio_console.h
  HDRINST usr/include/linux/irqnr.h
  HDRINST usr/include/linux/coresight-stm.h
  HDRINST usr/include/linux/cxl_mem.h
  HDRINST usr/include/linux/iso_fs.h
  HDRINST usr/include/linux/virtio_blk.h
  HDRINST usr/include/linux/udf_fs_i.h
  HDRINST usr/include/linux/coff.h
  HDRINST usr/include/linux/dma-buf.h
  HDRINST usr/include/linux/ife.h
  HDRINST usr/include/linux/agpgart.h
  HDRINST usr/include/linux/socket.h
  HDRINST usr/include/linux/nilfs2_ondisk.h
  HDRINST usr/include/linux/connector.h
  HDRINST usr/include/linux/auto_fs4.h
  HDRINST usr/include/linux/bt-bmc.h
  HDRINST usr/include/linux/map_to_7segment.h
  HDRINST usr/include/linux/tc_act/tc_skbedit.h
  HDRINST usr/include/linux/tc_act/tc_ctinfo.h
  HDRINST usr/include/linux/tc_act/tc_defact.h
  HDRINST usr/include/linux/tc_act/tc_gact.h
  HDRINST usr/include/linux/tc_act/tc_vlan.h
  HDRINST usr/include/linux/tc_act/tc_skbmod.h
  HDRINST usr/include/linux/tc_act/tc_sample.h
  HDRINST usr/include/linux/tc_act/tc_tunnel_key.h
  HDRINST usr/include/linux/tc_act/tc_gate.h
  HDRINST usr/include/linux/tc_act/tc_mirred.h
  HDRINST usr/include/linux/tc_act/tc_nat.h
  HDRINST usr/include/linux/tc_act/tc_csum.h
  HDRINST usr/include/linux/tc_act/tc_connmark.h
  HDRINST usr/include/linux/tc_act/tc_ife.h
  HDRINST usr/include/linux/tc_act/tc_mpls.h
  HDRINST usr/include/linux/tc_act/tc_ct.h
  HDRINST usr/include/linux/tc_act/tc_pedit.h
  HDRINST usr/include/linux/tc_act/tc_bpf.h
  CC      /kernel/build64/tools/objtool/weak.o
  HDRINST usr/include/linux/tc_act/tc_ipt.h
  HDRINST usr/include/linux/netrom.h
  HDRINST usr/include/linux/joystick.h
  CC      /kernel/build64/tools/objtool/check.o
  HDRINST usr/include/linux/falloc.h
  CC      /kernel/build64/tools/objtool/special.o
  HDRINST usr/include/linux/cycx_cfm.h
  HDRINST usr/include/linux/omapfb.h
  CC      /kernel/build64/tools/objtool/builtin-check.o
  HDRINST usr/include/linux/msdos_fs.h
  HDRINST usr/include/linux/virtio_types.h
  CC      /kernel/build64/tools/objtool/elf.o
  HDRINST usr/include/linux/mroute.h
  MKDIR   /kernel/build64/tools/objtool/arch/x86/
  HDRINST usr/include/linux/psample.h
  CC      /kernel/build64/tools/objtool/objtool.o
  HDRINST usr/include/linux/ipv6.h
  HDRINST usr/include/linux/dw100.h
  CC      /kernel/build64/tools/objtool/orc_gen.o
  HDRINST usr/include/linux/psp-sev.h
  HDRINST usr/include/linux/vfio.h
  MKDIR   /kernel/build64/tools/objtool/arch/x86/lib/
  CC      /kernel/build64/tools/objtool/orc_dump.o
  CC      /kernel/build64/tools/objtool/arch/x86/special.o
  CC      /kernel/build64/tools/objtool/libstring.o
  HDRINST usr/include/linux/if_ppp.h
  CC      /kernel/build64/tools/objtool/libctype.o
  HDRINST usr/include/linux/byteorder/big_endian.h
  GEN     /kernel/build64/tools/objtool/arch/x86/lib/inat-tables.c
  CC      /kernel/build64/tools/objtool/str_error_r.o
  CC      /kernel/build64/tools/objtool/librbtree.o
  HDRINST usr/include/linux/byteorder/little_endian.h
  HDRINST usr/include/linux/comedi.h
  HDRINST usr/include/linux/scif_ioctl.h
  HDRINST usr/include/linux/timerfd.h
  HDRINST usr/include/linux/time_types.h
  HDRINST usr/include/linux/firewire-constants.h
  HDRINST usr/include/linux/virtio_snd.h
  HDRINST usr/include/linux/ppp-ioctl.h
  HDRINST usr/include/linux/fib_rules.h
  HDRINST usr/include/linux/gen_stats.h
  HDRINST usr/include/linux/virtio_iommu.h
  HDRINST usr/include/linux/genetlink.h
  HDRINST usr/include/linux/uvcvideo.h
  HDRINST usr/include/linux/pfkeyv2.h
  HDRINST usr/include/linux/soundcard.h
  HDRINST usr/include/linux/times.h
  HDRINST usr/include/linux/nfc.h
  HDRINST usr/include/linux/affs_hardblocks.h
  HDRINST usr/include/linux/nilfs2_api.h
  HDRINST usr/include/linux/rseq.h
  HDRINST usr/include/linux/caif/caif_socket.h
  HDRINST usr/include/linux/caif/if_caif.h
  HDRINST usr/include/linux/i2c-dev.h
  HDRINST usr/include/linux/cuda.h
  HDRINST usr/include/linux/mei_uuid.h
  HDRINST usr/include/linux/cn_proc.h
  HDRINST usr/include/linux/parport.h
  HDRINST usr/include/linux/v4l2-controls.h
  HDRINST usr/include/linux/hsi/cs-protocol.h
  HDRINST usr/include/linux/hsi/hsi_char.h
  HDRINST usr/include/linux/seg6_genl.h
  HDRINST usr/include/linux/am437x-vpfe.h
  HDRINST usr/include/linux/amt.h
  HDRINST usr/include/linux/netconf.h
  HDRINST usr/include/linux/erspan.h
  HDRINST usr/include/linux/nsfs.h
  HDRINST usr/include/linux/xilinx-v4l2-controls.h
  HDRINST usr/include/linux/aspeed-p2a-ctrl.h
  HDRINST usr/include/linux/vfio_zdev.h
  HDRINST usr/include/linux/serio.h
  HDRINST usr/include/linux/acrn.h
  HDRINST usr/include/linux/nfs2.h
  HDRINST usr/include/linux/virtio_pci.h
  HDRINST usr/include/linux/ipc.h
  HDRINST usr/include/linux/ethtool_netlink.h
  HDRINST usr/include/linux/kd.h
  HDRINST usr/include/linux/elf.h
  HDRINST usr/include/linux/videodev2.h
  HDRINST usr/include/linux/if_alg.h
  HDRINST usr/include/linux/sonypi.h
  HDRINST usr/include/linux/fsverity.h
  HDRINST usr/include/linux/if.h
  HDRINST usr/include/linux/btrfs.h
  HDRINST usr/include/linux/vm_sockets_diag.h
  HDRINST usr/include/linux/netfilter_bridge.h
  HDRINST usr/include/linux/packet_diag.h
  HDRINST usr/include/linux/netfilter_ipv4.h
  HDRINST usr/include/linux/kvm.h
  HDRINST usr/include/linux/pci.h
  HDRINST usr/include/linux/if_addrlabel.h
  HDRINST usr/include/linux/hdlcdrv.h
  HDRINST usr/include/linux/cfm_bridge.h
  HDRINST usr/include/linux/fiemap.h
  HDRINST usr/include/linux/dm-ioctl.h
  HDRINST usr/include/linux/aspeed-lpc-ctrl.h
  HDRINST usr/include/linux/atmioc.h
  HDRINST usr/include/linux/dlm.h
  HDRINST usr/include/linux/pci_regs.h
  HDRINST usr/include/linux/cachefiles.h
  HDRINST usr/include/linux/membarrier.h
  HDRINST usr/include/linux/nfs_idmap.h
  HDRINST usr/include/linux/ip.h
  HDRINST usr/include/linux/atm_he.h
  HDRINST usr/include/linux/nfsd/export.h
  HDRINST usr/include/linux/nfsd/stats.h
  HDRINST usr/include/linux/nfsd/debug.h
  HDRINST usr/include/linux/nfsd/cld.h
  HDRINST usr/include/linux/ip_vs.h
  HDRINST usr/include/linux/vmcore.h
  HDRINST usr/include/linux/vbox_vmmdev_types.h
  HDRINST usr/include/linux/dvb/osd.h
  CC      /kernel/build64/tools/objtool/arch/x86/decode.o
  HDRINST usr/include/linux/dvb/dmx.h
  HDRINST usr/include/linux/dvb/net.h
  HDRINST usr/include/linux/dvb/frontend.h
  HDRINST usr/include/linux/dvb/ca.h
  HDRINST usr/include/linux/dvb/version.h
  HDRINST usr/include/linux/dvb/video.h
  HDRINST usr/include/linux/dvb/audio.h
  HDRINST usr/include/linux/nfs.h
  HDRINST usr/include/linux/if_link.h
  HDRINST usr/include/linux/wait.h
  HDRINST usr/include/linux/icmpv6.h
  HDRINST usr/include/linux/media.h
  HDRINST usr/include/linux/seg6_local.h
  HDRINST usr/include/linux/openvswitch.h
  HDRINST usr/include/linux/atmsap.h
  HDRINST usr/include/linux/bpfilter.h
  HDRINST usr/include/linux/fpga-dfl.h
  HDRINST usr/include/linux/userio.h
  HDRINST usr/include/linux/signal.h
  HDRINST usr/include/linux/map_to_14segment.h
  HDRINST usr/include/linux/hdreg.h
  HDRINST usr/include/linux/utime.h
  HDRINST usr/include/linux/usbdevice_fs.h
  HDRINST usr/include/linux/timex.h
  HDRINST usr/include/linux/if_fc.h
  HDRINST usr/include/linux/reiserfs_xattr.h
  HDRINST usr/include/linux/hw_breakpoint.h
  HDRINST usr/include/linux/quota.h
  HDRINST usr/include/linux/ioprio.h
  HDRINST usr/include/linux/eventpoll.h
  HDRINST usr/include/linux/atmclip.h
  HDRINST usr/include/linux/can.h
  HDRINST usr/include/linux/if_team.h
  HDRINST usr/include/linux/usbip.h
  HDRINST usr/include/linux/stat.h
  HDRINST usr/include/linux/fou.h
  HDRINST usr/include/linux/hash_info.h
  HDRINST usr/include/linux/ppp-comp.h
  HDRINST usr/include/linux/ip6_tunnel.h
  HDRINST usr/include/linux/tipc_netlink.h
  HDRINST usr/include/linux/in.h
  HDRINST usr/include/linux/wireguard.h
  HDRINST usr/include/linux/btf.h
  HDRINST usr/include/linux/batman_adv.h
  HDRINST usr/include/linux/fcntl.h
  HDRINST usr/include/linux/if_ltalk.h
  HDRINST usr/include/linux/i2c.h
  HDRINST usr/include/linux/atm_idt77105.h
  HDRINST usr/include/linux/kexec.h
  HDRINST usr/include/linux/arm_sdei.h
  HDRINST usr/include/linux/netfilter_ipv6/ip6_tables.h
  HDRINST usr/include/linux/netfilter_ipv6/ip6t_ah.h
  HDRINST usr/include/linux/netfilter_ipv6/ip6t_NPT.h
  HDRINST usr/include/linux/netfilter_ipv6/ip6t_rt.h
  HDRINST usr/include/linux/netfilter_ipv6/ip6t_REJECT.h
  HDRINST usr/include/linux/netfilter_ipv6/ip6t_opts.h
  HDRINST usr/include/linux/netfilter_ipv6/ip6t_srh.h
  HDRINST usr/include/linux/netfilter_ipv6/ip6t_LOG.h
  HDRINST usr/include/linux/netfilter_ipv6/ip6t_mh.h
  HDRINST usr/include/linux/netfilter_ipv6/ip6t_HL.h
  HDRINST usr/include/linux/netfilter_ipv6/ip6t_hl.h
  HDRINST usr/include/linux/netfilter_ipv6/ip6t_frag.h
  HDRINST usr/include/linux/netfilter_ipv6/ip6t_ipv6header.h
  HDRINST usr/include/linux/minix_fs.h
  HDRINST usr/include/linux/aio_abi.h
  HDRINST usr/include/linux/pktcdvd.h
  HDRINST usr/include/linux/libc-compat.h
  HDRINST usr/include/linux/atmlec.h
  HDRINST usr/include/linux/signalfd.h
  HDRINST usr/include/linux/bpf_common.h
  HDRINST usr/include/linux/seg6_iptunnel.h
  HDRINST usr/include/linux/synclink.h
  HDRINST usr/include/linux/mpls_iptunnel.h
  HDRINST usr/include/linux/mctp.h
  HDRINST usr/include/linux/if_xdp.h
  HDRINST usr/include/linux/llc.h
  HDRINST usr/include/linux/atmsvc.h
  HDRINST usr/include/linux/sed-opal.h
  HDRINST usr/include/linux/sock_diag.h
  HDRINST usr/include/linux/time.h
  HDRINST usr/include/linux/securebits.h
  HDRINST usr/include/linux/fsl_hypervisor.h
  HDRINST usr/include/linux/if_hippi.h
  HDRINST usr/include/linux/seccomp.h
  HDRINST usr/include/linux/oom.h
  HDRINST usr/include/linux/filter.h
  HDRINST usr/include/linux/inotify.h
  HDRINST usr/include/linux/rfkill.h
  HDRINST usr/include/linux/reboot.h
  HDRINST usr/include/linux/can/vxcan.h
  HDRINST usr/include/linux/can/j1939.h
  HDRINST usr/include/linux/can/netlink.h
  HDRINST usr/include/linux/can/bcm.h
  HDRINST usr/include/linux/can/raw.h
  HDRINST usr/include/linux/can/gw.h
  HDRINST usr/include/linux/can/error.h
  HDRINST usr/include/linux/can/isotp.h
  HDRINST usr/include/linux/if_eql.h
  HDRINST usr/include/linux/hiddev.h
  HDRINST usr/include/linux/blktrace_api.h
  HDRINST usr/include/linux/ccs.h
  HDRINST usr/include/linux/ioam6.h
  HDRINST usr/include/linux/hsr_netlink.h
  HDRINST usr/include/linux/mmc/ioctl.h
  HDRINST usr/include/linux/bfs_fs.h
  HDRINST usr/include/linux/rio_cm_cdev.h
  HDRINST usr/include/linux/uleds.h
  HDRINST usr/include/linux/mrp_bridge.h
  HDRINST usr/include/linux/adb.h
  HDRINST usr/include/linux/pmu.h
  HDRINST usr/include/linux/udmabuf.h
  HDRINST usr/include/linux/kcmp.h
  HDRINST usr/include/linux/dma-heap.h
  HDRINST usr/include/linux/userfaultfd.h
  HDRINST usr/include/linux/netfilter_arp/arpt_mangle.h
  HDRINST usr/include/linux/netfilter_arp/arp_tables.h
  HDRINST usr/include/linux/tipc.h
  HDRINST usr/include/linux/virtio_ids.h
  HDRINST usr/include/linux/l2tp.h
  HDRINST usr/include/linux/devlink.h
  HDRINST usr/include/linux/virtio_gpio.h
  HDRINST usr/include/linux/dcbnl.h
  HDRINST usr/include/linux/cyclades.h
  HDRINST usr/include/sound/intel/avs/tokens.h
  HDRINST usr/include/sound/sof/fw.h
  HDRINST usr/include/sound/sof/abi.h
  HDRINST usr/include/sound/sof/tokens.h
  HDRINST usr/include/sound/sof/header.h
  HDRINST usr/include/sound/usb_stream.h
  HDRINST usr/include/sound/sfnt_info.h
  HDRINST usr/include/sound/asequencer.h
  HDRINST usr/include/sound/tlv.h
  HDRINST usr/include/sound/asound.h
  HDRINST usr/include/sound/asoc.h
  HDRINST usr/include/sound/sb16_csp.h
  HDRINST usr/include/sound/compress_offload.h
  HDRINST usr/include/sound/hdsp.h
  HDRINST usr/include/sound/emu10k1.h
  HDRINST usr/include/sound/snd_ar_tokens.h
  HDRINST usr/include/sound/snd_sst_tokens.h
  HDRINST usr/include/sound/asound_fm.h
  HDRINST usr/include/sound/hdspm.h
  HDRINST usr/include/sound/compress_params.h
  HDRINST usr/include/sound/firewire.h
  HDRINST usr/include/sound/skl-tplg-interface.h
  HDRINST usr/include/scsi/scsi_bsg_ufs.h
  HDRINST usr/include/scsi/scsi_netlink_fc.h
  HDRINST usr/include/scsi/scsi_bsg_mpi3mr.h
  HDRINST usr/include/scsi/fc/fc_ns.h
  HDRINST usr/include/scsi/fc/fc_fs.h
  HDRINST usr/include/scsi/fc/fc_els.h
  HDRINST usr/include/scsi/fc/fc_gs.h
  HDRINST usr/include/scsi/scsi_bsg_fc.h
  HDRINST usr/include/scsi/cxlflash_ioctl.h
  HDRINST usr/include/scsi/scsi_netlink.h
  HDRINST usr/include/linux/version.h
  HDRINST usr/include/asm/processor-flags.h
  HDRINST usr/include/asm/auxvec.h
  HDRINST usr/include/asm/svm.h
  HDRINST usr/include/asm/bitsperlong.h
  HDRINST usr/include/asm/kvm_perf.h
  HDRINST usr/include/asm/mce.h
  HDRINST usr/include/asm/posix_types.h
  HDRINST usr/include/asm/msr.h
  HDRINST usr/include/asm/sigcontext32.h
  HDRINST usr/include/asm/mman.h
  HDRINST usr/include/asm/shmbuf.h
  HDRINST usr/include/asm/e820.h
  HDRINST usr/include/asm/posix_types_64.h
  HDRINST usr/include/asm/vsyscall.h
  HDRINST usr/include/asm/msgbuf.h
  HDRINST usr/include/asm/swab.h
  HDRINST usr/include/asm/statfs.h
  HDRINST usr/include/asm/posix_types_x32.h
  HDRINST usr/include/asm/ptrace.h
  HDRINST usr/include/asm/unistd.h
  HDRINST usr/include/asm/ist.h
  HDRINST usr/include/asm/prctl.h
  HDRINST usr/include/asm/boot.h
  HDRINST usr/include/asm/sigcontext.h
  HDRINST usr/include/asm/posix_types_32.h
  HDRINST usr/include/asm/kvm_para.h
  HDRINST usr/include/asm/a.out.h
  HDRINST usr/include/asm/mtrr.h
  HDRINST usr/include/asm/amd_hsmp.h
  HDRINST usr/include/asm/ptrace-abi.h
  HDRINST usr/include/asm/hwcap2.h
  HDRINST usr/include/asm/vm86.h
  HDRINST usr/include/asm/vmx.h
  HDRINST usr/include/asm/ldt.h
  HDRINST usr/include/asm/perf_regs.h
  HDRINST usr/include/asm/kvm.h
  HDRINST usr/include/asm/debugreg.h
  HDRINST usr/include/asm/signal.h
  HDRINST usr/include/asm/bootparam.h
  HDRINST usr/include/asm/siginfo.h
  HDRINST usr/include/asm/hw_breakpoint.h
  HDRINST usr/include/asm/stat.h
  HDRINST usr/include/asm/setup.h
  HDRINST usr/include/asm/sembuf.h
  HDRINST usr/include/asm/sgx.h
  HDRINST usr/include/asm/ucontext.h
  HDRINST usr/include/asm/byteorder.h
  HDRINST usr/include/asm/unistd_64.h
  HDRINST usr/include/asm/ioctls.h
  HDRINST usr/include/asm/bpf_perf_event.h
  HDRINST usr/include/asm/types.h
  HDRINST usr/include/asm/poll.h
  HDRINST usr/include/asm/resource.h
  HDRINST usr/include/asm/param.h
  HDRINST usr/include/asm/sockios.h
  HDRINST usr/include/asm/errno.h
  HDRINST usr/include/asm/unistd_x32.h
  HDRINST usr/include/asm/termios.h
  HDRINST usr/include/asm/ioctl.h
  HDRINST usr/include/asm/socket.h
  HDRINST usr/include/asm/unistd_32.h
  HDRINST usr/include/asm/termbits.h
  HDRINST usr/include/asm/fcntl.h
  HDRINST usr/include/asm/ipcbuf.h
  HOSTLD  scripts/mod/modpost
  CC      kernel/bounds.s
  CHKSHA1 ../include/linux/atomic/atomic-arch-fallback.h
  CHKSHA1 ../include/linux/atomic/atomic-instrumented.h
  CHKSHA1 ../include/linux/atomic/atomic-long.h
  UPD     include/generated/timeconst.h
  LD      /kernel/build64/tools/objtool/arch/x86/objtool-in.o
  UPD     include/generated/bounds.h
  CC      arch/x86/kernel/asm-offsets.s
  UPD     include/generated/asm-offsets.h
  CALL    ../scripts/checksyscalls.sh
  LD      /kernel/build64/tools/objtool/objtool-in.o
  LINK    /kernel/build64/tools/objtool/objtool
  LDS     scripts/module.lds
  CC      ipc/compat.o
  CC      ipc/util.o
  CC      ipc/msgutil.o
  HOSTCC  usr/gen_init_cpio
  CC      ipc/msg.o
  AR      certs/built-in.a
  CC      ipc/sem.o
  CC      ipc/shm.o
  CC      init/main.o
  CC      ipc/syscall.o
  CC      io_uring/io_uring.o
  CC      ipc/ipc_sysctl.o
  CC      ipc/mqueue.o
  AS      arch/x86/lib/clear_page_64.o
  CC      io_uring/xattr.o
  AR      arch/x86/video/built-in.a
  CC      ipc/namespace.o
  CC      block/bdev.o
  CC      arch/x86/pci/i386.o
  CC      init/do_mounts.o
  CC      arch/x86/power/cpu.o
  UPD     init/utsversion-tmp.h
  CC      arch/x86/realmode/init.o
  AR      arch/x86/ia32/built-in.a
  AR      arch/x86/net/built-in.a
  AR      virt/lib/built-in.a
  AS      arch/x86/crypto/aesni-intel_asm.o
  CC [M]  arch/x86/video/fbdev.o
  AR      sound/arm/built-in.a
  AR      sound/ppc/built-in.a
  CC      security/keys/gc.o
  CC [M]  virt/lib/irqbypass.o
  AR      drivers/irqchip/built-in.a
  CC      sound/core/sound.o
  CC      block/partitions/core.o
  CC      sound/core/seq/seq.o
  AR      arch/x86/platform/atom/built-in.a
  AR      sound/isa/ad1816a/built-in.a
  CC      net/core/sock.o
  CC      sound/core/init.o
  AR      arch/x86/platform/ce4100/built-in.a
  CC [M]  arch/x86/kvm/../../../virt/kvm/kvm_main.o
  AR      sound/i2c/other/built-in.a
  CC      arch/x86/mm/pat/set_memory.o
  CC      arch/x86/mm/init.o
  AR      sound/pci/ac97/built-in.a
  CC      arch/x86/events/amd/core.o
  CC      sound/core/memory.o
  CC      fs/notify/dnotify/dnotify.o
  CC      arch/x86/kernel/fpu/init.o
  AR      sound/drivers/opl3/built-in.a
  AR      drivers/bus/mhi/built-in.a
  CC      arch/x86/platform/efi/memmap.o
  AR      sound/i2c/built-in.a
  AR      sound/isa/ad1848/built-in.a
  CC      arch/x86/lib/cmdline.o
  AR      sound/pci/ali5451/built-in.a
  AR      drivers/bus/built-in.a
  CC      arch/x86/entry/vdso/vma.o
  AR      sound/drivers/opl4/built-in.a
  CC      arch/x86/kernel/cpu/mce/core.o
  CC      lib/kunit/test.o
  AR      sound/pci/asihpi/built-in.a
  AR      sound/isa/cs423x/built-in.a
  AR      sound/drivers/mpu401/built-in.a
  CC      mm/kasan/common.o
  AR      sound/drivers/vx/built-in.a
  AR      sound/pci/au88x0/built-in.a
  CC      block/partitions/ldm.o
  CC      kernel/sched/core.o
  AR      drivers/phy/allwinner/built-in.a
  CC      arch/x86/crypto/aesni-intel_glue.o
  AR      sound/drivers/pcsp/built-in.a
  AR      sound/isa/es1688/built-in.a
  AR      sound/drivers/built-in.a
  AR      sound/pci/aw2/built-in.a
  CC      crypto/api.o
  AR      drivers/phy/amlogic/built-in.a
  AR      sound/isa/galaxy/built-in.a
  AR      sound/pci/ctxfi/built-in.a
  AR      drivers/phy/broadcom/built-in.a
  CC      arch/x86/kernel/fpu/bugs.o
  AR      sound/isa/gus/built-in.a
  AR      drivers/phy/cadence/built-in.a
  AR      sound/pci/ca0106/built-in.a
  AR      sound/isa/msnd/built-in.a
  AR      drivers/phy/freescale/built-in.a
  AR      sound/pci/cs46xx/built-in.a
  AR      drivers/phy/hisilicon/built-in.a
  AR      sound/isa/opti9xx/built-in.a
  AR      sound/pci/cs5535audio/built-in.a
  AR      drivers/phy/ingenic/built-in.a
  AR      sound/isa/sb/built-in.a
  AR      sound/pci/lola/built-in.a
  AR      sound/isa/wavefront/built-in.a
  AR      drivers/phy/intel/built-in.a
  AS      arch/x86/lib/cmpxchg16b_emu.o
  AR      sound/isa/wss/built-in.a
  AR      sound/pci/lx6464es/built-in.a
  AR      sound/isa/built-in.a
  AR      drivers/phy/lantiq/built-in.a
  AR      sound/pci/echoaudio/built-in.a
  AR      drivers/phy/marvell/built-in.a
  CC      arch/x86/lib/copy_mc.o
  CC [M]  arch/x86/kvm/../../../virt/kvm/eventfd.o
  AR      sound/pci/emu10k1/built-in.a
  AR      drivers/phy/mediatek/built-in.a
  AR      sound/pci/hda/built-in.a
  AR      drivers/phy/microchip/built-in.a
  CC [M]  sound/pci/hda/hda_bind.o
  AR      drivers/phy/motorola/built-in.a
  AR      drivers/phy/mscc/built-in.a
  AR      drivers/phy/qualcomm/built-in.a
  AR      drivers/phy/ralink/built-in.a
  AR      drivers/phy/renesas/built-in.a
  CC [M]  sound/pci/hda/hda_codec.o
  AR      drivers/phy/rockchip/built-in.a
  GEN     usr/initramfs_data.cpio
  COPY    usr/initramfs_inc_data
  AS      usr/initramfs_data.o
  AR      drivers/phy/samsung/built-in.a
  AR      drivers/phy/socionext/built-in.a
  AR      drivers/phy/st/built-in.a
  AR      usr/built-in.a
  CC      crypto/cipher.o
  AR      drivers/phy/sunplus/built-in.a
  AR      drivers/phy/tegra/built-in.a
  AR      drivers/phy/ti/built-in.a
  CC      arch/x86/kernel/fpu/core.o
  AR      drivers/phy/xilinx/built-in.a
  CC      drivers/phy/phy-core.o
  CC      mm/filemap.o
  AR      virt/built-in.a
  CC [M]  sound/pci/hda/hda_jack.o
  AS      arch/x86/lib/copy_mc_64.o
  CC      sound/core/seq/seq_lock.o
  CC      arch/x86/kernel/cpu/mce/severity.o
  AS      arch/x86/lib/copy_page_64.o
  CC      ipc/mq_sysctl.o
  AS      arch/x86/realmode/rm/header.o
  AS      arch/x86/lib/copy_user_64.o
  AS      arch/x86/realmode/rm/trampoline_64.o
  AS      arch/x86/realmode/rm/stack.o
  AS      arch/x86/lib/copy_user_uncached_64.o
  CC      arch/x86/kernel/cpu/mtrr/mtrr.o
  CC      arch/x86/kernel/cpu/cacheinfo.o
  AS      arch/x86/realmode/rm/reboot.o
  CC      arch/x86/kernel/cpu/scattered.o
  CC      arch/x86/lib/cpu.o
  CC      security/keys/key.o
  AS      arch/x86/realmode/rm/wakeup_asm.o
  CC      block/fops.o
  AR      fs/notify/dnotify/built-in.a
  CC      fs/notify/inotify/inotify_fsnotify.o
  CC      arch/x86/realmode/rm/wakemain.o
  CC      arch/x86/pci/init.o
  CC      arch/x86/platform/efi/quirks.o
  CC      fs/notify/inotify/inotify_user.o
  CC      crypto/compress.o
  CC      arch/x86/realmode/rm/video-mode.o
  CC      lib/kunit/resource.o
  CC      mm/mempool.o
  CC      arch/x86/platform/efi/efi.o
  CC      arch/x86/entry/vdso/extable.o
  CC      arch/x86/power/hibernate_64.o
  CC      arch/x86/entry/vdso/vdso32-setup.o
  CC      mm/kasan/report.o
  AS      arch/x86/realmode/rm/copy.o
  CC      sound/core/seq/seq_clientmgr.o
  AS      arch/x86/realmode/rm/bioscall.o
  CC      arch/x86/realmode/rm/regs.o
  CC      sound/core/seq/seq_memory.o
  CC      sound/core/seq/seq_queue.o
  CC      arch/x86/lib/delay.o
  CC      sound/core/seq/seq_fifo.o
  CC      arch/x86/realmode/rm/video-vga.o
  LDS     arch/x86/entry/vdso/vdso.lds
  CC      arch/x86/kernel/cpu/topology.o
  CC      block/bio.o
  AS      arch/x86/entry/vdso/vdso-note.o
  CC      arch/x86/events/amd/lbr.o
  CC      lib/math/div64.o
  CC      arch/x86/realmode/rm/video-vesa.o
  CC      lib/math/gcd.o
  AS      arch/x86/crypto/aesni-intel_avx-x86_64.o
  AS      arch/x86/crypto/aes_ctrby8_avx-x86_64.o
  CC      arch/x86/entry/vdso/vclock_gettime.o
  CC      lib/math/lcm.o
  CC      arch/x86/realmode/rm/video-bios.o
  CC      crypto/algapi.o
  CC      lib/math/int_pow.o
  CC      block/partitions/msdos.o
  AR      sound/sh/built-in.a
  CC      sound/core/seq/seq_prioq.o
  CC      lib/kunit/static_stub.o
  CC      sound/core/seq/seq_timer.o
  CC      lib/kunit/string-stream.o
  CC      lib/math/int_sqrt.o
  CC      lib/math/reciprocal_div.o
  PASYMS  arch/x86/realmode/rm/pasyms.h
  LDS     arch/x86/realmode/rm/realmode.lds
  CC      crypto/scatterwalk.o
  LD      arch/x86/realmode/rm/realmode.elf
  AS      arch/x86/lib/getuser.o
  RELOCS  arch/x86/realmode/rm/realmode.relocs
  OBJCOPY arch/x86/realmode/rm/realmode.bin
  AS      arch/x86/realmode/rmpiggy.o
  GEN     arch/x86/lib/inat-tables.c
  CC      arch/x86/pci/mmconfig_64.o
  CC      arch/x86/kernel/cpu/common.o
  AR      arch/x86/realmode/built-in.a
  CC      crypto/proc.o
  CC      lib/math/rational.o
  CC      arch/x86/lib/insn-eval.o
  AR      drivers/phy/built-in.a
  AS [M]  arch/x86/crypto/ghash-clmulni-intel_asm.o
  CC      arch/x86/kernel/cpu/mtrr/if.o
  AR      drivers/pinctrl/actions/built-in.a
  AR      drivers/pinctrl/bcm/built-in.a
  CC [M]  arch/x86/crypto/ghash-clmulni-intel_glue.o
  AR      drivers/pinctrl/cirrus/built-in.a
  CC      init/do_mounts_initrd.o
  AR      drivers/pinctrl/freescale/built-in.a
  CC      security/keys/keyring.o
  AR      drivers/pinctrl/mediatek/built-in.a
  CC      drivers/pinctrl/intel/pinctrl-baytrail.o
  CC      arch/x86/platform/efi/efi_64.o
  CC      sound/core/seq/seq_system.o
  AR      drivers/pinctrl/mvebu/built-in.a
  CC      kernel/sched/fair.o
  CC      mm/oom_kill.o
  AS      arch/x86/power/hibernate_asm_64.o
  CC      arch/x86/power/hibernate.o
  CC      arch/x86/mm/pat/memtype.o
  CC      drivers/pinctrl/intel/pinctrl-intel.o
  CC      arch/x86/pci/direct.o
  AR      sound/synth/emux/built-in.a
  CC      arch/x86/pci/mmconfig-shared.o
  AR      sound/synth/built-in.a
  CC      sound/core/seq/seq_ports.o
  CC      mm/fadvise.o
  CC      mm/kasan/init.o
  CC      mm/maccess.o
  CC      arch/x86/entry/vdso/vgetcpu.o
  CC      arch/x86/kernel/fpu/regset.o
  CC      arch/x86/kernel/cpu/mce/genpool.o
  CC [M]  sound/pci/hda/hda_auto_parser.o
  CC [M]  lib/math/prime_numbers.o
  CC      lib/kunit/assert.o
  CC      block/elevator.o
  HOSTCC  arch/x86/entry/vdso/vdso2c
  CC      sound/core/seq/seq_info.o
  AS      arch/x86/platform/efi/efi_stub_64.o
  AR      fs/notify/inotify/built-in.a
  CC      fs/notify/fanotify/fanotify.o
  CC [M]  drivers/pinctrl/intel/pinctrl-cherryview.o
  CC [M]  drivers/pinctrl/intel/pinctrl-broxton.o
  CC      arch/x86/events/amd/ibs.o
  CC      fs/notify/fanotify/fanotify_user.o
  CC      fs/nfs_common/grace.o
  CC      mm/kasan/generic.o
  CC      crypto/aead.o
  AS [M]  arch/x86/crypto/crc32-pclmul_asm.o
  CC [M]  arch/x86/crypto/crc32-pclmul_glue.o
  CC      arch/x86/pci/fixup.o
  CC      block/partitions/efi.o
  CC      arch/x86/kernel/cpu/mtrr/generic.o
  CC      mm/kasan/report_generic.o
  CC      init/initramfs.o
  AR      ipc/built-in.a
  LDS     arch/x86/entry/vdso/vdso32/vdso32.lds
  CC      arch/x86/kernel/cpu/mtrr/cleanup.o
  AS      arch/x86/entry/vdso/vdso32/note.o
  AS      arch/x86/entry/vdso/vdso32/system_call.o
  AS      arch/x86/entry/vdso/vdso32/sigreturn.o
  CC      lib/kunit/try-catch.o
  CC      arch/x86/entry/vdso/vdso32/vclock_gettime.o
  CC      arch/x86/lib/insn.o
  CC      arch/x86/kernel/cpu/mce/intel.o
  AR      arch/x86/platform/efi/built-in.a
  AR      lib/math/built-in.a
  AR      arch/x86/power/built-in.a
  CC      kernel/sched/build_policy.o
  CC      arch/x86/mm/pat/memtype_interval.o
  CC      lib/kunit/executor.o
  CC [M]  arch/x86/kvm/../../../virt/kvm/binary_stats.o
  AR      arch/x86/platform/geode/built-in.a
  AR      arch/x86/platform/iris/built-in.a
  CC [M]  drivers/pinctrl/intel/pinctrl-geminilake.o
  CC      net/llc/llc_core.o
  CC      arch/x86/platform/intel/iosf_mbi.o
  CC      net/llc/llc_input.o
  CC      net/llc/llc_output.o
  CC      arch/x86/kernel/fpu/signal.o
  CC      net/ethernet/eth.o
  AR      sound/core/seq/built-in.a
  CC      sound/core/control.o
  CC [M]  drivers/pinctrl/intel/pinctrl-sunrisepoint.o
  AS [M]  arch/x86/crypto/crct10dif-pcl-asm_64.o
  CC [M]  arch/x86/kvm/../../../virt/kvm/vfio.o
  CC [M]  arch/x86/crypto/crct10dif-pclmul_glue.o
  CC      arch/x86/events/intel/core.o
  LD [M]  arch/x86/crypto/ghash-clmulni-intel.o
  CC      arch/x86/pci/acpi.o
  CC      mm/page-writeback.o
  AS      arch/x86/lib/memcpy_64.o
  AR      fs/nfs_common/built-in.a
  AS      arch/x86/lib/memmove_64.o
  CC      security/keys/keyctl.o
  AS      arch/x86/lib/memset_64.o
  CC      fs/iomap/trace.o
  CC      security/keys/permission.o
  CC      arch/x86/lib/misc.o
  CC      crypto/geniv.o
  CC      arch/x86/lib/pc-conf-reg.o
  CC      fs/iomap/iter.o
  CC      security/keys/process_keys.o
  CC      mm/kasan/shadow.o
  CC      arch/x86/entry/vsyscall/vsyscall_64.o
  CC      lib/kunit/hooks.o
  CC [M]  sound/pci/hda/hda_sysfs.o
  AS      arch/x86/entry/vsyscall/vsyscall_emu_64.o
  CC      arch/x86/entry/vdso/vdso32/vgetcpu.o
  CC      init/calibrate.o
  CC      init/init_task.o
  CC      arch/x86/pci/legacy.o
  CC      mm/kasan/quarantine.o
  CC      block/blk-core.o
  CC      arch/x86/kernel/cpu/mce/threshold.o
  CC [M]  sound/pci/hda/hda_controller.o
  VDSO    arch/x86/entry/vdso/vdso64.so.dbg
  AS      arch/x86/lib/putuser.o
  AR      arch/x86/mm/pat/built-in.a
  AR      block/partitions/built-in.a
  CC      arch/x86/mm/init_64.o
  CC      arch/x86/mm/fault.o
  LD [M]  arch/x86/crypto/crc32-pclmul.o
  CC      arch/x86/events/amd/uncore.o
  VDSO    arch/x86/entry/vdso/vdso32.so.dbg
  AS      arch/x86/lib/retpoline.o
  LD [M]  arch/x86/crypto/crct10dif-pclmul.o
  OBJCOPY arch/x86/entry/vdso/vdso64.so
  OBJCOPY arch/x86/entry/vdso/vdso32.so
  CC      init/version.o
  VDSO2C  arch/x86/entry/vdso/vdso-image-64.c
  VDSO2C  arch/x86/entry/vdso/vdso-image-32.c
  AR      arch/x86/crypto/built-in.a
  CC      arch/x86/entry/vdso/vdso-image-64.o
  CC      kernel/sched/build_utility.o
  AR      drivers/pinctrl/intel/built-in.a
  AR      drivers/pinctrl/nomadik/built-in.a
  CC      arch/x86/lib/usercopy.o
  CC      arch/x86/kernel/cpu/rdrand.o
  AR      drivers/pinctrl/nuvoton/built-in.a
  CC      arch/x86/mm/ioremap.o
  AR      drivers/pinctrl/nxp/built-in.a
  AR      lib/kunit/built-in.a
  AR      drivers/pinctrl/sprd/built-in.a
  AR      arch/x86/platform/intel/built-in.a
  CC      lib/crypto/memneq.o
  AR      drivers/pinctrl/sunplus/built-in.a
  AR      arch/x86/platform/intel-mid/built-in.a
  AR      drivers/pinctrl/ti/built-in.a
  AR      arch/x86/platform/intel-quark/built-in.a
  CC      drivers/pinctrl/core.o
  AR      arch/x86/platform/olpc/built-in.a
  AR      arch/x86/platform/scx200/built-in.a
  AR      arch/x86/platform/ts5500/built-in.a
  AR      arch/x86/kernel/cpu/mtrr/built-in.a
  CC      lib/crypto/utils.o
  AR      arch/x86/platform/uv/built-in.a
  AR      arch/x86/platform/built-in.a
  CC      lib/zlib_inflate/inffast.o
  CC      kernel/locking/mutex.o
  CC      drivers/gpio/gpiolib.o
  CC      kernel/locking/semaphore.o
  CC      arch/x86/kernel/cpu/match.o
  AR      net/llc/built-in.a
  CC      net/802/p8022.o
  CC      arch/x86/entry/vdso/vdso-image-32.o
  CC      net/802/psnap.o
  CC      drivers/gpio/gpiolib-devres.o
  CC      security/keys/request_key.o
  CC      arch/x86/kernel/fpu/xstate.o
  AR      fs/notify/fanotify/built-in.a
  CC      fs/notify/fsnotify.o
  CC      kernel/power/qos.o
  CC      arch/x86/lib/usercopy_64.o
  CC      lib/zlib_inflate/inflate.o
  CC      arch/x86/kernel/cpu/bugs.o
  AR      fs/quota/built-in.a
  CC      arch/x86/pci/irq.o
  CC      lib/zlib_deflate/deflate.o
  CC      arch/x86/kernel/acpi/boot.o
  CC      security/commoncap.o
  AR      arch/x86/entry/vdso/built-in.a
  CC      arch/x86/kernel/acpi/sleep.o
  CC      lib/zlib_deflate/deftree.o
  AR      init/built-in.a
  AS      arch/x86/kernel/acpi/wakeup_64.o
  CC      crypto/skcipher.o
  CC      net/core/request_sock.o
  CC      lib/crypto/chacha.o
  CC      lib/zlib_deflate/deflate_syms.o
  AR      arch/x86/entry/vsyscall/built-in.a
  AS      arch/x86/entry/entry.o
  AR      mm/kasan/built-in.a
  AS      arch/x86/entry/entry_64.o
  CC [M]  sound/pci/hda/hda_proc.o
  CC      kernel/power/main.o
  AR      net/ethernet/built-in.a
  CC      lib/crypto/aes.o
  CC      net/sched/sch_generic.o
  CC      arch/x86/entry/syscall_64.o
  CC      arch/x86/kernel/cpu/mce/apei.o
  CC      net/sched/sch_mq.o
  CC      fs/iomap/buffered-io.o
  CC      arch/x86/entry/common.o
  AR      arch/x86/events/amd/built-in.a
  CC      net/core/skbuff.o
  CC      fs/iomap/direct-io.o
  AR      sound/pci/ice1712/built-in.a
  CC      arch/x86/mm/extable.o
  CC      crypto/seqiv.o
  CC      arch/x86/lib/msr-smp.o
  CC      net/sched/sch_frag.o
  CC      mm/folio-compat.o
  CC      net/802/stp.o
  CC      fs/proc/task_mmu.o
  CC      lib/zlib_inflate/infutil.o
  CC      fs/notify/notification.o
  CC      sound/core/misc.o
  CC      arch/x86/kernel/acpi/apei.o
  CC      security/keys/request_key_auth.o
  CC      mm/readahead.o
  CC      arch/x86/lib/cache-smp.o
  CC      arch/x86/mm/mmap.o
  CC      kernel/power/console.o
  CC      fs/notify/group.o
  CC      kernel/power/process.o
  CC      net/sched/sch_api.o
  AR      arch/x86/kernel/cpu/mce/built-in.a
  CC      lib/zlib_inflate/inftrees.o
  CC      lib/crypto/gf128mul.o
  CC      arch/x86/lib/msr.o
  AR      lib/zlib_deflate/built-in.a
  CC      lib/zlib_inflate/inflate_syms.o
  CC      drivers/pinctrl/pinctrl-utils.o
  CC      drivers/pinctrl/pinmux.o
  AS      arch/x86/entry/thunk_64.o
  CC      arch/x86/events/intel/bts.o
  AS      arch/x86/entry/entry_64_compat.o
  CC      arch/x86/kernel/acpi/cppc.o
  CC      lib/crypto/blake2s.o
  AR      arch/x86/kernel/fpu/built-in.a
  CC      arch/x86/entry/syscall_32.o
  AR      drivers/pwm/built-in.a
  AS      arch/x86/lib/msr-reg.o
  CC      drivers/gpio/gpiolib-legacy.o
  CC      drivers/gpio/gpiolib-cdev.o
  CC      crypto/echainiv.o
  CC      drivers/gpio/gpiolib-sysfs.o
  CC      drivers/gpio/gpiolib-acpi.o
  CC      arch/x86/mm/pgtable.o
  CC      arch/x86/kernel/acpi/cstate.o
  CC [M]  sound/pci/hda/hda_hwdep.o
  CC      arch/x86/pci/common.o
  CC      io_uring/nop.o
  CC      io_uring/fs.o
  CC      arch/x86/kernel/apic/apic.o
  CC      arch/x86/kernel/apic/apic_common.o
  CC [M]  arch/x86/kvm/../../../virt/kvm/coalesced_mmio.o
  AR      lib/zlib_inflate/built-in.a
  CC      net/sched/sch_blackhole.o
  CC      fs/kernfs/mount.o
  CC      sound/core/device.o
  CC      arch/x86/kernel/cpu/aperfmperf.o
  AR      net/802/built-in.a
  CC      security/keys/user_defined.o
  CC      arch/x86/kernel/apic/apic_noop.o
  CC      arch/x86/events/zhaoxin/core.o
  CC      block/blk-sysfs.o
  CC      fs/sysfs/file.o
  CC      lib/crypto/blake2s-generic.o
  CC      lib/crypto/blake2s-selftest.o
  CC      fs/notify/mark.o
  CC      fs/configfs/inode.o
  CC      lib/lzo/lzo1x_compress.o
  CC      fs/configfs/file.o
  CC      lib/lzo/lzo1x_decompress_safe.o
  CC      arch/x86/kernel/apic/ipi.o
  CC      block/blk-flush.o
  CC      kernel/locking/rwsem.o
  CC      arch/x86/lib/msr-reg-export.o
  AR      arch/x86/entry/built-in.a
  CC      fs/notify/fdinfo.o
  CC      mm/swap.o
  CC [M]  sound/pci/hda/hda_generic.o
  CC      drivers/pinctrl/pinconf.o
  CC      crypto/ahash.o
  CC      arch/x86/mm/physaddr.o
  AS      arch/x86/lib/hweight.o
  CC      kernel/power/suspend.o
  CC      arch/x86/lib/iomem.o
  CC      fs/configfs/dir.o
  CC      net/sched/sch_fifo.o
  CC      sound/core/info.o
  AR      arch/x86/kernel/acpi/built-in.a
  CC      arch/x86/events/intel/ds.o
  CC      arch/x86/events/intel/knc.o
  CC      arch/x86/kernel/cpu/cpuid-deps.o
  CC      lib/crypto/des.o
  CC      drivers/gpio/gpiolib-swnode.o
  CC      security/keys/compat.o
  CC      kernel/printk/printk.o
  CC      fs/kernfs/inode.o
  CC      kernel/printk/printk_safe.o
  CC      arch/x86/pci/early.o
  CC      io_uring/splice.o
  CC [M]  arch/x86/kvm/../../../virt/kvm/async_pf.o
  CC [M]  arch/x86/kvm/../../../virt/kvm/irqchip.o
  CC      arch/x86/pci/bus_numa.o
  AR      lib/lzo/built-in.a
  CC      kernel/printk/printk_ringbuffer.o
  CC      fs/kernfs/dir.o
  CC      fs/sysfs/dir.o
  AS      arch/x86/lib/iomap_copy_64.o
  CC      net/netlink/af_netlink.o
  CC      arch/x86/lib/inat.o
  CC      fs/iomap/fiemap.o
  AR      arch/x86/events/zhaoxin/built-in.a
  AR      net/bpf/built-in.a
  AR      arch/x86/lib/built-in.a
  CC      net/ethtool/ioctl.o
  AR      sound/pci/korg1212/built-in.a
  AR      sound/pci/mixart/built-in.a
  CC      fs/iomap/seek.o
  CC      arch/x86/kernel/cpu/umwait.o
  AR      sound/pci/nm256/built-in.a
  CC      net/netlink/genetlink.o
  CC      arch/x86/mm/tlb.o
  CC      arch/x86/events/core.o
  CC      kernel/locking/percpu-rwsem.o
  CC      fs/proc/inode.o
  AR      arch/x86/lib/lib.a
  CC      drivers/pinctrl/pinconf-generic.o
  CC      security/min_addr.o
  AR      sound/pci/oxygen/built-in.a
  CC      fs/configfs/symlink.o
  AR      sound/pci/pcxhr/built-in.a
  CC      fs/configfs/mount.o
  CC      security/inode.o
  CC      block/blk-settings.o
  AR      fs/notify/built-in.a
  CC      fs/devpts/inode.o
  CC      block/blk-ioc.o
  CC      security/keys/proc.o
  CC      block/blk-map.o
  CC      kernel/printk/sysctl.o
  CC      fs/sysfs/symlink.o
  CC      fs/sysfs/mount.o
  CC      crypto/shash.o
  CC      sound/core/isadma.o
  CC      arch/x86/pci/amd_bus.o
  CC      arch/x86/mm/cpu_entry_area.o
  AR      drivers/gpio/built-in.a
  CC      fs/iomap/swapfile.o
  CC      io_uring/sync.o
  CC      io_uring/advise.o
  CC      block/blk-merge.o
  CC      sound/core/vmaster.o
  CC      kernel/power/hibernate.o
  CC      kernel/power/snapshot.o
  CC      crypto/akcipher.o
  CC      arch/x86/kernel/cpu/proc.o
  CC      fs/sysfs/group.o
  CC      lib/crypto/sha1.o
  AR      drivers/pinctrl/built-in.a
  CC      fs/kernfs/file.o
  CC      drivers/pci/msi/pcidev_msi.o
  CC [M]  arch/x86/kvm/../../../virt/kvm/dirty_ring.o
  AR      net/sched/built-in.a
  CC      sound/core/ctljack.o
  CC      drivers/pci/msi/api.o
  CC      sound/core/jack.o
  CC      fs/configfs/item.o
  CC      kernel/locking/irqflag-debug.o
  CC      arch/x86/kernel/apic/vector.o
  CC      fs/kernfs/symlink.o
  CC      kernel/locking/mutex-debug.o
  CC      net/ethtool/common.o
  CC      fs/proc/root.o
  CC      security/keys/sysctl.o
  CC      fs/proc/base.o
  CC      drivers/pci/msi/msi.o
  CC      fs/proc/generic.o
  AR      fs/devpts/built-in.a
  CC      fs/ext4/balloc.o
  CC      fs/jbd2/transaction.o
  CC      arch/x86/mm/maccess.o
  CC      net/ethtool/netlink.o
  CC      lib/crypto/sha256.o
  CC      fs/jbd2/commit.o
  CC      fs/jbd2/recovery.o
  CC      fs/ramfs/inode.o
  AR      arch/x86/pci/built-in.a
  AR      fs/iomap/built-in.a
  CC      sound/core/timer.o
  CC      kernel/locking/lockdep.o
  CC      fs/ext4/bitmap.o
  CC      arch/x86/events/intel/lbr.o
  AR      fs/configfs/built-in.a
  MKCAP   arch/x86/kernel/cpu/capflags.c
  CC      drivers/pci/msi/irqdomain.o
  CC      net/ethtool/bitset.o
  CC      fs/hugetlbfs/inode.o
  CC      fs/fat/cache.o
  AR      fs/sysfs/built-in.a
  CC      io_uring/filetable.o
  CC      fs/nfs/client.o
  CC      fs/exportfs/expfs.o
  CC      mm/truncate.o
  CC      fs/lockd/clntlock.o
  CC      arch/x86/mm/pgprot.o
  CC      mm/vmscan.o
  CC      crypto/kpp.o
  CC      drivers/pci/pcie/portdrv.o
  CC      drivers/pci/hotplug/pci_hotplug_core.o
  AR      security/keys/built-in.a
  CC      crypto/acompress.o
  CC      drivers/pci/pcie/rcec.o
  CC      security/device_cgroup.o
  CC      drivers/pci/pcie/aspm.o
  CC [M]  arch/x86/kvm/../../../virt/kvm/pfncache.o
  AR      fs/kernfs/built-in.a
  CC [M]  lib/crypto/arc4.o
  CC      crypto/scompress.o
  CC      fs/nfs/dir.o
  AR      kernel/printk/built-in.a
  CC      drivers/pci/pcie/aer.o
  CC      arch/x86/kernel/apic/hw_nmi.o
  CC      fs/ramfs/file-mmu.o
  AR      lib/crypto/built-in.a
  CC      arch/x86/mm/hugetlbpage.o
  CC      arch/x86/mm/kasan_init_64.o
  CC [M]  arch/x86/kvm/x86.o
  CC [M]  arch/x86/kvm/emulate.o
  AR      fs/exportfs/built-in.a
  CC      fs/fat/dir.o
  CC      fs/nls/nls_base.o
  CC      kernel/power/swap.o
  AR      drivers/pci/msi/built-in.a
  LD [M]  lib/crypto/libarc4.o
  CC      fs/nls/nls_cp437.o
  CC      kernel/power/user.o
  CC      lib/lz4/lz4_compress.o
  CC      lib/lz4/lz4hc_compress.o
  CC      block/blk-timeout.o
  CC      lib/lz4/lz4_decompress.o
  CC      arch/x86/events/intel/p4.o
  CC      lib/zstd/zstd_compress_module.o
  CC      lib/xz/xz_dec_syms.o
  CC      crypto/algboss.o
  CC      drivers/pci/pcie/err.o
  CC      drivers/pci/hotplug/acpi_pcihp.o
  CC      mm/shmem.o
  AR      kernel/sched/built-in.a
  CC      arch/x86/events/intel/p6.o
  AR      fs/ramfs/built-in.a
  CC      arch/x86/kernel/apic/io_apic.o
  CC      kernel/power/poweroff.o
  CC      io_uring/openclose.o
  CC      arch/x86/kernel/apic/msi.o
  AR      drivers/pci/controller/dwc/built-in.a
  CC      fs/nls/nls_ascii.o
  CC      kernel/locking/lockdep_proc.o
  AR      drivers/pci/controller/mobiveil/built-in.a
  CC      drivers/pci/controller/vmd.o
  CC      net/ethtool/strset.o
  CC      fs/lockd/clntproc.o
  CC      arch/x86/events/intel/pt.o
  CC      kernel/locking/spinlock.o
  CC      lib/xz/xz_dec_stream.o
  CC      crypto/testmgr.o
  CC      block/blk-lib.o
  CC      net/netlink/policy.o
  CC      lib/zstd/compress/fse_compress.o
  CC      net/netlink/diag.o
  AR      fs/hugetlbfs/built-in.a
  CC      arch/x86/mm/pkeys.o
  CC      block/blk-mq.o
  CC      fs/ext4/block_validity.o
  CC      fs/jbd2/checkpoint.o
  CC [M]  arch/x86/kvm/i8259.o
  CC      sound/core/hrtimer.o
  AR      security/built-in.a
  CC      sound/core/seq_device.o
  CC      fs/nls/nls_iso8859-1.o
  CC      fs/nls/nls_utf8.o
  CC [M]  net/netfilter/ipvs/ip_vs_conn.o
  AR      sound/usb/misc/built-in.a
  AR      sound/usb/usx2y/built-in.a
  AR      sound/usb/caiaq/built-in.a
  AR      sound/usb/6fire/built-in.a
  AR      sound/usb/hiface/built-in.a
  CC      drivers/pci/pcie/aer_inject.o
  AR      sound/usb/bcd2000/built-in.a
  AR      sound/usb/built-in.a
  AR      sound/firewire/built-in.a
  AR      net/ipv4/netfilter/built-in.a
  CC      net/ipv4/route.o
  CC [M]  net/ipv4/netfilter/nf_defrag_ipv4.o
  CC      net/ipv4/inetpeer.o
  CC      drivers/pci/hotplug/pciehp_core.o
  CC      drivers/pci/hotplug/pciehp_ctrl.o
  CC      lib/zstd/compress/hist.o
  CC      drivers/pci/hotplug/pciehp_pci.o
  CC      lib/xz/xz_dec_lzma2.o
  CC      net/core/datagram.o
  CC      net/ethtool/linkinfo.o
  CC [M]  net/ipv4/netfilter/nf_reject_ipv4.o
  CC      lib/zstd/compress/huf_compress.o
  AR      fs/unicode/built-in.a
  CC      fs/nfs/file.o
  CC      drivers/pci/pcie/pme.o
  AR      fs/nls/built-in.a
  CC      net/ipv4/protocol.o
  CC      arch/x86/events/probe.o
  CC      drivers/pci/pcie/dpc.o
  CC [M]  net/netfilter/ipvs/ip_vs_core.o
  CC [M]  sound/pci/hda/patch_realtek.o
  CC [M]  net/netfilter/ipvs/ip_vs_ctl.o
  CC      fs/proc/array.o
  CC      arch/x86/mm/pti.o
  CC      fs/nfs/getroot.o
  AR      kernel/power/built-in.a
  CC      block/blk-mq-tag.o
  CC [M]  sound/core/control_led.o
  CC      mm/util.o
  CC      fs/fat/fatent.o
  AR      drivers/pci/controller/built-in.a
  CC      net/xfrm/xfrm_policy.o
  CC      io_uring/uring_cmd.o
  AR      drivers/pci/switch/built-in.a
  CC      io_uring/epoll.o
  CC      io_uring/statx.o
  CC      fs/ext4/dir.o
  AR      net/netlink/built-in.a
  AR      sound/sparc/built-in.a
  CC      net/unix/af_unix.o
  AR      lib/lz4/built-in.a
  CC      net/unix/garbage.o
  CC      fs/jbd2/revoke.o
  CC      fs/jbd2/journal.o
  CC      io_uring/net.o
  CC      block/blk-stat.o
  CC      arch/x86/events/intel/uncore.o
  CC      drivers/pci/hotplug/pciehp_hpc.o
  CC      lib/xz/xz_dec_bcj.o
  CC      fs/lockd/clntxdr.o
  CC      block/blk-mq-sysfs.o
  CC [M]  arch/x86/kvm/irq.o
  AR      drivers/pci/pcie/built-in.a
  CC [M]  net/ipv4/netfilter/ip_tables.o
  CC      drivers/pci/access.o
  CC      kernel/irq/irqdesc.o
  CC [M]  arch/x86/kvm/lapic.o
  AR      arch/x86/mm/built-in.a
  CC      net/ethtool/linkmodes.o
  AR      sound/spi/built-in.a
  AR      sound/parisc/built-in.a
  CC      fs/nfs/inode.o
  CC [M]  sound/core/hwdep.o
  CC      arch/x86/kernel/apic/x2apic_phys.o
  CC      io_uring/msg_ring.o
  CC      fs/lockd/host.o
  CC [M]  arch/x86/kvm/i8254.o
  CC      fs/nfs/super.o
  AR      lib/xz/built-in.a
  CC      net/ipv4/ip_input.o
  CC      lib/raid6/algos.o
  CC      fs/proc/fd.o
  CC      net/core/stream.o
  CC      lib/raid6/recov.o
  HOSTCC  lib/raid6/mktables
  CC      fs/ext4/ext4_jbd2.o
  CC      arch/x86/kernel/cpu/powerflags.o
  CC      fs/ext4/extents.o
  CC      block/blk-mq-cpumap.o
  CC      fs/fat/file.o
  CC      lib/zstd/compress/zstd_compress.o
  CC      block/blk-mq-sched.o
  CC      crypto/cmac.o
  CC      kernel/rcu/update.o
  AR      net/ipv6/netfilter/built-in.a
  CC      arch/x86/kernel/cpu/feat_ctl.o
  CC      kernel/rcu/sync.o
  CC [M]  net/ipv6/netfilter/nf_defrag_ipv6_hooks.o
  CC      net/ipv6/af_inet6.o
  CC      arch/x86/kernel/apic/x2apic_cluster.o
  CC [M]  sound/core/pcm.o
  CC      kernel/irq/handle.o
  CC      drivers/pci/bus.o
  CC      net/ipv6/anycast.o
  CC      fs/ntfs/aops.o
  CC      drivers/pci/hotplug/acpiphp_core.o
  CC      fs/ntfs/attrib.o
  CC      fs/ntfs/collate.o
  CC      kernel/locking/osq_lock.o
  CC      net/ipv6/ip6_output.o
  UNROLL  lib/raid6/int1.c
  UNROLL  lib/raid6/int2.c
  UNROLL  lib/raid6/int4.c
  UNROLL  lib/raid6/int8.c
  CC      net/ethtool/rss.o
  UNROLL  lib/raid6/int16.c
  UNROLL  lib/raid6/int32.c
  CC      lib/raid6/recov_ssse3.o
  CC      fs/fat/inode.o
  CC      arch/x86/kernel/cpu/intel.o
  CC      fs/proc/proc_tty.o
  CC      fs/nfs/io.o
  CC      crypto/hmac.o
  CC      mm/mmzone.o
  CC      io_uring/timeout.o
  CC      fs/lockd/svc.o
  CC      kernel/locking/qspinlock.o
  CC      arch/x86/kernel/apic/apic_flat_64.o
  CC      arch/x86/events/intel/uncore_nhmex.o
  CC      kernel/locking/rtmutex_api.o
  CC      kernel/irq/manage.o
  CC      drivers/pci/probe.o
  AR      sound/pci/riptide/built-in.a
  CC      mm/vmstat.o
  CC [M]  net/ipv4/netfilter/iptable_filter.o
  AR      sound/pci/rme9652/built-in.a
  CC      block/ioctl.o
  CC      kernel/locking/spinlock_debug.o
  CC      net/core/scm.o
  CC      net/core/gen_stats.o
  CC      drivers/pci/hotplug/acpiphp_glue.o
  CC      net/netfilter/core.o
  CC [M]  sound/core/pcm_native.o
  CC      lib/raid6/recov_avx2.o
  CC      fs/proc/cmdline.o
  CC      lib/raid6/mmx.o
  CC      mm/backing-dev.o
  CC [M]  arch/x86/kvm/ioapic.o
  CC [M]  sound/core/pcm_lib.o
  CC      kernel/locking/qrwlock.o
  CC [M]  net/ipv6/netfilter/nf_conntrack_reasm.o
  CC      crypto/vmac.o
  CC      net/ethtool/linkstate.o
  CC [M]  sound/pci/hda/patch_analog.o
  CC      arch/x86/kernel/apic/probe_64.o
  AR      sound/pci/trident/built-in.a
  CC      fs/ntfs/compress.o
  CC      fs/proc/consoles.o
  CC      block/genhd.o
  CC      crypto/xcbc.o
  AR      sound/pci/ymfpci/built-in.a
  CC      net/ethtool/debug.o
  CC      kernel/rcu/srcutree.o
  CC [M]  sound/core/pcm_misc.o
  CC [M]  net/netfilter/ipvs/ip_vs_sched.o
  CC      crypto/crypto_null.o
  CC      fs/ntfs/debug.o
  AR      arch/x86/kernel/apic/built-in.a
  CC      lib/zstd/compress/zstd_compress_literals.o
  CC      kernel/rcu/tree.o
  CC      arch/x86/kernel/cpu/intel_pconfig.o
  CC      net/unix/sysctl_net_unix.o
  CC      block/ioprio.o
  CC      lib/raid6/sse1.o
  CC      drivers/idle/intel_idle.o
  CC      drivers/video/console/dummycon.o
  CC      net/ipv6/ip6_input.o
  CC      io_uring/sqpoll.o
  CC      lib/raid6/sse2.o
  AR      fs/jbd2/built-in.a
  AR      drivers/char/ipmi/built-in.a
  CC      kernel/rcu/rcu_segcblist.o
  CC      arch/x86/kernel/cpu/tsx.o
  CC      lib/zstd/compress/zstd_compress_sequences.o
  CC [M]  net/ipv4/netfilter/iptable_mangle.o
  CC      fs/proc/cpuinfo.o
  CC      arch/x86/events/intel/uncore_snb.o
  AR      kernel/locking/built-in.a
  CC      fs/lockd/svclock.o
  CC      arch/x86/events/utils.o
  CC [M]  sound/core/pcm_memory.o
  CC      fs/fat/misc.o
  CC      crypto/md5.o
  CC      fs/nfs/direct.o
  CC      lib/raid6/avx2.o
  AR      drivers/pci/hotplug/built-in.a
  CC [M]  sound/pci/hda/patch_hdmi.o
  CC      net/core/gen_estimator.o
  CC      net/core/net_namespace.o
  CC      drivers/pci/host-bridge.o
  CC      arch/x86/events/rapl.o
  CC      arch/x86/events/msr.o
  CC      fs/proc/devices.o
  AR      kernel/livepatch/built-in.a
  CC      net/ethtool/wol.o
  CC      net/ipv4/ip_fragment.o
  CC      kernel/dma/mapping.o
  CC      arch/x86/kernel/cpu/intel_epb.o
  CC      kernel/irq/spurious.o
  CC      drivers/video/console/vgacon.o
  CC      kernel/dma/direct.o
  AR      sound/pcmcia/vx/built-in.a
  AR      sound/pcmcia/pdaudiocf/built-in.a
  AR      sound/pcmcia/built-in.a
  AR      sound/mips/built-in.a
  AR      sound/soc/built-in.a
  CC [M]  arch/x86/kvm/irq_comm.o
  CC      net/ipv4/ip_forward.o
  CC      net/packet/af_packet.o
  CC      net/key/af_key.o
  CC      lib/zstd/compress/zstd_compress_superblock.o
  CC      net/unix/diag.o
  CC      crypto/sha1_generic.o
  CC      block/badblocks.o
  CC      lib/raid6/avx512.o
  CC      fs/ntfs/dir.o
  CC [M]  net/netfilter/ipvs/ip_vs_xmit.o
  CC [M]  sound/pci/hda/hda_eld.o
  CC      crypto/sha256_generic.o
  CC      mm/mm_init.o
  CC      crypto/sha512_generic.o
  CC      fs/fat/nfs.o
  LD [M]  net/ipv6/netfilter/nf_defrag_ipv6.o
  CC      arch/x86/kernel/cpu/amd.o
  CC      lib/raid6/recov_avx512.o
  CC      kernel/irq/resend.o
  CC [M]  net/netfilter/ipvs/ip_vs_app.o
  CC      drivers/pci/remove.o
  CC      fs/nfs/pagelist.o
  CC [M]  net/ipv4/netfilter/iptable_nat.o
  CC      io_uring/fdinfo.o
  CC      fs/proc/interrupts.o
  CC [M]  sound/core/memalloc.o
  CC      arch/x86/events/intel/uncore_snbep.o
  CC      net/ipv4/ip_options.o
  AR      drivers/idle/built-in.a
  CC      fs/nfs/read.o
  CC      net/packet/diag.o
  CC      net/xfrm/xfrm_state.o
  CC      lib/zstd/compress/zstd_double_fast.o
  CC [M]  sound/core/pcm_timer.o
  CC      net/core/secure_seq.o
  CC      kernel/irq/chip.o
  CC      net/ethtool/features.o
  CC      kernel/irq/dummychip.o
  CC      block/blk-rq-qos.o
  CC      fs/proc/loadavg.o
  CC      kernel/irq/devres.o
  CC      kernel/dma/ops_helpers.o
  CC      kernel/dma/dummy.o
  AR      drivers/video/console/built-in.a
  CC      fs/lockd/svcshare.o
  CC      fs/nfs/symlink.o
  CC      drivers/video/logo/logo.o
  CC      fs/fat/namei_vfat.o
  TABLE   lib/raid6/tables.c
  CC      lib/raid6/int1.o
  CC      drivers/pci/pci.o
  CC      crypto/blake2b_generic.o
  HOSTCC  drivers/video/logo/pnmtologo
  CC      net/xfrm/xfrm_hash.o
  CC      net/ipv4/ip_output.o
  CC      net/ipv6/addrconf.o
  CC      net/unix/scm.o
  CC      arch/x86/kernel/cpu/hygon.o
  CC      net/ipv6/addrlabel.o
  CC      net/ipv6/route.o
  CC      block/disk-events.o
  CC      lib/zstd/compress/zstd_fast.o
  CC      crypto/ecb.o
  CC [M]  arch/x86/kvm/cpuid.o
  LOGO    drivers/video/logo/logo_linux_clut224.c
  CC      drivers/video/logo/logo_linux_clut224.o
  CC      fs/proc/meminfo.o
  CC      fs/proc/stat.o
  CC      fs/ntfs/file.o
  CC      fs/ntfs/index.o
  AR      drivers/video/logo/built-in.a
  CC      fs/ext4/extents_status.o
  CC [M]  arch/x86/kvm/pmu.o
  CC      drivers/video/backlight/backlight.o
  CC [M]  net/ipv4/netfilter/ipt_REJECT.o
  CC      kernel/dma/contiguous.o
  CC      net/ipv6/ip6_fib.o
  CC      net/ipv4/ip_sockglue.o
  CC      io_uring/tctx.o
  CC      arch/x86/kernel/cpu/centaur.o
  CC      mm/percpu.o
  CC      fs/proc/uptime.o
  CC      lib/raid6/int2.o
  LD [M]  sound/core/snd-ctl-led.o
  LD [M]  sound/core/snd-hwdep.o
  LD [M]  sound/core/snd-pcm.o
  CC      arch/x86/kernel/cpu/zhaoxin.o
  CC      fs/ext4/file.o
  AR      sound/core/built-in.a
  CC      fs/ntfs/inode.o
  CC      net/ethtool/privflags.o
  CC      kernel/irq/autoprobe.o
  CC      kernel/dma/swiotlb.o
  CC      fs/proc/util.o
  CC      net/core/flow_dissector.o
  CC [M]  sound/pci/hda/hda_intel.o
  CC      fs/lockd/svcproc.o
  CC      crypto/cbc.o
  CC      net/core/sysctl_net_core.o
  CC      fs/proc/version.o
  CC [M]  net/netfilter/ipvs/ip_vs_sync.o
  CC      block/blk-ia-ranges.o
  CC      fs/fat/namei_msdos.o
  CC      mm/slab_common.o
  AR      net/unix/built-in.a
  CC      lib/raid6/int4.o
  CC      fs/lockd/svcsubs.o
  CC      fs/ntfs/mft.o
  CC      arch/x86/kernel/cpu/perfctr-watchdog.o
  AR      net/bridge/netfilter/built-in.a
  CC      net/bridge/br.o
  CC      net/bridge/br_device.o
  CC      arch/x86/kernel/cpu/vmware.o
  CC      drivers/video/fbdev/core/fb_notify.o
  CC      arch/x86/kernel/cpu/hypervisor.o
  CC      mm/compaction.o
  CC      kernel/irq/irqdomain.o
  AR      drivers/video/backlight/built-in.a
  CC [M]  drivers/video/fbdev/core/fb_backlight.o
  CC      crypto/pcbc.o
  CC      io_uring/poll.o
  CC      crypto/cts.o
  CC      fs/proc/softirqs.o
  CC      fs/nfs/unlink.o
  CC      fs/ntfs/mst.o
  CC      fs/ntfs/namei.o
  AR      net/key/built-in.a
  CC [M]  arch/x86/kvm/mtrr.o
  AR      net/dsa/built-in.a
  CC      arch/x86/events/intel/uncore_discovery.o
  CC [M]  net/sunrpc/auth_gss/auth_gss.o
  CC      net/ethtool/rings.o
  CC [M]  net/sunrpc/auth_gss/gss_generic_token.o
  CC      block/bsg.o
  CC      block/bsg-lib.o
  CC      arch/x86/kernel/cpu/mshyperv.o
  CC      lib/raid6/int8.o
  CC      net/8021q/vlan_core.o
  CC      fs/lockd/mon.o
  CC [M]  drivers/video/fbdev/core/fb_info.o
  CC      lib/zstd/compress/zstd_lazy.o
  AR      fs/fat/built-in.a
  CC      fs/proc/namespaces.o
  CC      fs/autofs/init.o
  CC      kernel/dma/remap.o
  CC      block/blk-cgroup.o
  CC      fs/proc/self.o
  CC      crypto/lrw.o
  CC      fs/proc/thread_self.o
  CC      fs/lockd/trace.o
  CC      net/bridge/br_fdb.o
  CC      net/bridge/br_forward.o
  CC      fs/ntfs/runlist.o
  CC      fs/ext4/fsmap.o
  CC [M]  arch/x86/kvm/hyperv.o
  CC      net/ethtool/channels.o
  AR      net/packet/built-in.a
  CC      fs/autofs/inode.o
  AR      drivers/video/fbdev/omap/built-in.a
  LD [M]  sound/pci/hda/snd-hda-codec.o
  CC      net/xfrm/xfrm_input.o
  CC      net/ipv4/inet_hashtables.o
  CC      net/xfrm/xfrm_output.o
  CC      net/ipv4/inet_timewait_sock.o
  CC      kernel/irq/proc.o
  LD [M]  sound/pci/hda/snd-hda-codec-generic.o
  CC      fs/proc/proc_sysctl.o
  CC      arch/x86/kernel/cpu/capflags.o
  LD [M]  sound/pci/hda/snd-hda-codec-realtek.o
  CC      lib/raid6/int16.o
  CC      arch/x86/events/intel/cstate.o
  AR      kernel/dma/built-in.a
  LD [M]  sound/pci/hda/snd-hda-codec-analog.o
  CC      fs/ntfs/super.o
  AR      arch/x86/kernel/cpu/built-in.a
  CC      fs/ntfs/sysctl.o
  LD [M]  sound/pci/hda/snd-hda-codec-hdmi.o
  CC      io_uring/cancel.o
  CC      arch/x86/kernel/kprobes/core.o
  CC      io_uring/kbuf.o
  CC [M]  drivers/video/fbdev/core/fbmem.o
  LD [M]  sound/pci/hda/snd-hda-intel.o
  CC      arch/x86/kernel/kprobes/opt.o
  CC      net/dcb/dcbnl.o
  AR      sound/pci/vx222/built-in.a
  CC      kernel/entry/common.o
  CC      arch/x86/kernel/kprobes/ftrace.o
  AR      sound/pci/built-in.a
  CC      kernel/module/main.o
  AR      sound/atmel/built-in.a
  CC      kernel/module/strict_rwx.o
  AR      sound/hda/built-in.a
  CC      kernel/module/kmod.o
  CC [M]  sound/hda/hda_bus_type.o
  AR      kernel/rcu/built-in.a
  CC [M]  arch/x86/kvm/debugfs.o
  CC [M]  net/netfilter/ipvs/ip_vs_est.o
  CC      crypto/xts.o
  CC      kernel/entry/syscall_user_dispatch.o
  CC      drivers/pci/pci-driver.o
  CC      net/core/dev.o
  CC      fs/lockd/xdr.o
  CC      fs/nfs/write.o
  CC      lib/raid6/int32.o
  CC      mm/interval_tree.o
  CC [M]  net/8021q/vlan.o
  CC      fs/autofs/root.o
  CC      net/sunrpc/clnt.o
  CC [M]  arch/x86/kvm/mmu/mmu.o
  CC      kernel/irq/migration.o
  CC      net/core/dev_addr_lists.o
  CC      mm/list_lru.o
  CC [M]  sound/hda/hdac_bus.o
  AR      arch/x86/events/intel/built-in.a
  AR      arch/x86/events/built-in.a
  CC [M]  sound/hda/hdac_device.o
  CC      net/ethtool/coalesce.o
  CC      fs/nfs/namespace.o
  CC      fs/lockd/clnt4xdr.o
  CC      net/core/dst.o
  CC      kernel/module/tree_lookup.o
  CC      net/bridge/br_if.o
  CC      crypto/ctr.o
  AR      arch/x86/kernel/kprobes/built-in.a
  LDS     arch/x86/kernel/vmlinux.lds
  AS      arch/x86/kernel/head_64.o
  CC      arch/x86/kernel/head64.o
  CC      fs/proc/proc_net.o
  CC      lib/raid6/tables.o
  CC      kernel/entry/kvm.o
  CC      fs/proc/kcore.o
  CC      io_uring/rsrc.o
  CC      fs/ext4/fsync.o
  CC      kernel/irq/cpuhotplug.o
  CC      fs/lockd/xdr4.o
  CC      net/ipv4/inet_connection_sock.o
  CC      block/blk-cgroup-rwstat.o
  CC [M]  drivers/video/fbdev/core/fbmon.o
  CC      fs/ntfs/unistr.o
  CC [M]  net/sunrpc/auth_gss/gss_mech_switch.o
  CC      fs/autofs/symlink.o
  CC      mm/workingset.o
  CC      fs/proc/kmsg.o
  CC      net/xfrm/xfrm_sysctl.o
  CC [M]  drivers/video/fbdev/core/fbcmap.o
  CC [M]  drivers/video/fbdev/core/modedb.o
  CC      crypto/gcm.o
  CC      net/core/netevent.o
  CC      fs/proc/page.o
  CC      drivers/pci/search.o
  CC      drivers/pci/pci-sysfs.o
  CC [M]  sound/hda/hdac_sysfs.o
  CC [M]  net/8021q/vlan_dev.o
  CC      arch/x86/kernel/ebda.o
  CC      drivers/video/aperture.o
  CC [M]  net/netfilter/ipvs/ip_vs_proto.o
  CC      fs/ntfs/upcase.o
  CC      kernel/irq/pm.o
  AR      lib/raid6/built-in.a
  CC      kernel/time/time.o
  CC      fs/autofs/waitq.o
  CC      net/ipv4/tcp.o
  CC      kernel/irq/msi.o
  AR      kernel/entry/built-in.a
  CC      net/ethtool/pause.o
  CC      net/ethtool/eee.o
  CC      net/core/neighbour.o
  CC      fs/autofs/expire.o
  CC      net/bridge/br_input.o
  CC      net/dcb/dcbevent.o
  CC      fs/autofs/dev-ioctl.o
  CC      crypto/pcrypt.o
  CC      block/blk-throttle.o
  CC [M]  sound/hda/hdac_regmap.o
  CC [M]  net/sunrpc/auth_gss/svcauth_gss.o
  CC [M]  arch/x86/kvm/mmu/page_track.o
  CC      arch/x86/kernel/platform-quirks.o
  CC      net/ethtool/tsinfo.o
  CC      fs/ext4/hash.o
  CC      fs/lockd/svc4proc.o
  CC [M]  net/netfilter/ipvs/ip_vs_pe.o
  CC      mm/debug.o
  CC [M]  arch/x86/kvm/mmu/spte.o
  AR      fs/ntfs/built-in.a
  CC      arch/x86/kernel/process_64.o
  CC      drivers/pci/rom.o
  CC      net/ipv4/tcp_input.o
  CC      net/xfrm/xfrm_replay.o
  CC      kernel/futex/core.o
  CC      kernel/cgroup/cgroup.o
  CC      kernel/module/debug_kmemleak.o
  CC      kernel/futex/syscalls.o
  AR      fs/proc/built-in.a
  CC      kernel/module/kallsyms.o
  CC      fs/ext4/ialloc.o
  CC      kernel/trace/trace_clock.o
  CC      kernel/trace/ftrace.o
  CC      drivers/video/cmdline.o
  CC      io_uring/rw.o
  CC      block/mq-deadline.o
  CC [M]  drivers/video/fbdev/core/fbcvt.o
  CC      kernel/irq/affinity.o
  CC      crypto/cryptd.o
  AR      fs/autofs/built-in.a
  CC      net/xfrm/xfrm_device.o
  AR      net/dcb/built-in.a
  CC      net/bridge/br_ioctl.o
  CC [M]  sound/hda/hdac_controller.o
  CC      net/ethtool/cabletest.o
  CC      kernel/time/timer.o
  CC      kernel/cgroup/rstat.o
  CC      io_uring/opdef.o
  CC [M]  net/8021q/vlan_netlink.o
  CC      drivers/pci/setup-res.o
  CC      net/l3mdev/l3mdev.o
  CC      kernel/trace/ring_buffer.o
  CC      net/ipv6/ipv6_sockglue.o
  CC      fs/nfs/mount_clnt.o
  CC      kernel/module/procfs.o
  CC      kernel/time/hrtimer.o
  CC      lib/fonts/fonts.o
  CC      lib/fonts/font_8x8.o
  CC      mm/gup.o
  CC      net/xfrm/xfrm_algo.o
  CC      kernel/irq/matrix.o
  CC      net/sunrpc/xprt.o
  CC      kernel/bpf/core.o
  CC      net/bridge/br_stp.o
  CC      net/bridge/br_stp_bpdu.o
  CC [M]  net/netfilter/ipvs/ip_vs_proto_tcp.o
  CC      lib/fonts/font_8x16.o
  CC      kernel/module/sysfs.o
  CC      kernel/events/core.o
  CC      fs/lockd/procfs.o
  CC [M]  drivers/video/fbdev/core/fb_cmdline.o
  CC      kernel/futex/pi.o
  CC [M]  arch/x86/kvm/mmu/tdp_iter.o
  CC      kernel/futex/requeue.o
  CC      arch/x86/kernel/signal.o
  CC      lib/argv_split.o
  CC      lib/bug.o
  CC [M]  sound/hda/hdac_stream.o
  CC      drivers/pci/irq.o
  CC      crypto/des_generic.o
  AR      lib/fonts/built-in.a
  CC      net/handshake/genl.o
  CC [M]  net/sunrpc/auth_gss/gss_rpc_upcall.o
  CC      kernel/cgroup/namespace.o
  AR      net/l3mdev/built-in.a
  CC [M]  net/8021q/vlanproc.o
  CC [M]  net/bluetooth/af_bluetooth.o
  CC      block/kyber-iosched.o
  CC      lib/buildid.o
  CC [M]  sound/hda/array.o
  CC      kernel/futex/waitwake.o
  CC      mm/mmap_lock.o
  CC      net/ethtool/tunnels.o
  CC      fs/nfs/nfstrace.o
  CC      drivers/pci/vpd.o
  AR      fs/lockd/built-in.a
  CC      drivers/pci/setup-bus.o
  CC      drivers/pci/vc.o
  AR      kernel/module/built-in.a
  CC      net/bridge/br_stp_if.o
  CC      lib/cmdline.o
  CC      crypto/aes_generic.o
  CC [M]  drivers/video/fbdev/core/fb_io_fops.o
  CC      fs/nfs/export.o
  CC      net/xfrm/xfrm_user.o
  CC      arch/x86/kernel/signal_64.o
  CC      drivers/pci/mmap.o
  CC      net/handshake/netlink.o
  CC      block/bfq-iosched.o
  CC      io_uring/notif.o
  CC      kernel/fork.o
  AR      kernel/irq/built-in.a
  CC      kernel/exec_domain.o
  CC      net/handshake/request.o
  CC      fs/nfs/sysfs.o
  CC      kernel/cgroup/cgroup-v1.o
  CC      drivers/pci/setup-irq.o
  CC      io_uring/io-wq.o
  AR      kernel/futex/built-in.a
  CC      crypto/deflate.o
  CC      net/bridge/br_stp_timer.o
  CC [M]  sound/hda/hdmi_chmap.o
  CC      net/bridge/br_netlink.o
  CC      fs/ext4/indirect.o
  AR      net/8021q/built-in.a
  LD [M]  net/8021q/8021q.o
  CC [M]  net/dns_resolver/dns_key.o
  CC [M]  net/netfilter/ipvs/ip_vs_proto_udp.o
  CC [M]  net/sunrpc/auth_gss/gss_rpc_xdr.o
  CC [M]  net/dns_resolver/dns_query.o
  CC      net/sunrpc/socklib.o
  CC      drivers/pci/proc.o
  CC      kernel/time/timekeeping.o
  CC      mm/highmem.o
  CC [M]  drivers/video/fbdev/core/fb_defio.o
  CC      arch/x86/kernel/traps.o
  CC      net/ipv6/ndisc.o
  CC      net/ipv4/tcp_output.o
  CC [M]  net/netfilter/ipvs/ip_vs_nfct.o
  CC      net/ethtool/fec.o
  CC [M]  net/bluetooth/hci_core.o
  CC      crypto/crc32c_generic.o
  CC      net/core/rtnetlink.o
  CC      kernel/trace/trace.o
  CC      block/bfq-wf2q.o
  CC      lib/zstd/compress/zstd_ldm.o
  CC      drivers/pci/slot.o
  CC      net/core/utils.o
  AR      drivers/video/fbdev/omap2/omapfb/dss/built-in.a
  AR      drivers/video/fbdev/omap2/omapfb/displays/built-in.a
  AR      drivers/video/fbdev/omap2/omapfb/built-in.a
  AR      drivers/video/fbdev/omap2/built-in.a
  CC      arch/x86/kernel/idt.o
  CC      net/ethtool/eeprom.o
  CC      fs/nfs/fs_context.o
  CC [M]  sound/hda/trace.o
  LD [M]  net/dns_resolver/dns_resolver.o
  CC      net/ipv4/tcp_timer.o
  CC      net/handshake/tlshd.o
  CC      net/devres.o
  CC      mm/memory.o
  CC [M]  drivers/video/fbdev/uvesafb.o
  CC      net/ipv6/udp.o
  CC      crypto/crct10dif_common.o
  CC      net/core/link_watch.o
  CC [M]  arch/x86/kvm/mmu/tdp_mmu.o
  CC      block/bfq-cgroup.o
  CC      kernel/events/ring_buffer.o
  AR      kernel/bpf/built-in.a
  CC      net/ethtool/stats.o
  CC      net/ethtool/phc_vclocks.o
  CC [M]  drivers/video/fbdev/core/fb_chrdev.o
  CC      drivers/video/nomodeset.o
  CC      net/ipv6/udplite.o
  CC [M]  net/sunrpc/auth_gss/trace.o
  CC      crypto/crct10dif_generic.o
  AR      fs/hostfs/built-in.a
  CC      fs/ext4/inline.o
  CC      fs/debugfs/inode.o
  CC      fs/tracefs/inode.o
  AR      io_uring/built-in.a
  CC      drivers/pci/pci-acpi.o
  CC      arch/x86/kernel/irq.o
  CC [M]  net/netfilter/ipvs/ip_vs_rr.o
  CC      lib/zstd/compress/zstd_opt.o
  CC      kernel/time/ntp.o
  CC      fs/btrfs/super.o
  CC      net/ipv6/raw.o
  CC [M]  drivers/video/fbdev/core/fb_procfs.o
  CC      net/ipv6/icmp.o
  CC [M]  sound/hda/hdac_component.o
  CC      drivers/video/hdmi.o
  CC      arch/x86/kernel/irq_64.o
  CC      crypto/authenc.o
  CC      net/bridge/br_netlink_tunnel.o
  CC      net/core/filter.o
  CC      net/handshake/trace.o
  CC      net/core/sock_diag.o
  CC      net/core/dev_ioctl.o
  CC      net/bridge/br_arp_nd_proxy.o
  CC      lib/zstd/zstd_decompress_module.o
  AR      net/xfrm/built-in.a
  CC      net/socket.o
  CC      arch/x86/kernel/dumpstack_64.o
  CC      block/blk-mq-pci.o
  AR      fs/tracefs/built-in.a
  CC [M]  sound/hda/hdac_i915.o
  CC      fs/debugfs/file.o
  CC      kernel/time/clocksource.o
  CC      net/ethtool/mm.o
  CC      arch/x86/kernel/time.o
  CC      net/ethtool/module.o
  CC [M]  net/bluetooth/hci_conn.o
  CC [M]  drivers/video/fbdev/core/fbsysfs.o
  CC [M]  net/bluetooth/hci_event.o
  CC      fs/btrfs/ctree.o
  CC [M]  arch/x86/kvm/smm.o
  LD [M]  net/netfilter/ipvs/ip_vs.o
  AR      sound/x86/built-in.a
  CC      net/netfilter/nf_log.o
  CC      drivers/pci/quirks.o
  CC      net/ethtool/pse-pd.o
  CC      kernel/panic.o
  CC      lib/zstd/decompress/huf_decompress.o
  CC      block/blk-mq-virtio.o
  CC      crypto/authencesn.o
  CC      kernel/cgroup/freezer.o
  CC      crypto/lzo.o
  CC      fs/nfs/sysctl.o
  CC      kernel/events/callchain.o
  CC      kernel/cgroup/legacy_freezer.o
  CC [M]  drivers/video/fbdev/core/fbcon.o
  CC [M]  sound/hda/intel-dsp-config.o
  CC      net/sunrpc/xprtsock.o
  CC      mm/mincore.o
  CC      fs/ext4/inode.o
  AR      net/handshake/built-in.a
  CC      mm/mlock.o
  CC      net/sunrpc/sched.o
  CC [M]  arch/x86/kvm/vmx/vmx.o
  CC      kernel/time/jiffies.o
  CC      arch/x86/kernel/ioport.o
  CC [M]  arch/x86/kvm/kvm-asm-offsets.s
  AR      fs/debugfs/built-in.a
  CC      net/sunrpc/auth.o
  CC [M]  drivers/video/fbdev/simplefb.o
  CC      net/compat.o
  CC [M]  drivers/video/fbdev/core/bitblit.o
  CC      net/bridge/br_sysfs_if.o
  CC      block/blk-mq-debugfs.o
  CC [M]  arch/x86/kvm/vmx/pmu_intel.o
  CC [M]  net/sunrpc/auth_gss/gss_krb5_mech.o
  CC      net/ipv6/mcast.o
  CC [M]  net/bluetooth/mgmt.o
  CC      net/ethtool/plca.o
  CC [M]  net/bluetooth/hci_sock.o
  CC      fs/btrfs/extent-tree.o
  CC      kernel/cgroup/pids.o
  CC      kernel/cgroup/cpuset.o
  CC      net/ipv6/reassembly.o
  CC      kernel/time/timer_list.o
  CC      crypto/lzo-rle.o
  CC      net/bridge/br_sysfs_br.o
  CC      fs/nfs/nfs2super.o
  CC      net/core/tso.o
  CC [M]  sound/hda/intel-nhlt.o
  CC      net/netfilter/nf_queue.o
  CC [M]  net/bluetooth/hci_sysfs.o
  CC      net/ipv4/tcp_ipv4.o
  CC      mm/mmap.o
  CC      arch/x86/kernel/dumpstack.o
  CC [M]  arch/x86/kvm/vmx/vmcs12.o
  CC [M]  net/sunrpc/auth_gss/gss_krb5_seal.o
  CC      arch/x86/kernel/nmi.o
  CC      net/sysctl_net.o
  CC      crypto/lz4.o
  CC      block/blk-pm.o
  CC      net/core/sock_reuseport.o
  CC      kernel/time/timeconv.o
  CC [M]  sound/hda/intel-sdw-acpi.o
  CC      net/bridge/br_nf_core.o
  AR      net/ethtool/built-in.a
  CC      fs/nfs/proc.o
  CC      fs/nfs/nfs2xdr.o
  CC      kernel/trace/trace_output.o
  CC      fs/nfs/nfs3super.o
  CC      kernel/trace/trace_seq.o
  CC      kernel/trace/trace_stat.o
  CC      mm/mmu_gather.o
  CC      kernel/time/timecounter.o
  CC      arch/x86/kernel/ldt.o
  CC      crypto/lz4hc.o
  CC      crypto/xxhash_generic.o
  CC      drivers/pci/ats.o
  CC [M]  drivers/video/fbdev/core/softcursor.o
  CC [M]  net/sunrpc/auth_gss/gss_krb5_unseal.o
  CC      kernel/time/alarmtimer.o
  CC      kernel/time/posix-timers.o
  CC      net/ipv6/tcp_ipv6.o
  CC      block/holder.o
  CC      net/ipv6/ping.o
  CC      net/bridge/br_multicast.o
  CC      net/bridge/br_mdb.o
  LD [M]  sound/hda/snd-hda-core.o
  CC      net/netfilter/nf_sockopt.o
  LD [M]  sound/hda/snd-intel-dspcfg.o
  LD [M]  sound/hda/snd-intel-sdw-acpi.o
  CC      kernel/trace/trace_printk.o
  AR      sound/xen/built-in.a
  AR      sound/virtio/built-in.a
  CC      sound/sound_core.o
  CC [M]  net/bluetooth/l2cap_core.o
  CC      kernel/time/posix-cpu-timers.o
  CC      arch/x86/kernel/setup.o
  CC      crypto/rng.o
  CC      drivers/acpi/acpica/dsargs.o
  CC      drivers/acpi/apei/apei-base.o
  CC      drivers/pnp/pnpacpi/core.o
  CC      drivers/pnp/core.o
  CC      net/bridge/br_multicast_eht.o
  CC      net/bridge/br_vlan.o
  CC      sound/last.o
  CC [M]  net/sunrpc/auth_gss/gss_krb5_seqnum.o
  CC [M]  net/sunrpc/auth_gss/gss_krb5_wrap.o
  CC      drivers/pci/iov.o
  CC [M]  drivers/video/fbdev/core/tileblit.o
  AR      block/built-in.a
  CC [M]  drivers/video/fbdev/core/cfbfillrect.o
  CC      fs/nfs/nfs3client.o
  CC      drivers/acpi/acpica/dscontrol.o
  CC      lib/zstd/decompress/zstd_ddict.o
  AR      drivers/acpi/pmic/built-in.a
  CC      net/sunrpc/auth_null.o
  CC      crypto/drbg.o
  CC      net/sunrpc/auth_unix.o
  CC      drivers/pnp/card.o
  CC      arch/x86/kernel/x86_init.o
  CC      kernel/time/posix-clock.o
  CC      drivers/pnp/pnpacpi/rsparser.o
  CC      kernel/events/hw_breakpoint.o
  AR      sound/built-in.a
  CC      drivers/acpi/apei/hest.o
  CC      mm/mprotect.o
  CC      kernel/trace/pid_list.o
  CC [M]  net/sunrpc/auth_gss/gss_krb5_crypto.o
  CC      net/netfilter/utils.o
  CC      kernel/events/uprobes.o
  CC      drivers/acpi/acpica/dsdebug.o
  CC      net/sunrpc/svc.o
  CC      net/core/fib_notifier.o
  CC      arch/x86/kernel/i8259.o
  CC      mm/mremap.o
  CC      mm/msync.o
  CC      fs/ext4/ioctl.o
  CC      drivers/acpi/dptf/int340x_thermal.o
  CC      drivers/acpi/tables.o
  AR      kernel/cgroup/built-in.a
  CC      mm/page_vma_mapped.o
  CC      fs/ext4/mballoc.o
  CC      arch/x86/kernel/irqinit.o
  CC      kernel/time/itimer.o
  CC      drivers/acpi/acpica/dsfield.o
  CC [M]  drivers/video/fbdev/core/cfbcopyarea.o
  CC      arch/x86/kernel/jump_label.o
  CC      lib/cpumask.o
  CC      drivers/pci/pci-stub.o
  CC      drivers/pci/pci-label.o
  CC      drivers/acpi/apei/erst.o
  CC      fs/nfs/nfs3proc.o
  CC [M]  arch/x86/kvm/vmx/hyperv.o
  CC [M]  arch/x86/kvm/vmx/nested.o
  AR      drivers/acpi/dptf/built-in.a
  CC      drivers/acpi/blacklist.o
  CC      kernel/trace/trace_sched_switch.o
  CC      net/bridge/br_vlan_tunnel.o
  AR      drivers/pnp/pnpacpi/built-in.a
  CC      drivers/pnp/driver.o
  CC      net/ipv4/tcp_minisocks.o
  CC      kernel/cpu.o
  CC      kernel/exit.o
  CC      kernel/time/clockevents.o
  CC      arch/x86/kernel/irq_work.o
  CC      drivers/acpi/acpica/dsinit.o
  CC [M]  net/netfilter/nfnetlink.o
  CC      net/core/xdp.o
  CC      arch/x86/kernel/probe_roms.o
  CC [M]  net/sunrpc/auth_gss/gss_krb5_keys.o
  CC      net/core/flow_offload.o
  CC      lib/ctype.o
  CC      mm/pagewalk.o
  CC [M]  arch/x86/kvm/vmx/posted_intr.o
  CC      crypto/jitterentropy.o
  CC      kernel/time/tick-common.o
  CC      lib/dec_and_lock.o
  CC [M]  net/bluetooth/l2cap_sock.o
  CC      crypto/jitterentropy-kcapi.o
  CC      net/sunrpc/svcsock.o
  CC [M]  net/bluetooth/smp.o
  CC      mm/pgtable-generic.o
  CC      net/sunrpc/svcauth.o
  CC      drivers/pci/vgaarb.o
  CC      drivers/pnp/resource.o
  CC      drivers/acpi/acpica/dsmethod.o
  CC [M]  drivers/video/fbdev/core/cfbimgblt.o
  CC      net/ipv4/tcp_cong.o
  CC      crypto/ghash-generic.o
  CC      net/ipv6/exthdrs.o
  CC      mm/rmap.o
  CC      kernel/trace/trace_functions.o
  CC      kernel/time/tick-broadcast.o
  CC      kernel/softirq.o
  CC      drivers/acpi/apei/bert.o
  CC      fs/btrfs/print-tree.o
  CC      drivers/acpi/osi.o
  CC      fs/ext4/migrate.o
  CC      arch/x86/kernel/sys_ia32.o
  CC      net/core/gro.o
  AR      kernel/events/built-in.a
  CC      lib/decompress.o
  CC      mm/vmalloc.o
  CC      lib/decompress_bunzip2.o
  CC      drivers/acpi/acpica/dsmthdat.o
  CC      crypto/af_alg.o
  LD [M]  net/sunrpc/auth_gss/auth_rpcgss.o
  CC      mm/page_alloc.o
  LD [M]  net/sunrpc/auth_gss/rpcsec_gss_krb5.o
  CC      kernel/resource.o
  CC      net/sunrpc/svcauth_unix.o
  CC      arch/x86/kernel/signal_32.o
  CC [M]  drivers/video/fbdev/core/sysfillrect.o
  CC      net/bridge/br_vlan_options.o
  LD [M]  arch/x86/kvm/kvm.o
  CC      fs/nfs/nfs3xdr.o
  CC      net/sunrpc/addr.o
  CC      drivers/acpi/apei/ghes.o
  CC      drivers/acpi/acpica/dsobject.o
  CC      kernel/sysctl.o
  CC [M]  net/netfilter/nf_conntrack_core.o
  CC      net/bridge/br_mst.o
  CC      drivers/pnp/manager.o
  CC      crypto/algif_hash.o
  CC [M]  net/netfilter/nf_conntrack_standalone.o
  CC      lib/zstd/decompress/zstd_decompress.o
  CC      kernel/time/tick-broadcast-hrtimer.o
  CC      net/core/netdev-genl.o
  AR      drivers/pci/built-in.a
  AR      drivers/amba/built-in.a
  CC      kernel/trace/trace_preemptirq.o
  CC      crypto/algif_skcipher.o
  CC      net/ipv4/tcp_metrics.o
  CC      net/ipv6/datagram.o
  CC      net/ipv6/ip6_flowlabel.o
  CC      net/ipv6/inet6_connection_sock.o
  CC      drivers/pnp/support.o
  CC      drivers/acpi/acpica/dsopcode.o
  CC      net/sunrpc/rpcb_clnt.o
  CC      kernel/time/tick-oneshot.o
  CC      net/ipv4/tcp_fastopen.o
  CC      lib/decompress_inflate.o
  CC      arch/x86/kernel/sys_x86_64.o
  CC      lib/decompress_unlz4.o
  CC      lib/zstd/decompress/zstd_decompress_block.o
  CC      fs/ext4/mmp.o
  CC      fs/btrfs/root-tree.o
  CC [M]  drivers/video/fbdev/core/syscopyarea.o
  CC [M]  net/bluetooth/lib.o
  CC      drivers/pnp/interface.o
  CC      drivers/pnp/quirks.o
  CC      mm/init-mm.o
  CC      kernel/capability.o
  CC      kernel/time/tick-sched.o
  CC      drivers/acpi/acpica/dspkginit.o
  CC      kernel/ptrace.o
  CC      kernel/trace/trace_nop.o
  CC      net/ipv6/udp_offload.o
  CC      fs/ext4/move_extent.o
  CC      lib/decompress_unlzma.o
  CC      lib/decompress_unlzo.o
  AR      drivers/acpi/apei/built-in.a
  CC      mm/memblock.o
  CC      mm/memory_hotplug.o
  CC      lib/zstd/zstd_common_module.o
  CC      net/core/netdev-genl-gen.o
  CC      kernel/trace/trace_functions_graph.o
  CC      lib/zstd/common/debug.o
  CC      kernel/time/vsyscall.o
  CC      kernel/trace/fgraph.o
  CC [M]  net/bridge/br_netfilter_hooks.o
  AR      drivers/clk/actions/built-in.a
  CC      crypto/xor.o
  CC      drivers/dma/dw/core.o
  AR      drivers/clk/analogbits/built-in.a
  AR      drivers/clk/bcm/built-in.a
  AR      drivers/clk/imgtec/built-in.a
  AR      drivers/clk/imx/built-in.a
  AR      drivers/clk/ingenic/built-in.a
  AR      drivers/clk/mediatek/built-in.a
  CC      arch/x86/kernel/espfix_64.o
  AR      drivers/clk/microchip/built-in.a
  AR      drivers/clk/mstar/built-in.a
  AR      drivers/clk/mvebu/built-in.a
  CC      drivers/dma/dw/dw.o
  AR      drivers/clk/ralink/built-in.a
  AR      drivers/clk/renesas/built-in.a
  AR      drivers/clk/socfpga/built-in.a
  CC      arch/x86/kernel/ksysfs.o
  AR      drivers/clk/sprd/built-in.a
  AR      drivers/clk/starfive/built-in.a
  AR      drivers/clk/sunxi-ng/built-in.a
  CC      net/core/net-sysfs.o
  AR      drivers/clk/ti/built-in.a
  AR      drivers/clk/versatile/built-in.a
  CC      drivers/acpi/acpica/dsutils.o
  CC      drivers/clk/x86/clk-lpss-atom.o
  CC      lib/zstd/common/entropy_common.o
  CC      lib/zstd/common/error_private.o
  CC      net/ipv6/seg6.o
  CC      drivers/clk/x86/clk-pmc-atom.o
  CC      net/core/page_pool.o
  CC [M]  net/bluetooth/ecdh_helper.o
  CC      drivers/acpi/osl.o
  CC [M]  drivers/video/fbdev/core/sysimgblt.o
  CC      drivers/pnp/system.o
  CC      kernel/user.o
  CC [M]  net/netfilter/nf_conntrack_expect.o
  CC [M]  net/netfilter/nf_conntrack_helper.o
  CC      crypto/hash_info.o
  CC      kernel/signal.o
  CC      net/core/net-procfs.o
  CC      lib/zstd/common/fse_decompress.o
  CC      kernel/time/timekeeping_debug.o
  CC      crypto/simd.o
  CC      net/ipv6/fib6_notifier.o
  AR      drivers/soc/apple/built-in.a
  AR      drivers/soc/aspeed/built-in.a
  CC      drivers/virtio/virtio.o
  AR      drivers/soc/bcm/bcm63xx/built-in.a
  AR      drivers/soc/bcm/built-in.a
  AR      drivers/soc/fsl/built-in.a
  CC      kernel/time/namespace.o
  AR      drivers/soc/fujitsu/built-in.a
  CC      drivers/tty/vt/vt_ioctl.o
  AR      drivers/soc/imx/built-in.a
  AR      fs/nfs/built-in.a
  AR      drivers/soc/ixp4xx/built-in.a
  AR      drivers/soc/loongson/built-in.a
  CC      net/core/netpoll.o
  AR      drivers/soc/mediatek/built-in.a
  CC      drivers/dma/hsu/hsu.o
  AR      drivers/soc/microchip/built-in.a
  CC      kernel/sys.o
  CC      fs/btrfs/dir-item.o
  CC      fs/btrfs/file-item.o
  AR      drivers/soc/nuvoton/built-in.a
  AR      drivers/soc/pxa/built-in.a
  CC      drivers/acpi/acpica/dswexec.o
  AR      drivers/soc/amlogic/built-in.a
  AR      drivers/soc/qcom/built-in.a
  CC      drivers/acpi/acpica/dswload.o
  AR      drivers/soc/renesas/built-in.a
  CC      drivers/tty/hvc/hvc_console.o
  CC      net/ipv4/tcp_rate.o
  CC      drivers/tty/serial/8250/8250_core.o
  AR      drivers/soc/rockchip/built-in.a
  AR      drivers/pnp/built-in.a
  AR      drivers/soc/sifive/built-in.a
  CC      kernel/trace/blktrace.o
  AR      drivers/soc/sunxi/built-in.a
  CC      arch/x86/kernel/bootflag.o
  CC      drivers/virtio/virtio_ring.o
  AR      drivers/soc/ti/built-in.a
  AR      drivers/soc/xilinx/built-in.a
  AR      drivers/clk/x86/built-in.a
  AR      drivers/soc/built-in.a
  AR      drivers/clk/xilinx/built-in.a
  CC      drivers/clk/clk-devres.o
  CC      drivers/tty/serial/8250/8250_pnp.o
  CC [M]  net/bluetooth/hci_request.o
  CC      drivers/acpi/utils.o
  CC      drivers/tty/serial/serial_core.o
  CC      net/ipv6/rpl.o
  CC      net/sunrpc/timer.o
  CC      drivers/acpi/acpica/dswload2.o
  CC      drivers/dma/dw/idma32.o
  CC      drivers/dma/dw/acpi.o
  CC [M]  crypto/md4.o
  CC      net/ipv4/tcp_recovery.o
  CC [M]  drivers/video/fbdev/core/fb_sys_fops.o
  UPD     arch/x86/kvm/kvm-asm-offsets.h
  CC [M]  net/bluetooth/mgmt_util.o
  CC      net/ipv6/ioam6.o
  CC      kernel/trace/trace_events.o
  CC      drivers/char/hw_random/core.o
  CC      drivers/clk/clk-bulk.o
  CC      lib/zstd/common/zstd_common.o
  CC      drivers/dma/dw/pci.o
  AR      kernel/time/built-in.a
  CC      drivers/char/agp/backend.o
  CC      drivers/char/tpm/tpm-chip.o
  CC      arch/x86/kernel/e820.o
  CC      drivers/char/tpm/tpm-dev-common.o
  CC      net/core/fib_rules.o
  CC      drivers/char/tpm/tpm-dev.o
  CC      arch/x86/kernel/pci-dma.o
  CC [M]  net/bluetooth/mgmt_config.o
  CC      drivers/acpi/reboot.o
  CC      drivers/acpi/acpica/dswscope.o
  AR      drivers/dma/hsu/built-in.a
  AR      drivers/dma/idxd/built-in.a
  CC      drivers/tty/serial/8250/8250_port.o
  CC      drivers/tty/serial/8250/8250_dma.o
  CC      net/core/net-traces.o
  CC      net/ipv6/sysctl_net_ipv6.o
  CC [M]  net/bluetooth/hci_codec.o
  AR      drivers/tty/hvc/built-in.a
  CC [M]  crypto/ccm.o
  CC      fs/pstore/inode.o
  CC [M]  crypto/arc4.o
  CC      drivers/tty/vt/vc_screen.o
  CC [M]  crypto/ecc.o
  CC      fs/pstore/platform.o
  CC      fs/ext4/namei.o
  CC [M]  net/netfilter/nf_conntrack_proto.o
  AS [M]  arch/x86/kvm/vmx/vmenter.o
  CC      drivers/virtio/virtio_anchor.o
  CC      drivers/clk/clkdev.o
  CC      fs/ext4/page-io.o
  CC      net/sunrpc/xdr.o
  CC      net/core/selftests.o
  CC      drivers/acpi/nvs.o
  CC      drivers/acpi/acpica/dswstate.o
  AR      drivers/dma/dw/built-in.a
  LD [M]  drivers/video/fbdev/core/fb.o
  AR      drivers/dma/mediatek/built-in.a
  AR      drivers/dma/qcom/built-in.a
  AR      drivers/dma/ti/built-in.a
  AR      drivers/dma/xilinx/built-in.a
  CC      fs/btrfs/inode-item.o
  AR      drivers/video/fbdev/core/built-in.a
  AR      drivers/video/fbdev/built-in.a
  CC      drivers/char/hw_random/intel-rng.o
  CC [M]  drivers/dma/ioat/init.o
  AR      drivers/video/built-in.a
  CC [M]  drivers/dma/ioat/dma.o
  CC      fs/ext4/readpage.o
  CC      drivers/char/agp/generic.o
  CC      drivers/char/agp/isoch.o
  CC [M]  net/bridge/br_netfilter_ipv6.o
  CC      drivers/acpi/acpica/evevent.o
  CC      net/ipv4/tcp_ulp.o
  CC      drivers/char/tpm/tpm-interface.o
  CC      kernel/umh.o
  CC      net/sunrpc/sunrpc_syms.o
  CC      net/core/ptp_classifier.o
  CC [M]  net/bluetooth/eir.o
  CC [M]  drivers/dma/ioat/prep.o
  AR      drivers/iommu/amd/built-in.a
  CC      drivers/virtio/virtio_pci_modern_dev.o
  CC      drivers/iommu/intel/dmar.o
  CC      drivers/virtio/virtio_pci_legacy_dev.o
  AR      drivers/gpu/host1x/built-in.a
  CC      drivers/clk/clk.o
  CC      drivers/tty/serial/8250/8250_dwlib.o
  AR      drivers/gpu/drm/tests/built-in.a
  CC [M]  drivers/gpu/drm/tests/drm_kunit_helpers.o
  LD [M]  arch/x86/kvm/kvm-intel.o
  CC      fs/pstore/pmsg.o
  CC [M]  drivers/gpu/drm/tests/drm_buddy_test.o
  CC      fs/btrfs/disk-io.o
  CC      arch/x86/kernel/quirks.o
  AR      lib/zstd/built-in.a
  CC      lib/decompress_unxz.o
  CC      drivers/tty/vt/selection.o
  CC      drivers/acpi/acpica/evgpe.o
  CC      drivers/tty/vt/keyboard.o
  CC      drivers/char/agp/intel-agp.o
  CC      net/core/netprio_cgroup.o
  CC      drivers/char/tpm/tpm1-cmd.o
  AR      drivers/iommu/arm/arm-smmu/built-in.a
  AR      drivers/iommu/arm/arm-smmu-v3/built-in.a
  AR      drivers/iommu/arm/built-in.a
  AR      drivers/char/hw_random/built-in.a
  CC      drivers/dma/dmaengine.o
  AR      drivers/iommu/iommufd/built-in.a
  AR      drivers/tty/ipwireless/built-in.a
  CC      net/sunrpc/cache.o
  CC      mm/madvise.o
  CC      net/sunrpc/rpc_pipe.o
  CC      fs/ext4/resize.o
  CC      drivers/tty/serial/earlycon.o
  CC      drivers/iommu/iommu.o
  AR      fs/pstore/built-in.a
  CC [M]  drivers/gpu/drm/tests/drm_cmdline_parser_test.o
  CC      net/core/dst_cache.o
  CC      net/ipv6/xfrm6_policy.o
  CC      drivers/acpi/wakeup.o
  CC      lib/decompress_unzstd.o
  CC      arch/x86/kernel/topology.o
  CC      drivers/acpi/sleep.o
  CC      drivers/acpi/acpica/evgpeblk.o
  CC      drivers/char/tpm/tpm2-cmd.o
  CC      fs/ext4/super.o
  CC      fs/efivarfs/inode.o
  CC      drivers/virtio/virtio_mmio.o
  CC      fs/efivarfs/file.o
  CC [M]  net/netfilter/nf_conntrack_proto_generic.o
  CC      drivers/virtio/virtio_pci_modern.o
  CC [M]  net/bluetooth/hci_sync.o
  CC [M]  net/bluetooth/coredump.o
  CC      drivers/tty/serial/8250/8250_pcilib.o
  CC [M]  net/bluetooth/sco.o
  CC      net/ipv4/tcp_offload.o
  CC [M]  drivers/dma/ioat/dca.o
  CC      drivers/virtio/virtio_pci_common.o
  AR      net/bridge/built-in.a
  LD [M]  net/bridge/br_netfilter.o
  CC      drivers/char/mem.o
  CC      drivers/tty/tty_io.o
  CC      drivers/acpi/device_sysfs.o
  CC      drivers/char/agp/intel-gtt.o
  CC      net/ipv4/tcp_plb.o
  AR      drivers/gpu/vga/built-in.a
  CC      net/ipv4/datagram.o
  CC      drivers/char/random.o
  CC      kernel/workqueue.o
  CC [M]  crypto/essiv.o
  CC      arch/x86/kernel/kdebugfs.o
  CC      kernel/trace/trace_export.o
  CC      lib/dump_stack.o
  CC      mm/page_io.o
  CC      kernel/pid.o
  CC      drivers/virtio/virtio_pci_legacy.o
  CC      net/core/gro_cells.o
  CC      drivers/acpi/acpica/evgpeinit.o
  CC      fs/efivarfs/super.o
  CC      kernel/trace/trace_event_perf.o
  CC      drivers/tty/serial/8250/8250_pci.o
  CC [M]  drivers/dma/ioat/sysfs.o
  CC [M]  drivers/virtio/virtio_mem.o
  CC      net/core/failover.o
  CC      drivers/clk/clk-divider.o
  CC [M]  net/bluetooth/iso.o
  CC      arch/x86/kernel/alternative.o
  CC      drivers/acpi/acpica/evgpeutil.o
  CC      drivers/char/tpm/tpmrm-dev.o
  CC      drivers/iommu/intel/iommu.o
  CC      drivers/tty/vt/consolemap.o
  CC      drivers/char/tpm/tpm2-space.o
  CC      lib/earlycpio.o
  CC      drivers/char/tpm/tpm-sysfs.o
  CC      arch/x86/kernel/i8253.o
  CC [M]  net/netfilter/nf_conntrack_proto_tcp.o
  CC      net/ipv6/xfrm6_state.o
  CC      drivers/char/misc.o
  CC      arch/x86/kernel/hw_breakpoint.o
  CC      lib/extable.o
  CC      drivers/acpi/device_pm.o
  CC      drivers/char/tpm/eventlog/common.o
  CC      drivers/char/virtio_console.o
  CC [M]  crypto/ecdh.o
  CC      kernel/task_work.o
  AR      drivers/char/agp/built-in.a
  CC      drivers/char/hpet.o
  CC      lib/flex_proportions.o
  CC      fs/efivarfs/vars.o
  CC      lib/idr.o
  CC      drivers/iommu/iommu-traces.o
  CC      drivers/acpi/acpica/evglock.o
  CC      net/ipv6/xfrm6_input.o
  LD [M]  drivers/dma/ioat/ioatdma.o
  HOSTCC  drivers/tty/vt/conmakehash
  CC      net/ipv4/raw.o
  CC      drivers/dma/virt-dma.o
  CC [M]  drivers/gpu/drm/tests/drm_connector_test.o
  CC      mm/swap_state.o
  CC      kernel/trace/trace_events_filter.o
  CC      mm/swapfile.o
  CC      drivers/tty/serial/serial_mctrl_gpio.o
  CC      drivers/clk/clk-fixed-factor.o
  CC      drivers/acpi/proc.o
  CC      drivers/connector/cn_queue.o
  CC      drivers/char/nvram.o
  CC      drivers/acpi/bus.o
  CC      drivers/acpi/glue.o
  CC      drivers/iommu/iommu-sysfs.o
  CC      mm/swap_slots.o
  AR      drivers/virtio/built-in.a
  CC      drivers/dma/acpi-dma.o
  CC [M]  crypto/ecdh_helper.o
  CC      lib/irq_regs.o
  CC      net/sunrpc/sysfs.o
  CC      arch/x86/kernel/tsc.o
  CC      mm/dmapool.o
  CC      drivers/char/tpm/eventlog/tpm1.o
  CC      mm/hugetlb.o
  CC      drivers/acpi/acpica/evhandler.o
  CC      drivers/tty/vt/vt.o
  CC      drivers/clk/clk-fixed-rate.o
  CC      lib/is_single_threaded.o
  CC [M]  fs/netfs/buffered_read.o
  CC [M]  fs/fscache/cache.o
  CC      net/ipv6/xfrm6_output.o
  CC      net/ipv6/xfrm6_protocol.o
  CC      drivers/tty/serial/8250/8250_exar.o
  AR      fs/efivarfs/built-in.a
  CC [M]  fs/netfs/io.o
  CC      arch/x86/kernel/tsc_msr.o
  CC [M]  drivers/gpu/drm/tests/drm_damage_helper_test.o
  LD [M]  crypto/ecdh_generic.o
  AR      crypto/built-in.a
  CC      net/sunrpc/svc_xprt.o
  CC      lib/klist.o
  CC      drivers/iommu/dma-iommu.o
  CC      drivers/acpi/scan.o
  CC      kernel/extable.o
  CC      kernel/params.o
  CC      drivers/acpi/acpica/evmisc.o
  CC      drivers/iommu/iova.o
  CC [M]  net/netfilter/nf_conntrack_proto_udp.o
  CC      arch/x86/kernel/io_delay.o
  CC [M]  drivers/gpu/drm/tests/drm_dp_mst_helper_test.o
  CC      drivers/acpi/acpica/evregion.o
  CC      drivers/acpi/acpica/evrgnini.o
  CC      drivers/connector/connector.o
  AR      drivers/gpu/drm/arm/built-in.a
  CC      kernel/kthread.o
  CC [M]  drivers/gpu/drm/tests/drm_format_helper_test.o
  CC      drivers/iommu/irq_remapping.o
  AR      drivers/dma/built-in.a
  CC      drivers/base/power/sysfs.o
  CC      drivers/clk/clk-gate.o
  CC      drivers/base/power/generic_ops.o
  CC      drivers/base/firmware_loader/builtin/main.o
  CC      drivers/char/tpm/eventlog/tpm2.o
  CC      lib/kobject.o
  CC      kernel/sys_ni.o
  CC [M]  net/bluetooth/a2mp.o
  CC [M]  drivers/gpu/drm/tests/drm_format_test.o
  AR      net/core/built-in.a
  CC      mm/hugetlb_vmemmap.o
  CC      drivers/base/firmware_loader/main.o
  CC      drivers/connector/cn_proc.o
  CC      drivers/tty/serial/8250/8250_early.o
  COPY    drivers/tty/vt/defkeymap.c
  CC      fs/btrfs/transaction.o
  CC      arch/x86/kernel/rtc.o
  CC [M]  fs/netfs/iterator.o
  CC [M]  fs/fscache/cookie.o
  CC      drivers/acpi/acpica/evsci.o
  CC      drivers/tty/n_tty.o
  CC      arch/x86/kernel/resource.o
  AR      drivers/base/firmware_loader/builtin/built-in.a
  AS      arch/x86/kernel/irqflags.o
  CC      drivers/char/tpm/tpm_ppi.o
  CC      drivers/acpi/resource.o
  CC [M]  fs/netfs/main.o
  CC      kernel/trace/trace_events_trigger.o
  CC      kernel/trace/trace_eprobe.o
  CC [M]  drivers/gpu/drm/tests/drm_framebuffer_test.o
  CC      drivers/clk/clk-multiplier.o
  CC      kernel/nsproxy.o
  CC      drivers/base/power/common.o
  CC      net/ipv4/udp.o
  CC      kernel/notifier.o
  CC      drivers/char/tpm/eventlog/acpi.o
  CC [M]  drivers/gpu/drm/tests/drm_managed_test.o
  CC      drivers/char/tpm/eventlog/efi.o
  CC      drivers/acpi/acpica/evxface.o
  CC      drivers/char/tpm/tpm_crb.o
  CC      net/ipv6/netfilter.o
  CC [M]  fs/netfs/objects.o
  CC      net/ipv6/fib6_rules.o
  CC      kernel/ksysfs.o
  CC      net/sunrpc/xprtmultipath.o
  CC      kernel/cred.o
  CC      drivers/tty/serial/8250/8250_dw.o
  CC      lib/kobject_uevent.o
  CC      lib/logic_pio.o
  CC      kernel/trace/trace_kprobe.o
  CC      arch/x86/kernel/static_call.o
  CC      kernel/reboot.o
  CC [M]  net/netfilter/nf_conntrack_proto_icmp.o
  CC      drivers/clk/clk-mux.o
  CC      drivers/iommu/intel/pasid.o
  CC      drivers/base/power/qos.o
  CC      mm/sparse.o
  CC      drivers/acpi/acpi_processor.o
  CC      mm/sparse-vmemmap.o
  CC      fs/btrfs/inode.o
  CC      drivers/base/power/runtime.o
  CC [M]  net/netfilter/nf_conntrack_extend.o
  CC [M]  drivers/gpu/drm/tests/drm_mm_test.o
  AR      drivers/base/firmware_loader/built-in.a
  CC      drivers/base/regmap/regmap.o
  CC      drivers/acpi/processor_core.o
  CC      drivers/base/regmap/regcache.o
  CC      drivers/acpi/acpica/evxfevnt.o
  CC [M]  net/bluetooth/amp.o
  CC [M]  net/bluetooth/hci_debugfs.o
  AR      drivers/connector/built-in.a
  CC      kernel/async.o
  CC      drivers/clk/clk-composite.o
  CC      arch/x86/kernel/process.o
  CC      drivers/acpi/processor_pdc.o
  CC [M]  drivers/gpu/drm/tests/drm_modes_test.o
  CC [M]  drivers/gpu/drm/tests/drm_plane_helper_test.o
  LD [M]  fs/netfs/netfs.o
  CC [M]  net/netfilter/nf_conntrack_acct.o
  CC      net/ipv6/proc.o
  AR      drivers/char/tpm/built-in.a
  AR      drivers/char/built-in.a
  CC [M]  fs/smb/common/cifs_arc4.o
  CC      mm/mmu_notifier.o
  CC      kernel/range.o
  CC      lib/maple_tree.o
  CC      net/sunrpc/stats.o
  CC      net/ipv6/syncookies.o
  CC      kernel/smpboot.o
  CC      lib/memcat_p.o
  CC      drivers/acpi/acpica/evxfgpe.o
  CC [M]  fs/fscache/io.o
  CC [M]  net/netfilter/nf_conntrack_seqadj.o
  CC      drivers/tty/serial/8250/8250_lpss.o
  CC      drivers/acpi/ec.o
  CC      drivers/base/power/wakeirq.o
  CC      drivers/base/regmap/regcache-rbtree.o
  CC      drivers/clk/clk-fractional-divider.o
  CC      lib/nmi_backtrace.o
  CC      lib/plist.o
  CC      lib/radix-tree.o
  CONMK   drivers/tty/vt/consolemap_deftbl.c
  CC      drivers/tty/vt/defkeymap.o
  CC      lib/ratelimit.o
  CC [M]  fs/smb/common/cifs_md4.o
  CC      drivers/acpi/acpica/evxfregn.o
  CC      drivers/tty/tty_ioctl.o
  CC      fs/ext4/symlink.o
  CC      drivers/acpi/acpica/exconcat.o
  CC      net/ipv6/mip6.o
  CC      drivers/tty/vt/consolemap_deftbl.o
  CC      drivers/iommu/intel/trace.o
  CC      net/ipv4/udplite.o
  CC      net/sunrpc/sysctl.o
  CC      drivers/iommu/intel/cap_audit.o
  CC      arch/x86/kernel/ptrace.o
  CC      arch/x86/kernel/tls.o
  CC      arch/x86/kernel/step.o
  CC      drivers/iommu/intel/irq_remapping.o
  AR      drivers/tty/vt/built-in.a
  CC      net/ipv4/udp_offload.o
  CC      drivers/block/loop.o
  CC      drivers/acpi/dock.o
  CC      drivers/acpi/pci_root.o
  CC      net/ipv6/addrconf_core.o
  CC      drivers/tty/tty_ldisc.o
  CC      drivers/block/virtio_blk.o
  CC      drivers/base/regmap/regcache-flat.o
  CC      drivers/acpi/acpica/exconfig.o
  CC      drivers/base/power/main.o
  CC [M]  fs/smb/client/trace.o
  CC      drivers/base/regmap/regcache-maple.o
  CC      drivers/base/power/wakeup.o
  CC      kernel/ucount.o
  CC      drivers/tty/tty_buffer.o
  CC      drivers/tty/serial/8250/8250_mid.o
  CC      drivers/tty/tty_port.o
  CC      drivers/clk/clk-gpio.o
  CC      drivers/tty/tty_mutex.o
  CC [M]  fs/fscache/main.o
  AR      drivers/misc/eeprom/built-in.a
  AR      drivers/misc/cb710/built-in.a
  AR      drivers/misc/ti-st/built-in.a
  CC      drivers/mfd/mfd-core.o
  AR      drivers/misc/lis3lv02d/built-in.a
  CC [M]  net/netfilter/nf_conntrack_proto_icmpv6.o
  AR      drivers/misc/cardreader/built-in.a
  CC [M]  fs/fscache/volume.o
  CC [M]  drivers/misc/mei/hdcp/mei_hdcp.o
  CC [M]  drivers/misc/mei/pxp/mei_pxp.o
  CC      arch/x86/kernel/i8237.o
  CC      drivers/tty/tty_ldsem.o
  AR      drivers/misc/built-in.a
  CC      kernel/trace/error_report-traces.o
  CC      fs/btrfs/file.o
  CC      kernel/trace/power-traces.o
  CC      drivers/acpi/acpica/exconvrt.o
  CC      drivers/acpi/pci_link.o
  CC      drivers/iommu/intel/perfmon.o
  CC      drivers/acpi/acpica/excreate.o
  LD [M]  net/bluetooth/bluetooth.o
  CC [M]  net/netfilter/nf_conntrack_proto_dccp.o
  CC [M]  net/netfilter/nf_conntrack_proto_sctp.o
  AR      drivers/nfc/built-in.a
  AR      drivers/dax/hmem/built-in.a
  CC      drivers/dax/super.o
  CC [M]  net/netfilter/nf_conntrack_netlink.o
  CC [M]  drivers/gpu/drm/tests/drm_probe_helper_test.o
  CC      kernel/trace/rpm-traces.o
  CC      drivers/base/regmap/regmap-debugfs.o
  CC      net/ipv6/exthdrs_core.o
  AR      drivers/clk/built-in.a
  CC [M]  net/netfilter/nf_nat_core.o
  CC      drivers/base/power/wakeup_stats.o
  CC      net/ipv6/ip6_checksum.o
  AR      net/sunrpc/built-in.a
  CC      kernel/trace/trace_dynevent.o
  CC      arch/x86/kernel/stacktrace.o
  CC      drivers/dma-buf/dma-buf.o
  CC      drivers/tty/tty_baudrate.o
  AR      drivers/cxl/core/built-in.a
  AR      drivers/cxl/built-in.a
  CC      drivers/dma-buf/dma-fence.o
  CC      drivers/base/power/domain.o
  CC      drivers/tty/serial/8250/8250_pericom.o
  CC [M]  drivers/gpu/drm/tests/drm_rect_test.o
  CC      net/ipv6/ip6_icmp.o
  CC      arch/x86/kernel/reboot.o
  CC      drivers/acpi/acpica/exdebug.o
  CC      fs/btrfs/defrag.o
  CC [M]  drivers/misc/mei/init.o
  CC      drivers/mfd/intel-lpss.o
  CC      drivers/mfd/intel-lpss-pci.o
  CC      net/ipv6/output_core.o
  CC [M]  drivers/block/nbd.o
  CC      net/ipv4/arp.o
  CC [M]  drivers/misc/mei/hbm.o
  AR      drivers/macintosh/built-in.a
  CC      drivers/scsi/scsi.o
  CC      net/ipv4/icmp.o
  CC      drivers/scsi/hosts.o
  CC      drivers/base/power/domain_governor.o
  CC      drivers/dax/bus.o
  CC      lib/rbtree.o
  CC      lib/seq_buf.o
  CC [M]  fs/fscache/proc.o
  CC      net/ipv6/protocol.o
  CC [M]  drivers/misc/mei/interrupt.o
  CC      drivers/acpi/acpica/exdump.o
  CC      drivers/mfd/intel-lpss-acpi.o
  CC      mm/ksm.o
  CC      fs/btrfs/extent_map.o
  CC      arch/x86/kernel/msr.o
  CC      fs/ext4/sysfs.o
  CC      drivers/nvme/host/core.o
  AR      drivers/tty/serial/8250/built-in.a
  AR      drivers/tty/serial/built-in.a
  CC      drivers/tty/tty_jobctrl.o
  AR      drivers/nvme/target/built-in.a
  CC      kernel/trace/trace_probe.o
  AR      drivers/gpu/drm/display/built-in.a
  CC [M]  drivers/gpu/drm/display/drm_display_helper_mod.o
  CC [M]  drivers/gpu/drm/display/drm_dp_dual_mode_helper.o
  CC      drivers/base/regmap/regmap-i2c.o
  CC      net/ipv6/ip6_offload.o
  CC      drivers/mfd/intel_soc_pmic_crc.o
  CC [M]  drivers/gpu/drm/display/drm_dp_helper.o
  CC [M]  drivers/gpu/drm/display/drm_dp_mst_topology.o
  AR      drivers/iommu/intel/built-in.a
  AR      drivers/iommu/built-in.a
  CC [M]  drivers/mfd/lpc_sch.o
  CC      drivers/base/regmap/regmap-irq.o
  AR      drivers/gpu/drm/renesas/rcar-du/built-in.a
  AR      drivers/gpu/drm/renesas/built-in.a
  CC      drivers/acpi/acpica/exfield.o
  AR      drivers/gpu/drm/omapdrm/built-in.a
  AR      drivers/gpu/drm/tilcdc/built-in.a
  CC      drivers/base/power/clock_ops.o
  CC      drivers/acpi/pci_irq.o
  AR      drivers/gpu/drm/imx/built-in.a
  CC      lib/show_mem.o
  CC [M]  drivers/misc/mei/client.o
  CC      kernel/trace/trace_uprobe.o
  CC      drivers/dma-buf/dma-fence-array.o
  AR      drivers/gpu/drm/i2c/built-in.a
  AR      drivers/gpu/drm/panel/built-in.a
  AR      drivers/gpu/drm/bridge/analogix/built-in.a
  AR      drivers/gpu/drm/bridge/cadence/built-in.a
  AR      drivers/gpu/drm/bridge/imx/built-in.a
  CC [M]  drivers/mfd/lpc_ich.o
  AR      drivers/gpu/drm/bridge/synopsys/built-in.a
  CC      drivers/dma-buf/dma-fence-chain.o
  AR      drivers/gpu/drm/bridge/built-in.a
  CC      drivers/acpi/acpica/exfldio.o
  CC      drivers/dma-buf/dma-fence-unwrap.o
  LD [M]  fs/fscache/fscache.o
  CC      drivers/dma-buf/dma-resv.o
  AR      drivers/gpu/drm/hisilicon/built-in.a
  CC [M]  drivers/gpu/drm/display/drm_dsc_helper.o
  CC [M]  fs/fuse/dev.o
  AR      drivers/gpu/drm/mxsfb/built-in.a
  CC      drivers/scsi/scsi_ioctl.o
  CC      lib/siphash.o
  CC      arch/x86/kernel/cpuid.o
  CC [M]  drivers/misc/mei/main.o
  CC      drivers/dma-buf/sync_file.o
  CC [M]  fs/fuse/dir.o
  CC      lib/string.o
  CC [M]  drivers/gpu/drm/display/drm_hdcp_helper.o
  CC      fs/ext4/xattr.o
  CC [M]  fs/overlayfs/super.o
  CC      drivers/tty/n_null.o
  CC [M]  fs/overlayfs/namei.o
  CC [M]  drivers/gpu/drm/display/drm_hdmi_helper.o
  CC      drivers/tty/pty.o
  AR      drivers/mfd/built-in.a
  CC      drivers/acpi/acpi_lpss.o
  AR      drivers/gpu/drm/tiny/built-in.a
  CC      drivers/acpi/acpi_apd.o
  AR      drivers/base/power/built-in.a
  CC      drivers/ata/libata-core.o
  AR      drivers/base/test/built-in.a
  CC      drivers/spi/spi.o
  CC      drivers/ata/libata-scsi.o
  CC      drivers/ata/libata-eh.o
  AR      drivers/dax/built-in.a
  CC      drivers/base/component.o
  CC      drivers/acpi/acpica/exmisc.o
  CC      drivers/tty/sysrq.o
  CC      drivers/dma-buf/sw_sync.o
  CC      drivers/scsi/scsicam.o
  CC [M]  fs/smb/client/cifsfs.o
  CC      arch/x86/kernel/early-quirks.o
  CC      fs/btrfs/sysfs.o
  CC      drivers/net/phy/mdio-boardinfo.o
  AR      drivers/net/pse-pd/built-in.a
  CC      drivers/net/phy/mdio_devres.o
  CC      drivers/net/mdio/acpi_mdio.o
  AR      drivers/net/pcs/built-in.a
  CC [M]  drivers/gpu/drm/display/drm_scdc_helper.o
  CC      fs/btrfs/accessors.o
  CC      drivers/base/core.o
  CC      drivers/net/mdio/fwnode_mdio.o
  CC      fs/btrfs/xattr.o
  AR      drivers/base/regmap/built-in.a
  CC      net/ipv4/devinet.o
  CC      drivers/acpi/acpica/exmutex.o
  CC [M]  drivers/gpu/drm/display/drm_dp_aux_dev.o
  CC      kernel/trace/rethook.o
  CC      drivers/dma-buf/sync_debug.o
  CC      fs/btrfs/ordered-data.o
  CC      drivers/scsi/scsi_error.o
  CC      net/ipv6/tcpv6_offload.o
  CC [M]  net/netfilter/nf_nat_proto.o
  CC [M]  fs/overlayfs/util.o
  CC [M]  fs/overlayfs/inode.o
  CC      drivers/base/bus.o
  CC [M]  drivers/misc/mei/dma-ring.o
  CC      fs/open.o
  CC      drivers/net/phy/phy.o
  CC [M]  fs/overlayfs/file.o
  CC      drivers/acpi/acpica/exnames.o
  CC [M]  drivers/dma-buf/selftest.o
  CC      fs/btrfs/extent_io.o
  CC      drivers/net/phy/phy-c45.o
  CC [M]  fs/smb/client/cifs_debug.o
  AR      drivers/tty/built-in.a
  CC [M]  drivers/dma-buf/st-dma-fence.o
  CC      fs/ext4/xattr_hurd.o
  CC [M]  drivers/misc/mei/bus.o
  CC      fs/ext4/xattr_trusted.o
  CC      arch/x86/kernel/smp.o
  CC      fs/ext4/xattr_user.o
  AR      drivers/block/built-in.a
  CC      arch/x86/kernel/smpboot.o
  CC      drivers/ata/libata-transport.o
  AR      drivers/net/mdio/built-in.a
  CC      drivers/acpi/acpica/exoparg1.o
  CC      drivers/scsi/scsi_lib.o
  CC [M]  fs/smb/client/connect.o
  AR      kernel/trace/built-in.a
  CC      kernel/regset.o
  CC [M]  fs/smb/client/dir.o
  CC      mm/slub.o
  CC [M]  drivers/misc/mei/bus-fixup.o
  CC      mm/migrate.o
  CC [M]  fs/fuse/file.o
  AR      drivers/net/ethernet/adi/built-in.a
  CC      drivers/acpi/acpi_platform.o
  AR      drivers/net/ethernet/alacritech/built-in.a
  AR      drivers/net/ethernet/amazon/built-in.a
  AR      drivers/net/ethernet/aquantia/built-in.a
  AR      drivers/net/ethernet/asix/built-in.a
  AR      drivers/net/ethernet/cadence/built-in.a
  AR      drivers/net/ethernet/broadcom/built-in.a
  CC [M]  drivers/net/ethernet/broadcom/b44.o
  CC      drivers/acpi/acpi_pnp.o
  CC [M]  drivers/dma-buf/st-dma-fence-chain.o
  CC      kernel/groups.o
  CC [M]  fs/fuse/inode.o
  CC      net/ipv6/exthdrs_offload.o
  CC      mm/migrate_device.o
  CC [M]  fs/smb/client/file.o
  CC      fs/ext4/fast_commit.o
  CC      drivers/acpi/acpica/exoparg2.o
  AR      drivers/net/ethernet/cavium/common/built-in.a
  CC [M]  fs/fuse/control.o
  AR      drivers/net/ethernet/cavium/thunder/built-in.a
  CC      mm/huge_memory.o
  CC [M]  fs/overlayfs/dir.o
  AR      drivers/net/ethernet/cavium/liquidio/built-in.a
  CC      mm/khugepaged.o
  AR      drivers/net/ethernet/cavium/octeon/built-in.a
  AR      drivers/net/ethernet/cavium/built-in.a
  CC [M]  drivers/dma-buf/st-dma-fence-unwrap.o
  AR      drivers/net/ethernet/cortina/built-in.a
  AR      drivers/net/ethernet/engleder/built-in.a
  AR      drivers/net/ethernet/ezchip/built-in.a
  AR      drivers/net/ethernet/fungible/built-in.a
  AR      drivers/net/ethernet/huawei/built-in.a
  AR      drivers/net/ethernet/i825xx/built-in.a
  CC [M]  drivers/net/ethernet/intel/e1000/e1000_main.o
  CC      arch/x86/kernel/tsc_sync.o
  CC [M]  net/netfilter/nf_nat_helper.o
  CC [M]  net/netfilter/nf_nat_redirect.o
  CC [M]  drivers/net/ethernet/intel/e1000e/82571.o
  CC [M]  drivers/net/ethernet/intel/e1000e/ich8lan.o
  CC [M]  drivers/net/ethernet/intel/e1000/e1000_hw.o
  CC      drivers/ata/libata-trace.o
  CC      lib/timerqueue.o
  CC [M]  drivers/misc/mei/debugfs.o
  CC [M]  drivers/net/ethernet/intel/e1000/e1000_ethtool.o
  CC      fs/btrfs/volumes.o
  AR      drivers/net/ethernet/microsoft/built-in.a
  CC [M]  drivers/misc/mei/mei-trace.o
  CC      drivers/acpi/power.o
  CC      drivers/net/phy/phy-core.o
  CC [M]  net/netfilter/nf_nat_masquerade.o
  CC      drivers/acpi/acpica/exoparg3.o
  LD [M]  drivers/gpu/drm/display/drm_display_helper.o
  CC      drivers/acpi/acpica/exoparg6.o
  AR      drivers/gpu/drm/xlnx/built-in.a
  CC      lib/vsprintf.o
  CC [M]  net/netfilter/x_tables.o
  AR      drivers/gpu/drm/gud/built-in.a
  AR      drivers/gpu/drm/solomon/built-in.a
  CC [M]  drivers/gpu/drm/ttm/ttm_tt.o
  CC      kernel/vhost_task.o
  CC [M]  drivers/gpu/drm/ttm/ttm_bo.o
  CC      net/ipv6/inet6_hashtables.o
  CC [M]  drivers/net/ethernet/intel/e1000/e1000_param.o
  CC      drivers/nvme/host/ioctl.o
  CC      arch/x86/kernel/setup_percpu.o
  CC      fs/ext4/orphan.o
  CC [M]  drivers/dma-buf/st-dma-resv.o
  CC [M]  net/netfilter/xt_tcpudp.o
  CC      drivers/ata/libata-sata.o
  CC      drivers/ata/libata-sff.o
  CC      net/ipv6/mcast_snoop.o
  CC      drivers/acpi/acpica/exprep.o
  CC      net/ipv4/af_inet.o
  AR      drivers/spi/built-in.a
  AR      drivers/firewire/built-in.a
  AR      drivers/cdrom/built-in.a
  CC      kernel/kcmp.o
  CC [M]  net/ipv6/ip6_udp_tunnel.o
  CC [M]  fs/overlayfs/readdir.o
  CC      drivers/ata/libata-pmp.o
  CC [M]  drivers/misc/mei/pci-me.o
  CC      drivers/net/phy/phy_device.o
  CC [M]  drivers/net/ethernet/broadcom/bnx2.o
  AR      drivers/dma-buf/built-in.a
  CC      drivers/scsi/scsi_lib_dma.o
  CC      drivers/base/dd.o
  LD [M]  drivers/dma-buf/dmabuf_selftests.o
  CC      arch/x86/kernel/ftrace.o
  CC      kernel/freezer.o
  AS      arch/x86/kernel/ftrace_64.o
  CC [M]  fs/fuse/xattr.o
  CC [M]  drivers/net/ethernet/broadcom/cnic.o
  CC      drivers/acpi/acpica/exregion.o
  CC      drivers/net/phy/linkmode.o
  CC      drivers/acpi/acpica/exresnte.o
  AR      drivers/auxdisplay/built-in.a
  CC      drivers/acpi/acpica/exresolv.o
  CC      mm/page_counter.o
  CC [M]  fs/fuse/acl.o
  CC [M]  drivers/gpu/drm/ttm/ttm_bo_util.o
  CC [M]  drivers/net/ethernet/intel/igb/igb_main.o
  CC [M]  net/netfilter/xt_mark.o
  CC [M]  drivers/net/ethernet/intel/e1000e/80003es2lan.o
  CC [M]  net/netfilter/xt_nat.o
  CC      drivers/base/syscore.o
  CC      drivers/usb/common/common.o
  CC      drivers/usb/core/usb.o
  CC      drivers/input/serio/serio.o
  CC [M]  drivers/gpu/drm/scheduler/sched_main.o
  CC      drivers/acpi/acpica/exresop.o
  CC      drivers/scsi/scsi_scan.o
  CC      drivers/nvme/host/trace.o
  CC      drivers/acpi/acpica/exserial.o
  CC      drivers/input/serio/i8042.o
  CC      lib/win_minmax.o
  CC [M]  drivers/misc/mei/hw-me.o
  CC      drivers/net/phy/mdio_bus.o
  CC      drivers/net/phy/mdio_device.o
  CC      mm/memcontrol.o
  CC      drivers/acpi/acpica/exstore.o
  AR      net/ipv6/built-in.a
  CC [M]  fs/fuse/readdir.o
  CC [M]  fs/fuse/ioctl.o
  CC      kernel/stacktrace.o
  CC      arch/x86/kernel/trace_clock.o
  AR      fs/ext4/built-in.a
  GEN     drivers/scsi/scsi_devinfo_tbl.c
  CC      fs/read_write.o
  AR      drivers/net/ethernet/litex/built-in.a
  CC [M]  drivers/net/ethernet/intel/e1000e/mac.o
  CC [M]  fs/overlayfs/copy_up.o
  CC      arch/x86/kernel/trace.o
  CC [M]  drivers/gpu/drm/amd/amdxcp/amdgpu_xcp_drv.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/amdgpu_drv.o
  CC      drivers/base/driver.o
  CC      drivers/nvme/host/fault_inject.o
  CC [M]  fs/overlayfs/export.o
  CC [M]  drivers/net/ethernet/intel/e1000e/manage.o
  CC [M]  drivers/gpu/drm/i915/i915_driver.o
  CC      drivers/usb/common/debug.o
  CC      drivers/acpi/acpica/exstoren.o
  CC      fs/btrfs/async-thread.o
  CC [M]  drivers/gpu/drm/ttm/ttm_bo_vm.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/amdgpu_device.o
  AR      drivers/usb/common/built-in.a
  CC [M]  fs/smb/client/inode.o
  CC [M]  drivers/net/ethernet/intel/igc/igc_main.o
  LD [M]  drivers/gpu/drm/amd/amdxcp/amdxcp.o
  CC      drivers/base/class.o
  CC      arch/x86/kernel/rethook.o
  CC      kernel/dma.o
  CC [M]  drivers/net/ethernet/intel/igbvf/vf.o
  CC      drivers/net/phy/swphy.o
  CC      drivers/nvme/host/pci.o
  CC [M]  net/netfilter/xt_REDIRECT.o
  CC      drivers/usb/core/hub.o
  CC      drivers/base/platform.o
  CC      drivers/base/cpu.o
  CC      fs/btrfs/ioctl.o
  CC      lib/xarray.o
  CC      drivers/acpi/acpica/exstorob.o
  CC [M]  drivers/net/ethernet/intel/e1000e/nvm.o
  CC      drivers/ata/libata-acpi.o
  LD [M]  fs/fuse/fuse.o
  CC      drivers/net/phy/fixed_phy.o
  CC [M]  drivers/gpu/drm/xe/tests/xe_bo_test.o
  CC [M]  drivers/net/phy/phylink.o
  CC      net/ipv4/igmp.o
  CC      drivers/scsi/scsi_devinfo.o
  CC [M]  drivers/gpu/drm/vgem/vgem_drv.o
  CC      drivers/scsi/scsi_sysctl.o
  CC [M]  drivers/gpu/drm/ast/ast_drv.o
  CC      drivers/input/serio/libps2.o
  CC [M]  drivers/gpu/drm/scheduler/sched_fence.o
  CC [M]  drivers/gpu/drm/ast/ast_i2c.o
  CC [M]  drivers/gpu/drm/nouveau/nvif/object.o
  CC      kernel/smp.o
  LD [M]  fs/overlayfs/overlay.o
  CC [M]  drivers/gpu/drm/ttm/ttm_module.o
  CC      arch/x86/kernel/crash_core_64.o
  CC [M]  drivers/gpu/drm/nouveau/nvif/client.o
  CC [M]  drivers/gpu/drm/ast/ast_main.o
  AR      drivers/net/usb/built-in.a
  CC [M]  drivers/net/usb/pegasus.o
  CC      drivers/acpi/acpica/exsystem.o
  CC [M]  drivers/gpu/drm/xe/tests/xe_dma_buf_test.o
  CC [M]  drivers/net/usb/rtl8150.o
  CC      drivers/usb/core/hcd.o
  LD [M]  drivers/net/ethernet/intel/e1000/e1000.o
  CC [M]  drivers/gpu/drm/ast/ast_mm.o
  CC [M]  drivers/gpu/drm/nouveau/nvif/conn.o
  CC [M]  drivers/gpu/drm/xe/tests/xe_migrate_test.o
  CC      drivers/base/firmware.o
  CC      mm/vmpressure.o
  CC [M]  drivers/net/ethernet/intel/igbvf/mbx.o
  CC [M]  drivers/net/ipvlan/ipvlan_core.o
  CC [M]  drivers/gpu/drm/scheduler/sched_entity.o
  CC [M]  drivers/misc/mei/gsc-me.o
  CC [M]  drivers/net/ipvlan/ipvlan_main.o
  CC      drivers/acpi/acpica/extrace.o
  CC      arch/x86/kernel/module.o
  CC [M]  drivers/gpu/drm/ttm/ttm_execbuf_util.o
  CC [M]  drivers/net/ethernet/intel/e1000e/phy.o
  CC [M]  drivers/gpu/drm/vgem/vgem_fence.o
  CC      drivers/scsi/scsi_debugfs.o
  CC [M]  drivers/gpu/drm/ttm/ttm_range_manager.o
  CC [M]  drivers/gpu/drm/ttm/ttm_resource.o
  AR      drivers/input/serio/built-in.a
  LD [M]  drivers/misc/mei/mei.o
  CC [M]  net/netfilter/xt_MASQUERADE.o
  CC [M]  drivers/net/ethernet/intel/ixgbe/ixgbe_main.o
  CC      drivers/base/init.o
  CC [M]  drivers/gpu/drm/xe/tests/xe_pci_test.o
  CC [M]  drivers/net/ethernet/intel/ixgbe/ixgbe_common.o
  CC [M]  drivers/gpu/drm/xe/tests/xe_rtp_test.o
  CC [M]  drivers/gpu/drm/ttm/ttm_pool.o
  CC [M]  drivers/gpu/drm/xe/tests/xe_wa_test.o
  CC      mm/swap_cgroup.o
  CC      mm/hugetlb_cgroup.o
  CC [M]  drivers/gpu/drm/i915/i915_drm_client.o
  CC      kernel/uid16.o
  CC      drivers/ata/libata-pata-timings.o
  CC      drivers/acpi/acpica/exutils.o
  CC [M]  drivers/gpu/drm/ast/ast_mode.o
  CC [M]  drivers/gpu/drm/ast/ast_post.o
  CC [M]  drivers/gpu/drm/nouveau/nvif/device.o
  CC [M]  drivers/net/ethernet/intel/igbvf/ethtool.o
  CC      fs/btrfs/locking.o
  CC      arch/x86/kernel/early_printk.o
  CC      lib/lockref.o
  LD [M]  drivers/misc/mei/mei-me.o
  CC      drivers/scsi/scsi_trace.o
  CC      drivers/acpi/acpica/hwacpi.o
  LD [M]  drivers/misc/mei/mei-gsc.o
  LD [M]  drivers/gpu/drm/vgem/vgem.o
  CC [M]  drivers/net/ethernet/intel/ixgbevf/vf.o
  CC      drivers/input/keyboard/atkbd.o
  CC      drivers/base/map.o
  CC [M]  drivers/net/ethernet/intel/ixgbevf/mbx.o
  LD [M]  drivers/gpu/drm/scheduler/gpu-sched.o
  CC      drivers/scsi/scsi_logging.o
  CC [M]  drivers/gpu/drm/ast/ast_dp501.o
  CC [M]  drivers/gpu/drm/ast/ast_dp.o
  CC      lib/bcd.o
  AR      drivers/net/ethernet/intel/built-in.a
  CC [M]  drivers/gpu/drm/i915/i915_config.o
  CC [M]  drivers/net/usb/r8152.o
  CC      lib/sort.o
  AR      drivers/input/mouse/built-in.a
  CC [M]  drivers/net/usb/asix_devices.o
  CC      drivers/acpi/event.o
  CC [M]  drivers/gpu/drm/xe/xe_bb.o
  CC      lib/parser.o
  CC      lib/debug_locks.o
  CC [M]  drivers/gpu/drm/ttm/ttm_device.o
  CC      arch/x86/kernel/hpet.o
  CC      drivers/ata/ahci.o
  CC      drivers/acpi/acpica/hwesleep.o
  CC [M]  net/netfilter/xt_addrtype.o
  CC      kernel/kallsyms.o
  CC      lib/random32.o
  CC      net/ipv4/fib_frontend.o
  CC      drivers/base/devres.o
  CC [M]  drivers/net/ipvlan/ipvlan_l3s.o
  CC [M]  net/netfilter/xt_conntrack.o
  CC      arch/x86/kernel/amd_nb.o
  CC [M]  drivers/gpu/drm/nouveau/nvif/disp.o
  AR      drivers/nvme/host/built-in.a
  AR      drivers/nvme/built-in.a
  CC [M]  drivers/gpu/drm/ttm/ttm_sys_manager.o
  CC [M]  fs/smb/client/link.o
  CC [M]  drivers/gpu/drm/i915/i915_getparam.o
  CC [M]  fs/smb/client/misc.o
  CC [M]  fs/smb/client/netmisc.o
  CC      drivers/scsi/scsi_pm.o
  CC      arch/x86/kernel/kvm.o
  CC [M]  drivers/gpu/drm/ttm/ttm_agp_backend.o
  CC [M]  drivers/net/phy/aquantia_main.o
  CC [M]  drivers/net/ethernet/intel/igbvf/netdev.o
  CC      drivers/input/input.o
  CC      drivers/acpi/acpica/hwgpe.o
  CC      lib/bust_spinlocks.o
  CC      lib/kasprintf.o
  CC      fs/file_table.o
  CC [M]  drivers/gpu/drm/xe/xe_bo.o
  CC [M]  drivers/gpu/drm/xe/xe_bo_evict.o
  CC      drivers/input/input-compat.o
  CC [M]  drivers/net/ethernet/intel/ixgbevf/ethtool.o
  CC      arch/x86/kernel/kvmclock.o
  CC [M]  drivers/gpu/drm/nouveau/nvif/driver.o
  AR      drivers/input/keyboard/built-in.a
  CC [M]  drivers/gpu/drm/i915/i915_ioctl.o
  CC      drivers/acpi/evged.o
  CC      drivers/acpi/sysfs.o
  CC      drivers/acpi/property.o
  CC [M]  fs/smb/client/smbencrypt.o
  CC [M]  drivers/net/ethernet/intel/e1000e/param.o
  LD [M]  drivers/gpu/drm/ast/ast.o
  CC      arch/x86/kernel/paravirt.o
  CC      fs/super.o
  CC      lib/bitmap.o
  CC [M]  drivers/gpu/drm/xe/xe_debugfs.o
  LD [M]  drivers/gpu/drm/ttm/ttm.o
  CC [M]  drivers/gpu/drm/nouveau/nvif/event.o
  CC      drivers/acpi/acpica/hwregs.o
  CC      drivers/base/attribute_container.o
  CC [M]  drivers/gpu/drm/nouveau/nvif/fifo.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/amdgpu_kms.o
  CC      drivers/scsi/scsi_bsg.o
  CC [M]  drivers/net/ethernet/broadcom/tg3.o
  CC      fs/btrfs/orphan.o
  CC [M]  drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.o
  CC      drivers/ata/libahci.o
  CC      lib/scatterlist.o
  CC      drivers/usb/core/urb.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/amdgpu_atombios.o
  CC      drivers/scsi/scsi_common.o
  CC [M]  drivers/gpu/drm/i915/i915_irq.o
  LD [M]  drivers/net/ipvlan/ipvlan.o
  CC      drivers/gpu/drm/drm_mipi_dsi.o
  CC [M]  net/netfilter/xt_ipvs.o
  CC [M]  drivers/net/phy/aquantia_hwmon.o
  CC [M]  drivers/net/usb/asix_common.o
  CC [M]  drivers/gpu/drm/xe/xe_devcoredump.o
  CC      kernel/acct.o
  CC      arch/x86/kernel/pvclock.o
  CC      arch/x86/kernel/pcspeaker.o
  CC      drivers/acpi/acpi_cmos_rtc.o
  CC      arch/x86/kernel/check.o
  CC      drivers/scsi/sd.o
  CC      drivers/acpi/acpica/hwsleep.o
  CC [M]  drivers/net/ethernet/intel/e100.o
  CC      arch/x86/kernel/uprobes.o
  CC      drivers/base/transport_class.o
  CC      arch/x86/kernel/perf_regs.o
  CC [M]  drivers/net/usb/ax88172a.o
  CC [M]  drivers/gpu/drm/i915/i915_mitigations.o
  CC      kernel/crash_core.o
  CC      drivers/input/input-mt.o
  CC      fs/char_dev.o
  CC [M]  drivers/net/ethernet/intel/e1000e/ethtool.o
  CC      fs/btrfs/export.o
  CC      drivers/ata/ata_piix.o
  CC [M]  drivers/gpu/drm/nouveau/nvif/head.o
  CC [M]  drivers/gpu/drm/nouveau/nvif/mem.o
  CC [M]  drivers/net/ethernet/intel/igc/igc_mac.o
  CC [M]  drivers/gpu/drm/i915/i915_module.o
  CC [M]  fs/smb/client/transport.o
  CC      drivers/acpi/acpica/hwvalid.o
  CC      mm/kmemleak.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/atombios_crtc.o
  CC [M]  drivers/net/phy/ax88796b.o
  CC [M]  drivers/gpu/drm/i915/i915_params.o
  CC      lib/list_sort.o
  CC      arch/x86/kernel/tracepoint.o
  CC [M]  drivers/net/ethernet/intel/e1000e/netdev.o
  CC      drivers/base/topology.o
  CC      net/ipv4/fib_semantics.o
  CC      drivers/usb/core/message.o
  CC [M]  drivers/net/ethernet/intel/e1000e/ptp.o
  CC [M]  drivers/net/phy/bcm7xxx.o
  CC [M]  drivers/gpu/drm/i915/i915_pci.o
  CC      lib/uuid.o
  CC [M]  drivers/gpu/drm/nouveau/nvif/mmu.o
  AR      drivers/usb/phy/built-in.a
  CC [M]  drivers/net/ethernet/intel/ixgbe/ixgbe_ethtool.o
  CC [M]  drivers/net/ethernet/intel/ixgbe/ixgbe_82599.o
  CC      drivers/scsi/sg.o
  CC      arch/x86/kernel/itmt.o
  CC [M]  drivers/net/ethernet/intel/igb/igb_ethtool.o
  CC      kernel/compat.o
  LD [M]  net/netfilter/nf_conntrack.o
  CC      lib/iov_iter.o
  CC      drivers/acpi/acpica/hwxface.o
  LD [M]  net/netfilter/nf_nat.o
  CC      drivers/base/container.o
  CC [M]  drivers/gpu/drm/nouveau/nvif/outp.o
  AR      net/netfilter/built-in.a
  CC [M]  drivers/net/ethernet/intel/igb/e1000_82575.o
  CC [M]  drivers/net/usb/ax88179_178a.o
  LD [M]  drivers/net/ethernet/intel/igbvf/igbvf.o
  CC      drivers/input/input-poller.o
  CC      drivers/usb/host/pci-quirks.o
  CC      drivers/usb/storage/scsiglue.o
  CC      drivers/usb/storage/protocol.o
  CC [M]  drivers/gpu/drm/nouveau/nvif/timer.o
  CC [M]  drivers/net/usb/cdc_ether.o
  CC      drivers/usb/host/ehci-hcd.o
  CC [M]  drivers/gpu/drm/xe/xe_device.o
  CC      drivers/usb/serial/usb-serial.o
  CC      mm/page_isolation.o
  AR      drivers/usb/misc/built-in.a
  CC [M]  drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.o
  CC      drivers/acpi/x86/apple.o
  CC      drivers/base/property.o
  CC [M]  drivers/net/ethernet/intel/igc/igc_i225.o
  CC [M]  drivers/gpu/drm/i915/i915_scatterlist.o
  CC      drivers/acpi/acpica/hwxfsleep.o
  CC      arch/x86/kernel/umip.o
  CC      drivers/usb/storage/transport.o
  CC      fs/btrfs/tree-log.o
  AR      drivers/ata/built-in.a
  CC      arch/x86/kernel/unwind_orc.o
  CC      arch/x86/kernel/callthunks.o
  CC [M]  drivers/net/phy/bcm87xx.o
  CC      drivers/acpi/x86/utils.o
  CC      drivers/usb/gadget/udc/core.o
  CC      drivers/input/ff-core.o
  CC      drivers/usb/gadget/udc/trace.o
  CC [M]  drivers/net/ethernet/intel/igc/igc_base.o
  CC      kernel/utsname.o
  CC      drivers/usb/host/ehci-pci.o
  CC      drivers/usb/storage/usb.o
  CC      drivers/acpi/x86/s2idle.o
  CC      drivers/acpi/acpica/hwpci.o
  CC      mm/early_ioremap.o
  CC      drivers/acpi/debugfs.o
  CC [M]  drivers/gpu/drm/nouveau/nvif/vmm.o
  CC      drivers/rtc/lib.o
  CC      drivers/usb/storage/initializers.o
  CC      kernel/user_namespace.o
  CC      drivers/input/touchscreen.o
  CC      drivers/input/ff-memless.o
  CC      drivers/usb/core/driver.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/atom.o
  CC [M]  drivers/gpu/drm/xe/xe_device_sysfs.o
  CC      arch/x86/kernel/mmconf-fam10h_64.o
  AR      drivers/i2c/algos/built-in.a
  CC      drivers/i2c/busses/i2c-designware-common.o
  CC [M]  drivers/i2c/algos/i2c-algo-bit.o
  CC      drivers/i2c/busses/i2c-designware-master.o
  CC [M]  drivers/net/phy/bcm-phy-lib.o
  CC [M]  drivers/net/ethernet/intel/igc/igc_nvm.o
  AR      drivers/i3c/built-in.a
  CC      drivers/i2c/busses/i2c-designware-platdrv.o
  CC [M]  drivers/gpu/drm/xe/xe_dma_buf.o
  CC      drivers/acpi/acpica/nsaccess.o
  CC      mm/cma.o
  CC      drivers/scsi/scsi_sysfs.o
  CC [M]  drivers/gpu/drm/i915/i915_suspend.o
  CC      mm/secretmem.o
  CC      arch/x86/kernel/vsmp_64.o
  CC [M]  drivers/gpu/drm/i915/i915_switcheroo.o
  CC [M]  drivers/gpu/drm/i915/i915_sysfs.o
  CC [M]  drivers/net/ethernet/intel/igc/igc_phy.o
  CC      drivers/base/cacheinfo.o
  CC      drivers/rtc/class.o
  CC      drivers/usb/serial/generic.o
  CC [M]  drivers/net/ethernet/intel/ixgbevf/ipsec.o
  CC [M]  drivers/gpu/drm/nouveau/nvif/user.o
  AR      drivers/i2c/muxes/built-in.a
  CC [M]  drivers/i2c/muxes/i2c-mux-gpio.o
  CC      drivers/i2c/i2c-boardinfo.o
  CC [M]  fs/smb/client/cached_dir.o
  CC [M]  drivers/net/ethernet/intel/igb/e1000_mac.o
  CC [M]  drivers/net/ethernet/intel/igb/e1000_nvm.o
  CC [M]  drivers/gpu/drm/nouveau/nvif/userc361.o
  CC      net/ipv4/fib_trie.o
  CC      drivers/usb/storage/sierra_ms.o
  CC      drivers/rtc/interface.o
  CC      drivers/i2c/i2c-core-base.o
  CC      drivers/acpi/acpica/nsalloc.o
  CC [M]  drivers/net/ethernet/intel/igc/igc_diag.o
  AR      arch/x86/kernel/built-in.a
  AR      arch/x86/built-in.a
  CC      drivers/input/vivaldi-fmap.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/core/client.o
  CC      drivers/rtc/nvmem.o
  CC      drivers/usb/serial/bus.o
  AR      drivers/usb/gadget/udc/built-in.a
  AR      drivers/usb/gadget/function/built-in.a
  AR      drivers/usb/gadget/legacy/built-in.a
  CC      drivers/usb/gadget/usbstring.o
  CC      drivers/acpi/acpi_lpat.o
  CC      kernel/pid_namespace.o
  CC      drivers/usb/core/config.o
  CC      drivers/i2c/busses/i2c-designware-baytrail.o
  CC      drivers/i2c/i2c-core-smbus.o
  CC [M]  drivers/gpu/drm/xe/xe_engine.o
  CC [M]  drivers/gpu/drm/xe/xe_hw_engine_class_sysfs.o
  CC      drivers/usb/storage/option_ms.o
  CC [M]  drivers/net/ethernet/intel/igb/e1000_phy.o
  UPD     kernel/config_data
  CC [M]  drivers/net/ethernet/intel/igc/igc_ethtool.o
  CC      mm/userfaultfd.o
  CC      drivers/base/swnode.o
  CC [M]  drivers/i2c/busses/i2c-scmi.o
  CC      drivers/input/input-leds.o
  CC      drivers/acpi/acpica/nsarguments.o
  CC [M]  drivers/net/phy/broadcom.o
  CC [M]  drivers/i2c/busses/i2c-ccgx-ucsi.o
  CC      kernel/stop_machine.o
  CC [M]  drivers/net/usb/cdc_eem.o
  CC [M]  drivers/net/usb/smsc75xx.o
  CC      kernel/kprobes.o
  CC      net/ipv4/fib_notifier.o
  CC      drivers/base/auxiliary.o
  CC [M]  drivers/net/ethernet/intel/igb/e1000_mbx.o
  CC      drivers/base/devtmpfs.o
  CC [M]  drivers/gpu/drm/i915/i915_utils.o
  CC      drivers/usb/storage/usual-tables.o
  CC [M]  drivers/gpu/drm/i915/intel_clock_gating.o
  CC      drivers/base/memory.o
  CC      lib/clz_ctz.o
  CC      drivers/usb/serial/console.o
  CC      drivers/usb/gadget/config.o
  CC [M]  drivers/net/phy/lxt.o
  CC      lib/bsearch.o
  CC [M]  drivers/net/ethernet/intel/igc/igc_ptp.o
  CC      net/ipv4/inet_fragment.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/core/engine.o
  AR      drivers/scsi/built-in.a
  CC      drivers/input/mousedev.o
  CC      drivers/acpi/acpica/nsconvert.o
  LD [M]  drivers/net/ethernet/intel/ixgbevf/ixgbevf.o
  CC [M]  drivers/gpu/drm/drm_aperture.o
  CC [M]  drivers/net/ethernet/intel/ixgbe/ixgbe_82598.o
  CC [M]  drivers/gpu/drm/i915/intel_device_info.o
  CC      mm/memremap.o
  CC [M]  drivers/net/ethernet/intel/igb/e1000_i210.o
  CC      drivers/acpi/acpica/nsdump.o
  CC      drivers/base/module.o
  AR      drivers/usb/storage/built-in.a
  CC      drivers/rtc/dev.o
  CC      net/ipv4/ping.o
  CC      lib/find_bit.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/amdgpu_fence.o
  CC [M]  drivers/i2c/busses/i2c-i801.o
  CC      drivers/acpi/acpica/nseval.o
  CC [M]  fs/smb/client/cifs_unicode.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/core/enum.o
  CC      lib/llist.o
  CC [M]  drivers/usb/class/usbtmc.o
  CC [M]  drivers/gpu/drm/drm_atomic.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.o
  CC      drivers/usb/serial/ftdi_sio.o
  CC [M]  drivers/net/ethernet/intel/igb/igb_ptp.o
  CC [M]  drivers/gpu/drm/drm_atomic_uapi.o
  CC      kernel/hung_task.o
  CC      drivers/usb/core/file.o
  CC      fs/btrfs/free-space-cache.o
  CC      net/ipv4/ip_tunnel_core.o
  CC      drivers/usb/gadget/epautoconf.o
  CC      drivers/usb/gadget/composite.o
  CC      net/ipv4/gre_offload.o
  CC [M]  drivers/gpu/drm/i915/intel_memory_region.o
  CC      fs/btrfs/zlib.o
  CC      drivers/usb/serial/pl2303.o
  CC      lib/memweight.o
  CC      drivers/base/pinctrl.o
  CC [M]  drivers/net/phy/realtek.o
  CC      lib/kfifo.o
  CC [M]  drivers/net/ethernet/intel/ixgbe/ixgbe_phy.o
  AR      drivers/net/ethernet/microchip/built-in.a
  CC      drivers/acpi/acpica/nsinit.o
  CC      drivers/i2c/i2c-core-acpi.o
  CC      drivers/usb/gadget/functions.o
  CC      drivers/rtc/proc.o
  CC [M]  drivers/gpu/drm/xe/xe_exec.o
  CC      drivers/input/evdev.o
  CC [M]  drivers/net/ethernet/intel/igb/igb_hwmon.o
  CC      drivers/i2c/i2c-core-slave.o
  CC      drivers/base/devcoredump.o
  CC      mm/hmm.o
  CC [M]  drivers/net/usb/smsc95xx.o
  CC [M]  drivers/net/usb/mcs7830.o
  CC [M]  drivers/net/ethernet/intel/igc/igc_dump.o
  CC      drivers/usb/core/buffer.o
  CC [M]  drivers/net/vxlan/vxlan_core.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/core/event.o
  CC [M]  drivers/net/vxlan/vxlan_multicast.o
  CC      drivers/acpi/acpica/nsload.o
  CC      drivers/net/loopback.o
  CC      drivers/usb/core/sysfs.o
  CC [M]  drivers/gpu/drm/drm_auth.o
  CC [M]  drivers/gpu/drm/drm_blend.o
  LD [M]  drivers/net/ethernet/intel/e1000e/e1000e.o
  CC [M]  drivers/net/ethernet/intel/ixgbe/ixgbe_sriov.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/core/firmware.o
  CC      drivers/usb/host/ohci-hcd.o
  CC      kernel/watchdog.o
  CC      drivers/rtc/sysfs.o
  CC      drivers/i2c/i2c-dev.o
  CC [M]  fs/smb/client/nterr.o
  CC [M]  fs/smb/client/cifsencrypt.o
  CC      fs/btrfs/lzo.o
  CC      lib/percpu-refcount.o
  CC      drivers/acpi/acpica/nsnames.o
  CC [M]  drivers/gpu/drm/i915/intel_pcode.o
  CC      drivers/acpi/acpica/nsobject.o
  CC [M]  drivers/net/phy/smsc.o
  CC [M]  drivers/i2c/busses/i2c-isch.o
  CC      drivers/base/platform-msi.o
  CC [M]  drivers/i2c/busses/i2c-ismt.o
  CC [M]  drivers/gpu/drm/i915/intel_region_ttm.o
  CC [M]  fs/smb/client/readdir.o
  CC [M]  drivers/gpu/drm/xe/xe_execlist.o
  AR      drivers/usb/serial/built-in.a
  CC [M]  drivers/gpu/drm/amd/amdgpu/amdgpu_object.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/amdgpu_gart.o
  CC      drivers/usb/core/endpoint.o
  CC [M]  drivers/i2c/busses/i2c-piix4.o
  CC      net/ipv4/metrics.o
  CC [M]  drivers/i2c/i2c-smbus.o
  CC      drivers/rtc/rtc-mc146818-lib.o
  CC [M]  drivers/net/usb/usbnet.o
  AR      drivers/input/built-in.a
  CC      lib/rhashtable.o
  CC [M]  drivers/gpu/drm/i915/intel_runtime_pm.o
  LD [M]  drivers/net/ethernet/intel/igb/igb.o
  AR      drivers/media/i2c/built-in.a
  CC      drivers/rtc/rtc-cmos.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/amdgpu_encoders.o
  AR      drivers/media/tuners/built-in.a
  CC [M]  drivers/net/ethernet/intel/igc/igc_tsn.o
  AR      drivers/media/rc/keymaps/built-in.a
  CC      fs/btrfs/zstd.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/amdgpu_display.o
  AR      drivers/media/rc/built-in.a
  CC [M]  drivers/net/usb/cdc_ncm.o
  CC      mm/memfd.o
  AR      drivers/media/common/b2c2/built-in.a
  AR      drivers/media/platform/allegro-dvt/built-in.a
  AR      drivers/media/pci/ttpci/built-in.a
  AR      drivers/media/common/saa7146/built-in.a
  CC      drivers/acpi/acpica/nsparse.o
  AR      drivers/media/platform/amlogic/meson-ge2d/built-in.a
  AR      drivers/media/common/siano/built-in.a
  AR      drivers/media/pci/b2c2/built-in.a
  AR      drivers/media/platform/amlogic/built-in.a
  AR      drivers/media/common/v4l2-tpg/built-in.a
  AR      drivers/media/pci/pluto2/built-in.a
  AR      drivers/media/platform/amphion/built-in.a
  CC      kernel/watchdog_hld.o
  AR      drivers/media/common/videobuf2/built-in.a
  AR      drivers/media/pci/dm1105/built-in.a
  AR      drivers/media/platform/aspeed/built-in.a
  AR      drivers/media/common/built-in.a
  CC [M]  drivers/gpu/drm/nouveau/nvkm/core/gpuobj.o
  AR      drivers/media/pci/pt1/built-in.a
  AR      drivers/media/platform/atmel/built-in.a
  CC [M]  drivers/gpu/drm/i915/intel_sbi.o
  AR      drivers/media/platform/cadence/built-in.a
  AR      drivers/media/pci/pt3/built-in.a
  AR      drivers/media/platform/chips-media/built-in.a
  AR      drivers/media/pci/mantis/built-in.a
  CC      drivers/base/physical_location.o
  AR      drivers/media/platform/intel/built-in.a
  AR      drivers/media/pci/ngene/built-in.a
  CC      lib/base64.o
  AR      drivers/media/platform/marvell/built-in.a
  AR      drivers/media/pci/ddbridge/built-in.a
  AR      drivers/media/pci/saa7146/built-in.a
  AR      drivers/media/platform/mediatek/jpeg/built-in.a
  AR      drivers/media/pci/smipcie/built-in.a
  AR      drivers/media/platform/mediatek/mdp/built-in.a
  AR      drivers/media/pci/netup_unidvb/built-in.a
  AR      drivers/media/platform/mediatek/vcodec/built-in.a
  CC [M]  drivers/gpu/drm/i915/intel_step.o
  CC [M]  drivers/net/ethernet/intel/ixgbe/ixgbe_mbx.o
  AR      drivers/media/pci/intel/ipu3/built-in.a
  AR      drivers/media/platform/mediatek/vpu/built-in.a
  AR      drivers/media/pci/intel/built-in.a
  AR      drivers/media/pci/built-in.a
  AR      drivers/media/platform/mediatek/mdp3/built-in.a
  AR      drivers/media/platform/mediatek/built-in.a
  AR      drivers/net/ethernet/mscc/built-in.a
  AR      drivers/media/platform/microchip/built-in.a
  CC      drivers/usb/core/devio.o
  AR      drivers/media/platform/nvidia/tegra-vde/built-in.a
  CC [M]  drivers/gpu/drm/nouveau/nvkm/core/intr.o
  AR      drivers/media/platform/nvidia/built-in.a
  CC [M]  drivers/net/ethernet/intel/ixgbe/ixgbe_x540.o
  AR      drivers/media/platform/nxp/dw100/built-in.a
  AR      drivers/media/platform/nxp/imx-jpeg/built-in.a
  CC [M]  drivers/net/ethernet/intel/ixgbe/ixgbe_x550.o
  AR      drivers/media/platform/nxp/imx8-isi/built-in.a
  AR      drivers/media/platform/nxp/built-in.a
  CC [M]  drivers/net/ethernet/intel/ixgbe/ixgbe_lib.o
  AR      drivers/media/platform/qcom/camss/built-in.a
  AR      drivers/media/platform/qcom/venus/built-in.a
  AR      drivers/media/platform/qcom/built-in.a
  CC [M]  drivers/net/ethernet/intel/ixgbe/ixgbe_ptp.o
  AR      drivers/media/platform/renesas/rcar-vin/built-in.a
  CC      drivers/usb/gadget/configfs.o
  AR      drivers/media/platform/renesas/rzg2l-cru/built-in.a
  CC [M]  drivers/net/ethernet/intel/ixgbe/ixgbe_xsk.o
  AR      drivers/media/platform/renesas/vsp1/built-in.a
  AR      drivers/media/platform/renesas/built-in.a
  AR      drivers/media/platform/rockchip/rga/built-in.a
  AR      drivers/media/platform/rockchip/rkisp1/built-in.a
  CC [M]  drivers/net/ethernet/intel/ixgbe/ixgbe_dcb.o
  AR      drivers/media/platform/rockchip/built-in.a
  CC [M]  drivers/gpu/drm/drm_bridge.o
  AR      drivers/media/usb/b2c2/built-in.a
  AR      drivers/media/platform/samsung/exynos-gsc/built-in.a
  CC      drivers/acpi/acpica/nspredef.o
  AR      drivers/media/platform/samsung/exynos4-is/built-in.a
  AR      drivers/media/usb/dvb-usb/built-in.a
  AR      drivers/media/platform/samsung/s3c-camif/built-in.a
  AR      drivers/media/usb/dvb-usb-v2/built-in.a
  AR      drivers/media/platform/samsung/s5p-g2d/built-in.a
  AR      drivers/media/usb/s2255/built-in.a
  LD [M]  drivers/net/phy/aquantia.o
  AR      drivers/media/platform/samsung/s5p-jpeg/built-in.a
  AR      drivers/media/usb/siano/built-in.a
  AR      drivers/net/phy/built-in.a
  AR      drivers/media/platform/samsung/s5p-mfc/built-in.a
  AR      drivers/media/platform/samsung/built-in.a
  AR      drivers/media/usb/ttusb-budget/built-in.a
  AR      drivers/media/usb/ttusb-dec/built-in.a
  AR      drivers/media/platform/sunxi/sun4i-csi/built-in.a
  AR      drivers/media/platform/st/sti/bdisp/built-in.a
  CC [M]  drivers/gpu/drm/nouveau/nvkm/core/ioctl.o
  AR      drivers/media/usb/built-in.a
  AR      drivers/media/platform/sunxi/sun6i-csi/built-in.a
  AR      drivers/media/platform/st/sti/c8sectpfe/built-in.a
  CC [M]  drivers/gpu/drm/drm_cache.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/amdgpu_i2c.o
  AR      drivers/media/platform/sunxi/sun6i-mipi-csi2/built-in.a
  CC [M]  fs/smb/client/ioctl.o
  AR      drivers/media/platform/sunxi/sun8i-a83t-mipi-csi2/built-in.a
  AR      drivers/media/platform/st/sti/delta/built-in.a
  AR      drivers/media/platform/sunxi/sun8i-di/built-in.a
  AR      drivers/media/platform/st/sti/hva/built-in.a
  AR      drivers/media/platform/sunxi/sun8i-rotate/built-in.a
  CC      drivers/usb/gadget/u_f.o
  AR      drivers/media/platform/st/stm32/built-in.a
  AR      drivers/media/platform/sunxi/built-in.a
  CC [M]  drivers/gpu/drm/xe/xe_force_wake.o
  AR      drivers/media/platform/st/built-in.a
  CC      drivers/base/trace.o
  CC      lib/once.o
  AR      drivers/media/platform/verisilicon/built-in.a
  AR      drivers/media/platform/ti/am437x/built-in.a
  CC      net/ipv4/netlink.o
  CC [M]  drivers/i2c/busses/i2c-designware-pcidrv.o
  AR      drivers/media/platform/ti/cal/built-in.a
  AR      drivers/media/platform/ti/vpe/built-in.a
  CC [M]  fs/smb/client/sess.o
  AR      drivers/media/platform/ti/davinci/built-in.a
  AR      drivers/media/platform/ti/omap/built-in.a
  AR      drivers/media/platform/ti/omap3isp/built-in.a
  AR      drivers/media/platform/ti/built-in.a
  AR      drivers/media/platform/via/built-in.a
  AR      drivers/media/platform/xilinx/built-in.a
  AR      drivers/media/platform/built-in.a
  CC      kernel/seccomp.o
  AR      drivers/media/mmc/siano/built-in.a
  AR      drivers/media/mmc/built-in.a
  CC      kernel/relay.o
  AR      drivers/media/firewire/built-in.a
  AR      drivers/media/spi/built-in.a
  CC [M]  drivers/net/ethernet/intel/igc/igc_xdp.o
  CC [M]  fs/smb/client/export.o
  AR      drivers/media/test-drivers/built-in.a
  AR      drivers/media/built-in.a
  AR      drivers/ptp/built-in.a
  CC      drivers/acpi/acpica/nsprepkg.o
  AR      drivers/rtc/built-in.a
  CC [M]  drivers/ptp/ptp_clock.o
  CC [M]  drivers/gpu/drm/xe/xe_ggtt.o
  CC [M]  drivers/ptp/ptp_chardev.o
  CC [M]  drivers/net/ethernet/intel/ixgbe/ixgbe_dcb_82598.o
  CC [M]  drivers/gpu/drm/i915/intel_uncore.o
  CC      mm/bootmem_info.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/amdgpu_gem.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/amdgpu_ring.o
  CC [M]  drivers/net/usb/r8153_ecm.o
  CC      drivers/usb/core/notify.o
  CC      drivers/usb/core/generic.o
  CC      drivers/usb/core/quirks.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/core/memory.o
  CC      fs/btrfs/compression.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/core/mm.o
  CC      lib/refcount.o
  AR      drivers/net/ethernet/neterion/built-in.a
  AR      drivers/base/built-in.a
  CC      drivers/usb/host/ohci-pci.o
  AR      drivers/net/ethernet/netronome/built-in.a
  CC [M]  drivers/gpu/drm/drm_client.o
  CC [M]  drivers/gpu/drm/i915/intel_wakeref.o
  AR      drivers/power/reset/built-in.a
  CC      drivers/power/supply/power_supply_core.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/amdgpu_cs.o
  CC      drivers/power/supply/power_supply_sysfs.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/amdgpu_bios.o
  CC      drivers/power/supply/power_supply_leds.o
  CC      drivers/acpi/acpica/nsrepair.o
  CC [M]  drivers/net/ethernet/intel/ixgbe/ixgbe_dcb_82599.o
  CC [M]  drivers/gpu/drm/i915/vlv_sideband.o
  LD [M]  drivers/i2c/busses/i2c-designware-pci.o
  CC      fs/stat.o
  AR      drivers/i2c/busses/built-in.a
  CC      lib/rcuref.o
  CC [M]  drivers/i2c/i2c-mux.o
  AR      mm/built-in.a
  CC      lib/usercopy.o
  CC      net/ipv4/nexthop.o
  CC      fs/exec.o
  AR      drivers/net/ethernet/ni/built-in.a
  AR      drivers/net/ethernet/packetengines/built-in.a
  CC [M]  drivers/net/ethernet/intel/ixgbe/ixgbe_dcb_nl.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/amdgpu_benchmark.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/atombios_dp.o
  CC [M]  drivers/ptp/ptp_sysfs.o
  CC [M]  drivers/net/vxlan/vxlan_vnifilter.o
  CC      net/ipv4/udp_tunnel_stub.o
  CC [M]  drivers/gpu/drm/i915/vlv_suspend.o
  CC      fs/btrfs/delayed-ref.o
  CC      kernel/utsname_sysctl.o
  CC      drivers/power/supply/power_supply_hwmon.o
  AR      drivers/usb/gadget/built-in.a
  CC [M]  drivers/gpu/drm/xe/xe_gt.o
  AR      drivers/net/ethernet/realtek/built-in.a
  CC [M]  drivers/net/ethernet/realtek/8139cp.o
  CC      kernel/delayacct.o
  LD [M]  drivers/net/ethernet/intel/igc/igc.o
  CC [M]  drivers/net/vxlan/vxlan_mdb.o
  CC [M]  drivers/net/ethernet/realtek/8139too.o
  CC      drivers/usb/core/devices.o
  CC [M]  drivers/ptp/ptp_vclock.o
  CC      lib/errseq.o
  LD [M]  drivers/net/usb/asix.o
  CC [M]  fs/smb/client/unc.o
  CC      kernel/taskstats.o
  CC      drivers/acpi/acpica/nsrepair2.o
  CC [M]  fs/smb/client/winucase.o
  CC      drivers/usb/host/uhci-hcd.o
  CC      drivers/usb/host/xhci.o
  CC [M]  drivers/gpu/drm/xe/xe_gt_clock.o
  CC [M]  fs/smb/client/smb2ops.o
  CC      lib/bucket_locks.o
  CC [M]  fs/smb/client/smb2maperror.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/core/object.o
  CC      fs/pipe.o
  CC [M]  drivers/net/ethernet/intel/ixgbe/ixgbe_sysfs.o
  CC [M]  drivers/net/ethernet/realtek/r8169_main.o
  CC [M]  drivers/gpu/drm/xe/xe_gt_debugfs.o
  CC      drivers/acpi/acpica/nssearch.o
  AR      drivers/power/supply/built-in.a
  AR      drivers/power/built-in.a
  CC [M]  drivers/ptp/ptp_kvm_x86.o
  CC      drivers/hwmon/hwmon.o
  AR      drivers/thermal/broadcom/built-in.a
  AR      drivers/thermal/samsung/built-in.a
  CC      drivers/watchdog/watchdog_core.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/amdgpu_afmt.o
  CC      drivers/thermal/intel/intel_tcc.o
  CC [M]  drivers/gpu/drm/i915/soc/intel_dram.o
  AR      drivers/i2c/built-in.a
  CC      drivers/thermal/intel/therm_throt.o
  CC [M]  drivers/ptp/ptp_kvm_common.o
  CC [M]  drivers/gpu/drm/drm_client_modeset.o
  CC [M]  drivers/net/ethernet/realtek/r8169_firmware.o
  CC      kernel/tsacct.o
  CC      drivers/usb/host/xhci-mem.o
  CC      lib/generic-radix-tree.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/amdgpu_trace_points.o
  CC [M]  drivers/hwmon/acpi_power_meter.o
  CC      drivers/usb/core/phy.o
  CC      drivers/acpi/acpica/nsutils.o
  CC [M]  drivers/gpu/drm/xe/xe_gt_idle_sysfs.o
  CC [M]  drivers/net/ethernet/realtek/r8169_phy_config.o
  CC [M]  drivers/gpu/drm/xe/xe_gt_mcr.o
  CC      drivers/usb/host/xhci-ext-caps.o
  CC [M]  drivers/gpu/drm/xe/xe_gt_pagefault.o
  CC [M]  drivers/net/ethernet/intel/ixgbe/ixgbe_debugfs.o
  CC      drivers/usb/host/xhci-ring.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/atombios_encoders.o
  CC      lib/string_helpers.o
  CC      lib/hexdump.o
  CC [M]  drivers/thermal/intel/x86_pkg_temp_thermal.o
  CC      fs/namei.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/core/oproxy.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/core/option.o
  CC [M]  drivers/md/persistent-data/dm-array.o
  CC      drivers/opp/core.o
  CC      drivers/opp/cpu.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/core/ramht.o
  CC      kernel/tracepoint.o
  CC [M]  drivers/md/persistent-data/dm-bitset.o
  LD [M]  drivers/ptp/ptp.o
  LD [M]  drivers/ptp/ptp_kvm.o
  CC      drivers/usb/host/xhci-hub.o
  CC      drivers/acpi/acpica/nswalk.o
  CC      drivers/acpi/acpica/nsxfeval.o
  CC [M]  fs/smb/client/smb2transport.o
  CC      fs/btrfs/relocation.o
  CC      drivers/watchdog/watchdog_dev.o
  CC      drivers/acpi/acpica/nsxfname.o
  CC      drivers/usb/core/port.o
  CC      drivers/usb/host/xhci-dbg.o
  CC [M]  drivers/md/persistent-data/dm-block-manager.o
  CC      drivers/watchdog/softdog.o
  CC [M]  drivers/net/ethernet/intel/ixgbe/ixgbe_ipsec.o
  AR      drivers/net/ethernet/renesas/built-in.a
  CC [M]  drivers/gpu/drm/xe/xe_gt_sysfs.o
  CC [M]  drivers/gpu/drm/xe/xe_gt_tlb_invalidation.o
  CC      drivers/usb/core/hcd-pci.o
  CC [M]  drivers/gpu/drm/i915/soc/intel_gmch.o
  CC [M]  drivers/hwmon/coretemp.o
  CC [M]  drivers/gpu/drm/xe/xe_gt_topology.o
  CC      drivers/net/netconsole.o
  CC      net/ipv4/sysctl_net_ipv4.o
  CC      fs/fcntl.o
  CC      drivers/acpi/acpi_lpit.o
  AR      drivers/thermal/intel/built-in.a
  AR      drivers/net/ethernet/sfc/built-in.a
  CC      drivers/opp/debugfs.o
  AR      drivers/thermal/st/built-in.a
  AR      drivers/thermal/qcom/built-in.a
  AR      drivers/thermal/tegra/built-in.a
  CC      lib/kstrtox.o
  AR      drivers/thermal/mediatek/built-in.a
  CC      drivers/thermal/thermal_core.o
  HOSTCC  drivers/gpu/drm/xe/xe_gen_wa_oob
  AR      drivers/net/ethernet/smsc/built-in.a
  CC [M]  drivers/net/ethernet/smsc/smsc9420.o
  CC      drivers/thermal/thermal_sysfs.o
  CC      fs/ioctl.o
  CC      kernel/latencytop.o
  AR      drivers/net/ethernet/socionext/built-in.a
  CC      kernel/irq_work.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/core/subdev.o
  CC [M]  drivers/gpu/drm/drm_color_mgmt.o
  CC      kernel/static_call.o
  CC      drivers/acpi/acpica/nsxfobj.o
  AR      drivers/net/ethernet/vertexcom/built-in.a
  CC      drivers/md/md.o
  CC [M]  drivers/md/persistent-data/dm-space-map-common.o
  CC      net/ipv4/proc.o
  CC      drivers/acpi/acpica/psargs.o
  LD [M]  drivers/net/vxlan/vxlan.o
  CC      drivers/net/virtio_net.o
  CC [M]  fs/smb/client/smb2misc.o
  CC [M]  drivers/md/persistent-data/dm-space-map-disk.o
  CC      drivers/cpufreq/cpufreq.o
  CC      drivers/cpuidle/governors/menu.o
  CC      drivers/cpuidle/cpuidle.o
  CC [M]  drivers/gpu/drm/drm_connector.o
  CC      lib/debug_info.o
  CC      drivers/cpuidle/governors/haltpoll.o
  CC [M]  drivers/gpu/drm/xe/xe_guc_ads.o
  CC [M]  fs/smb/client/smb2pdu.o
  AR      drivers/watchdog/built-in.a
  CC      drivers/usb/host/xhci-trace.o
  CC      lib/iomap.o
  CC      lib/pci_iomap.o
  CC      drivers/usb/host/xhci-debugfs.o
  CC      drivers/usb/core/usb-acpi.o
  CC      net/ipv4/syncookies.o
  AR      drivers/hwmon/built-in.a
  CC [M]  drivers/gpu/drm/i915/soc/intel_pch.o
  CC      kernel/static_call_inline.o
  CC [M]  drivers/gpu/drm/i915/i915_memcpy.o
  CC      drivers/cpuidle/driver.o
  CC      drivers/thermal/thermal_trip.o
  CC      drivers/mmc/core/core.o
  AR      drivers/opp/built-in.a
  CC      drivers/mmc/host/sdhci.o
  CC      drivers/acpi/acpica/psloop.o
  CC      drivers/mmc/host/sdhci-pci-core.o
  CC      drivers/mmc/host/sdhci-pci-o2micro.o
  CC      drivers/acpi/acpica/psobject.o
  CC      drivers/mmc/host/sdhci-pci-arasan.o
  CC [M]  drivers/gpu/drm/drm_crtc.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/amdgpu_sa.o
  CC      drivers/usb/host/xhci-pci.o
  CC      drivers/net/net_failover.o
  AR      drivers/net/ethernet/wangxun/built-in.a
  AR      drivers/net/ethernet/xilinx/built-in.a
  AR      drivers/net/ethernet/synopsys/built-in.a
  CC [M]  drivers/gpu/drm/nouveau/nvkm/core/uevent.o
  AR      drivers/net/ethernet/pensando/built-in.a
  CC [M]  drivers/gpu/drm/nouveau/nvkm/nvfw/fw.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/nvfw/hs.o
  CC [M]  drivers/gpu/drm/drm_displayid.o
  CC      drivers/acpi/prmt.o
  AR      drivers/ufs/built-in.a
  CC      drivers/thermal/thermal_helpers.o
  CC [M]  drivers/md/persistent-data/dm-space-map-metadata.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/atombios_i2c.o
  CC      fs/readdir.o
  AR      drivers/cpuidle/governors/built-in.a
  CC      drivers/cpuidle/governor.o
  LD [M]  drivers/net/ethernet/intel/ixgbe/ixgbe.o
  CC      drivers/cpuidle/sysfs.o
  CC      kernel/user-return-notifier.o
  CC      drivers/cpuidle/poll_state.o
  LD [M]  drivers/net/ethernet/realtek/r8169.o
  CC [M]  drivers/gpu/drm/i915/i915_mm.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/nvfw/ls.o
  CC [M]  drivers/md/persistent-data/dm-transaction-manager.o
  CC      drivers/acpi/acpica/psopcode.o
  AR      drivers/usb/core/built-in.a
  CC      drivers/acpi/acpica/psopinfo.o
  CC      drivers/mmc/core/bus.o
  AR      drivers/leds/trigger/built-in.a
  CC [M]  drivers/leds/trigger/ledtrig-audio.o
  AR      drivers/firmware/arm_ffa/built-in.a
  AR      drivers/firmware/arm_scmi/built-in.a
  AR      drivers/crypto/stm32/built-in.a
  AR      drivers/firmware/broadcom/built-in.a
  AR      drivers/crypto/xilinx/built-in.a
  AR      drivers/firmware/cirrus/built-in.a
  AR      drivers/crypto/hisilicon/trng/built-in.a
  CC      net/ipv4/esp4.o
  AR      drivers/firmware/meson/built-in.a
  CC      kernel/padata.o
  AR      drivers/crypto/hisilicon/built-in.a
  AR      drivers/net/ethernet/built-in.a
  AR      drivers/crypto/intel/keembay/built-in.a
  CC      drivers/clocksource/acpi_pm.o
  CC      lib/iomap_copy.o
  AR      drivers/crypto/intel/ixp4xx/built-in.a
  AR      drivers/crypto/intel/built-in.a
  CC      drivers/clocksource/i8253.o
  AR      drivers/crypto/built-in.a
  CC [M]  drivers/gpu/drm/xe/xe_guc_ct.o
  CC      drivers/mmc/core/host.o
  CC [M]  drivers/net/dummy.o
  CC      drivers/firmware/efi/libstub/efi-stub-helper.o
  CC [M]  drivers/gpu/drm/xe/xe_guc_debugfs.o
  CC      drivers/firmware/efi/libstub/gop.o
  CC      drivers/thermal/thermal_hwmon.o
  CC [M]  fs/smb/client/smb2inode.o
  CC      drivers/acpi/acpica/psparse.o
  CC [M]  drivers/gpu/drm/i915/i915_sw_fence.o
  CC      drivers/thermal/gov_fair_share.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/nvfw/acr.o
  CC      lib/devres.o
  CC      lib/check_signature.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/nvfw/flcn.o
  CC      drivers/cpuidle/cpuidle-haltpoll.o
  CC [M]  drivers/gpu/drm/i915/i915_sw_fence_work.o
  CC [M]  drivers/gpu/drm/xe/xe_guc_hwconfig.o
  CC [M]  drivers/gpu/drm/i915/i915_syncmap.o
  AR      drivers/leds/blink/built-in.a
  AR      drivers/leds/simple/built-in.a
  CC      drivers/leds/led-core.o
  CC      drivers/hid/usbhid/hid-core.o
  AR      drivers/staging/media/built-in.a
  AR      drivers/staging/built-in.a
  CC      drivers/firmware/efi/libstub/secureboot.o
  CC [M]  drivers/net/macvlan.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/amdgpu_dma_buf.o
  CC      drivers/mmc/core/mmc.o
  CC      drivers/acpi/acpi_pcc.o
  CC      drivers/mmc/core/mmc_ops.o
  CC [M]  drivers/md/persistent-data/dm-btree.o
  CC [M]  drivers/net/mii.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/amdgpu_vm.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/amdgpu_vm_pt.o
  AR      drivers/clocksource/built-in.a
  CC      drivers/cpufreq/freq_table.o
  CC [M]  drivers/gpu/drm/i915/i915_user_extensions.o
  CC [M]  drivers/gpu/drm/i915/i915_ioc32.o
  CC      drivers/mmc/host/sdhci-pci-dwc-mshc.o
  CC [M]  drivers/gpu/drm/xe/xe_guc_log.o
  CC      drivers/mmc/host/sdhci-pci-gli.o
  CC      drivers/acpi/ac.o
  CC      drivers/thermal/gov_step_wise.o
  CC      drivers/acpi/acpica/psscope.o
  AR      drivers/cpuidle/built-in.a
  CC [M]  drivers/gpu/drm/xe/xe_guc_pc.o
  CC      drivers/acpi/button.o
  CC      drivers/acpi/acpica/pstree.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/amdgpu_ib.o
  CC      drivers/hid/hid-core.o
  CC      drivers/acpi/acpica/psutils.o
  CC      kernel/jump_label.o
  CC      kernel/context_tracking.o
  CC [M]  drivers/md/persistent-data/dm-btree-remove.o
  AR      drivers/usb/host/built-in.a
  AR      drivers/usb/built-in.a
  CC      lib/interval_tree.o
  CC      drivers/mmc/host/sdhci-acpi.o
  CC      drivers/mmc/host/cqhci-core.o
  CC      drivers/leds/led-class.o
  CC      drivers/firmware/efi/libstub/tpm.o
  CC      drivers/firmware/efi/libstub/file.o
  AR      drivers/platform/x86/amd/built-in.a
  CC      drivers/platform/x86/intel/pmc/core.o
  CC [M]  drivers/platform/x86/intel/pmt/class.o
  CC      drivers/platform/x86/p2sb.o
  CC      drivers/mailbox/mailbox.o
  CC      drivers/acpi/acpica/pswalk.o
  CC      drivers/thermal/gov_user_space.o
  CC      drivers/cpufreq/cpufreq_performance.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/falcon/base.o
  CC      lib/assoc_array.o
  CC      drivers/devfreq/devfreq.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/amdgpu_pll.o
  CC      fs/btrfs/delayed-inode.o
  CC [M]  drivers/devfreq/governor_simpleondemand.o
  CC [M]  drivers/gpu/drm/i915/i915_debugfs.o
  CC      fs/btrfs/scrub.o
  CC [M]  drivers/md/persistent-data/dm-btree-spine.o
  CC [M]  drivers/devfreq/governor_performance.o
  CC      drivers/mmc/core/sd.o
  CC      drivers/md/md-bitmap.o
  CC      drivers/mmc/core/sd_ops.o
  CC      drivers/acpi/acpica/psxface.o
  CC      drivers/md/md-autodetect.o
  CC      kernel/iomem.o
  CC      drivers/leds/led-triggers.o
  CC      kernel/rseq.o
  CC      drivers/md/dm-uevent.o
  CC      drivers/cpufreq/cpufreq_ondemand.o
  CC [M]  drivers/mmc/host/sdhci-pltfm.o
  AR      drivers/thermal/built-in.a
  CC      fs/btrfs/backref.o
  CC      drivers/mailbox/pcc.o
  CC      net/ipv4/esp4_offload.o
  CC      drivers/hid/hid-input.o
  CC      drivers/firmware/efi/libstub/mem.o
  CC      drivers/hid/hid-quirks.o
  CC      drivers/acpi/acpica/rsaddr.o
  CC      fs/btrfs/ulist.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.o
  CC      drivers/platform/x86/intel/pmc/spt.o
  CC      drivers/platform/x86/pmc_atom.o
  CC [M]  drivers/platform/x86/intel/pmt/telemetry.o
  CC      drivers/hid/usbhid/hiddev.o
  CC [M]  drivers/gpu/drm/xe/xe_guc_submit.o
  CC      drivers/platform/x86/intel/turbo_max_3.o
  CC      drivers/powercap/powercap_sys.o
  AR      drivers/perf/built-in.a
  CC [M]  drivers/gpu/drm/drm_drv.o
  CC      drivers/powercap/intel_rapl_common.o
  LD [M]  drivers/md/persistent-data/dm-persistent-data.o
  CC      drivers/acpi/acpica/rscalc.o
  CC [M]  drivers/gpu/drm/xe/xe_hw_engine.o
  CC      net/ipv4/netfilter.o
  CC      lib/list_debug.o
  CC      drivers/hid/hid-debug.o
  CC      drivers/firmware/efi/efi-bgrt.o
  GZIP    kernel/config_data.gz
  CC      kernel/configs.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/falcon/cmdq.o
  CC      lib/debugobjects.o
  CC      net/ipv4/inet_diag.o
  CC [M]  drivers/platform/x86/wmi.o
  CC      drivers/firmware/efi/efi.o
  CC      fs/btrfs/qgroup.o
  CC      drivers/firmware/efi/libstub/random.o
  CC      drivers/platform/x86/intel/pmc/cnp.o
  CC      drivers/firmware/efi/libstub/randomalloc.o
  AR      drivers/mailbox/built-in.a
  CC      fs/btrfs/send.o
  AR      drivers/leds/built-in.a
  CC [M]  drivers/net/mdio.o
  CC      drivers/hid/hidraw.o
  CC      drivers/acpi/acpica/rscreate.o
  CC [M]  drivers/platform/x86/wmi-bmof.o
  CC      drivers/firmware/efi/libstub/pci.o
  CC      drivers/cpufreq/cpufreq_governor.o
  AR      drivers/mmc/host/built-in.a
  CC      lib/bitrev.o
  AR      drivers/firmware/imx/built-in.a
  CC      drivers/acpi/fan_core.o
  CC [M]  drivers/platform/x86/intel/pmt/crashlog.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/amdgpu_bo_list.o
  CC [M]  fs/smb/client/smb2file.o
  CC      drivers/powercap/intel_rapl_msr.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/falcon/fw.o
  CC      drivers/mmc/core/sdio.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/falcon/msgq.o
  CC [M]  drivers/gpu/drm/i915/i915_debugfs_params.o
  AR      kernel/built-in.a
  AR      drivers/platform/surface/built-in.a
  CC [M]  drivers/gpu/drm/i915/display/intel_display_debugfs.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.o
  CC [M]  drivers/platform/x86/mxm-wmi.o
  LD [M]  drivers/platform/x86/intel/pmt/pmt_class.o
  CC      lib/crc16.o
  CC      drivers/mmc/core/sdio_ops.o
  CC      drivers/acpi/acpica/rsdumpinfo.o
  AR      drivers/devfreq/built-in.a
  CC      drivers/platform/x86/intel/pmc/icl.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/amdgpu_sync.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/amdgpu_gtt_mgr.o
  CC      drivers/platform/x86/intel/pmc/tgl.o
  CC [M]  drivers/platform/x86/intel_ips.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/falcon/qmgr.o
  AR      drivers/hid/usbhid/built-in.a
  CC      drivers/hid/hid-generic.o
  CC      drivers/md/dm.o
  CC      drivers/firmware/efi/libstub/skip_spaces.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/amdgpu_preempt_mgr.o
  CC      drivers/firmware/efi/libstub/lib-cmdline.o
  CC [M]  drivers/platform/x86/intel/vsec.o
  LD [M]  drivers/platform/x86/intel/pmt/pmt_telemetry.o
  LD [M]  drivers/platform/x86/intel/pmt/pmt_crashlog.o
  CC      drivers/acpi/fan_attr.o
  CC [M]  drivers/net/tun.o
  CC      drivers/cpufreq/cpufreq_governor_attr_set.o
  CC [M]  drivers/gpu/drm/drm_dumb_buffers.o
  CC      net/ipv4/tcp_diag.o
  CC [M]  drivers/gpu/drm/drm_edid.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/falcon/v1.o
  CC      drivers/platform/x86/intel/pmc/adl.o
  CC [M]  drivers/gpu/drm/drm_encoder.o
  CC [M]  drivers/gpu/drm/drm_file.o
  CC      drivers/firmware/efi/libstub/lib-ctype.o
  CC      drivers/acpi/acpica/rsinfo.o
  CC      drivers/firmware/efi/libstub/alignedmem.o
  AR      drivers/powercap/built-in.a
  CC [M]  drivers/gpu/drm/drm_fourcc.o
  CC [M]  drivers/gpu/drm/xe/xe_hw_fence.o
  CC      drivers/hid/hid-a4tech.o
  CC      drivers/cpufreq/acpi-cpufreq.o
  CC      drivers/acpi/acpica/rsio.o
  CC      lib/crc-t10dif.o
  CC      drivers/acpi/acpica/rsirq.o
  CC      drivers/firmware/efi/vars.o
  CC      fs/btrfs/dev-replace.o
  CC      drivers/platform/x86/intel/pmc/mtl.o
  CC      drivers/mmc/core/sdio_bus.o
  CC      drivers/acpi/processor_driver.o
  CC [M]  drivers/gpu/drm/drm_framebuffer.o
  CC      drivers/hid/hid-apple.o
  HOSTCC  lib/gen_crc32table
  CC      lib/libcrc32c.o
  CC      drivers/acpi/processor_thermal.o
  CC      drivers/cpufreq/intel_pstate.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/falcon/gm200.o
  CC      drivers/md/dm-table.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.o
  CC      drivers/ras/ras.o
  CC      fs/btrfs/raid56.o
  CC      drivers/ras/debugfs.o
  CC      drivers/acpi/acpica/rslist.o
  CC      drivers/acpi/processor_idle.o
  CC [M]  drivers/gpu/drm/i915/display/intel_pipe_crc.o
  CC [M]  drivers/net/veth.o
  AR      drivers/hwtracing/intel_th/built-in.a
  CC      fs/btrfs/uuid-tree.o
  CC      net/ipv4/udp_diag.o
  CC      drivers/md/dm-target.o
  CC      drivers/firmware/efi/libstub/relocate.o
  CC      drivers/md/dm-linear.o
  CC      fs/btrfs/props.o
  CC [M]  fs/smb/client/cifsacl.o
  CC [M]  drivers/gpu/drm/drm_gem.o
  CC      lib/xxhash.o
  CC [M]  drivers/gpu/drm/i915/i915_pmu.o
  CC      fs/btrfs/free-space-tree.o
  CC [M]  drivers/gpu/drm/i915/gt/gen2_engine_cs.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/falcon/gp102.o
  CC [M]  fs/smb/client/fs_context.o
  CC [M]  drivers/gpu/drm/xe/xe_huc.o
  CC      drivers/firmware/efi/reboot.o
  CC      drivers/firmware/efi/libstub/printk.o
  CC      drivers/platform/x86/intel/pmc/pltdrv.o
  CC      drivers/hid/hid-belkin.o
  CC      drivers/acpi/processor_throttling.o
  CC      drivers/acpi/acpica/rsmemory.o
  CC      net/ipv4/tcp_cubic.o
  CC      net/ipv4/xfrm4_policy.o
  CC [M]  fs/smb/client/dns_resolve.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/falcon/ga100.o
  CC [M]  drivers/gpu/drm/drm_ioctl.o
  CC      drivers/acpi/acpica/rsmisc.o
  CC      drivers/hid/hid-cherry.o
  CC      drivers/mmc/core/sdio_cis.o
  CC      lib/genalloc.o
  CC      drivers/mmc/core/sdio_io.o
  CC      drivers/hid/hid-chicony.o
  ASN.1   fs/smb/client/cifs_spnego_negtokeninit.asn1.[ch]
  CC [M]  fs/smb/client/smb1ops.o
  CC      drivers/acpi/processor_perflib.o
  CC      drivers/firmware/efi/libstub/vsprintf.o
  CC      drivers/firmware/efi/libstub/x86-stub.o
  AR      drivers/platform/x86/intel/pmc/built-in.a
  CC [M]  drivers/platform/x86/intel/rst.o
  CC [M]  drivers/gpu/drm/i915/gt/gen6_engine_cs.o
  CC [M]  drivers/gpu/drm/xe/xe_huc_debugfs.o
  AR      drivers/ras/built-in.a
  CC [M]  drivers/gpu/drm/i915/gt/gen6_ppgtt.o
  CC      drivers/acpi/container.o
  LD [M]  drivers/platform/x86/intel/intel_vsec.o
  AR      drivers/platform/x86/intel/built-in.a
  CC [M]  drivers/gpu/drm/drm_lease.o
  CC [M]  drivers/gpu/drm/drm_managed.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/falcon/ga102.o
  CC      drivers/acpi/acpica/rsserial.o
  STUBCPY drivers/firmware/efi/libstub/alignedmem.stub.o
  CC      drivers/mmc/core/sdio_irq.o
  CC      drivers/firmware/efi/memattr.o
  CC [M]  drivers/gpu/drm/i915/gt/gen7_renderclear.o
  CC      drivers/acpi/thermal.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/amdgpu_virt.o
  CC      drivers/md/dm-stripe.o
  CC      drivers/mmc/core/slot-gpio.o
  CC      drivers/mmc/core/regulator.o
  CC      drivers/firmware/efi/tpm.o
  CC      drivers/acpi/acpica/rsutils.o
  CC      lib/percpu_counter.o
  CC      drivers/mmc/core/debugfs.o
  CC [M]  drivers/gpu/drm/drm_mm.o
  LD [M]  drivers/platform/x86/intel/intel-rst.o
  CC [M]  fs/smb/client/cifssmb.o
  AR      drivers/platform/x86/built-in.a
  CC [M]  drivers/gpu/drm/i915/gt/gen8_engine_cs.o
  CC [M]  fs/smb/client/cifs_spnego_negtokeninit.asn1.o
  AR      drivers/platform/built-in.a
  CC      drivers/acpi/acpi_memhotplug.o
  CC      drivers/md/dm-ioctl.o
  CC      fs/btrfs/tree-checker.o
  CC      drivers/acpi/acpica/rsxface.o
  AR      drivers/net/built-in.a
  CC [M]  drivers/gpu/drm/i915/gt/gen8_ppgtt.o
  CC      fs/btrfs/space-info.o
  CC      lib/fault-inject.o
  CC      net/ipv4/xfrm4_state.o
  CC      fs/btrfs/block-rsv.o
  CC      drivers/firmware/efi/memmap.o
  CC      drivers/hid/hid-cypress.o
  CC [M]  drivers/gpu/drm/xe/xe_irq.o
  CC [M]  fs/smb/client/asn1.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/amdgpu_atomfirmware.o
  CC      net/ipv4/xfrm4_input.o
  STUBCPY drivers/firmware/efi/libstub/efi-stub-helper.stub.o
  STUBCPY drivers/firmware/efi/libstub/file.stub.o
  STUBCPY drivers/firmware/efi/libstub/gop.stub.o
  STUBCPY drivers/firmware/efi/libstub/lib-cmdline.stub.o
  CC [M]  drivers/gpu/drm/drm_mode_config.o
  AR      drivers/firmware/psci/built-in.a
  STUBCPY drivers/firmware/efi/libstub/lib-ctype.stub.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/amdgpu_vf_error.o
  STUBCPY drivers/firmware/efi/libstub/mem.stub.o
  CC      fs/btrfs/delalloc-space.o
  STUBCPY drivers/firmware/efi/libstub/pci.stub.o
  STUBCPY drivers/firmware/efi/libstub/printk.stub.o
  CC      drivers/acpi/ioapic.o
  STUBCPY drivers/firmware/efi/libstub/random.stub.o
  STUBCPY drivers/firmware/efi/libstub/randomalloc.stub.o
  STUBCPY drivers/firmware/efi/libstub/relocate.stub.o
  STUBCPY drivers/firmware/efi/libstub/secureboot.stub.o
  STUBCPY drivers/firmware/efi/libstub/skip_spaces.stub.o
  STUBCPY drivers/firmware/efi/libstub/tpm.stub.o
  STUBCPY drivers/firmware/efi/libstub/vsprintf.stub.o
  STUBCPY drivers/firmware/efi/libstub/x86-stub.stub.o
  CC      lib/syscall.o
  AR      drivers/firmware/efi/libstub/lib.a
  CC      net/ipv4/xfrm4_output.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/amdgpu_sched.o
  AR      drivers/cpufreq/built-in.a
  CC      drivers/android/binderfs.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/acr/base.o
  CC      drivers/md/dm-io.o
  CC      drivers/md/dm-kcopyd.o
  CC      drivers/android/binder.o
  CC      drivers/android/binder_alloc.o
  CC      drivers/acpi/acpica/tbdata.o
  CC      fs/btrfs/block-group.o
  CC      drivers/acpi/acpica/tbfadt.o
  CC      drivers/md/dm-sysfs.o
  CC [M]  drivers/gpu/drm/xe/xe_lrc.o
  CC      drivers/mmc/core/block.o
  CC [M]  drivers/gpu/drm/drm_mode_object.o
  CC [M]  drivers/gpu/drm/i915/gt/intel_breadcrumbs.o
  CC      fs/btrfs/discard.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/acr/lsfw.o
  CC      drivers/acpi/acpica/tbfind.o
  AR      drivers/firmware/smccc/built-in.a
  AR      drivers/firmware/tegra/built-in.a
  CC      drivers/firmware/dmi_scan.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/acr/gm200.o
  AR      drivers/firmware/xilinx/built-in.a
  CC      fs/btrfs/reflink.o
  CC      drivers/firmware/efi/esrt.o
  CC      drivers/hid/hid-ezkey.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/amdgpu_debugfs.o
  CC      lib/dynamic_debug.o
  CC      drivers/acpi/battery.o
  CC [M]  drivers/gpu/drm/drm_modes.o
  CC      drivers/acpi/hed.o
  CC      fs/select.o
  AR      drivers/nvmem/layouts/built-in.a
  CC      drivers/nvmem/core.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/amdgpu_ids.o
  CC [M]  drivers/uio/uio.o
  CC [M]  drivers/mtd/chips/chipreg.o
  CC      drivers/acpi/acpica/tbinstal.o
  CC [M]  drivers/vfio/pci/vfio_pci_core.o
  CC      drivers/firmware/efi/efi-pstore.o
  CC      net/ipv4/xfrm4_protocol.o
  CC [M]  drivers/vfio/vfio_main.o
  CC      drivers/firmware/dmi-sysfs.o
  CC [M]  drivers/gpu/drm/i915/gt/intel_context.o
  CC [M]  net/ipv4/ip_tunnel.o
  CC [M]  drivers/gpu/drm/xe/xe_migrate.o
  CC      fs/btrfs/subpage.o
  CC [M]  drivers/gpu/drm/i915/gt/intel_context_sseu.o
  CC      drivers/acpi/acpica/tbprint.o
  CC      fs/dcache.o
  CC [M]  drivers/gpu/drm/i915/gt/intel_engine_cs.o
  CC      drivers/acpi/acpica/tbutils.o
  CC      fs/inode.o
  CC      drivers/md/dm-stats.o
  CC [M]  drivers/vfio/pci/vfio_pci_intrs.o
  CC      drivers/firmware/dmi-id.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/acr/gm20b.o
  CC      drivers/firmware/efi/cper.o
  CC      drivers/hid/hid-kensington.o
  CC      drivers/hid/hid-lg.o
  CC      fs/btrfs/tree-mod-log.o
  CC      drivers/acpi/acpica/tbxface.o
  CC [M]  drivers/gpu/drm/drm_modeset_lock.o
  CC      fs/btrfs/extent-io-tree.o
  CC [M]  drivers/mtd/mtdcore.o
  CC      drivers/firmware/efi/cper_cxl.o
  CC      drivers/firmware/efi/runtime-wrappers.o
  CC      drivers/mmc/core/queue.o
  CC      fs/btrfs/fs.o
  CC      drivers/md/dm-rq.o
  CC      drivers/firmware/efi/dev-path-parser.o
  CC      drivers/acpi/acpica/tbxfload.o
  CC      drivers/acpi/bgrt.o
  CC      drivers/acpi/acpica/tbxfroot.o
  CC      drivers/hid/hid-lg-g15.o
  CC      drivers/firmware/memmap.o
  CC [M]  drivers/mtd/mtdsuper.o
  CC      drivers/firmware/efi/apple-properties.o
  CC      drivers/acpi/acpica/utaddress.o
  CC [M]  drivers/gpu/drm/i915/gt/intel_engine_heartbeat.o
  CC [M]  drivers/vfio/group.o
  CC      drivers/firmware/efi/earlycon.o
  AR      drivers/nvmem/built-in.a
  CC      lib/errname.o
  CC      drivers/hid/hid-microsoft.o
  CC      lib/nlattr.o
  CC      lib/checksum.o
  CC      drivers/acpi/acpica/utalloc.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/acr/gp102.o
  CC [M]  drivers/mtd/mtdconcat.o
  CC      drivers/hid/hid-monterey.o
  CC      drivers/acpi/cppc_acpi.o
  CC [M]  drivers/vfio/pci/vfio_pci_rdwr.o
  CC [M]  drivers/gpu/drm/drm_plane.o
  CC [M]  net/ipv4/udp_tunnel_core.o
  CC [M]  drivers/gpu/drm/drm_prime.o
  CC      fs/btrfs/messages.o
  CC [M]  drivers/pps/pps.o
  CC      fs/btrfs/bio.o
  CC [M]  drivers/vfio/iova_bitmap.o
  CC [M]  drivers/gpu/drm/drm_print.o
  CC [M]  net/ipv4/udp_tunnel_nic.o
  CC      drivers/firmware/efi/cper-x86.o
  AR      drivers/mmc/core/built-in.a
  AR      drivers/mmc/built-in.a
  CC [M]  drivers/bluetooth/btusb.o
  CC [M]  drivers/dca/dca-core.o
  CC [M]  drivers/dca/dca-sysfs.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.o
  CC [M]  drivers/bluetooth/btintel.o
  CC [M]  drivers/mtd/mtdpart.o
  CC      fs/btrfs/lru_cache.o
  CC      drivers/acpi/acpica/utascii.o
  CC [M]  drivers/vfio/pci/vfio_pci_config.o
  CC      drivers/acpi/acpica/utbuffer.o
  CC [M]  drivers/gpu/drm/xe/xe_mmio.o
  CC      fs/attr.o
  CC      fs/bad_inode.o
  CC      drivers/md/dm-io-rewind.o
  CC [M]  drivers/bluetooth/btbcm.o
  CC [M]  drivers/bluetooth/btrtl.o
  CC      drivers/acpi/acpica/utcksum.o
  CC [M]  drivers/vfio/container.o
  CC      drivers/md/dm-builtin.o
  AR      drivers/hid/built-in.a
  CC [M]  drivers/pps/kapi.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/amdgpu_mmhub.o
  CC      drivers/acpi/spcr.o
  CC [M]  drivers/gpu/drm/xe/xe_mocs.o
  CC      drivers/acpi/acpica/utcopy.o
  CC [M]  drivers/md/dm-bufio.o
  CC [M]  drivers/gpu/drm/drm_property.o
  AR      drivers/firmware/efi/built-in.a
  AR      drivers/firmware/built-in.a
  CC [M]  drivers/gpu/drm/drm_syncobj.o
  CC [M]  drivers/gpu/drm/drm_sysfs.o
  CC      fs/btrfs/acl.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/amdgpu_hdp.o
  CC      drivers/acpi/acpica/utexcep.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/acr/gp108.o
  CC      lib/cpu_rmap.o
  CC [M]  drivers/gpu/drm/drm_trace_points.o
  CC [M]  drivers/vfio/pci/vfio_pci.o
  CC [M]  drivers/gpu/drm/drm_vblank.o
  CC [M]  drivers/md/dm-bio-prison-v1.o
  CC [M]  drivers/mtd/mtdchar.o
  CC      drivers/acpi/acpica/utdebug.o
  LD [M]  drivers/dca/dca.o
  CC [M]  drivers/gpu/drm/i915/gt/intel_engine_pm.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/amdgpu_xgmi.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/amdgpu_csa.o
  CC [M]  drivers/gpu/drm/drm_vblank_work.o
  CC      lib/dynamic_queue_limits.o
  CC [M]  drivers/vfio/virqfd.o
  CC [M]  drivers/vfio/vfio_iommu_type1.o
  AR      net/ipv4/built-in.a
  CC [M]  drivers/gpu/drm/drm_vma_manager.o
  CC [M]  drivers/gpu/drm/xe/xe_module.o
  CC [M]  drivers/ssb/main.o
  CC [M]  drivers/vhost/net.o
  CC      drivers/acpi/acpi_pad.o
  CC [M]  drivers/ssb/scan.o
  CC [M]  drivers/vhost/vhost.o
  CC      lib/glob.o
  CC [M]  drivers/gpu/drm/i915/gt/intel_engine_user.o
  CC [M]  drivers/pps/sysfs.o
  CC [M]  drivers/ssb/sprom.o
  CC [M]  drivers/ssb/pci.o
  CC      drivers/acpi/acpica/utdecode.o
  CC      lib/strncpy_from_user.o
  CC      fs/file.o
  CC [M]  drivers/md/dm-bio-prison-v2.o
  LD [M]  fs/smb/client/cifs.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/amdgpu_ras.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/amdgpu_vm_cpu.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/amdgpu_vm_sdma.o
  LD [M]  drivers/vfio/pci/vfio-pci.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/amdgpu_discovery.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/amdgpu_ras_eeprom.o
  LD [M]  net/ipv4/udp_tunnel.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/acr/gv100.o
  CC [M]  drivers/gpu/drm/xe/xe_pat.o
  CC      fs/filesystems.o
  AR      net/built-in.a
  CC      lib/strnlen_user.o
  CC      fs/namespace.o
  LD [M]  drivers/pps/pps_core.o
  CC      lib/net_utils.o
  LD [M]  drivers/vfio/pci/vfio-pci-core.o
  CC [M]  drivers/acpi/acpi_video.o
  CC [M]  drivers/acpi/video_detect.o
  CC      lib/sg_pool.o
  CC      fs/seq_file.o
  CC      lib/stackdepot.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/acr/gp10b.o
  CC [M]  drivers/md/dm-crypt.o
  CC      drivers/acpi/acpica/utdelete.o
  LD [M]  drivers/vfio/vfio.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/acr/tu102.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/acr/ga100.o
  CC      drivers/acpi/acpica/uterror.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/acr/ga102.o
  AR      fs/btrfs/built-in.a
  CC      fs/xattr.o
  CC      lib/ucs2_string.o
  CC [M]  drivers/md/dm-thin.o
  CC [M]  drivers/ssb/pcihost_wrapper.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/amdgpu_nbio.o
  CC [M]  drivers/md/dm-thin-metadata.o
  LD [M]  drivers/mtd/mtd.o
  AR      drivers/md/built-in.a
  CC [M]  drivers/gpu/drm/amd/amdgpu/amdgpu_umc.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/bar/base.o
  LD [M]  drivers/md/dm-bio-prison.o
  CC [M]  drivers/ssb/driver_chipcommon.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/smu_v11_0_i2c.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/amdgpu_fru_eeprom.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/amdgpu_rap.o
  CC [M]  drivers/vhost/iotlb.o
  CC      lib/sbitmap.o
  CC      drivers/acpi/acpica/uteval.o
  CC      drivers/acpi/acpica/utglobal.o
  CC      fs/libfs.o
  CC      lib/group_cpus.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/bar/nv50.o
  CC [M]  lib/asn1_decoder.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/bar/g84.o
  CC [M]  drivers/gpu/drm/drm_gpuva_mgr.o
  CC [M]  drivers/gpu/drm/xe/xe_pci.o
  CC [M]  drivers/gpu/drm/drm_writeback.o
  CC      drivers/acpi/acpica/uthex.o
  GEN     lib/oid_registry_data.c
  CC      drivers/acpi/acpica/utids.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/amdgpu_fw_attestation.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/amdgpu_securedisplay.o
  CC [M]  drivers/gpu/drm/xe/xe_pcode.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/amdgpu_eeprom.o
  CC [M]  drivers/gpu/drm/i915/gt/intel_execlists_submission.o
  CC [M]  drivers/ssb/driver_chipcommon_pmu.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/amdgpu_mca.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/amdgpu_psp_ta.o
  CC [M]  drivers/gpu/drm/xe/xe_pm.o
  CC      drivers/acpi/acpica/utinit.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/bar/gf100.o
  CC      drivers/acpi/acpica/utlock.o
  CC      drivers/acpi/acpica/utmath.o
  CC      fs/fs-writeback.o
  AR      drivers/android/built-in.a
  CC      fs/pnode.o
  CC [M]  drivers/gpu/drm/lib/drm_random.o
  LD [M]  drivers/vhost/vhost_iotlb.o
  CC [M]  drivers/gpu/drm/drm_ioc32.o
  CC      drivers/acpi/acpica/utmisc.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/bar/gk20a.o
  CC      drivers/acpi/acpica/utmutex.o
  CC [M]  lib/oid_registry.o
  CC      drivers/acpi/acpica/utnonansi.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/amdgpu_lsdma.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/amdgpu_ring_mux.o
  CC [M]  drivers/gpu/drm/xe/xe_preempt_fence.o
  CC [M]  drivers/gpu/drm/xe/xe_pt.o
  CC [M]  drivers/ssb/driver_pcicore.o
  CC      drivers/acpi/acpica/utobject.o
  CC      drivers/acpi/acpica/utosi.o
  CC      drivers/acpi/acpica/utownerid.o
  CC      fs/splice.o
  CC [M]  drivers/gpu/drm/i915/gt/intel_ggtt.o
  LD [M]  drivers/vhost/vhost_net.o
  CC [M]  drivers/gpu/drm/drm_panel.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/amdgpu_xcp.o
  CC [M]  drivers/gpu/drm/drm_pci.o
  CC      drivers/acpi/acpica/utpredef.o
  CC [M]  drivers/gpu/drm/xe/xe_pt_walk.o
  LD [M]  drivers/acpi/video.o
  CC      fs/sync.o
  CC      fs/utimes.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/bar/gm107.o
  AR      lib/lib.a
  GEN     lib/crc32table.h
  CC [M]  drivers/gpu/drm/i915/gt/intel_ggtt_fencing.o
  CC [M]  drivers/gpu/drm/xe/xe_query.o
  CC [M]  drivers/gpu/drm/i915/gt/intel_gt.o
  CC      lib/crc32.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/amdgpu_fdinfo.o
  CC      fs/d_path.o
  CC [M]  drivers/gpu/drm/drm_debugfs.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/amdgpu_pmu.o
  CC      drivers/acpi/acpica/utresdecode.o
  CC      drivers/acpi/acpica/utresrc.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/bar/gm20b.o
  CC [M]  drivers/gpu/drm/xe/xe_range_fence.o
  CC [M]  drivers/gpu/drm/xe/xe_reg_sr.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/bar/tu102.o
  CC [M]  drivers/gpu/drm/i915/gt/intel_gt_buffer_pool.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/cik.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/cik_ih.o
  CC      drivers/acpi/acpica/utstate.o
  CC [M]  drivers/gpu/drm/drm_debugfs_crc.o
  CC      fs/stack.o
  CC [M]  drivers/gpu/drm/xe/xe_reg_whitelist.o
  CC [M]  drivers/gpu/drm/drm_edid_load.o
  CC [M]  drivers/gpu/drm/xe/xe_rtp.o
  CC      fs/fs_struct.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/bios/base.o
  CC      fs/statfs.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/bios/bit.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/dce_v8_0.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/gfx_v7_0.o
  CC      drivers/acpi/acpica/utstring.o
  LD [M]  drivers/ssb/ssb.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/cik_sdma.o
  CC [M]  drivers/gpu/drm/drm_panel_orientation_quirks.o
  GEN     xe_wa_oob.c xe_wa_oob.h
  GEN     xe_wa_oob.c xe_wa_oob.h
  CC [M]  drivers/gpu/drm/xe/xe_sa.o
  CC [M]  drivers/gpu/drm/drm_buddy.o
  CC      drivers/acpi/acpica/utstrsuppt.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/uvd_v4_2.o
  AR      lib/built-in.a
  CC [M]  drivers/gpu/drm/amd/amdgpu/vce_v2_0.o
  CC [M]  drivers/gpu/drm/drm_gem_shmem_helper.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/bios/boost.o
  CC      drivers/acpi/acpica/utstrtoul64.o
  CC      drivers/acpi/acpica/utxface.o
  CC      drivers/acpi/acpica/utxfinit.o
  CC      fs/fs_pin.o
  CC      fs/nsfs.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/bios/conn.o
  CC      drivers/acpi/acpica/utxferror.o
  CC      fs/fs_types.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/si.o
  CC [M]  drivers/gpu/drm/drm_suballoc.o
  CC [M]  drivers/gpu/drm/xe/xe_sched_job.o
  CC      drivers/acpi/acpica/utxfmutex.o
  CC [M]  drivers/gpu/drm/drm_gem_ttm_helper.o
  CC      fs/fs_context.o
  CC [M]  drivers/gpu/drm/xe/xe_step.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/gmc_v6_0.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/gfx_v6_0.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/si_ih.o
  CC [M]  drivers/gpu/drm/i915/gt/intel_gt_clock_utils.o
  CC      fs/fs_parser.o
  CC [M]  drivers/gpu/drm/i915/gt/intel_gt_debugfs.o
  LD [M]  drivers/md/dm-thin-pool.o
  CC [M]  drivers/gpu/drm/xe/xe_sync.o
  CC [M]  drivers/gpu/drm/drm_atomic_helper.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/bios/cstep.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/si_dma.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/dce_v6_0.o
  CC      fs/fsopen.o
  CC      fs/init.o
  CC [M]  drivers/gpu/drm/xe/xe_tile.o
  CC [M]  drivers/gpu/drm/xe/xe_tile_sysfs.o
  CC [M]  drivers/gpu/drm/xe/xe_trace.o
  CC [M]  drivers/gpu/drm/xe/xe_ttm_sys_mgr.o
  CC [M]  drivers/gpu/drm/i915/gt/intel_gt_engines_debugfs.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/bios/dcb.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/bios/disp.o
  CC      fs/kernel_read_file.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/bios/dp.o
  AR      drivers/acpi/acpica/built-in.a
  AR      drivers/acpi/built-in.a
  CC [M]  drivers/gpu/drm/xe/xe_ttm_stolen_mgr.o
  CC [M]  drivers/gpu/drm/drm_atomic_state_helper.o
  CC [M]  drivers/gpu/drm/xe/xe_ttm_vram_mgr.o
  CC [M]  drivers/gpu/drm/drm_bridge_connector.o
  CC [M]  drivers/gpu/drm/i915/gt/intel_gt_irq.o
  CC [M]  drivers/gpu/drm/xe/xe_tuning.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/bios/extdev.o
  CC [M]  drivers/gpu/drm/i915/gt/intel_gt_mcr.o
  CC [M]  drivers/gpu/drm/drm_crtc_helper.o
  CC      fs/mnt_idmapping.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/uvd_v3_1.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/bios/fan.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/vi.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/bios/gpio.o
  CC [M]  drivers/gpu/drm/xe/xe_uc.o
  CC      fs/remap_range.o
  CC      fs/buffer.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/mxgpu_vi.o
  CC      fs/mpage.o
  CC [M]  drivers/gpu/drm/xe/xe_uc_debugfs.o
  CC [M]  drivers/gpu/drm/xe/xe_uc_fw.o
  CC      fs/proc_namespace.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/bios/i2c.o
  CC [M]  drivers/gpu/drm/xe/xe_vm.o
  CC [M]  drivers/gpu/drm/xe/xe_vm_madvise.o
  CC [M]  drivers/gpu/drm/xe/xe_wait_user_fence.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/nbio_v6_1.o
  CC [M]  drivers/gpu/drm/xe/xe_wa.o
  CC [M]  drivers/gpu/drm/i915/gt/intel_gt_pm.o
  CC [M]  drivers/gpu/drm/xe/xe_wopcm.o
  CC [M]  drivers/gpu/drm/drm_damage_helper.o
  CC      fs/direct-io.o
  CC [M]  drivers/gpu/drm/i915/gt/intel_gt_pm_debugfs.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/bios/iccsense.o
  CC [M]  drivers/gpu/drm/i915/gt/intel_gt_pm_irq.o
  CC [M]  drivers/gpu/drm/drm_encoder_slave.o
  CC      fs/eventpoll.o
  CC [M]  drivers/gpu/drm/i915/gt/intel_gt_requests.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/bios/image.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/bios/init.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/soc15.o
  CC [M]  drivers/gpu/drm/drm_flip_work.o
  CC [M]  drivers/gpu/drm/xe/xe_display.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/bios/mxm.o
  CC [M]  drivers/gpu/drm/xe/display/xe_fb_pin.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/bios/npde.o
  CC [M]  drivers/gpu/drm/xe/display/xe_hdcp_gsc.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/emu_soc.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/bios/pcir.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/bios/perf.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/bios/pll.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/bios/pmu.o
  CC      fs/anon_inodes.o
  CC [M]  drivers/gpu/drm/drm_format_helper.o
  CC      fs/signalfd.o
  CC [M]  drivers/gpu/drm/i915/gt/intel_gt_sysfs.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/bios/power_budget.o
  CC [M]  drivers/gpu/drm/drm_gem_atomic_helper.o
  CC [M]  drivers/gpu/drm/xe/display/xe_plane_initial.o
  CC [M]  drivers/gpu/drm/i915/gt/intel_gt_sysfs_pm.o
  CC [M]  drivers/gpu/drm/xe/display/xe_display_rps.o
  CC [M]  drivers/gpu/drm/xe/display/ext/i915_irq.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/mxgpu_ai.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/nbio_v7_0.o
  CC      fs/timerfd.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/bios/ramcfg.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/bios/rammap.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/vega10_reg_init.o
  CC [M]  drivers/gpu/drm/drm_gem_framebuffer_helper.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/vega20_reg_init.o
  CC [M]  drivers/gpu/drm/drm_kms_helper_common.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/bios/shadow.o
  CC [M]  drivers/gpu/drm/i915/gt/intel_gtt.o
  CC [M]  drivers/gpu/drm/i915/gt/intel_llc.o
  CC      fs/eventfd.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/bios/shadowacpi.o
  CC      fs/userfaultfd.o
  CC      fs/aio.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/bios/shadowof.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/bios/shadowpci.o
  CC [M]  drivers/gpu/drm/xe/display/ext/intel_clock_gating.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/nbio_v7_4.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/nbio_v2_3.o
  CC [M]  drivers/gpu/drm/xe/display/ext/intel_device_info.o
  CC [M]  drivers/gpu/drm/i915/gt/intel_lrc.o
  CC [M]  drivers/gpu/drm/xe/i915-soc/intel_dram.o
  CC [M]  drivers/gpu/drm/i915/gt/intel_migrate.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/bios/shadowramin.o
  CC [M]  drivers/gpu/drm/drm_modeset_helper.o
  CC      fs/locks.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/nv.o
  CC [M]  drivers/gpu/drm/i915/gt/intel_mocs.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/bios/shadowrom.o
  CC [M]  drivers/gpu/drm/drm_plane_helper.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/bios/timing.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/arct_reg_init.o
  CC [M]  drivers/gpu/drm/i915/gt/intel_ppgtt.o
  CC [M]  drivers/gpu/drm/drm_probe_helper.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/mxgpu_nv.o
  CC [M]  drivers/gpu/drm/drm_rect.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/nbio_v7_2.o
  CC [M]  drivers/gpu/drm/i915/gt/intel_rc6.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/bios/therm.o
  CC [M]  drivers/gpu/drm/drm_self_refresh_helper.o
  CC [M]  drivers/gpu/drm/drm_simple_kms_helper.o
  CC [M]  drivers/gpu/drm/bridge/panel.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/bios/vmap.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/bios/volt.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/bios/vpstate.o
  CC      fs/binfmt_script.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/hdp_v4_0.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/hdp_v5_0.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/bios/xpio.o
  CC      fs/binfmt_elf.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/bios/M0203.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/bios/M0205.o
  CC [M]  drivers/gpu/drm/xe/i915-soc/intel_pch.o
  CC [M]  drivers/gpu/drm/i915/gt/intel_region_lmem.o
  CC      fs/compat_binfmt_elf.o
  CC [M]  drivers/gpu/drm/i915/gt/intel_renderstate.o
  CC [M]  drivers/gpu/drm/drm_fbdev_generic.o
  CC [M]  drivers/gpu/drm/drm_fb_helper.o
  LD [M]  drivers/gpu/drm/drm.o
  LD [M]  drivers/gpu/drm/drm_shmem_helper.o
  LD [M]  drivers/gpu/drm/drm_suballoc_helper.o
  LD [M]  drivers/gpu/drm/drm_ttm_helper.o
  AR      drivers/gpu/drm/built-in.a
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/bios/M0209.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/bios/P0260.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/aldebaran_reg_init.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/aldebaran.o
  CC [M]  drivers/gpu/drm/xe/i915-display/icl_dsi.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/bus/base.o
  CC      fs/mbcache.o
  CC [M]  drivers/gpu/drm/i915/gt/intel_reset.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/soc21.o
  CC      fs/posix_acl.o
  CC [M]  drivers/gpu/drm/i915/gt/intel_ring.o
  CC [M]  drivers/gpu/drm/i915/gt/intel_ring_submission.o
  CC [M]  drivers/gpu/drm/i915/gt/intel_rps.o
  CC [M]  drivers/gpu/drm/i915/gt/intel_sa_media.o
  CC [M]  drivers/gpu/drm/i915/gt/intel_sseu.o
  CC [M]  drivers/gpu/drm/i915/gt/intel_sseu_debugfs.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/bus/hwsq.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/bus/nv04.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/bus/nv31.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/bus/nv50.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/sienna_cichlid.o
  CC [M]  drivers/gpu/drm/i915/gt/intel_timeline.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/bus/g94.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/smu_v13_0_10.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/bus/gf100.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/clk/base.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/nbio_v4_3.o
  CC [M]  drivers/gpu/drm/i915/gt/intel_wopcm.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/hdp_v6_0.o
  CC      fs/coredump.o
  CC [M]  drivers/gpu/drm/xe/i915-display/intel_atomic.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/nbio_v7_7.o
  CC [M]  drivers/gpu/drm/i915/gt/intel_workarounds.o
  CC      fs/drop_caches.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/clk/nv04.o
  CC [M]  drivers/gpu/drm/i915/gt/shmem_utils.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/clk/nv40.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/clk/nv50.o
  CC      fs/sysctls.o
  CC [M]  drivers/gpu/drm/i915/gt/sysfs_engines.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/hdp_v5_2.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/lsdma_v6_0.o
  CC [M]  drivers/gpu/drm/i915/gt/intel_ggtt_gmch.o
  CC      fs/fhandle.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/nbio_v7_9.o
  CC [M]  drivers/gpu/drm/i915/gt/gen6_renderstate.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/clk/g84.o
  CC [M]  drivers/gpu/drm/xe/i915-display/intel_atomic_plane.o
  CC [M]  drivers/gpu/drm/i915/gt/gen7_renderstate.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/clk/gt215.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/clk/mcp77.o
  CC [M]  drivers/gpu/drm/i915/gt/gen8_renderstate.o
  CC [M]  drivers/gpu/drm/xe/i915-display/intel_audio.o
  CC [M]  drivers/gpu/drm/i915/gt/gen9_renderstate.o
  CC [M]  drivers/gpu/drm/xe/i915-display/intel_backlight.o
  CC [M]  drivers/gpu/drm/xe/i915-display/intel_bios.o
  CC [M]  drivers/gpu/drm/i915/gem/i915_gem_busy.o
  CC [M]  drivers/gpu/drm/i915/gem/i915_gem_clflush.o
  CC [M]  drivers/gpu/drm/i915/gem/i915_gem_context.o
  LD [M]  drivers/gpu/drm/drm_kms_helper.o
  CC [M]  drivers/gpu/drm/i915/gem/i915_gem_create.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/aqua_vanjaram_reg_init.o
  CC [M]  drivers/gpu/drm/i915/gem/i915_gem_dmabuf.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/df_v1_7.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/df_v3_6.o
  CC [M]  drivers/gpu/drm/i915/gem/i915_gem_domain.o
  CC [M]  drivers/gpu/drm/i915/gem/i915_gem_execbuffer.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/clk/gf100.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/clk/gk104.o
  CC [M]  drivers/gpu/drm/i915/gem/i915_gem_internal.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/clk/gk20a.o
  CC [M]  drivers/gpu/drm/i915/gem/i915_gem_object.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/clk/gm20b.o
  CC [M]  drivers/gpu/drm/i915/gem/i915_gem_lmem.o
  CC [M]  drivers/gpu/drm/xe/i915-display/intel_bw.o
  CC [M]  drivers/gpu/drm/i915/gem/i915_gem_mman.o
  CC [M]  drivers/gpu/drm/i915/gem/i915_gem_pages.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/clk/pllnv04.o
  CC [M]  drivers/gpu/drm/i915/gem/i915_gem_phys.o
  CC [M]  drivers/gpu/drm/xe/i915-display/intel_cdclk.o
  CC [M]  drivers/gpu/drm/xe/i915-display/intel_color.o
  CC [M]  drivers/gpu/drm/xe/i915-display/intel_combo_phy.o
  CC [M]  drivers/gpu/drm/i915/gem/i915_gem_pm.o
  CC [M]  drivers/gpu/drm/xe/i915-display/intel_connector.o
  CC [M]  drivers/gpu/drm/xe/i915-display/intel_crtc.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/df_v4_3.o
  CC [M]  drivers/gpu/drm/i915/gem/i915_gem_region.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/clk/pllgt215.o
  AR      fs/built-in.a
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/devinit/base.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/gmc_v7_0.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/devinit/nv04.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/devinit/nv05.o
  CC [M]  drivers/gpu/drm/i915/gem/i915_gem_shmem.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/gmc_v8_0.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/gfxhub_v1_0.o
  CC [M]  drivers/gpu/drm/i915/gem/i915_gem_shrinker.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/mmhub_v1_0.o
  CC [M]  drivers/gpu/drm/i915/gem/i915_gem_stolen.o
  CC [M]  drivers/gpu/drm/i915/gem/i915_gem_throttle.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/gmc_v9_0.o
  CC [M]  drivers/gpu/drm/i915/gem/i915_gem_tiling.o
  CC [M]  drivers/gpu/drm/xe/i915-display/intel_crtc_state_dump.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/devinit/nv10.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/gfxhub_v1_1.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/devinit/nv1a.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/mmhub_v9_4.o
  CC [M]  drivers/gpu/drm/xe/i915-display/intel_cursor.o
  CC [M]  drivers/gpu/drm/i915/gem/i915_gem_ttm.o
  CC [M]  drivers/gpu/drm/i915/gem/i915_gem_ttm_move.o
  CC [M]  drivers/gpu/drm/xe/i915-display/intel_cx0_phy.o
  CC [M]  drivers/gpu/drm/i915/gem/i915_gem_ttm_pm.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/devinit/nv20.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/devinit/nv50.o
  CC [M]  drivers/gpu/drm/i915/gem/i915_gem_userptr.o
  CC [M]  drivers/gpu/drm/xe/i915-display/intel_ddi.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/gfxhub_v2_0.o
  CC [M]  drivers/gpu/drm/i915/gem/i915_gem_wait.o
  CC [M]  drivers/gpu/drm/i915/gem/i915_gemfs.o
  CC [M]  drivers/gpu/drm/xe/i915-display/intel_ddi_buf_trans.o
  CC [M]  drivers/gpu/drm/i915/i915_active.o
  CC [M]  drivers/gpu/drm/i915/i915_cmd_parser.o
  CC [M]  drivers/gpu/drm/i915/i915_deps.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/devinit/g84.o
  CC [M]  drivers/gpu/drm/xe/i915-display/intel_display.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/devinit/g98.o
  CC [M]  drivers/gpu/drm/i915/i915_gem_evict.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/mmhub_v2_0.o
  CC [M]  drivers/gpu/drm/xe/i915-display/intel_display_debugfs.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/gmc_v10_0.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/devinit/gt215.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/devinit/mcp89.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/gfxhub_v2_1.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/devinit/gf100.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/mmhub_v2_3.o
  CC [M]  drivers/gpu/drm/i915/i915_gem_gtt.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/mmhub_v1_7.o
  CC [M]  drivers/gpu/drm/i915/i915_gem_ww.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/devinit/gm107.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/gfxhub_v3_0.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/devinit/gm200.o
  CC [M]  drivers/gpu/drm/xe/i915-display/intel_display_device.o
  CC [M]  drivers/gpu/drm/i915/i915_gem.o
  CC [M]  drivers/gpu/drm/xe/i915-display/intel_display_irq.o
  CC [M]  drivers/gpu/drm/xe/i915-display/intel_display_driver.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/mmhub_v3_0.o
  CC [M]  drivers/gpu/drm/i915/i915_query.o
  CC [M]  drivers/gpu/drm/i915/i915_request.o
  CC [M]  drivers/gpu/drm/xe/i915-display/intel_display_power.o
  CC [M]  drivers/gpu/drm/i915/i915_scheduler.o
  CC [M]  drivers/gpu/drm/xe/i915-display/intel_display_power_map.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/mmhub_v3_0_2.o
  CC [M]  drivers/gpu/drm/i915/i915_trace_points.o
  CC [M]  drivers/gpu/drm/i915/i915_ttm_buddy_manager.o
  CC [M]  drivers/gpu/drm/i915/i915_vma.o
  CC [M]  drivers/gpu/drm/i915/i915_vma_resource.o
  CC [M]  drivers/gpu/drm/xe/i915-display/intel_display_power_well.o
  CC [M]  drivers/gpu/drm/xe/i915-display/intel_display_trace.o
  CC [M]  drivers/gpu/drm/xe/i915-display/intel_dkl_phy.o
  CC [M]  drivers/gpu/drm/i915/gt/uc/intel_gsc_fw.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/gmc_v11_0.o
  CC [M]  drivers/gpu/drm/i915/gt/uc/intel_gsc_proxy.o
  CC [M]  drivers/gpu/drm/i915/gt/uc/intel_gsc_uc.o
  CC [M]  drivers/gpu/drm/xe/i915-display/intel_dmc.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/mmhub_v3_0_1.o
  CC [M]  drivers/gpu/drm/i915/gt/uc/intel_gsc_uc_debugfs.o
  CC [M]  drivers/gpu/drm/i915/gt/uc/intel_gsc_uc_heci_cmd_submit.o
  CC [M]  drivers/gpu/drm/i915/gt/uc/intel_guc.o
  CC [M]  drivers/gpu/drm/i915/gt/uc/intel_guc_ads.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/devinit/gv100.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/gfxhub_v3_0_3.o
  CC [M]  drivers/gpu/drm/xe/i915-display/intel_dp.o
  CC [M]  drivers/gpu/drm/i915/gt/uc/intel_guc_capture.o
  CC [M]  drivers/gpu/drm/i915/gt/uc/intel_guc_ct.o
  CC [M]  drivers/gpu/drm/xe/i915-display/intel_dp_aux.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/devinit/tu102.o
  CC [M]  drivers/gpu/drm/xe/i915-display/intel_dp_aux_backlight.o
  CC [M]  drivers/gpu/drm/i915/gt/uc/intel_guc_debugfs.o
  CC [M]  drivers/gpu/drm/i915/gt/uc/intel_guc_fw.o
  CC [M]  drivers/gpu/drm/xe/i915-display/intel_dp_hdcp.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/gfxhub_v1_2.o
  CC [M]  drivers/gpu/drm/xe/i915-display/intel_dp_link_training.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/devinit/ga100.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/mmhub_v1_8.o
  CC [M]  drivers/gpu/drm/i915/gt/uc/intel_guc_hwconfig.o
  CC [M]  drivers/gpu/drm/i915/gt/uc/intel_guc_log.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/umc_v6_0.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/fault/base.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/umc_v6_1.o
  CC [M]  drivers/gpu/drm/i915/gt/uc/intel_guc_log_debugfs.o
  CC [M]  drivers/gpu/drm/i915/gt/uc/intel_guc_rc.o
  CC [M]  drivers/gpu/drm/i915/gt/uc/intel_guc_slpc.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/umc_v6_7.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/umc_v8_7.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/fault/user.o
  CC [M]  drivers/gpu/drm/i915/gt/uc/intel_guc_submission.o
  CC [M]  drivers/gpu/drm/i915/gt/uc/intel_huc.o
  CC [M]  drivers/gpu/drm/i915/gt/uc/intel_huc_debugfs.o
  CC [M]  drivers/gpu/drm/i915/gt/uc/intel_huc_fw.o
  CC [M]  drivers/gpu/drm/i915/gt/uc/intel_uc.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/fault/gp100.o
  CC [M]  drivers/gpu/drm/xe/i915-display/intel_dp_mst.o
  CC [M]  drivers/gpu/drm/i915/gt/uc/intel_uc_debugfs.o
  CC [M]  drivers/gpu/drm/xe/i915-display/intel_dpll.o
  CC [M]  drivers/gpu/drm/i915/gt/uc/intel_uc_fw.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/umc_v8_10.o
  CC [M]  drivers/gpu/drm/i915/gt/intel_gsc.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/fault/gp10b.o
  CC [M]  drivers/gpu/drm/i915/i915_hwmon.o
  CC [M]  drivers/gpu/drm/xe/i915-display/intel_dpll_mgr.o
  CC [M]  drivers/gpu/drm/xe/i915-display/intel_dpt.o
  CC [M]  drivers/gpu/drm/i915/display/hsw_ips.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/amdgpu_irq.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/fault/gv100.o
  CC [M]  drivers/gpu/drm/i915/display/intel_atomic.o
  CC [M]  drivers/gpu/drm/i915/display/intel_atomic_plane.o
  CC [M]  drivers/gpu/drm/xe/i915-display/intel_drrs.o
  CC [M]  drivers/gpu/drm/xe/i915-display/intel_dsb.o
  CC [M]  drivers/gpu/drm/i915/display/intel_audio.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/amdgpu_ih.o
  CC [M]  drivers/gpu/drm/i915/display/intel_bios.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/fault/tu102.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/fb/base.o
  CC [M]  drivers/gpu/drm/i915/display/intel_bw.o
  CC [M]  drivers/gpu/drm/xe/i915-display/intel_dsi.o
  CC [M]  drivers/gpu/drm/xe/i915-display/intel_dsi_dcs_backlight.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/iceland_ih.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/fb/nv04.o
  CC [M]  drivers/gpu/drm/i915/display/intel_cdclk.o
  CC [M]  drivers/gpu/drm/i915/display/intel_color.o
  CC [M]  drivers/gpu/drm/i915/display/intel_combo_phy.o
  CC [M]  drivers/gpu/drm/i915/display/intel_connector.o
  CC [M]  drivers/gpu/drm/i915/display/intel_crtc.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/tonga_ih.o
  CC [M]  drivers/gpu/drm/i915/display/intel_crtc_state_dump.o
  CC [M]  drivers/gpu/drm/i915/display/intel_cursor.o
  CC [M]  drivers/gpu/drm/i915/display/intel_display.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/fb/nv10.o
  CC [M]  drivers/gpu/drm/i915/display/intel_display_driver.o
  CC [M]  drivers/gpu/drm/i915/display/intel_display_irq.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/fb/nv1a.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/cz_ih.o
  CC [M]  drivers/gpu/drm/xe/i915-display/intel_dsi_vbt.o
  CC [M]  drivers/gpu/drm/xe/i915-display/intel_fb.o
  CC [M]  drivers/gpu/drm/i915/display/intel_display_power.o
  CC [M]  drivers/gpu/drm/xe/i915-display/intel_fbc.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/fb/nv20.o
  CC [M]  drivers/gpu/drm/xe/i915-display/intel_fdi.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/fb/nv25.o
  CC [M]  drivers/gpu/drm/i915/display/intel_display_power_map.o
  CC [M]  drivers/gpu/drm/xe/i915-display/intel_fifo_underrun.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/fb/nv30.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/vega10_ih.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/fb/nv35.o
  CC [M]  drivers/gpu/drm/xe/i915-display/intel_frontbuffer.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/vega20_ih.o
  CC [M]  drivers/gpu/drm/xe/i915-display/intel_global_state.o
  CC [M]  drivers/gpu/drm/xe/i915-display/intel_gmbus.o
  CC [M]  drivers/gpu/drm/xe/i915-display/intel_hdcp.o
  CC [M]  drivers/gpu/drm/i915/display/intel_display_power_well.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/navi10_ih.o
  CC [M]  drivers/gpu/drm/i915/display/intel_display_reset.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/ih_v6_0.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/amdgpu_psp.o
  CC [M]  drivers/gpu/drm/i915/display/intel_display_rps.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/fb/nv36.o
  CC [M]  drivers/gpu/drm/i915/display/intel_dmc.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/psp_v3_1.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/psp_v10_0.o
  CC [M]  drivers/gpu/drm/i915/display/intel_dpio_phy.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/psp_v11_0.o
  CC [M]  drivers/gpu/drm/i915/display/intel_dpll.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/fb/nv40.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/fb/nv41.o
  CC [M]  drivers/gpu/drm/xe/i915-display/intel_hdmi.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/fb/nv44.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/fb/nv46.o
  CC [M]  drivers/gpu/drm/xe/i915-display/intel_hotplug.o
  CC [M]  drivers/gpu/drm/i915/display/intel_dpll_mgr.o
  CC [M]  drivers/gpu/drm/i915/display/intel_dpt.o
  CC [M]  drivers/gpu/drm/xe/i915-display/intel_hotplug_irq.o
  CC [M]  drivers/gpu/drm/i915/display/intel_drrs.o
  CC [M]  drivers/gpu/drm/i915/display/intel_dsb.o
  CC [M]  drivers/gpu/drm/i915/display/intel_fb.o
  CC [M]  drivers/gpu/drm/xe/i915-display/intel_hti.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/fb/nv47.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/psp_v11_0_8.o
  CC [M]  drivers/gpu/drm/i915/display/intel_fb_pin.o
  CC [M]  drivers/gpu/drm/xe/i915-display/intel_lspcon.o
  CC [M]  drivers/gpu/drm/i915/display/intel_fbc.o
  CC [M]  drivers/gpu/drm/xe/i915-display/intel_modeset_lock.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/psp_v12_0.o
  CC [M]  drivers/gpu/drm/i915/display/intel_fdi.o
  CC [M]  drivers/gpu/drm/xe/i915-display/intel_modeset_setup.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/psp_v13_0.o
  CC [M]  drivers/gpu/drm/i915/display/intel_fifo_underrun.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/psp_v13_0_4.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/dce_v10_0.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/fb/nv49.o
  CC [M]  drivers/gpu/drm/i915/display/intel_frontbuffer.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/dce_v11_0.o
  CC [M]  drivers/gpu/drm/xe/i915-display/intel_modeset_verify.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/fb/nv4e.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/fb/nv50.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/fb/g84.o
  CC [M]  drivers/gpu/drm/xe/i915-display/intel_panel.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/amdgpu_vkms.o
  CC [M]  drivers/gpu/drm/xe/i915-display/intel_pipe_crc.o
  CC [M]  drivers/gpu/drm/i915/display/intel_global_state.o
  CC [M]  drivers/gpu/drm/xe/i915-display/intel_pmdemand.o
  CC [M]  drivers/gpu/drm/i915/display/intel_hdcp.o
  CC [M]  drivers/gpu/drm/xe/i915-display/intel_pps.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/fb/gt215.o
  CC [M]  drivers/gpu/drm/i915/display/intel_hdcp_gsc.o
  CC [M]  drivers/gpu/drm/i915/display/intel_hotplug.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/amdgpu_gfx.o
  CC [M]  drivers/gpu/drm/xe/i915-display/intel_psr.o
  CC [M]  drivers/gpu/drm/i915/display/intel_hotplug_irq.o
  CC [M]  drivers/gpu/drm/i915/display/intel_hti.o
  CC [M]  drivers/gpu/drm/xe/i915-display/intel_qp_tables.o
  CC [M]  drivers/gpu/drm/i915/display/intel_load_detect.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/fb/mcp77.o
  CC [M]  drivers/gpu/drm/i915/display/intel_lpe_audio.o
  CC [M]  drivers/gpu/drm/i915/display/intel_modeset_lock.o
  CC [M]  drivers/gpu/drm/i915/display/intel_modeset_verify.o
  CC [M]  drivers/gpu/drm/xe/i915-display/intel_quirks.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/amdgpu_rlc.o
  CC [M]  drivers/gpu/drm/xe/i915-display/intel_snps_phy.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/fb/mcp89.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/fb/gf100.o
  CC [M]  drivers/gpu/drm/xe/i915-display/intel_tc.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/gfx_v8_0.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/gfx_v9_0.o
  CC [M]  drivers/gpu/drm/i915/display/intel_modeset_setup.o
  CC [M]  drivers/gpu/drm/xe/i915-display/intel_vblank.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/gfx_v9_4.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/gfx_v9_4_2.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/fb/gf108.o
  CC [M]  drivers/gpu/drm/i915/display/intel_overlay.o
  CC [M]  drivers/gpu/drm/xe/i915-display/intel_vdsc.o
  CC [M]  drivers/gpu/drm/xe/i915-display/intel_vga.o
  CC [M]  drivers/gpu/drm/i915/display/intel_pch_display.o
  CC [M]  drivers/gpu/drm/xe/i915-display/intel_vrr.o
  CC [M]  drivers/gpu/drm/i915/display/intel_pch_refclk.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/gfx_v9_4_3.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/gfx_v10_0.o
  CC [M]  drivers/gpu/drm/xe/i915-display/intel_wm.o
  CC [M]  drivers/gpu/drm/xe/i915-display/skl_scaler.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/fb/gk104.o
  CC [M]  drivers/gpu/drm/i915/display/intel_plane_initial.o
  CC [M]  drivers/gpu/drm/xe/i915-display/skl_universal_plane.o
  CC [M]  drivers/gpu/drm/i915/display/intel_pmdemand.o
  CC [M]  drivers/gpu/drm/i915/display/intel_psr.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/fb/gk110.o
  CC [M]  drivers/gpu/drm/i915/display/intel_quirks.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/fb/gk20a.o
  CC [M]  drivers/gpu/drm/i915/display/intel_sprite.o
  CC [M]  drivers/gpu/drm/i915/display/intel_sprite_uapi.o
  CC [M]  drivers/gpu/drm/xe/i915-display/skl_watermark.o
  CC [M]  drivers/gpu/drm/i915/display/intel_tc.o
  CC [M]  drivers/gpu/drm/i915/display/intel_vblank.o
  CC [M]  drivers/gpu/drm/i915/display/intel_vga.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/fb/gm107.o
  CC [M]  drivers/gpu/drm/xe/i915-display/intel_acpi.o
  CC [M]  drivers/gpu/drm/i915/display/intel_wm.o
  CC [M]  drivers/gpu/drm/i915/display/i9xx_plane.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/imu_v11_0.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/gfx_v11_0.o
  CC [M]  drivers/gpu/drm/i915/display/i9xx_wm.o
  CC [M]  drivers/gpu/drm/i915/display/skl_scaler.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/gfx_v11_0_3.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/fb/gm200.o
  CC [M]  drivers/gpu/drm/i915/display/skl_universal_plane.o
  CC [M]  drivers/gpu/drm/xe/i915-display/intel_opregion.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/fb/gm20b.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/fb/gp100.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/fb/gp102.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/imu_v11_0_3.o
  CC [M]  drivers/gpu/drm/i915/display/skl_watermark.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/fb/gp10b.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/fb/gv100.o
  CC [M]  drivers/gpu/drm/i915/display/intel_acpi.o
  CC [M]  drivers/gpu/drm/i915/display/intel_opregion.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/fb/tu102.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/amdgpu_sdma.o
  CC [M]  drivers/gpu/drm/i915/display/intel_fbdev.o
  CC [M]  drivers/gpu/drm/xe/i915-display/intel_fbdev.o
  CC [M]  drivers/gpu/drm/i915/display/dvo_ch7017.o
  CC [M]  drivers/gpu/drm/i915/display/dvo_ch7xxx.o
  CC [M]  drivers/gpu/drm/i915/display/dvo_ivch.o
  CC [M]  drivers/gpu/drm/i915/display/dvo_ns2501.o
  CC [M]  drivers/gpu/drm/i915/display/dvo_sil164.o
  CC [M]  drivers/gpu/drm/xe/xe_guc.o
  CC [M]  drivers/gpu/drm/xe/xe_ring_ops.o
  HDRTEST drivers/gpu/drm/xe/abi/guc_klvs_abi.h
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/fb/ga100.o
  HDRTEST drivers/gpu/drm/xe/abi/guc_errors_abi.h
  CC [M]  drivers/gpu/drm/i915/display/dvo_tfp410.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/fb/ga102.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/fb/ram.o
  CC [M]  drivers/gpu/drm/i915/display/g4x_dp.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/sdma_v2_4.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/fb/ramnv04.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/sdma_v3_0.o
  CC [M]  drivers/gpu/drm/i915/display/g4x_hdmi.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/fb/ramnv10.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/fb/ramnv1a.o
  CC [M]  drivers/gpu/drm/i915/display/icl_dsi.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/fb/ramnv20.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/sdma_v4_0.o
  CC [M]  drivers/gpu/drm/i915/display/intel_backlight.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/fb/ramnv40.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/sdma_v4_4.o
  HDRTEST drivers/gpu/drm/xe/abi/guc_actions_slpc_abi.h
  HDRTEST drivers/gpu/drm/xe/abi/guc_communication_mmio_abi.h
  HDRTEST drivers/gpu/drm/xe/abi/guc_actions_abi.h
  HDRTEST drivers/gpu/drm/xe/abi/guc_communication_ctb_abi.h
  HDRTEST drivers/gpu/drm/xe/abi/guc_messages_abi.h
  HDRTEST drivers/gpu/drm/xe/compat-i915-headers/i915_vma_types.h
  HDRTEST drivers/gpu/drm/xe/compat-i915-headers/vlv_sideband_reg.h
  HDRTEST drivers/gpu/drm/xe/compat-i915-headers/intel_wakeref.h
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/fb/ramnv41.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/sdma_v4_4_2.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/fb/ramnv44.o
  HDRTEST drivers/gpu/drm/xe/compat-i915-headers/intel_pcode.h
  CC [M]  drivers/gpu/drm/i915/display/intel_crt.o
  HDRTEST drivers/gpu/drm/xe/compat-i915-headers/i915_drv.h
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/fb/ramnv49.o
  CC [M]  drivers/gpu/drm/i915/display/intel_cx0_phy.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/fb/ramnv4e.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/fb/ramnv50.o
  HDRTEST drivers/gpu/drm/xe/compat-i915-headers/i915_reg_defs.h
  HDRTEST drivers/gpu/drm/xe/compat-i915-headers/i915_trace.h
  CC [M]  drivers/gpu/drm/i915/display/intel_ddi.o
  CC [M]  drivers/gpu/drm/i915/display/intel_ddi_buf_trans.o
  HDRTEST drivers/gpu/drm/xe/compat-i915-headers/i915_reg.h
  CC [M]  drivers/gpu/drm/i915/display/intel_display_device.o
  CC [M]  drivers/gpu/drm/i915/display/intel_display_trace.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/fb/ramgt215.o
  CC [M]  drivers/gpu/drm/i915/display/intel_dkl_phy.o
  CC [M]  drivers/gpu/drm/i915/display/intel_dp.o
  HDRTEST drivers/gpu/drm/xe/compat-i915-headers/i915_active_types.h
  HDRTEST drivers/gpu/drm/xe/compat-i915-headers/i915_utils.h
  CC [M]  drivers/gpu/drm/i915/display/intel_dp_aux.o
  HDRTEST drivers/gpu/drm/xe/compat-i915-headers/i915_config.h
  CC [M]  drivers/gpu/drm/i915/display/intel_dp_aux_backlight.o
  HDRTEST drivers/gpu/drm/xe/compat-i915-headers/i915_vma.h
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/fb/rammcp77.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/sdma_v5_0.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/sdma_v5_2.o
  CC [M]  drivers/gpu/drm/i915/display/intel_dp_hdcp.o
  HDRTEST drivers/gpu/drm/xe/compat-i915-headers/vlv_sideband.h
  CC [M]  drivers/gpu/drm/i915/display/intel_dp_link_training.o
  HDRTEST drivers/gpu/drm/xe/compat-i915-headers/intel_mchbar_regs.h
  HDRTEST drivers/gpu/drm/xe/compat-i915-headers/i915_debugfs.h
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/fb/ramgf100.o
  HDRTEST drivers/gpu/drm/xe/compat-i915-headers/soc/intel_pch.h
  HDRTEST drivers/gpu/drm/xe/compat-i915-headers/soc/intel_dram.h
  HDRTEST drivers/gpu/drm/xe/compat-i915-headers/soc/intel_gmch.h
  HDRTEST drivers/gpu/drm/xe/compat-i915-headers/i915_vgpu.h
  CC [M]  drivers/gpu/drm/i915/display/intel_dp_mst.o
  HDRTEST drivers/gpu/drm/xe/compat-i915-headers/i915_fixed.h
  HDRTEST drivers/gpu/drm/xe/compat-i915-headers/intel_runtime_pm.h
  CC [M]  drivers/gpu/drm/amd/amdgpu/sdma_v6_0.o
  HDRTEST drivers/gpu/drm/xe/compat-i915-headers/intel_pm_types.h
  HDRTEST drivers/gpu/drm/xe/compat-i915-headers/intel_uncore.h
  CC [M]  drivers/gpu/drm/i915/display/intel_dsi.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/amdgpu_mes.o
  HDRTEST drivers/gpu/drm/xe/compat-i915-headers/intel_pci_config.h
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/fb/ramgf108.o
  HDRTEST drivers/gpu/drm/xe/compat-i915-headers/gt/intel_rps.h
  CC [M]  drivers/gpu/drm/i915/display/intel_dsi_dcs_backlight.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/fb/ramgk104.o
  HDRTEST drivers/gpu/drm/xe/compat-i915-headers/intel_clock_gating.h
  HDRTEST drivers/gpu/drm/xe/display/ext/i915_irq.h
  HDRTEST drivers/gpu/drm/xe/display/ext/intel_device_info.h
  HDRTEST drivers/gpu/drm/xe/regs/xe_reg_defs.h
  CC [M]  drivers/gpu/drm/i915/display/intel_dsi_vbt.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/fb/ramgm107.o
  CC [M]  drivers/gpu/drm/i915/display/intel_dvo.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/mes_v10_1.o
  CC [M]  drivers/gpu/drm/i915/display/intel_gmbus.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/mes_v11_0.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/fb/ramgm200.o
  CC [M]  drivers/gpu/drm/i915/display/intel_hdmi.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/fb/ramgp100.o
  CC [M]  drivers/gpu/drm/i915/display/intel_lspcon.o
  CC [M]  drivers/gpu/drm/i915/display/intel_lvds.o
  HDRTEST drivers/gpu/drm/xe/regs/xe_guc_regs.h
  HDRTEST drivers/gpu/drm/xe/regs/xe_gt_regs.h
  HDRTEST drivers/gpu/drm/xe/regs/xe_regs.h
  HDRTEST drivers/gpu/drm/xe/regs/xe_gpu_commands.h
  HDRTEST drivers/gpu/drm/xe/regs/xe_lrc_layout.h
  CC [M]  drivers/gpu/drm/amd/amdgpu/uvd_v5_0.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/fb/ramga102.o
  CC [M]  drivers/gpu/drm/i915/display/intel_panel.o
  HDRTEST drivers/gpu/drm/xe/regs/xe_engine_regs.h
  CC [M]  drivers/gpu/drm/i915/display/intel_pps.o
  HDRTEST drivers/gpu/drm/xe/tests/xe_test.h
  CC [M]  drivers/gpu/drm/i915/display/intel_qp_tables.o
  HDRTEST drivers/gpu/drm/xe/tests/xe_pci_test.h
  CC [M]  drivers/gpu/drm/i915/display/intel_sdvo.o
  CC [M]  drivers/gpu/drm/i915/display/intel_snps_phy.o
  CC [M]  drivers/gpu/drm/i915/display/intel_tv.o
  HDRTEST drivers/gpu/drm/xe/tests/xe_migrate_test.h
  HDRTEST drivers/gpu/drm/xe/tests/xe_dma_buf_test.h
  CC [M]  drivers/gpu/drm/i915/display/intel_vdsc.o
  HDRTEST drivers/gpu/drm/xe/tests/xe_bo_test.h
  HDRTEST drivers/gpu/drm/xe/xe_bb.h
  CC [M]  drivers/gpu/drm/i915/display/intel_vrr.o
  HDRTEST drivers/gpu/drm/xe/xe_bb_types.h
  HDRTEST drivers/gpu/drm/xe/xe_bo.h
  HDRTEST drivers/gpu/drm/xe/xe_bo_doc.h
  HDRTEST drivers/gpu/drm/xe/xe_bo_evict.h
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/fb/sddr2.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/fb/sddr3.o
  HDRTEST drivers/gpu/drm/xe/xe_bo_types.h
  CC [M]  drivers/gpu/drm/i915/display/vlv_dsi.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/fb/gddr3.o
  CC [M]  drivers/gpu/drm/i915/display/vlv_dsi_pll.o
  HDRTEST drivers/gpu/drm/xe/xe_debugfs.h
  HDRTEST drivers/gpu/drm/xe/xe_devcoredump.h
  CC [M]  drivers/gpu/drm/amd/amdgpu/uvd_v6_0.o
  HDRTEST drivers/gpu/drm/xe/xe_devcoredump_types.h
  CC [M]  drivers/gpu/drm/i915/i915_perf.o
  CC [M]  drivers/gpu/drm/i915/pxp/intel_pxp.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/uvd_v7_0.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/fb/gddr5.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/fuse/base.o
  HDRTEST drivers/gpu/drm/xe/xe_device.h
  CC [M]  drivers/gpu/drm/i915/pxp/intel_pxp_tee.o
  CC [M]  drivers/gpu/drm/i915/pxp/intel_pxp_huc.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/amdgpu_vce.o
  CC [M]  drivers/gpu/drm/i915/pxp/intel_pxp_cmd.o
  CC [M]  drivers/gpu/drm/i915/pxp/intel_pxp_debugfs.o
  HDRTEST drivers/gpu/drm/xe/xe_device_sysfs.h
  HDRTEST drivers/gpu/drm/xe/xe_device_types.h
  CC [M]  drivers/gpu/drm/amd/amdgpu/vce_v3_0.o
  HDRTEST drivers/gpu/drm/xe/xe_display.h
  CC [M]  drivers/gpu/drm/i915/pxp/intel_pxp_gsccs.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/fuse/nv50.o
  CC [M]  drivers/gpu/drm/i915/pxp/intel_pxp_irq.o
  CC [M]  drivers/gpu/drm/i915/pxp/intel_pxp_pm.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/fuse/gf100.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/fuse/gm107.o
  CC [M]  drivers/gpu/drm/i915/pxp/intel_pxp_session.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/gpio/base.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/vce_v4_0.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/vcn_sw_ring.o
  CC [M]  drivers/gpu/drm/i915/i915_gpu_error.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/vcn_v1_0.o
  HDRTEST drivers/gpu/drm/xe/xe_dma_buf.h
  CC [M]  drivers/gpu/drm/amd/amdgpu/vcn_v2_0.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/gpio/nv10.o
  CC [M]  drivers/gpu/drm/i915/gem/selftests/i915_gem_client_blt.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/vcn_v2_5.o
  CC [M]  drivers/gpu/drm/i915/gem/selftests/igt_gem_utils.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/gpio/nv50.o
  HDRTEST drivers/gpu/drm/xe/xe_drv.h
  CC [M]  drivers/gpu/drm/i915/selftests/intel_scheduler_helpers.o
  CC [M]  drivers/gpu/drm/i915/selftests/i915_random.o
  HDRTEST drivers/gpu/drm/xe/xe_engine.h
  CC [M]  drivers/gpu/drm/i915/selftests/i915_selftest.o
  CC [M]  drivers/gpu/drm/i915/selftests/igt_atomic.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/vcn_v3_0.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/gpio/g94.o
  CC [M]  drivers/gpu/drm/i915/selftests/igt_flush_test.o
  CC [M]  drivers/gpu/drm/i915/selftests/igt_live_test.o
  CC [M]  drivers/gpu/drm/i915/selftests/igt_mmap.o
  CC [M]  drivers/gpu/drm/i915/selftests/igt_reset.o
  CC [M]  drivers/gpu/drm/i915/selftests/igt_spinner.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/gpio/gf119.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/vcn_v4_0.o
  CC [M]  drivers/gpu/drm/i915/selftests/librapl.o
  HDRTEST drivers/gpu/drm/xe/xe_engine_types.h
  CC [M]  drivers/gpu/drm/i915/i915_vgpu.o
  HDRTEST drivers/gpu/drm/i915/display/intel_dkl_phy_regs.h
  HDRTEST drivers/gpu/drm/i915/display/intel_crtc_state_dump.h
  HDRTEST drivers/gpu/drm/xe/xe_exec.h
  HDRTEST drivers/gpu/drm/xe/xe_execlist.h
  HDRTEST drivers/gpu/drm/i915/display/hsw_ips.h
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/gpio/gk104.o
  HDRTEST drivers/gpu/drm/i915/display/g4x_hdmi.h
  HDRTEST drivers/gpu/drm/i915/display/intel_hdcp_regs.h
  HDRTEST drivers/gpu/drm/i915/display/intel_overlay.h
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/gpio/ga102.o
  HDRTEST drivers/gpu/drm/xe/xe_execlist_types.h
  CC [M]  drivers/gpu/drm/amd/amdgpu/vcn_v4_0_3.o
  HDRTEST drivers/gpu/drm/i915/display/intel_display.h
  CC [M]  drivers/gpu/drm/amd/amdgpu/amdgpu_jpeg.o
  HDRTEST drivers/gpu/drm/i915/display/skl_watermark_regs.h
  CC [M]  drivers/gpu/drm/amd/amdgpu/jpeg_v1_0.o
  HDRTEST drivers/gpu/drm/i915/display/intel_dmc.h
  HDRTEST drivers/gpu/drm/i915/display/intel_vga.h
  HDRTEST drivers/gpu/drm/i915/display/intel_audio.h
  HDRTEST drivers/gpu/drm/xe/xe_force_wake.h
  CC [M]  drivers/gpu/drm/amd/amdgpu/jpeg_v2_0.o
  HDRTEST drivers/gpu/drm/i915/display/intel_lvds.h
  CC [M]  drivers/gpu/drm/amd/amdgpu/jpeg_v2_5.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/jpeg_v3_0.o
  HDRTEST drivers/gpu/drm/i915/display/intel_modeset_setup.h
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/gsp/base.o
  HDRTEST drivers/gpu/drm/i915/display/intel_cdclk.h
  HDRTEST drivers/gpu/drm/i915/display/intel_display_limits.h
  HDRTEST drivers/gpu/drm/xe/xe_force_wake_types.h
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/gsp/gv100.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/gsp/ga102.o
  HDRTEST drivers/gpu/drm/i915/display/intel_hotplug.h
  HDRTEST drivers/gpu/drm/xe/xe_ggtt.h
  HDRTEST drivers/gpu/drm/i915/display/intel_dkl_phy.h
  HDRTEST drivers/gpu/drm/i915/display/intel_atomic.h
  HDRTEST drivers/gpu/drm/i915/display/intel_display_driver.h
  HDRTEST drivers/gpu/drm/i915/display/intel_dpll.h
  HDRTEST drivers/gpu/drm/xe/xe_ggtt_types.h
  HDRTEST drivers/gpu/drm/xe/xe_gt.h
  HDRTEST drivers/gpu/drm/i915/display/vlv_dsi_pll_regs.h
  HDRTEST drivers/gpu/drm/i915/display/intel_dp_mst.h
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/i2c/base.o
  HDRTEST drivers/gpu/drm/i915/display/intel_fdi_regs.h
  CC [M]  drivers/gpu/drm/amd/amdgpu/jpeg_v4_0.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/i2c/nv04.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/i2c/nv4e.o
  HDRTEST drivers/gpu/drm/i915/display/g4x_dp.h
  HDRTEST drivers/gpu/drm/i915/display/intel_tc.h
  HDRTEST drivers/gpu/drm/i915/display/intel_frontbuffer.h
  HDRTEST drivers/gpu/drm/i915/display/intel_dsi_vbt.h
  HDRTEST drivers/gpu/drm/i915/display/intel_psr.h
  CC [M]  drivers/gpu/drm/amd/amdgpu/jpeg_v4_0_3.o
  HDRTEST drivers/gpu/drm/i915/display/intel_crt.h
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/i2c/nv50.o
  HDRTEST drivers/gpu/drm/i915/display/intel_opregion.h
  HDRTEST drivers/gpu/drm/i915/display/intel_snps_phy_regs.h
  HDRTEST drivers/gpu/drm/i915/display/i9xx_wm.h
  HDRTEST drivers/gpu/drm/i915/display/intel_cx0_phy_regs.h
  HDRTEST drivers/gpu/drm/i915/display/intel_global_state.h
  HDRTEST drivers/gpu/drm/xe/xe_gt_clock.h
  CC [M]  drivers/gpu/drm/amd/amdgpu/athub_v1_0.o
  HDRTEST drivers/gpu/drm/xe/xe_gt_debugfs.h
  HDRTEST drivers/gpu/drm/i915/display/intel_lpe_audio.h
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/i2c/g94.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/athub_v2_0.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/i2c/gf117.o
  HDRTEST drivers/gpu/drm/i915/display/intel_drrs.h
  HDRTEST drivers/gpu/drm/i915/display/intel_display_rps.h
  HDRTEST drivers/gpu/drm/i915/display/intel_fbdev.h
  HDRTEST drivers/gpu/drm/i915/display/intel_pps_regs.h
  HDRTEST drivers/gpu/drm/i915/display/intel_hdmi.h
  CC [M]  drivers/gpu/drm/amd/amdgpu/athub_v2_1.o
  HDRTEST drivers/gpu/drm/i915/display/intel_fdi.h
  HDRTEST drivers/gpu/drm/i915/display/intel_fb.h
  HDRTEST drivers/gpu/drm/i915/display/intel_qp_tables.h
  HDRTEST drivers/gpu/drm/xe/xe_gt_idle_sysfs.h
  HDRTEST drivers/gpu/drm/xe/xe_gt_idle_sysfs_types.h
  CC [M]  drivers/gpu/drm/amd/amdgpu/athub_v3_0.o
  HDRTEST drivers/gpu/drm/i915/display/intel_dsb_regs.h
  HDRTEST drivers/gpu/drm/i915/display/intel_vdsc.h
  HDRTEST drivers/gpu/drm/xe/xe_gt_mcr.h
  HDRTEST drivers/gpu/drm/xe/xe_gt_pagefault.h
  HDRTEST drivers/gpu/drm/i915/display/intel_snps_phy.h
  HDRTEST drivers/gpu/drm/xe/xe_gt_printk.h
  HDRTEST drivers/gpu/drm/xe/xe_gt_sysfs.h
  HDRTEST drivers/gpu/drm/i915/display/intel_display_core.h
  HDRTEST drivers/gpu/drm/xe/xe_gt_sysfs_types.h
  HDRTEST drivers/gpu/drm/i915/display/vlv_dsi_pll.h
  HDRTEST drivers/gpu/drm/xe/xe_gt_tlb_invalidation.h
  CC [M]  drivers/gpu/drm/amd/amdgpu/smuio_v9_0.o
  HDRTEST drivers/gpu/drm/i915/display/intel_dvo_dev.h
  HDRTEST drivers/gpu/drm/i915/display/intel_hdcp.h
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/i2c/gf119.o
  HDRTEST drivers/gpu/drm/i915/display/intel_sdvo_regs.h
  HDRTEST drivers/gpu/drm/i915/display/intel_pch_refclk.h
  HDRTEST drivers/gpu/drm/i915/display/intel_modeset_lock.h
  HDRTEST drivers/gpu/drm/i915/display/intel_display_trace.h
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/i2c/gk104.o
  HDRTEST drivers/gpu/drm/i915/display/intel_display_power.h
  HDRTEST drivers/gpu/drm/i915/display/intel_dp_aux_regs.h
  HDRTEST drivers/gpu/drm/xe/xe_gt_tlb_invalidation_types.h
  HDRTEST drivers/gpu/drm/i915/display/i9xx_plane.h
  HDRTEST drivers/gpu/drm/xe/xe_gt_topology.h
  HDRTEST drivers/gpu/drm/xe/xe_gt_types.h
  HDRTEST drivers/gpu/drm/i915/display/intel_dp_aux_backlight.h
  HDRTEST drivers/gpu/drm/i915/display/intel_dpll_mgr.h
  HDRTEST drivers/gpu/drm/i915/display/vlv_dsi.h
  HDRTEST drivers/gpu/drm/i915/display/intel_plane_initial.h
  HDRTEST drivers/gpu/drm/xe/xe_guc.h
  CC [M]  drivers/gpu/drm/amd/amdgpu/smuio_v11_0.o
  HDRTEST drivers/gpu/drm/i915/display/intel_display_device.h
  HDRTEST drivers/gpu/drm/i915/display/intel_fifo_underrun.h
  HDRTEST drivers/gpu/drm/i915/display/intel_cursor.h
  HDRTEST drivers/gpu/drm/i915/display/vlv_dsi_regs.h
  HDRTEST drivers/gpu/drm/xe/xe_guc_ads.h
  HDRTEST drivers/gpu/drm/i915/display/intel_cx0_phy.h
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/i2c/gk110.o
  HDRTEST drivers/gpu/drm/xe/xe_guc_ads_types.h
  HDRTEST drivers/gpu/drm/xe/xe_guc_ct.h
  HDRTEST drivers/gpu/drm/i915/display/skl_scaler.h
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/i2c/gm200.o
  HDRTEST drivers/gpu/drm/xe/xe_guc_ct_types.h
  HDRTEST drivers/gpu/drm/xe/xe_guc_debugfs.h
  CC [M]  drivers/gpu/drm/amd/amdgpu/smuio_v11_0_6.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/i2c/pad.o
  HDRTEST drivers/gpu/drm/xe/xe_guc_engine_types.h
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/i2c/padnv04.o
  HDRTEST drivers/gpu/drm/i915/display/intel_hti.h
  HDRTEST drivers/gpu/drm/i915/display/icl_dsi_regs.h
  HDRTEST drivers/gpu/drm/xe/xe_guc_fwif.h
  CC [M]  drivers/gpu/drm/amd/amdgpu/smuio_v13_0.o
  HDRTEST drivers/gpu/drm/i915/display/intel_atomic_plane.h
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/i2c/padnv4e.o
  HDRTEST drivers/gpu/drm/i915/display/skl_watermark.h
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/i2c/padnv50.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/smuio_v13_0_3.o
  HDRTEST drivers/gpu/drm/i915/display/intel_fbc.h
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/i2c/padg94.o
  HDRTEST drivers/gpu/drm/i915/display/intel_display_reg_defs.h
  HDRTEST drivers/gpu/drm/i915/display/intel_acpi.h
  HDRTEST drivers/gpu/drm/i915/display/intel_connector.h
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/i2c/padgf119.o
  HDRTEST drivers/gpu/drm/xe/xe_guc_hwconfig.h
  HDRTEST drivers/gpu/drm/xe/xe_guc_log.h
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/i2c/padgm200.o
  HDRTEST drivers/gpu/drm/xe/xe_guc_log_types.h
  CC [M]  drivers/gpu/drm/amd/amdgpu/smuio_v13_0_6.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/i2c/bus.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/amdgpu_reset.o
  HDRTEST drivers/gpu/drm/i915/display/intel_dpt.h
  HDRTEST drivers/gpu/drm/xe/xe_guc_pc.h
  HDRTEST drivers/gpu/drm/i915/display/intel_quirks.h
  HDRTEST drivers/gpu/drm/xe/xe_guc_pc_types.h
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/i2c/busnv04.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/i2c/busnv4e.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/mca_v3_0.o
  HDRTEST drivers/gpu/drm/i915/display/intel_dp_link_training.h
  HDRTEST drivers/gpu/drm/i915/display/intel_color.h
  CC [M]  drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.o
  HDRTEST drivers/gpu/drm/i915/display/intel_crtc.h
  HDRTEST drivers/gpu/drm/xe/xe_guc_submit.h
  HDRTEST drivers/gpu/drm/xe/xe_guc_submit_types.h
  HDRTEST drivers/gpu/drm/i915/display/intel_display_debugfs.h
  HDRTEST drivers/gpu/drm/xe/xe_guc_types.h
  HDRTEST drivers/gpu/drm/i915/display/intel_modeset_verify.h
  HDRTEST drivers/gpu/drm/i915/display/intel_display_power_well.h
  HDRTEST drivers/gpu/drm/i915/display/intel_psr_regs.h
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/i2c/busnv50.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../amdkfd/kfd_module.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/i2c/busgf119.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../amdkfd/kfd_device.o
  HDRTEST drivers/gpu/drm/xe/xe_huc.h
  HDRTEST drivers/gpu/drm/xe/xe_huc_debugfs.h
  HDRTEST drivers/gpu/drm/i915/display/intel_wm.h
  CC [M]  drivers/gpu/drm/amd/amdgpu/../amdkfd/kfd_chardev.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../amdkfd/kfd_topology.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/i2c/bit.o
  HDRTEST drivers/gpu/drm/i915/display/intel_pipe_crc.h
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/i2c/aux.o
  HDRTEST drivers/gpu/drm/i915/display/intel_audio_regs.h
  CC [M]  drivers/gpu/drm/amd/amdgpu/../amdkfd/kfd_pasid.o
  HDRTEST drivers/gpu/drm/xe/xe_huc_types.h
  HDRTEST drivers/gpu/drm/xe/xe_hw_engine.h
  HDRTEST drivers/gpu/drm/i915/display/intel_panel.h
  HDRTEST drivers/gpu/drm/i915/display/intel_sprite.h
  CC [M]  drivers/gpu/drm/amd/amdgpu/../amdkfd/kfd_doorbell.o
  HDRTEST drivers/gpu/drm/i915/display/intel_wm_types.h
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/i2c/auxg94.o
  HDRTEST drivers/gpu/drm/i915/display/intel_tv.h
  HDRTEST drivers/gpu/drm/xe/xe_hw_engine_class_sysfs.h
  HDRTEST drivers/gpu/drm/i915/display/intel_hti_regs.h
  HDRTEST drivers/gpu/drm/xe/xe_hw_engine_types.h
  CC [M]  drivers/gpu/drm/amd/amdgpu/../amdkfd/kfd_flat_memory.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../amdkfd/kfd_process.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/i2c/auxgf119.o
  HDRTEST drivers/gpu/drm/i915/display/intel_vrr.h
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/i2c/auxgm200.o
  HDRTEST drivers/gpu/drm/i915/display/intel_load_detect.h
  HDRTEST drivers/gpu/drm/xe/xe_hw_fence.h
  CC [M]  drivers/gpu/drm/amd/amdgpu/../amdkfd/kfd_queue.o
  HDRTEST drivers/gpu/drm/xe/xe_hw_fence_types.h
  HDRTEST drivers/gpu/drm/i915/display/skl_universal_plane.h
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/i2c/anx9805.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../amdkfd/kfd_mqd_manager.o
  HDRTEST drivers/gpu/drm/i915/display/intel_mg_phy_regs.h
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/iccsense/base.o
  HDRTEST drivers/gpu/drm/i915/display/intel_bw.h
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/iccsense/gf100.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../amdkfd/kfd_mqd_manager_cik.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/instmem/base.o
  HDRTEST drivers/gpu/drm/i915/display/intel_display_irq.h
  HDRTEST drivers/gpu/drm/xe/xe_irq.h
  HDRTEST drivers/gpu/drm/xe/xe_lrc.h
  CC [M]  drivers/gpu/drm/amd/amdgpu/../amdkfd/kfd_mqd_manager_vi.o
  HDRTEST drivers/gpu/drm/i915/display/intel_de.h
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/instmem/nv04.o
  HDRTEST drivers/gpu/drm/i915/display/intel_lvds_regs.h
  CC [M]  drivers/gpu/drm/amd/amdgpu/../amdkfd/kfd_mqd_manager_v9.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/instmem/nv40.o
  HDRTEST drivers/gpu/drm/i915/display/intel_gmbus_regs.h
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/instmem/nv50.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/instmem/gk20a.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../amdkfd/kfd_mqd_manager_v10.o
  HDRTEST drivers/gpu/drm/xe/xe_lrc_types.h
  HDRTEST drivers/gpu/drm/xe/xe_macros.h
  HDRTEST drivers/gpu/drm/xe/xe_map.h
  HDRTEST drivers/gpu/drm/i915/display/intel_dsi_dcs_backlight.h
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/ltc/base.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../amdkfd/kfd_mqd_manager_v11.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/ltc/gf100.o
  HDRTEST drivers/gpu/drm/i915/display/intel_dvo.h
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/ltc/gk104.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../amdkfd/kfd_kernel_queue.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/ltc/gm107.o
  HDRTEST drivers/gpu/drm/i915/display/intel_sdvo.h
  HDRTEST drivers/gpu/drm/i915/display/intel_dp_aux.h
  HDRTEST drivers/gpu/drm/i915/display/intel_vdsc_regs.h
  HDRTEST drivers/gpu/drm/xe/xe_migrate.h
  CC [M]  drivers/gpu/drm/amd/amdgpu/../amdkfd/kfd_packet_manager.o
  HDRTEST drivers/gpu/drm/i915/display/intel_combo_phy.h
  HDRTEST drivers/gpu/drm/i915/display/intel_dvo_regs.h
  HDRTEST drivers/gpu/drm/xe/xe_migrate_doc.h
  HDRTEST drivers/gpu/drm/xe/xe_mmio.h
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/ltc/gm200.o
  HDRTEST drivers/gpu/drm/xe/xe_mocs.h
  HDRTEST drivers/gpu/drm/xe/xe_module.h
  HDRTEST drivers/gpu/drm/i915/display/intel_gmbus.h
  HDRTEST drivers/gpu/drm/xe/xe_pat.h
  HDRTEST drivers/gpu/drm/xe/xe_pci.h
  CC [M]  drivers/gpu/drm/amd/amdgpu/../amdkfd/kfd_packet_manager_vi.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/ltc/gp100.o
  HDRTEST drivers/gpu/drm/i915/display/intel_hdcp_gsc.h
  CC [M]  drivers/gpu/drm/amd/amdgpu/../amdkfd/kfd_packet_manager_v9.o
  HDRTEST drivers/gpu/drm/i915/display/intel_dsi.h
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/ltc/gp102.o
  HDRTEST drivers/gpu/drm/i915/display/intel_dmc_regs.h
  CC [M]  drivers/gpu/drm/amd/amdgpu/../amdkfd/kfd_process_queue_manager.o
  HDRTEST drivers/gpu/drm/i915/display/intel_ddi.h
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/ltc/gp10b.o
  HDRTEST drivers/gpu/drm/i915/display/intel_hotplug_irq.h
  HDRTEST drivers/gpu/drm/xe/xe_pci_types.h
  HDRTEST drivers/gpu/drm/i915/display/intel_tv_regs.h
  HDRTEST drivers/gpu/drm/xe/xe_pcode.h
  HDRTEST drivers/gpu/drm/xe/xe_pcode_api.h
  CC [M]  drivers/gpu/drm/amd/amdgpu/../amdkfd/kfd_device_queue_manager.o
  HDRTEST drivers/gpu/drm/xe/xe_platform_types.h
  HDRTEST drivers/gpu/drm/xe/xe_pm.h
  HDRTEST drivers/gpu/drm/i915/display/intel_dsb.h
  HDRTEST drivers/gpu/drm/xe/xe_preempt_fence.h
  CC [M]  drivers/gpu/drm/amd/amdgpu/../amdkfd/kfd_device_queue_manager_cik.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../amdkfd/kfd_device_queue_manager_vi.o
  HDRTEST drivers/gpu/drm/xe/xe_preempt_fence_types.h
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/ltc/ga102.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/mc/base.o
  HDRTEST drivers/gpu/drm/i915/display/intel_bios.h
  HDRTEST drivers/gpu/drm/xe/xe_pt.h
  HDRTEST drivers/gpu/drm/xe/xe_pt_types.h
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/mc/nv04.o
  HDRTEST drivers/gpu/drm/i915/display/intel_pch_display.h
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/mc/nv11.o
  HDRTEST drivers/gpu/drm/i915/display/intel_display_types.h
  HDRTEST drivers/gpu/drm/i915/display/intel_backlight.h
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/mc/nv17.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/mc/nv44.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/mc/nv50.o
  HDRTEST drivers/gpu/drm/xe/xe_pt_walk.h
  HDRTEST drivers/gpu/drm/i915/display/intel_vblank.h
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/mc/g84.o
  HDRTEST drivers/gpu/drm/xe/xe_query.h
  HDRTEST drivers/gpu/drm/xe/xe_range_fence.h
  HDRTEST drivers/gpu/drm/i915/display/intel_dp.h
  CC [M]  drivers/gpu/drm/amd/amdgpu/../amdkfd/kfd_device_queue_manager_v9.o
  HDRTEST drivers/gpu/drm/xe/xe_reg_sr.h
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/mc/g98.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/mc/gt215.o
  HDRTEST drivers/gpu/drm/i915/display/intel_pmdemand.h
  HDRTEST drivers/gpu/drm/xe/xe_reg_sr_types.h
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/mc/gf100.o
  HDRTEST drivers/gpu/drm/i915/display/intel_backlight_regs.h
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/mc/gk104.o
  HDRTEST drivers/gpu/drm/i915/display/intel_combo_phy_regs.h
  HDRTEST drivers/gpu/drm/i915/display/intel_display_reset.h
  CC [M]  drivers/gpu/drm/amd/amdgpu/../amdkfd/kfd_device_queue_manager_v10.o
  HDRTEST drivers/gpu/drm/i915/display/intel_display_power_map.h
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/mc/gk20a.o
  HDRTEST drivers/gpu/drm/xe/xe_reg_whitelist.h
  HDRTEST drivers/gpu/drm/i915/display/intel_ddi_buf_trans.h
  HDRTEST drivers/gpu/drm/i915/display/icl_dsi.h
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/mc/gp100.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../amdkfd/kfd_device_queue_manager_v11.o
  HDRTEST drivers/gpu/drm/i915/display/intel_lspcon.h
  CC [M]  drivers/gpu/drm/amd/amdgpu/../amdkfd/kfd_interrupt.o
  HDRTEST drivers/gpu/drm/i915/display/intel_dpio_phy.h
  HDRTEST drivers/gpu/drm/xe/xe_res_cursor.h
  HDRTEST drivers/gpu/drm/xe/xe_ring_ops.h
  HDRTEST drivers/gpu/drm/i915/display/intel_dp_hdcp.h
  HDRTEST drivers/gpu/drm/i915/display/intel_fb_pin.h
  CC [M]  drivers/gpu/drm/amd/amdgpu/../amdkfd/kfd_events.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../amdkfd/cik_event_interrupt.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../amdkfd/kfd_int_process_v9.o
  HDRTEST drivers/gpu/drm/i915/display/intel_pps.h
  HDRTEST drivers/gpu/drm/i915/display/intel_sprite_uapi.h
  CC [M]  drivers/gpu/drm/amd/amdgpu/../amdkfd/kfd_int_process_v10.o
  HDRTEST drivers/gpu/drm/xe/xe_ring_ops_types.h
  CC [M]  drivers/gpu/drm/amd/amdgpu/../amdkfd/kfd_int_process_v11.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../amdkfd/kfd_smi_events.o
  HDRTEST drivers/gpu/drm/xe/xe_rtp.h
  CC [M]  drivers/gpu/drm/amd/amdgpu/../amdkfd/kfd_crat.o
  HDRTEST drivers/gpu/drm/i915/gem/i915_gem_ttm.h
  HDRTEST drivers/gpu/drm/xe/xe_rtp_types.h
  HDRTEST drivers/gpu/drm/i915/gem/i915_gem_region.h
  HDRTEST drivers/gpu/drm/xe/xe_sa.h
  HDRTEST drivers/gpu/drm/i915/gem/i915_gem_context_types.h
  CC [M]  drivers/gpu/drm/amd/amdgpu/../amdkfd/kfd_debug.o
  HDRTEST drivers/gpu/drm/i915/gem/i915_gem_lmem.h
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/mc/gp10b.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../amdkfd/kfd_debugfs.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../amdkfd/kfd_svm.o
  HDRTEST drivers/gpu/drm/i915/gem/i915_gem_mman.h
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/mc/ga100.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../amdkfd/kfd_migrate.o
  HDRTEST drivers/gpu/drm/xe/xe_sa_types.h
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/mmu/base.o
  HDRTEST drivers/gpu/drm/xe/xe_sched_job.h
  HDRTEST drivers/gpu/drm/xe/xe_sched_job_types.h
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/mmu/nv04.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/mmu/nv41.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_fence.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/mmu/nv44.o
  HDRTEST drivers/gpu/drm/xe/xe_step.h
  CC [M]  drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/mmu/nv50.o
  HDRTEST drivers/gpu/drm/xe/xe_step_types.h
  CC [M]  drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v8.o
  HDRTEST drivers/gpu/drm/xe/xe_sync.h
  HDRTEST drivers/gpu/drm/xe/xe_sync_types.h
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/mmu/g84.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/mmu/mcp77.o
  HDRTEST drivers/gpu/drm/xe/xe_tile.h
  CC [M]  drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v9.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_arcturus.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_aldebaran.o
  HDRTEST drivers/gpu/drm/xe/xe_tile_sysfs.h
  CC [M]  drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gc_9_4_3.o
  HDRTEST drivers/gpu/drm/i915/gem/i915_gem_object_types.h
  CC [M]  drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v10.o
  HDRTEST drivers/gpu/drm/xe/xe_tile_sysfs_types.h
  HDRTEST drivers/gpu/drm/i915/gem/i915_gem_context.h
  HDRTEST drivers/gpu/drm/xe/xe_trace.h
  CC [M]  drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v10_3.o
  HDRTEST drivers/gpu/drm/xe/xe_ttm_stolen_mgr.h
  CC [M]  drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v11.o
  HDRTEST drivers/gpu/drm/xe/xe_ttm_sys_mgr.h
  HDRTEST drivers/gpu/drm/xe/xe_ttm_vram_mgr.h
  HDRTEST drivers/gpu/drm/xe/xe_ttm_vram_mgr_types.h
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/mmu/gf100.o
  HDRTEST drivers/gpu/drm/xe/xe_tuning.h
  CC [M]  drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v7.o
  HDRTEST drivers/gpu/drm/xe/xe_uc.h
  HDRTEST drivers/gpu/drm/xe/xe_uc_debugfs.h
  HDRTEST drivers/gpu/drm/xe/xe_uc_fw.h
  HDRTEST drivers/gpu/drm/xe/xe_uc_fw_abi.h
  HDRTEST drivers/gpu/drm/i915/gem/i915_gem_clflush.h
  HDRTEST drivers/gpu/drm/xe/xe_uc_fw_types.h
  HDRTEST drivers/gpu/drm/xe/xe_uc_types.h
  HDRTEST drivers/gpu/drm/xe/xe_vm.h
  HDRTEST drivers/gpu/drm/xe/xe_vm_doc.h
  HDRTEST drivers/gpu/drm/i915/gem/i915_gem_tiling.h
  HDRTEST drivers/gpu/drm/xe/xe_vm_madvise.h
  CC [M]  drivers/gpu/drm/amd/amdgpu/amdgpu_cgs.o
  HDRTEST drivers/gpu/drm/xe/xe_vm_types.h
  HDRTEST drivers/gpu/drm/i915/gem/i915_gem_stolen.h
  CC [M]  drivers/gpu/drm/amd/amdgpu/amdgpu_job.o
  HDRTEST drivers/gpu/drm/xe/xe_wa.h
  HDRTEST drivers/gpu/drm/i915/gem/i915_gem_ttm_pm.h
  HDRTEST drivers/gpu/drm/xe/xe_wait_user_fence.h
  CC [M]  drivers/gpu/drm/amd/amdgpu/amdgpu_acp.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../acp/acp_hw.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/mmu/gk104.o
  HDRTEST drivers/gpu/drm/i915/gem/i915_gem_create.h
  CC [M]  drivers/gpu/drm/amd/amdgpu/amdgpu_ioc32.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/amdgpu_acpi.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/mmu/gk20a.o
  HDRTEST drivers/gpu/drm/i915/gem/i915_gem_ttm_move.h
  HDRTEST drivers/gpu/drm/i915/gem/i915_gem_ioctls.h
  HDRTEST drivers/gpu/drm/xe/xe_wopcm.h
  HDRTEST drivers/gpu/drm/xe/xe_wopcm_types.h
  HDRTEST drivers/gpu/drm/i915/gem/i915_gem_domain.h
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/mmu/gm200.o
  HDRTEST drivers/gpu/drm/i915/gem/i915_gem_internal.h
  LD [M]  drivers/gpu/drm/xe/xe.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/amdgpu_hmm.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../pm/swsmu/smu11/arcturus_ppt.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/mmu/gm20b.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../pm/swsmu/smu11/navi10_ppt.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../pm/swsmu/smu11/sienna_cichlid_ppt.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../pm/swsmu/smu11/vangogh_ppt.o
  HDRTEST drivers/gpu/drm/i915/gem/i915_gem_dmabuf.h
  HDRTEST drivers/gpu/drm/i915/gem/selftests/mock_context.h
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/mmu/gp100.o
  HDRTEST drivers/gpu/drm/i915/gem/selftests/huge_gem_object.h
  HDRTEST drivers/gpu/drm/i915/gem/selftests/mock_gem_object.h
  HDRTEST drivers/gpu/drm/i915/gem/selftests/mock_dmabuf.h
  HDRTEST drivers/gpu/drm/i915/gem/selftests/igt_gem_utils.h
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/mmu/gp10b.o
  HDRTEST drivers/gpu/drm/i915/gem/i915_gem_userptr.h
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/mmu/gv100.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/mmu/tu102.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/mmu/mem.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../pm/swsmu/smu11/cyan_skillfish_ppt.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../pm/swsmu/smu11/smu_v11_0.o
  HDRTEST drivers/gpu/drm/i915/gem/i915_gem_pm.h
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/mmu/memnv04.o
  HDRTEST drivers/gpu/drm/i915/gem/i915_gem_shrinker.h
  CC [M]  drivers/gpu/drm/amd/amdgpu/../pm/swsmu/smu12/renoir_ppt.o
  HDRTEST drivers/gpu/drm/i915/gem/i915_gemfs.h
  CC [M]  drivers/gpu/drm/amd/amdgpu/../pm/swsmu/smu12/smu_v12_0.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/mmu/memnv50.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../pm/swsmu/smu13/smu_v13_0.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/mmu/memgf100.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../pm/swsmu/smu13/aldebaran_ppt.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../pm/swsmu/smu13/yellow_carp_ppt.o
  HDRTEST drivers/gpu/drm/i915/gem/i915_gem_object.h
  HDRTEST drivers/gpu/drm/i915/gt/intel_timeline_types.h
  HDRTEST drivers/gpu/drm/i915/gt/selftest_engine.h
  CC [M]  drivers/gpu/drm/amd/amdgpu/../pm/swsmu/smu13/smu_v13_0_0_ppt.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../pm/swsmu/smu13/smu_v13_0_4_ppt.o
  HDRTEST drivers/gpu/drm/i915/gt/intel_breadcrumbs.h
  CC [M]  drivers/gpu/drm/amd/amdgpu/../pm/swsmu/smu13/smu_v13_0_5_ppt.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/mmu/vmm.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/mmu/vmmnv04.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../pm/swsmu/smu13/smu_v13_0_7_ppt.o
  HDRTEST drivers/gpu/drm/i915/gt/intel_engine_heartbeat.h
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/mmu/vmmnv41.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/mmu/vmmnv44.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../pm/swsmu/smu13/smu_v13_0_6_ppt.o
  HDRTEST drivers/gpu/drm/i915/gt/intel_context_types.h
  HDRTEST drivers/gpu/drm/i915/gt/intel_execlists_submission.h
  CC [M]  drivers/gpu/drm/amd/amdgpu/../pm/swsmu/amdgpu_smu.o
  HDRTEST drivers/gpu/drm/i915/gt/intel_gt_pm.h
  HDRTEST drivers/gpu/drm/i915/gt/selftest_rc6.h
  HDRTEST drivers/gpu/drm/i915/gt/intel_llc_types.h
  HDRTEST drivers/gpu/drm/i915/gt/intel_gt.h
  HDRTEST drivers/gpu/drm/i915/gt/intel_region_lmem.h
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/mmu/vmmnv50.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/mmu/vmmmcp77.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../pm/swsmu/smu_cmn.o
  HDRTEST drivers/gpu/drm/i915/gt/intel_gt_requests.h
  HDRTEST drivers/gpu/drm/i915/gt/intel_ggtt_gmch.h
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/mmu/vmmgf100.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../pm/powerplay/smumgr/smumgr.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/mmu/vmmgk104.o
  HDRTEST drivers/gpu/drm/i915/gt/intel_gt_print.h
  HDRTEST drivers/gpu/drm/i915/gt/gen8_ppgtt.h
  CC [M]  drivers/gpu/drm/amd/amdgpu/../pm/powerplay/smumgr/smu8_smumgr.o
  HDRTEST drivers/gpu/drm/i915/gt/intel_gt_mcr.h
  HDRTEST drivers/gpu/drm/i915/gt/intel_timeline.h
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/mmu/vmmgk20a.o
  HDRTEST drivers/gpu/drm/i915/gt/gen6_engine_cs.h
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/mmu/vmmgm200.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../pm/powerplay/smumgr/tonga_smumgr.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/mmu/vmmgm20b.o
  HDRTEST drivers/gpu/drm/i915/gt/intel_gt_pm_debugfs.h
  CC [M]  drivers/gpu/drm/amd/amdgpu/../pm/powerplay/smumgr/fiji_smumgr.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/mmu/vmmgp100.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/mmu/vmmgp10b.o
  HDRTEST drivers/gpu/drm/i915/gt/intel_workarounds_types.h
  HDRTEST drivers/gpu/drm/i915/gt/selftest_rps.h
  HDRTEST drivers/gpu/drm/i915/gt/intel_sa_media.h
  HDRTEST drivers/gpu/drm/i915/gt/intel_gt_debugfs.h
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/mmu/vmmgv100.o
  HDRTEST drivers/gpu/drm/i915/gt/intel_gt_clock_utils.h
  HDRTEST drivers/gpu/drm/i915/gt/intel_rps_types.h
  HDRTEST drivers/gpu/drm/i915/gt/selftest_engine_heartbeat.h
  HDRTEST drivers/gpu/drm/i915/gt/sysfs_engines.h
  CC [M]  drivers/gpu/drm/amd/amdgpu/../pm/powerplay/smumgr/polaris10_smumgr.o
  HDRTEST drivers/gpu/drm/i915/gt/gen7_renderclear.h
  HDRTEST drivers/gpu/drm/i915/gt/intel_context.h
  HDRTEST drivers/gpu/drm/i915/gt/intel_wopcm.h
  HDRTEST drivers/gpu/drm/i915/gt/intel_mocs.h
  HDRTEST drivers/gpu/drm/i915/gt/intel_engine_pm.h
  HDRTEST drivers/gpu/drm/i915/gt/intel_gt_sysfs.h
  CC [M]  drivers/gpu/drm/amd/amdgpu/../pm/powerplay/smumgr/iceland_smumgr.o
  HDRTEST drivers/gpu/drm/i915/gt/intel_rc6.h
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/mmu/vmmtu102.o
  HDRTEST drivers/gpu/drm/i915/gt/intel_ring_types.h
  HDRTEST drivers/gpu/drm/i915/gt/intel_workarounds.h
  HDRTEST drivers/gpu/drm/i915/gt/intel_engine_regs.h
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/mmu/umem.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../pm/powerplay/smumgr/smu7_smumgr.o
  HDRTEST drivers/gpu/drm/i915/gt/intel_gt_pm_irq.h
  HDRTEST drivers/gpu/drm/i915/gt/shmem_utils.h
  CC [M]  drivers/gpu/drm/amd/amdgpu/../pm/powerplay/smumgr/vega10_smumgr.o
  HDRTEST drivers/gpu/drm/i915/gt/intel_engine.h
  CC [M]  drivers/gpu/drm/amd/amdgpu/../pm/powerplay/smumgr/smu10_smumgr.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../pm/powerplay/smumgr/ci_smumgr.o
  HDRTEST drivers/gpu/drm/i915/gt/intel_reset_types.h
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/mmu/ummu.o
  HDRTEST drivers/gpu/drm/i915/gt/intel_gt_regs.h
  HDRTEST drivers/gpu/drm/i915/gt/intel_reset.h
  HDRTEST drivers/gpu/drm/i915/gt/uc/intel_gsc_fw.h
  HDRTEST drivers/gpu/drm/i915/gt/uc/guc_capture_fwif.h
  HDRTEST drivers/gpu/drm/i915/gt/uc/intel_uc.h
  CC [M]  drivers/gpu/drm/amd/amdgpu/../pm/powerplay/smumgr/vega12_smumgr.o
  HDRTEST drivers/gpu/drm/i915/gt/uc/intel_uc_fw_abi.h
  CC [M]  drivers/gpu/drm/amd/amdgpu/../pm/powerplay/smumgr/vegam_smumgr.o
  HDRTEST drivers/gpu/drm/i915/gt/uc/intel_guc_print.h
  HDRTEST drivers/gpu/drm/i915/gt/uc/intel_guc_fw.h
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/mmu/uvmm.o
  HDRTEST drivers/gpu/drm/i915/gt/uc/intel_guc_debugfs.h
  HDRTEST drivers/gpu/drm/i915/gt/uc/abi/guc_klvs_abi.h
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/mxm/base.o
  HDRTEST drivers/gpu/drm/i915/gt/uc/abi/guc_errors_abi.h
  CC [M]  drivers/gpu/drm/amd/amdgpu/../pm/powerplay/smumgr/smu9_smumgr.o
  HDRTEST drivers/gpu/drm/i915/gt/uc/abi/guc_actions_slpc_abi.h
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/mxm/mxms.o
  HDRTEST drivers/gpu/drm/i915/gt/uc/abi/guc_communication_mmio_abi.h
  HDRTEST drivers/gpu/drm/i915/gt/uc/abi/guc_actions_abi.h
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/mxm/nv50.o
  HDRTEST drivers/gpu/drm/i915/gt/uc/abi/guc_communication_ctb_abi.h
  HDRTEST drivers/gpu/drm/i915/gt/uc/abi/guc_messages_abi.h
  CC [M]  drivers/gpu/drm/amd/amdgpu/../pm/powerplay/smumgr/vega20_smumgr.o
  HDRTEST drivers/gpu/drm/i915/gt/uc/intel_gsc_uc_debugfs.h
  HDRTEST drivers/gpu/drm/i915/gt/uc/intel_gsc_uc_heci_cmd_submit.h
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/pci/agp.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../pm/powerplay/hwmgr/hwmgr.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/pci/base.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../pm/powerplay/hwmgr/processpptables.o
  HDRTEST drivers/gpu/drm/i915/gt/uc/intel_guc_reg.h
  CC [M]  drivers/gpu/drm/amd/amdgpu/../pm/powerplay/hwmgr/hardwaremanager.o
  HDRTEST drivers/gpu/drm/i915/gt/uc/intel_gsc_uc.h
  HDRTEST drivers/gpu/drm/i915/gt/uc/intel_huc.h
  CC [M]  drivers/gpu/drm/amd/amdgpu/../pm/powerplay/hwmgr/smu8_hwmgr.o
  HDRTEST drivers/gpu/drm/i915/gt/uc/intel_gsc_binary_headers.h
  CC [M]  drivers/gpu/drm/amd/amdgpu/../pm/powerplay/hwmgr/pppcielanes.o
  HDRTEST drivers/gpu/drm/i915/gt/uc/intel_guc.h
  HDRTEST drivers/gpu/drm/i915/gt/uc/intel_huc_print.h
  CC [M]  drivers/gpu/drm/amd/amdgpu/../pm/powerplay/hwmgr/process_pptables_v1_0.o
  HDRTEST drivers/gpu/drm/i915/gt/uc/intel_huc_fw.h
  HDRTEST drivers/gpu/drm/i915/gt/uc/intel_guc_fwif.h
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/pci/pcie.o
  HDRTEST drivers/gpu/drm/i915/gt/uc/intel_guc_capture.h
  CC [M]  drivers/gpu/drm/amd/amdgpu/../pm/powerplay/hwmgr/ppatomctrl.o
  HDRTEST drivers/gpu/drm/i915/gt/uc/intel_guc_log_debugfs.h
  HDRTEST drivers/gpu/drm/i915/gt/uc/intel_gsc_proxy.h
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/pci/nv04.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../pm/powerplay/hwmgr/ppatomfwctrl.o
  HDRTEST drivers/gpu/drm/i915/gt/uc/intel_guc_submission.h
  HDRTEST drivers/gpu/drm/i915/gt/uc/intel_guc_slpc_types.h
  HDRTEST drivers/gpu/drm/i915/gt/uc/intel_guc_log.h
  CC [M]  drivers/gpu/drm/amd/amdgpu/../pm/powerplay/hwmgr/smu7_hwmgr.o
  HDRTEST drivers/gpu/drm/i915/gt/uc/intel_guc_ct.h
  HDRTEST drivers/gpu/drm/i915/gt/uc/intel_guc_slpc.h
  CC [M]  drivers/gpu/drm/amd/amdgpu/../pm/powerplay/hwmgr/smu7_powertune.o
  HDRTEST drivers/gpu/drm/i915/gt/uc/intel_uc_fw.h
  HDRTEST drivers/gpu/drm/i915/gt/uc/intel_guc_ads.h
  CC [M]  drivers/gpu/drm/amd/amdgpu/../pm/powerplay/hwmgr/smu7_thermal.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/pci/nv40.o
  HDRTEST drivers/gpu/drm/i915/gt/uc/intel_uc_debugfs.h
  HDRTEST drivers/gpu/drm/i915/gt/uc/intel_guc_rc.h
  HDRTEST drivers/gpu/drm/i915/gt/uc/intel_huc_debugfs.h
  HDRTEST drivers/gpu/drm/i915/gt/intel_hwconfig.h
  HDRTEST drivers/gpu/drm/i915/gt/intel_llc.h
  HDRTEST drivers/gpu/drm/i915/gt/gen8_engine_cs.h
  CC [M]  drivers/gpu/drm/amd/amdgpu/../pm/powerplay/hwmgr/smu7_clockpowergating.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/pci/nv46.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/pci/nv4c.o
  HDRTEST drivers/gpu/drm/i915/gt/intel_sseu_debugfs.h
  HDRTEST drivers/gpu/drm/i915/gt/intel_rc6_types.h
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/pci/g84.o
  HDRTEST drivers/gpu/drm/i915/gt/intel_context_param.h
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/pci/g92.o
  HDRTEST drivers/gpu/drm/i915/gt/intel_gpu_commands.h
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/pci/g94.o
  HDRTEST drivers/gpu/drm/i915/gt/intel_engine_user.h
  CC [M]  drivers/gpu/drm/amd/amdgpu/../pm/powerplay/hwmgr/vega10_processpptables.o
  HDRTEST drivers/gpu/drm/i915/gt/intel_gt_irq.h
  HDRTEST drivers/gpu/drm/i915/gt/intel_gsc.h
  HDRTEST drivers/gpu/drm/i915/gt/intel_rps.h
  HDRTEST drivers/gpu/drm/i915/gt/selftest_llc.h
  CC [M]  drivers/gpu/drm/amd/amdgpu/../pm/powerplay/hwmgr/vega10_hwmgr.o
  HDRTEST drivers/gpu/drm/i915/gt/gen6_ppgtt.h
  HDRTEST drivers/gpu/drm/i915/gt/intel_ggtt_fencing.h
  HDRTEST drivers/gpu/drm/i915/gt/intel_migrate_types.h
  CC [M]  drivers/gpu/drm/amd/amdgpu/../pm/powerplay/hwmgr/vega10_powertune.o
  HDRTEST drivers/gpu/drm/i915/gt/selftests/mock_timeline.h
  HDRTEST drivers/gpu/drm/i915/gt/intel_lrc.h
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/pci/gf100.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/pci/gf106.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../pm/powerplay/hwmgr/vega10_thermal.o
  HDRTEST drivers/gpu/drm/i915/gt/intel_lrc_reg.h
  HDRTEST drivers/gpu/drm/i915/gt/intel_migrate.h
  CC [M]  drivers/gpu/drm/amd/amdgpu/../pm/powerplay/hwmgr/smu10_hwmgr.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../pm/powerplay/hwmgr/pp_psm.o
  HDRTEST drivers/gpu/drm/i915/gt/intel_gt_sysfs_pm.h
  HDRTEST drivers/gpu/drm/i915/gt/intel_breadcrumbs_types.h
  HDRTEST drivers/gpu/drm/i915/gt/intel_gt_buffer_pool.h
  HDRTEST drivers/gpu/drm/i915/gt/mock_engine.h
  HDRTEST drivers/gpu/drm/i915/gt/intel_engine_stats.h
  HDRTEST drivers/gpu/drm/i915/gt/intel_gtt.h
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/pci/gk104.o
  HDRTEST drivers/gpu/drm/i915/gt/intel_gt_buffer_pool_types.h
  CC [M]  drivers/gpu/drm/amd/amdgpu/../pm/powerplay/hwmgr/vega12_processpptables.o
  HDRTEST drivers/gpu/drm/i915/gt/intel_ring.h
  HDRTEST drivers/gpu/drm/i915/gt/intel_gt_types.h
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/pci/gp100.o
  HDRTEST drivers/gpu/drm/i915/gt/intel_renderstate.h
  CC [M]  drivers/gpu/drm/amd/amdgpu/../pm/powerplay/hwmgr/vega12_hwmgr.o
  HDRTEST drivers/gpu/drm/i915/gt/intel_sseu.h
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/pmu/base.o
  HDRTEST drivers/gpu/drm/i915/gt/intel_engine_types.h
  CC [M]  drivers/gpu/drm/amd/amdgpu/../pm/powerplay/hwmgr/vega12_thermal.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../pm/powerplay/hwmgr/pp_overdriver.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/pmu/memx.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../pm/powerplay/hwmgr/smu_helper.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/pmu/gt215.o
  HDRTEST drivers/gpu/drm/i915/gt/intel_gt_engines_debugfs.h
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/pmu/gf100.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../pm/powerplay/hwmgr/vega20_processpptables.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../pm/powerplay/hwmgr/vega20_hwmgr.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/pmu/gf119.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/pmu/gk104.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../pm/powerplay/hwmgr/vega20_powertune.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../pm/powerplay/hwmgr/vega20_thermal.o
  HDRTEST drivers/gpu/drm/i915/gt/gen2_engine_cs.h
  HDRTEST drivers/gpu/drm/i915/gvt/gvt.h
  HDRTEST drivers/gpu/drm/i915/gvt/trace.h
  CC [M]  drivers/gpu/drm/amd/amdgpu/../pm/powerplay/hwmgr/common_baco.o
  HDRTEST drivers/gpu/drm/i915/gvt/debug.h
  HDRTEST drivers/gpu/drm/i915/gvt/edid.h
  HDRTEST drivers/gpu/drm/i915/gvt/page_track.h
  CC [M]  drivers/gpu/drm/amd/amdgpu/../pm/powerplay/hwmgr/vega10_baco.o
  HDRTEST drivers/gpu/drm/i915/gvt/mmio.h
  HDRTEST drivers/gpu/drm/i915/gvt/sched_policy.h
  HDRTEST drivers/gpu/drm/i915/gvt/fb_decoder.h
  HDRTEST drivers/gpu/drm/i915/gvt/cmd_parser.h
  CC [M]  drivers/gpu/drm/amd/amdgpu/../pm/powerplay/hwmgr/vega20_baco.o
  HDRTEST drivers/gpu/drm/i915/gvt/dmabuf.h
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/pmu/gk110.o
  HDRTEST drivers/gpu/drm/i915/gvt/mmio_context.h
  CC [M]  drivers/gpu/drm/amd/amdgpu/../pm/powerplay/hwmgr/vega12_baco.o
  HDRTEST drivers/gpu/drm/i915/gvt/display.h
  HDRTEST drivers/gpu/drm/i915/gvt/gtt.h
  HDRTEST drivers/gpu/drm/i915/gvt/scheduler.h
  HDRTEST drivers/gpu/drm/i915/gvt/reg.h
  HDRTEST drivers/gpu/drm/i915/gvt/execlist.h
  HDRTEST drivers/gpu/drm/i915/gvt/interrupt.h
  HDRTEST drivers/gpu/drm/i915/i915_active.h
  HDRTEST drivers/gpu/drm/i915/i915_active_types.h
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/pmu/gk208.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../pm/powerplay/hwmgr/smu9_baco.o
  HDRTEST drivers/gpu/drm/i915/i915_cmd_parser.h
  HDRTEST drivers/gpu/drm/i915/i915_config.h
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/pmu/gk20a.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/pmu/gm107.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../pm/powerplay/hwmgr/tonga_baco.o
  HDRTEST drivers/gpu/drm/i915/i915_debugfs.h
  HDRTEST drivers/gpu/drm/i915/i915_debugfs_params.h
  HDRTEST drivers/gpu/drm/i915/i915_deps.h
  HDRTEST drivers/gpu/drm/i915/i915_driver.h
  CC [M]  drivers/gpu/drm/amd/amdgpu/../pm/powerplay/hwmgr/polaris_baco.o
  HDRTEST drivers/gpu/drm/i915/i915_drm_client.h
  CC [M]  drivers/gpu/drm/amd/amdgpu/../pm/powerplay/hwmgr/fiji_baco.o
  HDRTEST drivers/gpu/drm/i915/i915_drv.h
  HDRTEST drivers/gpu/drm/i915/i915_file_private.h
  HDRTEST drivers/gpu/drm/i915/i915_fixed.h
  HDRTEST drivers/gpu/drm/i915/i915_gem.h
  HDRTEST drivers/gpu/drm/i915/i915_gem_evict.h
  HDRTEST drivers/gpu/drm/i915/i915_gem_gtt.h
  CC [M]  drivers/gpu/drm/amd/amdgpu/../pm/powerplay/hwmgr/ci_baco.o
  HDRTEST drivers/gpu/drm/i915/i915_gem_ww.h
  HDRTEST drivers/gpu/drm/i915/i915_getparam.h
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/pmu/gm200.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../pm/powerplay/hwmgr/smu7_baco.o
  HDRTEST drivers/gpu/drm/i915/i915_gpu_error.h
  HDRTEST drivers/gpu/drm/i915/i915_hwmon.h
  CC [M]  drivers/gpu/drm/amd/amdgpu/../pm/powerplay/amd_powerplay.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/pmu/gm20b.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../pm/legacy-dpm/legacy_dpm.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../pm/legacy-dpm/kv_dpm.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/pmu/gp102.o
  HDRTEST drivers/gpu/drm/i915/i915_ioc32.h
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/pmu/gp10b.o
  HDRTEST drivers/gpu/drm/i915/i915_ioctl.h
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/privring/gf100.o
  HDRTEST drivers/gpu/drm/i915/i915_iosf_mbi.h
  HDRTEST drivers/gpu/drm/i915/i915_irq.h
  HDRTEST drivers/gpu/drm/i915/i915_memcpy.h
  HDRTEST drivers/gpu/drm/i915/i915_mitigations.h
  HDRTEST drivers/gpu/drm/i915/i915_mm.h
  CC [M]  drivers/gpu/drm/amd/amdgpu/../pm/legacy-dpm/kv_smc.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../pm/legacy-dpm/si_dpm.o
  HDRTEST drivers/gpu/drm/i915/i915_params.h
  HDRTEST drivers/gpu/drm/i915/i915_pci.h
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/privring/gf117.o
  HDRTEST drivers/gpu/drm/i915/i915_perf.h
  HDRTEST drivers/gpu/drm/i915/i915_perf_oa_regs.h
  CC [M]  drivers/gpu/drm/amd/amdgpu/../pm/legacy-dpm/si_smc.o
  HDRTEST drivers/gpu/drm/i915/i915_perf_types.h
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/privring/gk104.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../pm/amdgpu_dpm.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../pm/amdgpu_pm.o
  HDRTEST drivers/gpu/drm/i915/i915_pmu.h
  HDRTEST drivers/gpu/drm/i915/i915_priolist_types.h
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/privring/gk20a.o
  HDRTEST drivers/gpu/drm/i915/i915_pvinfo.h
  HDRTEST drivers/gpu/drm/i915/i915_query.h
  HDRTEST drivers/gpu/drm/i915/i915_reg.h
  HDRTEST drivers/gpu/drm/i915/i915_reg_defs.h
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/privring/gm200.o
  HDRTEST drivers/gpu/drm/i915/i915_request.h
  HDRTEST drivers/gpu/drm/i915/i915_scatterlist.h
  CC [M]  drivers/gpu/drm/amd/amdgpu/../pm/amdgpu_dpm_internal.o
  HDRTEST drivers/gpu/drm/i915/i915_scheduler.h
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/privring/gp10b.o
  HDRTEST drivers/gpu/drm/i915/i915_scheduler_types.h
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/amdgpu_dm/amdgpu_dm.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/therm/base.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/therm/fan.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/therm/fannil.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/amdgpu_dm/amdgpu_dm_plane.o
  HDRTEST drivers/gpu/drm/i915/i915_selftest.h
  HDRTEST drivers/gpu/drm/i915/i915_suspend.h
  HDRTEST drivers/gpu/drm/i915/i915_sw_fence.h
  HDRTEST drivers/gpu/drm/i915/i915_sw_fence_work.h
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/amdgpu_dm/amdgpu_dm_crtc.o
  HDRTEST drivers/gpu/drm/i915/i915_switcheroo.h
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/therm/fanpwm.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/amdgpu_dm/amdgpu_dm_irq.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/therm/fantog.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/amdgpu_dm/amdgpu_dm_mst_types.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/amdgpu_dm/amdgpu_dm_color.o
  HDRTEST drivers/gpu/drm/i915/i915_syncmap.h
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/amdgpu_dm/dc_fpu.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/therm/ic.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/therm/temp.o
  HDRTEST drivers/gpu/drm/i915/i915_sysfs.h
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/amdgpu_dm/amdgpu_dm_services.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/amdgpu_dm/amdgpu_dm_helpers.o
  HDRTEST drivers/gpu/drm/i915/i915_tasklet.h
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/therm/nv40.o
  HDRTEST drivers/gpu/drm/i915/i915_trace.h
  HDRTEST drivers/gpu/drm/i915/i915_ttm_buddy_manager.h
  HDRTEST drivers/gpu/drm/i915/i915_user_extensions.h
  HDRTEST drivers/gpu/drm/i915/i915_utils.h
  HDRTEST drivers/gpu/drm/i915/i915_vgpu.h
  HDRTEST drivers/gpu/drm/i915/i915_vma.h
  HDRTEST drivers/gpu/drm/i915/i915_vma_resource.h
  HDRTEST drivers/gpu/drm/i915/i915_vma_types.h
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/therm/nv50.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/amdgpu_dm/amdgpu_dm_pp_smu.o
  HDRTEST drivers/gpu/drm/i915/intel_clock_gating.h
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/therm/g84.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/therm/gt215.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/therm/gf100.o
  HDRTEST drivers/gpu/drm/i915/intel_device_info.h
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/amdgpu_dm/amdgpu_dm_psr.o
  HDRTEST drivers/gpu/drm/i915/intel_gvt.h
  HDRTEST drivers/gpu/drm/i915/intel_mchbar_regs.h
  HDRTEST drivers/gpu/drm/i915/intel_memory_region.h
  HDRTEST drivers/gpu/drm/i915/intel_pci_config.h
  HDRTEST drivers/gpu/drm/i915/intel_pcode.h
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/therm/gf119.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/amdgpu_dm/amdgpu_dm_hdcp.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/amdgpu_dm/amdgpu_dm_crc.o
  HDRTEST drivers/gpu/drm/i915/intel_region_ttm.h
  HDRTEST drivers/gpu/drm/i915/intel_runtime_pm.h
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/amdgpu_dm/amdgpu_dm_debugfs.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/basics/conversion.o
  HDRTEST drivers/gpu/drm/i915/intel_sbi.h
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/therm/gk104.o
  HDRTEST drivers/gpu/drm/i915/intel_step.h
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/basics/fixpt31_32.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/therm/gm107.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/basics/vector.o
  HDRTEST drivers/gpu/drm/i915/intel_uncore.h
  HDRTEST drivers/gpu/drm/i915/intel_wakeref.h
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/therm/gm200.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/therm/gp100.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/timer/base.o
  HDRTEST drivers/gpu/drm/i915/pxp/intel_pxp_tee.h
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/timer/nv04.o
  HDRTEST drivers/gpu/drm/i915/pxp/intel_pxp_irq.h
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/timer/nv40.o
  HDRTEST drivers/gpu/drm/i915/pxp/intel_pxp_session.h
  HDRTEST drivers/gpu/drm/i915/pxp/intel_pxp_cmd_interface_43.h
  HDRTEST drivers/gpu/drm/i915/pxp/intel_pxp_gsccs.h
  HDRTEST drivers/gpu/drm/i915/pxp/intel_pxp_cmd.h
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/timer/nv41.o
  HDRTEST drivers/gpu/drm/i915/pxp/intel_pxp.h
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/timer/gk20a.o
  HDRTEST drivers/gpu/drm/i915/pxp/intel_pxp_types.h
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/basics/dc_common.o
  HDRTEST drivers/gpu/drm/i915/pxp/intel_pxp_debugfs.h
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/bios/bios_parser.o
  HDRTEST drivers/gpu/drm/i915/pxp/intel_pxp_cmd_interface_cmn.h
  HDRTEST drivers/gpu/drm/i915/pxp/intel_pxp_huc.h
  HDRTEST drivers/gpu/drm/i915/pxp/intel_pxp_pm.h
  HDRTEST drivers/gpu/drm/i915/pxp/intel_pxp_cmd_interface_42.h
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/bios/bios_parser_interface.o
  HDRTEST drivers/gpu/drm/i915/pxp/intel_pxp_regs.h
  HDRTEST drivers/gpu/drm/i915/selftests/igt_live_test.h
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/bios/bios_parser_helper.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/top/base.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/top/gk104.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/top/ga100.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/bios/command_table.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/vfn/base.o
  HDRTEST drivers/gpu/drm/i915/selftests/igt_atomic.h
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/bios/command_table_helper.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/bios/bios_parser_common.o
  HDRTEST drivers/gpu/drm/i915/selftests/mock_gem_device.h
  HDRTEST drivers/gpu/drm/i915/selftests/mock_drm.h
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/vfn/uvfn.o
  HDRTEST drivers/gpu/drm/i915/selftests/igt_reset.h
  HDRTEST drivers/gpu/drm/i915/selftests/intel_scheduler_helpers.h
  HDRTEST drivers/gpu/drm/i915/selftests/lib_sw_fence.h
  HDRTEST drivers/gpu/drm/i915/selftests/i915_perf_selftests.h
  HDRTEST drivers/gpu/drm/i915/selftests/mock_uncore.h
  HDRTEST drivers/gpu/drm/i915/selftests/mock_gtt.h
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/vfn/gv100.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/bios/command_table2.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/bios/command_table_helper2.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/bios/bios_parser2.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/bios/dce60/command_table_helper_dce60.o
  HDRTEST drivers/gpu/drm/i915/selftests/i915_mock_selftests.h
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/vfn/tu102.o
  HDRTEST drivers/gpu/drm/i915/selftests/mock_request.h
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/bios/dce80/command_table_helper_dce80.o
  HDRTEST drivers/gpu/drm/i915/selftests/i915_random.h
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/bios/dce110/command_table_helper_dce110.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/vfn/ga100.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/bios/dce112/command_table_helper_dce112.o
  HDRTEST drivers/gpu/drm/i915/selftests/igt_spinner.h
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/bios/dce112/command_table_helper2_dce112.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/dml/calcs/dce_calcs.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/dml/calcs/custom_float.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/volt/base.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/dml/calcs/bw_fixed.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/volt/gpio.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/dml/display_mode_lib.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/dml/display_rq_dlg_helpers.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/volt/nv40.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/dml/dml1_display_rq_dlg_calc.o
  HDRTEST drivers/gpu/drm/i915/selftests/librapl.h
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/volt/gf100.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/volt/gf117.o
  HDRTEST drivers/gpu/drm/i915/selftests/mock_region.h
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/dml/dcn10/dcn10_fpu.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/volt/gk104.o
  HDRTEST drivers/gpu/drm/i915/selftests/i915_live_selftests.h
  HDRTEST drivers/gpu/drm/i915/selftests/igt_mmap.h
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/dml/dcn20/dcn20_fpu.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/dml/display_mode_vba.o
  HDRTEST drivers/gpu/drm/i915/selftests/igt_flush_test.h
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/dml/dcn20/display_rq_dlg_calc_20.o
  HDRTEST drivers/gpu/drm/i915/soc/intel_pch.h
  HDRTEST drivers/gpu/drm/i915/soc/intel_dram.h
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/dml/dcn20/display_mode_vba_20.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/volt/gk20a.o
  HDRTEST drivers/gpu/drm/i915/soc/intel_gmch.h
  HDRTEST drivers/gpu/drm/i915/vlv_sideband.h
  CC [M]  drivers/gpu/drm/nouveau/nvkm/subdev/volt/gm20b.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/dml/dcn20/display_rq_dlg_calc_20v2.o
  HDRTEST drivers/gpu/drm/i915/vlv_sideband_reg.h
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/dml/dcn20/display_mode_vba_20v2.o
  HDRTEST drivers/gpu/drm/i915/vlv_suspend.h
  LD [M]  drivers/gpu/drm/i915/i915.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/dml/dcn21/display_rq_dlg_calc_21.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/engine/falcon.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/engine/xtensa.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/engine/bsp/g84.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/engine/ce/gt215.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/engine/ce/gf100.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/dml/dcn21/display_mode_vba_21.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/engine/ce/gk104.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/dml/dcn30/dcn30_fpu.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/dml/dcn30/display_mode_vba_30.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/dml/dcn30/display_rq_dlg_calc_30.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/dml/dcn31/display_mode_vba_31.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/engine/ce/gm107.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/dml/dcn31/display_rq_dlg_calc_31.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/dml/dcn314/display_mode_vba_314.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/dml/dcn314/display_rq_dlg_calc_314.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/dml/dcn32/display_mode_vba_32.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/dml/dcn32/display_rq_dlg_calc_32.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/engine/ce/gm200.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/engine/ce/gp100.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/dml/dcn32/display_mode_vba_util_32.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/engine/ce/gp102.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/engine/ce/gv100.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/engine/ce/tu102.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/engine/ce/ga100.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/engine/ce/ga102.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/dml/dcn31/dcn31_fpu.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/dml/dcn32/dcn32_fpu.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/engine/cipher/g84.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/dml/dcn321/dcn321_fpu.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/dml/dcn301/dcn301_fpu.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/dml/dcn302/dcn302_fpu.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/engine/device/acpi.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/dml/dcn303/dcn303_fpu.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/engine/device/base.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/engine/device/ctrl.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/dml/dcn314/dcn314_fpu.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/engine/device/pci.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/engine/device/tegra.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/engine/device/user.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/dml/dsc/rc_calc_fpu.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/engine/disp/base.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/engine/disp/chan.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/engine/disp/conn.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/engine/disp/dp.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/engine/disp/hdmi.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/engine/disp/head.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/engine/disp/ior.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/engine/disp/outp.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/dml/calcs/dcn_calcs.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/engine/disp/vga.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/dml/calcs/dcn_calc_math.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/dml/calcs/dcn_calc_auto.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/engine/disp/nv04.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/engine/disp/nv50.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/engine/disp/g84.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/clk_mgr/clk_mgr.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/clk_mgr/dce60/dce60_clk_mgr.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/engine/disp/g94.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/clk_mgr/dce100/dce_clk_mgr.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/clk_mgr/dce110/dce110_clk_mgr.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/engine/disp/gt200.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/clk_mgr/dce112/dce112_clk_mgr.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/clk_mgr/dce120/dce120_clk_mgr.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/clk_mgr/dcn10/rv1_clk_mgr.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/engine/disp/mcp77.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/engine/disp/gt215.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/clk_mgr/dcn10/rv1_clk_mgr_vbios_smu.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/clk_mgr/dcn10/rv2_clk_mgr.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/clk_mgr/dcn20/dcn20_clk_mgr.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/clk_mgr/dcn201/dcn201_clk_mgr.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/clk_mgr/dcn21/rn_clk_mgr.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/engine/disp/mcp89.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/engine/disp/gf119.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/clk_mgr/dcn21/rn_clk_mgr_vbios_smu.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/engine/disp/gk104.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/clk_mgr/dcn30/dcn30_clk_mgr.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/engine/disp/gk110.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/engine/disp/gm107.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/engine/disp/gm200.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/engine/disp/gp100.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/engine/disp/gp102.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/engine/disp/gv100.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/clk_mgr/dcn30/dcn30_clk_mgr_smu_msg.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/engine/disp/tu102.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/engine/disp/ga102.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/engine/disp/udisp.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/engine/disp/uconn.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/engine/disp/uoutp.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/clk_mgr/dcn301/vg_clk_mgr.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/clk_mgr/dcn301/dcn301_smu.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/clk_mgr/dcn31/dcn31_smu.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/engine/disp/uhead.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/engine/dma/base.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/clk_mgr/dcn31/dcn31_clk_mgr.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/clk_mgr/dcn314/dcn314_smu.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/clk_mgr/dcn314/dcn314_clk_mgr.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/clk_mgr/dcn315/dcn315_smu.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/engine/dma/nv04.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/clk_mgr/dcn315/dcn315_clk_mgr.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/engine/dma/nv50.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/engine/dma/gf100.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/engine/dma/gf119.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/engine/dma/gv100.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/clk_mgr/dcn316/dcn316_smu.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/clk_mgr/dcn316/dcn316_clk_mgr.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/clk_mgr/dcn32/dcn32_clk_mgr.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/engine/dma/user.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/clk_mgr/dcn32/dcn32_clk_mgr_smu_msg.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/dce/dce_audio.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/engine/dma/usernv04.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/dce/dce_stream_encoder.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/dce/dce_link_encoder.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/engine/dma/usernv50.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/dce/dce_hwseq.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/engine/dma/usergf100.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/dce/dce_mem_input.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/engine/dma/usergf119.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/engine/dma/usergv100.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/engine/fifo/base.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/dce/dce_clock_source.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/dce/dce_scl_filters.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/engine/fifo/cgrp.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/engine/fifo/chan.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/dce/dce_transform.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/engine/fifo/chid.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/dce/dce_opp.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/engine/fifo/runl.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/engine/fifo/runq.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/engine/fifo/nv04.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/engine/fifo/nv10.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/engine/fifo/nv17.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/dce/dce_dmcu.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/dce/dce_abm.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/engine/fifo/nv40.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/dce/dce_ipp.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/dce/dce_aux.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/engine/fifo/nv50.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/dce/dce_i2c.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/dce/dce_i2c_hw.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/dce/dce_i2c_sw.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/dce/dmub_psr.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/engine/fifo/g84.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/dce/dmub_abm.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/dce/dmub_abm_lcd.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/dce/dce_panel_cntl.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/engine/fifo/g98.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/engine/fifo/gf100.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/engine/fifo/gk104.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/dce/dmub_hw_lock_mgr.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/engine/fifo/gk110.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/dce/dmub_outbox.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/gpio/gpio_base.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/engine/fifo/gk208.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/engine/fifo/gk20a.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/engine/fifo/gm107.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/engine/fifo/gm200.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/engine/fifo/gp100.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/engine/fifo/gv100.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/engine/fifo/tu102.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/engine/fifo/ga100.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/engine/fifo/ga102.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/engine/fifo/ucgrp.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/engine/fifo/uchan.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/gpio/gpio_service.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/engine/gr/base.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/engine/gr/nv04.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/gpio/hw_factory.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/gpio/hw_gpio.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/gpio/hw_hpd.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/gpio/hw_ddc.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/engine/gr/nv10.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/gpio/hw_generic.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/gpio/hw_translate.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/gpio/dce60/hw_translate_dce60.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/gpio/dce60/hw_factory_dce60.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/gpio/dce80/hw_translate_dce80.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/gpio/dce80/hw_factory_dce80.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/engine/gr/nv15.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/engine/gr/nv17.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/engine/gr/nv20.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/gpio/dce110/hw_translate_dce110.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/gpio/dce110/hw_factory_dce110.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/gpio/dce120/hw_translate_dce120.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/engine/gr/nv25.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/gpio/dce120/hw_factory_dce120.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/engine/gr/nv2a.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/engine/gr/nv30.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/gpio/dcn10/hw_translate_dcn10.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/engine/gr/nv34.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/gpio/dcn10/hw_factory_dcn10.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/gpio/dcn20/hw_translate_dcn20.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/gpio/dcn20/hw_factory_dcn20.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/engine/gr/nv35.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/gpio/dcn21/hw_translate_dcn21.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/engine/gr/nv40.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/engine/gr/nv44.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/engine/gr/nv50.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/engine/gr/g84.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/engine/gr/gt200.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/engine/gr/mcp79.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/engine/gr/gt215.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/engine/gr/mcp89.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/gpio/dcn21/hw_factory_dcn21.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/gpio/dcn30/hw_translate_dcn30.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/engine/gr/gf100.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/engine/gr/gf104.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/gpio/dcn30/hw_factory_dcn30.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/engine/gr/gf108.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/engine/gr/gf110.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/gpio/dcn315/hw_translate_dcn315.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/engine/gr/gf117.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/engine/gr/gf119.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/gpio/dcn315/hw_factory_dcn315.o
  CC [M]  drivers/gpu/drm/nouveau/nvkm/engine/gr/gk104.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/gpio/dcn32/hw_translate_dcn32.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/gpio/dcn32/hw_factory_dcn32.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/../display/dc/irq/irq_service.o
  CC [M]  drivers/gpu/drm/amd/amdgpu/..



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

* [Intel-xe] ✓ CI.Hooks: success for drm/xe: Add engine scheduler control interface (rev9)
  2023-07-27  8:22 [Intel-xe] [PATCH V9 0/6] drm/xe: Add engine scheduler control interface Tejas Upadhyay
                   ` (9 preceding siblings ...)
  2023-07-27  9:05 ` [Intel-xe] ✓ CI.Build: " Patchwork
@ 2023-07-27  9:05 ` Patchwork
  2023-07-27  9:06 ` [Intel-xe] ✓ CI.checksparse: " Patchwork
  2023-07-27  9:40 ` [Intel-xe] ○ CI.BAT: info " Patchwork
  12 siblings, 0 replies; 30+ messages in thread
From: Patchwork @ 2023-07-27  9:05 UTC (permalink / raw)
  To: Tejas Upadhyay; +Cc: intel-xe

== Series Details ==

Series: drm/xe: Add engine scheduler control interface (rev9)
URL   : https://patchwork.freedesktop.org/series/119392/
State : success

== Summary ==

run-parts: executing /workspace/ci/hooks/00-showenv
/workspace
+ pwd
+ ls -la
total 528
drwxrwxr-x 10 1003 1003   4096 Jul 27 09:05 .
drwxr-xr-x  1 root root   4096 Jul 27 09:05 ..
-rw-rw-r--  1 1003 1003 389743 Jul 27 09:05 build.log
-rw-rw-r--  1 1003 1003   4928 Jul 27 09:00 checkpatch.log
drwxrwxr-x  5 1003 1003   4096 Jul 27 08:58 ci
drwxrwxr-x  9 1003 1003   4096 Jul 27 08:58 docker
drwxrwxr-x  8 1003 1003   4096 Jul 27 08:58 .git
-rw-rw-r--  1 1003 1003    542 Jul 27 08:59 git_apply.log
drwxrwxr-x  3 1003 1003   4096 Jul 27 08:58 .github
-rw-rw-r--  1 1003 1003    233 Jul 27 08:58 .groovylintrc.json
-rw-rw-r--  1 1003 1003     78 Jul 27 09:05 hooks.log
drwxrwxr-x 31 1003 1003   4096 Jul 27 09:04 kernel
-rw-rw-r--  1 1003 1003  50134 Jul 27 08:59 kernel.mbox
-rw-rw-r--  1 1003 1003  26091 Jul 27 09:01 kunit.log
drwxrwxr-x 45 1003 1003   4096 Jul 27 08:58 pipelines
-rw-rw-r--  1 1003 1003    793 Jul 27 08:58 README.adoc
drwxrwxr-x  3 1003 1003   4096 Jul 27 08:58 scripts
drwxrwxr-x  2 1003 1003   4096 Jul 27 08:58 .vscode
+ uname -a
Linux bc9e3de407a4 5.4.0-149-generic #166-Ubuntu SMP Tue Apr 18 16:51:45 UTC 2023 x86_64 x86_64 x86_64 GNU/Linux
+ export
+ grep -Ei '(^|\W)CI_'
declare -x CI_KERNEL_BUILD_DIR="/workspace/kernel/build64"
declare -x CI_KERNEL_IMAGES_DIR="/workspace/kernel/archive/boot"
declare -x CI_KERNEL_MODULES_DIR="/workspace/kernel/archive"
declare -x CI_KERNEL_SRC_DIR="/workspace/kernel"
declare -x CI_SRC_DIR="/workspace/kernel"
declare -x CI_TOOLS_SRC_DIR="/workspace/ci"
declare -x CI_WORKSPACE_DIR="/workspace"
+ '[' -n /workspace ']'
+ git_args='-C /workspace/kernel'
+ git_log_args=
+ git --no-pager -C /workspace/kernel log --format=oneline --abbrev-commit
b57496f27 drm/xe: Add min/max cap for engine scheduler properties
39b6f67a5 drm/xe: Add sysfs for preempt reset timeout
db2968de7 drm/xe: Add timeslice duration engine property to sysfs
ac638a9fe drm/xe: Add job timeout engine property to sysfs
fce2387a4 drm/xe: Add sysfs for default engine scheduler properties
3463737cf drm/xe: Add sysfs entries for engines under its GT
20a2578d3 drm/xe/engine: add missing rpm for bind engines
run-parts: executing /workspace/ci/hooks/10-build-W1
+ SRC_DIR=/workspace/kernel
+ RESTORE_DISPLAY_CONFIG=0
+ '[' -n /workspace/kernel/build64 ']'
+ BUILD_DIR=/workspace/kernel/build64
+ cd /workspace/kernel
+ grep -q -e '^CONFIG_DRM_XE_DISPLAY=[yY]' /workspace/kernel/build64/.config
+ RESTORE_DISPLAY_CONFIG=1
+ trap cleanup EXIT
+ ./scripts/config --file /workspace/kernel/build64/.config --disable CONFIG_DRM_XE_DISPLAY
++ nproc
+ make -j48 O=/workspace/kernel/build64 modules_prepare
make[1]: Entering directory '/workspace/kernel/build64'
  SYNC    include/config/auto.conf.cmd
  GEN     Makefile
  GEN     Makefile
  UPD     include/generated/compile.h
  UPD     include/config/kernel.release
  UPD     include/generated/utsrelease.h
  DESCEND objtool
  CALL    ../scripts/checksyscalls.sh
  HOSTCC  /workspace/kernel/build64/tools/objtool/fixdep.o
  HOSTLD  /workspace/kernel/build64/tools/objtool/fixdep-in.o
  LINK    /workspace/kernel/build64/tools/objtool/fixdep
  INSTALL libsubcmd_headers
  CC      /workspace/kernel/build64/tools/objtool/libsubcmd/exec-cmd.o
  CC      /workspace/kernel/build64/tools/objtool/libsubcmd/help.o
  CC      /workspace/kernel/build64/tools/objtool/libsubcmd/pager.o
  CC      /workspace/kernel/build64/tools/objtool/libsubcmd/parse-options.o
  CC      /workspace/kernel/build64/tools/objtool/libsubcmd/run-command.o
  CC      /workspace/kernel/build64/tools/objtool/libsubcmd/subcmd-config.o
  CC      /workspace/kernel/build64/tools/objtool/libsubcmd/sigchain.o
  LD      /workspace/kernel/build64/tools/objtool/libsubcmd/libsubcmd-in.o
  AR      /workspace/kernel/build64/tools/objtool/libsubcmd/libsubcmd.a
  CC      /workspace/kernel/build64/tools/objtool/weak.o
  CC      /workspace/kernel/build64/tools/objtool/check.o
  CC      /workspace/kernel/build64/tools/objtool/special.o
  CC      /workspace/kernel/build64/tools/objtool/builtin-check.o
  CC      /workspace/kernel/build64/tools/objtool/elf.o
  CC      /workspace/kernel/build64/tools/objtool/objtool.o
  CC      /workspace/kernel/build64/tools/objtool/orc_gen.o
  CC      /workspace/kernel/build64/tools/objtool/orc_dump.o
  CC      /workspace/kernel/build64/tools/objtool/libstring.o
  CC      /workspace/kernel/build64/tools/objtool/libctype.o
  CC      /workspace/kernel/build64/tools/objtool/str_error_r.o
  CC      /workspace/kernel/build64/tools/objtool/librbtree.o
  CC      /workspace/kernel/build64/tools/objtool/arch/x86/special.o
  CC      /workspace/kernel/build64/tools/objtool/arch/x86/decode.o
  LD      /workspace/kernel/build64/tools/objtool/arch/x86/objtool-in.o
  LD      /workspace/kernel/build64/tools/objtool/objtool-in.o
  LINK    /workspace/kernel/build64/tools/objtool/objtool
make[1]: Leaving directory '/workspace/kernel/build64'
++ nproc
+ make -j48 O=/workspace/kernel/build64 M=drivers/gpu/drm/xe W=1
make[1]: Entering directory '/workspace/kernel/build64'
  CC [M]  drivers/gpu/drm/xe/xe_bb.o
  CC [M]  drivers/gpu/drm/xe/xe_bo.o
  CC [M]  drivers/gpu/drm/xe/xe_bo_evict.o
  CC [M]  drivers/gpu/drm/xe/xe_debugfs.o
  CC [M]  drivers/gpu/drm/xe/xe_devcoredump.o
  CC [M]  drivers/gpu/drm/xe/xe_device.o
  CC [M]  drivers/gpu/drm/xe/xe_device_sysfs.o
  CC [M]  drivers/gpu/drm/xe/xe_dma_buf.o
  CC [M]  drivers/gpu/drm/xe/xe_engine.o
  CC [M]  drivers/gpu/drm/xe/xe_hw_engine_class_sysfs.o
  CC [M]  drivers/gpu/drm/xe/xe_exec.o
  CC [M]  drivers/gpu/drm/xe/xe_execlist.o
  CC [M]  drivers/gpu/drm/xe/xe_force_wake.o
  CC [M]  drivers/gpu/drm/xe/xe_ggtt.o
  CC [M]  drivers/gpu/drm/xe/xe_gt.o
  CC [M]  drivers/gpu/drm/xe/xe_gt_clock.o
  CC [M]  drivers/gpu/drm/xe/xe_gt_debugfs.o
  CC [M]  drivers/gpu/drm/xe/xe_gt_idle_sysfs.o
  CC [M]  drivers/gpu/drm/xe/xe_gt_mcr.o
  CC [M]  drivers/gpu/drm/xe/xe_gt_pagefault.o
  CC [M]  drivers/gpu/drm/xe/xe_gt_sysfs.o
  CC [M]  drivers/gpu/drm/xe/xe_gt_tlb_invalidation.o
  CC [M]  drivers/gpu/drm/xe/xe_gt_topology.o
  HOSTCC  drivers/gpu/drm/xe/xe_gen_wa_oob
  CC [M]  drivers/gpu/drm/xe/xe_guc_ads.o
  CC [M]  drivers/gpu/drm/xe/xe_guc_ct.o
  CC [M]  drivers/gpu/drm/xe/xe_guc_debugfs.o
  CC [M]  drivers/gpu/drm/xe/xe_guc_hwconfig.o
  CC [M]  drivers/gpu/drm/xe/xe_guc_log.o
  CC [M]  drivers/gpu/drm/xe/xe_guc_pc.o
  CC [M]  drivers/gpu/drm/xe/xe_guc_submit.o
  CC [M]  drivers/gpu/drm/xe/xe_hw_engine.o
  CC [M]  drivers/gpu/drm/xe/xe_hw_fence.o
  CC [M]  drivers/gpu/drm/xe/xe_huc.o
  CC [M]  drivers/gpu/drm/xe/xe_huc_debugfs.o
  CC [M]  drivers/gpu/drm/xe/xe_irq.o
  CC [M]  drivers/gpu/drm/xe/xe_lrc.o
  CC [M]  drivers/gpu/drm/xe/xe_migrate.o
  CC [M]  drivers/gpu/drm/xe/xe_mmio.o
  CC [M]  drivers/gpu/drm/xe/xe_mocs.o
  CC [M]  drivers/gpu/drm/xe/xe_module.o
  CC [M]  drivers/gpu/drm/xe/xe_pat.o
  CC [M]  drivers/gpu/drm/xe/xe_pci.o
  CC [M]  drivers/gpu/drm/xe/xe_pcode.o
  CC [M]  drivers/gpu/drm/xe/xe_pm.o
  CC [M]  drivers/gpu/drm/xe/xe_preempt_fence.o
  CC [M]  drivers/gpu/drm/xe/xe_pt.o
  CC [M]  drivers/gpu/drm/xe/xe_pt_walk.o
  CC [M]  drivers/gpu/drm/xe/xe_query.o
  CC [M]  drivers/gpu/drm/xe/xe_range_fence.o
  CC [M]  drivers/gpu/drm/xe/xe_reg_sr.o
  CC [M]  drivers/gpu/drm/xe/xe_reg_whitelist.o
  CC [M]  drivers/gpu/drm/xe/xe_rtp.o
  CC [M]  drivers/gpu/drm/xe/xe_sa.o
  CC [M]  drivers/gpu/drm/xe/xe_sched_job.o
  CC [M]  drivers/gpu/drm/xe/xe_step.o
  CC [M]  drivers/gpu/drm/xe/xe_sync.o
  CC [M]  drivers/gpu/drm/xe/xe_tile.o
  CC [M]  drivers/gpu/drm/xe/xe_tile_sysfs.o
  CC [M]  drivers/gpu/drm/xe/xe_trace.o
  CC [M]  drivers/gpu/drm/xe/xe_ttm_sys_mgr.o
  CC [M]  drivers/gpu/drm/xe/xe_ttm_stolen_mgr.o
  CC [M]  drivers/gpu/drm/xe/xe_ttm_vram_mgr.o
  CC [M]  drivers/gpu/drm/xe/xe_tuning.o
  CC [M]  drivers/gpu/drm/xe/xe_uc.o
  CC [M]  drivers/gpu/drm/xe/xe_uc_debugfs.o
  CC [M]  drivers/gpu/drm/xe/xe_uc_fw.o
  CC [M]  drivers/gpu/drm/xe/xe_vm.o
  CC [M]  drivers/gpu/drm/xe/xe_vm_madvise.o
  CC [M]  drivers/gpu/drm/xe/xe_wait_user_fence.o
  CC [M]  drivers/gpu/drm/xe/xe_wopcm.o
  HDRTEST drivers/gpu/drm/xe/abi/guc_klvs_abi.h
  HDRTEST drivers/gpu/drm/xe/abi/guc_actions_slpc_abi.h
  HDRTEST drivers/gpu/drm/xe/abi/guc_errors_abi.h
  CC [M]  drivers/gpu/drm/xe/tests/xe_bo_test.o
  CC [M]  drivers/gpu/drm/xe/tests/xe_dma_buf_test.o
  CC [M]  drivers/gpu/drm/xe/tests/xe_migrate_test.o
  HDRTEST drivers/gpu/drm/xe/abi/guc_communication_mmio_abi.h
  HDRTEST drivers/gpu/drm/xe/abi/guc_actions_abi.h
  CC [M]  drivers/gpu/drm/xe/tests/xe_pci_test.o
  HDRTEST drivers/gpu/drm/xe/abi/guc_communication_ctb_abi.h
  HDRTEST drivers/gpu/drm/xe/abi/guc_messages_abi.h
  HDRTEST drivers/gpu/drm/xe/regs/xe_reg_defs.h
  CC [M]  drivers/gpu/drm/xe/tests/xe_rtp_test.o
  HDRTEST drivers/gpu/drm/xe/regs/xe_guc_regs.h
  HDRTEST drivers/gpu/drm/xe/regs/xe_gt_regs.h
  HDRTEST drivers/gpu/drm/xe/regs/xe_regs.h
  HDRTEST drivers/gpu/drm/xe/regs/xe_gpu_commands.h
  HDRTEST drivers/gpu/drm/xe/regs/xe_lrc_layout.h
  HDRTEST drivers/gpu/drm/xe/regs/xe_engine_regs.h
  CC [M]  drivers/gpu/drm/xe/tests/xe_wa_test.o
  HDRTEST drivers/gpu/drm/xe/tests/xe_test.h
  HDRTEST drivers/gpu/drm/xe/tests/xe_pci_test.h
  HDRTEST drivers/gpu/drm/xe/tests/xe_migrate_test.h
  HDRTEST drivers/gpu/drm/xe/tests/xe_dma_buf_test.h
  HDRTEST drivers/gpu/drm/xe/tests/xe_bo_test.h
  HDRTEST drivers/gpu/drm/xe/xe_bb.h
  HDRTEST drivers/gpu/drm/xe/xe_bb_types.h
  HDRTEST drivers/gpu/drm/xe/xe_bo.h
  HDRTEST drivers/gpu/drm/xe/xe_bo_doc.h
  HDRTEST drivers/gpu/drm/xe/xe_bo_evict.h
  HDRTEST drivers/gpu/drm/xe/xe_bo_types.h
  HDRTEST drivers/gpu/drm/xe/xe_debugfs.h
  HDRTEST drivers/gpu/drm/xe/xe_devcoredump.h
  HDRTEST drivers/gpu/drm/xe/xe_devcoredump_types.h
  HDRTEST drivers/gpu/drm/xe/xe_device_sysfs.h
  HDRTEST drivers/gpu/drm/xe/xe_device.h
  HDRTEST drivers/gpu/drm/xe/xe_device_types.h
  HDRTEST drivers/gpu/drm/xe/xe_dma_buf.h
  HDRTEST drivers/gpu/drm/xe/xe_drv.h
  HDRTEST drivers/gpu/drm/xe/xe_engine.h
  HDRTEST drivers/gpu/drm/xe/xe_engine_types.h
  HDRTEST drivers/gpu/drm/xe/xe_exec.h
  HDRTEST drivers/gpu/drm/xe/xe_execlist.h
  HDRTEST drivers/gpu/drm/xe/xe_execlist_types.h
  HDRTEST drivers/gpu/drm/xe/xe_force_wake.h
  HDRTEST drivers/gpu/drm/xe/xe_force_wake_types.h
  HDRTEST drivers/gpu/drm/xe/xe_ggtt.h
  HDRTEST drivers/gpu/drm/xe/xe_ggtt_types.h
  HDRTEST drivers/gpu/drm/xe/xe_gt.h
  HDRTEST drivers/gpu/drm/xe/xe_gt_clock.h
  HDRTEST drivers/gpu/drm/xe/xe_gt_debugfs.h
  HDRTEST drivers/gpu/drm/xe/xe_gt_idle_sysfs.h
  HDRTEST drivers/gpu/drm/xe/xe_gt_idle_sysfs_types.h
  HDRTEST drivers/gpu/drm/xe/xe_gt_mcr.h
  HDRTEST drivers/gpu/drm/xe/xe_gt_pagefault.h
  HDRTEST drivers/gpu/drm/xe/xe_gt_printk.h
  HDRTEST drivers/gpu/drm/xe/xe_gt_sysfs.h
  HDRTEST drivers/gpu/drm/xe/xe_gt_sysfs_types.h
  HDRTEST drivers/gpu/drm/xe/xe_gt_tlb_invalidation.h
  HDRTEST drivers/gpu/drm/xe/xe_gt_tlb_invalidation_types.h
  HDRTEST drivers/gpu/drm/xe/xe_gt_topology.h
  HDRTEST drivers/gpu/drm/xe/xe_gt_types.h
  HDRTEST drivers/gpu/drm/xe/xe_guc.h
  HDRTEST drivers/gpu/drm/xe/xe_guc_ads.h
  HDRTEST drivers/gpu/drm/xe/xe_guc_ads_types.h
  HDRTEST drivers/gpu/drm/xe/xe_guc_ct.h
  HDRTEST drivers/gpu/drm/xe/xe_guc_ct_types.h
  HDRTEST drivers/gpu/drm/xe/xe_guc_debugfs.h
  HDRTEST drivers/gpu/drm/xe/xe_guc_engine_types.h
  HDRTEST drivers/gpu/drm/xe/xe_guc_fwif.h
  HDRTEST drivers/gpu/drm/xe/xe_guc_hwconfig.h
  HDRTEST drivers/gpu/drm/xe/xe_guc_log.h
  HDRTEST drivers/gpu/drm/xe/xe_guc_log_types.h
  HDRTEST drivers/gpu/drm/xe/xe_guc_pc_types.h
  HDRTEST drivers/gpu/drm/xe/xe_guc_pc.h
  HDRTEST drivers/gpu/drm/xe/xe_guc_submit.h
  HDRTEST drivers/gpu/drm/xe/xe_guc_submit_types.h
  HDRTEST drivers/gpu/drm/xe/xe_guc_types.h
  HDRTEST drivers/gpu/drm/xe/xe_huc.h
  HDRTEST drivers/gpu/drm/xe/xe_huc_debugfs.h
  HDRTEST drivers/gpu/drm/xe/xe_huc_types.h
  HDRTEST drivers/gpu/drm/xe/xe_hw_engine.h
  HDRTEST drivers/gpu/drm/xe/xe_hw_engine_class_sysfs.h
  HDRTEST drivers/gpu/drm/xe/xe_hw_engine_types.h
  HDRTEST drivers/gpu/drm/xe/xe_hw_fence.h
  HDRTEST drivers/gpu/drm/xe/xe_hw_fence_types.h
  HDRTEST drivers/gpu/drm/xe/xe_irq.h
  HDRTEST drivers/gpu/drm/xe/xe_lrc.h
  HDRTEST drivers/gpu/drm/xe/xe_macros.h
  HDRTEST drivers/gpu/drm/xe/xe_lrc_types.h
  HDRTEST drivers/gpu/drm/xe/xe_map.h
  HDRTEST drivers/gpu/drm/xe/xe_migrate.h
  HDRTEST drivers/gpu/drm/xe/xe_migrate_doc.h
  HDRTEST drivers/gpu/drm/xe/xe_mmio.h
  HDRTEST drivers/gpu/drm/xe/xe_mocs.h
  HDRTEST drivers/gpu/drm/xe/xe_module.h
  HDRTEST drivers/gpu/drm/xe/xe_pat.h
  HDRTEST drivers/gpu/drm/xe/xe_pci.h
  HDRTEST drivers/gpu/drm/xe/xe_pci_types.h
  HDRTEST drivers/gpu/drm/xe/xe_pcode.h
  HDRTEST drivers/gpu/drm/xe/xe_pcode_api.h
  HDRTEST drivers/gpu/drm/xe/xe_platform_types.h
  HDRTEST drivers/gpu/drm/xe/xe_pm.h
  HDRTEST drivers/gpu/drm/xe/xe_preempt_fence.h
  HDRTEST drivers/gpu/drm/xe/xe_preempt_fence_types.h
  HDRTEST drivers/gpu/drm/xe/xe_pt.h
  HDRTEST drivers/gpu/drm/xe/xe_pt_types.h
  HDRTEST drivers/gpu/drm/xe/xe_pt_walk.h
  HDRTEST drivers/gpu/drm/xe/xe_query.h
  HDRTEST drivers/gpu/drm/xe/xe_range_fence.h
  HDRTEST drivers/gpu/drm/xe/xe_reg_sr.h
  HDRTEST drivers/gpu/drm/xe/xe_reg_sr_types.h
  HDRTEST drivers/gpu/drm/xe/xe_reg_whitelist.h
  HDRTEST drivers/gpu/drm/xe/xe_res_cursor.h
  HDRTEST drivers/gpu/drm/xe/xe_ring_ops.h
  HDRTEST drivers/gpu/drm/xe/xe_ring_ops_types.h
  HDRTEST drivers/gpu/drm/xe/xe_rtp.h
  HDRTEST drivers/gpu/drm/xe/xe_rtp_types.h
  HDRTEST drivers/gpu/drm/xe/xe_sa.h
  HDRTEST drivers/gpu/drm/xe/xe_sa_types.h
  HDRTEST drivers/gpu/drm/xe/xe_sched_job.h
  HDRTEST drivers/gpu/drm/xe/xe_sched_job_types.h
  HDRTEST drivers/gpu/drm/xe/xe_step.h
  HDRTEST drivers/gpu/drm/xe/xe_step_types.h
  HDRTEST drivers/gpu/drm/xe/xe_sync.h
  HDRTEST drivers/gpu/drm/xe/xe_sync_types.h
  HDRTEST drivers/gpu/drm/xe/xe_tile.h
  HDRTEST drivers/gpu/drm/xe/xe_tile_sysfs.h
  HDRTEST drivers/gpu/drm/xe/xe_tile_sysfs_types.h
  HDRTEST drivers/gpu/drm/xe/xe_trace.h
  HDRTEST drivers/gpu/drm/xe/xe_ttm_stolen_mgr.h
  HDRTEST drivers/gpu/drm/xe/xe_ttm_sys_mgr.h
  HDRTEST drivers/gpu/drm/xe/xe_ttm_vram_mgr.h
  HDRTEST drivers/gpu/drm/xe/xe_ttm_vram_mgr_types.h
  HDRTEST drivers/gpu/drm/xe/xe_tuning.h
  HDRTEST drivers/gpu/drm/xe/xe_uc.h
  HDRTEST drivers/gpu/drm/xe/xe_uc_debugfs.h
  HDRTEST drivers/gpu/drm/xe/xe_uc_fw.h
  HDRTEST drivers/gpu/drm/xe/xe_uc_fw_abi.h
  HDRTEST drivers/gpu/drm/xe/xe_uc_fw_types.h
  HDRTEST drivers/gpu/drm/xe/xe_uc_types.h
  HDRTEST drivers/gpu/drm/xe/xe_vm.h
  HDRTEST drivers/gpu/drm/xe/xe_vm_doc.h
  HDRTEST drivers/gpu/drm/xe/xe_vm_madvise.h
  HDRTEST drivers/gpu/drm/xe/xe_vm_types.h
  HDRTEST drivers/gpu/drm/xe/xe_wa.h
  HDRTEST drivers/gpu/drm/xe/xe_wait_user_fence.h
  HDRTEST drivers/gpu/drm/xe/xe_wopcm.h
  HDRTEST drivers/gpu/drm/xe/xe_wopcm_types.h
  GEN     xe_wa_oob.c xe_wa_oob.h
  GEN     xe_wa_oob.c xe_wa_oob.h
  CC [M]  drivers/gpu/drm/xe/xe_guc.o
  CC [M]  drivers/gpu/drm/xe/xe_ring_ops.o
  CC [M]  drivers/gpu/drm/xe/xe_wa.o
  LD [M]  drivers/gpu/drm/xe/xe.o
  MODPOST drivers/gpu/drm/xe/Module.symvers
  CC [M]  drivers/gpu/drm/xe/xe.mod.o
  CC [M]  drivers/gpu/drm/xe/tests/xe_bo_test.mod.o
  CC [M]  drivers/gpu/drm/xe/tests/xe_dma_buf_test.mod.o
  CC [M]  drivers/gpu/drm/xe/tests/xe_migrate_test.mod.o
  CC [M]  drivers/gpu/drm/xe/tests/xe_pci_test.mod.o
  CC [M]  drivers/gpu/drm/xe/tests/xe_rtp_test.mod.o
  CC [M]  drivers/gpu/drm/xe/tests/xe_wa_test.mod.o
  LD [M]  drivers/gpu/drm/xe/tests/xe_wa_test.ko
  LD [M]  drivers/gpu/drm/xe/tests/xe_migrate_test.ko
  LD [M]  drivers/gpu/drm/xe/xe.ko
  LD [M]  drivers/gpu/drm/xe/tests/xe_dma_buf_test.ko
  LD [M]  drivers/gpu/drm/xe/tests/xe_bo_test.ko
  LD [M]  drivers/gpu/drm/xe/tests/xe_rtp_test.ko
  LD [M]  drivers/gpu/drm/xe/tests/xe_pci_test.ko
make[1]: Leaving directory '/workspace/kernel/build64'
+ cleanup
+ '[' 1 -eq 1 ']'
+ ./scripts/config --file /workspace/kernel/build64/.config --enable CONFIG_DRM_XE_DISPLAY
run-parts: executing /workspace/ci/hooks/20-kernel-doc
+ SRC_DIR=/workspace/kernel
+ cd /workspace/kernel
+ find drivers/gpu/drm/xe/ -name '*.[ch]' -not -path 'drivers/gpu/drm/xe/display/*'
+ xargs ./scripts/kernel-doc -Werror -none include/uapi/drm/xe_drm.h
All hooks done



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

* [Intel-xe] ✓ CI.checksparse: success for drm/xe: Add engine scheduler control interface (rev9)
  2023-07-27  8:22 [Intel-xe] [PATCH V9 0/6] drm/xe: Add engine scheduler control interface Tejas Upadhyay
                   ` (10 preceding siblings ...)
  2023-07-27  9:05 ` [Intel-xe] ✓ CI.Hooks: " Patchwork
@ 2023-07-27  9:06 ` Patchwork
  2023-07-27  9:40 ` [Intel-xe] ○ CI.BAT: info " Patchwork
  12 siblings, 0 replies; 30+ messages in thread
From: Patchwork @ 2023-07-27  9:06 UTC (permalink / raw)
  To: Tejas Upadhyay; +Cc: intel-xe

== Series Details ==

Series: drm/xe: Add engine scheduler control interface (rev9)
URL   : https://patchwork.freedesktop.org/series/119392/
State : success

== Summary ==

+ trap cleanup EXIT
+ KERNEL=/kernel
+ MT=/root/linux/maintainer-tools
+ git clone https://gitlab.freedesktop.org/drm/maintainer-tools /root/linux/maintainer-tools
Cloning into '/root/linux/maintainer-tools'...
warning: redirecting to https://gitlab.freedesktop.org/drm/maintainer-tools.git/
+ make -C /root/linux/maintainer-tools
make: Entering directory '/root/linux/maintainer-tools'
cc -O2 -g -Wextra -o remap-log remap-log.c
make: Leaving directory '/root/linux/maintainer-tools'
+ cd /kernel
+ git config --global --add safe.directory /kernel
+ /root/linux/maintainer-tools/dim sparse --fast 20a2578d3a889f6e1dd4a6514924661557c2f9f6
Sparse version: 0.6.1 (Ubuntu: 0.6.1-2build1)
Fast mode used, each commit won't be checked separately.
Okay!

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



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

* [Intel-xe] ○ CI.BAT: info for drm/xe: Add engine scheduler control interface (rev9)
  2023-07-27  8:22 [Intel-xe] [PATCH V9 0/6] drm/xe: Add engine scheduler control interface Tejas Upadhyay
                   ` (11 preceding siblings ...)
  2023-07-27  9:06 ` [Intel-xe] ✓ CI.checksparse: " Patchwork
@ 2023-07-27  9:40 ` Patchwork
  12 siblings, 0 replies; 30+ messages in thread
From: Patchwork @ 2023-07-27  9:40 UTC (permalink / raw)
  To: Tejas Upadhyay; +Cc: intel-xe

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

== Series Details ==

Series: drm/xe: Add engine scheduler control interface (rev9)
URL   : https://patchwork.freedesktop.org/series/119392/
State : info

== Summary ==

Participating hosts:
bat-pvc-2
bat-atsm-2
bat-dg2-oem2
bat-adlp-7
Missing hosts results[0]:
Results: [xe-pw-119392v9](https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-119392v9/index.html)



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

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

* Re: [Intel-xe] [PATCH V9 1/6] drm/xe: Add sysfs entries for engines under its GT
  2023-07-27  8:22 ` [Intel-xe] [PATCH V9 1/6] drm/xe: Add sysfs entries for engines under its GT Tejas Upadhyay
@ 2023-07-27 14:41   ` Matthew Brost
  2023-07-28 13:22     ` Upadhyay, Tejas
  0 siblings, 1 reply; 30+ messages in thread
From: Matthew Brost @ 2023-07-27 14:41 UTC (permalink / raw)
  To: Tejas Upadhyay; +Cc: intel-xe

On Thu, Jul 27, 2023 at 01:52:30PM +0530, Tejas Upadhyay wrote:
> Add engines sysfs directory under its GT and
> create sub directory for all engine class
> (note its not per instance) present on GT.
> 
> For example,
> DUT# cat /sys/class/drm/cardX/device/tileN/gtN/engines/
> bcs/ ccs/
> 
> V5 :
>    - replace xe_engine with xe_hw_engine - Matt
> V4 :
>    - Rebase to resolve conflicts - CI
> V3 :
>    - Move code in its own file
>    - Rename API name
> V2 :
>    - Correct class mask logic - Himal
>    - Remove extra parenthesis
> 

A couple nits, otherwise LGTM. 

> Signed-off-by: Tejas Upadhyay <tejas.upadhyay@intel.com>
> ---
>  drivers/gpu/drm/xe/Makefile                   |   1 +
>  drivers/gpu/drm/xe/xe_gt.c                    |   7 ++
>  drivers/gpu/drm/xe/xe_hw_engine_class_sysfs.c | 111 ++++++++++++++++++
>  drivers/gpu/drm/xe/xe_hw_engine_class_sysfs.h |  13 ++
>  4 files changed, 132 insertions(+)
>  create mode 100644 drivers/gpu/drm/xe/xe_hw_engine_class_sysfs.c
>  create mode 100644 drivers/gpu/drm/xe/xe_hw_engine_class_sysfs.h
> 
> diff --git a/drivers/gpu/drm/xe/Makefile b/drivers/gpu/drm/xe/Makefile
> index 4ea9e3150c20..a3099a4fd56b 100644
> --- a/drivers/gpu/drm/xe/Makefile
> +++ b/drivers/gpu/drm/xe/Makefile
> @@ -52,6 +52,7 @@ xe-y += xe_bb.o \
>  	xe_device_sysfs.o \
>  	xe_dma_buf.o \
>  	xe_engine.o \
> +	xe_hw_engine_class_sysfs.o \

This is out of place alphabetically.

>  	xe_exec.o \
>  	xe_execlist.o \
>  	xe_force_wake.o \
> diff --git a/drivers/gpu/drm/xe/xe_gt.c b/drivers/gpu/drm/xe/xe_gt.c
> index 3e32d38aeeea..d52eb45896a7 100644
> --- a/drivers/gpu/drm/xe/xe_gt.c
> +++ b/drivers/gpu/drm/xe/xe_gt.c
> @@ -27,6 +27,7 @@
>  #include "xe_gt_topology.h"
>  #include "xe_guc_engine_types.h"
>  #include "xe_hw_fence.h"
> +#include "xe_hw_engine_class_sysfs.h"
>  #include "xe_irq.h"
>  #include "xe_lrc.h"
>  #include "xe_map.h"
> @@ -322,6 +323,12 @@ static int gt_fw_domain_init(struct xe_gt *gt)
>  	if (err)
>  		goto err_force_wake;
>  
> +	err = xe_hw_engine_class_sysfs_init(gt);
> +	if (err)
> +		drm_warn(&gt_to_xe(gt)->drm,
> +			 "failed to register engines sysfs directory, err: %d\n",
> +			 err);
> +
>  	err = xe_force_wake_put(gt_to_fw(gt), XE_FW_GT);
>  	XE_WARN_ON(err);
>  	xe_device_mem_access_put(gt_to_xe(gt));
> diff --git a/drivers/gpu/drm/xe/xe_hw_engine_class_sysfs.c b/drivers/gpu/drm/xe/xe_hw_engine_class_sysfs.c
> new file mode 100644
> index 000000000000..c2f092b54af1
> --- /dev/null
> +++ b/drivers/gpu/drm/xe/xe_hw_engine_class_sysfs.c
> @@ -0,0 +1,111 @@
> +// SPDX-License-Identifier: MIT
> +/*
> + * Copyright © 2023 Intel Corporation
> + */
> +
> +#include <drm/drm_managed.h>
> +#include <linux/kobject.h>
> +#include <linux/sysfs.h>
> +
> +#include "xe_hw_engine_class_sysfs.h"
> +
> +static void kobj_xe_hw_engine_release(struct kobject *kobj)
> +{
> +	kfree(kobj);
> +}
> +
> +static const struct kobj_type kobj_xe_hw_engine_type = {
> +	.release = kobj_xe_hw_engine_release,
> +	.sysfs_ops = &kobj_sysfs_ops
> +};
> +
> +static struct kobject *
> +kobj_xe_hw_engine(struct kobject *parent, char *name)
> +{
> +	struct kobject *kobj;
> +
> +	kobj = kzalloc(sizeof(*kobj), GFP_KERNEL);
> +	if (!kobj)
> +		return NULL;
> +
> +	kobject_init(kobj, &kobj_xe_hw_engine_type);
> +	if (kobject_add(kobj, parent, "%s", name)) {
> +		kobject_put(kobj);
> +		return NULL;
> +	}
> +
> +	return kobj;
> +}
> +
> +static void xe_hw_engine_sysfs_kobj_release(struct kobject *kobj)
> +{
> +	kfree(kobj);
> +}
> +
> +static const struct kobj_type xe_hw_engine_sysfs_kobj_type = {
> +	.release = xe_hw_engine_sysfs_kobj_release,
> +	.sysfs_ops = &kobj_sysfs_ops,
> +};
> +

We should have kernel doc for all non-static functions, this a WIP
across the driver but since this is new code I think we should include
kernel doc for this function.

> +int xe_hw_engine_class_sysfs_init(struct xe_gt *gt)
> +{
> +	struct xe_hw_engine *hwe;
> +	enum xe_hw_engine_id id;
> +	struct kobject *kobj;
> +	u16 class_mask = 0;
> +	int err = 0;
> +
> +	kobj = kzalloc(sizeof(*kobj), GFP_KERNEL);
> +	if (!kobj)
> +		return -ENOMEM;
> +
> +	kobject_init(kobj, &xe_hw_engine_sysfs_kobj_type);
> +
> +	err = kobject_add(kobj, gt->sysfs, "engines");
> +	if (err) {
> +		kobject_put(kobj);
> +		return err;
> +	}
> +
> +	for_each_hw_engine(hwe, gt, id) {
> +		char name[MAX_ENGINE_CLASS_NAME_LEN];
> +		struct kobject *khwe;
> +
> +		if (hwe->class == XE_ENGINE_CLASS_OTHER ||
> +		    hwe->class == XE_ENGINE_CLASS_MAX)
> +			continue;
> +
> +		if ((class_mask >> hwe->class) & 1)
> +			continue;
> +
> +		class_mask |= 1 << hwe->class;
> +
> +		switch (hwe->class) {
> +		case XE_ENGINE_CLASS_RENDER:
> +			strcpy(name, "rcs");
> +			break;
> +		case XE_ENGINE_CLASS_VIDEO_DECODE:
> +			strcpy(name, "vcs");
> +			break;
> +		case XE_ENGINE_CLASS_VIDEO_ENHANCE:
> +			strcpy(name, "vecs");
> +			break;
> +		case XE_ENGINE_CLASS_COPY:
> +			strcpy(name, "bcs");
> +			break;
> +		case XE_ENGINE_CLASS_COMPUTE:
> +			strcpy(name, "ccs");
> +			break;
> +		default:
> +			kobject_put(kobj);
> +			return -EINVAL;
> +		}
> +
> +		khwe = kobj_xe_hw_engine(kobj, name);
> +		if (!khwe) {
> +			kobject_put(kobj);
> +			return -EINVAL;
> +		}
> +	}
> +	return err;
> +}
> diff --git a/drivers/gpu/drm/xe/xe_hw_engine_class_sysfs.h b/drivers/gpu/drm/xe/xe_hw_engine_class_sysfs.h
> new file mode 100644
> index 000000000000..c461fac717c2
> --- /dev/null
> +++ b/drivers/gpu/drm/xe/xe_hw_engine_class_sysfs.h
> @@ -0,0 +1,13 @@
> +/* SPDX-License-Identifier: MIT */
> +/*
> + * Copyright © 2023 Intel Corporation
> + */
> +
> +#ifndef _XE_ENGINE_CLASS_SYSFS_H_
> +#define _XE_ENGINE_CLASS_SYSFS_H__
> +
> +#include "xe_gt.h"

No need to include this, just forward declare struct xe_gt.

> +
> +#define MAX_ENGINE_CLASS_NAME_LEN    16

This doesn't need to be in the header, just define in the .c file.

> +int xe_hw_engine_class_sysfs_init(struct xe_gt *gt);

Add a newline here.

Matt

> +#endif
> -- 
> 2.25.1
> 

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

* Re: [Intel-xe] [PATCH V9 2/6] drm/xe: Add sysfs for default engine scheduler properties
  2023-07-27  8:22 ` [Intel-xe] [PATCH V9 2/6] drm/xe: Add sysfs for default engine scheduler properties Tejas Upadhyay
@ 2023-07-27 14:47   ` Matthew Brost
  0 siblings, 0 replies; 30+ messages in thread
From: Matthew Brost @ 2023-07-27 14:47 UTC (permalink / raw)
  To: Tejas Upadhyay; +Cc: intel-xe

On Thu, Jul 27, 2023 at 01:52:31PM +0530, Tejas Upadhyay wrote:
> For each HW engine under GT we are adding defaults sysfs
> entry to list all engine scheduler properties and its
> default values. So that it will be easier for user to
> fetch default values of these properties anytime to go
> back to default.
> 
> For example,
> DUT# cat /sys/class/drm/card1/device/tileN/gtN/engines/bcs/.defaults/
> job_timeout_ms         preempt_timeout_us     timeslice_duration_us
> 
> where,
> @job_timeout_ms: The time after which a job is removed from the scheduler.
> @preempt_timeout_us: How long to wait (in microseconds) for a preemption
>                      event to occur when submitting a new context.
> @timeslice_duration_us: Each context is scheduled for execution for the
>                         timeslice duration, before switching to the next
>                         context.
> 
> V8 :
>    - replace xe_engine with xe_hw_engine - Matt
> V7 :
>    - Push all errors to one error path at every places - Niranjana
>    - Describe struct member to resolve kernel doc err - CI hooks
> V6 :
>    - Use engine class interface instead of hw engine
>      in sysfs for better interfacing readability - Niranjana
> V5 :
>    - Scheduling props should apply per class engine not per hardware engine - Matt
>    - Do not record value of job_timeout_ms if changed based on dma_fence - Matt
> V4 :
>    - Resolve merge conflicts - CI
> V3 :
>    - Rearrange code in its own file
>    - Rebase
>    - Update commit message to reflect tile addition
> V2 :
>    - Use sysfs_create_files in this patch - Niranjana
>    - Handle prototype error for xe_add_engine_defaults - CI hooks
>    - Remove unused member sysfs_hwe - Niranjana
> 

One NIT below, with that fixed:
Reviewed-by: Matthew Brost <matthew.brost@intel.com>

> Signed-off-by: Tejas Upadhyay <tejas.upadhyay@intel.com>
> ---
>  drivers/gpu/drm/xe/xe_engine.c                |   6 +-
>  drivers/gpu/drm/xe/xe_gt_types.h              |   3 +
>  drivers/gpu/drm/xe/xe_guc_submit.c            |   3 +-
>  drivers/gpu/drm/xe/xe_hw_engine.c             |   9 ++
>  drivers/gpu/drm/xe/xe_hw_engine_class_sysfs.c | 118 +++++++++++++++---
>  drivers/gpu/drm/xe/xe_hw_engine_class_sysfs.h |  20 +++
>  drivers/gpu/drm/xe/xe_hw_engine_types.h       |  37 ++++++
>  7 files changed, 173 insertions(+), 23 deletions(-)
> 
> diff --git a/drivers/gpu/drm/xe/xe_engine.c b/drivers/gpu/drm/xe/xe_engine.c
> index 0102dad16e29..9e167b113963 100644
> --- a/drivers/gpu/drm/xe/xe_engine.c
> +++ b/drivers/gpu/drm/xe/xe_engine.c
> @@ -53,9 +53,9 @@ static struct xe_engine *__xe_engine_create(struct xe_device *xe,
>  	INIT_LIST_HEAD(&e->compute.link);
>  	INIT_LIST_HEAD(&e->multi_gt_link);
>  
> -	/* FIXME: Wire up to configurable default value */
> -	e->sched_props.timeslice_us = 1 * 1000;
> -	e->sched_props.preempt_timeout_us = 640 * 1000;
> +	e->sched_props.timeslice_us = hwe->eclass->sched_props.timeslice_us;
> +	e->sched_props.preempt_timeout_us =
> +				hwe->eclass->sched_props.preempt_timeout_us;
>  
>  	if (xe_engine_is_parallel(e)) {
>  		e->parallel.composite_fence_ctx = dma_fence_context_alloc(1);
> diff --git a/drivers/gpu/drm/xe/xe_gt_types.h b/drivers/gpu/drm/xe/xe_gt_types.h
> index 78a9fe9f0bd3..d70460feeb96 100644
> --- a/drivers/gpu/drm/xe/xe_gt_types.h
> +++ b/drivers/gpu/drm/xe/xe_gt_types.h
> @@ -286,6 +286,9 @@ struct xe_gt {
>  	/** @hw_engines: hardware engines on the GT */
>  	struct xe_hw_engine hw_engines[XE_NUM_HW_ENGINES];
>  
> +	/** @eclass: per hardware engine class interface on the GT */
> +	struct xe_hw_engine_class_intf  eclass[XE_ENGINE_CLASS_MAX];
> +
>  	/** @pcode: GT's PCODE */
>  	struct {
>  		/** @lock: protecting GT's PCODE mailbox data */
> diff --git a/drivers/gpu/drm/xe/xe_guc_submit.c b/drivers/gpu/drm/xe/xe_guc_submit.c
> index 911d4965c27c..7978f7efd702 100644
> --- a/drivers/gpu/drm/xe/xe_guc_submit.c
> +++ b/drivers/gpu/drm/xe/xe_guc_submit.c
> @@ -1128,7 +1128,8 @@ static int guc_engine_init(struct xe_engine *e)
>  	ge->engine = e;
>  	init_waitqueue_head(&ge->suspend_wait);
>  
> -	timeout = xe_vm_no_dma_fences(e->vm) ? MAX_SCHEDULE_TIMEOUT : HZ * 5;
> +	timeout = xe_vm_no_dma_fences(e->vm) ? MAX_SCHEDULE_TIMEOUT :
> +		  e->hwe->eclass->sched_props.job_timeout_ms;
>  	err = drm_sched_init(&ge->sched, &drm_sched_ops, NULL,
>  			     e->lrc[0].ring.size / MAX_JOB_SIZE_BYTES,
>  			     64, timeout, guc_to_gt(guc)->ordered_wq, NULL,
> diff --git a/drivers/gpu/drm/xe/xe_hw_engine.c b/drivers/gpu/drm/xe/xe_hw_engine.c
> index 1af5cccd1142..afa7d25c3852 100644
> --- a/drivers/gpu/drm/xe/xe_hw_engine.c
> +++ b/drivers/gpu/drm/xe/xe_hw_engine.c
> @@ -362,6 +362,15 @@ static void hw_engine_init_early(struct xe_gt *gt, struct xe_hw_engine *hwe,
>  	hwe->fence_irq = &gt->fence_irq[info->class];
>  	hwe->engine_id = id;
>  
> +	if (!gt->eclass[hwe->class].sched_props.job_timeout_ms) {
> +		gt->eclass[hwe->class].sched_props.job_timeout_ms = HZ * 5;

This is ms value, HZ is jiffies. 5 * 1000 makes more sense then.

> +		gt->eclass[hwe->class].sched_props.timeslice_us = 1 * 1000;
> +		gt->eclass[hwe->class].sched_props.preempt_timeout_us = 640 * 1000;
> +		/* Record default props */
> +		gt->eclass[hwe->class].defaults = gt->eclass[hwe->class].sched_props;
> +	}
> +	hwe->eclass = &gt->eclass[hwe->class];
> +
>  	xe_reg_sr_init(&hwe->reg_sr, hwe->name, gt_to_xe(gt));
>  	xe_wa_process_engine(hwe);
>  	hw_engine_setup_default_state(hwe);
> diff --git a/drivers/gpu/drm/xe/xe_hw_engine_class_sysfs.c b/drivers/gpu/drm/xe/xe_hw_engine_class_sysfs.c
> index c2f092b54af1..15c2b0b9f1fd 100644
> --- a/drivers/gpu/drm/xe/xe_hw_engine_class_sysfs.c
> +++ b/drivers/gpu/drm/xe/xe_hw_engine_class_sysfs.c
> @@ -9,6 +9,8 @@
>  
>  #include "xe_hw_engine_class_sysfs.h"
>  
> +static int xe_add_hw_engine_class_defaults(struct kobject *parent);
> +
>  static void kobj_xe_hw_engine_release(struct kobject *kobj)
>  {
>  	kfree(kobj);
> @@ -19,22 +21,88 @@ static const struct kobj_type kobj_xe_hw_engine_type = {
>  	.sysfs_ops = &kobj_sysfs_ops
>  };
>  
> -static struct kobject *
> -kobj_xe_hw_engine(struct kobject *parent, char *name)
> +static struct kobj_eclass *
> +kobj_xe_hw_engine_class(struct kobject *parent, char *name)
> +{
> +	struct kobj_eclass *keclass;
> +
> +	keclass = kzalloc(sizeof(*keclass), GFP_KERNEL);
> +	if (!keclass)
> +		return NULL;
> +
> +	kobject_init(&keclass->base, &kobj_xe_hw_engine_type);
> +	if (kobject_add(&keclass->base, parent, "%s", name)) {
> +		kobject_put(&keclass->base);
> +		return NULL;
> +	}
> +
> +	return keclass;
> +}
> +
> +static ssize_t job_timeout_default(struct kobject *kobj,
> +				   struct kobj_attribute *attr, char *buf)
> +{
> +	struct xe_hw_engine_class_intf *eclass = kobj_to_eclass(kobj->parent);
> +
> +	return sprintf(buf, "%u\n", eclass->defaults.job_timeout_ms);
> +}
> +
> +static struct kobj_attribute job_timeout_def =
> +__ATTR(job_timeout_ms, 0444, job_timeout_default, NULL);
> +
> +static ssize_t timeslice_default(struct kobject *kobj,
> +				 struct kobj_attribute *attr, char *buf)
> +{
> +	struct xe_hw_engine_class_intf *eclass = kobj_to_eclass(kobj->parent);
> +
> +	return sprintf(buf, "%u\n", eclass->defaults.timeslice_us);
> +}
> +
> +static struct kobj_attribute timeslice_duration_def =
> +__ATTR(timeslice_duration_us, 0444, timeslice_default, NULL);
> +
> +static ssize_t preempt_timeout_default(struct kobject *kobj,
> +				       struct kobj_attribute *attr,
> +				       char *buf)
> +{
> +	struct xe_hw_engine_class_intf *eclass = kobj_to_eclass(kobj->parent);
> +
> +	return sprintf(buf, "%u\n", eclass->defaults.preempt_timeout_us);
> +}
> +
> +static struct kobj_attribute preempt_timeout_def =
> +__ATTR(preempt_timeout_us, 0444, preempt_timeout_default, NULL);
> +
> +static const struct attribute *defaults[] = {
> +	&job_timeout_def.attr,
> +	&timeslice_duration_def.attr,
> +	&preempt_timeout_def.attr,
> +	NULL
> +};
> +
> +static int xe_add_hw_engine_class_defaults(struct kobject *parent)
>  {
>  	struct kobject *kobj;
> +	int err = 0;
>  
>  	kobj = kzalloc(sizeof(*kobj), GFP_KERNEL);
>  	if (!kobj)
> -		return NULL;
> +		return -ENOMEM;
>  
>  	kobject_init(kobj, &kobj_xe_hw_engine_type);
> -	if (kobject_add(kobj, parent, "%s", name)) {
> -		kobject_put(kobj);
> -		return NULL;
> -	}
>  
> -	return kobj;
> +	err = kobject_add(kobj, parent, "%s", ".defaults");
> +	if (err)
> +		goto err_object;
> +
> +	err = sysfs_create_files(kobj, defaults);
> +	if (err)
> +		goto err_object;
> +
> +	return err;
> +err_object:
> +	kobject_put(kobj);
> +	return err;
>  }
>  
>  static void xe_hw_engine_sysfs_kobj_release(struct kobject *kobj)
> @@ -62,14 +130,12 @@ int xe_hw_engine_class_sysfs_init(struct xe_gt *gt)
>  	kobject_init(kobj, &xe_hw_engine_sysfs_kobj_type);
>  
>  	err = kobject_add(kobj, gt->sysfs, "engines");
> -	if (err) {
> -		kobject_put(kobj);
> -		return err;
> -	}
> +	if (err)
> +		goto err_object;
>  
>  	for_each_hw_engine(hwe, gt, id) {
>  		char name[MAX_ENGINE_CLASS_NAME_LEN];
> -		struct kobject *khwe;
> +		struct kobj_eclass *keclass;
>  
>  		if (hwe->class == XE_ENGINE_CLASS_OTHER ||
>  		    hwe->class == XE_ENGINE_CLASS_MAX)
> @@ -97,15 +163,29 @@ int xe_hw_engine_class_sysfs_init(struct xe_gt *gt)
>  			strcpy(name, "ccs");
>  			break;
>  		default:
> -			kobject_put(kobj);
> -			return -EINVAL;
> +			err = -EINVAL;
> +			goto err_object;
>  		}
>  
> -		khwe = kobj_xe_hw_engine(kobj, name);
> -		if (!khwe) {
> -			kobject_put(kobj);
> -			return -EINVAL;
> +		keclass = kobj_xe_hw_engine_class(kobj, name);
> +		if (!keclass) {
> +			err = -EINVAL;
> +			goto err_object;
>  		}
> +
> +		keclass->eclass = hwe->eclass;
> +		err = xe_add_hw_engine_class_defaults(&keclass->base);
> +		if (err) {
> +			drm_warn(&gt_to_xe(gt)->drm,
> +				 "Warning: adding .defaults to engines failed!, err: %d\n",
> +				 err);
> +			goto err_object;
> +		}
> +
>  	}
> +
> +	return err;
> +err_object:
> +	kobject_put(kobj);
>  	return err;
>  }
> diff --git a/drivers/gpu/drm/xe/xe_hw_engine_class_sysfs.h b/drivers/gpu/drm/xe/xe_hw_engine_class_sysfs.h
> index c461fac717c2..757136614672 100644
> --- a/drivers/gpu/drm/xe/xe_hw_engine_class_sysfs.h
> +++ b/drivers/gpu/drm/xe/xe_hw_engine_class_sysfs.h
> @@ -10,4 +10,24 @@
>  
>  #define MAX_ENGINE_CLASS_NAME_LEN    16
>  int xe_hw_engine_class_sysfs_init(struct xe_gt *gt);
> +
> +/**
> + * struct kobj_eclass - A eclass's kobject struct that connects the kobject and the
> + * eclass.
> + *
> + * When dealing with multiple eclass, this struct helps to understand which eclass
> + * needs to be addressed on a given sysfs call.
> + */
> +struct kobj_eclass {
> +	/** @base: The actual kobject */
> +	struct kobject base;
> +	/** @eclass: A pointer to the hw engine class interface */
> +	struct xe_hw_engine_class_intf *eclass;
> +};
> +
> +static inline struct xe_hw_engine_class_intf *kobj_to_eclass(struct kobject *kobj)
> +{
> +	return container_of(kobj, struct kobj_eclass, base)->eclass;
> +}
> +
>  #endif
> diff --git a/drivers/gpu/drm/xe/xe_hw_engine_types.h b/drivers/gpu/drm/xe/xe_hw_engine_types.h
> index 803d557cf5aa..97d9ba31b5fc 100644
> --- a/drivers/gpu/drm/xe/xe_hw_engine_types.h
> +++ b/drivers/gpu/drm/xe/xe_hw_engine_types.h
> @@ -63,6 +63,41 @@ struct xe_bo;
>  struct xe_execlist_port;
>  struct xe_gt;
>  
> +/**
> + * struct xe_hw_engine_class_intf - per hw engine class struct interface
> + *
> + * Contains all the hw engine properties per engine class.
> + *
> + * @sched_props: scheduling properties
> + * @defaults: default scheduling properties
> + */
> +struct xe_hw_engine_class_intf {
> +	/**
> +	 * @sched_props: scheduling properties
> +	 * @defaults: default scheduling properties
> +	 */
> +	struct {
> +		/** @set_job_timeout: Set job timeout in ms for engine */
> +		u32 job_timeout_ms;
> +		/** @job_timeout_min: Min job timeout in ms for engine */
> +		u32 job_timeout_min;
> +		/** @job_timeout_max: Max job timeout in ms for engine */
> +		u32 job_timeout_max;
> +		/** @timeslice_us: timeslice period in micro-seconds */
> +		u32 timeslice_us;
> +		/** @timeslice_min: min timeslice period in micro-seconds */
> +		u32 timeslice_min;
> +		/** @timeslice_max: max timeslice period in micro-seconds */
> +		u32 timeslice_max;
> +		/** @preempt_timeout_us: preemption timeout in micro-seconds */
> +		u32 preempt_timeout_us;
> +		/** @preempt_timeout_min: min preemption timeout in micro-seconds */
> +		u32 preempt_timeout_min;
> +		/** @preempt_timeout_max: max preemption timeout in micro-seconds */
> +		u32 preempt_timeout_max;
> +	} sched_props, defaults;
> +};
> +
>  /**
>   * struct xe_hw_engine - Hardware engine
>   *
> @@ -107,6 +142,8 @@ struct xe_hw_engine {
>  	void (*irq_handler)(struct xe_hw_engine *hwe, u16 intr_vec);
>  	/** @engine_id: id  for this hw engine */
>  	enum xe_hw_engine_id engine_id;
> +	/** @eclass: pointer to per hw engine class interface */
> +	struct xe_hw_engine_class_intf *eclass;
>  };
>  
>  /**
> -- 
> 2.25.1
> 

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

* Re: [Intel-xe] [PATCH V9 3/6] drm/xe: Add job timeout engine property to sysfs
  2023-07-27  8:22 ` [Intel-xe] [PATCH V9 3/6] drm/xe: Add job timeout engine property to sysfs Tejas Upadhyay
@ 2023-07-27 14:51   ` Matthew Brost
  0 siblings, 0 replies; 30+ messages in thread
From: Matthew Brost @ 2023-07-27 14:51 UTC (permalink / raw)
  To: Tejas Upadhyay; +Cc: intel-xe

On Thu, Jul 27, 2023 at 01:52:32PM +0530, Tejas Upadhyay wrote:
> The time after which a job is removed from the scheduler.
> Add sysfs entry to provide user defined job timeout to
> scheduler.
> 
> The job timeout can be adjusted per-engine class using,
> 
> /sys/class/drm/cardX/device/tileN/gtN/engines/ccs/job_timeout_ms
> 
> V7:
>   - Rebase to use s/xe_engine/xe_hw_engine/ - Matt
> V6:
>   - Remove timeout validation, not relevant - Niranjana
>   - Rebase to use common error path
> V5:
>   - Rebase to use engine class interface instead of hw engine
> V4:
>   - Rebase to per class engine props interface
> V3:
>   - Rebase
>   - Update commit message to reflect tile update
> V2:
>   - Use sysfs_create_files as part of this patch
> 
> Signed-off-by: Tejas Upadhyay <tejas.upadhyay@intel.com>

Reviewed-by: Matthew Brost <matthew.brost@intel.com>

> ---
>  drivers/gpu/drm/xe/xe_hw_engine_class_sysfs.c | 36 +++++++++++++++++++
>  1 file changed, 36 insertions(+)
> 
> diff --git a/drivers/gpu/drm/xe/xe_hw_engine_class_sysfs.c b/drivers/gpu/drm/xe/xe_hw_engine_class_sysfs.c
> index 15c2b0b9f1fd..5e2dba0be8eb 100644
> --- a/drivers/gpu/drm/xe/xe_hw_engine_class_sysfs.c
> +++ b/drivers/gpu/drm/xe/xe_hw_engine_class_sysfs.c
> @@ -39,6 +39,34 @@ kobj_xe_hw_engine_class(struct kobject *parent, char *name)
>  	return keclass;
>  }
>  
> +static ssize_t job_timeout_store(struct kobject *kobj,
> +				 struct kobj_attribute *attr,
> +				 const char *buf, size_t count)
> +{
> +	struct xe_hw_engine_class_intf *eclass = kobj_to_eclass(kobj);
> +	u32 timeout;
> +	int err;
> +
> +	err = kstrtou32(buf, 0, &timeout);
> +	if (err)
> +		return err;
> +
> +	WRITE_ONCE(eclass->sched_props.job_timeout_ms, timeout);
> +
> +	return count;
> +}
> +
> +static ssize_t job_timeout_show(struct kobject *kobj,
> +				struct kobj_attribute *attr, char *buf)
> +{
> +	struct xe_hw_engine_class_intf *eclass = kobj_to_eclass(kobj);
> +
> +	return sprintf(buf, "%u\n", eclass->sched_props.job_timeout_ms);
> +}
> +
> +static struct kobj_attribute job_timeout_attr =
> +__ATTR(job_timeout_ms, 0644, job_timeout_show, job_timeout_store);
> +
>  static ssize_t job_timeout_default(struct kobject *kobj,
>  				   struct kobj_attribute *attr, char *buf)
>  {
> @@ -80,6 +108,11 @@ static const struct attribute *defaults[] = {
>  	NULL
>  };
>  
> +static const struct attribute *files[] = {
> +	&job_timeout_attr.attr,
> +	NULL
> +};
> +
>  static int xe_add_hw_engine_class_defaults(struct kobject *parent)
>  {
>  	struct kobject *kobj;
> @@ -182,6 +215,9 @@ int xe_hw_engine_class_sysfs_init(struct xe_gt *gt)
>  			goto err_object;
>  		}
>  
> +		err = sysfs_create_files(&keclass->base, files);
> +		if (err)
> +			goto err_object;
>  	}
>  
>  	return err;
> -- 
> 2.25.1
> 

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

* Re: [Intel-xe] [PATCH V9 4/6] drm/xe: Add timeslice duration engine property to sysfs
  2023-07-27  8:22 ` [Intel-xe] [PATCH V9 4/6] drm/xe: Add timeslice duration " Tejas Upadhyay
@ 2023-07-27 14:52   ` Matthew Brost
  0 siblings, 0 replies; 30+ messages in thread
From: Matthew Brost @ 2023-07-27 14:52 UTC (permalink / raw)
  To: Tejas Upadhyay; +Cc: intel-xe

On Thu, Jul 27, 2023 at 01:52:33PM +0530, Tejas Upadhyay wrote:
> Timeslices between multiple context is supported via
> guc scheduling. Add sysfs entry to provide user defined
> timeslice duration to guc scheduling.
> 
> The timeslice duration can be adjusted per-engine class using,
> 
> /sys/class/drm/cardX/device/tileN/gtN/engines/ccs/timeslice_duration_us
> 
> V7:
>   - Rebase to use s/xe_engine/xe_hw_engine/ - Matt
> V6:
>   - Remove duration validation, not relevant - Niranjana
> V5:
>   - Rebase to replace hw engine with eclass interface
> V4:
>   - Rebase to per class engine props interface
> V3:
>   - Rebase
>   - Update commit messge to add tile
> V2:
>   - Rebase
> 
> Signed-off-by: Tejas Upadhyay <tejas.upadhyay@intel.com>

Reviewed-by: Matthew Brost <matthew.brost@intel.com>

> ---
>  drivers/gpu/drm/xe/xe_hw_engine_class_sysfs.c | 30 +++++++++++++++++++
>  1 file changed, 30 insertions(+)
> 
> diff --git a/drivers/gpu/drm/xe/xe_hw_engine_class_sysfs.c b/drivers/gpu/drm/xe/xe_hw_engine_class_sysfs.c
> index 5e2dba0be8eb..b1c13d27bcf4 100644
> --- a/drivers/gpu/drm/xe/xe_hw_engine_class_sysfs.c
> +++ b/drivers/gpu/drm/xe/xe_hw_engine_class_sysfs.c
> @@ -78,6 +78,35 @@ static ssize_t job_timeout_default(struct kobject *kobj,
>  static struct kobj_attribute job_timeout_def =
>  __ATTR(job_timeout_ms, 0444, job_timeout_default, NULL);
>  
> +static ssize_t timeslice_duration_store(struct kobject *kobj,
> +					struct kobj_attribute *attr,
> +					const char *buf, size_t count)
> +{
> +	struct xe_hw_engine_class_intf *eclass = kobj_to_eclass(kobj);
> +	u32 duration;
> +	int err;
> +
> +	err = kstrtou32(buf, 0, &duration);
> +	if (err)
> +		return err;
> +
> +	WRITE_ONCE(eclass->sched_props.timeslice_us, duration);
> +
> +	return count;
> +}
> +
> +static ssize_t timeslice_duration_show(struct kobject *kobj,
> +		struct kobj_attribute *attr, char *buf)
> +{
> +	struct xe_hw_engine_class_intf *eclass = kobj_to_eclass(kobj);
> +
> +	return sprintf(buf, "%u\n", eclass->sched_props.timeslice_us);
> +}
> +
> +static struct kobj_attribute timeslice_duration_attr =
> +	__ATTR(timeslice_duration_us, 0644, timeslice_duration_show,
> +	       timeslice_duration_store);
> +
>  static ssize_t timeslice_default(struct kobject *kobj,
>  				 struct kobj_attribute *attr, char *buf)
>  {
> @@ -110,6 +139,7 @@ static const struct attribute *defaults[] = {
>  
>  static const struct attribute *files[] = {
>  	&job_timeout_attr.attr,
> +	&timeslice_duration_attr.attr,
>  	NULL
>  };
>  
> -- 
> 2.25.1
> 

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

* Re: [Intel-xe] [PATCH V9 5/6] drm/xe: Add sysfs for preempt reset timeout
  2023-07-27  8:22 ` [Intel-xe] [PATCH V9 5/6] drm/xe: Add sysfs for preempt reset timeout Tejas Upadhyay
@ 2023-07-27 14:54   ` Matthew Brost
  0 siblings, 0 replies; 30+ messages in thread
From: Matthew Brost @ 2023-07-27 14:54 UTC (permalink / raw)
  To: Tejas Upadhyay; +Cc: intel-xe

On Thu, Jul 27, 2023 at 01:52:34PM +0530, Tejas Upadhyay wrote:
> The preemption request and timeout is used for
> higher priority context or kill hung context and reset
> gpu.

NIT, reset hardware engine, not GPU.

With the NIT fixed:
Reviewed-by: Matthew Brost <matthew.brost@intel.com>

> 
> The preempt timeout can be adjusted per-engine class using,
> 
> /sys/class/drm/cardX/device/tileN/gtN/engines/ccs/preempt_timeout_us
> 
> and can be disabled by setting it to 0.
> 
> V6:
>   - Rebase to use s/xe_engine/xe_hw_engine/ - Matt
> V5:
>   - Remove timeout validation, not relevant - Niranjana
> V4:
>   - Rebase to replace hw engine with eclass interface
> V3:
>   - Rebase to per class engine props interface
> V2:
>   - Rebase
>   - Update commit message to add tile
> 
> Signed-off-by: Tejas Upadhyay <tejas.upadhyay@intel.com>
> ---
>  drivers/gpu/drm/xe/xe_hw_engine_class_sysfs.c | 29 +++++++++++++++++++
>  1 file changed, 29 insertions(+)
> 
> diff --git a/drivers/gpu/drm/xe/xe_hw_engine_class_sysfs.c b/drivers/gpu/drm/xe/xe_hw_engine_class_sysfs.c
> index b1c13d27bcf4..990bb675d1e0 100644
> --- a/drivers/gpu/drm/xe/xe_hw_engine_class_sysfs.c
> +++ b/drivers/gpu/drm/xe/xe_hw_engine_class_sysfs.c
> @@ -118,6 +118,34 @@ static ssize_t timeslice_default(struct kobject *kobj,
>  static struct kobj_attribute timeslice_duration_def =
>  __ATTR(timeslice_duration_us, 0444, timeslice_default, NULL);
>  
> +static ssize_t preempt_timeout_store(struct kobject *kobj,
> +				     struct kobj_attribute *attr,
> +				     const char *buf, size_t count)
> +{
> +	struct xe_hw_engine_class_intf *eclass = kobj_to_eclass(kobj);
> +	u32 timeout;
> +	int err;
> +
> +	err = kstrtou32(buf, 0, &timeout);
> +	if (err)
> +		return err;
> +
> +	WRITE_ONCE(eclass->sched_props.preempt_timeout_us, timeout);
> +
> +	return count;
> +}
> +
> +static ssize_t preempt_timeout_show(struct kobject *kobj,
> +				    struct kobj_attribute *attr, char *buf)
> +{
> +	struct xe_hw_engine_class_intf *eclass = kobj_to_eclass(kobj);
> +
> +	return sprintf(buf, "%u\n", eclass->sched_props.preempt_timeout_us);
> +}
> +
> +static struct kobj_attribute preempt_timeout_attr =
> +__ATTR(preempt_timeout_us, 0644, preempt_timeout_show, preempt_timeout_store);
> +
>  static ssize_t preempt_timeout_default(struct kobject *kobj,
>  				       struct kobj_attribute *attr,
>  				       char *buf)
> @@ -140,6 +168,7 @@ static const struct attribute *defaults[] = {
>  static const struct attribute *files[] = {
>  	&job_timeout_attr.attr,
>  	&timeslice_duration_attr.attr,
> +	&preempt_timeout_attr.attr,
>  	NULL
>  };
>  
> -- 
> 2.25.1
> 

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

* Re: [Intel-xe] [PATCH V9 6/6] drm/xe: Add min/max cap for engine scheduler properties
  2023-07-27  8:22 ` [Intel-xe] [PATCH V9 6/6] drm/xe: Add min/max cap for engine scheduler properties Tejas Upadhyay
@ 2023-07-27 15:26   ` Matthew Brost
  2023-07-28  4:44     ` Niranjana Vishwanathapura
  0 siblings, 1 reply; 30+ messages in thread
From: Matthew Brost @ 2023-07-27 15:26 UTC (permalink / raw)
  To: Tejas Upadhyay; +Cc: intel-xe

On Thu, Jul 27, 2023 at 01:52:35PM +0530, Tejas Upadhyay wrote:
> Add sysfs entries for the min, max, and defaults for each of
> engine scheduler controls for every hardware engine class.
> 
> Non-elevated user IOCTLs to set these controls must be within
> the min-max ranges of the sysfs entries, elevated user can set
> these controls to any value. However, introduced compile time
> CONFIG min-max values which restricts elevated user to be in
> compile time min-max range if at all sysfs min/max are violated.
> 
> Sysfs entries examples are,
> DUT# cat /sys/class/drm/cardX/device/tileN/gtN/engines/ccs/.defaults/
> job_timeout_max         job_timeout_ms          preempt_timeout_min     timeslice_duration_max  timeslice_duration_us
> job_timeout_min         preempt_timeout_max     preempt_timeout_us      timeslice_duration_min
> 
> DUT# cat /sys/class/drm/card1/device/tileN/gtN/engines/ccs/
> .defaults/              job_timeout_min         preempt_timeout_max     preempt_timeout_us      timeslice_duration_min
> job_timeout_max         job_timeout_ms          preempt_timeout_min     timeslice_duration_max  timeslice_duration_us
> 
> V9 :
>    - Rebase to use s/xe_engine/xe_hw_engine/ - Matt
> V8 :
>    - fix enforce_sched_limit and avoid code duplication - Niranjana
>    - Make sure min < max - Niranjana
> V7 :
>    - Rebase to replace hw engine with eclass interface
>    - return EINVAL in place of EPERM
>    - Use some APIs to avoid code duplication
> V6 :
>    - Rebase changes to reflect per engine class props interface - MattB
>    - Use #if ENABLED - MattB
>    - Remove MAX_SCHED_TIMEOUT check as range validation is enough
> V5 :
>    - Rebase to resolve conflicts - CI
> V4 :
>    - Rebase
>    - Update commit to reflect tile addition
>    - Use XE_HW macro directly as they are already filtered
>      for CONFIG checks - Niranjana
>    - Add CONFIG for enable/disable min/max limitation
>      on elevated user. Default is enable - Matt/Joonas
> V3 :
>    - Resolve CI hooks warning for kernel-doc
> V2 :
>    - Restric min/max setting to #define default min/max for
>      elevated user - Himal
>    - Remove unrelated changes from patch - Niranjana
> 
> Signed-off-by: Tejas Upadhyay <tejas.upadhyay@intel.com>
> ---
>  drivers/gpu/drm/xe/Kconfig                    |   6 +
>  drivers/gpu/drm/xe/Kconfig.profile            |  46 +++
>  drivers/gpu/drm/xe/xe_engine.c                |  25 +-
>  drivers/gpu/drm/xe/xe_hw_engine.c             |   8 +
>  drivers/gpu/drm/xe/xe_hw_engine.h             |  31 ++
>  drivers/gpu/drm/xe/xe_hw_engine_class_sysfs.c | 354 ++++++++++++++++++
>  drivers/gpu/drm/xe/xe_hw_engine_class_sysfs.h |   2 +
>  7 files changed, 466 insertions(+), 6 deletions(-)
>  create mode 100644 drivers/gpu/drm/xe/Kconfig.profile
> 
> diff --git a/drivers/gpu/drm/xe/Kconfig b/drivers/gpu/drm/xe/Kconfig
> index d44794f99338..0a4ea965645b 100644
> --- a/drivers/gpu/drm/xe/Kconfig
> +++ b/drivers/gpu/drm/xe/Kconfig
> @@ -83,3 +83,9 @@ depends on DRM_XE
>  depends on EXPERT
>  source "drivers/gpu/drm/xe/Kconfig.debug"
>  endmenu
> +
> +menu "drm/xe Profile Guided Optimisation"
> +	visible if EXPERT
> +	depends on DRM_XE
> +	source "drivers/gpu/drm/xe/Kconfig.profile"
> +endmenu
> diff --git a/drivers/gpu/drm/xe/Kconfig.profile b/drivers/gpu/drm/xe/Kconfig.profile
> new file mode 100644
> index 000000000000..e72f15ec4bf6
> --- /dev/null
> +++ b/drivers/gpu/drm/xe/Kconfig.profile
> @@ -0,0 +1,46 @@
> +config DRM_XE_JOB_TIMEOUT_MAX
> +       int "Default max job timeout (ms)"
> +       default 10000 # milliseconds
> +       help
> +         Configures the default max job timeout after which job will
> +         be forcefully taken away from scheduler.
> +config DRM_XE_JOB_TIMEOUT_MIN
> +       int "Default max job timeout (ms)"
> +       default 1 # milliseconds
> +       help
> +         Configures the default min job timeout after which job will
> +         be forcefully taken away from scheduler.
> +config DRM_XE_TIMESLICE_MAX
> +       int "Default max timeslice duration (us)"
> +       default 10000000 # microseconds
> +       help
> +         Configures the default max timeslice duration between multiple
> +         contexts by guc scheduling.
> +config DRM_XE_TIMESLICE_MIN
> +       int "Default min timeslice duration (us)"
> +       default 1 # microseconds
> +       help
> +         Configures the default min timeslice duration between multiple
> +         contexts by guc scheduling.
> +config DRM_XE_PREEMPT_TIMEOUT_MAX
> +       int "Default max  preempt timeout (us)"
> +       default 10000000 # microseconds
> +       help
> +         Configures the default max preempt timeout after which context
> +         will be forcefully taken away and higher priority context will
> +         run.
> +config DRM_XE_PREEMPT_TIMEOUT_MIN
> +       int "Default min  preempt timeout (us)"
> +       default 1 # microseconds
> +       help
> +         Configures the default min preempt timeout after which context
> +         will be forcefully taken away and higher priority context will
> +         run.
> +config DRM_XE_ENABLE_SCHEDTIMEOUT_LIMIT
> +       bool "Default configuration of limitation on scheduler timeout"
> +       default y
> +       help
> +	 Configures the enablement of limitation on scheduler timeout
> +	 to apply to applicable user. For elevated user, all above MIN
> +	 and MAX values will apply when this configuration is enable to
> +	 apply limitation. By default limitation is applied.
> diff --git a/drivers/gpu/drm/xe/xe_engine.c b/drivers/gpu/drm/xe/xe_engine.c
> index 9e167b113963..d934196eb79f 100644
> --- a/drivers/gpu/drm/xe/xe_engine.c
> +++ b/drivers/gpu/drm/xe/xe_engine.c
> @@ -13,6 +13,7 @@
>  
>  #include "xe_device.h"
>  #include "xe_gt.h"
> +#include "xe_hw_engine_class_sysfs.h"
>  #include "xe_hw_fence.h"
>  #include "xe_lrc.h"
>  #include "xe_macros.h"
> @@ -191,8 +192,12 @@ static int engine_set_priority(struct xe_device *xe, struct xe_engine *e,
>  static int engine_set_timeslice(struct xe_device *xe, struct xe_engine *e,
>  				u64 value, bool create)
>  {
> -	if (!capable(CAP_SYS_NICE))
> -		return -EPERM;
> +	u32 min = e->hwe->eclass->sched_props.timeslice_min;
> +	u32 max = e->hwe->eclass->sched_props.timeslice_max;

So I screwed this up in my last comment, sorry.

min = cap_nice ? KConfig option for min : e->hwe->eclass->sched_props.timeslice_min;
same logic for max;

Probably add helper for this.

> +
> +	if (enforce_schedule_limit() &&
> +	    !engine_timeout_in_range(value, min, max))

Then I think logic works too...

if cap nice && !Kconfig option to enfore limits (enforce_schedule_limit returns false):
	user can do whatever
else if cap nice
	user within Kconfig range
else
	user within sysfs range

This is what we want in the end.

> +		return -EINVAL;
>  
>  	return e->ops->set_timeslice(e, value);
>  }
> @@ -201,8 +206,12 @@ static int engine_set_preemption_timeout(struct xe_device *xe,
>  					 struct xe_engine *e, u64 value,
>  					 bool create)
>  {
> -	if (!capable(CAP_SYS_NICE))
> -		return -EPERM;
> +	u32 min = e->hwe->eclass->sched_props.preempt_timeout_min;
> +	u32 max = e->hwe->eclass->sched_props.preempt_timeout_max;
> +
> +	if (enforce_schedule_limit() &&
> +	    !engine_timeout_in_range(value, min, max))
> +		return -EINVAL;
>  
>  	return e->ops->set_preempt_timeout(e, value);
>  }
> @@ -266,11 +275,15 @@ static int engine_set_persistence(struct xe_device *xe, struct xe_engine *e,
>  static int engine_set_job_timeout(struct xe_device *xe, struct xe_engine *e,
>  				  u64 value, bool create)
>  {
> +	u32 min = e->hwe->eclass->sched_props.job_timeout_min;
> +	u32 max = e->hwe->eclass->sched_props.job_timeout_max;
> +
>  	if (XE_IOCTL_DBG(xe, !create))
>  		return -EINVAL;
>  
> -	if (!capable(CAP_SYS_NICE))
> -		return -EPERM;
> +	if (enforce_schedule_limit() &&
> +	    !engine_timeout_in_range(value, min, max))
> +		return -EINVAL;
>  
>  	return e->ops->set_job_timeout(e, value);
>  }
> diff --git a/drivers/gpu/drm/xe/xe_hw_engine.c b/drivers/gpu/drm/xe/xe_hw_engine.c
> index afa7d25c3852..e601bffe3b13 100644
> --- a/drivers/gpu/drm/xe/xe_hw_engine.c
> +++ b/drivers/gpu/drm/xe/xe_hw_engine.c
> @@ -364,8 +364,16 @@ static void hw_engine_init_early(struct xe_gt *gt, struct xe_hw_engine *hwe,
>  
>  	if (!gt->eclass[hwe->class].sched_props.job_timeout_ms) {
>  		gt->eclass[hwe->class].sched_props.job_timeout_ms = HZ * 5;
> +		gt->eclass[hwe->class].sched_props.job_timeout_min = XE_HW_ENGINE_JOB_TIMEOUT_MIN;
> +		gt->eclass[hwe->class].sched_props.job_timeout_max = XE_HW_ENGINE_JOB_TIMEOUT_MAX;
>  		gt->eclass[hwe->class].sched_props.timeslice_us = 1 * 1000;
> +		gt->eclass[hwe->class].sched_props.timeslice_min = XE_HW_ENGINE_TIMESLICE_MIN;
> +		gt->eclass[hwe->class].sched_props.timeslice_max = XE_HW_ENGINE_TIMESLICE_MAX;
>  		gt->eclass[hwe->class].sched_props.preempt_timeout_us = 640 * 1000;
> +		gt->eclass[hwe->class].sched_props.preempt_timeout_min =
> +								XE_HW_ENGINE_PREEMPT_TIMEOUT_MIN;
> +		gt->eclass[hwe->class].sched_props.preempt_timeout_max =
> +								XE_HW_ENGINE_PREEMPT_TIMEOUT_MAX;
>  		/* Record default props */
>  		gt->eclass[hwe->class].defaults = gt->eclass[hwe->class].sched_props;
>  	}
> diff --git a/drivers/gpu/drm/xe/xe_hw_engine.h b/drivers/gpu/drm/xe/xe_hw_engine.h
> index 7eca9d53c7b1..3d37d6d44261 100644
> --- a/drivers/gpu/drm/xe/xe_hw_engine.h
> +++ b/drivers/gpu/drm/xe/xe_hw_engine.h
> @@ -10,6 +10,37 @@
>  
>  struct drm_printer;
>  
> +#ifdef CONFIG_DRM_XE_JOB_TIMEOUT_MIN
> +#define XE_HW_ENGINE_JOB_TIMEOUT_MIN CONFIG_DRM_XE_JOB_TIMEOUT_MIN
> +#else
> +#define XE_HW_ENGINE_JOB_TIMEOUT_MIN 1
> +#endif
> +#ifdef CONFIG_DRM_XE_JOB_TIMEOUT_MAX
> +#define XE_HW_ENGINE_JOB_TIMEOUT_MAX CONFIG_DRM_XE_JOB_TIMEOUT_MAX
> +#else
> +#define XE_HW_ENGINE_JOB_TIMEOUT_MAX (10 * 1000)
> +#endif
> +#ifdef CONFIG_DRM_XE_TIMESLICE_MIN
> +#define XE_HW_ENGINE_TIMESLICE_MIN CONFIG_DRM_XE_TIMESLICE_MIN
> +#else
> +#define XE_HW_ENGINE_TIMESLICE_MIN 1
> +#endif
> +#ifdef CONFIG_DRM_XE_TIMESLICE_MAX
> +#define XE_HW_ENGINE_TIMESLICE_MAX CONFIG_DRM_XE_TIMESLICE_MAX
> +#else
> +#define XE_HW_ENGINE_TIMESLICE_MAX (10 * 1000 * 1000)
> +#endif
> +#ifdef CONFIG_DRM_XE_PREEMPT_TIMEOUT_MIN
> +#define XE_HW_ENGINE_PREEMPT_TIMEOUT_MIN CONFIG_DRM_XE_PREEMPT_TIMEOUT_MIN
> +#else
> +#define XE_HW_ENGINE_PREEMPT_TIMEOUT_MIN 1
> +#endif
> +#ifdef CONFIG_DRM_XE_PREEMPT_TIMEOUT_MAX
> +#define XE_HW_ENGINE_PREEMPT_TIMEOUT_MAX CONFIG_DRM_XE_PREEMPT_TIMEOUT_MAX
> +#else
> +#define XE_HW_ENGINE_PREEMPT_TIMEOUT_MAX (10 * 1000 * 1000)
> +#endif
> +
>  int xe_hw_engines_init_early(struct xe_gt *gt);
>  int xe_hw_engines_init(struct xe_gt *gt);
>  void xe_hw_engine_handle_irq(struct xe_hw_engine *hwe, u16 intr_vec);
> diff --git a/drivers/gpu/drm/xe/xe_hw_engine_class_sysfs.c b/drivers/gpu/drm/xe/xe_hw_engine_class_sysfs.c
> index 990bb675d1e0..2b7ac4e02db6 100644
> --- a/drivers/gpu/drm/xe/xe_hw_engine_class_sysfs.c
> +++ b/drivers/gpu/drm/xe/xe_hw_engine_class_sysfs.c
> @@ -11,6 +11,20 @@
>  
>  static int xe_add_hw_engine_class_defaults(struct kobject *parent);
>  
> +bool enforce_schedule_limit(void)
> +{
> +#if IS_ENABLED(CONFIG_DRM_XE_ENABLE_SCHEDTIMEOUT_LIMIT)
> +	return true;
> +#else
> +	return !capable(CAP_SYS_NICE);
> +#endif
> +}
> +
> +bool engine_timeout_in_range(u64 timeout, u64 min, u64 max)
> +{
> +	return timeout >= min && timeout <= max;
> +}
> +
>  static void kobj_xe_hw_engine_release(struct kobject *kobj)
>  {
>  	kfree(kobj);
> @@ -39,11 +53,92 @@ kobj_xe_hw_engine_class(struct kobject *parent, char *name)
>  	return keclass;
>  }
>  
> +static ssize_t job_timeout_max_store(struct kobject *kobj,
> +				     struct kobj_attribute *attr,
> +				     const char *buf, size_t count)
> +{
> +	struct xe_hw_engine_class_intf *eclass = kobj_to_eclass(kobj);
> +	u32 timeout;
> +	int err;
> +
> +	err = kstrtou32(buf, 0, &timeout);
> +	if (err)
> +		return err;
> +
> +	if (timeout < eclass->sched_props.job_timeout_min)
> +		return -EINVAL;
> +
> +	if (enforce_schedule_limit() &&
> +	    !engine_timeout_in_range(timeout,
> +				     XE_HW_ENGINE_JOB_TIMEOUT_MIN,
> +				     XE_HW_ENGINE_JOB_TIMEOUT_MAX))
> +		return -EINVAL;
> +
> +	WRITE_ONCE(eclass->sched_props.job_timeout_max, timeout);
> +
> +	return count;
> +}
> +
> +static ssize_t job_timeout_max_show(struct kobject *kobj,
> +				    struct kobj_attribute *attr, char *buf)
> +{
> +	struct xe_hw_engine_class_intf *eclass = kobj_to_eclass(kobj);
> +
> +	return sprintf(buf, "%u\n", eclass->sched_props.job_timeout_max);
> +}
> +
> +static struct kobj_attribute job_timeout_max_attr =
> +__ATTR(job_timeout_max, 0644, job_timeout_max_show, job_timeout_max_store);
> +
> +static ssize_t job_timeout_min_store(struct kobject *kobj,
> +				     struct kobj_attribute *attr,
> +				     const char *buf, size_t count)
> +{
> +	struct xe_hw_engine_class_intf *eclass = kobj_to_eclass(kobj);
> +	u32 timeout;
> +	int err;
> +
> +	err = kstrtou32(buf, 0, &timeout);
> +	if (err)
> +		return err;
> +
> +	if (timeout > eclass->sched_props.job_timeout_max)
> +		return -EINVAL;
> +
> +	if (enforce_schedule_limit() &&
> +	    !engine_timeout_in_range(timeout,
> +				     XE_HW_ENGINE_JOB_TIMEOUT_MIN,
> +				     XE_HW_ENGINE_JOB_TIMEOUT_MAX))
> +		return -EINVAL;
> +
> +	WRITE_ONCE(eclass->sched_props.job_timeout_min, timeout);
> +
> +	return count;
> +}
> +
> +static ssize_t job_timeout_min_show(struct kobject *kobj,
> +				    struct kobj_attribute *attr, char *buf)
> +{
> +	struct xe_hw_engine_class_intf *eclass = kobj_to_eclass(kobj);
> +
> +	return sprintf(buf, "%u\n", eclass->sched_props.job_timeout_min);
> +}
> +
> +static struct kobj_attribute job_timeout_min_attr =
> +__ATTR(job_timeout_min, 0644, job_timeout_min_show, job_timeout_min_store);
> +
>  static ssize_t job_timeout_store(struct kobject *kobj,
>  				 struct kobj_attribute *attr,
>  				 const char *buf, size_t count)
>  {
>  	struct xe_hw_engine_class_intf *eclass = kobj_to_eclass(kobj);
> +#if IS_ENABLED(CONFIG_DRM_XE_ENABLE_SCHEDTIMEOUT_LIMIT)
> +	u32 min = XE_HW_ENGINE_JOB_TIMEOUT_MIN;
> +	u32 max = XE_HW_ENGINE_JOB_TIMEOUT_MAX;
> +#else
> +	u32 min = e->hwe->eclass->sched_props.job_timeout_min;
> +	u32 max = e->hwe->eclass->sched_props.job_timeout_max;
> +#endif

I don't think we need this, just make sure default is within min / max
of the sched_props.

Matt

>  	u32 timeout;
>  	int err;
>  
> @@ -51,6 +146,10 @@ static ssize_t job_timeout_store(struct kobject *kobj,
>  	if (err)
>  		return err;
>  
> +	if (enforce_schedule_limit() &&
> +	    !engine_timeout_in_range(timeout, min, max))
> +		return -EINVAL;
> +
>  	WRITE_ONCE(eclass->sched_props.job_timeout_ms, timeout);
>  
>  	return count;
> @@ -78,11 +177,40 @@ static ssize_t job_timeout_default(struct kobject *kobj,
>  static struct kobj_attribute job_timeout_def =
>  __ATTR(job_timeout_ms, 0444, job_timeout_default, NULL);
>  
> +static ssize_t job_timeout_min_default(struct kobject *kobj,
> +				       struct kobj_attribute *attr, char *buf)
> +{
> +	struct xe_hw_engine_class_intf *eclass = kobj_to_eclass(kobj->parent);
> +
> +	return sprintf(buf, "%u\n", eclass->defaults.job_timeout_min);
> +}
> +
> +static struct kobj_attribute job_timeout_min_def =
> +__ATTR(job_timeout_min, 0444, job_timeout_min_default, NULL);
> +
> +static ssize_t job_timeout_max_default(struct kobject *kobj,
> +				       struct kobj_attribute *attr, char *buf)
> +{
> +	struct xe_hw_engine_class_intf *eclass = kobj_to_eclass(kobj->parent);
> +
> +	return sprintf(buf, "%u\n", eclass->defaults.job_timeout_max);
> +}
> +
> +static struct kobj_attribute job_timeout_max_def =
> +__ATTR(job_timeout_max, 0444, job_timeout_max_default, NULL);
> +
>  static ssize_t timeslice_duration_store(struct kobject *kobj,
>  					struct kobj_attribute *attr,
>  					const char *buf, size_t count)
>  {
>  	struct xe_hw_engine_class_intf *eclass = kobj_to_eclass(kobj);
> +#if IS_ENABLED(CONFIG_DRM_XE_ENABLE_SCHEDTIMEOUT_LIMIT)
> +	u32 min = XE_HW_ENGINE_TIMESLICE_MIN;
> +	u32 max = XE_HW_ENGINE_TIMESLICE_MAX;
> +#else
> +	u32 min = e->hwe->eclass->sched_props.timeslice_min;
> +	u32 max = e->hwe->eclass->sched_props.timeslice_max;
> +#endif
>  	u32 duration;
>  	int err;
>  
> @@ -90,11 +218,92 @@ static ssize_t timeslice_duration_store(struct kobject *kobj,
>  	if (err)
>  		return err;
>  
> +	if (enforce_schedule_limit() &&
> +	    !engine_timeout_in_range(duration, min, max))
> +		return -EINVAL;
> +
>  	WRITE_ONCE(eclass->sched_props.timeslice_us, duration);
>  
>  	return count;
>  }
>  
> +static ssize_t timeslice_duration_max_store(struct kobject *kobj,
> +					    struct kobj_attribute *attr,
> +					    const char *buf, size_t count)
> +{
> +	struct xe_hw_engine_class_intf *eclass = kobj_to_eclass(kobj);
> +	u32 duration;
> +	int err;
> +
> +	err = kstrtou32(buf, 0, &duration);
> +	if (err)
> +		return err;
> +
> +	if (duration < eclass->sched_props.timeslice_min)
> +		return -EINVAL;
> +
> +	if (enforce_schedule_limit() &&
> +	    !engine_timeout_in_range(duration,
> +				     XE_HW_ENGINE_TIMESLICE_MIN,
> +				     XE_HW_ENGINE_TIMESLICE_MAX))
> +		return -EINVAL;
> +
> +	WRITE_ONCE(eclass->sched_props.timeslice_max, duration);
> +
> +	return count;
> +}
> +
> +static ssize_t timeslice_duration_max_show(struct kobject *kobj,
> +					   struct kobj_attribute *attr,
> +					   char *buf)
> +{
> +	struct xe_hw_engine_class_intf *eclass = kobj_to_eclass(kobj);
> +
> +	return sprintf(buf, "%u\n", eclass->sched_props.timeslice_max);
> +}
> +
> +static struct kobj_attribute timeslice_duration_max_attr =
> +	__ATTR(timeslice_duration_max, 0644, timeslice_duration_max_show,
> +	       timeslice_duration_max_store);
> +
> +static ssize_t timeslice_duration_min_store(struct kobject *kobj,
> +					    struct kobj_attribute *attr,
> +					    const char *buf, size_t count)
> +{
> +	struct xe_hw_engine_class_intf *eclass = kobj_to_eclass(kobj);
> +	u32 duration;
> +	int err;
> +
> +	err = kstrtou32(buf, 0, &duration);
> +	if (err)
> +		return err;
> +
> +	if (duration > eclass->sched_props.timeslice_max)
> +		return -EINVAL;
> +
> +	if (enforce_schedule_limit() &&
> +	    !engine_timeout_in_range(duration,
> +				     XE_HW_ENGINE_TIMESLICE_MIN,
> +				     XE_HW_ENGINE_TIMESLICE_MAX))
> +		return -EINVAL;
> +
> +	WRITE_ONCE(eclass->sched_props.timeslice_min, duration);
> +
> +	return count;
> +}
> +
> +static ssize_t timeslice_duration_min_show(struct kobject *kobj,
> +					   struct kobj_attribute *attr, char *buf)
> +{
> +	struct xe_hw_engine_class_intf *eclass = kobj_to_eclass(kobj);
> +
> +	return sprintf(buf, "%u\n", eclass->sched_props.timeslice_min);
> +}
> +
> +static struct kobj_attribute timeslice_duration_min_attr =
> +	__ATTR(timeslice_duration_min, 0644, timeslice_duration_min_show,
> +	       timeslice_duration_min_store);
> +
>  static ssize_t timeslice_duration_show(struct kobject *kobj,
>  		struct kobj_attribute *attr, char *buf)
>  {
> @@ -118,11 +327,40 @@ static ssize_t timeslice_default(struct kobject *kobj,
>  static struct kobj_attribute timeslice_duration_def =
>  __ATTR(timeslice_duration_us, 0444, timeslice_default, NULL);
>  
> +static ssize_t timeslice_min_default(struct kobject *kobj,
> +				     struct kobj_attribute *attr, char *buf)
> +{
> +	struct xe_hw_engine_class_intf *eclass = kobj_to_eclass(kobj->parent);
> +
> +	return sprintf(buf, "%u\n", eclass->defaults.timeslice_min);
> +}
> +
> +static struct kobj_attribute timeslice_duration_min_def =
> +__ATTR(timeslice_duration_min, 0444, timeslice_min_default, NULL);
> +
> +static ssize_t timeslice_max_default(struct kobject *kobj,
> +				     struct kobj_attribute *attr, char *buf)
> +{
> +	struct xe_hw_engine_class_intf *eclass = kobj_to_eclass(kobj->parent);
> +
> +	return sprintf(buf, "%u\n", eclass->defaults.timeslice_max);
> +}
> +
> +static struct kobj_attribute timeslice_duration_max_def =
> +__ATTR(timeslice_duration_max, 0444, timeslice_max_default, NULL);
> +
>  static ssize_t preempt_timeout_store(struct kobject *kobj,
>  				     struct kobj_attribute *attr,
>  				     const char *buf, size_t count)
>  {
>  	struct xe_hw_engine_class_intf *eclass = kobj_to_eclass(kobj);
> +#if IS_ENABLED(CONFIG_DRM_XE_ENABLE_SCHEDTIMEOUT_LIMIT)
> +	u32 min = XE_HW_ENGINE_PREEMPT_TIMEOUT_MIN;
> +	u32 max = XE_HW_ENGINE_PREEMPT_TIMEOUT_MAX;
> +#else
> +	u32 min = e->hwe->eclass->sched_props.preempt_timeout_min;
> +	u32 max = e->hwe->eclass->sched_props.preempt_timeout_max;
> +#endif
>  	u32 timeout;
>  	int err;
>  
> @@ -130,6 +368,10 @@ static ssize_t preempt_timeout_store(struct kobject *kobj,
>  	if (err)
>  		return err;
>  
> +	if (enforce_schedule_limit() &&
> +	    !engine_timeout_in_range(timeout, min, max))
> +		return -EINVAL;
> +
>  	WRITE_ONCE(eclass->sched_props.preempt_timeout_us, timeout);
>  
>  	return count;
> @@ -158,17 +400,129 @@ static ssize_t preempt_timeout_default(struct kobject *kobj,
>  static struct kobj_attribute preempt_timeout_def =
>  __ATTR(preempt_timeout_us, 0444, preempt_timeout_default, NULL);
>  
> +static ssize_t preempt_timeout_min_default(struct kobject *kobj,
> +					   struct kobj_attribute *attr,
> +					   char *buf)
> +{
> +	struct xe_hw_engine_class_intf *eclass = kobj_to_eclass(kobj->parent);
> +
> +	return sprintf(buf, "%u\n", eclass->defaults.preempt_timeout_min);
> +}
> +
> +static struct kobj_attribute preempt_timeout_min_def =
> +__ATTR(preempt_timeout_min, 0444, preempt_timeout_min_default, NULL);
> +
> +static ssize_t preempt_timeout_max_default(struct kobject *kobj,
> +					   struct kobj_attribute *attr,
> +					   char *buf)
> +{
> +	struct xe_hw_engine_class_intf *eclass = kobj_to_eclass(kobj->parent);
> +
> +	return sprintf(buf, "%u\n", eclass->defaults.preempt_timeout_max);
> +}
> +
> +static struct kobj_attribute preempt_timeout_max_def =
> +__ATTR(preempt_timeout_max, 0444, preempt_timeout_max_default, NULL);
> +
> +static ssize_t preempt_timeout_max_store(struct kobject *kobj,
> +					 struct kobj_attribute *attr,
> +					 const char *buf, size_t count)
> +{
> +	struct xe_hw_engine_class_intf *eclass = kobj_to_eclass(kobj);
> +	u32 timeout;
> +	int err;
> +
> +	err = kstrtou32(buf, 0, &timeout);
> +	if (err)
> +		return err;
> +
> +	if (timeout < eclass->sched_props.preempt_timeout_min)
> +		return -EINVAL;
> +
> +	if (enforce_schedule_limit() &&
> +	    !engine_timeout_in_range(timeout,
> +				     XE_HW_ENGINE_PREEMPT_TIMEOUT_MIN,
> +				     XE_HW_ENGINE_PREEMPT_TIMEOUT_MAX))
> +		return -EINVAL;
> +
> +	WRITE_ONCE(eclass->sched_props.preempt_timeout_max, timeout);
> +
> +	return count;
> +}
> +
> +static ssize_t preempt_timeout_max_show(struct kobject *kobj,
> +					struct kobj_attribute *attr, char *buf)
> +{
> +	struct xe_hw_engine_class_intf *eclass = kobj_to_eclass(kobj);
> +
> +	return sprintf(buf, "%u\n", eclass->sched_props.preempt_timeout_max);
> +}
> +
> +static struct kobj_attribute preempt_timeout_max_attr =
> +	__ATTR(preempt_timeout_max, 0644, preempt_timeout_max_show,
> +	       preempt_timeout_max_store);
> +
> +static ssize_t preempt_timeout_min_store(struct kobject *kobj,
> +					 struct kobj_attribute *attr,
> +					 const char *buf, size_t count)
> +{
> +	struct xe_hw_engine_class_intf *eclass = kobj_to_eclass(kobj);
> +	u32 timeout;
> +	int err;
> +
> +	err = kstrtou32(buf, 0, &timeout);
> +	if (err)
> +		return err;
> +
> +	if (timeout > eclass->sched_props.preempt_timeout_max)
> +		return -EINVAL;
> +
> +	if (enforce_schedule_limit() &&
> +	    !engine_timeout_in_range(timeout,
> +				     XE_HW_ENGINE_PREEMPT_TIMEOUT_MIN,
> +				     XE_HW_ENGINE_PREEMPT_TIMEOUT_MAX))
> +		return -EINVAL;
> +
> +	WRITE_ONCE(eclass->sched_props.preempt_timeout_min, timeout);
> +
> +	return count;
> +}
> +
> +static ssize_t preempt_timeout_min_show(struct kobject *kobj,
> +					struct kobj_attribute *attr, char *buf)
> +{
> +	struct xe_hw_engine_class_intf *eclass = kobj_to_eclass(kobj);
> +
> +	return sprintf(buf, "%u\n", eclass->sched_props.preempt_timeout_min);
> +}
> +
> +static struct kobj_attribute preempt_timeout_min_attr =
> +	__ATTR(preempt_timeout_min, 0644, preempt_timeout_min_show,
> +	       preempt_timeout_min_store);
> +
>  static const struct attribute *defaults[] = {
>  	&job_timeout_def.attr,
> +	&job_timeout_min_def.attr,
> +	&job_timeout_max_def.attr,
>  	&timeslice_duration_def.attr,
> +	&timeslice_duration_min_def.attr,
> +	&timeslice_duration_max_def.attr,
>  	&preempt_timeout_def.attr,
> +	&preempt_timeout_min_def.attr,
> +	&preempt_timeout_max_def.attr,
>  	NULL
>  };
>  
>  static const struct attribute *files[] = {
>  	&job_timeout_attr.attr,
> +	&job_timeout_min_attr.attr,
> +	&job_timeout_max_attr.attr,
>  	&timeslice_duration_attr.attr,
> +	&timeslice_duration_min_attr.attr,
> +	&timeslice_duration_max_attr.attr,
>  	&preempt_timeout_attr.attr,
> +	&preempt_timeout_min_attr.attr,
> +	&preempt_timeout_max_attr.attr,
>  	NULL
>  };
>  
> diff --git a/drivers/gpu/drm/xe/xe_hw_engine_class_sysfs.h b/drivers/gpu/drm/xe/xe_hw_engine_class_sysfs.h
> index 757136614672..2e2ab351a991 100644
> --- a/drivers/gpu/drm/xe/xe_hw_engine_class_sysfs.h
> +++ b/drivers/gpu/drm/xe/xe_hw_engine_class_sysfs.h
> @@ -10,6 +10,8 @@
>  
>  #define MAX_ENGINE_CLASS_NAME_LEN    16
>  int xe_hw_engine_class_sysfs_init(struct xe_gt *gt);
> +bool enforce_schedule_limit(void);
> +bool engine_timeout_in_range(u64 timeout, u64 min, u64 max);
>  
>  /**
>   * struct kobj_eclass - A eclass's kobject struct that connects the kobject and the
> -- 
> 2.25.1
> 

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

* Re: [Intel-xe] [PATCH V9 6/6] drm/xe: Add min/max cap for engine scheduler properties
  2023-07-27 15:26   ` Matthew Brost
@ 2023-07-28  4:44     ` Niranjana Vishwanathapura
  2023-07-28  5:04       ` Matthew Brost
  0 siblings, 1 reply; 30+ messages in thread
From: Niranjana Vishwanathapura @ 2023-07-28  4:44 UTC (permalink / raw)
  To: Matthew Brost; +Cc: intel-xe

On Thu, Jul 27, 2023 at 03:26:49PM +0000, Matthew Brost wrote:
>On Thu, Jul 27, 2023 at 01:52:35PM +0530, Tejas Upadhyay wrote:
>> Add sysfs entries for the min, max, and defaults for each of
>> engine scheduler controls for every hardware engine class.
>>
>> Non-elevated user IOCTLs to set these controls must be within
>> the min-max ranges of the sysfs entries, elevated user can set
>> these controls to any value. However, introduced compile time
>> CONFIG min-max values which restricts elevated user to be in
>> compile time min-max range if at all sysfs min/max are violated.
>>
>> Sysfs entries examples are,
>> DUT# cat /sys/class/drm/cardX/device/tileN/gtN/engines/ccs/.defaults/
>> job_timeout_max         job_timeout_ms          preempt_timeout_min     timeslice_duration_max  timeslice_duration_us
>> job_timeout_min         preempt_timeout_max     preempt_timeout_us      timeslice_duration_min
>>
>> DUT# cat /sys/class/drm/card1/device/tileN/gtN/engines/ccs/
>> .defaults/              job_timeout_min         preempt_timeout_max     preempt_timeout_us      timeslice_duration_min
>> job_timeout_max         job_timeout_ms          preempt_timeout_min     timeslice_duration_max  timeslice_duration_us
>>
>> V9 :
>>    - Rebase to use s/xe_engine/xe_hw_engine/ - Matt
>> V8 :
>>    - fix enforce_sched_limit and avoid code duplication - Niranjana
>>    - Make sure min < max - Niranjana
>> V7 :
>>    - Rebase to replace hw engine with eclass interface
>>    - return EINVAL in place of EPERM
>>    - Use some APIs to avoid code duplication
>> V6 :
>>    - Rebase changes to reflect per engine class props interface - MattB
>>    - Use #if ENABLED - MattB
>>    - Remove MAX_SCHED_TIMEOUT check as range validation is enough
>> V5 :
>>    - Rebase to resolve conflicts - CI
>> V4 :
>>    - Rebase
>>    - Update commit to reflect tile addition
>>    - Use XE_HW macro directly as they are already filtered
>>      for CONFIG checks - Niranjana
>>    - Add CONFIG for enable/disable min/max limitation
>>      on elevated user. Default is enable - Matt/Joonas
>> V3 :
>>    - Resolve CI hooks warning for kernel-doc
>> V2 :
>>    - Restric min/max setting to #define default min/max for
>>      elevated user - Himal
>>    - Remove unrelated changes from patch - Niranjana
>>
>> Signed-off-by: Tejas Upadhyay <tejas.upadhyay@intel.com>
>> ---
>>  drivers/gpu/drm/xe/Kconfig                    |   6 +
>>  drivers/gpu/drm/xe/Kconfig.profile            |  46 +++
>>  drivers/gpu/drm/xe/xe_engine.c                |  25 +-
>>  drivers/gpu/drm/xe/xe_hw_engine.c             |   8 +
>>  drivers/gpu/drm/xe/xe_hw_engine.h             |  31 ++
>>  drivers/gpu/drm/xe/xe_hw_engine_class_sysfs.c | 354 ++++++++++++++++++
>>  drivers/gpu/drm/xe/xe_hw_engine_class_sysfs.h |   2 +
>>  7 files changed, 466 insertions(+), 6 deletions(-)
>>  create mode 100644 drivers/gpu/drm/xe/Kconfig.profile
>>
>> diff --git a/drivers/gpu/drm/xe/Kconfig b/drivers/gpu/drm/xe/Kconfig
>> index d44794f99338..0a4ea965645b 100644
>> --- a/drivers/gpu/drm/xe/Kconfig
>> +++ b/drivers/gpu/drm/xe/Kconfig
>> @@ -83,3 +83,9 @@ depends on DRM_XE
>>  depends on EXPERT
>>  source "drivers/gpu/drm/xe/Kconfig.debug"
>>  endmenu
>> +
>> +menu "drm/xe Profile Guided Optimisation"
>> +	visible if EXPERT
>> +	depends on DRM_XE
>> +	source "drivers/gpu/drm/xe/Kconfig.profile"
>> +endmenu
>> diff --git a/drivers/gpu/drm/xe/Kconfig.profile b/drivers/gpu/drm/xe/Kconfig.profile
>> new file mode 100644
>> index 000000000000..e72f15ec4bf6
>> --- /dev/null
>> +++ b/drivers/gpu/drm/xe/Kconfig.profile
>> @@ -0,0 +1,46 @@
>> +config DRM_XE_JOB_TIMEOUT_MAX
>> +       int "Default max job timeout (ms)"
>> +       default 10000 # milliseconds
>> +       help
>> +         Configures the default max job timeout after which job will
>> +         be forcefully taken away from scheduler.
>> +config DRM_XE_JOB_TIMEOUT_MIN
>> +       int "Default max job timeout (ms)"
>> +       default 1 # milliseconds
>> +       help
>> +         Configures the default min job timeout after which job will
>> +         be forcefully taken away from scheduler.
>> +config DRM_XE_TIMESLICE_MAX
>> +       int "Default max timeslice duration (us)"
>> +       default 10000000 # microseconds
>> +       help
>> +         Configures the default max timeslice duration between multiple
>> +         contexts by guc scheduling.
>> +config DRM_XE_TIMESLICE_MIN
>> +       int "Default min timeslice duration (us)"
>> +       default 1 # microseconds
>> +       help
>> +         Configures the default min timeslice duration between multiple
>> +         contexts by guc scheduling.
>> +config DRM_XE_PREEMPT_TIMEOUT_MAX
>> +       int "Default max  preempt timeout (us)"
>> +       default 10000000 # microseconds
>> +       help
>> +         Configures the default max preempt timeout after which context
>> +         will be forcefully taken away and higher priority context will
>> +         run.
>> +config DRM_XE_PREEMPT_TIMEOUT_MIN
>> +       int "Default min  preempt timeout (us)"
>> +       default 1 # microseconds
>> +       help
>> +         Configures the default min preempt timeout after which context
>> +         will be forcefully taken away and higher priority context will
>> +         run.
>> +config DRM_XE_ENABLE_SCHEDTIMEOUT_LIMIT
>> +       bool "Default configuration of limitation on scheduler timeout"
>> +       default y
>> +       help
>> +	 Configures the enablement of limitation on scheduler timeout
>> +	 to apply to applicable user. For elevated user, all above MIN
>> +	 and MAX values will apply when this configuration is enable to
>> +	 apply limitation. By default limitation is applied.
>> diff --git a/drivers/gpu/drm/xe/xe_engine.c b/drivers/gpu/drm/xe/xe_engine.c
>> index 9e167b113963..d934196eb79f 100644
>> --- a/drivers/gpu/drm/xe/xe_engine.c
>> +++ b/drivers/gpu/drm/xe/xe_engine.c
>> @@ -13,6 +13,7 @@
>>
>>  #include "xe_device.h"
>>  #include "xe_gt.h"
>> +#include "xe_hw_engine_class_sysfs.h"
>>  #include "xe_hw_fence.h"
>>  #include "xe_lrc.h"
>>  #include "xe_macros.h"
>> @@ -191,8 +192,12 @@ static int engine_set_priority(struct xe_device *xe, struct xe_engine *e,
>>  static int engine_set_timeslice(struct xe_device *xe, struct xe_engine *e,
>>  				u64 value, bool create)
>>  {
>> -	if (!capable(CAP_SYS_NICE))
>> -		return -EPERM;
>> +	u32 min = e->hwe->eclass->sched_props.timeslice_min;
>> +	u32 max = e->hwe->eclass->sched_props.timeslice_max;
>
>So I screwed this up in my last comment, sorry.
>
>min = cap_nice ? KConfig option for min : e->hwe->eclass->sched_props.timeslice_min;
>same logic for max;
>
>Probably add helper for this.
>
>> +
>> +	if (enforce_schedule_limit() &&
>> +	    !engine_timeout_in_range(value, min, max))
>
>Then I think logic works too...
>
>if cap nice && !Kconfig option to enfore limits (enforce_schedule_limit returns false):
>	user can do whatever
>else if cap nice
>	user within Kconfig range
>else
>	user within sysfs range
>
>This is what we want in the end.
>

Matt, I think this is exactly what the previous revision of the patch was doing.

>> +		return -EINVAL;
>>
>>  	return e->ops->set_timeslice(e, value);
>>  }
>> @@ -201,8 +206,12 @@ static int engine_set_preemption_timeout(struct xe_device *xe,
>>  					 struct xe_engine *e, u64 value,
>>  					 bool create)
>>  {
>> -	if (!capable(CAP_SYS_NICE))
>> -		return -EPERM;
>> +	u32 min = e->hwe->eclass->sched_props.preempt_timeout_min;
>> +	u32 max = e->hwe->eclass->sched_props.preempt_timeout_max;
>> +
>> +	if (enforce_schedule_limit() &&
>> +	    !engine_timeout_in_range(value, min, max))
>> +		return -EINVAL;
>>
>>  	return e->ops->set_preempt_timeout(e, value);
>>  }
>> @@ -266,11 +275,15 @@ static int engine_set_persistence(struct xe_device *xe, struct xe_engine *e,
>>  static int engine_set_job_timeout(struct xe_device *xe, struct xe_engine *e,
>>  				  u64 value, bool create)
>>  {
>> +	u32 min = e->hwe->eclass->sched_props.job_timeout_min;
>> +	u32 max = e->hwe->eclass->sched_props.job_timeout_max;
>> +
>>  	if (XE_IOCTL_DBG(xe, !create))
>>  		return -EINVAL;
>>
>> -	if (!capable(CAP_SYS_NICE))
>> -		return -EPERM;
>> +	if (enforce_schedule_limit() &&
>> +	    !engine_timeout_in_range(value, min, max))
>> +		return -EINVAL;
>>
>>  	return e->ops->set_job_timeout(e, value);
>>  }
>> diff --git a/drivers/gpu/drm/xe/xe_hw_engine.c b/drivers/gpu/drm/xe/xe_hw_engine.c
>> index afa7d25c3852..e601bffe3b13 100644
>> --- a/drivers/gpu/drm/xe/xe_hw_engine.c
>> +++ b/drivers/gpu/drm/xe/xe_hw_engine.c
>> @@ -364,8 +364,16 @@ static void hw_engine_init_early(struct xe_gt *gt, struct xe_hw_engine *hwe,
>>
>>  	if (!gt->eclass[hwe->class].sched_props.job_timeout_ms) {
>>  		gt->eclass[hwe->class].sched_props.job_timeout_ms = HZ * 5;
>> +		gt->eclass[hwe->class].sched_props.job_timeout_min = XE_HW_ENGINE_JOB_TIMEOUT_MIN;
>> +		gt->eclass[hwe->class].sched_props.job_timeout_max = XE_HW_ENGINE_JOB_TIMEOUT_MAX;
>>  		gt->eclass[hwe->class].sched_props.timeslice_us = 1 * 1000;
>> +		gt->eclass[hwe->class].sched_props.timeslice_min = XE_HW_ENGINE_TIMESLICE_MIN;
>> +		gt->eclass[hwe->class].sched_props.timeslice_max = XE_HW_ENGINE_TIMESLICE_MAX;
>>  		gt->eclass[hwe->class].sched_props.preempt_timeout_us = 640 * 1000;
>> +		gt->eclass[hwe->class].sched_props.preempt_timeout_min =
>> +								XE_HW_ENGINE_PREEMPT_TIMEOUT_MIN;
>> +		gt->eclass[hwe->class].sched_props.preempt_timeout_max =
>> +								XE_HW_ENGINE_PREEMPT_TIMEOUT_MAX;
>>  		/* Record default props */
>>  		gt->eclass[hwe->class].defaults = gt->eclass[hwe->class].sched_props;
>>  	}
>> diff --git a/drivers/gpu/drm/xe/xe_hw_engine.h b/drivers/gpu/drm/xe/xe_hw_engine.h
>> index 7eca9d53c7b1..3d37d6d44261 100644
>> --- a/drivers/gpu/drm/xe/xe_hw_engine.h
>> +++ b/drivers/gpu/drm/xe/xe_hw_engine.h
>> @@ -10,6 +10,37 @@
>>
>>  struct drm_printer;
>>
>> +#ifdef CONFIG_DRM_XE_JOB_TIMEOUT_MIN
>> +#define XE_HW_ENGINE_JOB_TIMEOUT_MIN CONFIG_DRM_XE_JOB_TIMEOUT_MIN
>> +#else
>> +#define XE_HW_ENGINE_JOB_TIMEOUT_MIN 1
>> +#endif
>> +#ifdef CONFIG_DRM_XE_JOB_TIMEOUT_MAX
>> +#define XE_HW_ENGINE_JOB_TIMEOUT_MAX CONFIG_DRM_XE_JOB_TIMEOUT_MAX
>> +#else
>> +#define XE_HW_ENGINE_JOB_TIMEOUT_MAX (10 * 1000)
>> +#endif
>> +#ifdef CONFIG_DRM_XE_TIMESLICE_MIN
>> +#define XE_HW_ENGINE_TIMESLICE_MIN CONFIG_DRM_XE_TIMESLICE_MIN
>> +#else
>> +#define XE_HW_ENGINE_TIMESLICE_MIN 1
>> +#endif
>> +#ifdef CONFIG_DRM_XE_TIMESLICE_MAX
>> +#define XE_HW_ENGINE_TIMESLICE_MAX CONFIG_DRM_XE_TIMESLICE_MAX
>> +#else
>> +#define XE_HW_ENGINE_TIMESLICE_MAX (10 * 1000 * 1000)
>> +#endif
>> +#ifdef CONFIG_DRM_XE_PREEMPT_TIMEOUT_MIN
>> +#define XE_HW_ENGINE_PREEMPT_TIMEOUT_MIN CONFIG_DRM_XE_PREEMPT_TIMEOUT_MIN
>> +#else
>> +#define XE_HW_ENGINE_PREEMPT_TIMEOUT_MIN 1
>> +#endif
>> +#ifdef CONFIG_DRM_XE_PREEMPT_TIMEOUT_MAX
>> +#define XE_HW_ENGINE_PREEMPT_TIMEOUT_MAX CONFIG_DRM_XE_PREEMPT_TIMEOUT_MAX
>> +#else
>> +#define XE_HW_ENGINE_PREEMPT_TIMEOUT_MAX (10 * 1000 * 1000)
>> +#endif
>> +
>>  int xe_hw_engines_init_early(struct xe_gt *gt);
>>  int xe_hw_engines_init(struct xe_gt *gt);
>>  void xe_hw_engine_handle_irq(struct xe_hw_engine *hwe, u16 intr_vec);
>> diff --git a/drivers/gpu/drm/xe/xe_hw_engine_class_sysfs.c b/drivers/gpu/drm/xe/xe_hw_engine_class_sysfs.c
>> index 990bb675d1e0..2b7ac4e02db6 100644
>> --- a/drivers/gpu/drm/xe/xe_hw_engine_class_sysfs.c
>> +++ b/drivers/gpu/drm/xe/xe_hw_engine_class_sysfs.c
>> @@ -11,6 +11,20 @@
>>
>>  static int xe_add_hw_engine_class_defaults(struct kobject *parent);
>>
>> +bool enforce_schedule_limit(void)
>> +{
>> +#if IS_ENABLED(CONFIG_DRM_XE_ENABLE_SCHEDTIMEOUT_LIMIT)
>> +	return true;
>> +#else
>> +	return !capable(CAP_SYS_NICE);
>> +#endif
>> +}
>> +
>> +bool engine_timeout_in_range(u64 timeout, u64 min, u64 max)
>> +{
>> +	return timeout >= min && timeout <= max;
>> +}
>> +
>>  static void kobj_xe_hw_engine_release(struct kobject *kobj)
>>  {
>>  	kfree(kobj);
>> @@ -39,11 +53,92 @@ kobj_xe_hw_engine_class(struct kobject *parent, char *name)
>>  	return keclass;
>>  }
>>
>> +static ssize_t job_timeout_max_store(struct kobject *kobj,
>> +				     struct kobj_attribute *attr,
>> +				     const char *buf, size_t count)
>> +{
>> +	struct xe_hw_engine_class_intf *eclass = kobj_to_eclass(kobj);
>> +	u32 timeout;
>> +	int err;
>> +
>> +	err = kstrtou32(buf, 0, &timeout);
>> +	if (err)
>> +		return err;
>> +
>> +	if (timeout < eclass->sched_props.job_timeout_min)
>> +		return -EINVAL;
>> +
>> +	if (enforce_schedule_limit() &&
>> +	    !engine_timeout_in_range(timeout,
>> +				     XE_HW_ENGINE_JOB_TIMEOUT_MIN,
>> +				     XE_HW_ENGINE_JOB_TIMEOUT_MAX))
>> +		return -EINVAL;
>> +
>> +	WRITE_ONCE(eclass->sched_props.job_timeout_max, timeout);
>> +
>> +	return count;
>> +}
>> +
>> +static ssize_t job_timeout_max_show(struct kobject *kobj,
>> +				    struct kobj_attribute *attr, char *buf)
>> +{
>> +	struct xe_hw_engine_class_intf *eclass = kobj_to_eclass(kobj);
>> +
>> +	return sprintf(buf, "%u\n", eclass->sched_props.job_timeout_max);
>> +}
>> +
>> +static struct kobj_attribute job_timeout_max_attr =
>> +__ATTR(job_timeout_max, 0644, job_timeout_max_show, job_timeout_max_store);
>> +
>> +static ssize_t job_timeout_min_store(struct kobject *kobj,
>> +				     struct kobj_attribute *attr,
>> +				     const char *buf, size_t count)
>> +{
>> +	struct xe_hw_engine_class_intf *eclass = kobj_to_eclass(kobj);
>> +	u32 timeout;
>> +	int err;
>> +
>> +	err = kstrtou32(buf, 0, &timeout);
>> +	if (err)
>> +		return err;
>> +
>> +	if (timeout > eclass->sched_props.job_timeout_max)
>> +		return -EINVAL;
>> +
>> +	if (enforce_schedule_limit() &&
>> +	    !engine_timeout_in_range(timeout,
>> +				     XE_HW_ENGINE_JOB_TIMEOUT_MIN,
>> +				     XE_HW_ENGINE_JOB_TIMEOUT_MAX))
>> +		return -EINVAL;
>> +
>> +	WRITE_ONCE(eclass->sched_props.job_timeout_min, timeout);
>> +
>> +	return count;
>> +}
>> +
>> +static ssize_t job_timeout_min_show(struct kobject *kobj,
>> +				    struct kobj_attribute *attr, char *buf)
>> +{
>> +	struct xe_hw_engine_class_intf *eclass = kobj_to_eclass(kobj);
>> +
>> +	return sprintf(buf, "%u\n", eclass->sched_props.job_timeout_min);
>> +}
>> +
>> +static struct kobj_attribute job_timeout_min_attr =
>> +__ATTR(job_timeout_min, 0644, job_timeout_min_show, job_timeout_min_store);
>> +
>>  static ssize_t job_timeout_store(struct kobject *kobj,
>>  				 struct kobj_attribute *attr,
>>  				 const char *buf, size_t count)
>>  {
>>  	struct xe_hw_engine_class_intf *eclass = kobj_to_eclass(kobj);
>> +#if IS_ENABLED(CONFIG_DRM_XE_ENABLE_SCHEDTIMEOUT_LIMIT)
>> +	u32 min = XE_HW_ENGINE_JOB_TIMEOUT_MIN;
>> +	u32 max = XE_HW_ENGINE_JOB_TIMEOUT_MAX;
>> +#else
>> +	u32 min = e->hwe->eclass->sched_props.job_timeout_min;
>> +	u32 max = e->hwe->eclass->sched_props.job_timeout_max;
>> +#endif
>
>I don't think we need this, just make sure default is within min / max
>of the sched_props.
>

Shouldn't the sched_prop set through sysfs here which applies to all future
user engines (xe_engine) has the same requirement as the sched_prop set
directly to user engine (xe_engine) through set_properly ioctl?
ie., shoudln't the requirement be same in job_timeout_store() and
engine_set_job_timeout()?

Niranjana

>Matt
>
>>  	u32 timeout;
>>  	int err;
>>
>> @@ -51,6 +146,10 @@ static ssize_t job_timeout_store(struct kobject *kobj,
>>  	if (err)
>>  		return err;
>>
>> +	if (enforce_schedule_limit() &&
>> +	    !engine_timeout_in_range(timeout, min, max))
>> +		return -EINVAL;
>> +
>>  	WRITE_ONCE(eclass->sched_props.job_timeout_ms, timeout);
>>
>>  	return count;
>> @@ -78,11 +177,40 @@ static ssize_t job_timeout_default(struct kobject *kobj,
>>  static struct kobj_attribute job_timeout_def =
>>  __ATTR(job_timeout_ms, 0444, job_timeout_default, NULL);
>>
>> +static ssize_t job_timeout_min_default(struct kobject *kobj,
>> +				       struct kobj_attribute *attr, char *buf)
>> +{
>> +	struct xe_hw_engine_class_intf *eclass = kobj_to_eclass(kobj->parent);
>> +
>> +	return sprintf(buf, "%u\n", eclass->defaults.job_timeout_min);
>> +}
>> +
>> +static struct kobj_attribute job_timeout_min_def =
>> +__ATTR(job_timeout_min, 0444, job_timeout_min_default, NULL);
>> +
>> +static ssize_t job_timeout_max_default(struct kobject *kobj,
>> +				       struct kobj_attribute *attr, char *buf)
>> +{
>> +	struct xe_hw_engine_class_intf *eclass = kobj_to_eclass(kobj->parent);
>> +
>> +	return sprintf(buf, "%u\n", eclass->defaults.job_timeout_max);
>> +}
>> +
>> +static struct kobj_attribute job_timeout_max_def =
>> +__ATTR(job_timeout_max, 0444, job_timeout_max_default, NULL);
>> +
>>  static ssize_t timeslice_duration_store(struct kobject *kobj,
>>  					struct kobj_attribute *attr,
>>  					const char *buf, size_t count)
>>  {
>>  	struct xe_hw_engine_class_intf *eclass = kobj_to_eclass(kobj);
>> +#if IS_ENABLED(CONFIG_DRM_XE_ENABLE_SCHEDTIMEOUT_LIMIT)
>> +	u32 min = XE_HW_ENGINE_TIMESLICE_MIN;
>> +	u32 max = XE_HW_ENGINE_TIMESLICE_MAX;
>> +#else
>> +	u32 min = e->hwe->eclass->sched_props.timeslice_min;
>> +	u32 max = e->hwe->eclass->sched_props.timeslice_max;
>> +#endif
>>  	u32 duration;
>>  	int err;
>>
>> @@ -90,11 +218,92 @@ static ssize_t timeslice_duration_store(struct kobject *kobj,
>>  	if (err)
>>  		return err;
>>
>> +	if (enforce_schedule_limit() &&
>> +	    !engine_timeout_in_range(duration, min, max))
>> +		return -EINVAL;
>> +
>>  	WRITE_ONCE(eclass->sched_props.timeslice_us, duration);
>>
>>  	return count;
>>  }
>>
>> +static ssize_t timeslice_duration_max_store(struct kobject *kobj,
>> +					    struct kobj_attribute *attr,
>> +					    const char *buf, size_t count)
>> +{
>> +	struct xe_hw_engine_class_intf *eclass = kobj_to_eclass(kobj);
>> +	u32 duration;
>> +	int err;
>> +
>> +	err = kstrtou32(buf, 0, &duration);
>> +	if (err)
>> +		return err;
>> +
>> +	if (duration < eclass->sched_props.timeslice_min)
>> +		return -EINVAL;
>> +
>> +	if (enforce_schedule_limit() &&
>> +	    !engine_timeout_in_range(duration,
>> +				     XE_HW_ENGINE_TIMESLICE_MIN,
>> +				     XE_HW_ENGINE_TIMESLICE_MAX))
>> +		return -EINVAL;
>> +
>> +	WRITE_ONCE(eclass->sched_props.timeslice_max, duration);
>> +
>> +	return count;
>> +}
>> +
>> +static ssize_t timeslice_duration_max_show(struct kobject *kobj,
>> +					   struct kobj_attribute *attr,
>> +					   char *buf)
>> +{
>> +	struct xe_hw_engine_class_intf *eclass = kobj_to_eclass(kobj);
>> +
>> +	return sprintf(buf, "%u\n", eclass->sched_props.timeslice_max);
>> +}
>> +
>> +static struct kobj_attribute timeslice_duration_max_attr =
>> +	__ATTR(timeslice_duration_max, 0644, timeslice_duration_max_show,
>> +	       timeslice_duration_max_store);
>> +
>> +static ssize_t timeslice_duration_min_store(struct kobject *kobj,
>> +					    struct kobj_attribute *attr,
>> +					    const char *buf, size_t count)
>> +{
>> +	struct xe_hw_engine_class_intf *eclass = kobj_to_eclass(kobj);
>> +	u32 duration;
>> +	int err;
>> +
>> +	err = kstrtou32(buf, 0, &duration);
>> +	if (err)
>> +		return err;
>> +
>> +	if (duration > eclass->sched_props.timeslice_max)
>> +		return -EINVAL;
>> +
>> +	if (enforce_schedule_limit() &&
>> +	    !engine_timeout_in_range(duration,
>> +				     XE_HW_ENGINE_TIMESLICE_MIN,
>> +				     XE_HW_ENGINE_TIMESLICE_MAX))
>> +		return -EINVAL;
>> +
>> +	WRITE_ONCE(eclass->sched_props.timeslice_min, duration);
>> +
>> +	return count;
>> +}
>> +
>> +static ssize_t timeslice_duration_min_show(struct kobject *kobj,
>> +					   struct kobj_attribute *attr, char *buf)
>> +{
>> +	struct xe_hw_engine_class_intf *eclass = kobj_to_eclass(kobj);
>> +
>> +	return sprintf(buf, "%u\n", eclass->sched_props.timeslice_min);
>> +}
>> +
>> +static struct kobj_attribute timeslice_duration_min_attr =
>> +	__ATTR(timeslice_duration_min, 0644, timeslice_duration_min_show,
>> +	       timeslice_duration_min_store);
>> +
>>  static ssize_t timeslice_duration_show(struct kobject *kobj,
>>  		struct kobj_attribute *attr, char *buf)
>>  {
>> @@ -118,11 +327,40 @@ static ssize_t timeslice_default(struct kobject *kobj,
>>  static struct kobj_attribute timeslice_duration_def =
>>  __ATTR(timeslice_duration_us, 0444, timeslice_default, NULL);
>>
>> +static ssize_t timeslice_min_default(struct kobject *kobj,
>> +				     struct kobj_attribute *attr, char *buf)
>> +{
>> +	struct xe_hw_engine_class_intf *eclass = kobj_to_eclass(kobj->parent);
>> +
>> +	return sprintf(buf, "%u\n", eclass->defaults.timeslice_min);
>> +}
>> +
>> +static struct kobj_attribute timeslice_duration_min_def =
>> +__ATTR(timeslice_duration_min, 0444, timeslice_min_default, NULL);
>> +
>> +static ssize_t timeslice_max_default(struct kobject *kobj,
>> +				     struct kobj_attribute *attr, char *buf)
>> +{
>> +	struct xe_hw_engine_class_intf *eclass = kobj_to_eclass(kobj->parent);
>> +
>> +	return sprintf(buf, "%u\n", eclass->defaults.timeslice_max);
>> +}
>> +
>> +static struct kobj_attribute timeslice_duration_max_def =
>> +__ATTR(timeslice_duration_max, 0444, timeslice_max_default, NULL);
>> +
>>  static ssize_t preempt_timeout_store(struct kobject *kobj,
>>  				     struct kobj_attribute *attr,
>>  				     const char *buf, size_t count)
>>  {
>>  	struct xe_hw_engine_class_intf *eclass = kobj_to_eclass(kobj);
>> +#if IS_ENABLED(CONFIG_DRM_XE_ENABLE_SCHEDTIMEOUT_LIMIT)
>> +	u32 min = XE_HW_ENGINE_PREEMPT_TIMEOUT_MIN;
>> +	u32 max = XE_HW_ENGINE_PREEMPT_TIMEOUT_MAX;
>> +#else
>> +	u32 min = e->hwe->eclass->sched_props.preempt_timeout_min;
>> +	u32 max = e->hwe->eclass->sched_props.preempt_timeout_max;
>> +#endif
>>  	u32 timeout;
>>  	int err;
>>
>> @@ -130,6 +368,10 @@ static ssize_t preempt_timeout_store(struct kobject *kobj,
>>  	if (err)
>>  		return err;
>>
>> +	if (enforce_schedule_limit() &&
>> +	    !engine_timeout_in_range(timeout, min, max))
>> +		return -EINVAL;
>> +
>>  	WRITE_ONCE(eclass->sched_props.preempt_timeout_us, timeout);
>>
>>  	return count;
>> @@ -158,17 +400,129 @@ static ssize_t preempt_timeout_default(struct kobject *kobj,
>>  static struct kobj_attribute preempt_timeout_def =
>>  __ATTR(preempt_timeout_us, 0444, preempt_timeout_default, NULL);
>>
>> +static ssize_t preempt_timeout_min_default(struct kobject *kobj,
>> +					   struct kobj_attribute *attr,
>> +					   char *buf)
>> +{
>> +	struct xe_hw_engine_class_intf *eclass = kobj_to_eclass(kobj->parent);
>> +
>> +	return sprintf(buf, "%u\n", eclass->defaults.preempt_timeout_min);
>> +}
>> +
>> +static struct kobj_attribute preempt_timeout_min_def =
>> +__ATTR(preempt_timeout_min, 0444, preempt_timeout_min_default, NULL);
>> +
>> +static ssize_t preempt_timeout_max_default(struct kobject *kobj,
>> +					   struct kobj_attribute *attr,
>> +					   char *buf)
>> +{
>> +	struct xe_hw_engine_class_intf *eclass = kobj_to_eclass(kobj->parent);
>> +
>> +	return sprintf(buf, "%u\n", eclass->defaults.preempt_timeout_max);
>> +}
>> +
>> +static struct kobj_attribute preempt_timeout_max_def =
>> +__ATTR(preempt_timeout_max, 0444, preempt_timeout_max_default, NULL);
>> +
>> +static ssize_t preempt_timeout_max_store(struct kobject *kobj,
>> +					 struct kobj_attribute *attr,
>> +					 const char *buf, size_t count)
>> +{
>> +	struct xe_hw_engine_class_intf *eclass = kobj_to_eclass(kobj);
>> +	u32 timeout;
>> +	int err;
>> +
>> +	err = kstrtou32(buf, 0, &timeout);
>> +	if (err)
>> +		return err;
>> +
>> +	if (timeout < eclass->sched_props.preempt_timeout_min)
>> +		return -EINVAL;
>> +
>> +	if (enforce_schedule_limit() &&
>> +	    !engine_timeout_in_range(timeout,
>> +				     XE_HW_ENGINE_PREEMPT_TIMEOUT_MIN,
>> +				     XE_HW_ENGINE_PREEMPT_TIMEOUT_MAX))
>> +		return -EINVAL;
>> +
>> +	WRITE_ONCE(eclass->sched_props.preempt_timeout_max, timeout);
>> +
>> +	return count;
>> +}
>> +
>> +static ssize_t preempt_timeout_max_show(struct kobject *kobj,
>> +					struct kobj_attribute *attr, char *buf)
>> +{
>> +	struct xe_hw_engine_class_intf *eclass = kobj_to_eclass(kobj);
>> +
>> +	return sprintf(buf, "%u\n", eclass->sched_props.preempt_timeout_max);
>> +}
>> +
>> +static struct kobj_attribute preempt_timeout_max_attr =
>> +	__ATTR(preempt_timeout_max, 0644, preempt_timeout_max_show,
>> +	       preempt_timeout_max_store);
>> +
>> +static ssize_t preempt_timeout_min_store(struct kobject *kobj,
>> +					 struct kobj_attribute *attr,
>> +					 const char *buf, size_t count)
>> +{
>> +	struct xe_hw_engine_class_intf *eclass = kobj_to_eclass(kobj);
>> +	u32 timeout;
>> +	int err;
>> +
>> +	err = kstrtou32(buf, 0, &timeout);
>> +	if (err)
>> +		return err;
>> +
>> +	if (timeout > eclass->sched_props.preempt_timeout_max)
>> +		return -EINVAL;
>> +
>> +	if (enforce_schedule_limit() &&
>> +	    !engine_timeout_in_range(timeout,
>> +				     XE_HW_ENGINE_PREEMPT_TIMEOUT_MIN,
>> +				     XE_HW_ENGINE_PREEMPT_TIMEOUT_MAX))
>> +		return -EINVAL;
>> +
>> +	WRITE_ONCE(eclass->sched_props.preempt_timeout_min, timeout);
>> +
>> +	return count;
>> +}
>> +
>> +static ssize_t preempt_timeout_min_show(struct kobject *kobj,
>> +					struct kobj_attribute *attr, char *buf)
>> +{
>> +	struct xe_hw_engine_class_intf *eclass = kobj_to_eclass(kobj);
>> +
>> +	return sprintf(buf, "%u\n", eclass->sched_props.preempt_timeout_min);
>> +}
>> +
>> +static struct kobj_attribute preempt_timeout_min_attr =
>> +	__ATTR(preempt_timeout_min, 0644, preempt_timeout_min_show,
>> +	       preempt_timeout_min_store);
>> +
>>  static const struct attribute *defaults[] = {
>>  	&job_timeout_def.attr,
>> +	&job_timeout_min_def.attr,
>> +	&job_timeout_max_def.attr,
>>  	&timeslice_duration_def.attr,
>> +	&timeslice_duration_min_def.attr,
>> +	&timeslice_duration_max_def.attr,
>>  	&preempt_timeout_def.attr,
>> +	&preempt_timeout_min_def.attr,
>> +	&preempt_timeout_max_def.attr,
>>  	NULL
>>  };
>>
>>  static const struct attribute *files[] = {
>>  	&job_timeout_attr.attr,
>> +	&job_timeout_min_attr.attr,
>> +	&job_timeout_max_attr.attr,
>>  	&timeslice_duration_attr.attr,
>> +	&timeslice_duration_min_attr.attr,
>> +	&timeslice_duration_max_attr.attr,
>>  	&preempt_timeout_attr.attr,
>> +	&preempt_timeout_min_attr.attr,
>> +	&preempt_timeout_max_attr.attr,
>>  	NULL
>>  };
>>
>> diff --git a/drivers/gpu/drm/xe/xe_hw_engine_class_sysfs.h b/drivers/gpu/drm/xe/xe_hw_engine_class_sysfs.h
>> index 757136614672..2e2ab351a991 100644
>> --- a/drivers/gpu/drm/xe/xe_hw_engine_class_sysfs.h
>> +++ b/drivers/gpu/drm/xe/xe_hw_engine_class_sysfs.h
>> @@ -10,6 +10,8 @@
>>
>>  #define MAX_ENGINE_CLASS_NAME_LEN    16
>>  int xe_hw_engine_class_sysfs_init(struct xe_gt *gt);
>> +bool enforce_schedule_limit(void);
>> +bool engine_timeout_in_range(u64 timeout, u64 min, u64 max);
>>
>>  /**
>>   * struct kobj_eclass - A eclass's kobject struct that connects the kobject and the
>> --
>> 2.25.1
>>

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

* Re: [Intel-xe] [PATCH V9 6/6] drm/xe: Add min/max cap for engine scheduler properties
  2023-07-28  4:44     ` Niranjana Vishwanathapura
@ 2023-07-28  5:04       ` Matthew Brost
  2023-07-28  5:54         ` Upadhyay, Tejas
  0 siblings, 1 reply; 30+ messages in thread
From: Matthew Brost @ 2023-07-28  5:04 UTC (permalink / raw)
  To: Niranjana Vishwanathapura; +Cc: intel-xe

On Thu, Jul 27, 2023 at 09:44:23PM -0700, Niranjana Vishwanathapura wrote:
> On Thu, Jul 27, 2023 at 03:26:49PM +0000, Matthew Brost wrote:
> > On Thu, Jul 27, 2023 at 01:52:35PM +0530, Tejas Upadhyay wrote:
> > > Add sysfs entries for the min, max, and defaults for each of
> > > engine scheduler controls for every hardware engine class.
> > > 
> > > Non-elevated user IOCTLs to set these controls must be within
> > > the min-max ranges of the sysfs entries, elevated user can set
> > > these controls to any value. However, introduced compile time
> > > CONFIG min-max values which restricts elevated user to be in
> > > compile time min-max range if at all sysfs min/max are violated.
> > > 
> > > Sysfs entries examples are,
> > > DUT# cat /sys/class/drm/cardX/device/tileN/gtN/engines/ccs/.defaults/
> > > job_timeout_max         job_timeout_ms          preempt_timeout_min     timeslice_duration_max  timeslice_duration_us
> > > job_timeout_min         preempt_timeout_max     preempt_timeout_us      timeslice_duration_min
> > > 
> > > DUT# cat /sys/class/drm/card1/device/tileN/gtN/engines/ccs/
> > > .defaults/              job_timeout_min         preempt_timeout_max     preempt_timeout_us      timeslice_duration_min
> > > job_timeout_max         job_timeout_ms          preempt_timeout_min     timeslice_duration_max  timeslice_duration_us
> > > 
> > > V9 :
> > >    - Rebase to use s/xe_engine/xe_hw_engine/ - Matt
> > > V8 :
> > >    - fix enforce_sched_limit and avoid code duplication - Niranjana
> > >    - Make sure min < max - Niranjana
> > > V7 :
> > >    - Rebase to replace hw engine with eclass interface
> > >    - return EINVAL in place of EPERM
> > >    - Use some APIs to avoid code duplication
> > > V6 :
> > >    - Rebase changes to reflect per engine class props interface - MattB
> > >    - Use #if ENABLED - MattB
> > >    - Remove MAX_SCHED_TIMEOUT check as range validation is enough
> > > V5 :
> > >    - Rebase to resolve conflicts - CI
> > > V4 :
> > >    - Rebase
> > >    - Update commit to reflect tile addition
> > >    - Use XE_HW macro directly as they are already filtered
> > >      for CONFIG checks - Niranjana
> > >    - Add CONFIG for enable/disable min/max limitation
> > >      on elevated user. Default is enable - Matt/Joonas
> > > V3 :
> > >    - Resolve CI hooks warning for kernel-doc
> > > V2 :
> > >    - Restric min/max setting to #define default min/max for
> > >      elevated user - Himal
> > >    - Remove unrelated changes from patch - Niranjana
> > > 
> > > Signed-off-by: Tejas Upadhyay <tejas.upadhyay@intel.com>
> > > ---
> > >  drivers/gpu/drm/xe/Kconfig                    |   6 +
> > >  drivers/gpu/drm/xe/Kconfig.profile            |  46 +++
> > >  drivers/gpu/drm/xe/xe_engine.c                |  25 +-
> > >  drivers/gpu/drm/xe/xe_hw_engine.c             |   8 +
> > >  drivers/gpu/drm/xe/xe_hw_engine.h             |  31 ++
> > >  drivers/gpu/drm/xe/xe_hw_engine_class_sysfs.c | 354 ++++++++++++++++++
> > >  drivers/gpu/drm/xe/xe_hw_engine_class_sysfs.h |   2 +
> > >  7 files changed, 466 insertions(+), 6 deletions(-)
> > >  create mode 100644 drivers/gpu/drm/xe/Kconfig.profile
> > > 
> > > diff --git a/drivers/gpu/drm/xe/Kconfig b/drivers/gpu/drm/xe/Kconfig
> > > index d44794f99338..0a4ea965645b 100644
> > > --- a/drivers/gpu/drm/xe/Kconfig
> > > +++ b/drivers/gpu/drm/xe/Kconfig
> > > @@ -83,3 +83,9 @@ depends on DRM_XE
> > >  depends on EXPERT
> > >  source "drivers/gpu/drm/xe/Kconfig.debug"
> > >  endmenu
> > > +
> > > +menu "drm/xe Profile Guided Optimisation"
> > > +	visible if EXPERT
> > > +	depends on DRM_XE
> > > +	source "drivers/gpu/drm/xe/Kconfig.profile"
> > > +endmenu
> > > diff --git a/drivers/gpu/drm/xe/Kconfig.profile b/drivers/gpu/drm/xe/Kconfig.profile
> > > new file mode 100644
> > > index 000000000000..e72f15ec4bf6
> > > --- /dev/null
> > > +++ b/drivers/gpu/drm/xe/Kconfig.profile
> > > @@ -0,0 +1,46 @@
> > > +config DRM_XE_JOB_TIMEOUT_MAX
> > > +       int "Default max job timeout (ms)"
> > > +       default 10000 # milliseconds
> > > +       help
> > > +         Configures the default max job timeout after which job will
> > > +         be forcefully taken away from scheduler.
> > > +config DRM_XE_JOB_TIMEOUT_MIN
> > > +       int "Default max job timeout (ms)"
> > > +       default 1 # milliseconds
> > > +       help
> > > +         Configures the default min job timeout after which job will
> > > +         be forcefully taken away from scheduler.
> > > +config DRM_XE_TIMESLICE_MAX
> > > +       int "Default max timeslice duration (us)"
> > > +       default 10000000 # microseconds
> > > +       help
> > > +         Configures the default max timeslice duration between multiple
> > > +         contexts by guc scheduling.
> > > +config DRM_XE_TIMESLICE_MIN
> > > +       int "Default min timeslice duration (us)"
> > > +       default 1 # microseconds
> > > +       help
> > > +         Configures the default min timeslice duration between multiple
> > > +         contexts by guc scheduling.
> > > +config DRM_XE_PREEMPT_TIMEOUT_MAX
> > > +       int "Default max  preempt timeout (us)"
> > > +       default 10000000 # microseconds
> > > +       help
> > > +         Configures the default max preempt timeout after which context
> > > +         will be forcefully taken away and higher priority context will
> > > +         run.
> > > +config DRM_XE_PREEMPT_TIMEOUT_MIN
> > > +       int "Default min  preempt timeout (us)"
> > > +       default 1 # microseconds
> > > +       help
> > > +         Configures the default min preempt timeout after which context
> > > +         will be forcefully taken away and higher priority context will
> > > +         run.
> > > +config DRM_XE_ENABLE_SCHEDTIMEOUT_LIMIT
> > > +       bool "Default configuration of limitation on scheduler timeout"
> > > +       default y
> > > +       help
> > > +	 Configures the enablement of limitation on scheduler timeout
> > > +	 to apply to applicable user. For elevated user, all above MIN
> > > +	 and MAX values will apply when this configuration is enable to
> > > +	 apply limitation. By default limitation is applied.
> > > diff --git a/drivers/gpu/drm/xe/xe_engine.c b/drivers/gpu/drm/xe/xe_engine.c
> > > index 9e167b113963..d934196eb79f 100644
> > > --- a/drivers/gpu/drm/xe/xe_engine.c
> > > +++ b/drivers/gpu/drm/xe/xe_engine.c
> > > @@ -13,6 +13,7 @@
> > > 
> > >  #include "xe_device.h"
> > >  #include "xe_gt.h"
> > > +#include "xe_hw_engine_class_sysfs.h"
> > >  #include "xe_hw_fence.h"
> > >  #include "xe_lrc.h"
> > >  #include "xe_macros.h"
> > > @@ -191,8 +192,12 @@ static int engine_set_priority(struct xe_device *xe, struct xe_engine *e,
> > >  static int engine_set_timeslice(struct xe_device *xe, struct xe_engine *e,
> > >  				u64 value, bool create)
> > >  {
> > > -	if (!capable(CAP_SYS_NICE))
> > > -		return -EPERM;
> > > +	u32 min = e->hwe->eclass->sched_props.timeslice_min;
> > > +	u32 max = e->hwe->eclass->sched_props.timeslice_max;
> > 
> > So I screwed this up in my last comment, sorry.
> > 
> > min = cap_nice ? KConfig option for min : e->hwe->eclass->sched_props.timeslice_min;
> > same logic for max;
> > 
> > Probably add helper for this.
> > 
> > > +
> > > +	if (enforce_schedule_limit() &&
> > > +	    !engine_timeout_in_range(value, min, max))
> > 
> > Then I think logic works too...
> > 
> > if cap nice && !Kconfig option to enfore limits (enforce_schedule_limit returns false):
> > 	user can do whatever
> > else if cap nice
> > 	user within Kconfig range
> > else
> > 	user within sysfs range
> > 
> > This is what we want in the end.
> > 
> 
> Matt, I think this is exactly what the previous revision of the patch was doing.
> 

No... Previous version

min = Kconfig option to enfore limits ? KConfig option for min : e->hwe->eclass->sched_props.timeslice_min
same for max

Results in:

if cap nice && !Kconfig option to enfore limits (enforce_schedule_limit returns false):
	user can do whatever
else if cap_nice || Kconfig option to enfore limit	
	user within Kconfig range
else
 	user within sysfs range

!cap_nice && Kconfig option to enfore limits == user within Kconfig range (previously)
!cap_nice && Kconfig option to enfore limits == user within sysfs range (my suggestion)

The logic is different and I believe we want what I'm suggesting.

Matt

> > > +		return -EINVAL;
> > > 
> > >  	return e->ops->set_timeslice(e, value);
> > >  }
> > > @@ -201,8 +206,12 @@ static int engine_set_preemption_timeout(struct xe_device *xe,
> > >  					 struct xe_engine *e, u64 value,
> > >  					 bool create)
> > >  {
> > > -	if (!capable(CAP_SYS_NICE))
> > > -		return -EPERM;
> > > +	u32 min = e->hwe->eclass->sched_props.preempt_timeout_min;
> > > +	u32 max = e->hwe->eclass->sched_props.preempt_timeout_max;
> > > +
> > > +	if (enforce_schedule_limit() &&
> > > +	    !engine_timeout_in_range(value, min, max))
> > > +		return -EINVAL;
> > > 
> > >  	return e->ops->set_preempt_timeout(e, value);
> > >  }
> > > @@ -266,11 +275,15 @@ static int engine_set_persistence(struct xe_device *xe, struct xe_engine *e,
> > >  static int engine_set_job_timeout(struct xe_device *xe, struct xe_engine *e,
> > >  				  u64 value, bool create)
> > >  {
> > > +	u32 min = e->hwe->eclass->sched_props.job_timeout_min;
> > > +	u32 max = e->hwe->eclass->sched_props.job_timeout_max;
> > > +
> > >  	if (XE_IOCTL_DBG(xe, !create))
> > >  		return -EINVAL;
> > > 
> > > -	if (!capable(CAP_SYS_NICE))
> > > -		return -EPERM;
> > > +	if (enforce_schedule_limit() &&
> > > +	    !engine_timeout_in_range(value, min, max))
> > > +		return -EINVAL;
> > > 
> > >  	return e->ops->set_job_timeout(e, value);
> > >  }
> > > diff --git a/drivers/gpu/drm/xe/xe_hw_engine.c b/drivers/gpu/drm/xe/xe_hw_engine.c
> > > index afa7d25c3852..e601bffe3b13 100644
> > > --- a/drivers/gpu/drm/xe/xe_hw_engine.c
> > > +++ b/drivers/gpu/drm/xe/xe_hw_engine.c
> > > @@ -364,8 +364,16 @@ static void hw_engine_init_early(struct xe_gt *gt, struct xe_hw_engine *hwe,
> > > 
> > >  	if (!gt->eclass[hwe->class].sched_props.job_timeout_ms) {
> > >  		gt->eclass[hwe->class].sched_props.job_timeout_ms = HZ * 5;
> > > +		gt->eclass[hwe->class].sched_props.job_timeout_min = XE_HW_ENGINE_JOB_TIMEOUT_MIN;
> > > +		gt->eclass[hwe->class].sched_props.job_timeout_max = XE_HW_ENGINE_JOB_TIMEOUT_MAX;
> > >  		gt->eclass[hwe->class].sched_props.timeslice_us = 1 * 1000;
> > > +		gt->eclass[hwe->class].sched_props.timeslice_min = XE_HW_ENGINE_TIMESLICE_MIN;
> > > +		gt->eclass[hwe->class].sched_props.timeslice_max = XE_HW_ENGINE_TIMESLICE_MAX;
> > >  		gt->eclass[hwe->class].sched_props.preempt_timeout_us = 640 * 1000;
> > > +		gt->eclass[hwe->class].sched_props.preempt_timeout_min =
> > > +								XE_HW_ENGINE_PREEMPT_TIMEOUT_MIN;
> > > +		gt->eclass[hwe->class].sched_props.preempt_timeout_max =
> > > +								XE_HW_ENGINE_PREEMPT_TIMEOUT_MAX;
> > >  		/* Record default props */
> > >  		gt->eclass[hwe->class].defaults = gt->eclass[hwe->class].sched_props;
> > >  	}
> > > diff --git a/drivers/gpu/drm/xe/xe_hw_engine.h b/drivers/gpu/drm/xe/xe_hw_engine.h
> > > index 7eca9d53c7b1..3d37d6d44261 100644
> > > --- a/drivers/gpu/drm/xe/xe_hw_engine.h
> > > +++ b/drivers/gpu/drm/xe/xe_hw_engine.h
> > > @@ -10,6 +10,37 @@
> > > 
> > >  struct drm_printer;
> > > 
> > > +#ifdef CONFIG_DRM_XE_JOB_TIMEOUT_MIN
> > > +#define XE_HW_ENGINE_JOB_TIMEOUT_MIN CONFIG_DRM_XE_JOB_TIMEOUT_MIN
> > > +#else
> > > +#define XE_HW_ENGINE_JOB_TIMEOUT_MIN 1
> > > +#endif
> > > +#ifdef CONFIG_DRM_XE_JOB_TIMEOUT_MAX
> > > +#define XE_HW_ENGINE_JOB_TIMEOUT_MAX CONFIG_DRM_XE_JOB_TIMEOUT_MAX
> > > +#else
> > > +#define XE_HW_ENGINE_JOB_TIMEOUT_MAX (10 * 1000)
> > > +#endif
> > > +#ifdef CONFIG_DRM_XE_TIMESLICE_MIN
> > > +#define XE_HW_ENGINE_TIMESLICE_MIN CONFIG_DRM_XE_TIMESLICE_MIN
> > > +#else
> > > +#define XE_HW_ENGINE_TIMESLICE_MIN 1
> > > +#endif
> > > +#ifdef CONFIG_DRM_XE_TIMESLICE_MAX
> > > +#define XE_HW_ENGINE_TIMESLICE_MAX CONFIG_DRM_XE_TIMESLICE_MAX
> > > +#else
> > > +#define XE_HW_ENGINE_TIMESLICE_MAX (10 * 1000 * 1000)
> > > +#endif
> > > +#ifdef CONFIG_DRM_XE_PREEMPT_TIMEOUT_MIN
> > > +#define XE_HW_ENGINE_PREEMPT_TIMEOUT_MIN CONFIG_DRM_XE_PREEMPT_TIMEOUT_MIN
> > > +#else
> > > +#define XE_HW_ENGINE_PREEMPT_TIMEOUT_MIN 1
> > > +#endif
> > > +#ifdef CONFIG_DRM_XE_PREEMPT_TIMEOUT_MAX
> > > +#define XE_HW_ENGINE_PREEMPT_TIMEOUT_MAX CONFIG_DRM_XE_PREEMPT_TIMEOUT_MAX
> > > +#else
> > > +#define XE_HW_ENGINE_PREEMPT_TIMEOUT_MAX (10 * 1000 * 1000)
> > > +#endif
> > > +
> > >  int xe_hw_engines_init_early(struct xe_gt *gt);
> > >  int xe_hw_engines_init(struct xe_gt *gt);
> > >  void xe_hw_engine_handle_irq(struct xe_hw_engine *hwe, u16 intr_vec);
> > > diff --git a/drivers/gpu/drm/xe/xe_hw_engine_class_sysfs.c b/drivers/gpu/drm/xe/xe_hw_engine_class_sysfs.c
> > > index 990bb675d1e0..2b7ac4e02db6 100644
> > > --- a/drivers/gpu/drm/xe/xe_hw_engine_class_sysfs.c
> > > +++ b/drivers/gpu/drm/xe/xe_hw_engine_class_sysfs.c
> > > @@ -11,6 +11,20 @@
> > > 
> > >  static int xe_add_hw_engine_class_defaults(struct kobject *parent);
> > > 
> > > +bool enforce_schedule_limit(void)
> > > +{
> > > +#if IS_ENABLED(CONFIG_DRM_XE_ENABLE_SCHEDTIMEOUT_LIMIT)
> > > +	return true;
> > > +#else
> > > +	return !capable(CAP_SYS_NICE);
> > > +#endif
> > > +}
> > > +
> > > +bool engine_timeout_in_range(u64 timeout, u64 min, u64 max)
> > > +{
> > > +	return timeout >= min && timeout <= max;
> > > +}
> > > +
> > >  static void kobj_xe_hw_engine_release(struct kobject *kobj)
> > >  {
> > >  	kfree(kobj);
> > > @@ -39,11 +53,92 @@ kobj_xe_hw_engine_class(struct kobject *parent, char *name)
> > >  	return keclass;
> > >  }
> > > 
> > > +static ssize_t job_timeout_max_store(struct kobject *kobj,
> > > +				     struct kobj_attribute *attr,
> > > +				     const char *buf, size_t count)
> > > +{
> > > +	struct xe_hw_engine_class_intf *eclass = kobj_to_eclass(kobj);
> > > +	u32 timeout;
> > > +	int err;
> > > +
> > > +	err = kstrtou32(buf, 0, &timeout);
> > > +	if (err)
> > > +		return err;
> > > +
> > > +	if (timeout < eclass->sched_props.job_timeout_min)
> > > +		return -EINVAL;
> > > +
> > > +	if (enforce_schedule_limit() &&
> > > +	    !engine_timeout_in_range(timeout,
> > > +				     XE_HW_ENGINE_JOB_TIMEOUT_MIN,
> > > +				     XE_HW_ENGINE_JOB_TIMEOUT_MAX))
> > > +		return -EINVAL;
> > > +
> > > +	WRITE_ONCE(eclass->sched_props.job_timeout_max, timeout);
> > > +
> > > +	return count;
> > > +}
> > > +
> > > +static ssize_t job_timeout_max_show(struct kobject *kobj,
> > > +				    struct kobj_attribute *attr, char *buf)
> > > +{
> > > +	struct xe_hw_engine_class_intf *eclass = kobj_to_eclass(kobj);
> > > +
> > > +	return sprintf(buf, "%u\n", eclass->sched_props.job_timeout_max);
> > > +}
> > > +
> > > +static struct kobj_attribute job_timeout_max_attr =
> > > +__ATTR(job_timeout_max, 0644, job_timeout_max_show, job_timeout_max_store);
> > > +
> > > +static ssize_t job_timeout_min_store(struct kobject *kobj,
> > > +				     struct kobj_attribute *attr,
> > > +				     const char *buf, size_t count)
> > > +{
> > > +	struct xe_hw_engine_class_intf *eclass = kobj_to_eclass(kobj);
> > > +	u32 timeout;
> > > +	int err;
> > > +
> > > +	err = kstrtou32(buf, 0, &timeout);
> > > +	if (err)
> > > +		return err;
> > > +
> > > +	if (timeout > eclass->sched_props.job_timeout_max)
> > > +		return -EINVAL;
> > > +
> > > +	if (enforce_schedule_limit() &&
> > > +	    !engine_timeout_in_range(timeout,
> > > +				     XE_HW_ENGINE_JOB_TIMEOUT_MIN,
> > > +				     XE_HW_ENGINE_JOB_TIMEOUT_MAX))
> > > +		return -EINVAL;
> > > +
> > > +	WRITE_ONCE(eclass->sched_props.job_timeout_min, timeout);
> > > +
> > > +	return count;
> > > +}
> > > +
> > > +static ssize_t job_timeout_min_show(struct kobject *kobj,
> > > +				    struct kobj_attribute *attr, char *buf)
> > > +{
> > > +	struct xe_hw_engine_class_intf *eclass = kobj_to_eclass(kobj);
> > > +
> > > +	return sprintf(buf, "%u\n", eclass->sched_props.job_timeout_min);
> > > +}
> > > +
> > > +static struct kobj_attribute job_timeout_min_attr =
> > > +__ATTR(job_timeout_min, 0644, job_timeout_min_show, job_timeout_min_store);
> > > +
> > >  static ssize_t job_timeout_store(struct kobject *kobj,
> > >  				 struct kobj_attribute *attr,
> > >  				 const char *buf, size_t count)
> > >  {
> > >  	struct xe_hw_engine_class_intf *eclass = kobj_to_eclass(kobj);
> > > +#if IS_ENABLED(CONFIG_DRM_XE_ENABLE_SCHEDTIMEOUT_LIMIT)
> > > +	u32 min = XE_HW_ENGINE_JOB_TIMEOUT_MIN;
> > > +	u32 max = XE_HW_ENGINE_JOB_TIMEOUT_MAX;
> > > +#else
> > > +	u32 min = e->hwe->eclass->sched_props.job_timeout_min;
> > > +	u32 max = e->hwe->eclass->sched_props.job_timeout_max;
> > > +#endif
> > 
> > I don't think we need this, just make sure default is within min / max
> > of the sched_props.
> > 
> 
> Shouldn't the sched_prop set through sysfs here which applies to all future
> user engines (xe_engine) has the same requirement as the sched_prop set
> directly to user engine (xe_engine) through set_properly ioctl?
> ie., shoudln't the requirement be same in job_timeout_store() and
> engine_set_job_timeout()?
> 
> Niranjana
> 
> > Matt
> > 
> > >  	u32 timeout;
> > >  	int err;
> > > 
> > > @@ -51,6 +146,10 @@ static ssize_t job_timeout_store(struct kobject *kobj,
> > >  	if (err)
> > >  		return err;
> > > 
> > > +	if (enforce_schedule_limit() &&
> > > +	    !engine_timeout_in_range(timeout, min, max))
> > > +		return -EINVAL;
> > > +
> > >  	WRITE_ONCE(eclass->sched_props.job_timeout_ms, timeout);
> > > 
> > >  	return count;
> > > @@ -78,11 +177,40 @@ static ssize_t job_timeout_default(struct kobject *kobj,
> > >  static struct kobj_attribute job_timeout_def =
> > >  __ATTR(job_timeout_ms, 0444, job_timeout_default, NULL);
> > > 
> > > +static ssize_t job_timeout_min_default(struct kobject *kobj,
> > > +				       struct kobj_attribute *attr, char *buf)
> > > +{
> > > +	struct xe_hw_engine_class_intf *eclass = kobj_to_eclass(kobj->parent);
> > > +
> > > +	return sprintf(buf, "%u\n", eclass->defaults.job_timeout_min);
> > > +}
> > > +
> > > +static struct kobj_attribute job_timeout_min_def =
> > > +__ATTR(job_timeout_min, 0444, job_timeout_min_default, NULL);
> > > +
> > > +static ssize_t job_timeout_max_default(struct kobject *kobj,
> > > +				       struct kobj_attribute *attr, char *buf)
> > > +{
> > > +	struct xe_hw_engine_class_intf *eclass = kobj_to_eclass(kobj->parent);
> > > +
> > > +	return sprintf(buf, "%u\n", eclass->defaults.job_timeout_max);
> > > +}
> > > +
> > > +static struct kobj_attribute job_timeout_max_def =
> > > +__ATTR(job_timeout_max, 0444, job_timeout_max_default, NULL);
> > > +
> > >  static ssize_t timeslice_duration_store(struct kobject *kobj,
> > >  					struct kobj_attribute *attr,
> > >  					const char *buf, size_t count)
> > >  {
> > >  	struct xe_hw_engine_class_intf *eclass = kobj_to_eclass(kobj);
> > > +#if IS_ENABLED(CONFIG_DRM_XE_ENABLE_SCHEDTIMEOUT_LIMIT)
> > > +	u32 min = XE_HW_ENGINE_TIMESLICE_MIN;
> > > +	u32 max = XE_HW_ENGINE_TIMESLICE_MAX;
> > > +#else
> > > +	u32 min = e->hwe->eclass->sched_props.timeslice_min;
> > > +	u32 max = e->hwe->eclass->sched_props.timeslice_max;
> > > +#endif
> > >  	u32 duration;
> > >  	int err;
> > > 
> > > @@ -90,11 +218,92 @@ static ssize_t timeslice_duration_store(struct kobject *kobj,
> > >  	if (err)
> > >  		return err;
> > > 
> > > +	if (enforce_schedule_limit() &&
> > > +	    !engine_timeout_in_range(duration, min, max))
> > > +		return -EINVAL;
> > > +
> > >  	WRITE_ONCE(eclass->sched_props.timeslice_us, duration);
> > > 
> > >  	return count;
> > >  }
> > > 
> > > +static ssize_t timeslice_duration_max_store(struct kobject *kobj,
> > > +					    struct kobj_attribute *attr,
> > > +					    const char *buf, size_t count)
> > > +{
> > > +	struct xe_hw_engine_class_intf *eclass = kobj_to_eclass(kobj);
> > > +	u32 duration;
> > > +	int err;
> > > +
> > > +	err = kstrtou32(buf, 0, &duration);
> > > +	if (err)
> > > +		return err;
> > > +
> > > +	if (duration < eclass->sched_props.timeslice_min)
> > > +		return -EINVAL;
> > > +
> > > +	if (enforce_schedule_limit() &&
> > > +	    !engine_timeout_in_range(duration,
> > > +				     XE_HW_ENGINE_TIMESLICE_MIN,
> > > +				     XE_HW_ENGINE_TIMESLICE_MAX))
> > > +		return -EINVAL;
> > > +
> > > +	WRITE_ONCE(eclass->sched_props.timeslice_max, duration);
> > > +
> > > +	return count;
> > > +}
> > > +
> > > +static ssize_t timeslice_duration_max_show(struct kobject *kobj,
> > > +					   struct kobj_attribute *attr,
> > > +					   char *buf)
> > > +{
> > > +	struct xe_hw_engine_class_intf *eclass = kobj_to_eclass(kobj);
> > > +
> > > +	return sprintf(buf, "%u\n", eclass->sched_props.timeslice_max);
> > > +}
> > > +
> > > +static struct kobj_attribute timeslice_duration_max_attr =
> > > +	__ATTR(timeslice_duration_max, 0644, timeslice_duration_max_show,
> > > +	       timeslice_duration_max_store);
> > > +
> > > +static ssize_t timeslice_duration_min_store(struct kobject *kobj,
> > > +					    struct kobj_attribute *attr,
> > > +					    const char *buf, size_t count)
> > > +{
> > > +	struct xe_hw_engine_class_intf *eclass = kobj_to_eclass(kobj);
> > > +	u32 duration;
> > > +	int err;
> > > +
> > > +	err = kstrtou32(buf, 0, &duration);
> > > +	if (err)
> > > +		return err;
> > > +
> > > +	if (duration > eclass->sched_props.timeslice_max)
> > > +		return -EINVAL;
> > > +
> > > +	if (enforce_schedule_limit() &&
> > > +	    !engine_timeout_in_range(duration,
> > > +				     XE_HW_ENGINE_TIMESLICE_MIN,
> > > +				     XE_HW_ENGINE_TIMESLICE_MAX))
> > > +		return -EINVAL;
> > > +
> > > +	WRITE_ONCE(eclass->sched_props.timeslice_min, duration);
> > > +
> > > +	return count;
> > > +}
> > > +
> > > +static ssize_t timeslice_duration_min_show(struct kobject *kobj,
> > > +					   struct kobj_attribute *attr, char *buf)
> > > +{
> > > +	struct xe_hw_engine_class_intf *eclass = kobj_to_eclass(kobj);
> > > +
> > > +	return sprintf(buf, "%u\n", eclass->sched_props.timeslice_min);
> > > +}
> > > +
> > > +static struct kobj_attribute timeslice_duration_min_attr =
> > > +	__ATTR(timeslice_duration_min, 0644, timeslice_duration_min_show,
> > > +	       timeslice_duration_min_store);
> > > +
> > >  static ssize_t timeslice_duration_show(struct kobject *kobj,
> > >  		struct kobj_attribute *attr, char *buf)
> > >  {
> > > @@ -118,11 +327,40 @@ static ssize_t timeslice_default(struct kobject *kobj,
> > >  static struct kobj_attribute timeslice_duration_def =
> > >  __ATTR(timeslice_duration_us, 0444, timeslice_default, NULL);
> > > 
> > > +static ssize_t timeslice_min_default(struct kobject *kobj,
> > > +				     struct kobj_attribute *attr, char *buf)
> > > +{
> > > +	struct xe_hw_engine_class_intf *eclass = kobj_to_eclass(kobj->parent);
> > > +
> > > +	return sprintf(buf, "%u\n", eclass->defaults.timeslice_min);
> > > +}
> > > +
> > > +static struct kobj_attribute timeslice_duration_min_def =
> > > +__ATTR(timeslice_duration_min, 0444, timeslice_min_default, NULL);
> > > +
> > > +static ssize_t timeslice_max_default(struct kobject *kobj,
> > > +				     struct kobj_attribute *attr, char *buf)
> > > +{
> > > +	struct xe_hw_engine_class_intf *eclass = kobj_to_eclass(kobj->parent);
> > > +
> > > +	return sprintf(buf, "%u\n", eclass->defaults.timeslice_max);
> > > +}
> > > +
> > > +static struct kobj_attribute timeslice_duration_max_def =
> > > +__ATTR(timeslice_duration_max, 0444, timeslice_max_default, NULL);
> > > +
> > >  static ssize_t preempt_timeout_store(struct kobject *kobj,
> > >  				     struct kobj_attribute *attr,
> > >  				     const char *buf, size_t count)
> > >  {
> > >  	struct xe_hw_engine_class_intf *eclass = kobj_to_eclass(kobj);
> > > +#if IS_ENABLED(CONFIG_DRM_XE_ENABLE_SCHEDTIMEOUT_LIMIT)
> > > +	u32 min = XE_HW_ENGINE_PREEMPT_TIMEOUT_MIN;
> > > +	u32 max = XE_HW_ENGINE_PREEMPT_TIMEOUT_MAX;
> > > +#else
> > > +	u32 min = e->hwe->eclass->sched_props.preempt_timeout_min;
> > > +	u32 max = e->hwe->eclass->sched_props.preempt_timeout_max;
> > > +#endif
> > >  	u32 timeout;
> > >  	int err;
> > > 
> > > @@ -130,6 +368,10 @@ static ssize_t preempt_timeout_store(struct kobject *kobj,
> > >  	if (err)
> > >  		return err;
> > > 
> > > +	if (enforce_schedule_limit() &&
> > > +	    !engine_timeout_in_range(timeout, min, max))
> > > +		return -EINVAL;
> > > +
> > >  	WRITE_ONCE(eclass->sched_props.preempt_timeout_us, timeout);
> > > 
> > >  	return count;
> > > @@ -158,17 +400,129 @@ static ssize_t preempt_timeout_default(struct kobject *kobj,
> > >  static struct kobj_attribute preempt_timeout_def =
> > >  __ATTR(preempt_timeout_us, 0444, preempt_timeout_default, NULL);
> > > 
> > > +static ssize_t preempt_timeout_min_default(struct kobject *kobj,
> > > +					   struct kobj_attribute *attr,
> > > +					   char *buf)
> > > +{
> > > +	struct xe_hw_engine_class_intf *eclass = kobj_to_eclass(kobj->parent);
> > > +
> > > +	return sprintf(buf, "%u\n", eclass->defaults.preempt_timeout_min);
> > > +}
> > > +
> > > +static struct kobj_attribute preempt_timeout_min_def =
> > > +__ATTR(preempt_timeout_min, 0444, preempt_timeout_min_default, NULL);
> > > +
> > > +static ssize_t preempt_timeout_max_default(struct kobject *kobj,
> > > +					   struct kobj_attribute *attr,
> > > +					   char *buf)
> > > +{
> > > +	struct xe_hw_engine_class_intf *eclass = kobj_to_eclass(kobj->parent);
> > > +
> > > +	return sprintf(buf, "%u\n", eclass->defaults.preempt_timeout_max);
> > > +}
> > > +
> > > +static struct kobj_attribute preempt_timeout_max_def =
> > > +__ATTR(preempt_timeout_max, 0444, preempt_timeout_max_default, NULL);
> > > +
> > > +static ssize_t preempt_timeout_max_store(struct kobject *kobj,
> > > +					 struct kobj_attribute *attr,
> > > +					 const char *buf, size_t count)
> > > +{
> > > +	struct xe_hw_engine_class_intf *eclass = kobj_to_eclass(kobj);
> > > +	u32 timeout;
> > > +	int err;
> > > +
> > > +	err = kstrtou32(buf, 0, &timeout);
> > > +	if (err)
> > > +		return err;
> > > +
> > > +	if (timeout < eclass->sched_props.preempt_timeout_min)
> > > +		return -EINVAL;
> > > +
> > > +	if (enforce_schedule_limit() &&
> > > +	    !engine_timeout_in_range(timeout,
> > > +				     XE_HW_ENGINE_PREEMPT_TIMEOUT_MIN,
> > > +				     XE_HW_ENGINE_PREEMPT_TIMEOUT_MAX))
> > > +		return -EINVAL;
> > > +
> > > +	WRITE_ONCE(eclass->sched_props.preempt_timeout_max, timeout);
> > > +
> > > +	return count;
> > > +}
> > > +
> > > +static ssize_t preempt_timeout_max_show(struct kobject *kobj,
> > > +					struct kobj_attribute *attr, char *buf)
> > > +{
> > > +	struct xe_hw_engine_class_intf *eclass = kobj_to_eclass(kobj);
> > > +
> > > +	return sprintf(buf, "%u\n", eclass->sched_props.preempt_timeout_max);
> > > +}
> > > +
> > > +static struct kobj_attribute preempt_timeout_max_attr =
> > > +	__ATTR(preempt_timeout_max, 0644, preempt_timeout_max_show,
> > > +	       preempt_timeout_max_store);
> > > +
> > > +static ssize_t preempt_timeout_min_store(struct kobject *kobj,
> > > +					 struct kobj_attribute *attr,
> > > +					 const char *buf, size_t count)
> > > +{
> > > +	struct xe_hw_engine_class_intf *eclass = kobj_to_eclass(kobj);
> > > +	u32 timeout;
> > > +	int err;
> > > +
> > > +	err = kstrtou32(buf, 0, &timeout);
> > > +	if (err)
> > > +		return err;
> > > +
> > > +	if (timeout > eclass->sched_props.preempt_timeout_max)
> > > +		return -EINVAL;
> > > +
> > > +	if (enforce_schedule_limit() &&
> > > +	    !engine_timeout_in_range(timeout,
> > > +				     XE_HW_ENGINE_PREEMPT_TIMEOUT_MIN,
> > > +				     XE_HW_ENGINE_PREEMPT_TIMEOUT_MAX))
> > > +		return -EINVAL;
> > > +
> > > +	WRITE_ONCE(eclass->sched_props.preempt_timeout_min, timeout);
> > > +
> > > +	return count;
> > > +}
> > > +
> > > +static ssize_t preempt_timeout_min_show(struct kobject *kobj,
> > > +					struct kobj_attribute *attr, char *buf)
> > > +{
> > > +	struct xe_hw_engine_class_intf *eclass = kobj_to_eclass(kobj);
> > > +
> > > +	return sprintf(buf, "%u\n", eclass->sched_props.preempt_timeout_min);
> > > +}
> > > +
> > > +static struct kobj_attribute preempt_timeout_min_attr =
> > > +	__ATTR(preempt_timeout_min, 0644, preempt_timeout_min_show,
> > > +	       preempt_timeout_min_store);
> > > +
> > >  static const struct attribute *defaults[] = {
> > >  	&job_timeout_def.attr,
> > > +	&job_timeout_min_def.attr,
> > > +	&job_timeout_max_def.attr,
> > >  	&timeslice_duration_def.attr,
> > > +	&timeslice_duration_min_def.attr,
> > > +	&timeslice_duration_max_def.attr,
> > >  	&preempt_timeout_def.attr,
> > > +	&preempt_timeout_min_def.attr,
> > > +	&preempt_timeout_max_def.attr,
> > >  	NULL
> > >  };
> > > 
> > >  static const struct attribute *files[] = {
> > >  	&job_timeout_attr.attr,
> > > +	&job_timeout_min_attr.attr,
> > > +	&job_timeout_max_attr.attr,
> > >  	&timeslice_duration_attr.attr,
> > > +	&timeslice_duration_min_attr.attr,
> > > +	&timeslice_duration_max_attr.attr,
> > >  	&preempt_timeout_attr.attr,
> > > +	&preempt_timeout_min_attr.attr,
> > > +	&preempt_timeout_max_attr.attr,
> > >  	NULL
> > >  };
> > > 
> > > diff --git a/drivers/gpu/drm/xe/xe_hw_engine_class_sysfs.h b/drivers/gpu/drm/xe/xe_hw_engine_class_sysfs.h
> > > index 757136614672..2e2ab351a991 100644
> > > --- a/drivers/gpu/drm/xe/xe_hw_engine_class_sysfs.h
> > > +++ b/drivers/gpu/drm/xe/xe_hw_engine_class_sysfs.h
> > > @@ -10,6 +10,8 @@
> > > 
> > >  #define MAX_ENGINE_CLASS_NAME_LEN    16
> > >  int xe_hw_engine_class_sysfs_init(struct xe_gt *gt);
> > > +bool enforce_schedule_limit(void);
> > > +bool engine_timeout_in_range(u64 timeout, u64 min, u64 max);
> > > 
> > >  /**
> > >   * struct kobj_eclass - A eclass's kobject struct that connects the kobject and the
> > > --
> > > 2.25.1
> > > 

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

* Re: [Intel-xe] [PATCH V9 6/6] drm/xe: Add min/max cap for engine scheduler properties
  2023-07-28  5:04       ` Matthew Brost
@ 2023-07-28  5:54         ` Upadhyay, Tejas
  2023-07-28  6:25           ` Niranjana Vishwanathapura
  0 siblings, 1 reply; 30+ messages in thread
From: Upadhyay, Tejas @ 2023-07-28  5:54 UTC (permalink / raw)
  To: Brost, Matthew, Vishwanathapura, Niranjana; +Cc: intel-xe@lists.freedesktop.org



> -----Original Message-----
> From: Brost, Matthew <matthew.brost@intel.com>
> Sent: Friday, July 28, 2023 10:35 AM
> To: Vishwanathapura, Niranjana <niranjana.vishwanathapura@intel.com>
> Cc: Upadhyay, Tejas <tejas.upadhyay@intel.com>; intel-
> xe@lists.freedesktop.org
> Subject: Re: [PATCH V9 6/6] drm/xe: Add min/max cap for engine scheduler
> properties
> 
> On Thu, Jul 27, 2023 at 09:44:23PM -0700, Niranjana Vishwanathapura
> wrote:
> > On Thu, Jul 27, 2023 at 03:26:49PM +0000, Matthew Brost wrote:
> > > On Thu, Jul 27, 2023 at 01:52:35PM +0530, Tejas Upadhyay wrote:
> > > > Add sysfs entries for the min, max, and defaults for each of
> > > > engine scheduler controls for every hardware engine class.
> > > >
> > > > Non-elevated user IOCTLs to set these controls must be within the
> > > > min-max ranges of the sysfs entries, elevated user can set these
> > > > controls to any value. However, introduced compile time CONFIG
> > > > min-max values which restricts elevated user to be in compile time
> > > > min-max range if at all sysfs min/max are violated.
> > > >
> > > > Sysfs entries examples are,
> > > > DUT# cat /sys/class/drm/cardX/device/tileN/gtN/engines/ccs/.defaults/
> > > > job_timeout_max         job_timeout_ms          preempt_timeout_min
> timeslice_duration_max  timeslice_duration_us
> > > > job_timeout_min         preempt_timeout_max     preempt_timeout_us
> timeslice_duration_min
> > > >
> > > > DUT# cat /sys/class/drm/card1/device/tileN/gtN/engines/ccs/
> > > > .defaults/              job_timeout_min         preempt_timeout_max
> preempt_timeout_us      timeslice_duration_min
> > > > job_timeout_max         job_timeout_ms          preempt_timeout_min
> timeslice_duration_max  timeslice_duration_us
> > > >
> > > > V9 :
> > > >    - Rebase to use s/xe_engine/xe_hw_engine/ - Matt
> > > > V8 :
> > > >    - fix enforce_sched_limit and avoid code duplication - Niranjana
> > > >    - Make sure min < max - Niranjana
> > > > V7 :
> > > >    - Rebase to replace hw engine with eclass interface
> > > >    - return EINVAL in place of EPERM
> > > >    - Use some APIs to avoid code duplication
> > > > V6 :
> > > >    - Rebase changes to reflect per engine class props interface - MattB
> > > >    - Use #if ENABLED - MattB
> > > >    - Remove MAX_SCHED_TIMEOUT check as range validation is enough
> > > > V5 :
> > > >    - Rebase to resolve conflicts - CI
> > > > V4 :
> > > >    - Rebase
> > > >    - Update commit to reflect tile addition
> > > >    - Use XE_HW macro directly as they are already filtered
> > > >      for CONFIG checks - Niranjana
> > > >    - Add CONFIG for enable/disable min/max limitation
> > > >      on elevated user. Default is enable - Matt/Joonas
> > > > V3 :
> > > >    - Resolve CI hooks warning for kernel-doc
> > > > V2 :
> > > >    - Restric min/max setting to #define default min/max for
> > > >      elevated user - Himal
> > > >    - Remove unrelated changes from patch - Niranjana
> > > >
> > > > Signed-off-by: Tejas Upadhyay <tejas.upadhyay@intel.com>
> > > > ---
> > > >  drivers/gpu/drm/xe/Kconfig                    |   6 +
> > > >  drivers/gpu/drm/xe/Kconfig.profile            |  46 +++
> > > >  drivers/gpu/drm/xe/xe_engine.c                |  25 +-
> > > >  drivers/gpu/drm/xe/xe_hw_engine.c             |   8 +
> > > >  drivers/gpu/drm/xe/xe_hw_engine.h             |  31 ++
> > > >  drivers/gpu/drm/xe/xe_hw_engine_class_sysfs.c | 354
> ++++++++++++++++++
> > > >  drivers/gpu/drm/xe/xe_hw_engine_class_sysfs.h |   2 +
> > > >  7 files changed, 466 insertions(+), 6 deletions(-)  create mode
> > > > 100644 drivers/gpu/drm/xe/Kconfig.profile
> > > >
> > > > diff --git a/drivers/gpu/drm/xe/Kconfig
> > > > b/drivers/gpu/drm/xe/Kconfig index d44794f99338..0a4ea965645b
> > > > 100644
> > > > --- a/drivers/gpu/drm/xe/Kconfig
> > > > +++ b/drivers/gpu/drm/xe/Kconfig
> > > > @@ -83,3 +83,9 @@ depends on DRM_XE  depends on EXPERT  source
> > > > "drivers/gpu/drm/xe/Kconfig.debug"
> > > >  endmenu
> > > > +
> > > > +menu "drm/xe Profile Guided Optimisation"
> > > > +	visible if EXPERT
> > > > +	depends on DRM_XE
> > > > +	source "drivers/gpu/drm/xe/Kconfig.profile"
> > > > +endmenu
> > > > diff --git a/drivers/gpu/drm/xe/Kconfig.profile
> > > > b/drivers/gpu/drm/xe/Kconfig.profile
> > > > new file mode 100644
> > > > index 000000000000..e72f15ec4bf6
> > > > --- /dev/null
> > > > +++ b/drivers/gpu/drm/xe/Kconfig.profile
> > > > @@ -0,0 +1,46 @@
> > > > +config DRM_XE_JOB_TIMEOUT_MAX
> > > > +       int "Default max job timeout (ms)"
> > > > +       default 10000 # milliseconds
> > > > +       help
> > > > +         Configures the default max job timeout after which job will
> > > > +         be forcefully taken away from scheduler.
> > > > +config DRM_XE_JOB_TIMEOUT_MIN
> > > > +       int "Default max job timeout (ms)"
> > > > +       default 1 # milliseconds
> > > > +       help
> > > > +         Configures the default min job timeout after which job will
> > > > +         be forcefully taken away from scheduler.
> > > > +config DRM_XE_TIMESLICE_MAX
> > > > +       int "Default max timeslice duration (us)"
> > > > +       default 10000000 # microseconds
> > > > +       help
> > > > +         Configures the default max timeslice duration between multiple
> > > > +         contexts by guc scheduling.
> > > > +config DRM_XE_TIMESLICE_MIN
> > > > +       int "Default min timeslice duration (us)"
> > > > +       default 1 # microseconds
> > > > +       help
> > > > +         Configures the default min timeslice duration between multiple
> > > > +         contexts by guc scheduling.
> > > > +config DRM_XE_PREEMPT_TIMEOUT_MAX
> > > > +       int "Default max  preempt timeout (us)"
> > > > +       default 10000000 # microseconds
> > > > +       help
> > > > +         Configures the default max preempt timeout after which context
> > > > +         will be forcefully taken away and higher priority context will
> > > > +         run.
> > > > +config DRM_XE_PREEMPT_TIMEOUT_MIN
> > > > +       int "Default min  preempt timeout (us)"
> > > > +       default 1 # microseconds
> > > > +       help
> > > > +         Configures the default min preempt timeout after which context
> > > > +         will be forcefully taken away and higher priority context will
> > > > +         run.
> > > > +config DRM_XE_ENABLE_SCHEDTIMEOUT_LIMIT
> > > > +       bool "Default configuration of limitation on scheduler timeout"
> > > > +       default y
> > > > +       help
> > > > +	 Configures the enablement of limitation on scheduler timeout
> > > > +	 to apply to applicable user. For elevated user, all above MIN
> > > > +	 and MAX values will apply when this configuration is enable to
> > > > +	 apply limitation. By default limitation is applied.
> > > > diff --git a/drivers/gpu/drm/xe/xe_engine.c
> > > > b/drivers/gpu/drm/xe/xe_engine.c index 9e167b113963..d934196eb79f
> > > > 100644
> > > > --- a/drivers/gpu/drm/xe/xe_engine.c
> > > > +++ b/drivers/gpu/drm/xe/xe_engine.c
> > > > @@ -13,6 +13,7 @@
> > > >
> > > >  #include "xe_device.h"
> > > >  #include "xe_gt.h"
> > > > +#include "xe_hw_engine_class_sysfs.h"
> > > >  #include "xe_hw_fence.h"
> > > >  #include "xe_lrc.h"
> > > >  #include "xe_macros.h"
> > > > @@ -191,8 +192,12 @@ static int engine_set_priority(struct
> > > > xe_device *xe, struct xe_engine *e,  static int
> engine_set_timeslice(struct xe_device *xe, struct xe_engine *e,
> > > >  				u64 value, bool create)
> > > >  {
> > > > -	if (!capable(CAP_SYS_NICE))
> > > > -		return -EPERM;
> > > > +	u32 min = e->hwe->eclass->sched_props.timeslice_min;
> > > > +	u32 max = e->hwe->eclass->sched_props.timeslice_max;
> > >
> > > So I screwed this up in my last comment, sorry.
> > >
> > > min = cap_nice ? KConfig option for min :
> > > e->hwe->eclass->sched_props.timeslice_min;
> > > same logic for max;
> > >
> > > Probably add helper for this.
> > >
> > > > +
> > > > +	if (enforce_schedule_limit() &&
> > > > +	    !engine_timeout_in_range(value, min, max))
> > >
> > > Then I think logic works too...
> > >
> > > if cap nice && !Kconfig option to enfore limits (enforce_schedule_limit
> returns false):
> > > 	user can do whatever
> > > else if cap nice
> > > 	user within Kconfig range
> > > else
> > > 	user within sysfs range
> > >
> > > This is what we want in the end.
> > >
> >
> > Matt, I think this is exactly what the previous revision of the patch was
> doing.
> >
> 
> No... Previous version
> 
> min = Kconfig option to enfore limits ? KConfig option for min : e->hwe-
> >eclass->sched_props.timeslice_min
> same for max
> 
> Results in:
> 
> if cap nice && !Kconfig option to enfore limits (enforce_schedule_limit
> returns false):
> 	user can do whatever
> else if cap_nice || Kconfig option to enfore limit
> 	user within Kconfig range
> else
>  	user within sysfs range
> 
> !cap_nice && Kconfig option to enfore limits == user within Kconfig range
> (previously) !cap_nice && Kconfig option to enfore limits == user within sysfs
> range (my suggestion)

In previous version we can achieve it by just adding one below check right?
#if IS_ENABLED(CONFIG_DRM_XE_ENABLE_SCHEDTIMEOUT_LIMIT) && cap_nice
+       u32 min = XE_HW_ENGINE_TIMESLICE_MIN;
+       u32 max = XE_HW_ENGINE_TIMESLICE_MAX;
+#else
+       u32 min = e->hwe->eclass->sched_props.timeslice_min;
+       u32 max = e->hwe->eclass->sched_props.timeslice_max;
+#endif

Please let me know!

> 
> The logic is different and I believe we want what I'm suggesting.
> 
> Matt
> 
> > > > +		return -EINVAL;
> > > >
> > > >  	return e->ops->set_timeslice(e, value);  } @@ -201,8 +206,12 @@
> > > > static int engine_set_preemption_timeout(struct xe_device *xe,
> > > >  					 struct xe_engine *e, u64 value,
> > > >  					 bool create)
> > > >  {
> > > > -	if (!capable(CAP_SYS_NICE))
> > > > -		return -EPERM;
> > > > +	u32 min = e->hwe->eclass->sched_props.preempt_timeout_min;
> > > > +	u32 max = e->hwe->eclass->sched_props.preempt_timeout_max;
> > > > +
> > > > +	if (enforce_schedule_limit() &&
> > > > +	    !engine_timeout_in_range(value, min, max))
> > > > +		return -EINVAL;
> > > >
> > > >  	return e->ops->set_preempt_timeout(e, value);  } @@ -266,11
> > > > +275,15 @@ static int engine_set_persistence(struct xe_device *xe,
> > > > struct xe_engine *e,  static int engine_set_job_timeout(struct xe_device
> *xe, struct xe_engine *e,
> > > >  				  u64 value, bool create)
> > > >  {
> > > > +	u32 min = e->hwe->eclass->sched_props.job_timeout_min;
> > > > +	u32 max = e->hwe->eclass->sched_props.job_timeout_max;
> > > > +
> > > >  	if (XE_IOCTL_DBG(xe, !create))
> > > >  		return -EINVAL;
> > > >
> > > > -	if (!capable(CAP_SYS_NICE))
> > > > -		return -EPERM;
> > > > +	if (enforce_schedule_limit() &&
> > > > +	    !engine_timeout_in_range(value, min, max))
> > > > +		return -EINVAL;
> > > >
> > > >  	return e->ops->set_job_timeout(e, value);  } diff --git
> > > > a/drivers/gpu/drm/xe/xe_hw_engine.c
> > > > b/drivers/gpu/drm/xe/xe_hw_engine.c
> > > > index afa7d25c3852..e601bffe3b13 100644
> > > > --- a/drivers/gpu/drm/xe/xe_hw_engine.c
> > > > +++ b/drivers/gpu/drm/xe/xe_hw_engine.c
> > > > @@ -364,8 +364,16 @@ static void hw_engine_init_early(struct xe_gt
> > > > *gt, struct xe_hw_engine *hwe,
> > > >
> > > >  	if (!gt->eclass[hwe->class].sched_props.job_timeout_ms) {
> > > >  		gt->eclass[hwe->class].sched_props.job_timeout_ms = HZ *
> 5;
> > > > +		gt->eclass[hwe->class].sched_props.job_timeout_min =
> XE_HW_ENGINE_JOB_TIMEOUT_MIN;
> > > > +		gt->eclass[hwe->class].sched_props.job_timeout_max =
> > > > +XE_HW_ENGINE_JOB_TIMEOUT_MAX;
> > > >  		gt->eclass[hwe->class].sched_props.timeslice_us = 1 * 1000;
> > > > +		gt->eclass[hwe->class].sched_props.timeslice_min =
> XE_HW_ENGINE_TIMESLICE_MIN;
> > > > +		gt->eclass[hwe->class].sched_props.timeslice_max =
> > > > +XE_HW_ENGINE_TIMESLICE_MAX;
> > > >  		gt->eclass[hwe->class].sched_props.preempt_timeout_us =
> 640 *
> > > > 1000;
> > > > +		gt->eclass[hwe->class].sched_props.preempt_timeout_min =
> > > > +
> 	XE_HW_ENGINE_PREEMPT_TIMEOUT_MIN;
> > > > +		gt->eclass[hwe->class].sched_props.preempt_timeout_max =
> > > > +
> 	XE_HW_ENGINE_PREEMPT_TIMEOUT_MAX;
> > > >  		/* Record default props */
> > > >  		gt->eclass[hwe->class].defaults = gt->eclass[hwe-
> >class].sched_props;
> > > >  	}
> > > > diff --git a/drivers/gpu/drm/xe/xe_hw_engine.h
> > > > b/drivers/gpu/drm/xe/xe_hw_engine.h
> > > > index 7eca9d53c7b1..3d37d6d44261 100644
> > > > --- a/drivers/gpu/drm/xe/xe_hw_engine.h
> > > > +++ b/drivers/gpu/drm/xe/xe_hw_engine.h
> > > > @@ -10,6 +10,37 @@
> > > >
> > > >  struct drm_printer;
> > > >
> > > > +#ifdef CONFIG_DRM_XE_JOB_TIMEOUT_MIN #define
> > > > +XE_HW_ENGINE_JOB_TIMEOUT_MIN
> CONFIG_DRM_XE_JOB_TIMEOUT_MIN #else
> > > > +#define XE_HW_ENGINE_JOB_TIMEOUT_MIN 1 #endif #ifdef
> > > > +CONFIG_DRM_XE_JOB_TIMEOUT_MAX #define
> > > > +XE_HW_ENGINE_JOB_TIMEOUT_MAX
> CONFIG_DRM_XE_JOB_TIMEOUT_MAX #else
> > > > +#define XE_HW_ENGINE_JOB_TIMEOUT_MAX (10 * 1000) #endif #ifdef
> > > > +CONFIG_DRM_XE_TIMESLICE_MIN #define
> XE_HW_ENGINE_TIMESLICE_MIN
> > > > +CONFIG_DRM_XE_TIMESLICE_MIN #else #define
> > > > +XE_HW_ENGINE_TIMESLICE_MIN 1 #endif #ifdef
> > > > +CONFIG_DRM_XE_TIMESLICE_MAX #define
> XE_HW_ENGINE_TIMESLICE_MAX
> > > > +CONFIG_DRM_XE_TIMESLICE_MAX #else #define
> > > > +XE_HW_ENGINE_TIMESLICE_MAX (10 * 1000 * 1000) #endif #ifdef
> > > > +CONFIG_DRM_XE_PREEMPT_TIMEOUT_MIN
> > > > +#define XE_HW_ENGINE_PREEMPT_TIMEOUT_MIN
> > > > +CONFIG_DRM_XE_PREEMPT_TIMEOUT_MIN #else #define
> > > > +XE_HW_ENGINE_PREEMPT_TIMEOUT_MIN 1 #endif #ifdef
> > > > +CONFIG_DRM_XE_PREEMPT_TIMEOUT_MAX
> > > > +#define XE_HW_ENGINE_PREEMPT_TIMEOUT_MAX
> > > > +CONFIG_DRM_XE_PREEMPT_TIMEOUT_MAX #else #define
> > > > +XE_HW_ENGINE_PREEMPT_TIMEOUT_MAX (10 * 1000 * 1000) #endif
> > > > +
> > > >  int xe_hw_engines_init_early(struct xe_gt *gt);  int
> > > > xe_hw_engines_init(struct xe_gt *gt);  void
> > > > xe_hw_engine_handle_irq(struct xe_hw_engine *hwe, u16 intr_vec);
> > > > diff --git a/drivers/gpu/drm/xe/xe_hw_engine_class_sysfs.c
> > > > b/drivers/gpu/drm/xe/xe_hw_engine_class_sysfs.c
> > > > index 990bb675d1e0..2b7ac4e02db6 100644
> > > > --- a/drivers/gpu/drm/xe/xe_hw_engine_class_sysfs.c
> > > > +++ b/drivers/gpu/drm/xe/xe_hw_engine_class_sysfs.c
> > > > @@ -11,6 +11,20 @@
> > > >
> > > >  static int xe_add_hw_engine_class_defaults(struct kobject
> > > > *parent);
> > > >
> > > > +bool enforce_schedule_limit(void) { #if
> > > > +IS_ENABLED(CONFIG_DRM_XE_ENABLE_SCHEDTIMEOUT_LIMIT)
> > > > +	return true;
> > > > +#else
> > > > +	return !capable(CAP_SYS_NICE);
> > > > +#endif
> > > > +}
> > > > +
> > > > +bool engine_timeout_in_range(u64 timeout, u64 min, u64 max) {
> > > > +	return timeout >= min && timeout <= max; }
> > > > +
> > > >  static void kobj_xe_hw_engine_release(struct kobject *kobj)  {
> > > >  	kfree(kobj);
> > > > @@ -39,11 +53,92 @@ kobj_xe_hw_engine_class(struct kobject
> *parent, char *name)
> > > >  	return keclass;
> > > >  }
> > > >
> > > > +static ssize_t job_timeout_max_store(struct kobject *kobj,
> > > > +				     struct kobj_attribute *attr,
> > > > +				     const char *buf, size_t count) {
> > > > +	struct xe_hw_engine_class_intf *eclass = kobj_to_eclass(kobj);
> > > > +	u32 timeout;
> > > > +	int err;
> > > > +
> > > > +	err = kstrtou32(buf, 0, &timeout);
> > > > +	if (err)
> > > > +		return err;
> > > > +
> > > > +	if (timeout < eclass->sched_props.job_timeout_min)
> > > > +		return -EINVAL;
> > > > +
> > > > +	if (enforce_schedule_limit() &&
> > > > +	    !engine_timeout_in_range(timeout,
> > > > +				     XE_HW_ENGINE_JOB_TIMEOUT_MIN,
> > > > +				     XE_HW_ENGINE_JOB_TIMEOUT_MAX))
> > > > +		return -EINVAL;
> > > > +
> > > > +	WRITE_ONCE(eclass->sched_props.job_timeout_max, timeout);
> > > > +
> > > > +	return count;
> > > > +}
> > > > +
> > > > +static ssize_t job_timeout_max_show(struct kobject *kobj,
> > > > +				    struct kobj_attribute *attr, char *buf) {
> > > > +	struct xe_hw_engine_class_intf *eclass = kobj_to_eclass(kobj);
> > > > +
> > > > +	return sprintf(buf, "%u\n",
> > > > +eclass->sched_props.job_timeout_max);
> > > > +}
> > > > +
> > > > +static struct kobj_attribute job_timeout_max_attr =
> > > > +__ATTR(job_timeout_max, 0644, job_timeout_max_show,
> > > > +job_timeout_max_store);
> > > > +
> > > > +static ssize_t job_timeout_min_store(struct kobject *kobj,
> > > > +				     struct kobj_attribute *attr,
> > > > +				     const char *buf, size_t count) {
> > > > +	struct xe_hw_engine_class_intf *eclass = kobj_to_eclass(kobj);
> > > > +	u32 timeout;
> > > > +	int err;
> > > > +
> > > > +	err = kstrtou32(buf, 0, &timeout);
> > > > +	if (err)
> > > > +		return err;
> > > > +
> > > > +	if (timeout > eclass->sched_props.job_timeout_max)
> > > > +		return -EINVAL;
> > > > +
> > > > +	if (enforce_schedule_limit() &&
> > > > +	    !engine_timeout_in_range(timeout,
> > > > +				     XE_HW_ENGINE_JOB_TIMEOUT_MIN,
> > > > +				     XE_HW_ENGINE_JOB_TIMEOUT_MAX))
> > > > +		return -EINVAL;
> > > > +
> > > > +	WRITE_ONCE(eclass->sched_props.job_timeout_min, timeout);
> > > > +
> > > > +	return count;
> > > > +}
> > > > +
> > > > +static ssize_t job_timeout_min_show(struct kobject *kobj,
> > > > +				    struct kobj_attribute *attr, char *buf) {
> > > > +	struct xe_hw_engine_class_intf *eclass = kobj_to_eclass(kobj);
> > > > +
> > > > +	return sprintf(buf, "%u\n",
> > > > +eclass->sched_props.job_timeout_min);
> > > > +}
> > > > +
> > > > +static struct kobj_attribute job_timeout_min_attr =
> > > > +__ATTR(job_timeout_min, 0644, job_timeout_min_show,
> > > > +job_timeout_min_store);
> > > > +
> > > >  static ssize_t job_timeout_store(struct kobject *kobj,
> > > >  				 struct kobj_attribute *attr,
> > > >  				 const char *buf, size_t count)  {
> > > >  	struct xe_hw_engine_class_intf *eclass = kobj_to_eclass(kobj);
> > > > +#if IS_ENABLED(CONFIG_DRM_XE_ENABLE_SCHEDTIMEOUT_LIMIT)
> > > > +	u32 min = XE_HW_ENGINE_JOB_TIMEOUT_MIN;
> > > > +	u32 max = XE_HW_ENGINE_JOB_TIMEOUT_MAX; #else
> > > > +	u32 min = e->hwe->eclass->sched_props.job_timeout_min;
> > > > +	u32 max = e->hwe->eclass->sched_props.job_timeout_max;
> > > > +#endif
> > >
> > > I don't think we need this, just make sure default is within min /
> > > max of the sched_props.
> > >
> >
> > Shouldn't the sched_prop set through sysfs here which applies to all
> > future user engines (xe_engine) has the same requirement as the
> > sched_prop set directly to user engine (xe_engine) through set_properly
> ioctl?
> > ie., shoudln't the requirement be same in job_timeout_store() and
> > engine_set_job_timeout()?
> >
> > Niranjana
> >
> > > Matt
> > >
> > > >  	u32 timeout;
> > > >  	int err;
> > > >
> > > > @@ -51,6 +146,10 @@ static ssize_t job_timeout_store(struct kobject
> *kobj,
> > > >  	if (err)
> > > >  		return err;
> > > >
> > > > +	if (enforce_schedule_limit() &&
> > > > +	    !engine_timeout_in_range(timeout, min, max))
> > > > +		return -EINVAL;
> > > > +
> > > >  	WRITE_ONCE(eclass->sched_props.job_timeout_ms, timeout);
> > > >
> > > >  	return count;
> > > > @@ -78,11 +177,40 @@ static ssize_t job_timeout_default(struct
> > > > kobject *kobj,  static struct kobj_attribute job_timeout_def =
> > > > __ATTR(job_timeout_ms, 0444, job_timeout_default, NULL);
> > > >
> > > > +static ssize_t job_timeout_min_default(struct kobject *kobj,
> > > > +				       struct kobj_attribute *attr, char *buf) {
> > > > +	struct xe_hw_engine_class_intf *eclass =
> > > > +kobj_to_eclass(kobj->parent);
> > > > +
> > > > +	return sprintf(buf, "%u\n", eclass->defaults.job_timeout_min);
> > > > +}
> > > > +
> > > > +static struct kobj_attribute job_timeout_min_def =
> > > > +__ATTR(job_timeout_min, 0444, job_timeout_min_default, NULL);
> > > > +
> > > > +static ssize_t job_timeout_max_default(struct kobject *kobj,
> > > > +				       struct kobj_attribute *attr, char *buf) {
> > > > +	struct xe_hw_engine_class_intf *eclass =
> > > > +kobj_to_eclass(kobj->parent);
> > > > +
> > > > +	return sprintf(buf, "%u\n", eclass->defaults.job_timeout_max);
> > > > +}
> > > > +
> > > > +static struct kobj_attribute job_timeout_max_def =
> > > > +__ATTR(job_timeout_max, 0444, job_timeout_max_default, NULL);
> > > > +
> > > >  static ssize_t timeslice_duration_store(struct kobject *kobj,
> > > >  					struct kobj_attribute *attr,
> > > >  					const char *buf, size_t count)  {
> > > >  	struct xe_hw_engine_class_intf *eclass = kobj_to_eclass(kobj);
> > > > +#if IS_ENABLED(CONFIG_DRM_XE_ENABLE_SCHEDTIMEOUT_LIMIT)
> > > > +	u32 min = XE_HW_ENGINE_TIMESLICE_MIN;
> > > > +	u32 max = XE_HW_ENGINE_TIMESLICE_MAX; #else
> > > > +	u32 min = e->hwe->eclass->sched_props.timeslice_min;
> > > > +	u32 max = e->hwe->eclass->sched_props.timeslice_max;
> > > > +#endif
> > > >  	u32 duration;
> > > >  	int err;
> > > >
> > > > @@ -90,11 +218,92 @@ static ssize_t timeslice_duration_store(struct
> kobject *kobj,
> > > >  	if (err)
> > > >  		return err;
> > > >
> > > > +	if (enforce_schedule_limit() &&
> > > > +	    !engine_timeout_in_range(duration, min, max))
> > > > +		return -EINVAL;
> > > > +
> > > >  	WRITE_ONCE(eclass->sched_props.timeslice_us, duration);
> > > >
> > > >  	return count;
> > > >  }
> > > >
> > > > +static ssize_t timeslice_duration_max_store(struct kobject *kobj,
> > > > +					    struct kobj_attribute *attr,
> > > > +					    const char *buf, size_t count) {
> > > > +	struct xe_hw_engine_class_intf *eclass = kobj_to_eclass(kobj);
> > > > +	u32 duration;
> > > > +	int err;
> > > > +
> > > > +	err = kstrtou32(buf, 0, &duration);
> > > > +	if (err)
> > > > +		return err;
> > > > +
> > > > +	if (duration < eclass->sched_props.timeslice_min)
> > > > +		return -EINVAL;
> > > > +
> > > > +	if (enforce_schedule_limit() &&
> > > > +	    !engine_timeout_in_range(duration,
> > > > +				     XE_HW_ENGINE_TIMESLICE_MIN,
> > > > +				     XE_HW_ENGINE_TIMESLICE_MAX))
> > > > +		return -EINVAL;
> > > > +
> > > > +	WRITE_ONCE(eclass->sched_props.timeslice_max, duration);
> > > > +
> > > > +	return count;
> > > > +}
> > > > +
> > > > +static ssize_t timeslice_duration_max_show(struct kobject *kobj,
> > > > +					   struct kobj_attribute *attr,
> > > > +					   char *buf)
> > > > +{
> > > > +	struct xe_hw_engine_class_intf *eclass = kobj_to_eclass(kobj);
> > > > +
> > > > +	return sprintf(buf, "%u\n", eclass->sched_props.timeslice_max);
> > > > +}
> > > > +
> > > > +static struct kobj_attribute timeslice_duration_max_attr =
> > > > +	__ATTR(timeslice_duration_max, 0644,
> timeslice_duration_max_show,
> > > > +	       timeslice_duration_max_store);
> > > > +
> > > > +static ssize_t timeslice_duration_min_store(struct kobject *kobj,
> > > > +					    struct kobj_attribute *attr,
> > > > +					    const char *buf, size_t count) {
> > > > +	struct xe_hw_engine_class_intf *eclass = kobj_to_eclass(kobj);
> > > > +	u32 duration;
> > > > +	int err;
> > > > +
> > > > +	err = kstrtou32(buf, 0, &duration);
> > > > +	if (err)
> > > > +		return err;
> > > > +
> > > > +	if (duration > eclass->sched_props.timeslice_max)
> > > > +		return -EINVAL;
> > > > +
> > > > +	if (enforce_schedule_limit() &&
> > > > +	    !engine_timeout_in_range(duration,
> > > > +				     XE_HW_ENGINE_TIMESLICE_MIN,
> > > > +				     XE_HW_ENGINE_TIMESLICE_MAX))
> > > > +		return -EINVAL;
> > > > +
> > > > +	WRITE_ONCE(eclass->sched_props.timeslice_min, duration);
> > > > +
> > > > +	return count;
> > > > +}
> > > > +
> > > > +static ssize_t timeslice_duration_min_show(struct kobject *kobj,
> > > > +					   struct kobj_attribute *attr, char
> *buf) {
> > > > +	struct xe_hw_engine_class_intf *eclass = kobj_to_eclass(kobj);
> > > > +
> > > > +	return sprintf(buf, "%u\n", eclass->sched_props.timeslice_min);
> > > > +}
> > > > +
> > > > +static struct kobj_attribute timeslice_duration_min_attr =
> > > > +	__ATTR(timeslice_duration_min, 0644,
> timeslice_duration_min_show,
> > > > +	       timeslice_duration_min_store);
> > > > +
> > > >  static ssize_t timeslice_duration_show(struct kobject *kobj,
> > > >  		struct kobj_attribute *attr, char *buf)  { @@ -118,11 +327,40
> > > > @@ static ssize_t timeslice_default(struct kobject *kobj,  static
> > > > struct kobj_attribute timeslice_duration_def =
> > > > __ATTR(timeslice_duration_us, 0444, timeslice_default, NULL);
> > > >
> > > > +static ssize_t timeslice_min_default(struct kobject *kobj,
> > > > +				     struct kobj_attribute *attr, char *buf) {
> > > > +	struct xe_hw_engine_class_intf *eclass =
> > > > +kobj_to_eclass(kobj->parent);
> > > > +
> > > > +	return sprintf(buf, "%u\n", eclass->defaults.timeslice_min); }
> > > > +
> > > > +static struct kobj_attribute timeslice_duration_min_def =
> > > > +__ATTR(timeslice_duration_min, 0444, timeslice_min_default,
> > > > +NULL);
> > > > +
> > > > +static ssize_t timeslice_max_default(struct kobject *kobj,
> > > > +				     struct kobj_attribute *attr, char *buf) {
> > > > +	struct xe_hw_engine_class_intf *eclass =
> > > > +kobj_to_eclass(kobj->parent);
> > > > +
> > > > +	return sprintf(buf, "%u\n", eclass->defaults.timeslice_max); }
> > > > +
> > > > +static struct kobj_attribute timeslice_duration_max_def =
> > > > +__ATTR(timeslice_duration_max, 0444, timeslice_max_default,
> > > > +NULL);
> > > > +
> > > >  static ssize_t preempt_timeout_store(struct kobject *kobj,
> > > >  				     struct kobj_attribute *attr,
> > > >  				     const char *buf, size_t count)  {
> > > >  	struct xe_hw_engine_class_intf *eclass = kobj_to_eclass(kobj);
> > > > +#if IS_ENABLED(CONFIG_DRM_XE_ENABLE_SCHEDTIMEOUT_LIMIT)
> > > > +	u32 min = XE_HW_ENGINE_PREEMPT_TIMEOUT_MIN;
> > > > +	u32 max = XE_HW_ENGINE_PREEMPT_TIMEOUT_MAX; #else
> > > > +	u32 min = e->hwe->eclass->sched_props.preempt_timeout_min;
> > > > +	u32 max = e->hwe->eclass->sched_props.preempt_timeout_max;
> > > > +#endif
> > > >  	u32 timeout;
> > > >  	int err;
> > > >
> > > > @@ -130,6 +368,10 @@ static ssize_t preempt_timeout_store(struct
> kobject *kobj,
> > > >  	if (err)
> > > >  		return err;
> > > >
> > > > +	if (enforce_schedule_limit() &&
> > > > +	    !engine_timeout_in_range(timeout, min, max))
> > > > +		return -EINVAL;
> > > > +
> > > >  	WRITE_ONCE(eclass->sched_props.preempt_timeout_us, timeout);
> > > >
> > > >  	return count;
> > > > @@ -158,17 +400,129 @@ static ssize_t
> > > > preempt_timeout_default(struct kobject *kobj,  static struct
> > > > kobj_attribute preempt_timeout_def =  __ATTR(preempt_timeout_us,
> > > > 0444, preempt_timeout_default, NULL);
> > > >
> > > > +static ssize_t preempt_timeout_min_default(struct kobject *kobj,
> > > > +					   struct kobj_attribute *attr,
> > > > +					   char *buf)
> > > > +{
> > > > +	struct xe_hw_engine_class_intf *eclass =
> > > > +kobj_to_eclass(kobj->parent);
> > > > +
> > > > +	return sprintf(buf, "%u\n",
> > > > +eclass->defaults.preempt_timeout_min);
> > > > +}
> > > > +
> > > > +static struct kobj_attribute preempt_timeout_min_def =
> > > > +__ATTR(preempt_timeout_min, 0444, preempt_timeout_min_default,
> > > > +NULL);
> > > > +
> > > > +static ssize_t preempt_timeout_max_default(struct kobject *kobj,
> > > > +					   struct kobj_attribute *attr,
> > > > +					   char *buf)
> > > > +{
> > > > +	struct xe_hw_engine_class_intf *eclass =
> > > > +kobj_to_eclass(kobj->parent);
> > > > +
> > > > +	return sprintf(buf, "%u\n",
> > > > +eclass->defaults.preempt_timeout_max);
> > > > +}
> > > > +
> > > > +static struct kobj_attribute preempt_timeout_max_def =
> > > > +__ATTR(preempt_timeout_max, 0444,
> preempt_timeout_max_default,
> > > > +NULL);
> > > > +
> > > > +static ssize_t preempt_timeout_max_store(struct kobject *kobj,
> > > > +					 struct kobj_attribute *attr,
> > > > +					 const char *buf, size_t count) {
> > > > +	struct xe_hw_engine_class_intf *eclass = kobj_to_eclass(kobj);
> > > > +	u32 timeout;
> > > > +	int err;
> > > > +
> > > > +	err = kstrtou32(buf, 0, &timeout);
> > > > +	if (err)
> > > > +		return err;
> > > > +
> > > > +	if (timeout < eclass->sched_props.preempt_timeout_min)
> > > > +		return -EINVAL;
> > > > +
> > > > +	if (enforce_schedule_limit() &&
> > > > +	    !engine_timeout_in_range(timeout,
> > > > +
> XE_HW_ENGINE_PREEMPT_TIMEOUT_MIN,
> > > > +
> XE_HW_ENGINE_PREEMPT_TIMEOUT_MAX))
> > > > +		return -EINVAL;
> > > > +
> > > > +	WRITE_ONCE(eclass->sched_props.preempt_timeout_max, timeout);
> > > > +
> > > > +	return count;
> > > > +}
> > > > +
> > > > +static ssize_t preempt_timeout_max_show(struct kobject *kobj,
> > > > +					struct kobj_attribute *attr, char *buf)
> {
> > > > +	struct xe_hw_engine_class_intf *eclass = kobj_to_eclass(kobj);
> > > > +
> > > > +	return sprintf(buf, "%u\n",
> > > > +eclass->sched_props.preempt_timeout_max);
> > > > +}
> > > > +
> > > > +static struct kobj_attribute preempt_timeout_max_attr =
> > > > +	__ATTR(preempt_timeout_max, 0644, preempt_timeout_max_show,
> > > > +	       preempt_timeout_max_store);
> > > > +
> > > > +static ssize_t preempt_timeout_min_store(struct kobject *kobj,
> > > > +					 struct kobj_attribute *attr,
> > > > +					 const char *buf, size_t count) {
> > > > +	struct xe_hw_engine_class_intf *eclass = kobj_to_eclass(kobj);
> > > > +	u32 timeout;
> > > > +	int err;
> > > > +
> > > > +	err = kstrtou32(buf, 0, &timeout);
> > > > +	if (err)
> > > > +		return err;
> > > > +
> > > > +	if (timeout > eclass->sched_props.preempt_timeout_max)
> > > > +		return -EINVAL;
> > > > +
> > > > +	if (enforce_schedule_limit() &&
> > > > +	    !engine_timeout_in_range(timeout,
> > > > +
> XE_HW_ENGINE_PREEMPT_TIMEOUT_MIN,
> > > > +
> XE_HW_ENGINE_PREEMPT_TIMEOUT_MAX))
> > > > +		return -EINVAL;
> > > > +
> > > > +	WRITE_ONCE(eclass->sched_props.preempt_timeout_min, timeout);
> > > > +
> > > > +	return count;
> > > > +}
> > > > +
> > > > +static ssize_t preempt_timeout_min_show(struct kobject *kobj,
> > > > +					struct kobj_attribute *attr, char *buf)
> {
> > > > +	struct xe_hw_engine_class_intf *eclass = kobj_to_eclass(kobj);
> > > > +
> > > > +	return sprintf(buf, "%u\n",
> > > > +eclass->sched_props.preempt_timeout_min);
> > > > +}
> > > > +
> > > > +static struct kobj_attribute preempt_timeout_min_attr =
> > > > +	__ATTR(preempt_timeout_min, 0644, preempt_timeout_min_show,
> > > > +	       preempt_timeout_min_store);
> > > > +
> > > >  static const struct attribute *defaults[] = {
> > > >  	&job_timeout_def.attr,
> > > > +	&job_timeout_min_def.attr,
> > > > +	&job_timeout_max_def.attr,
> > > >  	&timeslice_duration_def.attr,
> > > > +	&timeslice_duration_min_def.attr,
> > > > +	&timeslice_duration_max_def.attr,
> > > >  	&preempt_timeout_def.attr,
> > > > +	&preempt_timeout_min_def.attr,
> > > > +	&preempt_timeout_max_def.attr,
> > > >  	NULL
> > > >  };
> > > >
> > > >  static const struct attribute *files[] = {
> > > >  	&job_timeout_attr.attr,
> > > > +	&job_timeout_min_attr.attr,
> > > > +	&job_timeout_max_attr.attr,
> > > >  	&timeslice_duration_attr.attr,
> > > > +	&timeslice_duration_min_attr.attr,
> > > > +	&timeslice_duration_max_attr.attr,
> > > >  	&preempt_timeout_attr.attr,
> > > > +	&preempt_timeout_min_attr.attr,
> > > > +	&preempt_timeout_max_attr.attr,
> > > >  	NULL
> > > >  };
> > > >
> > > > diff --git a/drivers/gpu/drm/xe/xe_hw_engine_class_sysfs.h
> > > > b/drivers/gpu/drm/xe/xe_hw_engine_class_sysfs.h
> > > > index 757136614672..2e2ab351a991 100644
> > > > --- a/drivers/gpu/drm/xe/xe_hw_engine_class_sysfs.h
> > > > +++ b/drivers/gpu/drm/xe/xe_hw_engine_class_sysfs.h
> > > > @@ -10,6 +10,8 @@
> > > >
> > > >  #define MAX_ENGINE_CLASS_NAME_LEN    16
> > > >  int xe_hw_engine_class_sysfs_init(struct xe_gt *gt);
> > > > +bool enforce_schedule_limit(void); bool
> > > > +engine_timeout_in_range(u64 timeout, u64 min, u64 max);
> > > >
> > > >  /**
> > > >   * struct kobj_eclass - A eclass's kobject struct that connects
> > > > the kobject and the
> > > > --
> > > > 2.25.1
> > > >

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

* Re: [Intel-xe] [PATCH V9 6/6] drm/xe: Add min/max cap for engine scheduler properties
  2023-07-28  5:54         ` Upadhyay, Tejas
@ 2023-07-28  6:25           ` Niranjana Vishwanathapura
  2023-07-28  7:36             ` Upadhyay, Tejas
  2023-07-28 14:20             ` Matthew Brost
  0 siblings, 2 replies; 30+ messages in thread
From: Niranjana Vishwanathapura @ 2023-07-28  6:25 UTC (permalink / raw)
  To: Upadhyay, Tejas; +Cc: intel-xe@lists.freedesktop.org

On Thu, Jul 27, 2023 at 10:54:42PM -0700, Upadhyay, Tejas wrote:
>
>
>> -----Original Message-----
>> From: Brost, Matthew <matthew.brost@intel.com>
>> Sent: Friday, July 28, 2023 10:35 AM
>> To: Vishwanathapura, Niranjana <niranjana.vishwanathapura@intel.com>
>> Cc: Upadhyay, Tejas <tejas.upadhyay@intel.com>; intel-
>> xe@lists.freedesktop.org
>> Subject: Re: [PATCH V9 6/6] drm/xe: Add min/max cap for engine scheduler
>> properties
>>
>> On Thu, Jul 27, 2023 at 09:44:23PM -0700, Niranjana Vishwanathapura
>> wrote:
>> > On Thu, Jul 27, 2023 at 03:26:49PM +0000, Matthew Brost wrote:
>> > > On Thu, Jul 27, 2023 at 01:52:35PM +0530, Tejas Upadhyay wrote:
>> > > > Add sysfs entries for the min, max, and defaults for each of
>> > > > engine scheduler controls for every hardware engine class.
>> > > >
>> > > > Non-elevated user IOCTLs to set these controls must be within the
>> > > > min-max ranges of the sysfs entries, elevated user can set these
>> > > > controls to any value. However, introduced compile time CONFIG
>> > > > min-max values which restricts elevated user to be in compile time
>> > > > min-max range if at all sysfs min/max are violated.
>> > > >
>> > > > Sysfs entries examples are,
>> > > > DUT# cat /sys/class/drm/cardX/device/tileN/gtN/engines/ccs/.defaults/
>> > > > job_timeout_max         job_timeout_ms          preempt_timeout_min
>> timeslice_duration_max  timeslice_duration_us
>> > > > job_timeout_min         preempt_timeout_max     preempt_timeout_us
>> timeslice_duration_min
>> > > >
>> > > > DUT# cat /sys/class/drm/card1/device/tileN/gtN/engines/ccs/
>> > > > .defaults/              job_timeout_min         preempt_timeout_max
>> preempt_timeout_us      timeslice_duration_min
>> > > > job_timeout_max         job_timeout_ms          preempt_timeout_min
>> timeslice_duration_max  timeslice_duration_us
>> > > >
>> > > > V9 :
>> > > >    - Rebase to use s/xe_engine/xe_hw_engine/ - Matt
>> > > > V8 :
>> > > >    - fix enforce_sched_limit and avoid code duplication - Niranjana
>> > > >    - Make sure min < max - Niranjana
>> > > > V7 :
>> > > >    - Rebase to replace hw engine with eclass interface
>> > > >    - return EINVAL in place of EPERM
>> > > >    - Use some APIs to avoid code duplication
>> > > > V6 :
>> > > >    - Rebase changes to reflect per engine class props interface - MattB
>> > > >    - Use #if ENABLED - MattB
>> > > >    - Remove MAX_SCHED_TIMEOUT check as range validation is enough
>> > > > V5 :
>> > > >    - Rebase to resolve conflicts - CI
>> > > > V4 :
>> > > >    - Rebase
>> > > >    - Update commit to reflect tile addition
>> > > >    - Use XE_HW macro directly as they are already filtered
>> > > >      for CONFIG checks - Niranjana
>> > > >    - Add CONFIG for enable/disable min/max limitation
>> > > >      on elevated user. Default is enable - Matt/Joonas
>> > > > V3 :
>> > > >    - Resolve CI hooks warning for kernel-doc
>> > > > V2 :
>> > > >    - Restric min/max setting to #define default min/max for
>> > > >      elevated user - Himal
>> > > >    - Remove unrelated changes from patch - Niranjana
>> > > >
>> > > > Signed-off-by: Tejas Upadhyay <tejas.upadhyay@intel.com>
>> > > > ---
>> > > >  drivers/gpu/drm/xe/Kconfig                    |   6 +
>> > > >  drivers/gpu/drm/xe/Kconfig.profile            |  46 +++
>> > > >  drivers/gpu/drm/xe/xe_engine.c                |  25 +-
>> > > >  drivers/gpu/drm/xe/xe_hw_engine.c             |   8 +
>> > > >  drivers/gpu/drm/xe/xe_hw_engine.h             |  31 ++
>> > > >  drivers/gpu/drm/xe/xe_hw_engine_class_sysfs.c | 354
>> ++++++++++++++++++
>> > > >  drivers/gpu/drm/xe/xe_hw_engine_class_sysfs.h |   2 +
>> > > >  7 files changed, 466 insertions(+), 6 deletions(-)  create mode
>> > > > 100644 drivers/gpu/drm/xe/Kconfig.profile
>> > > >
>> > > > diff --git a/drivers/gpu/drm/xe/Kconfig
>> > > > b/drivers/gpu/drm/xe/Kconfig index d44794f99338..0a4ea965645b
>> > > > 100644
>> > > > --- a/drivers/gpu/drm/xe/Kconfig
>> > > > +++ b/drivers/gpu/drm/xe/Kconfig
>> > > > @@ -83,3 +83,9 @@ depends on DRM_XE  depends on EXPERT  source
>> > > > "drivers/gpu/drm/xe/Kconfig.debug"
>> > > >  endmenu
>> > > > +
>> > > > +menu "drm/xe Profile Guided Optimisation"
>> > > > +	visible if EXPERT
>> > > > +	depends on DRM_XE
>> > > > +	source "drivers/gpu/drm/xe/Kconfig.profile"
>> > > > +endmenu
>> > > > diff --git a/drivers/gpu/drm/xe/Kconfig.profile
>> > > > b/drivers/gpu/drm/xe/Kconfig.profile
>> > > > new file mode 100644
>> > > > index 000000000000..e72f15ec4bf6
>> > > > --- /dev/null
>> > > > +++ b/drivers/gpu/drm/xe/Kconfig.profile
>> > > > @@ -0,0 +1,46 @@
>> > > > +config DRM_XE_JOB_TIMEOUT_MAX
>> > > > +       int "Default max job timeout (ms)"
>> > > > +       default 10000 # milliseconds
>> > > > +       help
>> > > > +         Configures the default max job timeout after which job will
>> > > > +         be forcefully taken away from scheduler.
>> > > > +config DRM_XE_JOB_TIMEOUT_MIN
>> > > > +       int "Default max job timeout (ms)"
>> > > > +       default 1 # milliseconds
>> > > > +       help
>> > > > +         Configures the default min job timeout after which job will
>> > > > +         be forcefully taken away from scheduler.
>> > > > +config DRM_XE_TIMESLICE_MAX
>> > > > +       int "Default max timeslice duration (us)"
>> > > > +       default 10000000 # microseconds
>> > > > +       help
>> > > > +         Configures the default max timeslice duration between multiple
>> > > > +         contexts by guc scheduling.
>> > > > +config DRM_XE_TIMESLICE_MIN
>> > > > +       int "Default min timeslice duration (us)"
>> > > > +       default 1 # microseconds
>> > > > +       help
>> > > > +         Configures the default min timeslice duration between multiple
>> > > > +         contexts by guc scheduling.
>> > > > +config DRM_XE_PREEMPT_TIMEOUT_MAX
>> > > > +       int "Default max  preempt timeout (us)"
>> > > > +       default 10000000 # microseconds
>> > > > +       help
>> > > > +         Configures the default max preempt timeout after which context
>> > > > +         will be forcefully taken away and higher priority context will
>> > > > +         run.
>> > > > +config DRM_XE_PREEMPT_TIMEOUT_MIN
>> > > > +       int "Default min  preempt timeout (us)"
>> > > > +       default 1 # microseconds
>> > > > +       help
>> > > > +         Configures the default min preempt timeout after which context
>> > > > +         will be forcefully taken away and higher priority context will
>> > > > +         run.
>> > > > +config DRM_XE_ENABLE_SCHEDTIMEOUT_LIMIT
>> > > > +       bool "Default configuration of limitation on scheduler timeout"
>> > > > +       default y
>> > > > +       help
>> > > > +	 Configures the enablement of limitation on scheduler timeout
>> > > > +	 to apply to applicable user. For elevated user, all above MIN
>> > > > +	 and MAX values will apply when this configuration is enable to
>> > > > +	 apply limitation. By default limitation is applied.
>> > > > diff --git a/drivers/gpu/drm/xe/xe_engine.c
>> > > > b/drivers/gpu/drm/xe/xe_engine.c index 9e167b113963..d934196eb79f
>> > > > 100644
>> > > > --- a/drivers/gpu/drm/xe/xe_engine.c
>> > > > +++ b/drivers/gpu/drm/xe/xe_engine.c
>> > > > @@ -13,6 +13,7 @@
>> > > >
>> > > >  #include "xe_device.h"
>> > > >  #include "xe_gt.h"
>> > > > +#include "xe_hw_engine_class_sysfs.h"
>> > > >  #include "xe_hw_fence.h"
>> > > >  #include "xe_lrc.h"
>> > > >  #include "xe_macros.h"
>> > > > @@ -191,8 +192,12 @@ static int engine_set_priority(struct
>> > > > xe_device *xe, struct xe_engine *e,  static int
>> engine_set_timeslice(struct xe_device *xe, struct xe_engine *e,
>> > > >  				u64 value, bool create)
>> > > >  {
>> > > > -	if (!capable(CAP_SYS_NICE))
>> > > > -		return -EPERM;
>> > > > +	u32 min = e->hwe->eclass->sched_props.timeslice_min;
>> > > > +	u32 max = e->hwe->eclass->sched_props.timeslice_max;
>> > >
>> > > So I screwed this up in my last comment, sorry.
>> > >
>> > > min = cap_nice ? KConfig option for min :
>> > > e->hwe->eclass->sched_props.timeslice_min;
>> > > same logic for max;
>> > >
>> > > Probably add helper for this.
>> > >
>> > > > +
>> > > > +	if (enforce_schedule_limit() &&
>> > > > +	    !engine_timeout_in_range(value, min, max))
>> > >
>> > > Then I think logic works too...
>> > >
>> > > if cap nice && !Kconfig option to enfore limits (enforce_schedule_limit
>> returns false):
>> > > 	user can do whatever
>> > > else if cap nice
>> > > 	user within Kconfig range
>> > > else
>> > > 	user within sysfs range
>> > >
>> > > This is what we want in the end.
>> > >
>> >
>> > Matt, I think this is exactly what the previous revision of the patch was
>> doing.
>> >
>>
>> No... Previous version
>>
>> min = Kconfig option to enfore limits ? KConfig option for min : e->hwe-
>> >eclass->sched_props.timeslice_min
>> same for max
>>
>> Results in:
>>
>> if cap nice && !Kconfig option to enfore limits (enforce_schedule_limit
>> returns false):
>> 	user can do whatever
>> else if cap_nice || Kconfig option to enfore limit
>> 	user within Kconfig range
>> else
>>  	user within sysfs range
>>
>> !cap_nice && Kconfig option to enfore limits == user within Kconfig range
>> (previously) !cap_nice && Kconfig option to enfore limits == user within sysfs
>> range (my suggestion)
>
>In previous version we can achieve it by just adding one below check right?
>#if IS_ENABLED(CONFIG_DRM_XE_ENABLE_SCHEDTIMEOUT_LIMIT) && cap_nice
>+       u32 min = XE_HW_ENGINE_TIMESLICE_MIN;
>+       u32 max = XE_HW_ENGINE_TIMESLICE_MAX;
>+#else
>+       u32 min = e->hwe->eclass->sched_props.timeslice_min;
>+       u32 max = e->hwe->eclass->sched_props.timeslice_max;
>+#endif
>
>Please let me know!
>

Ah I see. Yah, it is a limits selection issue.
We can do,

u32 min = e->hwe->eclass->sched_props.timeslice_min;
u32 max = e->hwe->eclass->sched_props.timeslice_max;

#if IS_ENABLED(CONFIG_DRM_XE_ENABLE_SCHEDTIMEOUT_LIMIT)
         if (cap_nice) {
                 u32 min = XE_HW_ENGINE_TIMESLICE_MIN;
                 u32 max = XE_HW_ENGINE_TIMESLICE_MAX;
         }
#endif

Matt, Tejas
Also, looks like you missed my another comment below.

Niranjana

>>
>> The logic is different and I believe we want what I'm suggesting.
>>
>> Matt
>>
>> > > > +		return -EINVAL;
>> > > >
>> > > >  	return e->ops->set_timeslice(e, value);  } @@ -201,8 +206,12 @@
>> > > > static int engine_set_preemption_timeout(struct xe_device *xe,
>> > > >  					 struct xe_engine *e, u64 value,
>> > > >  					 bool create)
>> > > >  {
>> > > > -	if (!capable(CAP_SYS_NICE))
>> > > > -		return -EPERM;
>> > > > +	u32 min = e->hwe->eclass->sched_props.preempt_timeout_min;
>> > > > +	u32 max = e->hwe->eclass->sched_props.preempt_timeout_max;
>> > > > +
>> > > > +	if (enforce_schedule_limit() &&
>> > > > +	    !engine_timeout_in_range(value, min, max))
>> > > > +		return -EINVAL;
>> > > >
>> > > >  	return e->ops->set_preempt_timeout(e, value);  } @@ -266,11
>> > > > +275,15 @@ static int engine_set_persistence(struct xe_device *xe,
>> > > > struct xe_engine *e,  static int engine_set_job_timeout(struct xe_device
>> *xe, struct xe_engine *e,
>> > > >  				  u64 value, bool create)
>> > > >  {
>> > > > +	u32 min = e->hwe->eclass->sched_props.job_timeout_min;
>> > > > +	u32 max = e->hwe->eclass->sched_props.job_timeout_max;
>> > > > +
>> > > >  	if (XE_IOCTL_DBG(xe, !create))
>> > > >  		return -EINVAL;
>> > > >
>> > > > -	if (!capable(CAP_SYS_NICE))
>> > > > -		return -EPERM;
>> > > > +	if (enforce_schedule_limit() &&
>> > > > +	    !engine_timeout_in_range(value, min, max))
>> > > > +		return -EINVAL;
>> > > >
>> > > >  	return e->ops->set_job_timeout(e, value);  } diff --git
>> > > > a/drivers/gpu/drm/xe/xe_hw_engine.c
>> > > > b/drivers/gpu/drm/xe/xe_hw_engine.c
>> > > > index afa7d25c3852..e601bffe3b13 100644
>> > > > --- a/drivers/gpu/drm/xe/xe_hw_engine.c
>> > > > +++ b/drivers/gpu/drm/xe/xe_hw_engine.c
>> > > > @@ -364,8 +364,16 @@ static void hw_engine_init_early(struct xe_gt
>> > > > *gt, struct xe_hw_engine *hwe,
>> > > >
>> > > >  	if (!gt->eclass[hwe->class].sched_props.job_timeout_ms) {
>> > > >  		gt->eclass[hwe->class].sched_props.job_timeout_ms = HZ *
>> 5;
>> > > > +		gt->eclass[hwe->class].sched_props.job_timeout_min =
>> XE_HW_ENGINE_JOB_TIMEOUT_MIN;
>> > > > +		gt->eclass[hwe->class].sched_props.job_timeout_max =
>> > > > +XE_HW_ENGINE_JOB_TIMEOUT_MAX;
>> > > >  		gt->eclass[hwe->class].sched_props.timeslice_us = 1 * 1000;
>> > > > +		gt->eclass[hwe->class].sched_props.timeslice_min =
>> XE_HW_ENGINE_TIMESLICE_MIN;
>> > > > +		gt->eclass[hwe->class].sched_props.timeslice_max =
>> > > > +XE_HW_ENGINE_TIMESLICE_MAX;
>> > > >  		gt->eclass[hwe->class].sched_props.preempt_timeout_us =
>> 640 *
>> > > > 1000;
>> > > > +		gt->eclass[hwe->class].sched_props.preempt_timeout_min =
>> > > > +
>> 	XE_HW_ENGINE_PREEMPT_TIMEOUT_MIN;
>> > > > +		gt->eclass[hwe->class].sched_props.preempt_timeout_max =
>> > > > +
>> 	XE_HW_ENGINE_PREEMPT_TIMEOUT_MAX;
>> > > >  		/* Record default props */
>> > > >  		gt->eclass[hwe->class].defaults = gt->eclass[hwe-
>> >class].sched_props;
>> > > >  	}
>> > > > diff --git a/drivers/gpu/drm/xe/xe_hw_engine.h
>> > > > b/drivers/gpu/drm/xe/xe_hw_engine.h
>> > > > index 7eca9d53c7b1..3d37d6d44261 100644
>> > > > --- a/drivers/gpu/drm/xe/xe_hw_engine.h
>> > > > +++ b/drivers/gpu/drm/xe/xe_hw_engine.h
>> > > > @@ -10,6 +10,37 @@
>> > > >
>> > > >  struct drm_printer;
>> > > >
>> > > > +#ifdef CONFIG_DRM_XE_JOB_TIMEOUT_MIN #define
>> > > > +XE_HW_ENGINE_JOB_TIMEOUT_MIN
>> CONFIG_DRM_XE_JOB_TIMEOUT_MIN #else
>> > > > +#define XE_HW_ENGINE_JOB_TIMEOUT_MIN 1 #endif #ifdef
>> > > > +CONFIG_DRM_XE_JOB_TIMEOUT_MAX #define
>> > > > +XE_HW_ENGINE_JOB_TIMEOUT_MAX
>> CONFIG_DRM_XE_JOB_TIMEOUT_MAX #else
>> > > > +#define XE_HW_ENGINE_JOB_TIMEOUT_MAX (10 * 1000) #endif #ifdef
>> > > > +CONFIG_DRM_XE_TIMESLICE_MIN #define
>> XE_HW_ENGINE_TIMESLICE_MIN
>> > > > +CONFIG_DRM_XE_TIMESLICE_MIN #else #define
>> > > > +XE_HW_ENGINE_TIMESLICE_MIN 1 #endif #ifdef
>> > > > +CONFIG_DRM_XE_TIMESLICE_MAX #define
>> XE_HW_ENGINE_TIMESLICE_MAX
>> > > > +CONFIG_DRM_XE_TIMESLICE_MAX #else #define
>> > > > +XE_HW_ENGINE_TIMESLICE_MAX (10 * 1000 * 1000) #endif #ifdef
>> > > > +CONFIG_DRM_XE_PREEMPT_TIMEOUT_MIN
>> > > > +#define XE_HW_ENGINE_PREEMPT_TIMEOUT_MIN
>> > > > +CONFIG_DRM_XE_PREEMPT_TIMEOUT_MIN #else #define
>> > > > +XE_HW_ENGINE_PREEMPT_TIMEOUT_MIN 1 #endif #ifdef
>> > > > +CONFIG_DRM_XE_PREEMPT_TIMEOUT_MAX
>> > > > +#define XE_HW_ENGINE_PREEMPT_TIMEOUT_MAX
>> > > > +CONFIG_DRM_XE_PREEMPT_TIMEOUT_MAX #else #define
>> > > > +XE_HW_ENGINE_PREEMPT_TIMEOUT_MAX (10 * 1000 * 1000) #endif
>> > > > +
>> > > >  int xe_hw_engines_init_early(struct xe_gt *gt);  int
>> > > > xe_hw_engines_init(struct xe_gt *gt);  void
>> > > > xe_hw_engine_handle_irq(struct xe_hw_engine *hwe, u16 intr_vec);
>> > > > diff --git a/drivers/gpu/drm/xe/xe_hw_engine_class_sysfs.c
>> > > > b/drivers/gpu/drm/xe/xe_hw_engine_class_sysfs.c
>> > > > index 990bb675d1e0..2b7ac4e02db6 100644
>> > > > --- a/drivers/gpu/drm/xe/xe_hw_engine_class_sysfs.c
>> > > > +++ b/drivers/gpu/drm/xe/xe_hw_engine_class_sysfs.c
>> > > > @@ -11,6 +11,20 @@
>> > > >
>> > > >  static int xe_add_hw_engine_class_defaults(struct kobject
>> > > > *parent);
>> > > >
>> > > > +bool enforce_schedule_limit(void) { #if
>> > > > +IS_ENABLED(CONFIG_DRM_XE_ENABLE_SCHEDTIMEOUT_LIMIT)
>> > > > +	return true;
>> > > > +#else
>> > > > +	return !capable(CAP_SYS_NICE);
>> > > > +#endif
>> > > > +}
>> > > > +
>> > > > +bool engine_timeout_in_range(u64 timeout, u64 min, u64 max) {
>> > > > +	return timeout >= min && timeout <= max; }
>> > > > +
>> > > >  static void kobj_xe_hw_engine_release(struct kobject *kobj)  {
>> > > >  	kfree(kobj);
>> > > > @@ -39,11 +53,92 @@ kobj_xe_hw_engine_class(struct kobject
>> *parent, char *name)
>> > > >  	return keclass;
>> > > >  }
>> > > >
>> > > > +static ssize_t job_timeout_max_store(struct kobject *kobj,
>> > > > +				     struct kobj_attribute *attr,
>> > > > +				     const char *buf, size_t count) {
>> > > > +	struct xe_hw_engine_class_intf *eclass = kobj_to_eclass(kobj);
>> > > > +	u32 timeout;
>> > > > +	int err;
>> > > > +
>> > > > +	err = kstrtou32(buf, 0, &timeout);
>> > > > +	if (err)
>> > > > +		return err;
>> > > > +
>> > > > +	if (timeout < eclass->sched_props.job_timeout_min)
>> > > > +		return -EINVAL;
>> > > > +
>> > > > +	if (enforce_schedule_limit() &&
>> > > > +	    !engine_timeout_in_range(timeout,
>> > > > +				     XE_HW_ENGINE_JOB_TIMEOUT_MIN,
>> > > > +				     XE_HW_ENGINE_JOB_TIMEOUT_MAX))
>> > > > +		return -EINVAL;
>> > > > +
>> > > > +	WRITE_ONCE(eclass->sched_props.job_timeout_max, timeout);
>> > > > +
>> > > > +	return count;
>> > > > +}
>> > > > +
>> > > > +static ssize_t job_timeout_max_show(struct kobject *kobj,
>> > > > +				    struct kobj_attribute *attr, char *buf) {
>> > > > +	struct xe_hw_engine_class_intf *eclass = kobj_to_eclass(kobj);
>> > > > +
>> > > > +	return sprintf(buf, "%u\n",
>> > > > +eclass->sched_props.job_timeout_max);
>> > > > +}
>> > > > +
>> > > > +static struct kobj_attribute job_timeout_max_attr =
>> > > > +__ATTR(job_timeout_max, 0644, job_timeout_max_show,
>> > > > +job_timeout_max_store);
>> > > > +
>> > > > +static ssize_t job_timeout_min_store(struct kobject *kobj,
>> > > > +				     struct kobj_attribute *attr,
>> > > > +				     const char *buf, size_t count) {
>> > > > +	struct xe_hw_engine_class_intf *eclass = kobj_to_eclass(kobj);
>> > > > +	u32 timeout;
>> > > > +	int err;
>> > > > +
>> > > > +	err = kstrtou32(buf, 0, &timeout);
>> > > > +	if (err)
>> > > > +		return err;
>> > > > +
>> > > > +	if (timeout > eclass->sched_props.job_timeout_max)
>> > > > +		return -EINVAL;
>> > > > +
>> > > > +	if (enforce_schedule_limit() &&
>> > > > +	    !engine_timeout_in_range(timeout,
>> > > > +				     XE_HW_ENGINE_JOB_TIMEOUT_MIN,
>> > > > +				     XE_HW_ENGINE_JOB_TIMEOUT_MAX))
>> > > > +		return -EINVAL;
>> > > > +
>> > > > +	WRITE_ONCE(eclass->sched_props.job_timeout_min, timeout);
>> > > > +
>> > > > +	return count;
>> > > > +}
>> > > > +
>> > > > +static ssize_t job_timeout_min_show(struct kobject *kobj,
>> > > > +				    struct kobj_attribute *attr, char *buf) {
>> > > > +	struct xe_hw_engine_class_intf *eclass = kobj_to_eclass(kobj);
>> > > > +
>> > > > +	return sprintf(buf, "%u\n",
>> > > > +eclass->sched_props.job_timeout_min);
>> > > > +}
>> > > > +
>> > > > +static struct kobj_attribute job_timeout_min_attr =
>> > > > +__ATTR(job_timeout_min, 0644, job_timeout_min_show,
>> > > > +job_timeout_min_store);
>> > > > +
>> > > >  static ssize_t job_timeout_store(struct kobject *kobj,
>> > > >  				 struct kobj_attribute *attr,
>> > > >  				 const char *buf, size_t count)  {
>> > > >  	struct xe_hw_engine_class_intf *eclass = kobj_to_eclass(kobj);
>> > > > +#if IS_ENABLED(CONFIG_DRM_XE_ENABLE_SCHEDTIMEOUT_LIMIT)
>> > > > +	u32 min = XE_HW_ENGINE_JOB_TIMEOUT_MIN;
>> > > > +	u32 max = XE_HW_ENGINE_JOB_TIMEOUT_MAX; #else
>> > > > +	u32 min = e->hwe->eclass->sched_props.job_timeout_min;
>> > > > +	u32 max = e->hwe->eclass->sched_props.job_timeout_max;
>> > > > +#endif
>> > >
>> > > I don't think we need this, just make sure default is within min /
>> > > max of the sched_props.
>> > >
>> >
>> > Shouldn't the sched_prop set through sysfs here which applies to all
>> > future user engines (xe_engine) has the same requirement as the
>> > sched_prop set directly to user engine (xe_engine) through set_properly
>> ioctl?
>> > ie., shoudln't the requirement be same in job_timeout_store() and
>> > engine_set_job_timeout()?
>> >
>> > Niranjana
>> >
>> > > Matt
>> > >
>> > > >  	u32 timeout;
>> > > >  	int err;
>> > > >
>> > > > @@ -51,6 +146,10 @@ static ssize_t job_timeout_store(struct kobject
>> *kobj,
>> > > >  	if (err)
>> > > >  		return err;
>> > > >
>> > > > +	if (enforce_schedule_limit() &&
>> > > > +	    !engine_timeout_in_range(timeout, min, max))
>> > > > +		return -EINVAL;
>> > > > +
>> > > >  	WRITE_ONCE(eclass->sched_props.job_timeout_ms, timeout);
>> > > >
>> > > >  	return count;
>> > > > @@ -78,11 +177,40 @@ static ssize_t job_timeout_default(struct
>> > > > kobject *kobj,  static struct kobj_attribute job_timeout_def =
>> > > > __ATTR(job_timeout_ms, 0444, job_timeout_default, NULL);
>> > > >
>> > > > +static ssize_t job_timeout_min_default(struct kobject *kobj,
>> > > > +				       struct kobj_attribute *attr, char *buf) {
>> > > > +	struct xe_hw_engine_class_intf *eclass =
>> > > > +kobj_to_eclass(kobj->parent);
>> > > > +
>> > > > +	return sprintf(buf, "%u\n", eclass->defaults.job_timeout_min);
>> > > > +}
>> > > > +
>> > > > +static struct kobj_attribute job_timeout_min_def =
>> > > > +__ATTR(job_timeout_min, 0444, job_timeout_min_default, NULL);
>> > > > +
>> > > > +static ssize_t job_timeout_max_default(struct kobject *kobj,
>> > > > +				       struct kobj_attribute *attr, char *buf) {
>> > > > +	struct xe_hw_engine_class_intf *eclass =
>> > > > +kobj_to_eclass(kobj->parent);
>> > > > +
>> > > > +	return sprintf(buf, "%u\n", eclass->defaults.job_timeout_max);
>> > > > +}
>> > > > +
>> > > > +static struct kobj_attribute job_timeout_max_def =
>> > > > +__ATTR(job_timeout_max, 0444, job_timeout_max_default, NULL);
>> > > > +
>> > > >  static ssize_t timeslice_duration_store(struct kobject *kobj,
>> > > >  					struct kobj_attribute *attr,
>> > > >  					const char *buf, size_t count)  {
>> > > >  	struct xe_hw_engine_class_intf *eclass = kobj_to_eclass(kobj);
>> > > > +#if IS_ENABLED(CONFIG_DRM_XE_ENABLE_SCHEDTIMEOUT_LIMIT)
>> > > > +	u32 min = XE_HW_ENGINE_TIMESLICE_MIN;
>> > > > +	u32 max = XE_HW_ENGINE_TIMESLICE_MAX; #else
>> > > > +	u32 min = e->hwe->eclass->sched_props.timeslice_min;
>> > > > +	u32 max = e->hwe->eclass->sched_props.timeslice_max;
>> > > > +#endif
>> > > >  	u32 duration;
>> > > >  	int err;
>> > > >
>> > > > @@ -90,11 +218,92 @@ static ssize_t timeslice_duration_store(struct
>> kobject *kobj,
>> > > >  	if (err)
>> > > >  		return err;
>> > > >
>> > > > +	if (enforce_schedule_limit() &&
>> > > > +	    !engine_timeout_in_range(duration, min, max))
>> > > > +		return -EINVAL;
>> > > > +
>> > > >  	WRITE_ONCE(eclass->sched_props.timeslice_us, duration);
>> > > >
>> > > >  	return count;
>> > > >  }
>> > > >
>> > > > +static ssize_t timeslice_duration_max_store(struct kobject *kobj,
>> > > > +					    struct kobj_attribute *attr,
>> > > > +					    const char *buf, size_t count) {
>> > > > +	struct xe_hw_engine_class_intf *eclass = kobj_to_eclass(kobj);
>> > > > +	u32 duration;
>> > > > +	int err;
>> > > > +
>> > > > +	err = kstrtou32(buf, 0, &duration);
>> > > > +	if (err)
>> > > > +		return err;
>> > > > +
>> > > > +	if (duration < eclass->sched_props.timeslice_min)
>> > > > +		return -EINVAL;
>> > > > +
>> > > > +	if (enforce_schedule_limit() &&
>> > > > +	    !engine_timeout_in_range(duration,
>> > > > +				     XE_HW_ENGINE_TIMESLICE_MIN,
>> > > > +				     XE_HW_ENGINE_TIMESLICE_MAX))
>> > > > +		return -EINVAL;
>> > > > +
>> > > > +	WRITE_ONCE(eclass->sched_props.timeslice_max, duration);
>> > > > +
>> > > > +	return count;
>> > > > +}
>> > > > +
>> > > > +static ssize_t timeslice_duration_max_show(struct kobject *kobj,
>> > > > +					   struct kobj_attribute *attr,
>> > > > +					   char *buf)
>> > > > +{
>> > > > +	struct xe_hw_engine_class_intf *eclass = kobj_to_eclass(kobj);
>> > > > +
>> > > > +	return sprintf(buf, "%u\n", eclass->sched_props.timeslice_max);
>> > > > +}
>> > > > +
>> > > > +static struct kobj_attribute timeslice_duration_max_attr =
>> > > > +	__ATTR(timeslice_duration_max, 0644,
>> timeslice_duration_max_show,
>> > > > +	       timeslice_duration_max_store);
>> > > > +
>> > > > +static ssize_t timeslice_duration_min_store(struct kobject *kobj,
>> > > > +					    struct kobj_attribute *attr,
>> > > > +					    const char *buf, size_t count) {
>> > > > +	struct xe_hw_engine_class_intf *eclass = kobj_to_eclass(kobj);
>> > > > +	u32 duration;
>> > > > +	int err;
>> > > > +
>> > > > +	err = kstrtou32(buf, 0, &duration);
>> > > > +	if (err)
>> > > > +		return err;
>> > > > +
>> > > > +	if (duration > eclass->sched_props.timeslice_max)
>> > > > +		return -EINVAL;
>> > > > +
>> > > > +	if (enforce_schedule_limit() &&
>> > > > +	    !engine_timeout_in_range(duration,
>> > > > +				     XE_HW_ENGINE_TIMESLICE_MIN,
>> > > > +				     XE_HW_ENGINE_TIMESLICE_MAX))
>> > > > +		return -EINVAL;
>> > > > +
>> > > > +	WRITE_ONCE(eclass->sched_props.timeslice_min, duration);
>> > > > +
>> > > > +	return count;
>> > > > +}
>> > > > +
>> > > > +static ssize_t timeslice_duration_min_show(struct kobject *kobj,
>> > > > +					   struct kobj_attribute *attr, char
>> *buf) {
>> > > > +	struct xe_hw_engine_class_intf *eclass = kobj_to_eclass(kobj);
>> > > > +
>> > > > +	return sprintf(buf, "%u\n", eclass->sched_props.timeslice_min);
>> > > > +}
>> > > > +
>> > > > +static struct kobj_attribute timeslice_duration_min_attr =
>> > > > +	__ATTR(timeslice_duration_min, 0644,
>> timeslice_duration_min_show,
>> > > > +	       timeslice_duration_min_store);
>> > > > +
>> > > >  static ssize_t timeslice_duration_show(struct kobject *kobj,
>> > > >  		struct kobj_attribute *attr, char *buf)  { @@ -118,11 +327,40
>> > > > @@ static ssize_t timeslice_default(struct kobject *kobj,  static
>> > > > struct kobj_attribute timeslice_duration_def =
>> > > > __ATTR(timeslice_duration_us, 0444, timeslice_default, NULL);
>> > > >
>> > > > +static ssize_t timeslice_min_default(struct kobject *kobj,
>> > > > +				     struct kobj_attribute *attr, char *buf) {
>> > > > +	struct xe_hw_engine_class_intf *eclass =
>> > > > +kobj_to_eclass(kobj->parent);
>> > > > +
>> > > > +	return sprintf(buf, "%u\n", eclass->defaults.timeslice_min); }
>> > > > +
>> > > > +static struct kobj_attribute timeslice_duration_min_def =
>> > > > +__ATTR(timeslice_duration_min, 0444, timeslice_min_default,
>> > > > +NULL);
>> > > > +
>> > > > +static ssize_t timeslice_max_default(struct kobject *kobj,
>> > > > +				     struct kobj_attribute *attr, char *buf) {
>> > > > +	struct xe_hw_engine_class_intf *eclass =
>> > > > +kobj_to_eclass(kobj->parent);
>> > > > +
>> > > > +	return sprintf(buf, "%u\n", eclass->defaults.timeslice_max); }
>> > > > +
>> > > > +static struct kobj_attribute timeslice_duration_max_def =
>> > > > +__ATTR(timeslice_duration_max, 0444, timeslice_max_default,
>> > > > +NULL);
>> > > > +
>> > > >  static ssize_t preempt_timeout_store(struct kobject *kobj,
>> > > >  				     struct kobj_attribute *attr,
>> > > >  				     const char *buf, size_t count)  {
>> > > >  	struct xe_hw_engine_class_intf *eclass = kobj_to_eclass(kobj);
>> > > > +#if IS_ENABLED(CONFIG_DRM_XE_ENABLE_SCHEDTIMEOUT_LIMIT)
>> > > > +	u32 min = XE_HW_ENGINE_PREEMPT_TIMEOUT_MIN;
>> > > > +	u32 max = XE_HW_ENGINE_PREEMPT_TIMEOUT_MAX; #else
>> > > > +	u32 min = e->hwe->eclass->sched_props.preempt_timeout_min;
>> > > > +	u32 max = e->hwe->eclass->sched_props.preempt_timeout_max;
>> > > > +#endif
>> > > >  	u32 timeout;
>> > > >  	int err;
>> > > >
>> > > > @@ -130,6 +368,10 @@ static ssize_t preempt_timeout_store(struct
>> kobject *kobj,
>> > > >  	if (err)
>> > > >  		return err;
>> > > >
>> > > > +	if (enforce_schedule_limit() &&
>> > > > +	    !engine_timeout_in_range(timeout, min, max))
>> > > > +		return -EINVAL;
>> > > > +
>> > > >  	WRITE_ONCE(eclass->sched_props.preempt_timeout_us, timeout);
>> > > >
>> > > >  	return count;
>> > > > @@ -158,17 +400,129 @@ static ssize_t
>> > > > preempt_timeout_default(struct kobject *kobj,  static struct
>> > > > kobj_attribute preempt_timeout_def =  __ATTR(preempt_timeout_us,
>> > > > 0444, preempt_timeout_default, NULL);
>> > > >
>> > > > +static ssize_t preempt_timeout_min_default(struct kobject *kobj,
>> > > > +					   struct kobj_attribute *attr,
>> > > > +					   char *buf)
>> > > > +{
>> > > > +	struct xe_hw_engine_class_intf *eclass =
>> > > > +kobj_to_eclass(kobj->parent);
>> > > > +
>> > > > +	return sprintf(buf, "%u\n",
>> > > > +eclass->defaults.preempt_timeout_min);
>> > > > +}
>> > > > +
>> > > > +static struct kobj_attribute preempt_timeout_min_def =
>> > > > +__ATTR(preempt_timeout_min, 0444, preempt_timeout_min_default,
>> > > > +NULL);
>> > > > +
>> > > > +static ssize_t preempt_timeout_max_default(struct kobject *kobj,
>> > > > +					   struct kobj_attribute *attr,
>> > > > +					   char *buf)
>> > > > +{
>> > > > +	struct xe_hw_engine_class_intf *eclass =
>> > > > +kobj_to_eclass(kobj->parent);
>> > > > +
>> > > > +	return sprintf(buf, "%u\n",
>> > > > +eclass->defaults.preempt_timeout_max);
>> > > > +}
>> > > > +
>> > > > +static struct kobj_attribute preempt_timeout_max_def =
>> > > > +__ATTR(preempt_timeout_max, 0444,
>> preempt_timeout_max_default,
>> > > > +NULL);
>> > > > +
>> > > > +static ssize_t preempt_timeout_max_store(struct kobject *kobj,
>> > > > +					 struct kobj_attribute *attr,
>> > > > +					 const char *buf, size_t count) {
>> > > > +	struct xe_hw_engine_class_intf *eclass = kobj_to_eclass(kobj);
>> > > > +	u32 timeout;
>> > > > +	int err;
>> > > > +
>> > > > +	err = kstrtou32(buf, 0, &timeout);
>> > > > +	if (err)
>> > > > +		return err;
>> > > > +
>> > > > +	if (timeout < eclass->sched_props.preempt_timeout_min)
>> > > > +		return -EINVAL;
>> > > > +
>> > > > +	if (enforce_schedule_limit() &&
>> > > > +	    !engine_timeout_in_range(timeout,
>> > > > +
>> XE_HW_ENGINE_PREEMPT_TIMEOUT_MIN,
>> > > > +
>> XE_HW_ENGINE_PREEMPT_TIMEOUT_MAX))
>> > > > +		return -EINVAL;
>> > > > +
>> > > > +	WRITE_ONCE(eclass->sched_props.preempt_timeout_max, timeout);
>> > > > +
>> > > > +	return count;
>> > > > +}
>> > > > +
>> > > > +static ssize_t preempt_timeout_max_show(struct kobject *kobj,
>> > > > +					struct kobj_attribute *attr, char *buf)
>> {
>> > > > +	struct xe_hw_engine_class_intf *eclass = kobj_to_eclass(kobj);
>> > > > +
>> > > > +	return sprintf(buf, "%u\n",
>> > > > +eclass->sched_props.preempt_timeout_max);
>> > > > +}
>> > > > +
>> > > > +static struct kobj_attribute preempt_timeout_max_attr =
>> > > > +	__ATTR(preempt_timeout_max, 0644, preempt_timeout_max_show,
>> > > > +	       preempt_timeout_max_store);
>> > > > +
>> > > > +static ssize_t preempt_timeout_min_store(struct kobject *kobj,
>> > > > +					 struct kobj_attribute *attr,
>> > > > +					 const char *buf, size_t count) {
>> > > > +	struct xe_hw_engine_class_intf *eclass = kobj_to_eclass(kobj);
>> > > > +	u32 timeout;
>> > > > +	int err;
>> > > > +
>> > > > +	err = kstrtou32(buf, 0, &timeout);
>> > > > +	if (err)
>> > > > +		return err;
>> > > > +
>> > > > +	if (timeout > eclass->sched_props.preempt_timeout_max)
>> > > > +		return -EINVAL;
>> > > > +
>> > > > +	if (enforce_schedule_limit() &&
>> > > > +	    !engine_timeout_in_range(timeout,
>> > > > +
>> XE_HW_ENGINE_PREEMPT_TIMEOUT_MIN,
>> > > > +
>> XE_HW_ENGINE_PREEMPT_TIMEOUT_MAX))
>> > > > +		return -EINVAL;
>> > > > +
>> > > > +	WRITE_ONCE(eclass->sched_props.preempt_timeout_min, timeout);
>> > > > +
>> > > > +	return count;
>> > > > +}
>> > > > +
>> > > > +static ssize_t preempt_timeout_min_show(struct kobject *kobj,
>> > > > +					struct kobj_attribute *attr, char *buf)
>> {
>> > > > +	struct xe_hw_engine_class_intf *eclass = kobj_to_eclass(kobj);
>> > > > +
>> > > > +	return sprintf(buf, "%u\n",
>> > > > +eclass->sched_props.preempt_timeout_min);
>> > > > +}
>> > > > +
>> > > > +static struct kobj_attribute preempt_timeout_min_attr =
>> > > > +	__ATTR(preempt_timeout_min, 0644, preempt_timeout_min_show,
>> > > > +	       preempt_timeout_min_store);
>> > > > +
>> > > >  static const struct attribute *defaults[] = {
>> > > >  	&job_timeout_def.attr,
>> > > > +	&job_timeout_min_def.attr,
>> > > > +	&job_timeout_max_def.attr,
>> > > >  	&timeslice_duration_def.attr,
>> > > > +	&timeslice_duration_min_def.attr,
>> > > > +	&timeslice_duration_max_def.attr,
>> > > >  	&preempt_timeout_def.attr,
>> > > > +	&preempt_timeout_min_def.attr,
>> > > > +	&preempt_timeout_max_def.attr,
>> > > >  	NULL
>> > > >  };
>> > > >
>> > > >  static const struct attribute *files[] = {
>> > > >  	&job_timeout_attr.attr,
>> > > > +	&job_timeout_min_attr.attr,
>> > > > +	&job_timeout_max_attr.attr,
>> > > >  	&timeslice_duration_attr.attr,
>> > > > +	&timeslice_duration_min_attr.attr,
>> > > > +	&timeslice_duration_max_attr.attr,
>> > > >  	&preempt_timeout_attr.attr,
>> > > > +	&preempt_timeout_min_attr.attr,
>> > > > +	&preempt_timeout_max_attr.attr,
>> > > >  	NULL
>> > > >  };
>> > > >
>> > > > diff --git a/drivers/gpu/drm/xe/xe_hw_engine_class_sysfs.h
>> > > > b/drivers/gpu/drm/xe/xe_hw_engine_class_sysfs.h
>> > > > index 757136614672..2e2ab351a991 100644
>> > > > --- a/drivers/gpu/drm/xe/xe_hw_engine_class_sysfs.h
>> > > > +++ b/drivers/gpu/drm/xe/xe_hw_engine_class_sysfs.h
>> > > > @@ -10,6 +10,8 @@
>> > > >
>> > > >  #define MAX_ENGINE_CLASS_NAME_LEN    16
>> > > >  int xe_hw_engine_class_sysfs_init(struct xe_gt *gt);
>> > > > +bool enforce_schedule_limit(void); bool
>> > > > +engine_timeout_in_range(u64 timeout, u64 min, u64 max);
>> > > >
>> > > >  /**
>> > > >   * struct kobj_eclass - A eclass's kobject struct that connects
>> > > > the kobject and the
>> > > > --
>> > > > 2.25.1
>> > > >

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

* Re: [Intel-xe] [PATCH V9 6/6] drm/xe: Add min/max cap for engine scheduler properties
  2023-07-28  6:25           ` Niranjana Vishwanathapura
@ 2023-07-28  7:36             ` Upadhyay, Tejas
  2023-07-28 14:24               ` Matthew Brost
  2023-07-28 14:20             ` Matthew Brost
  1 sibling, 1 reply; 30+ messages in thread
From: Upadhyay, Tejas @ 2023-07-28  7:36 UTC (permalink / raw)
  To: Vishwanathapura, Niranjana; +Cc: intel-xe@lists.freedesktop.org



> -----Original Message-----
> From: Vishwanathapura, Niranjana <niranjana.vishwanathapura@intel.com>
> Sent: Friday, July 28, 2023 11:56 AM
> To: Upadhyay, Tejas <tejas.upadhyay@intel.com>
> Cc: Brost, Matthew <matthew.brost@intel.com>; intel-
> xe@lists.freedesktop.org
> Subject: Re: [PATCH V9 6/6] drm/xe: Add min/max cap for engine scheduler
> properties
> 
> On Thu, Jul 27, 2023 at 10:54:42PM -0700, Upadhyay, Tejas wrote:
> >
> >
> >> -----Original Message-----
> >> From: Brost, Matthew <matthew.brost@intel.com>
> >> Sent: Friday, July 28, 2023 10:35 AM
> >> To: Vishwanathapura, Niranjana
> <niranjana.vishwanathapura@intel.com>
> >> Cc: Upadhyay, Tejas <tejas.upadhyay@intel.com>; intel-
> >> xe@lists.freedesktop.org
> >> Subject: Re: [PATCH V9 6/6] drm/xe: Add min/max cap for engine
> >> scheduler properties
> >>
> >> On Thu, Jul 27, 2023 at 09:44:23PM -0700, Niranjana Vishwanathapura
> >> wrote:
> >> > On Thu, Jul 27, 2023 at 03:26:49PM +0000, Matthew Brost wrote:
> >> > > On Thu, Jul 27, 2023 at 01:52:35PM +0530, Tejas Upadhyay wrote:
> >> > > > Add sysfs entries for the min, max, and defaults for each of
> >> > > > engine scheduler controls for every hardware engine class.
> >> > > >
> >> > > > Non-elevated user IOCTLs to set these controls must be within
> >> > > > the min-max ranges of the sysfs entries, elevated user can set
> >> > > > these controls to any value. However, introduced compile time
> >> > > > CONFIG min-max values which restricts elevated user to be in
> >> > > > compile time min-max range if at all sysfs min/max are violated.
> >> > > >
> >> > > > Sysfs entries examples are,
> >> > > > DUT# cat
> /sys/class/drm/cardX/device/tileN/gtN/engines/ccs/.defaults/
> >> > > > job_timeout_max         job_timeout_ms          preempt_timeout_min
> >> timeslice_duration_max  timeslice_duration_us
> >> > > > job_timeout_min         preempt_timeout_max
> preempt_timeout_us
> >> timeslice_duration_min
> >> > > >
> >> > > > DUT# cat /sys/class/drm/card1/device/tileN/gtN/engines/ccs/
> >> > > > .defaults/              job_timeout_min         preempt_timeout_max
> >> preempt_timeout_us      timeslice_duration_min
> >> > > > job_timeout_max         job_timeout_ms          preempt_timeout_min
> >> timeslice_duration_max  timeslice_duration_us
> >> > > >
> >> > > > V9 :
> >> > > >    - Rebase to use s/xe_engine/xe_hw_engine/ - Matt
> >> > > > V8 :
> >> > > >    - fix enforce_sched_limit and avoid code duplication - Niranjana
> >> > > >    - Make sure min < max - Niranjana
> >> > > > V7 :
> >> > > >    - Rebase to replace hw engine with eclass interface
> >> > > >    - return EINVAL in place of EPERM
> >> > > >    - Use some APIs to avoid code duplication
> >> > > > V6 :
> >> > > >    - Rebase changes to reflect per engine class props interface - MattB
> >> > > >    - Use #if ENABLED - MattB
> >> > > >    - Remove MAX_SCHED_TIMEOUT check as range validation is
> >> > > > enough
> >> > > > V5 :
> >> > > >    - Rebase to resolve conflicts - CI
> >> > > > V4 :
> >> > > >    - Rebase
> >> > > >    - Update commit to reflect tile addition
> >> > > >    - Use XE_HW macro directly as they are already filtered
> >> > > >      for CONFIG checks - Niranjana
> >> > > >    - Add CONFIG for enable/disable min/max limitation
> >> > > >      on elevated user. Default is enable - Matt/Joonas
> >> > > > V3 :
> >> > > >    - Resolve CI hooks warning for kernel-doc
> >> > > > V2 :
> >> > > >    - Restric min/max setting to #define default min/max for
> >> > > >      elevated user - Himal
> >> > > >    - Remove unrelated changes from patch - Niranjana
> >> > > >
> >> > > > Signed-off-by: Tejas Upadhyay <tejas.upadhyay@intel.com>
> >> > > > ---
> >> > > >  drivers/gpu/drm/xe/Kconfig                    |   6 +
> >> > > >  drivers/gpu/drm/xe/Kconfig.profile            |  46 +++
> >> > > >  drivers/gpu/drm/xe/xe_engine.c                |  25 +-
> >> > > >  drivers/gpu/drm/xe/xe_hw_engine.c             |   8 +
> >> > > >  drivers/gpu/drm/xe/xe_hw_engine.h             |  31 ++
> >> > > >  drivers/gpu/drm/xe/xe_hw_engine_class_sysfs.c | 354
> >> ++++++++++++++++++
> >> > > >  drivers/gpu/drm/xe/xe_hw_engine_class_sysfs.h |   2 +
> >> > > >  7 files changed, 466 insertions(+), 6 deletions(-)  create
> >> > > > mode
> >> > > > 100644 drivers/gpu/drm/xe/Kconfig.profile
> >> > > >
> >> > > > diff --git a/drivers/gpu/drm/xe/Kconfig
> >> > > > b/drivers/gpu/drm/xe/Kconfig index d44794f99338..0a4ea965645b
> >> > > > 100644
> >> > > > --- a/drivers/gpu/drm/xe/Kconfig
> >> > > > +++ b/drivers/gpu/drm/xe/Kconfig
> >> > > > @@ -83,3 +83,9 @@ depends on DRM_XE  depends on EXPERT
> source
> >> > > > "drivers/gpu/drm/xe/Kconfig.debug"
> >> > > >  endmenu
> >> > > > +
> >> > > > +menu "drm/xe Profile Guided Optimisation"
> >> > > > +	visible if EXPERT
> >> > > > +	depends on DRM_XE
> >> > > > +	source "drivers/gpu/drm/xe/Kconfig.profile"
> >> > > > +endmenu
> >> > > > diff --git a/drivers/gpu/drm/xe/Kconfig.profile
> >> > > > b/drivers/gpu/drm/xe/Kconfig.profile
> >> > > > new file mode 100644
> >> > > > index 000000000000..e72f15ec4bf6
> >> > > > --- /dev/null
> >> > > > +++ b/drivers/gpu/drm/xe/Kconfig.profile
> >> > > > @@ -0,0 +1,46 @@
> >> > > > +config DRM_XE_JOB_TIMEOUT_MAX
> >> > > > +       int "Default max job timeout (ms)"
> >> > > > +       default 10000 # milliseconds
> >> > > > +       help
> >> > > > +         Configures the default max job timeout after which job will
> >> > > > +         be forcefully taken away from scheduler.
> >> > > > +config DRM_XE_JOB_TIMEOUT_MIN
> >> > > > +       int "Default max job timeout (ms)"
> >> > > > +       default 1 # milliseconds
> >> > > > +       help
> >> > > > +         Configures the default min job timeout after which job will
> >> > > > +         be forcefully taken away from scheduler.
> >> > > > +config DRM_XE_TIMESLICE_MAX
> >> > > > +       int "Default max timeslice duration (us)"
> >> > > > +       default 10000000 # microseconds
> >> > > > +       help
> >> > > > +         Configures the default max timeslice duration between
> multiple
> >> > > > +         contexts by guc scheduling.
> >> > > > +config DRM_XE_TIMESLICE_MIN
> >> > > > +       int "Default min timeslice duration (us)"
> >> > > > +       default 1 # microseconds
> >> > > > +       help
> >> > > > +         Configures the default min timeslice duration between
> multiple
> >> > > > +         contexts by guc scheduling.
> >> > > > +config DRM_XE_PREEMPT_TIMEOUT_MAX
> >> > > > +       int "Default max  preempt timeout (us)"
> >> > > > +       default 10000000 # microseconds
> >> > > > +       help
> >> > > > +         Configures the default max preempt timeout after which
> context
> >> > > > +         will be forcefully taken away and higher priority context will
> >> > > > +         run.
> >> > > > +config DRM_XE_PREEMPT_TIMEOUT_MIN
> >> > > > +       int "Default min  preempt timeout (us)"
> >> > > > +       default 1 # microseconds
> >> > > > +       help
> >> > > > +         Configures the default min preempt timeout after which
> context
> >> > > > +         will be forcefully taken away and higher priority context will
> >> > > > +         run.
> >> > > > +config DRM_XE_ENABLE_SCHEDTIMEOUT_LIMIT
> >> > > > +       bool "Default configuration of limitation on scheduler timeout"
> >> > > > +       default y
> >> > > > +       help
> >> > > > +	 Configures the enablement of limitation on scheduler
> timeout
> >> > > > +	 to apply to applicable user. For elevated user, all above MIN
> >> > > > +	 and MAX values will apply when this configuration is enable
> to
> >> > > > +	 apply limitation. By default limitation is applied.
> >> > > > diff --git a/drivers/gpu/drm/xe/xe_engine.c
> >> > > > b/drivers/gpu/drm/xe/xe_engine.c index
> >> > > > 9e167b113963..d934196eb79f
> >> > > > 100644
> >> > > > --- a/drivers/gpu/drm/xe/xe_engine.c
> >> > > > +++ b/drivers/gpu/drm/xe/xe_engine.c
> >> > > > @@ -13,6 +13,7 @@
> >> > > >
> >> > > >  #include "xe_device.h"
> >> > > >  #include "xe_gt.h"
> >> > > > +#include "xe_hw_engine_class_sysfs.h"
> >> > > >  #include "xe_hw_fence.h"
> >> > > >  #include "xe_lrc.h"
> >> > > >  #include "xe_macros.h"
> >> > > > @@ -191,8 +192,12 @@ static int engine_set_priority(struct
> >> > > > xe_device *xe, struct xe_engine *e,  static int
> >> engine_set_timeslice(struct xe_device *xe, struct xe_engine *e,
> >> > > >  				u64 value, bool create)
> >> > > >  {
> >> > > > -	if (!capable(CAP_SYS_NICE))
> >> > > > -		return -EPERM;
> >> > > > +	u32 min = e->hwe->eclass->sched_props.timeslice_min;
> >> > > > +	u32 max = e->hwe->eclass->sched_props.timeslice_max;
> >> > >
> >> > > So I screwed this up in my last comment, sorry.
> >> > >
> >> > > min = cap_nice ? KConfig option for min :
> >> > > e->hwe->eclass->sched_props.timeslice_min;
> >> > > same logic for max;
> >> > >
> >> > > Probably add helper for this.
> >> > >
> >> > > > +
> >> > > > +	if (enforce_schedule_limit() &&
> >> > > > +	    !engine_timeout_in_range(value, min, max))
> >> > >
> >> > > Then I think logic works too...
> >> > >
> >> > > if cap nice && !Kconfig option to enfore limits
> >> > > (enforce_schedule_limit
> >> returns false):
> >> > > 	user can do whatever
> >> > > else if cap nice
> >> > > 	user within Kconfig range
> >> > > else
> >> > > 	user within sysfs range
> >> > >
> >> > > This is what we want in the end.
> >> > >
> >> >
> >> > Matt, I think this is exactly what the previous revision of the
> >> > patch was
> >> doing.
> >> >
> >>
> >> No... Previous version
> >>
> >> min = Kconfig option to enfore limits ? KConfig option for min :
> >> e->hwe-
> >> >eclass->sched_props.timeslice_min
> >> same for max
> >>
> >> Results in:
> >>
> >> if cap nice && !Kconfig option to enfore limits
> >> (enforce_schedule_limit returns false):
> >> 	user can do whatever
> >> else if cap_nice || Kconfig option to enfore limit
> >> 	user within Kconfig range
> >> else
> >>  	user within sysfs range
> >>
> >> !cap_nice && Kconfig option to enfore limits == user within Kconfig
> >> range
> >> (previously) !cap_nice && Kconfig option to enfore limits == user
> >> within sysfs range (my suggestion)
> >
> >In previous version we can achieve it by just adding one below check right?
> >#if IS_ENABLED(CONFIG_DRM_XE_ENABLE_SCHEDTIMEOUT_LIMIT) &&
> cap_nice
> >+       u32 min = XE_HW_ENGINE_TIMESLICE_MIN;
> >+       u32 max = XE_HW_ENGINE_TIMESLICE_MAX; #else
> >+       u32 min = e->hwe->eclass->sched_props.timeslice_min;
> >+       u32 max = e->hwe->eclass->sched_props.timeslice_max;
> >+#endif
> >
> >Please let me know!
> >
> 
> Ah I see. Yah, it is a limits selection issue.
> We can do,
> 
> u32 min = e->hwe->eclass->sched_props.timeslice_min;
> u32 max = e->hwe->eclass->sched_props.timeslice_max;
> 
> #if IS_ENABLED(CONFIG_DRM_XE_ENABLE_SCHEDTIMEOUT_LIMIT)
>          if (cap_nice) {
>                  u32 min = XE_HW_ENGINE_TIMESLICE_MIN;
>                  u32 max = XE_HW_ENGINE_TIMESLICE_MAX;
>          }
> #endif
> 
> Matt, Tejas
> Also, looks like you missed my another comment below.
> 
> Niranjana
> 
> >>
> >> The logic is different and I believe we want what I'm suggesting.
> >>
> >> Matt
> >>
> >> > > > +		return -EINVAL;
> >> > > >
> >> > > >  	return e->ops->set_timeslice(e, value);  } @@ -201,8 +206,12
> >> > > > @@ static int engine_set_preemption_timeout(struct xe_device *xe,
> >> > > >  					 struct xe_engine *e, u64
> value,
> >> > > >  					 bool create)
> >> > > >  {
> >> > > > -	if (!capable(CAP_SYS_NICE))
> >> > > > -		return -EPERM;
> >> > > > +	u32 min = e->hwe->eclass-
> >sched_props.preempt_timeout_min;
> >> > > > +	u32 max = e->hwe->eclass-
> >sched_props.preempt_timeout_max;
> >> > > > +
> >> > > > +	if (enforce_schedule_limit() &&
> >> > > > +	    !engine_timeout_in_range(value, min, max))
> >> > > > +		return -EINVAL;
> >> > > >
> >> > > >  	return e->ops->set_preempt_timeout(e, value);  } @@ -
> 266,11
> >> > > > +275,15 @@ static int engine_set_persistence(struct xe_device
> >> > > > +*xe,
> >> > > > struct xe_engine *e,  static int engine_set_job_timeout(struct
> >> > > > xe_device
> >> *xe, struct xe_engine *e,
> >> > > >  				  u64 value, bool create)
> >> > > >  {
> >> > > > +	u32 min = e->hwe->eclass->sched_props.job_timeout_min;
> >> > > > +	u32 max = e->hwe->eclass->sched_props.job_timeout_max;
> >> > > > +
> >> > > >  	if (XE_IOCTL_DBG(xe, !create))
> >> > > >  		return -EINVAL;
> >> > > >
> >> > > > -	if (!capable(CAP_SYS_NICE))
> >> > > > -		return -EPERM;
> >> > > > +	if (enforce_schedule_limit() &&
> >> > > > +	    !engine_timeout_in_range(value, min, max))
> >> > > > +		return -EINVAL;
> >> > > >
> >> > > >  	return e->ops->set_job_timeout(e, value);  } diff --git
> >> > > > a/drivers/gpu/drm/xe/xe_hw_engine.c
> >> > > > b/drivers/gpu/drm/xe/xe_hw_engine.c
> >> > > > index afa7d25c3852..e601bffe3b13 100644
> >> > > > --- a/drivers/gpu/drm/xe/xe_hw_engine.c
> >> > > > +++ b/drivers/gpu/drm/xe/xe_hw_engine.c
> >> > > > @@ -364,8 +364,16 @@ static void hw_engine_init_early(struct
> >> > > > xe_gt *gt, struct xe_hw_engine *hwe,
> >> > > >
> >> > > >  	if (!gt->eclass[hwe->class].sched_props.job_timeout_ms) {
> >> > > >  		gt->eclass[hwe->class].sched_props.job_timeout_ms
> = HZ *
> >> 5;
> >> > > > +		gt->eclass[hwe-
> >class].sched_props.job_timeout_min =
> >> XE_HW_ENGINE_JOB_TIMEOUT_MIN;
> >> > > > +		gt->eclass[hwe-
> >class].sched_props.job_timeout_max =
> >> > > > +XE_HW_ENGINE_JOB_TIMEOUT_MAX;
> >> > > >  		gt->eclass[hwe->class].sched_props.timeslice_us = 1
> * 1000;
> >> > > > +		gt->eclass[hwe->class].sched_props.timeslice_min =
> >> XE_HW_ENGINE_TIMESLICE_MIN;
> >> > > > +		gt->eclass[hwe->class].sched_props.timeslice_max =
> >> > > > +XE_HW_ENGINE_TIMESLICE_MAX;
> >> > > >  		gt->eclass[hwe-
> >class].sched_props.preempt_timeout_us =
> >> 640 *
> >> > > > 1000;
> >> > > > +		gt->eclass[hwe-
> >class].sched_props.preempt_timeout_min =
> >> > > > +
> >> 	XE_HW_ENGINE_PREEMPT_TIMEOUT_MIN;
> >> > > > +		gt->eclass[hwe-
> >class].sched_props.preempt_timeout_max =
> >> > > > +
> >> 	XE_HW_ENGINE_PREEMPT_TIMEOUT_MAX;
> >> > > >  		/* Record default props */
> >> > > >  		gt->eclass[hwe->class].defaults = gt->eclass[hwe-
> >> >class].sched_props;
> >> > > >  	}
> >> > > > diff --git a/drivers/gpu/drm/xe/xe_hw_engine.h
> >> > > > b/drivers/gpu/drm/xe/xe_hw_engine.h
> >> > > > index 7eca9d53c7b1..3d37d6d44261 100644
> >> > > > --- a/drivers/gpu/drm/xe/xe_hw_engine.h
> >> > > > +++ b/drivers/gpu/drm/xe/xe_hw_engine.h
> >> > > > @@ -10,6 +10,37 @@
> >> > > >
> >> > > >  struct drm_printer;
> >> > > >
> >> > > > +#ifdef CONFIG_DRM_XE_JOB_TIMEOUT_MIN #define
> >> > > > +XE_HW_ENGINE_JOB_TIMEOUT_MIN
> >> CONFIG_DRM_XE_JOB_TIMEOUT_MIN #else
> >> > > > +#define XE_HW_ENGINE_JOB_TIMEOUT_MIN 1 #endif #ifdef
> >> > > > +CONFIG_DRM_XE_JOB_TIMEOUT_MAX #define
> >> > > > +XE_HW_ENGINE_JOB_TIMEOUT_MAX
> >> CONFIG_DRM_XE_JOB_TIMEOUT_MAX #else
> >> > > > +#define XE_HW_ENGINE_JOB_TIMEOUT_MAX (10 * 1000) #endif
> #ifdef
> >> > > > +CONFIG_DRM_XE_TIMESLICE_MIN #define
> >> XE_HW_ENGINE_TIMESLICE_MIN
> >> > > > +CONFIG_DRM_XE_TIMESLICE_MIN #else #define
> >> > > > +XE_HW_ENGINE_TIMESLICE_MIN 1 #endif #ifdef
> >> > > > +CONFIG_DRM_XE_TIMESLICE_MAX #define
> >> XE_HW_ENGINE_TIMESLICE_MAX
> >> > > > +CONFIG_DRM_XE_TIMESLICE_MAX #else #define
> >> > > > +XE_HW_ENGINE_TIMESLICE_MAX (10 * 1000 * 1000) #endif #ifdef
> >> > > > +CONFIG_DRM_XE_PREEMPT_TIMEOUT_MIN
> >> > > > +#define XE_HW_ENGINE_PREEMPT_TIMEOUT_MIN
> >> > > > +CONFIG_DRM_XE_PREEMPT_TIMEOUT_MIN #else #define
> >> > > > +XE_HW_ENGINE_PREEMPT_TIMEOUT_MIN 1 #endif #ifdef
> >> > > > +CONFIG_DRM_XE_PREEMPT_TIMEOUT_MAX
> >> > > > +#define XE_HW_ENGINE_PREEMPT_TIMEOUT_MAX
> >> > > > +CONFIG_DRM_XE_PREEMPT_TIMEOUT_MAX #else #define
> >> > > > +XE_HW_ENGINE_PREEMPT_TIMEOUT_MAX (10 * 1000 * 1000)
> #endif
> >> > > > +
> >> > > >  int xe_hw_engines_init_early(struct xe_gt *gt);  int
> >> > > > xe_hw_engines_init(struct xe_gt *gt);  void
> >> > > > xe_hw_engine_handle_irq(struct xe_hw_engine *hwe, u16
> >> > > > intr_vec); diff --git
> >> > > > a/drivers/gpu/drm/xe/xe_hw_engine_class_sysfs.c
> >> > > > b/drivers/gpu/drm/xe/xe_hw_engine_class_sysfs.c
> >> > > > index 990bb675d1e0..2b7ac4e02db6 100644
> >> > > > --- a/drivers/gpu/drm/xe/xe_hw_engine_class_sysfs.c
> >> > > > +++ b/drivers/gpu/drm/xe/xe_hw_engine_class_sysfs.c
> >> > > > @@ -11,6 +11,20 @@
> >> > > >
> >> > > >  static int xe_add_hw_engine_class_defaults(struct kobject
> >> > > > *parent);
> >> > > >
> >> > > > +bool enforce_schedule_limit(void) { #if
> >> > > > +IS_ENABLED(CONFIG_DRM_XE_ENABLE_SCHEDTIMEOUT_LIMIT)
> >> > > > +	return true;
> >> > > > +#else
> >> > > > +	return !capable(CAP_SYS_NICE); #endif }
> >> > > > +
> >> > > > +bool engine_timeout_in_range(u64 timeout, u64 min, u64 max) {
> >> > > > +	return timeout >= min && timeout <= max; }
> >> > > > +
> >> > > >  static void kobj_xe_hw_engine_release(struct kobject *kobj)  {
> >> > > >  	kfree(kobj);
> >> > > > @@ -39,11 +53,92 @@ kobj_xe_hw_engine_class(struct kobject
> >> *parent, char *name)
> >> > > >  	return keclass;
> >> > > >  }
> >> > > >
> >> > > > +static ssize_t job_timeout_max_store(struct kobject *kobj,
> >> > > > +				     struct kobj_attribute *attr,
> >> > > > +				     const char *buf, size_t count) {
> >> > > > +	struct xe_hw_engine_class_intf *eclass =
> kobj_to_eclass(kobj);
> >> > > > +	u32 timeout;
> >> > > > +	int err;
> >> > > > +
> >> > > > +	err = kstrtou32(buf, 0, &timeout);
> >> > > > +	if (err)
> >> > > > +		return err;
> >> > > > +
> >> > > > +	if (timeout < eclass->sched_props.job_timeout_min)
> >> > > > +		return -EINVAL;
> >> > > > +
> >> > > > +	if (enforce_schedule_limit() &&
> >> > > > +	    !engine_timeout_in_range(timeout,
> >> > > > +
> XE_HW_ENGINE_JOB_TIMEOUT_MIN,
> >> > > > +
> XE_HW_ENGINE_JOB_TIMEOUT_MAX))
> >> > > > +		return -EINVAL;
> >> > > > +
> >> > > > +	WRITE_ONCE(eclass->sched_props.job_timeout_max,
> timeout);
> >> > > > +
> >> > > > +	return count;
> >> > > > +}
> >> > > > +
> >> > > > +static ssize_t job_timeout_max_show(struct kobject *kobj,
> >> > > > +				    struct kobj_attribute *attr, char
> *buf) {
> >> > > > +	struct xe_hw_engine_class_intf *eclass =
> >> > > > +kobj_to_eclass(kobj);
> >> > > > +
> >> > > > +	return sprintf(buf, "%u\n",
> >> > > > +eclass->sched_props.job_timeout_max);
> >> > > > +}
> >> > > > +
> >> > > > +static struct kobj_attribute job_timeout_max_attr =
> >> > > > +__ATTR(job_timeout_max, 0644, job_timeout_max_show,
> >> > > > +job_timeout_max_store);
> >> > > > +
> >> > > > +static ssize_t job_timeout_min_store(struct kobject *kobj,
> >> > > > +				     struct kobj_attribute *attr,
> >> > > > +				     const char *buf, size_t count) {
> >> > > > +	struct xe_hw_engine_class_intf *eclass =
> kobj_to_eclass(kobj);
> >> > > > +	u32 timeout;
> >> > > > +	int err;
> >> > > > +
> >> > > > +	err = kstrtou32(buf, 0, &timeout);
> >> > > > +	if (err)
> >> > > > +		return err;
> >> > > > +
> >> > > > +	if (timeout > eclass->sched_props.job_timeout_max)
> >> > > > +		return -EINVAL;
> >> > > > +
> >> > > > +	if (enforce_schedule_limit() &&
> >> > > > +	    !engine_timeout_in_range(timeout,
> >> > > > +
> XE_HW_ENGINE_JOB_TIMEOUT_MIN,
> >> > > > +
> XE_HW_ENGINE_JOB_TIMEOUT_MAX))
> >> > > > +		return -EINVAL;
> >> > > > +
> >> > > > +	WRITE_ONCE(eclass->sched_props.job_timeout_min,
> timeout);
> >> > > > +
> >> > > > +	return count;
> >> > > > +}
> >> > > > +
> >> > > > +static ssize_t job_timeout_min_show(struct kobject *kobj,
> >> > > > +				    struct kobj_attribute *attr, char
> *buf) {
> >> > > > +	struct xe_hw_engine_class_intf *eclass =
> >> > > > +kobj_to_eclass(kobj);
> >> > > > +
> >> > > > +	return sprintf(buf, "%u\n",
> >> > > > +eclass->sched_props.job_timeout_min);
> >> > > > +}
> >> > > > +
> >> > > > +static struct kobj_attribute job_timeout_min_attr =
> >> > > > +__ATTR(job_timeout_min, 0644, job_timeout_min_show,
> >> > > > +job_timeout_min_store);
> >> > > > +
> >> > > >  static ssize_t job_timeout_store(struct kobject *kobj,
> >> > > >  				 struct kobj_attribute *attr,
> >> > > >  				 const char *buf, size_t count)  {
> >> > > >  	struct xe_hw_engine_class_intf *eclass =
> >> > > > kobj_to_eclass(kobj);
> >> > > > +#if IS_ENABLED(CONFIG_DRM_XE_ENABLE_SCHEDTIMEOUT_LIMIT)
> >> > > > +	u32 min = XE_HW_ENGINE_JOB_TIMEOUT_MIN;
> >> > > > +	u32 max = XE_HW_ENGINE_JOB_TIMEOUT_MAX; #else
> >> > > > +	u32 min = e->hwe->eclass->sched_props.job_timeout_min;
> >> > > > +	u32 max = e->hwe->eclass->sched_props.job_timeout_max;
> >> > > > +#endif
> >> > >
> >> > > I don't think we need this, just make sure default is within min
> >> > > / max of the sched_props.
> >> > >
> >> >
> >> > Shouldn't the sched_prop set through sysfs here which applies to
> >> > all future user engines (xe_engine) has the same requirement as the
> >> > sched_prop set directly to user engine (xe_engine) through
> >> > set_properly
> >> ioctl?
> >> > ie., shoudln't the requirement be same in job_timeout_store() and
> >> > engine_set_job_timeout()?

I also think it should apply same to sysfs calls as well. Unless we think sysfs should limit to compile configs only. Since sysfs min/max cab be changed.

Thanks,
Tejas

> >> >
> >> > Niranjana
> >> >
> >> > > Matt
> >> > >
> >> > > >  	u32 timeout;
> >> > > >  	int err;
> >> > > >
> >> > > > @@ -51,6 +146,10 @@ static ssize_t job_timeout_store(struct
> >> > > > kobject
> >> *kobj,
> >> > > >  	if (err)
> >> > > >  		return err;
> >> > > >
> >> > > > +	if (enforce_schedule_limit() &&
> >> > > > +	    !engine_timeout_in_range(timeout, min, max))
> >> > > > +		return -EINVAL;
> >> > > > +
> >> > > >  	WRITE_ONCE(eclass->sched_props.job_timeout_ms,
> timeout);
> >> > > >
> >> > > >  	return count;
> >> > > > @@ -78,11 +177,40 @@ static ssize_t job_timeout_default(struct
> >> > > > kobject *kobj,  static struct kobj_attribute job_timeout_def =
> >> > > > __ATTR(job_timeout_ms, 0444, job_timeout_default, NULL);
> >> > > >
> >> > > > +static ssize_t job_timeout_min_default(struct kobject *kobj,
> >> > > > +				       struct kobj_attribute *attr, char
> *buf) {
> >> > > > +	struct xe_hw_engine_class_intf *eclass =
> >> > > > +kobj_to_eclass(kobj->parent);
> >> > > > +
> >> > > > +	return sprintf(buf, "%u\n",
> >> > > > +eclass->defaults.job_timeout_min);
> >> > > > +}
> >> > > > +
> >> > > > +static struct kobj_attribute job_timeout_min_def =
> >> > > > +__ATTR(job_timeout_min, 0444, job_timeout_min_default, NULL);
> >> > > > +
> >> > > > +static ssize_t job_timeout_max_default(struct kobject *kobj,
> >> > > > +				       struct kobj_attribute *attr, char
> *buf) {
> >> > > > +	struct xe_hw_engine_class_intf *eclass =
> >> > > > +kobj_to_eclass(kobj->parent);
> >> > > > +
> >> > > > +	return sprintf(buf, "%u\n",
> >> > > > +eclass->defaults.job_timeout_max);
> >> > > > +}
> >> > > > +
> >> > > > +static struct kobj_attribute job_timeout_max_def =
> >> > > > +__ATTR(job_timeout_max, 0444, job_timeout_max_default, NULL);
> >> > > > +
> >> > > >  static ssize_t timeslice_duration_store(struct kobject *kobj,
> >> > > >  					struct kobj_attribute *attr,
> >> > > >  					const char *buf, size_t count)
> {
> >> > > >  	struct xe_hw_engine_class_intf *eclass =
> >> > > > kobj_to_eclass(kobj);
> >> > > > +#if IS_ENABLED(CONFIG_DRM_XE_ENABLE_SCHEDTIMEOUT_LIMIT)
> >> > > > +	u32 min = XE_HW_ENGINE_TIMESLICE_MIN;
> >> > > > +	u32 max = XE_HW_ENGINE_TIMESLICE_MAX; #else
> >> > > > +	u32 min = e->hwe->eclass->sched_props.timeslice_min;
> >> > > > +	u32 max = e->hwe->eclass->sched_props.timeslice_max;
> >> > > > +#endif
> >> > > >  	u32 duration;
> >> > > >  	int err;
> >> > > >
> >> > > > @@ -90,11 +218,92 @@ static ssize_t
> >> > > > timeslice_duration_store(struct
> >> kobject *kobj,
> >> > > >  	if (err)
> >> > > >  		return err;
> >> > > >
> >> > > > +	if (enforce_schedule_limit() &&
> >> > > > +	    !engine_timeout_in_range(duration, min, max))
> >> > > > +		return -EINVAL;
> >> > > > +
> >> > > >  	WRITE_ONCE(eclass->sched_props.timeslice_us, duration);
> >> > > >
> >> > > >  	return count;
> >> > > >  }
> >> > > >
> >> > > > +static ssize_t timeslice_duration_max_store(struct kobject *kobj,
> >> > > > +					    struct kobj_attribute *attr,
> >> > > > +					    const char *buf, size_t
> count) {
> >> > > > +	struct xe_hw_engine_class_intf *eclass =
> kobj_to_eclass(kobj);
> >> > > > +	u32 duration;
> >> > > > +	int err;
> >> > > > +
> >> > > > +	err = kstrtou32(buf, 0, &duration);
> >> > > > +	if (err)
> >> > > > +		return err;
> >> > > > +
> >> > > > +	if (duration < eclass->sched_props.timeslice_min)
> >> > > > +		return -EINVAL;
> >> > > > +
> >> > > > +	if (enforce_schedule_limit() &&
> >> > > > +	    !engine_timeout_in_range(duration,
> >> > > > +				     XE_HW_ENGINE_TIMESLICE_MIN,
> >> > > > +
> XE_HW_ENGINE_TIMESLICE_MAX))
> >> > > > +		return -EINVAL;
> >> > > > +
> >> > > > +	WRITE_ONCE(eclass->sched_props.timeslice_max, duration);
> >> > > > +
> >> > > > +	return count;
> >> > > > +}
> >> > > > +
> >> > > > +static ssize_t timeslice_duration_max_show(struct kobject *kobj,
> >> > > > +					   struct kobj_attribute *attr,
> >> > > > +					   char *buf)
> >> > > > +{
> >> > > > +	struct xe_hw_engine_class_intf *eclass =
> >> > > > +kobj_to_eclass(kobj);
> >> > > > +
> >> > > > +	return sprintf(buf, "%u\n",
> >> > > > +eclass->sched_props.timeslice_max);
> >> > > > +}
> >> > > > +
> >> > > > +static struct kobj_attribute timeslice_duration_max_attr =
> >> > > > +	__ATTR(timeslice_duration_max, 0644,
> >> timeslice_duration_max_show,
> >> > > > +	       timeslice_duration_max_store);
> >> > > > +
> >> > > > +static ssize_t timeslice_duration_min_store(struct kobject *kobj,
> >> > > > +					    struct kobj_attribute *attr,
> >> > > > +					    const char *buf, size_t
> count) {
> >> > > > +	struct xe_hw_engine_class_intf *eclass =
> kobj_to_eclass(kobj);
> >> > > > +	u32 duration;
> >> > > > +	int err;
> >> > > > +
> >> > > > +	err = kstrtou32(buf, 0, &duration);
> >> > > > +	if (err)
> >> > > > +		return err;
> >> > > > +
> >> > > > +	if (duration > eclass->sched_props.timeslice_max)
> >> > > > +		return -EINVAL;
> >> > > > +
> >> > > > +	if (enforce_schedule_limit() &&
> >> > > > +	    !engine_timeout_in_range(duration,
> >> > > > +				     XE_HW_ENGINE_TIMESLICE_MIN,
> >> > > > +
> XE_HW_ENGINE_TIMESLICE_MAX))
> >> > > > +		return -EINVAL;
> >> > > > +
> >> > > > +	WRITE_ONCE(eclass->sched_props.timeslice_min, duration);
> >> > > > +
> >> > > > +	return count;
> >> > > > +}
> >> > > > +
> >> > > > +static ssize_t timeslice_duration_min_show(struct kobject *kobj,
> >> > > > +					   struct kobj_attribute *attr,
> char
> >> *buf) {
> >> > > > +	struct xe_hw_engine_class_intf *eclass =
> >> > > > +kobj_to_eclass(kobj);
> >> > > > +
> >> > > > +	return sprintf(buf, "%u\n",
> >> > > > +eclass->sched_props.timeslice_min);
> >> > > > +}
> >> > > > +
> >> > > > +static struct kobj_attribute timeslice_duration_min_attr =
> >> > > > +	__ATTR(timeslice_duration_min, 0644,
> >> timeslice_duration_min_show,
> >> > > > +	       timeslice_duration_min_store);
> >> > > > +
> >> > > >  static ssize_t timeslice_duration_show(struct kobject *kobj,
> >> > > >  		struct kobj_attribute *attr, char *buf)  { @@ -118,11
> >> > > > +327,40 @@ static ssize_t timeslice_default(struct kobject
> >> > > > *kobj,  static struct kobj_attribute timeslice_duration_def =
> >> > > > __ATTR(timeslice_duration_us, 0444, timeslice_default, NULL);
> >> > > >
> >> > > > +static ssize_t timeslice_min_default(struct kobject *kobj,
> >> > > > +				     struct kobj_attribute *attr, char
> *buf) {
> >> > > > +	struct xe_hw_engine_class_intf *eclass =
> >> > > > +kobj_to_eclass(kobj->parent);
> >> > > > +
> >> > > > +	return sprintf(buf, "%u\n", eclass->defaults.timeslice_min);
> >> > > > +}
> >> > > > +
> >> > > > +static struct kobj_attribute timeslice_duration_min_def =
> >> > > > +__ATTR(timeslice_duration_min, 0444, timeslice_min_default,
> >> > > > +NULL);
> >> > > > +
> >> > > > +static ssize_t timeslice_max_default(struct kobject *kobj,
> >> > > > +				     struct kobj_attribute *attr, char
> *buf) {
> >> > > > +	struct xe_hw_engine_class_intf *eclass =
> >> > > > +kobj_to_eclass(kobj->parent);
> >> > > > +
> >> > > > +	return sprintf(buf, "%u\n", eclass->defaults.timeslice_max);
> >> > > > +}
> >> > > > +
> >> > > > +static struct kobj_attribute timeslice_duration_max_def =
> >> > > > +__ATTR(timeslice_duration_max, 0444, timeslice_max_default,
> >> > > > +NULL);
> >> > > > +
> >> > > >  static ssize_t preempt_timeout_store(struct kobject *kobj,
> >> > > >  				     struct kobj_attribute *attr,
> >> > > >  				     const char *buf, size_t count)  {
> >> > > >  	struct xe_hw_engine_class_intf *eclass =
> >> > > > kobj_to_eclass(kobj);
> >> > > > +#if IS_ENABLED(CONFIG_DRM_XE_ENABLE_SCHEDTIMEOUT_LIMIT)
> >> > > > +	u32 min = XE_HW_ENGINE_PREEMPT_TIMEOUT_MIN;
> >> > > > +	u32 max = XE_HW_ENGINE_PREEMPT_TIMEOUT_MAX; #else
> >> > > > +	u32 min = e->hwe->eclass-
> >sched_props.preempt_timeout_min;
> >> > > > +	u32 max = e->hwe->eclass-
> >sched_props.preempt_timeout_max;
> >> > > > +#endif
> >> > > >  	u32 timeout;
> >> > > >  	int err;
> >> > > >
> >> > > > @@ -130,6 +368,10 @@ static ssize_t
> >> > > > preempt_timeout_store(struct
> >> kobject *kobj,
> >> > > >  	if (err)
> >> > > >  		return err;
> >> > > >
> >> > > > +	if (enforce_schedule_limit() &&
> >> > > > +	    !engine_timeout_in_range(timeout, min, max))
> >> > > > +		return -EINVAL;
> >> > > > +
> >> > > >  	WRITE_ONCE(eclass->sched_props.preempt_timeout_us,
> timeout);
> >> > > >
> >> > > >  	return count;
> >> > > > @@ -158,17 +400,129 @@ static ssize_t
> >> > > > preempt_timeout_default(struct kobject *kobj,  static struct
> >> > > > kobj_attribute preempt_timeout_def =
> >> > > > __ATTR(preempt_timeout_us, 0444, preempt_timeout_default,
> >> > > > NULL);
> >> > > >
> >> > > > +static ssize_t preempt_timeout_min_default(struct kobject *kobj,
> >> > > > +					   struct kobj_attribute *attr,
> >> > > > +					   char *buf)
> >> > > > +{
> >> > > > +	struct xe_hw_engine_class_intf *eclass =
> >> > > > +kobj_to_eclass(kobj->parent);
> >> > > > +
> >> > > > +	return sprintf(buf, "%u\n",
> >> > > > +eclass->defaults.preempt_timeout_min);
> >> > > > +}
> >> > > > +
> >> > > > +static struct kobj_attribute preempt_timeout_min_def =
> >> > > > +__ATTR(preempt_timeout_min, 0444,
> preempt_timeout_min_default,
> >> > > > +NULL);
> >> > > > +
> >> > > > +static ssize_t preempt_timeout_max_default(struct kobject *kobj,
> >> > > > +					   struct kobj_attribute *attr,
> >> > > > +					   char *buf)
> >> > > > +{
> >> > > > +	struct xe_hw_engine_class_intf *eclass =
> >> > > > +kobj_to_eclass(kobj->parent);
> >> > > > +
> >> > > > +	return sprintf(buf, "%u\n",
> >> > > > +eclass->defaults.preempt_timeout_max);
> >> > > > +}
> >> > > > +
> >> > > > +static struct kobj_attribute preempt_timeout_max_def =
> >> > > > +__ATTR(preempt_timeout_max, 0444,
> >> preempt_timeout_max_default,
> >> > > > +NULL);
> >> > > > +
> >> > > > +static ssize_t preempt_timeout_max_store(struct kobject *kobj,
> >> > > > +					 struct kobj_attribute *attr,
> >> > > > +					 const char *buf, size_t count)
> {
> >> > > > +	struct xe_hw_engine_class_intf *eclass =
> kobj_to_eclass(kobj);
> >> > > > +	u32 timeout;
> >> > > > +	int err;
> >> > > > +
> >> > > > +	err = kstrtou32(buf, 0, &timeout);
> >> > > > +	if (err)
> >> > > > +		return err;
> >> > > > +
> >> > > > +	if (timeout < eclass->sched_props.preempt_timeout_min)
> >> > > > +		return -EINVAL;
> >> > > > +
> >> > > > +	if (enforce_schedule_limit() &&
> >> > > > +	    !engine_timeout_in_range(timeout,
> >> > > > +
> >> XE_HW_ENGINE_PREEMPT_TIMEOUT_MIN,
> >> > > > +
> >> XE_HW_ENGINE_PREEMPT_TIMEOUT_MAX))
> >> > > > +		return -EINVAL;
> >> > > > +
> >> > > > +	WRITE_ONCE(eclass->sched_props.preempt_timeout_max,
> timeout);
> >> > > > +
> >> > > > +	return count;
> >> > > > +}
> >> > > > +
> >> > > > +static ssize_t preempt_timeout_max_show(struct kobject *kobj,
> >> > > > +					struct kobj_attribute *attr,
> char *buf)
> >> {
> >> > > > +	struct xe_hw_engine_class_intf *eclass =
> >> > > > +kobj_to_eclass(kobj);
> >> > > > +
> >> > > > +	return sprintf(buf, "%u\n",
> >> > > > +eclass->sched_props.preempt_timeout_max);
> >> > > > +}
> >> > > > +
> >> > > > +static struct kobj_attribute preempt_timeout_max_attr =
> >> > > > +	__ATTR(preempt_timeout_max, 0644,
> preempt_timeout_max_show,
> >> > > > +	       preempt_timeout_max_store);
> >> > > > +
> >> > > > +static ssize_t preempt_timeout_min_store(struct kobject *kobj,
> >> > > > +					 struct kobj_attribute *attr,
> >> > > > +					 const char *buf, size_t count)
> {
> >> > > > +	struct xe_hw_engine_class_intf *eclass =
> kobj_to_eclass(kobj);
> >> > > > +	u32 timeout;
> >> > > > +	int err;
> >> > > > +
> >> > > > +	err = kstrtou32(buf, 0, &timeout);
> >> > > > +	if (err)
> >> > > > +		return err;
> >> > > > +
> >> > > > +	if (timeout > eclass->sched_props.preempt_timeout_max)
> >> > > > +		return -EINVAL;
> >> > > > +
> >> > > > +	if (enforce_schedule_limit() &&
> >> > > > +	    !engine_timeout_in_range(timeout,
> >> > > > +
> >> XE_HW_ENGINE_PREEMPT_TIMEOUT_MIN,
> >> > > > +
> >> XE_HW_ENGINE_PREEMPT_TIMEOUT_MAX))
> >> > > > +		return -EINVAL;
> >> > > > +
> >> > > > +	WRITE_ONCE(eclass->sched_props.preempt_timeout_min,
> timeout);
> >> > > > +
> >> > > > +	return count;
> >> > > > +}
> >> > > > +
> >> > > > +static ssize_t preempt_timeout_min_show(struct kobject *kobj,
> >> > > > +					struct kobj_attribute *attr,
> char *buf)
> >> {
> >> > > > +	struct xe_hw_engine_class_intf *eclass =
> >> > > > +kobj_to_eclass(kobj);
> >> > > > +
> >> > > > +	return sprintf(buf, "%u\n",
> >> > > > +eclass->sched_props.preempt_timeout_min);
> >> > > > +}
> >> > > > +
> >> > > > +static struct kobj_attribute preempt_timeout_min_attr =
> >> > > > +	__ATTR(preempt_timeout_min, 0644,
> preempt_timeout_min_show,
> >> > > > +	       preempt_timeout_min_store);
> >> > > > +
> >> > > >  static const struct attribute *defaults[] = {
> >> > > >  	&job_timeout_def.attr,
> >> > > > +	&job_timeout_min_def.attr,
> >> > > > +	&job_timeout_max_def.attr,
> >> > > >  	&timeslice_duration_def.attr,
> >> > > > +	&timeslice_duration_min_def.attr,
> >> > > > +	&timeslice_duration_max_def.attr,
> >> > > >  	&preempt_timeout_def.attr,
> >> > > > +	&preempt_timeout_min_def.attr,
> >> > > > +	&preempt_timeout_max_def.attr,
> >> > > >  	NULL
> >> > > >  };
> >> > > >
> >> > > >  static const struct attribute *files[] = {
> >> > > >  	&job_timeout_attr.attr,
> >> > > > +	&job_timeout_min_attr.attr,
> >> > > > +	&job_timeout_max_attr.attr,
> >> > > >  	&timeslice_duration_attr.attr,
> >> > > > +	&timeslice_duration_min_attr.attr,
> >> > > > +	&timeslice_duration_max_attr.attr,
> >> > > >  	&preempt_timeout_attr.attr,
> >> > > > +	&preempt_timeout_min_attr.attr,
> >> > > > +	&preempt_timeout_max_attr.attr,
> >> > > >  	NULL
> >> > > >  };
> >> > > >
> >> > > > diff --git a/drivers/gpu/drm/xe/xe_hw_engine_class_sysfs.h
> >> > > > b/drivers/gpu/drm/xe/xe_hw_engine_class_sysfs.h
> >> > > > index 757136614672..2e2ab351a991 100644
> >> > > > --- a/drivers/gpu/drm/xe/xe_hw_engine_class_sysfs.h
> >> > > > +++ b/drivers/gpu/drm/xe/xe_hw_engine_class_sysfs.h
> >> > > > @@ -10,6 +10,8 @@
> >> > > >
> >> > > >  #define MAX_ENGINE_CLASS_NAME_LEN    16
> >> > > >  int xe_hw_engine_class_sysfs_init(struct xe_gt *gt);
> >> > > > +bool enforce_schedule_limit(void); bool
> >> > > > +engine_timeout_in_range(u64 timeout, u64 min, u64 max);
> >> > > >
> >> > > >  /**
> >> > > >   * struct kobj_eclass - A eclass's kobject struct that
> >> > > > connects the kobject and the
> >> > > > --
> >> > > > 2.25.1
> >> > > >

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

* Re: [Intel-xe] [PATCH V9 1/6] drm/xe: Add sysfs entries for engines under its GT
  2023-07-27 14:41   ` Matthew Brost
@ 2023-07-28 13:22     ` Upadhyay, Tejas
  0 siblings, 0 replies; 30+ messages in thread
From: Upadhyay, Tejas @ 2023-07-28 13:22 UTC (permalink / raw)
  To: Brost, Matthew; +Cc: intel-xe@lists.freedesktop.org



> -----Original Message-----
> From: Brost, Matthew <matthew.brost@intel.com>
> Sent: Thursday, July 27, 2023 8:12 PM
> To: Upadhyay, Tejas <tejas.upadhyay@intel.com>
> Cc: intel-xe@lists.freedesktop.org; Vishwanathapura, Niranjana
> <niranjana.vishwanathapura@intel.com>
> Subject: Re: [PATCH V9 1/6] drm/xe: Add sysfs entries for engines under its
> GT
> 
> On Thu, Jul 27, 2023 at 01:52:30PM +0530, Tejas Upadhyay wrote:
> > Add engines sysfs directory under its GT and create sub directory for
> > all engine class (note its not per instance) present on GT.
> >
> > For example,
> > DUT# cat /sys/class/drm/cardX/device/tileN/gtN/engines/
> > bcs/ ccs/
> >
> > V5 :
> >    - replace xe_engine with xe_hw_engine - Matt
> > V4 :
> >    - Rebase to resolve conflicts - CI
> > V3 :
> >    - Move code in its own file
> >    - Rename API name
> > V2 :
> >    - Correct class mask logic - Himal
> >    - Remove extra parenthesis
> >
> 
> A couple nits, otherwise LGTM.
> 
> > Signed-off-by: Tejas Upadhyay <tejas.upadhyay@intel.com>
> > ---
> >  drivers/gpu/drm/xe/Makefile                   |   1 +
> >  drivers/gpu/drm/xe/xe_gt.c                    |   7 ++
> >  drivers/gpu/drm/xe/xe_hw_engine_class_sysfs.c | 111
> > ++++++++++++++++++  drivers/gpu/drm/xe/xe_hw_engine_class_sysfs.h |
> > 13 ++
> >  4 files changed, 132 insertions(+)
> >  create mode 100644 drivers/gpu/drm/xe/xe_hw_engine_class_sysfs.c
> >  create mode 100644 drivers/gpu/drm/xe/xe_hw_engine_class_sysfs.h
> >
> > diff --git a/drivers/gpu/drm/xe/Makefile b/drivers/gpu/drm/xe/Makefile
> > index 4ea9e3150c20..a3099a4fd56b 100644
> > --- a/drivers/gpu/drm/xe/Makefile
> > +++ b/drivers/gpu/drm/xe/Makefile
> > @@ -52,6 +52,7 @@ xe-y += xe_bb.o \
> >  	xe_device_sysfs.o \
> >  	xe_dma_buf.o \
> >  	xe_engine.o \
> > +	xe_hw_engine_class_sysfs.o \
> 
> This is out of place alphabetically.
> 
> >  	xe_exec.o \
> >  	xe_execlist.o \
> >  	xe_force_wake.o \
> > diff --git a/drivers/gpu/drm/xe/xe_gt.c b/drivers/gpu/drm/xe/xe_gt.c
> > index 3e32d38aeeea..d52eb45896a7 100644
> > --- a/drivers/gpu/drm/xe/xe_gt.c
> > +++ b/drivers/gpu/drm/xe/xe_gt.c
> > @@ -27,6 +27,7 @@
> >  #include "xe_gt_topology.h"
> >  #include "xe_guc_engine_types.h"
> >  #include "xe_hw_fence.h"
> > +#include "xe_hw_engine_class_sysfs.h"
> >  #include "xe_irq.h"
> >  #include "xe_lrc.h"
> >  #include "xe_map.h"
> > @@ -322,6 +323,12 @@ static int gt_fw_domain_init(struct xe_gt *gt)
> >  	if (err)
> >  		goto err_force_wake;
> >
> > +	err = xe_hw_engine_class_sysfs_init(gt);
> > +	if (err)
> > +		drm_warn(&gt_to_xe(gt)->drm,
> > +			 "failed to register engines sysfs directory, err: %d\n",
> > +			 err);
> > +
> >  	err = xe_force_wake_put(gt_to_fw(gt), XE_FW_GT);
> >  	XE_WARN_ON(err);
> >  	xe_device_mem_access_put(gt_to_xe(gt));
> > diff --git a/drivers/gpu/drm/xe/xe_hw_engine_class_sysfs.c
> > b/drivers/gpu/drm/xe/xe_hw_engine_class_sysfs.c
> > new file mode 100644
> > index 000000000000..c2f092b54af1
> > --- /dev/null
> > +++ b/drivers/gpu/drm/xe/xe_hw_engine_class_sysfs.c
> > @@ -0,0 +1,111 @@
> > +// SPDX-License-Identifier: MIT
> > +/*
> > + * Copyright (c) 2023 Intel Corporation  */
> > +
> > +#include <drm/drm_managed.h>
> > +#include <linux/kobject.h>
> > +#include <linux/sysfs.h>
> > +
> > +#include "xe_hw_engine_class_sysfs.h"
> > +
> > +static void kobj_xe_hw_engine_release(struct kobject *kobj) {
> > +	kfree(kobj);
> > +}
> > +
> > +static const struct kobj_type kobj_xe_hw_engine_type = {
> > +	.release = kobj_xe_hw_engine_release,
> > +	.sysfs_ops = &kobj_sysfs_ops
> > +};
> > +
> > +static struct kobject *
> > +kobj_xe_hw_engine(struct kobject *parent, char *name) {
> > +	struct kobject *kobj;
> > +
> > +	kobj = kzalloc(sizeof(*kobj), GFP_KERNEL);
> > +	if (!kobj)
> > +		return NULL;
> > +
> > +	kobject_init(kobj, &kobj_xe_hw_engine_type);
> > +	if (kobject_add(kobj, parent, "%s", name)) {
> > +		kobject_put(kobj);
> > +		return NULL;
> > +	}
> > +
> > +	return kobj;
> > +}
> > +
> > +static void xe_hw_engine_sysfs_kobj_release(struct kobject *kobj) {
> > +	kfree(kobj);
> > +}
> > +
> > +static const struct kobj_type xe_hw_engine_sysfs_kobj_type = {
> > +	.release = xe_hw_engine_sysfs_kobj_release,
> > +	.sysfs_ops = &kobj_sysfs_ops,
> > +};
> > +
> 
> We should have kernel doc for all non-static functions, this a WIP across the
> driver but since this is new code I think we should include kernel doc for this
> function.
> 
> > +int xe_hw_engine_class_sysfs_init(struct xe_gt *gt) {
> > +	struct xe_hw_engine *hwe;
> > +	enum xe_hw_engine_id id;
> > +	struct kobject *kobj;
> > +	u16 class_mask = 0;
> > +	int err = 0;
> > +
> > +	kobj = kzalloc(sizeof(*kobj), GFP_KERNEL);
> > +	if (!kobj)
> > +		return -ENOMEM;
> > +
> > +	kobject_init(kobj, &xe_hw_engine_sysfs_kobj_type);
> > +
> > +	err = kobject_add(kobj, gt->sysfs, "engines");
> > +	if (err) {
> > +		kobject_put(kobj);
> > +		return err;
> > +	}
> > +
> > +	for_each_hw_engine(hwe, gt, id) {
> > +		char name[MAX_ENGINE_CLASS_NAME_LEN];
> > +		struct kobject *khwe;
> > +
> > +		if (hwe->class == XE_ENGINE_CLASS_OTHER ||
> > +		    hwe->class == XE_ENGINE_CLASS_MAX)
> > +			continue;
> > +
> > +		if ((class_mask >> hwe->class) & 1)
> > +			continue;
> > +
> > +		class_mask |= 1 << hwe->class;
> > +
> > +		switch (hwe->class) {
> > +		case XE_ENGINE_CLASS_RENDER:
> > +			strcpy(name, "rcs");
> > +			break;
> > +		case XE_ENGINE_CLASS_VIDEO_DECODE:
> > +			strcpy(name, "vcs");
> > +			break;
> > +		case XE_ENGINE_CLASS_VIDEO_ENHANCE:
> > +			strcpy(name, "vecs");
> > +			break;
> > +		case XE_ENGINE_CLASS_COPY:
> > +			strcpy(name, "bcs");
> > +			break;
> > +		case XE_ENGINE_CLASS_COMPUTE:
> > +			strcpy(name, "ccs");
> > +			break;
> > +		default:
> > +			kobject_put(kobj);
> > +			return -EINVAL;
> > +		}
> > +
> > +		khwe = kobj_xe_hw_engine(kobj, name);
> > +		if (!khwe) {
> > +			kobject_put(kobj);
> > +			return -EINVAL;
> > +		}
> > +	}
> > +	return err;
> > +}
> > diff --git a/drivers/gpu/drm/xe/xe_hw_engine_class_sysfs.h
> > b/drivers/gpu/drm/xe/xe_hw_engine_class_sysfs.h
> > new file mode 100644
> > index 000000000000..c461fac717c2
> > --- /dev/null
> > +++ b/drivers/gpu/drm/xe/xe_hw_engine_class_sysfs.h
> > @@ -0,0 +1,13 @@
> > +/* SPDX-License-Identifier: MIT */
> > +/*
> > + * Copyright (c) 2023 Intel Corporation  */
> > +
> > +#ifndef _XE_ENGINE_CLASS_SYSFS_H_
> > +#define _XE_ENGINE_CLASS_SYSFS_H__
> > +
> > +#include "xe_gt.h"
> 
> No need to include this, just forward declare struct xe_gt.

Not only xe_gt, for_each_hw_engine and few others are also coming from same header.

Thanks,
Tejas
> 
> > +
> > +#define MAX_ENGINE_CLASS_NAME_LEN    16
> 
> This doesn't need to be in the header, just define in the .c file.
> 
> > +int xe_hw_engine_class_sysfs_init(struct xe_gt *gt);
> 
> Add a newline here.
> 
> Matt
> 
> > +#endif
> > --
> > 2.25.1
> >

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

* Re: [Intel-xe] [PATCH V9 6/6] drm/xe: Add min/max cap for engine scheduler properties
  2023-07-28  6:25           ` Niranjana Vishwanathapura
  2023-07-28  7:36             ` Upadhyay, Tejas
@ 2023-07-28 14:20             ` Matthew Brost
  1 sibling, 0 replies; 30+ messages in thread
From: Matthew Brost @ 2023-07-28 14:20 UTC (permalink / raw)
  To: Niranjana Vishwanathapura; +Cc: intel-xe@lists.freedesktop.org

On Thu, Jul 27, 2023 at 11:25:39PM -0700, Niranjana Vishwanathapura wrote:
> On Thu, Jul 27, 2023 at 10:54:42PM -0700, Upadhyay, Tejas wrote:
> > 
> > 
> > > -----Original Message-----
> > > From: Brost, Matthew <matthew.brost@intel.com>
> > > Sent: Friday, July 28, 2023 10:35 AM
> > > To: Vishwanathapura, Niranjana <niranjana.vishwanathapura@intel.com>
> > > Cc: Upadhyay, Tejas <tejas.upadhyay@intel.com>; intel-
> > > xe@lists.freedesktop.org
> > > Subject: Re: [PATCH V9 6/6] drm/xe: Add min/max cap for engine scheduler
> > > properties
> > > 
> > > On Thu, Jul 27, 2023 at 09:44:23PM -0700, Niranjana Vishwanathapura
> > > wrote:
> > > > On Thu, Jul 27, 2023 at 03:26:49PM +0000, Matthew Brost wrote:
> > > > > On Thu, Jul 27, 2023 at 01:52:35PM +0530, Tejas Upadhyay wrote:
> > > > > > Add sysfs entries for the min, max, and defaults for each of
> > > > > > engine scheduler controls for every hardware engine class.
> > > > > >
> > > > > > Non-elevated user IOCTLs to set these controls must be within the
> > > > > > min-max ranges of the sysfs entries, elevated user can set these
> > > > > > controls to any value. However, introduced compile time CONFIG
> > > > > > min-max values which restricts elevated user to be in compile time
> > > > > > min-max range if at all sysfs min/max are violated.
> > > > > >
> > > > > > Sysfs entries examples are,
> > > > > > DUT# cat /sys/class/drm/cardX/device/tileN/gtN/engines/ccs/.defaults/
> > > > > > job_timeout_max         job_timeout_ms          preempt_timeout_min
> > > timeslice_duration_max  timeslice_duration_us
> > > > > > job_timeout_min         preempt_timeout_max     preempt_timeout_us
> > > timeslice_duration_min
> > > > > >
> > > > > > DUT# cat /sys/class/drm/card1/device/tileN/gtN/engines/ccs/
> > > > > > .defaults/              job_timeout_min         preempt_timeout_max
> > > preempt_timeout_us      timeslice_duration_min
> > > > > > job_timeout_max         job_timeout_ms          preempt_timeout_min
> > > timeslice_duration_max  timeslice_duration_us
> > > > > >
> > > > > > V9 :
> > > > > >    - Rebase to use s/xe_engine/xe_hw_engine/ - Matt
> > > > > > V8 :
> > > > > >    - fix enforce_sched_limit and avoid code duplication - Niranjana
> > > > > >    - Make sure min < max - Niranjana
> > > > > > V7 :
> > > > > >    - Rebase to replace hw engine with eclass interface
> > > > > >    - return EINVAL in place of EPERM
> > > > > >    - Use some APIs to avoid code duplication
> > > > > > V6 :
> > > > > >    - Rebase changes to reflect per engine class props interface - MattB
> > > > > >    - Use #if ENABLED - MattB
> > > > > >    - Remove MAX_SCHED_TIMEOUT check as range validation is enough
> > > > > > V5 :
> > > > > >    - Rebase to resolve conflicts - CI
> > > > > > V4 :
> > > > > >    - Rebase
> > > > > >    - Update commit to reflect tile addition
> > > > > >    - Use XE_HW macro directly as they are already filtered
> > > > > >      for CONFIG checks - Niranjana
> > > > > >    - Add CONFIG for enable/disable min/max limitation
> > > > > >      on elevated user. Default is enable - Matt/Joonas
> > > > > > V3 :
> > > > > >    - Resolve CI hooks warning for kernel-doc
> > > > > > V2 :
> > > > > >    - Restric min/max setting to #define default min/max for
> > > > > >      elevated user - Himal
> > > > > >    - Remove unrelated changes from patch - Niranjana
> > > > > >
> > > > > > Signed-off-by: Tejas Upadhyay <tejas.upadhyay@intel.com>
> > > > > > ---
> > > > > >  drivers/gpu/drm/xe/Kconfig                    |   6 +
> > > > > >  drivers/gpu/drm/xe/Kconfig.profile            |  46 +++
> > > > > >  drivers/gpu/drm/xe/xe_engine.c                |  25 +-
> > > > > >  drivers/gpu/drm/xe/xe_hw_engine.c             |   8 +
> > > > > >  drivers/gpu/drm/xe/xe_hw_engine.h             |  31 ++
> > > > > >  drivers/gpu/drm/xe/xe_hw_engine_class_sysfs.c | 354
> > > ++++++++++++++++++
> > > > > >  drivers/gpu/drm/xe/xe_hw_engine_class_sysfs.h |   2 +
> > > > > >  7 files changed, 466 insertions(+), 6 deletions(-)  create mode
> > > > > > 100644 drivers/gpu/drm/xe/Kconfig.profile
> > > > > >
> > > > > > diff --git a/drivers/gpu/drm/xe/Kconfig
> > > > > > b/drivers/gpu/drm/xe/Kconfig index d44794f99338..0a4ea965645b
> > > > > > 100644
> > > > > > --- a/drivers/gpu/drm/xe/Kconfig
> > > > > > +++ b/drivers/gpu/drm/xe/Kconfig
> > > > > > @@ -83,3 +83,9 @@ depends on DRM_XE  depends on EXPERT  source
> > > > > > "drivers/gpu/drm/xe/Kconfig.debug"
> > > > > >  endmenu
> > > > > > +
> > > > > > +menu "drm/xe Profile Guided Optimisation"
> > > > > > +	visible if EXPERT
> > > > > > +	depends on DRM_XE
> > > > > > +	source "drivers/gpu/drm/xe/Kconfig.profile"
> > > > > > +endmenu
> > > > > > diff --git a/drivers/gpu/drm/xe/Kconfig.profile
> > > > > > b/drivers/gpu/drm/xe/Kconfig.profile
> > > > > > new file mode 100644
> > > > > > index 000000000000..e72f15ec4bf6
> > > > > > --- /dev/null
> > > > > > +++ b/drivers/gpu/drm/xe/Kconfig.profile
> > > > > > @@ -0,0 +1,46 @@
> > > > > > +config DRM_XE_JOB_TIMEOUT_MAX
> > > > > > +       int "Default max job timeout (ms)"
> > > > > > +       default 10000 # milliseconds
> > > > > > +       help
> > > > > > +         Configures the default max job timeout after which job will
> > > > > > +         be forcefully taken away from scheduler.
> > > > > > +config DRM_XE_JOB_TIMEOUT_MIN
> > > > > > +       int "Default max job timeout (ms)"
> > > > > > +       default 1 # milliseconds
> > > > > > +       help
> > > > > > +         Configures the default min job timeout after which job will
> > > > > > +         be forcefully taken away from scheduler.
> > > > > > +config DRM_XE_TIMESLICE_MAX
> > > > > > +       int "Default max timeslice duration (us)"
> > > > > > +       default 10000000 # microseconds
> > > > > > +       help
> > > > > > +         Configures the default max timeslice duration between multiple
> > > > > > +         contexts by guc scheduling.
> > > > > > +config DRM_XE_TIMESLICE_MIN
> > > > > > +       int "Default min timeslice duration (us)"
> > > > > > +       default 1 # microseconds
> > > > > > +       help
> > > > > > +         Configures the default min timeslice duration between multiple
> > > > > > +         contexts by guc scheduling.
> > > > > > +config DRM_XE_PREEMPT_TIMEOUT_MAX
> > > > > > +       int "Default max  preempt timeout (us)"
> > > > > > +       default 10000000 # microseconds
> > > > > > +       help
> > > > > > +         Configures the default max preempt timeout after which context
> > > > > > +         will be forcefully taken away and higher priority context will
> > > > > > +         run.
> > > > > > +config DRM_XE_PREEMPT_TIMEOUT_MIN
> > > > > > +       int "Default min  preempt timeout (us)"
> > > > > > +       default 1 # microseconds
> > > > > > +       help
> > > > > > +         Configures the default min preempt timeout after which context
> > > > > > +         will be forcefully taken away and higher priority context will
> > > > > > +         run.
> > > > > > +config DRM_XE_ENABLE_SCHEDTIMEOUT_LIMIT
> > > > > > +       bool "Default configuration of limitation on scheduler timeout"
> > > > > > +       default y
> > > > > > +       help
> > > > > > +	 Configures the enablement of limitation on scheduler timeout
> > > > > > +	 to apply to applicable user. For elevated user, all above MIN
> > > > > > +	 and MAX values will apply when this configuration is enable to
> > > > > > +	 apply limitation. By default limitation is applied.
> > > > > > diff --git a/drivers/gpu/drm/xe/xe_engine.c
> > > > > > b/drivers/gpu/drm/xe/xe_engine.c index 9e167b113963..d934196eb79f
> > > > > > 100644
> > > > > > --- a/drivers/gpu/drm/xe/xe_engine.c
> > > > > > +++ b/drivers/gpu/drm/xe/xe_engine.c
> > > > > > @@ -13,6 +13,7 @@
> > > > > >
> > > > > >  #include "xe_device.h"
> > > > > >  #include "xe_gt.h"
> > > > > > +#include "xe_hw_engine_class_sysfs.h"
> > > > > >  #include "xe_hw_fence.h"
> > > > > >  #include "xe_lrc.h"
> > > > > >  #include "xe_macros.h"
> > > > > > @@ -191,8 +192,12 @@ static int engine_set_priority(struct
> > > > > > xe_device *xe, struct xe_engine *e,  static int
> > > engine_set_timeslice(struct xe_device *xe, struct xe_engine *e,
> > > > > >  				u64 value, bool create)
> > > > > >  {
> > > > > > -	if (!capable(CAP_SYS_NICE))
> > > > > > -		return -EPERM;
> > > > > > +	u32 min = e->hwe->eclass->sched_props.timeslice_min;
> > > > > > +	u32 max = e->hwe->eclass->sched_props.timeslice_max;
> > > > >
> > > > > So I screwed this up in my last comment, sorry.
> > > > >
> > > > > min = cap_nice ? KConfig option for min :
> > > > > e->hwe->eclass->sched_props.timeslice_min;
> > > > > same logic for max;
> > > > >
> > > > > Probably add helper for this.
> > > > >
> > > > > > +
> > > > > > +	if (enforce_schedule_limit() &&
> > > > > > +	    !engine_timeout_in_range(value, min, max))
> > > > >
> > > > > Then I think logic works too...
> > > > >
> > > > > if cap nice && !Kconfig option to enfore limits (enforce_schedule_limit
> > > returns false):
> > > > > 	user can do whatever
> > > > > else if cap nice
> > > > > 	user within Kconfig range
> > > > > else
> > > > > 	user within sysfs range
> > > > >
> > > > > This is what we want in the end.
> > > > >
> > > >
> > > > Matt, I think this is exactly what the previous revision of the patch was
> > > doing.
> > > >
> > > 
> > > No... Previous version
> > > 
> > > min = Kconfig option to enfore limits ? KConfig option for min : e->hwe-
> > > >eclass->sched_props.timeslice_min
> > > same for max
> > > 
> > > Results in:
> > > 
> > > if cap nice && !Kconfig option to enfore limits (enforce_schedule_limit
> > > returns false):
> > > 	user can do whatever
> > > else if cap_nice || Kconfig option to enfore limit
> > > 	user within Kconfig range
> > > else
> > >  	user within sysfs range
> > > 
> > > !cap_nice && Kconfig option to enfore limits == user within Kconfig range
> > > (previously) !cap_nice && Kconfig option to enfore limits == user within sysfs
> > > range (my suggestion)
> > 
> > In previous version we can achieve it by just adding one below check right?
> > #if IS_ENABLED(CONFIG_DRM_XE_ENABLE_SCHEDTIMEOUT_LIMIT) && cap_nice
> > +       u32 min = XE_HW_ENGINE_TIMESLICE_MIN;
> > +       u32 max = XE_HW_ENGINE_TIMESLICE_MAX;
> > +#else
> > +       u32 min = e->hwe->eclass->sched_props.timeslice_min;
> > +       u32 max = e->hwe->eclass->sched_props.timeslice_max;
> > +#endif
> > 
> > Please let me know!
> > 
> 
> Ah I see. Yah, it is a limits selection issue.
> We can do,
> 
> u32 min = e->hwe->eclass->sched_props.timeslice_min;
> u32 max = e->hwe->eclass->sched_props.timeslice_max;
> 
> #if IS_ENABLED(CONFIG_DRM_XE_ENABLE_SCHEDTIMEOUT_LIMIT)
>         if (cap_nice) {
>                 u32 min = XE_HW_ENGINE_TIMESLICE_MIN;
>                 u32 max = XE_HW_ENGINE_TIMESLICE_MAX;
>         }
> #endif
> 
> Matt, Tejas
> Also, looks like you missed my another comment below.
> 

Yea but what I suggest works too unless XE_HW_ENGINE_TIMESLICE_MIN can
be undefined. Same logic so either way.

Matt 

> Niranjana
> 
> > > 
> > > The logic is different and I believe we want what I'm suggesting.
> > > 
> > > Matt
> > > 
> > > > > > +		return -EINVAL;
> > > > > >
> > > > > >  	return e->ops->set_timeslice(e, value);  } @@ -201,8 +206,12 @@
> > > > > > static int engine_set_preemption_timeout(struct xe_device *xe,
> > > > > >  					 struct xe_engine *e, u64 value,
> > > > > >  					 bool create)
> > > > > >  {
> > > > > > -	if (!capable(CAP_SYS_NICE))
> > > > > > -		return -EPERM;
> > > > > > +	u32 min = e->hwe->eclass->sched_props.preempt_timeout_min;
> > > > > > +	u32 max = e->hwe->eclass->sched_props.preempt_timeout_max;
> > > > > > +
> > > > > > +	if (enforce_schedule_limit() &&
> > > > > > +	    !engine_timeout_in_range(value, min, max))
> > > > > > +		return -EINVAL;
> > > > > >
> > > > > >  	return e->ops->set_preempt_timeout(e, value);  } @@ -266,11
> > > > > > +275,15 @@ static int engine_set_persistence(struct xe_device *xe,
> > > > > > struct xe_engine *e,  static int engine_set_job_timeout(struct xe_device
> > > *xe, struct xe_engine *e,
> > > > > >  				  u64 value, bool create)
> > > > > >  {
> > > > > > +	u32 min = e->hwe->eclass->sched_props.job_timeout_min;
> > > > > > +	u32 max = e->hwe->eclass->sched_props.job_timeout_max;
> > > > > > +
> > > > > >  	if (XE_IOCTL_DBG(xe, !create))
> > > > > >  		return -EINVAL;
> > > > > >
> > > > > > -	if (!capable(CAP_SYS_NICE))
> > > > > > -		return -EPERM;
> > > > > > +	if (enforce_schedule_limit() &&
> > > > > > +	    !engine_timeout_in_range(value, min, max))
> > > > > > +		return -EINVAL;
> > > > > >
> > > > > >  	return e->ops->set_job_timeout(e, value);  } diff --git
> > > > > > a/drivers/gpu/drm/xe/xe_hw_engine.c
> > > > > > b/drivers/gpu/drm/xe/xe_hw_engine.c
> > > > > > index afa7d25c3852..e601bffe3b13 100644
> > > > > > --- a/drivers/gpu/drm/xe/xe_hw_engine.c
> > > > > > +++ b/drivers/gpu/drm/xe/xe_hw_engine.c
> > > > > > @@ -364,8 +364,16 @@ static void hw_engine_init_early(struct xe_gt
> > > > > > *gt, struct xe_hw_engine *hwe,
> > > > > >
> > > > > >  	if (!gt->eclass[hwe->class].sched_props.job_timeout_ms) {
> > > > > >  		gt->eclass[hwe->class].sched_props.job_timeout_ms = HZ *
> > > 5;
> > > > > > +		gt->eclass[hwe->class].sched_props.job_timeout_min =
> > > XE_HW_ENGINE_JOB_TIMEOUT_MIN;
> > > > > > +		gt->eclass[hwe->class].sched_props.job_timeout_max =
> > > > > > +XE_HW_ENGINE_JOB_TIMEOUT_MAX;
> > > > > >  		gt->eclass[hwe->class].sched_props.timeslice_us = 1 * 1000;
> > > > > > +		gt->eclass[hwe->class].sched_props.timeslice_min =
> > > XE_HW_ENGINE_TIMESLICE_MIN;
> > > > > > +		gt->eclass[hwe->class].sched_props.timeslice_max =
> > > > > > +XE_HW_ENGINE_TIMESLICE_MAX;
> > > > > >  		gt->eclass[hwe->class].sched_props.preempt_timeout_us =
> > > 640 *
> > > > > > 1000;
> > > > > > +		gt->eclass[hwe->class].sched_props.preempt_timeout_min =
> > > > > > +
> > > 	XE_HW_ENGINE_PREEMPT_TIMEOUT_MIN;
> > > > > > +		gt->eclass[hwe->class].sched_props.preempt_timeout_max =
> > > > > > +
> > > 	XE_HW_ENGINE_PREEMPT_TIMEOUT_MAX;
> > > > > >  		/* Record default props */
> > > > > >  		gt->eclass[hwe->class].defaults = gt->eclass[hwe-
> > > >class].sched_props;
> > > > > >  	}
> > > > > > diff --git a/drivers/gpu/drm/xe/xe_hw_engine.h
> > > > > > b/drivers/gpu/drm/xe/xe_hw_engine.h
> > > > > > index 7eca9d53c7b1..3d37d6d44261 100644
> > > > > > --- a/drivers/gpu/drm/xe/xe_hw_engine.h
> > > > > > +++ b/drivers/gpu/drm/xe/xe_hw_engine.h
> > > > > > @@ -10,6 +10,37 @@
> > > > > >
> > > > > >  struct drm_printer;
> > > > > >
> > > > > > +#ifdef CONFIG_DRM_XE_JOB_TIMEOUT_MIN #define
> > > > > > +XE_HW_ENGINE_JOB_TIMEOUT_MIN
> > > CONFIG_DRM_XE_JOB_TIMEOUT_MIN #else
> > > > > > +#define XE_HW_ENGINE_JOB_TIMEOUT_MIN 1 #endif #ifdef
> > > > > > +CONFIG_DRM_XE_JOB_TIMEOUT_MAX #define
> > > > > > +XE_HW_ENGINE_JOB_TIMEOUT_MAX
> > > CONFIG_DRM_XE_JOB_TIMEOUT_MAX #else
> > > > > > +#define XE_HW_ENGINE_JOB_TIMEOUT_MAX (10 * 1000) #endif #ifdef
> > > > > > +CONFIG_DRM_XE_TIMESLICE_MIN #define
> > > XE_HW_ENGINE_TIMESLICE_MIN
> > > > > > +CONFIG_DRM_XE_TIMESLICE_MIN #else #define
> > > > > > +XE_HW_ENGINE_TIMESLICE_MIN 1 #endif #ifdef
> > > > > > +CONFIG_DRM_XE_TIMESLICE_MAX #define
> > > XE_HW_ENGINE_TIMESLICE_MAX
> > > > > > +CONFIG_DRM_XE_TIMESLICE_MAX #else #define
> > > > > > +XE_HW_ENGINE_TIMESLICE_MAX (10 * 1000 * 1000) #endif #ifdef
> > > > > > +CONFIG_DRM_XE_PREEMPT_TIMEOUT_MIN
> > > > > > +#define XE_HW_ENGINE_PREEMPT_TIMEOUT_MIN
> > > > > > +CONFIG_DRM_XE_PREEMPT_TIMEOUT_MIN #else #define
> > > > > > +XE_HW_ENGINE_PREEMPT_TIMEOUT_MIN 1 #endif #ifdef
> > > > > > +CONFIG_DRM_XE_PREEMPT_TIMEOUT_MAX
> > > > > > +#define XE_HW_ENGINE_PREEMPT_TIMEOUT_MAX
> > > > > > +CONFIG_DRM_XE_PREEMPT_TIMEOUT_MAX #else #define
> > > > > > +XE_HW_ENGINE_PREEMPT_TIMEOUT_MAX (10 * 1000 * 1000) #endif
> > > > > > +
> > > > > >  int xe_hw_engines_init_early(struct xe_gt *gt);  int
> > > > > > xe_hw_engines_init(struct xe_gt *gt);  void
> > > > > > xe_hw_engine_handle_irq(struct xe_hw_engine *hwe, u16 intr_vec);
> > > > > > diff --git a/drivers/gpu/drm/xe/xe_hw_engine_class_sysfs.c
> > > > > > b/drivers/gpu/drm/xe/xe_hw_engine_class_sysfs.c
> > > > > > index 990bb675d1e0..2b7ac4e02db6 100644
> > > > > > --- a/drivers/gpu/drm/xe/xe_hw_engine_class_sysfs.c
> > > > > > +++ b/drivers/gpu/drm/xe/xe_hw_engine_class_sysfs.c
> > > > > > @@ -11,6 +11,20 @@
> > > > > >
> > > > > >  static int xe_add_hw_engine_class_defaults(struct kobject
> > > > > > *parent);
> > > > > >
> > > > > > +bool enforce_schedule_limit(void) { #if
> > > > > > +IS_ENABLED(CONFIG_DRM_XE_ENABLE_SCHEDTIMEOUT_LIMIT)
> > > > > > +	return true;
> > > > > > +#else
> > > > > > +	return !capable(CAP_SYS_NICE);
> > > > > > +#endif
> > > > > > +}
> > > > > > +
> > > > > > +bool engine_timeout_in_range(u64 timeout, u64 min, u64 max) {
> > > > > > +	return timeout >= min && timeout <= max; }
> > > > > > +
> > > > > >  static void kobj_xe_hw_engine_release(struct kobject *kobj)  {
> > > > > >  	kfree(kobj);
> > > > > > @@ -39,11 +53,92 @@ kobj_xe_hw_engine_class(struct kobject
> > > *parent, char *name)
> > > > > >  	return keclass;
> > > > > >  }
> > > > > >
> > > > > > +static ssize_t job_timeout_max_store(struct kobject *kobj,
> > > > > > +				     struct kobj_attribute *attr,
> > > > > > +				     const char *buf, size_t count) {
> > > > > > +	struct xe_hw_engine_class_intf *eclass = kobj_to_eclass(kobj);
> > > > > > +	u32 timeout;
> > > > > > +	int err;
> > > > > > +
> > > > > > +	err = kstrtou32(buf, 0, &timeout);
> > > > > > +	if (err)
> > > > > > +		return err;
> > > > > > +
> > > > > > +	if (timeout < eclass->sched_props.job_timeout_min)
> > > > > > +		return -EINVAL;
> > > > > > +
> > > > > > +	if (enforce_schedule_limit() &&
> > > > > > +	    !engine_timeout_in_range(timeout,
> > > > > > +				     XE_HW_ENGINE_JOB_TIMEOUT_MIN,
> > > > > > +				     XE_HW_ENGINE_JOB_TIMEOUT_MAX))
> > > > > > +		return -EINVAL;
> > > > > > +
> > > > > > +	WRITE_ONCE(eclass->sched_props.job_timeout_max, timeout);
> > > > > > +
> > > > > > +	return count;
> > > > > > +}
> > > > > > +
> > > > > > +static ssize_t job_timeout_max_show(struct kobject *kobj,
> > > > > > +				    struct kobj_attribute *attr, char *buf) {
> > > > > > +	struct xe_hw_engine_class_intf *eclass = kobj_to_eclass(kobj);
> > > > > > +
> > > > > > +	return sprintf(buf, "%u\n",
> > > > > > +eclass->sched_props.job_timeout_max);
> > > > > > +}
> > > > > > +
> > > > > > +static struct kobj_attribute job_timeout_max_attr =
> > > > > > +__ATTR(job_timeout_max, 0644, job_timeout_max_show,
> > > > > > +job_timeout_max_store);
> > > > > > +
> > > > > > +static ssize_t job_timeout_min_store(struct kobject *kobj,
> > > > > > +				     struct kobj_attribute *attr,
> > > > > > +				     const char *buf, size_t count) {
> > > > > > +	struct xe_hw_engine_class_intf *eclass = kobj_to_eclass(kobj);
> > > > > > +	u32 timeout;
> > > > > > +	int err;
> > > > > > +
> > > > > > +	err = kstrtou32(buf, 0, &timeout);
> > > > > > +	if (err)
> > > > > > +		return err;
> > > > > > +
> > > > > > +	if (timeout > eclass->sched_props.job_timeout_max)
> > > > > > +		return -EINVAL;
> > > > > > +
> > > > > > +	if (enforce_schedule_limit() &&
> > > > > > +	    !engine_timeout_in_range(timeout,
> > > > > > +				     XE_HW_ENGINE_JOB_TIMEOUT_MIN,
> > > > > > +				     XE_HW_ENGINE_JOB_TIMEOUT_MAX))
> > > > > > +		return -EINVAL;
> > > > > > +
> > > > > > +	WRITE_ONCE(eclass->sched_props.job_timeout_min, timeout);
> > > > > > +
> > > > > > +	return count;
> > > > > > +}
> > > > > > +
> > > > > > +static ssize_t job_timeout_min_show(struct kobject *kobj,
> > > > > > +				    struct kobj_attribute *attr, char *buf) {
> > > > > > +	struct xe_hw_engine_class_intf *eclass = kobj_to_eclass(kobj);
> > > > > > +
> > > > > > +	return sprintf(buf, "%u\n",
> > > > > > +eclass->sched_props.job_timeout_min);
> > > > > > +}
> > > > > > +
> > > > > > +static struct kobj_attribute job_timeout_min_attr =
> > > > > > +__ATTR(job_timeout_min, 0644, job_timeout_min_show,
> > > > > > +job_timeout_min_store);
> > > > > > +
> > > > > >  static ssize_t job_timeout_store(struct kobject *kobj,
> > > > > >  				 struct kobj_attribute *attr,
> > > > > >  				 const char *buf, size_t count)  {
> > > > > >  	struct xe_hw_engine_class_intf *eclass = kobj_to_eclass(kobj);
> > > > > > +#if IS_ENABLED(CONFIG_DRM_XE_ENABLE_SCHEDTIMEOUT_LIMIT)
> > > > > > +	u32 min = XE_HW_ENGINE_JOB_TIMEOUT_MIN;
> > > > > > +	u32 max = XE_HW_ENGINE_JOB_TIMEOUT_MAX; #else
> > > > > > +	u32 min = e->hwe->eclass->sched_props.job_timeout_min;
> > > > > > +	u32 max = e->hwe->eclass->sched_props.job_timeout_max;
> > > > > > +#endif
> > > > >
> > > > > I don't think we need this, just make sure default is within min /
> > > > > max of the sched_props.
> > > > >
> > > >
> > > > Shouldn't the sched_prop set through sysfs here which applies to all
> > > > future user engines (xe_engine) has the same requirement as the
> > > > sched_prop set directly to user engine (xe_engine) through set_properly
> > > ioctl?
> > > > ie., shoudln't the requirement be same in job_timeout_store() and
> > > > engine_set_job_timeout()?
> > > >
> > > > Niranjana
> > > >
> > > > > Matt
> > > > >
> > > > > >  	u32 timeout;
> > > > > >  	int err;
> > > > > >
> > > > > > @@ -51,6 +146,10 @@ static ssize_t job_timeout_store(struct kobject
> > > *kobj,
> > > > > >  	if (err)
> > > > > >  		return err;
> > > > > >
> > > > > > +	if (enforce_schedule_limit() &&
> > > > > > +	    !engine_timeout_in_range(timeout, min, max))
> > > > > > +		return -EINVAL;
> > > > > > +
> > > > > >  	WRITE_ONCE(eclass->sched_props.job_timeout_ms, timeout);
> > > > > >
> > > > > >  	return count;
> > > > > > @@ -78,11 +177,40 @@ static ssize_t job_timeout_default(struct
> > > > > > kobject *kobj,  static struct kobj_attribute job_timeout_def =
> > > > > > __ATTR(job_timeout_ms, 0444, job_timeout_default, NULL);
> > > > > >
> > > > > > +static ssize_t job_timeout_min_default(struct kobject *kobj,
> > > > > > +				       struct kobj_attribute *attr, char *buf) {
> > > > > > +	struct xe_hw_engine_class_intf *eclass =
> > > > > > +kobj_to_eclass(kobj->parent);
> > > > > > +
> > > > > > +	return sprintf(buf, "%u\n", eclass->defaults.job_timeout_min);
> > > > > > +}
> > > > > > +
> > > > > > +static struct kobj_attribute job_timeout_min_def =
> > > > > > +__ATTR(job_timeout_min, 0444, job_timeout_min_default, NULL);
> > > > > > +
> > > > > > +static ssize_t job_timeout_max_default(struct kobject *kobj,
> > > > > > +				       struct kobj_attribute *attr, char *buf) {
> > > > > > +	struct xe_hw_engine_class_intf *eclass =
> > > > > > +kobj_to_eclass(kobj->parent);
> > > > > > +
> > > > > > +	return sprintf(buf, "%u\n", eclass->defaults.job_timeout_max);
> > > > > > +}
> > > > > > +
> > > > > > +static struct kobj_attribute job_timeout_max_def =
> > > > > > +__ATTR(job_timeout_max, 0444, job_timeout_max_default, NULL);
> > > > > > +
> > > > > >  static ssize_t timeslice_duration_store(struct kobject *kobj,
> > > > > >  					struct kobj_attribute *attr,
> > > > > >  					const char *buf, size_t count)  {
> > > > > >  	struct xe_hw_engine_class_intf *eclass = kobj_to_eclass(kobj);
> > > > > > +#if IS_ENABLED(CONFIG_DRM_XE_ENABLE_SCHEDTIMEOUT_LIMIT)
> > > > > > +	u32 min = XE_HW_ENGINE_TIMESLICE_MIN;
> > > > > > +	u32 max = XE_HW_ENGINE_TIMESLICE_MAX; #else
> > > > > > +	u32 min = e->hwe->eclass->sched_props.timeslice_min;
> > > > > > +	u32 max = e->hwe->eclass->sched_props.timeslice_max;
> > > > > > +#endif
> > > > > >  	u32 duration;
> > > > > >  	int err;
> > > > > >
> > > > > > @@ -90,11 +218,92 @@ static ssize_t timeslice_duration_store(struct
> > > kobject *kobj,
> > > > > >  	if (err)
> > > > > >  		return err;
> > > > > >
> > > > > > +	if (enforce_schedule_limit() &&
> > > > > > +	    !engine_timeout_in_range(duration, min, max))
> > > > > > +		return -EINVAL;
> > > > > > +
> > > > > >  	WRITE_ONCE(eclass->sched_props.timeslice_us, duration);
> > > > > >
> > > > > >  	return count;
> > > > > >  }
> > > > > >
> > > > > > +static ssize_t timeslice_duration_max_store(struct kobject *kobj,
> > > > > > +					    struct kobj_attribute *attr,
> > > > > > +					    const char *buf, size_t count) {
> > > > > > +	struct xe_hw_engine_class_intf *eclass = kobj_to_eclass(kobj);
> > > > > > +	u32 duration;
> > > > > > +	int err;
> > > > > > +
> > > > > > +	err = kstrtou32(buf, 0, &duration);
> > > > > > +	if (err)
> > > > > > +		return err;
> > > > > > +
> > > > > > +	if (duration < eclass->sched_props.timeslice_min)
> > > > > > +		return -EINVAL;
> > > > > > +
> > > > > > +	if (enforce_schedule_limit() &&
> > > > > > +	    !engine_timeout_in_range(duration,
> > > > > > +				     XE_HW_ENGINE_TIMESLICE_MIN,
> > > > > > +				     XE_HW_ENGINE_TIMESLICE_MAX))
> > > > > > +		return -EINVAL;
> > > > > > +
> > > > > > +	WRITE_ONCE(eclass->sched_props.timeslice_max, duration);
> > > > > > +
> > > > > > +	return count;
> > > > > > +}
> > > > > > +
> > > > > > +static ssize_t timeslice_duration_max_show(struct kobject *kobj,
> > > > > > +					   struct kobj_attribute *attr,
> > > > > > +					   char *buf)
> > > > > > +{
> > > > > > +	struct xe_hw_engine_class_intf *eclass = kobj_to_eclass(kobj);
> > > > > > +
> > > > > > +	return sprintf(buf, "%u\n", eclass->sched_props.timeslice_max);
> > > > > > +}
> > > > > > +
> > > > > > +static struct kobj_attribute timeslice_duration_max_attr =
> > > > > > +	__ATTR(timeslice_duration_max, 0644,
> > > timeslice_duration_max_show,
> > > > > > +	       timeslice_duration_max_store);
> > > > > > +
> > > > > > +static ssize_t timeslice_duration_min_store(struct kobject *kobj,
> > > > > > +					    struct kobj_attribute *attr,
> > > > > > +					    const char *buf, size_t count) {
> > > > > > +	struct xe_hw_engine_class_intf *eclass = kobj_to_eclass(kobj);
> > > > > > +	u32 duration;
> > > > > > +	int err;
> > > > > > +
> > > > > > +	err = kstrtou32(buf, 0, &duration);
> > > > > > +	if (err)
> > > > > > +		return err;
> > > > > > +
> > > > > > +	if (duration > eclass->sched_props.timeslice_max)
> > > > > > +		return -EINVAL;
> > > > > > +
> > > > > > +	if (enforce_schedule_limit() &&
> > > > > > +	    !engine_timeout_in_range(duration,
> > > > > > +				     XE_HW_ENGINE_TIMESLICE_MIN,
> > > > > > +				     XE_HW_ENGINE_TIMESLICE_MAX))
> > > > > > +		return -EINVAL;
> > > > > > +
> > > > > > +	WRITE_ONCE(eclass->sched_props.timeslice_min, duration);
> > > > > > +
> > > > > > +	return count;
> > > > > > +}
> > > > > > +
> > > > > > +static ssize_t timeslice_duration_min_show(struct kobject *kobj,
> > > > > > +					   struct kobj_attribute *attr, char
> > > *buf) {
> > > > > > +	struct xe_hw_engine_class_intf *eclass = kobj_to_eclass(kobj);
> > > > > > +
> > > > > > +	return sprintf(buf, "%u\n", eclass->sched_props.timeslice_min);
> > > > > > +}
> > > > > > +
> > > > > > +static struct kobj_attribute timeslice_duration_min_attr =
> > > > > > +	__ATTR(timeslice_duration_min, 0644,
> > > timeslice_duration_min_show,
> > > > > > +	       timeslice_duration_min_store);
> > > > > > +
> > > > > >  static ssize_t timeslice_duration_show(struct kobject *kobj,
> > > > > >  		struct kobj_attribute *attr, char *buf)  { @@ -118,11 +327,40
> > > > > > @@ static ssize_t timeslice_default(struct kobject *kobj,  static
> > > > > > struct kobj_attribute timeslice_duration_def =
> > > > > > __ATTR(timeslice_duration_us, 0444, timeslice_default, NULL);
> > > > > >
> > > > > > +static ssize_t timeslice_min_default(struct kobject *kobj,
> > > > > > +				     struct kobj_attribute *attr, char *buf) {
> > > > > > +	struct xe_hw_engine_class_intf *eclass =
> > > > > > +kobj_to_eclass(kobj->parent);
> > > > > > +
> > > > > > +	return sprintf(buf, "%u\n", eclass->defaults.timeslice_min); }
> > > > > > +
> > > > > > +static struct kobj_attribute timeslice_duration_min_def =
> > > > > > +__ATTR(timeslice_duration_min, 0444, timeslice_min_default,
> > > > > > +NULL);
> > > > > > +
> > > > > > +static ssize_t timeslice_max_default(struct kobject *kobj,
> > > > > > +				     struct kobj_attribute *attr, char *buf) {
> > > > > > +	struct xe_hw_engine_class_intf *eclass =
> > > > > > +kobj_to_eclass(kobj->parent);
> > > > > > +
> > > > > > +	return sprintf(buf, "%u\n", eclass->defaults.timeslice_max); }
> > > > > > +
> > > > > > +static struct kobj_attribute timeslice_duration_max_def =
> > > > > > +__ATTR(timeslice_duration_max, 0444, timeslice_max_default,
> > > > > > +NULL);
> > > > > > +
> > > > > >  static ssize_t preempt_timeout_store(struct kobject *kobj,
> > > > > >  				     struct kobj_attribute *attr,
> > > > > >  				     const char *buf, size_t count)  {
> > > > > >  	struct xe_hw_engine_class_intf *eclass = kobj_to_eclass(kobj);
> > > > > > +#if IS_ENABLED(CONFIG_DRM_XE_ENABLE_SCHEDTIMEOUT_LIMIT)
> > > > > > +	u32 min = XE_HW_ENGINE_PREEMPT_TIMEOUT_MIN;
> > > > > > +	u32 max = XE_HW_ENGINE_PREEMPT_TIMEOUT_MAX; #else
> > > > > > +	u32 min = e->hwe->eclass->sched_props.preempt_timeout_min;
> > > > > > +	u32 max = e->hwe->eclass->sched_props.preempt_timeout_max;
> > > > > > +#endif
> > > > > >  	u32 timeout;
> > > > > >  	int err;
> > > > > >
> > > > > > @@ -130,6 +368,10 @@ static ssize_t preempt_timeout_store(struct
> > > kobject *kobj,
> > > > > >  	if (err)
> > > > > >  		return err;
> > > > > >
> > > > > > +	if (enforce_schedule_limit() &&
> > > > > > +	    !engine_timeout_in_range(timeout, min, max))
> > > > > > +		return -EINVAL;
> > > > > > +
> > > > > >  	WRITE_ONCE(eclass->sched_props.preempt_timeout_us, timeout);
> > > > > >
> > > > > >  	return count;
> > > > > > @@ -158,17 +400,129 @@ static ssize_t
> > > > > > preempt_timeout_default(struct kobject *kobj,  static struct
> > > > > > kobj_attribute preempt_timeout_def =  __ATTR(preempt_timeout_us,
> > > > > > 0444, preempt_timeout_default, NULL);
> > > > > >
> > > > > > +static ssize_t preempt_timeout_min_default(struct kobject *kobj,
> > > > > > +					   struct kobj_attribute *attr,
> > > > > > +					   char *buf)
> > > > > > +{
> > > > > > +	struct xe_hw_engine_class_intf *eclass =
> > > > > > +kobj_to_eclass(kobj->parent);
> > > > > > +
> > > > > > +	return sprintf(buf, "%u\n",
> > > > > > +eclass->defaults.preempt_timeout_min);
> > > > > > +}
> > > > > > +
> > > > > > +static struct kobj_attribute preempt_timeout_min_def =
> > > > > > +__ATTR(preempt_timeout_min, 0444, preempt_timeout_min_default,
> > > > > > +NULL);
> > > > > > +
> > > > > > +static ssize_t preempt_timeout_max_default(struct kobject *kobj,
> > > > > > +					   struct kobj_attribute *attr,
> > > > > > +					   char *buf)
> > > > > > +{
> > > > > > +	struct xe_hw_engine_class_intf *eclass =
> > > > > > +kobj_to_eclass(kobj->parent);
> > > > > > +
> > > > > > +	return sprintf(buf, "%u\n",
> > > > > > +eclass->defaults.preempt_timeout_max);
> > > > > > +}
> > > > > > +
> > > > > > +static struct kobj_attribute preempt_timeout_max_def =
> > > > > > +__ATTR(preempt_timeout_max, 0444,
> > > preempt_timeout_max_default,
> > > > > > +NULL);
> > > > > > +
> > > > > > +static ssize_t preempt_timeout_max_store(struct kobject *kobj,
> > > > > > +					 struct kobj_attribute *attr,
> > > > > > +					 const char *buf, size_t count) {
> > > > > > +	struct xe_hw_engine_class_intf *eclass = kobj_to_eclass(kobj);
> > > > > > +	u32 timeout;
> > > > > > +	int err;
> > > > > > +
> > > > > > +	err = kstrtou32(buf, 0, &timeout);
> > > > > > +	if (err)
> > > > > > +		return err;
> > > > > > +
> > > > > > +	if (timeout < eclass->sched_props.preempt_timeout_min)
> > > > > > +		return -EINVAL;
> > > > > > +
> > > > > > +	if (enforce_schedule_limit() &&
> > > > > > +	    !engine_timeout_in_range(timeout,
> > > > > > +
> > > XE_HW_ENGINE_PREEMPT_TIMEOUT_MIN,
> > > > > > +
> > > XE_HW_ENGINE_PREEMPT_TIMEOUT_MAX))
> > > > > > +		return -EINVAL;
> > > > > > +
> > > > > > +	WRITE_ONCE(eclass->sched_props.preempt_timeout_max, timeout);
> > > > > > +
> > > > > > +	return count;
> > > > > > +}
> > > > > > +
> > > > > > +static ssize_t preempt_timeout_max_show(struct kobject *kobj,
> > > > > > +					struct kobj_attribute *attr, char *buf)
> > > {
> > > > > > +	struct xe_hw_engine_class_intf *eclass = kobj_to_eclass(kobj);
> > > > > > +
> > > > > > +	return sprintf(buf, "%u\n",
> > > > > > +eclass->sched_props.preempt_timeout_max);
> > > > > > +}
> > > > > > +
> > > > > > +static struct kobj_attribute preempt_timeout_max_attr =
> > > > > > +	__ATTR(preempt_timeout_max, 0644, preempt_timeout_max_show,
> > > > > > +	       preempt_timeout_max_store);
> > > > > > +
> > > > > > +static ssize_t preempt_timeout_min_store(struct kobject *kobj,
> > > > > > +					 struct kobj_attribute *attr,
> > > > > > +					 const char *buf, size_t count) {
> > > > > > +	struct xe_hw_engine_class_intf *eclass = kobj_to_eclass(kobj);
> > > > > > +	u32 timeout;
> > > > > > +	int err;
> > > > > > +
> > > > > > +	err = kstrtou32(buf, 0, &timeout);
> > > > > > +	if (err)
> > > > > > +		return err;
> > > > > > +
> > > > > > +	if (timeout > eclass->sched_props.preempt_timeout_max)
> > > > > > +		return -EINVAL;
> > > > > > +
> > > > > > +	if (enforce_schedule_limit() &&
> > > > > > +	    !engine_timeout_in_range(timeout,
> > > > > > +
> > > XE_HW_ENGINE_PREEMPT_TIMEOUT_MIN,
> > > > > > +
> > > XE_HW_ENGINE_PREEMPT_TIMEOUT_MAX))
> > > > > > +		return -EINVAL;
> > > > > > +
> > > > > > +	WRITE_ONCE(eclass->sched_props.preempt_timeout_min, timeout);
> > > > > > +
> > > > > > +	return count;
> > > > > > +}
> > > > > > +
> > > > > > +static ssize_t preempt_timeout_min_show(struct kobject *kobj,
> > > > > > +					struct kobj_attribute *attr, char *buf)
> > > {
> > > > > > +	struct xe_hw_engine_class_intf *eclass = kobj_to_eclass(kobj);
> > > > > > +
> > > > > > +	return sprintf(buf, "%u\n",
> > > > > > +eclass->sched_props.preempt_timeout_min);
> > > > > > +}
> > > > > > +
> > > > > > +static struct kobj_attribute preempt_timeout_min_attr =
> > > > > > +	__ATTR(preempt_timeout_min, 0644, preempt_timeout_min_show,
> > > > > > +	       preempt_timeout_min_store);
> > > > > > +
> > > > > >  static const struct attribute *defaults[] = {
> > > > > >  	&job_timeout_def.attr,
> > > > > > +	&job_timeout_min_def.attr,
> > > > > > +	&job_timeout_max_def.attr,
> > > > > >  	&timeslice_duration_def.attr,
> > > > > > +	&timeslice_duration_min_def.attr,
> > > > > > +	&timeslice_duration_max_def.attr,
> > > > > >  	&preempt_timeout_def.attr,
> > > > > > +	&preempt_timeout_min_def.attr,
> > > > > > +	&preempt_timeout_max_def.attr,
> > > > > >  	NULL
> > > > > >  };
> > > > > >
> > > > > >  static const struct attribute *files[] = {
> > > > > >  	&job_timeout_attr.attr,
> > > > > > +	&job_timeout_min_attr.attr,
> > > > > > +	&job_timeout_max_attr.attr,
> > > > > >  	&timeslice_duration_attr.attr,
> > > > > > +	&timeslice_duration_min_attr.attr,
> > > > > > +	&timeslice_duration_max_attr.attr,
> > > > > >  	&preempt_timeout_attr.attr,
> > > > > > +	&preempt_timeout_min_attr.attr,
> > > > > > +	&preempt_timeout_max_attr.attr,
> > > > > >  	NULL
> > > > > >  };
> > > > > >
> > > > > > diff --git a/drivers/gpu/drm/xe/xe_hw_engine_class_sysfs.h
> > > > > > b/drivers/gpu/drm/xe/xe_hw_engine_class_sysfs.h
> > > > > > index 757136614672..2e2ab351a991 100644
> > > > > > --- a/drivers/gpu/drm/xe/xe_hw_engine_class_sysfs.h
> > > > > > +++ b/drivers/gpu/drm/xe/xe_hw_engine_class_sysfs.h
> > > > > > @@ -10,6 +10,8 @@
> > > > > >
> > > > > >  #define MAX_ENGINE_CLASS_NAME_LEN    16
> > > > > >  int xe_hw_engine_class_sysfs_init(struct xe_gt *gt);
> > > > > > +bool enforce_schedule_limit(void); bool
> > > > > > +engine_timeout_in_range(u64 timeout, u64 min, u64 max);
> > > > > >
> > > > > >  /**
> > > > > >   * struct kobj_eclass - A eclass's kobject struct that connects
> > > > > > the kobject and the
> > > > > > --
> > > > > > 2.25.1
> > > > > >

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

* Re: [Intel-xe] [PATCH V9 6/6] drm/xe: Add min/max cap for engine scheduler properties
  2023-07-28  7:36             ` Upadhyay, Tejas
@ 2023-07-28 14:24               ` Matthew Brost
  2023-07-28 14:27                 ` Upadhyay, Tejas
  0 siblings, 1 reply; 30+ messages in thread
From: Matthew Brost @ 2023-07-28 14:24 UTC (permalink / raw)
  To: Upadhyay, Tejas; +Cc: intel-xe@lists.freedesktop.org

On Fri, Jul 28, 2023 at 01:36:29AM -0600, Upadhyay, Tejas wrote:
> 
> 
> > -----Original Message-----
> > From: Vishwanathapura, Niranjana <niranjana.vishwanathapura@intel.com>
> > Sent: Friday, July 28, 2023 11:56 AM
> > To: Upadhyay, Tejas <tejas.upadhyay@intel.com>
> > Cc: Brost, Matthew <matthew.brost@intel.com>; intel-
> > xe@lists.freedesktop.org
> > Subject: Re: [PATCH V9 6/6] drm/xe: Add min/max cap for engine scheduler
> > properties
> > 
> > On Thu, Jul 27, 2023 at 10:54:42PM -0700, Upadhyay, Tejas wrote:
> > >
> > >
> > >> -----Original Message-----
> > >> From: Brost, Matthew <matthew.brost@intel.com>
> > >> Sent: Friday, July 28, 2023 10:35 AM
> > >> To: Vishwanathapura, Niranjana
> > <niranjana.vishwanathapura@intel.com>
> > >> Cc: Upadhyay, Tejas <tejas.upadhyay@intel.com>; intel-
> > >> xe@lists.freedesktop.org
> > >> Subject: Re: [PATCH V9 6/6] drm/xe: Add min/max cap for engine
> > >> scheduler properties
> > >>
> > >> On Thu, Jul 27, 2023 at 09:44:23PM -0700, Niranjana Vishwanathapura
> > >> wrote:
> > >> > On Thu, Jul 27, 2023 at 03:26:49PM +0000, Matthew Brost wrote:
> > >> > > On Thu, Jul 27, 2023 at 01:52:35PM +0530, Tejas Upadhyay wrote:
> > >> > > > Add sysfs entries for the min, max, and defaults for each of
> > >> > > > engine scheduler controls for every hardware engine class.
> > >> > > >
> > >> > > > Non-elevated user IOCTLs to set these controls must be within
> > >> > > > the min-max ranges of the sysfs entries, elevated user can set
> > >> > > > these controls to any value. However, introduced compile time
> > >> > > > CONFIG min-max values which restricts elevated user to be in
> > >> > > > compile time min-max range if at all sysfs min/max are violated.
> > >> > > >
> > >> > > > Sysfs entries examples are,
> > >> > > > DUT# cat
> > /sys/class/drm/cardX/device/tileN/gtN/engines/ccs/.defaults/
> > >> > > > job_timeout_max         job_timeout_ms          preempt_timeout_min
> > >> timeslice_duration_max  timeslice_duration_us
> > >> > > > job_timeout_min         preempt_timeout_max
> > preempt_timeout_us
> > >> timeslice_duration_min
> > >> > > >
> > >> > > > DUT# cat /sys/class/drm/card1/device/tileN/gtN/engines/ccs/
> > >> > > > .defaults/              job_timeout_min         preempt_timeout_max
> > >> preempt_timeout_us      timeslice_duration_min
> > >> > > > job_timeout_max         job_timeout_ms          preempt_timeout_min
> > >> timeslice_duration_max  timeslice_duration_us
> > >> > > >
> > >> > > > V9 :
> > >> > > >    - Rebase to use s/xe_engine/xe_hw_engine/ - Matt
> > >> > > > V8 :
> > >> > > >    - fix enforce_sched_limit and avoid code duplication - Niranjana
> > >> > > >    - Make sure min < max - Niranjana
> > >> > > > V7 :
> > >> > > >    - Rebase to replace hw engine with eclass interface
> > >> > > >    - return EINVAL in place of EPERM
> > >> > > >    - Use some APIs to avoid code duplication
> > >> > > > V6 :
> > >> > > >    - Rebase changes to reflect per engine class props interface - MattB
> > >> > > >    - Use #if ENABLED - MattB
> > >> > > >    - Remove MAX_SCHED_TIMEOUT check as range validation is
> > >> > > > enough
> > >> > > > V5 :
> > >> > > >    - Rebase to resolve conflicts - CI
> > >> > > > V4 :
> > >> > > >    - Rebase
> > >> > > >    - Update commit to reflect tile addition
> > >> > > >    - Use XE_HW macro directly as they are already filtered
> > >> > > >      for CONFIG checks - Niranjana
> > >> > > >    - Add CONFIG for enable/disable min/max limitation
> > >> > > >      on elevated user. Default is enable - Matt/Joonas
> > >> > > > V3 :
> > >> > > >    - Resolve CI hooks warning for kernel-doc
> > >> > > > V2 :
> > >> > > >    - Restric min/max setting to #define default min/max for
> > >> > > >      elevated user - Himal
> > >> > > >    - Remove unrelated changes from patch - Niranjana
> > >> > > >
> > >> > > > Signed-off-by: Tejas Upadhyay <tejas.upadhyay@intel.com>
> > >> > > > ---
> > >> > > >  drivers/gpu/drm/xe/Kconfig                    |   6 +
> > >> > > >  drivers/gpu/drm/xe/Kconfig.profile            |  46 +++
> > >> > > >  drivers/gpu/drm/xe/xe_engine.c                |  25 +-
> > >> > > >  drivers/gpu/drm/xe/xe_hw_engine.c             |   8 +
> > >> > > >  drivers/gpu/drm/xe/xe_hw_engine.h             |  31 ++
> > >> > > >  drivers/gpu/drm/xe/xe_hw_engine_class_sysfs.c | 354
> > >> ++++++++++++++++++
> > >> > > >  drivers/gpu/drm/xe/xe_hw_engine_class_sysfs.h |   2 +
> > >> > > >  7 files changed, 466 insertions(+), 6 deletions(-)  create
> > >> > > > mode
> > >> > > > 100644 drivers/gpu/drm/xe/Kconfig.profile
> > >> > > >
> > >> > > > diff --git a/drivers/gpu/drm/xe/Kconfig
> > >> > > > b/drivers/gpu/drm/xe/Kconfig index d44794f99338..0a4ea965645b
> > >> > > > 100644
> > >> > > > --- a/drivers/gpu/drm/xe/Kconfig
> > >> > > > +++ b/drivers/gpu/drm/xe/Kconfig
> > >> > > > @@ -83,3 +83,9 @@ depends on DRM_XE  depends on EXPERT
> > source
> > >> > > > "drivers/gpu/drm/xe/Kconfig.debug"
> > >> > > >  endmenu
> > >> > > > +
> > >> > > > +menu "drm/xe Profile Guided Optimisation"
> > >> > > > +	visible if EXPERT
> > >> > > > +	depends on DRM_XE
> > >> > > > +	source "drivers/gpu/drm/xe/Kconfig.profile"
> > >> > > > +endmenu
> > >> > > > diff --git a/drivers/gpu/drm/xe/Kconfig.profile
> > >> > > > b/drivers/gpu/drm/xe/Kconfig.profile
> > >> > > > new file mode 100644
> > >> > > > index 000000000000..e72f15ec4bf6
> > >> > > > --- /dev/null
> > >> > > > +++ b/drivers/gpu/drm/xe/Kconfig.profile
> > >> > > > @@ -0,0 +1,46 @@
> > >> > > > +config DRM_XE_JOB_TIMEOUT_MAX
> > >> > > > +       int "Default max job timeout (ms)"
> > >> > > > +       default 10000 # milliseconds
> > >> > > > +       help
> > >> > > > +         Configures the default max job timeout after which job will
> > >> > > > +         be forcefully taken away from scheduler.
> > >> > > > +config DRM_XE_JOB_TIMEOUT_MIN
> > >> > > > +       int "Default max job timeout (ms)"
> > >> > > > +       default 1 # milliseconds
> > >> > > > +       help
> > >> > > > +         Configures the default min job timeout after which job will
> > >> > > > +         be forcefully taken away from scheduler.
> > >> > > > +config DRM_XE_TIMESLICE_MAX
> > >> > > > +       int "Default max timeslice duration (us)"
> > >> > > > +       default 10000000 # microseconds
> > >> > > > +       help
> > >> > > > +         Configures the default max timeslice duration between
> > multiple
> > >> > > > +         contexts by guc scheduling.
> > >> > > > +config DRM_XE_TIMESLICE_MIN
> > >> > > > +       int "Default min timeslice duration (us)"
> > >> > > > +       default 1 # microseconds
> > >> > > > +       help
> > >> > > > +         Configures the default min timeslice duration between
> > multiple
> > >> > > > +         contexts by guc scheduling.
> > >> > > > +config DRM_XE_PREEMPT_TIMEOUT_MAX
> > >> > > > +       int "Default max  preempt timeout (us)"
> > >> > > > +       default 10000000 # microseconds
> > >> > > > +       help
> > >> > > > +         Configures the default max preempt timeout after which
> > context
> > >> > > > +         will be forcefully taken away and higher priority context will
> > >> > > > +         run.
> > >> > > > +config DRM_XE_PREEMPT_TIMEOUT_MIN
> > >> > > > +       int "Default min  preempt timeout (us)"
> > >> > > > +       default 1 # microseconds
> > >> > > > +       help
> > >> > > > +         Configures the default min preempt timeout after which
> > context
> > >> > > > +         will be forcefully taken away and higher priority context will
> > >> > > > +         run.
> > >> > > > +config DRM_XE_ENABLE_SCHEDTIMEOUT_LIMIT
> > >> > > > +       bool "Default configuration of limitation on scheduler timeout"
> > >> > > > +       default y
> > >> > > > +       help
> > >> > > > +	 Configures the enablement of limitation on scheduler
> > timeout
> > >> > > > +	 to apply to applicable user. For elevated user, all above MIN
> > >> > > > +	 and MAX values will apply when this configuration is enable
> > to
> > >> > > > +	 apply limitation. By default limitation is applied.
> > >> > > > diff --git a/drivers/gpu/drm/xe/xe_engine.c
> > >> > > > b/drivers/gpu/drm/xe/xe_engine.c index
> > >> > > > 9e167b113963..d934196eb79f
> > >> > > > 100644
> > >> > > > --- a/drivers/gpu/drm/xe/xe_engine.c
> > >> > > > +++ b/drivers/gpu/drm/xe/xe_engine.c
> > >> > > > @@ -13,6 +13,7 @@
> > >> > > >
> > >> > > >  #include "xe_device.h"
> > >> > > >  #include "xe_gt.h"
> > >> > > > +#include "xe_hw_engine_class_sysfs.h"
> > >> > > >  #include "xe_hw_fence.h"
> > >> > > >  #include "xe_lrc.h"
> > >> > > >  #include "xe_macros.h"
> > >> > > > @@ -191,8 +192,12 @@ static int engine_set_priority(struct
> > >> > > > xe_device *xe, struct xe_engine *e,  static int
> > >> engine_set_timeslice(struct xe_device *xe, struct xe_engine *e,
> > >> > > >  				u64 value, bool create)
> > >> > > >  {
> > >> > > > -	if (!capable(CAP_SYS_NICE))
> > >> > > > -		return -EPERM;
> > >> > > > +	u32 min = e->hwe->eclass->sched_props.timeslice_min;
> > >> > > > +	u32 max = e->hwe->eclass->sched_props.timeslice_max;
> > >> > >
> > >> > > So I screwed this up in my last comment, sorry.
> > >> > >
> > >> > > min = cap_nice ? KConfig option for min :
> > >> > > e->hwe->eclass->sched_props.timeslice_min;
> > >> > > same logic for max;
> > >> > >
> > >> > > Probably add helper for this.
> > >> > >
> > >> > > > +
> > >> > > > +	if (enforce_schedule_limit() &&
> > >> > > > +	    !engine_timeout_in_range(value, min, max))
> > >> > >
> > >> > > Then I think logic works too...
> > >> > >
> > >> > > if cap nice && !Kconfig option to enfore limits
> > >> > > (enforce_schedule_limit
> > >> returns false):
> > >> > > 	user can do whatever
> > >> > > else if cap nice
> > >> > > 	user within Kconfig range
> > >> > > else
> > >> > > 	user within sysfs range
> > >> > >
> > >> > > This is what we want in the end.
> > >> > >
> > >> >
> > >> > Matt, I think this is exactly what the previous revision of the
> > >> > patch was
> > >> doing.
> > >> >
> > >>
> > >> No... Previous version
> > >>
> > >> min = Kconfig option to enfore limits ? KConfig option for min :
> > >> e->hwe-
> > >> >eclass->sched_props.timeslice_min
> > >> same for max
> > >>
> > >> Results in:
> > >>
> > >> if cap nice && !Kconfig option to enfore limits
> > >> (enforce_schedule_limit returns false):
> > >> 	user can do whatever
> > >> else if cap_nice || Kconfig option to enfore limit
> > >> 	user within Kconfig range
> > >> else
> > >>  	user within sysfs range
> > >>
> > >> !cap_nice && Kconfig option to enfore limits == user within Kconfig
> > >> range
> > >> (previously) !cap_nice && Kconfig option to enfore limits == user
> > >> within sysfs range (my suggestion)
> > >
> > >In previous version we can achieve it by just adding one below check right?
> > >#if IS_ENABLED(CONFIG_DRM_XE_ENABLE_SCHEDTIMEOUT_LIMIT) &&
> > cap_nice
> > >+       u32 min = XE_HW_ENGINE_TIMESLICE_MIN;
> > >+       u32 max = XE_HW_ENGINE_TIMESLICE_MAX; #else
> > >+       u32 min = e->hwe->eclass->sched_props.timeslice_min;
> > >+       u32 max = e->hwe->eclass->sched_props.timeslice_max;
> > >+#endif
> > >
> > >Please let me know!
> > >
> > 
> > Ah I see. Yah, it is a limits selection issue.
> > We can do,
> > 
> > u32 min = e->hwe->eclass->sched_props.timeslice_min;
> > u32 max = e->hwe->eclass->sched_props.timeslice_max;
> > 
> > #if IS_ENABLED(CONFIG_DRM_XE_ENABLE_SCHEDTIMEOUT_LIMIT)
> >          if (cap_nice) {
> >                  u32 min = XE_HW_ENGINE_TIMESLICE_MIN;
> >                  u32 max = XE_HW_ENGINE_TIMESLICE_MAX;
> >          }
> > #endif
> > 
> > Matt, Tejas
> > Also, looks like you missed my another comment below.
> > 
> > Niranjana
> > 
> > >>
> > >> The logic is different and I believe we want what I'm suggesting.
> > >>
> > >> Matt
> > >>
> > >> > > > +		return -EINVAL;
> > >> > > >
> > >> > > >  	return e->ops->set_timeslice(e, value);  } @@ -201,8 +206,12
> > >> > > > @@ static int engine_set_preemption_timeout(struct xe_device *xe,
> > >> > > >  					 struct xe_engine *e, u64
> > value,
> > >> > > >  					 bool create)
> > >> > > >  {
> > >> > > > -	if (!capable(CAP_SYS_NICE))
> > >> > > > -		return -EPERM;
> > >> > > > +	u32 min = e->hwe->eclass-
> > >sched_props.preempt_timeout_min;
> > >> > > > +	u32 max = e->hwe->eclass-
> > >sched_props.preempt_timeout_max;
> > >> > > > +
> > >> > > > +	if (enforce_schedule_limit() &&
> > >> > > > +	    !engine_timeout_in_range(value, min, max))
> > >> > > > +		return -EINVAL;
> > >> > > >
> > >> > > >  	return e->ops->set_preempt_timeout(e, value);  } @@ -
> > 266,11
> > >> > > > +275,15 @@ static int engine_set_persistence(struct xe_device
> > >> > > > +*xe,
> > >> > > > struct xe_engine *e,  static int engine_set_job_timeout(struct
> > >> > > > xe_device
> > >> *xe, struct xe_engine *e,
> > >> > > >  				  u64 value, bool create)
> > >> > > >  {
> > >> > > > +	u32 min = e->hwe->eclass->sched_props.job_timeout_min;
> > >> > > > +	u32 max = e->hwe->eclass->sched_props.job_timeout_max;
> > >> > > > +
> > >> > > >  	if (XE_IOCTL_DBG(xe, !create))
> > >> > > >  		return -EINVAL;
> > >> > > >
> > >> > > > -	if (!capable(CAP_SYS_NICE))
> > >> > > > -		return -EPERM;
> > >> > > > +	if (enforce_schedule_limit() &&
> > >> > > > +	    !engine_timeout_in_range(value, min, max))
> > >> > > > +		return -EINVAL;
> > >> > > >
> > >> > > >  	return e->ops->set_job_timeout(e, value);  } diff --git
> > >> > > > a/drivers/gpu/drm/xe/xe_hw_engine.c
> > >> > > > b/drivers/gpu/drm/xe/xe_hw_engine.c
> > >> > > > index afa7d25c3852..e601bffe3b13 100644
> > >> > > > --- a/drivers/gpu/drm/xe/xe_hw_engine.c
> > >> > > > +++ b/drivers/gpu/drm/xe/xe_hw_engine.c
> > >> > > > @@ -364,8 +364,16 @@ static void hw_engine_init_early(struct
> > >> > > > xe_gt *gt, struct xe_hw_engine *hwe,
> > >> > > >
> > >> > > >  	if (!gt->eclass[hwe->class].sched_props.job_timeout_ms) {
> > >> > > >  		gt->eclass[hwe->class].sched_props.job_timeout_ms
> > = HZ *
> > >> 5;
> > >> > > > +		gt->eclass[hwe-
> > >class].sched_props.job_timeout_min =
> > >> XE_HW_ENGINE_JOB_TIMEOUT_MIN;
> > >> > > > +		gt->eclass[hwe-
> > >class].sched_props.job_timeout_max =
> > >> > > > +XE_HW_ENGINE_JOB_TIMEOUT_MAX;
> > >> > > >  		gt->eclass[hwe->class].sched_props.timeslice_us = 1
> > * 1000;
> > >> > > > +		gt->eclass[hwe->class].sched_props.timeslice_min =
> > >> XE_HW_ENGINE_TIMESLICE_MIN;
> > >> > > > +		gt->eclass[hwe->class].sched_props.timeslice_max =
> > >> > > > +XE_HW_ENGINE_TIMESLICE_MAX;
> > >> > > >  		gt->eclass[hwe-
> > >class].sched_props.preempt_timeout_us =
> > >> 640 *
> > >> > > > 1000;
> > >> > > > +		gt->eclass[hwe-
> > >class].sched_props.preempt_timeout_min =
> > >> > > > +
> > >> 	XE_HW_ENGINE_PREEMPT_TIMEOUT_MIN;
> > >> > > > +		gt->eclass[hwe-
> > >class].sched_props.preempt_timeout_max =
> > >> > > > +
> > >> 	XE_HW_ENGINE_PREEMPT_TIMEOUT_MAX;
> > >> > > >  		/* Record default props */
> > >> > > >  		gt->eclass[hwe->class].defaults = gt->eclass[hwe-
> > >> >class].sched_props;
> > >> > > >  	}
> > >> > > > diff --git a/drivers/gpu/drm/xe/xe_hw_engine.h
> > >> > > > b/drivers/gpu/drm/xe/xe_hw_engine.h
> > >> > > > index 7eca9d53c7b1..3d37d6d44261 100644
> > >> > > > --- a/drivers/gpu/drm/xe/xe_hw_engine.h
> > >> > > > +++ b/drivers/gpu/drm/xe/xe_hw_engine.h
> > >> > > > @@ -10,6 +10,37 @@
> > >> > > >
> > >> > > >  struct drm_printer;
> > >> > > >
> > >> > > > +#ifdef CONFIG_DRM_XE_JOB_TIMEOUT_MIN #define
> > >> > > > +XE_HW_ENGINE_JOB_TIMEOUT_MIN
> > >> CONFIG_DRM_XE_JOB_TIMEOUT_MIN #else
> > >> > > > +#define XE_HW_ENGINE_JOB_TIMEOUT_MIN 1 #endif #ifdef
> > >> > > > +CONFIG_DRM_XE_JOB_TIMEOUT_MAX #define
> > >> > > > +XE_HW_ENGINE_JOB_TIMEOUT_MAX
> > >> CONFIG_DRM_XE_JOB_TIMEOUT_MAX #else
> > >> > > > +#define XE_HW_ENGINE_JOB_TIMEOUT_MAX (10 * 1000) #endif
> > #ifdef
> > >> > > > +CONFIG_DRM_XE_TIMESLICE_MIN #define
> > >> XE_HW_ENGINE_TIMESLICE_MIN
> > >> > > > +CONFIG_DRM_XE_TIMESLICE_MIN #else #define
> > >> > > > +XE_HW_ENGINE_TIMESLICE_MIN 1 #endif #ifdef
> > >> > > > +CONFIG_DRM_XE_TIMESLICE_MAX #define
> > >> XE_HW_ENGINE_TIMESLICE_MAX
> > >> > > > +CONFIG_DRM_XE_TIMESLICE_MAX #else #define
> > >> > > > +XE_HW_ENGINE_TIMESLICE_MAX (10 * 1000 * 1000) #endif #ifdef
> > >> > > > +CONFIG_DRM_XE_PREEMPT_TIMEOUT_MIN
> > >> > > > +#define XE_HW_ENGINE_PREEMPT_TIMEOUT_MIN
> > >> > > > +CONFIG_DRM_XE_PREEMPT_TIMEOUT_MIN #else #define
> > >> > > > +XE_HW_ENGINE_PREEMPT_TIMEOUT_MIN 1 #endif #ifdef
> > >> > > > +CONFIG_DRM_XE_PREEMPT_TIMEOUT_MAX
> > >> > > > +#define XE_HW_ENGINE_PREEMPT_TIMEOUT_MAX
> > >> > > > +CONFIG_DRM_XE_PREEMPT_TIMEOUT_MAX #else #define
> > >> > > > +XE_HW_ENGINE_PREEMPT_TIMEOUT_MAX (10 * 1000 * 1000)
> > #endif
> > >> > > > +
> > >> > > >  int xe_hw_engines_init_early(struct xe_gt *gt);  int
> > >> > > > xe_hw_engines_init(struct xe_gt *gt);  void
> > >> > > > xe_hw_engine_handle_irq(struct xe_hw_engine *hwe, u16
> > >> > > > intr_vec); diff --git
> > >> > > > a/drivers/gpu/drm/xe/xe_hw_engine_class_sysfs.c
> > >> > > > b/drivers/gpu/drm/xe/xe_hw_engine_class_sysfs.c
> > >> > > > index 990bb675d1e0..2b7ac4e02db6 100644
> > >> > > > --- a/drivers/gpu/drm/xe/xe_hw_engine_class_sysfs.c
> > >> > > > +++ b/drivers/gpu/drm/xe/xe_hw_engine_class_sysfs.c
> > >> > > > @@ -11,6 +11,20 @@
> > >> > > >
> > >> > > >  static int xe_add_hw_engine_class_defaults(struct kobject
> > >> > > > *parent);
> > >> > > >
> > >> > > > +bool enforce_schedule_limit(void) { #if
> > >> > > > +IS_ENABLED(CONFIG_DRM_XE_ENABLE_SCHEDTIMEOUT_LIMIT)
> > >> > > > +	return true;
> > >> > > > +#else
> > >> > > > +	return !capable(CAP_SYS_NICE); #endif }
> > >> > > > +
> > >> > > > +bool engine_timeout_in_range(u64 timeout, u64 min, u64 max) {
> > >> > > > +	return timeout >= min && timeout <= max; }
> > >> > > > +
> > >> > > >  static void kobj_xe_hw_engine_release(struct kobject *kobj)  {
> > >> > > >  	kfree(kobj);
> > >> > > > @@ -39,11 +53,92 @@ kobj_xe_hw_engine_class(struct kobject
> > >> *parent, char *name)
> > >> > > >  	return keclass;
> > >> > > >  }
> > >> > > >
> > >> > > > +static ssize_t job_timeout_max_store(struct kobject *kobj,
> > >> > > > +				     struct kobj_attribute *attr,
> > >> > > > +				     const char *buf, size_t count) {
> > >> > > > +	struct xe_hw_engine_class_intf *eclass =
> > kobj_to_eclass(kobj);
> > >> > > > +	u32 timeout;
> > >> > > > +	int err;
> > >> > > > +
> > >> > > > +	err = kstrtou32(buf, 0, &timeout);
> > >> > > > +	if (err)
> > >> > > > +		return err;
> > >> > > > +
> > >> > > > +	if (timeout < eclass->sched_props.job_timeout_min)
> > >> > > > +		return -EINVAL;
> > >> > > > +
> > >> > > > +	if (enforce_schedule_limit() &&
> > >> > > > +	    !engine_timeout_in_range(timeout,
> > >> > > > +
> > XE_HW_ENGINE_JOB_TIMEOUT_MIN,
> > >> > > > +
> > XE_HW_ENGINE_JOB_TIMEOUT_MAX))
> > >> > > > +		return -EINVAL;
> > >> > > > +
> > >> > > > +	WRITE_ONCE(eclass->sched_props.job_timeout_max,
> > timeout);
> > >> > > > +
> > >> > > > +	return count;
> > >> > > > +}
> > >> > > > +
> > >> > > > +static ssize_t job_timeout_max_show(struct kobject *kobj,
> > >> > > > +				    struct kobj_attribute *attr, char
> > *buf) {
> > >> > > > +	struct xe_hw_engine_class_intf *eclass =
> > >> > > > +kobj_to_eclass(kobj);
> > >> > > > +
> > >> > > > +	return sprintf(buf, "%u\n",
> > >> > > > +eclass->sched_props.job_timeout_max);
> > >> > > > +}
> > >> > > > +
> > >> > > > +static struct kobj_attribute job_timeout_max_attr =
> > >> > > > +__ATTR(job_timeout_max, 0644, job_timeout_max_show,
> > >> > > > +job_timeout_max_store);
> > >> > > > +
> > >> > > > +static ssize_t job_timeout_min_store(struct kobject *kobj,
> > >> > > > +				     struct kobj_attribute *attr,
> > >> > > > +				     const char *buf, size_t count) {
> > >> > > > +	struct xe_hw_engine_class_intf *eclass =
> > kobj_to_eclass(kobj);
> > >> > > > +	u32 timeout;
> > >> > > > +	int err;
> > >> > > > +
> > >> > > > +	err = kstrtou32(buf, 0, &timeout);
> > >> > > > +	if (err)
> > >> > > > +		return err;
> > >> > > > +
> > >> > > > +	if (timeout > eclass->sched_props.job_timeout_max)
> > >> > > > +		return -EINVAL;
> > >> > > > +
> > >> > > > +	if (enforce_schedule_limit() &&
> > >> > > > +	    !engine_timeout_in_range(timeout,
> > >> > > > +
> > XE_HW_ENGINE_JOB_TIMEOUT_MIN,
> > >> > > > +
> > XE_HW_ENGINE_JOB_TIMEOUT_MAX))
> > >> > > > +		return -EINVAL;
> > >> > > > +
> > >> > > > +	WRITE_ONCE(eclass->sched_props.job_timeout_min,
> > timeout);
> > >> > > > +
> > >> > > > +	return count;
> > >> > > > +}
> > >> > > > +
> > >> > > > +static ssize_t job_timeout_min_show(struct kobject *kobj,
> > >> > > > +				    struct kobj_attribute *attr, char
> > *buf) {
> > >> > > > +	struct xe_hw_engine_class_intf *eclass =
> > >> > > > +kobj_to_eclass(kobj);
> > >> > > > +
> > >> > > > +	return sprintf(buf, "%u\n",
> > >> > > > +eclass->sched_props.job_timeout_min);
> > >> > > > +}
> > >> > > > +
> > >> > > > +static struct kobj_attribute job_timeout_min_attr =
> > >> > > > +__ATTR(job_timeout_min, 0644, job_timeout_min_show,
> > >> > > > +job_timeout_min_store);
> > >> > > > +
> > >> > > >  static ssize_t job_timeout_store(struct kobject *kobj,
> > >> > > >  				 struct kobj_attribute *attr,
> > >> > > >  				 const char *buf, size_t count)  {
> > >> > > >  	struct xe_hw_engine_class_intf *eclass =
> > >> > > > kobj_to_eclass(kobj);
> > >> > > > +#if IS_ENABLED(CONFIG_DRM_XE_ENABLE_SCHEDTIMEOUT_LIMIT)
> > >> > > > +	u32 min = XE_HW_ENGINE_JOB_TIMEOUT_MIN;
> > >> > > > +	u32 max = XE_HW_ENGINE_JOB_TIMEOUT_MAX; #else
> > >> > > > +	u32 min = e->hwe->eclass->sched_props.job_timeout_min;
> > >> > > > +	u32 max = e->hwe->eclass->sched_props.job_timeout_max;
> > >> > > > +#endif
> > >> > >
> > >> > > I don't think we need this, just make sure default is within min
> > >> > > / max of the sched_props.
> > >> > >
> > >> >
> > >> > Shouldn't the sched_prop set through sysfs here which applies to
> > >> > all future user engines (xe_engine) has the same requirement as the
> > >> > sched_prop set directly to user engine (xe_engine) through
> > >> > set_properly
> > >> ioctl?
> > >> > ie., shoudln't the requirement be same in job_timeout_store() and
> > >> > engine_set_job_timeout()?
> 
> I also think it should apply same to sysfs calls as well. Unless we think sysfs should limit to compile configs only. Since sysfs min/max cab be changed.
> 

Disagree, the min / max sysfs entries are subject to the Kconfig limits.
So if you check the sysfs entry min / max here, the initial value will
always be within the Kconfig limits plus any additional restrictions a
user has imposed.

Matt

> Thanks,
> Tejas
> 
> > >> >
> > >> > Niranjana
> > >> >
> > >> > > Matt
> > >> > >
> > >> > > >  	u32 timeout;
> > >> > > >  	int err;
> > >> > > >
> > >> > > > @@ -51,6 +146,10 @@ static ssize_t job_timeout_store(struct
> > >> > > > kobject
> > >> *kobj,
> > >> > > >  	if (err)
> > >> > > >  		return err;
> > >> > > >
> > >> > > > +	if (enforce_schedule_limit() &&
> > >> > > > +	    !engine_timeout_in_range(timeout, min, max))
> > >> > > > +		return -EINVAL;
> > >> > > > +
> > >> > > >  	WRITE_ONCE(eclass->sched_props.job_timeout_ms,
> > timeout);
> > >> > > >
> > >> > > >  	return count;
> > >> > > > @@ -78,11 +177,40 @@ static ssize_t job_timeout_default(struct
> > >> > > > kobject *kobj,  static struct kobj_attribute job_timeout_def =
> > >> > > > __ATTR(job_timeout_ms, 0444, job_timeout_default, NULL);
> > >> > > >
> > >> > > > +static ssize_t job_timeout_min_default(struct kobject *kobj,
> > >> > > > +				       struct kobj_attribute *attr, char
> > *buf) {
> > >> > > > +	struct xe_hw_engine_class_intf *eclass =
> > >> > > > +kobj_to_eclass(kobj->parent);
> > >> > > > +
> > >> > > > +	return sprintf(buf, "%u\n",
> > >> > > > +eclass->defaults.job_timeout_min);
> > >> > > > +}
> > >> > > > +
> > >> > > > +static struct kobj_attribute job_timeout_min_def =
> > >> > > > +__ATTR(job_timeout_min, 0444, job_timeout_min_default, NULL);
> > >> > > > +
> > >> > > > +static ssize_t job_timeout_max_default(struct kobject *kobj,
> > >> > > > +				       struct kobj_attribute *attr, char
> > *buf) {
> > >> > > > +	struct xe_hw_engine_class_intf *eclass =
> > >> > > > +kobj_to_eclass(kobj->parent);
> > >> > > > +
> > >> > > > +	return sprintf(buf, "%u\n",
> > >> > > > +eclass->defaults.job_timeout_max);
> > >> > > > +}
> > >> > > > +
> > >> > > > +static struct kobj_attribute job_timeout_max_def =
> > >> > > > +__ATTR(job_timeout_max, 0444, job_timeout_max_default, NULL);
> > >> > > > +
> > >> > > >  static ssize_t timeslice_duration_store(struct kobject *kobj,
> > >> > > >  					struct kobj_attribute *attr,
> > >> > > >  					const char *buf, size_t count)
> > {
> > >> > > >  	struct xe_hw_engine_class_intf *eclass =
> > >> > > > kobj_to_eclass(kobj);
> > >> > > > +#if IS_ENABLED(CONFIG_DRM_XE_ENABLE_SCHEDTIMEOUT_LIMIT)
> > >> > > > +	u32 min = XE_HW_ENGINE_TIMESLICE_MIN;
> > >> > > > +	u32 max = XE_HW_ENGINE_TIMESLICE_MAX; #else
> > >> > > > +	u32 min = e->hwe->eclass->sched_props.timeslice_min;
> > >> > > > +	u32 max = e->hwe->eclass->sched_props.timeslice_max;
> > >> > > > +#endif
> > >> > > >  	u32 duration;
> > >> > > >  	int err;
> > >> > > >
> > >> > > > @@ -90,11 +218,92 @@ static ssize_t
> > >> > > > timeslice_duration_store(struct
> > >> kobject *kobj,
> > >> > > >  	if (err)
> > >> > > >  		return err;
> > >> > > >
> > >> > > > +	if (enforce_schedule_limit() &&
> > >> > > > +	    !engine_timeout_in_range(duration, min, max))
> > >> > > > +		return -EINVAL;
> > >> > > > +
> > >> > > >  	WRITE_ONCE(eclass->sched_props.timeslice_us, duration);
> > >> > > >
> > >> > > >  	return count;
> > >> > > >  }
> > >> > > >
> > >> > > > +static ssize_t timeslice_duration_max_store(struct kobject *kobj,
> > >> > > > +					    struct kobj_attribute *attr,
> > >> > > > +					    const char *buf, size_t
> > count) {
> > >> > > > +	struct xe_hw_engine_class_intf *eclass =
> > kobj_to_eclass(kobj);
> > >> > > > +	u32 duration;
> > >> > > > +	int err;
> > >> > > > +
> > >> > > > +	err = kstrtou32(buf, 0, &duration);
> > >> > > > +	if (err)
> > >> > > > +		return err;
> > >> > > > +
> > >> > > > +	if (duration < eclass->sched_props.timeslice_min)
> > >> > > > +		return -EINVAL;
> > >> > > > +
> > >> > > > +	if (enforce_schedule_limit() &&
> > >> > > > +	    !engine_timeout_in_range(duration,
> > >> > > > +				     XE_HW_ENGINE_TIMESLICE_MIN,
> > >> > > > +
> > XE_HW_ENGINE_TIMESLICE_MAX))
> > >> > > > +		return -EINVAL;
> > >> > > > +
> > >> > > > +	WRITE_ONCE(eclass->sched_props.timeslice_max, duration);
> > >> > > > +
> > >> > > > +	return count;
> > >> > > > +}
> > >> > > > +
> > >> > > > +static ssize_t timeslice_duration_max_show(struct kobject *kobj,
> > >> > > > +					   struct kobj_attribute *attr,
> > >> > > > +					   char *buf)
> > >> > > > +{
> > >> > > > +	struct xe_hw_engine_class_intf *eclass =
> > >> > > > +kobj_to_eclass(kobj);
> > >> > > > +
> > >> > > > +	return sprintf(buf, "%u\n",
> > >> > > > +eclass->sched_props.timeslice_max);
> > >> > > > +}
> > >> > > > +
> > >> > > > +static struct kobj_attribute timeslice_duration_max_attr =
> > >> > > > +	__ATTR(timeslice_duration_max, 0644,
> > >> timeslice_duration_max_show,
> > >> > > > +	       timeslice_duration_max_store);
> > >> > > > +
> > >> > > > +static ssize_t timeslice_duration_min_store(struct kobject *kobj,
> > >> > > > +					    struct kobj_attribute *attr,
> > >> > > > +					    const char *buf, size_t
> > count) {
> > >> > > > +	struct xe_hw_engine_class_intf *eclass =
> > kobj_to_eclass(kobj);
> > >> > > > +	u32 duration;
> > >> > > > +	int err;
> > >> > > > +
> > >> > > > +	err = kstrtou32(buf, 0, &duration);
> > >> > > > +	if (err)
> > >> > > > +		return err;
> > >> > > > +
> > >> > > > +	if (duration > eclass->sched_props.timeslice_max)
> > >> > > > +		return -EINVAL;
> > >> > > > +
> > >> > > > +	if (enforce_schedule_limit() &&
> > >> > > > +	    !engine_timeout_in_range(duration,
> > >> > > > +				     XE_HW_ENGINE_TIMESLICE_MIN,
> > >> > > > +
> > XE_HW_ENGINE_TIMESLICE_MAX))
> > >> > > > +		return -EINVAL;
> > >> > > > +
> > >> > > > +	WRITE_ONCE(eclass->sched_props.timeslice_min, duration);
> > >> > > > +
> > >> > > > +	return count;
> > >> > > > +}
> > >> > > > +
> > >> > > > +static ssize_t timeslice_duration_min_show(struct kobject *kobj,
> > >> > > > +					   struct kobj_attribute *attr,
> > char
> > >> *buf) {
> > >> > > > +	struct xe_hw_engine_class_intf *eclass =
> > >> > > > +kobj_to_eclass(kobj);
> > >> > > > +
> > >> > > > +	return sprintf(buf, "%u\n",
> > >> > > > +eclass->sched_props.timeslice_min);
> > >> > > > +}
> > >> > > > +
> > >> > > > +static struct kobj_attribute timeslice_duration_min_attr =
> > >> > > > +	__ATTR(timeslice_duration_min, 0644,
> > >> timeslice_duration_min_show,
> > >> > > > +	       timeslice_duration_min_store);
> > >> > > > +
> > >> > > >  static ssize_t timeslice_duration_show(struct kobject *kobj,
> > >> > > >  		struct kobj_attribute *attr, char *buf)  { @@ -118,11
> > >> > > > +327,40 @@ static ssize_t timeslice_default(struct kobject
> > >> > > > *kobj,  static struct kobj_attribute timeslice_duration_def =
> > >> > > > __ATTR(timeslice_duration_us, 0444, timeslice_default, NULL);
> > >> > > >
> > >> > > > +static ssize_t timeslice_min_default(struct kobject *kobj,
> > >> > > > +				     struct kobj_attribute *attr, char
> > *buf) {
> > >> > > > +	struct xe_hw_engine_class_intf *eclass =
> > >> > > > +kobj_to_eclass(kobj->parent);
> > >> > > > +
> > >> > > > +	return sprintf(buf, "%u\n", eclass->defaults.timeslice_min);
> > >> > > > +}
> > >> > > > +
> > >> > > > +static struct kobj_attribute timeslice_duration_min_def =
> > >> > > > +__ATTR(timeslice_duration_min, 0444, timeslice_min_default,
> > >> > > > +NULL);
> > >> > > > +
> > >> > > > +static ssize_t timeslice_max_default(struct kobject *kobj,
> > >> > > > +				     struct kobj_attribute *attr, char
> > *buf) {
> > >> > > > +	struct xe_hw_engine_class_intf *eclass =
> > >> > > > +kobj_to_eclass(kobj->parent);
> > >> > > > +
> > >> > > > +	return sprintf(buf, "%u\n", eclass->defaults.timeslice_max);
> > >> > > > +}
> > >> > > > +
> > >> > > > +static struct kobj_attribute timeslice_duration_max_def =
> > >> > > > +__ATTR(timeslice_duration_max, 0444, timeslice_max_default,
> > >> > > > +NULL);
> > >> > > > +
> > >> > > >  static ssize_t preempt_timeout_store(struct kobject *kobj,
> > >> > > >  				     struct kobj_attribute *attr,
> > >> > > >  				     const char *buf, size_t count)  {
> > >> > > >  	struct xe_hw_engine_class_intf *eclass =
> > >> > > > kobj_to_eclass(kobj);
> > >> > > > +#if IS_ENABLED(CONFIG_DRM_XE_ENABLE_SCHEDTIMEOUT_LIMIT)
> > >> > > > +	u32 min = XE_HW_ENGINE_PREEMPT_TIMEOUT_MIN;
> > >> > > > +	u32 max = XE_HW_ENGINE_PREEMPT_TIMEOUT_MAX; #else
> > >> > > > +	u32 min = e->hwe->eclass-
> > >sched_props.preempt_timeout_min;
> > >> > > > +	u32 max = e->hwe->eclass-
> > >sched_props.preempt_timeout_max;
> > >> > > > +#endif
> > >> > > >  	u32 timeout;
> > >> > > >  	int err;
> > >> > > >
> > >> > > > @@ -130,6 +368,10 @@ static ssize_t
> > >> > > > preempt_timeout_store(struct
> > >> kobject *kobj,
> > >> > > >  	if (err)
> > >> > > >  		return err;
> > >> > > >
> > >> > > > +	if (enforce_schedule_limit() &&
> > >> > > > +	    !engine_timeout_in_range(timeout, min, max))
> > >> > > > +		return -EINVAL;
> > >> > > > +
> > >> > > >  	WRITE_ONCE(eclass->sched_props.preempt_timeout_us,
> > timeout);
> > >> > > >
> > >> > > >  	return count;
> > >> > > > @@ -158,17 +400,129 @@ static ssize_t
> > >> > > > preempt_timeout_default(struct kobject *kobj,  static struct
> > >> > > > kobj_attribute preempt_timeout_def =
> > >> > > > __ATTR(preempt_timeout_us, 0444, preempt_timeout_default,
> > >> > > > NULL);
> > >> > > >
> > >> > > > +static ssize_t preempt_timeout_min_default(struct kobject *kobj,
> > >> > > > +					   struct kobj_attribute *attr,
> > >> > > > +					   char *buf)
> > >> > > > +{
> > >> > > > +	struct xe_hw_engine_class_intf *eclass =
> > >> > > > +kobj_to_eclass(kobj->parent);
> > >> > > > +
> > >> > > > +	return sprintf(buf, "%u\n",
> > >> > > > +eclass->defaults.preempt_timeout_min);
> > >> > > > +}
> > >> > > > +
> > >> > > > +static struct kobj_attribute preempt_timeout_min_def =
> > >> > > > +__ATTR(preempt_timeout_min, 0444,
> > preempt_timeout_min_default,
> > >> > > > +NULL);
> > >> > > > +
> > >> > > > +static ssize_t preempt_timeout_max_default(struct kobject *kobj,
> > >> > > > +					   struct kobj_attribute *attr,
> > >> > > > +					   char *buf)
> > >> > > > +{
> > >> > > > +	struct xe_hw_engine_class_intf *eclass =
> > >> > > > +kobj_to_eclass(kobj->parent);
> > >> > > > +
> > >> > > > +	return sprintf(buf, "%u\n",
> > >> > > > +eclass->defaults.preempt_timeout_max);
> > >> > > > +}
> > >> > > > +
> > >> > > > +static struct kobj_attribute preempt_timeout_max_def =
> > >> > > > +__ATTR(preempt_timeout_max, 0444,
> > >> preempt_timeout_max_default,
> > >> > > > +NULL);
> > >> > > > +
> > >> > > > +static ssize_t preempt_timeout_max_store(struct kobject *kobj,
> > >> > > > +					 struct kobj_attribute *attr,
> > >> > > > +					 const char *buf, size_t count)
> > {
> > >> > > > +	struct xe_hw_engine_class_intf *eclass =
> > kobj_to_eclass(kobj);
> > >> > > > +	u32 timeout;
> > >> > > > +	int err;
> > >> > > > +
> > >> > > > +	err = kstrtou32(buf, 0, &timeout);
> > >> > > > +	if (err)
> > >> > > > +		return err;
> > >> > > > +
> > >> > > > +	if (timeout < eclass->sched_props.preempt_timeout_min)
> > >> > > > +		return -EINVAL;
> > >> > > > +
> > >> > > > +	if (enforce_schedule_limit() &&
> > >> > > > +	    !engine_timeout_in_range(timeout,
> > >> > > > +
> > >> XE_HW_ENGINE_PREEMPT_TIMEOUT_MIN,
> > >> > > > +
> > >> XE_HW_ENGINE_PREEMPT_TIMEOUT_MAX))
> > >> > > > +		return -EINVAL;
> > >> > > > +
> > >> > > > +	WRITE_ONCE(eclass->sched_props.preempt_timeout_max,
> > timeout);
> > >> > > > +
> > >> > > > +	return count;
> > >> > > > +}
> > >> > > > +
> > >> > > > +static ssize_t preempt_timeout_max_show(struct kobject *kobj,
> > >> > > > +					struct kobj_attribute *attr,
> > char *buf)
> > >> {
> > >> > > > +	struct xe_hw_engine_class_intf *eclass =
> > >> > > > +kobj_to_eclass(kobj);
> > >> > > > +
> > >> > > > +	return sprintf(buf, "%u\n",
> > >> > > > +eclass->sched_props.preempt_timeout_max);
> > >> > > > +}
> > >> > > > +
> > >> > > > +static struct kobj_attribute preempt_timeout_max_attr =
> > >> > > > +	__ATTR(preempt_timeout_max, 0644,
> > preempt_timeout_max_show,
> > >> > > > +	       preempt_timeout_max_store);
> > >> > > > +
> > >> > > > +static ssize_t preempt_timeout_min_store(struct kobject *kobj,
> > >> > > > +					 struct kobj_attribute *attr,
> > >> > > > +					 const char *buf, size_t count)
> > {
> > >> > > > +	struct xe_hw_engine_class_intf *eclass =
> > kobj_to_eclass(kobj);
> > >> > > > +	u32 timeout;
> > >> > > > +	int err;
> > >> > > > +
> > >> > > > +	err = kstrtou32(buf, 0, &timeout);
> > >> > > > +	if (err)
> > >> > > > +		return err;
> > >> > > > +
> > >> > > > +	if (timeout > eclass->sched_props.preempt_timeout_max)
> > >> > > > +		return -EINVAL;
> > >> > > > +
> > >> > > > +	if (enforce_schedule_limit() &&
> > >> > > > +	    !engine_timeout_in_range(timeout,
> > >> > > > +
> > >> XE_HW_ENGINE_PREEMPT_TIMEOUT_MIN,
> > >> > > > +
> > >> XE_HW_ENGINE_PREEMPT_TIMEOUT_MAX))
> > >> > > > +		return -EINVAL;
> > >> > > > +
> > >> > > > +	WRITE_ONCE(eclass->sched_props.preempt_timeout_min,
> > timeout);
> > >> > > > +
> > >> > > > +	return count;
> > >> > > > +}
> > >> > > > +
> > >> > > > +static ssize_t preempt_timeout_min_show(struct kobject *kobj,
> > >> > > > +					struct kobj_attribute *attr,
> > char *buf)
> > >> {
> > >> > > > +	struct xe_hw_engine_class_intf *eclass =
> > >> > > > +kobj_to_eclass(kobj);
> > >> > > > +
> > >> > > > +	return sprintf(buf, "%u\n",
> > >> > > > +eclass->sched_props.preempt_timeout_min);
> > >> > > > +}
> > >> > > > +
> > >> > > > +static struct kobj_attribute preempt_timeout_min_attr =
> > >> > > > +	__ATTR(preempt_timeout_min, 0644,
> > preempt_timeout_min_show,
> > >> > > > +	       preempt_timeout_min_store);
> > >> > > > +
> > >> > > >  static const struct attribute *defaults[] = {
> > >> > > >  	&job_timeout_def.attr,
> > >> > > > +	&job_timeout_min_def.attr,
> > >> > > > +	&job_timeout_max_def.attr,
> > >> > > >  	&timeslice_duration_def.attr,
> > >> > > > +	&timeslice_duration_min_def.attr,
> > >> > > > +	&timeslice_duration_max_def.attr,
> > >> > > >  	&preempt_timeout_def.attr,
> > >> > > > +	&preempt_timeout_min_def.attr,
> > >> > > > +	&preempt_timeout_max_def.attr,
> > >> > > >  	NULL
> > >> > > >  };
> > >> > > >
> > >> > > >  static const struct attribute *files[] = {
> > >> > > >  	&job_timeout_attr.attr,
> > >> > > > +	&job_timeout_min_attr.attr,
> > >> > > > +	&job_timeout_max_attr.attr,
> > >> > > >  	&timeslice_duration_attr.attr,
> > >> > > > +	&timeslice_duration_min_attr.attr,
> > >> > > > +	&timeslice_duration_max_attr.attr,
> > >> > > >  	&preempt_timeout_attr.attr,
> > >> > > > +	&preempt_timeout_min_attr.attr,
> > >> > > > +	&preempt_timeout_max_attr.attr,
> > >> > > >  	NULL
> > >> > > >  };
> > >> > > >
> > >> > > > diff --git a/drivers/gpu/drm/xe/xe_hw_engine_class_sysfs.h
> > >> > > > b/drivers/gpu/drm/xe/xe_hw_engine_class_sysfs.h
> > >> > > > index 757136614672..2e2ab351a991 100644
> > >> > > > --- a/drivers/gpu/drm/xe/xe_hw_engine_class_sysfs.h
> > >> > > > +++ b/drivers/gpu/drm/xe/xe_hw_engine_class_sysfs.h
> > >> > > > @@ -10,6 +10,8 @@
> > >> > > >
> > >> > > >  #define MAX_ENGINE_CLASS_NAME_LEN    16
> > >> > > >  int xe_hw_engine_class_sysfs_init(struct xe_gt *gt);
> > >> > > > +bool enforce_schedule_limit(void); bool
> > >> > > > +engine_timeout_in_range(u64 timeout, u64 min, u64 max);
> > >> > > >
> > >> > > >  /**
> > >> > > >   * struct kobj_eclass - A eclass's kobject struct that
> > >> > > > connects the kobject and the
> > >> > > > --
> > >> > > > 2.25.1
> > >> > > >

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

* Re: [Intel-xe] [PATCH V9 6/6] drm/xe: Add min/max cap for engine scheduler properties
  2023-07-28 14:24               ` Matthew Brost
@ 2023-07-28 14:27                 ` Upadhyay, Tejas
  2023-07-28 14:53                   ` Niranjana Vishwanathapura
  0 siblings, 1 reply; 30+ messages in thread
From: Upadhyay, Tejas @ 2023-07-28 14:27 UTC (permalink / raw)
  To: Brost, Matthew; +Cc: intel-xe@lists.freedesktop.org



> -----Original Message-----
> From: Brost, Matthew <matthew.brost@intel.com>
> Sent: Friday, July 28, 2023 7:54 PM
> To: Upadhyay, Tejas <tejas.upadhyay@intel.com>
> Cc: Vishwanathapura, Niranjana <niranjana.vishwanathapura@intel.com>;
> intel-xe@lists.freedesktop.org
> Subject: Re: [PATCH V9 6/6] drm/xe: Add min/max cap for engine scheduler
> properties
> 
> On Fri, Jul 28, 2023 at 01:36:29AM -0600, Upadhyay, Tejas wrote:
> >
> >
> > > -----Original Message-----
> > > From: Vishwanathapura, Niranjana
> > > <niranjana.vishwanathapura@intel.com>
> > > Sent: Friday, July 28, 2023 11:56 AM
> > > To: Upadhyay, Tejas <tejas.upadhyay@intel.com>
> > > Cc: Brost, Matthew <matthew.brost@intel.com>; intel-
> > > xe@lists.freedesktop.org
> > > Subject: Re: [PATCH V9 6/6] drm/xe: Add min/max cap for engine
> > > scheduler properties
> > >
> > > On Thu, Jul 27, 2023 at 10:54:42PM -0700, Upadhyay, Tejas wrote:
> > > >
> > > >
> > > >> -----Original Message-----
> > > >> From: Brost, Matthew <matthew.brost@intel.com>
> > > >> Sent: Friday, July 28, 2023 10:35 AM
> > > >> To: Vishwanathapura, Niranjana
> > > <niranjana.vishwanathapura@intel.com>
> > > >> Cc: Upadhyay, Tejas <tejas.upadhyay@intel.com>; intel-
> > > >> xe@lists.freedesktop.org
> > > >> Subject: Re: [PATCH V9 6/6] drm/xe: Add min/max cap for engine
> > > >> scheduler properties
> > > >>
> > > >> On Thu, Jul 27, 2023 at 09:44:23PM -0700, Niranjana
> > > >> Vishwanathapura
> > > >> wrote:
> > > >> > On Thu, Jul 27, 2023 at 03:26:49PM +0000, Matthew Brost wrote:
> > > >> > > On Thu, Jul 27, 2023 at 01:52:35PM +0530, Tejas Upadhyay wrote:
> > > >> > > > Add sysfs entries for the min, max, and defaults for each
> > > >> > > > of engine scheduler controls for every hardware engine class.
> > > >> > > >
> > > >> > > > Non-elevated user IOCTLs to set these controls must be
> > > >> > > > within the min-max ranges of the sysfs entries, elevated
> > > >> > > > user can set these controls to any value. However,
> > > >> > > > introduced compile time CONFIG min-max values which
> > > >> > > > restricts elevated user to be in compile time min-max range if at
> all sysfs min/max are violated.
> > > >> > > >
> > > >> > > > Sysfs entries examples are, DUT# cat
> > > /sys/class/drm/cardX/device/tileN/gtN/engines/ccs/.defaults/
> > > >> > > > job_timeout_max         job_timeout_ms
> preempt_timeout_min
> > > >> timeslice_duration_max  timeslice_duration_us
> > > >> > > > job_timeout_min         preempt_timeout_max
> > > preempt_timeout_us
> > > >> timeslice_duration_min
> > > >> > > >
> > > >> > > > DUT# cat /sys/class/drm/card1/device/tileN/gtN/engines/ccs/
> > > >> > > > .defaults/              job_timeout_min         preempt_timeout_max
> > > >> preempt_timeout_us      timeslice_duration_min
> > > >> > > > job_timeout_max         job_timeout_ms
> preempt_timeout_min
> > > >> timeslice_duration_max  timeslice_duration_us
> > > >> > > >
> > > >> > > > V9 :
> > > >> > > >    - Rebase to use s/xe_engine/xe_hw_engine/ - Matt
> > > >> > > > V8 :
> > > >> > > >    - fix enforce_sched_limit and avoid code duplication - Niranjana
> > > >> > > >    - Make sure min < max - Niranjana
> > > >> > > > V7 :
> > > >> > > >    - Rebase to replace hw engine with eclass interface
> > > >> > > >    - return EINVAL in place of EPERM
> > > >> > > >    - Use some APIs to avoid code duplication
> > > >> > > > V6 :
> > > >> > > >    - Rebase changes to reflect per engine class props interface -
> MattB
> > > >> > > >    - Use #if ENABLED - MattB
> > > >> > > >    - Remove MAX_SCHED_TIMEOUT check as range validation is
> > > >> > > > enough
> > > >> > > > V5 :
> > > >> > > >    - Rebase to resolve conflicts - CI
> > > >> > > > V4 :
> > > >> > > >    - Rebase
> > > >> > > >    - Update commit to reflect tile addition
> > > >> > > >    - Use XE_HW macro directly as they are already filtered
> > > >> > > >      for CONFIG checks - Niranjana
> > > >> > > >    - Add CONFIG for enable/disable min/max limitation
> > > >> > > >      on elevated user. Default is enable - Matt/Joonas
> > > >> > > > V3 :
> > > >> > > >    - Resolve CI hooks warning for kernel-doc
> > > >> > > > V2 :
> > > >> > > >    - Restric min/max setting to #define default min/max for
> > > >> > > >      elevated user - Himal
> > > >> > > >    - Remove unrelated changes from patch - Niranjana
> > > >> > > >
> > > >> > > > Signed-off-by: Tejas Upadhyay <tejas.upadhyay@intel.com>
> > > >> > > > ---
> > > >> > > >  drivers/gpu/drm/xe/Kconfig                    |   6 +
> > > >> > > >  drivers/gpu/drm/xe/Kconfig.profile            |  46 +++
> > > >> > > >  drivers/gpu/drm/xe/xe_engine.c                |  25 +-
> > > >> > > >  drivers/gpu/drm/xe/xe_hw_engine.c             |   8 +
> > > >> > > >  drivers/gpu/drm/xe/xe_hw_engine.h             |  31 ++
> > > >> > > >  drivers/gpu/drm/xe/xe_hw_engine_class_sysfs.c | 354
> > > >> ++++++++++++++++++
> > > >> > > >  drivers/gpu/drm/xe/xe_hw_engine_class_sysfs.h |   2 +
> > > >> > > >  7 files changed, 466 insertions(+), 6 deletions(-)  create
> > > >> > > > mode
> > > >> > > > 100644 drivers/gpu/drm/xe/Kconfig.profile
> > > >> > > >
> > > >> > > > diff --git a/drivers/gpu/drm/xe/Kconfig
> > > >> > > > b/drivers/gpu/drm/xe/Kconfig index
> > > >> > > > d44794f99338..0a4ea965645b
> > > >> > > > 100644
> > > >> > > > --- a/drivers/gpu/drm/xe/Kconfig
> > > >> > > > +++ b/drivers/gpu/drm/xe/Kconfig
> > > >> > > > @@ -83,3 +83,9 @@ depends on DRM_XE  depends on EXPERT
> > > source
> > > >> > > > "drivers/gpu/drm/xe/Kconfig.debug"
> > > >> > > >  endmenu
> > > >> > > > +
> > > >> > > > +menu "drm/xe Profile Guided Optimisation"
> > > >> > > > +	visible if EXPERT
> > > >> > > > +	depends on DRM_XE
> > > >> > > > +	source "drivers/gpu/drm/xe/Kconfig.profile"
> > > >> > > > +endmenu
> > > >> > > > diff --git a/drivers/gpu/drm/xe/Kconfig.profile
> > > >> > > > b/drivers/gpu/drm/xe/Kconfig.profile
> > > >> > > > new file mode 100644
> > > >> > > > index 000000000000..e72f15ec4bf6
> > > >> > > > --- /dev/null
> > > >> > > > +++ b/drivers/gpu/drm/xe/Kconfig.profile
> > > >> > > > @@ -0,0 +1,46 @@
> > > >> > > > +config DRM_XE_JOB_TIMEOUT_MAX
> > > >> > > > +       int "Default max job timeout (ms)"
> > > >> > > > +       default 10000 # milliseconds
> > > >> > > > +       help
> > > >> > > > +         Configures the default max job timeout after which job will
> > > >> > > > +         be forcefully taken away from scheduler.
> > > >> > > > +config DRM_XE_JOB_TIMEOUT_MIN
> > > >> > > > +       int "Default max job timeout (ms)"
> > > >> > > > +       default 1 # milliseconds
> > > >> > > > +       help
> > > >> > > > +         Configures the default min job timeout after which job will
> > > >> > > > +         be forcefully taken away from scheduler.
> > > >> > > > +config DRM_XE_TIMESLICE_MAX
> > > >> > > > +       int "Default max timeslice duration (us)"
> > > >> > > > +       default 10000000 # microseconds
> > > >> > > > +       help
> > > >> > > > +         Configures the default max timeslice duration
> > > >> > > > +between
> > > multiple
> > > >> > > > +         contexts by guc scheduling.
> > > >> > > > +config DRM_XE_TIMESLICE_MIN
> > > >> > > > +       int "Default min timeslice duration (us)"
> > > >> > > > +       default 1 # microseconds
> > > >> > > > +       help
> > > >> > > > +         Configures the default min timeslice duration
> > > >> > > > +between
> > > multiple
> > > >> > > > +         contexts by guc scheduling.
> > > >> > > > +config DRM_XE_PREEMPT_TIMEOUT_MAX
> > > >> > > > +       int "Default max  preempt timeout (us)"
> > > >> > > > +       default 10000000 # microseconds
> > > >> > > > +       help
> > > >> > > > +         Configures the default max preempt timeout after
> > > >> > > > +which
> > > context
> > > >> > > > +         will be forcefully taken away and higher priority context
> will
> > > >> > > > +         run.
> > > >> > > > +config DRM_XE_PREEMPT_TIMEOUT_MIN
> > > >> > > > +       int "Default min  preempt timeout (us)"
> > > >> > > > +       default 1 # microseconds
> > > >> > > > +       help
> > > >> > > > +         Configures the default min preempt timeout after
> > > >> > > > +which
> > > context
> > > >> > > > +         will be forcefully taken away and higher priority context
> will
> > > >> > > > +         run.
> > > >> > > > +config DRM_XE_ENABLE_SCHEDTIMEOUT_LIMIT
> > > >> > > > +       bool "Default configuration of limitation on scheduler
> timeout"
> > > >> > > > +       default y
> > > >> > > > +       help
> > > >> > > > +	 Configures the enablement of limitation on scheduler
> > > timeout
> > > >> > > > +	 to apply to applicable user. For elevated user, all above MIN
> > > >> > > > +	 and MAX values will apply when this configuration is
> > > >> > > > +enable
> > > to
> > > >> > > > +	 apply limitation. By default limitation is applied.
> > > >> > > > diff --git a/drivers/gpu/drm/xe/xe_engine.c
> > > >> > > > b/drivers/gpu/drm/xe/xe_engine.c index
> > > >> > > > 9e167b113963..d934196eb79f
> > > >> > > > 100644
> > > >> > > > --- a/drivers/gpu/drm/xe/xe_engine.c
> > > >> > > > +++ b/drivers/gpu/drm/xe/xe_engine.c
> > > >> > > > @@ -13,6 +13,7 @@
> > > >> > > >
> > > >> > > >  #include "xe_device.h"
> > > >> > > >  #include "xe_gt.h"
> > > >> > > > +#include "xe_hw_engine_class_sysfs.h"
> > > >> > > >  #include "xe_hw_fence.h"
> > > >> > > >  #include "xe_lrc.h"
> > > >> > > >  #include "xe_macros.h"
> > > >> > > > @@ -191,8 +192,12 @@ static int engine_set_priority(struct
> > > >> > > > xe_device *xe, struct xe_engine *e,  static int
> > > >> engine_set_timeslice(struct xe_device *xe, struct xe_engine *e,
> > > >> > > >  				u64 value, bool create)  {
> > > >> > > > -	if (!capable(CAP_SYS_NICE))
> > > >> > > > -		return -EPERM;
> > > >> > > > +	u32 min = e->hwe->eclass->sched_props.timeslice_min;
> > > >> > > > +	u32 max = e->hwe->eclass->sched_props.timeslice_max;
> > > >> > >
> > > >> > > So I screwed this up in my last comment, sorry.
> > > >> > >
> > > >> > > min = cap_nice ? KConfig option for min :
> > > >> > > e->hwe->eclass->sched_props.timeslice_min;
> > > >> > > same logic for max;
> > > >> > >
> > > >> > > Probably add helper for this.
> > > >> > >
> > > >> > > > +
> > > >> > > > +	if (enforce_schedule_limit() &&
> > > >> > > > +	    !engine_timeout_in_range(value, min, max))
> > > >> > >
> > > >> > > Then I think logic works too...
> > > >> > >
> > > >> > > if cap nice && !Kconfig option to enfore limits
> > > >> > > (enforce_schedule_limit
> > > >> returns false):
> > > >> > > 	user can do whatever
> > > >> > > else if cap nice
> > > >> > > 	user within Kconfig range
> > > >> > > else
> > > >> > > 	user within sysfs range
> > > >> > >
> > > >> > > This is what we want in the end.
> > > >> > >
> > > >> >
> > > >> > Matt, I think this is exactly what the previous revision of the
> > > >> > patch was
> > > >> doing.
> > > >> >
> > > >>
> > > >> No... Previous version
> > > >>
> > > >> min = Kconfig option to enfore limits ? KConfig option for min :
> > > >> e->hwe-
> > > >> >eclass->sched_props.timeslice_min
> > > >> same for max
> > > >>
> > > >> Results in:
> > > >>
> > > >> if cap nice && !Kconfig option to enfore limits
> > > >> (enforce_schedule_limit returns false):
> > > >> 	user can do whatever
> > > >> else if cap_nice || Kconfig option to enfore limit
> > > >> 	user within Kconfig range
> > > >> else
> > > >>  	user within sysfs range
> > > >>
> > > >> !cap_nice && Kconfig option to enfore limits == user within
> > > >> Kconfig range
> > > >> (previously) !cap_nice && Kconfig option to enfore limits == user
> > > >> within sysfs range (my suggestion)
> > > >
> > > >In previous version we can achieve it by just adding one below check
> right?
> > > >#if IS_ENABLED(CONFIG_DRM_XE_ENABLE_SCHEDTIMEOUT_LIMIT) &&
> > > cap_nice
> > > >+       u32 min = XE_HW_ENGINE_TIMESLICE_MIN;
> > > >+       u32 max = XE_HW_ENGINE_TIMESLICE_MAX; #else
> > > >+       u32 min = e->hwe->eclass->sched_props.timeslice_min;
> > > >+       u32 max = e->hwe->eclass->sched_props.timeslice_max;
> > > >+#endif
> > > >
> > > >Please let me know!
> > > >
> > >
> > > Ah I see. Yah, it is a limits selection issue.
> > > We can do,
> > >
> > > u32 min = e->hwe->eclass->sched_props.timeslice_min;
> > > u32 max = e->hwe->eclass->sched_props.timeslice_max;
> > >
> > > #if IS_ENABLED(CONFIG_DRM_XE_ENABLE_SCHEDTIMEOUT_LIMIT)
> > >          if (cap_nice) {
> > >                  u32 min = XE_HW_ENGINE_TIMESLICE_MIN;
> > >                  u32 max = XE_HW_ENGINE_TIMESLICE_MAX;
> > >          }
> > > #endif
> > >
> > > Matt, Tejas
> > > Also, looks like you missed my another comment below.
> > >
> > > Niranjana
> > >
> > > >>
> > > >> The logic is different and I believe we want what I'm suggesting.
> > > >>
> > > >> Matt
> > > >>
> > > >> > > > +		return -EINVAL;
> > > >> > > >
> > > >> > > >  	return e->ops->set_timeslice(e, value);  } @@ -201,8
> > > >> > > > +206,12 @@ static int engine_set_preemption_timeout(struct
> xe_device *xe,
> > > >> > > >  					 struct xe_engine *e, u64
> > > value,
> > > >> > > >  					 bool create)
> > > >> > > >  {
> > > >> > > > -	if (!capable(CAP_SYS_NICE))
> > > >> > > > -		return -EPERM;
> > > >> > > > +	u32 min = e->hwe->eclass-
> > > >sched_props.preempt_timeout_min;
> > > >> > > > +	u32 max = e->hwe->eclass-
> > > >sched_props.preempt_timeout_max;
> > > >> > > > +
> > > >> > > > +	if (enforce_schedule_limit() &&
> > > >> > > > +	    !engine_timeout_in_range(value, min, max))
> > > >> > > > +		return -EINVAL;
> > > >> > > >
> > > >> > > >  	return e->ops->set_preempt_timeout(e, value);  } @@ -
> > > 266,11
> > > >> > > > +275,15 @@ static int engine_set_persistence(struct
> > > >> > > > +xe_device *xe,
> > > >> > > > struct xe_engine *e,  static int
> > > >> > > > engine_set_job_timeout(struct xe_device
> > > >> *xe, struct xe_engine *e,
> > > >> > > >  				  u64 value, bool create)  {
> > > >> > > > +	u32 min = e->hwe->eclass->sched_props.job_timeout_min;
> > > >> > > > +	u32 max = e->hwe->eclass->sched_props.job_timeout_max;
> > > >> > > > +
> > > >> > > >  	if (XE_IOCTL_DBG(xe, !create))
> > > >> > > >  		return -EINVAL;
> > > >> > > >
> > > >> > > > -	if (!capable(CAP_SYS_NICE))
> > > >> > > > -		return -EPERM;
> > > >> > > > +	if (enforce_schedule_limit() &&
> > > >> > > > +	    !engine_timeout_in_range(value, min, max))
> > > >> > > > +		return -EINVAL;
> > > >> > > >
> > > >> > > >  	return e->ops->set_job_timeout(e, value);  } diff --git
> > > >> > > > a/drivers/gpu/drm/xe/xe_hw_engine.c
> > > >> > > > b/drivers/gpu/drm/xe/xe_hw_engine.c
> > > >> > > > index afa7d25c3852..e601bffe3b13 100644
> > > >> > > > --- a/drivers/gpu/drm/xe/xe_hw_engine.c
> > > >> > > > +++ b/drivers/gpu/drm/xe/xe_hw_engine.c
> > > >> > > > @@ -364,8 +364,16 @@ static void
> > > >> > > > hw_engine_init_early(struct xe_gt *gt, struct xe_hw_engine
> > > >> > > > *hwe,
> > > >> > > >
> > > >> > > >  	if (!gt->eclass[hwe->class].sched_props.job_timeout_ms) {
> > > >> > > >  		gt->eclass[hwe->class].sched_props.job_timeout_ms
> > > = HZ *
> > > >> 5;
> > > >> > > > +		gt->eclass[hwe-
> > > >class].sched_props.job_timeout_min =
> > > >> XE_HW_ENGINE_JOB_TIMEOUT_MIN;
> > > >> > > > +		gt->eclass[hwe-
> > > >class].sched_props.job_timeout_max =
> > > >> > > > +XE_HW_ENGINE_JOB_TIMEOUT_MAX;
> > > >> > > >  		gt->eclass[hwe->class].sched_props.timeslice_us = 1
> > > * 1000;
> > > >> > > > +		gt->eclass[hwe->class].sched_props.timeslice_min =
> > > >> XE_HW_ENGINE_TIMESLICE_MIN;
> > > >> > > > +		gt->eclass[hwe->class].sched_props.timeslice_max =
> > > >> > > > +XE_HW_ENGINE_TIMESLICE_MAX;
> > > >> > > >  		gt->eclass[hwe-
> > > >class].sched_props.preempt_timeout_us =
> > > >> 640 *
> > > >> > > > 1000;
> > > >> > > > +		gt->eclass[hwe-
> > > >class].sched_props.preempt_timeout_min =
> > > >> > > > +
> > > >> 	XE_HW_ENGINE_PREEMPT_TIMEOUT_MIN;
> > > >> > > > +		gt->eclass[hwe-
> > > >class].sched_props.preempt_timeout_max =
> > > >> > > > +
> > > >> 	XE_HW_ENGINE_PREEMPT_TIMEOUT_MAX;
> > > >> > > >  		/* Record default props */
> > > >> > > >  		gt->eclass[hwe->class].defaults = gt->eclass[hwe-
> > > >> >class].sched_props;
> > > >> > > >  	}
> > > >> > > > diff --git a/drivers/gpu/drm/xe/xe_hw_engine.h
> > > >> > > > b/drivers/gpu/drm/xe/xe_hw_engine.h
> > > >> > > > index 7eca9d53c7b1..3d37d6d44261 100644
> > > >> > > > --- a/drivers/gpu/drm/xe/xe_hw_engine.h
> > > >> > > > +++ b/drivers/gpu/drm/xe/xe_hw_engine.h
> > > >> > > > @@ -10,6 +10,37 @@
> > > >> > > >
> > > >> > > >  struct drm_printer;
> > > >> > > >
> > > >> > > > +#ifdef CONFIG_DRM_XE_JOB_TIMEOUT_MIN #define
> > > >> > > > +XE_HW_ENGINE_JOB_TIMEOUT_MIN
> > > >> CONFIG_DRM_XE_JOB_TIMEOUT_MIN #else
> > > >> > > > +#define XE_HW_ENGINE_JOB_TIMEOUT_MIN 1 #endif #ifdef
> > > >> > > > +CONFIG_DRM_XE_JOB_TIMEOUT_MAX #define
> > > >> > > > +XE_HW_ENGINE_JOB_TIMEOUT_MAX
> > > >> CONFIG_DRM_XE_JOB_TIMEOUT_MAX #else
> > > >> > > > +#define XE_HW_ENGINE_JOB_TIMEOUT_MAX (10 * 1000)
> #endif
> > > #ifdef
> > > >> > > > +CONFIG_DRM_XE_TIMESLICE_MIN #define
> > > >> XE_HW_ENGINE_TIMESLICE_MIN
> > > >> > > > +CONFIG_DRM_XE_TIMESLICE_MIN #else #define
> > > >> > > > +XE_HW_ENGINE_TIMESLICE_MIN 1 #endif #ifdef
> > > >> > > > +CONFIG_DRM_XE_TIMESLICE_MAX #define
> > > >> XE_HW_ENGINE_TIMESLICE_MAX
> > > >> > > > +CONFIG_DRM_XE_TIMESLICE_MAX #else #define
> > > >> > > > +XE_HW_ENGINE_TIMESLICE_MAX (10 * 1000 * 1000) #endif
> > > >> > > > +#ifdef CONFIG_DRM_XE_PREEMPT_TIMEOUT_MIN #define
> > > >> > > > +XE_HW_ENGINE_PREEMPT_TIMEOUT_MIN
> > > >> > > > +CONFIG_DRM_XE_PREEMPT_TIMEOUT_MIN #else #define
> > > >> > > > +XE_HW_ENGINE_PREEMPT_TIMEOUT_MIN 1 #endif #ifdef
> > > >> > > > +CONFIG_DRM_XE_PREEMPT_TIMEOUT_MAX
> > > >> > > > +#define XE_HW_ENGINE_PREEMPT_TIMEOUT_MAX
> > > >> > > > +CONFIG_DRM_XE_PREEMPT_TIMEOUT_MAX #else #define
> > > >> > > > +XE_HW_ENGINE_PREEMPT_TIMEOUT_MAX (10 * 1000 * 1000)
> > > #endif
> > > >> > > > +
> > > >> > > >  int xe_hw_engines_init_early(struct xe_gt *gt);  int
> > > >> > > > xe_hw_engines_init(struct xe_gt *gt);  void
> > > >> > > > xe_hw_engine_handle_irq(struct xe_hw_engine *hwe, u16
> > > >> > > > intr_vec); diff --git
> > > >> > > > a/drivers/gpu/drm/xe/xe_hw_engine_class_sysfs.c
> > > >> > > > b/drivers/gpu/drm/xe/xe_hw_engine_class_sysfs.c
> > > >> > > > index 990bb675d1e0..2b7ac4e02db6 100644
> > > >> > > > --- a/drivers/gpu/drm/xe/xe_hw_engine_class_sysfs.c
> > > >> > > > +++ b/drivers/gpu/drm/xe/xe_hw_engine_class_sysfs.c
> > > >> > > > @@ -11,6 +11,20 @@
> > > >> > > >
> > > >> > > >  static int xe_add_hw_engine_class_defaults(struct kobject
> > > >> > > > *parent);
> > > >> > > >
> > > >> > > > +bool enforce_schedule_limit(void) { #if
> > > >> > > > +IS_ENABLED(CONFIG_DRM_XE_ENABLE_SCHEDTIMEOUT_LIMIT)
> > > >> > > > +	return true;
> > > >> > > > +#else
> > > >> > > > +	return !capable(CAP_SYS_NICE); #endif }
> > > >> > > > +
> > > >> > > > +bool engine_timeout_in_range(u64 timeout, u64 min, u64 max)
> {
> > > >> > > > +	return timeout >= min && timeout <= max; }
> > > >> > > > +
> > > >> > > >  static void kobj_xe_hw_engine_release(struct kobject *kobj)  {
> > > >> > > >  	kfree(kobj);
> > > >> > > > @@ -39,11 +53,92 @@ kobj_xe_hw_engine_class(struct kobject
> > > >> *parent, char *name)
> > > >> > > >  	return keclass;
> > > >> > > >  }
> > > >> > > >
> > > >> > > > +static ssize_t job_timeout_max_store(struct kobject *kobj,
> > > >> > > > +				     struct kobj_attribute *attr,
> > > >> > > > +				     const char *buf, size_t count) {
> > > >> > > > +	struct xe_hw_engine_class_intf *eclass =
> > > kobj_to_eclass(kobj);
> > > >> > > > +	u32 timeout;
> > > >> > > > +	int err;
> > > >> > > > +
> > > >> > > > +	err = kstrtou32(buf, 0, &timeout);
> > > >> > > > +	if (err)
> > > >> > > > +		return err;
> > > >> > > > +
> > > >> > > > +	if (timeout < eclass->sched_props.job_timeout_min)
> > > >> > > > +		return -EINVAL;
> > > >> > > > +
> > > >> > > > +	if (enforce_schedule_limit() &&
> > > >> > > > +	    !engine_timeout_in_range(timeout,
> > > >> > > > +
> > > XE_HW_ENGINE_JOB_TIMEOUT_MIN,
> > > >> > > > +
> > > XE_HW_ENGINE_JOB_TIMEOUT_MAX))
> > > >> > > > +		return -EINVAL;
> > > >> > > > +
> > > >> > > > +	WRITE_ONCE(eclass->sched_props.job_timeout_max,
> > > timeout);
> > > >> > > > +
> > > >> > > > +	return count;
> > > >> > > > +}
> > > >> > > > +
> > > >> > > > +static ssize_t job_timeout_max_show(struct kobject *kobj,
> > > >> > > > +				    struct kobj_attribute *attr, char
> > > *buf) {
> > > >> > > > +	struct xe_hw_engine_class_intf *eclass =
> > > >> > > > +kobj_to_eclass(kobj);
> > > >> > > > +
> > > >> > > > +	return sprintf(buf, "%u\n",
> > > >> > > > +eclass->sched_props.job_timeout_max);
> > > >> > > > +}
> > > >> > > > +
> > > >> > > > +static struct kobj_attribute job_timeout_max_attr =
> > > >> > > > +__ATTR(job_timeout_max, 0644, job_timeout_max_show,
> > > >> > > > +job_timeout_max_store);
> > > >> > > > +
> > > >> > > > +static ssize_t job_timeout_min_store(struct kobject *kobj,
> > > >> > > > +				     struct kobj_attribute *attr,
> > > >> > > > +				     const char *buf, size_t count) {
> > > >> > > > +	struct xe_hw_engine_class_intf *eclass =
> > > kobj_to_eclass(kobj);
> > > >> > > > +	u32 timeout;
> > > >> > > > +	int err;
> > > >> > > > +
> > > >> > > > +	err = kstrtou32(buf, 0, &timeout);
> > > >> > > > +	if (err)
> > > >> > > > +		return err;
> > > >> > > > +
> > > >> > > > +	if (timeout > eclass->sched_props.job_timeout_max)
> > > >> > > > +		return -EINVAL;
> > > >> > > > +
> > > >> > > > +	if (enforce_schedule_limit() &&
> > > >> > > > +	    !engine_timeout_in_range(timeout,
> > > >> > > > +
> > > XE_HW_ENGINE_JOB_TIMEOUT_MIN,
> > > >> > > > +
> > > XE_HW_ENGINE_JOB_TIMEOUT_MAX))
> > > >> > > > +		return -EINVAL;
> > > >> > > > +
> > > >> > > > +	WRITE_ONCE(eclass->sched_props.job_timeout_min,
> > > timeout);
> > > >> > > > +
> > > >> > > > +	return count;
> > > >> > > > +}
> > > >> > > > +
> > > >> > > > +static ssize_t job_timeout_min_show(struct kobject *kobj,
> > > >> > > > +				    struct kobj_attribute *attr, char
> > > *buf) {
> > > >> > > > +	struct xe_hw_engine_class_intf *eclass =
> > > >> > > > +kobj_to_eclass(kobj);
> > > >> > > > +
> > > >> > > > +	return sprintf(buf, "%u\n",
> > > >> > > > +eclass->sched_props.job_timeout_min);
> > > >> > > > +}
> > > >> > > > +
> > > >> > > > +static struct kobj_attribute job_timeout_min_attr =
> > > >> > > > +__ATTR(job_timeout_min, 0644, job_timeout_min_show,
> > > >> > > > +job_timeout_min_store);
> > > >> > > > +
> > > >> > > >  static ssize_t job_timeout_store(struct kobject *kobj,
> > > >> > > >  				 struct kobj_attribute *attr,
> > > >> > > >  				 const char *buf, size_t count)  {
> > > >> > > >  	struct xe_hw_engine_class_intf *eclass =
> > > >> > > > kobj_to_eclass(kobj);
> > > >> > > > +#if
> IS_ENABLED(CONFIG_DRM_XE_ENABLE_SCHEDTIMEOUT_LIMIT)
> > > >> > > > +	u32 min = XE_HW_ENGINE_JOB_TIMEOUT_MIN;
> > > >> > > > +	u32 max = XE_HW_ENGINE_JOB_TIMEOUT_MAX; #else
> > > >> > > > +	u32 min = e->hwe->eclass->sched_props.job_timeout_min;
> > > >> > > > +	u32 max = e->hwe->eclass->sched_props.job_timeout_max;
> > > >> > > > +#endif
> > > >> > >
> > > >> > > I don't think we need this, just make sure default is within
> > > >> > > min / max of the sched_props.
> > > >> > >
> > > >> >
> > > >> > Shouldn't the sched_prop set through sysfs here which applies
> > > >> > to all future user engines (xe_engine) has the same requirement
> > > >> > as the sched_prop set directly to user engine (xe_engine)
> > > >> > through set_properly
> > > >> ioctl?
> > > >> > ie., shoudln't the requirement be same in job_timeout_store()
> > > >> > and engine_set_job_timeout()?
> >
> > I also think it should apply same to sysfs calls as well. Unless we think sysfs
> should limit to compile configs only. Since sysfs min/max cab be changed.
> >
> 
> Disagree, the min / max sysfs entries are subject to the Kconfig limits.
> So if you check the sysfs entry min / max here, the initial value will always be
> within the Kconfig limits plus any additional restrictions a user has imposed.

So limit to sysfs min/max always irrespective of elevated user or not, right? 

Thanks,
Tejas
> 
> Matt
> 
> > Thanks,
> > Tejas
> >
> > > >> >
> > > >> > Niranjana
> > > >> >
> > > >> > > Matt
> > > >> > >
> > > >> > > >  	u32 timeout;
> > > >> > > >  	int err;
> > > >> > > >
> > > >> > > > @@ -51,6 +146,10 @@ static ssize_t job_timeout_store(struct
> > > >> > > > kobject
> > > >> *kobj,
> > > >> > > >  	if (err)
> > > >> > > >  		return err;
> > > >> > > >
> > > >> > > > +	if (enforce_schedule_limit() &&
> > > >> > > > +	    !engine_timeout_in_range(timeout, min, max))
> > > >> > > > +		return -EINVAL;
> > > >> > > > +
> > > >> > > >  	WRITE_ONCE(eclass->sched_props.job_timeout_ms,
> > > timeout);
> > > >> > > >
> > > >> > > >  	return count;
> > > >> > > > @@ -78,11 +177,40 @@ static ssize_t
> > > >> > > > job_timeout_default(struct kobject *kobj,  static struct
> > > >> > > > kobj_attribute job_timeout_def = __ATTR(job_timeout_ms,
> > > >> > > > 0444, job_timeout_default, NULL);
> > > >> > > >
> > > >> > > > +static ssize_t job_timeout_min_default(struct kobject *kobj,
> > > >> > > > +				       struct kobj_attribute *attr, char
> > > *buf) {
> > > >> > > > +	struct xe_hw_engine_class_intf *eclass =
> > > >> > > > +kobj_to_eclass(kobj->parent);
> > > >> > > > +
> > > >> > > > +	return sprintf(buf, "%u\n",
> > > >> > > > +eclass->defaults.job_timeout_min);
> > > >> > > > +}
> > > >> > > > +
> > > >> > > > +static struct kobj_attribute job_timeout_min_def =
> > > >> > > > +__ATTR(job_timeout_min, 0444, job_timeout_min_default,
> > > >> > > > +NULL);
> > > >> > > > +
> > > >> > > > +static ssize_t job_timeout_max_default(struct kobject *kobj,
> > > >> > > > +				       struct kobj_attribute *attr, char
> > > *buf) {
> > > >> > > > +	struct xe_hw_engine_class_intf *eclass =
> > > >> > > > +kobj_to_eclass(kobj->parent);
> > > >> > > > +
> > > >> > > > +	return sprintf(buf, "%u\n",
> > > >> > > > +eclass->defaults.job_timeout_max);
> > > >> > > > +}
> > > >> > > > +
> > > >> > > > +static struct kobj_attribute job_timeout_max_def =
> > > >> > > > +__ATTR(job_timeout_max, 0444, job_timeout_max_default,
> > > >> > > > +NULL);
> > > >> > > > +
> > > >> > > >  static ssize_t timeslice_duration_store(struct kobject *kobj,
> > > >> > > >  					struct kobj_attribute *attr,
> > > >> > > >  					const char *buf, size_t count)
> > > {
> > > >> > > >  	struct xe_hw_engine_class_intf *eclass =
> > > >> > > > kobj_to_eclass(kobj);
> > > >> > > > +#if
> IS_ENABLED(CONFIG_DRM_XE_ENABLE_SCHEDTIMEOUT_LIMIT)
> > > >> > > > +	u32 min = XE_HW_ENGINE_TIMESLICE_MIN;
> > > >> > > > +	u32 max = XE_HW_ENGINE_TIMESLICE_MAX; #else
> > > >> > > > +	u32 min = e->hwe->eclass->sched_props.timeslice_min;
> > > >> > > > +	u32 max = e->hwe->eclass->sched_props.timeslice_max;
> > > >> > > > +#endif
> > > >> > > >  	u32 duration;
> > > >> > > >  	int err;
> > > >> > > >
> > > >> > > > @@ -90,11 +218,92 @@ static ssize_t
> > > >> > > > timeslice_duration_store(struct
> > > >> kobject *kobj,
> > > >> > > >  	if (err)
> > > >> > > >  		return err;
> > > >> > > >
> > > >> > > > +	if (enforce_schedule_limit() &&
> > > >> > > > +	    !engine_timeout_in_range(duration, min, max))
> > > >> > > > +		return -EINVAL;
> > > >> > > > +
> > > >> > > >  	WRITE_ONCE(eclass->sched_props.timeslice_us, duration);
> > > >> > > >
> > > >> > > >  	return count;
> > > >> > > >  }
> > > >> > > >
> > > >> > > > +static ssize_t timeslice_duration_max_store(struct kobject
> *kobj,
> > > >> > > > +					    struct kobj_attribute *attr,
> > > >> > > > +					    const char *buf, size_t
> > > count) {
> > > >> > > > +	struct xe_hw_engine_class_intf *eclass =
> > > kobj_to_eclass(kobj);
> > > >> > > > +	u32 duration;
> > > >> > > > +	int err;
> > > >> > > > +
> > > >> > > > +	err = kstrtou32(buf, 0, &duration);
> > > >> > > > +	if (err)
> > > >> > > > +		return err;
> > > >> > > > +
> > > >> > > > +	if (duration < eclass->sched_props.timeslice_min)
> > > >> > > > +		return -EINVAL;
> > > >> > > > +
> > > >> > > > +	if (enforce_schedule_limit() &&
> > > >> > > > +	    !engine_timeout_in_range(duration,
> > > >> > > > +				     XE_HW_ENGINE_TIMESLICE_MIN,
> > > >> > > > +
> > > XE_HW_ENGINE_TIMESLICE_MAX))
> > > >> > > > +		return -EINVAL;
> > > >> > > > +
> > > >> > > > +	WRITE_ONCE(eclass->sched_props.timeslice_max, duration);
> > > >> > > > +
> > > >> > > > +	return count;
> > > >> > > > +}
> > > >> > > > +
> > > >> > > > +static ssize_t timeslice_duration_max_show(struct kobject
> *kobj,
> > > >> > > > +					   struct kobj_attribute *attr,
> > > >> > > > +					   char *buf)
> > > >> > > > +{
> > > >> > > > +	struct xe_hw_engine_class_intf *eclass =
> > > >> > > > +kobj_to_eclass(kobj);
> > > >> > > > +
> > > >> > > > +	return sprintf(buf, "%u\n",
> > > >> > > > +eclass->sched_props.timeslice_max);
> > > >> > > > +}
> > > >> > > > +
> > > >> > > > +static struct kobj_attribute timeslice_duration_max_attr =
> > > >> > > > +	__ATTR(timeslice_duration_max, 0644,
> > > >> timeslice_duration_max_show,
> > > >> > > > +	       timeslice_duration_max_store);
> > > >> > > > +
> > > >> > > > +static ssize_t timeslice_duration_min_store(struct kobject *kobj,
> > > >> > > > +					    struct kobj_attribute *attr,
> > > >> > > > +					    const char *buf, size_t
> > > count) {
> > > >> > > > +	struct xe_hw_engine_class_intf *eclass =
> > > kobj_to_eclass(kobj);
> > > >> > > > +	u32 duration;
> > > >> > > > +	int err;
> > > >> > > > +
> > > >> > > > +	err = kstrtou32(buf, 0, &duration);
> > > >> > > > +	if (err)
> > > >> > > > +		return err;
> > > >> > > > +
> > > >> > > > +	if (duration > eclass->sched_props.timeslice_max)
> > > >> > > > +		return -EINVAL;
> > > >> > > > +
> > > >> > > > +	if (enforce_schedule_limit() &&
> > > >> > > > +	    !engine_timeout_in_range(duration,
> > > >> > > > +				     XE_HW_ENGINE_TIMESLICE_MIN,
> > > >> > > > +
> > > XE_HW_ENGINE_TIMESLICE_MAX))
> > > >> > > > +		return -EINVAL;
> > > >> > > > +
> > > >> > > > +	WRITE_ONCE(eclass->sched_props.timeslice_min, duration);
> > > >> > > > +
> > > >> > > > +	return count;
> > > >> > > > +}
> > > >> > > > +
> > > >> > > > +static ssize_t timeslice_duration_min_show(struct kobject *kobj,
> > > >> > > > +					   struct kobj_attribute *attr,
> > > char
> > > >> *buf) {
> > > >> > > > +	struct xe_hw_engine_class_intf *eclass =
> > > >> > > > +kobj_to_eclass(kobj);
> > > >> > > > +
> > > >> > > > +	return sprintf(buf, "%u\n",
> > > >> > > > +eclass->sched_props.timeslice_min);
> > > >> > > > +}
> > > >> > > > +
> > > >> > > > +static struct kobj_attribute timeslice_duration_min_attr =
> > > >> > > > +	__ATTR(timeslice_duration_min, 0644,
> > > >> timeslice_duration_min_show,
> > > >> > > > +	       timeslice_duration_min_store);
> > > >> > > > +
> > > >> > > >  static ssize_t timeslice_duration_show(struct kobject *kobj,
> > > >> > > >  		struct kobj_attribute *attr, char *buf)  { @@ -118,11
> > > >> > > > +327,40 @@ static ssize_t timeslice_default(struct kobject
> > > >> > > > *kobj,  static struct kobj_attribute timeslice_duration_def
> > > >> > > > = __ATTR(timeslice_duration_us, 0444, timeslice_default,
> > > >> > > > NULL);
> > > >> > > >
> > > >> > > > +static ssize_t timeslice_min_default(struct kobject *kobj,
> > > >> > > > +				     struct kobj_attribute *attr, char
> > > *buf) {
> > > >> > > > +	struct xe_hw_engine_class_intf *eclass =
> > > >> > > > +kobj_to_eclass(kobj->parent);
> > > >> > > > +
> > > >> > > > +	return sprintf(buf, "%u\n",
> > > >> > > > +eclass->defaults.timeslice_min); }
> > > >> > > > +
> > > >> > > > +static struct kobj_attribute timeslice_duration_min_def =
> > > >> > > > +__ATTR(timeslice_duration_min, 0444,
> > > >> > > > +timeslice_min_default, NULL);
> > > >> > > > +
> > > >> > > > +static ssize_t timeslice_max_default(struct kobject *kobj,
> > > >> > > > +				     struct kobj_attribute *attr, char
> > > *buf) {
> > > >> > > > +	struct xe_hw_engine_class_intf *eclass =
> > > >> > > > +kobj_to_eclass(kobj->parent);
> > > >> > > > +
> > > >> > > > +	return sprintf(buf, "%u\n",
> > > >> > > > +eclass->defaults.timeslice_max); }
> > > >> > > > +
> > > >> > > > +static struct kobj_attribute timeslice_duration_max_def =
> > > >> > > > +__ATTR(timeslice_duration_max, 0444,
> > > >> > > > +timeslice_max_default, NULL);
> > > >> > > > +
> > > >> > > >  static ssize_t preempt_timeout_store(struct kobject *kobj,
> > > >> > > >  				     struct kobj_attribute *attr,
> > > >> > > >  				     const char *buf, size_t count)  {
> > > >> > > >  	struct xe_hw_engine_class_intf *eclass =
> > > >> > > > kobj_to_eclass(kobj);
> > > >> > > > +#if
> IS_ENABLED(CONFIG_DRM_XE_ENABLE_SCHEDTIMEOUT_LIMIT)
> > > >> > > > +	u32 min = XE_HW_ENGINE_PREEMPT_TIMEOUT_MIN;
> > > >> > > > +	u32 max = XE_HW_ENGINE_PREEMPT_TIMEOUT_MAX; #else
> > > >> > > > +	u32 min = e->hwe->eclass-
> > > >sched_props.preempt_timeout_min;
> > > >> > > > +	u32 max = e->hwe->eclass-
> > > >sched_props.preempt_timeout_max;
> > > >> > > > +#endif
> > > >> > > >  	u32 timeout;
> > > >> > > >  	int err;
> > > >> > > >
> > > >> > > > @@ -130,6 +368,10 @@ static ssize_t
> > > >> > > > preempt_timeout_store(struct
> > > >> kobject *kobj,
> > > >> > > >  	if (err)
> > > >> > > >  		return err;
> > > >> > > >
> > > >> > > > +	if (enforce_schedule_limit() &&
> > > >> > > > +	    !engine_timeout_in_range(timeout, min, max))
> > > >> > > > +		return -EINVAL;
> > > >> > > > +
> > > >> > > >  	WRITE_ONCE(eclass->sched_props.preempt_timeout_us,
> > > timeout);
> > > >> > > >
> > > >> > > >  	return count;
> > > >> > > > @@ -158,17 +400,129 @@ static ssize_t
> > > >> > > > preempt_timeout_default(struct kobject *kobj,  static
> > > >> > > > struct kobj_attribute preempt_timeout_def =
> > > >> > > > __ATTR(preempt_timeout_us, 0444, preempt_timeout_default,
> > > >> > > > NULL);
> > > >> > > >
> > > >> > > > +static ssize_t preempt_timeout_min_default(struct kobject
> *kobj,
> > > >> > > > +					   struct kobj_attribute *attr,
> > > >> > > > +					   char *buf)
> > > >> > > > +{
> > > >> > > > +	struct xe_hw_engine_class_intf *eclass =
> > > >> > > > +kobj_to_eclass(kobj->parent);
> > > >> > > > +
> > > >> > > > +	return sprintf(buf, "%u\n",
> > > >> > > > +eclass->defaults.preempt_timeout_min);
> > > >> > > > +}
> > > >> > > > +
> > > >> > > > +static struct kobj_attribute preempt_timeout_min_def =
> > > >> > > > +__ATTR(preempt_timeout_min, 0444,
> > > preempt_timeout_min_default,
> > > >> > > > +NULL);
> > > >> > > > +
> > > >> > > > +static ssize_t preempt_timeout_max_default(struct kobject
> *kobj,
> > > >> > > > +					   struct kobj_attribute *attr,
> > > >> > > > +					   char *buf)
> > > >> > > > +{
> > > >> > > > +	struct xe_hw_engine_class_intf *eclass =
> > > >> > > > +kobj_to_eclass(kobj->parent);
> > > >> > > > +
> > > >> > > > +	return sprintf(buf, "%u\n",
> > > >> > > > +eclass->defaults.preempt_timeout_max);
> > > >> > > > +}
> > > >> > > > +
> > > >> > > > +static struct kobj_attribute preempt_timeout_max_def =
> > > >> > > > +__ATTR(preempt_timeout_max, 0444,
> > > >> preempt_timeout_max_default,
> > > >> > > > +NULL);
> > > >> > > > +
> > > >> > > > +static ssize_t preempt_timeout_max_store(struct kobject *kobj,
> > > >> > > > +					 struct kobj_attribute *attr,
> > > >> > > > +					 const char *buf, size_t count)
> > > {
> > > >> > > > +	struct xe_hw_engine_class_intf *eclass =
> > > kobj_to_eclass(kobj);
> > > >> > > > +	u32 timeout;
> > > >> > > > +	int err;
> > > >> > > > +
> > > >> > > > +	err = kstrtou32(buf, 0, &timeout);
> > > >> > > > +	if (err)
> > > >> > > > +		return err;
> > > >> > > > +
> > > >> > > > +	if (timeout < eclass->sched_props.preempt_timeout_min)
> > > >> > > > +		return -EINVAL;
> > > >> > > > +
> > > >> > > > +	if (enforce_schedule_limit() &&
> > > >> > > > +	    !engine_timeout_in_range(timeout,
> > > >> > > > +
> > > >> XE_HW_ENGINE_PREEMPT_TIMEOUT_MIN,
> > > >> > > > +
> > > >> XE_HW_ENGINE_PREEMPT_TIMEOUT_MAX))
> > > >> > > > +		return -EINVAL;
> > > >> > > > +
> > > >> > > > +	WRITE_ONCE(eclass->sched_props.preempt_timeout_max,
> > > timeout);
> > > >> > > > +
> > > >> > > > +	return count;
> > > >> > > > +}
> > > >> > > > +
> > > >> > > > +static ssize_t preempt_timeout_max_show(struct kobject *kobj,
> > > >> > > > +					struct kobj_attribute *attr,
> > > char *buf)
> > > >> {
> > > >> > > > +	struct xe_hw_engine_class_intf *eclass =
> > > >> > > > +kobj_to_eclass(kobj);
> > > >> > > > +
> > > >> > > > +	return sprintf(buf, "%u\n",
> > > >> > > > +eclass->sched_props.preempt_timeout_max);
> > > >> > > > +}
> > > >> > > > +
> > > >> > > > +static struct kobj_attribute preempt_timeout_max_attr =
> > > >> > > > +	__ATTR(preempt_timeout_max, 0644,
> > > preempt_timeout_max_show,
> > > >> > > > +	       preempt_timeout_max_store);
> > > >> > > > +
> > > >> > > > +static ssize_t preempt_timeout_min_store(struct kobject *kobj,
> > > >> > > > +					 struct kobj_attribute *attr,
> > > >> > > > +					 const char *buf, size_t count)
> > > {
> > > >> > > > +	struct xe_hw_engine_class_intf *eclass =
> > > kobj_to_eclass(kobj);
> > > >> > > > +	u32 timeout;
> > > >> > > > +	int err;
> > > >> > > > +
> > > >> > > > +	err = kstrtou32(buf, 0, &timeout);
> > > >> > > > +	if (err)
> > > >> > > > +		return err;
> > > >> > > > +
> > > >> > > > +	if (timeout > eclass->sched_props.preempt_timeout_max)
> > > >> > > > +		return -EINVAL;
> > > >> > > > +
> > > >> > > > +	if (enforce_schedule_limit() &&
> > > >> > > > +	    !engine_timeout_in_range(timeout,
> > > >> > > > +
> > > >> XE_HW_ENGINE_PREEMPT_TIMEOUT_MIN,
> > > >> > > > +
> > > >> XE_HW_ENGINE_PREEMPT_TIMEOUT_MAX))
> > > >> > > > +		return -EINVAL;
> > > >> > > > +
> > > >> > > > +	WRITE_ONCE(eclass->sched_props.preempt_timeout_min,
> > > timeout);
> > > >> > > > +
> > > >> > > > +	return count;
> > > >> > > > +}
> > > >> > > > +
> > > >> > > > +static ssize_t preempt_timeout_min_show(struct kobject *kobj,
> > > >> > > > +					struct kobj_attribute *attr,
> > > char *buf)
> > > >> {
> > > >> > > > +	struct xe_hw_engine_class_intf *eclass =
> > > >> > > > +kobj_to_eclass(kobj);
> > > >> > > > +
> > > >> > > > +	return sprintf(buf, "%u\n",
> > > >> > > > +eclass->sched_props.preempt_timeout_min);
> > > >> > > > +}
> > > >> > > > +
> > > >> > > > +static struct kobj_attribute preempt_timeout_min_attr =
> > > >> > > > +	__ATTR(preempt_timeout_min, 0644,
> > > preempt_timeout_min_show,
> > > >> > > > +	       preempt_timeout_min_store);
> > > >> > > > +
> > > >> > > >  static const struct attribute *defaults[] = {
> > > >> > > >  	&job_timeout_def.attr,
> > > >> > > > +	&job_timeout_min_def.attr,
> > > >> > > > +	&job_timeout_max_def.attr,
> > > >> > > >  	&timeslice_duration_def.attr,
> > > >> > > > +	&timeslice_duration_min_def.attr,
> > > >> > > > +	&timeslice_duration_max_def.attr,
> > > >> > > >  	&preempt_timeout_def.attr,
> > > >> > > > +	&preempt_timeout_min_def.attr,
> > > >> > > > +	&preempt_timeout_max_def.attr,
> > > >> > > >  	NULL
> > > >> > > >  };
> > > >> > > >
> > > >> > > >  static const struct attribute *files[] = {
> > > >> > > >  	&job_timeout_attr.attr,
> > > >> > > > +	&job_timeout_min_attr.attr,
> > > >> > > > +	&job_timeout_max_attr.attr,
> > > >> > > >  	&timeslice_duration_attr.attr,
> > > >> > > > +	&timeslice_duration_min_attr.attr,
> > > >> > > > +	&timeslice_duration_max_attr.attr,
> > > >> > > >  	&preempt_timeout_attr.attr,
> > > >> > > > +	&preempt_timeout_min_attr.attr,
> > > >> > > > +	&preempt_timeout_max_attr.attr,
> > > >> > > >  	NULL
> > > >> > > >  };
> > > >> > > >
> > > >> > > > diff --git a/drivers/gpu/drm/xe/xe_hw_engine_class_sysfs.h
> > > >> > > > b/drivers/gpu/drm/xe/xe_hw_engine_class_sysfs.h
> > > >> > > > index 757136614672..2e2ab351a991 100644
> > > >> > > > --- a/drivers/gpu/drm/xe/xe_hw_engine_class_sysfs.h
> > > >> > > > +++ b/drivers/gpu/drm/xe/xe_hw_engine_class_sysfs.h
> > > >> > > > @@ -10,6 +10,8 @@
> > > >> > > >
> > > >> > > >  #define MAX_ENGINE_CLASS_NAME_LEN    16
> > > >> > > >  int xe_hw_engine_class_sysfs_init(struct xe_gt *gt);
> > > >> > > > +bool enforce_schedule_limit(void); bool
> > > >> > > > +engine_timeout_in_range(u64 timeout, u64 min, u64 max);
> > > >> > > >
> > > >> > > >  /**
> > > >> > > >   * struct kobj_eclass - A eclass's kobject struct that
> > > >> > > > connects the kobject and the
> > > >> > > > --
> > > >> > > > 2.25.1
> > > >> > > >

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

* Re: [Intel-xe] [PATCH V9 6/6] drm/xe: Add min/max cap for engine scheduler properties
  2023-07-28 14:27                 ` Upadhyay, Tejas
@ 2023-07-28 14:53                   ` Niranjana Vishwanathapura
  0 siblings, 0 replies; 30+ messages in thread
From: Niranjana Vishwanathapura @ 2023-07-28 14:53 UTC (permalink / raw)
  To: Upadhyay, Tejas; +Cc: intel-xe@lists.freedesktop.org

On Fri, Jul 28, 2023 at 07:27:35AM -0700, Upadhyay, Tejas wrote:
>
>
>> -----Original Message-----
>> From: Brost, Matthew <matthew.brost@intel.com>
>> Sent: Friday, July 28, 2023 7:54 PM
>> To: Upadhyay, Tejas <tejas.upadhyay@intel.com>
>> Cc: Vishwanathapura, Niranjana <niranjana.vishwanathapura@intel.com>;
>> intel-xe@lists.freedesktop.org
>> Subject: Re: [PATCH V9 6/6] drm/xe: Add min/max cap for engine scheduler
>> properties
>>
>> On Fri, Jul 28, 2023 at 01:36:29AM -0600, Upadhyay, Tejas wrote:
>> >
>> >
>> > > -----Original Message-----
>> > > From: Vishwanathapura, Niranjana
>> > > <niranjana.vishwanathapura@intel.com>
>> > > Sent: Friday, July 28, 2023 11:56 AM
>> > > To: Upadhyay, Tejas <tejas.upadhyay@intel.com>
>> > > Cc: Brost, Matthew <matthew.brost@intel.com>; intel-
>> > > xe@lists.freedesktop.org
>> > > Subject: Re: [PATCH V9 6/6] drm/xe: Add min/max cap for engine
>> > > scheduler properties
>> > >
>> > > On Thu, Jul 27, 2023 at 10:54:42PM -0700, Upadhyay, Tejas wrote:
>> > > >
>> > > >
>> > > >> -----Original Message-----
>> > > >> From: Brost, Matthew <matthew.brost@intel.com>
>> > > >> Sent: Friday, July 28, 2023 10:35 AM
>> > > >> To: Vishwanathapura, Niranjana
>> > > <niranjana.vishwanathapura@intel.com>
>> > > >> Cc: Upadhyay, Tejas <tejas.upadhyay@intel.com>; intel-
>> > > >> xe@lists.freedesktop.org
>> > > >> Subject: Re: [PATCH V9 6/6] drm/xe: Add min/max cap for engine
>> > > >> scheduler properties
>> > > >>
>> > > >> On Thu, Jul 27, 2023 at 09:44:23PM -0700, Niranjana
>> > > >> Vishwanathapura
>> > > >> wrote:
>> > > >> > On Thu, Jul 27, 2023 at 03:26:49PM +0000, Matthew Brost wrote:
>> > > >> > > On Thu, Jul 27, 2023 at 01:52:35PM +0530, Tejas Upadhyay wrote:
>> > > >> > > > Add sysfs entries for the min, max, and defaults for each
>> > > >> > > > of engine scheduler controls for every hardware engine class.
>> > > >> > > >
>> > > >> > > > Non-elevated user IOCTLs to set these controls must be
>> > > >> > > > within the min-max ranges of the sysfs entries, elevated
>> > > >> > > > user can set these controls to any value. However,
>> > > >> > > > introduced compile time CONFIG min-max values which
>> > > >> > > > restricts elevated user to be in compile time min-max range if at
>> all sysfs min/max are violated.
>> > > >> > > >
>> > > >> > > > Sysfs entries examples are, DUT# cat
>> > > /sys/class/drm/cardX/device/tileN/gtN/engines/ccs/.defaults/
>> > > >> > > > job_timeout_max         job_timeout_ms
>> preempt_timeout_min
>> > > >> timeslice_duration_max  timeslice_duration_us
>> > > >> > > > job_timeout_min         preempt_timeout_max
>> > > preempt_timeout_us
>> > > >> timeslice_duration_min
>> > > >> > > >
>> > > >> > > > DUT# cat /sys/class/drm/card1/device/tileN/gtN/engines/ccs/
>> > > >> > > > .defaults/              job_timeout_min         preempt_timeout_max
>> > > >> preempt_timeout_us      timeslice_duration_min
>> > > >> > > > job_timeout_max         job_timeout_ms
>> preempt_timeout_min
>> > > >> timeslice_duration_max  timeslice_duration_us
>> > > >> > > >
>> > > >> > > > V9 :
>> > > >> > > >    - Rebase to use s/xe_engine/xe_hw_engine/ - Matt
>> > > >> > > > V8 :
>> > > >> > > >    - fix enforce_sched_limit and avoid code duplication - Niranjana
>> > > >> > > >    - Make sure min < max - Niranjana
>> > > >> > > > V7 :
>> > > >> > > >    - Rebase to replace hw engine with eclass interface
>> > > >> > > >    - return EINVAL in place of EPERM
>> > > >> > > >    - Use some APIs to avoid code duplication
>> > > >> > > > V6 :
>> > > >> > > >    - Rebase changes to reflect per engine class props interface -
>> MattB
>> > > >> > > >    - Use #if ENABLED - MattB
>> > > >> > > >    - Remove MAX_SCHED_TIMEOUT check as range validation is
>> > > >> > > > enough
>> > > >> > > > V5 :
>> > > >> > > >    - Rebase to resolve conflicts - CI
>> > > >> > > > V4 :
>> > > >> > > >    - Rebase
>> > > >> > > >    - Update commit to reflect tile addition
>> > > >> > > >    - Use XE_HW macro directly as they are already filtered
>> > > >> > > >      for CONFIG checks - Niranjana
>> > > >> > > >    - Add CONFIG for enable/disable min/max limitation
>> > > >> > > >      on elevated user. Default is enable - Matt/Joonas
>> > > >> > > > V3 :
>> > > >> > > >    - Resolve CI hooks warning for kernel-doc
>> > > >> > > > V2 :
>> > > >> > > >    - Restric min/max setting to #define default min/max for
>> > > >> > > >      elevated user - Himal
>> > > >> > > >    - Remove unrelated changes from patch - Niranjana
>> > > >> > > >
>> > > >> > > > Signed-off-by: Tejas Upadhyay <tejas.upadhyay@intel.com>
>> > > >> > > > ---
>> > > >> > > >  drivers/gpu/drm/xe/Kconfig                    |   6 +
>> > > >> > > >  drivers/gpu/drm/xe/Kconfig.profile            |  46 +++
>> > > >> > > >  drivers/gpu/drm/xe/xe_engine.c                |  25 +-
>> > > >> > > >  drivers/gpu/drm/xe/xe_hw_engine.c             |   8 +
>> > > >> > > >  drivers/gpu/drm/xe/xe_hw_engine.h             |  31 ++
>> > > >> > > >  drivers/gpu/drm/xe/xe_hw_engine_class_sysfs.c | 354
>> > > >> ++++++++++++++++++
>> > > >> > > >  drivers/gpu/drm/xe/xe_hw_engine_class_sysfs.h |   2 +
>> > > >> > > >  7 files changed, 466 insertions(+), 6 deletions(-)  create
>> > > >> > > > mode
>> > > >> > > > 100644 drivers/gpu/drm/xe/Kconfig.profile
>> > > >> > > >
>> > > >> > > > diff --git a/drivers/gpu/drm/xe/Kconfig
>> > > >> > > > b/drivers/gpu/drm/xe/Kconfig index
>> > > >> > > > d44794f99338..0a4ea965645b
>> > > >> > > > 100644
>> > > >> > > > --- a/drivers/gpu/drm/xe/Kconfig
>> > > >> > > > +++ b/drivers/gpu/drm/xe/Kconfig
>> > > >> > > > @@ -83,3 +83,9 @@ depends on DRM_XE  depends on EXPERT
>> > > source
>> > > >> > > > "drivers/gpu/drm/xe/Kconfig.debug"
>> > > >> > > >  endmenu
>> > > >> > > > +
>> > > >> > > > +menu "drm/xe Profile Guided Optimisation"
>> > > >> > > > +	visible if EXPERT
>> > > >> > > > +	depends on DRM_XE
>> > > >> > > > +	source "drivers/gpu/drm/xe/Kconfig.profile"
>> > > >> > > > +endmenu
>> > > >> > > > diff --git a/drivers/gpu/drm/xe/Kconfig.profile
>> > > >> > > > b/drivers/gpu/drm/xe/Kconfig.profile
>> > > >> > > > new file mode 100644
>> > > >> > > > index 000000000000..e72f15ec4bf6
>> > > >> > > > --- /dev/null
>> > > >> > > > +++ b/drivers/gpu/drm/xe/Kconfig.profile
>> > > >> > > > @@ -0,0 +1,46 @@
>> > > >> > > > +config DRM_XE_JOB_TIMEOUT_MAX
>> > > >> > > > +       int "Default max job timeout (ms)"
>> > > >> > > > +       default 10000 # milliseconds
>> > > >> > > > +       help
>> > > >> > > > +         Configures the default max job timeout after which job will
>> > > >> > > > +         be forcefully taken away from scheduler.
>> > > >> > > > +config DRM_XE_JOB_TIMEOUT_MIN
>> > > >> > > > +       int "Default max job timeout (ms)"
>> > > >> > > > +       default 1 # milliseconds
>> > > >> > > > +       help
>> > > >> > > > +         Configures the default min job timeout after which job will
>> > > >> > > > +         be forcefully taken away from scheduler.
>> > > >> > > > +config DRM_XE_TIMESLICE_MAX
>> > > >> > > > +       int "Default max timeslice duration (us)"
>> > > >> > > > +       default 10000000 # microseconds
>> > > >> > > > +       help
>> > > >> > > > +         Configures the default max timeslice duration
>> > > >> > > > +between
>> > > multiple
>> > > >> > > > +         contexts by guc scheduling.
>> > > >> > > > +config DRM_XE_TIMESLICE_MIN
>> > > >> > > > +       int "Default min timeslice duration (us)"
>> > > >> > > > +       default 1 # microseconds
>> > > >> > > > +       help
>> > > >> > > > +         Configures the default min timeslice duration
>> > > >> > > > +between
>> > > multiple
>> > > >> > > > +         contexts by guc scheduling.
>> > > >> > > > +config DRM_XE_PREEMPT_TIMEOUT_MAX
>> > > >> > > > +       int "Default max  preempt timeout (us)"
>> > > >> > > > +       default 10000000 # microseconds
>> > > >> > > > +       help
>> > > >> > > > +         Configures the default max preempt timeout after
>> > > >> > > > +which
>> > > context
>> > > >> > > > +         will be forcefully taken away and higher priority context
>> will
>> > > >> > > > +         run.
>> > > >> > > > +config DRM_XE_PREEMPT_TIMEOUT_MIN
>> > > >> > > > +       int "Default min  preempt timeout (us)"
>> > > >> > > > +       default 1 # microseconds
>> > > >> > > > +       help
>> > > >> > > > +         Configures the default min preempt timeout after
>> > > >> > > > +which
>> > > context
>> > > >> > > > +         will be forcefully taken away and higher priority context
>> will
>> > > >> > > > +         run.
>> > > >> > > > +config DRM_XE_ENABLE_SCHEDTIMEOUT_LIMIT
>> > > >> > > > +       bool "Default configuration of limitation on scheduler
>> timeout"
>> > > >> > > > +       default y
>> > > >> > > > +       help
>> > > >> > > > +	 Configures the enablement of limitation on scheduler
>> > > timeout
>> > > >> > > > +	 to apply to applicable user. For elevated user, all above MIN
>> > > >> > > > +	 and MAX values will apply when this configuration is
>> > > >> > > > +enable
>> > > to
>> > > >> > > > +	 apply limitation. By default limitation is applied.
>> > > >> > > > diff --git a/drivers/gpu/drm/xe/xe_engine.c
>> > > >> > > > b/drivers/gpu/drm/xe/xe_engine.c index
>> > > >> > > > 9e167b113963..d934196eb79f
>> > > >> > > > 100644
>> > > >> > > > --- a/drivers/gpu/drm/xe/xe_engine.c
>> > > >> > > > +++ b/drivers/gpu/drm/xe/xe_engine.c
>> > > >> > > > @@ -13,6 +13,7 @@
>> > > >> > > >
>> > > >> > > >  #include "xe_device.h"
>> > > >> > > >  #include "xe_gt.h"
>> > > >> > > > +#include "xe_hw_engine_class_sysfs.h"
>> > > >> > > >  #include "xe_hw_fence.h"
>> > > >> > > >  #include "xe_lrc.h"
>> > > >> > > >  #include "xe_macros.h"
>> > > >> > > > @@ -191,8 +192,12 @@ static int engine_set_priority(struct
>> > > >> > > > xe_device *xe, struct xe_engine *e,  static int
>> > > >> engine_set_timeslice(struct xe_device *xe, struct xe_engine *e,
>> > > >> > > >  				u64 value, bool create)  {
>> > > >> > > > -	if (!capable(CAP_SYS_NICE))
>> > > >> > > > -		return -EPERM;
>> > > >> > > > +	u32 min = e->hwe->eclass->sched_props.timeslice_min;
>> > > >> > > > +	u32 max = e->hwe->eclass->sched_props.timeslice_max;
>> > > >> > >
>> > > >> > > So I screwed this up in my last comment, sorry.
>> > > >> > >
>> > > >> > > min = cap_nice ? KConfig option for min :
>> > > >> > > e->hwe->eclass->sched_props.timeslice_min;
>> > > >> > > same logic for max;
>> > > >> > >
>> > > >> > > Probably add helper for this.
>> > > >> > >
>> > > >> > > > +
>> > > >> > > > +	if (enforce_schedule_limit() &&
>> > > >> > > > +	    !engine_timeout_in_range(value, min, max))
>> > > >> > >
>> > > >> > > Then I think logic works too...
>> > > >> > >
>> > > >> > > if cap nice && !Kconfig option to enfore limits
>> > > >> > > (enforce_schedule_limit
>> > > >> returns false):
>> > > >> > > 	user can do whatever
>> > > >> > > else if cap nice
>> > > >> > > 	user within Kconfig range
>> > > >> > > else
>> > > >> > > 	user within sysfs range
>> > > >> > >
>> > > >> > > This is what we want in the end.
>> > > >> > >
>> > > >> >
>> > > >> > Matt, I think this is exactly what the previous revision of the
>> > > >> > patch was
>> > > >> doing.
>> > > >> >
>> > > >>
>> > > >> No... Previous version
>> > > >>
>> > > >> min = Kconfig option to enfore limits ? KConfig option for min :
>> > > >> e->hwe-
>> > > >> >eclass->sched_props.timeslice_min
>> > > >> same for max
>> > > >>
>> > > >> Results in:
>> > > >>
>> > > >> if cap nice && !Kconfig option to enfore limits
>> > > >> (enforce_schedule_limit returns false):
>> > > >> 	user can do whatever
>> > > >> else if cap_nice || Kconfig option to enfore limit
>> > > >> 	user within Kconfig range
>> > > >> else
>> > > >>  	user within sysfs range
>> > > >>
>> > > >> !cap_nice && Kconfig option to enfore limits == user within
>> > > >> Kconfig range
>> > > >> (previously) !cap_nice && Kconfig option to enfore limits == user
>> > > >> within sysfs range (my suggestion)
>> > > >
>> > > >In previous version we can achieve it by just adding one below check
>> right?
>> > > >#if IS_ENABLED(CONFIG_DRM_XE_ENABLE_SCHEDTIMEOUT_LIMIT) &&
>> > > cap_nice
>> > > >+       u32 min = XE_HW_ENGINE_TIMESLICE_MIN;
>> > > >+       u32 max = XE_HW_ENGINE_TIMESLICE_MAX; #else
>> > > >+       u32 min = e->hwe->eclass->sched_props.timeslice_min;
>> > > >+       u32 max = e->hwe->eclass->sched_props.timeslice_max;
>> > > >+#endif
>> > > >
>> > > >Please let me know!
>> > > >
>> > >
>> > > Ah I see. Yah, it is a limits selection issue.
>> > > We can do,
>> > >
>> > > u32 min = e->hwe->eclass->sched_props.timeslice_min;
>> > > u32 max = e->hwe->eclass->sched_props.timeslice_max;
>> > >
>> > > #if IS_ENABLED(CONFIG_DRM_XE_ENABLE_SCHEDTIMEOUT_LIMIT)
>> > >          if (cap_nice) {
>> > >                  u32 min = XE_HW_ENGINE_TIMESLICE_MIN;
>> > >                  u32 max = XE_HW_ENGINE_TIMESLICE_MAX;
>> > >          }
>> > > #endif
>> > >
>> > > Matt, Tejas
>> > > Also, looks like you missed my another comment below.
>> > >
>> > > Niranjana
>> > >
>> > > >>
>> > > >> The logic is different and I believe we want what I'm suggesting.
>> > > >>
>> > > >> Matt
>> > > >>
>> > > >> > > > +		return -EINVAL;
>> > > >> > > >
>> > > >> > > >  	return e->ops->set_timeslice(e, value);  } @@ -201,8
>> > > >> > > > +206,12 @@ static int engine_set_preemption_timeout(struct
>> xe_device *xe,
>> > > >> > > >  					 struct xe_engine *e, u64
>> > > value,
>> > > >> > > >  					 bool create)
>> > > >> > > >  {
>> > > >> > > > -	if (!capable(CAP_SYS_NICE))
>> > > >> > > > -		return -EPERM;
>> > > >> > > > +	u32 min = e->hwe->eclass-
>> > > >sched_props.preempt_timeout_min;
>> > > >> > > > +	u32 max = e->hwe->eclass-
>> > > >sched_props.preempt_timeout_max;
>> > > >> > > > +
>> > > >> > > > +	if (enforce_schedule_limit() &&
>> > > >> > > > +	    !engine_timeout_in_range(value, min, max))
>> > > >> > > > +		return -EINVAL;
>> > > >> > > >
>> > > >> > > >  	return e->ops->set_preempt_timeout(e, value);  } @@ -
>> > > 266,11
>> > > >> > > > +275,15 @@ static int engine_set_persistence(struct
>> > > >> > > > +xe_device *xe,
>> > > >> > > > struct xe_engine *e,  static int
>> > > >> > > > engine_set_job_timeout(struct xe_device
>> > > >> *xe, struct xe_engine *e,
>> > > >> > > >  				  u64 value, bool create)  {
>> > > >> > > > +	u32 min = e->hwe->eclass->sched_props.job_timeout_min;
>> > > >> > > > +	u32 max = e->hwe->eclass->sched_props.job_timeout_max;
>> > > >> > > > +
>> > > >> > > >  	if (XE_IOCTL_DBG(xe, !create))
>> > > >> > > >  		return -EINVAL;
>> > > >> > > >
>> > > >> > > > -	if (!capable(CAP_SYS_NICE))
>> > > >> > > > -		return -EPERM;
>> > > >> > > > +	if (enforce_schedule_limit() &&
>> > > >> > > > +	    !engine_timeout_in_range(value, min, max))
>> > > >> > > > +		return -EINVAL;
>> > > >> > > >
>> > > >> > > >  	return e->ops->set_job_timeout(e, value);  } diff --git
>> > > >> > > > a/drivers/gpu/drm/xe/xe_hw_engine.c
>> > > >> > > > b/drivers/gpu/drm/xe/xe_hw_engine.c
>> > > >> > > > index afa7d25c3852..e601bffe3b13 100644
>> > > >> > > > --- a/drivers/gpu/drm/xe/xe_hw_engine.c
>> > > >> > > > +++ b/drivers/gpu/drm/xe/xe_hw_engine.c
>> > > >> > > > @@ -364,8 +364,16 @@ static void
>> > > >> > > > hw_engine_init_early(struct xe_gt *gt, struct xe_hw_engine
>> > > >> > > > *hwe,
>> > > >> > > >
>> > > >> > > >  	if (!gt->eclass[hwe->class].sched_props.job_timeout_ms) {
>> > > >> > > >  		gt->eclass[hwe->class].sched_props.job_timeout_ms
>> > > = HZ *
>> > > >> 5;
>> > > >> > > > +		gt->eclass[hwe-
>> > > >class].sched_props.job_timeout_min =
>> > > >> XE_HW_ENGINE_JOB_TIMEOUT_MIN;
>> > > >> > > > +		gt->eclass[hwe-
>> > > >class].sched_props.job_timeout_max =
>> > > >> > > > +XE_HW_ENGINE_JOB_TIMEOUT_MAX;
>> > > >> > > >  		gt->eclass[hwe->class].sched_props.timeslice_us = 1
>> > > * 1000;
>> > > >> > > > +		gt->eclass[hwe->class].sched_props.timeslice_min =
>> > > >> XE_HW_ENGINE_TIMESLICE_MIN;
>> > > >> > > > +		gt->eclass[hwe->class].sched_props.timeslice_max =
>> > > >> > > > +XE_HW_ENGINE_TIMESLICE_MAX;
>> > > >> > > >  		gt->eclass[hwe-
>> > > >class].sched_props.preempt_timeout_us =
>> > > >> 640 *
>> > > >> > > > 1000;
>> > > >> > > > +		gt->eclass[hwe-
>> > > >class].sched_props.preempt_timeout_min =
>> > > >> > > > +
>> > > >> 	XE_HW_ENGINE_PREEMPT_TIMEOUT_MIN;
>> > > >> > > > +		gt->eclass[hwe-
>> > > >class].sched_props.preempt_timeout_max =
>> > > >> > > > +
>> > > >> 	XE_HW_ENGINE_PREEMPT_TIMEOUT_MAX;
>> > > >> > > >  		/* Record default props */
>> > > >> > > >  		gt->eclass[hwe->class].defaults = gt->eclass[hwe-
>> > > >> >class].sched_props;
>> > > >> > > >  	}
>> > > >> > > > diff --git a/drivers/gpu/drm/xe/xe_hw_engine.h
>> > > >> > > > b/drivers/gpu/drm/xe/xe_hw_engine.h
>> > > >> > > > index 7eca9d53c7b1..3d37d6d44261 100644
>> > > >> > > > --- a/drivers/gpu/drm/xe/xe_hw_engine.h
>> > > >> > > > +++ b/drivers/gpu/drm/xe/xe_hw_engine.h
>> > > >> > > > @@ -10,6 +10,37 @@
>> > > >> > > >
>> > > >> > > >  struct drm_printer;
>> > > >> > > >
>> > > >> > > > +#ifdef CONFIG_DRM_XE_JOB_TIMEOUT_MIN #define
>> > > >> > > > +XE_HW_ENGINE_JOB_TIMEOUT_MIN
>> > > >> CONFIG_DRM_XE_JOB_TIMEOUT_MIN #else
>> > > >> > > > +#define XE_HW_ENGINE_JOB_TIMEOUT_MIN 1 #endif #ifdef
>> > > >> > > > +CONFIG_DRM_XE_JOB_TIMEOUT_MAX #define
>> > > >> > > > +XE_HW_ENGINE_JOB_TIMEOUT_MAX
>> > > >> CONFIG_DRM_XE_JOB_TIMEOUT_MAX #else
>> > > >> > > > +#define XE_HW_ENGINE_JOB_TIMEOUT_MAX (10 * 1000)
>> #endif
>> > > #ifdef
>> > > >> > > > +CONFIG_DRM_XE_TIMESLICE_MIN #define
>> > > >> XE_HW_ENGINE_TIMESLICE_MIN
>> > > >> > > > +CONFIG_DRM_XE_TIMESLICE_MIN #else #define
>> > > >> > > > +XE_HW_ENGINE_TIMESLICE_MIN 1 #endif #ifdef
>> > > >> > > > +CONFIG_DRM_XE_TIMESLICE_MAX #define
>> > > >> XE_HW_ENGINE_TIMESLICE_MAX
>> > > >> > > > +CONFIG_DRM_XE_TIMESLICE_MAX #else #define
>> > > >> > > > +XE_HW_ENGINE_TIMESLICE_MAX (10 * 1000 * 1000) #endif
>> > > >> > > > +#ifdef CONFIG_DRM_XE_PREEMPT_TIMEOUT_MIN #define
>> > > >> > > > +XE_HW_ENGINE_PREEMPT_TIMEOUT_MIN
>> > > >> > > > +CONFIG_DRM_XE_PREEMPT_TIMEOUT_MIN #else #define
>> > > >> > > > +XE_HW_ENGINE_PREEMPT_TIMEOUT_MIN 1 #endif #ifdef
>> > > >> > > > +CONFIG_DRM_XE_PREEMPT_TIMEOUT_MAX
>> > > >> > > > +#define XE_HW_ENGINE_PREEMPT_TIMEOUT_MAX
>> > > >> > > > +CONFIG_DRM_XE_PREEMPT_TIMEOUT_MAX #else #define
>> > > >> > > > +XE_HW_ENGINE_PREEMPT_TIMEOUT_MAX (10 * 1000 * 1000)
>> > > #endif
>> > > >> > > > +
>> > > >> > > >  int xe_hw_engines_init_early(struct xe_gt *gt);  int
>> > > >> > > > xe_hw_engines_init(struct xe_gt *gt);  void
>> > > >> > > > xe_hw_engine_handle_irq(struct xe_hw_engine *hwe, u16
>> > > >> > > > intr_vec); diff --git
>> > > >> > > > a/drivers/gpu/drm/xe/xe_hw_engine_class_sysfs.c
>> > > >> > > > b/drivers/gpu/drm/xe/xe_hw_engine_class_sysfs.c
>> > > >> > > > index 990bb675d1e0..2b7ac4e02db6 100644
>> > > >> > > > --- a/drivers/gpu/drm/xe/xe_hw_engine_class_sysfs.c
>> > > >> > > > +++ b/drivers/gpu/drm/xe/xe_hw_engine_class_sysfs.c
>> > > >> > > > @@ -11,6 +11,20 @@
>> > > >> > > >
>> > > >> > > >  static int xe_add_hw_engine_class_defaults(struct kobject
>> > > >> > > > *parent);
>> > > >> > > >
>> > > >> > > > +bool enforce_schedule_limit(void) { #if
>> > > >> > > > +IS_ENABLED(CONFIG_DRM_XE_ENABLE_SCHEDTIMEOUT_LIMIT)
>> > > >> > > > +	return true;
>> > > >> > > > +#else
>> > > >> > > > +	return !capable(CAP_SYS_NICE); #endif }
>> > > >> > > > +
>> > > >> > > > +bool engine_timeout_in_range(u64 timeout, u64 min, u64 max)
>> {
>> > > >> > > > +	return timeout >= min && timeout <= max; }
>> > > >> > > > +
>> > > >> > > >  static void kobj_xe_hw_engine_release(struct kobject *kobj)  {
>> > > >> > > >  	kfree(kobj);
>> > > >> > > > @@ -39,11 +53,92 @@ kobj_xe_hw_engine_class(struct kobject
>> > > >> *parent, char *name)
>> > > >> > > >  	return keclass;
>> > > >> > > >  }
>> > > >> > > >
>> > > >> > > > +static ssize_t job_timeout_max_store(struct kobject *kobj,
>> > > >> > > > +				     struct kobj_attribute *attr,
>> > > >> > > > +				     const char *buf, size_t count) {
>> > > >> > > > +	struct xe_hw_engine_class_intf *eclass =
>> > > kobj_to_eclass(kobj);
>> > > >> > > > +	u32 timeout;
>> > > >> > > > +	int err;
>> > > >> > > > +
>> > > >> > > > +	err = kstrtou32(buf, 0, &timeout);
>> > > >> > > > +	if (err)
>> > > >> > > > +		return err;
>> > > >> > > > +
>> > > >> > > > +	if (timeout < eclass->sched_props.job_timeout_min)
>> > > >> > > > +		return -EINVAL;
>> > > >> > > > +
>> > > >> > > > +	if (enforce_schedule_limit() &&
>> > > >> > > > +	    !engine_timeout_in_range(timeout,
>> > > >> > > > +
>> > > XE_HW_ENGINE_JOB_TIMEOUT_MIN,
>> > > >> > > > +
>> > > XE_HW_ENGINE_JOB_TIMEOUT_MAX))
>> > > >> > > > +		return -EINVAL;
>> > > >> > > > +
>> > > >> > > > +	WRITE_ONCE(eclass->sched_props.job_timeout_max,
>> > > timeout);
>> > > >> > > > +
>> > > >> > > > +	return count;
>> > > >> > > > +}
>> > > >> > > > +
>> > > >> > > > +static ssize_t job_timeout_max_show(struct kobject *kobj,
>> > > >> > > > +				    struct kobj_attribute *attr, char
>> > > *buf) {
>> > > >> > > > +	struct xe_hw_engine_class_intf *eclass =
>> > > >> > > > +kobj_to_eclass(kobj);
>> > > >> > > > +
>> > > >> > > > +	return sprintf(buf, "%u\n",
>> > > >> > > > +eclass->sched_props.job_timeout_max);
>> > > >> > > > +}
>> > > >> > > > +
>> > > >> > > > +static struct kobj_attribute job_timeout_max_attr =
>> > > >> > > > +__ATTR(job_timeout_max, 0644, job_timeout_max_show,
>> > > >> > > > +job_timeout_max_store);
>> > > >> > > > +
>> > > >> > > > +static ssize_t job_timeout_min_store(struct kobject *kobj,
>> > > >> > > > +				     struct kobj_attribute *attr,
>> > > >> > > > +				     const char *buf, size_t count) {
>> > > >> > > > +	struct xe_hw_engine_class_intf *eclass =
>> > > kobj_to_eclass(kobj);
>> > > >> > > > +	u32 timeout;
>> > > >> > > > +	int err;
>> > > >> > > > +
>> > > >> > > > +	err = kstrtou32(buf, 0, &timeout);
>> > > >> > > > +	if (err)
>> > > >> > > > +		return err;
>> > > >> > > > +
>> > > >> > > > +	if (timeout > eclass->sched_props.job_timeout_max)
>> > > >> > > > +		return -EINVAL;
>> > > >> > > > +
>> > > >> > > > +	if (enforce_schedule_limit() &&
>> > > >> > > > +	    !engine_timeout_in_range(timeout,
>> > > >> > > > +
>> > > XE_HW_ENGINE_JOB_TIMEOUT_MIN,
>> > > >> > > > +
>> > > XE_HW_ENGINE_JOB_TIMEOUT_MAX))
>> > > >> > > > +		return -EINVAL;
>> > > >> > > > +
>> > > >> > > > +	WRITE_ONCE(eclass->sched_props.job_timeout_min,
>> > > timeout);
>> > > >> > > > +
>> > > >> > > > +	return count;
>> > > >> > > > +}
>> > > >> > > > +
>> > > >> > > > +static ssize_t job_timeout_min_show(struct kobject *kobj,
>> > > >> > > > +				    struct kobj_attribute *attr, char
>> > > *buf) {
>> > > >> > > > +	struct xe_hw_engine_class_intf *eclass =
>> > > >> > > > +kobj_to_eclass(kobj);
>> > > >> > > > +
>> > > >> > > > +	return sprintf(buf, "%u\n",
>> > > >> > > > +eclass->sched_props.job_timeout_min);
>> > > >> > > > +}
>> > > >> > > > +
>> > > >> > > > +static struct kobj_attribute job_timeout_min_attr =
>> > > >> > > > +__ATTR(job_timeout_min, 0644, job_timeout_min_show,
>> > > >> > > > +job_timeout_min_store);
>> > > >> > > > +
>> > > >> > > >  static ssize_t job_timeout_store(struct kobject *kobj,
>> > > >> > > >  				 struct kobj_attribute *attr,
>> > > >> > > >  				 const char *buf, size_t count)  {
>> > > >> > > >  	struct xe_hw_engine_class_intf *eclass =
>> > > >> > > > kobj_to_eclass(kobj);
>> > > >> > > > +#if
>> IS_ENABLED(CONFIG_DRM_XE_ENABLE_SCHEDTIMEOUT_LIMIT)
>> > > >> > > > +	u32 min = XE_HW_ENGINE_JOB_TIMEOUT_MIN;
>> > > >> > > > +	u32 max = XE_HW_ENGINE_JOB_TIMEOUT_MAX; #else
>> > > >> > > > +	u32 min = e->hwe->eclass->sched_props.job_timeout_min;
>> > > >> > > > +	u32 max = e->hwe->eclass->sched_props.job_timeout_max;
>> > > >> > > > +#endif
>> > > >> > >
>> > > >> > > I don't think we need this, just make sure default is within
>> > > >> > > min / max of the sched_props.
>> > > >> > >
>> > > >> >
>> > > >> > Shouldn't the sched_prop set through sysfs here which applies
>> > > >> > to all future user engines (xe_engine) has the same requirement
>> > > >> > as the sched_prop set directly to user engine (xe_engine)
>> > > >> > through set_properly
>> > > >> ioctl?
>> > > >> > ie., shoudln't the requirement be same in job_timeout_store()
>> > > >> > and engine_set_job_timeout()?
>> >
>> > I also think it should apply same to sysfs calls as well. Unless we think sysfs
>> should limit to compile configs only. Since sysfs min/max cab be changed.
>> >
>>
>> Disagree, the min / max sysfs entries are subject to the Kconfig limits.
>> So if you check the sysfs entry min / max here, the initial value will always be
>> within the Kconfig limits plus any additional restrictions a user has imposed.
>
>So limit to sysfs min/max always irrespective of elevated user or not, right?
>

Yah, the min/max sysfs entries are not subjected to the Kconfig limits
if cap_nice and CONFIG_DRM_XE_ENABLE_SCHEDTIMEOUT_LIMIT is not defined.
Also, if cap_nice, we should allow setting beyond sysfs limits. Right?

Niranjana

>Thanks,
>Tejas
>>
>> Matt
>>
>> > Thanks,
>> > Tejas
>> >
>> > > >> >
>> > > >> > Niranjana
>> > > >> >
>> > > >> > > Matt
>> > > >> > >
>> > > >> > > >  	u32 timeout;
>> > > >> > > >  	int err;
>> > > >> > > >
>> > > >> > > > @@ -51,6 +146,10 @@ static ssize_t job_timeout_store(struct
>> > > >> > > > kobject
>> > > >> *kobj,
>> > > >> > > >  	if (err)
>> > > >> > > >  		return err;
>> > > >> > > >
>> > > >> > > > +	if (enforce_schedule_limit() &&
>> > > >> > > > +	    !engine_timeout_in_range(timeout, min, max))
>> > > >> > > > +		return -EINVAL;
>> > > >> > > > +
>> > > >> > > >  	WRITE_ONCE(eclass->sched_props.job_timeout_ms,
>> > > timeout);
>> > > >> > > >
>> > > >> > > >  	return count;
>> > > >> > > > @@ -78,11 +177,40 @@ static ssize_t
>> > > >> > > > job_timeout_default(struct kobject *kobj,  static struct
>> > > >> > > > kobj_attribute job_timeout_def = __ATTR(job_timeout_ms,
>> > > >> > > > 0444, job_timeout_default, NULL);
>> > > >> > > >
>> > > >> > > > +static ssize_t job_timeout_min_default(struct kobject *kobj,
>> > > >> > > > +				       struct kobj_attribute *attr, char
>> > > *buf) {
>> > > >> > > > +	struct xe_hw_engine_class_intf *eclass =
>> > > >> > > > +kobj_to_eclass(kobj->parent);
>> > > >> > > > +
>> > > >> > > > +	return sprintf(buf, "%u\n",
>> > > >> > > > +eclass->defaults.job_timeout_min);
>> > > >> > > > +}
>> > > >> > > > +
>> > > >> > > > +static struct kobj_attribute job_timeout_min_def =
>> > > >> > > > +__ATTR(job_timeout_min, 0444, job_timeout_min_default,
>> > > >> > > > +NULL);
>> > > >> > > > +
>> > > >> > > > +static ssize_t job_timeout_max_default(struct kobject *kobj,
>> > > >> > > > +				       struct kobj_attribute *attr, char
>> > > *buf) {
>> > > >> > > > +	struct xe_hw_engine_class_intf *eclass =
>> > > >> > > > +kobj_to_eclass(kobj->parent);
>> > > >> > > > +
>> > > >> > > > +	return sprintf(buf, "%u\n",
>> > > >> > > > +eclass->defaults.job_timeout_max);
>> > > >> > > > +}
>> > > >> > > > +
>> > > >> > > > +static struct kobj_attribute job_timeout_max_def =
>> > > >> > > > +__ATTR(job_timeout_max, 0444, job_timeout_max_default,
>> > > >> > > > +NULL);
>> > > >> > > > +
>> > > >> > > >  static ssize_t timeslice_duration_store(struct kobject *kobj,
>> > > >> > > >  					struct kobj_attribute *attr,
>> > > >> > > >  					const char *buf, size_t count)
>> > > {
>> > > >> > > >  	struct xe_hw_engine_class_intf *eclass =
>> > > >> > > > kobj_to_eclass(kobj);
>> > > >> > > > +#if
>> IS_ENABLED(CONFIG_DRM_XE_ENABLE_SCHEDTIMEOUT_LIMIT)
>> > > >> > > > +	u32 min = XE_HW_ENGINE_TIMESLICE_MIN;
>> > > >> > > > +	u32 max = XE_HW_ENGINE_TIMESLICE_MAX; #else
>> > > >> > > > +	u32 min = e->hwe->eclass->sched_props.timeslice_min;
>> > > >> > > > +	u32 max = e->hwe->eclass->sched_props.timeslice_max;
>> > > >> > > > +#endif
>> > > >> > > >  	u32 duration;
>> > > >> > > >  	int err;
>> > > >> > > >
>> > > >> > > > @@ -90,11 +218,92 @@ static ssize_t
>> > > >> > > > timeslice_duration_store(struct
>> > > >> kobject *kobj,
>> > > >> > > >  	if (err)
>> > > >> > > >  		return err;
>> > > >> > > >
>> > > >> > > > +	if (enforce_schedule_limit() &&
>> > > >> > > > +	    !engine_timeout_in_range(duration, min, max))
>> > > >> > > > +		return -EINVAL;
>> > > >> > > > +
>> > > >> > > >  	WRITE_ONCE(eclass->sched_props.timeslice_us, duration);
>> > > >> > > >
>> > > >> > > >  	return count;
>> > > >> > > >  }
>> > > >> > > >
>> > > >> > > > +static ssize_t timeslice_duration_max_store(struct kobject
>> *kobj,
>> > > >> > > > +					    struct kobj_attribute *attr,
>> > > >> > > > +					    const char *buf, size_t
>> > > count) {
>> > > >> > > > +	struct xe_hw_engine_class_intf *eclass =
>> > > kobj_to_eclass(kobj);
>> > > >> > > > +	u32 duration;
>> > > >> > > > +	int err;
>> > > >> > > > +
>> > > >> > > > +	err = kstrtou32(buf, 0, &duration);
>> > > >> > > > +	if (err)
>> > > >> > > > +		return err;
>> > > >> > > > +
>> > > >> > > > +	if (duration < eclass->sched_props.timeslice_min)
>> > > >> > > > +		return -EINVAL;
>> > > >> > > > +
>> > > >> > > > +	if (enforce_schedule_limit() &&
>> > > >> > > > +	    !engine_timeout_in_range(duration,
>> > > >> > > > +				     XE_HW_ENGINE_TIMESLICE_MIN,
>> > > >> > > > +
>> > > XE_HW_ENGINE_TIMESLICE_MAX))
>> > > >> > > > +		return -EINVAL;
>> > > >> > > > +
>> > > >> > > > +	WRITE_ONCE(eclass->sched_props.timeslice_max, duration);
>> > > >> > > > +
>> > > >> > > > +	return count;
>> > > >> > > > +}
>> > > >> > > > +
>> > > >> > > > +static ssize_t timeslice_duration_max_show(struct kobject
>> *kobj,
>> > > >> > > > +					   struct kobj_attribute *attr,
>> > > >> > > > +					   char *buf)
>> > > >> > > > +{
>> > > >> > > > +	struct xe_hw_engine_class_intf *eclass =
>> > > >> > > > +kobj_to_eclass(kobj);
>> > > >> > > > +
>> > > >> > > > +	return sprintf(buf, "%u\n",
>> > > >> > > > +eclass->sched_props.timeslice_max);
>> > > >> > > > +}
>> > > >> > > > +
>> > > >> > > > +static struct kobj_attribute timeslice_duration_max_attr =
>> > > >> > > > +	__ATTR(timeslice_duration_max, 0644,
>> > > >> timeslice_duration_max_show,
>> > > >> > > > +	       timeslice_duration_max_store);
>> > > >> > > > +
>> > > >> > > > +static ssize_t timeslice_duration_min_store(struct kobject *kobj,
>> > > >> > > > +					    struct kobj_attribute *attr,
>> > > >> > > > +					    const char *buf, size_t
>> > > count) {
>> > > >> > > > +	struct xe_hw_engine_class_intf *eclass =
>> > > kobj_to_eclass(kobj);
>> > > >> > > > +	u32 duration;
>> > > >> > > > +	int err;
>> > > >> > > > +
>> > > >> > > > +	err = kstrtou32(buf, 0, &duration);
>> > > >> > > > +	if (err)
>> > > >> > > > +		return err;
>> > > >> > > > +
>> > > >> > > > +	if (duration > eclass->sched_props.timeslice_max)
>> > > >> > > > +		return -EINVAL;
>> > > >> > > > +
>> > > >> > > > +	if (enforce_schedule_limit() &&
>> > > >> > > > +	    !engine_timeout_in_range(duration,
>> > > >> > > > +				     XE_HW_ENGINE_TIMESLICE_MIN,
>> > > >> > > > +
>> > > XE_HW_ENGINE_TIMESLICE_MAX))
>> > > >> > > > +		return -EINVAL;
>> > > >> > > > +
>> > > >> > > > +	WRITE_ONCE(eclass->sched_props.timeslice_min, duration);
>> > > >> > > > +
>> > > >> > > > +	return count;
>> > > >> > > > +}
>> > > >> > > > +
>> > > >> > > > +static ssize_t timeslice_duration_min_show(struct kobject *kobj,
>> > > >> > > > +					   struct kobj_attribute *attr,
>> > > char
>> > > >> *buf) {
>> > > >> > > > +	struct xe_hw_engine_class_intf *eclass =
>> > > >> > > > +kobj_to_eclass(kobj);
>> > > >> > > > +
>> > > >> > > > +	return sprintf(buf, "%u\n",
>> > > >> > > > +eclass->sched_props.timeslice_min);
>> > > >> > > > +}
>> > > >> > > > +
>> > > >> > > > +static struct kobj_attribute timeslice_duration_min_attr =
>> > > >> > > > +	__ATTR(timeslice_duration_min, 0644,
>> > > >> timeslice_duration_min_show,
>> > > >> > > > +	       timeslice_duration_min_store);
>> > > >> > > > +
>> > > >> > > >  static ssize_t timeslice_duration_show(struct kobject *kobj,
>> > > >> > > >  		struct kobj_attribute *attr, char *buf)  { @@ -118,11
>> > > >> > > > +327,40 @@ static ssize_t timeslice_default(struct kobject
>> > > >> > > > *kobj,  static struct kobj_attribute timeslice_duration_def
>> > > >> > > > = __ATTR(timeslice_duration_us, 0444, timeslice_default,
>> > > >> > > > NULL);
>> > > >> > > >
>> > > >> > > > +static ssize_t timeslice_min_default(struct kobject *kobj,
>> > > >> > > > +				     struct kobj_attribute *attr, char
>> > > *buf) {
>> > > >> > > > +	struct xe_hw_engine_class_intf *eclass =
>> > > >> > > > +kobj_to_eclass(kobj->parent);
>> > > >> > > > +
>> > > >> > > > +	return sprintf(buf, "%u\n",
>> > > >> > > > +eclass->defaults.timeslice_min); }
>> > > >> > > > +
>> > > >> > > > +static struct kobj_attribute timeslice_duration_min_def =
>> > > >> > > > +__ATTR(timeslice_duration_min, 0444,
>> > > >> > > > +timeslice_min_default, NULL);
>> > > >> > > > +
>> > > >> > > > +static ssize_t timeslice_max_default(struct kobject *kobj,
>> > > >> > > > +				     struct kobj_attribute *attr, char
>> > > *buf) {
>> > > >> > > > +	struct xe_hw_engine_class_intf *eclass =
>> > > >> > > > +kobj_to_eclass(kobj->parent);
>> > > >> > > > +
>> > > >> > > > +	return sprintf(buf, "%u\n",
>> > > >> > > > +eclass->defaults.timeslice_max); }
>> > > >> > > > +
>> > > >> > > > +static struct kobj_attribute timeslice_duration_max_def =
>> > > >> > > > +__ATTR(timeslice_duration_max, 0444,
>> > > >> > > > +timeslice_max_default, NULL);
>> > > >> > > > +
>> > > >> > > >  static ssize_t preempt_timeout_store(struct kobject *kobj,
>> > > >> > > >  				     struct kobj_attribute *attr,
>> > > >> > > >  				     const char *buf, size_t count)  {
>> > > >> > > >  	struct xe_hw_engine_class_intf *eclass =
>> > > >> > > > kobj_to_eclass(kobj);
>> > > >> > > > +#if
>> IS_ENABLED(CONFIG_DRM_XE_ENABLE_SCHEDTIMEOUT_LIMIT)
>> > > >> > > > +	u32 min = XE_HW_ENGINE_PREEMPT_TIMEOUT_MIN;
>> > > >> > > > +	u32 max = XE_HW_ENGINE_PREEMPT_TIMEOUT_MAX; #else
>> > > >> > > > +	u32 min = e->hwe->eclass-
>> > > >sched_props.preempt_timeout_min;
>> > > >> > > > +	u32 max = e->hwe->eclass-
>> > > >sched_props.preempt_timeout_max;
>> > > >> > > > +#endif
>> > > >> > > >  	u32 timeout;
>> > > >> > > >  	int err;
>> > > >> > > >
>> > > >> > > > @@ -130,6 +368,10 @@ static ssize_t
>> > > >> > > > preempt_timeout_store(struct
>> > > >> kobject *kobj,
>> > > >> > > >  	if (err)
>> > > >> > > >  		return err;
>> > > >> > > >
>> > > >> > > > +	if (enforce_schedule_limit() &&
>> > > >> > > > +	    !engine_timeout_in_range(timeout, min, max))
>> > > >> > > > +		return -EINVAL;
>> > > >> > > > +
>> > > >> > > >  	WRITE_ONCE(eclass->sched_props.preempt_timeout_us,
>> > > timeout);
>> > > >> > > >
>> > > >> > > >  	return count;
>> > > >> > > > @@ -158,17 +400,129 @@ static ssize_t
>> > > >> > > > preempt_timeout_default(struct kobject *kobj,  static
>> > > >> > > > struct kobj_attribute preempt_timeout_def =
>> > > >> > > > __ATTR(preempt_timeout_us, 0444, preempt_timeout_default,
>> > > >> > > > NULL);
>> > > >> > > >
>> > > >> > > > +static ssize_t preempt_timeout_min_default(struct kobject
>> *kobj,
>> > > >> > > > +					   struct kobj_attribute *attr,
>> > > >> > > > +					   char *buf)
>> > > >> > > > +{
>> > > >> > > > +	struct xe_hw_engine_class_intf *eclass =
>> > > >> > > > +kobj_to_eclass(kobj->parent);
>> > > >> > > > +
>> > > >> > > > +	return sprintf(buf, "%u\n",
>> > > >> > > > +eclass->defaults.preempt_timeout_min);
>> > > >> > > > +}
>> > > >> > > > +
>> > > >> > > > +static struct kobj_attribute preempt_timeout_min_def =
>> > > >> > > > +__ATTR(preempt_timeout_min, 0444,
>> > > preempt_timeout_min_default,
>> > > >> > > > +NULL);
>> > > >> > > > +
>> > > >> > > > +static ssize_t preempt_timeout_max_default(struct kobject
>> *kobj,
>> > > >> > > > +					   struct kobj_attribute *attr,
>> > > >> > > > +					   char *buf)
>> > > >> > > > +{
>> > > >> > > > +	struct xe_hw_engine_class_intf *eclass =
>> > > >> > > > +kobj_to_eclass(kobj->parent);
>> > > >> > > > +
>> > > >> > > > +	return sprintf(buf, "%u\n",
>> > > >> > > > +eclass->defaults.preempt_timeout_max);
>> > > >> > > > +}
>> > > >> > > > +
>> > > >> > > > +static struct kobj_attribute preempt_timeout_max_def =
>> > > >> > > > +__ATTR(preempt_timeout_max, 0444,
>> > > >> preempt_timeout_max_default,
>> > > >> > > > +NULL);
>> > > >> > > > +
>> > > >> > > > +static ssize_t preempt_timeout_max_store(struct kobject *kobj,
>> > > >> > > > +					 struct kobj_attribute *attr,
>> > > >> > > > +					 const char *buf, size_t count)
>> > > {
>> > > >> > > > +	struct xe_hw_engine_class_intf *eclass =
>> > > kobj_to_eclass(kobj);
>> > > >> > > > +	u32 timeout;
>> > > >> > > > +	int err;
>> > > >> > > > +
>> > > >> > > > +	err = kstrtou32(buf, 0, &timeout);
>> > > >> > > > +	if (err)
>> > > >> > > > +		return err;
>> > > >> > > > +
>> > > >> > > > +	if (timeout < eclass->sched_props.preempt_timeout_min)
>> > > >> > > > +		return -EINVAL;
>> > > >> > > > +
>> > > >> > > > +	if (enforce_schedule_limit() &&
>> > > >> > > > +	    !engine_timeout_in_range(timeout,
>> > > >> > > > +
>> > > >> XE_HW_ENGINE_PREEMPT_TIMEOUT_MIN,
>> > > >> > > > +
>> > > >> XE_HW_ENGINE_PREEMPT_TIMEOUT_MAX))
>> > > >> > > > +		return -EINVAL;
>> > > >> > > > +
>> > > >> > > > +	WRITE_ONCE(eclass->sched_props.preempt_timeout_max,
>> > > timeout);
>> > > >> > > > +
>> > > >> > > > +	return count;
>> > > >> > > > +}
>> > > >> > > > +
>> > > >> > > > +static ssize_t preempt_timeout_max_show(struct kobject *kobj,
>> > > >> > > > +					struct kobj_attribute *attr,
>> > > char *buf)
>> > > >> {
>> > > >> > > > +	struct xe_hw_engine_class_intf *eclass =
>> > > >> > > > +kobj_to_eclass(kobj);
>> > > >> > > > +
>> > > >> > > > +	return sprintf(buf, "%u\n",
>> > > >> > > > +eclass->sched_props.preempt_timeout_max);
>> > > >> > > > +}
>> > > >> > > > +
>> > > >> > > > +static struct kobj_attribute preempt_timeout_max_attr =
>> > > >> > > > +	__ATTR(preempt_timeout_max, 0644,
>> > > preempt_timeout_max_show,
>> > > >> > > > +	       preempt_timeout_max_store);
>> > > >> > > > +
>> > > >> > > > +static ssize_t preempt_timeout_min_store(struct kobject *kobj,
>> > > >> > > > +					 struct kobj_attribute *attr,
>> > > >> > > > +					 const char *buf, size_t count)
>> > > {
>> > > >> > > > +	struct xe_hw_engine_class_intf *eclass =
>> > > kobj_to_eclass(kobj);
>> > > >> > > > +	u32 timeout;
>> > > >> > > > +	int err;
>> > > >> > > > +
>> > > >> > > > +	err = kstrtou32(buf, 0, &timeout);
>> > > >> > > > +	if (err)
>> > > >> > > > +		return err;
>> > > >> > > > +
>> > > >> > > > +	if (timeout > eclass->sched_props.preempt_timeout_max)
>> > > >> > > > +		return -EINVAL;
>> > > >> > > > +
>> > > >> > > > +	if (enforce_schedule_limit() &&
>> > > >> > > > +	    !engine_timeout_in_range(timeout,
>> > > >> > > > +
>> > > >> XE_HW_ENGINE_PREEMPT_TIMEOUT_MIN,
>> > > >> > > > +
>> > > >> XE_HW_ENGINE_PREEMPT_TIMEOUT_MAX))
>> > > >> > > > +		return -EINVAL;
>> > > >> > > > +
>> > > >> > > > +	WRITE_ONCE(eclass->sched_props.preempt_timeout_min,
>> > > timeout);
>> > > >> > > > +
>> > > >> > > > +	return count;
>> > > >> > > > +}
>> > > >> > > > +
>> > > >> > > > +static ssize_t preempt_timeout_min_show(struct kobject *kobj,
>> > > >> > > > +					struct kobj_attribute *attr,
>> > > char *buf)
>> > > >> {
>> > > >> > > > +	struct xe_hw_engine_class_intf *eclass =
>> > > >> > > > +kobj_to_eclass(kobj);
>> > > >> > > > +
>> > > >> > > > +	return sprintf(buf, "%u\n",
>> > > >> > > > +eclass->sched_props.preempt_timeout_min);
>> > > >> > > > +}
>> > > >> > > > +
>> > > >> > > > +static struct kobj_attribute preempt_timeout_min_attr =
>> > > >> > > > +	__ATTR(preempt_timeout_min, 0644,
>> > > preempt_timeout_min_show,
>> > > >> > > > +	       preempt_timeout_min_store);
>> > > >> > > > +
>> > > >> > > >  static const struct attribute *defaults[] = {
>> > > >> > > >  	&job_timeout_def.attr,
>> > > >> > > > +	&job_timeout_min_def.attr,
>> > > >> > > > +	&job_timeout_max_def.attr,
>> > > >> > > >  	&timeslice_duration_def.attr,
>> > > >> > > > +	&timeslice_duration_min_def.attr,
>> > > >> > > > +	&timeslice_duration_max_def.attr,
>> > > >> > > >  	&preempt_timeout_def.attr,
>> > > >> > > > +	&preempt_timeout_min_def.attr,
>> > > >> > > > +	&preempt_timeout_max_def.attr,
>> > > >> > > >  	NULL
>> > > >> > > >  };
>> > > >> > > >
>> > > >> > > >  static const struct attribute *files[] = {
>> > > >> > > >  	&job_timeout_attr.attr,
>> > > >> > > > +	&job_timeout_min_attr.attr,
>> > > >> > > > +	&job_timeout_max_attr.attr,
>> > > >> > > >  	&timeslice_duration_attr.attr,
>> > > >> > > > +	&timeslice_duration_min_attr.attr,
>> > > >> > > > +	&timeslice_duration_max_attr.attr,
>> > > >> > > >  	&preempt_timeout_attr.attr,
>> > > >> > > > +	&preempt_timeout_min_attr.attr,
>> > > >> > > > +	&preempt_timeout_max_attr.attr,
>> > > >> > > >  	NULL
>> > > >> > > >  };
>> > > >> > > >
>> > > >> > > > diff --git a/drivers/gpu/drm/xe/xe_hw_engine_class_sysfs.h
>> > > >> > > > b/drivers/gpu/drm/xe/xe_hw_engine_class_sysfs.h
>> > > >> > > > index 757136614672..2e2ab351a991 100644
>> > > >> > > > --- a/drivers/gpu/drm/xe/xe_hw_engine_class_sysfs.h
>> > > >> > > > +++ b/drivers/gpu/drm/xe/xe_hw_engine_class_sysfs.h
>> > > >> > > > @@ -10,6 +10,8 @@
>> > > >> > > >
>> > > >> > > >  #define MAX_ENGINE_CLASS_NAME_LEN    16
>> > > >> > > >  int xe_hw_engine_class_sysfs_init(struct xe_gt *gt);
>> > > >> > > > +bool enforce_schedule_limit(void); bool
>> > > >> > > > +engine_timeout_in_range(u64 timeout, u64 min, u64 max);
>> > > >> > > >
>> > > >> > > >  /**
>> > > >> > > >   * struct kobj_eclass - A eclass's kobject struct that
>> > > >> > > > connects the kobject and the
>> > > >> > > > --
>> > > >> > > > 2.25.1
>> > > >> > > >

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

end of thread, other threads:[~2023-07-28 14:55 UTC | newest]

Thread overview: 30+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2023-07-27  8:22 [Intel-xe] [PATCH V9 0/6] drm/xe: Add engine scheduler control interface Tejas Upadhyay
2023-07-27  8:22 ` [Intel-xe] [PATCH V9 1/6] drm/xe: Add sysfs entries for engines under its GT Tejas Upadhyay
2023-07-27 14:41   ` Matthew Brost
2023-07-28 13:22     ` Upadhyay, Tejas
2023-07-27  8:22 ` [Intel-xe] [PATCH V9 2/6] drm/xe: Add sysfs for default engine scheduler properties Tejas Upadhyay
2023-07-27 14:47   ` Matthew Brost
2023-07-27  8:22 ` [Intel-xe] [PATCH V9 3/6] drm/xe: Add job timeout engine property to sysfs Tejas Upadhyay
2023-07-27 14:51   ` Matthew Brost
2023-07-27  8:22 ` [Intel-xe] [PATCH V9 4/6] drm/xe: Add timeslice duration " Tejas Upadhyay
2023-07-27 14:52   ` Matthew Brost
2023-07-27  8:22 ` [Intel-xe] [PATCH V9 5/6] drm/xe: Add sysfs for preempt reset timeout Tejas Upadhyay
2023-07-27 14:54   ` Matthew Brost
2023-07-27  8:22 ` [Intel-xe] [PATCH V9 6/6] drm/xe: Add min/max cap for engine scheduler properties Tejas Upadhyay
2023-07-27 15:26   ` Matthew Brost
2023-07-28  4:44     ` Niranjana Vishwanathapura
2023-07-28  5:04       ` Matthew Brost
2023-07-28  5:54         ` Upadhyay, Tejas
2023-07-28  6:25           ` Niranjana Vishwanathapura
2023-07-28  7:36             ` Upadhyay, Tejas
2023-07-28 14:24               ` Matthew Brost
2023-07-28 14:27                 ` Upadhyay, Tejas
2023-07-28 14:53                   ` Niranjana Vishwanathapura
2023-07-28 14:20             ` Matthew Brost
2023-07-27  8:59 ` [Intel-xe] ✓ CI.Patch_applied: success for drm/xe: Add engine scheduler control interface (rev9) Patchwork
2023-07-27  9:00 ` [Intel-xe] ✗ CI.checkpatch: warning " Patchwork
2023-07-27  9:01 ` [Intel-xe] ✓ CI.KUnit: success " Patchwork
2023-07-27  9:05 ` [Intel-xe] ✓ CI.Build: " Patchwork
2023-07-27  9:05 ` [Intel-xe] ✓ CI.Hooks: " Patchwork
2023-07-27  9:06 ` [Intel-xe] ✓ CI.checksparse: " Patchwork
2023-07-27  9:40 ` [Intel-xe] ○ CI.BAT: info " Patchwork

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