drm_ioc32.c revision cafe8d8413399119c3f4cd575e0eb27e2654b9d5
19a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie/** 29a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie * \file drm_ioc32.c 39a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie * 49a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie * 32-bit ioctl compatibility routines for the DRM. 59a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie * 69a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie * \author Paul Mackerras <paulus@samba.org> 79a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie * 89a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie * Copyright (C) Paul Mackerras 2005. 99a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie * All Rights Reserved. 109a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie * 119a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie * Permission is hereby granted, free of charge, to any person obtaining a 129a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie * copy of this software and associated documentation files (the "Software"), 139a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie * to deal in the Software without restriction, including without limitation 149a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie * the rights to use, copy, modify, merge, publish, distribute, sublicense, 159a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie * and/or sell copies of the Software, and to permit persons to whom the 169a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie * Software is furnished to do so, subject to the following conditions: 179a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie * 189a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie * The above copyright notice and this permission notice (including the next 199a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie * paragraph) shall be included in all copies or substantial portions of the 209a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie * Software. 219a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie * 229a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 239a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 249a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 259a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie * THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 269a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 279a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS 289a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie * IN THE SOFTWARE. 299a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie */ 309a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie#include <linux/compat.h> 31cafe8d8413399119c3f4cd575e0eb27e2654b9d5Christian Dietrich#include <linux/ratelimit.h> 329a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 339a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie#include "drmP.h" 349a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie#include "drm_core.h" 359a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 369a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie#define DRM_IOCTL_VERSION32 DRM_IOWR(0x00, drm_version32_t) 379a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie#define DRM_IOCTL_GET_UNIQUE32 DRM_IOWR(0x01, drm_unique32_t) 389a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie#define DRM_IOCTL_GET_MAP32 DRM_IOWR(0x04, drm_map32_t) 399a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie#define DRM_IOCTL_GET_CLIENT32 DRM_IOWR(0x05, drm_client32_t) 409a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie#define DRM_IOCTL_GET_STATS32 DRM_IOR( 0x06, drm_stats32_t) 419a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 429a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie#define DRM_IOCTL_SET_UNIQUE32 DRM_IOW( 0x10, drm_unique32_t) 439a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie#define DRM_IOCTL_ADD_MAP32 DRM_IOWR(0x15, drm_map32_t) 449a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie#define DRM_IOCTL_ADD_BUFS32 DRM_IOWR(0x16, drm_buf_desc32_t) 459a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie#define DRM_IOCTL_MARK_BUFS32 DRM_IOW( 0x17, drm_buf_desc32_t) 469a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie#define DRM_IOCTL_INFO_BUFS32 DRM_IOWR(0x18, drm_buf_info32_t) 479a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie#define DRM_IOCTL_MAP_BUFS32 DRM_IOWR(0x19, drm_buf_map32_t) 489a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie#define DRM_IOCTL_FREE_BUFS32 DRM_IOW( 0x1a, drm_buf_free32_t) 499a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 509a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie#define DRM_IOCTL_RM_MAP32 DRM_IOW( 0x1b, drm_map32_t) 519a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 529a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie#define DRM_IOCTL_SET_SAREA_CTX32 DRM_IOW( 0x1c, drm_ctx_priv_map32_t) 539a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie#define DRM_IOCTL_GET_SAREA_CTX32 DRM_IOWR(0x1d, drm_ctx_priv_map32_t) 549a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 559a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie#define DRM_IOCTL_RES_CTX32 DRM_IOWR(0x26, drm_ctx_res32_t) 569a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie#define DRM_IOCTL_DMA32 DRM_IOWR(0x29, drm_dma32_t) 579a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 589a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie#define DRM_IOCTL_AGP_ENABLE32 DRM_IOW( 0x32, drm_agp_mode32_t) 599a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie#define DRM_IOCTL_AGP_INFO32 DRM_IOR( 0x33, drm_agp_info32_t) 609a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie#define DRM_IOCTL_AGP_ALLOC32 DRM_IOWR(0x34, drm_agp_buffer32_t) 619a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie#define DRM_IOCTL_AGP_FREE32 DRM_IOW( 0x35, drm_agp_buffer32_t) 629a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie#define DRM_IOCTL_AGP_BIND32 DRM_IOW( 0x36, drm_agp_binding32_t) 639a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie#define DRM_IOCTL_AGP_UNBIND32 DRM_IOW( 0x37, drm_agp_binding32_t) 649a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 659a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie#define DRM_IOCTL_SG_ALLOC32 DRM_IOW( 0x38, drm_scatter_gather32_t) 669a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie#define DRM_IOCTL_SG_FREE32 DRM_IOW( 0x39, drm_scatter_gather32_t) 679a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 6849568873705e45a0de77b7824a9a46d3201019a7Eric Anholt#define DRM_IOCTL_UPDATE_DRAW32 DRM_IOW( 0x3f, drm_update_draw32_t) 6949568873705e45a0de77b7824a9a46d3201019a7Eric Anholt 709a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie#define DRM_IOCTL_WAIT_VBLANK32 DRM_IOWR(0x3a, drm_wait_vblank32_t) 719a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 729a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlietypedef struct drm_version_32 { 73b5e89ed53ed8d24f83ba1941c07382af00ed238eDave Airlie int version_major; /**< Major version */ 74b5e89ed53ed8d24f83ba1941c07382af00ed238eDave Airlie int version_minor; /**< Minor version */ 75b5e89ed53ed8d24f83ba1941c07382af00ed238eDave Airlie int version_patchlevel; /**< Patch level */ 76b5e89ed53ed8d24f83ba1941c07382af00ed238eDave Airlie u32 name_len; /**< Length of name buffer */ 77b5e89ed53ed8d24f83ba1941c07382af00ed238eDave Airlie u32 name; /**< Name of driver */ 78b5e89ed53ed8d24f83ba1941c07382af00ed238eDave Airlie u32 date_len; /**< Length of date buffer */ 79b5e89ed53ed8d24f83ba1941c07382af00ed238eDave Airlie u32 date; /**< User-space buffer to hold date */ 80b5e89ed53ed8d24f83ba1941c07382af00ed238eDave Airlie u32 desc_len; /**< Length of desc buffer */ 81b5e89ed53ed8d24f83ba1941c07382af00ed238eDave Airlie u32 desc; /**< User-space buffer to hold desc */ 829a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie} drm_version32_t; 839a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 849a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airliestatic int compat_drm_version(struct file *file, unsigned int cmd, 859a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie unsigned long arg) 869a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie{ 879a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie drm_version32_t v32; 88ff4135aeb1f9a0201f8e22400ebc1d570df9016eDave Airlie struct drm_version __user *version; 899a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie int err; 909a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 91b5e89ed53ed8d24f83ba1941c07382af00ed238eDave Airlie if (copy_from_user(&v32, (void __user *)arg, sizeof(v32))) 929a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return -EFAULT; 939a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 949a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie version = compat_alloc_user_space(sizeof(*version)); 959a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (!access_ok(VERIFY_WRITE, version, sizeof(*version))) 969a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return -EFAULT; 979a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (__put_user(v32.name_len, &version->name_len) 989a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie || __put_user((void __user *)(unsigned long)v32.name, 999a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie &version->name) 1009a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie || __put_user(v32.date_len, &version->date_len) 1019a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie || __put_user((void __user *)(unsigned long)v32.date, 1029a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie &version->date) 1039a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie || __put_user(v32.desc_len, &version->desc_len) 1049a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie || __put_user((void __user *)(unsigned long)v32.desc, 1059a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie &version->desc)) 1069a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return -EFAULT; 1079a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 108ed8b67040965e4fe695db333d5914e18ea5f146fArnd Bergmann err = drm_ioctl(file, 109b5e89ed53ed8d24f83ba1941c07382af00ed238eDave Airlie DRM_IOCTL_VERSION, (unsigned long)version); 1109a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (err) 1119a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return err; 1129a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 1139a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (__get_user(v32.version_major, &version->version_major) 1149a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie || __get_user(v32.version_minor, &version->version_minor) 1159a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie || __get_user(v32.version_patchlevel, &version->version_patchlevel) 1169a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie || __get_user(v32.name_len, &version->name_len) 1179a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie || __get_user(v32.date_len, &version->date_len) 1189a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie || __get_user(v32.desc_len, &version->desc_len)) 1199a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return -EFAULT; 1209a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 121b5e89ed53ed8d24f83ba1941c07382af00ed238eDave Airlie if (copy_to_user((void __user *)arg, &v32, sizeof(v32))) 1229a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return -EFAULT; 1239a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return 0; 1249a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie} 1259a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 1269a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlietypedef struct drm_unique32 { 1279a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie u32 unique_len; /**< Length of unique */ 1289a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie u32 unique; /**< Unique name for driver instantiation */ 1299a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie} drm_unique32_t; 1309a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 1319a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airliestatic int compat_drm_getunique(struct file *file, unsigned int cmd, 1329a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie unsigned long arg) 1339a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie{ 1349a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie drm_unique32_t uq32; 135ff4135aeb1f9a0201f8e22400ebc1d570df9016eDave Airlie struct drm_unique __user *u; 1369a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie int err; 1379a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 138b5e89ed53ed8d24f83ba1941c07382af00ed238eDave Airlie if (copy_from_user(&uq32, (void __user *)arg, sizeof(uq32))) 1399a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return -EFAULT; 1409a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 1419a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie u = compat_alloc_user_space(sizeof(*u)); 1429a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (!access_ok(VERIFY_WRITE, u, sizeof(*u))) 1439a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return -EFAULT; 1449a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (__put_user(uq32.unique_len, &u->unique_len) 145b5e89ed53ed8d24f83ba1941c07382af00ed238eDave Airlie || __put_user((void __user *)(unsigned long)uq32.unique, 1469a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie &u->unique)) 1479a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return -EFAULT; 1489a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 149ed8b67040965e4fe695db333d5914e18ea5f146fArnd Bergmann err = drm_ioctl(file, DRM_IOCTL_GET_UNIQUE, (unsigned long)u); 1509a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (err) 1519a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return err; 1529a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 1539a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (__get_user(uq32.unique_len, &u->unique_len)) 1549a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return -EFAULT; 155b5e89ed53ed8d24f83ba1941c07382af00ed238eDave Airlie if (copy_to_user((void __user *)arg, &uq32, sizeof(uq32))) 1569a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return -EFAULT; 1579a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return 0; 1589a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie} 1599a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 1609a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airliestatic int compat_drm_setunique(struct file *file, unsigned int cmd, 1619a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie unsigned long arg) 1629a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie{ 1639a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie drm_unique32_t uq32; 164ff4135aeb1f9a0201f8e22400ebc1d570df9016eDave Airlie struct drm_unique __user *u; 1659a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 166b5e89ed53ed8d24f83ba1941c07382af00ed238eDave Airlie if (copy_from_user(&uq32, (void __user *)arg, sizeof(uq32))) 1679a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return -EFAULT; 1689a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 1699a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie u = compat_alloc_user_space(sizeof(*u)); 1709a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (!access_ok(VERIFY_WRITE, u, sizeof(*u))) 1719a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return -EFAULT; 1729a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (__put_user(uq32.unique_len, &u->unique_len) 173b5e89ed53ed8d24f83ba1941c07382af00ed238eDave Airlie || __put_user((void __user *)(unsigned long)uq32.unique, 1749a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie &u->unique)) 1759a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return -EFAULT; 1769a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 177ed8b67040965e4fe695db333d5914e18ea5f146fArnd Bergmann return drm_ioctl(file, DRM_IOCTL_SET_UNIQUE, (unsigned long)u); 1789a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie} 1799a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 1809a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlietypedef struct drm_map32 { 181b5e89ed53ed8d24f83ba1941c07382af00ed238eDave Airlie u32 offset; /**< Requested physical address (0 for SAREA)*/ 182b5e89ed53ed8d24f83ba1941c07382af00ed238eDave Airlie u32 size; /**< Requested physical size (bytes) */ 183ff4135aeb1f9a0201f8e22400ebc1d570df9016eDave Airlie enum drm_map_type type; /**< Type of memory to map */ 184ff4135aeb1f9a0201f8e22400ebc1d570df9016eDave Airlie enum drm_map_flags flags; /**< Flags */ 185b5e89ed53ed8d24f83ba1941c07382af00ed238eDave Airlie u32 handle; /**< User-space: "Handle" to pass to mmap() */ 186b5e89ed53ed8d24f83ba1941c07382af00ed238eDave Airlie int mtrr; /**< MTRR slot used */ 1879a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie} drm_map32_t; 1889a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 1899a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airliestatic int compat_drm_getmap(struct file *file, unsigned int cmd, 1909a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie unsigned long arg) 1919a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie{ 1929a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie drm_map32_t __user *argp = (void __user *)arg; 1939a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie drm_map32_t m32; 194ff4135aeb1f9a0201f8e22400ebc1d570df9016eDave Airlie struct drm_map __user *map; 1959a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie int idx, err; 1969a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie void *handle; 1979a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 1989a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (get_user(idx, &argp->offset)) 1999a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return -EFAULT; 2009a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 2019a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie map = compat_alloc_user_space(sizeof(*map)); 2029a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (!access_ok(VERIFY_WRITE, map, sizeof(*map))) 2039a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return -EFAULT; 2049a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (__put_user(idx, &map->offset)) 2059a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return -EFAULT; 2069a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 207ed8b67040965e4fe695db333d5914e18ea5f146fArnd Bergmann err = drm_ioctl(file, DRM_IOCTL_GET_MAP, (unsigned long)map); 2089a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (err) 2099a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return err; 2109a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 2119a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (__get_user(m32.offset, &map->offset) 2129a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie || __get_user(m32.size, &map->size) 2139a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie || __get_user(m32.type, &map->type) 2149a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie || __get_user(m32.flags, &map->flags) 2159a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie || __get_user(handle, &map->handle) 2169a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie || __get_user(m32.mtrr, &map->mtrr)) 2179a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return -EFAULT; 2189a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 219b5e89ed53ed8d24f83ba1941c07382af00ed238eDave Airlie m32.handle = (unsigned long)handle; 2209a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (copy_to_user(argp, &m32, sizeof(m32))) 2219a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return -EFAULT; 2229a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return 0; 2239a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 2249a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie} 2259a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 2269a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airliestatic int compat_drm_addmap(struct file *file, unsigned int cmd, 2279a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie unsigned long arg) 2289a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie{ 2299a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie drm_map32_t __user *argp = (void __user *)arg; 2309a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie drm_map32_t m32; 231ff4135aeb1f9a0201f8e22400ebc1d570df9016eDave Airlie struct drm_map __user *map; 2329a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie int err; 2339a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie void *handle; 2349a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 2359a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (copy_from_user(&m32, argp, sizeof(m32))) 2369a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return -EFAULT; 2379a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 2389a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie map = compat_alloc_user_space(sizeof(*map)); 2399a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (!access_ok(VERIFY_WRITE, map, sizeof(*map))) 2409a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return -EFAULT; 2419a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (__put_user(m32.offset, &map->offset) 2429a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie || __put_user(m32.size, &map->size) 2439a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie || __put_user(m32.type, &map->type) 2449a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie || __put_user(m32.flags, &map->flags)) 2459a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return -EFAULT; 2469a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 247ed8b67040965e4fe695db333d5914e18ea5f146fArnd Bergmann err = drm_ioctl(file, DRM_IOCTL_ADD_MAP, (unsigned long)map); 2489a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (err) 2499a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return err; 2509a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 2519a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (__get_user(m32.offset, &map->offset) 2529a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie || __get_user(m32.mtrr, &map->mtrr) 2539a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie || __get_user(handle, &map->handle)) 2549a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return -EFAULT; 2559a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 256b5e89ed53ed8d24f83ba1941c07382af00ed238eDave Airlie m32.handle = (unsigned long)handle; 257cafe8d8413399119c3f4cd575e0eb27e2654b9d5Christian Dietrich if (m32.handle != (unsigned long)handle) 258cafe8d8413399119c3f4cd575e0eb27e2654b9d5Christian Dietrich printk_ratelimited(KERN_ERR "compat_drm_addmap truncated handle" 259cafe8d8413399119c3f4cd575e0eb27e2654b9d5Christian Dietrich " %p for type %d offset %x\n", 260cafe8d8413399119c3f4cd575e0eb27e2654b9d5Christian Dietrich handle, m32.type, m32.offset); 2619a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 2629a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (copy_to_user(argp, &m32, sizeof(m32))) 2639a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return -EFAULT; 2649a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 2659a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return 0; 2669a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie} 2679a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 2689a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airliestatic int compat_drm_rmmap(struct file *file, unsigned int cmd, 2699a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie unsigned long arg) 2709a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie{ 2719a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie drm_map32_t __user *argp = (void __user *)arg; 272ff4135aeb1f9a0201f8e22400ebc1d570df9016eDave Airlie struct drm_map __user *map; 2739a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie u32 handle; 2749a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 2759a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (get_user(handle, &argp->handle)) 2769a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return -EFAULT; 2779a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 2789a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie map = compat_alloc_user_space(sizeof(*map)); 2799a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (!access_ok(VERIFY_WRITE, map, sizeof(*map))) 2809a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return -EFAULT; 281b5e89ed53ed8d24f83ba1941c07382af00ed238eDave Airlie if (__put_user((void *)(unsigned long)handle, &map->handle)) 2829a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return -EFAULT; 2839a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 284ed8b67040965e4fe695db333d5914e18ea5f146fArnd Bergmann return drm_ioctl(file, DRM_IOCTL_RM_MAP, (unsigned long)map); 2859a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie} 2869a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 2879a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlietypedef struct drm_client32 { 288b5e89ed53ed8d24f83ba1941c07382af00ed238eDave Airlie int idx; /**< Which client desired? */ 289b5e89ed53ed8d24f83ba1941c07382af00ed238eDave Airlie int auth; /**< Is client authenticated? */ 290b5e89ed53ed8d24f83ba1941c07382af00ed238eDave Airlie u32 pid; /**< Process ID */ 291b5e89ed53ed8d24f83ba1941c07382af00ed238eDave Airlie u32 uid; /**< User ID */ 292b5e89ed53ed8d24f83ba1941c07382af00ed238eDave Airlie u32 magic; /**< Magic */ 293b5e89ed53ed8d24f83ba1941c07382af00ed238eDave Airlie u32 iocs; /**< Ioctl count */ 2949a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie} drm_client32_t; 2959a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 2969a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airliestatic int compat_drm_getclient(struct file *file, unsigned int cmd, 2979a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie unsigned long arg) 2989a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie{ 2999a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie drm_client32_t c32; 3009a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie drm_client32_t __user *argp = (void __user *)arg; 301ff4135aeb1f9a0201f8e22400ebc1d570df9016eDave Airlie struct drm_client __user *client; 3029a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie int idx, err; 3039a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 3049a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (get_user(idx, &argp->idx)) 3059a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return -EFAULT; 3069a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 3079a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie client = compat_alloc_user_space(sizeof(*client)); 3089a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (!access_ok(VERIFY_WRITE, client, sizeof(*client))) 3099a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return -EFAULT; 3109a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (__put_user(idx, &client->idx)) 3119a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return -EFAULT; 3129a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 313ed8b67040965e4fe695db333d5914e18ea5f146fArnd Bergmann err = drm_ioctl(file, DRM_IOCTL_GET_CLIENT, (unsigned long)client); 3149a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (err) 3159a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return err; 3169a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 3179a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (__get_user(c32.auth, &client->auth) 3189a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie || __get_user(c32.pid, &client->pid) 3199a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie || __get_user(c32.uid, &client->uid) 3209a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie || __get_user(c32.magic, &client->magic) 3219a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie || __get_user(c32.iocs, &client->iocs)) 3229a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return -EFAULT; 3239a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 3249a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (copy_to_user(argp, &c32, sizeof(c32))) 3259a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return -EFAULT; 3269a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return 0; 3279a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie} 3289a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 3299a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlietypedef struct drm_stats32 { 3309a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie u32 count; 3319a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie struct { 3329a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie u32 value; 333ff4135aeb1f9a0201f8e22400ebc1d570df9016eDave Airlie enum drm_stat_type type; 3349a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie } data[15]; 3359a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie} drm_stats32_t; 3369a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 3379a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airliestatic int compat_drm_getstats(struct file *file, unsigned int cmd, 3389a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie unsigned long arg) 3399a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie{ 3409a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie drm_stats32_t s32; 3419a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie drm_stats32_t __user *argp = (void __user *)arg; 342ff4135aeb1f9a0201f8e22400ebc1d570df9016eDave Airlie struct drm_stats __user *stats; 3439a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie int i, err; 3449a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 3459a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie stats = compat_alloc_user_space(sizeof(*stats)); 3469a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (!access_ok(VERIFY_WRITE, stats, sizeof(*stats))) 3479a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return -EFAULT; 3489a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 349ed8b67040965e4fe695db333d5914e18ea5f146fArnd Bergmann err = drm_ioctl(file, DRM_IOCTL_GET_STATS, (unsigned long)stats); 3509a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (err) 3519a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return err; 3529a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 3539a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (__get_user(s32.count, &stats->count)) 3549a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return -EFAULT; 3559a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie for (i = 0; i < 15; ++i) 3569a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (__get_user(s32.data[i].value, &stats->data[i].value) 3579a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie || __get_user(s32.data[i].type, &stats->data[i].type)) 3589a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return -EFAULT; 3599a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 3609a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (copy_to_user(argp, &s32, sizeof(s32))) 3619a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return -EFAULT; 3629a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return 0; 3639a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie} 3649a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 3659a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlietypedef struct drm_buf_desc32 { 366b5e89ed53ed8d24f83ba1941c07382af00ed238eDave Airlie int count; /**< Number of buffers of this size */ 367b5e89ed53ed8d24f83ba1941c07382af00ed238eDave Airlie int size; /**< Size in bytes */ 368b5e89ed53ed8d24f83ba1941c07382af00ed238eDave Airlie int low_mark; /**< Low water mark */ 369b5e89ed53ed8d24f83ba1941c07382af00ed238eDave Airlie int high_mark; /**< High water mark */ 370b5e89ed53ed8d24f83ba1941c07382af00ed238eDave Airlie int flags; 371b5e89ed53ed8d24f83ba1941c07382af00ed238eDave Airlie u32 agp_start; /**< Start address in the AGP aperture */ 3729a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie} drm_buf_desc32_t; 3739a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 3749a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airliestatic int compat_drm_addbufs(struct file *file, unsigned int cmd, 3759a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie unsigned long arg) 3769a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie{ 3779a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie drm_buf_desc32_t __user *argp = (void __user *)arg; 378ff4135aeb1f9a0201f8e22400ebc1d570df9016eDave Airlie struct drm_buf_desc __user *buf; 3799a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie int err; 3809a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie unsigned long agp_start; 3819a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 3829a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie buf = compat_alloc_user_space(sizeof(*buf)); 3839a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (!access_ok(VERIFY_WRITE, buf, sizeof(*buf)) 3849a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie || !access_ok(VERIFY_WRITE, argp, sizeof(*argp))) 3859a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return -EFAULT; 3869a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 3879a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (__copy_in_user(buf, argp, offsetof(drm_buf_desc32_t, agp_start)) 3889a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie || __get_user(agp_start, &argp->agp_start) 3899a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie || __put_user(agp_start, &buf->agp_start)) 3909a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return -EFAULT; 3919a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 392ed8b67040965e4fe695db333d5914e18ea5f146fArnd Bergmann err = drm_ioctl(file, DRM_IOCTL_ADD_BUFS, (unsigned long)buf); 3939a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (err) 3949a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return err; 3959a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 3969a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (__copy_in_user(argp, buf, offsetof(drm_buf_desc32_t, agp_start)) 3979a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie || __get_user(agp_start, &buf->agp_start) 3989a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie || __put_user(agp_start, &argp->agp_start)) 3999a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return -EFAULT; 4009a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 4019a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return 0; 4029a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie} 4039a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 4049a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airliestatic int compat_drm_markbufs(struct file *file, unsigned int cmd, 4059a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie unsigned long arg) 4069a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie{ 4079a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie drm_buf_desc32_t b32; 4089a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie drm_buf_desc32_t __user *argp = (void __user *)arg; 409ff4135aeb1f9a0201f8e22400ebc1d570df9016eDave Airlie struct drm_buf_desc __user *buf; 4109a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 4119a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (copy_from_user(&b32, argp, sizeof(b32))) 4129a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return -EFAULT; 4139a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 4149a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie buf = compat_alloc_user_space(sizeof(*buf)); 4159a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (!access_ok(VERIFY_WRITE, buf, sizeof(*buf))) 4169a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return -EFAULT; 4179a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 4189a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (__put_user(b32.size, &buf->size) 4199a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie || __put_user(b32.low_mark, &buf->low_mark) 4209a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie || __put_user(b32.high_mark, &buf->high_mark)) 4219a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return -EFAULT; 4229a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 423ed8b67040965e4fe695db333d5914e18ea5f146fArnd Bergmann return drm_ioctl(file, DRM_IOCTL_MARK_BUFS, (unsigned long)buf); 4249a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie} 4259a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 4269a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlietypedef struct drm_buf_info32 { 427b5e89ed53ed8d24f83ba1941c07382af00ed238eDave Airlie int count; /**< Entries in list */ 428b5e89ed53ed8d24f83ba1941c07382af00ed238eDave Airlie u32 list; 4299a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie} drm_buf_info32_t; 4309a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 4319a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airliestatic int compat_drm_infobufs(struct file *file, unsigned int cmd, 4329a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie unsigned long arg) 4339a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie{ 4349a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie drm_buf_info32_t req32; 4359a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie drm_buf_info32_t __user *argp = (void __user *)arg; 4369a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie drm_buf_desc32_t __user *to; 437ff4135aeb1f9a0201f8e22400ebc1d570df9016eDave Airlie struct drm_buf_info __user *request; 438ff4135aeb1f9a0201f8e22400ebc1d570df9016eDave Airlie struct drm_buf_desc __user *list; 4399a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie size_t nbytes; 4409a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie int i, err; 4419a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie int count, actual; 4429a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 4439a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (copy_from_user(&req32, argp, sizeof(req32))) 4449a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return -EFAULT; 4459a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 4469a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie count = req32.count; 447b5e89ed53ed8d24f83ba1941c07382af00ed238eDave Airlie to = (drm_buf_desc32_t __user *) (unsigned long)req32.list; 4489a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (count < 0) 4499a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie count = 0; 4509a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (count > 0 4519a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie && !access_ok(VERIFY_WRITE, to, count * sizeof(drm_buf_desc32_t))) 4529a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return -EFAULT; 4539a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 454ff4135aeb1f9a0201f8e22400ebc1d570df9016eDave Airlie nbytes = sizeof(*request) + count * sizeof(struct drm_buf_desc); 4559a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie request = compat_alloc_user_space(nbytes); 4569a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (!access_ok(VERIFY_WRITE, request, nbytes)) 4579a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return -EFAULT; 458ff4135aeb1f9a0201f8e22400ebc1d570df9016eDave Airlie list = (struct drm_buf_desc *) (request + 1); 4599a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 4609a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (__put_user(count, &request->count) 4619a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie || __put_user(list, &request->list)) 4629a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return -EFAULT; 4639a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 464ed8b67040965e4fe695db333d5914e18ea5f146fArnd Bergmann err = drm_ioctl(file, DRM_IOCTL_INFO_BUFS, (unsigned long)request); 4659a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (err) 4669a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return err; 4679a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 4689a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (__get_user(actual, &request->count)) 4699a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return -EFAULT; 4709a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (count >= actual) 4719a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie for (i = 0; i < actual; ++i) 4729a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (__copy_in_user(&to[i], &list[i], 473ff4135aeb1f9a0201f8e22400ebc1d570df9016eDave Airlie offsetof(struct drm_buf_desc, flags))) 4749a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return -EFAULT; 4759a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 4769a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (__put_user(actual, &argp->count)) 4779a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return -EFAULT; 4789a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 4799a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return 0; 4809a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie} 4819a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 4829a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlietypedef struct drm_buf_pub32 { 483b5e89ed53ed8d24f83ba1941c07382af00ed238eDave Airlie int idx; /**< Index into the master buffer list */ 484b5e89ed53ed8d24f83ba1941c07382af00ed238eDave Airlie int total; /**< Buffer size */ 485b5e89ed53ed8d24f83ba1941c07382af00ed238eDave Airlie int used; /**< Amount of buffer in use (for DMA) */ 486b5e89ed53ed8d24f83ba1941c07382af00ed238eDave Airlie u32 address; /**< Address of buffer */ 4879a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie} drm_buf_pub32_t; 4889a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 4899a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlietypedef struct drm_buf_map32 { 490b5e89ed53ed8d24f83ba1941c07382af00ed238eDave Airlie int count; /**< Length of the buffer list */ 491b5e89ed53ed8d24f83ba1941c07382af00ed238eDave Airlie u32 virtual; /**< Mmap'd area in user-virtual */ 492b5e89ed53ed8d24f83ba1941c07382af00ed238eDave Airlie u32 list; /**< Buffer information */ 4939a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie} drm_buf_map32_t; 4949a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 4959a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airliestatic int compat_drm_mapbufs(struct file *file, unsigned int cmd, 4969a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie unsigned long arg) 4979a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie{ 4989a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie drm_buf_map32_t __user *argp = (void __user *)arg; 4999a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie drm_buf_map32_t req32; 5009a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie drm_buf_pub32_t __user *list32; 501ff4135aeb1f9a0201f8e22400ebc1d570df9016eDave Airlie struct drm_buf_map __user *request; 502ff4135aeb1f9a0201f8e22400ebc1d570df9016eDave Airlie struct drm_buf_pub __user *list; 5039a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie int i, err; 5049a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie int count, actual; 5059a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie size_t nbytes; 5069a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie void __user *addr; 5079a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 5089a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (copy_from_user(&req32, argp, sizeof(req32))) 5099a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return -EFAULT; 5109a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie count = req32.count; 5119a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie list32 = (void __user *)(unsigned long)req32.list; 5129a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 5139a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (count < 0) 5149a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return -EINVAL; 515ff4135aeb1f9a0201f8e22400ebc1d570df9016eDave Airlie nbytes = sizeof(*request) + count * sizeof(struct drm_buf_pub); 5169a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie request = compat_alloc_user_space(nbytes); 5179a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (!access_ok(VERIFY_WRITE, request, nbytes)) 5189a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return -EFAULT; 519ff4135aeb1f9a0201f8e22400ebc1d570df9016eDave Airlie list = (struct drm_buf_pub *) (request + 1); 5209a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 5219a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (__put_user(count, &request->count) 5229a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie || __put_user(list, &request->list)) 5239a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return -EFAULT; 5249a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 525ed8b67040965e4fe695db333d5914e18ea5f146fArnd Bergmann err = drm_ioctl(file, DRM_IOCTL_MAP_BUFS, (unsigned long)request); 5269a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (err) 5279a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return err; 5289a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 5299a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (__get_user(actual, &request->count)) 5309a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return -EFAULT; 5319a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (count >= actual) 5329a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie for (i = 0; i < actual; ++i) 5339a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (__copy_in_user(&list32[i], &list[i], 534ff4135aeb1f9a0201f8e22400ebc1d570df9016eDave Airlie offsetof(struct drm_buf_pub, address)) 5359a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie || __get_user(addr, &list[i].address) 536b5e89ed53ed8d24f83ba1941c07382af00ed238eDave Airlie || __put_user((unsigned long)addr, 5379a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie &list32[i].address)) 5389a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return -EFAULT; 5399a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 5409a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (__put_user(actual, &argp->count) 5419a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie || __get_user(addr, &request->virtual) 542b5e89ed53ed8d24f83ba1941c07382af00ed238eDave Airlie || __put_user((unsigned long)addr, &argp->virtual)) 5439a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return -EFAULT; 5449a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 5459a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return 0; 5469a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie} 5479a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 5489a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlietypedef struct drm_buf_free32 { 549b5e89ed53ed8d24f83ba1941c07382af00ed238eDave Airlie int count; 550b5e89ed53ed8d24f83ba1941c07382af00ed238eDave Airlie u32 list; 5519a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie} drm_buf_free32_t; 5529a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 5539a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airliestatic int compat_drm_freebufs(struct file *file, unsigned int cmd, 5549a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie unsigned long arg) 5559a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie{ 5569a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie drm_buf_free32_t req32; 557ff4135aeb1f9a0201f8e22400ebc1d570df9016eDave Airlie struct drm_buf_free __user *request; 5589a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie drm_buf_free32_t __user *argp = (void __user *)arg; 5599a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 5609a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (copy_from_user(&req32, argp, sizeof(req32))) 5619a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return -EFAULT; 5629a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 5639a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie request = compat_alloc_user_space(sizeof(*request)); 5649a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (!access_ok(VERIFY_WRITE, request, sizeof(*request))) 5659a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return -EFAULT; 5669a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (__put_user(req32.count, &request->count) 567b5e89ed53ed8d24f83ba1941c07382af00ed238eDave Airlie || __put_user((int __user *)(unsigned long)req32.list, 5689a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie &request->list)) 5699a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return -EFAULT; 5709a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 571ed8b67040965e4fe695db333d5914e18ea5f146fArnd Bergmann return drm_ioctl(file, DRM_IOCTL_FREE_BUFS, (unsigned long)request); 5729a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie} 5739a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 5749a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlietypedef struct drm_ctx_priv_map32 { 575b5e89ed53ed8d24f83ba1941c07382af00ed238eDave Airlie unsigned int ctx_id; /**< Context requesting private mapping */ 576b5e89ed53ed8d24f83ba1941c07382af00ed238eDave Airlie u32 handle; /**< Handle of map */ 5779a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie} drm_ctx_priv_map32_t; 5789a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 5799a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airliestatic int compat_drm_setsareactx(struct file *file, unsigned int cmd, 5809a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie unsigned long arg) 5819a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie{ 5829a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie drm_ctx_priv_map32_t req32; 583ff4135aeb1f9a0201f8e22400ebc1d570df9016eDave Airlie struct drm_ctx_priv_map __user *request; 5849a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie drm_ctx_priv_map32_t __user *argp = (void __user *)arg; 5859a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 5869a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (copy_from_user(&req32, argp, sizeof(req32))) 5879a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return -EFAULT; 5889a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 5899a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie request = compat_alloc_user_space(sizeof(*request)); 5909a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (!access_ok(VERIFY_WRITE, request, sizeof(*request))) 5919a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return -EFAULT; 5929a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (__put_user(req32.ctx_id, &request->ctx_id) 593b5e89ed53ed8d24f83ba1941c07382af00ed238eDave Airlie || __put_user((void *)(unsigned long)req32.handle, 5949a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie &request->handle)) 5959a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return -EFAULT; 5969a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 597ed8b67040965e4fe695db333d5914e18ea5f146fArnd Bergmann return drm_ioctl(file, DRM_IOCTL_SET_SAREA_CTX, (unsigned long)request); 5989a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie} 5999a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 6009a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airliestatic int compat_drm_getsareactx(struct file *file, unsigned int cmd, 6019a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie unsigned long arg) 6029a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie{ 603ff4135aeb1f9a0201f8e22400ebc1d570df9016eDave Airlie struct drm_ctx_priv_map __user *request; 6049a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie drm_ctx_priv_map32_t __user *argp = (void __user *)arg; 6059a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie int err; 6069a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie unsigned int ctx_id; 6079a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie void *handle; 6089a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 6099a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (!access_ok(VERIFY_WRITE, argp, sizeof(*argp)) 6109a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie || __get_user(ctx_id, &argp->ctx_id)) 6119a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return -EFAULT; 6129a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 6139a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie request = compat_alloc_user_space(sizeof(*request)); 6149a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (!access_ok(VERIFY_WRITE, request, sizeof(*request))) 6159a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return -EFAULT; 6169a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (__put_user(ctx_id, &request->ctx_id)) 6179a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return -EFAULT; 6189a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 619ed8b67040965e4fe695db333d5914e18ea5f146fArnd Bergmann err = drm_ioctl(file, DRM_IOCTL_GET_SAREA_CTX, (unsigned long)request); 6209a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (err) 6219a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return err; 6229a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 6239a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (__get_user(handle, &request->handle) 624b5e89ed53ed8d24f83ba1941c07382af00ed238eDave Airlie || __put_user((unsigned long)handle, &argp->handle)) 6259a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return -EFAULT; 6269a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 6279a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return 0; 6289a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie} 6299a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 6309a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlietypedef struct drm_ctx_res32 { 631b5e89ed53ed8d24f83ba1941c07382af00ed238eDave Airlie int count; 632b5e89ed53ed8d24f83ba1941c07382af00ed238eDave Airlie u32 contexts; 6339a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie} drm_ctx_res32_t; 6349a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 6359a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airliestatic int compat_drm_resctx(struct file *file, unsigned int cmd, 6369a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie unsigned long arg) 6379a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie{ 6389a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie drm_ctx_res32_t __user *argp = (void __user *)arg; 6399a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie drm_ctx_res32_t res32; 640ff4135aeb1f9a0201f8e22400ebc1d570df9016eDave Airlie struct drm_ctx_res __user *res; 6419a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie int err; 6429a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 6439a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (copy_from_user(&res32, argp, sizeof(res32))) 6449a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return -EFAULT; 6459a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 6469a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie res = compat_alloc_user_space(sizeof(*res)); 6479a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (!access_ok(VERIFY_WRITE, res, sizeof(*res))) 6489a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return -EFAULT; 6499a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (__put_user(res32.count, &res->count) 650ff4135aeb1f9a0201f8e22400ebc1d570df9016eDave Airlie || __put_user((struct drm_ctx __user *) (unsigned long)res32.contexts, 6519a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie &res->contexts)) 6529a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return -EFAULT; 6539a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 654ed8b67040965e4fe695db333d5914e18ea5f146fArnd Bergmann err = drm_ioctl(file, DRM_IOCTL_RES_CTX, (unsigned long)res); 6559a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (err) 6569a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return err; 6579a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 6589a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (__get_user(res32.count, &res->count) 6599a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie || __put_user(res32.count, &argp->count)) 6609a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return -EFAULT; 6619a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 6629a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return 0; 6639a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie} 6649a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 6659a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlietypedef struct drm_dma32 { 666b5e89ed53ed8d24f83ba1941c07382af00ed238eDave Airlie int context; /**< Context handle */ 667b5e89ed53ed8d24f83ba1941c07382af00ed238eDave Airlie int send_count; /**< Number of buffers to send */ 668b5e89ed53ed8d24f83ba1941c07382af00ed238eDave Airlie u32 send_indices; /**< List of handles to buffers */ 669b5e89ed53ed8d24f83ba1941c07382af00ed238eDave Airlie u32 send_sizes; /**< Lengths of data to send */ 670ff4135aeb1f9a0201f8e22400ebc1d570df9016eDave Airlie enum drm_dma_flags flags; /**< Flags */ 671b5e89ed53ed8d24f83ba1941c07382af00ed238eDave Airlie int request_count; /**< Number of buffers requested */ 672b5e89ed53ed8d24f83ba1941c07382af00ed238eDave Airlie int request_size; /**< Desired size for buffers */ 673b5e89ed53ed8d24f83ba1941c07382af00ed238eDave Airlie u32 request_indices; /**< Buffer information */ 674b5e89ed53ed8d24f83ba1941c07382af00ed238eDave Airlie u32 request_sizes; 675b5e89ed53ed8d24f83ba1941c07382af00ed238eDave Airlie int granted_count; /**< Number of buffers granted */ 6769a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie} drm_dma32_t; 6779a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 6789a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airliestatic int compat_drm_dma(struct file *file, unsigned int cmd, 6799a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie unsigned long arg) 6809a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie{ 6819a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie drm_dma32_t d32; 682b5e89ed53ed8d24f83ba1941c07382af00ed238eDave Airlie drm_dma32_t __user *argp = (void __user *)arg; 683ff4135aeb1f9a0201f8e22400ebc1d570df9016eDave Airlie struct drm_dma __user *d; 6849a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie int err; 6859a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 6869a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (copy_from_user(&d32, argp, sizeof(d32))) 6879a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return -EFAULT; 6889a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 6899a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie d = compat_alloc_user_space(sizeof(*d)); 6909a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (!access_ok(VERIFY_WRITE, d, sizeof(*d))) 6919a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return -EFAULT; 6929a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 6939a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (__put_user(d32.context, &d->context) 6949a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie || __put_user(d32.send_count, &d->send_count) 695b5e89ed53ed8d24f83ba1941c07382af00ed238eDave Airlie || __put_user((int __user *)(unsigned long)d32.send_indices, 6969a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie &d->send_indices) 697b5e89ed53ed8d24f83ba1941c07382af00ed238eDave Airlie || __put_user((int __user *)(unsigned long)d32.send_sizes, 6989a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie &d->send_sizes) 6999a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie || __put_user(d32.flags, &d->flags) 7009a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie || __put_user(d32.request_count, &d->request_count) 701b5e89ed53ed8d24f83ba1941c07382af00ed238eDave Airlie || __put_user((int __user *)(unsigned long)d32.request_indices, 7029a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie &d->request_indices) 703b5e89ed53ed8d24f83ba1941c07382af00ed238eDave Airlie || __put_user((int __user *)(unsigned long)d32.request_sizes, 7049a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie &d->request_sizes)) 7059a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return -EFAULT; 7069a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 707ed8b67040965e4fe695db333d5914e18ea5f146fArnd Bergmann err = drm_ioctl(file, DRM_IOCTL_DMA, (unsigned long)d); 7089a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (err) 7099a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return err; 7109a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 7119a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (__get_user(d32.request_size, &d->request_size) 7129a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie || __get_user(d32.granted_count, &d->granted_count) 7139a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie || __put_user(d32.request_size, &argp->request_size) 7149a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie || __put_user(d32.granted_count, &argp->granted_count)) 7159a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return -EFAULT; 7169a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 7179a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return 0; 7189a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie} 7199a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 7209a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie#if __OS_HAS_AGP 7219a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlietypedef struct drm_agp_mode32 { 7229a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie u32 mode; /**< AGP mode */ 7239a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie} drm_agp_mode32_t; 7249a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 7259a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airliestatic int compat_drm_agp_enable(struct file *file, unsigned int cmd, 7269a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie unsigned long arg) 7279a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie{ 7289a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie drm_agp_mode32_t __user *argp = (void __user *)arg; 7299a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie drm_agp_mode32_t m32; 730ff4135aeb1f9a0201f8e22400ebc1d570df9016eDave Airlie struct drm_agp_mode __user *mode; 7319a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 7329a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (get_user(m32.mode, &argp->mode)) 7339a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return -EFAULT; 7349a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 7359a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie mode = compat_alloc_user_space(sizeof(*mode)); 7369a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (put_user(m32.mode, &mode->mode)) 7379a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return -EFAULT; 7389a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 739ed8b67040965e4fe695db333d5914e18ea5f146fArnd Bergmann return drm_ioctl(file, DRM_IOCTL_AGP_ENABLE, (unsigned long)mode); 7409a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie} 7419a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 7429a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlietypedef struct drm_agp_info32 { 743b5e89ed53ed8d24f83ba1941c07382af00ed238eDave Airlie int agp_version_major; 744b5e89ed53ed8d24f83ba1941c07382af00ed238eDave Airlie int agp_version_minor; 745b5e89ed53ed8d24f83ba1941c07382af00ed238eDave Airlie u32 mode; 746b5e89ed53ed8d24f83ba1941c07382af00ed238eDave Airlie u32 aperture_base; /* physical address */ 747b5e89ed53ed8d24f83ba1941c07382af00ed238eDave Airlie u32 aperture_size; /* bytes */ 748b5e89ed53ed8d24f83ba1941c07382af00ed238eDave Airlie u32 memory_allowed; /* bytes */ 749b5e89ed53ed8d24f83ba1941c07382af00ed238eDave Airlie u32 memory_used; 750b5e89ed53ed8d24f83ba1941c07382af00ed238eDave Airlie 751b5e89ed53ed8d24f83ba1941c07382af00ed238eDave Airlie /* PCI information */ 7529a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie unsigned short id_vendor; 7539a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie unsigned short id_device; 7549a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie} drm_agp_info32_t; 7559a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 7569a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airliestatic int compat_drm_agp_info(struct file *file, unsigned int cmd, 7579a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie unsigned long arg) 7589a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie{ 7599a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie drm_agp_info32_t __user *argp = (void __user *)arg; 7609a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie drm_agp_info32_t i32; 761ff4135aeb1f9a0201f8e22400ebc1d570df9016eDave Airlie struct drm_agp_info __user *info; 7629a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie int err; 7639a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 7649a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie info = compat_alloc_user_space(sizeof(*info)); 7659a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (!access_ok(VERIFY_WRITE, info, sizeof(*info))) 7669a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return -EFAULT; 7679a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 768ed8b67040965e4fe695db333d5914e18ea5f146fArnd Bergmann err = drm_ioctl(file, DRM_IOCTL_AGP_INFO, (unsigned long)info); 7699a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (err) 7709a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return err; 7719a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 7729a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (__get_user(i32.agp_version_major, &info->agp_version_major) 7739a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie || __get_user(i32.agp_version_minor, &info->agp_version_minor) 7749a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie || __get_user(i32.mode, &info->mode) 7759a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie || __get_user(i32.aperture_base, &info->aperture_base) 7769a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie || __get_user(i32.aperture_size, &info->aperture_size) 7779a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie || __get_user(i32.memory_allowed, &info->memory_allowed) 7789a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie || __get_user(i32.memory_used, &info->memory_used) 7799a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie || __get_user(i32.id_vendor, &info->id_vendor) 7809a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie || __get_user(i32.id_device, &info->id_device)) 7819a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return -EFAULT; 7829a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 7839a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (copy_to_user(argp, &i32, sizeof(i32))) 7849a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return -EFAULT; 7859a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 7869a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return 0; 7879a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie} 7889a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 7899a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlietypedef struct drm_agp_buffer32 { 7909a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie u32 size; /**< In bytes -- will round to page boundary */ 7919a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie u32 handle; /**< Used for binding / unbinding */ 7929a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie u32 type; /**< Type of memory to allocate */ 793b5e89ed53ed8d24f83ba1941c07382af00ed238eDave Airlie u32 physical; /**< Physical used by i810 */ 7949a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie} drm_agp_buffer32_t; 7959a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 7969a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airliestatic int compat_drm_agp_alloc(struct file *file, unsigned int cmd, 7979a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie unsigned long arg) 7989a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie{ 7999a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie drm_agp_buffer32_t __user *argp = (void __user *)arg; 8009a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie drm_agp_buffer32_t req32; 801ff4135aeb1f9a0201f8e22400ebc1d570df9016eDave Airlie struct drm_agp_buffer __user *request; 8029a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie int err; 8039a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 8049a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (copy_from_user(&req32, argp, sizeof(req32))) 8059a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return -EFAULT; 8069a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 8079a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie request = compat_alloc_user_space(sizeof(*request)); 8089a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (!access_ok(VERIFY_WRITE, request, sizeof(*request)) 8099a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie || __put_user(req32.size, &request->size) 8109a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie || __put_user(req32.type, &request->type)) 8119a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return -EFAULT; 8129a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 813ed8b67040965e4fe695db333d5914e18ea5f146fArnd Bergmann err = drm_ioctl(file, DRM_IOCTL_AGP_ALLOC, (unsigned long)request); 8149a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (err) 8159a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return err; 8169a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 8179a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (__get_user(req32.handle, &request->handle) 8189a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie || __get_user(req32.physical, &request->physical) 8199a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie || copy_to_user(argp, &req32, sizeof(req32))) { 820ed8b67040965e4fe695db333d5914e18ea5f146fArnd Bergmann drm_ioctl(file, DRM_IOCTL_AGP_FREE, (unsigned long)request); 8219a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return -EFAULT; 8229a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie } 8239a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 8249a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return 0; 8259a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie} 8269a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 8279a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airliestatic int compat_drm_agp_free(struct file *file, unsigned int cmd, 8289a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie unsigned long arg) 8299a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie{ 8309a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie drm_agp_buffer32_t __user *argp = (void __user *)arg; 831ff4135aeb1f9a0201f8e22400ebc1d570df9016eDave Airlie struct drm_agp_buffer __user *request; 8329a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie u32 handle; 8339a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 8349a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie request = compat_alloc_user_space(sizeof(*request)); 8359a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (!access_ok(VERIFY_WRITE, request, sizeof(*request)) 8369a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie || get_user(handle, &argp->handle) 8379a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie || __put_user(handle, &request->handle)) 8389a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return -EFAULT; 8399a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 840ed8b67040965e4fe695db333d5914e18ea5f146fArnd Bergmann return drm_ioctl(file, DRM_IOCTL_AGP_FREE, (unsigned long)request); 8419a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie} 8429a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 8439a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlietypedef struct drm_agp_binding32 { 8449a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie u32 handle; /**< From drm_agp_buffer */ 8459a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie u32 offset; /**< In bytes -- will round to page boundary */ 8469a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie} drm_agp_binding32_t; 8479a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 8489a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airliestatic int compat_drm_agp_bind(struct file *file, unsigned int cmd, 8499a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie unsigned long arg) 8509a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie{ 8519a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie drm_agp_binding32_t __user *argp = (void __user *)arg; 8529a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie drm_agp_binding32_t req32; 853ff4135aeb1f9a0201f8e22400ebc1d570df9016eDave Airlie struct drm_agp_binding __user *request; 8549a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 8559a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (copy_from_user(&req32, argp, sizeof(req32))) 8569a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return -EFAULT; 8579a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 8589a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie request = compat_alloc_user_space(sizeof(*request)); 8599a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (!access_ok(VERIFY_WRITE, request, sizeof(*request)) 8609a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie || __put_user(req32.handle, &request->handle) 8619a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie || __put_user(req32.offset, &request->offset)) 8629a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return -EFAULT; 8639a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 864ed8b67040965e4fe695db333d5914e18ea5f146fArnd Bergmann return drm_ioctl(file, DRM_IOCTL_AGP_BIND, (unsigned long)request); 8659a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie} 8669a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 8679a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airliestatic int compat_drm_agp_unbind(struct file *file, unsigned int cmd, 8689a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie unsigned long arg) 8699a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie{ 8709a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie drm_agp_binding32_t __user *argp = (void __user *)arg; 871ff4135aeb1f9a0201f8e22400ebc1d570df9016eDave Airlie struct drm_agp_binding __user *request; 8729a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie u32 handle; 8739a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 8749a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie request = compat_alloc_user_space(sizeof(*request)); 8759a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (!access_ok(VERIFY_WRITE, request, sizeof(*request)) 8769a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie || get_user(handle, &argp->handle) 8779a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie || __put_user(handle, &request->handle)) 8789a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return -EFAULT; 8799a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 880ed8b67040965e4fe695db333d5914e18ea5f146fArnd Bergmann return drm_ioctl(file, DRM_IOCTL_AGP_UNBIND, (unsigned long)request); 8819a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie} 882b5e89ed53ed8d24f83ba1941c07382af00ed238eDave Airlie#endif /* __OS_HAS_AGP */ 8839a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 8849a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlietypedef struct drm_scatter_gather32 { 8859a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie u32 size; /**< In bytes -- will round to page boundary */ 8869a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie u32 handle; /**< Used for mapping / unmapping */ 8879a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie} drm_scatter_gather32_t; 8889a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 8899a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airliestatic int compat_drm_sg_alloc(struct file *file, unsigned int cmd, 8909a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie unsigned long arg) 8919a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie{ 8929a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie drm_scatter_gather32_t __user *argp = (void __user *)arg; 893ff4135aeb1f9a0201f8e22400ebc1d570df9016eDave Airlie struct drm_scatter_gather __user *request; 8949a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie int err; 8959a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie unsigned long x; 8969a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 8979a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie request = compat_alloc_user_space(sizeof(*request)); 8989a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (!access_ok(VERIFY_WRITE, request, sizeof(*request)) 8999a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie || !access_ok(VERIFY_WRITE, argp, sizeof(*argp)) 9009a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie || __get_user(x, &argp->size) 9019a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie || __put_user(x, &request->size)) 9029a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return -EFAULT; 9039a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 904ed8b67040965e4fe695db333d5914e18ea5f146fArnd Bergmann err = drm_ioctl(file, DRM_IOCTL_SG_ALLOC, (unsigned long)request); 9059a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (err) 9069a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return err; 9079a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 9089a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie /* XXX not sure about the handle conversion here... */ 9099a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (__get_user(x, &request->handle) 9109a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie || __put_user(x >> PAGE_SHIFT, &argp->handle)) 9119a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return -EFAULT; 9129a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 9139a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return 0; 9149a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie} 9159a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 9169a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airliestatic int compat_drm_sg_free(struct file *file, unsigned int cmd, 9179a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie unsigned long arg) 9189a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie{ 9199a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie drm_scatter_gather32_t __user *argp = (void __user *)arg; 920ff4135aeb1f9a0201f8e22400ebc1d570df9016eDave Airlie struct drm_scatter_gather __user *request; 9219a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie unsigned long x; 9229a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 9239a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie request = compat_alloc_user_space(sizeof(*request)); 9249a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (!access_ok(VERIFY_WRITE, request, sizeof(*request)) 9259a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie || !access_ok(VERIFY_WRITE, argp, sizeof(*argp)) 9269a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie || __get_user(x, &argp->handle) 9279a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie || __put_user(x << PAGE_SHIFT, &request->handle)) 9289a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return -EFAULT; 9299a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 930ed8b67040965e4fe695db333d5914e18ea5f146fArnd Bergmann return drm_ioctl(file, DRM_IOCTL_SG_FREE, (unsigned long)request); 9319a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie} 9329a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 93309e40d65d0aa6680428143cda1a7bdc8846ee991David Miller#if defined(CONFIG_X86) || defined(CONFIG_IA64) 93449568873705e45a0de77b7824a9a46d3201019a7Eric Anholttypedef struct drm_update_draw32 { 93549568873705e45a0de77b7824a9a46d3201019a7Eric Anholt drm_drawable_t handle; 93649568873705e45a0de77b7824a9a46d3201019a7Eric Anholt unsigned int type; 93749568873705e45a0de77b7824a9a46d3201019a7Eric Anholt unsigned int num; 93849568873705e45a0de77b7824a9a46d3201019a7Eric Anholt /* 64-bit version has a 32-bit pad here */ 93949568873705e45a0de77b7824a9a46d3201019a7Eric Anholt u64 data; /**< Pointer */ 94049568873705e45a0de77b7824a9a46d3201019a7Eric Anholt} __attribute__((packed)) drm_update_draw32_t; 94149568873705e45a0de77b7824a9a46d3201019a7Eric Anholt 94249568873705e45a0de77b7824a9a46d3201019a7Eric Anholtstatic int compat_drm_update_draw(struct file *file, unsigned int cmd, 94349568873705e45a0de77b7824a9a46d3201019a7Eric Anholt unsigned long arg) 94449568873705e45a0de77b7824a9a46d3201019a7Eric Anholt{ 94549568873705e45a0de77b7824a9a46d3201019a7Eric Anholt drm_update_draw32_t update32; 94649568873705e45a0de77b7824a9a46d3201019a7Eric Anholt struct drm_update_draw __user *request; 94749568873705e45a0de77b7824a9a46d3201019a7Eric Anholt int err; 94849568873705e45a0de77b7824a9a46d3201019a7Eric Anholt 94949568873705e45a0de77b7824a9a46d3201019a7Eric Anholt if (copy_from_user(&update32, (void __user *)arg, sizeof(update32))) 95049568873705e45a0de77b7824a9a46d3201019a7Eric Anholt return -EFAULT; 95149568873705e45a0de77b7824a9a46d3201019a7Eric Anholt 95249568873705e45a0de77b7824a9a46d3201019a7Eric Anholt request = compat_alloc_user_space(sizeof(*request)); 95349568873705e45a0de77b7824a9a46d3201019a7Eric Anholt if (!access_ok(VERIFY_WRITE, request, sizeof(*request)) || 95449568873705e45a0de77b7824a9a46d3201019a7Eric Anholt __put_user(update32.handle, &request->handle) || 95549568873705e45a0de77b7824a9a46d3201019a7Eric Anholt __put_user(update32.type, &request->type) || 95649568873705e45a0de77b7824a9a46d3201019a7Eric Anholt __put_user(update32.num, &request->num) || 95749568873705e45a0de77b7824a9a46d3201019a7Eric Anholt __put_user(update32.data, &request->data)) 95849568873705e45a0de77b7824a9a46d3201019a7Eric Anholt return -EFAULT; 95949568873705e45a0de77b7824a9a46d3201019a7Eric Anholt 960ed8b67040965e4fe695db333d5914e18ea5f146fArnd Bergmann err = drm_ioctl(file, DRM_IOCTL_UPDATE_DRAW, (unsigned long)request); 96149568873705e45a0de77b7824a9a46d3201019a7Eric Anholt return err; 96249568873705e45a0de77b7824a9a46d3201019a7Eric Anholt} 96309e40d65d0aa6680428143cda1a7bdc8846ee991David Miller#endif 96449568873705e45a0de77b7824a9a46d3201019a7Eric Anholt 9659a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airliestruct drm_wait_vblank_request32 { 966ff4135aeb1f9a0201f8e22400ebc1d570df9016eDave Airlie enum drm_vblank_seq_type type; 9679a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie unsigned int sequence; 9689a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie u32 signal; 9699a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie}; 9709a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 9719a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airliestruct drm_wait_vblank_reply32 { 972ff4135aeb1f9a0201f8e22400ebc1d570df9016eDave Airlie enum drm_vblank_seq_type type; 9739a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie unsigned int sequence; 9749a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie s32 tval_sec; 9759a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie s32 tval_usec; 9769a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie}; 9779a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 9789a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlietypedef union drm_wait_vblank32 { 9799a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie struct drm_wait_vblank_request32 request; 9809a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie struct drm_wait_vblank_reply32 reply; 9819a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie} drm_wait_vblank32_t; 9829a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 9839a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airliestatic int compat_drm_wait_vblank(struct file *file, unsigned int cmd, 9849a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie unsigned long arg) 9859a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie{ 9869a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie drm_wait_vblank32_t __user *argp = (void __user *)arg; 9879a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie drm_wait_vblank32_t req32; 988ff4135aeb1f9a0201f8e22400ebc1d570df9016eDave Airlie union drm_wait_vblank __user *request; 9899a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie int err; 9909a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 9919a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (copy_from_user(&req32, argp, sizeof(req32))) 9929a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return -EFAULT; 9939a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 9949a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie request = compat_alloc_user_space(sizeof(*request)); 9959a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (!access_ok(VERIFY_WRITE, request, sizeof(*request)) 9969a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie || __put_user(req32.request.type, &request->request.type) 9979a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie || __put_user(req32.request.sequence, &request->request.sequence) 9989a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie || __put_user(req32.request.signal, &request->request.signal)) 9999a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return -EFAULT; 10009a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 1001ed8b67040965e4fe695db333d5914e18ea5f146fArnd Bergmann err = drm_ioctl(file, DRM_IOCTL_WAIT_VBLANK, (unsigned long)request); 10029a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (err) 10039a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return err; 10049a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 10059a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (__get_user(req32.reply.type, &request->reply.type) 10069a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie || __get_user(req32.reply.sequence, &request->reply.sequence) 10079a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie || __get_user(req32.reply.tval_sec, &request->reply.tval_sec) 10089a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie || __get_user(req32.reply.tval_usec, &request->reply.tval_usec)) 10099a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return -EFAULT; 10109a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 10119a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (copy_to_user(argp, &req32, sizeof(req32))) 10129a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return -EFAULT; 10139a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 10149a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return 0; 10159a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie} 10169a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 10179a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airliedrm_ioctl_compat_t *drm_compat_ioctls[] = { 10189a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie [DRM_IOCTL_NR(DRM_IOCTL_VERSION32)] = compat_drm_version, 10199a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie [DRM_IOCTL_NR(DRM_IOCTL_GET_UNIQUE32)] = compat_drm_getunique, 10209a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie [DRM_IOCTL_NR(DRM_IOCTL_GET_MAP32)] = compat_drm_getmap, 10219a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie [DRM_IOCTL_NR(DRM_IOCTL_GET_CLIENT32)] = compat_drm_getclient, 10229a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie [DRM_IOCTL_NR(DRM_IOCTL_GET_STATS32)] = compat_drm_getstats, 10239a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie [DRM_IOCTL_NR(DRM_IOCTL_SET_UNIQUE32)] = compat_drm_setunique, 10249a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie [DRM_IOCTL_NR(DRM_IOCTL_ADD_MAP32)] = compat_drm_addmap, 10259a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie [DRM_IOCTL_NR(DRM_IOCTL_ADD_BUFS32)] = compat_drm_addbufs, 10269a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie [DRM_IOCTL_NR(DRM_IOCTL_MARK_BUFS32)] = compat_drm_markbufs, 10279a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie [DRM_IOCTL_NR(DRM_IOCTL_INFO_BUFS32)] = compat_drm_infobufs, 10289a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie [DRM_IOCTL_NR(DRM_IOCTL_MAP_BUFS32)] = compat_drm_mapbufs, 10299a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie [DRM_IOCTL_NR(DRM_IOCTL_FREE_BUFS32)] = compat_drm_freebufs, 10309a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie [DRM_IOCTL_NR(DRM_IOCTL_RM_MAP32)] = compat_drm_rmmap, 10319a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie [DRM_IOCTL_NR(DRM_IOCTL_SET_SAREA_CTX32)] = compat_drm_setsareactx, 10329a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie [DRM_IOCTL_NR(DRM_IOCTL_GET_SAREA_CTX32)] = compat_drm_getsareactx, 10339a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie [DRM_IOCTL_NR(DRM_IOCTL_RES_CTX32)] = compat_drm_resctx, 10349a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie [DRM_IOCTL_NR(DRM_IOCTL_DMA32)] = compat_drm_dma, 10359a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie#if __OS_HAS_AGP 10369a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie [DRM_IOCTL_NR(DRM_IOCTL_AGP_ENABLE32)] = compat_drm_agp_enable, 10379a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie [DRM_IOCTL_NR(DRM_IOCTL_AGP_INFO32)] = compat_drm_agp_info, 10389a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie [DRM_IOCTL_NR(DRM_IOCTL_AGP_ALLOC32)] = compat_drm_agp_alloc, 10399a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie [DRM_IOCTL_NR(DRM_IOCTL_AGP_FREE32)] = compat_drm_agp_free, 10409a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie [DRM_IOCTL_NR(DRM_IOCTL_AGP_BIND32)] = compat_drm_agp_bind, 10419a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie [DRM_IOCTL_NR(DRM_IOCTL_AGP_UNBIND32)] = compat_drm_agp_unbind, 10429a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie#endif 10439a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie [DRM_IOCTL_NR(DRM_IOCTL_SG_ALLOC32)] = compat_drm_sg_alloc, 10449a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie [DRM_IOCTL_NR(DRM_IOCTL_SG_FREE32)] = compat_drm_sg_free, 104509e40d65d0aa6680428143cda1a7bdc8846ee991David Miller#if defined(CONFIG_X86) || defined(CONFIG_IA64) 104649568873705e45a0de77b7824a9a46d3201019a7Eric Anholt [DRM_IOCTL_NR(DRM_IOCTL_UPDATE_DRAW32)] = compat_drm_update_draw, 104709e40d65d0aa6680428143cda1a7bdc8846ee991David Miller#endif 10489a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie [DRM_IOCTL_NR(DRM_IOCTL_WAIT_VBLANK32)] = compat_drm_wait_vblank, 10499a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie}; 10509a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 10519a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie/** 10529a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie * Called whenever a 32-bit process running under a 64-bit kernel 10539a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie * performs an ioctl on /dev/drm. 10549a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie * 10556c340eac0285f3d62406d2d902d0e96fbf2a5dc0Eric Anholt * \param file_priv DRM file private. 10569a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie * \param cmd command. 10579a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie * \param arg user argument. 10589a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie * \return zero on success or negative number on failure. 10599a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie */ 10609a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlielong drm_compat_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) 10619a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie{ 10629a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie unsigned int nr = DRM_IOCTL_NR(cmd); 10639a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie drm_ioctl_compat_t *fn; 10649a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie int ret; 10659a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 10667ffa05e0518ebc055ef8f68d7d53e5f7d2ba3428Ian Romanick /* Assume that ioctls without an explicit compat routine will just 10677ffa05e0518ebc055ef8f68d7d53e5f7d2ba3428Ian Romanick * work. This may not always be a good assumption, but it's better 10687ffa05e0518ebc055ef8f68d7d53e5f7d2ba3428Ian Romanick * than always failing. 10697ffa05e0518ebc055ef8f68d7d53e5f7d2ba3428Ian Romanick */ 10703d77461ecd7fb92bb888f69478e3518b3c947ce3Dave Airlie if (nr >= ARRAY_SIZE(drm_compat_ioctls)) 1071ed8b67040965e4fe695db333d5914e18ea5f146fArnd Bergmann return drm_ioctl(filp, cmd, arg); 10729a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 10739a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie fn = drm_compat_ioctls[nr]; 10749a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 10759a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (fn != NULL) 1076b5e89ed53ed8d24f83ba1941c07382af00ed238eDave Airlie ret = (*fn) (filp, cmd, arg); 10779a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie else 1078ed8b67040965e4fe695db333d5914e18ea5f146fArnd Bergmann ret = drm_ioctl(filp, cmd, arg); 10799a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 10809a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return ret; 10819a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie} 1082b5e89ed53ed8d24f83ba1941c07382af00ed238eDave Airlie 10839a18664506dbce5e23f3c5de7b1c5a042dd26520Dave AirlieEXPORT_SYMBOL(drm_compat_ioctl); 1084