i915_debugfs.c revision c724e8a9407683a8a2ee8eb00b972badf237bbe1
12017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari/* 22017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari * Copyright © 2008 Intel Corporation 32017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari * 42017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari * Permission is hereby granted, free of charge, to any person obtaining a 52017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari * copy of this software and associated documentation files (the "Software"), 62017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari * to deal in the Software without restriction, including without limitation 72017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari * the rights to use, copy, modify, merge, publish, distribute, sublicense, 82017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari * and/or sell copies of the Software, and to permit persons to whom the 92017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari * Software is furnished to do so, subject to the following conditions: 102017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari * 112017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari * The above copyright notice and this permission notice (including the next 122017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari * paragraph) shall be included in all copies or substantial portions of the 132017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari * Software. 142017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari * 152017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 162017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 172017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 182017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 192017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 202017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS 212017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari * IN THE SOFTWARE. 222017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari * 232017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari * Authors: 242017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari * Eric Anholt <eric@anholt.net> 252017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari * Keith Packard <keithp@keithp.com> 262017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari * 272017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari */ 282017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari 292017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari#include <linux/seq_file.h> 30f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson#include <linux/debugfs.h> 315a0e3ad6af8660be21ca98a971cd00f331318c05Tejun Heo#include <linux/slab.h> 322017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari#include "drmP.h" 332017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari#include "drm.h" 344e5359cd053bfb7d8dabe4a63624a5726848ffbcSimon Farnsworth#include "intel_drv.h" 35e5c652603680404683fd1f262b511340545179a2Chris Wilson#include "intel_ringbuffer.h" 362017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari#include "i915_drm.h" 372017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari#include "i915_drv.h" 382017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari 392017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari#define DRM_I915_RING_DEBUG 1 402017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari 412017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari 422017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari#if defined(CONFIG_DEBUG_FS) 432017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari 44f13d3f7311add99d1f874a6b67d56426afa35664Chris Wilsonenum { 4569dc4987cbe5fe70ae1c2a08906d431d53cdd242Chris Wilson ACTIVE_LIST, 46f13d3f7311add99d1f874a6b67d56426afa35664Chris Wilson FLUSHING_LIST, 47f13d3f7311add99d1f874a6b67d56426afa35664Chris Wilson INACTIVE_LIST, 48d21d5975686fbc107f9352006b06e1e92b4c5810Chris Wilson PINNED_LIST, 49d21d5975686fbc107f9352006b06e1e92b4c5810Chris Wilson DEFERRED_FREE_LIST, 50f13d3f7311add99d1f874a6b67d56426afa35664Chris Wilson}; 512017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari 5270d39fe4862c6c69c2582c829ec240e05bf24430Chris Wilsonstatic const char *yesno(int v) 5370d39fe4862c6c69c2582c829ec240e05bf24430Chris Wilson{ 5470d39fe4862c6c69c2582c829ec240e05bf24430Chris Wilson return v ? "yes" : "no"; 5570d39fe4862c6c69c2582c829ec240e05bf24430Chris Wilson} 5670d39fe4862c6c69c2582c829ec240e05bf24430Chris Wilson 5770d39fe4862c6c69c2582c829ec240e05bf24430Chris Wilsonstatic int i915_capabilities(struct seq_file *m, void *data) 5870d39fe4862c6c69c2582c829ec240e05bf24430Chris Wilson{ 5970d39fe4862c6c69c2582c829ec240e05bf24430Chris Wilson struct drm_info_node *node = (struct drm_info_node *) m->private; 6070d39fe4862c6c69c2582c829ec240e05bf24430Chris Wilson struct drm_device *dev = node->minor->dev; 6170d39fe4862c6c69c2582c829ec240e05bf24430Chris Wilson const struct intel_device_info *info = INTEL_INFO(dev); 6270d39fe4862c6c69c2582c829ec240e05bf24430Chris Wilson 6370d39fe4862c6c69c2582c829ec240e05bf24430Chris Wilson seq_printf(m, "gen: %d\n", info->gen); 6470d39fe4862c6c69c2582c829ec240e05bf24430Chris Wilson#define B(x) seq_printf(m, #x ": %s\n", yesno(info->x)) 6570d39fe4862c6c69c2582c829ec240e05bf24430Chris Wilson B(is_mobile); 6670d39fe4862c6c69c2582c829ec240e05bf24430Chris Wilson B(is_i85x); 6770d39fe4862c6c69c2582c829ec240e05bf24430Chris Wilson B(is_i915g); 6870d39fe4862c6c69c2582c829ec240e05bf24430Chris Wilson B(is_i945gm); 6970d39fe4862c6c69c2582c829ec240e05bf24430Chris Wilson B(is_g33); 7070d39fe4862c6c69c2582c829ec240e05bf24430Chris Wilson B(need_gfx_hws); 7170d39fe4862c6c69c2582c829ec240e05bf24430Chris Wilson B(is_g4x); 7270d39fe4862c6c69c2582c829ec240e05bf24430Chris Wilson B(is_pineview); 7370d39fe4862c6c69c2582c829ec240e05bf24430Chris Wilson B(is_broadwater); 7470d39fe4862c6c69c2582c829ec240e05bf24430Chris Wilson B(is_crestline); 7570d39fe4862c6c69c2582c829ec240e05bf24430Chris Wilson B(has_fbc); 7670d39fe4862c6c69c2582c829ec240e05bf24430Chris Wilson B(has_rc6); 7770d39fe4862c6c69c2582c829ec240e05bf24430Chris Wilson B(has_pipe_cxsr); 7870d39fe4862c6c69c2582c829ec240e05bf24430Chris Wilson B(has_hotplug); 7970d39fe4862c6c69c2582c829ec240e05bf24430Chris Wilson B(cursor_needs_physical); 8070d39fe4862c6c69c2582c829ec240e05bf24430Chris Wilson B(has_overlay); 8170d39fe4862c6c69c2582c829ec240e05bf24430Chris Wilson B(overlay_needs_physical); 82a6c45cf013a57e32ddae43dd4ac911eb4a3919fdChris Wilson B(supports_tv); 83549f7365820a212a1cfd0871d377b1ad0d1e5723Chris Wilson B(has_bsd_ring); 84549f7365820a212a1cfd0871d377b1ad0d1e5723Chris Wilson B(has_blt_ring); 8570d39fe4862c6c69c2582c829ec240e05bf24430Chris Wilson#undef B 8670d39fe4862c6c69c2582c829ec240e05bf24430Chris Wilson 8770d39fe4862c6c69c2582c829ec240e05bf24430Chris Wilson return 0; 8870d39fe4862c6c69c2582c829ec240e05bf24430Chris Wilson} 892017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari 90a6172a80ecb7ac64151960de1f709f78b509c57cChris Wilsonstatic const char *get_pin_flag(struct drm_i915_gem_object *obj_priv) 91a6172a80ecb7ac64151960de1f709f78b509c57cChris Wilson{ 92a6172a80ecb7ac64151960de1f709f78b509c57cChris Wilson if (obj_priv->user_pin_count > 0) 93a6172a80ecb7ac64151960de1f709f78b509c57cChris Wilson return "P"; 94a6172a80ecb7ac64151960de1f709f78b509c57cChris Wilson else if (obj_priv->pin_count > 0) 95a6172a80ecb7ac64151960de1f709f78b509c57cChris Wilson return "p"; 96a6172a80ecb7ac64151960de1f709f78b509c57cChris Wilson else 97a6172a80ecb7ac64151960de1f709f78b509c57cChris Wilson return " "; 98a6172a80ecb7ac64151960de1f709f78b509c57cChris Wilson} 99a6172a80ecb7ac64151960de1f709f78b509c57cChris Wilson 100a6172a80ecb7ac64151960de1f709f78b509c57cChris Wilsonstatic const char *get_tiling_flag(struct drm_i915_gem_object *obj_priv) 101a6172a80ecb7ac64151960de1f709f78b509c57cChris Wilson{ 102a6172a80ecb7ac64151960de1f709f78b509c57cChris Wilson switch (obj_priv->tiling_mode) { 103a6172a80ecb7ac64151960de1f709f78b509c57cChris Wilson default: 104a6172a80ecb7ac64151960de1f709f78b509c57cChris Wilson case I915_TILING_NONE: return " "; 105a6172a80ecb7ac64151960de1f709f78b509c57cChris Wilson case I915_TILING_X: return "X"; 106a6172a80ecb7ac64151960de1f709f78b509c57cChris Wilson case I915_TILING_Y: return "Y"; 107a6172a80ecb7ac64151960de1f709f78b509c57cChris Wilson } 108a6172a80ecb7ac64151960de1f709f78b509c57cChris Wilson} 109a6172a80ecb7ac64151960de1f709f78b509c57cChris Wilson 11037811fcc9188f748407646e1157f3ed24ae181a4Chris Wilsonstatic void 11137811fcc9188f748407646e1157f3ed24ae181a4Chris Wilsondescribe_obj(struct seq_file *m, struct drm_i915_gem_object *obj) 11237811fcc9188f748407646e1157f3ed24ae181a4Chris Wilson{ 11337811fcc9188f748407646e1157f3ed24ae181a4Chris Wilson seq_printf(m, "%p: %s%s %8zd %08x %08x %d%s%s", 11437811fcc9188f748407646e1157f3ed24ae181a4Chris Wilson &obj->base, 11537811fcc9188f748407646e1157f3ed24ae181a4Chris Wilson get_pin_flag(obj), 11637811fcc9188f748407646e1157f3ed24ae181a4Chris Wilson get_tiling_flag(obj), 11737811fcc9188f748407646e1157f3ed24ae181a4Chris Wilson obj->base.size, 11837811fcc9188f748407646e1157f3ed24ae181a4Chris Wilson obj->base.read_domains, 11937811fcc9188f748407646e1157f3ed24ae181a4Chris Wilson obj->base.write_domain, 12037811fcc9188f748407646e1157f3ed24ae181a4Chris Wilson obj->last_rendering_seqno, 12137811fcc9188f748407646e1157f3ed24ae181a4Chris Wilson obj->dirty ? " dirty" : "", 12237811fcc9188f748407646e1157f3ed24ae181a4Chris Wilson obj->madv == I915_MADV_DONTNEED ? " purgeable" : ""); 12337811fcc9188f748407646e1157f3ed24ae181a4Chris Wilson if (obj->base.name) 12437811fcc9188f748407646e1157f3ed24ae181a4Chris Wilson seq_printf(m, " (name: %d)", obj->base.name); 12537811fcc9188f748407646e1157f3ed24ae181a4Chris Wilson if (obj->fence_reg != I915_FENCE_REG_NONE) 12637811fcc9188f748407646e1157f3ed24ae181a4Chris Wilson seq_printf(m, " (fence: %d)", obj->fence_reg); 12737811fcc9188f748407646e1157f3ed24ae181a4Chris Wilson if (obj->gtt_space != NULL) 128a00b10c360b35d6431a94cbf130a4e162870d661Chris Wilson seq_printf(m, " (gtt offset: %08x, size: %08x)", 129a00b10c360b35d6431a94cbf130a4e162870d661Chris Wilson obj->gtt_offset, (unsigned int)obj->gtt_space->size); 130fb7d516af11837126eb1e4a44ab0653bf9b57702Daniel Vetter if (obj->pin_mappable || obj->fault_mappable) 131fb7d516af11837126eb1e4a44ab0653bf9b57702Daniel Vetter seq_printf(m, " (mappable)"); 13269dc4987cbe5fe70ae1c2a08906d431d53cdd242Chris Wilson if (obj->ring != NULL) 13369dc4987cbe5fe70ae1c2a08906d431d53cdd242Chris Wilson seq_printf(m, " (%s)", obj->ring->name); 13437811fcc9188f748407646e1157f3ed24ae181a4Chris Wilson} 13537811fcc9188f748407646e1157f3ed24ae181a4Chris Wilson 136433e12f78b68a8069f54956edf766bb21394c197Ben Gamaristatic int i915_gem_object_list_info(struct seq_file *m, void *data) 1372017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari{ 1382017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari struct drm_info_node *node = (struct drm_info_node *) m->private; 139433e12f78b68a8069f54956edf766bb21394c197Ben Gamari uintptr_t list = (uintptr_t) node->info_ent->data; 140433e12f78b68a8069f54956edf766bb21394c197Ben Gamari struct list_head *head; 1412017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari struct drm_device *dev = node->minor->dev; 1422017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari drm_i915_private_t *dev_priv = dev->dev_private; 1432017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari struct drm_i915_gem_object *obj_priv; 1448f2480fb05991f1a5522dd48332cd9db4f7745c6Chris Wilson size_t total_obj_size, total_gtt_size; 1458f2480fb05991f1a5522dd48332cd9db4f7745c6Chris Wilson int count, ret; 146de227ef0907258359d53e3e1530c1f3678eb2bb9Chris Wilson 147de227ef0907258359d53e3e1530c1f3678eb2bb9Chris Wilson ret = mutex_lock_interruptible(&dev->struct_mutex); 148de227ef0907258359d53e3e1530c1f3678eb2bb9Chris Wilson if (ret) 149de227ef0907258359d53e3e1530c1f3678eb2bb9Chris Wilson return ret; 1502017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari 151433e12f78b68a8069f54956edf766bb21394c197Ben Gamari switch (list) { 152433e12f78b68a8069f54956edf766bb21394c197Ben Gamari case ACTIVE_LIST: 153433e12f78b68a8069f54956edf766bb21394c197Ben Gamari seq_printf(m, "Active:\n"); 15469dc4987cbe5fe70ae1c2a08906d431d53cdd242Chris Wilson head = &dev_priv->mm.active_list; 155433e12f78b68a8069f54956edf766bb21394c197Ben Gamari break; 156433e12f78b68a8069f54956edf766bb21394c197Ben Gamari case INACTIVE_LIST: 157a17458fc9d9edc98b7c5865cdc42681cf9059f1cBen Gamari seq_printf(m, "Inactive:\n"); 158433e12f78b68a8069f54956edf766bb21394c197Ben Gamari head = &dev_priv->mm.inactive_list; 159433e12f78b68a8069f54956edf766bb21394c197Ben Gamari break; 160f13d3f7311add99d1f874a6b67d56426afa35664Chris Wilson case PINNED_LIST: 161f13d3f7311add99d1f874a6b67d56426afa35664Chris Wilson seq_printf(m, "Pinned:\n"); 162f13d3f7311add99d1f874a6b67d56426afa35664Chris Wilson head = &dev_priv->mm.pinned_list; 163f13d3f7311add99d1f874a6b67d56426afa35664Chris Wilson break; 164433e12f78b68a8069f54956edf766bb21394c197Ben Gamari case FLUSHING_LIST: 165433e12f78b68a8069f54956edf766bb21394c197Ben Gamari seq_printf(m, "Flushing:\n"); 166433e12f78b68a8069f54956edf766bb21394c197Ben Gamari head = &dev_priv->mm.flushing_list; 167433e12f78b68a8069f54956edf766bb21394c197Ben Gamari break; 168d21d5975686fbc107f9352006b06e1e92b4c5810Chris Wilson case DEFERRED_FREE_LIST: 169d21d5975686fbc107f9352006b06e1e92b4c5810Chris Wilson seq_printf(m, "Deferred free:\n"); 170d21d5975686fbc107f9352006b06e1e92b4c5810Chris Wilson head = &dev_priv->mm.deferred_free_list; 171d21d5975686fbc107f9352006b06e1e92b4c5810Chris Wilson break; 172433e12f78b68a8069f54956edf766bb21394c197Ben Gamari default: 173de227ef0907258359d53e3e1530c1f3678eb2bb9Chris Wilson mutex_unlock(&dev->struct_mutex); 174de227ef0907258359d53e3e1530c1f3678eb2bb9Chris Wilson return -EINVAL; 1752017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari } 1762017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari 1778f2480fb05991f1a5522dd48332cd9db4f7745c6Chris Wilson total_obj_size = total_gtt_size = count = 0; 17869dc4987cbe5fe70ae1c2a08906d431d53cdd242Chris Wilson list_for_each_entry(obj_priv, head, mm_list) { 17937811fcc9188f748407646e1157f3ed24ae181a4Chris Wilson seq_printf(m, " "); 18037811fcc9188f748407646e1157f3ed24ae181a4Chris Wilson describe_obj(m, obj_priv); 181f4ceda89895b56e2c03dd327f13d0256838a20abEric Anholt seq_printf(m, "\n"); 1828f2480fb05991f1a5522dd48332cd9db4f7745c6Chris Wilson total_obj_size += obj_priv->base.size; 1838f2480fb05991f1a5522dd48332cd9db4f7745c6Chris Wilson total_gtt_size += obj_priv->gtt_space->size; 1848f2480fb05991f1a5522dd48332cd9db4f7745c6Chris Wilson count++; 1852017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari } 186de227ef0907258359d53e3e1530c1f3678eb2bb9Chris Wilson mutex_unlock(&dev->struct_mutex); 1875e118f4139feafe97e913df67b1f7c1e5083e535Carl Worth 1888f2480fb05991f1a5522dd48332cd9db4f7745c6Chris Wilson seq_printf(m, "Total %d objects, %zu bytes, %zu GTT size\n", 1898f2480fb05991f1a5522dd48332cd9db4f7745c6Chris Wilson count, total_obj_size, total_gtt_size); 1902017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari return 0; 1912017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari} 1922017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari 19373aa808f10effc280e6eb70267314542a7c29426Chris Wilsonstatic int i915_gem_object_info(struct seq_file *m, void* data) 19473aa808f10effc280e6eb70267314542a7c29426Chris Wilson{ 19573aa808f10effc280e6eb70267314542a7c29426Chris Wilson struct drm_info_node *node = (struct drm_info_node *) m->private; 19673aa808f10effc280e6eb70267314542a7c29426Chris Wilson struct drm_device *dev = node->minor->dev; 19773aa808f10effc280e6eb70267314542a7c29426Chris Wilson struct drm_i915_private *dev_priv = dev->dev_private; 19873aa808f10effc280e6eb70267314542a7c29426Chris Wilson int ret; 19973aa808f10effc280e6eb70267314542a7c29426Chris Wilson 20073aa808f10effc280e6eb70267314542a7c29426Chris Wilson ret = mutex_lock_interruptible(&dev->struct_mutex); 20173aa808f10effc280e6eb70267314542a7c29426Chris Wilson if (ret) 20273aa808f10effc280e6eb70267314542a7c29426Chris Wilson return ret; 20373aa808f10effc280e6eb70267314542a7c29426Chris Wilson 20473aa808f10effc280e6eb70267314542a7c29426Chris Wilson seq_printf(m, "%u objects\n", dev_priv->mm.object_count); 20573aa808f10effc280e6eb70267314542a7c29426Chris Wilson seq_printf(m, "%zu object bytes\n", dev_priv->mm.object_memory); 20673aa808f10effc280e6eb70267314542a7c29426Chris Wilson seq_printf(m, "%u pinned\n", dev_priv->mm.pin_count); 20773aa808f10effc280e6eb70267314542a7c29426Chris Wilson seq_printf(m, "%zu pin bytes\n", dev_priv->mm.pin_memory); 208fb7d516af11837126eb1e4a44ab0653bf9b57702Daniel Vetter seq_printf(m, "%u mappable objects in gtt\n", dev_priv->mm.gtt_mappable_count); 209fb7d516af11837126eb1e4a44ab0653bf9b57702Daniel Vetter seq_printf(m, "%zu mappable gtt bytes\n", dev_priv->mm.gtt_mappable_memory); 210fb7d516af11837126eb1e4a44ab0653bf9b57702Daniel Vetter seq_printf(m, "%zu mappable gtt used bytes\n", dev_priv->mm.mappable_gtt_used); 211fb7d516af11837126eb1e4a44ab0653bf9b57702Daniel Vetter seq_printf(m, "%zu mappable gtt total\n", dev_priv->mm.mappable_gtt_total); 21273aa808f10effc280e6eb70267314542a7c29426Chris Wilson seq_printf(m, "%u objects in gtt\n", dev_priv->mm.gtt_count); 21373aa808f10effc280e6eb70267314542a7c29426Chris Wilson seq_printf(m, "%zu gtt bytes\n", dev_priv->mm.gtt_memory); 21473aa808f10effc280e6eb70267314542a7c29426Chris Wilson seq_printf(m, "%zu gtt total\n", dev_priv->mm.gtt_total); 21573aa808f10effc280e6eb70267314542a7c29426Chris Wilson 21673aa808f10effc280e6eb70267314542a7c29426Chris Wilson mutex_unlock(&dev->struct_mutex); 21773aa808f10effc280e6eb70267314542a7c29426Chris Wilson 21873aa808f10effc280e6eb70267314542a7c29426Chris Wilson return 0; 21973aa808f10effc280e6eb70267314542a7c29426Chris Wilson} 22073aa808f10effc280e6eb70267314542a7c29426Chris Wilson 22173aa808f10effc280e6eb70267314542a7c29426Chris Wilson 2224e5359cd053bfb7d8dabe4a63624a5726848ffbcSimon Farnsworthstatic int i915_gem_pageflip_info(struct seq_file *m, void *data) 2234e5359cd053bfb7d8dabe4a63624a5726848ffbcSimon Farnsworth{ 2244e5359cd053bfb7d8dabe4a63624a5726848ffbcSimon Farnsworth struct drm_info_node *node = (struct drm_info_node *) m->private; 2254e5359cd053bfb7d8dabe4a63624a5726848ffbcSimon Farnsworth struct drm_device *dev = node->minor->dev; 2264e5359cd053bfb7d8dabe4a63624a5726848ffbcSimon Farnsworth unsigned long flags; 2274e5359cd053bfb7d8dabe4a63624a5726848ffbcSimon Farnsworth struct intel_crtc *crtc; 2284e5359cd053bfb7d8dabe4a63624a5726848ffbcSimon Farnsworth 2294e5359cd053bfb7d8dabe4a63624a5726848ffbcSimon Farnsworth list_for_each_entry(crtc, &dev->mode_config.crtc_list, base.head) { 2304e5359cd053bfb7d8dabe4a63624a5726848ffbcSimon Farnsworth const char *pipe = crtc->pipe ? "B" : "A"; 2314e5359cd053bfb7d8dabe4a63624a5726848ffbcSimon Farnsworth const char *plane = crtc->plane ? "B" : "A"; 2324e5359cd053bfb7d8dabe4a63624a5726848ffbcSimon Farnsworth struct intel_unpin_work *work; 2334e5359cd053bfb7d8dabe4a63624a5726848ffbcSimon Farnsworth 2344e5359cd053bfb7d8dabe4a63624a5726848ffbcSimon Farnsworth spin_lock_irqsave(&dev->event_lock, flags); 2354e5359cd053bfb7d8dabe4a63624a5726848ffbcSimon Farnsworth work = crtc->unpin_work; 2364e5359cd053bfb7d8dabe4a63624a5726848ffbcSimon Farnsworth if (work == NULL) { 2374e5359cd053bfb7d8dabe4a63624a5726848ffbcSimon Farnsworth seq_printf(m, "No flip due on pipe %s (plane %s)\n", 2384e5359cd053bfb7d8dabe4a63624a5726848ffbcSimon Farnsworth pipe, plane); 2394e5359cd053bfb7d8dabe4a63624a5726848ffbcSimon Farnsworth } else { 2404e5359cd053bfb7d8dabe4a63624a5726848ffbcSimon Farnsworth if (!work->pending) { 2414e5359cd053bfb7d8dabe4a63624a5726848ffbcSimon Farnsworth seq_printf(m, "Flip queued on pipe %s (plane %s)\n", 2424e5359cd053bfb7d8dabe4a63624a5726848ffbcSimon Farnsworth pipe, plane); 2434e5359cd053bfb7d8dabe4a63624a5726848ffbcSimon Farnsworth } else { 2444e5359cd053bfb7d8dabe4a63624a5726848ffbcSimon Farnsworth seq_printf(m, "Flip pending (waiting for vsync) on pipe %s (plane %s)\n", 2454e5359cd053bfb7d8dabe4a63624a5726848ffbcSimon Farnsworth pipe, plane); 2464e5359cd053bfb7d8dabe4a63624a5726848ffbcSimon Farnsworth } 2474e5359cd053bfb7d8dabe4a63624a5726848ffbcSimon Farnsworth if (work->enable_stall_check) 2484e5359cd053bfb7d8dabe4a63624a5726848ffbcSimon Farnsworth seq_printf(m, "Stall check enabled, "); 2494e5359cd053bfb7d8dabe4a63624a5726848ffbcSimon Farnsworth else 2504e5359cd053bfb7d8dabe4a63624a5726848ffbcSimon Farnsworth seq_printf(m, "Stall check waiting for page flip ioctl, "); 2514e5359cd053bfb7d8dabe4a63624a5726848ffbcSimon Farnsworth seq_printf(m, "%d prepares\n", work->pending); 2524e5359cd053bfb7d8dabe4a63624a5726848ffbcSimon Farnsworth 2534e5359cd053bfb7d8dabe4a63624a5726848ffbcSimon Farnsworth if (work->old_fb_obj) { 2544e5359cd053bfb7d8dabe4a63624a5726848ffbcSimon Farnsworth struct drm_i915_gem_object *obj_priv = to_intel_bo(work->old_fb_obj); 2554e5359cd053bfb7d8dabe4a63624a5726848ffbcSimon Farnsworth if(obj_priv) 2564e5359cd053bfb7d8dabe4a63624a5726848ffbcSimon Farnsworth seq_printf(m, "Old framebuffer gtt_offset 0x%08x\n", obj_priv->gtt_offset ); 2574e5359cd053bfb7d8dabe4a63624a5726848ffbcSimon Farnsworth } 2584e5359cd053bfb7d8dabe4a63624a5726848ffbcSimon Farnsworth if (work->pending_flip_obj) { 2594e5359cd053bfb7d8dabe4a63624a5726848ffbcSimon Farnsworth struct drm_i915_gem_object *obj_priv = to_intel_bo(work->pending_flip_obj); 2604e5359cd053bfb7d8dabe4a63624a5726848ffbcSimon Farnsworth if(obj_priv) 2614e5359cd053bfb7d8dabe4a63624a5726848ffbcSimon Farnsworth seq_printf(m, "New framebuffer gtt_offset 0x%08x\n", obj_priv->gtt_offset ); 2624e5359cd053bfb7d8dabe4a63624a5726848ffbcSimon Farnsworth } 2634e5359cd053bfb7d8dabe4a63624a5726848ffbcSimon Farnsworth } 2644e5359cd053bfb7d8dabe4a63624a5726848ffbcSimon Farnsworth spin_unlock_irqrestore(&dev->event_lock, flags); 2654e5359cd053bfb7d8dabe4a63624a5726848ffbcSimon Farnsworth } 2664e5359cd053bfb7d8dabe4a63624a5726848ffbcSimon Farnsworth 2674e5359cd053bfb7d8dabe4a63624a5726848ffbcSimon Farnsworth return 0; 2684e5359cd053bfb7d8dabe4a63624a5726848ffbcSimon Farnsworth} 2694e5359cd053bfb7d8dabe4a63624a5726848ffbcSimon Farnsworth 2702017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamaristatic int i915_gem_request_info(struct seq_file *m, void *data) 2712017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari{ 2722017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari struct drm_info_node *node = (struct drm_info_node *) m->private; 2732017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari struct drm_device *dev = node->minor->dev; 2742017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari drm_i915_private_t *dev_priv = dev->dev_private; 2752017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari struct drm_i915_gem_request *gem_request; 276c2c347a9eeda1b9b69c8fc393fd933747fbb2e11Chris Wilson int ret, count; 277de227ef0907258359d53e3e1530c1f3678eb2bb9Chris Wilson 278de227ef0907258359d53e3e1530c1f3678eb2bb9Chris Wilson ret = mutex_lock_interruptible(&dev->struct_mutex); 279de227ef0907258359d53e3e1530c1f3678eb2bb9Chris Wilson if (ret) 280de227ef0907258359d53e3e1530c1f3678eb2bb9Chris Wilson return ret; 2812017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari 282c2c347a9eeda1b9b69c8fc393fd933747fbb2e11Chris Wilson count = 0; 283c2c347a9eeda1b9b69c8fc393fd933747fbb2e11Chris Wilson if (!list_empty(&dev_priv->render_ring.request_list)) { 284c2c347a9eeda1b9b69c8fc393fd933747fbb2e11Chris Wilson seq_printf(m, "Render requests:\n"); 285c2c347a9eeda1b9b69c8fc393fd933747fbb2e11Chris Wilson list_for_each_entry(gem_request, 286c2c347a9eeda1b9b69c8fc393fd933747fbb2e11Chris Wilson &dev_priv->render_ring.request_list, 287c2c347a9eeda1b9b69c8fc393fd933747fbb2e11Chris Wilson list) { 288c2c347a9eeda1b9b69c8fc393fd933747fbb2e11Chris Wilson seq_printf(m, " %d @ %d\n", 289c2c347a9eeda1b9b69c8fc393fd933747fbb2e11Chris Wilson gem_request->seqno, 290c2c347a9eeda1b9b69c8fc393fd933747fbb2e11Chris Wilson (int) (jiffies - gem_request->emitted_jiffies)); 291c2c347a9eeda1b9b69c8fc393fd933747fbb2e11Chris Wilson } 292c2c347a9eeda1b9b69c8fc393fd933747fbb2e11Chris Wilson count++; 293c2c347a9eeda1b9b69c8fc393fd933747fbb2e11Chris Wilson } 294c2c347a9eeda1b9b69c8fc393fd933747fbb2e11Chris Wilson if (!list_empty(&dev_priv->bsd_ring.request_list)) { 295c2c347a9eeda1b9b69c8fc393fd933747fbb2e11Chris Wilson seq_printf(m, "BSD requests:\n"); 296c2c347a9eeda1b9b69c8fc393fd933747fbb2e11Chris Wilson list_for_each_entry(gem_request, 297c2c347a9eeda1b9b69c8fc393fd933747fbb2e11Chris Wilson &dev_priv->bsd_ring.request_list, 298c2c347a9eeda1b9b69c8fc393fd933747fbb2e11Chris Wilson list) { 299c2c347a9eeda1b9b69c8fc393fd933747fbb2e11Chris Wilson seq_printf(m, " %d @ %d\n", 300c2c347a9eeda1b9b69c8fc393fd933747fbb2e11Chris Wilson gem_request->seqno, 301c2c347a9eeda1b9b69c8fc393fd933747fbb2e11Chris Wilson (int) (jiffies - gem_request->emitted_jiffies)); 302c2c347a9eeda1b9b69c8fc393fd933747fbb2e11Chris Wilson } 303c2c347a9eeda1b9b69c8fc393fd933747fbb2e11Chris Wilson count++; 304c2c347a9eeda1b9b69c8fc393fd933747fbb2e11Chris Wilson } 305c2c347a9eeda1b9b69c8fc393fd933747fbb2e11Chris Wilson if (!list_empty(&dev_priv->blt_ring.request_list)) { 306c2c347a9eeda1b9b69c8fc393fd933747fbb2e11Chris Wilson seq_printf(m, "BLT requests:\n"); 307c2c347a9eeda1b9b69c8fc393fd933747fbb2e11Chris Wilson list_for_each_entry(gem_request, 308c2c347a9eeda1b9b69c8fc393fd933747fbb2e11Chris Wilson &dev_priv->blt_ring.request_list, 309c2c347a9eeda1b9b69c8fc393fd933747fbb2e11Chris Wilson list) { 310c2c347a9eeda1b9b69c8fc393fd933747fbb2e11Chris Wilson seq_printf(m, " %d @ %d\n", 311c2c347a9eeda1b9b69c8fc393fd933747fbb2e11Chris Wilson gem_request->seqno, 312c2c347a9eeda1b9b69c8fc393fd933747fbb2e11Chris Wilson (int) (jiffies - gem_request->emitted_jiffies)); 313c2c347a9eeda1b9b69c8fc393fd933747fbb2e11Chris Wilson } 314c2c347a9eeda1b9b69c8fc393fd933747fbb2e11Chris Wilson count++; 3152017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari } 316de227ef0907258359d53e3e1530c1f3678eb2bb9Chris Wilson mutex_unlock(&dev->struct_mutex); 317de227ef0907258359d53e3e1530c1f3678eb2bb9Chris Wilson 318c2c347a9eeda1b9b69c8fc393fd933747fbb2e11Chris Wilson if (count == 0) 319c2c347a9eeda1b9b69c8fc393fd933747fbb2e11Chris Wilson seq_printf(m, "No requests\n"); 320c2c347a9eeda1b9b69c8fc393fd933747fbb2e11Chris Wilson 3212017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari return 0; 3222017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari} 3232017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari 324b2223497b44a4701d1be873d1e9453d7f720043bChris Wilsonstatic void i915_ring_seqno_info(struct seq_file *m, 325b2223497b44a4701d1be873d1e9453d7f720043bChris Wilson struct intel_ring_buffer *ring) 326b2223497b44a4701d1be873d1e9453d7f720043bChris Wilson{ 327b2223497b44a4701d1be873d1e9453d7f720043bChris Wilson if (ring->get_seqno) { 328b2223497b44a4701d1be873d1e9453d7f720043bChris Wilson seq_printf(m, "Current sequence (%s): %d\n", 329b2223497b44a4701d1be873d1e9453d7f720043bChris Wilson ring->name, ring->get_seqno(ring)); 330b2223497b44a4701d1be873d1e9453d7f720043bChris Wilson seq_printf(m, "Waiter sequence (%s): %d\n", 331b2223497b44a4701d1be873d1e9453d7f720043bChris Wilson ring->name, ring->waiting_seqno); 332b2223497b44a4701d1be873d1e9453d7f720043bChris Wilson seq_printf(m, "IRQ sequence (%s): %d\n", 333b2223497b44a4701d1be873d1e9453d7f720043bChris Wilson ring->name, ring->irq_seqno); 334b2223497b44a4701d1be873d1e9453d7f720043bChris Wilson } 335b2223497b44a4701d1be873d1e9453d7f720043bChris Wilson} 336b2223497b44a4701d1be873d1e9453d7f720043bChris Wilson 3372017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamaristatic int i915_gem_seqno_info(struct seq_file *m, void *data) 3382017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari{ 3392017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari struct drm_info_node *node = (struct drm_info_node *) m->private; 3402017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari struct drm_device *dev = node->minor->dev; 3412017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari drm_i915_private_t *dev_priv = dev->dev_private; 342de227ef0907258359d53e3e1530c1f3678eb2bb9Chris Wilson int ret; 343de227ef0907258359d53e3e1530c1f3678eb2bb9Chris Wilson 344de227ef0907258359d53e3e1530c1f3678eb2bb9Chris Wilson ret = mutex_lock_interruptible(&dev->struct_mutex); 345de227ef0907258359d53e3e1530c1f3678eb2bb9Chris Wilson if (ret) 346de227ef0907258359d53e3e1530c1f3678eb2bb9Chris Wilson return ret; 3472017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari 348b2223497b44a4701d1be873d1e9453d7f720043bChris Wilson i915_ring_seqno_info(m, &dev_priv->render_ring); 349b2223497b44a4701d1be873d1e9453d7f720043bChris Wilson i915_ring_seqno_info(m, &dev_priv->bsd_ring); 350b2223497b44a4701d1be873d1e9453d7f720043bChris Wilson i915_ring_seqno_info(m, &dev_priv->blt_ring); 351de227ef0907258359d53e3e1530c1f3678eb2bb9Chris Wilson 352de227ef0907258359d53e3e1530c1f3678eb2bb9Chris Wilson mutex_unlock(&dev->struct_mutex); 353de227ef0907258359d53e3e1530c1f3678eb2bb9Chris Wilson 3542017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari return 0; 3552017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari} 3562017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari 3572017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari 3582017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamaristatic int i915_interrupt_info(struct seq_file *m, void *data) 3592017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari{ 3602017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari struct drm_info_node *node = (struct drm_info_node *) m->private; 3612017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari struct drm_device *dev = node->minor->dev; 3622017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari drm_i915_private_t *dev_priv = dev->dev_private; 363de227ef0907258359d53e3e1530c1f3678eb2bb9Chris Wilson int ret; 364de227ef0907258359d53e3e1530c1f3678eb2bb9Chris Wilson 365de227ef0907258359d53e3e1530c1f3678eb2bb9Chris Wilson ret = mutex_lock_interruptible(&dev->struct_mutex); 366de227ef0907258359d53e3e1530c1f3678eb2bb9Chris Wilson if (ret) 367de227ef0907258359d53e3e1530c1f3678eb2bb9Chris Wilson return ret; 3682017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari 369bad720ff3e8e47a04bd88d9bbc8317e7d7e049d3Eric Anholt if (!HAS_PCH_SPLIT(dev)) { 3705f6a169598938d9e5703f06b64c4f4f972561ce5Zhenyu Wang seq_printf(m, "Interrupt enable: %08x\n", 3715f6a169598938d9e5703f06b64c4f4f972561ce5Zhenyu Wang I915_READ(IER)); 3725f6a169598938d9e5703f06b64c4f4f972561ce5Zhenyu Wang seq_printf(m, "Interrupt identity: %08x\n", 3735f6a169598938d9e5703f06b64c4f4f972561ce5Zhenyu Wang I915_READ(IIR)); 3745f6a169598938d9e5703f06b64c4f4f972561ce5Zhenyu Wang seq_printf(m, "Interrupt mask: %08x\n", 3755f6a169598938d9e5703f06b64c4f4f972561ce5Zhenyu Wang I915_READ(IMR)); 3765f6a169598938d9e5703f06b64c4f4f972561ce5Zhenyu Wang seq_printf(m, "Pipe A stat: %08x\n", 3775f6a169598938d9e5703f06b64c4f4f972561ce5Zhenyu Wang I915_READ(PIPEASTAT)); 3785f6a169598938d9e5703f06b64c4f4f972561ce5Zhenyu Wang seq_printf(m, "Pipe B stat: %08x\n", 3795f6a169598938d9e5703f06b64c4f4f972561ce5Zhenyu Wang I915_READ(PIPEBSTAT)); 3805f6a169598938d9e5703f06b64c4f4f972561ce5Zhenyu Wang } else { 3815f6a169598938d9e5703f06b64c4f4f972561ce5Zhenyu Wang seq_printf(m, "North Display Interrupt enable: %08x\n", 3825f6a169598938d9e5703f06b64c4f4f972561ce5Zhenyu Wang I915_READ(DEIER)); 3835f6a169598938d9e5703f06b64c4f4f972561ce5Zhenyu Wang seq_printf(m, "North Display Interrupt identity: %08x\n", 3845f6a169598938d9e5703f06b64c4f4f972561ce5Zhenyu Wang I915_READ(DEIIR)); 3855f6a169598938d9e5703f06b64c4f4f972561ce5Zhenyu Wang seq_printf(m, "North Display Interrupt mask: %08x\n", 3865f6a169598938d9e5703f06b64c4f4f972561ce5Zhenyu Wang I915_READ(DEIMR)); 3875f6a169598938d9e5703f06b64c4f4f972561ce5Zhenyu Wang seq_printf(m, "South Display Interrupt enable: %08x\n", 3885f6a169598938d9e5703f06b64c4f4f972561ce5Zhenyu Wang I915_READ(SDEIER)); 3895f6a169598938d9e5703f06b64c4f4f972561ce5Zhenyu Wang seq_printf(m, "South Display Interrupt identity: %08x\n", 3905f6a169598938d9e5703f06b64c4f4f972561ce5Zhenyu Wang I915_READ(SDEIIR)); 3915f6a169598938d9e5703f06b64c4f4f972561ce5Zhenyu Wang seq_printf(m, "South Display Interrupt mask: %08x\n", 3925f6a169598938d9e5703f06b64c4f4f972561ce5Zhenyu Wang I915_READ(SDEIMR)); 3935f6a169598938d9e5703f06b64c4f4f972561ce5Zhenyu Wang seq_printf(m, "Graphics Interrupt enable: %08x\n", 3945f6a169598938d9e5703f06b64c4f4f972561ce5Zhenyu Wang I915_READ(GTIER)); 3955f6a169598938d9e5703f06b64c4f4f972561ce5Zhenyu Wang seq_printf(m, "Graphics Interrupt identity: %08x\n", 3965f6a169598938d9e5703f06b64c4f4f972561ce5Zhenyu Wang I915_READ(GTIIR)); 3975f6a169598938d9e5703f06b64c4f4f972561ce5Zhenyu Wang seq_printf(m, "Graphics Interrupt mask: %08x\n", 3985f6a169598938d9e5703f06b64c4f4f972561ce5Zhenyu Wang I915_READ(GTIMR)); 3995f6a169598938d9e5703f06b64c4f4f972561ce5Zhenyu Wang } 4002017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari seq_printf(m, "Interrupts received: %d\n", 4012017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari atomic_read(&dev_priv->irq_received)); 402b2223497b44a4701d1be873d1e9453d7f720043bChris Wilson i915_ring_seqno_info(m, &dev_priv->render_ring); 403b2223497b44a4701d1be873d1e9453d7f720043bChris Wilson i915_ring_seqno_info(m, &dev_priv->bsd_ring); 404b2223497b44a4701d1be873d1e9453d7f720043bChris Wilson i915_ring_seqno_info(m, &dev_priv->blt_ring); 405de227ef0907258359d53e3e1530c1f3678eb2bb9Chris Wilson mutex_unlock(&dev->struct_mutex); 406de227ef0907258359d53e3e1530c1f3678eb2bb9Chris Wilson 4072017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari return 0; 4082017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari} 4092017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari 410a6172a80ecb7ac64151960de1f709f78b509c57cChris Wilsonstatic int i915_gem_fence_regs_info(struct seq_file *m, void *data) 411a6172a80ecb7ac64151960de1f709f78b509c57cChris Wilson{ 412a6172a80ecb7ac64151960de1f709f78b509c57cChris Wilson struct drm_info_node *node = (struct drm_info_node *) m->private; 413a6172a80ecb7ac64151960de1f709f78b509c57cChris Wilson struct drm_device *dev = node->minor->dev; 414a6172a80ecb7ac64151960de1f709f78b509c57cChris Wilson drm_i915_private_t *dev_priv = dev->dev_private; 415de227ef0907258359d53e3e1530c1f3678eb2bb9Chris Wilson int i, ret; 416de227ef0907258359d53e3e1530c1f3678eb2bb9Chris Wilson 417de227ef0907258359d53e3e1530c1f3678eb2bb9Chris Wilson ret = mutex_lock_interruptible(&dev->struct_mutex); 418de227ef0907258359d53e3e1530c1f3678eb2bb9Chris Wilson if (ret) 419de227ef0907258359d53e3e1530c1f3678eb2bb9Chris Wilson return ret; 420a6172a80ecb7ac64151960de1f709f78b509c57cChris Wilson 421a6172a80ecb7ac64151960de1f709f78b509c57cChris Wilson seq_printf(m, "Reserved fences = %d\n", dev_priv->fence_reg_start); 422a6172a80ecb7ac64151960de1f709f78b509c57cChris Wilson seq_printf(m, "Total fences = %d\n", dev_priv->num_fence_regs); 423a6172a80ecb7ac64151960de1f709f78b509c57cChris Wilson for (i = 0; i < dev_priv->num_fence_regs; i++) { 424a6172a80ecb7ac64151960de1f709f78b509c57cChris Wilson struct drm_gem_object *obj = dev_priv->fence_regs[i].obj; 425a6172a80ecb7ac64151960de1f709f78b509c57cChris Wilson 426c2c347a9eeda1b9b69c8fc393fd933747fbb2e11Chris Wilson seq_printf(m, "Fenced object[%2d] = ", i); 427c2c347a9eeda1b9b69c8fc393fd933747fbb2e11Chris Wilson if (obj == NULL) 428c2c347a9eeda1b9b69c8fc393fd933747fbb2e11Chris Wilson seq_printf(m, "unused"); 429c2c347a9eeda1b9b69c8fc393fd933747fbb2e11Chris Wilson else 430c2c347a9eeda1b9b69c8fc393fd933747fbb2e11Chris Wilson describe_obj(m, to_intel_bo(obj)); 431c2c347a9eeda1b9b69c8fc393fd933747fbb2e11Chris Wilson seq_printf(m, "\n"); 432a6172a80ecb7ac64151960de1f709f78b509c57cChris Wilson } 433de227ef0907258359d53e3e1530c1f3678eb2bb9Chris Wilson mutex_unlock(&dev->struct_mutex); 434a6172a80ecb7ac64151960de1f709f78b509c57cChris Wilson 435a6172a80ecb7ac64151960de1f709f78b509c57cChris Wilson return 0; 436a6172a80ecb7ac64151960de1f709f78b509c57cChris Wilson} 437a6172a80ecb7ac64151960de1f709f78b509c57cChris Wilson 4382017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamaristatic int i915_hws_info(struct seq_file *m, void *data) 4392017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari{ 4402017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari struct drm_info_node *node = (struct drm_info_node *) m->private; 4412017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari struct drm_device *dev = node->minor->dev; 4422017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari drm_i915_private_t *dev_priv = dev->dev_private; 4434066c0ae13a8388b9f2a29cad60da330b578eff2Chris Wilson struct intel_ring_buffer *ring; 4442017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari volatile u32 *hws; 4454066c0ae13a8388b9f2a29cad60da330b578eff2Chris Wilson int i; 4464066c0ae13a8388b9f2a29cad60da330b578eff2Chris Wilson 4474066c0ae13a8388b9f2a29cad60da330b578eff2Chris Wilson switch ((uintptr_t)node->info_ent->data) { 448e5c652603680404683fd1f262b511340545179a2Chris Wilson case RING_RENDER: ring = &dev_priv->render_ring; break; 449e5c652603680404683fd1f262b511340545179a2Chris Wilson case RING_BSD: ring = &dev_priv->bsd_ring; break; 450e5c652603680404683fd1f262b511340545179a2Chris Wilson case RING_BLT: ring = &dev_priv->blt_ring; break; 4514066c0ae13a8388b9f2a29cad60da330b578eff2Chris Wilson default: return -EINVAL; 4524066c0ae13a8388b9f2a29cad60da330b578eff2Chris Wilson } 4532017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari 4544066c0ae13a8388b9f2a29cad60da330b578eff2Chris Wilson hws = (volatile u32 *)ring->status_page.page_addr; 4552017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari if (hws == NULL) 4562017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari return 0; 4572017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari 4582017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari for (i = 0; i < 4096 / sizeof(u32) / 4; i += 4) { 4592017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari seq_printf(m, "0x%08x: 0x%08x 0x%08x 0x%08x 0x%08x\n", 4602017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari i * 4, 4612017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari hws[i], hws[i + 1], hws[i + 2], hws[i + 3]); 4622017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari } 4632017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari return 0; 4642017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari} 4652017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari 4665cdf58817433345157644140f2f509f00c06d479Chris Wilsonstatic void i915_dump_object(struct seq_file *m, 4675cdf58817433345157644140f2f509f00c06d479Chris Wilson struct io_mapping *mapping, 4685cdf58817433345157644140f2f509f00c06d479Chris Wilson struct drm_i915_gem_object *obj_priv) 4696911a9b8ae8b2a1dab4dfda9c2bd20f7ca2961d6Ben Gamari{ 4705cdf58817433345157644140f2f509f00c06d479Chris Wilson int page, page_count, i; 4716911a9b8ae8b2a1dab4dfda9c2bd20f7ca2961d6Ben Gamari 4725cdf58817433345157644140f2f509f00c06d479Chris Wilson page_count = obj_priv->base.size / PAGE_SIZE; 4736911a9b8ae8b2a1dab4dfda9c2bd20f7ca2961d6Ben Gamari for (page = 0; page < page_count; page++) { 4745cdf58817433345157644140f2f509f00c06d479Chris Wilson u32 *mem = io_mapping_map_wc(mapping, 4755cdf58817433345157644140f2f509f00c06d479Chris Wilson obj_priv->gtt_offset + page * PAGE_SIZE); 4766911a9b8ae8b2a1dab4dfda9c2bd20f7ca2961d6Ben Gamari for (i = 0; i < PAGE_SIZE; i += 4) 4776911a9b8ae8b2a1dab4dfda9c2bd20f7ca2961d6Ben Gamari seq_printf(m, "%08x : %08x\n", i, mem[i / 4]); 4785cdf58817433345157644140f2f509f00c06d479Chris Wilson io_mapping_unmap(mem); 4796911a9b8ae8b2a1dab4dfda9c2bd20f7ca2961d6Ben Gamari } 4806911a9b8ae8b2a1dab4dfda9c2bd20f7ca2961d6Ben Gamari} 4816911a9b8ae8b2a1dab4dfda9c2bd20f7ca2961d6Ben Gamari 4826911a9b8ae8b2a1dab4dfda9c2bd20f7ca2961d6Ben Gamaristatic int i915_batchbuffer_info(struct seq_file *m, void *data) 4836911a9b8ae8b2a1dab4dfda9c2bd20f7ca2961d6Ben Gamari{ 4846911a9b8ae8b2a1dab4dfda9c2bd20f7ca2961d6Ben Gamari struct drm_info_node *node = (struct drm_info_node *) m->private; 4856911a9b8ae8b2a1dab4dfda9c2bd20f7ca2961d6Ben Gamari struct drm_device *dev = node->minor->dev; 4866911a9b8ae8b2a1dab4dfda9c2bd20f7ca2961d6Ben Gamari drm_i915_private_t *dev_priv = dev->dev_private; 4876911a9b8ae8b2a1dab4dfda9c2bd20f7ca2961d6Ben Gamari struct drm_gem_object *obj; 4886911a9b8ae8b2a1dab4dfda9c2bd20f7ca2961d6Ben Gamari struct drm_i915_gem_object *obj_priv; 4896911a9b8ae8b2a1dab4dfda9c2bd20f7ca2961d6Ben Gamari int ret; 4906911a9b8ae8b2a1dab4dfda9c2bd20f7ca2961d6Ben Gamari 491de227ef0907258359d53e3e1530c1f3678eb2bb9Chris Wilson ret = mutex_lock_interruptible(&dev->struct_mutex); 492de227ef0907258359d53e3e1530c1f3678eb2bb9Chris Wilson if (ret) 493de227ef0907258359d53e3e1530c1f3678eb2bb9Chris Wilson return ret; 4946911a9b8ae8b2a1dab4dfda9c2bd20f7ca2961d6Ben Gamari 49569dc4987cbe5fe70ae1c2a08906d431d53cdd242Chris Wilson list_for_each_entry(obj_priv, &dev_priv->mm.active_list, mm_list) { 496a8089e849a32c5b6bfd6c88dbd09c0ea4a779b71Daniel Vetter obj = &obj_priv->base; 4976911a9b8ae8b2a1dab4dfda9c2bd20f7ca2961d6Ben Gamari if (obj->read_domains & I915_GEM_DOMAIN_COMMAND) { 4985cdf58817433345157644140f2f509f00c06d479Chris Wilson seq_printf(m, "--- gtt_offset = 0x%08x\n", 4995cdf58817433345157644140f2f509f00c06d479Chris Wilson obj_priv->gtt_offset); 5005cdf58817433345157644140f2f509f00c06d479Chris Wilson i915_dump_object(m, dev_priv->mm.gtt_mapping, obj_priv); 5016911a9b8ae8b2a1dab4dfda9c2bd20f7ca2961d6Ben Gamari } 5026911a9b8ae8b2a1dab4dfda9c2bd20f7ca2961d6Ben Gamari } 5036911a9b8ae8b2a1dab4dfda9c2bd20f7ca2961d6Ben Gamari 504de227ef0907258359d53e3e1530c1f3678eb2bb9Chris Wilson mutex_unlock(&dev->struct_mutex); 5056911a9b8ae8b2a1dab4dfda9c2bd20f7ca2961d6Ben Gamari 5066911a9b8ae8b2a1dab4dfda9c2bd20f7ca2961d6Ben Gamari return 0; 5076911a9b8ae8b2a1dab4dfda9c2bd20f7ca2961d6Ben Gamari} 5086911a9b8ae8b2a1dab4dfda9c2bd20f7ca2961d6Ben Gamari 5096911a9b8ae8b2a1dab4dfda9c2bd20f7ca2961d6Ben Gamaristatic int i915_ringbuffer_data(struct seq_file *m, void *data) 5106911a9b8ae8b2a1dab4dfda9c2bd20f7ca2961d6Ben Gamari{ 5116911a9b8ae8b2a1dab4dfda9c2bd20f7ca2961d6Ben Gamari struct drm_info_node *node = (struct drm_info_node *) m->private; 5126911a9b8ae8b2a1dab4dfda9c2bd20f7ca2961d6Ben Gamari struct drm_device *dev = node->minor->dev; 5136911a9b8ae8b2a1dab4dfda9c2bd20f7ca2961d6Ben Gamari drm_i915_private_t *dev_priv = dev->dev_private; 514c2c347a9eeda1b9b69c8fc393fd933747fbb2e11Chris Wilson struct intel_ring_buffer *ring; 515de227ef0907258359d53e3e1530c1f3678eb2bb9Chris Wilson int ret; 516de227ef0907258359d53e3e1530c1f3678eb2bb9Chris Wilson 517c2c347a9eeda1b9b69c8fc393fd933747fbb2e11Chris Wilson switch ((uintptr_t)node->info_ent->data) { 518e5c652603680404683fd1f262b511340545179a2Chris Wilson case RING_RENDER: ring = &dev_priv->render_ring; break; 519e5c652603680404683fd1f262b511340545179a2Chris Wilson case RING_BSD: ring = &dev_priv->bsd_ring; break; 520e5c652603680404683fd1f262b511340545179a2Chris Wilson case RING_BLT: ring = &dev_priv->blt_ring; break; 521c2c347a9eeda1b9b69c8fc393fd933747fbb2e11Chris Wilson default: return -EINVAL; 522c2c347a9eeda1b9b69c8fc393fd933747fbb2e11Chris Wilson } 523c2c347a9eeda1b9b69c8fc393fd933747fbb2e11Chris Wilson 524de227ef0907258359d53e3e1530c1f3678eb2bb9Chris Wilson ret = mutex_lock_interruptible(&dev->struct_mutex); 525de227ef0907258359d53e3e1530c1f3678eb2bb9Chris Wilson if (ret) 526de227ef0907258359d53e3e1530c1f3678eb2bb9Chris Wilson return ret; 5276911a9b8ae8b2a1dab4dfda9c2bd20f7ca2961d6Ben Gamari 528c2c347a9eeda1b9b69c8fc393fd933747fbb2e11Chris Wilson if (!ring->gem_object) { 5296911a9b8ae8b2a1dab4dfda9c2bd20f7ca2961d6Ben Gamari seq_printf(m, "No ringbuffer setup\n"); 530de227ef0907258359d53e3e1530c1f3678eb2bb9Chris Wilson } else { 531c2c347a9eeda1b9b69c8fc393fd933747fbb2e11Chris Wilson u8 *virt = ring->virtual_start; 532de227ef0907258359d53e3e1530c1f3678eb2bb9Chris Wilson uint32_t off; 5336911a9b8ae8b2a1dab4dfda9c2bd20f7ca2961d6Ben Gamari 534c2c347a9eeda1b9b69c8fc393fd933747fbb2e11Chris Wilson for (off = 0; off < ring->size; off += 4) { 535de227ef0907258359d53e3e1530c1f3678eb2bb9Chris Wilson uint32_t *ptr = (uint32_t *)(virt + off); 536de227ef0907258359d53e3e1530c1f3678eb2bb9Chris Wilson seq_printf(m, "%08x : %08x\n", off, *ptr); 537de227ef0907258359d53e3e1530c1f3678eb2bb9Chris Wilson } 5386911a9b8ae8b2a1dab4dfda9c2bd20f7ca2961d6Ben Gamari } 539de227ef0907258359d53e3e1530c1f3678eb2bb9Chris Wilson mutex_unlock(&dev->struct_mutex); 5406911a9b8ae8b2a1dab4dfda9c2bd20f7ca2961d6Ben Gamari 5416911a9b8ae8b2a1dab4dfda9c2bd20f7ca2961d6Ben Gamari return 0; 5426911a9b8ae8b2a1dab4dfda9c2bd20f7ca2961d6Ben Gamari} 5436911a9b8ae8b2a1dab4dfda9c2bd20f7ca2961d6Ben Gamari 5446911a9b8ae8b2a1dab4dfda9c2bd20f7ca2961d6Ben Gamaristatic int i915_ringbuffer_info(struct seq_file *m, void *data) 5456911a9b8ae8b2a1dab4dfda9c2bd20f7ca2961d6Ben Gamari{ 5466911a9b8ae8b2a1dab4dfda9c2bd20f7ca2961d6Ben Gamari struct drm_info_node *node = (struct drm_info_node *) m->private; 5476911a9b8ae8b2a1dab4dfda9c2bd20f7ca2961d6Ben Gamari struct drm_device *dev = node->minor->dev; 5486911a9b8ae8b2a1dab4dfda9c2bd20f7ca2961d6Ben Gamari drm_i915_private_t *dev_priv = dev->dev_private; 549c2c347a9eeda1b9b69c8fc393fd933747fbb2e11Chris Wilson struct intel_ring_buffer *ring; 550c2c347a9eeda1b9b69c8fc393fd933747fbb2e11Chris Wilson 551c2c347a9eeda1b9b69c8fc393fd933747fbb2e11Chris Wilson switch ((uintptr_t)node->info_ent->data) { 552e5c652603680404683fd1f262b511340545179a2Chris Wilson case RING_RENDER: ring = &dev_priv->render_ring; break; 553e5c652603680404683fd1f262b511340545179a2Chris Wilson case RING_BSD: ring = &dev_priv->bsd_ring; break; 554e5c652603680404683fd1f262b511340545179a2Chris Wilson case RING_BLT: ring = &dev_priv->blt_ring; break; 555c2c347a9eeda1b9b69c8fc393fd933747fbb2e11Chris Wilson default: return -EINVAL; 556c2c347a9eeda1b9b69c8fc393fd933747fbb2e11Chris Wilson } 5576911a9b8ae8b2a1dab4dfda9c2bd20f7ca2961d6Ben Gamari 558c2c347a9eeda1b9b69c8fc393fd933747fbb2e11Chris Wilson if (ring->size == 0) 559c2c347a9eeda1b9b69c8fc393fd933747fbb2e11Chris Wilson return 0; 5606911a9b8ae8b2a1dab4dfda9c2bd20f7ca2961d6Ben Gamari 561c2c347a9eeda1b9b69c8fc393fd933747fbb2e11Chris Wilson seq_printf(m, "Ring %s:\n", ring->name); 562c2c347a9eeda1b9b69c8fc393fd933747fbb2e11Chris Wilson seq_printf(m, " Head : %08x\n", I915_READ_HEAD(ring) & HEAD_ADDR); 563c2c347a9eeda1b9b69c8fc393fd933747fbb2e11Chris Wilson seq_printf(m, " Tail : %08x\n", I915_READ_TAIL(ring) & TAIL_ADDR); 564c2c347a9eeda1b9b69c8fc393fd933747fbb2e11Chris Wilson seq_printf(m, " Size : %08x\n", ring->size); 565c2c347a9eeda1b9b69c8fc393fd933747fbb2e11Chris Wilson seq_printf(m, " Active : %08x\n", intel_ring_get_active_head(ring)); 566c2c347a9eeda1b9b69c8fc393fd933747fbb2e11Chris Wilson seq_printf(m, " Control : %08x\n", I915_READ_CTL(ring)); 567c2c347a9eeda1b9b69c8fc393fd933747fbb2e11Chris Wilson seq_printf(m, " Start : %08x\n", I915_READ_START(ring)); 5686911a9b8ae8b2a1dab4dfda9c2bd20f7ca2961d6Ben Gamari 5696911a9b8ae8b2a1dab4dfda9c2bd20f7ca2961d6Ben Gamari return 0; 5706911a9b8ae8b2a1dab4dfda9c2bd20f7ca2961d6Ben Gamari} 5716911a9b8ae8b2a1dab4dfda9c2bd20f7ca2961d6Ben Gamari 572e5c652603680404683fd1f262b511340545179a2Chris Wilsonstatic const char *ring_str(int ring) 573e5c652603680404683fd1f262b511340545179a2Chris Wilson{ 574e5c652603680404683fd1f262b511340545179a2Chris Wilson switch (ring) { 575e5c652603680404683fd1f262b511340545179a2Chris Wilson case RING_RENDER: return "render"; 576e5c652603680404683fd1f262b511340545179a2Chris Wilson case RING_BSD: return "bsd"; 577e5c652603680404683fd1f262b511340545179a2Chris Wilson case RING_BLT: return "blt"; 578e5c652603680404683fd1f262b511340545179a2Chris Wilson default: return ""; 579e5c652603680404683fd1f262b511340545179a2Chris Wilson } 580e5c652603680404683fd1f262b511340545179a2Chris Wilson} 581e5c652603680404683fd1f262b511340545179a2Chris Wilson 5829df30794f609d9412f14cfd0eb7b45dd64d0b14eChris Wilsonstatic const char *pin_flag(int pinned) 5839df30794f609d9412f14cfd0eb7b45dd64d0b14eChris Wilson{ 5849df30794f609d9412f14cfd0eb7b45dd64d0b14eChris Wilson if (pinned > 0) 5859df30794f609d9412f14cfd0eb7b45dd64d0b14eChris Wilson return " P"; 5869df30794f609d9412f14cfd0eb7b45dd64d0b14eChris Wilson else if (pinned < 0) 5879df30794f609d9412f14cfd0eb7b45dd64d0b14eChris Wilson return " p"; 5889df30794f609d9412f14cfd0eb7b45dd64d0b14eChris Wilson else 5899df30794f609d9412f14cfd0eb7b45dd64d0b14eChris Wilson return ""; 5909df30794f609d9412f14cfd0eb7b45dd64d0b14eChris Wilson} 5919df30794f609d9412f14cfd0eb7b45dd64d0b14eChris Wilson 5929df30794f609d9412f14cfd0eb7b45dd64d0b14eChris Wilsonstatic const char *tiling_flag(int tiling) 5939df30794f609d9412f14cfd0eb7b45dd64d0b14eChris Wilson{ 5949df30794f609d9412f14cfd0eb7b45dd64d0b14eChris Wilson switch (tiling) { 5959df30794f609d9412f14cfd0eb7b45dd64d0b14eChris Wilson default: 5969df30794f609d9412f14cfd0eb7b45dd64d0b14eChris Wilson case I915_TILING_NONE: return ""; 5979df30794f609d9412f14cfd0eb7b45dd64d0b14eChris Wilson case I915_TILING_X: return " X"; 5989df30794f609d9412f14cfd0eb7b45dd64d0b14eChris Wilson case I915_TILING_Y: return " Y"; 5999df30794f609d9412f14cfd0eb7b45dd64d0b14eChris Wilson } 6009df30794f609d9412f14cfd0eb7b45dd64d0b14eChris Wilson} 6019df30794f609d9412f14cfd0eb7b45dd64d0b14eChris Wilson 6029df30794f609d9412f14cfd0eb7b45dd64d0b14eChris Wilsonstatic const char *dirty_flag(int dirty) 6039df30794f609d9412f14cfd0eb7b45dd64d0b14eChris Wilson{ 6049df30794f609d9412f14cfd0eb7b45dd64d0b14eChris Wilson return dirty ? " dirty" : ""; 6059df30794f609d9412f14cfd0eb7b45dd64d0b14eChris Wilson} 6069df30794f609d9412f14cfd0eb7b45dd64d0b14eChris Wilson 6079df30794f609d9412f14cfd0eb7b45dd64d0b14eChris Wilsonstatic const char *purgeable_flag(int purgeable) 6089df30794f609d9412f14cfd0eb7b45dd64d0b14eChris Wilson{ 6099df30794f609d9412f14cfd0eb7b45dd64d0b14eChris Wilson return purgeable ? " purgeable" : ""; 6109df30794f609d9412f14cfd0eb7b45dd64d0b14eChris Wilson} 6119df30794f609d9412f14cfd0eb7b45dd64d0b14eChris Wilson 612c724e8a9407683a8a2ee8eb00b972badf237bbe1Chris Wilsonstatic void print_error_buffers(struct seq_file *m, 613c724e8a9407683a8a2ee8eb00b972badf237bbe1Chris Wilson const char *name, 614c724e8a9407683a8a2ee8eb00b972badf237bbe1Chris Wilson struct drm_i915_error_buffer *err, 615c724e8a9407683a8a2ee8eb00b972badf237bbe1Chris Wilson int count) 616c724e8a9407683a8a2ee8eb00b972badf237bbe1Chris Wilson{ 617c724e8a9407683a8a2ee8eb00b972badf237bbe1Chris Wilson seq_printf(m, "%s [%d]:\n", name, count); 618c724e8a9407683a8a2ee8eb00b972badf237bbe1Chris Wilson 619c724e8a9407683a8a2ee8eb00b972badf237bbe1Chris Wilson while (count--) { 620c724e8a9407683a8a2ee8eb00b972badf237bbe1Chris Wilson seq_printf(m, " %08x %8zd %04x %04x %08x%s%s%s%s%s", 621c724e8a9407683a8a2ee8eb00b972badf237bbe1Chris Wilson err->gtt_offset, 622c724e8a9407683a8a2ee8eb00b972badf237bbe1Chris Wilson err->size, 623c724e8a9407683a8a2ee8eb00b972badf237bbe1Chris Wilson err->read_domains, 624c724e8a9407683a8a2ee8eb00b972badf237bbe1Chris Wilson err->write_domain, 625c724e8a9407683a8a2ee8eb00b972badf237bbe1Chris Wilson err->seqno, 626c724e8a9407683a8a2ee8eb00b972badf237bbe1Chris Wilson pin_flag(err->pinned), 627c724e8a9407683a8a2ee8eb00b972badf237bbe1Chris Wilson tiling_flag(err->tiling), 628c724e8a9407683a8a2ee8eb00b972badf237bbe1Chris Wilson dirty_flag(err->dirty), 629c724e8a9407683a8a2ee8eb00b972badf237bbe1Chris Wilson purgeable_flag(err->purgeable), 630c724e8a9407683a8a2ee8eb00b972badf237bbe1Chris Wilson ring_str(err->ring)); 631c724e8a9407683a8a2ee8eb00b972badf237bbe1Chris Wilson 632c724e8a9407683a8a2ee8eb00b972badf237bbe1Chris Wilson if (err->name) 633c724e8a9407683a8a2ee8eb00b972badf237bbe1Chris Wilson seq_printf(m, " (name: %d)", err->name); 634c724e8a9407683a8a2ee8eb00b972badf237bbe1Chris Wilson if (err->fence_reg != I915_FENCE_REG_NONE) 635c724e8a9407683a8a2ee8eb00b972badf237bbe1Chris Wilson seq_printf(m, " (fence: %d)", err->fence_reg); 636c724e8a9407683a8a2ee8eb00b972badf237bbe1Chris Wilson 637c724e8a9407683a8a2ee8eb00b972badf237bbe1Chris Wilson seq_printf(m, "\n"); 638c724e8a9407683a8a2ee8eb00b972badf237bbe1Chris Wilson err++; 639c724e8a9407683a8a2ee8eb00b972badf237bbe1Chris Wilson } 640c724e8a9407683a8a2ee8eb00b972badf237bbe1Chris Wilson} 641c724e8a9407683a8a2ee8eb00b972badf237bbe1Chris Wilson 64263eeaf38251183ec2b1caee11e4a2c040cb5ce6cJesse Barnesstatic int i915_error_state(struct seq_file *m, void *unused) 64363eeaf38251183ec2b1caee11e4a2c040cb5ce6cJesse Barnes{ 64463eeaf38251183ec2b1caee11e4a2c040cb5ce6cJesse Barnes struct drm_info_node *node = (struct drm_info_node *) m->private; 64563eeaf38251183ec2b1caee11e4a2c040cb5ce6cJesse Barnes struct drm_device *dev = node->minor->dev; 64663eeaf38251183ec2b1caee11e4a2c040cb5ce6cJesse Barnes drm_i915_private_t *dev_priv = dev->dev_private; 64763eeaf38251183ec2b1caee11e4a2c040cb5ce6cJesse Barnes struct drm_i915_error_state *error; 64863eeaf38251183ec2b1caee11e4a2c040cb5ce6cJesse Barnes unsigned long flags; 6499df30794f609d9412f14cfd0eb7b45dd64d0b14eChris Wilson int i, page, offset, elt; 65063eeaf38251183ec2b1caee11e4a2c040cb5ce6cJesse Barnes 65163eeaf38251183ec2b1caee11e4a2c040cb5ce6cJesse Barnes spin_lock_irqsave(&dev_priv->error_lock, flags); 65263eeaf38251183ec2b1caee11e4a2c040cb5ce6cJesse Barnes if (!dev_priv->first_error) { 65363eeaf38251183ec2b1caee11e4a2c040cb5ce6cJesse Barnes seq_printf(m, "no error state collected\n"); 65463eeaf38251183ec2b1caee11e4a2c040cb5ce6cJesse Barnes goto out; 65563eeaf38251183ec2b1caee11e4a2c040cb5ce6cJesse Barnes } 65663eeaf38251183ec2b1caee11e4a2c040cb5ce6cJesse Barnes 65763eeaf38251183ec2b1caee11e4a2c040cb5ce6cJesse Barnes error = dev_priv->first_error; 65863eeaf38251183ec2b1caee11e4a2c040cb5ce6cJesse Barnes 6598a90523639f49dc4b4fa7ae47bb9c8ed73ea8577Jesse Barnes seq_printf(m, "Time: %ld s %ld us\n", error->time.tv_sec, 6608a90523639f49dc4b4fa7ae47bb9c8ed73ea8577Jesse Barnes error->time.tv_usec); 6619df30794f609d9412f14cfd0eb7b45dd64d0b14eChris Wilson seq_printf(m, "PCI ID: 0x%04x\n", dev->pci_device); 6621d8f38f4e7146d22f7fbc94eef0508bd75463f54Chris Wilson seq_printf(m, "EIR: 0x%08x\n", error->eir); 6631d8f38f4e7146d22f7fbc94eef0508bd75463f54Chris Wilson seq_printf(m, "PGTBL_ER: 0x%08x\n", error->pgtbl_er); 664f406839f094ef24bb201c9574fdb9ce8e799a975Chris Wilson if (INTEL_INFO(dev)->gen >= 6) { 665f406839f094ef24bb201c9574fdb9ce8e799a975Chris Wilson seq_printf(m, "ERROR: 0x%08x\n", error->error); 6661d8f38f4e7146d22f7fbc94eef0508bd75463f54Chris Wilson seq_printf(m, "Blitter command stream:\n"); 6671d8f38f4e7146d22f7fbc94eef0508bd75463f54Chris Wilson seq_printf(m, " ACTHD: 0x%08x\n", error->bcs_acthd); 6681d8f38f4e7146d22f7fbc94eef0508bd75463f54Chris Wilson seq_printf(m, " IPEIR: 0x%08x\n", error->bcs_ipeir); 669e5c652603680404683fd1f262b511340545179a2Chris Wilson seq_printf(m, " IPEHR: 0x%08x\n", error->bcs_ipehr); 6701d8f38f4e7146d22f7fbc94eef0508bd75463f54Chris Wilson seq_printf(m, " INSTDONE: 0x%08x\n", error->bcs_instdone); 6711d8f38f4e7146d22f7fbc94eef0508bd75463f54Chris Wilson seq_printf(m, " seqno: 0x%08x\n", error->bcs_seqno); 672add354ddf62beac55ca3ba64835dd703a0649867Chris Wilson seq_printf(m, "Video (BSD) command stream:\n"); 673add354ddf62beac55ca3ba64835dd703a0649867Chris Wilson seq_printf(m, " ACTHD: 0x%08x\n", error->vcs_acthd); 674add354ddf62beac55ca3ba64835dd703a0649867Chris Wilson seq_printf(m, " IPEIR: 0x%08x\n", error->vcs_ipeir); 675e5c652603680404683fd1f262b511340545179a2Chris Wilson seq_printf(m, " IPEHR: 0x%08x\n", error->vcs_ipehr); 676add354ddf62beac55ca3ba64835dd703a0649867Chris Wilson seq_printf(m, " INSTDONE: 0x%08x\n", error->vcs_instdone); 677add354ddf62beac55ca3ba64835dd703a0649867Chris Wilson seq_printf(m, " seqno: 0x%08x\n", error->vcs_seqno); 678f406839f094ef24bb201c9574fdb9ce8e799a975Chris Wilson } 6791d8f38f4e7146d22f7fbc94eef0508bd75463f54Chris Wilson seq_printf(m, "Render command stream:\n"); 6801d8f38f4e7146d22f7fbc94eef0508bd75463f54Chris Wilson seq_printf(m, " ACTHD: 0x%08x\n", error->acthd); 68163eeaf38251183ec2b1caee11e4a2c040cb5ce6cJesse Barnes seq_printf(m, " IPEIR: 0x%08x\n", error->ipeir); 68263eeaf38251183ec2b1caee11e4a2c040cb5ce6cJesse Barnes seq_printf(m, " IPEHR: 0x%08x\n", error->ipehr); 68363eeaf38251183ec2b1caee11e4a2c040cb5ce6cJesse Barnes seq_printf(m, " INSTDONE: 0x%08x\n", error->instdone); 684a6c45cf013a57e32ddae43dd4ac911eb4a3919fdChris Wilson if (INTEL_INFO(dev)->gen >= 4) { 68563eeaf38251183ec2b1caee11e4a2c040cb5ce6cJesse Barnes seq_printf(m, " INSTDONE1: 0x%08x\n", error->instdone1); 6861d8f38f4e7146d22f7fbc94eef0508bd75463f54Chris Wilson seq_printf(m, " INSTPS: 0x%08x\n", error->instps); 68763eeaf38251183ec2b1caee11e4a2c040cb5ce6cJesse Barnes } 6881d8f38f4e7146d22f7fbc94eef0508bd75463f54Chris Wilson seq_printf(m, " INSTPM: 0x%08x\n", error->instpm); 6891d8f38f4e7146d22f7fbc94eef0508bd75463f54Chris Wilson seq_printf(m, " seqno: 0x%08x\n", error->seqno); 6909df30794f609d9412f14cfd0eb7b45dd64d0b14eChris Wilson 691c724e8a9407683a8a2ee8eb00b972badf237bbe1Chris Wilson if (error->active_bo) 692c724e8a9407683a8a2ee8eb00b972badf237bbe1Chris Wilson print_error_buffers(m, "Active", 693c724e8a9407683a8a2ee8eb00b972badf237bbe1Chris Wilson error->active_bo, 694c724e8a9407683a8a2ee8eb00b972badf237bbe1Chris Wilson error->active_bo_count); 695c724e8a9407683a8a2ee8eb00b972badf237bbe1Chris Wilson 696c724e8a9407683a8a2ee8eb00b972badf237bbe1Chris Wilson if (error->pinned_bo) 697c724e8a9407683a8a2ee8eb00b972badf237bbe1Chris Wilson print_error_buffers(m, "Pinned", 698c724e8a9407683a8a2ee8eb00b972badf237bbe1Chris Wilson error->pinned_bo, 699c724e8a9407683a8a2ee8eb00b972badf237bbe1Chris Wilson error->pinned_bo_count); 7009df30794f609d9412f14cfd0eb7b45dd64d0b14eChris Wilson 7019df30794f609d9412f14cfd0eb7b45dd64d0b14eChris Wilson for (i = 0; i < ARRAY_SIZE(error->batchbuffer); i++) { 7029df30794f609d9412f14cfd0eb7b45dd64d0b14eChris Wilson if (error->batchbuffer[i]) { 7039df30794f609d9412f14cfd0eb7b45dd64d0b14eChris Wilson struct drm_i915_error_object *obj = error->batchbuffer[i]; 7049df30794f609d9412f14cfd0eb7b45dd64d0b14eChris Wilson 7059df30794f609d9412f14cfd0eb7b45dd64d0b14eChris Wilson seq_printf(m, "--- gtt_offset = 0x%08x\n", obj->gtt_offset); 7069df30794f609d9412f14cfd0eb7b45dd64d0b14eChris Wilson offset = 0; 7079df30794f609d9412f14cfd0eb7b45dd64d0b14eChris Wilson for (page = 0; page < obj->page_count; page++) { 7089df30794f609d9412f14cfd0eb7b45dd64d0b14eChris Wilson for (elt = 0; elt < PAGE_SIZE/4; elt++) { 7099df30794f609d9412f14cfd0eb7b45dd64d0b14eChris Wilson seq_printf(m, "%08x : %08x\n", offset, obj->pages[page][elt]); 7109df30794f609d9412f14cfd0eb7b45dd64d0b14eChris Wilson offset += 4; 7119df30794f609d9412f14cfd0eb7b45dd64d0b14eChris Wilson } 7129df30794f609d9412f14cfd0eb7b45dd64d0b14eChris Wilson } 7139df30794f609d9412f14cfd0eb7b45dd64d0b14eChris Wilson } 7149df30794f609d9412f14cfd0eb7b45dd64d0b14eChris Wilson } 7159df30794f609d9412f14cfd0eb7b45dd64d0b14eChris Wilson 7169df30794f609d9412f14cfd0eb7b45dd64d0b14eChris Wilson if (error->ringbuffer) { 7179df30794f609d9412f14cfd0eb7b45dd64d0b14eChris Wilson struct drm_i915_error_object *obj = error->ringbuffer; 7189df30794f609d9412f14cfd0eb7b45dd64d0b14eChris Wilson 7199df30794f609d9412f14cfd0eb7b45dd64d0b14eChris Wilson seq_printf(m, "--- ringbuffer = 0x%08x\n", obj->gtt_offset); 7209df30794f609d9412f14cfd0eb7b45dd64d0b14eChris Wilson offset = 0; 7219df30794f609d9412f14cfd0eb7b45dd64d0b14eChris Wilson for (page = 0; page < obj->page_count; page++) { 7229df30794f609d9412f14cfd0eb7b45dd64d0b14eChris Wilson for (elt = 0; elt < PAGE_SIZE/4; elt++) { 7239df30794f609d9412f14cfd0eb7b45dd64d0b14eChris Wilson seq_printf(m, "%08x : %08x\n", offset, obj->pages[page][elt]); 7249df30794f609d9412f14cfd0eb7b45dd64d0b14eChris Wilson offset += 4; 7259df30794f609d9412f14cfd0eb7b45dd64d0b14eChris Wilson } 7269df30794f609d9412f14cfd0eb7b45dd64d0b14eChris Wilson } 7279df30794f609d9412f14cfd0eb7b45dd64d0b14eChris Wilson } 72863eeaf38251183ec2b1caee11e4a2c040cb5ce6cJesse Barnes 7296ef3d4278034982c13df87c4a51e0445f762d316Chris Wilson if (error->overlay) 7306ef3d4278034982c13df87c4a51e0445f762d316Chris Wilson intel_overlay_print_error_state(m, error->overlay); 7316ef3d4278034982c13df87c4a51e0445f762d316Chris Wilson 73263eeaf38251183ec2b1caee11e4a2c040cb5ce6cJesse Barnesout: 73363eeaf38251183ec2b1caee11e4a2c040cb5ce6cJesse Barnes spin_unlock_irqrestore(&dev_priv->error_lock, flags); 73463eeaf38251183ec2b1caee11e4a2c040cb5ce6cJesse Barnes 73563eeaf38251183ec2b1caee11e4a2c040cb5ce6cJesse Barnes return 0; 73663eeaf38251183ec2b1caee11e4a2c040cb5ce6cJesse Barnes} 7376911a9b8ae8b2a1dab4dfda9c2bd20f7ca2961d6Ben Gamari 738f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnesstatic int i915_rstdby_delays(struct seq_file *m, void *unused) 739f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes{ 740f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes struct drm_info_node *node = (struct drm_info_node *) m->private; 741f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes struct drm_device *dev = node->minor->dev; 742f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes drm_i915_private_t *dev_priv = dev->dev_private; 743f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes u16 crstanddelay = I915_READ16(CRSTANDVID); 744f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes 745f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes seq_printf(m, "w/ctx: %d, w/o ctx: %d\n", (crstanddelay >> 8) & 0x3f, (crstanddelay & 0x3f)); 746f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes 747f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes return 0; 748f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes} 749f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes 750f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnesstatic int i915_cur_delayinfo(struct seq_file *m, void *unused) 751f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes{ 752f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes struct drm_info_node *node = (struct drm_info_node *) m->private; 753f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes struct drm_device *dev = node->minor->dev; 754f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes drm_i915_private_t *dev_priv = dev->dev_private; 755f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes u16 rgvswctl = I915_READ16(MEMSWCTL); 7567648fa99eb77a2e1a90b7beaa420e07d819b9c11Jesse Barnes u16 rgvstat = I915_READ16(MEMSTAT_ILK); 757f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes 7587648fa99eb77a2e1a90b7beaa420e07d819b9c11Jesse Barnes seq_printf(m, "Requested P-state: %d\n", (rgvswctl >> 8) & 0xf); 7597648fa99eb77a2e1a90b7beaa420e07d819b9c11Jesse Barnes seq_printf(m, "Requested VID: %d\n", rgvswctl & 0x3f); 7607648fa99eb77a2e1a90b7beaa420e07d819b9c11Jesse Barnes seq_printf(m, "Current VID: %d\n", (rgvstat & MEMSTAT_VID_MASK) >> 7617648fa99eb77a2e1a90b7beaa420e07d819b9c11Jesse Barnes MEMSTAT_VID_SHIFT); 7627648fa99eb77a2e1a90b7beaa420e07d819b9c11Jesse Barnes seq_printf(m, "Current P-state: %d\n", 7637648fa99eb77a2e1a90b7beaa420e07d819b9c11Jesse Barnes (rgvstat & MEMSTAT_PSTATE_MASK) >> MEMSTAT_PSTATE_SHIFT); 764f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes 765f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes return 0; 766f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes} 767f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes 768f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnesstatic int i915_delayfreq_table(struct seq_file *m, void *unused) 769f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes{ 770f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes struct drm_info_node *node = (struct drm_info_node *) m->private; 771f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes struct drm_device *dev = node->minor->dev; 772f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes drm_i915_private_t *dev_priv = dev->dev_private; 773f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes u32 delayfreq; 774f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes int i; 775f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes 776f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes for (i = 0; i < 16; i++) { 777f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes delayfreq = I915_READ(PXVFREQ_BASE + i * 4); 7787648fa99eb77a2e1a90b7beaa420e07d819b9c11Jesse Barnes seq_printf(m, "P%02dVIDFREQ: 0x%08x (VID: %d)\n", i, delayfreq, 7797648fa99eb77a2e1a90b7beaa420e07d819b9c11Jesse Barnes (delayfreq & PXVFREQ_PX_MASK) >> PXVFREQ_PX_SHIFT); 780f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes } 781f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes 782f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes return 0; 783f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes} 784f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes 785f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnesstatic inline int MAP_TO_MV(int map) 786f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes{ 787f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes return 1250 - (map * 25); 788f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes} 789f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes 790f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnesstatic int i915_inttoext_table(struct seq_file *m, void *unused) 791f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes{ 792f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes struct drm_info_node *node = (struct drm_info_node *) m->private; 793f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes struct drm_device *dev = node->minor->dev; 794f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes drm_i915_private_t *dev_priv = dev->dev_private; 795f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes u32 inttoext; 796f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes int i; 797f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes 798f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes for (i = 1; i <= 32; i++) { 799f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes inttoext = I915_READ(INTTOEXT_BASE_ILK + i * 4); 800f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes seq_printf(m, "INTTOEXT%02d: 0x%08x\n", i, inttoext); 801f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes } 802f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes 803f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes return 0; 804f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes} 805f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes 806f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnesstatic int i915_drpc_info(struct seq_file *m, void *unused) 807f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes{ 808f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes struct drm_info_node *node = (struct drm_info_node *) m->private; 809f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes struct drm_device *dev = node->minor->dev; 810f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes drm_i915_private_t *dev_priv = dev->dev_private; 811f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes u32 rgvmodectl = I915_READ(MEMMODECTL); 8127648fa99eb77a2e1a90b7beaa420e07d819b9c11Jesse Barnes u32 rstdbyctl = I915_READ(MCHBAR_RENDER_STANDBY); 8137648fa99eb77a2e1a90b7beaa420e07d819b9c11Jesse Barnes u16 crstandvid = I915_READ16(CRSTANDVID); 814f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes 815f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes seq_printf(m, "HD boost: %s\n", (rgvmodectl & MEMMODE_BOOST_EN) ? 816f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes "yes" : "no"); 817f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes seq_printf(m, "Boost freq: %d\n", 818f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes (rgvmodectl & MEMMODE_BOOST_FREQ_MASK) >> 819f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes MEMMODE_BOOST_FREQ_SHIFT); 820f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes seq_printf(m, "HW control enabled: %s\n", 821f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes rgvmodectl & MEMMODE_HWIDLE_EN ? "yes" : "no"); 822f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes seq_printf(m, "SW control enabled: %s\n", 823f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes rgvmodectl & MEMMODE_SWMODE_EN ? "yes" : "no"); 824f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes seq_printf(m, "Gated voltage change: %s\n", 825f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes rgvmodectl & MEMMODE_RCLK_GATE ? "yes" : "no"); 826f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes seq_printf(m, "Starting frequency: P%d\n", 827f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes (rgvmodectl & MEMMODE_FSTART_MASK) >> MEMMODE_FSTART_SHIFT); 8287648fa99eb77a2e1a90b7beaa420e07d819b9c11Jesse Barnes seq_printf(m, "Max P-state: P%d\n", 829f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes (rgvmodectl & MEMMODE_FMAX_MASK) >> MEMMODE_FMAX_SHIFT); 8307648fa99eb77a2e1a90b7beaa420e07d819b9c11Jesse Barnes seq_printf(m, "Min P-state: P%d\n", (rgvmodectl & MEMMODE_FMIN_MASK)); 8317648fa99eb77a2e1a90b7beaa420e07d819b9c11Jesse Barnes seq_printf(m, "RS1 VID: %d\n", (crstandvid & 0x3f)); 8327648fa99eb77a2e1a90b7beaa420e07d819b9c11Jesse Barnes seq_printf(m, "RS2 VID: %d\n", ((crstandvid >> 8) & 0x3f)); 8337648fa99eb77a2e1a90b7beaa420e07d819b9c11Jesse Barnes seq_printf(m, "Render standby enabled: %s\n", 8347648fa99eb77a2e1a90b7beaa420e07d819b9c11Jesse Barnes (rstdbyctl & RCX_SW_EXIT) ? "no" : "yes"); 835f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes 836f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes return 0; 837f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes} 838f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes 839b5e50c3f56ee4aa0d0168eab5ece413ac5df76aaJesse Barnesstatic int i915_fbc_status(struct seq_file *m, void *unused) 840b5e50c3f56ee4aa0d0168eab5ece413ac5df76aaJesse Barnes{ 841b5e50c3f56ee4aa0d0168eab5ece413ac5df76aaJesse Barnes struct drm_info_node *node = (struct drm_info_node *) m->private; 842b5e50c3f56ee4aa0d0168eab5ece413ac5df76aaJesse Barnes struct drm_device *dev = node->minor->dev; 843b5e50c3f56ee4aa0d0168eab5ece413ac5df76aaJesse Barnes drm_i915_private_t *dev_priv = dev->dev_private; 844b5e50c3f56ee4aa0d0168eab5ece413ac5df76aaJesse Barnes 845ee5382aedf669127bf672a3fc5313247fc288e26Adam Jackson if (!I915_HAS_FBC(dev)) { 846b5e50c3f56ee4aa0d0168eab5ece413ac5df76aaJesse Barnes seq_printf(m, "FBC unsupported on this chipset\n"); 847b5e50c3f56ee4aa0d0168eab5ece413ac5df76aaJesse Barnes return 0; 848b5e50c3f56ee4aa0d0168eab5ece413ac5df76aaJesse Barnes } 849b5e50c3f56ee4aa0d0168eab5ece413ac5df76aaJesse Barnes 850ee5382aedf669127bf672a3fc5313247fc288e26Adam Jackson if (intel_fbc_enabled(dev)) { 851b5e50c3f56ee4aa0d0168eab5ece413ac5df76aaJesse Barnes seq_printf(m, "FBC enabled\n"); 852b5e50c3f56ee4aa0d0168eab5ece413ac5df76aaJesse Barnes } else { 853b5e50c3f56ee4aa0d0168eab5ece413ac5df76aaJesse Barnes seq_printf(m, "FBC disabled: "); 854b5e50c3f56ee4aa0d0168eab5ece413ac5df76aaJesse Barnes switch (dev_priv->no_fbc_reason) { 855bed4a6734b5f56ffd240fdda755b6eb589d32482Chris Wilson case FBC_NO_OUTPUT: 856bed4a6734b5f56ffd240fdda755b6eb589d32482Chris Wilson seq_printf(m, "no outputs"); 857bed4a6734b5f56ffd240fdda755b6eb589d32482Chris Wilson break; 858b5e50c3f56ee4aa0d0168eab5ece413ac5df76aaJesse Barnes case FBC_STOLEN_TOO_SMALL: 859b5e50c3f56ee4aa0d0168eab5ece413ac5df76aaJesse Barnes seq_printf(m, "not enough stolen memory"); 860b5e50c3f56ee4aa0d0168eab5ece413ac5df76aaJesse Barnes break; 861b5e50c3f56ee4aa0d0168eab5ece413ac5df76aaJesse Barnes case FBC_UNSUPPORTED_MODE: 862b5e50c3f56ee4aa0d0168eab5ece413ac5df76aaJesse Barnes seq_printf(m, "mode not supported"); 863b5e50c3f56ee4aa0d0168eab5ece413ac5df76aaJesse Barnes break; 864b5e50c3f56ee4aa0d0168eab5ece413ac5df76aaJesse Barnes case FBC_MODE_TOO_LARGE: 865b5e50c3f56ee4aa0d0168eab5ece413ac5df76aaJesse Barnes seq_printf(m, "mode too large"); 866b5e50c3f56ee4aa0d0168eab5ece413ac5df76aaJesse Barnes break; 867b5e50c3f56ee4aa0d0168eab5ece413ac5df76aaJesse Barnes case FBC_BAD_PLANE: 868b5e50c3f56ee4aa0d0168eab5ece413ac5df76aaJesse Barnes seq_printf(m, "FBC unsupported on plane"); 869b5e50c3f56ee4aa0d0168eab5ece413ac5df76aaJesse Barnes break; 870b5e50c3f56ee4aa0d0168eab5ece413ac5df76aaJesse Barnes case FBC_NOT_TILED: 871b5e50c3f56ee4aa0d0168eab5ece413ac5df76aaJesse Barnes seq_printf(m, "scanout buffer not tiled"); 872b5e50c3f56ee4aa0d0168eab5ece413ac5df76aaJesse Barnes break; 8739c928d168d4030a230a7a5ee1764721d173f1153Jesse Barnes case FBC_MULTIPLE_PIPES: 8749c928d168d4030a230a7a5ee1764721d173f1153Jesse Barnes seq_printf(m, "multiple pipes are enabled"); 8759c928d168d4030a230a7a5ee1764721d173f1153Jesse Barnes break; 876b5e50c3f56ee4aa0d0168eab5ece413ac5df76aaJesse Barnes default: 877b5e50c3f56ee4aa0d0168eab5ece413ac5df76aaJesse Barnes seq_printf(m, "unknown reason"); 878b5e50c3f56ee4aa0d0168eab5ece413ac5df76aaJesse Barnes } 879b5e50c3f56ee4aa0d0168eab5ece413ac5df76aaJesse Barnes seq_printf(m, "\n"); 880b5e50c3f56ee4aa0d0168eab5ece413ac5df76aaJesse Barnes } 881b5e50c3f56ee4aa0d0168eab5ece413ac5df76aaJesse Barnes return 0; 882b5e50c3f56ee4aa0d0168eab5ece413ac5df76aaJesse Barnes} 883b5e50c3f56ee4aa0d0168eab5ece413ac5df76aaJesse Barnes 8844a9bef37e5cf2c73b61ecc9ead52cad2eb4a372bJesse Barnesstatic int i915_sr_status(struct seq_file *m, void *unused) 8854a9bef37e5cf2c73b61ecc9ead52cad2eb4a372bJesse Barnes{ 8864a9bef37e5cf2c73b61ecc9ead52cad2eb4a372bJesse Barnes struct drm_info_node *node = (struct drm_info_node *) m->private; 8874a9bef37e5cf2c73b61ecc9ead52cad2eb4a372bJesse Barnes struct drm_device *dev = node->minor->dev; 8884a9bef37e5cf2c73b61ecc9ead52cad2eb4a372bJesse Barnes drm_i915_private_t *dev_priv = dev->dev_private; 8894a9bef37e5cf2c73b61ecc9ead52cad2eb4a372bJesse Barnes bool sr_enabled = false; 8904a9bef37e5cf2c73b61ecc9ead52cad2eb4a372bJesse Barnes 891f00a3ddf91d596bece5fa31e8ce2e8a3b4c0623bChris Wilson if (IS_GEN5(dev)) 8925ba2aaaaa1a282a71c27f385a743f0d86f3484caChris Wilson sr_enabled = I915_READ(WM1_LP_ILK) & WM1_LP_SR_EN; 893a6c45cf013a57e32ddae43dd4ac911eb4a3919fdChris Wilson else if (IS_CRESTLINE(dev) || IS_I945G(dev) || IS_I945GM(dev)) 8944a9bef37e5cf2c73b61ecc9ead52cad2eb4a372bJesse Barnes sr_enabled = I915_READ(FW_BLC_SELF) & FW_BLC_SELF_EN; 8954a9bef37e5cf2c73b61ecc9ead52cad2eb4a372bJesse Barnes else if (IS_I915GM(dev)) 8964a9bef37e5cf2c73b61ecc9ead52cad2eb4a372bJesse Barnes sr_enabled = I915_READ(INSTPM) & INSTPM_SELF_EN; 8974a9bef37e5cf2c73b61ecc9ead52cad2eb4a372bJesse Barnes else if (IS_PINEVIEW(dev)) 8984a9bef37e5cf2c73b61ecc9ead52cad2eb4a372bJesse Barnes sr_enabled = I915_READ(DSPFW3) & PINEVIEW_SELF_REFRESH_EN; 8994a9bef37e5cf2c73b61ecc9ead52cad2eb4a372bJesse Barnes 9005ba2aaaaa1a282a71c27f385a743f0d86f3484caChris Wilson seq_printf(m, "self-refresh: %s\n", 9015ba2aaaaa1a282a71c27f385a743f0d86f3484caChris Wilson sr_enabled ? "enabled" : "disabled"); 9024a9bef37e5cf2c73b61ecc9ead52cad2eb4a372bJesse Barnes 9034a9bef37e5cf2c73b61ecc9ead52cad2eb4a372bJesse Barnes return 0; 9044a9bef37e5cf2c73b61ecc9ead52cad2eb4a372bJesse Barnes} 9054a9bef37e5cf2c73b61ecc9ead52cad2eb4a372bJesse Barnes 9067648fa99eb77a2e1a90b7beaa420e07d819b9c11Jesse Barnesstatic int i915_emon_status(struct seq_file *m, void *unused) 9077648fa99eb77a2e1a90b7beaa420e07d819b9c11Jesse Barnes{ 9087648fa99eb77a2e1a90b7beaa420e07d819b9c11Jesse Barnes struct drm_info_node *node = (struct drm_info_node *) m->private; 9097648fa99eb77a2e1a90b7beaa420e07d819b9c11Jesse Barnes struct drm_device *dev = node->minor->dev; 9107648fa99eb77a2e1a90b7beaa420e07d819b9c11Jesse Barnes drm_i915_private_t *dev_priv = dev->dev_private; 9117648fa99eb77a2e1a90b7beaa420e07d819b9c11Jesse Barnes unsigned long temp, chipset, gfx; 912de227ef0907258359d53e3e1530c1f3678eb2bb9Chris Wilson int ret; 913de227ef0907258359d53e3e1530c1f3678eb2bb9Chris Wilson 914de227ef0907258359d53e3e1530c1f3678eb2bb9Chris Wilson ret = mutex_lock_interruptible(&dev->struct_mutex); 915de227ef0907258359d53e3e1530c1f3678eb2bb9Chris Wilson if (ret) 916de227ef0907258359d53e3e1530c1f3678eb2bb9Chris Wilson return ret; 9177648fa99eb77a2e1a90b7beaa420e07d819b9c11Jesse Barnes 9187648fa99eb77a2e1a90b7beaa420e07d819b9c11Jesse Barnes temp = i915_mch_val(dev_priv); 9197648fa99eb77a2e1a90b7beaa420e07d819b9c11Jesse Barnes chipset = i915_chipset_val(dev_priv); 9207648fa99eb77a2e1a90b7beaa420e07d819b9c11Jesse Barnes gfx = i915_gfx_val(dev_priv); 921de227ef0907258359d53e3e1530c1f3678eb2bb9Chris Wilson mutex_unlock(&dev->struct_mutex); 9227648fa99eb77a2e1a90b7beaa420e07d819b9c11Jesse Barnes 9237648fa99eb77a2e1a90b7beaa420e07d819b9c11Jesse Barnes seq_printf(m, "GMCH temp: %ld\n", temp); 9247648fa99eb77a2e1a90b7beaa420e07d819b9c11Jesse Barnes seq_printf(m, "Chipset power: %ld\n", chipset); 9257648fa99eb77a2e1a90b7beaa420e07d819b9c11Jesse Barnes seq_printf(m, "GFX power: %ld\n", gfx); 9267648fa99eb77a2e1a90b7beaa420e07d819b9c11Jesse Barnes seq_printf(m, "Total power: %ld\n", chipset + gfx); 9277648fa99eb77a2e1a90b7beaa420e07d819b9c11Jesse Barnes 9287648fa99eb77a2e1a90b7beaa420e07d819b9c11Jesse Barnes return 0; 9297648fa99eb77a2e1a90b7beaa420e07d819b9c11Jesse Barnes} 9307648fa99eb77a2e1a90b7beaa420e07d819b9c11Jesse Barnes 9317648fa99eb77a2e1a90b7beaa420e07d819b9c11Jesse Barnesstatic int i915_gfxec(struct seq_file *m, void *unused) 9327648fa99eb77a2e1a90b7beaa420e07d819b9c11Jesse Barnes{ 9337648fa99eb77a2e1a90b7beaa420e07d819b9c11Jesse Barnes struct drm_info_node *node = (struct drm_info_node *) m->private; 9347648fa99eb77a2e1a90b7beaa420e07d819b9c11Jesse Barnes struct drm_device *dev = node->minor->dev; 9357648fa99eb77a2e1a90b7beaa420e07d819b9c11Jesse Barnes drm_i915_private_t *dev_priv = dev->dev_private; 9367648fa99eb77a2e1a90b7beaa420e07d819b9c11Jesse Barnes 9377648fa99eb77a2e1a90b7beaa420e07d819b9c11Jesse Barnes seq_printf(m, "GFXEC: %ld\n", (unsigned long)I915_READ(0x112f4)); 9387648fa99eb77a2e1a90b7beaa420e07d819b9c11Jesse Barnes 9397648fa99eb77a2e1a90b7beaa420e07d819b9c11Jesse Barnes return 0; 9407648fa99eb77a2e1a90b7beaa420e07d819b9c11Jesse Barnes} 9417648fa99eb77a2e1a90b7beaa420e07d819b9c11Jesse Barnes 94244834a67c0082e2cf74b16be91e49108b1432d65Chris Wilsonstatic int i915_opregion(struct seq_file *m, void *unused) 94344834a67c0082e2cf74b16be91e49108b1432d65Chris Wilson{ 94444834a67c0082e2cf74b16be91e49108b1432d65Chris Wilson struct drm_info_node *node = (struct drm_info_node *) m->private; 94544834a67c0082e2cf74b16be91e49108b1432d65Chris Wilson struct drm_device *dev = node->minor->dev; 94644834a67c0082e2cf74b16be91e49108b1432d65Chris Wilson drm_i915_private_t *dev_priv = dev->dev_private; 94744834a67c0082e2cf74b16be91e49108b1432d65Chris Wilson struct intel_opregion *opregion = &dev_priv->opregion; 94844834a67c0082e2cf74b16be91e49108b1432d65Chris Wilson int ret; 94944834a67c0082e2cf74b16be91e49108b1432d65Chris Wilson 95044834a67c0082e2cf74b16be91e49108b1432d65Chris Wilson ret = mutex_lock_interruptible(&dev->struct_mutex); 95144834a67c0082e2cf74b16be91e49108b1432d65Chris Wilson if (ret) 95244834a67c0082e2cf74b16be91e49108b1432d65Chris Wilson return ret; 95344834a67c0082e2cf74b16be91e49108b1432d65Chris Wilson 95444834a67c0082e2cf74b16be91e49108b1432d65Chris Wilson if (opregion->header) 95544834a67c0082e2cf74b16be91e49108b1432d65Chris Wilson seq_write(m, opregion->header, OPREGION_SIZE); 95644834a67c0082e2cf74b16be91e49108b1432d65Chris Wilson 95744834a67c0082e2cf74b16be91e49108b1432d65Chris Wilson mutex_unlock(&dev->struct_mutex); 95844834a67c0082e2cf74b16be91e49108b1432d65Chris Wilson 95944834a67c0082e2cf74b16be91e49108b1432d65Chris Wilson return 0; 96044834a67c0082e2cf74b16be91e49108b1432d65Chris Wilson} 96144834a67c0082e2cf74b16be91e49108b1432d65Chris Wilson 96237811fcc9188f748407646e1157f3ed24ae181a4Chris Wilsonstatic int i915_gem_framebuffer_info(struct seq_file *m, void *data) 96337811fcc9188f748407646e1157f3ed24ae181a4Chris Wilson{ 96437811fcc9188f748407646e1157f3ed24ae181a4Chris Wilson struct drm_info_node *node = (struct drm_info_node *) m->private; 96537811fcc9188f748407646e1157f3ed24ae181a4Chris Wilson struct drm_device *dev = node->minor->dev; 96637811fcc9188f748407646e1157f3ed24ae181a4Chris Wilson drm_i915_private_t *dev_priv = dev->dev_private; 96737811fcc9188f748407646e1157f3ed24ae181a4Chris Wilson struct intel_fbdev *ifbdev; 96837811fcc9188f748407646e1157f3ed24ae181a4Chris Wilson struct intel_framebuffer *fb; 96937811fcc9188f748407646e1157f3ed24ae181a4Chris Wilson int ret; 97037811fcc9188f748407646e1157f3ed24ae181a4Chris Wilson 97137811fcc9188f748407646e1157f3ed24ae181a4Chris Wilson ret = mutex_lock_interruptible(&dev->mode_config.mutex); 97237811fcc9188f748407646e1157f3ed24ae181a4Chris Wilson if (ret) 97337811fcc9188f748407646e1157f3ed24ae181a4Chris Wilson return ret; 97437811fcc9188f748407646e1157f3ed24ae181a4Chris Wilson 97537811fcc9188f748407646e1157f3ed24ae181a4Chris Wilson ifbdev = dev_priv->fbdev; 97637811fcc9188f748407646e1157f3ed24ae181a4Chris Wilson fb = to_intel_framebuffer(ifbdev->helper.fb); 97737811fcc9188f748407646e1157f3ed24ae181a4Chris Wilson 97837811fcc9188f748407646e1157f3ed24ae181a4Chris Wilson seq_printf(m, "fbcon size: %d x %d, depth %d, %d bpp, obj ", 97937811fcc9188f748407646e1157f3ed24ae181a4Chris Wilson fb->base.width, 98037811fcc9188f748407646e1157f3ed24ae181a4Chris Wilson fb->base.height, 98137811fcc9188f748407646e1157f3ed24ae181a4Chris Wilson fb->base.depth, 98237811fcc9188f748407646e1157f3ed24ae181a4Chris Wilson fb->base.bits_per_pixel); 98337811fcc9188f748407646e1157f3ed24ae181a4Chris Wilson describe_obj(m, to_intel_bo(fb->obj)); 98437811fcc9188f748407646e1157f3ed24ae181a4Chris Wilson seq_printf(m, "\n"); 98537811fcc9188f748407646e1157f3ed24ae181a4Chris Wilson 98637811fcc9188f748407646e1157f3ed24ae181a4Chris Wilson list_for_each_entry(fb, &dev->mode_config.fb_list, base.head) { 98737811fcc9188f748407646e1157f3ed24ae181a4Chris Wilson if (&fb->base == ifbdev->helper.fb) 98837811fcc9188f748407646e1157f3ed24ae181a4Chris Wilson continue; 98937811fcc9188f748407646e1157f3ed24ae181a4Chris Wilson 99037811fcc9188f748407646e1157f3ed24ae181a4Chris Wilson seq_printf(m, "user size: %d x %d, depth %d, %d bpp, obj ", 99137811fcc9188f748407646e1157f3ed24ae181a4Chris Wilson fb->base.width, 99237811fcc9188f748407646e1157f3ed24ae181a4Chris Wilson fb->base.height, 99337811fcc9188f748407646e1157f3ed24ae181a4Chris Wilson fb->base.depth, 99437811fcc9188f748407646e1157f3ed24ae181a4Chris Wilson fb->base.bits_per_pixel); 99537811fcc9188f748407646e1157f3ed24ae181a4Chris Wilson describe_obj(m, to_intel_bo(fb->obj)); 99637811fcc9188f748407646e1157f3ed24ae181a4Chris Wilson seq_printf(m, "\n"); 99737811fcc9188f748407646e1157f3ed24ae181a4Chris Wilson } 99837811fcc9188f748407646e1157f3ed24ae181a4Chris Wilson 99937811fcc9188f748407646e1157f3ed24ae181a4Chris Wilson mutex_unlock(&dev->mode_config.mutex); 100037811fcc9188f748407646e1157f3ed24ae181a4Chris Wilson 100137811fcc9188f748407646e1157f3ed24ae181a4Chris Wilson return 0; 100237811fcc9188f748407646e1157f3ed24ae181a4Chris Wilson} 100337811fcc9188f748407646e1157f3ed24ae181a4Chris Wilson 1004f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilsonstatic int 1005f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilsoni915_wedged_open(struct inode *inode, 1006f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson struct file *filp) 1007f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson{ 1008f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson filp->private_data = inode->i_private; 1009f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson return 0; 1010f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson} 1011f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson 1012f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilsonstatic ssize_t 1013f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilsoni915_wedged_read(struct file *filp, 1014f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson char __user *ubuf, 1015f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson size_t max, 1016f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson loff_t *ppos) 1017f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson{ 1018f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson struct drm_device *dev = filp->private_data; 1019f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson drm_i915_private_t *dev_priv = dev->dev_private; 1020f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson char buf[80]; 1021f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson int len; 1022f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson 1023f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson len = snprintf(buf, sizeof (buf), 1024f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson "wedged : %d\n", 1025f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson atomic_read(&dev_priv->mm.wedged)); 1026f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson 1027f4433a8d5d3076775bdd1a996a47db7beb468ac0Dan Carpenter if (len > sizeof (buf)) 1028f4433a8d5d3076775bdd1a996a47db7beb468ac0Dan Carpenter len = sizeof (buf); 1029f4433a8d5d3076775bdd1a996a47db7beb468ac0Dan Carpenter 1030f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson return simple_read_from_buffer(ubuf, max, ppos, buf, len); 1031f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson} 1032f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson 1033f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilsonstatic ssize_t 1034f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilsoni915_wedged_write(struct file *filp, 1035f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson const char __user *ubuf, 1036f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson size_t cnt, 1037f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson loff_t *ppos) 1038f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson{ 1039f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson struct drm_device *dev = filp->private_data; 1040f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson char buf[20]; 1041f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson int val = 1; 1042f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson 1043f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson if (cnt > 0) { 1044f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson if (cnt > sizeof (buf) - 1) 1045f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson return -EINVAL; 1046f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson 1047f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson if (copy_from_user(buf, ubuf, cnt)) 1048f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson return -EFAULT; 1049f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson buf[cnt] = 0; 1050f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson 1051f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson val = simple_strtoul(buf, NULL, 0); 1052f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson } 1053f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson 1054f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson DRM_INFO("Manually setting wedged to %d\n", val); 1055527f9e907c39f7e88abb57eaa8bccb43c8706a3dChris Wilson i915_handle_error(dev, val); 1056f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson 1057f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson return cnt; 1058f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson} 1059f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson 1060f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilsonstatic const struct file_operations i915_wedged_fops = { 1061f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson .owner = THIS_MODULE, 1062f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson .open = i915_wedged_open, 1063f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson .read = i915_wedged_read, 1064f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson .write = i915_wedged_write, 10656038f373a3dc1f1c26496e60b6c40b164716f07eArnd Bergmann .llseek = default_llseek, 1066f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson}; 1067f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson 1068f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson/* As the drm_debugfs_init() routines are called before dev->dev_private is 1069f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson * allocated we need to hook into the minor for release. */ 1070f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilsonstatic int 1071f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilsondrm_add_fake_info_node(struct drm_minor *minor, 1072f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson struct dentry *ent, 1073f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson const void *key) 1074f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson{ 1075f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson struct drm_info_node *node; 1076f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson 1077f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson node = kmalloc(sizeof(struct drm_info_node), GFP_KERNEL); 1078f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson if (node == NULL) { 1079f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson debugfs_remove(ent); 1080f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson return -ENOMEM; 1081f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson } 1082f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson 1083f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson node->minor = minor; 1084f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson node->dent = ent; 1085f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson node->info_ent = (void *) key; 1086f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson list_add(&node->list, &minor->debugfs_nodes.list); 1087f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson 1088f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson return 0; 1089f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson} 1090f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson 1091f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilsonstatic int i915_wedged_create(struct dentry *root, struct drm_minor *minor) 1092f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson{ 1093f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson struct drm_device *dev = minor->dev; 1094f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson struct dentry *ent; 1095f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson 1096f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson ent = debugfs_create_file("i915_wedged", 1097f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson S_IRUGO | S_IWUSR, 1098f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson root, dev, 1099f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson &i915_wedged_fops); 1100f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson if (IS_ERR(ent)) 1101f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson return PTR_ERR(ent); 1102f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson 1103f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson return drm_add_fake_info_node(minor, ent, &i915_wedged_fops); 1104f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson} 11059e3a6d155ed0a7636b926a798dd7221ea107b274Ben Gamari 110627c202ad7f141d4efa9c64e30bf4a4d3bcd799aeBen Gamaristatic struct drm_info_list i915_debugfs_list[] = { 110770d39fe4862c6c69c2582c829ec240e05bf24430Chris Wilson {"i915_capabilities", i915_capabilities, 0, 0}, 110873aa808f10effc280e6eb70267314542a7c29426Chris Wilson {"i915_gem_objects", i915_gem_object_info, 0}, 1109433e12f78b68a8069f54956edf766bb21394c197Ben Gamari {"i915_gem_active", i915_gem_object_list_info, 0, (void *) ACTIVE_LIST}, 1110433e12f78b68a8069f54956edf766bb21394c197Ben Gamari {"i915_gem_flushing", i915_gem_object_list_info, 0, (void *) FLUSHING_LIST}, 1111433e12f78b68a8069f54956edf766bb21394c197Ben Gamari {"i915_gem_inactive", i915_gem_object_list_info, 0, (void *) INACTIVE_LIST}, 1112f13d3f7311add99d1f874a6b67d56426afa35664Chris Wilson {"i915_gem_pinned", i915_gem_object_list_info, 0, (void *) PINNED_LIST}, 1113d21d5975686fbc107f9352006b06e1e92b4c5810Chris Wilson {"i915_gem_deferred_free", i915_gem_object_list_info, 0, (void *) DEFERRED_FREE_LIST}, 11144e5359cd053bfb7d8dabe4a63624a5726848ffbcSimon Farnsworth {"i915_gem_pageflip", i915_gem_pageflip_info, 0}, 11152017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari {"i915_gem_request", i915_gem_request_info, 0}, 11162017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari {"i915_gem_seqno", i915_gem_seqno_info, 0}, 1117a6172a80ecb7ac64151960de1f709f78b509c57cChris Wilson {"i915_gem_fence_regs", i915_gem_fence_regs_info, 0}, 11182017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari {"i915_gem_interrupt", i915_interrupt_info, 0}, 1119e5c652603680404683fd1f262b511340545179a2Chris Wilson {"i915_gem_hws", i915_hws_info, 0, (void *)RING_RENDER}, 1120e5c652603680404683fd1f262b511340545179a2Chris Wilson {"i915_gem_hws_blt", i915_hws_info, 0, (void *)RING_BLT}, 1121e5c652603680404683fd1f262b511340545179a2Chris Wilson {"i915_gem_hws_bsd", i915_hws_info, 0, (void *)RING_BSD}, 1122e5c652603680404683fd1f262b511340545179a2Chris Wilson {"i915_ringbuffer_data", i915_ringbuffer_data, 0, (void *)RING_RENDER}, 1123e5c652603680404683fd1f262b511340545179a2Chris Wilson {"i915_ringbuffer_info", i915_ringbuffer_info, 0, (void *)RING_RENDER}, 1124e5c652603680404683fd1f262b511340545179a2Chris Wilson {"i915_bsd_ringbuffer_data", i915_ringbuffer_data, 0, (void *)RING_BSD}, 1125e5c652603680404683fd1f262b511340545179a2Chris Wilson {"i915_bsd_ringbuffer_info", i915_ringbuffer_info, 0, (void *)RING_BSD}, 1126e5c652603680404683fd1f262b511340545179a2Chris Wilson {"i915_blt_ringbuffer_data", i915_ringbuffer_data, 0, (void *)RING_BLT}, 1127e5c652603680404683fd1f262b511340545179a2Chris Wilson {"i915_blt_ringbuffer_info", i915_ringbuffer_info, 0, (void *)RING_BLT}, 11286911a9b8ae8b2a1dab4dfda9c2bd20f7ca2961d6Ben Gamari {"i915_batchbuffers", i915_batchbuffer_info, 0}, 112963eeaf38251183ec2b1caee11e4a2c040cb5ce6cJesse Barnes {"i915_error_state", i915_error_state, 0}, 1130f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes {"i915_rstdby_delays", i915_rstdby_delays, 0}, 1131f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes {"i915_cur_delayinfo", i915_cur_delayinfo, 0}, 1132f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes {"i915_delayfreq_table", i915_delayfreq_table, 0}, 1133f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes {"i915_inttoext_table", i915_inttoext_table, 0}, 1134f97108d1d0facc7902134ebc453b226bbd4d1cdbJesse Barnes {"i915_drpc_info", i915_drpc_info, 0}, 11357648fa99eb77a2e1a90b7beaa420e07d819b9c11Jesse Barnes {"i915_emon_status", i915_emon_status, 0}, 11367648fa99eb77a2e1a90b7beaa420e07d819b9c11Jesse Barnes {"i915_gfxec", i915_gfxec, 0}, 1137b5e50c3f56ee4aa0d0168eab5ece413ac5df76aaJesse Barnes {"i915_fbc_status", i915_fbc_status, 0}, 11384a9bef37e5cf2c73b61ecc9ead52cad2eb4a372bJesse Barnes {"i915_sr_status", i915_sr_status, 0}, 113944834a67c0082e2cf74b16be91e49108b1432d65Chris Wilson {"i915_opregion", i915_opregion, 0}, 114037811fcc9188f748407646e1157f3ed24ae181a4Chris Wilson {"i915_gem_framebuffer", i915_gem_framebuffer_info, 0}, 11412017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari}; 114227c202ad7f141d4efa9c64e30bf4a4d3bcd799aeBen Gamari#define I915_DEBUGFS_ENTRIES ARRAY_SIZE(i915_debugfs_list) 11432017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari 114427c202ad7f141d4efa9c64e30bf4a4d3bcd799aeBen Gamariint i915_debugfs_init(struct drm_minor *minor) 11452017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari{ 1146f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson int ret; 1147f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson 1148f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson ret = i915_wedged_create(minor->debugfs_root, minor); 1149f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson if (ret) 1150f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson return ret; 1151f3cd474bb235f2331c1a6f579bdbf892386e5c7cChris Wilson 115227c202ad7f141d4efa9c64e30bf4a4d3bcd799aeBen Gamari return drm_debugfs_create_files(i915_debugfs_list, 115327c202ad7f141d4efa9c64e30bf4a4d3bcd799aeBen Gamari I915_DEBUGFS_ENTRIES, 11542017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari minor->debugfs_root, minor); 11552017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari} 11562017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari 115727c202ad7f141d4efa9c64e30bf4a4d3bcd799aeBen Gamarivoid i915_debugfs_cleanup(struct drm_minor *minor) 11582017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari{ 115927c202ad7f141d4efa9c64e30bf4a4d3bcd799aeBen Gamari drm_debugfs_remove_files(i915_debugfs_list, 116027c202ad7f141d4efa9c64e30bf4a4d3bcd799aeBen Gamari I915_DEBUGFS_ENTRIES, minor); 116133db679b4ee94e5a55abb439a87905d76739095aKristian Høgsberg drm_debugfs_remove_files((struct drm_info_list *) &i915_wedged_fops, 116233db679b4ee94e5a55abb439a87905d76739095aKristian Høgsberg 1, minor); 11632017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari} 11642017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari 11652017263e9e72974610179beaa85c4498b9c4b7a4Ben Gamari#endif /* CONFIG_DEBUG_FS */ 1166