From 97bee70a1a9be20058687d625ae94504936a6edc Mon Sep 17 00:00:00 2001 From: Brian Paul Date: Tue, 15 Oct 2002 19:01:22 +0000 Subject: [PATCH] merge from trunk --- bsd-core/drm_os_freebsd.h | 2 +- bsd/drm_os_freebsd.h | 2 +- shared-core/mga_dma.c | 11 ++++++++++- shared/mga_dma.c | 11 ++++++++++- 4 files changed, 22 insertions(+), 4 deletions(-) diff --git a/bsd-core/drm_os_freebsd.h b/bsd-core/drm_os_freebsd.h index 1206b25f..ff2a6460 100644 --- a/bsd-core/drm_os_freebsd.h +++ b/bsd-core/drm_os_freebsd.h @@ -142,7 +142,7 @@ do { \ #define DRM_HZ hz #define DRM_WAIT_ON( ret, queue, timeout, condition ) \ -while (condition) { \ +while (!condition) { \ ret = tsleep( &(queue), PZERO | PCATCH, "drmwtq", (timeout) ); \ if ( ret ) \ return ret; \ diff --git a/bsd/drm_os_freebsd.h b/bsd/drm_os_freebsd.h index 1206b25f..ff2a6460 100644 --- a/bsd/drm_os_freebsd.h +++ b/bsd/drm_os_freebsd.h @@ -142,7 +142,7 @@ do { \ #define DRM_HZ hz #define DRM_WAIT_ON( ret, queue, timeout, condition ) \ -while (condition) { \ +while (!condition) { \ ret = tsleep( &(queue), PZERO | PCATCH, "drmwtq", (timeout) ); \ if ( ret ) \ return ret; \ 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;