drm/xe/pxp: Add PXP debugfs support
authorDaniele Ceraolo Spurio <daniele.ceraolospurio@intel.com>
Wed, 29 Jan 2025 17:41:36 +0000 (09:41 -0800)
committerDaniele Ceraolo Spurio <daniele.ceraolospurio@intel.com>
Mon, 3 Feb 2025 19:51:28 +0000 (11:51 -0800)
This patch introduces 2 PXP debugfs entries:

- info: prints the current PXP status and key instance
- terminate: simulate a termination interrupt

The first one is useful for debug, while the second one can be used for
testing the termination flow.

v2: move the info prints inside the lock (John)

Signed-off-by: Daniele Ceraolo Spurio <daniele.ceraolospurio@intel.com>
Cc: John Harrison <John.C.Harrison@Intel.com>
Reviewed-by: John Harrison <John.C.Harrison@Intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20250129174140.948829-13-daniele.ceraolospurio@intel.com
drivers/gpu/drm/xe/Makefile
drivers/gpu/drm/xe/xe_debugfs.c
drivers/gpu/drm/xe/xe_pxp_debugfs.c [new file with mode: 0644]
drivers/gpu/drm/xe/xe_pxp_debugfs.h [new file with mode: 0644]

index 720d13c16fa543fa0313aec6594fc86e0d354f25..be73362ef334ed131df0f0c5f2db665956451dfc 100644 (file)
@@ -88,6 +88,7 @@ xe-y += xe_bb.o \
        xe_pt.o \
        xe_pt_walk.o \
        xe_pxp.o \
+       xe_pxp_debugfs.o \
        xe_pxp_submit.o \
        xe_query.o \
        xe_range_fence.o \
index 492b4877433f1678eef10440ef9d6259561eddf5..56cb3788e75234bffabde9184bb261af720bf8a9 100644 (file)
@@ -18,6 +18,7 @@
 #include "xe_gt_printk.h"
 #include "xe_guc_ads.h"
 #include "xe_pm.h"
+#include "xe_pxp_debugfs.h"
 #include "xe_sriov.h"
 #include "xe_step.h"
 
@@ -230,5 +231,7 @@ void xe_debugfs_register(struct xe_device *xe)
        for_each_gt(gt, xe, id)
                xe_gt_debugfs_register(gt);
 
+       xe_pxp_debugfs_register(xe->pxp);
+
        fault_create_debugfs_attr("fail_gt_reset", root, &gt_reset_failure);
 }
diff --git a/drivers/gpu/drm/xe/xe_pxp_debugfs.c b/drivers/gpu/drm/xe/xe_pxp_debugfs.c
new file mode 100644 (file)
index 0000000..ccfbacf
--- /dev/null
@@ -0,0 +1,120 @@
+// SPDX-License-Identifier: MIT
+/*
+ * Copyright © 2024 Intel Corporation
+ */
+
+#include "xe_pxp_debugfs.h"
+
+#include <linux/debugfs.h>
+
+#include <drm/drm_debugfs.h>
+#include <drm/drm_managed.h>
+#include <drm/drm_print.h>
+
+#include "xe_device.h"
+#include "xe_pxp.h"
+#include "xe_pxp_types.h"
+#include "regs/xe_irq_regs.h"
+
+static struct xe_pxp *node_to_pxp(struct drm_info_node *node)
+{
+       return node->info_ent->data;
+}
+
+static const char *pxp_status_to_str(struct xe_pxp *pxp)
+{
+       lockdep_assert_held(&pxp->mutex);
+
+       switch (pxp->status) {
+       case XE_PXP_ERROR:
+               return "error";
+       case XE_PXP_NEEDS_TERMINATION:
+               return "needs termination";
+       case XE_PXP_TERMINATION_IN_PROGRESS:
+               return "termination in progress";
+       case XE_PXP_READY_TO_START:
+               return "ready to start";
+       case XE_PXP_ACTIVE:
+               return "active";
+       case XE_PXP_SUSPENDED:
+               return "suspended";
+       default:
+               return "unknown";
+       }
+};
+
+static int pxp_info(struct seq_file *m, void *data)
+{
+       struct xe_pxp *pxp = node_to_pxp(m->private);
+       struct drm_printer p = drm_seq_file_printer(m);
+       const char *status;
+
+       if (!xe_pxp_is_enabled(pxp))
+               return -ENODEV;
+
+       mutex_lock(&pxp->mutex);
+       status = pxp_status_to_str(pxp);
+
+       drm_printf(&p, "status: %s\n", status);
+       drm_printf(&p, "instance counter: %u\n", pxp->key_instance);
+       mutex_unlock(&pxp->mutex);
+
+       return 0;
+}
+
+static int pxp_terminate(struct seq_file *m, void *data)
+{
+       struct xe_pxp *pxp = node_to_pxp(m->private);
+       struct drm_printer p = drm_seq_file_printer(m);
+
+       if (!xe_pxp_is_enabled(pxp))
+               return -ENODEV;
+
+       /* simulate a termination interrupt */
+       spin_lock_irq(&pxp->xe->irq.lock);
+       xe_pxp_irq_handler(pxp->xe, KCR_PXP_STATE_TERMINATED_INTERRUPT);
+       spin_unlock_irq(&pxp->xe->irq.lock);
+
+       drm_printf(&p, "PXP termination queued\n");
+
+       return 0;
+}
+
+static const struct drm_info_list debugfs_list[] = {
+       {"info", pxp_info, 0},
+       {"terminate", pxp_terminate, 0},
+};
+
+void xe_pxp_debugfs_register(struct xe_pxp *pxp)
+{
+       struct drm_minor *minor;
+       struct drm_info_list *local;
+       struct dentry *root;
+       int i;
+
+       if (!xe_pxp_is_enabled(pxp))
+               return;
+
+       minor = pxp->xe->drm.primary;
+       if (!minor->debugfs_root)
+               return;
+
+#define DEBUGFS_SIZE   (ARRAY_SIZE(debugfs_list) * sizeof(struct drm_info_list))
+       local = drmm_kmalloc(&pxp->xe->drm, DEBUGFS_SIZE, GFP_KERNEL);
+       if (!local)
+               return;
+
+       memcpy(local, debugfs_list, DEBUGFS_SIZE);
+#undef DEBUGFS_SIZE
+
+       for (i = 0; i < ARRAY_SIZE(debugfs_list); ++i)
+               local[i].data = pxp;
+
+       root = debugfs_create_dir("pxp", minor->debugfs_root);
+       if (IS_ERR(root))
+               return;
+
+       drm_debugfs_create_files(local,
+                                ARRAY_SIZE(debugfs_list),
+                                root, minor);
+}
diff --git a/drivers/gpu/drm/xe/xe_pxp_debugfs.h b/drivers/gpu/drm/xe/xe_pxp_debugfs.h
new file mode 100644 (file)
index 0000000..988466a
--- /dev/null
@@ -0,0 +1,13 @@
+/* SPDX-License-Identifier: MIT */
+/*
+ * Copyright © 2024 Intel Corporation
+ */
+
+#ifndef __XE_PXP_DEBUGFS_H__
+#define __XE_PXP_DEBUGFS_H__
+
+struct xe_pxp;
+
+void xe_pxp_debugfs_register(struct xe_pxp *pxp);
+
+#endif /* __XE_PXP_DEBUGFS_H__ */