diff options
Diffstat (limited to 'drivers/gpu/drm/radeon/r600.c')
| -rw-r--r-- | drivers/gpu/drm/radeon/r600.c | 155 |
1 files changed, 87 insertions, 68 deletions
diff --git a/drivers/gpu/drm/radeon/r600.c b/drivers/gpu/drm/radeon/r600.c index 35dafd77a639..4ea5b10ff5f4 100644 --- a/drivers/gpu/drm/radeon/r600.c +++ b/drivers/gpu/drm/radeon/r600.c | |||
| @@ -4086,23 +4086,27 @@ restart_ih: | |||
| 4086 | case 1: /* D1 vblank/vline */ | 4086 | case 1: /* D1 vblank/vline */ |
| 4087 | switch (src_data) { | 4087 | switch (src_data) { |
| 4088 | case 0: /* D1 vblank */ | 4088 | case 0: /* D1 vblank */ |
| 4089 | if (rdev->irq.stat_regs.r600.disp_int & LB_D1_VBLANK_INTERRUPT) { | 4089 | if (!(rdev->irq.stat_regs.r600.disp_int & LB_D1_VBLANK_INTERRUPT)) |
| 4090 | if (rdev->irq.crtc_vblank_int[0]) { | 4090 | DRM_DEBUG("IH: D1 vblank - IH event w/o asserted irq bit?\n"); |
| 4091 | drm_handle_vblank(rdev->ddev, 0); | 4091 | |
| 4092 | rdev->pm.vblank_sync = true; | 4092 | if (rdev->irq.crtc_vblank_int[0]) { |
| 4093 | wake_up(&rdev->irq.vblank_queue); | 4093 | drm_handle_vblank(rdev->ddev, 0); |
| 4094 | } | 4094 | rdev->pm.vblank_sync = true; |
| 4095 | if (atomic_read(&rdev->irq.pflip[0])) | 4095 | wake_up(&rdev->irq.vblank_queue); |
| 4096 | radeon_crtc_handle_vblank(rdev, 0); | ||
| 4097 | rdev->irq.stat_regs.r600.disp_int &= ~LB_D1_VBLANK_INTERRUPT; | ||
| 4098 | DRM_DEBUG("IH: D1 vblank\n"); | ||
| 4099 | } | 4096 | } |
| 4097 | if (atomic_read(&rdev->irq.pflip[0])) | ||
| 4098 | radeon_crtc_handle_vblank(rdev, 0); | ||
| 4099 | rdev->irq.stat_regs.r600.disp_int &= ~LB_D1_VBLANK_INTERRUPT; | ||
| 4100 | DRM_DEBUG("IH: D1 vblank\n"); | ||
| 4101 | |||
| 4100 | break; | 4102 | break; |
| 4101 | case 1: /* D1 vline */ | 4103 | case 1: /* D1 vline */ |
| 4102 | if (rdev->irq.stat_regs.r600.disp_int & LB_D1_VLINE_INTERRUPT) { | 4104 | if (!(rdev->irq.stat_regs.r600.disp_int & LB_D1_VLINE_INTERRUPT)) |
| 4103 | rdev->irq.stat_regs.r600.disp_int &= ~LB_D1_VLINE_INTERRUPT; | 4105 | DRM_DEBUG("IH: D1 vline - IH event w/o asserted irq bit?\n"); |
| 4104 | DRM_DEBUG("IH: D1 vline\n"); | 4106 | |
| 4105 | } | 4107 | rdev->irq.stat_regs.r600.disp_int &= ~LB_D1_VLINE_INTERRUPT; |
| 4108 | DRM_DEBUG("IH: D1 vline\n"); | ||
| 4109 | |||
| 4106 | break; | 4110 | break; |
| 4107 | default: | 4111 | default: |
| 4108 | DRM_DEBUG("Unhandled interrupt: %d %d\n", src_id, src_data); | 4112 | DRM_DEBUG("Unhandled interrupt: %d %d\n", src_id, src_data); |
| @@ -4112,23 +4116,27 @@ restart_ih: | |||
| 4112 | case 5: /* D2 vblank/vline */ | 4116 | case 5: /* D2 vblank/vline */ |
| 4113 | switch (src_data) { | 4117 | switch (src_data) { |
| 4114 | case 0: /* D2 vblank */ | 4118 | case 0: /* D2 vblank */ |
| 4115 | if (rdev->irq.stat_regs.r600.disp_int & LB_D2_VBLANK_INTERRUPT) { | 4119 | if (!(rdev->irq.stat_regs.r600.disp_int & LB_D2_VBLANK_INTERRUPT)) |
| 4116 | if (rdev->irq.crtc_vblank_int[1]) { | 4120 | DRM_DEBUG("IH: D2 vblank - IH event w/o asserted irq bit?\n"); |
| 4117 | drm_handle_vblank(rdev->ddev, 1); | 4121 | |
| 4118 | rdev->pm.vblank_sync = true; | 4122 | if (rdev->irq.crtc_vblank_int[1]) { |
| 4119 | wake_up(&rdev->irq.vblank_queue); | 4123 | drm_handle_vblank(rdev->ddev, 1); |
| 4120 | } | 4124 | rdev->pm.vblank_sync = true; |
| 4121 | if (atomic_read(&rdev->irq.pflip[1])) | 4125 | wake_up(&rdev->irq.vblank_queue); |
| 4122 | radeon_crtc_handle_vblank(rdev, 1); | ||
| 4123 | rdev->irq.stat_regs.r600.disp_int &= ~LB_D2_VBLANK_INTERRUPT; | ||
| 4124 | DRM_DEBUG("IH: D2 vblank\n"); | ||
| 4125 | } | 4126 | } |
| 4127 | if (atomic_read(&rdev->irq.pflip[1])) | ||
| 4128 | radeon_crtc_handle_vblank(rdev, 1); | ||
| 4129 | rdev->irq.stat_regs.r600.disp_int &= ~LB_D2_VBLANK_INTERRUPT; | ||
| 4130 | DRM_DEBUG("IH: D2 vblank\n"); | ||
| 4131 | |||
| 4126 | break; | 4132 | break; |
| 4127 | case 1: /* D1 vline */ | 4133 | case 1: /* D1 vline */ |
| 4128 | if (rdev->irq.stat_regs.r600.disp_int & LB_D2_VLINE_INTERRUPT) { | 4134 | if (!(rdev->irq.stat_regs.r600.disp_int & LB_D2_VLINE_INTERRUPT)) |
| 4129 | rdev->irq.stat_regs.r600.disp_int &= ~LB_D2_VLINE_INTERRUPT; | 4135 | DRM_DEBUG("IH: D2 vline - IH event w/o asserted irq bit?\n"); |
| 4130 | DRM_DEBUG("IH: D2 vline\n"); | 4136 | |
| 4131 | } | 4137 | rdev->irq.stat_regs.r600.disp_int &= ~LB_D2_VLINE_INTERRUPT; |
| 4138 | DRM_DEBUG("IH: D2 vline\n"); | ||
| 4139 | |||
| 4132 | break; | 4140 | break; |
| 4133 | default: | 4141 | default: |
| 4134 | DRM_DEBUG("Unhandled interrupt: %d %d\n", src_id, src_data); | 4142 | DRM_DEBUG("Unhandled interrupt: %d %d\n", src_id, src_data); |
| @@ -4148,46 +4156,53 @@ restart_ih: | |||
| 4148 | case 19: /* HPD/DAC hotplug */ | 4156 | case 19: /* HPD/DAC hotplug */ |
| 4149 | switch (src_data) { | 4157 | switch (src_data) { |
| 4150 | case 0: | 4158 | case 0: |
| 4151 | if (rdev->irq.stat_regs.r600.disp_int & DC_HPD1_INTERRUPT) { | 4159 | if (!(rdev->irq.stat_regs.r600.disp_int & DC_HPD1_INTERRUPT)) |
| 4152 | rdev->irq.stat_regs.r600.disp_int &= ~DC_HPD1_INTERRUPT; | 4160 | DRM_DEBUG("IH: HPD1 - IH event w/o asserted irq bit?\n"); |
| 4153 | queue_hotplug = true; | 4161 | |
| 4154 | DRM_DEBUG("IH: HPD1\n"); | 4162 | rdev->irq.stat_regs.r600.disp_int &= ~DC_HPD1_INTERRUPT; |
| 4155 | } | 4163 | queue_hotplug = true; |
| 4164 | DRM_DEBUG("IH: HPD1\n"); | ||
| 4156 | break; | 4165 | break; |
| 4157 | case 1: | 4166 | case 1: |
| 4158 | if (rdev->irq.stat_regs.r600.disp_int & DC_HPD2_INTERRUPT) { | 4167 | if (!(rdev->irq.stat_regs.r600.disp_int & DC_HPD2_INTERRUPT)) |
| 4159 | rdev->irq.stat_regs.r600.disp_int &= ~DC_HPD2_INTERRUPT; | 4168 | DRM_DEBUG("IH: HPD2 - IH event w/o asserted irq bit?\n"); |
| 4160 | queue_hotplug = true; | 4169 | |
| 4161 | DRM_DEBUG("IH: HPD2\n"); | 4170 | rdev->irq.stat_regs.r600.disp_int &= ~DC_HPD2_INTERRUPT; |
| 4162 | } | 4171 | queue_hotplug = true; |
| 4172 | DRM_DEBUG("IH: HPD2\n"); | ||
| 4163 | break; | 4173 | break; |
| 4164 | case 4: | 4174 | case 4: |
| 4165 | if (rdev->irq.stat_regs.r600.disp_int_cont & DC_HPD3_INTERRUPT) { | 4175 | if (!(rdev->irq.stat_regs.r600.disp_int_cont & DC_HPD3_INTERRUPT)) |
| 4166 | rdev->irq.stat_regs.r600.disp_int_cont &= ~DC_HPD3_INTERRUPT; | 4176 | DRM_DEBUG("IH: HPD3 - IH event w/o asserted irq bit?\n"); |
| 4167 | queue_hotplug = true; | 4177 | |
| 4168 | DRM_DEBUG("IH: HPD3\n"); | 4178 | rdev->irq.stat_regs.r600.disp_int_cont &= ~DC_HPD3_INTERRUPT; |
| 4169 | } | 4179 | queue_hotplug = true; |
| 4180 | DRM_DEBUG("IH: HPD3\n"); | ||
| 4170 | break; | 4181 | break; |
| 4171 | case 5: | 4182 | case 5: |
| 4172 | if (rdev->irq.stat_regs.r600.disp_int_cont & DC_HPD4_INTERRUPT) { | 4183 | if (!(rdev->irq.stat_regs.r600.disp_int_cont & DC_HPD4_INTERRUPT)) |
| 4173 | rdev->irq.stat_regs.r600.disp_int_cont &= ~DC_HPD4_INTERRUPT; | 4184 | DRM_DEBUG("IH: HPD4 - IH event w/o asserted irq bit?\n"); |
| 4174 | queue_hotplug = true; | 4185 | |
| 4175 | DRM_DEBUG("IH: HPD4\n"); | 4186 | rdev->irq.stat_regs.r600.disp_int_cont &= ~DC_HPD4_INTERRUPT; |
| 4176 | } | 4187 | queue_hotplug = true; |
| 4188 | DRM_DEBUG("IH: HPD4\n"); | ||
| 4177 | break; | 4189 | break; |
| 4178 | case 10: | 4190 | case 10: |
| 4179 | if (rdev->irq.stat_regs.r600.disp_int_cont2 & DC_HPD5_INTERRUPT) { | 4191 | if (!(rdev->irq.stat_regs.r600.disp_int_cont2 & DC_HPD5_INTERRUPT)) |
| 4180 | rdev->irq.stat_regs.r600.disp_int_cont2 &= ~DC_HPD5_INTERRUPT; | 4192 | DRM_DEBUG("IH: HPD5 - IH event w/o asserted irq bit?\n"); |
| 4181 | queue_hotplug = true; | 4193 | |
| 4182 | DRM_DEBUG("IH: HPD5\n"); | 4194 | rdev->irq.stat_regs.r600.disp_int_cont2 &= ~DC_HPD5_INTERRUPT; |
| 4183 | } | 4195 | queue_hotplug = true; |
| 4196 | DRM_DEBUG("IH: HPD5\n"); | ||
| 4184 | break; | 4197 | break; |
| 4185 | case 12: | 4198 | case 12: |
| 4186 | if (rdev->irq.stat_regs.r600.disp_int_cont2 & DC_HPD6_INTERRUPT) { | 4199 | if (!(rdev->irq.stat_regs.r600.disp_int_cont2 & DC_HPD6_INTERRUPT)) |
| 4187 | rdev->irq.stat_regs.r600.disp_int_cont2 &= ~DC_HPD6_INTERRUPT; | 4200 | DRM_DEBUG("IH: HPD6 - IH event w/o asserted irq bit?\n"); |
| 4188 | queue_hotplug = true; | 4201 | |
| 4189 | DRM_DEBUG("IH: HPD6\n"); | 4202 | rdev->irq.stat_regs.r600.disp_int_cont2 &= ~DC_HPD6_INTERRUPT; |
| 4190 | } | 4203 | queue_hotplug = true; |
| 4204 | DRM_DEBUG("IH: HPD6\n"); | ||
| 4205 | |||
| 4191 | break; | 4206 | break; |
| 4192 | default: | 4207 | default: |
| 4193 | DRM_DEBUG("Unhandled interrupt: %d %d\n", src_id, src_data); | 4208 | DRM_DEBUG("Unhandled interrupt: %d %d\n", src_id, src_data); |
| @@ -4197,18 +4212,22 @@ restart_ih: | |||
| 4197 | case 21: /* hdmi */ | 4212 | case 21: /* hdmi */ |
| 4198 | switch (src_data) { | 4213 | switch (src_data) { |
| 4199 | case 4: | 4214 | case 4: |
| 4200 | if (rdev->irq.stat_regs.r600.hdmi0_status & HDMI0_AZ_FORMAT_WTRIG) { | 4215 | if (!(rdev->irq.stat_regs.r600.hdmi0_status & HDMI0_AZ_FORMAT_WTRIG)) |
| 4201 | rdev->irq.stat_regs.r600.hdmi0_status &= ~HDMI0_AZ_FORMAT_WTRIG; | 4216 | DRM_DEBUG("IH: HDMI0 - IH event w/o asserted irq bit?\n"); |
| 4202 | queue_hdmi = true; | 4217 | |
| 4203 | DRM_DEBUG("IH: HDMI0\n"); | 4218 | rdev->irq.stat_regs.r600.hdmi0_status &= ~HDMI0_AZ_FORMAT_WTRIG; |
| 4204 | } | 4219 | queue_hdmi = true; |
| 4220 | DRM_DEBUG("IH: HDMI0\n"); | ||
| 4221 | |||
| 4205 | break; | 4222 | break; |
| 4206 | case 5: | 4223 | case 5: |
| 4207 | if (rdev->irq.stat_regs.r600.hdmi1_status & HDMI0_AZ_FORMAT_WTRIG) { | 4224 | if (!(rdev->irq.stat_regs.r600.hdmi1_status & HDMI0_AZ_FORMAT_WTRIG)) |
| 4208 | rdev->irq.stat_regs.r600.hdmi1_status &= ~HDMI0_AZ_FORMAT_WTRIG; | 4225 | DRM_DEBUG("IH: HDMI1 - IH event w/o asserted irq bit?\n"); |
| 4209 | queue_hdmi = true; | 4226 | |
| 4210 | DRM_DEBUG("IH: HDMI1\n"); | 4227 | rdev->irq.stat_regs.r600.hdmi1_status &= ~HDMI0_AZ_FORMAT_WTRIG; |
| 4211 | } | 4228 | queue_hdmi = true; |
| 4229 | DRM_DEBUG("IH: HDMI1\n"); | ||
| 4230 | |||
| 4212 | break; | 4231 | break; |
| 4213 | default: | 4232 | default: |
| 4214 | DRM_ERROR("Unhandled interrupt: %d %d\n", src_id, src_data); | 4233 | DRM_ERROR("Unhandled interrupt: %d %d\n", src_id, src_data); |
