diff options
| -rw-r--r-- | drivers/gpu/drm/radeon/cik.c | 76 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/cikd.h | 9 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/evergreen.c | 28 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/r600.c | 13 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/radeon.h | 6 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/radeon_display.c | 4 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/si.c | 28 |
7 files changed, 147 insertions, 17 deletions
diff --git a/drivers/gpu/drm/radeon/cik.c b/drivers/gpu/drm/radeon/cik.c index 199eb194716f..421c6084cbfc 100644 --- a/drivers/gpu/drm/radeon/cik.c +++ b/drivers/gpu/drm/radeon/cik.c | |||
| @@ -6693,6 +6693,19 @@ static void cik_disable_interrupt_state(struct radeon_device *rdev) | |||
| 6693 | WREG32(LB_INTERRUPT_MASK + EVERGREEN_CRTC4_REGISTER_OFFSET, 0); | 6693 | WREG32(LB_INTERRUPT_MASK + EVERGREEN_CRTC4_REGISTER_OFFSET, 0); |
| 6694 | WREG32(LB_INTERRUPT_MASK + EVERGREEN_CRTC5_REGISTER_OFFSET, 0); | 6694 | WREG32(LB_INTERRUPT_MASK + EVERGREEN_CRTC5_REGISTER_OFFSET, 0); |
| 6695 | } | 6695 | } |
| 6696 | /* pflip */ | ||
| 6697 | if (rdev->num_crtc >= 2) { | ||
| 6698 | WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC0_REGISTER_OFFSET, 0); | ||
| 6699 | WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC1_REGISTER_OFFSET, 0); | ||
| 6700 | } | ||
| 6701 | if (rdev->num_crtc >= 4) { | ||
| 6702 | WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC2_REGISTER_OFFSET, 0); | ||
| 6703 | WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC3_REGISTER_OFFSET, 0); | ||
| 6704 | } | ||
| 6705 | if (rdev->num_crtc >= 6) { | ||
| 6706 | WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC4_REGISTER_OFFSET, 0); | ||
| 6707 | WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC5_REGISTER_OFFSET, 0); | ||
| 6708 | } | ||
| 6696 | 6709 | ||
| 6697 | /* dac hotplug */ | 6710 | /* dac hotplug */ |
| 6698 | WREG32(DAC_AUTODETECT_INT_CONTROL, 0); | 6711 | WREG32(DAC_AUTODETECT_INT_CONTROL, 0); |
| @@ -7049,6 +7062,25 @@ int cik_irq_set(struct radeon_device *rdev) | |||
| 7049 | WREG32(LB_INTERRUPT_MASK + EVERGREEN_CRTC5_REGISTER_OFFSET, crtc6); | 7062 | WREG32(LB_INTERRUPT_MASK + EVERGREEN_CRTC5_REGISTER_OFFSET, crtc6); |
| 7050 | } | 7063 | } |
| 7051 | 7064 | ||
| 7065 | if (rdev->num_crtc >= 2) { | ||
| 7066 | WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC0_REGISTER_OFFSET, | ||
| 7067 | GRPH_PFLIP_INT_MASK); | ||
| 7068 | WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC1_REGISTER_OFFSET, | ||
| 7069 | GRPH_PFLIP_INT_MASK); | ||
| 7070 | } | ||
| 7071 | if (rdev->num_crtc >= 4) { | ||
| 7072 | WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC2_REGISTER_OFFSET, | ||
| 7073 | GRPH_PFLIP_INT_MASK); | ||
| 7074 | WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC3_REGISTER_OFFSET, | ||
| 7075 | GRPH_PFLIP_INT_MASK); | ||
| 7076 | } | ||
| 7077 | if (rdev->num_crtc >= 6) { | ||
| 7078 | WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC4_REGISTER_OFFSET, | ||
| 7079 | GRPH_PFLIP_INT_MASK); | ||
| 7080 | WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC5_REGISTER_OFFSET, | ||
| 7081 | GRPH_PFLIP_INT_MASK); | ||
| 7082 | } | ||
| 7083 | |||
| 7052 | WREG32(DC_HPD1_INT_CONTROL, hpd1); | 7084 | WREG32(DC_HPD1_INT_CONTROL, hpd1); |
| 7053 | WREG32(DC_HPD2_INT_CONTROL, hpd2); | 7085 | WREG32(DC_HPD2_INT_CONTROL, hpd2); |
| 7054 | WREG32(DC_HPD3_INT_CONTROL, hpd3); | 7086 | WREG32(DC_HPD3_INT_CONTROL, hpd3); |
| @@ -7085,6 +7117,29 @@ static inline void cik_irq_ack(struct radeon_device *rdev) | |||
| 7085 | rdev->irq.stat_regs.cik.disp_int_cont5 = RREG32(DISP_INTERRUPT_STATUS_CONTINUE5); | 7117 | rdev->irq.stat_regs.cik.disp_int_cont5 = RREG32(DISP_INTERRUPT_STATUS_CONTINUE5); |
| 7086 | rdev->irq.stat_regs.cik.disp_int_cont6 = RREG32(DISP_INTERRUPT_STATUS_CONTINUE6); | 7118 | rdev->irq.stat_regs.cik.disp_int_cont6 = RREG32(DISP_INTERRUPT_STATUS_CONTINUE6); |
| 7087 | 7119 | ||
| 7120 | rdev->irq.stat_regs.cik.d1grph_int = RREG32(GRPH_INT_STATUS + | ||
| 7121 | EVERGREEN_CRTC0_REGISTER_OFFSET); | ||
| 7122 | rdev->irq.stat_regs.cik.d2grph_int = RREG32(GRPH_INT_STATUS + | ||
| 7123 | EVERGREEN_CRTC1_REGISTER_OFFSET); | ||
| 7124 | if (rdev->num_crtc >= 4) { | ||
| 7125 | rdev->irq.stat_regs.cik.d3grph_int = RREG32(GRPH_INT_STATUS + | ||
| 7126 | EVERGREEN_CRTC2_REGISTER_OFFSET); | ||
| 7127 | rdev->irq.stat_regs.cik.d4grph_int = RREG32(GRPH_INT_STATUS + | ||
| 7128 | EVERGREEN_CRTC3_REGISTER_OFFSET); | ||
| 7129 | } | ||
| 7130 | if (rdev->num_crtc >= 6) { | ||
| 7131 | rdev->irq.stat_regs.cik.d5grph_int = RREG32(GRPH_INT_STATUS + | ||
| 7132 | EVERGREEN_CRTC4_REGISTER_OFFSET); | ||
| 7133 | rdev->irq.stat_regs.cik.d6grph_int = RREG32(GRPH_INT_STATUS + | ||
| 7134 | EVERGREEN_CRTC5_REGISTER_OFFSET); | ||
| 7135 | } | ||
| 7136 | |||
| 7137 | if (rdev->irq.stat_regs.cik.d1grph_int & GRPH_PFLIP_INT_OCCURRED) | ||
| 7138 | WREG32(GRPH_INT_STATUS + EVERGREEN_CRTC0_REGISTER_OFFSET, | ||
| 7139 | GRPH_PFLIP_INT_CLEAR); | ||
| 7140 | if (rdev->irq.stat_regs.cik.d2grph_int & GRPH_PFLIP_INT_OCCURRED) | ||
| 7141 | WREG32(GRPH_INT_STATUS + EVERGREEN_CRTC1_REGISTER_OFFSET, | ||
| 7142 | GRPH_PFLIP_INT_CLEAR); | ||
| 7088 | if (rdev->irq.stat_regs.cik.disp_int & LB_D1_VBLANK_INTERRUPT) | 7143 | if (rdev->irq.stat_regs.cik.disp_int & LB_D1_VBLANK_INTERRUPT) |
| 7089 | WREG32(LB_VBLANK_STATUS + EVERGREEN_CRTC0_REGISTER_OFFSET, VBLANK_ACK); | 7144 | WREG32(LB_VBLANK_STATUS + EVERGREEN_CRTC0_REGISTER_OFFSET, VBLANK_ACK); |
| 7090 | if (rdev->irq.stat_regs.cik.disp_int & LB_D1_VLINE_INTERRUPT) | 7145 | if (rdev->irq.stat_regs.cik.disp_int & LB_D1_VLINE_INTERRUPT) |
| @@ -7095,6 +7150,12 @@ static inline void cik_irq_ack(struct radeon_device *rdev) | |||
| 7095 | WREG32(LB_VLINE_STATUS + EVERGREEN_CRTC1_REGISTER_OFFSET, VLINE_ACK); | 7150 | WREG32(LB_VLINE_STATUS + EVERGREEN_CRTC1_REGISTER_OFFSET, VLINE_ACK); |
| 7096 | 7151 | ||
| 7097 | if (rdev->num_crtc >= 4) { | 7152 | if (rdev->num_crtc >= 4) { |
| 7153 | if (rdev->irq.stat_regs.cik.d3grph_int & GRPH_PFLIP_INT_OCCURRED) | ||
| 7154 | WREG32(GRPH_INT_STATUS + EVERGREEN_CRTC2_REGISTER_OFFSET, | ||
| 7155 | GRPH_PFLIP_INT_CLEAR); | ||
| 7156 | if (rdev->irq.stat_regs.cik.d4grph_int & GRPH_PFLIP_INT_OCCURRED) | ||
| 7157 | WREG32(GRPH_INT_STATUS + EVERGREEN_CRTC3_REGISTER_OFFSET, | ||
| 7158 | GRPH_PFLIP_INT_CLEAR); | ||
| 7098 | if (rdev->irq.stat_regs.cik.disp_int_cont2 & LB_D3_VBLANK_INTERRUPT) | 7159 | if (rdev->irq.stat_regs.cik.disp_int_cont2 & LB_D3_VBLANK_INTERRUPT) |
| 7099 | WREG32(LB_VBLANK_STATUS + EVERGREEN_CRTC2_REGISTER_OFFSET, VBLANK_ACK); | 7160 | WREG32(LB_VBLANK_STATUS + EVERGREEN_CRTC2_REGISTER_OFFSET, VBLANK_ACK); |
| 7100 | if (rdev->irq.stat_regs.cik.disp_int_cont2 & LB_D3_VLINE_INTERRUPT) | 7161 | if (rdev->irq.stat_regs.cik.disp_int_cont2 & LB_D3_VLINE_INTERRUPT) |
| @@ -7106,6 +7167,12 @@ static inline void cik_irq_ack(struct radeon_device *rdev) | |||
| 7106 | } | 7167 | } |
| 7107 | 7168 | ||
| 7108 | if (rdev->num_crtc >= 6) { | 7169 | if (rdev->num_crtc >= 6) { |
| 7170 | if (rdev->irq.stat_regs.cik.d5grph_int & GRPH_PFLIP_INT_OCCURRED) | ||
| 7171 | WREG32(GRPH_INT_STATUS + EVERGREEN_CRTC4_REGISTER_OFFSET, | ||
| 7172 | GRPH_PFLIP_INT_CLEAR); | ||
| 7173 | if (rdev->irq.stat_regs.cik.d6grph_int & GRPH_PFLIP_INT_OCCURRED) | ||
| 7174 | WREG32(GRPH_INT_STATUS + EVERGREEN_CRTC5_REGISTER_OFFSET, | ||
| 7175 | GRPH_PFLIP_INT_CLEAR); | ||
| 7109 | if (rdev->irq.stat_regs.cik.disp_int_cont4 & LB_D5_VBLANK_INTERRUPT) | 7176 | if (rdev->irq.stat_regs.cik.disp_int_cont4 & LB_D5_VBLANK_INTERRUPT) |
| 7110 | WREG32(LB_VBLANK_STATUS + EVERGREEN_CRTC4_REGISTER_OFFSET, VBLANK_ACK); | 7177 | WREG32(LB_VBLANK_STATUS + EVERGREEN_CRTC4_REGISTER_OFFSET, VBLANK_ACK); |
| 7111 | if (rdev->irq.stat_regs.cik.disp_int_cont4 & LB_D5_VLINE_INTERRUPT) | 7178 | if (rdev->irq.stat_regs.cik.disp_int_cont4 & LB_D5_VLINE_INTERRUPT) |
| @@ -7457,6 +7524,15 @@ restart_ih: | |||
| 7457 | break; | 7524 | break; |
| 7458 | } | 7525 | } |
| 7459 | break; | 7526 | break; |
| 7527 | case 8: /* D1 page flip */ | ||
| 7528 | case 10: /* D2 page flip */ | ||
| 7529 | case 12: /* D3 page flip */ | ||
| 7530 | case 14: /* D4 page flip */ | ||
| 7531 | case 16: /* D5 page flip */ | ||
| 7532 | case 18: /* D6 page flip */ | ||
| 7533 | DRM_DEBUG("IH: D%d flip\n", ((src_id - 8) >> 1) + 1); | ||
| 7534 | radeon_crtc_handle_flip(rdev, (src_id - 8) >> 1); | ||
| 7535 | break; | ||
| 7460 | case 42: /* HPD hotplug */ | 7536 | case 42: /* HPD hotplug */ |
| 7461 | switch (src_data) { | 7537 | switch (src_data) { |
| 7462 | case 0: | 7538 | case 0: |
diff --git a/drivers/gpu/drm/radeon/cikd.h b/drivers/gpu/drm/radeon/cikd.h index 213873270d5f..dd7926394a8f 100644 --- a/drivers/gpu/drm/radeon/cikd.h +++ b/drivers/gpu/drm/radeon/cikd.h | |||
| @@ -888,6 +888,15 @@ | |||
| 888 | # define DC_HPD6_RX_INTERRUPT (1 << 18) | 888 | # define DC_HPD6_RX_INTERRUPT (1 << 18) |
| 889 | #define DISP_INTERRUPT_STATUS_CONTINUE6 0x6780 | 889 | #define DISP_INTERRUPT_STATUS_CONTINUE6 0x6780 |
| 890 | 890 | ||
| 891 | /* 0x6858, 0x7458, 0x10058, 0x10c58, 0x11858, 0x12458 */ | ||
| 892 | #define GRPH_INT_STATUS 0x6858 | ||
| 893 | # define GRPH_PFLIP_INT_OCCURRED (1 << 0) | ||
| 894 | # define GRPH_PFLIP_INT_CLEAR (1 << 8) | ||
| 895 | /* 0x685c, 0x745c, 0x1005c, 0x10c5c, 0x1185c, 0x1245c */ | ||
| 896 | #define GRPH_INT_CONTROL 0x685c | ||
| 897 | # define GRPH_PFLIP_INT_MASK (1 << 0) | ||
| 898 | # define GRPH_PFLIP_INT_TYPE (1 << 8) | ||
| 899 | |||
| 891 | #define DAC_AUTODETECT_INT_CONTROL 0x67c8 | 900 | #define DAC_AUTODETECT_INT_CONTROL 0x67c8 |
| 892 | 901 | ||
| 893 | #define DC_HPD1_INT_STATUS 0x601c | 902 | #define DC_HPD1_INT_STATUS 0x601c |
diff --git a/drivers/gpu/drm/radeon/evergreen.c b/drivers/gpu/drm/radeon/evergreen.c index b406546440da..0f7a51a3694f 100644 --- a/drivers/gpu/drm/radeon/evergreen.c +++ b/drivers/gpu/drm/radeon/evergreen.c | |||
| @@ -4371,7 +4371,6 @@ int evergreen_irq_set(struct radeon_device *rdev) | |||
| 4371 | u32 crtc1 = 0, crtc2 = 0, crtc3 = 0, crtc4 = 0, crtc5 = 0, crtc6 = 0; | 4371 | u32 crtc1 = 0, crtc2 = 0, crtc3 = 0, crtc4 = 0, crtc5 = 0, crtc6 = 0; |
| 4372 | u32 hpd1, hpd2, hpd3, hpd4, hpd5, hpd6; | 4372 | u32 hpd1, hpd2, hpd3, hpd4, hpd5, hpd6; |
| 4373 | u32 grbm_int_cntl = 0; | 4373 | u32 grbm_int_cntl = 0; |
| 4374 | u32 grph1 = 0, grph2 = 0, grph3 = 0, grph4 = 0, grph5 = 0, grph6 = 0; | ||
| 4375 | u32 afmt1 = 0, afmt2 = 0, afmt3 = 0, afmt4 = 0, afmt5 = 0, afmt6 = 0; | 4374 | u32 afmt1 = 0, afmt2 = 0, afmt3 = 0, afmt4 = 0, afmt5 = 0, afmt6 = 0; |
| 4376 | u32 dma_cntl, dma_cntl1 = 0; | 4375 | u32 dma_cntl, dma_cntl1 = 0; |
| 4377 | u32 thermal_int = 0; | 4376 | u32 thermal_int = 0; |
| @@ -4554,15 +4553,21 @@ int evergreen_irq_set(struct radeon_device *rdev) | |||
| 4554 | WREG32(INT_MASK + EVERGREEN_CRTC5_REGISTER_OFFSET, crtc6); | 4553 | WREG32(INT_MASK + EVERGREEN_CRTC5_REGISTER_OFFSET, crtc6); |
| 4555 | } | 4554 | } |
| 4556 | 4555 | ||
| 4557 | WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC0_REGISTER_OFFSET, grph1); | 4556 | WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC0_REGISTER_OFFSET, |
| 4558 | WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC1_REGISTER_OFFSET, grph2); | 4557 | GRPH_PFLIP_INT_MASK); |
| 4558 | WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC1_REGISTER_OFFSET, | ||
| 4559 | GRPH_PFLIP_INT_MASK); | ||
| 4559 | if (rdev->num_crtc >= 4) { | 4560 | if (rdev->num_crtc >= 4) { |
| 4560 | WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC2_REGISTER_OFFSET, grph3); | 4561 | WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC2_REGISTER_OFFSET, |
| 4561 | WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC3_REGISTER_OFFSET, grph4); | 4562 | GRPH_PFLIP_INT_MASK); |
| 4563 | WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC3_REGISTER_OFFSET, | ||
| 4564 | GRPH_PFLIP_INT_MASK); | ||
| 4562 | } | 4565 | } |
| 4563 | if (rdev->num_crtc >= 6) { | 4566 | if (rdev->num_crtc >= 6) { |
| 4564 | WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC4_REGISTER_OFFSET, grph5); | 4567 | WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC4_REGISTER_OFFSET, |
| 4565 | WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC5_REGISTER_OFFSET, grph6); | 4568 | GRPH_PFLIP_INT_MASK); |
| 4569 | WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC5_REGISTER_OFFSET, | ||
| 4570 | GRPH_PFLIP_INT_MASK); | ||
| 4566 | } | 4571 | } |
| 4567 | 4572 | ||
| 4568 | WREG32(DC_HPD1_INT_CONTROL, hpd1); | 4573 | WREG32(DC_HPD1_INT_CONTROL, hpd1); |
| @@ -4951,6 +4956,15 @@ restart_ih: | |||
| 4951 | break; | 4956 | break; |
| 4952 | } | 4957 | } |
| 4953 | break; | 4958 | break; |
| 4959 | case 8: /* D1 page flip */ | ||
| 4960 | case 10: /* D2 page flip */ | ||
| 4961 | case 12: /* D3 page flip */ | ||
| 4962 | case 14: /* D4 page flip */ | ||
| 4963 | case 16: /* D5 page flip */ | ||
| 4964 | case 18: /* D6 page flip */ | ||
| 4965 | DRM_DEBUG("IH: D%d flip\n", ((src_id - 8) >> 1) + 1); | ||
| 4966 | radeon_crtc_handle_flip(rdev, (src_id - 8) >> 1); | ||
| 4967 | break; | ||
| 4954 | case 42: /* HPD hotplug */ | 4968 | case 42: /* HPD hotplug */ |
| 4955 | switch (src_data) { | 4969 | switch (src_data) { |
| 4956 | case 0: | 4970 | case 0: |
diff --git a/drivers/gpu/drm/radeon/r600.c b/drivers/gpu/drm/radeon/r600.c index 6e887d004eba..6c4699362bca 100644 --- a/drivers/gpu/drm/radeon/r600.c +++ b/drivers/gpu/drm/radeon/r600.c | |||
| @@ -3505,7 +3505,6 @@ int r600_irq_set(struct radeon_device *rdev) | |||
| 3505 | u32 hpd1, hpd2, hpd3, hpd4 = 0, hpd5 = 0, hpd6 = 0; | 3505 | u32 hpd1, hpd2, hpd3, hpd4 = 0, hpd5 = 0, hpd6 = 0; |
| 3506 | u32 grbm_int_cntl = 0; | 3506 | u32 grbm_int_cntl = 0; |
| 3507 | u32 hdmi0, hdmi1; | 3507 | u32 hdmi0, hdmi1; |
| 3508 | u32 d1grph = 0, d2grph = 0; | ||
| 3509 | u32 dma_cntl; | 3508 | u32 dma_cntl; |
| 3510 | u32 thermal_int = 0; | 3509 | u32 thermal_int = 0; |
| 3511 | 3510 | ||
| @@ -3614,8 +3613,8 @@ int r600_irq_set(struct radeon_device *rdev) | |||
| 3614 | WREG32(CP_INT_CNTL, cp_int_cntl); | 3613 | WREG32(CP_INT_CNTL, cp_int_cntl); |
| 3615 | WREG32(DMA_CNTL, dma_cntl); | 3614 | WREG32(DMA_CNTL, dma_cntl); |
| 3616 | WREG32(DxMODE_INT_MASK, mode_int); | 3615 | WREG32(DxMODE_INT_MASK, mode_int); |
| 3617 | WREG32(D1GRPH_INTERRUPT_CONTROL, d1grph); | 3616 | WREG32(D1GRPH_INTERRUPT_CONTROL, DxGRPH_PFLIP_INT_MASK); |
| 3618 | WREG32(D2GRPH_INTERRUPT_CONTROL, d2grph); | 3617 | WREG32(D2GRPH_INTERRUPT_CONTROL, DxGRPH_PFLIP_INT_MASK); |
| 3619 | WREG32(GRBM_INT_CNTL, grbm_int_cntl); | 3618 | WREG32(GRBM_INT_CNTL, grbm_int_cntl); |
| 3620 | if (ASIC_IS_DCE3(rdev)) { | 3619 | if (ASIC_IS_DCE3(rdev)) { |
| 3621 | WREG32(DC_HPD1_INT_CONTROL, hpd1); | 3620 | WREG32(DC_HPD1_INT_CONTROL, hpd1); |
| @@ -3918,6 +3917,14 @@ restart_ih: | |||
| 3918 | break; | 3917 | break; |
| 3919 | } | 3918 | } |
| 3920 | break; | 3919 | break; |
| 3920 | case 9: /* D1 pflip */ | ||
| 3921 | DRM_DEBUG("IH: D1 flip\n"); | ||
| 3922 | radeon_crtc_handle_flip(rdev, 0); | ||
| 3923 | break; | ||
| 3924 | case 11: /* D2 pflip */ | ||
| 3925 | DRM_DEBUG("IH: D2 flip\n"); | ||
| 3926 | radeon_crtc_handle_flip(rdev, 1); | ||
| 3927 | break; | ||
| 3921 | case 19: /* HPD/DAC hotplug */ | 3928 | case 19: /* HPD/DAC hotplug */ |
| 3922 | switch (src_data) { | 3929 | switch (src_data) { |
| 3923 | case 0: | 3930 | case 0: |
diff --git a/drivers/gpu/drm/radeon/radeon.h b/drivers/gpu/drm/radeon/radeon.h index b58e1afdda76..68528619834a 100644 --- a/drivers/gpu/drm/radeon/radeon.h +++ b/drivers/gpu/drm/radeon/radeon.h | |||
| @@ -730,6 +730,12 @@ struct cik_irq_stat_regs { | |||
| 730 | u32 disp_int_cont4; | 730 | u32 disp_int_cont4; |
| 731 | u32 disp_int_cont5; | 731 | u32 disp_int_cont5; |
| 732 | u32 disp_int_cont6; | 732 | u32 disp_int_cont6; |
| 733 | u32 d1grph_int; | ||
| 734 | u32 d2grph_int; | ||
| 735 | u32 d3grph_int; | ||
| 736 | u32 d4grph_int; | ||
| 737 | u32 d5grph_int; | ||
| 738 | u32 d6grph_int; | ||
| 733 | }; | 739 | }; |
| 734 | 740 | ||
| 735 | union radeon_irq_stat_regs { | 741 | union radeon_irq_stat_regs { |
diff --git a/drivers/gpu/drm/radeon/radeon_display.c b/drivers/gpu/drm/radeon/radeon_display.c index 8d99d5ee8014..14bd701e316c 100644 --- a/drivers/gpu/drm/radeon/radeon_display.c +++ b/drivers/gpu/drm/radeon/radeon_display.c | |||
| @@ -284,6 +284,10 @@ void radeon_crtc_handle_flip(struct radeon_device *rdev, int crtc_id) | |||
| 284 | u32 update_pending; | 284 | u32 update_pending; |
| 285 | int vpos, hpos; | 285 | int vpos, hpos; |
| 286 | 286 | ||
| 287 | /* can happen during initialization */ | ||
| 288 | if (radeon_crtc == NULL) | ||
| 289 | return; | ||
| 290 | |||
| 287 | spin_lock_irqsave(&rdev->ddev->event_lock, flags); | 291 | spin_lock_irqsave(&rdev->ddev->event_lock, flags); |
| 288 | work = radeon_crtc->unpin_work; | 292 | work = radeon_crtc->unpin_work; |
| 289 | if (work == NULL || | 293 | if (work == NULL || |
diff --git a/drivers/gpu/drm/radeon/si.c b/drivers/gpu/drm/radeon/si.c index ac708e006180..22a63c98ba14 100644 --- a/drivers/gpu/drm/radeon/si.c +++ b/drivers/gpu/drm/radeon/si.c | |||
| @@ -5780,7 +5780,6 @@ int si_irq_set(struct radeon_device *rdev) | |||
| 5780 | u32 crtc1 = 0, crtc2 = 0, crtc3 = 0, crtc4 = 0, crtc5 = 0, crtc6 = 0; | 5780 | u32 crtc1 = 0, crtc2 = 0, crtc3 = 0, crtc4 = 0, crtc5 = 0, crtc6 = 0; |
| 5781 | u32 hpd1 = 0, hpd2 = 0, hpd3 = 0, hpd4 = 0, hpd5 = 0, hpd6 = 0; | 5781 | u32 hpd1 = 0, hpd2 = 0, hpd3 = 0, hpd4 = 0, hpd5 = 0, hpd6 = 0; |
| 5782 | u32 grbm_int_cntl = 0; | 5782 | u32 grbm_int_cntl = 0; |
| 5783 | u32 grph1 = 0, grph2 = 0, grph3 = 0, grph4 = 0, grph5 = 0, grph6 = 0; | ||
| 5784 | u32 dma_cntl, dma_cntl1; | 5783 | u32 dma_cntl, dma_cntl1; |
| 5785 | u32 thermal_int = 0; | 5784 | u32 thermal_int = 0; |
| 5786 | 5785 | ||
| @@ -5919,16 +5918,22 @@ int si_irq_set(struct radeon_device *rdev) | |||
| 5919 | } | 5918 | } |
| 5920 | 5919 | ||
| 5921 | if (rdev->num_crtc >= 2) { | 5920 | if (rdev->num_crtc >= 2) { |
| 5922 | WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC0_REGISTER_OFFSET, grph1); | 5921 | WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC0_REGISTER_OFFSET, |
| 5923 | WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC1_REGISTER_OFFSET, grph2); | 5922 | GRPH_PFLIP_INT_MASK); |
| 5923 | WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC1_REGISTER_OFFSET, | ||
| 5924 | GRPH_PFLIP_INT_MASK); | ||
| 5924 | } | 5925 | } |
| 5925 | if (rdev->num_crtc >= 4) { | 5926 | if (rdev->num_crtc >= 4) { |
| 5926 | WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC2_REGISTER_OFFSET, grph3); | 5927 | WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC2_REGISTER_OFFSET, |
| 5927 | WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC3_REGISTER_OFFSET, grph4); | 5928 | GRPH_PFLIP_INT_MASK); |
| 5929 | WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC3_REGISTER_OFFSET, | ||
| 5930 | GRPH_PFLIP_INT_MASK); | ||
| 5928 | } | 5931 | } |
| 5929 | if (rdev->num_crtc >= 6) { | 5932 | if (rdev->num_crtc >= 6) { |
| 5930 | WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC4_REGISTER_OFFSET, grph5); | 5933 | WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC4_REGISTER_OFFSET, |
| 5931 | WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC5_REGISTER_OFFSET, grph6); | 5934 | GRPH_PFLIP_INT_MASK); |
| 5935 | WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC5_REGISTER_OFFSET, | ||
| 5936 | GRPH_PFLIP_INT_MASK); | ||
| 5932 | } | 5937 | } |
| 5933 | 5938 | ||
| 5934 | if (!ASIC_IS_NODCE(rdev)) { | 5939 | if (!ASIC_IS_NODCE(rdev)) { |
| @@ -6292,6 +6297,15 @@ restart_ih: | |||
| 6292 | break; | 6297 | break; |
| 6293 | } | 6298 | } |
| 6294 | break; | 6299 | break; |
| 6300 | case 8: /* D1 page flip */ | ||
| 6301 | case 10: /* D2 page flip */ | ||
| 6302 | case 12: /* D3 page flip */ | ||
| 6303 | case 14: /* D4 page flip */ | ||
| 6304 | case 16: /* D5 page flip */ | ||
| 6305 | case 18: /* D6 page flip */ | ||
| 6306 | DRM_DEBUG("IH: D%d flip\n", ((src_id - 8) >> 1) + 1); | ||
| 6307 | radeon_crtc_handle_flip(rdev, (src_id - 8) >> 1); | ||
| 6308 | break; | ||
| 6295 | case 42: /* HPD hotplug */ | 6309 | case 42: /* HPD hotplug */ |
| 6296 | switch (src_data) { | 6310 | switch (src_data) { |
| 6297 | case 0: | 6311 | case 0: |
