As I was doing some minor cleanups in the mach64 drm in the new branch, I made some additional search and replace conversions of the mach64 DRM to the os independence macros (I couldn't restrain myself ;) ). However, I want to share what I've done so far and get some feedback, since there are a couple of issues here:
1. We are currently using access_ok() to check the vertex buffers submitted by the client before copying them to (what will be) private kernel buffers. There was only a macro in drm_os_linux.h for DRM_VERIFYAREA_READ(), so I added DRM_ACCESSOK_READ(). I don't really know the details of what the difference is between verify_area() and access_ok() (Jose added that code based on a suggestion from Linus, I think), but I believe access_ok() is intended as a security check, which is the reason for the copy. It seems that this all maps to the same thing for *BSD at the moment -- i.e. the unchecked macros aren't implemented differently from the checked ones, right? 2. The Mach64 driver makes heavy use of the list struct and macros from linux/list.h. I moved the define for list_for_each_safe() (needed for older 2.4 Linux kernels) from mach64_drv.h to drmP.h, since that has already been added in XFree86 CVS (I think the i8x0 drm uses it now also). I also removed the include of linux/list.h from the mach64 driver, since it already gets included (indirectly?) through the drm headers. However, it looks like an analogue of linux/list.h might need to be added to the BSD drm headers. The only wrinkle there is that it also uses linux/prefetch.h. 3. We still need to work out the wrapper/alternative to pci_alloc_consistent() and friends. 4. As I mentioned before, the interrupt code is not converted, but it's currently unused. At any rate, the remainder of the attached patch is trivial additions of DRM_ERR, DRM_CURRENTPID, etc. and a couple of whitespace tweaks. -- Leif Delgass http://www.retinalburn.net
Index: linux/drm/kernel/drmP.h =================================================================== RCS file: /cvsroot/dri/xc/xc/programs/Xserver/hw/xfree86/os-support/linux/drm/kernel/drmP.h,v retrieving revision 1.56 diff -u -r1.56 drmP.h --- linux/drm/kernel/drmP.h 11 Jan 2003 20:58:20 -0000 1.56 +++ linux/drm/kernel/drmP.h 18 Feb 2003 00:33:29 -0000 @@ -166,6 +166,12 @@ #define pte_unmap(pte) #endif +#ifndef list_for_each_safe +#define list_for_each_safe(pos, n, head) \ + for (pos = (head)->next, n = pos->next; pos != (head); \ + pos = n, n = pos->next) +#endif + #if LINUX_VERSION_CODE < KERNEL_VERSION(2,4,19) static inline struct page * vmalloc_to_page(void * vmalloc_addr) { Index: linux/drm/kernel/drm_os_linux.h =================================================================== RCS file: /cvsroot/dri/xc/xc/programs/Xserver/hw/xfree86/os-support/linux/drm/kernel/drm_os_linux.h,v retrieving revision 1.5 diff -u -r1.5 drm_os_linux.h --- linux/drm/kernel/drm_os_linux.h 9 Oct 2002 16:29:01 -0000 1.5 +++ linux/drm/kernel/drm_os_linux.h 18 Feb 2003 00:33:30 -0000 @@ -34,6 +34,8 @@ /* Macros for copyfrom user, but checking readability only once */ #define DRM_VERIFYAREA_READ( uaddr, size ) \ verify_area( VERIFY_READ, uaddr, size ) +#define DRM_ACCESSOK_READ( uaddr, size ) \ + access_ok( VERIFY_READ, uaddr, size ) #define DRM_COPY_FROM_USER_UNCHECKED(arg1, arg2, arg3) \ __copy_from_user(arg1, arg2, arg3) #define DRM_GET_USER_UNCHECKED(val, uaddr) \ @@ -60,28 +62,28 @@ #define DRM_HZ HZ -#define DRM_WAIT_ON( ret, queue, timeout, condition ) \ -do { \ - DECLARE_WAITQUEUE(entry, current); \ - unsigned long end = jiffies + (timeout); \ - add_wait_queue(&(queue), &entry); \ - \ - for (;;) { \ - current->state = TASK_INTERRUPTIBLE; \ - if (condition) \ - break; \ - if((signed)(end - jiffies) <= 0) { \ - ret = -EBUSY; \ - break; \ - } \ +#define DRM_WAIT_ON( ret, queue, timeout, condition ) \ +do { \ + DECLARE_WAITQUEUE(entry, current); \ + unsigned long end = jiffies + (timeout); \ + add_wait_queue(&(queue), &entry); \ + \ + for (;;) { \ + current->state = TASK_INTERRUPTIBLE; \ + if (condition) \ + break; \ + if((signed)(end - jiffies) <= 0) { \ + ret = -EBUSY; \ + break; \ + } \ schedule_timeout((HZ/100 > 1) ? HZ/100 : 1); \ - if (signal_pending(current)) { \ - ret = -EINTR; \ - break; \ - } \ - } \ - current->state = TASK_RUNNING; \ - remove_wait_queue(&(queue), &entry); \ + if (signal_pending(current)) { \ + ret = -EINTR; \ + break; \ + } \ + } \ + current->state = TASK_RUNNING; \ + remove_wait_queue(&(queue), &entry); \ } while (0) Index: shared/drm/kernel/mach64_dma.c =================================================================== RCS file: /cvsroot/dri/xc/xc/programs/Xserver/hw/xfree86/os-support/shared/drm/kernel/Attic/mach64_dma.c,v retrieving revision 1.1.2.2 diff -u -r1.1.2.2 mach64_dma.c --- shared/drm/kernel/mach64_dma.c 17 Feb 2003 01:58:46 -0000 1.1.2.2 +++ shared/drm/kernel/mach64_dma.c 18 Feb 2003 00:33:30 -0000 @@ -36,7 +36,6 @@ #include "mach64_drm.h" #include "mach64_drv.h" -#include <linux/interrupt.h> /* For task queue support */ #if MACH64_INTERRUPTS @@ -138,11 +137,11 @@ slots = (MACH64_READ( MACH64_FIFO_STAT ) & MACH64_FIFO_SLOT_MASK); if ( slots <= (0x8000 >> entries) ) return 0; - udelay( 1 ); + DRM_UDELAY( 1 ); } DRM_INFO( "%s failed! slots=%d entries=%d\n", __FUNCTION__, slots, entries ); - return -EBUSY; + return DRM_ERR(EBUSY); } int mach64_do_wait_for_idle( drm_mach64_private_t *dev_priv ) @@ -156,13 +155,13 @@ if ( !(MACH64_READ( MACH64_GUI_STAT ) & MACH64_GUI_ACTIVE) ) { return 0; } - udelay( 1 ); + DRM_UDELAY( 1 ); } DRM_INFO( "%s failed! GUI_STAT=0x%08x\n", __FUNCTION__, MACH64_READ( MACH64_GUI_STAT ) ); mach64_dump_ring_info( dev_priv ); - return -EBUSY; + return DRM_ERR(EBUSY); } int mach64_wait_ring( drm_mach64_private_t *dev_priv, int n ) @@ -178,13 +177,13 @@ } return 0; } - udelay( 1 ); + DRM_UDELAY( 1 ); } /* FIXME: This is being ignored... */ DRM_ERROR( "failed!\n" ); mach64_dump_ring_info( dev_priv ); - return -EBUSY; + return DRM_ERR(EBUSY); } /* Wait until all DMA requests have been processed... */ @@ -211,13 +210,13 @@ head = ring->head; i = 0; } - udelay( 1 ); + DRM_UDELAY( 1 ); } DRM_INFO( "%s failed! GUI_STAT=0x%08x\n", __FUNCTION__, MACH64_READ( MACH64_GUI_STAT ) ); mach64_dump_ring_info( dev_priv ); - return -EBUSY; + return DRM_ERR(EBUSY); } static void mach64_ring_reset( drm_mach64_private_t *dev_priv ) @@ -537,7 +536,7 @@ cpu_addr_data = pci_alloc_consistent( dev->pdev, 0x1000, &data_handle ); if (!cpu_addr_data || !data_handle) { DRM_INFO( "data-memory allocation failed!\n" ); - return -ENOMEM; + return DRM_ERR(ENOMEM); } else { data = (u32 *) cpu_addr_data; data_addr = (u32) data_handle; @@ -571,7 +570,7 @@ pci_free_consistent( dev->pdev, 0x1000, cpu_addr_data, data_handle ); DRM_INFO( "returning ...\n" ); - return -EIO; + return DRM_ERR(EIO); } } @@ -612,7 +611,7 @@ DRM_DEBUG( " data[%d] = 0x%08x\n", i, data[i] ); } - mach64_flush_write_combine(); + DRM_READMEMORYBARRIER(); DRM_DEBUG( "waiting for idle...\n" ); if ( ( i = mach64_do_wait_for_idle( dev_priv ) ) ) { @@ -701,7 +700,6 @@ static int mach64_do_dma_init( drm_device_t *dev, drm_mach64_init_t *init ) { drm_mach64_private_t *dev_priv; - struct list_head *list; u32 tmp; int i, ret; @@ -709,7 +707,7 @@ dev_priv = DRM(alloc)( sizeof(drm_mach64_private_t), DRM_MEM_DRIVER ); if ( dev_priv == NULL ) - return -ENOMEM; + return DRM_ERR(ENOMEM); memset( dev_priv, 0, sizeof(drm_mach64_private_t) ); @@ -747,34 +745,27 @@ atomic_set(&dev_priv->intr_bm_complete, 0); #endif - list_for_each(list, &dev->maplist->head) { - drm_map_list_t *r_list = (drm_map_list_t *)list; - if( r_list->map && - r_list->map->type == _DRM_SHM && - r_list->map->flags & _DRM_CONTAINS_LOCK ) { - dev_priv->sarea = r_list->map; - break; - } - } + DRM_GETSAREA(); + if (!dev_priv->sarea) { DRM_ERROR("can not find sarea!\n"); dev->dev_private = (void *)dev_priv; mach64_do_cleanup_dma(dev); - return -EINVAL; + return DRM_ERR(EINVAL); } DRM_FIND_MAP( dev_priv->fb, init->fb_offset ); if (!dev_priv->fb) { DRM_ERROR("can not find frame buffer map!\n"); dev->dev_private = (void *)dev_priv; mach64_do_cleanup_dma(dev); - return -EINVAL; + return DRM_ERR(EINVAL); } DRM_FIND_MAP( dev_priv->mmio, init->mmio_offset ); if (!dev_priv->mmio) { DRM_ERROR("can not find mmio map!\n"); dev->dev_private = (void *)dev_priv; mach64_do_cleanup_dma(dev); - return -EINVAL; + return DRM_ERR(EINVAL); } dev_priv->sarea_priv = (drm_mach64_sarea_t *) @@ -787,7 +778,7 @@ DRM_ERROR( "can not find dma buffer map!\n" ); dev->dev_private = (void *)dev_priv; mach64_do_cleanup_dma( dev ); - return -EINVAL; + return DRM_ERR(EINVAL); } DRM_IOREMAP( dev_priv->buffers ); if ( !dev_priv->buffers->handle ) { @@ -795,7 +786,7 @@ " dma buffer\n" ); dev->dev_private = (void *) dev_priv; mach64_do_cleanup_dma( dev ); - return -ENOMEM; + return DRM_ERR(ENOMEM); } DRM_FIND_MAP( dev_priv->agp_textures, init->agp_textures_offset ); @@ -803,7 +794,7 @@ DRM_ERROR("could not find agp texture region!\n"); dev->dev_private = (void *)dev_priv; mach64_do_cleanup_dma( dev ); - return -EINVAL; + return DRM_ERR(EINVAL); } } @@ -847,7 +838,7 @@ if (!dev_priv->ring.start || !dev_priv->ring.handle) { DRM_ERROR( "Allocating dma descriptor ring failed\n"); - return -ENOMEM; + return DRM_ERR(ENOMEM); } else { dev_priv->ring.start_addr = (u32) dev_priv->ring.handle; memset( dev_priv->ring.start, 0x0, 0x4000 ); @@ -984,7 +975,7 @@ head, ring->tail, buf_addr, (eol ? "eol" : "")); mach64_dump_ring_info( dev_priv ); mach64_do_engine_reset( dev_priv ); - return -EINVAL; + return DRM_ERR(EINVAL); } /* Hand feed the buffer to the card via MMIO, waiting for the fifo @@ -1106,7 +1097,7 @@ return mach64_do_cleanup_dma( dev ); } - return -EINVAL; + return DRM_ERR(EINVAL); } int mach64_dma_idle( DRM_IOCTL_ARGS ) @@ -1164,7 +1155,7 @@ if ((entry = (drm_mach64_freelist_t *) DRM(alloc)(sizeof(drm_mach64_freelist_t), DRM_MEM_BUFLISTS)) == NULL) - return -ENOMEM; + return DRM_ERR(ENOMEM); memset( entry, 0, sizeof(drm_mach64_freelist_t) ); entry->buf = dma->buflist[i]; ptr = &entry->list; @@ -1311,7 +1302,7 @@ return entry->buf; } } - udelay( 1 ); + DRM_UDELAY( 1 ); } mach64_dump_ring_info( dev_priv ); DRM_ERROR( "timeout waiting for buffers: ring head_addr: 0x%08x head: %d tail: %d\n", ring->head_addr, ring->head, ring->tail ); @@ -1340,19 +1331,19 @@ for ( i = d->granted_count ; i < d->request_count ; i++ ) { buf = mach64_freelist_get( dev_priv ); #if MACH64_EXTRA_CHECKING - if ( !buf ) return -EFAULT; + if ( !buf ) return DRM_ERR(EFAULT); #else - if ( !buf ) return -EAGAIN; + if ( !buf ) return DRM_ERR(EAGAIN); #endif - buf->pid = current->pid; + buf->pid = DRM_CURRENTPID; - if ( copy_to_user( &d->request_indices[i], &buf->idx, + if ( DRM_COPY_TO_USER( &d->request_indices[i], &buf->idx, sizeof(buf->idx) ) ) - return -EFAULT; - if ( copy_to_user( &d->request_sizes[i], &buf->total, + return DRM_ERR(EFAULT); + if ( DRM_COPY_TO_USER( &d->request_sizes[i], &buf->total, sizeof(buf->total) ) ) - return -EFAULT; + return DRM_ERR(EFAULT); d->granted_count++; } @@ -1375,8 +1366,8 @@ if ( d.send_count != 0 ) { DRM_ERROR( "Process %d trying to send %d buffers via drmDMA\n", - current->pid, d.send_count ); - return -EINVAL; + DRM_CURRENTPID, d.send_count ); + return DRM_ERR(EINVAL); } /* We'll send you buffers. @@ -1384,8 +1375,8 @@ if ( d.request_count < 0 || d.request_count > dma->buf_count ) { DRM_ERROR( "Process %d trying to get %d buffers (of %d max)\n", - current->pid, d.request_count, dma->buf_count ); - ret = -EINVAL; + DRM_CURRENTPID, d.request_count, dma->buf_count ); + ret = DRM_ERR(EINVAL); } d.granted_count = 0; Index: shared/drm/kernel/mach64_drv.h =================================================================== RCS file: /cvsroot/dri/xc/xc/programs/Xserver/hw/xfree86/os-support/shared/drm/kernel/Attic/mach64_drv.h,v retrieving revision 1.1.2.2 diff -u -r1.1.2.2 mach64_drv.h --- shared/drm/kernel/mach64_drv.h 17 Feb 2003 01:58:46 -0000 1.1.2.2 +++ shared/drm/kernel/mach64_drv.h 18 Feb 2003 00:33:31 -0000 @@ -33,15 +33,6 @@ #ifndef __MACH64_DRV_H__ #define __MACH64_DRV_H__ -#include <linux/delay.h> -#include <linux/list.h> - -/* Some early 2.4.x kernels need this */ -#ifndef list_for_each_safe -#define list_for_each_safe(pos, n, head) \ - for (pos = (head)->next, n = pos->next; pos != (head); \ - pos = n, n = pos->next) -#endif /* FIXME: remove these when not needed */ /* Development driver options */ @@ -586,10 +577,10 @@ #define LOCK_TEST_WITH_RETURN( dev ) \ do { \ if ( !_DRM_LOCK_IS_HELD( dev->lock.hw_lock->lock ) || \ - dev->lock.pid != current->pid ) { \ + dev->lock.pid != DRM_CURRENTPID ) { \ DRM_ERROR( "%s called without lock held\n", \ __FUNCTION__ ); \ - return -EINVAL; \ + return DRM_ERR(EINVAL); \ } \ } while (0) @@ -605,12 +596,12 @@ mach64_update_ring_snapshot( dev_priv ); \ if ( ring->space >= ring->high_mark ) \ goto __ring_space_done; \ - udelay( 1 ); \ + DRM_UDELAY( 1 ); + \ } \ DRM_ERROR( "ring space check failed!\n" ); \ DRM_INFO( "ring: head addr: 0x%08x head: %d tail: %d space: %d\n", \ ring->head_addr, ring->head, ring->tail, ring->space ); \ - return -EBUSY; \ + return DRM_ERR(EBUSY); + \ } \ __ring_space_done: \ } while (0) @@ -639,8 +630,6 @@ * DMA descriptor ring macros */ -#define mach64_flush_write_combine() mb() - #define RING_LOCALS \ int _ring_tail, _ring_write; unsigned int _ring_mask; volatile u32 *_ring @@ -729,9 +718,9 @@ DRM_INFO( "ADVANCE_RING() wr=0x%06x tail=0x%06x\n", \ _ring_write, _ring_tail ); \ } \ - mach64_flush_write_combine(); \ + DRM_READMEMORYBARRIER(); \ mach64_clear_dma_eol( &_ring[(_ring_tail - 2) & _ring_mask] ); \ - mach64_flush_write_combine(); \ + DRM_READMEMORYBARRIER(); \ dev_priv->ring.tail = _ring_write; \ mach64_ring_tick( dev_priv, &(dev_priv)->ring ); \ } while (0) @@ -766,14 +755,14 @@ #if MACH64_EXTRA_CHECKING if (list_empty(&dev_priv->pending)) { DRM_ERROR("Empty pending list in %s\n", __FUNCTION__); - return -EINVAL; + return DRM_ERR(EINVAL); } #endif ptr = dev_priv->pending.prev; *entry = list_entry(ptr, drm_mach64_freelist_t, list); while ((*entry)->buf != buf) { if (ptr == &dev_priv->pending) { - return -EFAULT; + return DRM_ERR(EFAULT); } ptr = ptr->prev; *entry = list_entry(ptr, drm_mach64_freelist_t, list); @@ -799,14 +788,14 @@ if (_buf == NULL) { \ DRM_ERROR("%s: couldn't get buffer in DMAGETPTR\n", \ __FUNCTION__ ); \ - return -EAGAIN; \ + return DRM_ERR(EAGAIN); \ } \ if (_buf->pending) { \ DRM_ERROR("%s: pending buf in DMAGETPTR\n", \ __FUNCTION__ ); \ - return -EFAULT; \ + return DRM_ERR(EFAULT); \ } \ - _buf->pid = current->pid; \ + _buf->pid = DRM_CURRENTPID; \ _outcount = 0; \ \ _buf_wptr = GETBUFPTR( _buf ); \ @@ -835,7 +824,7 @@ if (_buf->used <= 0) { \ DRM_ERROR( "DMAADVANCE() in %s: sending empty buf %d\n", \ __FUNCTION__, _buf->idx ); \ - return -EFAULT; \ + return DRM_ERR(EFAULT); + \ } \ if (_buf->pending) { \ /* This is a resued buffer, so we need to find it in the pending list */ \ @@ -848,13 +837,13 @@ if (_entry->discard) { \ DRM_ERROR( "DMAADVANCE() in %s: sending discarded pending buf %d\n", \ __FUNCTION__, _buf->idx ); \ - return -EFAULT; \ + return DRM_ERR(EFAULT); + \ } \ } else { \ if (list_empty(&dev_priv->placeholders)) { \ DRM_ERROR( "DMAADVANCE() in %s: empty placeholder list\n", \ __FUNCTION__ ); \ - return -EFAULT; \ + return DRM_ERR(EFAULT); + \ } \ ptr = dev_priv->placeholders.next; \ list_del(ptr); \ @@ -930,12 +919,12 @@ if (_buf->used <= 0) { \ DRM_ERROR( "DMAADVANCEHOSTDATA() in %s: sending empty buf %d\n", \ __FUNCTION__, _buf->idx ); \ - return -EFAULT; \ + return DRM_ERR(EFAULT); + \ } \ if (list_empty(&dev_priv->placeholders)) { \ DRM_ERROR( "%s: empty placeholder list in DMAADVANCEHOSTDATA()\n", \ __FUNCTION__ ); \ - return -EFAULT; \ + return DRM_ERR(EFAULT); + \ } \ \ ptr = dev_priv->placeholders.next; \ Index: shared/drm/kernel/mach64_state.c =================================================================== RCS file: /cvsroot/dri/xc/xc/programs/Xserver/hw/xfree86/os-support/shared/drm/kernel/Attic/mach64_state.c,v retrieving revision 1.1.2.2 diff -u -r1.1.2.2 mach64_state.c --- shared/drm/kernel/mach64_state.c 17 Feb 2003 01:58:46 -0000 1.1.2.2 +++ shared/drm/kernel/mach64_state.c 18 Feb 2003 00:33:31 -0000 @@ -34,7 +34,6 @@ #include "drm.h" #include "mach64_drm.h" #include "mach64_drv.h" -#include "drm.h" /* ================================================================ @@ -212,7 +211,7 @@ fb_bpp = MACH64_DATATYPE_ARGB8888; break; default: - return -EINVAL; + return DRM_ERR(EINVAL); } switch ( dev_priv->depth_bpp ) { case 16: @@ -223,7 +222,7 @@ depth_bpp = MACH64_DATATYPE_ARGB8888; break; default: - return -EINVAL; + return DRM_ERR(EINVAL); } if ( !nbox ) @@ -469,16 +468,16 @@ { unsigned long copied = 0; - if ( access_ok( VERIFY_READ, from, n ) ) { + if ( DRM_ACCESSOK_READ( from, n ) ) { n >>= 2; - + while ( n ) { u32 data, reg, count; - if ( __get_user( data, from++ ) ) + if ( DRM_GET_USER_UNCHECKED( data, from++ ) ) break; n--; - + reg = le32_to_cpu(data); count = (reg >> 16) + 1; if( count <= n ) { @@ -488,9 +487,10 @@ /* This is an exact match of Mach64's Setup Engine registers, * excluding SETUP_CNTL (1_C1). */ - if( (reg >= 0x0190 && reg < 0x01c1) || (reg >= 0x01ca && reg <= 0x01cf) ) { + if( (reg >= 0x0190 && reg < 0x01c1) || + (reg >= 0x01ca && reg <= 0x01cf) ) { *to++ = data; - __copy_from_user( to, from, count << 2 ); + DRM_COPY_FROM_USER_UNCHECKED( to, from, count +<< 2 ); to += count; copied += 1 + count; } else { @@ -530,7 +530,7 @@ if (copy_buf == NULL) { DRM_ERROR("%s: couldn't get buffer in DMAGETPTR\n", __FUNCTION__ ); - return -EAGAIN; + return DRM_ERR(EAGAIN); } if ((copy_buf->used = copy_and_verify_from_user( GETBUFPTR( copy_buf ), buf, used )) == 0) { @@ -578,7 +578,7 @@ if (copy_buf == entry->buf) { DRM_ERROR( "%s: Trying to release a pending buf\n", __FUNCTION__ ); - return -EFAULT; + return DRM_ERR(EFAULT); } } #endif @@ -598,7 +598,7 @@ if (verify_failed) { DRM_ERROR( "%s: Vertex buffer verification failed\n", __FUNCTION__ ); - return -EINVAL; + return DRM_ERR(EINVAL); } else { return 0; } @@ -633,22 +633,22 @@ break; default: DRM_ERROR( "invalid blit format %d\n", blit->format ); - return -EINVAL; + return DRM_ERR(EINVAL); } /* Dispatch the blit buffer. */ buf = dma->buflist[blit->idx]; - if ( buf->pid != current->pid ) { + if ( buf->pid != DRM_CURRENTPID ) { DRM_ERROR( "process %d using buffer owned by %d\n", - current->pid, buf->pid ); - return -EINVAL; + DRM_CURRENTPID, buf->pid ); + return DRM_ERR(EINVAL); } if ( buf->pending ) { DRM_ERROR( "sending pending buffer %d\n", blit->idx ); - return -EINVAL; + return DRM_ERR(EINVAL); } /* Set buf->used to the bytes of blit data based on the blit dimensions @@ -661,7 +661,7 @@ if ( buf->used <= 0 || buf->used > MACH64_BUFFER_SIZE - MACH64_HOSTDATA_BLIT_OFFSET ) { DRM_ERROR( "Invalid blit size: %d bytes\n", buf->used ); - return -EINVAL; + return DRM_ERR(EINVAL); } /* FIXME: Use a last buffer flag and reduce the state emitted for subsequent, @@ -726,7 +726,7 @@ drm_mach64_clear_t clear; int ret; - DRM_DEBUG( "%s: pid=%d\n", __FUNCTION__, current->pid ); + DRM_DEBUG( "%s: pid=%d\n", __FUNCTION__, DRM_CURRENTPID ); LOCK_TEST_WITH_RETURN( dev ); @@ -756,7 +756,7 @@ drm_mach64_sarea_t *sarea_priv = dev_priv->sarea_priv; int ret; - DRM_DEBUG( "%s: pid=%d\n", __FUNCTION__, current->pid ); + DRM_DEBUG( "%s: pid=%d\n", __FUNCTION__, DRM_CURRENTPID ); LOCK_TEST_WITH_RETURN( dev ); @@ -785,25 +785,25 @@ if ( !dev_priv ) { DRM_ERROR( "%s called with no initialization\n", __FUNCTION__ ); - return -EINVAL; + return DRM_ERR(EINVAL); } DRM_COPY_FROM_USER_IOCTL( vertex, (drm_mach64_vertex_t *)data, sizeof(vertex) ); DRM_DEBUG( "%s: pid=%d buf=%p used=%lu discard=%d\n", - __FUNCTION__, current->pid, + __FUNCTION__, DRM_CURRENTPID, vertex.buf, vertex.used, vertex.discard ); if ( vertex.prim < 0 || vertex.prim > MACH64_PRIM_POLYGON ) { DRM_ERROR( "buffer prim %d\n", vertex.prim ); - return -EINVAL; + return DRM_ERR(EINVAL); } if ( vertex.used > MACH64_BUFFER_SIZE ) { DRM_ERROR( "Invalid vertex buffer size: %lu bytes\n", vertex.used ); - return -EINVAL; + return DRM_ERR(EINVAL); } RING_SPACE_TEST_WITH_RETURN( dev_priv ); @@ -830,12 +830,12 @@ sizeof(blit) ); DRM_DEBUG( "%s: pid=%d index=%d\n", - __FUNCTION__, current->pid, blit.idx ); + __FUNCTION__, DRM_CURRENTPID, blit.idx ); if ( blit.idx < 0 || blit.idx >= dma->buf_count ) { DRM_ERROR( "buffer index %d (of %d max)\n", blit.idx, dma->buf_count - 1 ); - return -EINVAL; + return DRM_ERR(EINVAL); } RING_SPACE_TEST_WITH_RETURN( dev_priv ); @@ -870,11 +870,13 @@ value = mach64_do_get_frames_queued( dev_priv ); break; default: - return -EINVAL; + return DRM_ERR(EINVAL); } - if ( copy_to_user( param.value, &value, sizeof(int) ) ) - return -EFAULT; + if ( DRM_COPY_TO_USER( param.value, &value, sizeof(int) ) ) { + DRM_ERROR( "copy_to_user\n" ); + return DRM_ERR(EFAULT); + } return 0; }