aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDave Airlie <airlied@redhat.com>2015-02-23 18:23:57 -0500
committerAlex Deucher <alexander.deucher@amd.com>2015-03-19 12:26:46 -0400
commit2bc67b4d9e9f2c8d13782387bbdbb6e1b5e12d30 (patch)
tree38f09c47b494029546e1a85c1a044172ad29f55a
parentde6284aa0162e6814e4d5f17a0177e0e5aee1ce5 (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.c101
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)