Commit 293a5548 authored by Daniele Ceraolo Spurio's avatar Daniele Ceraolo Spurio Committed by Chris Wilson

drm/i915/uc: Move uC debugfs to its own folder under GT

uC is a component of the GT, so it makes sense for the uC debugfs files
to be in the GT folder. A subfolder has been used to keep the same
structure we have for the code.

v2: use intel_* prefix (Jani), rebase on new gt_debugfs_register_files,
    fix permissions for writable debugfs files.

v3: Rename files (Michal), remove blank line (Jani), fix sparse warns.
Signed-off-by: default avatarDaniele Ceraolo Spurio <daniele.ceraolospurio@intel.com>
Cc: Andi Shyti <andi.shyti@intel.com>
Cc: Michal Wajdeczko <michal.wajdeczko@intel.com>
Cc: John Harrison <John.C.Harrison@Intel.com>
Cc: Matthew Brost <matthew.brost@intel.com>
Cc: Tony Ye <tony.ye@intel.com>
Cc: Jani Nikula <jani.nikula@linux.intel.com>
Reviewed-by: Andi Shyti <andi.shyti@intel.com> #v2
Signed-off-by: default avatarChris Wilson <chris@chris-wilson.co.uk>
Link: https://patchwork.freedesktop.org/patch/msgid/20200326181121.16869-6-daniele.ceraolospurio@intel.com
parent 34904bd6
...@@ -167,14 +167,18 @@ i915-y += \ ...@@ -167,14 +167,18 @@ i915-y += \
# general-purpose microcontroller (GuC) support # general-purpose microcontroller (GuC) support
i915-y += gt/uc/intel_uc.o \ i915-y += gt/uc/intel_uc.o \
gt/uc/intel_uc_debugfs.o \
gt/uc/intel_uc_fw.o \ gt/uc/intel_uc_fw.o \
gt/uc/intel_guc.o \ gt/uc/intel_guc.o \
gt/uc/intel_guc_ads.o \ gt/uc/intel_guc_ads.o \
gt/uc/intel_guc_ct.o \ gt/uc/intel_guc_ct.o \
gt/uc/intel_guc_debugfs.o \
gt/uc/intel_guc_fw.o \ gt/uc/intel_guc_fw.o \
gt/uc/intel_guc_log.o \ gt/uc/intel_guc_log.o \
gt/uc/intel_guc_log_debugfs.o \
gt/uc/intel_guc_submission.o \ gt/uc/intel_guc_submission.o \
gt/uc/intel_huc.o \ gt/uc/intel_huc.o \
gt/uc/intel_huc_debugfs.o \
gt/uc/intel_huc_fw.o gt/uc/intel_huc_fw.o
# modesetting core code # modesetting core code
......
...@@ -9,6 +9,7 @@ ...@@ -9,6 +9,7 @@
#include "debugfs_engines.h" #include "debugfs_engines.h"
#include "debugfs_gt.h" #include "debugfs_gt.h"
#include "debugfs_gt_pm.h" #include "debugfs_gt_pm.h"
#include "uc/intel_uc_debugfs.h"
#include "i915_drv.h" #include "i915_drv.h"
void debugfs_gt_register(struct intel_gt *gt) void debugfs_gt_register(struct intel_gt *gt)
...@@ -24,6 +25,8 @@ void debugfs_gt_register(struct intel_gt *gt) ...@@ -24,6 +25,8 @@ void debugfs_gt_register(struct intel_gt *gt)
debugfs_engines_register(gt, root); debugfs_engines_register(gt, root);
debugfs_gt_pm_register(gt, root); debugfs_gt_pm_register(gt, root);
intel_uc_debugfs_register(&gt->uc, root);
} }
void intel_gt_debugfs_register_files(struct dentry *root, void intel_gt_debugfs_register_files(struct dentry *root,
...@@ -31,9 +34,10 @@ void intel_gt_debugfs_register_files(struct dentry *root, ...@@ -31,9 +34,10 @@ void intel_gt_debugfs_register_files(struct dentry *root,
unsigned long count, void *data) unsigned long count, void *data)
{ {
while (count--) { while (count--) {
umode_t mode = files->fops->write ? 0644 : 0444;
if (!files->eval || files->eval(data)) if (!files->eval || files->eval(data))
debugfs_create_file(files->name, debugfs_create_file(files->name,
0444, root, data, mode, root, data,
files->fops); files->fops);
files++; files++;
......
...@@ -74,6 +74,11 @@ struct intel_guc { ...@@ -74,6 +74,11 @@ struct intel_guc {
struct mutex send_mutex; struct mutex send_mutex;
}; };
static inline struct intel_guc *log_to_guc(struct intel_guc_log *log)
{
return container_of(log, struct intel_guc, log);
}
static static
inline int intel_guc_send(struct intel_guc *guc, const u32 *action, u32 len) inline int intel_guc_send(struct intel_guc *guc, const u32 *action, u32 len)
{ {
......
// SPDX-License-Identifier: MIT
/*
* Copyright © 2020 Intel Corporation
*/
#include <drm/drm_print.h>
#include "gt/debugfs_gt.h"
#include "intel_guc.h"
#include "intel_guc_debugfs.h"
#include "intel_guc_log_debugfs.h"
static int guc_info_show(struct seq_file *m, void *data)
{
struct intel_guc *guc = m->private;
struct drm_printer p = drm_seq_file_printer(m);
if (!intel_guc_is_supported(guc))
return -ENODEV;
intel_guc_load_status(guc, &p);
drm_puts(&p, "\n");
intel_guc_log_info(&guc->log, &p);
/* Add more as required ... */
return 0;
}
DEFINE_GT_DEBUGFS_ATTRIBUTE(guc_info);
void intel_guc_debugfs_register(struct intel_guc *guc, struct dentry *root)
{
static const struct debugfs_gt_file files[] = {
{ "guc_info", &guc_info_fops, NULL },
};
if (!intel_guc_is_supported(guc))
return;
intel_gt_debugfs_register_files(root, files, ARRAY_SIZE(files), guc);
intel_guc_log_debugfs_register(&guc->log, root);
}
/* SPDX-License-Identifier: MIT */
/*
* Copyright © 2020 Intel Corporation
*/
#ifndef DEBUGFS_GUC_H
#define DEBUGFS_GUC_H
struct intel_guc;
struct dentry;
void intel_guc_debugfs_register(struct intel_guc *guc, struct dentry *root);
#endif /* DEBUGFS_GUC_H */
...@@ -55,11 +55,6 @@ static int guc_action_control_log(struct intel_guc *guc, bool enable, ...@@ -55,11 +55,6 @@ static int guc_action_control_log(struct intel_guc *guc, bool enable,
return intel_guc_send(guc, action, ARRAY_SIZE(action)); return intel_guc_send(guc, action, ARRAY_SIZE(action));
} }
static inline struct intel_guc *log_to_guc(struct intel_guc_log *log)
{
return container_of(log, struct intel_guc, log);
}
static void guc_log_enable_flush_events(struct intel_guc_log *log) static void guc_log_enable_flush_events(struct intel_guc_log *log)
{ {
intel_guc_enable_msg(log_to_guc(log), intel_guc_enable_msg(log_to_guc(log),
......
// SPDX-License-Identifier: MIT
/*
* Copyright © 2020 Intel Corporation
*/
#include <linux/fs.h>
#include <drm/drm_print.h>
#include "gt/debugfs_gt.h"
#include "intel_guc.h"
#include "intel_guc_log.h"
#include "intel_guc_log_debugfs.h"
static int guc_log_dump_show(struct seq_file *m, void *data)
{
struct drm_printer p = drm_seq_file_printer(m);
return intel_guc_log_dump(m->private, &p, false);
}
DEFINE_GT_DEBUGFS_ATTRIBUTE(guc_log_dump);
static int guc_load_err_log_dump_show(struct seq_file *m, void *data)
{
struct drm_printer p = drm_seq_file_printer(m);
return intel_guc_log_dump(m->private, &p, true);
}
DEFINE_GT_DEBUGFS_ATTRIBUTE(guc_load_err_log_dump);
static int guc_log_level_get(void *data, u64 *val)
{
struct intel_guc_log *log = data;
if (!intel_guc_is_used(log_to_guc(log)))
return -ENODEV;
*val = intel_guc_log_get_level(log);
return 0;
}
static int guc_log_level_set(void *data, u64 val)
{
struct intel_guc_log *log = data;
if (!intel_guc_is_used(log_to_guc(log)))
return -ENODEV;
return intel_guc_log_set_level(log, val);
}
DEFINE_SIMPLE_ATTRIBUTE(guc_log_level_fops,
guc_log_level_get, guc_log_level_set,
"%lld\n");
static int guc_log_relay_open(struct inode *inode, struct file *file)
{
struct intel_guc_log *log = inode->i_private;
if (!intel_guc_is_ready(log_to_guc(log)))
return -ENODEV;
file->private_data = log;
return intel_guc_log_relay_open(log);
}
static ssize_t
guc_log_relay_write(struct file *filp,
const char __user *ubuf,
size_t cnt,
loff_t *ppos)
{
struct intel_guc_log *log = filp->private_data;
int val;
int ret;
ret = kstrtoint_from_user(ubuf, cnt, 0, &val);
if (ret < 0)
return ret;
/*
* Enable and start the guc log relay on value of 1.
* Flush log relay for any other value.
*/
if (val == 1)
ret = intel_guc_log_relay_start(log);
else
intel_guc_log_relay_flush(log);
return ret ?: cnt;
}
static int guc_log_relay_release(struct inode *inode, struct file *file)
{
struct intel_guc_log *log = inode->i_private;
intel_guc_log_relay_close(log);
return 0;
}
static const struct file_operations guc_log_relay_fops = {
.owner = THIS_MODULE,
.open = guc_log_relay_open,
.write = guc_log_relay_write,
.release = guc_log_relay_release,
};
void intel_guc_log_debugfs_register(struct intel_guc_log *log,
struct dentry *root)
{
static const struct debugfs_gt_file files[] = {
{ "guc_log_dump", &guc_log_dump_fops, NULL },
{ "guc_load_err_log_dump", &guc_load_err_log_dump_fops, NULL },
{ "guc_log_level", &guc_log_level_fops, NULL },
{ "guc_log_relay", &guc_log_relay_fops, NULL },
};
if (!intel_guc_is_supported(log_to_guc(log)))
return;
intel_gt_debugfs_register_files(root, files, ARRAY_SIZE(files), log);
}
/* SPDX-License-Identifier: MIT */
/*
* Copyright © 2020 Intel Corporation
*/
#ifndef DEBUGFS_GUC_LOG_H
#define DEBUGFS_GUC_LOG_H
struct intel_guc_log;
struct dentry;
void intel_guc_log_debugfs_register(struct intel_guc_log *log,
struct dentry *root);
#endif /* DEBUGFS_GUC_LOG_H */
// SPDX-License-Identifier: MIT
/*
* Copyright © 2020 Intel Corporation
*/
#include <drm/drm_print.h>
#include "gt/debugfs_gt.h"
#include "intel_huc.h"
#include "intel_huc_debugfs.h"
static int huc_info_show(struct seq_file *m, void *data)
{
struct intel_huc *huc = m->private;
struct drm_printer p = drm_seq_file_printer(m);
if (!intel_huc_is_supported(huc))
return -ENODEV;
intel_huc_load_status(huc, &p);
return 0;
}
DEFINE_GT_DEBUGFS_ATTRIBUTE(huc_info);
void intel_huc_debugfs_register(struct intel_huc *huc, struct dentry *root)
{
static const struct debugfs_gt_file files[] = {
{ "huc_info", &huc_info_fops, NULL },
};
if (!intel_huc_is_supported(huc))
return;
intel_gt_debugfs_register_files(root, files, ARRAY_SIZE(files), huc);
}
/* SPDX-License-Identifier: MIT */
/*
* Copyright © 2020 Intel Corporation
*/
#ifndef DEBUGFS_HUC_H
#define DEBUGFS_HUC_H
struct intel_huc;
struct dentry;
void intel_huc_debugfs_register(struct intel_huc *huc, struct dentry *root);
#endif /* DEBUGFS_HUC_H */
// SPDX-License-Identifier: MIT
/*
* Copyright © 2020 Intel Corporation
*/
#include <linux/debugfs.h>
#include "intel_guc_debugfs.h"
#include "intel_huc_debugfs.h"
#include "intel_uc.h"
#include "intel_uc_debugfs.h"
void intel_uc_debugfs_register(struct intel_uc *uc, struct dentry *gt_root)
{
struct dentry *root;
if (!gt_root)
return;
/* GuC and HuC go always in pair, no need to check both */
if (!intel_uc_supports_guc(uc))
return;
root = debugfs_create_dir("uc", gt_root);
if (IS_ERR(root))
return;
intel_guc_debugfs_register(&uc->guc, root);
intel_huc_debugfs_register(&uc->huc, root);
}
/* SPDX-License-Identifier: MIT */
/*
* Copyright © 2020 Intel Corporation
*/
#ifndef DEBUGFS_UC_H
#define DEBUGFS_UC_H
struct intel_uc;
struct dentry;
void intel_uc_debugfs_register(struct intel_uc *uc, struct dentry *gt_root);
#endif /* DEBUGFS_UC_H */
...@@ -37,7 +37,6 @@ ...@@ -37,7 +37,6 @@
#include "gt/intel_reset.h" #include "gt/intel_reset.h"
#include "gt/intel_rc6.h" #include "gt/intel_rc6.h"
#include "gt/intel_rps.h" #include "gt/intel_rps.h"
#include "gt/uc/intel_guc_submission.h"
#include "i915_debugfs.h" #include "i915_debugfs.h"
#include "i915_debugfs_params.h" #include "i915_debugfs_params.h"
...@@ -1251,136 +1250,6 @@ static int i915_llc(struct seq_file *m, void *data) ...@@ -1251,136 +1250,6 @@ static int i915_llc(struct seq_file *m, void *data)
return 0; return 0;
} }
static int i915_huc_info(struct seq_file *m, void *data)
{
struct drm_i915_private *dev_priv = node_to_i915(m->private);
struct intel_huc *huc = &dev_priv->gt.uc.huc;
struct drm_printer p = drm_seq_file_printer(m);
if (!intel_huc_is_supported(huc))
return -ENODEV;
intel_huc_load_status(huc, &p);
return 0;
}
static int i915_guc_info(struct seq_file *m, void *data)
{
struct drm_i915_private *dev_priv = node_to_i915(m->private);
struct intel_guc *guc = &dev_priv->gt.uc.guc;
struct drm_printer p = drm_seq_file_printer(m);
if (!intel_guc_is_supported(guc))
return -ENODEV;
intel_guc_load_status(guc, &p);
drm_puts(&p, "\n");
intel_guc_log_info(&guc->log, &p);
/* Add more as required ... */
return 0;
}
static int i915_guc_log_dump(struct seq_file *m, void *data)
{
struct drm_info_node *node = m->private;
struct drm_i915_private *dev_priv = node_to_i915(node);
struct intel_guc *guc = &dev_priv->gt.uc.guc;
bool dump_load_err = !!node->info_ent->data;
struct drm_printer p = drm_seq_file_printer(m);
if (!intel_guc_is_supported(guc))
return -ENODEV;
return intel_guc_log_dump(&guc->log, &p, dump_load_err);
}
static int i915_guc_log_level_get(void *data, u64 *val)
{
struct drm_i915_private *dev_priv = data;
struct intel_uc *uc = &dev_priv->gt.uc;
if (!intel_uc_uses_guc(uc))
return -ENODEV;
*val = intel_guc_log_get_level(&uc->guc.log);
return 0;
}
static int i915_guc_log_level_set(void *data, u64 val)
{
struct drm_i915_private *dev_priv = data;
struct intel_uc *uc = &dev_priv->gt.uc;
if (!intel_uc_uses_guc(uc))
return -ENODEV;
return intel_guc_log_set_level(&uc->guc.log, val);
}
DEFINE_SIMPLE_ATTRIBUTE(i915_guc_log_level_fops,
i915_guc_log_level_get, i915_guc_log_level_set,
"%lld\n");
static int i915_guc_log_relay_open(struct inode *inode, struct file *file)
{
struct drm_i915_private *i915 = inode->i_private;
struct intel_guc *guc = &i915->gt.uc.guc;
struct intel_guc_log *log = &guc->log;
if (!intel_guc_is_ready(guc))
return -ENODEV;
file->private_data = log;
return intel_guc_log_relay_open(log);
}
static ssize_t
i915_guc_log_relay_write(struct file *filp,
const char __user *ubuf,
size_t cnt,
loff_t *ppos)
{
struct intel_guc_log *log = filp->private_data;
int val;
int ret;
ret = kstrtoint_from_user(ubuf, cnt, 0, &val);
if (ret < 0)
return ret;
/*
* Enable and start the guc log relay on value of 1.
* Flush log relay for any other value.
*/
if (val == 1)
ret = intel_guc_log_relay_start(log);
else
intel_guc_log_relay_flush(log);
return ret ?: cnt;
}
static int i915_guc_log_relay_release(struct inode *inode, struct file *file)
{
struct drm_i915_private *i915 = inode->i_private;
struct intel_guc *guc = &i915->gt.uc.guc;
intel_guc_log_relay_close(&guc->log);
return 0;
}
static const struct file_operations i915_guc_log_relay_fops = {
.owner = THIS_MODULE,
.open = i915_guc_log_relay_open,
.write = i915_guc_log_relay_write,
.release = i915_guc_log_relay_release,
};
static int i915_runtime_pm_status(struct seq_file *m, void *unused) static int i915_runtime_pm_status(struct seq_file *m, void *unused)
{ {
struct drm_i915_private *dev_priv = node_to_i915(m->private); struct drm_i915_private *dev_priv = node_to_i915(m->private);
...@@ -1989,10 +1858,6 @@ static const struct drm_info_list i915_debugfs_list[] = { ...@@ -1989,10 +1858,6 @@ static const struct drm_info_list i915_debugfs_list[] = {
{"i915_gem_objects", i915_gem_object_info, 0}, {"i915_gem_objects", i915_gem_object_info, 0},
{"i915_gem_fence_regs", i915_gem_fence_regs_info, 0}, {"i915_gem_fence_regs", i915_gem_fence_regs_info, 0},
{"i915_gem_interrupt", i915_interrupt_info, 0}, {"i915_gem_interrupt", i915_interrupt_info, 0},
{"i915_guc_info", i915_guc_info, 0},
{"i915_guc_log_dump", i915_guc_log_dump, 0},
{"i915_guc_load_err_log_dump", i915_guc_log_dump, 0, (void *)1},
{"i915_huc_info", i915_huc_info, 0},
{"i915_frequency_info", i915_frequency_info, 0}, {"i915_frequency_info", i915_frequency_info, 0},
{"i915_ring_freq_table", i915_ring_freq_table, 0}, {"i915_ring_freq_table", i915_ring_freq_table, 0},
{"i915_context_status", i915_context_status, 0}, {"i915_context_status", i915_context_status, 0},
...@@ -2020,8 +1885,6 @@ static const struct i915_debugfs_files { ...@@ -2020,8 +1885,6 @@ static const struct i915_debugfs_files {
{"i915_error_state", &i915_error_state_fops}, {"i915_error_state", &i915_error_state_fops},
{"i915_gpu_info", &i915_gpu_info_fops}, {"i915_gpu_info", &i915_gpu_info_fops},
#endif #endif
{"i915_guc_log_level", &i915_guc_log_level_fops},
{"i915_guc_log_relay", &i915_guc_log_relay_fops},
}; };
int i915_debugfs_register(struct drm_i915_private *dev_priv) int i915_debugfs_register(struct drm_i915_private *dev_priv)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment