aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu
diff options
context:
space:
mode:
authorAlex Deucher <alexander.deucher@amd.com>2014-01-28 23:49:37 -0500
committerAlex Deucher <alexander.deucher@amd.com>2014-01-29 16:10:54 -0500
commit78fe9e545ce6d510b979dc2d8e14096a279fc519 (patch)
treeaef15c048fddc24df5f37292ed0e3d5dd1ba0a3f /drivers/gpu
parent6802d4bad83f50081b2788698570218aaff8d10e (diff)
drm/radeon/dce8: workaround for atom BlankCrtc table
Some DCE8 boards have a funky BlankCrtc table that results in a timeout when trying to blank the display. The timeout is harmless (all operations needed from the table are complete), but wastes time and is confusing to users so work around it. bug: https://bugs.freedesktop.org/show_bug.cgi?id=73420 Signed-off-by: Alex Deucher <alexander.deucher@amd.com> Cc: stable@vger.kernel.org
Diffstat (limited to 'drivers/gpu')
-rw-r--r--drivers/gpu/drm/radeon/atombios_crtc.c20
1 files changed, 20 insertions, 0 deletions
diff --git a/drivers/gpu/drm/radeon/atombios_crtc.c b/drivers/gpu/drm/radeon/atombios_crtc.c
index 4cf678306c9c..a9338c85630f 100644
--- a/drivers/gpu/drm/radeon/atombios_crtc.c
+++ b/drivers/gpu/drm/radeon/atombios_crtc.c
@@ -209,6 +209,16 @@ static void atombios_enable_crtc_memreq(struct drm_crtc *crtc, int state)
209 atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args); 209 atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args);
210} 210}
211 211
212static const u32 vga_control_regs[6] =
213{
214 AVIVO_D1VGA_CONTROL,
215 AVIVO_D2VGA_CONTROL,
216 EVERGREEN_D3VGA_CONTROL,
217 EVERGREEN_D4VGA_CONTROL,
218 EVERGREEN_D5VGA_CONTROL,
219 EVERGREEN_D6VGA_CONTROL,
220};
221
212static void atombios_blank_crtc(struct drm_crtc *crtc, int state) 222static void atombios_blank_crtc(struct drm_crtc *crtc, int state)
213{ 223{
214 struct radeon_crtc *radeon_crtc = to_radeon_crtc(crtc); 224 struct radeon_crtc *radeon_crtc = to_radeon_crtc(crtc);
@@ -216,13 +226,23 @@ static void atombios_blank_crtc(struct drm_crtc *crtc, int state)
216 struct radeon_device *rdev = dev->dev_private; 226 struct radeon_device *rdev = dev->dev_private;
217 int index = GetIndexIntoMasterTable(COMMAND, BlankCRTC); 227 int index = GetIndexIntoMasterTable(COMMAND, BlankCRTC);
218 BLANK_CRTC_PS_ALLOCATION args; 228 BLANK_CRTC_PS_ALLOCATION args;
229 u32 vga_control = 0;
219 230
220 memset(&args, 0, sizeof(args)); 231 memset(&args, 0, sizeof(args));
221 232
233 if (ASIC_IS_DCE8(rdev)) {
234 vga_control = RREG32(vga_control_regs[radeon_crtc->crtc_id]);
235 WREG32(vga_control_regs[radeon_crtc->crtc_id], vga_control | 1);
236 }
237
222 args.ucCRTC = radeon_crtc->crtc_id; 238 args.ucCRTC = radeon_crtc->crtc_id;
223 args.ucBlanking = state; 239 args.ucBlanking = state;
224 240
225 atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args); 241 atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args);
242
243 if (ASIC_IS_DCE8(rdev)) {
244 WREG32(vga_control_regs[radeon_crtc->crtc_id], vga_control);
245 }
226} 246}
227 247
228static void atombios_powergate_crtc(struct drm_crtc *crtc, int state) 248static void atombios_powergate_crtc(struct drm_crtc *crtc, int state)