Fix some more pageflipping issues -- existing code was doing MMIO writes
authorKeith Whitwell <keith@tungstengraphics.com>
Thu, 4 Jul 2002 12:03:15 +0000 (12:03 +0000)
committerKeith Whitwell <keith@tungstengraphics.com>
Thu, 4 Jul 2002 12:03:15 +0000 (12:03 +0000)
    while ring was active. There is still an MMIO read in there, but I
    haven't seen any lockups that could be attributed to it.

linux/radeon_state.c

index 163a41c..b4c5cc6 100644 (file)
@@ -1078,15 +1078,18 @@ int radeon_cp_clear( struct inode *inode, struct file *filp,
 static int radeon_do_init_pageflip( drm_device_t *dev )
 {
        drm_radeon_private_t *dev_priv = dev->dev_private;
+       RING_LOCALS;
+
        DRM_DEBUG( "%s\n", __FUNCTION__ );
 
-       dev_priv->crtc_offset =      RADEON_READ( RADEON_CRTC_OFFSET );
        dev_priv->crtc_offset_cntl = RADEON_READ( RADEON_CRTC_OFFSET_CNTL );
 
-       RADEON_WRITE( RADEON_CRTC_OFFSET, dev_priv->front_offset );
-       RADEON_WRITE( RADEON_CRTC_OFFSET_CNTL,
-                     dev_priv->crtc_offset_cntl |
-                     RADEON_CRTC_OFFSET_FLIP_CNTL );
+       BEGIN_RING( 4 );
+       RADEON_WAIT_UNTIL_3D_IDLE();
+       OUT_RING( CP_PACKET0( RADEON_CRTC_OFFSET_CNTL, 0 ) );
+       OUT_RING( dev_priv->crtc_offset_cntl | RADEON_CRTC_OFFSET_FLIP_CNTL );
+       ADVANCE_RING();
+
 
        dev_priv->page_flipping = 1;
        dev_priv->current_page = 0;
@@ -1100,13 +1103,14 @@ int radeon_do_cleanup_pageflip( drm_device_t *dev )
        drm_radeon_private_t *dev_priv = dev->dev_private;
        DRM_DEBUG( "%s\n", __FUNCTION__ );
 
-       RADEON_WRITE( RADEON_CRTC_OFFSET,      dev_priv->crtc_offset );
-       RADEON_WRITE( RADEON_CRTC_OFFSET_CNTL, dev_priv->crtc_offset_cntl );
+       if (dev_priv->current_page != 0)
+               radeon_cp_dispatch_flip( dev );
 
+       /* FIXME: If the X server changes screen resolution, it
+        * clobbers the value of RADEON_CRTC_OFFSET_CNTL, above,
+        * leading to a flashing efect.
+        */
        dev_priv->page_flipping = 0;
-       dev_priv->current_page = 0;
-       dev_priv->sarea_priv->pfCurrentPage = dev_priv->current_page;
-
        return 0;
 }