i915_debugfs.c revision 433e12f78b68a8069f54956edf766bb21394c197
12017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari/* 22017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari * Copyright © 2008 Intel Corporation 32017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari * 42017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari * Permission is hereby granted, free of charge, to any person obtaining a 52017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari * copy of this software and associated documentation files (the "Software"), 62017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari * to deal in the Software without restriction, including without limitation 72017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari * the rights to use, copy, modify, merge, publish, distribute, sublicense, 82017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari * and/or sell copies of the Software, and to permit persons to whom the 92017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari * Software is furnished to do so, subject to the following conditions: 102017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari * 112017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari * The above copyright notice and this permission notice (including the next 122017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari * paragraph) shall be included in all copies or substantial portions of the 132017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari * Software. 142017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari * 152017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 162017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 172017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 182017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 192017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 202017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS 212017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari * IN THE SOFTWARE. 222017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari * 232017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari * Authors: 242017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari * Eric Anholt <eric@anholt.net> 252017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari * Keith Packard <keithp@keithp.com> 262017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari * 272017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari */ 282017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari 292017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari#include <linux/seq_file.h> 302017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari#include "drmP.h" 312017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari#include "drm.h" 322017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari#include "i915_drm.h" 332017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari#include "i915_drv.h" 342017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari 352017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari#define DRM_I915_RING_DEBUG 1 362017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari 372017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari 382017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari#if defined(CONFIG_DEBUG_FS) 392017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari 40433e12f78b68a8069f54956edf766bb21394c197Ben Gamari#define ACTIVE_LIST 1 41433e12f78b68a8069f54956edf766bb21394c197Ben Gamari#define FLUSHING_LIST 2 42433e12f78b68a8069f54956edf766bb21394c197Ben Gamari#define INACTIVE_LIST 3 432017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari 44433e12f78b68a8069f54956edf766bb21394c197Ben Gamaristatic int i915_gem_object_list_info(struct seq_file *m, void *data) 452017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari{ 462017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari struct drm_info_node *node = (struct drm_info_node *) m->private; 47433e12f78b68a8069f54956edf766bb21394c197Ben Gamari uintptr_t list = (uintptr_t) node->info_ent->data; 48433e12f78b68a8069f54956edf766bb21394c197Ben Gamari struct list_head *head; 492017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari struct drm_device *dev = node->minor->dev; 502017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari drm_i915_private_t *dev_priv = dev->dev_private; 512017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari struct drm_i915_gem_object *obj_priv; 522017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari 53433e12f78b68a8069f54956edf766bb21394c197Ben Gamari switch (list) { 54433e12f78b68a8069f54956edf766bb21394c197Ben Gamari case ACTIVE_LIST: 55433e12f78b68a8069f54956edf766bb21394c197Ben Gamari seq_printf(m, "Active:\n"); 56433e12f78b68a8069f54956edf766bb21394c197Ben Gamari head = &dev_priv->mm.active_list; 57433e12f78b68a8069f54956edf766bb21394c197Ben Gamari break; 58433e12f78b68a8069f54956edf766bb21394c197Ben Gamari case INACTIVE_LIST: 59433e12f78b68a8069f54956edf766bb21394c197Ben Gamari seq_printf(m, "Inctive:\n"); 60433e12f78b68a8069f54956edf766bb21394c197Ben Gamari head = &dev_priv->mm.inactive_list; 61433e12f78b68a8069f54956edf766bb21394c197Ben Gamari break; 62433e12f78b68a8069f54956edf766bb21394c197Ben Gamari case FLUSHING_LIST: 63433e12f78b68a8069f54956edf766bb21394c197Ben Gamari seq_printf(m, "Flushing:\n"); 64433e12f78b68a8069f54956edf766bb21394c197Ben Gamari head = &dev_priv->mm.flushing_list; 65433e12f78b68a8069f54956edf766bb21394c197Ben Gamari break; 66433e12f78b68a8069f54956edf766bb21394c197Ben Gamari default: 67433e12f78b68a8069f54956edf766bb21394c197Ben Gamari DRM_INFO("Ooops, unexpected list\n"); 68433e12f78b68a8069f54956edf766bb21394c197Ben Gamari return 0; 692017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari } 702017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari 71433e12f78b68a8069f54956edf766bb21394c197Ben Gamari list_for_each_entry(obj_priv, head, list) 722017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari { 732017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari struct drm_gem_object *obj = obj_priv->obj; 742017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari if (obj->name) { 752017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari seq_printf(m, " %p(%d): %08x %08x %d\n", 762017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari obj, obj->name, 772017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari obj->read_domains, obj->write_domain, 782017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari obj_priv->last_rendering_seqno); 792017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari } else { 80433e12f78b68a8069f54956edf766bb21394c197Ben Gamari seq_printf(m, " %p: %08x %08x %d\n", 81433e12f78b68a8069f54956edf766bb21394c197Ben Gamari obj, 822017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari obj->read_domains, obj->write_domain, 832017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari obj_priv->last_rendering_seqno); 842017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari } 852017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari } 862017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari return 0; 872017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari} 882017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari 892017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamaristatic int i915_gem_request_info(struct seq_file *m, void *data) 902017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari{ 912017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari struct drm_info_node *node = (struct drm_info_node *) m->private; 922017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari struct drm_device *dev = node->minor->dev; 932017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari drm_i915_private_t *dev_priv = dev->dev_private; 942017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari struct drm_i915_gem_request *gem_request; 952017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari 962017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari seq_printf(m, "Request:\n"); 972017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari list_for_each_entry(gem_request, &dev_priv->mm.request_list, list) { 982017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari seq_printf(m, " %d @ %d\n", 992017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari gem_request->seqno, 1002017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari (int) (jiffies - gem_request->emitted_jiffies)); 1012017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari } 1022017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari return 0; 1032017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari} 1042017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari 1052017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamaristatic int i915_gem_seqno_info(struct seq_file *m, void *data) 1062017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari{ 1072017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari struct drm_info_node *node = (struct drm_info_node *) m->private; 1082017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari struct drm_device *dev = node->minor->dev; 1092017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari drm_i915_private_t *dev_priv = dev->dev_private; 1102017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari 1112017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari if (dev_priv->hw_status_page != NULL) { 1122017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari seq_printf(m, "Current sequence: %d\n", 1132017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari i915_get_gem_seqno(dev)); 1142017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari } else { 1152017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari seq_printf(m, "Current sequence: hws uninitialized\n"); 1162017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari } 1172017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari seq_printf(m, "Waiter sequence: %d\n", 1182017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari dev_priv->mm.waiting_gem_seqno); 1192017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari seq_printf(m, "IRQ sequence: %d\n", dev_priv->mm.irq_gem_seqno); 1202017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari return 0; 1212017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari} 1222017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari 1232017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari 1242017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamaristatic int i915_interrupt_info(struct seq_file *m, void *data) 1252017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari{ 1262017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari struct drm_info_node *node = (struct drm_info_node *) m->private; 1272017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari struct drm_device *dev = node->minor->dev; 1282017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari drm_i915_private_t *dev_priv = dev->dev_private; 1292017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari 1302017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari seq_printf(m, "Interrupt enable: %08x\n", 1312017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari I915_READ(IER)); 1322017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari seq_printf(m, "Interrupt identity: %08x\n", 1332017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari I915_READ(IIR)); 1342017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari seq_printf(m, "Interrupt mask: %08x\n", 1352017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari I915_READ(IMR)); 1362017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari seq_printf(m, "Pipe A stat: %08x\n", 1372017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari I915_READ(PIPEASTAT)); 1382017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari seq_printf(m, "Pipe B stat: %08x\n", 1392017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari I915_READ(PIPEBSTAT)); 1402017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari seq_printf(m, "Interrupts received: %d\n", 1412017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari atomic_read(&dev_priv->irq_received)); 1422017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari if (dev_priv->hw_status_page != NULL) { 1432017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari seq_printf(m, "Current sequence: %d\n", 1442017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari i915_get_gem_seqno(dev)); 1452017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari } else { 1462017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari seq_printf(m, "Current sequence: hws uninitialized\n"); 1472017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari } 1482017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari seq_printf(m, "Waiter sequence: %d\n", 1492017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari dev_priv->mm.waiting_gem_seqno); 1502017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari seq_printf(m, "IRQ sequence: %d\n", 1512017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari dev_priv->mm.irq_gem_seqno); 1522017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari return 0; 1532017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari} 1542017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari 1552017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamaristatic int i915_hws_info(struct seq_file *m, void *data) 1562017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari{ 1572017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari struct drm_info_node *node = (struct drm_info_node *) m->private; 1582017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari struct drm_device *dev = node->minor->dev; 1592017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari drm_i915_private_t *dev_priv = dev->dev_private; 1602017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari int i; 1612017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari volatile u32 *hws; 1622017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari 1632017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari hws = (volatile u32 *)dev_priv->hw_status_page; 1642017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari if (hws == NULL) 1652017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari return 0; 1662017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari 1672017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari for (i = 0; i < 4096 / sizeof(u32) / 4; i += 4) { 1682017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari seq_printf(m, "0x%08x: 0x%08x 0x%08x 0x%08x 0x%08x\n", 1692017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari i * 4, 1702017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari hws[i], hws[i + 1], hws[i + 2], hws[i + 3]); 1712017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari } 1722017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari return 0; 1732017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari} 1742017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari 1752017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamaristatic struct drm_info_list i915_gem_debugfs_list[] = { 176433e12f78b68a8069f54956edf766bb21394c197Ben Gamari {"i915_gem_active", i915_gem_object_list_info, 0, (void *) ACTIVE_LIST}, 177433e12f78b68a8069f54956edf766bb21394c197Ben Gamari {"i915_gem_flushing", i915_gem_object_list_info, 0, (void *) FLUSHING_LIST}, 178433e12f78b68a8069f54956edf766bb21394c197Ben Gamari {"i915_gem_inactive", i915_gem_object_list_info, 0, (void *) INACTIVE_LIST}, 1792017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari {"i915_gem_request", i915_gem_request_info, 0}, 1802017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari {"i915_gem_seqno", i915_gem_seqno_info, 0}, 1812017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari {"i915_gem_interrupt", i915_interrupt_info, 0}, 1822017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari {"i915_gem_hws", i915_hws_info, 0}, 1832017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari}; 1842017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari#define I915_GEM_DEBUGFS_ENTRIES ARRAY_SIZE(i915_gem_debugfs_list) 1852017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari 1862017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamariint i915_gem_debugfs_init(struct drm_minor *minor) 1872017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari{ 1882017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari return drm_debugfs_create_files(i915_gem_debugfs_list, 1892017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari I915_GEM_DEBUGFS_ENTRIES, 1902017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari minor->debugfs_root, minor); 1912017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari} 1922017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari 1932017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamarivoid i915_gem_debugfs_cleanup(struct drm_minor *minor) 1942017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari{ 1952017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari drm_debugfs_remove_files(i915_gem_debugfs_list, 1962017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari I915_GEM_DEBUGFS_ENTRIES, minor); 1972017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari} 1982017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari 1992017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari#endif /* CONFIG_DEBUG_FS */ 2002017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari 201