diff options
Diffstat (limited to 'drivers/gpu/drm/i915/i915_debugfs.c')
-rw-r--r-- | drivers/gpu/drm/i915/i915_debugfs.c | 570 |
1 files changed, 291 insertions, 279 deletions
diff --git a/drivers/gpu/drm/i915/i915_debugfs.c b/drivers/gpu/drm/i915/i915_debugfs.c index 2a6e12956baf..844fea795bae 100644 --- a/drivers/gpu/drm/i915/i915_debugfs.c +++ b/drivers/gpu/drm/i915/i915_debugfs.c | |||
@@ -89,17 +89,17 @@ static int i915_capabilities(struct seq_file *m, void *data) | |||
89 | return 0; | 89 | return 0; |
90 | } | 90 | } |
91 | 91 | ||
92 | static const char get_active_flag(struct drm_i915_gem_object *obj) | 92 | static char get_active_flag(struct drm_i915_gem_object *obj) |
93 | { | 93 | { |
94 | return obj->active ? '*' : ' '; | 94 | return obj->active ? '*' : ' '; |
95 | } | 95 | } |
96 | 96 | ||
97 | static const char get_pin_flag(struct drm_i915_gem_object *obj) | 97 | static char get_pin_flag(struct drm_i915_gem_object *obj) |
98 | { | 98 | { |
99 | return obj->pin_display ? 'p' : ' '; | 99 | return obj->pin_display ? 'p' : ' '; |
100 | } | 100 | } |
101 | 101 | ||
102 | static const char get_tiling_flag(struct drm_i915_gem_object *obj) | 102 | static char get_tiling_flag(struct drm_i915_gem_object *obj) |
103 | { | 103 | { |
104 | switch (obj->tiling_mode) { | 104 | switch (obj->tiling_mode) { |
105 | default: | 105 | default: |
@@ -109,12 +109,12 @@ static const char get_tiling_flag(struct drm_i915_gem_object *obj) | |||
109 | } | 109 | } |
110 | } | 110 | } |
111 | 111 | ||
112 | static inline const char get_global_flag(struct drm_i915_gem_object *obj) | 112 | static char get_global_flag(struct drm_i915_gem_object *obj) |
113 | { | 113 | { |
114 | return i915_gem_obj_to_ggtt(obj) ? 'g' : ' '; | 114 | return i915_gem_obj_to_ggtt(obj) ? 'g' : ' '; |
115 | } | 115 | } |
116 | 116 | ||
117 | static inline const char get_pin_mapped_flag(struct drm_i915_gem_object *obj) | 117 | static char get_pin_mapped_flag(struct drm_i915_gem_object *obj) |
118 | { | 118 | { |
119 | return obj->mapping ? 'M' : ' '; | 119 | return obj->mapping ? 'M' : ' '; |
120 | } | 120 | } |
@@ -199,13 +199,6 @@ describe_obj(struct seq_file *m, struct drm_i915_gem_object *obj) | |||
199 | seq_printf(m, " (frontbuffer: 0x%03x)", obj->frontbuffer_bits); | 199 | seq_printf(m, " (frontbuffer: 0x%03x)", obj->frontbuffer_bits); |
200 | } | 200 | } |
201 | 201 | ||
202 | static void describe_ctx(struct seq_file *m, struct intel_context *ctx) | ||
203 | { | ||
204 | seq_putc(m, ctx->legacy_hw_ctx.initialized ? 'I' : 'i'); | ||
205 | seq_putc(m, ctx->remap_slice ? 'R' : 'r'); | ||
206 | seq_putc(m, ' '); | ||
207 | } | ||
208 | |||
209 | static int i915_gem_object_list_info(struct seq_file *m, void *data) | 202 | static int i915_gem_object_list_info(struct seq_file *m, void *data) |
210 | { | 203 | { |
211 | struct drm_info_node *node = m->private; | 204 | struct drm_info_node *node = m->private; |
@@ -272,7 +265,7 @@ static int i915_gem_stolen_list_info(struct seq_file *m, void *data) | |||
272 | { | 265 | { |
273 | struct drm_info_node *node = m->private; | 266 | struct drm_info_node *node = m->private; |
274 | struct drm_device *dev = node->minor->dev; | 267 | struct drm_device *dev = node->minor->dev; |
275 | struct drm_i915_private *dev_priv = dev->dev_private; | 268 | struct drm_i915_private *dev_priv = to_i915(dev); |
276 | struct drm_i915_gem_object *obj; | 269 | struct drm_i915_gem_object *obj; |
277 | u64 total_obj_size, total_gtt_size; | 270 | u64 total_obj_size, total_gtt_size; |
278 | LIST_HEAD(stolen); | 271 | LIST_HEAD(stolen); |
@@ -424,6 +417,42 @@ static void print_batch_pool_stats(struct seq_file *m, | |||
424 | print_file_stats(m, "[k]batch pool", stats); | 417 | print_file_stats(m, "[k]batch pool", stats); |
425 | } | 418 | } |
426 | 419 | ||
420 | static int per_file_ctx_stats(int id, void *ptr, void *data) | ||
421 | { | ||
422 | struct i915_gem_context *ctx = ptr; | ||
423 | int n; | ||
424 | |||
425 | for (n = 0; n < ARRAY_SIZE(ctx->engine); n++) { | ||
426 | if (ctx->engine[n].state) | ||
427 | per_file_stats(0, ctx->engine[n].state, data); | ||
428 | if (ctx->engine[n].ringbuf) | ||
429 | per_file_stats(0, ctx->engine[n].ringbuf->obj, data); | ||
430 | } | ||
431 | |||
432 | return 0; | ||
433 | } | ||
434 | |||
435 | static void print_context_stats(struct seq_file *m, | ||
436 | struct drm_i915_private *dev_priv) | ||
437 | { | ||
438 | struct file_stats stats; | ||
439 | struct drm_file *file; | ||
440 | |||
441 | memset(&stats, 0, sizeof(stats)); | ||
442 | |||
443 | mutex_lock(&dev_priv->drm.struct_mutex); | ||
444 | if (dev_priv->kernel_context) | ||
445 | per_file_ctx_stats(0, dev_priv->kernel_context, &stats); | ||
446 | |||
447 | list_for_each_entry(file, &dev_priv->drm.filelist, lhead) { | ||
448 | struct drm_i915_file_private *fpriv = file->driver_priv; | ||
449 | idr_for_each(&fpriv->context_idr, per_file_ctx_stats, &stats); | ||
450 | } | ||
451 | mutex_unlock(&dev_priv->drm.struct_mutex); | ||
452 | |||
453 | print_file_stats(m, "[k]contexts", stats); | ||
454 | } | ||
455 | |||
427 | #define count_vmas(list, member) do { \ | 456 | #define count_vmas(list, member) do { \ |
428 | list_for_each_entry(vma, list, member) { \ | 457 | list_for_each_entry(vma, list, member) { \ |
429 | size += i915_gem_obj_total_ggtt_size(vma->obj); \ | 458 | size += i915_gem_obj_total_ggtt_size(vma->obj); \ |
@@ -528,10 +557,10 @@ static int i915_gem_object_info(struct seq_file *m, void* data) | |||
528 | 557 | ||
529 | seq_putc(m, '\n'); | 558 | seq_putc(m, '\n'); |
530 | print_batch_pool_stats(m, dev_priv); | 559 | print_batch_pool_stats(m, dev_priv); |
531 | |||
532 | mutex_unlock(&dev->struct_mutex); | 560 | mutex_unlock(&dev->struct_mutex); |
533 | 561 | ||
534 | mutex_lock(&dev->filelist_mutex); | 562 | mutex_lock(&dev->filelist_mutex); |
563 | print_context_stats(m, dev_priv); | ||
535 | list_for_each_entry_reverse(file, &dev->filelist, lhead) { | 564 | list_for_each_entry_reverse(file, &dev->filelist, lhead) { |
536 | struct file_stats stats; | 565 | struct file_stats stats; |
537 | struct task_struct *task; | 566 | struct task_struct *task; |
@@ -562,7 +591,7 @@ static int i915_gem_gtt_info(struct seq_file *m, void *data) | |||
562 | struct drm_info_node *node = m->private; | 591 | struct drm_info_node *node = m->private; |
563 | struct drm_device *dev = node->minor->dev; | 592 | struct drm_device *dev = node->minor->dev; |
564 | uintptr_t list = (uintptr_t) node->info_ent->data; | 593 | uintptr_t list = (uintptr_t) node->info_ent->data; |
565 | struct drm_i915_private *dev_priv = dev->dev_private; | 594 | struct drm_i915_private *dev_priv = to_i915(dev); |
566 | struct drm_i915_gem_object *obj; | 595 | struct drm_i915_gem_object *obj; |
567 | u64 total_obj_size, total_gtt_size; | 596 | u64 total_obj_size, total_gtt_size; |
568 | int count, ret; | 597 | int count, ret; |
@@ -596,7 +625,7 @@ static int i915_gem_pageflip_info(struct seq_file *m, void *data) | |||
596 | { | 625 | { |
597 | struct drm_info_node *node = m->private; | 626 | struct drm_info_node *node = m->private; |
598 | struct drm_device *dev = node->minor->dev; | 627 | struct drm_device *dev = node->minor->dev; |
599 | struct drm_i915_private *dev_priv = dev->dev_private; | 628 | struct drm_i915_private *dev_priv = to_i915(dev); |
600 | struct intel_crtc *crtc; | 629 | struct intel_crtc *crtc; |
601 | int ret; | 630 | int ret; |
602 | 631 | ||
@@ -607,18 +636,20 @@ static int i915_gem_pageflip_info(struct seq_file *m, void *data) | |||
607 | for_each_intel_crtc(dev, crtc) { | 636 | for_each_intel_crtc(dev, crtc) { |
608 | const char pipe = pipe_name(crtc->pipe); | 637 | const char pipe = pipe_name(crtc->pipe); |
609 | const char plane = plane_name(crtc->plane); | 638 | const char plane = plane_name(crtc->plane); |
610 | struct intel_unpin_work *work; | 639 | struct intel_flip_work *work; |
611 | 640 | ||
612 | spin_lock_irq(&dev->event_lock); | 641 | spin_lock_irq(&dev->event_lock); |
613 | work = crtc->unpin_work; | 642 | work = crtc->flip_work; |
614 | if (work == NULL) { | 643 | if (work == NULL) { |
615 | seq_printf(m, "No flip due on pipe %c (plane %c)\n", | 644 | seq_printf(m, "No flip due on pipe %c (plane %c)\n", |
616 | pipe, plane); | 645 | pipe, plane); |
617 | } else { | 646 | } else { |
647 | u32 pending; | ||
618 | u32 addr; | 648 | u32 addr; |
619 | 649 | ||
620 | if (atomic_read(&work->pending) < INTEL_FLIP_COMPLETE) { | 650 | pending = atomic_read(&work->pending); |
621 | seq_printf(m, "Flip queued on pipe %c (plane %c)\n", | 651 | if (pending) { |
652 | seq_printf(m, "Flip ioctl preparing on pipe %c (plane %c)\n", | ||
622 | pipe, plane); | 653 | pipe, plane); |
623 | } else { | 654 | } else { |
624 | seq_printf(m, "Flip pending (waiting for vsync) on pipe %c (plane %c)\n", | 655 | seq_printf(m, "Flip pending (waiting for vsync) on pipe %c (plane %c)\n", |
@@ -631,18 +662,14 @@ static int i915_gem_pageflip_info(struct seq_file *m, void *data) | |||
631 | engine->name, | 662 | engine->name, |
632 | i915_gem_request_get_seqno(work->flip_queued_req), | 663 | i915_gem_request_get_seqno(work->flip_queued_req), |
633 | dev_priv->next_seqno, | 664 | dev_priv->next_seqno, |
634 | engine->get_seqno(engine), | 665 | intel_engine_get_seqno(engine), |
635 | i915_gem_request_completed(work->flip_queued_req, true)); | 666 | i915_gem_request_completed(work->flip_queued_req)); |
636 | } else | 667 | } else |
637 | seq_printf(m, "Flip not associated with any ring\n"); | 668 | seq_printf(m, "Flip not associated with any ring\n"); |
638 | seq_printf(m, "Flip queued on frame %d, (was ready on frame %d), now %d\n", | 669 | seq_printf(m, "Flip queued on frame %d, (was ready on frame %d), now %d\n", |
639 | work->flip_queued_vblank, | 670 | work->flip_queued_vblank, |
640 | work->flip_ready_vblank, | 671 | work->flip_ready_vblank, |
641 | drm_crtc_vblank_count(&crtc->base)); | 672 | intel_crtc_get_vblank_counter(crtc)); |
642 | if (work->enable_stall_check) | ||
643 | seq_puts(m, "Stall check enabled, "); | ||
644 | else | ||
645 | seq_puts(m, "Stall check waiting for page flip ioctl, "); | ||
646 | seq_printf(m, "%d prepares\n", atomic_read(&work->pending)); | 673 | seq_printf(m, "%d prepares\n", atomic_read(&work->pending)); |
647 | 674 | ||
648 | if (INTEL_INFO(dev)->gen >= 4) | 675 | if (INTEL_INFO(dev)->gen >= 4) |
@@ -668,7 +695,7 @@ static int i915_gem_batch_pool_info(struct seq_file *m, void *data) | |||
668 | { | 695 | { |
669 | struct drm_info_node *node = m->private; | 696 | struct drm_info_node *node = m->private; |
670 | struct drm_device *dev = node->minor->dev; | 697 | struct drm_device *dev = node->minor->dev; |
671 | struct drm_i915_private *dev_priv = dev->dev_private; | 698 | struct drm_i915_private *dev_priv = to_i915(dev); |
672 | struct drm_i915_gem_object *obj; | 699 | struct drm_i915_gem_object *obj; |
673 | struct intel_engine_cs *engine; | 700 | struct intel_engine_cs *engine; |
674 | int total = 0; | 701 | int total = 0; |
@@ -713,7 +740,7 @@ static int i915_gem_request_info(struct seq_file *m, void *data) | |||
713 | { | 740 | { |
714 | struct drm_info_node *node = m->private; | 741 | struct drm_info_node *node = m->private; |
715 | struct drm_device *dev = node->minor->dev; | 742 | struct drm_device *dev = node->minor->dev; |
716 | struct drm_i915_private *dev_priv = dev->dev_private; | 743 | struct drm_i915_private *dev_priv = to_i915(dev); |
717 | struct intel_engine_cs *engine; | 744 | struct intel_engine_cs *engine; |
718 | struct drm_i915_gem_request *req; | 745 | struct drm_i915_gem_request *req; |
719 | int ret, any; | 746 | int ret, any; |
@@ -761,17 +788,29 @@ static int i915_gem_request_info(struct seq_file *m, void *data) | |||
761 | static void i915_ring_seqno_info(struct seq_file *m, | 788 | static void i915_ring_seqno_info(struct seq_file *m, |
762 | struct intel_engine_cs *engine) | 789 | struct intel_engine_cs *engine) |
763 | { | 790 | { |
791 | struct intel_breadcrumbs *b = &engine->breadcrumbs; | ||
792 | struct rb_node *rb; | ||
793 | |||
764 | seq_printf(m, "Current sequence (%s): %x\n", | 794 | seq_printf(m, "Current sequence (%s): %x\n", |
765 | engine->name, engine->get_seqno(engine)); | 795 | engine->name, intel_engine_get_seqno(engine)); |
766 | seq_printf(m, "Current user interrupts (%s): %x\n", | 796 | seq_printf(m, "Current user interrupts (%s): %lx\n", |
767 | engine->name, READ_ONCE(engine->user_interrupts)); | 797 | engine->name, READ_ONCE(engine->breadcrumbs.irq_wakeups)); |
798 | |||
799 | spin_lock(&b->lock); | ||
800 | for (rb = rb_first(&b->waiters); rb; rb = rb_next(rb)) { | ||
801 | struct intel_wait *w = container_of(rb, typeof(*w), node); | ||
802 | |||
803 | seq_printf(m, "Waiting (%s): %s [%d] on %x\n", | ||
804 | engine->name, w->tsk->comm, w->tsk->pid, w->seqno); | ||
805 | } | ||
806 | spin_unlock(&b->lock); | ||
768 | } | 807 | } |
769 | 808 | ||
770 | static int i915_gem_seqno_info(struct seq_file *m, void *data) | 809 | static int i915_gem_seqno_info(struct seq_file *m, void *data) |
771 | { | 810 | { |
772 | struct drm_info_node *node = m->private; | 811 | struct drm_info_node *node = m->private; |
773 | struct drm_device *dev = node->minor->dev; | 812 | struct drm_device *dev = node->minor->dev; |
774 | struct drm_i915_private *dev_priv = dev->dev_private; | 813 | struct drm_i915_private *dev_priv = to_i915(dev); |
775 | struct intel_engine_cs *engine; | 814 | struct intel_engine_cs *engine; |
776 | int ret; | 815 | int ret; |
777 | 816 | ||
@@ -794,7 +833,7 @@ static int i915_interrupt_info(struct seq_file *m, void *data) | |||
794 | { | 833 | { |
795 | struct drm_info_node *node = m->private; | 834 | struct drm_info_node *node = m->private; |
796 | struct drm_device *dev = node->minor->dev; | 835 | struct drm_device *dev = node->minor->dev; |
797 | struct drm_i915_private *dev_priv = dev->dev_private; | 836 | struct drm_i915_private *dev_priv = to_i915(dev); |
798 | struct intel_engine_cs *engine; | 837 | struct intel_engine_cs *engine; |
799 | int ret, i, pipe; | 838 | int ret, i, pipe; |
800 | 839 | ||
@@ -985,7 +1024,7 @@ static int i915_gem_fence_regs_info(struct seq_file *m, void *data) | |||
985 | { | 1024 | { |
986 | struct drm_info_node *node = m->private; | 1025 | struct drm_info_node *node = m->private; |
987 | struct drm_device *dev = node->minor->dev; | 1026 | struct drm_device *dev = node->minor->dev; |
988 | struct drm_i915_private *dev_priv = dev->dev_private; | 1027 | struct drm_i915_private *dev_priv = to_i915(dev); |
989 | int i, ret; | 1028 | int i, ret; |
990 | 1029 | ||
991 | ret = mutex_lock_interruptible(&dev->struct_mutex); | 1030 | ret = mutex_lock_interruptible(&dev->struct_mutex); |
@@ -1013,7 +1052,7 @@ static int i915_hws_info(struct seq_file *m, void *data) | |||
1013 | { | 1052 | { |
1014 | struct drm_info_node *node = m->private; | 1053 | struct drm_info_node *node = m->private; |
1015 | struct drm_device *dev = node->minor->dev; | 1054 | struct drm_device *dev = node->minor->dev; |
1016 | struct drm_i915_private *dev_priv = dev->dev_private; | 1055 | struct drm_i915_private *dev_priv = to_i915(dev); |
1017 | struct intel_engine_cs *engine; | 1056 | struct intel_engine_cs *engine; |
1018 | const u32 *hws; | 1057 | const u32 *hws; |
1019 | int i; | 1058 | int i; |
@@ -1124,7 +1163,7 @@ static int | |||
1124 | i915_next_seqno_get(void *data, u64 *val) | 1163 | i915_next_seqno_get(void *data, u64 *val) |
1125 | { | 1164 | { |
1126 | struct drm_device *dev = data; | 1165 | struct drm_device *dev = data; |
1127 | struct drm_i915_private *dev_priv = dev->dev_private; | 1166 | struct drm_i915_private *dev_priv = to_i915(dev); |
1128 | int ret; | 1167 | int ret; |
1129 | 1168 | ||
1130 | ret = mutex_lock_interruptible(&dev->struct_mutex); | 1169 | ret = mutex_lock_interruptible(&dev->struct_mutex); |
@@ -1161,7 +1200,7 @@ static int i915_frequency_info(struct seq_file *m, void *unused) | |||
1161 | { | 1200 | { |
1162 | struct drm_info_node *node = m->private; | 1201 | struct drm_info_node *node = m->private; |
1163 | struct drm_device *dev = node->minor->dev; | 1202 | struct drm_device *dev = node->minor->dev; |
1164 | struct drm_i915_private *dev_priv = dev->dev_private; | 1203 | struct drm_i915_private *dev_priv = to_i915(dev); |
1165 | int ret = 0; | 1204 | int ret = 0; |
1166 | 1205 | ||
1167 | intel_runtime_pm_get(dev_priv); | 1206 | intel_runtime_pm_get(dev_priv); |
@@ -1281,6 +1320,7 @@ static int i915_frequency_info(struct seq_file *m, void *unused) | |||
1281 | } | 1320 | } |
1282 | seq_printf(m, "PM IER=0x%08x IMR=0x%08x ISR=0x%08x IIR=0x%08x, MASK=0x%08x\n", | 1321 | seq_printf(m, "PM IER=0x%08x IMR=0x%08x ISR=0x%08x IIR=0x%08x, MASK=0x%08x\n", |
1283 | pm_ier, pm_imr, pm_isr, pm_iir, pm_mask); | 1322 | pm_ier, pm_imr, pm_isr, pm_iir, pm_mask); |
1323 | seq_printf(m, "pm_intr_keep: 0x%08x\n", dev_priv->rps.pm_intr_keep); | ||
1284 | seq_printf(m, "GT_PERF_STATUS: 0x%08x\n", gt_perf_status); | 1324 | seq_printf(m, "GT_PERF_STATUS: 0x%08x\n", gt_perf_status); |
1285 | seq_printf(m, "Render p-state ratio: %d\n", | 1325 | seq_printf(m, "Render p-state ratio: %d\n", |
1286 | (gt_perf_status & (IS_GEN9(dev) ? 0x1ff00 : 0xff00)) >> 8); | 1326 | (gt_perf_status & (IS_GEN9(dev) ? 0x1ff00 : 0xff00)) >> 8); |
@@ -1363,7 +1403,7 @@ static int i915_hangcheck_info(struct seq_file *m, void *unused) | |||
1363 | { | 1403 | { |
1364 | struct drm_info_node *node = m->private; | 1404 | struct drm_info_node *node = m->private; |
1365 | struct drm_device *dev = node->minor->dev; | 1405 | struct drm_device *dev = node->minor->dev; |
1366 | struct drm_i915_private *dev_priv = dev->dev_private; | 1406 | struct drm_i915_private *dev_priv = to_i915(dev); |
1367 | struct intel_engine_cs *engine; | 1407 | struct intel_engine_cs *engine; |
1368 | u64 acthd[I915_NUM_ENGINES]; | 1408 | u64 acthd[I915_NUM_ENGINES]; |
1369 | u32 seqno[I915_NUM_ENGINES]; | 1409 | u32 seqno[I915_NUM_ENGINES]; |
@@ -1380,10 +1420,10 @@ static int i915_hangcheck_info(struct seq_file *m, void *unused) | |||
1380 | 1420 | ||
1381 | for_each_engine_id(engine, dev_priv, id) { | 1421 | for_each_engine_id(engine, dev_priv, id) { |
1382 | acthd[id] = intel_ring_get_active_head(engine); | 1422 | acthd[id] = intel_ring_get_active_head(engine); |
1383 | seqno[id] = engine->get_seqno(engine); | 1423 | seqno[id] = intel_engine_get_seqno(engine); |
1384 | } | 1424 | } |
1385 | 1425 | ||
1386 | i915_get_extra_instdone(dev, instdone); | 1426 | i915_get_extra_instdone(dev_priv, instdone); |
1387 | 1427 | ||
1388 | intel_runtime_pm_put(dev_priv); | 1428 | intel_runtime_pm_put(dev_priv); |
1389 | 1429 | ||
@@ -1400,9 +1440,11 @@ static int i915_hangcheck_info(struct seq_file *m, void *unused) | |||
1400 | engine->hangcheck.seqno, | 1440 | engine->hangcheck.seqno, |
1401 | seqno[id], | 1441 | seqno[id], |
1402 | engine->last_submitted_seqno); | 1442 | engine->last_submitted_seqno); |
1403 | seq_printf(m, "\tuser interrupts = %x [current %x]\n", | 1443 | seq_printf(m, "\twaiters? %d\n", |
1444 | intel_engine_has_waiter(engine)); | ||
1445 | seq_printf(m, "\tuser interrupts = %lx [current %lx]\n", | ||
1404 | engine->hangcheck.user_interrupts, | 1446 | engine->hangcheck.user_interrupts, |
1405 | READ_ONCE(engine->user_interrupts)); | 1447 | READ_ONCE(engine->breadcrumbs.irq_wakeups)); |
1406 | seq_printf(m, "\tACTHD = 0x%08llx [current 0x%08llx]\n", | 1448 | seq_printf(m, "\tACTHD = 0x%08llx [current 0x%08llx]\n", |
1407 | (long long)engine->hangcheck.acthd, | 1449 | (long long)engine->hangcheck.acthd, |
1408 | (long long)acthd[id]); | 1450 | (long long)acthd[id]); |
@@ -1432,7 +1474,7 @@ static int ironlake_drpc_info(struct seq_file *m) | |||
1432 | { | 1474 | { |
1433 | struct drm_info_node *node = m->private; | 1475 | struct drm_info_node *node = m->private; |
1434 | struct drm_device *dev = node->minor->dev; | 1476 | struct drm_device *dev = node->minor->dev; |
1435 | struct drm_i915_private *dev_priv = dev->dev_private; | 1477 | struct drm_i915_private *dev_priv = to_i915(dev); |
1436 | u32 rgvmodectl, rstdbyctl; | 1478 | u32 rgvmodectl, rstdbyctl; |
1437 | u16 crstandvid; | 1479 | u16 crstandvid; |
1438 | int ret; | 1480 | int ret; |
@@ -1500,7 +1542,7 @@ static int i915_forcewake_domains(struct seq_file *m, void *data) | |||
1500 | { | 1542 | { |
1501 | struct drm_info_node *node = m->private; | 1543 | struct drm_info_node *node = m->private; |
1502 | struct drm_device *dev = node->minor->dev; | 1544 | struct drm_device *dev = node->minor->dev; |
1503 | struct drm_i915_private *dev_priv = dev->dev_private; | 1545 | struct drm_i915_private *dev_priv = to_i915(dev); |
1504 | struct intel_uncore_forcewake_domain *fw_domain; | 1546 | struct intel_uncore_forcewake_domain *fw_domain; |
1505 | 1547 | ||
1506 | spin_lock_irq(&dev_priv->uncore.lock); | 1548 | spin_lock_irq(&dev_priv->uncore.lock); |
@@ -1518,7 +1560,7 @@ static int vlv_drpc_info(struct seq_file *m) | |||
1518 | { | 1560 | { |
1519 | struct drm_info_node *node = m->private; | 1561 | struct drm_info_node *node = m->private; |
1520 | struct drm_device *dev = node->minor->dev; | 1562 | struct drm_device *dev = node->minor->dev; |
1521 | struct drm_i915_private *dev_priv = dev->dev_private; | 1563 | struct drm_i915_private *dev_priv = to_i915(dev); |
1522 | u32 rpmodectl1, rcctl1, pw_status; | 1564 | u32 rpmodectl1, rcctl1, pw_status; |
1523 | 1565 | ||
1524 | intel_runtime_pm_get(dev_priv); | 1566 | intel_runtime_pm_get(dev_priv); |
@@ -1558,7 +1600,7 @@ static int gen6_drpc_info(struct seq_file *m) | |||
1558 | { | 1600 | { |
1559 | struct drm_info_node *node = m->private; | 1601 | struct drm_info_node *node = m->private; |
1560 | struct drm_device *dev = node->minor->dev; | 1602 | struct drm_device *dev = node->minor->dev; |
1561 | struct drm_i915_private *dev_priv = dev->dev_private; | 1603 | struct drm_i915_private *dev_priv = to_i915(dev); |
1562 | u32 rpmodectl1, gt_core_status, rcctl1, rc6vids = 0; | 1604 | u32 rpmodectl1, gt_core_status, rcctl1, rc6vids = 0; |
1563 | unsigned forcewake_count; | 1605 | unsigned forcewake_count; |
1564 | int count = 0, ret; | 1606 | int count = 0, ret; |
@@ -1670,7 +1712,7 @@ static int i915_frontbuffer_tracking(struct seq_file *m, void *unused) | |||
1670 | { | 1712 | { |
1671 | struct drm_info_node *node = m->private; | 1713 | struct drm_info_node *node = m->private; |
1672 | struct drm_device *dev = node->minor->dev; | 1714 | struct drm_device *dev = node->minor->dev; |
1673 | struct drm_i915_private *dev_priv = dev->dev_private; | 1715 | struct drm_i915_private *dev_priv = to_i915(dev); |
1674 | 1716 | ||
1675 | seq_printf(m, "FB tracking busy bits: 0x%08x\n", | 1717 | seq_printf(m, "FB tracking busy bits: 0x%08x\n", |
1676 | dev_priv->fb_tracking.busy_bits); | 1718 | dev_priv->fb_tracking.busy_bits); |
@@ -1685,7 +1727,7 @@ static int i915_fbc_status(struct seq_file *m, void *unused) | |||
1685 | { | 1727 | { |
1686 | struct drm_info_node *node = m->private; | 1728 | struct drm_info_node *node = m->private; |
1687 | struct drm_device *dev = node->minor->dev; | 1729 | struct drm_device *dev = node->minor->dev; |
1688 | struct drm_i915_private *dev_priv = dev->dev_private; | 1730 | struct drm_i915_private *dev_priv = to_i915(dev); |
1689 | 1731 | ||
1690 | if (!HAS_FBC(dev)) { | 1732 | if (!HAS_FBC(dev)) { |
1691 | seq_puts(m, "FBC unsupported on this chipset\n"); | 1733 | seq_puts(m, "FBC unsupported on this chipset\n"); |
@@ -1715,7 +1757,7 @@ static int i915_fbc_status(struct seq_file *m, void *unused) | |||
1715 | static int i915_fbc_fc_get(void *data, u64 *val) | 1757 | static int i915_fbc_fc_get(void *data, u64 *val) |
1716 | { | 1758 | { |
1717 | struct drm_device *dev = data; | 1759 | struct drm_device *dev = data; |
1718 | struct drm_i915_private *dev_priv = dev->dev_private; | 1760 | struct drm_i915_private *dev_priv = to_i915(dev); |
1719 | 1761 | ||
1720 | if (INTEL_INFO(dev)->gen < 7 || !HAS_FBC(dev)) | 1762 | if (INTEL_INFO(dev)->gen < 7 || !HAS_FBC(dev)) |
1721 | return -ENODEV; | 1763 | return -ENODEV; |
@@ -1728,7 +1770,7 @@ static int i915_fbc_fc_get(void *data, u64 *val) | |||
1728 | static int i915_fbc_fc_set(void *data, u64 val) | 1770 | static int i915_fbc_fc_set(void *data, u64 val) |
1729 | { | 1771 | { |
1730 | struct drm_device *dev = data; | 1772 | struct drm_device *dev = data; |
1731 | struct drm_i915_private *dev_priv = dev->dev_private; | 1773 | struct drm_i915_private *dev_priv = to_i915(dev); |
1732 | u32 reg; | 1774 | u32 reg; |
1733 | 1775 | ||
1734 | if (INTEL_INFO(dev)->gen < 7 || !HAS_FBC(dev)) | 1776 | if (INTEL_INFO(dev)->gen < 7 || !HAS_FBC(dev)) |
@@ -1755,7 +1797,7 @@ static int i915_ips_status(struct seq_file *m, void *unused) | |||
1755 | { | 1797 | { |
1756 | struct drm_info_node *node = m->private; | 1798 | struct drm_info_node *node = m->private; |
1757 | struct drm_device *dev = node->minor->dev; | 1799 | struct drm_device *dev = node->minor->dev; |
1758 | struct drm_i915_private *dev_priv = dev->dev_private; | 1800 | struct drm_i915_private *dev_priv = to_i915(dev); |
1759 | 1801 | ||
1760 | if (!HAS_IPS(dev)) { | 1802 | if (!HAS_IPS(dev)) { |
1761 | seq_puts(m, "not supported\n"); | 1803 | seq_puts(m, "not supported\n"); |
@@ -1785,7 +1827,7 @@ static int i915_sr_status(struct seq_file *m, void *unused) | |||
1785 | { | 1827 | { |
1786 | struct drm_info_node *node = m->private; | 1828 | struct drm_info_node *node = m->private; |
1787 | struct drm_device *dev = node->minor->dev; | 1829 | struct drm_device *dev = node->minor->dev; |
1788 | struct drm_i915_private *dev_priv = dev->dev_private; | 1830 | struct drm_i915_private *dev_priv = to_i915(dev); |
1789 | bool sr_enabled = false; | 1831 | bool sr_enabled = false; |
1790 | 1832 | ||
1791 | intel_runtime_pm_get(dev_priv); | 1833 | intel_runtime_pm_get(dev_priv); |
@@ -1814,7 +1856,7 @@ static int i915_emon_status(struct seq_file *m, void *unused) | |||
1814 | { | 1856 | { |
1815 | struct drm_info_node *node = m->private; | 1857 | struct drm_info_node *node = m->private; |
1816 | struct drm_device *dev = node->minor->dev; | 1858 | struct drm_device *dev = node->minor->dev; |
1817 | struct drm_i915_private *dev_priv = dev->dev_private; | 1859 | struct drm_i915_private *dev_priv = to_i915(dev); |
1818 | unsigned long temp, chipset, gfx; | 1860 | unsigned long temp, chipset, gfx; |
1819 | int ret; | 1861 | int ret; |
1820 | 1862 | ||
@@ -1842,7 +1884,7 @@ static int i915_ring_freq_table(struct seq_file *m, void *unused) | |||
1842 | { | 1884 | { |
1843 | struct drm_info_node *node = m->private; | 1885 | struct drm_info_node *node = m->private; |
1844 | struct drm_device *dev = node->minor->dev; | 1886 | struct drm_device *dev = node->minor->dev; |
1845 | struct drm_i915_private *dev_priv = dev->dev_private; | 1887 | struct drm_i915_private *dev_priv = to_i915(dev); |
1846 | int ret = 0; | 1888 | int ret = 0; |
1847 | int gpu_freq, ia_freq; | 1889 | int gpu_freq, ia_freq; |
1848 | unsigned int max_gpu_freq, min_gpu_freq; | 1890 | unsigned int max_gpu_freq, min_gpu_freq; |
@@ -1897,7 +1939,7 @@ static int i915_opregion(struct seq_file *m, void *unused) | |||
1897 | { | 1939 | { |
1898 | struct drm_info_node *node = m->private; | 1940 | struct drm_info_node *node = m->private; |
1899 | struct drm_device *dev = node->minor->dev; | 1941 | struct drm_device *dev = node->minor->dev; |
1900 | struct drm_i915_private *dev_priv = dev->dev_private; | 1942 | struct drm_i915_private *dev_priv = to_i915(dev); |
1901 | struct intel_opregion *opregion = &dev_priv->opregion; | 1943 | struct intel_opregion *opregion = &dev_priv->opregion; |
1902 | int ret; | 1944 | int ret; |
1903 | 1945 | ||
@@ -1918,7 +1960,7 @@ static int i915_vbt(struct seq_file *m, void *unused) | |||
1918 | { | 1960 | { |
1919 | struct drm_info_node *node = m->private; | 1961 | struct drm_info_node *node = m->private; |
1920 | struct drm_device *dev = node->minor->dev; | 1962 | struct drm_device *dev = node->minor->dev; |
1921 | struct drm_i915_private *dev_priv = dev->dev_private; | 1963 | struct drm_i915_private *dev_priv = to_i915(dev); |
1922 | struct intel_opregion *opregion = &dev_priv->opregion; | 1964 | struct intel_opregion *opregion = &dev_priv->opregion; |
1923 | 1965 | ||
1924 | if (opregion->vbt) | 1966 | if (opregion->vbt) |
@@ -1940,19 +1982,19 @@ static int i915_gem_framebuffer_info(struct seq_file *m, void *data) | |||
1940 | return ret; | 1982 | return ret; |
1941 | 1983 | ||
1942 | #ifdef CONFIG_DRM_FBDEV_EMULATION | 1984 | #ifdef CONFIG_DRM_FBDEV_EMULATION |
1943 | if (to_i915(dev)->fbdev) { | 1985 | if (to_i915(dev)->fbdev) { |
1944 | fbdev_fb = to_intel_framebuffer(to_i915(dev)->fbdev->helper.fb); | 1986 | fbdev_fb = to_intel_framebuffer(to_i915(dev)->fbdev->helper.fb); |
1945 | 1987 | ||
1946 | seq_printf(m, "fbcon size: %d x %d, depth %d, %d bpp, modifier 0x%llx, refcount %d, obj ", | 1988 | seq_printf(m, "fbcon size: %d x %d, depth %d, %d bpp, modifier 0x%llx, refcount %d, obj ", |
1947 | fbdev_fb->base.width, | 1989 | fbdev_fb->base.width, |
1948 | fbdev_fb->base.height, | 1990 | fbdev_fb->base.height, |
1949 | fbdev_fb->base.depth, | 1991 | fbdev_fb->base.depth, |
1950 | fbdev_fb->base.bits_per_pixel, | 1992 | fbdev_fb->base.bits_per_pixel, |
1951 | fbdev_fb->base.modifier[0], | 1993 | fbdev_fb->base.modifier[0], |
1952 | drm_framebuffer_read_refcount(&fbdev_fb->base)); | 1994 | drm_framebuffer_read_refcount(&fbdev_fb->base)); |
1953 | describe_obj(m, fbdev_fb->obj); | 1995 | describe_obj(m, fbdev_fb->obj); |
1954 | seq_putc(m, '\n'); | 1996 | seq_putc(m, '\n'); |
1955 | } | 1997 | } |
1956 | #endif | 1998 | #endif |
1957 | 1999 | ||
1958 | mutex_lock(&dev->mode_config.fb_lock); | 2000 | mutex_lock(&dev->mode_config.fb_lock); |
@@ -1989,10 +2031,9 @@ static int i915_context_status(struct seq_file *m, void *unused) | |||
1989 | { | 2031 | { |
1990 | struct drm_info_node *node = m->private; | 2032 | struct drm_info_node *node = m->private; |
1991 | struct drm_device *dev = node->minor->dev; | 2033 | struct drm_device *dev = node->minor->dev; |
1992 | struct drm_i915_private *dev_priv = dev->dev_private; | 2034 | struct drm_i915_private *dev_priv = to_i915(dev); |
1993 | struct intel_engine_cs *engine; | 2035 | struct intel_engine_cs *engine; |
1994 | struct intel_context *ctx; | 2036 | struct i915_gem_context *ctx; |
1995 | enum intel_engine_id id; | ||
1996 | int ret; | 2037 | int ret; |
1997 | 2038 | ||
1998 | ret = mutex_lock_interruptible(&dev->struct_mutex); | 2039 | ret = mutex_lock_interruptible(&dev->struct_mutex); |
@@ -2000,32 +2041,36 @@ static int i915_context_status(struct seq_file *m, void *unused) | |||
2000 | return ret; | 2041 | return ret; |
2001 | 2042 | ||
2002 | list_for_each_entry(ctx, &dev_priv->context_list, link) { | 2043 | list_for_each_entry(ctx, &dev_priv->context_list, link) { |
2003 | if (!i915.enable_execlists && | 2044 | seq_printf(m, "HW context %u ", ctx->hw_id); |
2004 | ctx->legacy_hw_ctx.rcs_state == NULL) | 2045 | if (IS_ERR(ctx->file_priv)) { |
2005 | continue; | 2046 | seq_puts(m, "(deleted) "); |
2006 | 2047 | } else if (ctx->file_priv) { | |
2007 | seq_puts(m, "HW context "); | 2048 | struct pid *pid = ctx->file_priv->file->pid; |
2008 | describe_ctx(m, ctx); | 2049 | struct task_struct *task; |
2009 | if (ctx == dev_priv->kernel_context) | ||
2010 | seq_printf(m, "(kernel context) "); | ||
2011 | 2050 | ||
2012 | if (i915.enable_execlists) { | 2051 | task = get_pid_task(pid, PIDTYPE_PID); |
2013 | seq_putc(m, '\n'); | 2052 | if (task) { |
2014 | for_each_engine_id(engine, dev_priv, id) { | 2053 | seq_printf(m, "(%s [%d]) ", |
2015 | struct drm_i915_gem_object *ctx_obj = | 2054 | task->comm, task->pid); |
2016 | ctx->engine[id].state; | 2055 | put_task_struct(task); |
2017 | struct intel_ringbuffer *ringbuf = | ||
2018 | ctx->engine[id].ringbuf; | ||
2019 | |||
2020 | seq_printf(m, "%s: ", engine->name); | ||
2021 | if (ctx_obj) | ||
2022 | describe_obj(m, ctx_obj); | ||
2023 | if (ringbuf) | ||
2024 | describe_ctx_ringbuf(m, ringbuf); | ||
2025 | seq_putc(m, '\n'); | ||
2026 | } | 2056 | } |
2027 | } else { | 2057 | } else { |
2028 | describe_obj(m, ctx->legacy_hw_ctx.rcs_state); | 2058 | seq_puts(m, "(kernel) "); |
2059 | } | ||
2060 | |||
2061 | seq_putc(m, ctx->remap_slice ? 'R' : 'r'); | ||
2062 | seq_putc(m, '\n'); | ||
2063 | |||
2064 | for_each_engine(engine, dev_priv) { | ||
2065 | struct intel_context *ce = &ctx->engine[engine->id]; | ||
2066 | |||
2067 | seq_printf(m, "%s: ", engine->name); | ||
2068 | seq_putc(m, ce->initialised ? 'I' : 'i'); | ||
2069 | if (ce->state) | ||
2070 | describe_obj(m, ce->state); | ||
2071 | if (ce->ringbuf) | ||
2072 | describe_ctx_ringbuf(m, ce->ringbuf); | ||
2073 | seq_putc(m, '\n'); | ||
2029 | } | 2074 | } |
2030 | 2075 | ||
2031 | seq_putc(m, '\n'); | 2076 | seq_putc(m, '\n'); |
@@ -2037,24 +2082,22 @@ static int i915_context_status(struct seq_file *m, void *unused) | |||
2037 | } | 2082 | } |
2038 | 2083 | ||
2039 | static void i915_dump_lrc_obj(struct seq_file *m, | 2084 | static void i915_dump_lrc_obj(struct seq_file *m, |
2040 | struct intel_context *ctx, | 2085 | struct i915_gem_context *ctx, |
2041 | struct intel_engine_cs *engine) | 2086 | struct intel_engine_cs *engine) |
2042 | { | 2087 | { |
2088 | struct drm_i915_gem_object *ctx_obj = ctx->engine[engine->id].state; | ||
2043 | struct page *page; | 2089 | struct page *page; |
2044 | uint32_t *reg_state; | 2090 | uint32_t *reg_state; |
2045 | int j; | 2091 | int j; |
2046 | struct drm_i915_gem_object *ctx_obj = ctx->engine[engine->id].state; | ||
2047 | unsigned long ggtt_offset = 0; | 2092 | unsigned long ggtt_offset = 0; |
2048 | 2093 | ||
2094 | seq_printf(m, "CONTEXT: %s %u\n", engine->name, ctx->hw_id); | ||
2095 | |||
2049 | if (ctx_obj == NULL) { | 2096 | if (ctx_obj == NULL) { |
2050 | seq_printf(m, "Context on %s with no gem object\n", | 2097 | seq_puts(m, "\tNot allocated\n"); |
2051 | engine->name); | ||
2052 | return; | 2098 | return; |
2053 | } | 2099 | } |
2054 | 2100 | ||
2055 | seq_printf(m, "CONTEXT: %s %u\n", engine->name, | ||
2056 | intel_execlists_ctx_id(ctx, engine)); | ||
2057 | |||
2058 | if (!i915_gem_obj_ggtt_bound(ctx_obj)) | 2101 | if (!i915_gem_obj_ggtt_bound(ctx_obj)) |
2059 | seq_puts(m, "\tNot bound in GGTT\n"); | 2102 | seq_puts(m, "\tNot bound in GGTT\n"); |
2060 | else | 2103 | else |
@@ -2085,9 +2128,9 @@ static int i915_dump_lrc(struct seq_file *m, void *unused) | |||
2085 | { | 2128 | { |
2086 | struct drm_info_node *node = (struct drm_info_node *) m->private; | 2129 | struct drm_info_node *node = (struct drm_info_node *) m->private; |
2087 | struct drm_device *dev = node->minor->dev; | 2130 | struct drm_device *dev = node->minor->dev; |
2088 | struct drm_i915_private *dev_priv = dev->dev_private; | 2131 | struct drm_i915_private *dev_priv = to_i915(dev); |
2089 | struct intel_engine_cs *engine; | 2132 | struct intel_engine_cs *engine; |
2090 | struct intel_context *ctx; | 2133 | struct i915_gem_context *ctx; |
2091 | int ret; | 2134 | int ret; |
2092 | 2135 | ||
2093 | if (!i915.enable_execlists) { | 2136 | if (!i915.enable_execlists) { |
@@ -2100,10 +2143,8 @@ static int i915_dump_lrc(struct seq_file *m, void *unused) | |||
2100 | return ret; | 2143 | return ret; |
2101 | 2144 | ||
2102 | list_for_each_entry(ctx, &dev_priv->context_list, link) | 2145 | list_for_each_entry(ctx, &dev_priv->context_list, link) |
2103 | if (ctx != dev_priv->kernel_context) { | 2146 | for_each_engine(engine, dev_priv) |
2104 | for_each_engine(engine, dev_priv) | 2147 | i915_dump_lrc_obj(m, ctx, engine); |
2105 | i915_dump_lrc_obj(m, ctx, engine); | ||
2106 | } | ||
2107 | 2148 | ||
2108 | mutex_unlock(&dev->struct_mutex); | 2149 | mutex_unlock(&dev->struct_mutex); |
2109 | 2150 | ||
@@ -2114,7 +2155,7 @@ static int i915_execlists(struct seq_file *m, void *data) | |||
2114 | { | 2155 | { |
2115 | struct drm_info_node *node = (struct drm_info_node *)m->private; | 2156 | struct drm_info_node *node = (struct drm_info_node *)m->private; |
2116 | struct drm_device *dev = node->minor->dev; | 2157 | struct drm_device *dev = node->minor->dev; |
2117 | struct drm_i915_private *dev_priv = dev->dev_private; | 2158 | struct drm_i915_private *dev_priv = to_i915(dev); |
2118 | struct intel_engine_cs *engine; | 2159 | struct intel_engine_cs *engine; |
2119 | u32 status_pointer; | 2160 | u32 status_pointer; |
2120 | u8 read_pointer; | 2161 | u8 read_pointer; |
@@ -2174,8 +2215,8 @@ static int i915_execlists(struct seq_file *m, void *data) | |||
2174 | 2215 | ||
2175 | seq_printf(m, "\t%d requests in queue\n", count); | 2216 | seq_printf(m, "\t%d requests in queue\n", count); |
2176 | if (head_req) { | 2217 | if (head_req) { |
2177 | seq_printf(m, "\tHead request id: %u\n", | 2218 | seq_printf(m, "\tHead request context: %u\n", |
2178 | intel_execlists_ctx_id(head_req->ctx, engine)); | 2219 | head_req->ctx->hw_id); |
2179 | seq_printf(m, "\tHead request tail: %u\n", | 2220 | seq_printf(m, "\tHead request tail: %u\n", |
2180 | head_req->tail); | 2221 | head_req->tail); |
2181 | } | 2222 | } |
@@ -2217,7 +2258,7 @@ static int i915_swizzle_info(struct seq_file *m, void *data) | |||
2217 | { | 2258 | { |
2218 | struct drm_info_node *node = m->private; | 2259 | struct drm_info_node *node = m->private; |
2219 | struct drm_device *dev = node->minor->dev; | 2260 | struct drm_device *dev = node->minor->dev; |
2220 | struct drm_i915_private *dev_priv = dev->dev_private; | 2261 | struct drm_i915_private *dev_priv = to_i915(dev); |
2221 | int ret; | 2262 | int ret; |
2222 | 2263 | ||
2223 | ret = mutex_lock_interruptible(&dev->struct_mutex); | 2264 | ret = mutex_lock_interruptible(&dev->struct_mutex); |
@@ -2269,7 +2310,7 @@ static int i915_swizzle_info(struct seq_file *m, void *data) | |||
2269 | 2310 | ||
2270 | static int per_file_ctx(int id, void *ptr, void *data) | 2311 | static int per_file_ctx(int id, void *ptr, void *data) |
2271 | { | 2312 | { |
2272 | struct intel_context *ctx = ptr; | 2313 | struct i915_gem_context *ctx = ptr; |
2273 | struct seq_file *m = data; | 2314 | struct seq_file *m = data; |
2274 | struct i915_hw_ppgtt *ppgtt = ctx->ppgtt; | 2315 | struct i915_hw_ppgtt *ppgtt = ctx->ppgtt; |
2275 | 2316 | ||
@@ -2290,7 +2331,7 @@ static int per_file_ctx(int id, void *ptr, void *data) | |||
2290 | 2331 | ||
2291 | static void gen8_ppgtt_info(struct seq_file *m, struct drm_device *dev) | 2332 | static void gen8_ppgtt_info(struct seq_file *m, struct drm_device *dev) |
2292 | { | 2333 | { |
2293 | struct drm_i915_private *dev_priv = dev->dev_private; | 2334 | struct drm_i915_private *dev_priv = to_i915(dev); |
2294 | struct intel_engine_cs *engine; | 2335 | struct intel_engine_cs *engine; |
2295 | struct i915_hw_ppgtt *ppgtt = dev_priv->mm.aliasing_ppgtt; | 2336 | struct i915_hw_ppgtt *ppgtt = dev_priv->mm.aliasing_ppgtt; |
2296 | int i; | 2337 | int i; |
@@ -2311,15 +2352,15 @@ static void gen8_ppgtt_info(struct seq_file *m, struct drm_device *dev) | |||
2311 | 2352 | ||
2312 | static void gen6_ppgtt_info(struct seq_file *m, struct drm_device *dev) | 2353 | static void gen6_ppgtt_info(struct seq_file *m, struct drm_device *dev) |
2313 | { | 2354 | { |
2314 | struct drm_i915_private *dev_priv = dev->dev_private; | 2355 | struct drm_i915_private *dev_priv = to_i915(dev); |
2315 | struct intel_engine_cs *engine; | 2356 | struct intel_engine_cs *engine; |
2316 | 2357 | ||
2317 | if (INTEL_INFO(dev)->gen == 6) | 2358 | if (IS_GEN6(dev_priv)) |
2318 | seq_printf(m, "GFX_MODE: 0x%08x\n", I915_READ(GFX_MODE)); | 2359 | seq_printf(m, "GFX_MODE: 0x%08x\n", I915_READ(GFX_MODE)); |
2319 | 2360 | ||
2320 | for_each_engine(engine, dev_priv) { | 2361 | for_each_engine(engine, dev_priv) { |
2321 | seq_printf(m, "%s\n", engine->name); | 2362 | seq_printf(m, "%s\n", engine->name); |
2322 | if (INTEL_INFO(dev)->gen == 7) | 2363 | if (IS_GEN7(dev_priv)) |
2323 | seq_printf(m, "GFX_MODE: 0x%08x\n", | 2364 | seq_printf(m, "GFX_MODE: 0x%08x\n", |
2324 | I915_READ(RING_MODE_GEN7(engine))); | 2365 | I915_READ(RING_MODE_GEN7(engine))); |
2325 | seq_printf(m, "PP_DIR_BASE: 0x%08x\n", | 2366 | seq_printf(m, "PP_DIR_BASE: 0x%08x\n", |
@@ -2345,7 +2386,7 @@ static int i915_ppgtt_info(struct seq_file *m, void *data) | |||
2345 | { | 2386 | { |
2346 | struct drm_info_node *node = m->private; | 2387 | struct drm_info_node *node = m->private; |
2347 | struct drm_device *dev = node->minor->dev; | 2388 | struct drm_device *dev = node->minor->dev; |
2348 | struct drm_i915_private *dev_priv = dev->dev_private; | 2389 | struct drm_i915_private *dev_priv = to_i915(dev); |
2349 | struct drm_file *file; | 2390 | struct drm_file *file; |
2350 | 2391 | ||
2351 | int ret = mutex_lock_interruptible(&dev->struct_mutex); | 2392 | int ret = mutex_lock_interruptible(&dev->struct_mutex); |
@@ -2388,7 +2429,7 @@ static int count_irq_waiters(struct drm_i915_private *i915) | |||
2388 | int count = 0; | 2429 | int count = 0; |
2389 | 2430 | ||
2390 | for_each_engine(engine, i915) | 2431 | for_each_engine(engine, i915) |
2391 | count += engine->irq_refcount; | 2432 | count += intel_engine_has_waiter(engine); |
2392 | 2433 | ||
2393 | return count; | 2434 | return count; |
2394 | } | 2435 | } |
@@ -2397,11 +2438,12 @@ static int i915_rps_boost_info(struct seq_file *m, void *data) | |||
2397 | { | 2438 | { |
2398 | struct drm_info_node *node = m->private; | 2439 | struct drm_info_node *node = m->private; |
2399 | struct drm_device *dev = node->minor->dev; | 2440 | struct drm_device *dev = node->minor->dev; |
2400 | struct drm_i915_private *dev_priv = dev->dev_private; | 2441 | struct drm_i915_private *dev_priv = to_i915(dev); |
2401 | struct drm_file *file; | 2442 | struct drm_file *file; |
2402 | 2443 | ||
2403 | seq_printf(m, "RPS enabled? %d\n", dev_priv->rps.enabled); | 2444 | seq_printf(m, "RPS enabled? %d\n", dev_priv->rps.enabled); |
2404 | seq_printf(m, "GPU busy? %d\n", dev_priv->mm.busy); | 2445 | seq_printf(m, "GPU busy? %s [%x]\n", |
2446 | yesno(dev_priv->gt.awake), dev_priv->gt.active_engines); | ||
2405 | seq_printf(m, "CPU waiting? %d\n", count_irq_waiters(dev_priv)); | 2447 | seq_printf(m, "CPU waiting? %d\n", count_irq_waiters(dev_priv)); |
2406 | seq_printf(m, "Frequency requested %d; min hard:%d, soft:%d; max soft:%d, hard:%d\n", | 2448 | seq_printf(m, "Frequency requested %d; min hard:%d, soft:%d; max soft:%d, hard:%d\n", |
2407 | intel_gpu_freq(dev_priv, dev_priv->rps.cur_freq), | 2449 | intel_gpu_freq(dev_priv, dev_priv->rps.cur_freq), |
@@ -2442,7 +2484,7 @@ static int i915_llc(struct seq_file *m, void *data) | |||
2442 | { | 2484 | { |
2443 | struct drm_info_node *node = m->private; | 2485 | struct drm_info_node *node = m->private; |
2444 | struct drm_device *dev = node->minor->dev; | 2486 | struct drm_device *dev = node->minor->dev; |
2445 | struct drm_i915_private *dev_priv = dev->dev_private; | 2487 | struct drm_i915_private *dev_priv = to_i915(dev); |
2446 | const bool edram = INTEL_GEN(dev_priv) > 8; | 2488 | const bool edram = INTEL_GEN(dev_priv) > 8; |
2447 | 2489 | ||
2448 | seq_printf(m, "LLC: %s\n", yesno(HAS_LLC(dev))); | 2490 | seq_printf(m, "LLC: %s\n", yesno(HAS_LLC(dev))); |
@@ -2455,7 +2497,7 @@ static int i915_llc(struct seq_file *m, void *data) | |||
2455 | static int i915_guc_load_status_info(struct seq_file *m, void *data) | 2497 | static int i915_guc_load_status_info(struct seq_file *m, void *data) |
2456 | { | 2498 | { |
2457 | struct drm_info_node *node = m->private; | 2499 | struct drm_info_node *node = m->private; |
2458 | struct drm_i915_private *dev_priv = node->minor->dev->dev_private; | 2500 | struct drm_i915_private *dev_priv = to_i915(node->minor->dev); |
2459 | struct intel_guc_fw *guc_fw = &dev_priv->guc.guc_fw; | 2501 | struct intel_guc_fw *guc_fw = &dev_priv->guc.guc_fw; |
2460 | u32 tmp, i; | 2502 | u32 tmp, i; |
2461 | 2503 | ||
@@ -2510,15 +2552,16 @@ static void i915_guc_client_info(struct seq_file *m, | |||
2510 | seq_printf(m, "\tWQ size %d, offset: 0x%x, tail %d\n", | 2552 | seq_printf(m, "\tWQ size %d, offset: 0x%x, tail %d\n", |
2511 | client->wq_size, client->wq_offset, client->wq_tail); | 2553 | client->wq_size, client->wq_offset, client->wq_tail); |
2512 | 2554 | ||
2555 | seq_printf(m, "\tWork queue full: %u\n", client->no_wq_space); | ||
2513 | seq_printf(m, "\tFailed to queue: %u\n", client->q_fail); | 2556 | seq_printf(m, "\tFailed to queue: %u\n", client->q_fail); |
2514 | seq_printf(m, "\tFailed doorbell: %u\n", client->b_fail); | 2557 | seq_printf(m, "\tFailed doorbell: %u\n", client->b_fail); |
2515 | seq_printf(m, "\tLast submission result: %d\n", client->retcode); | 2558 | seq_printf(m, "\tLast submission result: %d\n", client->retcode); |
2516 | 2559 | ||
2517 | for_each_engine(engine, dev_priv) { | 2560 | for_each_engine(engine, dev_priv) { |
2518 | seq_printf(m, "\tSubmissions: %llu %s\n", | 2561 | seq_printf(m, "\tSubmissions: %llu %s\n", |
2519 | client->submissions[engine->guc_id], | 2562 | client->submissions[engine->id], |
2520 | engine->name); | 2563 | engine->name); |
2521 | tot += client->submissions[engine->guc_id]; | 2564 | tot += client->submissions[engine->id]; |
2522 | } | 2565 | } |
2523 | seq_printf(m, "\tTotal: %llu\n", tot); | 2566 | seq_printf(m, "\tTotal: %llu\n", tot); |
2524 | } | 2567 | } |
@@ -2527,7 +2570,7 @@ static int i915_guc_info(struct seq_file *m, void *data) | |||
2527 | { | 2570 | { |
2528 | struct drm_info_node *node = m->private; | 2571 | struct drm_info_node *node = m->private; |
2529 | struct drm_device *dev = node->minor->dev; | 2572 | struct drm_device *dev = node->minor->dev; |
2530 | struct drm_i915_private *dev_priv = dev->dev_private; | 2573 | struct drm_i915_private *dev_priv = to_i915(dev); |
2531 | struct intel_guc guc; | 2574 | struct intel_guc guc; |
2532 | struct i915_guc_client client = {}; | 2575 | struct i915_guc_client client = {}; |
2533 | struct intel_engine_cs *engine; | 2576 | struct intel_engine_cs *engine; |
@@ -2546,6 +2589,10 @@ static int i915_guc_info(struct seq_file *m, void *data) | |||
2546 | 2589 | ||
2547 | mutex_unlock(&dev->struct_mutex); | 2590 | mutex_unlock(&dev->struct_mutex); |
2548 | 2591 | ||
2592 | seq_printf(m, "Doorbell map:\n"); | ||
2593 | seq_printf(m, "\t%*pb\n", GUC_MAX_DOORBELLS, guc.doorbell_bitmap); | ||
2594 | seq_printf(m, "Doorbell next cacheline: 0x%x\n\n", guc.db_cacheline); | ||
2595 | |||
2549 | seq_printf(m, "GuC total action count: %llu\n", guc.action_count); | 2596 | seq_printf(m, "GuC total action count: %llu\n", guc.action_count); |
2550 | seq_printf(m, "GuC action failure count: %u\n", guc.action_fail); | 2597 | seq_printf(m, "GuC action failure count: %u\n", guc.action_fail); |
2551 | seq_printf(m, "GuC last action command: 0x%x\n", guc.action_cmd); | 2598 | seq_printf(m, "GuC last action command: 0x%x\n", guc.action_cmd); |
@@ -2555,9 +2602,9 @@ static int i915_guc_info(struct seq_file *m, void *data) | |||
2555 | seq_printf(m, "\nGuC submissions:\n"); | 2602 | seq_printf(m, "\nGuC submissions:\n"); |
2556 | for_each_engine(engine, dev_priv) { | 2603 | for_each_engine(engine, dev_priv) { |
2557 | seq_printf(m, "\t%-24s: %10llu, last seqno 0x%08x\n", | 2604 | seq_printf(m, "\t%-24s: %10llu, last seqno 0x%08x\n", |
2558 | engine->name, guc.submissions[engine->guc_id], | 2605 | engine->name, guc.submissions[engine->id], |
2559 | guc.last_seqno[engine->guc_id]); | 2606 | guc.last_seqno[engine->id]); |
2560 | total += guc.submissions[engine->guc_id]; | 2607 | total += guc.submissions[engine->id]; |
2561 | } | 2608 | } |
2562 | seq_printf(m, "\t%s: %llu\n", "Total", total); | 2609 | seq_printf(m, "\t%s: %llu\n", "Total", total); |
2563 | 2610 | ||
@@ -2573,7 +2620,7 @@ static int i915_guc_log_dump(struct seq_file *m, void *data) | |||
2573 | { | 2620 | { |
2574 | struct drm_info_node *node = m->private; | 2621 | struct drm_info_node *node = m->private; |
2575 | struct drm_device *dev = node->minor->dev; | 2622 | struct drm_device *dev = node->minor->dev; |
2576 | struct drm_i915_private *dev_priv = dev->dev_private; | 2623 | struct drm_i915_private *dev_priv = to_i915(dev); |
2577 | struct drm_i915_gem_object *log_obj = dev_priv->guc.log_obj; | 2624 | struct drm_i915_gem_object *log_obj = dev_priv->guc.log_obj; |
2578 | u32 *log; | 2625 | u32 *log; |
2579 | int i = 0, pg; | 2626 | int i = 0, pg; |
@@ -2601,7 +2648,7 @@ static int i915_edp_psr_status(struct seq_file *m, void *data) | |||
2601 | { | 2648 | { |
2602 | struct drm_info_node *node = m->private; | 2649 | struct drm_info_node *node = m->private; |
2603 | struct drm_device *dev = node->minor->dev; | 2650 | struct drm_device *dev = node->minor->dev; |
2604 | struct drm_i915_private *dev_priv = dev->dev_private; | 2651 | struct drm_i915_private *dev_priv = to_i915(dev); |
2605 | u32 psrperf = 0; | 2652 | u32 psrperf = 0; |
2606 | u32 stat[3]; | 2653 | u32 stat[3]; |
2607 | enum pipe pipe; | 2654 | enum pipe pipe; |
@@ -2669,7 +2716,6 @@ static int i915_sink_crc(struct seq_file *m, void *data) | |||
2669 | { | 2716 | { |
2670 | struct drm_info_node *node = m->private; | 2717 | struct drm_info_node *node = m->private; |
2671 | struct drm_device *dev = node->minor->dev; | 2718 | struct drm_device *dev = node->minor->dev; |
2672 | struct intel_encoder *encoder; | ||
2673 | struct intel_connector *connector; | 2719 | struct intel_connector *connector; |
2674 | struct intel_dp *intel_dp = NULL; | 2720 | struct intel_dp *intel_dp = NULL; |
2675 | int ret; | 2721 | int ret; |
@@ -2677,18 +2723,19 @@ static int i915_sink_crc(struct seq_file *m, void *data) | |||
2677 | 2723 | ||
2678 | drm_modeset_lock_all(dev); | 2724 | drm_modeset_lock_all(dev); |
2679 | for_each_intel_connector(dev, connector) { | 2725 | for_each_intel_connector(dev, connector) { |
2726 | struct drm_crtc *crtc; | ||
2680 | 2727 | ||
2681 | if (connector->base.dpms != DRM_MODE_DPMS_ON) | 2728 | if (!connector->base.state->best_encoder) |
2682 | continue; | 2729 | continue; |
2683 | 2730 | ||
2684 | if (!connector->base.encoder) | 2731 | crtc = connector->base.state->crtc; |
2732 | if (!crtc->state->active) | ||
2685 | continue; | 2733 | continue; |
2686 | 2734 | ||
2687 | encoder = to_intel_encoder(connector->base.encoder); | 2735 | if (connector->base.connector_type != DRM_MODE_CONNECTOR_eDP) |
2688 | if (encoder->type != INTEL_OUTPUT_EDP) | ||
2689 | continue; | 2736 | continue; |
2690 | 2737 | ||
2691 | intel_dp = enc_to_intel_dp(&encoder->base); | 2738 | intel_dp = enc_to_intel_dp(connector->base.state->best_encoder); |
2692 | 2739 | ||
2693 | ret = intel_dp_sink_crc(intel_dp, crc); | 2740 | ret = intel_dp_sink_crc(intel_dp, crc); |
2694 | if (ret) | 2741 | if (ret) |
@@ -2709,7 +2756,7 @@ static int i915_energy_uJ(struct seq_file *m, void *data) | |||
2709 | { | 2756 | { |
2710 | struct drm_info_node *node = m->private; | 2757 | struct drm_info_node *node = m->private; |
2711 | struct drm_device *dev = node->minor->dev; | 2758 | struct drm_device *dev = node->minor->dev; |
2712 | struct drm_i915_private *dev_priv = dev->dev_private; | 2759 | struct drm_i915_private *dev_priv = to_i915(dev); |
2713 | u64 power; | 2760 | u64 power; |
2714 | u32 units; | 2761 | u32 units; |
2715 | 2762 | ||
@@ -2735,12 +2782,12 @@ static int i915_runtime_pm_status(struct seq_file *m, void *unused) | |||
2735 | { | 2782 | { |
2736 | struct drm_info_node *node = m->private; | 2783 | struct drm_info_node *node = m->private; |
2737 | struct drm_device *dev = node->minor->dev; | 2784 | struct drm_device *dev = node->minor->dev; |
2738 | struct drm_i915_private *dev_priv = dev->dev_private; | 2785 | struct drm_i915_private *dev_priv = to_i915(dev); |
2739 | 2786 | ||
2740 | if (!HAS_RUNTIME_PM(dev_priv)) | 2787 | if (!HAS_RUNTIME_PM(dev_priv)) |
2741 | seq_puts(m, "Runtime power management not supported\n"); | 2788 | seq_puts(m, "Runtime power management not supported\n"); |
2742 | 2789 | ||
2743 | seq_printf(m, "GPU idle: %s\n", yesno(!dev_priv->mm.busy)); | 2790 | seq_printf(m, "GPU idle: %s\n", yesno(!dev_priv->gt.awake)); |
2744 | seq_printf(m, "IRQs disabled: %s\n", | 2791 | seq_printf(m, "IRQs disabled: %s\n", |
2745 | yesno(!intel_irqs_enabled(dev_priv))); | 2792 | yesno(!intel_irqs_enabled(dev_priv))); |
2746 | #ifdef CONFIG_PM | 2793 | #ifdef CONFIG_PM |
@@ -2750,8 +2797,8 @@ static int i915_runtime_pm_status(struct seq_file *m, void *unused) | |||
2750 | seq_printf(m, "Device Power Management (CONFIG_PM) disabled\n"); | 2797 | seq_printf(m, "Device Power Management (CONFIG_PM) disabled\n"); |
2751 | #endif | 2798 | #endif |
2752 | seq_printf(m, "PCI device power state: %s [%d]\n", | 2799 | seq_printf(m, "PCI device power state: %s [%d]\n", |
2753 | pci_power_name(dev_priv->dev->pdev->current_state), | 2800 | pci_power_name(dev_priv->drm.pdev->current_state), |
2754 | dev_priv->dev->pdev->current_state); | 2801 | dev_priv->drm.pdev->current_state); |
2755 | 2802 | ||
2756 | return 0; | 2803 | return 0; |
2757 | } | 2804 | } |
@@ -2760,7 +2807,7 @@ static int i915_power_domain_info(struct seq_file *m, void *unused) | |||
2760 | { | 2807 | { |
2761 | struct drm_info_node *node = m->private; | 2808 | struct drm_info_node *node = m->private; |
2762 | struct drm_device *dev = node->minor->dev; | 2809 | struct drm_device *dev = node->minor->dev; |
2763 | struct drm_i915_private *dev_priv = dev->dev_private; | 2810 | struct drm_i915_private *dev_priv = to_i915(dev); |
2764 | struct i915_power_domains *power_domains = &dev_priv->power_domains; | 2811 | struct i915_power_domains *power_domains = &dev_priv->power_domains; |
2765 | int i; | 2812 | int i; |
2766 | 2813 | ||
@@ -2795,7 +2842,7 @@ static int i915_dmc_info(struct seq_file *m, void *unused) | |||
2795 | { | 2842 | { |
2796 | struct drm_info_node *node = m->private; | 2843 | struct drm_info_node *node = m->private; |
2797 | struct drm_device *dev = node->minor->dev; | 2844 | struct drm_device *dev = node->minor->dev; |
2798 | struct drm_i915_private *dev_priv = dev->dev_private; | 2845 | struct drm_i915_private *dev_priv = to_i915(dev); |
2799 | struct intel_csr *csr; | 2846 | struct intel_csr *csr; |
2800 | 2847 | ||
2801 | if (!HAS_CSR(dev)) { | 2848 | if (!HAS_CSR(dev)) { |
@@ -2918,7 +2965,7 @@ static void intel_dp_info(struct seq_file *m, | |||
2918 | 2965 | ||
2919 | seq_printf(m, "\tDPCD rev: %x\n", intel_dp->dpcd[DP_DPCD_REV]); | 2966 | seq_printf(m, "\tDPCD rev: %x\n", intel_dp->dpcd[DP_DPCD_REV]); |
2920 | seq_printf(m, "\taudio support: %s\n", yesno(intel_dp->has_audio)); | 2967 | seq_printf(m, "\taudio support: %s\n", yesno(intel_dp->has_audio)); |
2921 | if (intel_encoder->type == INTEL_OUTPUT_EDP) | 2968 | if (intel_connector->base.connector_type == DRM_MODE_CONNECTOR_eDP) |
2922 | intel_panel_info(m, &intel_connector->panel); | 2969 | intel_panel_info(m, &intel_connector->panel); |
2923 | } | 2970 | } |
2924 | 2971 | ||
@@ -2957,14 +3004,26 @@ static void intel_connector_info(struct seq_file *m, | |||
2957 | seq_printf(m, "\tCEA rev: %d\n", | 3004 | seq_printf(m, "\tCEA rev: %d\n", |
2958 | connector->display_info.cea_rev); | 3005 | connector->display_info.cea_rev); |
2959 | } | 3006 | } |
2960 | if (intel_encoder) { | 3007 | |
2961 | if (intel_encoder->type == INTEL_OUTPUT_DISPLAYPORT || | 3008 | if (!intel_encoder || intel_encoder->type == INTEL_OUTPUT_DP_MST) |
2962 | intel_encoder->type == INTEL_OUTPUT_EDP) | 3009 | return; |
2963 | intel_dp_info(m, intel_connector); | 3010 | |
2964 | else if (intel_encoder->type == INTEL_OUTPUT_HDMI) | 3011 | switch (connector->connector_type) { |
2965 | intel_hdmi_info(m, intel_connector); | 3012 | case DRM_MODE_CONNECTOR_DisplayPort: |
2966 | else if (intel_encoder->type == INTEL_OUTPUT_LVDS) | 3013 | case DRM_MODE_CONNECTOR_eDP: |
3014 | intel_dp_info(m, intel_connector); | ||
3015 | break; | ||
3016 | case DRM_MODE_CONNECTOR_LVDS: | ||
3017 | if (intel_encoder->type == INTEL_OUTPUT_LVDS) | ||
2967 | intel_lvds_info(m, intel_connector); | 3018 | intel_lvds_info(m, intel_connector); |
3019 | break; | ||
3020 | case DRM_MODE_CONNECTOR_HDMIA: | ||
3021 | if (intel_encoder->type == INTEL_OUTPUT_HDMI || | ||
3022 | intel_encoder->type == INTEL_OUTPUT_UNKNOWN) | ||
3023 | intel_hdmi_info(m, intel_connector); | ||
3024 | break; | ||
3025 | default: | ||
3026 | break; | ||
2968 | } | 3027 | } |
2969 | 3028 | ||
2970 | seq_printf(m, "\tmodes:\n"); | 3029 | seq_printf(m, "\tmodes:\n"); |
@@ -2974,7 +3033,7 @@ static void intel_connector_info(struct seq_file *m, | |||
2974 | 3033 | ||
2975 | static bool cursor_active(struct drm_device *dev, int pipe) | 3034 | static bool cursor_active(struct drm_device *dev, int pipe) |
2976 | { | 3035 | { |
2977 | struct drm_i915_private *dev_priv = dev->dev_private; | 3036 | struct drm_i915_private *dev_priv = to_i915(dev); |
2978 | u32 state; | 3037 | u32 state; |
2979 | 3038 | ||
2980 | if (IS_845G(dev) || IS_I865G(dev)) | 3039 | if (IS_845G(dev) || IS_I865G(dev)) |
@@ -2987,7 +3046,7 @@ static bool cursor_active(struct drm_device *dev, int pipe) | |||
2987 | 3046 | ||
2988 | static bool cursor_position(struct drm_device *dev, int pipe, int *x, int *y) | 3047 | static bool cursor_position(struct drm_device *dev, int pipe, int *x, int *y) |
2989 | { | 3048 | { |
2990 | struct drm_i915_private *dev_priv = dev->dev_private; | 3049 | struct drm_i915_private *dev_priv = to_i915(dev); |
2991 | u32 pos; | 3050 | u32 pos; |
2992 | 3051 | ||
2993 | pos = I915_READ(CURPOS(pipe)); | 3052 | pos = I915_READ(CURPOS(pipe)); |
@@ -3108,7 +3167,7 @@ static int i915_display_info(struct seq_file *m, void *unused) | |||
3108 | { | 3167 | { |
3109 | struct drm_info_node *node = m->private; | 3168 | struct drm_info_node *node = m->private; |
3110 | struct drm_device *dev = node->minor->dev; | 3169 | struct drm_device *dev = node->minor->dev; |
3111 | struct drm_i915_private *dev_priv = dev->dev_private; | 3170 | struct drm_i915_private *dev_priv = to_i915(dev); |
3112 | struct intel_crtc *crtc; | 3171 | struct intel_crtc *crtc; |
3113 | struct drm_connector *connector; | 3172 | struct drm_connector *connector; |
3114 | 3173 | ||
@@ -3163,13 +3222,13 @@ static int i915_semaphore_status(struct seq_file *m, void *unused) | |||
3163 | { | 3222 | { |
3164 | struct drm_info_node *node = (struct drm_info_node *) m->private; | 3223 | struct drm_info_node *node = (struct drm_info_node *) m->private; |
3165 | struct drm_device *dev = node->minor->dev; | 3224 | struct drm_device *dev = node->minor->dev; |
3166 | struct drm_i915_private *dev_priv = dev->dev_private; | 3225 | struct drm_i915_private *dev_priv = to_i915(dev); |
3167 | struct intel_engine_cs *engine; | 3226 | struct intel_engine_cs *engine; |
3168 | int num_rings = hweight32(INTEL_INFO(dev)->ring_mask); | 3227 | int num_rings = hweight32(INTEL_INFO(dev)->ring_mask); |
3169 | enum intel_engine_id id; | 3228 | enum intel_engine_id id; |
3170 | int j, ret; | 3229 | int j, ret; |
3171 | 3230 | ||
3172 | if (!i915_semaphore_is_enabled(dev)) { | 3231 | if (!i915_semaphore_is_enabled(dev_priv)) { |
3173 | seq_puts(m, "Semaphores are disabled\n"); | 3232 | seq_puts(m, "Semaphores are disabled\n"); |
3174 | return 0; | 3233 | return 0; |
3175 | } | 3234 | } |
@@ -3236,7 +3295,7 @@ static int i915_shared_dplls_info(struct seq_file *m, void *unused) | |||
3236 | { | 3295 | { |
3237 | struct drm_info_node *node = (struct drm_info_node *) m->private; | 3296 | struct drm_info_node *node = (struct drm_info_node *) m->private; |
3238 | struct drm_device *dev = node->minor->dev; | 3297 | struct drm_device *dev = node->minor->dev; |
3239 | struct drm_i915_private *dev_priv = dev->dev_private; | 3298 | struct drm_i915_private *dev_priv = to_i915(dev); |
3240 | int i; | 3299 | int i; |
3241 | 3300 | ||
3242 | drm_modeset_lock_all(dev); | 3301 | drm_modeset_lock_all(dev); |
@@ -3266,7 +3325,7 @@ static int i915_wa_registers(struct seq_file *m, void *unused) | |||
3266 | struct intel_engine_cs *engine; | 3325 | struct intel_engine_cs *engine; |
3267 | struct drm_info_node *node = (struct drm_info_node *) m->private; | 3326 | struct drm_info_node *node = (struct drm_info_node *) m->private; |
3268 | struct drm_device *dev = node->minor->dev; | 3327 | struct drm_device *dev = node->minor->dev; |
3269 | struct drm_i915_private *dev_priv = dev->dev_private; | 3328 | struct drm_i915_private *dev_priv = to_i915(dev); |
3270 | struct i915_workarounds *workarounds = &dev_priv->workarounds; | 3329 | struct i915_workarounds *workarounds = &dev_priv->workarounds; |
3271 | enum intel_engine_id id; | 3330 | enum intel_engine_id id; |
3272 | 3331 | ||
@@ -3304,7 +3363,7 @@ static int i915_ddb_info(struct seq_file *m, void *unused) | |||
3304 | { | 3363 | { |
3305 | struct drm_info_node *node = m->private; | 3364 | struct drm_info_node *node = m->private; |
3306 | struct drm_device *dev = node->minor->dev; | 3365 | struct drm_device *dev = node->minor->dev; |
3307 | struct drm_i915_private *dev_priv = dev->dev_private; | 3366 | struct drm_i915_private *dev_priv = to_i915(dev); |
3308 | struct skl_ddb_allocation *ddb; | 3367 | struct skl_ddb_allocation *ddb; |
3309 | struct skl_ddb_entry *entry; | 3368 | struct skl_ddb_entry *entry; |
3310 | enum pipe pipe; | 3369 | enum pipe pipe; |
@@ -3342,31 +3401,16 @@ static int i915_ddb_info(struct seq_file *m, void *unused) | |||
3342 | static void drrs_status_per_crtc(struct seq_file *m, | 3401 | static void drrs_status_per_crtc(struct seq_file *m, |
3343 | struct drm_device *dev, struct intel_crtc *intel_crtc) | 3402 | struct drm_device *dev, struct intel_crtc *intel_crtc) |
3344 | { | 3403 | { |
3345 | struct intel_encoder *intel_encoder; | 3404 | struct drm_i915_private *dev_priv = to_i915(dev); |
3346 | struct drm_i915_private *dev_priv = dev->dev_private; | ||
3347 | struct i915_drrs *drrs = &dev_priv->drrs; | 3405 | struct i915_drrs *drrs = &dev_priv->drrs; |
3348 | int vrefresh = 0; | 3406 | int vrefresh = 0; |
3407 | struct drm_connector *connector; | ||
3349 | 3408 | ||
3350 | for_each_encoder_on_crtc(dev, &intel_crtc->base, intel_encoder) { | 3409 | drm_for_each_connector(connector, dev) { |
3351 | /* Encoder connected on this CRTC */ | 3410 | if (connector->state->crtc != &intel_crtc->base) |
3352 | switch (intel_encoder->type) { | 3411 | continue; |
3353 | case INTEL_OUTPUT_EDP: | 3412 | |
3354 | seq_puts(m, "eDP:\n"); | 3413 | seq_printf(m, "%s:\n", connector->name); |
3355 | break; | ||
3356 | case INTEL_OUTPUT_DSI: | ||
3357 | seq_puts(m, "DSI:\n"); | ||
3358 | break; | ||
3359 | case INTEL_OUTPUT_HDMI: | ||
3360 | seq_puts(m, "HDMI:\n"); | ||
3361 | break; | ||
3362 | case INTEL_OUTPUT_DISPLAYPORT: | ||
3363 | seq_puts(m, "DP:\n"); | ||
3364 | break; | ||
3365 | default: | ||
3366 | seq_printf(m, "Other encoder (id=%d).\n", | ||
3367 | intel_encoder->type); | ||
3368 | return; | ||
3369 | } | ||
3370 | } | 3414 | } |
3371 | 3415 | ||
3372 | if (dev_priv->vbt.drrs_type == STATIC_DRRS_SUPPORT) | 3416 | if (dev_priv->vbt.drrs_type == STATIC_DRRS_SUPPORT) |
@@ -3429,18 +3473,16 @@ static int i915_drrs_status(struct seq_file *m, void *unused) | |||
3429 | struct intel_crtc *intel_crtc; | 3473 | struct intel_crtc *intel_crtc; |
3430 | int active_crtc_cnt = 0; | 3474 | int active_crtc_cnt = 0; |
3431 | 3475 | ||
3476 | drm_modeset_lock_all(dev); | ||
3432 | for_each_intel_crtc(dev, intel_crtc) { | 3477 | for_each_intel_crtc(dev, intel_crtc) { |
3433 | drm_modeset_lock(&intel_crtc->base.mutex, NULL); | ||
3434 | |||
3435 | if (intel_crtc->base.state->active) { | 3478 | if (intel_crtc->base.state->active) { |
3436 | active_crtc_cnt++; | 3479 | active_crtc_cnt++; |
3437 | seq_printf(m, "\nCRTC %d: ", active_crtc_cnt); | 3480 | seq_printf(m, "\nCRTC %d: ", active_crtc_cnt); |
3438 | 3481 | ||
3439 | drrs_status_per_crtc(m, dev, intel_crtc); | 3482 | drrs_status_per_crtc(m, dev, intel_crtc); |
3440 | } | 3483 | } |
3441 | |||
3442 | drm_modeset_unlock(&intel_crtc->base.mutex); | ||
3443 | } | 3484 | } |
3485 | drm_modeset_unlock_all(dev); | ||
3444 | 3486 | ||
3445 | if (!active_crtc_cnt) | 3487 | if (!active_crtc_cnt) |
3446 | seq_puts(m, "No active crtc found\n"); | 3488 | seq_puts(m, "No active crtc found\n"); |
@@ -3458,17 +3500,23 @@ static int i915_dp_mst_info(struct seq_file *m, void *unused) | |||
3458 | { | 3500 | { |
3459 | struct drm_info_node *node = (struct drm_info_node *) m->private; | 3501 | struct drm_info_node *node = (struct drm_info_node *) m->private; |
3460 | struct drm_device *dev = node->minor->dev; | 3502 | struct drm_device *dev = node->minor->dev; |
3461 | struct drm_encoder *encoder; | ||
3462 | struct intel_encoder *intel_encoder; | 3503 | struct intel_encoder *intel_encoder; |
3463 | struct intel_digital_port *intel_dig_port; | 3504 | struct intel_digital_port *intel_dig_port; |
3505 | struct drm_connector *connector; | ||
3506 | |||
3464 | drm_modeset_lock_all(dev); | 3507 | drm_modeset_lock_all(dev); |
3465 | list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) { | 3508 | drm_for_each_connector(connector, dev) { |
3466 | intel_encoder = to_intel_encoder(encoder); | 3509 | if (connector->connector_type != DRM_MODE_CONNECTOR_DisplayPort) |
3467 | if (intel_encoder->type != INTEL_OUTPUT_DISPLAYPORT) | ||
3468 | continue; | 3510 | continue; |
3469 | intel_dig_port = enc_to_dig_port(encoder); | 3511 | |
3512 | intel_encoder = intel_attached_encoder(connector); | ||
3513 | if (!intel_encoder || intel_encoder->type == INTEL_OUTPUT_DP_MST) | ||
3514 | continue; | ||
3515 | |||
3516 | intel_dig_port = enc_to_dig_port(&intel_encoder->base); | ||
3470 | if (!intel_dig_port->dp.can_mst) | 3517 | if (!intel_dig_port->dp.can_mst) |
3471 | continue; | 3518 | continue; |
3519 | |||
3472 | seq_printf(m, "MST Source Port %c\n", | 3520 | seq_printf(m, "MST Source Port %c\n", |
3473 | port_name(intel_dig_port->port)); | 3521 | port_name(intel_dig_port->port)); |
3474 | drm_dp_mst_dump_topology(m, &intel_dig_port->dp.mst_mgr); | 3522 | drm_dp_mst_dump_topology(m, &intel_dig_port->dp.mst_mgr); |
@@ -3480,7 +3528,7 @@ static int i915_dp_mst_info(struct seq_file *m, void *unused) | |||
3480 | static int i915_pipe_crc_open(struct inode *inode, struct file *filep) | 3528 | static int i915_pipe_crc_open(struct inode *inode, struct file *filep) |
3481 | { | 3529 | { |
3482 | struct pipe_crc_info *info = inode->i_private; | 3530 | struct pipe_crc_info *info = inode->i_private; |
3483 | struct drm_i915_private *dev_priv = info->dev->dev_private; | 3531 | struct drm_i915_private *dev_priv = to_i915(info->dev); |
3484 | struct intel_pipe_crc *pipe_crc = &dev_priv->pipe_crc[info->pipe]; | 3532 | struct intel_pipe_crc *pipe_crc = &dev_priv->pipe_crc[info->pipe]; |
3485 | 3533 | ||
3486 | if (info->pipe >= INTEL_INFO(info->dev)->num_pipes) | 3534 | if (info->pipe >= INTEL_INFO(info->dev)->num_pipes) |
@@ -3504,7 +3552,7 @@ static int i915_pipe_crc_open(struct inode *inode, struct file *filep) | |||
3504 | static int i915_pipe_crc_release(struct inode *inode, struct file *filep) | 3552 | static int i915_pipe_crc_release(struct inode *inode, struct file *filep) |
3505 | { | 3553 | { |
3506 | struct pipe_crc_info *info = inode->i_private; | 3554 | struct pipe_crc_info *info = inode->i_private; |
3507 | struct drm_i915_private *dev_priv = info->dev->dev_private; | 3555 | struct drm_i915_private *dev_priv = to_i915(info->dev); |
3508 | struct intel_pipe_crc *pipe_crc = &dev_priv->pipe_crc[info->pipe]; | 3556 | struct intel_pipe_crc *pipe_crc = &dev_priv->pipe_crc[info->pipe]; |
3509 | 3557 | ||
3510 | spin_lock_irq(&pipe_crc->lock); | 3558 | spin_lock_irq(&pipe_crc->lock); |
@@ -3532,7 +3580,7 @@ i915_pipe_crc_read(struct file *filep, char __user *user_buf, size_t count, | |||
3532 | { | 3580 | { |
3533 | struct pipe_crc_info *info = filep->private_data; | 3581 | struct pipe_crc_info *info = filep->private_data; |
3534 | struct drm_device *dev = info->dev; | 3582 | struct drm_device *dev = info->dev; |
3535 | struct drm_i915_private *dev_priv = dev->dev_private; | 3583 | struct drm_i915_private *dev_priv = to_i915(dev); |
3536 | struct intel_pipe_crc *pipe_crc = &dev_priv->pipe_crc[info->pipe]; | 3584 | struct intel_pipe_crc *pipe_crc = &dev_priv->pipe_crc[info->pipe]; |
3537 | char buf[PIPE_CRC_BUFFER_LEN]; | 3585 | char buf[PIPE_CRC_BUFFER_LEN]; |
3538 | int n_entries; | 3586 | int n_entries; |
@@ -3665,7 +3713,7 @@ static const char *pipe_crc_source_name(enum intel_pipe_crc_source source) | |||
3665 | static int display_crc_ctl_show(struct seq_file *m, void *data) | 3713 | static int display_crc_ctl_show(struct seq_file *m, void *data) |
3666 | { | 3714 | { |
3667 | struct drm_device *dev = m->private; | 3715 | struct drm_device *dev = m->private; |
3668 | struct drm_i915_private *dev_priv = dev->dev_private; | 3716 | struct drm_i915_private *dev_priv = to_i915(dev); |
3669 | int i; | 3717 | int i; |
3670 | 3718 | ||
3671 | for (i = 0; i < I915_MAX_PIPES; i++) | 3719 | for (i = 0; i < I915_MAX_PIPES; i++) |
@@ -3726,7 +3774,7 @@ static int i9xx_pipe_crc_auto_source(struct drm_device *dev, enum pipe pipe, | |||
3726 | case INTEL_OUTPUT_TVOUT: | 3774 | case INTEL_OUTPUT_TVOUT: |
3727 | *source = INTEL_PIPE_CRC_SOURCE_TV; | 3775 | *source = INTEL_PIPE_CRC_SOURCE_TV; |
3728 | break; | 3776 | break; |
3729 | case INTEL_OUTPUT_DISPLAYPORT: | 3777 | case INTEL_OUTPUT_DP: |
3730 | case INTEL_OUTPUT_EDP: | 3778 | case INTEL_OUTPUT_EDP: |
3731 | dig_port = enc_to_dig_port(&encoder->base); | 3779 | dig_port = enc_to_dig_port(&encoder->base); |
3732 | switch (dig_port->port) { | 3780 | switch (dig_port->port) { |
@@ -3759,7 +3807,7 @@ static int vlv_pipe_crc_ctl_reg(struct drm_device *dev, | |||
3759 | enum intel_pipe_crc_source *source, | 3807 | enum intel_pipe_crc_source *source, |
3760 | uint32_t *val) | 3808 | uint32_t *val) |
3761 | { | 3809 | { |
3762 | struct drm_i915_private *dev_priv = dev->dev_private; | 3810 | struct drm_i915_private *dev_priv = to_i915(dev); |
3763 | bool need_stable_symbols = false; | 3811 | bool need_stable_symbols = false; |
3764 | 3812 | ||
3765 | if (*source == INTEL_PIPE_CRC_SOURCE_AUTO) { | 3813 | if (*source == INTEL_PIPE_CRC_SOURCE_AUTO) { |
@@ -3830,7 +3878,7 @@ static int i9xx_pipe_crc_ctl_reg(struct drm_device *dev, | |||
3830 | enum intel_pipe_crc_source *source, | 3878 | enum intel_pipe_crc_source *source, |
3831 | uint32_t *val) | 3879 | uint32_t *val) |
3832 | { | 3880 | { |
3833 | struct drm_i915_private *dev_priv = dev->dev_private; | 3881 | struct drm_i915_private *dev_priv = to_i915(dev); |
3834 | bool need_stable_symbols = false; | 3882 | bool need_stable_symbols = false; |
3835 | 3883 | ||
3836 | if (*source == INTEL_PIPE_CRC_SOURCE_AUTO) { | 3884 | if (*source == INTEL_PIPE_CRC_SOURCE_AUTO) { |
@@ -3904,7 +3952,7 @@ static int i9xx_pipe_crc_ctl_reg(struct drm_device *dev, | |||
3904 | static void vlv_undo_pipe_scramble_reset(struct drm_device *dev, | 3952 | static void vlv_undo_pipe_scramble_reset(struct drm_device *dev, |
3905 | enum pipe pipe) | 3953 | enum pipe pipe) |
3906 | { | 3954 | { |
3907 | struct drm_i915_private *dev_priv = dev->dev_private; | 3955 | struct drm_i915_private *dev_priv = to_i915(dev); |
3908 | uint32_t tmp = I915_READ(PORT_DFT2_G4X); | 3956 | uint32_t tmp = I915_READ(PORT_DFT2_G4X); |
3909 | 3957 | ||
3910 | switch (pipe) { | 3958 | switch (pipe) { |
@@ -3929,7 +3977,7 @@ static void vlv_undo_pipe_scramble_reset(struct drm_device *dev, | |||
3929 | static void g4x_undo_pipe_scramble_reset(struct drm_device *dev, | 3977 | static void g4x_undo_pipe_scramble_reset(struct drm_device *dev, |
3930 | enum pipe pipe) | 3978 | enum pipe pipe) |
3931 | { | 3979 | { |
3932 | struct drm_i915_private *dev_priv = dev->dev_private; | 3980 | struct drm_i915_private *dev_priv = to_i915(dev); |
3933 | uint32_t tmp = I915_READ(PORT_DFT2_G4X); | 3981 | uint32_t tmp = I915_READ(PORT_DFT2_G4X); |
3934 | 3982 | ||
3935 | if (pipe == PIPE_A) | 3983 | if (pipe == PIPE_A) |
@@ -3972,7 +4020,7 @@ static int ilk_pipe_crc_ctl_reg(enum intel_pipe_crc_source *source, | |||
3972 | 4020 | ||
3973 | static void hsw_trans_edp_pipe_A_crc_wa(struct drm_device *dev, bool enable) | 4021 | static void hsw_trans_edp_pipe_A_crc_wa(struct drm_device *dev, bool enable) |
3974 | { | 4022 | { |
3975 | struct drm_i915_private *dev_priv = dev->dev_private; | 4023 | struct drm_i915_private *dev_priv = to_i915(dev); |
3976 | struct intel_crtc *crtc = | 4024 | struct intel_crtc *crtc = |
3977 | to_intel_crtc(dev_priv->pipe_to_crtc_mapping[PIPE_A]); | 4025 | to_intel_crtc(dev_priv->pipe_to_crtc_mapping[PIPE_A]); |
3978 | struct intel_crtc_state *pipe_config; | 4026 | struct intel_crtc_state *pipe_config; |
@@ -4040,7 +4088,7 @@ static int ivb_pipe_crc_ctl_reg(struct drm_device *dev, | |||
4040 | static int pipe_crc_set_source(struct drm_device *dev, enum pipe pipe, | 4088 | static int pipe_crc_set_source(struct drm_device *dev, enum pipe pipe, |
4041 | enum intel_pipe_crc_source source) | 4089 | enum intel_pipe_crc_source source) |
4042 | { | 4090 | { |
4043 | struct drm_i915_private *dev_priv = dev->dev_private; | 4091 | struct drm_i915_private *dev_priv = to_i915(dev); |
4044 | struct intel_pipe_crc *pipe_crc = &dev_priv->pipe_crc[pipe]; | 4092 | struct intel_pipe_crc *pipe_crc = &dev_priv->pipe_crc[pipe]; |
4045 | struct intel_crtc *crtc = to_intel_crtc(intel_get_crtc_for_pipe(dev, | 4093 | struct intel_crtc *crtc = to_intel_crtc(intel_get_crtc_for_pipe(dev, |
4046 | pipe)); | 4094 | pipe)); |
@@ -4547,7 +4595,7 @@ static void wm_latency_show(struct seq_file *m, const uint16_t wm[8]) | |||
4547 | static int pri_wm_latency_show(struct seq_file *m, void *data) | 4595 | static int pri_wm_latency_show(struct seq_file *m, void *data) |
4548 | { | 4596 | { |
4549 | struct drm_device *dev = m->private; | 4597 | struct drm_device *dev = m->private; |
4550 | struct drm_i915_private *dev_priv = dev->dev_private; | 4598 | struct drm_i915_private *dev_priv = to_i915(dev); |
4551 | const uint16_t *latencies; | 4599 | const uint16_t *latencies; |
4552 | 4600 | ||
4553 | if (INTEL_INFO(dev)->gen >= 9) | 4601 | if (INTEL_INFO(dev)->gen >= 9) |
@@ -4563,7 +4611,7 @@ static int pri_wm_latency_show(struct seq_file *m, void *data) | |||
4563 | static int spr_wm_latency_show(struct seq_file *m, void *data) | 4611 | static int spr_wm_latency_show(struct seq_file *m, void *data) |
4564 | { | 4612 | { |
4565 | struct drm_device *dev = m->private; | 4613 | struct drm_device *dev = m->private; |
4566 | struct drm_i915_private *dev_priv = dev->dev_private; | 4614 | struct drm_i915_private *dev_priv = to_i915(dev); |
4567 | const uint16_t *latencies; | 4615 | const uint16_t *latencies; |
4568 | 4616 | ||
4569 | if (INTEL_INFO(dev)->gen >= 9) | 4617 | if (INTEL_INFO(dev)->gen >= 9) |
@@ -4579,7 +4627,7 @@ static int spr_wm_latency_show(struct seq_file *m, void *data) | |||
4579 | static int cur_wm_latency_show(struct seq_file *m, void *data) | 4627 | static int cur_wm_latency_show(struct seq_file *m, void *data) |
4580 | { | 4628 | { |
4581 | struct drm_device *dev = m->private; | 4629 | struct drm_device *dev = m->private; |
4582 | struct drm_i915_private *dev_priv = dev->dev_private; | 4630 | struct drm_i915_private *dev_priv = to_i915(dev); |
4583 | const uint16_t *latencies; | 4631 | const uint16_t *latencies; |
4584 | 4632 | ||
4585 | if (INTEL_INFO(dev)->gen >= 9) | 4633 | if (INTEL_INFO(dev)->gen >= 9) |
@@ -4670,7 +4718,7 @@ static ssize_t pri_wm_latency_write(struct file *file, const char __user *ubuf, | |||
4670 | { | 4718 | { |
4671 | struct seq_file *m = file->private_data; | 4719 | struct seq_file *m = file->private_data; |
4672 | struct drm_device *dev = m->private; | 4720 | struct drm_device *dev = m->private; |
4673 | struct drm_i915_private *dev_priv = dev->dev_private; | 4721 | struct drm_i915_private *dev_priv = to_i915(dev); |
4674 | uint16_t *latencies; | 4722 | uint16_t *latencies; |
4675 | 4723 | ||
4676 | if (INTEL_INFO(dev)->gen >= 9) | 4724 | if (INTEL_INFO(dev)->gen >= 9) |
@@ -4686,7 +4734,7 @@ static ssize_t spr_wm_latency_write(struct file *file, const char __user *ubuf, | |||
4686 | { | 4734 | { |
4687 | struct seq_file *m = file->private_data; | 4735 | struct seq_file *m = file->private_data; |
4688 | struct drm_device *dev = m->private; | 4736 | struct drm_device *dev = m->private; |
4689 | struct drm_i915_private *dev_priv = dev->dev_private; | 4737 | struct drm_i915_private *dev_priv = to_i915(dev); |
4690 | uint16_t *latencies; | 4738 | uint16_t *latencies; |
4691 | 4739 | ||
4692 | if (INTEL_INFO(dev)->gen >= 9) | 4740 | if (INTEL_INFO(dev)->gen >= 9) |
@@ -4702,7 +4750,7 @@ static ssize_t cur_wm_latency_write(struct file *file, const char __user *ubuf, | |||
4702 | { | 4750 | { |
4703 | struct seq_file *m = file->private_data; | 4751 | struct seq_file *m = file->private_data; |
4704 | struct drm_device *dev = m->private; | 4752 | struct drm_device *dev = m->private; |
4705 | struct drm_i915_private *dev_priv = dev->dev_private; | 4753 | struct drm_i915_private *dev_priv = to_i915(dev); |
4706 | uint16_t *latencies; | 4754 | uint16_t *latencies; |
4707 | 4755 | ||
4708 | if (INTEL_INFO(dev)->gen >= 9) | 4756 | if (INTEL_INFO(dev)->gen >= 9) |
@@ -4744,7 +4792,7 @@ static int | |||
4744 | i915_wedged_get(void *data, u64 *val) | 4792 | i915_wedged_get(void *data, u64 *val) |
4745 | { | 4793 | { |
4746 | struct drm_device *dev = data; | 4794 | struct drm_device *dev = data; |
4747 | struct drm_i915_private *dev_priv = dev->dev_private; | 4795 | struct drm_i915_private *dev_priv = to_i915(dev); |
4748 | 4796 | ||
4749 | *val = i915_terminally_wedged(&dev_priv->gpu_error); | 4797 | *val = i915_terminally_wedged(&dev_priv->gpu_error); |
4750 | 4798 | ||
@@ -4755,7 +4803,7 @@ static int | |||
4755 | i915_wedged_set(void *data, u64 val) | 4803 | i915_wedged_set(void *data, u64 val) |
4756 | { | 4804 | { |
4757 | struct drm_device *dev = data; | 4805 | struct drm_device *dev = data; |
4758 | struct drm_i915_private *dev_priv = dev->dev_private; | 4806 | struct drm_i915_private *dev_priv = to_i915(dev); |
4759 | 4807 | ||
4760 | /* | 4808 | /* |
4761 | * There is no safeguard against this debugfs entry colliding | 4809 | * There is no safeguard against this debugfs entry colliding |
@@ -4770,7 +4818,7 @@ i915_wedged_set(void *data, u64 val) | |||
4770 | 4818 | ||
4771 | intel_runtime_pm_get(dev_priv); | 4819 | intel_runtime_pm_get(dev_priv); |
4772 | 4820 | ||
4773 | i915_handle_error(dev, val, | 4821 | i915_handle_error(dev_priv, val, |
4774 | "Manually setting wedged to %llu", val); | 4822 | "Manually setting wedged to %llu", val); |
4775 | 4823 | ||
4776 | intel_runtime_pm_put(dev_priv); | 4824 | intel_runtime_pm_put(dev_priv); |
@@ -4783,44 +4831,10 @@ DEFINE_SIMPLE_ATTRIBUTE(i915_wedged_fops, | |||
4783 | "%llu\n"); | 4831 | "%llu\n"); |
4784 | 4832 | ||
4785 | static int | 4833 | static int |
4786 | i915_ring_stop_get(void *data, u64 *val) | ||
4787 | { | ||
4788 | struct drm_device *dev = data; | ||
4789 | struct drm_i915_private *dev_priv = dev->dev_private; | ||
4790 | |||
4791 | *val = dev_priv->gpu_error.stop_rings; | ||
4792 | |||
4793 | return 0; | ||
4794 | } | ||
4795 | |||
4796 | static int | ||
4797 | i915_ring_stop_set(void *data, u64 val) | ||
4798 | { | ||
4799 | struct drm_device *dev = data; | ||
4800 | struct drm_i915_private *dev_priv = dev->dev_private; | ||
4801 | int ret; | ||
4802 | |||
4803 | DRM_DEBUG_DRIVER("Stopping rings 0x%08llx\n", val); | ||
4804 | |||
4805 | ret = mutex_lock_interruptible(&dev->struct_mutex); | ||
4806 | if (ret) | ||
4807 | return ret; | ||
4808 | |||
4809 | dev_priv->gpu_error.stop_rings = val; | ||
4810 | mutex_unlock(&dev->struct_mutex); | ||
4811 | |||
4812 | return 0; | ||
4813 | } | ||
4814 | |||
4815 | DEFINE_SIMPLE_ATTRIBUTE(i915_ring_stop_fops, | ||
4816 | i915_ring_stop_get, i915_ring_stop_set, | ||
4817 | "0x%08llx\n"); | ||
4818 | |||
4819 | static int | ||
4820 | i915_ring_missed_irq_get(void *data, u64 *val) | 4834 | i915_ring_missed_irq_get(void *data, u64 *val) |
4821 | { | 4835 | { |
4822 | struct drm_device *dev = data; | 4836 | struct drm_device *dev = data; |
4823 | struct drm_i915_private *dev_priv = dev->dev_private; | 4837 | struct drm_i915_private *dev_priv = to_i915(dev); |
4824 | 4838 | ||
4825 | *val = dev_priv->gpu_error.missed_irq_rings; | 4839 | *val = dev_priv->gpu_error.missed_irq_rings; |
4826 | return 0; | 4840 | return 0; |
@@ -4830,7 +4844,7 @@ static int | |||
4830 | i915_ring_missed_irq_set(void *data, u64 val) | 4844 | i915_ring_missed_irq_set(void *data, u64 val) |
4831 | { | 4845 | { |
4832 | struct drm_device *dev = data; | 4846 | struct drm_device *dev = data; |
4833 | struct drm_i915_private *dev_priv = dev->dev_private; | 4847 | struct drm_i915_private *dev_priv = to_i915(dev); |
4834 | int ret; | 4848 | int ret; |
4835 | 4849 | ||
4836 | /* Lock against concurrent debugfs callers */ | 4850 | /* Lock against concurrent debugfs callers */ |
@@ -4851,7 +4865,7 @@ static int | |||
4851 | i915_ring_test_irq_get(void *data, u64 *val) | 4865 | i915_ring_test_irq_get(void *data, u64 *val) |
4852 | { | 4866 | { |
4853 | struct drm_device *dev = data; | 4867 | struct drm_device *dev = data; |
4854 | struct drm_i915_private *dev_priv = dev->dev_private; | 4868 | struct drm_i915_private *dev_priv = to_i915(dev); |
4855 | 4869 | ||
4856 | *val = dev_priv->gpu_error.test_irq_rings; | 4870 | *val = dev_priv->gpu_error.test_irq_rings; |
4857 | 4871 | ||
@@ -4862,18 +4876,11 @@ static int | |||
4862 | i915_ring_test_irq_set(void *data, u64 val) | 4876 | i915_ring_test_irq_set(void *data, u64 val) |
4863 | { | 4877 | { |
4864 | struct drm_device *dev = data; | 4878 | struct drm_device *dev = data; |
4865 | struct drm_i915_private *dev_priv = dev->dev_private; | 4879 | struct drm_i915_private *dev_priv = to_i915(dev); |
4866 | int ret; | ||
4867 | 4880 | ||
4881 | val &= INTEL_INFO(dev_priv)->ring_mask; | ||
4868 | DRM_DEBUG_DRIVER("Masking interrupts on rings 0x%08llx\n", val); | 4882 | DRM_DEBUG_DRIVER("Masking interrupts on rings 0x%08llx\n", val); |
4869 | |||
4870 | /* Lock against concurrent debugfs callers */ | ||
4871 | ret = mutex_lock_interruptible(&dev->struct_mutex); | ||
4872 | if (ret) | ||
4873 | return ret; | ||
4874 | |||
4875 | dev_priv->gpu_error.test_irq_rings = val; | 4883 | dev_priv->gpu_error.test_irq_rings = val; |
4876 | mutex_unlock(&dev->struct_mutex); | ||
4877 | 4884 | ||
4878 | return 0; | 4885 | return 0; |
4879 | } | 4886 | } |
@@ -4902,7 +4909,7 @@ static int | |||
4902 | i915_drop_caches_set(void *data, u64 val) | 4909 | i915_drop_caches_set(void *data, u64 val) |
4903 | { | 4910 | { |
4904 | struct drm_device *dev = data; | 4911 | struct drm_device *dev = data; |
4905 | struct drm_i915_private *dev_priv = dev->dev_private; | 4912 | struct drm_i915_private *dev_priv = to_i915(dev); |
4906 | int ret; | 4913 | int ret; |
4907 | 4914 | ||
4908 | DRM_DEBUG("Dropping caches: 0x%08llx\n", val); | 4915 | DRM_DEBUG("Dropping caches: 0x%08llx\n", val); |
@@ -4914,13 +4921,13 @@ i915_drop_caches_set(void *data, u64 val) | |||
4914 | return ret; | 4921 | return ret; |
4915 | 4922 | ||
4916 | if (val & DROP_ACTIVE) { | 4923 | if (val & DROP_ACTIVE) { |
4917 | ret = i915_gpu_idle(dev); | 4924 | ret = i915_gem_wait_for_idle(dev_priv); |
4918 | if (ret) | 4925 | if (ret) |
4919 | goto unlock; | 4926 | goto unlock; |
4920 | } | 4927 | } |
4921 | 4928 | ||
4922 | if (val & (DROP_RETIRE | DROP_ACTIVE)) | 4929 | if (val & (DROP_RETIRE | DROP_ACTIVE)) |
4923 | i915_gem_retire_requests(dev); | 4930 | i915_gem_retire_requests(dev_priv); |
4924 | 4931 | ||
4925 | if (val & DROP_BOUND) | 4932 | if (val & DROP_BOUND) |
4926 | i915_gem_shrink(dev_priv, LONG_MAX, I915_SHRINK_BOUND); | 4933 | i915_gem_shrink(dev_priv, LONG_MAX, I915_SHRINK_BOUND); |
@@ -4942,7 +4949,7 @@ static int | |||
4942 | i915_max_freq_get(void *data, u64 *val) | 4949 | i915_max_freq_get(void *data, u64 *val) |
4943 | { | 4950 | { |
4944 | struct drm_device *dev = data; | 4951 | struct drm_device *dev = data; |
4945 | struct drm_i915_private *dev_priv = dev->dev_private; | 4952 | struct drm_i915_private *dev_priv = to_i915(dev); |
4946 | int ret; | 4953 | int ret; |
4947 | 4954 | ||
4948 | if (INTEL_INFO(dev)->gen < 6) | 4955 | if (INTEL_INFO(dev)->gen < 6) |
@@ -4964,7 +4971,7 @@ static int | |||
4964 | i915_max_freq_set(void *data, u64 val) | 4971 | i915_max_freq_set(void *data, u64 val) |
4965 | { | 4972 | { |
4966 | struct drm_device *dev = data; | 4973 | struct drm_device *dev = data; |
4967 | struct drm_i915_private *dev_priv = dev->dev_private; | 4974 | struct drm_i915_private *dev_priv = to_i915(dev); |
4968 | u32 hw_max, hw_min; | 4975 | u32 hw_max, hw_min; |
4969 | int ret; | 4976 | int ret; |
4970 | 4977 | ||
@@ -4994,7 +5001,7 @@ i915_max_freq_set(void *data, u64 val) | |||
4994 | 5001 | ||
4995 | dev_priv->rps.max_freq_softlimit = val; | 5002 | dev_priv->rps.max_freq_softlimit = val; |
4996 | 5003 | ||
4997 | intel_set_rps(dev, val); | 5004 | intel_set_rps(dev_priv, val); |
4998 | 5005 | ||
4999 | mutex_unlock(&dev_priv->rps.hw_lock); | 5006 | mutex_unlock(&dev_priv->rps.hw_lock); |
5000 | 5007 | ||
@@ -5009,7 +5016,7 @@ static int | |||
5009 | i915_min_freq_get(void *data, u64 *val) | 5016 | i915_min_freq_get(void *data, u64 *val) |
5010 | { | 5017 | { |
5011 | struct drm_device *dev = data; | 5018 | struct drm_device *dev = data; |
5012 | struct drm_i915_private *dev_priv = dev->dev_private; | 5019 | struct drm_i915_private *dev_priv = to_i915(dev); |
5013 | int ret; | 5020 | int ret; |
5014 | 5021 | ||
5015 | if (INTEL_INFO(dev)->gen < 6) | 5022 | if (INTEL_INFO(dev)->gen < 6) |
@@ -5031,7 +5038,7 @@ static int | |||
5031 | i915_min_freq_set(void *data, u64 val) | 5038 | i915_min_freq_set(void *data, u64 val) |
5032 | { | 5039 | { |
5033 | struct drm_device *dev = data; | 5040 | struct drm_device *dev = data; |
5034 | struct drm_i915_private *dev_priv = dev->dev_private; | 5041 | struct drm_i915_private *dev_priv = to_i915(dev); |
5035 | u32 hw_max, hw_min; | 5042 | u32 hw_max, hw_min; |
5036 | int ret; | 5043 | int ret; |
5037 | 5044 | ||
@@ -5061,7 +5068,7 @@ i915_min_freq_set(void *data, u64 val) | |||
5061 | 5068 | ||
5062 | dev_priv->rps.min_freq_softlimit = val; | 5069 | dev_priv->rps.min_freq_softlimit = val; |
5063 | 5070 | ||
5064 | intel_set_rps(dev, val); | 5071 | intel_set_rps(dev_priv, val); |
5065 | 5072 | ||
5066 | mutex_unlock(&dev_priv->rps.hw_lock); | 5073 | mutex_unlock(&dev_priv->rps.hw_lock); |
5067 | 5074 | ||
@@ -5076,7 +5083,7 @@ static int | |||
5076 | i915_cache_sharing_get(void *data, u64 *val) | 5083 | i915_cache_sharing_get(void *data, u64 *val) |
5077 | { | 5084 | { |
5078 | struct drm_device *dev = data; | 5085 | struct drm_device *dev = data; |
5079 | struct drm_i915_private *dev_priv = dev->dev_private; | 5086 | struct drm_i915_private *dev_priv = to_i915(dev); |
5080 | u32 snpcr; | 5087 | u32 snpcr; |
5081 | int ret; | 5088 | int ret; |
5082 | 5089 | ||
@@ -5091,7 +5098,7 @@ i915_cache_sharing_get(void *data, u64 *val) | |||
5091 | snpcr = I915_READ(GEN6_MBCUNIT_SNPCR); | 5098 | snpcr = I915_READ(GEN6_MBCUNIT_SNPCR); |
5092 | 5099 | ||
5093 | intel_runtime_pm_put(dev_priv); | 5100 | intel_runtime_pm_put(dev_priv); |
5094 | mutex_unlock(&dev_priv->dev->struct_mutex); | 5101 | mutex_unlock(&dev_priv->drm.struct_mutex); |
5095 | 5102 | ||
5096 | *val = (snpcr & GEN6_MBC_SNPCR_MASK) >> GEN6_MBC_SNPCR_SHIFT; | 5103 | *val = (snpcr & GEN6_MBC_SNPCR_MASK) >> GEN6_MBC_SNPCR_SHIFT; |
5097 | 5104 | ||
@@ -5102,7 +5109,7 @@ static int | |||
5102 | i915_cache_sharing_set(void *data, u64 val) | 5109 | i915_cache_sharing_set(void *data, u64 val) |
5103 | { | 5110 | { |
5104 | struct drm_device *dev = data; | 5111 | struct drm_device *dev = data; |
5105 | struct drm_i915_private *dev_priv = dev->dev_private; | 5112 | struct drm_i915_private *dev_priv = to_i915(dev); |
5106 | u32 snpcr; | 5113 | u32 snpcr; |
5107 | 5114 | ||
5108 | if (!(IS_GEN6(dev) || IS_GEN7(dev))) | 5115 | if (!(IS_GEN6(dev) || IS_GEN7(dev))) |
@@ -5139,7 +5146,7 @@ struct sseu_dev_status { | |||
5139 | static void cherryview_sseu_device_status(struct drm_device *dev, | 5146 | static void cherryview_sseu_device_status(struct drm_device *dev, |
5140 | struct sseu_dev_status *stat) | 5147 | struct sseu_dev_status *stat) |
5141 | { | 5148 | { |
5142 | struct drm_i915_private *dev_priv = dev->dev_private; | 5149 | struct drm_i915_private *dev_priv = to_i915(dev); |
5143 | int ss_max = 2; | 5150 | int ss_max = 2; |
5144 | int ss; | 5151 | int ss; |
5145 | u32 sig1[ss_max], sig2[ss_max]; | 5152 | u32 sig1[ss_max], sig2[ss_max]; |
@@ -5171,7 +5178,7 @@ static void cherryview_sseu_device_status(struct drm_device *dev, | |||
5171 | static void gen9_sseu_device_status(struct drm_device *dev, | 5178 | static void gen9_sseu_device_status(struct drm_device *dev, |
5172 | struct sseu_dev_status *stat) | 5179 | struct sseu_dev_status *stat) |
5173 | { | 5180 | { |
5174 | struct drm_i915_private *dev_priv = dev->dev_private; | 5181 | struct drm_i915_private *dev_priv = to_i915(dev); |
5175 | int s_max = 3, ss_max = 4; | 5182 | int s_max = 3, ss_max = 4; |
5176 | int s, ss; | 5183 | int s, ss; |
5177 | u32 s_reg[s_max], eu_reg[2*s_max], eu_mask[2]; | 5184 | u32 s_reg[s_max], eu_reg[2*s_max], eu_mask[2]; |
@@ -5236,7 +5243,7 @@ static void gen9_sseu_device_status(struct drm_device *dev, | |||
5236 | static void broadwell_sseu_device_status(struct drm_device *dev, | 5243 | static void broadwell_sseu_device_status(struct drm_device *dev, |
5237 | struct sseu_dev_status *stat) | 5244 | struct sseu_dev_status *stat) |
5238 | { | 5245 | { |
5239 | struct drm_i915_private *dev_priv = dev->dev_private; | 5246 | struct drm_i915_private *dev_priv = to_i915(dev); |
5240 | int s; | 5247 | int s; |
5241 | u32 slice_info = I915_READ(GEN8_GT_SLICE_INFO); | 5248 | u32 slice_info = I915_READ(GEN8_GT_SLICE_INFO); |
5242 | 5249 | ||
@@ -5278,6 +5285,10 @@ static int i915_sseu_status(struct seq_file *m, void *unused) | |||
5278 | INTEL_INFO(dev)->eu_total); | 5285 | INTEL_INFO(dev)->eu_total); |
5279 | seq_printf(m, " Available EU Per Subslice: %u\n", | 5286 | seq_printf(m, " Available EU Per Subslice: %u\n", |
5280 | INTEL_INFO(dev)->eu_per_subslice); | 5287 | INTEL_INFO(dev)->eu_per_subslice); |
5288 | seq_printf(m, " Has Pooled EU: %s\n", yesno(HAS_POOLED_EU(dev))); | ||
5289 | if (HAS_POOLED_EU(dev)) | ||
5290 | seq_printf(m, " Min EU in pool: %u\n", | ||
5291 | INTEL_INFO(dev)->min_eu_in_pool); | ||
5281 | seq_printf(m, " Has Slice Power Gating: %s\n", | 5292 | seq_printf(m, " Has Slice Power Gating: %s\n", |
5282 | yesno(INTEL_INFO(dev)->has_slice_pg)); | 5293 | yesno(INTEL_INFO(dev)->has_slice_pg)); |
5283 | seq_printf(m, " Has Subslice Power Gating: %s\n", | 5294 | seq_printf(m, " Has Subslice Power Gating: %s\n", |
@@ -5311,7 +5322,7 @@ static int i915_sseu_status(struct seq_file *m, void *unused) | |||
5311 | static int i915_forcewake_open(struct inode *inode, struct file *file) | 5322 | static int i915_forcewake_open(struct inode *inode, struct file *file) |
5312 | { | 5323 | { |
5313 | struct drm_device *dev = inode->i_private; | 5324 | struct drm_device *dev = inode->i_private; |
5314 | struct drm_i915_private *dev_priv = dev->dev_private; | 5325 | struct drm_i915_private *dev_priv = to_i915(dev); |
5315 | 5326 | ||
5316 | if (INTEL_INFO(dev)->gen < 6) | 5327 | if (INTEL_INFO(dev)->gen < 6) |
5317 | return 0; | 5328 | return 0; |
@@ -5325,7 +5336,7 @@ static int i915_forcewake_open(struct inode *inode, struct file *file) | |||
5325 | static int i915_forcewake_release(struct inode *inode, struct file *file) | 5336 | static int i915_forcewake_release(struct inode *inode, struct file *file) |
5326 | { | 5337 | { |
5327 | struct drm_device *dev = inode->i_private; | 5338 | struct drm_device *dev = inode->i_private; |
5328 | struct drm_i915_private *dev_priv = dev->dev_private; | 5339 | struct drm_i915_private *dev_priv = to_i915(dev); |
5329 | 5340 | ||
5330 | if (INTEL_INFO(dev)->gen < 6) | 5341 | if (INTEL_INFO(dev)->gen < 6) |
5331 | return 0; | 5342 | return 0; |
@@ -5441,7 +5452,6 @@ static const struct i915_debugfs_files { | |||
5441 | {"i915_max_freq", &i915_max_freq_fops}, | 5452 | {"i915_max_freq", &i915_max_freq_fops}, |
5442 | {"i915_min_freq", &i915_min_freq_fops}, | 5453 | {"i915_min_freq", &i915_min_freq_fops}, |
5443 | {"i915_cache_sharing", &i915_cache_sharing_fops}, | 5454 | {"i915_cache_sharing", &i915_cache_sharing_fops}, |
5444 | {"i915_ring_stop", &i915_ring_stop_fops}, | ||
5445 | {"i915_ring_missed_irq", &i915_ring_missed_irq_fops}, | 5455 | {"i915_ring_missed_irq", &i915_ring_missed_irq_fops}, |
5446 | {"i915_ring_test_irq", &i915_ring_test_irq_fops}, | 5456 | {"i915_ring_test_irq", &i915_ring_test_irq_fops}, |
5447 | {"i915_gem_drop_caches", &i915_drop_caches_fops}, | 5457 | {"i915_gem_drop_caches", &i915_drop_caches_fops}, |
@@ -5459,7 +5469,7 @@ static const struct i915_debugfs_files { | |||
5459 | 5469 | ||
5460 | void intel_display_crc_init(struct drm_device *dev) | 5470 | void intel_display_crc_init(struct drm_device *dev) |
5461 | { | 5471 | { |
5462 | struct drm_i915_private *dev_priv = dev->dev_private; | 5472 | struct drm_i915_private *dev_priv = to_i915(dev); |
5463 | enum pipe pipe; | 5473 | enum pipe pipe; |
5464 | 5474 | ||
5465 | for_each_pipe(dev_priv, pipe) { | 5475 | for_each_pipe(dev_priv, pipe) { |
@@ -5471,8 +5481,9 @@ void intel_display_crc_init(struct drm_device *dev) | |||
5471 | } | 5481 | } |
5472 | } | 5482 | } |
5473 | 5483 | ||
5474 | int i915_debugfs_init(struct drm_minor *minor) | 5484 | int i915_debugfs_register(struct drm_i915_private *dev_priv) |
5475 | { | 5485 | { |
5486 | struct drm_minor *minor = dev_priv->drm.primary; | ||
5476 | int ret, i; | 5487 | int ret, i; |
5477 | 5488 | ||
5478 | ret = i915_forcewake_create(minor->debugfs_root, minor); | 5489 | ret = i915_forcewake_create(minor->debugfs_root, minor); |
@@ -5498,8 +5509,9 @@ int i915_debugfs_init(struct drm_minor *minor) | |||
5498 | minor->debugfs_root, minor); | 5509 | minor->debugfs_root, minor); |
5499 | } | 5510 | } |
5500 | 5511 | ||
5501 | void i915_debugfs_cleanup(struct drm_minor *minor) | 5512 | void i915_debugfs_unregister(struct drm_i915_private *dev_priv) |
5502 | { | 5513 | { |
5514 | struct drm_minor *minor = dev_priv->drm.primary; | ||
5503 | int i; | 5515 | int i; |
5504 | 5516 | ||
5505 | drm_debugfs_remove_files(i915_debugfs_list, | 5517 | drm_debugfs_remove_files(i915_debugfs_list, |