|
@@ -211,46 +211,22 @@ static u32 dce_v8_0_vblank_get_counter(struct amdgpu_device *adev, int crtc)
|
|
* @crtc_id: crtc to cleanup pageflip on
|
|
* @crtc_id: crtc to cleanup pageflip on
|
|
* @crtc_base: new address of the crtc (GPU MC address)
|
|
* @crtc_base: new address of the crtc (GPU MC address)
|
|
*
|
|
*
|
|
- * Does the actual pageflip (evergreen+).
|
|
|
|
- * During vblank we take the crtc lock and wait for the update_pending
|
|
|
|
- * bit to go high, when it does, we release the lock, and allow the
|
|
|
|
- * double buffered update to take place.
|
|
|
|
- * Returns the current update pending status.
|
|
|
|
|
|
+ * Triggers the actual pageflip by updating the primary
|
|
|
|
+ * surface base address.
|
|
*/
|
|
*/
|
|
static void dce_v8_0_page_flip(struct amdgpu_device *adev,
|
|
static void dce_v8_0_page_flip(struct amdgpu_device *adev,
|
|
int crtc_id, u64 crtc_base)
|
|
int crtc_id, u64 crtc_base)
|
|
{
|
|
{
|
|
struct amdgpu_crtc *amdgpu_crtc = adev->mode_info.crtcs[crtc_id];
|
|
struct amdgpu_crtc *amdgpu_crtc = adev->mode_info.crtcs[crtc_id];
|
|
- u32 tmp = RREG32(mmGRPH_UPDATE + amdgpu_crtc->crtc_offset);
|
|
|
|
- int i;
|
|
|
|
-
|
|
|
|
- /* Lock the graphics update lock */
|
|
|
|
- tmp |= GRPH_UPDATE__GRPH_UPDATE_LOCK_MASK;
|
|
|
|
- WREG32(mmGRPH_UPDATE + amdgpu_crtc->crtc_offset, tmp);
|
|
|
|
-
|
|
|
|
- /* update the scanout addresses */
|
|
|
|
- WREG32(mmGRPH_SECONDARY_SURFACE_ADDRESS_HIGH + amdgpu_crtc->crtc_offset,
|
|
|
|
- upper_32_bits(crtc_base));
|
|
|
|
- WREG32(mmGRPH_SECONDARY_SURFACE_ADDRESS + amdgpu_crtc->crtc_offset,
|
|
|
|
- (u32)crtc_base);
|
|
|
|
|
|
|
|
|
|
+ /* update the primary scanout addresses */
|
|
WREG32(mmGRPH_PRIMARY_SURFACE_ADDRESS_HIGH + amdgpu_crtc->crtc_offset,
|
|
WREG32(mmGRPH_PRIMARY_SURFACE_ADDRESS_HIGH + amdgpu_crtc->crtc_offset,
|
|
upper_32_bits(crtc_base));
|
|
upper_32_bits(crtc_base));
|
|
|
|
+ /* writing to the low address triggers the update */
|
|
WREG32(mmGRPH_PRIMARY_SURFACE_ADDRESS + amdgpu_crtc->crtc_offset,
|
|
WREG32(mmGRPH_PRIMARY_SURFACE_ADDRESS + amdgpu_crtc->crtc_offset,
|
|
- (u32)crtc_base);
|
|
|
|
-
|
|
|
|
- /* Wait for update_pending to go high. */
|
|
|
|
- for (i = 0; i < adev->usec_timeout; i++) {
|
|
|
|
- if (RREG32(mmGRPH_UPDATE + amdgpu_crtc->crtc_offset) &
|
|
|
|
- GRPH_UPDATE__GRPH_SURFACE_UPDATE_PENDING_MASK)
|
|
|
|
- break;
|
|
|
|
- udelay(1);
|
|
|
|
- }
|
|
|
|
- DRM_DEBUG("Update pending now high. Unlocking vupdate_lock.\n");
|
|
|
|
-
|
|
|
|
- /* Unlock the lock, so double-buffering can take place inside vblank */
|
|
|
|
- tmp &= ~GRPH_UPDATE__GRPH_UPDATE_LOCK_MASK;
|
|
|
|
- WREG32(mmGRPH_UPDATE + amdgpu_crtc->crtc_offset, tmp);
|
|
|
|
|
|
+ lower_32_bits(crtc_base));
|
|
|
|
+ /* post the write */
|
|
|
|
+ RREG32(mmGRPH_PRIMARY_SURFACE_ADDRESS + amdgpu_crtc->crtc_offset);
|
|
}
|
|
}
|
|
|
|
|
|
static int dce_v8_0_crtc_get_scanoutpos(struct amdgpu_device *adev, int crtc,
|
|
static int dce_v8_0_crtc_get_scanoutpos(struct amdgpu_device *adev, int crtc,
|