summaryrefslogtreecommitdiff
path: root/drivers/gpu/drm/exynos/exynos_drm_debugfs.c
blob: ad65c7b91de5a4f25ca484658c6efd01276dc298 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
/*
 * Copyright (c) 2014 Samsung Electronics Co., Ltd
 * Author: YoungJun Cho <yj44.cho@samsung.com>
 *
 * 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 <drm/drmP.h>

#include <linux/debugfs.h>

#include "exynos_drm_drv.h"
#include "exynos_drm_gem.h"

struct exynos_drm_debugfs_gem_info_data {
	struct drm_file	*filp;
	struct seq_file	*m;
};

static int exynos_drm_debugfs_gem_one_info(int id, void *ptr, void *data)
{
	struct exynos_drm_debugfs_gem_info_data *gem_info_data =
				(struct exynos_drm_debugfs_gem_info_data *)data;
	struct drm_file *filp = gem_info_data->filp;
	struct drm_exynos_file_private *file_priv = filp->driver_priv;
	struct drm_gem_object *obj = (struct drm_gem_object *)ptr;
	struct exynos_drm_gem_obj *exynos_gem_obj = to_exynos_gem_obj(obj);
	struct exynos_drm_gem_buf *buf = exynos_gem_obj->buffer;

	seq_printf(gem_info_data->m,
			"%5d\t%5d\t%4d\t%4d\t%4d\t0x%08lx\t0x%x\t%4d\t%4d\t"
			"%4d\t0x%p\n",
				pid_nr(filp->pid),
				file_priv->tgid,
				id,
				atomic_read(&obj->refcount.refcount),
				obj->handle_count,
				exynos_gem_obj->size,
				exynos_gem_obj->flags,
				buf->pfnmap,
				obj->dma_buf ? 1 : 0,
				obj->import_attach ? 1 : 0,
				obj);

	return 0;
}

static int exynos_drm_debugfs_gem_info(struct seq_file *m, void *data)
{
	struct drm_info_node *node = (struct drm_info_node *)m->private;
	struct drm_minor *minor = node->minor;
	struct drm_device *drm_dev = minor->dev;
	struct exynos_drm_debugfs_gem_info_data gem_info_data;
	struct drm_file *filp;

	gem_info_data.m = m;

	seq_puts(m, "pid\ttgid\thandle\tref_cnt\thdl_cnt\tsize\t\tflags\t"
			"pfnmap\texport\timport\tobj_addr\n");

	mutex_lock(&drm_dev->struct_mutex);
	list_for_each_entry(filp, &drm_dev->filelist, lhead) {
		gem_info_data.filp = filp;

		spin_lock(&filp->table_lock);
		idr_for_each(&filp->object_idr, exynos_drm_debugfs_gem_one_info,
				&gem_info_data);
		spin_unlock(&filp->table_lock);
	}
	mutex_unlock(&drm_dev->struct_mutex);

	return 0;
}

static struct drm_info_list exynos_drm_debugfs_list[] = {
	{"gem_info",	exynos_drm_debugfs_gem_info,	DRIVER_GEM},
};
#define EXYNOS_DRM_DEBUGFS_ENTRIES	ARRAY_SIZE(exynos_drm_debugfs_list)

int exynos_drm_debugfs_init(struct drm_minor *minor)
{
	return drm_debugfs_create_files(exynos_drm_debugfs_list,
					EXYNOS_DRM_DEBUGFS_ENTRIES,
					minor->debugfs_root, minor);
}

void exynos_drm_debugfs_cleanup(struct drm_minor *minor)
{
	drm_debugfs_remove_files(exynos_drm_debugfs_list,
					EXYNOS_DRM_DEBUGFS_ENTRIES, minor);
}