Commit eaa8fe26 authored by Linus Torvalds's avatar Linus Torvalds

Merge bk://drm.bkbits.net/drm-fntbl

into ppc970.osdl.org:/home/torvalds/v2.6/linux
parents 06a5ce0e 1b9b2569
...@@ -24,7 +24,7 @@ config DRM_TDFX ...@@ -24,7 +24,7 @@ config DRM_TDFX
config DRM_GAMMA config DRM_GAMMA
tristate "3dlabs GMX 2000" tristate "3dlabs GMX 2000"
depends on DRM depends on DRM && BROKEN
help help
This is the old gamma driver, please tell me if it might actually This is the old gamma driver, please tell me if it might actually
work. work.
......
...@@ -95,12 +95,6 @@ ...@@ -95,12 +95,6 @@
#ifndef __HAVE_IRQ #ifndef __HAVE_IRQ
#define __HAVE_IRQ 0 #define __HAVE_IRQ 0
#endif #endif
#ifndef __HAVE_DMA_WAITLIST
#define __HAVE_DMA_WAITLIST 0
#endif
#ifndef __HAVE_DMA_FREELIST
#define __HAVE_DMA_FREELIST 0
#endif
#define __REALLY_HAVE_AGP (__HAVE_AGP && (defined(CONFIG_AGP) || \ #define __REALLY_HAVE_AGP (__HAVE_AGP && (defined(CONFIG_AGP) || \
defined(CONFIG_AGP_MODULE))) defined(CONFIG_AGP_MODULE)))
...@@ -265,54 +259,6 @@ static inline struct page * vmalloc_to_page(void * vmalloc_addr) ...@@ -265,54 +259,6 @@ static inline struct page * vmalloc_to_page(void * vmalloc_addr)
/*@}*/ /*@}*/
/***********************************************************************/
/** \name Mapping helper macros */
/*@{*/
#define DRM_IOREMAP(map, dev) \
(map)->handle = DRM(ioremap)( (map)->offset, (map)->size, (dev) )
#define DRM_IOREMAP_NOCACHE(map, dev) \
(map)->handle = DRM(ioremap_nocache)((map)->offset, (map)->size, (dev))
#define DRM_IOREMAPFREE(map, dev) \
do { \
if ( (map)->handle && (map)->size ) \
DRM(ioremapfree)( (map)->handle, (map)->size, (dev) ); \
} while (0)
/**
* Find mapping.
*
* \param _map matching mapping if found, untouched otherwise.
* \param _o offset.
*
* Expects the existence of a local variable named \p dev pointing to the
* drm_device structure.
*/
#define DRM_FIND_MAP(_map, _o) \
do { \
struct list_head *_list; \
list_for_each( _list, &dev->maplist->head ) { \
drm_map_list_t *_entry = list_entry( _list, drm_map_list_t, head ); \
if ( _entry->map && \
_entry->map->offset == (_o) ) { \
(_map) = _entry->map; \
break; \
} \
} \
} while(0)
/**
* Drop mapping.
*
* \sa #DRM_FIND_MAP.
*/
#define DRM_DROP_MAP(_map)
/*@}*/
/***********************************************************************/ /***********************************************************************/
/** \name Internal types and structures */ /** \name Internal types and structures */
/*@{*/ /*@{*/
...@@ -610,6 +556,28 @@ typedef struct drm_vbl_sig { ...@@ -610,6 +556,28 @@ typedef struct drm_vbl_sig {
#endif #endif
/**
* DRM device functions structure
*/
struct drm_device;
struct drm_driver_fn {
int (*preinit)(struct drm_device *);
int (*postinit)(struct drm_device *);
void (*prerelease)(struct drm_device *, struct file *filp);
void (*pretakedown)(struct drm_device *);
int (*postcleanup)(struct drm_device *);
int (*presetup)(struct drm_device *);
int (*postsetup)(struct drm_device *);
void (*open_helper)(struct drm_device *, drm_file_t *);
void (*release)(struct drm_device *, struct file *filp);
void (*dma_ready)(struct drm_device *);
int (*dma_quiescent)(struct drm_device *);
int (*context_ctor)(struct drm_device *dev, int context);
int (*context_dtor)(struct drm_device *dev, int context);
int (*kernel_context_switch)(struct drm_device *dev, int old, int new);
int (*kernel_context_switch_unlock)(struct drm_device *dev);
};
/** /**
* DRM device structure. * DRM device structure.
*/ */
...@@ -738,8 +706,13 @@ typedef struct drm_device { ...@@ -738,8 +706,13 @@ typedef struct drm_device {
void *dev_private; /**< device private data */ void *dev_private; /**< device private data */
drm_sigdata_t sigdata; /**< For block_all_signals */ drm_sigdata_t sigdata; /**< For block_all_signals */
sigset_t sigmask; sigset_t sigmask;
struct drm_driver_fn fn_tbl;
drm_local_map_t *agp_buffer_map;
int dev_priv_size;
} drm_device_t; } drm_device_t;
extern void DRM(driver_register_fns)(struct drm_device *dev);
/******************************************************************/ /******************************************************************/
/** \name Internal function definitions */ /** \name Internal function definitions */
...@@ -986,6 +959,40 @@ extern int DRM(ati_pcigart_cleanup)(drm_device_t *dev, ...@@ -986,6 +959,40 @@ extern int DRM(ati_pcigart_cleanup)(drm_device_t *dev,
unsigned long addr, unsigned long addr,
dma_addr_t bus_addr); dma_addr_t bus_addr);
/* Inline replacements for DRM_IOREMAP macros */
static __inline__ void drm_core_ioremap(struct drm_map *map, struct drm_device *dev)
{
map->handle = DRM(ioremap)( map->offset, map->size, dev );
}
static __inline__ void drm_core_ioremap_nocache(struct drm_map *map, struct drm_device *dev)
{
map->handle = DRM(ioremap_nocache)(map->offset, map->size, dev);
}
static __inline__ void drm_core_ioremapfree(struct drm_map *map, struct drm_device *dev)
{
if ( map->handle && map->size )
DRM(ioremapfree)( map->handle, map->size, dev );
}
static __inline__ struct drm_map *drm_core_findmap(struct drm_device *dev, unsigned long offset)
{
struct list_head *_list;
list_for_each( _list, &dev->maplist->head ) {
drm_map_list_t *_entry = list_entry( _list, drm_map_list_t, head );
if ( _entry->map &&
_entry->map->offset == offset ) {
return _entry->map;
}
}
return NULL;
}
static __inline__ void drm_core_dropmap(struct drm_map *map)
{
}
/*@}*/ /*@}*/
#endif /* __KERNEL__ */ #endif /* __KERNEL__ */
......
...@@ -44,18 +44,6 @@ ...@@ -44,18 +44,6 @@
#define __HAVE_SG 0 #define __HAVE_SG 0
#endif #endif
#ifndef DRIVER_BUF_PRIV_T
#define DRIVER_BUF_PRIV_T u32
#endif
#ifndef DRIVER_AGP_BUFFERS_MAP
#if __HAVE_AGP && __HAVE_DMA
#error "You must define DRIVER_AGP_BUFFERS_MAP()"
#else
#define DRIVER_AGP_BUFFERS_MAP( dev ) NULL
#endif
#endif
/** /**
* Compute size order. Returns the exponent of the smaller power of two which * Compute size order. Returns the exponent of the smaller power of two which
* is greater or equal to given number. * is greater or equal to given number.
...@@ -348,10 +336,6 @@ static void DRM(cleanup_buf_error)(drm_buf_entry_t *entry) ...@@ -348,10 +336,6 @@ static void DRM(cleanup_buf_error)(drm_buf_entry_t *entry)
sizeof(*entry->buflist), sizeof(*entry->buflist),
DRM_MEM_BUFS); DRM_MEM_BUFS);
#if __HAVE_DMA_FREELIST
DRM(freelist_destroy)(&entry->freelist);
#endif
entry->buf_count = 0; entry->buf_count = 0;
} }
} }
...@@ -473,8 +457,8 @@ int DRM(addbufs_agp)( struct inode *inode, struct file *filp, ...@@ -473,8 +457,8 @@ int DRM(addbufs_agp)( struct inode *inode, struct file *filp,
init_waitqueue_head( &buf->dma_wait ); init_waitqueue_head( &buf->dma_wait );
buf->filp = NULL; buf->filp = NULL;
buf->dev_priv_size = sizeof(DRIVER_BUF_PRIV_T); buf->dev_priv_size = dev->dev_priv_size;
buf->dev_private = DRM(alloc)( sizeof(DRIVER_BUF_PRIV_T), buf->dev_private = DRM(alloc)( buf->dev_priv_size,
DRM_MEM_BUFS ); DRM_MEM_BUFS );
if(!buf->dev_private) { if(!buf->dev_private) {
/* Set count correctly so we free the proper amount. */ /* Set count correctly so we free the proper amount. */
...@@ -520,12 +504,6 @@ int DRM(addbufs_agp)( struct inode *inode, struct file *filp, ...@@ -520,12 +504,6 @@ int DRM(addbufs_agp)( struct inode *inode, struct file *filp,
DRM_DEBUG( "dma->buf_count : %d\n", dma->buf_count ); DRM_DEBUG( "dma->buf_count : %d\n", dma->buf_count );
DRM_DEBUG( "entry->buf_count : %d\n", entry->buf_count ); DRM_DEBUG( "entry->buf_count : %d\n", entry->buf_count );
#if __HAVE_DMA_FREELIST
DRM(freelist_create)( &entry->freelist, entry->buf_count );
for ( i = 0 ; i < entry->buf_count ; i++ ) {
DRM(freelist_put)( dev, &entry->freelist, &entry->buflist[i] );
}
#endif
up( &dev->struct_sem ); up( &dev->struct_sem );
request.count = entry->buf_count; request.count = entry->buf_count;
...@@ -698,8 +676,8 @@ int DRM(addbufs_pci)( struct inode *inode, struct file *filp, ...@@ -698,8 +676,8 @@ int DRM(addbufs_pci)( struct inode *inode, struct file *filp,
init_waitqueue_head( &buf->dma_wait ); init_waitqueue_head( &buf->dma_wait );
buf->filp = NULL; buf->filp = NULL;
buf->dev_priv_size = sizeof(DRIVER_BUF_PRIV_T); buf->dev_priv_size = dev->dev_priv_size;
buf->dev_private = DRM(alloc)( sizeof(DRIVER_BUF_PRIV_T), buf->dev_private = DRM(alloc)( dev->dev_priv_size,
DRM_MEM_BUFS ); DRM_MEM_BUFS );
if(!buf->dev_private) { if(!buf->dev_private) {
/* Set count correctly so we free the proper amount. */ /* Set count correctly so we free the proper amount. */
...@@ -759,12 +737,6 @@ int DRM(addbufs_pci)( struct inode *inode, struct file *filp, ...@@ -759,12 +737,6 @@ int DRM(addbufs_pci)( struct inode *inode, struct file *filp,
dma->page_count += entry->seg_count << page_order; dma->page_count += entry->seg_count << page_order;
dma->byte_count += PAGE_SIZE * (entry->seg_count << page_order); dma->byte_count += PAGE_SIZE * (entry->seg_count << page_order);
#if __HAVE_DMA_FREELIST
DRM(freelist_create)( &entry->freelist, entry->buf_count );
for ( i = 0 ; i < entry->buf_count ; i++ ) {
DRM(freelist_put)( dev, &entry->freelist, &entry->buflist[i] );
}
#endif
up( &dev->struct_sem ); up( &dev->struct_sem );
request.count = entry->buf_count; request.count = entry->buf_count;
...@@ -882,8 +854,8 @@ int DRM(addbufs_sg)( struct inode *inode, struct file *filp, ...@@ -882,8 +854,8 @@ int DRM(addbufs_sg)( struct inode *inode, struct file *filp,
init_waitqueue_head( &buf->dma_wait ); init_waitqueue_head( &buf->dma_wait );
buf->filp = NULL; buf->filp = NULL;
buf->dev_priv_size = sizeof(DRIVER_BUF_PRIV_T); buf->dev_priv_size = dev->dev_priv_size;
buf->dev_private = DRM(alloc)( sizeof(DRIVER_BUF_PRIV_T), buf->dev_private = DRM(alloc)( dev->dev_priv_size,
DRM_MEM_BUFS ); DRM_MEM_BUFS );
if(!buf->dev_private) { if(!buf->dev_private) {
/* Set count correctly so we free the proper amount. */ /* Set count correctly so we free the proper amount. */
...@@ -930,12 +902,6 @@ int DRM(addbufs_sg)( struct inode *inode, struct file *filp, ...@@ -930,12 +902,6 @@ int DRM(addbufs_sg)( struct inode *inode, struct file *filp,
DRM_DEBUG( "dma->buf_count : %d\n", dma->buf_count ); DRM_DEBUG( "dma->buf_count : %d\n", dma->buf_count );
DRM_DEBUG( "entry->buf_count : %d\n", entry->buf_count ); DRM_DEBUG( "entry->buf_count : %d\n", entry->buf_count );
#if __HAVE_DMA_FREELIST
DRM(freelist_create)( &entry->freelist, entry->buf_count );
for ( i = 0 ; i < entry->buf_count ; i++ ) {
DRM(freelist_put)( dev, &entry->freelist, &entry->buflist[i] );
}
#endif
up( &dev->struct_sem ); up( &dev->struct_sem );
request.count = entry->buf_count; request.count = entry->buf_count;
...@@ -1221,7 +1187,7 @@ int DRM(mapbufs)( struct inode *inode, struct file *filp, ...@@ -1221,7 +1187,7 @@ int DRM(mapbufs)( struct inode *inode, struct file *filp,
if ( request.count >= dma->buf_count ) { if ( request.count >= dma->buf_count ) {
if ( (__HAVE_AGP && (dma->flags & _DRM_DMA_USE_AGP)) || if ( (__HAVE_AGP && (dma->flags & _DRM_DMA_USE_AGP)) ||
(__HAVE_SG && (dma->flags & _DRM_DMA_USE_SG)) ) { (__HAVE_SG && (dma->flags & _DRM_DMA_USE_SG)) ) {
drm_map_t *map = DRIVER_AGP_BUFFERS_MAP( dev ); drm_map_t *map = dev->agp_buffer_map;
if ( !map ) { if ( !map ) {
retcode = -EINVAL; retcode = -EINVAL;
......
...@@ -419,10 +419,13 @@ int DRM(addctx)( struct inode *inode, struct file *filp, ...@@ -419,10 +419,13 @@ int DRM(addctx)( struct inode *inode, struct file *filp,
/* Should this return -EBUSY instead? */ /* Should this return -EBUSY instead? */
return -ENOMEM; return -ENOMEM;
} }
#ifdef DRIVER_CTX_CTOR
if ( ctx.handle != DRM_KERNEL_CONTEXT ) if ( ctx.handle != DRM_KERNEL_CONTEXT )
DRIVER_CTX_CTOR(ctx.handle); /* XXX: also pass dev ? */ {
#endif if (dev->fn_tbl.context_ctor)
dev->fn_tbl.context_ctor(dev, ctx.handle);
}
ctx_entry = DRM(alloc)( sizeof(*ctx_entry), DRM_MEM_CTXLIST ); ctx_entry = DRM(alloc)( sizeof(*ctx_entry), DRM_MEM_CTXLIST );
if ( !ctx_entry ) { if ( !ctx_entry ) {
DRM_DEBUG("out of memory\n"); DRM_DEBUG("out of memory\n");
...@@ -554,9 +557,8 @@ int DRM(rmctx)( struct inode *inode, struct file *filp, ...@@ -554,9 +557,8 @@ int DRM(rmctx)( struct inode *inode, struct file *filp,
priv->remove_auth_on_close = 1; priv->remove_auth_on_close = 1;
} }
if ( ctx.handle != DRM_KERNEL_CONTEXT ) { if ( ctx.handle != DRM_KERNEL_CONTEXT ) {
#ifdef DRIVER_CTX_DTOR if (dev->fn_tbl.context_dtor)
DRIVER_CTX_DTOR(ctx.handle); /* XXX: also pass dev ? */ dev->fn_tbl.context_dtor(dev, ctx.handle);
#endif
DRM(ctxbitmap_free)( dev, ctx.handle ); DRM(ctxbitmap_free)( dev, ctx.handle );
} }
......
...@@ -116,9 +116,6 @@ void DRM(dma_takedown)(drm_device_t *dev) ...@@ -116,9 +116,6 @@ void DRM(dma_takedown)(drm_device_t *dev)
dma->bufs[i].buf_count * dma->bufs[i].buf_count *
sizeof(*dma->bufs[0].buflist), sizeof(*dma->bufs[0].buflist),
DRM_MEM_BUFS); DRM_MEM_BUFS);
#if __HAVE_DMA_FREELIST
DRM(freelist_destroy)(&dma->bufs[i].freelist);
#endif
} }
} }
...@@ -158,16 +155,6 @@ void DRM(free_buffer)(drm_device_t *dev, drm_buf_t *buf) ...@@ -158,16 +155,6 @@ void DRM(free_buffer)(drm_device_t *dev, drm_buf_t *buf)
if ( __HAVE_DMA_WAITQUEUE && waitqueue_active(&buf->dma_wait)) { if ( __HAVE_DMA_WAITQUEUE && waitqueue_active(&buf->dma_wait)) {
wake_up_interruptible(&buf->dma_wait); wake_up_interruptible(&buf->dma_wait);
} }
#if __HAVE_DMA_FREELIST
else {
drm_device_dma_t *dma = dev->dma;
/* If processes are waiting, the last one
to wake will put the buffer on the free
list. If no processes are waiting, we
put the buffer on the freelist here. */
DRM(freelist_put)(dev, &dma->bufs[buf->order].freelist, buf);
}
#endif
} }
#if !__HAVE_DMA_RECLAIM #if !__HAVE_DMA_RECLAIM
......
...@@ -67,82 +67,16 @@ ...@@ -67,82 +67,16 @@
#ifndef __HAVE_MULTIPLE_DMA_QUEUES #ifndef __HAVE_MULTIPLE_DMA_QUEUES
#define __HAVE_MULTIPLE_DMA_QUEUES 0 #define __HAVE_MULTIPLE_DMA_QUEUES 0
#endif #endif
#ifndef __HAVE_DMA_SCHEDULE
#define __HAVE_DMA_SCHEDULE 0
#endif
#ifndef __HAVE_DMA_FLUSH
#define __HAVE_DMA_FLUSH 0
#endif
#ifndef __HAVE_DMA_READY
#define __HAVE_DMA_READY 0
#endif
#ifndef __HAVE_DMA_QUIESCENT
#define __HAVE_DMA_QUIESCENT 0
#endif
#ifndef __HAVE_RELEASE
#define __HAVE_RELEASE 0
#endif
#ifndef __HAVE_COUNTERS #ifndef __HAVE_COUNTERS
#define __HAVE_COUNTERS 0 #define __HAVE_COUNTERS 0
#endif #endif
#ifndef __HAVE_SG #ifndef __HAVE_SG
#define __HAVE_SG 0 #define __HAVE_SG 0
#endif #endif
/* __HAVE_KERNEL_CTX_SWITCH isn't used by any of the drm modules in
* the DRI cvs tree, but it is required by the kernel tree's sparc
* driver.
*/
#ifndef __HAVE_KERNEL_CTX_SWITCH
#define __HAVE_KERNEL_CTX_SWITCH 0
#endif
#ifndef __HAVE_DRIVER_FOPS_READ
#define __HAVE_DRIVER_FOPS_READ 0
#endif
#ifndef __HAVE_DRIVER_FOPS_POLL
#define __HAVE_DRIVER_FOPS_POLL 0
#endif
#ifndef DRIVER_PREINIT
#define DRIVER_PREINIT()
#endif
#ifndef DRIVER_POSTINIT
#define DRIVER_POSTINIT()
#endif
#ifndef DRIVER_PRERELEASE
#define DRIVER_PRERELEASE()
#endif
#ifndef DRIVER_PRETAKEDOWN
#define DRIVER_PRETAKEDOWN()
#endif
#ifndef DRIVER_POSTCLEANUP
#define DRIVER_POSTCLEANUP()
#endif
#ifndef DRIVER_PRESETUP
#define DRIVER_PRESETUP()
#endif
#ifndef DRIVER_POSTSETUP
#define DRIVER_POSTSETUP()
#endif
#ifndef DRIVER_IOCTLS #ifndef DRIVER_IOCTLS
#define DRIVER_IOCTLS #define DRIVER_IOCTLS
#endif #endif
#ifndef DRIVER_OPEN_HELPER
#define DRIVER_OPEN_HELPER( priv, dev )
#endif
#ifndef DRIVER_FOPS
#define DRIVER_FOPS \
static struct file_operations DRM(fops) = { \
.owner = THIS_MODULE, \
.open = DRM(open), \
.flush = DRM(flush), \
.release = DRM(release), \
.ioctl = DRM(ioctl), \
.mmap = DRM(mmap), \
.fasync = DRM(fasync), \
.poll = DRM(poll), \
.read = DRM(read), \
}
#endif
#ifndef MODULE #ifndef MODULE
/** Use an additional macro to avoid preprocessor troubles */ /** Use an additional macro to avoid preprocessor troubles */
...@@ -166,10 +100,20 @@ __setup( DRIVER_NAME "=", DRM_OPTIONS_FUNC ); ...@@ -166,10 +100,20 @@ __setup( DRIVER_NAME "=", DRM_OPTIONS_FUNC );
static drm_device_t DRM(device)[MAX_DEVICES]; static drm_device_t DRM(device)[MAX_DEVICES];
static int DRM(numdevs) = 0; static int DRM(numdevs) = 0;
DRIVER_FOPS; struct file_operations DRM(fops) = {
.owner = THIS_MODULE,
.open = DRM(open),
.flush = DRM(flush),
.release = DRM(release),
.ioctl = DRM(ioctl),
.mmap = DRM(mmap),
.fasync = DRM(fasync),
.poll = DRM(poll),
.read = DRM(read),
};
/** Ioctl table */ /** Ioctl table */
static drm_ioctl_desc_t DRM(ioctls)[] = { drm_ioctl_desc_t DRM(ioctls)[] = {
[DRM_IOCTL_NR(DRM_IOCTL_VERSION)] = { DRM(version), 0, 0 }, [DRM_IOCTL_NR(DRM_IOCTL_VERSION)] = { DRM(version), 0, 0 },
[DRM_IOCTL_NR(DRM_IOCTL_GET_UNIQUE)] = { DRM(getunique), 0, 0 }, [DRM_IOCTL_NR(DRM_IOCTL_GET_UNIQUE)] = { DRM(getunique), 0, 0 },
[DRM_IOCTL_NR(DRM_IOCTL_GET_MAGIC)] = { DRM(getmagic), 0, 0 }, [DRM_IOCTL_NR(DRM_IOCTL_GET_MAGIC)] = { DRM(getmagic), 0, 0 },
...@@ -208,12 +152,7 @@ static drm_ioctl_desc_t DRM(ioctls)[] = { ...@@ -208,12 +152,7 @@ static drm_ioctl_desc_t DRM(ioctls)[] = {
[DRM_IOCTL_NR(DRM_IOCTL_LOCK)] = { DRM(lock), 1, 0 }, [DRM_IOCTL_NR(DRM_IOCTL_LOCK)] = { DRM(lock), 1, 0 },
[DRM_IOCTL_NR(DRM_IOCTL_UNLOCK)] = { DRM(unlock), 1, 0 }, [DRM_IOCTL_NR(DRM_IOCTL_UNLOCK)] = { DRM(unlock), 1, 0 },
#if __HAVE_DMA_FLUSH
/* Gamma only, really */
[DRM_IOCTL_NR(DRM_IOCTL_FINISH)] = { DRM(finish), 1, 0 },
#else
[DRM_IOCTL_NR(DRM_IOCTL_FINISH)] = { DRM(noop), 1, 0 }, [DRM_IOCTL_NR(DRM_IOCTL_FINISH)] = { DRM(noop), 1, 0 },
#endif
#if __HAVE_DMA #if __HAVE_DMA
[DRM_IOCTL_NR(DRM_IOCTL_ADD_BUFS)] = { DRM(addbufs), 1, 1 }, [DRM_IOCTL_NR(DRM_IOCTL_ADD_BUFS)] = { DRM(addbufs), 1, 1 },
...@@ -265,7 +204,9 @@ static int DRM(setup)( drm_device_t *dev ) ...@@ -265,7 +204,9 @@ static int DRM(setup)( drm_device_t *dev )
{ {
int i; int i;
DRIVER_PRESETUP(); if (dev->fn_tbl.presetup)
dev->fn_tbl.presetup(dev);
atomic_set( &dev->ioctl_count, 0 ); atomic_set( &dev->ioctl_count, 0 );
atomic_set( &dev->vma_count, 0 ); atomic_set( &dev->vma_count, 0 );
dev->buf_use = 0; dev->buf_use = 0;
...@@ -311,9 +252,6 @@ static int DRM(setup)( drm_device_t *dev ) ...@@ -311,9 +252,6 @@ static int DRM(setup)( drm_device_t *dev )
#ifdef __HAVE_COUNTER14 #ifdef __HAVE_COUNTER14
dev->types[14] = __HAVE_COUNTER14; dev->types[14] = __HAVE_COUNTER14;
#endif #endif
#ifdef __HAVE_COUNTER15
dev->types[14] = __HAVE_COUNTER14;
#endif
for ( i = 0 ; i < DRM_ARRAY_SIZE(dev->counts) ; i++ ) for ( i = 0 ; i < DRM_ARRAY_SIZE(dev->counts) ; i++ )
atomic_set( &dev->counts[i], 0 ); atomic_set( &dev->counts[i], 0 );
...@@ -371,7 +309,9 @@ static int DRM(setup)( drm_device_t *dev ) ...@@ -371,7 +309,9 @@ static int DRM(setup)( drm_device_t *dev )
* drm_select_queue fails between the time the interrupt is * drm_select_queue fails between the time the interrupt is
* initialized and the time the queues are initialized. * initialized and the time the queues are initialized.
*/ */
DRIVER_POSTSETUP(); if (dev->fn_tbl.postsetup)
dev->fn_tbl.postsetup(dev);
return 0; return 0;
} }
...@@ -396,7 +336,9 @@ static int DRM(takedown)( drm_device_t *dev ) ...@@ -396,7 +336,9 @@ static int DRM(takedown)( drm_device_t *dev )
DRM_DEBUG( "\n" ); DRM_DEBUG( "\n" );
DRIVER_PRETAKEDOWN(); if (dev->fn_tbl.pretakedown)
dev->fn_tbl.pretakedown(dev);
#if __HAVE_IRQ #if __HAVE_IRQ
if ( dev->irq_enabled ) DRM(irq_uninstall)( dev ); if ( dev->irq_enabled ) DRM(irq_uninstall)( dev );
#endif #endif
...@@ -509,9 +451,6 @@ static int DRM(takedown)( drm_device_t *dev ) ...@@ -509,9 +451,6 @@ static int DRM(takedown)( drm_device_t *dev )
#if __HAVE_DMA_QUEUE || __HAVE_MULTIPLE_DMA_QUEUES #if __HAVE_DMA_QUEUE || __HAVE_MULTIPLE_DMA_QUEUES
if ( dev->queuelist ) { if ( dev->queuelist ) {
for ( i = 0 ; i < dev->queue_count ; i++ ) { for ( i = 0 ; i < dev->queue_count ; i++ ) {
#if __HAVE_DMA_WAITLIST
DRM(waitlist_destroy)( &dev->queuelist[i]->waitlist );
#endif
if ( dev->queuelist[i] ) { if ( dev->queuelist[i] ) {
DRM(free)( dev->queuelist[i], DRM(free)( dev->queuelist[i],
sizeof(*dev->queuelist[0]), sizeof(*dev->queuelist[0]),
...@@ -594,7 +533,12 @@ static int DRM(probe)(struct pci_dev *pdev) ...@@ -594,7 +533,12 @@ static int DRM(probe)(struct pci_dev *pdev)
dev->pci_func = PCI_FUNC(pdev->devfn); dev->pci_func = PCI_FUNC(pdev->devfn);
dev->irq = pdev->irq; dev->irq = pdev->irq;
DRIVER_PREINIT(); /* dev_priv_size can be changed by a driver in driver_register_fns */
dev->dev_priv_size = sizeof(u32);
DRM(driver_register_fns)(dev);
if (dev->fn_tbl.preinit)
dev->fn_tbl.preinit(dev);
#if __REALLY_HAVE_AGP #if __REALLY_HAVE_AGP
dev->agp = DRM(agp_init)(); dev->agp = DRM(agp_init)();
...@@ -635,7 +579,8 @@ static int DRM(probe)(struct pci_dev *pdev) ...@@ -635,7 +579,8 @@ static int DRM(probe)(struct pci_dev *pdev)
dev->minor, dev->minor,
pci_pretty_name(pdev)); pci_pretty_name(pdev));
DRIVER_POSTINIT(); if (dev->fn_tbl.postinit)
dev->fn_tbl.postinit(dev);
return 0; return 0;
} }
...@@ -718,8 +663,10 @@ static void __exit drm_cleanup( void ) ...@@ -718,8 +663,10 @@ static void __exit drm_cleanup( void )
dev->agp = NULL; dev->agp = NULL;
} }
#endif #endif
if (dev->fn_tbl.postcleanup)
dev->fn_tbl.postcleanup(dev);
} }
DRIVER_POSTCLEANUP();
DRM(numdevs) = 0; DRM(numdevs) = 0;
} }
...@@ -834,7 +781,8 @@ int DRM(release)( struct inode *inode, struct file *filp ) ...@@ -834,7 +781,8 @@ int DRM(release)( struct inode *inode, struct file *filp )
DRM_DEBUG( "open_count = %d\n", dev->open_count ); DRM_DEBUG( "open_count = %d\n", dev->open_count );
DRIVER_PRERELEASE(); if (dev->fn_tbl.prerelease)
dev->fn_tbl.prerelease(dev, filp);
/* ======================================================== /* ========================================================
* Begin inline drm_release * Begin inline drm_release
...@@ -849,9 +797,10 @@ int DRM(release)( struct inode *inode, struct file *filp ) ...@@ -849,9 +797,10 @@ int DRM(release)( struct inode *inode, struct file *filp )
DRM_DEBUG( "File %p released, freeing lock for context %d\n", DRM_DEBUG( "File %p released, freeing lock for context %d\n",
filp, filp,
_DRM_LOCKING_CONTEXT(dev->lock.hw_lock->lock) ); _DRM_LOCKING_CONTEXT(dev->lock.hw_lock->lock) );
#if __HAVE_RELEASE
DRIVER_RELEASE(); if (dev->fn_tbl.release)
#endif dev->fn_tbl.release(dev, filp);
DRM(lock_free)( dev, &dev->lock.hw_lock->lock, DRM(lock_free)( dev, &dev->lock.hw_lock->lock,
_DRM_LOCKING_CONTEXT(dev->lock.hw_lock->lock) ); _DRM_LOCKING_CONTEXT(dev->lock.hw_lock->lock) );
...@@ -860,8 +809,7 @@ int DRM(release)( struct inode *inode, struct file *filp ) ...@@ -860,8 +809,7 @@ int DRM(release)( struct inode *inode, struct file *filp )
processed via a callback to the X processed via a callback to the X
server. */ server. */
} }
#if __HAVE_RELEASE else if ( dev->fn_tbl.release && priv->lock_count && dev->lock.hw_lock ) {
else if ( priv->lock_count && dev->lock.hw_lock ) {
/* The lock is required to reclaim buffers */ /* The lock is required to reclaim buffers */
DECLARE_WAITQUEUE( entry, current ); DECLARE_WAITQUEUE( entry, current );
...@@ -890,12 +838,14 @@ int DRM(release)( struct inode *inode, struct file *filp ) ...@@ -890,12 +838,14 @@ int DRM(release)( struct inode *inode, struct file *filp )
current->state = TASK_RUNNING; current->state = TASK_RUNNING;
remove_wait_queue( &dev->lock.lock_queue, &entry ); remove_wait_queue( &dev->lock.lock_queue, &entry );
if( !retcode ) { if( !retcode ) {
DRIVER_RELEASE(); if (dev->fn_tbl.release)
dev->fn_tbl.release(dev, filp);
DRM(lock_free)( dev, &dev->lock.hw_lock->lock, DRM(lock_free)( dev, &dev->lock.hw_lock->lock,
DRM_KERNEL_CONTEXT ); DRM_KERNEL_CONTEXT );
} }
} }
#elif __HAVE_DMA
#if __HAVE_DMA
DRM(reclaim_buffers)( filp ); DRM(reclaim_buffers)( filp );
#endif #endif
...@@ -908,9 +858,8 @@ int DRM(release)( struct inode *inode, struct file *filp ) ...@@ -908,9 +858,8 @@ int DRM(release)( struct inode *inode, struct file *filp )
list_for_each_entry_safe( pos, n, &dev->ctxlist->head, head ) { list_for_each_entry_safe( pos, n, &dev->ctxlist->head, head ) {
if ( pos->tag == priv && if ( pos->tag == priv &&
pos->handle != DRM_KERNEL_CONTEXT ) { pos->handle != DRM_KERNEL_CONTEXT ) {
#ifdef DRIVER_CTX_DTOR if (dev->fn_tbl.context_dtor)
DRIVER_CTX_DTOR(pos->handle); dev->fn_tbl.context_dtor(dev, pos->handle);
#endif
#if __HAVE_CTX_BITMAP #if __HAVE_CTX_BITMAP
DRM(ctxbitmap_free)( dev, pos->handle ); DRM(ctxbitmap_free)( dev, pos->handle );
#endif #endif
...@@ -1067,10 +1016,6 @@ int DRM(lock)( struct inode *inode, struct file *filp, ...@@ -1067,10 +1016,6 @@ int DRM(lock)( struct inode *inode, struct file *filp,
q = dev->queuelist[lock.context]; q = dev->queuelist[lock.context];
#endif #endif
#if __HAVE_DMA_FLUSH
ret = DRM(flush_block_and_flush)( dev, lock.context, lock.flags );
#endif
if ( !ret ) {
add_wait_queue( &dev->lock.lock_queue, &entry ); add_wait_queue( &dev->lock.lock_queue, &entry );
for (;;) { for (;;) {
current->state = TASK_INTERRUPTIBLE; current->state = TASK_INTERRUPTIBLE;
...@@ -1096,13 +1041,7 @@ int DRM(lock)( struct inode *inode, struct file *filp, ...@@ -1096,13 +1041,7 @@ int DRM(lock)( struct inode *inode, struct file *filp,
} }
current->state = TASK_RUNNING; current->state = TASK_RUNNING;
remove_wait_queue( &dev->lock.lock_queue, &entry ); remove_wait_queue( &dev->lock.lock_queue, &entry );
}
#if __HAVE_DMA_FLUSH
DRM(flush_unblock)( dev, lock.context, lock.flags ); /* cleanup phase */
#endif
if ( !ret ) {
sigemptyset( &dev->sigmask ); sigemptyset( &dev->sigmask );
sigaddset( &dev->sigmask, SIGSTOP ); sigaddset( &dev->sigmask, SIGSTOP );
sigaddset( &dev->sigmask, SIGTSTP ); sigaddset( &dev->sigmask, SIGTSTP );
...@@ -1113,28 +1052,21 @@ int DRM(lock)( struct inode *inode, struct file *filp, ...@@ -1113,28 +1052,21 @@ int DRM(lock)( struct inode *inode, struct file *filp,
block_all_signals( DRM(notifier), block_all_signals( DRM(notifier),
&dev->sigdata, &dev->sigmask ); &dev->sigdata, &dev->sigmask );
#if __HAVE_DMA_READY if (dev->fn_tbl.dma_ready && (lock.flags & _DRM_LOCK_READY))
if ( lock.flags & _DRM_LOCK_READY ) { dev->fn_tbl.dma_ready(dev);
DRIVER_DMA_READY();
} if ( dev->fn_tbl.dma_quiescent && (lock.flags & _DRM_LOCK_QUIESCENT ))
#endif return dev->fn_tbl.dma_quiescent(dev);
#if __HAVE_DMA_QUIESCENT
if ( lock.flags & _DRM_LOCK_QUIESCENT ) { /* dev->fn_tbl.kernel_context_switch isn't used by any of the x86
DRIVER_DMA_QUIESCENT(); * drivers but is used by the Sparc driver.
}
#endif
/* __HAVE_KERNEL_CTX_SWITCH isn't used by any of the
* drm modules in the DRI cvs tree, but it is required
* by the Sparc driver.
*/ */
#if __HAVE_KERNEL_CTX_SWITCH
if ( dev->last_context != lock.context ) { if (dev->fn_tbl.kernel_context_switch &&
DRM(context_switch)(dev, dev->last_context, dev->last_context != lock.context) {
dev->fn_tbl.kernel_context_switch(dev, dev->last_context,
lock.context); lock.context);
} }
#endif
}
DRM_DEBUG( "%d %s\n", lock.context, ret ? "interrupted" : "has lock" ); DRM_DEBUG( "%d %s\n", lock.context, ret ? "interrupted" : "has lock" );
return ret; return ret;
...@@ -1169,40 +1101,20 @@ int DRM(unlock)( struct inode *inode, struct file *filp, ...@@ -1169,40 +1101,20 @@ int DRM(unlock)( struct inode *inode, struct file *filp,
atomic_inc( &dev->counts[_DRM_STAT_UNLOCKS] ); atomic_inc( &dev->counts[_DRM_STAT_UNLOCKS] );
/* __HAVE_KERNEL_CTX_SWITCH isn't used by any of the drm /* kernel_context_switch isn't used by any of the x86 drm
* modules in the DRI cvs tree, but it is required by the * modules but is required by the Sparc driver.
* Sparc driver.
*/
#if __HAVE_KERNEL_CTX_SWITCH
/* We no longer really hold it, but if we are the next
* agent to request it then we should just be able to
* take it immediately and not eat the ioctl.
*/ */
dev->lock.filp = NULL; if (dev->fn_tbl.kernel_context_switch_unlock)
{ dev->fn_tbl.kernel_context_switch_unlock(dev);
__volatile__ unsigned int *plock = &dev->lock.hw_lock->lock; else {
unsigned int old, new, prev, ctx;
ctx = lock.context;
do {
old = *plock;
new = ctx;
prev = cmpxchg(plock, old, new);
} while (prev != old);
}
wake_up_interruptible(&dev->lock.lock_queue);
#else
DRM(lock_transfer)( dev, &dev->lock.hw_lock->lock, DRM(lock_transfer)( dev, &dev->lock.hw_lock->lock,
DRM_KERNEL_CONTEXT ); DRM_KERNEL_CONTEXT );
#if __HAVE_DMA_SCHEDULE
DRM(dma_schedule)( dev, 1 );
#endif
if ( DRM(lock_free)( dev, &dev->lock.hw_lock->lock, if ( DRM(lock_free)( dev, &dev->lock.hw_lock->lock,
DRM_KERNEL_CONTEXT ) ) { DRM_KERNEL_CONTEXT ) ) {
DRM_ERROR( "\n" ); DRM_ERROR( "\n" );
} }
#endif /* !__HAVE_KERNEL_CTX_SWITCH */ }
unblock_all_signals(); unblock_all_signals();
return 0; return 0;
......
...@@ -72,7 +72,8 @@ int DRM(open_helper)(struct inode *inode, struct file *filp, drm_device_t *dev) ...@@ -72,7 +72,8 @@ int DRM(open_helper)(struct inode *inode, struct file *filp, drm_device_t *dev)
priv->authenticated = capable(CAP_SYS_ADMIN); priv->authenticated = capable(CAP_SYS_ADMIN);
priv->lock_count = 0; priv->lock_count = 0;
DRIVER_OPEN_HELPER( priv, dev ); if (dev->fn_tbl.open_helper)
dev->fn_tbl.open_helper(dev, priv);
down(&dev->struct_sem); down(&dev->struct_sem);
if (!dev->file_last) { if (!dev->file_last) {
...@@ -130,19 +131,15 @@ int DRM(fasync)(int fd, struct file *filp, int on) ...@@ -130,19 +131,15 @@ int DRM(fasync)(int fd, struct file *filp, int on)
return 0; return 0;
} }
#if !__HAVE_DRIVER_FOPS_POLL
/** No-op. */ /** No-op. */
unsigned int DRM(poll)(struct file *filp, struct poll_table_struct *wait) unsigned int DRM(poll)(struct file *filp, struct poll_table_struct *wait)
{ {
return 0; return 0;
} }
#endif
#if !__HAVE_DRIVER_FOPS_READ
/** No-op. */ /** No-op. */
ssize_t DRM(read)(struct file *filp, char __user *buf, size_t count, loff_t *off) ssize_t DRM(read)(struct file *filp, char __user *buf, size_t count, loff_t *off)
{ {
return 0; return 0;
} }
#endif
...@@ -187,6 +187,7 @@ static inline void drm_ioremapfree(void *pt, unsigned long size, drm_device_t *d ...@@ -187,6 +187,7 @@ static inline void drm_ioremapfree(void *pt, unsigned long size, drm_device_t *d
iounmap(pt); iounmap(pt);
} }
#if DEBUG_MEMORY #if DEBUG_MEMORY
#include "drm_memory_debug.h" #include "drm_memory_debug.h"
#else #else
......
...@@ -8,9 +8,5 @@ ...@@ -8,9 +8,5 @@
*/ */
#define DRM(x) ffb_##x #define DRM(x) ffb_##x
/* General customization:
*/
#define __HAVE_KERNEL_CTX_SWITCH 1
#define __HAVE_RELEASE 1
#endif #endif
...@@ -537,3 +537,63 @@ int DRM(rmctx)(struct inode *inode, struct file *filp, unsigned int cmd, ...@@ -537,3 +537,63 @@ int DRM(rmctx)(struct inode *inode, struct file *filp, unsigned int cmd,
} }
return 0; return 0;
} }
static void ffb_driver_release(drm_device_t *dev)
{
ffb_dev_priv_t *fpriv = (ffb_dev_priv_t *) dev->dev_private;
int context = _DRM_LOCKING_CONTEXT(dev->lock.hw_lock->lock);
int idx;
idx = context - 1;
if (fpriv &&
context != DRM_KERNEL_CONTEXT &&
fpriv->hw_state[idx] != NULL) {
kfree(fpriv->hw_state[idx]);
fpriv->hw_state[idx] = NULL;
}
}
static int ffb_driver_presetup(drm_device_t *dev)
{
int ret;
ret = ffb_presetup(dev);
if (_ret != 0) return ret;
}
static void ffb_driver_pretakedown(drm_device_t *dev)
{
if (dev->dev_private) kfree(dev->dev_private);
}
static void ffb_driver_postcleanup(drm_device_t *dev)
{
if (ffb_position != NULL) kfree(ffb_position);
}
static int ffb_driver_kernel_context_switch_unlock(struct drm_device *dev)
{
dev->lock.filp = 0;
{
__volatile__ unsigned int *plock = &dev->lock.hw_lock->lock;
unsigned int old, new, prev, ctx;
ctx = lock.context;
do {
old = *plock;
new = ctx;
prev = cmpxchg(plock, old, new);
} while (prev != old);
}
wake_up_interruptible(&dev->lock.lock_queue);
}
static void ffb_driver_register_fns(drm_device_t *dev)
{
DRM(fops).get_unmapped_area = ffb_get_unmapped_area;
dev->fn_tbl.release = ffb_driver_release;
dev->fn_tbl.presetup = ffb_driver_presetup;
dev->fn_tbl.pretakedown = ffb_driver_pretakedown;
dev->fn_tbl.postcleanup = ffb_driver_postcleanup;
dev->fn_tbl.kernel_context_switch = ffb_context_switch;
dev->fn_tbl.kernel_context_switch_unlock = ffb_driver_kernel_context_switch_unlock;
}
...@@ -26,53 +26,7 @@ ...@@ -26,53 +26,7 @@
#define DRIVER_MINOR 0 #define DRIVER_MINOR 0
#define DRIVER_PATCHLEVEL 1 #define DRIVER_PATCHLEVEL 1
#define DRIVER_FOPS \
static struct file_operations DRM(fops) = { \
.owner = THIS_MODULE, \
.open = DRM(open), \
.flush = DRM(flush), \
.release = DRM(release), \
.ioctl = DRM(ioctl), \
.mmap = DRM(mmap), \
.read = DRM(read), \
.fasync = DRM(fasync), \
.poll = DRM(poll), \
.get_unmapped_area = ffb_get_unmapped_area, \
}
#define DRIVER_COUNT_CARDS() ffb_count_card_instances() #define DRIVER_COUNT_CARDS() ffb_count_card_instances()
/* Allocate private structure and fill it */
#define DRIVER_PRESETUP() do { \
int _ret; \
_ret = ffb_presetup(dev); \
if (_ret != 0) return _ret; \
} while(0)
/* Free private structure */
#define DRIVER_PRETAKEDOWN() do { \
if (dev->dev_private) kfree(dev->dev_private); \
} while(0)
#define DRIVER_POSTCLEANUP() do { \
if (ffb_position != NULL) kfree(ffb_position); \
} while(0)
/* We have to free up the rogue hw context state holding error or
* else we will leak it.
*/
#define DRIVER_RELEASE() do { \
ffb_dev_priv_t *fpriv = (ffb_dev_priv_t *) dev->dev_private; \
int context = _DRM_LOCKING_CONTEXT(dev->lock.hw_lock->lock); \
int idx; \
\
idx = context - 1; \
if (fpriv && \
context != DRM_KERNEL_CONTEXT && \
fpriv->hw_state[idx] != NULL) { \
kfree(fpriv->hw_state[idx]); \
fpriv->hw_state[idx] = NULL; \
} \
} while(0)
/* For mmap customization */ /* For mmap customization */
#define DRIVER_GET_MAP_OFS() (map->offset & 0xffffffff) #define DRIVER_GET_MAP_OFS() (map->offset & 0xffffffff)
...@@ -275,7 +229,7 @@ static drm_map_t *ffb_find_map(struct file *filp, unsigned long off) ...@@ -275,7 +229,7 @@ static drm_map_t *ffb_find_map(struct file *filp, unsigned long off)
return NULL; return NULL;
} }
static unsigned long ffb_get_unmapped_area(struct file *filp, unsigned long ffb_get_unmapped_area(struct file *filp,
unsigned long hint, unsigned long hint,
unsigned long len, unsigned long len,
unsigned long pgoff, unsigned long pgoff,
......
...@@ -274,3 +274,10 @@ typedef struct ffb_dev_priv { ...@@ -274,3 +274,10 @@ typedef struct ffb_dev_priv {
/* Context table. */ /* Context table. */
struct ffb_hw_context *hw_state[FFB_MAX_CTXS]; struct ffb_hw_context *hw_state[FFB_MAX_CTXS];
} ffb_dev_priv_t; } ffb_dev_priv_t;
extern struct file_operations DRM(fops);
extern unsigned long ffb_get_unmapped_area(struct file *filp,
unsigned long hint,
unsigned long len,
unsigned long pgoff,
unsigned long flags);
...@@ -77,38 +77,12 @@ ...@@ -77,38 +77,12 @@
#define __HAVE_OLD_DMA 1 #define __HAVE_OLD_DMA 1
#define __HAVE_PCI_DMA 1 #define __HAVE_PCI_DMA 1
#define __HAVE_DRIVER_FOPS_READ 1
#define __HAVE_DRIVER_FOPS_POLL 1
#define __HAVE_MULTIPLE_DMA_QUEUES 1 #define __HAVE_MULTIPLE_DMA_QUEUES 1
#define __HAVE_DMA_WAITQUEUE 1 #define __HAVE_DMA_WAITQUEUE 1
#define __HAVE_DMA_WAITLIST 1 /* removed from DRM HAVE_DMA_FREELIST & HAVE_DMA_SCHEDULE */
#define __HAVE_DMA_FREELIST 1
#define __HAVE_DMA_FLUSH 1
#define __HAVE_DMA_SCHEDULE 1
#define __HAVE_DMA_READY 1
#define DRIVER_DMA_READY() do { \
gamma_dma_ready(dev); \
} while (0)
#define __HAVE_DMA_QUIESCENT 1
#define DRIVER_DMA_QUIESCENT() do { \
drm_gamma_private_t *dev_priv = \
(drm_gamma_private_t *)dev->dev_private; \
if (dev_priv->num_rast == 2) \
gamma_dma_quiescent_dual(dev); \
else gamma_dma_quiescent_single(dev); \
return 0; \
} while (0)
#define __HAVE_IRQ 1 #define __HAVE_IRQ 1
#define __HAVE_IRQ_BH 1 #define __HAVE_IRQ_BH 1
#define DRIVER_AGP_BUFFERS_MAP( dev ) \
((drm_gamma_private_t *)((dev)->dev_private))->buffers
#endif /* __GAMMA_H__ */ #endif /* __GAMMA_H__ */
...@@ -42,7 +42,7 @@ ...@@ -42,7 +42,7 @@
the circular buffer), is based on Alessandro Rubini's LINUX DEVICE the circular buffer), is based on Alessandro Rubini's LINUX DEVICE
DRIVERS (Cambridge: O'Reilly, 1998), pages 111-113. */ DRIVERS (Cambridge: O'Reilly, 1998), pages 111-113. */
ssize_t DRM(read)(struct file *filp, char __user *buf, size_t count, loff_t *off) ssize_t gamma_fops_read(struct file *filp, char __user *buf, size_t count, loff_t *off)
{ {
drm_file_t *priv = filp->private_data; drm_file_t *priv = filp->private_data;
drm_device_t *dev = priv->dev; drm_device_t *dev = priv->dev;
...@@ -128,7 +128,7 @@ int DRM(write_string)(drm_device_t *dev, const char *s) ...@@ -128,7 +128,7 @@ int DRM(write_string)(drm_device_t *dev, const char *s)
return 0; return 0;
} }
unsigned int DRM(poll)(struct file *filp, struct poll_table_struct *wait) unsigned int gamma_fops_poll(struct file *filp, struct poll_table_struct *wait)
{ {
drm_file_t *priv = filp->private_data; drm_file_t *priv = filp->private_data;
drm_device_t *dev = priv->dev; drm_device_t *dev = priv->dev;
......
...@@ -640,10 +640,10 @@ static int gamma_do_init_dma( drm_device_t *dev, drm_gamma_init_t *init ) ...@@ -640,10 +640,10 @@ static int gamma_do_init_dma( drm_device_t *dev, drm_gamma_init_t *init )
} }
} }
DRM_FIND_MAP( dev_priv->mmio0, init->mmio0 ); dev_priv->mmio0 = drm_core_findmap(dev, init->mmio0);
DRM_FIND_MAP( dev_priv->mmio1, init->mmio1 ); dev_priv->mmio1 = drm_core_findmap(dev, init->mmio1);
DRM_FIND_MAP( dev_priv->mmio2, init->mmio2 ); dev_priv->mmio2 = drm_core_findmap(dev, init->mmio2);
DRM_FIND_MAP( dev_priv->mmio3, init->mmio3 ); dev_priv->mmio3 = drm_core_findmap(dev, init->mmio3);
dev_priv->sarea_priv = (drm_gamma_sarea_t *) dev_priv->sarea_priv = (drm_gamma_sarea_t *)
((u8 *)dev_priv->sarea->handle + ((u8 *)dev_priv->sarea->handle +
...@@ -661,9 +661,8 @@ static int gamma_do_init_dma( drm_device_t *dev, drm_gamma_init_t *init ) ...@@ -661,9 +661,8 @@ static int gamma_do_init_dma( drm_device_t *dev, drm_gamma_init_t *init )
buf = dma->buflist[GLINT_DRI_BUF_COUNT]; buf = dma->buflist[GLINT_DRI_BUF_COUNT];
} else { } else {
DRM_FIND_MAP( dev_priv->buffers, init->buffers_offset ); dev->agp_buffer_map = drm_core_findmap(dev, init->buffers_offset);
drm_core_ioremap( dev->agp_buffer_map, dev);
DRM_IOREMAP( dev_priv->buffers, dev );
buf = dma->buflist[GLINT_DRI_BUF_COUNT]; buf = dma->buflist[GLINT_DRI_BUF_COUNT];
pgt = buf->address; pgt = buf->address;
...@@ -699,10 +698,9 @@ int gamma_do_cleanup_dma( drm_device_t *dev ) ...@@ -699,10 +698,9 @@ int gamma_do_cleanup_dma( drm_device_t *dev )
#endif #endif
if ( dev->dev_private ) { if ( dev->dev_private ) {
drm_gamma_private_t *dev_priv = dev->dev_private;
if ( dev_priv->buffers != NULL ) if ( dev->agp_buffer_map != NULL )
DRM_IOREMAPFREE( dev_priv->buffers, dev ); drm_core_ioremapfree( dev->agp_buffer_map, dev );
DRM(free)( dev->dev_private, sizeof(drm_gamma_private_t), DRM(free)( dev->dev_private, sizeof(drm_gamma_private_t),
DRM_MEM_DRIVER ); DRM_MEM_DRIVER );
...@@ -904,3 +902,44 @@ void DRM(driver_irq_uninstall)( drm_device_t *dev ) { ...@@ -904,3 +902,44 @@ void DRM(driver_irq_uninstall)( drm_device_t *dev ) {
GAMMA_WRITE( GAMMA_COMMANDINTENABLE, 0x00000000 ); GAMMA_WRITE( GAMMA_COMMANDINTENABLE, 0x00000000 );
GAMMA_WRITE( GAMMA_GINTENABLE, 0x00000000 ); GAMMA_WRITE( GAMMA_GINTENABLE, 0x00000000 );
} }
extern drm_ioctl_desc_t DRM(ioctls)[];
static int gamma_driver_preinit(drm_device_t *dev)
{
/* reset the finish ioctl */
DRM(ioctls)[DRM_IOCTL_NR(DRM_IOCTL_FINISH)].func = DRM(finish);
return 0;
}
static void gamma_driver_pretakedown(drm_device_t *dev)
{
gamma_do_cleanup_dma(dev);
}
static void gamma_driver_dma_ready(drm_device_t *dev)
{
gamma_dma_ready(dev);
}
static int gamma_driver_dma_quiescent(drm_device_t *dev)
{
drm_gamma_private_t *dev_priv = (
drm_gamma_private_t *)dev->dev_private;
if (dev_priv->num_rast == 2)
gamma_dma_quiescent_dual(dev);
else gamma_dma_quiescent_single(dev);
return 0;
}
void gamma_driver_register_fns(drm_device_t *dev)
{
DRM(fops).read = gamma_fops_read;
DRM(fops).poll = gamma_fops_poll;
dev->fn_tbl.preinit = gamma_driver_preinit;
dev->fn_tbl.pretakedown = gamma_driver_pretakedown;
dev->fn_tbl.dma_ready = gamma_driver_dma_ready;
dev->fn_tbl.dma_quiescent = gamma_driver_dma_quiescent;
dev->fn_tbl.dma_flush_block_and_flush = gamma_flush_block_and_flush;
dev->fn_tbl.dma_flush_unblock = gamma_flush_unblock;
}
...@@ -35,7 +35,6 @@ ...@@ -35,7 +35,6 @@
typedef struct drm_gamma_private { typedef struct drm_gamma_private {
drm_gamma_sarea_t *sarea_priv; drm_gamma_sarea_t *sarea_priv;
drm_map_t *sarea; drm_map_t *sarea;
drm_map_t *buffers;
drm_map_t *mmio0; drm_map_t *mmio0;
drm_map_t *mmio1; drm_map_t *mmio1;
drm_map_t *mmio2; drm_map_t *mmio2;
...@@ -91,6 +90,10 @@ extern int DRM(freelist_put)(drm_device_t *dev, drm_freelist_t *bl, ...@@ -91,6 +90,10 @@ extern int DRM(freelist_put)(drm_device_t *dev, drm_freelist_t *bl,
drm_buf_t *buf); drm_buf_t *buf);
extern drm_buf_t *DRM(freelist_get)(drm_freelist_t *bl, int block); extern drm_buf_t *DRM(freelist_get)(drm_freelist_t *bl, int block);
/* externs for gamma changes to the ops */
extern struct file_operations DRM(fops);
extern unsigned int gamma_fops_poll(struct file *filp, struct poll_table_struct *wait);
extern ssize_t gamma_fops_read(struct file *filp, char __user *buf, size_t count, loff_t *off);
#define GLINT_DRI_BUF_COUNT 256 #define GLINT_DRI_BUF_COUNT 256
......
...@@ -84,41 +84,16 @@ ...@@ -84,41 +84,16 @@
#define __HAVE_COUNTER8 _DRM_STAT_SECONDARY #define __HAVE_COUNTER8 _DRM_STAT_SECONDARY
#define __HAVE_COUNTER9 _DRM_STAT_DMA #define __HAVE_COUNTER9 _DRM_STAT_DMA
/* Driver customization:
*/
#define __HAVE_RELEASE 1
#define DRIVER_RELEASE() do { \
i810_reclaim_buffers( filp ); \
} while (0)
#define DRIVER_PRETAKEDOWN() do { \
i810_dma_cleanup( dev ); \
} while (0)
/* DMA customization: /* DMA customization:
*/ */
#define __HAVE_DMA 1 #define __HAVE_DMA 1
#define __HAVE_DMA_QUEUE 1 #define __HAVE_DMA_QUEUE 1
#define __HAVE_DMA_WAITLIST 0
#define __HAVE_DMA_RECLAIM 1 #define __HAVE_DMA_RECLAIM 1
#define __HAVE_DMA_QUIESCENT 1
#define DRIVER_DMA_QUIESCENT() do { \
i810_dma_quiescent( dev ); \
} while (0)
/* Don't need an irq any more. The template code will make sure that /* Don't need an irq any more. The template code will make sure that
* a noop stub is generated for compatibility. * a noop stub is generated for compatibility.
*/ */
/* XXX: Add vblank support? */ /* XXX: Add vblank support? */
#define __HAVE_IRQ 0 #define __HAVE_IRQ 0
/* Buffer customization:
*/
#define DRIVER_BUF_PRIV_T drm_i810_buf_priv_t
#define DRIVER_AGP_BUFFERS_MAP( dev ) \
((drm_i810_private_t *)((dev)->dev_private))->buffer_map
#endif #endif
...@@ -364,15 +364,15 @@ static int i810_dma_initialize(drm_device_t *dev, ...@@ -364,15 +364,15 @@ static int i810_dma_initialize(drm_device_t *dev,
DRM_ERROR("can not find sarea!\n"); DRM_ERROR("can not find sarea!\n");
return -EINVAL; return -EINVAL;
} }
DRM_FIND_MAP( dev_priv->mmio_map, init->mmio_offset ); dev_priv->mmio_map = drm_core_findmap(dev, init->mmio_offset);
if (!dev_priv->mmio_map) { if (!dev_priv->mmio_map) {
dev->dev_private = (void *)dev_priv; dev->dev_private = (void *)dev_priv;
i810_dma_cleanup(dev); i810_dma_cleanup(dev);
DRM_ERROR("can not find mmio map!\n"); DRM_ERROR("can not find mmio map!\n");
return -EINVAL; return -EINVAL;
} }
DRM_FIND_MAP( dev_priv->buffer_map, init->buffers_offset ); dev->agp_buffer_map = drm_core_findmap(dev, init->buffers_offset);
if (!dev_priv->buffer_map) { if (!dev->agp_buffer_map) {
dev->dev_private = (void *)dev_priv; dev->dev_private = (void *)dev_priv;
i810_dma_cleanup(dev); i810_dma_cleanup(dev);
DRM_ERROR("can not find dma buffer map!\n"); DRM_ERROR("can not find dma buffer map!\n");
...@@ -1388,3 +1388,28 @@ int i810_flip_bufs(struct inode *inode, struct file *filp, ...@@ -1388,3 +1388,28 @@ int i810_flip_bufs(struct inode *inode, struct file *filp,
i810_dma_dispatch_flip( dev ); i810_dma_dispatch_flip( dev );
return 0; return 0;
} }
static void i810_driver_pretakedown(drm_device_t *dev)
{
i810_dma_cleanup( dev );
}
static void i810_driver_release(drm_device_t *dev, struct file *filp)
{
i810_reclaim_buffers(filp);
}
static int i810_driver_dma_quiescent(drm_device_t *dev)
{
i810_dma_quiescent( dev );
return 0;
}
void i810_driver_register_fns(drm_device_t *dev)
{
dev->dev_priv_size = sizeof(drm_i810_buf_priv_t);
dev->fn_tbl.pretakedown = i810_driver_pretakedown;
dev->fn_tbl.release = i810_driver_release;
dev->fn_tbl.dma_quiescent = i810_driver_dma_quiescent;
}
...@@ -53,7 +53,6 @@ typedef struct _drm_i810_ring_buffer{ ...@@ -53,7 +53,6 @@ typedef struct _drm_i810_ring_buffer{
typedef struct drm_i810_private { typedef struct drm_i810_private {
drm_map_t *sarea_map; drm_map_t *sarea_map;
drm_map_t *buffer_map;
drm_map_t *mmio_map; drm_map_t *mmio_map;
drm_i810_sarea_t *sarea_priv; drm_i810_sarea_t *sarea_priv;
......
...@@ -83,30 +83,12 @@ ...@@ -83,30 +83,12 @@
#define __HAVE_COUNTER8 _DRM_STAT_SECONDARY #define __HAVE_COUNTER8 _DRM_STAT_SECONDARY
#define __HAVE_COUNTER9 _DRM_STAT_DMA #define __HAVE_COUNTER9 _DRM_STAT_DMA
/* Driver customization:
*/
#define __HAVE_RELEASE 1
#define DRIVER_RELEASE() do { \
i830_reclaim_buffers( filp ); \
} while (0)
#define DRIVER_PRETAKEDOWN() do { \
i830_dma_cleanup( dev ); \
} while (0)
/* DMA customization: /* DMA customization:
*/ */
#define __HAVE_DMA 1 #define __HAVE_DMA 1
#define __HAVE_DMA_QUEUE 1 #define __HAVE_DMA_QUEUE 1
#define __HAVE_DMA_WAITLIST 0
#define __HAVE_DMA_RECLAIM 1 #define __HAVE_DMA_RECLAIM 1
#define __HAVE_DMA_QUIESCENT 1
#define DRIVER_DMA_QUIESCENT() do { \
i830_dma_quiescent( dev ); \
} while (0)
/* Driver will work either way: IRQ's save cpu time when waiting for /* Driver will work either way: IRQ's save cpu time when waiting for
* the card, but are subject to subtle interactions between bios, * the card, but are subject to subtle interactions between bios,
* hardware and the driver. * hardware and the driver.
...@@ -121,13 +103,4 @@ ...@@ -121,13 +103,4 @@
#define __HAVE_IRQ 0 #define __HAVE_IRQ 0
#endif #endif
/* Buffer customization:
*/
#define DRIVER_BUF_PRIV_T drm_i830_buf_priv_t
#define DRIVER_AGP_BUFFERS_MAP( dev ) \
((drm_i830_private_t *)((dev)->dev_private))->buffer_map
#endif #endif
...@@ -371,15 +371,15 @@ static int i830_dma_initialize(drm_device_t *dev, ...@@ -371,15 +371,15 @@ static int i830_dma_initialize(drm_device_t *dev,
DRM_ERROR("can not find sarea!\n"); DRM_ERROR("can not find sarea!\n");
return -EINVAL; return -EINVAL;
} }
DRM_FIND_MAP( dev_priv->mmio_map, init->mmio_offset ); dev_priv->mmio_map = drm_core_findmap(dev, init->mmio_offset);
if(!dev_priv->mmio_map) { if(!dev_priv->mmio_map) {
dev->dev_private = (void *)dev_priv; dev->dev_private = (void *)dev_priv;
i830_dma_cleanup(dev); i830_dma_cleanup(dev);
DRM_ERROR("can not find mmio map!\n"); DRM_ERROR("can not find mmio map!\n");
return -EINVAL; return -EINVAL;
} }
DRM_FIND_MAP( dev_priv->buffer_map, init->buffers_offset ); dev->agp_buffer_map = drm_core_findmap(dev, init->buffers_offset);
if(!dev_priv->buffer_map) { if(!dev->agp_buffer_map) {
dev->dev_private = (void *)dev_priv; dev->dev_private = (void *)dev_priv;
i830_dma_cleanup(dev); i830_dma_cleanup(dev);
DRM_ERROR("can not find dma buffer map!\n"); DRM_ERROR("can not find dma buffer map!\n");
...@@ -1582,3 +1582,29 @@ int i830_setparam( struct inode *inode, struct file *filp, unsigned int cmd, ...@@ -1582,3 +1582,29 @@ int i830_setparam( struct inode *inode, struct file *filp, unsigned int cmd,
return 0; return 0;
} }
static void i830_driver_pretakedown(drm_device_t *dev)
{
i830_dma_cleanup( dev );
}
static void i830_driver_release(drm_device_t *dev, struct file *filp)
{
i830_reclaim_buffers(filp);
}
static int i830_driver_dma_quiescent(drm_device_t *dev)
{
i830_dma_quiescent( dev );
return 0;
}
void i830_driver_register_fns(drm_device_t *dev)
{
dev->dev_priv_size = sizeof(drm_i830_buf_priv_t);
dev->fn_tbl.pretakedown = i830_driver_pretakedown;
dev->fn_tbl.release = i830_driver_release;
dev->fn_tbl.dma_quiescent = i830_driver_dma_quiescent;
}
...@@ -53,7 +53,6 @@ typedef struct _drm_i830_ring_buffer{ ...@@ -53,7 +53,6 @@ typedef struct _drm_i830_ring_buffer{
typedef struct drm_i830_private { typedef struct drm_i830_private {
drm_map_t *sarea_map; drm_map_t *sarea_map;
drm_map_t *buffer_map;
drm_map_t *mmio_map; drm_map_t *mmio_map;
drm_i830_sarea_t *sarea_priv; drm_i830_sarea_t *sarea_priv;
......
...@@ -55,27 +55,6 @@ ...@@ -55,27 +55,6 @@
#define __HAVE_COUNTER8 _DRM_STAT_SECONDARY #define __HAVE_COUNTER8 _DRM_STAT_SECONDARY
#define __HAVE_COUNTER9 _DRM_STAT_DMA #define __HAVE_COUNTER9 _DRM_STAT_DMA
/* Driver customization:
*/
#define DRIVER_PRETAKEDOWN() do { \
if ( dev->dev_private ) { \
drm_i915_private_t *dev_priv = dev->dev_private; \
i915_mem_takedown( &(dev_priv->agp_heap) ); \
} \
i915_dma_cleanup( dev ); \
} while (0)
/* When a client dies:
* - Free any alloced agp memory.
*/
#define DRIVER_PRERELEASE() \
do { \
if ( dev->dev_private ) { \
drm_i915_private_t *dev_priv = dev->dev_private; \
i915_mem_release( dev, filp, dev_priv->agp_heap ); \
} \
} while (0)
/* We use our own dma mechanisms, not the drm template code. However, /* We use our own dma mechanisms, not the drm template code. However,
* the shared IRQ code is useful to us: * the shared IRQ code is useful to us:
*/ */
......
...@@ -91,7 +91,7 @@ int i915_dma_cleanup(drm_device_t * dev) ...@@ -91,7 +91,7 @@ int i915_dma_cleanup(drm_device_t * dev)
(drm_i915_private_t *) dev->dev_private; (drm_i915_private_t *) dev->dev_private;
if (dev_priv->ring.virtual_start) { if (dev_priv->ring.virtual_start) {
DRM_IOREMAPFREE(&dev_priv->ring.map, dev); drm_core_ioremapfree( &dev_priv->ring.map, dev);
} }
if (dev_priv->hw_status_page) { if (dev_priv->hw_status_page) {
...@@ -125,7 +125,7 @@ static int i915_initialize(drm_device_t * dev, ...@@ -125,7 +125,7 @@ static int i915_initialize(drm_device_t * dev,
return DRM_ERR(EINVAL); return DRM_ERR(EINVAL);
} }
DRM_FIND_MAP(dev_priv->mmio_map, init->mmio_offset); dev_priv->mmio_map = drm_core_findmap(dev, init->mmio_offset);
if (!dev_priv->mmio_map) { if (!dev_priv->mmio_map) {
dev->dev_private = (void *)dev_priv; dev->dev_private = (void *)dev_priv;
i915_dma_cleanup(dev); i915_dma_cleanup(dev);
...@@ -147,7 +147,7 @@ static int i915_initialize(drm_device_t * dev, ...@@ -147,7 +147,7 @@ static int i915_initialize(drm_device_t * dev,
dev_priv->ring.map.flags = 0; dev_priv->ring.map.flags = 0;
dev_priv->ring.map.mtrr = 0; dev_priv->ring.map.mtrr = 0;
DRM_IOREMAP(&dev_priv->ring.map, dev); drm_core_ioremap( &dev_priv->ring.map, dev );
if (dev_priv->ring.map.handle == NULL) { if (dev_priv->ring.map.handle == NULL) {
dev->dev_private = (void *)dev_priv; dev->dev_private = (void *)dev_priv;
...@@ -712,3 +712,26 @@ int i915_setparam(DRM_IOCTL_ARGS) ...@@ -712,3 +712,26 @@ int i915_setparam(DRM_IOCTL_ARGS)
return 0; return 0;
} }
static void i915_driver_pretakedown(drm_device_t *dev)
{
if ( dev->dev_private ) {
drm_i915_private_t *dev_priv = dev->dev_private;
i915_mem_takedown( &(dev_priv->agp_heap) );
}
i915_dma_cleanup( dev );
}
static void i915_driver_prerelease(drm_device_t *dev, DRMFILE filp)
{
if ( dev->dev_private ) {
drm_i915_private_t *dev_priv = dev->dev_private;
i915_mem_release( dev, filp, dev_priv->agp_heap );
}
}
void i915_driver_register_fns(drm_device_t *dev)
{
dev->fn_tbl.pretakedown = i915_driver_pretakedown;
dev->fn_tbl.prerelease = i915_driver_prerelease;
}
...@@ -69,12 +69,6 @@ ...@@ -69,12 +69,6 @@
#define __HAVE_COUNTER7 _DRM_STAT_PRIMARY #define __HAVE_COUNTER7 _DRM_STAT_PRIMARY
#define __HAVE_COUNTER8 _DRM_STAT_SECONDARY #define __HAVE_COUNTER8 _DRM_STAT_SECONDARY
/* Driver customization:
*/
#define DRIVER_PRETAKEDOWN() do { \
mga_do_cleanup_dma( dev ); \
} while (0)
/* DMA customization: /* DMA customization:
*/ */
#define __HAVE_DMA 1 #define __HAVE_DMA 1
...@@ -82,17 +76,4 @@ ...@@ -82,17 +76,4 @@
#define __HAVE_VBL_IRQ 1 #define __HAVE_VBL_IRQ 1
#define __HAVE_SHARED_IRQ 1 #define __HAVE_SHARED_IRQ 1
#define __HAVE_DMA_QUIESCENT 1
#define DRIVER_DMA_QUIESCENT() do { \
drm_mga_private_t *dev_priv = dev->dev_private; \
return mga_do_wait_for_idle( dev_priv ); \
} while (0)
/* Buffer customization:
*/
#define DRIVER_BUF_PRIV_T drm_mga_buf_priv_t
#define DRIVER_AGP_BUFFERS_MAP( dev ) \
((drm_mga_private_t *)((dev)->dev_private))->buffers
#endif #endif
...@@ -500,7 +500,7 @@ static int mga_do_init_dma( drm_device_t *dev, drm_mga_init_t *init ) ...@@ -500,7 +500,7 @@ static int mga_do_init_dma( drm_device_t *dev, drm_mga_init_t *init )
return DRM_ERR(EINVAL); return DRM_ERR(EINVAL);
} }
DRM_FIND_MAP( dev_priv->mmio, init->mmio_offset ); dev_priv->mmio = drm_core_findmap(dev, init->mmio_offset);
if(!dev_priv->mmio) { if(!dev_priv->mmio) {
DRM_ERROR( "failed to find mmio region!\n" ); DRM_ERROR( "failed to find mmio region!\n" );
/* Assign dev_private so we can do cleanup. */ /* Assign dev_private so we can do cleanup. */
...@@ -508,7 +508,7 @@ static int mga_do_init_dma( drm_device_t *dev, drm_mga_init_t *init ) ...@@ -508,7 +508,7 @@ static int mga_do_init_dma( drm_device_t *dev, drm_mga_init_t *init )
mga_do_cleanup_dma( dev ); mga_do_cleanup_dma( dev );
return DRM_ERR(EINVAL); return DRM_ERR(EINVAL);
} }
DRM_FIND_MAP( dev_priv->status, init->status_offset ); dev_priv->status = drm_core_findmap(dev, init->status_offset);
if(!dev_priv->status) { if(!dev_priv->status) {
DRM_ERROR( "failed to find status page!\n" ); DRM_ERROR( "failed to find status page!\n" );
/* Assign dev_private so we can do cleanup. */ /* Assign dev_private so we can do cleanup. */
...@@ -516,8 +516,7 @@ static int mga_do_init_dma( drm_device_t *dev, drm_mga_init_t *init ) ...@@ -516,8 +516,7 @@ static int mga_do_init_dma( drm_device_t *dev, drm_mga_init_t *init )
mga_do_cleanup_dma( dev ); mga_do_cleanup_dma( dev );
return DRM_ERR(EINVAL); return DRM_ERR(EINVAL);
} }
dev_priv->warp = drm_core_findmap(dev, init->warp_offset);
DRM_FIND_MAP( dev_priv->warp, init->warp_offset );
if(!dev_priv->warp) { if(!dev_priv->warp) {
DRM_ERROR( "failed to find warp microcode region!\n" ); DRM_ERROR( "failed to find warp microcode region!\n" );
/* Assign dev_private so we can do cleanup. */ /* Assign dev_private so we can do cleanup. */
...@@ -525,7 +524,7 @@ static int mga_do_init_dma( drm_device_t *dev, drm_mga_init_t *init ) ...@@ -525,7 +524,7 @@ static int mga_do_init_dma( drm_device_t *dev, drm_mga_init_t *init )
mga_do_cleanup_dma( dev ); mga_do_cleanup_dma( dev );
return DRM_ERR(EINVAL); return DRM_ERR(EINVAL);
} }
DRM_FIND_MAP( dev_priv->primary, init->primary_offset ); dev_priv->primary = drm_core_findmap(dev, init->primary_offset);
if(!dev_priv->primary) { if(!dev_priv->primary) {
DRM_ERROR( "failed to find primary dma region!\n" ); DRM_ERROR( "failed to find primary dma region!\n" );
/* Assign dev_private so we can do cleanup. */ /* Assign dev_private so we can do cleanup. */
...@@ -533,8 +532,8 @@ static int mga_do_init_dma( drm_device_t *dev, drm_mga_init_t *init ) ...@@ -533,8 +532,8 @@ static int mga_do_init_dma( drm_device_t *dev, drm_mga_init_t *init )
mga_do_cleanup_dma( dev ); mga_do_cleanup_dma( dev );
return DRM_ERR(EINVAL); return DRM_ERR(EINVAL);
} }
DRM_FIND_MAP( dev_priv->buffers, init->buffers_offset ); dev->agp_buffer_map = drm_core_findmap(dev, init->buffers_offset);
if(!dev_priv->buffers) { if(!dev->agp_buffer_map) {
DRM_ERROR( "failed to find dma buffer region!\n" ); DRM_ERROR( "failed to find dma buffer region!\n" );
/* Assign dev_private so we can do cleanup. */ /* Assign dev_private so we can do cleanup. */
dev->dev_private = (void *)dev_priv; dev->dev_private = (void *)dev_priv;
...@@ -546,13 +545,13 @@ static int mga_do_init_dma( drm_device_t *dev, drm_mga_init_t *init ) ...@@ -546,13 +545,13 @@ static int mga_do_init_dma( drm_device_t *dev, drm_mga_init_t *init )
(drm_mga_sarea_t *)((u8 *)dev_priv->sarea->handle + (drm_mga_sarea_t *)((u8 *)dev_priv->sarea->handle +
init->sarea_priv_offset); init->sarea_priv_offset);
DRM_IOREMAP( dev_priv->warp, dev ); drm_core_ioremap( dev_priv->warp, dev );
DRM_IOREMAP( dev_priv->primary, dev ); drm_core_ioremap( dev_priv->primary, dev );
DRM_IOREMAP( dev_priv->buffers, dev ); drm_core_ioremap( dev->agp_buffer_map, dev );
if(!dev_priv->warp->handle || if(!dev_priv->warp->handle ||
!dev_priv->primary->handle || !dev_priv->primary->handle ||
!dev_priv->buffers->handle ) { !dev->agp_buffer_map->handle ) {
DRM_ERROR( "failed to ioremap agp regions!\n" ); DRM_ERROR( "failed to ioremap agp regions!\n" );
/* Assign dev_private so we can do cleanup. */ /* Assign dev_private so we can do cleanup. */
dev->dev_private = (void *)dev_priv; dev->dev_private = (void *)dev_priv;
...@@ -643,11 +642,11 @@ int mga_do_cleanup_dma( drm_device_t *dev ) ...@@ -643,11 +642,11 @@ int mga_do_cleanup_dma( drm_device_t *dev )
drm_mga_private_t *dev_priv = dev->dev_private; drm_mga_private_t *dev_priv = dev->dev_private;
if ( dev_priv->warp != NULL ) if ( dev_priv->warp != NULL )
DRM_IOREMAPFREE( dev_priv->warp, dev ); drm_core_ioremapfree( dev_priv->warp, dev );
if ( dev_priv->primary != NULL ) if ( dev_priv->primary != NULL )
DRM_IOREMAPFREE( dev_priv->primary, dev ); drm_core_ioremapfree( dev_priv->primary, dev );
if ( dev_priv->buffers != NULL ) if ( dev->agp_buffer_map != NULL )
DRM_IOREMAPFREE( dev_priv->buffers, dev ); drm_core_ioremapfree( dev->agp_buffer_map, dev );
if ( dev_priv->head != NULL ) { if ( dev_priv->head != NULL ) {
mga_freelist_cleanup( dev ); mga_freelist_cleanup( dev );
...@@ -800,3 +799,20 @@ int mga_dma_buffers( DRM_IOCTL_ARGS ) ...@@ -800,3 +799,20 @@ int mga_dma_buffers( DRM_IOCTL_ARGS )
return ret; return ret;
} }
static void mga_driver_pretakedown(drm_device_t *dev)
{
mga_do_cleanup_dma( dev );
}
static int mga_driver_dma_quiescent(drm_device_t *dev)
{
drm_mga_private_t *dev_priv = dev->dev_private;
return mga_do_wait_for_idle( dev_priv );
}
void mga_driver_register_fns(drm_device_t *dev)
{
dev->fn_tbl.pretakedown = mga_driver_pretakedown;
dev->fn_tbl.dma_quiescent = mga_driver_dma_quiescent;
}
...@@ -79,21 +79,6 @@ ...@@ -79,21 +79,6 @@
[DRM_IOCTL_NR(DRM_IOCTL_R128_INDIRECT)] = { r128_cce_indirect, 1, 1 }, \ [DRM_IOCTL_NR(DRM_IOCTL_R128_INDIRECT)] = { r128_cce_indirect, 1, 1 }, \
[DRM_IOCTL_NR(DRM_IOCTL_R128_GETPARAM)] = { r128_getparam, 1, 0 }, [DRM_IOCTL_NR(DRM_IOCTL_R128_GETPARAM)] = { r128_getparam, 1, 0 },
/* Driver customization:
*/
#define DRIVER_PRERELEASE() do { \
if ( dev->dev_private ) { \
drm_r128_private_t *dev_priv = dev->dev_private; \
if ( dev_priv->page_flipping ) { \
r128_do_cleanup_pageflip( dev ); \
} \
} \
} while (0)
#define DRIVER_PRETAKEDOWN() do { \
r128_do_cleanup_cce( dev ); \
} while (0)
/* DMA customization: /* DMA customization:
*/ */
#define __HAVE_DMA 1 #define __HAVE_DMA 1
...@@ -101,20 +86,4 @@ ...@@ -101,20 +86,4 @@
#define __HAVE_VBL_IRQ 1 #define __HAVE_VBL_IRQ 1
#define __HAVE_SHARED_IRQ 1 #define __HAVE_SHARED_IRQ 1
#if 0
/* GH: Remove this for now... */
#define __HAVE_DMA_QUIESCENT 1
#define DRIVER_DMA_QUIESCENT() do { \
drm_r128_private_t *dev_priv = dev->dev_private; \
return r128_do_cce_idle( dev_priv ); \
} while (0)
#endif
/* Buffer customization:
*/
#define DRIVER_BUF_PRIV_T drm_r128_buf_priv_t
#define DRIVER_AGP_BUFFERS_MAP( dev ) \
((drm_r128_private_t *)((dev)->dev_private))->buffers
#endif #endif
...@@ -467,29 +467,29 @@ static int r128_do_init_cce( drm_device_t *dev, drm_r128_init_t *init ) ...@@ -467,29 +467,29 @@ static int r128_do_init_cce( drm_device_t *dev, drm_r128_init_t *init )
return DRM_ERR(EINVAL); return DRM_ERR(EINVAL);
} }
DRM_FIND_MAP( dev_priv->mmio, init->mmio_offset ); dev_priv->mmio = drm_core_findmap(dev, init->mmio_offset);
if(!dev_priv->mmio) { if(!dev_priv->mmio) {
DRM_ERROR("could not find mmio region!\n"); DRM_ERROR("could not find mmio region!\n");
dev->dev_private = (void *)dev_priv; dev->dev_private = (void *)dev_priv;
r128_do_cleanup_cce( dev ); r128_do_cleanup_cce( dev );
return DRM_ERR(EINVAL); return DRM_ERR(EINVAL);
} }
DRM_FIND_MAP( dev_priv->cce_ring, init->ring_offset ); dev_priv->cce_ring = drm_core_findmap(dev, init->ring_offset);
if(!dev_priv->cce_ring) { if(!dev_priv->cce_ring) {
DRM_ERROR("could not find cce ring region!\n"); DRM_ERROR("could not find cce ring region!\n");
dev->dev_private = (void *)dev_priv; dev->dev_private = (void *)dev_priv;
r128_do_cleanup_cce( dev ); r128_do_cleanup_cce( dev );
return DRM_ERR(EINVAL); return DRM_ERR(EINVAL);
} }
DRM_FIND_MAP( dev_priv->ring_rptr, init->ring_rptr_offset ); dev_priv->ring_rptr = drm_core_findmap(dev, init->ring_rptr_offset);
if(!dev_priv->ring_rptr) { if(!dev_priv->ring_rptr) {
DRM_ERROR("could not find ring read pointer!\n"); DRM_ERROR("could not find ring read pointer!\n");
dev->dev_private = (void *)dev_priv; dev->dev_private = (void *)dev_priv;
r128_do_cleanup_cce( dev ); r128_do_cleanup_cce( dev );
return DRM_ERR(EINVAL); return DRM_ERR(EINVAL);
} }
DRM_FIND_MAP( dev_priv->buffers, init->buffers_offset ); dev->agp_buffer_map = drm_core_findmap(dev, init->buffers_offset);
if(!dev_priv->buffers) { if(!dev->agp_buffer_map) {
DRM_ERROR("could not find dma buffer region!\n"); DRM_ERROR("could not find dma buffer region!\n");
dev->dev_private = (void *)dev_priv; dev->dev_private = (void *)dev_priv;
r128_do_cleanup_cce( dev ); r128_do_cleanup_cce( dev );
...@@ -497,8 +497,7 @@ static int r128_do_init_cce( drm_device_t *dev, drm_r128_init_t *init ) ...@@ -497,8 +497,7 @@ static int r128_do_init_cce( drm_device_t *dev, drm_r128_init_t *init )
} }
if ( !dev_priv->is_pci ) { if ( !dev_priv->is_pci ) {
DRM_FIND_MAP( dev_priv->agp_textures, dev_priv->agp_textures = drm_core_findmap(dev, init->agp_textures_offset);
init->agp_textures_offset );
if(!dev_priv->agp_textures) { if(!dev_priv->agp_textures) {
DRM_ERROR("could not find agp texture region!\n"); DRM_ERROR("could not find agp texture region!\n");
dev->dev_private = (void *)dev_priv; dev->dev_private = (void *)dev_priv;
...@@ -513,12 +512,12 @@ static int r128_do_init_cce( drm_device_t *dev, drm_r128_init_t *init ) ...@@ -513,12 +512,12 @@ static int r128_do_init_cce( drm_device_t *dev, drm_r128_init_t *init )
#if __REALLY_HAVE_AGP #if __REALLY_HAVE_AGP
if ( !dev_priv->is_pci ) { if ( !dev_priv->is_pci ) {
DRM_IOREMAP( dev_priv->cce_ring, dev ); drm_core_ioremap( dev_priv->cce_ring, dev );
DRM_IOREMAP( dev_priv->ring_rptr, dev ); drm_core_ioremap( dev_priv->ring_rptr, dev );
DRM_IOREMAP( dev_priv->buffers, dev ); drm_core_ioremap( dev->agp_buffer_map, dev );
if(!dev_priv->cce_ring->handle || if(!dev_priv->cce_ring->handle ||
!dev_priv->ring_rptr->handle || !dev_priv->ring_rptr->handle ||
!dev_priv->buffers->handle) { !dev->agp_buffer_map->handle) {
DRM_ERROR("Could not ioremap agp regions!\n"); DRM_ERROR("Could not ioremap agp regions!\n");
dev->dev_private = (void *)dev_priv; dev->dev_private = (void *)dev_priv;
r128_do_cleanup_cce( dev ); r128_do_cleanup_cce( dev );
...@@ -531,7 +530,7 @@ static int r128_do_init_cce( drm_device_t *dev, drm_r128_init_t *init ) ...@@ -531,7 +530,7 @@ static int r128_do_init_cce( drm_device_t *dev, drm_r128_init_t *init )
(void *)dev_priv->cce_ring->offset; (void *)dev_priv->cce_ring->offset;
dev_priv->ring_rptr->handle = dev_priv->ring_rptr->handle =
(void *)dev_priv->ring_rptr->offset; (void *)dev_priv->ring_rptr->offset;
dev_priv->buffers->handle = (void *)dev_priv->buffers->offset; dev->agp_buffer_map->handle = (void *)dev->agp_buffer_map->offset;
} }
#if __REALLY_HAVE_AGP #if __REALLY_HAVE_AGP
...@@ -601,11 +600,11 @@ int r128_do_cleanup_cce( drm_device_t *dev ) ...@@ -601,11 +600,11 @@ int r128_do_cleanup_cce( drm_device_t *dev )
#if __REALLY_HAVE_AGP #if __REALLY_HAVE_AGP
if ( !dev_priv->is_pci ) { if ( !dev_priv->is_pci ) {
if ( dev_priv->cce_ring != NULL ) if ( dev_priv->cce_ring != NULL )
DRM_IOREMAPFREE( dev_priv->cce_ring, dev ); drm_core_ioremapfree( dev_priv->cce_ring, dev );
if ( dev_priv->ring_rptr != NULL ) if ( dev_priv->ring_rptr != NULL )
DRM_IOREMAPFREE( dev_priv->ring_rptr, dev ); drm_core_ioremapfree( dev_priv->ring_rptr, dev );
if ( dev_priv->buffers != NULL ) if ( dev->agp_buffer_map != NULL )
DRM_IOREMAPFREE( dev_priv->buffers, dev ); drm_core_ioremapfree( dev->agp_buffer_map, dev );
} else } else
#endif #endif
{ {
......
...@@ -100,7 +100,6 @@ typedef struct drm_r128_private { ...@@ -100,7 +100,6 @@ typedef struct drm_r128_private {
drm_local_map_t *mmio; drm_local_map_t *mmio;
drm_local_map_t *cce_ring; drm_local_map_t *cce_ring;
drm_local_map_t *ring_rptr; drm_local_map_t *ring_rptr;
drm_local_map_t *buffers;
drm_local_map_t *agp_textures; drm_local_map_t *agp_textures;
} drm_r128_private_t; } drm_r128_private_t;
......
...@@ -667,7 +667,7 @@ static void r128_cce_dispatch_indirect( drm_device_t *dev, ...@@ -667,7 +667,7 @@ static void r128_cce_dispatch_indirect( drm_device_t *dev,
*/ */
if ( dwords & 1 ) { if ( dwords & 1 ) {
u32 *data = (u32 *) u32 *data = (u32 *)
((char *)dev_priv->buffers->handle ((char *)dev->agp_buffer_map->handle
+ buf->offset + start); + buf->offset + start);
data[dwords++] = cpu_to_le32( R128_CCE_PACKET2 ); data[dwords++] = cpu_to_le32( R128_CCE_PACKET2 );
} }
...@@ -713,7 +713,7 @@ static void r128_cce_dispatch_indices( drm_device_t *dev, ...@@ -713,7 +713,7 @@ static void r128_cce_dispatch_indices( drm_device_t *dev,
drm_r128_buf_priv_t *buf_priv = buf->dev_private; drm_r128_buf_priv_t *buf_priv = buf->dev_private;
drm_r128_sarea_t *sarea_priv = dev_priv->sarea_priv; drm_r128_sarea_t *sarea_priv = dev_priv->sarea_priv;
int format = sarea_priv->vc_format; int format = sarea_priv->vc_format;
int offset = dev_priv->buffers->offset - dev_priv->cce_buffers_offset; int offset = dev->agp_buffer_map->offset - dev_priv->cce_buffers_offset;
int prim = buf_priv->prim; int prim = buf_priv->prim;
u32 *data; u32 *data;
int dwords; int dwords;
...@@ -733,7 +733,7 @@ static void r128_cce_dispatch_indices( drm_device_t *dev, ...@@ -733,7 +733,7 @@ static void r128_cce_dispatch_indices( drm_device_t *dev,
dwords = (end - start + 3) / sizeof(u32); dwords = (end - start + 3) / sizeof(u32);
data = (u32 *)((char *)dev_priv->buffers->handle data = (u32 *)((char *)dev->agp_buffer_map->handle
+ buf->offset + start); + buf->offset + start);
data[0] = cpu_to_le32( CCE_PACKET3( R128_3D_RNDR_GEN_INDX_PRIM, data[0] = cpu_to_le32( CCE_PACKET3( R128_3D_RNDR_GEN_INDX_PRIM,
...@@ -857,7 +857,7 @@ static int r128_cce_dispatch_blit( DRMFILE filp, ...@@ -857,7 +857,7 @@ static int r128_cce_dispatch_blit( DRMFILE filp,
dwords = (blit->width * blit->height) >> dword_shift; dwords = (blit->width * blit->height) >> dword_shift;
data = (u32 *)((char *)dev_priv->buffers->handle + buf->offset); data = (u32 *)((char *)dev->agp_buffer_map->handle + buf->offset);
data[0] = cpu_to_le32( CCE_PACKET3( R128_CNTL_HOSTDATA_BLT, dwords + 6 ) ); data[0] = cpu_to_le32( CCE_PACKET3( R128_CNTL_HOSTDATA_BLT, dwords + 6 ) );
data[1] = cpu_to_le32( (R128_GMC_DST_PITCH_OFFSET_CNTL | data[1] = cpu_to_le32( (R128_GMC_DST_PITCH_OFFSET_CNTL |
...@@ -1694,3 +1694,25 @@ int r128_getparam( DRM_IOCTL_ARGS ) ...@@ -1694,3 +1694,25 @@ int r128_getparam( DRM_IOCTL_ARGS )
return 0; return 0;
} }
static void r128_driver_prerelease(drm_device_t *dev, DRMFILE filp)
{
if ( dev->dev_private ) {
drm_r128_private_t *dev_priv = dev->dev_private;
if ( dev_priv->page_flipping ) {
r128_do_cleanup_pageflip( dev );
}
}
}
static void r128_driver_pretakedown(drm_device_t *dev)
{
r128_do_cleanup_cce( dev );
}
void r128_driver_register_fns(drm_device_t *dev)
{
dev->dev_priv_size = sizeof(drm_r128_buf_priv_t);
dev->fn_tbl.prerelease = r128_driver_prerelease;
dev->fn_tbl.pretakedown = r128_driver_pretakedown;
}
...@@ -118,43 +118,6 @@ ...@@ -118,43 +118,6 @@
#define DRIVER_FILE_FIELDS \ #define DRIVER_FILE_FIELDS \
int64_t radeon_fb_delta; \ int64_t radeon_fb_delta; \
#define DRIVER_OPEN_HELPER( filp_priv, dev ) \
do { \
drm_radeon_private_t *dev_priv = dev->dev_private; \
if ( dev_priv ) \
filp_priv->radeon_fb_delta = dev_priv->fb_location; \
else \
filp_priv->radeon_fb_delta = 0; \
} while( 0 )
/* When a client dies:
* - Check for and clean up flipped page state
* - Free any alloced GART memory.
*
* DRM infrastructure takes care of reclaiming dma buffers.
*/
#define DRIVER_PRERELEASE() \
do { \
if ( dev->dev_private ) { \
drm_radeon_private_t *dev_priv = dev->dev_private; \
if ( dev_priv->page_flipping ) { \
radeon_do_cleanup_pageflip( dev ); \
} \
radeon_mem_release( filp, dev_priv->gart_heap ); \
radeon_mem_release( filp, dev_priv->fb_heap ); \
} \
} while (0)
/* When the last client dies, shut down the CP and free dev->dev_priv.
*/
/* #define __HAVE_RELEASE 1 */
#define DRIVER_PRETAKEDOWN() \
do { \
radeon_do_release( dev ); \
} while (0)
/* DMA customization: /* DMA customization:
*/ */
#define __HAVE_DMA 1 #define __HAVE_DMA 1
...@@ -162,12 +125,4 @@ do { \ ...@@ -162,12 +125,4 @@ do { \
#define __HAVE_VBL_IRQ 1 #define __HAVE_VBL_IRQ 1
#define __HAVE_SHARED_IRQ 1 #define __HAVE_SHARED_IRQ 1
/* Buffer customization:
*/
#define DRIVER_BUF_PRIV_T drm_radeon_buf_priv_t
#define DRIVER_AGP_BUFFERS_MAP( dev ) \
((drm_radeon_private_t *)((dev)->dev_private))->buffers
#endif #endif
...@@ -1118,29 +1118,29 @@ static int radeon_do_init_cp( drm_device_t *dev, drm_radeon_init_t *init ) ...@@ -1118,29 +1118,29 @@ static int radeon_do_init_cp( drm_device_t *dev, drm_radeon_init_t *init )
return DRM_ERR(EINVAL); return DRM_ERR(EINVAL);
} }
DRM_FIND_MAP( dev_priv->mmio, init->mmio_offset ); dev_priv->mmio = drm_core_findmap(dev, init->mmio_offset);
if(!dev_priv->mmio) { if(!dev_priv->mmio) {
DRM_ERROR("could not find mmio region!\n"); DRM_ERROR("could not find mmio region!\n");
dev->dev_private = (void *)dev_priv; dev->dev_private = (void *)dev_priv;
radeon_do_cleanup_cp(dev); radeon_do_cleanup_cp(dev);
return DRM_ERR(EINVAL); return DRM_ERR(EINVAL);
} }
DRM_FIND_MAP( dev_priv->cp_ring, init->ring_offset ); dev_priv->cp_ring = drm_core_findmap(dev, init->ring_offset);
if(!dev_priv->cp_ring) { if(!dev_priv->cp_ring) {
DRM_ERROR("could not find cp ring region!\n"); DRM_ERROR("could not find cp ring region!\n");
dev->dev_private = (void *)dev_priv; dev->dev_private = (void *)dev_priv;
radeon_do_cleanup_cp(dev); radeon_do_cleanup_cp(dev);
return DRM_ERR(EINVAL); return DRM_ERR(EINVAL);
} }
DRM_FIND_MAP( dev_priv->ring_rptr, init->ring_rptr_offset ); dev_priv->ring_rptr = drm_core_findmap(dev, init->ring_rptr_offset);
if(!dev_priv->ring_rptr) { if(!dev_priv->ring_rptr) {
DRM_ERROR("could not find ring read pointer!\n"); DRM_ERROR("could not find ring read pointer!\n");
dev->dev_private = (void *)dev_priv; dev->dev_private = (void *)dev_priv;
radeon_do_cleanup_cp(dev); radeon_do_cleanup_cp(dev);
return DRM_ERR(EINVAL); return DRM_ERR(EINVAL);
} }
DRM_FIND_MAP( dev_priv->buffers, init->buffers_offset ); dev->agp_buffer_map = drm_core_findmap(dev, init->buffers_offset);
if(!dev_priv->buffers) { if(!dev->agp_buffer_map) {
DRM_ERROR("could not find dma buffer region!\n"); DRM_ERROR("could not find dma buffer region!\n");
dev->dev_private = (void *)dev_priv; dev->dev_private = (void *)dev_priv;
radeon_do_cleanup_cp(dev); radeon_do_cleanup_cp(dev);
...@@ -1148,7 +1148,7 @@ static int radeon_do_init_cp( drm_device_t *dev, drm_radeon_init_t *init ) ...@@ -1148,7 +1148,7 @@ static int radeon_do_init_cp( drm_device_t *dev, drm_radeon_init_t *init )
} }
if ( init->gart_textures_offset ) { if ( init->gart_textures_offset ) {
DRM_FIND_MAP( dev_priv->gart_textures, init->gart_textures_offset ); dev_priv->gart_textures = drm_core_findmap(dev, init->gart_textures_offset);
if ( !dev_priv->gart_textures ) { if ( !dev_priv->gart_textures ) {
DRM_ERROR("could not find GART texture region!\n"); DRM_ERROR("could not find GART texture region!\n");
dev->dev_private = (void *)dev_priv; dev->dev_private = (void *)dev_priv;
...@@ -1163,12 +1163,12 @@ static int radeon_do_init_cp( drm_device_t *dev, drm_radeon_init_t *init ) ...@@ -1163,12 +1163,12 @@ static int radeon_do_init_cp( drm_device_t *dev, drm_radeon_init_t *init )
#if __REALLY_HAVE_AGP #if __REALLY_HAVE_AGP
if ( !dev_priv->is_pci ) { if ( !dev_priv->is_pci ) {
DRM_IOREMAP( dev_priv->cp_ring, dev ); drm_core_ioremap( dev_priv->cp_ring, dev );
DRM_IOREMAP( dev_priv->ring_rptr, dev ); drm_core_ioremap( dev_priv->ring_rptr, dev );
DRM_IOREMAP( dev_priv->buffers, dev ); drm_core_ioremap( dev->agp_buffer_map, dev );
if(!dev_priv->cp_ring->handle || if(!dev_priv->cp_ring->handle ||
!dev_priv->ring_rptr->handle || !dev_priv->ring_rptr->handle ||
!dev_priv->buffers->handle) { !dev->agp_buffer_map->handle) {
DRM_ERROR("could not find ioremap agp regions!\n"); DRM_ERROR("could not find ioremap agp regions!\n");
dev->dev_private = (void *)dev_priv; dev->dev_private = (void *)dev_priv;
radeon_do_cleanup_cp(dev); radeon_do_cleanup_cp(dev);
...@@ -1181,14 +1181,14 @@ static int radeon_do_init_cp( drm_device_t *dev, drm_radeon_init_t *init ) ...@@ -1181,14 +1181,14 @@ static int radeon_do_init_cp( drm_device_t *dev, drm_radeon_init_t *init )
(void *)dev_priv->cp_ring->offset; (void *)dev_priv->cp_ring->offset;
dev_priv->ring_rptr->handle = dev_priv->ring_rptr->handle =
(void *)dev_priv->ring_rptr->offset; (void *)dev_priv->ring_rptr->offset;
dev_priv->buffers->handle = (void *)dev_priv->buffers->offset; dev->agp_buffer_map->handle = (void *)dev->agp_buffer_map->offset;
DRM_DEBUG( "dev_priv->cp_ring->handle %p\n", DRM_DEBUG( "dev_priv->cp_ring->handle %p\n",
dev_priv->cp_ring->handle ); dev_priv->cp_ring->handle );
DRM_DEBUG( "dev_priv->ring_rptr->handle %p\n", DRM_DEBUG( "dev_priv->ring_rptr->handle %p\n",
dev_priv->ring_rptr->handle ); dev_priv->ring_rptr->handle );
DRM_DEBUG( "dev_priv->buffers->handle %p\n", DRM_DEBUG( "dev->agp_buffer_map->handle %p\n",
dev_priv->buffers->handle ); dev->agp_buffer_map->handle );
} }
dev_priv->fb_location = ( RADEON_READ( RADEON_MC_FB_LOCATION ) dev_priv->fb_location = ( RADEON_READ( RADEON_MC_FB_LOCATION )
...@@ -1213,12 +1213,12 @@ static int radeon_do_init_cp( drm_device_t *dev, drm_radeon_init_t *init ) ...@@ -1213,12 +1213,12 @@ static int radeon_do_init_cp( drm_device_t *dev, drm_radeon_init_t *init )
#if __REALLY_HAVE_AGP #if __REALLY_HAVE_AGP
if ( !dev_priv->is_pci ) if ( !dev_priv->is_pci )
dev_priv->gart_buffers_offset = (dev_priv->buffers->offset dev_priv->gart_buffers_offset = (dev->agp_buffer_map->offset
- dev->agp->base - dev->agp->base
+ dev_priv->gart_vm_start); + dev_priv->gart_vm_start);
else else
#endif #endif
dev_priv->gart_buffers_offset = (dev_priv->buffers->offset dev_priv->gart_buffers_offset = (dev->agp_buffer_map->offset
- dev->sg->handle - dev->sg->handle
+ dev_priv->gart_vm_start); + dev_priv->gart_vm_start);
...@@ -1289,11 +1289,11 @@ int radeon_do_cleanup_cp( drm_device_t *dev ) ...@@ -1289,11 +1289,11 @@ int radeon_do_cleanup_cp( drm_device_t *dev )
#if __REALLY_HAVE_AGP #if __REALLY_HAVE_AGP
if ( !dev_priv->is_pci ) { if ( !dev_priv->is_pci ) {
if ( dev_priv->cp_ring != NULL ) if ( dev_priv->cp_ring != NULL )
DRM_IOREMAPFREE( dev_priv->cp_ring, dev ); drm_core_ioremapfree( dev_priv->cp_ring, dev );
if ( dev_priv->ring_rptr != NULL ) if ( dev_priv->ring_rptr != NULL )
DRM_IOREMAPFREE( dev_priv->ring_rptr, dev ); drm_core_ioremapfree( dev_priv->ring_rptr, dev );
if ( dev_priv->buffers != NULL ) if ( dev->agp_buffer_map != NULL )
DRM_IOREMAPFREE( dev_priv->buffers, dev ); drm_core_ioremapfree( dev->agp_buffer_map, dev );
} else } else
#endif #endif
{ {
......
...@@ -138,7 +138,6 @@ typedef struct drm_radeon_private { ...@@ -138,7 +138,6 @@ typedef struct drm_radeon_private {
drm_local_map_t *mmio; drm_local_map_t *mmio;
drm_local_map_t *cp_ring; drm_local_map_t *cp_ring;
drm_local_map_t *ring_rptr; drm_local_map_t *ring_rptr;
drm_local_map_t *buffers;
drm_local_map_t *gart_textures; drm_local_map_t *gart_textures;
struct mem_block *gart_heap; struct mem_block *gart_heap;
......
...@@ -1247,7 +1247,7 @@ static void radeon_cp_dispatch_indirect( drm_device_t *dev, ...@@ -1247,7 +1247,7 @@ static void radeon_cp_dispatch_indirect( drm_device_t *dev,
*/ */
if ( dwords & 1 ) { if ( dwords & 1 ) {
u32 *data = (u32 *) u32 *data = (u32 *)
((char *)dev_priv->buffers->handle ((char *)dev->agp_buffer_map->handle
+ buf->offset + start); + buf->offset + start);
data[dwords++] = RADEON_CP_PACKET2; data[dwords++] = RADEON_CP_PACKET2;
} }
...@@ -1301,7 +1301,7 @@ static void radeon_cp_dispatch_indices( drm_device_t *dev, ...@@ -1301,7 +1301,7 @@ static void radeon_cp_dispatch_indices( drm_device_t *dev,
dwords = (prim->finish - prim->start + 3) / sizeof(u32); dwords = (prim->finish - prim->start + 3) / sizeof(u32);
data = (u32 *)((char *)dev_priv->buffers->handle + data = (u32 *)((char *)dev->agp_buffer_map->handle +
elt_buf->offset + prim->start); elt_buf->offset + prim->start);
data[0] = CP_PACKET3( RADEON_3D_RNDR_GEN_INDX_PRIM, dwords-2 ); data[0] = CP_PACKET3( RADEON_3D_RNDR_GEN_INDX_PRIM, dwords-2 );
...@@ -1445,7 +1445,7 @@ static int radeon_cp_dispatch_texture( DRMFILE filp, ...@@ -1445,7 +1445,7 @@ static int radeon_cp_dispatch_texture( DRMFILE filp,
/* Dispatch the indirect buffer. /* Dispatch the indirect buffer.
*/ */
buffer = (u32*)((char*)dev_priv->buffers->handle + buf->offset); buffer = (u32*)((char*)dev->agp_buffer_map->handle + buf->offset);
dwords = size / 4; dwords = size / 4;
buffer[0] = CP_PACKET3( RADEON_CNTL_HOSTDATA_BLT, dwords + 6 ); buffer[0] = CP_PACKET3( RADEON_CNTL_HOSTDATA_BLT, dwords + 6 );
buffer[1] = (RADEON_GMC_DST_PITCH_OFFSET_CNTL | buffer[1] = (RADEON_GMC_DST_PITCH_OFFSET_CNTL |
...@@ -2547,3 +2547,43 @@ int radeon_cp_setparam( DRM_IOCTL_ARGS ) { ...@@ -2547,3 +2547,43 @@ int radeon_cp_setparam( DRM_IOCTL_ARGS ) {
return 0; return 0;
} }
/* When a client dies:
* - Check for and clean up flipped page state
* - Free any alloced GART memory.
*
* DRM infrastructure takes care of reclaiming dma buffers.
*/
static void radeon_driver_prerelease(drm_device_t *dev, DRMFILE filp)
{
if ( dev->dev_private ) {
drm_radeon_private_t *dev_priv = dev->dev_private;
if ( dev_priv->page_flipping ) {
radeon_do_cleanup_pageflip( dev );
}
radeon_mem_release( filp, dev_priv->gart_heap );
radeon_mem_release( filp, dev_priv->fb_heap );
}
}
static void radeon_driver_pretakedown(drm_device_t *dev)
{
radeon_do_release(dev);
}
static void radeon_driver_open_helper(drm_device_t *dev, drm_file_t *filp_priv)
{
drm_radeon_private_t *dev_priv = dev->dev_private;
if ( dev_priv )
filp_priv->radeon_fb_delta = dev_priv->fb_location;
else
filp_priv->radeon_fb_delta = 0;
}
void radeon_driver_register_fns(struct drm_device *dev)
{
dev->dev_priv_size = sizeof(drm_radeon_buf_priv_t);
dev->fn_tbl.prerelease = radeon_driver_prerelease;
dev->fn_tbl.pretakedown = radeon_driver_pretakedown;
dev->fn_tbl.open_helper = radeon_driver_open_helper;
}
...@@ -64,15 +64,4 @@ ...@@ -64,15 +64,4 @@
#define __HAVE_COUNTERS 5 #define __HAVE_COUNTERS 5
/* Buffer customization:
*/
#define DRIVER_AGP_BUFFERS_MAP( dev ) \
((drm_sis_private_t *)((dev)->dev_private))->buffers
extern int sis_init_context(int context);
extern int sis_final_context(int context);
#define DRIVER_CTX_CTOR sis_init_context
#define DRIVER_CTX_DTOR sis_final_context
#endif #endif
...@@ -46,3 +46,4 @@ ...@@ -46,3 +46,4 @@
#include "drm_proc.h" #include "drm_proc.h"
#include "drm_vm.h" #include "drm_vm.h"
#include "drm_stub.h" #include "drm_stub.h"
...@@ -31,8 +31,6 @@ ...@@ -31,8 +31,6 @@
#include "sis_ds.h" #include "sis_ds.h"
typedef struct drm_sis_private { typedef struct drm_sis_private {
drm_map_t *buffers;
memHeap_t *AGPHeap; memHeap_t *AGPHeap;
memHeap_t *FBHeap; memHeap_t *FBHeap;
} drm_sis_private_t; } drm_sis_private_t;
......
...@@ -326,7 +326,7 @@ int sis_ioctl_agp_free( DRM_IOCTL_ARGS ) ...@@ -326,7 +326,7 @@ int sis_ioctl_agp_free( DRM_IOCTL_ARGS )
return 0; return 0;
} }
int sis_init_context(int context) int sis_init_context(struct drm_device *dev, int context)
{ {
int i; int i;
...@@ -358,7 +358,7 @@ int sis_init_context(int context) ...@@ -358,7 +358,7 @@ int sis_init_context(int context)
return 1; return 1;
} }
int sis_final_context(int context) int sis_final_context(struct drm_device *dev, int context)
{ {
int i; int i;
...@@ -404,3 +404,9 @@ int sis_final_context(int context) ...@@ -404,3 +404,9 @@ int sis_final_context(int context)
return 1; return 1;
} }
void DRM(driver_register_fns)(drm_device_t *dev)
{
dev->fn_tbl.context_ctor = sis_init_context;
dev->fn_tbl.context_dtor = sis_final_context;
}
...@@ -49,3 +49,8 @@ ...@@ -49,3 +49,8 @@
#include "drm_proc.h" #include "drm_proc.h"
#include "drm_vm.h" #include "drm_vm.h"
#include "drm_stub.h" #include "drm_stub.h"
void DRM(driver_register_fns)(drm_device_t *dev)
{
}
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment