2018-02-14 16:07:20 +00:00
/*
2005-07-07 21:51:26 +10:00
* 32 - bit ioctl compatibility routines for the i915 DRM .
*
* 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 .
2018-02-14 16:07:20 +00:00
*
* Author : Alan Hourihane < alanh @ fairlite . demon . co . uk >
2005-07-07 21:51:26 +10:00
*/
# include <linux/compat.h>
2019-01-17 22:03:34 +01:00
# include <drm/drm_ioctl.h>
2020-02-27 19:00:45 +02:00
2012-04-16 14:07:40 -07:00
# include "i915_drv.h"
2022-01-07 15:20:43 +02:00
# include "i915_getparam.h"
2020-02-27 19:00:45 +02:00
# include "i915_ioc32.h"
2005-07-07 21:51:26 +10:00
2015-07-14 18:07:30 +02:00
struct drm_i915_getparam32 {
s32 param ;
/*
* We screwed up the generic ioctl struct here and used a variable - sized
* pointer . Use u32 in the compat struct to match the 32 bit pointer
* userspace expects .
*/
2005-07-07 21:51:26 +10:00
u32 value ;
2015-07-14 18:07:30 +02:00
} ;
2005-07-07 21:51:26 +10:00
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
{
2015-07-14 18:07:30 +02:00
struct drm_i915_getparam32 req32 ;
2020-02-19 11:20:34 -05:00
struct drm_i915_getparam req ;
2005-07-07 21:51:26 +10:00
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 ;
2020-02-19 11:20:34 -05:00
req . param = req32 . param ;
req . value = compat_ptr ( req32 . value ) ;
2005-07-07 21:51:26 +10:00
2020-02-19 11:20:34 -05:00
return drm_ioctl_kernel ( file , i915_getparam_ioctl , & req ,
DRM_RENDER_ALLOW ) ;
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_GETPARAM ] = compat_i915_getparam ,
} ;
/**
2020-02-27 19:00:45 +02:00
* i915_ioc32_compat_ioctl - handle the mistakes of the past
2018-02-14 16:07:20 +00:00
* @ filp : the file pointer
* @ cmd : the ioctl command ( and encoded flags )
* @ arg : the ioctl argument ( from userspace )
*
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 > .
*/
2020-02-27 19:00:45 +02:00
long i915_ioc32_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 ;
2015-07-13 16:51:39 +01:00
if ( nr < DRM_COMMAND_BASE | | nr > = DRM_COMMAND_END )
2005-07-07 21:51:26 +10:00
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 ;
}