aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJerome Glisse <jglisse@redhat.com>2012-07-27 16:32:24 -0400
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2012-08-26 18:12:11 -0400
commitf5a5aa3a1f996962d9a2a9fe0bb2c096a8b06f37 (patch)
tree420d3d8ecae752440e214a1b1248b97a98836c5c
parent413b13d9dd468992591bafb55e849c87fb68341c (diff)
drm/radeon: do not reenable crtc after moving vram start address
commit 81ee8fb6b52ec69eeed37fe7943446af1dccecc5 upstream. It seems we can not update the crtc scanout address. After disabling crtc, update to base address do not take effect after crtc being reenable leading to at least frame being scanout from the old crtc base address. Disabling crtc display request lead to same behavior. So after changing the vram address if we don't keep crtc disabled we will have the GPU trying to read some random system memory address with some iommu this will broke the crtc engine and will lead to broken display and iommu error message. So to avoid this, disable crtc. For flicker less boot we will need to avoid moving the vram start address. This patch should also fix : https://bugs.freedesktop.org/show_bug.cgi?id=42373 Signed-off-by: Jerome Glisse <jglisse@redhat.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
-rw-r--r--drivers/gpu/drm/radeon/evergreen.c57
-rw-r--r--drivers/gpu/drm/radeon/radeon_asic.h8
-rw-r--r--drivers/gpu/drm/radeon/rv515.c13
3 files changed, 2 insertions, 76 deletions
diff --git a/drivers/gpu/drm/radeon/evergreen.c b/drivers/gpu/drm/radeon/evergreen.c
index 8846bad45e6..314e2172a88 100644
--- a/drivers/gpu/drm/radeon/evergreen.c
+++ b/drivers/gpu/drm/radeon/evergreen.c
@@ -1019,24 +1019,8 @@ void evergreen_agp_enable(struct radeon_device *rdev)
1019 1019
1020void evergreen_mc_stop(struct radeon_device *rdev, struct evergreen_mc_save *save) 1020void evergreen_mc_stop(struct radeon_device *rdev, struct evergreen_mc_save *save)
1021{ 1021{
1022 save->vga_control[0] = RREG32(D1VGA_CONTROL);
1023 save->vga_control[1] = RREG32(D2VGA_CONTROL);
1024 save->vga_render_control = RREG32(VGA_RENDER_CONTROL); 1022 save->vga_render_control = RREG32(VGA_RENDER_CONTROL);
1025 save->vga_hdp_control = RREG32(VGA_HDP_CONTROL); 1023 save->vga_hdp_control = RREG32(VGA_HDP_CONTROL);
1026 save->crtc_control[0] = RREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC0_REGISTER_OFFSET);
1027 save->crtc_control[1] = RREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC1_REGISTER_OFFSET);
1028 if (rdev->num_crtc >= 4) {
1029 save->vga_control[2] = RREG32(EVERGREEN_D3VGA_CONTROL);
1030 save->vga_control[3] = RREG32(EVERGREEN_D4VGA_CONTROL);
1031 save->crtc_control[2] = RREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC2_REGISTER_OFFSET);
1032 save->crtc_control[3] = RREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC3_REGISTER_OFFSET);
1033 }
1034 if (rdev->num_crtc >= 6) {
1035 save->vga_control[4] = RREG32(EVERGREEN_D5VGA_CONTROL);
1036 save->vga_control[5] = RREG32(EVERGREEN_D6VGA_CONTROL);
1037 save->crtc_control[4] = RREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC4_REGISTER_OFFSET);
1038 save->crtc_control[5] = RREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC5_REGISTER_OFFSET);
1039 }
1040 1024
1041 /* Stop all video */ 1025 /* Stop all video */
1042 WREG32(VGA_RENDER_CONTROL, 0); 1026 WREG32(VGA_RENDER_CONTROL, 0);
@@ -1147,47 +1131,6 @@ void evergreen_mc_resume(struct radeon_device *rdev, struct evergreen_mc_save *s
1147 /* Unlock host access */ 1131 /* Unlock host access */
1148 WREG32(VGA_HDP_CONTROL, save->vga_hdp_control); 1132 WREG32(VGA_HDP_CONTROL, save->vga_hdp_control);
1149 mdelay(1); 1133 mdelay(1);
1150 /* Restore video state */
1151 WREG32(D1VGA_CONTROL, save->vga_control[0]);
1152 WREG32(D2VGA_CONTROL, save->vga_control[1]);
1153 if (rdev->num_crtc >= 4) {
1154 WREG32(EVERGREEN_D3VGA_CONTROL, save->vga_control[2]);
1155 WREG32(EVERGREEN_D4VGA_CONTROL, save->vga_control[3]);
1156 }
1157 if (rdev->num_crtc >= 6) {
1158 WREG32(EVERGREEN_D5VGA_CONTROL, save->vga_control[4]);
1159 WREG32(EVERGREEN_D6VGA_CONTROL, save->vga_control[5]);
1160 }
1161 WREG32(EVERGREEN_CRTC_UPDATE_LOCK + EVERGREEN_CRTC0_REGISTER_OFFSET, 1);
1162 WREG32(EVERGREEN_CRTC_UPDATE_LOCK + EVERGREEN_CRTC1_REGISTER_OFFSET, 1);
1163 if (rdev->num_crtc >= 4) {
1164 WREG32(EVERGREEN_CRTC_UPDATE_LOCK + EVERGREEN_CRTC2_REGISTER_OFFSET, 1);
1165 WREG32(EVERGREEN_CRTC_UPDATE_LOCK + EVERGREEN_CRTC3_REGISTER_OFFSET, 1);
1166 }
1167 if (rdev->num_crtc >= 6) {
1168 WREG32(EVERGREEN_CRTC_UPDATE_LOCK + EVERGREEN_CRTC4_REGISTER_OFFSET, 1);
1169 WREG32(EVERGREEN_CRTC_UPDATE_LOCK + EVERGREEN_CRTC5_REGISTER_OFFSET, 1);
1170 }
1171 WREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC0_REGISTER_OFFSET, save->crtc_control[0]);
1172 WREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC1_REGISTER_OFFSET, save->crtc_control[1]);
1173 if (rdev->num_crtc >= 4) {
1174 WREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC2_REGISTER_OFFSET, save->crtc_control[2]);
1175 WREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC3_REGISTER_OFFSET, save->crtc_control[3]);
1176 }
1177 if (rdev->num_crtc >= 6) {
1178 WREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC4_REGISTER_OFFSET, save->crtc_control[4]);
1179 WREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC5_REGISTER_OFFSET, save->crtc_control[5]);
1180 }
1181 WREG32(EVERGREEN_CRTC_UPDATE_LOCK + EVERGREEN_CRTC0_REGISTER_OFFSET, 0);
1182 WREG32(EVERGREEN_CRTC_UPDATE_LOCK + EVERGREEN_CRTC1_REGISTER_OFFSET, 0);
1183 if (rdev->num_crtc >= 4) {
1184 WREG32(EVERGREEN_CRTC_UPDATE_LOCK + EVERGREEN_CRTC2_REGISTER_OFFSET, 0);
1185 WREG32(EVERGREEN_CRTC_UPDATE_LOCK + EVERGREEN_CRTC3_REGISTER_OFFSET, 0);
1186 }
1187 if (rdev->num_crtc >= 6) {
1188 WREG32(EVERGREEN_CRTC_UPDATE_LOCK + EVERGREEN_CRTC4_REGISTER_OFFSET, 0);
1189 WREG32(EVERGREEN_CRTC_UPDATE_LOCK + EVERGREEN_CRTC5_REGISTER_OFFSET, 0);
1190 }
1191 WREG32(VGA_RENDER_CONTROL, save->vga_render_control); 1134 WREG32(VGA_RENDER_CONTROL, save->vga_render_control);
1192} 1135}
1193 1136
diff --git a/drivers/gpu/drm/radeon/radeon_asic.h b/drivers/gpu/drm/radeon/radeon_asic.h
index 3dedaa07aac..4d81e961239 100644
--- a/drivers/gpu/drm/radeon/radeon_asic.h
+++ b/drivers/gpu/drm/radeon/radeon_asic.h
@@ -253,13 +253,10 @@ void rs690_line_buffer_adjust(struct radeon_device *rdev,
253 * rv515 253 * rv515
254 */ 254 */
255struct rv515_mc_save { 255struct rv515_mc_save {
256 u32 d1vga_control;
257 u32 d2vga_control;
258 u32 vga_render_control; 256 u32 vga_render_control;
259 u32 vga_hdp_control; 257 u32 vga_hdp_control;
260 u32 d1crtc_control;
261 u32 d2crtc_control;
262}; 258};
259
263int rv515_init(struct radeon_device *rdev); 260int rv515_init(struct radeon_device *rdev);
264void rv515_fini(struct radeon_device *rdev); 261void rv515_fini(struct radeon_device *rdev);
265uint32_t rv515_mc_rreg(struct radeon_device *rdev, uint32_t reg); 262uint32_t rv515_mc_rreg(struct radeon_device *rdev, uint32_t reg);
@@ -387,11 +384,10 @@ void r700_cp_fini(struct radeon_device *rdev);
387 * evergreen 384 * evergreen
388 */ 385 */
389struct evergreen_mc_save { 386struct evergreen_mc_save {
390 u32 vga_control[6];
391 u32 vga_render_control; 387 u32 vga_render_control;
392 u32 vga_hdp_control; 388 u32 vga_hdp_control;
393 u32 crtc_control[6];
394}; 389};
390
395void evergreen_pcie_gart_tlb_flush(struct radeon_device *rdev); 391void evergreen_pcie_gart_tlb_flush(struct radeon_device *rdev);
396int evergreen_init(struct radeon_device *rdev); 392int evergreen_init(struct radeon_device *rdev);
397void evergreen_fini(struct radeon_device *rdev); 393void evergreen_fini(struct radeon_device *rdev);
diff --git a/drivers/gpu/drm/radeon/rv515.c b/drivers/gpu/drm/radeon/rv515.c
index 6613ee9ecca..d5f45b4c1be 100644
--- a/drivers/gpu/drm/radeon/rv515.c
+++ b/drivers/gpu/drm/radeon/rv515.c
@@ -281,12 +281,8 @@ int rv515_debugfs_ga_info_init(struct radeon_device *rdev)
281 281
282void rv515_mc_stop(struct radeon_device *rdev, struct rv515_mc_save *save) 282void rv515_mc_stop(struct radeon_device *rdev, struct rv515_mc_save *save)
283{ 283{
284 save->d1vga_control = RREG32(R_000330_D1VGA_CONTROL);
285 save->d2vga_control = RREG32(R_000338_D2VGA_CONTROL);
286 save->vga_render_control = RREG32(R_000300_VGA_RENDER_CONTROL); 284 save->vga_render_control = RREG32(R_000300_VGA_RENDER_CONTROL);
287 save->vga_hdp_control = RREG32(R_000328_VGA_HDP_CONTROL); 285 save->vga_hdp_control = RREG32(R_000328_VGA_HDP_CONTROL);
288 save->d1crtc_control = RREG32(R_006080_D1CRTC_CONTROL);
289 save->d2crtc_control = RREG32(R_006880_D2CRTC_CONTROL);
290 286
291 /* Stop all video */ 287 /* Stop all video */
292 WREG32(R_0068E8_D2CRTC_UPDATE_LOCK, 0); 288 WREG32(R_0068E8_D2CRTC_UPDATE_LOCK, 0);
@@ -311,15 +307,6 @@ void rv515_mc_resume(struct radeon_device *rdev, struct rv515_mc_save *save)
311 /* Unlock host access */ 307 /* Unlock host access */
312 WREG32(R_000328_VGA_HDP_CONTROL, save->vga_hdp_control); 308 WREG32(R_000328_VGA_HDP_CONTROL, save->vga_hdp_control);
313 mdelay(1); 309 mdelay(1);
314 /* Restore video state */
315 WREG32(R_000330_D1VGA_CONTROL, save->d1vga_control);
316 WREG32(R_000338_D2VGA_CONTROL, save->d2vga_control);
317 WREG32(R_0060E8_D1CRTC_UPDATE_LOCK, 1);
318 WREG32(R_0068E8_D2CRTC_UPDATE_LOCK, 1);
319 WREG32(R_006080_D1CRTC_CONTROL, save->d1crtc_control);
320 WREG32(R_006880_D2CRTC_CONTROL, save->d2crtc_control);
321 WREG32(R_0060E8_D1CRTC_UPDATE_LOCK, 0);
322 WREG32(R_0068E8_D2CRTC_UPDATE_LOCK, 0);
323 WREG32(R_000300_VGA_RENDER_CONTROL, save->vga_render_control); 310 WREG32(R_000300_VGA_RENDER_CONTROL, save->vga_render_control);
324} 311}
325 312