aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/i915/i915_debugfs.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/drm/i915/i915_debugfs.c')
-rw-r--r--drivers/gpu/drm/i915/i915_debugfs.c340
1 files changed, 271 insertions, 69 deletions
diff --git a/drivers/gpu/drm/i915/i915_debugfs.c b/drivers/gpu/drm/i915/i915_debugfs.c
index 5e43d7076789..d598070fb279 100644
--- a/drivers/gpu/drm/i915/i915_debugfs.c
+++ b/drivers/gpu/drm/i915/i915_debugfs.c
@@ -40,9 +40,51 @@
40 40
41#if defined(CONFIG_DEBUG_FS) 41#if defined(CONFIG_DEBUG_FS)
42 42
43#define ACTIVE_LIST 1 43enum {
44#define FLUSHING_LIST 2 44 RENDER_LIST,
45#define INACTIVE_LIST 3 45 BSD_LIST,
46 FLUSHING_LIST,
47 INACTIVE_LIST,
48 PINNED_LIST,
49 DEFERRED_FREE_LIST,
50};
51
52static const char *yesno(int v)
53{
54 return v ? "yes" : "no";
55}
56
57static int i915_capabilities(struct seq_file *m, void *data)
58{
59 struct drm_info_node *node = (struct drm_info_node *) m->private;
60 struct drm_device *dev = node->minor->dev;
61 const struct intel_device_info *info = INTEL_INFO(dev);
62
63 seq_printf(m, "gen: %d\n", info->gen);
64#define B(x) seq_printf(m, #x ": %s\n", yesno(info->x))
65 B(is_mobile);
66 B(is_i85x);
67 B(is_i915g);
68 B(is_i945gm);
69 B(is_g33);
70 B(need_gfx_hws);
71 B(is_g4x);
72 B(is_pineview);
73 B(is_broadwater);
74 B(is_crestline);
75 B(is_ironlake);
76 B(has_fbc);
77 B(has_rc6);
78 B(has_pipe_cxsr);
79 B(has_hotplug);
80 B(cursor_needs_physical);
81 B(has_overlay);
82 B(overlay_needs_physical);
83 B(supports_tv);
84#undef B
85
86 return 0;
87}
46 88
47static const char *get_pin_flag(struct drm_i915_gem_object *obj_priv) 89static const char *get_pin_flag(struct drm_i915_gem_object *obj_priv)
48{ 90{
@@ -64,6 +106,27 @@ static const char *get_tiling_flag(struct drm_i915_gem_object *obj_priv)
64 } 106 }
65} 107}
66 108
109static void
110describe_obj(struct seq_file *m, struct drm_i915_gem_object *obj)
111{
112 seq_printf(m, "%p: %s%s %8zd %08x %08x %d%s%s",
113 &obj->base,
114 get_pin_flag(obj),
115 get_tiling_flag(obj),
116 obj->base.size,
117 obj->base.read_domains,
118 obj->base.write_domain,
119 obj->last_rendering_seqno,
120 obj->dirty ? " dirty" : "",
121 obj->madv == I915_MADV_DONTNEED ? " purgeable" : "");
122 if (obj->base.name)
123 seq_printf(m, " (name: %d)", obj->base.name);
124 if (obj->fence_reg != I915_FENCE_REG_NONE)
125 seq_printf(m, " (fence: %d)", obj->fence_reg);
126 if (obj->gtt_space != NULL)
127 seq_printf(m, " (gtt_offset: %08x)", obj->gtt_offset);
128}
129
67static int i915_gem_object_list_info(struct seq_file *m, void *data) 130static int i915_gem_object_list_info(struct seq_file *m, void *data)
68{ 131{
69 struct drm_info_node *node = (struct drm_info_node *) m->private; 132 struct drm_info_node *node = (struct drm_info_node *) m->private;
@@ -72,56 +135,84 @@ static int i915_gem_object_list_info(struct seq_file *m, void *data)
72 struct drm_device *dev = node->minor->dev; 135 struct drm_device *dev = node->minor->dev;
73 drm_i915_private_t *dev_priv = dev->dev_private; 136 drm_i915_private_t *dev_priv = dev->dev_private;
74 struct drm_i915_gem_object *obj_priv; 137 struct drm_i915_gem_object *obj_priv;
75 spinlock_t *lock = NULL; 138 size_t total_obj_size, total_gtt_size;
139 int count, ret;
140
141 ret = mutex_lock_interruptible(&dev->struct_mutex);
142 if (ret)
143 return ret;
76 144
77 switch (list) { 145 switch (list) {
78 case ACTIVE_LIST: 146 case RENDER_LIST:
79 seq_printf(m, "Active:\n"); 147 seq_printf(m, "Render:\n");
80 lock = &dev_priv->mm.active_list_lock;
81 head = &dev_priv->render_ring.active_list; 148 head = &dev_priv->render_ring.active_list;
82 break; 149 break;
150 case BSD_LIST:
151 seq_printf(m, "BSD:\n");
152 head = &dev_priv->bsd_ring.active_list;
153 break;
83 case INACTIVE_LIST: 154 case INACTIVE_LIST:
84 seq_printf(m, "Inactive:\n"); 155 seq_printf(m, "Inactive:\n");
85 head = &dev_priv->mm.inactive_list; 156 head = &dev_priv->mm.inactive_list;
86 break; 157 break;
158 case PINNED_LIST:
159 seq_printf(m, "Pinned:\n");
160 head = &dev_priv->mm.pinned_list;
161 break;
87 case FLUSHING_LIST: 162 case FLUSHING_LIST:
88 seq_printf(m, "Flushing:\n"); 163 seq_printf(m, "Flushing:\n");
89 head = &dev_priv->mm.flushing_list; 164 head = &dev_priv->mm.flushing_list;
90 break; 165 break;
166 case DEFERRED_FREE_LIST:
167 seq_printf(m, "Deferred free:\n");
168 head = &dev_priv->mm.deferred_free_list;
169 break;
91 default: 170 default:
92 DRM_INFO("Ooops, unexpected list\n"); 171 mutex_unlock(&dev->struct_mutex);
93 return 0; 172 return -EINVAL;
94 } 173 }
95 174
96 if (lock) 175 total_obj_size = total_gtt_size = count = 0;
97 spin_lock(lock); 176 list_for_each_entry(obj_priv, head, list) {
98 list_for_each_entry(obj_priv, head, list) 177 seq_printf(m, " ");
99 { 178 describe_obj(m, obj_priv);
100 seq_printf(m, " %p: %s %8zd %08x %08x %d%s%s",
101 &obj_priv->base,
102 get_pin_flag(obj_priv),
103 obj_priv->base.size,
104 obj_priv->base.read_domains,
105 obj_priv->base.write_domain,
106 obj_priv->last_rendering_seqno,
107 obj_priv->dirty ? " dirty" : "",
108 obj_priv->madv == I915_MADV_DONTNEED ? " purgeable" : "");
109
110 if (obj_priv->base.name)
111 seq_printf(m, " (name: %d)", obj_priv->base.name);
112 if (obj_priv->fence_reg != I915_FENCE_REG_NONE)
113 seq_printf(m, " (fence: %d)", obj_priv->fence_reg);
114 if (obj_priv->gtt_space != NULL)
115 seq_printf(m, " (gtt_offset: %08x)", obj_priv->gtt_offset);
116
117 seq_printf(m, "\n"); 179 seq_printf(m, "\n");
180 total_obj_size += obj_priv->base.size;
181 total_gtt_size += obj_priv->gtt_space->size;
182 count++;
118 } 183 }
184 mutex_unlock(&dev->struct_mutex);
119 185
120 if (lock) 186 seq_printf(m, "Total %d objects, %zu bytes, %zu GTT size\n",
121 spin_unlock(lock); 187 count, total_obj_size, total_gtt_size);
122 return 0; 188 return 0;
123} 189}
124 190
191static int i915_gem_object_info(struct seq_file *m, void* data)
192{
193 struct drm_info_node *node = (struct drm_info_node *) m->private;
194 struct drm_device *dev = node->minor->dev;
195 struct drm_i915_private *dev_priv = dev->dev_private;
196 int ret;
197
198 ret = mutex_lock_interruptible(&dev->struct_mutex);
199 if (ret)
200 return ret;
201
202 seq_printf(m, "%u objects\n", dev_priv->mm.object_count);
203 seq_printf(m, "%zu object bytes\n", dev_priv->mm.object_memory);
204 seq_printf(m, "%u pinned\n", dev_priv->mm.pin_count);
205 seq_printf(m, "%zu pin bytes\n", dev_priv->mm.pin_memory);
206 seq_printf(m, "%u objects in gtt\n", dev_priv->mm.gtt_count);
207 seq_printf(m, "%zu gtt bytes\n", dev_priv->mm.gtt_memory);
208 seq_printf(m, "%zu gtt total\n", dev_priv->mm.gtt_total);
209
210 mutex_unlock(&dev->struct_mutex);
211
212 return 0;
213}
214
215
125static int i915_gem_pageflip_info(struct seq_file *m, void *data) 216static int i915_gem_pageflip_info(struct seq_file *m, void *data)
126{ 217{
127 struct drm_info_node *node = (struct drm_info_node *) m->private; 218 struct drm_info_node *node = (struct drm_info_node *) m->private;
@@ -176,6 +267,11 @@ static int i915_gem_request_info(struct seq_file *m, void *data)
176 struct drm_device *dev = node->minor->dev; 267 struct drm_device *dev = node->minor->dev;
177 drm_i915_private_t *dev_priv = dev->dev_private; 268 drm_i915_private_t *dev_priv = dev->dev_private;
178 struct drm_i915_gem_request *gem_request; 269 struct drm_i915_gem_request *gem_request;
270 int ret;
271
272 ret = mutex_lock_interruptible(&dev->struct_mutex);
273 if (ret)
274 return ret;
179 275
180 seq_printf(m, "Request:\n"); 276 seq_printf(m, "Request:\n");
181 list_for_each_entry(gem_request, &dev_priv->render_ring.request_list, 277 list_for_each_entry(gem_request, &dev_priv->render_ring.request_list,
@@ -184,6 +280,8 @@ static int i915_gem_request_info(struct seq_file *m, void *data)
184 gem_request->seqno, 280 gem_request->seqno,
185 (int) (jiffies - gem_request->emitted_jiffies)); 281 (int) (jiffies - gem_request->emitted_jiffies));
186 } 282 }
283 mutex_unlock(&dev->struct_mutex);
284
187 return 0; 285 return 0;
188} 286}
189 287
@@ -192,16 +290,24 @@ static int i915_gem_seqno_info(struct seq_file *m, void *data)
192 struct drm_info_node *node = (struct drm_info_node *) m->private; 290 struct drm_info_node *node = (struct drm_info_node *) m->private;
193 struct drm_device *dev = node->minor->dev; 291 struct drm_device *dev = node->minor->dev;
194 drm_i915_private_t *dev_priv = dev->dev_private; 292 drm_i915_private_t *dev_priv = dev->dev_private;
293 int ret;
294
295 ret = mutex_lock_interruptible(&dev->struct_mutex);
296 if (ret)
297 return ret;
195 298
196 if (dev_priv->render_ring.status_page.page_addr != NULL) { 299 if (dev_priv->render_ring.status_page.page_addr != NULL) {
197 seq_printf(m, "Current sequence: %d\n", 300 seq_printf(m, "Current sequence: %d\n",
198 i915_get_gem_seqno(dev, &dev_priv->render_ring)); 301 dev_priv->render_ring.get_seqno(dev, &dev_priv->render_ring));
199 } else { 302 } else {
200 seq_printf(m, "Current sequence: hws uninitialized\n"); 303 seq_printf(m, "Current sequence: hws uninitialized\n");
201 } 304 }
202 seq_printf(m, "Waiter sequence: %d\n", 305 seq_printf(m, "Waiter sequence: %d\n",
203 dev_priv->mm.waiting_gem_seqno); 306 dev_priv->mm.waiting_gem_seqno);
204 seq_printf(m, "IRQ sequence: %d\n", dev_priv->mm.irq_gem_seqno); 307 seq_printf(m, "IRQ sequence: %d\n", dev_priv->mm.irq_gem_seqno);
308
309 mutex_unlock(&dev->struct_mutex);
310
205 return 0; 311 return 0;
206} 312}
207 313
@@ -211,6 +317,11 @@ static int i915_interrupt_info(struct seq_file *m, void *data)
211 struct drm_info_node *node = (struct drm_info_node *) m->private; 317 struct drm_info_node *node = (struct drm_info_node *) m->private;
212 struct drm_device *dev = node->minor->dev; 318 struct drm_device *dev = node->minor->dev;
213 drm_i915_private_t *dev_priv = dev->dev_private; 319 drm_i915_private_t *dev_priv = dev->dev_private;
320 int ret;
321
322 ret = mutex_lock_interruptible(&dev->struct_mutex);
323 if (ret)
324 return ret;
214 325
215 if (!HAS_PCH_SPLIT(dev)) { 326 if (!HAS_PCH_SPLIT(dev)) {
216 seq_printf(m, "Interrupt enable: %08x\n", 327 seq_printf(m, "Interrupt enable: %08x\n",
@@ -247,7 +358,7 @@ static int i915_interrupt_info(struct seq_file *m, void *data)
247 atomic_read(&dev_priv->irq_received)); 358 atomic_read(&dev_priv->irq_received));
248 if (dev_priv->render_ring.status_page.page_addr != NULL) { 359 if (dev_priv->render_ring.status_page.page_addr != NULL) {
249 seq_printf(m, "Current sequence: %d\n", 360 seq_printf(m, "Current sequence: %d\n",
250 i915_get_gem_seqno(dev, &dev_priv->render_ring)); 361 dev_priv->render_ring.get_seqno(dev, &dev_priv->render_ring));
251 } else { 362 } else {
252 seq_printf(m, "Current sequence: hws uninitialized\n"); 363 seq_printf(m, "Current sequence: hws uninitialized\n");
253 } 364 }
@@ -255,6 +366,8 @@ static int i915_interrupt_info(struct seq_file *m, void *data)
255 dev_priv->mm.waiting_gem_seqno); 366 dev_priv->mm.waiting_gem_seqno);
256 seq_printf(m, "IRQ sequence: %d\n", 367 seq_printf(m, "IRQ sequence: %d\n",
257 dev_priv->mm.irq_gem_seqno); 368 dev_priv->mm.irq_gem_seqno);
369 mutex_unlock(&dev->struct_mutex);
370
258 return 0; 371 return 0;
259} 372}
260 373
@@ -263,7 +376,11 @@ static int i915_gem_fence_regs_info(struct seq_file *m, void *data)
263 struct drm_info_node *node = (struct drm_info_node *) m->private; 376 struct drm_info_node *node = (struct drm_info_node *) m->private;
264 struct drm_device *dev = node->minor->dev; 377 struct drm_device *dev = node->minor->dev;
265 drm_i915_private_t *dev_priv = dev->dev_private; 378 drm_i915_private_t *dev_priv = dev->dev_private;
266 int i; 379 int i, ret;
380
381 ret = mutex_lock_interruptible(&dev->struct_mutex);
382 if (ret)
383 return ret;
267 384
268 seq_printf(m, "Reserved fences = %d\n", dev_priv->fence_reg_start); 385 seq_printf(m, "Reserved fences = %d\n", dev_priv->fence_reg_start);
269 seq_printf(m, "Total fences = %d\n", dev_priv->num_fence_regs); 386 seq_printf(m, "Total fences = %d\n", dev_priv->num_fence_regs);
@@ -289,6 +406,7 @@ static int i915_gem_fence_regs_info(struct seq_file *m, void *data)
289 seq_printf(m, "\n"); 406 seq_printf(m, "\n");
290 } 407 }
291 } 408 }
409 mutex_unlock(&dev->struct_mutex);
292 410
293 return 0; 411 return 0;
294} 412}
@@ -313,16 +431,19 @@ static int i915_hws_info(struct seq_file *m, void *data)
313 return 0; 431 return 0;
314} 432}
315 433
316static void i915_dump_pages(struct seq_file *m, struct page **pages, int page_count) 434static void i915_dump_object(struct seq_file *m,
435 struct io_mapping *mapping,
436 struct drm_i915_gem_object *obj_priv)
317{ 437{
318 int page, i; 438 int page, page_count, i;
319 uint32_t *mem;
320 439
440 page_count = obj_priv->base.size / PAGE_SIZE;
321 for (page = 0; page < page_count; page++) { 441 for (page = 0; page < page_count; page++) {
322 mem = kmap_atomic(pages[page], KM_USER0); 442 u32 *mem = io_mapping_map_wc(mapping,
443 obj_priv->gtt_offset + page * PAGE_SIZE);
323 for (i = 0; i < PAGE_SIZE; i += 4) 444 for (i = 0; i < PAGE_SIZE; i += 4)
324 seq_printf(m, "%08x : %08x\n", i, mem[i / 4]); 445 seq_printf(m, "%08x : %08x\n", i, mem[i / 4]);
325 kunmap_atomic(mem, KM_USER0); 446 io_mapping_unmap(mem);
326 } 447 }
327} 448}
328 449
@@ -335,27 +456,21 @@ static int i915_batchbuffer_info(struct seq_file *m, void *data)
335 struct drm_i915_gem_object *obj_priv; 456 struct drm_i915_gem_object *obj_priv;
336 int ret; 457 int ret;
337 458
338 spin_lock(&dev_priv->mm.active_list_lock); 459 ret = mutex_lock_interruptible(&dev->struct_mutex);
460 if (ret)
461 return ret;
339 462
340 list_for_each_entry(obj_priv, &dev_priv->render_ring.active_list, 463 list_for_each_entry(obj_priv, &dev_priv->render_ring.active_list,
341 list) { 464 list) {
342 obj = &obj_priv->base; 465 obj = &obj_priv->base;
343 if (obj->read_domains & I915_GEM_DOMAIN_COMMAND) { 466 if (obj->read_domains & I915_GEM_DOMAIN_COMMAND) {
344 ret = i915_gem_object_get_pages(obj, 0); 467 seq_printf(m, "--- gtt_offset = 0x%08x\n",
345 if (ret) { 468 obj_priv->gtt_offset);
346 DRM_ERROR("Failed to get pages: %d\n", ret); 469 i915_dump_object(m, dev_priv->mm.gtt_mapping, obj_priv);
347 spin_unlock(&dev_priv->mm.active_list_lock);
348 return ret;
349 }
350
351 seq_printf(m, "--- gtt_offset = 0x%08x\n", obj_priv->gtt_offset);
352 i915_dump_pages(m, obj_priv->pages, obj->size / PAGE_SIZE);
353
354 i915_gem_object_put_pages(obj);
355 } 470 }
356 } 471 }
357 472
358 spin_unlock(&dev_priv->mm.active_list_lock); 473 mutex_unlock(&dev->struct_mutex);
359 474
360 return 0; 475 return 0;
361} 476}
@@ -365,20 +480,24 @@ static int i915_ringbuffer_data(struct seq_file *m, void *data)
365 struct drm_info_node *node = (struct drm_info_node *) m->private; 480 struct drm_info_node *node = (struct drm_info_node *) m->private;
366 struct drm_device *dev = node->minor->dev; 481 struct drm_device *dev = node->minor->dev;
367 drm_i915_private_t *dev_priv = dev->dev_private; 482 drm_i915_private_t *dev_priv = dev->dev_private;
368 u8 *virt; 483 int ret;
369 uint32_t *ptr, off; 484
485 ret = mutex_lock_interruptible(&dev->struct_mutex);
486 if (ret)
487 return ret;
370 488
371 if (!dev_priv->render_ring.gem_object) { 489 if (!dev_priv->render_ring.gem_object) {
372 seq_printf(m, "No ringbuffer setup\n"); 490 seq_printf(m, "No ringbuffer setup\n");
373 return 0; 491 } else {
374 } 492 u8 *virt = dev_priv->render_ring.virtual_start;
375 493 uint32_t off;
376 virt = dev_priv->render_ring.virtual_start;
377 494
378 for (off = 0; off < dev_priv->render_ring.size; off += 4) { 495 for (off = 0; off < dev_priv->render_ring.size; off += 4) {
379 ptr = (uint32_t *)(virt + off); 496 uint32_t *ptr = (uint32_t *)(virt + off);
380 seq_printf(m, "%08x : %08x\n", off, *ptr); 497 seq_printf(m, "%08x : %08x\n", off, *ptr);
498 }
381 } 499 }
500 mutex_unlock(&dev->struct_mutex);
382 501
383 return 0; 502 return 0;
384} 503}
@@ -396,7 +515,7 @@ static int i915_ringbuffer_info(struct seq_file *m, void *data)
396 seq_printf(m, "RingHead : %08x\n", head); 515 seq_printf(m, "RingHead : %08x\n", head);
397 seq_printf(m, "RingTail : %08x\n", tail); 516 seq_printf(m, "RingTail : %08x\n", tail);
398 seq_printf(m, "RingSize : %08lx\n", dev_priv->render_ring.size); 517 seq_printf(m, "RingSize : %08lx\n", dev_priv->render_ring.size);
399 seq_printf(m, "Acthd : %08x\n", I915_READ(IS_I965G(dev) ? ACTHD_I965 : ACTHD)); 518 seq_printf(m, "Acthd : %08x\n", I915_READ(INTEL_INFO(dev)->gen >= 4 ? ACTHD_I965 : ACTHD));
400 519
401 return 0; 520 return 0;
402} 521}
@@ -458,7 +577,7 @@ static int i915_error_state(struct seq_file *m, void *unused)
458 seq_printf(m, " IPEHR: 0x%08x\n", error->ipehr); 577 seq_printf(m, " IPEHR: 0x%08x\n", error->ipehr);
459 seq_printf(m, " INSTDONE: 0x%08x\n", error->instdone); 578 seq_printf(m, " INSTDONE: 0x%08x\n", error->instdone);
460 seq_printf(m, " ACTHD: 0x%08x\n", error->acthd); 579 seq_printf(m, " ACTHD: 0x%08x\n", error->acthd);
461 if (IS_I965G(dev)) { 580 if (INTEL_INFO(dev)->gen >= 4) {
462 seq_printf(m, " INSTPS: 0x%08x\n", error->instps); 581 seq_printf(m, " INSTPS: 0x%08x\n", error->instps);
463 seq_printf(m, " INSTDONE1: 0x%08x\n", error->instdone1); 582 seq_printf(m, " INSTDONE1: 0x%08x\n", error->instdone1);
464 } 583 }
@@ -642,6 +761,9 @@ static int i915_fbc_status(struct seq_file *m, void *unused)
642 } else { 761 } else {
643 seq_printf(m, "FBC disabled: "); 762 seq_printf(m, "FBC disabled: ");
644 switch (dev_priv->no_fbc_reason) { 763 switch (dev_priv->no_fbc_reason) {
764 case FBC_NO_OUTPUT:
765 seq_printf(m, "no outputs");
766 break;
645 case FBC_STOLEN_TOO_SMALL: 767 case FBC_STOLEN_TOO_SMALL:
646 seq_printf(m, "not enough stolen memory"); 768 seq_printf(m, "not enough stolen memory");
647 break; 769 break;
@@ -675,15 +797,17 @@ static int i915_sr_status(struct seq_file *m, void *unused)
675 drm_i915_private_t *dev_priv = dev->dev_private; 797 drm_i915_private_t *dev_priv = dev->dev_private;
676 bool sr_enabled = false; 798 bool sr_enabled = false;
677 799
678 if (IS_I965GM(dev) || IS_I945G(dev) || IS_I945GM(dev)) 800 if (IS_IRONLAKE(dev))
801 sr_enabled = I915_READ(WM1_LP_ILK) & WM1_LP_SR_EN;
802 else if (IS_CRESTLINE(dev) || IS_I945G(dev) || IS_I945GM(dev))
679 sr_enabled = I915_READ(FW_BLC_SELF) & FW_BLC_SELF_EN; 803 sr_enabled = I915_READ(FW_BLC_SELF) & FW_BLC_SELF_EN;
680 else if (IS_I915GM(dev)) 804 else if (IS_I915GM(dev))
681 sr_enabled = I915_READ(INSTPM) & INSTPM_SELF_EN; 805 sr_enabled = I915_READ(INSTPM) & INSTPM_SELF_EN;
682 else if (IS_PINEVIEW(dev)) 806 else if (IS_PINEVIEW(dev))
683 sr_enabled = I915_READ(DSPFW3) & PINEVIEW_SELF_REFRESH_EN; 807 sr_enabled = I915_READ(DSPFW3) & PINEVIEW_SELF_REFRESH_EN;
684 808
685 seq_printf(m, "self-refresh: %s\n", sr_enabled ? "enabled" : 809 seq_printf(m, "self-refresh: %s\n",
686 "disabled"); 810 sr_enabled ? "enabled" : "disabled");
687 811
688 return 0; 812 return 0;
689} 813}
@@ -694,10 +818,16 @@ static int i915_emon_status(struct seq_file *m, void *unused)
694 struct drm_device *dev = node->minor->dev; 818 struct drm_device *dev = node->minor->dev;
695 drm_i915_private_t *dev_priv = dev->dev_private; 819 drm_i915_private_t *dev_priv = dev->dev_private;
696 unsigned long temp, chipset, gfx; 820 unsigned long temp, chipset, gfx;
821 int ret;
822
823 ret = mutex_lock_interruptible(&dev->struct_mutex);
824 if (ret)
825 return ret;
697 826
698 temp = i915_mch_val(dev_priv); 827 temp = i915_mch_val(dev_priv);
699 chipset = i915_chipset_val(dev_priv); 828 chipset = i915_chipset_val(dev_priv);
700 gfx = i915_gfx_val(dev_priv); 829 gfx = i915_gfx_val(dev_priv);
830 mutex_unlock(&dev->struct_mutex);
701 831
702 seq_printf(m, "GMCH temp: %ld\n", temp); 832 seq_printf(m, "GMCH temp: %ld\n", temp);
703 seq_printf(m, "Chipset power: %ld\n", chipset); 833 seq_printf(m, "Chipset power: %ld\n", chipset);
@@ -718,6 +848,68 @@ static int i915_gfxec(struct seq_file *m, void *unused)
718 return 0; 848 return 0;
719} 849}
720 850
851static int i915_opregion(struct seq_file *m, void *unused)
852{
853 struct drm_info_node *node = (struct drm_info_node *) m->private;
854 struct drm_device *dev = node->minor->dev;
855 drm_i915_private_t *dev_priv = dev->dev_private;
856 struct intel_opregion *opregion = &dev_priv->opregion;
857 int ret;
858
859 ret = mutex_lock_interruptible(&dev->struct_mutex);
860 if (ret)
861 return ret;
862
863 if (opregion->header)
864 seq_write(m, opregion->header, OPREGION_SIZE);
865
866 mutex_unlock(&dev->struct_mutex);
867
868 return 0;
869}
870
871static int i915_gem_framebuffer_info(struct seq_file *m, void *data)
872{
873 struct drm_info_node *node = (struct drm_info_node *) m->private;
874 struct drm_device *dev = node->minor->dev;
875 drm_i915_private_t *dev_priv = dev->dev_private;
876 struct intel_fbdev *ifbdev;
877 struct intel_framebuffer *fb;
878 int ret;
879
880 ret = mutex_lock_interruptible(&dev->mode_config.mutex);
881 if (ret)
882 return ret;
883
884 ifbdev = dev_priv->fbdev;
885 fb = to_intel_framebuffer(ifbdev->helper.fb);
886
887 seq_printf(m, "fbcon size: %d x %d, depth %d, %d bpp, obj ",
888 fb->base.width,
889 fb->base.height,
890 fb->base.depth,
891 fb->base.bits_per_pixel);
892 describe_obj(m, to_intel_bo(fb->obj));
893 seq_printf(m, "\n");
894
895 list_for_each_entry(fb, &dev->mode_config.fb_list, base.head) {
896 if (&fb->base == ifbdev->helper.fb)
897 continue;
898
899 seq_printf(m, "user size: %d x %d, depth %d, %d bpp, obj ",
900 fb->base.width,
901 fb->base.height,
902 fb->base.depth,
903 fb->base.bits_per_pixel);
904 describe_obj(m, to_intel_bo(fb->obj));
905 seq_printf(m, "\n");
906 }
907
908 mutex_unlock(&dev->mode_config.mutex);
909
910 return 0;
911}
912
721static int 913static int
722i915_wedged_open(struct inode *inode, 914i915_wedged_open(struct inode *inode,
723 struct file *filp) 915 struct file *filp)
@@ -741,6 +933,9 @@ i915_wedged_read(struct file *filp,
741 "wedged : %d\n", 933 "wedged : %d\n",
742 atomic_read(&dev_priv->mm.wedged)); 934 atomic_read(&dev_priv->mm.wedged));
743 935
936 if (len > sizeof (buf))
937 len = sizeof (buf);
938
744 return simple_read_from_buffer(ubuf, max, ppos, buf, len); 939 return simple_read_from_buffer(ubuf, max, ppos, buf, len);
745} 940}
746 941
@@ -770,7 +965,7 @@ i915_wedged_write(struct file *filp,
770 965
771 atomic_set(&dev_priv->mm.wedged, val); 966 atomic_set(&dev_priv->mm.wedged, val);
772 if (val) { 967 if (val) {
773 DRM_WAKEUP(&dev_priv->irq_queue); 968 wake_up_all(&dev_priv->irq_queue);
774 queue_work(dev_priv->wq, &dev_priv->error_work); 969 queue_work(dev_priv->wq, &dev_priv->error_work);
775 } 970 }
776 971
@@ -823,9 +1018,14 @@ static int i915_wedged_create(struct dentry *root, struct drm_minor *minor)
823} 1018}
824 1019
825static struct drm_info_list i915_debugfs_list[] = { 1020static struct drm_info_list i915_debugfs_list[] = {
826 {"i915_gem_active", i915_gem_object_list_info, 0, (void *) ACTIVE_LIST}, 1021 {"i915_capabilities", i915_capabilities, 0, 0},
1022 {"i915_gem_objects", i915_gem_object_info, 0},
1023 {"i915_gem_render_active", i915_gem_object_list_info, 0, (void *) RENDER_LIST},
1024 {"i915_gem_bsd_active", i915_gem_object_list_info, 0, (void *) BSD_LIST},
827 {"i915_gem_flushing", i915_gem_object_list_info, 0, (void *) FLUSHING_LIST}, 1025 {"i915_gem_flushing", i915_gem_object_list_info, 0, (void *) FLUSHING_LIST},
828 {"i915_gem_inactive", i915_gem_object_list_info, 0, (void *) INACTIVE_LIST}, 1026 {"i915_gem_inactive", i915_gem_object_list_info, 0, (void *) INACTIVE_LIST},
1027 {"i915_gem_pinned", i915_gem_object_list_info, 0, (void *) PINNED_LIST},
1028 {"i915_gem_deferred_free", i915_gem_object_list_info, 0, (void *) DEFERRED_FREE_LIST},
829 {"i915_gem_pageflip", i915_gem_pageflip_info, 0}, 1029 {"i915_gem_pageflip", i915_gem_pageflip_info, 0},
830 {"i915_gem_request", i915_gem_request_info, 0}, 1030 {"i915_gem_request", i915_gem_request_info, 0},
831 {"i915_gem_seqno", i915_gem_seqno_info, 0}, 1031 {"i915_gem_seqno", i915_gem_seqno_info, 0},
@@ -845,6 +1045,8 @@ static struct drm_info_list i915_debugfs_list[] = {
845 {"i915_gfxec", i915_gfxec, 0}, 1045 {"i915_gfxec", i915_gfxec, 0},
846 {"i915_fbc_status", i915_fbc_status, 0}, 1046 {"i915_fbc_status", i915_fbc_status, 0},
847 {"i915_sr_status", i915_sr_status, 0}, 1047 {"i915_sr_status", i915_sr_status, 0},
1048 {"i915_opregion", i915_opregion, 0},
1049 {"i915_gem_framebuffer", i915_gem_framebuffer_info, 0},
848}; 1050};
849#define I915_DEBUGFS_ENTRIES ARRAY_SIZE(i915_debugfs_list) 1051#define I915_DEBUGFS_ENTRIES ARRAY_SIZE(i915_debugfs_list)
850 1052