mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2025-09-01 01:04:36 +00:00
drm/xe/pxp: Add PXP debugfs support
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
This commit is contained in:
parent
51462211f4
commit
385a8015b2
@ -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 \
|
||||
|
@ -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, >_reset_failure);
|
||||
}
|
||||
|
120
drivers/gpu/drm/xe/xe_pxp_debugfs.c
Normal file
120
drivers/gpu/drm/xe/xe_pxp_debugfs.c
Normal file
@ -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);
|
||||
}
|
13
drivers/gpu/drm/xe/xe_pxp_debugfs.h
Normal file
13
drivers/gpu/drm/xe/xe_pxp_debugfs.h
Normal file
@ -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__ */
|
Loading…
Reference in New Issue
Block a user