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