162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * Copyright (C) 2011 Texas Instruments Incorporated - https://www.ti.com/
462306a36Sopenharmony_ci * Author: Rob Clark <rob.clark@linaro.org>
562306a36Sopenharmony_ci */
662306a36Sopenharmony_ci
762306a36Sopenharmony_ci#include <linux/seq_file.h>
862306a36Sopenharmony_ci
962306a36Sopenharmony_ci#include <drm/drm_crtc.h>
1062306a36Sopenharmony_ci#include <drm/drm_debugfs.h>
1162306a36Sopenharmony_ci#include <drm/drm_file.h>
1262306a36Sopenharmony_ci#include <drm/drm_fb_helper.h>
1362306a36Sopenharmony_ci#include <drm/drm_framebuffer.h>
1462306a36Sopenharmony_ci
1562306a36Sopenharmony_ci#include "omap_drv.h"
1662306a36Sopenharmony_ci#include "omap_dmm_tiler.h"
1762306a36Sopenharmony_ci
1862306a36Sopenharmony_ci#ifdef CONFIG_DEBUG_FS
1962306a36Sopenharmony_ci
2062306a36Sopenharmony_cistatic int gem_show(struct seq_file *m, void *arg)
2162306a36Sopenharmony_ci{
2262306a36Sopenharmony_ci	struct drm_info_node *node = (struct drm_info_node *) m->private;
2362306a36Sopenharmony_ci	struct drm_device *dev = node->minor->dev;
2462306a36Sopenharmony_ci	struct omap_drm_private *priv = dev->dev_private;
2562306a36Sopenharmony_ci
2662306a36Sopenharmony_ci	seq_printf(m, "All Objects:\n");
2762306a36Sopenharmony_ci	mutex_lock(&priv->list_lock);
2862306a36Sopenharmony_ci	omap_gem_describe_objects(&priv->obj_list, m);
2962306a36Sopenharmony_ci	mutex_unlock(&priv->list_lock);
3062306a36Sopenharmony_ci
3162306a36Sopenharmony_ci	return 0;
3262306a36Sopenharmony_ci}
3362306a36Sopenharmony_ci
3462306a36Sopenharmony_cistatic int mm_show(struct seq_file *m, void *arg)
3562306a36Sopenharmony_ci{
3662306a36Sopenharmony_ci	struct drm_info_node *node = (struct drm_info_node *) m->private;
3762306a36Sopenharmony_ci	struct drm_device *dev = node->minor->dev;
3862306a36Sopenharmony_ci	struct drm_printer p = drm_seq_file_printer(m);
3962306a36Sopenharmony_ci
4062306a36Sopenharmony_ci	drm_mm_print(&dev->vma_offset_manager->vm_addr_space_mm, &p);
4162306a36Sopenharmony_ci
4262306a36Sopenharmony_ci	return 0;
4362306a36Sopenharmony_ci}
4462306a36Sopenharmony_ci
4562306a36Sopenharmony_ci#ifdef CONFIG_DRM_FBDEV_EMULATION
4662306a36Sopenharmony_cistatic int fb_show(struct seq_file *m, void *arg)
4762306a36Sopenharmony_ci{
4862306a36Sopenharmony_ci	struct drm_info_node *node = (struct drm_info_node *) m->private;
4962306a36Sopenharmony_ci	struct drm_device *dev = node->minor->dev;
5062306a36Sopenharmony_ci	struct drm_fb_helper *helper = dev->fb_helper;
5162306a36Sopenharmony_ci	struct drm_framebuffer *fb;
5262306a36Sopenharmony_ci
5362306a36Sopenharmony_ci	seq_printf(m, "fbcon ");
5462306a36Sopenharmony_ci	omap_framebuffer_describe(helper->fb, m);
5562306a36Sopenharmony_ci
5662306a36Sopenharmony_ci	mutex_lock(&dev->mode_config.fb_lock);
5762306a36Sopenharmony_ci	list_for_each_entry(fb, &dev->mode_config.fb_list, head) {
5862306a36Sopenharmony_ci		if (fb == helper->fb)
5962306a36Sopenharmony_ci			continue;
6062306a36Sopenharmony_ci
6162306a36Sopenharmony_ci		seq_printf(m, "user ");
6262306a36Sopenharmony_ci		omap_framebuffer_describe(fb, m);
6362306a36Sopenharmony_ci	}
6462306a36Sopenharmony_ci	mutex_unlock(&dev->mode_config.fb_lock);
6562306a36Sopenharmony_ci
6662306a36Sopenharmony_ci	return 0;
6762306a36Sopenharmony_ci}
6862306a36Sopenharmony_ci#endif
6962306a36Sopenharmony_ci
7062306a36Sopenharmony_ci/* list of debufs files that are applicable to all devices */
7162306a36Sopenharmony_cistatic struct drm_info_list omap_debugfs_list[] = {
7262306a36Sopenharmony_ci	{"gem", gem_show, 0},
7362306a36Sopenharmony_ci	{"mm", mm_show, 0},
7462306a36Sopenharmony_ci#ifdef CONFIG_DRM_FBDEV_EMULATION
7562306a36Sopenharmony_ci	{"fb", fb_show, 0},
7662306a36Sopenharmony_ci#endif
7762306a36Sopenharmony_ci};
7862306a36Sopenharmony_ci
7962306a36Sopenharmony_ci/* list of debugfs files that are specific to devices with dmm/tiler */
8062306a36Sopenharmony_cistatic struct drm_info_list omap_dmm_debugfs_list[] = {
8162306a36Sopenharmony_ci	{"tiler_map", tiler_map_show, 0},
8262306a36Sopenharmony_ci};
8362306a36Sopenharmony_ci
8462306a36Sopenharmony_civoid omap_debugfs_init(struct drm_minor *minor)
8562306a36Sopenharmony_ci{
8662306a36Sopenharmony_ci	drm_debugfs_create_files(omap_debugfs_list,
8762306a36Sopenharmony_ci				 ARRAY_SIZE(omap_debugfs_list),
8862306a36Sopenharmony_ci				 minor->debugfs_root, minor);
8962306a36Sopenharmony_ci
9062306a36Sopenharmony_ci	if (dmm_is_available())
9162306a36Sopenharmony_ci		drm_debugfs_create_files(omap_dmm_debugfs_list,
9262306a36Sopenharmony_ci					 ARRAY_SIZE(omap_dmm_debugfs_list),
9362306a36Sopenharmony_ci					 minor->debugfs_root, minor);
9462306a36Sopenharmony_ci}
9562306a36Sopenharmony_ci
9662306a36Sopenharmony_ci#endif
97