aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorMichel Dänzer <michel.daenzer@amd.com>2016-04-01 05:51:34 -0400
committerAlex Deucher <alexander.deucher@amd.com>2016-05-04 20:19:03 -0400
commitc63dd758589b1f7e8398841d1f443f06ebfbcefc (patch)
tree8dd086669a8d3dd74f8bab0b8e4def9e5e3b08ae /drivers
parenta4333b4c9960a8f8d699910d4ae11c5eaefd8c25 (diff)
drm/radeon: Support DRM_MODE_PAGE_FLIP_ASYNC
When this flag is set, we program the hardware to execute the flip during horizontal blank (i.e. for the next scanline) instead of during vertical blank (i.e. for the next frame). Currently this is only supported on ASICs which have a page flip completion interrupt (>= R600), and only if the use_pflipirq parameter has value 2 (the default). Reviewed-by: Christian König <christian.koenig@amd.com> Signed-off-by: Michel Dänzer <michel.daenzer@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/gpu/drm/radeon/atombios_crtc.c24
-rw-r--r--drivers/gpu/drm/radeon/evergreen.c5
-rw-r--r--drivers/gpu/drm/radeon/r100.c2
-rw-r--r--drivers/gpu/drm/radeon/radeon.h5
-rw-r--r--drivers/gpu/drm/radeon/radeon_asic.h9
-rw-r--r--drivers/gpu/drm/radeon/radeon_display.c6
-rw-r--r--drivers/gpu/drm/radeon/rs600.c4
-rw-r--r--drivers/gpu/drm/radeon/rv770.c4
8 files changed, 35 insertions, 24 deletions
diff --git a/drivers/gpu/drm/radeon/atombios_crtc.c b/drivers/gpu/drm/radeon/atombios_crtc.c
index b80b08f71cb4..bdc7b9ee1930 100644
--- a/drivers/gpu/drm/radeon/atombios_crtc.c
+++ b/drivers/gpu/drm/radeon/atombios_crtc.c
@@ -1375,6 +1375,11 @@ static int dce4_crtc_do_set_base(struct drm_crtc *crtc,
1375 break; 1375 break;
1376 } 1376 }
1377 1377
1378 /* Make sure surface address is updated at vertical blank rather than
1379 * horizontal blank
1380 */
1381 WREG32(EVERGREEN_GRPH_FLIP_CONTROL + radeon_crtc->crtc_offset, 0);
1382
1378 WREG32(EVERGREEN_GRPH_PRIMARY_SURFACE_ADDRESS_HIGH + radeon_crtc->crtc_offset, 1383 WREG32(EVERGREEN_GRPH_PRIMARY_SURFACE_ADDRESS_HIGH + radeon_crtc->crtc_offset,
1379 upper_32_bits(fb_location)); 1384 upper_32_bits(fb_location));
1380 WREG32(EVERGREEN_GRPH_SECONDARY_SURFACE_ADDRESS_HIGH + radeon_crtc->crtc_offset, 1385 WREG32(EVERGREEN_GRPH_SECONDARY_SURFACE_ADDRESS_HIGH + radeon_crtc->crtc_offset,
@@ -1427,12 +1432,6 @@ static int dce4_crtc_do_set_base(struct drm_crtc *crtc,
1427 WREG32(EVERGREEN_VIEWPORT_SIZE + radeon_crtc->crtc_offset, 1432 WREG32(EVERGREEN_VIEWPORT_SIZE + radeon_crtc->crtc_offset,
1428 (viewport_w << 16) | viewport_h); 1433 (viewport_w << 16) | viewport_h);
1429 1434
1430 /* pageflip setup */
1431 /* make sure flip is at vb rather than hb */
1432 tmp = RREG32(EVERGREEN_GRPH_FLIP_CONTROL + radeon_crtc->crtc_offset);
1433 tmp &= ~EVERGREEN_GRPH_SURFACE_UPDATE_H_RETRACE_EN;
1434 WREG32(EVERGREEN_GRPH_FLIP_CONTROL + radeon_crtc->crtc_offset, tmp);
1435
1436 /* set pageflip to happen only at start of vblank interval (front porch) */ 1435 /* set pageflip to happen only at start of vblank interval (front porch) */
1437 WREG32(EVERGREEN_MASTER_UPDATE_MODE + radeon_crtc->crtc_offset, 3); 1436 WREG32(EVERGREEN_MASTER_UPDATE_MODE + radeon_crtc->crtc_offset, 3);
1438 1437
@@ -1466,7 +1465,7 @@ static int avivo_crtc_do_set_base(struct drm_crtc *crtc,
1466 uint64_t fb_location; 1465 uint64_t fb_location;
1467 uint32_t fb_format, fb_pitch_pixels, tiling_flags; 1466 uint32_t fb_format, fb_pitch_pixels, tiling_flags;
1468 u32 fb_swap = R600_D1GRPH_SWAP_ENDIAN_NONE; 1467 u32 fb_swap = R600_D1GRPH_SWAP_ENDIAN_NONE;
1469 u32 tmp, viewport_w, viewport_h; 1468 u32 viewport_w, viewport_h;
1470 int r; 1469 int r;
1471 bool bypass_lut = false; 1470 bool bypass_lut = false;
1472 1471
@@ -1581,6 +1580,11 @@ static int avivo_crtc_do_set_base(struct drm_crtc *crtc,
1581 else 1580 else
1582 WREG32(AVIVO_D2VGA_CONTROL, 0); 1581 WREG32(AVIVO_D2VGA_CONTROL, 0);
1583 1582
1583 /* Make sure surface address is update at vertical blank rather than
1584 * horizontal blank
1585 */
1586 WREG32(AVIVO_D1GRPH_FLIP_CONTROL + radeon_crtc->crtc_offset, 0);
1587
1584 if (rdev->family >= CHIP_RV770) { 1588 if (rdev->family >= CHIP_RV770) {
1585 if (radeon_crtc->crtc_id) { 1589 if (radeon_crtc->crtc_id) {
1586 WREG32(R700_D2GRPH_PRIMARY_SURFACE_ADDRESS_HIGH, upper_32_bits(fb_location)); 1590 WREG32(R700_D2GRPH_PRIMARY_SURFACE_ADDRESS_HIGH, upper_32_bits(fb_location));
@@ -1627,12 +1631,6 @@ static int avivo_crtc_do_set_base(struct drm_crtc *crtc,
1627 WREG32(AVIVO_D1MODE_VIEWPORT_SIZE + radeon_crtc->crtc_offset, 1631 WREG32(AVIVO_D1MODE_VIEWPORT_SIZE + radeon_crtc->crtc_offset,
1628 (viewport_w << 16) | viewport_h); 1632 (viewport_w << 16) | viewport_h);
1629 1633
1630 /* pageflip setup */
1631 /* make sure flip is at vb rather than hb */
1632 tmp = RREG32(AVIVO_D1GRPH_FLIP_CONTROL + radeon_crtc->crtc_offset);
1633 tmp &= ~AVIVO_D1GRPH_SURFACE_UPDATE_H_RETRACE_EN;
1634 WREG32(AVIVO_D1GRPH_FLIP_CONTROL + radeon_crtc->crtc_offset, tmp);
1635
1636 /* set pageflip to happen only at start of vblank interval (front porch) */ 1634 /* set pageflip to happen only at start of vblank interval (front porch) */
1637 WREG32(AVIVO_D1MODE_MASTER_UPDATE_MODE + radeon_crtc->crtc_offset, 3); 1635 WREG32(AVIVO_D1MODE_MASTER_UPDATE_MODE + radeon_crtc->crtc_offset, 3);
1638 1636
diff --git a/drivers/gpu/drm/radeon/evergreen.c b/drivers/gpu/drm/radeon/evergreen.c
index 501633be8ea2..9217d202e94d 100644
--- a/drivers/gpu/drm/radeon/evergreen.c
+++ b/drivers/gpu/drm/radeon/evergreen.c
@@ -1407,11 +1407,14 @@ void dce4_wait_for_vblank(struct radeon_device *rdev, int crtc)
1407 * Triggers the actual pageflip by updating the primary 1407 * Triggers the actual pageflip by updating the primary
1408 * surface base address (evergreen+). 1408 * surface base address (evergreen+).
1409 */ 1409 */
1410void evergreen_page_flip(struct radeon_device *rdev, int crtc_id, u64 crtc_base) 1410void evergreen_page_flip(struct radeon_device *rdev, int crtc_id, u64 crtc_base,
1411 bool async)
1411{ 1412{
1412 struct radeon_crtc *radeon_crtc = rdev->mode_info.crtcs[crtc_id]; 1413 struct radeon_crtc *radeon_crtc = rdev->mode_info.crtcs[crtc_id];
1413 1414
1414 /* update the scanout addresses */ 1415 /* update the scanout addresses */
1416 WREG32(EVERGREEN_GRPH_FLIP_CONTROL + radeon_crtc->crtc_offset,
1417 async ? EVERGREEN_GRPH_SURFACE_UPDATE_H_RETRACE_EN : 0);
1415 WREG32(EVERGREEN_GRPH_PRIMARY_SURFACE_ADDRESS_HIGH + radeon_crtc->crtc_offset, 1418 WREG32(EVERGREEN_GRPH_PRIMARY_SURFACE_ADDRESS_HIGH + radeon_crtc->crtc_offset,
1416 upper_32_bits(crtc_base)); 1419 upper_32_bits(crtc_base));
1417 WREG32(EVERGREEN_GRPH_PRIMARY_SURFACE_ADDRESS + radeon_crtc->crtc_offset, 1420 WREG32(EVERGREEN_GRPH_PRIMARY_SURFACE_ADDRESS + radeon_crtc->crtc_offset,
diff --git a/drivers/gpu/drm/radeon/r100.c b/drivers/gpu/drm/radeon/r100.c
index af985b951d00..f25994b3afa6 100644
--- a/drivers/gpu/drm/radeon/r100.c
+++ b/drivers/gpu/drm/radeon/r100.c
@@ -153,7 +153,7 @@ void r100_wait_for_vblank(struct radeon_device *rdev, int crtc)
153 * bit to go high, when it does, we release the lock, and allow the 153 * bit to go high, when it does, we release the lock, and allow the
154 * double buffered update to take place. 154 * double buffered update to take place.
155 */ 155 */
156void r100_page_flip(struct radeon_device *rdev, int crtc_id, u64 crtc_base) 156void r100_page_flip(struct radeon_device *rdev, int crtc_id, u64 crtc_base, bool async)
157{ 157{
158 struct radeon_crtc *radeon_crtc = rdev->mode_info.crtcs[crtc_id]; 158 struct radeon_crtc *radeon_crtc = rdev->mode_info.crtcs[crtc_id];
159 u32 tmp = ((u32)crtc_base) | RADEON_CRTC_OFFSET__OFFSET_LOCK; 159 u32 tmp = ((u32)crtc_base) | RADEON_CRTC_OFFSET__OFFSET_LOCK;
diff --git a/drivers/gpu/drm/radeon/radeon.h b/drivers/gpu/drm/radeon/radeon.h
index 4192f60df98a..170e69111d1b 100644
--- a/drivers/gpu/drm/radeon/radeon.h
+++ b/drivers/gpu/drm/radeon/radeon.h
@@ -746,6 +746,7 @@ struct radeon_flip_work {
746 struct drm_pending_vblank_event *event; 746 struct drm_pending_vblank_event *event;
747 struct radeon_bo *old_rbo; 747 struct radeon_bo *old_rbo;
748 struct fence *fence; 748 struct fence *fence;
749 bool async;
749}; 750};
750 751
751struct r500_irq_stat_regs { 752struct r500_irq_stat_regs {
@@ -2000,7 +2001,7 @@ struct radeon_asic {
2000 } dpm; 2001 } dpm;
2001 /* pageflipping */ 2002 /* pageflipping */
2002 struct { 2003 struct {
2003 void (*page_flip)(struct radeon_device *rdev, int crtc, u64 crtc_base); 2004 void (*page_flip)(struct radeon_device *rdev, int crtc, u64 crtc_base, bool async);
2004 bool (*page_flip_pending)(struct radeon_device *rdev, int crtc); 2005 bool (*page_flip_pending)(struct radeon_device *rdev, int crtc);
2005 } pflip; 2006 } pflip;
2006}; 2007};
@@ -2777,7 +2778,7 @@ static inline void radeon_ring_write(struct radeon_ring *ring, uint32_t v)
2777#define radeon_pm_finish(rdev) (rdev)->asic->pm.finish((rdev)) 2778#define radeon_pm_finish(rdev) (rdev)->asic->pm.finish((rdev))
2778#define radeon_pm_init_profile(rdev) (rdev)->asic->pm.init_profile((rdev)) 2779#define radeon_pm_init_profile(rdev) (rdev)->asic->pm.init_profile((rdev))
2779#define radeon_pm_get_dynpm_state(rdev) (rdev)->asic->pm.get_dynpm_state((rdev)) 2780#define radeon_pm_get_dynpm_state(rdev) (rdev)->asic->pm.get_dynpm_state((rdev))
2780#define radeon_page_flip(rdev, crtc, base) (rdev)->asic->pflip.page_flip((rdev), (crtc), (base)) 2781#define radeon_page_flip(rdev, crtc, base, async) (rdev)->asic->pflip.page_flip((rdev), (crtc), (base), (async))
2781#define radeon_page_flip_pending(rdev, crtc) (rdev)->asic->pflip.page_flip_pending((rdev), (crtc)) 2782#define radeon_page_flip_pending(rdev, crtc) (rdev)->asic->pflip.page_flip_pending((rdev), (crtc))
2782#define radeon_wait_for_vblank(rdev, crtc) (rdev)->asic->display.wait_for_vblank((rdev), (crtc)) 2783#define radeon_wait_for_vblank(rdev, crtc) (rdev)->asic->display.wait_for_vblank((rdev), (crtc))
2783#define radeon_mc_wait_for_idle(rdev) (rdev)->asic->mc_wait_for_idle((rdev)) 2784#define radeon_mc_wait_for_idle(rdev) (rdev)->asic->mc_wait_for_idle((rdev))
diff --git a/drivers/gpu/drm/radeon/radeon_asic.h b/drivers/gpu/drm/radeon/radeon_asic.h
index 7675dfaaa005..e3f036c20d64 100644
--- a/drivers/gpu/drm/radeon/radeon_asic.h
+++ b/drivers/gpu/drm/radeon/radeon_asic.h
@@ -138,7 +138,7 @@ extern void r100_pm_finish(struct radeon_device *rdev);
138extern void r100_pm_init_profile(struct radeon_device *rdev); 138extern void r100_pm_init_profile(struct radeon_device *rdev);
139extern void r100_pm_get_dynpm_state(struct radeon_device *rdev); 139extern void r100_pm_get_dynpm_state(struct radeon_device *rdev);
140extern void r100_page_flip(struct radeon_device *rdev, int crtc, 140extern void r100_page_flip(struct radeon_device *rdev, int crtc,
141 u64 crtc_base); 141 u64 crtc_base, bool async);
142extern bool r100_page_flip_pending(struct radeon_device *rdev, int crtc); 142extern bool r100_page_flip_pending(struct radeon_device *rdev, int crtc);
143extern void r100_wait_for_vblank(struct radeon_device *rdev, int crtc); 143extern void r100_wait_for_vblank(struct radeon_device *rdev, int crtc);
144extern int r100_mc_wait_for_idle(struct radeon_device *rdev); 144extern int r100_mc_wait_for_idle(struct radeon_device *rdev);
@@ -250,7 +250,7 @@ extern void rs600_pm_misc(struct radeon_device *rdev);
250extern void rs600_pm_prepare(struct radeon_device *rdev); 250extern void rs600_pm_prepare(struct radeon_device *rdev);
251extern void rs600_pm_finish(struct radeon_device *rdev); 251extern void rs600_pm_finish(struct radeon_device *rdev);
252extern void rs600_page_flip(struct radeon_device *rdev, int crtc, 252extern void rs600_page_flip(struct radeon_device *rdev, int crtc,
253 u64 crtc_base); 253 u64 crtc_base, bool async);
254extern bool rs600_page_flip_pending(struct radeon_device *rdev, int crtc); 254extern bool rs600_page_flip_pending(struct radeon_device *rdev, int crtc);
255void rs600_set_safe_registers(struct radeon_device *rdev); 255void rs600_set_safe_registers(struct radeon_device *rdev);
256extern void avivo_wait_for_vblank(struct radeon_device *rdev, int crtc); 256extern void avivo_wait_for_vblank(struct radeon_device *rdev, int crtc);
@@ -464,7 +464,8 @@ void rv770_fini(struct radeon_device *rdev);
464int rv770_suspend(struct radeon_device *rdev); 464int rv770_suspend(struct radeon_device *rdev);
465int rv770_resume(struct radeon_device *rdev); 465int rv770_resume(struct radeon_device *rdev);
466void rv770_pm_misc(struct radeon_device *rdev); 466void rv770_pm_misc(struct radeon_device *rdev);
467void rv770_page_flip(struct radeon_device *rdev, int crtc, u64 crtc_base); 467void rv770_page_flip(struct radeon_device *rdev, int crtc, u64 crtc_base,
468 bool async);
468bool rv770_page_flip_pending(struct radeon_device *rdev, int crtc); 469bool rv770_page_flip_pending(struct radeon_device *rdev, int crtc);
469void r700_vram_gtt_location(struct radeon_device *rdev, struct radeon_mc *mc); 470void r700_vram_gtt_location(struct radeon_device *rdev, struct radeon_mc *mc);
470void r700_cp_stop(struct radeon_device *rdev); 471void r700_cp_stop(struct radeon_device *rdev);
@@ -534,7 +535,7 @@ extern void btc_pm_init_profile(struct radeon_device *rdev);
534int sumo_set_uvd_clocks(struct radeon_device *rdev, u32 vclk, u32 dclk); 535int sumo_set_uvd_clocks(struct radeon_device *rdev, u32 vclk, u32 dclk);
535int evergreen_set_uvd_clocks(struct radeon_device *rdev, u32 vclk, u32 dclk); 536int evergreen_set_uvd_clocks(struct radeon_device *rdev, u32 vclk, u32 dclk);
536extern void evergreen_page_flip(struct radeon_device *rdev, int crtc, 537extern void evergreen_page_flip(struct radeon_device *rdev, int crtc,
537 u64 crtc_base); 538 u64 crtc_base, bool async);
538extern bool evergreen_page_flip_pending(struct radeon_device *rdev, int crtc); 539extern bool evergreen_page_flip_pending(struct radeon_device *rdev, int crtc);
539extern void dce4_wait_for_vblank(struct radeon_device *rdev, int crtc); 540extern void dce4_wait_for_vblank(struct radeon_device *rdev, int crtc);
540void evergreen_disable_interrupt_state(struct radeon_device *rdev); 541void evergreen_disable_interrupt_state(struct radeon_device *rdev);
diff --git a/drivers/gpu/drm/radeon/radeon_display.c b/drivers/gpu/drm/radeon/radeon_display.c
index fcc7483d3f7b..7f176ecfc583 100644
--- a/drivers/gpu/drm/radeon/radeon_display.c
+++ b/drivers/gpu/drm/radeon/radeon_display.c
@@ -490,7 +490,7 @@ static void radeon_flip_work_func(struct work_struct *__work)
490 vblank->linedur_ns / 1000, stat, vpos, hpos); 490 vblank->linedur_ns / 1000, stat, vpos, hpos);
491 491
492 /* do the flip (mmio) */ 492 /* do the flip (mmio) */
493 radeon_page_flip(rdev, radeon_crtc->crtc_id, work->base); 493 radeon_page_flip(rdev, radeon_crtc->crtc_id, work->base, work->async);
494 494
495 radeon_crtc->flip_status = RADEON_FLIP_SUBMITTED; 495 radeon_crtc->flip_status = RADEON_FLIP_SUBMITTED;
496 spin_unlock_irqrestore(&crtc->dev->event_lock, flags); 496 spin_unlock_irqrestore(&crtc->dev->event_lock, flags);
@@ -525,6 +525,7 @@ static int radeon_crtc_page_flip(struct drm_crtc *crtc,
525 work->rdev = rdev; 525 work->rdev = rdev;
526 work->crtc_id = radeon_crtc->crtc_id; 526 work->crtc_id = radeon_crtc->crtc_id;
527 work->event = event; 527 work->event = event;
528 work->async = (page_flip_flags & DRM_MODE_PAGE_FLIP_ASYNC) != 0;
528 529
529 /* schedule unpin of the old buffer */ 530 /* schedule unpin of the old buffer */
530 old_radeon_fb = to_radeon_framebuffer(crtc->primary->fb); 531 old_radeon_fb = to_radeon_framebuffer(crtc->primary->fb);
@@ -1630,6 +1631,9 @@ int radeon_modeset_init(struct radeon_device *rdev)
1630 1631
1631 rdev->ddev->mode_config.funcs = &radeon_mode_funcs; 1632 rdev->ddev->mode_config.funcs = &radeon_mode_funcs;
1632 1633
1634 if (radeon_use_pflipirq == 2 && rdev->family >= CHIP_R600)
1635 rdev->ddev->mode_config.async_page_flip = true;
1636
1633 if (ASIC_IS_DCE5(rdev)) { 1637 if (ASIC_IS_DCE5(rdev)) {
1634 rdev->ddev->mode_config.max_width = 16384; 1638 rdev->ddev->mode_config.max_width = 16384;
1635 rdev->ddev->mode_config.max_height = 16384; 1639 rdev->ddev->mode_config.max_height = 16384;
diff --git a/drivers/gpu/drm/radeon/rs600.c b/drivers/gpu/drm/radeon/rs600.c
index 0051c4288725..f16af119c688 100644
--- a/drivers/gpu/drm/radeon/rs600.c
+++ b/drivers/gpu/drm/radeon/rs600.c
@@ -110,7 +110,7 @@ void avivo_wait_for_vblank(struct radeon_device *rdev, int crtc)
110 } 110 }
111} 111}
112 112
113void rs600_page_flip(struct radeon_device *rdev, int crtc_id, u64 crtc_base) 113void rs600_page_flip(struct radeon_device *rdev, int crtc_id, u64 crtc_base, bool async)
114{ 114{
115 struct radeon_crtc *radeon_crtc = rdev->mode_info.crtcs[crtc_id]; 115 struct radeon_crtc *radeon_crtc = rdev->mode_info.crtcs[crtc_id];
116 u32 tmp = RREG32(AVIVO_D1GRPH_UPDATE + radeon_crtc->crtc_offset); 116 u32 tmp = RREG32(AVIVO_D1GRPH_UPDATE + radeon_crtc->crtc_offset);
@@ -121,6 +121,8 @@ void rs600_page_flip(struct radeon_device *rdev, int crtc_id, u64 crtc_base)
121 WREG32(AVIVO_D1GRPH_UPDATE + radeon_crtc->crtc_offset, tmp); 121 WREG32(AVIVO_D1GRPH_UPDATE + radeon_crtc->crtc_offset, tmp);
122 122
123 /* update the scanout addresses */ 123 /* update the scanout addresses */
124 WREG32(AVIVO_D1GRPH_FLIP_CONTROL + radeon_crtc->crtc_offset,
125 async ? AVIVO_D1GRPH_SURFACE_UPDATE_H_RETRACE_EN : 0);
124 WREG32(AVIVO_D1GRPH_SECONDARY_SURFACE_ADDRESS + radeon_crtc->crtc_offset, 126 WREG32(AVIVO_D1GRPH_SECONDARY_SURFACE_ADDRESS + radeon_crtc->crtc_offset,
125 (u32)crtc_base); 127 (u32)crtc_base);
126 WREG32(AVIVO_D1GRPH_PRIMARY_SURFACE_ADDRESS + radeon_crtc->crtc_offset, 128 WREG32(AVIVO_D1GRPH_PRIMARY_SURFACE_ADDRESS + radeon_crtc->crtc_offset,
diff --git a/drivers/gpu/drm/radeon/rv770.c b/drivers/gpu/drm/radeon/rv770.c
index fa0b03c48227..1c120a4c3c97 100644
--- a/drivers/gpu/drm/radeon/rv770.c
+++ b/drivers/gpu/drm/radeon/rv770.c
@@ -801,7 +801,7 @@ u32 rv770_get_xclk(struct radeon_device *rdev)
801 return reference_clock; 801 return reference_clock;
802} 802}
803 803
804void rv770_page_flip(struct radeon_device *rdev, int crtc_id, u64 crtc_base) 804void rv770_page_flip(struct radeon_device *rdev, int crtc_id, u64 crtc_base, bool async)
805{ 805{
806 struct radeon_crtc *radeon_crtc = rdev->mode_info.crtcs[crtc_id]; 806 struct radeon_crtc *radeon_crtc = rdev->mode_info.crtcs[crtc_id];
807 u32 tmp = RREG32(AVIVO_D1GRPH_UPDATE + radeon_crtc->crtc_offset); 807 u32 tmp = RREG32(AVIVO_D1GRPH_UPDATE + radeon_crtc->crtc_offset);
@@ -812,6 +812,8 @@ void rv770_page_flip(struct radeon_device *rdev, int crtc_id, u64 crtc_base)
812 WREG32(AVIVO_D1GRPH_UPDATE + radeon_crtc->crtc_offset, tmp); 812 WREG32(AVIVO_D1GRPH_UPDATE + radeon_crtc->crtc_offset, tmp);
813 813
814 /* update the scanout addresses */ 814 /* update the scanout addresses */
815 WREG32(AVIVO_D1GRPH_FLIP_CONTROL + radeon_crtc->crtc_offset,
816 async ? AVIVO_D1GRPH_SURFACE_UPDATE_H_RETRACE_EN : 0);
815 if (radeon_crtc->crtc_id) { 817 if (radeon_crtc->crtc_id) {
816 WREG32(D2GRPH_SECONDARY_SURFACE_ADDRESS_HIGH, upper_32_bits(crtc_base)); 818 WREG32(D2GRPH_SECONDARY_SURFACE_ADDRESS_HIGH, upper_32_bits(crtc_base));
817 WREG32(D2GRPH_PRIMARY_SURFACE_ADDRESS_HIGH, upper_32_bits(crtc_base)); 819 WREG32(D2GRPH_PRIMARY_SURFACE_ADDRESS_HIGH, upper_32_bits(crtc_base));