i915_debugfs.c revision 9c928d168d4030a230a7a5ee1764721d173f1153
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>
30f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson#include <linux/debugfs.h>
315a0e3ad6af8660be21ca98a971cd00f331318c05Tejun Heo#include <linux/slab.h>
322017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari#include "drmP.h"
332017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari#include "drm.h"
342017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari#include "i915_drm.h"
352017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari#include "i915_drv.h"
362017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari
372017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari#define DRM_I915_RING_DEBUG 1
382017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari
392017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari
402017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari#if defined(CONFIG_DEBUG_FS)
412017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari
42433e12f78b68a8069f54956edf766bb21394c197Ben Gamari#define ACTIVE_LIST	1
43433e12f78b68a8069f54956edf766bb21394c197Ben Gamari#define FLUSHING_LIST	2
44433e12f78b68a8069f54956edf766bb21394c197Ben Gamari#define INACTIVE_LIST	3
452017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari
46a6172a80ecb7ac64151960de1f709f78b509c57cChris Wilsonstatic const char *get_pin_flag(struct drm_i915_gem_object *obj_priv)
47a6172a80ecb7ac64151960de1f709f78b509c57cChris Wilson{
48a6172a80ecb7ac64151960de1f709f78b509c57cChris Wilson	if (obj_priv->user_pin_count > 0)
49a6172a80ecb7ac64151960de1f709f78b509c57cChris Wilson		return "P";
50a6172a80ecb7ac64151960de1f709f78b509c57cChris Wilson	else if (obj_priv->pin_count > 0)
51a6172a80ecb7ac64151960de1f709f78b509c57cChris Wilson		return "p";
52a6172a80ecb7ac64151960de1f709f78b509c57cChris Wilson	else
53a6172a80ecb7ac64151960de1f709f78b509c57cChris Wilson		return " ";
54a6172a80ecb7ac64151960de1f709f78b509c57cChris Wilson}
55a6172a80ecb7ac64151960de1f709f78b509c57cChris Wilson
56a6172a80ecb7ac64151960de1f709f78b509c57cChris Wilsonstatic const char *get_tiling_flag(struct drm_i915_gem_object *obj_priv)
57a6172a80ecb7ac64151960de1f709f78b509c57cChris Wilson{
58a6172a80ecb7ac64151960de1f709f78b509c57cChris Wilson    switch (obj_priv->tiling_mode) {
59a6172a80ecb7ac64151960de1f709f78b509c57cChris Wilson    default:
60a6172a80ecb7ac64151960de1f709f78b509c57cChris Wilson    case I915_TILING_NONE: return " ";
61a6172a80ecb7ac64151960de1f709f78b509c57cChris Wilson    case I915_TILING_X: return "X";
62a6172a80ecb7ac64151960de1f709f78b509c57cChris Wilson    case I915_TILING_Y: return "Y";
63a6172a80ecb7ac64151960de1f709f78b509c57cChris Wilson    }
64a6172a80ecb7ac64151960de1f709f78b509c57cChris Wilson}
65a6172a80ecb7ac64151960de1f709f78b509c57cChris Wilson
66433e12f78b68a8069f54956edf766bb21394c197Ben Gamaristatic int i915_gem_object_list_info(struct seq_file *m, void *data)
672017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari{
682017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari	struct drm_info_node *node = (struct drm_info_node *) m->private;
69433e12f78b68a8069f54956edf766bb21394c197Ben Gamari	uintptr_t list = (uintptr_t) node->info_ent->data;
70433e12f78b68a8069f54956edf766bb21394c197Ben Gamari	struct list_head *head;
712017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari	struct drm_device *dev = node->minor->dev;
722017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari	drm_i915_private_t *dev_priv = dev->dev_private;
732017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari	struct drm_i915_gem_object *obj_priv;
745e118f4139feafe97e913df67b1f7c1e5083e535Carl Worth	spinlock_t *lock = NULL;
752017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari
76433e12f78b68a8069f54956edf766bb21394c197Ben Gamari	switch (list) {
77433e12f78b68a8069f54956edf766bb21394c197Ben Gamari	case ACTIVE_LIST:
78433e12f78b68a8069f54956edf766bb21394c197Ben Gamari		seq_printf(m, "Active:\n");
795e118f4139feafe97e913df67b1f7c1e5083e535Carl Worth		lock = &dev_priv->mm.active_list_lock;
80852835f343146a82a528c3b712b373661d4fa17aZou Nan hai		head = &dev_priv->render_ring.active_list;
81433e12f78b68a8069f54956edf766bb21394c197Ben Gamari		break;
82433e12f78b68a8069f54956edf766bb21394c197Ben Gamari	case INACTIVE_LIST:
83a17458fc9d9edc98b7c5865cdc42681cf9059f1cBen Gamari		seq_printf(m, "Inactive:\n");
84433e12f78b68a8069f54956edf766bb21394c197Ben Gamari		head = &dev_priv->mm.inactive_list;
85433e12f78b68a8069f54956edf766bb21394c197Ben Gamari		break;
86433e12f78b68a8069f54956edf766bb21394c197Ben Gamari	case FLUSHING_LIST:
87433e12f78b68a8069f54956edf766bb21394c197Ben Gamari		seq_printf(m, "Flushing:\n");
88433e12f78b68a8069f54956edf766bb21394c197Ben Gamari		head = &dev_priv->mm.flushing_list;
89433e12f78b68a8069f54956edf766bb21394c197Ben Gamari		break;
90433e12f78b68a8069f54956edf766bb21394c197Ben Gamari	default:
91433e12f78b68a8069f54956edf766bb21394c197Ben Gamari		DRM_INFO("Ooops, unexpected list\n");
92433e12f78b68a8069f54956edf766bb21394c197Ben Gamari		return 0;
932017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari	}
942017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari
95a17458fc9d9edc98b7c5865cdc42681cf9059f1cBen Gamari	if (lock)
96a17458fc9d9edc98b7c5865cdc42681cf9059f1cBen Gamari		spin_lock(lock);
97433e12f78b68a8069f54956edf766bb21394c197Ben Gamari	list_for_each_entry(obj_priv, head, list)
982017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari	{
99fcffb947668073fd9c47da33f8e72add7f62163dChris Wilson		seq_printf(m, "    %p: %s %8zd %08x %08x %d%s%s",
100a8089e849a32c5b6bfd6c88dbd09c0ea4a779b71Daniel Vetter			   &obj_priv->base,
101a6172a80ecb7ac64151960de1f709f78b509c57cChris Wilson			   get_pin_flag(obj_priv),
102a8089e849a32c5b6bfd6c88dbd09c0ea4a779b71Daniel Vetter			   obj_priv->base.size,
103a8089e849a32c5b6bfd6c88dbd09c0ea4a779b71Daniel Vetter			   obj_priv->base.read_domains,
104a8089e849a32c5b6bfd6c88dbd09c0ea4a779b71Daniel Vetter			   obj_priv->base.write_domain,
105725ceaa08a98fcdb1ec1c302700e33b629aece4bChris Wilson			   obj_priv->last_rendering_seqno,
106fcffb947668073fd9c47da33f8e72add7f62163dChris Wilson			   obj_priv->dirty ? " dirty" : "",
107fcffb947668073fd9c47da33f8e72add7f62163dChris Wilson			   obj_priv->madv == I915_MADV_DONTNEED ? " purgeable" : "");
108f4ceda89895b56e2c03dd327f13d0256838a20abEric Anholt
109a8089e849a32c5b6bfd6c88dbd09c0ea4a779b71Daniel Vetter		if (obj_priv->base.name)
110a8089e849a32c5b6bfd6c88dbd09c0ea4a779b71Daniel Vetter			seq_printf(m, " (name: %d)", obj_priv->base.name);
111f4ceda89895b56e2c03dd327f13d0256838a20abEric Anholt		if (obj_priv->fence_reg != I915_FENCE_REG_NONE)
112a01c75b338d7c743a8982011f01a4714ad2956deBen Gamari			seq_printf(m, " (fence: %d)", obj_priv->fence_reg);
113a01c75b338d7c743a8982011f01a4714ad2956deBen Gamari		if (obj_priv->gtt_space != NULL)
114a01c75b338d7c743a8982011f01a4714ad2956deBen Gamari			seq_printf(m, " (gtt_offset: %08x)", obj_priv->gtt_offset);
115a01c75b338d7c743a8982011f01a4714ad2956deBen Gamari
116f4ceda89895b56e2c03dd327f13d0256838a20abEric Anholt		seq_printf(m, "\n");
1172017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari	}
1185e118f4139feafe97e913df67b1f7c1e5083e535Carl Worth
1195e118f4139feafe97e913df67b1f7c1e5083e535Carl Worth	if (lock)
1205e118f4139feafe97e913df67b1f7c1e5083e535Carl Worth	    spin_unlock(lock);
1212017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari	return 0;
1222017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari}
1232017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari
1242017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamaristatic int i915_gem_request_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	struct drm_i915_gem_request *gem_request;
1302017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari
1312017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari	seq_printf(m, "Request:\n");
132852835f343146a82a528c3b712b373661d4fa17aZou Nan hai	list_for_each_entry(gem_request, &dev_priv->render_ring.request_list,
133852835f343146a82a528c3b712b373661d4fa17aZou Nan hai			list) {
1342017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari		seq_printf(m, "    %d @ %d\n",
1352017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari			   gem_request->seqno,
1362017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari			   (int) (jiffies - gem_request->emitted_jiffies));
1372017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari	}
1382017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari	return 0;
1392017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari}
1402017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari
1412017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamaristatic int i915_gem_seqno_info(struct seq_file *m, void *data)
1422017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari{
1432017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari	struct drm_info_node *node = (struct drm_info_node *) m->private;
1442017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari	struct drm_device *dev = node->minor->dev;
1452017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari	drm_i915_private_t *dev_priv = dev->dev_private;
1462017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari
147e20f9c64c79e2282f9eb531509181965ec8f0a92Eric Anholt	if (dev_priv->render_ring.status_page.page_addr != NULL) {
1482017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari		seq_printf(m, "Current sequence: %d\n",
149852835f343146a82a528c3b712b373661d4fa17aZou Nan hai			   i915_get_gem_seqno(dev,  &dev_priv->render_ring));
1502017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari	} else {
1512017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari		seq_printf(m, "Current sequence: hws uninitialized\n");
1522017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari	}
1532017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari	seq_printf(m, "Waiter sequence:  %d\n",
1542017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari			dev_priv->mm.waiting_gem_seqno);
1552017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari	seq_printf(m, "IRQ sequence:     %d\n", dev_priv->mm.irq_gem_seqno);
1562017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari	return 0;
1572017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari}
1582017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari
1592017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari
1602017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamaristatic int i915_interrupt_info(struct seq_file *m, void *data)
1612017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari{
1622017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari	struct drm_info_node *node = (struct drm_info_node *) m->private;
1632017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari	struct drm_device *dev = node->minor->dev;
1642017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari	drm_i915_private_t *dev_priv = dev->dev_private;
1652017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari
166bad720ff3e8e47a04bd88d9bbc8317e7d7e049d3Eric Anholt	if (!HAS_PCH_SPLIT(dev)) {
1675f6a169598938d9e5703f06b64c4f4f972561ce5Zhenyu Wang		seq_printf(m, "Interrupt enable:    %08x\n",
1685f6a169598938d9e5703f06b64c4f4f972561ce5Zhenyu Wang			   I915_READ(IER));
1695f6a169598938d9e5703f06b64c4f4f972561ce5Zhenyu Wang		seq_printf(m, "Interrupt identity:  %08x\n",
1705f6a169598938d9e5703f06b64c4f4f972561ce5Zhenyu Wang			   I915_READ(IIR));
1715f6a169598938d9e5703f06b64c4f4f972561ce5Zhenyu Wang		seq_printf(m, "Interrupt mask:      %08x\n",
1725f6a169598938d9e5703f06b64c4f4f972561ce5Zhenyu Wang			   I915_READ(IMR));
1735f6a169598938d9e5703f06b64c4f4f972561ce5Zhenyu Wang		seq_printf(m, "Pipe A stat:         %08x\n",
1745f6a169598938d9e5703f06b64c4f4f972561ce5Zhenyu Wang			   I915_READ(PIPEASTAT));
1755f6a169598938d9e5703f06b64c4f4f972561ce5Zhenyu Wang		seq_printf(m, "Pipe B stat:         %08x\n",
1765f6a169598938d9e5703f06b64c4f4f972561ce5Zhenyu Wang			   I915_READ(PIPEBSTAT));
1775f6a169598938d9e5703f06b64c4f4f972561ce5Zhenyu Wang	} else {
1785f6a169598938d9e5703f06b64c4f4f972561ce5Zhenyu Wang		seq_printf(m, "North Display Interrupt enable:		%08x\n",
1795f6a169598938d9e5703f06b64c4f4f972561ce5Zhenyu Wang			   I915_READ(DEIER));
1805f6a169598938d9e5703f06b64c4f4f972561ce5Zhenyu Wang		seq_printf(m, "North Display Interrupt identity:	%08x\n",
1815f6a169598938d9e5703f06b64c4f4f972561ce5Zhenyu Wang			   I915_READ(DEIIR));
1825f6a169598938d9e5703f06b64c4f4f972561ce5Zhenyu Wang		seq_printf(m, "North Display Interrupt mask:		%08x\n",
1835f6a169598938d9e5703f06b64c4f4f972561ce5Zhenyu Wang			   I915_READ(DEIMR));
1845f6a169598938d9e5703f06b64c4f4f972561ce5Zhenyu Wang		seq_printf(m, "South Display Interrupt enable:		%08x\n",
1855f6a169598938d9e5703f06b64c4f4f972561ce5Zhenyu Wang			   I915_READ(SDEIER));
1865f6a169598938d9e5703f06b64c4f4f972561ce5Zhenyu Wang		seq_printf(m, "South Display Interrupt identity:	%08x\n",
1875f6a169598938d9e5703f06b64c4f4f972561ce5Zhenyu Wang			   I915_READ(SDEIIR));
1885f6a169598938d9e5703f06b64c4f4f972561ce5Zhenyu Wang		seq_printf(m, "South Display Interrupt mask:		%08x\n",
1895f6a169598938d9e5703f06b64c4f4f972561ce5Zhenyu Wang			   I915_READ(SDEIMR));
1905f6a169598938d9e5703f06b64c4f4f972561ce5Zhenyu Wang		seq_printf(m, "Graphics Interrupt enable:		%08x\n",
1915f6a169598938d9e5703f06b64c4f4f972561ce5Zhenyu Wang			   I915_READ(GTIER));
1925f6a169598938d9e5703f06b64c4f4f972561ce5Zhenyu Wang		seq_printf(m, "Graphics Interrupt identity:		%08x\n",
1935f6a169598938d9e5703f06b64c4f4f972561ce5Zhenyu Wang			   I915_READ(GTIIR));
1945f6a169598938d9e5703f06b64c4f4f972561ce5Zhenyu Wang		seq_printf(m, "Graphics Interrupt mask:		%08x\n",
1955f6a169598938d9e5703f06b64c4f4f972561ce5Zhenyu Wang			   I915_READ(GTIMR));
1965f6a169598938d9e5703f06b64c4f4f972561ce5Zhenyu Wang	}
1972017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari	seq_printf(m, "Interrupts received: %d\n",
1982017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari		   atomic_read(&dev_priv->irq_received));
199e20f9c64c79e2282f9eb531509181965ec8f0a92Eric Anholt	if (dev_priv->render_ring.status_page.page_addr != NULL) {
2002017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari		seq_printf(m, "Current sequence:    %d\n",
201852835f343146a82a528c3b712b373661d4fa17aZou Nan hai			   i915_get_gem_seqno(dev,  &dev_priv->render_ring));
2022017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari	} else {
2032017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari		seq_printf(m, "Current sequence:    hws uninitialized\n");
2042017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari	}
2052017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari	seq_printf(m, "Waiter sequence:     %d\n",
2062017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari		   dev_priv->mm.waiting_gem_seqno);
2072017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari	seq_printf(m, "IRQ sequence:        %d\n",
2082017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari		   dev_priv->mm.irq_gem_seqno);
2092017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari	return 0;
2102017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari}
2112017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari
212a6172a80ecb7ac64151960de1f709f78b509c57cChris Wilsonstatic int i915_gem_fence_regs_info(struct seq_file *m, void *data)
213a6172a80ecb7ac64151960de1f709f78b509c57cChris Wilson{
214a6172a80ecb7ac64151960de1f709f78b509c57cChris Wilson	struct drm_info_node *node = (struct drm_info_node *) m->private;
215a6172a80ecb7ac64151960de1f709f78b509c57cChris Wilson	struct drm_device *dev = node->minor->dev;
216a6172a80ecb7ac64151960de1f709f78b509c57cChris Wilson	drm_i915_private_t *dev_priv = dev->dev_private;
217a6172a80ecb7ac64151960de1f709f78b509c57cChris Wilson	int i;
218a6172a80ecb7ac64151960de1f709f78b509c57cChris Wilson
219a6172a80ecb7ac64151960de1f709f78b509c57cChris Wilson	seq_printf(m, "Reserved fences = %d\n", dev_priv->fence_reg_start);
220a6172a80ecb7ac64151960de1f709f78b509c57cChris Wilson	seq_printf(m, "Total fences = %d\n", dev_priv->num_fence_regs);
221a6172a80ecb7ac64151960de1f709f78b509c57cChris Wilson	for (i = 0; i < dev_priv->num_fence_regs; i++) {
222a6172a80ecb7ac64151960de1f709f78b509c57cChris Wilson		struct drm_gem_object *obj = dev_priv->fence_regs[i].obj;
223a6172a80ecb7ac64151960de1f709f78b509c57cChris Wilson
224a6172a80ecb7ac64151960de1f709f78b509c57cChris Wilson		if (obj == NULL) {
225a6172a80ecb7ac64151960de1f709f78b509c57cChris Wilson			seq_printf(m, "Fenced object[%2d] = unused\n", i);
226a6172a80ecb7ac64151960de1f709f78b509c57cChris Wilson		} else {
227a6172a80ecb7ac64151960de1f709f78b509c57cChris Wilson			struct drm_i915_gem_object *obj_priv;
228a6172a80ecb7ac64151960de1f709f78b509c57cChris Wilson
22923010e43b353c2cdc9725cbedc7e364708039bf7Daniel Vetter			obj_priv = to_intel_bo(obj);
230a6172a80ecb7ac64151960de1f709f78b509c57cChris Wilson			seq_printf(m, "Fenced object[%2d] = %p: %s "
2310b4d569de222452bcb55a4a536ade6cf4d8d1e30Linus Torvalds				   "%08x %08zx %08x %s %08x %08x %d",
232a6172a80ecb7ac64151960de1f709f78b509c57cChris Wilson				   i, obj, get_pin_flag(obj_priv),
233a6172a80ecb7ac64151960de1f709f78b509c57cChris Wilson				   obj_priv->gtt_offset,
234a6172a80ecb7ac64151960de1f709f78b509c57cChris Wilson				   obj->size, obj_priv->stride,
235a6172a80ecb7ac64151960de1f709f78b509c57cChris Wilson				   get_tiling_flag(obj_priv),
236a6172a80ecb7ac64151960de1f709f78b509c57cChris Wilson				   obj->read_domains, obj->write_domain,
237a6172a80ecb7ac64151960de1f709f78b509c57cChris Wilson				   obj_priv->last_rendering_seqno);
238a6172a80ecb7ac64151960de1f709f78b509c57cChris Wilson			if (obj->name)
239a6172a80ecb7ac64151960de1f709f78b509c57cChris Wilson				seq_printf(m, " (name: %d)", obj->name);
240a6172a80ecb7ac64151960de1f709f78b509c57cChris Wilson			seq_printf(m, "\n");
241a6172a80ecb7ac64151960de1f709f78b509c57cChris Wilson		}
242a6172a80ecb7ac64151960de1f709f78b509c57cChris Wilson	}
243a6172a80ecb7ac64151960de1f709f78b509c57cChris Wilson
244a6172a80ecb7ac64151960de1f709f78b509c57cChris Wilson	return 0;
245a6172a80ecb7ac64151960de1f709f78b509c57cChris Wilson}
246a6172a80ecb7ac64151960de1f709f78b509c57cChris Wilson
2472017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamaristatic int i915_hws_info(struct seq_file *m, void *data)
2482017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari{
2492017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari	struct drm_info_node *node = (struct drm_info_node *) m->private;
2502017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari	struct drm_device *dev = node->minor->dev;
2512017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari	drm_i915_private_t *dev_priv = dev->dev_private;
2522017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari	int i;
2532017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari	volatile u32 *hws;
2542017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari
255e20f9c64c79e2282f9eb531509181965ec8f0a92Eric Anholt	hws = (volatile u32 *)dev_priv->render_ring.status_page.page_addr;
2562017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari	if (hws == NULL)
2572017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari		return 0;
2582017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari
2592017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari	for (i = 0; i < 4096 / sizeof(u32) / 4; i += 4) {
2602017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari		seq_printf(m, "0x%08x: 0x%08x 0x%08x 0x%08x 0x%08x\n",
2612017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari			   i * 4,
2622017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari			   hws[i], hws[i + 1], hws[i + 2], hws[i + 3]);
2632017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari	}
2642017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari	return 0;
2652017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari}
2662017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari
2676911a9b8ae8b2a1dab4dfda9c2bd20f7ca2961d6Ben Gamaristatic void i915_dump_pages(struct seq_file *m, struct page **pages, int page_count)
2686911a9b8ae8b2a1dab4dfda9c2bd20f7ca2961d6Ben Gamari{
2696911a9b8ae8b2a1dab4dfda9c2bd20f7ca2961d6Ben Gamari	int page, i;
2706911a9b8ae8b2a1dab4dfda9c2bd20f7ca2961d6Ben Gamari	uint32_t *mem;
2716911a9b8ae8b2a1dab4dfda9c2bd20f7ca2961d6Ben Gamari
2726911a9b8ae8b2a1dab4dfda9c2bd20f7ca2961d6Ben Gamari	for (page = 0; page < page_count; page++) {
273ba86bf8bfc1add5f515db8cf1d6042bb9396a299Chris Wilson		mem = kmap_atomic(pages[page], KM_USER0);
2746911a9b8ae8b2a1dab4dfda9c2bd20f7ca2961d6Ben Gamari		for (i = 0; i < PAGE_SIZE; i += 4)
2756911a9b8ae8b2a1dab4dfda9c2bd20f7ca2961d6Ben Gamari			seq_printf(m, "%08x :  %08x\n", i, mem[i / 4]);
276656cb79322319a7bbafec7912d262142e9a38bc0Eric Anholt		kunmap_atomic(mem, KM_USER0);
2776911a9b8ae8b2a1dab4dfda9c2bd20f7ca2961d6Ben Gamari	}
2786911a9b8ae8b2a1dab4dfda9c2bd20f7ca2961d6Ben Gamari}
2796911a9b8ae8b2a1dab4dfda9c2bd20f7ca2961d6Ben Gamari
2806911a9b8ae8b2a1dab4dfda9c2bd20f7ca2961d6Ben Gamaristatic int i915_batchbuffer_info(struct seq_file *m, void *data)
2816911a9b8ae8b2a1dab4dfda9c2bd20f7ca2961d6Ben Gamari{
2826911a9b8ae8b2a1dab4dfda9c2bd20f7ca2961d6Ben Gamari	struct drm_info_node *node = (struct drm_info_node *) m->private;
2836911a9b8ae8b2a1dab4dfda9c2bd20f7ca2961d6Ben Gamari	struct drm_device *dev = node->minor->dev;
2846911a9b8ae8b2a1dab4dfda9c2bd20f7ca2961d6Ben Gamari	drm_i915_private_t *dev_priv = dev->dev_private;
2856911a9b8ae8b2a1dab4dfda9c2bd20f7ca2961d6Ben Gamari	struct drm_gem_object *obj;
2866911a9b8ae8b2a1dab4dfda9c2bd20f7ca2961d6Ben Gamari	struct drm_i915_gem_object *obj_priv;
2876911a9b8ae8b2a1dab4dfda9c2bd20f7ca2961d6Ben Gamari	int ret;
2886911a9b8ae8b2a1dab4dfda9c2bd20f7ca2961d6Ben Gamari
2896911a9b8ae8b2a1dab4dfda9c2bd20f7ca2961d6Ben Gamari	spin_lock(&dev_priv->mm.active_list_lock);
2906911a9b8ae8b2a1dab4dfda9c2bd20f7ca2961d6Ben Gamari
291852835f343146a82a528c3b712b373661d4fa17aZou Nan hai	list_for_each_entry(obj_priv, &dev_priv->render_ring.active_list,
292852835f343146a82a528c3b712b373661d4fa17aZou Nan hai			list) {
293a8089e849a32c5b6bfd6c88dbd09c0ea4a779b71Daniel Vetter		obj = &obj_priv->base;
2946911a9b8ae8b2a1dab4dfda9c2bd20f7ca2961d6Ben Gamari		if (obj->read_domains & I915_GEM_DOMAIN_COMMAND) {
2954bdadb9785696439c6e2b3efe34aa76df1149c83Chris Wilson		    ret = i915_gem_object_get_pages(obj, 0);
2966911a9b8ae8b2a1dab4dfda9c2bd20f7ca2961d6Ben Gamari		    if (ret) {
2976911a9b8ae8b2a1dab4dfda9c2bd20f7ca2961d6Ben Gamari			    DRM_ERROR("Failed to get pages: %d\n", ret);
2986911a9b8ae8b2a1dab4dfda9c2bd20f7ca2961d6Ben Gamari			    spin_unlock(&dev_priv->mm.active_list_lock);
2996911a9b8ae8b2a1dab4dfda9c2bd20f7ca2961d6Ben Gamari			    return ret;
3006911a9b8ae8b2a1dab4dfda9c2bd20f7ca2961d6Ben Gamari		    }
3016911a9b8ae8b2a1dab4dfda9c2bd20f7ca2961d6Ben Gamari
3026911a9b8ae8b2a1dab4dfda9c2bd20f7ca2961d6Ben Gamari		    seq_printf(m, "--- gtt_offset = 0x%08x\n", obj_priv->gtt_offset);
3036911a9b8ae8b2a1dab4dfda9c2bd20f7ca2961d6Ben Gamari		    i915_dump_pages(m, obj_priv->pages, obj->size / PAGE_SIZE);
3046911a9b8ae8b2a1dab4dfda9c2bd20f7ca2961d6Ben Gamari
3056911a9b8ae8b2a1dab4dfda9c2bd20f7ca2961d6Ben Gamari		    i915_gem_object_put_pages(obj);
3066911a9b8ae8b2a1dab4dfda9c2bd20f7ca2961d6Ben Gamari		}
3076911a9b8ae8b2a1dab4dfda9c2bd20f7ca2961d6Ben Gamari	}
3086911a9b8ae8b2a1dab4dfda9c2bd20f7ca2961d6Ben Gamari
3096911a9b8ae8b2a1dab4dfda9c2bd20f7ca2961d6Ben Gamari	spin_unlock(&dev_priv->mm.active_list_lock);
3106911a9b8ae8b2a1dab4dfda9c2bd20f7ca2961d6Ben Gamari
3116911a9b8ae8b2a1dab4dfda9c2bd20f7ca2961d6Ben Gamari	return 0;
3126911a9b8ae8b2a1dab4dfda9c2bd20f7ca2961d6Ben Gamari}
3136911a9b8ae8b2a1dab4dfda9c2bd20f7ca2961d6Ben Gamari
3146911a9b8ae8b2a1dab4dfda9c2bd20f7ca2961d6Ben Gamaristatic int i915_ringbuffer_data(struct seq_file *m, void *data)
3156911a9b8ae8b2a1dab4dfda9c2bd20f7ca2961d6Ben Gamari{
3166911a9b8ae8b2a1dab4dfda9c2bd20f7ca2961d6Ben Gamari	struct drm_info_node *node = (struct drm_info_node *) m->private;
3176911a9b8ae8b2a1dab4dfda9c2bd20f7ca2961d6Ben Gamari	struct drm_device *dev = node->minor->dev;
3186911a9b8ae8b2a1dab4dfda9c2bd20f7ca2961d6Ben Gamari	drm_i915_private_t *dev_priv = dev->dev_private;
3196911a9b8ae8b2a1dab4dfda9c2bd20f7ca2961d6Ben Gamari	u8 *virt;
3206911a9b8ae8b2a1dab4dfda9c2bd20f7ca2961d6Ben Gamari	uint32_t *ptr, off;
3216911a9b8ae8b2a1dab4dfda9c2bd20f7ca2961d6Ben Gamari
3228187a2b70e34c727a06617441f74f202b6fefaf9Zou Nan hai	if (!dev_priv->render_ring.gem_object) {
3236911a9b8ae8b2a1dab4dfda9c2bd20f7ca2961d6Ben Gamari		seq_printf(m, "No ringbuffer setup\n");
3246911a9b8ae8b2a1dab4dfda9c2bd20f7ca2961d6Ben Gamari		return 0;
3256911a9b8ae8b2a1dab4dfda9c2bd20f7ca2961d6Ben Gamari	}
3266911a9b8ae8b2a1dab4dfda9c2bd20f7ca2961d6Ben Gamari
327d3301d86b4bf2bcf649982ae464211d8bcf9575aEric Anholt	virt = dev_priv->render_ring.virtual_start;
3286911a9b8ae8b2a1dab4dfda9c2bd20f7ca2961d6Ben Gamari
3298187a2b70e34c727a06617441f74f202b6fefaf9Zou Nan hai	for (off = 0; off < dev_priv->render_ring.size; off += 4) {
3306911a9b8ae8b2a1dab4dfda9c2bd20f7ca2961d6Ben Gamari		ptr = (uint32_t *)(virt + off);
3316911a9b8ae8b2a1dab4dfda9c2bd20f7ca2961d6Ben Gamari		seq_printf(m, "%08x :  %08x\n", off, *ptr);
3326911a9b8ae8b2a1dab4dfda9c2bd20f7ca2961d6Ben Gamari	}
3336911a9b8ae8b2a1dab4dfda9c2bd20f7ca2961d6Ben Gamari
3346911a9b8ae8b2a1dab4dfda9c2bd20f7ca2961d6Ben Gamari	return 0;
3356911a9b8ae8b2a1dab4dfda9c2bd20f7ca2961d6Ben Gamari}
3366911a9b8ae8b2a1dab4dfda9c2bd20f7ca2961d6Ben Gamari
3376911a9b8ae8b2a1dab4dfda9c2bd20f7ca2961d6Ben Gamaristatic int i915_ringbuffer_info(struct seq_file *m, void *data)
3386911a9b8ae8b2a1dab4dfda9c2bd20f7ca2961d6Ben Gamari{
3396911a9b8ae8b2a1dab4dfda9c2bd20f7ca2961d6Ben Gamari	struct drm_info_node *node = (struct drm_info_node *) m->private;
3406911a9b8ae8b2a1dab4dfda9c2bd20f7ca2961d6Ben Gamari	struct drm_device *dev = node->minor->dev;
3416911a9b8ae8b2a1dab4dfda9c2bd20f7ca2961d6Ben Gamari	drm_i915_private_t *dev_priv = dev->dev_private;
3420ef82af7253c1929a3995f271b8b0db462d1a0c3Chris Wilson	unsigned int head, tail;
3436911a9b8ae8b2a1dab4dfda9c2bd20f7ca2961d6Ben Gamari
3446911a9b8ae8b2a1dab4dfda9c2bd20f7ca2961d6Ben Gamari	head = I915_READ(PRB0_HEAD) & HEAD_ADDR;
3456911a9b8ae8b2a1dab4dfda9c2bd20f7ca2961d6Ben Gamari	tail = I915_READ(PRB0_TAIL) & TAIL_ADDR;
3466911a9b8ae8b2a1dab4dfda9c2bd20f7ca2961d6Ben Gamari
3476911a9b8ae8b2a1dab4dfda9c2bd20f7ca2961d6Ben Gamari	seq_printf(m, "RingHead :  %08x\n", head);
3486911a9b8ae8b2a1dab4dfda9c2bd20f7ca2961d6Ben Gamari	seq_printf(m, "RingTail :  %08x\n", tail);
3498187a2b70e34c727a06617441f74f202b6fefaf9Zou Nan hai	seq_printf(m, "RingSize :  %08lx\n", dev_priv->render_ring.size);
35076cff81ad1cfa3bd8b52b5e4510702ce2ed28335Ben Gamari	seq_printf(m, "Acthd :     %08x\n", I915_READ(IS_I965G(dev) ? ACTHD_I965 : ACTHD));
3516911a9b8ae8b2a1dab4dfda9c2bd20f7ca2961d6Ben Gamari
3526911a9b8ae8b2a1dab4dfda9c2bd20f7ca2961d6Ben Gamari	return 0;
3536911a9b8ae8b2a1dab4dfda9c2bd20f7ca2961d6Ben Gamari}
3546911a9b8ae8b2a1dab4dfda9c2bd20f7ca2961d6Ben Gamari
3559df30794f609d9412f14cfd0eb7b45dd64d0b14eChris Wilsonstatic const char *pin_flag(int pinned)
3569df30794f609d9412f14cfd0eb7b45dd64d0b14eChris Wilson{
3579df30794f609d9412f14cfd0eb7b45dd64d0b14eChris Wilson	if (pinned > 0)
3589df30794f609d9412f14cfd0eb7b45dd64d0b14eChris Wilson		return " P";
3599df30794f609d9412f14cfd0eb7b45dd64d0b14eChris Wilson	else if (pinned < 0)
3609df30794f609d9412f14cfd0eb7b45dd64d0b14eChris Wilson		return " p";
3619df30794f609d9412f14cfd0eb7b45dd64d0b14eChris Wilson	else
3629df30794f609d9412f14cfd0eb7b45dd64d0b14eChris Wilson		return "";
3639df30794f609d9412f14cfd0eb7b45dd64d0b14eChris Wilson}
3649df30794f609d9412f14cfd0eb7b45dd64d0b14eChris Wilson
3659df30794f609d9412f14cfd0eb7b45dd64d0b14eChris Wilsonstatic const char *tiling_flag(int tiling)
3669df30794f609d9412f14cfd0eb7b45dd64d0b14eChris Wilson{
3679df30794f609d9412f14cfd0eb7b45dd64d0b14eChris Wilson	switch (tiling) {
3689df30794f609d9412f14cfd0eb7b45dd64d0b14eChris Wilson	default:
3699df30794f609d9412f14cfd0eb7b45dd64d0b14eChris Wilson	case I915_TILING_NONE: return "";
3709df30794f609d9412f14cfd0eb7b45dd64d0b14eChris Wilson	case I915_TILING_X: return " X";
3719df30794f609d9412f14cfd0eb7b45dd64d0b14eChris Wilson	case I915_TILING_Y: return " Y";
3729df30794f609d9412f14cfd0eb7b45dd64d0b14eChris Wilson	}
3739df30794f609d9412f14cfd0eb7b45dd64d0b14eChris Wilson}
3749df30794f609d9412f14cfd0eb7b45dd64d0b14eChris Wilson
3759df30794f609d9412f14cfd0eb7b45dd64d0b14eChris Wilsonstatic const char *dirty_flag(int dirty)
3769df30794f609d9412f14cfd0eb7b45dd64d0b14eChris Wilson{
3779df30794f609d9412f14cfd0eb7b45dd64d0b14eChris Wilson	return dirty ? " dirty" : "";
3789df30794f609d9412f14cfd0eb7b45dd64d0b14eChris Wilson}
3799df30794f609d9412f14cfd0eb7b45dd64d0b14eChris Wilson
3809df30794f609d9412f14cfd0eb7b45dd64d0b14eChris Wilsonstatic const char *purgeable_flag(int purgeable)
3819df30794f609d9412f14cfd0eb7b45dd64d0b14eChris Wilson{
3829df30794f609d9412f14cfd0eb7b45dd64d0b14eChris Wilson	return purgeable ? " purgeable" : "";
3839df30794f609d9412f14cfd0eb7b45dd64d0b14eChris Wilson}
3849df30794f609d9412f14cfd0eb7b45dd64d0b14eChris Wilson
38563eeaf38251183ec2b1caee11e4a2c040cb5ce6cJesse Barnesstatic int i915_error_state(struct seq_file *m, void *unused)
38663eeaf38251183ec2b1caee11e4a2c040cb5ce6cJesse Barnes{
38763eeaf38251183ec2b1caee11e4a2c040cb5ce6cJesse Barnes	struct drm_info_node *node = (struct drm_info_node *) m->private;
38863eeaf38251183ec2b1caee11e4a2c040cb5ce6cJesse Barnes	struct drm_device *dev = node->minor->dev;
38963eeaf38251183ec2b1caee11e4a2c040cb5ce6cJesse Barnes	drm_i915_private_t *dev_priv = dev->dev_private;
39063eeaf38251183ec2b1caee11e4a2c040cb5ce6cJesse Barnes	struct drm_i915_error_state *error;
39163eeaf38251183ec2b1caee11e4a2c040cb5ce6cJesse Barnes	unsigned long flags;
3929df30794f609d9412f14cfd0eb7b45dd64d0b14eChris Wilson	int i, page, offset, elt;
39363eeaf38251183ec2b1caee11e4a2c040cb5ce6cJesse Barnes
39463eeaf38251183ec2b1caee11e4a2c040cb5ce6cJesse Barnes	spin_lock_irqsave(&dev_priv->error_lock, flags);
39563eeaf38251183ec2b1caee11e4a2c040cb5ce6cJesse Barnes	if (!dev_priv->first_error) {
39663eeaf38251183ec2b1caee11e4a2c040cb5ce6cJesse Barnes		seq_printf(m, "no error state collected\n");
39763eeaf38251183ec2b1caee11e4a2c040cb5ce6cJesse Barnes		goto out;
39863eeaf38251183ec2b1caee11e4a2c040cb5ce6cJesse Barnes	}
39963eeaf38251183ec2b1caee11e4a2c040cb5ce6cJesse Barnes
40063eeaf38251183ec2b1caee11e4a2c040cb5ce6cJesse Barnes	error = dev_priv->first_error;
40163eeaf38251183ec2b1caee11e4a2c040cb5ce6cJesse Barnes
4028a90523639f49dc4b4fa7ae47bb9c8ed73ea8577Jesse Barnes	seq_printf(m, "Time: %ld s %ld us\n", error->time.tv_sec,
4038a90523639f49dc4b4fa7ae47bb9c8ed73ea8577Jesse Barnes		   error->time.tv_usec);
4049df30794f609d9412f14cfd0eb7b45dd64d0b14eChris Wilson	seq_printf(m, "PCI ID: 0x%04x\n", dev->pci_device);
40563eeaf38251183ec2b1caee11e4a2c040cb5ce6cJesse Barnes	seq_printf(m, "EIR: 0x%08x\n", error->eir);
40663eeaf38251183ec2b1caee11e4a2c040cb5ce6cJesse Barnes	seq_printf(m, "  PGTBL_ER: 0x%08x\n", error->pgtbl_er);
40763eeaf38251183ec2b1caee11e4a2c040cb5ce6cJesse Barnes	seq_printf(m, "  INSTPM: 0x%08x\n", error->instpm);
40863eeaf38251183ec2b1caee11e4a2c040cb5ce6cJesse Barnes	seq_printf(m, "  IPEIR: 0x%08x\n", error->ipeir);
40963eeaf38251183ec2b1caee11e4a2c040cb5ce6cJesse Barnes	seq_printf(m, "  IPEHR: 0x%08x\n", error->ipehr);
41063eeaf38251183ec2b1caee11e4a2c040cb5ce6cJesse Barnes	seq_printf(m, "  INSTDONE: 0x%08x\n", error->instdone);
41163eeaf38251183ec2b1caee11e4a2c040cb5ce6cJesse Barnes	seq_printf(m, "  ACTHD: 0x%08x\n", error->acthd);
41263eeaf38251183ec2b1caee11e4a2c040cb5ce6cJesse Barnes	if (IS_I965G(dev)) {
41363eeaf38251183ec2b1caee11e4a2c040cb5ce6cJesse Barnes		seq_printf(m, "  INSTPS: 0x%08x\n", error->instps);
41463eeaf38251183ec2b1caee11e4a2c040cb5ce6cJesse Barnes		seq_printf(m, "  INSTDONE1: 0x%08x\n", error->instdone1);
41563eeaf38251183ec2b1caee11e4a2c040cb5ce6cJesse Barnes	}
4169df30794f609d9412f14cfd0eb7b45dd64d0b14eChris Wilson	seq_printf(m, "seqno: 0x%08x\n", error->seqno);
4179df30794f609d9412f14cfd0eb7b45dd64d0b14eChris Wilson
4189df30794f609d9412f14cfd0eb7b45dd64d0b14eChris Wilson	if (error->active_bo_count) {
4199df30794f609d9412f14cfd0eb7b45dd64d0b14eChris Wilson		seq_printf(m, "Buffers [%d]:\n", error->active_bo_count);
4209df30794f609d9412f14cfd0eb7b45dd64d0b14eChris Wilson
4219df30794f609d9412f14cfd0eb7b45dd64d0b14eChris Wilson		for (i = 0; i < error->active_bo_count; i++) {
4229df30794f609d9412f14cfd0eb7b45dd64d0b14eChris Wilson			seq_printf(m, "  %08x %8zd %08x %08x %08x%s%s%s%s",
4239df30794f609d9412f14cfd0eb7b45dd64d0b14eChris Wilson				   error->active_bo[i].gtt_offset,
4249df30794f609d9412f14cfd0eb7b45dd64d0b14eChris Wilson				   error->active_bo[i].size,
4259df30794f609d9412f14cfd0eb7b45dd64d0b14eChris Wilson				   error->active_bo[i].read_domains,
4269df30794f609d9412f14cfd0eb7b45dd64d0b14eChris Wilson				   error->active_bo[i].write_domain,
4279df30794f609d9412f14cfd0eb7b45dd64d0b14eChris Wilson				   error->active_bo[i].seqno,
4289df30794f609d9412f14cfd0eb7b45dd64d0b14eChris Wilson				   pin_flag(error->active_bo[i].pinned),
4299df30794f609d9412f14cfd0eb7b45dd64d0b14eChris Wilson				   tiling_flag(error->active_bo[i].tiling),
4309df30794f609d9412f14cfd0eb7b45dd64d0b14eChris Wilson				   dirty_flag(error->active_bo[i].dirty),
4319df30794f609d9412f14cfd0eb7b45dd64d0b14eChris Wilson				   purgeable_flag(error->active_bo[i].purgeable));
4329df30794f609d9412f14cfd0eb7b45dd64d0b14eChris Wilson
4339df30794f609d9412f14cfd0eb7b45dd64d0b14eChris Wilson			if (error->active_bo[i].name)
4349df30794f609d9412f14cfd0eb7b45dd64d0b14eChris Wilson				seq_printf(m, " (name: %d)", error->active_bo[i].name);
4359df30794f609d9412f14cfd0eb7b45dd64d0b14eChris Wilson			if (error->active_bo[i].fence_reg != I915_FENCE_REG_NONE)
4369df30794f609d9412f14cfd0eb7b45dd64d0b14eChris Wilson				seq_printf(m, " (fence: %d)", error->active_bo[i].fence_reg);
4379df30794f609d9412f14cfd0eb7b45dd64d0b14eChris Wilson
4389df30794f609d9412f14cfd0eb7b45dd64d0b14eChris Wilson			seq_printf(m, "\n");
4399df30794f609d9412f14cfd0eb7b45dd64d0b14eChris Wilson		}
4409df30794f609d9412f14cfd0eb7b45dd64d0b14eChris Wilson	}
4419df30794f609d9412f14cfd0eb7b45dd64d0b14eChris Wilson
4429df30794f609d9412f14cfd0eb7b45dd64d0b14eChris Wilson	for (i = 0; i < ARRAY_SIZE(error->batchbuffer); i++) {
4439df30794f609d9412f14cfd0eb7b45dd64d0b14eChris Wilson		if (error->batchbuffer[i]) {
4449df30794f609d9412f14cfd0eb7b45dd64d0b14eChris Wilson			struct drm_i915_error_object *obj = error->batchbuffer[i];
4459df30794f609d9412f14cfd0eb7b45dd64d0b14eChris Wilson
4469df30794f609d9412f14cfd0eb7b45dd64d0b14eChris Wilson			seq_printf(m, "--- gtt_offset = 0x%08x\n", obj->gtt_offset);
4479df30794f609d9412f14cfd0eb7b45dd64d0b14eChris Wilson			offset = 0;
4489df30794f609d9412f14cfd0eb7b45dd64d0b14eChris Wilson			for (page = 0; page < obj->page_count; page++) {
4499df30794f609d9412f14cfd0eb7b45dd64d0b14eChris Wilson				for (elt = 0; elt < PAGE_SIZE/4; elt++) {
4509df30794f609d9412f14cfd0eb7b45dd64d0b14eChris Wilson					seq_printf(m, "%08x :  %08x\n", offset, obj->pages[page][elt]);
4519df30794f609d9412f14cfd0eb7b45dd64d0b14eChris Wilson					offset += 4;
4529df30794f609d9412f14cfd0eb7b45dd64d0b14eChris Wilson				}
4539df30794f609d9412f14cfd0eb7b45dd64d0b14eChris Wilson			}
4549df30794f609d9412f14cfd0eb7b45dd64d0b14eChris Wilson		}
4559df30794f609d9412f14cfd0eb7b45dd64d0b14eChris Wilson	}
4569df30794f609d9412f14cfd0eb7b45dd64d0b14eChris Wilson
4579df30794f609d9412f14cfd0eb7b45dd64d0b14eChris Wilson	if (error->ringbuffer) {
4589df30794f609d9412f14cfd0eb7b45dd64d0b14eChris Wilson		struct drm_i915_error_object *obj = error->ringbuffer;
4599df30794f609d9412f14cfd0eb7b45dd64d0b14eChris Wilson
4609df30794f609d9412f14cfd0eb7b45dd64d0b14eChris Wilson		seq_printf(m, "--- ringbuffer = 0x%08x\n", obj->gtt_offset);
4619df30794f609d9412f14cfd0eb7b45dd64d0b14eChris Wilson		offset = 0;
4629df30794f609d9412f14cfd0eb7b45dd64d0b14eChris Wilson		for (page = 0; page < obj->page_count; page++) {
4639df30794f609d9412f14cfd0eb7b45dd64d0b14eChris Wilson			for (elt = 0; elt < PAGE_SIZE/4; elt++) {
4649df30794f609d9412f14cfd0eb7b45dd64d0b14eChris Wilson				seq_printf(m, "%08x :  %08x\n", offset, obj->pages[page][elt]);
4659df30794f609d9412f14cfd0eb7b45dd64d0b14eChris Wilson				offset += 4;
4669df30794f609d9412f14cfd0eb7b45dd64d0b14eChris Wilson			}
4679df30794f609d9412f14cfd0eb7b45dd64d0b14eChris Wilson		}
4689df30794f609d9412f14cfd0eb7b45dd64d0b14eChris Wilson	}
46963eeaf38251183ec2b1caee11e4a2c040cb5ce6cJesse Barnes
47063eeaf38251183ec2b1caee11e4a2c040cb5ce6cJesse Barnesout:
47163eeaf38251183ec2b1caee11e4a2c040cb5ce6cJesse Barnes	spin_unlock_irqrestore(&dev_priv->error_lock, flags);
47263eeaf38251183ec2b1caee11e4a2c040cb5ce6cJesse Barnes
47363eeaf38251183ec2b1caee11e4a2c040cb5ce6cJesse Barnes	return 0;
47463eeaf38251183ec2b1caee11e4a2c040cb5ce6cJesse Barnes}
4756911a9b8ae8b2a1dab4dfda9c2bd20f7ca2961d6Ben Gamari
476f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnesstatic int i915_rstdby_delays(struct seq_file *m, void *unused)
477f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes{
478f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes	struct drm_info_node *node = (struct drm_info_node *) m->private;
479f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes	struct drm_device *dev = node->minor->dev;
480f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes	drm_i915_private_t *dev_priv = dev->dev_private;
481f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes	u16 crstanddelay = I915_READ16(CRSTANDVID);
482f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes
483f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes	seq_printf(m, "w/ctx: %d, w/o ctx: %d\n", (crstanddelay >> 8) & 0x3f, (crstanddelay & 0x3f));
484f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes
485f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes	return 0;
486f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes}
487f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes
488f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnesstatic int i915_cur_delayinfo(struct seq_file *m, void *unused)
489f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes{
490f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes	struct drm_info_node *node = (struct drm_info_node *) m->private;
491f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes	struct drm_device *dev = node->minor->dev;
492f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes	drm_i915_private_t *dev_priv = dev->dev_private;
493f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes	u16 rgvswctl = I915_READ16(MEMSWCTL);
4947648fa99eb77a2e1a90b7beaa420e07d819b9c11Jesse Barnes	u16 rgvstat = I915_READ16(MEMSTAT_ILK);
495f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes
4967648fa99eb77a2e1a90b7beaa420e07d819b9c11Jesse Barnes	seq_printf(m, "Requested P-state: %d\n", (rgvswctl >> 8) & 0xf);
4977648fa99eb77a2e1a90b7beaa420e07d819b9c11Jesse Barnes	seq_printf(m, "Requested VID: %d\n", rgvswctl & 0x3f);
4987648fa99eb77a2e1a90b7beaa420e07d819b9c11Jesse Barnes	seq_printf(m, "Current VID: %d\n", (rgvstat & MEMSTAT_VID_MASK) >>
4997648fa99eb77a2e1a90b7beaa420e07d819b9c11Jesse Barnes		   MEMSTAT_VID_SHIFT);
5007648fa99eb77a2e1a90b7beaa420e07d819b9c11Jesse Barnes	seq_printf(m, "Current P-state: %d\n",
5017648fa99eb77a2e1a90b7beaa420e07d819b9c11Jesse Barnes		   (rgvstat & MEMSTAT_PSTATE_MASK) >> MEMSTAT_PSTATE_SHIFT);
502f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes
503f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes	return 0;
504f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes}
505f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes
506f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnesstatic int i915_delayfreq_table(struct seq_file *m, void *unused)
507f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes{
508f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes	struct drm_info_node *node = (struct drm_info_node *) m->private;
509f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes	struct drm_device *dev = node->minor->dev;
510f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes	drm_i915_private_t *dev_priv = dev->dev_private;
511f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes	u32 delayfreq;
512f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes	int i;
513f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes
514f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes	for (i = 0; i < 16; i++) {
515f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes		delayfreq = I915_READ(PXVFREQ_BASE + i * 4);
5167648fa99eb77a2e1a90b7beaa420e07d819b9c11Jesse Barnes		seq_printf(m, "P%02dVIDFREQ: 0x%08x (VID: %d)\n", i, delayfreq,
5177648fa99eb77a2e1a90b7beaa420e07d819b9c11Jesse Barnes			   (delayfreq & PXVFREQ_PX_MASK) >> PXVFREQ_PX_SHIFT);
518f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes	}
519f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes
520f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes	return 0;
521f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes}
522f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes
523f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnesstatic inline int MAP_TO_MV(int map)
524f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes{
525f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes	return 1250 - (map * 25);
526f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes}
527f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes
528f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnesstatic int i915_inttoext_table(struct seq_file *m, void *unused)
529f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes{
530f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes	struct drm_info_node *node = (struct drm_info_node *) m->private;
531f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes	struct drm_device *dev = node->minor->dev;
532f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes	drm_i915_private_t *dev_priv = dev->dev_private;
533f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes	u32 inttoext;
534f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes	int i;
535f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes
536f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes	for (i = 1; i <= 32; i++) {
537f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes		inttoext = I915_READ(INTTOEXT_BASE_ILK + i * 4);
538f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes		seq_printf(m, "INTTOEXT%02d: 0x%08x\n", i, inttoext);
539f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes	}
540f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes
541f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes	return 0;
542f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes}
543f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes
544f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnesstatic int i915_drpc_info(struct seq_file *m, void *unused)
545f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes{
546f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes	struct drm_info_node *node = (struct drm_info_node *) m->private;
547f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes	struct drm_device *dev = node->minor->dev;
548f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes	drm_i915_private_t *dev_priv = dev->dev_private;
549f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes	u32 rgvmodectl = I915_READ(MEMMODECTL);
5507648fa99eb77a2e1a90b7beaa420e07d819b9c11Jesse Barnes	u32 rstdbyctl = I915_READ(MCHBAR_RENDER_STANDBY);
5517648fa99eb77a2e1a90b7beaa420e07d819b9c11Jesse Barnes	u16 crstandvid = I915_READ16(CRSTANDVID);
552f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes
553f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes	seq_printf(m, "HD boost: %s\n", (rgvmodectl & MEMMODE_BOOST_EN) ?
554f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes		   "yes" : "no");
555f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes	seq_printf(m, "Boost freq: %d\n",
556f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes		   (rgvmodectl & MEMMODE_BOOST_FREQ_MASK) >>
557f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes		   MEMMODE_BOOST_FREQ_SHIFT);
558f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes	seq_printf(m, "HW control enabled: %s\n",
559f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes		   rgvmodectl & MEMMODE_HWIDLE_EN ? "yes" : "no");
560f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes	seq_printf(m, "SW control enabled: %s\n",
561f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes		   rgvmodectl & MEMMODE_SWMODE_EN ? "yes" : "no");
562f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes	seq_printf(m, "Gated voltage change: %s\n",
563f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes		   rgvmodectl & MEMMODE_RCLK_GATE ? "yes" : "no");
564f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes	seq_printf(m, "Starting frequency: P%d\n",
565f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes		   (rgvmodectl & MEMMODE_FSTART_MASK) >> MEMMODE_FSTART_SHIFT);
5667648fa99eb77a2e1a90b7beaa420e07d819b9c11Jesse Barnes	seq_printf(m, "Max P-state: P%d\n",
567f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes		   (rgvmodectl & MEMMODE_FMAX_MASK) >> MEMMODE_FMAX_SHIFT);
5687648fa99eb77a2e1a90b7beaa420e07d819b9c11Jesse Barnes	seq_printf(m, "Min P-state: P%d\n", (rgvmodectl & MEMMODE_FMIN_MASK));
5697648fa99eb77a2e1a90b7beaa420e07d819b9c11Jesse Barnes	seq_printf(m, "RS1 VID: %d\n", (crstandvid & 0x3f));
5707648fa99eb77a2e1a90b7beaa420e07d819b9c11Jesse Barnes	seq_printf(m, "RS2 VID: %d\n", ((crstandvid >> 8) & 0x3f));
5717648fa99eb77a2e1a90b7beaa420e07d819b9c11Jesse Barnes	seq_printf(m, "Render standby enabled: %s\n",
5727648fa99eb77a2e1a90b7beaa420e07d819b9c11Jesse Barnes		   (rstdbyctl & RCX_SW_EXIT) ? "no" : "yes");
573f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes
574f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes	return 0;
575f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes}
576f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes
577b5e50c3f56ee4aa0d0168eab5ece413ac5df76aaJesse Barnesstatic int i915_fbc_status(struct seq_file *m, void *unused)
578b5e50c3f56ee4aa0d0168eab5ece413ac5df76aaJesse Barnes{
579b5e50c3f56ee4aa0d0168eab5ece413ac5df76aaJesse Barnes	struct drm_info_node *node = (struct drm_info_node *) m->private;
580b5e50c3f56ee4aa0d0168eab5ece413ac5df76aaJesse Barnes	struct drm_device *dev = node->minor->dev;
581b5e50c3f56ee4aa0d0168eab5ece413ac5df76aaJesse Barnes	drm_i915_private_t *dev_priv = dev->dev_private;
582b5e50c3f56ee4aa0d0168eab5ece413ac5df76aaJesse Barnes
583ee5382aedf669127bf672a3fc5313247fc288e26Adam Jackson	if (!I915_HAS_FBC(dev)) {
584b5e50c3f56ee4aa0d0168eab5ece413ac5df76aaJesse Barnes		seq_printf(m, "FBC unsupported on this chipset\n");
585b5e50c3f56ee4aa0d0168eab5ece413ac5df76aaJesse Barnes		return 0;
586b5e50c3f56ee4aa0d0168eab5ece413ac5df76aaJesse Barnes	}
587b5e50c3f56ee4aa0d0168eab5ece413ac5df76aaJesse Barnes
588ee5382aedf669127bf672a3fc5313247fc288e26Adam Jackson	if (intel_fbc_enabled(dev)) {
589b5e50c3f56ee4aa0d0168eab5ece413ac5df76aaJesse Barnes		seq_printf(m, "FBC enabled\n");
590b5e50c3f56ee4aa0d0168eab5ece413ac5df76aaJesse Barnes	} else {
591b5e50c3f56ee4aa0d0168eab5ece413ac5df76aaJesse Barnes		seq_printf(m, "FBC disabled: ");
592b5e50c3f56ee4aa0d0168eab5ece413ac5df76aaJesse Barnes		switch (dev_priv->no_fbc_reason) {
593b5e50c3f56ee4aa0d0168eab5ece413ac5df76aaJesse Barnes		case FBC_STOLEN_TOO_SMALL:
594b5e50c3f56ee4aa0d0168eab5ece413ac5df76aaJesse Barnes			seq_printf(m, "not enough stolen memory");
595b5e50c3f56ee4aa0d0168eab5ece413ac5df76aaJesse Barnes			break;
596b5e50c3f56ee4aa0d0168eab5ece413ac5df76aaJesse Barnes		case FBC_UNSUPPORTED_MODE:
597b5e50c3f56ee4aa0d0168eab5ece413ac5df76aaJesse Barnes			seq_printf(m, "mode not supported");
598b5e50c3f56ee4aa0d0168eab5ece413ac5df76aaJesse Barnes			break;
599b5e50c3f56ee4aa0d0168eab5ece413ac5df76aaJesse Barnes		case FBC_MODE_TOO_LARGE:
600b5e50c3f56ee4aa0d0168eab5ece413ac5df76aaJesse Barnes			seq_printf(m, "mode too large");
601b5e50c3f56ee4aa0d0168eab5ece413ac5df76aaJesse Barnes			break;
602b5e50c3f56ee4aa0d0168eab5ece413ac5df76aaJesse Barnes		case FBC_BAD_PLANE:
603b5e50c3f56ee4aa0d0168eab5ece413ac5df76aaJesse Barnes			seq_printf(m, "FBC unsupported on plane");
604b5e50c3f56ee4aa0d0168eab5ece413ac5df76aaJesse Barnes			break;
605b5e50c3f56ee4aa0d0168eab5ece413ac5df76aaJesse Barnes		case FBC_NOT_TILED:
606b5e50c3f56ee4aa0d0168eab5ece413ac5df76aaJesse Barnes			seq_printf(m, "scanout buffer not tiled");
607b5e50c3f56ee4aa0d0168eab5ece413ac5df76aaJesse Barnes			break;
6089c928d168d4030a230a7a5ee1764721d173f1153Jesse Barnes		case FBC_MULTIPLE_PIPES:
6099c928d168d4030a230a7a5ee1764721d173f1153Jesse Barnes			seq_printf(m, "multiple pipes are enabled");
6109c928d168d4030a230a7a5ee1764721d173f1153Jesse Barnes			break;
611b5e50c3f56ee4aa0d0168eab5ece413ac5df76aaJesse Barnes		default:
612b5e50c3f56ee4aa0d0168eab5ece413ac5df76aaJesse Barnes			seq_printf(m, "unknown reason");
613b5e50c3f56ee4aa0d0168eab5ece413ac5df76aaJesse Barnes		}
614b5e50c3f56ee4aa0d0168eab5ece413ac5df76aaJesse Barnes		seq_printf(m, "\n");
615b5e50c3f56ee4aa0d0168eab5ece413ac5df76aaJesse Barnes	}
616b5e50c3f56ee4aa0d0168eab5ece413ac5df76aaJesse Barnes	return 0;
617b5e50c3f56ee4aa0d0168eab5ece413ac5df76aaJesse Barnes}
618b5e50c3f56ee4aa0d0168eab5ece413ac5df76aaJesse Barnes
6194a9bef37e5cf2c73b61ecc9ead52cad2eb4a372bJesse Barnesstatic int i915_sr_status(struct seq_file *m, void *unused)
6204a9bef37e5cf2c73b61ecc9ead52cad2eb4a372bJesse Barnes{
6214a9bef37e5cf2c73b61ecc9ead52cad2eb4a372bJesse Barnes	struct drm_info_node *node = (struct drm_info_node *) m->private;
6224a9bef37e5cf2c73b61ecc9ead52cad2eb4a372bJesse Barnes	struct drm_device *dev = node->minor->dev;
6234a9bef37e5cf2c73b61ecc9ead52cad2eb4a372bJesse Barnes	drm_i915_private_t *dev_priv = dev->dev_private;
6244a9bef37e5cf2c73b61ecc9ead52cad2eb4a372bJesse Barnes	bool sr_enabled = false;
6254a9bef37e5cf2c73b61ecc9ead52cad2eb4a372bJesse Barnes
626adcdbc6651a7086b99827cf50623a02d941261f1Jesse Barnes	if (IS_I965GM(dev) || IS_I945G(dev) || IS_I945GM(dev))
6274a9bef37e5cf2c73b61ecc9ead52cad2eb4a372bJesse Barnes		sr_enabled = I915_READ(FW_BLC_SELF) & FW_BLC_SELF_EN;
6284a9bef37e5cf2c73b61ecc9ead52cad2eb4a372bJesse Barnes	else if (IS_I915GM(dev))
6294a9bef37e5cf2c73b61ecc9ead52cad2eb4a372bJesse Barnes		sr_enabled = I915_READ(INSTPM) & INSTPM_SELF_EN;
6304a9bef37e5cf2c73b61ecc9ead52cad2eb4a372bJesse Barnes	else if (IS_PINEVIEW(dev))
6314a9bef37e5cf2c73b61ecc9ead52cad2eb4a372bJesse Barnes		sr_enabled = I915_READ(DSPFW3) & PINEVIEW_SELF_REFRESH_EN;
6324a9bef37e5cf2c73b61ecc9ead52cad2eb4a372bJesse Barnes
6334a9bef37e5cf2c73b61ecc9ead52cad2eb4a372bJesse Barnes	seq_printf(m, "self-refresh: %s\n", sr_enabled ? "enabled" :
6344a9bef37e5cf2c73b61ecc9ead52cad2eb4a372bJesse Barnes		   "disabled");
6354a9bef37e5cf2c73b61ecc9ead52cad2eb4a372bJesse Barnes
6364a9bef37e5cf2c73b61ecc9ead52cad2eb4a372bJesse Barnes	return 0;
6374a9bef37e5cf2c73b61ecc9ead52cad2eb4a372bJesse Barnes}
6384a9bef37e5cf2c73b61ecc9ead52cad2eb4a372bJesse Barnes
6397648fa99eb77a2e1a90b7beaa420e07d819b9c11Jesse Barnesstatic int i915_emon_status(struct seq_file *m, void *unused)
6407648fa99eb77a2e1a90b7beaa420e07d819b9c11Jesse Barnes{
6417648fa99eb77a2e1a90b7beaa420e07d819b9c11Jesse Barnes	struct drm_info_node *node = (struct drm_info_node *) m->private;
6427648fa99eb77a2e1a90b7beaa420e07d819b9c11Jesse Barnes	struct drm_device *dev = node->minor->dev;
6437648fa99eb77a2e1a90b7beaa420e07d819b9c11Jesse Barnes	drm_i915_private_t *dev_priv = dev->dev_private;
6447648fa99eb77a2e1a90b7beaa420e07d819b9c11Jesse Barnes	unsigned long temp, chipset, gfx;
6457648fa99eb77a2e1a90b7beaa420e07d819b9c11Jesse Barnes
6467648fa99eb77a2e1a90b7beaa420e07d819b9c11Jesse Barnes	temp = i915_mch_val(dev_priv);
6477648fa99eb77a2e1a90b7beaa420e07d819b9c11Jesse Barnes	chipset = i915_chipset_val(dev_priv);
6487648fa99eb77a2e1a90b7beaa420e07d819b9c11Jesse Barnes	gfx = i915_gfx_val(dev_priv);
6497648fa99eb77a2e1a90b7beaa420e07d819b9c11Jesse Barnes
6507648fa99eb77a2e1a90b7beaa420e07d819b9c11Jesse Barnes	seq_printf(m, "GMCH temp: %ld\n", temp);
6517648fa99eb77a2e1a90b7beaa420e07d819b9c11Jesse Barnes	seq_printf(m, "Chipset power: %ld\n", chipset);
6527648fa99eb77a2e1a90b7beaa420e07d819b9c11Jesse Barnes	seq_printf(m, "GFX power: %ld\n", gfx);
6537648fa99eb77a2e1a90b7beaa420e07d819b9c11Jesse Barnes	seq_printf(m, "Total power: %ld\n", chipset + gfx);
6547648fa99eb77a2e1a90b7beaa420e07d819b9c11Jesse Barnes
6557648fa99eb77a2e1a90b7beaa420e07d819b9c11Jesse Barnes	return 0;
6567648fa99eb77a2e1a90b7beaa420e07d819b9c11Jesse Barnes}
6577648fa99eb77a2e1a90b7beaa420e07d819b9c11Jesse Barnes
6587648fa99eb77a2e1a90b7beaa420e07d819b9c11Jesse Barnesstatic int i915_gfxec(struct seq_file *m, void *unused)
6597648fa99eb77a2e1a90b7beaa420e07d819b9c11Jesse Barnes{
6607648fa99eb77a2e1a90b7beaa420e07d819b9c11Jesse Barnes	struct drm_info_node *node = (struct drm_info_node *) m->private;
6617648fa99eb77a2e1a90b7beaa420e07d819b9c11Jesse Barnes	struct drm_device *dev = node->minor->dev;
6627648fa99eb77a2e1a90b7beaa420e07d819b9c11Jesse Barnes	drm_i915_private_t *dev_priv = dev->dev_private;
6637648fa99eb77a2e1a90b7beaa420e07d819b9c11Jesse Barnes
6647648fa99eb77a2e1a90b7beaa420e07d819b9c11Jesse Barnes	seq_printf(m, "GFXEC: %ld\n", (unsigned long)I915_READ(0x112f4));
6657648fa99eb77a2e1a90b7beaa420e07d819b9c11Jesse Barnes
6667648fa99eb77a2e1a90b7beaa420e07d819b9c11Jesse Barnes	return 0;
6677648fa99eb77a2e1a90b7beaa420e07d819b9c11Jesse Barnes}
6687648fa99eb77a2e1a90b7beaa420e07d819b9c11Jesse Barnes
669f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilsonstatic int
670f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilsoni915_wedged_open(struct inode *inode,
671f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson		 struct file *filp)
672f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson{
673f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson	filp->private_data = inode->i_private;
674f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson	return 0;
675f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson}
676f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson
677f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilsonstatic ssize_t
678f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilsoni915_wedged_read(struct file *filp,
679f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson		 char __user *ubuf,
680f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson		 size_t max,
681f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson		 loff_t *ppos)
682f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson{
683f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson	struct drm_device *dev = filp->private_data;
684f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson	drm_i915_private_t *dev_priv = dev->dev_private;
685f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson	char buf[80];
686f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson	int len;
687f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson
688f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson	len = snprintf(buf, sizeof (buf),
689f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson		       "wedged :  %d\n",
690f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson		       atomic_read(&dev_priv->mm.wedged));
691f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson
692f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson	return simple_read_from_buffer(ubuf, max, ppos, buf, len);
693f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson}
694f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson
695f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilsonstatic ssize_t
696f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilsoni915_wedged_write(struct file *filp,
697f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson		  const char __user *ubuf,
698f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson		  size_t cnt,
699f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson		  loff_t *ppos)
700f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson{
701f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson	struct drm_device *dev = filp->private_data;
702f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson	drm_i915_private_t *dev_priv = dev->dev_private;
703f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson	char buf[20];
704f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson	int val = 1;
705f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson
706f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson	if (cnt > 0) {
707f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson		if (cnt > sizeof (buf) - 1)
708f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson			return -EINVAL;
709f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson
710f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson		if (copy_from_user(buf, ubuf, cnt))
711f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson			return -EFAULT;
712f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson		buf[cnt] = 0;
713f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson
714f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson		val = simple_strtoul(buf, NULL, 0);
715f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson	}
716f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson
717f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson	DRM_INFO("Manually setting wedged to %d\n", val);
718f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson
719f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson	atomic_set(&dev_priv->mm.wedged, val);
720f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson	if (val) {
721f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson		DRM_WAKEUP(&dev_priv->irq_queue);
722f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson		queue_work(dev_priv->wq, &dev_priv->error_work);
723f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson	}
724f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson
725f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson	return cnt;
726f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson}
727f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson
728f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilsonstatic const struct file_operations i915_wedged_fops = {
729f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson	.owner = THIS_MODULE,
730f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson	.open = i915_wedged_open,
731f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson	.read = i915_wedged_read,
732f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson	.write = i915_wedged_write,
733f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson};
734f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson
735f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson/* As the drm_debugfs_init() routines are called before dev->dev_private is
736f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson * allocated we need to hook into the minor for release. */
737f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilsonstatic int
738f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilsondrm_add_fake_info_node(struct drm_minor *minor,
739f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson		       struct dentry *ent,
740f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson		       const void *key)
741f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson{
742f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson	struct drm_info_node *node;
743f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson
744f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson	node = kmalloc(sizeof(struct drm_info_node), GFP_KERNEL);
745f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson	if (node == NULL) {
746f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson		debugfs_remove(ent);
747f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson		return -ENOMEM;
748f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson	}
749f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson
750f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson	node->minor = minor;
751f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson	node->dent = ent;
752f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson	node->info_ent = (void *) key;
753f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson	list_add(&node->list, &minor->debugfs_nodes.list);
754f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson
755f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson	return 0;
756f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson}
757f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson
758f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilsonstatic int i915_wedged_create(struct dentry *root, struct drm_minor *minor)
759f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson{
760f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson	struct drm_device *dev = minor->dev;
761f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson	struct dentry *ent;
762f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson
763f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson	ent = debugfs_create_file("i915_wedged",
764f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson				  S_IRUGO | S_IWUSR,
765f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson				  root, dev,
766f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson				  &i915_wedged_fops);
767f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson	if (IS_ERR(ent))
768f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson		return PTR_ERR(ent);
769f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson
770f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson	return drm_add_fake_info_node(minor, ent, &i915_wedged_fops);
771f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson}
7729e3a6d155ed0a7636b926a798dd7221ea107b274Ben Gamari
77327c202ad7f141d4efa9c64e30bf4a4d3bcd799aeBen Gamaristatic struct drm_info_list i915_debugfs_list[] = {
774433e12f78b68a8069f54956edf766bb21394c197Ben Gamari	{"i915_gem_active", i915_gem_object_list_info, 0, (void *) ACTIVE_LIST},
775433e12f78b68a8069f54956edf766bb21394c197Ben Gamari	{"i915_gem_flushing", i915_gem_object_list_info, 0, (void *) FLUSHING_LIST},
776433e12f78b68a8069f54956edf766bb21394c197Ben Gamari	{"i915_gem_inactive", i915_gem_object_list_info, 0, (void *) INACTIVE_LIST},
7772017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari	{"i915_gem_request", i915_gem_request_info, 0},
7782017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari	{"i915_gem_seqno", i915_gem_seqno_info, 0},
779a6172a80ecb7ac64151960de1f709f78b509c57cChris Wilson	{"i915_gem_fence_regs", i915_gem_fence_regs_info, 0},
7802017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari	{"i915_gem_interrupt", i915_interrupt_info, 0},
7812017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari	{"i915_gem_hws", i915_hws_info, 0},
7826911a9b8ae8b2a1dab4dfda9c2bd20f7ca2961d6Ben Gamari	{"i915_ringbuffer_data", i915_ringbuffer_data, 0},
7836911a9b8ae8b2a1dab4dfda9c2bd20f7ca2961d6Ben Gamari	{"i915_ringbuffer_info", i915_ringbuffer_info, 0},
7846911a9b8ae8b2a1dab4dfda9c2bd20f7ca2961d6Ben Gamari	{"i915_batchbuffers", i915_batchbuffer_info, 0},
78563eeaf38251183ec2b1caee11e4a2c040cb5ce6cJesse Barnes	{"i915_error_state", i915_error_state, 0},
786f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes	{"i915_rstdby_delays", i915_rstdby_delays, 0},
787f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes	{"i915_cur_delayinfo", i915_cur_delayinfo, 0},
788f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes	{"i915_delayfreq_table", i915_delayfreq_table, 0},
789f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes	{"i915_inttoext_table", i915_inttoext_table, 0},
790f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes	{"i915_drpc_info", i915_drpc_info, 0},
7917648fa99eb77a2e1a90b7beaa420e07d819b9c11Jesse Barnes	{"i915_emon_status", i915_emon_status, 0},
7927648fa99eb77a2e1a90b7beaa420e07d819b9c11Jesse Barnes	{"i915_gfxec", i915_gfxec, 0},
793b5e50c3f56ee4aa0d0168eab5ece413ac5df76aaJesse Barnes	{"i915_fbc_status", i915_fbc_status, 0},
7944a9bef37e5cf2c73b61ecc9ead52cad2eb4a372bJesse Barnes	{"i915_sr_status", i915_sr_status, 0},
7952017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari};
79627c202ad7f141d4efa9c64e30bf4a4d3bcd799aeBen Gamari#define I915_DEBUGFS_ENTRIES ARRAY_SIZE(i915_debugfs_list)
7972017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari
79827c202ad7f141d4efa9c64e30bf4a4d3bcd799aeBen Gamariint i915_debugfs_init(struct drm_minor *minor)
7992017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari{
800f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson	int ret;
801f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson
802f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson	ret = i915_wedged_create(minor->debugfs_root, minor);
803f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson	if (ret)
804f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson		return ret;
805f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson
80627c202ad7f141d4efa9c64e30bf4a4d3bcd799aeBen Gamari	return drm_debugfs_create_files(i915_debugfs_list,
80727c202ad7f141d4efa9c64e30bf4a4d3bcd799aeBen Gamari					I915_DEBUGFS_ENTRIES,
8082017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari					minor->debugfs_root, minor);
8092017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari}
8102017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari
81127c202ad7f141d4efa9c64e30bf4a4d3bcd799aeBen Gamarivoid i915_debugfs_cleanup(struct drm_minor *minor)
8122017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari{
81327c202ad7f141d4efa9c64e30bf4a4d3bcd799aeBen Gamari	drm_debugfs_remove_files(i915_debugfs_list,
81427c202ad7f141d4efa9c64e30bf4a4d3bcd799aeBen Gamari				 I915_DEBUGFS_ENTRIES, minor);
81533db679b4ee94e5a55abb439a87905d76739095aKristian Høgsberg	drm_debugfs_remove_files((struct drm_info_list *) &i915_wedged_fops,
81633db679b4ee94e5a55abb439a87905d76739095aKristian Høgsberg				 1, minor);
8172017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari}
8182017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari
8192017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari#endif /* CONFIG_DEBUG_FS */
820