16169a1488fe2f76e80bd49c18e41be5bbbf29f3fAndy Gross/* 28bb0daffb0b8e45188066255b4203446eae181f1Rob Clark * drivers/gpu/drm/omapdrm/omap_debugfs.c 36169a1488fe2f76e80bd49c18e41be5bbbf29f3fAndy Gross * 46169a1488fe2f76e80bd49c18e41be5bbbf29f3fAndy Gross * Copyright (C) 2011 Texas Instruments 56169a1488fe2f76e80bd49c18e41be5bbbf29f3fAndy Gross * Author: Rob Clark <rob.clark@linaro.org> 66169a1488fe2f76e80bd49c18e41be5bbbf29f3fAndy Gross * 76169a1488fe2f76e80bd49c18e41be5bbbf29f3fAndy Gross * This program is free software; you can redistribute it and/or modify it 86169a1488fe2f76e80bd49c18e41be5bbbf29f3fAndy Gross * under the terms of the GNU General Public License version 2 as published by 96169a1488fe2f76e80bd49c18e41be5bbbf29f3fAndy Gross * the Free Software Foundation. 106169a1488fe2f76e80bd49c18e41be5bbbf29f3fAndy Gross * 116169a1488fe2f76e80bd49c18e41be5bbbf29f3fAndy Gross * This program is distributed in the hope that it will be useful, but WITHOUT 126169a1488fe2f76e80bd49c18e41be5bbbf29f3fAndy Gross * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 136169a1488fe2f76e80bd49c18e41be5bbbf29f3fAndy Gross * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 146169a1488fe2f76e80bd49c18e41be5bbbf29f3fAndy Gross * more details. 156169a1488fe2f76e80bd49c18e41be5bbbf29f3fAndy Gross * 166169a1488fe2f76e80bd49c18e41be5bbbf29f3fAndy Gross * You should have received a copy of the GNU General Public License along with 176169a1488fe2f76e80bd49c18e41be5bbbf29f3fAndy Gross * this program. If not, see <http://www.gnu.org/licenses/>. 186169a1488fe2f76e80bd49c18e41be5bbbf29f3fAndy Gross */ 196169a1488fe2f76e80bd49c18e41be5bbbf29f3fAndy Gross 206169a1488fe2f76e80bd49c18e41be5bbbf29f3fAndy Gross#include "omap_drv.h" 216169a1488fe2f76e80bd49c18e41be5bbbf29f3fAndy Gross#include "omap_dmm_tiler.h" 226169a1488fe2f76e80bd49c18e41be5bbbf29f3fAndy Gross 23f6b6036e56ca17378dd0294b684db623abd6a901Rob Clark#include "drm_fb_helper.h" 24f6b6036e56ca17378dd0294b684db623abd6a901Rob Clark 25f6b6036e56ca17378dd0294b684db623abd6a901Rob Clark 266169a1488fe2f76e80bd49c18e41be5bbbf29f3fAndy Gross#ifdef CONFIG_DEBUG_FS 276169a1488fe2f76e80bd49c18e41be5bbbf29f3fAndy Gross 28f6b6036e56ca17378dd0294b684db623abd6a901Rob Clarkstatic int gem_show(struct seq_file *m, void *arg) 29f6b6036e56ca17378dd0294b684db623abd6a901Rob Clark{ 30f6b6036e56ca17378dd0294b684db623abd6a901Rob Clark struct drm_info_node *node = (struct drm_info_node *) m->private; 31f6b6036e56ca17378dd0294b684db623abd6a901Rob Clark struct drm_device *dev = node->minor->dev; 32f6b6036e56ca17378dd0294b684db623abd6a901Rob Clark struct omap_drm_private *priv = dev->dev_private; 33f6b6036e56ca17378dd0294b684db623abd6a901Rob Clark int ret; 34f6b6036e56ca17378dd0294b684db623abd6a901Rob Clark 35f6b6036e56ca17378dd0294b684db623abd6a901Rob Clark ret = mutex_lock_interruptible(&dev->struct_mutex); 36f6b6036e56ca17378dd0294b684db623abd6a901Rob Clark if (ret) 37f6b6036e56ca17378dd0294b684db623abd6a901Rob Clark return ret; 38f6b6036e56ca17378dd0294b684db623abd6a901Rob Clark 39f6b6036e56ca17378dd0294b684db623abd6a901Rob Clark seq_printf(m, "All Objects:\n"); 40f6b6036e56ca17378dd0294b684db623abd6a901Rob Clark omap_gem_describe_objects(&priv->obj_list, m); 41f6b6036e56ca17378dd0294b684db623abd6a901Rob Clark 42f6b6036e56ca17378dd0294b684db623abd6a901Rob Clark mutex_unlock(&dev->struct_mutex); 43f6b6036e56ca17378dd0294b684db623abd6a901Rob Clark 44f6b6036e56ca17378dd0294b684db623abd6a901Rob Clark return 0; 45f6b6036e56ca17378dd0294b684db623abd6a901Rob Clark} 46f6b6036e56ca17378dd0294b684db623abd6a901Rob Clark 47f6b6036e56ca17378dd0294b684db623abd6a901Rob Clarkstatic int mm_show(struct seq_file *m, void *arg) 48f6b6036e56ca17378dd0294b684db623abd6a901Rob Clark{ 49f6b6036e56ca17378dd0294b684db623abd6a901Rob Clark struct drm_info_node *node = (struct drm_info_node *) m->private; 50f6b6036e56ca17378dd0294b684db623abd6a901Rob Clark struct drm_device *dev = node->minor->dev; 51b04a590623661132fbafdda53a6566b227dc39cfDaniel Vetter return drm_mm_dump_table(m, &dev->vma_offset_manager->vm_addr_space_mm); 52f6b6036e56ca17378dd0294b684db623abd6a901Rob Clark} 53f6b6036e56ca17378dd0294b684db623abd6a901Rob Clark 54f6b6036e56ca17378dd0294b684db623abd6a901Rob Clarkstatic int fb_show(struct seq_file *m, void *arg) 55f6b6036e56ca17378dd0294b684db623abd6a901Rob Clark{ 56f6b6036e56ca17378dd0294b684db623abd6a901Rob Clark struct drm_info_node *node = (struct drm_info_node *) m->private; 57f6b6036e56ca17378dd0294b684db623abd6a901Rob Clark struct drm_device *dev = node->minor->dev; 58f6b6036e56ca17378dd0294b684db623abd6a901Rob Clark struct omap_drm_private *priv = dev->dev_private; 59f6b6036e56ca17378dd0294b684db623abd6a901Rob Clark struct drm_framebuffer *fb; 60f6b6036e56ca17378dd0294b684db623abd6a901Rob Clark 61f6b6036e56ca17378dd0294b684db623abd6a901Rob Clark seq_printf(m, "fbcon "); 62f6b6036e56ca17378dd0294b684db623abd6a901Rob Clark omap_framebuffer_describe(priv->fbdev->fb, m); 63f6b6036e56ca17378dd0294b684db623abd6a901Rob Clark 644b096ac10da0b63f09bd123b86fed8deb80646ceDaniel Vetter mutex_lock(&dev->mode_config.fb_lock); 65f6b6036e56ca17378dd0294b684db623abd6a901Rob Clark list_for_each_entry(fb, &dev->mode_config.fb_list, head) { 66f6b6036e56ca17378dd0294b684db623abd6a901Rob Clark if (fb == priv->fbdev->fb) 67f6b6036e56ca17378dd0294b684db623abd6a901Rob Clark continue; 68f6b6036e56ca17378dd0294b684db623abd6a901Rob Clark 69f6b6036e56ca17378dd0294b684db623abd6a901Rob Clark seq_printf(m, "user "); 70f6b6036e56ca17378dd0294b684db623abd6a901Rob Clark omap_framebuffer_describe(fb, m); 71f6b6036e56ca17378dd0294b684db623abd6a901Rob Clark } 724b096ac10da0b63f09bd123b86fed8deb80646ceDaniel Vetter mutex_unlock(&dev->mode_config.fb_lock); 73f6b6036e56ca17378dd0294b684db623abd6a901Rob Clark 74f6b6036e56ca17378dd0294b684db623abd6a901Rob Clark return 0; 75f6b6036e56ca17378dd0294b684db623abd6a901Rob Clark} 76f6b6036e56ca17378dd0294b684db623abd6a901Rob Clark 77f6b6036e56ca17378dd0294b684db623abd6a901Rob Clark/* list of debufs files that are applicable to all devices */ 786169a1488fe2f76e80bd49c18e41be5bbbf29f3fAndy Grossstatic struct drm_info_list omap_debugfs_list[] = { 79f6b6036e56ca17378dd0294b684db623abd6a901Rob Clark {"gem", gem_show, 0}, 80f6b6036e56ca17378dd0294b684db623abd6a901Rob Clark {"mm", mm_show, 0}, 81f6b6036e56ca17378dd0294b684db623abd6a901Rob Clark {"fb", fb_show, 0}, 82f6b6036e56ca17378dd0294b684db623abd6a901Rob Clark}; 83f6b6036e56ca17378dd0294b684db623abd6a901Rob Clark 84f6b6036e56ca17378dd0294b684db623abd6a901Rob Clark/* list of debugfs files that are specific to devices with dmm/tiler */ 85f6b6036e56ca17378dd0294b684db623abd6a901Rob Clarkstatic struct drm_info_list omap_dmm_debugfs_list[] = { 866169a1488fe2f76e80bd49c18e41be5bbbf29f3fAndy Gross {"tiler_map", tiler_map_show, 0}, 876169a1488fe2f76e80bd49c18e41be5bbbf29f3fAndy Gross}; 886169a1488fe2f76e80bd49c18e41be5bbbf29f3fAndy Gross 896169a1488fe2f76e80bd49c18e41be5bbbf29f3fAndy Grossint omap_debugfs_init(struct drm_minor *minor) 906169a1488fe2f76e80bd49c18e41be5bbbf29f3fAndy Gross{ 91f6b6036e56ca17378dd0294b684db623abd6a901Rob Clark struct drm_device *dev = minor->dev; 92f6b6036e56ca17378dd0294b684db623abd6a901Rob Clark int ret; 93f6b6036e56ca17378dd0294b684db623abd6a901Rob Clark 94f6b6036e56ca17378dd0294b684db623abd6a901Rob Clark ret = drm_debugfs_create_files(omap_debugfs_list, 956169a1488fe2f76e80bd49c18e41be5bbbf29f3fAndy Gross ARRAY_SIZE(omap_debugfs_list), 966169a1488fe2f76e80bd49c18e41be5bbbf29f3fAndy Gross minor->debugfs_root, minor); 97f6b6036e56ca17378dd0294b684db623abd6a901Rob Clark 98f6b6036e56ca17378dd0294b684db623abd6a901Rob Clark if (ret) { 99f6b6036e56ca17378dd0294b684db623abd6a901Rob Clark dev_err(dev->dev, "could not install omap_debugfs_list\n"); 100f6b6036e56ca17378dd0294b684db623abd6a901Rob Clark return ret; 101f6b6036e56ca17378dd0294b684db623abd6a901Rob Clark } 102f6b6036e56ca17378dd0294b684db623abd6a901Rob Clark 103132390c79e01b3da732bc7b5d9e729b52086ceb6Andy Gross if (dmm_is_available()) 104132390c79e01b3da732bc7b5d9e729b52086ceb6Andy Gross ret = drm_debugfs_create_files(omap_dmm_debugfs_list, 105132390c79e01b3da732bc7b5d9e729b52086ceb6Andy Gross ARRAY_SIZE(omap_dmm_debugfs_list), 106132390c79e01b3da732bc7b5d9e729b52086ceb6Andy Gross minor->debugfs_root, minor); 107f6b6036e56ca17378dd0294b684db623abd6a901Rob Clark 108f6b6036e56ca17378dd0294b684db623abd6a901Rob Clark if (ret) { 109f6b6036e56ca17378dd0294b684db623abd6a901Rob Clark dev_err(dev->dev, "could not install omap_dmm_debugfs_list\n"); 110f6b6036e56ca17378dd0294b684db623abd6a901Rob Clark return ret; 111f6b6036e56ca17378dd0294b684db623abd6a901Rob Clark } 112f6b6036e56ca17378dd0294b684db623abd6a901Rob Clark 113f6b6036e56ca17378dd0294b684db623abd6a901Rob Clark return ret; 1146169a1488fe2f76e80bd49c18e41be5bbbf29f3fAndy Gross} 1156169a1488fe2f76e80bd49c18e41be5bbbf29f3fAndy Gross 1166169a1488fe2f76e80bd49c18e41be5bbbf29f3fAndy Grossvoid omap_debugfs_cleanup(struct drm_minor *minor) 1176169a1488fe2f76e80bd49c18e41be5bbbf29f3fAndy Gross{ 1186169a1488fe2f76e80bd49c18e41be5bbbf29f3fAndy Gross drm_debugfs_remove_files(omap_debugfs_list, 1196169a1488fe2f76e80bd49c18e41be5bbbf29f3fAndy Gross ARRAY_SIZE(omap_debugfs_list), minor); 120132390c79e01b3da732bc7b5d9e729b52086ceb6Andy Gross if (dmm_is_available()) 121132390c79e01b3da732bc7b5d9e729b52086ceb6Andy Gross drm_debugfs_remove_files(omap_dmm_debugfs_list, 122132390c79e01b3da732bc7b5d9e729b52086ceb6Andy Gross ARRAY_SIZE(omap_dmm_debugfs_list), minor); 1236169a1488fe2f76e80bd49c18e41be5bbbf29f3fAndy Gross} 1246169a1488fe2f76e80bd49c18e41be5bbbf29f3fAndy Gross 1256169a1488fe2f76e80bd49c18e41be5bbbf29f3fAndy Gross#endif 126