diff options
-rw-r--r-- | linux-core/r128_drv.c | 8 | ||||
-rw-r--r-- | linux/r128_bufs.c | 5 | ||||
-rw-r--r-- | linux/r128_drv.c | 8 | ||||
-rw-r--r-- | linux/r128_drv.h | 15 | ||||
-rw-r--r-- | linux/r128_state.c | 11 |
5 files changed, 20 insertions, 27 deletions
diff --git a/linux-core/r128_drv.c b/linux-core/r128_drv.c index 62185b58..cd5c0e88 100644 --- a/linux-core/r128_drv.c +++ b/linux-core/r128_drv.c @@ -37,7 +37,7 @@ #define R128_NAME "r128" #define R128_DESC "ATI Rage 128" -#define R128_DATE "20010125" +#define R128_DATE "20010130" #define R128_MAJOR 2 #define R128_MINOR 1 #define R128_PATCHLEVEL 4 @@ -563,12 +563,6 @@ int r128_ioctl(struct inode *inode, struct file *filp, } } -#if 0 - if ( retcode ) { - DRM_INFO( "%s 0x%x ret = %d\n", __FUNCTION__, nr, retcode ); - } -#endif - atomic_dec(&dev->ioctl_count); return retcode; } diff --git a/linux/r128_bufs.c b/linux/r128_bufs.c index a060749e..3c549e16 100644 --- a/linux/r128_bufs.c +++ b/linux/r128_bufs.c @@ -74,7 +74,7 @@ int r128_addbufs_agp(struct inode *inode, struct file *filp, unsigned int cmd, total = PAGE_SIZE << page_order; byte_count = 0; - agp_offset = dev->agp->base + request.agp_start; + agp_offset = request.agp_start; DRM_DEBUG("count: %d\n", count); DRM_DEBUG("order: %d\n", order); @@ -125,7 +125,8 @@ int r128_addbufs_agp(struct inode *inode, struct file *filp, unsigned int cmd, buf->order = order; buf->used = 0; buf->offset = (dma->byte_count + offset); - buf->address = (void *)(agp_offset + offset); + buf->bus_address = agp_offset + offset; + buf->address = (void *)(agp_offset + offset + dev->agp->base); buf->next = NULL; buf->waiting = 0; buf->pending = 0; diff --git a/linux/r128_drv.c b/linux/r128_drv.c index 62185b58..cd5c0e88 100644 --- a/linux/r128_drv.c +++ b/linux/r128_drv.c @@ -37,7 +37,7 @@ #define R128_NAME "r128" #define R128_DESC "ATI Rage 128" -#define R128_DATE "20010125" +#define R128_DATE "20010130" #define R128_MAJOR 2 #define R128_MINOR 1 #define R128_PATCHLEVEL 4 @@ -563,12 +563,6 @@ int r128_ioctl(struct inode *inode, struct file *filp, } } -#if 0 - if ( retcode ) { - DRM_INFO( "%s 0x%x ret = %d\n", __FUNCTION__, nr, retcode ); - } -#endif - atomic_dec(&dev->ioctl_count); return retcode; } diff --git a/linux/r128_drv.h b/linux/r128_drv.h index c5cd2181..0b2e9259 100644 --- a/linux/r128_drv.h +++ b/linux/r128_drv.h @@ -289,6 +289,8 @@ extern int r128_context_switch_complete(drm_device_t *dev, int new); #define R128_TEX_CNTL_C 0x1c9c # define R128_TEX_CACHE_FLUSH (1 << 23) +#define R128_WAIT_UNTIL 0x1720 +# define R128_EVENT_CRTC_OFFSET (1 << 0) #define R128_WINDOW_XY_OFFSET 0x1bcc @@ -398,6 +400,8 @@ extern int r128_context_switch_complete(drm_device_t *dev, int new); #define R128_RING_HIGH_MARK 128 +#define R128_PERFORMANCE_BOXES 0 + #define R128_BASE(reg) ((u32)(dev_priv->mmio->handle)) #define R128_ADDR(reg) (R128_BASE(reg) + reg) @@ -410,6 +414,7 @@ extern int r128_context_switch_complete(drm_device_t *dev, int new); #define R128_READ8(reg) R128_DEREF8(reg) #define R128_WRITE8(reg,val) do { R128_DEREF8(reg) = val; } while (0) + #define R128_WRITE_PLL(addr,val) \ do { \ R128_WRITE8(R128_CLOCK_CNTL_INDEX, ((addr) & 0x1f) | R128_PLL_WR_EN); \ @@ -428,8 +433,6 @@ extern int R128_READ_PLL(drm_device_t *dev, int addr); (pkt) | ((n) << 16)) - - /* ================================================================ * Misc helper macros */ @@ -473,6 +476,12 @@ do { \ } \ } while (0) +#define R128_WAIT_UNTIL_PAGE_FLIPPED() \ +do { \ + OUT_RING( CCE_PACKET0( R128_WAIT_UNTIL, 0 ) ); \ + OUT_RING( R128_EVENT_CRTC_OFFSET ); \ +} while (0) + /* ================================================================ * Ring control @@ -518,6 +527,4 @@ do { \ write &= tail_mask; \ } while (0) -#define R128_PERFORMANCE_BOXES 0 - #endif /* __R128_DRV_H__ */ diff --git a/linux/r128_state.c b/linux/r128_state.c index 60bddd8a..badf87ef 100644 --- a/linux/r128_state.c +++ b/linux/r128_state.c @@ -543,8 +543,9 @@ static void r128_cce_dispatch_flip( drm_device_t *dev ) r128_cce_performance_boxes( dev_priv ); #endif - BEGIN_RING( 2 ); + BEGIN_RING( 4 ); + R128_WAIT_UNTIL_PAGE_FLIPPED(); OUT_RING( CCE_PACKET0( R128_CRTC_OFFSET, 0 ) ); if ( dev_priv->current_page == 0 ) { @@ -578,7 +579,7 @@ static void r128_cce_dispatch_vertex( drm_device_t *dev, drm_r128_buf_priv_t *buf_priv = buf->dev_private; drm_r128_sarea_t *sarea_priv = dev_priv->sarea_priv; int format = sarea_priv->vc_format; - int offset = dev_priv->buffers->offset + buf->offset - dev->agp->base; + int offset = buf->bus_address; int size = buf->used; int prim = buf_priv->prim; int i = 0; @@ -645,9 +646,6 @@ static void r128_cce_dispatch_vertex( drm_device_t *dev, sarea_priv->nbox = 0; } - - - static void r128_cce_dispatch_indirect( drm_device_t *dev, drm_buf_t *buf, int start, int end ) @@ -661,8 +659,7 @@ static void r128_cce_dispatch_indirect( drm_device_t *dev, r128_update_ring_snapshot( dev_priv ); if ( start != end ) { - int offset = (dev_priv->buffers->offset - dev->agp->base - + buf->offset + start); + int offset = buf->bus_address + start; int dwords = (end - start + 3) / sizeof(u32); /* Indirect buffer data must be an even number of |