From b9cb2e1fdcd92add4142ac3e1b04bf0bc0ef8703 Mon Sep 17 00:00:00 2001 From: Alan Hourihane Date: Fri, 27 Apr 2001 10:16:26 +0000 Subject: [PATCH] more OS dependency separation --- bsd-core/drm_os_freebsd.h | 80 ++++++++++++++++++++++++++++++++++-- bsd/drm_os_freebsd.h | 80 ++++++++++++++++++++++++++++++++++-- linux-core/drmP.h | 77 ++++++----------------------------- linux-core/drm_ioctl.c | 86 +++++++++++++++++---------------------- linux-core/drm_os_linux.h | 79 ++++++++++++++++++++++++++++++++++- linux/drmP.h | 77 ++++++----------------------------- linux/drm_ioctl.h | 86 +++++++++++++++++---------------------- linux/drm_os_linux.h | 79 ++++++++++++++++++++++++++++++++++- 8 files changed, 412 insertions(+), 232 deletions(-) diff --git a/bsd-core/drm_os_freebsd.h b/bsd-core/drm_os_freebsd.h index 0e684c7c..25074a40 100644 --- a/bsd-core/drm_os_freebsd.h +++ b/bsd-core/drm_os_freebsd.h @@ -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<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; } diff --git a/linux-core/drm_os_linux.h b/linux-core/drm_os_linux.h index c02c2202..2874df00 100644 --- a/linux-core/drm_os_linux.h +++ b/linux-core/drm_os_linux.h @@ -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 diff --git a/linux/drmP.h b/linux/drmP.h index 78215d9b..61faf08a 100644 --- a/linux/drmP.h +++ b/linux/drmP.h @@ -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) */ diff --git a/linux/drm_ioctl.h b/linux/drm_ioctl.h index 1cc8f31f..ea1189ff 100644 --- a/linux/drm_ioctl.h +++ b/linux/drm_ioctl.h @@ -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; } diff --git a/linux/drm_os_linux.h b/linux/drm_os_linux.h index c02c2202..2874df00 100644 --- a/linux/drm_os_linux.h +++ b/linux/drm_os_linux.h @@ -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