From 24025ca5f78c15ced14490532b4410730353d2c1 Mon Sep 17 00:00:00 2001 From: Keith Whitwell Date: Thu, 4 Jul 2002 12:03:15 +0000 Subject: Fix some more pageflipping issues -- existing code was doing MMIO writes 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 | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) (limited to 'linux') diff --git a/linux/radeon_state.c b/linux/radeon_state.c index 163a41cb..b4c5cc63 100644 --- a/linux/radeon_state.c +++ b/linux/radeon_state.c @@ -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; } -- cgit v1.2.3