Message ID | 20200228022843.1936-6-daniele.ceraolospurio@intel.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | Re-org uC debugfs files and move them under GT | expand |
On Thu, 27 Feb 2020, Daniele Ceraolo Spurio <daniele.ceraolospurio@intel.com> wrote: > 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. > > Signed-off-by: Daniele 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> > --- > drivers/gpu/drm/i915/Makefile | 7 +- > drivers/gpu/drm/i915/gt/debugfs_gt.c | 3 + > drivers/gpu/drm/i915/gt/uc/debugfs_guc.c | 42 ++++++ > drivers/gpu/drm/i915/gt/uc/debugfs_guc.h | 14 ++ > drivers/gpu/drm/i915/gt/uc/debugfs_guc_log.c | 123 +++++++++++++++++ > drivers/gpu/drm/i915/gt/uc/debugfs_guc_log.h | 14 ++ > drivers/gpu/drm/i915/gt/uc/debugfs_huc.c | 36 +++++ > drivers/gpu/drm/i915/gt/uc/debugfs_huc.h | 14 ++ > drivers/gpu/drm/i915/gt/uc/debugfs_uc.c | 31 +++++ > drivers/gpu/drm/i915/gt/uc/debugfs_uc.h | 43 ++++++ > drivers/gpu/drm/i915/gt/uc/intel_guc.h | 5 + > drivers/gpu/drm/i915/gt/uc/intel_guc_log.c | 5 - > drivers/gpu/drm/i915/i915_debugfs.c | 137 ------------------- > 13 files changed, 331 insertions(+), 143 deletions(-) > create mode 100644 drivers/gpu/drm/i915/gt/uc/debugfs_guc.c > create mode 100644 drivers/gpu/drm/i915/gt/uc/debugfs_guc.h > create mode 100644 drivers/gpu/drm/i915/gt/uc/debugfs_guc_log.c > create mode 100644 drivers/gpu/drm/i915/gt/uc/debugfs_guc_log.h > create mode 100644 drivers/gpu/drm/i915/gt/uc/debugfs_huc.c > create mode 100644 drivers/gpu/drm/i915/gt/uc/debugfs_huc.h > create mode 100644 drivers/gpu/drm/i915/gt/uc/debugfs_uc.c > create mode 100644 drivers/gpu/drm/i915/gt/uc/debugfs_uc.h > > diff --git a/drivers/gpu/drm/i915/Makefile b/drivers/gpu/drm/i915/Makefile > index fe6d580869d7..c5cd9b1390e7 100644 > --- a/drivers/gpu/drm/i915/Makefile > +++ b/drivers/gpu/drm/i915/Makefile > @@ -164,7 +164,12 @@ i915-y += \ > intel_wopcm.o > > # general-purpose microcontroller (GuC) support > -i915-y += gt/uc/intel_uc.o \ > +i915-y += \ > + gt/uc/debugfs_guc.o \ > + gt/uc/debugfs_guc_log.o \ > + gt/uc/debugfs_huc.o \ > + gt/uc/debugfs_uc.o \ > + gt/uc/intel_uc.o \ > gt/uc/intel_uc_fw.o \ > gt/uc/intel_guc.o \ > gt/uc/intel_guc_ads.o \ > diff --git a/drivers/gpu/drm/i915/gt/debugfs_gt.c b/drivers/gpu/drm/i915/gt/debugfs_gt.c > index 75255aaacaed..eb403cc3c48d 100644 > --- a/drivers/gpu/drm/i915/gt/debugfs_gt.c > +++ b/drivers/gpu/drm/i915/gt/debugfs_gt.c > @@ -9,6 +9,7 @@ > #include "debugfs_engines.h" > #include "debugfs_gt.h" > #include "debugfs_gt_pm.h" > +#include "uc/debugfs_uc.h" > #include "i915_drv.h" > > 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_gt_pm_register(gt, root); > + > + debugfs_uc_register(>->uc, root); I've complained about the two above, and I'll also complain about this one: please don't use debugfs_ prefix for non-static functions. It's for fs/debugfs/* not us. BR, Jani. > } > > void debugfs_gt_register_files(struct intel_gt *gt, > diff --git a/drivers/gpu/drm/i915/gt/uc/debugfs_guc.c b/drivers/gpu/drm/i915/gt/uc/debugfs_guc.c > new file mode 100644 > index 000000000000..1adac42e1596 > --- /dev/null > +++ b/drivers/gpu/drm/i915/gt/uc/debugfs_guc.c > @@ -0,0 +1,42 @@ > +// SPDX-License-Identifier: MIT > + > +/* > + * Copyright © 2020 Intel Corporation > + */ > + > +#include <drm/drm_print.h> > + > +#include "debugfs_guc_log.h" > +#include "debugfs_uc.h" > +#include "intel_guc.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_UC_DEBUGFS_ATTRIBUTE(guc_info); > + > +void debugfs_guc_register(struct intel_guc *guc, struct dentry *root) > +{ > + static const struct debugfs_uc_file files[] = { > + { "guc_info", &guc_info_fops }, > + }; > + > + if (!intel_guc_is_supported(guc)) > + return; > + > + debugfs_uc_register_files(files, root, guc); > + debugfs_guc_log_register(&guc->log, root); > +} > diff --git a/drivers/gpu/drm/i915/gt/uc/debugfs_guc.h b/drivers/gpu/drm/i915/gt/uc/debugfs_guc.h > new file mode 100644 > index 000000000000..d9188def7d12 > --- /dev/null > +++ b/drivers/gpu/drm/i915/gt/uc/debugfs_guc.h > @@ -0,0 +1,14 @@ > +/* SPDX-License-Identifier: MIT */ > +/* > + * Copyright © 2020 Intel Corporation > + */ > + > +#ifndef DEBUGFS_GUC_H > +#define DEBUGFS_GUC_H > + > +struct intel_guc; > +struct dentry; > + > +void debugfs_guc_register(struct intel_guc *guc, struct dentry *root); > + > +#endif /* DEBUGFS_GUC_H */ > diff --git a/drivers/gpu/drm/i915/gt/uc/debugfs_guc_log.c b/drivers/gpu/drm/i915/gt/uc/debugfs_guc_log.c > new file mode 100644 > index 000000000000..a560a392aa09 > --- /dev/null > +++ b/drivers/gpu/drm/i915/gt/uc/debugfs_guc_log.c > @@ -0,0 +1,123 @@ > +// SPDX-License-Identifier: MIT > + > +/* > + * Copyright © 2020 Intel Corporation > + */ > + > +#include <linux/fs.h> > +#include <drm/drm_print.h> > + > +#include "debugfs_uc.h" > +#include "intel_guc.h" > +#include "intel_guc_log.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_UC_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_UC_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 debugfs_guc_log_register(struct intel_guc_log *log, struct dentry *root) > +{ > + static const struct debugfs_uc_file files[] = { > + { "guc_log_dump", &guc_log_dump_fops }, > + { "guc_load_err_log_dump", &guc_load_err_log_dump_fops }, > + { "guc_log_level", &guc_log_level_fops }, > + { "guc_log_relay", &guc_log_relay_fops }, > + }; > + > + if (!intel_guc_is_supported(log_to_guc(log))) > + return; > + > + debugfs_uc_register_files(files, root, log); > +} > + > diff --git a/drivers/gpu/drm/i915/gt/uc/debugfs_guc_log.h b/drivers/gpu/drm/i915/gt/uc/debugfs_guc_log.h > new file mode 100644 > index 000000000000..bc3ce784667e > --- /dev/null > +++ b/drivers/gpu/drm/i915/gt/uc/debugfs_guc_log.h > @@ -0,0 +1,14 @@ > +/* 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 debugfs_guc_log_register(struct intel_guc_log *log, struct dentry *root); > + > +#endif /* DEBUGFS_GUC_LOG_H */ > diff --git a/drivers/gpu/drm/i915/gt/uc/debugfs_huc.c b/drivers/gpu/drm/i915/gt/uc/debugfs_huc.c > new file mode 100644 > index 000000000000..b58740872333 > --- /dev/null > +++ b/drivers/gpu/drm/i915/gt/uc/debugfs_huc.c > @@ -0,0 +1,36 @@ > +// SPDX-License-Identifier: MIT > + > +/* > + * Copyright © 2020 Intel Corporation > + */ > + > +#include <drm/drm_print.h> > + > +#include "debugfs_uc.h" > +#include "intel_huc.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_UC_DEBUGFS_ATTRIBUTE(huc_info); > + > +void debugfs_huc_register(struct intel_huc *huc, struct dentry *root) > +{ > + static const struct debugfs_uc_file files[] = { > + { "huc_info", &huc_info_fops }, > + }; > + > + if (!intel_huc_is_supported(huc)) > + return; > + > + debugfs_uc_register_files(files, root, huc); > +} > diff --git a/drivers/gpu/drm/i915/gt/uc/debugfs_huc.h b/drivers/gpu/drm/i915/gt/uc/debugfs_huc.h > new file mode 100644 > index 000000000000..761f3ee3ed6a > --- /dev/null > +++ b/drivers/gpu/drm/i915/gt/uc/debugfs_huc.h > @@ -0,0 +1,14 @@ > +/* SPDX-License-Identifier: MIT */ > +/* > + * Copyright © 2020 Intel Corporation > + */ > + > +#ifndef DEBUGFS_HUC_H > +#define DEBUGFS_HUC_H > + > +struct intel_huc; > +struct dentry; > + > +void debugfs_huc_register(struct intel_huc *huc, struct dentry *root); > + > +#endif /* DEBUGFS_HUC_H */ > diff --git a/drivers/gpu/drm/i915/gt/uc/debugfs_uc.c b/drivers/gpu/drm/i915/gt/uc/debugfs_uc.c > new file mode 100644 > index 000000000000..e925443183be > --- /dev/null > +++ b/drivers/gpu/drm/i915/gt/uc/debugfs_uc.c > @@ -0,0 +1,31 @@ > +// SPDX-License-Identifier: MIT > + > +/* > + * Copyright © 2020 Intel Corporation > + */ > + > +#include <linux/debugfs.h> > + > +#include "debugfs_guc.h" > +#include "debugfs_huc.h" > +#include "debugfs_uc.h" > +#include "intel_uc.h" > + > +void debugfs_uc_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; > + > + debugfs_guc_register(&uc->guc, root); > + debugfs_huc_register(&uc->huc, root); > +} > diff --git a/drivers/gpu/drm/i915/gt/uc/debugfs_uc.h b/drivers/gpu/drm/i915/gt/uc/debugfs_uc.h > new file mode 100644 > index 000000000000..9aa4b7e52770 > --- /dev/null > +++ b/drivers/gpu/drm/i915/gt/uc/debugfs_uc.h > @@ -0,0 +1,43 @@ > +/* SPDX-License-Identifier: MIT */ > +/* > + * Copyright © 2020 Intel Corporation > + */ > + > +#ifndef DEBUGFS_UC_H > +#define DEBUGFS_UC_H > + > +#include <linux/file.h> > + > +struct intel_uc; > + > +#define DEFINE_UC_DEBUGFS_ATTRIBUTE(__name) \ > + static int __name ## _open(struct inode *inode, struct file *file) \ > +{ \ > + return single_open(file, __name ## _show, inode->i_private); \ > +} \ > +static const struct file_operations __name ## _fops = { \ > + .owner = THIS_MODULE, \ > + .open = __name ## _open, \ > + .read = seq_read, \ > + .llseek = seq_lseek, \ > + .release = single_release, \ > +} > + > +void debugfs_uc_register(struct intel_uc *uc, struct dentry *gt_root); > + > +struct debugfs_uc_file { > + const char *name; > + const struct file_operations *fops; > +}; > + > +#define debugfs_uc_register_files(files__, root__, data__) \ > +do { \ > + int i__ = 0; \ > + for (i__ = 0; i__ < ARRAY_SIZE(files__); i__++) { \ > + debugfs_create_file(files__[i__].name, \ > + 0444, root__, data__, \ > + files__[i__].fops); \ > + } \ > +} while (0) > + > +#endif /* DEBUGFS_UC_H */ > diff --git a/drivers/gpu/drm/i915/gt/uc/intel_guc.h b/drivers/gpu/drm/i915/gt/uc/intel_guc.h > index 7d1ae9879b94..2b79a8bf8d27 100644 > --- a/drivers/gpu/drm/i915/gt/uc/intel_guc.h > +++ b/drivers/gpu/drm/i915/gt/uc/intel_guc.h > @@ -74,6 +74,11 @@ struct intel_guc { > struct mutex send_mutex; > }; > > +static inline struct intel_guc *log_to_guc(const struct intel_guc_log *log) > +{ > + return container_of(log, struct intel_guc, log); > +} > + > static > inline int intel_guc_send(struct intel_guc *guc, const u32 *action, u32 len) > { > diff --git a/drivers/gpu/drm/i915/gt/uc/intel_guc_log.c b/drivers/gpu/drm/i915/gt/uc/intel_guc_log.c > index fbb73b8d9178..cfe2f9321680 100644 > --- a/drivers/gpu/drm/i915/gt/uc/intel_guc_log.c > +++ b/drivers/gpu/drm/i915/gt/uc/intel_guc_log.c > @@ -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)); > } > > -static inline struct intel_guc *log_to_guc(const 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) > { > intel_guc_enable_msg(log_to_guc(log), > diff --git a/drivers/gpu/drm/i915/i915_debugfs.c b/drivers/gpu/drm/i915/i915_debugfs.c > index 1bec4cdeb92f..a8b6f0fd9439 100644 > --- a/drivers/gpu/drm/i915/i915_debugfs.c > +++ b/drivers/gpu/drm/i915/i915_debugfs.c > @@ -37,7 +37,6 @@ > #include "gt/intel_reset.h" > #include "gt/intel_rc6.h" > #include "gt/intel_rps.h" > -#include "gt/uc/intel_guc_submission.h" > > #include "i915_debugfs.h" > #include "i915_debugfs_params.h" > @@ -1465,136 +1464,6 @@ static int i915_llc(struct seq_file *m, void *data) > 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) > { > struct drm_i915_private *dev_priv = node_to_i915(m->private); > @@ -2203,10 +2072,6 @@ static const struct drm_info_list i915_debugfs_list[] = { > {"i915_gem_objects", i915_gem_object_info, 0}, > {"i915_gem_fence_regs", i915_gem_fence_regs_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_drpc_info", i915_drpc_info, 0}, > {"i915_ring_freq_table", i915_ring_freq_table, 0}, > @@ -2236,8 +2101,6 @@ static const struct i915_debugfs_files { > {"i915_error_state", &i915_error_state_fops}, > {"i915_gpu_info", &i915_gpu_info_fops}, > #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)
Hi Daniele, I'm sorry I missed this patch, On Thu, Feb 27, 2020 at 06:28:42PM -0800, Daniele Ceraolo Spurio wrote: > 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. Can we please document the interface changes. I see there are some differences between the original and the new interfaces. > +#define DEFINE_UC_DEBUGFS_ATTRIBUTE(__name) \ > + static int __name ## _open(struct inode *inode, struct file *file) \ > +{ \ > + return single_open(file, __name ## _show, inode->i_private); \ > +} \ > +static const struct file_operations __name ## _fops = { \ > + .owner = THIS_MODULE, \ > + .open = __name ## _open, \ > + .read = seq_read, \ > + .llseek = seq_lseek, \ > + .release = single_release, \ > +} Why do we need DEFINE_UC_DEBUGFS_ATTRIBUTE()? DEFINE_GT_DEBUGFS_ATTRIBUTE() was meant to be common to all gt debugfs. I there any reason we need a new one? > +struct debugfs_uc_file { > + const char *name; > + const struct file_operations *fops; > +}; > + > +#define debugfs_uc_register_files(files__, root__, data__) \ > +do { \ > + int i__ = 0; \ > + for (i__ = 0; i__ < ARRAY_SIZE(files__); i__++) { \ > + debugfs_create_file(files__[i__].name, \ > + 0444, root__, data__, \ > + files__[i__].fops); \ > + } \ > +} while (0) You want to define your own debugfs_uc_register_files() instead of using debugfs_gt_register_files() because you want "data__" to be void, right? I think we can achieve that by adding a wrapper in debugfs_gt.c, perhaps we can do something like: void __debugfs_gt_register_files(struct intel_gt *gt, struct dentry *root, const struct debugfs_gt_file *files, void *data, unsigned long count) { ...... } and #define debugfs_gt_register_files(...) __debugfs_gt_register_files(...) #define debugfs_uc_register_files(...) __debugfs_gt_register_files(...) so that we can keep everything in a library. What do you think. Thanks, Andi
On 3/2/20 5:52 PM, Andi Shyti wrote: > Hi Daniele, > > I'm sorry I missed this patch, > > On Thu, Feb 27, 2020 at 06:28:42PM -0800, Daniele Ceraolo Spurio wrote: >> 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. > > Can we please document the interface changes. I see there are > some differences between the original and the new interfaces. > What differences are you referring to? there aren't supposed to be any, aside from the path change. >> +#define DEFINE_UC_DEBUGFS_ATTRIBUTE(__name) \ >> + static int __name ## _open(struct inode *inode, struct file *file) \ >> +{ \ >> + return single_open(file, __name ## _show, inode->i_private); \ >> +} \ >> +static const struct file_operations __name ## _fops = { \ >> + .owner = THIS_MODULE, \ >> + .open = __name ## _open, \ >> + .read = seq_read, \ >> + .llseek = seq_lseek, \ >> + .release = single_release, \ >> +} > > Why do we need DEFINE_UC_DEBUGFS_ATTRIBUTE()? > > DEFINE_GT_DEBUGFS_ATTRIBUTE() was meant to be common to all gt > debugfs. I there any reason we need a new one? > Just wanted to avoid including the other header just for this macro. >> +struct debugfs_uc_file { >> + const char *name; >> + const struct file_operations *fops; >> +}; >> + >> +#define debugfs_uc_register_files(files__, root__, data__) \ >> +do { \ >> + int i__ = 0; \ >> + for (i__ = 0; i__ < ARRAY_SIZE(files__); i__++) { \ >> + debugfs_create_file(files__[i__].name, \ >> + 0444, root__, data__, \ >> + files__[i__].fops); \ >> + } \ >> +} while (0) > > You want to define your own debugfs_uc_register_files() instead > of using debugfs_gt_register_files() because you want "data__" > to be void, right? > > I think we can achieve that by adding a wrapper in debugfs_gt.c, > perhaps we can do something like: > > void __debugfs_gt_register_files(struct intel_gt *gt, > struct dentry *root, > const struct debugfs_gt_file *files, > void *data, > unsigned long count) > { > ...... > } > > and > > #define debugfs_gt_register_files(...) __debugfs_gt_register_files(...) > #define debugfs_uc_register_files(...) __debugfs_gt_register_files(...) > > so that we can keep everything in a library. What do you think. > LGTM. Mind if I rename to: intel_gt_debugfs_register(...) intel_uc_debugfs_register(...) to avoid the debugfs_* prefix, as pointed out by Jani? Thanks, Daniele > Thanks, > Andi >
Hi Daniele, > > On Thu, Feb 27, 2020 at 06:28:42PM -0800, Daniele Ceraolo Spurio wrote: > > > 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. > > > > Can we please document the interface changes. I see there are > > some differences between the original and the new interfaces. > > > > What differences are you referring to? there aren't supposed to be any, > aside from the path change. Have I seen it wrong or there are new files in this patch? In any case, maybe we need to have the new structure. > > > +#define DEFINE_UC_DEBUGFS_ATTRIBUTE(__name) \ > > > + static int __name ## _open(struct inode *inode, struct file *file) \ > > > +{ \ > > > + return single_open(file, __name ## _show, inode->i_private); \ > > > +} \ > > > +static const struct file_operations __name ## _fops = { \ > > > + .owner = THIS_MODULE, \ > > > + .open = __name ## _open, \ > > > + .read = seq_read, \ > > > + .llseek = seq_lseek, \ > > > + .release = single_release, \ > > > +} > > > > Why do we need DEFINE_UC_DEBUGFS_ATTRIBUTE()? > > > > DEFINE_GT_DEBUGFS_ATTRIBUTE() was meant to be common to all gt > > debugfs. I there any reason we need a new one? > > > > Just wanted to avoid including the other header just for this macro. well that was supposed to be a library for all the gem/debugfs files and avoid duplicated code, I don't see anything wrong with including the file. > > > +struct debugfs_uc_file { > > > + const char *name; > > > + const struct file_operations *fops; > > > +}; > > > + > > > +#define debugfs_uc_register_files(files__, root__, data__) \ > > > +do { \ > > > + int i__ = 0; \ > > > + for (i__ = 0; i__ < ARRAY_SIZE(files__); i__++) { \ > > > + debugfs_create_file(files__[i__].name, \ > > > + 0444, root__, data__, \ > > > + files__[i__].fops); \ > > > + } \ > > > +} while (0) > > > > You want to define your own debugfs_uc_register_files() instead > > of using debugfs_gt_register_files() because you want "data__" > > to be void, right? > > > > I think we can achieve that by adding a wrapper in debugfs_gt.c, > > perhaps we can do something like: > > > > void __debugfs_gt_register_files(struct intel_gt *gt, > > struct dentry *root, > > const struct debugfs_gt_file *files, > > void *data, > > unsigned long count) > > { > > ...... > > } > > > > and > > > > #define debugfs_gt_register_files(...) __debugfs_gt_register_files(...) > > #define debugfs_uc_register_files(...) __debugfs_gt_register_files(...) > > > > so that we can keep everything in a library. What do you think. > > > > LGTM. Mind if I rename to: > > intel_gt_debugfs_register(...) > intel_uc_debugfs_register(...) > > to avoid the debugfs_* prefix, as pointed out by Jani? I have a patch for it, can you please hold a little, unless, of course, yours is already ready. Obvously, the naming you propose makes sense. Andi
On 3/5/20 10:02 AM, Andi Shyti wrote: > Hi Daniele, > >>> On Thu, Feb 27, 2020 at 06:28:42PM -0800, Daniele Ceraolo Spurio wrote: >>>> 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. >>> >>> Can we please document the interface changes. I see there are >>> some differences between the original and the new interfaces. >>> >> >> What differences are you referring to? there aren't supposed to be any, >> aside from the path change. > > Have I seen it wrong or there are new files in this patch? No, no new debugfs files, only the old ones moved across. > In any case, maybe we need to have the new structure. > >>>> +#define DEFINE_UC_DEBUGFS_ATTRIBUTE(__name) \ >>>> + static int __name ## _open(struct inode *inode, struct file *file) \ >>>> +{ \ >>>> + return single_open(file, __name ## _show, inode->i_private); \ >>>> +} \ >>>> +static const struct file_operations __name ## _fops = { \ >>>> + .owner = THIS_MODULE, \ >>>> + .open = __name ## _open, \ >>>> + .read = seq_read, \ >>>> + .llseek = seq_lseek, \ >>>> + .release = single_release, \ >>>> +} >>> >>> Why do we need DEFINE_UC_DEBUGFS_ATTRIBUTE()? >>> >>> DEFINE_GT_DEBUGFS_ATTRIBUTE() was meant to be common to all gt >>> debugfs. I there any reason we need a new one? >>> >> >> Just wanted to avoid including the other header just for this macro. > > well that was supposed to be a library for all the gem/debugfs > files and avoid duplicated code, I don't see anything wrong with > including the file. > >>>> +struct debugfs_uc_file { >>>> + const char *name; >>>> + const struct file_operations *fops; >>>> +}; >>>> + >>>> +#define debugfs_uc_register_files(files__, root__, data__) \ >>>> +do { \ >>>> + int i__ = 0; \ >>>> + for (i__ = 0; i__ < ARRAY_SIZE(files__); i__++) { \ >>>> + debugfs_create_file(files__[i__].name, \ >>>> + 0444, root__, data__, \ >>>> + files__[i__].fops); \ >>>> + } \ >>>> +} while (0) >>> >>> You want to define your own debugfs_uc_register_files() instead >>> of using debugfs_gt_register_files() because you want "data__" >>> to be void, right? >>> >>> I think we can achieve that by adding a wrapper in debugfs_gt.c, >>> perhaps we can do something like: >>> >>> void __debugfs_gt_register_files(struct intel_gt *gt, >>> struct dentry *root, >>> const struct debugfs_gt_file *files, >>> void *data, >>> unsigned long count) >>> { >>> ...... >>> } >>> >>> and >>> >>> #define debugfs_gt_register_files(...) __debugfs_gt_register_files(...) >>> #define debugfs_uc_register_files(...) __debugfs_gt_register_files(...) >>> >>> so that we can keep everything in a library. What do you think. >>> >> >> LGTM. Mind if I rename to: >> >> intel_gt_debugfs_register(...) >> intel_uc_debugfs_register(...) >> >> to avoid the debugfs_* prefix, as pointed out by Jani? > > I have a patch for it, can you please hold a little, unless, of > course, yours is already ready. > Sure, I'll wait for your patch to land first. Daniele > Obvously, the naming you propose makes sense. > > Andi >
diff --git a/drivers/gpu/drm/i915/Makefile b/drivers/gpu/drm/i915/Makefile index fe6d580869d7..c5cd9b1390e7 100644 --- a/drivers/gpu/drm/i915/Makefile +++ b/drivers/gpu/drm/i915/Makefile @@ -164,7 +164,12 @@ i915-y += \ intel_wopcm.o # general-purpose microcontroller (GuC) support -i915-y += gt/uc/intel_uc.o \ +i915-y += \ + gt/uc/debugfs_guc.o \ + gt/uc/debugfs_guc_log.o \ + gt/uc/debugfs_huc.o \ + gt/uc/debugfs_uc.o \ + gt/uc/intel_uc.o \ gt/uc/intel_uc_fw.o \ gt/uc/intel_guc.o \ gt/uc/intel_guc_ads.o \ diff --git a/drivers/gpu/drm/i915/gt/debugfs_gt.c b/drivers/gpu/drm/i915/gt/debugfs_gt.c index 75255aaacaed..eb403cc3c48d 100644 --- a/drivers/gpu/drm/i915/gt/debugfs_gt.c +++ b/drivers/gpu/drm/i915/gt/debugfs_gt.c @@ -9,6 +9,7 @@ #include "debugfs_engines.h" #include "debugfs_gt.h" #include "debugfs_gt_pm.h" +#include "uc/debugfs_uc.h" #include "i915_drv.h" 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_gt_pm_register(gt, root); + + debugfs_uc_register(>->uc, root); } void debugfs_gt_register_files(struct intel_gt *gt, diff --git a/drivers/gpu/drm/i915/gt/uc/debugfs_guc.c b/drivers/gpu/drm/i915/gt/uc/debugfs_guc.c new file mode 100644 index 000000000000..1adac42e1596 --- /dev/null +++ b/drivers/gpu/drm/i915/gt/uc/debugfs_guc.c @@ -0,0 +1,42 @@ +// SPDX-License-Identifier: MIT + +/* + * Copyright © 2020 Intel Corporation + */ + +#include <drm/drm_print.h> + +#include "debugfs_guc_log.h" +#include "debugfs_uc.h" +#include "intel_guc.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_UC_DEBUGFS_ATTRIBUTE(guc_info); + +void debugfs_guc_register(struct intel_guc *guc, struct dentry *root) +{ + static const struct debugfs_uc_file files[] = { + { "guc_info", &guc_info_fops }, + }; + + if (!intel_guc_is_supported(guc)) + return; + + debugfs_uc_register_files(files, root, guc); + debugfs_guc_log_register(&guc->log, root); +} diff --git a/drivers/gpu/drm/i915/gt/uc/debugfs_guc.h b/drivers/gpu/drm/i915/gt/uc/debugfs_guc.h new file mode 100644 index 000000000000..d9188def7d12 --- /dev/null +++ b/drivers/gpu/drm/i915/gt/uc/debugfs_guc.h @@ -0,0 +1,14 @@ +/* SPDX-License-Identifier: MIT */ +/* + * Copyright © 2020 Intel Corporation + */ + +#ifndef DEBUGFS_GUC_H +#define DEBUGFS_GUC_H + +struct intel_guc; +struct dentry; + +void debugfs_guc_register(struct intel_guc *guc, struct dentry *root); + +#endif /* DEBUGFS_GUC_H */ diff --git a/drivers/gpu/drm/i915/gt/uc/debugfs_guc_log.c b/drivers/gpu/drm/i915/gt/uc/debugfs_guc_log.c new file mode 100644 index 000000000000..a560a392aa09 --- /dev/null +++ b/drivers/gpu/drm/i915/gt/uc/debugfs_guc_log.c @@ -0,0 +1,123 @@ +// SPDX-License-Identifier: MIT + +/* + * Copyright © 2020 Intel Corporation + */ + +#include <linux/fs.h> +#include <drm/drm_print.h> + +#include "debugfs_uc.h" +#include "intel_guc.h" +#include "intel_guc_log.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_UC_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_UC_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 debugfs_guc_log_register(struct intel_guc_log *log, struct dentry *root) +{ + static const struct debugfs_uc_file files[] = { + { "guc_log_dump", &guc_log_dump_fops }, + { "guc_load_err_log_dump", &guc_load_err_log_dump_fops }, + { "guc_log_level", &guc_log_level_fops }, + { "guc_log_relay", &guc_log_relay_fops }, + }; + + if (!intel_guc_is_supported(log_to_guc(log))) + return; + + debugfs_uc_register_files(files, root, log); +} + diff --git a/drivers/gpu/drm/i915/gt/uc/debugfs_guc_log.h b/drivers/gpu/drm/i915/gt/uc/debugfs_guc_log.h new file mode 100644 index 000000000000..bc3ce784667e --- /dev/null +++ b/drivers/gpu/drm/i915/gt/uc/debugfs_guc_log.h @@ -0,0 +1,14 @@ +/* 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 debugfs_guc_log_register(struct intel_guc_log *log, struct dentry *root); + +#endif /* DEBUGFS_GUC_LOG_H */ diff --git a/drivers/gpu/drm/i915/gt/uc/debugfs_huc.c b/drivers/gpu/drm/i915/gt/uc/debugfs_huc.c new file mode 100644 index 000000000000..b58740872333 --- /dev/null +++ b/drivers/gpu/drm/i915/gt/uc/debugfs_huc.c @@ -0,0 +1,36 @@ +// SPDX-License-Identifier: MIT + +/* + * Copyright © 2020 Intel Corporation + */ + +#include <drm/drm_print.h> + +#include "debugfs_uc.h" +#include "intel_huc.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_UC_DEBUGFS_ATTRIBUTE(huc_info); + +void debugfs_huc_register(struct intel_huc *huc, struct dentry *root) +{ + static const struct debugfs_uc_file files[] = { + { "huc_info", &huc_info_fops }, + }; + + if (!intel_huc_is_supported(huc)) + return; + + debugfs_uc_register_files(files, root, huc); +} diff --git a/drivers/gpu/drm/i915/gt/uc/debugfs_huc.h b/drivers/gpu/drm/i915/gt/uc/debugfs_huc.h new file mode 100644 index 000000000000..761f3ee3ed6a --- /dev/null +++ b/drivers/gpu/drm/i915/gt/uc/debugfs_huc.h @@ -0,0 +1,14 @@ +/* SPDX-License-Identifier: MIT */ +/* + * Copyright © 2020 Intel Corporation + */ + +#ifndef DEBUGFS_HUC_H +#define DEBUGFS_HUC_H + +struct intel_huc; +struct dentry; + +void debugfs_huc_register(struct intel_huc *huc, struct dentry *root); + +#endif /* DEBUGFS_HUC_H */ diff --git a/drivers/gpu/drm/i915/gt/uc/debugfs_uc.c b/drivers/gpu/drm/i915/gt/uc/debugfs_uc.c new file mode 100644 index 000000000000..e925443183be --- /dev/null +++ b/drivers/gpu/drm/i915/gt/uc/debugfs_uc.c @@ -0,0 +1,31 @@ +// SPDX-License-Identifier: MIT + +/* + * Copyright © 2020 Intel Corporation + */ + +#include <linux/debugfs.h> + +#include "debugfs_guc.h" +#include "debugfs_huc.h" +#include "debugfs_uc.h" +#include "intel_uc.h" + +void debugfs_uc_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; + + debugfs_guc_register(&uc->guc, root); + debugfs_huc_register(&uc->huc, root); +} diff --git a/drivers/gpu/drm/i915/gt/uc/debugfs_uc.h b/drivers/gpu/drm/i915/gt/uc/debugfs_uc.h new file mode 100644 index 000000000000..9aa4b7e52770 --- /dev/null +++ b/drivers/gpu/drm/i915/gt/uc/debugfs_uc.h @@ -0,0 +1,43 @@ +/* SPDX-License-Identifier: MIT */ +/* + * Copyright © 2020 Intel Corporation + */ + +#ifndef DEBUGFS_UC_H +#define DEBUGFS_UC_H + +#include <linux/file.h> + +struct intel_uc; + +#define DEFINE_UC_DEBUGFS_ATTRIBUTE(__name) \ + static int __name ## _open(struct inode *inode, struct file *file) \ +{ \ + return single_open(file, __name ## _show, inode->i_private); \ +} \ +static const struct file_operations __name ## _fops = { \ + .owner = THIS_MODULE, \ + .open = __name ## _open, \ + .read = seq_read, \ + .llseek = seq_lseek, \ + .release = single_release, \ +} + +void debugfs_uc_register(struct intel_uc *uc, struct dentry *gt_root); + +struct debugfs_uc_file { + const char *name; + const struct file_operations *fops; +}; + +#define debugfs_uc_register_files(files__, root__, data__) \ +do { \ + int i__ = 0; \ + for (i__ = 0; i__ < ARRAY_SIZE(files__); i__++) { \ + debugfs_create_file(files__[i__].name, \ + 0444, root__, data__, \ + files__[i__].fops); \ + } \ +} while (0) + +#endif /* DEBUGFS_UC_H */ diff --git a/drivers/gpu/drm/i915/gt/uc/intel_guc.h b/drivers/gpu/drm/i915/gt/uc/intel_guc.h index 7d1ae9879b94..2b79a8bf8d27 100644 --- a/drivers/gpu/drm/i915/gt/uc/intel_guc.h +++ b/drivers/gpu/drm/i915/gt/uc/intel_guc.h @@ -74,6 +74,11 @@ struct intel_guc { struct mutex send_mutex; }; +static inline struct intel_guc *log_to_guc(const struct intel_guc_log *log) +{ + return container_of(log, struct intel_guc, log); +} + static inline int intel_guc_send(struct intel_guc *guc, const u32 *action, u32 len) { diff --git a/drivers/gpu/drm/i915/gt/uc/intel_guc_log.c b/drivers/gpu/drm/i915/gt/uc/intel_guc_log.c index fbb73b8d9178..cfe2f9321680 100644 --- a/drivers/gpu/drm/i915/gt/uc/intel_guc_log.c +++ b/drivers/gpu/drm/i915/gt/uc/intel_guc_log.c @@ -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)); } -static inline struct intel_guc *log_to_guc(const 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) { intel_guc_enable_msg(log_to_guc(log), diff --git a/drivers/gpu/drm/i915/i915_debugfs.c b/drivers/gpu/drm/i915/i915_debugfs.c index 1bec4cdeb92f..a8b6f0fd9439 100644 --- a/drivers/gpu/drm/i915/i915_debugfs.c +++ b/drivers/gpu/drm/i915/i915_debugfs.c @@ -37,7 +37,6 @@ #include "gt/intel_reset.h" #include "gt/intel_rc6.h" #include "gt/intel_rps.h" -#include "gt/uc/intel_guc_submission.h" #include "i915_debugfs.h" #include "i915_debugfs_params.h" @@ -1465,136 +1464,6 @@ static int i915_llc(struct seq_file *m, void *data) 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) { struct drm_i915_private *dev_priv = node_to_i915(m->private); @@ -2203,10 +2072,6 @@ static const struct drm_info_list i915_debugfs_list[] = { {"i915_gem_objects", i915_gem_object_info, 0}, {"i915_gem_fence_regs", i915_gem_fence_regs_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_drpc_info", i915_drpc_info, 0}, {"i915_ring_freq_table", i915_ring_freq_table, 0}, @@ -2236,8 +2101,6 @@ static const struct i915_debugfs_files { {"i915_error_state", &i915_error_state_fops}, {"i915_gpu_info", &i915_gpu_info_fops}, #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)
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. Signed-off-by: Daniele 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> --- drivers/gpu/drm/i915/Makefile | 7 +- drivers/gpu/drm/i915/gt/debugfs_gt.c | 3 + drivers/gpu/drm/i915/gt/uc/debugfs_guc.c | 42 ++++++ drivers/gpu/drm/i915/gt/uc/debugfs_guc.h | 14 ++ drivers/gpu/drm/i915/gt/uc/debugfs_guc_log.c | 123 +++++++++++++++++ drivers/gpu/drm/i915/gt/uc/debugfs_guc_log.h | 14 ++ drivers/gpu/drm/i915/gt/uc/debugfs_huc.c | 36 +++++ drivers/gpu/drm/i915/gt/uc/debugfs_huc.h | 14 ++ drivers/gpu/drm/i915/gt/uc/debugfs_uc.c | 31 +++++ drivers/gpu/drm/i915/gt/uc/debugfs_uc.h | 43 ++++++ drivers/gpu/drm/i915/gt/uc/intel_guc.h | 5 + drivers/gpu/drm/i915/gt/uc/intel_guc_log.c | 5 - drivers/gpu/drm/i915/i915_debugfs.c | 137 ------------------- 13 files changed, 331 insertions(+), 143 deletions(-) create mode 100644 drivers/gpu/drm/i915/gt/uc/debugfs_guc.c create mode 100644 drivers/gpu/drm/i915/gt/uc/debugfs_guc.h create mode 100644 drivers/gpu/drm/i915/gt/uc/debugfs_guc_log.c create mode 100644 drivers/gpu/drm/i915/gt/uc/debugfs_guc_log.h create mode 100644 drivers/gpu/drm/i915/gt/uc/debugfs_huc.c create mode 100644 drivers/gpu/drm/i915/gt/uc/debugfs_huc.h create mode 100644 drivers/gpu/drm/i915/gt/uc/debugfs_uc.c create mode 100644 drivers/gpu/drm/i915/gt/uc/debugfs_uc.h