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> 322d1a8a48ac68a835c42d8a31a02b8158cd599615Paul Gortmaker#include <linux/export.h> 339a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 349a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie#include "drmP.h" 359a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie#include "drm_core.h" 369a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 379a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie#define DRM_IOCTL_VERSION32 DRM_IOWR(0x00, drm_version32_t) 389a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie#define DRM_IOCTL_GET_UNIQUE32 DRM_IOWR(0x01, drm_unique32_t) 399a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie#define DRM_IOCTL_GET_MAP32 DRM_IOWR(0x04, drm_map32_t) 409a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie#define DRM_IOCTL_GET_CLIENT32 DRM_IOWR(0x05, drm_client32_t) 419a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie#define DRM_IOCTL_GET_STATS32 DRM_IOR( 0x06, drm_stats32_t) 429a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 439a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie#define DRM_IOCTL_SET_UNIQUE32 DRM_IOW( 0x10, drm_unique32_t) 449a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie#define DRM_IOCTL_ADD_MAP32 DRM_IOWR(0x15, drm_map32_t) 459a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie#define DRM_IOCTL_ADD_BUFS32 DRM_IOWR(0x16, drm_buf_desc32_t) 469a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie#define DRM_IOCTL_MARK_BUFS32 DRM_IOW( 0x17, drm_buf_desc32_t) 479a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie#define DRM_IOCTL_INFO_BUFS32 DRM_IOWR(0x18, drm_buf_info32_t) 489a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie#define DRM_IOCTL_MAP_BUFS32 DRM_IOWR(0x19, drm_buf_map32_t) 499a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie#define DRM_IOCTL_FREE_BUFS32 DRM_IOW( 0x1a, drm_buf_free32_t) 509a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 519a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie#define DRM_IOCTL_RM_MAP32 DRM_IOW( 0x1b, drm_map32_t) 529a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 539a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie#define DRM_IOCTL_SET_SAREA_CTX32 DRM_IOW( 0x1c, drm_ctx_priv_map32_t) 549a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie#define DRM_IOCTL_GET_SAREA_CTX32 DRM_IOWR(0x1d, drm_ctx_priv_map32_t) 559a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 569a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie#define DRM_IOCTL_RES_CTX32 DRM_IOWR(0x26, drm_ctx_res32_t) 579a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie#define DRM_IOCTL_DMA32 DRM_IOWR(0x29, drm_dma32_t) 589a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 599a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie#define DRM_IOCTL_AGP_ENABLE32 DRM_IOW( 0x32, drm_agp_mode32_t) 609a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie#define DRM_IOCTL_AGP_INFO32 DRM_IOR( 0x33, drm_agp_info32_t) 619a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie#define DRM_IOCTL_AGP_ALLOC32 DRM_IOWR(0x34, drm_agp_buffer32_t) 629a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie#define DRM_IOCTL_AGP_FREE32 DRM_IOW( 0x35, drm_agp_buffer32_t) 639a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie#define DRM_IOCTL_AGP_BIND32 DRM_IOW( 0x36, drm_agp_binding32_t) 649a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie#define DRM_IOCTL_AGP_UNBIND32 DRM_IOW( 0x37, drm_agp_binding32_t) 659a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 669a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie#define DRM_IOCTL_SG_ALLOC32 DRM_IOW( 0x38, drm_scatter_gather32_t) 679a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie#define DRM_IOCTL_SG_FREE32 DRM_IOW( 0x39, drm_scatter_gather32_t) 689a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 6949568873705e45a0de77b7824a9a46d3201019a7Eric Anholt#define DRM_IOCTL_UPDATE_DRAW32 DRM_IOW( 0x3f, drm_update_draw32_t) 7049568873705e45a0de77b7824a9a46d3201019a7Eric Anholt 719a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie#define DRM_IOCTL_WAIT_VBLANK32 DRM_IOWR(0x3a, drm_wait_vblank32_t) 729a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 739a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlietypedef struct drm_version_32 { 74b5e89ed53ed8d24f83ba1941c07382af00ed238eDave Airlie int version_major; /**< Major version */ 75b5e89ed53ed8d24f83ba1941c07382af00ed238eDave Airlie int version_minor; /**< Minor version */ 76b5e89ed53ed8d24f83ba1941c07382af00ed238eDave Airlie int version_patchlevel; /**< Patch level */ 77b5e89ed53ed8d24f83ba1941c07382af00ed238eDave Airlie u32 name_len; /**< Length of name buffer */ 78b5e89ed53ed8d24f83ba1941c07382af00ed238eDave Airlie u32 name; /**< Name of driver */ 79b5e89ed53ed8d24f83ba1941c07382af00ed238eDave Airlie u32 date_len; /**< Length of date buffer */ 80b5e89ed53ed8d24f83ba1941c07382af00ed238eDave Airlie u32 date; /**< User-space buffer to hold date */ 81b5e89ed53ed8d24f83ba1941c07382af00ed238eDave Airlie u32 desc_len; /**< Length of desc buffer */ 82b5e89ed53ed8d24f83ba1941c07382af00ed238eDave Airlie u32 desc; /**< User-space buffer to hold desc */ 839a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie} drm_version32_t; 849a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 859a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airliestatic int compat_drm_version(struct file *file, unsigned int cmd, 869a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie unsigned long arg) 879a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie{ 889a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie drm_version32_t v32; 89ff4135aeb1f9a0201f8e22400ebc1d570df9016eDave Airlie struct drm_version __user *version; 909a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie int err; 919a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 92b5e89ed53ed8d24f83ba1941c07382af00ed238eDave Airlie if (copy_from_user(&v32, (void __user *)arg, sizeof(v32))) 939a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return -EFAULT; 949a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 959a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie version = compat_alloc_user_space(sizeof(*version)); 969a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (!access_ok(VERIFY_WRITE, version, sizeof(*version))) 979a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return -EFAULT; 989a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (__put_user(v32.name_len, &version->name_len) 999a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie || __put_user((void __user *)(unsigned long)v32.name, 1009a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie &version->name) 1019a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie || __put_user(v32.date_len, &version->date_len) 1029a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie || __put_user((void __user *)(unsigned long)v32.date, 1039a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie &version->date) 1049a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie || __put_user(v32.desc_len, &version->desc_len) 1059a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie || __put_user((void __user *)(unsigned long)v32.desc, 1069a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie &version->desc)) 1079a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return -EFAULT; 1089a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 109ed8b67040965e4fe695db333d5914e18ea5f146fArnd Bergmann err = drm_ioctl(file, 110b5e89ed53ed8d24f83ba1941c07382af00ed238eDave Airlie DRM_IOCTL_VERSION, (unsigned long)version); 1119a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (err) 1129a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return err; 1139a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 1149a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (__get_user(v32.version_major, &version->version_major) 1159a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie || __get_user(v32.version_minor, &version->version_minor) 1169a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie || __get_user(v32.version_patchlevel, &version->version_patchlevel) 1179a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie || __get_user(v32.name_len, &version->name_len) 1189a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie || __get_user(v32.date_len, &version->date_len) 1199a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie || __get_user(v32.desc_len, &version->desc_len)) 1209a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return -EFAULT; 1219a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 122b5e89ed53ed8d24f83ba1941c07382af00ed238eDave Airlie if (copy_to_user((void __user *)arg, &v32, sizeof(v32))) 1239a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return -EFAULT; 1249a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return 0; 1259a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie} 1269a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 1279a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlietypedef struct drm_unique32 { 1289a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie u32 unique_len; /**< Length of unique */ 1299a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie u32 unique; /**< Unique name for driver instantiation */ 1309a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie} drm_unique32_t; 1319a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 1329a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airliestatic int compat_drm_getunique(struct file *file, unsigned int cmd, 1339a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie unsigned long arg) 1349a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie{ 1359a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie drm_unique32_t uq32; 136ff4135aeb1f9a0201f8e22400ebc1d570df9016eDave Airlie struct drm_unique __user *u; 1379a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie int err; 1389a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 139b5e89ed53ed8d24f83ba1941c07382af00ed238eDave Airlie if (copy_from_user(&uq32, (void __user *)arg, sizeof(uq32))) 1409a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return -EFAULT; 1419a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 1429a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie u = compat_alloc_user_space(sizeof(*u)); 1439a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (!access_ok(VERIFY_WRITE, u, sizeof(*u))) 1449a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return -EFAULT; 1459a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (__put_user(uq32.unique_len, &u->unique_len) 146b5e89ed53ed8d24f83ba1941c07382af00ed238eDave Airlie || __put_user((void __user *)(unsigned long)uq32.unique, 1479a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie &u->unique)) 1489a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return -EFAULT; 1499a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 150ed8b67040965e4fe695db333d5914e18ea5f146fArnd Bergmann err = drm_ioctl(file, DRM_IOCTL_GET_UNIQUE, (unsigned long)u); 1519a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (err) 1529a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return err; 1539a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 1549a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (__get_user(uq32.unique_len, &u->unique_len)) 1559a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return -EFAULT; 156b5e89ed53ed8d24f83ba1941c07382af00ed238eDave Airlie if (copy_to_user((void __user *)arg, &uq32, sizeof(uq32))) 1579a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return -EFAULT; 1589a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return 0; 1599a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie} 1609a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 1619a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airliestatic int compat_drm_setunique(struct file *file, unsigned int cmd, 1629a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie unsigned long arg) 1639a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie{ 1649a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie drm_unique32_t uq32; 165ff4135aeb1f9a0201f8e22400ebc1d570df9016eDave Airlie struct drm_unique __user *u; 1669a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 167b5e89ed53ed8d24f83ba1941c07382af00ed238eDave Airlie if (copy_from_user(&uq32, (void __user *)arg, sizeof(uq32))) 1689a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return -EFAULT; 1699a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 1709a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie u = compat_alloc_user_space(sizeof(*u)); 1719a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (!access_ok(VERIFY_WRITE, u, sizeof(*u))) 1729a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return -EFAULT; 1739a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (__put_user(uq32.unique_len, &u->unique_len) 174b5e89ed53ed8d24f83ba1941c07382af00ed238eDave Airlie || __put_user((void __user *)(unsigned long)uq32.unique, 1759a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie &u->unique)) 1769a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return -EFAULT; 1779a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 178ed8b67040965e4fe695db333d5914e18ea5f146fArnd Bergmann return drm_ioctl(file, DRM_IOCTL_SET_UNIQUE, (unsigned long)u); 1799a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie} 1809a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 1819a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlietypedef struct drm_map32 { 182b5e89ed53ed8d24f83ba1941c07382af00ed238eDave Airlie u32 offset; /**< Requested physical address (0 for SAREA)*/ 183b5e89ed53ed8d24f83ba1941c07382af00ed238eDave Airlie u32 size; /**< Requested physical size (bytes) */ 184ff4135aeb1f9a0201f8e22400ebc1d570df9016eDave Airlie enum drm_map_type type; /**< Type of memory to map */ 185ff4135aeb1f9a0201f8e22400ebc1d570df9016eDave Airlie enum drm_map_flags flags; /**< Flags */ 186b5e89ed53ed8d24f83ba1941c07382af00ed238eDave Airlie u32 handle; /**< User-space: "Handle" to pass to mmap() */ 187b5e89ed53ed8d24f83ba1941c07382af00ed238eDave Airlie int mtrr; /**< MTRR slot used */ 1889a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie} drm_map32_t; 1899a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 1909a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airliestatic int compat_drm_getmap(struct file *file, unsigned int cmd, 1919a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie unsigned long arg) 1929a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie{ 1939a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie drm_map32_t __user *argp = (void __user *)arg; 1949a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie drm_map32_t m32; 195ff4135aeb1f9a0201f8e22400ebc1d570df9016eDave Airlie struct drm_map __user *map; 1969a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie int idx, err; 1979a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie void *handle; 1989a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 1999a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (get_user(idx, &argp->offset)) 2009a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return -EFAULT; 2019a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 2029a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie map = compat_alloc_user_space(sizeof(*map)); 2039a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (!access_ok(VERIFY_WRITE, map, sizeof(*map))) 2049a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return -EFAULT; 2059a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (__put_user(idx, &map->offset)) 2069a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return -EFAULT; 2079a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 208ed8b67040965e4fe695db333d5914e18ea5f146fArnd Bergmann err = drm_ioctl(file, DRM_IOCTL_GET_MAP, (unsigned long)map); 2099a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (err) 2109a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return err; 2119a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 2129a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (__get_user(m32.offset, &map->offset) 2139a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie || __get_user(m32.size, &map->size) 2149a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie || __get_user(m32.type, &map->type) 2159a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie || __get_user(m32.flags, &map->flags) 2169a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie || __get_user(handle, &map->handle) 2179a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie || __get_user(m32.mtrr, &map->mtrr)) 2189a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return -EFAULT; 2199a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 220b5e89ed53ed8d24f83ba1941c07382af00ed238eDave Airlie m32.handle = (unsigned long)handle; 2219a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (copy_to_user(argp, &m32, sizeof(m32))) 2229a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return -EFAULT; 2239a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return 0; 2249a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 2259a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie} 2269a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 2279a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airliestatic int compat_drm_addmap(struct file *file, unsigned int cmd, 2289a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie unsigned long arg) 2299a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie{ 2309a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie drm_map32_t __user *argp = (void __user *)arg; 2319a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie drm_map32_t m32; 232ff4135aeb1f9a0201f8e22400ebc1d570df9016eDave Airlie struct drm_map __user *map; 2339a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie int err; 2349a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie void *handle; 2359a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 2369a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (copy_from_user(&m32, argp, sizeof(m32))) 2379a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return -EFAULT; 2389a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 2399a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie map = compat_alloc_user_space(sizeof(*map)); 2409a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (!access_ok(VERIFY_WRITE, map, sizeof(*map))) 2419a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return -EFAULT; 2429a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (__put_user(m32.offset, &map->offset) 2439a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie || __put_user(m32.size, &map->size) 2449a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie || __put_user(m32.type, &map->type) 2459a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie || __put_user(m32.flags, &map->flags)) 2469a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return -EFAULT; 2479a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 248ed8b67040965e4fe695db333d5914e18ea5f146fArnd Bergmann err = drm_ioctl(file, DRM_IOCTL_ADD_MAP, (unsigned long)map); 2499a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (err) 2509a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return err; 2519a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 2529a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (__get_user(m32.offset, &map->offset) 2539a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie || __get_user(m32.mtrr, &map->mtrr) 2549a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie || __get_user(handle, &map->handle)) 2559a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return -EFAULT; 2569a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 257b5e89ed53ed8d24f83ba1941c07382af00ed238eDave Airlie m32.handle = (unsigned long)handle; 258cafe8d8413399119c3f4cd575e0eb27e2654b9d5Christian Dietrich if (m32.handle != (unsigned long)handle) 259cafe8d8413399119c3f4cd575e0eb27e2654b9d5Christian Dietrich printk_ratelimited(KERN_ERR "compat_drm_addmap truncated handle" 260cafe8d8413399119c3f4cd575e0eb27e2654b9d5Christian Dietrich " %p for type %d offset %x\n", 261cafe8d8413399119c3f4cd575e0eb27e2654b9d5Christian Dietrich handle, m32.type, m32.offset); 2629a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 2639a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (copy_to_user(argp, &m32, sizeof(m32))) 2649a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return -EFAULT; 2659a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 2669a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return 0; 2679a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie} 2689a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 2699a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airliestatic int compat_drm_rmmap(struct file *file, unsigned int cmd, 2709a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie unsigned long arg) 2719a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie{ 2729a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie drm_map32_t __user *argp = (void __user *)arg; 273ff4135aeb1f9a0201f8e22400ebc1d570df9016eDave Airlie struct drm_map __user *map; 2749a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie u32 handle; 2759a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 2769a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (get_user(handle, &argp->handle)) 2779a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return -EFAULT; 2789a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 2799a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie map = compat_alloc_user_space(sizeof(*map)); 2809a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (!access_ok(VERIFY_WRITE, map, sizeof(*map))) 2819a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return -EFAULT; 282b5e89ed53ed8d24f83ba1941c07382af00ed238eDave Airlie if (__put_user((void *)(unsigned long)handle, &map->handle)) 2839a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return -EFAULT; 2849a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 285ed8b67040965e4fe695db333d5914e18ea5f146fArnd Bergmann return drm_ioctl(file, DRM_IOCTL_RM_MAP, (unsigned long)map); 2869a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie} 2879a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 2889a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlietypedef struct drm_client32 { 289b5e89ed53ed8d24f83ba1941c07382af00ed238eDave Airlie int idx; /**< Which client desired? */ 290b5e89ed53ed8d24f83ba1941c07382af00ed238eDave Airlie int auth; /**< Is client authenticated? */ 291b5e89ed53ed8d24f83ba1941c07382af00ed238eDave Airlie u32 pid; /**< Process ID */ 292b5e89ed53ed8d24f83ba1941c07382af00ed238eDave Airlie u32 uid; /**< User ID */ 293b5e89ed53ed8d24f83ba1941c07382af00ed238eDave Airlie u32 magic; /**< Magic */ 294b5e89ed53ed8d24f83ba1941c07382af00ed238eDave Airlie u32 iocs; /**< Ioctl count */ 2959a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie} drm_client32_t; 2969a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 2979a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airliestatic int compat_drm_getclient(struct file *file, unsigned int cmd, 2989a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie unsigned long arg) 2999a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie{ 3009a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie drm_client32_t c32; 3019a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie drm_client32_t __user *argp = (void __user *)arg; 302ff4135aeb1f9a0201f8e22400ebc1d570df9016eDave Airlie struct drm_client __user *client; 3039a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie int idx, err; 3049a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 3059a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (get_user(idx, &argp->idx)) 3069a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return -EFAULT; 3079a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 3089a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie client = compat_alloc_user_space(sizeof(*client)); 3099a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (!access_ok(VERIFY_WRITE, client, sizeof(*client))) 3109a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return -EFAULT; 3119a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (__put_user(idx, &client->idx)) 3129a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return -EFAULT; 3139a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 314ed8b67040965e4fe695db333d5914e18ea5f146fArnd Bergmann err = drm_ioctl(file, DRM_IOCTL_GET_CLIENT, (unsigned long)client); 3159a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (err) 3169a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return err; 3179a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 31808bc3d4e67d486a9b2a5065c1c2ebaf13048a465Julia Lawall if (__get_user(c32.idx, &client->idx) 31908bc3d4e67d486a9b2a5065c1c2ebaf13048a465Julia Lawall || __get_user(c32.auth, &client->auth) 3209a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie || __get_user(c32.pid, &client->pid) 3219a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie || __get_user(c32.uid, &client->uid) 3229a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie || __get_user(c32.magic, &client->magic) 3239a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie || __get_user(c32.iocs, &client->iocs)) 3249a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return -EFAULT; 3259a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 3269a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (copy_to_user(argp, &c32, sizeof(c32))) 3279a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return -EFAULT; 3289a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return 0; 3299a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie} 3309a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 3319a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlietypedef struct drm_stats32 { 3329a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie u32 count; 3339a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie struct { 3349a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie u32 value; 335ff4135aeb1f9a0201f8e22400ebc1d570df9016eDave Airlie enum drm_stat_type type; 3369a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie } data[15]; 3379a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie} drm_stats32_t; 3389a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 3399a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airliestatic int compat_drm_getstats(struct file *file, unsigned int cmd, 3409a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie unsigned long arg) 3419a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie{ 3429a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie drm_stats32_t s32; 3439a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie drm_stats32_t __user *argp = (void __user *)arg; 344ff4135aeb1f9a0201f8e22400ebc1d570df9016eDave Airlie struct drm_stats __user *stats; 3459a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie int i, err; 3469a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 3479a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie stats = compat_alloc_user_space(sizeof(*stats)); 3489a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (!access_ok(VERIFY_WRITE, stats, sizeof(*stats))) 3499a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return -EFAULT; 3509a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 351ed8b67040965e4fe695db333d5914e18ea5f146fArnd Bergmann err = drm_ioctl(file, DRM_IOCTL_GET_STATS, (unsigned long)stats); 3529a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (err) 3539a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return err; 3549a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 3559a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (__get_user(s32.count, &stats->count)) 3569a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return -EFAULT; 3579a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie for (i = 0; i < 15; ++i) 3589a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (__get_user(s32.data[i].value, &stats->data[i].value) 3599a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie || __get_user(s32.data[i].type, &stats->data[i].type)) 3609a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return -EFAULT; 3619a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 3629a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (copy_to_user(argp, &s32, sizeof(s32))) 3639a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return -EFAULT; 3649a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return 0; 3659a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie} 3669a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 3679a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlietypedef struct drm_buf_desc32 { 368b5e89ed53ed8d24f83ba1941c07382af00ed238eDave Airlie int count; /**< Number of buffers of this size */ 369b5e89ed53ed8d24f83ba1941c07382af00ed238eDave Airlie int size; /**< Size in bytes */ 370b5e89ed53ed8d24f83ba1941c07382af00ed238eDave Airlie int low_mark; /**< Low water mark */ 371b5e89ed53ed8d24f83ba1941c07382af00ed238eDave Airlie int high_mark; /**< High water mark */ 372b5e89ed53ed8d24f83ba1941c07382af00ed238eDave Airlie int flags; 373b5e89ed53ed8d24f83ba1941c07382af00ed238eDave Airlie u32 agp_start; /**< Start address in the AGP aperture */ 3749a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie} drm_buf_desc32_t; 3759a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 3769a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airliestatic int compat_drm_addbufs(struct file *file, unsigned int cmd, 3779a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie unsigned long arg) 3789a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie{ 3799a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie drm_buf_desc32_t __user *argp = (void __user *)arg; 380ff4135aeb1f9a0201f8e22400ebc1d570df9016eDave Airlie struct drm_buf_desc __user *buf; 3819a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie int err; 3829a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie unsigned long agp_start; 3839a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 3849a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie buf = compat_alloc_user_space(sizeof(*buf)); 3859a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (!access_ok(VERIFY_WRITE, buf, sizeof(*buf)) 3869a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie || !access_ok(VERIFY_WRITE, argp, sizeof(*argp))) 3879a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return -EFAULT; 3889a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 3899a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (__copy_in_user(buf, argp, offsetof(drm_buf_desc32_t, agp_start)) 3909a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie || __get_user(agp_start, &argp->agp_start) 3919a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie || __put_user(agp_start, &buf->agp_start)) 3929a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return -EFAULT; 3939a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 394ed8b67040965e4fe695db333d5914e18ea5f146fArnd Bergmann err = drm_ioctl(file, DRM_IOCTL_ADD_BUFS, (unsigned long)buf); 3959a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (err) 3969a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return err; 3979a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 3989a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (__copy_in_user(argp, buf, offsetof(drm_buf_desc32_t, agp_start)) 3999a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie || __get_user(agp_start, &buf->agp_start) 4009a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie || __put_user(agp_start, &argp->agp_start)) 4019a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return -EFAULT; 4029a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 4039a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return 0; 4049a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie} 4059a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 4069a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airliestatic int compat_drm_markbufs(struct file *file, unsigned int cmd, 4079a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie unsigned long arg) 4089a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie{ 4099a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie drm_buf_desc32_t b32; 4109a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie drm_buf_desc32_t __user *argp = (void __user *)arg; 411ff4135aeb1f9a0201f8e22400ebc1d570df9016eDave Airlie struct drm_buf_desc __user *buf; 4129a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 4139a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (copy_from_user(&b32, argp, sizeof(b32))) 4149a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return -EFAULT; 4159a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 4169a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie buf = compat_alloc_user_space(sizeof(*buf)); 4179a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (!access_ok(VERIFY_WRITE, buf, sizeof(*buf))) 4189a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return -EFAULT; 4199a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 4209a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (__put_user(b32.size, &buf->size) 4219a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie || __put_user(b32.low_mark, &buf->low_mark) 4229a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie || __put_user(b32.high_mark, &buf->high_mark)) 4239a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return -EFAULT; 4249a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 425ed8b67040965e4fe695db333d5914e18ea5f146fArnd Bergmann return drm_ioctl(file, DRM_IOCTL_MARK_BUFS, (unsigned long)buf); 4269a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie} 4279a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 4289a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlietypedef struct drm_buf_info32 { 429b5e89ed53ed8d24f83ba1941c07382af00ed238eDave Airlie int count; /**< Entries in list */ 430b5e89ed53ed8d24f83ba1941c07382af00ed238eDave Airlie u32 list; 4319a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie} drm_buf_info32_t; 4329a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 4339a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airliestatic int compat_drm_infobufs(struct file *file, unsigned int cmd, 4349a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie unsigned long arg) 4359a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie{ 4369a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie drm_buf_info32_t req32; 4379a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie drm_buf_info32_t __user *argp = (void __user *)arg; 4389a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie drm_buf_desc32_t __user *to; 439ff4135aeb1f9a0201f8e22400ebc1d570df9016eDave Airlie struct drm_buf_info __user *request; 440ff4135aeb1f9a0201f8e22400ebc1d570df9016eDave Airlie struct drm_buf_desc __user *list; 4419a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie size_t nbytes; 4429a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie int i, err; 4439a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie int count, actual; 4449a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 4459a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (copy_from_user(&req32, argp, sizeof(req32))) 4469a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return -EFAULT; 4479a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 4489a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie count = req32.count; 449b5e89ed53ed8d24f83ba1941c07382af00ed238eDave Airlie to = (drm_buf_desc32_t __user *) (unsigned long)req32.list; 4509a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (count < 0) 4519a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie count = 0; 4529a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (count > 0 4539a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie && !access_ok(VERIFY_WRITE, to, count * sizeof(drm_buf_desc32_t))) 4549a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return -EFAULT; 4559a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 456ff4135aeb1f9a0201f8e22400ebc1d570df9016eDave Airlie nbytes = sizeof(*request) + count * sizeof(struct drm_buf_desc); 4579a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie request = compat_alloc_user_space(nbytes); 4589a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (!access_ok(VERIFY_WRITE, request, nbytes)) 4599a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return -EFAULT; 460ff4135aeb1f9a0201f8e22400ebc1d570df9016eDave Airlie list = (struct drm_buf_desc *) (request + 1); 4619a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 4629a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (__put_user(count, &request->count) 4639a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie || __put_user(list, &request->list)) 4649a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return -EFAULT; 4659a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 466ed8b67040965e4fe695db333d5914e18ea5f146fArnd Bergmann err = drm_ioctl(file, DRM_IOCTL_INFO_BUFS, (unsigned long)request); 4679a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (err) 4689a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return err; 4699a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 4709a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (__get_user(actual, &request->count)) 4719a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return -EFAULT; 4729a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (count >= actual) 4739a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie for (i = 0; i < actual; ++i) 4749a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (__copy_in_user(&to[i], &list[i], 475ff4135aeb1f9a0201f8e22400ebc1d570df9016eDave Airlie offsetof(struct drm_buf_desc, flags))) 4769a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return -EFAULT; 4779a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 4789a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (__put_user(actual, &argp->count)) 4799a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return -EFAULT; 4809a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 4819a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return 0; 4829a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie} 4839a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 4849a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlietypedef struct drm_buf_pub32 { 485b5e89ed53ed8d24f83ba1941c07382af00ed238eDave Airlie int idx; /**< Index into the master buffer list */ 486b5e89ed53ed8d24f83ba1941c07382af00ed238eDave Airlie int total; /**< Buffer size */ 487b5e89ed53ed8d24f83ba1941c07382af00ed238eDave Airlie int used; /**< Amount of buffer in use (for DMA) */ 488b5e89ed53ed8d24f83ba1941c07382af00ed238eDave Airlie u32 address; /**< Address of buffer */ 4899a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie} drm_buf_pub32_t; 4909a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 4919a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlietypedef struct drm_buf_map32 { 492b5e89ed53ed8d24f83ba1941c07382af00ed238eDave Airlie int count; /**< Length of the buffer list */ 493b5e89ed53ed8d24f83ba1941c07382af00ed238eDave Airlie u32 virtual; /**< Mmap'd area in user-virtual */ 494b5e89ed53ed8d24f83ba1941c07382af00ed238eDave Airlie u32 list; /**< Buffer information */ 4959a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie} drm_buf_map32_t; 4969a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 4979a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airliestatic int compat_drm_mapbufs(struct file *file, unsigned int cmd, 4989a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie unsigned long arg) 4999a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie{ 5009a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie drm_buf_map32_t __user *argp = (void __user *)arg; 5019a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie drm_buf_map32_t req32; 5029a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie drm_buf_pub32_t __user *list32; 503ff4135aeb1f9a0201f8e22400ebc1d570df9016eDave Airlie struct drm_buf_map __user *request; 504ff4135aeb1f9a0201f8e22400ebc1d570df9016eDave Airlie struct drm_buf_pub __user *list; 5059a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie int i, err; 5069a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie int count, actual; 5079a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie size_t nbytes; 5089a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie void __user *addr; 5099a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 5109a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (copy_from_user(&req32, argp, sizeof(req32))) 5119a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return -EFAULT; 5129a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie count = req32.count; 5139a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie list32 = (void __user *)(unsigned long)req32.list; 5149a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 5159a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (count < 0) 5169a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return -EINVAL; 517ff4135aeb1f9a0201f8e22400ebc1d570df9016eDave Airlie nbytes = sizeof(*request) + count * sizeof(struct drm_buf_pub); 5189a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie request = compat_alloc_user_space(nbytes); 5199a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (!access_ok(VERIFY_WRITE, request, nbytes)) 5209a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return -EFAULT; 521ff4135aeb1f9a0201f8e22400ebc1d570df9016eDave Airlie list = (struct drm_buf_pub *) (request + 1); 5229a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 5239a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (__put_user(count, &request->count) 5249a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie || __put_user(list, &request->list)) 5259a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return -EFAULT; 5269a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 527ed8b67040965e4fe695db333d5914e18ea5f146fArnd Bergmann err = drm_ioctl(file, DRM_IOCTL_MAP_BUFS, (unsigned long)request); 5289a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (err) 5299a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return err; 5309a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 5319a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (__get_user(actual, &request->count)) 5329a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return -EFAULT; 5339a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (count >= actual) 5349a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie for (i = 0; i < actual; ++i) 5359a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (__copy_in_user(&list32[i], &list[i], 536ff4135aeb1f9a0201f8e22400ebc1d570df9016eDave Airlie offsetof(struct drm_buf_pub, address)) 5379a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie || __get_user(addr, &list[i].address) 538b5e89ed53ed8d24f83ba1941c07382af00ed238eDave Airlie || __put_user((unsigned long)addr, 5399a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie &list32[i].address)) 5409a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return -EFAULT; 5419a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 5429a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (__put_user(actual, &argp->count) 5439a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie || __get_user(addr, &request->virtual) 544b5e89ed53ed8d24f83ba1941c07382af00ed238eDave Airlie || __put_user((unsigned long)addr, &argp->virtual)) 5459a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return -EFAULT; 5469a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 5479a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return 0; 5489a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie} 5499a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 5509a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlietypedef struct drm_buf_free32 { 551b5e89ed53ed8d24f83ba1941c07382af00ed238eDave Airlie int count; 552b5e89ed53ed8d24f83ba1941c07382af00ed238eDave Airlie u32 list; 5539a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie} drm_buf_free32_t; 5549a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 5559a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airliestatic int compat_drm_freebufs(struct file *file, unsigned int cmd, 5569a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie unsigned long arg) 5579a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie{ 5589a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie drm_buf_free32_t req32; 559ff4135aeb1f9a0201f8e22400ebc1d570df9016eDave Airlie struct drm_buf_free __user *request; 5609a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie drm_buf_free32_t __user *argp = (void __user *)arg; 5619a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 5629a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (copy_from_user(&req32, argp, sizeof(req32))) 5639a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return -EFAULT; 5649a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 5659a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie request = compat_alloc_user_space(sizeof(*request)); 5669a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (!access_ok(VERIFY_WRITE, request, sizeof(*request))) 5679a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return -EFAULT; 5689a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (__put_user(req32.count, &request->count) 569b5e89ed53ed8d24f83ba1941c07382af00ed238eDave Airlie || __put_user((int __user *)(unsigned long)req32.list, 5709a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie &request->list)) 5719a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return -EFAULT; 5729a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 573ed8b67040965e4fe695db333d5914e18ea5f146fArnd Bergmann return drm_ioctl(file, DRM_IOCTL_FREE_BUFS, (unsigned long)request); 5749a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie} 5759a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 5769a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlietypedef struct drm_ctx_priv_map32 { 577b5e89ed53ed8d24f83ba1941c07382af00ed238eDave Airlie unsigned int ctx_id; /**< Context requesting private mapping */ 578b5e89ed53ed8d24f83ba1941c07382af00ed238eDave Airlie u32 handle; /**< Handle of map */ 5799a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie} drm_ctx_priv_map32_t; 5809a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 5819a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airliestatic int compat_drm_setsareactx(struct file *file, unsigned int cmd, 5829a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie unsigned long arg) 5839a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie{ 5849a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie drm_ctx_priv_map32_t req32; 585ff4135aeb1f9a0201f8e22400ebc1d570df9016eDave Airlie struct drm_ctx_priv_map __user *request; 5869a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie drm_ctx_priv_map32_t __user *argp = (void __user *)arg; 5879a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 5889a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (copy_from_user(&req32, argp, sizeof(req32))) 5899a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return -EFAULT; 5909a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 5919a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie request = compat_alloc_user_space(sizeof(*request)); 5929a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (!access_ok(VERIFY_WRITE, request, sizeof(*request))) 5939a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return -EFAULT; 5949a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (__put_user(req32.ctx_id, &request->ctx_id) 595b5e89ed53ed8d24f83ba1941c07382af00ed238eDave Airlie || __put_user((void *)(unsigned long)req32.handle, 5969a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie &request->handle)) 5979a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return -EFAULT; 5989a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 599ed8b67040965e4fe695db333d5914e18ea5f146fArnd Bergmann return drm_ioctl(file, DRM_IOCTL_SET_SAREA_CTX, (unsigned long)request); 6009a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie} 6019a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 6029a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airliestatic int compat_drm_getsareactx(struct file *file, unsigned int cmd, 6039a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie unsigned long arg) 6049a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie{ 605ff4135aeb1f9a0201f8e22400ebc1d570df9016eDave Airlie struct drm_ctx_priv_map __user *request; 6069a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie drm_ctx_priv_map32_t __user *argp = (void __user *)arg; 6079a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie int err; 6089a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie unsigned int ctx_id; 6099a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie void *handle; 6109a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 6119a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (!access_ok(VERIFY_WRITE, argp, sizeof(*argp)) 6129a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie || __get_user(ctx_id, &argp->ctx_id)) 6139a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return -EFAULT; 6149a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 6159a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie request = compat_alloc_user_space(sizeof(*request)); 6169a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (!access_ok(VERIFY_WRITE, request, sizeof(*request))) 6179a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return -EFAULT; 6189a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (__put_user(ctx_id, &request->ctx_id)) 6199a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return -EFAULT; 6209a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 621ed8b67040965e4fe695db333d5914e18ea5f146fArnd Bergmann err = drm_ioctl(file, DRM_IOCTL_GET_SAREA_CTX, (unsigned long)request); 6229a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (err) 6239a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return err; 6249a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 6259a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (__get_user(handle, &request->handle) 626b5e89ed53ed8d24f83ba1941c07382af00ed238eDave Airlie || __put_user((unsigned long)handle, &argp->handle)) 6279a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return -EFAULT; 6289a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 6299a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return 0; 6309a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie} 6319a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 6329a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlietypedef struct drm_ctx_res32 { 633b5e89ed53ed8d24f83ba1941c07382af00ed238eDave Airlie int count; 634b5e89ed53ed8d24f83ba1941c07382af00ed238eDave Airlie u32 contexts; 6359a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie} drm_ctx_res32_t; 6369a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 6379a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airliestatic int compat_drm_resctx(struct file *file, unsigned int cmd, 6389a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie unsigned long arg) 6399a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie{ 6409a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie drm_ctx_res32_t __user *argp = (void __user *)arg; 6419a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie drm_ctx_res32_t res32; 642ff4135aeb1f9a0201f8e22400ebc1d570df9016eDave Airlie struct drm_ctx_res __user *res; 6439a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie int err; 6449a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 6459a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (copy_from_user(&res32, argp, sizeof(res32))) 6469a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return -EFAULT; 6479a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 6489a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie res = compat_alloc_user_space(sizeof(*res)); 6499a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (!access_ok(VERIFY_WRITE, res, sizeof(*res))) 6509a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return -EFAULT; 6519a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (__put_user(res32.count, &res->count) 652ff4135aeb1f9a0201f8e22400ebc1d570df9016eDave Airlie || __put_user((struct drm_ctx __user *) (unsigned long)res32.contexts, 6539a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie &res->contexts)) 6549a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return -EFAULT; 6559a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 656ed8b67040965e4fe695db333d5914e18ea5f146fArnd Bergmann err = drm_ioctl(file, DRM_IOCTL_RES_CTX, (unsigned long)res); 6579a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (err) 6589a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return err; 6599a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 6609a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (__get_user(res32.count, &res->count) 6619a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie || __put_user(res32.count, &argp->count)) 6629a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return -EFAULT; 6639a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 6649a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return 0; 6659a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie} 6669a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 6679a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlietypedef struct drm_dma32 { 668b5e89ed53ed8d24f83ba1941c07382af00ed238eDave Airlie int context; /**< Context handle */ 669b5e89ed53ed8d24f83ba1941c07382af00ed238eDave Airlie int send_count; /**< Number of buffers to send */ 670b5e89ed53ed8d24f83ba1941c07382af00ed238eDave Airlie u32 send_indices; /**< List of handles to buffers */ 671b5e89ed53ed8d24f83ba1941c07382af00ed238eDave Airlie u32 send_sizes; /**< Lengths of data to send */ 672ff4135aeb1f9a0201f8e22400ebc1d570df9016eDave Airlie enum drm_dma_flags flags; /**< Flags */ 673b5e89ed53ed8d24f83ba1941c07382af00ed238eDave Airlie int request_count; /**< Number of buffers requested */ 674b5e89ed53ed8d24f83ba1941c07382af00ed238eDave Airlie int request_size; /**< Desired size for buffers */ 675b5e89ed53ed8d24f83ba1941c07382af00ed238eDave Airlie u32 request_indices; /**< Buffer information */ 676b5e89ed53ed8d24f83ba1941c07382af00ed238eDave Airlie u32 request_sizes; 677b5e89ed53ed8d24f83ba1941c07382af00ed238eDave Airlie int granted_count; /**< Number of buffers granted */ 6789a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie} drm_dma32_t; 6799a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 6809a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airliestatic int compat_drm_dma(struct file *file, unsigned int cmd, 6819a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie unsigned long arg) 6829a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie{ 6839a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie drm_dma32_t d32; 684b5e89ed53ed8d24f83ba1941c07382af00ed238eDave Airlie drm_dma32_t __user *argp = (void __user *)arg; 685ff4135aeb1f9a0201f8e22400ebc1d570df9016eDave Airlie struct drm_dma __user *d; 6869a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie int err; 6879a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 6889a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (copy_from_user(&d32, argp, sizeof(d32))) 6899a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return -EFAULT; 6909a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 6919a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie d = compat_alloc_user_space(sizeof(*d)); 6929a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (!access_ok(VERIFY_WRITE, d, sizeof(*d))) 6939a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return -EFAULT; 6949a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 6959a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (__put_user(d32.context, &d->context) 6969a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie || __put_user(d32.send_count, &d->send_count) 697b5e89ed53ed8d24f83ba1941c07382af00ed238eDave Airlie || __put_user((int __user *)(unsigned long)d32.send_indices, 6989a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie &d->send_indices) 699b5e89ed53ed8d24f83ba1941c07382af00ed238eDave Airlie || __put_user((int __user *)(unsigned long)d32.send_sizes, 7009a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie &d->send_sizes) 7019a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie || __put_user(d32.flags, &d->flags) 7029a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie || __put_user(d32.request_count, &d->request_count) 703b5e89ed53ed8d24f83ba1941c07382af00ed238eDave Airlie || __put_user((int __user *)(unsigned long)d32.request_indices, 7049a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie &d->request_indices) 705b5e89ed53ed8d24f83ba1941c07382af00ed238eDave Airlie || __put_user((int __user *)(unsigned long)d32.request_sizes, 7069a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie &d->request_sizes)) 7079a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return -EFAULT; 7089a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 709ed8b67040965e4fe695db333d5914e18ea5f146fArnd Bergmann err = drm_ioctl(file, DRM_IOCTL_DMA, (unsigned long)d); 7109a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (err) 7119a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return err; 7129a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 7139a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (__get_user(d32.request_size, &d->request_size) 7149a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie || __get_user(d32.granted_count, &d->granted_count) 7159a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie || __put_user(d32.request_size, &argp->request_size) 7169a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie || __put_user(d32.granted_count, &argp->granted_count)) 7179a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return -EFAULT; 7189a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 7199a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return 0; 7209a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie} 7219a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 7229a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie#if __OS_HAS_AGP 7239a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlietypedef struct drm_agp_mode32 { 7249a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie u32 mode; /**< AGP mode */ 7259a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie} drm_agp_mode32_t; 7269a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 7279a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airliestatic int compat_drm_agp_enable(struct file *file, unsigned int cmd, 7289a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie unsigned long arg) 7299a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie{ 7309a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie drm_agp_mode32_t __user *argp = (void __user *)arg; 7319a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie drm_agp_mode32_t m32; 732ff4135aeb1f9a0201f8e22400ebc1d570df9016eDave Airlie struct drm_agp_mode __user *mode; 7339a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 7349a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (get_user(m32.mode, &argp->mode)) 7359a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return -EFAULT; 7369a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 7379a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie mode = compat_alloc_user_space(sizeof(*mode)); 7389a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (put_user(m32.mode, &mode->mode)) 7399a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return -EFAULT; 7409a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 741ed8b67040965e4fe695db333d5914e18ea5f146fArnd Bergmann return drm_ioctl(file, DRM_IOCTL_AGP_ENABLE, (unsigned long)mode); 7429a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie} 7439a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 7449a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlietypedef struct drm_agp_info32 { 745b5e89ed53ed8d24f83ba1941c07382af00ed238eDave Airlie int agp_version_major; 746b5e89ed53ed8d24f83ba1941c07382af00ed238eDave Airlie int agp_version_minor; 747b5e89ed53ed8d24f83ba1941c07382af00ed238eDave Airlie u32 mode; 748b5e89ed53ed8d24f83ba1941c07382af00ed238eDave Airlie u32 aperture_base; /* physical address */ 749b5e89ed53ed8d24f83ba1941c07382af00ed238eDave Airlie u32 aperture_size; /* bytes */ 750b5e89ed53ed8d24f83ba1941c07382af00ed238eDave Airlie u32 memory_allowed; /* bytes */ 751b5e89ed53ed8d24f83ba1941c07382af00ed238eDave Airlie u32 memory_used; 752b5e89ed53ed8d24f83ba1941c07382af00ed238eDave Airlie 753b5e89ed53ed8d24f83ba1941c07382af00ed238eDave Airlie /* PCI information */ 7549a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie unsigned short id_vendor; 7559a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie unsigned short id_device; 7569a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie} drm_agp_info32_t; 7579a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 7589a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airliestatic int compat_drm_agp_info(struct file *file, unsigned int cmd, 7599a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie unsigned long arg) 7609a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie{ 7619a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie drm_agp_info32_t __user *argp = (void __user *)arg; 7629a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie drm_agp_info32_t i32; 763ff4135aeb1f9a0201f8e22400ebc1d570df9016eDave Airlie struct drm_agp_info __user *info; 7649a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie int err; 7659a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 7669a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie info = compat_alloc_user_space(sizeof(*info)); 7679a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (!access_ok(VERIFY_WRITE, info, sizeof(*info))) 7689a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return -EFAULT; 7699a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 770ed8b67040965e4fe695db333d5914e18ea5f146fArnd Bergmann err = drm_ioctl(file, DRM_IOCTL_AGP_INFO, (unsigned long)info); 7719a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (err) 7729a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return err; 7739a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 7749a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (__get_user(i32.agp_version_major, &info->agp_version_major) 7759a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie || __get_user(i32.agp_version_minor, &info->agp_version_minor) 7769a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie || __get_user(i32.mode, &info->mode) 7779a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie || __get_user(i32.aperture_base, &info->aperture_base) 7789a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie || __get_user(i32.aperture_size, &info->aperture_size) 7799a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie || __get_user(i32.memory_allowed, &info->memory_allowed) 7809a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie || __get_user(i32.memory_used, &info->memory_used) 7819a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie || __get_user(i32.id_vendor, &info->id_vendor) 7829a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie || __get_user(i32.id_device, &info->id_device)) 7839a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return -EFAULT; 7849a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 7859a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (copy_to_user(argp, &i32, sizeof(i32))) 7869a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return -EFAULT; 7879a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 7889a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return 0; 7899a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie} 7909a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 7919a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlietypedef struct drm_agp_buffer32 { 7929a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie u32 size; /**< In bytes -- will round to page boundary */ 7939a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie u32 handle; /**< Used for binding / unbinding */ 7949a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie u32 type; /**< Type of memory to allocate */ 795b5e89ed53ed8d24f83ba1941c07382af00ed238eDave Airlie u32 physical; /**< Physical used by i810 */ 7969a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie} drm_agp_buffer32_t; 7979a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 7989a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airliestatic int compat_drm_agp_alloc(struct file *file, unsigned int cmd, 7999a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie unsigned long arg) 8009a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie{ 8019a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie drm_agp_buffer32_t __user *argp = (void __user *)arg; 8029a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie drm_agp_buffer32_t req32; 803ff4135aeb1f9a0201f8e22400ebc1d570df9016eDave Airlie struct drm_agp_buffer __user *request; 8049a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie int err; 8059a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 8069a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (copy_from_user(&req32, argp, sizeof(req32))) 8079a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return -EFAULT; 8089a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 8099a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie request = compat_alloc_user_space(sizeof(*request)); 8109a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (!access_ok(VERIFY_WRITE, request, sizeof(*request)) 8119a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie || __put_user(req32.size, &request->size) 8129a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie || __put_user(req32.type, &request->type)) 8139a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return -EFAULT; 8149a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 815ed8b67040965e4fe695db333d5914e18ea5f146fArnd Bergmann err = drm_ioctl(file, DRM_IOCTL_AGP_ALLOC, (unsigned long)request); 8169a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (err) 8179a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return err; 8189a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 8199a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (__get_user(req32.handle, &request->handle) 8209a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie || __get_user(req32.physical, &request->physical) 8219a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie || copy_to_user(argp, &req32, sizeof(req32))) { 822ed8b67040965e4fe695db333d5914e18ea5f146fArnd Bergmann drm_ioctl(file, DRM_IOCTL_AGP_FREE, (unsigned long)request); 8239a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return -EFAULT; 8249a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie } 8259a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 8269a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return 0; 8279a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie} 8289a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 8299a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airliestatic int compat_drm_agp_free(struct file *file, unsigned int cmd, 8309a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie unsigned long arg) 8319a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie{ 8329a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie drm_agp_buffer32_t __user *argp = (void __user *)arg; 833ff4135aeb1f9a0201f8e22400ebc1d570df9016eDave Airlie struct drm_agp_buffer __user *request; 8349a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie u32 handle; 8359a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 8369a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie request = compat_alloc_user_space(sizeof(*request)); 8379a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (!access_ok(VERIFY_WRITE, request, sizeof(*request)) 8389a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie || get_user(handle, &argp->handle) 8399a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie || __put_user(handle, &request->handle)) 8409a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return -EFAULT; 8419a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 842ed8b67040965e4fe695db333d5914e18ea5f146fArnd Bergmann return drm_ioctl(file, DRM_IOCTL_AGP_FREE, (unsigned long)request); 8439a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie} 8449a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 8459a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlietypedef struct drm_agp_binding32 { 8469a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie u32 handle; /**< From drm_agp_buffer */ 8479a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie u32 offset; /**< In bytes -- will round to page boundary */ 8489a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie} drm_agp_binding32_t; 8499a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 8509a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airliestatic int compat_drm_agp_bind(struct file *file, unsigned int cmd, 8519a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie unsigned long arg) 8529a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie{ 8539a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie drm_agp_binding32_t __user *argp = (void __user *)arg; 8549a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie drm_agp_binding32_t req32; 855ff4135aeb1f9a0201f8e22400ebc1d570df9016eDave Airlie struct drm_agp_binding __user *request; 8569a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 8579a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (copy_from_user(&req32, argp, sizeof(req32))) 8589a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return -EFAULT; 8599a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 8609a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie request = compat_alloc_user_space(sizeof(*request)); 8619a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (!access_ok(VERIFY_WRITE, request, sizeof(*request)) 8629a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie || __put_user(req32.handle, &request->handle) 8639a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie || __put_user(req32.offset, &request->offset)) 8649a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return -EFAULT; 8659a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 866ed8b67040965e4fe695db333d5914e18ea5f146fArnd Bergmann return drm_ioctl(file, DRM_IOCTL_AGP_BIND, (unsigned long)request); 8679a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie} 8689a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 8699a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airliestatic int compat_drm_agp_unbind(struct file *file, unsigned int cmd, 8709a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie unsigned long arg) 8719a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie{ 8729a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie drm_agp_binding32_t __user *argp = (void __user *)arg; 873ff4135aeb1f9a0201f8e22400ebc1d570df9016eDave Airlie struct drm_agp_binding __user *request; 8749a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie u32 handle; 8759a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 8769a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie request = compat_alloc_user_space(sizeof(*request)); 8779a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (!access_ok(VERIFY_WRITE, request, sizeof(*request)) 8789a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie || get_user(handle, &argp->handle) 8799a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie || __put_user(handle, &request->handle)) 8809a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return -EFAULT; 8819a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 882ed8b67040965e4fe695db333d5914e18ea5f146fArnd Bergmann return drm_ioctl(file, DRM_IOCTL_AGP_UNBIND, (unsigned long)request); 8839a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie} 884b5e89ed53ed8d24f83ba1941c07382af00ed238eDave Airlie#endif /* __OS_HAS_AGP */ 8859a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 8869a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlietypedef struct drm_scatter_gather32 { 8879a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie u32 size; /**< In bytes -- will round to page boundary */ 8889a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie u32 handle; /**< Used for mapping / unmapping */ 8899a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie} drm_scatter_gather32_t; 8909a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 8919a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airliestatic int compat_drm_sg_alloc(struct file *file, unsigned int cmd, 8929a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie unsigned long arg) 8939a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie{ 8949a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie drm_scatter_gather32_t __user *argp = (void __user *)arg; 895ff4135aeb1f9a0201f8e22400ebc1d570df9016eDave Airlie struct drm_scatter_gather __user *request; 8969a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie int err; 8979a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie unsigned long x; 8989a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 8999a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie request = compat_alloc_user_space(sizeof(*request)); 9009a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (!access_ok(VERIFY_WRITE, request, sizeof(*request)) 9019a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie || !access_ok(VERIFY_WRITE, argp, sizeof(*argp)) 9029a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie || __get_user(x, &argp->size) 9039a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie || __put_user(x, &request->size)) 9049a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return -EFAULT; 9059a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 906ed8b67040965e4fe695db333d5914e18ea5f146fArnd Bergmann err = drm_ioctl(file, DRM_IOCTL_SG_ALLOC, (unsigned long)request); 9079a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (err) 9089a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return err; 9099a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 9109a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie /* XXX not sure about the handle conversion here... */ 9119a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (__get_user(x, &request->handle) 9129a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie || __put_user(x >> PAGE_SHIFT, &argp->handle)) 9139a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return -EFAULT; 9149a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 9159a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return 0; 9169a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie} 9179a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 9189a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airliestatic int compat_drm_sg_free(struct file *file, unsigned int cmd, 9199a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie unsigned long arg) 9209a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie{ 9219a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie drm_scatter_gather32_t __user *argp = (void __user *)arg; 922ff4135aeb1f9a0201f8e22400ebc1d570df9016eDave Airlie struct drm_scatter_gather __user *request; 9239a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie unsigned long x; 9249a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 9259a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie request = compat_alloc_user_space(sizeof(*request)); 9269a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (!access_ok(VERIFY_WRITE, request, sizeof(*request)) 9279a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie || !access_ok(VERIFY_WRITE, argp, sizeof(*argp)) 9289a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie || __get_user(x, &argp->handle) 9299a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie || __put_user(x << PAGE_SHIFT, &request->handle)) 9309a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return -EFAULT; 9319a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 932ed8b67040965e4fe695db333d5914e18ea5f146fArnd Bergmann return drm_ioctl(file, DRM_IOCTL_SG_FREE, (unsigned long)request); 9339a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie} 9349a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 93509e40d65d0aa6680428143cda1a7bdc8846ee991David Miller#if defined(CONFIG_X86) || defined(CONFIG_IA64) 93649568873705e45a0de77b7824a9a46d3201019a7Eric Anholttypedef struct drm_update_draw32 { 93749568873705e45a0de77b7824a9a46d3201019a7Eric Anholt drm_drawable_t handle; 93849568873705e45a0de77b7824a9a46d3201019a7Eric Anholt unsigned int type; 93949568873705e45a0de77b7824a9a46d3201019a7Eric Anholt unsigned int num; 94049568873705e45a0de77b7824a9a46d3201019a7Eric Anholt /* 64-bit version has a 32-bit pad here */ 94149568873705e45a0de77b7824a9a46d3201019a7Eric Anholt u64 data; /**< Pointer */ 94249568873705e45a0de77b7824a9a46d3201019a7Eric Anholt} __attribute__((packed)) drm_update_draw32_t; 94349568873705e45a0de77b7824a9a46d3201019a7Eric Anholt 94449568873705e45a0de77b7824a9a46d3201019a7Eric Anholtstatic int compat_drm_update_draw(struct file *file, unsigned int cmd, 94549568873705e45a0de77b7824a9a46d3201019a7Eric Anholt unsigned long arg) 94649568873705e45a0de77b7824a9a46d3201019a7Eric Anholt{ 94749568873705e45a0de77b7824a9a46d3201019a7Eric Anholt drm_update_draw32_t update32; 94849568873705e45a0de77b7824a9a46d3201019a7Eric Anholt struct drm_update_draw __user *request; 94949568873705e45a0de77b7824a9a46d3201019a7Eric Anholt int err; 95049568873705e45a0de77b7824a9a46d3201019a7Eric Anholt 95149568873705e45a0de77b7824a9a46d3201019a7Eric Anholt if (copy_from_user(&update32, (void __user *)arg, sizeof(update32))) 95249568873705e45a0de77b7824a9a46d3201019a7Eric Anholt return -EFAULT; 95349568873705e45a0de77b7824a9a46d3201019a7Eric Anholt 95449568873705e45a0de77b7824a9a46d3201019a7Eric Anholt request = compat_alloc_user_space(sizeof(*request)); 95549568873705e45a0de77b7824a9a46d3201019a7Eric Anholt if (!access_ok(VERIFY_WRITE, request, sizeof(*request)) || 95649568873705e45a0de77b7824a9a46d3201019a7Eric Anholt __put_user(update32.handle, &request->handle) || 95749568873705e45a0de77b7824a9a46d3201019a7Eric Anholt __put_user(update32.type, &request->type) || 95849568873705e45a0de77b7824a9a46d3201019a7Eric Anholt __put_user(update32.num, &request->num) || 95949568873705e45a0de77b7824a9a46d3201019a7Eric Anholt __put_user(update32.data, &request->data)) 96049568873705e45a0de77b7824a9a46d3201019a7Eric Anholt return -EFAULT; 96149568873705e45a0de77b7824a9a46d3201019a7Eric Anholt 962ed8b67040965e4fe695db333d5914e18ea5f146fArnd Bergmann err = drm_ioctl(file, DRM_IOCTL_UPDATE_DRAW, (unsigned long)request); 96349568873705e45a0de77b7824a9a46d3201019a7Eric Anholt return err; 96449568873705e45a0de77b7824a9a46d3201019a7Eric Anholt} 96509e40d65d0aa6680428143cda1a7bdc8846ee991David Miller#endif 96649568873705e45a0de77b7824a9a46d3201019a7Eric Anholt 9679a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airliestruct drm_wait_vblank_request32 { 968ff4135aeb1f9a0201f8e22400ebc1d570df9016eDave Airlie enum drm_vblank_seq_type type; 9699a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie unsigned int sequence; 9709a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie u32 signal; 9719a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie}; 9729a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 9739a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airliestruct drm_wait_vblank_reply32 { 974ff4135aeb1f9a0201f8e22400ebc1d570df9016eDave Airlie enum drm_vblank_seq_type type; 9759a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie unsigned int sequence; 9769a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie s32 tval_sec; 9779a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie s32 tval_usec; 9789a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie}; 9799a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 9809a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlietypedef union drm_wait_vblank32 { 9819a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie struct drm_wait_vblank_request32 request; 9829a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie struct drm_wait_vblank_reply32 reply; 9839a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie} drm_wait_vblank32_t; 9849a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 9859a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airliestatic int compat_drm_wait_vblank(struct file *file, unsigned int cmd, 9869a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie unsigned long arg) 9879a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie{ 9889a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie drm_wait_vblank32_t __user *argp = (void __user *)arg; 9899a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie drm_wait_vblank32_t req32; 990ff4135aeb1f9a0201f8e22400ebc1d570df9016eDave Airlie union drm_wait_vblank __user *request; 9919a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie int err; 9929a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 9939a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (copy_from_user(&req32, argp, sizeof(req32))) 9949a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return -EFAULT; 9959a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 9969a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie request = compat_alloc_user_space(sizeof(*request)); 9979a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (!access_ok(VERIFY_WRITE, request, sizeof(*request)) 9989a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie || __put_user(req32.request.type, &request->request.type) 9999a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie || __put_user(req32.request.sequence, &request->request.sequence) 10009a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie || __put_user(req32.request.signal, &request->request.signal)) 10019a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return -EFAULT; 10029a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 1003ed8b67040965e4fe695db333d5914e18ea5f146fArnd Bergmann err = drm_ioctl(file, DRM_IOCTL_WAIT_VBLANK, (unsigned long)request); 10049a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (err) 10059a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return err; 10069a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 10079a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (__get_user(req32.reply.type, &request->reply.type) 10089a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie || __get_user(req32.reply.sequence, &request->reply.sequence) 10099a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie || __get_user(req32.reply.tval_sec, &request->reply.tval_sec) 10109a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie || __get_user(req32.reply.tval_usec, &request->reply.tval_usec)) 10119a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return -EFAULT; 10129a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 10139a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (copy_to_user(argp, &req32, sizeof(req32))) 10149a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return -EFAULT; 10159a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 10169a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return 0; 10179a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie} 10189a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 10199a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airliedrm_ioctl_compat_t *drm_compat_ioctls[] = { 10209a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie [DRM_IOCTL_NR(DRM_IOCTL_VERSION32)] = compat_drm_version, 10219a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie [DRM_IOCTL_NR(DRM_IOCTL_GET_UNIQUE32)] = compat_drm_getunique, 10229a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie [DRM_IOCTL_NR(DRM_IOCTL_GET_MAP32)] = compat_drm_getmap, 10239a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie [DRM_IOCTL_NR(DRM_IOCTL_GET_CLIENT32)] = compat_drm_getclient, 10249a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie [DRM_IOCTL_NR(DRM_IOCTL_GET_STATS32)] = compat_drm_getstats, 10259a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie [DRM_IOCTL_NR(DRM_IOCTL_SET_UNIQUE32)] = compat_drm_setunique, 10269a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie [DRM_IOCTL_NR(DRM_IOCTL_ADD_MAP32)] = compat_drm_addmap, 10279a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie [DRM_IOCTL_NR(DRM_IOCTL_ADD_BUFS32)] = compat_drm_addbufs, 10289a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie [DRM_IOCTL_NR(DRM_IOCTL_MARK_BUFS32)] = compat_drm_markbufs, 10299a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie [DRM_IOCTL_NR(DRM_IOCTL_INFO_BUFS32)] = compat_drm_infobufs, 10309a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie [DRM_IOCTL_NR(DRM_IOCTL_MAP_BUFS32)] = compat_drm_mapbufs, 10319a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie [DRM_IOCTL_NR(DRM_IOCTL_FREE_BUFS32)] = compat_drm_freebufs, 10329a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie [DRM_IOCTL_NR(DRM_IOCTL_RM_MAP32)] = compat_drm_rmmap, 10339a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie [DRM_IOCTL_NR(DRM_IOCTL_SET_SAREA_CTX32)] = compat_drm_setsareactx, 10349a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie [DRM_IOCTL_NR(DRM_IOCTL_GET_SAREA_CTX32)] = compat_drm_getsareactx, 10359a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie [DRM_IOCTL_NR(DRM_IOCTL_RES_CTX32)] = compat_drm_resctx, 10369a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie [DRM_IOCTL_NR(DRM_IOCTL_DMA32)] = compat_drm_dma, 10379a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie#if __OS_HAS_AGP 10389a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie [DRM_IOCTL_NR(DRM_IOCTL_AGP_ENABLE32)] = compat_drm_agp_enable, 10399a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie [DRM_IOCTL_NR(DRM_IOCTL_AGP_INFO32)] = compat_drm_agp_info, 10409a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie [DRM_IOCTL_NR(DRM_IOCTL_AGP_ALLOC32)] = compat_drm_agp_alloc, 10419a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie [DRM_IOCTL_NR(DRM_IOCTL_AGP_FREE32)] = compat_drm_agp_free, 10429a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie [DRM_IOCTL_NR(DRM_IOCTL_AGP_BIND32)] = compat_drm_agp_bind, 10439a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie [DRM_IOCTL_NR(DRM_IOCTL_AGP_UNBIND32)] = compat_drm_agp_unbind, 10449a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie#endif 10459a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie [DRM_IOCTL_NR(DRM_IOCTL_SG_ALLOC32)] = compat_drm_sg_alloc, 10469a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie [DRM_IOCTL_NR(DRM_IOCTL_SG_FREE32)] = compat_drm_sg_free, 104709e40d65d0aa6680428143cda1a7bdc8846ee991David Miller#if defined(CONFIG_X86) || defined(CONFIG_IA64) 104849568873705e45a0de77b7824a9a46d3201019a7Eric Anholt [DRM_IOCTL_NR(DRM_IOCTL_UPDATE_DRAW32)] = compat_drm_update_draw, 104909e40d65d0aa6680428143cda1a7bdc8846ee991David Miller#endif 10509a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie [DRM_IOCTL_NR(DRM_IOCTL_WAIT_VBLANK32)] = compat_drm_wait_vblank, 10519a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie}; 10529a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 10539a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie/** 10549a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie * Called whenever a 32-bit process running under a 64-bit kernel 10559a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie * performs an ioctl on /dev/drm. 10569a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie * 10576c340eac0285f3d62406d2d902d0e96fbf2a5dc0Eric Anholt * \param file_priv DRM file private. 10589a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie * \param cmd command. 10599a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie * \param arg user argument. 10609a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie * \return zero on success or negative number on failure. 10619a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie */ 10629a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlielong drm_compat_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) 10639a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie{ 10649a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie unsigned int nr = DRM_IOCTL_NR(cmd); 10659a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie drm_ioctl_compat_t *fn; 10669a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie int ret; 10679a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 10687ffa05e0518ebc055ef8f68d7d53e5f7d2ba3428Ian Romanick /* Assume that ioctls without an explicit compat routine will just 10697ffa05e0518ebc055ef8f68d7d53e5f7d2ba3428Ian Romanick * work. This may not always be a good assumption, but it's better 10707ffa05e0518ebc055ef8f68d7d53e5f7d2ba3428Ian Romanick * than always failing. 10717ffa05e0518ebc055ef8f68d7d53e5f7d2ba3428Ian Romanick */ 10723d77461ecd7fb92bb888f69478e3518b3c947ce3Dave Airlie if (nr >= ARRAY_SIZE(drm_compat_ioctls)) 1073ed8b67040965e4fe695db333d5914e18ea5f146fArnd Bergmann return drm_ioctl(filp, cmd, arg); 10749a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 10759a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie fn = drm_compat_ioctls[nr]; 10769a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 10779a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (fn != NULL) 1078b5e89ed53ed8d24f83ba1941c07382af00ed238eDave Airlie ret = (*fn) (filp, cmd, arg); 10799a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie else 1080ed8b67040965e4fe695db333d5914e18ea5f146fArnd Bergmann ret = drm_ioctl(filp, cmd, arg); 10819a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 10829a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return ret; 10839a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie} 1084b5e89ed53ed8d24f83ba1941c07382af00ed238eDave Airlie 10859a18664506dbce5e23f3c5de7b1c5a042dd26520Dave AirlieEXPORT_SYMBOL(drm_compat_ioctl); 1086