Unverified Commit 445b287e authored by Maxime Ripard's avatar Maxime Ripard
Browse files

drm/vc4: debugfs: Simplify debugfs registration



The vc4 has a custom API to allow components to register a debugfs file
before the DRM driver has been registered and the debugfs_init hook has
been called.

However, the .late_register hook allows to have the debugfs file creation
deferred after that time already.

Let's remove our custom code to only register later our debugfs entries as
part of either debugfs_init or after it.

Acked-by: default avatarThomas Zimmermann <tzimmermann@suse.de>
Signed-off-by: default avatarMaxime Ripard <maxime@cerno.tech>
Link: https://lore.kernel.org/r/20220711173939.1132294-65-maxime@cerno.tech
parent fe3b0f78
Loading
Loading
Loading
Loading
+17 −3
Original line number Diff line number Diff line
@@ -984,6 +984,23 @@ int vc4_get_tiling_ioctl(struct drm_device *dev, void *data,
	return 0;
}

int vc4_bo_debugfs_init(struct drm_minor *minor)
{
	struct drm_device *drm = minor->dev;
	struct vc4_dev *vc4 = to_vc4_dev(drm);
	int ret;

	if (!vc4->v3d)
		return -ENODEV;

	ret = vc4_debugfs_add_file(minor, "bo_stats",
				   vc4_bo_stats_debugfs, NULL);
	if (ret)
		return ret;

	return 0;
}

static void vc4_bo_cache_destroy(struct drm_device *dev, void *unused);
int vc4_bo_cache_init(struct drm_device *dev)
{
@@ -1008,9 +1025,6 @@ int vc4_bo_cache_init(struct drm_device *dev)
		vc4->bo_labels[i].name = bo_type_names[i];

	mutex_init(&vc4->bo_lock);

	vc4_debugfs_add_file(dev, "bo_stats", vc4_bo_stats_debugfs, NULL);

	INIT_LIST_HEAD(&vc4->bo_cache.time_list);

	INIT_WORK(&vc4->bo_cache.time_work, vc4_bo_cache_time_work);
+16 −3
Original line number Diff line number Diff line
@@ -1052,6 +1052,21 @@ void vc4_crtc_reset(struct drm_crtc *crtc)
	__drm_atomic_helper_crtc_reset(crtc, &vc4_crtc_state->base);
}

int vc4_crtc_late_register(struct drm_crtc *crtc)
{
	struct drm_device *drm = crtc->dev;
	struct vc4_crtc *vc4_crtc = to_vc4_crtc(crtc);
	const struct vc4_crtc_data *crtc_data = vc4_crtc_to_vc4_crtc_data(vc4_crtc);
	int ret;

	ret = vc4_debugfs_add_regset32(drm->primary, crtc_data->debugfs_name,
				       &vc4_crtc->regset);
	if (ret)
		return ret;

	return 0;
}

static const struct drm_crtc_funcs vc4_crtc_funcs = {
	.set_config = drm_atomic_helper_set_config,
	.page_flip = vc4_page_flip,
@@ -1064,6 +1079,7 @@ static const struct drm_crtc_funcs vc4_crtc_funcs = {
	.enable_vblank = vc4_enable_vblank,
	.disable_vblank = vc4_disable_vblank,
	.get_vblank_timestamp = drm_crtc_vblank_helper_get_vblank_timestamp,
	.late_register = vc4_crtc_late_register,
};

static const struct drm_crtc_helper_funcs vc4_crtc_helper_funcs = {
@@ -1318,9 +1334,6 @@ static int vc4_crtc_bind(struct device *dev, struct device *master, void *data)

	platform_set_drvdata(pdev, vc4_crtc);

	vc4_debugfs_add_regset32(drm, pv_data->base.debugfs_name,
				 &vc4_crtc->regset);

	return 0;
}

+17 −34
Original line number Diff line number Diff line
@@ -14,11 +14,6 @@
#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.
@@ -27,16 +22,13 @@ void
vc4_debugfs_init(struct drm_minor *minor)
{
	struct vc4_dev *vc4 = to_vc4_dev(minor->dev);
	struct vc4_debugfs_info_entry *entry;
	struct drm_device *drm = &vc4->base;

	if (!of_device_is_compatible(vc4->hvs->pdev->dev.of_node,
				     "brcm,bcm2711-vc5"))
		debugfs_create_bool("hvs_load_tracker", S_IRUGO | S_IWUSR,
				    minor->debugfs_root, &vc4->load_tracker_enabled);
	drm_WARN_ON(drm, vc4_hvs_debugfs_init(minor));

	list_for_each_entry(entry, &vc4->debugfs_list, link) {
		drm_debugfs_create_files(&entry->info, 1,
					 minor->debugfs_root, minor);
	if (vc4->v3d) {
		drm_WARN_ON(drm, vc4_bo_debugfs_init(minor));
		drm_WARN_ON(drm, vc4_v3d_debugfs_init(minor));
	}
}

@@ -58,40 +50,31 @@ static int vc4_debugfs_regset32(struct seq_file *m, void *unused)
	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().
 */
int vc4_debugfs_add_file(struct drm_device *dev,
int vc4_debugfs_add_file(struct drm_minor *minor,
			 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);
	struct drm_device *dev = minor->dev;
	struct dentry *root = minor->debugfs_root;
	struct drm_info_list *file;

	if (!entry)
	file = drmm_kzalloc(dev, sizeof(*file), GFP_KERNEL);
	if (!file)
		return -ENOMEM;

	entry->info.name = name;
	entry->info.show = show;
	entry->info.data = data;
	file->name = name;
	file->show = show;
	file->data = data;

	list_add(&entry->link, &vc4->debugfs_list);
	drm_debugfs_create_files(file, 1, root, minor);

	return 0;
}

int vc4_debugfs_add_regset32(struct drm_device *drm,
int vc4_debugfs_add_regset32(struct drm_minor *minor,
			     const char *name,
			     struct debugfs_regset32 *regset)
{
	return vc4_debugfs_add_file(drm, name, vc4_debugfs_regset32, regset);
	return vc4_debugfs_add_file(minor, name, vc4_debugfs_regset32, regset);
}
+18 −3
Original line number Diff line number Diff line
@@ -244,6 +244,23 @@ static const struct drm_encoder_helper_funcs vc4_dpi_encoder_helper_funcs = {
	.mode_valid = vc4_dpi_encoder_mode_valid,
};

static int vc4_dpi_late_register(struct drm_encoder *encoder)
{
	struct drm_device *drm = encoder->dev;
	struct vc4_dpi *dpi = to_vc4_dpi(encoder);
	int ret;

	ret = vc4_debugfs_add_regset32(drm->primary, "dpi_regs", &dpi->regset);
	if (ret)
		return ret;

	return 0;
}

static const struct drm_encoder_funcs vc4_dpi_encoder_funcs = {
	.late_register = vc4_dpi_late_register,
};

static const struct of_device_id vc4_dpi_dt_match[] = {
	{ .compatible = "brcm,bcm2835-dpi", .data = NULL },
	{}
@@ -332,7 +349,7 @@ static int vc4_dpi_bind(struct device *dev, struct device *master, void *data)
		return ret;

	ret = drmm_encoder_init(drm, &dpi->encoder.base,
				NULL,
				&vc4_dpi_encoder_funcs,
				DRM_MODE_ENCODER_DPI,
				NULL);
	if (ret)
@@ -346,8 +363,6 @@ static int vc4_dpi_bind(struct device *dev, struct device *master, void *data)

	dev_set_drvdata(dev, dpi);

	vc4_debugfs_add_regset32(drm, "dpi_regs", &dpi->regset);

	return 0;
}

+8 −4
Original line number Diff line number Diff line
@@ -841,6 +841,7 @@ int vc4_bo_inc_usecnt(struct vc4_bo *bo);
void vc4_bo_dec_usecnt(struct vc4_bo *bo);
void vc4_bo_add_to_purgeable_pool(struct vc4_bo *bo);
void vc4_bo_remove_from_purgeable_pool(struct vc4_bo *bo);
int vc4_bo_debugfs_init(struct drm_minor *minor);

/* vc4_crtc.c */
extern struct platform_driver vc4_crtc_driver;
@@ -859,6 +860,7 @@ void vc4_crtc_destroy_state(struct drm_crtc *crtc,
void vc4_crtc_reset(struct drm_crtc *crtc);
void vc4_crtc_handle_vblank(struct vc4_crtc *crtc);
void vc4_crtc_send_vblank(struct drm_crtc *crtc);
int vc4_crtc_late_register(struct drm_crtc *crtc);
void vc4_crtc_get_margins(struct drm_crtc_state *state,
			  unsigned int *left, unsigned int *right,
			  unsigned int *top, unsigned int *bottom);
@@ -866,15 +868,15 @@ void vc4_crtc_get_margins(struct drm_crtc_state *state,
/* vc4_debugfs.c */
void vc4_debugfs_init(struct drm_minor *minor);
#ifdef CONFIG_DEBUG_FS
int vc4_debugfs_add_file(struct drm_device *drm,
int vc4_debugfs_add_file(struct drm_minor *minor,
			 const char *filename,
			 int (*show)(struct seq_file*, void*),
			 void *data);
int vc4_debugfs_add_regset32(struct drm_device *drm,
int vc4_debugfs_add_regset32(struct drm_minor *minor,
			     const char *filename,
			     struct debugfs_regset32 *regset);
#else
static inline int vc4_debugfs_add_file(struct drm_device *drm,
static inline int vc4_debugfs_add_file(struct drm_minor *minor,
				       const char *filename,
				       int (*show)(struct seq_file*, void*),
				       void *data)
@@ -882,7 +884,7 @@ static inline int vc4_debugfs_add_file(struct drm_device *drm,
	return 0;
}

static inline int vc4_debugfs_add_regset32(struct drm_device *drm,
static inline int vc4_debugfs_add_regset32(struct drm_minor *minor,
					   const char *filename,
					   struct debugfs_regset32 *regset)
{
@@ -952,6 +954,7 @@ void vc4_hvs_atomic_flush(struct drm_crtc *crtc, struct drm_atomic_state *state)
void vc4_hvs_dump_state(struct vc4_hvs *hvs);
void vc4_hvs_unmask_underrun(struct vc4_hvs *hvs, int channel);
void vc4_hvs_mask_underrun(struct vc4_hvs *hvs, int channel);
int vc4_hvs_debugfs_init(struct drm_minor *minor);

/* vc4_kms.c */
int vc4_kms_load(struct drm_device *dev);
@@ -974,6 +977,7 @@ int vc4_v3d_bin_bo_get(struct vc4_dev *vc4, bool *used);
void vc4_v3d_bin_bo_put(struct vc4_dev *vc4);
int vc4_v3d_pm_get(struct vc4_dev *vc4);
void vc4_v3d_pm_put(struct vc4_dev *vc4);
int vc4_v3d_debugfs_init(struct drm_minor *minor);

/* vc4_validate.c */
int
Loading