diff options
author | Alan Hourihane <alanh@fairlite.demon.co.uk> | 2001-03-05 16:38:22 +0000 |
---|---|---|
committer | Alan Hourihane <alanh@fairlite.demon.co.uk> | 2001-03-05 16:38:22 +0000 |
commit | 694ec100ce701619c90d3d1e0f2df2f6a386cdde (patch) | |
tree | d0815f507f39377d8aed486f4f8946b163873f78 | |
parent | 4254e50a7249bc14ed148b60ac06db3306862eaa (diff) | |
download | drm-694ec100ce701619c90d3d1e0f2df2f6a386cdde.tar.gz |
Allow gamma to use AGP or PCI DMA buffers (AGP not functional) Switch gamma
driver to Queued DMA mode. merge recent trunk changes.
-rw-r--r-- | linux-core/drmP.h | 2 | ||||
-rw-r--r-- | linux-core/drm_agpsupport.c | 2 | ||||
-rw-r--r-- | linux-core/drm_bufs.c | 1 | ||||
-rw-r--r-- | linux-core/drm_drv.c | 3 | ||||
-rw-r--r-- | linux-core/drm_memory.h | 2 | ||||
-rw-r--r-- | linux/drmP.h | 2 | ||||
-rw-r--r-- | linux/drm_agpsupport.h | 2 | ||||
-rw-r--r-- | linux/drm_bufs.h | 1 | ||||
-rw-r--r-- | linux/drm_drv.h | 3 | ||||
-rw-r--r-- | linux/drm_memory.h | 2 | ||||
-rw-r--r-- | linux/gamma.h | 22 | ||||
-rw-r--r-- | linux/gamma_dma.c | 40 | ||||
-rw-r--r-- | linux/gamma_drv.h | 5 |
13 files changed, 57 insertions, 30 deletions
diff --git a/linux-core/drmP.h b/linux-core/drmP.h index e15fabc8..694fcb73 100644 --- a/linux-core/drmP.h +++ b/linux-core/drmP.h @@ -300,7 +300,7 @@ static inline unsigned long __cmpxchg(volatile void *ptr, unsigned long old, #if DRM_DEBUG_CODE #define DRM_DEBUG(fmt, arg...) \ do { \ - if (1 /* DRM(flags) & DRM_FLAG_DEBUG*/ ) \ + if (DRM(flags) & DRM_FLAG_DEBUG) \ printk(KERN_DEBUG \ "[" DRM_NAME ":" __FUNCTION__ "] " fmt , \ ##arg); \ diff --git a/linux-core/drm_agpsupport.c b/linux-core/drm_agpsupport.c index b070a59e..dfd0d8fc 100644 --- a/linux-core/drm_agpsupport.c +++ b/linux-core/drm_agpsupport.c @@ -77,7 +77,7 @@ int DRM(agp_acquire)(struct inode *inode, struct file *filp, drm_device_t *dev = priv->dev; int retcode; - if (dev->agp->acquired || !drm_agp->acquire) return -EINVAL; + if (!dev->agp|| dev->agp->acquired || !drm_agp->acquire) return -EINVAL; if ((retcode = drm_agp->acquire())) return retcode; dev->agp->acquired = 1; return 0; diff --git a/linux-core/drm_bufs.c b/linux-core/drm_bufs.c index 38ea1ff0..4ba68a0e 100644 --- a/linux-core/drm_bufs.c +++ b/linux-core/drm_bufs.c @@ -128,6 +128,7 @@ int DRM(addmap)( struct inode *inode, struct file *filp, #if __REALLY_HAVE_AGP case _DRM_AGP: map->offset = map->offset + dev->agp->base; + map->mtrr = dev->agp->agp_mtrr; /* for getmap */ break; #endif default: diff --git a/linux-core/drm_drv.c b/linux-core/drm_drv.c index 71f52276..d8a7d992 100644 --- a/linux-core/drm_drv.c +++ b/linux-core/drm_drv.c @@ -482,7 +482,8 @@ static int __init drm_init( void ) } #endif #if __REALLY_HAVE_MTRR - dev->agp->agp_mtrr = mtrr_add( dev->agp->agp_info.aper_base, + if (dev->agp) + dev->agp->agp_mtrr = mtrr_add( dev->agp->agp_info.aper_base, dev->agp->agp_info.aper_size*1024*1024, MTRR_TYPE_WRCOMB, 1 ); diff --git a/linux-core/drm_memory.h b/linux-core/drm_memory.h index caf05394..e9d3a734 100644 --- a/linux-core/drm_memory.h +++ b/linux-core/drm_memory.h @@ -352,7 +352,6 @@ void DRM(ioremapfree)(void *pt, unsigned long size) } #if defined(CONFIG_AGP) || defined(CONFIG_AGP_MODULE) -#if __MUST_HAVE_AGP agp_memory *DRM(alloc_agp)(int pages, u32 type) { @@ -456,5 +455,4 @@ int DRM(unbind_agp)(agp_memory *handle) } return retcode; } -#endif #endif /* defined(CONFIG_AGP) || defined(CONFIG_AGP_MODULE) */ diff --git a/linux/drmP.h b/linux/drmP.h index e15fabc8..694fcb73 100644 --- a/linux/drmP.h +++ b/linux/drmP.h @@ -300,7 +300,7 @@ static inline unsigned long __cmpxchg(volatile void *ptr, unsigned long old, #if DRM_DEBUG_CODE #define DRM_DEBUG(fmt, arg...) \ do { \ - if (1 /* DRM(flags) & DRM_FLAG_DEBUG*/ ) \ + if (DRM(flags) & DRM_FLAG_DEBUG) \ printk(KERN_DEBUG \ "[" DRM_NAME ":" __FUNCTION__ "] " fmt , \ ##arg); \ diff --git a/linux/drm_agpsupport.h b/linux/drm_agpsupport.h index b070a59e..dfd0d8fc 100644 --- a/linux/drm_agpsupport.h +++ b/linux/drm_agpsupport.h @@ -77,7 +77,7 @@ int DRM(agp_acquire)(struct inode *inode, struct file *filp, drm_device_t *dev = priv->dev; int retcode; - if (dev->agp->acquired || !drm_agp->acquire) return -EINVAL; + if (!dev->agp|| dev->agp->acquired || !drm_agp->acquire) return -EINVAL; if ((retcode = drm_agp->acquire())) return retcode; dev->agp->acquired = 1; return 0; diff --git a/linux/drm_bufs.h b/linux/drm_bufs.h index 38ea1ff0..4ba68a0e 100644 --- a/linux/drm_bufs.h +++ b/linux/drm_bufs.h @@ -128,6 +128,7 @@ int DRM(addmap)( struct inode *inode, struct file *filp, #if __REALLY_HAVE_AGP case _DRM_AGP: map->offset = map->offset + dev->agp->base; + map->mtrr = dev->agp->agp_mtrr; /* for getmap */ break; #endif default: diff --git a/linux/drm_drv.h b/linux/drm_drv.h index 71f52276..d8a7d992 100644 --- a/linux/drm_drv.h +++ b/linux/drm_drv.h @@ -482,7 +482,8 @@ static int __init drm_init( void ) } #endif #if __REALLY_HAVE_MTRR - dev->agp->agp_mtrr = mtrr_add( dev->agp->agp_info.aper_base, + if (dev->agp) + dev->agp->agp_mtrr = mtrr_add( dev->agp->agp_info.aper_base, dev->agp->agp_info.aper_size*1024*1024, MTRR_TYPE_WRCOMB, 1 ); diff --git a/linux/drm_memory.h b/linux/drm_memory.h index caf05394..e9d3a734 100644 --- a/linux/drm_memory.h +++ b/linux/drm_memory.h @@ -352,7 +352,6 @@ void DRM(ioremapfree)(void *pt, unsigned long size) } #if defined(CONFIG_AGP) || defined(CONFIG_AGP_MODULE) -#if __MUST_HAVE_AGP agp_memory *DRM(alloc_agp)(int pages, u32 type) { @@ -456,5 +455,4 @@ int DRM(unbind_agp)(agp_memory *handle) } return retcode; } -#endif #endif /* defined(CONFIG_AGP) || defined(CONFIG_AGP_MODULE) */ diff --git a/linux/gamma.h b/linux/gamma.h index 1f184ef1..136bab06 100644 --- a/linux/gamma.h +++ b/linux/gamma.h @@ -42,9 +42,9 @@ */ #define __HAVE_DMA 1 #define __HAVE_AGP 1 -#define __MUST_HAVE_AGP 1 +#define __MUST_HAVE_AGP 0 #define __HAVE_OLD_DMA 1 -#define __HAVE_PCI_DMA 0 +#define __HAVE_PCI_DMA 1 #define __HAVE_MULTIPLE_DMA_QUEUES 1 #define __HAVE_DMA_WAITQUEUE 1 @@ -69,16 +69,28 @@ #define __HAVE_DMA_IRQ 1 #define __HAVE_DMA_IRQ_BH 1 + +#if 0 #define DRIVER_PREINSTALL() do { \ - GAMMA_WRITE( GAMMA_GCOMMANDMODE, 0x00000000 ); \ - GAMMA_WRITE( GAMMA_GDMACONTROL, 0x00000000 ); \ + GAMMA_WRITE( GAMMA_GCOMMANDMODE, 0x00000000 );\ + GAMMA_WRITE( GAMMA_GDMACONTROL, 0x00000000 );\ } while (0) - #define DRIVER_POSTINSTALL() do { \ GAMMA_WRITE( GAMMA_GINTENABLE, 0x00002001 ); \ GAMMA_WRITE( GAMMA_COMMANDINTENABLE, 0x00000008 ); \ GAMMA_WRITE( GAMMA_GDELAYTIMER, 0x00039090 ); \ } while (0) +#else +#define DRIVER_POSTINSTALL() do { \ + GAMMA_WRITE( GAMMA_GINTENABLE, 0x00002000 ); \ + GAMMA_WRITE( GAMMA_COMMANDINTENABLE, 0x00000004 ); \ +} while (0) + +#define DRIVER_PREINSTALL() do { \ + GAMMA_WRITE( GAMMA_GCOMMANDMODE, GAMMA_QUEUED_DMA_MODE );\ + GAMMA_WRITE( GAMMA_GDMACONTROL, 0x00000000 );\ +} while (0) +#endif #define DRIVER_UNINSTALL() do { \ GAMMA_WRITE( GAMMA_GDELAYTIMER, 0x00000000 ); \ diff --git a/linux/gamma_dma.c b/linux/gamma_dma.c index eb394b2c..77813011 100644 --- a/linux/gamma_dma.c +++ b/linux/gamma_dma.c @@ -38,23 +38,28 @@ #include <linux/delay.h> #define OLDDMA 1 +#define QUEUED_DMA 1 static inline void gamma_dma_dispatch(drm_device_t *dev, unsigned long address, unsigned long length) { -#if OLDDMA +#if !QUEUED_DMA GAMMA_WRITE(GAMMA_DMAADDRESS, virt_to_phys((void *)address)); - while (GAMMA_READ(GAMMA_GCOMMANDSTATUS) != 4); - GAMMA_WRITE(GAMMA_DMACOUNT, length / 4); #else - while (GAMMA_READ(GAMMA_INFIFOSPACE) < 4); - + mb(); + while ( GAMMA_READ(GAMMA_INFIFOSPACE) < 6); GAMMA_WRITE(GAMMA_OUTPUTFIFO, GAMMA_DMAADDRTAG); - GAMMA_WRITE(GAMMA_OUTPUTFIFO, virt_to_phys((void *)address)); - GAMMA_WRITE(GAMMA_OUTPUTFIFO, GAMMA_DMACOUNTTAG); - GAMMA_WRITE(GAMMA_OUTPUTFIFO, length / 4); + if (!dev->agp) { + GAMMA_WRITE(GAMMA_OUTPUTFIFO+4, virt_to_phys((void*)address)); + } else { + GAMMA_WRITE(GAMMA_OUTPUTFIFO+4, address); + } + GAMMA_WRITE(GAMMA_OUTPUTFIFO+8, GAMMA_DMACOUNTTAG); + GAMMA_WRITE(GAMMA_OUTPUTFIFO+12, length / 4); + GAMMA_WRITE(GAMMA_OUTPUTFIFO+16, GAMMA_COMMANDINTTAG); + GAMMA_WRITE(GAMMA_OUTPUTFIFO+20, 1); /* PAUSE DMA UNTIL COMPLETE */ #endif } @@ -80,7 +85,6 @@ void gamma_dma_quiescent_dual(drm_device_t *dev) while (GAMMA_READ(GAMMA_INFIFOSPACE) < 3); GAMMA_WRITE(GAMMA_BROADCASTMASK, 3); - GAMMA_WRITE(GAMMA_FILTERMODE, 1 << 10); GAMMA_WRITE(GAMMA_SYNC, 0); @@ -95,17 +99,21 @@ void gamma_dma_quiescent_dual(drm_device_t *dev) } while (GAMMA_READ(GAMMA_OUTPUTFIFO + 0x10000) != GAMMA_SYNC_TAG); } -#if OLDDMA void gamma_dma_ready(drm_device_t *dev) { +#if !QUEUED_DMA while (GAMMA_READ(GAMMA_DMACOUNT)); +#endif } static inline int gamma_dma_is_ready(drm_device_t *dev) { - return !GAMMA_READ(GAMMA_DMACOUNT); -} +#if !QUEUED_DMA!QUEUED_DMA!QUEUED_DMA!QUEUED_DMA!QUEUED_DMA!QUEUED_DMA!QUEUED_DMA!QUEUED_DMA + return(!GAMMA_READ(GAMMA_DMACOUNT)); +#else + return(GAMMA_READ(GAMMA_GCOMMANDSTATUS) & 0x04); #endif +} void gamma_dma_service(int irq, void *device, struct pt_regs *regs) { @@ -114,10 +122,14 @@ void gamma_dma_service(int irq, void *device, struct pt_regs *regs) atomic_inc(&dev->counts[6]); /* _DRM_STAT_IRQ */ -#if OLDDMA +#if !QUEUED_DMA GAMMA_WRITE(GAMMA_GDELAYTIMER, 0xc350/2); /* 0x05S */ GAMMA_WRITE(GAMMA_GCOMMANDINTFLAGS, 8); GAMMA_WRITE(GAMMA_GINTFLAGS, 0x2001); +#else + GAMMA_WRITE(GAMMA_GCOMMANDINTFLAGS, 4); + GAMMA_WRITE(GAMMA_GINTFLAGS, 0x2000); +#endif if (gamma_dma_is_ready(dev)) { /* Free previous buffer */ if (test_and_set_bit(0, &dev->dma_flag)) return; @@ -131,7 +143,6 @@ void gamma_dma_service(int irq, void *device, struct pt_regs *regs) queue_task(&dev->tq, &tq_immediate); mark_bh(IMMEDIATE_BH); } -#endif } /* Only called by gamma_dma_schedule. */ @@ -647,6 +658,7 @@ static int gamma_do_init_dma( drm_device_t *dev, drm_gamma_init_t *init ) #endif DRM_IOREMAP( dev_priv->buffers ); + GAMMA_WRITE( GAMMA_GDMACONTROL, GAMMA_USE_AGP ); #if 0 dev_priv->prim.status = (u32 *)dev_priv->status->handle; diff --git a/linux/gamma_drv.h b/linux/gamma_drv.h index 627cdf41..8d4a2b5a 100644 --- a/linux/gamma_drv.h +++ b/linux/gamma_drv.h @@ -32,7 +32,6 @@ #ifndef _GAMMA_DRV_H_ #define _GAMMA_DRV_H_ - typedef struct drm_gamma_private { drm_gamma_sarea_t *sarea_priv; drm_map_t *sarea; @@ -97,9 +96,11 @@ extern int gamma_found(void); #define GAMMA_FILTERMODE 0x8c00 #define GAMMA_GCOMMANDINTFLAGS 0x0c50 #define GAMMA_GCOMMANDMODE 0x0c40 +#define GAMMA_QUEUED_DMA_MODE 1<<1 #define GAMMA_GCOMMANDSTATUS 0x0c60 #define GAMMA_GDELAYTIMER 0x0c38 #define GAMMA_GDMACONTROL 0x0060 +#define GAMMA_USE_AGP 1<<1 #define GAMMA_GINTENABLE 0x0808 #define GAMMA_GINTFLAGS 0x0810 #define GAMMA_INFIFOSPACE 0x0018 @@ -108,7 +109,9 @@ extern int gamma_found(void); #define GAMMA_SYNC 0x8c40 #define GAMMA_SYNC_TAG 0x0188 +#define GAMMA_PASSTHROUGH 0x1FE #define GAMMA_DMAADDRTAG 0x530 #define GAMMA_DMACOUNTTAG 0x531 +#define GAMMA_COMMANDINTTAG 0x532 #endif |