diff options
author | Dave Airlie <airlied@redhat.com> | 2015-02-23 18:23:57 -0500 |
---|---|---|
committer | Alex Deucher <alexander.deucher@amd.com> | 2015-03-19 12:26:46 -0400 |
commit | 2bc67b4d9e9f2c8d13782387bbdbb6e1b5e12d30 (patch) | |
tree | 38f09c47b494029546e1a85c1a044172ad29f55a | |
parent | de6284aa0162e6814e4d5f17a0177e0e5aee1ce5 (diff) |
radeon/evergreen: add support for short HPD irqs
This adds support for processing short irqs, and triggering
the dp_work.
Signed-off-by: Dave Airlie <airlied@redhat.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
-rw-r--r-- | drivers/gpu/drm/radeon/evergreen.c | 101 |
1 files changed, 89 insertions, 12 deletions
diff --git a/drivers/gpu/drm/radeon/evergreen.c b/drivers/gpu/drm/radeon/evergreen.c index 21cbd2e90f3b..f848acfd3fc8 100644 --- a/drivers/gpu/drm/radeon/evergreen.c +++ b/drivers/gpu/drm/radeon/evergreen.c | |||
@@ -4420,12 +4420,12 @@ int evergreen_irq_set(struct radeon_device *rdev) | |||
4420 | return 0; | 4420 | return 0; |
4421 | } | 4421 | } |
4422 | 4422 | ||
4423 | hpd1 = RREG32(DC_HPD1_INT_CONTROL) & ~DC_HPDx_INT_EN; | 4423 | hpd1 = RREG32(DC_HPD1_INT_CONTROL) & ~(DC_HPDx_INT_EN | DC_HPDx_RX_INT_EN); |
4424 | hpd2 = RREG32(DC_HPD2_INT_CONTROL) & ~DC_HPDx_INT_EN; | 4424 | hpd2 = RREG32(DC_HPD2_INT_CONTROL) & ~(DC_HPDx_INT_EN | DC_HPDx_RX_INT_EN); |
4425 | hpd3 = RREG32(DC_HPD3_INT_CONTROL) & ~DC_HPDx_INT_EN; | 4425 | hpd3 = RREG32(DC_HPD3_INT_CONTROL) & ~(DC_HPDx_INT_EN | DC_HPDx_RX_INT_EN); |
4426 | hpd4 = RREG32(DC_HPD4_INT_CONTROL) & ~DC_HPDx_INT_EN; | 4426 | hpd4 = RREG32(DC_HPD4_INT_CONTROL) & ~(DC_HPDx_INT_EN | DC_HPDx_RX_INT_EN); |
4427 | hpd5 = RREG32(DC_HPD5_INT_CONTROL) & ~DC_HPDx_INT_EN; | 4427 | hpd5 = RREG32(DC_HPD5_INT_CONTROL) & ~(DC_HPDx_INT_EN | DC_HPDx_RX_INT_EN); |
4428 | hpd6 = RREG32(DC_HPD6_INT_CONTROL) & ~DC_HPDx_INT_EN; | 4428 | hpd6 = RREG32(DC_HPD6_INT_CONTROL) & ~(DC_HPDx_INT_EN | DC_HPDx_RX_INT_EN); |
4429 | if (rdev->family == CHIP_ARUBA) | 4429 | if (rdev->family == CHIP_ARUBA) |
4430 | thermal_int = RREG32(TN_CG_THERMAL_INT_CTRL) & | 4430 | thermal_int = RREG32(TN_CG_THERMAL_INT_CTRL) & |
4431 | ~(THERM_INT_MASK_HIGH | THERM_INT_MASK_LOW); | 4431 | ~(THERM_INT_MASK_HIGH | THERM_INT_MASK_LOW); |
@@ -4514,27 +4514,27 @@ int evergreen_irq_set(struct radeon_device *rdev) | |||
4514 | } | 4514 | } |
4515 | if (rdev->irq.hpd[0]) { | 4515 | if (rdev->irq.hpd[0]) { |
4516 | DRM_DEBUG("evergreen_irq_set: hpd 1\n"); | 4516 | DRM_DEBUG("evergreen_irq_set: hpd 1\n"); |
4517 | hpd1 |= DC_HPDx_INT_EN; | 4517 | hpd1 |= DC_HPDx_INT_EN | DC_HPDx_RX_INT_EN; |
4518 | } | 4518 | } |
4519 | if (rdev->irq.hpd[1]) { | 4519 | if (rdev->irq.hpd[1]) { |
4520 | DRM_DEBUG("evergreen_irq_set: hpd 2\n"); | 4520 | DRM_DEBUG("evergreen_irq_set: hpd 2\n"); |
4521 | hpd2 |= DC_HPDx_INT_EN; | 4521 | hpd2 |= DC_HPDx_INT_EN | DC_HPDx_RX_INT_EN; |
4522 | } | 4522 | } |
4523 | if (rdev->irq.hpd[2]) { | 4523 | if (rdev->irq.hpd[2]) { |
4524 | DRM_DEBUG("evergreen_irq_set: hpd 3\n"); | 4524 | DRM_DEBUG("evergreen_irq_set: hpd 3\n"); |
4525 | hpd3 |= DC_HPDx_INT_EN; | 4525 | hpd3 |= DC_HPDx_INT_EN | DC_HPDx_RX_INT_EN; |
4526 | } | 4526 | } |
4527 | if (rdev->irq.hpd[3]) { | 4527 | if (rdev->irq.hpd[3]) { |
4528 | DRM_DEBUG("evergreen_irq_set: hpd 4\n"); | 4528 | DRM_DEBUG("evergreen_irq_set: hpd 4\n"); |
4529 | hpd4 |= DC_HPDx_INT_EN; | 4529 | hpd4 |= DC_HPDx_INT_EN | DC_HPDx_RX_INT_EN; |
4530 | } | 4530 | } |
4531 | if (rdev->irq.hpd[4]) { | 4531 | if (rdev->irq.hpd[4]) { |
4532 | DRM_DEBUG("evergreen_irq_set: hpd 5\n"); | 4532 | DRM_DEBUG("evergreen_irq_set: hpd 5\n"); |
4533 | hpd5 |= DC_HPDx_INT_EN; | 4533 | hpd5 |= DC_HPDx_INT_EN | DC_HPDx_RX_INT_EN; |
4534 | } | 4534 | } |
4535 | if (rdev->irq.hpd[5]) { | 4535 | if (rdev->irq.hpd[5]) { |
4536 | DRM_DEBUG("evergreen_irq_set: hpd 6\n"); | 4536 | DRM_DEBUG("evergreen_irq_set: hpd 6\n"); |
4537 | hpd6 |= DC_HPDx_INT_EN; | 4537 | hpd6 |= DC_HPDx_INT_EN | DC_HPDx_RX_INT_EN; |
4538 | } | 4538 | } |
4539 | if (rdev->irq.afmt[0]) { | 4539 | if (rdev->irq.afmt[0]) { |
4540 | DRM_DEBUG("evergreen_irq_set: hdmi 0\n"); | 4540 | DRM_DEBUG("evergreen_irq_set: hdmi 0\n"); |
@@ -4728,6 +4728,38 @@ static void evergreen_irq_ack(struct radeon_device *rdev) | |||
4728 | tmp |= DC_HPDx_INT_ACK; | 4728 | tmp |= DC_HPDx_INT_ACK; |
4729 | WREG32(DC_HPD6_INT_CONTROL, tmp); | 4729 | WREG32(DC_HPD6_INT_CONTROL, tmp); |
4730 | } | 4730 | } |
4731 | |||
4732 | if (rdev->irq.stat_regs.evergreen.disp_int & DC_HPD1_RX_INTERRUPT) { | ||
4733 | tmp = RREG32(DC_HPD1_INT_CONTROL); | ||
4734 | tmp |= DC_HPDx_RX_INT_ACK; | ||
4735 | WREG32(DC_HPD1_INT_CONTROL, tmp); | ||
4736 | } | ||
4737 | if (rdev->irq.stat_regs.evergreen.disp_int_cont & DC_HPD2_RX_INTERRUPT) { | ||
4738 | tmp = RREG32(DC_HPD2_INT_CONTROL); | ||
4739 | tmp |= DC_HPDx_RX_INT_ACK; | ||
4740 | WREG32(DC_HPD2_INT_CONTROL, tmp); | ||
4741 | } | ||
4742 | if (rdev->irq.stat_regs.evergreen.disp_int_cont2 & DC_HPD3_RX_INTERRUPT) { | ||
4743 | tmp = RREG32(DC_HPD3_INT_CONTROL); | ||
4744 | tmp |= DC_HPDx_RX_INT_ACK; | ||
4745 | WREG32(DC_HPD3_INT_CONTROL, tmp); | ||
4746 | } | ||
4747 | if (rdev->irq.stat_regs.evergreen.disp_int_cont3 & DC_HPD4_RX_INTERRUPT) { | ||
4748 | tmp = RREG32(DC_HPD4_INT_CONTROL); | ||
4749 | tmp |= DC_HPDx_RX_INT_ACK; | ||
4750 | WREG32(DC_HPD4_INT_CONTROL, tmp); | ||
4751 | } | ||
4752 | if (rdev->irq.stat_regs.evergreen.disp_int_cont4 & DC_HPD5_RX_INTERRUPT) { | ||
4753 | tmp = RREG32(DC_HPD5_INT_CONTROL); | ||
4754 | tmp |= DC_HPDx_RX_INT_ACK; | ||
4755 | WREG32(DC_HPD5_INT_CONTROL, tmp); | ||
4756 | } | ||
4757 | if (rdev->irq.stat_regs.evergreen.disp_int_cont5 & DC_HPD6_RX_INTERRUPT) { | ||
4758 | tmp = RREG32(DC_HPD5_INT_CONTROL); | ||
4759 | tmp |= DC_HPDx_RX_INT_ACK; | ||
4760 | WREG32(DC_HPD6_INT_CONTROL, tmp); | ||
4761 | } | ||
4762 | |||
4731 | if (rdev->irq.stat_regs.evergreen.afmt_status1 & AFMT_AZ_FORMAT_WTRIG) { | 4763 | if (rdev->irq.stat_regs.evergreen.afmt_status1 & AFMT_AZ_FORMAT_WTRIG) { |
4732 | tmp = RREG32(AFMT_AUDIO_PACKET_CONTROL + EVERGREEN_CRTC0_REGISTER_OFFSET); | 4764 | tmp = RREG32(AFMT_AUDIO_PACKET_CONTROL + EVERGREEN_CRTC0_REGISTER_OFFSET); |
4733 | tmp |= AFMT_AZ_FORMAT_WTRIG_ACK; | 4765 | tmp |= AFMT_AZ_FORMAT_WTRIG_ACK; |
@@ -4808,6 +4840,7 @@ int evergreen_irq_process(struct radeon_device *rdev) | |||
4808 | u32 ring_index; | 4840 | u32 ring_index; |
4809 | bool queue_hotplug = false; | 4841 | bool queue_hotplug = false; |
4810 | bool queue_hdmi = false; | 4842 | bool queue_hdmi = false; |
4843 | bool queue_dp = false; | ||
4811 | bool queue_thermal = false; | 4844 | bool queue_thermal = false; |
4812 | u32 status, addr; | 4845 | u32 status, addr; |
4813 | 4846 | ||
@@ -5047,6 +5080,48 @@ restart_ih: | |||
5047 | DRM_DEBUG("IH: HPD6\n"); | 5080 | DRM_DEBUG("IH: HPD6\n"); |
5048 | } | 5081 | } |
5049 | break; | 5082 | break; |
5083 | case 6: | ||
5084 | if (rdev->irq.stat_regs.evergreen.disp_int & DC_HPD1_RX_INTERRUPT) { | ||
5085 | rdev->irq.stat_regs.evergreen.disp_int &= ~DC_HPD1_RX_INTERRUPT; | ||
5086 | queue_dp = true; | ||
5087 | DRM_DEBUG("IH: HPD_RX 1\n"); | ||
5088 | } | ||
5089 | break; | ||
5090 | case 7: | ||
5091 | if (rdev->irq.stat_regs.evergreen.disp_int_cont & DC_HPD2_RX_INTERRUPT) { | ||
5092 | rdev->irq.stat_regs.evergreen.disp_int_cont &= ~DC_HPD2_RX_INTERRUPT; | ||
5093 | queue_dp = true; | ||
5094 | DRM_DEBUG("IH: HPD_RX 2\n"); | ||
5095 | } | ||
5096 | break; | ||
5097 | case 8: | ||
5098 | if (rdev->irq.stat_regs.evergreen.disp_int_cont2 & DC_HPD3_RX_INTERRUPT) { | ||
5099 | rdev->irq.stat_regs.evergreen.disp_int_cont2 &= ~DC_HPD3_RX_INTERRUPT; | ||
5100 | queue_dp = true; | ||
5101 | DRM_DEBUG("IH: HPD_RX 3\n"); | ||
5102 | } | ||
5103 | break; | ||
5104 | case 9: | ||
5105 | if (rdev->irq.stat_regs.evergreen.disp_int_cont3 & DC_HPD4_RX_INTERRUPT) { | ||
5106 | rdev->irq.stat_regs.evergreen.disp_int_cont3 &= ~DC_HPD4_RX_INTERRUPT; | ||
5107 | queue_dp = true; | ||
5108 | DRM_DEBUG("IH: HPD_RX 4\n"); | ||
5109 | } | ||
5110 | break; | ||
5111 | case 10: | ||
5112 | if (rdev->irq.stat_regs.evergreen.disp_int_cont4 & DC_HPD5_RX_INTERRUPT) { | ||
5113 | rdev->irq.stat_regs.evergreen.disp_int_cont4 &= ~DC_HPD5_RX_INTERRUPT; | ||
5114 | queue_dp = true; | ||
5115 | DRM_DEBUG("IH: HPD_RX 5\n"); | ||
5116 | } | ||
5117 | break; | ||
5118 | case 11: | ||
5119 | if (rdev->irq.stat_regs.evergreen.disp_int_cont5 & DC_HPD6_RX_INTERRUPT) { | ||
5120 | rdev->irq.stat_regs.evergreen.disp_int_cont5 &= ~DC_HPD6_RX_INTERRUPT; | ||
5121 | queue_dp = true; | ||
5122 | DRM_DEBUG("IH: HPD_RX 6\n"); | ||
5123 | } | ||
5124 | break; | ||
5050 | default: | 5125 | default: |
5051 | DRM_DEBUG("Unhandled interrupt: %d %d\n", src_id, src_data); | 5126 | DRM_DEBUG("Unhandled interrupt: %d %d\n", src_id, src_data); |
5052 | break; | 5127 | break; |
@@ -5179,6 +5254,8 @@ restart_ih: | |||
5179 | rptr &= rdev->ih.ptr_mask; | 5254 | rptr &= rdev->ih.ptr_mask; |
5180 | WREG32(IH_RB_RPTR, rptr); | 5255 | WREG32(IH_RB_RPTR, rptr); |
5181 | } | 5256 | } |
5257 | if (queue_dp) | ||
5258 | schedule_work(&rdev->dp_work); | ||
5182 | if (queue_hotplug) | 5259 | if (queue_hotplug) |
5183 | schedule_work(&rdev->hotplug_work); | 5260 | schedule_work(&rdev->hotplug_work); |
5184 | if (queue_hdmi) | 5261 | if (queue_hdmi) |