Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit d59431bf authored by Dave Airlie's avatar Dave Airlie Committed by Dave Airlie
Browse files

Refactor common, boilerplate ioctl code from drm_addbufs_* functions into


drm_addbufs. This makes the code more like the BSD code, and makes the
drm_addbufs_* functions callable in-kernel.

From: Ian Romanick <idr@us.ibm.com>
Signed-off-by: default avatarDave Airlie <airlied@linux.ie>
parent b84397d6
Loading
Loading
Loading
Loading
+44 −82
Original line number Diff line number Diff line
@@ -362,25 +362,19 @@ static void drm_cleanup_buf_error(drm_device_t *dev, drm_buf_entry_t *entry)

#if __OS_HAS_AGP
/**
 * Add AGP buffers for DMA transfers (ioctl).
 * Add AGP buffers for DMA transfers.
 *
 * \param inode device inode.
 * \param filp file pointer.
 * \param cmd command.
 * \param arg pointer to a drm_buf_desc_t request.
 * \param dev drm_device_t to which the buffers are to be added.
 * \param request pointer to a drm_buf_desc_t describing the request.
 * \return zero on success or a negative number on failure.
 * 
 * After some sanity checks creates a drm_buf structure for each buffer and
 * reallocates the buffer list of the same size order to accommodate the new
 * buffers.
 */
static int drm_addbufs_agp( struct inode *inode, struct file *filp,
			    unsigned int cmd, unsigned long arg )
static int drm_addbufs_agp(drm_device_t *dev, drm_buf_desc_t *request)
{
	drm_file_t *priv = filp->private_data;
	drm_device_t *dev = priv->head->dev;
	drm_device_dma_t *dma = dev->dma;
	drm_buf_desc_t request;
	drm_buf_entry_t *entry;
	drm_buf_t *buf;
	unsigned long offset;
@@ -394,25 +388,20 @@ static int drm_addbufs_agp( struct inode *inode, struct file *filp,
	int byte_count;
	int i;
	drm_buf_t **temp_buflist;
	drm_buf_desc_t __user *argp = (void __user *)arg;

	if ( !dma ) return -EINVAL;

	if ( copy_from_user( &request, argp,
			     sizeof(request) ) )
		return -EFAULT;

	count = request.count;
	order = drm_order( request.size );
	count = request->count;
	order = drm_order(request->size);
	size = 1 << order;

	alignment  = (request.flags & _DRM_PAGE_ALIGN)
	alignment  = (request->flags & _DRM_PAGE_ALIGN)
		? PAGE_ALIGN(size) : size;
	page_order = order - PAGE_SHIFT > 0 ? order - PAGE_SHIFT : 0;
	total = PAGE_SIZE << page_order;

	byte_count = 0;
	agp_offset = dev->agp->base + request.agp_start;
	agp_offset = dev->agp->base + request->agp_start;

	DRM_DEBUG( "count:      %d\n",  count );
	DRM_DEBUG( "order:      %d\n",  order );
@@ -526,11 +515,8 @@ static int drm_addbufs_agp( struct inode *inode, struct file *filp,

	up( &dev->struct_sem );

	request.count = entry->buf_count;
	request.size = size;

	if ( copy_to_user( argp, &request, sizeof(request) ) )
		return -EFAULT;
	request->count = entry->buf_count;
	request->size = size;

	dma->flags = _DRM_DMA_USE_AGP;

@@ -539,13 +525,9 @@ static int drm_addbufs_agp( struct inode *inode, struct file *filp,
}
#endif /* __OS_HAS_AGP */

static int drm_addbufs_pci( struct inode *inode, struct file *filp,
			    unsigned int cmd, unsigned long arg )
static int drm_addbufs_pci(drm_device_t *dev, drm_buf_desc_t *request)
{
   	drm_file_t *priv = filp->private_data;
	drm_device_t *dev = priv->head->dev;
	drm_device_dma_t *dma = dev->dma;
	drm_buf_desc_t request;
	int count;
	int order;
	int size;
@@ -561,26 +543,22 @@ static int drm_addbufs_pci( struct inode *inode, struct file *filp,
	int page_count;
	unsigned long *temp_pagelist;
	drm_buf_t **temp_buflist;
	drm_buf_desc_t __user *argp = (void __user *)arg;

	if (!drm_core_check_feature(dev, DRIVER_PCI_DMA)) return -EINVAL;
	if ( !dma ) return -EINVAL;

	if ( copy_from_user( &request, argp, sizeof(request) ) )
		return -EFAULT;

	count = request.count;
	order = drm_order( request.size );
	count = request->count;
	order = drm_order(request->size);
	size = 1 << order;

	DRM_DEBUG( "count=%d, size=%d (%d), order=%d, queue_count=%d\n",
		   request.count, request.size, size,
		   request->count, request->size, size,
		   order, dev->queue_count );

	if ( order < DRM_MIN_ORDER || order > DRM_MAX_ORDER ) return -EINVAL;
	if ( dev->queue_count ) return -EBUSY; /* Not while in use */

	alignment = (request.flags & _DRM_PAGE_ALIGN)
	alignment = (request->flags & _DRM_PAGE_ALIGN)
		? PAGE_ALIGN(size) : size;
	page_order = order - PAGE_SHIFT > 0 ? order - PAGE_SHIFT : 0;
	total = PAGE_SIZE << page_order;
@@ -758,25 +736,17 @@ static int drm_addbufs_pci( struct inode *inode, struct file *filp,

	up( &dev->struct_sem );

	request.count = entry->buf_count;
	request.size = size;

	if ( copy_to_user( argp, &request, sizeof(request) ) )
		return -EFAULT;
	request->count = entry->buf_count;
	request->size = size;

	atomic_dec( &dev->buf_alloc );
	return 0;

}

static int drm_addbufs_sg( struct inode *inode, struct file *filp,
			   unsigned int cmd, unsigned long arg )
static int drm_addbufs_sg(drm_device_t *dev, drm_buf_desc_t *request)
{
	drm_file_t *priv = filp->private_data;
	drm_device_t *dev = priv->head->dev;
	drm_device_dma_t *dma = dev->dma;
	drm_buf_desc_t __user *argp = (void __user *)arg;
	drm_buf_desc_t request;
	drm_buf_entry_t *entry;
	drm_buf_t *buf;
	unsigned long offset;
@@ -795,20 +765,17 @@ static int drm_addbufs_sg( struct inode *inode, struct file *filp,
	
	if ( !dma ) return -EINVAL;

	if ( copy_from_user( &request, argp, sizeof(request) ) )
		return -EFAULT;

	count = request.count;
	order = drm_order( request.size );
	count = request->count;
	order = drm_order(request->size);
	size = 1 << order;

	alignment  = (request.flags & _DRM_PAGE_ALIGN)
	alignment  = (request->flags & _DRM_PAGE_ALIGN)
			? PAGE_ALIGN(size) : size;
	page_order = order - PAGE_SHIFT > 0 ? order - PAGE_SHIFT : 0;
	total = PAGE_SIZE << page_order;

	byte_count = 0;
	agp_offset = request.agp_start;
	agp_offset = request->agp_start;

	DRM_DEBUG( "count:      %d\n",  count );
	DRM_DEBUG( "order:      %d\n",  order );
@@ -923,11 +890,8 @@ static int drm_addbufs_sg( struct inode *inode, struct file *filp,

	up( &dev->struct_sem );

	request.count = entry->buf_count;
	request.size = size;

	if ( copy_to_user( argp, &request, sizeof(request) ) )
		return -EFAULT;
	request->count = entry->buf_count;
	request->size = size;

	dma->flags = _DRM_DMA_USE_SG;

@@ -935,13 +899,9 @@ static int drm_addbufs_sg( struct inode *inode, struct file *filp,
	return 0;
}

int drm_addbufs_fb(struct inode *inode, struct file *filp,
		    unsigned int cmd, unsigned long arg)
int drm_addbufs_fb(drm_device_t *dev, drm_buf_desc_t *request)
{
	drm_file_t *priv = filp->private_data;
	drm_device_t *dev = priv->head->dev;
	drm_device_dma_t *dma = dev->dma;
	drm_buf_desc_t request;
	drm_buf_entry_t *entry;
	drm_buf_t *buf;
	unsigned long offset;
@@ -955,7 +915,6 @@ int drm_addbufs_fb(struct inode *inode, struct file *filp,
	int byte_count;
	int i;
	drm_buf_t **temp_buflist;
	drm_buf_desc_t __user *argp = (void __user *)arg;

	if (!drm_core_check_feature(dev, DRIVER_FB_DMA))
		return -EINVAL;
@@ -963,20 +922,17 @@ int drm_addbufs_fb(struct inode *inode, struct file *filp,
	if (!dma)
		return -EINVAL;

	if (copy_from_user(&request, argp, sizeof(request)))
		return -EFAULT;

	count = request.count;
	order = drm_order(request.size);
	count = request->count;
	order = drm_order(request->size);
	size = 1 << order;

	alignment = (request.flags & _DRM_PAGE_ALIGN)
	alignment = (request->flags & _DRM_PAGE_ALIGN)
	    ? PAGE_ALIGN(size) : size;
	page_order = order - PAGE_SHIFT > 0 ? order - PAGE_SHIFT : 0;
	total = PAGE_SIZE << page_order;

	byte_count = 0;
	agp_offset = request.agp_start;
	agp_offset = request->agp_start;

	DRM_DEBUG("count:      %d\n", count);
	DRM_DEBUG("order:      %d\n", order);
@@ -1089,11 +1045,8 @@ int drm_addbufs_fb(struct inode *inode, struct file *filp,

	up(&dev->struct_sem);

	request.count = entry->buf_count;
	request.size = size;

	if (copy_to_user(argp, &request, sizeof(request)))
		return -EFAULT;
	request->count = entry->buf_count;
	request->size = size;

	dma->flags = _DRM_DMA_USE_FB;

@@ -1121,6 +1074,7 @@ int drm_addbufs( struct inode *inode, struct file *filp,
	drm_buf_desc_t request;
	drm_file_t *priv = filp->private_data;
	drm_device_t *dev = priv->head->dev;
	int ret;
	
	if (!drm_core_check_feature(dev, DRIVER_HAVE_DMA))
		return -EINVAL;
@@ -1131,15 +1085,23 @@ int drm_addbufs( struct inode *inode, struct file *filp,

#if __OS_HAS_AGP
	if ( request.flags & _DRM_AGP_BUFFER )
		return drm_addbufs_agp( inode, filp, cmd, arg );
		ret=drm_addbufs_agp(dev, &request);
	else
#endif
	if ( request.flags & _DRM_SG_BUFFER )
		return drm_addbufs_sg( inode, filp, cmd, arg );
		ret=drm_addbufs_sg(dev, &request);
	else if ( request.flags & _DRM_FB_BUFFER)
		return drm_addbufs_fb( inode, filp, cmd, arg );
		ret=drm_addbufs_fb(dev, &request);
	else
		return drm_addbufs_pci( inode, filp, cmd, arg );
		ret=drm_addbufs_pci(dev, &request);

	if (ret==0) {
		if (copy_to_user((void __user *)arg, &request,
				 sizeof(request))) {
			ret = -EFAULT;
		}
	}
	return ret;
}