diff options
-rw-r--r-- | shared-core/mga_dma.c | 11 | ||||
-rw-r--r-- | shared/mga_dma.c | 11 |
2 files changed, 20 insertions, 2 deletions
diff --git a/shared-core/mga_dma.c b/shared-core/mga_dma.c index a0ad70e9..3c84de63 100644 --- a/shared-core/mga_dma.c +++ b/shared-core/mga_dma.c @@ -157,9 +157,18 @@ void mga_do_dma_flush( drm_mga_private_t *dev_priv ) { drm_mga_primary_buffer_t *primary = &dev_priv->prim; u32 head, tail; - DMA_LOCALS; + u32 status = 0; + int i; + DMA_LOCALS; DRM_DEBUG( "\n" ); + /* We need to wait so that we can do an safe flush */ + for ( i = 0 ; i < dev_priv->usec_timeout ; i++ ) { + status = MGA_READ( MGA_STATUS ) & MGA_ENGINE_IDLE_MASK; + if ( status == MGA_ENDPRDMASTS ) break; + udelay( 1 ); + } + if ( primary->tail == primary->last_flush ) { DRM_DEBUG( " bailing out...\n" ); return; diff --git a/shared/mga_dma.c b/shared/mga_dma.c index a0ad70e9..3c84de63 100644 --- a/shared/mga_dma.c +++ b/shared/mga_dma.c @@ -157,9 +157,18 @@ void mga_do_dma_flush( drm_mga_private_t *dev_priv ) { drm_mga_primary_buffer_t *primary = &dev_priv->prim; u32 head, tail; - DMA_LOCALS; + u32 status = 0; + int i; + DMA_LOCALS; DRM_DEBUG( "\n" ); + /* We need to wait so that we can do an safe flush */ + for ( i = 0 ; i < dev_priv->usec_timeout ; i++ ) { + status = MGA_READ( MGA_STATUS ) & MGA_ENGINE_IDLE_MASK; + if ( status == MGA_ENDPRDMASTS ) break; + udelay( 1 ); + } + if ( primary->tail == primary->last_flush ) { DRM_DEBUG( " bailing out...\n" ); return; |