diff options
author | YoungJun Cho <yj44.cho@samsung.com> | 2015-02-12 12:59:47 +0900 |
---|---|---|
committer | Marek Szyprowski <m.szyprowski@samsung.com> | 2015-04-13 12:44:56 +0200 |
commit | 143b3fee8f6fdce871a9a6f4e7e0046d2ac9c8e0 (patch) | |
tree | a57771f341fe7e16356b68ba6668c4c57706de1a | |
parent | 9144e7853fb2bbf43ebb1aafe2c06b34289642d1 (diff) | |
download | linux-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/Makefile | 1 | ||||
-rw-r--r-- | drivers/gpu/drm/exynos/exynos_drm_debugfs.c | 93 | ||||
-rw-r--r-- | drivers/gpu/drm/exynos/exynos_drm_debugfs.h | 27 | ||||
-rw-r--r-- | drivers/gpu/drm/exynos/exynos_drm_drv.c | 9 | ||||
-rw-r--r-- | drivers/gpu/drm/exynos/exynos_drm_drv.h | 3 |
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 }; /* |