diff options
Diffstat (limited to 'drivers')
| -rw-r--r-- | drivers/gpu/drm/radeon/atombios_crtc.c | 24 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/evergreen.c | 5 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/r100.c | 2 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/radeon.h | 5 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/radeon_asic.h | 9 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/radeon_display.c | 6 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/rs600.c | 4 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/rv770.c | 4 |
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 | */ |
| 1410 | void evergreen_page_flip(struct radeon_device *rdev, int crtc_id, u64 crtc_base) | 1410 | void 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 | */ |
| 156 | void r100_page_flip(struct radeon_device *rdev, int crtc_id, u64 crtc_base) | 156 | void 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 | ||
| 751 | struct r500_irq_stat_regs { | 752 | struct 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); | |||
| 138 | extern void r100_pm_init_profile(struct radeon_device *rdev); | 138 | extern void r100_pm_init_profile(struct radeon_device *rdev); |
| 139 | extern void r100_pm_get_dynpm_state(struct radeon_device *rdev); | 139 | extern void r100_pm_get_dynpm_state(struct radeon_device *rdev); |
| 140 | extern void r100_page_flip(struct radeon_device *rdev, int crtc, | 140 | extern void r100_page_flip(struct radeon_device *rdev, int crtc, |
| 141 | u64 crtc_base); | 141 | u64 crtc_base, bool async); |
| 142 | extern bool r100_page_flip_pending(struct radeon_device *rdev, int crtc); | 142 | extern bool r100_page_flip_pending(struct radeon_device *rdev, int crtc); |
| 143 | extern void r100_wait_for_vblank(struct radeon_device *rdev, int crtc); | 143 | extern void r100_wait_for_vblank(struct radeon_device *rdev, int crtc); |
| 144 | extern int r100_mc_wait_for_idle(struct radeon_device *rdev); | 144 | extern int r100_mc_wait_for_idle(struct radeon_device *rdev); |
| @@ -250,7 +250,7 @@ extern void rs600_pm_misc(struct radeon_device *rdev); | |||
| 250 | extern void rs600_pm_prepare(struct radeon_device *rdev); | 250 | extern void rs600_pm_prepare(struct radeon_device *rdev); |
| 251 | extern void rs600_pm_finish(struct radeon_device *rdev); | 251 | extern void rs600_pm_finish(struct radeon_device *rdev); |
| 252 | extern void rs600_page_flip(struct radeon_device *rdev, int crtc, | 252 | extern void rs600_page_flip(struct radeon_device *rdev, int crtc, |
| 253 | u64 crtc_base); | 253 | u64 crtc_base, bool async); |
| 254 | extern bool rs600_page_flip_pending(struct radeon_device *rdev, int crtc); | 254 | extern bool rs600_page_flip_pending(struct radeon_device *rdev, int crtc); |
| 255 | void rs600_set_safe_registers(struct radeon_device *rdev); | 255 | void rs600_set_safe_registers(struct radeon_device *rdev); |
| 256 | extern void avivo_wait_for_vblank(struct radeon_device *rdev, int crtc); | 256 | extern void avivo_wait_for_vblank(struct radeon_device *rdev, int crtc); |
| @@ -464,7 +464,8 @@ void rv770_fini(struct radeon_device *rdev); | |||
| 464 | int rv770_suspend(struct radeon_device *rdev); | 464 | int rv770_suspend(struct radeon_device *rdev); |
| 465 | int rv770_resume(struct radeon_device *rdev); | 465 | int rv770_resume(struct radeon_device *rdev); |
| 466 | void rv770_pm_misc(struct radeon_device *rdev); | 466 | void rv770_pm_misc(struct radeon_device *rdev); |
| 467 | void rv770_page_flip(struct radeon_device *rdev, int crtc, u64 crtc_base); | 467 | void rv770_page_flip(struct radeon_device *rdev, int crtc, u64 crtc_base, |
| 468 | bool async); | ||
| 468 | bool rv770_page_flip_pending(struct radeon_device *rdev, int crtc); | 469 | bool rv770_page_flip_pending(struct radeon_device *rdev, int crtc); |
| 469 | void r700_vram_gtt_location(struct radeon_device *rdev, struct radeon_mc *mc); | 470 | void r700_vram_gtt_location(struct radeon_device *rdev, struct radeon_mc *mc); |
| 470 | void r700_cp_stop(struct radeon_device *rdev); | 471 | void r700_cp_stop(struct radeon_device *rdev); |
| @@ -534,7 +535,7 @@ extern void btc_pm_init_profile(struct radeon_device *rdev); | |||
| 534 | int sumo_set_uvd_clocks(struct radeon_device *rdev, u32 vclk, u32 dclk); | 535 | int sumo_set_uvd_clocks(struct radeon_device *rdev, u32 vclk, u32 dclk); |
| 535 | int evergreen_set_uvd_clocks(struct radeon_device *rdev, u32 vclk, u32 dclk); | 536 | int evergreen_set_uvd_clocks(struct radeon_device *rdev, u32 vclk, u32 dclk); |
| 536 | extern void evergreen_page_flip(struct radeon_device *rdev, int crtc, | 537 | extern void evergreen_page_flip(struct radeon_device *rdev, int crtc, |
| 537 | u64 crtc_base); | 538 | u64 crtc_base, bool async); |
| 538 | extern bool evergreen_page_flip_pending(struct radeon_device *rdev, int crtc); | 539 | extern bool evergreen_page_flip_pending(struct radeon_device *rdev, int crtc); |
| 539 | extern void dce4_wait_for_vblank(struct radeon_device *rdev, int crtc); | 540 | extern void dce4_wait_for_vblank(struct radeon_device *rdev, int crtc); |
| 540 | void evergreen_disable_interrupt_state(struct radeon_device *rdev); | 541 | void 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 | ||
| 113 | void rs600_page_flip(struct radeon_device *rdev, int crtc_id, u64 crtc_base) | 113 | void 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 | ||
| 804 | void rv770_page_flip(struct radeon_device *rdev, int crtc_id, u64 crtc_base) | 804 | void 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)); |
