Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

drm/radeon: Unbreak HPD handling for r600+

We end up reading the interrupt register for HPD5, and then writing it
to HPD6 which on systems without anything using HPD5 results in
permanently disabling hotplug on one of the display outputs after the
first time we acknowledge a hotplug interrupt from the GPU.

This code is really bad. But for now, let's just fix this. I will
hopefully have a large patch series to refactor all of this soon.

Reviewed-by: Christian König <christian.koenig@amd.com>
Signed-off-by: Lyude <lyude@redhat.com>
Cc: stable@vger.kernel.org
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>

authored by

Lyude and committed by
Alex Deucher
e12fcff7 ae5037dc

+7 -7
+2 -2
drivers/gpu/drm/radeon/cik.c
··· 7401 7401 WREG32(DC_HPD5_INT_CONTROL, tmp); 7402 7402 } 7403 7403 if (rdev->irq.stat_regs.cik.disp_int_cont5 & DC_HPD6_INTERRUPT) { 7404 - tmp = RREG32(DC_HPD5_INT_CONTROL); 7404 + tmp = RREG32(DC_HPD6_INT_CONTROL); 7405 7405 tmp |= DC_HPDx_INT_ACK; 7406 7406 WREG32(DC_HPD6_INT_CONTROL, tmp); 7407 7407 } ··· 7431 7431 WREG32(DC_HPD5_INT_CONTROL, tmp); 7432 7432 } 7433 7433 if (rdev->irq.stat_regs.cik.disp_int_cont5 & DC_HPD6_RX_INTERRUPT) { 7434 - tmp = RREG32(DC_HPD5_INT_CONTROL); 7434 + tmp = RREG32(DC_HPD6_INT_CONTROL); 7435 7435 tmp |= DC_HPDx_RX_INT_ACK; 7436 7436 WREG32(DC_HPD6_INT_CONTROL, tmp); 7437 7437 }
+2 -2
drivers/gpu/drm/radeon/evergreen.c
··· 4927 4927 WREG32(DC_HPD5_INT_CONTROL, tmp); 4928 4928 } 4929 4929 if (rdev->irq.stat_regs.evergreen.disp_int_cont5 & DC_HPD6_INTERRUPT) { 4930 - tmp = RREG32(DC_HPD5_INT_CONTROL); 4930 + tmp = RREG32(DC_HPD6_INT_CONTROL); 4931 4931 tmp |= DC_HPDx_INT_ACK; 4932 4932 WREG32(DC_HPD6_INT_CONTROL, tmp); 4933 4933 } ··· 4958 4958 WREG32(DC_HPD5_INT_CONTROL, tmp); 4959 4959 } 4960 4960 if (rdev->irq.stat_regs.evergreen.disp_int_cont5 & DC_HPD6_RX_INTERRUPT) { 4961 - tmp = RREG32(DC_HPD5_INT_CONTROL); 4961 + tmp = RREG32(DC_HPD6_INT_CONTROL); 4962 4962 tmp |= DC_HPDx_RX_INT_ACK; 4963 4963 WREG32(DC_HPD6_INT_CONTROL, tmp); 4964 4964 }
+1 -1
drivers/gpu/drm/radeon/r600.c
··· 3988 3988 WREG32(DC_HPD5_INT_CONTROL, tmp); 3989 3989 } 3990 3990 if (rdev->irq.stat_regs.r600.disp_int_cont2 & DC_HPD6_INTERRUPT) { 3991 - tmp = RREG32(DC_HPD5_INT_CONTROL); 3991 + tmp = RREG32(DC_HPD6_INT_CONTROL); 3992 3992 tmp |= DC_HPDx_INT_ACK; 3993 3993 WREG32(DC_HPD6_INT_CONTROL, tmp); 3994 3994 }
+2 -2
drivers/gpu/drm/radeon/si.c
··· 6317 6317 WREG32(DC_HPD5_INT_CONTROL, tmp); 6318 6318 } 6319 6319 if (rdev->irq.stat_regs.evergreen.disp_int_cont5 & DC_HPD6_INTERRUPT) { 6320 - tmp = RREG32(DC_HPD5_INT_CONTROL); 6320 + tmp = RREG32(DC_HPD6_INT_CONTROL); 6321 6321 tmp |= DC_HPDx_INT_ACK; 6322 6322 WREG32(DC_HPD6_INT_CONTROL, tmp); 6323 6323 } ··· 6348 6348 WREG32(DC_HPD5_INT_CONTROL, tmp); 6349 6349 } 6350 6350 if (rdev->irq.stat_regs.evergreen.disp_int_cont5 & DC_HPD6_RX_INTERRUPT) { 6351 - tmp = RREG32(DC_HPD5_INT_CONTROL); 6351 + tmp = RREG32(DC_HPD6_INT_CONTROL); 6352 6352 tmp |= DC_HPDx_RX_INT_ACK; 6353 6353 WREG32(DC_HPD6_INT_CONTROL, tmp); 6354 6354 }