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: |