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