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>
322d1a8a48ac68a835c42d8a31a02b8158cd599615Paul Gortmaker#include <linux/export.h>
332017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari#include "drmP.h"
342017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari#include "drm.h"
354e5359cd053bfb7d8dabe4a63624a5726848ffbcSimon Farnsworth#include "intel_drv.h"
36e5c652603680404683fd1f262b511340545179a2Chris Wilson#include "intel_ringbuffer.h"
372017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari#include "i915_drm.h"
382017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari#include "i915_drv.h"
392017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari
402017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari#define DRM_I915_RING_DEBUG 1
412017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari
422017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari
432017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari#if defined(CONFIG_DEBUG_FS)
442017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari
45f13d3f7311add99d1f874a6b67d56426afa35664Chris Wilsonenum {
4669dc4987cbe5fe70ae1c2a08906d431d53cdd242Chris Wilson	ACTIVE_LIST,
47f13d3f7311add99d1f874a6b67d56426afa35664Chris Wilson	FLUSHING_LIST,
48f13d3f7311add99d1f874a6b67d56426afa35664Chris Wilson	INACTIVE_LIST,
49d21d5975686fbc107f9352006b06e1e92b4c5810Chris Wilson	PINNED_LIST,
50d21d5975686fbc107f9352006b06e1e92b4c5810Chris Wilson	DEFERRED_FREE_LIST,
51f13d3f7311add99d1f874a6b67d56426afa35664Chris Wilson};
522017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari
5370d39fe4862c6c69c2582c829ec240e05bf24430Chris Wilsonstatic const char *yesno(int v)
5470d39fe4862c6c69c2582c829ec240e05bf24430Chris Wilson{
5570d39fe4862c6c69c2582c829ec240e05bf24430Chris Wilson	return v ? "yes" : "no";
5670d39fe4862c6c69c2582c829ec240e05bf24430Chris Wilson}
5770d39fe4862c6c69c2582c829ec240e05bf24430Chris Wilson
5870d39fe4862c6c69c2582c829ec240e05bf24430Chris Wilsonstatic int i915_capabilities(struct seq_file *m, void *data)
5970d39fe4862c6c69c2582c829ec240e05bf24430Chris Wilson{
6070d39fe4862c6c69c2582c829ec240e05bf24430Chris Wilson	struct drm_info_node *node = (struct drm_info_node *) m->private;
6170d39fe4862c6c69c2582c829ec240e05bf24430Chris Wilson	struct drm_device *dev = node->minor->dev;
6270d39fe4862c6c69c2582c829ec240e05bf24430Chris Wilson	const struct intel_device_info *info = INTEL_INFO(dev);
6370d39fe4862c6c69c2582c829ec240e05bf24430Chris Wilson
6470d39fe4862c6c69c2582c829ec240e05bf24430Chris Wilson	seq_printf(m, "gen: %d\n", info->gen);
6503d00ac53f9bcde06ff7e33d6676083c18d569a4Paulo Zanoni	seq_printf(m, "pch: %d\n", INTEL_PCH_TYPE(dev));
6670d39fe4862c6c69c2582c829ec240e05bf24430Chris Wilson#define B(x) seq_printf(m, #x ": %s\n", yesno(info->x))
6770d39fe4862c6c69c2582c829ec240e05bf24430Chris Wilson	B(is_mobile);
6870d39fe4862c6c69c2582c829ec240e05bf24430Chris Wilson	B(is_i85x);
6970d39fe4862c6c69c2582c829ec240e05bf24430Chris Wilson	B(is_i915g);
7070d39fe4862c6c69c2582c829ec240e05bf24430Chris Wilson	B(is_i945gm);
7170d39fe4862c6c69c2582c829ec240e05bf24430Chris Wilson	B(is_g33);
7270d39fe4862c6c69c2582c829ec240e05bf24430Chris Wilson	B(need_gfx_hws);
7370d39fe4862c6c69c2582c829ec240e05bf24430Chris Wilson	B(is_g4x);
7470d39fe4862c6c69c2582c829ec240e05bf24430Chris Wilson	B(is_pineview);
7570d39fe4862c6c69c2582c829ec240e05bf24430Chris Wilson	B(is_broadwater);
7670d39fe4862c6c69c2582c829ec240e05bf24430Chris Wilson	B(is_crestline);
7770d39fe4862c6c69c2582c829ec240e05bf24430Chris Wilson	B(has_fbc);
7870d39fe4862c6c69c2582c829ec240e05bf24430Chris Wilson	B(has_pipe_cxsr);
7970d39fe4862c6c69c2582c829ec240e05bf24430Chris Wilson	B(has_hotplug);
8070d39fe4862c6c69c2582c829ec240e05bf24430Chris Wilson	B(cursor_needs_physical);
8170d39fe4862c6c69c2582c829ec240e05bf24430Chris Wilson	B(has_overlay);
8270d39fe4862c6c69c2582c829ec240e05bf24430Chris Wilson	B(overlay_needs_physical);
83a6c45cf013a57e32ddae43dd4ac911eb4a3919fdChris Wilson	B(supports_tv);
84549f7365820a212a1cfd0871d377b1ad0d1e5723Chris Wilson	B(has_bsd_ring);
85549f7365820a212a1cfd0871d377b1ad0d1e5723Chris Wilson	B(has_blt_ring);
8670d39fe4862c6c69c2582c829ec240e05bf24430Chris Wilson#undef B
8770d39fe4862c6c69c2582c829ec240e05bf24430Chris Wilson
8870d39fe4862c6c69c2582c829ec240e05bf24430Chris Wilson	return 0;
8970d39fe4862c6c69c2582c829ec240e05bf24430Chris Wilson}
902017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari
9105394f3975dceb107a5e1393e2244946e5b43660Chris Wilsonstatic const char *get_pin_flag(struct drm_i915_gem_object *obj)
92a6172a80ecb7ac64151960de1f709f78b509c57cChris Wilson{
9305394f3975dceb107a5e1393e2244946e5b43660Chris Wilson	if (obj->user_pin_count > 0)
94a6172a80ecb7ac64151960de1f709f78b509c57cChris Wilson		return "P";
9505394f3975dceb107a5e1393e2244946e5b43660Chris Wilson	else if (obj->pin_count > 0)
96a6172a80ecb7ac64151960de1f709f78b509c57cChris Wilson		return "p";
97a6172a80ecb7ac64151960de1f709f78b509c57cChris Wilson	else
98a6172a80ecb7ac64151960de1f709f78b509c57cChris Wilson		return " ";
99a6172a80ecb7ac64151960de1f709f78b509c57cChris Wilson}
100a6172a80ecb7ac64151960de1f709f78b509c57cChris Wilson
10105394f3975dceb107a5e1393e2244946e5b43660Chris Wilsonstatic const char *get_tiling_flag(struct drm_i915_gem_object *obj)
102a6172a80ecb7ac64151960de1f709f78b509c57cChris Wilson{
1030206e353a0416ad63ce07f53c807c2c725633b87Akshay Joshi	switch (obj->tiling_mode) {
1040206e353a0416ad63ce07f53c807c2c725633b87Akshay Joshi	default:
1050206e353a0416ad63ce07f53c807c2c725633b87Akshay Joshi	case I915_TILING_NONE: return " ";
1060206e353a0416ad63ce07f53c807c2c725633b87Akshay Joshi	case I915_TILING_X: return "X";
1070206e353a0416ad63ce07f53c807c2c725633b87Akshay Joshi	case I915_TILING_Y: return "Y";
1080206e353a0416ad63ce07f53c807c2c725633b87Akshay Joshi	}
109a6172a80ecb7ac64151960de1f709f78b509c57cChris Wilson}
110a6172a80ecb7ac64151960de1f709f78b509c57cChris Wilson
11193dfb40cd887c4f39e38f047c4d9ea0b7188a58aChris Wilsonstatic const char *cache_level_str(int type)
11208c18323547ce6d70eab3b37eca894baf114ad85Chris Wilson{
11308c18323547ce6d70eab3b37eca894baf114ad85Chris Wilson	switch (type) {
11493dfb40cd887c4f39e38f047c4d9ea0b7188a58aChris Wilson	case I915_CACHE_NONE: return " uncached";
11593dfb40cd887c4f39e38f047c4d9ea0b7188a58aChris Wilson	case I915_CACHE_LLC: return " snooped (LLC)";
11693dfb40cd887c4f39e38f047c4d9ea0b7188a58aChris Wilson	case I915_CACHE_LLC_MLC: return " snooped (LLC+MLC)";
11708c18323547ce6d70eab3b37eca894baf114ad85Chris Wilson	default: return "";
11808c18323547ce6d70eab3b37eca894baf114ad85Chris Wilson	}
11908c18323547ce6d70eab3b37eca894baf114ad85Chris Wilson}
12008c18323547ce6d70eab3b37eca894baf114ad85Chris Wilson
12137811fcc9188f748407646e1157f3ed24ae181a4Chris Wilsonstatic void
12237811fcc9188f748407646e1157f3ed24ae181a4Chris Wilsondescribe_obj(struct seq_file *m, struct drm_i915_gem_object *obj)
12337811fcc9188f748407646e1157f3ed24ae181a4Chris Wilson{
124a05a586239c66a256ea1fbae859e742e4c91c8d9Eric Anholt	seq_printf(m, "%p: %s%s %8zdKiB %04x %04x %d %d%s%s%s",
12537811fcc9188f748407646e1157f3ed24ae181a4Chris Wilson		   &obj->base,
12637811fcc9188f748407646e1157f3ed24ae181a4Chris Wilson		   get_pin_flag(obj),
12737811fcc9188f748407646e1157f3ed24ae181a4Chris Wilson		   get_tiling_flag(obj),
128a05a586239c66a256ea1fbae859e742e4c91c8d9Eric Anholt		   obj->base.size / 1024,
12937811fcc9188f748407646e1157f3ed24ae181a4Chris Wilson		   obj->base.read_domains,
13037811fcc9188f748407646e1157f3ed24ae181a4Chris Wilson		   obj->base.write_domain,
13137811fcc9188f748407646e1157f3ed24ae181a4Chris Wilson		   obj->last_rendering_seqno,
132caea7476d48e5f401f2d18b1738827748fb56c12Chris Wilson		   obj->last_fenced_seqno,
13393dfb40cd887c4f39e38f047c4d9ea0b7188a58aChris Wilson		   cache_level_str(obj->cache_level),
13437811fcc9188f748407646e1157f3ed24ae181a4Chris Wilson		   obj->dirty ? " dirty" : "",
13537811fcc9188f748407646e1157f3ed24ae181a4Chris Wilson		   obj->madv == I915_MADV_DONTNEED ? " purgeable" : "");
13637811fcc9188f748407646e1157f3ed24ae181a4Chris Wilson	if (obj->base.name)
13737811fcc9188f748407646e1157f3ed24ae181a4Chris Wilson		seq_printf(m, " (name: %d)", obj->base.name);
13837811fcc9188f748407646e1157f3ed24ae181a4Chris Wilson	if (obj->fence_reg != I915_FENCE_REG_NONE)
13937811fcc9188f748407646e1157f3ed24ae181a4Chris Wilson		seq_printf(m, " (fence: %d)", obj->fence_reg);
14037811fcc9188f748407646e1157f3ed24ae181a4Chris Wilson	if (obj->gtt_space != NULL)
141a00b10c360b35d6431a94cbf130a4e162870d661Chris Wilson		seq_printf(m, " (gtt offset: %08x, size: %08x)",
142a00b10c360b35d6431a94cbf130a4e162870d661Chris Wilson			   obj->gtt_offset, (unsigned int)obj->gtt_space->size);
1436299f992c0491232f008028a1f40bc9d86c4c76cChris Wilson	if (obj->pin_mappable || obj->fault_mappable) {
1446299f992c0491232f008028a1f40bc9d86c4c76cChris Wilson		char s[3], *t = s;
1456299f992c0491232f008028a1f40bc9d86c4c76cChris Wilson		if (obj->pin_mappable)
1466299f992c0491232f008028a1f40bc9d86c4c76cChris Wilson			*t++ = 'p';
1476299f992c0491232f008028a1f40bc9d86c4c76cChris Wilson		if (obj->fault_mappable)
1486299f992c0491232f008028a1f40bc9d86c4c76cChris Wilson			*t++ = 'f';
1496299f992c0491232f008028a1f40bc9d86c4c76cChris Wilson		*t = '\0';
1506299f992c0491232f008028a1f40bc9d86c4c76cChris Wilson		seq_printf(m, " (%s mappable)", s);
1516299f992c0491232f008028a1f40bc9d86c4c76cChris Wilson	}
15269dc4987cbe5fe70ae1c2a08906d431d53cdd242Chris Wilson	if (obj->ring != NULL)
15369dc4987cbe5fe70ae1c2a08906d431d53cdd242Chris Wilson		seq_printf(m, " (%s)", obj->ring->name);
15437811fcc9188f748407646e1157f3ed24ae181a4Chris Wilson}
15537811fcc9188f748407646e1157f3ed24ae181a4Chris Wilson
156433e12f78b68a8069f54956edf766bb21394c197Ben Gamaristatic int i915_gem_object_list_info(struct seq_file *m, void *data)
1572017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari{
1582017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari	struct drm_info_node *node = (struct drm_info_node *) m->private;
159433e12f78b68a8069f54956edf766bb21394c197Ben Gamari	uintptr_t list = (uintptr_t) node->info_ent->data;
160433e12f78b68a8069f54956edf766bb21394c197Ben Gamari	struct list_head *head;
1612017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari	struct drm_device *dev = node->minor->dev;
1622017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari	drm_i915_private_t *dev_priv = dev->dev_private;
16305394f3975dceb107a5e1393e2244946e5b43660Chris Wilson	struct drm_i915_gem_object *obj;
1648f2480fb05991f1a5522dd48332cd9db4f7745c6Chris Wilson	size_t total_obj_size, total_gtt_size;
1658f2480fb05991f1a5522dd48332cd9db4f7745c6Chris Wilson	int count, ret;
166de227ef0907258359d53e3e1530c1f3678eb2bb9Chris Wilson
167de227ef0907258359d53e3e1530c1f3678eb2bb9Chris Wilson	ret = mutex_lock_interruptible(&dev->struct_mutex);
168de227ef0907258359d53e3e1530c1f3678eb2bb9Chris Wilson	if (ret)
169de227ef0907258359d53e3e1530c1f3678eb2bb9Chris Wilson		return ret;
1702017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari
171433e12f78b68a8069f54956edf766bb21394c197Ben Gamari	switch (list) {
172433e12f78b68a8069f54956edf766bb21394c197Ben Gamari	case ACTIVE_LIST:
173433e12f78b68a8069f54956edf766bb21394c197Ben Gamari		seq_printf(m, "Active:\n");
17469dc4987cbe5fe70ae1c2a08906d431d53cdd242Chris Wilson		head = &dev_priv->mm.active_list;
175433e12f78b68a8069f54956edf766bb21394c197Ben Gamari		break;
176433e12f78b68a8069f54956edf766bb21394c197Ben Gamari	case INACTIVE_LIST:
177a17458fc9d9edc98b7c5865cdc42681cf9059f1cBen Gamari		seq_printf(m, "Inactive:\n");
178433e12f78b68a8069f54956edf766bb21394c197Ben Gamari		head = &dev_priv->mm.inactive_list;
179433e12f78b68a8069f54956edf766bb21394c197Ben Gamari		break;
180f13d3f7311add99d1f874a6b67d56426afa35664Chris Wilson	case PINNED_LIST:
181f13d3f7311add99d1f874a6b67d56426afa35664Chris Wilson		seq_printf(m, "Pinned:\n");
182f13d3f7311add99d1f874a6b67d56426afa35664Chris Wilson		head = &dev_priv->mm.pinned_list;
183f13d3f7311add99d1f874a6b67d56426afa35664Chris Wilson		break;
184433e12f78b68a8069f54956edf766bb21394c197Ben Gamari	case FLUSHING_LIST:
185433e12f78b68a8069f54956edf766bb21394c197Ben Gamari		seq_printf(m, "Flushing:\n");
186433e12f78b68a8069f54956edf766bb21394c197Ben Gamari		head = &dev_priv->mm.flushing_list;
187433e12f78b68a8069f54956edf766bb21394c197Ben Gamari		break;
188d21d5975686fbc107f9352006b06e1e92b4c5810Chris Wilson	case DEFERRED_FREE_LIST:
189d21d5975686fbc107f9352006b06e1e92b4c5810Chris Wilson		seq_printf(m, "Deferred free:\n");
190d21d5975686fbc107f9352006b06e1e92b4c5810Chris Wilson		head = &dev_priv->mm.deferred_free_list;
191d21d5975686fbc107f9352006b06e1e92b4c5810Chris Wilson		break;
192433e12f78b68a8069f54956edf766bb21394c197Ben Gamari	default:
193de227ef0907258359d53e3e1530c1f3678eb2bb9Chris Wilson		mutex_unlock(&dev->struct_mutex);
194de227ef0907258359d53e3e1530c1f3678eb2bb9Chris Wilson		return -EINVAL;
1952017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari	}
1962017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari
1978f2480fb05991f1a5522dd48332cd9db4f7745c6Chris Wilson	total_obj_size = total_gtt_size = count = 0;
19805394f3975dceb107a5e1393e2244946e5b43660Chris Wilson	list_for_each_entry(obj, head, mm_list) {
19937811fcc9188f748407646e1157f3ed24ae181a4Chris Wilson		seq_printf(m, "   ");
20005394f3975dceb107a5e1393e2244946e5b43660Chris Wilson		describe_obj(m, obj);
201f4ceda89895b56e2c03dd327f13d0256838a20abEric Anholt		seq_printf(m, "\n");
20205394f3975dceb107a5e1393e2244946e5b43660Chris Wilson		total_obj_size += obj->base.size;
20305394f3975dceb107a5e1393e2244946e5b43660Chris Wilson		total_gtt_size += obj->gtt_space->size;
2048f2480fb05991f1a5522dd48332cd9db4f7745c6Chris Wilson		count++;
2052017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari	}
206de227ef0907258359d53e3e1530c1f3678eb2bb9Chris Wilson	mutex_unlock(&dev->struct_mutex);
2075e118f4139feafe97e913df67b1f7c1e5083e535Carl Worth
2088f2480fb05991f1a5522dd48332cd9db4f7745c6Chris Wilson	seq_printf(m, "Total %d objects, %zu bytes, %zu GTT size\n",
2098f2480fb05991f1a5522dd48332cd9db4f7745c6Chris Wilson		   count, total_obj_size, total_gtt_size);
2102017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari	return 0;
2112017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari}
2122017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari
2136299f992c0491232f008028a1f40bc9d86c4c76cChris Wilson#define count_objects(list, member) do { \
2146299f992c0491232f008028a1f40bc9d86c4c76cChris Wilson	list_for_each_entry(obj, list, member) { \
2156299f992c0491232f008028a1f40bc9d86c4c76cChris Wilson		size += obj->gtt_space->size; \
2166299f992c0491232f008028a1f40bc9d86c4c76cChris Wilson		++count; \
2176299f992c0491232f008028a1f40bc9d86c4c76cChris Wilson		if (obj->map_and_fenceable) { \
2186299f992c0491232f008028a1f40bc9d86c4c76cChris Wilson			mappable_size += obj->gtt_space->size; \
2196299f992c0491232f008028a1f40bc9d86c4c76cChris Wilson			++mappable_count; \
2206299f992c0491232f008028a1f40bc9d86c4c76cChris Wilson		} \
2216299f992c0491232f008028a1f40bc9d86c4c76cChris Wilson	} \
2220206e353a0416ad63ce07f53c807c2c725633b87Akshay Joshi} while (0)
2236299f992c0491232f008028a1f40bc9d86c4c76cChris Wilson
22473aa808f10effc280e6eb70267314542a7c29426Chris Wilsonstatic int i915_gem_object_info(struct seq_file *m, void* data)
22573aa808f10effc280e6eb70267314542a7c29426Chris Wilson{
22673aa808f10effc280e6eb70267314542a7c29426Chris Wilson	struct drm_info_node *node = (struct drm_info_node *) m->private;
22773aa808f10effc280e6eb70267314542a7c29426Chris Wilson	struct drm_device *dev = node->minor->dev;
22873aa808f10effc280e6eb70267314542a7c29426Chris Wilson	struct drm_i915_private *dev_priv = dev->dev_private;
2296299f992c0491232f008028a1f40bc9d86c4c76cChris Wilson	u32 count, mappable_count;
2306299f992c0491232f008028a1f40bc9d86c4c76cChris Wilson	size_t size, mappable_size;
2316299f992c0491232f008028a1f40bc9d86c4c76cChris Wilson	struct drm_i915_gem_object *obj;
23273aa808f10effc280e6eb70267314542a7c29426Chris Wilson	int ret;
23373aa808f10effc280e6eb70267314542a7c29426Chris Wilson
23473aa808f10effc280e6eb70267314542a7c29426Chris Wilson	ret = mutex_lock_interruptible(&dev->struct_mutex);
23573aa808f10effc280e6eb70267314542a7c29426Chris Wilson	if (ret)
23673aa808f10effc280e6eb70267314542a7c29426Chris Wilson		return ret;
23773aa808f10effc280e6eb70267314542a7c29426Chris Wilson
2386299f992c0491232f008028a1f40bc9d86c4c76cChris Wilson	seq_printf(m, "%u objects, %zu bytes\n",
2396299f992c0491232f008028a1f40bc9d86c4c76cChris Wilson		   dev_priv->mm.object_count,
2406299f992c0491232f008028a1f40bc9d86c4c76cChris Wilson		   dev_priv->mm.object_memory);
2416299f992c0491232f008028a1f40bc9d86c4c76cChris Wilson
2426299f992c0491232f008028a1f40bc9d86c4c76cChris Wilson	size = count = mappable_size = mappable_count = 0;
2436299f992c0491232f008028a1f40bc9d86c4c76cChris Wilson	count_objects(&dev_priv->mm.gtt_list, gtt_list);
2446299f992c0491232f008028a1f40bc9d86c4c76cChris Wilson	seq_printf(m, "%u [%u] objects, %zu [%zu] bytes in gtt\n",
2456299f992c0491232f008028a1f40bc9d86c4c76cChris Wilson		   count, mappable_count, size, mappable_size);
2466299f992c0491232f008028a1f40bc9d86c4c76cChris Wilson
2476299f992c0491232f008028a1f40bc9d86c4c76cChris Wilson	size = count = mappable_size = mappable_count = 0;
2486299f992c0491232f008028a1f40bc9d86c4c76cChris Wilson	count_objects(&dev_priv->mm.active_list, mm_list);
2496299f992c0491232f008028a1f40bc9d86c4c76cChris Wilson	count_objects(&dev_priv->mm.flushing_list, mm_list);
2506299f992c0491232f008028a1f40bc9d86c4c76cChris Wilson	seq_printf(m, "  %u [%u] active objects, %zu [%zu] bytes\n",
2516299f992c0491232f008028a1f40bc9d86c4c76cChris Wilson		   count, mappable_count, size, mappable_size);
2526299f992c0491232f008028a1f40bc9d86c4c76cChris Wilson
2536299f992c0491232f008028a1f40bc9d86c4c76cChris Wilson	size = count = mappable_size = mappable_count = 0;
2546299f992c0491232f008028a1f40bc9d86c4c76cChris Wilson	count_objects(&dev_priv->mm.pinned_list, mm_list);
2556299f992c0491232f008028a1f40bc9d86c4c76cChris Wilson	seq_printf(m, "  %u [%u] pinned objects, %zu [%zu] bytes\n",
2566299f992c0491232f008028a1f40bc9d86c4c76cChris Wilson		   count, mappable_count, size, mappable_size);
2576299f992c0491232f008028a1f40bc9d86c4c76cChris Wilson
2586299f992c0491232f008028a1f40bc9d86c4c76cChris Wilson	size = count = mappable_size = mappable_count = 0;
2596299f992c0491232f008028a1f40bc9d86c4c76cChris Wilson	count_objects(&dev_priv->mm.inactive_list, mm_list);
2606299f992c0491232f008028a1f40bc9d86c4c76cChris Wilson	seq_printf(m, "  %u [%u] inactive objects, %zu [%zu] bytes\n",
2616299f992c0491232f008028a1f40bc9d86c4c76cChris Wilson		   count, mappable_count, size, mappable_size);
2626299f992c0491232f008028a1f40bc9d86c4c76cChris Wilson
2636299f992c0491232f008028a1f40bc9d86c4c76cChris Wilson	size = count = mappable_size = mappable_count = 0;
2646299f992c0491232f008028a1f40bc9d86c4c76cChris Wilson	count_objects(&dev_priv->mm.deferred_free_list, mm_list);
2656299f992c0491232f008028a1f40bc9d86c4c76cChris Wilson	seq_printf(m, "  %u [%u] freed objects, %zu [%zu] bytes\n",
2666299f992c0491232f008028a1f40bc9d86c4c76cChris Wilson		   count, mappable_count, size, mappable_size);
2676299f992c0491232f008028a1f40bc9d86c4c76cChris Wilson
2686299f992c0491232f008028a1f40bc9d86c4c76cChris Wilson	size = count = mappable_size = mappable_count = 0;
2696299f992c0491232f008028a1f40bc9d86c4c76cChris Wilson	list_for_each_entry(obj, &dev_priv->mm.gtt_list, gtt_list) {
2706299f992c0491232f008028a1f40bc9d86c4c76cChris Wilson		if (obj->fault_mappable) {
2716299f992c0491232f008028a1f40bc9d86c4c76cChris Wilson			size += obj->gtt_space->size;
2726299f992c0491232f008028a1f40bc9d86c4c76cChris Wilson			++count;
2736299f992c0491232f008028a1f40bc9d86c4c76cChris Wilson		}
2746299f992c0491232f008028a1f40bc9d86c4c76cChris Wilson		if (obj->pin_mappable) {
2756299f992c0491232f008028a1f40bc9d86c4c76cChris Wilson			mappable_size += obj->gtt_space->size;
2766299f992c0491232f008028a1f40bc9d86c4c76cChris Wilson			++mappable_count;
2776299f992c0491232f008028a1f40bc9d86c4c76cChris Wilson		}
2786299f992c0491232f008028a1f40bc9d86c4c76cChris Wilson	}
2796299f992c0491232f008028a1f40bc9d86c4c76cChris Wilson	seq_printf(m, "%u pinned mappable objects, %zu bytes\n",
2806299f992c0491232f008028a1f40bc9d86c4c76cChris Wilson		   mappable_count, mappable_size);
2816299f992c0491232f008028a1f40bc9d86c4c76cChris Wilson	seq_printf(m, "%u fault mappable objects, %zu bytes\n",
2826299f992c0491232f008028a1f40bc9d86c4c76cChris Wilson		   count, size);
2836299f992c0491232f008028a1f40bc9d86c4c76cChris Wilson
2846299f992c0491232f008028a1f40bc9d86c4c76cChris Wilson	seq_printf(m, "%zu [%zu] gtt total\n",
2856299f992c0491232f008028a1f40bc9d86c4c76cChris Wilson		   dev_priv->mm.gtt_total, dev_priv->mm.mappable_gtt_total);
28673aa808f10effc280e6eb70267314542a7c29426Chris Wilson
28773aa808f10effc280e6eb70267314542a7c29426Chris Wilson	mutex_unlock(&dev->struct_mutex);
28873aa808f10effc280e6eb70267314542a7c29426Chris Wilson
28973aa808f10effc280e6eb70267314542a7c29426Chris Wilson	return 0;
29073aa808f10effc280e6eb70267314542a7c29426Chris Wilson}
29173aa808f10effc280e6eb70267314542a7c29426Chris Wilson
29208c18323547ce6d70eab3b37eca894baf114ad85Chris Wilsonstatic int i915_gem_gtt_info(struct seq_file *m, void* data)
29308c18323547ce6d70eab3b37eca894baf114ad85Chris Wilson{
29408c18323547ce6d70eab3b37eca894baf114ad85Chris Wilson	struct drm_info_node *node = (struct drm_info_node *) m->private;
29508c18323547ce6d70eab3b37eca894baf114ad85Chris Wilson	struct drm_device *dev = node->minor->dev;
29608c18323547ce6d70eab3b37eca894baf114ad85Chris Wilson	struct drm_i915_private *dev_priv = dev->dev_private;
29708c18323547ce6d70eab3b37eca894baf114ad85Chris Wilson	struct drm_i915_gem_object *obj;
29808c18323547ce6d70eab3b37eca894baf114ad85Chris Wilson	size_t total_obj_size, total_gtt_size;
29908c18323547ce6d70eab3b37eca894baf114ad85Chris Wilson	int count, ret;
30008c18323547ce6d70eab3b37eca894baf114ad85Chris Wilson
30108c18323547ce6d70eab3b37eca894baf114ad85Chris Wilson	ret = mutex_lock_interruptible(&dev->struct_mutex);
30208c18323547ce6d70eab3b37eca894baf114ad85Chris Wilson	if (ret)
30308c18323547ce6d70eab3b37eca894baf114ad85Chris Wilson		return ret;
30408c18323547ce6d70eab3b37eca894baf114ad85Chris Wilson
30508c18323547ce6d70eab3b37eca894baf114ad85Chris Wilson	total_obj_size = total_gtt_size = count = 0;
30608c18323547ce6d70eab3b37eca894baf114ad85Chris Wilson	list_for_each_entry(obj, &dev_priv->mm.gtt_list, gtt_list) {
30708c18323547ce6d70eab3b37eca894baf114ad85Chris Wilson		seq_printf(m, "   ");
30808c18323547ce6d70eab3b37eca894baf114ad85Chris Wilson		describe_obj(m, obj);
30908c18323547ce6d70eab3b37eca894baf114ad85Chris Wilson		seq_printf(m, "\n");
31008c18323547ce6d70eab3b37eca894baf114ad85Chris Wilson		total_obj_size += obj->base.size;
31108c18323547ce6d70eab3b37eca894baf114ad85Chris Wilson		total_gtt_size += obj->gtt_space->size;
31208c18323547ce6d70eab3b37eca894baf114ad85Chris Wilson		count++;
31308c18323547ce6d70eab3b37eca894baf114ad85Chris Wilson	}
31408c18323547ce6d70eab3b37eca894baf114ad85Chris Wilson
31508c18323547ce6d70eab3b37eca894baf114ad85Chris Wilson	mutex_unlock(&dev->struct_mutex);
31608c18323547ce6d70eab3b37eca894baf114ad85Chris Wilson
31708c18323547ce6d70eab3b37eca894baf114ad85Chris Wilson	seq_printf(m, "Total %d objects, %zu bytes, %zu GTT size\n",
31808c18323547ce6d70eab3b37eca894baf114ad85Chris Wilson		   count, total_obj_size, total_gtt_size);
31908c18323547ce6d70eab3b37eca894baf114ad85Chris Wilson
32008c18323547ce6d70eab3b37eca894baf114ad85Chris Wilson	return 0;
32108c18323547ce6d70eab3b37eca894baf114ad85Chris Wilson}
32208c18323547ce6d70eab3b37eca894baf114ad85Chris Wilson
32373aa808f10effc280e6eb70267314542a7c29426Chris Wilson
3244e5359cd053bfb7d8dabe4a63624a5726848ffbcSimon Farnsworthstatic int i915_gem_pageflip_info(struct seq_file *m, void *data)
3254e5359cd053bfb7d8dabe4a63624a5726848ffbcSimon Farnsworth{
3264e5359cd053bfb7d8dabe4a63624a5726848ffbcSimon Farnsworth	struct drm_info_node *node = (struct drm_info_node *) m->private;
3274e5359cd053bfb7d8dabe4a63624a5726848ffbcSimon Farnsworth	struct drm_device *dev = node->minor->dev;
3284e5359cd053bfb7d8dabe4a63624a5726848ffbcSimon Farnsworth	unsigned long flags;
3294e5359cd053bfb7d8dabe4a63624a5726848ffbcSimon Farnsworth	struct intel_crtc *crtc;
3304e5359cd053bfb7d8dabe4a63624a5726848ffbcSimon Farnsworth
3314e5359cd053bfb7d8dabe4a63624a5726848ffbcSimon Farnsworth	list_for_each_entry(crtc, &dev->mode_config.crtc_list, base.head) {
3329db4a9c7b2a3bd5b4952846bc0c2f58daa80ddd7Jesse Barnes		const char pipe = pipe_name(crtc->pipe);
3339db4a9c7b2a3bd5b4952846bc0c2f58daa80ddd7Jesse Barnes		const char plane = plane_name(crtc->plane);
3344e5359cd053bfb7d8dabe4a63624a5726848ffbcSimon Farnsworth		struct intel_unpin_work *work;
3354e5359cd053bfb7d8dabe4a63624a5726848ffbcSimon Farnsworth
3364e5359cd053bfb7d8dabe4a63624a5726848ffbcSimon Farnsworth		spin_lock_irqsave(&dev->event_lock, flags);
3374e5359cd053bfb7d8dabe4a63624a5726848ffbcSimon Farnsworth		work = crtc->unpin_work;
3384e5359cd053bfb7d8dabe4a63624a5726848ffbcSimon Farnsworth		if (work == NULL) {
3399db4a9c7b2a3bd5b4952846bc0c2f58daa80ddd7Jesse Barnes			seq_printf(m, "No flip due on pipe %c (plane %c)\n",
3404e5359cd053bfb7d8dabe4a63624a5726848ffbcSimon Farnsworth				   pipe, plane);
3414e5359cd053bfb7d8dabe4a63624a5726848ffbcSimon Farnsworth		} else {
3424e5359cd053bfb7d8dabe4a63624a5726848ffbcSimon Farnsworth			if (!work->pending) {
3439db4a9c7b2a3bd5b4952846bc0c2f58daa80ddd7Jesse Barnes				seq_printf(m, "Flip queued on pipe %c (plane %c)\n",
3444e5359cd053bfb7d8dabe4a63624a5726848ffbcSimon Farnsworth					   pipe, plane);
3454e5359cd053bfb7d8dabe4a63624a5726848ffbcSimon Farnsworth			} else {
3469db4a9c7b2a3bd5b4952846bc0c2f58daa80ddd7Jesse Barnes				seq_printf(m, "Flip pending (waiting for vsync) on pipe %c (plane %c)\n",
3474e5359cd053bfb7d8dabe4a63624a5726848ffbcSimon Farnsworth					   pipe, plane);
3484e5359cd053bfb7d8dabe4a63624a5726848ffbcSimon Farnsworth			}
3494e5359cd053bfb7d8dabe4a63624a5726848ffbcSimon Farnsworth			if (work->enable_stall_check)
3504e5359cd053bfb7d8dabe4a63624a5726848ffbcSimon Farnsworth				seq_printf(m, "Stall check enabled, ");
3514e5359cd053bfb7d8dabe4a63624a5726848ffbcSimon Farnsworth			else
3524e5359cd053bfb7d8dabe4a63624a5726848ffbcSimon Farnsworth				seq_printf(m, "Stall check waiting for page flip ioctl, ");
3534e5359cd053bfb7d8dabe4a63624a5726848ffbcSimon Farnsworth			seq_printf(m, "%d prepares\n", work->pending);
3544e5359cd053bfb7d8dabe4a63624a5726848ffbcSimon Farnsworth
3554e5359cd053bfb7d8dabe4a63624a5726848ffbcSimon Farnsworth			if (work->old_fb_obj) {
35605394f3975dceb107a5e1393e2244946e5b43660Chris Wilson				struct drm_i915_gem_object *obj = work->old_fb_obj;
35705394f3975dceb107a5e1393e2244946e5b43660Chris Wilson				if (obj)
35805394f3975dceb107a5e1393e2244946e5b43660Chris Wilson					seq_printf(m, "Old framebuffer gtt_offset 0x%08x\n", obj->gtt_offset);
3594e5359cd053bfb7d8dabe4a63624a5726848ffbcSimon Farnsworth			}
3604e5359cd053bfb7d8dabe4a63624a5726848ffbcSimon Farnsworth			if (work->pending_flip_obj) {
36105394f3975dceb107a5e1393e2244946e5b43660Chris Wilson				struct drm_i915_gem_object *obj = work->pending_flip_obj;
36205394f3975dceb107a5e1393e2244946e5b43660Chris Wilson				if (obj)
36305394f3975dceb107a5e1393e2244946e5b43660Chris Wilson					seq_printf(m, "New framebuffer gtt_offset 0x%08x\n", obj->gtt_offset);
3644e5359cd053bfb7d8dabe4a63624a5726848ffbcSimon Farnsworth			}
3654e5359cd053bfb7d8dabe4a63624a5726848ffbcSimon Farnsworth		}
3664e5359cd053bfb7d8dabe4a63624a5726848ffbcSimon Farnsworth		spin_unlock_irqrestore(&dev->event_lock, flags);
3674e5359cd053bfb7d8dabe4a63624a5726848ffbcSimon Farnsworth	}
3684e5359cd053bfb7d8dabe4a63624a5726848ffbcSimon Farnsworth
3694e5359cd053bfb7d8dabe4a63624a5726848ffbcSimon Farnsworth	return 0;
3704e5359cd053bfb7d8dabe4a63624a5726848ffbcSimon Farnsworth}
3714e5359cd053bfb7d8dabe4a63624a5726848ffbcSimon Farnsworth
3722017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamaristatic int i915_gem_request_info(struct seq_file *m, void *data)
3732017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari{
3742017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari	struct drm_info_node *node = (struct drm_info_node *) m->private;
3752017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari	struct drm_device *dev = node->minor->dev;
3762017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari	drm_i915_private_t *dev_priv = dev->dev_private;
3772017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari	struct drm_i915_gem_request *gem_request;
378c2c347a9eeda1b9b69c8fc393fd933747fbb2e11Chris Wilson	int ret, count;
379de227ef0907258359d53e3e1530c1f3678eb2bb9Chris Wilson
380de227ef0907258359d53e3e1530c1f3678eb2bb9Chris Wilson	ret = mutex_lock_interruptible(&dev->struct_mutex);
381de227ef0907258359d53e3e1530c1f3678eb2bb9Chris Wilson	if (ret)
382de227ef0907258359d53e3e1530c1f3678eb2bb9Chris Wilson		return ret;
3832017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari
384c2c347a9eeda1b9b69c8fc393fd933747fbb2e11Chris Wilson	count = 0;
3851ec14ad3132702694f2e1a90b30641cf111183b9Chris Wilson	if (!list_empty(&dev_priv->ring[RCS].request_list)) {
386c2c347a9eeda1b9b69c8fc393fd933747fbb2e11Chris Wilson		seq_printf(m, "Render requests:\n");
387c2c347a9eeda1b9b69c8fc393fd933747fbb2e11Chris Wilson		list_for_each_entry(gem_request,
3881ec14ad3132702694f2e1a90b30641cf111183b9Chris Wilson				    &dev_priv->ring[RCS].request_list,
389c2c347a9eeda1b9b69c8fc393fd933747fbb2e11Chris Wilson				    list) {
390c2c347a9eeda1b9b69c8fc393fd933747fbb2e11Chris Wilson			seq_printf(m, "    %d @ %d\n",
391c2c347a9eeda1b9b69c8fc393fd933747fbb2e11Chris Wilson				   gem_request->seqno,
392c2c347a9eeda1b9b69c8fc393fd933747fbb2e11Chris Wilson				   (int) (jiffies - gem_request->emitted_jiffies));
393c2c347a9eeda1b9b69c8fc393fd933747fbb2e11Chris Wilson		}
394c2c347a9eeda1b9b69c8fc393fd933747fbb2e11Chris Wilson		count++;
395c2c347a9eeda1b9b69c8fc393fd933747fbb2e11Chris Wilson	}
3961ec14ad3132702694f2e1a90b30641cf111183b9Chris Wilson	if (!list_empty(&dev_priv->ring[VCS].request_list)) {
397c2c347a9eeda1b9b69c8fc393fd933747fbb2e11Chris Wilson		seq_printf(m, "BSD requests:\n");
398c2c347a9eeda1b9b69c8fc393fd933747fbb2e11Chris Wilson		list_for_each_entry(gem_request,
3991ec14ad3132702694f2e1a90b30641cf111183b9Chris Wilson				    &dev_priv->ring[VCS].request_list,
400c2c347a9eeda1b9b69c8fc393fd933747fbb2e11Chris Wilson				    list) {
401c2c347a9eeda1b9b69c8fc393fd933747fbb2e11Chris Wilson			seq_printf(m, "    %d @ %d\n",
402c2c347a9eeda1b9b69c8fc393fd933747fbb2e11Chris Wilson				   gem_request->seqno,
403c2c347a9eeda1b9b69c8fc393fd933747fbb2e11Chris Wilson				   (int) (jiffies - gem_request->emitted_jiffies));
404c2c347a9eeda1b9b69c8fc393fd933747fbb2e11Chris Wilson		}
405c2c347a9eeda1b9b69c8fc393fd933747fbb2e11Chris Wilson		count++;
406c2c347a9eeda1b9b69c8fc393fd933747fbb2e11Chris Wilson	}
4071ec14ad3132702694f2e1a90b30641cf111183b9Chris Wilson	if (!list_empty(&dev_priv->ring[BCS].request_list)) {
408c2c347a9eeda1b9b69c8fc393fd933747fbb2e11Chris Wilson		seq_printf(m, "BLT requests:\n");
409c2c347a9eeda1b9b69c8fc393fd933747fbb2e11Chris Wilson		list_for_each_entry(gem_request,
4101ec14ad3132702694f2e1a90b30641cf111183b9Chris Wilson				    &dev_priv->ring[BCS].request_list,
411c2c347a9eeda1b9b69c8fc393fd933747fbb2e11Chris Wilson				    list) {
412c2c347a9eeda1b9b69c8fc393fd933747fbb2e11Chris Wilson			seq_printf(m, "    %d @ %d\n",
413c2c347a9eeda1b9b69c8fc393fd933747fbb2e11Chris Wilson				   gem_request->seqno,
414c2c347a9eeda1b9b69c8fc393fd933747fbb2e11Chris Wilson				   (int) (jiffies - gem_request->emitted_jiffies));
415c2c347a9eeda1b9b69c8fc393fd933747fbb2e11Chris Wilson		}
416c2c347a9eeda1b9b69c8fc393fd933747fbb2e11Chris Wilson		count++;
4172017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari	}
418de227ef0907258359d53e3e1530c1f3678eb2bb9Chris Wilson	mutex_unlock(&dev->struct_mutex);
419de227ef0907258359d53e3e1530c1f3678eb2bb9Chris Wilson
420c2c347a9eeda1b9b69c8fc393fd933747fbb2e11Chris Wilson	if (count == 0)
421c2c347a9eeda1b9b69c8fc393fd933747fbb2e11Chris Wilson		seq_printf(m, "No requests\n");
422c2c347a9eeda1b9b69c8fc393fd933747fbb2e11Chris Wilson
4232017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari	return 0;
4242017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari}
4252017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari
426b2223497b44a4701d1be873d1e9453d7f720043bChris Wilsonstatic void i915_ring_seqno_info(struct seq_file *m,
427b2223497b44a4701d1be873d1e9453d7f720043bChris Wilson				 struct intel_ring_buffer *ring)
428b2223497b44a4701d1be873d1e9453d7f720043bChris Wilson{
429b2223497b44a4701d1be873d1e9453d7f720043bChris Wilson	if (ring->get_seqno) {
430b2223497b44a4701d1be873d1e9453d7f720043bChris Wilson		seq_printf(m, "Current sequence (%s): %d\n",
431b2223497b44a4701d1be873d1e9453d7f720043bChris Wilson			   ring->name, ring->get_seqno(ring));
432b2223497b44a4701d1be873d1e9453d7f720043bChris Wilson		seq_printf(m, "Waiter sequence (%s):  %d\n",
433b2223497b44a4701d1be873d1e9453d7f720043bChris Wilson			   ring->name, ring->waiting_seqno);
434b2223497b44a4701d1be873d1e9453d7f720043bChris Wilson		seq_printf(m, "IRQ sequence (%s):     %d\n",
435b2223497b44a4701d1be873d1e9453d7f720043bChris Wilson			   ring->name, ring->irq_seqno);
436b2223497b44a4701d1be873d1e9453d7f720043bChris Wilson	}
437b2223497b44a4701d1be873d1e9453d7f720043bChris Wilson}
438b2223497b44a4701d1be873d1e9453d7f720043bChris Wilson
4392017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamaristatic int i915_gem_seqno_info(struct seq_file *m, void *data)
4402017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari{
4412017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari	struct drm_info_node *node = (struct drm_info_node *) m->private;
4422017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari	struct drm_device *dev = node->minor->dev;
4432017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari	drm_i915_private_t *dev_priv = dev->dev_private;
4441ec14ad3132702694f2e1a90b30641cf111183b9Chris Wilson	int ret, i;
445de227ef0907258359d53e3e1530c1f3678eb2bb9Chris Wilson
446de227ef0907258359d53e3e1530c1f3678eb2bb9Chris Wilson	ret = mutex_lock_interruptible(&dev->struct_mutex);
447de227ef0907258359d53e3e1530c1f3678eb2bb9Chris Wilson	if (ret)
448de227ef0907258359d53e3e1530c1f3678eb2bb9Chris Wilson		return ret;
4492017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari
4501ec14ad3132702694f2e1a90b30641cf111183b9Chris Wilson	for (i = 0; i < I915_NUM_RINGS; i++)
4511ec14ad3132702694f2e1a90b30641cf111183b9Chris Wilson		i915_ring_seqno_info(m, &dev_priv->ring[i]);
452de227ef0907258359d53e3e1530c1f3678eb2bb9Chris Wilson
453de227ef0907258359d53e3e1530c1f3678eb2bb9Chris Wilson	mutex_unlock(&dev->struct_mutex);
454de227ef0907258359d53e3e1530c1f3678eb2bb9Chris Wilson
4552017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari	return 0;
4562017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari}
4572017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari
4582017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari
4592017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamaristatic int i915_interrupt_info(struct seq_file *m, void *data)
4602017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari{
4612017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari	struct drm_info_node *node = (struct drm_info_node *) m->private;
4622017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari	struct drm_device *dev = node->minor->dev;
4632017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari	drm_i915_private_t *dev_priv = dev->dev_private;
4649db4a9c7b2a3bd5b4952846bc0c2f58daa80ddd7Jesse Barnes	int ret, i, pipe;
465de227ef0907258359d53e3e1530c1f3678eb2bb9Chris Wilson
466de227ef0907258359d53e3e1530c1f3678eb2bb9Chris Wilson	ret = mutex_lock_interruptible(&dev->struct_mutex);
467de227ef0907258359d53e3e1530c1f3678eb2bb9Chris Wilson	if (ret)
468de227ef0907258359d53e3e1530c1f3678eb2bb9Chris Wilson		return ret;
4692017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari
470bad720ff3e8e47a04bd88d9bbc8317e7d7e049d3Eric Anholt	if (!HAS_PCH_SPLIT(dev)) {
4715f6a169598938d9e5703f06b64c4f4f972561ce5Zhenyu Wang		seq_printf(m, "Interrupt enable:    %08x\n",
4725f6a169598938d9e5703f06b64c4f4f972561ce5Zhenyu Wang			   I915_READ(IER));
4735f6a169598938d9e5703f06b64c4f4f972561ce5Zhenyu Wang		seq_printf(m, "Interrupt identity:  %08x\n",
4745f6a169598938d9e5703f06b64c4f4f972561ce5Zhenyu Wang			   I915_READ(IIR));
4755f6a169598938d9e5703f06b64c4f4f972561ce5Zhenyu Wang		seq_printf(m, "Interrupt mask:      %08x\n",
4765f6a169598938d9e5703f06b64c4f4f972561ce5Zhenyu Wang			   I915_READ(IMR));
4779db4a9c7b2a3bd5b4952846bc0c2f58daa80ddd7Jesse Barnes		for_each_pipe(pipe)
4789db4a9c7b2a3bd5b4952846bc0c2f58daa80ddd7Jesse Barnes			seq_printf(m, "Pipe %c stat:         %08x\n",
4799db4a9c7b2a3bd5b4952846bc0c2f58daa80ddd7Jesse Barnes				   pipe_name(pipe),
4809db4a9c7b2a3bd5b4952846bc0c2f58daa80ddd7Jesse Barnes				   I915_READ(PIPESTAT(pipe)));
4815f6a169598938d9e5703f06b64c4f4f972561ce5Zhenyu Wang	} else {
4825f6a169598938d9e5703f06b64c4f4f972561ce5Zhenyu Wang		seq_printf(m, "North Display Interrupt enable:		%08x\n",
4835f6a169598938d9e5703f06b64c4f4f972561ce5Zhenyu Wang			   I915_READ(DEIER));
4845f6a169598938d9e5703f06b64c4f4f972561ce5Zhenyu Wang		seq_printf(m, "North Display Interrupt identity:	%08x\n",
4855f6a169598938d9e5703f06b64c4f4f972561ce5Zhenyu Wang			   I915_READ(DEIIR));
4865f6a169598938d9e5703f06b64c4f4f972561ce5Zhenyu Wang		seq_printf(m, "North Display Interrupt mask:		%08x\n",
4875f6a169598938d9e5703f06b64c4f4f972561ce5Zhenyu Wang			   I915_READ(DEIMR));
4885f6a169598938d9e5703f06b64c4f4f972561ce5Zhenyu Wang		seq_printf(m, "South Display Interrupt enable:		%08x\n",
4895f6a169598938d9e5703f06b64c4f4f972561ce5Zhenyu Wang			   I915_READ(SDEIER));
4905f6a169598938d9e5703f06b64c4f4f972561ce5Zhenyu Wang		seq_printf(m, "South Display Interrupt identity:	%08x\n",
4915f6a169598938d9e5703f06b64c4f4f972561ce5Zhenyu Wang			   I915_READ(SDEIIR));
4925f6a169598938d9e5703f06b64c4f4f972561ce5Zhenyu Wang		seq_printf(m, "South Display Interrupt mask:		%08x\n",
4935f6a169598938d9e5703f06b64c4f4f972561ce5Zhenyu Wang			   I915_READ(SDEIMR));
4945f6a169598938d9e5703f06b64c4f4f972561ce5Zhenyu Wang		seq_printf(m, "Graphics Interrupt enable:		%08x\n",
4955f6a169598938d9e5703f06b64c4f4f972561ce5Zhenyu Wang			   I915_READ(GTIER));
4965f6a169598938d9e5703f06b64c4f4f972561ce5Zhenyu Wang		seq_printf(m, "Graphics Interrupt identity:		%08x\n",
4975f6a169598938d9e5703f06b64c4f4f972561ce5Zhenyu Wang			   I915_READ(GTIIR));
4985f6a169598938d9e5703f06b64c4f4f972561ce5Zhenyu Wang		seq_printf(m, "Graphics Interrupt mask:		%08x\n",
4995f6a169598938d9e5703f06b64c4f4f972561ce5Zhenyu Wang			   I915_READ(GTIMR));
5005f6a169598938d9e5703f06b64c4f4f972561ce5Zhenyu Wang	}
5012017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari	seq_printf(m, "Interrupts received: %d\n",
5022017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari		   atomic_read(&dev_priv->irq_received));
5039862e600cef87de0e301bad7d1435b87e03ea84dChris Wilson	for (i = 0; i < I915_NUM_RINGS; i++) {
504da64c6fc4aba6f02aa800db72411f459a9f86809Jesse Barnes		if (IS_GEN6(dev) || IS_GEN7(dev)) {
5059862e600cef87de0e301bad7d1435b87e03ea84dChris Wilson			seq_printf(m, "Graphics Interrupt mask (%s):	%08x\n",
5069862e600cef87de0e301bad7d1435b87e03ea84dChris Wilson				   dev_priv->ring[i].name,
5079862e600cef87de0e301bad7d1435b87e03ea84dChris Wilson				   I915_READ_IMR(&dev_priv->ring[i]));
5089862e600cef87de0e301bad7d1435b87e03ea84dChris Wilson		}
5091ec14ad3132702694f2e1a90b30641cf111183b9Chris Wilson		i915_ring_seqno_info(m, &dev_priv->ring[i]);
5109862e600cef87de0e301bad7d1435b87e03ea84dChris Wilson	}
511de227ef0907258359d53e3e1530c1f3678eb2bb9Chris Wilson	mutex_unlock(&dev->struct_mutex);
512de227ef0907258359d53e3e1530c1f3678eb2bb9Chris Wilson
5132017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari	return 0;
5142017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari}
5152017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari
516a6172a80ecb7ac64151960de1f709f78b509c57cChris Wilsonstatic int i915_gem_fence_regs_info(struct seq_file *m, void *data)
517a6172a80ecb7ac64151960de1f709f78b509c57cChris Wilson{
518a6172a80ecb7ac64151960de1f709f78b509c57cChris Wilson	struct drm_info_node *node = (struct drm_info_node *) m->private;
519a6172a80ecb7ac64151960de1f709f78b509c57cChris Wilson	struct drm_device *dev = node->minor->dev;
520a6172a80ecb7ac64151960de1f709f78b509c57cChris Wilson	drm_i915_private_t *dev_priv = dev->dev_private;
521de227ef0907258359d53e3e1530c1f3678eb2bb9Chris Wilson	int i, ret;
522de227ef0907258359d53e3e1530c1f3678eb2bb9Chris Wilson
523de227ef0907258359d53e3e1530c1f3678eb2bb9Chris Wilson	ret = mutex_lock_interruptible(&dev->struct_mutex);
524de227ef0907258359d53e3e1530c1f3678eb2bb9Chris Wilson	if (ret)
525de227ef0907258359d53e3e1530c1f3678eb2bb9Chris Wilson		return ret;
526a6172a80ecb7ac64151960de1f709f78b509c57cChris Wilson
527a6172a80ecb7ac64151960de1f709f78b509c57cChris Wilson	seq_printf(m, "Reserved fences = %d\n", dev_priv->fence_reg_start);
528a6172a80ecb7ac64151960de1f709f78b509c57cChris Wilson	seq_printf(m, "Total fences = %d\n", dev_priv->num_fence_regs);
529a6172a80ecb7ac64151960de1f709f78b509c57cChris Wilson	for (i = 0; i < dev_priv->num_fence_regs; i++) {
53005394f3975dceb107a5e1393e2244946e5b43660Chris Wilson		struct drm_i915_gem_object *obj = dev_priv->fence_regs[i].obj;
531a6172a80ecb7ac64151960de1f709f78b509c57cChris Wilson
532c2c347a9eeda1b9b69c8fc393fd933747fbb2e11Chris Wilson		seq_printf(m, "Fenced object[%2d] = ", i);
533c2c347a9eeda1b9b69c8fc393fd933747fbb2e11Chris Wilson		if (obj == NULL)
534c2c347a9eeda1b9b69c8fc393fd933747fbb2e11Chris Wilson			seq_printf(m, "unused");
535c2c347a9eeda1b9b69c8fc393fd933747fbb2e11Chris Wilson		else
53605394f3975dceb107a5e1393e2244946e5b43660Chris Wilson			describe_obj(m, obj);
537c2c347a9eeda1b9b69c8fc393fd933747fbb2e11Chris Wilson		seq_printf(m, "\n");
538a6172a80ecb7ac64151960de1f709f78b509c57cChris Wilson	}
539a6172a80ecb7ac64151960de1f709f78b509c57cChris Wilson
54005394f3975dceb107a5e1393e2244946e5b43660Chris Wilson	mutex_unlock(&dev->struct_mutex);
541a6172a80ecb7ac64151960de1f709f78b509c57cChris Wilson	return 0;
542a6172a80ecb7ac64151960de1f709f78b509c57cChris Wilson}
543a6172a80ecb7ac64151960de1f709f78b509c57cChris Wilson
5442017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamaristatic int i915_hws_info(struct seq_file *m, void *data)
5452017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari{
5462017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari	struct drm_info_node *node = (struct drm_info_node *) m->private;
5472017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari	struct drm_device *dev = node->minor->dev;
5482017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari	drm_i915_private_t *dev_priv = dev->dev_private;
5494066c0ae13a8388b9f2a29cad60da330b578eff2Chris Wilson	struct intel_ring_buffer *ring;
550311bd68e024f9006db66cbadc3bd9f62fd663f4bChris Wilson	const volatile u32 __iomem *hws;
5514066c0ae13a8388b9f2a29cad60da330b578eff2Chris Wilson	int i;
5524066c0ae13a8388b9f2a29cad60da330b578eff2Chris Wilson
5531ec14ad3132702694f2e1a90b30641cf111183b9Chris Wilson	ring = &dev_priv->ring[(uintptr_t)node->info_ent->data];
554311bd68e024f9006db66cbadc3bd9f62fd663f4bChris Wilson	hws = (volatile u32 __iomem *)ring->status_page.page_addr;
5552017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari	if (hws == NULL)
5562017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari		return 0;
5572017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari
5582017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari	for (i = 0; i < 4096 / sizeof(u32) / 4; i += 4) {
5592017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari		seq_printf(m, "0x%08x: 0x%08x 0x%08x 0x%08x 0x%08x\n",
5602017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari			   i * 4,
5612017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari			   hws[i], hws[i + 1], hws[i + 2], hws[i + 3]);
5622017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari	}
5632017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari	return 0;
5642017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari}
5652017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari
5665cdf58817433345157644140f2f509f00c06d479Chris Wilsonstatic void i915_dump_object(struct seq_file *m,
5675cdf58817433345157644140f2f509f00c06d479Chris Wilson			     struct io_mapping *mapping,
56805394f3975dceb107a5e1393e2244946e5b43660Chris Wilson			     struct drm_i915_gem_object *obj)
5696911a9b8ae8b2a1dab4dfda9c2bd20f7ca2961d6Ben Gamari{
5705cdf58817433345157644140f2f509f00c06d479Chris Wilson	int page, page_count, i;
5716911a9b8ae8b2a1dab4dfda9c2bd20f7ca2961d6Ben Gamari
57205394f3975dceb107a5e1393e2244946e5b43660Chris Wilson	page_count = obj->base.size / PAGE_SIZE;
5736911a9b8ae8b2a1dab4dfda9c2bd20f7ca2961d6Ben Gamari	for (page = 0; page < page_count; page++) {
5745cdf58817433345157644140f2f509f00c06d479Chris Wilson		u32 *mem = io_mapping_map_wc(mapping,
57505394f3975dceb107a5e1393e2244946e5b43660Chris Wilson					     obj->gtt_offset + page * PAGE_SIZE);
5766911a9b8ae8b2a1dab4dfda9c2bd20f7ca2961d6Ben Gamari		for (i = 0; i < PAGE_SIZE; i += 4)
5776911a9b8ae8b2a1dab4dfda9c2bd20f7ca2961d6Ben Gamari			seq_printf(m, "%08x :  %08x\n", i, mem[i / 4]);
5785cdf58817433345157644140f2f509f00c06d479Chris Wilson		io_mapping_unmap(mem);
5796911a9b8ae8b2a1dab4dfda9c2bd20f7ca2961d6Ben Gamari	}
5806911a9b8ae8b2a1dab4dfda9c2bd20f7ca2961d6Ben Gamari}
5816911a9b8ae8b2a1dab4dfda9c2bd20f7ca2961d6Ben Gamari
5826911a9b8ae8b2a1dab4dfda9c2bd20f7ca2961d6Ben Gamaristatic int i915_batchbuffer_info(struct seq_file *m, void *data)
5836911a9b8ae8b2a1dab4dfda9c2bd20f7ca2961d6Ben Gamari{
5846911a9b8ae8b2a1dab4dfda9c2bd20f7ca2961d6Ben Gamari	struct drm_info_node *node = (struct drm_info_node *) m->private;
5856911a9b8ae8b2a1dab4dfda9c2bd20f7ca2961d6Ben Gamari	struct drm_device *dev = node->minor->dev;
5866911a9b8ae8b2a1dab4dfda9c2bd20f7ca2961d6Ben Gamari	drm_i915_private_t *dev_priv = dev->dev_private;
58705394f3975dceb107a5e1393e2244946e5b43660Chris Wilson	struct drm_i915_gem_object *obj;
5886911a9b8ae8b2a1dab4dfda9c2bd20f7ca2961d6Ben Gamari	int ret;
5896911a9b8ae8b2a1dab4dfda9c2bd20f7ca2961d6Ben Gamari
590de227ef0907258359d53e3e1530c1f3678eb2bb9Chris Wilson	ret = mutex_lock_interruptible(&dev->struct_mutex);
591de227ef0907258359d53e3e1530c1f3678eb2bb9Chris Wilson	if (ret)
592de227ef0907258359d53e3e1530c1f3678eb2bb9Chris Wilson		return ret;
5936911a9b8ae8b2a1dab4dfda9c2bd20f7ca2961d6Ben Gamari
59405394f3975dceb107a5e1393e2244946e5b43660Chris Wilson	list_for_each_entry(obj, &dev_priv->mm.active_list, mm_list) {
59505394f3975dceb107a5e1393e2244946e5b43660Chris Wilson		if (obj->base.read_domains & I915_GEM_DOMAIN_COMMAND) {
59605394f3975dceb107a5e1393e2244946e5b43660Chris Wilson		    seq_printf(m, "--- gtt_offset = 0x%08x\n", obj->gtt_offset);
59705394f3975dceb107a5e1393e2244946e5b43660Chris Wilson		    i915_dump_object(m, dev_priv->mm.gtt_mapping, obj);
5986911a9b8ae8b2a1dab4dfda9c2bd20f7ca2961d6Ben Gamari		}
5996911a9b8ae8b2a1dab4dfda9c2bd20f7ca2961d6Ben Gamari	}
6006911a9b8ae8b2a1dab4dfda9c2bd20f7ca2961d6Ben Gamari
601de227ef0907258359d53e3e1530c1f3678eb2bb9Chris Wilson	mutex_unlock(&dev->struct_mutex);
6026911a9b8ae8b2a1dab4dfda9c2bd20f7ca2961d6Ben Gamari	return 0;
6036911a9b8ae8b2a1dab4dfda9c2bd20f7ca2961d6Ben Gamari}
6046911a9b8ae8b2a1dab4dfda9c2bd20f7ca2961d6Ben Gamari
6056911a9b8ae8b2a1dab4dfda9c2bd20f7ca2961d6Ben Gamaristatic int i915_ringbuffer_data(struct seq_file *m, void *data)
6066911a9b8ae8b2a1dab4dfda9c2bd20f7ca2961d6Ben Gamari{
6076911a9b8ae8b2a1dab4dfda9c2bd20f7ca2961d6Ben Gamari	struct drm_info_node *node = (struct drm_info_node *) m->private;
6086911a9b8ae8b2a1dab4dfda9c2bd20f7ca2961d6Ben Gamari	struct drm_device *dev = node->minor->dev;
6096911a9b8ae8b2a1dab4dfda9c2bd20f7ca2961d6Ben Gamari	drm_i915_private_t *dev_priv = dev->dev_private;
610c2c347a9eeda1b9b69c8fc393fd933747fbb2e11Chris Wilson	struct intel_ring_buffer *ring;
611de227ef0907258359d53e3e1530c1f3678eb2bb9Chris Wilson	int ret;
612de227ef0907258359d53e3e1530c1f3678eb2bb9Chris Wilson
613de227ef0907258359d53e3e1530c1f3678eb2bb9Chris Wilson	ret = mutex_lock_interruptible(&dev->struct_mutex);
614de227ef0907258359d53e3e1530c1f3678eb2bb9Chris Wilson	if (ret)
615de227ef0907258359d53e3e1530c1f3678eb2bb9Chris Wilson		return ret;
6166911a9b8ae8b2a1dab4dfda9c2bd20f7ca2961d6Ben Gamari
6171ec14ad3132702694f2e1a90b30641cf111183b9Chris Wilson	ring = &dev_priv->ring[(uintptr_t)node->info_ent->data];
61805394f3975dceb107a5e1393e2244946e5b43660Chris Wilson	if (!ring->obj) {
6196911a9b8ae8b2a1dab4dfda9c2bd20f7ca2961d6Ben Gamari		seq_printf(m, "No ringbuffer setup\n");
620de227ef0907258359d53e3e1530c1f3678eb2bb9Chris Wilson	} else {
621311bd68e024f9006db66cbadc3bd9f62fd663f4bChris Wilson		const u8 __iomem *virt = ring->virtual_start;
622de227ef0907258359d53e3e1530c1f3678eb2bb9Chris Wilson		uint32_t off;
6236911a9b8ae8b2a1dab4dfda9c2bd20f7ca2961d6Ben Gamari
624c2c347a9eeda1b9b69c8fc393fd933747fbb2e11Chris Wilson		for (off = 0; off < ring->size; off += 4) {
625de227ef0907258359d53e3e1530c1f3678eb2bb9Chris Wilson			uint32_t *ptr = (uint32_t *)(virt + off);
626de227ef0907258359d53e3e1530c1f3678eb2bb9Chris Wilson			seq_printf(m, "%08x :  %08x\n", off, *ptr);
627de227ef0907258359d53e3e1530c1f3678eb2bb9Chris Wilson		}
6286911a9b8ae8b2a1dab4dfda9c2bd20f7ca2961d6Ben Gamari	}
629de227ef0907258359d53e3e1530c1f3678eb2bb9Chris Wilson	mutex_unlock(&dev->struct_mutex);
6306911a9b8ae8b2a1dab4dfda9c2bd20f7ca2961d6Ben Gamari
6316911a9b8ae8b2a1dab4dfda9c2bd20f7ca2961d6Ben Gamari	return 0;
6326911a9b8ae8b2a1dab4dfda9c2bd20f7ca2961d6Ben Gamari}
6336911a9b8ae8b2a1dab4dfda9c2bd20f7ca2961d6Ben Gamari
6346911a9b8ae8b2a1dab4dfda9c2bd20f7ca2961d6Ben Gamaristatic int i915_ringbuffer_info(struct seq_file *m, void *data)
6356911a9b8ae8b2a1dab4dfda9c2bd20f7ca2961d6Ben Gamari{
6366911a9b8ae8b2a1dab4dfda9c2bd20f7ca2961d6Ben Gamari	struct drm_info_node *node = (struct drm_info_node *) m->private;
6376911a9b8ae8b2a1dab4dfda9c2bd20f7ca2961d6Ben Gamari	struct drm_device *dev = node->minor->dev;
6386911a9b8ae8b2a1dab4dfda9c2bd20f7ca2961d6Ben Gamari	drm_i915_private_t *dev_priv = dev->dev_private;
639c2c347a9eeda1b9b69c8fc393fd933747fbb2e11Chris Wilson	struct intel_ring_buffer *ring;
640616fdb5afb12b4d5bb9e36df40d039e86aaaefc2Ben Widawsky	int ret;
641c2c347a9eeda1b9b69c8fc393fd933747fbb2e11Chris Wilson
6421ec14ad3132702694f2e1a90b30641cf111183b9Chris Wilson	ring = &dev_priv->ring[(uintptr_t)node->info_ent->data];
643c2c347a9eeda1b9b69c8fc393fd933747fbb2e11Chris Wilson	if (ring->size == 0)
6441ec14ad3132702694f2e1a90b30641cf111183b9Chris Wilson		return 0;
6456911a9b8ae8b2a1dab4dfda9c2bd20f7ca2961d6Ben Gamari
646616fdb5afb12b4d5bb9e36df40d039e86aaaefc2Ben Widawsky	ret = mutex_lock_interruptible(&dev->struct_mutex);
647616fdb5afb12b4d5bb9e36df40d039e86aaaefc2Ben Widawsky	if (ret)
648616fdb5afb12b4d5bb9e36df40d039e86aaaefc2Ben Widawsky		return ret;
649616fdb5afb12b4d5bb9e36df40d039e86aaaefc2Ben Widawsky
650c2c347a9eeda1b9b69c8fc393fd933747fbb2e11Chris Wilson	seq_printf(m, "Ring %s:\n", ring->name);
651c2c347a9eeda1b9b69c8fc393fd933747fbb2e11Chris Wilson	seq_printf(m, "  Head :    %08x\n", I915_READ_HEAD(ring) & HEAD_ADDR);
652c2c347a9eeda1b9b69c8fc393fd933747fbb2e11Chris Wilson	seq_printf(m, "  Tail :    %08x\n", I915_READ_TAIL(ring) & TAIL_ADDR);
653c2c347a9eeda1b9b69c8fc393fd933747fbb2e11Chris Wilson	seq_printf(m, "  Size :    %08x\n", ring->size);
654c2c347a9eeda1b9b69c8fc393fd933747fbb2e11Chris Wilson	seq_printf(m, "  Active :  %08x\n", intel_ring_get_active_head(ring));
6551ec14ad3132702694f2e1a90b30641cf111183b9Chris Wilson	seq_printf(m, "  NOPID :   %08x\n", I915_READ_NOPID(ring));
65648467a92215ced69a65c89c1b064dd84728a5ed0Daniel Vetter	if (IS_GEN6(dev) || IS_GEN7(dev)) {
6571ec14ad3132702694f2e1a90b30641cf111183b9Chris Wilson		seq_printf(m, "  Sync 0 :   %08x\n", I915_READ_SYNC_0(ring));
6581ec14ad3132702694f2e1a90b30641cf111183b9Chris Wilson		seq_printf(m, "  Sync 1 :   %08x\n", I915_READ_SYNC_1(ring));
6591ec14ad3132702694f2e1a90b30641cf111183b9Chris Wilson	}
660c2c347a9eeda1b9b69c8fc393fd933747fbb2e11Chris Wilson	seq_printf(m, "  Control : %08x\n", I915_READ_CTL(ring));
661c2c347a9eeda1b9b69c8fc393fd933747fbb2e11Chris Wilson	seq_printf(m, "  Start :   %08x\n", I915_READ_START(ring));
6626911a9b8ae8b2a1dab4dfda9c2bd20f7ca2961d6Ben Gamari
663616fdb5afb12b4d5bb9e36df40d039e86aaaefc2Ben Widawsky	mutex_unlock(&dev->struct_mutex);
664616fdb5afb12b4d5bb9e36df40d039e86aaaefc2Ben Widawsky
6656911a9b8ae8b2a1dab4dfda9c2bd20f7ca2961d6Ben Gamari	return 0;
6666911a9b8ae8b2a1dab4dfda9c2bd20f7ca2961d6Ben Gamari}
6676911a9b8ae8b2a1dab4dfda9c2bd20f7ca2961d6Ben Gamari
668e5c652603680404683fd1f262b511340545179a2Chris Wilsonstatic const char *ring_str(int ring)
669e5c652603680404683fd1f262b511340545179a2Chris Wilson{
670e5c652603680404683fd1f262b511340545179a2Chris Wilson	switch (ring) {
6713685092b717882bb9b6801bf3e4b02a106e3b129Chris Wilson	case RING_RENDER: return " render";
6723685092b717882bb9b6801bf3e4b02a106e3b129Chris Wilson	case RING_BSD: return " bsd";
6733685092b717882bb9b6801bf3e4b02a106e3b129Chris Wilson	case RING_BLT: return " blt";
674e5c652603680404683fd1f262b511340545179a2Chris Wilson	default: return "";
675e5c652603680404683fd1f262b511340545179a2Chris Wilson	}
676e5c652603680404683fd1f262b511340545179a2Chris Wilson}
677e5c652603680404683fd1f262b511340545179a2Chris Wilson
6789df30794f609d9412f14cfd0eb7b45dd64d0b14eChris Wilsonstatic const char *pin_flag(int pinned)
6799df30794f609d9412f14cfd0eb7b45dd64d0b14eChris Wilson{
6809df30794f609d9412f14cfd0eb7b45dd64d0b14eChris Wilson	if (pinned > 0)
6819df30794f609d9412f14cfd0eb7b45dd64d0b14eChris Wilson		return " P";
6829df30794f609d9412f14cfd0eb7b45dd64d0b14eChris Wilson	else if (pinned < 0)
6839df30794f609d9412f14cfd0eb7b45dd64d0b14eChris Wilson		return " p";
6849df30794f609d9412f14cfd0eb7b45dd64d0b14eChris Wilson	else
6859df30794f609d9412f14cfd0eb7b45dd64d0b14eChris Wilson		return "";
6869df30794f609d9412f14cfd0eb7b45dd64d0b14eChris Wilson}
6879df30794f609d9412f14cfd0eb7b45dd64d0b14eChris Wilson
6889df30794f609d9412f14cfd0eb7b45dd64d0b14eChris Wilsonstatic const char *tiling_flag(int tiling)
6899df30794f609d9412f14cfd0eb7b45dd64d0b14eChris Wilson{
6909df30794f609d9412f14cfd0eb7b45dd64d0b14eChris Wilson	switch (tiling) {
6919df30794f609d9412f14cfd0eb7b45dd64d0b14eChris Wilson	default:
6929df30794f609d9412f14cfd0eb7b45dd64d0b14eChris Wilson	case I915_TILING_NONE: return "";
6939df30794f609d9412f14cfd0eb7b45dd64d0b14eChris Wilson	case I915_TILING_X: return " X";
6949df30794f609d9412f14cfd0eb7b45dd64d0b14eChris Wilson	case I915_TILING_Y: return " Y";
6959df30794f609d9412f14cfd0eb7b45dd64d0b14eChris Wilson	}
6969df30794f609d9412f14cfd0eb7b45dd64d0b14eChris Wilson}
6979df30794f609d9412f14cfd0eb7b45dd64d0b14eChris Wilson
6989df30794f609d9412f14cfd0eb7b45dd64d0b14eChris Wilsonstatic const char *dirty_flag(int dirty)
6999df30794f609d9412f14cfd0eb7b45dd64d0b14eChris Wilson{
7009df30794f609d9412f14cfd0eb7b45dd64d0b14eChris Wilson	return dirty ? " dirty" : "";
7019df30794f609d9412f14cfd0eb7b45dd64d0b14eChris Wilson}
7029df30794f609d9412f14cfd0eb7b45dd64d0b14eChris Wilson
7039df30794f609d9412f14cfd0eb7b45dd64d0b14eChris Wilsonstatic const char *purgeable_flag(int purgeable)
7049df30794f609d9412f14cfd0eb7b45dd64d0b14eChris Wilson{
7059df30794f609d9412f14cfd0eb7b45dd64d0b14eChris Wilson	return purgeable ? " purgeable" : "";
7069df30794f609d9412f14cfd0eb7b45dd64d0b14eChris Wilson}
7079df30794f609d9412f14cfd0eb7b45dd64d0b14eChris Wilson
708c724e8a9407683a8a2ee8eb00b972badf237bbe1Chris Wilsonstatic void print_error_buffers(struct seq_file *m,
709c724e8a9407683a8a2ee8eb00b972badf237bbe1Chris Wilson				const char *name,
710c724e8a9407683a8a2ee8eb00b972badf237bbe1Chris Wilson				struct drm_i915_error_buffer *err,
711c724e8a9407683a8a2ee8eb00b972badf237bbe1Chris Wilson				int count)
712c724e8a9407683a8a2ee8eb00b972badf237bbe1Chris Wilson{
713c724e8a9407683a8a2ee8eb00b972badf237bbe1Chris Wilson	seq_printf(m, "%s [%d]:\n", name, count);
714c724e8a9407683a8a2ee8eb00b972badf237bbe1Chris Wilson
715c724e8a9407683a8a2ee8eb00b972badf237bbe1Chris Wilson	while (count--) {
716833bcb00c478c674fda0aaea089c1a92abd2da01Chris Wilson		seq_printf(m, "  %08x %8u %04x %04x %08x%s%s%s%s%s%s",
717c724e8a9407683a8a2ee8eb00b972badf237bbe1Chris Wilson			   err->gtt_offset,
718c724e8a9407683a8a2ee8eb00b972badf237bbe1Chris Wilson			   err->size,
719c724e8a9407683a8a2ee8eb00b972badf237bbe1Chris Wilson			   err->read_domains,
720c724e8a9407683a8a2ee8eb00b972badf237bbe1Chris Wilson			   err->write_domain,
721c724e8a9407683a8a2ee8eb00b972badf237bbe1Chris Wilson			   err->seqno,
722c724e8a9407683a8a2ee8eb00b972badf237bbe1Chris Wilson			   pin_flag(err->pinned),
723c724e8a9407683a8a2ee8eb00b972badf237bbe1Chris Wilson			   tiling_flag(err->tiling),
724c724e8a9407683a8a2ee8eb00b972badf237bbe1Chris Wilson			   dirty_flag(err->dirty),
725c724e8a9407683a8a2ee8eb00b972badf237bbe1Chris Wilson			   purgeable_flag(err->purgeable),
726a779e5abda0367aa9d53c0931d9687743afe503dChris Wilson			   ring_str(err->ring),
72793dfb40cd887c4f39e38f047c4d9ea0b7188a58aChris Wilson			   cache_level_str(err->cache_level));
728c724e8a9407683a8a2ee8eb00b972badf237bbe1Chris Wilson
729c724e8a9407683a8a2ee8eb00b972badf237bbe1Chris Wilson		if (err->name)
730c724e8a9407683a8a2ee8eb00b972badf237bbe1Chris Wilson			seq_printf(m, " (name: %d)", err->name);
731c724e8a9407683a8a2ee8eb00b972badf237bbe1Chris Wilson		if (err->fence_reg != I915_FENCE_REG_NONE)
732c724e8a9407683a8a2ee8eb00b972badf237bbe1Chris Wilson			seq_printf(m, " (fence: %d)", err->fence_reg);
733c724e8a9407683a8a2ee8eb00b972badf237bbe1Chris Wilson
734c724e8a9407683a8a2ee8eb00b972badf237bbe1Chris Wilson		seq_printf(m, "\n");
735c724e8a9407683a8a2ee8eb00b972badf237bbe1Chris Wilson		err++;
736c724e8a9407683a8a2ee8eb00b972badf237bbe1Chris Wilson	}
737c724e8a9407683a8a2ee8eb00b972badf237bbe1Chris Wilson}
738c724e8a9407683a8a2ee8eb00b972badf237bbe1Chris Wilson
73963eeaf38251183ec2b1caee11e4a2c040cb5ce6cJesse Barnesstatic int i915_error_state(struct seq_file *m, void *unused)
74063eeaf38251183ec2b1caee11e4a2c040cb5ce6cJesse Barnes{
74163eeaf38251183ec2b1caee11e4a2c040cb5ce6cJesse Barnes	struct drm_info_node *node = (struct drm_info_node *) m->private;
74263eeaf38251183ec2b1caee11e4a2c040cb5ce6cJesse Barnes	struct drm_device *dev = node->minor->dev;
74363eeaf38251183ec2b1caee11e4a2c040cb5ce6cJesse Barnes	drm_i915_private_t *dev_priv = dev->dev_private;
74463eeaf38251183ec2b1caee11e4a2c040cb5ce6cJesse Barnes	struct drm_i915_error_state *error;
74563eeaf38251183ec2b1caee11e4a2c040cb5ce6cJesse Barnes	unsigned long flags;
7469df30794f609d9412f14cfd0eb7b45dd64d0b14eChris Wilson	int i, page, offset, elt;
74763eeaf38251183ec2b1caee11e4a2c040cb5ce6cJesse Barnes
74863eeaf38251183ec2b1caee11e4a2c040cb5ce6cJesse Barnes	spin_lock_irqsave(&dev_priv->error_lock, flags);
74963eeaf38251183ec2b1caee11e4a2c040cb5ce6cJesse Barnes	if (!dev_priv->first_error) {
75063eeaf38251183ec2b1caee11e4a2c040cb5ce6cJesse Barnes		seq_printf(m, "no error state collected\n");
75163eeaf38251183ec2b1caee11e4a2c040cb5ce6cJesse Barnes		goto out;
75263eeaf38251183ec2b1caee11e4a2c040cb5ce6cJesse Barnes	}
75363eeaf38251183ec2b1caee11e4a2c040cb5ce6cJesse Barnes
75463eeaf38251183ec2b1caee11e4a2c040cb5ce6cJesse Barnes	error = dev_priv->first_error;
75563eeaf38251183ec2b1caee11e4a2c040cb5ce6cJesse Barnes
7568a90523639f49dc4b4fa7ae47bb9c8ed73ea8577Jesse Barnes	seq_printf(m, "Time: %ld s %ld us\n", error->time.tv_sec,
7578a90523639f49dc4b4fa7ae47bb9c8ed73ea8577Jesse Barnes		   error->time.tv_usec);
7589df30794f609d9412f14cfd0eb7b45dd64d0b14eChris Wilson	seq_printf(m, "PCI ID: 0x%04x\n", dev->pci_device);
7591d8f38f4e7146d22f7fbc94eef0508bd75463f54Chris Wilson	seq_printf(m, "EIR: 0x%08x\n", error->eir);
7601d8f38f4e7146d22f7fbc94eef0508bd75463f54Chris Wilson	seq_printf(m, "PGTBL_ER: 0x%08x\n", error->pgtbl_er);
761f406839f094ef24bb201c9574fdb9ce8e799a975Chris Wilson	if (INTEL_INFO(dev)->gen >= 6) {
762f406839f094ef24bb201c9574fdb9ce8e799a975Chris Wilson		seq_printf(m, "ERROR: 0x%08x\n", error->error);
7631d8f38f4e7146d22f7fbc94eef0508bd75463f54Chris Wilson		seq_printf(m, "Blitter command stream:\n");
7641d8f38f4e7146d22f7fbc94eef0508bd75463f54Chris Wilson		seq_printf(m, "  ACTHD:    0x%08x\n", error->bcs_acthd);
7651d8f38f4e7146d22f7fbc94eef0508bd75463f54Chris Wilson		seq_printf(m, "  IPEIR:    0x%08x\n", error->bcs_ipeir);
766e5c652603680404683fd1f262b511340545179a2Chris Wilson		seq_printf(m, "  IPEHR:    0x%08x\n", error->bcs_ipehr);
7671d8f38f4e7146d22f7fbc94eef0508bd75463f54Chris Wilson		seq_printf(m, "  INSTDONE: 0x%08x\n", error->bcs_instdone);
7681d8f38f4e7146d22f7fbc94eef0508bd75463f54Chris Wilson		seq_printf(m, "  seqno:    0x%08x\n", error->bcs_seqno);
769add354ddf62beac55ca3ba64835dd703a0649867Chris Wilson		seq_printf(m, "Video (BSD) command stream:\n");
770add354ddf62beac55ca3ba64835dd703a0649867Chris Wilson		seq_printf(m, "  ACTHD:    0x%08x\n", error->vcs_acthd);
771add354ddf62beac55ca3ba64835dd703a0649867Chris Wilson		seq_printf(m, "  IPEIR:    0x%08x\n", error->vcs_ipeir);
772e5c652603680404683fd1f262b511340545179a2Chris Wilson		seq_printf(m, "  IPEHR:    0x%08x\n", error->vcs_ipehr);
773add354ddf62beac55ca3ba64835dd703a0649867Chris Wilson		seq_printf(m, "  INSTDONE: 0x%08x\n", error->vcs_instdone);
774add354ddf62beac55ca3ba64835dd703a0649867Chris Wilson		seq_printf(m, "  seqno:    0x%08x\n", error->vcs_seqno);
775f406839f094ef24bb201c9574fdb9ce8e799a975Chris Wilson	}
7761d8f38f4e7146d22f7fbc94eef0508bd75463f54Chris Wilson	seq_printf(m, "Render command stream:\n");
7771d8f38f4e7146d22f7fbc94eef0508bd75463f54Chris Wilson	seq_printf(m, "  ACTHD: 0x%08x\n", error->acthd);
77863eeaf38251183ec2b1caee11e4a2c040cb5ce6cJesse Barnes	seq_printf(m, "  IPEIR: 0x%08x\n", error->ipeir);
77963eeaf38251183ec2b1caee11e4a2c040cb5ce6cJesse Barnes	seq_printf(m, "  IPEHR: 0x%08x\n", error->ipehr);
78063eeaf38251183ec2b1caee11e4a2c040cb5ce6cJesse Barnes	seq_printf(m, "  INSTDONE: 0x%08x\n", error->instdone);
781a6c45cf013a57e32ddae43dd4ac911eb4a3919fdChris Wilson	if (INTEL_INFO(dev)->gen >= 4) {
78263eeaf38251183ec2b1caee11e4a2c040cb5ce6cJesse Barnes		seq_printf(m, "  INSTDONE1: 0x%08x\n", error->instdone1);
7831d8f38f4e7146d22f7fbc94eef0508bd75463f54Chris Wilson		seq_printf(m, "  INSTPS: 0x%08x\n", error->instps);
78463eeaf38251183ec2b1caee11e4a2c040cb5ce6cJesse Barnes	}
7851d8f38f4e7146d22f7fbc94eef0508bd75463f54Chris Wilson	seq_printf(m, "  INSTPM: 0x%08x\n", error->instpm);
7861d8f38f4e7146d22f7fbc94eef0508bd75463f54Chris Wilson	seq_printf(m, "  seqno: 0x%08x\n", error->seqno);
7879df30794f609d9412f14cfd0eb7b45dd64d0b14eChris Wilson
788bf3301abba31ee71ed8dc87f18fcaebd27dc3b3eDaniel Vetter	for (i = 0; i < dev_priv->num_fence_regs; i++)
789748ebc6017a943ec065e653e975a5e8dace77ac6Chris Wilson		seq_printf(m, "  fence[%d] = %08llx\n", i, error->fence[i]);
790748ebc6017a943ec065e653e975a5e8dace77ac6Chris Wilson
791c724e8a9407683a8a2ee8eb00b972badf237bbe1Chris Wilson	if (error->active_bo)
792c724e8a9407683a8a2ee8eb00b972badf237bbe1Chris Wilson		print_error_buffers(m, "Active",
793c724e8a9407683a8a2ee8eb00b972badf237bbe1Chris Wilson				    error->active_bo,
794c724e8a9407683a8a2ee8eb00b972badf237bbe1Chris Wilson				    error->active_bo_count);
795c724e8a9407683a8a2ee8eb00b972badf237bbe1Chris Wilson
796c724e8a9407683a8a2ee8eb00b972badf237bbe1Chris Wilson	if (error->pinned_bo)
797c724e8a9407683a8a2ee8eb00b972badf237bbe1Chris Wilson		print_error_buffers(m, "Pinned",
798c724e8a9407683a8a2ee8eb00b972badf237bbe1Chris Wilson				    error->pinned_bo,
799c724e8a9407683a8a2ee8eb00b972badf237bbe1Chris Wilson				    error->pinned_bo_count);
8009df30794f609d9412f14cfd0eb7b45dd64d0b14eChris Wilson
8019df30794f609d9412f14cfd0eb7b45dd64d0b14eChris Wilson	for (i = 0; i < ARRAY_SIZE(error->batchbuffer); i++) {
8029df30794f609d9412f14cfd0eb7b45dd64d0b14eChris Wilson		if (error->batchbuffer[i]) {
8039df30794f609d9412f14cfd0eb7b45dd64d0b14eChris Wilson			struct drm_i915_error_object *obj = error->batchbuffer[i];
8049df30794f609d9412f14cfd0eb7b45dd64d0b14eChris Wilson
805bcfb2e285827bf0cfea8bbfad18a4fca57fbabaeChris Wilson			seq_printf(m, "%s --- gtt_offset = 0x%08x\n",
806bcfb2e285827bf0cfea8bbfad18a4fca57fbabaeChris Wilson				   dev_priv->ring[i].name,
807bcfb2e285827bf0cfea8bbfad18a4fca57fbabaeChris Wilson				   obj->gtt_offset);
8089df30794f609d9412f14cfd0eb7b45dd64d0b14eChris Wilson			offset = 0;
8099df30794f609d9412f14cfd0eb7b45dd64d0b14eChris Wilson			for (page = 0; page < obj->page_count; page++) {
8109df30794f609d9412f14cfd0eb7b45dd64d0b14eChris Wilson				for (elt = 0; elt < PAGE_SIZE/4; elt++) {
8119df30794f609d9412f14cfd0eb7b45dd64d0b14eChris Wilson					seq_printf(m, "%08x :  %08x\n", offset, obj->pages[page][elt]);
8129df30794f609d9412f14cfd0eb7b45dd64d0b14eChris Wilson					offset += 4;
8139df30794f609d9412f14cfd0eb7b45dd64d0b14eChris Wilson				}
8149df30794f609d9412f14cfd0eb7b45dd64d0b14eChris Wilson			}
8159df30794f609d9412f14cfd0eb7b45dd64d0b14eChris Wilson		}
8169df30794f609d9412f14cfd0eb7b45dd64d0b14eChris Wilson	}
8179df30794f609d9412f14cfd0eb7b45dd64d0b14eChris Wilson
818e2f973d58e80ba00bcfaa171169c42c710e7e826Chris Wilson	for (i = 0; i < ARRAY_SIZE(error->ringbuffer); i++) {
819e2f973d58e80ba00bcfaa171169c42c710e7e826Chris Wilson		if (error->ringbuffer[i]) {
820e2f973d58e80ba00bcfaa171169c42c710e7e826Chris Wilson			struct drm_i915_error_object *obj = error->ringbuffer[i];
821e2f973d58e80ba00bcfaa171169c42c710e7e826Chris Wilson			seq_printf(m, "%s --- ringbuffer = 0x%08x\n",
822e2f973d58e80ba00bcfaa171169c42c710e7e826Chris Wilson				   dev_priv->ring[i].name,
823e2f973d58e80ba00bcfaa171169c42c710e7e826Chris Wilson				   obj->gtt_offset);
824e2f973d58e80ba00bcfaa171169c42c710e7e826Chris Wilson			offset = 0;
825e2f973d58e80ba00bcfaa171169c42c710e7e826Chris Wilson			for (page = 0; page < obj->page_count; page++) {
826e2f973d58e80ba00bcfaa171169c42c710e7e826Chris Wilson				for (elt = 0; elt < PAGE_SIZE/4; elt++) {
827e2f973d58e80ba00bcfaa171169c42c710e7e826Chris Wilson					seq_printf(m, "%08x :  %08x\n",
828e2f973d58e80ba00bcfaa171169c42c710e7e826Chris Wilson						   offset,
829e2f973d58e80ba00bcfaa171169c42c710e7e826Chris Wilson						   obj->pages[page][elt]);
830e2f973d58e80ba00bcfaa171169c42c710e7e826Chris Wilson					offset += 4;
831e2f973d58e80ba00bcfaa171169c42c710e7e826Chris Wilson				}
8329df30794f609d9412f14cfd0eb7b45dd64d0b14eChris Wilson			}
8339df30794f609d9412f14cfd0eb7b45dd64d0b14eChris Wilson		}
8349df30794f609d9412f14cfd0eb7b45dd64d0b14eChris Wilson	}
83563eeaf38251183ec2b1caee11e4a2c040cb5ce6cJesse Barnes
8366ef3d4278034982c13df87c4a51e0445f762d316Chris Wilson	if (error->overlay)
8376ef3d4278034982c13df87c4a51e0445f762d316Chris Wilson		intel_overlay_print_error_state(m, error->overlay);
8386ef3d4278034982c13df87c4a51e0445f762d316Chris Wilson
839c4a1d9e4dc5d5313cfec2cc0c9d630efe8a6f287Chris Wilson	if (error->display)
840c4a1d9e4dc5d5313cfec2cc0c9d630efe8a6f287Chris Wilson		intel_display_print_error_state(m, dev, error->display);
841c4a1d9e4dc5d5313cfec2cc0c9d630efe8a6f287Chris Wilson
84263eeaf38251183ec2b1caee11e4a2c040cb5ce6cJesse Barnesout:
84363eeaf38251183ec2b1caee11e4a2c040cb5ce6cJesse Barnes	spin_unlock_irqrestore(&dev_priv->error_lock, flags);
84463eeaf38251183ec2b1caee11e4a2c040cb5ce6cJesse Barnes
84563eeaf38251183ec2b1caee11e4a2c040cb5ce6cJesse Barnes	return 0;
84663eeaf38251183ec2b1caee11e4a2c040cb5ce6cJesse Barnes}
8476911a9b8ae8b2a1dab4dfda9c2bd20f7ca2961d6Ben Gamari
848f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnesstatic int i915_rstdby_delays(struct seq_file *m, void *unused)
849f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes{
850f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes	struct drm_info_node *node = (struct drm_info_node *) m->private;
851f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes	struct drm_device *dev = node->minor->dev;
852f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes	drm_i915_private_t *dev_priv = dev->dev_private;
853616fdb5afb12b4d5bb9e36df40d039e86aaaefc2Ben Widawsky	u16 crstanddelay;
854616fdb5afb12b4d5bb9e36df40d039e86aaaefc2Ben Widawsky	int ret;
855616fdb5afb12b4d5bb9e36df40d039e86aaaefc2Ben Widawsky
856616fdb5afb12b4d5bb9e36df40d039e86aaaefc2Ben Widawsky	ret = mutex_lock_interruptible(&dev->struct_mutex);
857616fdb5afb12b4d5bb9e36df40d039e86aaaefc2Ben Widawsky	if (ret)
858616fdb5afb12b4d5bb9e36df40d039e86aaaefc2Ben Widawsky		return ret;
859616fdb5afb12b4d5bb9e36df40d039e86aaaefc2Ben Widawsky
860616fdb5afb12b4d5bb9e36df40d039e86aaaefc2Ben Widawsky	crstanddelay = I915_READ16(CRSTANDVID);
861616fdb5afb12b4d5bb9e36df40d039e86aaaefc2Ben Widawsky
862616fdb5afb12b4d5bb9e36df40d039e86aaaefc2Ben Widawsky	mutex_unlock(&dev->struct_mutex);
863f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes
864f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes	seq_printf(m, "w/ctx: %d, w/o ctx: %d\n", (crstanddelay >> 8) & 0x3f, (crstanddelay & 0x3f));
865f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes
866f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes	return 0;
867f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes}
868f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes
869f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnesstatic int i915_cur_delayinfo(struct seq_file *m, void *unused)
870f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes{
871f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes	struct drm_info_node *node = (struct drm_info_node *) m->private;
872f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes	struct drm_device *dev = node->minor->dev;
873f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes	drm_i915_private_t *dev_priv = dev->dev_private;
874d1ebd816e6d7967c764f0cfa7d718f7c5cc7a8e4Ben Widawsky	int ret;
8753b8d8d91d51c7d15cda51052624169edf7b6dbc6Jesse Barnes
8763b8d8d91d51c7d15cda51052624169edf7b6dbc6Jesse Barnes	if (IS_GEN5(dev)) {
8773b8d8d91d51c7d15cda51052624169edf7b6dbc6Jesse Barnes		u16 rgvswctl = I915_READ16(MEMSWCTL);
8783b8d8d91d51c7d15cda51052624169edf7b6dbc6Jesse Barnes		u16 rgvstat = I915_READ16(MEMSTAT_ILK);
8793b8d8d91d51c7d15cda51052624169edf7b6dbc6Jesse Barnes
8803b8d8d91d51c7d15cda51052624169edf7b6dbc6Jesse Barnes		seq_printf(m, "Requested P-state: %d\n", (rgvswctl >> 8) & 0xf);
8813b8d8d91d51c7d15cda51052624169edf7b6dbc6Jesse Barnes		seq_printf(m, "Requested VID: %d\n", rgvswctl & 0x3f);
8823b8d8d91d51c7d15cda51052624169edf7b6dbc6Jesse Barnes		seq_printf(m, "Current VID: %d\n", (rgvstat & MEMSTAT_VID_MASK) >>
8833b8d8d91d51c7d15cda51052624169edf7b6dbc6Jesse Barnes			   MEMSTAT_VID_SHIFT);
8843b8d8d91d51c7d15cda51052624169edf7b6dbc6Jesse Barnes		seq_printf(m, "Current P-state: %d\n",
8853b8d8d91d51c7d15cda51052624169edf7b6dbc6Jesse Barnes			   (rgvstat & MEMSTAT_PSTATE_MASK) >> MEMSTAT_PSTATE_SHIFT);
8861c70c0cebd1295a42fec75045b8a6b4419cedef3Jesse Barnes	} else if (IS_GEN6(dev) || IS_GEN7(dev)) {
8873b8d8d91d51c7d15cda51052624169edf7b6dbc6Jesse Barnes		u32 gt_perf_status = I915_READ(GEN6_GT_PERF_STATUS);
8883b8d8d91d51c7d15cda51052624169edf7b6dbc6Jesse Barnes		u32 rp_state_limits = I915_READ(GEN6_RP_STATE_LIMITS);
8893b8d8d91d51c7d15cda51052624169edf7b6dbc6Jesse Barnes		u32 rp_state_cap = I915_READ(GEN6_RP_STATE_CAP);
890ccab5c82759e2ace74b2e84f82d1e0eedd932571Jesse Barnes		u32 rpstat;
891ccab5c82759e2ace74b2e84f82d1e0eedd932571Jesse Barnes		u32 rpupei, rpcurup, rpprevup;
892ccab5c82759e2ace74b2e84f82d1e0eedd932571Jesse Barnes		u32 rpdownei, rpcurdown, rpprevdown;
8933b8d8d91d51c7d15cda51052624169edf7b6dbc6Jesse Barnes		int max_freq;
8943b8d8d91d51c7d15cda51052624169edf7b6dbc6Jesse Barnes
8953b8d8d91d51c7d15cda51052624169edf7b6dbc6Jesse Barnes		/* RPSTAT1 is in the GT power well */
896d1ebd816e6d7967c764f0cfa7d718f7c5cc7a8e4Ben Widawsky		ret = mutex_lock_interruptible(&dev->struct_mutex);
897d1ebd816e6d7967c764f0cfa7d718f7c5cc7a8e4Ben Widawsky		if (ret)
898d1ebd816e6d7967c764f0cfa7d718f7c5cc7a8e4Ben Widawsky			return ret;
899d1ebd816e6d7967c764f0cfa7d718f7c5cc7a8e4Ben Widawsky
900fcca7926299944841569515da321bef9655b7703Ben Widawsky		gen6_gt_force_wake_get(dev_priv);
9013b8d8d91d51c7d15cda51052624169edf7b6dbc6Jesse Barnes
902ccab5c82759e2ace74b2e84f82d1e0eedd932571Jesse Barnes		rpstat = I915_READ(GEN6_RPSTAT1);
903ccab5c82759e2ace74b2e84f82d1e0eedd932571Jesse Barnes		rpupei = I915_READ(GEN6_RP_CUR_UP_EI);
904ccab5c82759e2ace74b2e84f82d1e0eedd932571Jesse Barnes		rpcurup = I915_READ(GEN6_RP_CUR_UP);
905ccab5c82759e2ace74b2e84f82d1e0eedd932571Jesse Barnes		rpprevup = I915_READ(GEN6_RP_PREV_UP);
906ccab5c82759e2ace74b2e84f82d1e0eedd932571Jesse Barnes		rpdownei = I915_READ(GEN6_RP_CUR_DOWN_EI);
907ccab5c82759e2ace74b2e84f82d1e0eedd932571Jesse Barnes		rpcurdown = I915_READ(GEN6_RP_CUR_DOWN);
908ccab5c82759e2ace74b2e84f82d1e0eedd932571Jesse Barnes		rpprevdown = I915_READ(GEN6_RP_PREV_DOWN);
909ccab5c82759e2ace74b2e84f82d1e0eedd932571Jesse Barnes
910d1ebd816e6d7967c764f0cfa7d718f7c5cc7a8e4Ben Widawsky		gen6_gt_force_wake_put(dev_priv);
911d1ebd816e6d7967c764f0cfa7d718f7c5cc7a8e4Ben Widawsky		mutex_unlock(&dev->struct_mutex);
912d1ebd816e6d7967c764f0cfa7d718f7c5cc7a8e4Ben Widawsky
9133b8d8d91d51c7d15cda51052624169edf7b6dbc6Jesse Barnes		seq_printf(m, "GT_PERF_STATUS: 0x%08x\n", gt_perf_status);
914ccab5c82759e2ace74b2e84f82d1e0eedd932571Jesse Barnes		seq_printf(m, "RPSTAT1: 0x%08x\n", rpstat);
9153b8d8d91d51c7d15cda51052624169edf7b6dbc6Jesse Barnes		seq_printf(m, "Render p-state ratio: %d\n",
9163b8d8d91d51c7d15cda51052624169edf7b6dbc6Jesse Barnes			   (gt_perf_status & 0xff00) >> 8);
9173b8d8d91d51c7d15cda51052624169edf7b6dbc6Jesse Barnes		seq_printf(m, "Render p-state VID: %d\n",
9183b8d8d91d51c7d15cda51052624169edf7b6dbc6Jesse Barnes			   gt_perf_status & 0xff);
9193b8d8d91d51c7d15cda51052624169edf7b6dbc6Jesse Barnes		seq_printf(m, "Render p-state limit: %d\n",
9203b8d8d91d51c7d15cda51052624169edf7b6dbc6Jesse Barnes			   rp_state_limits & 0xff);
921ccab5c82759e2ace74b2e84f82d1e0eedd932571Jesse Barnes		seq_printf(m, "CAGF: %dMHz\n", ((rpstat & GEN6_CAGF_MASK) >>
922e281fcaa287fb39ce26d9aa33a716c2a7bb8484eJesse Barnes						GEN6_CAGF_SHIFT) * 50);
923ccab5c82759e2ace74b2e84f82d1e0eedd932571Jesse Barnes		seq_printf(m, "RP CUR UP EI: %dus\n", rpupei &
924ccab5c82759e2ace74b2e84f82d1e0eedd932571Jesse Barnes			   GEN6_CURICONT_MASK);
925ccab5c82759e2ace74b2e84f82d1e0eedd932571Jesse Barnes		seq_printf(m, "RP CUR UP: %dus\n", rpcurup &
926ccab5c82759e2ace74b2e84f82d1e0eedd932571Jesse Barnes			   GEN6_CURBSYTAVG_MASK);
927ccab5c82759e2ace74b2e84f82d1e0eedd932571Jesse Barnes		seq_printf(m, "RP PREV UP: %dus\n", rpprevup &
928ccab5c82759e2ace74b2e84f82d1e0eedd932571Jesse Barnes			   GEN6_CURBSYTAVG_MASK);
929ccab5c82759e2ace74b2e84f82d1e0eedd932571Jesse Barnes		seq_printf(m, "RP CUR DOWN EI: %dus\n", rpdownei &
930ccab5c82759e2ace74b2e84f82d1e0eedd932571Jesse Barnes			   GEN6_CURIAVG_MASK);
931ccab5c82759e2ace74b2e84f82d1e0eedd932571Jesse Barnes		seq_printf(m, "RP CUR DOWN: %dus\n", rpcurdown &
932ccab5c82759e2ace74b2e84f82d1e0eedd932571Jesse Barnes			   GEN6_CURBSYTAVG_MASK);
933ccab5c82759e2ace74b2e84f82d1e0eedd932571Jesse Barnes		seq_printf(m, "RP PREV DOWN: %dus\n", rpprevdown &
934ccab5c82759e2ace74b2e84f82d1e0eedd932571Jesse Barnes			   GEN6_CURBSYTAVG_MASK);
9353b8d8d91d51c7d15cda51052624169edf7b6dbc6Jesse Barnes
9363b8d8d91d51c7d15cda51052624169edf7b6dbc6Jesse Barnes		max_freq = (rp_state_cap & 0xff0000) >> 16;
9373b8d8d91d51c7d15cda51052624169edf7b6dbc6Jesse Barnes		seq_printf(m, "Lowest (RPN) frequency: %dMHz\n",
938e281fcaa287fb39ce26d9aa33a716c2a7bb8484eJesse Barnes			   max_freq * 50);
9393b8d8d91d51c7d15cda51052624169edf7b6dbc6Jesse Barnes
9403b8d8d91d51c7d15cda51052624169edf7b6dbc6Jesse Barnes		max_freq = (rp_state_cap & 0xff00) >> 8;
9413b8d8d91d51c7d15cda51052624169edf7b6dbc6Jesse Barnes		seq_printf(m, "Nominal (RP1) frequency: %dMHz\n",
942e281fcaa287fb39ce26d9aa33a716c2a7bb8484eJesse Barnes			   max_freq * 50);
9433b8d8d91d51c7d15cda51052624169edf7b6dbc6Jesse Barnes
9443b8d8d91d51c7d15cda51052624169edf7b6dbc6Jesse Barnes		max_freq = rp_state_cap & 0xff;
9453b8d8d91d51c7d15cda51052624169edf7b6dbc6Jesse Barnes		seq_printf(m, "Max non-overclocked (RP0) frequency: %dMHz\n",
946e281fcaa287fb39ce26d9aa33a716c2a7bb8484eJesse Barnes			   max_freq * 50);
9473b8d8d91d51c7d15cda51052624169edf7b6dbc6Jesse Barnes	} else {
9483b8d8d91d51c7d15cda51052624169edf7b6dbc6Jesse Barnes		seq_printf(m, "no P-state info available\n");
9493b8d8d91d51c7d15cda51052624169edf7b6dbc6Jesse Barnes	}
950f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes
951f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes	return 0;
952f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes}
953f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes
954f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnesstatic int i915_delayfreq_table(struct seq_file *m, void *unused)
955f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes{
956f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes	struct drm_info_node *node = (struct drm_info_node *) m->private;
957f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes	struct drm_device *dev = node->minor->dev;
958f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes	drm_i915_private_t *dev_priv = dev->dev_private;
959f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes	u32 delayfreq;
960616fdb5afb12b4d5bb9e36df40d039e86aaaefc2Ben Widawsky	int ret, i;
961616fdb5afb12b4d5bb9e36df40d039e86aaaefc2Ben Widawsky
962616fdb5afb12b4d5bb9e36df40d039e86aaaefc2Ben Widawsky	ret = mutex_lock_interruptible(&dev->struct_mutex);
963616fdb5afb12b4d5bb9e36df40d039e86aaaefc2Ben Widawsky	if (ret)
964616fdb5afb12b4d5bb9e36df40d039e86aaaefc2Ben Widawsky		return ret;
965f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes
966f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes	for (i = 0; i < 16; i++) {
967f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes		delayfreq = I915_READ(PXVFREQ_BASE + i * 4);
9687648fa99eb77a2e1a90b7beaa420e07d819b9c11Jesse Barnes		seq_printf(m, "P%02dVIDFREQ: 0x%08x (VID: %d)\n", i, delayfreq,
9697648fa99eb77a2e1a90b7beaa420e07d819b9c11Jesse Barnes			   (delayfreq & PXVFREQ_PX_MASK) >> PXVFREQ_PX_SHIFT);
970f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes	}
971f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes
972616fdb5afb12b4d5bb9e36df40d039e86aaaefc2Ben Widawsky	mutex_unlock(&dev->struct_mutex);
973616fdb5afb12b4d5bb9e36df40d039e86aaaefc2Ben Widawsky
974f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes	return 0;
975f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes}
976f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes
977f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnesstatic inline int MAP_TO_MV(int map)
978f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes{
979f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes	return 1250 - (map * 25);
980f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes}
981f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes
982f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnesstatic int i915_inttoext_table(struct seq_file *m, void *unused)
983f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes{
984f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes	struct drm_info_node *node = (struct drm_info_node *) m->private;
985f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes	struct drm_device *dev = node->minor->dev;
986f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes	drm_i915_private_t *dev_priv = dev->dev_private;
987f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes	u32 inttoext;
988616fdb5afb12b4d5bb9e36df40d039e86aaaefc2Ben Widawsky	int ret, i;
989616fdb5afb12b4d5bb9e36df40d039e86aaaefc2Ben Widawsky
990616fdb5afb12b4d5bb9e36df40d039e86aaaefc2Ben Widawsky	ret = mutex_lock_interruptible(&dev->struct_mutex);
991616fdb5afb12b4d5bb9e36df40d039e86aaaefc2Ben Widawsky	if (ret)
992616fdb5afb12b4d5bb9e36df40d039e86aaaefc2Ben Widawsky		return ret;
993f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes
994f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes	for (i = 1; i <= 32; i++) {
995f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes		inttoext = I915_READ(INTTOEXT_BASE_ILK + i * 4);
996f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes		seq_printf(m, "INTTOEXT%02d: 0x%08x\n", i, inttoext);
997f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes	}
998f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes
999616fdb5afb12b4d5bb9e36df40d039e86aaaefc2Ben Widawsky	mutex_unlock(&dev->struct_mutex);
1000616fdb5afb12b4d5bb9e36df40d039e86aaaefc2Ben Widawsky
1001f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes	return 0;
1002f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes}
1003f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes
10044d85529d584856d077895a2daa703224d3aee7e1Ben Widawskystatic int ironlake_drpc_info(struct seq_file *m)
1005f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes{
1006f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes	struct drm_info_node *node = (struct drm_info_node *) m->private;
1007f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes	struct drm_device *dev = node->minor->dev;
1008f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes	drm_i915_private_t *dev_priv = dev->dev_private;
1009616fdb5afb12b4d5bb9e36df40d039e86aaaefc2Ben Widawsky	u32 rgvmodectl, rstdbyctl;
1010616fdb5afb12b4d5bb9e36df40d039e86aaaefc2Ben Widawsky	u16 crstandvid;
1011616fdb5afb12b4d5bb9e36df40d039e86aaaefc2Ben Widawsky	int ret;
1012616fdb5afb12b4d5bb9e36df40d039e86aaaefc2Ben Widawsky
1013616fdb5afb12b4d5bb9e36df40d039e86aaaefc2Ben Widawsky	ret = mutex_lock_interruptible(&dev->struct_mutex);
1014616fdb5afb12b4d5bb9e36df40d039e86aaaefc2Ben Widawsky	if (ret)
1015616fdb5afb12b4d5bb9e36df40d039e86aaaefc2Ben Widawsky		return ret;
1016616fdb5afb12b4d5bb9e36df40d039e86aaaefc2Ben Widawsky
1017616fdb5afb12b4d5bb9e36df40d039e86aaaefc2Ben Widawsky	rgvmodectl = I915_READ(MEMMODECTL);
1018616fdb5afb12b4d5bb9e36df40d039e86aaaefc2Ben Widawsky	rstdbyctl = I915_READ(RSTDBYCTL);
1019616fdb5afb12b4d5bb9e36df40d039e86aaaefc2Ben Widawsky	crstandvid = I915_READ16(CRSTANDVID);
1020616fdb5afb12b4d5bb9e36df40d039e86aaaefc2Ben Widawsky
1021616fdb5afb12b4d5bb9e36df40d039e86aaaefc2Ben Widawsky	mutex_unlock(&dev->struct_mutex);
1022f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes
1023f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes	seq_printf(m, "HD boost: %s\n", (rgvmodectl & MEMMODE_BOOST_EN) ?
1024f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes		   "yes" : "no");
1025f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes	seq_printf(m, "Boost freq: %d\n",
1026f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes		   (rgvmodectl & MEMMODE_BOOST_FREQ_MASK) >>
1027f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes		   MEMMODE_BOOST_FREQ_SHIFT);
1028f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes	seq_printf(m, "HW control enabled: %s\n",
1029f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes		   rgvmodectl & MEMMODE_HWIDLE_EN ? "yes" : "no");
1030f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes	seq_printf(m, "SW control enabled: %s\n",
1031f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes		   rgvmodectl & MEMMODE_SWMODE_EN ? "yes" : "no");
1032f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes	seq_printf(m, "Gated voltage change: %s\n",
1033f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes		   rgvmodectl & MEMMODE_RCLK_GATE ? "yes" : "no");
1034f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes	seq_printf(m, "Starting frequency: P%d\n",
1035f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes		   (rgvmodectl & MEMMODE_FSTART_MASK) >> MEMMODE_FSTART_SHIFT);
10367648fa99eb77a2e1a90b7beaa420e07d819b9c11Jesse Barnes	seq_printf(m, "Max P-state: P%d\n",
1037f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes		   (rgvmodectl & MEMMODE_FMAX_MASK) >> MEMMODE_FMAX_SHIFT);
10387648fa99eb77a2e1a90b7beaa420e07d819b9c11Jesse Barnes	seq_printf(m, "Min P-state: P%d\n", (rgvmodectl & MEMMODE_FMIN_MASK));
10397648fa99eb77a2e1a90b7beaa420e07d819b9c11Jesse Barnes	seq_printf(m, "RS1 VID: %d\n", (crstandvid & 0x3f));
10407648fa99eb77a2e1a90b7beaa420e07d819b9c11Jesse Barnes	seq_printf(m, "RS2 VID: %d\n", ((crstandvid >> 8) & 0x3f));
10417648fa99eb77a2e1a90b7beaa420e07d819b9c11Jesse Barnes	seq_printf(m, "Render standby enabled: %s\n",
10427648fa99eb77a2e1a90b7beaa420e07d819b9c11Jesse Barnes		   (rstdbyctl & RCX_SW_EXIT) ? "no" : "yes");
104388271da3f3da75d6eaef5e768c82a1627edf7088Jesse Barnes	seq_printf(m, "Current RS state: ");
104488271da3f3da75d6eaef5e768c82a1627edf7088Jesse Barnes	switch (rstdbyctl & RSX_STATUS_MASK) {
104588271da3f3da75d6eaef5e768c82a1627edf7088Jesse Barnes	case RSX_STATUS_ON:
104688271da3f3da75d6eaef5e768c82a1627edf7088Jesse Barnes		seq_printf(m, "on\n");
104788271da3f3da75d6eaef5e768c82a1627edf7088Jesse Barnes		break;
104888271da3f3da75d6eaef5e768c82a1627edf7088Jesse Barnes	case RSX_STATUS_RC1:
104988271da3f3da75d6eaef5e768c82a1627edf7088Jesse Barnes		seq_printf(m, "RC1\n");
105088271da3f3da75d6eaef5e768c82a1627edf7088Jesse Barnes		break;
105188271da3f3da75d6eaef5e768c82a1627edf7088Jesse Barnes	case RSX_STATUS_RC1E:
105288271da3f3da75d6eaef5e768c82a1627edf7088Jesse Barnes		seq_printf(m, "RC1E\n");
105388271da3f3da75d6eaef5e768c82a1627edf7088Jesse Barnes		break;
105488271da3f3da75d6eaef5e768c82a1627edf7088Jesse Barnes	case RSX_STATUS_RS1:
105588271da3f3da75d6eaef5e768c82a1627edf7088Jesse Barnes		seq_printf(m, "RS1\n");
105688271da3f3da75d6eaef5e768c82a1627edf7088Jesse Barnes		break;
105788271da3f3da75d6eaef5e768c82a1627edf7088Jesse Barnes	case RSX_STATUS_RS2:
105888271da3f3da75d6eaef5e768c82a1627edf7088Jesse Barnes		seq_printf(m, "RS2 (RC6)\n");
105988271da3f3da75d6eaef5e768c82a1627edf7088Jesse Barnes		break;
106088271da3f3da75d6eaef5e768c82a1627edf7088Jesse Barnes	case RSX_STATUS_RS3:
106188271da3f3da75d6eaef5e768c82a1627edf7088Jesse Barnes		seq_printf(m, "RC3 (RC6+)\n");
106288271da3f3da75d6eaef5e768c82a1627edf7088Jesse Barnes		break;
106388271da3f3da75d6eaef5e768c82a1627edf7088Jesse Barnes	default:
106488271da3f3da75d6eaef5e768c82a1627edf7088Jesse Barnes		seq_printf(m, "unknown\n");
106588271da3f3da75d6eaef5e768c82a1627edf7088Jesse Barnes		break;
106688271da3f3da75d6eaef5e768c82a1627edf7088Jesse Barnes	}
1067f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes
1068f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes	return 0;
1069f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes}
1070f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes
10714d85529d584856d077895a2daa703224d3aee7e1Ben Widawskystatic int gen6_drpc_info(struct seq_file *m)
10724d85529d584856d077895a2daa703224d3aee7e1Ben Widawsky{
10734d85529d584856d077895a2daa703224d3aee7e1Ben Widawsky
10744d85529d584856d077895a2daa703224d3aee7e1Ben Widawsky	struct drm_info_node *node = (struct drm_info_node *) m->private;
10754d85529d584856d077895a2daa703224d3aee7e1Ben Widawsky	struct drm_device *dev = node->minor->dev;
10764d85529d584856d077895a2daa703224d3aee7e1Ben Widawsky	struct drm_i915_private *dev_priv = dev->dev_private;
10774d85529d584856d077895a2daa703224d3aee7e1Ben Widawsky	u32 rpmodectl1, gt_core_status, rcctl1;
107893b525dccf212e50a895792d79d64bdb53312f5cDaniel Vetter	unsigned forcewake_count;
10794d85529d584856d077895a2daa703224d3aee7e1Ben Widawsky	int count=0, ret;
10804d85529d584856d077895a2daa703224d3aee7e1Ben Widawsky
10814d85529d584856d077895a2daa703224d3aee7e1Ben Widawsky
10824d85529d584856d077895a2daa703224d3aee7e1Ben Widawsky	ret = mutex_lock_interruptible(&dev->struct_mutex);
10834d85529d584856d077895a2daa703224d3aee7e1Ben Widawsky	if (ret)
10844d85529d584856d077895a2daa703224d3aee7e1Ben Widawsky		return ret;
10854d85529d584856d077895a2daa703224d3aee7e1Ben Widawsky
108693b525dccf212e50a895792d79d64bdb53312f5cDaniel Vetter	spin_lock_irq(&dev_priv->gt_lock);
108793b525dccf212e50a895792d79d64bdb53312f5cDaniel Vetter	forcewake_count = dev_priv->forcewake_count;
108893b525dccf212e50a895792d79d64bdb53312f5cDaniel Vetter	spin_unlock_irq(&dev_priv->gt_lock);
108993b525dccf212e50a895792d79d64bdb53312f5cDaniel Vetter
109093b525dccf212e50a895792d79d64bdb53312f5cDaniel Vetter	if (forcewake_count) {
109193b525dccf212e50a895792d79d64bdb53312f5cDaniel Vetter		seq_printf(m, "RC information inaccurate because somebody "
109293b525dccf212e50a895792d79d64bdb53312f5cDaniel Vetter			      "holds a forcewake reference \n");
10934d85529d584856d077895a2daa703224d3aee7e1Ben Widawsky	} else {
10944d85529d584856d077895a2daa703224d3aee7e1Ben Widawsky		/* NB: we cannot use forcewake, else we read the wrong values */
10954d85529d584856d077895a2daa703224d3aee7e1Ben Widawsky		while (count++ < 50 && (I915_READ_NOTRACE(FORCEWAKE_ACK) & 1))
10964d85529d584856d077895a2daa703224d3aee7e1Ben Widawsky			udelay(10);
10974d85529d584856d077895a2daa703224d3aee7e1Ben Widawsky		seq_printf(m, "RC information accurate: %s\n", yesno(count < 51));
10984d85529d584856d077895a2daa703224d3aee7e1Ben Widawsky	}
10994d85529d584856d077895a2daa703224d3aee7e1Ben Widawsky
11004d85529d584856d077895a2daa703224d3aee7e1Ben Widawsky	gt_core_status = readl(dev_priv->regs + GEN6_GT_CORE_STATUS);
11014d85529d584856d077895a2daa703224d3aee7e1Ben Widawsky	trace_i915_reg_rw(false, GEN6_GT_CORE_STATUS, gt_core_status, 4);
11024d85529d584856d077895a2daa703224d3aee7e1Ben Widawsky
11034d85529d584856d077895a2daa703224d3aee7e1Ben Widawsky	rpmodectl1 = I915_READ(GEN6_RP_CONTROL);
11044d85529d584856d077895a2daa703224d3aee7e1Ben Widawsky	rcctl1 = I915_READ(GEN6_RC_CONTROL);
11054d85529d584856d077895a2daa703224d3aee7e1Ben Widawsky	mutex_unlock(&dev->struct_mutex);
11064d85529d584856d077895a2daa703224d3aee7e1Ben Widawsky
11074d85529d584856d077895a2daa703224d3aee7e1Ben Widawsky	seq_printf(m, "Video Turbo Mode: %s\n",
11084d85529d584856d077895a2daa703224d3aee7e1Ben Widawsky		   yesno(rpmodectl1 & GEN6_RP_MEDIA_TURBO));
11094d85529d584856d077895a2daa703224d3aee7e1Ben Widawsky	seq_printf(m, "HW control enabled: %s\n",
11104d85529d584856d077895a2daa703224d3aee7e1Ben Widawsky		   yesno(rpmodectl1 & GEN6_RP_ENABLE));
11114d85529d584856d077895a2daa703224d3aee7e1Ben Widawsky	seq_printf(m, "SW control enabled: %s\n",
11124d85529d584856d077895a2daa703224d3aee7e1Ben Widawsky		   yesno((rpmodectl1 & GEN6_RP_MEDIA_MODE_MASK) ==
11134d85529d584856d077895a2daa703224d3aee7e1Ben Widawsky			  GEN6_RP_MEDIA_SW_MODE));
1114fff24e21e17e438bf24791ed9cea7bbc02ad2dbbEric Anholt	seq_printf(m, "RC1e Enabled: %s\n",
11154d85529d584856d077895a2daa703224d3aee7e1Ben Widawsky		   yesno(rcctl1 & GEN6_RC_CTL_RC1e_ENABLE));
11164d85529d584856d077895a2daa703224d3aee7e1Ben Widawsky	seq_printf(m, "RC6 Enabled: %s\n",
11174d85529d584856d077895a2daa703224d3aee7e1Ben Widawsky		   yesno(rcctl1 & GEN6_RC_CTL_RC6_ENABLE));
11184d85529d584856d077895a2daa703224d3aee7e1Ben Widawsky	seq_printf(m, "Deep RC6 Enabled: %s\n",
11194d85529d584856d077895a2daa703224d3aee7e1Ben Widawsky		   yesno(rcctl1 & GEN6_RC_CTL_RC6p_ENABLE));
11204d85529d584856d077895a2daa703224d3aee7e1Ben Widawsky	seq_printf(m, "Deepest RC6 Enabled: %s\n",
11214d85529d584856d077895a2daa703224d3aee7e1Ben Widawsky		   yesno(rcctl1 & GEN6_RC_CTL_RC6pp_ENABLE));
11224d85529d584856d077895a2daa703224d3aee7e1Ben Widawsky	seq_printf(m, "Current RC state: ");
11234d85529d584856d077895a2daa703224d3aee7e1Ben Widawsky	switch (gt_core_status & GEN6_RCn_MASK) {
11244d85529d584856d077895a2daa703224d3aee7e1Ben Widawsky	case GEN6_RC0:
11254d85529d584856d077895a2daa703224d3aee7e1Ben Widawsky		if (gt_core_status & GEN6_CORE_CPD_STATE_MASK)
11264d85529d584856d077895a2daa703224d3aee7e1Ben Widawsky			seq_printf(m, "Core Power Down\n");
11274d85529d584856d077895a2daa703224d3aee7e1Ben Widawsky		else
11284d85529d584856d077895a2daa703224d3aee7e1Ben Widawsky			seq_printf(m, "on\n");
11294d85529d584856d077895a2daa703224d3aee7e1Ben Widawsky		break;
11304d85529d584856d077895a2daa703224d3aee7e1Ben Widawsky	case GEN6_RC3:
11314d85529d584856d077895a2daa703224d3aee7e1Ben Widawsky		seq_printf(m, "RC3\n");
11324d85529d584856d077895a2daa703224d3aee7e1Ben Widawsky		break;
11334d85529d584856d077895a2daa703224d3aee7e1Ben Widawsky	case GEN6_RC6:
11344d85529d584856d077895a2daa703224d3aee7e1Ben Widawsky		seq_printf(m, "RC6\n");
11354d85529d584856d077895a2daa703224d3aee7e1Ben Widawsky		break;
11364d85529d584856d077895a2daa703224d3aee7e1Ben Widawsky	case GEN6_RC7:
11374d85529d584856d077895a2daa703224d3aee7e1Ben Widawsky		seq_printf(m, "RC7\n");
11384d85529d584856d077895a2daa703224d3aee7e1Ben Widawsky		break;
11394d85529d584856d077895a2daa703224d3aee7e1Ben Widawsky	default:
11404d85529d584856d077895a2daa703224d3aee7e1Ben Widawsky		seq_printf(m, "Unknown\n");
11414d85529d584856d077895a2daa703224d3aee7e1Ben Widawsky		break;
11424d85529d584856d077895a2daa703224d3aee7e1Ben Widawsky	}
11434d85529d584856d077895a2daa703224d3aee7e1Ben Widawsky
11444d85529d584856d077895a2daa703224d3aee7e1Ben Widawsky	seq_printf(m, "Core Power Down: %s\n",
11454d85529d584856d077895a2daa703224d3aee7e1Ben Widawsky		   yesno(gt_core_status & GEN6_CORE_CPD_STATE_MASK));
11464d85529d584856d077895a2daa703224d3aee7e1Ben Widawsky	return 0;
11474d85529d584856d077895a2daa703224d3aee7e1Ben Widawsky}
11484d85529d584856d077895a2daa703224d3aee7e1Ben Widawsky
11494d85529d584856d077895a2daa703224d3aee7e1Ben Widawskystatic int i915_drpc_info(struct seq_file *m, void *unused)
11504d85529d584856d077895a2daa703224d3aee7e1Ben Widawsky{
11514d85529d584856d077895a2daa703224d3aee7e1Ben Widawsky	struct drm_info_node *node = (struct drm_info_node *) m->private;
11524d85529d584856d077895a2daa703224d3aee7e1Ben Widawsky	struct drm_device *dev = node->minor->dev;
11534d85529d584856d077895a2daa703224d3aee7e1Ben Widawsky
11544d85529d584856d077895a2daa703224d3aee7e1Ben Widawsky	if (IS_GEN6(dev) || IS_GEN7(dev))
11554d85529d584856d077895a2daa703224d3aee7e1Ben Widawsky		return gen6_drpc_info(m);
11564d85529d584856d077895a2daa703224d3aee7e1Ben Widawsky	else
11574d85529d584856d077895a2daa703224d3aee7e1Ben Widawsky		return ironlake_drpc_info(m);
11584d85529d584856d077895a2daa703224d3aee7e1Ben Widawsky}
11594d85529d584856d077895a2daa703224d3aee7e1Ben Widawsky
1160b5e50c3f56ee4aa0d0168eab5ece413ac5df76aaJesse Barnesstatic int i915_fbc_status(struct seq_file *m, void *unused)
1161b5e50c3f56ee4aa0d0168eab5ece413ac5df76aaJesse Barnes{
1162b5e50c3f56ee4aa0d0168eab5ece413ac5df76aaJesse Barnes	struct drm_info_node *node = (struct drm_info_node *) m->private;
1163b5e50c3f56ee4aa0d0168eab5ece413ac5df76aaJesse Barnes	struct drm_device *dev = node->minor->dev;
1164b5e50c3f56ee4aa0d0168eab5ece413ac5df76aaJesse Barnes	drm_i915_private_t *dev_priv = dev->dev_private;
1165b5e50c3f56ee4aa0d0168eab5ece413ac5df76aaJesse Barnes
1166ee5382aedf669127bf672a3fc5313247fc288e26Adam Jackson	if (!I915_HAS_FBC(dev)) {
1167b5e50c3f56ee4aa0d0168eab5ece413ac5df76aaJesse Barnes		seq_printf(m, "FBC unsupported on this chipset\n");
1168b5e50c3f56ee4aa0d0168eab5ece413ac5df76aaJesse Barnes		return 0;
1169b5e50c3f56ee4aa0d0168eab5ece413ac5df76aaJesse Barnes	}
1170b5e50c3f56ee4aa0d0168eab5ece413ac5df76aaJesse Barnes
1171ee5382aedf669127bf672a3fc5313247fc288e26Adam Jackson	if (intel_fbc_enabled(dev)) {
1172b5e50c3f56ee4aa0d0168eab5ece413ac5df76aaJesse Barnes		seq_printf(m, "FBC enabled\n");
1173b5e50c3f56ee4aa0d0168eab5ece413ac5df76aaJesse Barnes	} else {
1174b5e50c3f56ee4aa0d0168eab5ece413ac5df76aaJesse Barnes		seq_printf(m, "FBC disabled: ");
1175b5e50c3f56ee4aa0d0168eab5ece413ac5df76aaJesse Barnes		switch (dev_priv->no_fbc_reason) {
1176bed4a6734b5f56ffd240fdda755b6eb589d32482Chris Wilson		case FBC_NO_OUTPUT:
1177bed4a6734b5f56ffd240fdda755b6eb589d32482Chris Wilson			seq_printf(m, "no outputs");
1178bed4a6734b5f56ffd240fdda755b6eb589d32482Chris Wilson			break;
1179b5e50c3f56ee4aa0d0168eab5ece413ac5df76aaJesse Barnes		case FBC_STOLEN_TOO_SMALL:
1180b5e50c3f56ee4aa0d0168eab5ece413ac5df76aaJesse Barnes			seq_printf(m, "not enough stolen memory");
1181b5e50c3f56ee4aa0d0168eab5ece413ac5df76aaJesse Barnes			break;
1182b5e50c3f56ee4aa0d0168eab5ece413ac5df76aaJesse Barnes		case FBC_UNSUPPORTED_MODE:
1183b5e50c3f56ee4aa0d0168eab5ece413ac5df76aaJesse Barnes			seq_printf(m, "mode not supported");
1184b5e50c3f56ee4aa0d0168eab5ece413ac5df76aaJesse Barnes			break;
1185b5e50c3f56ee4aa0d0168eab5ece413ac5df76aaJesse Barnes		case FBC_MODE_TOO_LARGE:
1186b5e50c3f56ee4aa0d0168eab5ece413ac5df76aaJesse Barnes			seq_printf(m, "mode too large");
1187b5e50c3f56ee4aa0d0168eab5ece413ac5df76aaJesse Barnes			break;
1188b5e50c3f56ee4aa0d0168eab5ece413ac5df76aaJesse Barnes		case FBC_BAD_PLANE:
1189b5e50c3f56ee4aa0d0168eab5ece413ac5df76aaJesse Barnes			seq_printf(m, "FBC unsupported on plane");
1190b5e50c3f56ee4aa0d0168eab5ece413ac5df76aaJesse Barnes			break;
1191b5e50c3f56ee4aa0d0168eab5ece413ac5df76aaJesse Barnes		case FBC_NOT_TILED:
1192b5e50c3f56ee4aa0d0168eab5ece413ac5df76aaJesse Barnes			seq_printf(m, "scanout buffer not tiled");
1193b5e50c3f56ee4aa0d0168eab5ece413ac5df76aaJesse Barnes			break;
11949c928d168d4030a230a7a5ee1764721d173f1153Jesse Barnes		case FBC_MULTIPLE_PIPES:
11959c928d168d4030a230a7a5ee1764721d173f1153Jesse Barnes			seq_printf(m, "multiple pipes are enabled");
11969c928d168d4030a230a7a5ee1764721d173f1153Jesse Barnes			break;
1197c1a9f047638b27e481d097910604316b8a0d132bJesse Barnes		case FBC_MODULE_PARAM:
1198c1a9f047638b27e481d097910604316b8a0d132bJesse Barnes			seq_printf(m, "disabled per module param (default off)");
1199c1a9f047638b27e481d097910604316b8a0d132bJesse Barnes			break;
1200b5e50c3f56ee4aa0d0168eab5ece413ac5df76aaJesse Barnes		default:
1201b5e50c3f56ee4aa0d0168eab5ece413ac5df76aaJesse Barnes			seq_printf(m, "unknown reason");
1202b5e50c3f56ee4aa0d0168eab5ece413ac5df76aaJesse Barnes		}
1203b5e50c3f56ee4aa0d0168eab5ece413ac5df76aaJesse Barnes		seq_printf(m, "\n");
1204b5e50c3f56ee4aa0d0168eab5ece413ac5df76aaJesse Barnes	}
1205b5e50c3f56ee4aa0d0168eab5ece413ac5df76aaJesse Barnes	return 0;
1206b5e50c3f56ee4aa0d0168eab5ece413ac5df76aaJesse Barnes}
1207b5e50c3f56ee4aa0d0168eab5ece413ac5df76aaJesse Barnes
12084a9bef37e5cf2c73b61ecc9ead52cad2eb4a372bJesse Barnesstatic int i915_sr_status(struct seq_file *m, void *unused)
12094a9bef37e5cf2c73b61ecc9ead52cad2eb4a372bJesse Barnes{
12104a9bef37e5cf2c73b61ecc9ead52cad2eb4a372bJesse Barnes	struct drm_info_node *node = (struct drm_info_node *) m->private;
12114a9bef37e5cf2c73b61ecc9ead52cad2eb4a372bJesse Barnes	struct drm_device *dev = node->minor->dev;
12124a9bef37e5cf2c73b61ecc9ead52cad2eb4a372bJesse Barnes	drm_i915_private_t *dev_priv = dev->dev_private;
12134a9bef37e5cf2c73b61ecc9ead52cad2eb4a372bJesse Barnes	bool sr_enabled = false;
12144a9bef37e5cf2c73b61ecc9ead52cad2eb4a372bJesse Barnes
12151398261a2e84c537c409259cfe9db3d0abcd9f99Yuanhan Liu	if (HAS_PCH_SPLIT(dev))
12165ba2aaaaa1a282a71c27f385a743f0d86f3484caChris Wilson		sr_enabled = I915_READ(WM1_LP_ILK) & WM1_LP_SR_EN;
1217a6c45cf013a57e32ddae43dd4ac911eb4a3919fdChris Wilson	else if (IS_CRESTLINE(dev) || IS_I945G(dev) || IS_I945GM(dev))
12184a9bef37e5cf2c73b61ecc9ead52cad2eb4a372bJesse Barnes		sr_enabled = I915_READ(FW_BLC_SELF) & FW_BLC_SELF_EN;
12194a9bef37e5cf2c73b61ecc9ead52cad2eb4a372bJesse Barnes	else if (IS_I915GM(dev))
12204a9bef37e5cf2c73b61ecc9ead52cad2eb4a372bJesse Barnes		sr_enabled = I915_READ(INSTPM) & INSTPM_SELF_EN;
12214a9bef37e5cf2c73b61ecc9ead52cad2eb4a372bJesse Barnes	else if (IS_PINEVIEW(dev))
12224a9bef37e5cf2c73b61ecc9ead52cad2eb4a372bJesse Barnes		sr_enabled = I915_READ(DSPFW3) & PINEVIEW_SELF_REFRESH_EN;
12234a9bef37e5cf2c73b61ecc9ead52cad2eb4a372bJesse Barnes
12245ba2aaaaa1a282a71c27f385a743f0d86f3484caChris Wilson	seq_printf(m, "self-refresh: %s\n",
12255ba2aaaaa1a282a71c27f385a743f0d86f3484caChris Wilson		   sr_enabled ? "enabled" : "disabled");
12264a9bef37e5cf2c73b61ecc9ead52cad2eb4a372bJesse Barnes
12274a9bef37e5cf2c73b61ecc9ead52cad2eb4a372bJesse Barnes	return 0;
12284a9bef37e5cf2c73b61ecc9ead52cad2eb4a372bJesse Barnes}
12294a9bef37e5cf2c73b61ecc9ead52cad2eb4a372bJesse Barnes
12307648fa99eb77a2e1a90b7beaa420e07d819b9c11Jesse Barnesstatic int i915_emon_status(struct seq_file *m, void *unused)
12317648fa99eb77a2e1a90b7beaa420e07d819b9c11Jesse Barnes{
12327648fa99eb77a2e1a90b7beaa420e07d819b9c11Jesse Barnes	struct drm_info_node *node = (struct drm_info_node *) m->private;
12337648fa99eb77a2e1a90b7beaa420e07d819b9c11Jesse Barnes	struct drm_device *dev = node->minor->dev;
12347648fa99eb77a2e1a90b7beaa420e07d819b9c11Jesse Barnes	drm_i915_private_t *dev_priv = dev->dev_private;
12357648fa99eb77a2e1a90b7beaa420e07d819b9c11Jesse Barnes	unsigned long temp, chipset, gfx;
1236de227ef0907258359d53e3e1530c1f3678eb2bb9Chris Wilson	int ret;
1237de227ef0907258359d53e3e1530c1f3678eb2bb9Chris Wilson
1238de227ef0907258359d53e3e1530c1f3678eb2bb9Chris Wilson	ret = mutex_lock_interruptible(&dev->struct_mutex);
1239de227ef0907258359d53e3e1530c1f3678eb2bb9Chris Wilson	if (ret)
1240de227ef0907258359d53e3e1530c1f3678eb2bb9Chris Wilson		return ret;
12417648fa99eb77a2e1a90b7beaa420e07d819b9c11Jesse Barnes
12427648fa99eb77a2e1a90b7beaa420e07d819b9c11Jesse Barnes	temp = i915_mch_val(dev_priv);
12437648fa99eb77a2e1a90b7beaa420e07d819b9c11Jesse Barnes	chipset = i915_chipset_val(dev_priv);
12447648fa99eb77a2e1a90b7beaa420e07d819b9c11Jesse Barnes	gfx = i915_gfx_val(dev_priv);
1245de227ef0907258359d53e3e1530c1f3678eb2bb9Chris Wilson	mutex_unlock(&dev->struct_mutex);
12467648fa99eb77a2e1a90b7beaa420e07d819b9c11Jesse Barnes
12477648fa99eb77a2e1a90b7beaa420e07d819b9c11Jesse Barnes	seq_printf(m, "GMCH temp: %ld\n", temp);
12487648fa99eb77a2e1a90b7beaa420e07d819b9c11Jesse Barnes	seq_printf(m, "Chipset power: %ld\n", chipset);
12497648fa99eb77a2e1a90b7beaa420e07d819b9c11Jesse Barnes	seq_printf(m, "GFX power: %ld\n", gfx);
12507648fa99eb77a2e1a90b7beaa420e07d819b9c11Jesse Barnes	seq_printf(m, "Total power: %ld\n", chipset + gfx);
12517648fa99eb77a2e1a90b7beaa420e07d819b9c11Jesse Barnes
12527648fa99eb77a2e1a90b7beaa420e07d819b9c11Jesse Barnes	return 0;
12537648fa99eb77a2e1a90b7beaa420e07d819b9c11Jesse Barnes}
12547648fa99eb77a2e1a90b7beaa420e07d819b9c11Jesse Barnes
125523b2f8bb92feb83127679c53633def32d3108e70Jesse Barnesstatic int i915_ring_freq_table(struct seq_file *m, void *unused)
125623b2f8bb92feb83127679c53633def32d3108e70Jesse Barnes{
125723b2f8bb92feb83127679c53633def32d3108e70Jesse Barnes	struct drm_info_node *node = (struct drm_info_node *) m->private;
125823b2f8bb92feb83127679c53633def32d3108e70Jesse Barnes	struct drm_device *dev = node->minor->dev;
125923b2f8bb92feb83127679c53633def32d3108e70Jesse Barnes	drm_i915_private_t *dev_priv = dev->dev_private;
126023b2f8bb92feb83127679c53633def32d3108e70Jesse Barnes	int ret;
126123b2f8bb92feb83127679c53633def32d3108e70Jesse Barnes	int gpu_freq, ia_freq;
126223b2f8bb92feb83127679c53633def32d3108e70Jesse Barnes
12631c70c0cebd1295a42fec75045b8a6b4419cedef3Jesse Barnes	if (!(IS_GEN6(dev) || IS_GEN7(dev))) {
126423b2f8bb92feb83127679c53633def32d3108e70Jesse Barnes		seq_printf(m, "unsupported on this chipset\n");
126523b2f8bb92feb83127679c53633def32d3108e70Jesse Barnes		return 0;
126623b2f8bb92feb83127679c53633def32d3108e70Jesse Barnes	}
126723b2f8bb92feb83127679c53633def32d3108e70Jesse Barnes
126823b2f8bb92feb83127679c53633def32d3108e70Jesse Barnes	ret = mutex_lock_interruptible(&dev->struct_mutex);
126923b2f8bb92feb83127679c53633def32d3108e70Jesse Barnes	if (ret)
127023b2f8bb92feb83127679c53633def32d3108e70Jesse Barnes		return ret;
127123b2f8bb92feb83127679c53633def32d3108e70Jesse Barnes
127223b2f8bb92feb83127679c53633def32d3108e70Jesse Barnes	seq_printf(m, "GPU freq (MHz)\tEffective CPU freq (MHz)\n");
127323b2f8bb92feb83127679c53633def32d3108e70Jesse Barnes
127423b2f8bb92feb83127679c53633def32d3108e70Jesse Barnes	for (gpu_freq = dev_priv->min_delay; gpu_freq <= dev_priv->max_delay;
127523b2f8bb92feb83127679c53633def32d3108e70Jesse Barnes	     gpu_freq++) {
127623b2f8bb92feb83127679c53633def32d3108e70Jesse Barnes		I915_WRITE(GEN6_PCODE_DATA, gpu_freq);
127723b2f8bb92feb83127679c53633def32d3108e70Jesse Barnes		I915_WRITE(GEN6_PCODE_MAILBOX, GEN6_PCODE_READY |
127823b2f8bb92feb83127679c53633def32d3108e70Jesse Barnes			   GEN6_PCODE_READ_MIN_FREQ_TABLE);
127923b2f8bb92feb83127679c53633def32d3108e70Jesse Barnes		if (wait_for((I915_READ(GEN6_PCODE_MAILBOX) &
128023b2f8bb92feb83127679c53633def32d3108e70Jesse Barnes			      GEN6_PCODE_READY) == 0, 10)) {
128123b2f8bb92feb83127679c53633def32d3108e70Jesse Barnes			DRM_ERROR("pcode read of freq table timed out\n");
128223b2f8bb92feb83127679c53633def32d3108e70Jesse Barnes			continue;
128323b2f8bb92feb83127679c53633def32d3108e70Jesse Barnes		}
128423b2f8bb92feb83127679c53633def32d3108e70Jesse Barnes		ia_freq = I915_READ(GEN6_PCODE_DATA);
128523b2f8bb92feb83127679c53633def32d3108e70Jesse Barnes		seq_printf(m, "%d\t\t%d\n", gpu_freq * 50, ia_freq * 100);
128623b2f8bb92feb83127679c53633def32d3108e70Jesse Barnes	}
128723b2f8bb92feb83127679c53633def32d3108e70Jesse Barnes
128823b2f8bb92feb83127679c53633def32d3108e70Jesse Barnes	mutex_unlock(&dev->struct_mutex);
128923b2f8bb92feb83127679c53633def32d3108e70Jesse Barnes
129023b2f8bb92feb83127679c53633def32d3108e70Jesse Barnes	return 0;
129123b2f8bb92feb83127679c53633def32d3108e70Jesse Barnes}
129223b2f8bb92feb83127679c53633def32d3108e70Jesse Barnes
12937648fa99eb77a2e1a90b7beaa420e07d819b9c11Jesse Barnesstatic int i915_gfxec(struct seq_file *m, void *unused)
12947648fa99eb77a2e1a90b7beaa420e07d819b9c11Jesse Barnes{
12957648fa99eb77a2e1a90b7beaa420e07d819b9c11Jesse Barnes	struct drm_info_node *node = (struct drm_info_node *) m->private;
12967648fa99eb77a2e1a90b7beaa420e07d819b9c11Jesse Barnes	struct drm_device *dev = node->minor->dev;
12977648fa99eb77a2e1a90b7beaa420e07d819b9c11Jesse Barnes	drm_i915_private_t *dev_priv = dev->dev_private;
1298616fdb5afb12b4d5bb9e36df40d039e86aaaefc2Ben Widawsky	int ret;
1299616fdb5afb12b4d5bb9e36df40d039e86aaaefc2Ben Widawsky
1300616fdb5afb12b4d5bb9e36df40d039e86aaaefc2Ben Widawsky	ret = mutex_lock_interruptible(&dev->struct_mutex);
1301616fdb5afb12b4d5bb9e36df40d039e86aaaefc2Ben Widawsky	if (ret)
1302616fdb5afb12b4d5bb9e36df40d039e86aaaefc2Ben Widawsky		return ret;
13037648fa99eb77a2e1a90b7beaa420e07d819b9c11Jesse Barnes
13047648fa99eb77a2e1a90b7beaa420e07d819b9c11Jesse Barnes	seq_printf(m, "GFXEC: %ld\n", (unsigned long)I915_READ(0x112f4));
13057648fa99eb77a2e1a90b7beaa420e07d819b9c11Jesse Barnes
1306616fdb5afb12b4d5bb9e36df40d039e86aaaefc2Ben Widawsky	mutex_unlock(&dev->struct_mutex);
1307616fdb5afb12b4d5bb9e36df40d039e86aaaefc2Ben Widawsky
13087648fa99eb77a2e1a90b7beaa420e07d819b9c11Jesse Barnes	return 0;
13097648fa99eb77a2e1a90b7beaa420e07d819b9c11Jesse Barnes}
13107648fa99eb77a2e1a90b7beaa420e07d819b9c11Jesse Barnes
131144834a67c0082e2cf74b16be91e49108b1432d65Chris Wilsonstatic int i915_opregion(struct seq_file *m, void *unused)
131244834a67c0082e2cf74b16be91e49108b1432d65Chris Wilson{
131344834a67c0082e2cf74b16be91e49108b1432d65Chris Wilson	struct drm_info_node *node = (struct drm_info_node *) m->private;
131444834a67c0082e2cf74b16be91e49108b1432d65Chris Wilson	struct drm_device *dev = node->minor->dev;
131544834a67c0082e2cf74b16be91e49108b1432d65Chris Wilson	drm_i915_private_t *dev_priv = dev->dev_private;
131644834a67c0082e2cf74b16be91e49108b1432d65Chris Wilson	struct intel_opregion *opregion = &dev_priv->opregion;
131744834a67c0082e2cf74b16be91e49108b1432d65Chris Wilson	int ret;
131844834a67c0082e2cf74b16be91e49108b1432d65Chris Wilson
131944834a67c0082e2cf74b16be91e49108b1432d65Chris Wilson	ret = mutex_lock_interruptible(&dev->struct_mutex);
132044834a67c0082e2cf74b16be91e49108b1432d65Chris Wilson	if (ret)
132144834a67c0082e2cf74b16be91e49108b1432d65Chris Wilson		return ret;
132244834a67c0082e2cf74b16be91e49108b1432d65Chris Wilson
132344834a67c0082e2cf74b16be91e49108b1432d65Chris Wilson	if (opregion->header)
132444834a67c0082e2cf74b16be91e49108b1432d65Chris Wilson		seq_write(m, opregion->header, OPREGION_SIZE);
132544834a67c0082e2cf74b16be91e49108b1432d65Chris Wilson
132644834a67c0082e2cf74b16be91e49108b1432d65Chris Wilson	mutex_unlock(&dev->struct_mutex);
132744834a67c0082e2cf74b16be91e49108b1432d65Chris Wilson
132844834a67c0082e2cf74b16be91e49108b1432d65Chris Wilson	return 0;
132944834a67c0082e2cf74b16be91e49108b1432d65Chris Wilson}
133044834a67c0082e2cf74b16be91e49108b1432d65Chris Wilson
133137811fcc9188f748407646e1157f3ed24ae181a4Chris Wilsonstatic int i915_gem_framebuffer_info(struct seq_file *m, void *data)
133237811fcc9188f748407646e1157f3ed24ae181a4Chris Wilson{
133337811fcc9188f748407646e1157f3ed24ae181a4Chris Wilson	struct drm_info_node *node = (struct drm_info_node *) m->private;
133437811fcc9188f748407646e1157f3ed24ae181a4Chris Wilson	struct drm_device *dev = node->minor->dev;
133537811fcc9188f748407646e1157f3ed24ae181a4Chris Wilson	drm_i915_private_t *dev_priv = dev->dev_private;
133637811fcc9188f748407646e1157f3ed24ae181a4Chris Wilson	struct intel_fbdev *ifbdev;
133737811fcc9188f748407646e1157f3ed24ae181a4Chris Wilson	struct intel_framebuffer *fb;
133837811fcc9188f748407646e1157f3ed24ae181a4Chris Wilson	int ret;
133937811fcc9188f748407646e1157f3ed24ae181a4Chris Wilson
134037811fcc9188f748407646e1157f3ed24ae181a4Chris Wilson	ret = mutex_lock_interruptible(&dev->mode_config.mutex);
134137811fcc9188f748407646e1157f3ed24ae181a4Chris Wilson	if (ret)
134237811fcc9188f748407646e1157f3ed24ae181a4Chris Wilson		return ret;
134337811fcc9188f748407646e1157f3ed24ae181a4Chris Wilson
134437811fcc9188f748407646e1157f3ed24ae181a4Chris Wilson	ifbdev = dev_priv->fbdev;
134537811fcc9188f748407646e1157f3ed24ae181a4Chris Wilson	fb = to_intel_framebuffer(ifbdev->helper.fb);
134637811fcc9188f748407646e1157f3ed24ae181a4Chris Wilson
134737811fcc9188f748407646e1157f3ed24ae181a4Chris Wilson	seq_printf(m, "fbcon size: %d x %d, depth %d, %d bpp, obj ",
134837811fcc9188f748407646e1157f3ed24ae181a4Chris Wilson		   fb->base.width,
134937811fcc9188f748407646e1157f3ed24ae181a4Chris Wilson		   fb->base.height,
135037811fcc9188f748407646e1157f3ed24ae181a4Chris Wilson		   fb->base.depth,
135137811fcc9188f748407646e1157f3ed24ae181a4Chris Wilson		   fb->base.bits_per_pixel);
135205394f3975dceb107a5e1393e2244946e5b43660Chris Wilson	describe_obj(m, fb->obj);
135337811fcc9188f748407646e1157f3ed24ae181a4Chris Wilson	seq_printf(m, "\n");
135437811fcc9188f748407646e1157f3ed24ae181a4Chris Wilson
135537811fcc9188f748407646e1157f3ed24ae181a4Chris Wilson	list_for_each_entry(fb, &dev->mode_config.fb_list, base.head) {
135637811fcc9188f748407646e1157f3ed24ae181a4Chris Wilson		if (&fb->base == ifbdev->helper.fb)
135737811fcc9188f748407646e1157f3ed24ae181a4Chris Wilson			continue;
135837811fcc9188f748407646e1157f3ed24ae181a4Chris Wilson
135937811fcc9188f748407646e1157f3ed24ae181a4Chris Wilson		seq_printf(m, "user size: %d x %d, depth %d, %d bpp, obj ",
136037811fcc9188f748407646e1157f3ed24ae181a4Chris Wilson			   fb->base.width,
136137811fcc9188f748407646e1157f3ed24ae181a4Chris Wilson			   fb->base.height,
136237811fcc9188f748407646e1157f3ed24ae181a4Chris Wilson			   fb->base.depth,
136337811fcc9188f748407646e1157f3ed24ae181a4Chris Wilson			   fb->base.bits_per_pixel);
136405394f3975dceb107a5e1393e2244946e5b43660Chris Wilson		describe_obj(m, fb->obj);
136537811fcc9188f748407646e1157f3ed24ae181a4Chris Wilson		seq_printf(m, "\n");
136637811fcc9188f748407646e1157f3ed24ae181a4Chris Wilson	}
136737811fcc9188f748407646e1157f3ed24ae181a4Chris Wilson
136837811fcc9188f748407646e1157f3ed24ae181a4Chris Wilson	mutex_unlock(&dev->mode_config.mutex);
136937811fcc9188f748407646e1157f3ed24ae181a4Chris Wilson
137037811fcc9188f748407646e1157f3ed24ae181a4Chris Wilson	return 0;
137137811fcc9188f748407646e1157f3ed24ae181a4Chris Wilson}
137237811fcc9188f748407646e1157f3ed24ae181a4Chris Wilson
1373e76d3630810b0ac5b07aa7ef28428c1bc2d10861Ben Widawskystatic int i915_context_status(struct seq_file *m, void *unused)
1374e76d3630810b0ac5b07aa7ef28428c1bc2d10861Ben Widawsky{
1375e76d3630810b0ac5b07aa7ef28428c1bc2d10861Ben Widawsky	struct drm_info_node *node = (struct drm_info_node *) m->private;
1376e76d3630810b0ac5b07aa7ef28428c1bc2d10861Ben Widawsky	struct drm_device *dev = node->minor->dev;
1377e76d3630810b0ac5b07aa7ef28428c1bc2d10861Ben Widawsky	drm_i915_private_t *dev_priv = dev->dev_private;
1378e76d3630810b0ac5b07aa7ef28428c1bc2d10861Ben Widawsky	int ret;
1379e76d3630810b0ac5b07aa7ef28428c1bc2d10861Ben Widawsky
1380e76d3630810b0ac5b07aa7ef28428c1bc2d10861Ben Widawsky	ret = mutex_lock_interruptible(&dev->mode_config.mutex);
1381e76d3630810b0ac5b07aa7ef28428c1bc2d10861Ben Widawsky	if (ret)
1382e76d3630810b0ac5b07aa7ef28428c1bc2d10861Ben Widawsky		return ret;
1383e76d3630810b0ac5b07aa7ef28428c1bc2d10861Ben Widawsky
1384dc501fbc4389f6c15a8da14684b5926e0d9553daBen Widawsky	if (dev_priv->pwrctx) {
1385dc501fbc4389f6c15a8da14684b5926e0d9553daBen Widawsky		seq_printf(m, "power context ");
1386dc501fbc4389f6c15a8da14684b5926e0d9553daBen Widawsky		describe_obj(m, dev_priv->pwrctx);
1387dc501fbc4389f6c15a8da14684b5926e0d9553daBen Widawsky		seq_printf(m, "\n");
1388dc501fbc4389f6c15a8da14684b5926e0d9553daBen Widawsky	}
1389e76d3630810b0ac5b07aa7ef28428c1bc2d10861Ben Widawsky
1390dc501fbc4389f6c15a8da14684b5926e0d9553daBen Widawsky	if (dev_priv->renderctx) {
1391dc501fbc4389f6c15a8da14684b5926e0d9553daBen Widawsky		seq_printf(m, "render context ");
1392dc501fbc4389f6c15a8da14684b5926e0d9553daBen Widawsky		describe_obj(m, dev_priv->renderctx);
1393dc501fbc4389f6c15a8da14684b5926e0d9553daBen Widawsky		seq_printf(m, "\n");
1394dc501fbc4389f6c15a8da14684b5926e0d9553daBen Widawsky	}
1395e76d3630810b0ac5b07aa7ef28428c1bc2d10861Ben Widawsky
1396e76d3630810b0ac5b07aa7ef28428c1bc2d10861Ben Widawsky	mutex_unlock(&dev->mode_config.mutex);
1397e76d3630810b0ac5b07aa7ef28428c1bc2d10861Ben Widawsky
1398e76d3630810b0ac5b07aa7ef28428c1bc2d10861Ben Widawsky	return 0;
1399e76d3630810b0ac5b07aa7ef28428c1bc2d10861Ben Widawsky}
1400e76d3630810b0ac5b07aa7ef28428c1bc2d10861Ben Widawsky
14016d794d4250284917fa394c550f054f5fd801f50fBen Widawskystatic int i915_gen6_forcewake_count_info(struct seq_file *m, void *data)
14026d794d4250284917fa394c550f054f5fd801f50fBen Widawsky{
14036d794d4250284917fa394c550f054f5fd801f50fBen Widawsky	struct drm_info_node *node = (struct drm_info_node *) m->private;
14046d794d4250284917fa394c550f054f5fd801f50fBen Widawsky	struct drm_device *dev = node->minor->dev;
14056d794d4250284917fa394c550f054f5fd801f50fBen Widawsky	struct drm_i915_private *dev_priv = dev->dev_private;
14069f1f46a45a681d357d1ceedecec3671a5ae957f4Daniel Vetter	unsigned forcewake_count;
14076d794d4250284917fa394c550f054f5fd801f50fBen Widawsky
14089f1f46a45a681d357d1ceedecec3671a5ae957f4Daniel Vetter	spin_lock_irq(&dev_priv->gt_lock);
14099f1f46a45a681d357d1ceedecec3671a5ae957f4Daniel Vetter	forcewake_count = dev_priv->forcewake_count;
14109f1f46a45a681d357d1ceedecec3671a5ae957f4Daniel Vetter	spin_unlock_irq(&dev_priv->gt_lock);
14119f1f46a45a681d357d1ceedecec3671a5ae957f4Daniel Vetter
14129f1f46a45a681d357d1ceedecec3671a5ae957f4Daniel Vetter	seq_printf(m, "forcewake count = %u\n", forcewake_count);
14136d794d4250284917fa394c550f054f5fd801f50fBen Widawsky
14146d794d4250284917fa394c550f054f5fd801f50fBen Widawsky	return 0;
14156d794d4250284917fa394c550f054f5fd801f50fBen Widawsky}
14166d794d4250284917fa394c550f054f5fd801f50fBen Widawsky
1417f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilsonstatic int
1418f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilsoni915_wedged_open(struct inode *inode,
1419f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson		 struct file *filp)
1420f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson{
1421f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson	filp->private_data = inode->i_private;
1422f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson	return 0;
1423f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson}
1424f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson
1425f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilsonstatic ssize_t
1426f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilsoni915_wedged_read(struct file *filp,
1427f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson		 char __user *ubuf,
1428f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson		 size_t max,
1429f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson		 loff_t *ppos)
1430f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson{
1431f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson	struct drm_device *dev = filp->private_data;
1432f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson	drm_i915_private_t *dev_priv = dev->dev_private;
1433f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson	char buf[80];
1434f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson	int len;
1435f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson
14360206e353a0416ad63ce07f53c807c2c725633b87Akshay Joshi	len = snprintf(buf, sizeof(buf),
1437f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson		       "wedged :  %d\n",
1438f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson		       atomic_read(&dev_priv->mm.wedged));
1439f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson
14400206e353a0416ad63ce07f53c807c2c725633b87Akshay Joshi	if (len > sizeof(buf))
14410206e353a0416ad63ce07f53c807c2c725633b87Akshay Joshi		len = sizeof(buf);
1442f4433a8d5d3076775bdd1a996a47db7beb468ac0Dan Carpenter
1443f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson	return simple_read_from_buffer(ubuf, max, ppos, buf, len);
1444f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson}
1445f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson
1446f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilsonstatic ssize_t
1447f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilsoni915_wedged_write(struct file *filp,
1448f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson		  const char __user *ubuf,
1449f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson		  size_t cnt,
1450f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson		  loff_t *ppos)
1451f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson{
1452f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson	struct drm_device *dev = filp->private_data;
1453f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson	char buf[20];
1454f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson	int val = 1;
1455f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson
1456f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson	if (cnt > 0) {
14570206e353a0416ad63ce07f53c807c2c725633b87Akshay Joshi		if (cnt > sizeof(buf) - 1)
1458f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson			return -EINVAL;
1459f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson
1460f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson		if (copy_from_user(buf, ubuf, cnt))
1461f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson			return -EFAULT;
1462f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson		buf[cnt] = 0;
1463f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson
1464f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson		val = simple_strtoul(buf, NULL, 0);
1465f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson	}
1466f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson
1467f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson	DRM_INFO("Manually setting wedged to %d\n", val);
1468527f9e907c39f7e88abb57eaa8bccb43c8706a3dChris Wilson	i915_handle_error(dev, val);
1469f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson
1470f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson	return cnt;
1471f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson}
1472f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson
1473f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilsonstatic const struct file_operations i915_wedged_fops = {
1474f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson	.owner = THIS_MODULE,
1475f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson	.open = i915_wedged_open,
1476f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson	.read = i915_wedged_read,
1477f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson	.write = i915_wedged_write,
14786038f373a3dc1f1c26496e60b6c40b164716f07eArnd Bergmann	.llseek = default_llseek,
1479f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson};
1480f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson
1481358733e9047cafcc185ca19b8c369c659ac0c4cfJesse Barnesstatic int
1482358733e9047cafcc185ca19b8c369c659ac0c4cfJesse Barnesi915_max_freq_open(struct inode *inode,
1483358733e9047cafcc185ca19b8c369c659ac0c4cfJesse Barnes		   struct file *filp)
1484358733e9047cafcc185ca19b8c369c659ac0c4cfJesse Barnes{
1485358733e9047cafcc185ca19b8c369c659ac0c4cfJesse Barnes	filp->private_data = inode->i_private;
1486358733e9047cafcc185ca19b8c369c659ac0c4cfJesse Barnes	return 0;
1487358733e9047cafcc185ca19b8c369c659ac0c4cfJesse Barnes}
1488358733e9047cafcc185ca19b8c369c659ac0c4cfJesse Barnes
1489358733e9047cafcc185ca19b8c369c659ac0c4cfJesse Barnesstatic ssize_t
1490358733e9047cafcc185ca19b8c369c659ac0c4cfJesse Barnesi915_max_freq_read(struct file *filp,
1491358733e9047cafcc185ca19b8c369c659ac0c4cfJesse Barnes		   char __user *ubuf,
1492358733e9047cafcc185ca19b8c369c659ac0c4cfJesse Barnes		   size_t max,
1493358733e9047cafcc185ca19b8c369c659ac0c4cfJesse Barnes		   loff_t *ppos)
1494358733e9047cafcc185ca19b8c369c659ac0c4cfJesse Barnes{
1495358733e9047cafcc185ca19b8c369c659ac0c4cfJesse Barnes	struct drm_device *dev = filp->private_data;
1496358733e9047cafcc185ca19b8c369c659ac0c4cfJesse Barnes	drm_i915_private_t *dev_priv = dev->dev_private;
1497358733e9047cafcc185ca19b8c369c659ac0c4cfJesse Barnes	char buf[80];
1498358733e9047cafcc185ca19b8c369c659ac0c4cfJesse Barnes	int len;
1499358733e9047cafcc185ca19b8c369c659ac0c4cfJesse Barnes
15000206e353a0416ad63ce07f53c807c2c725633b87Akshay Joshi	len = snprintf(buf, sizeof(buf),
1501358733e9047cafcc185ca19b8c369c659ac0c4cfJesse Barnes		       "max freq: %d\n", dev_priv->max_delay * 50);
1502358733e9047cafcc185ca19b8c369c659ac0c4cfJesse Barnes
15030206e353a0416ad63ce07f53c807c2c725633b87Akshay Joshi	if (len > sizeof(buf))
15040206e353a0416ad63ce07f53c807c2c725633b87Akshay Joshi		len = sizeof(buf);
1505358733e9047cafcc185ca19b8c369c659ac0c4cfJesse Barnes
1506358733e9047cafcc185ca19b8c369c659ac0c4cfJesse Barnes	return simple_read_from_buffer(ubuf, max, ppos, buf, len);
1507358733e9047cafcc185ca19b8c369c659ac0c4cfJesse Barnes}
1508358733e9047cafcc185ca19b8c369c659ac0c4cfJesse Barnes
1509358733e9047cafcc185ca19b8c369c659ac0c4cfJesse Barnesstatic ssize_t
1510358733e9047cafcc185ca19b8c369c659ac0c4cfJesse Barnesi915_max_freq_write(struct file *filp,
1511358733e9047cafcc185ca19b8c369c659ac0c4cfJesse Barnes		  const char __user *ubuf,
1512358733e9047cafcc185ca19b8c369c659ac0c4cfJesse Barnes		  size_t cnt,
1513358733e9047cafcc185ca19b8c369c659ac0c4cfJesse Barnes		  loff_t *ppos)
1514358733e9047cafcc185ca19b8c369c659ac0c4cfJesse Barnes{
1515358733e9047cafcc185ca19b8c369c659ac0c4cfJesse Barnes	struct drm_device *dev = filp->private_data;
1516358733e9047cafcc185ca19b8c369c659ac0c4cfJesse Barnes	struct drm_i915_private *dev_priv = dev->dev_private;
1517358733e9047cafcc185ca19b8c369c659ac0c4cfJesse Barnes	char buf[20];
1518358733e9047cafcc185ca19b8c369c659ac0c4cfJesse Barnes	int val = 1;
1519358733e9047cafcc185ca19b8c369c659ac0c4cfJesse Barnes
1520358733e9047cafcc185ca19b8c369c659ac0c4cfJesse Barnes	if (cnt > 0) {
15210206e353a0416ad63ce07f53c807c2c725633b87Akshay Joshi		if (cnt > sizeof(buf) - 1)
1522358733e9047cafcc185ca19b8c369c659ac0c4cfJesse Barnes			return -EINVAL;
1523358733e9047cafcc185ca19b8c369c659ac0c4cfJesse Barnes
1524358733e9047cafcc185ca19b8c369c659ac0c4cfJesse Barnes		if (copy_from_user(buf, ubuf, cnt))
1525358733e9047cafcc185ca19b8c369c659ac0c4cfJesse Barnes			return -EFAULT;
1526358733e9047cafcc185ca19b8c369c659ac0c4cfJesse Barnes		buf[cnt] = 0;
1527358733e9047cafcc185ca19b8c369c659ac0c4cfJesse Barnes
1528358733e9047cafcc185ca19b8c369c659ac0c4cfJesse Barnes		val = simple_strtoul(buf, NULL, 0);
1529358733e9047cafcc185ca19b8c369c659ac0c4cfJesse Barnes	}
1530358733e9047cafcc185ca19b8c369c659ac0c4cfJesse Barnes
1531358733e9047cafcc185ca19b8c369c659ac0c4cfJesse Barnes	DRM_DEBUG_DRIVER("Manually setting max freq to %d\n", val);
1532358733e9047cafcc185ca19b8c369c659ac0c4cfJesse Barnes
1533358733e9047cafcc185ca19b8c369c659ac0c4cfJesse Barnes	/*
1534358733e9047cafcc185ca19b8c369c659ac0c4cfJesse Barnes	 * Turbo will still be enabled, but won't go above the set value.
1535358733e9047cafcc185ca19b8c369c659ac0c4cfJesse Barnes	 */
1536358733e9047cafcc185ca19b8c369c659ac0c4cfJesse Barnes	dev_priv->max_delay = val / 50;
1537358733e9047cafcc185ca19b8c369c659ac0c4cfJesse Barnes
1538358733e9047cafcc185ca19b8c369c659ac0c4cfJesse Barnes	gen6_set_rps(dev, val / 50);
1539358733e9047cafcc185ca19b8c369c659ac0c4cfJesse Barnes
1540358733e9047cafcc185ca19b8c369c659ac0c4cfJesse Barnes	return cnt;
1541358733e9047cafcc185ca19b8c369c659ac0c4cfJesse Barnes}
1542358733e9047cafcc185ca19b8c369c659ac0c4cfJesse Barnes
1543358733e9047cafcc185ca19b8c369c659ac0c4cfJesse Barnesstatic const struct file_operations i915_max_freq_fops = {
1544358733e9047cafcc185ca19b8c369c659ac0c4cfJesse Barnes	.owner = THIS_MODULE,
1545358733e9047cafcc185ca19b8c369c659ac0c4cfJesse Barnes	.open = i915_max_freq_open,
1546358733e9047cafcc185ca19b8c369c659ac0c4cfJesse Barnes	.read = i915_max_freq_read,
1547358733e9047cafcc185ca19b8c369c659ac0c4cfJesse Barnes	.write = i915_max_freq_write,
1548358733e9047cafcc185ca19b8c369c659ac0c4cfJesse Barnes	.llseek = default_llseek,
1549358733e9047cafcc185ca19b8c369c659ac0c4cfJesse Barnes};
1550358733e9047cafcc185ca19b8c369c659ac0c4cfJesse Barnes
155107b7ddd9b7f17a567e3ac2b33a4dffcb2a4524e0Jesse Barnesstatic int
155207b7ddd9b7f17a567e3ac2b33a4dffcb2a4524e0Jesse Barnesi915_cache_sharing_open(struct inode *inode,
155307b7ddd9b7f17a567e3ac2b33a4dffcb2a4524e0Jesse Barnes		   struct file *filp)
155407b7ddd9b7f17a567e3ac2b33a4dffcb2a4524e0Jesse Barnes{
155507b7ddd9b7f17a567e3ac2b33a4dffcb2a4524e0Jesse Barnes	filp->private_data = inode->i_private;
155607b7ddd9b7f17a567e3ac2b33a4dffcb2a4524e0Jesse Barnes	return 0;
155707b7ddd9b7f17a567e3ac2b33a4dffcb2a4524e0Jesse Barnes}
155807b7ddd9b7f17a567e3ac2b33a4dffcb2a4524e0Jesse Barnes
155907b7ddd9b7f17a567e3ac2b33a4dffcb2a4524e0Jesse Barnesstatic ssize_t
156007b7ddd9b7f17a567e3ac2b33a4dffcb2a4524e0Jesse Barnesi915_cache_sharing_read(struct file *filp,
156107b7ddd9b7f17a567e3ac2b33a4dffcb2a4524e0Jesse Barnes		   char __user *ubuf,
156207b7ddd9b7f17a567e3ac2b33a4dffcb2a4524e0Jesse Barnes		   size_t max,
156307b7ddd9b7f17a567e3ac2b33a4dffcb2a4524e0Jesse Barnes		   loff_t *ppos)
156407b7ddd9b7f17a567e3ac2b33a4dffcb2a4524e0Jesse Barnes{
156507b7ddd9b7f17a567e3ac2b33a4dffcb2a4524e0Jesse Barnes	struct drm_device *dev = filp->private_data;
156607b7ddd9b7f17a567e3ac2b33a4dffcb2a4524e0Jesse Barnes	drm_i915_private_t *dev_priv = dev->dev_private;
156707b7ddd9b7f17a567e3ac2b33a4dffcb2a4524e0Jesse Barnes	char buf[80];
156807b7ddd9b7f17a567e3ac2b33a4dffcb2a4524e0Jesse Barnes	u32 snpcr;
156907b7ddd9b7f17a567e3ac2b33a4dffcb2a4524e0Jesse Barnes	int len;
157007b7ddd9b7f17a567e3ac2b33a4dffcb2a4524e0Jesse Barnes
157107b7ddd9b7f17a567e3ac2b33a4dffcb2a4524e0Jesse Barnes	mutex_lock(&dev_priv->dev->struct_mutex);
157207b7ddd9b7f17a567e3ac2b33a4dffcb2a4524e0Jesse Barnes	snpcr = I915_READ(GEN6_MBCUNIT_SNPCR);
157307b7ddd9b7f17a567e3ac2b33a4dffcb2a4524e0Jesse Barnes	mutex_unlock(&dev_priv->dev->struct_mutex);
157407b7ddd9b7f17a567e3ac2b33a4dffcb2a4524e0Jesse Barnes
15750206e353a0416ad63ce07f53c807c2c725633b87Akshay Joshi	len = snprintf(buf, sizeof(buf),
157607b7ddd9b7f17a567e3ac2b33a4dffcb2a4524e0Jesse Barnes		       "%d\n", (snpcr & GEN6_MBC_SNPCR_MASK) >>
157707b7ddd9b7f17a567e3ac2b33a4dffcb2a4524e0Jesse Barnes		       GEN6_MBC_SNPCR_SHIFT);
157807b7ddd9b7f17a567e3ac2b33a4dffcb2a4524e0Jesse Barnes
15790206e353a0416ad63ce07f53c807c2c725633b87Akshay Joshi	if (len > sizeof(buf))
15800206e353a0416ad63ce07f53c807c2c725633b87Akshay Joshi		len = sizeof(buf);
158107b7ddd9b7f17a567e3ac2b33a4dffcb2a4524e0Jesse Barnes
158207b7ddd9b7f17a567e3ac2b33a4dffcb2a4524e0Jesse Barnes	return simple_read_from_buffer(ubuf, max, ppos, buf, len);
158307b7ddd9b7f17a567e3ac2b33a4dffcb2a4524e0Jesse Barnes}
158407b7ddd9b7f17a567e3ac2b33a4dffcb2a4524e0Jesse Barnes
158507b7ddd9b7f17a567e3ac2b33a4dffcb2a4524e0Jesse Barnesstatic ssize_t
158607b7ddd9b7f17a567e3ac2b33a4dffcb2a4524e0Jesse Barnesi915_cache_sharing_write(struct file *filp,
158707b7ddd9b7f17a567e3ac2b33a4dffcb2a4524e0Jesse Barnes		  const char __user *ubuf,
158807b7ddd9b7f17a567e3ac2b33a4dffcb2a4524e0Jesse Barnes		  size_t cnt,
158907b7ddd9b7f17a567e3ac2b33a4dffcb2a4524e0Jesse Barnes		  loff_t *ppos)
159007b7ddd9b7f17a567e3ac2b33a4dffcb2a4524e0Jesse Barnes{
159107b7ddd9b7f17a567e3ac2b33a4dffcb2a4524e0Jesse Barnes	struct drm_device *dev = filp->private_data;
159207b7ddd9b7f17a567e3ac2b33a4dffcb2a4524e0Jesse Barnes	struct drm_i915_private *dev_priv = dev->dev_private;
159307b7ddd9b7f17a567e3ac2b33a4dffcb2a4524e0Jesse Barnes	char buf[20];
159407b7ddd9b7f17a567e3ac2b33a4dffcb2a4524e0Jesse Barnes	u32 snpcr;
159507b7ddd9b7f17a567e3ac2b33a4dffcb2a4524e0Jesse Barnes	int val = 1;
159607b7ddd9b7f17a567e3ac2b33a4dffcb2a4524e0Jesse Barnes
159707b7ddd9b7f17a567e3ac2b33a4dffcb2a4524e0Jesse Barnes	if (cnt > 0) {
15980206e353a0416ad63ce07f53c807c2c725633b87Akshay Joshi		if (cnt > sizeof(buf) - 1)
159907b7ddd9b7f17a567e3ac2b33a4dffcb2a4524e0Jesse Barnes			return -EINVAL;
160007b7ddd9b7f17a567e3ac2b33a4dffcb2a4524e0Jesse Barnes
160107b7ddd9b7f17a567e3ac2b33a4dffcb2a4524e0Jesse Barnes		if (copy_from_user(buf, ubuf, cnt))
160207b7ddd9b7f17a567e3ac2b33a4dffcb2a4524e0Jesse Barnes			return -EFAULT;
160307b7ddd9b7f17a567e3ac2b33a4dffcb2a4524e0Jesse Barnes		buf[cnt] = 0;
160407b7ddd9b7f17a567e3ac2b33a4dffcb2a4524e0Jesse Barnes
160507b7ddd9b7f17a567e3ac2b33a4dffcb2a4524e0Jesse Barnes		val = simple_strtoul(buf, NULL, 0);
160607b7ddd9b7f17a567e3ac2b33a4dffcb2a4524e0Jesse Barnes	}
160707b7ddd9b7f17a567e3ac2b33a4dffcb2a4524e0Jesse Barnes
160807b7ddd9b7f17a567e3ac2b33a4dffcb2a4524e0Jesse Barnes	if (val < 0 || val > 3)
160907b7ddd9b7f17a567e3ac2b33a4dffcb2a4524e0Jesse Barnes		return -EINVAL;
161007b7ddd9b7f17a567e3ac2b33a4dffcb2a4524e0Jesse Barnes
161107b7ddd9b7f17a567e3ac2b33a4dffcb2a4524e0Jesse Barnes	DRM_DEBUG_DRIVER("Manually setting uncore sharing to %d\n", val);
161207b7ddd9b7f17a567e3ac2b33a4dffcb2a4524e0Jesse Barnes
161307b7ddd9b7f17a567e3ac2b33a4dffcb2a4524e0Jesse Barnes	/* Update the cache sharing policy here as well */
161407b7ddd9b7f17a567e3ac2b33a4dffcb2a4524e0Jesse Barnes	snpcr = I915_READ(GEN6_MBCUNIT_SNPCR);
161507b7ddd9b7f17a567e3ac2b33a4dffcb2a4524e0Jesse Barnes	snpcr &= ~GEN6_MBC_SNPCR_MASK;
161607b7ddd9b7f17a567e3ac2b33a4dffcb2a4524e0Jesse Barnes	snpcr |= (val << GEN6_MBC_SNPCR_SHIFT);
161707b7ddd9b7f17a567e3ac2b33a4dffcb2a4524e0Jesse Barnes	I915_WRITE(GEN6_MBCUNIT_SNPCR, snpcr);
161807b7ddd9b7f17a567e3ac2b33a4dffcb2a4524e0Jesse Barnes
161907b7ddd9b7f17a567e3ac2b33a4dffcb2a4524e0Jesse Barnes	return cnt;
162007b7ddd9b7f17a567e3ac2b33a4dffcb2a4524e0Jesse Barnes}
162107b7ddd9b7f17a567e3ac2b33a4dffcb2a4524e0Jesse Barnes
162207b7ddd9b7f17a567e3ac2b33a4dffcb2a4524e0Jesse Barnesstatic const struct file_operations i915_cache_sharing_fops = {
162307b7ddd9b7f17a567e3ac2b33a4dffcb2a4524e0Jesse Barnes	.owner = THIS_MODULE,
162407b7ddd9b7f17a567e3ac2b33a4dffcb2a4524e0Jesse Barnes	.open = i915_cache_sharing_open,
162507b7ddd9b7f17a567e3ac2b33a4dffcb2a4524e0Jesse Barnes	.read = i915_cache_sharing_read,
162607b7ddd9b7f17a567e3ac2b33a4dffcb2a4524e0Jesse Barnes	.write = i915_cache_sharing_write,
162707b7ddd9b7f17a567e3ac2b33a4dffcb2a4524e0Jesse Barnes	.llseek = default_llseek,
162807b7ddd9b7f17a567e3ac2b33a4dffcb2a4524e0Jesse Barnes};
162907b7ddd9b7f17a567e3ac2b33a4dffcb2a4524e0Jesse Barnes
1630f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson/* As the drm_debugfs_init() routines are called before dev->dev_private is
1631f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson * allocated we need to hook into the minor for release. */
1632f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilsonstatic int
1633f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilsondrm_add_fake_info_node(struct drm_minor *minor,
1634f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson		       struct dentry *ent,
1635f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson		       const void *key)
1636f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson{
1637f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson	struct drm_info_node *node;
1638f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson
1639f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson	node = kmalloc(sizeof(struct drm_info_node), GFP_KERNEL);
1640f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson	if (node == NULL) {
1641f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson		debugfs_remove(ent);
1642f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson		return -ENOMEM;
1643f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson	}
1644f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson
1645f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson	node->minor = minor;
1646f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson	node->dent = ent;
1647f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson	node->info_ent = (void *) key;
1648b3e067c0b276197b59046d7095b01b99f98b2821Marcin Slusarz
1649b3e067c0b276197b59046d7095b01b99f98b2821Marcin Slusarz	mutex_lock(&minor->debugfs_lock);
1650b3e067c0b276197b59046d7095b01b99f98b2821Marcin Slusarz	list_add(&node->list, &minor->debugfs_list);
1651b3e067c0b276197b59046d7095b01b99f98b2821Marcin Slusarz	mutex_unlock(&minor->debugfs_lock);
1652f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson
1653f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson	return 0;
1654f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson}
1655f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson
1656f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilsonstatic int i915_wedged_create(struct dentry *root, struct drm_minor *minor)
1657f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson{
1658f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson	struct drm_device *dev = minor->dev;
1659f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson	struct dentry *ent;
1660f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson
1661f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson	ent = debugfs_create_file("i915_wedged",
1662f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson				  S_IRUGO | S_IWUSR,
1663f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson				  root, dev,
1664f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson				  &i915_wedged_fops);
1665f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson	if (IS_ERR(ent))
1666f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson		return PTR_ERR(ent);
1667f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson
1668f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson	return drm_add_fake_info_node(minor, ent, &i915_wedged_fops);
1669f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson}
16709e3a6d155ed0a7636b926a798dd7221ea107b274Ben Gamari
16716d794d4250284917fa394c550f054f5fd801f50fBen Widawskystatic int i915_forcewake_open(struct inode *inode, struct file *file)
16726d794d4250284917fa394c550f054f5fd801f50fBen Widawsky{
16736d794d4250284917fa394c550f054f5fd801f50fBen Widawsky	struct drm_device *dev = inode->i_private;
16746d794d4250284917fa394c550f054f5fd801f50fBen Widawsky	struct drm_i915_private *dev_priv = dev->dev_private;
16756d794d4250284917fa394c550f054f5fd801f50fBen Widawsky	int ret;
16766d794d4250284917fa394c550f054f5fd801f50fBen Widawsky
1677075edca43b819c33bd755eaf7a3bd0e1b3279f70Daniel Vetter	if (INTEL_INFO(dev)->gen < 6)
16786d794d4250284917fa394c550f054f5fd801f50fBen Widawsky		return 0;
16796d794d4250284917fa394c550f054f5fd801f50fBen Widawsky
16806d794d4250284917fa394c550f054f5fd801f50fBen Widawsky	ret = mutex_lock_interruptible(&dev->struct_mutex);
16816d794d4250284917fa394c550f054f5fd801f50fBen Widawsky	if (ret)
16826d794d4250284917fa394c550f054f5fd801f50fBen Widawsky		return ret;
16836d794d4250284917fa394c550f054f5fd801f50fBen Widawsky	gen6_gt_force_wake_get(dev_priv);
16846d794d4250284917fa394c550f054f5fd801f50fBen Widawsky	mutex_unlock(&dev->struct_mutex);
16856d794d4250284917fa394c550f054f5fd801f50fBen Widawsky
16866d794d4250284917fa394c550f054f5fd801f50fBen Widawsky	return 0;
16876d794d4250284917fa394c550f054f5fd801f50fBen Widawsky}
16886d794d4250284917fa394c550f054f5fd801f50fBen Widawsky
16896d794d4250284917fa394c550f054f5fd801f50fBen Widawskyint i915_forcewake_release(struct inode *inode, struct file *file)
16906d794d4250284917fa394c550f054f5fd801f50fBen Widawsky{
16916d794d4250284917fa394c550f054f5fd801f50fBen Widawsky	struct drm_device *dev = inode->i_private;
16926d794d4250284917fa394c550f054f5fd801f50fBen Widawsky	struct drm_i915_private *dev_priv = dev->dev_private;
16936d794d4250284917fa394c550f054f5fd801f50fBen Widawsky
1694075edca43b819c33bd755eaf7a3bd0e1b3279f70Daniel Vetter	if (INTEL_INFO(dev)->gen < 6)
16956d794d4250284917fa394c550f054f5fd801f50fBen Widawsky		return 0;
16966d794d4250284917fa394c550f054f5fd801f50fBen Widawsky
16976d794d4250284917fa394c550f054f5fd801f50fBen Widawsky	/*
16986d794d4250284917fa394c550f054f5fd801f50fBen Widawsky	 * It's bad that we can potentially hang userspace if struct_mutex gets
16996d794d4250284917fa394c550f054f5fd801f50fBen Widawsky	 * forever stuck.  However, if we cannot acquire this lock it means that
17006d794d4250284917fa394c550f054f5fd801f50fBen Widawsky	 * almost certainly the driver has hung, is not unload-able. Therefore
17016d794d4250284917fa394c550f054f5fd801f50fBen Widawsky	 * hanging here is probably a minor inconvenience not to be seen my
17026d794d4250284917fa394c550f054f5fd801f50fBen Widawsky	 * almost every user.
17036d794d4250284917fa394c550f054f5fd801f50fBen Widawsky	 */
17046d794d4250284917fa394c550f054f5fd801f50fBen Widawsky	mutex_lock(&dev->struct_mutex);
17056d794d4250284917fa394c550f054f5fd801f50fBen Widawsky	gen6_gt_force_wake_put(dev_priv);
17066d794d4250284917fa394c550f054f5fd801f50fBen Widawsky	mutex_unlock(&dev->struct_mutex);
17076d794d4250284917fa394c550f054f5fd801f50fBen Widawsky
17086d794d4250284917fa394c550f054f5fd801f50fBen Widawsky	return 0;
17096d794d4250284917fa394c550f054f5fd801f50fBen Widawsky}
17106d794d4250284917fa394c550f054f5fd801f50fBen Widawsky
17116d794d4250284917fa394c550f054f5fd801f50fBen Widawskystatic const struct file_operations i915_forcewake_fops = {
17126d794d4250284917fa394c550f054f5fd801f50fBen Widawsky	.owner = THIS_MODULE,
17136d794d4250284917fa394c550f054f5fd801f50fBen Widawsky	.open = i915_forcewake_open,
17146d794d4250284917fa394c550f054f5fd801f50fBen Widawsky	.release = i915_forcewake_release,
17156d794d4250284917fa394c550f054f5fd801f50fBen Widawsky};
17166d794d4250284917fa394c550f054f5fd801f50fBen Widawsky
17176d794d4250284917fa394c550f054f5fd801f50fBen Widawskystatic int i915_forcewake_create(struct dentry *root, struct drm_minor *minor)
17186d794d4250284917fa394c550f054f5fd801f50fBen Widawsky{
17196d794d4250284917fa394c550f054f5fd801f50fBen Widawsky	struct drm_device *dev = minor->dev;
17206d794d4250284917fa394c550f054f5fd801f50fBen Widawsky	struct dentry *ent;
17216d794d4250284917fa394c550f054f5fd801f50fBen Widawsky
17226d794d4250284917fa394c550f054f5fd801f50fBen Widawsky	ent = debugfs_create_file("i915_forcewake_user",
17238eb572942ca02890f590d9251233038e27dd3842Ben Widawsky				  S_IRUSR,
17246d794d4250284917fa394c550f054f5fd801f50fBen Widawsky				  root, dev,
17256d794d4250284917fa394c550f054f5fd801f50fBen Widawsky				  &i915_forcewake_fops);
17266d794d4250284917fa394c550f054f5fd801f50fBen Widawsky	if (IS_ERR(ent))
17276d794d4250284917fa394c550f054f5fd801f50fBen Widawsky		return PTR_ERR(ent);
17286d794d4250284917fa394c550f054f5fd801f50fBen Widawsky
17298eb572942ca02890f590d9251233038e27dd3842Ben Widawsky	return drm_add_fake_info_node(minor, ent, &i915_forcewake_fops);
17306d794d4250284917fa394c550f054f5fd801f50fBen Widawsky}
17316d794d4250284917fa394c550f054f5fd801f50fBen Widawsky
1732358733e9047cafcc185ca19b8c369c659ac0c4cfJesse Barnesstatic int i915_max_freq_create(struct dentry *root, struct drm_minor *minor)
1733358733e9047cafcc185ca19b8c369c659ac0c4cfJesse Barnes{
1734358733e9047cafcc185ca19b8c369c659ac0c4cfJesse Barnes	struct drm_device *dev = minor->dev;
1735358733e9047cafcc185ca19b8c369c659ac0c4cfJesse Barnes	struct dentry *ent;
1736358733e9047cafcc185ca19b8c369c659ac0c4cfJesse Barnes
1737358733e9047cafcc185ca19b8c369c659ac0c4cfJesse Barnes	ent = debugfs_create_file("i915_max_freq",
1738358733e9047cafcc185ca19b8c369c659ac0c4cfJesse Barnes				  S_IRUGO | S_IWUSR,
1739358733e9047cafcc185ca19b8c369c659ac0c4cfJesse Barnes				  root, dev,
1740358733e9047cafcc185ca19b8c369c659ac0c4cfJesse Barnes				  &i915_max_freq_fops);
1741358733e9047cafcc185ca19b8c369c659ac0c4cfJesse Barnes	if (IS_ERR(ent))
1742358733e9047cafcc185ca19b8c369c659ac0c4cfJesse Barnes		return PTR_ERR(ent);
1743358733e9047cafcc185ca19b8c369c659ac0c4cfJesse Barnes
1744358733e9047cafcc185ca19b8c369c659ac0c4cfJesse Barnes	return drm_add_fake_info_node(minor, ent, &i915_max_freq_fops);
1745358733e9047cafcc185ca19b8c369c659ac0c4cfJesse Barnes}
1746358733e9047cafcc185ca19b8c369c659ac0c4cfJesse Barnes
174707b7ddd9b7f17a567e3ac2b33a4dffcb2a4524e0Jesse Barnesstatic int i915_cache_sharing_create(struct dentry *root, struct drm_minor *minor)
174807b7ddd9b7f17a567e3ac2b33a4dffcb2a4524e0Jesse Barnes{
174907b7ddd9b7f17a567e3ac2b33a4dffcb2a4524e0Jesse Barnes	struct drm_device *dev = minor->dev;
175007b7ddd9b7f17a567e3ac2b33a4dffcb2a4524e0Jesse Barnes	struct dentry *ent;
175107b7ddd9b7f17a567e3ac2b33a4dffcb2a4524e0Jesse Barnes
175207b7ddd9b7f17a567e3ac2b33a4dffcb2a4524e0Jesse Barnes	ent = debugfs_create_file("i915_cache_sharing",
175307b7ddd9b7f17a567e3ac2b33a4dffcb2a4524e0Jesse Barnes				  S_IRUGO | S_IWUSR,
175407b7ddd9b7f17a567e3ac2b33a4dffcb2a4524e0Jesse Barnes				  root, dev,
175507b7ddd9b7f17a567e3ac2b33a4dffcb2a4524e0Jesse Barnes				  &i915_cache_sharing_fops);
175607b7ddd9b7f17a567e3ac2b33a4dffcb2a4524e0Jesse Barnes	if (IS_ERR(ent))
175707b7ddd9b7f17a567e3ac2b33a4dffcb2a4524e0Jesse Barnes		return PTR_ERR(ent);
175807b7ddd9b7f17a567e3ac2b33a4dffcb2a4524e0Jesse Barnes
175907b7ddd9b7f17a567e3ac2b33a4dffcb2a4524e0Jesse Barnes	return drm_add_fake_info_node(minor, ent, &i915_cache_sharing_fops);
176007b7ddd9b7f17a567e3ac2b33a4dffcb2a4524e0Jesse Barnes}
176107b7ddd9b7f17a567e3ac2b33a4dffcb2a4524e0Jesse Barnes
176227c202ad7f141d4efa9c64e30bf4a4d3bcd799aeBen Gamaristatic struct drm_info_list i915_debugfs_list[] = {
1763311bd68e024f9006db66cbadc3bd9f62fd663f4bChris Wilson	{"i915_capabilities", i915_capabilities, 0},
176473aa808f10effc280e6eb70267314542a7c29426Chris Wilson	{"i915_gem_objects", i915_gem_object_info, 0},
176508c18323547ce6d70eab3b37eca894baf114ad85Chris Wilson	{"i915_gem_gtt", i915_gem_gtt_info, 0},
1766433e12f78b68a8069f54956edf766bb21394c197Ben Gamari	{"i915_gem_active", i915_gem_object_list_info, 0, (void *) ACTIVE_LIST},
1767433e12f78b68a8069f54956edf766bb21394c197Ben Gamari	{"i915_gem_flushing", i915_gem_object_list_info, 0, (void *) FLUSHING_LIST},
1768433e12f78b68a8069f54956edf766bb21394c197Ben Gamari	{"i915_gem_inactive", i915_gem_object_list_info, 0, (void *) INACTIVE_LIST},
1769f13d3f7311add99d1f874a6b67d56426afa35664Chris Wilson	{"i915_gem_pinned", i915_gem_object_list_info, 0, (void *) PINNED_LIST},
1770d21d5975686fbc107f9352006b06e1e92b4c5810Chris Wilson	{"i915_gem_deferred_free", i915_gem_object_list_info, 0, (void *) DEFERRED_FREE_LIST},
17714e5359cd053bfb7d8dabe4a63624a5726848ffbcSimon Farnsworth	{"i915_gem_pageflip", i915_gem_pageflip_info, 0},
17722017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari	{"i915_gem_request", i915_gem_request_info, 0},
17732017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari	{"i915_gem_seqno", i915_gem_seqno_info, 0},
1774a6172a80ecb7ac64151960de1f709f78b509c57cChris Wilson	{"i915_gem_fence_regs", i915_gem_fence_regs_info, 0},
17752017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari	{"i915_gem_interrupt", i915_interrupt_info, 0},
17761ec14ad3132702694f2e1a90b30641cf111183b9Chris Wilson	{"i915_gem_hws", i915_hws_info, 0, (void *)RCS},
17771ec14ad3132702694f2e1a90b30641cf111183b9Chris Wilson	{"i915_gem_hws_blt", i915_hws_info, 0, (void *)BCS},
17781ec14ad3132702694f2e1a90b30641cf111183b9Chris Wilson	{"i915_gem_hws_bsd", i915_hws_info, 0, (void *)VCS},
17791ec14ad3132702694f2e1a90b30641cf111183b9Chris Wilson	{"i915_ringbuffer_data", i915_ringbuffer_data, 0, (void *)RCS},
17801ec14ad3132702694f2e1a90b30641cf111183b9Chris Wilson	{"i915_ringbuffer_info", i915_ringbuffer_info, 0, (void *)RCS},
17811ec14ad3132702694f2e1a90b30641cf111183b9Chris Wilson	{"i915_bsd_ringbuffer_data", i915_ringbuffer_data, 0, (void *)VCS},
17821ec14ad3132702694f2e1a90b30641cf111183b9Chris Wilson	{"i915_bsd_ringbuffer_info", i915_ringbuffer_info, 0, (void *)VCS},
17831ec14ad3132702694f2e1a90b30641cf111183b9Chris Wilson	{"i915_blt_ringbuffer_data", i915_ringbuffer_data, 0, (void *)BCS},
17841ec14ad3132702694f2e1a90b30641cf111183b9Chris Wilson	{"i915_blt_ringbuffer_info", i915_ringbuffer_info, 0, (void *)BCS},
17856911a9b8ae8b2a1dab4dfda9c2bd20f7ca2961d6Ben Gamari	{"i915_batchbuffers", i915_batchbuffer_info, 0},
178663eeaf38251183ec2b1caee11e4a2c040cb5ce6cJesse Barnes	{"i915_error_state", i915_error_state, 0},
1787f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes	{"i915_rstdby_delays", i915_rstdby_delays, 0},
1788f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes	{"i915_cur_delayinfo", i915_cur_delayinfo, 0},
1789f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes	{"i915_delayfreq_table", i915_delayfreq_table, 0},
1790f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes	{"i915_inttoext_table", i915_inttoext_table, 0},
1791f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes	{"i915_drpc_info", i915_drpc_info, 0},
17927648fa99eb77a2e1a90b7beaa420e07d819b9c11Jesse Barnes	{"i915_emon_status", i915_emon_status, 0},
179323b2f8bb92feb83127679c53633def32d3108e70Jesse Barnes	{"i915_ring_freq_table", i915_ring_freq_table, 0},
17947648fa99eb77a2e1a90b7beaa420e07d819b9c11Jesse Barnes	{"i915_gfxec", i915_gfxec, 0},
1795b5e50c3f56ee4aa0d0168eab5ece413ac5df76aaJesse Barnes	{"i915_fbc_status", i915_fbc_status, 0},
17964a9bef37e5cf2c73b61ecc9ead52cad2eb4a372bJesse Barnes	{"i915_sr_status", i915_sr_status, 0},
179744834a67c0082e2cf74b16be91e49108b1432d65Chris Wilson	{"i915_opregion", i915_opregion, 0},
179837811fcc9188f748407646e1157f3ed24ae181a4Chris Wilson	{"i915_gem_framebuffer", i915_gem_framebuffer_info, 0},
1799e76d3630810b0ac5b07aa7ef28428c1bc2d10861Ben Widawsky	{"i915_context_status", i915_context_status, 0},
18006d794d4250284917fa394c550f054f5fd801f50fBen Widawsky	{"i915_gen6_forcewake_count", i915_gen6_forcewake_count_info, 0},
18012017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari};
180227c202ad7f141d4efa9c64e30bf4a4d3bcd799aeBen Gamari#define I915_DEBUGFS_ENTRIES ARRAY_SIZE(i915_debugfs_list)
18032017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari
180427c202ad7f141d4efa9c64e30bf4a4d3bcd799aeBen Gamariint i915_debugfs_init(struct drm_minor *minor)
18052017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari{
1806f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson	int ret;
1807f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson
1808f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson	ret = i915_wedged_create(minor->debugfs_root, minor);
1809f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson	if (ret)
1810f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson		return ret;
1811f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson
18126d794d4250284917fa394c550f054f5fd801f50fBen Widawsky	ret = i915_forcewake_create(minor->debugfs_root, minor);
18136d794d4250284917fa394c550f054f5fd801f50fBen Widawsky	if (ret)
18146d794d4250284917fa394c550f054f5fd801f50fBen Widawsky		return ret;
1815358733e9047cafcc185ca19b8c369c659ac0c4cfJesse Barnes	ret = i915_max_freq_create(minor->debugfs_root, minor);
1816358733e9047cafcc185ca19b8c369c659ac0c4cfJesse Barnes	if (ret)
1817358733e9047cafcc185ca19b8c369c659ac0c4cfJesse Barnes		return ret;
181807b7ddd9b7f17a567e3ac2b33a4dffcb2a4524e0Jesse Barnes	ret = i915_cache_sharing_create(minor->debugfs_root, minor);
181907b7ddd9b7f17a567e3ac2b33a4dffcb2a4524e0Jesse Barnes	if (ret)
182007b7ddd9b7f17a567e3ac2b33a4dffcb2a4524e0Jesse Barnes		return ret;
18216d794d4250284917fa394c550f054f5fd801f50fBen Widawsky
182227c202ad7f141d4efa9c64e30bf4a4d3bcd799aeBen Gamari	return drm_debugfs_create_files(i915_debugfs_list,
182327c202ad7f141d4efa9c64e30bf4a4d3bcd799aeBen Gamari					I915_DEBUGFS_ENTRIES,
18242017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari					minor->debugfs_root, minor);
18252017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari}
18262017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari
182727c202ad7f141d4efa9c64e30bf4a4d3bcd799aeBen Gamarivoid i915_debugfs_cleanup(struct drm_minor *minor)
18282017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari{
182927c202ad7f141d4efa9c64e30bf4a4d3bcd799aeBen Gamari	drm_debugfs_remove_files(i915_debugfs_list,
183027c202ad7f141d4efa9c64e30bf4a4d3bcd799aeBen Gamari				 I915_DEBUGFS_ENTRIES, minor);
18316d794d4250284917fa394c550f054f5fd801f50fBen Widawsky	drm_debugfs_remove_files((struct drm_info_list *) &i915_forcewake_fops,
18326d794d4250284917fa394c550f054f5fd801f50fBen Widawsky				 1, minor);
183333db679b4ee94e5a55abb439a87905d76739095aKristian Høgsberg	drm_debugfs_remove_files((struct drm_info_list *) &i915_wedged_fops,
183433db679b4ee94e5a55abb439a87905d76739095aKristian Høgsberg				 1, minor);
1835358733e9047cafcc185ca19b8c369c659ac0c4cfJesse Barnes	drm_debugfs_remove_files((struct drm_info_list *) &i915_max_freq_fops,
1836358733e9047cafcc185ca19b8c369c659ac0c4cfJesse Barnes				 1, minor);
183707b7ddd9b7f17a567e3ac2b33a4dffcb2a4524e0Jesse Barnes	drm_debugfs_remove_files((struct drm_info_list *) &i915_cache_sharing_fops,
183807b7ddd9b7f17a567e3ac2b33a4dffcb2a4524e0Jesse Barnes				 1, minor);
18392017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari}
18402017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari
18412017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari#endif /* CONFIG_DEBUG_FS */
1842