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.main
parent
ca81e1334e
commit
24025ca5f7
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue