more OS dependency separation

This commit is contained in:
Alan Hourihane 2001-04-27 10:16:26 +00:00
parent eb2501e637
commit b9cb2e1fdc
8 changed files with 412 additions and 232 deletions

View file

@ -59,12 +59,12 @@ typedef u_int32_t u32;
#define atomic_sub(n, p) atomic_subtract_long(p, n)
/* Fake this */
static __inline unsigned long
static __inline unsigned int
test_and_set_bit(int b, volatile unsigned long *p)
{
int s = splhigh();
unsigned long m = 1<<b;
unsigned long r = *p & m;
unsigned int m = 1<<b;
unsigned int r = *p & m;
*p |= m;
splx(s);
return r;
@ -179,3 +179,77 @@ find_first_zero_bit(volatile unsigned long *p, int max)
} \
} \
} while (0)
/* Internal functions */
/* drm_drv.h */
extern d_ioctl_t DRM(ioctl);
extern d_ioctl_t DRM(lock);
extern d_ioctl_t DRM(unlock);
/* Misc. IOCTL support (drm_ioctl.h) */
extern d_ioctl_t DRM(irq_busid);
extern d_ioctl_t DRM(getunique);
extern d_ioctl_t DRM(setunique);
extern d_ioctl_t DRM(getmap);
extern d_ioctl_t DRM(getclient);
extern d_ioctl_t DRM(getstats);
/* Context IOCTL support (drm_context.h) */
extern d_ioctl_t DRM(resctx);
extern d_ioctl_t DRM(addctx);
extern d_ioctl_t DRM(modctx);
extern d_ioctl_t DRM(getctx);
extern d_ioctl_t DRM(switchctx);
extern d_ioctl_t DRM(newctx);
extern d_ioctl_t DRM(rmctx);
extern d_ioctl_t DRM(setsareactx);
extern d_ioctl_t DRM(getsareactx);
/* Drawable IOCTL support (drm_drawable.h) */
extern d_ioctl_t DRM(adddraw);
extern d_ioctl_t DRM(rmdraw);
/* Authentication IOCTL support (drm_auth.h) */
extern d_ioctl_t DRM(getmagic);
extern d_ioctl_t DRM(authmagic);
/* Locking IOCTL support (drm_lock.h) */
extern d_ioctl_t DRM(block);
extern d_ioctl_t DRM(unblock);
extern d_ioctl_t DRM(finish);
/* Buffer management support (drm_bufs.h) */
extern d_ioctl_t DRM(addmap);
extern d_ioctl_t DRM(rmmap);
#if __HAVE_DMA
extern d_ioctl_t DRM(addbufs);
extern d_ioctl_t DRM(infobufs);
extern d_ioctl_t DRM(markbufs);
extern d_ioctl_t DRM(freebufs);
extern d_ioctl_t DRM(mapbufs);
#endif
/* DMA support (drm_dma.h) */
#if __HAVE_DMA_IRQ
extern d_ioctl_t DRM(control);
#endif
/* AGP/GART support (drm_agpsupport.h) */
#if __REALLY_HAVE_AGP
extern d_ioctl_t DRM(agp_acquire);
extern d_ioctl_t DRM(agp_release);
extern d_ioctl_t DRM(agp_enable);
extern d_ioctl_t DRM(agp_info);
extern d_ioctl_t DRM(agp_alloc);
extern d_ioctl_t DRM(agp_free);
extern d_ioctl_t DRM(agp_unbind);
extern d_ioctl_t DRM(agp_bind);
#endif
/* Scatter Gather Support (drm_scatter.h) */
#if __HAVE_SG
extern d_ioctl_t DRM(sg_alloc);
extern d_ioctl_t DRM(sg_free);
#endif

View file

@ -59,12 +59,12 @@ typedef u_int32_t u32;
#define atomic_sub(n, p) atomic_subtract_long(p, n)
/* Fake this */
static __inline unsigned long
static __inline unsigned int
test_and_set_bit(int b, volatile unsigned long *p)
{
int s = splhigh();
unsigned long m = 1<<b;
unsigned long r = *p & m;
unsigned int m = 1<<b;
unsigned int r = *p & m;
*p |= m;
splx(s);
return r;
@ -179,3 +179,77 @@ find_first_zero_bit(volatile unsigned long *p, int max)
} \
} \
} while (0)
/* Internal functions */
/* drm_drv.h */
extern d_ioctl_t DRM(ioctl);
extern d_ioctl_t DRM(lock);
extern d_ioctl_t DRM(unlock);
/* Misc. IOCTL support (drm_ioctl.h) */
extern d_ioctl_t DRM(irq_busid);
extern d_ioctl_t DRM(getunique);
extern d_ioctl_t DRM(setunique);
extern d_ioctl_t DRM(getmap);
extern d_ioctl_t DRM(getclient);
extern d_ioctl_t DRM(getstats);
/* Context IOCTL support (drm_context.h) */
extern d_ioctl_t DRM(resctx);
extern d_ioctl_t DRM(addctx);
extern d_ioctl_t DRM(modctx);
extern d_ioctl_t DRM(getctx);
extern d_ioctl_t DRM(switchctx);
extern d_ioctl_t DRM(newctx);
extern d_ioctl_t DRM(rmctx);
extern d_ioctl_t DRM(setsareactx);
extern d_ioctl_t DRM(getsareactx);
/* Drawable IOCTL support (drm_drawable.h) */
extern d_ioctl_t DRM(adddraw);
extern d_ioctl_t DRM(rmdraw);
/* Authentication IOCTL support (drm_auth.h) */
extern d_ioctl_t DRM(getmagic);
extern d_ioctl_t DRM(authmagic);
/* Locking IOCTL support (drm_lock.h) */
extern d_ioctl_t DRM(block);
extern d_ioctl_t DRM(unblock);
extern d_ioctl_t DRM(finish);
/* Buffer management support (drm_bufs.h) */
extern d_ioctl_t DRM(addmap);
extern d_ioctl_t DRM(rmmap);
#if __HAVE_DMA
extern d_ioctl_t DRM(addbufs);
extern d_ioctl_t DRM(infobufs);
extern d_ioctl_t DRM(markbufs);
extern d_ioctl_t DRM(freebufs);
extern d_ioctl_t DRM(mapbufs);
#endif
/* DMA support (drm_dma.h) */
#if __HAVE_DMA_IRQ
extern d_ioctl_t DRM(control);
#endif
/* AGP/GART support (drm_agpsupport.h) */
#if __REALLY_HAVE_AGP
extern d_ioctl_t DRM(agp_acquire);
extern d_ioctl_t DRM(agp_release);
extern d_ioctl_t DRM(agp_enable);
extern d_ioctl_t DRM(agp_info);
extern d_ioctl_t DRM(agp_alloc);
extern d_ioctl_t DRM(agp_free);
extern d_ioctl_t DRM(agp_unbind);
extern d_ioctl_t DRM(agp_bind);
#endif
/* Scatter Gather Support (drm_scatter.h) */
#if __HAVE_SG
extern d_ioctl_t DRM(sg_alloc);
extern d_ioctl_t DRM(sg_free);
#endif

View file

@ -547,15 +547,20 @@ extern int DRM(flags);
extern void DRM(parse_options)( char *s );
extern int DRM(cpu_valid)( void );
/* Authentication (drm_auth.h) */
extern int DRM(add_magic)(drm_device_t *dev, drm_file_t *priv,
drm_magic_t magic);
extern int DRM(remove_magic)(drm_device_t *dev, drm_magic_t magic);
/* Driver support (drm_drv.h) */
extern int DRM(version)( DRM_OS_IOCTL );
#ifdef __linux__
extern int DRM(open)(struct inode *inode, struct file *filp);
extern int DRM(release)(struct inode *inode, struct file *filp);
extern int DRM(ioctl)( DRM_OS_IOCTL );
extern int DRM(lock)( DRM_OS_IOCTL );
extern int DRM(unlock)( DRM_OS_IOCTL );
#endif
/* Device support (drm_fops.h) */
#ifdef __linux__
extern int DRM(open_helper)(struct inode *inode, struct file *filp,
drm_device_t *dev);
extern int DRM(flush)(struct file *filp);
@ -566,6 +571,10 @@ extern ssize_t DRM(read)(struct file *filp, char *buf, size_t count,
extern int DRM(write_string)(drm_device_t *dev, const char *s);
extern unsigned int DRM(poll)(struct file *filp,
struct poll_table_struct *wait);
#endif
#ifdef __FreeBSD__
extern drm_file_t *DRM(find_file_by_proc)(drm_device_t *dev, struct proc *p);
#endif
/* Mapping support (drm_vm.h) */
#if LINUX_VERSION_CODE < 0x020317
@ -634,23 +643,6 @@ extern int DRM(unbind_agp)(void *handle);
#endif
#endif
/* Misc. IOCTL support (drm_ioctl.h) */
extern DRM_PROT_IOCTL DRM(irq_busid)( DRM_OS_IOCTL );
extern DRM_PROT_IOCTL DRM(getunique)( DRM_OS_IOCTL );
extern DRM_PROT_IOCTL DRM(setunique)( DRM_OS_IOCTL );
extern DRM_PROT_IOCTL DRM(getmap)( DRM_OS_IOCTL );
extern DRM_PROT_IOCTL DRM(getclient)( DRM_OS_IOCTL );
extern DRM_PROT_IOCTL DRM(getstats)( DRM_OS_IOCTL );
/* Context IOCTL support (drm_context.h) */
extern int DRM(resctx)( DRM_OS_IOCTL );
extern int DRM(addctx)( DRM_OS_IOCTL );
extern int DRM(modctx)( DRM_OS_IOCTL );
extern int DRM(getctx)( DRM_OS_IOCTL );
extern int DRM(switchctx)( DRM_OS_IOCTL );
extern int DRM(newctx)( DRM_OS_IOCTL );
extern int DRM(rmctx)( DRM_OS_IOCTL );
extern int DRM(context_switch)(drm_device_t *dev, int old, int new);
extern int DRM(context_switch_complete)(drm_device_t *dev, int new);
@ -659,25 +651,7 @@ extern int DRM(ctxbitmap_init)( drm_device_t *dev );
extern void DRM(ctxbitmap_cleanup)( drm_device_t *dev );
#endif
extern int DRM(setsareactx)( DRM_OS_IOCTL );
extern int DRM(getsareactx)( DRM_OS_IOCTL );
/* Drawable IOCTL support (drm_drawable.h) */
extern int DRM(adddraw)( DRM_OS_IOCTL );
extern int DRM(rmdraw)( DRM_OS_IOCTL );
/* Authentication IOCTL support (drm_auth.h) */
extern int DRM(add_magic)(drm_device_t *dev, drm_file_t *priv,
drm_magic_t magic);
extern int DRM(remove_magic)(drm_device_t *dev, drm_magic_t magic);
extern int DRM(getmagic)( DRM_OS_IOCTL );
extern int DRM(authmagic)( DRM_OS_IOCTL );
/* Locking IOCTL support (drm_lock.h) */
extern int DRM(block)( DRM_OS_IOCTL );
extern int DRM(unblock)( DRM_OS_IOCTL );
extern int DRM(lock_take)(__volatile__ unsigned int *lock,
unsigned int context);
extern int DRM(lock_transfer)(drm_device_t *dev,
@ -686,7 +660,6 @@ extern int DRM(lock_transfer)(drm_device_t *dev,
extern int DRM(lock_free)(drm_device_t *dev,
__volatile__ unsigned int *lock,
unsigned int context);
extern int DRM(finish)( DRM_OS_IOCTL );
extern int DRM(flush_unblock)(drm_device_t *dev, int context,
drm_lock_flags_t flags);
extern int DRM(flush_block_and_flush)(drm_device_t *dev, int context,
@ -695,15 +668,8 @@ extern int DRM(notifier)(void *priv);
/* Buffer management support (drm_bufs.h) */
extern int DRM(order)( unsigned long size );
extern int DRM(addmap)( DRM_OS_IOCTL );
extern int DRM(rmmap)( DRM_OS_IOCTL );
#if __HAVE_DMA
extern DRM_PROT_IOCTL DRM(addbufs)( DRM_OS_IOCTL );
extern int DRM(infobufs)( DRM_OS_IOCTL );
extern int DRM(markbufs)( DRM_OS_IOCTL );
extern int DRM(freebufs)( DRM_OS_IOCTL );
extern int DRM(mapbufs)( DRM_OS_IOCTL );
#if __HAVE_DMA
/* DMA support (drm_dma.h) */
extern int DRM(dma_setup)(drm_device_t *dev);
extern void DRM(dma_takedown)(drm_device_t *dev);
@ -719,7 +685,6 @@ extern int DRM(dma_enqueue)(drm_device_t *dev, drm_dma_t *dma);
extern int DRM(dma_get_buffers)(drm_device_t *dev, drm_dma_t *dma);
#endif
#if __HAVE_DMA_IRQ
extern int DRM(control)( DRM_OS_IOCTL );
extern int DRM(irq_install)( drm_device_t *dev, int irq );
extern int DRM(irq_uninstall)( drm_device_t *dev );
extern void DRM(dma_service)( int irq, void *device,
@ -753,15 +718,7 @@ extern drm_buf_t *DRM(freelist_get)(drm_freelist_t *bl, int block);
/* AGP/GART support (drm_agpsupport.h) */
extern drm_agp_head_t *DRM(agp_init)(void);
extern void DRM(agp_uninit)(void);
extern int DRM(agp_acquire)( DRM_OS_IOCTL );
extern void DRM(agp_do_release)(void);
extern int DRM(agp_release)( DRM_OS_IOCTL );
extern int DRM(agp_enable)( DRM_OS_IOCTL );
extern int DRM(agp_info)( DRM_OS_IOCTL );
extern int DRM(agp_alloc)( DRM_OS_IOCTL );
extern int DRM(agp_free)( DRM_OS_IOCTL );
extern int DRM(agp_unbind)( DRM_OS_IOCTL );
extern int DRM(agp_bind)( DRM_OS_IOCTL );
#ifdef __linux__
extern agp_memory *DRM(agp_allocate_memory)(size_t pages, u32 type);
extern int DRM(agp_free_memory)(agp_memory *handle);
@ -776,12 +733,6 @@ extern int DRM(agp_unbind_memory)(void *handle);
#endif
#endif
/* Stub support (drm_stub.h) */
int DRM(stub_register)(const char *name,
struct file_operations *fops,
drm_device_t *dev);
int DRM(stub_unregister)(int minor);
/* Proc support (drm_proc.h) */
extern struct proc_dir_entry *DRM(proc_init)(drm_device_t *dev,
int minor,
@ -794,8 +745,6 @@ extern int DRM(proc_cleanup)(int minor,
#if __HAVE_SG
/* Scatter Gather Support (drm_scatter.h) */
extern void DRM(sg_cleanup)(drm_sg_mem_t *entry);
extern int DRM(sg_alloc)( DRM_OS_IOCTL );
extern int DRM(sg_free)( DRM_OS_IOCTL );
#endif
/* ATI PCIGART support (ati_pcigart.h) */

View file

@ -32,63 +32,58 @@
#define __NO_VERSION__
#include "drmP.h"
int DRM(irq_busid)(struct inode *inode, struct file *filp,
unsigned int cmd, unsigned long arg)
int DRM(irq_busid)( DRM_OS_IOCTL )
{
drm_irq_busid_t p;
struct pci_dev *dev;
if (copy_from_user(&p, (drm_irq_busid_t *)arg, sizeof(p)))
return -EFAULT;
DRM_OS_RETURN(EFAULT);
dev = pci_find_slot(p.busnum, PCI_DEVFN(p.devnum, p.funcnum));
if (dev) p.irq = dev->irq;
else p.irq = 0;
DRM_DEBUG("%d:%d:%d => IRQ %d\n",
p.busnum, p.devnum, p.funcnum, p.irq);
if (copy_to_user((drm_irq_busid_t *)arg, &p, sizeof(p)))
return -EFAULT;
DRM_OS_RETURN(EFAULT);
return 0;
}
int DRM(getunique)(struct inode *inode, struct file *filp,
unsigned int cmd, unsigned long arg)
int DRM(getunique)( DRM_OS_IOCTL )
{
drm_file_t *priv = filp->private_data;
drm_device_t *dev = priv->dev;
DRM_OS_DEVICE;
drm_unique_t u;
if (copy_from_user(&u, (drm_unique_t *)arg, sizeof(u)))
return -EFAULT;
DRM_OS_RETURN(EFAULT);
if (u.unique_len >= dev->unique_len) {
if (copy_to_user(u.unique, dev->unique, dev->unique_len))
return -EFAULT;
DRM_OS_RETURN(EFAULT);
}
u.unique_len = dev->unique_len;
if (copy_to_user((drm_unique_t *)arg, &u, sizeof(u)))
return -EFAULT;
DRM_OS_RETURN(EFAULT);
return 0;
}
int DRM(setunique)(struct inode *inode, struct file *filp,
unsigned int cmd, unsigned long arg)
int DRM(setunique)( DRM_OS_IOCTL )
{
drm_file_t *priv = filp->private_data;
drm_device_t *dev = priv->dev;
DRM_OS_DEVICE;
drm_unique_t u;
if (dev->unique_len || dev->unique)
return -EBUSY;
DRM_OS_RETURN(EBUSY);
if (copy_from_user(&u, (drm_unique_t *)arg, sizeof(u)))
return -EFAULT;
DRM_OS_RETURN(EFAULT);
if (!u.unique_len)
return -EINVAL;
DRM_OS_RETURN(EINVAL);
dev->unique_len = u.unique_len;
dev->unique = DRM(alloc)(u.unique_len + 1, DRM_MEM_DRIVER);
if (copy_from_user(dev->unique, u.unique, dev->unique_len))
return -EFAULT;
DRM_OS_RETURN(EFAULT);
dev->unique[dev->unique_len] = '\0';
dev->devname = DRM(alloc)(strlen(dev->name) + strlen(dev->unique) + 2,
@ -120,11 +115,9 @@ int DRM(setunique)(struct inode *inode, struct file *filp,
}
int DRM(getmap)( struct inode *inode, struct file *filp,
unsigned int cmd, unsigned long arg )
int DRM(getmap)( DRM_OS_IOCTL )
{
drm_file_t *priv = filp->private_data;
drm_device_t *dev = priv->dev;
DRM_OS_DEVICE;
drm_map_t map;
drm_map_list_t *r_list = NULL;
struct list_head *list;
@ -132,13 +125,13 @@ int DRM(getmap)( struct inode *inode, struct file *filp,
int i;
if (copy_from_user(&map, (drm_map_t *)arg, sizeof(map)))
return -EFAULT;
DRM_OS_RETURN(EFAULT);
idx = map.offset;
down(&dev->struct_sem);
DRM_OS_LOCK;
if (idx < 0 || idx >= dev->map_count) {
up(&dev->struct_sem);
return -EINVAL;
DRM_OS_UNLOCK;
DRM_OS_RETURN(EINVAL);
}
i = 0;
@ -150,8 +143,8 @@ int DRM(getmap)( struct inode *inode, struct file *filp,
i++;
}
if(!r_list || !r_list->map) {
up(&dev->struct_sem);
return -EINVAL;
DRM_OS_UNLOCK;
DRM_OS_RETURN(EINVAL);
}
map.offset = r_list->map->offset;
@ -160,56 +153,53 @@ int DRM(getmap)( struct inode *inode, struct file *filp,
map.flags = r_list->map->flags;
map.handle = r_list->map->handle;
map.mtrr = r_list->map->mtrr;
up(&dev->struct_sem);
DRM_OS_UNLOCK;
if (copy_to_user((drm_map_t *)arg, &map, sizeof(map))) return -EFAULT;
if (copy_to_user((drm_map_t *)arg, &map, sizeof(map)))
DRM_OS_RETURN(EFAULT);
return 0;
}
int DRM(getclient)( struct inode *inode, struct file *filp,
unsigned int cmd, unsigned long arg )
int DRM(getclient)( DRM_OS_IOCTL )
{
drm_file_t *priv = filp->private_data;
drm_device_t *dev = priv->dev;
DRM_OS_DEVICE;
drm_client_t client;
drm_file_t *pt;
int idx;
int i;
if (copy_from_user(&client, (drm_client_t *)arg, sizeof(client)))
return -EFAULT;
DRM_OS_RETURN(EFAULT);
idx = client.idx;
down(&dev->struct_sem);
DRM_OS_LOCK;
for (i = 0, pt = dev->file_first; i < idx && pt; i++, pt = pt->next)
;
if (!pt) {
up(&dev->struct_sem);
return -EINVAL;
DRM_OS_UNLOCK;
DRM_OS_RETURN(EINVAL);
}
client.auth = pt->authenticated;
client.pid = pt->pid;
client.uid = pt->uid;
client.magic = pt->magic;
client.iocs = pt->ioctl_count;
up(&dev->struct_sem);
DRM_OS_UNLOCK;
if (copy_to_user((drm_client_t *)arg, &client, sizeof(client)))
return -EFAULT;
DRM_OS_RETURN(EFAULT);
return 0;
}
int DRM(getstats)( struct inode *inode, struct file *filp,
unsigned int cmd, unsigned long arg )
int DRM(getstats)( DRM_OS_IOCTL )
{
drm_file_t *priv = filp->private_data;
drm_device_t *dev = priv->dev;
DRM_OS_DEVICE;
drm_stats_t stats;
int i;
memset(&stats, 0, sizeof(stats));
down(&dev->struct_sem);
DRM_OS_LOCK;
for (i = 0; i < dev->counters; i++) {
if (dev->types[i] == _DRM_STAT_LOCK)
@ -223,9 +213,9 @@ int DRM(getstats)( struct inode *inode, struct file *filp,
stats.count = dev->counters;
up(&dev->struct_sem);
DRM_OS_UNLOCK;
if (copy_to_user((drm_stats_t *)arg, &stats, sizeof(stats)))
return -EFAULT;
DRM_OS_RETURN(EFAULT);
return 0;
}

View file

@ -269,4 +269,81 @@ do { \
#define DRM_OS_COPYFROM(arg1, arg2, arg3) \
copy_from_user( arg1, arg2, arg3)
#define DRM_PROT_IOCTL int
/* Internal functions */
/* drm_drv.h */
extern int DRM(ioctl)( DRM_OS_IOCTL );
extern int DRM(lock)( DRM_OS_IOCTL );
extern int DRM(unlock)( DRM_OS_IOCTL );
/* Misc. IOCTL support (drm_ioctl.h) */
extern int DRM(irq_busid)( DRM_OS_IOCTL );
extern int DRM(getunique)( DRM_OS_IOCTL );
extern int DRM(setunique)( DRM_OS_IOCTL );
extern int DRM(getmap)( DRM_OS_IOCTL );
extern int DRM(getclient)( DRM_OS_IOCTL );
extern int DRM(getstats)( DRM_OS_IOCTL );
/* Context IOCTL support (drm_context.h) */
extern int DRM(resctx)( DRM_OS_IOCTL );
extern int DRM(addctx)( DRM_OS_IOCTL );
extern int DRM(modctx)( DRM_OS_IOCTL );
extern int DRM(getctx)( DRM_OS_IOCTL );
extern int DRM(switchctx)( DRM_OS_IOCTL );
extern int DRM(newctx)( DRM_OS_IOCTL );
extern int DRM(rmctx)( DRM_OS_IOCTL );
extern int DRM(setsareactx)( DRM_OS_IOCTL );
extern int DRM(getsareactx)( DRM_OS_IOCTL );
/* Drawable IOCTL support (drm_drawable.h) */
extern int DRM(adddraw)( DRM_OS_IOCTL );
extern int DRM(rmdraw)( DRM_OS_IOCTL );
/* Authentication IOCTL support (drm_auth.h) */
extern int DRM(getmagic)( DRM_OS_IOCTL );
extern int DRM(authmagic)( DRM_OS_IOCTL );
/* Locking IOCTL support (drm_lock.h) */
extern int DRM(block)( DRM_OS_IOCTL );
extern int DRM(unblock)( DRM_OS_IOCTL );
extern int DRM(finish)( DRM_OS_IOCTL );
/* Buffer management support (drm_bufs.h) */
extern int DRM(addmap)( DRM_OS_IOCTL );
extern int DRM(rmmap)( DRM_OS_IOCTL );
#if __HAVE_DMA
extern int DRM(addbufs)( DRM_OS_IOCTL );
extern int DRM(infobufs)( DRM_OS_IOCTL );
extern int DRM(markbufs)( DRM_OS_IOCTL );
extern int DRM(freebufs)( DRM_OS_IOCTL );
extern int DRM(mapbufs)( DRM_OS_IOCTL );
#endif
/* DMA support (drm_dma.h) */
#if __HAVE_DMA_IRQ
extern int DRM(control)( DRM_OS_IOCTL );
#endif
/* AGP/GART support (drm_agpsupport.h) */
#if __REALLY_HAVE_AGP
extern int DRM(agp_acquire)( DRM_OS_IOCTL );
extern int DRM(agp_release)( DRM_OS_IOCTL );
extern int DRM(agp_enable)( DRM_OS_IOCTL );
extern int DRM(agp_info)( DRM_OS_IOCTL );
extern int DRM(agp_alloc)( DRM_OS_IOCTL );
extern int DRM(agp_free)( DRM_OS_IOCTL );
extern int DRM(agp_unbind)( DRM_OS_IOCTL );
extern int DRM(agp_bind)( DRM_OS_IOCTL );
#endif
/* Stub support (drm_stub.h) */
extern int DRM(stub_register)(const char *name,
struct file_operations *fops,
drm_device_t *dev);
extern int DRM(stub_unregister)(int minor);
/* Scatter Gather Support (drm_scatter.h) */
#if __HAVE_SG
extern int DRM(sg_alloc)( DRM_OS_IOCTL );
extern int DRM(sg_free)( DRM_OS_IOCTL );
#endif

View file

@ -547,15 +547,20 @@ extern int DRM(flags);
extern void DRM(parse_options)( char *s );
extern int DRM(cpu_valid)( void );
/* Authentication (drm_auth.h) */
extern int DRM(add_magic)(drm_device_t *dev, drm_file_t *priv,
drm_magic_t magic);
extern int DRM(remove_magic)(drm_device_t *dev, drm_magic_t magic);
/* Driver support (drm_drv.h) */
extern int DRM(version)( DRM_OS_IOCTL );
#ifdef __linux__
extern int DRM(open)(struct inode *inode, struct file *filp);
extern int DRM(release)(struct inode *inode, struct file *filp);
extern int DRM(ioctl)( DRM_OS_IOCTL );
extern int DRM(lock)( DRM_OS_IOCTL );
extern int DRM(unlock)( DRM_OS_IOCTL );
#endif
/* Device support (drm_fops.h) */
#ifdef __linux__
extern int DRM(open_helper)(struct inode *inode, struct file *filp,
drm_device_t *dev);
extern int DRM(flush)(struct file *filp);
@ -566,6 +571,10 @@ extern ssize_t DRM(read)(struct file *filp, char *buf, size_t count,
extern int DRM(write_string)(drm_device_t *dev, const char *s);
extern unsigned int DRM(poll)(struct file *filp,
struct poll_table_struct *wait);
#endif
#ifdef __FreeBSD__
extern drm_file_t *DRM(find_file_by_proc)(drm_device_t *dev, struct proc *p);
#endif
/* Mapping support (drm_vm.h) */
#if LINUX_VERSION_CODE < 0x020317
@ -634,23 +643,6 @@ extern int DRM(unbind_agp)(void *handle);
#endif
#endif
/* Misc. IOCTL support (drm_ioctl.h) */
extern DRM_PROT_IOCTL DRM(irq_busid)( DRM_OS_IOCTL );
extern DRM_PROT_IOCTL DRM(getunique)( DRM_OS_IOCTL );
extern DRM_PROT_IOCTL DRM(setunique)( DRM_OS_IOCTL );
extern DRM_PROT_IOCTL DRM(getmap)( DRM_OS_IOCTL );
extern DRM_PROT_IOCTL DRM(getclient)( DRM_OS_IOCTL );
extern DRM_PROT_IOCTL DRM(getstats)( DRM_OS_IOCTL );
/* Context IOCTL support (drm_context.h) */
extern int DRM(resctx)( DRM_OS_IOCTL );
extern int DRM(addctx)( DRM_OS_IOCTL );
extern int DRM(modctx)( DRM_OS_IOCTL );
extern int DRM(getctx)( DRM_OS_IOCTL );
extern int DRM(switchctx)( DRM_OS_IOCTL );
extern int DRM(newctx)( DRM_OS_IOCTL );
extern int DRM(rmctx)( DRM_OS_IOCTL );
extern int DRM(context_switch)(drm_device_t *dev, int old, int new);
extern int DRM(context_switch_complete)(drm_device_t *dev, int new);
@ -659,25 +651,7 @@ extern int DRM(ctxbitmap_init)( drm_device_t *dev );
extern void DRM(ctxbitmap_cleanup)( drm_device_t *dev );
#endif
extern int DRM(setsareactx)( DRM_OS_IOCTL );
extern int DRM(getsareactx)( DRM_OS_IOCTL );
/* Drawable IOCTL support (drm_drawable.h) */
extern int DRM(adddraw)( DRM_OS_IOCTL );
extern int DRM(rmdraw)( DRM_OS_IOCTL );
/* Authentication IOCTL support (drm_auth.h) */
extern int DRM(add_magic)(drm_device_t *dev, drm_file_t *priv,
drm_magic_t magic);
extern int DRM(remove_magic)(drm_device_t *dev, drm_magic_t magic);
extern int DRM(getmagic)( DRM_OS_IOCTL );
extern int DRM(authmagic)( DRM_OS_IOCTL );
/* Locking IOCTL support (drm_lock.h) */
extern int DRM(block)( DRM_OS_IOCTL );
extern int DRM(unblock)( DRM_OS_IOCTL );
extern int DRM(lock_take)(__volatile__ unsigned int *lock,
unsigned int context);
extern int DRM(lock_transfer)(drm_device_t *dev,
@ -686,7 +660,6 @@ extern int DRM(lock_transfer)(drm_device_t *dev,
extern int DRM(lock_free)(drm_device_t *dev,
__volatile__ unsigned int *lock,
unsigned int context);
extern int DRM(finish)( DRM_OS_IOCTL );
extern int DRM(flush_unblock)(drm_device_t *dev, int context,
drm_lock_flags_t flags);
extern int DRM(flush_block_and_flush)(drm_device_t *dev, int context,
@ -695,15 +668,8 @@ extern int DRM(notifier)(void *priv);
/* Buffer management support (drm_bufs.h) */
extern int DRM(order)( unsigned long size );
extern int DRM(addmap)( DRM_OS_IOCTL );
extern int DRM(rmmap)( DRM_OS_IOCTL );
#if __HAVE_DMA
extern DRM_PROT_IOCTL DRM(addbufs)( DRM_OS_IOCTL );
extern int DRM(infobufs)( DRM_OS_IOCTL );
extern int DRM(markbufs)( DRM_OS_IOCTL );
extern int DRM(freebufs)( DRM_OS_IOCTL );
extern int DRM(mapbufs)( DRM_OS_IOCTL );
#if __HAVE_DMA
/* DMA support (drm_dma.h) */
extern int DRM(dma_setup)(drm_device_t *dev);
extern void DRM(dma_takedown)(drm_device_t *dev);
@ -719,7 +685,6 @@ extern int DRM(dma_enqueue)(drm_device_t *dev, drm_dma_t *dma);
extern int DRM(dma_get_buffers)(drm_device_t *dev, drm_dma_t *dma);
#endif
#if __HAVE_DMA_IRQ
extern int DRM(control)( DRM_OS_IOCTL );
extern int DRM(irq_install)( drm_device_t *dev, int irq );
extern int DRM(irq_uninstall)( drm_device_t *dev );
extern void DRM(dma_service)( int irq, void *device,
@ -753,15 +718,7 @@ extern drm_buf_t *DRM(freelist_get)(drm_freelist_t *bl, int block);
/* AGP/GART support (drm_agpsupport.h) */
extern drm_agp_head_t *DRM(agp_init)(void);
extern void DRM(agp_uninit)(void);
extern int DRM(agp_acquire)( DRM_OS_IOCTL );
extern void DRM(agp_do_release)(void);
extern int DRM(agp_release)( DRM_OS_IOCTL );
extern int DRM(agp_enable)( DRM_OS_IOCTL );
extern int DRM(agp_info)( DRM_OS_IOCTL );
extern int DRM(agp_alloc)( DRM_OS_IOCTL );
extern int DRM(agp_free)( DRM_OS_IOCTL );
extern int DRM(agp_unbind)( DRM_OS_IOCTL );
extern int DRM(agp_bind)( DRM_OS_IOCTL );
#ifdef __linux__
extern agp_memory *DRM(agp_allocate_memory)(size_t pages, u32 type);
extern int DRM(agp_free_memory)(agp_memory *handle);
@ -776,12 +733,6 @@ extern int DRM(agp_unbind_memory)(void *handle);
#endif
#endif
/* Stub support (drm_stub.h) */
int DRM(stub_register)(const char *name,
struct file_operations *fops,
drm_device_t *dev);
int DRM(stub_unregister)(int minor);
/* Proc support (drm_proc.h) */
extern struct proc_dir_entry *DRM(proc_init)(drm_device_t *dev,
int minor,
@ -794,8 +745,6 @@ extern int DRM(proc_cleanup)(int minor,
#if __HAVE_SG
/* Scatter Gather Support (drm_scatter.h) */
extern void DRM(sg_cleanup)(drm_sg_mem_t *entry);
extern int DRM(sg_alloc)( DRM_OS_IOCTL );
extern int DRM(sg_free)( DRM_OS_IOCTL );
#endif
/* ATI PCIGART support (ati_pcigart.h) */

View file

@ -32,63 +32,58 @@
#define __NO_VERSION__
#include "drmP.h"
int DRM(irq_busid)(struct inode *inode, struct file *filp,
unsigned int cmd, unsigned long arg)
int DRM(irq_busid)( DRM_OS_IOCTL )
{
drm_irq_busid_t p;
struct pci_dev *dev;
if (copy_from_user(&p, (drm_irq_busid_t *)arg, sizeof(p)))
return -EFAULT;
DRM_OS_RETURN(EFAULT);
dev = pci_find_slot(p.busnum, PCI_DEVFN(p.devnum, p.funcnum));
if (dev) p.irq = dev->irq;
else p.irq = 0;
DRM_DEBUG("%d:%d:%d => IRQ %d\n",
p.busnum, p.devnum, p.funcnum, p.irq);
if (copy_to_user((drm_irq_busid_t *)arg, &p, sizeof(p)))
return -EFAULT;
DRM_OS_RETURN(EFAULT);
return 0;
}
int DRM(getunique)(struct inode *inode, struct file *filp,
unsigned int cmd, unsigned long arg)
int DRM(getunique)( DRM_OS_IOCTL )
{
drm_file_t *priv = filp->private_data;
drm_device_t *dev = priv->dev;
DRM_OS_DEVICE;
drm_unique_t u;
if (copy_from_user(&u, (drm_unique_t *)arg, sizeof(u)))
return -EFAULT;
DRM_OS_RETURN(EFAULT);
if (u.unique_len >= dev->unique_len) {
if (copy_to_user(u.unique, dev->unique, dev->unique_len))
return -EFAULT;
DRM_OS_RETURN(EFAULT);
}
u.unique_len = dev->unique_len;
if (copy_to_user((drm_unique_t *)arg, &u, sizeof(u)))
return -EFAULT;
DRM_OS_RETURN(EFAULT);
return 0;
}
int DRM(setunique)(struct inode *inode, struct file *filp,
unsigned int cmd, unsigned long arg)
int DRM(setunique)( DRM_OS_IOCTL )
{
drm_file_t *priv = filp->private_data;
drm_device_t *dev = priv->dev;
DRM_OS_DEVICE;
drm_unique_t u;
if (dev->unique_len || dev->unique)
return -EBUSY;
DRM_OS_RETURN(EBUSY);
if (copy_from_user(&u, (drm_unique_t *)arg, sizeof(u)))
return -EFAULT;
DRM_OS_RETURN(EFAULT);
if (!u.unique_len)
return -EINVAL;
DRM_OS_RETURN(EINVAL);
dev->unique_len = u.unique_len;
dev->unique = DRM(alloc)(u.unique_len + 1, DRM_MEM_DRIVER);
if (copy_from_user(dev->unique, u.unique, dev->unique_len))
return -EFAULT;
DRM_OS_RETURN(EFAULT);
dev->unique[dev->unique_len] = '\0';
dev->devname = DRM(alloc)(strlen(dev->name) + strlen(dev->unique) + 2,
@ -120,11 +115,9 @@ int DRM(setunique)(struct inode *inode, struct file *filp,
}
int DRM(getmap)( struct inode *inode, struct file *filp,
unsigned int cmd, unsigned long arg )
int DRM(getmap)( DRM_OS_IOCTL )
{
drm_file_t *priv = filp->private_data;
drm_device_t *dev = priv->dev;
DRM_OS_DEVICE;
drm_map_t map;
drm_map_list_t *r_list = NULL;
struct list_head *list;
@ -132,13 +125,13 @@ int DRM(getmap)( struct inode *inode, struct file *filp,
int i;
if (copy_from_user(&map, (drm_map_t *)arg, sizeof(map)))
return -EFAULT;
DRM_OS_RETURN(EFAULT);
idx = map.offset;
down(&dev->struct_sem);
DRM_OS_LOCK;
if (idx < 0 || idx >= dev->map_count) {
up(&dev->struct_sem);
return -EINVAL;
DRM_OS_UNLOCK;
DRM_OS_RETURN(EINVAL);
}
i = 0;
@ -150,8 +143,8 @@ int DRM(getmap)( struct inode *inode, struct file *filp,
i++;
}
if(!r_list || !r_list->map) {
up(&dev->struct_sem);
return -EINVAL;
DRM_OS_UNLOCK;
DRM_OS_RETURN(EINVAL);
}
map.offset = r_list->map->offset;
@ -160,56 +153,53 @@ int DRM(getmap)( struct inode *inode, struct file *filp,
map.flags = r_list->map->flags;
map.handle = r_list->map->handle;
map.mtrr = r_list->map->mtrr;
up(&dev->struct_sem);
DRM_OS_UNLOCK;
if (copy_to_user((drm_map_t *)arg, &map, sizeof(map))) return -EFAULT;
if (copy_to_user((drm_map_t *)arg, &map, sizeof(map)))
DRM_OS_RETURN(EFAULT);
return 0;
}
int DRM(getclient)( struct inode *inode, struct file *filp,
unsigned int cmd, unsigned long arg )
int DRM(getclient)( DRM_OS_IOCTL )
{
drm_file_t *priv = filp->private_data;
drm_device_t *dev = priv->dev;
DRM_OS_DEVICE;
drm_client_t client;
drm_file_t *pt;
int idx;
int i;
if (copy_from_user(&client, (drm_client_t *)arg, sizeof(client)))
return -EFAULT;
DRM_OS_RETURN(EFAULT);
idx = client.idx;
down(&dev->struct_sem);
DRM_OS_LOCK;
for (i = 0, pt = dev->file_first; i < idx && pt; i++, pt = pt->next)
;
if (!pt) {
up(&dev->struct_sem);
return -EINVAL;
DRM_OS_UNLOCK;
DRM_OS_RETURN(EINVAL);
}
client.auth = pt->authenticated;
client.pid = pt->pid;
client.uid = pt->uid;
client.magic = pt->magic;
client.iocs = pt->ioctl_count;
up(&dev->struct_sem);
DRM_OS_UNLOCK;
if (copy_to_user((drm_client_t *)arg, &client, sizeof(client)))
return -EFAULT;
DRM_OS_RETURN(EFAULT);
return 0;
}
int DRM(getstats)( struct inode *inode, struct file *filp,
unsigned int cmd, unsigned long arg )
int DRM(getstats)( DRM_OS_IOCTL )
{
drm_file_t *priv = filp->private_data;
drm_device_t *dev = priv->dev;
DRM_OS_DEVICE;
drm_stats_t stats;
int i;
memset(&stats, 0, sizeof(stats));
down(&dev->struct_sem);
DRM_OS_LOCK;
for (i = 0; i < dev->counters; i++) {
if (dev->types[i] == _DRM_STAT_LOCK)
@ -223,9 +213,9 @@ int DRM(getstats)( struct inode *inode, struct file *filp,
stats.count = dev->counters;
up(&dev->struct_sem);
DRM_OS_UNLOCK;
if (copy_to_user((drm_stats_t *)arg, &stats, sizeof(stats)))
return -EFAULT;
DRM_OS_RETURN(EFAULT);
return 0;
}

View file

@ -269,4 +269,81 @@ do { \
#define DRM_OS_COPYFROM(arg1, arg2, arg3) \
copy_from_user( arg1, arg2, arg3)
#define DRM_PROT_IOCTL int
/* Internal functions */
/* drm_drv.h */
extern int DRM(ioctl)( DRM_OS_IOCTL );
extern int DRM(lock)( DRM_OS_IOCTL );
extern int DRM(unlock)( DRM_OS_IOCTL );
/* Misc. IOCTL support (drm_ioctl.h) */
extern int DRM(irq_busid)( DRM_OS_IOCTL );
extern int DRM(getunique)( DRM_OS_IOCTL );
extern int DRM(setunique)( DRM_OS_IOCTL );
extern int DRM(getmap)( DRM_OS_IOCTL );
extern int DRM(getclient)( DRM_OS_IOCTL );
extern int DRM(getstats)( DRM_OS_IOCTL );
/* Context IOCTL support (drm_context.h) */
extern int DRM(resctx)( DRM_OS_IOCTL );
extern int DRM(addctx)( DRM_OS_IOCTL );
extern int DRM(modctx)( DRM_OS_IOCTL );
extern int DRM(getctx)( DRM_OS_IOCTL );
extern int DRM(switchctx)( DRM_OS_IOCTL );
extern int DRM(newctx)( DRM_OS_IOCTL );
extern int DRM(rmctx)( DRM_OS_IOCTL );
extern int DRM(setsareactx)( DRM_OS_IOCTL );
extern int DRM(getsareactx)( DRM_OS_IOCTL );
/* Drawable IOCTL support (drm_drawable.h) */
extern int DRM(adddraw)( DRM_OS_IOCTL );
extern int DRM(rmdraw)( DRM_OS_IOCTL );
/* Authentication IOCTL support (drm_auth.h) */
extern int DRM(getmagic)( DRM_OS_IOCTL );
extern int DRM(authmagic)( DRM_OS_IOCTL );
/* Locking IOCTL support (drm_lock.h) */
extern int DRM(block)( DRM_OS_IOCTL );
extern int DRM(unblock)( DRM_OS_IOCTL );
extern int DRM(finish)( DRM_OS_IOCTL );
/* Buffer management support (drm_bufs.h) */
extern int DRM(addmap)( DRM_OS_IOCTL );
extern int DRM(rmmap)( DRM_OS_IOCTL );
#if __HAVE_DMA
extern int DRM(addbufs)( DRM_OS_IOCTL );
extern int DRM(infobufs)( DRM_OS_IOCTL );
extern int DRM(markbufs)( DRM_OS_IOCTL );
extern int DRM(freebufs)( DRM_OS_IOCTL );
extern int DRM(mapbufs)( DRM_OS_IOCTL );
#endif
/* DMA support (drm_dma.h) */
#if __HAVE_DMA_IRQ
extern int DRM(control)( DRM_OS_IOCTL );
#endif
/* AGP/GART support (drm_agpsupport.h) */
#if __REALLY_HAVE_AGP
extern int DRM(agp_acquire)( DRM_OS_IOCTL );
extern int DRM(agp_release)( DRM_OS_IOCTL );
extern int DRM(agp_enable)( DRM_OS_IOCTL );
extern int DRM(agp_info)( DRM_OS_IOCTL );
extern int DRM(agp_alloc)( DRM_OS_IOCTL );
extern int DRM(agp_free)( DRM_OS_IOCTL );
extern int DRM(agp_unbind)( DRM_OS_IOCTL );
extern int DRM(agp_bind)( DRM_OS_IOCTL );
#endif
/* Stub support (drm_stub.h) */
extern int DRM(stub_register)(const char *name,
struct file_operations *fops,
drm_device_t *dev);
extern int DRM(stub_unregister)(int minor);
/* Scatter Gather Support (drm_scatter.h) */
#if __HAVE_SG
extern int DRM(sg_alloc)( DRM_OS_IOCTL );
extern int DRM(sg_free)( DRM_OS_IOCTL );
#endif