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