* [RFC 01/19] ptrace: export ptrace_may_access
2024-10-21 9:58 [RFC 00/19] Support EU online debug on pagefault Gwan-gyeong Mun
@ 2024-10-21 9:58 ` Gwan-gyeong Mun
2024-10-21 9:58 ` [RFC 02/19] drm/xe/eudebug: Introduce eudebug support Gwan-gyeong Mun
` (24 subsequent siblings)
25 siblings, 0 replies; 28+ messages in thread
From: Gwan-gyeong Mun @ 2024-10-21 9:58 UTC (permalink / raw)
To: intel-xe
Cc: nirmoy.das, matthew.brost, stuart.summers, christoph.manszewski,
mika.kuoppala, dominik.grzegorzek, andrzej.hajda,
maciej.patelczyk
From: Mika Kuoppala <mika.kuoppala@linux.intel.com>
xe driver would like to allow fine grained access control
for GDB debugger using ptrace. Without this export, the only
option would be to check for CAP_SYS_ADMIN.
The check intended for an ioctl to attach a GPU debugger
is similar to the ptrace use case: allow a calling process
to manipulate a target process if it has the necessary
capabilities or the same permissions, as described in
Documentation/process/adding-syscalls.rst.
Export ptrace_may_access function to allow GPU debugger to
have identical access control for debugger(s)
as a CPU debugger.
v2: proper commit message (Lucas)
Cc: Oleg Nesterov <oleg@redhat.com>
Cc: linux-kernel@vger.kernel.org
Cc: Dave Airlie <airlied@redhat.com>
CC: Lucas De Marchi <lucas.demarchi@intel.com>
Cc: Matthew Brost <matthew.brost@intel.com>
CC: Andi Shyti <andi.shyti@intel.com>
Cc: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
CC: Maciej Patelczyk <maciej.patelczyk@linux.intel.com>
Cc: Dominik Grzegorzek <dominik.grzegorzek@intel.com>
Signed-off-by: Mika Kuoppala <mika.kuoppala@linux.intel.com>
Signed-off-by: Jonathan Cavitt <jonathan.cavitt@intel.com>
Reviewed-by: Andi Shyti <andi.shyti@linux.intel.com>
Signed-off-by: Gwan-gyeong Mun <gwan-gyeong.mun@intel.com>
---
kernel/ptrace.c | 1 +
1 file changed, 1 insertion(+)
diff --git a/kernel/ptrace.c b/kernel/ptrace.c
index d5f89f9ef29f..86be1805ebd8 100644
--- a/kernel/ptrace.c
+++ b/kernel/ptrace.c
@@ -354,6 +354,7 @@ bool ptrace_may_access(struct task_struct *task, unsigned int mode)
task_unlock(task);
return !err;
}
+EXPORT_SYMBOL_GPL(ptrace_may_access);
static int check_ptrace_options(unsigned long data)
{
--
2.46.1
^ permalink raw reply related [flat|nested] 28+ messages in thread* [RFC 02/19] drm/xe/eudebug: Introduce eudebug support
2024-10-21 9:58 [RFC 00/19] Support EU online debug on pagefault Gwan-gyeong Mun
2024-10-21 9:58 ` [RFC 01/19] ptrace: export ptrace_may_access Gwan-gyeong Mun
@ 2024-10-21 9:58 ` Gwan-gyeong Mun
2024-10-21 9:58 ` [RFC 03/19] drm/xe/eudebug: Introduce discovery for resources Gwan-gyeong Mun
` (23 subsequent siblings)
25 siblings, 0 replies; 28+ messages in thread
From: Gwan-gyeong Mun @ 2024-10-21 9:58 UTC (permalink / raw)
To: intel-xe
Cc: nirmoy.das, matthew.brost, stuart.summers, christoph.manszewski,
mika.kuoppala, dominik.grzegorzek, andrzej.hajda,
maciej.patelczyk
From: Mika Kuoppala <mika.kuoppala@linux.intel.com>
With eudebug event interface, user space debugger process (like gdb)
is able to keep track of resources created by another process
(debuggee using drm/xe) and act upon these resources.
For example, debugger can find a client vm which contains isa/elf
for a particular shader/eu-kernel and then inspect and modify it
(for example installing a breakpoint).
Debugger first opens a connection to xe with a drm ioctl specifying
target pid to connect. This returns an anon fd handle that can then be
used to listen for events with dedicated ioctl.
This patch introduces eudebug connection and event queuing, adding
client create/destroy and vm create/destroy events as a baseline.
More events for full debugger operation are needed and
those will be introduced in follow up patches.
The resource tracking parts are inspired by the work of
Maciej Patelczyk on resource handling for i915. Chris Wilson
suggested improvement of two ways mapping which makes it easy to
use resource map as a definitive bookkeep of what resources
are played to debugger in the discovery phase (on follow up patch).
v2: - Kconfig support (Matthew)
- ptraced access control (Lucas)
- pass expected event length to user (Zbigniew)
- only track long running VMs
- checkpatch (Tilak)
- include order (Andrzej)
- 32bit fixes (Andrzej)
- cleaner get_task_struct
- remove xa_array and use clients.list for tracking (Mika)
v3: rebase (Gwan-gyeong)
Cc: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>
Cc: Lucas De Marchi <lucas.demarchi@intel.com>
Cc: Dominik Grzegorzek <dominik.grzegorzek@intel.com>
Cc: Andi Shyti <andi.shyti@linux.intel.com>
Cc: Matt Roper <matthew.d.roper@intel.com>
Cc: Matthew Brost <matthew.brost@intel.com>
Cc: Zbigniew Kempczyński <zbigniew.kempczynski@intel.com>
Cc: Andrzej Hajda <andrzej.hajda@intel.com>
Signed-off-by: Mika Kuoppala <mika.kuoppala@linux.intel.com>
Signed-off-by: Maciej Patelczyk <maciej.patelczyk@intel.com>
Signed-off-by: Dominik Grzegorzek <dominik.grzegorzek@intel.com>
Signed-off-by: Jonathan Cavitt <jonathan.cavitt@intel.com>
Signed-off-by: Gwan-gyeong Mun <gwan-gyeong.mun@intel.com>
---
drivers/gpu/drm/xe/Kconfig | 10 +
drivers/gpu/drm/xe/Makefile | 2 +
drivers/gpu/drm/xe/xe_device.c | 11 +
drivers/gpu/drm/xe/xe_device_types.h | 28 +
drivers/gpu/drm/xe/xe_eudebug.c | 1113 +++++++++++++++++++++++++
drivers/gpu/drm/xe/xe_eudebug.h | 46 +
drivers/gpu/drm/xe/xe_eudebug_types.h | 169 ++++
drivers/gpu/drm/xe/xe_vm.c | 7 +-
include/uapi/drm/xe_drm.h | 21 +
include/uapi/drm/xe_drm_eudebug.h | 56 ++
10 files changed, 1462 insertions(+), 1 deletion(-)
create mode 100644 drivers/gpu/drm/xe/xe_eudebug.c
create mode 100644 drivers/gpu/drm/xe/xe_eudebug.h
create mode 100644 drivers/gpu/drm/xe/xe_eudebug_types.h
create mode 100644 include/uapi/drm/xe_drm_eudebug.h
diff --git a/drivers/gpu/drm/xe/Kconfig b/drivers/gpu/drm/xe/Kconfig
index 7bbe46a98ff1..23f34e8e3151 100644
--- a/drivers/gpu/drm/xe/Kconfig
+++ b/drivers/gpu/drm/xe/Kconfig
@@ -85,6 +85,16 @@ config DRM_XE_FORCE_PROBE
Use "!*" to block the probe of the driver for all known devices.
+config DRM_XE_EUDEBUG
+ bool "Enable gdb debugger support (eudebug)"
+ depends on DRM_XE
+ default y
+ help
+ Choose this option if you want to add support for debugger (gdb) to
+ attach into process using Xe and debug the gpu/gpgpu programs.
+ With debugger support, Xe will provide interface for a debugger to
+ process to track, inspect and modify resources.
+
menu "drm/Xe Debugging"
depends on DRM_XE
depends on EXPERT
diff --git a/drivers/gpu/drm/xe/Makefile b/drivers/gpu/drm/xe/Makefile
index cb6c625bdef0..60cb35c393b1 100644
--- a/drivers/gpu/drm/xe/Makefile
+++ b/drivers/gpu/drm/xe/Makefile
@@ -114,6 +114,8 @@ xe-y += xe_bb.o \
xe_wa.o \
xe_wopcm.o
+xe-$(CONFIG_DRM_XE_EUDEBUG) += xe_eudebug.o
+
xe-$(CONFIG_HMM_MIRROR) += xe_hmm.o
# graphics hardware monitoring (HWMON) support
diff --git a/drivers/gpu/drm/xe/xe_device.c b/drivers/gpu/drm/xe/xe_device.c
index 2da4affe4dfd..40d514003eee 100644
--- a/drivers/gpu/drm/xe/xe_device.c
+++ b/drivers/gpu/drm/xe/xe_device.c
@@ -28,6 +28,7 @@
#include "xe_dma_buf.h"
#include "xe_drm_client.h"
#include "xe_drv.h"
+#include "xe_eudebug.h"
#include "xe_exec.h"
#include "xe_exec_queue.h"
#include "xe_force_wake.h"
@@ -102,6 +103,8 @@ static int xe_file_open(struct drm_device *dev, struct drm_file *file)
put_task_struct(task);
}
+ xe_eudebug_file_open(xef);
+
return 0;
}
@@ -160,6 +163,8 @@ static void xe_file_close(struct drm_device *dev, struct drm_file *file)
xe_pm_runtime_get(xe);
+ xe_eudebug_file_close(xef);
+
/*
* No need for exec_queue.lock here as there is no contention for it
* when FD is closing as IOCTLs presumably can't be modifying the
@@ -198,6 +203,7 @@ static const struct drm_ioctl_desc xe_ioctls[] = {
DRM_IOCTL_DEF_DRV(XE_WAIT_USER_FENCE, xe_wait_user_fence_ioctl,
DRM_RENDER_ALLOW),
DRM_IOCTL_DEF_DRV(XE_OBSERVATION, xe_observation_ioctl, DRM_RENDER_ALLOW),
+ DRM_IOCTL_DEF_DRV(XE_EUDEBUG_CONNECT, xe_eudebug_connect_ioctl, DRM_RENDER_ALLOW),
};
static long xe_drm_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
@@ -288,6 +294,8 @@ static void xe_device_destroy(struct drm_device *dev, void *dummy)
{
struct xe_device *xe = to_xe_device(dev);
+ xe_eudebug_fini(xe);
+
if (xe->preempt_fence_wq)
destroy_workqueue(xe->preempt_fence_wq);
@@ -360,7 +368,10 @@ struct xe_device *xe_device_create(struct pci_dev *pdev,
INIT_LIST_HEAD(&xe->pinned.external_vram);
INIT_LIST_HEAD(&xe->pinned.evicted);
+ xe_eudebug_init(xe);
+
xe->preempt_fence_wq = alloc_ordered_workqueue("xe-preempt-fence-wq", 0);
+
xe->ordered_wq = alloc_ordered_workqueue("xe-ordered-wq", 0);
xe->unordered_wq = alloc_workqueue("xe-unordered-wq", 0, 0);
xe->destroy_wq = alloc_workqueue("xe-destroy-wq", 0, 0);
diff --git a/drivers/gpu/drm/xe/xe_device_types.h b/drivers/gpu/drm/xe/xe_device_types.h
index 85bede4dd646..cb4b52888a4b 100644
--- a/drivers/gpu/drm/xe/xe_device_types.h
+++ b/drivers/gpu/drm/xe/xe_device_types.h
@@ -386,6 +386,11 @@ struct xe_device {
/** @clients.count: number of drm clients */
u64 count;
+
+#if IS_ENABLED(CONFIG_DRM_XE_EUDEBUG)
+ /** @xa: client list for eudebug discovery */
+ struct list_head list;
+#endif
} clients;
/** @usm: unified memory state */
@@ -524,6 +529,22 @@ struct xe_device {
u8 vm_inject_error_position;
#endif
+#if IS_ENABLED(CONFIG_DRM_XE_EUDEBUG)
+ /** @debugger connection list and globals for device */
+ struct {
+ /** @lock: protects the list of connections */
+ spinlock_t lock;
+ /** @list: list of connections, aka debuggers */
+ struct list_head list;
+
+ /** @session_count: session counter to track connections */
+ u64 session_count;
+
+ /** @available: is the debugging functionality available */
+ bool available;
+ } eudebug;
+#endif
+
/* private: */
#if IS_ENABLED(CONFIG_DRM_XE_DISPLAY)
@@ -636,6 +657,13 @@ struct xe_file {
/** @refcount: ref count of this xe file */
struct kref refcount;
+
+#if IS_ENABLED(CONFIG_DRM_XE_EUDEBUG)
+ struct {
+ /** @client_link: list entry in xe_device.clients.list */
+ struct list_head client_link;
+ } eudebug;
+#endif
};
#endif
diff --git a/drivers/gpu/drm/xe/xe_eudebug.c b/drivers/gpu/drm/xe/xe_eudebug.c
new file mode 100644
index 000000000000..da62f699f514
--- /dev/null
+++ b/drivers/gpu/drm/xe/xe_eudebug.c
@@ -0,0 +1,1113 @@
+// SPDX-License-Identifier: MIT
+/*
+ * Copyright © 2023 Intel Corporation
+ */
+
+#include <linux/anon_inodes.h>
+#include <linux/delay.h>
+#include <linux/poll.h>
+#include <linux/uaccess.h>
+
+#include <drm/drm_managed.h>
+
+#include "xe_assert.h"
+#include "xe_device.h"
+#include "xe_eudebug.h"
+#include "xe_eudebug_types.h"
+#include "xe_macros.h"
+#include "xe_vm.h"
+
+/*
+ * If there is no detected event read by userspace, during this period, assume
+ * userspace problem and disconnect debugger to allow forward progress.
+ */
+#define XE_EUDEBUG_NO_READ_DETECTED_TIMEOUT_MS (25 * 1000)
+
+#define for_each_debugger_rcu(debugger, head) \
+ list_for_each_entry_rcu((debugger), (head), connection_link)
+#define for_each_debugger(debugger, head) \
+ list_for_each_entry((debugger), (head), connection_link)
+
+#define cast_event(T, event) container_of((event), typeof(*(T)), base)
+
+#define XE_EUDEBUG_DBG_STR "eudbg: %lld:%lu:%s (%d/%d) -> (%d/%d): "
+#define XE_EUDEBUG_DBG_ARGS(d) (d)->session, \
+ atomic_long_read(&(d)->events.seqno), \
+ READ_ONCE(d->connection.status) <= 0 ? "disconnected" : "", \
+ current->pid, \
+ task_tgid_nr(current), \
+ (d)->target_task->pid, \
+ task_tgid_nr((d)->target_task)
+
+#define eu_err(d, fmt, ...) drm_err(&(d)->xe->drm, XE_EUDEBUG_DBG_STR # fmt, \
+ XE_EUDEBUG_DBG_ARGS(d), ##__VA_ARGS__)
+#define eu_warn(d, fmt, ...) drm_warn(&(d)->xe->drm, XE_EUDEBUG_DBG_STR # fmt, \
+ XE_EUDEBUG_DBG_ARGS(d), ##__VA_ARGS__)
+#define eu_dbg(d, fmt, ...) drm_dbg(&(d)->xe->drm, XE_EUDEBUG_DBG_STR # fmt, \
+ XE_EUDEBUG_DBG_ARGS(d), ##__VA_ARGS__)
+
+#define xe_eudebug_assert(d, ...) xe_assert((d)->xe, ##__VA_ARGS__)
+
+#define struct_member(T, member) (((T *)0)->member)
+
+/* Keep 1:1 parity with uapi events */
+#define write_member(T_out, ptr, member, value) { \
+ BUILD_BUG_ON(sizeof(*ptr) != sizeof(T_out)); \
+ BUILD_BUG_ON(offsetof(typeof(*ptr), member) != \
+ offsetof(typeof(T_out), member)); \
+ BUILD_BUG_ON(sizeof(ptr->member) != sizeof(value)); \
+ BUILD_BUG_ON(sizeof(struct_member(T_out, member)) != sizeof(value)); \
+ BUILD_BUG_ON(!typecheck(typeof((ptr)->member), value)); \
+ (ptr)->member = (value); \
+ }
+
+static struct xe_eudebug_event *
+event_fifo_pending(struct xe_eudebug *d)
+{
+ struct xe_eudebug_event *event;
+
+ if (kfifo_peek(&d->events.fifo, &event))
+ return event;
+
+ return NULL;
+}
+
+/*
+ * This is racy as we dont take the lock for read but all the
+ * callsites can handle the race so we can live without lock.
+ */
+__no_kcsan
+static unsigned int
+event_fifo_num_events_peek(const struct xe_eudebug * const d)
+{
+ return kfifo_len(&d->events.fifo);
+}
+
+static bool
+xe_eudebug_detached(struct xe_eudebug *d)
+{
+ int status;
+
+ spin_lock(&d->connection.lock);
+ status = d->connection.status;
+ spin_unlock(&d->connection.lock);
+
+ return status <= 0;
+}
+
+static int
+xe_eudebug_error(const struct xe_eudebug * const d)
+{
+ const int status = READ_ONCE(d->connection.status);
+
+ return status <= 0 ? status : 0;
+}
+
+static unsigned int
+event_fifo_has_events(struct xe_eudebug *d)
+{
+ if (xe_eudebug_detached(d))
+ return 1;
+
+ return event_fifo_num_events_peek(d);
+}
+
+static const struct rhashtable_params rhash_res = {
+ .head_offset = offsetof(struct xe_eudebug_handle, rh_head),
+ .key_len = sizeof_field(struct xe_eudebug_handle, key),
+ .key_offset = offsetof(struct xe_eudebug_handle, key),
+ .automatic_shrinking = true,
+};
+
+static struct xe_eudebug_resource *
+resource_from_type(struct xe_eudebug_resources * const res, const int t)
+{
+ return &res->rt[t];
+}
+
+static struct xe_eudebug_resources *
+xe_eudebug_resources_alloc(void)
+{
+ struct xe_eudebug_resources *res;
+ int err;
+ int i;
+
+ res = kzalloc(sizeof(*res), GFP_ATOMIC);
+ if (!res)
+ return ERR_PTR(-ENOMEM);
+
+ mutex_init(&res->lock);
+
+ for (i = 0; i < XE_EUDEBUG_RES_TYPE_COUNT; i++) {
+ xa_init_flags(&res->rt[i].xa, XA_FLAGS_ALLOC1);
+ err = rhashtable_init(&res->rt[i].rh, &rhash_res);
+
+ if (err)
+ break;
+ }
+
+ if (err) {
+ while (i--) {
+ xa_destroy(&res->rt[i].xa);
+ rhashtable_destroy(&res->rt[i].rh);
+ }
+
+ kfree(res);
+ return ERR_PTR(err);
+ }
+
+ return res;
+}
+
+static void res_free_fn(void *ptr, void *arg)
+{
+ XE_WARN_ON(ptr);
+ kfree(ptr);
+}
+
+static void
+xe_eudebug_destroy_resources(struct xe_eudebug *d)
+{
+ struct xe_eudebug_resources *res = d->res;
+ struct xe_eudebug_handle *h;
+ unsigned long j;
+ int i;
+ int err;
+
+ mutex_lock(&res->lock);
+ for (i = 0; i < XE_EUDEBUG_RES_TYPE_COUNT; i++) {
+ struct xe_eudebug_resource *r = &res->rt[i];
+
+ xa_for_each(&r->xa, j, h) {
+ struct xe_eudebug_handle *t;
+
+ err = rhashtable_remove_fast(&r->rh,
+ &h->rh_head,
+ rhash_res);
+ xe_eudebug_assert(d, !err);
+ t = xa_erase(&r->xa, h->id);
+ xe_eudebug_assert(d, t == h);
+ kfree(t);
+ }
+ }
+ mutex_unlock(&res->lock);
+
+ for (i = 0; i < XE_EUDEBUG_RES_TYPE_COUNT; i++) {
+ struct xe_eudebug_resource *r = &res->rt[i];
+
+ rhashtable_free_and_destroy(&r->rh, res_free_fn, NULL);
+ xe_eudebug_assert(d, xa_empty(&r->xa));
+ xa_destroy(&r->xa);
+ }
+
+ mutex_destroy(&res->lock);
+
+ kfree(res);
+}
+
+static void xe_eudebug_free(struct kref *ref)
+{
+ struct xe_eudebug *d = container_of(ref, typeof(*d), ref);
+ struct xe_eudebug_event *event;
+
+ while (kfifo_get(&d->events.fifo, &event))
+ kfree(event);
+
+ xe_eudebug_destroy_resources(d);
+ put_task_struct(d->target_task);
+
+ xe_eudebug_assert(d, !kfifo_len(&d->events.fifo));
+
+ kfree_rcu(d, rcu);
+}
+
+static void xe_eudebug_put(struct xe_eudebug *d)
+{
+ kref_put(&d->ref, xe_eudebug_free);
+}
+
+static struct task_struct *find_get_target(const pid_t nr)
+{
+ struct task_struct *task;
+
+ rcu_read_lock();
+ task = pid_task(find_pid_ns(nr, task_active_pid_ns(current)), PIDTYPE_PID);
+ if (task)
+ get_task_struct(task);
+ rcu_read_unlock();
+
+ return task;
+}
+
+static int
+xe_eudebug_attach(struct xe_device *xe, struct xe_eudebug *d,
+ const pid_t pid_nr)
+{
+ struct task_struct *target;
+ struct xe_eudebug *iter;
+ int ret = 0;
+
+ target = find_get_target(pid_nr);
+ if (!target)
+ return -ENOENT;
+
+ if (!ptrace_may_access(target, PTRACE_MODE_READ_REALCREDS)) {
+ put_task_struct(target);
+ return -EACCES;
+ }
+
+ XE_WARN_ON(d->connection.status != 0);
+
+ spin_lock(&xe->eudebug.lock);
+ for_each_debugger(iter, &xe->eudebug.list) {
+ if (!same_thread_group(iter->target_task, target))
+ continue;
+
+ ret = -EBUSY;
+ }
+
+ if (!ret && xe->eudebug.session_count + 1 == 0)
+ ret = -ENOSPC;
+
+ if (!ret) {
+ d->connection.status = XE_EUDEBUG_STATUS_CONNECTED;
+ d->xe = xe;
+ d->target_task = get_task_struct(target);
+ d->session = ++xe->eudebug.session_count;
+ kref_get(&d->ref);
+ list_add_tail_rcu(&d->connection_link, &xe->eudebug.list);
+ }
+ spin_unlock(&xe->eudebug.lock);
+
+ put_task_struct(target);
+
+ return ret;
+}
+
+static bool xe_eudebug_detach(struct xe_device *xe,
+ struct xe_eudebug *d,
+ const int err)
+{
+ bool detached = false;
+
+ XE_WARN_ON(err > 0);
+
+ spin_lock(&d->connection.lock);
+ if (d->connection.status == XE_EUDEBUG_STATUS_CONNECTED) {
+ d->connection.status = err;
+ detached = true;
+ }
+ spin_unlock(&d->connection.lock);
+
+ if (!detached)
+ return false;
+
+ spin_lock(&xe->eudebug.lock);
+ list_del_rcu(&d->connection_link);
+ spin_unlock(&xe->eudebug.lock);
+
+ eu_dbg(d, "session %lld detached with %d", d->session, err);
+
+ /* Our ref with the connection_link */
+ xe_eudebug_put(d);
+
+ return true;
+}
+
+static int _xe_eudebug_disconnect(struct xe_eudebug *d,
+ const int err)
+{
+ wake_up_all(&d->events.write_done);
+ wake_up_all(&d->events.read_done);
+
+ return xe_eudebug_detach(d->xe, d, err);
+}
+
+#define xe_eudebug_disconnect(_d, _err) ({ \
+ if (_xe_eudebug_disconnect((_d), (_err))) { \
+ if ((_err) == 0 || (_err) == -ETIMEDOUT) \
+ eu_dbg(d, "Session closed (%d)", (_err)); \
+ else \
+ eu_err(d, "Session disconnected, err = %d (%s:%d)", \
+ (_err), __func__, __LINE__); \
+ } \
+})
+
+static int xe_eudebug_release(struct inode *inode, struct file *file)
+{
+ struct xe_eudebug *d = file->private_data;
+
+ xe_eudebug_disconnect(d, 0);
+ xe_eudebug_put(d);
+
+ return 0;
+}
+
+static __poll_t xe_eudebug_poll(struct file *file, poll_table *wait)
+{
+ struct xe_eudebug * const d = file->private_data;
+ __poll_t ret = 0;
+
+ poll_wait(file, &d->events.write_done, wait);
+
+ if (xe_eudebug_detached(d)) {
+ ret |= EPOLLHUP;
+ if (xe_eudebug_error(d))
+ ret |= EPOLLERR;
+ }
+
+ if (event_fifo_num_events_peek(d))
+ ret |= EPOLLIN;
+
+ return ret;
+}
+
+static ssize_t xe_eudebug_read(struct file *file,
+ char __user *buf,
+ size_t count,
+ loff_t *ppos)
+{
+ return -EINVAL;
+}
+
+static struct xe_eudebug *
+xe_eudebug_for_task_get(struct xe_device *xe,
+ struct task_struct *task)
+{
+ struct xe_eudebug *d, *iter;
+
+ d = NULL;
+
+ rcu_read_lock();
+ for_each_debugger_rcu(iter, &xe->eudebug.list) {
+ if (!same_thread_group(iter->target_task, task))
+ continue;
+
+ if (kref_get_unless_zero(&iter->ref))
+ d = iter;
+
+ break;
+ }
+ rcu_read_unlock();
+
+ return d;
+}
+
+static struct task_struct *find_task_get(struct xe_file *xef)
+{
+ struct task_struct *task;
+ struct pid *pid;
+
+ rcu_read_lock();
+ pid = rcu_dereference(xef->drm->pid);
+ task = pid_task(pid, PIDTYPE_PID);
+ if (task)
+ get_task_struct(task);
+ rcu_read_unlock();
+
+ return task;
+}
+
+static struct xe_eudebug *
+xe_eudebug_get(struct xe_file *xef)
+{
+ struct task_struct *task;
+ struct xe_eudebug *d;
+
+ d = NULL;
+ task = find_task_get(xef);
+ if (task) {
+ d = xe_eudebug_for_task_get(to_xe_device(xef->drm->minor->dev),
+ task);
+ put_task_struct(task);
+ }
+
+ if (!d)
+ return NULL;
+
+ if (xe_eudebug_detached(d)) {
+ xe_eudebug_put(d);
+ return NULL;
+ }
+
+ return d;
+}
+
+static int xe_eudebug_queue_event(struct xe_eudebug *d,
+ struct xe_eudebug_event *event)
+{
+ const u64 wait_jiffies = msecs_to_jiffies(1000);
+ u64 last_read_detected_ts, last_head_seqno, start_ts;
+
+ xe_eudebug_assert(d, event->len > sizeof(struct xe_eudebug_event));
+ xe_eudebug_assert(d, event->type);
+ xe_eudebug_assert(d, event->type != DRM_XE_EUDEBUG_EVENT_READ);
+
+ start_ts = ktime_get();
+ last_read_detected_ts = start_ts;
+ last_head_seqno = 0;
+
+ do {
+ struct xe_eudebug_event *head;
+ u64 head_seqno;
+ bool was_queued;
+
+ if (xe_eudebug_detached(d))
+ break;
+
+ spin_lock(&d->events.lock);
+ head = event_fifo_pending(d);
+ if (head)
+ head_seqno = event->seqno;
+ else
+ head_seqno = 0;
+
+ was_queued = kfifo_in(&d->events.fifo, &event, 1);
+ spin_unlock(&d->events.lock);
+
+ wake_up_all(&d->events.write_done);
+
+ if (was_queued) {
+ event = NULL;
+ break;
+ }
+
+ XE_WARN_ON(!head_seqno);
+
+ /* If we detect progress, restart timeout */
+ if (last_head_seqno != head_seqno)
+ last_read_detected_ts = ktime_get();
+
+ last_head_seqno = head_seqno;
+
+ wait_event_interruptible_timeout(d->events.read_done,
+ !kfifo_is_full(&d->events.fifo),
+ wait_jiffies);
+
+ } while (ktime_ms_delta(ktime_get(), last_read_detected_ts) <
+ XE_EUDEBUG_NO_READ_DETECTED_TIMEOUT_MS);
+
+ if (event) {
+ eu_dbg(d,
+ "event %llu queue failed (blocked %lld ms, avail %d)",
+ event ? event->seqno : 0,
+ ktime_ms_delta(ktime_get(), start_ts),
+ kfifo_avail(&d->events.fifo));
+
+ kfree(event);
+
+ return -ETIMEDOUT;
+ }
+
+ return 0;
+}
+
+static struct xe_eudebug_handle *
+alloc_handle(const int type, const u64 key)
+{
+ struct xe_eudebug_handle *h;
+
+ h = kzalloc(sizeof(*h), GFP_ATOMIC);
+ if (!h)
+ return NULL;
+
+ h->key = key;
+
+ return h;
+}
+
+static struct xe_eudebug_handle *
+__find_handle(struct xe_eudebug_resource *r,
+ const u64 key)
+{
+ struct xe_eudebug_handle *h;
+
+ h = rhashtable_lookup_fast(&r->rh,
+ &key,
+ rhash_res);
+ return h;
+}
+
+static int find_handle(struct xe_eudebug_resources *res,
+ const int type,
+ const void *p)
+{
+ const u64 key = (uintptr_t)p;
+ struct xe_eudebug_resource *r;
+ struct xe_eudebug_handle *h;
+ int id;
+
+ if (XE_WARN_ON(!key))
+ return -EINVAL;
+
+ r = resource_from_type(res, type);
+
+ mutex_lock(&res->lock);
+ h = __find_handle(r, key);
+ id = h ? h->id : -ENOENT;
+ mutex_unlock(&res->lock);
+
+ return id;
+}
+
+static int _xe_eudebug_add_handle(struct xe_eudebug *d,
+ int type,
+ void *p,
+ u64 *seqno,
+ int *handle)
+{
+ const u64 key = (uintptr_t)p;
+ struct xe_eudebug_resource *r;
+ struct xe_eudebug_handle *h, *o;
+ int err;
+
+ if (XE_WARN_ON(!p))
+ return -EINVAL;
+
+ if (xe_eudebug_detached(d))
+ return -ENOTCONN;
+
+ h = alloc_handle(type, key);
+ if (!h)
+ return -ENOMEM;
+
+ r = resource_from_type(d->res, type);
+
+ mutex_lock(&d->res->lock);
+ o = __find_handle(r, key);
+ if (!o) {
+ err = xa_alloc(&r->xa, &h->id, h, xa_limit_31b, GFP_KERNEL);
+
+ if (h->id >= INT_MAX) {
+ xa_erase(&r->xa, h->id);
+ err = -ENOSPC;
+ }
+
+ if (!err)
+ err = rhashtable_insert_fast(&r->rh,
+ &h->rh_head,
+ rhash_res);
+
+ if (err) {
+ xa_erase(&r->xa, h->id);
+ } else {
+ if (seqno)
+ *seqno = atomic_long_inc_return(&d->events.seqno);
+ }
+ } else {
+ xe_eudebug_assert(d, o->id);
+ err = -EEXIST;
+ }
+ mutex_unlock(&d->res->lock);
+
+ if (handle)
+ *handle = o ? o->id : h->id;
+
+ if (err) {
+ kfree(h);
+ XE_WARN_ON(err > 0);
+ return err;
+ }
+
+ xe_eudebug_assert(d, h->id);
+
+ return h->id;
+}
+
+static int xe_eudebug_add_handle(struct xe_eudebug *d,
+ int type,
+ void *p,
+ u64 *seqno)
+{
+ int ret;
+
+ ret = _xe_eudebug_add_handle(d, type, p, seqno, NULL);
+ if (ret == -EEXIST || ret == -ENOTCONN) {
+ eu_dbg(d, "%d on adding %d", ret, type);
+ return 0;
+ }
+
+ if (ret < 0)
+ xe_eudebug_disconnect(d, ret);
+
+ return ret;
+}
+
+static int _xe_eudebug_remove_handle(struct xe_eudebug *d, int type, void *p,
+ u64 *seqno)
+{
+ const u64 key = (uintptr_t)p;
+ struct xe_eudebug_resource *r;
+ struct xe_eudebug_handle *h, *xa_h;
+ int ret;
+
+ if (XE_WARN_ON(!key))
+ return -EINVAL;
+
+ if (xe_eudebug_detached(d))
+ return -ENOTCONN;
+
+ r = resource_from_type(d->res, type);
+
+ mutex_lock(&d->res->lock);
+ h = __find_handle(r, key);
+ if (h) {
+ ret = rhashtable_remove_fast(&r->rh,
+ &h->rh_head,
+ rhash_res);
+ xe_eudebug_assert(d, !ret);
+ xa_h = xa_erase(&r->xa, h->id);
+ xe_eudebug_assert(d, xa_h == h);
+ if (!ret) {
+ ret = h->id;
+ if (seqno)
+ *seqno = atomic_long_inc_return(&d->events.seqno);
+ }
+ } else {
+ ret = -ENOENT;
+ }
+ mutex_unlock(&d->res->lock);
+
+ kfree(h);
+
+ xe_eudebug_assert(d, ret);
+
+ return ret;
+}
+
+static int xe_eudebug_remove_handle(struct xe_eudebug *d, int type, void *p,
+ u64 *seqno)
+{
+ int ret;
+
+ ret = _xe_eudebug_remove_handle(d, type, p, seqno);
+ if (ret == -ENOENT || ret == -ENOTCONN) {
+ eu_dbg(d, "%d on removing %d", ret, type);
+ return 0;
+ }
+
+ if (ret < 0)
+ xe_eudebug_disconnect(d, ret);
+
+ return ret;
+}
+
+static struct xe_eudebug_event *
+__xe_eudebug_create_event(struct xe_eudebug *d,
+ u64 seqno, u16 type, u16 flags, u32 len, gfp_t gfp)
+{
+ struct xe_eudebug_event *event;
+
+ xe_eudebug_assert(d, len > sizeof(*event));
+
+ event = kzalloc(len, gfp);
+ if (!event)
+ return NULL;
+
+ event->type = type;
+ event->flags = flags;
+ event->len = len;
+ event->seqno = seqno;
+
+ return event;
+}
+
+static struct xe_eudebug_event *
+xe_eudebug_create_event(struct xe_eudebug *d, u16 type, u64 seqno, u16 flags,
+ u32 len, gfp_t gfp)
+{
+ return __xe_eudebug_create_event(d, seqno, type, flags, len, gfp);
+}
+
+static long xe_eudebug_read_event(struct xe_eudebug *d,
+ const u64 arg,
+ const bool wait)
+{
+ struct xe_device *xe = d->xe;
+ struct drm_xe_eudebug_event __user * const user_orig =
+ u64_to_user_ptr(arg);
+ struct drm_xe_eudebug_event user_event;
+ struct xe_eudebug_event *event;
+ const unsigned int max_event = DRM_XE_EUDEBUG_EVENT_VM;
+ long ret = 0;
+
+ if (XE_IOCTL_DBG(xe, copy_from_user(&user_event, user_orig, sizeof(user_event))))
+ return -EFAULT;
+
+ if (XE_IOCTL_DBG(xe, !user_event.type))
+ return -EINVAL;
+
+ if (XE_IOCTL_DBG(xe, user_event.type > max_event))
+ return -EINVAL;
+
+ if (XE_IOCTL_DBG(xe, user_event.type != DRM_XE_EUDEBUG_EVENT_READ))
+ return -EINVAL;
+
+ if (XE_IOCTL_DBG(xe, user_event.len < sizeof(*user_orig)))
+ return -EINVAL;
+
+ if (XE_IOCTL_DBG(xe, user_event.flags))
+ return -EINVAL;
+
+ if (XE_IOCTL_DBG(xe, user_event.reserved))
+ return -EINVAL;
+
+ /* XXX: define wait time in connect arguments ? */
+ if (wait) {
+ ret = wait_event_interruptible_timeout(d->events.write_done,
+ event_fifo_has_events(d),
+ msecs_to_jiffies(5 * 1000));
+
+ if (XE_IOCTL_DBG(xe, ret < 0))
+ return ret;
+ }
+
+ ret = 0;
+ spin_lock(&d->events.lock);
+ event = event_fifo_pending(d);
+ if (event) {
+ if (user_event.len < event->len) {
+ ret = -EMSGSIZE;
+ } else if (!kfifo_out(&d->events.fifo, &event, 1)) {
+ eu_warn(d, "internal fifo corruption");
+ ret = -ENOTCONN;
+ }
+ }
+ spin_unlock(&d->events.lock);
+
+ wake_up_all(&d->events.read_done);
+
+ if (ret == -EMSGSIZE && put_user(event->len, &user_orig->len))
+ ret = -EFAULT;
+
+ if (XE_IOCTL_DBG(xe, ret))
+ return ret;
+
+ if (!event) {
+ if (xe_eudebug_detached(d))
+ return -ENOTCONN;
+ if (!wait)
+ return -EAGAIN;
+
+ return -ENOENT;
+ }
+
+ if (copy_to_user(user_orig, event, event->len))
+ ret = -EFAULT;
+ else
+ eu_dbg(d, "event read: type=%u, flags=0x%x, seqno=%llu", event->type,
+ event->flags, event->seqno);
+
+ kfree(event);
+
+ return ret;
+}
+
+static long xe_eudebug_ioctl(struct file *file,
+ unsigned int cmd,
+ unsigned long arg)
+{
+ struct xe_eudebug * const d = file->private_data;
+ long ret;
+
+ switch (cmd) {
+ case DRM_XE_EUDEBUG_IOCTL_READ_EVENT:
+ ret = xe_eudebug_read_event(d, arg,
+ !(file->f_flags & O_NONBLOCK));
+ break;
+
+ default:
+ ret = -EINVAL;
+ }
+
+ return ret;
+}
+
+static const struct file_operations fops = {
+ .owner = THIS_MODULE,
+ .release = xe_eudebug_release,
+ .poll = xe_eudebug_poll,
+ .read = xe_eudebug_read,
+ .unlocked_ioctl = xe_eudebug_ioctl,
+};
+
+static int
+xe_eudebug_connect(struct xe_device *xe,
+ struct drm_xe_eudebug_connect *param)
+{
+ const u64 known_open_flags = 0;
+ unsigned long f_flags = 0;
+ struct xe_eudebug *d;
+ int fd, err;
+
+ if (param->extensions)
+ return -EINVAL;
+
+ if (!param->pid)
+ return -EINVAL;
+
+ if (param->flags & ~known_open_flags)
+ return -EINVAL;
+
+ if (param->version && param->version != DRM_XE_EUDEBUG_VERSION)
+ return -EINVAL;
+
+ param->version = DRM_XE_EUDEBUG_VERSION;
+
+ if (!xe->eudebug.available)
+ return -EOPNOTSUPP;
+
+ d = kzalloc(sizeof(*d), GFP_KERNEL);
+ if (!d)
+ return -ENOMEM;
+
+ kref_init(&d->ref);
+ spin_lock_init(&d->connection.lock);
+ init_waitqueue_head(&d->events.write_done);
+ init_waitqueue_head(&d->events.read_done);
+
+ spin_lock_init(&d->events.lock);
+ INIT_KFIFO(d->events.fifo);
+
+ d->res = xe_eudebug_resources_alloc();
+ if (IS_ERR(d->res)) {
+ err = PTR_ERR(d->res);
+ goto err_free;
+ }
+
+ err = xe_eudebug_attach(xe, d, param->pid);
+ if (err)
+ goto err_free_res;
+
+ fd = anon_inode_getfd("[xe_eudebug]", &fops, d, f_flags);
+ if (fd < 0) {
+ err = fd;
+ goto err_detach;
+ }
+
+ eu_dbg(d, "connected session %lld", d->session);
+
+ return fd;
+
+err_detach:
+ xe_eudebug_detach(xe, d, err);
+err_free_res:
+ xe_eudebug_destroy_resources(d);
+err_free:
+ kfree(d);
+
+ return err;
+}
+
+int xe_eudebug_connect_ioctl(struct drm_device *dev,
+ void *data,
+ struct drm_file *file)
+{
+ struct xe_device *xe = to_xe_device(dev);
+ struct drm_xe_eudebug_connect * const param = data;
+ int ret = 0;
+
+ ret = xe_eudebug_connect(xe, param);
+
+ return ret;
+}
+
+void xe_eudebug_init(struct xe_device *xe)
+{
+ spin_lock_init(&xe->eudebug.lock);
+ INIT_LIST_HEAD(&xe->eudebug.list);
+ INIT_LIST_HEAD(&xe->clients.list);
+
+ xe->eudebug.available = true;
+}
+
+void xe_eudebug_fini(struct xe_device *xe)
+{
+ xe_assert(xe, list_empty_careful(&xe->eudebug.list));
+}
+
+static int send_open_event(struct xe_eudebug *d, u32 flags, const u64 handle,
+ const u64 seqno)
+{
+ struct xe_eudebug_event *event;
+ struct xe_eudebug_event_open *eo;
+
+ if (!handle)
+ return -EINVAL;
+
+ if (XE_WARN_ON((long)handle >= INT_MAX))
+ return -EINVAL;
+
+ event = xe_eudebug_create_event(d, DRM_XE_EUDEBUG_EVENT_OPEN, seqno,
+ flags, sizeof(*eo), GFP_KERNEL);
+ if (!event)
+ return -ENOMEM;
+
+ eo = cast_event(eo, event);
+
+ write_member(struct drm_xe_eudebug_event_client, eo,
+ client_handle, handle);
+
+ return xe_eudebug_queue_event(d, event);
+}
+
+static int client_create_event(struct xe_eudebug *d, struct xe_file *xef)
+{
+ u64 seqno;
+ int ret;
+
+ ret = xe_eudebug_add_handle(d, XE_EUDEBUG_RES_TYPE_CLIENT, xef, &seqno);
+ if (ret > 0)
+ ret = send_open_event(d, DRM_XE_EUDEBUG_EVENT_CREATE,
+ ret, seqno);
+
+ return ret;
+}
+
+static int client_destroy_event(struct xe_eudebug *d, struct xe_file *xef)
+{
+ u64 seqno;
+ int ret;
+
+ ret = xe_eudebug_remove_handle(d, XE_EUDEBUG_RES_TYPE_CLIENT,
+ xef, &seqno);
+ if (ret > 0)
+ ret = send_open_event(d, DRM_XE_EUDEBUG_EVENT_DESTROY,
+ ret, seqno);
+
+ return ret;
+}
+
+#define xe_eudebug_event_put(_d, _err) ({ \
+ if ((_err)) \
+ xe_eudebug_disconnect((_d), (_err)); \
+ xe_eudebug_put((_d)); \
+ })
+
+void xe_eudebug_file_open(struct xe_file *xef)
+{
+ struct xe_eudebug *d;
+
+ INIT_LIST_HEAD(&xef->eudebug.client_link);
+ spin_lock(&xef->xe->clients.lock);
+ list_add_tail(&xef->eudebug.client_link, &xef->xe->clients.list);
+ spin_unlock(&xef->xe->clients.lock);
+
+ d = xe_eudebug_get(xef);
+ if (!d)
+ return;
+
+ xe_eudebug_event_put(d, client_create_event(d, xef));
+}
+
+void xe_eudebug_file_close(struct xe_file *xef)
+{
+ struct xe_eudebug *d;
+
+ d = xe_eudebug_get(xef);
+ if (d)
+ xe_eudebug_event_put(d, client_destroy_event(d, xef));
+
+ spin_lock(&xef->xe->clients.lock);
+ list_del_init(&xef->eudebug.client_link);
+ spin_unlock(&xef->xe->clients.lock);
+}
+
+static int send_vm_event(struct xe_eudebug *d, u32 flags,
+ const u64 client_handle,
+ const u64 vm_handle,
+ const u64 seqno)
+{
+ struct xe_eudebug_event *event;
+ struct xe_eudebug_event_vm *e;
+
+ event = xe_eudebug_create_event(d, DRM_XE_EUDEBUG_EVENT_VM,
+ seqno, flags, sizeof(*e), GFP_KERNEL);
+ if (!event)
+ return -ENOMEM;
+
+ e = cast_event(e, event);
+
+ write_member(struct drm_xe_eudebug_event_vm, e, client_handle, client_handle);
+ write_member(struct drm_xe_eudebug_event_vm, e, vm_handle, vm_handle);
+
+ return xe_eudebug_queue_event(d, event);
+}
+
+static int vm_create_event(struct xe_eudebug *d,
+ struct xe_file *xef, struct xe_vm *vm)
+{
+ int h_c, h_vm;
+ u64 seqno;
+ int ret;
+
+ if (!xe_vm_in_lr_mode(vm))
+ return 0;
+
+ h_c = find_handle(d->res, XE_EUDEBUG_RES_TYPE_CLIENT, xef);
+ if (h_c < 0)
+ return h_c;
+
+ xe_eudebug_assert(d, h_c);
+
+ h_vm = xe_eudebug_add_handle(d, XE_EUDEBUG_RES_TYPE_VM, vm, &seqno);
+ if (h_vm <= 0)
+ return h_vm;
+
+ ret = send_vm_event(d, DRM_XE_EUDEBUG_EVENT_CREATE, h_c, h_vm, seqno);
+
+ return ret;
+}
+
+static int vm_destroy_event(struct xe_eudebug *d,
+ struct xe_file *xef, struct xe_vm *vm)
+{
+ int h_c, h_vm;
+ u64 seqno;
+
+ if (!xe_vm_in_lr_mode(vm))
+ return 0;
+
+ h_c = find_handle(d->res, XE_EUDEBUG_RES_TYPE_CLIENT, xef);
+ if (h_c < 0) {
+ XE_WARN_ON("no client found for vm");
+ eu_warn(d, "no client found for vm");
+ return h_c;
+ }
+
+ xe_eudebug_assert(d, h_c);
+
+ h_vm = xe_eudebug_remove_handle(d, XE_EUDEBUG_RES_TYPE_VM, vm, &seqno);
+ if (h_vm <= 0)
+ return h_vm;
+
+ return send_vm_event(d, DRM_XE_EUDEBUG_EVENT_DESTROY, h_c, h_vm, seqno);
+}
+
+void xe_eudebug_vm_create(struct xe_file *xef, struct xe_vm *vm)
+{
+ struct xe_eudebug *d;
+
+ if (!xe_vm_in_lr_mode(vm))
+ return;
+
+ d = xe_eudebug_get(xef);
+ if (!d)
+ return;
+
+ xe_eudebug_event_put(d, vm_create_event(d, xef, vm));
+}
+
+void xe_eudebug_vm_destroy(struct xe_file *xef, struct xe_vm *vm)
+{
+ struct xe_eudebug *d;
+
+ if (!xe_vm_in_lr_mode(vm))
+ return;
+
+ d = xe_eudebug_get(xef);
+ if (!d)
+ return;
+
+ xe_eudebug_event_put(d, vm_destroy_event(d, xef, vm));
+}
diff --git a/drivers/gpu/drm/xe/xe_eudebug.h b/drivers/gpu/drm/xe/xe_eudebug.h
new file mode 100644
index 000000000000..e3247365f72f
--- /dev/null
+++ b/drivers/gpu/drm/xe/xe_eudebug.h
@@ -0,0 +1,46 @@
+/* SPDX-License-Identifier: MIT */
+/*
+ * Copyright © 2023 Intel Corporation
+ */
+
+#ifndef _XE_EUDEBUG_H_
+
+struct drm_device;
+struct drm_file;
+struct xe_device;
+struct xe_file;
+struct xe_vm;
+
+#if IS_ENABLED(CONFIG_DRM_XE_EUDEBUG)
+
+int xe_eudebug_connect_ioctl(struct drm_device *dev,
+ void *data,
+ struct drm_file *file);
+
+void xe_eudebug_init(struct xe_device *xe);
+void xe_eudebug_fini(struct xe_device *xe);
+
+void xe_eudebug_file_open(struct xe_file *xef);
+void xe_eudebug_file_close(struct xe_file *xef);
+
+void xe_eudebug_vm_create(struct xe_file *xef, struct xe_vm *vm);
+void xe_eudebug_vm_destroy(struct xe_file *xef, struct xe_vm *vm);
+
+#else
+
+static inline int xe_eudebug_connect_ioctl(struct drm_device *dev,
+ void *data,
+ struct drm_file *file) { return 0; }
+
+static inline void xe_eudebug_init(struct xe_device *xe) { }
+static inline void xe_eudebug_fini(struct xe_device *xe) { }
+
+static inline void xe_eudebug_file_open(struct xe_file *xef) { }
+static inline void xe_eudebug_file_close(struct xe_file *xef) { }
+
+static inline void xe_eudebug_vm_create(struct xe_file *xef, struct xe_vm *vm) { }
+static inline void xe_eudebug_vm_destroy(struct xe_file *xef, struct xe_vm *vm) { }
+
+#endif /* CONFIG_DRM_XE_EUDEBUG */
+
+#endif
diff --git a/drivers/gpu/drm/xe/xe_eudebug_types.h b/drivers/gpu/drm/xe/xe_eudebug_types.h
new file mode 100644
index 000000000000..a5185f18f640
--- /dev/null
+++ b/drivers/gpu/drm/xe/xe_eudebug_types.h
@@ -0,0 +1,169 @@
+/* SPDX-License-Identifier: MIT */
+/*
+ * Copyright © 2023 Intel Corporation
+ */
+
+#ifndef __XE_EUDEBUG_TYPES_H_
+
+#include <linux/completion.h>
+#include <linux/kfifo.h>
+#include <linux/kref.h>
+#include <linux/mutex.h>
+#include <linux/rbtree.h>
+#include <linux/rhashtable.h>
+#include <linux/wait.h>
+#include <linux/xarray.h>
+
+#include <uapi/drm/xe_drm.h>
+
+struct xe_device;
+struct task_struct;
+struct xe_eudebug_event;
+
+#define CONFIG_DRM_XE_DEBUGGER_EVENT_QUEUE_SIZE 64
+
+/**
+ * struct xe_eudebug_handle - eudebug resource handle
+ */
+struct xe_eudebug_handle {
+ /** @key: key value in rhashtable <key:id> */
+ u64 key;
+
+ /** @id: opaque handle id for xarray <id:key> */
+ int id;
+
+ /** @rh_head: rhashtable head */
+ struct rhash_head rh_head;
+};
+
+/**
+ * struct xe_eudebug_resource - Resource map for one resource
+ */
+struct xe_eudebug_resource {
+ /** @xa: xarrays for <id->key> */
+ struct xarray xa;
+
+ /** @rh rhashtable for <key->id> */
+ struct rhashtable rh;
+};
+
+#define XE_EUDEBUG_RES_TYPE_CLIENT 0
+#define XE_EUDEBUG_RES_TYPE_VM 1
+#define XE_EUDEBUG_RES_TYPE_COUNT (XE_EUDEBUG_RES_TYPE_VM + 1)
+
+/**
+ * struct xe_eudebug_resources - eudebug resources for all types
+ */
+struct xe_eudebug_resources {
+ /** @lock: guards access into rt */
+ struct mutex lock;
+
+ /** @rt: resource maps for all types */
+ struct xe_eudebug_resource rt[XE_EUDEBUG_RES_TYPE_COUNT];
+};
+
+/**
+ * struct xe_eudebug - Top level struct for eudebug: the connection
+ */
+struct xe_eudebug {
+ /** @ref: kref counter for this struct */
+ struct kref ref;
+
+ /** @rcu: rcu_head for rcu destruction */
+ struct rcu_head rcu;
+
+ /** @connection_link: our link into the xe_device:eudebug.list */
+ struct list_head connection_link;
+
+ struct {
+ /** @status: connected = 1, disconnected = error */
+#define XE_EUDEBUG_STATUS_CONNECTED 1
+ int status;
+
+ /** @lock: guards access to status */
+ spinlock_t lock;
+ } connection;
+
+ /** @xe: the parent device we are serving */
+ struct xe_device *xe;
+
+ /** @target_task: the task that we are debugging */
+ struct task_struct *target_task;
+
+ /** @res: the resource maps we track for target_task */
+ struct xe_eudebug_resources *res;
+
+ /** @session: session number for this connection (for logs) */
+ u64 session;
+
+ /** @events: kfifo queue of to-be-delivered events */
+ struct {
+ /** @lock: guards access to fifo */
+ spinlock_t lock;
+
+ /** @fifo: queue of events pending */
+ DECLARE_KFIFO(fifo,
+ struct xe_eudebug_event *,
+ CONFIG_DRM_XE_DEBUGGER_EVENT_QUEUE_SIZE);
+
+ /** @write_done: waitqueue for signalling write to fifo */
+ wait_queue_head_t write_done;
+
+ /** @read_done: waitqueue for signalling read from fifo */
+ wait_queue_head_t read_done;
+
+ /** @event_seqno: seqno counter to stamp events for fifo */
+ atomic_long_t seqno;
+ } events;
+
+};
+
+/**
+ * struct xe_eudebug_event - Internal base event struct for eudebug
+ */
+struct xe_eudebug_event {
+ /** @len: length of this event, including payload */
+ u32 len;
+
+ /** @type: message type */
+ u16 type;
+
+ /** @flags: message flags */
+ u16 flags;
+
+ /** @seqno: sequence number for ordering */
+ u64 seqno;
+
+ /** @reserved: reserved field MBZ */
+ u64 reserved;
+
+ /** @data: payload bytes */
+ u8 data[];
+};
+
+/**
+ * struct xe_eudebug_event_open - Internal event for client open/close
+ */
+struct xe_eudebug_event_open {
+ /** @base: base event */
+ struct xe_eudebug_event base;
+
+ /** @client_handle: opaque handle for client */
+ u64 client_handle;
+};
+
+/**
+ * struct xe_eudebug_event_vm - Internal event for vm open/close
+ */
+struct xe_eudebug_event_vm {
+ /** @base: base event */
+ struct xe_eudebug_event base;
+
+ /** @client_handle: client containing the vm open/close */
+ u64 client_handle;
+
+ /** @vm_handle: vm handle it's open/close */
+ u64 vm_handle;
+};
+
+#endif
diff --git a/drivers/gpu/drm/xe/xe_vm.c b/drivers/gpu/drm/xe/xe_vm.c
index c99380271de6..034e17d039ec 100644
--- a/drivers/gpu/drm/xe/xe_vm.c
+++ b/drivers/gpu/drm/xe/xe_vm.c
@@ -26,6 +26,7 @@
#include "xe_bo.h"
#include "xe_device.h"
#include "xe_drm_client.h"
+#include "xe_eudebug.h"
#include "xe_exec_queue.h"
#include "xe_gt_pagefault.h"
#include "xe_gt_tlb_invalidation.h"
@@ -1796,6 +1797,8 @@ int xe_vm_create_ioctl(struct drm_device *dev, void *data,
args->vm_id = id;
+ xe_eudebug_vm_create(xef, vm);
+
return 0;
err_close_and_put:
@@ -1827,8 +1830,10 @@ int xe_vm_destroy_ioctl(struct drm_device *dev, void *data,
xa_erase(&xef->vm.xa, args->vm_id);
mutex_unlock(&xef->vm.lock);
- if (!err)
+ if (!err) {
+ xe_eudebug_vm_destroy(xef, vm);
xe_vm_close_and_put(vm);
+ }
return err;
}
diff --git a/include/uapi/drm/xe_drm.h b/include/uapi/drm/xe_drm.h
index c4182e95a619..29a8366089a9 100644
--- a/include/uapi/drm/xe_drm.h
+++ b/include/uapi/drm/xe_drm.h
@@ -102,6 +102,7 @@ extern "C" {
#define DRM_XE_EXEC 0x09
#define DRM_XE_WAIT_USER_FENCE 0x0a
#define DRM_XE_OBSERVATION 0x0b
+#define DRM_XE_EUDEBUG_CONNECT 0x0c
/* Must be kept compact -- no holes */
@@ -117,6 +118,7 @@ extern "C" {
#define DRM_IOCTL_XE_EXEC DRM_IOW(DRM_COMMAND_BASE + DRM_XE_EXEC, struct drm_xe_exec)
#define DRM_IOCTL_XE_WAIT_USER_FENCE DRM_IOWR(DRM_COMMAND_BASE + DRM_XE_WAIT_USER_FENCE, struct drm_xe_wait_user_fence)
#define DRM_IOCTL_XE_OBSERVATION DRM_IOW(DRM_COMMAND_BASE + DRM_XE_OBSERVATION, struct drm_xe_observation_param)
+#define DRM_IOCTL_XE_EUDEBUG_CONNECT DRM_IOWR(DRM_COMMAND_BASE + DRM_XE_EUDEBUG_CONNECT, struct drm_xe_eudebug_connect)
/**
* DOC: Xe IOCTL Extensions
@@ -1696,6 +1698,25 @@ struct drm_xe_oa_stream_info {
__u64 reserved[3];
};
+/*
+ * Debugger ABI (ioctl and events) Version History:
+ * 0 - No debugger available
+ * 1 - Initial version
+ */
+#define DRM_XE_EUDEBUG_VERSION 1
+
+struct drm_xe_eudebug_connect {
+ /** @extensions: Pointer to the first extension struct, if any */
+ __u64 extensions;
+
+ __u64 pid; /* input: Target process ID */
+ __u32 flags; /* MBZ */
+
+ __u32 version; /* output: current ABI (ioctl / events) version */
+};
+
+#include "xe_drm_eudebug.h"
+
#if defined(__cplusplus)
}
#endif
diff --git a/include/uapi/drm/xe_drm_eudebug.h b/include/uapi/drm/xe_drm_eudebug.h
new file mode 100644
index 000000000000..acf6071c82bf
--- /dev/null
+++ b/include/uapi/drm/xe_drm_eudebug.h
@@ -0,0 +1,56 @@
+/* SPDX-License-Identifier: MIT */
+/*
+ * Copyright © 2023 Intel Corporation
+ */
+
+#ifndef _UAPI_XE_DRM_EUDEBUG_H_
+#define _UAPI_XE_DRM_EUDEBUG_H_
+
+#if defined(__cplusplus)
+extern "C" {
+#endif
+
+/**
+ * Do a eudebug event read for a debugger connection.
+ *
+ * This ioctl is available in debug version 1.
+ */
+#define DRM_XE_EUDEBUG_IOCTL_READ_EVENT _IO('j', 0x0)
+
+/* XXX: Document events to match their internal counterparts when moved to xe_drm.h */
+struct drm_xe_eudebug_event {
+ __u32 len;
+
+ __u16 type;
+#define DRM_XE_EUDEBUG_EVENT_NONE 0
+#define DRM_XE_EUDEBUG_EVENT_READ 1
+#define DRM_XE_EUDEBUG_EVENT_OPEN 2
+#define DRM_XE_EUDEBUG_EVENT_VM 3
+
+ __u16 flags;
+#define DRM_XE_EUDEBUG_EVENT_CREATE (1 << 0)
+#define DRM_XE_EUDEBUG_EVENT_DESTROY (1 << 1)
+#define DRM_XE_EUDEBUG_EVENT_STATE_CHANGE (1 << 2)
+#define DRM_XE_EUDEBUG_EVENT_NEED_ACK (1 << 3)
+ __u64 seqno;
+ __u64 reserved;
+};
+
+struct drm_xe_eudebug_event_client {
+ struct drm_xe_eudebug_event base;
+
+ __u64 client_handle; /* This is unique per debug connection */
+};
+
+struct drm_xe_eudebug_event_vm {
+ struct drm_xe_eudebug_event base;
+
+ __u64 client_handle;
+ __u64 vm_handle;
+};
+
+#if defined(__cplusplus)
+}
+#endif
+
+#endif
--
2.46.1
^ permalink raw reply related [flat|nested] 28+ messages in thread* [RFC 03/19] drm/xe/eudebug: Introduce discovery for resources
2024-10-21 9:58 [RFC 00/19] Support EU online debug on pagefault Gwan-gyeong Mun
2024-10-21 9:58 ` [RFC 01/19] ptrace: export ptrace_may_access Gwan-gyeong Mun
2024-10-21 9:58 ` [RFC 02/19] drm/xe/eudebug: Introduce eudebug support Gwan-gyeong Mun
@ 2024-10-21 9:58 ` Gwan-gyeong Mun
2024-10-21 9:58 ` [RFC 04/19] drm/xe/eudebug: Introduce exec_queue events Gwan-gyeong Mun
` (22 subsequent siblings)
25 siblings, 0 replies; 28+ messages in thread
From: Gwan-gyeong Mun @ 2024-10-21 9:58 UTC (permalink / raw)
To: intel-xe
Cc: nirmoy.das, matthew.brost, stuart.summers, christoph.manszewski,
mika.kuoppala, dominik.grzegorzek, andrzej.hajda,
maciej.patelczyk
From: Mika Kuoppala <mika.kuoppala@linux.intel.com>
Debugger connection can happen way after the client has
created and destroyed arbitrary number of resources.
We need to playback all currently existing resources for the
debugger. The client is held until this so called discovery
process, executed by workqueue, is complete.
This patch is based on discovery work by Maciej Patelczyk
for i915 driver.
v2: - use rw_semaphore to block drm_ioctls during discovery (Matthew)
- only lock according to ioctl at play (Dominik)
Cc: Matthew Brost <matthew.brost@intel.com>
Cc: Dominik Grzegorzek <dominik.grzegorzek@intel.com>
Co-developed-by: Maciej Patelczyk <maciej.patelczyk@intel.com>
Signed-off-by: Maciej Patelczyk <maciej.patelczyk@intel.com>
Signed-off-by: Mika Kuoppala <mika.kuoppala@linux.intel.com>
Acked-by: Matthew Brost <matthew.brost@intel.com>
Signed-off-by: Gwan-gyeong Mun <gwan-gyeong.mun@intel.com>
---
drivers/gpu/drm/xe/xe_device.c | 10 +-
drivers/gpu/drm/xe/xe_device.h | 34 +++++++
drivers/gpu/drm/xe/xe_device_types.h | 6 ++
drivers/gpu/drm/xe/xe_eudebug.c | 135 +++++++++++++++++++++++++-
drivers/gpu/drm/xe/xe_eudebug_types.h | 7 ++
5 files changed, 185 insertions(+), 7 deletions(-)
diff --git a/drivers/gpu/drm/xe/xe_device.c b/drivers/gpu/drm/xe/xe_device.c
index 40d514003eee..17a1b6f37d1d 100644
--- a/drivers/gpu/drm/xe/xe_device.c
+++ b/drivers/gpu/drm/xe/xe_device.c
@@ -216,8 +216,11 @@ static long xe_drm_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
return -ECANCELED;
ret = xe_pm_runtime_get_ioctl(xe);
- if (ret >= 0)
+ if (ret >= 0) {
+ xe_eudebug_discovery_lock(xe, cmd);
ret = drm_ioctl(file, cmd, arg);
+ xe_eudebug_discovery_unlock(xe, cmd);
+ }
xe_pm_runtime_put(xe);
return ret;
@@ -234,8 +237,11 @@ static long xe_drm_compat_ioctl(struct file *file, unsigned int cmd, unsigned lo
return -ECANCELED;
ret = xe_pm_runtime_get_ioctl(xe);
- if (ret >= 0)
+ if (ret >= 0) {
+ xe_eudebug_discovery_lock(xe, cmd);
ret = drm_compat_ioctl(file, cmd, arg);
+ xe_eudebug_discovery_unlock(xe, cmd);
+ }
xe_pm_runtime_put(xe);
return ret;
diff --git a/drivers/gpu/drm/xe/xe_device.h b/drivers/gpu/drm/xe/xe_device.h
index 4c3f0ebe78a9..b2fc85b1d26e 100644
--- a/drivers/gpu/drm/xe/xe_device.h
+++ b/drivers/gpu/drm/xe/xe_device.h
@@ -7,6 +7,7 @@
#define _XE_DEVICE_H_
#include <drm/drm_util.h>
+#include <drm/drm_ioctl.h>
#include "xe_device_types.h"
#include "xe_gt_types.h"
@@ -191,4 +192,37 @@ void xe_device_declare_wedged(struct xe_device *xe);
struct xe_file *xe_file_get(struct xe_file *xef);
void xe_file_put(struct xe_file *xef);
+#if IS_ENABLED(CONFIG_DRM_XE_EUDEBUG)
+static inline int xe_eudebug_needs_lock(const unsigned int cmd)
+{
+ const unsigned int xe_cmd = DRM_IOCTL_NR(cmd) - DRM_COMMAND_BASE;
+
+ switch (xe_cmd) {
+ case DRM_XE_VM_CREATE:
+ case DRM_XE_VM_DESTROY:
+ case DRM_XE_VM_BIND:
+ case DRM_XE_EXEC_QUEUE_CREATE:
+ case DRM_XE_EXEC_QUEUE_DESTROY:
+ case DRM_XE_EUDEBUG_CONNECT:
+ return 1;
+ }
+
+ return 0;
+}
+
+static inline void xe_eudebug_discovery_lock(struct xe_device *xe, unsigned int cmd)
+{
+ if (xe_eudebug_needs_lock(cmd))
+ down_read(&xe->eudebug.discovery_lock);
+}
+static inline void xe_eudebug_discovery_unlock(struct xe_device *xe, unsigned int cmd)
+{
+ if (xe_eudebug_needs_lock(cmd))
+ up_read(&xe->eudebug.discovery_lock);
+}
+#else
+static inline void xe_eudebug_discovery_lock(struct xe_device *xe, unsigned int cmd) { }
+static inline void xe_eudebug_discovery_unlock(struct xe_device *xe, unsigned int cmd) { }
+#endif /* CONFIG_DRM_XE_EUDEBUG */
+
#endif
diff --git a/drivers/gpu/drm/xe/xe_device_types.h b/drivers/gpu/drm/xe/xe_device_types.h
index cb4b52888a4b..54ceeee7cf75 100644
--- a/drivers/gpu/drm/xe/xe_device_types.h
+++ b/drivers/gpu/drm/xe/xe_device_types.h
@@ -542,6 +542,12 @@ struct xe_device {
/** @available: is the debugging functionality available */
bool available;
+
+ /** @ordered_wq: used to discovery */
+ struct workqueue_struct *ordered_wq;
+
+ /** discovery_lock: used for discovery to block xe ioctls */
+ struct rw_semaphore discovery_lock;
} eudebug;
#endif
diff --git a/drivers/gpu/drm/xe/xe_eudebug.c b/drivers/gpu/drm/xe/xe_eudebug.c
index da62f699f514..c79dab6d61a7 100644
--- a/drivers/gpu/drm/xe/xe_eudebug.c
+++ b/drivers/gpu/drm/xe/xe_eudebug.c
@@ -299,6 +299,8 @@ static bool xe_eudebug_detach(struct xe_device *xe,
}
spin_unlock(&d->connection.lock);
+ flush_work(&d->discovery_work);
+
if (!detached)
return false;
@@ -409,7 +411,7 @@ static struct task_struct *find_task_get(struct xe_file *xef)
}
static struct xe_eudebug *
-xe_eudebug_get(struct xe_file *xef)
+_xe_eudebug_get(struct xe_file *xef)
{
struct task_struct *task;
struct xe_eudebug *d;
@@ -433,6 +435,24 @@ xe_eudebug_get(struct xe_file *xef)
return d;
}
+static struct xe_eudebug *
+xe_eudebug_get(struct xe_file *xef)
+{
+ struct xe_eudebug *d;
+
+ lockdep_assert_held(&xef->xe->eudebug.discovery_lock);
+
+ d = _xe_eudebug_get(xef);
+ if (d) {
+ if (!completion_done(&d->discovery)) {
+ xe_eudebug_put(d);
+ d = NULL;
+ }
+ }
+
+ return d;
+}
+
static int xe_eudebug_queue_event(struct xe_eudebug *d,
struct xe_eudebug_event *event)
{
@@ -810,6 +830,10 @@ static long xe_eudebug_ioctl(struct file *file,
struct xe_eudebug * const d = file->private_data;
long ret;
+ if (cmd != DRM_XE_EUDEBUG_IOCTL_READ_EVENT &&
+ !completion_done(&d->discovery))
+ return -EBUSY;
+
switch (cmd) {
case DRM_XE_EUDEBUG_IOCTL_READ_EVENT:
ret = xe_eudebug_read_event(d, arg,
@@ -831,6 +855,8 @@ static const struct file_operations fops = {
.unlocked_ioctl = xe_eudebug_ioctl,
};
+static void discovery_work_fn(struct work_struct *work);
+
static int
xe_eudebug_connect(struct xe_device *xe,
struct drm_xe_eudebug_connect *param)
@@ -865,9 +891,11 @@ xe_eudebug_connect(struct xe_device *xe,
spin_lock_init(&d->connection.lock);
init_waitqueue_head(&d->events.write_done);
init_waitqueue_head(&d->events.read_done);
+ init_completion(&d->discovery);
spin_lock_init(&d->events.lock);
INIT_KFIFO(d->events.fifo);
+ INIT_WORK(&d->discovery_work, discovery_work_fn);
d->res = xe_eudebug_resources_alloc();
if (IS_ERR(d->res)) {
@@ -885,6 +913,9 @@ xe_eudebug_connect(struct xe_device *xe,
goto err_detach;
}
+ kref_get(&d->ref);
+ queue_work(xe->eudebug.ordered_wq, &d->discovery_work);
+
eu_dbg(d, "connected session %lld", d->session);
return fd;
@@ -917,13 +948,18 @@ void xe_eudebug_init(struct xe_device *xe)
spin_lock_init(&xe->eudebug.lock);
INIT_LIST_HEAD(&xe->eudebug.list);
INIT_LIST_HEAD(&xe->clients.list);
+ init_rwsem(&xe->eudebug.discovery_lock);
- xe->eudebug.available = true;
+ xe->eudebug.ordered_wq = alloc_ordered_workqueue("xe-eudebug-ordered-wq", 0);
+ xe->eudebug.available = !!xe->eudebug.ordered_wq;
}
void xe_eudebug_fini(struct xe_device *xe)
{
xe_assert(xe, list_empty_careful(&xe->eudebug.list));
+
+ if (xe->eudebug.ordered_wq)
+ destroy_workqueue(xe->eudebug.ordered_wq);
}
static int send_open_event(struct xe_eudebug *d, u32 flags, const u64 handle,
@@ -989,21 +1025,25 @@ void xe_eudebug_file_open(struct xe_file *xef)
struct xe_eudebug *d;
INIT_LIST_HEAD(&xef->eudebug.client_link);
+
+ down_read(&xef->xe->eudebug.discovery_lock);
+
spin_lock(&xef->xe->clients.lock);
list_add_tail(&xef->eudebug.client_link, &xef->xe->clients.list);
spin_unlock(&xef->xe->clients.lock);
d = xe_eudebug_get(xef);
- if (!d)
- return;
+ if (d)
+ xe_eudebug_event_put(d, client_create_event(d, xef));
- xe_eudebug_event_put(d, client_create_event(d, xef));
+ up_read(&xef->xe->eudebug.discovery_lock);
}
void xe_eudebug_file_close(struct xe_file *xef)
{
struct xe_eudebug *d;
+ down_read(&xef->xe->eudebug.discovery_lock);
d = xe_eudebug_get(xef);
if (d)
xe_eudebug_event_put(d, client_destroy_event(d, xef));
@@ -1011,6 +1051,8 @@ void xe_eudebug_file_close(struct xe_file *xef)
spin_lock(&xef->xe->clients.lock);
list_del_init(&xef->eudebug.client_link);
spin_unlock(&xef->xe->clients.lock);
+
+ up_read(&xef->xe->eudebug.discovery_lock);
}
static int send_vm_event(struct xe_eudebug *d, u32 flags,
@@ -1111,3 +1153,86 @@ void xe_eudebug_vm_destroy(struct xe_file *xef, struct xe_vm *vm)
xe_eudebug_event_put(d, vm_destroy_event(d, xef, vm));
}
+
+static int discover_client(struct xe_eudebug *d, struct xe_file *xef)
+{
+ struct xe_vm *vm;
+ unsigned long i;
+ int err;
+
+ err = client_create_event(d, xef);
+ if (err)
+ return err;
+
+ xa_for_each(&xef->vm.xa, i, vm) {
+ err = vm_create_event(d, xef, vm);
+ if (err)
+ break;
+ }
+
+ return err;
+}
+
+static bool xe_eudebug_task_match(struct xe_eudebug *d, struct xe_file *xef)
+{
+ struct task_struct *task;
+ bool match;
+
+ task = find_task_get(xef);
+ if (!task)
+ return false;
+
+ match = same_thread_group(d->target_task, task);
+
+ put_task_struct(task);
+
+ return match;
+}
+
+static void discover_clients(struct xe_device *xe, struct xe_eudebug *d)
+{
+ struct xe_file *xef;
+ int err;
+
+ list_for_each_entry(xef, &xe->clients.list, eudebug.client_link) {
+ if (xe_eudebug_detached(d))
+ break;
+
+ if (xe_eudebug_task_match(d, xef))
+ err = discover_client(d, xef);
+ else
+ err = 0;
+
+ if (err) {
+ eu_dbg(d, "discover client %p: %d\n", xef, err);
+ break;
+ }
+ }
+}
+
+static void discovery_work_fn(struct work_struct *work)
+{
+ struct xe_eudebug *d = container_of(work, typeof(*d),
+ discovery_work);
+ struct xe_device *xe = d->xe;
+
+ if (xe_eudebug_detached(d)) {
+ complete_all(&d->discovery);
+ xe_eudebug_put(d);
+ return;
+ }
+
+ down_write(&xe->eudebug.discovery_lock);
+
+ eu_dbg(d, "Discovery start for %lld\n", d->session);
+
+ discover_clients(xe, d);
+
+ eu_dbg(d, "Discovery end for %lld\n", d->session);
+
+ complete_all(&d->discovery);
+
+ up_write(&xe->eudebug.discovery_lock);
+
+ xe_eudebug_put(d);
+}
diff --git a/drivers/gpu/drm/xe/xe_eudebug_types.h b/drivers/gpu/drm/xe/xe_eudebug_types.h
index a5185f18f640..080a821db3e4 100644
--- a/drivers/gpu/drm/xe/xe_eudebug_types.h
+++ b/drivers/gpu/drm/xe/xe_eudebug_types.h
@@ -19,6 +19,7 @@
struct xe_device;
struct task_struct;
struct xe_eudebug_event;
+struct workqueue_struct;
#define CONFIG_DRM_XE_DEBUGGER_EVENT_QUEUE_SIZE 64
@@ -96,6 +97,12 @@ struct xe_eudebug {
/** @session: session number for this connection (for logs) */
u64 session;
+ /** @discovery: completion to wait for discovery */
+ struct completion discovery;
+
+ /** @discovery_work: worker to discover resources for target_task */
+ struct work_struct discovery_work;
+
/** @events: kfifo queue of to-be-delivered events */
struct {
/** @lock: guards access to fifo */
--
2.46.1
^ permalink raw reply related [flat|nested] 28+ messages in thread* [RFC 04/19] drm/xe/eudebug: Introduce exec_queue events
2024-10-21 9:58 [RFC 00/19] Support EU online debug on pagefault Gwan-gyeong Mun
` (2 preceding siblings ...)
2024-10-21 9:58 ` [RFC 03/19] drm/xe/eudebug: Introduce discovery for resources Gwan-gyeong Mun
@ 2024-10-21 9:58 ` Gwan-gyeong Mun
2024-10-21 9:58 ` [RFC 05/19] drm/xe/eudebug: hw enablement for eudebug Gwan-gyeong Mun
` (21 subsequent siblings)
25 siblings, 0 replies; 28+ messages in thread
From: Gwan-gyeong Mun @ 2024-10-21 9:58 UTC (permalink / raw)
To: intel-xe
Cc: nirmoy.das, matthew.brost, stuart.summers, christoph.manszewski,
mika.kuoppala, dominik.grzegorzek, andrzej.hajda,
maciej.patelczyk
From: Dominik Grzegorzek <dominik.grzegorzek@intel.com>
Inform debugger about creation and destruction of exec_queues.
1) Use user engine class types instead of internal xe_engine_class enum
in exec_queue event.
2) During discovery do not advertise every execqueue created, only ones
with class render or compute.
v2: - Only track long running queues
- Checkpatch (Tilak)
Signed-off-by: Dominik Grzegorzek <dominik.grzegorzek@intel.com>
Signed-off-by: Maciej Patelczyk <maciej.patelczyk@intel.com>
Signed-off-by: Mika Kuoppala <mika.kuoppala@linux.intel.com>
Signed-off-by: Gwan-gyeong Mun <gwan-gyeong.mun@intel.com>
---
drivers/gpu/drm/xe/xe_eudebug.c | 187 +++++++++++++++++++++++++-
drivers/gpu/drm/xe/xe_eudebug.h | 7 +
drivers/gpu/drm/xe/xe_eudebug_types.h | 31 ++++-
drivers/gpu/drm/xe/xe_exec_queue.c | 5 +
include/uapi/drm/xe_drm_eudebug.h | 12 ++
5 files changed, 240 insertions(+), 2 deletions(-)
diff --git a/drivers/gpu/drm/xe/xe_eudebug.c b/drivers/gpu/drm/xe/xe_eudebug.c
index c79dab6d61a7..a6d69e20b083 100644
--- a/drivers/gpu/drm/xe/xe_eudebug.c
+++ b/drivers/gpu/drm/xe/xe_eudebug.c
@@ -14,6 +14,7 @@
#include "xe_device.h"
#include "xe_eudebug.h"
#include "xe_eudebug_types.h"
+#include "xe_exec_queue.h"
#include "xe_macros.h"
#include "xe_vm.h"
@@ -748,7 +749,7 @@ static long xe_eudebug_read_event(struct xe_eudebug *d,
u64_to_user_ptr(arg);
struct drm_xe_eudebug_event user_event;
struct xe_eudebug_event *event;
- const unsigned int max_event = DRM_XE_EUDEBUG_EVENT_VM;
+ const unsigned int max_event = DRM_XE_EUDEBUG_EVENT_EXEC_QUEUE;
long ret = 0;
if (XE_IOCTL_DBG(xe, copy_from_user(&user_event, user_orig, sizeof(user_event))))
@@ -1154,8 +1155,183 @@ void xe_eudebug_vm_destroy(struct xe_file *xef, struct xe_vm *vm)
xe_eudebug_event_put(d, vm_destroy_event(d, xef, vm));
}
+static bool exec_queue_class_is_tracked(enum xe_engine_class class)
+{
+ return class == XE_ENGINE_CLASS_COMPUTE ||
+ class == XE_ENGINE_CLASS_RENDER;
+}
+
+static const u16 xe_to_user_engine_class[] = {
+ [XE_ENGINE_CLASS_RENDER] = DRM_XE_ENGINE_CLASS_RENDER,
+ [XE_ENGINE_CLASS_COPY] = DRM_XE_ENGINE_CLASS_COPY,
+ [XE_ENGINE_CLASS_VIDEO_DECODE] = DRM_XE_ENGINE_CLASS_VIDEO_DECODE,
+ [XE_ENGINE_CLASS_VIDEO_ENHANCE] = DRM_XE_ENGINE_CLASS_VIDEO_ENHANCE,
+ [XE_ENGINE_CLASS_COMPUTE] = DRM_XE_ENGINE_CLASS_COMPUTE,
+};
+
+static int send_exec_queue_event(struct xe_eudebug *d, u32 flags,
+ u64 client_handle, u64 vm_handle,
+ u64 exec_queue_handle, enum xe_engine_class class,
+ u32 width, u64 *lrc_handles, u64 seqno)
+{
+ struct xe_eudebug_event *event;
+ struct xe_eudebug_event_exec_queue *e;
+ const u32 sz = struct_size(e, lrc_handle, width);
+ const u32 xe_engine_class = xe_to_user_engine_class[class];
+
+ if (!exec_queue_class_is_tracked(class))
+ return -EINVAL;
+
+ event = xe_eudebug_create_event(d, DRM_XE_EUDEBUG_EVENT_EXEC_QUEUE,
+ seqno, flags, sz, GFP_KERNEL);
+ if (!event)
+ return -ENOMEM;
+
+ e = cast_event(e, event);
+
+ write_member(struct drm_xe_eudebug_event_exec_queue, e, client_handle, client_handle);
+ write_member(struct drm_xe_eudebug_event_exec_queue, e, vm_handle, vm_handle);
+ write_member(struct drm_xe_eudebug_event_exec_queue, e, exec_queue_handle,
+ exec_queue_handle);
+ write_member(struct drm_xe_eudebug_event_exec_queue, e, engine_class, xe_engine_class);
+ write_member(struct drm_xe_eudebug_event_exec_queue, e, width, width);
+
+ memcpy(e->lrc_handle, lrc_handles, width);
+
+ return xe_eudebug_queue_event(d, event);
+}
+
+static int exec_queue_create_event(struct xe_eudebug *d,
+ struct xe_file *xef, struct xe_exec_queue *q)
+{
+ int h_c, h_vm, h_queue;
+ u64 h_lrc[XE_HW_ENGINE_MAX_INSTANCE], seqno;
+ int i;
+
+ if (!xe_exec_queue_is_lr(q))
+ return 0;
+
+ h_c = find_handle(d->res, XE_EUDEBUG_RES_TYPE_CLIENT, xef);
+ if (h_c < 0)
+ return h_c;
+
+ h_vm = find_handle(d->res, XE_EUDEBUG_RES_TYPE_VM, q->vm);
+ if (h_vm < 0)
+ return h_vm;
+
+ if (XE_WARN_ON(q->width >= XE_HW_ENGINE_MAX_INSTANCE))
+ return -EINVAL;
+
+ for (i = 0; i < q->width; i++) {
+ int h, ret;
+
+ ret = _xe_eudebug_add_handle(d,
+ XE_EUDEBUG_RES_TYPE_LRC,
+ q->lrc[i],
+ NULL,
+ &h);
+
+ if (ret < 0 && ret != -EEXIST)
+ return ret;
+
+ XE_WARN_ON(!h);
+
+ h_lrc[i] = h;
+ }
+
+ h_queue = xe_eudebug_add_handle(d, XE_EUDEBUG_RES_TYPE_EXEC_QUEUE, q, &seqno);
+ if (h_queue <= 0)
+ return h_queue;
+
+ /* No need to cleanup for added handles on error as if we fail
+ * we disconnect
+ */
+
+ return send_exec_queue_event(d, DRM_XE_EUDEBUG_EVENT_CREATE,
+ h_c, h_vm, h_queue, q->class,
+ q->width, h_lrc, seqno);
+}
+
+static int exec_queue_destroy_event(struct xe_eudebug *d,
+ struct xe_file *xef,
+ struct xe_exec_queue *q)
+{
+ int h_c, h_vm, h_queue;
+ u64 h_lrc[XE_HW_ENGINE_MAX_INSTANCE], seqno;
+ int i;
+
+ if (!xe_exec_queue_is_lr(q))
+ return 0;
+
+ h_c = find_handle(d->res, XE_EUDEBUG_RES_TYPE_CLIENT, xef);
+ if (h_c < 0)
+ return h_c;
+
+ h_vm = find_handle(d->res, XE_EUDEBUG_RES_TYPE_VM, q->vm);
+ if (h_vm < 0)
+ return h_vm;
+
+ if (XE_WARN_ON(q->width >= XE_HW_ENGINE_MAX_INSTANCE))
+ return -EINVAL;
+
+ h_queue = xe_eudebug_remove_handle(d,
+ XE_EUDEBUG_RES_TYPE_EXEC_QUEUE,
+ q,
+ &seqno);
+ if (h_queue <= 0)
+ return h_queue;
+
+ for (i = 0; i < q->width; i++) {
+ int ret;
+
+ ret = _xe_eudebug_remove_handle(d,
+ XE_EUDEBUG_RES_TYPE_LRC,
+ q->lrc[i],
+ NULL);
+ if (ret < 0 && ret != -ENOENT)
+ return ret;
+
+ XE_WARN_ON(!ret);
+
+ h_lrc[i] = ret;
+ }
+
+ return send_exec_queue_event(d, DRM_XE_EUDEBUG_EVENT_DESTROY,
+ h_c, h_vm, h_queue, q->class,
+ q->width, h_lrc, seqno);
+}
+
+void xe_eudebug_exec_queue_create(struct xe_file *xef, struct xe_exec_queue *q)
+{
+ struct xe_eudebug *d;
+
+ if (!exec_queue_class_is_tracked(q->class))
+ return;
+
+ d = xe_eudebug_get(xef);
+ if (!d)
+ return;
+
+ xe_eudebug_event_put(d, exec_queue_create_event(d, xef, q));
+}
+
+void xe_eudebug_exec_queue_destroy(struct xe_file *xef, struct xe_exec_queue *q)
+{
+ struct xe_eudebug *d;
+
+ if (!exec_queue_class_is_tracked(q->class))
+ return;
+
+ d = xe_eudebug_get(xef);
+ if (!d)
+ return;
+
+ xe_eudebug_event_put(d, exec_queue_destroy_event(d, xef, q));
+}
+
static int discover_client(struct xe_eudebug *d, struct xe_file *xef)
{
+ struct xe_exec_queue *q;
struct xe_vm *vm;
unsigned long i;
int err;
@@ -1170,6 +1346,15 @@ static int discover_client(struct xe_eudebug *d, struct xe_file *xef)
break;
}
+ xa_for_each(&xef->exec_queue.xa, i, q) {
+ if (!exec_queue_class_is_tracked(q->class))
+ continue;
+
+ err = exec_queue_create_event(d, xef, q);
+ if (err)
+ break;
+ }
+
return err;
}
diff --git a/drivers/gpu/drm/xe/xe_eudebug.h b/drivers/gpu/drm/xe/xe_eudebug.h
index e3247365f72f..326ddbd50651 100644
--- a/drivers/gpu/drm/xe/xe_eudebug.h
+++ b/drivers/gpu/drm/xe/xe_eudebug.h
@@ -10,6 +10,7 @@ struct drm_file;
struct xe_device;
struct xe_file;
struct xe_vm;
+struct xe_exec_queue;
#if IS_ENABLED(CONFIG_DRM_XE_EUDEBUG)
@@ -26,6 +27,9 @@ void xe_eudebug_file_close(struct xe_file *xef);
void xe_eudebug_vm_create(struct xe_file *xef, struct xe_vm *vm);
void xe_eudebug_vm_destroy(struct xe_file *xef, struct xe_vm *vm);
+void xe_eudebug_exec_queue_create(struct xe_file *xef, struct xe_exec_queue *q);
+void xe_eudebug_exec_queue_destroy(struct xe_file *xef, struct xe_exec_queue *q);
+
#else
static inline int xe_eudebug_connect_ioctl(struct drm_device *dev,
@@ -41,6 +45,9 @@ static inline void xe_eudebug_file_close(struct xe_file *xef) { }
static inline void xe_eudebug_vm_create(struct xe_file *xef, struct xe_vm *vm) { }
static inline void xe_eudebug_vm_destroy(struct xe_file *xef, struct xe_vm *vm) { }
+static inline void xe_eudebug_exec_queue_create(struct xe_file *xef, struct xe_exec_queue *q) { }
+static inline void xe_eudebug_exec_queue_destroy(struct xe_file *xef, struct xe_exec_queue *q) { }
+
#endif /* CONFIG_DRM_XE_EUDEBUG */
#endif
diff --git a/drivers/gpu/drm/xe/xe_eudebug_types.h b/drivers/gpu/drm/xe/xe_eudebug_types.h
index 080a821db3e4..6428905a0557 100644
--- a/drivers/gpu/drm/xe/xe_eudebug_types.h
+++ b/drivers/gpu/drm/xe/xe_eudebug_types.h
@@ -50,7 +50,9 @@ struct xe_eudebug_resource {
#define XE_EUDEBUG_RES_TYPE_CLIENT 0
#define XE_EUDEBUG_RES_TYPE_VM 1
-#define XE_EUDEBUG_RES_TYPE_COUNT (XE_EUDEBUG_RES_TYPE_VM + 1)
+#define XE_EUDEBUG_RES_TYPE_EXEC_QUEUE 2
+#define XE_EUDEBUG_RES_TYPE_LRC 3
+#define XE_EUDEBUG_RES_TYPE_COUNT (XE_EUDEBUG_RES_TYPE_LRC + 1)
/**
* struct xe_eudebug_resources - eudebug resources for all types
@@ -173,4 +175,31 @@ struct xe_eudebug_event_vm {
u64 vm_handle;
};
+/**
+ * struct xe_eudebug_event_exec_queue - Internal event for
+ * exec_queue create/destroy
+ */
+struct xe_eudebug_event_exec_queue {
+ /** @base: base event */
+ struct xe_eudebug_event base;
+
+ /** @client_handle: client for the engine create/destroy */
+ u64 client_handle;
+
+ /** @vm_handle: vm handle for the engine create/destroy */
+ u64 vm_handle;
+
+ /** @exec_queue_handle: engine handle */
+ u64 exec_queue_handle;
+
+ /** @engine_handle: engine class */
+ u32 engine_class;
+
+ /** @width: submission width (number BB per exec) for this exec queue */
+ u32 width;
+
+ /** @lrc_handles: handles for each logical ring context created with this exec queue */
+ u64 lrc_handle[];
+};
+
#endif
diff --git a/drivers/gpu/drm/xe/xe_exec_queue.c b/drivers/gpu/drm/xe/xe_exec_queue.c
index d098d2dd1b2d..e6b2487de48e 100644
--- a/drivers/gpu/drm/xe/xe_exec_queue.c
+++ b/drivers/gpu/drm/xe/xe_exec_queue.c
@@ -23,6 +23,7 @@
#include "xe_ring_ops_types.h"
#include "xe_trace.h"
#include "xe_vm.h"
+#include "xe_eudebug.h"
enum xe_exec_queue_sched_prop {
XE_EXEC_QUEUE_JOB_TIMEOUT = 0,
@@ -644,6 +645,8 @@ int xe_exec_queue_create_ioctl(struct drm_device *dev, void *data,
args->exec_queue_id = id;
+ xe_eudebug_exec_queue_create(xef, q);
+
return 0;
kill_exec_queue:
@@ -827,6 +830,8 @@ int xe_exec_queue_destroy_ioctl(struct drm_device *dev, void *data,
if (q->vm && q->hwe->hw_engine_group)
xe_hw_engine_group_del_exec_queue(q->hwe->hw_engine_group, q);
+ xe_eudebug_exec_queue_destroy(xef, q);
+
xe_exec_queue_kill(q);
trace_xe_exec_queue_close(q);
diff --git a/include/uapi/drm/xe_drm_eudebug.h b/include/uapi/drm/xe_drm_eudebug.h
index acf6071c82bf..ac44e890152a 100644
--- a/include/uapi/drm/xe_drm_eudebug.h
+++ b/include/uapi/drm/xe_drm_eudebug.h
@@ -26,6 +26,7 @@ struct drm_xe_eudebug_event {
#define DRM_XE_EUDEBUG_EVENT_READ 1
#define DRM_XE_EUDEBUG_EVENT_OPEN 2
#define DRM_XE_EUDEBUG_EVENT_VM 3
+#define DRM_XE_EUDEBUG_EVENT_EXEC_QUEUE 4
__u16 flags;
#define DRM_XE_EUDEBUG_EVENT_CREATE (1 << 0)
@@ -49,6 +50,17 @@ struct drm_xe_eudebug_event_vm {
__u64 vm_handle;
};
+struct drm_xe_eudebug_event_exec_queue {
+ struct drm_xe_eudebug_event base;
+
+ __u64 client_handle;
+ __u64 vm_handle;
+ __u64 exec_queue_handle;
+ __u32 engine_class;
+ __u32 width;
+ __u64 lrc_handle[];
+};
+
#if defined(__cplusplus)
}
#endif
--
2.46.1
^ permalink raw reply related [flat|nested] 28+ messages in thread* [RFC 05/19] drm/xe/eudebug: hw enablement for eudebug
2024-10-21 9:58 [RFC 00/19] Support EU online debug on pagefault Gwan-gyeong Mun
` (3 preceding siblings ...)
2024-10-21 9:58 ` [RFC 04/19] drm/xe/eudebug: Introduce exec_queue events Gwan-gyeong Mun
@ 2024-10-21 9:58 ` Gwan-gyeong Mun
2024-10-21 9:58 ` [RFC 06/19] drm/xe: Add EUDEBUG_ENABLE exec queue property Gwan-gyeong Mun
` (20 subsequent siblings)
25 siblings, 0 replies; 28+ messages in thread
From: Gwan-gyeong Mun @ 2024-10-21 9:58 UTC (permalink / raw)
To: intel-xe
Cc: nirmoy.das, matthew.brost, stuart.summers, christoph.manszewski,
mika.kuoppala, dominik.grzegorzek, andrzej.hajda,
maciej.patelczyk
From: Dominik Grzegorzek <dominik.grzegorzek@intel.com>
In order to turn on debug capabilities, (i.e. breakpoints), TD_CTL
and some other registers needs to be programmed. Implement eudebug
mode enabling including eudebug related workarounds.
v2: Move workarounds to xe_wa_oob. Use reg_sr directly instead of
xe_rtp as it suits better for dynamic manipulation of those register we
do later in the series.
Signed-off-by: Dominik Grzegorzek <dominik.grzegorzek@intel.com>
Signed-off-by: Mika Kuoppala <mika.kuoppala@linux.intel.com>
Signed-off-by: Gwan-gyeong Mun <gwan-gyeong.mun@intel.com>
---
drivers/gpu/drm/xe/regs/xe_engine_regs.h | 4 ++
drivers/gpu/drm/xe/regs/xe_gt_regs.h | 10 ++++
drivers/gpu/drm/xe/xe_eudebug.c | 70 ++++++++++++++++++++++++
drivers/gpu/drm/xe/xe_eudebug.h | 3 +
drivers/gpu/drm/xe/xe_hw_engine.c | 2 +
drivers/gpu/drm/xe/xe_wa_oob.rules | 2 +
6 files changed, 91 insertions(+)
diff --git a/drivers/gpu/drm/xe/regs/xe_engine_regs.h b/drivers/gpu/drm/xe/regs/xe_engine_regs.h
index 7c78496e6213..e45c4d5378e5 100644
--- a/drivers/gpu/drm/xe/regs/xe_engine_regs.h
+++ b/drivers/gpu/drm/xe/regs/xe_engine_regs.h
@@ -115,6 +115,10 @@
#define INDIRECT_RING_STATE(base) XE_REG((base) + 0x108)
+#define CS_DEBUG_MODE2(base) XE_REG((base) + 0xd8, XE_REG_OPTION_MASKED)
+#define INST_STATE_CACHE_INVALIDATE REG_BIT(6)
+#define GLOBAL_DEBUG_ENABLE REG_BIT(5)
+
#define RING_BBADDR(base) XE_REG((base) + 0x140)
#define RING_BBADDR_UDW(base) XE_REG((base) + 0x168)
diff --git a/drivers/gpu/drm/xe/regs/xe_gt_regs.h b/drivers/gpu/drm/xe/regs/xe_gt_regs.h
index 42dc55cb23f4..45836d232fb2 100644
--- a/drivers/gpu/drm/xe/regs/xe_gt_regs.h
+++ b/drivers/gpu/drm/xe/regs/xe_gt_regs.h
@@ -453,6 +453,14 @@
#define DG2_DISABLE_ROUND_ENABLE_ALLOW_FOR_SSLA REG_BIT(15)
#define CLEAR_OPTIMIZATION_DISABLE REG_BIT(6)
+#define TD_CTL XE_REG_MCR(0xe400)
+#define TD_CTL_FEH_AND_FEE_ENABLE REG_BIT(7) /* forced halt and exception */
+#define TD_CTL_FORCE_EXTERNAL_HALT REG_BIT(6)
+#define TD_CTL_FORCE_THREAD_BREAKPOINT_ENABLE REG_BIT(4)
+#define TD_CTL_FORCE_EXCEPTION REG_BIT(3)
+#define TD_CTL_BREAKPOINT_ENABLE REG_BIT(2)
+#define TD_CTL_GLOBAL_DEBUG_ENABLE REG_BIT(0) /* XeHP */
+
#define CACHE_MODE_SS XE_REG_MCR(0xe420, XE_REG_OPTION_MASKED)
#define DISABLE_ECC REG_BIT(5)
#define ENABLE_PREFETCH_INTO_IC REG_BIT(3)
@@ -479,11 +487,13 @@
#define MDQ_ARBITRATION_MODE REG_BIT(12)
#define STALL_DOP_GATING_DISABLE REG_BIT(5)
#define EARLY_EOT_DIS REG_BIT(1)
+#define STALL_DOP_GATING_DISABLE REG_BIT(5)
#define ROW_CHICKEN2 XE_REG_MCR(0xe4f4, XE_REG_OPTION_MASKED)
#define DISABLE_READ_SUPPRESSION REG_BIT(15)
#define DISABLE_EARLY_READ REG_BIT(14)
#define ENABLE_LARGE_GRF_MODE REG_BIT(12)
+#define XEHPC_DISABLE_BTB REG_BIT(11)
#define PUSH_CONST_DEREF_HOLD_DIS REG_BIT(8)
#define DISABLE_TDL_SVHS_GATING REG_BIT(1)
#define DISABLE_DOP_GATING REG_BIT(0)
diff --git a/drivers/gpu/drm/xe/xe_eudebug.c b/drivers/gpu/drm/xe/xe_eudebug.c
index a6d69e20b083..fa0415b9aa11 100644
--- a/drivers/gpu/drm/xe/xe_eudebug.c
+++ b/drivers/gpu/drm/xe/xe_eudebug.c
@@ -10,13 +10,21 @@
#include <drm/drm_managed.h>
+#include <generated/xe_wa_oob.h>
+
+#include "regs/xe_gt_regs.h"
+#include "regs/xe_engine_regs.h"
+
#include "xe_assert.h"
#include "xe_device.h"
#include "xe_eudebug.h"
#include "xe_eudebug_types.h"
#include "xe_exec_queue.h"
#include "xe_macros.h"
+#include "xe_reg_sr.h"
+#include "xe_rtp.h"
#include "xe_vm.h"
+#include "xe_wa.h"
/*
* If there is no detected event read by userspace, during this period, assume
@@ -944,6 +952,68 @@ int xe_eudebug_connect_ioctl(struct drm_device *dev,
return ret;
}
+#undef XE_REG_MCR
+#define XE_REG_MCR(...) XE_REG(__VA_ARGS__, .mcr = 1)
+
+void xe_eudebug_init_hw_engine(struct xe_hw_engine *hwe)
+{
+ struct xe_gt *gt = hwe->gt;
+ struct xe_device *xe = gt_to_xe(gt);
+
+ if (!xe->eudebug.available)
+ return;
+
+ if (!xe_rtp_match_first_render_or_compute(gt, hwe))
+ return;
+
+ if (XE_WA(gt, 18022722726)) {
+ struct xe_reg_sr_entry sr_entry = {
+ .reg = ROW_CHICKEN,
+ .clr_bits = STALL_DOP_GATING_DISABLE,
+ .set_bits = STALL_DOP_GATING_DISABLE,
+ .read_mask = STALL_DOP_GATING_DISABLE,
+ };
+
+ xe_reg_sr_add(&hwe->reg_sr, &sr_entry, gt);
+ }
+
+ if (XE_WA(gt, 14015474168)) {
+ struct xe_reg_sr_entry sr_entry = {
+ .reg = ROW_CHICKEN2,
+ .clr_bits = XEHPC_DISABLE_BTB,
+ .set_bits = XEHPC_DISABLE_BTB,
+ .read_mask = XEHPC_DISABLE_BTB,
+ };
+
+ xe_reg_sr_add(&hwe->reg_sr, &sr_entry, gt);
+ }
+
+ if (xe->info.graphics_verx100 >= 1200) {
+ u32 mask = TD_CTL_BREAKPOINT_ENABLE |
+ TD_CTL_FORCE_THREAD_BREAKPOINT_ENABLE |
+ TD_CTL_FEH_AND_FEE_ENABLE;
+ struct xe_reg_sr_entry sr_entry = {
+ .reg = TD_CTL,
+ .clr_bits = mask,
+ .set_bits = mask,
+ .read_mask = mask,
+ };
+
+ xe_reg_sr_add(&hwe->reg_sr, &sr_entry, gt);
+ }
+
+ if (xe->info.graphics_verx100 >= 1250) {
+ struct xe_reg_sr_entry sr_entry = {
+ .reg = TD_CTL,
+ .clr_bits = TD_CTL_GLOBAL_DEBUG_ENABLE,
+ .set_bits = TD_CTL_GLOBAL_DEBUG_ENABLE,
+ .read_mask = TD_CTL_GLOBAL_DEBUG_ENABLE,
+ };
+
+ xe_reg_sr_add(&hwe->reg_sr, &sr_entry, gt);
+ }
+}
+
void xe_eudebug_init(struct xe_device *xe)
{
spin_lock_init(&xe->eudebug.lock);
diff --git a/drivers/gpu/drm/xe/xe_eudebug.h b/drivers/gpu/drm/xe/xe_eudebug.h
index 326ddbd50651..3cd6bc7bb682 100644
--- a/drivers/gpu/drm/xe/xe_eudebug.h
+++ b/drivers/gpu/drm/xe/xe_eudebug.h
@@ -11,6 +11,7 @@ struct xe_device;
struct xe_file;
struct xe_vm;
struct xe_exec_queue;
+struct xe_hw_engine;
#if IS_ENABLED(CONFIG_DRM_XE_EUDEBUG)
@@ -20,6 +21,7 @@ int xe_eudebug_connect_ioctl(struct drm_device *dev,
void xe_eudebug_init(struct xe_device *xe);
void xe_eudebug_fini(struct xe_device *xe);
+void xe_eudebug_init_hw_engine(struct xe_hw_engine *hwe);
void xe_eudebug_file_open(struct xe_file *xef);
void xe_eudebug_file_close(struct xe_file *xef);
@@ -38,6 +40,7 @@ static inline int xe_eudebug_connect_ioctl(struct drm_device *dev,
static inline void xe_eudebug_init(struct xe_device *xe) { }
static inline void xe_eudebug_fini(struct xe_device *xe) { }
+static inline void xe_eudebug_init_hw_engine(struct xe_hw_engine *hwe) { }
static inline void xe_eudebug_file_open(struct xe_file *xef) { }
static inline void xe_eudebug_file_close(struct xe_file *xef) { }
diff --git a/drivers/gpu/drm/xe/xe_hw_engine.c b/drivers/gpu/drm/xe/xe_hw_engine.c
index 1557acee3523..0b6e087712ea 100644
--- a/drivers/gpu/drm/xe/xe_hw_engine.c
+++ b/drivers/gpu/drm/xe/xe_hw_engine.c
@@ -16,6 +16,7 @@
#include "xe_assert.h"
#include "xe_bo.h"
#include "xe_device.h"
+#include "xe_eudebug.h"
#include "xe_execlist.h"
#include "xe_force_wake.h"
#include "xe_gsc.h"
@@ -558,6 +559,7 @@ static void hw_engine_init_early(struct xe_gt *gt, struct xe_hw_engine *hwe,
xe_tuning_process_engine(hwe);
xe_wa_process_engine(hwe);
hw_engine_setup_default_state(hwe);
+ xe_eudebug_init_hw_engine(hwe);
xe_reg_sr_init(&hwe->reg_whitelist, hwe->name, gt_to_xe(gt));
xe_reg_whitelist_process_engine(hwe);
diff --git a/drivers/gpu/drm/xe/xe_wa_oob.rules b/drivers/gpu/drm/xe/xe_wa_oob.rules
index bcd04464b85e..797f89424013 100644
--- a/drivers/gpu/drm/xe/xe_wa_oob.rules
+++ b/drivers/gpu/drm/xe/xe_wa_oob.rules
@@ -41,3 +41,5 @@
no_media_l3 MEDIA_VERSION(3000)
14022866841 GRAPHICS_VERSION(3000), GRAPHICS_STEP(A0, B0)
MEDIA_VERSION(3000), MEDIA_STEP(A0, B0)
+18022722726 GRAPHICS_VERSION_RANGE(1250, 1274)
+14015474168 PLATFORM(PVC)
--
2.46.1
^ permalink raw reply related [flat|nested] 28+ messages in thread* [RFC 06/19] drm/xe: Add EUDEBUG_ENABLE exec queue property
2024-10-21 9:58 [RFC 00/19] Support EU online debug on pagefault Gwan-gyeong Mun
` (4 preceding siblings ...)
2024-10-21 9:58 ` [RFC 05/19] drm/xe/eudebug: hw enablement for eudebug Gwan-gyeong Mun
@ 2024-10-21 9:58 ` Gwan-gyeong Mun
2024-10-21 9:58 ` [RFC 07/19] drm/xe/eudebug: Introduce per device attention scan worker Gwan-gyeong Mun
` (19 subsequent siblings)
25 siblings, 0 replies; 28+ messages in thread
From: Gwan-gyeong Mun @ 2024-10-21 9:58 UTC (permalink / raw)
To: intel-xe
Cc: nirmoy.das, matthew.brost, stuart.summers, christoph.manszewski,
mika.kuoppala, dominik.grzegorzek, andrzej.hajda,
maciej.patelczyk
From: Dominik Grzegorzek <dominik.grzegorzek@intel.com>
Introduce exec queue immutable property of eudebug
with a flags as value to enable eudebug specific feature(s).
For now engine lrc will use this flag to set up runalone
hw feature. Runalone is used to ensure that only one hw engine
of group [rcs0, ccs0-3] is active on a tile.
Note: unlike the i915, xe allows user to set runalone
also on devices with single render/compute engine. It should not
make much difference, but leave control to the user.
v2: - check CONFIG_DRM_XE_EUDEBUG and LR mode (Matthew)
- disable preempt (Dominik)
- lrc_create remove from engine init
Cc: Matthew Brost <matthew.brost@intel.com>
Signed-off-by: Dominik Grzegorzek <dominik.grzegorzek@intel.com>
Signed-off-by: Mika Kuoppala <mika.kuoppala@linux.intel.com>
Signed-off-by: Gwan-gyeong Mun <gwan-gyeong.mun@intel.com>
---
drivers/gpu/drm/xe/xe_eudebug.c | 4 +--
drivers/gpu/drm/xe/xe_exec_queue.c | 46 ++++++++++++++++++++++--
drivers/gpu/drm/xe/xe_exec_queue.h | 2 ++
drivers/gpu/drm/xe/xe_exec_queue_types.h | 7 ++++
drivers/gpu/drm/xe/xe_execlist.c | 2 +-
drivers/gpu/drm/xe/xe_lrc.c | 16 +++++++--
drivers/gpu/drm/xe/xe_lrc.h | 4 ++-
include/uapi/drm/xe_drm.h | 3 +-
8 files changed, 74 insertions(+), 10 deletions(-)
diff --git a/drivers/gpu/drm/xe/xe_eudebug.c b/drivers/gpu/drm/xe/xe_eudebug.c
index fa0415b9aa11..dd3418049787 100644
--- a/drivers/gpu/drm/xe/xe_eudebug.c
+++ b/drivers/gpu/drm/xe/xe_eudebug.c
@@ -1278,7 +1278,7 @@ static int exec_queue_create_event(struct xe_eudebug *d,
u64 h_lrc[XE_HW_ENGINE_MAX_INSTANCE], seqno;
int i;
- if (!xe_exec_queue_is_lr(q))
+ if (!xe_exec_queue_is_debuggable(q))
return 0;
h_c = find_handle(d->res, XE_EUDEBUG_RES_TYPE_CLIENT, xef);
@@ -1330,7 +1330,7 @@ static int exec_queue_destroy_event(struct xe_eudebug *d,
u64 h_lrc[XE_HW_ENGINE_MAX_INSTANCE], seqno;
int i;
- if (!xe_exec_queue_is_lr(q))
+ if (!xe_exec_queue_is_debuggable(q))
return 0;
h_c = find_handle(d->res, XE_EUDEBUG_RES_TYPE_CLIENT, xef);
diff --git a/drivers/gpu/drm/xe/xe_exec_queue.c b/drivers/gpu/drm/xe/xe_exec_queue.c
index e6b2487de48e..c2d6993ac103 100644
--- a/drivers/gpu/drm/xe/xe_exec_queue.c
+++ b/drivers/gpu/drm/xe/xe_exec_queue.c
@@ -109,6 +109,7 @@ static struct xe_exec_queue *__xe_exec_queue_alloc(struct xe_device *xe,
static int __xe_exec_queue_init(struct xe_exec_queue *q)
{
struct xe_vm *vm = q->vm;
+ u32 flags = 0;
int i, err;
if (vm) {
@@ -117,8 +118,11 @@ static int __xe_exec_queue_init(struct xe_exec_queue *q)
return err;
}
+ if (q->eudebug_flags & EXEC_QUEUE_EUDEBUG_FLAG_ENABLE)
+ flags |= LRC_CREATE_RUNALONE;
+
for (i = 0; i < q->width; ++i) {
- q->lrc[i] = xe_lrc_create(q->hwe, q->vm, SZ_16K);
+ q->lrc[i] = xe_lrc_create(q->hwe, q->vm, SZ_16K, flags);
if (IS_ERR(q->lrc[i])) {
err = PTR_ERR(q->lrc[i]);
goto err_unlock;
@@ -393,6 +397,42 @@ static int exec_queue_set_timeslice(struct xe_device *xe, struct xe_exec_queue *
return 0;
}
+static int exec_queue_set_eudebug(struct xe_device *xe, struct xe_exec_queue *q,
+ u64 value)
+{
+ const u64 known_flags = DRM_XE_EXEC_QUEUE_EUDEBUG_FLAG_ENABLE;
+
+ if (XE_IOCTL_DBG(xe, (q->class != XE_ENGINE_CLASS_RENDER &&
+ q->class != XE_ENGINE_CLASS_COMPUTE)))
+ return -EINVAL;
+
+ if (XE_IOCTL_DBG(xe, (value & ~known_flags)))
+ return -EINVAL;
+
+ if (XE_IOCTL_DBG(xe, !IS_ENABLED(CONFIG_DRM_XE_EUDEBUG)))
+ return -EOPNOTSUPP;
+
+ if (XE_IOCTL_DBG(xe, !xe_exec_queue_is_lr(q)))
+ return -EINVAL;
+ /*
+ * We want to explicitly set the global feature if
+ * property is set.
+ */
+ if (XE_IOCTL_DBG(xe,
+ !(value & DRM_XE_EXEC_QUEUE_EUDEBUG_FLAG_ENABLE)))
+ return -EINVAL;
+
+ q->eudebug_flags = EXEC_QUEUE_EUDEBUG_FLAG_ENABLE;
+ q->sched_props.preempt_timeout_us = 0;
+
+ return 0;
+}
+
+int xe_exec_queue_is_debuggable(struct xe_exec_queue *q)
+{
+ return q->eudebug_flags & EXEC_QUEUE_EUDEBUG_FLAG_ENABLE;
+}
+
typedef int (*xe_exec_queue_set_property_fn)(struct xe_device *xe,
struct xe_exec_queue *q,
u64 value);
@@ -400,6 +440,7 @@ typedef int (*xe_exec_queue_set_property_fn)(struct xe_device *xe,
static const xe_exec_queue_set_property_fn exec_queue_set_property_funcs[] = {
[DRM_XE_EXEC_QUEUE_SET_PROPERTY_PRIORITY] = exec_queue_set_priority,
[DRM_XE_EXEC_QUEUE_SET_PROPERTY_TIMESLICE] = exec_queue_set_timeslice,
+ [DRM_XE_EXEC_QUEUE_SET_PROPERTY_EUDEBUG] = exec_queue_set_eudebug,
};
static int exec_queue_user_ext_set_property(struct xe_device *xe,
@@ -419,7 +460,8 @@ static int exec_queue_user_ext_set_property(struct xe_device *xe,
ARRAY_SIZE(exec_queue_set_property_funcs)) ||
XE_IOCTL_DBG(xe, ext.pad) ||
XE_IOCTL_DBG(xe, ext.property != DRM_XE_EXEC_QUEUE_SET_PROPERTY_PRIORITY &&
- ext.property != DRM_XE_EXEC_QUEUE_SET_PROPERTY_TIMESLICE))
+ ext.property != DRM_XE_EXEC_QUEUE_SET_PROPERTY_TIMESLICE &&
+ ext.property != DRM_XE_EXEC_QUEUE_SET_PROPERTY_EUDEBUG))
return -EINVAL;
idx = array_index_nospec(ext.property, ARRAY_SIZE(exec_queue_set_property_funcs));
diff --git a/drivers/gpu/drm/xe/xe_exec_queue.h b/drivers/gpu/drm/xe/xe_exec_queue.h
index 90c7f73eab88..421d8dc89814 100644
--- a/drivers/gpu/drm/xe/xe_exec_queue.h
+++ b/drivers/gpu/drm/xe/xe_exec_queue.h
@@ -85,4 +85,6 @@ int xe_exec_queue_last_fence_test_dep(struct xe_exec_queue *q,
struct xe_vm *vm);
void xe_exec_queue_update_run_ticks(struct xe_exec_queue *q);
+int xe_exec_queue_is_debuggable(struct xe_exec_queue *q);
+
#endif
diff --git a/drivers/gpu/drm/xe/xe_exec_queue_types.h b/drivers/gpu/drm/xe/xe_exec_queue_types.h
index 1158b6062a6c..03f3ad235e4b 100644
--- a/drivers/gpu/drm/xe/xe_exec_queue_types.h
+++ b/drivers/gpu/drm/xe/xe_exec_queue_types.h
@@ -90,6 +90,13 @@ struct xe_exec_queue {
*/
unsigned long flags;
+ /**
+ * @eudebug_flags: immutable eudebug flags for this exec queue.
+ * Set up with DRM_XE_EXEC_QUEUE_SET_PROPERTY_EUDEBUG.
+ */
+#define EXEC_QUEUE_EUDEBUG_FLAG_ENABLE BIT(0)
+ unsigned long eudebug_flags;
+
union {
/** @multi_gt_list: list head for VM bind engines if multi-GT */
struct list_head multi_gt_list;
diff --git a/drivers/gpu/drm/xe/xe_execlist.c b/drivers/gpu/drm/xe/xe_execlist.c
index f3b71fe7a96d..b425c48ca49d 100644
--- a/drivers/gpu/drm/xe/xe_execlist.c
+++ b/drivers/gpu/drm/xe/xe_execlist.c
@@ -265,7 +265,7 @@ struct xe_execlist_port *xe_execlist_port_create(struct xe_device *xe,
port->hwe = hwe;
- port->lrc = xe_lrc_create(hwe, NULL, SZ_16K);
+ port->lrc = xe_lrc_create(hwe, NULL, SZ_16K, 0);
if (IS_ERR(port->lrc)) {
err = PTR_ERR(port->lrc);
goto err;
diff --git a/drivers/gpu/drm/xe/xe_lrc.c b/drivers/gpu/drm/xe/xe_lrc.c
index 4f64c7f4e68d..d30486c4fb62 100644
--- a/drivers/gpu/drm/xe/xe_lrc.c
+++ b/drivers/gpu/drm/xe/xe_lrc.c
@@ -875,7 +875,7 @@ static void xe_lrc_finish(struct xe_lrc *lrc)
#define PVC_CTX_ACC_CTR_THOLD (0x2a + 1)
static int xe_lrc_init(struct xe_lrc *lrc, struct xe_hw_engine *hwe,
- struct xe_vm *vm, u32 ring_size)
+ struct xe_vm *vm, u32 ring_size, u32 flags)
{
struct xe_gt *gt = hwe->gt;
struct xe_tile *tile = gt_to_tile(gt);
@@ -992,6 +992,16 @@ static int xe_lrc_init(struct xe_lrc *lrc, struct xe_hw_engine *hwe,
map = __xe_lrc_start_seqno_map(lrc);
xe_map_write32(lrc_to_xe(lrc), &map, lrc->fence_ctx.next_seqno - 1);
+ if (flags & LRC_CREATE_RUNALONE) {
+ u32 ctx_control = xe_lrc_read_ctx_reg(lrc, CTX_CONTEXT_CONTROL);
+
+ drm_dbg(&xe->drm, "read CTX_CONTEXT_CONTROL: 0x%x\n", ctx_control);
+ ctx_control |= _MASKED_BIT_ENABLE(CTX_CTRL_RUN_ALONE);
+ drm_dbg(&xe->drm, "written CTX_CONTEXT_CONTROL: 0x%x\n", ctx_control);
+
+ xe_lrc_write_ctx_reg(lrc, CTX_CONTEXT_CONTROL, ctx_control);
+ }
+
return 0;
err_lrc_finish:
@@ -1011,7 +1021,7 @@ static int xe_lrc_init(struct xe_lrc *lrc, struct xe_hw_engine *hwe,
* upon failure.
*/
struct xe_lrc *xe_lrc_create(struct xe_hw_engine *hwe, struct xe_vm *vm,
- u32 ring_size)
+ u32 ring_size, u32 flags)
{
struct xe_lrc *lrc;
int err;
@@ -1020,7 +1030,7 @@ struct xe_lrc *xe_lrc_create(struct xe_hw_engine *hwe, struct xe_vm *vm,
if (!lrc)
return ERR_PTR(-ENOMEM);
- err = xe_lrc_init(lrc, hwe, vm, ring_size);
+ err = xe_lrc_init(lrc, hwe, vm, ring_size, flags);
if (err) {
kfree(lrc);
return ERR_PTR(err);
diff --git a/drivers/gpu/drm/xe/xe_lrc.h b/drivers/gpu/drm/xe/xe_lrc.h
index 40d8f6906d3e..7e4c8c9d437f 100644
--- a/drivers/gpu/drm/xe/xe_lrc.h
+++ b/drivers/gpu/drm/xe/xe_lrc.h
@@ -39,8 +39,10 @@ struct xe_lrc_snapshot {
#define LRC_PPHWSP_SCRATCH_ADDR (0x34 * 4)
+#define LRC_CREATE_RUNALONE BIT(0)
+
struct xe_lrc *xe_lrc_create(struct xe_hw_engine *hwe, struct xe_vm *vm,
- u32 ring_size);
+ u32 ring_size, u32 flags);
void xe_lrc_destroy(struct kref *ref);
/**
diff --git a/include/uapi/drm/xe_drm.h b/include/uapi/drm/xe_drm.h
index 29a8366089a9..de8c6669176a 100644
--- a/include/uapi/drm/xe_drm.h
+++ b/include/uapi/drm/xe_drm.h
@@ -1112,7 +1112,8 @@ struct drm_xe_exec_queue_create {
#define DRM_XE_EXEC_QUEUE_EXTENSION_SET_PROPERTY 0
#define DRM_XE_EXEC_QUEUE_SET_PROPERTY_PRIORITY 0
#define DRM_XE_EXEC_QUEUE_SET_PROPERTY_TIMESLICE 1
-
+#define DRM_XE_EXEC_QUEUE_SET_PROPERTY_EUDEBUG 2
+#define DRM_XE_EXEC_QUEUE_EUDEBUG_FLAG_ENABLE (1 << 0)
/** @extensions: Pointer to the first extension struct, if any */
__u64 extensions;
--
2.46.1
^ permalink raw reply related [flat|nested] 28+ messages in thread* [RFC 07/19] drm/xe/eudebug: Introduce per device attention scan worker
2024-10-21 9:58 [RFC 00/19] Support EU online debug on pagefault Gwan-gyeong Mun
` (5 preceding siblings ...)
2024-10-21 9:58 ` [RFC 06/19] drm/xe: Add EUDEBUG_ENABLE exec queue property Gwan-gyeong Mun
@ 2024-10-21 9:58 ` Gwan-gyeong Mun
2024-10-21 9:58 ` [RFC 08/19] drm/xe/eudebug: Introduce EU control interface Gwan-gyeong Mun
` (18 subsequent siblings)
25 siblings, 0 replies; 28+ messages in thread
From: Gwan-gyeong Mun @ 2024-10-21 9:58 UTC (permalink / raw)
To: intel-xe
Cc: nirmoy.das, matthew.brost, stuart.summers, christoph.manszewski,
mika.kuoppala, dominik.grzegorzek, andrzej.hajda,
maciej.patelczyk
From: Dominik Grzegorzek <dominik.grzegorzek@intel.com>
Scan for EU debugging attention bits periodically to detect if some EU
thread has entered the system routine (SIP) due to EU thread exception.
Make the scanning interval 10 times slower when there is no debugger
connection open. Send attention event whenever we see attention with
debugger presence. If there is no debugger connection active - reset.
Based on work by authors and other folks who were part of attentions in
i915.
v2: - use xa_array for files
- null ptr deref fix for non-debugged context (Dominik)
- checkpatch (Tilak)
- use discovery_lock during list traversal
v3: update to use changed xe_force_wake_get() failure handling (G.G.)
Signed-off-by: Dominik Grzegorzek <dominik.grzegorzek@intel.com>
Signed-off-by: Christoph Manszewski <christoph.manszewski@intel.com>
Signed-off-by: Maciej Patelczyk <maciej.patelczyk@intel.com>
Signed-off-by: Mika Kuoppala <mika.kuoppala@linux.intel.com>
Signed-off-by: Gwan-gyeong Mun <gwan-gyeong.mun@intel.com>
---
drivers/gpu/drm/xe/Makefile | 1 +
drivers/gpu/drm/xe/regs/xe_engine_regs.h | 3 +
drivers/gpu/drm/xe/regs/xe_gt_regs.h | 7 +
drivers/gpu/drm/xe/xe_device.c | 2 +
drivers/gpu/drm/xe/xe_device_types.h | 3 +
drivers/gpu/drm/xe/xe_eudebug.c | 384 ++++++++++++++++++++++-
drivers/gpu/drm/xe/xe_eudebug.h | 2 +
drivers/gpu/drm/xe/xe_eudebug_types.h | 32 ++
drivers/gpu/drm/xe/xe_force_wake.c | 1 -
drivers/gpu/drm/xe/xe_gt_debug.c | 151 +++++++++
drivers/gpu/drm/xe/xe_gt_debug.h | 21 ++
include/uapi/drm/xe_drm_eudebug.h | 13 +
12 files changed, 618 insertions(+), 2 deletions(-)
create mode 100644 drivers/gpu/drm/xe/xe_gt_debug.c
create mode 100644 drivers/gpu/drm/xe/xe_gt_debug.h
diff --git a/drivers/gpu/drm/xe/Makefile b/drivers/gpu/drm/xe/Makefile
index 60cb35c393b1..c5f703d22ba4 100644
--- a/drivers/gpu/drm/xe/Makefile
+++ b/drivers/gpu/drm/xe/Makefile
@@ -48,6 +48,7 @@ xe-y += xe_bb.o \
xe_gt_clock.o \
xe_gt_freq.o \
xe_gt_idle.o \
+ xe_gt_debug.o \
xe_gt_mcr.o \
xe_gt_pagefault.o \
xe_gt_sysfs.o \
diff --git a/drivers/gpu/drm/xe/regs/xe_engine_regs.h b/drivers/gpu/drm/xe/regs/xe_engine_regs.h
index e45c4d5378e5..83b26cb174d6 100644
--- a/drivers/gpu/drm/xe/regs/xe_engine_regs.h
+++ b/drivers/gpu/drm/xe/regs/xe_engine_regs.h
@@ -133,6 +133,9 @@
#define RING_EXECLIST_STATUS_LO(base) XE_REG((base) + 0x234)
#define RING_EXECLIST_STATUS_HI(base) XE_REG((base) + 0x234 + 4)
+#define RING_CURRENT_LRCA(base) XE_REG((base) + 0x240)
+#define CURRENT_LRCA_VALID REG_BIT(0)
+
#define RING_CONTEXT_CONTROL(base) XE_REG((base) + 0x244, XE_REG_OPTION_MASKED)
#define CTX_CTRL_OAC_CONTEXT_ENABLE REG_BIT(8)
#define CTX_CTRL_RUN_ALONE REG_BIT(7)
diff --git a/drivers/gpu/drm/xe/regs/xe_gt_regs.h b/drivers/gpu/drm/xe/regs/xe_gt_regs.h
index 45836d232fb2..4a6c9837da03 100644
--- a/drivers/gpu/drm/xe/regs/xe_gt_regs.h
+++ b/drivers/gpu/drm/xe/regs/xe_gt_regs.h
@@ -465,6 +465,8 @@
#define DISABLE_ECC REG_BIT(5)
#define ENABLE_PREFETCH_INTO_IC REG_BIT(3)
+#define TD_ATT(x) XE_REG_MCR(0xe470 + (x) * 4)
+
#define ROW_CHICKEN4 XE_REG_MCR(0xe48c, XE_REG_OPTION_MASKED)
#define DISABLE_GRF_CLEAR REG_BIT(13)
#define XEHP_DIS_BBL_SYSPIPE REG_BIT(11)
@@ -545,6 +547,11 @@
#define CCS_MODE_CSLICE(cslice, ccs) \
((ccs) << ((cslice) * CCS_MODE_CSLICE_WIDTH))
+#define RCU_DEBUG_1 XE_REG(0x14a00)
+#define RCU_DEBUG_1_ENGINE_STATUS REG_GENMASK(2, 0)
+#define RCU_DEBUG_1_RUNALONE_ACTIVE REG_BIT(2)
+#define RCU_DEBUG_1_CONTEXT_ACTIVE REG_BIT(0)
+
#define FORCEWAKE_ACK_GT XE_REG(0x130044)
/* Applicable for all FORCEWAKE_DOMAIN and FORCEWAKE_ACK_DOMAIN regs */
diff --git a/drivers/gpu/drm/xe/xe_device.c b/drivers/gpu/drm/xe/xe_device.c
index 17a1b6f37d1d..66d26ae3e11c 100644
--- a/drivers/gpu/drm/xe/xe_device.c
+++ b/drivers/gpu/drm/xe/xe_device.c
@@ -781,6 +781,8 @@ int xe_device_probe(struct xe_device *xe)
xe_debugfs_register(xe);
+ xe_eudebug_init_late(xe);
+
xe_hwmon_register(xe);
for_each_gt(gt, xe, id)
diff --git a/drivers/gpu/drm/xe/xe_device_types.h b/drivers/gpu/drm/xe/xe_device_types.h
index 54ceeee7cf75..562cc8930533 100644
--- a/drivers/gpu/drm/xe/xe_device_types.h
+++ b/drivers/gpu/drm/xe/xe_device_types.h
@@ -548,6 +548,9 @@ struct xe_device {
/** discovery_lock: used for discovery to block xe ioctls */
struct rw_semaphore discovery_lock;
+
+ /** @attention_scan: attention scan worker */
+ struct delayed_work attention_scan;
} eudebug;
#endif
diff --git a/drivers/gpu/drm/xe/xe_eudebug.c b/drivers/gpu/drm/xe/xe_eudebug.c
index dd3418049787..0809603d892f 100644
--- a/drivers/gpu/drm/xe/xe_eudebug.c
+++ b/drivers/gpu/drm/xe/xe_eudebug.c
@@ -20,9 +20,17 @@
#include "xe_eudebug.h"
#include "xe_eudebug_types.h"
#include "xe_exec_queue.h"
+#include "xe_force_wake.h"
+#include "xe_gt.h"
+#include "xe_gt_debug.h"
+#include "xe_hw_engine.h"
+#include "xe_lrc.h"
#include "xe_macros.h"
+#include "xe_mmio.h"
+#include "xe_pm.h"
#include "xe_reg_sr.h"
#include "xe_rtp.h"
+#include "xe_sched_job.h"
#include "xe_vm.h"
#include "xe_wa.h"
@@ -757,7 +765,7 @@ static long xe_eudebug_read_event(struct xe_eudebug *d,
u64_to_user_ptr(arg);
struct drm_xe_eudebug_event user_event;
struct xe_eudebug_event *event;
- const unsigned int max_event = DRM_XE_EUDEBUG_EVENT_EXEC_QUEUE;
+ const unsigned int max_event = DRM_XE_EUDEBUG_EVENT_EU_ATTENTION;
long ret = 0;
if (XE_IOCTL_DBG(xe, copy_from_user(&user_event, user_orig, sizeof(user_event))))
@@ -864,6 +872,368 @@ static const struct file_operations fops = {
.unlocked_ioctl = xe_eudebug_ioctl,
};
+static int __current_lrca(struct xe_hw_engine *hwe, u32 *lrc_hw)
+{
+ u32 lrc_reg;
+
+ lrc_reg = xe_hw_engine_mmio_read32(hwe, RING_CURRENT_LRCA(0));
+
+ if (!(lrc_reg & CURRENT_LRCA_VALID))
+ return -ENOENT;
+
+ *lrc_hw = lrc_reg & GENMASK(31, 12);
+
+ return 0;
+}
+
+static int current_lrca(struct xe_hw_engine *hwe, u32 *lrc_hw)
+{
+ unsigned int fw_ref;
+ int ret;
+
+ fw_ref = xe_force_wake_get(gt_to_fw(hwe->gt), hwe->domain);
+ if (!fw_ref)
+ return -ETIMEDOUT;
+
+ ret = __current_lrca(hwe, lrc_hw);
+
+ xe_force_wake_put(gt_to_fw(hwe->gt), fw_ref);
+
+ return ret;
+}
+
+static bool lrca_equals(u32 a, u32 b)
+{
+ return (a & GENMASK(31, 12)) == (b & GENMASK(31, 12));
+}
+
+static int match_exec_queue_lrca(struct xe_exec_queue *q, u32 lrc_hw)
+{
+ int i;
+
+ for (i = 0; i < q->width; i++)
+ if (lrca_equals(lower_32_bits(xe_lrc_descriptor(q->lrc[i])), lrc_hw))
+ return i;
+
+ return -1;
+}
+
+static u32 engine_status(const struct xe_hw_engine * const hwe,
+ u32 rcu_debug1)
+{
+ const bool xe1 = GRAPHICS_VER(gt_to_xe(hwe->gt)) < 20;
+ unsigned int shift;
+
+ if (hwe->class == XE_ENGINE_CLASS_RENDER) {
+ shift = 7;
+ XE_WARN_ON(hwe->instance != 0);
+ } else if (hwe->class == XE_ENGINE_CLASS_COMPUTE) {
+ XE_WARN_ON(hwe->instance > 3);
+
+ if (xe1)
+ shift = 10 + (hwe->instance * 3);
+ else
+ shift = 11 + (hwe->instance * 4);
+ } else {
+ XE_WARN_ON(hwe->class);
+ return 0;
+ }
+
+ return (rcu_debug1 >> shift) & RCU_DEBUG_1_ENGINE_STATUS;
+}
+
+static bool engine_runalone_set(const struct xe_hw_engine * const hwe,
+ u32 rcu_debug1)
+{
+ return engine_status(hwe, rcu_debug1) & RCU_DEBUG_1_RUNALONE_ACTIVE;
+}
+
+static bool engine_context_set(const struct xe_hw_engine * const hwe,
+ u32 rcu_debug1)
+{
+ return engine_status(hwe, rcu_debug1) & RCU_DEBUG_1_CONTEXT_ACTIVE;
+}
+
+static bool engine_has_runalone(const struct xe_hw_engine * const hwe)
+{
+ return hwe->class == XE_ENGINE_CLASS_RENDER ||
+ hwe->class == XE_ENGINE_CLASS_COMPUTE;
+}
+
+static struct xe_hw_engine *get_runalone_active_hw_engine(struct xe_gt *gt)
+{
+ struct xe_hw_engine *hwe, *first = NULL;
+ unsigned int num_active, id;
+ unsigned int fw_ref;
+ u32 val;
+
+ fw_ref = xe_force_wake_get(gt_to_fw(gt), XE_FW_GT);
+ if (!fw_ref) {
+ drm_dbg(>_to_xe(gt)->drm, "eudbg: runalone failed to get force wake\n");
+ return NULL;
+ }
+
+ val = xe_mmio_read32(>->mmio, RCU_DEBUG_1);
+ xe_force_wake_put(gt_to_fw(gt), fw_ref);
+
+ drm_dbg(>_to_xe(gt)->drm, "eudbg: runalone RCU_DEBUG_1 = 0x%08x\n", val);
+
+ num_active = 0;
+ for_each_hw_engine(hwe, gt, id) {
+ bool runalone, ctx;
+
+ if (!engine_has_runalone(hwe))
+ continue;
+
+ runalone = engine_runalone_set(hwe, val);
+ ctx = engine_context_set(hwe, val);
+
+ drm_dbg(>_to_xe(gt)->drm, "eudbg: engine %s: runalone=%s, context=%s",
+ hwe->name, runalone ? "active" : "inactive",
+ ctx ? "active" : "inactive");
+
+ /*
+ * On earlier gen12 the context status seems to be idle when
+ * it has raised attention. We have to omit the active bit.
+ */
+ if (IS_DGFX(gt_to_xe(gt)))
+ ctx = true;
+
+ if (runalone && ctx) {
+ num_active++;
+
+ drm_dbg(>_to_xe(gt)->drm, "eudbg: runalone engine %s %s",
+ hwe->name, first ? "selected" : "found");
+ if (!first)
+ first = hwe;
+ }
+ }
+
+ if (num_active > 1)
+ drm_err(>_to_xe(gt)->drm, "eudbg: %d runalone engines active!",
+ num_active);
+
+ return first;
+}
+
+static struct xe_exec_queue *runalone_active_queue_get(struct xe_gt *gt, int *lrc_idx)
+{
+ struct xe_device *xe = gt_to_xe(gt);
+ struct xe_exec_queue *q, *found = NULL;
+ struct xe_hw_engine *active;
+ struct xe_file *xef;
+ unsigned long i;
+ int idx, err;
+ u32 lrc_hw;
+
+ active = get_runalone_active_hw_engine(gt);
+ if (!active) {
+ drm_dbg(>_to_xe(gt)->drm, "Runalone engine not found!");
+ return ERR_PTR(-ENOENT);
+ }
+
+ err = current_lrca(active, &lrc_hw);
+ if (err)
+ return ERR_PTR(err);
+
+ /* Take write so that we can safely check the lists */
+ down_write(&xe->eudebug.discovery_lock);
+ list_for_each_entry(xef, &xe->clients.list, eudebug.client_link) {
+ xa_for_each(&xef->exec_queue.xa, i, q) {
+ if (q->gt != gt)
+ continue;
+
+ if (q->class != active->class)
+ continue;
+
+ if (xe_exec_queue_is_idle(q))
+ continue;
+
+ idx = match_exec_queue_lrca(q, lrc_hw);
+ if (idx < 0)
+ continue;
+
+ found = xe_exec_queue_get(q);
+
+ if (lrc_idx)
+ *lrc_idx = idx;
+
+ break;
+ }
+
+ if (found)
+ break;
+ }
+ up_write(&xe->eudebug.discovery_lock);
+
+ if (!found)
+ return ERR_PTR(-ENOENT);
+
+ if (XE_WARN_ON(current_lrca(active, &lrc_hw)) &&
+ XE_WARN_ON(match_exec_queue_lrca(found, lrc_hw) < 0)) {
+ xe_exec_queue_put(found);
+ return ERR_PTR(-ENOENT);
+ }
+
+ return found;
+}
+
+static int send_attention_event(struct xe_eudebug *d, struct xe_exec_queue *q, int lrc_idx)
+{
+ struct xe_eudebug_event_eu_attention *ea;
+ struct xe_eudebug_event *event;
+ int h_c, h_queue, h_lrc;
+ u32 size = xe_gt_eu_attention_bitmap_size(q->gt);
+ u32 sz = struct_size(ea, bitmask, size);
+ int ret;
+
+ XE_WARN_ON(lrc_idx < 0 || lrc_idx >= q->width);
+
+ XE_WARN_ON(!xe_exec_queue_is_debuggable(q));
+
+ h_c = find_handle(d->res, XE_EUDEBUG_RES_TYPE_CLIENT, q->vm->xef);
+ if (h_c < 0)
+ return h_c;
+
+ h_queue = find_handle(d->res, XE_EUDEBUG_RES_TYPE_EXEC_QUEUE, q);
+ if (h_queue < 0)
+ return h_queue;
+
+ h_lrc = find_handle(d->res, XE_EUDEBUG_RES_TYPE_LRC, q->lrc[lrc_idx]);
+ if (h_lrc < 0)
+ return h_lrc;
+
+ event = __xe_eudebug_create_event(d, 0, DRM_XE_EUDEBUG_EVENT_EU_ATTENTION,
+ DRM_XE_EUDEBUG_EVENT_STATE_CHANGE, sz, GFP_KERNEL);
+
+ if (!event)
+ return -ENOSPC;
+
+ ea = cast_event(ea, event);
+ write_member(struct drm_xe_eudebug_event_eu_attention, ea, client_handle, (u64)h_c);
+ write_member(struct drm_xe_eudebug_event_eu_attention, ea, exec_queue_handle, (u64)h_queue);
+ write_member(struct drm_xe_eudebug_event_eu_attention, ea, lrc_handle, (u64)h_lrc);
+ write_member(struct drm_xe_eudebug_event_eu_attention, ea, bitmask_size, size);
+
+ mutex_lock(&d->eu_lock);
+ event->seqno = atomic_long_inc_return(&d->events.seqno);
+ ret = xe_gt_eu_attention_bitmap(q->gt, &ea->bitmask[0], ea->bitmask_size);
+ mutex_unlock(&d->eu_lock);
+
+ if (ret)
+ return ret;
+
+ return xe_eudebug_queue_event(d, event);
+}
+
+
+static int xe_send_gt_attention(struct xe_gt *gt)
+{
+ struct xe_eudebug *d;
+ struct xe_exec_queue *q;
+ int ret, lrc_idx;
+
+ if (list_empty_careful(>_to_xe(gt)->eudebug.list))
+ return -ENOTCONN;
+
+ q = runalone_active_queue_get(gt, &lrc_idx);
+ if (IS_ERR(q))
+ return PTR_ERR(q);
+
+ if (!xe_exec_queue_is_debuggable(q)) {
+ ret = -EPERM;
+ goto err_exec_queue_put;
+ }
+
+ d = _xe_eudebug_get(q->vm->xef);
+ if (!d) {
+ ret = -ENOTCONN;
+ goto err_exec_queue_put;
+ }
+
+ if (!completion_done(&d->discovery)) {
+ eu_dbg(d, "discovery not yet done\n");
+ ret = -EBUSY;
+ goto err_eudebug_put;
+ }
+
+ ret = send_attention_event(d, q, lrc_idx);
+ if (ret)
+ xe_eudebug_disconnect(d, ret);
+
+err_eudebug_put:
+ xe_eudebug_put(d);
+err_exec_queue_put:
+ xe_exec_queue_put(q);
+
+ return ret;
+}
+
+static int xe_eudebug_handle_gt_attention(struct xe_gt *gt)
+{
+ int ret;
+
+ ret = xe_gt_eu_threads_needing_attention(gt);
+ if (ret <= 0)
+ return ret;
+
+ ret = xe_send_gt_attention(gt);
+
+ /* Discovery in progress, fake it */
+ if (ret == -EBUSY)
+ return 0;
+
+ return ret;
+}
+
+#define XE_EUDEBUG_ATTENTION_INTERVAL 100
+static void attention_scan_fn(struct work_struct *work)
+{
+ struct xe_device *xe = container_of(work, typeof(*xe), eudebug.attention_scan.work);
+ long delay = msecs_to_jiffies(XE_EUDEBUG_ATTENTION_INTERVAL);
+ struct xe_gt *gt;
+ u8 gt_id;
+
+ if (list_empty_careful(&xe->eudebug.list))
+ delay *= 10;
+
+ if (delay >= HZ)
+ delay = round_jiffies_up_relative(delay);
+
+ if (xe_pm_runtime_get_if_active(xe)) {
+ for_each_gt(gt, xe, gt_id) {
+ int ret;
+
+ if (gt->info.type != XE_GT_TYPE_MAIN)
+ continue;
+
+ ret = xe_eudebug_handle_gt_attention(gt);
+ if (ret) {
+ // TODO: error capture
+ drm_info(>_to_xe(gt)->drm,
+ "gt:%d unable to handle eu attention ret=%d\n",
+ gt_id, ret);
+
+ xe_gt_reset_async(gt);
+ }
+ }
+
+ xe_pm_runtime_put(xe);
+ }
+
+ schedule_delayed_work(&xe->eudebug.attention_scan, delay);
+}
+
+static void attention_scan_cancel(struct xe_device *xe)
+{
+ cancel_delayed_work_sync(&xe->eudebug.attention_scan);
+}
+
+static void attention_scan_flush(struct xe_device *xe)
+{
+ mod_delayed_work(system_wq, &xe->eudebug.attention_scan, 0);
+}
+
static void discovery_work_fn(struct work_struct *work);
static int
@@ -898,6 +1268,7 @@ xe_eudebug_connect(struct xe_device *xe,
kref_init(&d->ref);
spin_lock_init(&d->connection.lock);
+ mutex_init(&d->eu_lock);
init_waitqueue_head(&d->events.write_done);
init_waitqueue_head(&d->events.read_done);
init_completion(&d->discovery);
@@ -924,6 +1295,7 @@ xe_eudebug_connect(struct xe_device *xe,
kref_get(&d->ref);
queue_work(xe->eudebug.ordered_wq, &d->discovery_work);
+ attention_scan_flush(xe);
eu_dbg(d, "connected session %lld", d->session);
@@ -1020,13 +1392,23 @@ void xe_eudebug_init(struct xe_device *xe)
INIT_LIST_HEAD(&xe->eudebug.list);
INIT_LIST_HEAD(&xe->clients.list);
init_rwsem(&xe->eudebug.discovery_lock);
+ INIT_DELAYED_WORK(&xe->eudebug.attention_scan, attention_scan_fn);
xe->eudebug.ordered_wq = alloc_ordered_workqueue("xe-eudebug-ordered-wq", 0);
xe->eudebug.available = !!xe->eudebug.ordered_wq;
}
+void xe_eudebug_init_late(struct xe_device *xe)
+{
+ if (!xe->eudebug.available)
+ return;
+
+ attention_scan_flush(xe);
+}
+
void xe_eudebug_fini(struct xe_device *xe)
{
+ attention_scan_cancel(xe);
xe_assert(xe, list_empty_careful(&xe->eudebug.list));
if (xe->eudebug.ordered_wq)
diff --git a/drivers/gpu/drm/xe/xe_eudebug.h b/drivers/gpu/drm/xe/xe_eudebug.h
index 3cd6bc7bb682..1fe86bec99e1 100644
--- a/drivers/gpu/drm/xe/xe_eudebug.h
+++ b/drivers/gpu/drm/xe/xe_eudebug.h
@@ -20,6 +20,7 @@ int xe_eudebug_connect_ioctl(struct drm_device *dev,
struct drm_file *file);
void xe_eudebug_init(struct xe_device *xe);
+void xe_eudebug_init_late(struct xe_device *xe);
void xe_eudebug_fini(struct xe_device *xe);
void xe_eudebug_init_hw_engine(struct xe_hw_engine *hwe);
@@ -39,6 +40,7 @@ static inline int xe_eudebug_connect_ioctl(struct drm_device *dev,
struct drm_file *file) { return 0; }
static inline void xe_eudebug_init(struct xe_device *xe) { }
+static inline void xe_eudebug_init_late(struct xe_device *xe) { }
static inline void xe_eudebug_fini(struct xe_device *xe) { }
static inline void xe_eudebug_init_hw_engine(struct xe_hw_engine *hwe) { }
diff --git a/drivers/gpu/drm/xe/xe_eudebug_types.h b/drivers/gpu/drm/xe/xe_eudebug_types.h
index 6428905a0557..b885296fddbb 100644
--- a/drivers/gpu/drm/xe/xe_eudebug_types.h
+++ b/drivers/gpu/drm/xe/xe_eudebug_types.h
@@ -105,6 +105,9 @@ struct xe_eudebug {
/** @discovery_work: worker to discover resources for target_task */
struct work_struct discovery_work;
+ /** eu_lock: guards operations on eus (eu thread control and attention) */
+ struct mutex eu_lock;
+
/** @events: kfifo queue of to-be-delivered events */
struct {
/** @lock: guards access to fifo */
@@ -202,4 +205,33 @@ struct xe_eudebug_event_exec_queue {
u64 lrc_handle[];
};
+/**
+ * struct xe_eudebug_event_eu_attention - Internal event for EU attention
+ */
+struct xe_eudebug_event_eu_attention {
+ /** @base: base event */
+ struct xe_eudebug_event base;
+
+ /** @client_handle: client for the attention */
+ u64 client_handle;
+
+ /** @exec_queue_handle: handle of exec_queue which raised attention */
+ u64 exec_queue_handle;
+
+ /** @lrc_handle: lrc handle of the workload which raised attention */
+ u64 lrc_handle;
+
+ /** @flags: eu attention event flags, currently MBZ */
+ u32 flags;
+
+ /** @bitmask_size: size of the bitmask, specific to device */
+ u32 bitmask_size;
+
+ /**
+ * @bitmask: reflects threads currently signalling attention,
+ * starting from natural hardware order of DSS=0, eu=0
+ */
+ u8 bitmask[];
+};
+
#endif
diff --git a/drivers/gpu/drm/xe/xe_force_wake.c b/drivers/gpu/drm/xe/xe_force_wake.c
index 4f6784e5abf8..87e351ef9124 100644
--- a/drivers/gpu/drm/xe/xe_force_wake.c
+++ b/drivers/gpu/drm/xe/xe_force_wake.c
@@ -184,7 +184,6 @@ unsigned int __must_check xe_force_wake_get(struct xe_force_wake *fw,
unsigned int tmp, ref_rqst;
unsigned long flags;
- xe_gt_assert(gt, is_power_of_2(domains));
xe_gt_assert(gt, domains <= XE_FORCEWAKE_ALL);
xe_gt_assert(gt, domains == XE_FORCEWAKE_ALL || fw->initialized_domains & domains);
diff --git a/drivers/gpu/drm/xe/xe_gt_debug.c b/drivers/gpu/drm/xe/xe_gt_debug.c
new file mode 100644
index 000000000000..6117f211d85d
--- /dev/null
+++ b/drivers/gpu/drm/xe/xe_gt_debug.c
@@ -0,0 +1,151 @@
+// SPDX-License-Identifier: MIT
+/*
+ * Copyright © 2023 Intel Corporation
+ */
+
+#include "regs/xe_gt_regs.h"
+#include "xe_device.h"
+#include "xe_force_wake.h"
+#include "xe_gt.h"
+#include "xe_gt_topology.h"
+#include "xe_gt_debug.h"
+#include "xe_gt_mcr.h"
+#include "xe_pm.h"
+#include "xe_macros.h"
+
+static int xe_gt_foreach_dss_group_instance(struct xe_gt *gt,
+ int (*fn)(struct xe_gt *gt,
+ void *data,
+ u16 group,
+ u16 instance),
+ void *data)
+{
+ const enum xe_force_wake_domains fw_domains = XE_FW_GT | XE_FW_RENDER;
+ unsigned int dss, fw_ref;
+ u16 group, instance;
+ int ret;
+
+ fw_ref = xe_force_wake_get(gt_to_fw(gt), fw_domains);
+ if (!xe_force_wake_ref_has_domain(fw_ref, fw_domains)) {
+ ret = -ETIMEDOUT;
+ goto err_fw_put;
+ }
+
+ for_each_dss_steering(dss, gt, group, instance) {
+ ret = fn(gt, data, group, instance);
+ if (ret)
+ break;
+ }
+
+err_fw_put:
+ xe_force_wake_put(gt_to_fw(gt), fw_ref);
+
+ return ret;
+}
+
+static int read_first_attention_mcr(struct xe_gt *gt, void *data,
+ u16 group, u16 instance)
+{
+ unsigned int row;
+
+ for (row = 0; row < 2; row++) {
+ u32 val;
+
+ val = xe_gt_mcr_unicast_read(gt, TD_ATT(row), group, instance);
+
+ if (val)
+ return 1;
+ }
+
+ return 0;
+}
+
+#define MAX_EUS_PER_ROW 4u
+#define MAX_THREADS 8u
+
+/**
+ * xe_gt_eu_attention_bitmap_size - query size of the attention bitmask
+ *
+ * @gt: pointer to struct xe_gt
+ *
+ * Return: size in bytes.
+ */
+int xe_gt_eu_attention_bitmap_size(struct xe_gt *gt)
+{
+ xe_dss_mask_t dss_mask;
+
+ bitmap_or(dss_mask, gt->fuse_topo.c_dss_mask,
+ gt->fuse_topo.g_dss_mask, XE_MAX_DSS_FUSE_BITS);
+
+ return bitmap_weight(dss_mask, XE_MAX_DSS_FUSE_BITS) *
+ TD_EU_ATTENTION_MAX_ROWS * MAX_THREADS *
+ MAX_EUS_PER_ROW / 8;
+}
+
+struct attn_read_iter {
+ struct xe_gt *gt;
+ unsigned int i;
+ unsigned int size;
+ u8 *bits;
+};
+
+static int read_eu_attentions_mcr(struct xe_gt *gt, void *data,
+ u16 group, u16 instance)
+{
+ struct attn_read_iter * const iter = data;
+ unsigned int row;
+
+ for (row = 0; row < TD_EU_ATTENTION_MAX_ROWS; row++) {
+ u32 val;
+
+ if (iter->i >= iter->size)
+ return 0;
+
+ XE_WARN_ON(iter->i + sizeof(val) > xe_gt_eu_attention_bitmap_size(gt));
+
+ val = xe_gt_mcr_unicast_read(gt, TD_ATT(row), group, instance);
+
+ memcpy(&iter->bits[iter->i], &val, sizeof(val));
+ iter->i += sizeof(val);
+ }
+
+ return 0;
+}
+
+/**
+ * xe_gt_eu_attention_bitmap - query host attention
+ *
+ * @gt: pointer to struct xe_gt
+ *
+ * Return: 0 on success, negative otherwise.
+ */
+int xe_gt_eu_attention_bitmap(struct xe_gt *gt, u8 *bits,
+ unsigned int bitmap_size)
+{
+ struct attn_read_iter iter = {
+ .gt = gt,
+ .i = 0,
+ .size = bitmap_size,
+ .bits = bits
+ };
+
+ return xe_gt_foreach_dss_group_instance(gt, read_eu_attentions_mcr, &iter);
+}
+
+/**
+ * xe_gt_eu_threads_needing_attention - Query host attention
+ *
+ * @gt: pointer to struct xe_gt
+ *
+ * Return: 1 if threads waiting host attention, 0 otherwise.
+ */
+int xe_gt_eu_threads_needing_attention(struct xe_gt *gt)
+{
+ int err;
+
+ err = xe_gt_foreach_dss_group_instance(gt, read_first_attention_mcr, NULL);
+
+ XE_WARN_ON(err < 0);
+
+ return err < 0 ? 0 : err;
+}
diff --git a/drivers/gpu/drm/xe/xe_gt_debug.h b/drivers/gpu/drm/xe/xe_gt_debug.h
new file mode 100644
index 000000000000..3f13dbb17a5f
--- /dev/null
+++ b/drivers/gpu/drm/xe/xe_gt_debug.h
@@ -0,0 +1,21 @@
+/* SPDX-License-Identifier: MIT */
+/*
+ * Copyright © 2023 Intel Corporation
+ */
+
+#ifndef __XE_GT_DEBUG_
+#define __XE_GT_DEBUG_
+
+#define TD_EU_ATTENTION_MAX_ROWS 2u
+
+#include "xe_gt_types.h"
+
+#define XE_GT_ATTENTION_TIMEOUT_MS 100
+
+int xe_gt_eu_threads_needing_attention(struct xe_gt *gt);
+
+int xe_gt_eu_attention_bitmap_size(struct xe_gt *gt);
+int xe_gt_eu_attention_bitmap(struct xe_gt *gt, u8 *bits,
+ unsigned int bitmap_size);
+
+#endif
diff --git a/include/uapi/drm/xe_drm_eudebug.h b/include/uapi/drm/xe_drm_eudebug.h
index ac44e890152a..1e63bdede5f2 100644
--- a/include/uapi/drm/xe_drm_eudebug.h
+++ b/include/uapi/drm/xe_drm_eudebug.h
@@ -27,12 +27,14 @@ struct drm_xe_eudebug_event {
#define DRM_XE_EUDEBUG_EVENT_OPEN 2
#define DRM_XE_EUDEBUG_EVENT_VM 3
#define DRM_XE_EUDEBUG_EVENT_EXEC_QUEUE 4
+#define DRM_XE_EUDEBUG_EVENT_EU_ATTENTION 5
__u16 flags;
#define DRM_XE_EUDEBUG_EVENT_CREATE (1 << 0)
#define DRM_XE_EUDEBUG_EVENT_DESTROY (1 << 1)
#define DRM_XE_EUDEBUG_EVENT_STATE_CHANGE (1 << 2)
#define DRM_XE_EUDEBUG_EVENT_NEED_ACK (1 << 3)
+
__u64 seqno;
__u64 reserved;
};
@@ -61,6 +63,17 @@ struct drm_xe_eudebug_event_exec_queue {
__u64 lrc_handle[];
};
+struct drm_xe_eudebug_event_eu_attention {
+ struct drm_xe_eudebug_event base;
+
+ __u64 client_handle;
+ __u64 exec_queue_handle;
+ __u64 lrc_handle;
+ __u32 flags;
+ __u32 bitmask_size;
+ __u8 bitmask[];
+};
+
#if defined(__cplusplus)
}
#endif
--
2.46.1
^ permalink raw reply related [flat|nested] 28+ messages in thread* [RFC 08/19] drm/xe/eudebug: Introduce EU control interface
2024-10-21 9:58 [RFC 00/19] Support EU online debug on pagefault Gwan-gyeong Mun
` (6 preceding siblings ...)
2024-10-21 9:58 ` [RFC 07/19] drm/xe/eudebug: Introduce per device attention scan worker Gwan-gyeong Mun
@ 2024-10-21 9:58 ` Gwan-gyeong Mun
2024-10-21 9:58 ` [RFC 09/19] drm/xe/eudebug: Add vm bind and vm bind ops Gwan-gyeong Mun
` (17 subsequent siblings)
25 siblings, 0 replies; 28+ messages in thread
From: Gwan-gyeong Mun @ 2024-10-21 9:58 UTC (permalink / raw)
To: intel-xe
Cc: nirmoy.das, matthew.brost, stuart.summers, christoph.manszewski,
mika.kuoppala, dominik.grzegorzek, andrzej.hajda,
maciej.patelczyk
From: Dominik Grzegorzek <dominik.grzegorzek@intel.com>
Introduce EU control functionality, which allows EU debugger
to interrupt, resume, and inform about the current state of
EU threads during execution. Provide an abstraction layer,
so in the future guc will only need to provide appropriate callbacks.
Based on implementation created by authors and other folks within
i915 driver.
v2: - checkpatch (Maciej)
- lrc index off by one fix (Mika)
- checkpatch (Tilak)
- 32bit fixes (Andrzej, Mika)
- find_resource_get for client (Mika)
v3: - update to use changed xe_force_wake_get() failure handling (G.G.)
- fix to avoid calling xe_force_wake_put() on xe_force_wake_get()
failure (G.G.)
Signed-off-by: Dominik Grzegorzek <dominik.grzegorzek@intel.com>
Signed-off-by: Maciej Patelczyk <maciej.patelczyk@intel.com>
Signed-off-by: Mika Kuoppala <mika.kuoppala@linux.intel.com>
Signed-off-by: Gwan-gyeong Mun <gwan-gyeong.mun@intel.com>
---
drivers/gpu/drm/xe/regs/xe_gt_regs.h | 2 +
drivers/gpu/drm/xe/xe_eudebug.c | 515 +++++++++++++++++++++++++-
drivers/gpu/drm/xe/xe_eudebug_types.h | 24 ++
drivers/gpu/drm/xe/xe_gt_debug.c | 12 +-
drivers/gpu/drm/xe/xe_gt_debug.h | 6 +
include/uapi/drm/xe_drm_eudebug.h | 21 +-
6 files changed, 560 insertions(+), 20 deletions(-)
diff --git a/drivers/gpu/drm/xe/regs/xe_gt_regs.h b/drivers/gpu/drm/xe/regs/xe_gt_regs.h
index 4a6c9837da03..20fbb13ddf7a 100644
--- a/drivers/gpu/drm/xe/regs/xe_gt_regs.h
+++ b/drivers/gpu/drm/xe/regs/xe_gt_regs.h
@@ -476,6 +476,8 @@
#define THREAD_EX_ARB_MODE REG_GENMASK(3, 2)
#define THREAD_EX_ARB_MODE_RR_AFTER_DEP REG_FIELD_PREP(THREAD_EX_ARB_MODE, 0x2)
+#define TD_CLR(i) XE_REG_MCR(0xe490 + (i) * 4)
+
#define ROW_CHICKEN3 XE_REG_MCR(0xe49c, XE_REG_OPTION_MASKED)
#define XE2_EUPEND_CHK_FLUSH_DIS REG_BIT(14)
#define DIS_FIX_EOT1_FLUSH REG_BIT(9)
diff --git a/drivers/gpu/drm/xe/xe_eudebug.c b/drivers/gpu/drm/xe/xe_eudebug.c
index 0809603d892f..5211a3c21a31 100644
--- a/drivers/gpu/drm/xe/xe_eudebug.c
+++ b/drivers/gpu/drm/xe/xe_eudebug.c
@@ -23,6 +23,7 @@
#include "xe_force_wake.h"
#include "xe_gt.h"
#include "xe_gt_debug.h"
+#include "xe_gt_mcr.h"
#include "xe_hw_engine.h"
#include "xe_lrc.h"
#include "xe_macros.h"
@@ -587,6 +588,64 @@ static int find_handle(struct xe_eudebug_resources *res,
return id;
}
+static void *find_resource__unlocked(struct xe_eudebug_resources *res,
+ const int type,
+ const u32 id)
+{
+ struct xe_eudebug_resource *r;
+ struct xe_eudebug_handle *h;
+
+ r = resource_from_type(res, type);
+ h = xa_load(&r->xa, id);
+
+ return h ? (void *)(uintptr_t)h->key : NULL;
+}
+
+static void *find_resource(struct xe_eudebug_resources *res,
+ const int type,
+ const u32 id)
+{
+ void *p;
+
+ mutex_lock(&res->lock);
+ p = find_resource__unlocked(res, type, id);
+ mutex_unlock(&res->lock);
+
+ return p;
+}
+
+static struct xe_file *find_client_get(struct xe_eudebug *d, const u32 id)
+{
+ struct xe_file *xef;
+
+ mutex_lock(&d->res->lock);
+ xef = find_resource__unlocked(d->res, XE_EUDEBUG_RES_TYPE_CLIENT, id);
+ if (xef)
+ xe_file_get(xef);
+ mutex_unlock(&d->res->lock);
+
+ return xef;
+}
+
+static struct xe_exec_queue *find_exec_queue_get(struct xe_eudebug *d,
+ u32 id)
+{
+ struct xe_exec_queue *q;
+
+ mutex_lock(&d->res->lock);
+ q = find_resource__unlocked(d->res, XE_EUDEBUG_RES_TYPE_EXEC_QUEUE, id);
+ if (q)
+ xe_exec_queue_get(q);
+ mutex_unlock(&d->res->lock);
+
+ return q;
+}
+
+static struct xe_lrc *find_lrc(struct xe_eudebug *d, const u32 id)
+{
+ return find_resource(d->res, XE_EUDEBUG_RES_TYPE_LRC, id);
+}
+
static int _xe_eudebug_add_handle(struct xe_eudebug *d,
int type,
void *p,
@@ -840,6 +899,177 @@ static long xe_eudebug_read_event(struct xe_eudebug *d,
return ret;
}
+static int do_eu_control(struct xe_eudebug *d,
+ const struct drm_xe_eudebug_eu_control * const arg,
+ struct drm_xe_eudebug_eu_control __user * const user_ptr)
+{
+ void __user * const bitmask_ptr = u64_to_user_ptr(arg->bitmask_ptr);
+ struct xe_device *xe = d->xe;
+ u8 *bits = NULL;
+ unsigned int hw_attn_size, attn_size;
+ struct xe_exec_queue *q;
+ struct xe_file *xef;
+ struct xe_lrc *lrc;
+ u64 seqno;
+ int ret;
+
+ if (xe_eudebug_detached(d))
+ return -ENOTCONN;
+
+ /* Accept only hardware reg granularity mask */
+ if (XE_IOCTL_DBG(xe, !IS_ALIGNED(arg->bitmask_size, sizeof(u32))))
+ return -EINVAL;
+
+ xef = find_client_get(d, arg->client_handle);
+ if (XE_IOCTL_DBG(xe, !xef))
+ return -EINVAL;
+
+ q = find_exec_queue_get(d, arg->exec_queue_handle);
+ if (XE_IOCTL_DBG(xe, !q)) {
+ xe_file_put(xef);
+ return -EINVAL;
+ }
+
+ if (XE_IOCTL_DBG(xe, !xe_exec_queue_is_debuggable(q))) {
+ ret = -EINVAL;
+ goto queue_put;
+ }
+
+ if (XE_IOCTL_DBG(xe, xef != q->vm->xef)) {
+ ret = -EINVAL;
+ goto queue_put;
+ }
+
+ lrc = find_lrc(d, arg->lrc_handle);
+ if (XE_IOCTL_DBG(xe, !lrc)) {
+ ret = -EINVAL;
+ goto queue_put;
+ }
+
+ hw_attn_size = xe_gt_eu_attention_bitmap_size(q->gt);
+ attn_size = arg->bitmask_size;
+
+ if (attn_size > hw_attn_size)
+ attn_size = hw_attn_size;
+
+ if (attn_size > 0) {
+ bits = kmalloc(attn_size, GFP_KERNEL);
+ if (!bits) {
+ ret = -ENOMEM;
+ goto queue_put;
+ }
+
+ if (copy_from_user(bits, bitmask_ptr, attn_size)) {
+ ret = -EFAULT;
+ goto out_free;
+ }
+ }
+
+ if (!pm_runtime_active(xe->drm.dev)) {
+ ret = -EIO;
+ goto out_free;
+ }
+
+ ret = -EINVAL;
+ mutex_lock(&d->eu_lock);
+
+ switch (arg->cmd) {
+ case DRM_XE_EUDEBUG_EU_CONTROL_CMD_INTERRUPT_ALL:
+ /* Make sure we dont promise anything but interrupting all */
+ if (!attn_size)
+ ret = d->ops->interrupt_all(d, q, lrc);
+ break;
+ case DRM_XE_EUDEBUG_EU_CONTROL_CMD_STOPPED:
+ ret = d->ops->stopped(d, q, lrc, bits, attn_size);
+ break;
+ case DRM_XE_EUDEBUG_EU_CONTROL_CMD_RESUME:
+ ret = d->ops->resume(d, q, lrc, bits, attn_size);
+ break;
+ default:
+ break;
+ }
+
+ if (ret == 0)
+ seqno = atomic_long_inc_return(&d->events.seqno);
+
+ mutex_unlock(&d->eu_lock);
+
+ if (ret)
+ goto out_free;
+
+ if (put_user(seqno, &user_ptr->seqno)) {
+ ret = -EFAULT;
+ goto out_free;
+ }
+
+ if (copy_to_user(bitmask_ptr, bits, attn_size)) {
+ ret = -EFAULT;
+ goto out_free;
+ }
+
+ if (hw_attn_size != arg->bitmask_size)
+ if (put_user(hw_attn_size, &user_ptr->bitmask_size))
+ ret = -EFAULT;
+
+out_free:
+ kfree(bits);
+queue_put:
+ xe_exec_queue_put(q);
+ xe_file_put(xef);
+
+ return ret;
+}
+
+static long xe_eudebug_eu_control(struct xe_eudebug *d, const u64 arg)
+{
+ struct drm_xe_eudebug_eu_control __user * const user_ptr =
+ u64_to_user_ptr(arg);
+ struct drm_xe_eudebug_eu_control user_arg;
+ struct xe_device *xe = d->xe;
+ struct xe_file *xef;
+ int ret;
+
+ if (XE_IOCTL_DBG(xe, !(_IOC_DIR(DRM_XE_EUDEBUG_IOCTL_EU_CONTROL) & _IOC_WRITE)))
+ return -EINVAL;
+
+ if (XE_IOCTL_DBG(xe, !(_IOC_DIR(DRM_XE_EUDEBUG_IOCTL_EU_CONTROL) & _IOC_READ)))
+ return -EINVAL;
+
+ if (XE_IOCTL_DBG(xe, _IOC_SIZE(DRM_XE_EUDEBUG_IOCTL_EU_CONTROL) != sizeof(user_arg)))
+ return -EINVAL;
+
+ if (copy_from_user(&user_arg,
+ user_ptr,
+ sizeof(user_arg)))
+ return -EFAULT;
+
+ if (XE_IOCTL_DBG(xe, user_arg.flags))
+ return -EINVAL;
+
+ if (!access_ok(u64_to_user_ptr(user_arg.bitmask_ptr), user_arg.bitmask_size))
+ return -EFAULT;
+
+ eu_dbg(d,
+ "eu_control: client_handle=%llu, cmd=%u, flags=0x%x, exec_queue_handle=%llu, bitmask_size=%u\n",
+ user_arg.client_handle, user_arg.cmd, user_arg.flags, user_arg.exec_queue_handle,
+ user_arg.bitmask_size);
+
+ xef = find_client_get(d, user_arg.client_handle);
+ if (XE_IOCTL_DBG(xe, !xef))
+ return -EINVAL; /* As this is user input */
+
+ ret = do_eu_control(d, &user_arg, user_ptr);
+
+ xe_file_put(xef);
+
+ eu_dbg(d,
+ "eu_control: client_handle=%llu, cmd=%u, flags=0x%x, exec_queue_handle=%llu, bitmask_size=%u ret=%d\n",
+ user_arg.client_handle, user_arg.cmd, user_arg.flags, user_arg.exec_queue_handle,
+ user_arg.bitmask_size, ret);
+
+ return ret;
+}
+
static long xe_eudebug_ioctl(struct file *file,
unsigned int cmd,
unsigned long arg)
@@ -856,6 +1086,10 @@ static long xe_eudebug_ioctl(struct file *file,
ret = xe_eudebug_read_event(d, arg,
!(file->f_flags & O_NONBLOCK));
break;
+ case DRM_XE_EUDEBUG_IOCTL_EU_CONTROL:
+ ret = xe_eudebug_eu_control(d, arg);
+ eu_dbg(d, "ioctl cmd=EU_CONTROL ret=%ld\n", ret);
+ break;
default:
ret = -EINVAL;
@@ -1016,23 +1250,17 @@ static struct xe_hw_engine *get_runalone_active_hw_engine(struct xe_gt *gt)
return first;
}
-static struct xe_exec_queue *runalone_active_queue_get(struct xe_gt *gt, int *lrc_idx)
+static struct xe_exec_queue *active_hwe_to_exec_queue(struct xe_hw_engine *hwe, int *lrc_idx)
{
- struct xe_device *xe = gt_to_xe(gt);
+ struct xe_device *xe = gt_to_xe(hwe->gt);
+ struct xe_gt *gt = hwe->gt;
struct xe_exec_queue *q, *found = NULL;
- struct xe_hw_engine *active;
struct xe_file *xef;
unsigned long i;
int idx, err;
u32 lrc_hw;
- active = get_runalone_active_hw_engine(gt);
- if (!active) {
- drm_dbg(>_to_xe(gt)->drm, "Runalone engine not found!");
- return ERR_PTR(-ENOENT);
- }
-
- err = current_lrca(active, &lrc_hw);
+ err = current_lrca(hwe, &lrc_hw);
if (err)
return ERR_PTR(err);
@@ -1043,7 +1271,7 @@ static struct xe_exec_queue *runalone_active_queue_get(struct xe_gt *gt, int *lr
if (q->gt != gt)
continue;
- if (q->class != active->class)
+ if (q->class != hwe->class)
continue;
if (xe_exec_queue_is_idle(q))
@@ -1069,7 +1297,7 @@ static struct xe_exec_queue *runalone_active_queue_get(struct xe_gt *gt, int *lr
if (!found)
return ERR_PTR(-ENOENT);
- if (XE_WARN_ON(current_lrca(active, &lrc_hw)) &&
+ if (XE_WARN_ON(current_lrca(hwe, &lrc_hw)) &&
XE_WARN_ON(match_exec_queue_lrca(found, lrc_hw) < 0)) {
xe_exec_queue_put(found);
return ERR_PTR(-ENOENT);
@@ -1078,6 +1306,19 @@ static struct xe_exec_queue *runalone_active_queue_get(struct xe_gt *gt, int *lr
return found;
}
+static struct xe_exec_queue *runalone_active_queue_get(struct xe_gt *gt, int *lrc_idx)
+{
+ struct xe_hw_engine *active;
+
+ active = get_runalone_active_hw_engine(gt);
+ if (!active) {
+ drm_dbg(>_to_xe(gt)->drm, "Runalone engine not found!");
+ return ERR_PTR(-ENOENT);
+ }
+
+ return active_hwe_to_exec_queue(active, lrc_idx);
+}
+
static int send_attention_event(struct xe_eudebug *d, struct xe_exec_queue *q, int lrc_idx)
{
struct xe_eudebug_event_eu_attention *ea;
@@ -1126,7 +1367,6 @@ static int send_attention_event(struct xe_eudebug *d, struct xe_exec_queue *q, i
return xe_eudebug_queue_event(d, event);
}
-
static int xe_send_gt_attention(struct xe_gt *gt)
{
struct xe_eudebug *d;
@@ -1234,6 +1474,254 @@ static void attention_scan_flush(struct xe_device *xe)
mod_delayed_work(system_wq, &xe->eudebug.attention_scan, 0);
}
+static int xe_eu_control_interrupt_all(struct xe_eudebug *d,
+ struct xe_exec_queue *q,
+ struct xe_lrc *lrc)
+{
+ struct xe_gt *gt = q->hwe->gt;
+ struct xe_device *xe = d->xe;
+ struct xe_exec_queue *active;
+ struct xe_hw_engine *hwe;
+ unsigned int fw_ref;
+ int lrc_idx, ret;
+ u32 lrc_hw;
+ u32 td_ctl;
+
+ hwe = get_runalone_active_hw_engine(gt);
+ if (XE_IOCTL_DBG(xe, !hwe)) {
+ drm_dbg(>_to_xe(gt)->drm, "Runalone engine not found!");
+ return -EINVAL;
+ }
+
+ active = active_hwe_to_exec_queue(hwe, &lrc_idx);
+ if (XE_IOCTL_DBG(xe, IS_ERR(active)))
+ return PTR_ERR(active);
+
+ if (XE_IOCTL_DBG(xe, q != active)) {
+ xe_exec_queue_put(active);
+ return -EINVAL;
+ }
+ xe_exec_queue_put(active);
+
+ if (XE_IOCTL_DBG(xe, lrc_idx >= q->width || q->lrc[lrc_idx] != lrc))
+ return -EINVAL;
+
+ fw_ref = xe_force_wake_get(gt_to_fw(gt), hwe->domain);
+ if (!fw_ref)
+ return -ETIMEDOUT;
+
+ /* Additional check just before issuing MMIO writes */
+ ret = __current_lrca(hwe, &lrc_hw);
+ if (ret)
+ goto put_fw;
+
+ if (!lrca_equals(lower_32_bits(xe_lrc_descriptor(lrc)), lrc_hw)) {
+ ret = -EBUSY;
+ goto put_fw;
+ }
+
+ td_ctl = xe_gt_mcr_unicast_read_any(gt, TD_CTL);
+
+ /* Halt on next thread dispatch */
+ if (!(td_ctl & TD_CTL_FORCE_EXTERNAL_HALT))
+ xe_gt_mcr_multicast_write(gt, TD_CTL,
+ td_ctl | TD_CTL_FORCE_EXTERNAL_HALT);
+ else
+ eu_warn(d, "TD_CTL force external halt bit already set!\n");
+
+ /*
+ * The sleep is needed because some interrupts are ignored
+ * by the HW, hence we allow the HW some time to acknowledge
+ * that.
+ */
+ usleep_range(100, 110);
+
+ /* Halt regardless of thread dependencies */
+ if (!(td_ctl & TD_CTL_FORCE_EXCEPTION))
+ xe_gt_mcr_multicast_write(gt, TD_CTL,
+ td_ctl | TD_CTL_FORCE_EXCEPTION);
+ else
+ eu_warn(d, "TD_CTL force exception bit already set!\n");
+
+ usleep_range(100, 110);
+
+ xe_gt_mcr_multicast_write(gt, TD_CTL, td_ctl &
+ ~(TD_CTL_FORCE_EXTERNAL_HALT | TD_CTL_FORCE_EXCEPTION));
+
+ /*
+ * In case of stopping wrong ctx emit warning.
+ * Nothing else we can do for now.
+ */
+ ret = __current_lrca(hwe, &lrc_hw);
+ if (ret || !lrca_equals(lower_32_bits(xe_lrc_descriptor(lrc)), lrc_hw))
+ eu_warn(d, "xe_eudebug: interrupted wrong context.");
+
+put_fw:
+ xe_force_wake_put(gt_to_fw(gt), fw_ref);
+
+ return ret;
+}
+
+struct ss_iter {
+ struct xe_eudebug *debugger;
+ unsigned int i;
+
+ unsigned int size;
+ u8 *bits;
+};
+
+static int check_attn_mcr(struct xe_gt *gt, void *data,
+ u16 group, u16 instance)
+{
+ struct ss_iter *iter = data;
+ struct xe_eudebug *d = iter->debugger;
+ unsigned int row;
+
+ for (row = 0; row < TD_EU_ATTENTION_MAX_ROWS; row++) {
+ u32 val, cur = 0;
+
+ if (iter->i >= iter->size)
+ return 0;
+
+ if (XE_WARN_ON((iter->i + sizeof(val)) >
+ (xe_gt_eu_attention_bitmap_size(gt))))
+ return -EIO;
+
+ memcpy(&val, &iter->bits[iter->i], sizeof(val));
+ iter->i += sizeof(val);
+
+ cur = xe_gt_mcr_unicast_read(gt, TD_ATT(row), group, instance);
+
+ if ((val | cur) != cur) {
+ eu_dbg(d,
+ "WRONG CLEAR (%u:%u:%u) TD_CRL: 0x%08x; TD_ATT: 0x%08x\n",
+ group, instance, row, val, cur);
+ return -EINVAL;
+ }
+ }
+
+ return 0;
+}
+
+static int clear_attn_mcr(struct xe_gt *gt, void *data,
+ u16 group, u16 instance)
+{
+ struct ss_iter *iter = data;
+ struct xe_eudebug *d = iter->debugger;
+ unsigned int row;
+
+ for (row = 0; row < TD_EU_ATTENTION_MAX_ROWS; row++) {
+ u32 val;
+
+ if (iter->i >= iter->size)
+ return 0;
+
+ if (XE_WARN_ON((iter->i + sizeof(val)) >
+ (xe_gt_eu_attention_bitmap_size(gt))))
+ return -EIO;
+
+ memcpy(&val, &iter->bits[iter->i], sizeof(val));
+ iter->i += sizeof(val);
+
+ if (!val)
+ continue;
+
+ xe_gt_mcr_unicast_write(gt, TD_CLR(row), val,
+ group, instance);
+
+ eu_dbg(d,
+ "TD_CLR: (%u:%u:%u): 0x%08x\n",
+ group, instance, row, val);
+ }
+
+ return 0;
+}
+
+static int xe_eu_control_resume(struct xe_eudebug *d,
+ struct xe_exec_queue *q,
+ struct xe_lrc *lrc,
+ u8 *bits, unsigned int bitmask_size)
+{
+ struct xe_device *xe = d->xe;
+ struct ss_iter iter = {
+ .debugger = d,
+ .i = 0,
+ .size = bitmask_size,
+ .bits = bits
+ };
+ int ret = 0;
+ struct xe_exec_queue *active;
+ int lrc_idx;
+
+ active = runalone_active_queue_get(q->gt, &lrc_idx);
+ if (IS_ERR(active))
+ return PTR_ERR(active);
+
+ if (XE_IOCTL_DBG(xe, q != active)) {
+ xe_exec_queue_put(active);
+ return -EBUSY;
+ }
+ xe_exec_queue_put(active);
+
+ if (XE_IOCTL_DBG(xe, lrc_idx >= q->width || q->lrc[lrc_idx] != lrc))
+ return -EBUSY;
+
+ /*
+ * hsdes: 18021122357
+ * We need to avoid clearing attention bits that are not set
+ * in order to avoid the EOT hang on PVC.
+ */
+ if (GRAPHICS_VERx100(d->xe) == 1260) {
+ ret = xe_gt_foreach_dss_group_instance(q->gt, check_attn_mcr, &iter);
+ if (ret)
+ return ret;
+
+ iter.i = 0;
+ }
+
+ xe_gt_foreach_dss_group_instance(q->gt, clear_attn_mcr, &iter);
+ return 0;
+}
+
+static int xe_eu_control_stopped(struct xe_eudebug *d,
+ struct xe_exec_queue *q,
+ struct xe_lrc *lrc,
+ u8 *bits, unsigned int bitmask_size)
+{
+ struct xe_device *xe = d->xe;
+ struct xe_exec_queue *active;
+ int lrc_idx;
+
+ if (XE_WARN_ON(!q) || XE_WARN_ON(!q->gt))
+ return -EINVAL;
+
+ active = runalone_active_queue_get(q->gt, &lrc_idx);
+ if (IS_ERR(active))
+ return PTR_ERR(active);
+
+ if (active) {
+ if (XE_IOCTL_DBG(xe, q != active)) {
+ xe_exec_queue_put(active);
+ return -EBUSY;
+ }
+
+ if (XE_IOCTL_DBG(xe, lrc_idx >= q->width || q->lrc[lrc_idx] != lrc)) {
+ xe_exec_queue_put(active);
+ return -EBUSY;
+ }
+ }
+
+ xe_exec_queue_put(active);
+
+ return xe_gt_eu_attention_bitmap(q->gt, bits, bitmask_size);
+}
+
+static struct xe_eudebug_eu_control_ops eu_control = {
+ .interrupt_all = xe_eu_control_interrupt_all,
+ .stopped = xe_eu_control_stopped,
+ .resume = xe_eu_control_resume,
+};
+
static void discovery_work_fn(struct work_struct *work);
static int
@@ -1293,6 +1781,7 @@ xe_eudebug_connect(struct xe_device *xe,
goto err_detach;
}
+ d->ops = &eu_control;
kref_get(&d->ref);
queue_work(xe->eudebug.ordered_wq, &d->discovery_work);
attention_scan_flush(xe);
diff --git a/drivers/gpu/drm/xe/xe_eudebug_types.h b/drivers/gpu/drm/xe/xe_eudebug_types.h
index b885296fddbb..73b3f906da66 100644
--- a/drivers/gpu/drm/xe/xe_eudebug_types.h
+++ b/drivers/gpu/drm/xe/xe_eudebug_types.h
@@ -18,8 +18,12 @@
struct xe_device;
struct task_struct;
+struct xe_eudebug;
struct xe_eudebug_event;
+struct xe_hw_engine;
struct workqueue_struct;
+struct xe_exec_queue;
+struct xe_lrc;
#define CONFIG_DRM_XE_DEBUGGER_EVENT_QUEUE_SIZE 64
@@ -65,6 +69,24 @@ struct xe_eudebug_resources {
struct xe_eudebug_resource rt[XE_EUDEBUG_RES_TYPE_COUNT];
};
+/**
+ * struct xe_eudebug_eu_control_ops - interface for eu thread
+ * state control backend
+ */
+struct xe_eudebug_eu_control_ops {
+ /** @interrupt_all: interrupts workload active on given hwe */
+ int (*interrupt_all)(struct xe_eudebug *e, struct xe_exec_queue *q,
+ struct xe_lrc *lrc);
+
+ /** @resume: resumes threads reflected by bitmask active on given hwe */
+ int (*resume)(struct xe_eudebug *e, struct xe_exec_queue *q,
+ struct xe_lrc *lrc, u8 *bitmap, unsigned int bitmap_size);
+
+ /** @stopped: returns bitmap reflecting threads which signal attention */
+ int (*stopped)(struct xe_eudebug *e, struct xe_exec_queue *q,
+ struct xe_lrc *lrc, u8 *bitmap, unsigned int bitmap_size);
+};
+
/**
* struct xe_eudebug - Top level struct for eudebug: the connection
*/
@@ -128,6 +150,8 @@ struct xe_eudebug {
atomic_long_t seqno;
} events;
+ /** @ops operations for eu_control */
+ struct xe_eudebug_eu_control_ops *ops;
};
/**
diff --git a/drivers/gpu/drm/xe/xe_gt_debug.c b/drivers/gpu/drm/xe/xe_gt_debug.c
index 6117f211d85d..25013e902cbe 100644
--- a/drivers/gpu/drm/xe/xe_gt_debug.c
+++ b/drivers/gpu/drm/xe/xe_gt_debug.c
@@ -13,12 +13,12 @@
#include "xe_pm.h"
#include "xe_macros.h"
-static int xe_gt_foreach_dss_group_instance(struct xe_gt *gt,
- int (*fn)(struct xe_gt *gt,
- void *data,
- u16 group,
- u16 instance),
- void *data)
+int xe_gt_foreach_dss_group_instance(struct xe_gt *gt,
+ int (*fn)(struct xe_gt *gt,
+ void *data,
+ u16 group,
+ u16 instance),
+ void *data)
{
const enum xe_force_wake_domains fw_domains = XE_FW_GT | XE_FW_RENDER;
unsigned int dss, fw_ref;
diff --git a/drivers/gpu/drm/xe/xe_gt_debug.h b/drivers/gpu/drm/xe/xe_gt_debug.h
index 3f13dbb17a5f..342082699ff6 100644
--- a/drivers/gpu/drm/xe/xe_gt_debug.h
+++ b/drivers/gpu/drm/xe/xe_gt_debug.h
@@ -13,6 +13,12 @@
#define XE_GT_ATTENTION_TIMEOUT_MS 100
int xe_gt_eu_threads_needing_attention(struct xe_gt *gt);
+int xe_gt_foreach_dss_group_instance(struct xe_gt *gt,
+ int (*fn)(struct xe_gt *gt,
+ void *data,
+ u16 group,
+ u16 instance),
+ void *data);
int xe_gt_eu_attention_bitmap_size(struct xe_gt *gt);
int xe_gt_eu_attention_bitmap(struct xe_gt *gt, u8 *bits,
diff --git a/include/uapi/drm/xe_drm_eudebug.h b/include/uapi/drm/xe_drm_eudebug.h
index 1e63bdede5f2..3c43aefefedd 100644
--- a/include/uapi/drm/xe_drm_eudebug.h
+++ b/include/uapi/drm/xe_drm_eudebug.h
@@ -15,7 +15,8 @@ extern "C" {
*
* This ioctl is available in debug version 1.
*/
-#define DRM_XE_EUDEBUG_IOCTL_READ_EVENT _IO('j', 0x0)
+#define DRM_XE_EUDEBUG_IOCTL_READ_EVENT _IO('j', 0x0)
+#define DRM_XE_EUDEBUG_IOCTL_EU_CONTROL _IOWR('j', 0x2, struct drm_xe_eudebug_eu_control)
/* XXX: Document events to match their internal counterparts when moved to xe_drm.h */
struct drm_xe_eudebug_event {
@@ -74,6 +75,24 @@ struct drm_xe_eudebug_event_eu_attention {
__u8 bitmask[];
};
+struct drm_xe_eudebug_eu_control {
+ __u64 client_handle;
+
+#define DRM_XE_EUDEBUG_EU_CONTROL_CMD_INTERRUPT_ALL 0
+#define DRM_XE_EUDEBUG_EU_CONTROL_CMD_STOPPED 1
+#define DRM_XE_EUDEBUG_EU_CONTROL_CMD_RESUME 2
+ __u32 cmd;
+ __u32 flags;
+
+ __u64 seqno;
+
+ __u64 exec_queue_handle;
+ __u64 lrc_handle;
+ __u32 reserved;
+ __u32 bitmask_size;
+ __u64 bitmask_ptr;
+};
+
#if defined(__cplusplus)
}
#endif
--
2.46.1
^ permalink raw reply related [flat|nested] 28+ messages in thread* [RFC 09/19] drm/xe/eudebug: Add vm bind and vm bind ops
2024-10-21 9:58 [RFC 00/19] Support EU online debug on pagefault Gwan-gyeong Mun
` (7 preceding siblings ...)
2024-10-21 9:58 ` [RFC 08/19] drm/xe/eudebug: Introduce EU control interface Gwan-gyeong Mun
@ 2024-10-21 9:58 ` Gwan-gyeong Mun
2024-10-21 9:58 ` [RFC 10/19] drm/xe/eudebug: Add UFENCE events with acks Gwan-gyeong Mun
` (16 subsequent siblings)
25 siblings, 0 replies; 28+ messages in thread
From: Gwan-gyeong Mun @ 2024-10-21 9:58 UTC (permalink / raw)
To: intel-xe
Cc: nirmoy.das, matthew.brost, stuart.summers, christoph.manszewski,
mika.kuoppala, dominik.grzegorzek, andrzej.hajda,
maciej.patelczyk
From: Christoph Manszewski <christoph.manszewski@intel.com>
Add events dedicated to track vma bind and vma unbind operations. The
events are generated for operations performed on xe_vma MAP and UNMAP
for boss and userptrs.
As one bind can result in multiple operations and fail in the middle,
we want to store the events until full successful chain of operations
can be relayed to debugger.
Signed-off-by: Christoph Manszewski <christoph.manszewski@intel.com>
Co-developed-by: Mika Kuoppala <mika.kuoppala@linux.intel.com>
Signed-off-by: Mika Kuoppala <mika.kuoppala@linux.intel.com>
Signed-off-by: Gwan-gyeong Mun <gwan-gyeong.mun@intel.com>
---
drivers/gpu/drm/xe/xe_eudebug.c | 316 +++++++++++++++++++++++++-
drivers/gpu/drm/xe/xe_eudebug.h | 13 ++
drivers/gpu/drm/xe/xe_eudebug_types.h | 29 +++
drivers/gpu/drm/xe/xe_vm.c | 16 +-
drivers/gpu/drm/xe/xe_vm_types.h | 13 ++
include/uapi/drm/xe_drm_eudebug.h | 64 ++++++
6 files changed, 448 insertions(+), 3 deletions(-)
diff --git a/drivers/gpu/drm/xe/xe_eudebug.c b/drivers/gpu/drm/xe/xe_eudebug.c
index 5211a3c21a31..a114201696fe 100644
--- a/drivers/gpu/drm/xe/xe_eudebug.c
+++ b/drivers/gpu/drm/xe/xe_eudebug.c
@@ -824,7 +824,7 @@ static long xe_eudebug_read_event(struct xe_eudebug *d,
u64_to_user_ptr(arg);
struct drm_xe_eudebug_event user_event;
struct xe_eudebug_event *event;
- const unsigned int max_event = DRM_XE_EUDEBUG_EVENT_EU_ATTENTION;
+ const unsigned int max_event = DRM_XE_EUDEBUG_EVENT_VM_BIND_OP;
long ret = 0;
if (XE_IOCTL_DBG(xe, copy_from_user(&user_event, user_orig, sizeof(user_event))))
@@ -2270,6 +2270,320 @@ void xe_eudebug_exec_queue_destroy(struct xe_file *xef, struct xe_exec_queue *q)
xe_eudebug_event_put(d, exec_queue_destroy_event(d, xef, q));
}
+static int xe_eudebug_queue_bind_event(struct xe_eudebug *d,
+ struct xe_vm *vm,
+ struct xe_eudebug_event *event)
+{
+ struct xe_eudebug_event_envelope *env;
+
+ lockdep_assert_held_write(&vm->lock);
+
+ env = kmalloc(sizeof(*env), GFP_KERNEL);
+ if (!env)
+ return -ENOMEM;
+
+ INIT_LIST_HEAD(&env->link);
+ env->event = event;
+
+ spin_lock(&vm->eudebug.lock);
+ list_add_tail(&env->link, &vm->eudebug.events);
+
+ if (event->type == DRM_XE_EUDEBUG_EVENT_VM_BIND_OP)
+ ++vm->eudebug.ops;
+ spin_unlock(&vm->eudebug.lock);
+
+ return 0;
+}
+
+static int queue_vm_bind_event(struct xe_eudebug *d,
+ struct xe_vm *vm,
+ u64 client_handle,
+ u64 vm_handle,
+ u32 bind_flags,
+ u32 num_ops, u64 *seqno)
+{
+ struct xe_eudebug_event_vm_bind *e;
+ struct xe_eudebug_event *event;
+ const u32 sz = sizeof(*e);
+ const u32 base_flags = DRM_XE_EUDEBUG_EVENT_STATE_CHANGE;
+
+ *seqno = atomic_long_inc_return(&d->events.seqno);
+
+ event = xe_eudebug_create_event(d, DRM_XE_EUDEBUG_EVENT_VM_BIND,
+ *seqno, base_flags, sz, GFP_KERNEL);
+ if (!event)
+ return -ENOMEM;
+
+ e = cast_event(e, event);
+ write_member(struct drm_xe_eudebug_event_vm_bind, e, client_handle, client_handle);
+ write_member(struct drm_xe_eudebug_event_vm_bind, e, vm_handle, vm_handle);
+ write_member(struct drm_xe_eudebug_event_vm_bind, e, flags, bind_flags);
+ write_member(struct drm_xe_eudebug_event_vm_bind, e, num_binds, num_ops);
+
+ /* If in discovery, no need to collect ops */
+ if (!completion_done(&d->discovery)) {
+ XE_WARN_ON(!num_ops);
+ return xe_eudebug_queue_event(d, event);
+ }
+
+ return xe_eudebug_queue_bind_event(d, vm, event);
+}
+
+static int vm_bind_event(struct xe_eudebug *d,
+ struct xe_vm *vm,
+ u32 num_ops,
+ u64 *seqno)
+{
+ int h_c, h_vm;
+
+ h_c = find_handle(d->res, XE_EUDEBUG_RES_TYPE_CLIENT, vm->xef);
+ if (h_c < 0)
+ return h_c;
+
+ h_vm = find_handle(d->res, XE_EUDEBUG_RES_TYPE_VM, vm);
+ if (h_vm < 0)
+ return h_vm;
+
+ return queue_vm_bind_event(d, vm, h_c, h_vm, 0,
+ num_ops, seqno);
+}
+
+static int vm_bind_op_event(struct xe_eudebug *d,
+ struct xe_vm *vm,
+ const u32 flags,
+ const u64 bind_ref_seqno,
+ const u64 num_extensions,
+ u64 addr, u64 range,
+ u64 *op_seqno)
+{
+ struct xe_eudebug_event_vm_bind_op *e;
+ struct xe_eudebug_event *event;
+ const u32 sz = sizeof(*e);
+
+ *op_seqno = atomic_long_inc_return(&d->events.seqno);
+
+ event = xe_eudebug_create_event(d, DRM_XE_EUDEBUG_EVENT_VM_BIND_OP,
+ *op_seqno, flags, sz, GFP_KERNEL);
+ if (!event)
+ return -ENOMEM;
+
+ e = cast_event(e, event);
+
+ write_member(struct drm_xe_eudebug_event_vm_bind_op, e, vm_bind_ref_seqno, bind_ref_seqno);
+ write_member(struct drm_xe_eudebug_event_vm_bind_op, e, num_extensions, num_extensions);
+ write_member(struct drm_xe_eudebug_event_vm_bind_op, e, addr, addr);
+ write_member(struct drm_xe_eudebug_event_vm_bind_op, e, range, range);
+
+ /* If in discovery, no need to collect ops */
+ if (!completion_done(&d->discovery))
+ return xe_eudebug_queue_event(d, event);
+
+ return xe_eudebug_queue_bind_event(d, vm, event);
+}
+
+static int vm_bind_op(struct xe_eudebug *d, struct xe_vm *vm,
+ const u32 flags, const u64 bind_ref_seqno,
+ u64 addr, u64 range)
+{
+ u64 op_seqno = 0;
+ u64 num_extensions = 0;
+ int ret;
+
+ ret = vm_bind_op_event(d, vm, flags, bind_ref_seqno, num_extensions,
+ addr, range, &op_seqno);
+ if (ret)
+ return ret;
+
+ return 0;
+}
+
+void xe_eudebug_vm_init(struct xe_vm *vm)
+{
+ INIT_LIST_HEAD(&vm->eudebug.events);
+ spin_lock_init(&vm->eudebug.lock);
+ vm->eudebug.ops = 0;
+ vm->eudebug.ref_seqno = 0;
+}
+
+void xe_eudebug_vm_bind_start(struct xe_vm *vm)
+{
+ struct xe_eudebug *d;
+ u64 seqno = 0;
+ int err;
+
+ if (!xe_vm_in_lr_mode(vm))
+ return;
+
+ d = xe_eudebug_get(vm->xef);
+ if (!d)
+ return;
+
+ lockdep_assert_held_write(&vm->lock);
+
+ if (XE_WARN_ON(!list_empty(&vm->eudebug.events)) ||
+ XE_WARN_ON(vm->eudebug.ops) ||
+ XE_WARN_ON(vm->eudebug.ref_seqno)) {
+ eu_err(d, "bind busy on %s", __func__);
+ xe_eudebug_disconnect(d, -EINVAL);
+ }
+
+ err = vm_bind_event(d, vm, 0, &seqno);
+ if (err) {
+ eu_err(d, "error %d on %s", err, __func__);
+ xe_eudebug_disconnect(d, err);
+ }
+
+ spin_lock(&vm->eudebug.lock);
+ XE_WARN_ON(vm->eudebug.ref_seqno);
+ vm->eudebug.ref_seqno = seqno;
+ vm->eudebug.ops = 0;
+ spin_unlock(&vm->eudebug.lock);
+
+ xe_eudebug_put(d);
+}
+
+void xe_eudebug_vm_bind_op_add(struct xe_vm *vm, u32 op, u64 addr, u64 range)
+{
+ struct xe_eudebug *d;
+ u32 flags;
+
+ if (!xe_vm_in_lr_mode(vm))
+ return;
+
+ switch (op) {
+ case DRM_XE_VM_BIND_OP_MAP:
+ case DRM_XE_VM_BIND_OP_MAP_USERPTR:
+ {
+ flags = DRM_XE_EUDEBUG_EVENT_CREATE;
+ break;
+ }
+ case DRM_XE_VM_BIND_OP_UNMAP:
+ case DRM_XE_VM_BIND_OP_UNMAP_ALL:
+ flags = DRM_XE_EUDEBUG_EVENT_DESTROY;
+ break;
+ default:
+ flags = 0;
+ break;
+ }
+
+ if (!flags)
+ return;
+
+ d = xe_eudebug_get(vm->xef);
+ if (!d)
+ return;
+
+ xe_eudebug_event_put(d, vm_bind_op(d, vm, flags, 0, addr, range));
+}
+
+static struct xe_eudebug_event *fetch_bind_event(struct xe_vm * const vm)
+{
+ struct xe_eudebug_event_envelope *env;
+ struct xe_eudebug_event *e = NULL;
+
+ spin_lock(&vm->eudebug.lock);
+ env = list_first_entry_or_null(&vm->eudebug.events,
+ struct xe_eudebug_event_envelope, link);
+ if (env) {
+ e = env->event;
+ list_del(&env->link);
+ }
+ spin_unlock(&vm->eudebug.lock);
+
+ kfree(env);
+
+ return e;
+}
+
+static void fill_vm_bind_fields(struct xe_vm *vm,
+ struct xe_eudebug_event *e,
+ bool ufence,
+ u32 bind_ops)
+{
+ struct xe_eudebug_event_vm_bind *eb = cast_event(eb, e);
+
+ eb->flags = ufence ?
+ DRM_XE_EUDEBUG_EVENT_VM_BIND_FLAG_UFENCE : 0;
+ eb->num_binds = bind_ops;
+}
+
+static void fill_vm_bind_op_fields(struct xe_vm *vm,
+ struct xe_eudebug_event *e,
+ u64 ref_seqno)
+{
+ struct xe_eudebug_event_vm_bind_op *op;
+
+ if (e->type != DRM_XE_EUDEBUG_EVENT_VM_BIND_OP)
+ return;
+
+ op = cast_event(op, e);
+ op->vm_bind_ref_seqno = ref_seqno;
+}
+
+void xe_eudebug_vm_bind_end(struct xe_vm *vm, bool has_ufence, int bind_err)
+{
+ struct xe_eudebug_event *e;
+ struct xe_eudebug *d;
+ u32 bind_ops;
+ u64 ref;
+
+ if (!xe_vm_in_lr_mode(vm))
+ return;
+
+ spin_lock(&vm->eudebug.lock);
+ ref = vm->eudebug.ref_seqno;
+ vm->eudebug.ref_seqno = 0;
+ bind_ops = vm->eudebug.ops;
+ vm->eudebug.ops = 0;
+ spin_unlock(&vm->eudebug.lock);
+
+ e = fetch_bind_event(vm);
+ if (!e)
+ return;
+
+ d = NULL;
+ if (!bind_err && ref) {
+ d = xe_eudebug_get(vm->xef);
+ if (d) {
+ if (bind_ops) {
+ fill_vm_bind_fields(vm, e, has_ufence, bind_ops);
+ } else {
+ /*
+ * If there was no ops we are interested in,
+ * we can omit the whole sequence
+ */
+ xe_eudebug_put(d);
+ d = NULL;
+ }
+ }
+ }
+
+ while (e) {
+ int err = 0;
+
+ if (d) {
+ err = xe_eudebug_queue_event(d, e);
+ if (!err)
+ e = NULL;
+ }
+
+ if (err) {
+ xe_eudebug_disconnect(d, err);
+ xe_eudebug_put(d);
+ d = NULL;
+ }
+
+ kfree(e);
+
+ e = fetch_bind_event(vm);
+ if (e && ref)
+ fill_vm_bind_op_fields(vm, e, ref);
+ }
+
+ if (d)
+ xe_eudebug_put(d);
+}
+
static int discover_client(struct xe_eudebug *d, struct xe_file *xef)
{
struct xe_exec_queue *q;
diff --git a/drivers/gpu/drm/xe/xe_eudebug.h b/drivers/gpu/drm/xe/xe_eudebug.h
index 1fe86bec99e1..ccc7202b3308 100644
--- a/drivers/gpu/drm/xe/xe_eudebug.h
+++ b/drivers/gpu/drm/xe/xe_eudebug.h
@@ -5,11 +5,14 @@
#ifndef _XE_EUDEBUG_H_
+#include <linux/types.h>
+
struct drm_device;
struct drm_file;
struct xe_device;
struct xe_file;
struct xe_vm;
+struct xe_vma;
struct xe_exec_queue;
struct xe_hw_engine;
@@ -33,6 +36,11 @@ void xe_eudebug_vm_destroy(struct xe_file *xef, struct xe_vm *vm);
void xe_eudebug_exec_queue_create(struct xe_file *xef, struct xe_exec_queue *q);
void xe_eudebug_exec_queue_destroy(struct xe_file *xef, struct xe_exec_queue *q);
+void xe_eudebug_vm_init(struct xe_vm *vm);
+void xe_eudebug_vm_bind_start(struct xe_vm *vm);
+void xe_eudebug_vm_bind_op_add(struct xe_vm *vm, u32 op, u64 addr, u64 range);
+void xe_eudebug_vm_bind_end(struct xe_vm *vm, bool has_ufence, int err);
+
#else
static inline int xe_eudebug_connect_ioctl(struct drm_device *dev,
@@ -53,6 +61,11 @@ static inline void xe_eudebug_vm_destroy(struct xe_file *xef, struct xe_vm *vm)
static inline void xe_eudebug_exec_queue_create(struct xe_file *xef, struct xe_exec_queue *q) { }
static inline void xe_eudebug_exec_queue_destroy(struct xe_file *xef, struct xe_exec_queue *q) { }
+static inline void xe_eudebug_vm_init(struct xe_vm *vm) { }
+static inline void xe_eudebug_vm_bind_start(struct xe_vm *vm) { }
+static inline void xe_eudebug_vm_bind_op_add(struct xe_vm *vm, u32 op, u64 addr, u64 range) { }
+static inline void xe_eudebug_vm_bind_end(struct xe_vm *vm, bool has_ufence, int err) { }
+
#endif /* CONFIG_DRM_XE_EUDEBUG */
#endif
diff --git a/drivers/gpu/drm/xe/xe_eudebug_types.h b/drivers/gpu/drm/xe/xe_eudebug_types.h
index 73b3f906da66..78739954967b 100644
--- a/drivers/gpu/drm/xe/xe_eudebug_types.h
+++ b/drivers/gpu/drm/xe/xe_eudebug_types.h
@@ -177,6 +177,11 @@ struct xe_eudebug_event {
u8 data[];
};
+struct xe_eudebug_event_envelope {
+ struct list_head link;
+ struct xe_eudebug_event *event;
+};
+
/**
* struct xe_eudebug_event_open - Internal event for client open/close
*/
@@ -258,4 +263,28 @@ struct xe_eudebug_event_eu_attention {
u8 bitmask[];
};
+/**
+ * struct xe_eudebug_event_vm_bind - Internal event for vm bind/unbind operation
+ */
+struct xe_eudebug_event_vm_bind {
+ /** @base: base event */
+ struct xe_eudebug_event base;
+
+ u64 client_handle;
+ u64 vm_handle;
+
+ u32 flags;
+ u32 num_binds;
+};
+
+struct xe_eudebug_event_vm_bind_op {
+ /** @base: base event */
+ struct xe_eudebug_event base;
+ u64 vm_bind_ref_seqno;
+ u64 num_extensions;
+
+ u64 addr; /* Zero for unmap all ? */
+ u64 range; /* Zero for unmap all ? */
+};
+
#endif
diff --git a/drivers/gpu/drm/xe/xe_vm.c b/drivers/gpu/drm/xe/xe_vm.c
index 034e17d039ec..c9840c3fd3b8 100644
--- a/drivers/gpu/drm/xe/xe_vm.c
+++ b/drivers/gpu/drm/xe/xe_vm.c
@@ -1412,6 +1412,8 @@ struct xe_vm *xe_vm_create(struct xe_device *xe, u32 flags)
for_each_tile(tile, xe, id)
xe_range_fence_tree_init(&vm->rftree[id]);
+ xe_eudebug_vm_init(vm);
+
vm->pt_ops = &xelp_pt_ops;
/*
@@ -1640,6 +1642,8 @@ static void vm_destroy_work_func(struct work_struct *w)
struct xe_tile *tile;
u8 id;
+ xe_eudebug_vm_bind_end(vm, 0, -ENOENT);
+
/* xe_vm_close_and_put was not called? */
xe_assert(xe, !vm->size);
@@ -2649,7 +2653,7 @@ static void vm_bind_ioctl_ops_fini(struct xe_vm *vm, struct xe_vma_ops *vops,
struct dma_fence *fence)
{
struct xe_exec_queue *wait_exec_queue = to_wait_exec_queue(vm, vops->q);
- struct xe_user_fence *ufence;
+ struct xe_user_fence *ufence = NULL;
struct xe_vma_op *op;
int i;
@@ -2664,6 +2668,9 @@ static void vm_bind_ioctl_ops_fini(struct xe_vm *vm, struct xe_vma_ops *vops,
xe_vma_destroy(gpuva_to_vma(op->base.remap.unmap->va),
fence);
}
+
+ xe_eudebug_vm_bind_end(vm, ufence, 0);
+
if (ufence)
xe_sync_ufence_put(ufence);
for (i = 0; i < vops->num_syncs; i++)
@@ -3072,6 +3079,8 @@ int xe_vm_bind_ioctl(struct drm_device *dev, void *data, struct drm_file *file)
if (err)
goto unwind_ops;
+ xe_eudebug_vm_bind_op_add(vm, op, addr, range);
+
#ifdef TEST_VM_OPS_ERROR
if (flags & FORCE_OP_ERROR) {
vops.inject_error = true;
@@ -3095,8 +3104,11 @@ int xe_vm_bind_ioctl(struct drm_device *dev, void *data, struct drm_file *file)
err = vm_bind_ioctl_ops_execute(vm, &vops);
unwind_ops:
- if (err && err != -ENODATA)
+ if (err && err != -ENODATA) {
+ xe_eudebug_vm_bind_end(vm, num_ufence > 0, err);
vm_bind_ioctl_ops_unwind(vm, ops, args->num_binds);
+ }
+
xe_vma_ops_fini(&vops);
for (i = args->num_binds - 1; i >= 0; --i)
if (ops[i])
diff --git a/drivers/gpu/drm/xe/xe_vm_types.h b/drivers/gpu/drm/xe/xe_vm_types.h
index 7f9a303e51d8..557b047ebdd7 100644
--- a/drivers/gpu/drm/xe/xe_vm_types.h
+++ b/drivers/gpu/drm/xe/xe_vm_types.h
@@ -282,6 +282,19 @@ struct xe_vm {
bool batch_invalidate_tlb;
/** @xef: XE file handle for tracking this VM's drm client */
struct xe_file *xef;
+
+#if IS_ENABLED(CONFIG_DRM_XE_EUDEBUG)
+ struct {
+ /** @lock: Lock for eudebug_bind members */
+ spinlock_t lock;
+ /** @events: List of vm bind ops gathered */
+ struct list_head events;
+ /** @ops: How many operations we have stored */
+ u32 ops;
+ /** @ref_seqno: Reference to the VM_BIND that the ops relate */
+ u64 ref_seqno;
+ } eudebug;
+#endif
};
/** struct xe_vma_op_map - VMA map operation */
diff --git a/include/uapi/drm/xe_drm_eudebug.h b/include/uapi/drm/xe_drm_eudebug.h
index 3c43aefefedd..44cf1b699589 100644
--- a/include/uapi/drm/xe_drm_eudebug.h
+++ b/include/uapi/drm/xe_drm_eudebug.h
@@ -29,6 +29,8 @@ struct drm_xe_eudebug_event {
#define DRM_XE_EUDEBUG_EVENT_VM 3
#define DRM_XE_EUDEBUG_EVENT_EXEC_QUEUE 4
#define DRM_XE_EUDEBUG_EVENT_EU_ATTENTION 5
+#define DRM_XE_EUDEBUG_EVENT_VM_BIND 6
+#define DRM_XE_EUDEBUG_EVENT_VM_BIND_OP 7
__u16 flags;
#define DRM_XE_EUDEBUG_EVENT_CREATE (1 << 0)
@@ -93,6 +95,68 @@ struct drm_xe_eudebug_eu_control {
__u64 bitmask_ptr;
};
+/*
+ * When client (debuggee) does vm_bind_ioctl() following event
+ * sequence will be created (for the debugger):
+ *
+ * ┌───────────────────────┐
+ * │ EVENT_VM_BIND ├───────┬─┬─┐
+ * └───────────────────────┘ │ │ │
+ * ┌───────────────────────┐ │ │ │
+ * │ EVENT_VM_BIND_OP #1 ├───┘ │ │
+ * └───────────────────────┘ │ │
+ * ... │ │
+ * ┌───────────────────────┐ │ │
+ * │ EVENT_VM_BIND_OP #n ├─────┘ │
+ * └───────────────────────┘ │
+ * │
+ * ┌───────────────────────┐ │
+ * │ EVENT_UFENCE ├───────┘
+ * └───────────────────────┘
+ *
+ * All the events below VM_BIND will reference the VM_BIND
+ * they associate with, by field .vm_bind_ref_seqno.
+ * event_ufence will only be included if the client did
+ * attach sync of type UFENCE into its vm_bind_ioctl().
+ *
+ * When EVENT_UFENCE is sent by the driver, all the OPs of
+ * the original VM_BIND are completed and the [addr,range]
+ * contained in them are present and modifiable through the
+ * vm accessors. Accessing [addr, range] before related ufence
+ * event will lead to undefined results as the actual bind
+ * operations are async and the backing storage might not
+ * be there on a moment of receiving the event.
+ *
+ * Client's UFENCE sync will be held by the driver: client's
+ * drm_xe_wait_ufence will not complete and the value of the ufence
+ * won't appear until ufence is acked by the debugger process calling
+ * DRM_XE_EUDEBUG_IOCTL_ACK_EVENT with the event_ufence.base.seqno.
+ * This will signal the fence, .value will update and the wait will
+ * complete allowing the client to continue.
+ *
+ */
+
+struct drm_xe_eudebug_event_vm_bind {
+ struct drm_xe_eudebug_event base;
+
+ __u64 client_handle;
+ __u64 vm_handle;
+
+ __u32 flags;
+#define DRM_XE_EUDEBUG_EVENT_VM_BIND_FLAG_UFENCE (1 << 0)
+
+ __u32 num_binds;
+};
+
+struct drm_xe_eudebug_event_vm_bind_op {
+ struct drm_xe_eudebug_event base;
+ __u64 vm_bind_ref_seqno; /* *_event_vm_bind.base.seqno */
+ __u64 num_extensions;
+
+ __u64 addr; /* XXX: Zero for unmap all? */
+ __u64 range; /* XXX: Zero for unmap all? */
+};
+
#if defined(__cplusplus)
}
#endif
--
2.46.1
^ permalink raw reply related [flat|nested] 28+ messages in thread* [RFC 10/19] drm/xe/eudebug: Add UFENCE events with acks
2024-10-21 9:58 [RFC 00/19] Support EU online debug on pagefault Gwan-gyeong Mun
` (8 preceding siblings ...)
2024-10-21 9:58 ` [RFC 09/19] drm/xe/eudebug: Add vm bind and vm bind ops Gwan-gyeong Mun
@ 2024-10-21 9:58 ` Gwan-gyeong Mun
2024-10-21 9:58 ` [RFC 11/19] drm/xe/eudebug: vm open/pread/pwrite Gwan-gyeong Mun
` (15 subsequent siblings)
25 siblings, 0 replies; 28+ messages in thread
From: Gwan-gyeong Mun @ 2024-10-21 9:58 UTC (permalink / raw)
To: intel-xe
Cc: nirmoy.das, matthew.brost, stuart.summers, christoph.manszewski,
mika.kuoppala, dominik.grzegorzek, andrzej.hajda,
maciej.patelczyk
From: Mika Kuoppala <mika.kuoppala@linux.intel.com>
When vma is in place, debugger needs to intercept before
userspace proceeds with the workload. For example to install
a breakpoint in a eu shader.
Attach debugger in xe_user_fence, send UFENCE event
and stall normal user fence signal path to yield if
there is debugger attached to ufence.
When ack (ioctl) is received for the corresponding seqno,
signal ufence.
v2: - return err instead of 0 to guarantee signalling (Dominik)
- checkpatch (Tilak)
- Kconfig (Mika, Andrzej)
- use lock instead of cmpxchg (Mika)
Signed-off-by: Mika Kuoppala <mika.kuoppala@linux.intel.com>
Signed-off-by: Andrzej Hajda <andrzej.hajda@intel.com>
Signed-off-by: Gwan-gyeong Mun <gwan-gyeong.mun@intel.com>
---
drivers/gpu/drm/xe/xe_eudebug.c | 277 +++++++++++++++++++++++++-
drivers/gpu/drm/xe/xe_eudebug.h | 15 ++
drivers/gpu/drm/xe/xe_eudebug_types.h | 13 ++
drivers/gpu/drm/xe/xe_exec.c | 2 +-
drivers/gpu/drm/xe/xe_sync.c | 43 ++--
drivers/gpu/drm/xe/xe_sync.h | 8 +-
drivers/gpu/drm/xe/xe_sync_types.h | 28 ++-
drivers/gpu/drm/xe/xe_vm.c | 4 +-
include/uapi/drm/xe_drm_eudebug.h | 13 ++
9 files changed, 376 insertions(+), 27 deletions(-)
diff --git a/drivers/gpu/drm/xe/xe_eudebug.c b/drivers/gpu/drm/xe/xe_eudebug.c
index a114201696fe..d53060afda68 100644
--- a/drivers/gpu/drm/xe/xe_eudebug.c
+++ b/drivers/gpu/drm/xe/xe_eudebug.c
@@ -32,6 +32,7 @@
#include "xe_reg_sr.h"
#include "xe_rtp.h"
#include "xe_sched_job.h"
+#include "xe_sync.h"
#include "xe_vm.h"
#include "xe_wa.h"
@@ -239,11 +240,119 @@ static void xe_eudebug_free(struct kref *ref)
kfree_rcu(d, rcu);
}
-static void xe_eudebug_put(struct xe_eudebug *d)
+void xe_eudebug_put(struct xe_eudebug *d)
{
kref_put(&d->ref, xe_eudebug_free);
}
+struct xe_eudebug_ack {
+ struct rb_node rb_node;
+ u64 seqno;
+ u64 ts_insert;
+ struct xe_user_fence *ufence;
+};
+
+#define fetch_ack(x) rb_entry(x, struct xe_eudebug_ack, rb_node)
+
+static int compare_ack(const u64 a, const u64 b)
+{
+ if (a < b)
+ return -1;
+ else if (a > b)
+ return 1;
+
+ return 0;
+}
+
+static int ack_insert_cmp(struct rb_node * const node,
+ const struct rb_node * const p)
+{
+ return compare_ack(fetch_ack(node)->seqno,
+ fetch_ack(p)->seqno);
+}
+
+static int ack_lookup_cmp(const void * const key,
+ const struct rb_node * const node)
+{
+ return compare_ack(*(const u64 *)key,
+ fetch_ack(node)->seqno);
+}
+
+static struct xe_eudebug_ack *remove_ack(struct xe_eudebug *d, u64 seqno)
+{
+ struct rb_root * const root = &d->acks.tree;
+ struct rb_node *node;
+
+ spin_lock(&d->acks.lock);
+ node = rb_find(&seqno, root, ack_lookup_cmp);
+ if (node)
+ rb_erase(node, root);
+ spin_unlock(&d->acks.lock);
+
+ if (!node)
+ return NULL;
+
+ return rb_entry_safe(node, struct xe_eudebug_ack, rb_node);
+}
+
+static void ufence_signal_worker(struct work_struct *w)
+{
+ struct xe_user_fence * const ufence =
+ container_of(w, struct xe_user_fence, eudebug.worker);
+
+ if (READ_ONCE(ufence->signalled))
+ xe_sync_ufence_signal(ufence);
+
+ xe_sync_ufence_put(ufence);
+}
+
+static void kick_ufence_worker(struct xe_user_fence *f)
+{
+ queue_work(f->xe->eudebug.ordered_wq, &f->eudebug.worker);
+}
+
+static void handle_ack(struct xe_eudebug *d, struct xe_eudebug_ack *ack,
+ bool on_disconnect)
+{
+ struct xe_user_fence *f = ack->ufence;
+ u64 signalled_by;
+ bool signal = false;
+
+ spin_lock(&f->eudebug.lock);
+ if (!f->eudebug.signalled_seqno) {
+ f->eudebug.signalled_seqno = ack->seqno;
+ signal = true;
+ }
+ signalled_by = f->eudebug.signalled_seqno;
+ spin_unlock(&f->eudebug.lock);
+
+ if (signal)
+ kick_ufence_worker(f);
+ else
+ xe_sync_ufence_put(f);
+
+ eu_dbg(d, "ACK: seqno=%llu: signalled by %llu (%s) (held %lluus)",
+ ack->seqno, signalled_by,
+ on_disconnect ? "disconnect" : "debugger",
+ ktime_us_delta(ktime_get(), ack->ts_insert));
+
+ kfree(ack);
+}
+
+static void release_acks(struct xe_eudebug *d)
+{
+ struct xe_eudebug_ack *ack, *n;
+ struct rb_root root;
+
+ spin_lock(&d->acks.lock);
+ root = d->acks.tree;
+ d->acks.tree = RB_ROOT;
+ spin_unlock(&d->acks.lock);
+
+ rbtree_postorder_for_each_entry_safe(ack, n, &root, rb_node)
+ handle_ack(d, ack, true);
+}
+
static struct task_struct *find_get_target(const pid_t nr)
{
struct task_struct *task;
@@ -328,6 +437,8 @@ static bool xe_eudebug_detach(struct xe_device *xe,
eu_dbg(d, "session %lld detached with %d", d->session, err);
+ release_acks(d);
+
/* Our ref with the connection_link */
xe_eudebug_put(d);
@@ -453,7 +564,7 @@ _xe_eudebug_get(struct xe_file *xef)
return d;
}
-static struct xe_eudebug *
+struct xe_eudebug *
xe_eudebug_get(struct xe_file *xef)
{
struct xe_eudebug *d;
@@ -824,7 +935,7 @@ static long xe_eudebug_read_event(struct xe_eudebug *d,
u64_to_user_ptr(arg);
struct drm_xe_eudebug_event user_event;
struct xe_eudebug_event *event;
- const unsigned int max_event = DRM_XE_EUDEBUG_EVENT_VM_BIND_OP;
+ const unsigned int max_event = DRM_XE_EUDEBUG_EVENT_VM_BIND_UFENCE;
long ret = 0;
if (XE_IOCTL_DBG(xe, copy_from_user(&user_event, user_orig, sizeof(user_event))))
@@ -899,6 +1010,44 @@ static long xe_eudebug_read_event(struct xe_eudebug *d,
return ret;
}
+static long
+xe_eudebug_ack_event_ioctl(struct xe_eudebug *d,
+ const unsigned int cmd,
+ const u64 arg)
+{
+ struct drm_xe_eudebug_ack_event __user * const user_ptr =
+ u64_to_user_ptr(arg);
+ struct drm_xe_eudebug_ack_event user_arg;
+ struct xe_eudebug_ack *ack;
+ struct xe_device *xe = d->xe;
+
+ if (XE_IOCTL_DBG(xe, _IOC_SIZE(cmd) < sizeof(user_arg)))
+ return -EINVAL;
+
+ /* Userland write */
+ if (XE_IOCTL_DBG(xe, !(_IOC_DIR(cmd) & _IOC_WRITE)))
+ return -EINVAL;
+
+ if (XE_IOCTL_DBG(xe, copy_from_user(&user_arg,
+ user_ptr,
+ sizeof(user_arg))))
+ return -EFAULT;
+
+ if (XE_IOCTL_DBG(xe, user_arg.flags))
+ return -EINVAL;
+
+ if (XE_IOCTL_DBG(xe, xe_eudebug_detached(d)))
+ return -ENOTCONN;
+
+ ack = remove_ack(d, user_arg.seqno);
+ if (XE_IOCTL_DBG(xe, !ack))
+ return -EINVAL;
+
+ handle_ack(d, ack, false);
+
+ return 0;
+}
+
static int do_eu_control(struct xe_eudebug *d,
const struct drm_xe_eudebug_eu_control * const arg,
struct drm_xe_eudebug_eu_control __user * const user_ptr)
@@ -1090,7 +1239,10 @@ static long xe_eudebug_ioctl(struct file *file,
ret = xe_eudebug_eu_control(d, arg);
eu_dbg(d, "ioctl cmd=EU_CONTROL ret=%ld\n", ret);
break;
-
+ case DRM_XE_EUDEBUG_IOCTL_ACK_EVENT:
+ ret = xe_eudebug_ack_event_ioctl(d, cmd, arg);
+ eu_dbg(d, "ioctl cmd=EVENT_ACK ret=%ld\n", ret);
+ break;
default:
ret = -EINVAL;
}
@@ -1765,6 +1917,9 @@ xe_eudebug_connect(struct xe_device *xe,
INIT_KFIFO(d->events.fifo);
INIT_WORK(&d->discovery_work, discovery_work_fn);
+ spin_lock_init(&d->acks.lock);
+ d->acks.tree = RB_ROOT;
+
d->res = xe_eudebug_resources_alloc();
if (IS_ERR(d->res)) {
err = PTR_ERR(d->res);
@@ -2397,6 +2552,70 @@ static int vm_bind_op(struct xe_eudebug *d, struct xe_vm *vm,
return 0;
}
+static int xe_eudebug_track_ufence(struct xe_eudebug *d,
+ struct xe_user_fence *f,
+ u64 seqno)
+{
+ struct xe_eudebug_ack *ack;
+ struct rb_node *old;
+
+ ack = kzalloc(sizeof(*ack), GFP_KERNEL);
+ if (!ack)
+ return -ENOMEM;
+
+ ack->seqno = seqno;
+ ack->ts_insert = ktime_get();
+
+ spin_lock(&d->acks.lock);
+ old = rb_find_add(&ack->rb_node,
+ &d->acks.tree, ack_insert_cmp);
+ if (!old) {
+ kref_get(&f->refcount);
+ ack->ufence = f;
+ }
+ spin_unlock(&d->acks.lock);
+
+ if (old) {
+ eu_dbg(d, "ACK: seqno=%llu: already exists", seqno);
+ kfree(ack);
+ return -EEXIST;
+ }
+
+ eu_dbg(d, "ACK: seqno=%llu: tracking started", seqno);
+
+ return 0;
+}
+
+static int vm_bind_ufence_event(struct xe_eudebug *d,
+ struct xe_user_fence *ufence)
+{
+ struct xe_eudebug_event *event;
+ struct xe_eudebug_event_vm_bind_ufence *e;
+ const u32 sz = sizeof(*e);
+ const u32 flags = DRM_XE_EUDEBUG_EVENT_CREATE |
+ DRM_XE_EUDEBUG_EVENT_NEED_ACK;
+ u64 seqno;
+ int ret;
+
+ seqno = atomic_long_inc_return(&d->events.seqno);
+
+ event = xe_eudebug_create_event(d, DRM_XE_EUDEBUG_EVENT_VM_BIND_UFENCE,
+ seqno, flags, sz, GFP_KERNEL);
+ if (!event)
+ return -ENOMEM;
+
+ e = cast_event(e, event);
+
+ write_member(struct drm_xe_eudebug_event_vm_bind_ufence,
+ e, vm_bind_ref_seqno, ufence->eudebug.bind_ref_seqno);
+
+ ret = xe_eudebug_track_ufence(d, ufence, seqno);
+ if (!ret)
+ ret = xe_eudebug_queue_event(d, event);
+
+ return ret;
+}
+
void xe_eudebug_vm_init(struct xe_vm *vm)
{
INIT_LIST_HEAD(&vm->eudebug.events);
@@ -2584,6 +2803,24 @@ void xe_eudebug_vm_bind_end(struct xe_vm *vm, bool has_ufence, int bind_err)
xe_eudebug_put(d);
}
+int xe_eudebug_vm_bind_ufence(struct xe_user_fence *ufence)
+{
+ struct xe_eudebug *d;
+ int err;
+
+ d = ufence->eudebug.debugger;
+ if (!d || xe_eudebug_detached(d))
+ return -ENOTCONN;
+
+ err = vm_bind_ufence_event(d, ufence);
+ if (err) {
+ eu_err(d, "error %d on %s", err, __func__);
+ xe_eudebug_disconnect(d, err);
+ }
+
+ return err;
+}
+
static int discover_client(struct xe_eudebug *d, struct xe_file *xef)
{
struct xe_exec_queue *q;
@@ -2676,3 +2913,35 @@ static void discovery_work_fn(struct work_struct *work)
xe_eudebug_put(d);
}
+
+void xe_eudebug_ufence_init(struct xe_user_fence *ufence,
+ struct xe_file *xef,
+ struct xe_vm *vm)
+{
+ u64 bind_ref;
+
+ spin_lock(&vm->eudebug.lock);
+ bind_ref = vm->eudebug.ref_seqno;
+ spin_unlock(&vm->eudebug.lock);
+
+ spin_lock_init(&ufence->eudebug.lock);
+ INIT_WORK(&ufence->eudebug.worker, ufence_signal_worker);
+
+ ufence->eudebug.signalled_seqno = 0;
+
+ if (bind_ref) {
+ ufence->eudebug.debugger = xe_eudebug_get(xef);
+
+ if (ufence->eudebug.debugger)
+ ufence->eudebug.bind_ref_seqno = bind_ref;
+ }
+}
+
+void xe_eudebug_ufence_fini(struct xe_user_fence *ufence)
+{
+ if (!ufence->eudebug.debugger)
+ return;
+
+ xe_eudebug_put(ufence->eudebug.debugger);
+ ufence->eudebug.debugger = NULL;
+}
diff --git a/drivers/gpu/drm/xe/xe_eudebug.h b/drivers/gpu/drm/xe/xe_eudebug.h
index ccc7202b3308..ae720a1b05d9 100644
--- a/drivers/gpu/drm/xe/xe_eudebug.h
+++ b/drivers/gpu/drm/xe/xe_eudebug.h
@@ -15,6 +15,7 @@ struct xe_vm;
struct xe_vma;
struct xe_exec_queue;
struct xe_hw_engine;
+struct xe_user_fence;
#if IS_ENABLED(CONFIG_DRM_XE_EUDEBUG)
@@ -41,6 +42,13 @@ void xe_eudebug_vm_bind_start(struct xe_vm *vm);
void xe_eudebug_vm_bind_op_add(struct xe_vm *vm, u32 op, u64 addr, u64 range);
void xe_eudebug_vm_bind_end(struct xe_vm *vm, bool has_ufence, int err);
+int xe_eudebug_vm_bind_ufence(struct xe_user_fence *ufence);
+void xe_eudebug_ufence_init(struct xe_user_fence *ufence, struct xe_file *xef, struct xe_vm *vm);
+void xe_eudebug_ufence_fini(struct xe_user_fence *ufence);
+
+struct xe_eudebug *xe_eudebug_get(struct xe_file *xef);
+void xe_eudebug_put(struct xe_eudebug *d);
+
#else
static inline int xe_eudebug_connect_ioctl(struct drm_device *dev,
@@ -66,6 +74,13 @@ static inline void xe_eudebug_vm_bind_start(struct xe_vm *vm) { }
static inline void xe_eudebug_vm_bind_op_add(struct xe_vm *vm, u32 op, u64 addr, u64 range) { }
static inline void xe_eudebug_vm_bind_end(struct xe_vm *vm, bool has_ufence, int err) { }
+static inline int xe_eudebug_vm_bind_ufence(struct xe_user_fence *ufence) { return 0; }
+static inline void xe_eudebug_ufence_init(struct xe_user_fence *ufence, struct xe_file *xef, struct xe_vm *vm) { }
+static inline void xe_eudebug_ufence_fini(struct xe_user_fence *ufence) { }
+
+static inline struct xe_eudebug *xe_eudebug_get(struct xe_file *xef) { return NULL; }
+static inline void xe_eudebug_put(struct xe_eudebug *d) { }
+
#endif /* CONFIG_DRM_XE_EUDEBUG */
#endif
diff --git a/drivers/gpu/drm/xe/xe_eudebug_types.h b/drivers/gpu/drm/xe/xe_eudebug_types.h
index 78739954967b..aae7bc476c7e 100644
--- a/drivers/gpu/drm/xe/xe_eudebug_types.h
+++ b/drivers/gpu/drm/xe/xe_eudebug_types.h
@@ -150,6 +150,14 @@ struct xe_eudebug {
atomic_long_t seqno;
} events;
+ /* user fences tracked by this debugger */
+ struct {
+ /** @lock: guards access to tree */
+ spinlock_t lock;
+
+ struct rb_root tree;
+ } acks;
+
/** @ops operations for eu_control */
struct xe_eudebug_eu_control_ops *ops;
};
@@ -287,4 +295,9 @@ struct xe_eudebug_event_vm_bind_op {
u64 range; /* Zero for unmap all ? */
};
+struct xe_eudebug_event_vm_bind_ufence {
+ struct xe_eudebug_event base;
+ u64 vm_bind_ref_seqno;
+};
+
#endif
diff --git a/drivers/gpu/drm/xe/xe_exec.c b/drivers/gpu/drm/xe/xe_exec.c
index f23ac1e2ed88..73223ca95860 100644
--- a/drivers/gpu/drm/xe/xe_exec.c
+++ b/drivers/gpu/drm/xe/xe_exec.c
@@ -155,7 +155,7 @@ int xe_exec_ioctl(struct drm_device *dev, void *data, struct drm_file *file)
vm = q->vm;
for (num_syncs = 0; num_syncs < args->num_syncs; num_syncs++) {
- err = xe_sync_entry_parse(xe, xef, &syncs[num_syncs],
+ err = xe_sync_entry_parse(xe, xef, vm, &syncs[num_syncs],
&syncs_user[num_syncs], SYNC_PARSE_FLAG_EXEC |
(xe_vm_in_lr_mode(vm) ?
SYNC_PARSE_FLAG_LR_MODE : 0));
diff --git a/drivers/gpu/drm/xe/xe_sync.c b/drivers/gpu/drm/xe/xe_sync.c
index a90480c6aecf..45ca0ebb89bc 100644
--- a/drivers/gpu/drm/xe/xe_sync.c
+++ b/drivers/gpu/drm/xe/xe_sync.c
@@ -15,27 +15,20 @@
#include <uapi/drm/xe_drm.h>
#include "xe_device_types.h"
+#include "xe_eudebug.h"
#include "xe_exec_queue.h"
#include "xe_macros.h"
#include "xe_sched_job_types.h"
-struct xe_user_fence {
- struct xe_device *xe;
- struct kref refcount;
- struct dma_fence_cb cb;
- struct work_struct worker;
- struct mm_struct *mm;
- u64 __user *addr;
- u64 value;
- int signalled;
-};
-
static void user_fence_destroy(struct kref *kref)
{
struct xe_user_fence *ufence = container_of(kref, struct xe_user_fence,
refcount);
mmdrop(ufence->mm);
+
+ xe_eudebug_ufence_fini(ufence);
+
kfree(ufence);
}
@@ -49,7 +42,10 @@ static void user_fence_put(struct xe_user_fence *ufence)
kref_put(&ufence->refcount, user_fence_destroy);
}
-static struct xe_user_fence *user_fence_create(struct xe_device *xe, u64 addr,
+static struct xe_user_fence *user_fence_create(struct xe_device *xe,
+ struct xe_file *xef,
+ struct xe_vm *vm,
+ u64 addr,
u64 value)
{
struct xe_user_fence *ufence;
@@ -70,12 +66,14 @@ static struct xe_user_fence *user_fence_create(struct xe_device *xe, u64 addr,
ufence->mm = current->mm;
mmgrab(ufence->mm);
+ xe_eudebug_ufence_init(ufence, xef, vm);
+
return ufence;
}
-static void user_fence_worker(struct work_struct *w)
+void xe_sync_ufence_signal(struct xe_user_fence *ufence)
{
- struct xe_user_fence *ufence = container_of(w, struct xe_user_fence, worker);
+ XE_WARN_ON(!ufence->signalled);
if (mmget_not_zero(ufence->mm)) {
kthread_use_mm(ufence->mm);
@@ -88,7 +86,20 @@ static void user_fence_worker(struct work_struct *w)
}
wake_up_all(&ufence->xe->ufence_wq);
+}
+
+static void user_fence_worker(struct work_struct *w)
+{
+ struct xe_user_fence *ufence = container_of(w, struct xe_user_fence, worker);
+ int ret;
+
WRITE_ONCE(ufence->signalled, 1);
+
+ /* Lets see if debugger wants to track this */
+ ret = xe_eudebug_vm_bind_ufence(ufence);
+ if (ret)
+ xe_sync_ufence_signal(ufence);
+
user_fence_put(ufence);
}
@@ -107,6 +118,7 @@ static void user_fence_cb(struct dma_fence *fence, struct dma_fence_cb *cb)
}
int xe_sync_entry_parse(struct xe_device *xe, struct xe_file *xef,
+ struct xe_vm *vm,
struct xe_sync_entry *sync,
struct drm_xe_sync __user *sync_user,
unsigned int flags)
@@ -188,7 +200,8 @@ int xe_sync_entry_parse(struct xe_device *xe, struct xe_file *xef,
if (exec) {
sync->addr = sync_in.addr;
} else {
- sync->ufence = user_fence_create(xe, sync_in.addr,
+ sync->ufence = user_fence_create(xe, xef, vm,
+ sync_in.addr,
sync_in.timeline_value);
if (XE_IOCTL_DBG(xe, IS_ERR(sync->ufence)))
return PTR_ERR(sync->ufence);
diff --git a/drivers/gpu/drm/xe/xe_sync.h b/drivers/gpu/drm/xe/xe_sync.h
index 256ffc1e54dc..f5bec2b1b4f6 100644
--- a/drivers/gpu/drm/xe/xe_sync.h
+++ b/drivers/gpu/drm/xe/xe_sync.h
@@ -9,8 +9,12 @@
#include "xe_sync_types.h"
struct xe_device;
-struct xe_exec_queue;
struct xe_file;
+struct xe_exec_queue;
+struct drm_syncobj;
+struct dma_fence;
+struct dma_fence_chain;
+struct drm_xe_sync;
struct xe_sched_job;
struct xe_vm;
@@ -19,6 +23,7 @@ struct xe_vm;
#define SYNC_PARSE_FLAG_DISALLOW_USER_FENCE BIT(2)
int xe_sync_entry_parse(struct xe_device *xe, struct xe_file *xef,
+ struct xe_vm *vm,
struct xe_sync_entry *sync,
struct drm_xe_sync __user *sync_user,
unsigned int flags);
@@ -40,5 +45,6 @@ struct xe_user_fence *__xe_sync_ufence_get(struct xe_user_fence *ufence);
struct xe_user_fence *xe_sync_ufence_get(struct xe_sync_entry *sync);
void xe_sync_ufence_put(struct xe_user_fence *ufence);
int xe_sync_ufence_get_status(struct xe_user_fence *ufence);
+void xe_sync_ufence_signal(struct xe_user_fence *ufence);
#endif
diff --git a/drivers/gpu/drm/xe/xe_sync_types.h b/drivers/gpu/drm/xe/xe_sync_types.h
index 30ac3f51993b..dcd3165e66a7 100644
--- a/drivers/gpu/drm/xe/xe_sync_types.h
+++ b/drivers/gpu/drm/xe/xe_sync_types.h
@@ -6,13 +6,31 @@
#ifndef _XE_SYNC_TYPES_H_
#define _XE_SYNC_TYPES_H_
+#include <linux/dma-fence-array.h>
+#include <linux/kref.h>
+#include <linux/spinlock.h>
#include <linux/types.h>
-struct drm_syncobj;
-struct dma_fence;
-struct dma_fence_chain;
-struct drm_xe_sync;
-struct user_fence;
+struct xe_user_fence {
+ struct xe_device *xe;
+ struct kref refcount;
+ struct dma_fence_cb cb;
+ struct work_struct worker;
+ struct mm_struct *mm;
+ u64 __user *addr;
+ u64 value;
+ int signalled;
+
+#if IS_ENABLED(CONFIG_DRM_XE_EUDEBUG)
+ struct {
+ spinlock_t lock;
+ struct xe_eudebug *debugger;
+ u64 bind_ref_seqno;
+ u64 signalled_seqno;
+ struct work_struct worker;
+ } eudebug;
+#endif
+};
struct xe_sync_entry {
struct drm_syncobj *syncobj;
diff --git a/drivers/gpu/drm/xe/xe_vm.c b/drivers/gpu/drm/xe/xe_vm.c
index c9840c3fd3b8..dad407840379 100644
--- a/drivers/gpu/drm/xe/xe_vm.c
+++ b/drivers/gpu/drm/xe/xe_vm.c
@@ -3031,9 +3031,11 @@ int xe_vm_bind_ioctl(struct drm_device *dev, void *data, struct drm_file *file)
}
}
+ xe_eudebug_vm_bind_start(vm);
+
syncs_user = u64_to_user_ptr(args->syncs);
for (num_syncs = 0; num_syncs < args->num_syncs; num_syncs++) {
- err = xe_sync_entry_parse(xe, xef, &syncs[num_syncs],
+ err = xe_sync_entry_parse(xe, xef, vm, &syncs[num_syncs],
&syncs_user[num_syncs],
(xe_vm_in_lr_mode(vm) ?
SYNC_PARSE_FLAG_LR_MODE : 0) |
diff --git a/include/uapi/drm/xe_drm_eudebug.h b/include/uapi/drm/xe_drm_eudebug.h
index 44cf1b699589..b2f6038ccc59 100644
--- a/include/uapi/drm/xe_drm_eudebug.h
+++ b/include/uapi/drm/xe_drm_eudebug.h
@@ -17,6 +17,7 @@ extern "C" {
*/
#define DRM_XE_EUDEBUG_IOCTL_READ_EVENT _IO('j', 0x0)
#define DRM_XE_EUDEBUG_IOCTL_EU_CONTROL _IOWR('j', 0x2, struct drm_xe_eudebug_eu_control)
+#define DRM_XE_EUDEBUG_IOCTL_ACK_EVENT _IOW('j', 0x4, struct drm_xe_eudebug_ack_event)
/* XXX: Document events to match their internal counterparts when moved to xe_drm.h */
struct drm_xe_eudebug_event {
@@ -31,6 +32,7 @@ struct drm_xe_eudebug_event {
#define DRM_XE_EUDEBUG_EVENT_EU_ATTENTION 5
#define DRM_XE_EUDEBUG_EVENT_VM_BIND 6
#define DRM_XE_EUDEBUG_EVENT_VM_BIND_OP 7
+#define DRM_XE_EUDEBUG_EVENT_VM_BIND_UFENCE 8
__u16 flags;
#define DRM_XE_EUDEBUG_EVENT_CREATE (1 << 0)
@@ -157,6 +159,17 @@ struct drm_xe_eudebug_event_vm_bind_op {
__u64 range; /* XXX: Zero for unmap all? */
};
+struct drm_xe_eudebug_event_vm_bind_ufence {
+ struct drm_xe_eudebug_event base;
+ __u64 vm_bind_ref_seqno; /* *_event_vm_bind.base.seqno */
+};
+
+struct drm_xe_eudebug_ack_event {
+ __u32 type;
+ __u32 flags; /* MBZ */
+ __u64 seqno;
+};
+
#if defined(__cplusplus)
}
#endif
--
2.46.1
^ permalink raw reply related [flat|nested] 28+ messages in thread* [RFC 11/19] drm/xe/eudebug: vm open/pread/pwrite
2024-10-21 9:58 [RFC 00/19] Support EU online debug on pagefault Gwan-gyeong Mun
` (9 preceding siblings ...)
2024-10-21 9:58 ` [RFC 10/19] drm/xe/eudebug: Add UFENCE events with acks Gwan-gyeong Mun
@ 2024-10-21 9:58 ` Gwan-gyeong Mun
2024-10-21 9:58 ` [RFC 12/19] drm/xe/eudebug: implement userptr_vma access Gwan-gyeong Mun
` (14 subsequent siblings)
25 siblings, 0 replies; 28+ messages in thread
From: Gwan-gyeong Mun @ 2024-10-21 9:58 UTC (permalink / raw)
To: intel-xe
Cc: nirmoy.das, matthew.brost, stuart.summers, christoph.manszewski,
mika.kuoppala, dominik.grzegorzek, andrzej.hajda,
maciej.patelczyk
From: Mika Kuoppala <mika.kuoppala@linux.intel.com>
Debugger needs access to the client's vm to read and write. For
example inspecting ISA/ELF and setting up breakpoints.
Add ioctl to open target vm with debugger client and vm_handle
and hook up pread/pwrite possibility.
Open will take timeout argument so that standard fsync
can be used for explicit flushing between cpu/gpu for
the target vm.
Implement this for bo backed storage. userptr will
be done in following patch.
v2: - checkpatch (Maciej)
- 32bit fixes (Andrzej)
- bo_vmap (Mika)
- fix vm leak if can't allocate k_buffer (Mika)
- assert vm write held for vma (Matthew)
v3: update to use changed xe_force_wake_get() failure handling (G.G.)
Cc: Matthew Brost <matthew.brost@intel.com>
Signed-off-by: Mika Kuoppala <mika.kuoppala@linux.intel.com>
Signed-off-by: Maciej Patelczyk <maciej.patelczyk@intel.com>
Signed-off-by: Gwan-gyeong Mun <gwan-gyeong.mun@intel.com>
---
drivers/gpu/drm/xe/regs/xe_gt_regs.h | 24 ++
drivers/gpu/drm/xe/xe_eudebug.c | 481 +++++++++++++++++++++++++++
include/uapi/drm/xe_drm_eudebug.h | 18 +
3 files changed, 523 insertions(+)
diff --git a/drivers/gpu/drm/xe/regs/xe_gt_regs.h b/drivers/gpu/drm/xe/regs/xe_gt_regs.h
index 20fbb13ddf7a..0e298d2fc93f 100644
--- a/drivers/gpu/drm/xe/regs/xe_gt_regs.h
+++ b/drivers/gpu/drm/xe/regs/xe_gt_regs.h
@@ -549,6 +549,30 @@
#define CCS_MODE_CSLICE(cslice, ccs) \
((ccs) << ((cslice) * CCS_MODE_CSLICE_WIDTH))
+#define RCU_ASYNC_FLUSH XE_REG(0x149fc)
+#define RCU_ASYNC_FLUSH_IN_PROGRESS REG_BIT(31)
+#define RCU_ASYNC_FLUSH_ENGINE_ID_SHIFT 28
+#define RCU_ASYNC_FLUSH_ENGINE_ID_DECODE1 REG_BIT(26)
+#define RCU_ASYNC_FLUSH_AMFS REG_BIT(8)
+#define RCU_ASYNC_FLUSH_PREFETCH REG_BIT(7)
+#define RCU_ASYNC_FLUSH_DATA_PORT REG_BIT(6)
+#define RCU_ASYNC_FLUSH_DATA_CACHE REG_BIT(5)
+#define RCU_ASYNC_FLUSH_HDC_PIPELINE REG_BIT(4)
+#define RCU_ASYNC_INVALIDATE_HDC_PIPELINE REG_BIT(3)
+#define RCU_ASYNC_INVALIDATE_CONSTANT_CACHE REG_BIT(2)
+#define RCU_ASYNC_INVALIDATE_TEXTURE_CACHE REG_BIT(1)
+#define RCU_ASYNC_INVALIDATE_INSTRUCTION_CACHE REG_BIT(0)
+#define RCU_ASYNC_FLUSH_AND_INVALIDATE_ALL ( \
+ RCU_ASYNC_FLUSH_AMFS | \
+ RCU_ASYNC_FLUSH_PREFETCH | \
+ RCU_ASYNC_FLUSH_DATA_PORT | \
+ RCU_ASYNC_FLUSH_DATA_CACHE | \
+ RCU_ASYNC_FLUSH_HDC_PIPELINE | \
+ RCU_ASYNC_INVALIDATE_HDC_PIPELINE | \
+ RCU_ASYNC_INVALIDATE_CONSTANT_CACHE | \
+ RCU_ASYNC_INVALIDATE_TEXTURE_CACHE | \
+ RCU_ASYNC_INVALIDATE_INSTRUCTION_CACHE)
+
#define RCU_DEBUG_1 XE_REG(0x14a00)
#define RCU_DEBUG_1_ENGINE_STATUS REG_GENMASK(2, 0)
#define RCU_DEBUG_1_RUNALONE_ACTIVE REG_BIT(2)
diff --git a/drivers/gpu/drm/xe/xe_eudebug.c b/drivers/gpu/drm/xe/xe_eudebug.c
index d53060afda68..309358b575d6 100644
--- a/drivers/gpu/drm/xe/xe_eudebug.c
+++ b/drivers/gpu/drm/xe/xe_eudebug.c
@@ -5,9 +5,12 @@
#include <linux/anon_inodes.h>
#include <linux/delay.h>
+#include <linux/file.h>
#include <linux/poll.h>
#include <linux/uaccess.h>
+#include <linux/vmalloc.h>
+#include <drm/drm_drv.h>
#include <drm/drm_managed.h>
#include <generated/xe_wa_oob.h>
@@ -16,6 +19,7 @@
#include "regs/xe_engine_regs.h"
#include "xe_assert.h"
+#include "xe_bo.h"
#include "xe_device.h"
#include "xe_eudebug.h"
#include "xe_eudebug_types.h"
@@ -1219,6 +1223,8 @@ static long xe_eudebug_eu_control(struct xe_eudebug *d, const u64 arg)
return ret;
}
+static long xe_eudebug_vm_open_ioctl(struct xe_eudebug *d, unsigned long arg);
+
static long xe_eudebug_ioctl(struct file *file,
unsigned int cmd,
unsigned long arg)
@@ -1243,6 +1249,11 @@ static long xe_eudebug_ioctl(struct file *file,
ret = xe_eudebug_ack_event_ioctl(d, cmd, arg);
eu_dbg(d, "ioctl cmd=EVENT_ACK ret=%ld\n", ret);
break;
+ case DRM_XE_EUDEBUG_IOCTL_VM_OPEN:
+ ret = xe_eudebug_vm_open_ioctl(d, arg);
+ eu_dbg(d, "ioctl cmd=VM_OPEN ret=%ld\n", ret);
+ break;
+
default:
ret = -EINVAL;
}
@@ -2945,3 +2956,473 @@ void xe_eudebug_ufence_fini(struct xe_user_fence *ufence)
xe_eudebug_put(ufence->eudebug.debugger);
ufence->eudebug.debugger = NULL;
}
+
+static int xe_eudebug_bovma_access(struct xe_bo *bo, u64 offset,
+ void *buf, u64 len, bool write)
+{
+ struct xe_device * const xe = xe_bo_device(bo);
+ int ret;
+ u32 flags_orig;
+
+ /* XXX: require pin?. Assert bo->vm held */
+ ret = xe_bo_lock(bo, true);
+ if (ret)
+ return ret;
+
+ /*
+ * XXX: we want to use xe_bo_vmap but it insist that userspace
+ * has provided it's need for CPU access. But that is the client
+ * and we are the debugger. So we promote temporarily with
+ * flag to allow xe_bo_vmap to work in our case even if the client
+ * did not need cpu map.
+ *
+ * XXX: Fix this by adding extra flags to xe_bo_vmap?
+ */
+ flags_orig = bo->flags;
+ bo->flags |= XE_BO_FLAG_NEEDS_CPU_ACCESS;
+
+ ret = xe_bo_vmap(bo);
+ if (!ret) {
+ if (write)
+ xe_map_memcpy_to(xe, &bo->vmap, offset, buf, len);
+ else
+ xe_map_memcpy_from(xe, buf, &bo->vmap, offset, len);
+
+ xe_bo_vunmap(bo);
+
+ ret = len;
+ }
+ bo->flags = flags_orig;
+
+ xe_bo_unlock(bo);
+
+ return ret;
+}
+
+static int xe_eudebug_vma_access(struct xe_vma *vma, u64 offset,
+ void *buf, u64 len, bool write)
+{
+ struct xe_bo *bo;
+ u64 bytes;
+
+ lockdep_assert_held_write(&xe_vma_vm(vma)->lock);
+
+ if (XE_WARN_ON(offset >= xe_vma_size(vma)))
+ return -EINVAL;
+
+ bytes = min_t(u64, len, xe_vma_size(vma) - offset);
+ if (!bytes)
+ return 0;
+
+ bo = xe_bo_get(xe_vma_bo(vma));
+ if (bo) {
+ int ret;
+
+ ret = xe_eudebug_bovma_access(bo, offset, buf, bytes, write);
+ xe_bo_put(bo);
+
+ return ret;
+ }
+
+ return -EINVAL;
+}
+
+static int xe_eudebug_vm_access(struct xe_vm *vm, u64 offset,
+ void *buf, u64 len, bool write)
+{
+ struct xe_vma *vma;
+ int ret;
+
+ down_write(&vm->lock);
+
+ vma = xe_vm_find_overlapping_vma(vm, offset, len);
+ if (vma) {
+ /* XXX: why find overlapping returns below start? */
+ if (offset < xe_vma_start(vma) ||
+ offset >= (xe_vma_start(vma) + xe_vma_size(vma))) {
+ ret = -EINVAL;
+ goto out;
+ }
+
+ /* Offset into vma */
+ offset -= xe_vma_start(vma);
+ ret = xe_eudebug_vma_access(vma, offset, buf, len, write);
+ } else {
+ ret = -EINVAL;
+ }
+
+out:
+ up_write(&vm->lock);
+
+ return ret;
+}
+
+struct vm_file {
+ struct xe_eudebug *debugger;
+ struct xe_file *xef;
+ struct xe_vm *vm;
+ u64 flags;
+ u64 client_id;
+ u64 vm_handle;
+ u64 timeout_ns;
+};
+
+static ssize_t __vm_read_write(struct xe_vm *vm,
+ void *bb,
+ char __user *r_buffer,
+ const char __user *w_buffer,
+ unsigned long offset,
+ unsigned long len,
+ const bool write)
+{
+ ssize_t ret;
+
+ if (!len)
+ return 0;
+
+ if (write) {
+ ret = copy_from_user(bb, w_buffer, len);
+ if (ret)
+ return -EFAULT;
+
+ ret = xe_eudebug_vm_access(vm, offset, bb, len, true);
+ if (ret < 0)
+ return ret;
+
+ len = ret;
+ } else {
+ ret = xe_eudebug_vm_access(vm, offset, bb, len, false);
+ if (ret < 0)
+ return ret;
+
+ len = ret;
+
+ ret = copy_to_user(r_buffer, bb, len);
+ if (ret)
+ return -EFAULT;
+ }
+
+ return len;
+}
+
+static struct xe_vm *find_vm_get(struct xe_eudebug *d, const u32 id)
+{
+ struct xe_vm *vm;
+
+ mutex_lock(&d->res->lock);
+ vm = find_resource__unlocked(d->res, XE_EUDEBUG_RES_TYPE_VM, id);
+ if (vm)
+ xe_vm_get(vm);
+
+ mutex_unlock(&d->res->lock);
+
+ return vm;
+}
+
+static ssize_t __xe_eudebug_vm_access(struct file *file,
+ char __user *r_buffer,
+ const char __user *w_buffer,
+ size_t count, loff_t *__pos)
+{
+ struct vm_file *vmf = file->private_data;
+ struct xe_eudebug * const d = vmf->debugger;
+ struct xe_device * const xe = d->xe;
+ const bool write = !!w_buffer;
+ struct xe_vm *vm;
+ ssize_t copied = 0;
+ ssize_t bytes_left = count;
+ ssize_t ret;
+ unsigned long alloc_len;
+ loff_t pos = *__pos;
+ void *k_buffer;
+
+ if (XE_IOCTL_DBG(xe, write && r_buffer))
+ return -EINVAL;
+
+ vm = find_vm_get(d, vmf->vm_handle);
+ if (XE_IOCTL_DBG(xe, !vm))
+ return -EINVAL;
+
+ if (XE_IOCTL_DBG(xe, vm != vmf->vm)) {
+ eu_warn(d, "vm_access(%s): vm handle mismatch client_handle=%llu, vm_handle=%llu, flags=0x%llx, pos=%llu, count=%zu\n",
+ write ? "write" : "read",
+ vmf->client_id, vmf->vm_handle, vmf->flags, pos, count);
+ xe_vm_put(vm);
+ return -EINVAL;
+ }
+
+ if (!count) {
+ xe_vm_put(vm);
+ return 0;
+ }
+
+ alloc_len = min_t(unsigned long, ALIGN(count, PAGE_SIZE), 64 * SZ_1M);
+ do {
+ k_buffer = vmalloc(alloc_len);
+ if (k_buffer)
+ break;
+
+ alloc_len >>= 1;
+ } while (alloc_len > PAGE_SIZE);
+
+ if (XE_IOCTL_DBG(xe, !k_buffer)) {
+ xe_vm_put(vm);
+ return -ENOMEM;
+ }
+
+ do {
+ const ssize_t len = min_t(ssize_t, bytes_left, alloc_len);
+
+ ret = __vm_read_write(vm, k_buffer,
+ write ? NULL : r_buffer + copied,
+ write ? w_buffer + copied : NULL,
+ pos + copied,
+ len,
+ write);
+ if (ret <= 0)
+ break;
+
+ bytes_left -= ret;
+ copied += ret;
+ } while (bytes_left > 0);
+
+ vfree(k_buffer);
+ xe_vm_put(vm);
+
+ if (XE_WARN_ON(copied < 0))
+ copied = 0;
+
+ *__pos += copied;
+
+ return copied ?: ret;
+}
+
+static ssize_t xe_eudebug_vm_read(struct file *file,
+ char __user *buffer,
+ size_t count, loff_t *pos)
+{
+ return __xe_eudebug_vm_access(file, buffer, NULL, count, pos);
+}
+
+static ssize_t xe_eudebug_vm_write(struct file *file,
+ const char __user *buffer,
+ size_t count, loff_t *pos)
+{
+ return __xe_eudebug_vm_access(file, NULL, buffer, count, pos);
+}
+
+static int engine_rcu_flush(struct xe_eudebug *d,
+ struct xe_hw_engine *hwe,
+ unsigned int timeout_us)
+{
+ const struct xe_reg psmi_addr = RING_PSMI_CTL(hwe->mmio_base);
+ struct xe_gt *gt = hwe->gt;
+ u32 mask = RCU_ASYNC_FLUSH_AND_INVALIDATE_ALL;
+ unsigned int fw_ref;
+ u32 psmi_ctrl;
+ u32 id;
+ int ret;
+
+ if (hwe->class == XE_ENGINE_CLASS_RENDER)
+ id = 0;
+ else if (hwe->class == XE_ENGINE_CLASS_COMPUTE)
+ id = hwe->instance + 1;
+ else
+ return -EINVAL;
+
+ if (id < 8)
+ mask |= id << RCU_ASYNC_FLUSH_ENGINE_ID_SHIFT;
+ else
+ mask |= (id - 8) << RCU_ASYNC_FLUSH_ENGINE_ID_SHIFT |
+ RCU_ASYNC_FLUSH_ENGINE_ID_DECODE1;
+
+ fw_ref = xe_force_wake_get(gt_to_fw(gt), hwe->domain);
+ if (!fw_ref)
+ return -ETIMEDOUT;
+
+ /* Prevent concurrent flushes */
+ mutex_lock(&d->eu_lock);
+ psmi_ctrl = xe_mmio_read32(>->mmio, psmi_addr);
+ if (!(psmi_ctrl & IDLE_MSG_DISABLE))
+ xe_mmio_write32(>->mmio, psmi_addr, _MASKED_BIT_ENABLE(IDLE_MSG_DISABLE));
+
+ ret = xe_mmio_wait32(>->mmio, RCU_ASYNC_FLUSH,
+ RCU_ASYNC_FLUSH_IN_PROGRESS, 0,
+ timeout_us, NULL, false);
+ if (ret)
+ goto out;
+
+ xe_mmio_write32(>->mmio, RCU_ASYNC_FLUSH, mask);
+
+ ret = xe_mmio_wait32(>->mmio, RCU_ASYNC_FLUSH,
+ RCU_ASYNC_FLUSH_IN_PROGRESS, 0,
+ timeout_us, NULL, false);
+out:
+ if (!(psmi_ctrl & IDLE_MSG_DISABLE))
+ xe_mmio_write32(>->mmio, psmi_addr, _MASKED_BIT_DISABLE(IDLE_MSG_DISABLE));
+
+ mutex_unlock(&d->eu_lock);
+ xe_force_wake_put(gt_to_fw(gt), fw_ref);
+
+ return ret;
+}
+
+static int xe_eudebug_vm_fsync(struct file *file, loff_t start, loff_t end, int datasync)
+{
+ struct vm_file *vmf = file->private_data;
+ struct xe_eudebug *d = vmf->debugger;
+ struct xe_gt *gt;
+ int gt_id;
+ int ret = -EINVAL;
+
+ eu_dbg(d, "vm_fsync: client_handle=%llu, vm_handle=%llu, flags=0x%llx, start=%llu, end=%llu datasync=%d\n",
+ vmf->client_id, vmf->vm_handle, vmf->flags, start, end, datasync);
+
+ for_each_gt(gt, d->xe, gt_id) {
+ struct xe_hw_engine *hwe;
+ enum xe_hw_engine_id id;
+
+ /* XXX: vm open per engine? */
+ for_each_hw_engine(hwe, gt, id) {
+ u64 timeout_us;
+
+ if (hwe->class != XE_ENGINE_CLASS_RENDER &&
+ hwe->class != XE_ENGINE_CLASS_COMPUTE)
+ continue;
+
+ timeout_us = div64_u64(vmf->timeout_ns, 1000ull);
+ ret = engine_rcu_flush(d, hwe, timeout_us);
+ if (ret)
+ break;
+ }
+ }
+
+ return ret;
+}
+
+static int xe_eudebug_vm_release(struct inode *inode, struct file *file)
+{
+ struct vm_file *vmf = file->private_data;
+ struct xe_eudebug *d = vmf->debugger;
+
+ eu_dbg(d, "vm_release: client_handle=%llu, vm_handle=%llu, flags=0x%llx",
+ vmf->client_id, vmf->vm_handle, vmf->flags);
+
+ xe_vm_put(vmf->vm);
+ xe_file_put(vmf->xef);
+ xe_eudebug_put(d);
+ drm_dev_put(&d->xe->drm);
+
+ kfree(vmf);
+
+ return 0;
+}
+
+static const struct file_operations vm_fops = {
+ .owner = THIS_MODULE,
+ .llseek = generic_file_llseek,
+ .read = xe_eudebug_vm_read,
+ .write = xe_eudebug_vm_write,
+ .fsync = xe_eudebug_vm_fsync,
+ .mmap = NULL,
+ .release = xe_eudebug_vm_release,
+};
+
+static long
+xe_eudebug_vm_open_ioctl(struct xe_eudebug *d, unsigned long arg)
+{
+ struct drm_xe_eudebug_vm_open param;
+ struct xe_device * const xe = d->xe;
+ struct vm_file *vmf = NULL;
+ struct xe_file *xef;
+ struct xe_vm *vm;
+ struct file *file;
+ long ret = 0;
+ int fd;
+
+ if (XE_IOCTL_DBG(xe, _IOC_SIZE(DRM_XE_EUDEBUG_IOCTL_VM_OPEN) != sizeof(param)))
+ return -EINVAL;
+
+ if (XE_IOCTL_DBG(xe, !(_IOC_DIR(DRM_XE_EUDEBUG_IOCTL_VM_OPEN) & _IOC_WRITE)))
+ return -EINVAL;
+
+ if (XE_IOCTL_DBG(xe, copy_from_user(¶m, (void __user *)arg, sizeof(param))))
+ return -EFAULT;
+
+ if (XE_IOCTL_DBG(xe, param.flags))
+ return -EINVAL;
+
+ if (XE_IOCTL_DBG(xe, xe_eudebug_detached(d)))
+ return -ENOTCONN;
+
+ xef = find_client_get(d, param.client_handle);
+ if (xef)
+ vm = find_vm_get(d, param.vm_handle);
+ else
+ vm = NULL;
+
+ if (XE_IOCTL_DBG(xe, !xef))
+ return -EINVAL;
+
+ if (XE_IOCTL_DBG(xe, !vm)) {
+ ret = -EINVAL;
+ goto out_file_put;
+ }
+
+ vmf = kzalloc(sizeof(*vmf), GFP_KERNEL);
+ if (XE_IOCTL_DBG(xe, !vmf)) {
+ ret = -ENOMEM;
+ goto out_vm_put;
+ }
+
+ fd = get_unused_fd_flags(O_CLOEXEC);
+ if (XE_IOCTL_DBG(xe, fd < 0)) {
+ ret = fd;
+ goto out_free;
+ }
+
+ kref_get(&d->ref);
+ vmf->debugger = d;
+ vmf->vm = vm;
+ vmf->xef = xef;
+ vmf->flags = param.flags;
+ vmf->client_id = param.client_handle;
+ vmf->vm_handle = param.vm_handle;
+ vmf->timeout_ns = param.timeout_ns;
+
+ file = anon_inode_getfile("[xe_eudebug.vm]", &vm_fops, vmf, O_RDWR);
+ if (IS_ERR(file)) {
+ ret = PTR_ERR(file);
+ XE_IOCTL_DBG(xe, ret);
+ file = NULL;
+ goto out_fd_put;
+ }
+
+ file->f_mode |= FMODE_PREAD | FMODE_PWRITE |
+ FMODE_READ | FMODE_WRITE | FMODE_LSEEK;
+
+ fd_install(fd, file);
+
+ eu_dbg(d, "vm_open: client_handle=%llu, handle=%llu, flags=0x%llx, fd=%d",
+ vmf->client_id, vmf->vm_handle, vmf->flags, fd);
+
+ XE_WARN_ON(ret);
+
+ drm_dev_get(&xe->drm);
+
+ return fd;
+
+out_fd_put:
+ put_unused_fd(fd);
+ xe_eudebug_put(d);
+out_free:
+ kfree(vmf);
+out_vm_put:
+ xe_vm_put(vm);
+out_file_put:
+ xe_file_put(xef);
+
+ XE_WARN_ON(ret >= 0);
+
+ return ret;
+}
diff --git a/include/uapi/drm/xe_drm_eudebug.h b/include/uapi/drm/xe_drm_eudebug.h
index b2f6038ccc59..9917280400d6 100644
--- a/include/uapi/drm/xe_drm_eudebug.h
+++ b/include/uapi/drm/xe_drm_eudebug.h
@@ -18,6 +18,7 @@ extern "C" {
#define DRM_XE_EUDEBUG_IOCTL_READ_EVENT _IO('j', 0x0)
#define DRM_XE_EUDEBUG_IOCTL_EU_CONTROL _IOWR('j', 0x2, struct drm_xe_eudebug_eu_control)
#define DRM_XE_EUDEBUG_IOCTL_ACK_EVENT _IOW('j', 0x4, struct drm_xe_eudebug_ack_event)
+#define DRM_XE_EUDEBUG_IOCTL_VM_OPEN _IOW('j', 0x1, struct drm_xe_eudebug_vm_open)
/* XXX: Document events to match their internal counterparts when moved to xe_drm.h */
struct drm_xe_eudebug_event {
@@ -170,6 +171,23 @@ struct drm_xe_eudebug_ack_event {
__u64 seqno;
};
+struct drm_xe_eudebug_vm_open {
+ /** @extensions: Pointer to the first extension struct, if any */
+ __u64 extensions;
+
+ /** @client_handle: id of client */
+ __u64 client_handle;
+
+ /** @vm_handle: id of vm */
+ __u64 vm_handle;
+
+ /** @flags: flags */
+ __u64 flags;
+
+ /** @timeout_ns: Timeout value in nanoseconds operations (fsync) */
+ __u64 timeout_ns;
+};
+
#if defined(__cplusplus)
}
#endif
--
2.46.1
^ permalink raw reply related [flat|nested] 28+ messages in thread* [RFC 12/19] drm/xe/eudebug: implement userptr_vma access
2024-10-21 9:58 [RFC 00/19] Support EU online debug on pagefault Gwan-gyeong Mun
` (10 preceding siblings ...)
2024-10-21 9:58 ` [RFC 11/19] drm/xe/eudebug: vm open/pread/pwrite Gwan-gyeong Mun
@ 2024-10-21 9:58 ` Gwan-gyeong Mun
2024-10-21 9:58 ` [RFC 13/19] drm/xe: Debug metadata create/destroy ioctls Gwan-gyeong Mun
` (13 subsequent siblings)
25 siblings, 0 replies; 28+ messages in thread
From: Gwan-gyeong Mun @ 2024-10-21 9:58 UTC (permalink / raw)
To: intel-xe
Cc: nirmoy.das, matthew.brost, stuart.summers, christoph.manszewski,
mika.kuoppala, dominik.grzegorzek, andrzej.hajda,
maciej.patelczyk
From: Andrzej Hajda <andrzej.hajda@intel.com>
Debugger needs to read/write program's vmas including userptr_vma.
Since hmm_range_fault is used to pin userptr vmas, it is possible
to map those vmas from debugger context.
v2: pin pages vs notifier, move to vm.c (Matthew)
Signed-off-by: Andrzej Hajda <andrzej.hajda@intel.com>
Signed-off-by: Maciej Patelczyk <maciej.patelczyk@intel.com>
Signed-off-by: Mika Kuoppala <mika.kuoppala@linux.intel.com>
Reviewed-by: Jonathan Cavitt <jonathan.cavitt@intel.com>
Signed-off-by: Gwan-gyeong Mun <gwan-gyeong.mun@intel.com>
---
drivers/gpu/drm/xe/xe_eudebug.c | 2 +-
drivers/gpu/drm/xe/xe_vm.c | 47 +++++++++++++++++++++++++++++++++
drivers/gpu/drm/xe/xe_vm.h | 3 +++
3 files changed, 51 insertions(+), 1 deletion(-)
diff --git a/drivers/gpu/drm/xe/xe_eudebug.c b/drivers/gpu/drm/xe/xe_eudebug.c
index 309358b575d6..9802347258d0 100644
--- a/drivers/gpu/drm/xe/xe_eudebug.c
+++ b/drivers/gpu/drm/xe/xe_eudebug.c
@@ -3024,7 +3024,7 @@ static int xe_eudebug_vma_access(struct xe_vma *vma, u64 offset,
return ret;
}
- return -EINVAL;
+ return xe_uvma_access(to_userptr_vma(vma), offset, buf, bytes, write);
}
static int xe_eudebug_vm_access(struct xe_vm *vm, u64 offset,
diff --git a/drivers/gpu/drm/xe/xe_vm.c b/drivers/gpu/drm/xe/xe_vm.c
index dad407840379..69fe582d6517 100644
--- a/drivers/gpu/drm/xe/xe_vm.c
+++ b/drivers/gpu/drm/xe/xe_vm.c
@@ -3417,3 +3417,50 @@ void xe_vm_snapshot_free(struct xe_vm_snapshot *snap)
}
kvfree(snap);
}
+
+int xe_uvma_access(struct xe_userptr_vma *uvma, u64 offset,
+ void *buf, u64 len, bool write)
+{
+ struct xe_vm *vm = xe_vma_vm(&uvma->vma);
+ struct xe_userptr *up = &uvma->userptr;
+ struct xe_res_cursor cur = {};
+ int cur_len, ret = 0;
+
+ while (true) {
+ down_read(&vm->userptr.notifier_lock);
+ if (!xe_vma_userptr_check_repin(uvma))
+ break;
+
+ spin_lock(&vm->userptr.invalidated_lock);
+ list_del_init(&uvma->userptr.invalidate_link);
+ spin_unlock(&vm->userptr.invalidated_lock);
+
+ up_read(&vm->userptr.notifier_lock);
+ ret = xe_vma_userptr_pin_pages(uvma);
+ if (ret)
+ return ret;
+ }
+
+ if (!up->sg) {
+ ret = -EINVAL;
+ goto out_unlock_notifier;
+ }
+
+ for (xe_res_first_sg(up->sg, offset, len, &cur); cur.remaining;
+ xe_res_next(&cur, cur_len)) {
+ void *ptr = kmap_local_page(sg_page(cur.sgl)) + cur.start;
+
+ cur_len = min(cur.size, cur.remaining);
+ if (write)
+ memcpy(ptr, buf, cur_len);
+ else
+ memcpy(buf, ptr, cur_len);
+ kunmap_local(ptr);
+ buf += cur_len;
+ }
+ ret = len;
+
+out_unlock_notifier:
+ up_read(&vm->userptr.notifier_lock);
+ return ret;
+}
diff --git a/drivers/gpu/drm/xe/xe_vm.h b/drivers/gpu/drm/xe/xe_vm.h
index c864dba35e1d..99b9a9b011de 100644
--- a/drivers/gpu/drm/xe/xe_vm.h
+++ b/drivers/gpu/drm/xe/xe_vm.h
@@ -281,3 +281,6 @@ struct xe_vm_snapshot *xe_vm_snapshot_capture(struct xe_vm *vm);
void xe_vm_snapshot_capture_delayed(struct xe_vm_snapshot *snap);
void xe_vm_snapshot_print(struct xe_vm_snapshot *snap, struct drm_printer *p);
void xe_vm_snapshot_free(struct xe_vm_snapshot *snap);
+
+int xe_uvma_access(struct xe_userptr_vma *uvma, u64 offset,
+ void *buf, u64 len, bool write);
--
2.46.1
^ permalink raw reply related [flat|nested] 28+ messages in thread* [RFC 13/19] drm/xe: Debug metadata create/destroy ioctls
2024-10-21 9:58 [RFC 00/19] Support EU online debug on pagefault Gwan-gyeong Mun
` (11 preceding siblings ...)
2024-10-21 9:58 ` [RFC 12/19] drm/xe/eudebug: implement userptr_vma access Gwan-gyeong Mun
@ 2024-10-21 9:58 ` Gwan-gyeong Mun
2024-10-21 9:58 ` [RFC 14/19] drm/xe: Attach debug metadata to vma Gwan-gyeong Mun
` (12 subsequent siblings)
25 siblings, 0 replies; 28+ messages in thread
From: Gwan-gyeong Mun @ 2024-10-21 9:58 UTC (permalink / raw)
To: intel-xe
Cc: nirmoy.das, matthew.brost, stuart.summers, christoph.manszewski,
mika.kuoppala, dominik.grzegorzek, andrzej.hajda,
maciej.patelczyk
From: Dominik Grzegorzek <dominik.grzegorzek@intel.com>
Ad a part of eu debug feature introduce debug metadata objects.
These are to be used to pass metadata between client and debugger,
by attaching them to vm_bind operations.
todo: WORK_IN_PROGRESS_* defines need to be reworded/refined when
the real usage and need is established by l0+gdb.
v2: - include uapi/drm/xe_drm.h
- metadata behind kconfig (Mika)
Signed-off-by: Dominik Grzegorzek <dominik.grzegorzek@intel.com>
Signed-off-by: Mika Kuoppala <mika.kuoppala@linux.intel.com>
Signed-off-by: Gwan-gyeong Mun <gwan-gyeong.mun@intel.com>
---
drivers/gpu/drm/xe/Makefile | 3 +-
drivers/gpu/drm/xe/xe_debug_metadata.c | 108 +++++++++++++++++++
drivers/gpu/drm/xe/xe_debug_metadata.h | 50 +++++++++
drivers/gpu/drm/xe/xe_debug_metadata_types.h | 28 +++++
drivers/gpu/drm/xe/xe_device.c | 5 +
drivers/gpu/drm/xe/xe_device.h | 2 +
drivers/gpu/drm/xe/xe_device_types.h | 7 ++
drivers/gpu/drm/xe/xe_eudebug.c | 13 +++
include/uapi/drm/xe_drm.h | 53 ++++++++-
9 files changed, 267 insertions(+), 2 deletions(-)
create mode 100644 drivers/gpu/drm/xe/xe_debug_metadata.c
create mode 100644 drivers/gpu/drm/xe/xe_debug_metadata.h
create mode 100644 drivers/gpu/drm/xe/xe_debug_metadata_types.h
diff --git a/drivers/gpu/drm/xe/Makefile b/drivers/gpu/drm/xe/Makefile
index c5f703d22ba4..155cd6e34362 100644
--- a/drivers/gpu/drm/xe/Makefile
+++ b/drivers/gpu/drm/xe/Makefile
@@ -115,7 +115,8 @@ xe-y += xe_bb.o \
xe_wa.o \
xe_wopcm.o
-xe-$(CONFIG_DRM_XE_EUDEBUG) += xe_eudebug.o
+xe-$(CONFIG_DRM_XE_EUDEBUG) += xe_eudebug.o \
+ xe_debug_metadata.o
xe-$(CONFIG_HMM_MIRROR) += xe_hmm.o
diff --git a/drivers/gpu/drm/xe/xe_debug_metadata.c b/drivers/gpu/drm/xe/xe_debug_metadata.c
new file mode 100644
index 000000000000..72a00b628475
--- /dev/null
+++ b/drivers/gpu/drm/xe/xe_debug_metadata.c
@@ -0,0 +1,108 @@
+// SPDX-License-Identifier: MIT
+/*
+ * Copyright © 2023 Intel Corporation
+ */
+#include "xe_debug_metadata.h"
+
+#include <drm/drm_device.h>
+#include <drm/drm_file.h>
+#include <uapi/drm/xe_drm.h>
+
+#include "xe_device.h"
+#include "xe_macros.h"
+
+static void xe_debug_metadata_release(struct kref *ref)
+{
+ struct xe_debug_metadata *mdata = container_of(ref, struct xe_debug_metadata, refcount);
+
+ kvfree(mdata->ptr);
+ kfree(mdata);
+}
+
+void xe_debug_metadata_put(struct xe_debug_metadata *mdata)
+{
+ kref_put(&mdata->refcount, xe_debug_metadata_release);
+}
+
+int xe_debug_metadata_create_ioctl(struct drm_device *dev,
+ void *data,
+ struct drm_file *file)
+{
+ struct xe_device *xe = to_xe_device(dev);
+ struct xe_file *xef = to_xe_file(file);
+ struct drm_xe_debug_metadata_create *args = data;
+ struct xe_debug_metadata *mdata;
+ int err;
+ u32 id;
+
+ if (XE_IOCTL_DBG(xe, args->extensions))
+ return -EINVAL;
+
+ if (XE_IOCTL_DBG(xe, args->type > DRM_XE_DEBUG_METADATA_PROGRAM_MODULE))
+ return -EINVAL;
+
+ if (XE_IOCTL_DBG(xe, !args->user_addr || !args->len))
+ return -EINVAL;
+
+ if (XE_IOCTL_DBG(xe, !access_ok(u64_to_user_ptr(args->user_addr), args->len)))
+ return -EFAULT;
+
+ mdata = kzalloc(sizeof(*mdata), GFP_KERNEL);
+ if (!mdata)
+ return -ENOMEM;
+
+ mdata->len = args->len;
+ mdata->type = args->type;
+
+ mdata->ptr = kvmalloc(mdata->len, GFP_KERNEL);
+ if (!mdata->ptr) {
+ kfree(mdata);
+ return -ENOMEM;
+ }
+ kref_init(&mdata->refcount);
+
+ err = copy_from_user(mdata->ptr, u64_to_user_ptr(args->user_addr), mdata->len);
+ if (err) {
+ err = -EFAULT;
+ goto put_mdata;
+ }
+
+ mutex_lock(&xef->eudebug.metadata.lock);
+ err = xa_alloc(&xef->eudebug.metadata.xa, &id, mdata, xa_limit_32b, GFP_KERNEL);
+ mutex_unlock(&xef->eudebug.metadata.lock);
+
+ args->metadata_id = id;
+ mdata->id = id;
+
+ if (err)
+ goto put_mdata;
+
+ return 0;
+
+put_mdata:
+ xe_debug_metadata_put(mdata);
+ return err;
+}
+
+int xe_debug_metadata_destroy_ioctl(struct drm_device *dev,
+ void *data,
+ struct drm_file *file)
+{
+ struct xe_device *xe = to_xe_device(dev);
+ struct xe_file *xef = to_xe_file(file);
+ struct drm_xe_debug_metadata_destroy * const args = data;
+ struct xe_debug_metadata *mdata;
+
+ if (XE_IOCTL_DBG(xe, args->extensions))
+ return -EINVAL;
+
+ mutex_lock(&xef->eudebug.metadata.lock);
+ mdata = xa_erase(&xef->eudebug.metadata.xa, args->metadata_id);
+ mutex_unlock(&xef->eudebug.metadata.lock);
+ if (XE_IOCTL_DBG(xe, !mdata))
+ return -ENOENT;
+
+ xe_debug_metadata_put(mdata);
+
+ return 0;
+}
diff --git a/drivers/gpu/drm/xe/xe_debug_metadata.h b/drivers/gpu/drm/xe/xe_debug_metadata.h
new file mode 100644
index 000000000000..3266c25e657e
--- /dev/null
+++ b/drivers/gpu/drm/xe/xe_debug_metadata.h
@@ -0,0 +1,50 @@
+/* SPDX-License-Identifier: MIT */
+/*
+ * Copyright © 2023 Intel Corporation
+ */
+
+#ifndef _XE_DEBUG_METADATA_H_
+#define _XE_DEBUG_METADATA_H_
+
+struct drm_device;
+struct drm_file;
+
+#if IS_ENABLED(CONFIG_DRM_XE_EUDEBUG)
+
+#include "xe_debug_metadata_types.h"
+
+void xe_debug_metadata_put(struct xe_debug_metadata *mdata);
+
+int xe_debug_metadata_create_ioctl(struct drm_device *dev,
+ void *data,
+ struct drm_file *file);
+
+int xe_debug_metadata_destroy_ioctl(struct drm_device *dev,
+ void *data,
+ struct drm_file *file);
+#else /* CONFIG_DRM_XE_EUDEBUG */
+
+#include <linux/errno.h>
+
+struct xe_debug_metadata;
+
+static inline void xe_debug_metadata_put(struct xe_debug_metadata *mdata) { }
+
+static inline int xe_debug_metadata_create_ioctl(struct drm_device *dev,
+ void *data,
+ struct drm_file *file)
+{
+ return -EOPNOTSUPP;
+}
+
+static inline int xe_debug_metadata_destroy_ioctl(struct drm_device *dev,
+ void *data,
+ struct drm_file *file)
+{
+ return -EOPNOTSUPP;
+}
+
+#endif /* CONFIG_DRM_XE_EUDEBUG */
+
+
+#endif
diff --git a/drivers/gpu/drm/xe/xe_debug_metadata_types.h b/drivers/gpu/drm/xe/xe_debug_metadata_types.h
new file mode 100644
index 000000000000..508f2fdbbc42
--- /dev/null
+++ b/drivers/gpu/drm/xe/xe_debug_metadata_types.h
@@ -0,0 +1,28 @@
+/* SPDX-License-Identifier: MIT */
+/*
+ * Copyright © 2023 Intel Corporation
+ */
+
+#ifndef _XE_DEBUG_METADATA_TYPES_H_
+#define _XE_DEBUG_METADATA_TYPES_H_
+
+#include <linux/kref.h>
+
+struct xe_debug_metadata {
+ /** @type: type of given metadata */
+ u64 type;
+
+ /** @ptr: copy of userptr, given as a metadata payload */
+ void *ptr;
+
+ /** @len: length, in bytes of the metadata */
+ u64 len;
+
+ /** @id */
+ u64 id;
+
+ /** @ref: reference count */
+ struct kref refcount;
+};
+
+#endif
diff --git a/drivers/gpu/drm/xe/xe_device.c b/drivers/gpu/drm/xe/xe_device.c
index 66d26ae3e11c..d125951e0f73 100644
--- a/drivers/gpu/drm/xe/xe_device.c
+++ b/drivers/gpu/drm/xe/xe_device.c
@@ -25,6 +25,7 @@
#include "xe_bo.h"
#include "xe_debugfs.h"
#include "xe_devcoredump.h"
+#include "xe_debug_metadata.h"
#include "xe_dma_buf.h"
#include "xe_drm_client.h"
#include "xe_drv.h"
@@ -204,6 +205,10 @@ static const struct drm_ioctl_desc xe_ioctls[] = {
DRM_RENDER_ALLOW),
DRM_IOCTL_DEF_DRV(XE_OBSERVATION, xe_observation_ioctl, DRM_RENDER_ALLOW),
DRM_IOCTL_DEF_DRV(XE_EUDEBUG_CONNECT, xe_eudebug_connect_ioctl, DRM_RENDER_ALLOW),
+ DRM_IOCTL_DEF_DRV(XE_DEBUG_METADATA_CREATE, xe_debug_metadata_create_ioctl,
+ DRM_RENDER_ALLOW),
+ DRM_IOCTL_DEF_DRV(XE_DEBUG_METADATA_DESTROY, xe_debug_metadata_destroy_ioctl,
+ DRM_RENDER_ALLOW),
};
static long xe_drm_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
diff --git a/drivers/gpu/drm/xe/xe_device.h b/drivers/gpu/drm/xe/xe_device.h
index b2fc85b1d26e..ce01e3fc9fdf 100644
--- a/drivers/gpu/drm/xe/xe_device.h
+++ b/drivers/gpu/drm/xe/xe_device.h
@@ -204,6 +204,8 @@ static inline int xe_eudebug_needs_lock(const unsigned int cmd)
case DRM_XE_EXEC_QUEUE_CREATE:
case DRM_XE_EXEC_QUEUE_DESTROY:
case DRM_XE_EUDEBUG_CONNECT:
+ case DRM_XE_DEBUG_METADATA_CREATE:
+ case DRM_XE_DEBUG_METADATA_DESTROY:
return 1;
}
diff --git a/drivers/gpu/drm/xe/xe_device_types.h b/drivers/gpu/drm/xe/xe_device_types.h
index 562cc8930533..40b0f61b64b8 100644
--- a/drivers/gpu/drm/xe/xe_device_types.h
+++ b/drivers/gpu/drm/xe/xe_device_types.h
@@ -671,6 +671,13 @@ struct xe_file {
struct {
/** @client_link: list entry in xe_device.clients.list */
struct list_head client_link;
+
+ struct {
+ /** @xa: xarray to store debug metadata */
+ struct xarray xa;
+ /** @lock: protects debug metadata xarray */
+ struct mutex lock;
+ } metadata;
} eudebug;
#endif
};
diff --git a/drivers/gpu/drm/xe/xe_eudebug.c b/drivers/gpu/drm/xe/xe_eudebug.c
index 9802347258d0..5cf33c624f30 100644
--- a/drivers/gpu/drm/xe/xe_eudebug.c
+++ b/drivers/gpu/drm/xe/xe_eudebug.c
@@ -21,6 +21,7 @@
#include "xe_assert.h"
#include "xe_bo.h"
#include "xe_device.h"
+#include "xe_debug_metadata.h"
#include "xe_eudebug.h"
#include "xe_eudebug_types.h"
#include "xe_exec_queue.h"
@@ -2133,6 +2134,8 @@ void xe_eudebug_file_open(struct xe_file *xef)
struct xe_eudebug *d;
INIT_LIST_HEAD(&xef->eudebug.client_link);
+ mutex_init(&xef->eudebug.metadata.lock);
+ xa_init_flags(&xef->eudebug.metadata.xa, XA_FLAGS_ALLOC1);
down_read(&xef->xe->eudebug.discovery_lock);
@@ -2150,12 +2153,22 @@ void xe_eudebug_file_open(struct xe_file *xef)
void xe_eudebug_file_close(struct xe_file *xef)
{
struct xe_eudebug *d;
+ unsigned long idx;
+ struct xe_debug_metadata *mdata;
down_read(&xef->xe->eudebug.discovery_lock);
d = xe_eudebug_get(xef);
if (d)
xe_eudebug_event_put(d, client_destroy_event(d, xef));
+ mutex_lock(&xef->eudebug.metadata.lock);
+ xa_for_each(&xef->eudebug.metadata.xa, idx, mdata)
+ xe_debug_metadata_put(mdata);
+ mutex_unlock(&xef->eudebug.metadata.lock);
+
+ xa_destroy(&xef->eudebug.metadata.xa);
+ mutex_destroy(&xef->eudebug.metadata.lock);
+
spin_lock(&xef->xe->clients.lock);
list_del_init(&xef->eudebug.client_link);
spin_unlock(&xef->xe->clients.lock);
diff --git a/include/uapi/drm/xe_drm.h b/include/uapi/drm/xe_drm.h
index de8c6669176a..023e0a336eea 100644
--- a/include/uapi/drm/xe_drm.h
+++ b/include/uapi/drm/xe_drm.h
@@ -103,7 +103,8 @@ extern "C" {
#define DRM_XE_WAIT_USER_FENCE 0x0a
#define DRM_XE_OBSERVATION 0x0b
#define DRM_XE_EUDEBUG_CONNECT 0x0c
-
+#define DRM_XE_DEBUG_METADATA_CREATE 0x0d
+#define DRM_XE_DEBUG_METADATA_DESTROY 0x0e
/* Must be kept compact -- no holes */
#define DRM_IOCTL_XE_DEVICE_QUERY DRM_IOWR(DRM_COMMAND_BASE + DRM_XE_DEVICE_QUERY, struct drm_xe_device_query)
@@ -119,6 +120,8 @@ extern "C" {
#define DRM_IOCTL_XE_WAIT_USER_FENCE DRM_IOWR(DRM_COMMAND_BASE + DRM_XE_WAIT_USER_FENCE, struct drm_xe_wait_user_fence)
#define DRM_IOCTL_XE_OBSERVATION DRM_IOW(DRM_COMMAND_BASE + DRM_XE_OBSERVATION, struct drm_xe_observation_param)
#define DRM_IOCTL_XE_EUDEBUG_CONNECT DRM_IOWR(DRM_COMMAND_BASE + DRM_XE_EUDEBUG_CONNECT, struct drm_xe_eudebug_connect)
+#define DRM_IOCTL_XE_DEBUG_METADATA_CREATE DRM_IOWR(DRM_COMMAND_BASE + DRM_XE_DEBUG_METADATA_CREATE, struct drm_xe_debug_metadata_create)
+#define DRM_IOCTL_XE_DEBUG_METADATA_DESTROY DRM_IOW(DRM_COMMAND_BASE + DRM_XE_DEBUG_METADATA_DESTROY, struct drm_xe_debug_metadata_destroy)
/**
* DOC: Xe IOCTL Extensions
@@ -1716,6 +1719,54 @@ struct drm_xe_eudebug_connect {
__u32 version; /* output: current ABI (ioctl / events) version */
};
+/*
+ * struct drm_xe_debug_metadata_create - Create debug metadata
+ *
+ * Add a region of user memory to be marked as debug metadata.
+ * When the debugger attaches, the metadata regions will be delivered
+ * for debugger. Debugger can then map these regions to help decode
+ * the program state.
+ *
+ * Returns handle to created metadata entry.
+ */
+struct drm_xe_debug_metadata_create {
+ /** @extensions: Pointer to the first extension struct, if any */
+ __u64 extensions;
+
+#define DRM_XE_DEBUG_METADATA_ELF_BINARY 0
+#define DRM_XE_DEBUG_METADATA_PROGRAM_MODULE 1
+#define WORK_IN_PROGRESS_DRM_XE_DEBUG_METADATA_MODULE_AREA 2
+#define WORK_IN_PROGRESS_DRM_XE_DEBUG_METADATA_SBA_AREA 3
+#define WORK_IN_PROGRESS_DRM_XE_DEBUG_METADATA_SIP_AREA 4
+#define WORK_IN_PROGRESS_DRM_XE_DEBUG_METADATA_NUM (1 + \
+ WORK_IN_PROGRESS_DRM_XE_DEBUG_METADATA_SIP_AREA)
+
+ /** @type: Type of metadata */
+ __u64 type;
+
+ /** @user_addr: pointer to start of the metadata */
+ __u64 user_addr;
+
+ /** @len: length, in bytes of the medata */
+ __u64 len;
+
+ /** @metadata_id: created metadata handle (out) */
+ __u32 metadata_id;
+};
+
+/**
+ * struct drm_xe_debug_metadata_destroy - Destroy debug metadata
+ *
+ * Destroy debug metadata.
+ */
+struct drm_xe_debug_metadata_destroy {
+ /** @extensions: Pointer to the first extension struct, if any */
+ __u64 extensions;
+
+ /** @metadata_id: metadata handle to destroy */
+ __u32 metadata_id;
+};
+
#include "xe_drm_eudebug.h"
#if defined(__cplusplus)
--
2.46.1
^ permalink raw reply related [flat|nested] 28+ messages in thread* [RFC 14/19] drm/xe: Attach debug metadata to vma
2024-10-21 9:58 [RFC 00/19] Support EU online debug on pagefault Gwan-gyeong Mun
` (12 preceding siblings ...)
2024-10-21 9:58 ` [RFC 13/19] drm/xe: Debug metadata create/destroy ioctls Gwan-gyeong Mun
@ 2024-10-21 9:58 ` Gwan-gyeong Mun
2024-10-21 9:58 ` [RFC 15/19] drm/xe/eudebug: Add debug metadata support for xe_eudebug Gwan-gyeong Mun
` (11 subsequent siblings)
25 siblings, 0 replies; 28+ messages in thread
From: Gwan-gyeong Mun @ 2024-10-21 9:58 UTC (permalink / raw)
To: intel-xe
Cc: nirmoy.das, matthew.brost, stuart.summers, christoph.manszewski,
mika.kuoppala, dominik.grzegorzek, andrzej.hajda,
maciej.patelczyk
From: Dominik Grzegorzek <dominik.grzegorzek@intel.com>
Introduces a vm_bind_op extension, enabling users to attach metadata objects
to each [OP_MAP|OP_MAP_USERPTR] operation. This interface will be utilized
by the EU debugger to relay information about the contents of specified
VMAs from the debugee to the debugger process.
v2: move vma metadata handling behind Kconfig (Mika)
Signed-off-by: Dominik Grzegorzek <dominik.grzegorzek@intel.com>
Signed-off-by: Maciej Patelczyk <maciej.patelczyk@intel.com>
Signed-off-by: Mika Kuoppala <mika.kuoppala@linux.intel.com>
Signed-off-by: Gwan-gyeong Mun <gwan-gyeong.mun@intel.com>
---
drivers/gpu/drm/xe/xe_debug_metadata.c | 120 +++++++++++++++++++++++++
drivers/gpu/drm/xe/xe_debug_metadata.h | 48 ++++++++++
drivers/gpu/drm/xe/xe_vm.c | 99 +++++++++++++++++++-
drivers/gpu/drm/xe/xe_vm_types.h | 27 ++++++
include/uapi/drm/xe_drm.h | 19 ++++
5 files changed, 309 insertions(+), 4 deletions(-)
diff --git a/drivers/gpu/drm/xe/xe_debug_metadata.c b/drivers/gpu/drm/xe/xe_debug_metadata.c
index 72a00b628475..303640f8ba1f 100644
--- a/drivers/gpu/drm/xe/xe_debug_metadata.c
+++ b/drivers/gpu/drm/xe/xe_debug_metadata.c
@@ -10,6 +10,113 @@
#include "xe_device.h"
#include "xe_macros.h"
+#include "xe_vm.h"
+
+void xe_eudebug_free_vma_metadata(struct xe_eudebug_vma_metadata *mdata)
+{
+ struct xe_vma_debug_metadata *vmad, *tmp;
+
+ list_for_each_entry_safe(vmad, tmp, &mdata->list, link) {
+ list_del(&vmad->link);
+ kfree(vmad);
+ }
+}
+
+static struct xe_vma_debug_metadata *
+vma_new_debug_metadata(u32 metadata_id, u64 cookie)
+{
+ struct xe_vma_debug_metadata *vmad;
+
+ vmad = kzalloc(sizeof(*vmad), GFP_KERNEL);
+ if (!vmad)
+ return ERR_PTR(-ENOMEM);
+
+ INIT_LIST_HEAD(&vmad->link);
+
+ vmad->metadata_id = metadata_id;
+ vmad->cookie = cookie;
+
+ return vmad;
+}
+
+int xe_eudebug_copy_vma_metadata(struct xe_eudebug_vma_metadata *from,
+ struct xe_eudebug_vma_metadata *to)
+{
+ struct xe_vma_debug_metadata *vmad, *vma;
+
+ list_for_each_entry(vmad, &from->list, link) {
+ vma = vma_new_debug_metadata(vmad->metadata_id, vmad->cookie);
+ if (IS_ERR(vma))
+ return PTR_ERR(vma);
+
+ list_add_tail(&vmad->link, &to->list);
+ }
+
+ return 0;
+}
+
+static int vma_new_debug_metadata_op(struct xe_vma_op *op,
+ u32 metadata_id, u64 cookie,
+ u64 flags)
+{
+ struct xe_vma_debug_metadata *vmad;
+
+ vmad = vma_new_debug_metadata(metadata_id, cookie);
+ if (IS_ERR(vmad))
+ return PTR_ERR(vmad);
+
+ list_add_tail(&vmad->link, &op->map.eudebug.metadata.list);
+
+ return 0;
+}
+
+int vm_bind_op_ext_attach_debug(struct xe_device *xe,
+ struct xe_file *xef,
+ struct drm_gpuva_ops *ops,
+ u32 operation, u64 extension)
+{
+ u64 __user *address = u64_to_user_ptr(extension);
+ struct drm_xe_vm_bind_op_ext_attach_debug ext;
+ struct xe_debug_metadata *mdata;
+ struct drm_gpuva_op *__op;
+ int err;
+
+ err = __copy_from_user(&ext, address, sizeof(ext));
+ if (XE_IOCTL_DBG(xe, err))
+ return -EFAULT;
+
+ if (XE_IOCTL_DBG(xe,
+ operation != DRM_XE_VM_BIND_OP_MAP_USERPTR &&
+ operation != DRM_XE_VM_BIND_OP_MAP))
+ return -EINVAL;
+
+ if (XE_IOCTL_DBG(xe, ext.flags))
+ return -EINVAL;
+
+ mdata = xe_debug_metadata_get(xef, (u32)ext.metadata_id);
+ if (XE_IOCTL_DBG(xe, !mdata))
+ return -ENOENT;
+
+ /* care about metadata existence only on the time of attach */
+ xe_debug_metadata_put(mdata);
+
+ if (!ops)
+ return 0;
+
+ drm_gpuva_for_each_op(__op, ops) {
+ struct xe_vma_op *op = gpuva_op_to_vma_op(__op);
+
+ if (op->base.op == DRM_GPUVA_OP_MAP) {
+ err = vma_new_debug_metadata_op(op,
+ ext.metadata_id,
+ ext.cookie,
+ ext.flags);
+ if (err)
+ return err;
+ }
+ }
+ return 0;
+}
static void xe_debug_metadata_release(struct kref *ref)
{
@@ -24,6 +131,19 @@ void xe_debug_metadata_put(struct xe_debug_metadata *mdata)
kref_put(&mdata->refcount, xe_debug_metadata_release);
}
+struct xe_debug_metadata *xe_debug_metadata_get(struct xe_file *xef, u32 id)
+{
+ struct xe_debug_metadata *mdata;
+
+ mutex_lock(&xef->eudebug.metadata.lock);
+ mdata = xa_load(&xef->eudebug.metadata.xa, id);
+ if (mdata)
+ kref_get(&mdata->refcount);
+ mutex_unlock(&xef->eudebug.metadata.lock);
+
+ return mdata;
+}
+
int xe_debug_metadata_create_ioctl(struct drm_device *dev,
void *data,
struct drm_file *file)
diff --git a/drivers/gpu/drm/xe/xe_debug_metadata.h b/drivers/gpu/drm/xe/xe_debug_metadata.h
index 3266c25e657e..13b763ee06e1 100644
--- a/drivers/gpu/drm/xe/xe_debug_metadata.h
+++ b/drivers/gpu/drm/xe/xe_debug_metadata.h
@@ -6,13 +6,18 @@
#ifndef _XE_DEBUG_METADATA_H_
#define _XE_DEBUG_METADATA_H_
+#include <linux/types.h>
+
struct drm_device;
struct drm_file;
+struct xe_file;
#if IS_ENABLED(CONFIG_DRM_XE_EUDEBUG)
#include "xe_debug_metadata_types.h"
+#include "xe_vm_types.h"
+struct xe_debug_metadata *xe_debug_metadata_get(struct xe_file *xef, u32 id);
void xe_debug_metadata_put(struct xe_debug_metadata *mdata);
int xe_debug_metadata_create_ioctl(struct drm_device *dev,
@@ -22,12 +27,32 @@ int xe_debug_metadata_create_ioctl(struct drm_device *dev,
int xe_debug_metadata_destroy_ioctl(struct drm_device *dev,
void *data,
struct drm_file *file);
+
+static inline void xe_eudebug_move_vma_metadata(struct xe_eudebug_vma_metadata *from,
+ struct xe_eudebug_vma_metadata *to)
+{
+ list_splice_tail_init(&from->list, &to->list);
+}
+
+int xe_eudebug_copy_vma_metadata(struct xe_eudebug_vma_metadata *from,
+ struct xe_eudebug_vma_metadata *to);
+void xe_eudebug_free_vma_metadata(struct xe_eudebug_vma_metadata *mdata);
+
+int vm_bind_op_ext_attach_debug(struct xe_device *xe,
+ struct xe_file *xef,
+ struct drm_gpuva_ops *ops,
+ u32 operation, u64 extension);
+
#else /* CONFIG_DRM_XE_EUDEBUG */
#include <linux/errno.h>
struct xe_debug_metadata;
+struct xe_device;
+struct xe_eudebug_vma_metadata;
+struct drm_gpuva_ops;
+static inline struct xe_debug_metadata *xe_debug_metadata_get(struct xe_file *xef, u32 id) { return NULL; }
static inline void xe_debug_metadata_put(struct xe_debug_metadata *mdata) { }
static inline int xe_debug_metadata_create_ioctl(struct drm_device *dev,
@@ -44,6 +69,29 @@ static inline int xe_debug_metadata_destroy_ioctl(struct drm_device *dev,
return -EOPNOTSUPP;
}
+static inline void xe_eudebug_move_vma_metadata(struct xe_eudebug_vma_metadata *from,
+ struct xe_eudebug_vma_metadata *to)
+{
+}
+
+static inline int xe_eudebug_copy_vma_metadata(struct xe_eudebug_vma_metadata *from,
+ struct xe_eudebug_vma_metadata *to)
+{
+ return 0;
+}
+
+static inline void xe_eudebug_free_vma_metadata(struct xe_eudebug_vma_metadata *mdata)
+{
+}
+
+static inline int vm_bind_op_ext_attach_debug(struct xe_device *xe,
+ struct xe_file *xef,
+ struct drm_gpuva_ops *ops,
+ u32 operation, u64 extension)
+{
+ return -EINVAL;
+}
+
#endif /* CONFIG_DRM_XE_EUDEBUG */
diff --git a/drivers/gpu/drm/xe/xe_vm.c b/drivers/gpu/drm/xe/xe_vm.c
index 69fe582d6517..587747b1b64c 100644
--- a/drivers/gpu/drm/xe/xe_vm.c
+++ b/drivers/gpu/drm/xe/xe_vm.c
@@ -24,6 +24,7 @@
#include "regs/xe_gtt_defs.h"
#include "xe_assert.h"
#include "xe_bo.h"
+#include "xe_debug_metadata.h"
#include "xe_device.h"
#include "xe_drm_client.h"
#include "xe_eudebug.h"
@@ -944,6 +945,9 @@ static struct xe_vma *xe_vma_create(struct xe_vm *vm,
vma->gpuva.gem.obj = &bo->ttm.base;
}
+#if IS_ENABLED(CONFIG_DRM_XE_EUDEBUG)
+ INIT_LIST_HEAD(&vma->eudebug.metadata.list);
+#endif
INIT_LIST_HEAD(&vma->combined_links.rebind);
INIT_LIST_HEAD(&vma->gpuva.gem.entry);
@@ -1036,6 +1040,7 @@ static void xe_vma_destroy_late(struct xe_vma *vma)
xe_bo_put(xe_vma_bo(vma));
}
+ xe_eudebug_free_vma_metadata(&vma->eudebug.metadata);
xe_vma_free(vma);
}
@@ -1978,6 +1983,9 @@ vm_bind_ioctl_ops_create(struct xe_vm *vm, struct xe_bo *bo,
op->map.is_null = flags & DRM_XE_VM_BIND_FLAG_NULL;
op->map.dumpable = flags & DRM_XE_VM_BIND_FLAG_DUMPABLE;
op->map.pat_index = pat_index;
+#if IS_ENABLED(CONFIG_DRM_XE_EUDEBUG)
+ INIT_LIST_HEAD(&op->map.eudebug.metadata.list);
+#endif
} else if (__op->op == DRM_GPUVA_OP_PREFETCH) {
op->prefetch.region = prefetch_region;
}
@@ -2168,11 +2176,13 @@ static int vm_bind_ioctl_ops_parse(struct xe_vm *vm, struct drm_gpuva_ops *ops,
flags |= op->map.dumpable ?
VMA_CREATE_FLAG_DUMPABLE : 0;
- vma = new_vma(vm, &op->base.map, op->map.pat_index,
- flags);
+ vma = new_vma(vm, &op->base.map, op->map.pat_index, flags);
if (IS_ERR(vma))
return PTR_ERR(vma);
+ xe_eudebug_move_vma_metadata(&op->map.eudebug.metadata,
+ &vma->eudebug.metadata);
+
op->map.vma = vma;
if (op->map.immediate || !xe_vm_in_fault_mode(vm))
xe_vma_ops_incr_pt_update_ops(vops,
@@ -2203,6 +2213,9 @@ static int vm_bind_ioctl_ops_parse(struct xe_vm *vm, struct drm_gpuva_ops *ops,
if (IS_ERR(vma))
return PTR_ERR(vma);
+ xe_eudebug_move_vma_metadata(&old->eudebug.metadata,
+ &vma->eudebug.metadata);
+
op->remap.prev = vma;
/*
@@ -2242,6 +2255,16 @@ static int vm_bind_ioctl_ops_parse(struct xe_vm *vm, struct drm_gpuva_ops *ops,
if (IS_ERR(vma))
return PTR_ERR(vma);
+ if (op->base.remap.prev) {
+ err = xe_eudebug_copy_vma_metadata(&op->remap.prev->eudebug.metadata,
+ &vma->eudebug.metadata);
+ if (err)
+ return err;
+ } else {
+ xe_eudebug_move_vma_metadata(&old->eudebug.metadata,
+ &vma->eudebug.metadata);
+ }
+
op->remap.next = vma;
/*
@@ -2292,6 +2315,7 @@ static void xe_vma_op_unwind(struct xe_vm *vm, struct xe_vma_op *op,
switch (op->base.op) {
case DRM_GPUVA_OP_MAP:
if (op->map.vma) {
+ xe_eudebug_free_vma_metadata(&op->map.eudebug.metadata);
prep_vma_destroy(vm, op->map.vma, post_commit);
xe_vma_destroy_unlocked(op->map.vma);
}
@@ -2530,6 +2554,58 @@ static int vm_ops_setup_tile_args(struct xe_vm *vm, struct xe_vma_ops *vops)
}
return number_tiles;
+};
+
+typedef int (*xe_vm_bind_op_user_extension_fn)(struct xe_device *xe,
+ struct xe_file *xef,
+ struct drm_gpuva_ops *ops,
+ u32 operation, u64 extension);
+
+static const xe_vm_bind_op_user_extension_fn vm_bind_op_extension_funcs[] = {
+ [XE_VM_BIND_OP_EXTENSIONS_ATTACH_DEBUG] = vm_bind_op_ext_attach_debug,
+};
+
+#define MAX_USER_EXTENSIONS 16
+static int vm_bind_op_user_extensions(struct xe_device *xe,
+ struct xe_file *xef,
+ struct drm_gpuva_ops *ops,
+ u32 operation,
+ u64 extensions, int ext_number)
+{
+ u64 __user *address = u64_to_user_ptr(extensions);
+ struct drm_xe_user_extension ext;
+ int err;
+
+ if (XE_IOCTL_DBG(xe, ext_number >= MAX_USER_EXTENSIONS))
+ return -E2BIG;
+
+ err = __copy_from_user(&ext, address, sizeof(ext));
+ if (XE_IOCTL_DBG(xe, err))
+ return -EFAULT;
+
+ if (XE_IOCTL_DBG(xe, ext.pad) ||
+ XE_IOCTL_DBG(xe, ext.name >=
+ ARRAY_SIZE(vm_bind_op_extension_funcs)))
+ return -EINVAL;
+
+ err = vm_bind_op_extension_funcs[ext.name](xe, xef, ops,
+ operation, extensions);
+ if (XE_IOCTL_DBG(xe, err))
+ return err;
+
+ if (ext.next_extension)
+ return vm_bind_op_user_extensions(xe, xef, ops,
+ operation, ext.next_extension,
+ ++ext_number);
+
+ return 0;
+}
+
+static int vm_bind_op_user_extensions_check(struct xe_device *xe,
+ struct xe_file *xef,
+ u32 operation, u64 extensions)
+{
+ return vm_bind_op_user_extensions(xe, xef, NULL, operation, extensions, 0);
}
static struct dma_fence *ops_execute(struct xe_vm *vm,
@@ -2726,6 +2802,7 @@ static int vm_bind_ioctl_ops_execute(struct xe_vm *vm,
#define ALL_DRM_XE_SYNCS_FLAGS (DRM_XE_SYNCS_FLAG_WAIT_FOR_OP)
static int vm_bind_ioctl_check_args(struct xe_device *xe,
+ struct xe_file *xef,
struct drm_xe_vm_bind *args,
struct drm_xe_vm_bind_op **bind_ops)
{
@@ -2769,6 +2846,7 @@ static int vm_bind_ioctl_check_args(struct xe_device *xe,
u64 obj_offset = (*bind_ops)[i].obj_offset;
u32 prefetch_region = (*bind_ops)[i].prefetch_mem_region_instance;
bool is_null = flags & DRM_XE_VM_BIND_FLAG_NULL;
+ u64 extensions = (*bind_ops)[i].extensions;
u16 pat_index = (*bind_ops)[i].pat_index;
u16 coh_mode;
@@ -2829,6 +2907,13 @@ static int vm_bind_ioctl_check_args(struct xe_device *xe,
err = -EINVAL;
goto free_bind_ops;
}
+
+ if (extensions) {
+ err = vm_bind_op_user_extensions_check(xe, xef, op, extensions);
+ if (err)
+ goto free_bind_ops;
+ }
+
}
return 0;
@@ -2940,7 +3025,7 @@ int xe_vm_bind_ioctl(struct drm_device *dev, void *data, struct drm_file *file)
int err;
int i;
- err = vm_bind_ioctl_check_args(xe, args, &bind_ops);
+ err = vm_bind_ioctl_check_args(xe, xef, args, &bind_ops);
if (err)
return err;
@@ -3067,11 +3152,17 @@ int xe_vm_bind_ioctl(struct drm_device *dev, void *data, struct drm_file *file)
u64 obj_offset = bind_ops[i].obj_offset;
u32 prefetch_region = bind_ops[i].prefetch_mem_region_instance;
u16 pat_index = bind_ops[i].pat_index;
+ u64 extensions = bind_ops[i].extensions;
ops[i] = vm_bind_ioctl_ops_create(vm, bos[i], obj_offset,
addr, range, op, flags,
prefetch_region, pat_index);
- if (IS_ERR(ops[i])) {
+ if (!IS_ERR(ops[i]) && extensions) {
+ err = vm_bind_op_user_extensions(xe, xef, ops[i],
+ op, extensions, 0);
+ if (err)
+ goto unwind_ops;
+ } else if (IS_ERR(ops[i])) {
err = PTR_ERR(ops[i]);
ops[i] = NULL;
goto unwind_ops;
diff --git a/drivers/gpu/drm/xe/xe_vm_types.h b/drivers/gpu/drm/xe/xe_vm_types.h
index 557b047ebdd7..1c5776194e54 100644
--- a/drivers/gpu/drm/xe/xe_vm_types.h
+++ b/drivers/gpu/drm/xe/xe_vm_types.h
@@ -70,6 +70,14 @@ struct xe_userptr {
#endif
};
+#if IS_ENABLED(CONFIG_DRM_XE_EUDEBUG)
+struct xe_eudebug_vma_metadata {
+ struct list_head list;
+};
+#else
+struct xe_eudebug_vma_metadata { };
+#endif
+
struct xe_vma {
/** @gpuva: Base GPUVA object */
struct drm_gpuva gpuva;
@@ -121,6 +129,11 @@ struct xe_vma {
* Needs to be signalled before UNMAP can be processed.
*/
struct xe_user_fence *ufence;
+
+ struct {
+ /** @metadata: List of vma debug metadata */
+ struct xe_eudebug_vma_metadata metadata;
+ } eudebug;
};
/**
@@ -311,6 +324,10 @@ struct xe_vma_op_map {
bool dumpable;
/** @pat_index: The pat index to use for this operation. */
u16 pat_index;
+ struct {
+ /** @vma_metadata: List of vma debug metadata */
+ struct xe_eudebug_vma_metadata metadata;
+ } eudebug;
};
/** struct xe_vma_op_remap - VMA remap operation */
@@ -388,4 +405,14 @@ struct xe_vma_ops {
#endif
};
+struct xe_vma_debug_metadata {
+ /** @debug.metadata: id of attached xe_debug_metadata */
+ u32 metadata_id;
+ /** @debug.cookie: user defined cookie */
+ u64 cookie;
+
+ /** @link: list of metadata attached to vma */
+ struct list_head link;
+};
+
#endif
diff --git a/include/uapi/drm/xe_drm.h b/include/uapi/drm/xe_drm.h
index 023e0a336eea..b7d4e6f062f0 100644
--- a/include/uapi/drm/xe_drm.h
+++ b/include/uapi/drm/xe_drm.h
@@ -888,6 +888,23 @@ struct drm_xe_vm_destroy {
__u64 reserved[2];
};
+struct drm_xe_vm_bind_op_ext_attach_debug {
+ /** @base: base user extension */
+ struct drm_xe_user_extension base;
+
+ /** @id: Debug object id from create metadata */
+ __u64 metadata_id;
+
+ /** @flags: Flags */
+ __u64 flags;
+
+ /** @cookie: Cookie */
+ __u64 cookie;
+
+ /** @reserved: Reserved */
+ __u64 reserved;
+};
+
/**
* struct drm_xe_vm_bind_op - run bind operations
*
@@ -912,7 +929,9 @@ struct drm_xe_vm_destroy {
* handle MBZ, and the BO offset MBZ. This flag is intended to
* implement VK sparse bindings.
*/
+
struct drm_xe_vm_bind_op {
+#define XE_VM_BIND_OP_EXTENSIONS_ATTACH_DEBUG 0
/** @extensions: Pointer to the first extension struct, if any */
__u64 extensions;
--
2.46.1
^ permalink raw reply related [flat|nested] 28+ messages in thread* [RFC 15/19] drm/xe/eudebug: Add debug metadata support for xe_eudebug
2024-10-21 9:58 [RFC 00/19] Support EU online debug on pagefault Gwan-gyeong Mun
` (13 preceding siblings ...)
2024-10-21 9:58 ` [RFC 14/19] drm/xe: Attach debug metadata to vma Gwan-gyeong Mun
@ 2024-10-21 9:58 ` Gwan-gyeong Mun
2024-10-21 9:58 ` [RFC 16/19] drm/xe/eudebug: Implement vm_bind_op discovery Gwan-gyeong Mun
` (10 subsequent siblings)
25 siblings, 0 replies; 28+ messages in thread
From: Gwan-gyeong Mun @ 2024-10-21 9:58 UTC (permalink / raw)
To: intel-xe
Cc: nirmoy.das, matthew.brost, stuart.summers, christoph.manszewski,
mika.kuoppala, dominik.grzegorzek, andrzej.hajda,
maciej.patelczyk
From: Dominik Grzegorzek <dominik.grzegorzek@intel.com>
Reflect debug metadata resource creation/destroy as events passed to the
debugger. Introduce ioctl allowing to read metadata content on demand.
Each VMA can have multiple metadata attached and it is passed from user
on BIND or it's copied on internal remap.
Xe EU Debugger on VM BIND will inform about VMA metadata attachements
during bind IOCTL sending proper OP event.
v2: - checkpatch (Maciej, Tilak)
- struct alignment (Matthew)
- Kconfig (Mika)
Signed-off-by: Dominik Grzegorzek <dominik.grzegorzek@intel.com>
Signed-off-by: Maciej Patelczyk <maciej.patelczyk@intel.com>
Signed-off-by: Mika Kuoppala <mika.kuoppala@linux.intel.com>
Signed-off-by: Gwan-gyeong Mun <gwan-gyeong.mun@intel.com>
---
drivers/gpu/drm/xe/xe_debug_metadata.c | 7 +-
drivers/gpu/drm/xe/xe_eudebug.c | 328 ++++++++++++++++++++++++-
drivers/gpu/drm/xe/xe_eudebug.h | 13 +-
drivers/gpu/drm/xe/xe_eudebug_types.h | 27 +-
drivers/gpu/drm/xe/xe_vm.c | 2 +-
include/uapi/drm/xe_drm_eudebug.h | 30 +++
6 files changed, 396 insertions(+), 11 deletions(-)
diff --git a/drivers/gpu/drm/xe/xe_debug_metadata.c b/drivers/gpu/drm/xe/xe_debug_metadata.c
index 303640f8ba1f..d02ec99f7ca1 100644
--- a/drivers/gpu/drm/xe/xe_debug_metadata.c
+++ b/drivers/gpu/drm/xe/xe_debug_metadata.c
@@ -9,6 +9,7 @@
#include <uapi/drm/xe_drm.h>
#include "xe_device.h"
+#include "xe_eudebug.h"
#include "xe_macros.h"
#include "xe_vm.h"
@@ -158,7 +159,7 @@ int xe_debug_metadata_create_ioctl(struct drm_device *dev,
if (XE_IOCTL_DBG(xe, args->extensions))
return -EINVAL;
- if (XE_IOCTL_DBG(xe, args->type > DRM_XE_DEBUG_METADATA_PROGRAM_MODULE))
+ if (XE_IOCTL_DBG(xe, args->type >= WORK_IN_PROGRESS_DRM_XE_DEBUG_METADATA_NUM))
return -EINVAL;
if (XE_IOCTL_DBG(xe, !args->user_addr || !args->len))
@@ -197,6 +198,8 @@ int xe_debug_metadata_create_ioctl(struct drm_device *dev,
if (err)
goto put_mdata;
+ xe_eudebug_debug_metadata_create(xef, mdata);
+
return 0;
put_mdata:
@@ -222,6 +225,8 @@ int xe_debug_metadata_destroy_ioctl(struct drm_device *dev,
if (XE_IOCTL_DBG(xe, !mdata))
return -ENOENT;
+ xe_eudebug_debug_metadata_destroy(xef, mdata);
+
xe_debug_metadata_put(mdata);
return 0;
diff --git a/drivers/gpu/drm/xe/xe_eudebug.c b/drivers/gpu/drm/xe/xe_eudebug.c
index 5cf33c624f30..35ab65ef9c80 100644
--- a/drivers/gpu/drm/xe/xe_eudebug.c
+++ b/drivers/gpu/drm/xe/xe_eudebug.c
@@ -20,15 +20,18 @@
#include "xe_assert.h"
#include "xe_bo.h"
+#include "xe_debug_metadata.h"
#include "xe_device.h"
#include "xe_debug_metadata.h"
#include "xe_eudebug.h"
#include "xe_eudebug_types.h"
#include "xe_exec_queue.h"
+#include "xe_exec_queue_types.h"
#include "xe_force_wake.h"
#include "xe_gt.h"
#include "xe_gt_debug.h"
#include "xe_gt_mcr.h"
+#include "xe_guc_exec_queue_types.h"
#include "xe_hw_engine.h"
#include "xe_lrc.h"
#include "xe_macros.h"
@@ -940,7 +943,7 @@ static long xe_eudebug_read_event(struct xe_eudebug *d,
u64_to_user_ptr(arg);
struct drm_xe_eudebug_event user_event;
struct xe_eudebug_event *event;
- const unsigned int max_event = DRM_XE_EUDEBUG_EVENT_VM_BIND_UFENCE;
+ const unsigned int max_event = DRM_XE_EUDEBUG_EVENT_VM_BIND_OP_METADATA;
long ret = 0;
if (XE_IOCTL_DBG(xe, copy_from_user(&user_event, user_orig, sizeof(user_event))))
@@ -1224,6 +1227,90 @@ static long xe_eudebug_eu_control(struct xe_eudebug *d, const u64 arg)
return ret;
}
+static struct xe_debug_metadata *find_metadata_get(struct xe_eudebug *d,
+ u32 id)
+{
+ struct xe_debug_metadata *m;
+
+ mutex_lock(&d->res->lock);
+ m = find_resource__unlocked(d->res, XE_EUDEBUG_RES_TYPE_METADATA, id);
+ if (m)
+ kref_get(&m->refcount);
+ mutex_unlock(&d->res->lock);
+
+ return m;
+}
+
+static long xe_eudebug_read_metadata(struct xe_eudebug *d,
+ unsigned int cmd,
+ const u64 arg)
+{
+ struct drm_xe_eudebug_read_metadata user_arg;
+ struct xe_debug_metadata *mdata;
+ struct xe_file *xef;
+ struct xe_device *xe = d->xe;
+ long ret = 0;
+
+ if (XE_IOCTL_DBG(xe, !(_IOC_DIR(cmd) & _IOC_WRITE)))
+ return -EINVAL;
+
+ if (XE_IOCTL_DBG(xe, !(_IOC_DIR(cmd) & _IOC_READ)))
+ return -EINVAL;
+
+ if (XE_IOCTL_DBG(xe, _IOC_SIZE(cmd) < sizeof(user_arg)))
+ return -EINVAL;
+
+ if (copy_from_user(&user_arg, u64_to_user_ptr(arg), sizeof(user_arg)))
+ return -EFAULT;
+
+ if (XE_IOCTL_DBG(xe, user_arg.flags))
+ return -EINVAL;
+
+ if (!access_ok(u64_to_user_ptr(user_arg.ptr), user_arg.size))
+ return -EFAULT;
+
+ if (xe_eudebug_detached(d))
+ return -ENOTCONN;
+
+ eu_dbg(d,
+ "read metadata: client_handle=%llu, metadata_handle=%llu, flags=0x%x",
+ user_arg.client_handle, user_arg.metadata_handle, user_arg.flags);
+
+ xef = find_client_get(d, user_arg.client_handle);
+ if (XE_IOCTL_DBG(xe, !xef))
+ return -EINVAL;
+
+ mdata = find_metadata_get(d, (u32)user_arg.metadata_handle);
+ if (XE_IOCTL_DBG(xe, !mdata)) {
+ xe_file_put(xef);
+ return -EINVAL;
+ }
+
+ if (user_arg.size) {
+ if (user_arg.size < mdata->len) {
+ ret = -EINVAL;
+ goto metadata_put;
+ }
+
+ /* This limits us to a maximum payload size of 2G */
+ if (copy_to_user(u64_to_user_ptr(user_arg.ptr),
+ mdata->ptr, mdata->len)) {
+ ret = -EFAULT;
+ goto metadata_put;
+ }
+ }
+
+ user_arg.size = mdata->len;
+
+ if (copy_to_user(u64_to_user_ptr(arg), &user_arg, sizeof(user_arg)))
+ ret = -EFAULT;
+
+metadata_put:
+ xe_debug_metadata_put(mdata);
+ xe_file_put(xef);
+ return ret;
+}
+
static long xe_eudebug_vm_open_ioctl(struct xe_eudebug *d, unsigned long arg);
static long xe_eudebug_ioctl(struct file *file,
@@ -1254,7 +1341,10 @@ static long xe_eudebug_ioctl(struct file *file,
ret = xe_eudebug_vm_open_ioctl(d, arg);
eu_dbg(d, "ioctl cmd=VM_OPEN ret=%ld\n", ret);
break;
-
+ case DRM_XE_EUDEBUG_IOCTL_READ_METADATA:
+ ret = xe_eudebug_read_metadata(d, cmd, arg);
+ eu_dbg(d, "ioctl cmd=READ_METADATA ret=%ld\n", ret);
+ break;
default:
ret = -EINVAL;
}
@@ -2560,19 +2650,145 @@ static int vm_bind_op_event(struct xe_eudebug *d,
return xe_eudebug_queue_bind_event(d, vm, event);
}
+static int vm_bind_op_metadata_event(struct xe_eudebug *d,
+ struct xe_vm *vm,
+ u32 flags,
+ u64 ref_seqno,
+ u64 metadata_handle,
+ u64 metadata_cookie)
+{
+ struct xe_eudebug_event_vm_bind_op_metadata *e;
+ struct xe_eudebug_event *event;
+ const u32 sz = sizeof(*e);
+ u64 seqno;
+
+ seqno = atomic_long_inc_return(&d->events.seqno);
+
+ event = xe_eudebug_create_event(d, DRM_XE_EUDEBUG_EVENT_VM_BIND_OP_METADATA,
+ seqno, flags, sz, GFP_KERNEL);
+ if (!event)
+ return -ENOMEM;
+
+ e = cast_event(e, event);
+
+ write_member(struct drm_xe_eudebug_event_vm_bind_op_metadata, e,
+ vm_bind_op_ref_seqno, ref_seqno);
+ write_member(struct drm_xe_eudebug_event_vm_bind_op_metadata, e,
+ metadata_handle, metadata_handle);
+ write_member(struct drm_xe_eudebug_event_vm_bind_op_metadata, e,
+ metadata_cookie, metadata_cookie);
+
+ /* If in discovery, no need to collect ops */
+ if (!completion_done(&d->discovery))
+ return xe_eudebug_queue_event(d, event);
+
+ return xe_eudebug_queue_bind_event(d, vm, event);
+}
+
+static int vm_bind_op_metadata_count(struct xe_eudebug *d,
+ struct xe_vm *vm,
+ struct list_head *debug_metadata)
+{
+ struct xe_vma_debug_metadata *metadata;
+ struct xe_debug_metadata *mdata;
+ int h_m = 0, metadata_count = 0;
+
+ if (!debug_metadata)
+ return 0;
+
+ list_for_each_entry(metadata, debug_metadata, link) {
+ mdata = xe_debug_metadata_get(vm->xef, metadata->metadata_id);
+ if (mdata) {
+ h_m = find_handle(d->res, XE_EUDEBUG_RES_TYPE_METADATA, mdata);
+ xe_debug_metadata_put(mdata);
+ }
+
+ if (!mdata || h_m < 0) {
+ if (!mdata) {
+ eu_err(d, "Metadata::%u not found.",
+ metadata->metadata_id);
+ } else {
+ eu_err(d, "Metadata::%u not in the xe debugger",
+ metadata->metadata_id);
+ }
+ xe_eudebug_disconnect(d, -ENOENT);
+ return -ENOENT;
+ }
+ metadata_count++;
+ }
+ return metadata_count;
+}
+
+static int vm_bind_op_metadata(struct xe_eudebug *d, struct xe_vm *vm,
+ const u32 flags,
+ const u64 op_ref_seqno,
+ struct list_head *debug_metadata)
+{
+ struct xe_vma_debug_metadata *metadata;
+ int h_m = 0; /* handle space range = <1, MAX_INT>, return 0 if metadata not attached */
+ int metadata_count = 0;
+ int ret;
+
+ if (!debug_metadata)
+ return 0;
+
+ XE_WARN_ON(flags != DRM_XE_EUDEBUG_EVENT_CREATE);
+
+ list_for_each_entry(metadata, debug_metadata, link) {
+ struct xe_debug_metadata *mdata;
+
+ mdata = xe_debug_metadata_get(vm->xef, metadata->metadata_id);
+ if (mdata) {
+ h_m = find_handle(d->res, XE_EUDEBUG_RES_TYPE_METADATA, mdata);
+ xe_debug_metadata_put(mdata);
+ }
+
+ if (!mdata || h_m < 0) {
+ eu_err(d, "Attached debug metadata::%u not found!\n",
+ metadata->metadata_id);
+ return -ENOENT;
+ }
+
+ ret = vm_bind_op_metadata_event(d, vm, flags, op_ref_seqno,
+ h_m, metadata->cookie);
+ if (ret < 0)
+ return ret;
+
+ metadata_count++;
+ }
+
+ return metadata_count;
+}
+
static int vm_bind_op(struct xe_eudebug *d, struct xe_vm *vm,
const u32 flags, const u64 bind_ref_seqno,
- u64 addr, u64 range)
+ u64 addr, u64 range,
+ struct list_head *debug_metadata)
{
u64 op_seqno = 0;
- u64 num_extensions = 0;
+ u64 num_extensions;
int ret;
+ ret = vm_bind_op_metadata_count(d, vm, debug_metadata);
+ if (ret < 0)
+ return ret;
+
+ num_extensions = ret;
+
ret = vm_bind_op_event(d, vm, flags, bind_ref_seqno, num_extensions,
addr, range, &op_seqno);
if (ret)
return ret;
+ ret = vm_bind_op_metadata(d, vm, flags, op_seqno, debug_metadata);
+ if (ret < 0)
+ return ret;
+
+ if (ret != num_extensions) {
+ eu_err(d, "Inconsistency in metadata detected.");
+ return -EINVAL;
+ }
+
return 0;
}
@@ -2685,9 +2901,11 @@ void xe_eudebug_vm_bind_start(struct xe_vm *vm)
xe_eudebug_put(d);
}
-void xe_eudebug_vm_bind_op_add(struct xe_vm *vm, u32 op, u64 addr, u64 range)
+void xe_eudebug_vm_bind_op_add(struct xe_vm *vm, u32 op, u64 addr, u64 range,
+ struct drm_gpuva_ops *ops)
{
struct xe_eudebug *d;
+ struct list_head *debug_metadata = NULL;
u32 flags;
if (!xe_vm_in_lr_mode(vm))
@@ -2697,7 +2915,17 @@ void xe_eudebug_vm_bind_op_add(struct xe_vm *vm, u32 op, u64 addr, u64 range)
case DRM_XE_VM_BIND_OP_MAP:
case DRM_XE_VM_BIND_OP_MAP_USERPTR:
{
+ struct drm_gpuva_op *__op;
+
flags = DRM_XE_EUDEBUG_EVENT_CREATE;
+
+ /* OP_MAP will be last and singleton */
+ drm_gpuva_for_each_op(__op, ops) {
+ struct xe_vma_op *op = gpuva_op_to_vma_op(__op);
+
+ if (op->base.op == DRM_GPUVA_OP_MAP)
+ debug_metadata = &op->map.vma->eudebug.metadata.list;
+ }
break;
}
case DRM_XE_VM_BIND_OP_UNMAP:
@@ -2716,7 +2944,8 @@ void xe_eudebug_vm_bind_op_add(struct xe_vm *vm, u32 op, u64 addr, u64 range)
if (!d)
return;
- xe_eudebug_event_put(d, vm_bind_op(d, vm, flags, 0, addr, range));
+ xe_eudebug_event_put(d, vm_bind_op(d, vm, flags, 0, addr, range,
+ debug_metadata));
}
static struct xe_eudebug_event *fetch_bind_event(struct xe_vm * const vm)
@@ -2845,8 +3074,89 @@ int xe_eudebug_vm_bind_ufence(struct xe_user_fence *ufence)
return err;
}
+static int send_debug_metadata_event(struct xe_eudebug *d, u32 flags,
+ u64 client_handle, u64 metadata_handle,
+ u64 type, u64 len, u64 seqno)
+{
+ struct xe_eudebug_event *event;
+ struct xe_eudebug_event_metadata *e;
+
+ event = xe_eudebug_create_event(d, DRM_XE_EUDEBUG_EVENT_METADATA, seqno,
+ flags, sizeof(*e), GFP_KERNEL);
+ if (!event)
+ return -ENOMEM;
+
+ e = cast_event(e, event);
+
+ write_member(struct drm_xe_eudebug_event_metadata, e, client_handle, client_handle);
+ write_member(struct drm_xe_eudebug_event_metadata, e, metadata_handle, metadata_handle);
+ write_member(struct drm_xe_eudebug_event_metadata, e, type, type);
+ write_member(struct drm_xe_eudebug_event_metadata, e, len, len);
+
+ return xe_eudebug_queue_event(d, event);
+}
+
+static int debug_metadata_create_event(struct xe_eudebug *d,
+ struct xe_file *xef, struct xe_debug_metadata *m)
+{
+ int h_c, h_m;
+ u64 seqno;
+
+ h_c = find_handle(d->res, XE_EUDEBUG_RES_TYPE_CLIENT, xef);
+ if (h_c < 0)
+ return h_c;
+
+ h_m = xe_eudebug_add_handle(d, XE_EUDEBUG_RES_TYPE_METADATA, m, &seqno);
+ if (h_m <= 0)
+ return h_m;
+
+ return send_debug_metadata_event(d, DRM_XE_EUDEBUG_EVENT_CREATE,
+ h_c, h_m, m->type, m->len, seqno);
+}
+
+static int debug_metadata_destroy_event(struct xe_eudebug *d,
+ struct xe_file *xef, struct xe_debug_metadata *m)
+{
+ int h_c, h_m;
+ u64 seqno;
+
+ h_c = find_handle(d->res, XE_EUDEBUG_RES_TYPE_CLIENT, xef);
+ if (h_c < 0)
+ return h_c;
+
+ h_m = xe_eudebug_remove_handle(d, XE_EUDEBUG_RES_TYPE_METADATA, m, &seqno);
+ if (h_m < 0)
+ return h_m;
+
+ return send_debug_metadata_event(d, DRM_XE_EUDEBUG_EVENT_DESTROY,
+ h_c, h_m, m->type, m->len, seqno);
+}
+
+void xe_eudebug_debug_metadata_create(struct xe_file *xef, struct xe_debug_metadata *m)
+{
+ struct xe_eudebug *d;
+
+ d = xe_eudebug_get(xef);
+ if (!d)
+ return;
+
+ xe_eudebug_event_put(d, debug_metadata_create_event(d, xef, m));
+}
+
+void xe_eudebug_debug_metadata_destroy(struct xe_file *xef, struct xe_debug_metadata *m)
+{
+ struct xe_eudebug *d;
+
+ d = xe_eudebug_get(xef);
+ if (!d)
+ return;
+
+ xe_eudebug_event_put(d, debug_metadata_destroy_event(d, xef, m));
+}
+
static int discover_client(struct xe_eudebug *d, struct xe_file *xef)
{
+ struct xe_debug_metadata *m;
struct xe_exec_queue *q;
struct xe_vm *vm;
unsigned long i;
@@ -2856,6 +3166,12 @@ static int discover_client(struct xe_eudebug *d, struct xe_file *xef)
if (err)
return err;
+ xa_for_each(&xef->eudebug.metadata.xa, i, m) {
+ err = debug_metadata_create_event(d, xef, m);
+ if (err)
+ break;
+ }
+
xa_for_each(&xef->vm.xa, i, vm) {
err = vm_create_event(d, xef, vm);
if (err)
diff --git a/drivers/gpu/drm/xe/xe_eudebug.h b/drivers/gpu/drm/xe/xe_eudebug.h
index ae720a1b05d9..766d0a94d200 100644
--- a/drivers/gpu/drm/xe/xe_eudebug.h
+++ b/drivers/gpu/drm/xe/xe_eudebug.h
@@ -16,6 +16,8 @@ struct xe_vma;
struct xe_exec_queue;
struct xe_hw_engine;
struct xe_user_fence;
+struct xe_debug_metadata;
+struct drm_gpuva_ops;
#if IS_ENABLED(CONFIG_DRM_XE_EUDEBUG)
@@ -39,7 +41,8 @@ void xe_eudebug_exec_queue_destroy(struct xe_file *xef, struct xe_exec_queue *q)
void xe_eudebug_vm_init(struct xe_vm *vm);
void xe_eudebug_vm_bind_start(struct xe_vm *vm);
-void xe_eudebug_vm_bind_op_add(struct xe_vm *vm, u32 op, u64 addr, u64 range);
+void xe_eudebug_vm_bind_op_add(struct xe_vm *vm, u32 op, u64 addr, u64 range,
+ struct drm_gpuva_ops *ops);
void xe_eudebug_vm_bind_end(struct xe_vm *vm, bool has_ufence, int err);
int xe_eudebug_vm_bind_ufence(struct xe_user_fence *ufence);
@@ -49,6 +52,9 @@ void xe_eudebug_ufence_fini(struct xe_user_fence *ufence);
struct xe_eudebug *xe_eudebug_get(struct xe_file *xef);
void xe_eudebug_put(struct xe_eudebug *d);
+void xe_eudebug_debug_metadata_create(struct xe_file *xef, struct xe_debug_metadata *m);
+void xe_eudebug_debug_metadata_destroy(struct xe_file *xef, struct xe_debug_metadata *m);
+
#else
static inline int xe_eudebug_connect_ioctl(struct drm_device *dev,
@@ -71,7 +77,7 @@ static inline void xe_eudebug_exec_queue_destroy(struct xe_file *xef, struct xe_
static inline void xe_eudebug_vm_init(struct xe_vm *vm) { }
static inline void xe_eudebug_vm_bind_start(struct xe_vm *vm) { }
-static inline void xe_eudebug_vm_bind_op_add(struct xe_vm *vm, u32 op, u64 addr, u64 range) { }
+static inline void xe_eudebug_vm_bind_op_add(struct xe_vm *vm, u32 op, u64 addr, u64 range, struct drm_gpuva_ops *ops) { }
static inline void xe_eudebug_vm_bind_end(struct xe_vm *vm, bool has_ufence, int err) { }
static inline int xe_eudebug_vm_bind_ufence(struct xe_user_fence *ufence) { return 0; }
@@ -81,6 +87,9 @@ static inline void xe_eudebug_ufence_fini(struct xe_user_fence *ufence) { }
static inline struct xe_eudebug *xe_eudebug_get(struct xe_file *xef) { return NULL; }
static inline void xe_eudebug_put(struct xe_eudebug *d) { }
+static inline void xe_eudebug_debug_metadata_create(struct xe_file *xef, struct xe_debug_metadata *m) { }
+static inline void xe_eudebug_debug_metadata_destroy(struct xe_file *xef, struct xe_debug_metadata *m) { }
+
#endif /* CONFIG_DRM_XE_EUDEBUG */
#endif
diff --git a/drivers/gpu/drm/xe/xe_eudebug_types.h b/drivers/gpu/drm/xe/xe_eudebug_types.h
index aae7bc476c7e..b79d4c078216 100644
--- a/drivers/gpu/drm/xe/xe_eudebug_types.h
+++ b/drivers/gpu/drm/xe/xe_eudebug_types.h
@@ -56,7 +56,8 @@ struct xe_eudebug_resource {
#define XE_EUDEBUG_RES_TYPE_VM 1
#define XE_EUDEBUG_RES_TYPE_EXEC_QUEUE 2
#define XE_EUDEBUG_RES_TYPE_LRC 3
-#define XE_EUDEBUG_RES_TYPE_COUNT (XE_EUDEBUG_RES_TYPE_LRC + 1)
+#define XE_EUDEBUG_RES_TYPE_METADATA 4
+#define XE_EUDEBUG_RES_TYPE_COUNT (XE_EUDEBUG_RES_TYPE_METADATA + 1)
/**
* struct xe_eudebug_resources - eudebug resources for all types
@@ -300,4 +301,28 @@ struct xe_eudebug_event_vm_bind_ufence {
u64 vm_bind_ref_seqno;
};
+struct xe_eudebug_event_metadata {
+ struct xe_eudebug_event base;
+
+ /** @client_handle: client for the attention */
+ u64 client_handle;
+
+ /** @metadata_handle: debug metadata handle it's created/destroyed */
+ u64 metadata_handle;
+
+ /* @type: metadata type, refer to xe_drm.h for options */
+ u64 type;
+
+ /* @len: size of metadata paylad */
+ u64 len;
+};
+
+struct xe_eudebug_event_vm_bind_op_metadata {
+ struct xe_eudebug_event base;
+ u64 vm_bind_op_ref_seqno;
+
+ u64 metadata_handle;
+ u64 metadata_cookie;
+};
+
#endif
diff --git a/drivers/gpu/drm/xe/xe_vm.c b/drivers/gpu/drm/xe/xe_vm.c
index 587747b1b64c..e3e8bce11e3d 100644
--- a/drivers/gpu/drm/xe/xe_vm.c
+++ b/drivers/gpu/drm/xe/xe_vm.c
@@ -3172,7 +3172,7 @@ int xe_vm_bind_ioctl(struct drm_device *dev, void *data, struct drm_file *file)
if (err)
goto unwind_ops;
- xe_eudebug_vm_bind_op_add(vm, op, addr, range);
+ xe_eudebug_vm_bind_op_add(vm, op, addr, range, ops[i]);
#ifdef TEST_VM_OPS_ERROR
if (flags & FORCE_OP_ERROR) {
diff --git a/include/uapi/drm/xe_drm_eudebug.h b/include/uapi/drm/xe_drm_eudebug.h
index 9917280400d6..2ebf21e15f5b 100644
--- a/include/uapi/drm/xe_drm_eudebug.h
+++ b/include/uapi/drm/xe_drm_eudebug.h
@@ -19,6 +19,7 @@ extern "C" {
#define DRM_XE_EUDEBUG_IOCTL_EU_CONTROL _IOWR('j', 0x2, struct drm_xe_eudebug_eu_control)
#define DRM_XE_EUDEBUG_IOCTL_ACK_EVENT _IOW('j', 0x4, struct drm_xe_eudebug_ack_event)
#define DRM_XE_EUDEBUG_IOCTL_VM_OPEN _IOW('j', 0x1, struct drm_xe_eudebug_vm_open)
+#define DRM_XE_EUDEBUG_IOCTL_READ_METADATA _IOWR('j', 0x3, struct drm_xe_eudebug_read_metadata)
/* XXX: Document events to match their internal counterparts when moved to xe_drm.h */
struct drm_xe_eudebug_event {
@@ -34,6 +35,8 @@ struct drm_xe_eudebug_event {
#define DRM_XE_EUDEBUG_EVENT_VM_BIND 6
#define DRM_XE_EUDEBUG_EVENT_VM_BIND_OP 7
#define DRM_XE_EUDEBUG_EVENT_VM_BIND_UFENCE 8
+#define DRM_XE_EUDEBUG_EVENT_METADATA 9
+#define DRM_XE_EUDEBUG_EVENT_VM_BIND_OP_METADATA 10
__u16 flags;
#define DRM_XE_EUDEBUG_EVENT_CREATE (1 << 0)
@@ -188,6 +191,33 @@ struct drm_xe_eudebug_vm_open {
__u64 timeout_ns;
};
+struct drm_xe_eudebug_read_metadata {
+ __u64 client_handle;
+ __u64 metadata_handle;
+ __u32 flags;
+ __u32 reserved;
+ __u64 ptr;
+ __u64 size;
+};
+
+struct drm_xe_eudebug_event_metadata {
+ struct drm_xe_eudebug_event base;
+
+ __u64 client_handle;
+ __u64 metadata_handle;
+ /* XXX: Refer to xe_drm.h for fields */
+ __u64 type;
+ __u64 len;
+};
+
+struct drm_xe_eudebug_event_vm_bind_op_metadata {
+ struct drm_xe_eudebug_event base;
+ __u64 vm_bind_op_ref_seqno; /* *_event_vm_bind_op.base.seqno */
+
+ __u64 metadata_handle;
+ __u64 metadata_cookie;
+};
+
#if defined(__cplusplus)
}
#endif
--
2.46.1
^ permalink raw reply related [flat|nested] 28+ messages in thread* [RFC 16/19] drm/xe/eudebug: Implement vm_bind_op discovery
2024-10-21 9:58 [RFC 00/19] Support EU online debug on pagefault Gwan-gyeong Mun
` (14 preceding siblings ...)
2024-10-21 9:58 ` [RFC 15/19] drm/xe/eudebug: Add debug metadata support for xe_eudebug Gwan-gyeong Mun
@ 2024-10-21 9:58 ` Gwan-gyeong Mun
2024-10-21 9:58 ` [RFC 17/19] drm/xe/eudebug: Dynamically toggle debugger functionality Gwan-gyeong Mun
` (9 subsequent siblings)
25 siblings, 0 replies; 28+ messages in thread
From: Gwan-gyeong Mun @ 2024-10-21 9:58 UTC (permalink / raw)
To: intel-xe
Cc: nirmoy.das, matthew.brost, stuart.summers, christoph.manszewski,
mika.kuoppala, dominik.grzegorzek, andrzej.hajda,
maciej.patelczyk
From: Mika Kuoppala <mika.kuoppala@linux.intel.com>
Follow the vm bind, vm_bind op sequence for
discovery process of a vm with the vmas it has.
Send events for ops and attach metadata if available.
v2: - Fix bad op ref seqno (Christoph)
- with discovery semaphore, we dont need vm lock (Matthew)
Cc: Matthew Brost <matthew.brost@intel.com>
Signed-off-by: Mika Kuoppala <mika.kuoppala@linux.intel.com>
Signed-off-by: Gwan-gyeong Mun <gwan-gyeong.mun@intel.com>
---
drivers/gpu/drm/xe/xe_eudebug.c | 45 +++++++++++++++++++++++++++++++++
1 file changed, 45 insertions(+)
diff --git a/drivers/gpu/drm/xe/xe_eudebug.c b/drivers/gpu/drm/xe/xe_eudebug.c
index 35ab65ef9c80..9ef1e5d9c65d 100644
--- a/drivers/gpu/drm/xe/xe_eudebug.c
+++ b/drivers/gpu/drm/xe/xe_eudebug.c
@@ -3154,6 +3154,47 @@ void xe_eudebug_debug_metadata_destroy(struct xe_file *xef, struct xe_debug_meta
xe_eudebug_event_put(d, debug_metadata_destroy_event(d, xef, m));
}
+static int vm_discover_binds(struct xe_eudebug *d, struct xe_vm *vm)
+{
+ struct drm_gpuva *va;
+ unsigned int num_ops = 0, send_ops = 0;
+ u64 ref_seqno = 0;
+ int err;
+
+ /*
+ * Currently only vm_bind_ioctl inserts vma's
+ * and with discovery lock, we have exclusivity.
+ */
+ lockdep_assert_held_write(&d->xe->eudebug.discovery_lock);
+
+ drm_gpuvm_for_each_va(va, &vm->gpuvm)
+ num_ops++;
+
+ if (!num_ops)
+ return 0;
+
+ err = vm_bind_event(d, vm, num_ops, &ref_seqno);
+ if (err)
+ return err;
+
+ drm_gpuvm_for_each_va(va, &vm->gpuvm) {
+ struct xe_vma *vma = container_of(va, struct xe_vma, gpuva);
+
+ if (send_ops >= num_ops)
+ break;
+
+ err = vm_bind_op(d, vm, DRM_XE_EUDEBUG_EVENT_CREATE, ref_seqno,
+ xe_vma_start(vma), xe_vma_size(vma),
+ &vma->eudebug.metadata.list);
+ if (err)
+ return err;
+
+ send_ops++;
+ }
+
+ return num_ops == send_ops ? 0 : -EINVAL;
+}
+
static int discover_client(struct xe_eudebug *d, struct xe_file *xef)
{
struct xe_debug_metadata *m;
@@ -3176,6 +3217,10 @@ static int discover_client(struct xe_eudebug *d, struct xe_file *xef)
err = vm_create_event(d, xef, vm);
if (err)
break;
+
+ err = vm_discover_binds(d, vm);
+ if (err)
+ break;
}
xa_for_each(&xef->exec_queue.xa, i, q) {
--
2.46.1
^ permalink raw reply related [flat|nested] 28+ messages in thread* [RFC 17/19] drm/xe/eudebug: Dynamically toggle debugger functionality
2024-10-21 9:58 [RFC 00/19] Support EU online debug on pagefault Gwan-gyeong Mun
` (15 preceding siblings ...)
2024-10-21 9:58 ` [RFC 16/19] drm/xe/eudebug: Implement vm_bind_op discovery Gwan-gyeong Mun
@ 2024-10-21 9:58 ` Gwan-gyeong Mun
2024-10-21 9:58 ` [RFC 18/19] drm/xe/eudebug_test: Introduce xe_eudebug wa kunit test Gwan-gyeong Mun
` (8 subsequent siblings)
25 siblings, 0 replies; 28+ messages in thread
From: Gwan-gyeong Mun @ 2024-10-21 9:58 UTC (permalink / raw)
To: intel-xe
Cc: nirmoy.das, matthew.brost, stuart.summers, christoph.manszewski,
mika.kuoppala, dominik.grzegorzek, andrzej.hajda,
maciej.patelczyk
From: Christoph Manszewski <christoph.manszewski@intel.com>
Make it possible to dynamically enable/disable debugger funtionality,
including the setting and unsetting of required hw register values via a
sysfs entry located at '/sys/class/drm/card<X>/device/enable_eudebug'.
This entry uses 'kstrtobool' and as such it accepts inputs as documented
by this function, in particular '0' and '1'.
v2: use new discovery_lock to gain exclusivity (Mika)
Signed-off-by: Christoph Manszewski <christoph.manszewski@intel.com>
Signed-off-by: Dominik Grzegorzek <dominik.grzegorzek@intel.com>
Signed-off-by: Maciej Patelczyk <maciej.patelczyk@intel.com>
Signed-off-by: Mika Kuoppala <mika.kuoppala@linux.intel.com>
Signed-off-by: Gwan-gyeong Mun <gwan-gyeong.mun@intel.com>
---
drivers/gpu/drm/xe/xe_device.c | 2 -
drivers/gpu/drm/xe/xe_device_types.h | 3 +
drivers/gpu/drm/xe/xe_eudebug.c | 125 +++++++++++++++++++++++----
drivers/gpu/drm/xe/xe_eudebug.h | 2 -
drivers/gpu/drm/xe/xe_exec_queue.c | 5 ++
drivers/gpu/drm/xe/xe_hw_engine.c | 1 -
drivers/gpu/drm/xe/xe_reg_sr.c | 21 +++--
drivers/gpu/drm/xe/xe_reg_sr.h | 4 +-
drivers/gpu/drm/xe/xe_rtp.c | 2 +-
9 files changed, 133 insertions(+), 32 deletions(-)
diff --git a/drivers/gpu/drm/xe/xe_device.c b/drivers/gpu/drm/xe/xe_device.c
index d125951e0f73..abc9b8087276 100644
--- a/drivers/gpu/drm/xe/xe_device.c
+++ b/drivers/gpu/drm/xe/xe_device.c
@@ -786,8 +786,6 @@ int xe_device_probe(struct xe_device *xe)
xe_debugfs_register(xe);
- xe_eudebug_init_late(xe);
-
xe_hwmon_register(xe);
for_each_gt(gt, xe, id)
diff --git a/drivers/gpu/drm/xe/xe_device_types.h b/drivers/gpu/drm/xe/xe_device_types.h
index 40b0f61b64b8..fc448d44752e 100644
--- a/drivers/gpu/drm/xe/xe_device_types.h
+++ b/drivers/gpu/drm/xe/xe_device_types.h
@@ -549,6 +549,9 @@ struct xe_device {
/** discovery_lock: used for discovery to block xe ioctls */
struct rw_semaphore discovery_lock;
+ /** @enable: is the debugging functionality enabled */
+ bool enable;
+
/** @attention_scan: attention scan worker */
struct delayed_work attention_scan;
} eudebug;
diff --git a/drivers/gpu/drm/xe/xe_eudebug.c b/drivers/gpu/drm/xe/xe_eudebug.c
index 9ef1e5d9c65d..a24b6e553383 100644
--- a/drivers/gpu/drm/xe/xe_eudebug.c
+++ b/drivers/gpu/drm/xe/xe_eudebug.c
@@ -2001,9 +2001,6 @@ xe_eudebug_connect(struct xe_device *xe,
param->version = DRM_XE_EUDEBUG_VERSION;
- if (!xe->eudebug.available)
- return -EOPNOTSUPP;
-
d = kzalloc(sizeof(*d), GFP_KERNEL);
if (!d)
return -ENOMEM;
@@ -2063,17 +2060,19 @@ int xe_eudebug_connect_ioctl(struct drm_device *dev,
{
struct xe_device *xe = to_xe_device(dev);
struct drm_xe_eudebug_connect * const param = data;
- int ret = 0;
- ret = xe_eudebug_connect(xe, param);
+ lockdep_assert_held(&xe->eudebug.discovery_lock);
- return ret;
+ if (!xe->eudebug.enable)
+ return -ENODEV;
+
+ return xe_eudebug_connect(xe, param);
}
#undef XE_REG_MCR
#define XE_REG_MCR(...) XE_REG(__VA_ARGS__, .mcr = 1)
-void xe_eudebug_init_hw_engine(struct xe_hw_engine *hwe)
+static void xe_eudebug_reinit_hw_engine(struct xe_hw_engine *hwe, bool enable)
{
struct xe_gt *gt = hwe->gt;
struct xe_device *xe = gt_to_xe(gt);
@@ -2088,22 +2087,22 @@ void xe_eudebug_init_hw_engine(struct xe_hw_engine *hwe)
struct xe_reg_sr_entry sr_entry = {
.reg = ROW_CHICKEN,
.clr_bits = STALL_DOP_GATING_DISABLE,
- .set_bits = STALL_DOP_GATING_DISABLE,
+ .set_bits = enable ? STALL_DOP_GATING_DISABLE : 0,
.read_mask = STALL_DOP_GATING_DISABLE,
};
- xe_reg_sr_add(&hwe->reg_sr, &sr_entry, gt);
+ xe_reg_sr_add(&hwe->reg_sr, &sr_entry, gt, true);
}
if (XE_WA(gt, 14015474168)) {
struct xe_reg_sr_entry sr_entry = {
.reg = ROW_CHICKEN2,
.clr_bits = XEHPC_DISABLE_BTB,
- .set_bits = XEHPC_DISABLE_BTB,
+ .set_bits = enable ? XEHPC_DISABLE_BTB : 0,
.read_mask = XEHPC_DISABLE_BTB,
};
- xe_reg_sr_add(&hwe->reg_sr, &sr_entry, gt);
+ xe_reg_sr_add(&hwe->reg_sr, &sr_entry, gt, true);
}
if (xe->info.graphics_verx100 >= 1200) {
@@ -2113,27 +2112,112 @@ void xe_eudebug_init_hw_engine(struct xe_hw_engine *hwe)
struct xe_reg_sr_entry sr_entry = {
.reg = TD_CTL,
.clr_bits = mask,
- .set_bits = mask,
+ .set_bits = enable ? mask : 0,
.read_mask = mask,
};
- xe_reg_sr_add(&hwe->reg_sr, &sr_entry, gt);
+ xe_reg_sr_add(&hwe->reg_sr, &sr_entry, gt, true);
}
if (xe->info.graphics_verx100 >= 1250) {
struct xe_reg_sr_entry sr_entry = {
.reg = TD_CTL,
.clr_bits = TD_CTL_GLOBAL_DEBUG_ENABLE,
- .set_bits = TD_CTL_GLOBAL_DEBUG_ENABLE,
+ .set_bits = enable ? TD_CTL_GLOBAL_DEBUG_ENABLE : 0,
.read_mask = TD_CTL_GLOBAL_DEBUG_ENABLE,
};
- xe_reg_sr_add(&hwe->reg_sr, &sr_entry, gt);
+ xe_reg_sr_add(&hwe->reg_sr, &sr_entry, gt, true);
+ }
+}
+
+static int xe_eudebug_enable(struct xe_device *xe, bool enable)
+{
+ struct xe_gt *gt;
+ int i;
+ u8 id;
+
+ if (!xe->eudebug.available)
+ return -EOPNOTSUPP;
+
+ /*
+ * The connect ioctl has read lock so we can
+ * serialize with taking write
+ */
+ down_write(&xe->eudebug.discovery_lock);
+
+ if (!enable && !list_empty(&xe->eudebug.list)) {
+ up_write(&xe->eudebug.discovery_lock);
+ return -EBUSY;
+ }
+
+ if (enable == xe->eudebug.enable) {
+ up_write(&xe->eudebug.discovery_lock);
+ return 0;
}
+
+ for_each_gt(gt, xe, id) {
+ for (i = 0; i < ARRAY_SIZE(gt->hw_engines); i++) {
+ if (!(gt->info.engine_mask & BIT(i)))
+ continue;
+
+ xe_eudebug_reinit_hw_engine(>->hw_engines[i], enable);
+ }
+
+ xe_gt_reset_async(gt);
+ flush_work(>->reset.worker);
+ }
+
+ xe->eudebug.enable = enable;
+ up_write(&xe->eudebug.discovery_lock);
+
+ if (enable)
+ attention_scan_flush(xe);
+ else
+ attention_scan_cancel(xe);
+
+ return 0;
+}
+
+static ssize_t enable_eudebug_show(struct device *dev, struct device_attribute *attr, char *buf)
+{
+ struct xe_device *xe = pdev_to_xe_device(to_pci_dev(dev));
+
+ return sysfs_emit(buf, "%u\n", xe->eudebug.enable);
+}
+
+static ssize_t enable_eudebug_store(struct device *dev, struct device_attribute *attr,
+ const char *buf, size_t count)
+{
+ struct xe_device *xe = pdev_to_xe_device(to_pci_dev(dev));
+ bool enable;
+ int ret;
+
+ ret = kstrtobool(buf, &enable);
+ if (ret)
+ return ret;
+
+ ret = xe_eudebug_enable(xe, enable);
+ if (ret)
+ return ret;
+
+ return count;
+}
+
+static DEVICE_ATTR_RW(enable_eudebug);
+
+static void xe_eudebug_sysfs_fini(void *arg)
+{
+ struct xe_device *xe = arg;
+
+ sysfs_remove_file(&xe->drm.dev->kobj, &dev_attr_enable_eudebug.attr);
}
void xe_eudebug_init(struct xe_device *xe)
{
+ struct device *dev = xe->drm.dev;
+ int ret;
+
spin_lock_init(&xe->eudebug.lock);
INIT_LIST_HEAD(&xe->eudebug.list);
INIT_LIST_HEAD(&xe->clients.list);
@@ -2142,14 +2226,17 @@ void xe_eudebug_init(struct xe_device *xe)
xe->eudebug.ordered_wq = alloc_ordered_workqueue("xe-eudebug-ordered-wq", 0);
xe->eudebug.available = !!xe->eudebug.ordered_wq;
-}
-void xe_eudebug_init_late(struct xe_device *xe)
-{
if (!xe->eudebug.available)
return;
- attention_scan_flush(xe);
+ ret = sysfs_create_file(&xe->drm.dev->kobj, &dev_attr_enable_eudebug.attr);
+ if (ret)
+ drm_warn(&xe->drm, "eudebug sysfs init failed: %d, debugger unavailable\n", ret);
+ else
+ devm_add_action_or_reset(dev, xe_eudebug_sysfs_fini, xe);
+
+ xe->eudebug.available = ret == 0;
}
void xe_eudebug_fini(struct xe_device *xe)
diff --git a/drivers/gpu/drm/xe/xe_eudebug.h b/drivers/gpu/drm/xe/xe_eudebug.h
index 766d0a94d200..403f52148da3 100644
--- a/drivers/gpu/drm/xe/xe_eudebug.h
+++ b/drivers/gpu/drm/xe/xe_eudebug.h
@@ -26,9 +26,7 @@ int xe_eudebug_connect_ioctl(struct drm_device *dev,
struct drm_file *file);
void xe_eudebug_init(struct xe_device *xe);
-void xe_eudebug_init_late(struct xe_device *xe);
void xe_eudebug_fini(struct xe_device *xe);
-void xe_eudebug_init_hw_engine(struct xe_hw_engine *hwe);
void xe_eudebug_file_open(struct xe_file *xef);
void xe_eudebug_file_close(struct xe_file *xef);
diff --git a/drivers/gpu/drm/xe/xe_exec_queue.c b/drivers/gpu/drm/xe/xe_exec_queue.c
index c2d6993ac103..011d8bb477d4 100644
--- a/drivers/gpu/drm/xe/xe_exec_queue.c
+++ b/drivers/gpu/drm/xe/xe_exec_queue.c
@@ -422,6 +422,11 @@ static int exec_queue_set_eudebug(struct xe_device *xe, struct xe_exec_queue *q,
!(value & DRM_XE_EXEC_QUEUE_EUDEBUG_FLAG_ENABLE)))
return -EINVAL;
+#if IS_ENABLED(CONFIG_DRM_XE_EUDEBUG)
+ if (XE_IOCTL_DBG(xe, !xe->eudebug.enable))
+ return -EPERM;
+#endif
+
q->eudebug_flags = EXEC_QUEUE_EUDEBUG_FLAG_ENABLE;
q->sched_props.preempt_timeout_us = 0;
diff --git a/drivers/gpu/drm/xe/xe_hw_engine.c b/drivers/gpu/drm/xe/xe_hw_engine.c
index 0b6e087712ea..06711cfd8bfd 100644
--- a/drivers/gpu/drm/xe/xe_hw_engine.c
+++ b/drivers/gpu/drm/xe/xe_hw_engine.c
@@ -559,7 +559,6 @@ static void hw_engine_init_early(struct xe_gt *gt, struct xe_hw_engine *hwe,
xe_tuning_process_engine(hwe);
xe_wa_process_engine(hwe);
hw_engine_setup_default_state(hwe);
- xe_eudebug_init_hw_engine(hwe);
xe_reg_sr_init(&hwe->reg_whitelist, hwe->name, gt_to_xe(gt));
xe_reg_whitelist_process_engine(hwe);
diff --git a/drivers/gpu/drm/xe/xe_reg_sr.c b/drivers/gpu/drm/xe/xe_reg_sr.c
index e1a0e27cda14..e3a539c1c08e 100644
--- a/drivers/gpu/drm/xe/xe_reg_sr.c
+++ b/drivers/gpu/drm/xe/xe_reg_sr.c
@@ -93,22 +93,31 @@ static void reg_sr_inc_error(struct xe_reg_sr *sr)
int xe_reg_sr_add(struct xe_reg_sr *sr,
const struct xe_reg_sr_entry *e,
- struct xe_gt *gt)
+ struct xe_gt *gt,
+ bool overwrite)
{
unsigned long idx = e->reg.addr;
struct xe_reg_sr_entry *pentry = xa_load(&sr->xa, idx);
int ret;
if (pentry) {
- if (!compatible_entries(pentry, e)) {
+ if (overwrite && e->set_bits) {
+ pentry->clr_bits |= e->clr_bits;
+ pentry->set_bits |= e->set_bits;
+ pentry->read_mask |= e->read_mask;
+ } else if (overwrite && !e->set_bits) {
+ pentry->clr_bits |= e->clr_bits;
+ pentry->set_bits &= ~e->clr_bits;
+ pentry->read_mask |= e->read_mask;
+ } else if (!compatible_entries(pentry, e)) {
ret = -EINVAL;
goto fail;
+ } else {
+ pentry->clr_bits |= e->clr_bits;
+ pentry->set_bits |= e->set_bits;
+ pentry->read_mask |= e->read_mask;
}
- pentry->clr_bits |= e->clr_bits;
- pentry->set_bits |= e->set_bits;
- pentry->read_mask |= e->read_mask;
-
return 0;
}
diff --git a/drivers/gpu/drm/xe/xe_reg_sr.h b/drivers/gpu/drm/xe/xe_reg_sr.h
index 51fbba423e27..d67fafdcd847 100644
--- a/drivers/gpu/drm/xe/xe_reg_sr.h
+++ b/drivers/gpu/drm/xe/xe_reg_sr.h
@@ -6,6 +6,8 @@
#ifndef _XE_REG_SR_
#define _XE_REG_SR_
+#include <linux/types.h>
+
/*
* Reg save/restore bookkeeping
*/
@@ -21,7 +23,7 @@ int xe_reg_sr_init(struct xe_reg_sr *sr, const char *name, struct xe_device *xe)
void xe_reg_sr_dump(struct xe_reg_sr *sr, struct drm_printer *p);
int xe_reg_sr_add(struct xe_reg_sr *sr, const struct xe_reg_sr_entry *e,
- struct xe_gt *gt);
+ struct xe_gt *gt, bool overwrite);
void xe_reg_sr_apply_mmio(struct xe_reg_sr *sr, struct xe_gt *gt);
void xe_reg_sr_apply_whitelist(struct xe_hw_engine *hwe);
diff --git a/drivers/gpu/drm/xe/xe_rtp.c b/drivers/gpu/drm/xe/xe_rtp.c
index b13d4d62f0b1..6006f7c90cac 100644
--- a/drivers/gpu/drm/xe/xe_rtp.c
+++ b/drivers/gpu/drm/xe/xe_rtp.c
@@ -153,7 +153,7 @@ static void rtp_add_sr_entry(const struct xe_rtp_action *action,
};
sr_entry.reg.addr += mmio_base;
- xe_reg_sr_add(sr, &sr_entry, gt);
+ xe_reg_sr_add(sr, &sr_entry, gt, false);
}
static bool rtp_process_one_sr(const struct xe_rtp_entry_sr *entry,
--
2.46.1
^ permalink raw reply related [flat|nested] 28+ messages in thread* [RFC 18/19] drm/xe/eudebug_test: Introduce xe_eudebug wa kunit test
2024-10-21 9:58 [RFC 00/19] Support EU online debug on pagefault Gwan-gyeong Mun
` (16 preceding siblings ...)
2024-10-21 9:58 ` [RFC 17/19] drm/xe/eudebug: Dynamically toggle debugger functionality Gwan-gyeong Mun
@ 2024-10-21 9:58 ` Gwan-gyeong Mun
2024-10-21 9:58 ` [RFC 19/19] drm/xe/eudebug: Support EU online debug on pagefault Gwan-gyeong Mun
` (7 subsequent siblings)
25 siblings, 0 replies; 28+ messages in thread
From: Gwan-gyeong Mun @ 2024-10-21 9:58 UTC (permalink / raw)
To: intel-xe
Cc: nirmoy.das, matthew.brost, stuart.summers, christoph.manszewski,
mika.kuoppala, dominik.grzegorzek, andrzej.hajda,
maciej.patelczyk
From: Christoph Manszewski <christoph.manszewski@intel.com>
Introduce kunit test for eudebug. For now it checks the dynamic
application of WAs.
v2: adapt to removal of call_for_each_device (Mika)
v3: update to use changed xe_force_wake_get() failure handling (G.G.)
Signed-off-by: Christoph Manszewski <christoph.manszewski@intel.com>
Signed-off-by: Mika Kuoppala <mika.kuoppala@linux.intel.com>
Signed-off-by: Gwan-gyeong Mun <gwan-gyeong.mun@intel.com>
---
drivers/gpu/drm/xe/tests/xe_eudebug.c | 175 ++++++++++++++++++++
drivers/gpu/drm/xe/tests/xe_live_test_mod.c | 5 +
drivers/gpu/drm/xe/xe_eudebug.c | 4 +
3 files changed, 184 insertions(+)
create mode 100644 drivers/gpu/drm/xe/tests/xe_eudebug.c
diff --git a/drivers/gpu/drm/xe/tests/xe_eudebug.c b/drivers/gpu/drm/xe/tests/xe_eudebug.c
new file mode 100644
index 000000000000..2a736d4afd76
--- /dev/null
+++ b/drivers/gpu/drm/xe/tests/xe_eudebug.c
@@ -0,0 +1,175 @@
+// SPDX-License-Identifier: GPL-2.0 AND MIT
+/*
+ * Copyright © 2024 Intel Corporation
+ */
+
+#include <kunit/visibility.h>
+
+#include "tests/xe_kunit_helpers.h"
+#include "tests/xe_pci_test.h"
+#include "tests/xe_test.h"
+
+#undef XE_REG_MCR
+#define XE_REG_MCR(r_, ...) ((const struct xe_reg_mcr){ \
+ .__reg = XE_REG_INITIALIZER(r_, ##__VA_ARGS__, .mcr = 1) \
+ })
+
+static const char *reg_to_str(struct xe_reg reg)
+{
+ if (reg.raw == TD_CTL.__reg.raw)
+ return "TD_CTL";
+ else if (reg.raw == CS_DEBUG_MODE2(RENDER_RING_BASE).raw)
+ return "CS_DEBUG_MODE2";
+ else if (reg.raw == ROW_CHICKEN.__reg.raw)
+ return "ROW_CHICKEN";
+ else if (reg.raw == ROW_CHICKEN2.__reg.raw)
+ return "ROW_CHICKEN2";
+ else if (reg.raw == ROW_CHICKEN3.__reg.raw)
+ return "ROW_CHICKEN3";
+ else
+ return "UNKNOWN REG";
+}
+
+static u32 get_reg_mask(struct xe_device *xe, struct xe_reg reg)
+{
+ struct kunit *test = kunit_get_current_test();
+ u32 val = 0;
+
+ if (reg.raw == TD_CTL.__reg.raw) {
+ val = TD_CTL_BREAKPOINT_ENABLE |
+ TD_CTL_FORCE_THREAD_BREAKPOINT_ENABLE |
+ TD_CTL_FEH_AND_FEE_ENABLE;
+
+ if (GRAPHICS_VERx100(xe) >= 1250)
+ val |= TD_CTL_GLOBAL_DEBUG_ENABLE;
+
+ } else if (reg.raw == CS_DEBUG_MODE2(RENDER_RING_BASE).raw) {
+ val = GLOBAL_DEBUG_ENABLE;
+ } else if (reg.raw == ROW_CHICKEN.__reg.raw) {
+ val = STALL_DOP_GATING_DISABLE;
+ } else if (reg.raw == ROW_CHICKEN2.__reg.raw) {
+ val = XEHPC_DISABLE_BTB;
+ } else if (reg.raw == ROW_CHICKEN3.__reg.raw) {
+ val = XE2_EUPEND_CHK_FLUSH_DIS;
+ } else {
+ kunit_warn(test, "Invalid register selection: %u\n", reg.raw);
+ }
+
+ return val;
+}
+
+static u32 get_reg_expected(struct xe_device *xe, struct xe_reg reg, bool enable_eudebug)
+{
+ u32 reg_mask = get_reg_mask(xe, reg);
+ u32 reg_bits = 0;
+
+ if (enable_eudebug || reg.raw == ROW_CHICKEN3.__reg.raw)
+ reg_bits = reg_mask;
+ else
+ reg_bits = 0;
+
+ return reg_bits;
+}
+
+static void check_reg(struct xe_gt *gt, bool enable_eudebug, struct xe_reg reg)
+{
+ struct kunit *test = kunit_get_current_test();
+ struct xe_device *xe = gt_to_xe(gt);
+ u32 reg_bits_expected = get_reg_expected(xe, reg, enable_eudebug);
+ u32 reg_mask = get_reg_mask(xe, reg);
+ u32 reg_bits = 0;
+
+ if (reg.mcr)
+ reg_bits = xe_gt_mcr_unicast_read_any(gt, (struct xe_reg_mcr){.__reg = reg});
+ else
+ reg_bits = xe_mmio_read32(>->mmio, reg);
+
+ reg_bits &= reg_mask;
+
+ kunit_printk(KERN_DEBUG, test, "%s bits: expected == 0x%x; actual == 0x%x\n",
+ reg_to_str(reg), reg_bits_expected, reg_bits);
+ KUNIT_EXPECT_EQ_MSG(test, reg_bits_expected, reg_bits,
+ "Invalid bits set for %s\n", reg_to_str(reg));
+}
+
+static void __check_regs(struct xe_gt *gt, bool enable_eudebug)
+{
+ struct xe_device *xe = gt_to_xe(gt);
+
+ if (GRAPHICS_VERx100(xe) >= 1200)
+ check_reg(gt, enable_eudebug, TD_CTL.__reg);
+
+ if (GRAPHICS_VERx100(xe) >= 1250 && GRAPHICS_VERx100(xe) <= 1274)
+ check_reg(gt, enable_eudebug, ROW_CHICKEN.__reg);
+
+ if (xe->info.platform == XE_PVC)
+ check_reg(gt, enable_eudebug, ROW_CHICKEN2.__reg);
+
+ if (GRAPHICS_VERx100(xe) >= 2000 && GRAPHICS_VERx100(xe) <= 2004)
+ check_reg(gt, enable_eudebug, ROW_CHICKEN3.__reg);
+}
+
+static void check_regs(struct xe_device *xe, bool enable_eudebug)
+{
+ struct kunit *test = kunit_get_current_test();
+ unsigned int fw_ref;
+ struct xe_gt *gt;
+ u8 id;
+
+ kunit_printk(KERN_DEBUG, test, "Check regs for eudebug %s\n",
+ enable_eudebug ? "enabled" : "disabled");
+
+ xe_pm_runtime_get(xe);
+ for_each_gt(gt, xe, id) {
+ if (xe_gt_is_media_type(gt))
+ continue;
+
+ fw_ref = xe_force_wake_get(gt_to_fw(gt), XE_FW_RENDER);
+ KUNIT_ASSERT_NE_MSG(test, fw_ref, 0, "Forcewake failed.\n");
+
+ __check_regs(gt, enable_eudebug);
+
+ xe_force_wake_put(gt_to_fw(gt), fw_ref);
+ }
+ xe_pm_runtime_put(xe);
+}
+
+static int toggle_reg_value(struct xe_device *xe)
+{
+ struct kunit *test = kunit_get_current_test();
+ bool enable_eudebug = xe->eudebug.enable;
+
+ kunit_printk(KERN_DEBUG, test, "Test eudebug WAs for graphics version: %u\n",
+ GRAPHICS_VERx100(xe));
+
+ check_regs(xe, enable_eudebug);
+
+ xe_eudebug_enable(xe, !enable_eudebug);
+ check_regs(xe, !enable_eudebug);
+
+ xe_eudebug_enable(xe, enable_eudebug);
+ check_regs(xe, enable_eudebug);
+
+ return 0;
+}
+
+static void xe_eudebug_toggle_reg_kunit(struct kunit *test)
+{
+ struct xe_device *xe = test->priv;
+
+ toggle_reg_value(xe);
+}
+
+static struct kunit_case xe_eudebug_tests[] = {
+ KUNIT_CASE_PARAM(xe_eudebug_toggle_reg_kunit,
+ xe_pci_live_device_gen_param),
+ {}
+};
+
+VISIBLE_IF_KUNIT
+struct kunit_suite xe_eudebug_test_suite = {
+ .name = "xe_eudebug",
+ .test_cases = xe_eudebug_tests,
+ .init = xe_kunit_helper_xe_device_live_test_init,
+};
+EXPORT_SYMBOL_IF_KUNIT(xe_eudebug_test_suite);
diff --git a/drivers/gpu/drm/xe/tests/xe_live_test_mod.c b/drivers/gpu/drm/xe/tests/xe_live_test_mod.c
index 5f14737c8210..7dd8a0a4bdfd 100644
--- a/drivers/gpu/drm/xe/tests/xe_live_test_mod.c
+++ b/drivers/gpu/drm/xe/tests/xe_live_test_mod.c
@@ -15,6 +15,11 @@ kunit_test_suite(xe_dma_buf_test_suite);
kunit_test_suite(xe_migrate_test_suite);
kunit_test_suite(xe_mocs_test_suite);
+#if IS_ENABLED(CONFIG_DRM_XE_EUDEBUG)
+extern struct kunit_suite xe_eudebug_test_suite;
+kunit_test_suite(xe_eudebug_test_suite);
+#endif
+
MODULE_AUTHOR("Intel Corporation");
MODULE_LICENSE("GPL");
MODULE_DESCRIPTION("xe live kunit tests");
diff --git a/drivers/gpu/drm/xe/xe_eudebug.c b/drivers/gpu/drm/xe/xe_eudebug.c
index a24b6e553383..5ec9dac9edd5 100644
--- a/drivers/gpu/drm/xe/xe_eudebug.c
+++ b/drivers/gpu/drm/xe/xe_eudebug.c
@@ -3887,3 +3887,7 @@ xe_eudebug_vm_open_ioctl(struct xe_eudebug *d, unsigned long arg)
return ret;
}
+
+#if IS_ENABLED(CONFIG_DRM_XE_KUNIT_TEST)
+#include "tests/xe_eudebug.c"
+#endif
--
2.46.1
^ permalink raw reply related [flat|nested] 28+ messages in thread* [RFC 19/19] drm/xe/eudebug: Support EU online debug on pagefault
2024-10-21 9:58 [RFC 00/19] Support EU online debug on pagefault Gwan-gyeong Mun
` (17 preceding siblings ...)
2024-10-21 9:58 ` [RFC 18/19] drm/xe/eudebug_test: Introduce xe_eudebug wa kunit test Gwan-gyeong Mun
@ 2024-10-21 9:58 ` Gwan-gyeong Mun
2024-10-24 14:24 ` Nirmoy Das
2024-10-21 10:07 ` ✓ CI.Patch_applied: success for " Patchwork
` (6 subsequent siblings)
25 siblings, 1 reply; 28+ messages in thread
From: Gwan-gyeong Mun @ 2024-10-21 9:58 UTC (permalink / raw)
To: intel-xe
Cc: nirmoy.das, matthew.brost, stuart.summers, christoph.manszewski,
mika.kuoppala, dominik.grzegorzek, andrzej.hajda,
maciej.patelczyk
When the EU debugger is connected, if a page fault occurs,
the DRM_XE_EUDEBUG_EVENT_PAGEFAULT event is passed to the client
connected to the debugger after handling the pagefault WA.
The pagefault WA is a mechanism that allows a stalled EU thread to enter
SIP mode by installing a temporary page in the page table for the ppgtt
address where the pagefault occurred.
The pagefault eudebug event passed to the client follows the newly added
struct drm_xe_eudebug_event_pagefault type.
When a pagefault occurs, it prevents to send the
DRM_XE_EUDEBUG_EVENT_EU_ATTENTION event to the client during
pagefault WA processing.
The page fault event delivery follows the below policy.
(1) If EU Debugger discovery has been completed, pagefault handler delivers
pagefault event directly.
(2) If a pagefault occurs during eu debugger discovery process, pagefault
handler queues a pagefault event and sends the queued event when
discovery is completed
The thread where the pagefault occurred will be notified only once,
for an event with the DRM_XE_EUDEBUG_EVENT_PAGEFAULT event type.
Information about EU threads where a pagefault occurred is passed to the
client only once for each event with the
DRM_XE_EUDEBUG_EVENT_PAGEFAULT event type.
Of course, if a pagefault occurs for a new thread, a new pagefault event
will be passed to the client. It is also possible that a pagefault WA for
multiple EU threads is processed and delivered for a single pagefault event
The eu attention event is sent by the attention workqueue whenever the
attention bit is turned on, and the eu attention event is also delivered
to the client when the attention bit is turned on by a pagefault event.
In this case, the pagefault event is always processed before
the eu attention event.
And when the client receives the eu attention event, the client can
spot the thread where the page fault occurred as a previously
delivered event, so it can spot that the attention bit is turned on by
the breakpoint for threads other than the thread where the page fault
occurred.
Adding a temporary null page follows [1].
A brief description of the page fault handling mechanism flow between KMD
and the eu thread is as follows
(1) EU Thread accesses unallocated memory
(2) Pagefault occurs, EU Thread is stopped
(3) XE kmd set an force EU Thread exception to allow the running EU Thread
to enter SIP mode (kmd set ForceException / ForceExternalHalt bit of
TD_CTL register)
EU Threads that are not stopped enter SIP mode
(4) XE kmd installs temporary page at the address where pagefault occurred
of ppgtt pagetable
(5) XE kmd replies Pagefault message to GUC
(6) stopped EU Thread resumes when pagefault is resolved
(7) resumed eu thread enters SIP mode due to force exception set by (3)
[1] https://patchwork.freedesktop.org/patch/555097
Signed-off-by: Gwan-gyeong Mun <gwan-gyeong.mun@intel.com>
---
drivers/gpu/drm/xe/xe_eudebug.c | 254 +++++++++++++++++++++++
drivers/gpu/drm/xe/xe_eudebug.h | 17 ++
drivers/gpu/drm/xe/xe_eudebug_types.h | 66 ++++++
drivers/gpu/drm/xe/xe_gt_debug.c | 48 +++++
drivers/gpu/drm/xe/xe_gt_debug.h | 13 ++
drivers/gpu/drm/xe/xe_gt_pagefault.c | 281 +++++++++++++++++++++++++-
drivers/gpu/drm/xe/xe_vm.c | 21 ++
drivers/gpu/drm/xe/xe_vm.h | 2 +
include/uapi/drm/xe_drm_eudebug.h | 12 ++
9 files changed, 706 insertions(+), 8 deletions(-)
diff --git a/drivers/gpu/drm/xe/xe_eudebug.c b/drivers/gpu/drm/xe/xe_eudebug.c
index 5ec9dac9edd5..4538fa28e755 100644
--- a/drivers/gpu/drm/xe/xe_eudebug.c
+++ b/drivers/gpu/drm/xe/xe_eudebug.c
@@ -236,10 +236,17 @@ static void xe_eudebug_free(struct kref *ref)
{
struct xe_eudebug *d = container_of(ref, typeof(*d), ref);
struct xe_eudebug_event *event;
+ struct xe_eudebug_pagefault *pf, *pf_temp;
while (kfifo_get(&d->events.fifo, &event))
kfree(event);
+ /* Since it's the last reference no race here */
+ list_for_each_entry_safe(pf, pf_temp, &d->pagefaults, list) {
+ xe_exec_queue_put(pf->q);
+ kfree(pf);
+ }
+
xe_eudebug_destroy_resources(d);
put_task_struct(d->target_task);
@@ -590,6 +597,12 @@ xe_eudebug_get(struct xe_file *xef)
return d;
}
+struct xe_eudebug *
+xe_eudebug_get_for_debugger(struct xe_file *xef)
+{
+ return _xe_eudebug_get(xef);
+}
+
static int xe_eudebug_queue_event(struct xe_eudebug *d,
struct xe_eudebug_event *event)
{
@@ -1064,6 +1077,7 @@ static int do_eu_control(struct xe_eudebug *d,
struct xe_device *xe = d->xe;
u8 *bits = NULL;
unsigned int hw_attn_size, attn_size;
+ struct dma_fence *pagefault_fence;
struct xe_exec_queue *q;
struct xe_file *xef;
struct xe_lrc *lrc;
@@ -1129,6 +1143,23 @@ static int do_eu_control(struct xe_eudebug *d,
ret = -EINVAL;
mutex_lock(&d->eu_lock);
+ rcu_read_lock();
+ pagefault_fence = dma_fence_get_rcu_safe(&d->pagefault_fence);
+ rcu_read_unlock();
+
+ while (pagefault_fence) {
+ mutex_unlock(&d->eu_lock);
+ ret = dma_fence_wait(pagefault_fence, true);
+ dma_fence_put(pagefault_fence);
+
+ if (ret)
+ goto out_free;
+
+ mutex_lock(&d->eu_lock);
+ rcu_read_lock();
+ pagefault_fence = dma_fence_get_rcu_safe(&d->pagefault_fence);
+ rcu_read_unlock();
+ }
switch (arg->cmd) {
case DRM_XE_EUDEBUG_EU_CONTROL_CMD_INTERRUPT_ALL:
@@ -2008,6 +2039,8 @@ xe_eudebug_connect(struct xe_device *xe,
kref_init(&d->ref);
spin_lock_init(&d->connection.lock);
mutex_init(&d->eu_lock);
+ mutex_init(&d->pf_lock);
+ INIT_LIST_HEAD(&d->pagefaults);
init_waitqueue_head(&d->events.write_done);
init_waitqueue_head(&d->events.read_done);
init_completion(&d->discovery);
@@ -3359,6 +3392,8 @@ static void discover_clients(struct xe_device *xe, struct xe_eudebug *d)
}
}
+static int xe_eudebug_handle_pagefault_list(struct xe_eudebug *d);
+
static void discovery_work_fn(struct work_struct *work)
{
struct xe_eudebug *d = container_of(work, typeof(*d),
@@ -3383,6 +3418,8 @@ static void discovery_work_fn(struct work_struct *work)
up_write(&xe->eudebug.discovery_lock);
+ xe_eudebug_handle_pagefault_list(d);
+
xe_eudebug_put(d);
}
@@ -3888,6 +3925,223 @@ xe_eudebug_vm_open_ioctl(struct xe_eudebug *d, unsigned long arg)
return ret;
}
+struct xe_exec_queue *
+xe_eudebug_runalone_active_debuggable_queue_get(struct xe_gt *gt, int *lrc_idx)
+{
+ struct xe_exec_queue *q;
+ int idx;
+
+ q = runalone_active_queue_get(gt, &idx);
+ if (IS_ERR(q))
+ return q;
+
+ if (!xe_exec_queue_is_debuggable(q)) {
+ xe_exec_queue_put(q);
+ return ERR_PTR(-EPERM);
+ }
+
+ *lrc_idx = idx;
+
+ return q;
+}
+
+void xe_eudebug_attention_scan_pause(struct xe_gt *gt)
+{
+ attention_scan_cancel(gt_to_xe(gt));
+}
+
+void xe_eudebug_attention_scan_resume(struct xe_gt *gt)
+{
+ attention_scan_flush(gt_to_xe(gt));
+}
+
+static int send_pagefault_event(struct xe_eudebug *d, struct xe_eudebug_pagefault *pf)
+{
+ struct xe_eudebug_event_pagefault *ep;
+ struct xe_eudebug_event *event;
+ int h_c, h_queue, h_lrc;
+ u32 size = xe_gt_eu_attention_bitmap_size(pf->q->gt) * 3;
+ u32 sz = struct_size(ep, bitmask, size);
+
+ XE_WARN_ON(pf->lrc_idx < 0 || pf->lrc_idx >= pf->q->width);
+
+ XE_WARN_ON(!xe_exec_queue_is_debuggable(pf->q));
+
+ h_c = find_handle(d->res, XE_EUDEBUG_RES_TYPE_CLIENT, pf->q->vm->xef);
+ if (h_c < 0)
+ return h_c;
+
+ h_queue = find_handle(d->res, XE_EUDEBUG_RES_TYPE_EXEC_QUEUE, pf->q);
+ if (h_queue < 0)
+ return h_queue;
+
+ h_lrc = find_handle(d->res, XE_EUDEBUG_RES_TYPE_LRC, pf->q->lrc[pf->lrc_idx]);
+ if (h_lrc < 0)
+ return h_lrc;
+
+ event = __xe_eudebug_create_event(d, 0, DRM_XE_EUDEBUG_EVENT_PAGEFAULT,
+ 0, sz, GFP_KERNEL);
+
+ if (!event)
+ return -ENOSPC;
+
+ ep = cast_event(ep, event);
+ write_member(struct xe_eudebug_event_pagefault, ep, client_handle, (u64)h_c);
+ write_member(struct xe_eudebug_event_pagefault, ep, exec_queue_handle, (u64)h_queue);
+ write_member(struct xe_eudebug_event_pagefault, ep, lrc_handle, (u64)h_lrc);
+ write_member(struct xe_eudebug_event_pagefault, ep, bitmask_size, size);
+ write_member(struct xe_eudebug_event_pagefault, ep, page_fault_address, pf->fault.addr);
+
+ memcpy(ep->bitmask, pf->attentions.before.att, pf->attentions.before.size);
+ memcpy(ep->bitmask + pf->attentions.before.size,
+ pf->attentions.after.att, pf->attentions.after.size);
+ memcpy(ep->bitmask + pf->attentions.before.size + pf->attentions.after.size,
+ pf->attentions.resolved.att, pf->attentions.resolved.size);
+
+ event->seqno = atomic_long_inc_return(&d->events.seqno);
+
+ return xe_eudebug_queue_event(d, event);
+}
+
+static int xe_eudebug_queue_page_fault(struct xe_gt *gt, struct xe_eudebug_pagefault *pf)
+{
+ struct xe_eudebug *d;
+ struct xe_exec_queue *q;
+ int ret, lrc_idx;
+
+ if (list_empty_careful(>_to_xe(gt)->eudebug.list))
+ return -ENOTCONN;
+
+ q = runalone_active_queue_get(gt, &lrc_idx);
+ if (IS_ERR(q))
+ return PTR_ERR(q);
+
+ if (!xe_exec_queue_is_debuggable(q)) {
+ ret = -EPERM;
+ goto out_exec_queue_put;
+ }
+
+ d = _xe_eudebug_get(q->vm->xef);
+ if (!d) {
+ ret = -ENOTCONN;
+ goto out_exec_queue_put;
+ }
+
+ if (!completion_done(&d->discovery)) {
+ eu_dbg(d, "discovery not yet done\n");
+ ret = -EBUSY;
+ goto out_eudebug_put;
+ }
+
+ ret = send_pagefault_event(d, pf);
+ if (ret)
+ xe_eudebug_disconnect(d, ret);
+
+out_eudebug_put:
+ xe_eudebug_put(d);
+out_exec_queue_put:
+ xe_exec_queue_put(q);
+
+ return ret;
+}
+
+static int xe_eudebug_add_pagefault_list(struct xe_gt *gt, struct xe_eudebug_pagefault *pf)
+{
+ struct xe_eudebug *d;
+
+ if (list_empty_careful(>_to_xe(gt)->eudebug.list))
+ return -ENOTCONN;
+
+ d = _xe_eudebug_get(pf->q->vm->xef);
+ if (IS_ERR_OR_NULL(d))
+ return -EINVAL;
+
+ mutex_lock(&d->pf_lock);
+ list_add_tail(&pf->list, &d->pagefaults);
+ mutex_unlock(&d->pf_lock);
+
+ xe_eudebug_put(d);
+
+ return 0;
+}
+
+static int xe_eudebug_handle_pagefault_list(struct xe_eudebug *d)
+{
+ struct xe_eudebug_pagefault *pf, *pf_temp;
+ int ret = 0;
+
+ mutex_lock(&d->pf_lock);
+ list_for_each_entry_safe(pf, pf_temp, &d->pagefaults, list) {
+ struct xe_gt *gt =pf->q->gt;
+
+ ret = xe_eudebug_queue_page_fault(gt, pf);
+ /* decrease the reference count of xe_exec_queue obtained from pagefault handler */
+ xe_exec_queue_put(pf->q);
+ list_del(&pf->list);
+ kfree(pf);
+
+ if (ret)
+ break;
+ }
+ mutex_unlock(&d->pf_lock);
+
+ return ret;
+}
+
+int xe_eudebug_handle_page_fault(struct xe_gt *gt, struct xe_eudebug_pagefault *pf)
+{
+ int ret;
+
+ ret = xe_eudebug_queue_page_fault(gt, pf);
+
+ /* if debugger discovery is not completed, queue pagefault */
+ if (ret == -EBUSY) {
+ ret = xe_eudebug_add_pagefault_list(gt, pf);
+ if (!ret)
+ goto out;
+ }
+
+ xe_exec_queue_put(pf->q);
+ kfree(pf);
+
+out:
+ return ret;
+}
+
+static const char *
+eudebug_pagefault_get_driver_name(struct dma_fence *dma_fence)
+{
+ return "xe";
+}
+
+static const char *
+eudebug_pagefault_fence_get_timeline_name(struct dma_fence *dma_fence)
+{
+ return "eudebug_pagefault_fence";
+}
+
+static const struct dma_fence_ops eudebug_pagefault_fence_ops = {
+ .get_driver_name = eudebug_pagefault_get_driver_name,
+ .get_timeline_name = eudebug_pagefault_fence_get_timeline_name,
+};
+
+struct xe_eudebug_pagefault_fence *
+xe_eudebug_pagefault_fence_create(void)
+{
+ struct xe_eudebug_pagefault_fence *fence;
+
+ fence = kzalloc(sizeof(*fence), GFP_KERNEL);
+ if (fence == NULL)
+ return NULL;
+
+ spin_lock_init(&fence->lock);
+ dma_fence_init(&fence->base, &eudebug_pagefault_fence_ops,
+ &fence->lock,
+ dma_fence_context_alloc(1), 1);
+
+ return fence;
+}
+
#if IS_ENABLED(CONFIG_DRM_XE_KUNIT_TEST)
#include "tests/xe_eudebug.c"
#endif
diff --git a/drivers/gpu/drm/xe/xe_eudebug.h b/drivers/gpu/drm/xe/xe_eudebug.h
index 403f52148da3..0a969cf8e515 100644
--- a/drivers/gpu/drm/xe/xe_eudebug.h
+++ b/drivers/gpu/drm/xe/xe_eudebug.h
@@ -11,6 +11,7 @@ struct drm_device;
struct drm_file;
struct xe_device;
struct xe_file;
+struct xe_gt;
struct xe_vm;
struct xe_vma;
struct xe_exec_queue;
@@ -18,6 +19,8 @@ struct xe_hw_engine;
struct xe_user_fence;
struct xe_debug_metadata;
struct drm_gpuva_ops;
+struct xe_eudebug_pagefault;
+struct xe_eudebug_pagefault_fence;
#if IS_ENABLED(CONFIG_DRM_XE_EUDEBUG)
@@ -48,11 +51,18 @@ void xe_eudebug_ufence_init(struct xe_user_fence *ufence, struct xe_file *xef, s
void xe_eudebug_ufence_fini(struct xe_user_fence *ufence);
struct xe_eudebug *xe_eudebug_get(struct xe_file *xef);
+struct xe_eudebug *xe_eudebug_get_for_debugger(struct xe_file *xef);
void xe_eudebug_put(struct xe_eudebug *d);
void xe_eudebug_debug_metadata_create(struct xe_file *xef, struct xe_debug_metadata *m);
void xe_eudebug_debug_metadata_destroy(struct xe_file *xef, struct xe_debug_metadata *m);
+struct xe_exec_queue *xe_eudebug_runalone_active_debuggable_queue_get(struct xe_gt *gt, int *lrc_idx);
+void xe_eudebug_attention_scan_pause(struct xe_gt *gt);
+void xe_eudebug_attention_scan_resume(struct xe_gt *gt);
+int xe_eudebug_handle_page_fault(struct xe_gt *gt, struct xe_eudebug_pagefault *d_pf);
+struct xe_eudebug_pagefault_fence *xe_eudebug_pagefault_fence_create(void);
+
#else
static inline int xe_eudebug_connect_ioctl(struct drm_device *dev,
@@ -83,11 +93,18 @@ static inline void xe_eudebug_ufence_init(struct xe_user_fence *ufence, struct x
static inline void xe_eudebug_ufence_fini(struct xe_user_fence *ufence) { }
static inline struct xe_eudebug *xe_eudebug_get(struct xe_file *xef) { return NULL; }
+static inline struct xe_eudebug *xe_eudebug_get_for_debugger(struct xe_file *xef) { return NULL; }
static inline void xe_eudebug_put(struct xe_eudebug *d) { }
static inline void xe_eudebug_debug_metadata_create(struct xe_file *xef, struct xe_debug_metadata *m) { }
static inline void xe_eudebug_debug_metadata_destroy(struct xe_file *xef, struct xe_debug_metadata *m) { }
+static inline struct xe_exec_queue *xe_eudebug_runalone_active_debuggable_queue_get(struct xe_gt *gt, int *lrc_idx) { return NULL; }
+static inline void xe_eudebug_attention_scan_pause(struct xe_gt *gt) { }
+static inline void xe_eudebug_attention_scan_resume(struct xe_gt *gt) { }
+static inline int xe_eudebug_handle_page_fault(struct xe_gt *gt, struct xe_eudebug_pagefault *d_pf) { return 0; }
+static inline struct xe_eudebug_pagefault_fence *xe_eudebug_pagefault_fence_create(void) { return NULL; }
+
#endif /* CONFIG_DRM_XE_EUDEBUG */
#endif
diff --git a/drivers/gpu/drm/xe/xe_eudebug_types.h b/drivers/gpu/drm/xe/xe_eudebug_types.h
index b79d4c078216..7c05abf19f26 100644
--- a/drivers/gpu/drm/xe/xe_eudebug_types.h
+++ b/drivers/gpu/drm/xe/xe_eudebug_types.h
@@ -16,6 +16,8 @@
#include <uapi/drm/xe_drm.h>
+#include "xe_gt_debug.h"
+
struct xe_device;
struct task_struct;
struct xe_eudebug;
@@ -161,6 +163,10 @@ struct xe_eudebug {
/** @ops operations for eu_control */
struct xe_eudebug_eu_control_ops *ops;
+
+ struct mutex pf_lock;
+ struct list_head pagefaults;
+ struct dma_fence __rcu *pagefault_fence;
};
/**
@@ -325,4 +331,64 @@ struct xe_eudebug_event_vm_bind_op_metadata {
u64 metadata_cookie;
};
+/**
+ * struct xe_eudebug_event_pagefault - Internal event for EU Pagefault
+ */
+struct xe_eudebug_event_pagefault {
+ /** @base: base event */
+ struct xe_eudebug_event base;
+
+ /** @client_handle: client for the Pagefault */
+ u64 client_handle;
+
+ /** @exec_queue_handle: handle of exec_queue which raised Pagefault */
+ u64 exec_queue_handle;
+
+ /** @lrc_handle: lrc handle of the workload which raised Pagefault */
+ u64 lrc_handle;
+
+ /** @flags: eu Pagefault event flags, currently MBZ */
+ u32 flags;
+
+ /**
+ * @bitmask_size: sum of size before/after/resolved att bits.
+ * It has three times the size of xe_eudebug_event_eu_attention.bitmask_size.
+ */
+ u32 bitmask_size;
+
+ /** @page_fault_address: The ppgtt address where the Pagefault occurred */
+ u64 page_fault_address;
+
+ /**
+ * @bitmask: Bitmask of thread attentions starting from natural,
+ * hardware order of DSS=0, eu=0, 8 attention bits per eu.
+ * The order of the bitmask array is before, after, resolved.
+ */
+ u8 bitmask[];
+};
+
+struct xe_eudebug_pagefault {
+ struct list_head list;
+ struct xe_exec_queue *q;
+ int lrc_idx;
+
+ struct {
+ u64 addr;
+ int type;
+ int level;
+ int access;
+ } fault;
+
+ struct {
+ struct xe_eu_attentions before;
+ struct xe_eu_attentions after;
+ struct xe_eu_attentions resolved;
+ } attentions;
+};
+
+struct xe_eudebug_pagefault_fence {
+ struct dma_fence base;
+ spinlock_t lock;
+};
+
#endif
diff --git a/drivers/gpu/drm/xe/xe_gt_debug.c b/drivers/gpu/drm/xe/xe_gt_debug.c
index 25013e902cbe..07bb0364abf8 100644
--- a/drivers/gpu/drm/xe/xe_gt_debug.c
+++ b/drivers/gpu/drm/xe/xe_gt_debug.c
@@ -3,6 +3,7 @@
* Copyright © 2023 Intel Corporation
*/
+#include <linux/delay.h>
#include "regs/xe_gt_regs.h"
#include "xe_device.h"
#include "xe_force_wake.h"
@@ -149,3 +150,50 @@ int xe_gt_eu_threads_needing_attention(struct xe_gt *gt)
return err < 0 ? 0 : err;
}
+
+static inline unsigned int
+xe_eu_attentions_count(const struct xe_eu_attentions *a)
+{
+ return bitmap_weight((void *)a->att, a->size * BITS_PER_BYTE);
+}
+
+void xe_gt_eu_attentions_read(struct xe_gt *gt,
+ struct xe_eu_attentions *a,
+ const unsigned int settle_time_ms)
+{
+ unsigned int prev = 0;
+ ktime_t end, now;
+
+ now = ktime_get_raw();
+ end = ktime_add_ms(now, settle_time_ms);
+
+ a->ts = 0;
+ a->size = min_t(int,
+ xe_gt_eu_attention_bitmap_size(gt),
+ sizeof(a->att));
+
+ do {
+ unsigned int attn;
+
+ xe_gt_eu_attention_bitmap(gt, a->att, a->size);
+ attn = xe_eu_attentions_count(a);
+
+ now = ktime_get_raw();
+
+ if (a->ts == 0)
+ a->ts = now;
+ else if (attn && attn != prev)
+ a->ts = now;
+
+ prev = attn;
+
+ if (settle_time_ms)
+ udelay(5);
+
+ /*
+ * XXX We are gathering data for production SIP to find
+ * the upper limit of settle time. For now, we wait full
+ * timeout value regardless.
+ */
+ } while (ktime_before(now, end));
+}
\ No newline at end of file
diff --git a/drivers/gpu/drm/xe/xe_gt_debug.h b/drivers/gpu/drm/xe/xe_gt_debug.h
index 342082699ff6..3123c15775bc 100644
--- a/drivers/gpu/drm/xe/xe_gt_debug.h
+++ b/drivers/gpu/drm/xe/xe_gt_debug.h
@@ -12,6 +12,15 @@
#define XE_GT_ATTENTION_TIMEOUT_MS 100
+struct xe_eu_attentions {
+#define XE_MAX_EUS 1024
+#define XE_MAX_THREADS 8
+
+ u8 att[XE_MAX_EUS * XE_MAX_THREADS / BITS_PER_BYTE];
+ unsigned int size;
+ ktime_t ts;
+};
+
int xe_gt_eu_threads_needing_attention(struct xe_gt *gt);
int xe_gt_foreach_dss_group_instance(struct xe_gt *gt,
int (*fn)(struct xe_gt *gt,
@@ -24,4 +33,8 @@ int xe_gt_eu_attention_bitmap_size(struct xe_gt *gt);
int xe_gt_eu_attention_bitmap(struct xe_gt *gt, u8 *bits,
unsigned int bitmap_size);
+void xe_gt_eu_attentions_read(struct xe_gt *gt,
+ struct xe_eu_attentions *a,
+ const unsigned int settle_time_ms);
+
#endif
diff --git a/drivers/gpu/drm/xe/xe_gt_pagefault.c b/drivers/gpu/drm/xe/xe_gt_pagefault.c
index 79c426dc2505..aa3e2f1b0b43 100644
--- a/drivers/gpu/drm/xe/xe_gt_pagefault.c
+++ b/drivers/gpu/drm/xe/xe_gt_pagefault.c
@@ -7,14 +7,23 @@
#include <linux/bitfield.h>
#include <linux/circ_buf.h>
+#include <linux/delay.h>
+#include <linux/dma-fence.h>
#include <drm/drm_exec.h>
#include <drm/drm_managed.h>
#include <drm/ttm/ttm_execbuf_util.h>
#include "abi/guc_actions_abi.h"
+#include "regs/xe_gt_regs.h"
#include "xe_bo.h"
+#include "xe_exec_queue.h"
+#include "xe_eudebug.h"
+#include "xe_eudebug_types.h"
+#include "xe_force_wake.h"
#include "xe_gt.h"
+#include "xe_gt_debug.h"
+#include "xe_gt_mcr.h"
#include "xe_gt_tlb_invalidation.h"
#include "xe_guc.h"
#include "xe_guc_ct.h"
@@ -200,12 +209,206 @@ static struct xe_vm *asid_to_vm(struct xe_device *xe, u32 asid)
return vm;
}
-static int handle_pagefault(struct xe_gt *gt, struct pagefault *pf)
+static struct xe_eudebug_pagefault *
+get_eudebug_pagefault(struct xe_gt *gt, struct xe_vm *vm, struct pagefault *pf)
{
- struct xe_device *xe = gt_to_xe(gt);
+ struct xe_eudebug_pagefault_fence *pagefault_fence;
+ struct xe_eudebug_pagefault *eudebug_pagefault;
+ struct xe_vma *vma = NULL;
+ struct xe_exec_queue *q;
+ struct dma_fence *fence;
+ struct xe_eudebug *d;
+ unsigned int fw_ref;
+ int lrc_idx;
+ u32 td_ctl;
+
+ down_read(&vm->lock);
+ vma = lookup_vma(vm, pf->page_addr);
+ up_read(&vm->lock);
+
+ if (vma)
+ return NULL;
+
+ d = xe_eudebug_get_for_debugger(vm->xef);
+ if (!d)
+ return NULL;
+
+ q = xe_eudebug_runalone_active_debuggable_queue_get(gt, &lrc_idx);
+ if (IS_ERR(q))
+ goto err_put_eudebug;
+
+ fw_ref = xe_force_wake_get(gt_to_fw(gt), q->hwe->domain);
+ if (!fw_ref)
+ goto err_put_exec_queue;
+
+ /*
+ * If there is no debug functionality (TD_CTL_GLOBAL_DEBUG_ENABLE, etc.),
+ * don't proceed pagefault routine for eu debugger.
+ */
+
+ td_ctl = xe_gt_mcr_unicast_read_any(gt, TD_CTL);
+ if (!td_ctl)
+ goto err_put_fw;
+
+ eudebug_pagefault = kzalloc(sizeof(*eudebug_pagefault), GFP_KERNEL);
+ if (!eudebug_pagefault)
+ goto err_put_fw;
+
+ xe_eudebug_attention_scan_pause(gt);
+
+ mutex_lock(&d->eu_lock);
+ rcu_read_lock();
+ fence = dma_fence_get_rcu_safe(&d->pagefault_fence);
+ rcu_read_unlock();
+
+ if (fence) {
+ /*
+ * TODO: If the new incoming pagefaulted address is different
+ * from the pagefaulted address it is currently handling on the
+ * same ASID, it needs a routine to wait here and then do the
+ * following pagefault.
+ */
+ dma_fence_put(fence);
+ goto err_unlock_eu_lock;
+ }
+
+ pagefault_fence = xe_eudebug_pagefault_fence_create();
+ if (!pagefault_fence) {
+ goto err_unlock_eu_lock;
+ }
+
+ d->pagefault_fence = &pagefault_fence->base;
+ mutex_unlock(&d->eu_lock);
+
+ INIT_LIST_HEAD(&eudebug_pagefault->list);
+
+ xe_gt_eu_attentions_read(gt, &eudebug_pagefault->attentions.before, 0);
+
+ /* Halt on next thread dispatch */
+ while (!(td_ctl & TD_CTL_FORCE_EXTERNAL_HALT)) {
+ xe_gt_mcr_multicast_write(gt, TD_CTL,
+ td_ctl | TD_CTL_FORCE_EXTERNAL_HALT);
+ /*
+ * The sleep is needed because some interrupts are ignored
+ * by the HW, hence we allow the HW some time to acknowledge
+ * that.
+ */
+ udelay(200);
+ td_ctl = xe_gt_mcr_unicast_read_any(gt, TD_CTL);
+ }
+
+ /* Halt regardless of thread dependencies */
+ while (!(td_ctl & TD_CTL_FORCE_EXCEPTION)) {
+ xe_gt_mcr_multicast_write(gt, TD_CTL,
+ td_ctl | TD_CTL_FORCE_EXCEPTION);
+ udelay(200);
+ td_ctl = xe_gt_mcr_unicast_read_any(gt, TD_CTL);
+ }
+
+ xe_gt_eu_attentions_read(gt, &eudebug_pagefault->attentions.after,
+ XE_GT_ATTENTION_TIMEOUT_MS);
+
+ /*
+ * xe_exec_queue_put() will be called from release_eudebug_pagefault()
+ * or xe_eudebug_handle_page_fault()
+ */
+ eudebug_pagefault->q = q;
+ eudebug_pagefault->lrc_idx = lrc_idx;
+ eudebug_pagefault->fault.addr = pf->page_addr;
+ eudebug_pagefault->fault.type = pf->fault_type;
+ eudebug_pagefault->fault.level = pf->fault_level;
+ eudebug_pagefault->fault.access = pf->access_type;
+
+ xe_force_wake_put(gt_to_fw(gt), fw_ref);
+ xe_eudebug_put(d);
+
+ return eudebug_pagefault;
+
+err_unlock_eu_lock:
+ mutex_unlock(&d->eu_lock);
+ xe_eudebug_attention_scan_resume(gt);
+ kfree(eudebug_pagefault);
+err_put_fw:
+ xe_force_wake_put(gt_to_fw(gt), fw_ref);
+err_put_exec_queue:
+ xe_exec_queue_put(q);
+err_put_eudebug:
+ xe_eudebug_put(d);
+
+ return NULL;
+}
+
+static void
+release_eudebug_pagefault(struct xe_gt *gt, struct xe_vm *vm,
+ struct xe_eudebug_pagefault *eudebug_pagefault,
+ bool send_event)
+{
+ struct xe_eudebug *d;
+ unsigned int fw_ref;
+ u32 td_ctl;
+
+ fw_ref = xe_force_wake_get(gt_to_fw(gt), eudebug_pagefault->q->hwe->domain);
+ if (!fw_ref) {
+ struct xe_device *xe = gt_to_xe(gt);
+ drm_warn(&xe->drm, "Forcewake fail: Can not recover TD_CTL");
+ } else {
+ td_ctl = xe_gt_mcr_unicast_read_any(gt, TD_CTL);
+ xe_gt_mcr_multicast_write(gt, TD_CTL, td_ctl &
+ ~(TD_CTL_FORCE_EXTERNAL_HALT | TD_CTL_FORCE_EXCEPTION));
+ xe_force_wake_put(gt_to_fw(gt), fw_ref);
+ }
+
+ if (send_event)
+ xe_eudebug_handle_page_fault(gt, eudebug_pagefault);
+
+ d = xe_eudebug_get_for_debugger(vm->xef);
+ if (d) {
+ struct dma_fence *fence;
+
+ mutex_lock(&d->eu_lock);
+ rcu_read_lock();
+ fence = dma_fence_get_rcu_safe(&d->pagefault_fence);
+ rcu_read_unlock();
+
+ if (fence) {
+ if (send_event)
+ dma_fence_signal(fence);
+
+ dma_fence_put(fence); /* deref for dma_fence_get_rcu_safe() */
+ dma_fence_put(fence); /* defef for dma_fence_init() */
+ }
+
+ d->pagefault_fence = NULL;
+ mutex_unlock(&d->eu_lock);
+
+ xe_eudebug_put(d);
+ }
+
+ if (!send_event) {
+ xe_exec_queue_put(eudebug_pagefault->q);
+ kfree(eudebug_pagefault);
+ }
+
+ xe_eudebug_attention_scan_resume(gt);
+}
+
+static void
+handle_eu_debug_pagefault(struct xe_gt *gt, struct xe_eudebug_pagefault *d_pf)
+{
+ xe_gt_eu_attentions_read(gt, &d_pf->attentions.resolved,
+ XE_GT_ATTENTION_TIMEOUT_MS);
+}
+
+static int handle_pagefault_start(struct xe_gt *gt, struct pagefault *pf,
+ struct xe_vm **pf_vm,
+ struct xe_eudebug_pagefault **d_pf)
+{
+ struct xe_eudebug_pagefault *eudebug_pf;
struct xe_tile *tile = gt_to_tile(gt);
- struct xe_vm *vm;
+ struct xe_device *xe = gt_to_xe(gt);
+ bool rel_eudebug_pf = false;
struct xe_vma *vma = NULL;
+ struct xe_vm *vm;
int err;
/* SW isn't expected to handle TRTT faults */
@@ -216,6 +419,8 @@ static int handle_pagefault(struct xe_gt *gt, struct pagefault *pf)
if (IS_ERR(vm))
return PTR_ERR(vm);
+ eudebug_pf = get_eudebug_pagefault(gt, vm, pf);
+
/*
* TODO: Change to read lock? Using write lock for simplicity.
*/
@@ -228,8 +433,27 @@ static int handle_pagefault(struct xe_gt *gt, struct pagefault *pf)
vma = lookup_vma(vm, pf->page_addr);
if (!vma) {
- err = -EINVAL;
- goto unlock_vm;
+ if (eudebug_pf)
+ vma = xe_vm_create_scratch_vma(vm, pf->page_addr);
+
+
+ if (IS_ERR_OR_NULL(vma)) {
+ err = -EINVAL;
+ if (eudebug_pf)
+ rel_eudebug_pf = true;
+
+ goto unlock_vm;
+ }
+ } else {
+ /*
+ * When creating an instance of eudebug_pagefault, there was
+ * no vma containing the ppgtt address where the pagefault occurred,
+ * but when reacquiring vm->lock, there is.
+ * During not aquiring the vm->lock from this context,
+ * but vma corresponding to the address where the pagefault occurred
+ * in another context has allocated.*/
+ if (eudebug_pf)
+ rel_eudebug_pf = true;
}
err = handle_vma_pagefault(tile, pf, vma);
@@ -238,11 +462,44 @@ static int handle_pagefault(struct xe_gt *gt, struct pagefault *pf)
if (!err)
vm->usm.last_fault_vma = vma;
up_write(&vm->lock);
- xe_vm_put(vm);
+
+ if (rel_eudebug_pf) {
+ release_eudebug_pagefault(gt, vm, eudebug_pf, false);
+ *d_pf = NULL;
+ } else {
+ *d_pf = eudebug_pf;
+ }
+
+ /* For the lifetime of the eudebug pagefault instance, keep the VM instance.*/
+ if (!*d_pf) {
+ xe_vm_put(vm);
+ *pf_vm = NULL;
+ }
+ else {
+ *pf_vm = vm;
+ }
return err;
}
+static void handle_pagefault_end(struct xe_gt *gt, struct xe_vm *pf_vm,
+ struct xe_eudebug_pagefault *d_pf)
+{
+ /* if there no eudebug_pagefault then return */
+ if (!d_pf)
+ return;
+
+ handle_eu_debug_pagefault(gt, d_pf);
+
+ /*
+ * TODO: Remove VMA added to handle eudebug pagefault
+ */
+
+ release_eudebug_pagefault(gt, pf_vm, d_pf, true);
+
+ xe_vm_put(pf_vm);
+}
+
static int send_pagefault_reply(struct xe_guc *guc,
struct xe_guc_pagefault_reply *reply)
{
@@ -368,7 +625,10 @@ static void pf_queue_work_func(struct work_struct *w)
threshold = jiffies + msecs_to_jiffies(USM_QUEUE_MAX_RUNTIME_MS);
while (get_pagefault(pf_queue, &pf)) {
- ret = handle_pagefault(gt, &pf);
+ struct xe_eudebug_pagefault *d_pf = NULL;
+ struct xe_vm *pf_vm = NULL;
+
+ ret = handle_pagefault_start(gt, &pf, &pf_vm, &d_pf);
if (unlikely(ret)) {
print_pagefault(xe, &pf);
pf.fault_unsuccessful = 1;
@@ -386,7 +646,12 @@ static void pf_queue_work_func(struct work_struct *w)
FIELD_PREP(PFR_ENG_CLASS, pf.engine_class) |
FIELD_PREP(PFR_PDATA, pf.pdata);
- send_pagefault_reply(>->uc.guc, &reply);
+ ret = send_pagefault_reply(>->uc.guc, &reply);
+ if (unlikely(ret)) {
+ drm_dbg(&xe->drm, "GuC Pagefault reply failed: %d\n", ret);
+ }
+
+ handle_pagefault_end(gt, pf_vm, d_pf);
if (time_after(jiffies, threshold) &&
pf_queue->tail != pf_queue->head) {
diff --git a/drivers/gpu/drm/xe/xe_vm.c b/drivers/gpu/drm/xe/xe_vm.c
index e3e8bce11e3d..bbbff17b90f9 100644
--- a/drivers/gpu/drm/xe/xe_vm.c
+++ b/drivers/gpu/drm/xe/xe_vm.c
@@ -3555,3 +3555,24 @@ int xe_uvma_access(struct xe_userptr_vma *uvma, u64 offset,
up_read(&vm->userptr.notifier_lock);
return ret;
}
+
+struct xe_vma *xe_vm_create_scratch_vma(struct xe_vm *vm, u64 addr)
+{
+ struct xe_vma *vma;
+ int err;
+
+ if (xe_vm_is_closed_or_banned(vm))
+ return ERR_PTR(-ENOENT);
+
+ vma = xe_vma_create(vm, NULL, 0, addr, addr + SZ_64K - 1, 0, VMA_CREATE_FLAG_IS_NULL);
+ if (IS_ERR_OR_NULL(vma))
+ return vma;
+
+ err = xe_vm_insert_vma(vm, vma);
+ if (err) {
+ xe_vma_destroy_late(vma);
+ return ERR_PTR(err);
+ }
+
+ return vma;
+}
diff --git a/drivers/gpu/drm/xe/xe_vm.h b/drivers/gpu/drm/xe/xe_vm.h
index 99b9a9b011de..3ac446cd3b89 100644
--- a/drivers/gpu/drm/xe/xe_vm.h
+++ b/drivers/gpu/drm/xe/xe_vm.h
@@ -284,3 +284,5 @@ void xe_vm_snapshot_free(struct xe_vm_snapshot *snap);
int xe_uvma_access(struct xe_userptr_vma *uvma, u64 offset,
void *buf, u64 len, bool write);
+
+struct xe_vma *xe_vm_create_scratch_vma(struct xe_vm *vm, u64 addr);
diff --git a/include/uapi/drm/xe_drm_eudebug.h b/include/uapi/drm/xe_drm_eudebug.h
index 2ebf21e15f5b..47856ca215ef 100644
--- a/include/uapi/drm/xe_drm_eudebug.h
+++ b/include/uapi/drm/xe_drm_eudebug.h
@@ -37,6 +37,7 @@ struct drm_xe_eudebug_event {
#define DRM_XE_EUDEBUG_EVENT_VM_BIND_UFENCE 8
#define DRM_XE_EUDEBUG_EVENT_METADATA 9
#define DRM_XE_EUDEBUG_EVENT_VM_BIND_OP_METADATA 10
+#define DRM_XE_EUDEBUG_EVENT_PAGEFAULT 11
__u16 flags;
#define DRM_XE_EUDEBUG_EVENT_CREATE (1 << 0)
@@ -218,6 +219,17 @@ struct drm_xe_eudebug_event_vm_bind_op_metadata {
__u64 metadata_cookie;
};
+struct drm_xe_eudebug_event_pagefault {
+ struct drm_xe_eudebug_event base;
+ __u64 client_handle;
+ __u64 exec_queue_handle;
+ __u64 lrc_handle;
+ __u32 flags;
+ __u32 bitmask_size;
+ __u64 pagefault_address;
+ __u8 bitmask[];
+};
+
#if defined(__cplusplus)
}
#endif
--
2.46.1
^ permalink raw reply related [flat|nested] 28+ messages in thread* Re: [RFC 19/19] drm/xe/eudebug: Support EU online debug on pagefault
2024-10-21 9:58 ` [RFC 19/19] drm/xe/eudebug: Support EU online debug on pagefault Gwan-gyeong Mun
@ 2024-10-24 14:24 ` Nirmoy Das
0 siblings, 0 replies; 28+ messages in thread
From: Nirmoy Das @ 2024-10-24 14:24 UTC (permalink / raw)
To: Gwan-gyeong Mun, intel-xe
Cc: nirmoy.das, matthew.brost, stuart.summers, christoph.manszewski,
mika.kuoppala, dominik.grzegorzek, andrzej.hajda,
maciej.patelczyk
[-- Attachment #1: Type: text/plain, Size: 33282 bytes --]
(Just looking at this patch not the whole series)
On 10/21/2024 11:58 AM, Gwan-gyeong Mun wrote:
> When the EU debugger is connected, if a page fault occurs,
> the DRM_XE_EUDEBUG_EVENT_PAGEFAULT event is passed to the client
> connected to the debugger after handling the pagefault WA.
>
> The pagefault WA is a mechanism that allows a stalled EU thread to enter
> SIP mode by installing a temporary page in the page table for the ppgtt
> address where the pagefault occurred.
>
> The pagefault eudebug event passed to the client follows the newly added
> struct drm_xe_eudebug_event_pagefault type.
> When a pagefault occurs, it prevents to send the
> DRM_XE_EUDEBUG_EVENT_EU_ATTENTION event to the client during
> pagefault WA processing.
This patch is big and contains two functionality, event passing to debugger and page fault handling when
debugger is attach. I think this should be split into 2 or more patches.
>
> The page fault event delivery follows the below policy.
> (1) If EU Debugger discovery has been completed, pagefault handler delivers
> pagefault event directly.
> (2) If a pagefault occurs during eu debugger discovery process, pagefault
> handler queues a pagefault event and sends the queued event when
> discovery is completed
>
> The thread where the pagefault occurred will be notified only once,
> for an event with the DRM_XE_EUDEBUG_EVENT_PAGEFAULT event type.
>
> Information about EU threads where a pagefault occurred is passed to the
> client only once for each event with the
> DRM_XE_EUDEBUG_EVENT_PAGEFAULT event type.
> Of course, if a pagefault occurs for a new thread, a new pagefault event
> will be passed to the client. It is also possible that a pagefault WA for
> multiple EU threads is processed and delivered for a single pagefault event
>
> The eu attention event is sent by the attention workqueue whenever the
> attention bit is turned on, and the eu attention event is also delivered
> to the client when the attention bit is turned on by a pagefault event.
> In this case, the pagefault event is always processed before
> the eu attention event.
>
> And when the client receives the eu attention event, the client can
> spot the thread where the page fault occurred as a previously
> delivered event, so it can spot that the attention bit is turned on by
> the breakpoint for threads other than the thread where the page fault
> occurred.
>
> Adding a temporary null page follows [1].
>
> A brief description of the page fault handling mechanism flow between KMD
> and the eu thread is as follows
>
> (1) EU Thread accesses unallocated memory
> (2) Pagefault occurs, EU Thread is stopped
> (3) XE kmd set an force EU Thread exception to allow the running EU Thread
> to enter SIP mode (kmd set ForceException / ForceExternalHalt bit of
> TD_CTL register)
> EU Threads that are not stopped enter SIP mode
> (4) XE kmd installs temporary page at the address where pagefault occurred
> of ppgtt pagetable
> (5) XE kmd replies Pagefault message to GUC
> (6) stopped EU Thread resumes when pagefault is resolved
> (7) resumed eu thread enters SIP mode due to force exception set by (3)
>
> [1] https://patchwork.freedesktop.org/patch/555097
>
> Signed-off-by: Gwan-gyeong Mun <gwan-gyeong.mun@intel.com>
> ---
> drivers/gpu/drm/xe/xe_eudebug.c | 254 +++++++++++++++++++++++
> drivers/gpu/drm/xe/xe_eudebug.h | 17 ++
> drivers/gpu/drm/xe/xe_eudebug_types.h | 66 ++++++
> drivers/gpu/drm/xe/xe_gt_debug.c | 48 +++++
> drivers/gpu/drm/xe/xe_gt_debug.h | 13 ++
> drivers/gpu/drm/xe/xe_gt_pagefault.c | 281 +++++++++++++++++++++++++-
> drivers/gpu/drm/xe/xe_vm.c | 21 ++
> drivers/gpu/drm/xe/xe_vm.h | 2 +
> include/uapi/drm/xe_drm_eudebug.h | 12 ++
> 9 files changed, 706 insertions(+), 8 deletions(-)
>
> diff --git a/drivers/gpu/drm/xe/xe_eudebug.c b/drivers/gpu/drm/xe/xe_eudebug.c
> index 5ec9dac9edd5..4538fa28e755 100644
> --- a/drivers/gpu/drm/xe/xe_eudebug.c
> +++ b/drivers/gpu/drm/xe/xe_eudebug.c
> @@ -236,10 +236,17 @@ static void xe_eudebug_free(struct kref *ref)
> {
> struct xe_eudebug *d = container_of(ref, typeof(*d), ref);
> struct xe_eudebug_event *event;
> + struct xe_eudebug_pagefault *pf, *pf_temp;
>
> while (kfifo_get(&d->events.fifo, &event))
> kfree(event);
>
> + /* Since it's the last reference no race here */
> + list_for_each_entry_safe(pf, pf_temp, &d->pagefaults, list) {
> + xe_exec_queue_put(pf->q);
> + kfree(pf);
> + }
> +
> xe_eudebug_destroy_resources(d);
> put_task_struct(d->target_task);
>
> @@ -590,6 +597,12 @@ xe_eudebug_get(struct xe_file *xef)
> return d;
> }
>
> +struct xe_eudebug *
> +xe_eudebug_get_for_debugger(struct xe_file *xef)
> +{
> + return _xe_eudebug_get(xef);
> +}
> +
> static int xe_eudebug_queue_event(struct xe_eudebug *d,
> struct xe_eudebug_event *event)
> {
> @@ -1064,6 +1077,7 @@ static int do_eu_control(struct xe_eudebug *d,
> struct xe_device *xe = d->xe;
> u8 *bits = NULL;
> unsigned int hw_attn_size, attn_size;
> + struct dma_fence *pagefault_fence;
> struct xe_exec_queue *q;
> struct xe_file *xef;
> struct xe_lrc *lrc;
> @@ -1129,6 +1143,23 @@ static int do_eu_control(struct xe_eudebug *d,
>
> ret = -EINVAL;
> mutex_lock(&d->eu_lock);
> + rcu_read_lock();
> + pagefault_fence = dma_fence_get_rcu_safe(&d->pagefault_fence);
> + rcu_read_unlock();
> +
> + while (pagefault_fence) {
> + mutex_unlock(&d->eu_lock);
> + ret = dma_fence_wait(pagefault_fence, true);
> + dma_fence_put(pagefault_fence);
> +
> + if (ret)
> + goto out_free;
> +
> + mutex_lock(&d->eu_lock);
> + rcu_read_lock();
> + pagefault_fence = dma_fence_get_rcu_safe(&d->pagefault_fence);
> + rcu_read_unlock();
> + }
>
> switch (arg->cmd) {
> case DRM_XE_EUDEBUG_EU_CONTROL_CMD_INTERRUPT_ALL:
> @@ -2008,6 +2039,8 @@ xe_eudebug_connect(struct xe_device *xe,
> kref_init(&d->ref);
> spin_lock_init(&d->connection.lock);
> mutex_init(&d->eu_lock);
> + mutex_init(&d->pf_lock);
> + INIT_LIST_HEAD(&d->pagefaults);
> init_waitqueue_head(&d->events.write_done);
> init_waitqueue_head(&d->events.read_done);
> init_completion(&d->discovery);
> @@ -3359,6 +3392,8 @@ static void discover_clients(struct xe_device *xe, struct xe_eudebug *d)
> }
> }
>
> +static int xe_eudebug_handle_pagefault_list(struct xe_eudebug *d);
> +
> static void discovery_work_fn(struct work_struct *work)
> {
> struct xe_eudebug *d = container_of(work, typeof(*d),
> @@ -3383,6 +3418,8 @@ static void discovery_work_fn(struct work_struct *work)
>
> up_write(&xe->eudebug.discovery_lock);
>
> + xe_eudebug_handle_pagefault_list(d);
> +
> xe_eudebug_put(d);
> }
>
> @@ -3888,6 +3925,223 @@ xe_eudebug_vm_open_ioctl(struct xe_eudebug *d, unsigned long arg)
> return ret;
> }
>
> +struct xe_exec_queue *
> +xe_eudebug_runalone_active_debuggable_queue_get(struct xe_gt *gt, int *lrc_idx)
> +{
> + struct xe_exec_queue *q;
> + int idx;
> +
> + q = runalone_active_queue_get(gt, &idx);
> + if (IS_ERR(q))
> + return q;
> +
> + if (!xe_exec_queue_is_debuggable(q)) {
> + xe_exec_queue_put(q);
> + return ERR_PTR(-EPERM);
> + }
> +
> + *lrc_idx = idx;
> +
> + return q;
> +}
> +
> +void xe_eudebug_attention_scan_pause(struct xe_gt *gt)
> +{
> + attention_scan_cancel(gt_to_xe(gt));
> +}
> +
> +void xe_eudebug_attention_scan_resume(struct xe_gt *gt)
> +{
> + attention_scan_flush(gt_to_xe(gt));
> +}
> +
> +static int send_pagefault_event(struct xe_eudebug *d, struct xe_eudebug_pagefault *pf)
> +{
> + struct xe_eudebug_event_pagefault *ep;
> + struct xe_eudebug_event *event;
> + int h_c, h_queue, h_lrc;
> + u32 size = xe_gt_eu_attention_bitmap_size(pf->q->gt) * 3;
> + u32 sz = struct_size(ep, bitmask, size);
> +
> + XE_WARN_ON(pf->lrc_idx < 0 || pf->lrc_idx >= pf->q->width);
> +
> + XE_WARN_ON(!xe_exec_queue_is_debuggable(pf->q));
> +
> + h_c = find_handle(d->res, XE_EUDEBUG_RES_TYPE_CLIENT, pf->q->vm->xef);
> + if (h_c < 0)
> + return h_c;
> +
> + h_queue = find_handle(d->res, XE_EUDEBUG_RES_TYPE_EXEC_QUEUE, pf->q);
> + if (h_queue < 0)
> + return h_queue;
> +
> + h_lrc = find_handle(d->res, XE_EUDEBUG_RES_TYPE_LRC, pf->q->lrc[pf->lrc_idx]);
> + if (h_lrc < 0)
> + return h_lrc;
> +
> + event = __xe_eudebug_create_event(d, 0, DRM_XE_EUDEBUG_EVENT_PAGEFAULT,
> + 0, sz, GFP_KERNEL);
> +
> + if (!event)
> + return -ENOSPC;
> +
> + ep = cast_event(ep, event);
> + write_member(struct xe_eudebug_event_pagefault, ep, client_handle, (u64)h_c);
> + write_member(struct xe_eudebug_event_pagefault, ep, exec_queue_handle, (u64)h_queue);
> + write_member(struct xe_eudebug_event_pagefault, ep, lrc_handle, (u64)h_lrc);
> + write_member(struct xe_eudebug_event_pagefault, ep, bitmask_size, size);
> + write_member(struct xe_eudebug_event_pagefault, ep, page_fault_address, pf->fault.addr);
> +
> + memcpy(ep->bitmask, pf->attentions.before.att, pf->attentions.before.size);
> + memcpy(ep->bitmask + pf->attentions.before.size,
> + pf->attentions.after.att, pf->attentions.after.size);
> + memcpy(ep->bitmask + pf->attentions.before.size + pf->attentions.after.size,
> + pf->attentions.resolved.att, pf->attentions.resolved.size);
> +
> + event->seqno = atomic_long_inc_return(&d->events.seqno);
> +
> + return xe_eudebug_queue_event(d, event);
> +}
> +
> +static int xe_eudebug_queue_page_fault(struct xe_gt *gt, struct xe_eudebug_pagefault *pf)
> +{
> + struct xe_eudebug *d;
> + struct xe_exec_queue *q;
> + int ret, lrc_idx;
> +
> + if (list_empty_careful(>_to_xe(gt)->eudebug.list))
> + return -ENOTCONN;
> +
> + q = runalone_active_queue_get(gt, &lrc_idx);
> + if (IS_ERR(q))
> + return PTR_ERR(q);
> +
> + if (!xe_exec_queue_is_debuggable(q)) {
> + ret = -EPERM;
> + goto out_exec_queue_put;
> + }
> +
> + d = _xe_eudebug_get(q->vm->xef);
> + if (!d) {
> + ret = -ENOTCONN;
> + goto out_exec_queue_put;
> + }
> +
> + if (!completion_done(&d->discovery)) {
> + eu_dbg(d, "discovery not yet done\n");
> + ret = -EBUSY;
> + goto out_eudebug_put;
> + }
> +
> + ret = send_pagefault_event(d, pf);
> + if (ret)
> + xe_eudebug_disconnect(d, ret);
> +
> +out_eudebug_put:
> + xe_eudebug_put(d);
> +out_exec_queue_put:
> + xe_exec_queue_put(q);
> +
> + return ret;
> +}
> +
> +static int xe_eudebug_add_pagefault_list(struct xe_gt *gt, struct xe_eudebug_pagefault *pf)
> +{
> + struct xe_eudebug *d;
> +
> + if (list_empty_careful(>_to_xe(gt)->eudebug.list))
> + return -ENOTCONN;
> +
> + d = _xe_eudebug_get(pf->q->vm->xef);
> + if (IS_ERR_OR_NULL(d))
> + return -EINVAL;
> +
> + mutex_lock(&d->pf_lock);
> + list_add_tail(&pf->list, &d->pagefaults);
> + mutex_unlock(&d->pf_lock);
> +
> + xe_eudebug_put(d);
> +
> + return 0;
> +}
> +
> +static int xe_eudebug_handle_pagefault_list(struct xe_eudebug *d)
> +{
> + struct xe_eudebug_pagefault *pf, *pf_temp;
> + int ret = 0;
> +
> + mutex_lock(&d->pf_lock);
> + list_for_each_entry_safe(pf, pf_temp, &d->pagefaults, list) {
> + struct xe_gt *gt =pf->q->gt;
> +
> + ret = xe_eudebug_queue_page_fault(gt, pf);
> + /* decrease the reference count of xe_exec_queue obtained from pagefault handler */
> + xe_exec_queue_put(pf->q);
> + list_del(&pf->list);
> + kfree(pf);
> +
> + if (ret)
> + break;
> + }
> + mutex_unlock(&d->pf_lock);
> +
> + return ret;
> +}
> +
> +int xe_eudebug_handle_page_fault(struct xe_gt *gt, struct xe_eudebug_pagefault *pf)
> +{
> + int ret;
> +
> + ret = xe_eudebug_queue_page_fault(gt, pf);
> +
> + /* if debugger discovery is not completed, queue pagefault */
> + if (ret == -EBUSY) {
> + ret = xe_eudebug_add_pagefault_list(gt, pf);
> + if (!ret)
> + goto out;
> + }
> +
> + xe_exec_queue_put(pf->q);
> + kfree(pf);
> +
> +out:
> + return ret;
> +}
> +
> +static const char *
> +eudebug_pagefault_get_driver_name(struct dma_fence *dma_fence)
> +{
> + return "xe";
> +}
> +
> +static const char *
> +eudebug_pagefault_fence_get_timeline_name(struct dma_fence *dma_fence)
> +{
> + return "eudebug_pagefault_fence";
> +}
> +
> +static const struct dma_fence_ops eudebug_pagefault_fence_ops = {
> + .get_driver_name = eudebug_pagefault_get_driver_name,
> + .get_timeline_name = eudebug_pagefault_fence_get_timeline_name,
> +};
> +
> +struct xe_eudebug_pagefault_fence *
> +xe_eudebug_pagefault_fence_create(void)
> +{
> + struct xe_eudebug_pagefault_fence *fence;
> +
> + fence = kzalloc(sizeof(*fence), GFP_KERNEL);
> + if (fence == NULL)
> + return NULL;
> +
> + spin_lock_init(&fence->lock);
> + dma_fence_init(&fence->base, &eudebug_pagefault_fence_ops,
> + &fence->lock,
> + dma_fence_context_alloc(1), 1);
> +
> + return fence;
> +}
> +
> #if IS_ENABLED(CONFIG_DRM_XE_KUNIT_TEST)
> #include "tests/xe_eudebug.c"
> #endif
> diff --git a/drivers/gpu/drm/xe/xe_eudebug.h b/drivers/gpu/drm/xe/xe_eudebug.h
> index 403f52148da3..0a969cf8e515 100644
> --- a/drivers/gpu/drm/xe/xe_eudebug.h
> +++ b/drivers/gpu/drm/xe/xe_eudebug.h
> @@ -11,6 +11,7 @@ struct drm_device;
> struct drm_file;
> struct xe_device;
> struct xe_file;
> +struct xe_gt;
> struct xe_vm;
> struct xe_vma;
> struct xe_exec_queue;
> @@ -18,6 +19,8 @@ struct xe_hw_engine;
> struct xe_user_fence;
> struct xe_debug_metadata;
> struct drm_gpuva_ops;
> +struct xe_eudebug_pagefault;
> +struct xe_eudebug_pagefault_fence;
>
> #if IS_ENABLED(CONFIG_DRM_XE_EUDEBUG)
>
> @@ -48,11 +51,18 @@ void xe_eudebug_ufence_init(struct xe_user_fence *ufence, struct xe_file *xef, s
> void xe_eudebug_ufence_fini(struct xe_user_fence *ufence);
>
> struct xe_eudebug *xe_eudebug_get(struct xe_file *xef);
> +struct xe_eudebug *xe_eudebug_get_for_debugger(struct xe_file *xef);
> void xe_eudebug_put(struct xe_eudebug *d);
>
> void xe_eudebug_debug_metadata_create(struct xe_file *xef, struct xe_debug_metadata *m);
> void xe_eudebug_debug_metadata_destroy(struct xe_file *xef, struct xe_debug_metadata *m);
>
> +struct xe_exec_queue *xe_eudebug_runalone_active_debuggable_queue_get(struct xe_gt *gt, int *lrc_idx);
> +void xe_eudebug_attention_scan_pause(struct xe_gt *gt);
> +void xe_eudebug_attention_scan_resume(struct xe_gt *gt);
> +int xe_eudebug_handle_page_fault(struct xe_gt *gt, struct xe_eudebug_pagefault *d_pf);
> +struct xe_eudebug_pagefault_fence *xe_eudebug_pagefault_fence_create(void);
> +
> #else
>
> static inline int xe_eudebug_connect_ioctl(struct drm_device *dev,
> @@ -83,11 +93,18 @@ static inline void xe_eudebug_ufence_init(struct xe_user_fence *ufence, struct x
> static inline void xe_eudebug_ufence_fini(struct xe_user_fence *ufence) { }
>
> static inline struct xe_eudebug *xe_eudebug_get(struct xe_file *xef) { return NULL; }
> +static inline struct xe_eudebug *xe_eudebug_get_for_debugger(struct xe_file *xef) { return NULL; }
> static inline void xe_eudebug_put(struct xe_eudebug *d) { }
>
> static inline void xe_eudebug_debug_metadata_create(struct xe_file *xef, struct xe_debug_metadata *m) { }
> static inline void xe_eudebug_debug_metadata_destroy(struct xe_file *xef, struct xe_debug_metadata *m) { }
>
> +static inline struct xe_exec_queue *xe_eudebug_runalone_active_debuggable_queue_get(struct xe_gt *gt, int *lrc_idx) { return NULL; }
> +static inline void xe_eudebug_attention_scan_pause(struct xe_gt *gt) { }
> +static inline void xe_eudebug_attention_scan_resume(struct xe_gt *gt) { }
> +static inline int xe_eudebug_handle_page_fault(struct xe_gt *gt, struct xe_eudebug_pagefault *d_pf) { return 0; }
> +static inline struct xe_eudebug_pagefault_fence *xe_eudebug_pagefault_fence_create(void) { return NULL; }
> +
> #endif /* CONFIG_DRM_XE_EUDEBUG */
>
> #endif
> diff --git a/drivers/gpu/drm/xe/xe_eudebug_types.h b/drivers/gpu/drm/xe/xe_eudebug_types.h
> index b79d4c078216..7c05abf19f26 100644
> --- a/drivers/gpu/drm/xe/xe_eudebug_types.h
> +++ b/drivers/gpu/drm/xe/xe_eudebug_types.h
> @@ -16,6 +16,8 @@
>
> #include <uapi/drm/xe_drm.h>
>
> +#include "xe_gt_debug.h"
> +
> struct xe_device;
> struct task_struct;
> struct xe_eudebug;
> @@ -161,6 +163,10 @@ struct xe_eudebug {
>
> /** @ops operations for eu_control */
> struct xe_eudebug_eu_control_ops *ops;
> +
> + struct mutex pf_lock;
> + struct list_head pagefaults;
> + struct dma_fence __rcu *pagefault_fence;
> };
>
> /**
> @@ -325,4 +331,64 @@ struct xe_eudebug_event_vm_bind_op_metadata {
> u64 metadata_cookie;
> };
>
> +/**
> + * struct xe_eudebug_event_pagefault - Internal event for EU Pagefault
> + */
> +struct xe_eudebug_event_pagefault {
> + /** @base: base event */
> + struct xe_eudebug_event base;
> +
> + /** @client_handle: client for the Pagefault */
> + u64 client_handle;
> +
> + /** @exec_queue_handle: handle of exec_queue which raised Pagefault */
> + u64 exec_queue_handle;
> +
> + /** @lrc_handle: lrc handle of the workload which raised Pagefault */
> + u64 lrc_handle;
> +
> + /** @flags: eu Pagefault event flags, currently MBZ */
> + u32 flags;
> +
> + /**
> + * @bitmask_size: sum of size before/after/resolved att bits.
> + * It has three times the size of xe_eudebug_event_eu_attention.bitmask_size.
> + */
> + u32 bitmask_size;
> +
> + /** @page_fault_address: The ppgtt address where the Pagefault occurred */
> + u64 page_fault_address;
> +
> + /**
> + * @bitmask: Bitmask of thread attentions starting from natural,
> + * hardware order of DSS=0, eu=0, 8 attention bits per eu.
> + * The order of the bitmask array is before, after, resolved.
> + */
> + u8 bitmask[];
> +};
> +
> +struct xe_eudebug_pagefault {
> + struct list_head list;
> + struct xe_exec_queue *q;
> + int lrc_idx;
> +
> + struct {
> + u64 addr;
> + int type;
> + int level;
> + int access;
> + } fault;
> +
> + struct {
> + struct xe_eu_attentions before;
> + struct xe_eu_attentions after;
> + struct xe_eu_attentions resolved;
> + } attentions;
> +};
> +
> +struct xe_eudebug_pagefault_fence {
> + struct dma_fence base;
> + spinlock_t lock;
> +};
> +
> #endif
> diff --git a/drivers/gpu/drm/xe/xe_gt_debug.c b/drivers/gpu/drm/xe/xe_gt_debug.c
> index 25013e902cbe..07bb0364abf8 100644
> --- a/drivers/gpu/drm/xe/xe_gt_debug.c
> +++ b/drivers/gpu/drm/xe/xe_gt_debug.c
> @@ -3,6 +3,7 @@
> * Copyright © 2023 Intel Corporation
> */
>
> +#include <linux/delay.h>
> #include "regs/xe_gt_regs.h"
> #include "xe_device.h"
> #include "xe_force_wake.h"
> @@ -149,3 +150,50 @@ int xe_gt_eu_threads_needing_attention(struct xe_gt *gt)
>
> return err < 0 ? 0 : err;
> }
> +
> +static inline unsigned int
> +xe_eu_attentions_count(const struct xe_eu_attentions *a)
> +{
> + return bitmap_weight((void *)a->att, a->size * BITS_PER_BYTE);
> +}
> +
> +void xe_gt_eu_attentions_read(struct xe_gt *gt,
> + struct xe_eu_attentions *a,
> + const unsigned int settle_time_ms)
> +{
> + unsigned int prev = 0;
> + ktime_t end, now;
> +
> + now = ktime_get_raw();
> + end = ktime_add_ms(now, settle_time_ms);
> +
> + a->ts = 0;
> + a->size = min_t(int,
> + xe_gt_eu_attention_bitmap_size(gt),
> + sizeof(a->att));
> +
> + do {
> + unsigned int attn;
> +
> + xe_gt_eu_attention_bitmap(gt, a->att, a->size);
> + attn = xe_eu_attentions_count(a);
> +
> + now = ktime_get_raw();
> +
> + if (a->ts == 0)
> + a->ts = now;
> + else if (attn && attn != prev)
> + a->ts = now;
> +
> + prev = attn;
> +
> + if (settle_time_ms)
> + udelay(5);
> +
> + /*
> + * XXX We are gathering data for production SIP to find
> + * the upper limit of settle time. For now, we wait full
> + * timeout value regardless.
> + */
> + } while (ktime_before(now, end));
> +}
> \ No newline at end of file
> diff --git a/drivers/gpu/drm/xe/xe_gt_debug.h b/drivers/gpu/drm/xe/xe_gt_debug.h
> index 342082699ff6..3123c15775bc 100644
> --- a/drivers/gpu/drm/xe/xe_gt_debug.h
> +++ b/drivers/gpu/drm/xe/xe_gt_debug.h
> @@ -12,6 +12,15 @@
>
> #define XE_GT_ATTENTION_TIMEOUT_MS 100
>
> +struct xe_eu_attentions {
> +#define XE_MAX_EUS 1024
> +#define XE_MAX_THREADS 8
> +
> + u8 att[XE_MAX_EUS * XE_MAX_THREADS / BITS_PER_BYTE];
> + unsigned int size;
> + ktime_t ts;
> +};
> +
> int xe_gt_eu_threads_needing_attention(struct xe_gt *gt);
> int xe_gt_foreach_dss_group_instance(struct xe_gt *gt,
> int (*fn)(struct xe_gt *gt,
> @@ -24,4 +33,8 @@ int xe_gt_eu_attention_bitmap_size(struct xe_gt *gt);
> int xe_gt_eu_attention_bitmap(struct xe_gt *gt, u8 *bits,
> unsigned int bitmap_size);
>
> +void xe_gt_eu_attentions_read(struct xe_gt *gt,
> + struct xe_eu_attentions *a,
> + const unsigned int settle_time_ms);
> +
> #endif
> diff --git a/drivers/gpu/drm/xe/xe_gt_pagefault.c b/drivers/gpu/drm/xe/xe_gt_pagefault.c
> index 79c426dc2505..aa3e2f1b0b43 100644
> --- a/drivers/gpu/drm/xe/xe_gt_pagefault.c
> +++ b/drivers/gpu/drm/xe/xe_gt_pagefault.c
> @@ -7,14 +7,23 @@
>
> #include <linux/bitfield.h>
> #include <linux/circ_buf.h>
> +#include <linux/delay.h>
> +#include <linux/dma-fence.h>
>
> #include <drm/drm_exec.h>
> #include <drm/drm_managed.h>
> #include <drm/ttm/ttm_execbuf_util.h>
>
> #include "abi/guc_actions_abi.h"
> +#include "regs/xe_gt_regs.h"
> #include "xe_bo.h"
> +#include "xe_exec_queue.h"
> +#include "xe_eudebug.h"
> +#include "xe_eudebug_types.h"
> +#include "xe_force_wake.h"
> #include "xe_gt.h"
> +#include "xe_gt_debug.h"
> +#include "xe_gt_mcr.h"
> #include "xe_gt_tlb_invalidation.h"
> #include "xe_guc.h"
> #include "xe_guc_ct.h"
> @@ -200,12 +209,206 @@ static struct xe_vm *asid_to_vm(struct xe_device *xe, u32 asid)
> return vm;
> }
>
> -static int handle_pagefault(struct xe_gt *gt, struct pagefault *pf)
> +static struct xe_eudebug_pagefault *
> +get_eudebug_pagefault(struct xe_gt *gt, struct xe_vm *vm, struct pagefault *pf)
> {
> - struct xe_device *xe = gt_to_xe(gt);
> + struct xe_eudebug_pagefault_fence *pagefault_fence;
> + struct xe_eudebug_pagefault *eudebug_pagefault;
> + struct xe_vma *vma = NULL;
> + struct xe_exec_queue *q;
> + struct dma_fence *fence;
> + struct xe_eudebug *d;
> + unsigned int fw_ref;
> + int lrc_idx;
> + u32 td_ctl;
> +
> + down_read(&vm->lock);
> + vma = lookup_vma(vm, pf->page_addr);
> + up_read(&vm->lock);
> +
> + if (vma)
> + return NULL;
> +
> + d = xe_eudebug_get_for_debugger(vm->xef);
> + if (!d)
> + return NULL;
> +
> + q = xe_eudebug_runalone_active_debuggable_queue_get(gt, &lrc_idx);
> + if (IS_ERR(q))
> + goto err_put_eudebug;
> +
> + fw_ref = xe_force_wake_get(gt_to_fw(gt), q->hwe->domain);
> + if (!fw_ref)
> + goto err_put_exec_queue;
> +
> + /*
> + * If there is no debug functionality (TD_CTL_GLOBAL_DEBUG_ENABLE, etc.),
> + * don't proceed pagefault routine for eu debugger.
> + */
> +
> + td_ctl = xe_gt_mcr_unicast_read_any(gt, TD_CTL);
> + if (!td_ctl)
> + goto err_put_fw;
> +
> + eudebug_pagefault = kzalloc(sizeof(*eudebug_pagefault), GFP_KERNEL);
> + if (!eudebug_pagefault)
> + goto err_put_fw;
> +
> + xe_eudebug_attention_scan_pause(gt);
> +
> + mutex_lock(&d->eu_lock);
> + rcu_read_lock();
> + fence = dma_fence_get_rcu_safe(&d->pagefault_fence);
> + rcu_read_unlock();
> +
> + if (fence) {
> + /*
> + * TODO: If the new incoming pagefaulted address is different
> + * from the pagefaulted address it is currently handling on the
> + * same ASID, it needs a routine to wait here and then do the
> + * following pagefault.
> + */
> + dma_fence_put(fence);
> + goto err_unlock_eu_lock;
> + }
> +
> + pagefault_fence = xe_eudebug_pagefault_fence_create();
> + if (!pagefault_fence) {
> + goto err_unlock_eu_lock;
> + }
> +
> + d->pagefault_fence = &pagefault_fence->base;
> + mutex_unlock(&d->eu_lock);
> +
> + INIT_LIST_HEAD(&eudebug_pagefault->list);
> +
> + xe_gt_eu_attentions_read(gt, &eudebug_pagefault->attentions.before, 0);
> +
> + /* Halt on next thread dispatch */
> + while (!(td_ctl & TD_CTL_FORCE_EXTERNAL_HALT)) {
> + xe_gt_mcr_multicast_write(gt, TD_CTL,
> + td_ctl | TD_CTL_FORCE_EXTERNAL_HALT);
> + /*
> + * The sleep is needed because some interrupts are ignored
> + * by the HW, hence we allow the HW some time to acknowledge
> + * that.
> + */
> + udelay(200);
> + td_ctl = xe_gt_mcr_unicast_read_any(gt, TD_CTL);
> + }
> +
> + /* Halt regardless of thread dependencies */
> + while (!(td_ctl & TD_CTL_FORCE_EXCEPTION)) {
> + xe_gt_mcr_multicast_write(gt, TD_CTL,
> + td_ctl | TD_CTL_FORCE_EXCEPTION);
> + udelay(200);
> + td_ctl = xe_gt_mcr_unicast_read_any(gt, TD_CTL);
> + }
> +
> + xe_gt_eu_attentions_read(gt, &eudebug_pagefault->attentions.after,
> + XE_GT_ATTENTION_TIMEOUT_MS);
> +
> + /*
> + * xe_exec_queue_put() will be called from release_eudebug_pagefault()
> + * or xe_eudebug_handle_page_fault()
> + */
> + eudebug_pagefault->q = q;
> + eudebug_pagefault->lrc_idx = lrc_idx;
> + eudebug_pagefault->fault.addr = pf->page_addr;
> + eudebug_pagefault->fault.type = pf->fault_type;
> + eudebug_pagefault->fault.level = pf->fault_level;
> + eudebug_pagefault->fault.access = pf->access_type;
> +
> + xe_force_wake_put(gt_to_fw(gt), fw_ref);
> + xe_eudebug_put(d);
> +
> + return eudebug_pagefault;
> +
> +err_unlock_eu_lock:
> + mutex_unlock(&d->eu_lock);
> + xe_eudebug_attention_scan_resume(gt);
> + kfree(eudebug_pagefault);
> +err_put_fw:
> + xe_force_wake_put(gt_to_fw(gt), fw_ref);
> +err_put_exec_queue:
> + xe_exec_queue_put(q);
> +err_put_eudebug:
> + xe_eudebug_put(d);
> +
> + return NULL;
> +}
> +
> +static void
> +release_eudebug_pagefault(struct xe_gt *gt, struct xe_vm *vm,
> + struct xe_eudebug_pagefault *eudebug_pagefault,
> + bool send_event)
> +{
> + struct xe_eudebug *d;
> + unsigned int fw_ref;
> + u32 td_ctl;
> +
> + fw_ref = xe_force_wake_get(gt_to_fw(gt), eudebug_pagefault->q->hwe->domain);
> + if (!fw_ref) {
> + struct xe_device *xe = gt_to_xe(gt);
> + drm_warn(&xe->drm, "Forcewake fail: Can not recover TD_CTL");
> + } else {
> + td_ctl = xe_gt_mcr_unicast_read_any(gt, TD_CTL);
> + xe_gt_mcr_multicast_write(gt, TD_CTL, td_ctl &
> + ~(TD_CTL_FORCE_EXTERNAL_HALT | TD_CTL_FORCE_EXCEPTION));
> + xe_force_wake_put(gt_to_fw(gt), fw_ref);
> + }
> +
> + if (send_event)
> + xe_eudebug_handle_page_fault(gt, eudebug_pagefault);
> +
> + d = xe_eudebug_get_for_debugger(vm->xef);
> + if (d) {
> + struct dma_fence *fence;
> +
> + mutex_lock(&d->eu_lock);
> + rcu_read_lock();
> + fence = dma_fence_get_rcu_safe(&d->pagefault_fence);
> + rcu_read_unlock();
> +
> + if (fence) {
> + if (send_event)
> + dma_fence_signal(fence);
> +
> + dma_fence_put(fence); /* deref for dma_fence_get_rcu_safe() */
> + dma_fence_put(fence); /* defef for dma_fence_init() */
> + }
> +
> + d->pagefault_fence = NULL;
> + mutex_unlock(&d->eu_lock);
> +
> + xe_eudebug_put(d);
> + }
> +
> + if (!send_event) {
> + xe_exec_queue_put(eudebug_pagefault->q);
> + kfree(eudebug_pagefault);
> + }
> +
> + xe_eudebug_attention_scan_resume(gt);
> +}
> +
> +static void
> +handle_eu_debug_pagefault(struct xe_gt *gt, struct xe_eudebug_pagefault *d_pf)
> +{
> + xe_gt_eu_attentions_read(gt, &d_pf->attentions.resolved,
> + XE_GT_ATTENTION_TIMEOUT_MS);
> +}
> +
> +static int handle_pagefault_start(struct xe_gt *gt, struct pagefault *pf,
> + struct xe_vm **pf_vm,
> + struct xe_eudebug_pagefault **d_pf)
> +{
> + struct xe_eudebug_pagefault *eudebug_pf;
> struct xe_tile *tile = gt_to_tile(gt);
> - struct xe_vm *vm;
> + struct xe_device *xe = gt_to_xe(gt);
> + bool rel_eudebug_pf = false;
> struct xe_vma *vma = NULL;
> + struct xe_vm *vm;
> int err;
>
> /* SW isn't expected to handle TRTT faults */
> @@ -216,6 +419,8 @@ static int handle_pagefault(struct xe_gt *gt, struct pagefault *pf)
> if (IS_ERR(vm))
> return PTR_ERR(vm);
>
> + eudebug_pf = get_eudebug_pagefault(gt, vm, pf);
> +
> /*
> * TODO: Change to read lock? Using write lock for simplicity.
> */
> @@ -228,8 +433,27 @@ static int handle_pagefault(struct xe_gt *gt, struct pagefault *pf)
>
> vma = lookup_vma(vm, pf->page_addr);
> if (!vma) {
> - err = -EINVAL;
> - goto unlock_vm;
> + if (eudebug_pf)
> + vma = xe_vm_create_scratch_vma(vm, pf->page_addr);
> +
> +
> + if (IS_ERR_OR_NULL(vma)) {
> + err = -EINVAL;
> + if (eudebug_pf)
> + rel_eudebug_pf = true;
> +
> + goto unlock_vm;
> + }
> + } else {
> + /*
> + * When creating an instance of eudebug_pagefault, there was
> + * no vma containing the ppgtt address where the pagefault occurred,
> + * but when reacquiring vm->lock, there is.
> + * During not aquiring the vm->lock from this context,
> + * but vma corresponding to the address where the pagefault occurred
> + * in another context has allocated.*/
> + if (eudebug_pf)
> + rel_eudebug_pf = true;
> }
>
> err = handle_vma_pagefault(tile, pf, vma);
> @@ -238,11 +462,44 @@ static int handle_pagefault(struct xe_gt *gt, struct pagefault *pf)
> if (!err)
> vm->usm.last_fault_vma = vma;
> up_write(&vm->lock);
> - xe_vm_put(vm);
> +
> + if (rel_eudebug_pf) {
> + release_eudebug_pagefault(gt, vm, eudebug_pf, false);
> + *d_pf = NULL;
> + } else {
> + *d_pf = eudebug_pf;
> + }
> +
> + /* For the lifetime of the eudebug pagefault instance, keep the VM instance.*/
> + if (!*d_pf) {
> + xe_vm_put(vm);
> + *pf_vm = NULL;
> + }
> + else {
> + *pf_vm = vm;
> + }
>
> return err;
> }
>
> +static void handle_pagefault_end(struct xe_gt *gt, struct xe_vm *pf_vm,
> + struct xe_eudebug_pagefault *d_pf)
> +{
> + /* if there no eudebug_pagefault then return */
> + if (!d_pf)
> + return;
> +
> + handle_eu_debug_pagefault(gt, d_pf);
> +
> + /*
> + * TODO: Remove VMA added to handle eudebug pagefault
> + */
> +
> + release_eudebug_pagefault(gt, pf_vm, d_pf, true);
> +
> + xe_vm_put(pf_vm);
> +}
> +
> static int send_pagefault_reply(struct xe_guc *guc,
> struct xe_guc_pagefault_reply *reply)
> {
> @@ -368,7 +625,10 @@ static void pf_queue_work_func(struct work_struct *w)
> threshold = jiffies + msecs_to_jiffies(USM_QUEUE_MAX_RUNTIME_MS);
>
> while (get_pagefault(pf_queue, &pf)) {
> - ret = handle_pagefault(gt, &pf);
> + struct xe_eudebug_pagefault *d_pf = NULL;
> + struct xe_vm *pf_vm = NULL;
> +
> + ret = handle_pagefault_start(gt, &pf, &pf_vm, &d_pf);
I would move eu debug page fault handling code to a different files and here do:
if (debugger_attched)
ret = handle_pagefault_with_debugger_attach()
else
ret = handle_pagefault()
This keep code clean, easy to read and modify.
> if (unlikely(ret)) {
> print_pagefault(xe, &pf);
> pf.fault_unsuccessful = 1;
> @@ -386,7 +646,12 @@ static void pf_queue_work_func(struct work_struct *w)
> FIELD_PREP(PFR_ENG_CLASS, pf.engine_class) |
> FIELD_PREP(PFR_PDATA, pf.pdata);
>
> - send_pagefault_reply(>->uc.guc, &reply);
> + ret = send_pagefault_reply(>->uc.guc, &reply);
> + if (unlikely(ret)) {
> + drm_dbg(&xe->drm, "GuC Pagefault reply failed: %d\n", ret);
> + }
> +
> + handle_pagefault_end(gt, pf_vm, d_pf);
>
> if (time_after(jiffies, threshold) &&
> pf_queue->tail != pf_queue->head) {
> diff --git a/drivers/gpu/drm/xe/xe_vm.c b/drivers/gpu/drm/xe/xe_vm.c
> index e3e8bce11e3d..bbbff17b90f9 100644
> --- a/drivers/gpu/drm/xe/xe_vm.c
> +++ b/drivers/gpu/drm/xe/xe_vm.c
> @@ -3555,3 +3555,24 @@ int xe_uvma_access(struct xe_userptr_vma *uvma, u64 offset,
> up_read(&vm->userptr.notifier_lock);
> return ret;
> }
> +
> +struct xe_vma *xe_vm_create_scratch_vma(struct xe_vm *vm, u64 addr)
> +{
> + struct xe_vma *vma;
> + int err;
> +
> + if (xe_vm_is_closed_or_banned(vm))
> + return ERR_PTR(-ENOENT);
> +
> + vma = xe_vma_create(vm, NULL, 0, addr, addr + SZ_64K - 1, 0, VMA_CREATE_FLAG_IS_NULL);
SZ_64K vs SZ_4K should be checked with the vm flags otherwise it will overwrite other pages.
Regards,
Nirmoy
> + if (IS_ERR_OR_NULL(vma))
> + return vma;
> +
> + err = xe_vm_insert_vma(vm, vma);
> + if (err) {
> + xe_vma_destroy_late(vma);
> + return ERR_PTR(err);
> + }
> +
> + return vma;
> +}
> diff --git a/drivers/gpu/drm/xe/xe_vm.h b/drivers/gpu/drm/xe/xe_vm.h
> index 99b9a9b011de..3ac446cd3b89 100644
> --- a/drivers/gpu/drm/xe/xe_vm.h
> +++ b/drivers/gpu/drm/xe/xe_vm.h
> @@ -284,3 +284,5 @@ void xe_vm_snapshot_free(struct xe_vm_snapshot *snap);
>
> int xe_uvma_access(struct xe_userptr_vma *uvma, u64 offset,
> void *buf, u64 len, bool write);
> +
> +struct xe_vma *xe_vm_create_scratch_vma(struct xe_vm *vm, u64 addr);
> diff --git a/include/uapi/drm/xe_drm_eudebug.h b/include/uapi/drm/xe_drm_eudebug.h
> index 2ebf21e15f5b..47856ca215ef 100644
> --- a/include/uapi/drm/xe_drm_eudebug.h
> +++ b/include/uapi/drm/xe_drm_eudebug.h
> @@ -37,6 +37,7 @@ struct drm_xe_eudebug_event {
> #define DRM_XE_EUDEBUG_EVENT_VM_BIND_UFENCE 8
> #define DRM_XE_EUDEBUG_EVENT_METADATA 9
> #define DRM_XE_EUDEBUG_EVENT_VM_BIND_OP_METADATA 10
> +#define DRM_XE_EUDEBUG_EVENT_PAGEFAULT 11
>
> __u16 flags;
> #define DRM_XE_EUDEBUG_EVENT_CREATE (1 << 0)
> @@ -218,6 +219,17 @@ struct drm_xe_eudebug_event_vm_bind_op_metadata {
> __u64 metadata_cookie;
> };
>
> +struct drm_xe_eudebug_event_pagefault {
> + struct drm_xe_eudebug_event base;
> + __u64 client_handle;
> + __u64 exec_queue_handle;
> + __u64 lrc_handle;
> + __u32 flags;
> + __u32 bitmask_size;
> + __u64 pagefault_address;
> + __u8 bitmask[];
> +};
> +
> #if defined(__cplusplus)
> }
> #endif
[-- Attachment #2: Type: text/html, Size: 33355 bytes --]
^ permalink raw reply [flat|nested] 28+ messages in thread
* ✓ CI.Patch_applied: success for Support EU online debug on pagefault
2024-10-21 9:58 [RFC 00/19] Support EU online debug on pagefault Gwan-gyeong Mun
` (18 preceding siblings ...)
2024-10-21 9:58 ` [RFC 19/19] drm/xe/eudebug: Support EU online debug on pagefault Gwan-gyeong Mun
@ 2024-10-21 10:07 ` Patchwork
2024-10-21 10:08 ` ✗ CI.checkpatch: warning " Patchwork
` (5 subsequent siblings)
25 siblings, 0 replies; 28+ messages in thread
From: Patchwork @ 2024-10-21 10:07 UTC (permalink / raw)
To: Gwan-gyeong Mun; +Cc: intel-xe
== Series Details ==
Series: Support EU online debug on pagefault
URL : https://patchwork.freedesktop.org/series/140239/
State : success
== Summary ==
=== Applying kernel patches on branch 'drm-tip' with base: ===
Base commit: 784111a40e40 drm-tip: 2024y-10m-21d-08h-47m-21s UTC integration manifest
=== git am output follows ===
Applying: ptrace: export ptrace_may_access
Applying: drm/xe/eudebug: Introduce eudebug support
Applying: drm/xe/eudebug: Introduce discovery for resources
Applying: drm/xe/eudebug: Introduce exec_queue events
Applying: drm/xe/eudebug: hw enablement for eudebug
Applying: drm/xe: Add EUDEBUG_ENABLE exec queue property
Applying: drm/xe/eudebug: Introduce per device attention scan worker
Applying: drm/xe/eudebug: Introduce EU control interface
Applying: drm/xe/eudebug: Add vm bind and vm bind ops
Applying: drm/xe/eudebug: Add UFENCE events with acks
Applying: drm/xe/eudebug: vm open/pread/pwrite
Applying: drm/xe/eudebug: implement userptr_vma access
Applying: drm/xe: Debug metadata create/destroy ioctls
Applying: drm/xe: Attach debug metadata to vma
Applying: drm/xe/eudebug: Add debug metadata support for xe_eudebug
Applying: drm/xe/eudebug: Implement vm_bind_op discovery
Applying: drm/xe/eudebug: Dynamically toggle debugger functionality
Applying: drm/xe/eudebug_test: Introduce xe_eudebug wa kunit test
Applying: drm/xe/eudebug: Support EU online debug on pagefault
^ permalink raw reply [flat|nested] 28+ messages in thread* ✗ CI.checkpatch: warning for Support EU online debug on pagefault
2024-10-21 9:58 [RFC 00/19] Support EU online debug on pagefault Gwan-gyeong Mun
` (19 preceding siblings ...)
2024-10-21 10:07 ` ✓ CI.Patch_applied: success for " Patchwork
@ 2024-10-21 10:08 ` Patchwork
2024-10-21 10:09 ` ✓ CI.KUnit: success " Patchwork
` (4 subsequent siblings)
25 siblings, 0 replies; 28+ messages in thread
From: Patchwork @ 2024-10-21 10:08 UTC (permalink / raw)
To: Gwan-gyeong Mun; +Cc: intel-xe
== Series Details ==
Series: Support EU online debug on pagefault
URL : https://patchwork.freedesktop.org/series/140239/
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
30ab6715fc09baee6cc14cb3c89ad8858688d474
+ cd /kernel
+ git config --global --add safe.directory /kernel
+ git log -n1
commit d44780a1aa4e9cd3780e2a3fa5b38ef5c901cd1a
Author: Gwan-gyeong Mun <gwan-gyeong.mun@intel.com>
Date: Mon Oct 21 12:58:58 2024 +0300
drm/xe/eudebug: Support EU online debug on pagefault
When the EU debugger is connected, if a page fault occurs,
the DRM_XE_EUDEBUG_EVENT_PAGEFAULT event is passed to the client
connected to the debugger after handling the pagefault WA.
The pagefault WA is a mechanism that allows a stalled EU thread to enter
SIP mode by installing a temporary page in the page table for the ppgtt
address where the pagefault occurred.
The pagefault eudebug event passed to the client follows the newly added
struct drm_xe_eudebug_event_pagefault type.
When a pagefault occurs, it prevents to send the
DRM_XE_EUDEBUG_EVENT_EU_ATTENTION event to the client during
pagefault WA processing.
The page fault event delivery follows the below policy.
(1) If EU Debugger discovery has been completed, pagefault handler delivers
pagefault event directly.
(2) If a pagefault occurs during eu debugger discovery process, pagefault
handler queues a pagefault event and sends the queued event when
discovery is completed
The thread where the pagefault occurred will be notified only once,
for an event with the DRM_XE_EUDEBUG_EVENT_PAGEFAULT event type.
Information about EU threads where a pagefault occurred is passed to the
client only once for each event with the
DRM_XE_EUDEBUG_EVENT_PAGEFAULT event type.
Of course, if a pagefault occurs for a new thread, a new pagefault event
will be passed to the client. It is also possible that a pagefault WA for
multiple EU threads is processed and delivered for a single pagefault event
The eu attention event is sent by the attention workqueue whenever the
attention bit is turned on, and the eu attention event is also delivered
to the client when the attention bit is turned on by a pagefault event.
In this case, the pagefault event is always processed before
the eu attention event.
And when the client receives the eu attention event, the client can
spot the thread where the page fault occurred as a previously
delivered event, so it can spot that the attention bit is turned on by
the breakpoint for threads other than the thread where the page fault
occurred.
Adding a temporary null page follows [1].
A brief description of the page fault handling mechanism flow between KMD
and the eu thread is as follows
(1) EU Thread accesses unallocated memory
(2) Pagefault occurs, EU Thread is stopped
(3) XE kmd set an force EU Thread exception to allow the running EU Thread
to enter SIP mode (kmd set ForceException / ForceExternalHalt bit of
TD_CTL register)
EU Threads that are not stopped enter SIP mode
(4) XE kmd installs temporary page at the address where pagefault occurred
of ppgtt pagetable
(5) XE kmd replies Pagefault message to GUC
(6) stopped EU Thread resumes when pagefault is resolved
(7) resumed eu thread enters SIP mode due to force exception set by (3)
[1] https://patchwork.freedesktop.org/patch/555097
Signed-off-by: Gwan-gyeong Mun <gwan-gyeong.mun@intel.com>
+ /mt/dim checkpatch 784111a40e40a37100e61736dd137c72cedbdb39 drm-intel
64a98951f20f ptrace: export ptrace_may_access
8dfafc8b4b99 drm/xe/eudebug: Introduce eudebug support
-:204: WARNING:FILE_PATH_CHANGES: added, moved or deleted file(s), does MAINTAINERS need updating?
#204:
new file mode 100644
-:242: ERROR:COMPLEX_MACRO: Macros with complex values should be enclosed in parentheses
#242: FILE: drivers/gpu/drm/xe/xe_eudebug.c:34:
+#define XE_EUDEBUG_DBG_ARGS(d) (d)->session, \
+ atomic_long_read(&(d)->events.seqno), \
+ READ_ONCE(d->connection.status) <= 0 ? "disconnected" : "", \
+ current->pid, \
+ task_tgid_nr(current), \
+ (d)->target_task->pid, \
+ task_tgid_nr((d)->target_task)
-:242: CHECK:MACRO_ARG_REUSE: Macro argument reuse 'd' - possible side-effects?
#242: FILE: drivers/gpu/drm/xe/xe_eudebug.c:34:
+#define XE_EUDEBUG_DBG_ARGS(d) (d)->session, \
+ atomic_long_read(&(d)->events.seqno), \
+ READ_ONCE(d->connection.status) <= 0 ? "disconnected" : "", \
+ current->pid, \
+ task_tgid_nr(current), \
+ (d)->target_task->pid, \
+ task_tgid_nr((d)->target_task)
-:250: CHECK:MACRO_ARG_REUSE: Macro argument reuse 'd' - possible side-effects?
#250: FILE: drivers/gpu/drm/xe/xe_eudebug.c:42:
+#define eu_err(d, fmt, ...) drm_err(&(d)->xe->drm, XE_EUDEBUG_DBG_STR # fmt, \
+ XE_EUDEBUG_DBG_ARGS(d), ##__VA_ARGS__)
-:252: CHECK:MACRO_ARG_REUSE: Macro argument reuse 'd' - possible side-effects?
#252: FILE: drivers/gpu/drm/xe/xe_eudebug.c:44:
+#define eu_warn(d, fmt, ...) drm_warn(&(d)->xe->drm, XE_EUDEBUG_DBG_STR # fmt, \
+ XE_EUDEBUG_DBG_ARGS(d), ##__VA_ARGS__)
-:254: CHECK:MACRO_ARG_REUSE: Macro argument reuse 'd' - possible side-effects?
#254: FILE: drivers/gpu/drm/xe/xe_eudebug.c:46:
+#define eu_dbg(d, fmt, ...) drm_dbg(&(d)->xe->drm, XE_EUDEBUG_DBG_STR # fmt, \
+ XE_EUDEBUG_DBG_ARGS(d), ##__VA_ARGS__)
-:259: CHECK:MACRO_ARG_PRECEDENCE: Macro argument 'T' may be better as '(T)' to avoid precedence issues
#259: FILE: drivers/gpu/drm/xe/xe_eudebug.c:51:
+#define struct_member(T, member) (((T *)0)->member)
-:259: CHECK:MACRO_ARG_PRECEDENCE: Macro argument 'member' may be better as '(member)' to avoid precedence issues
#259: FILE: drivers/gpu/drm/xe/xe_eudebug.c:51:
+#define struct_member(T, member) (((T *)0)->member)
-:262: CHECK:MACRO_ARG_REUSE: Macro argument reuse 'ptr' - possible side-effects?
#262: FILE: drivers/gpu/drm/xe/xe_eudebug.c:54:
+#define write_member(T_out, ptr, member, value) { \
+ BUILD_BUG_ON(sizeof(*ptr) != sizeof(T_out)); \
+ BUILD_BUG_ON(offsetof(typeof(*ptr), member) != \
+ offsetof(typeof(T_out), member)); \
+ BUILD_BUG_ON(sizeof(ptr->member) != sizeof(value)); \
+ BUILD_BUG_ON(sizeof(struct_member(T_out, member)) != sizeof(value)); \
+ BUILD_BUG_ON(!typecheck(typeof((ptr)->member), value)); \
+ (ptr)->member = (value); \
+ }
-:262: CHECK:MACRO_ARG_PRECEDENCE: Macro argument 'ptr' may be better as '(ptr)' to avoid precedence issues
#262: FILE: drivers/gpu/drm/xe/xe_eudebug.c:54:
+#define write_member(T_out, ptr, member, value) { \
+ BUILD_BUG_ON(sizeof(*ptr) != sizeof(T_out)); \
+ BUILD_BUG_ON(offsetof(typeof(*ptr), member) != \
+ offsetof(typeof(T_out), member)); \
+ BUILD_BUG_ON(sizeof(ptr->member) != sizeof(value)); \
+ BUILD_BUG_ON(sizeof(struct_member(T_out, member)) != sizeof(value)); \
+ BUILD_BUG_ON(!typecheck(typeof((ptr)->member), value)); \
+ (ptr)->member = (value); \
+ }
-:262: CHECK:MACRO_ARG_REUSE: Macro argument reuse 'member' - possible side-effects?
#262: FILE: drivers/gpu/drm/xe/xe_eudebug.c:54:
+#define write_member(T_out, ptr, member, value) { \
+ BUILD_BUG_ON(sizeof(*ptr) != sizeof(T_out)); \
+ BUILD_BUG_ON(offsetof(typeof(*ptr), member) != \
+ offsetof(typeof(T_out), member)); \
+ BUILD_BUG_ON(sizeof(ptr->member) != sizeof(value)); \
+ BUILD_BUG_ON(sizeof(struct_member(T_out, member)) != sizeof(value)); \
+ BUILD_BUG_ON(!typecheck(typeof((ptr)->member), value)); \
+ (ptr)->member = (value); \
+ }
-:262: CHECK:MACRO_ARG_REUSE: Macro argument reuse 'value' - possible side-effects?
#262: FILE: drivers/gpu/drm/xe/xe_eudebug.c:54:
+#define write_member(T_out, ptr, member, value) { \
+ BUILD_BUG_ON(sizeof(*ptr) != sizeof(T_out)); \
+ BUILD_BUG_ON(offsetof(typeof(*ptr), member) != \
+ offsetof(typeof(T_out), member)); \
+ BUILD_BUG_ON(sizeof(ptr->member) != sizeof(value)); \
+ BUILD_BUG_ON(sizeof(struct_member(T_out, member)) != sizeof(value)); \
+ BUILD_BUG_ON(!typecheck(typeof((ptr)->member), value)); \
+ (ptr)->member = (value); \
+ }
-:534: CHECK:MACRO_ARG_REUSE: Macro argument reuse '_err' - possible side-effects?
#534: FILE: drivers/gpu/drm/xe/xe_eudebug.c:326:
+#define xe_eudebug_disconnect(_d, _err) ({ \
+ if (_xe_eudebug_disconnect((_d), (_err))) { \
+ if ((_err) == 0 || (_err) == -ETIMEDOUT) \
+ eu_dbg(d, "Session closed (%d)", (_err)); \
+ else \
+ eu_err(d, "Session disconnected, err = %d (%s:%d)", \
+ (_err), __func__, __LINE__); \
+ } \
+})
-:1189: CHECK:MACRO_ARG_REUSE: Macro argument reuse '_d' - possible side-effects?
#1189: FILE: drivers/gpu/drm/xe/xe_eudebug.c:981:
+#define xe_eudebug_event_put(_d, _err) ({ \
+ if ((_err)) \
+ xe_eudebug_disconnect((_d), (_err)); \
+ xe_eudebug_put((_d)); \
+ })
-:1189: CHECK:MACRO_ARG_REUSE: Macro argument reuse '_err' - possible side-effects?
#1189: FILE: drivers/gpu/drm/xe/xe_eudebug.c:981:
+#define xe_eudebug_event_put(_d, _err) ({ \
+ if ((_err)) \
+ xe_eudebug_disconnect((_d), (_err)); \
+ xe_eudebug_put((_d)); \
+ })
-:1598: WARNING:LONG_LINE: line length of 130 exceeds 100 columns
#1598: FILE: include/uapi/drm/xe_drm.h:121:
+#define DRM_IOCTL_XE_EUDEBUG_CONNECT DRM_IOWR(DRM_COMMAND_BASE + DRM_XE_EUDEBUG_CONNECT, struct drm_xe_eudebug_connect)
total: 1 errors, 2 warnings, 13 checks, 1567 lines checked
555a95de103f drm/xe/eudebug: Introduce discovery for resources
-:96: CHECK:LINE_SPACING: Please use a blank line after function/struct/union/enum declarations
#96: FILE: drivers/gpu/drm/xe/xe_device.h:218:
+}
+static inline void xe_eudebug_discovery_unlock(struct xe_device *xe, unsigned int cmd)
total: 0 errors, 0 warnings, 1 checks, 318 lines checked
4500f7d2a284 drm/xe/eudebug: Introduce exec_queue events
1736ee985dee drm/xe/eudebug: hw enablement for eudebug
a42f39cf53a1 drm/xe: Add EUDEBUG_ENABLE exec queue property
98b8b7fa844b drm/xe/eudebug: Introduce per device attention scan worker
-:396: CHECK:LINE_SPACING: Please don't use multiple blank lines
#396: FILE: drivers/gpu/drm/xe/xe_eudebug.c:1129:
+
+
-:628: WARNING:FILE_PATH_CHANGES: added, moved or deleted file(s), does MAINTAINERS need updating?
#628:
new file mode 100644
total: 0 errors, 1 warnings, 1 checks, 748 lines checked
b73f6e4a2233 drm/xe/eudebug: Introduce EU control interface
07baf3ff0a6d drm/xe/eudebug: Add vm bind and vm bind ops
473026cdba21 drm/xe/eudebug: Add UFENCE events with acks
-:416: WARNING:LONG_LINE: line length of 114 exceeds 100 columns
#416: FILE: drivers/gpu/drm/xe/xe_eudebug.h:78:
+static inline void xe_eudebug_ufence_init(struct xe_user_fence *ufence, struct xe_file *xef, struct xe_vm *vm) { }
-:634: CHECK:UNCOMMENTED_DEFINITION: spinlock_t definition without comment
#634: FILE: drivers/gpu/drm/xe/xe_sync_types.h:26:
+ spinlock_t lock;
total: 0 errors, 1 warnings, 1 checks, 607 lines checked
93c4e43b4a35 drm/xe/eudebug: vm open/pread/pwrite
-:119: CHECK:PARENTHESIS_ALIGNMENT: Alignment should match open parenthesis
#119: FILE: drivers/gpu/drm/xe/xe_eudebug.c:2961:
+static int xe_eudebug_bovma_access(struct xe_bo *bo, u64 offset,
+ void *buf, u64 len, bool write)
total: 0 errors, 0 warnings, 1 checks, 571 lines checked
026f54b4f747 drm/xe/eudebug: implement userptr_vma access
0e4685e3d581 drm/xe: Debug metadata create/destroy ioctls
-:35: WARNING:FILE_PATH_CHANGES: added, moved or deleted file(s), does MAINTAINERS need updating?
#35:
new file mode 100644
-:202: CHECK:LINE_SPACING: Please don't use multiple blank lines
#202: FILE: drivers/gpu/drm/xe/xe_debug_metadata.h:49:
+
+
-:354: WARNING:LONG_LINE: line length of 143 exceeds 100 columns
#354: FILE: include/uapi/drm/xe_drm.h:123:
+#define DRM_IOCTL_XE_DEBUG_METADATA_CREATE DRM_IOWR(DRM_COMMAND_BASE + DRM_XE_DEBUG_METADATA_CREATE, struct drm_xe_debug_metadata_create)
-:355: WARNING:LONG_LINE: line length of 144 exceeds 100 columns
#355: FILE: include/uapi/drm/xe_drm.h:124:
+#define DRM_IOCTL_XE_DEBUG_METADATA_DESTROY DRM_IOW(DRM_COMMAND_BASE + DRM_XE_DEBUG_METADATA_DESTROY, struct drm_xe_debug_metadata_destroy)
total: 0 errors, 3 warnings, 1 checks, 341 lines checked
00921daa6db9 drm/xe: Attach debug metadata to vma
-:6: WARNING:COMMIT_LOG_LONG_LINE: Prefer a maximum 75 chars per line (possible unwrapped commit description?)
#6:
Introduces a vm_bind_op extension, enabling users to attach metadata objects
-:208: WARNING:LONG_LINE: line length of 107 exceeds 100 columns
#208: FILE: drivers/gpu/drm/xe/xe_debug_metadata.h:55:
+static inline struct xe_debug_metadata *xe_debug_metadata_get(struct xe_file *xef, u32 id) { return NULL; }
-:313: WARNING:LONG_LINE: line length of 109 exceeds 100 columns
#313: FILE: drivers/gpu/drm/xe/xe_vm.c:2259:
+ err = xe_eudebug_copy_vma_metadata(&op->remap.prev->eudebug.metadata,
total: 0 errors, 3 warnings, 0 checks, 482 lines checked
b219f4e3b123 drm/xe/eudebug: Add debug metadata support for xe_eudebug
-:528: WARNING:LONG_LINE: line length of 122 exceeds 100 columns
#528: FILE: drivers/gpu/drm/xe/xe_eudebug.h:80:
+static inline void xe_eudebug_vm_bind_op_add(struct xe_vm *vm, u32 op, u64 addr, u64 range, struct drm_gpuva_ops *ops) { }
-:536: WARNING:LONG_LINE: line length of 105 exceeds 100 columns
#536: FILE: drivers/gpu/drm/xe/xe_eudebug.h:90:
+static inline void xe_eudebug_debug_metadata_create(struct xe_file *xef, struct xe_debug_metadata *m) { }
-:537: WARNING:LONG_LINE: line length of 106 exceeds 100 columns
#537: FILE: drivers/gpu/drm/xe/xe_eudebug.h:91:
+static inline void xe_eudebug_debug_metadata_destroy(struct xe_file *xef, struct xe_debug_metadata *m) { }
total: 0 errors, 3 warnings, 0 checks, 580 lines checked
83c2344fb226 drm/xe/eudebug: Implement vm_bind_op discovery
8ff05fe6c727 drm/xe/eudebug: Dynamically toggle debugger functionality
7f3c79420e34 drm/xe/eudebug_test: Introduce xe_eudebug wa kunit test
-:17: WARNING:FILE_PATH_CHANGES: added, moved or deleted file(s), does MAINTAINERS need updating?
#17:
new file mode 100644
total: 0 errors, 1 warnings, 0 checks, 193 lines checked
d44780a1aa4e drm/xe/eudebug: Support EU online debug on pagefault
-:315: ERROR:SPACING: spaces required around that '=' (ctx:WxV)
#315: FILE: drivers/gpu/drm/xe/xe_eudebug.c:4075:
+ struct xe_gt *gt =pf->q->gt;
^
-:374: CHECK:COMPARISON_TO_NULL: Comparison to NULL could be written "!fence"
#374: FILE: drivers/gpu/drm/xe/xe_eudebug.c:4134:
+ if (fence == NULL)
-:419: WARNING:LONG_LINE: line length of 102 exceeds 100 columns
#419: FILE: drivers/gpu/drm/xe/xe_eudebug.h:60:
+struct xe_exec_queue *xe_eudebug_runalone_active_debuggable_queue_get(struct xe_gt *gt, int *lrc_idx);
-:438: WARNING:LONG_LINE: line length of 132 exceeds 100 columns
#438: FILE: drivers/gpu/drm/xe/xe_eudebug.h:102:
+static inline struct xe_exec_queue *xe_eudebug_runalone_active_debuggable_queue_get(struct xe_gt *gt, int *lrc_idx) { return NULL; }
-:441: WARNING:LONG_LINE: line length of 113 exceeds 100 columns
#441: FILE: drivers/gpu/drm/xe/xe_eudebug.h:105:
+static inline int xe_eudebug_handle_page_fault(struct xe_gt *gt, struct xe_eudebug_pagefault *d_pf) { return 0; }
-:442: WARNING:LONG_LINE: line length of 105 exceeds 100 columns
#442: FILE: drivers/gpu/drm/xe/xe_eudebug.h:106:
+static inline struct xe_eudebug_pagefault_fence *xe_eudebug_pagefault_fence_create(void) { return NULL; }
-:465: CHECK:UNCOMMENTED_DEFINITION: struct mutex definition without comment
#465: FILE: drivers/gpu/drm/xe/xe_eudebug_types.h:167:
+ struct mutex pf_lock;
-:532: CHECK:UNCOMMENTED_DEFINITION: spinlock_t definition without comment
#532: FILE: drivers/gpu/drm/xe/xe_eudebug_types.h:391:
+ spinlock_t lock;
-:598: WARNING:MISSING_EOF_NEWLINE: adding a line without newline at end of file
#598: FILE: drivers/gpu/drm/xe/xe_gt_debug.c:199:
+}
-:727: WARNING:BRACES: braces {} are not necessary for single statement blocks
#727: FILE: drivers/gpu/drm/xe/xe_gt_pagefault.c:276:
+ if (!pagefault_fence) {
+ goto err_unlock_eu_lock;
+ }
-:747: CHECK:USLEEP_RANGE: usleep_range is preferred over udelay; see Documentation/timers/timers-howto.rst
#747: FILE: drivers/gpu/drm/xe/xe_gt_pagefault.c:296:
+ udelay(200);
-:755: CHECK:USLEEP_RANGE: usleep_range is preferred over udelay; see Documentation/timers/timers-howto.rst
#755: FILE: drivers/gpu/drm/xe/xe_gt_pagefault.c:304:
+ udelay(200);
-:804: WARNING:LINE_SPACING: Missing a blank line after declarations
#804: FILE: drivers/gpu/drm/xe/xe_gt_pagefault.c:353:
+ struct xe_device *xe = gt_to_xe(gt);
+ drm_warn(&xe->drm, "Forcewake fail: Can not recover TD_CTL");
-:885: CHECK:LINE_SPACING: Please don't use multiple blank lines
#885: FILE: drivers/gpu/drm/xe/xe_gt_pagefault.c:439:
+
+
-:900: WARNING:BLOCK_COMMENT_STYLE: Block comments use a trailing */ on a separate line
#900: FILE: drivers/gpu/drm/xe/xe_gt_pagefault.c:454:
+ * in another context has allocated.*/
-:924: ERROR:ELSE_AFTER_BRACE: else should follow close brace '}'
#924: FILE: drivers/gpu/drm/xe/xe_gt_pagefault.c:478:
+ }
+ else {
-:924: CHECK:BRACES: Unbalanced braces around else statement
#924: FILE: drivers/gpu/drm/xe/xe_gt_pagefault.c:478:
+ else {
-:970: WARNING:BRACES: braces {} are not necessary for single statement blocks
#970: FILE: drivers/gpu/drm/xe/xe_gt_pagefault.c:650:
+ if (unlikely(ret)) {
+ drm_dbg(&xe->drm, "GuC Pagefault reply failed: %d\n", ret);
+ }
total: 2 errors, 9 warnings, 7 checks, 910 lines checked
^ permalink raw reply [flat|nested] 28+ messages in thread* ✓ CI.KUnit: success for Support EU online debug on pagefault
2024-10-21 9:58 [RFC 00/19] Support EU online debug on pagefault Gwan-gyeong Mun
` (20 preceding siblings ...)
2024-10-21 10:08 ` ✗ CI.checkpatch: warning " Patchwork
@ 2024-10-21 10:09 ` Patchwork
2024-10-21 10:21 ` ✓ CI.Build: " Patchwork
` (3 subsequent siblings)
25 siblings, 0 replies; 28+ messages in thread
From: Patchwork @ 2024-10-21 10:09 UTC (permalink / raw)
To: Gwan-gyeong Mun; +Cc: intel-xe
== Series Details ==
Series: Support EU online debug on pagefault
URL : https://patchwork.freedesktop.org/series/140239/
State : success
== Summary ==
+ trap cleanup EXIT
+ /kernel/tools/testing/kunit/kunit.py run --kunitconfig /kernel/drivers/gpu/drm/xe/.kunitconfig
[10:08:14] Configuring KUnit Kernel ...
Generating .config ...
Populating config with:
$ make ARCH=um O=.kunit olddefconfig
[10:08:18] Building KUnit Kernel ...
Populating config with:
$ make ARCH=um O=.kunit olddefconfig
Building with:
$ make all compile_commands.json ARCH=um O=.kunit --jobs=48
../lib/iomap.c:156:5: warning: no previous prototype for ‘ioread64_lo_hi’ [-Wmissing-prototypes]
156 | u64 ioread64_lo_hi(const void __iomem *addr)
| ^~~~~~~~~~~~~~
../lib/iomap.c:163:5: warning: no previous prototype for ‘ioread64_hi_lo’ [-Wmissing-prototypes]
163 | u64 ioread64_hi_lo(const void __iomem *addr)
| ^~~~~~~~~~~~~~
../lib/iomap.c:170:5: warning: no previous prototype for ‘ioread64be_lo_hi’ [-Wmissing-prototypes]
170 | u64 ioread64be_lo_hi(const void __iomem *addr)
| ^~~~~~~~~~~~~~~~
../lib/iomap.c:178:5: warning: no previous prototype for ‘ioread64be_hi_lo’ [-Wmissing-prototypes]
178 | u64 ioread64be_hi_lo(const void __iomem *addr)
| ^~~~~~~~~~~~~~~~
../lib/iomap.c:264:6: warning: no previous prototype for ‘iowrite64_lo_hi’ [-Wmissing-prototypes]
264 | void iowrite64_lo_hi(u64 val, void __iomem *addr)
| ^~~~~~~~~~~~~~~
../lib/iomap.c:272:6: warning: no previous prototype for ‘iowrite64_hi_lo’ [-Wmissing-prototypes]
272 | void iowrite64_hi_lo(u64 val, void __iomem *addr)
| ^~~~~~~~~~~~~~~
../lib/iomap.c:280:6: warning: no previous prototype for ‘iowrite64be_lo_hi’ [-Wmissing-prototypes]
280 | void iowrite64be_lo_hi(u64 val, void __iomem *addr)
| ^~~~~~~~~~~~~~~~~
../lib/iomap.c:288:6: warning: no previous prototype for ‘iowrite64be_hi_lo’ [-Wmissing-prototypes]
288 | void iowrite64be_hi_lo(u64 val, void __iomem *addr)
| ^~~~~~~~~~~~~~~~~
[10:08:47] Starting KUnit Kernel (1/1)...
[10:08:47] ============================================================
Running tests with:
$ .kunit/linux kunit.enable=1 mem=1G console=tty kunit_shutdown=halt
[10:08:47] =================== guc_dbm (7 subtests) ===================
[10:08:47] [PASSED] test_empty
[10:08:47] [PASSED] test_default
[10:08:47] ======================== test_size ========================
[10:08:47] [PASSED] 4
[10:08:47] [PASSED] 8
[10:08:47] [PASSED] 32
[10:08:47] [PASSED] 256
[10:08:47] ==================== [PASSED] test_size ====================
[10:08:47] ======================= test_reuse ========================
[10:08:47] [PASSED] 4
[10:08:47] [PASSED] 8
[10:08:47] [PASSED] 32
[10:08:47] [PASSED] 256
[10:08:47] =================== [PASSED] test_reuse ====================
[10:08:47] =================== test_range_overlap ====================
[10:08:47] [PASSED] 4
[10:08:47] [PASSED] 8
[10:08:47] [PASSED] 32
[10:08:47] [PASSED] 256
[10:08:47] =============== [PASSED] test_range_overlap ================
[10:08:47] =================== test_range_compact ====================
[10:08:47] [PASSED] 4
[10:08:47] [PASSED] 8
[10:08:47] [PASSED] 32
[10:08:47] [PASSED] 256
[10:08:47] =============== [PASSED] test_range_compact ================
[10:08:47] ==================== test_range_spare =====================
[10:08:47] [PASSED] 4
[10:08:47] [PASSED] 8
[10:08:47] [PASSED] 32
[10:08:47] [PASSED] 256
[10:08:47] ================ [PASSED] test_range_spare =================
[10:08:47] ===================== [PASSED] guc_dbm =====================
[10:08:47] =================== guc_idm (6 subtests) ===================
[10:08:47] [PASSED] bad_init
[10:08:47] [PASSED] no_init
[10:08:47] [PASSED] init_fini
[10:08:47] [PASSED] check_used
[10:08:47] [PASSED] check_quota
[10:08:47] [PASSED] check_all
[10:08:47] ===================== [PASSED] guc_idm =====================
[10:08:47] ================== no_relay (3 subtests) ===================
[10:08:47] [PASSED] xe_drops_guc2pf_if_not_ready
[10:08:47] [PASSED] xe_drops_guc2vf_if_not_ready
[10:08:47] [PASSED] xe_rejects_send_if_not_ready
[10:08:47] ==================== [PASSED] no_relay =====================
[10:08:47] ================== pf_relay (14 subtests) ==================
[10:08:47] [PASSED] pf_rejects_guc2pf_too_short
[10:08:47] [PASSED] pf_rejects_guc2pf_too_long
[10:08:47] [PASSED] pf_rejects_guc2pf_no_payload
[10:08:47] [PASSED] pf_fails_no_payload
[10:08:47] [PASSED] pf_fails_bad_origin
[10:08:47] [PASSED] pf_fails_bad_type
[10:08:47] [PASSED] pf_txn_reports_error
[10:08:47] [PASSED] pf_txn_sends_pf2guc
[10:08:47] [PASSED] pf_sends_pf2guc
[10:08:47] [SKIPPED] pf_loopback_nop
[10:08:47] [SKIPPED] pf_loopback_echo
[10:08:47] [SKIPPED] pf_loopback_fail
[10:08:47] [SKIPPED] pf_loopback_busy
[10:08:47] [SKIPPED] pf_loopback_retry
[10:08:47] ==================== [PASSED] pf_relay =====================
[10:08:47] ================== vf_relay (3 subtests) ===================
[10:08:47] [PASSED] vf_rejects_guc2vf_too_short
[10:08:47] [PASSED] vf_rejects_guc2vf_too_long
[10:08:47] [PASSED] vf_rejects_guc2vf_no_payload
[10:08:47] ==================== [PASSED] vf_relay =====================
[10:08:47] ================= pf_service (11 subtests) =================
[10:08:47] [PASSED] pf_negotiate_any
[10:08:47] [PASSED] pf_negotiate_base_match
[10:08:47] [PASSED] pf_negotiate_base_newer
[10:08:47] [PASSED] pf_negotiate_base_next
[10:08:47] [SKIPPED] pf_negotiate_base_older
[10:08:47] [PASSED] pf_negotiate_base_prev
[10:08:47] [PASSED] pf_negotiate_latest_match
[10:08:47] [PASSED] pf_negotiate_latest_newer
[10:08:47] [PASSED] pf_negotiate_latest_next
[10:08:47] [SKIPPED] pf_negotiate_latest_older
[10:08:47] [SKIPPED] pf_negotiate_latest_prev
[10:08:47] =================== [PASSED] pf_service ====================
[10:08:47] ===================== lmtt (1 subtest) =====================
[10:08:47] ======================== test_ops =========================
[10:08:47] [PASSED] 2-level
[10:08:47] [PASSED] multi-level
[10:08:47] ==================== [PASSED] test_ops =====================
[10:08:47] ====================== [PASSED] lmtt =======================
[10:08:47] ================== xe_eudebug (1 subtest) ==================
[10:08:47] =============== xe_eudebug_toggle_reg_kunit ===============
[10:08:47] ========== [SKIPPED] xe_eudebug_toggle_reg_kunit ===========
[10:08:47] =================== [SKIPPED] xe_eudebug ===================
[10:08:47] =================== xe_mocs (2 subtests) ===================
[10:08:47] ================ xe_live_mocs_kernel_kunit ================
[10:08:47] =========== [SKIPPED] xe_live_mocs_kernel_kunit ============
[10:08:47] ================ xe_live_mocs_reset_kunit =================
[10:08:47] ============ [SKIPPED] xe_live_mocs_reset_kunit ============
[10:08:47] ==================== [SKIPPED] xe_mocs =====================
[10:08:47] ================= xe_migrate (2 subtests) ==================
[10:08:47] ================= xe_migrate_sanity_kunit =================
[10:08:47] ============ [SKIPPED] xe_migrate_sanity_kunit =============
[10:08:47] ================== xe_validate_ccs_kunit ==================
[10:08:47] ============= [SKIPPED] xe_validate_ccs_kunit ==============
[10:08:47] =================== [SKIPPED] xe_migrate ===================
[10:08:47] ================== xe_dma_buf (1 subtest) ==================
[10:08:47] ==================== xe_dma_buf_kunit =====================
[10:08:47] ================ [SKIPPED] xe_dma_buf_kunit ================
[10:08:47] =================== [SKIPPED] xe_dma_buf ===================
[10:08:47] ==================== xe_bo (3 subtests) ====================
[10:08:47] ================== xe_ccs_migrate_kunit ===================
[10:08:47] ============== [SKIPPED] xe_ccs_migrate_kunit ==============
[10:08:47] ==================== xe_bo_evict_kunit ====================
[10:08:47] =============== [SKIPPED] xe_bo_evict_kunit ================
[10:08:47] =================== xe_bo_shrink_kunit ====================
[10:08:47] =============== [SKIPPED] xe_bo_shrink_kunit ===============
[10:08:47] ===================== [SKIPPED] xe_bo ======================
[10:08:47] ==================== args (11 subtests) ====================
[10:08:47] [PASSED] count_args_test
[10:08:47] [PASSED] call_args_example
[10:08:47] [PASSED] call_args_test
stty: 'standard input': Inappropriate ioctl for device
[10:08:47] [PASSED] drop_first_arg_example
[10:08:47] [PASSED] drop_first_arg_test
[10:08:47] [PASSED] first_arg_example
[10:08:47] [PASSED] first_arg_test
[10:08:47] [PASSED] last_arg_example
[10:08:47] [PASSED] last_arg_test
[10:08:47] [PASSED] pick_arg_example
[10:08:47] [PASSED] sep_comma_example
[10:08:47] ====================== [PASSED] args =======================
[10:08:47] =================== xe_pci (2 subtests) ====================
[10:08:47] [PASSED] xe_gmdid_graphics_ip
[10:08:47] [PASSED] xe_gmdid_media_ip
[10:08:47] ===================== [PASSED] xe_pci ======================
[10:08:47] =================== xe_rtp (2 subtests) ====================
[10:08:47] =============== xe_rtp_process_to_sr_tests ================
[10:08:47] [PASSED] coalesce-same-reg
[10:08:47] [PASSED] no-match-no-add
[10:08:47] [PASSED] match-or
[10:08:47] [PASSED] match-or-xfail
[10:08:47] [PASSED] no-match-no-add-multiple-rules
[10:08:47] [PASSED] two-regs-two-entries
[10:08:47] [PASSED] clr-one-set-other
[10:08:47] [PASSED] set-field
[10:08:47] [PASSED] conflict-duplicate
[10:08:47] [PASSED] conflict-not-disjoint
[10:08:47] [PASSED] conflict-reg-type
[10:08:47] =========== [PASSED] xe_rtp_process_to_sr_tests ============
[10:08:47] ================== xe_rtp_process_tests ===================
[10:08:47] [PASSED] active1
[10:08:47] [PASSED] active2
[10:08:47] [PASSED] active-inactive
[10:08:47] [PASSED] inactive-active
[10:08:47] [PASSED] inactive-1st_or_active-inactive
[10:08:47] [PASSED] inactive-2nd_or_active-inactive
[10:08:47] [PASSED] inactive-last_or_active-inactive
[10:08:47] [PASSED] inactive-no_or_active-inactive
[10:08:47] ============== [PASSED] xe_rtp_process_tests ===============
[10:08:47] ===================== [PASSED] xe_rtp ======================
[10:08:47] ==================== xe_wa (1 subtest) =====================
[10:08:47] ======================== xe_wa_gt =========================
[10:08:47] [PASSED] TIGERLAKE (B0)
[10:08:47] [PASSED] DG1 (A0)
[10:08:47] [PASSED] DG1 (B0)
[10:08:47] [PASSED] ALDERLAKE_S (A0)
[10:08:47] [PASSED] ALDERLAKE_S (B0)
[10:08:47] [PASSED] ALDERLAKE_S (C0)
[10:08:47] [PASSED] ALDERLAKE_S (D0)
[10:08:47] [PASSED] ALDERLAKE_P (A0)
[10:08:47] [PASSED] ALDERLAKE_P (B0)
[10:08:47] [PASSED] ALDERLAKE_P (C0)
[10:08:47] [PASSED] ALDERLAKE_S_RPLS (D0)
[10:08:47] [PASSED] ALDERLAKE_P_RPLU (E0)
[10:08:47] [PASSED] DG2_G10 (C0)
[10:08:47] [PASSED] DG2_G11 (B1)
[10:08:47] [PASSED] DG2_G12 (A1)
[10:08:47] [PASSED] METEORLAKE (g:A0, m:A0)
[10:08:47] [PASSED] METEORLAKE (g:A0, m:A0)
[10:08:47] [PASSED] METEORLAKE (g:A0, m:A0)
[10:08:47] [PASSED] LUNARLAKE (g:A0, m:A0)
[10:08:47] [PASSED] LUNARLAKE (g:B0, m:A0)
[10:08:47] [PASSED] BATTLEMAGE (g:A0, m:A1)
[10:08:47] ==================== [PASSED] xe_wa_gt =====================
[10:08:47] ====================== [PASSED] xe_wa ======================
[10:08:47] ============================================================
[10:08:47] Testing complete. Ran 123 tests: passed: 106, skipped: 17
[10:08:47] Elapsed time: 33.152s total, 4.415s configuring, 28.471s building, 0.220s running
+ /kernel/tools/testing/kunit/kunit.py run --kunitconfig /kernel/drivers/gpu/drm/tests/.kunitconfig
[10:08:47] Configuring KUnit Kernel ...
Regenerating .config ...
Populating config with:
$ make ARCH=um O=.kunit olddefconfig
[10:08:49] Building KUnit Kernel ...
Populating config with:
$ make ARCH=um O=.kunit olddefconfig
Building with:
$ make all compile_commands.json ARCH=um O=.kunit --jobs=48
../lib/iomap.c:156:5: warning: no previous prototype for ‘ioread64_lo_hi’ [-Wmissing-prototypes]
156 | u64 ioread64_lo_hi(const void __iomem *addr)
| ^~~~~~~~~~~~~~
../lib/iomap.c:163:5: warning: no previous prototype for ‘ioread64_hi_lo’ [-Wmissing-prototypes]
163 | u64 ioread64_hi_lo(const void __iomem *addr)
| ^~~~~~~~~~~~~~
../lib/iomap.c:170:5: warning: no previous prototype for ‘ioread64be_lo_hi’ [-Wmissing-prototypes]
170 | u64 ioread64be_lo_hi(const void __iomem *addr)
| ^~~~~~~~~~~~~~~~
../lib/iomap.c:178:5: warning: no previous prototype for ‘ioread64be_hi_lo’ [-Wmissing-prototypes]
178 | u64 ioread64be_hi_lo(const void __iomem *addr)
| ^~~~~~~~~~~~~~~~
../lib/iomap.c:264:6: warning: no previous prototype for ‘iowrite64_lo_hi’ [-Wmissing-prototypes]
264 | void iowrite64_lo_hi(u64 val, void __iomem *addr)
| ^~~~~~~~~~~~~~~
../lib/iomap.c:272:6: warning: no previous prototype for ‘iowrite64_hi_lo’ [-Wmissing-prototypes]
272 | void iowrite64_hi_lo(u64 val, void __iomem *addr)
| ^~~~~~~~~~~~~~~
../lib/iomap.c:280:6: warning: no previous prototype for ‘iowrite64be_lo_hi’ [-Wmissing-prototypes]
280 | void iowrite64be_lo_hi(u64 val, void __iomem *addr)
| ^~~~~~~~~~~~~~~~~
../lib/iomap.c:288:6: warning: no previous prototype for ‘iowrite64be_hi_lo’ [-Wmissing-prototypes]
288 | void iowrite64be_hi_lo(u64 val, void __iomem *addr)
| ^~~~~~~~~~~~~~~~~
[10:09:11] Starting KUnit Kernel (1/1)...
[10:09:11] ============================================================
Running tests with:
$ .kunit/linux kunit.enable=1 mem=1G console=tty kunit_shutdown=halt
[10:09:12] ================== drm_buddy (7 subtests) ==================
[10:09:12] [PASSED] drm_test_buddy_alloc_limit
[10:09:12] [PASSED] drm_test_buddy_alloc_optimistic
[10:09:12] [PASSED] drm_test_buddy_alloc_pessimistic
[10:09:12] [PASSED] drm_test_buddy_alloc_pathological
[10:09:12] [PASSED] drm_test_buddy_alloc_contiguous
[10:09:12] [PASSED] drm_test_buddy_alloc_clear
[10:09:12] [PASSED] drm_test_buddy_alloc_range_bias
[10:09:12] ==================== [PASSED] drm_buddy ====================
[10:09:12] ============= drm_cmdline_parser (40 subtests) =============
[10:09:12] [PASSED] drm_test_cmdline_force_d_only
[10:09:12] [PASSED] drm_test_cmdline_force_D_only_dvi
[10:09:12] [PASSED] drm_test_cmdline_force_D_only_hdmi
[10:09:12] [PASSED] drm_test_cmdline_force_D_only_not_digital
[10:09:12] [PASSED] drm_test_cmdline_force_e_only
[10:09:12] [PASSED] drm_test_cmdline_res
[10:09:12] [PASSED] drm_test_cmdline_res_vesa
[10:09:12] [PASSED] drm_test_cmdline_res_vesa_rblank
[10:09:12] [PASSED] drm_test_cmdline_res_rblank
[10:09:12] [PASSED] drm_test_cmdline_res_bpp
[10:09:12] [PASSED] drm_test_cmdline_res_refresh
[10:09:12] [PASSED] drm_test_cmdline_res_bpp_refresh
[10:09:12] [PASSED] drm_test_cmdline_res_bpp_refresh_interlaced
[10:09:12] [PASSED] drm_test_cmdline_res_bpp_refresh_margins
[10:09:12] [PASSED] drm_test_cmdline_res_bpp_refresh_force_off
[10:09:12] [PASSED] drm_test_cmdline_res_bpp_refresh_force_on
[10:09:12] [PASSED] drm_test_cmdline_res_bpp_refresh_force_on_analog
[10:09:12] [PASSED] drm_test_cmdline_res_bpp_refresh_force_on_digital
[10:09:12] [PASSED] drm_test_cmdline_res_bpp_refresh_interlaced_margins_force_on
[10:09:12] [PASSED] drm_test_cmdline_res_margins_force_on
[10:09:12] [PASSED] drm_test_cmdline_res_vesa_margins
[10:09:12] [PASSED] drm_test_cmdline_name
[10:09:12] [PASSED] drm_test_cmdline_name_bpp
[10:09:12] [PASSED] drm_test_cmdline_name_option
[10:09:12] [PASSED] drm_test_cmdline_name_bpp_option
[10:09:12] [PASSED] drm_test_cmdline_rotate_0
[10:09:12] [PASSED] drm_test_cmdline_rotate_90
[10:09:12] [PASSED] drm_test_cmdline_rotate_180
[10:09:12] [PASSED] drm_test_cmdline_rotate_270
[10:09:12] [PASSED] drm_test_cmdline_hmirror
[10:09:12] [PASSED] drm_test_cmdline_vmirror
[10:09:12] [PASSED] drm_test_cmdline_margin_options
[10:09:12] [PASSED] drm_test_cmdline_multiple_options
[10:09:12] [PASSED] drm_test_cmdline_bpp_extra_and_option
[10:09:12] [PASSED] drm_test_cmdline_extra_and_option
[10:09:12] [PASSED] drm_test_cmdline_freestanding_options
[10:09:12] [PASSED] drm_test_cmdline_freestanding_force_e_and_options
[10:09:12] [PASSED] drm_test_cmdline_panel_orientation
[10:09:12] ================ drm_test_cmdline_invalid =================
[10:09:12] [PASSED] margin_only
[10:09:12] [PASSED] interlace_only
[10:09:12] [PASSED] res_missing_x
[10:09:12] [PASSED] res_missing_y
[10:09:12] [PASSED] res_bad_y
[10:09:12] [PASSED] res_missing_y_bpp
[10:09:12] [PASSED] res_bad_bpp
[10:09:12] [PASSED] res_bad_refresh
[10:09:12] [PASSED] res_bpp_refresh_force_on_off
[10:09:12] [PASSED] res_invalid_mode
[10:09:12] [PASSED] res_bpp_wrong_place_mode
[10:09:12] [PASSED] name_bpp_refresh
[10:09:12] [PASSED] name_refresh
[10:09:12] [PASSED] name_refresh_wrong_mode
[10:09:12] [PASSED] name_refresh_invalid_mode
[10:09:12] [PASSED] rotate_multiple
[10:09:12] [PASSED] rotate_invalid_val
[10:09:12] [PASSED] rotate_truncated
[10:09:12] [PASSED] invalid_option
[10:09:12] [PASSED] invalid_tv_option
[10:09:12] [PASSED] truncated_tv_option
[10:09:12] ============ [PASSED] drm_test_cmdline_invalid =============
[10:09:12] =============== drm_test_cmdline_tv_options ===============
[10:09:12] [PASSED] NTSC
[10:09:12] [PASSED] NTSC_443
[10:09:12] [PASSED] NTSC_J
[10:09:12] [PASSED] PAL
[10:09:12] [PASSED] PAL_M
[10:09:12] [PASSED] PAL_N
[10:09:12] [PASSED] SECAM
[10:09:12] [PASSED] MONO_525
[10:09:12] [PASSED] MONO_625
[10:09:12] =========== [PASSED] drm_test_cmdline_tv_options ===========
[10:09:12] =============== [PASSED] drm_cmdline_parser ================
[10:09:12] ========== drmm_connector_hdmi_init (19 subtests) ==========
[10:09:12] [PASSED] drm_test_connector_hdmi_init_valid
[10:09:12] [PASSED] drm_test_connector_hdmi_init_bpc_8
[10:09:12] [PASSED] drm_test_connector_hdmi_init_bpc_10
[10:09:12] [PASSED] drm_test_connector_hdmi_init_bpc_12
[10:09:12] [PASSED] drm_test_connector_hdmi_init_bpc_invalid
[10:09:12] [PASSED] drm_test_connector_hdmi_init_bpc_null
[10:09:12] [PASSED] drm_test_connector_hdmi_init_formats_empty
[10:09:12] [PASSED] drm_test_connector_hdmi_init_formats_no_rgb
[10:09:12] [PASSED] drm_test_connector_hdmi_init_null_ddc
[10:09:12] [PASSED] drm_test_connector_hdmi_init_null_product
[10:09:12] [PASSED] drm_test_connector_hdmi_init_null_vendor
[10:09:12] [PASSED] drm_test_connector_hdmi_init_product_length_exact
[10:09:12] [PASSED] drm_test_connector_hdmi_init_product_length_too_long
[10:09:12] [PASSED] drm_test_connector_hdmi_init_product_valid
[10:09:12] [PASSED] drm_test_connector_hdmi_init_vendor_length_exact
[10:09:12] [PASSED] drm_test_connector_hdmi_init_vendor_length_too_long
[10:09:12] [PASSED] drm_test_connector_hdmi_init_vendor_valid
[10:09:12] ========= drm_test_connector_hdmi_init_type_valid =========
[10:09:12] [PASSED] HDMI-A
[10:09:12] [PASSED] HDMI-B
[10:09:12] ===== [PASSED] drm_test_connector_hdmi_init_type_valid =====
[10:09:12] ======== drm_test_connector_hdmi_init_type_invalid ========
[10:09:12] [PASSED] Unknown
[10:09:12] [PASSED] VGA
[10:09:12] [PASSED] DVI-I
[10:09:12] [PASSED] DVI-D
[10:09:12] [PASSED] DVI-A
[10:09:12] [PASSED] Composite
[10:09:12] [PASSED] SVIDEO
[10:09:12] [PASSED] LVDS
[10:09:12] [PASSED] Component
[10:09:12] [PASSED] DIN
[10:09:12] [PASSED] DP
[10:09:12] [PASSED] TV
[10:09:12] [PASSED] eDP
[10:09:12] [PASSED] Virtual
[10:09:12] [PASSED] DSI
[10:09:12] [PASSED] DPI
[10:09:12] [PASSED] Writeback
[10:09:12] [PASSED] SPI
[10:09:12] [PASSED] USB
[10:09:12] ==== [PASSED] drm_test_connector_hdmi_init_type_invalid ====
[10:09:12] ============ [PASSED] drmm_connector_hdmi_init =============
[10:09:12] ============= drmm_connector_init (3 subtests) =============
[10:09:12] [PASSED] drm_test_drmm_connector_init
[10:09:12] [PASSED] drm_test_drmm_connector_init_null_ddc
[10:09:12] ========= drm_test_drmm_connector_init_type_valid =========
[10:09:12] [PASSED] Unknown
[10:09:12] [PASSED] VGA
[10:09:12] [PASSED] DVI-I
[10:09:12] [PASSED] DVI-D
[10:09:12] [PASSED] DVI-A
[10:09:12] [PASSED] Composite
[10:09:12] [PASSED] SVIDEO
[10:09:12] [PASSED] LVDS
[10:09:12] [PASSED] Component
[10:09:12] [PASSED] DIN
[10:09:12] [PASSED] DP
[10:09:12] [PASSED] HDMI-A
[10:09:12] [PASSED] HDMI-B
[10:09:12] [PASSED] TV
[10:09:12] [PASSED] eDP
[10:09:12] [PASSED] Virtual
[10:09:12] [PASSED] DSI
[10:09:12] [PASSED] DPI
[10:09:12] [PASSED] Writeback
[10:09:12] [PASSED] SPI
[10:09:12] [PASSED] USB
[10:09:12] ===== [PASSED] drm_test_drmm_connector_init_type_valid =====
[10:09:12] =============== [PASSED] drmm_connector_init ===============
[10:09:12] = drm_connector_attach_broadcast_rgb_property (2 subtests) =
[10:09:12] [PASSED] drm_test_drm_connector_attach_broadcast_rgb_property
[10:09:12] [PASSED] drm_test_drm_connector_attach_broadcast_rgb_property_hdmi_connector
[10:09:12] === [PASSED] drm_connector_attach_broadcast_rgb_property ===
[10:09:12] ========== drm_get_tv_mode_from_name (2 subtests) ==========
[10:09:12] ========== drm_test_get_tv_mode_from_name_valid ===========
[10:09:12] [PASSED] NTSC
[10:09:12] [PASSED] NTSC-443
[10:09:12] [PASSED] NTSC-J
[10:09:12] [PASSED] PAL
[10:09:12] [PASSED] PAL-M
[10:09:12] [PASSED] PAL-N
[10:09:12] [PASSED] SECAM
[10:09:12] [PASSED] Mono
[10:09:12] ====== [PASSED] drm_test_get_tv_mode_from_name_valid =======
[10:09:12] [PASSED] drm_test_get_tv_mode_from_name_truncated
[10:09:12] ============ [PASSED] drm_get_tv_mode_from_name ============
[10:09:12] = drm_test_connector_hdmi_compute_mode_clock (12 subtests) =
[10:09:12] [PASSED] drm_test_drm_hdmi_compute_mode_clock_rgb
[10:09:12] [PASSED] drm_test_drm_hdmi_compute_mode_clock_rgb_10bpc
[10:09:12] [PASSED] drm_test_drm_hdmi_compute_mode_clock_rgb_10bpc_vic_1
[10:09:12] [PASSED] drm_test_drm_hdmi_compute_mode_clock_rgb_12bpc
[10:09:12] [PASSED] drm_test_drm_hdmi_compute_mode_clock_rgb_12bpc_vic_1
[10:09:12] [PASSED] drm_test_drm_hdmi_compute_mode_clock_rgb_double
[10:09:12] = drm_test_connector_hdmi_compute_mode_clock_yuv420_valid =
[10:09:12] [PASSED] VIC 96
[10:09:12] [PASSED] VIC 97
[10:09:12] [PASSED] VIC 101
[10:09:12] [PASSED] VIC 102
[10:09:12] [PASSED] VIC 106
[10:09:12] [PASSED] VIC 107
[10:09:12] === [PASSED] drm_test_connector_hdmi_compute_mode_clock_yuv420_valid ===
[10:09:12] [PASSED] drm_test_connector_hdmi_compute_mode_clock_yuv420_10_bpc
[10:09:12] [PASSED] drm_test_connector_hdmi_compute_mode_clock_yuv420_12_bpc
[10:09:12] [PASSED] drm_test_connector_hdmi_compute_mode_clock_yuv422_8_bpc
[10:09:12] [PASSED] drm_test_connector_hdmi_compute_mode_clock_yuv422_10_bpc
[10:09:12] [PASSED] drm_test_connector_hdmi_compute_mode_clock_yuv422_12_bpc
[10:09:12] === [PASSED] drm_test_connector_hdmi_compute_mode_clock ====
[10:09:12] == drm_hdmi_connector_get_broadcast_rgb_name (2 subtests) ==
[10:09:12] === drm_test_drm_hdmi_connector_get_broadcast_rgb_name ====
[10:09:12] [PASSED] Automatic
[10:09:12] [PASSED] Full
[10:09:12] [PASSED] Limited 16:235
[10:09:12] === [PASSED] drm_test_drm_hdmi_connector_get_broadcast_rgb_name ===
[10:09:12] [PASSED] drm_test_drm_hdmi_connector_get_broadcast_rgb_name_invalid
[10:09:12] ==== [PASSED] drm_hdmi_connector_get_broadcast_rgb_name ====
[10:09:12] == drm_hdmi_connector_get_output_format_name (2 subtests) ==
[10:09:12] === drm_test_drm_hdmi_connector_get_output_format_name ====
[10:09:12] [PASSED] RGB
[10:09:12] [PASSED] YUV 4:2:0
[10:09:12] [PASSED] YUV 4:2:2
[10:09:12] [PASSED] YUV 4:4:4
[10:09:12] === [PASSED] drm_test_drm_hdmi_connector_get_output_format_name ===
[10:09:12] [PASSED] drm_test_drm_hdmi_connector_get_output_format_name_invalid
[10:09:12] ==== [PASSED] drm_hdmi_connector_get_output_format_name ====
[10:09:12] ============= drm_damage_helper (21 subtests) ==============
[10:09:12] [PASSED] drm_test_damage_iter_no_damage
[10:09:12] [PASSED] drm_test_damage_iter_no_damage_fractional_src
[10:09:12] [PASSED] drm_test_damage_iter_no_damage_src_moved
[10:09:12] [PASSED] drm_test_damage_iter_no_damage_fractional_src_moved
[10:09:12] [PASSED] drm_test_damage_iter_no_damage_not_visible
[10:09:12] [PASSED] drm_test_damage_iter_no_damage_no_crtc
[10:09:12] [PASSED] drm_test_damage_iter_no_damage_no_fb
[10:09:12] [PASSED] drm_test_damage_iter_simple_damage
[10:09:12] [PASSED] drm_test_damage_iter_single_damage
[10:09:12] [PASSED] drm_test_damage_iter_single_damage_intersect_src
[10:09:12] [PASSED] drm_test_damage_iter_single_damage_outside_src
[10:09:12] [PASSED] drm_test_damage_iter_single_damage_fractional_src
[10:09:12] [PASSED] drm_test_damage_iter_single_damage_intersect_fractional_src
[10:09:12] [PASSED] drm_test_damage_iter_single_damage_outside_fractional_src
[10:09:12] [PASSED] drm_test_damage_iter_single_damage_src_moved
[10:09:12] [PASSED] drm_test_damage_iter_single_damage_fractional_src_moved
[10:09:12] [PASSED] drm_test_damage_iter_damage
[10:09:12] [PASSED] drm_test_damage_iter_damage_one_intersect
[10:09:12] [PASSED] drm_test_damage_iter_damage_one_outside
[10:09:12] [PASSED] drm_test_damage_iter_damage_src_moved
[10:09:12] [PASSED] drm_test_damage_iter_damage_not_visible
[10:09:12] ================ [PASSED] drm_damage_helper ================
[10:09:12] ============== drm_dp_mst_helper (3 subtests) ==============
[10:09:12] ============== drm_test_dp_mst_calc_pbn_mode ==============
[10:09:12] [PASSED] Clock 154000 BPP 30 DSC disabled
[10:09:12] [PASSED] Clock 234000 BPP 30 DSC disabled
[10:09:12] [PASSED] Clock 297000 BPP 24 DSC disabled
[10:09:12] [PASSED] Clock 332880 BPP 24 DSC enabled
[10:09:12] [PASSED] Clock 324540 BPP 24 DSC enabled
[10:09:12] ========== [PASSED] drm_test_dp_mst_calc_pbn_mode ==========
[10:09:12] ============== drm_test_dp_mst_calc_pbn_div ===============
[10:09:12] [PASSED] Link rate 2000000 lane count 4
[10:09:12] [PASSED] Link rate 2000000 lane count 2
[10:09:12] [PASSED] Link rate 2000000 lane count 1
[10:09:12] [PASSED] Link rate 1350000 lane count 4
[10:09:12] [PASSED] Link rate 1350000 lane count 2
[10:09:12] [PASSED] Link rate 1350000 lane count 1
[10:09:12] [PASSED] Link rate 1000000 lane count 4
[10:09:12] [PASSED] Link rate 1000000 lane count 2
[10:09:12] [PASSED] Link rate 1000000 lane count 1
[10:09:12] [PASSED] Link rate 810000 lane count 4
[10:09:12] [PASSED] Link rate 810000 lane count 2
[10:09:12] [PASSED] Link rate 810000 lane count 1
[10:09:12] [PASSED] Link rate 540000 lane count 4
[10:09:12] [PASSED] Link rate 540000 lane count 2
[10:09:12] [PASSED] Link rate 540000 lane count 1
[10:09:12] [PASSED] Link rate 270000 lane count 4
[10:09:12] [PASSED] Link rate 270000 lane count 2
[10:09:12] [PASSED] Link rate 270000 lane count 1
[10:09:12] [PASSED] Link rate 162000 lane count 4
[10:09:12] [PASSED] Link rate 162000 lane count 2
[10:09:12] [PASSED] Link rate 162000 lane count 1
[10:09:12] ========== [PASSED] drm_test_dp_mst_calc_pbn_div ===========
[10:09:12] ========= drm_test_dp_mst_sideband_msg_req_decode =========
[10:09:12] [PASSED] DP_ENUM_PATH_RESOURCES with port number
[10:09:12] [PASSED] DP_POWER_UP_PHY with port number
[10:09:12] [PASSED] DP_POWER_DOWN_PHY with port number
[10:09:12] [PASSED] DP_ALLOCATE_PAYLOAD with SDP stream sinks
[10:09:12] [PASSED] DP_ALLOCATE_PAYLOAD with port number
[10:09:12] [PASSED] DP_ALLOCATE_PAYLOAD with VCPI
[10:09:12] [PASSED] DP_ALLOCATE_PAYLOAD with PBN
[10:09:12] [PASSED] DP_QUERY_PAYLOAD with port number
[10:09:12] [PASSED] DP_QUERY_PAYLOAD with VCPI
[10:09:12] [PASSED] DP_REMOTE_DPCD_READ with port number
[10:09:12] [PASSED] DP_REMOTE_DPCD_READ with DPCD address
[10:09:12] [PASSED] DP_REMOTE_DPCD_READ with max number of bytes
[10:09:12] [PASSED] DP_REMOTE_DPCD_WRITE with port number
[10:09:12] [PASSED] DP_REMOTE_DPCD_WRITE with DPCD address
[10:09:12] [PASSED] DP_REMOTE_DPCD_WRITE with data array
[10:09:12] [PASSED] DP_REMOTE_I2C_READ with port number
[10:09:12] [PASSED] DP_REMOTE_I2C_READ with I2C device ID
[10:09:12] [PASSED] DP_REMOTE_I2C_READ with transactions array
[10:09:12] [PASSED] DP_REMOTE_I2C_WRITE with port number
[10:09:12] [PASSED] DP_REMOTE_I2C_WRITE with I2C device ID
[10:09:12] [PASSED] DP_REMOTE_I2C_WRITE with data array
[10:09:12] [PASSED] DP_QUERY_STREAM_ENC_STATUS with stream ID
[10:09:12] [PASSED] DP_QUERY_STREAM_ENC_STATUS with client ID
[10:09:12] [PASSED] DP_QUERY_STREAM_ENC_STATUS with stream event
[10:09:12] [PASSED] DP_QUERY_STREAM_ENC_STATUS with valid stream event
[10:09:12] [PASSED] DP_QUERY_STREAM_ENC_STATUS with stream behavior
[10:09:12] [PASSED] DP_QUERY_STREAM_ENC_STATUS with a valid stream behavior
[10:09:12] ===== [PASSED] drm_test_dp_mst_sideband_msg_req_decode =====
[10:09:12] ================ [PASSED] drm_dp_mst_helper ================
[10:09:12] ================== drm_exec (7 subtests) ===================
[10:09:12] [PASSED] sanitycheck
[10:09:12] [PASSED] test_lock
[10:09:12] [PASSED] test_lock_unlock
[10:09:12] [PASSED] test_duplicates
[10:09:12] [PASSED] test_prepare
[10:09:12] [PASSED] test_prepare_array
[10:09:12] [PASSED] test_multiple_loops
[10:09:12] ==================== [PASSED] drm_exec =====================
[10:09:12] =========== drm_format_helper_test (17 subtests) ===========
[10:09:12] ============== drm_test_fb_xrgb8888_to_gray8 ==============
[10:09:12] [PASSED] single_pixel_source_buffer
[10:09:12] [PASSED] single_pixel_clip_rectangle
[10:09:12] [PASSED] well_known_colors
[10:09:12] [PASSED] destination_pitch
[10:09:12] ========== [PASSED] drm_test_fb_xrgb8888_to_gray8 ==========
[10:09:12] ============= drm_test_fb_xrgb8888_to_rgb332 ==============
[10:09:12] [PASSED] single_pixel_source_buffer
[10:09:12] [PASSED] single_pixel_clip_rectangle
[10:09:12] [PASSED] well_known_colors
[10:09:12] [PASSED] destination_pitch
[10:09:12] ========= [PASSED] drm_test_fb_xrgb8888_to_rgb332 ==========
[10:09:12] ============= drm_test_fb_xrgb8888_to_rgb565 ==============
[10:09:12] [PASSED] single_pixel_source_buffer
[10:09:12] [PASSED] single_pixel_clip_rectangle
[10:09:12] [PASSED] well_known_colors
[10:09:12] [PASSED] destination_pitch
[10:09:12] ========= [PASSED] drm_test_fb_xrgb8888_to_rgb565 ==========
[10:09:12] ============ drm_test_fb_xrgb8888_to_xrgb1555 =============
[10:09:12] [PASSED] single_pixel_source_buffer
[10:09:12] [PASSED] single_pixel_clip_rectangle
[10:09:12] [PASSED] well_known_colors
[10:09:12] [PASSED] destination_pitch
[10:09:12] ======== [PASSED] drm_test_fb_xrgb8888_to_xrgb1555 =========
[10:09:12] ============ drm_test_fb_xrgb8888_to_argb1555 =============
[10:09:12] [PASSED] single_pixel_source_buffer
[10:09:12] [PASSED] single_pixel_clip_rectangle
[10:09:12] [PASSED] well_known_colors
[10:09:12] [PASSED] destination_pitch
[10:09:12] ======== [PASSED] drm_test_fb_xrgb8888_to_argb1555 =========
[10:09:12] ============ drm_test_fb_xrgb8888_to_rgba5551 =============
[10:09:12] [PASSED] single_pixel_source_buffer
[10:09:12] [PASSED] single_pixel_clip_rectangle
[10:09:12] [PASSED] well_known_colors
[10:09:12] [PASSED] destination_pitch
[10:09:12] ======== [PASSED] drm_test_fb_xrgb8888_to_rgba5551 =========
[10:09:12] ============= drm_test_fb_xrgb8888_to_rgb888 ==============
[10:09:12] [PASSED] single_pixel_source_buffer
[10:09:12] [PASSED] single_pixel_clip_rectangle
[10:09:12] [PASSED] well_known_colors
[10:09:12] [PASSED] destination_pitch
[10:09:12] ========= [PASSED] drm_test_fb_xrgb8888_to_rgb888 ==========
[10:09:12] ============ drm_test_fb_xrgb8888_to_argb8888 =============
[10:09:12] [PASSED] single_pixel_source_buffer
[10:09:12] [PASSED] single_pixel_clip_rectangle
[10:09:12] [PASSED] well_known_colors
[10:09:12] [PASSED] destination_pitch
[10:09:12] ======== [PASSED] drm_test_fb_xrgb8888_to_argb8888 =========
[10:09:12] =========== drm_test_fb_xrgb8888_to_xrgb2101010 ===========
[10:09:12] [PASSED] single_pixel_source_buffer
[10:09:12] [PASSED] single_pixel_clip_rectangle
[10:09:12] [PASSED] well_known_colors
[10:09:12] [PASSED] destination_pitch
[10:09:12] ======= [PASSED] drm_test_fb_xrgb8888_to_xrgb2101010 =======
[10:09:12] =========== drm_test_fb_xrgb8888_to_argb2101010 ===========
[10:09:12] [PASSED] single_pixel_source_buffer
[10:09:12] [PASSED] single_pixel_clip_rectangle
[10:09:12] [PASSED] well_known_colors
[10:09:12] [PASSED] destination_pitch
[10:09:12] ======= [PASSED] drm_test_fb_xrgb8888_to_argb2101010 =======
[10:09:12] ============== drm_test_fb_xrgb8888_to_mono ===============
[10:09:12] [PASSED] single_pixel_source_buffer
[10:09:12] [PASSED] single_pixel_clip_rectangle
[10:09:12] [PASSED] well_known_colors
[10:09:12] [PASSED] destination_pitch
[10:09:12] ========== [PASSED] drm_test_fb_xrgb8888_to_mono ===========
[10:09:12] ==================== drm_test_fb_swab =====================
[10:09:12] [PASSED] single_pixel_source_buffer
[10:09:12] [PASSED] single_pixel_clip_rectangle
[10:09:12] [PASSED] well_known_colors
[10:09:12] [PASSED] destination_pitch
[10:09:12] ================ [PASSED] drm_test_fb_swab =================
[10:09:12] ============ drm_test_fb_xrgb8888_to_xbgr8888 =============
[10:09:12] [PASSED] single_pixel_source_buffer
[10:09:12] [PASSED] single_pixel_clip_rectangle
[10:09:12] [PASSED] well_known_colors
[10:09:12] [PASSED] destination_pitch
[10:09:12] ======== [PASSED] drm_test_fb_xrgb8888_to_xbgr8888 =========
[10:09:12] ============ drm_test_fb_xrgb8888_to_abgr8888 =============
[10:09:12] [PASSED] single_pixel_source_buffer
[10:09:12] [PASSED] single_pixel_clip_rectangle
[10:09:12] [PASSED] well_known_colors
[10:09:12] [PASSED] destination_pitch
[10:09:12] ======== [PASSED] drm_test_fb_xrgb8888_to_abgr8888 =========
[10:09:12] ================= drm_test_fb_clip_offset =================
[10:09:12] [PASSED] pass through
[10:09:12] [PASSED] horizontal offset
[10:09:12] [PASSED] vertical offset
[10:09:12] [PASSED] horizontal and vertical offset
[10:09:12] [PASSED] horizontal offset (custom pitch)
[10:09:12] [PASSED] vertical offset (custom pitch)
[10:09:12] [PASSED] horizontal and vertical offset (custom pitch)
[10:09:12] ============= [PASSED] drm_test_fb_clip_offset =============
[10:09:12] ============== drm_test_fb_build_fourcc_list ==============
[10:09:12] [PASSED] no native formats
[10:09:12] [PASSED] XRGB8888 as native format
[10:09:12] [PASSED] remove duplicates
[10:09:12] [PASSED] convert alpha formats
[10:09:12] [PASSED] random formats
[10:09:12] ========== [PASSED] drm_test_fb_build_fourcc_list ==========
[10:09:12] =================== drm_test_fb_memcpy ====================
[10:09:12] [PASSED] single_pixel_source_buffer: XR24 little-endian (0x34325258)
[10:09:12] [PASSED] single_pixel_source_buffer: XRA8 little-endian (0x38415258)
[10:09:12] [PASSED] single_pixel_source_buffer: YU24 little-endian (0x34325559)
[10:09:12] [PASSED] single_pixel_clip_rectangle: XB24 little-endian (0x34324258)
[10:09:12] [PASSED] single_pixel_clip_rectangle: XRA8 little-endian (0x38415258)
[10:09:12] [PASSED] single_pixel_clip_rectangle: YU24 little-endian (0x34325559)
[10:09:12] [PASSED] well_known_colors: XB24 little-endian (0x34324258)
[10:09:12] [PASSED] well_known_colors: XRA8 little-endian (0x38415258)
[10:09:12] [PASSED] well_known_colors: YU24 little-endian (0x34325559)
[10:09:12] [PASSED] destination_pitch: XB24 little-endian (0x34324258)
[10:09:12] [PASSED] destination_pitch: XRA8 little-endian (0x38415258)
[10:09:12] [PASSED] destination_pitch: YU24 little-endian (0x34325559)
[10:09:12] =============== [PASSED] drm_test_fb_memcpy ================
[10:09:12] ============= [PASSED] drm_format_helper_test ==============
[10:09:12] ================= drm_format (18 subtests) =================
[10:09:12] [PASSED] drm_test_format_block_width_invalid
[10:09:12] [PASSED] drm_test_format_block_width_one_plane
[10:09:12] [PASSED] drm_test_format_block_width_two_plane
[10:09:12] [PASSED] drm_test_format_block_width_three_plane
[10:09:12] [PASSED] drm_test_format_block_width_tiled
[10:09:12] [PASSED] drm_test_format_block_height_invalid
[10:09:12] [PASSED] drm_test_format_block_height_one_plane
[10:09:12] [PASSED] drm_test_format_block_height_two_plane
[10:09:12] [PASSED] drm_test_format_block_height_three_plane
[10:09:12] [PASSED] drm_test_format_block_height_tiled
[10:09:12] [PASSED] drm_test_format_min_pitch_invalid
[10:09:12] [PASSED] drm_test_format_min_pitch_one_plane_8bpp
[10:09:12] [PASSED] drm_test_format_min_pitch_one_plane_16bpp
[10:09:12] [PASSED] drm_test_format_min_pitch_one_plane_24bpp
[10:09:12] [PASSED] drm_test_format_min_pitch_one_plane_32bpp
[10:09:12] [PASSED] drm_test_format_min_pitch_two_plane
[10:09:12] [PASSED] drm_test_format_min_pitch_three_plane_8bpp
[10:09:12] [PASSED] drm_test_format_min_pitch_tiled
[10:09:12] =================== [PASSED] drm_format ====================
[10:09:12] ============== drm_framebuffer (10 subtests) ===============
[10:09:12] ========== drm_test_framebuffer_check_src_coords ==========
[10:09:12] [PASSED] Success: source fits into fb
[10:09:12] [PASSED] Fail: overflowing fb with x-axis coordinate
[10:09:12] [PASSED] Fail: overflowing fb with y-axis coordinate
[10:09:12] [PASSED] Fail: overflowing fb with source width
[10:09:12] [PASSED] Fail: overflowing fb with source height
[10:09:12] ====== [PASSED] drm_test_framebuffer_check_src_coords ======
[10:09:12] [PASSED] drm_test_framebuffer_cleanup
[10:09:12] =============== drm_test_framebuffer_create ===============
[10:09:12] [PASSED] ABGR8888 normal sizes
[10:09:12] [PASSED] ABGR8888 max sizes
[10:09:12] [PASSED] ABGR8888 pitch greater than min required
[10:09:12] [PASSED] ABGR8888 pitch less than min required
[10:09:12] [PASSED] ABGR8888 Invalid width
[10:09:12] [PASSED] ABGR8888 Invalid buffer handle
[10:09:12] [PASSED] No pixel format
[10:09:12] [PASSED] ABGR8888 Width 0
[10:09:12] [PASSED] ABGR8888 Height 0
[10:09:12] [PASSED] ABGR8888 Out of bound height * pitch combination
[10:09:12] [PASSED] ABGR8888 Large buffer offset
[10:09:12] [PASSED] ABGR8888 Buffer offset for inexistent plane
[10:09:12] [PASSED] ABGR8888 Invalid flag
[10:09:12] [PASSED] ABGR8888 Set DRM_MODE_FB_MODIFIERS without modifiers
[10:09:12] [PASSED] ABGR8888 Valid buffer modifier
[10:09:12] [PASSED] ABGR8888 Invalid buffer modifier(DRM_FORMAT_MOD_SAMSUNG_64_32_TILE)
[10:09:12] [PASSED] ABGR8888 Extra pitches without DRM_MODE_FB_MODIFIERS
[10:09:12] [PASSED] ABGR8888 Extra pitches with DRM_MODE_FB_MODIFIERS
[10:09:12] [PASSED] NV12 Normal sizes
[10:09:12] [PASSED] NV12 Max sizes
[10:09:12] [PASSED] NV12 Invalid pitch
[10:09:12] [PASSED] NV12 Invalid modifier/missing DRM_MODE_FB_MODIFIERS flag
[10:09:12] [PASSED] NV12 different modifier per-plane
[10:09:12] [PASSED] NV12 with DRM_FORMAT_MOD_SAMSUNG_64_32_TILE
[10:09:12] [PASSED] NV12 Valid modifiers without DRM_MODE_FB_MODIFIERS
[10:09:12] [PASSED] NV12 Modifier for inexistent plane
[10:09:12] [PASSED] NV12 Handle for inexistent plane
[10:09:12] [PASSED] NV12 Handle for inexistent plane without DRM_MODE_FB_MODIFIERS
[10:09:12] [PASSED] YVU420 DRM_MODE_FB_MODIFIERS set without modifier
[10:09:12] [PASSED] YVU420 Normal sizes
[10:09:12] [PASSED] YVU420 Max sizes
[10:09:12] [PASSED] YVU420 Invalid pitch
[10:09:12] [PASSED] YVU420 Different pitches
[10:09:12] [PASSED] YVU420 Different buffer offsets/pitches
[10:09:12] [PASSED] YVU420 Modifier set just for plane 0, without DRM_MODE_FB_MODIFIERS
[10:09:12] [PASSED] YVU420 Modifier set just for planes 0, 1, without DRM_MODE_FB_MODIFIERS
[10:09:12] [PASSED] YVU420 Modifier set just for plane 0, 1, with DRM_MODE_FB_MODIFIERS
[10:09:12] [PASSED] YVU420 Valid modifier
[10:09:12] [PASSED] YVU420 Different modifiers per plane
[10:09:12] [PASSED] YVU420 Modifier for inexistent plane
[10:09:12] [PASSED] YUV420_10BIT Invalid modifier(DRM_FORMAT_MOD_LINEAR)
[10:09:12] [PASSED] X0L2 Normal sizes
[10:09:12] [PASSED] X0L2 Max sizes
[10:09:12] [PASSED] X0L2 Invalid pitch
[10:09:12] [PASSED] X0L2 Pitch greater than minimum required
[10:09:12] [PASSED] X0L2 Handle for inexistent plane
[10:09:12] [PASSED] X0L2 Offset for inexistent plane, without DRM_MODE_FB_MODIFIERS set
[10:09:12] [PASSED] X0L2 Modifier without DRM_MODE_FB_MODIFIERS set
[10:09:12] [PASSED] X0L2 Valid modifier
[10:09:12] [PASSED] X0L2 Modifier for inexistent plane
[10:09:12] =========== [PASSED] drm_test_framebuffer_create ===========
[10:09:12] [PASSED] drm_test_framebuffer_free
[10:09:12] [PASSED] drm_test_framebuffer_init
[10:09:12] [PASSED] drm_test_framebuffer_init_bad_format
[10:09:12] [PASSED] drm_test_framebuffer_init_dev_mismatch
[10:09:12] [PASSED] drm_test_framebuffer_lookup
[10:09:12] [PASSED] drm_test_framebuffer_lookup_inexistent
[10:09:12] [PASSED] drm_test_framebuffer_modifiers_not_supported
[10:09:12] ================= [PASSED] drm_framebuffer =================
[10:09:12] ================ drm_gem_shmem (8 subtests) ================
[10:09:12] [PASSED] drm_gem_shmem_test_obj_create
[10:09:12] [PASSED] drm_gem_shmem_test_obj_create_private
[10:09:12] [PASSED] drm_gem_shmem_test_pin_pages
[10:09:12] [PASSED] drm_gem_shmem_test_vmap
[10:09:12] [PASSED] drm_gem_shmem_test_get_pages_sgt
[10:09:12] [PASSED] drm_gem_shmem_test_get_sg_table
[10:09:12] [PASSED] drm_gem_shmem_test_madvise
[10:09:12] [PASSED] drm_gem_shmem_test_purge
[10:09:12] ================== [PASSED] drm_gem_shmem ==================
[10:09:12] === drm_atomic_helper_connector_hdmi_check (22 subtests) ===
[10:09:12] [PASSED] drm_test_check_broadcast_rgb_auto_cea_mode
[10:09:12] [PASSED] drm_test_check_broadcast_rgb_auto_cea_mode_vic_1
[10:09:12] [PASSED] drm_test_check_broadcast_rgb_full_cea_mode
[10:09:12] [PASSED] drm_test_check_broadcast_rgb_full_cea_mode_vic_1
[10:09:12] [PASSED] drm_test_check_broadcast_rgb_limited_cea_mode
[10:09:12] [PASSED] drm_test_check_broadcast_rgb_limited_cea_mode_vic_1
[10:09:12] [PASSED] drm_test_check_broadcast_rgb_crtc_mode_changed
[10:09:12] [PASSED] drm_test_check_broadcast_rgb_crtc_mode_not_changed
[10:09:12] [PASSED] drm_test_check_hdmi_funcs_reject_rate
[10:09:12] [PASSED] drm_test_check_max_tmds_rate_bpc_fallback
[10:09:12] [PASSED] drm_test_check_max_tmds_rate_format_fallback
[10:09:12] [PASSED] drm_test_check_output_bpc_crtc_mode_changed
[10:09:12] [PASSED] drm_test_check_output_bpc_crtc_mode_not_changed
[10:09:12] [PASSED] drm_test_check_output_bpc_dvi
[10:09:12] [PASSED] drm_test_check_output_bpc_format_vic_1
[10:09:12] [PASSED] drm_test_check_output_bpc_format_display_8bpc_only
[10:09:12] [PASSED] drm_test_check_output_bpc_format_display_rgb_only
[10:09:12] [PASSED] drm_test_check_output_bpc_format_driver_8bpc_only
[10:09:12] [PASSED] drm_test_check_output_bpc_format_driver_rgb_only
[10:09:12] [PASSED] drm_test_check_tmds_char_rate_rgb_8bpc
[10:09:12] [PASSED] drm_test_check_tmds_char_rate_rgb_10bpc
[10:09:12] [PASSED] drm_test_check_tmds_char_rate_rgb_12bpc
[10:09:12] ===== [PASSED] drm_atomic_helper_connector_hdmi_check ======
[10:09:12] === drm_atomic_helper_connector_hdmi_reset (6 subtests) ====
[10:09:12] [PASSED] drm_test_check_broadcast_rgb_value
[10:09:12] [PASSED] drm_test_check_bpc_8_value
[10:09:12] [PASSED] drm_test_check_bpc_10_value
[10:09:12] [PASSED] drm_test_check_bpc_12_value
[10:09:12] [PASSED] drm_test_check_format_value
[10:09:12] [PASSED] drm_test_check_tmds_char_value
[10:09:12] ===== [PASSED] drm_atomic_helper_connector_hdmi_reset ======
[10:09:12] ================= drm_managed (2 subtests) =================
[10:09:12] [PASSED] drm_test_managed_release_action
[10:09:12] [PASSED] drm_test_managed_run_action
[10:09:12] =================== [PASSED] drm_managed ===================
[10:09:12] =================== drm_mm (6 subtests) ====================
[10:09:12] [PASSED] drm_test_mm_init
[10:09:12] [PASSED] drm_test_mm_debug
[10:09:12] [PASSED] drm_test_mm_align32
[10:09:12] [PASSED] drm_test_mm_align64
[10:09:12] [PASSED] drm_test_mm_lowest
[10:09:12] [PASSED] drm_test_mm_highest
[10:09:12] ===================== [PASSED] drm_mm ======================
[10:09:12] ============= drm_modes_analog_tv (5 subtests) =============
[10:09:12] [PASSED] drm_test_modes_analog_tv_mono_576i
[10:09:12] [PASSED] drm_test_modes_analog_tv_ntsc_480i
[10:09:12] [PASSED] drm_test_modes_analog_tv_ntsc_480i_inlined
[10:09:12] [PASSED] drm_test_modes_analog_tv_pal_576i
[10:09:12] [PASSED] drm_test_modes_analog_tv_pal_576i_inlined
[10:09:12] =============== [PASSED] drm_modes_analog_tv ===============
stty: 'standard input': Inappropriate ioctl for device
[10:09:12] ============== drm_plane_helper (2 subtests) ===============
[10:09:12] =============== drm_test_check_plane_state ================
[10:09:12] [PASSED] clipping_simple
[10:09:12] [PASSED] clipping_rotate_reflect
[10:09:12] [PASSED] positioning_simple
[10:09:12] [PASSED] upscaling
[10:09:12] [PASSED] downscaling
[10:09:12] [PASSED] rounding1
[10:09:12] [PASSED] rounding2
[10:09:12] [PASSED] rounding3
[10:09:12] [PASSED] rounding4
[10:09:12] =========== [PASSED] drm_test_check_plane_state ============
[10:09:12] =========== drm_test_check_invalid_plane_state ============
[10:09:12] [PASSED] positioning_invalid
[10:09:12] [PASSED] upscaling_invalid
[10:09:12] [PASSED] downscaling_invalid
[10:09:12] ======= [PASSED] drm_test_check_invalid_plane_state ========
[10:09:12] ================ [PASSED] drm_plane_helper =================
[10:09:12] ====== drm_connector_helper_tv_get_modes (1 subtest) =======
[10:09:12] ====== drm_test_connector_helper_tv_get_modes_check =======
[10:09:12] [PASSED] None
[10:09:12] [PASSED] PAL
[10:09:12] [PASSED] NTSC
[10:09:12] [PASSED] Both, NTSC Default
[10:09:12] [PASSED] Both, PAL Default
[10:09:12] [PASSED] Both, NTSC Default, with PAL on command-line
[10:09:12] [PASSED] Both, PAL Default, with NTSC on command-line
[10:09:12] == [PASSED] drm_test_connector_helper_tv_get_modes_check ===
[10:09:12] ======== [PASSED] drm_connector_helper_tv_get_modes ========
[10:09:12] ================== drm_rect (9 subtests) ===================
[10:09:12] [PASSED] drm_test_rect_clip_scaled_div_by_zero
[10:09:12] [PASSED] drm_test_rect_clip_scaled_not_clipped
[10:09:12] [PASSED] drm_test_rect_clip_scaled_clipped
[10:09:12] [PASSED] drm_test_rect_clip_scaled_signed_vs_unsigned
[10:09:12] ================= drm_test_rect_intersect =================
[10:09:12] [PASSED] top-left x bottom-right: 2x2+1+1 x 2x2+0+0
[10:09:12] [PASSED] top-right x bottom-left: 2x2+0+0 x 2x2+1-1
[10:09:12] [PASSED] bottom-left x top-right: 2x2+1-1 x 2x2+0+0
[10:09:12] [PASSED] bottom-right x top-left: 2x2+0+0 x 2x2+1+1
[10:09:12] [PASSED] right x left: 2x1+0+0 x 3x1+1+0
[10:09:12] [PASSED] left x right: 3x1+1+0 x 2x1+0+0
[10:09:12] [PASSED] up x bottom: 1x2+0+0 x 1x3+0-1
[10:09:12] [PASSED] bottom x up: 1x3+0-1 x 1x2+0+0
[10:09:12] [PASSED] touching corner: 1x1+0+0 x 2x2+1+1
[10:09:12] [PASSED] touching side: 1x1+0+0 x 1x1+1+0
[10:09:12] [PASSED] equal rects: 2x2+0+0 x 2x2+0+0
[10:09:12] [PASSED] inside another: 2x2+0+0 x 1x1+1+1
[10:09:12] [PASSED] far away: 1x1+0+0 x 1x1+3+6
[10:09:12] [PASSED] points intersecting: 0x0+5+10 x 0x0+5+10
[10:09:12] [PASSED] points not intersecting: 0x0+0+0 x 0x0+5+10
[10:09:12] ============= [PASSED] drm_test_rect_intersect =============
[10:09:12] ================ drm_test_rect_calc_hscale ================
[10:09:12] [PASSED] normal use
[10:09:12] [PASSED] out of max range
[10:09:12] [PASSED] out of min range
[10:09:12] [PASSED] zero dst
[10:09:12] [PASSED] negative src
[10:09:12] [PASSED] negative dst
[10:09:12] ============ [PASSED] drm_test_rect_calc_hscale ============
[10:09:12] ================ drm_test_rect_calc_vscale ================
[10:09:12] [PASSED] normal use
[10:09:12] [PASSED] out of max range
[10:09:12] [PASSED] out of min range
[10:09:12] [PASSED] zero dst
[10:09:12] [PASSED] negative src
[10:09:12] [PASSED] negative dst
[10:09:12] ============ [PASSED] drm_test_rect_calc_vscale ============
[10:09:12] ================== drm_test_rect_rotate ===================
[10:09:12] [PASSED] reflect-x
[10:09:12] [PASSED] reflect-y
[10:09:12] [PASSED] rotate-0
[10:09:12] [PASSED] rotate-90
[10:09:12] [PASSED] rotate-180
[10:09:12] [PASSED] rotate-270
[10:09:12] ============== [PASSED] drm_test_rect_rotate ===============
[10:09:12] ================ drm_test_rect_rotate_inv =================
[10:09:12] [PASSED] reflect-x
[10:09:12] [PASSED] reflect-y
[10:09:12] [PASSED] rotate-0
[10:09:12] [PASSED] rotate-90
[10:09:12] [PASSED] rotate-180
[10:09:12] [PASSED] rotate-270
[10:09:12] ============ [PASSED] drm_test_rect_rotate_inv =============
[10:09:12] ==================== [PASSED] drm_rect =====================
[10:09:12] ============================================================
[10:09:12] Testing complete. Ran 526 tests: passed: 526
[10:09:12] Elapsed time: 24.493s total, 1.611s configuring, 22.713s building, 0.168s running
+ /kernel/tools/testing/kunit/kunit.py run --kunitconfig /kernel/drivers/gpu/drm/ttm/tests/.kunitconfig
[10:09:12] Configuring KUnit Kernel ...
Regenerating .config ...
Populating config with:
$ make ARCH=um O=.kunit olddefconfig
[10:09:13] Building KUnit Kernel ...
Populating config with:
$ make ARCH=um O=.kunit olddefconfig
Building with:
$ make all compile_commands.json ARCH=um O=.kunit --jobs=48
[10:09:21] Starting KUnit Kernel (1/1)...
[10:09:21] ============================================================
Running tests with:
$ .kunit/linux kunit.enable=1 mem=1G console=tty kunit_shutdown=halt
[10:09:21] ================= ttm_device (5 subtests) ==================
[10:09:21] [PASSED] ttm_device_init_basic
[10:09:21] [PASSED] ttm_device_init_multiple
[10:09:21] [PASSED] ttm_device_fini_basic
[10:09:21] [PASSED] ttm_device_init_no_vma_man
[10:09:21] ================== ttm_device_init_pools ==================
[10:09:21] [PASSED] No DMA allocations, no DMA32 required
[10:09:21] [PASSED] DMA allocations, DMA32 required
[10:09:21] [PASSED] No DMA allocations, DMA32 required
[10:09:21] [PASSED] DMA allocations, no DMA32 required
[10:09:21] ============== [PASSED] ttm_device_init_pools ==============
[10:09:21] =================== [PASSED] ttm_device ====================
[10:09:21] ================== ttm_pool (8 subtests) ===================
[10:09:21] ================== ttm_pool_alloc_basic ===================
[10:09:21] [PASSED] One page
[10:09:21] [PASSED] More than one page
[10:09:21] [PASSED] Above the allocation limit
[10:09:21] [PASSED] One page, with coherent DMA mappings enabled
[10:09:21] [PASSED] Above the allocation limit, with coherent DMA mappings enabled
[10:09:21] ============== [PASSED] ttm_pool_alloc_basic ===============
[10:09:21] ============== ttm_pool_alloc_basic_dma_addr ==============
[10:09:21] [PASSED] One page
[10:09:21] [PASSED] More than one page
[10:09:21] [PASSED] Above the allocation limit
[10:09:21] [PASSED] One page, with coherent DMA mappings enabled
[10:09:21] [PASSED] Above the allocation limit, with coherent DMA mappings enabled
[10:09:21] ========== [PASSED] ttm_pool_alloc_basic_dma_addr ==========
[10:09:21] [PASSED] ttm_pool_alloc_order_caching_match
[10:09:21] [PASSED] ttm_pool_alloc_caching_mismatch
[10:09:21] [PASSED] ttm_pool_alloc_order_mismatch
[10:09:21] [PASSED] ttm_pool_free_dma_alloc
[10:09:21] [PASSED] ttm_pool_free_no_dma_alloc
[10:09:21] [PASSED] ttm_pool_fini_basic
[10:09:21] ==================== [PASSED] ttm_pool =====================
[10:09:21] ================ ttm_resource (8 subtests) =================
[10:09:21] ================= ttm_resource_init_basic =================
[10:09:21] [PASSED] Init resource in TTM_PL_SYSTEM
[10:09:21] [PASSED] Init resource in TTM_PL_VRAM
[10:09:21] [PASSED] Init resource in a private placement
[10:09:21] [PASSED] Init resource in TTM_PL_SYSTEM, set placement flags
[10:09:21] ============= [PASSED] ttm_resource_init_basic =============
[10:09:21] [PASSED] ttm_resource_init_pinned
[10:09:21] [PASSED] ttm_resource_fini_basic
[10:09:21] [PASSED] ttm_resource_manager_init_basic
[10:09:21] [PASSED] ttm_resource_manager_usage_basic
[10:09:21] [PASSED] ttm_resource_manager_set_used_basic
[10:09:21] [PASSED] ttm_sys_man_alloc_basic
[10:09:21] [PASSED] ttm_sys_man_free_basic
[10:09:21] ================== [PASSED] ttm_resource ===================
[10:09:21] =================== ttm_tt (15 subtests) ===================
[10:09:21] ==================== ttm_tt_init_basic ====================
[10:09:21] [PASSED] Page-aligned size
[10:09:21] [PASSED] Extra pages requested
[10:09:21] ================ [PASSED] ttm_tt_init_basic ================
[10:09:21] [PASSED] ttm_tt_init_misaligned
[10:09:21] [PASSED] ttm_tt_fini_basic
[10:09:21] [PASSED] ttm_tt_fini_sg
[10:09:21] [PASSED] ttm_tt_fini_shmem
[10:09:21] [PASSED] ttm_tt_create_basic
[10:09:21] [PASSED] ttm_tt_create_invalid_bo_type
[10:09:21] [PASSED] ttm_tt_create_ttm_exists
[10:09:21] [PASSED] ttm_tt_create_failed
[10:09:21] [PASSED] ttm_tt_destroy_basic
[10:09:21] [PASSED] ttm_tt_populate_null_ttm
[10:09:21] [PASSED] ttm_tt_populate_populated_ttm
[10:09:21] [PASSED] ttm_tt_unpopulate_basic
[10:09:21] [PASSED] ttm_tt_unpopulate_empty_ttm
[10:09:21] [PASSED] ttm_tt_swapin_basic
[10:09:21] ===================== [PASSED] ttm_tt ======================
[10:09:21] =================== ttm_bo (14 subtests) ===================
[10:09:21] =========== ttm_bo_reserve_optimistic_no_ticket ===========
[10:09:21] [PASSED] Cannot be interrupted and sleeps
[10:09:21] [PASSED] Cannot be interrupted, locks straight away
[10:09:21] [PASSED] Can be interrupted, sleeps
[10:09:21] ======= [PASSED] ttm_bo_reserve_optimistic_no_ticket =======
[10:09:21] [PASSED] ttm_bo_reserve_locked_no_sleep
[10:09:21] [PASSED] ttm_bo_reserve_no_wait_ticket
[10:09:21] [PASSED] ttm_bo_reserve_double_resv
[10:09:21] [PASSED] ttm_bo_reserve_interrupted
[10:09:21] [PASSED] ttm_bo_reserve_deadlock
[10:09:21] [PASSED] ttm_bo_unreserve_basic
[10:09:21] [PASSED] ttm_bo_unreserve_pinned
[10:09:21] [PASSED] ttm_bo_unreserve_bulk
[10:09:21] [PASSED] ttm_bo_put_basic
[10:09:21] [PASSED] ttm_bo_put_shared_resv
[10:09:21] [PASSED] ttm_bo_pin_basic
[10:09:21] [PASSED] ttm_bo_pin_unpin_resource
[10:09:21] [PASSED] ttm_bo_multiple_pin_one_unpin
[10:09:21] ===================== [PASSED] ttm_bo ======================
[10:09:21] ============== ttm_bo_validate (22 subtests) ===============
[10:09:21] ============== ttm_bo_init_reserved_sys_man ===============
[10:09:21] [PASSED] Buffer object for userspace
[10:09:21] [PASSED] Kernel buffer object
[10:09:21] [PASSED] Shared buffer object
[10:09:21] ========== [PASSED] ttm_bo_init_reserved_sys_man ===========
[10:09:21] ============== ttm_bo_init_reserved_mock_man ==============
[10:09:21] [PASSED] Buffer object for userspace
[10:09:21] [PASSED] Kernel buffer object
[10:09:21] [PASSED] Shared buffer object
[10:09:21] ========== [PASSED] ttm_bo_init_reserved_mock_man ==========
[10:09:21] [PASSED] ttm_bo_init_reserved_resv
[10:09:21] ================== ttm_bo_validate_basic ==================
[10:09:21] [PASSED] Buffer object for userspace
[10:09:21] [PASSED] Kernel buffer object
[10:09:21] [PASSED] Shared buffer object
[10:09:21] ============== [PASSED] ttm_bo_validate_basic ==============
[10:09:21] [PASSED] ttm_bo_validate_invalid_placement
[10:09:21] ============= ttm_bo_validate_same_placement ==============
[10:09:21] [PASSED] System manager
[10:09:21] [PASSED] VRAM manager
[10:09:21] ========= [PASSED] ttm_bo_validate_same_placement ==========
[10:09:21] [PASSED] ttm_bo_validate_failed_alloc
[10:09:21] [PASSED] ttm_bo_validate_pinned
[10:09:21] [PASSED] ttm_bo_validate_busy_placement
[10:09:21] ================ ttm_bo_validate_multihop =================
[10:09:21] [PASSED] Buffer object for userspace
[10:09:21] [PASSED] Kernel buffer object
[10:09:21] [PASSED] Shared buffer object
[10:09:21] ============ [PASSED] ttm_bo_validate_multihop =============
[10:09:21] ========== ttm_bo_validate_no_placement_signaled ==========
[10:09:21] [PASSED] Buffer object in system domain, no page vector
[10:09:21] [PASSED] Buffer object in system domain with an existing page vector
[10:09:21] ====== [PASSED] ttm_bo_validate_no_placement_signaled ======
[10:09:21] ======== ttm_bo_validate_no_placement_not_signaled ========
[10:09:21] [PASSED] Buffer object for userspace
[10:09:21] [PASSED] Kernel buffer object
[10:09:21] [PASSED] Shared buffer object
[10:09:21] ==== [PASSED] ttm_bo_validate_no_placement_not_signaled ====
[10:09:21] [PASSED] ttm_bo_validate_move_fence_signaled
[10:09:21] ========= ttm_bo_validate_move_fence_not_signaled =========
[10:09:21] [PASSED] Waits for GPU
[10:09:21] [PASSED] Tries to lock straight away
[10:09:21] ===== [PASSED] ttm_bo_validate_move_fence_not_signaled =====
[10:09:21] [PASSED] ttm_bo_validate_swapout
[10:09:21] [PASSED] ttm_bo_validate_happy_evict
[10:09:21] [PASSED] ttm_bo_validate_all_pinned_evict
[10:09:21] [PASSED] ttm_bo_validate_allowed_only_evict
[10:09:21] [PASSED] ttm_bo_validate_deleted_evict
[10:09:21] [PASSED] ttm_bo_validate_busy_domain_evict
[10:09:21] [PASSED] ttm_bo_validate_evict_gutting
[10:09:21] [PASSED] ttm_bo_validate_recrusive_evict
stty: 'standard input': Inappropriate ioctl for device
[10:09:21] ================= [PASSED] ttm_bo_validate =================
[10:09:21] ============================================================
[10:09:21] Testing complete. Ran 102 tests: passed: 102
[10:09:22] Elapsed time: 9.887s total, 1.628s configuring, 7.592s building, 0.540s running
+ cleanup
++ stat -c %u:%g /kernel
+ chown -R 1003:1003 /kernel
^ permalink raw reply [flat|nested] 28+ messages in thread* ✓ CI.Build: success for Support EU online debug on pagefault
2024-10-21 9:58 [RFC 00/19] Support EU online debug on pagefault Gwan-gyeong Mun
` (21 preceding siblings ...)
2024-10-21 10:09 ` ✓ CI.KUnit: success " Patchwork
@ 2024-10-21 10:21 ` Patchwork
2024-10-21 10:23 ` ✗ CI.Hooks: failure " Patchwork
` (2 subsequent siblings)
25 siblings, 0 replies; 28+ messages in thread
From: Patchwork @ 2024-10-21 10:21 UTC (permalink / raw)
To: Gwan-gyeong Mun; +Cc: intel-xe
== Series Details ==
Series: Support EU online debug on pagefault
URL : https://patchwork.freedesktop.org/series/140239/
State : success
== Summary ==
lib/modules/6.12.0-rc4-xe/kernel/sound/core/snd-hwdep.ko
lib/modules/6.12.0-rc4-xe/kernel/sound/core/snd.ko
lib/modules/6.12.0-rc4-xe/kernel/sound/core/snd-pcm.ko
lib/modules/6.12.0-rc4-xe/kernel/sound/core/snd-compress.ko
lib/modules/6.12.0-rc4-xe/kernel/sound/core/snd-timer.ko
lib/modules/6.12.0-rc4-xe/kernel/sound/soundcore.ko
lib/modules/6.12.0-rc4-xe/kernel/sound/soc/
lib/modules/6.12.0-rc4-xe/kernel/sound/soc/intel/
lib/modules/6.12.0-rc4-xe/kernel/sound/soc/intel/atom/
lib/modules/6.12.0-rc4-xe/kernel/sound/soc/intel/atom/snd-soc-sst-atom-hifi2-platform.ko
lib/modules/6.12.0-rc4-xe/kernel/sound/soc/intel/atom/sst/
lib/modules/6.12.0-rc4-xe/kernel/sound/soc/intel/atom/sst/snd-intel-sst-acpi.ko
lib/modules/6.12.0-rc4-xe/kernel/sound/soc/intel/atom/sst/snd-intel-sst-core.ko
lib/modules/6.12.0-rc4-xe/kernel/sound/soc/intel/common/
lib/modules/6.12.0-rc4-xe/kernel/sound/soc/intel/common/snd-soc-acpi-intel-match.ko
lib/modules/6.12.0-rc4-xe/kernel/sound/soc/amd/
lib/modules/6.12.0-rc4-xe/kernel/sound/soc/amd/acp/
lib/modules/6.12.0-rc4-xe/kernel/sound/soc/amd/acp/snd-soc-acpi-amd-match.ko
lib/modules/6.12.0-rc4-xe/kernel/sound/soc/amd/snd-acp-config.ko
lib/modules/6.12.0-rc4-xe/kernel/sound/soc/sof/
lib/modules/6.12.0-rc4-xe/kernel/sound/soc/sof/intel/
lib/modules/6.12.0-rc4-xe/kernel/sound/soc/sof/intel/snd-sof-pci-intel-tgl.ko
lib/modules/6.12.0-rc4-xe/kernel/sound/soc/sof/intel/snd-sof-intel-hda-mlink.ko
lib/modules/6.12.0-rc4-xe/kernel/sound/soc/sof/intel/snd-sof-pci-intel-ptl.ko
lib/modules/6.12.0-rc4-xe/kernel/sound/soc/sof/intel/snd-sof-pci-intel-cnl.ko
lib/modules/6.12.0-rc4-xe/kernel/sound/soc/sof/intel/snd-sof-pci-intel-lnl.ko
lib/modules/6.12.0-rc4-xe/kernel/sound/soc/sof/intel/snd-sof-intel-hda-common.ko
lib/modules/6.12.0-rc4-xe/kernel/sound/soc/sof/intel/snd-sof-intel-hda-generic.ko
lib/modules/6.12.0-rc4-xe/kernel/sound/soc/sof/intel/snd-sof-intel-hda.ko
lib/modules/6.12.0-rc4-xe/kernel/sound/soc/sof/intel/snd-sof-pci-intel-mtl.ko
lib/modules/6.12.0-rc4-xe/kernel/sound/soc/sof/amd/
lib/modules/6.12.0-rc4-xe/kernel/sound/soc/sof/amd/snd-sof-amd-renoir.ko
lib/modules/6.12.0-rc4-xe/kernel/sound/soc/sof/amd/snd-sof-amd-acp.ko
lib/modules/6.12.0-rc4-xe/kernel/sound/soc/sof/snd-sof-utils.ko
lib/modules/6.12.0-rc4-xe/kernel/sound/soc/sof/snd-sof-pci.ko
lib/modules/6.12.0-rc4-xe/kernel/sound/soc/sof/snd-sof.ko
lib/modules/6.12.0-rc4-xe/kernel/sound/soc/sof/snd-sof-probes.ko
lib/modules/6.12.0-rc4-xe/kernel/sound/soc/sof/xtensa/
lib/modules/6.12.0-rc4-xe/kernel/sound/soc/sof/xtensa/snd-sof-xtensa-dsp.ko
lib/modules/6.12.0-rc4-xe/kernel/sound/soc/snd-soc-core.ko
lib/modules/6.12.0-rc4-xe/kernel/sound/soc/snd-soc-acpi.ko
lib/modules/6.12.0-rc4-xe/kernel/sound/soc/codecs/
lib/modules/6.12.0-rc4-xe/kernel/sound/soc/codecs/snd-soc-hdac-hda.ko
lib/modules/6.12.0-rc4-xe/kernel/sound/hda/
lib/modules/6.12.0-rc4-xe/kernel/sound/hda/snd-intel-sdw-acpi.ko
lib/modules/6.12.0-rc4-xe/kernel/sound/hda/ext/
lib/modules/6.12.0-rc4-xe/kernel/sound/hda/ext/snd-hda-ext-core.ko
lib/modules/6.12.0-rc4-xe/kernel/sound/hda/snd-intel-dspcfg.ko
lib/modules/6.12.0-rc4-xe/kernel/sound/hda/snd-hda-core.ko
lib/modules/6.12.0-rc4-xe/kernel/arch/
lib/modules/6.12.0-rc4-xe/kernel/arch/x86/
lib/modules/6.12.0-rc4-xe/kernel/arch/x86/kernel/
lib/modules/6.12.0-rc4-xe/kernel/arch/x86/kernel/msr.ko
lib/modules/6.12.0-rc4-xe/kernel/arch/x86/kernel/cpuid.ko
lib/modules/6.12.0-rc4-xe/kernel/arch/x86/crypto/
lib/modules/6.12.0-rc4-xe/kernel/arch/x86/crypto/sha512-ssse3.ko
lib/modules/6.12.0-rc4-xe/kernel/arch/x86/crypto/crct10dif-pclmul.ko
lib/modules/6.12.0-rc4-xe/kernel/arch/x86/crypto/ghash-clmulni-intel.ko
lib/modules/6.12.0-rc4-xe/kernel/arch/x86/crypto/sha1-ssse3.ko
lib/modules/6.12.0-rc4-xe/kernel/arch/x86/crypto/crc32-pclmul.ko
lib/modules/6.12.0-rc4-xe/kernel/arch/x86/crypto/sha256-ssse3.ko
lib/modules/6.12.0-rc4-xe/kernel/arch/x86/crypto/aesni-intel.ko
lib/modules/6.12.0-rc4-xe/kernel/arch/x86/crypto/polyval-clmulni.ko
lib/modules/6.12.0-rc4-xe/kernel/arch/x86/events/
lib/modules/6.12.0-rc4-xe/kernel/arch/x86/events/intel/
lib/modules/6.12.0-rc4-xe/kernel/arch/x86/events/intel/intel-cstate.ko
lib/modules/6.12.0-rc4-xe/kernel/arch/x86/events/rapl.ko
lib/modules/6.12.0-rc4-xe/kernel/arch/x86/kvm/
lib/modules/6.12.0-rc4-xe/kernel/arch/x86/kvm/kvm.ko
lib/modules/6.12.0-rc4-xe/kernel/arch/x86/kvm/kvm-intel.ko
lib/modules/6.12.0-rc4-xe/kernel/crypto/
lib/modules/6.12.0-rc4-xe/kernel/crypto/crypto_simd.ko
lib/modules/6.12.0-rc4-xe/kernel/crypto/cmac.ko
lib/modules/6.12.0-rc4-xe/kernel/crypto/ccm.ko
lib/modules/6.12.0-rc4-xe/kernel/crypto/cryptd.ko
lib/modules/6.12.0-rc4-xe/kernel/crypto/polyval-generic.ko
lib/modules/6.12.0-rc4-xe/kernel/crypto/async_tx/
lib/modules/6.12.0-rc4-xe/kernel/crypto/async_tx/async_xor.ko
lib/modules/6.12.0-rc4-xe/kernel/crypto/async_tx/async_tx.ko
lib/modules/6.12.0-rc4-xe/kernel/crypto/async_tx/async_memcpy.ko
lib/modules/6.12.0-rc4-xe/kernel/crypto/async_tx/async_pq.ko
lib/modules/6.12.0-rc4-xe/kernel/crypto/async_tx/async_raid6_recov.ko
lib/modules/6.12.0-rc4-xe/build
lib/modules/6.12.0-rc4-xe/modules.alias.bin
lib/modules/6.12.0-rc4-xe/modules.builtin
lib/modules/6.12.0-rc4-xe/modules.softdep
lib/modules/6.12.0-rc4-xe/modules.alias
lib/modules/6.12.0-rc4-xe/modules.order
lib/modules/6.12.0-rc4-xe/modules.symbols
lib/modules/6.12.0-rc4-xe/modules.dep.bin
+ mv kernel-nodebug.tar.gz ..
+ cd ..
+ rm -rf archive
++ date +%s
+ echo -e '\e[0Ksection_end:1729506059:package_x86_64_nodebug\r\e[0K'
+ sync
^[[0Ksection_end:1729506059:package_x86_64_nodebug
^[[0K
+ cleanup
++ stat -c %u:%g /kernel
+ chown -R 1003:1003 /kernel
^ permalink raw reply [flat|nested] 28+ messages in thread* ✗ CI.Hooks: failure for Support EU online debug on pagefault
2024-10-21 9:58 [RFC 00/19] Support EU online debug on pagefault Gwan-gyeong Mun
` (22 preceding siblings ...)
2024-10-21 10:21 ` ✓ CI.Build: " Patchwork
@ 2024-10-21 10:23 ` Patchwork
2024-10-21 10:25 ` ✓ CI.checksparse: success " Patchwork
2024-10-21 10:45 ` ✓ CI.BAT: " Patchwork
25 siblings, 0 replies; 28+ messages in thread
From: Patchwork @ 2024-10-21 10:23 UTC (permalink / raw)
To: Gwan-gyeong Mun; +Cc: intel-xe
== Series Details ==
Series: Support EU online debug on pagefault
URL : https://patchwork.freedesktop.org/series/140239/
State : failure
== Summary ==
run-parts: executing /workspace/ci/hooks/00-showenv
+ export
+ grep -Ei '(^|\W)CI_'
declare -x CI_KERNEL_BUILD_DIR="/workspace/kernel/build64-default"
declare -x CI_KERNEL_SRC_DIR="/workspace/kernel"
declare -x CI_TOOLS_SRC_DIR="/workspace/ci"
declare -x CI_WORKSPACE_DIR="/workspace"
run-parts: executing /workspace/ci/hooks/10-build-W1
+ SRC_DIR=/workspace/kernel
+ RESTORE_DISPLAY_CONFIG=0
+ '[' -n /workspace/kernel/build64-default ']'
+ BUILD_DIR=/workspace/kernel/build64-default
+ cd /workspace/kernel
++ nproc
+ make -j48 O=/workspace/kernel/build64-default modules_prepare
make[1]: Entering directory '/workspace/kernel/build64-default'
GEN Makefile
UPD include/config/kernel.release
UPD include/generated/utsrelease.h
mkdir -p /workspace/kernel/build64-default/tools/objtool && make O=/workspace/kernel/build64-default subdir=tools/objtool --no-print-directory -C objtool
CALL ../scripts/checksyscalls.sh
INSTALL libsubcmd_headers
CC /workspace/kernel/build64-default/tools/objtool/libsubcmd/exec-cmd.o
CC /workspace/kernel/build64-default/tools/objtool/libsubcmd/help.o
CC /workspace/kernel/build64-default/tools/objtool/libsubcmd/pager.o
CC /workspace/kernel/build64-default/tools/objtool/libsubcmd/parse-options.o
CC /workspace/kernel/build64-default/tools/objtool/libsubcmd/run-command.o
CC /workspace/kernel/build64-default/tools/objtool/libsubcmd/sigchain.o
CC /workspace/kernel/build64-default/tools/objtool/libsubcmd/subcmd-config.o
LD /workspace/kernel/build64-default/tools/objtool/libsubcmd/libsubcmd-in.o
AR /workspace/kernel/build64-default/tools/objtool/libsubcmd/libsubcmd.a
CC /workspace/kernel/build64-default/tools/objtool/weak.o
CC /workspace/kernel/build64-default/tools/objtool/check.o
CC /workspace/kernel/build64-default/tools/objtool/special.o
CC /workspace/kernel/build64-default/tools/objtool/builtin-check.o
CC /workspace/kernel/build64-default/tools/objtool/elf.o
CC /workspace/kernel/build64-default/tools/objtool/objtool.o
CC /workspace/kernel/build64-default/tools/objtool/orc_gen.o
CC /workspace/kernel/build64-default/tools/objtool/orc_dump.o
CC /workspace/kernel/build64-default/tools/objtool/arch/x86/special.o
CC /workspace/kernel/build64-default/tools/objtool/libstring.o
CC /workspace/kernel/build64-default/tools/objtool/libctype.o
CC /workspace/kernel/build64-default/tools/objtool/arch/x86/decode.o
CC /workspace/kernel/build64-default/tools/objtool/str_error_r.o
CC /workspace/kernel/build64-default/tools/objtool/arch/x86/orc.o
CC /workspace/kernel/build64-default/tools/objtool/librbtree.o
LD /workspace/kernel/build64-default/tools/objtool/arch/x86/objtool-in.o
LD /workspace/kernel/build64-default/tools/objtool/objtool-in.o
LINK /workspace/kernel/build64-default/tools/objtool/objtool
make[1]: Leaving directory '/workspace/kernel/build64-default'
++ nproc
+ make -j48 O=/workspace/kernel/build64-default W=1 drivers/gpu/drm/xe
make[1]: Entering directory '/workspace/kernel/build64-default'
make[2]: Nothing to be done for 'drivers/gpu/drm/xe'.
make[1]: Leaving directory '/workspace/kernel/build64-default'
run-parts: executing /workspace/ci/hooks/11-build-32b
+++ realpath /workspace/ci/hooks/11-build-32b
++ dirname /workspace/ci/hooks/11-build-32b
+ THIS_SCRIPT_DIR=/workspace/ci/hooks
+ SRC_DIR=/workspace/kernel
+ TOOLS_SRC_DIR=/workspace/ci
+ '[' -n /workspace/kernel/build64-default ']'
+ BUILD_DIR=/workspace/kernel/build64-default
+ BUILD_DIR=/workspace/kernel/build64-default/build32
+ cd /workspace/kernel
+ mkdir -p /workspace/kernel/build64-default/build32
++ nproc
+ make -j48 ARCH=i386 O=/workspace/kernel/build64-default/build32 defconfig
make[1]: Entering directory '/workspace/kernel/build64-default/build32'
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/menu.o
HOSTCC scripts/kconfig/preprocess.o
HOSTCC scripts/kconfig/symbol.o
HOSTCC scripts/kconfig/util.o
HOSTCC scripts/kconfig/lexer.lex.o
HOSTCC scripts/kconfig/parser.tab.o
HOSTLD scripts/kconfig/conf
*** Default configuration is based on 'i386_defconfig'
#
# configuration written to .config
#
make[1]: Leaving directory '/workspace/kernel/build64-default/build32'
+ cd /workspace/kernel/build64-default/build32
+ /workspace/kernel/scripts/kconfig/merge_config.sh .config /workspace/ci/kernel/10-xe.fragment
Using .config as base
Merging /workspace/ci/kernel/10-xe.fragment
Value of CONFIG_DRM_XE is redefined by fragment /workspace/ci/kernel/10-xe.fragment:
Previous value: # CONFIG_DRM_XE is not set
New value: CONFIG_DRM_XE=m
Value of CONFIG_SND_DEBUG is redefined by fragment /workspace/ci/kernel/10-xe.fragment:
Previous value: # CONFIG_SND_DEBUG is not set
New value: CONFIG_SND_DEBUG=y
Value of CONFIG_SND_HDA_INTEL is redefined by fragment /workspace/ci/kernel/10-xe.fragment:
Previous value: CONFIG_SND_HDA_INTEL=y
New value: CONFIG_SND_HDA_INTEL=m
Value of CONFIG_SND_HDA_CODEC_HDMI is redefined by fragment /workspace/ci/kernel/10-xe.fragment:
Previous value: # CONFIG_SND_HDA_CODEC_HDMI is not set
New value: CONFIG_SND_HDA_CODEC_HDMI=m
GEN Makefile
WARNING: unmet direct dependencies detected for FB_IOMEM_HELPERS
Depends on [n]: HAS_IOMEM [=y] && FB_CORE [=n]
Selected by [m]:
- DRM_XE_DISPLAY [=y] && HAS_IOMEM [=y] && DRM [=y] && DRM_XE [=m] && DRM_XE [=m]=m [=m]
#
# configuration written to .config
#
Value requested for CONFIG_HAVE_UID16 not in final .config
Requested value: CONFIG_HAVE_UID16=y
Actual value:
Value requested for CONFIG_UID16 not in final .config
Requested value: CONFIG_UID16=y
Actual value:
Value requested for CONFIG_X86_32 not in final .config
Requested value: CONFIG_X86_32=y
Actual value:
Value requested for CONFIG_OUTPUT_FORMAT not in final .config
Requested value: CONFIG_OUTPUT_FORMAT="elf32-i386"
Actual value: CONFIG_OUTPUT_FORMAT="elf64-x86-64"
Value requested for CONFIG_ARCH_MMAP_RND_BITS_MIN not in final .config
Requested value: CONFIG_ARCH_MMAP_RND_BITS_MIN=8
Actual value: CONFIG_ARCH_MMAP_RND_BITS_MIN=28
Value requested for CONFIG_ARCH_MMAP_RND_BITS_MAX not in final .config
Requested value: CONFIG_ARCH_MMAP_RND_BITS_MAX=16
Actual value: CONFIG_ARCH_MMAP_RND_BITS_MAX=32
Value requested for CONFIG_PGTABLE_LEVELS not in final .config
Requested value: CONFIG_PGTABLE_LEVELS=2
Actual value: CONFIG_PGTABLE_LEVELS=5
Value requested for CONFIG_X86_BIGSMP not in final .config
Requested value: # CONFIG_X86_BIGSMP is not set
Actual value:
Value requested for CONFIG_X86_INTEL_QUARK not in final .config
Requested value: # CONFIG_X86_INTEL_QUARK is not set
Actual value:
Value requested for CONFIG_X86_RDC321X not in final .config
Requested value: # CONFIG_X86_RDC321X is not set
Actual value:
Value requested for CONFIG_X86_32_NON_STANDARD not in final .config
Requested value: # CONFIG_X86_32_NON_STANDARD is not set
Actual value:
Value requested for CONFIG_X86_32_IRIS not in final .config
Requested value: # CONFIG_X86_32_IRIS is not set
Actual value:
Value requested for CONFIG_M486SX not in final .config
Requested value: # CONFIG_M486SX is not set
Actual value:
Value requested for CONFIG_M486 not in final .config
Requested value: # CONFIG_M486 is not set
Actual value:
Value requested for CONFIG_M586 not in final .config
Requested value: # CONFIG_M586 is not set
Actual value:
Value requested for CONFIG_M586TSC not in final .config
Requested value: # CONFIG_M586TSC is not set
Actual value:
Value requested for CONFIG_M586MMX not in final .config
Requested value: # CONFIG_M586MMX is not set
Actual value:
Value requested for CONFIG_M686 not in final .config
Requested value: CONFIG_M686=y
Actual value:
Value requested for CONFIG_MPENTIUMII not in final .config
Requested value: # CONFIG_MPENTIUMII is not set
Actual value:
Value requested for CONFIG_MPENTIUMIII not in final .config
Requested value: # CONFIG_MPENTIUMIII is not set
Actual value:
Value requested for CONFIG_MPENTIUMM not in final .config
Requested value: # CONFIG_MPENTIUMM is not set
Actual value:
Value requested for CONFIG_MPENTIUM4 not in final .config
Requested value: # CONFIG_MPENTIUM4 is not set
Actual value:
Value requested for CONFIG_MK6 not in final .config
Requested value: # CONFIG_MK6 is not set
Actual value:
Value requested for CONFIG_MK7 not in final .config
Requested value: # CONFIG_MK7 is not set
Actual value:
Value requested for CONFIG_MCRUSOE not in final .config
Requested value: # CONFIG_MCRUSOE is not set
Actual value:
Value requested for CONFIG_MEFFICEON not in final .config
Requested value: # CONFIG_MEFFICEON is not set
Actual value:
Value requested for CONFIG_MWINCHIPC6 not in final .config
Requested value: # CONFIG_MWINCHIPC6 is not set
Actual value:
Value requested for CONFIG_MWINCHIP3D not in final .config
Requested value: # CONFIG_MWINCHIP3D is not set
Actual value:
Value requested for CONFIG_MELAN not in final .config
Requested value: # CONFIG_MELAN is not set
Actual value:
Value requested for CONFIG_MGEODEGX1 not in final .config
Requested value: # CONFIG_MGEODEGX1 is not set
Actual value:
Value requested for CONFIG_MGEODE_LX not in final .config
Requested value: # CONFIG_MGEODE_LX is not set
Actual value:
Value requested for CONFIG_MCYRIXIII not in final .config
Requested value: # CONFIG_MCYRIXIII is not set
Actual value:
Value requested for CONFIG_MVIAC3_2 not in final .config
Requested value: # CONFIG_MVIAC3_2 is not set
Actual value:
Value requested for CONFIG_MVIAC7 not in final .config
Requested value: # CONFIG_MVIAC7 is not set
Actual value:
Value requested for CONFIG_X86_GENERIC not in final .config
Requested value: # CONFIG_X86_GENERIC is not set
Actual value:
Value requested for CONFIG_X86_INTERNODE_CACHE_SHIFT not in final .config
Requested value: CONFIG_X86_INTERNODE_CACHE_SHIFT=5
Actual value: CONFIG_X86_INTERNODE_CACHE_SHIFT=6
Value requested for CONFIG_X86_L1_CACHE_SHIFT not in final .config
Requested value: CONFIG_X86_L1_CACHE_SHIFT=5
Actual value: CONFIG_X86_L1_CACHE_SHIFT=6
Value requested for CONFIG_X86_USE_PPRO_CHECKSUM not in final .config
Requested value: CONFIG_X86_USE_PPRO_CHECKSUM=y
Actual value:
Value requested for CONFIG_X86_MINIMUM_CPU_FAMILY not in final .config
Requested value: CONFIG_X86_MINIMUM_CPU_FAMILY=6
Actual value: CONFIG_X86_MINIMUM_CPU_FAMILY=64
Value requested for CONFIG_CPU_SUP_TRANSMETA_32 not in final .config
Requested value: CONFIG_CPU_SUP_TRANSMETA_32=y
Actual value:
Value requested for CONFIG_CPU_SUP_VORTEX_32 not in final .config
Requested value: CONFIG_CPU_SUP_VORTEX_32=y
Actual value:
Value requested for CONFIG_HPET_TIMER not in final .config
Requested value: # CONFIG_HPET_TIMER is not set
Actual value: CONFIG_HPET_TIMER=y
Value requested for CONFIG_NR_CPUS_RANGE_END not in final .config
Requested value: CONFIG_NR_CPUS_RANGE_END=8
Actual value: CONFIG_NR_CPUS_RANGE_END=512
Value requested for CONFIG_NR_CPUS_DEFAULT not in final .config
Requested value: CONFIG_NR_CPUS_DEFAULT=8
Actual value: CONFIG_NR_CPUS_DEFAULT=64
Value requested for CONFIG_X86_ANCIENT_MCE not in final .config
Requested value: # CONFIG_X86_ANCIENT_MCE is not set
Actual value:
Value requested for CONFIG_X86_LEGACY_VM86 not in final .config
Requested value: # CONFIG_X86_LEGACY_VM86 is not set
Actual value:
Value requested for CONFIG_X86_ESPFIX32 not in final .config
Requested value: CONFIG_X86_ESPFIX32=y
Actual value:
Value requested for CONFIG_TOSHIBA not in final .config
Requested value: # CONFIG_TOSHIBA is not set
Actual value:
Value requested for CONFIG_X86_REBOOTFIXUPS not in final .config
Requested value: # CONFIG_X86_REBOOTFIXUPS is not set
Actual value:
Value requested for CONFIG_MICROCODE_INITRD32 not in final .config
Requested value: CONFIG_MICROCODE_INITRD32=y
Actual value:
Value requested for CONFIG_NOHIGHMEM not in final .config
Requested value: # CONFIG_NOHIGHMEM is not set
Actual value:
Value requested for CONFIG_HIGHMEM4G not in final .config
Requested value: CONFIG_HIGHMEM4G=y
Actual value:
Value requested for CONFIG_HIGHMEM64G not in final .config
Requested value: # CONFIG_HIGHMEM64G is not set
Actual value:
Value requested for CONFIG_VMSPLIT_3G not in final .config
Requested value: CONFIG_VMSPLIT_3G=y
Actual value:
Value requested for CONFIG_VMSPLIT_3G_OPT not in final .config
Requested value: # CONFIG_VMSPLIT_3G_OPT is not set
Actual value:
Value requested for CONFIG_VMSPLIT_2G not in final .config
Requested value: # CONFIG_VMSPLIT_2G is not set
Actual value:
Value requested for CONFIG_VMSPLIT_2G_OPT not in final .config
Requested value: # CONFIG_VMSPLIT_2G_OPT is not set
Actual value:
Value requested for CONFIG_VMSPLIT_1G not in final .config
Requested value: # CONFIG_VMSPLIT_1G is not set
Actual value:
Value requested for CONFIG_PAGE_OFFSET not in final .config
Requested value: CONFIG_PAGE_OFFSET=0xC0000000
Actual value:
Value requested for CONFIG_HIGHMEM not in final .config
Requested value: CONFIG_HIGHMEM=y
Actual value:
Value requested for CONFIG_X86_PAE not in final .config
Requested value: # CONFIG_X86_PAE is not set
Actual value:
Value requested for CONFIG_ARCH_FLATMEM_ENABLE not in final .config
Requested value: CONFIG_ARCH_FLATMEM_ENABLE=y
Actual value:
Value requested for CONFIG_ARCH_SELECT_MEMORY_MODEL not in final .config
Requested value: CONFIG_ARCH_SELECT_MEMORY_MODEL=y
Actual value:
Value requested for CONFIG_ILLEGAL_POINTER_VALUE not in final .config
Requested value: CONFIG_ILLEGAL_POINTER_VALUE=0
Actual value: CONFIG_ILLEGAL_POINTER_VALUE=0xdead000000000000
Value requested for CONFIG_HIGHPTE not in final .config
Requested value: # CONFIG_HIGHPTE is not set
Actual value:
Value requested for CONFIG_COMPAT_VDSO not in final .config
Requested value: # CONFIG_COMPAT_VDSO is not set
Actual value:
Value requested for CONFIG_FUNCTION_PADDING_CFI not in final .config
Requested value: CONFIG_FUNCTION_PADDING_CFI=0
Actual value: CONFIG_FUNCTION_PADDING_CFI=11
Value requested for CONFIG_FUNCTION_PADDING_BYTES not in final .config
Requested value: CONFIG_FUNCTION_PADDING_BYTES=4
Actual value: CONFIG_FUNCTION_PADDING_BYTES=16
Value requested for CONFIG_APM not in final .config
Requested value: # CONFIG_APM is not set
Actual value:
Value requested for CONFIG_X86_POWERNOW_K6 not in final .config
Requested value: # CONFIG_X86_POWERNOW_K6 is not set
Actual value:
Value requested for CONFIG_X86_POWERNOW_K7 not in final .config
Requested value: # CONFIG_X86_POWERNOW_K7 is not set
Actual value:
Value requested for CONFIG_X86_GX_SUSPMOD not in final .config
Requested value: # CONFIG_X86_GX_SUSPMOD is not set
Actual value:
Value requested for CONFIG_X86_SPEEDSTEP_ICH not in final .config
Requested value: # CONFIG_X86_SPEEDSTEP_ICH is not set
Actual value:
Value requested for CONFIG_X86_SPEEDSTEP_SMI not in final .config
Requested value: # CONFIG_X86_SPEEDSTEP_SMI is not set
Actual value:
Value requested for CONFIG_X86_CPUFREQ_NFORCE2 not in final .config
Requested value: # CONFIG_X86_CPUFREQ_NFORCE2 is not set
Actual value:
Value requested for CONFIG_X86_LONGRUN not in final .config
Requested value: # CONFIG_X86_LONGRUN is not set
Actual value:
Value requested for CONFIG_X86_LONGHAUL not in final .config
Requested value: # CONFIG_X86_LONGHAUL is not set
Actual value:
Value requested for CONFIG_X86_E_POWERSAVER not in final .config
Requested value: # CONFIG_X86_E_POWERSAVER is not set
Actual value:
Value requested for CONFIG_PCI_GOBIOS not in final .config
Requested value: # CONFIG_PCI_GOBIOS is not set
Actual value:
Value requested for CONFIG_PCI_GOMMCONFIG not in final .config
Requested value: # CONFIG_PCI_GOMMCONFIG is not set
Actual value:
Value requested for CONFIG_PCI_GODIRECT not in final .config
Requested value: # CONFIG_PCI_GODIRECT is not set
Actual value:
Value requested for CONFIG_PCI_GOANY not in final .config
Requested value: CONFIG_PCI_GOANY=y
Actual value:
Value requested for CONFIG_PCI_BIOS not in final .config
Requested value: CONFIG_PCI_BIOS=y
Actual value:
Value requested for CONFIG_ISA not in final .config
Requested value: # CONFIG_ISA is not set
Actual value:
Value requested for CONFIG_SCx200 not in final .config
Requested value: # CONFIG_SCx200 is not set
Actual value:
Value requested for CONFIG_OLPC not in final .config
Requested value: # CONFIG_OLPC is not set
Actual value:
Value requested for CONFIG_ALIX not in final .config
Requested value: # CONFIG_ALIX is not set
Actual value:
Value requested for CONFIG_NET5501 not in final .config
Requested value: # CONFIG_NET5501 is not set
Actual value:
Value requested for CONFIG_GEOS not in final .config
Requested value: # CONFIG_GEOS is not set
Actual value:
Value requested for CONFIG_COMPAT_32 not in final .config
Requested value: CONFIG_COMPAT_32=y
Actual value:
Value requested for CONFIG_HAVE_ATOMIC_IOMAP not in final .config
Requested value: CONFIG_HAVE_ATOMIC_IOMAP=y
Actual value:
Value requested for CONFIG_ARCH_32BIT_OFF_T not in final .config
Requested value: CONFIG_ARCH_32BIT_OFF_T=y
Actual value:
Value requested for CONFIG_ARCH_WANT_IPC_PARSE_VERSION not in final .config
Requested value: CONFIG_ARCH_WANT_IPC_PARSE_VERSION=y
Actual value:
Value requested for CONFIG_MODULES_USE_ELF_REL not in final .config
Requested value: CONFIG_MODULES_USE_ELF_REL=y
Actual value:
Value requested for CONFIG_ARCH_MMAP_RND_BITS not in final .config
Requested value: CONFIG_ARCH_MMAP_RND_BITS=8
Actual value: CONFIG_ARCH_MMAP_RND_BITS=28
Value requested for CONFIG_CLONE_BACKWARDS not in final .config
Requested value: CONFIG_CLONE_BACKWARDS=y
Actual value:
Value requested for CONFIG_OLD_SIGSUSPEND3 not in final .config
Requested value: CONFIG_OLD_SIGSUSPEND3=y
Actual value:
Value requested for CONFIG_OLD_SIGACTION not in final .config
Requested value: CONFIG_OLD_SIGACTION=y
Actual value:
Value requested for CONFIG_ARCH_SPLIT_ARG64 not in final .config
Requested value: CONFIG_ARCH_SPLIT_ARG64=y
Actual value:
Value requested for CONFIG_FUNCTION_ALIGNMENT not in final .config
Requested value: CONFIG_FUNCTION_ALIGNMENT=4
Actual value: CONFIG_FUNCTION_ALIGNMENT=16
Value requested for CONFIG_SELECT_MEMORY_MODEL not in final .config
Requested value: CONFIG_SELECT_MEMORY_MODEL=y
Actual value:
Value requested for CONFIG_FLATMEM_MANUAL not in final .config
Requested value: CONFIG_FLATMEM_MANUAL=y
Actual value:
Value requested for CONFIG_SPARSEMEM_MANUAL not in final .config
Requested value: # CONFIG_SPARSEMEM_MANUAL is not set
Actual value:
Value requested for CONFIG_FLATMEM not in final .config
Requested value: CONFIG_FLATMEM=y
Actual value:
Value requested for CONFIG_SPARSEMEM_STATIC not in final .config
Requested value: CONFIG_SPARSEMEM_STATIC=y
Actual value:
Value requested for CONFIG_BOUNCE not in final .config
Requested value: CONFIG_BOUNCE=y
Actual value:
Value requested for CONFIG_KMAP_LOCAL not in final .config
Requested value: CONFIG_KMAP_LOCAL=y
Actual value:
Value requested for CONFIG_HOTPLUG_PCI_COMPAQ not in final .config
Requested value: # CONFIG_HOTPLUG_PCI_COMPAQ is not set
Actual value:
Value requested for CONFIG_HOTPLUG_PCI_IBM not in final .config
Requested value: # CONFIG_HOTPLUG_PCI_IBM is not set
Actual value:
Value requested for CONFIG_EFI_CAPSULE_QUIRK_QUARK_CSH not in final .config
Requested value: CONFIG_EFI_CAPSULE_QUIRK_QUARK_CSH=y
Actual value:
Value requested for CONFIG_PCH_PHUB not in final .config
Requested value: # CONFIG_PCH_PHUB is not set
Actual value:
Value requested for CONFIG_SCSI_NSP32 not in final .config
Requested value: # CONFIG_SCSI_NSP32 is not set
Actual value:
Value requested for CONFIG_PATA_CS5520 not in final .config
Requested value: # CONFIG_PATA_CS5520 is not set
Actual value:
Value requested for CONFIG_PATA_CS5530 not in final .config
Requested value: # CONFIG_PATA_CS5530 is not set
Actual value:
Value requested for CONFIG_PATA_CS5535 not in final .config
Requested value: # CONFIG_PATA_CS5535 is not set
Actual value:
Value requested for CONFIG_PATA_CS5536 not in final .config
Requested value: # CONFIG_PATA_CS5536 is not set
Actual value:
Value requested for CONFIG_PATA_SC1200 not in final .config
Requested value: # CONFIG_PATA_SC1200 is not set
Actual value:
Value requested for CONFIG_PCH_GBE not in final .config
Requested value: # CONFIG_PCH_GBE is not set
Actual value:
Value requested for CONFIG_INPUT_WISTRON_BTNS not in final .config
Requested value: # CONFIG_INPUT_WISTRON_BTNS is not set
Actual value:
Value requested for CONFIG_SERIAL_TIMBERDALE not in final .config
Requested value: # CONFIG_SERIAL_TIMBERDALE is not set
Actual value:
Value requested for CONFIG_SERIAL_PCH_UART not in final .config
Requested value: # CONFIG_SERIAL_PCH_UART is not set
Actual value:
Value requested for CONFIG_HW_RANDOM_GEODE not in final .config
Requested value: CONFIG_HW_RANDOM_GEODE=y
Actual value:
Value requested for CONFIG_SONYPI not in final .config
Requested value: # CONFIG_SONYPI is not set
Actual value:
Value requested for CONFIG_PC8736x_GPIO not in final .config
Requested value: # CONFIG_PC8736x_GPIO is not set
Actual value:
Value requested for CONFIG_NSC_GPIO not in final .config
Requested value: # CONFIG_NSC_GPIO is not set
Actual value:
Value requested for CONFIG_I2C_EG20T not in final .config
Requested value: # CONFIG_I2C_EG20T is not set
Actual value:
Value requested for CONFIG_SCx200_ACB not in final .config
Requested value: # CONFIG_SCx200_ACB is not set
Actual value:
Value requested for CONFIG_PTP_1588_CLOCK_PCH not in final .config
Requested value: # CONFIG_PTP_1588_CLOCK_PCH is not set
Actual value:
Value requested for CONFIG_SBC8360_WDT not in final .config
Requested value: # CONFIG_SBC8360_WDT is not set
Actual value:
Value requested for CONFIG_SBC7240_WDT not in final .config
Requested value: # CONFIG_SBC7240_WDT is not set
Actual value:
Value requested for CONFIG_MFD_CS5535 not in final .config
Requested value: # CONFIG_MFD_CS5535 is not set
Actual value:
Value requested for CONFIG_AGP_ALI not in final .config
Requested value: # CONFIG_AGP_ALI is not set
Actual value:
Value requested for CONFIG_AGP_ATI not in final .config
Requested value: # CONFIG_AGP_ATI is not set
Actual value:
Value requested for CONFIG_AGP_AMD not in final .config
Requested value: # CONFIG_AGP_AMD is not set
Actual value:
Value requested for CONFIG_AGP_NVIDIA not in final .config
Requested value: # CONFIG_AGP_NVIDIA is not set
Actual value:
Value requested for CONFIG_AGP_SWORKS not in final .config
Requested value: # CONFIG_AGP_SWORKS is not set
Actual value:
Value requested for CONFIG_AGP_EFFICEON not in final .config
Requested value: # CONFIG_AGP_EFFICEON is not set
Actual value:
Value requested for CONFIG_SND_PCM not in final .config
Requested value: CONFIG_SND_PCM=y
Actual value: CONFIG_SND_PCM=m
Value requested for CONFIG_SND_HWDEP not in final .config
Requested value: CONFIG_SND_HWDEP=y
Actual value: CONFIG_SND_HWDEP=m
Value requested for CONFIG_SND_DYNAMIC_MINORS not in final .config
Requested value: # CONFIG_SND_DYNAMIC_MINORS is not set
Actual value: CONFIG_SND_DYNAMIC_MINORS=y
Value requested for CONFIG_SND_CS5530 not in final .config
Requested value: # CONFIG_SND_CS5530 is not set
Actual value:
Value requested for CONFIG_SND_CS5535AUDIO not in final .config
Requested value: # CONFIG_SND_CS5535AUDIO is not set
Actual value:
Value requested for CONFIG_SND_SIS7019 not in final .config
Requested value: # CONFIG_SND_SIS7019 is not set
Actual value:
Value requested for CONFIG_SND_HDA not in final .config
Requested value: CONFIG_SND_HDA=y
Actual value: CONFIG_SND_HDA=m
Value requested for CONFIG_SND_HDA_CORE not in final .config
Requested value: CONFIG_SND_HDA_CORE=y
Actual value: CONFIG_SND_HDA_CORE=m
Value requested for CONFIG_SND_INTEL_DSP_CONFIG not in final .config
Requested value: CONFIG_SND_INTEL_DSP_CONFIG=y
Actual value: CONFIG_SND_INTEL_DSP_CONFIG=m
Value requested for CONFIG_SND_INTEL_SOUNDWIRE_ACPI not in final .config
Requested value: CONFIG_SND_INTEL_SOUNDWIRE_ACPI=y
Actual value: CONFIG_SND_INTEL_SOUNDWIRE_ACPI=m
Value requested for CONFIG_LEDS_OT200 not in final .config
Requested value: # CONFIG_LEDS_OT200 is not set
Actual value:
Value requested for CONFIG_PCH_DMA not in final .config
Requested value: # CONFIG_PCH_DMA is not set
Actual value:
Value requested for CONFIG_CLKSRC_I8253 not in final .config
Requested value: CONFIG_CLKSRC_I8253=y
Actual value:
Value requested for CONFIG_MAILBOX not in final .config
Requested value: # CONFIG_MAILBOX is not set
Actual value: CONFIG_MAILBOX=y
Value requested for CONFIG_CRYPTO_SERPENT_SSE2_586 not in final .config
Requested value: # CONFIG_CRYPTO_SERPENT_SSE2_586 is not set
Actual value:
Value requested for CONFIG_CRYPTO_TWOFISH_586 not in final .config
Requested value: # CONFIG_CRYPTO_TWOFISH_586 is not set
Actual value:
Value requested for CONFIG_CRYPTO_DEV_GEODE not in final .config
Requested value: # CONFIG_CRYPTO_DEV_GEODE is not set
Actual value:
Value requested for CONFIG_CRYPTO_DEV_HIFN_795X not in final .config
Requested value: # CONFIG_CRYPTO_DEV_HIFN_795X is not set
Actual value:
Value requested for CONFIG_CRYPTO_LIB_POLY1305_RSIZE not in final .config
Requested value: CONFIG_CRYPTO_LIB_POLY1305_RSIZE=1
Actual value: CONFIG_CRYPTO_LIB_POLY1305_RSIZE=11
Value requested for CONFIG_AUDIT_GENERIC not in final .config
Requested value: CONFIG_AUDIT_GENERIC=y
Actual value:
Value requested for CONFIG_GENERIC_VDSO_32 not in final .config
Requested value: CONFIG_GENERIC_VDSO_32=y
Actual value:
Value requested for CONFIG_DEBUG_KMAP_LOCAL not in final .config
Requested value: # CONFIG_DEBUG_KMAP_LOCAL is not set
Actual value:
Value requested for CONFIG_DEBUG_HIGHMEM not in final .config
Requested value: # CONFIG_DEBUG_HIGHMEM is not set
Actual value:
Value requested for CONFIG_HAVE_DEBUG_STACKOVERFLOW not in final .config
Requested value: CONFIG_HAVE_DEBUG_STACKOVERFLOW=y
Actual value:
Value requested for CONFIG_DEBUG_STACKOVERFLOW not in final .config
Requested value: # CONFIG_DEBUG_STACKOVERFLOW is not set
Actual value:
Value requested for CONFIG_HAVE_FUNCTION_GRAPH_TRACER not in final .config
Requested value: CONFIG_HAVE_FUNCTION_GRAPH_TRACER=y
Actual value:
Value requested for CONFIG_HAVE_FUNCTION_GRAPH_RETVAL not in final .config
Requested value: CONFIG_HAVE_FUNCTION_GRAPH_RETVAL=y
Actual value:
Value requested for CONFIG_DRM_KUNIT_TEST not in final .config
Requested value: CONFIG_DRM_KUNIT_TEST=m
Actual value:
Value requested for CONFIG_DRM_XE_WERROR not in final .config
Requested value: CONFIG_DRM_XE_WERROR=y
Actual value:
Value requested for CONFIG_DRM_XE_DEBUG not in final .config
Requested value: CONFIG_DRM_XE_DEBUG=y
Actual value:
Value requested for CONFIG_DRM_XE_DEBUG_MEM not in final .config
Requested value: CONFIG_DRM_XE_DEBUG_MEM=y
Actual value:
Value requested for CONFIG_DRM_XE_KUNIT_TEST not in final .config
Requested value: CONFIG_DRM_XE_KUNIT_TEST=m
Actual value:
++ nproc
+ make -j48 ARCH=i386 olddefconfig
GEN Makefile
WARNING: unmet direct dependencies detected for FB_IOMEM_HELPERS
Depends on [n]: HAS_IOMEM [=y] && FB_CORE [=n]
Selected by [m]:
- DRM_XE_DISPLAY [=y] && HAS_IOMEM [=y] && DRM [=y] && DRM_XE [=m] && DRM_XE [=m]=m [=m]
#
# configuration written to .config
#
++ nproc
+ make -j48 ARCH=i386
SYNC include/config/auto.conf.cmd
GEN Makefile
WARNING: unmet direct dependencies detected for FB_IOMEM_HELPERS
Depends on [n]: HAS_IOMEM [=y] && FB_CORE [=n]
Selected by [m]:
- DRM_XE_DISPLAY [=y] && HAS_IOMEM [=y] && DRM [=y] && DRM_XE [=m] && DRM_XE [=m]=m [=m]
WARNING: unmet direct dependencies detected for FB_IOMEM_HELPERS
Depends on [n]: HAS_IOMEM [=y] && FB_CORE [=n]
Selected by [m]:
- DRM_XE_DISPLAY [=y] && HAS_IOMEM [=y] && DRM [=y] && DRM_XE [=m] && DRM_XE [=m]=m [=m]
WARNING: unmet direct dependencies detected for FB_IOMEM_HELPERS
Depends on [n]: HAS_IOMEM [=y] && FB_CORE [=n]
Selected by [m]:
- DRM_XE_DISPLAY [=y] && HAS_IOMEM [=y] && DRM [=y] && DRM_XE [=m] && DRM_XE [=m]=m [=m]
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
WRAP arch/x86/include/generated/uapi/asm/ioctl.h
UPD include/generated/uapi/linux/version.h
WRAP arch/x86/include/generated/uapi/asm/ioctls.h
WRAP arch/x86/include/generated/uapi/asm/ipcbuf.h
WRAP arch/x86/include/generated/uapi/asm/param.h
WRAP arch/x86/include/generated/uapi/asm/poll.h
SYSHDR arch/x86/include/generated/uapi/asm/unistd_32.h
WRAP arch/x86/include/generated/uapi/asm/resource.h
SYSHDR arch/x86/include/generated/uapi/asm/unistd_64.h
WRAP arch/x86/include/generated/uapi/asm/socket.h
SYSHDR arch/x86/include/generated/uapi/asm/unistd_x32.h
WRAP arch/x86/include/generated/uapi/asm/sockios.h
WRAP arch/x86/include/generated/uapi/asm/termbits.h
SYSTBL arch/x86/include/generated/asm/syscalls_32.h
WRAP arch/x86/include/generated/uapi/asm/termios.h
WRAP arch/x86/include/generated/uapi/asm/types.h
UPD include/generated/compile.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/early_ioremap.h
WRAP arch/x86/include/generated/asm/mcs_spinlock.h
WRAP arch/x86/include/generated/asm/mmzone.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
HOSTCC scripts/kallsyms
HOSTCC scripts/sorttable
HOSTCC scripts/asn1_compiler
HOSTCC scripts/selinux/genheaders/genheaders
HOSTCC scripts/selinux/mdp/mdp
HOSTLD arch/x86/tools/relocs
UPD include/config/kernel.release
UPD include/generated/utsrelease.h
CC scripts/mod/empty.o
HOSTCC scripts/mod/mk_elfconfig
CC scripts/mod/devicetable-offsets.s
UPD scripts/mod/devicetable-offsets.h
MKELF scripts/mod/elfconfig.h
HOSTCC scripts/mod/modpost.o
HOSTCC scripts/mod/file2alias.o
HOSTCC scripts/mod/sumversion.o
HOSTCC scripts/mod/symsearch.o
HOSTLD scripts/mod/modpost
CC kernel/bounds.s
CHKSHA1 /workspace/kernel/include/linux/atomic/atomic-arch-fallback.h
CHKSHA1 /workspace/kernel/include/linux/atomic/atomic-instrumented.h
CHKSHA1 /workspace/kernel/include/linux/atomic/atomic-long.h
UPD include/generated/timeconst.h
UPD include/generated/bounds.h
CC arch/x86/kernel/asm-offsets.s
UPD include/generated/asm-offsets.h
CALL /workspace/kernel/scripts/checksyscalls.sh
LDS scripts/module.lds
HOSTCC usr/gen_init_cpio
CC init/main.o
CC certs/system_keyring.o
CC init/do_mounts.o
UPD init/utsversion-tmp.h
CC init/do_mounts_initrd.o
CC ipc/util.o
CC security/commoncap.o
CC ipc/msgutil.o
CC init/initramfs.o
CC security/lsm_syscalls.o
CC mm/filemap.o
CC arch/x86/realmode/init.o
CC init/calibrate.o
CC io_uring/io_uring.o
AS arch/x86/lib/atomic64_cx8_32.o
CC ipc/msg.o
CC security/min_addr.o
AR arch/x86/crypto/built-in.a
CC block/bdev.o
CC io_uring/opdef.o
CC mm/mempool.o
AS arch/x86/lib/checksum_32.o
CC arch/x86/power/cpu.o
CC init/init_task.o
CC arch/x86/video/video-common.o
AR arch/x86/net/built-in.a
CC arch/x86/pci/i386.o
CC security/keys/gc.o
CC security/integrity/iint.o
GEN security/selinux/flask.h security/selinux/av_permissions.h
CC block/partitions/core.o
CC arch/x86/events/amd/core.o
AR virt/lib/built-in.a
AS arch/x86/realmode/rm/header.o
CC fs/nfs_common/nfsacl.o
CC arch/x86/mm/pat/set_memory.o
AR arch/x86/virt/svm/built-in.a
CC arch/x86/events/intel/core.o
AR drivers/cache/built-in.a
CC arch/x86/lib/cmdline.o
CC lib/math/div64.o
AR arch/x86/platform/atom/built-in.a
CC security/selinux/avc.o
AR virt/built-in.a
CC fs/notify/dnotify/dnotify.o
CC arch/x86/events/intel/bts.o
AR drivers/irqchip/built-in.a
CC sound/core/seq/seq.o
CC arch/x86/kernel/fpu/init.o
CC net/core/sock.o
AR arch/x86/virt/vmx/built-in.a
AR arch/x86/platform/ce4100/built-in.a
CC arch/x86/entry/vdso/vma.o
AR arch/x86/entry/vsyscall/built-in.a
AR arch/x86/virt/built-in.a
CC security/security.o
CC fs/iomap/trace.o
AS arch/x86/realmode/rm/trampoline_32.o
AR drivers/bus/mhi/built-in.a
CC arch/x86/platform/efi/memmap.o
AR drivers/bus/built-in.a
CC kernel/locking/mutex.o
CC kernel/power/qos.o
CC kernel/sched/core.o
AR drivers/pwm/built-in.a
AS arch/x86/realmode/rm/stack.o
CC crypto/asymmetric_keys/asymmetric_type.o
AS arch/x86/realmode/rm/reboot.o
AR drivers/leds/trigger/built-in.a
AR drivers/leds/blink/built-in.a
AR drivers/leds/simple/built-in.a
AS arch/x86/realmode/rm/wakeup_asm.o
CC drivers/leds/led-core.o
AS arch/x86/lib/cmpxchg8b_emu.o
CC arch/x86/lib/cpu.o
CC arch/x86/realmode/rm/wakemain.o
CC lib/math/gcd.o
CC arch/x86/realmode/rm/video-mode.o
CC lib/math/lcm.o
CC lib/math/int_log.o
AS arch/x86/realmode/rm/copy.o
CC kernel/power/main.o
AS arch/x86/realmode/rm/bioscall.o
GEN usr/initramfs_data.cpio
COPY usr/initramfs_inc_data
AS usr/initramfs_data.o
CC arch/x86/realmode/rm/regs.o
HOSTCC certs/extract-cert
AR usr/built-in.a
CC lib/math/int_pow.o
CC arch/x86/power/hibernate_32.o
CC arch/x86/kernel/fpu/bugs.o
CC arch/x86/realmode/rm/video-vga.o
CC lib/math/int_sqrt.o
CC arch/x86/kernel/fpu/core.o
CC arch/x86/realmode/rm/video-vesa.o
CC lib/math/reciprocal_div.o
CC arch/x86/lib/delay.o
CC arch/x86/realmode/rm/video-bios.o
CC sound/core/seq/seq_lock.o
CC lib/math/rational.o
CC lib/crypto/mpi/generic_mpih-lshift.o
AR arch/x86/video/built-in.a
CC fs/quota/dquot.o
CERT certs/x509_certificate_list
PASYMS arch/x86/realmode/rm/pasyms.h
CERT certs/signing_key.x509
AS certs/system_certificates.o
CC lib/zlib_inflate/inffast.o
AR certs/built-in.a
LDS arch/x86/realmode/rm/realmode.lds
CC security/integrity/integrity_audit.o
CC block/fops.o
CC drivers/leds/led-class.o
CC lib/zlib_deflate/deflate.o
LD arch/x86/realmode/rm/realmode.elf
CC fs/nfs_common/grace.o
RELOCS arch/x86/realmode/rm/realmode.relocs
CC drivers/leds/led-triggers.o
OBJCOPY arch/x86/realmode/rm/realmode.bin
AS arch/x86/realmode/rmpiggy.o
CC mm/oom_kill.o
CC lib/lzo/lzo1x_compress.o
AR arch/x86/realmode/built-in.a
CC io_uring/kbuf.o
CC crypto/asymmetric_keys/restrict.o
AS arch/x86/power/hibernate_asm_32.o
CC arch/x86/pci/init.o
AR fs/notify/dnotify/built-in.a
CC security/keys/key.o
CC fs/notify/inotify/inotify_fsnotify.o
CC sound/core/seq/seq_clientmgr.o
CC arch/x86/entry/vdso/extable.o
CC arch/x86/platform/efi/quirks.o
AS arch/x86/lib/getuser.o
CC arch/x86/events/intel/ds.o
GEN arch/x86/lib/inat-tables.c
CC lib/zlib_inflate/inflate.o
CC arch/x86/events/intel/knc.o
CC arch/x86/lib/insn-eval.o
CC kernel/locking/semaphore.o
CC block/partitions/msdos.o
CC lib/lzo/lzo1x_decompress_safe.o
AR lib/math/built-in.a
CC arch/x86/mm/init.o
CC sound/core/sound.o
CC block/bio.o
CC arch/x86/power/hibernate.o
CC ipc/sem.o
CC lib/crypto/memneq.o
CC lib/crypto/mpi/generic_mpih-mul1.o
AR arch/x86/platform/geode/built-in.a
CC arch/x86/events/amd/lbr.o
CC crypto/asymmetric_keys/signature.o
AR arch/x86/platform/iris/built-in.a
CC fs/nfs_common/common.o
CC arch/x86/platform/intel/iosf_mbi.o
CC fs/iomap/iter.o
AR sound/i2c/other/built-in.a
AR sound/i2c/built-in.a
CC arch/x86/events/zhaoxin/core.o
AR sound/drivers/opl3/built-in.a
CC fs/proc/task_mmu.o
CC arch/x86/lib/insn.o
AR sound/drivers/opl4/built-in.a
AR sound/drivers/mpu401/built-in.a
CC fs/notify/inotify/inotify_user.o
AR sound/drivers/vx/built-in.a
AR sound/drivers/pcsp/built-in.a
AR sound/drivers/built-in.a
CC fs/quota/quota_v2.o
CC kernel/power/console.o
CC arch/x86/pci/pcbios.o
AR security/integrity/built-in.a
CC fs/kernfs/mount.o
AR lib/lzo/built-in.a
CC drivers/pci/msi/pcidev_msi.o
CC drivers/pci/msi/api.o
CC arch/x86/mm/pat/memtype.o
AR drivers/leds/built-in.a
CC init/version.o
CC lib/zlib_inflate/infutil.o
CC drivers/pci/pcie/portdrv.o
CC lib/zlib_deflate/deftree.o
CC lib/zlib_deflate/deflate_syms.o
LDS arch/x86/entry/vdso/vdso32/vdso32.lds
AS arch/x86/entry/vdso/vdso32/note.o
CC security/selinux/hooks.o
CC fs/sysfs/file.o
CC kernel/locking/rwsem.o
AS arch/x86/entry/vdso/vdso32/system_call.o
CC kernel/power/process.o
AS arch/x86/entry/vdso/vdso32/sigreturn.o
CC arch/x86/entry/vdso/vdso32/vclock_gettime.o
AR init/built-in.a
CC arch/x86/lib/kaslr.o
CC crypto/asymmetric_keys/public_key.o
ASN.1 crypto/asymmetric_keys/x509.asn1.[ch]
CC arch/x86/platform/efi/efi.o
CC arch/x86/events/core.o
CC kernel/locking/percpu-rwsem.o
CC arch/x86/kernel/fpu/regset.o
CC lib/crypto/mpi/generic_mpih-mul2.o
AR arch/x86/power/built-in.a
CC crypto/api.o
CC io_uring/rsrc.o
CC security/keys/keyring.o
CC block/partitions/efi.o
CC lib/zlib_inflate/inftrees.o
AR fs/nfs_common/built-in.a
CC arch/x86/platform/efi/efi_32.o
CC arch/x86/lib/memcpy_32.o
CC arch/x86/mm/init_32.o
CC drivers/pci/pcie/rcec.o
AR arch/x86/platform/intel/built-in.a
AS arch/x86/entry/entry.o
AS arch/x86/lib/memmove_32.o
CC arch/x86/kernel/cpu/mce/core.o
CC arch/x86/lib/misc.o
AR drivers/pci/pwrctl/built-in.a
CC lib/zlib_inflate/inflate_syms.o
CC fs/proc/inode.o
CC drivers/video/console/dummycon.o
CC arch/x86/lib/pc-conf-reg.o
CC arch/x86/mm/pat/memtype_interval.o
CC arch/x86/events/amd/ibs.o
CC security/keys/keyctl.o
CC fs/iomap/buffered-io.o
CC sound/core/seq/seq_memory.o
CC arch/x86/pci/mmconfig_32.o
CC drivers/pci/msi/msi.o
AR lib/zlib_deflate/built-in.a
CC drivers/pci/msi/irqdomain.o
AR arch/x86/events/zhaoxin/built-in.a
CC drivers/video/backlight/backlight.o
CC fs/kernfs/inode.o
AS arch/x86/lib/putuser.o
AS arch/x86/lib/retpoline.o
AR fs/notify/inotify/built-in.a
CC arch/x86/lib/string_32.o
AR fs/notify/fanotify/built-in.a
AR drivers/video/fbdev/core/built-in.a
CC fs/notify/fsnotify.o
AR drivers/video/fbdev/omap/built-in.a
CC lib/crypto/mpi/generic_mpih-mul3.o
AR drivers/video/fbdev/omap2/omapfb/dss/built-in.a
CC arch/x86/entry/vdso/vdso32/vgetcpu.o
CC fs/notify/notification.o
CC fs/quota/quota_tree.o
AR drivers/video/fbdev/omap2/omapfb/displays/built-in.a
CC arch/x86/lib/strstr_32.o
AR drivers/video/fbdev/omap2/omapfb/built-in.a
AR drivers/video/fbdev/omap2/built-in.a
ASN.1 crypto/asymmetric_keys/x509_akid.asn1.[ch]
CC crypto/asymmetric_keys/x509_loader.o
AR drivers/video/fbdev/built-in.a
AR lib/zlib_inflate/built-in.a
CC crypto/asymmetric_keys/x509_public_key.o
CC arch/x86/kernel/cpu/mce/severity.o
CC arch/x86/lib/usercopy.o
HOSTCC arch/x86/entry/vdso/vdso2c
CC fs/sysfs/dir.o
CC drivers/video/console/vgacon.o
CC kernel/locking/spinlock.o
CC arch/x86/kernel/fpu/signal.o
CC arch/x86/mm/fault.o
CC fs/devpts/inode.o
CC drivers/pci/pcie/aspm.o
CC drivers/pci/pcie/pme.o
CC net/core/request_sock.o
CC security/selinux/selinuxfs.o
AR arch/x86/mm/pat/built-in.a
CC arch/x86/events/intel/lbr.o
AS arch/x86/platform/efi/efi_stub_32.o
CC arch/x86/lib/usercopy_32.o
AR arch/x86/platform/intel-mid/built-in.a
CC security/lsm_audit.o
CC arch/x86/platform/efi/runtime-map.o
AR block/partitions/built-in.a
CC arch/x86/events/probe.o
CC kernel/power/suspend.o
CC kernel/power/hibernate.o
CC arch/x86/entry/vdso/vdso32-setup.o
CC arch/x86/pci/direct.o
CC kernel/locking/osq_lock.o
CC block/elevator.o
CC security/selinux/netlink.o
CC ipc/shm.o
CC fs/iomap/direct-io.o
CC lib/crypto/mpi/generic_mpih-rshift.o
ASN.1 crypto/asymmetric_keys/pkcs7.asn1.[ch]
CC sound/core/seq/seq_queue.o
CC crypto/asymmetric_keys/pkcs7_trust.o
CC mm/fadvise.o
CC fs/sysfs/symlink.o
CC arch/x86/kernel/cpu/mce/genpool.o
CC security/keys/permission.o
AR drivers/idle/built-in.a
CC arch/x86/lib/msr-smp.o
CC crypto/cipher.o
CC fs/kernfs/dir.o
CC fs/netfs/buffered_read.o
CC fs/proc/root.o
CC kernel/locking/qspinlock.o
AR drivers/video/backlight/built-in.a
CC kernel/printk/printk.o
CC fs/ext4/balloc.o
AR drivers/pci/msi/built-in.a
CC fs/notify/group.o
CC fs/jbd2/transaction.o
VDSO arch/x86/entry/vdso/vdso32.so.dbg
CC kernel/printk/printk_safe.o
OBJCOPY arch/x86/entry/vdso/vdso32.so
VDSO2C arch/x86/entry/vdso/vdso-image-32.c
CC arch/x86/entry/vdso/vdso-image-32.o
CC fs/kernfs/file.o
CC fs/quota/quota.o
CC drivers/video/aperture.o
CC arch/x86/events/amd/uncore.o
CC arch/x86/lib/cache-smp.o
CC crypto/asymmetric_keys/pkcs7_verify.o
CC mm/maccess.o
AR arch/x86/platform/intel-quark/built-in.a
AS arch/x86/entry/entry_32.o
CC crypto/compress.o
AR drivers/video/console/built-in.a
CC block/blk-core.o
CC arch/x86/kernel/fpu/xstate.o
AR fs/devpts/built-in.a
AR arch/x86/platform/efi/built-in.a
AR arch/x86/platform/olpc/built-in.a
CC net/ethernet/eth.o
CC lib/crypto/mpi/generic_mpih-sub1.o
AR arch/x86/entry/vdso/built-in.a
CC arch/x86/lib/msr.o
AR arch/x86/platform/scx200/built-in.a
CC arch/x86/entry/syscall_32.o
AR arch/x86/platform/ts5500/built-in.a
AR arch/x86/platform/uv/built-in.a
AR arch/x86/platform/built-in.a
CC arch/x86/pci/mmconfig-shared.o
CC arch/x86/events/utils.o
CC kernel/locking/rtmutex_api.o
CC arch/x86/events/intel/p4.o
CC fs/sysfs/mount.o
CC fs/sysfs/group.o
CC net/core/skbuff.o
CC io_uring/notif.o
CC security/keys/process_keys.o
AS arch/x86/lib/msr-reg.o
CC crypto/asymmetric_keys/x509.asn1.o
AR net/802/built-in.a
CC fs/proc/base.o
CC arch/x86/kernel/cpu/mce/intel.o
CC arch/x86/pci/fixup.o
CC crypto/asymmetric_keys/x509_akid.asn1.o
CC sound/core/seq/seq_fifo.o
CC crypto/asymmetric_keys/x509_cert_parser.o
CC ipc/syscall.o
CC fs/notify/mark.o
CC lib/lz4/lz4_decompress.o
CC fs/iomap/fiemap.o
AR drivers/pci/pcie/built-in.a
CC drivers/pci/hotplug/pci_hotplug_core.o
CC arch/x86/mm/ioremap.o
CC fs/iomap/seek.o
CC block/blk-sysfs.o
CC arch/x86/pci/acpi.o
CC sound/core/init.o
CC lib/crypto/mpi/generic_mpih-add1.o
CC kernel/irq/irqdesc.o
CC sound/core/memory.o
CC drivers/video/cmdline.o
CC mm/page-writeback.o
CC kernel/irq/handle.o
CC security/selinux/nlmsgtab.o
CC kernel/power/snapshot.o
CC arch/x86/events/intel/p6.o
CC fs/kernfs/symlink.o
CC fs/netfs/buffered_write.o
CC arch/x86/entry/common.o
CC arch/x86/lib/msr-reg-export.o
CC crypto/asymmetric_keys/pkcs7.asn1.o
CC arch/x86/events/rapl.o
CC crypto/asymmetric_keys/pkcs7_parser.o
AR arch/x86/events/amd/built-in.a
CC arch/x86/kernel/cpu/mce/amd.o
CC fs/notify/fdinfo.o
CC fs/quota/kqid.o
CC sound/core/seq/seq_prioq.o
AR fs/sysfs/built-in.a
CC kernel/irq/manage.o
CC kernel/irq/spurious.o
CC lib/crypto/utils.o
CC crypto/algapi.o
CC kernel/locking/qrwlock.o
CC mm/folio-compat.o
AS arch/x86/lib/hweight.o
CC arch/x86/lib/iomem.o
CC lib/crypto/mpi/mpicoder.o
CC ipc/ipc_sysctl.o
CC fs/iomap/swapfile.o
AR arch/x86/kernel/fpu/built-in.a
CC fs/proc/generic.o
CC net/sched/sch_generic.o
CC arch/x86/events/msr.o
CC drivers/pci/hotplug/acpi_pcihp.o
CC kernel/printk/nbcon.o
CC security/keys/request_key.o
CC arch/x86/mm/extable.o
CC fs/jbd2/commit.o
CC fs/ramfs/inode.o
CC fs/jbd2/recovery.o
CC fs/jbd2/checkpoint.o
CC arch/x86/pci/legacy.o
CC drivers/video/nomodeset.o
AR net/ethernet/built-in.a
CC block/blk-flush.o
CC arch/x86/kernel/acpi/boot.o
CC io_uring/tctx.o
CC fs/quota/netlink.o
CC arch/x86/lib/atomic64_32.o
AR crypto/asymmetric_keys/built-in.a
AR kernel/locking/built-in.a
AR drivers/pci/controller/dwc/built-in.a
AR drivers/pci/controller/mobiveil/built-in.a
AR drivers/pci/switch/built-in.a
AR fs/kernfs/built-in.a
CC fs/ext4/bitmap.o
CC fs/ext4/block_validity.o
CC sound/core/seq/seq_timer.o
CC kernel/irq/resend.o
AR drivers/pci/controller/plda/built-in.a
CC arch/x86/kernel/apic/apic.o
AR drivers/pci/controller/built-in.a
CC arch/x86/lib/inat.o
CC fs/ext4/dir.o
CC arch/x86/events/intel/pt.o
CC kernel/sched/fair.o
AR fs/notify/built-in.a
CC arch/x86/kernel/cpu/mce/threshold.o
CC lib/crypto/mpi/mpi-add.o
CC ipc/mqueue.o
CC net/netlink/af_netlink.o
AR arch/x86/lib/built-in.a
AR arch/x86/lib/lib.a
AR lib/lz4/built-in.a
CC net/netlink/genetlink.o
CC drivers/video/hdmi.o
AS arch/x86/entry/thunk.o
AR net/bpf/built-in.a
CC sound/core/control.o
AR arch/x86/entry/built-in.a
CC crypto/scatterwalk.o
CC crypto/proc.o
CC fs/hugetlbfs/inode.o
CC arch/x86/kernel/apic/apic_common.o
CC kernel/sched/build_policy.o
CC arch/x86/kernel/acpi/sleep.o
CC security/selinux/netif.o
AR fs/iomap/built-in.a
CC security/selinux/netnode.o
CC arch/x86/pci/irq.o
AR drivers/pci/hotplug/built-in.a
CC drivers/pci/access.o
CC arch/x86/pci/common.o
CC fs/ext4/ext4_jbd2.o
CC fs/ramfs/file-mmu.o
CC arch/x86/kernel/kprobes/core.o
CC fs/netfs/direct_read.o
CC security/device_cgroup.o
CC kernel/printk/printk_ringbuffer.o
CC arch/x86/mm/mmap.o
CC security/keys/request_key_auth.o
CC kernel/sched/build_utility.o
CC block/blk-settings.o
CC lib/crypto/mpi/mpi-bit.o
AR fs/quota/built-in.a
CC net/ethtool/ioctl.o
CC sound/core/seq/seq_system.o
CC sound/core/seq/seq_ports.o
CC security/selinux/netport.o
CC sound/core/seq/seq_info.o
CC fs/proc/array.o
CC io_uring/filetable.o
CC net/netfilter/core.o
AR sound/isa/ad1816a/built-in.a
CC kernel/irq/chip.o
AR sound/isa/ad1848/built-in.a
AR sound/pci/ac97/built-in.a
AR sound/isa/cs423x/built-in.a
CC kernel/power/swap.o
AR sound/pci/ali5451/built-in.a
AR sound/isa/es1688/built-in.a
AR sound/pci/asihpi/built-in.a
AR sound/isa/galaxy/built-in.a
AR sound/pci/au88x0/built-in.a
AR sound/isa/gus/built-in.a
AR sound/pci/aw2/built-in.a
AR sound/isa/msnd/built-in.a
AR sound/pci/ctxfi/built-in.a
AR sound/isa/opti9xx/built-in.a
AR sound/pci/ca0106/built-in.a
AR sound/isa/sb/built-in.a
AR sound/pci/cs46xx/built-in.a
CC crypto/aead.o
AR sound/pci/cs5535audio/built-in.a
AR sound/isa/wavefront/built-in.a
AR sound/isa/wss/built-in.a
AR sound/pci/lola/built-in.a
AR sound/isa/built-in.a
AR sound/pci/lx6464es/built-in.a
AR sound/pci/echoaudio/built-in.a
AR drivers/video/built-in.a
CC drivers/pci/bus.o
CC security/keys/user_defined.o
AR sound/pci/emu10k1/built-in.a
CC mm/readahead.o
AR drivers/char/ipmi/built-in.a
AR sound/pci/hda/built-in.a
CC io_uring/rw.o
CC [M] sound/pci/hda/hda_bind.o
AR sound/pci/ice1712/built-in.a
CC kernel/power/user.o
CC kernel/printk/sysctl.o
CC fs/jbd2/revoke.o
AS arch/x86/kernel/acpi/wakeup_32.o
CC arch/x86/kernel/acpi/cstate.o
AR fs/ramfs/built-in.a
CC block/blk-ioc.o
CC arch/x86/mm/pgtable.o
AR arch/x86/kernel/cpu/mce/built-in.a
CC arch/x86/kernel/cpu/mtrr/mtrr.o
CC block/blk-map.o
LDS arch/x86/kernel/vmlinux.lds
AR sound/pci/korg1212/built-in.a
CC arch/x86/events/intel/uncore.o
CC sound/core/seq/seq_dummy.o
CC fs/ext4/extents.o
CC fs/fat/cache.o
CC fs/isofs/namei.o
CC lib/crypto/mpi/mpi-cmp.o
CC arch/x86/kernel/apic/apic_noop.o
AR kernel/printk/built-in.a
CC net/netlink/policy.o
CC arch/x86/kernel/kprobes/opt.o
CC fs/netfs/direct_write.o
CC net/ipv4/netfilter/nf_defrag_ipv4.o
AR fs/hugetlbfs/built-in.a
CC net/xfrm/xfrm_policy.o
CC net/ethtool/common.o
CC arch/x86/kernel/cpu/mtrr/if.o
CC net/ipv4/route.o
CC security/keys/proc.o
CC arch/x86/pci/early.o
CC ipc/namespace.o
CC fs/fat/dir.o
CC io_uring/net.o
AR arch/x86/kernel/acpi/built-in.a
CC net/sched/sch_mq.o
CC net/xfrm/xfrm_state.o
CC fs/nfs/client.o
CC kernel/power/poweroff.o
CC [M] sound/pci/hda/hda_codec.o
CC drivers/pci/probe.o
CC arch/x86/mm/physaddr.o
CC arch/x86/kernel/apic/ipi.o
CC kernel/irq/dummychip.o
CC net/xfrm/xfrm_hash.o
CC fs/proc/fd.o
AR sound/core/seq/built-in.a
CC sound/core/misc.o
CC lib/crypto/mpi/mpi-sub-ui.o
CC security/selinux/status.o
CC crypto/geniv.o
CC crypto/lskcipher.o
CC fs/jbd2/journal.o
AR sound/pci/mixart/built-in.a
CC net/unix/af_unix.o
CC mm/swap.o
CC fs/exportfs/expfs.o
CC [M] sound/pci/hda/hda_jack.o
CC fs/isofs/inode.o
CC lib/crypto/chacha.o
AR kernel/power/built-in.a
CC lib/zstd/zstd_decompress_module.o
CC arch/x86/kernel/cpu/mtrr/generic.o
CC ipc/mq_sysctl.o
CC net/netfilter/nf_log.o
CC block/blk-merge.o
CC fs/fat/fatent.o
CC kernel/irq/devres.o
CC arch/x86/pci/bus_numa.o
CC security/keys/sysctl.o
AR arch/x86/kernel/kprobes/built-in.a
CC fs/proc/proc_tty.o
CC io_uring/poll.o
CC arch/x86/mm/tlb.o
CC arch/x86/kernel/apic/vector.o
CC fs/nfs/dir.o
CC net/unix/garbage.o
CC lib/crypto/aes.o
CC fs/netfs/iterator.o
CC lib/crypto/mpi/mpi-div.o
AR net/netlink/built-in.a
CC arch/x86/events/intel/uncore_nhmex.o
CC sound/core/device.o
CC lib/zstd/decompress/huf_decompress.o
AR ipc/built-in.a
CC fs/fat/file.o
CC net/ipv4/netfilter/nf_reject_ipv4.o
AR fs/exportfs/built-in.a
CC crypto/skcipher.o
CC arch/x86/kernel/cpu/microcode/core.o
CC net/ipv4/netfilter/ip_tables.o
CC net/sched/sch_frag.o
CC kernel/irq/autoprobe.o
CC security/keys/keyctl_pkey.o
CC net/xfrm/xfrm_input.o
CC net/ipv4/inetpeer.o
CC arch/x86/pci/amd_bus.o
CC fs/proc/cmdline.o
CC security/selinux/ss/ebitmap.o
CC kernel/rcu/update.o
CC drivers/pci/host-bridge.o
CC sound/core/info.o
AR sound/ppc/built-in.a
AS arch/x86/kernel/head_32.o
CC fs/isofs/dir.o
AR sound/pci/nm256/built-in.a
CC kernel/irq/irqdomain.o
CC lib/crypto/mpi/mpi-mod.o
CC arch/x86/kernel/cpu/mtrr/cleanup.o
CC fs/ext4/extents_status.o
CC lib/xz/xz_dec_syms.o
CC net/ethtool/netlink.o
CC net/netfilter/nf_queue.o
CC arch/x86/kernel/cpu/microcode/intel.o
CC arch/x86/mm/cpu_entry_area.o
CC drivers/acpi/acpica/dsargs.o
CC mm/truncate.o
AR drivers/acpi/pmic/built-in.a
CC lib/zstd/decompress/zstd_ddict.o
CC [M] sound/pci/hda/hda_auto_parser.o
AR security/keys/built-in.a
CC net/core/datagram.o
CC fs/proc/consoles.o
CC fs/netfs/locking.o
CC kernel/rcu/sync.o
CC arch/x86/mm/maccess.o
CC fs/fat/inode.o
CC lib/dim/dim.o
CC lib/xz/xz_dec_stream.o
AR arch/x86/pci/built-in.a
CC lib/dim/net_dim.o
CC lib/crypto/mpi/mpi-mul.o
CC arch/x86/events/intel/uncore_snb.o
CC [M] sound/pci/hda/hda_sysfs.o
CC drivers/pci/remove.o
CC block/blk-timeout.o
CC net/ipv4/protocol.o
CC fs/isofs/util.o
CC drivers/acpi/acpica/dscontrol.o
CC lib/zstd/decompress/zstd_decompress.o
CC crypto/seqiv.o
CC security/selinux/ss/hashtab.o
CC arch/x86/kernel/cpu/microcode/amd.o
CC net/sched/sch_api.o
CC sound/core/isadma.o
CC arch/x86/kernel/cpu/mtrr/amd.o
CC arch/x86/kernel/apic/init.o
CC lib/crypto/mpi/mpih-cmp.o
CC arch/x86/mm/pgprot.o
CC io_uring/eventfd.o
CC drivers/pnp/pnpacpi/core.o
CC fs/proc/cpuinfo.o
CC fs/proc/devices.o
CC drivers/pnp/pnpacpi/rsparser.o
CC lib/xz/xz_dec_lzma2.o
CC drivers/acpi/acpica/dsdebug.o
CC net/ipv6/netfilter/ip6_tables.o
CC net/ipv4/netfilter/iptable_filter.o
CC kernel/irq/proc.o
CC security/selinux/ss/symtab.o
CC net/ipv4/netfilter/iptable_mangle.o
CC block/blk-lib.o
CC net/unix/sysctl_net_unix.o
CC sound/core/vmaster.o
CC lib/crypto/arc4.o
CC arch/x86/kernel/apic/hw_nmi.o
CC mm/vmscan.o
CC fs/netfs/main.o
CC arch/x86/kernel/apic/io_apic.o
CC fs/isofs/rock.o
CC lib/crypto/gf128mul.o
CC net/ethtool/bitset.o
CC lib/zstd/decompress/zstd_decompress_block.o
CC lib/fonts/fonts.o
CC crypto/echainiv.o
CC drivers/pci/pci.o
CC security/selinux/ss/sidtab.o
AR fs/jbd2/built-in.a
CC [M] sound/pci/hda/hda_controller.o
CC arch/x86/kernel/cpu/mtrr/cyrix.o
CC net/ipv4/netfilter/ipt_REJECT.o
CC drivers/acpi/acpica/dsfield.o
CC arch/x86/mm/pgtable_32.o
CC lib/crypto/mpi/mpih-div.o
CC net/netfilter/nf_sockopt.o
CC drivers/acpi/dptf/int340x_thermal.o
CC lib/fonts/font_8x16.o
CC lib/dim/rdma_dim.o
CC fs/proc/interrupts.o
CC arch/x86/kernel/cpu/cacheinfo.o
CC io_uring/uring_cmd.o
CC drivers/acpi/acpica/dsinit.o
CC mm/shrinker.o
CC arch/x86/events/intel/uncore_snbep.o
AR arch/x86/kernel/cpu/microcode/built-in.a
CC net/xfrm/xfrm_output.o
CC mm/shmem.o
CC kernel/irq/migration.o
AR kernel/sched/built-in.a
CC kernel/rcu/srcutree.o
CC net/ethtool/strset.o
CC lib/xz/xz_dec_bcj.o
CC sound/core/ctljack.o
CC [M] sound/pci/hda/hda_proc.o
CC fs/fat/misc.o
CC fs/fat/nfs.o
AR lib/fonts/built-in.a
CC security/selinux/ss/avtab.o
CC net/packet/af_packet.o
AR drivers/pnp/pnpacpi/built-in.a
AR drivers/acpi/dptf/built-in.a
CC drivers/pnp/core.o
AR lib/dim/built-in.a
AR sound/arm/built-in.a
CC block/blk-mq.o
CC drivers/pci/pci-driver.o
CC arch/x86/kernel/head32.o
CC io_uring/openclose.o
CC arch/x86/kernel/cpu/mtrr/centaur.o
CC drivers/acpi/acpica/dsmethod.o
CC net/core/stream.o
CC crypto/ahash.o
CC fs/proc/loadavg.o
CC crypto/shash.o
CC arch/x86/mm/iomap_32.o
CC kernel/irq/cpuhotplug.o
CC drivers/acpi/acpica/dsmthdat.o
AR kernel/livepatch/built-in.a
CC lib/crypto/mpi/mpih-mul.o
CC fs/isofs/export.o
AR net/unix/built-in.a
CC mm/util.o
CC sound/core/jack.o
AR lib/xz/built-in.a
CC net/sched/sch_blackhole.o
AR drivers/amba/built-in.a
CC fs/netfs/misc.o
CC [M] net/ipv4/netfilter/iptable_nat.o
CC net/netfilter/utils.o
CC kernel/irq/pm.o
CC lib/crypto/blake2s.o
CC fs/ext4/file.o
CC fs/nfs/file.o
CC [M] sound/pci/hda/hda_hwdep.o
CC net/ipv4/ip_input.o
CC drivers/acpi/acpica/dsobject.o
CC arch/x86/kernel/cpu/mtrr/legacy.o
CC drivers/pnp/card.o
CC net/xfrm/xfrm_sysctl.o
CC fs/proc/meminfo.o
AR sound/pci/oxygen/built-in.a
CC fs/lockd/clntlock.o
CC kernel/rcu/tree.o
AR net/dsa/built-in.a
CC arch/x86/mm/hugetlbpage.o
CC sound/core/timer.o
CC fs/fat/namei_vfat.o
CC net/ipv6/netfilter/ip6table_filter.o
CC fs/lockd/clntproc.o
CC arch/x86/kernel/cpu/scattered.o
CC arch/x86/kernel/apic/msi.o
CC fs/isofs/joliet.o
CC kernel/dma/mapping.o
CC mm/mmzone.o
CC net/ethtool/linkinfo.o
CC io_uring/sqpoll.o
CC net/ethtool/linkmodes.o
AR arch/x86/kernel/cpu/mtrr/built-in.a
CC arch/x86/kernel/cpu/topology_common.o
CC kernel/rcu/rcu_segcblist.o
AR drivers/clk/actions/built-in.a
CC arch/x86/mm/dump_pagetables.o
AR drivers/clk/analogbits/built-in.a
CC lib/crypto/mpi/mpi-pow.o
CC drivers/acpi/acpica/dsopcode.o
CC net/ipv4/ip_fragment.o
AR drivers/clk/bcm/built-in.a
AR drivers/clk/imgtec/built-in.a
AR drivers/clk/imx/built-in.a
CC io_uring/xattr.o
AR drivers/clk/ingenic/built-in.a
AR drivers/clk/mediatek/built-in.a
AR drivers/clk/microchip/built-in.a
CC security/selinux/ss/policydb.o
AR drivers/clk/mstar/built-in.a
AR drivers/clk/mvebu/built-in.a
AR drivers/clk/ralink/built-in.a
CC crypto/akcipher.o
AR drivers/clk/renesas/built-in.a
AR drivers/clk/socfpga/built-in.a
AR drivers/clk/sophgo/built-in.a
CC drivers/pci/search.o
AR drivers/clk/sprd/built-in.a
AR drivers/clk/starfive/built-in.a
CC net/core/scm.o
AR drivers/clk/sunxi-ng/built-in.a
AR drivers/clk/ti/built-in.a
CC kernel/irq/msi.o
AR drivers/clk/versatile/built-in.a
CC net/sched/cls_api.o
AR drivers/clk/xilinx/built-in.a
AR drivers/clk/built-in.a
CC drivers/pci/rom.o
AR sound/pci/pcxhr/built-in.a
CC fs/ext4/fsmap.o
CC [M] sound/pci/hda/patch_hdmi.o
CC lib/argv_split.o
CC arch/x86/kernel/ebda.o
CC kernel/entry/common.o
CC fs/netfs/objects.o
CC fs/proc/stat.o
CC drivers/pnp/driver.o
CC fs/ext4/fsync.o
CC arch/x86/kernel/cpu/topology_ext.o
CC drivers/acpi/acpica/dspkginit.o
CC fs/isofs/compress.o
AR net/ipv4/netfilter/built-in.a
CC net/ethtool/rss.o
CC fs/fat/namei_msdos.o
CC net/sunrpc/auth_gss/auth_gss.o
CC lib/zstd/zstd_common_module.o
CC arch/x86/kernel/apic/probe_32.o
CC fs/nfs/getroot.o
CC net/netfilter/nfnetlink.o
CC net/xfrm/xfrm_replay.o
CC lib/crypto/mpi/mpiutil.o
CC arch/x86/mm/highmem_32.o
CC net/sunrpc/auth_gss/gss_generic_token.o
CC arch/x86/events/intel/uncore_discovery.o
CC sound/core/hrtimer.o
CC arch/x86/kernel/cpu/topology_amd.o
CC drivers/acpi/acpica/dsutils.o
CC net/core/gen_stats.o
CC net/sched/act_api.o
CC lib/zstd/common/debug.o
CC lib/zstd/common/entropy_common.o
CC net/ipv6/netfilter/ip6table_mangle.o
CC net/ipv6/af_inet6.o
CC drivers/pnp/resource.o
CC crypto/sig.o
CC lib/crypto/blake2s-generic.o
CC kernel/entry/syscall_user_dispatch.o
CC drivers/acpi/x86/apple.o
CC kernel/module/main.o
AR arch/x86/kernel/apic/built-in.a
CC mm/vmstat.o
CC fs/proc/uptime.o
CC net/netfilter/nfnetlink_log.o
CC drivers/acpi/x86/cmos_rtc.o
CC lib/zstd/common/error_private.o
CC crypto/kpp.o
CC lib/zstd/common/fse_decompress.o
CC fs/lockd/clntxdr.o
CC drivers/pci/setup-res.o
AR lib/crypto/mpi/built-in.a
CC fs/nls/nls_base.o
CC arch/x86/kernel/cpu/common.o
CC kernel/irq/affinity.o
CC sound/core/seq_device.o
AR fs/isofs/built-in.a
CC kernel/irq/matrix.o
CC net/ipv4/ip_forward.o
CC drivers/acpi/acpica/dswexec.o
CC drivers/dma/dw/core.o
AR arch/x86/mm/built-in.a
CC fs/nls/nls_cp437.o
CC lib/crypto/sha1.o
CC mm/backing-dev.o
CC fs/netfs/read_collect.o
AR fs/fat/built-in.a
CC io_uring/nop.o
CC io_uring/fs.o
CC lib/bug.o
CC net/ethtool/linkstate.o
CC fs/ext4/hash.o
AR kernel/entry/built-in.a
CC kernel/dma/direct.o
CC fs/proc/util.o
CC lib/zstd/common/zstd_common.o
CC drivers/acpi/x86/lpss.o
CC net/xfrm/xfrm_device.o
CC net/sched/sch_fifo.o
CC block/blk-mq-tag.o
AR lib/zstd/built-in.a
CC lib/buildid.o
CC drivers/dma/hsu/hsu.o
CC fs/nfs/inode.o
CC drivers/acpi/acpica/dswload.o
CC fs/nls/nls_ascii.o
CC drivers/acpi/acpica/dswload2.o
CC fs/nfs/super.o
CC lib/crypto/sha256.o
CC arch/x86/events/intel/cstate.o
CC fs/netfs/read_pgpriv2.o
CC net/core/gen_estimator.o
ASN.1 crypto/rsapubkey.asn1.[ch]
ASN.1 crypto/rsaprivkey.asn1.[ch]
CC crypto/rsa.o
CC drivers/pci/irq.o
CC [M] sound/core/hwdep.o
CC drivers/pnp/manager.o
AR net/packet/built-in.a
CC net/core/net_namespace.o
CC net/ipv6/netfilter/nf_defrag_ipv6_hooks.o
CC fs/nls/nls_iso8859-1.o
CC fs/proc/version.o
CC arch/x86/kernel/platform-quirks.o
CC [M] sound/pci/hda/hda_eld.o
CC net/core/secure_seq.o
CC drivers/pci/vpd.o
CC drivers/acpi/acpica/dswscope.o
CC fs/lockd/host.o
CC drivers/pci/setup-bus.o
AR fs/unicode/built-in.a
CC drivers/acpi/acpica/dswstate.o
CC net/ipv6/netfilter/nf_conntrack_reasm.o
CC fs/ext4/ialloc.o
AR lib/crypto/built-in.a
CC arch/x86/kernel/process_32.o
CC io_uring/splice.o
CC drivers/dma/dw/dw.o
CC net/netfilter/nf_conntrack_core.o
CC drivers/pnp/support.o
CC drivers/acpi/x86/s2idle.o
CC lib/clz_tab.o
CC net/xfrm/xfrm_nat_keepalive.o
CC kernel/dma/ops_helpers.o
CC lib/cmdline.o
CC fs/nls/nls_utf8.o
AR kernel/irq/built-in.a
CC net/ethtool/debug.o
CC fs/netfs/read_retry.o
CC security/selinux/ss/services.o
CC fs/nfs/io.o
CC drivers/dma/dw/idma32.o
CC crypto/rsa_helper.o
CC net/ipv4/ip_options.o
CC mm/mm_init.o
AR net/wireless/tests/built-in.a
CC [M] sound/pci/hda/hda_intel.o
CC net/wireless/core.o
AR drivers/dma/hsu/built-in.a
CC lib/cpumask.o
CC net/sunrpc/clnt.o
CC [M] sound/core/pcm.o
CC mm/percpu.o
CC drivers/acpi/tables.o
AR arch/x86/events/intel/built-in.a
AR arch/x86/events/built-in.a
CC fs/proc/softirqs.o
CC crypto/rsa-pkcs1pad.o
CC net/ipv6/anycast.o
CC arch/x86/kernel/cpu/rdrand.o
CC [M] sound/core/pcm_native.o
CC drivers/acpi/acpica/evevent.o
AR net/mac80211/tests/built-in.a
CC net/sunrpc/auth_gss/gss_mech_switch.o
CC block/blk-stat.o
CC net/mac80211/main.o
CC net/sched/cls_cgroup.o
CC net/sched/ematch.o
CC net/sunrpc/xprt.o
CC arch/x86/kernel/cpu/match.o
AR fs/nls/built-in.a
CC kernel/time/time.o
CC drivers/pnp/interface.o
CC kernel/module/strict_rwx.o
CC drivers/acpi/osi.o
CC kernel/futex/core.o
CC kernel/time/timer.o
CC kernel/dma/remap.o
CC drivers/acpi/acpica/evgpe.o
CC lib/ctype.o
CC lib/dec_and_lock.o
CC fs/proc/namespaces.o
CC arch/x86/kernel/cpu/bugs.o
CC io_uring/sync.o
CC drivers/dma/dw/acpi.o
CC [M] sound/core/pcm_lib.o
CC drivers/pnp/quirks.o
CC lib/decompress.o
CC drivers/acpi/x86/utils.o
AR sound/sh/built-in.a
CC arch/x86/kernel/cpu/aperfmperf.o
CC net/sunrpc/auth_gss/svcauth_gss.o
CC net/core/flow_dissector.o
CC fs/lockd/svc.o
CC lib/decompress_bunzip2.o
CC net/ethtool/wol.o
CC crypto/acompress.o
CC block/blk-mq-sysfs.o
AR sound/pci/riptide/built-in.a
CC net/core/sysctl_net_core.o
CC fs/ext4/indirect.o
CC drivers/pci/vc.o
CC fs/netfs/write_collect.o
CC drivers/acpi/acpica/evgpeblk.o
CC kernel/module/kmod.o
CC net/xfrm/xfrm_algo.o
CC net/xfrm/xfrm_user.o
CC fs/autofs/init.o
CC net/ipv6/netfilter/nf_reject_ipv6.o
AR kernel/dma/built-in.a
CC io_uring/msg_ring.o
CC drivers/acpi/x86/blacklist.o
CC crypto/scompress.o
CC kernel/futex/syscalls.o
AR net/sched/built-in.a
CC security/selinux/ss/conditional.o
CC kernel/module/tree_lookup.o
AR sound/pci/rme9652/built-in.a
CC lib/decompress_inflate.o
CC net/ethtool/features.o
AR kernel/rcu/built-in.a
CC net/ethtool/privflags.o
CC net/ipv4/ip_output.o
AR drivers/dma/dw/built-in.a
AR drivers/dma/idxd/built-in.a
AR drivers/dma/amd/built-in.a
AR drivers/dma/mediatek/built-in.a
AR drivers/dma/qcom/built-in.a
AR drivers/dma/stm32/built-in.a
AR drivers/dma/ti/built-in.a
CC drivers/acpi/acpica/evgpeinit.o
CC net/sunrpc/auth_gss/gss_rpc_upcall.o
AR drivers/dma/xilinx/built-in.a
CC drivers/dma/dmaengine.o
CC fs/proc/self.o
CC drivers/pnp/system.o
CC kernel/cgroup/cgroup.o
LD [M] sound/pci/hda/snd-hda-codec.o
LD [M] sound/pci/hda/snd-hda-codec-hdmi.o
LD [M] sound/pci/hda/snd-hda-intel.o
AR sound/pci/trident/built-in.a
AR sound/pci/ymfpci/built-in.a
CC io_uring/advise.o
CC fs/nfs/direct.o
AR sound/pci/vx222/built-in.a
AR sound/pci/built-in.a
CC net/core/dev.o
CC drivers/acpi/osl.o
AR drivers/acpi/x86/built-in.a
CC crypto/algboss.o
CC kernel/cgroup/rstat.o
CC drivers/pci/mmap.o
CC fs/autofs/inode.o
CC block/blk-mq-cpumap.o
CC drivers/acpi/acpica/evgpeutil.o
CC fs/ext4/inline.o
CC fs/netfs/write_issue.o
CC kernel/module/kallsyms.o
CC lib/decompress_unlz4.o
AR drivers/pnp/built-in.a
CC [M] sound/core/pcm_misc.o
CC fs/proc/thread_self.o
CC net/netfilter/nf_conntrack_standalone.o
CC fs/lockd/svclock.o
CC fs/nfs/pagelist.o
CC drivers/acpi/acpica/evglock.o
CC kernel/futex/pi.o
CC arch/x86/kernel/cpu/cpuid-deps.o
CC kernel/time/hrtimer.o
CC security/selinux/ss/mls.o
CC arch/x86/kernel/signal.o
CC mm/slab_common.o
CC drivers/pci/devres.o
CC fs/9p/vfs_super.o
CC net/ethtool/rings.o
CC net/mac80211/status.o
CC net/ipv6/netfilter/ip6t_ipv6header.o
AR drivers/soc/apple/built-in.a
CC fs/9p/vfs_inode.o
AR drivers/soc/aspeed/built-in.a
AR drivers/soc/bcm/built-in.a
CC block/blk-mq-sched.o
AR drivers/soc/fsl/built-in.a
AR drivers/soc/fujitsu/built-in.a
CC io_uring/epoll.o
CC io_uring/statx.o
AR drivers/soc/hisilicon/built-in.a
AR drivers/soc/imx/built-in.a
CC drivers/virtio/virtio.o
CC lib/decompress_unlzma.o
AR drivers/soc/ixp4xx/built-in.a
CC fs/9p/vfs_inode_dotl.o
AR drivers/soc/loongson/built-in.a
CC fs/9p/vfs_addr.o
AR drivers/soc/mediatek/built-in.a
AR drivers/soc/microchip/built-in.a
CC net/ethtool/channels.o
AR drivers/soc/nuvoton/built-in.a
CC arch/x86/kernel/cpu/umwait.o
AR drivers/soc/pxa/built-in.a
AR drivers/soc/amlogic/built-in.a
CC drivers/acpi/acpica/evhandler.o
CC fs/autofs/root.o
AR drivers/soc/qcom/built-in.a
AR drivers/soc/renesas/built-in.a
AR drivers/soc/rockchip/built-in.a
AR drivers/soc/sunxi/built-in.a
AR drivers/soc/ti/built-in.a
AR drivers/soc/versatile/built-in.a
CC fs/proc/proc_sysctl.o
AR drivers/soc/xilinx/built-in.a
CC crypto/testmgr.o
AR drivers/soc/built-in.a
CC kernel/module/procfs.o
CC drivers/dma/virt-dma.o
CC net/ethtool/coalesce.o
CC fs/lockd/svcshare.o
CC [M] sound/core/pcm_memory.o
CC net/sunrpc/auth_gss/gss_rpc_xdr.o
CC net/ipv6/netfilter/ip6t_REJECT.o
CC net/netfilter/nf_conntrack_expect.o
CC fs/ext4/inode.o
CC kernel/futex/requeue.o
CC drivers/acpi/acpica/evmisc.o
CC net/sunrpc/socklib.o
CC arch/x86/kernel/signal_32.o
AR fs/netfs/built-in.a
CC net/netlabel/netlabel_user.o
CC drivers/pci/proc.o
CC net/wireless/sysfs.o
MKCAP arch/x86/kernel/cpu/capflags.c
CC crypto/cmac.o
CC arch/x86/kernel/cpu/powerflags.o
CC kernel/module/sysfs.o
CC drivers/virtio/virtio_ring.o
CC net/rfkill/core.o
CC lib/decompress_unlzo.o
CC net/9p/mod.o
CC io_uring/timeout.o
CC drivers/dma/acpi-dma.o
CC io_uring/fdinfo.o
CC drivers/acpi/acpica/evregion.o
CC mm/compaction.o
CC security/selinux/ss/context.o
CC net/netfilter/nf_conntrack_helper.o
CC block/ioctl.o
CC net/netfilter/nf_conntrack_proto.o
CC net/netlabel/netlabel_kapi.o
CC fs/autofs/symlink.o
AR net/xfrm/built-in.a
CC net/ipv4/ip_sockglue.o
CC net/ipv4/inet_hashtables.o
AR fs/hostfs/built-in.a
CC drivers/tty/vt/vt_ioctl.o
CC arch/x86/kernel/traps.o
CC drivers/tty/vt/vc_screen.o
CC net/rfkill/input.o
CC fs/9p/vfs_file.o
CC [M] sound/core/memalloc.o
CC mm/show_mem.o
CC net/ethtool/pause.o
CC kernel/futex/waitwake.o
CC kernel/time/timekeeping.o
CC crypto/hmac.o
CC fs/lockd/svcproc.o
CC drivers/acpi/acpica/evrgnini.o
CC drivers/virtio/virtio_anchor.o
CC lib/decompress_unxz.o
CC net/9p/client.o
CC mm/interval_tree.o
CC net/sunrpc/auth_gss/trace.o
CC io_uring/cancel.o
CC net/sunrpc/auth_gss/gss_krb5_mech.o
AR net/ipv6/netfilter/built-in.a
CC net/ipv6/ip6_output.o
CC drivers/pci/pci-sysfs.o
AR kernel/module/built-in.a
CC net/sunrpc/xprtsock.o
AR drivers/dma/built-in.a
CC kernel/cgroup/namespace.o
CC net/dns_resolver/dns_key.o
CC net/core/dev_addr_lists.o
CC fs/autofs/waitq.o
CC fs/proc/proc_net.o
CC fs/autofs/expire.o
AR net/rfkill/built-in.a
CC arch/x86/kernel/idt.o
CC drivers/tty/hvc/hvc_console.o
CC drivers/acpi/acpica/evsci.o
CC security/selinux/netlabel.o
CC fs/9p/vfs_dir.o
CC block/genhd.o
CC fs/ext4/ioctl.o
CC net/sunrpc/auth_gss/gss_krb5_seal.o
AR kernel/futex/built-in.a
CC net/sunrpc/auth_gss/gss_krb5_unseal.o
CC lib/decompress_unzstd.o
CC fs/nfs/read.o
CC [M] sound/core/pcm_timer.o
CC crypto/crypto_null.o
CC net/wireless/radiotap.o
CC drivers/tty/serial/8250/8250_core.o
CC drivers/tty/vt/selection.o
CC arch/x86/kernel/irq.o
AR drivers/tty/ipwireless/built-in.a
CC fs/debugfs/inode.o
CC drivers/tty/vt/keyboard.o
CC net/ethtool/eee.o
CC drivers/acpi/acpica/evxface.o
CC net/dns_resolver/dns_query.o
CC net/netlabel/netlabel_domainhash.o
CC net/netfilter/nf_conntrack_proto_generic.o
CC net/netlabel/netlabel_addrlist.o
CC fs/nfs/symlink.o
CC io_uring/waitid.o
CC lib/dump_stack.o
CC drivers/virtio/virtio_pci_modern_dev.o
CC io_uring/register.o
CC fs/lockd/svcsubs.o
CC fs/proc/kcore.o
CC fs/9p/vfs_dentry.o
CC fs/debugfs/file.o
LD [M] sound/core/snd-hwdep.o
CC drivers/tty/vt/vt.o
CC crypto/md5.o
LD [M] sound/core/snd-pcm.o
AR sound/core/built-in.a
CC fs/autofs/dev-ioctl.o
AR sound/synth/emux/built-in.a
AR sound/synth/built-in.a
AR sound/usb/misc/built-in.a
CC drivers/acpi/acpica/evxfevnt.o
AR sound/usb/usx2y/built-in.a
AR sound/usb/caiaq/built-in.a
AR sound/usb/6fire/built-in.a
CC net/mac80211/driver-ops.o
AR sound/usb/hiface/built-in.a
AR sound/usb/bcd2000/built-in.a
AR sound/usb/built-in.a
AR drivers/tty/hvc/built-in.a
CC fs/nfs/unlink.o
AR sound/firewire/built-in.a
AR sound/sparc/built-in.a
AR sound/spi/built-in.a
AR sound/parisc/built-in.a
CC kernel/time/ntp.o
AR sound/pcmcia/vx/built-in.a
CC drivers/pci/slot.o
AR sound/pcmcia/pdaudiocf/built-in.a
AR sound/pcmcia/built-in.a
CC drivers/char/hw_random/core.o
AR sound/mips/built-in.a
AR sound/soc/built-in.a
CC drivers/pci/pci-acpi.o
AR sound/atmel/built-in.a
CC net/ipv4/inet_timewait_sock.o
AR sound/hda/built-in.a
CC drivers/char/agp/backend.o
CC [M] sound/hda/hda_bus_type.o
CC fs/9p/v9fs.o
CC io_uring/truncate.o
CC drivers/tty/serial/8250/8250_platform.o
AR net/dns_resolver/built-in.a
CC io_uring/memmap.o
CC fs/tracefs/inode.o
CC drivers/acpi/acpica/evxfgpe.o
CC block/ioprio.o
CC net/ipv4/inet_connection_sock.o
CC net/ethtool/tsinfo.o
CC crypto/sha256_generic.o
AR security/selinux/built-in.a
CC lib/earlycpio.o
AR security/built-in.a
CC net/9p/error.o
CC mm/list_lru.o
CC lib/extable.o
CC net/netfilter/nf_conntrack_proto_tcp.o
CC drivers/virtio/virtio_pci_legacy_dev.o
CC kernel/cgroup/cgroup-v1.o
CC net/netlabel/netlabel_mgmt.o
CC [M] fs/efivarfs/inode.o
CC fs/lockd/mon.o
CC drivers/tty/tty_io.o
CC drivers/pci/iomap.o
AR fs/autofs/built-in.a
CC drivers/acpi/utils.o
CC lib/flex_proportions.o
CC fs/proc/vmcore.o
CC drivers/acpi/acpica/evxfregn.o
CC [M] sound/hda/hdac_bus.o
CC drivers/char/agp/generic.o
CC net/9p/protocol.o
CC drivers/char/hw_random/intel-rng.o
CC net/wireless/util.o
CC arch/x86/kernel/irq_32.o
CC kernel/time/clocksource.o
CC drivers/char/agp/isoch.o
CC kernel/time/jiffies.o
CC fs/9p/fid.o
CC net/netfilter/nf_conntrack_proto_udp.o
AR fs/debugfs/built-in.a
CC crypto/sha512_generic.o
CC net/sunrpc/auth_gss/gss_krb5_wrap.o
CC crypto/sha3_generic.o
CC drivers/tty/serial/8250/8250_pnp.o
CC drivers/tty/serial/8250/8250_rsa.o
CC [M] sound/hda/hdac_device.o
CC lib/idr.o
CC net/ethtool/cabletest.o
CC drivers/acpi/acpica/exconcat.o
CC mm/workingset.o
CC drivers/tty/serial/8250/8250_port.o
CC block/badblocks.o
CC fs/tracefs/event_inode.o
CC drivers/virtio/virtio_pci_modern.o
CC [M] fs/efivarfs/file.o
CC net/ipv4/tcp.o
CC lib/irq_regs.o
CC io_uring/io-wq.o
CC net/handshake/alert.o
CC drivers/pci/quirks.o
CC net/ipv6/ip6_input.o
CC drivers/char/hw_random/amd-rng.o
CC net/handshake/genl.o
CC drivers/acpi/acpica/exconfig.o
CC arch/x86/kernel/cpu/topology.o
COPY drivers/tty/vt/defkeymap.c
CC drivers/char/mem.o
AR sound/x86/built-in.a
CC net/sunrpc/auth_gss/gss_krb5_crypto.o
CC net/sunrpc/sched.o
CC net/9p/trans_common.o
CC net/netfilter/nf_conntrack_proto_icmp.o
CC fs/open.o
CC drivers/acpi/reboot.o
CC lib/is_single_threaded.o
CC fs/9p/xattr.o
CC crypto/ecb.o
CC net/wireless/reg.o
CC net/sunrpc/auth_gss/gss_krb5_keys.o
CC kernel/time/timer_list.o
CC fs/proc/kmsg.o
CC fs/lockd/trace.o
CC drivers/char/agp/amd64-agp.o
CC [M] fs/efivarfs/super.o
CC net/netlabel/netlabel_unlabeled.o
CC drivers/acpi/acpica/exconvrt.o
CC kernel/cgroup/freezer.o
CC mm/debug.o
CC fs/nfs/write.o
CC drivers/virtio/virtio_pci_common.o
CC kernel/time/timeconv.o
CC block/blk-rq-qos.o
CC lib/klist.o
CC [M] sound/hda/hdac_sysfs.o
CC [M] sound/hda/hdac_regmap.o
AR fs/tracefs/built-in.a
CC lib/kobject.o
CC drivers/char/hw_random/geode-rng.o
CC net/9p/trans_fd.o
CC drivers/acpi/acpica/excreate.o
CC arch/x86/kernel/cpu/proc.o
CC crypto/cbc.o
CC net/ethtool/tunnels.o
CC drivers/acpi/acpica/exdebug.o
CC drivers/tty/vt/consolemap.o
CC fs/ext4/mballoc.o
CC [M] fs/efivarfs/vars.o
CC fs/proc/page.o
CC [M] sound/hda/hdac_controller.o
CC drivers/char/agp/intel-agp.o
CC kernel/time/timecounter.o
CC net/sunrpc/auth.o
AR fs/9p/built-in.a
CC kernel/cgroup/legacy_freezer.o
CC net/wireless/scan.o
CC net/9p/trans_virtio.o
AR sound/xen/built-in.a
CC fs/lockd/xdr.o
CC kernel/trace/trace_clock.o
CC drivers/tty/n_tty.o
CC kernel/time/alarmtimer.o
CC drivers/tty/serial/serial_core.o
CC net/wireless/nl80211.o
CC drivers/acpi/acpica/exdump.o
CC crypto/ctr.o
CC net/handshake/netlink.o
CC drivers/acpi/acpica/exfield.o
CC drivers/char/hw_random/via-rng.o
CC lib/kobject_uevent.o
CC io_uring/futex.o
CC net/netfilter/nf_conntrack_extend.o
CC block/disk-events.o
CC mm/gup.o
CC kernel/trace/ring_buffer.o
CC arch/x86/kernel/cpu/feat_ctl.o
CC net/ipv6/addrconf.o
CC drivers/tty/serial/8250/8250_dma.o
CC crypto/gcm.o
CC arch/x86/kernel/dumpstack_32.o
AR net/sunrpc/auth_gss/built-in.a
CC drivers/tty/tty_ioctl.o
CC kernel/trace/trace.o
AR sound/virtio/built-in.a
CC kernel/bpf/core.o
CC net/ipv6/addrlabel.o
CC drivers/virtio/virtio_pci_legacy.o
AR fs/proc/built-in.a
CC kernel/cgroup/pids.o
CC drivers/acpi/nvs.o
LD [M] fs/efivarfs/efivarfs.o
CC drivers/acpi/wakeup.o
CC drivers/acpi/acpica/exfldio.o
CC net/sunrpc/auth_null.o
CC net/mac80211/sta_info.o
CC kernel/trace/trace_output.o
CC kernel/trace/trace_seq.o
AR drivers/char/hw_random/built-in.a
CC drivers/char/agp/intel-gtt.o
CC kernel/cgroup/rdma.o
HOSTCC drivers/tty/vt/conmakehash
CC [M] sound/hda/hdac_stream.o
CC net/netlabel/netlabel_cipso_v4.o
CC arch/x86/kernel/cpu/intel.o
CC drivers/tty/vt/defkeymap.o
CC net/ethtool/fec.o
CC arch/x86/kernel/cpu/tsx.o
CC net/core/dst.o
CC drivers/pci/pci-label.o
CONMK drivers/tty/vt/consolemap_deftbl.c
CC drivers/tty/vt/consolemap_deftbl.o
AR drivers/tty/vt/built-in.a
CC lib/logic_pio.o
CC fs/ext4/migrate.o
CC fs/lockd/clnt4xdr.o
CC block/blk-ia-ranges.o
CC block/early-lookup.o
CC drivers/acpi/acpica/exmisc.o
CC drivers/virtio/virtio_pci_admin_legacy_io.o
CC kernel/time/posix-timers.o
AR net/9p/built-in.a
CC io_uring/napi.o
CC kernel/events/core.o
CC net/devres.o
CC kernel/fork.o
CC drivers/tty/serial/8250/8250_dwlib.o
AR drivers/iommu/amd/built-in.a
AR drivers/iommu/intel/built-in.a
CC sound/sound_core.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/iommu/iommufd/built-in.a
CC net/handshake/request.o
CC drivers/iommu/iommu.o
CC mm/mmap_lock.o
CC net/netfilter/nf_conntrack_acct.o
CC drivers/char/random.o
CC kernel/cgroup/cpuset.o
CC crypto/ccm.o
CC drivers/iommu/iommu-traces.o
CC drivers/acpi/acpica/exmutex.o
CC [M] sound/hda/array.o
CC net/netlabel/netlabel_calipso.o
CC kernel/exec_domain.o
CC drivers/pci/vgaarb.o
CC lib/maple_tree.o
AR drivers/char/agp/built-in.a
CC net/mac80211/wep.o
CC arch/x86/kernel/time.o
CC drivers/virtio/virtio_input.o
CC drivers/tty/serial/serial_base_bus.o
CC block/bounce.o
CC arch/x86/kernel/cpu/intel_epb.o
CC drivers/acpi/acpica/exnames.o
CC net/ethtool/eeprom.o
CC drivers/tty/serial/8250/8250_pcilib.o
CC arch/x86/kernel/cpu/amd.o
CC kernel/panic.o
CC fs/nfs/namespace.o
CC net/core/netevent.o
CC fs/lockd/xdr4.o
CC net/handshake/tlshd.o
CC drivers/char/misc.o
CC net/ipv6/route.o
CC drivers/virtio/virtio_dma_buf.o
CC [M] sound/hda/hdmi_chmap.o
CC net/sunrpc/auth_tls.o
CC mm/highmem.o
CC drivers/acpi/acpica/exoparg1.o
CC crypto/aes_generic.o
CC kernel/trace/trace_stat.o
CC net/wireless/mlme.o
CC net/wireless/ibss.o
CC kernel/time/posix-cpu-timers.o
CC drivers/tty/serial/serial_ctrl.o
CC net/netfilter/nf_conntrack_seqadj.o
CC sound/last.o
CC fs/lockd/svc4proc.o
AR io_uring/built-in.a
CC arch/x86/kernel/ioport.o
CC net/ipv4/tcp_input.o
CC net/handshake/trace.o
CC drivers/tty/serial/8250/8250_early.o
CC drivers/char/virtio_console.o
AR net/netlabel/built-in.a
CC net/core/neighbour.o
CC [M] sound/hda/trace.o
AR drivers/pci/built-in.a
AR drivers/gpu/host1x/built-in.a
CC drivers/acpi/acpica/exoparg2.o
CC net/ipv6/ip6_fib.o
AR drivers/virtio/built-in.a
CC kernel/cpu.o
CC net/netfilter/nf_conntrack_proto_icmpv6.o
CC arch/x86/kernel/dumpstack.o
CC arch/x86/kernel/cpu/hygon.o
CC net/ipv4/tcp_output.o
AR drivers/gpu/drm/tests/built-in.a
AR drivers/gpu/drm/arm/built-in.a
CC block/bsg.o
CC net/ethtool/stats.o
CC block/blk-cgroup.o
CC drivers/gpu/drm/display/drm_display_helper_mod.o
CC kernel/events/ring_buffer.o
CC crypto/crc32c_generic.o
AR kernel/bpf/built-in.a
CC drivers/tty/tty_ldisc.o
CC lib/memcat_p.o
CC lib/nmi_backtrace.o
CC kernel/trace/trace_printk.o
CC drivers/iommu/iommu-sysfs.o
CC fs/nfs/mount_clnt.o
CC mm/memory.o
CC drivers/acpi/acpica/exoparg3.o
CC net/socket.o
CC net/wireless/sme.o
CC drivers/gpu/drm/display/drm_dp_dual_mode_helper.o
CC drivers/acpi/sleep.o
CC drivers/char/hpet.o
CC arch/x86/kernel/cpu/centaur.o
CC drivers/tty/serial/8250/8250_exar.o
CC crypto/authenc.o
CC kernel/cgroup/misc.o
CC drivers/connector/cn_queue.o
CC kernel/cgroup/debug.o
CC drivers/acpi/acpica/exoparg6.o
CC fs/lockd/procfs.o
CC drivers/connector/connector.o
CC kernel/time/posix-clock.o
CC [M] sound/hda/hdac_component.o
CC kernel/trace/pid_list.o
CC kernel/time/itimer.o
CC lib/objpool.o
CC net/core/rtnetlink.o
CC arch/x86/kernel/cpu/transmeta.o
CC drivers/iommu/dma-iommu.o
CC net/ipv6/ipv6_sockglue.o
AR drivers/gpu/vga/built-in.a
CC drivers/acpi/acpica/exprep.o
CC net/mac80211/aead_api.o
CC drivers/gpu/drm/ttm/ttm_tt.o
CC net/ethtool/phc_vclocks.o
CC drivers/gpu/drm/i915/i915_config.o
CC net/netfilter/nf_conntrack_netlink.o
AR net/handshake/built-in.a
AR drivers/gpu/drm/renesas/rcar-du/built-in.a
CC drivers/gpu/drm/display/drm_dp_helper.o
AR drivers/gpu/drm/renesas/rz-du/built-in.a
AR drivers/gpu/drm/renesas/built-in.a
CC lib/plist.o
CC net/sunrpc/auth_unix.o
CC fs/read_write.o
CC fs/nfs/nfstrace.o
CC net/sysctl_net.o
CC kernel/events/callchain.o
CC fs/file_table.o
AR kernel/cgroup/built-in.a
CC drivers/gpu/drm/i915/i915_driver.o
CC drivers/acpi/acpica/exregion.o
AR fs/lockd/built-in.a
CC drivers/char/nvram.o
CC drivers/base/power/sysfs.o
CC [M] sound/hda/hdac_i915.o
CC fs/ext4/mmp.o
CC drivers/tty/serial/8250/8250_lpss.o
CC drivers/base/firmware_loader/builtin/main.o
CC drivers/gpu/drm/display/drm_dp_mst_topology.o
CC arch/x86/kernel/cpu/zhaoxin.o
CC block/blk-ioprio.o
CC net/ipv4/tcp_timer.o
CC kernel/trace/trace_sched_switch.o
CC net/netfilter/nf_conntrack_ftp.o
CC crypto/authencesn.o
CC drivers/base/firmware_loader/main.o
CC drivers/tty/serial/8250/8250_mid.o
CC drivers/connector/cn_proc.o
CC net/mac80211/wpa.o
CC drivers/acpi/acpica/exresnte.o
CC kernel/time/clockevents.o
CC drivers/gpu/drm/ttm/ttm_bo.o
AR drivers/base/firmware_loader/builtin/built-in.a
CC drivers/acpi/device_sysfs.o
CC arch/x86/kernel/cpu/vortex.o
CC block/blk-iolatency.o
CC drivers/base/power/generic_ops.o
CC net/ethtool/mm.o
AR drivers/gpu/drm/omapdrm/built-in.a
CC drivers/tty/serial/serial_port.o
CC [M] sound/hda/intel-dsp-config.o
CC net/mac80211/scan.o
CC drivers/acpi/acpica/exresolv.o
CC net/core/utils.o
AR drivers/char/built-in.a
CC fs/ext4/move_extent.o
CC kernel/trace/trace_nop.o
CC drivers/acpi/device_pm.o
CC arch/x86/kernel/cpu/perfctr-watchdog.o
CC net/ipv6/ndisc.o
CC net/mac80211/offchannel.o
CC drivers/iommu/iova.o
CC mm/mincore.o
CC kernel/time/tick-common.o
CC arch/x86/kernel/nmi.o
CC drivers/base/power/common.o
CC arch/x86/kernel/cpu/vmware.o
CC drivers/tty/serial/8250/8250_pci.o
CC drivers/acpi/acpica/exresop.o
CC crypto/lzo.o
CC crypto/lzo-rle.o
CC drivers/acpi/acpica/exserial.o
AR drivers/base/firmware_loader/built-in.a
CC arch/x86/kernel/cpu/hypervisor.o
CC drivers/gpu/drm/ttm/ttm_bo_util.o
CC [M] sound/hda/intel-nhlt.o
CC net/sunrpc/svc.o
AR drivers/connector/built-in.a
CC net/sunrpc/svcsock.o
CC block/blk-iocost.o
CC drivers/base/regmap/regmap.o
CC fs/super.o
CC net/sunrpc/svcauth.o
CC kernel/exit.o
CC drivers/acpi/acpica/exstore.o
CC fs/ext4/namei.o
CC fs/ext4/page-io.o
AR drivers/base/test/built-in.a
CC drivers/base/power/qos.o
CC mm/mlock.o
CC drivers/gpu/drm/i915/i915_drm_client.o
CC kernel/trace/blktrace.o
CC drivers/base/regmap/regcache.o
CC net/ethtool/module.o
CC fs/ext4/readpage.o
CC arch/x86/kernel/cpu/mshyperv.o
CC fs/ext4/resize.o
CC fs/ext4/super.o
AR drivers/iommu/built-in.a
CC lib/radix-tree.o
CC arch/x86/kernel/ldt.o
CC crypto/rng.o
CC drivers/tty/serial/8250/8250_pericom.o
CC drivers/acpi/proc.o
CC net/wireless/chan.o
CC net/ethtool/cmis_fw_update.o
CC [M] sound/hda/intel-sdw-acpi.o
CC net/netfilter/nf_conntrack_irc.o
CC drivers/acpi/acpica/exstoren.o
CC arch/x86/kernel/cpu/debugfs.o
CC fs/nfs/export.o
CC lib/ratelimit.o
CC fs/nfs/sysfs.o
CC kernel/time/tick-broadcast.o
CC drivers/gpu/drm/ttm/ttm_bo_vm.o
CC kernel/time/tick-broadcast-hrtimer.o
CC drivers/acpi/acpica/exstorob.o
CC drivers/tty/serial/earlycon.o
CC net/sunrpc/svcauth_unix.o
CC drivers/tty/tty_buffer.o
LD [M] sound/hda/snd-hda-core.o
LD [M] sound/hda/snd-intel-dspcfg.o
LD [M] sound/hda/snd-intel-sdw-acpi.o
AR sound/built-in.a
CC drivers/gpu/drm/display/drm_dsc_helper.o
CC drivers/base/regmap/regcache-rbtree.o
CC net/netfilter/nf_conntrack_sip.o
CC kernel/time/tick-oneshot.o
CC net/ipv4/tcp_ipv4.o
AR drivers/tty/serial/8250/built-in.a
CC arch/x86/kernel/setup.o
CC drivers/acpi/acpica/exsystem.o
CC block/mq-deadline.o
CC arch/x86/kernel/cpu/capflags.o
CC drivers/acpi/acpica/extrace.o
AR arch/x86/kernel/cpu/built-in.a
CC net/ethtool/cmis_cdb.o
CC crypto/drbg.o
CC kernel/events/hw_breakpoint.o
AR drivers/gpu/drm/tilcdc/built-in.a
CC lib/rbtree.o
CC drivers/block/loop.o
CC drivers/acpi/bus.o
CC drivers/base/power/runtime.o
CC crypto/jitterentropy.o
CC drivers/gpu/drm/i915/i915_getparam.o
CC mm/mmap.o
CC crypto/jitterentropy-kcapi.o
CC fs/ext4/symlink.o
CC drivers/gpu/drm/virtio/virtgpu_drv.o
CC net/mac80211/ht.o
CC net/ipv6/udp.o
CC kernel/time/tick-sched.o
CC net/core/link_watch.o
CC drivers/base/regmap/regcache-flat.o
CC drivers/gpu/drm/ttm/ttm_module.o
AR drivers/tty/serial/built-in.a
CC drivers/acpi/acpica/exutils.o
CC drivers/acpi/acpica/hwacpi.o
CC drivers/gpu/drm/virtio/virtgpu_kms.o
CC lib/seq_buf.o
CC net/ipv6/udplite.o
CC kernel/time/timer_migration.o
CC drivers/tty/tty_port.o
CC drivers/gpu/drm/display/drm_hdcp_helper.o
CC kernel/trace/trace_events.o
CC drivers/acpi/glue.o
CC net/mac80211/agg-tx.o
CC drivers/base/power/wakeirq.o
CC drivers/acpi/acpica/hwesleep.o
CC net/wireless/ethtool.o
CC net/mac80211/agg-rx.o
CC fs/ext4/sysfs.o
CC drivers/gpu/drm/ttm/ttm_execbuf_util.o
CC crypto/ghash-generic.o
CC fs/nfs/fs_context.o
CC net/mac80211/vht.o
CC drivers/tty/tty_mutex.o
CC fs/char_dev.o
CC arch/x86/kernel/x86_init.o
CC net/sunrpc/addr.o
CC lib/siphash.o
CC drivers/gpu/drm/i915/i915_ioctl.o
CC fs/stat.o
CC fs/exec.o
CC net/ethtool/pse-pd.o
CC drivers/acpi/acpica/hwgpe.o
CC kernel/events/uprobes.o
CC fs/pipe.o
CC drivers/gpu/drm/virtio/virtgpu_gem.o
AR drivers/gpu/drm/imx/built-in.a
CC kernel/time/vsyscall.o
CC lib/string.o
CC block/kyber-iosched.o
CC drivers/base/power/main.o
CC drivers/gpu/drm/display/drm_hdmi_helper.o
CC net/netfilter/nf_nat_core.o
CC drivers/base/regmap/regcache-maple.o
CC crypto/hash_info.o
CC drivers/base/regmap/regmap-debugfs.o
CC net/core/filter.o
CC fs/namei.o
CC fs/nfs/nfsroot.o
CC crypto/rsapubkey.asn1.o
CC crypto/rsaprivkey.asn1.o
CC net/ethtool/plca.o
CC drivers/gpu/drm/ttm/ttm_range_manager.o
AR crypto/built-in.a
CC drivers/block/virtio_blk.o
CC lib/timerqueue.o
CC kernel/trace/trace_export.o
CC drivers/tty/tty_ldsem.o
CC kernel/time/timekeeping_debug.o
CC drivers/acpi/acpica/hwregs.o
CC drivers/gpu/drm/display/drm_scdc_helper.o
AR drivers/gpu/drm/i2c/built-in.a
AR drivers/misc/eeprom/built-in.a
AR drivers/misc/cb710/built-in.a
AR drivers/misc/ti-st/built-in.a
CC lib/union_find.o
AR drivers/misc/lis3lv02d/built-in.a
AR drivers/misc/cardreader/built-in.a
CC drivers/gpu/drm/i915/i915_irq.o
AR drivers/misc/keba/built-in.a
AR drivers/misc/built-in.a
CC lib/vsprintf.o
CC kernel/softirq.o
CC net/mac80211/he.o
CC arch/x86/kernel/i8259.o
CC arch/x86/kernel/irqinit.o
CC kernel/trace/trace_event_perf.o
CC mm/mmu_gather.o
CC drivers/gpu/drm/virtio/virtgpu_vram.o
CC drivers/base/power/wakeup.o
CC block/blk-mq-pci.o
CC drivers/acpi/acpica/hwsleep.o
CC drivers/gpu/drm/ttm/ttm_resource.o
CC net/ethtool/phy.o
CC drivers/gpu/drm/ttm/ttm_pool.o
CC drivers/base/component.o
AR drivers/base/regmap/built-in.a
CC drivers/tty/tty_baudrate.o
CC fs/fcntl.o
CC net/core/sock_diag.o
CC kernel/time/namespace.o
CC net/ipv6/raw.o
AR drivers/mfd/built-in.a
AR drivers/nfc/built-in.a
CC net/wireless/mesh.o
CC net/ipv6/icmp.o
CC lib/win_minmax.o
CC net/sunrpc/rpcb_clnt.o
CC fs/ioctl.o
AR drivers/gpu/drm/display/built-in.a
CC net/wireless/ap.o
CC fs/readdir.o
CC drivers/acpi/acpica/hwvalid.o
CC net/mac80211/s1g.o
CC drivers/base/power/wakeup_stats.o
CC drivers/base/power/trace.o
CC arch/x86/kernel/jump_label.o
CC net/sunrpc/timer.o
CC mm/mprotect.o
CC drivers/gpu/drm/virtio/virtgpu_display.o
AR drivers/dax/hmem/built-in.a
CC net/wireless/trace.o
AR drivers/dax/built-in.a
CC net/ipv4/tcp_minisocks.o
CC net/wireless/ocb.o
AR drivers/block/built-in.a
CC drivers/acpi/scan.o
CC net/wireless/pmsr.o
CC block/blk-mq-virtio.o
CC drivers/acpi/acpica/hwxface.o
AR kernel/events/built-in.a
CC net/core/dev_ioctl.o
CC drivers/tty/tty_jobctrl.o
CC kernel/trace/trace_events_filter.o
CC kernel/trace/trace_events_trigger.o
CC net/netfilter/nf_nat_proto.o
CC drivers/gpu/drm/ttm/ttm_device.o
CC net/ipv6/mcast.o
CC drivers/gpu/drm/i915/i915_mitigations.o
CC fs/select.o
AR kernel/time/built-in.a
CC net/netfilter/nf_nat_helper.o
CC net/core/tso.o
CC lib/xarray.o
CC drivers/base/core.o
CC drivers/acpi/acpica/hwxfsleep.o
AR net/ethtool/built-in.a
GEN net/wireless/shipped-certs.c
CC fs/nfs/sysctl.o
CC net/ipv4/tcp_cong.o
CC drivers/tty/n_null.o
CC drivers/tty/pty.o
CC arch/x86/kernel/irq_work.o
CC drivers/tty/tty_audit.o
CC fs/dcache.o
CC kernel/resource.o
CC drivers/acpi/mipi-disco-img.o
AR drivers/base/power/built-in.a
CC drivers/acpi/resource.o
CC net/netfilter/nf_nat_masquerade.o
CC drivers/gpu/drm/virtio/virtgpu_vq.o
CC net/netfilter/nf_nat_ftp.o
CC net/sunrpc/xdr.o
CC block/blk-mq-debugfs.o
CC mm/mremap.o
CC drivers/acpi/acpica/hwpci.o
CC fs/ext4/xattr.o
CC kernel/trace/trace_eprobe.o
CC drivers/gpu/drm/ttm/ttm_sys_manager.o
CC mm/msync.o
CC drivers/tty/sysrq.o
CC net/ipv4/tcp_metrics.o
CC drivers/gpu/drm/i915/i915_module.o
CC drivers/acpi/acpica/nsaccess.o
CC arch/x86/kernel/probe_roms.o
CC net/core/sock_reuseport.o
CC drivers/gpu/drm/virtio/virtgpu_fence.o
CC net/core/fib_notifier.o
CC drivers/dma-buf/dma-buf.o
AR drivers/cxl/core/built-in.a
AR drivers/cxl/built-in.a
CC net/netfilter/nf_nat_irc.o
CC kernel/sysctl.o
CC drivers/dma-buf/dma-fence.o
CC fs/nfs/nfs3super.o
CC drivers/gpu/drm/ttm/ttm_agp_backend.o
CC drivers/dma-buf/dma-fence-array.o
CC block/blk-pm.o
CC net/ipv4/tcp_fastopen.o
CC drivers/macintosh/mac_hid.o
AR drivers/scsi/pcmcia/built-in.a
CC drivers/scsi/scsi.o
CC drivers/acpi/acpica/nsalloc.o
CC lib/lockref.o
CC block/holder.o
CC net/netfilter/nf_nat_sip.o
CC net/core/xdp.o
CC drivers/gpu/drm/i915/i915_params.o
CC fs/nfs/nfs3client.o
CC drivers/gpu/drm/virtio/virtgpu_object.o
AR drivers/nvme/common/built-in.a
CC drivers/ata/libata-core.o
AR drivers/nvme/host/built-in.a
AR drivers/nvme/target/built-in.a
AR drivers/nvme/built-in.a
CC kernel/trace/trace_kprobe.o
AR drivers/net/phy/qcom/built-in.a
CC drivers/net/phy/mdio-boardinfo.o
CC mm/page_vma_mapped.o
CC lib/bcd.o
CC lib/sort.o
AR drivers/net/pse-pd/built-in.a
CC drivers/acpi/acpica/nsarguments.o
CC arch/x86/kernel/sys_ia32.o
CC net/ipv4/tcp_rate.o
CC lib/parser.o
CC drivers/ata/libata-scsi.o
CC net/ipv6/reassembly.o
AR drivers/tty/built-in.a
AR drivers/gpu/drm/ttm/built-in.a
CC net/wireless/shipped-certs.o
CC drivers/scsi/hosts.o
AR drivers/macintosh/built-in.a
CC drivers/base/bus.o
CC net/sunrpc/sunrpc_syms.o
CC net/sunrpc/cache.o
CC fs/inode.o
CC drivers/net/phy/stubs.o
CC fs/nfs/nfs3proc.o
CC net/mac80211/ibss.o
CC mm/pagewalk.o
AR block/built-in.a
CC drivers/acpi/acpica/nsconvert.o
CC arch/x86/kernel/ksysfs.o
CC fs/ext4/xattr_hurd.o
CC drivers/net/mdio/acpi_mdio.o
AR drivers/net/pcs/built-in.a
CC drivers/ata/libata-eh.o
CC fs/nfs/nfs3xdr.o
CC lib/debug_locks.o
CC fs/attr.o
CC drivers/scsi/scsi_ioctl.o
CC drivers/gpu/drm/virtio/virtgpu_debugfs.o
CC drivers/acpi/acpi_processor.o
CC net/sunrpc/rpc_pipe.o
CC lib/random32.o
CC drivers/dma-buf/dma-fence-chain.o
CC drivers/base/dd.o
CC drivers/gpu/drm/i915/i915_pci.o
CC drivers/net/mdio/fwnode_mdio.o
CC drivers/ata/libata-transport.o
CC drivers/acpi/acpica/nsdump.o
CC net/core/flow_offload.o
CC net/ipv6/tcp_ipv6.o
CC fs/ext4/xattr_trusted.o
CC net/netfilter/x_tables.o
AR drivers/net/ethernet/3com/built-in.a
CC drivers/net/phy/mdio_devres.o
CC drivers/net/ethernet/8390/ne2k-pci.o
CC lib/bust_spinlocks.o
CC drivers/base/syscore.o
AR drivers/net/wireless/admtek/built-in.a
AR drivers/net/wireless/ath/built-in.a
AR drivers/net/wireless/atmel/built-in.a
AR drivers/net/usb/built-in.a
AR drivers/net/wireless/broadcom/built-in.a
CC arch/x86/kernel/bootflag.o
AR drivers/net/wireless/intel/built-in.a
CC drivers/firewire/init_ohci1394_dma.o
CC drivers/cdrom/cdrom.o
AR drivers/auxdisplay/built-in.a
AR drivers/net/wireless/intersil/built-in.a
CC net/core/gro.o
AR drivers/net/wireless/marvell/built-in.a
CC drivers/acpi/processor_core.o
AR drivers/net/wireless/mediatek/built-in.a
CC net/mac80211/iface.o
CC drivers/base/driver.o
AR drivers/net/wireless/microchip/built-in.a
AR drivers/net/wireless/purelifi/built-in.a
AR drivers/net/wireless/quantenna/built-in.a
CC drivers/acpi/acpica/nseval.o
CC lib/kasprintf.o
AR drivers/net/wireless/ralink/built-in.a
AR drivers/net/wireless/realtek/built-in.a
AR drivers/net/wireless/rsi/built-in.a
CC mm/pgtable-generic.o
AR drivers/net/wireless/silabs/built-in.a
CC drivers/ata/libata-trace.o
AR drivers/net/wireless/st/built-in.a
AR drivers/net/wireless/ti/built-in.a
AR drivers/net/wireless/zydas/built-in.a
CC net/ipv4/tcp_recovery.o
CC fs/ext4/xattr_user.o
AR drivers/net/wireless/virtual/built-in.a
AR drivers/net/wireless/built-in.a
CC drivers/gpu/drm/virtio/virtgpu_plane.o
CC drivers/gpu/drm/virtio/virtgpu_ioctl.o
CC net/netfilter/xt_tcpudp.o
CC drivers/dma-buf/dma-fence-unwrap.o
CC drivers/acpi/processor_pdc.o
CC drivers/scsi/scsicam.o
CC kernel/capability.o
CC arch/x86/kernel/e820.o
CC drivers/acpi/acpica/nsinit.o
CC drivers/base/class.o
CC mm/rmap.o
CC drivers/gpu/drm/i915/i915_scatterlist.o
CC drivers/gpu/drm/i915/i915_suspend.o
CC drivers/net/mii.o
AR drivers/net/mdio/built-in.a
CC lib/bitmap.o
CC kernel/trace/error_report-traces.o
CC net/core/netdev-genl.o
CC net/ipv4/tcp_ulp.o
CC drivers/dma-buf/dma-resv.o
CC net/netfilter/xt_CONNSECMARK.o
AR drivers/firewire/built-in.a
CC drivers/net/phy/phy.o
CC fs/ext4/fast_commit.o
AR drivers/gpu/drm/panel/built-in.a
CC drivers/net/loopback.o
CC drivers/net/ethernet/8390/8390.o
CC drivers/acpi/ec.o
CC net/mac80211/link.o
CC net/sunrpc/sysfs.o
CC drivers/net/phy/phy-c45.o
CC net/sunrpc/svc_xprt.o
CC net/sunrpc/xprtmultipath.o
CC drivers/acpi/acpica/nsload.o
CC arch/x86/kernel/pci-dma.o
CC drivers/gpu/drm/i915/i915_switcheroo.o
CC drivers/net/netconsole.o
CC drivers/scsi/scsi_error.o
CC net/ipv4/tcp_offload.o
CC drivers/gpu/drm/virtio/virtgpu_prime.o
CC net/mac80211/rate.o
CC fs/bad_inode.o
CC drivers/net/phy/phy-core.o
CC drivers/base/platform.o
CC drivers/pcmcia/cs.o
CC drivers/acpi/acpica/nsnames.o
CC drivers/acpi/acpica/nsobject.o
CC kernel/trace/power-traces.o
CC lib/scatterlist.o
CC drivers/usb/common/common.o
CC drivers/pcmcia/socket_sysfs.o
CC drivers/dma-buf/sync_file.o
CC drivers/net/phy/phy_device.o
CC drivers/net/virtio_net.o
CC arch/x86/kernel/quirks.o
CC fs/ext4/orphan.o
CC drivers/scsi/scsi_lib.o
CC drivers/base/cpu.o
CC drivers/gpu/drm/virtio/virtgpu_trace_points.o
CC net/ipv4/tcp_plb.o
CC drivers/acpi/acpica/nsparse.o
CC net/netfilter/xt_NFLOG.o
CC drivers/net/phy/linkmode.o
AR drivers/cdrom/built-in.a
CC drivers/usb/common/debug.o
CC drivers/acpi/dock.o
CC drivers/usb/core/usb.o
AR drivers/gpu/drm/bridge/analogix/built-in.a
AR drivers/net/ethernet/8390/built-in.a
AR drivers/gpu/drm/bridge/cadence/built-in.a
AR drivers/gpu/drm/bridge/imx/built-in.a
AR drivers/net/ethernet/adaptec/built-in.a
CC fs/nfs/nfs3acl.o
AR drivers/gpu/drm/bridge/synopsys/built-in.a
AR drivers/net/ethernet/agere/built-in.a
AR drivers/gpu/drm/bridge/built-in.a
AR drivers/gpu/drm/hisilicon/built-in.a
AR drivers/net/ethernet/alacritech/built-in.a
CC lib/list_sort.o
CC net/ipv6/ping.o
AR drivers/net/ethernet/alteon/built-in.a
AR drivers/net/ethernet/amazon/built-in.a
AR drivers/net/ethernet/amd/built-in.a
AR drivers/net/ethernet/aquantia/built-in.a
AR drivers/net/ethernet/arc/built-in.a
AR drivers/net/ethernet/asix/built-in.a
CC drivers/gpu/drm/i915/i915_sysfs.o
AR drivers/net/ethernet/atheros/built-in.a
AR drivers/net/ethernet/cadence/built-in.a
CC drivers/pcmcia/cardbus.o
CC drivers/net/ethernet/broadcom/bnx2.o
CC kernel/ptrace.o
CC fs/nfs/nfs4proc.o
CC drivers/gpu/drm/virtio/virtgpu_submit.o
CC drivers/acpi/acpica/nspredef.o
CC drivers/usb/core/hub.o
AR drivers/dma-buf/built-in.a
CC lib/uuid.o
AR drivers/gpu/drm/mxsfb/built-in.a
CC drivers/scsi/constants.o
CC kernel/trace/rpm-traces.o
AR drivers/usb/common/built-in.a
CC drivers/acpi/acpica/nsprepkg.o
AR drivers/net/ethernet/brocade/built-in.a
CC drivers/usb/core/hcd.o
CC drivers/gpu/drm/i915/i915_utils.o
AR drivers/gpu/drm/tiny/built-in.a
CC net/netfilter/xt_SECMARK.o
AR drivers/gpu/drm/xlnx/built-in.a
CC fs/ext4/acl.o
CC net/core/netdev-genl-gen.o
CC mm/vmalloc.o
CC lib/iov_iter.o
AR drivers/usb/phy/built-in.a
CC fs/file.o
CC kernel/trace/trace_dynevent.o
CC drivers/usb/core/urb.o
CC net/core/gso.o
CC drivers/ata/libata-sata.o
CC arch/x86/kernel/kdebugfs.o
AR drivers/gpu/drm/gud/built-in.a
CC drivers/gpu/drm/i915/intel_clock_gating.o
CC net/mac80211/michael.o
CC drivers/base/firmware.o
CC net/sunrpc/stats.o
CC drivers/usb/core/message.o
CC kernel/trace/trace_probe.o
CC drivers/usb/mon/mon_main.o
AR drivers/net/ethernet/cavium/common/built-in.a
CC drivers/acpi/acpica/nsrepair.o
AR drivers/net/ethernet/cavium/thunder/built-in.a
AR drivers/net/ethernet/cavium/liquidio/built-in.a
AR drivers/net/ethernet/cavium/octeon/built-in.a
CC net/mac80211/tkip.o
AR drivers/net/ethernet/cavium/built-in.a
CC drivers/pcmcia/ds.o
CC drivers/pcmcia/pcmcia_resource.o
CC drivers/usb/core/driver.o
CC drivers/net/phy/phy_link_topology.o
CC net/core/net-sysfs.o
CC drivers/net/ethernet/broadcom/tg3.o
CC net/ipv4/datagram.o
CC drivers/base/init.o
AR drivers/gpu/drm/virtio/built-in.a
CC fs/nfs/nfs4xdr.o
CC kernel/trace/trace_uprobe.o
CC drivers/acpi/acpica/nsrepair2.o
CC net/ipv6/exthdrs.o
CC arch/x86/kernel/alternative.o
CC drivers/ata/libata-sff.o
CC drivers/usb/host/pci-quirks.o
CC net/netfilter/xt_TCPMSS.o
CC net/mac80211/aes_cmac.o
AR drivers/gpu/drm/solomon/built-in.a
CC net/sunrpc/sysctl.o
CC [M] drivers/gpu/drm/scheduler/sched_main.o
CC drivers/base/map.o
CC arch/x86/kernel/i8253.o
HOSTCC drivers/gpu/drm/xe/xe_gen_wa_oob
CC drivers/input/serio/serio.o
CC drivers/usb/mon/mon_stat.o
GEN xe_wa_oob.c xe_wa_oob.h
CC [M] drivers/gpu/drm/xe/xe_bb.o
CC fs/ext4/xattr_security.o
CC drivers/input/serio/i8042.o
CC drivers/input/serio/serport.o
CC drivers/scsi/scsi_lib_dma.o
CC fs/filesystems.o
CC drivers/acpi/acpica/nssearch.o
AR drivers/net/ethernet/chelsio/built-in.a
CC drivers/gpu/drm/i915/intel_device_info.o
CC drivers/net/phy/mdio_bus.o
CC fs/namespace.o
CC mm/vma.o
CC drivers/base/devres.o
CC drivers/pcmcia/cistpl.o
CC drivers/gpu/drm/i915/intel_memory_region.o
CC drivers/usb/mon/mon_text.o
CC kernel/user.o
CC drivers/scsi/scsi_scan.o
CC net/netfilter/xt_conntrack.o
CC fs/nfs/nfs4state.o
CC net/netfilter/xt_policy.o
CC mm/process_vm_access.o
CC drivers/acpi/acpica/nsutils.o
CC drivers/usb/host/ehci-hcd.o
CC drivers/input/serio/libps2.o
CC net/ipv4/raw.o
CC drivers/gpu/drm/drm_atomic.o
CC drivers/acpi/pci_root.o
CC [M] drivers/gpu/drm/xe/xe_bo.o
CC drivers/ata/libata-pmp.o
CC drivers/usb/mon/mon_bin.o
CC drivers/usb/class/usblp.o
AR fs/ext4/built-in.a
CC drivers/usb/storage/scsiglue.o
CC drivers/usb/storage/protocol.o
AR drivers/usb/misc/built-in.a
CC drivers/usb/early/ehci-dbgp.o
CC drivers/net/phy/mdio_device.o
CC drivers/usb/storage/transport.o
CC drivers/net/net_failover.o
CC drivers/acpi/acpica/nswalk.o
CC [M] drivers/gpu/drm/scheduler/sched_fence.o
CC arch/x86/kernel/hw_breakpoint.o
CC lib/clz_ctz.o
CC drivers/base/attribute_container.o
CC lib/bsearch.o
CC mm/page_alloc.o
CC drivers/gpu/drm/drm_atomic_uapi.o
CC drivers/acpi/pci_link.o
CC net/mac80211/aes_gmac.o
CC net/netfilter/xt_state.o
AR drivers/input/serio/built-in.a
CC net/ipv6/datagram.o
CC net/core/hotdata.o
CC drivers/usb/storage/usb.o
CC drivers/acpi/acpica/nsxfeval.o
CC drivers/gpu/drm/i915/intel_pcode.o
CC kernel/trace/rethook.o
AR net/sunrpc/built-in.a
CC [M] net/netfilter/nf_log_syslog.o
CC drivers/usb/core/config.o
CC [M] drivers/gpu/drm/scheduler/sched_entity.o
CC [M] drivers/gpu/drm/xe/xe_bo_evict.o
AR drivers/net/ethernet/cisco/built-in.a
AR drivers/net/ethernet/cortina/built-in.a
CC kernel/signal.o
CC net/ipv4/udp.o
GEN drivers/scsi/scsi_devinfo_tbl.c
CC drivers/base/transport_class.o
CC drivers/scsi/scsi_devinfo.o
CC drivers/acpi/acpica/nsxfname.o
CC mm/init-mm.o
CC drivers/ata/libata-acpi.o
CC drivers/net/phy/swphy.o
CC arch/x86/kernel/tsc.o
AR drivers/usb/class/built-in.a
CC kernel/sys.o
AR drivers/usb/early/built-in.a
CC drivers/pcmcia/pcmcia_cis.o
CC arch/x86/kernel/tsc_msr.o
CC fs/seq_file.o
CC lib/find_bit.o
CC net/core/netdev_rx_queue.o
CC net/mac80211/fils_aead.o
CC drivers/base/topology.o
AR drivers/usb/mon/built-in.a
CC drivers/usb/core/file.o
CC drivers/input/keyboard/atkbd.o
CC drivers/base/container.o
CC drivers/input/mouse/psmouse-base.o
AR drivers/input/joystick/built-in.a
CC drivers/ata/libata-pata-timings.o
CC drivers/usb/host/ehci-pci.o
CC lib/llist.o
CC drivers/acpi/acpica/nsxfobj.o
AR kernel/trace/built-in.a
CC drivers/net/phy/fixed_phy.o
CC [M] net/netfilter/xt_mark.o
CC mm/memblock.o
CC lib/lwq.o
CC arch/x86/kernel/io_delay.o
LD [M] drivers/gpu/drm/scheduler/gpu-sched.o
CC drivers/usb/storage/initializers.o
CC drivers/gpu/drm/i915/intel_region_ttm.o
CC drivers/rtc/lib.o
CC net/ipv6/ip6_flowlabel.o
CC drivers/acpi/acpica/psargs.o
CC drivers/gpu/drm/drm_auth.o
CC drivers/rtc/class.o
CC net/mac80211/cfg.o
CC drivers/rtc/interface.o
CC drivers/ata/ahci.o
CC lib/memweight.o
CC mm/slub.o
CC drivers/scsi/scsi_sysctl.o
CC arch/x86/kernel/rtc.o
CC lib/kfifo.o
CC drivers/base/property.o
CC fs/nfs/nfs4renewd.o
CC drivers/net/phy/realtek.o
CC [M] drivers/gpu/drm/xe/xe_devcoredump.o
CC [M] drivers/gpu/drm/xe/xe_device.o
CC drivers/rtc/nvmem.o
CC drivers/usb/core/buffer.o
CC net/core/net-procfs.o
CC drivers/pcmcia/rsrc_mgr.o
AR drivers/net/ethernet/dec/tulip/built-in.a
CC lib/percpu-refcount.o
AR drivers/net/ethernet/dec/built-in.a
AR drivers/net/ethernet/dlink/built-in.a
AR drivers/net/ethernet/emulex/built-in.a
CC mm/madvise.o
CC drivers/input/mouse/synaptics.o
AR drivers/net/ethernet/engleder/built-in.a
CC drivers/scsi/scsi_proc.o
CC drivers/i2c/algos/i2c-algo-bit.o
CC drivers/acpi/acpica/psloop.o
CC drivers/i2c/busses/i2c-i801.o
CC drivers/usb/storage/sierra_ms.o
AR drivers/i2c/muxes/built-in.a
CC drivers/usb/storage/option_ms.o
AR drivers/input/keyboard/built-in.a
CC mm/page_io.o
CC drivers/acpi/pci_irq.o
CC drivers/gpu/drm/i915/intel_runtime_pm.o
CC drivers/base/cacheinfo.o
CC [M] drivers/gpu/drm/xe/xe_device_sysfs.o
CC kernel/umh.o
CC [M] net/netfilter/xt_nat.o
AR drivers/i3c/built-in.a
CC fs/nfs/nfs4super.o
CC arch/x86/kernel/resource.o
CC net/ipv6/inet6_connection_sock.o
CC drivers/ata/libahci.o
CC mm/swap_state.o
AR drivers/input/tablet/built-in.a
CC [M] drivers/gpu/drm/xe/xe_dma_buf.o
CC drivers/usb/storage/usual-tables.o
AR drivers/media/i2c/built-in.a
AR drivers/media/tuners/built-in.a
AR drivers/media/rc/keymaps/built-in.a
AR drivers/media/rc/built-in.a
CC drivers/acpi/acpica/psobject.o
CC drivers/usb/core/sysfs.o
AR drivers/media/common/b2c2/built-in.a
CC fs/xattr.o
CC drivers/input/mouse/focaltech.o
AR drivers/media/common/saa7146/built-in.a
CC net/mac80211/ethtool.o
AR drivers/media/common/siano/built-in.a
AR drivers/media/common/v4l2-tpg/built-in.a
AS arch/x86/kernel/irqflags.o
AR drivers/media/common/videobuf2/built-in.a
AR drivers/media/common/built-in.a
CC drivers/pcmcia/rsrc_nonstatic.o
CC arch/x86/kernel/static_call.o
AR drivers/media/platform/allegro-dvt/built-in.a
CC drivers/pcmcia/yenta_socket.o
AR drivers/media/platform/amlogic/meson-ge2d/built-in.a
AR drivers/media/platform/amlogic/built-in.a
AR drivers/media/platform/amphion/built-in.a
CC lib/rhashtable.o
AR drivers/media/platform/aspeed/built-in.a
AR drivers/media/platform/atmel/built-in.a
AR drivers/media/platform/broadcom/built-in.a
AR drivers/media/platform/cadence/built-in.a
AR drivers/media/platform/chips-media/coda/built-in.a
AR drivers/media/platform/chips-media/wave5/built-in.a
CC arch/x86/kernel/process.o
AR drivers/media/platform/chips-media/built-in.a
AR drivers/media/platform/imagination/built-in.a
CC drivers/scsi/scsi_debugfs.o
AR drivers/media/platform/intel/built-in.a
CC drivers/usb/host/ohci-hcd.o
CC drivers/scsi/scsi_trace.o
AR drivers/media/platform/marvell/built-in.a
CC arch/x86/kernel/ptrace.o
AR drivers/media/platform/mediatek/jpeg/built-in.a
AR drivers/media/platform/mediatek/mdp/built-in.a
CC drivers/rtc/dev.o
CC drivers/scsi/scsi_logging.o
AR drivers/media/platform/mediatek/vcodec/common/built-in.a
AR drivers/media/platform/mediatek/vcodec/encoder/built-in.a
CC drivers/rtc/proc.o
AR drivers/media/platform/mediatek/vcodec/decoder/built-in.a
AR drivers/media/platform/mediatek/vcodec/built-in.a
CC drivers/ata/ata_piix.o
AR drivers/media/platform/mediatek/vpu/built-in.a
AR drivers/media/platform/mediatek/mdp3/built-in.a
AR drivers/media/platform/mediatek/built-in.a
AR drivers/media/platform/microchip/built-in.a
AR drivers/net/phy/built-in.a
AR drivers/media/platform/nuvoton/built-in.a
CC net/ipv6/udp_offload.o
CC drivers/acpi/acpica/psopcode.o
AR drivers/media/platform/nvidia/tegra-vde/built-in.a
AR drivers/i2c/algos/built-in.a
AR drivers/media/platform/nvidia/built-in.a
CC drivers/rtc/sysfs.o
AR drivers/media/platform/nxp/dw100/built-in.a
AR drivers/media/platform/qcom/camss/built-in.a
AR drivers/usb/storage/built-in.a
CC net/mac80211/rx.o
AR drivers/media/platform/nxp/imx-jpeg/built-in.a
AR drivers/media/platform/qcom/venus/built-in.a
AR drivers/net/ethernet/ezchip/built-in.a
AR drivers/media/platform/nxp/imx8-isi/built-in.a
AR drivers/media/platform/qcom/built-in.a
CC drivers/gpu/drm/i915/intel_sbi.o
CC arch/x86/kernel/tls.o
AR drivers/media/platform/nxp/built-in.a
CC drivers/gpu/drm/i915/intel_step.o
CC drivers/rtc/rtc-mc146818-lib.o
CC drivers/rtc/rtc-cmos.o
AR drivers/media/platform/raspberrypi/pisp_be/built-in.a
AR drivers/media/platform/raspberrypi/built-in.a
CC net/core/netpoll.o
CC drivers/base/swnode.o
AR drivers/media/platform/renesas/rcar-vin/built-in.a
CC kernel/workqueue.o
AR drivers/media/platform/renesas/rzg2l-cru/built-in.a
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
AR drivers/media/platform/rockchip/built-in.a
AR drivers/media/platform/samsung/exynos-gsc/built-in.a
AR drivers/media/platform/samsung/exynos4-is/built-in.a
AR drivers/media/platform/samsung/s3c-camif/built-in.a
CC drivers/usb/core/endpoint.o
AR drivers/media/platform/samsung/s5p-g2d/built-in.a
AR drivers/input/touchscreen/built-in.a
AR drivers/media/platform/samsung/s5p-jpeg/built-in.a
AR drivers/pps/clients/built-in.a
AR drivers/media/platform/samsung/s5p-mfc/built-in.a
AR drivers/pps/generators/built-in.a
AR drivers/media/platform/samsung/built-in.a
CC drivers/pps/pps.o
AR drivers/media/platform/st/sti/bdisp/built-in.a
AR drivers/media/platform/st/sti/c8sectpfe/built-in.a
CC arch/x86/kernel/step.o
AR drivers/media/platform/st/sti/delta/built-in.a
AR drivers/media/platform/st/sti/hva/built-in.a
CC drivers/input/mouse/alps.o
AR drivers/media/platform/st/stm32/built-in.a
CC drivers/acpi/acpica/psopinfo.o
AR drivers/media/platform/st/built-in.a
CC [M] drivers/gpu/drm/xe/xe_drm_client.o
CC fs/nfs/nfs4file.o
AR drivers/media/platform/sunxi/sun4i-csi/built-in.a
AR drivers/i2c/busses/built-in.a
AR drivers/media/platform/sunxi/sun6i-csi/built-in.a
CC drivers/i2c/i2c-boardinfo.o
AR drivers/media/platform/sunxi/sun6i-mipi-csi2/built-in.a
AR drivers/media/platform/sunxi/sun8i-a83t-mipi-csi2/built-in.a
AR drivers/media/platform/sunxi/sun8i-di/built-in.a
AR drivers/media/platform/sunxi/sun8i-rotate/built-in.a
AR drivers/media/platform/sunxi/built-in.a
CC drivers/acpi/acpi_apd.o
AR drivers/media/platform/ti/am437x/built-in.a
AR drivers/media/platform/ti/cal/built-in.a
CC drivers/gpu/drm/i915/intel_uncore.o
AR drivers/media/platform/ti/vpe/built-in.a
AR drivers/media/platform/ti/davinci/built-in.a
AR drivers/media/platform/ti/j721e-csi2rx/built-in.a
AR net/wireless/built-in.a
AR drivers/media/platform/ti/omap/built-in.a
CC drivers/acpi/acpi_platform.o
CC drivers/acpi/acpi_pnp.o
AR drivers/media/platform/ti/omap3isp/built-in.a
AR drivers/media/platform/ti/built-in.a
CC fs/nfs/delegation.o
CC [M] net/netfilter/xt_LOG.o
AR drivers/media/platform/verisilicon/built-in.a
CC drivers/ptp/ptp_clock.o
AR drivers/media/platform/via/built-in.a
CC drivers/power/supply/power_supply_core.o
AR drivers/media/platform/xilinx/built-in.a
CC drivers/input/mouse/byd.o
AR drivers/media/platform/built-in.a
CC net/ipv6/seg6.o
CC drivers/hwmon/hwmon.o
CC net/mac80211/spectmgmt.o
AR drivers/media/pci/ttpci/built-in.a
AR drivers/media/pci/b2c2/built-in.a
CC [M] net/netfilter/xt_MASQUERADE.o
AR drivers/media/pci/pluto2/built-in.a
AR drivers/media/pci/dm1105/built-in.a
AR drivers/media/pci/pt1/built-in.a
CC [M] net/netfilter/xt_addrtype.o
AR drivers/media/pci/pt3/built-in.a
AR drivers/media/pci/mantis/built-in.a
AR drivers/media/pci/ngene/built-in.a
CC drivers/acpi/acpica/psparse.o
CC drivers/scsi/scsi_pm.o
AR drivers/media/usb/b2c2/built-in.a
AR drivers/media/pci/ddbridge/built-in.a
AR drivers/media/pci/saa7146/built-in.a
AR drivers/media/usb/dvb-usb/built-in.a
AR drivers/media/usb/dvb-usb-v2/built-in.a
AR drivers/media/pci/smipcie/built-in.a
AR drivers/media/usb/s2255/built-in.a
AR drivers/media/pci/netup_unidvb/built-in.a
AR drivers/media/usb/siano/built-in.a
AR drivers/media/pci/intel/ipu3/built-in.a
AR drivers/media/usb/ttusb-budget/built-in.a
AR drivers/media/mmc/siano/built-in.a
AR drivers/media/pci/intel/ivsc/built-in.a
AR drivers/media/usb/ttusb-dec/built-in.a
AR drivers/media/mmc/built-in.a
AR drivers/media/pci/intel/built-in.a
AR drivers/media/usb/built-in.a
CC net/ipv4/udplite.o
AR drivers/media/pci/built-in.a
CC net/ipv4/udp_offload.o
CC kernel/pid.o
CC drivers/acpi/power.o
CC lib/base64.o
AR drivers/media/firewire/built-in.a
AR drivers/media/spi/built-in.a
AR drivers/media/test-drivers/built-in.a
AR drivers/media/built-in.a
CC drivers/usb/core/devio.o
CC drivers/input/mouse/logips2pp.o
CC drivers/power/supply/power_supply_sysfs.o
CC drivers/pps/kapi.o
CC lib/once.o
CC net/ipv4/arp.o
CC mm/swapfile.o
AR drivers/pcmcia/built-in.a
AR drivers/input/misc/built-in.a
CC net/ipv6/fib6_notifier.o
CC drivers/base/auxiliary.o
CC net/ipv4/icmp.o
CC drivers/usb/core/notify.o
CC drivers/i2c/i2c-core-base.o
CC drivers/scsi/scsi_bsg.o
CC fs/nfs/nfs4idmap.o
AR drivers/rtc/built-in.a
CC drivers/ptp/ptp_chardev.o
CC net/core/fib_rules.o
CC drivers/acpi/acpica/psscope.o
CC drivers/ptp/ptp_sysfs.o
CC kernel/task_work.o
CC drivers/ata/pata_amd.o
CC drivers/power/supply/power_supply_leds.o
CC lib/refcount.o
CC arch/x86/kernel/i8237.o
CC fs/libfs.o
CC drivers/input/input.o
CC drivers/base/devtmpfs.o
CC drivers/pps/sysfs.o
CC fs/fs-writeback.o
CC kernel/extable.o
CC lib/rcuref.o
CC [M] drivers/gpu/drm/xe/xe_exec.o
CC drivers/acpi/acpica/pstree.o
CC drivers/acpi/acpica/psutils.o
CC kernel/params.o
CC drivers/input/input-compat.o
CC net/ipv4/devinet.o
CC drivers/scsi/scsi_common.o
CC drivers/base/module.o
CC drivers/power/supply/power_supply_hwmon.o
CC net/mac80211/tx.o
CC drivers/ata/pata_oldpiix.o
CC lib/usercopy.o
CC arch/x86/kernel/stacktrace.o
CC kernel/kthread.o
CC [M] drivers/gpu/drm/xe/xe_execlist.o
AR drivers/pps/built-in.a
CC drivers/usb/host/ohci-pci.o
AR drivers/thermal/broadcom/built-in.a
AR drivers/thermal/renesas/built-in.a
AR drivers/thermal/samsung/built-in.a
CC drivers/thermal/intel/intel_tcc.o
AR net/netfilter/built-in.a
CC net/ipv6/rpl.o
AR drivers/hwmon/built-in.a
AR drivers/thermal/st/built-in.a
AR drivers/thermal/qcom/built-in.a
CC drivers/gpu/drm/i915/intel_wakeref.o
CC drivers/acpi/event.o
CC drivers/scsi/scsi_transport_spi.o
CC drivers/scsi/virtio_scsi.o
CC drivers/thermal/intel/therm_throt.o
CC drivers/acpi/acpica/pswalk.o
CC drivers/input/mouse/lifebook.o
CC drivers/scsi/sd.o
CC drivers/ptp/ptp_vclock.o
CC drivers/acpi/evged.o
CC lib/errseq.o
CC net/ipv6/ioam6.o
CC drivers/input/input-mt.o
CC drivers/acpi/sysfs.o
CC lib/bucket_locks.o
CC lib/generic-radix-tree.o
AR drivers/power/supply/built-in.a
AR drivers/power/built-in.a
CC mm/swap_slots.o
CC drivers/acpi/property.o
CC [M] drivers/gpu/drm/xe/xe_exec_queue.o
CC net/ipv4/af_inet.o
CC drivers/acpi/acpica/psxface.o
CC drivers/base/auxiliary_sysfs.o
CC drivers/i2c/i2c-core-smbus.o
CC arch/x86/kernel/reboot.o
CC drivers/ata/pata_sch.o
CC lib/bitmap-str.o
CC net/mac80211/key.o
CC drivers/usb/host/uhci-hcd.o
CC drivers/ptp/ptp_kvm_x86.o
CC drivers/gpu/drm/drm_blend.o
CC drivers/input/mouse/trackpoint.o
AR drivers/thermal/tegra/built-in.a
CC drivers/acpi/acpica/rsaddr.o
AR drivers/thermal/mediatek/built-in.a
CC net/ipv6/sysctl_net_ipv6.o
CC drivers/scsi/sr.o
CC mm/dmapool.o
CC net/core/net-traces.o
CC drivers/usb/core/generic.o
CC drivers/base/devcoredump.o
CC drivers/i2c/i2c-core-acpi.o
CC drivers/gpu/drm/drm_bridge.o
CC drivers/ata/pata_mpiix.o
CC drivers/usb/host/xhci.o
CC arch/x86/kernel/msr.o
CC net/mac80211/util.o
CC drivers/gpu/drm/i915/vlv_sideband.o
CC net/mac80211/parse.o
CC fs/nfs/callback.o
CC net/mac80211/wme.o
CC drivers/ptp/ptp_kvm_common.o
CC drivers/usb/host/xhci-mem.o
CC lib/string_helpers.o
CC drivers/gpu/drm/drm_cache.o
CC drivers/scsi/sr_ioctl.o
CC [M] drivers/gpu/drm/xe/xe_force_wake.o
CC [M] drivers/thermal/intel/x86_pkg_temp_thermal.o
CC drivers/acpi/acpica/rscalc.o
CC drivers/ata/ata_generic.o
CC drivers/base/platform-msi.o
CC drivers/thermal/thermal_core.o
CC drivers/input/mouse/cypress_ps2.o
CC fs/nfs/callback_xdr.o
AR drivers/watchdog/built-in.a
CC drivers/gpu/drm/i915/vlv_suspend.o
CC net/mac80211/chan.o
CC drivers/gpu/drm/drm_color_mgmt.o
CC net/ipv4/igmp.o
CC drivers/i2c/i2c-smbus.o
CC drivers/gpu/drm/i915/soc/intel_dram.o
CC drivers/usb/core/quirks.o
CC net/mac80211/trace.o
CC mm/hugetlb.o
CC drivers/acpi/acpica/rscreate.o
CC kernel/sys_ni.o
CC arch/x86/kernel/cpuid.o
CC arch/x86/kernel/early-quirks.o
CC net/mac80211/mlme.o
AR drivers/ptp/built-in.a
CC net/mac80211/tdls.o
CC drivers/input/mouse/psmouse-smbus.o
AR drivers/net/ethernet/fujitsu/built-in.a
CC drivers/usb/core/devices.o
CC drivers/base/physical_location.o
CC fs/nfs/callback_proc.o
CC drivers/acpi/debugfs.o
CC net/ipv6/xfrm6_policy.o
CC drivers/acpi/acpi_lpat.o
CC net/ipv4/fib_frontend.o
AR drivers/thermal/intel/built-in.a
CC kernel/nsproxy.o
CC lib/hexdump.o
CC mm/mmu_notifier.o
CC arch/x86/kernel/smp.o
CC drivers/gpu/drm/i915/soc/intel_gmch.o
CC [M] drivers/gpu/drm/xe/xe_ggtt.o
CC drivers/thermal/thermal_sysfs.o
CC drivers/acpi/acpica/rsdumpinfo.o
CC net/ipv4/fib_semantics.o
AR drivers/ata/built-in.a
CC drivers/scsi/sr_vendor.o
AR drivers/net/ethernet/fungible/built-in.a
CC drivers/thermal/thermal_trip.o
CC drivers/usb/core/phy.o
CC lib/kstrtox.o
CC drivers/input/input-poller.o
AR drivers/i2c/built-in.a
CC drivers/usb/host/xhci-ext-caps.o
CC net/core/selftests.o
CC kernel/notifier.o
CC drivers/base/trace.o
CC drivers/scsi/sg.o
CC drivers/acpi/acpica/rsinfo.o
CC net/ipv6/xfrm6_state.o
CC arch/x86/kernel/smpboot.o
CC fs/pnode.o
CC kernel/ksysfs.o
CC kernel/cred.o
AR drivers/net/ethernet/google/built-in.a
AR drivers/input/mouse/built-in.a
AR drivers/net/ethernet/broadcom/built-in.a
CC net/ipv4/fib_trie.o
CC drivers/acpi/acpica/rsio.o
AR drivers/net/ethernet/huawei/built-in.a
CC net/ipv4/fib_notifier.o
AR drivers/net/ethernet/i825xx/built-in.a
CC drivers/net/ethernet/intel/e1000/e1000_main.o
CC net/mac80211/ocb.o
CC lib/iomap.o
AR drivers/net/ethernet/microsoft/built-in.a
CC drivers/thermal/thermal_helpers.o
CC net/mac80211/airtime.o
CC net/ipv6/xfrm6_input.o
CC drivers/acpi/acpica/rsirq.o
CC mm/migrate.o
CC net/core/ptp_classifier.o
CC drivers/input/ff-core.o
CC kernel/reboot.o
CC drivers/input/touchscreen.o
CC drivers/usb/core/port.o
CC drivers/usb/core/hcd-pci.o
CC arch/x86/kernel/tsc_sync.o
CC drivers/md/md.o
CC drivers/gpu/drm/i915/soc/intel_pch.o
CC [M] drivers/gpu/drm/xe/xe_gpu_scheduler.o
CC net/ipv6/xfrm6_output.o
CC drivers/acpi/acpica/rslist.o
AR drivers/base/built-in.a
CC drivers/gpu/drm/i915/soc/intel_rom.o
CC arch/x86/kernel/setup_percpu.o
CC drivers/md/md-bitmap.o
CC drivers/net/ethernet/intel/e1000/e1000_hw.o
CC drivers/thermal/thermal_hwmon.o
CC lib/iomap_copy.o
CC drivers/acpi/acpi_pcc.o
CC [M] drivers/gpu/drm/xe/xe_gsc.o
CC drivers/cpufreq/cpufreq.o
CC drivers/usb/core/usb-acpi.o
CC drivers/cpufreq/freq_table.o
CC lib/devres.o
CC drivers/acpi/acpica/rsmemory.o
CC fs/nfs/nfs4namespace.o
CC drivers/cpufreq/cpufreq_performance.o
CC drivers/input/ff-memless.o
CC drivers/acpi/ac.o
CC drivers/thermal/gov_step_wise.o
CC fs/splice.o
CC mm/page_counter.o
CC net/mac80211/eht.o
CC drivers/net/ethernet/intel/e1000/e1000_ethtool.o
CC drivers/gpu/drm/i915/i915_memcpy.o
CC drivers/cpufreq/cpufreq_userspace.o
CC drivers/usb/host/xhci-ring.o
CC net/ipv6/xfrm6_protocol.o
CC drivers/acpi/acpica/rsmisc.o
CC arch/x86/kernel/mpparse.o
CC arch/x86/kernel/trace_clock.o
CC kernel/async.o
AR drivers/net/ethernet/litex/built-in.a
CC lib/check_signature.o
CC drivers/scsi/scsi_sysfs.o
CC [M] drivers/gpu/drm/xe/xe_gsc_debugfs.o
CC drivers/thermal/gov_user_space.o
CC drivers/net/ethernet/intel/e1000e/82571.o
CC drivers/acpi/button.o
CC fs/sync.o
CC drivers/cpuidle/governors/menu.o
CC drivers/cpuidle/cpuidle.o
CC drivers/cpuidle/driver.o
CC drivers/net/ethernet/intel/e1000e/ich8lan.o
CC drivers/gpu/drm/drm_connector.o
CC lib/interval_tree.o
CC net/core/netprio_cgroup.o
CC drivers/acpi/acpica/rsserial.o
CC drivers/gpu/drm/i915/i915_mm.o
AR drivers/usb/core/built-in.a
CC drivers/input/sparse-keymap.o
AR drivers/net/ethernet/marvell/octeon_ep/built-in.a
AR drivers/net/ethernet/mellanox/built-in.a
CC drivers/gpu/drm/i915/i915_sw_fence.o
AR drivers/net/ethernet/marvell/octeon_ep_vf/built-in.a
AR drivers/net/ethernet/marvell/octeontx2/built-in.a
AR drivers/net/ethernet/marvell/prestera/built-in.a
CC drivers/net/ethernet/marvell/sky2.o
CC drivers/usb/host/xhci-hub.o
CC kernel/range.o
CC net/core/netclassid_cgroup.o
CC lib/assoc_array.o
AR drivers/thermal/built-in.a
CC kernel/smpboot.o
CC drivers/acpi/fan_core.o
CC drivers/cpufreq/cpufreq_ondemand.o
CC drivers/cpuidle/governor.o
CC drivers/acpi/acpica/rsutils.o
CC drivers/net/ethernet/intel/e1000e/80003es2lan.o
CC drivers/cpuidle/governors/haltpoll.o
CC drivers/input/vivaldi-fmap.o
CC fs/nfs/nfs4getroot.o
CC [M] drivers/gpu/drm/xe/xe_gsc_proxy.o
CC net/mac80211/led.o
CC drivers/gpu/drm/i915/i915_sw_fence_work.o
CC mm/hugetlb_cgroup.o
CC net/core/dst_cache.o
CC net/core/gro_cells.o
CC drivers/input/input-leds.o
CC arch/x86/kernel/trace.o
CC arch/x86/kernel/rethook.o
CC net/ipv4/inet_fragment.o
AR drivers/mmc/built-in.a
CC net/ipv6/netfilter.o
CC drivers/acpi/acpica/rsxface.o
CC fs/utimes.o
CC kernel/ucount.o
CC fs/nfs/nfs4client.o
CC net/ipv6/proc.o
AR drivers/net/ethernet/meta/built-in.a
CC drivers/input/evdev.o
CC drivers/usb/host/xhci-dbg.o
CC arch/x86/kernel/vmcore_info_32.o
AR drivers/net/ethernet/micrel/built-in.a
CC drivers/gpu/drm/i915/i915_syncmap.o
CC lib/bitrev.o
CC net/ipv6/syncookies.o
AR drivers/scsi/built-in.a
CC [M] drivers/gpu/drm/xe/xe_gsc_submit.o
CC drivers/acpi/fan_attr.o
CC drivers/cpuidle/sysfs.o
CC drivers/net/ethernet/intel/e1000e/mac.o
CC arch/x86/kernel/machine_kexec_32.o
CC drivers/gpu/drm/i915/i915_user_extensions.o
CC drivers/gpu/drm/drm_crtc.o
AR drivers/net/ethernet/microchip/built-in.a
CC net/ipv4/ping.o
CC drivers/gpu/drm/i915/i915_debugfs.o
CC drivers/acpi/acpica/tbdata.o
CC drivers/cpuidle/poll_state.o
CC drivers/gpu/drm/i915/i915_debugfs_params.o
CC drivers/cpufreq/cpufreq_governor.o
CC drivers/cpufreq/cpufreq_governor_attr_set.o
CC [M] drivers/gpu/drm/xe/xe_gt.o
CC lib/crc-ccitt.o
CC kernel/regset.o
CC drivers/net/ethernet/intel/e1000e/manage.o
CC net/ipv4/ip_tunnel_core.o
CC drivers/usb/host/xhci-trace.o
AR drivers/cpuidle/governors/built-in.a
AS arch/x86/kernel/relocate_kernel_32.o
CC kernel/ksyms_common.o
CC drivers/cpufreq/acpi-cpufreq.o
CC kernel/groups.o
CC fs/d_path.o
AR drivers/net/ethernet/mscc/built-in.a
CC drivers/md/md-autodetect.o
CC drivers/md/dm.o
CC drivers/md/dm-table.o
CC net/ipv4/gre_offload.o
CC drivers/cpufreq/amd-pstate.o
CC drivers/net/ethernet/intel/e1000/e1000_param.o
CC drivers/net/ethernet/intel/e100.o
CC drivers/cpuidle/cpuidle-haltpoll.o
CC mm/early_ioremap.o
CC net/ipv6/calipso.o
CC lib/crc16.o
CC drivers/net/ethernet/intel/e1000e/nvm.o
CC net/ipv4/metrics.o
CC drivers/md/dm-target.o
CC drivers/gpu/drm/i915/i915_pmu.o
CC net/core/failover.o
CC drivers/acpi/acpica/tbfadt.o
CC [M] drivers/gpu/drm/xe/xe_gt_ccs_mode.o
CC fs/nfs/nfs4session.o
CC drivers/usb/host/xhci-debugfs.o
CC arch/x86/kernel/crash_dump_32.o
CC drivers/acpi/acpica/tbfind.o
AR drivers/input/built-in.a
HOSTCC lib/gen_crc32table
CC drivers/usb/host/xhci-pci.o
AR drivers/cpuidle/built-in.a
CC drivers/md/dm-linear.o
CC mm/secretmem.o
CC net/ipv6/ah6.o
CC fs/stack.o
CC drivers/net/ethernet/intel/e1000e/phy.o
CC arch/x86/kernel/crash.o
CC lib/xxhash.o
AR drivers/net/ethernet/myricom/built-in.a
AR drivers/net/ethernet/natsemi/built-in.a
CC lib/genalloc.o
CC kernel/kcmp.o
CC fs/fs_struct.o
CC drivers/net/ethernet/intel/e1000e/param.o
CC fs/nfs/dns_resolve.o
CC net/mac80211/pm.o
CC drivers/acpi/acpica/tbinstal.o
CC drivers/md/dm-stripe.o
AR drivers/ufs/built-in.a
CC drivers/md/dm-ioctl.o
CC drivers/net/ethernet/intel/e1000e/ethtool.o
CC net/ipv4/netlink.o
CC lib/percpu_counter.o
CC net/ipv4/nexthop.o
CC arch/x86/kernel/module.o
CC drivers/md/dm-io.o
AR drivers/firmware/arm_ffa/built-in.a
CC net/mac80211/rc80211_minstrel_ht.o
AR drivers/firmware/arm_scmi/built-in.a
AR drivers/firmware/broadcom/built-in.a
AR drivers/firmware/cirrus/built-in.a
AR drivers/firmware/meson/built-in.a
AR drivers/firmware/microchip/built-in.a
CC [M] drivers/gpu/drm/xe/xe_gt_clock.o
AR drivers/firmware/imx/built-in.a
CC fs/statfs.o
CC mm/hmm.o
CC drivers/firmware/efi/libstub/efi-stub-helper.o
CC drivers/firmware/efi/libstub/gop.o
CC drivers/acpi/acpica/tbprint.o
AR net/core/built-in.a
AR drivers/firmware/psci/built-in.a
CC drivers/acpi/fan_hwmon.o
CC net/ipv4/udp_tunnel_stub.o
CC kernel/freezer.o
AR drivers/net/ethernet/intel/e1000/built-in.a
CC drivers/gpu/drm/drm_displayid.o
CC [M] drivers/gpu/drm/xe/xe_gt_freq.o
CC fs/nfs/nfs4trace.o
AR drivers/net/ethernet/neterion/built-in.a
CC net/mac80211/wbrf.o
CC net/ipv6/esp6.o
CC drivers/cpufreq/amd-pstate-trace.o
AR drivers/firmware/qcom/built-in.a
CC drivers/acpi/acpi_video.o
CC drivers/acpi/video_detect.o
CC kernel/profile.o
CC drivers/acpi/acpica/tbutils.o
CC fs/fs_pin.o
CC lib/audit.o
AR drivers/net/ethernet/netronome/built-in.a
AR drivers/firmware/smccc/built-in.a
CC [M] drivers/gpu/drm/xe/xe_gt_idle.o
CC drivers/cpufreq/intel_pstate.o
AR drivers/crypto/stm32/built-in.a
AR drivers/net/ethernet/ni/built-in.a
AR drivers/crypto/xilinx/built-in.a
CC drivers/net/ethernet/intel/e1000e/netdev.o
AR drivers/crypto/hisilicon/built-in.a
AR drivers/crypto/intel/keembay/built-in.a
AR drivers/crypto/intel/ixp4xx/built-in.a
AR drivers/crypto/intel/built-in.a
AR drivers/crypto/starfive/built-in.a
CC drivers/clocksource/acpi_pm.o
AR drivers/crypto/built-in.a
CC lib/syscall.o
CC arch/x86/kernel/doublefault_32.o
AR drivers/net/ethernet/marvell/built-in.a
CC drivers/acpi/processor_driver.o
CC arch/x86/kernel/early_printk.o
CC drivers/gpu/drm/i915/gt/gen2_engine_cs.o
CC drivers/gpu/drm/i915/gt/gen6_engine_cs.o
CC net/ipv4/ip_tunnel.o
CC drivers/acpi/acpica/tbxface.o
CC drivers/firmware/efi/libstub/secureboot.o
CC drivers/firmware/efi/libstub/tpm.o
CC drivers/net/ethernet/nvidia/forcedeth.o
CC drivers/firmware/efi/efi-bgrt.o
CC lib/errname.o
CC drivers/md/dm-kcopyd.o
CC kernel/stacktrace.o
AR drivers/firmware/tegra/built-in.a
CC drivers/acpi/acpica/tbxfload.o
CC mm/memfd.o
AR drivers/net/ethernet/oki-semi/built-in.a
CC mm/ptdump.o
CC mm/execmem.o
AR drivers/net/ethernet/packetengines/built-in.a
CC net/ipv4/sysctl_net_ipv4.o
CC kernel/dma.o
AR drivers/net/ethernet/qlogic/built-in.a
CC drivers/firmware/efi/efi.o
CC [M] drivers/gpu/drm/xe/xe_gt_debug.o
CC kernel/smp.o
CC kernel/uid16.o
CC drivers/acpi/acpica/tbxfroot.o
CC drivers/net/ethernet/intel/e1000e/ptp.o
CC net/ipv6/sit.o
AR drivers/usb/host/built-in.a
CC fs/nfs/nfs4sysctl.o
AR drivers/usb/built-in.a
CC drivers/md/dm-sysfs.o
CC drivers/gpu/drm/drm_drv.o
CC lib/nlattr.o
CC [M] drivers/gpu/drm/xe/xe_gt_mcr.o
CC drivers/firmware/efi/libstub/file.o
CC drivers/firmware/efi/libstub/mem.o
CC drivers/firmware/efi/vars.o
CC drivers/gpu/drm/i915/gt/gen6_ppgtt.o
CC drivers/clocksource/i8253.o
CC drivers/acpi/acpica/utaddress.o
CC drivers/acpi/processor_thermal.o
CC drivers/gpu/drm/drm_dumb_buffers.o
CC drivers/acpi/acpica/utalloc.o
CC drivers/firmware/efi/libstub/random.o
CC net/ipv6/addrconf_core.o
CC drivers/hid/usbhid/hid-core.o
AR drivers/platform/x86/amd/built-in.a
AR drivers/platform/x86/intel/built-in.a
CC drivers/platform/x86/wmi.o
CC drivers/platform/x86/wmi-bmof.o
AR drivers/platform/surface/built-in.a
CC drivers/gpu/drm/i915/gt/gen7_renderclear.o
CC fs/nsfs.o
AR drivers/net/ethernet/qualcomm/emac/built-in.a
CC arch/x86/kernel/hpet.o
AR drivers/net/ethernet/qualcomm/built-in.a
CC drivers/mailbox/mailbox.o
CC fs/fs_types.o
CC drivers/gpu/drm/drm_edid.o
CC net/ipv4/proc.o
CC drivers/gpu/drm/drm_eld.o
CC drivers/firmware/efi/libstub/randomalloc.o
AR drivers/clocksource/built-in.a
CC drivers/hid/hid-core.o
CC drivers/acpi/processor_idle.o
CC drivers/mailbox/pcc.o
CC arch/x86/kernel/amd_nb.o
CC drivers/acpi/acpica/utascii.o
CC drivers/hid/usbhid/hiddev.o
CC net/ipv4/fib_rules.o
CC drivers/platform/x86/eeepc-laptop.o
CC net/ipv6/exthdrs_core.o
CC [M] drivers/gpu/drm/xe/xe_gt_pagefault.o
AR mm/built-in.a
AR drivers/perf/built-in.a
CC drivers/gpu/drm/i915/gt/gen8_engine_cs.o
AR drivers/hwtracing/intel_th/built-in.a
CC drivers/firmware/efi/reboot.o
CC drivers/net/ethernet/realtek/8139too.o
CC drivers/acpi/acpica/utbuffer.o
CC drivers/firmware/efi/memattr.o
CC drivers/firmware/efi/tpm.o
CC drivers/firmware/efi/memmap.o
AR drivers/firmware/xilinx/built-in.a
CC drivers/md/dm-stats.o
CC drivers/firmware/efi/capsule.o
CC arch/x86/kernel/kvm.o
CC drivers/hid/usbhid/hid-pidff.o
CC kernel/kallsyms.o
CC drivers/firmware/efi/esrt.o
AR drivers/net/ethernet/renesas/built-in.a
CC drivers/firmware/dmi_scan.o
AR drivers/net/ethernet/rdc/built-in.a
AR drivers/net/ethernet/rocker/built-in.a
CC [M] drivers/gpu/drm/xe/xe_gt_sysfs.o
CC drivers/md/dm-rq.o
CC drivers/acpi/processor_throttling.o
CC drivers/gpu/drm/drm_encoder.o
CC net/ipv6/ip6_checksum.o
CC kernel/acct.o
CC drivers/firmware/efi/libstub/pci.o
CC lib/cpu_rmap.o
AR drivers/mailbox/built-in.a
AR drivers/net/ethernet/samsung/built-in.a
CC net/ipv6/ip6_icmp.o
CC drivers/acpi/acpica/utcksum.o
CC drivers/acpi/processor_perflib.o
CC arch/x86/kernel/kvmclock.o
CC drivers/gpu/drm/i915/gt/gen8_ppgtt.o
CC [M] drivers/gpu/drm/xe/xe_gt_throttle.o
CC net/ipv6/output_core.o
CC drivers/acpi/container.o
CC fs/fs_context.o
CC drivers/hid/hid-input.o
CC drivers/firmware/efi/libstub/skip_spaces.o
AR drivers/cpufreq/built-in.a
CC drivers/firmware/efi/runtime-wrappers.o
CC drivers/md/dm-io-rewind.o
CC lib/dynamic_queue_limits.o
CC drivers/gpu/drm/drm_file.o
CC [M] drivers/gpu/drm/xe/xe_gt_tlb_invalidation.o
CC drivers/acpi/acpica/utcopy.o
CC drivers/acpi/acpica/utexcep.o
CC net/ipv6/protocol.o
CC drivers/hid/hid-quirks.o
CC drivers/acpi/thermal_lib.o
CC drivers/net/ethernet/realtek/r8169_main.o
CC drivers/gpu/drm/i915/gt/intel_breadcrumbs.o
CC drivers/gpu/drm/drm_fourcc.o
CC drivers/platform/x86/p2sb.o
CC drivers/hid/hid-debug.o
CC drivers/firmware/dmi-id.o
CC arch/x86/kernel/paravirt.o
CC drivers/firmware/efi/libstub/lib-cmdline.o
CC drivers/firmware/efi/capsule-loader.o
CC drivers/gpu/drm/i915/gt/intel_context.o
CC net/ipv4/ipmr.o
CC drivers/acpi/acpica/utdebug.o
CC drivers/firmware/efi/libstub/lib-ctype.o
CC drivers/net/ethernet/realtek/r8169_firmware.o
CC drivers/firmware/efi/libstub/alignedmem.o
CC lib/glob.o
CC drivers/acpi/thermal.o
CC net/ipv6/ip6_offload.o
CC drivers/hid/hidraw.o
CC drivers/gpu/drm/i915/gt/intel_context_sseu.o
CC net/ipv6/tcpv6_offload.o
CC drivers/hid/hid-generic.o
AR drivers/net/ethernet/seeq/built-in.a
CC net/ipv6/exthdrs_offload.o
CC drivers/firmware/efi/earlycon.o
AR drivers/android/built-in.a
AR net/mac80211/built-in.a
CC fs/fs_parser.o
CC kernel/vmcore_info.o
CC [M] drivers/gpu/drm/xe/xe_gt_topology.o
AR drivers/hid/usbhid/built-in.a
CC arch/x86/kernel/pvclock.o
CC net/ipv6/inet6_hashtables.o
CC drivers/firmware/efi/libstub/relocate.o
CC drivers/gpu/drm/i915/gt/intel_engine_cs.o
CC lib/strncpy_from_user.o
CC drivers/acpi/acpica/utdecode.o
CC drivers/hid/hid-a4tech.o
CC drivers/firmware/efi/libstub/printk.o
AR drivers/nvmem/layouts/built-in.a
CC drivers/nvmem/core.o
CC fs/fsopen.o
CC drivers/gpu/drm/drm_framebuffer.o
CC kernel/elfcorehdr.o
AR fs/nfs/built-in.a
CC arch/x86/kernel/pcspeaker.o
CC drivers/acpi/nhlt.o
AR drivers/net/ethernet/silan/built-in.a
AR drivers/platform/x86/built-in.a
CC drivers/acpi/acpica/utdelete.o
AR drivers/platform/built-in.a
CC drivers/gpu/drm/i915/gt/intel_engine_heartbeat.o
CC drivers/gpu/drm/i915/gt/intel_engine_pm.o
CC net/ipv4/ipmr_base.o
CC kernel/crash_reserve.o
CC lib/strnlen_user.o
CC drivers/md/dm-builtin.o
AR drivers/net/ethernet/sis/built-in.a
CC drivers/acpi/acpica/uterror.o
CC drivers/gpu/drm/drm_gem.o
AR drivers/net/ethernet/nvidia/built-in.a
CC fs/init.o
CC drivers/firmware/memmap.o
CC drivers/net/ethernet/realtek/r8169_phy_config.o
CC [M] drivers/gpu/drm/xe/xe_guc.o
CC lib/net_utils.o
CC drivers/acpi/acpi_memhotplug.o
CC net/ipv4/syncookies.o
CC net/ipv6/mcast_snoop.o
CC drivers/gpu/drm/i915/gt/intel_engine_user.o
CC drivers/md/dm-raid1.o
CC drivers/md/dm-log.o
CC fs/kernel_read_file.o
CC arch/x86/kernel/check.o
AR drivers/net/ethernet/sfc/built-in.a
CC drivers/gpu/drm/i915/gt/intel_execlists_submission.o
CC kernel/kexec_core.o
CC fs/mnt_idmapping.o
CC drivers/acpi/acpica/uteval.o
CC net/ipv4/tunnel4.o
CC drivers/firmware/efi/libstub/vsprintf.o
CC lib/sg_pool.o
CC drivers/firmware/efi/libstub/x86-stub.o
AR drivers/net/ethernet/smsc/built-in.a
CC drivers/gpu/drm/drm_ioctl.o
CC lib/stackdepot.o
CC lib/asn1_decoder.o
CC net/ipv4/ipconfig.o
CC drivers/firmware/efi/libstub/smbios.o
CC kernel/crash_core.o
CC drivers/md/dm-region-hash.o
CC drivers/acpi/acpica/utglobal.o
CC drivers/gpu/drm/i915/gt/intel_ggtt.o
AR drivers/firmware/efi/built-in.a
CC drivers/gpu/drm/i915/gt/intel_ggtt_fencing.o
STUBCPY drivers/firmware/efi/libstub/alignedmem.stub.o
AR drivers/net/ethernet/socionext/built-in.a
CC drivers/acpi/ioapic.o
CC drivers/gpu/drm/drm_lease.o
CC [M] drivers/gpu/drm/xe/xe_guc_ads.o
CC net/ipv4/netfilter.o
CC fs/remap_range.o
CC drivers/hid/hid-apple.o
CC arch/x86/kernel/uprobes.o
CC fs/pidfs.o
CC kernel/kexec.o
CC drivers/acpi/acpica/uthex.o
CC drivers/gpu/drm/i915/gt/intel_gt.o
CC net/ipv4/tcp_cubic.o
AR drivers/nvmem/built-in.a
STUBCPY drivers/firmware/efi/libstub/efi-stub-helper.stub.o
CC drivers/md/dm-zero.o
AR drivers/net/ethernet/stmicro/built-in.a
CC kernel/utsname.o
CC drivers/acpi/battery.o
CC drivers/hid/hid-belkin.o
CC fs/buffer.o
CC drivers/gpu/drm/i915/gt/intel_gt_buffer_pool.o
CC arch/x86/kernel/perf_regs.o
CC [M] drivers/gpu/drm/xe/xe_guc_capture.o
CC drivers/gpu/drm/drm_managed.o
CC net/ipv4/tcp_sigpool.o
CC net/ipv4/cipso_ipv4.o
STUBCPY drivers/firmware/efi/libstub/file.stub.o
CC drivers/acpi/acpica/utids.o
CC kernel/pid_namespace.o
CC net/ipv4/xfrm4_policy.o
STUBCPY drivers/firmware/efi/libstub/gop.stub.o
CC drivers/acpi/acpica/utinit.o
GEN lib/oid_registry_data.c
AR drivers/net/ethernet/intel/e1000e/built-in.a
AR drivers/net/ethernet/sun/built-in.a
AR drivers/net/ethernet/intel/built-in.a
CC drivers/acpi/bgrt.o
CC lib/ucs2_string.o
STUBCPY drivers/firmware/efi/libstub/lib-cmdline.stub.o
CC kernel/stop_machine.o
CC drivers/gpu/drm/i915/gt/intel_gt_ccs_mode.o
AR net/ipv6/built-in.a
CC drivers/acpi/acpica/utlock.o
CC net/ipv4/xfrm4_state.o
STUBCPY drivers/firmware/efi/libstub/lib-ctype.stub.o
STUBCPY drivers/firmware/efi/libstub/mem.stub.o
STUBCPY drivers/firmware/efi/libstub/pci.stub.o
CC net/ipv4/xfrm4_input.o
STUBCPY drivers/firmware/efi/libstub/printk.stub.o
CC fs/mpage.o
STUBCPY drivers/firmware/efi/libstub/random.stub.o
CC drivers/gpu/drm/i915/gt/intel_gt_clock_utils.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
CC [M] drivers/gpu/drm/xe/xe_guc_ct.o
STUBCPY drivers/firmware/efi/libstub/skip_spaces.stub.o
CC [M] drivers/gpu/drm/xe/xe_guc_db_mgr.o
STUBCPY drivers/firmware/efi/libstub/smbios.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
AR drivers/net/ethernet/tehuti/built-in.a
AR drivers/firmware/efi/libstub/lib.a
CC net/ipv4/xfrm4_output.o
CC kernel/audit.o
CC arch/x86/kernel/tracepoint.o
AR drivers/firmware/built-in.a
CC drivers/acpi/spcr.o
CC fs/proc_namespace.o
AR drivers/md/built-in.a
AR drivers/net/ethernet/ti/built-in.a
AR drivers/net/ethernet/vertexcom/built-in.a
AR drivers/net/ethernet/via/built-in.a
CC drivers/gpu/drm/drm_mm.o
CC [M] drivers/gpu/drm/xe/xe_guc_hwconfig.o
CC drivers/gpu/drm/drm_mode_config.o
CC fs/direct-io.o
CC kernel/auditfilter.o
CC lib/sbitmap.o
CC arch/x86/kernel/itmt.o
CC drivers/acpi/acpica/utmath.o
CC lib/group_cpus.o
AR drivers/net/ethernet/wangxun/built-in.a
CC drivers/hid/hid-cherry.o
AR drivers/net/ethernet/wiznet/built-in.a
CC arch/x86/kernel/umip.o
AR drivers/net/ethernet/xilinx/built-in.a
CC net/ipv4/xfrm4_protocol.o
CC drivers/gpu/drm/drm_mode_object.o
CC drivers/hid/hid-chicony.o
CC drivers/hid/hid-cypress.o
CC drivers/gpu/drm/i915/gt/intel_gt_debugfs.o
CC drivers/acpi/acpica/utmisc.o
AR drivers/net/ethernet/xircom/built-in.a
CC drivers/acpi/acpica/utmutex.o
CC lib/fw_table.o
CC drivers/hid/hid-ezkey.o
CC kernel/auditsc.o
CC fs/eventpoll.o
CC drivers/acpi/acpica/utnonansi.o
AR drivers/net/ethernet/synopsys/built-in.a
CC drivers/gpu/drm/drm_modes.o
CC drivers/gpu/drm/i915/gt/intel_gt_engines_debugfs.o
AR lib/lib.a
CC drivers/hid/hid-gyration.o
GEN lib/crc32table.h
CC arch/x86/kernel/unwind_frame.o
CC fs/anon_inodes.o
AR drivers/net/ethernet/realtek/built-in.a
AR drivers/net/ethernet/pensando/built-in.a
AR drivers/net/ethernet/built-in.a
CC drivers/acpi/acpica/utobject.o
CC kernel/audit_watch.o
CC drivers/acpi/acpica/utosi.o
CC lib/oid_registry.o
CC drivers/gpu/drm/i915/gt/intel_gt_irq.o
CC drivers/gpu/drm/i915/gt/intel_gt_mcr.o
CC kernel/audit_fsnotify.o
CC [M] drivers/gpu/drm/xe/xe_guc_id_mgr.o
AR drivers/net/built-in.a
CC drivers/gpu/drm/drm_modeset_lock.o
CC drivers/gpu/drm/i915/gt/intel_gt_pm.o
CC fs/signalfd.o
CC drivers/acpi/acpica/utownerid.o
CC kernel/audit_tree.o
CC drivers/acpi/acpica/utpredef.o
CC fs/timerfd.o
CC lib/crc32.o
CC drivers/hid/hid-ite.o
CC drivers/gpu/drm/drm_plane.o
CC drivers/hid/hid-kensington.o
CC drivers/gpu/drm/i915/gt/intel_gt_pm_debugfs.o
CC kernel/kprobes.o
CC [M] drivers/gpu/drm/xe/xe_guc_klv_helpers.o
CC fs/eventfd.o
CC drivers/acpi/acpica/utresdecode.o
CC kernel/seccomp.o
CC drivers/gpu/drm/i915/gt/intel_gt_pm_irq.o
CC drivers/gpu/drm/drm_prime.o
CC drivers/hid/hid-lg.o
CC drivers/gpu/drm/drm_print.o
CC drivers/gpu/drm/drm_property.o
CC [M] drivers/gpu/drm/xe/xe_guc_log.o
CC fs/aio.o
CC fs/locks.o
CC drivers/gpu/drm/drm_rect.o
CC drivers/hid/hid-lgff.o
CC kernel/relay.o
CC drivers/gpu/drm/i915/gt/intel_gt_requests.o
CC [M] drivers/gpu/drm/xe/xe_guc_pc.o
CC drivers/hid/hid-lg4ff.o
CC drivers/gpu/drm/i915/gt/intel_gt_sysfs.o
AR arch/x86/kernel/built-in.a
AR arch/x86/built-in.a
CC fs/binfmt_misc.o
CC [M] drivers/gpu/drm/xe/xe_guc_submit.o
CC drivers/hid/hid-lg-g15.o
CC kernel/utsname_sysctl.o
CC drivers/acpi/acpica/utresrc.o
CC fs/binfmt_script.o
AR lib/built-in.a
CC drivers/gpu/drm/i915/gt/intel_gt_sysfs_pm.o
CC drivers/gpu/drm/drm_syncobj.o
CC kernel/delayacct.o
AR net/ipv4/built-in.a
AR net/built-in.a
CC fs/binfmt_elf.o
CC [M] drivers/gpu/drm/xe/xe_heci_gsc.o
CC drivers/hid/hid-microsoft.o
CC drivers/gpu/drm/i915/gt/intel_gtt.o
CC drivers/acpi/acpica/utstate.o
CC drivers/gpu/drm/i915/gt/intel_llc.o
CC drivers/hid/hid-monterey.o
CC fs/mbcache.o
CC drivers/hid/hid-ntrig.o
CC fs/posix_acl.o
CC [M] drivers/gpu/drm/xe/xe_hw_engine.o
CC drivers/gpu/drm/drm_sysfs.o
CC kernel/taskstats.o
CC drivers/acpi/acpica/utstring.o
CC drivers/gpu/drm/i915/gt/intel_lrc.o
CC fs/coredump.o
CC drivers/gpu/drm/i915/gt/intel_migrate.o
CC [M] drivers/gpu/drm/xe/xe_hw_engine_class_sysfs.o
CC drivers/gpu/drm/drm_trace_points.o
CC drivers/gpu/drm/i915/gt/intel_mocs.o
CC drivers/hid/hid-pl.o
CC kernel/tsacct.o
CC drivers/acpi/acpica/utstrsuppt.o
CC drivers/gpu/drm/drm_vblank.o
CC drivers/acpi/acpica/utstrtoul64.o
CC kernel/tracepoint.o
CC drivers/hid/hid-petalynx.o
CC fs/drop_caches.o
CC drivers/gpu/drm/i915/gt/intel_ppgtt.o
CC drivers/hid/hid-redragon.o
CC [M] drivers/gpu/drm/xe/xe_hw_engine_group.o
CC kernel/irq_work.o
CC drivers/gpu/drm/i915/gt/intel_rc6.o
CC fs/sysctls.o
CC drivers/gpu/drm/i915/gt/intel_region_lmem.o
CC kernel/static_call.o
CC drivers/hid/hid-samsung.o
CC [M] drivers/gpu/drm/xe/xe_hw_fence.o
CC drivers/gpu/drm/drm_vblank_work.o
CC drivers/acpi/acpica/utxface.o
CC drivers/gpu/drm/i915/gt/intel_renderstate.o
CC kernel/padata.o
CC drivers/gpu/drm/drm_vma_manager.o
CC fs/fhandle.o
CC [M] drivers/gpu/drm/xe/xe_huc.o
CC drivers/gpu/drm/i915/gt/intel_reset.o
CC kernel/jump_label.o
CC drivers/gpu/drm/i915/gt/intel_ring.o
CC drivers/hid/hid-sony.o
CC drivers/acpi/acpica/utxfinit.o
CC drivers/gpu/drm/drm_writeback.o
CC drivers/gpu/drm/drm_panel.o
CC [M] drivers/gpu/drm/xe/xe_irq.o
CC drivers/hid/hid-sunplus.o
CC drivers/acpi/acpica/utxferror.o
CC drivers/gpu/drm/drm_pci.o
CC drivers/hid/hid-topseed.o
CC drivers/gpu/drm/i915/gt/intel_ring_submission.o
CC drivers/gpu/drm/i915/gt/intel_rps.o
CC drivers/acpi/acpica/utxfmutex.o
CC drivers/gpu/drm/drm_debugfs.o
CC [M] drivers/gpu/drm/xe/xe_lrc.o
CC drivers/gpu/drm/i915/gt/intel_sa_media.o
CC kernel/context_tracking.o
CC [M] drivers/gpu/drm/xe/xe_migrate.o
CC drivers/gpu/drm/drm_debugfs_crc.o
CC kernel/iomem.o
CC drivers/gpu/drm/i915/gt/intel_sseu.o
CC [M] drivers/gpu/drm/xe/xe_mmio.o
CC drivers/gpu/drm/i915/gt/intel_sseu_debugfs.o
CC drivers/gpu/drm/drm_panel_orientation_quirks.o
CC [M] drivers/gpu/drm/xe/xe_mocs.o
CC [M] drivers/gpu/drm/xe/xe_module.o
CC kernel/rseq.o
CC drivers/gpu/drm/drm_buddy.o
CC drivers/gpu/drm/i915/gt/intel_timeline.o
CC [M] drivers/gpu/drm/xe/xe_oa.o
CC drivers/gpu/drm/drm_gem_shmem_helper.o
CC drivers/gpu/drm/i915/gt/intel_tlb.o
AR drivers/acpi/acpica/built-in.a
CC drivers/gpu/drm/drm_atomic_helper.o
AR drivers/acpi/built-in.a
CC drivers/gpu/drm/i915/gt/intel_wopcm.o
CC [M] drivers/gpu/drm/xe/xe_observation.o
CC drivers/gpu/drm/drm_atomic_state_helper.o
CC drivers/gpu/drm/i915/gt/intel_workarounds.o
CC [M] drivers/gpu/drm/xe/xe_pat.o
CC drivers/gpu/drm/i915/gt/shmem_utils.o
CC drivers/gpu/drm/drm_crtc_helper.o
CC [M] drivers/gpu/drm/xe/xe_pci.o
CC drivers/gpu/drm/i915/gt/sysfs_engines.o
CC drivers/gpu/drm/drm_damage_helper.o
CC drivers/gpu/drm/i915/gt/intel_ggtt_gmch.o
CC [M] drivers/gpu/drm/xe/xe_pcode.o
CC drivers/gpu/drm/drm_encoder_slave.o
CC drivers/gpu/drm/i915/gt/gen6_renderstate.o
CC [M] drivers/gpu/drm/xe/xe_pm.o
CC [M] drivers/gpu/drm/xe/xe_preempt_fence.o
CC drivers/gpu/drm/drm_flip_work.o
CC drivers/gpu/drm/i915/gt/gen7_renderstate.o
CC [M] drivers/gpu/drm/xe/xe_pt.o
CC [M] drivers/gpu/drm/xe/xe_pt_walk.o
CC drivers/gpu/drm/drm_format_helper.o
CC drivers/gpu/drm/i915/gt/gen8_renderstate.o
AR fs/built-in.a
CC drivers/gpu/drm/drm_gem_atomic_helper.o
CC [M] drivers/gpu/drm/xe/xe_query.o
CC drivers/gpu/drm/i915/gt/gen9_renderstate.o
CC [M] drivers/gpu/drm/xe/xe_range_fence.o
CC [M] drivers/gpu/drm/xe/xe_reg_sr.o
CC drivers/gpu/drm/drm_gem_framebuffer_helper.o
CC drivers/gpu/drm/i915/gem/i915_gem_busy.o
AR drivers/hid/built-in.a
CC [M] drivers/gpu/drm/xe/xe_reg_whitelist.o
CC [M] drivers/gpu/drm/xe/xe_rtp.o
CC drivers/gpu/drm/drm_kms_helper_common.o
CC drivers/gpu/drm/i915/gem/i915_gem_clflush.o
CC drivers/gpu/drm/i915/gem/i915_gem_context.o
CC drivers/gpu/drm/i915/gem/i915_gem_create.o
AR kernel/built-in.a
CC drivers/gpu/drm/drm_modeset_helper.o
CC [M] drivers/gpu/drm/xe/xe_ring_ops.o
CC drivers/gpu/drm/drm_plane_helper.o
CC [M] drivers/gpu/drm/xe/xe_sa.o
CC drivers/gpu/drm/i915/gem/i915_gem_dmabuf.o
CC drivers/gpu/drm/drm_probe_helper.o
CC drivers/gpu/drm/drm_self_refresh_helper.o
CC [M] drivers/gpu/drm/xe/xe_sched_job.o
CC drivers/gpu/drm/drm_simple_kms_helper.o
CC drivers/gpu/drm/i915/gem/i915_gem_domain.o
CC [M] drivers/gpu/drm/xe/xe_step.o
CC drivers/gpu/drm/bridge/panel.o
CC drivers/gpu/drm/i915/gem/i915_gem_execbuffer.o
CC [M] drivers/gpu/drm/xe/xe_sync.o
CC drivers/gpu/drm/i915/gem/i915_gem_internal.o
CC drivers/gpu/drm/drm_mipi_dsi.o
CC [M] drivers/gpu/drm/xe/xe_tile.o
CC drivers/gpu/drm/i915/gem/i915_gem_lmem.o
CC [M] drivers/gpu/drm/drm_exec.o
CC [M] drivers/gpu/drm/drm_gpuvm.o
CC drivers/gpu/drm/i915/gem/i915_gem_mman.o
CC [M] drivers/gpu/drm/xe/xe_tile_sysfs.o
CC [M] drivers/gpu/drm/drm_suballoc.o
CC [M] drivers/gpu/drm/xe/xe_trace.o
CC drivers/gpu/drm/i915/gem/i915_gem_object.o
CC [M] drivers/gpu/drm/xe/xe_trace_bo.o
CC [M] drivers/gpu/drm/drm_gem_ttm_helper.o
CC drivers/gpu/drm/i915/gem/i915_gem_pages.o
CC [M] drivers/gpu/drm/xe/xe_trace_guc.o
CC drivers/gpu/drm/i915/gem/i915_gem_phys.o
CC [M] drivers/gpu/drm/xe/xe_ttm_sys_mgr.o
CC [M] drivers/gpu/drm/xe/xe_ttm_stolen_mgr.o
CC drivers/gpu/drm/i915/gem/i915_gem_pm.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 drivers/gpu/drm/i915/gem/i915_gem_region.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_vram.o
CC drivers/gpu/drm/i915/gem/i915_gem_shmem.o
CC [M] drivers/gpu/drm/xe/xe_vram_freq.o
CC drivers/gpu/drm/i915/gem/i915_gem_shrinker.o
CC [M] drivers/gpu/drm/xe/xe_wait_user_fence.o
CC [M] drivers/gpu/drm/xe/xe_wa.o
CC drivers/gpu/drm/i915/gem/i915_gem_stolen.o
CC [M] drivers/gpu/drm/xe/xe_wopcm.o
CC [M] drivers/gpu/drm/xe/xe_eudebug.o
CC [M] drivers/gpu/drm/xe/xe_debug_metadata.o
CC drivers/gpu/drm/i915/gem/i915_gem_throttle.o
LD [M] drivers/gpu/drm/drm_suballoc_helper.o
CC [M] drivers/gpu/drm/xe/xe_hmm.o
CC drivers/gpu/drm/i915/gem/i915_gem_tiling.o
CC [M] drivers/gpu/drm/xe/xe_hwmon.o
CC drivers/gpu/drm/i915/gem/i915_gem_ttm.o
CC [M] drivers/gpu/drm/xe/xe_gt_sriov_vf.o
CC drivers/gpu/drm/i915/gem/i915_gem_ttm_move.o
CC [M] drivers/gpu/drm/xe/xe_guc_relay.o
LD [M] drivers/gpu/drm/drm_ttm_helper.o
CC drivers/gpu/drm/i915/gem/i915_gem_ttm_pm.o
CC [M] drivers/gpu/drm/xe/xe_memirq.o
CC drivers/gpu/drm/i915/gem/i915_gem_userptr.o
CC [M] drivers/gpu/drm/xe/xe_sriov.o
CC drivers/gpu/drm/i915/gem/i915_gem_wait.o
CC [M] drivers/gpu/drm/xe/display/ext/i915_irq.o
CC [M] drivers/gpu/drm/xe/display/ext/i915_utils.o
CC drivers/gpu/drm/i915/gem/i915_gemfs.o
CC [M] drivers/gpu/drm/xe/display/intel_bo.o
CC [M] drivers/gpu/drm/xe/display/intel_fb_bo.o
CC [M] drivers/gpu/drm/xe/display/intel_fbdev_fb.o
CC [M] drivers/gpu/drm/xe/display/xe_display.o
CC [M] drivers/gpu/drm/xe/display/xe_display_misc.o
CC [M] drivers/gpu/drm/xe/display/xe_display_rps.o
CC [M] drivers/gpu/drm/xe/display/xe_display_wa.o
CC [M] drivers/gpu/drm/xe/display/xe_dsb_buffer.o
CC drivers/gpu/drm/i915/i915_active.o
CC drivers/gpu/drm/i915/i915_cmd_parser.o
CC [M] drivers/gpu/drm/xe/display/xe_fb_pin.o
CC [M] drivers/gpu/drm/xe/display/xe_hdcp_gsc.o
CC drivers/gpu/drm/i915/i915_deps.o
CC [M] drivers/gpu/drm/xe/display/xe_plane_initial.o
CC [M] drivers/gpu/drm/xe/display/xe_tdf.o
CC drivers/gpu/drm/i915/i915_gem.o
CC drivers/gpu/drm/i915/i915_gem_evict.o
CC [M] drivers/gpu/drm/xe/i915-soc/intel_dram.o
CC [M] drivers/gpu/drm/xe/i915-soc/intel_pch.o
CC [M] drivers/gpu/drm/xe/i915-soc/intel_rom.o
CC drivers/gpu/drm/i915/i915_gem_gtt.o
CC [M] drivers/gpu/drm/xe/i915-display/icl_dsi.o
CC drivers/gpu/drm/i915/i915_gem_ww.o
CC [M] drivers/gpu/drm/xe/i915-display/intel_alpm.o
CC drivers/gpu/drm/i915/i915_query.o
CC [M] drivers/gpu/drm/xe/i915-display/intel_atomic.o
CC [M] drivers/gpu/drm/xe/i915-display/intel_atomic_plane.o
CC [M] drivers/gpu/drm/xe/i915-display/intel_audio.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/xe/i915-display/intel_bw.o
CC drivers/gpu/drm/i915/i915_request.o
CC drivers/gpu/drm/i915/i915_scheduler.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 drivers/gpu/drm/i915/i915_trace_points.o
CC [M] drivers/gpu/drm/xe/i915-display/intel_connector.o
CC [M] drivers/gpu/drm/xe/i915-display/intel_crtc.o
CC drivers/gpu/drm/i915/i915_ttm_buddy_manager.o
CC [M] drivers/gpu/drm/xe/i915-display/intel_crtc_state_dump.o
CC drivers/gpu/drm/i915/i915_vma.o
CC drivers/gpu/drm/i915/i915_vma_resource.o
CC [M] drivers/gpu/drm/xe/i915-display/intel_cursor.o
CC [M] drivers/gpu/drm/xe/i915-display/intel_cx0_phy.o
CC drivers/gpu/drm/i915/gt/uc/intel_gsc_fw.o
CC drivers/gpu/drm/i915/gt/uc/intel_gsc_proxy.o
CC drivers/gpu/drm/i915/gt/uc/intel_gsc_uc.o
CC [M] drivers/gpu/drm/xe/i915-display/intel_ddi.o
CC drivers/gpu/drm/i915/gt/uc/intel_gsc_uc_debugfs.o
CC [M] drivers/gpu/drm/xe/i915-display/intel_ddi_buf_trans.o
CC drivers/gpu/drm/i915/gt/uc/intel_gsc_uc_heci_cmd_submit.o
CC [M] drivers/gpu/drm/xe/i915-display/intel_display.o
CC [M] drivers/gpu/drm/xe/i915-display/intel_display_device.o
CC [M] drivers/gpu/drm/xe/i915-display/intel_display_driver.o
CC [M] drivers/gpu/drm/xe/i915-display/intel_display_irq.o
CC [M] drivers/gpu/drm/xe/i915-display/intel_display_params.o
CC drivers/gpu/drm/i915/gt/uc/intel_guc.o
CC [M] drivers/gpu/drm/xe/i915-display/intel_display_power.o
CC [M] drivers/gpu/drm/xe/i915-display/intel_display_power_map.o
CC [M] drivers/gpu/drm/xe/i915-display/intel_display_power_well.o
CC drivers/gpu/drm/i915/gt/uc/intel_guc_ads.o
CC drivers/gpu/drm/i915/gt/uc/intel_guc_capture.o
CC [M] drivers/gpu/drm/xe/i915-display/intel_display_trace.o
CC [M] drivers/gpu/drm/xe/i915-display/intel_display_wa.o
CC drivers/gpu/drm/i915/gt/uc/intel_guc_ct.o
CC drivers/gpu/drm/i915/gt/uc/intel_guc_debugfs.o
CC [M] drivers/gpu/drm/xe/i915-display/intel_dkl_phy.o
CC drivers/gpu/drm/i915/gt/uc/intel_guc_fw.o
CC drivers/gpu/drm/i915/gt/uc/intel_guc_hwconfig.o
CC [M] drivers/gpu/drm/xe/i915-display/intel_dmc.o
CC drivers/gpu/drm/i915/gt/uc/intel_guc_log.o
CC drivers/gpu/drm/i915/gt/uc/intel_guc_log_debugfs.o
CC drivers/gpu/drm/i915/gt/uc/intel_guc_rc.o
CC [M] drivers/gpu/drm/xe/i915-display/intel_dp.o
CC [M] drivers/gpu/drm/xe/i915-display/intel_dp_aux.o
CC drivers/gpu/drm/i915/gt/uc/intel_guc_slpc.o
CC drivers/gpu/drm/i915/gt/uc/intel_guc_submission.o
CC drivers/gpu/drm/i915/gt/uc/intel_huc.o
CC [M] drivers/gpu/drm/xe/i915-display/intel_dp_aux_backlight.o
CC [M] drivers/gpu/drm/xe/i915-display/intel_dp_hdcp.o
CC drivers/gpu/drm/i915/gt/uc/intel_huc_debugfs.o
CC drivers/gpu/drm/i915/gt/uc/intel_huc_fw.o
CC [M] drivers/gpu/drm/xe/i915-display/intel_dp_link_training.o
CC drivers/gpu/drm/i915/gt/uc/intel_uc.o
CC [M] drivers/gpu/drm/xe/i915-display/intel_dp_mst.o
CC drivers/gpu/drm/i915/gt/uc/intel_uc_debugfs.o
CC [M] drivers/gpu/drm/xe/i915-display/intel_dp_test.o
CC [M] drivers/gpu/drm/xe/i915-display/intel_dpll.o
CC [M] drivers/gpu/drm/xe/i915-display/intel_dpll_mgr.o
CC [M] drivers/gpu/drm/xe/i915-display/intel_dpt_common.o
CC [M] drivers/gpu/drm/xe/i915-display/intel_drrs.o
CC [M] drivers/gpu/drm/xe/i915-display/intel_dsb.o
CC drivers/gpu/drm/i915/gt/uc/intel_uc_fw.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 drivers/gpu/drm/i915/gt/intel_gsc.o
CC drivers/gpu/drm/i915/i915_hwmon.o
CC [M] drivers/gpu/drm/xe/i915-display/intel_dsi_vbt.o
CC drivers/gpu/drm/i915/display/hsw_ips.o
CC [M] drivers/gpu/drm/xe/i915-display/intel_encoder.o
CC [M] drivers/gpu/drm/xe/i915-display/intel_fb.o
CC drivers/gpu/drm/i915/display/i9xx_plane.o
CC drivers/gpu/drm/i915/display/i9xx_wm.o
CC [M] drivers/gpu/drm/xe/i915-display/intel_fbc.o
CC drivers/gpu/drm/i915/display/intel_alpm.o
CC [M] drivers/gpu/drm/xe/i915-display/intel_fdi.o
CC drivers/gpu/drm/i915/display/intel_atomic.o
CC [M] drivers/gpu/drm/xe/i915-display/intel_fifo_underrun.o
CC drivers/gpu/drm/i915/display/intel_atomic_plane.o
CC [M] drivers/gpu/drm/xe/i915-display/intel_frontbuffer.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 drivers/gpu/drm/i915/display/intel_audio.o
CC drivers/gpu/drm/i915/display/intel_bios.o
CC [M] drivers/gpu/drm/xe/i915-display/intel_hdcp.o
CC drivers/gpu/drm/i915/display/intel_bo.o
CC drivers/gpu/drm/i915/display/intel_bw.o
CC [M] drivers/gpu/drm/xe/i915-display/intel_hdcp_gsc_message.o
CC drivers/gpu/drm/i915/display/intel_cdclk.o
CC [M] drivers/gpu/drm/xe/i915-display/intel_hdmi.o
CC [M] drivers/gpu/drm/xe/i915-display/intel_hotplug.o
CC [M] drivers/gpu/drm/xe/i915-display/intel_hotplug_irq.o
CC [M] drivers/gpu/drm/xe/i915-display/intel_hti.o
CC [M] drivers/gpu/drm/xe/i915-display/intel_link_bw.o
CC [M] drivers/gpu/drm/xe/i915-display/intel_lspcon.o
CC drivers/gpu/drm/i915/display/intel_color.o
CC drivers/gpu/drm/i915/display/intel_combo_phy.o
CC [M] drivers/gpu/drm/xe/i915-display/intel_modeset_lock.o
CC drivers/gpu/drm/i915/display/intel_connector.o
CC [M] drivers/gpu/drm/xe/i915-display/intel_modeset_setup.o
CC [M] drivers/gpu/drm/xe/i915-display/intel_modeset_verify.o
CC drivers/gpu/drm/i915/display/intel_crtc.o
CC [M] drivers/gpu/drm/xe/i915-display/intel_panel.o
CC drivers/gpu/drm/i915/display/intel_crtc_state_dump.o
CC [M] drivers/gpu/drm/xe/i915-display/intel_pmdemand.o
CC drivers/gpu/drm/i915/display/intel_cursor.o
CC [M] drivers/gpu/drm/xe/i915-display/intel_pps.o
CC drivers/gpu/drm/i915/display/intel_display.o
CC [M] drivers/gpu/drm/xe/i915-display/intel_psr.o
CC [M] drivers/gpu/drm/xe/i915-display/intel_qp_tables.o
CC drivers/gpu/drm/i915/display/intel_display_driver.o
CC [M] drivers/gpu/drm/xe/i915-display/intel_quirks.o
CC drivers/gpu/drm/i915/display/intel_display_irq.o
CC [M] drivers/gpu/drm/xe/i915-display/intel_snps_phy.o
CC drivers/gpu/drm/i915/display/intel_display_params.o
CC [M] drivers/gpu/drm/xe/i915-display/intel_tc.o
CC [M] drivers/gpu/drm/xe/i915-display/intel_vblank.o
CC [M] drivers/gpu/drm/xe/i915-display/intel_vdsc.o
CC drivers/gpu/drm/i915/display/intel_display_power.o
CC [M] drivers/gpu/drm/xe/i915-display/intel_vga.o
CC drivers/gpu/drm/i915/display/intel_display_power_map.o
CC [M] drivers/gpu/drm/xe/i915-display/intel_vrr.o
CC [M] drivers/gpu/drm/xe/i915-display/intel_dmc_wl.o
CC [M] drivers/gpu/drm/xe/i915-display/intel_wm.o
CC drivers/gpu/drm/i915/display/intel_display_power_well.o
CC [M] drivers/gpu/drm/xe/i915-display/skl_scaler.o
CC drivers/gpu/drm/i915/display/intel_display_reset.o
CC [M] drivers/gpu/drm/xe/i915-display/skl_universal_plane.o
CC [M] drivers/gpu/drm/xe/i915-display/skl_watermark.o
CC drivers/gpu/drm/i915/display/intel_display_rps.o
CC [M] drivers/gpu/drm/xe/i915-display/intel_acpi.o
CC [M] drivers/gpu/drm/xe/i915-display/intel_opregion.o
CC [M] drivers/gpu/drm/xe/xe_debugfs.o
CC drivers/gpu/drm/i915/display/intel_display_snapshot.o
CC drivers/gpu/drm/i915/display/intel_display_wa.o
CC drivers/gpu/drm/i915/display/intel_dmc.o
CC [M] drivers/gpu/drm/xe/xe_gt_debugfs.o
CC drivers/gpu/drm/i915/display/intel_dmc_wl.o
CC drivers/gpu/drm/i915/display/intel_dpio_phy.o
CC drivers/gpu/drm/i915/display/intel_dpll.o
CC [M] drivers/gpu/drm/xe/xe_gt_sriov_vf_debugfs.o
CC drivers/gpu/drm/i915/display/intel_dpll_mgr.o
CC drivers/gpu/drm/i915/display/intel_dpt.o
CC [M] drivers/gpu/drm/xe/xe_gt_stats.o
CC [M] drivers/gpu/drm/xe/xe_guc_debugfs.o
CC [M] drivers/gpu/drm/xe/xe_huc_debugfs.o
CC drivers/gpu/drm/i915/display/intel_dpt_common.o
CC drivers/gpu/drm/i915/display/intel_drrs.o
CC [M] drivers/gpu/drm/xe/xe_uc_debugfs.o
CC [M] drivers/gpu/drm/xe/i915-display/intel_display_debugfs.o
CC drivers/gpu/drm/i915/display/intel_dsb.o
CC [M] drivers/gpu/drm/xe/i915-display/intel_display_debugfs_params.o
CC [M] drivers/gpu/drm/xe/i915-display/intel_pipe_crc.o
CC drivers/gpu/drm/i915/display/intel_dsb_buffer.o
CC drivers/gpu/drm/i915/display/intel_fb.o
CC drivers/gpu/drm/i915/display/intel_fb_bo.o
CC drivers/gpu/drm/i915/display/intel_fb_pin.o
CC drivers/gpu/drm/i915/display/intel_fbc.o
CC drivers/gpu/drm/i915/display/intel_fdi.o
CC drivers/gpu/drm/i915/display/intel_fifo_underrun.o
CC drivers/gpu/drm/i915/display/intel_frontbuffer.o
CC drivers/gpu/drm/i915/display/intel_global_state.o
CC drivers/gpu/drm/i915/display/intel_hdcp.o
CC drivers/gpu/drm/i915/display/intel_hdcp_gsc.o
CC drivers/gpu/drm/i915/display/intel_hdcp_gsc_message.o
CC drivers/gpu/drm/i915/display/intel_hotplug.o
CC drivers/gpu/drm/i915/display/intel_hotplug_irq.o
CC drivers/gpu/drm/i915/display/intel_hti.o
CC drivers/gpu/drm/i915/display/intel_link_bw.o
CC drivers/gpu/drm/i915/display/intel_load_detect.o
CC drivers/gpu/drm/i915/display/intel_lpe_audio.o
CC drivers/gpu/drm/i915/display/intel_modeset_lock.o
CC drivers/gpu/drm/i915/display/intel_modeset_setup.o
CC drivers/gpu/drm/i915/display/intel_modeset_verify.o
CC drivers/gpu/drm/i915/display/intel_overlay.o
CC drivers/gpu/drm/i915/display/intel_pch_display.o
CC drivers/gpu/drm/i915/display/intel_pch_refclk.o
CC drivers/gpu/drm/i915/display/intel_plane_initial.o
CC drivers/gpu/drm/i915/display/intel_pmdemand.o
CC drivers/gpu/drm/i915/display/intel_psr.o
CC drivers/gpu/drm/i915/display/intel_quirks.o
CC drivers/gpu/drm/i915/display/intel_sprite.o
CC drivers/gpu/drm/i915/display/intel_sprite_uapi.o
CC drivers/gpu/drm/i915/display/intel_tc.o
CC drivers/gpu/drm/i915/display/intel_vblank.o
CC drivers/gpu/drm/i915/display/intel_vga.o
CC drivers/gpu/drm/i915/display/intel_wm.o
CC drivers/gpu/drm/i915/display/skl_scaler.o
CC drivers/gpu/drm/i915/display/skl_universal_plane.o
CC drivers/gpu/drm/i915/display/skl_watermark.o
CC drivers/gpu/drm/i915/display/intel_acpi.o
CC drivers/gpu/drm/i915/display/intel_opregion.o
CC drivers/gpu/drm/i915/display/intel_display_debugfs.o
CC drivers/gpu/drm/i915/display/intel_display_debugfs_params.o
CC drivers/gpu/drm/i915/display/intel_pipe_crc.o
CC drivers/gpu/drm/i915/display/dvo_ch7017.o
CC drivers/gpu/drm/i915/display/dvo_ch7xxx.o
CC drivers/gpu/drm/i915/display/dvo_ivch.o
CC drivers/gpu/drm/i915/display/dvo_ns2501.o
CC drivers/gpu/drm/i915/display/dvo_sil164.o
CC drivers/gpu/drm/i915/display/dvo_tfp410.o
CC drivers/gpu/drm/i915/display/g4x_dp.o
CC drivers/gpu/drm/i915/display/g4x_hdmi.o
CC drivers/gpu/drm/i915/display/icl_dsi.o
CC drivers/gpu/drm/i915/display/intel_backlight.o
CC drivers/gpu/drm/i915/display/intel_crt.o
CC drivers/gpu/drm/i915/display/intel_cx0_phy.o
CC drivers/gpu/drm/i915/display/intel_ddi.o
CC drivers/gpu/drm/i915/display/intel_ddi_buf_trans.o
CC drivers/gpu/drm/i915/display/intel_display_device.o
CC drivers/gpu/drm/i915/display/intel_display_trace.o
CC drivers/gpu/drm/i915/display/intel_dkl_phy.o
CC drivers/gpu/drm/i915/display/intel_dp.o
CC drivers/gpu/drm/i915/display/intel_dp_aux.o
CC drivers/gpu/drm/i915/display/intel_dp_aux_backlight.o
CC drivers/gpu/drm/i915/display/intel_dp_hdcp.o
CC drivers/gpu/drm/i915/display/intel_dp_link_training.o
CC drivers/gpu/drm/i915/display/intel_dp_mst.o
CC drivers/gpu/drm/i915/display/intel_dp_test.o
CC drivers/gpu/drm/i915/display/intel_dsi.o
CC drivers/gpu/drm/i915/display/intel_dsi_dcs_backlight.o
CC drivers/gpu/drm/i915/display/intel_dsi_vbt.o
LD [M] drivers/gpu/drm/xe/xe.o
CC drivers/gpu/drm/i915/display/intel_dvo.o
CC drivers/gpu/drm/i915/display/intel_encoder.o
CC drivers/gpu/drm/i915/display/intel_gmbus.o
CC drivers/gpu/drm/i915/display/intel_hdmi.o
CC drivers/gpu/drm/i915/display/intel_lspcon.o
CC drivers/gpu/drm/i915/display/intel_lvds.o
CC drivers/gpu/drm/i915/display/intel_panel.o
CC drivers/gpu/drm/i915/display/intel_pps.o
CC drivers/gpu/drm/i915/display/intel_qp_tables.o
CC drivers/gpu/drm/i915/display/intel_sdvo.o
CC drivers/gpu/drm/i915/display/intel_snps_phy.o
CC drivers/gpu/drm/i915/display/intel_tv.o
CC drivers/gpu/drm/i915/display/intel_vdsc.o
CC drivers/gpu/drm/i915/display/intel_vrr.o
CC drivers/gpu/drm/i915/display/vlv_dsi.o
CC drivers/gpu/drm/i915/display/vlv_dsi_pll.o
CC drivers/gpu/drm/i915/i915_perf.o
CC drivers/gpu/drm/i915/pxp/intel_pxp.o
CC drivers/gpu/drm/i915/pxp/intel_pxp_huc.o
CC drivers/gpu/drm/i915/pxp/intel_pxp_tee.o
CC drivers/gpu/drm/i915/i915_gpu_error.o
CC drivers/gpu/drm/i915/i915_vgpu.o
AR drivers/gpu/drm/i915/built-in.a
AR drivers/gpu/drm/built-in.a
AR drivers/gpu/built-in.a
AR drivers/built-in.a
AR built-in.a
AR vmlinux.a
LD vmlinux.o
OBJCOPY modules.builtin.modinfo
GEN modules.builtin
MODPOST Module.symvers
CC .vmlinux.export.o
CC [M] fs/efivarfs/efivarfs.mod.o
CC [M] .module-common.o
CC [M] drivers/gpu/drm/drm_exec.mod.o
CC [M] drivers/gpu/drm/drm_gpuvm.mod.o
CC [M] drivers/gpu/drm/drm_suballoc_helper.mod.o
CC [M] drivers/gpu/drm/drm_ttm_helper.mod.o
CC [M] drivers/gpu/drm/scheduler/gpu-sched.mod.o
CC [M] drivers/gpu/drm/xe/xe.mod.o
CC [M] drivers/thermal/intel/x86_pkg_temp_thermal.mod.o
CC [M] sound/core/snd-hwdep.mod.o
CC [M] sound/core/snd-pcm.mod.o
CC [M] sound/pci/hda/snd-hda-codec.mod.o
CC [M] sound/pci/hda/snd-hda-codec-hdmi.mod.o
CC [M] sound/pci/hda/snd-hda-intel.mod.o
CC [M] sound/hda/snd-hda-core.mod.o
CC [M] sound/hda/snd-intel-dspcfg.mod.o
CC [M] sound/hda/snd-intel-sdw-acpi.mod.o
CC [M] net/netfilter/nf_log_syslog.mod.o
CC [M] net/netfilter/xt_mark.mod.o
CC [M] net/netfilter/xt_nat.mod.o
CC [M] net/netfilter/xt_LOG.mod.o
CC [M] net/netfilter/xt_MASQUERADE.mod.o
CC [M] net/netfilter/xt_addrtype.mod.o
CC [M] net/ipv4/netfilter/iptable_nat.mod.o
LD [M] drivers/gpu/drm/drm_exec.ko
LD [M] drivers/gpu/drm/drm_gpuvm.ko
LD [M] drivers/gpu/drm/drm_suballoc_helper.ko
LD [M] drivers/gpu/drm/drm_ttm_helper.ko
LD [M] drivers/gpu/drm/scheduler/gpu-sched.ko
LD [M] drivers/gpu/drm/xe/xe.ko
LD [M] drivers/thermal/intel/x86_pkg_temp_thermal.ko
LD [M] sound/core/snd-hwdep.ko
LD [M] sound/core/snd-pcm.ko
LD [M] sound/pci/hda/snd-hda-codec.ko
LD [M] sound/hda/snd-hda-core.ko
LD [M] sound/hda/snd-intel-dspcfg.ko
LD [M] sound/hda/snd-intel-sdw-acpi.ko
LD [M] net/netfilter/xt_mark.ko
LD [M] net/netfilter/xt_LOG.ko
LD [M] net/netfilter/xt_MASQUERADE.ko
LD [M] net/netfilter/xt_addrtype.ko
LD [M] net/ipv4/netfilter/iptable_nat.ko
LD [M] sound/pci/hda/snd-hda-intel.ko
LD [M] net/netfilter/nf_log_syslog.ko
LD [M] sound/pci/hda/snd-hda-codec-hdmi.ko
LD [M] fs/efivarfs/efivarfs.ko
LD [M] net/netfilter/xt_nat.ko
UPD include/generated/utsversion.h
CC init/version-timestamp.o
KSYMS .tmp_vmlinux0.kallsyms.S
AS .tmp_vmlinux0.kallsyms.o
LD .tmp_vmlinux1
NM .tmp_vmlinux1.syms
KSYMS .tmp_vmlinux1.kallsyms.S
AS .tmp_vmlinux1.kallsyms.o
LD .tmp_vmlinux2
NM .tmp_vmlinux2.syms
KSYMS .tmp_vmlinux2.kallsyms.S
AS .tmp_vmlinux2.kallsyms.o
LD vmlinux
NM System.map
SORTTAB vmlinux
RELOCS arch/x86/boot/compressed/vmlinux.relocs
RSTRIP vmlinux
CC arch/x86/boot/a20.o
AS arch/x86/boot/bioscall.o
CC arch/x86/boot/cmdline.o
AS arch/x86/boot/copy.o
HOSTCC arch/x86/boot/mkcpustr
CC arch/x86/boot/cpuflags.o
CC arch/x86/boot/cpucheck.o
CC arch/x86/boot/early_serial_console.o
CC arch/x86/boot/edd.o
CC arch/x86/boot/main.o
CC arch/x86/boot/memory.o
CC arch/x86/boot/pm.o
AS arch/x86/boot/pmjump.o
CC arch/x86/boot/regs.o
CC arch/x86/boot/printf.o
CC arch/x86/boot/string.o
CC arch/x86/boot/tty.o
CC arch/x86/boot/video.o
CC arch/x86/boot/video-mode.o
CC arch/x86/boot/version.o
CC arch/x86/boot/video-vga.o
CC arch/x86/boot/video-vesa.o
CC arch/x86/boot/video-bios.o
HOSTCC arch/x86/boot/tools/build
LDS arch/x86/boot/compressed/vmlinux.lds
AS arch/x86/boot/compressed/kernel_info.o
AS arch/x86/boot/compressed/head_32.o
VOFFSET arch/x86/boot/compressed/../voffset.h
CPUSTR arch/x86/boot/cpustr.h
CC arch/x86/boot/compressed/string.o
CC arch/x86/boot/compressed/cmdline.o
CC arch/x86/boot/compressed/error.o
OBJCOPY arch/x86/boot/compressed/vmlinux.bin
CC arch/x86/boot/cpu.o
HOSTCC arch/x86/boot/compressed/mkpiggy
CC arch/x86/boot/compressed/cpuflags.o
CC arch/x86/boot/compressed/early_serial_console.o
CC arch/x86/boot/compressed/kaslr.o
CC arch/x86/boot/compressed/acpi.o
CC arch/x86/boot/compressed/efi.o
GZIP arch/x86/boot/compressed/vmlinux.bin.gz
CC arch/x86/boot/compressed/misc.o
MKPIGGY arch/x86/boot/compressed/piggy.S
AS arch/x86/boot/compressed/piggy.o
LD arch/x86/boot/compressed/vmlinux
ZOFFSET arch/x86/boot/zoffset.h
OBJCOPY arch/x86/boot/vmlinux.bin
AS arch/x86/boot/header.o
LD arch/x86/boot/setup.elf
OBJCOPY arch/x86/boot/setup.bin
BUILD arch/x86/boot/bzImage
Kernel: arch/x86/boot/bzImage is ready (#1)
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
date: invalid date ‘+%s’
drivers/gpu/drm/xe/xe_device_types.h:617: warning: Function parameter or struct member 'eudebug' not described in 'xe_device'
drivers/gpu/drm/xe/xe_device_types.h:617: warning: Excess struct member 'xa' description in 'xe_device'
drivers/gpu/drm/xe/xe_device_types.h:617: warning: Excess struct member 'lock' description in 'xe_device'
drivers/gpu/drm/xe/xe_device_types.h:617: warning: Excess struct member 'list' description in 'xe_device'
drivers/gpu/drm/xe/xe_device_types.h:617: warning: Excess struct member 'session_count' description in 'xe_device'
drivers/gpu/drm/xe/xe_device_types.h:617: warning: Excess struct member 'available' description in 'xe_device'
drivers/gpu/drm/xe/xe_device_types.h:617: warning: Excess struct member 'enable' description in 'xe_device'
drivers/gpu/drm/xe/xe_device_types.h:617: warning: Excess struct member 'attention_scan' description in 'xe_device'
drivers/gpu/drm/xe/xe_device_types.h:687: warning: Function parameter or struct member 'eudebug' not described in 'xe_file'
drivers/gpu/drm/xe/xe_device_types.h:687: warning: Excess struct member 'client_link' description in 'xe_file'
drivers/gpu/drm/xe/xe_device_types.h:687: warning: Excess struct member 'xa' description in 'xe_file'
drivers/gpu/drm/xe/xe_device_types.h:687: warning: Excess struct member 'lock' description in 'xe_file'
drivers/gpu/drm/xe/xe_lrc.c:1026: warning: Function parameter or struct member 'flags' not described in 'xe_lrc_create'
drivers/gpu/drm/xe/xe_gt_debug.c:126: warning: Function parameter or struct member 'bits' not described in 'xe_gt_eu_attention_bitmap'
drivers/gpu/drm/xe/xe_gt_debug.c:126: warning: Function parameter or struct member 'bitmap_size' not described in 'xe_gt_eu_attention_bitmap'
drivers/gpu/drm/xe/xe_eudebug_types.h:56: warning: Function parameter or struct member 'rh' not described in 'xe_eudebug_resource'
drivers/gpu/drm/xe/xe_eudebug_types.h:171: warning: Function parameter or struct member 'connection' not described in 'xe_eudebug'
drivers/gpu/drm/xe/xe_eudebug_types.h:171: warning: Function parameter or struct member 'eu_lock' not described in 'xe_eudebug'
drivers/gpu/drm/xe/xe_eudebug_types.h:171: warning: Function parameter or struct member 'acks' not described in 'xe_eudebug'
drivers/gpu/drm/xe/xe_eudebug_types.h:171: warning: Function parameter or struct member 'ops' not described in 'xe_eudebug'
drivers/gpu/drm/xe/xe_eudebug_types.h:171: warning: Function parameter or struct member 'pf_lock' not described in 'xe_eudebug'
drivers/gpu/drm/xe/xe_eudebug_types.h:171: warning: Function parameter or struct member 'pagefaults' not described in 'xe_eudebug'
drivers/gpu/drm/xe/xe_eudebug_types.h:171: warning: Function parameter or struct member 'pagefault_fence' not described in 'xe_eudebug'
drivers/gpu/drm/xe/xe_eudebug_types.h:171: warning: Excess struct member 'status' description in 'xe_eudebug'
drivers/gpu/drm/xe/xe_eudebug_types.h:171: warning: Excess struct member 'lock' description in 'xe_eudebug'
drivers/gpu/drm/xe/xe_eudebug_types.h:171: warning: Excess struct member 'lock' description in 'xe_eudebug'
drivers/gpu/drm/xe/xe_eudebug_types.h:171: warning: Excess struct member 'fifo' description in 'xe_eudebug'
drivers/gpu/drm/xe/xe_eudebug_types.h:171: warning: Excess struct member 'write_done' description in 'xe_eudebug'
drivers/gpu/drm/xe/xe_eudebug_types.h:171: warning: Excess struct member 'read_done' description in 'xe_eudebug'
drivers/gpu/drm/xe/xe_eudebug_types.h:171: warning: Excess struct member 'event_seqno' description in 'xe_eudebug'
drivers/gpu/drm/xe/xe_eudebug_types.h:171: warning: Excess struct member 'lock' description in 'xe_eudebug'
drivers/gpu/drm/xe/xe_eudebug_types.h:251: warning: Function parameter or struct member 'engine_class' not described in 'xe_eudebug_event_exec_queue'
drivers/gpu/drm/xe/xe_eudebug_types.h:251: warning: Function parameter or struct member 'lrc_handle' not described in 'xe_eudebug_event_exec_queue'
drivers/gpu/drm/xe/xe_eudebug_types.h:251: warning: Excess struct member 'engine_handle' description in 'xe_eudebug_event_exec_queue'
drivers/gpu/drm/xe/xe_eudebug_types.h:251: warning: Excess struct member 'lrc_handles' description in 'xe_eudebug_event_exec_queue'
drivers/gpu/drm/xe/xe_eudebug_types.h:294: warning: Function parameter or struct member 'client_handle' not described in 'xe_eudebug_event_vm_bind'
drivers/gpu/drm/xe/xe_eudebug_types.h:294: warning: Function parameter or struct member 'vm_handle' not described in 'xe_eudebug_event_vm_bind'
drivers/gpu/drm/xe/xe_eudebug_types.h:294: warning: Function parameter or struct member 'flags' not described in 'xe_eudebug_event_vm_bind'
drivers/gpu/drm/xe/xe_eudebug_types.h:294: warning: Function parameter or struct member 'num_binds' not described in 'xe_eudebug_event_vm_bind'
39 warnings as Errors
run-parts: /workspace/ci/hooks/20-kernel-doc exited with return code 123
^ permalink raw reply [flat|nested] 28+ messages in thread* ✓ CI.checksparse: success for Support EU online debug on pagefault
2024-10-21 9:58 [RFC 00/19] Support EU online debug on pagefault Gwan-gyeong Mun
` (23 preceding siblings ...)
2024-10-21 10:23 ` ✗ CI.Hooks: failure " Patchwork
@ 2024-10-21 10:25 ` Patchwork
2024-10-21 10:45 ` ✓ CI.BAT: " Patchwork
25 siblings, 0 replies; 28+ messages in thread
From: Patchwork @ 2024-10-21 10:25 UTC (permalink / raw)
To: Gwan-gyeong Mun; +Cc: intel-xe
== Series Details ==
Series: Support EU online debug on pagefault
URL : https://patchwork.freedesktop.org/series/140239/
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 784111a40e40a37100e61736dd137c72cedbdb39
/root/linux/maintainer-tools/dim: line 2068: sparse: command not found
Sparse version:
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] 28+ messages in thread* ✓ CI.BAT: success for Support EU online debug on pagefault
2024-10-21 9:58 [RFC 00/19] Support EU online debug on pagefault Gwan-gyeong Mun
` (24 preceding siblings ...)
2024-10-21 10:25 ` ✓ CI.checksparse: success " Patchwork
@ 2024-10-21 10:45 ` Patchwork
25 siblings, 0 replies; 28+ messages in thread
From: Patchwork @ 2024-10-21 10:45 UTC (permalink / raw)
To: Gwan-gyeong Mun; +Cc: intel-xe
[-- Attachment #1: Type: text/plain, Size: 4650 bytes --]
== Series Details ==
Series: Support EU online debug on pagefault
URL : https://patchwork.freedesktop.org/series/140239/
State : success
== Summary ==
CI Bug Log - changes from xe-2103-784111a40e40a37100e61736dd137c72cedbdb39_BAT -> xe-pw-140239v1_BAT
====================================================
Summary
-------
**SUCCESS**
No regressions found.
Participating hosts (9 -> 9)
------------------------------
No changes in participating hosts
Known issues
------------
Here are the changes found in xe-pw-140239v1_BAT that come from known issues:
### IGT changes ###
#### Issues hit ####
* igt@kms_frontbuffer_tracking@basic:
- bat-adlp-7: [PASS][1] -> [FAIL][2] ([Intel XE#1861])
[1]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2103-784111a40e40a37100e61736dd137c72cedbdb39/bat-adlp-7/igt@kms_frontbuffer_tracking@basic.html
[2]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-140239v1/bat-adlp-7/igt@kms_frontbuffer_tracking@basic.html
* igt@xe_exec_compute_mode@twice-userptr-invalidate:
- bat-lnl-1: [PASS][3] -> [FAIL][4] ([Intel XE#2754])
[3]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2103-784111a40e40a37100e61736dd137c72cedbdb39/bat-lnl-1/igt@xe_exec_compute_mode@twice-userptr-invalidate.html
[4]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-140239v1/bat-lnl-1/igt@xe_exec_compute_mode@twice-userptr-invalidate.html
#### Warnings ####
* igt@xe_pat@pat-index-xe2:
- bat-atsm-2: [SKIP][5] ([Intel XE#977]) -> [SKIP][6] ([Intel XE#2839] / [Intel XE#977])
[5]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2103-784111a40e40a37100e61736dd137c72cedbdb39/bat-atsm-2/igt@xe_pat@pat-index-xe2.html
[6]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-140239v1/bat-atsm-2/igt@xe_pat@pat-index-xe2.html
- bat-adlp-vf: [SKIP][7] ([Intel XE#977]) -> [SKIP][8] ([Intel XE#2839] / [Intel XE#977])
[7]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2103-784111a40e40a37100e61736dd137c72cedbdb39/bat-adlp-vf/igt@xe_pat@pat-index-xe2.html
[8]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-140239v1/bat-adlp-vf/igt@xe_pat@pat-index-xe2.html
- bat-adlp-7: [SKIP][9] ([Intel XE#977]) -> [SKIP][10] ([Intel XE#2839] / [Intel XE#977])
[9]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2103-784111a40e40a37100e61736dd137c72cedbdb39/bat-adlp-7/igt@xe_pat@pat-index-xe2.html
[10]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-140239v1/bat-adlp-7/igt@xe_pat@pat-index-xe2.html
- bat-dg2-oem2: [SKIP][11] ([Intel XE#977]) -> [SKIP][12] ([Intel XE#2839] / [Intel XE#977])
[11]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2103-784111a40e40a37100e61736dd137c72cedbdb39/bat-dg2-oem2/igt@xe_pat@pat-index-xe2.html
[12]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-140239v1/bat-dg2-oem2/igt@xe_pat@pat-index-xe2.html
* igt@xe_pat@pat-index-xelp:
- bat-bmg-1: [SKIP][13] ([Intel XE#2245]) -> [SKIP][14] ([Intel XE#2237] / [Intel XE#2245])
[13]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2103-784111a40e40a37100e61736dd137c72cedbdb39/bat-bmg-1/igt@xe_pat@pat-index-xelp.html
[14]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-140239v1/bat-bmg-1/igt@xe_pat@pat-index-xelp.html
- bat-lnl-2: [SKIP][15] ([Intel XE#977]) -> [SKIP][16] ([Intel XE#2237] / [Intel XE#977])
[15]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2103-784111a40e40a37100e61736dd137c72cedbdb39/bat-lnl-2/igt@xe_pat@pat-index-xelp.html
[16]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-140239v1/bat-lnl-2/igt@xe_pat@pat-index-xelp.html
{name}: This element is suppressed. This means it is ignored when computing
the status of the difference (SUCCESS, WARNING, or FAILURE).
[Intel XE#1861]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1861
[Intel XE#2237]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2237
[Intel XE#2245]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2245
[Intel XE#2754]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2754
[Intel XE#2839]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2839
[Intel XE#977]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/977
Build changes
-------------
* Linux: xe-2103-784111a40e40a37100e61736dd137c72cedbdb39 -> xe-pw-140239v1
IGT_8080: 20fcbc59241a16c84d12f4f6ba390fb46fd65a36 @ https://gitlab.freedesktop.org/drm/igt-gpu-tools.git
xe-2103-784111a40e40a37100e61736dd137c72cedbdb39: 784111a40e40a37100e61736dd137c72cedbdb39
xe-pw-140239v1: 140239v1
== Logs ==
For more details see: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-140239v1/index.html
[-- Attachment #2: Type: text/html, Size: 6277 bytes --]
^ permalink raw reply [flat|nested] 28+ messages in thread