mirror of
https://github.com/torvalds/linux.git
synced 2026-05-30 18:13:41 +02:00
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: 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>
Cc: Jani Nikula <jani.nikula@linux.intel.com>
Reviewed-by: Andi Shyti <andi.shyti@intel.com> #v2
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Link: https://patchwork.freedesktop.org/patch/msgid/20200326181121.16869-6-daniele.ceraolospurio@intel.com
This commit is contained in:
parent
34904bd64a
commit
293a554801
|
|
@ -167,14 +167,18 @@ i915-y += \
|
|||
|
||||
# general-purpose microcontroller (GuC) support
|
||||
i915-y += gt/uc/intel_uc.o \
|
||||
gt/uc/intel_uc_debugfs.o \
|
||||
gt/uc/intel_uc_fw.o \
|
||||
gt/uc/intel_guc.o \
|
||||
gt/uc/intel_guc_ads.o \
|
||||
gt/uc/intel_guc_ct.o \
|
||||
gt/uc/intel_guc_debugfs.o \
|
||||
gt/uc/intel_guc_fw.o \
|
||||
gt/uc/intel_guc_log.o \
|
||||
gt/uc/intel_guc_log_debugfs.o \
|
||||
gt/uc/intel_guc_submission.o \
|
||||
gt/uc/intel_huc.o \
|
||||
gt/uc/intel_huc_debugfs.o \
|
||||
gt/uc/intel_huc_fw.o
|
||||
|
||||
# modesetting core code
|
||||
|
|
|
|||
|
|
@ -9,6 +9,7 @@
|
|||
#include "debugfs_engines.h"
|
||||
#include "debugfs_gt.h"
|
||||
#include "debugfs_gt_pm.h"
|
||||
#include "uc/intel_uc_debugfs.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);
|
||||
|
||||
intel_uc_debugfs_register(>->uc, root);
|
||||
}
|
||||
|
||||
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)
|
||||
{
|
||||
while (count--) {
|
||||
umode_t mode = files->fops->write ? 0644 : 0444;
|
||||
if (!files->eval || files->eval(data))
|
||||
debugfs_create_file(files->name,
|
||||
0444, root, data,
|
||||
mode, root, data,
|
||||
files->fops);
|
||||
|
||||
files++;
|
||||
|
|
|
|||
|
|
@ -74,6 +74,11 @@ struct intel_guc {
|
|||
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
|
||||
inline int intel_guc_send(struct intel_guc *guc, const u32 *action, u32 len)
|
||||
{
|
||||
|
|
|
|||
42
drivers/gpu/drm/i915/gt/uc/intel_guc_debugfs.c
Normal file
42
drivers/gpu/drm/i915/gt/uc/intel_guc_debugfs.c
Normal file
|
|
@ -0,0 +1,42 @@
|
|||
// 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);
|
||||
}
|
||||
14
drivers/gpu/drm/i915/gt/uc/intel_guc_debugfs.h
Normal file
14
drivers/gpu/drm/i915/gt/uc/intel_guc_debugfs.h
Normal file
|
|
@ -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 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,
|
|||
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)
|
||||
{
|
||||
intel_guc_enable_msg(log_to_guc(log),
|
||||
|
|
|
|||
124
drivers/gpu/drm/i915/gt/uc/intel_guc_log_debugfs.c
Normal file
124
drivers/gpu/drm/i915/gt/uc/intel_guc_log_debugfs.c
Normal file
|
|
@ -0,0 +1,124 @@
|
|||
// 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);
|
||||
}
|
||||
|
||||
15
drivers/gpu/drm/i915/gt/uc/intel_guc_log_debugfs.h
Normal file
15
drivers/gpu/drm/i915/gt/uc/intel_guc_log_debugfs.h
Normal file
|
|
@ -0,0 +1,15 @@
|
|||
/* 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 */
|
||||
36
drivers/gpu/drm/i915/gt/uc/intel_huc_debugfs.c
Normal file
36
drivers/gpu/drm/i915/gt/uc/intel_huc_debugfs.c
Normal file
|
|
@ -0,0 +1,36 @@
|
|||
// 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);
|
||||
}
|
||||
14
drivers/gpu/drm/i915/gt/uc/intel_huc_debugfs.h
Normal file
14
drivers/gpu/drm/i915/gt/uc/intel_huc_debugfs.h
Normal file
|
|
@ -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 intel_huc_debugfs_register(struct intel_huc *huc, struct dentry *root);
|
||||
|
||||
#endif /* DEBUGFS_HUC_H */
|
||||
30
drivers/gpu/drm/i915/gt/uc/intel_uc_debugfs.c
Normal file
30
drivers/gpu/drm/i915/gt/uc/intel_uc_debugfs.c
Normal file
|
|
@ -0,0 +1,30 @@
|
|||
// 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);
|
||||
}
|
||||
14
drivers/gpu/drm/i915/gt/uc/intel_uc_debugfs.h
Normal file
14
drivers/gpu/drm/i915/gt/uc/intel_uc_debugfs.h
Normal file
|
|
@ -0,0 +1,14 @@
|
|||
/* 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 @@
|
|||
#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"
|
||||
|
|
@ -1251,136 +1250,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);
|
||||
|
|
@ -1989,10 +1858,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_ring_freq_table", i915_ring_freq_table, 0},
|
||||
{"i915_context_status", i915_context_status, 0},
|
||||
|
|
@ -2020,8 +1885,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)
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user