summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--shared-core/mga_dma.c11
-rw-r--r--shared/mga_dma.c11
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;