diff options
Diffstat (limited to 'drivers/gpu/drm/radeon/r600.c')
-rw-r--r-- | drivers/gpu/drm/radeon/r600.c | 21 |
1 files changed, 15 insertions, 6 deletions
diff --git a/drivers/gpu/drm/radeon/r600.c b/drivers/gpu/drm/radeon/r600.c index c11715fb29c7..250ec3fe1a16 100644 --- a/drivers/gpu/drm/radeon/r600.c +++ b/drivers/gpu/drm/radeon/r600.c | |||
@@ -2674,6 +2674,7 @@ int r600_irq_process(struct radeon_device *rdev) | |||
2674 | u32 last_entry = rdev->ih.ring_size - 16; | 2674 | u32 last_entry = rdev->ih.ring_size - 16; |
2675 | u32 ring_index, disp_int, disp_int_cont, disp_int_cont2; | 2675 | u32 ring_index, disp_int, disp_int_cont, disp_int_cont2; |
2676 | unsigned long flags; | 2676 | unsigned long flags; |
2677 | bool queue_hotplug = false; | ||
2677 | 2678 | ||
2678 | DRM_DEBUG("r600_irq_process start: rptr %d, wptr %d\n", rptr, wptr); | 2679 | DRM_DEBUG("r600_irq_process start: rptr %d, wptr %d\n", rptr, wptr); |
2679 | 2680 | ||
@@ -2745,37 +2746,43 @@ restart_ih: | |||
2745 | case 0: | 2746 | case 0: |
2746 | if (disp_int & DC_HPD1_INTERRUPT) { | 2747 | if (disp_int & DC_HPD1_INTERRUPT) { |
2747 | disp_int &= ~DC_HPD1_INTERRUPT; | 2748 | disp_int &= ~DC_HPD1_INTERRUPT; |
2748 | DRM_INFO("IH: HPD1\n"); | 2749 | queue_hotplug = true; |
2750 | DRM_DEBUG("IH: HPD1\n"); | ||
2749 | } | 2751 | } |
2750 | break; | 2752 | break; |
2751 | case 1: | 2753 | case 1: |
2752 | if (disp_int & DC_HPD2_INTERRUPT) { | 2754 | if (disp_int & DC_HPD2_INTERRUPT) { |
2753 | disp_int &= ~DC_HPD2_INTERRUPT; | 2755 | disp_int &= ~DC_HPD2_INTERRUPT; |
2754 | DRM_INFO("IH: HPD2\n"); | 2756 | queue_hotplug = true; |
2757 | DRM_DEBUG("IH: HPD2\n"); | ||
2755 | } | 2758 | } |
2756 | break; | 2759 | break; |
2757 | case 4: | 2760 | case 4: |
2758 | if (disp_int_cont & DC_HPD3_INTERRUPT) { | 2761 | if (disp_int_cont & DC_HPD3_INTERRUPT) { |
2759 | disp_int_cont &= ~DC_HPD3_INTERRUPT; | 2762 | disp_int_cont &= ~DC_HPD3_INTERRUPT; |
2760 | DRM_INFO("IH: HPD3\n"); | 2763 | queue_hotplug = true; |
2764 | DRM_DEBUG("IH: HPD3\n"); | ||
2761 | } | 2765 | } |
2762 | break; | 2766 | break; |
2763 | case 5: | 2767 | case 5: |
2764 | if (disp_int_cont & DC_HPD4_INTERRUPT) { | 2768 | if (disp_int_cont & DC_HPD4_INTERRUPT) { |
2765 | disp_int_cont &= ~DC_HPD4_INTERRUPT; | 2769 | disp_int_cont &= ~DC_HPD4_INTERRUPT; |
2766 | DRM_INFO("IH: HPD4\n"); | 2770 | queue_hotplug = true; |
2771 | DRM_DEBUG("IH: HPD4\n"); | ||
2767 | } | 2772 | } |
2768 | break; | 2773 | break; |
2769 | case 10: | 2774 | case 10: |
2770 | if (disp_int_cont2 & DC_HPD5_INTERRUPT) { | 2775 | if (disp_int_cont2 & DC_HPD5_INTERRUPT) { |
2771 | disp_int_cont &= ~DC_HPD5_INTERRUPT; | 2776 | disp_int_cont &= ~DC_HPD5_INTERRUPT; |
2772 | DRM_INFO("IH: HPD5\n"); | 2777 | queue_hotplug = true; |
2778 | DRM_DEBUG("IH: HPD5\n"); | ||
2773 | } | 2779 | } |
2774 | break; | 2780 | break; |
2775 | case 12: | 2781 | case 12: |
2776 | if (disp_int_cont2 & DC_HPD6_INTERRUPT) { | 2782 | if (disp_int_cont2 & DC_HPD6_INTERRUPT) { |
2777 | disp_int_cont &= ~DC_HPD6_INTERRUPT; | 2783 | disp_int_cont &= ~DC_HPD6_INTERRUPT; |
2778 | DRM_INFO("IH: HPD6\n"); | 2784 | queue_hotplug = true; |
2785 | DRM_DEBUG("IH: HPD6\n"); | ||
2779 | } | 2786 | } |
2780 | break; | 2787 | break; |
2781 | default: | 2788 | default: |
@@ -2807,6 +2814,8 @@ restart_ih: | |||
2807 | wptr = r600_get_ih_wptr(rdev); | 2814 | wptr = r600_get_ih_wptr(rdev); |
2808 | if (wptr != rdev->ih.wptr) | 2815 | if (wptr != rdev->ih.wptr) |
2809 | goto restart_ih; | 2816 | goto restart_ih; |
2817 | if (queue_hotplug) | ||
2818 | queue_work(rdev->wq, &rdev->hotplug_work); | ||
2810 | rdev->ih.rptr = rptr; | 2819 | rdev->ih.rptr = rptr; |
2811 | WREG32(IH_RB_RPTR, rdev->ih.rptr); | 2820 | WREG32(IH_RB_RPTR, rdev->ih.rptr); |
2812 | spin_unlock_irqrestore(&rdev->ih.lock, flags); | 2821 | spin_unlock_irqrestore(&rdev->ih.lock, flags); |