diff options
Diffstat (limited to 'drivers/gpu/drm/i915/i915_debugfs.c')
-rw-r--r-- | drivers/gpu/drm/i915/i915_debugfs.c | 340 |
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 | 43 | enum { |
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 | |||
52 | static const char *yesno(int v) | ||
53 | { | ||
54 | return v ? "yes" : "no"; | ||
55 | } | ||
56 | |||
57 | static 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 | ||
47 | static const char *get_pin_flag(struct drm_i915_gem_object *obj_priv) | 89 | static 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 | ||
109 | static void | ||
110 | describe_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 | |||
67 | static int i915_gem_object_list_info(struct seq_file *m, void *data) | 130 | static 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 | ||
191 | static 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 | |||
125 | static int i915_gem_pageflip_info(struct seq_file *m, void *data) | 216 | static 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 | ||
316 | static void i915_dump_pages(struct seq_file *m, struct page **pages, int page_count) | 434 | static 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 | ||
851 | static 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 | |||
871 | static 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 | |||
721 | static int | 913 | static int |
722 | i915_wedged_open(struct inode *inode, | 914 | i915_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 | ||
825 | static struct drm_info_list i915_debugfs_list[] = { | 1020 | static 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 | ||