summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYoungJun Cho <yj44.cho@samsung.com>2015-02-12 12:59:47 +0900
committerMarek Szyprowski <m.szyprowski@samsung.com>2015-04-13 12:44:56 +0200
commit143b3fee8f6fdce871a9a6f4e7e0046d2ac9c8e0 (patch)
treea57771f341fe7e16356b68ba6668c4c57706de1a
parent9144e7853fb2bbf43ebb1aafe2c06b34289642d1 (diff)
downloadlinux-exynos-143b3fee8f6fdce871a9a6f4e7e0046d2ac9c8e0.tar.gz
linux-exynos-143b3fee8f6fdce871a9a6f4e7e0046d2ac9c8e0.tar.bz2
linux-exynos-143b3fee8f6fdce871a9a6f4e7e0046d2ac9c8e0.zip
drm/exynos: add debugfs interface and gem_info node
The memps requires gem_info with gem_names to analyze graphics shared memory, so this patch adds gem_info node with debugfs interface. Signed-off-by: YoungJun Cho <yj44.cho@samsung.com> Signed-off-by: Seung-Woo Kim <sw0312.kim@samsung.com>
-rw-r--r--drivers/gpu/drm/exynos/Makefile1
-rw-r--r--drivers/gpu/drm/exynos/exynos_drm_debugfs.c93
-rw-r--r--drivers/gpu/drm/exynos/exynos_drm_debugfs.h27
-rw-r--r--drivers/gpu/drm/exynos/exynos_drm_drv.c9
-rw-r--r--drivers/gpu/drm/exynos/exynos_drm_drv.h3
5 files changed, 133 insertions, 0 deletions
diff --git a/drivers/gpu/drm/exynos/Makefile b/drivers/gpu/drm/exynos/Makefile
index cc90679cfc06..025315b99790 100644
--- a/drivers/gpu/drm/exynos/Makefile
+++ b/drivers/gpu/drm/exynos/Makefile
@@ -21,5 +21,6 @@ exynosdrm-$(CONFIG_DRM_EXYNOS_IPP) += exynos_drm_ipp.o
exynosdrm-$(CONFIG_DRM_EXYNOS_FIMC) += exynos_drm_fimc.o
exynosdrm-$(CONFIG_DRM_EXYNOS_ROTATOR) += exynos_drm_rotator.o
exynosdrm-$(CONFIG_DRM_EXYNOS_GSC) += exynos_drm_gsc.o
+exynosdrm-$(CONFIG_DEBUG_FS) += exynos_drm_debugfs.o
obj-$(CONFIG_DRM_EXYNOS) += exynosdrm.o
diff --git a/drivers/gpu/drm/exynos/exynos_drm_debugfs.c b/drivers/gpu/drm/exynos/exynos_drm_debugfs.c
new file mode 100644
index 000000000000..ad65c7b91de5
--- /dev/null
+++ b/drivers/gpu/drm/exynos/exynos_drm_debugfs.c
@@ -0,0 +1,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);
+}
diff --git a/drivers/gpu/drm/exynos/exynos_drm_debugfs.h b/drivers/gpu/drm/exynos/exynos_drm_debugfs.h
new file mode 100644
index 000000000000..17a50b2e55a8
--- /dev/null
+++ b/drivers/gpu/drm/exynos/exynos_drm_debugfs.h
@@ -0,0 +1,27 @@
+/*
+ * 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 Foundationr
+ */
+
+#ifndef _EXYNOS_DRM_DEBUGFS_H_
+#define _EXYNOS_DRM_DEBUGFS_H_
+
+#if defined(CONFIG_DEBUG_FS)
+extern int exynos_drm_debugfs_init(struct drm_minor *minor);
+extern void exynos_drm_debugfs_cleanup(struct drm_minor *minor);
+#else
+static inline int exynos_drm_debugfs_init(struct drm_minor *minor)
+{
+ return 0;
+}
+
+static inline void exynos_drm_debugfs_cleanup(struct drm_minor *minor)
+{
+}
+#endif
+
+#endif /* _EXYNOS_DRM_DEBUGFS_H_ */
diff --git a/drivers/gpu/drm/exynos/exynos_drm_drv.c b/drivers/gpu/drm/exynos/exynos_drm_drv.c
index 90168d7cf66a..2768881b3fd2 100644
--- a/drivers/gpu/drm/exynos/exynos_drm_drv.c
+++ b/drivers/gpu/drm/exynos/exynos_drm_drv.c
@@ -31,6 +31,7 @@
#include "exynos_drm_g2d.h"
#include "exynos_drm_ipp.h"
#include "exynos_drm_iommu.h"
+#include "exynos_drm_debugfs.h"
#define DRIVER_NAME "exynos"
#define DRIVER_DESC "Samsung SoC DRM"
@@ -215,6 +216,10 @@ static int exynos_drm_open(struct drm_device *dev, struct drm_file *file)
if (!file_priv)
return -ENOMEM;
+#if defined(CONFIG_DEBUG_FS)
+ file_priv->tgid = task_tgid_nr(current);
+#endif
+
file->driver_priv = file_priv;
ret = exynos_drm_subdrv_open(dev, file);
@@ -328,6 +333,10 @@ static struct drm_driver exynos_drm_driver = {
.get_vblank_counter = drm_vblank_count,
.enable_vblank = exynos_drm_crtc_enable_vblank,
.disable_vblank = exynos_drm_crtc_disable_vblank,
+#if defined(CONFIG_DEBUG_FS)
+ .debugfs_init = exynos_drm_debugfs_init,
+ .debugfs_cleanup = exynos_drm_debugfs_cleanup,
+#endif
.gem_free_object = exynos_drm_gem_free_object,
.gem_vm_ops = &exynos_drm_gem_vm_ops,
.dumb_create = exynos_drm_gem_dumb_create,
diff --git a/drivers/gpu/drm/exynos/exynos_drm_drv.h b/drivers/gpu/drm/exynos/exynos_drm_drv.h
index 9afd390d4674..6a1ffcb73946 100644
--- a/drivers/gpu/drm/exynos/exynos_drm_drv.h
+++ b/drivers/gpu/drm/exynos/exynos_drm_drv.h
@@ -234,6 +234,9 @@ struct exynos_drm_g2d_private {
struct drm_exynos_file_private {
struct exynos_drm_g2d_private *g2d_priv;
struct device *ipp_dev;
+#if defined(CONFIG_DEBUG_FS)
+ pid_t tgid;
+#endif
};
/*