diff options
| -rw-r--r-- | linux-core/drm_drv.c | 21 | ||||
| -rw-r--r-- | linux-core/i810_dma.c | 24 | ||||
| -rw-r--r-- | linux/drm_drv.h | 21 | ||||
| -rw-r--r-- | linux/i810_dma.c | 24 | 
4 files changed, 82 insertions, 8 deletions
diff --git a/linux-core/drm_drv.c b/linux-core/drm_drv.c index 7447ca6d..87da5951 100644 --- a/linux-core/drm_drv.c +++ b/linux-core/drm_drv.c @@ -81,6 +81,9 @@  #ifndef __HAVE_COUNTERS  #define __HAVE_COUNTERS			0  #endif +#ifndef __HAVE_SG +#define __HAVE_SG			0 +#endif  #ifndef DRIVER_PREINIT  #define DRIVER_PREINIT() @@ -135,8 +138,10 @@ static drm_ioctl_desc_t		  DRM(ioctls)[] = {  	[DRM_IOCTL_NR(DRM_IOCTL_ADD_MAP)]       = { DRM(addmap),      1, 1 },  	[DRM_IOCTL_NR(DRM_IOCTL_RM_MAP)]        = { DRM(rmmap),       1, 0 }, +#if __HAVE_CTX_BITMAP  	[DRM_IOCTL_NR(DRM_IOCTL_SET_SAREA_CTX)] = { DRM(setsareactx), 1, 1 },  	[DRM_IOCTL_NR(DRM_IOCTL_GET_SAREA_CTX)] = { DRM(getsareactx), 1, 0 }, +#endif  	[DRM_IOCTL_NR(DRM_IOCTL_ADD_CTX)]       = { DRM(addctx),      1, 1 },  	[DRM_IOCTL_NR(DRM_IOCTL_RM_CTX)]        = { DRM(rmctx),       1, 1 }, @@ -178,6 +183,11 @@ static drm_ioctl_desc_t		  DRM(ioctls)[] = {  	[DRM_IOCTL_NR(DRM_IOCTL_AGP_UNBIND)]    = { DRM(agp_unbind),  1, 1 },  #endif +#if __HAVE_SG +	[DRM_IOCTL_NR(DRM_IOCTL_SG_ALLOC)]      = { DRM(sg_alloc),    1, 1 }, +	[DRM_IOCTL_NR(DRM_IOCTL_SG_FREE)]       = { DRM(sg_free),     1, 1 }, +#endif +  	DRIVER_IOCTLS  }; @@ -415,6 +425,17 @@ static int DRM(takedown)( drm_device_t *dev )  				 * handled in the AGP/GART driver.  				 */  				break; +                       case _DRM_SCATTER_GATHER: +				/* Handle it, but do nothing, if HAVE_SG +				 * isn't defined. +				 */ +#if __HAVE_SG +				if(dev->sg) { +					DRM(sg_cleanup)(dev->sg); +					dev->sg = NULL; +				} +#endif +				break;  			}   			DRM(free)(map, sizeof(*map), DRM_MEM_MAPS);   		} diff --git a/linux-core/i810_dma.c b/linux-core/i810_dma.c index 4c90496a..8a5503ea 100644 --- a/linux-core/i810_dma.c +++ b/linux-core/i810_dma.c @@ -182,7 +182,11 @@ static int i810_map_buffer(drm_buf_t *buf, struct file *filp)  	if(buf_priv->currently_mapped == I810_BUF_MAPPED) return -EINVAL;  	if(VM_DONTCOPY != 0) { -		down(¤t->mm->mmap_sem); +#if LINUX_VERSION_CODE <= 0x020402 +		down( ¤t->mm->mmap_sem ); +#else +		down_write( ¤t->mm->mmap_sem ); +#endif  		old_fops = filp->f_op;  		filp->f_op = &i810_buffer_fops;  		dev_priv->mmap_buffer = buf; @@ -198,7 +202,11 @@ static int i810_map_buffer(drm_buf_t *buf, struct file *filp)  			retcode = (signed int)buf_priv->virtual;  			buf_priv->virtual = 0;  		} -   		up(¤t->mm->mmap_sem); +#if LINUX_VERSION_CODE <= 0x020402 +		up( ¤t->mm->mmap_sem ); +#else +		up_write( ¤t->mm->mmap_sem ); +#endif  	} else {  		buf_priv->virtual = buf_priv->kernel_virtual;     		buf_priv->currently_mapped = I810_BUF_MAPPED; @@ -214,7 +222,11 @@ static int i810_unmap_buffer(drm_buf_t *buf)  	if(VM_DONTCOPY != 0) {  		if(buf_priv->currently_mapped != I810_BUF_MAPPED)  			return -EINVAL; -		down(¤t->mm->mmap_sem); +#if LINUX_VERSION_CODE <= 0x020402 +		down( ¤t->mm->mmap_sem ); +#else +		down_write( ¤t->mm->mmap_sem ); +#endif  #if LINUX_VERSION_CODE < 0x020399          	retcode = do_munmap((unsigned long)buf_priv->virtual,  				    (size_t) buf->total); @@ -223,7 +235,11 @@ static int i810_unmap_buffer(drm_buf_t *buf)  				    (unsigned long)buf_priv->virtual,  				    (size_t) buf->total);  #endif -   		up(¤t->mm->mmap_sem); +#if LINUX_VERSION_CODE <= 0x020402 +		up( ¤t->mm->mmap_sem ); +#else +		up_write( ¤t->mm->mmap_sem ); +#endif  	}     	buf_priv->currently_mapped = I810_BUF_UNMAPPED;     	buf_priv->virtual = 0; diff --git a/linux/drm_drv.h b/linux/drm_drv.h index 7447ca6d..87da5951 100644 --- a/linux/drm_drv.h +++ b/linux/drm_drv.h @@ -81,6 +81,9 @@  #ifndef __HAVE_COUNTERS  #define __HAVE_COUNTERS			0  #endif +#ifndef __HAVE_SG +#define __HAVE_SG			0 +#endif  #ifndef DRIVER_PREINIT  #define DRIVER_PREINIT() @@ -135,8 +138,10 @@ static drm_ioctl_desc_t		  DRM(ioctls)[] = {  	[DRM_IOCTL_NR(DRM_IOCTL_ADD_MAP)]       = { DRM(addmap),      1, 1 },  	[DRM_IOCTL_NR(DRM_IOCTL_RM_MAP)]        = { DRM(rmmap),       1, 0 }, +#if __HAVE_CTX_BITMAP  	[DRM_IOCTL_NR(DRM_IOCTL_SET_SAREA_CTX)] = { DRM(setsareactx), 1, 1 },  	[DRM_IOCTL_NR(DRM_IOCTL_GET_SAREA_CTX)] = { DRM(getsareactx), 1, 0 }, +#endif  	[DRM_IOCTL_NR(DRM_IOCTL_ADD_CTX)]       = { DRM(addctx),      1, 1 },  	[DRM_IOCTL_NR(DRM_IOCTL_RM_CTX)]        = { DRM(rmctx),       1, 1 }, @@ -178,6 +183,11 @@ static drm_ioctl_desc_t		  DRM(ioctls)[] = {  	[DRM_IOCTL_NR(DRM_IOCTL_AGP_UNBIND)]    = { DRM(agp_unbind),  1, 1 },  #endif +#if __HAVE_SG +	[DRM_IOCTL_NR(DRM_IOCTL_SG_ALLOC)]      = { DRM(sg_alloc),    1, 1 }, +	[DRM_IOCTL_NR(DRM_IOCTL_SG_FREE)]       = { DRM(sg_free),     1, 1 }, +#endif +  	DRIVER_IOCTLS  }; @@ -415,6 +425,17 @@ static int DRM(takedown)( drm_device_t *dev )  				 * handled in the AGP/GART driver.  				 */  				break; +                       case _DRM_SCATTER_GATHER: +				/* Handle it, but do nothing, if HAVE_SG +				 * isn't defined. +				 */ +#if __HAVE_SG +				if(dev->sg) { +					DRM(sg_cleanup)(dev->sg); +					dev->sg = NULL; +				} +#endif +				break;  			}   			DRM(free)(map, sizeof(*map), DRM_MEM_MAPS);   		} diff --git a/linux/i810_dma.c b/linux/i810_dma.c index 4c90496a..8a5503ea 100644 --- a/linux/i810_dma.c +++ b/linux/i810_dma.c @@ -182,7 +182,11 @@ static int i810_map_buffer(drm_buf_t *buf, struct file *filp)  	if(buf_priv->currently_mapped == I810_BUF_MAPPED) return -EINVAL;  	if(VM_DONTCOPY != 0) { -		down(¤t->mm->mmap_sem); +#if LINUX_VERSION_CODE <= 0x020402 +		down( ¤t->mm->mmap_sem ); +#else +		down_write( ¤t->mm->mmap_sem ); +#endif  		old_fops = filp->f_op;  		filp->f_op = &i810_buffer_fops;  		dev_priv->mmap_buffer = buf; @@ -198,7 +202,11 @@ static int i810_map_buffer(drm_buf_t *buf, struct file *filp)  			retcode = (signed int)buf_priv->virtual;  			buf_priv->virtual = 0;  		} -   		up(¤t->mm->mmap_sem); +#if LINUX_VERSION_CODE <= 0x020402 +		up( ¤t->mm->mmap_sem ); +#else +		up_write( ¤t->mm->mmap_sem ); +#endif  	} else {  		buf_priv->virtual = buf_priv->kernel_virtual;     		buf_priv->currently_mapped = I810_BUF_MAPPED; @@ -214,7 +222,11 @@ static int i810_unmap_buffer(drm_buf_t *buf)  	if(VM_DONTCOPY != 0) {  		if(buf_priv->currently_mapped != I810_BUF_MAPPED)  			return -EINVAL; -		down(¤t->mm->mmap_sem); +#if LINUX_VERSION_CODE <= 0x020402 +		down( ¤t->mm->mmap_sem ); +#else +		down_write( ¤t->mm->mmap_sem ); +#endif  #if LINUX_VERSION_CODE < 0x020399          	retcode = do_munmap((unsigned long)buf_priv->virtual,  				    (size_t) buf->total); @@ -223,7 +235,11 @@ static int i810_unmap_buffer(drm_buf_t *buf)  				    (unsigned long)buf_priv->virtual,  				    (size_t) buf->total);  #endif -   		up(¤t->mm->mmap_sem); +#if LINUX_VERSION_CODE <= 0x020402 +		up( ¤t->mm->mmap_sem ); +#else +		up_write( ¤t->mm->mmap_sem ); +#endif  	}     	buf_priv->currently_mapped = I810_BUF_UNMAPPED;     	buf_priv->virtual = 0;  | 
