2005-07-07 21:51:26 +10:00
/**
* \ file i915_ioc32 . c
*
* 32 - bit ioctl compatibility routines for the i915 DRM .
*
2005-09-25 14:28:13 +10:00
* \ author Alan Hourihane < alanh @ fairlite . demon . co . uk >
2005-07-07 21:51:26 +10:00
*
*
* Copyright ( C ) Paul Mackerras 2005
* Copyright ( C ) Alan Hourihane 2005
* All Rights Reserved .
*
* Permission is hereby granted , free of charge , to any person obtaining a
* copy of this software and associated documentation files ( the " Software " ) ,
* to deal in the Software without restriction , including without limitation
* the rights to use , copy , modify , merge , publish , distribute , sublicense ,
* and / or sell copies of the Software , and to permit persons to whom the
* Software is furnished to do so , subject to the following conditions :
*
* The above copyright notice and this permission notice ( including the next
* paragraph ) shall be included in all copies or substantial portions of the
* Software .
*
* THE SOFTWARE IS PROVIDED " AS IS " , WITHOUT WARRANTY OF ANY KIND , EXPRESS OR
* IMPLIED , INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY ,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT . IN NO EVENT SHALL
* THE AUTHOR BE LIABLE FOR ANY CLAIM , DAMAGES OR OTHER LIABILITY ,
* WHETHER IN AN ACTION OF CONTRACT , TORT OR OTHERWISE , ARISING FROM ,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
* IN THE SOFTWARE .
*/
# include <linux/compat.h>
2012-10-02 18:01:07 +01:00
# include <drm/drmP.h>
# include <drm/i915_drm.h>
2012-04-16 14:07:40 -07:00
# include "i915_drv.h"
2005-07-07 21:51:26 +10:00
typedef struct _drm_i915_batchbuffer32 {
int start ; /* agp offset */
int used ; /* nr bytes in use */
int DR1 ; /* hw flags for GFX_OP_DRAWRECT_INFO */
int DR4 ; /* window origin for GFX_OP_DRAWRECT_INFO */
int num_cliprects ; /* mulitpass with multiple cliprects? */
2005-09-25 14:28:13 +10:00
u32 cliprects ; /* pointer to userspace cliprects */
2005-07-07 21:51:26 +10:00
} drm_i915_batchbuffer32_t ;
static int compat_i915_batchbuffer ( struct file * file , unsigned int cmd ,
2005-09-25 14:28:13 +10:00
unsigned long arg )
2005-07-07 21:51:26 +10:00
{
drm_i915_batchbuffer32_t batchbuffer32 ;
drm_i915_batchbuffer_t __user * batchbuffer ;
2005-09-25 14:28:13 +10:00
if ( copy_from_user
( & batchbuffer32 , ( void __user * ) arg , sizeof ( batchbuffer32 ) ) )
2005-07-07 21:51:26 +10:00
return - EFAULT ;
2005-09-25 14:28:13 +10:00
2005-07-07 21:51:26 +10:00
batchbuffer = compat_alloc_user_space ( sizeof ( * batchbuffer ) ) ;
if ( ! access_ok ( VERIFY_WRITE , batchbuffer , sizeof ( * batchbuffer ) )
| | __put_user ( batchbuffer32 . start , & batchbuffer - > start )
| | __put_user ( batchbuffer32 . used , & batchbuffer - > used )
| | __put_user ( batchbuffer32 . DR1 , & batchbuffer - > DR1 )
| | __put_user ( batchbuffer32 . DR4 , & batchbuffer - > DR4 )
2005-09-25 14:28:13 +10:00
| | __put_user ( batchbuffer32 . num_cliprects ,
& batchbuffer - > num_cliprects )
2005-07-07 21:51:26 +10:00
| | __put_user ( ( int __user * ) ( unsigned long ) batchbuffer32 . cliprects ,
& batchbuffer - > cliprects ) )
return - EFAULT ;
2005-09-25 14:28:13 +10:00
2009-12-16 22:17:09 +00:00
return drm_ioctl ( file , DRM_IOCTL_I915_BATCHBUFFER ,
2005-09-25 14:28:13 +10:00
( unsigned long ) batchbuffer ) ;
2005-07-07 21:51:26 +10:00
}
typedef struct _drm_i915_cmdbuffer32 {
2005-09-25 14:28:13 +10:00
u32 buf ; /* pointer to userspace command buffer */
2005-07-07 21:51:26 +10:00
int sz ; /* nr bytes in buf */
int DR1 ; /* hw flags for GFX_OP_DRAWRECT_INFO */
int DR4 ; /* window origin for GFX_OP_DRAWRECT_INFO */
int num_cliprects ; /* mulitpass with multiple cliprects? */
2005-09-25 14:28:13 +10:00
u32 cliprects ; /* pointer to userspace cliprects */
2005-07-07 21:51:26 +10:00
} drm_i915_cmdbuffer32_t ;
static int compat_i915_cmdbuffer ( struct file * file , unsigned int cmd ,
2005-09-25 14:28:13 +10:00
unsigned long arg )
2005-07-07 21:51:26 +10:00
{
drm_i915_cmdbuffer32_t cmdbuffer32 ;
drm_i915_cmdbuffer_t __user * cmdbuffer ;
2005-09-25 14:28:13 +10:00
if ( copy_from_user
( & cmdbuffer32 , ( void __user * ) arg , sizeof ( cmdbuffer32 ) ) )
2005-07-07 21:51:26 +10:00
return - EFAULT ;
2005-09-25 14:28:13 +10:00
2005-07-07 21:51:26 +10:00
cmdbuffer = compat_alloc_user_space ( sizeof ( * cmdbuffer ) ) ;
if ( ! access_ok ( VERIFY_WRITE , cmdbuffer , sizeof ( * cmdbuffer ) )
| | __put_user ( ( int __user * ) ( unsigned long ) cmdbuffer32 . buf ,
& cmdbuffer - > buf )
| | __put_user ( cmdbuffer32 . sz , & cmdbuffer - > sz )
| | __put_user ( cmdbuffer32 . DR1 , & cmdbuffer - > DR1 )
| | __put_user ( cmdbuffer32 . DR4 , & cmdbuffer - > DR4 )
| | __put_user ( cmdbuffer32 . num_cliprects , & cmdbuffer - > num_cliprects )
| | __put_user ( ( int __user * ) ( unsigned long ) cmdbuffer32 . cliprects ,
& cmdbuffer - > cliprects ) )
return - EFAULT ;
2005-09-25 14:28:13 +10:00
2009-12-16 22:17:09 +00:00
return drm_ioctl ( file , DRM_IOCTL_I915_CMDBUFFER ,
( unsigned long ) cmdbuffer ) ;
2005-07-07 21:51:26 +10:00
}
typedef struct drm_i915_irq_emit32 {
u32 irq_seq ;
} drm_i915_irq_emit32_t ;
static int compat_i915_irq_emit ( struct file * file , unsigned int cmd ,
2005-09-25 14:28:13 +10:00
unsigned long arg )
2005-07-07 21:51:26 +10:00
{
drm_i915_irq_emit32_t req32 ;
drm_i915_irq_emit_t __user * request ;
2005-09-25 14:28:13 +10:00
if ( copy_from_user ( & req32 , ( void __user * ) arg , sizeof ( req32 ) ) )
2005-07-07 21:51:26 +10:00
return - EFAULT ;
request = compat_alloc_user_space ( sizeof ( * request ) ) ;
if ( ! access_ok ( VERIFY_WRITE , request , sizeof ( * request ) )
| | __put_user ( ( int __user * ) ( unsigned long ) req32 . irq_seq ,
& request - > irq_seq ) )
return - EFAULT ;
2009-12-16 22:17:09 +00:00
return drm_ioctl ( file , DRM_IOCTL_I915_IRQ_EMIT ,
( unsigned long ) request ) ;
2005-07-07 21:51:26 +10:00
}
typedef struct drm_i915_getparam32 {
int param ;
u32 value ;
} drm_i915_getparam32_t ;
static int compat_i915_getparam ( struct file * file , unsigned int cmd ,
2005-09-25 14:28:13 +10:00
unsigned long arg )
2005-07-07 21:51:26 +10:00
{
drm_i915_getparam32_t req32 ;
drm_i915_getparam_t __user * request ;
2005-09-25 14:28:13 +10:00
if ( copy_from_user ( & req32 , ( void __user * ) arg , sizeof ( req32 ) ) )
2005-07-07 21:51:26 +10:00
return - EFAULT ;
request = compat_alloc_user_space ( sizeof ( * request ) ) ;
if ( ! access_ok ( VERIFY_WRITE , request , sizeof ( * request ) )
| | __put_user ( req32 . param , & request - > param )
| | __put_user ( ( void __user * ) ( unsigned long ) req32 . value ,
& request - > value ) )
return - EFAULT ;
2009-12-16 22:17:09 +00:00
return drm_ioctl ( file , DRM_IOCTL_I915_GETPARAM ,
( unsigned long ) request ) ;
2005-07-07 21:51:26 +10:00
}
typedef struct drm_i915_mem_alloc32 {
int region ;
int alignment ;
int size ;
u32 region_offset ; /* offset from start of fb or agp */
} drm_i915_mem_alloc32_t ;
static int compat_i915_alloc ( struct file * file , unsigned int cmd ,
2005-09-25 14:28:13 +10:00
unsigned long arg )
2005-07-07 21:51:26 +10:00
{
drm_i915_mem_alloc32_t req32 ;
drm_i915_mem_alloc_t __user * request ;
2005-09-25 14:28:13 +10:00
if ( copy_from_user ( & req32 , ( void __user * ) arg , sizeof ( req32 ) ) )
2005-07-07 21:51:26 +10:00
return - EFAULT ;
request = compat_alloc_user_space ( sizeof ( * request ) ) ;
if ( ! access_ok ( VERIFY_WRITE , request , sizeof ( * request ) )
| | __put_user ( req32 . region , & request - > region )
| | __put_user ( req32 . alignment , & request - > alignment )
| | __put_user ( req32 . size , & request - > size )
| | __put_user ( ( void __user * ) ( unsigned long ) req32 . region_offset ,
& request - > region_offset ) )
return - EFAULT ;
2009-12-16 22:17:09 +00:00
return drm_ioctl ( file , DRM_IOCTL_I915_ALLOC ,
( unsigned long ) request ) ;
2005-07-07 21:51:26 +10:00
}
2012-04-16 14:07:40 -07:00
static drm_ioctl_compat_t * i915_compat_ioctls [ ] = {
2005-07-07 21:51:26 +10:00
[ DRM_I915_BATCHBUFFER ] = compat_i915_batchbuffer ,
[ DRM_I915_CMDBUFFER ] = compat_i915_cmdbuffer ,
[ DRM_I915_GETPARAM ] = compat_i915_getparam ,
[ DRM_I915_IRQ_EMIT ] = compat_i915_irq_emit ,
[ DRM_I915_ALLOC ] = compat_i915_alloc
} ;
2012-04-16 14:07:40 -07:00
# ifdef CONFIG_COMPAT
2005-07-07 21:51:26 +10:00
/**
* Called whenever a 32 - bit process running under a 64 - bit kernel
* performs an ioctl on / dev / dri / card < n > .
*
* \ param filp file pointer .
* \ param cmd command .
* \ param arg user argument .
* \ return zero on success or negative number on failure .
*/
2005-09-25 14:28:13 +10:00
long i915_compat_ioctl ( struct file * filp , unsigned int cmd , unsigned long arg )
2005-07-07 21:51:26 +10:00
{
unsigned int nr = DRM_IOCTL_NR ( cmd ) ;
drm_ioctl_compat_t * fn = NULL ;
int ret ;
if ( nr < DRM_COMMAND_BASE )
return drm_compat_ioctl ( filp , cmd , arg ) ;
2005-09-25 14:28:13 +10:00
2014-06-09 14:39:49 +01:00
if ( nr < DRM_COMMAND_BASE + ARRAY_SIZE ( i915_compat_ioctls ) )
2005-07-07 21:51:26 +10:00
fn = i915_compat_ioctls [ nr - DRM_COMMAND_BASE ] ;
if ( fn ! = NULL )
2005-09-25 14:28:13 +10:00
ret = ( * fn ) ( filp , cmd , arg ) ;
2005-07-07 21:51:26 +10:00
else
2009-12-16 22:17:09 +00:00
ret = drm_ioctl ( filp , cmd , arg ) ;
2005-07-07 21:51:26 +10:00
return ret ;
}
2012-04-16 14:07:40 -07:00
# endif