c9be804c8c
The global list of all debugfs entries for the driver was painful: the list couldn't see into the components' structs, so each component had its own debugs show function to find the component, then find the regset and dump it. The components also had to be careful to check that they were actually registered in vc4 before dereferencing themselves, in case they weren't probed on a particular platform. They routinely failed at that. Instead, we can have the components add their debugfs callbacks to a little list in vc4 to be registered at drm_dev_register() time, which gets vc4_debugfs.c out of the business of knowing the whole list of components. Thanks to this change, dsi0 (if it existed) would register its node. v2: Rebase on hvs_underrun addition. v3: whitespace fixup Signed-off-by: Eric Anholt <eric@anholt.net> Link: https://patchwork.freedesktop.org/patch/msgid/20190401183559.3823-1-eric@anholt.net Reviewed-by: Paul Kocialkowski <paul.kocialkowski@bootlin.com>
97 lines
2.4 KiB
C
97 lines
2.4 KiB
C
/*
|
|
* Copyright © 2014 Broadcom
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License version 2 as
|
|
* published by the Free Software Foundation.
|
|
*/
|
|
|
|
#include <linux/seq_file.h>
|
|
#include <linux/circ_buf.h>
|
|
#include <linux/ctype.h>
|
|
#include <linux/debugfs.h>
|
|
#include <drm/drmP.h>
|
|
|
|
#include "vc4_drv.h"
|
|
#include "vc4_regs.h"
|
|
|
|
struct vc4_debugfs_info_entry {
|
|
struct list_head link;
|
|
struct drm_info_list info;
|
|
};
|
|
|
|
/**
|
|
* Called at drm_dev_register() time on each of the minors registered
|
|
* by the DRM device, to attach the debugfs files.
|
|
*/
|
|
int
|
|
vc4_debugfs_init(struct drm_minor *minor)
|
|
{
|
|
struct vc4_dev *vc4 = to_vc4_dev(minor->dev);
|
|
struct vc4_debugfs_info_entry *entry;
|
|
struct dentry *dentry;
|
|
|
|
dentry = debugfs_create_bool("hvs_load_tracker", S_IRUGO | S_IWUSR,
|
|
minor->debugfs_root,
|
|
&vc4->load_tracker_enabled);
|
|
if (!dentry)
|
|
return -ENOMEM;
|
|
|
|
list_for_each_entry(entry, &vc4->debugfs_list, link) {
|
|
int ret = drm_debugfs_create_files(&entry->info, 1,
|
|
minor->debugfs_root, minor);
|
|
|
|
if (ret)
|
|
return ret;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
int vc4_debugfs_regset32(struct seq_file *m, void *unused)
|
|
{
|
|
struct drm_info_node *node = (struct drm_info_node *)m->private;
|
|
struct debugfs_regset32 *regset = node->info_ent->data;
|
|
struct drm_printer p = drm_seq_file_printer(m);
|
|
|
|
drm_print_regset32(&p, regset);
|
|
|
|
return 0;
|
|
}
|
|
|
|
/**
|
|
* Registers a debugfs file with a callback function for a vc4 component.
|
|
*
|
|
* This is like drm_debugfs_create_files(), but that can only be
|
|
* called a given DRM minor, while the various VC4 components want to
|
|
* register their debugfs files during the component bind process. We
|
|
* track the request and delay it to be called on each minor during
|
|
* vc4_debugfs_init().
|
|
*/
|
|
void vc4_debugfs_add_file(struct drm_device *dev,
|
|
const char *name,
|
|
int (*show)(struct seq_file*, void*),
|
|
void *data)
|
|
{
|
|
struct vc4_dev *vc4 = to_vc4_dev(dev);
|
|
|
|
struct vc4_debugfs_info_entry *entry =
|
|
devm_kzalloc(dev->dev, sizeof(*entry), GFP_KERNEL);
|
|
|
|
if (!entry)
|
|
return;
|
|
|
|
entry->info.name = name;
|
|
entry->info.show = show;
|
|
entry->info.data = data;
|
|
|
|
list_add(&entry->link, &vc4->debugfs_list);
|
|
}
|
|
|
|
void vc4_debugfs_add_regset32(struct drm_device *drm,
|
|
const char *name,
|
|
struct debugfs_regset32 *regset)
|
|
{
|
|
vc4_debugfs_add_file(drm, name, vc4_debugfs_regset32, regset);
|
|
}
|