summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlan Hourihane <alanh@fairlite.demon.co.uk>2001-03-05 16:38:22 +0000
committerAlan Hourihane <alanh@fairlite.demon.co.uk>2001-03-05 16:38:22 +0000
commit694ec100ce701619c90d3d1e0f2df2f6a386cdde (patch)
treed0815f507f39377d8aed486f4f8946b163873f78
parent4254e50a7249bc14ed148b60ac06db3306862eaa (diff)
downloaddrm-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.h2
-rw-r--r--linux-core/drm_agpsupport.c2
-rw-r--r--linux-core/drm_bufs.c1
-rw-r--r--linux-core/drm_drv.c3
-rw-r--r--linux-core/drm_memory.h2
-rw-r--r--linux/drmP.h2
-rw-r--r--linux/drm_agpsupport.h2
-rw-r--r--linux/drm_bufs.h1
-rw-r--r--linux/drm_drv.h3
-rw-r--r--linux/drm_memory.h2
-rw-r--r--linux/gamma.h22
-rw-r--r--linux/gamma_dma.c40
-rw-r--r--linux/gamma_drv.h5
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