19a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie/** 29a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie * \file radeon_ioc32.c 39a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie * 49a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie * 32-bit ioctl compatibility routines for the Radeon 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> 319a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 329a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie#include "drmP.h" 339a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie#include "drm.h" 349a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie#include "radeon_drm.h" 359a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie#include "radeon_drv.h" 369a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 379a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlietypedef struct drm_radeon_init32 { 389a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie int func; 399a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie u32 sarea_priv_offset; 409a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie int is_pci; 419a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie int cp_mode; 429a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie int gart_size; 439a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie int ring_size; 449a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie int usec_timeout; 459a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 469a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie unsigned int fb_bpp; 479a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie unsigned int front_offset, front_pitch; 489a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie unsigned int back_offset, back_pitch; 499a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie unsigned int depth_bpp; 509a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie unsigned int depth_offset, depth_pitch; 519a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 529a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie u32 fb_offset; 539a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie u32 mmio_offset; 549a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie u32 ring_offset; 559a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie u32 ring_rptr_offset; 569a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie u32 buffers_offset; 579a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie u32 gart_textures_offset; 589a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie} drm_radeon_init32_t; 599a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 609a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airliestatic int compat_radeon_cp_init(struct file *file, unsigned int cmd, 619a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie unsigned long arg) 629a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie{ 639a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie drm_radeon_init32_t init32; 649a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie drm_radeon_init_t __user *init; 659a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 669a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (copy_from_user(&init32, (void __user *)arg, sizeof(init32))) 679a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return -EFAULT; 689a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 699a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie init = compat_alloc_user_space(sizeof(*init)); 709a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (!access_ok(VERIFY_WRITE, init, sizeof(*init)) 719a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie || __put_user(init32.func, &init->func) 729a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie || __put_user(init32.sarea_priv_offset, &init->sarea_priv_offset) 739a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie || __put_user(init32.is_pci, &init->is_pci) 749a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie || __put_user(init32.cp_mode, &init->cp_mode) 759a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie || __put_user(init32.gart_size, &init->gart_size) 769a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie || __put_user(init32.ring_size, &init->ring_size) 779a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie || __put_user(init32.usec_timeout, &init->usec_timeout) 789a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie || __put_user(init32.fb_bpp, &init->fb_bpp) 799a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie || __put_user(init32.front_offset, &init->front_offset) 809a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie || __put_user(init32.front_pitch, &init->front_pitch) 819a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie || __put_user(init32.back_offset, &init->back_offset) 829a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie || __put_user(init32.back_pitch, &init->back_pitch) 839a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie || __put_user(init32.depth_bpp, &init->depth_bpp) 849a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie || __put_user(init32.depth_offset, &init->depth_offset) 859a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie || __put_user(init32.depth_pitch, &init->depth_pitch) 869a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie || __put_user(init32.fb_offset, &init->fb_offset) 879a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie || __put_user(init32.mmio_offset, &init->mmio_offset) 889a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie || __put_user(init32.ring_offset, &init->ring_offset) 899a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie || __put_user(init32.ring_rptr_offset, &init->ring_rptr_offset) 909a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie || __put_user(init32.buffers_offset, &init->buffers_offset) 919a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie || __put_user(init32.gart_textures_offset, 929a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie &init->gart_textures_offset)) 939a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return -EFAULT; 949a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 95ed8b67040965e4fe695db333d5914e18ea5f146fArnd Bergmann return drm_ioctl(file, DRM_IOCTL_RADEON_CP_INIT, (unsigned long)init); 969a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie} 979a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 989a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlietypedef struct drm_radeon_clear32 { 999a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie unsigned int flags; 1009a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie unsigned int clear_color; 1019a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie unsigned int clear_depth; 1029a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie unsigned int color_mask; 103b5e89ed53ed8d24f83ba1941c07382af00ed238eDave Airlie unsigned int depth_mask; /* misnamed field: should be stencil */ 104b5e89ed53ed8d24f83ba1941c07382af00ed238eDave Airlie u32 depth_boxes; 1059a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie} drm_radeon_clear32_t; 1069a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 1079a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airliestatic int compat_radeon_cp_clear(struct file *file, unsigned int cmd, 1089a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie unsigned long arg) 1099a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie{ 1109a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie drm_radeon_clear32_t clr32; 1119a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie drm_radeon_clear_t __user *clr; 1129a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 1139a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (copy_from_user(&clr32, (void __user *)arg, sizeof(clr32))) 1149a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return -EFAULT; 1159a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 1169a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie clr = compat_alloc_user_space(sizeof(*clr)); 1179a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (!access_ok(VERIFY_WRITE, clr, sizeof(*clr)) 1189a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie || __put_user(clr32.flags, &clr->flags) 1199a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie || __put_user(clr32.clear_color, &clr->clear_color) 1209a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie || __put_user(clr32.clear_depth, &clr->clear_depth) 1219a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie || __put_user(clr32.color_mask, &clr->color_mask) 1229a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie || __put_user(clr32.depth_mask, &clr->depth_mask) 1239a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie || __put_user((void __user *)(unsigned long)clr32.depth_boxes, 1249a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie &clr->depth_boxes)) 1259a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return -EFAULT; 1269a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 127ed8b67040965e4fe695db333d5914e18ea5f146fArnd Bergmann return drm_ioctl(file, DRM_IOCTL_RADEON_CLEAR, (unsigned long)clr); 1289a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie} 1299a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 1309a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlietypedef struct drm_radeon_stipple32 { 1319a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie u32 mask; 1329a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie} drm_radeon_stipple32_t; 1339a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 1349a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airliestatic int compat_radeon_cp_stipple(struct file *file, unsigned int cmd, 1359a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie unsigned long arg) 1369a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie{ 137b5e89ed53ed8d24f83ba1941c07382af00ed238eDave Airlie drm_radeon_stipple32_t __user *argp = (void __user *)arg; 1389a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie drm_radeon_stipple_t __user *request; 1399a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie u32 mask; 1409a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 1419a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (get_user(mask, &argp->mask)) 1429a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return -EFAULT; 1439a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 1449a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie request = compat_alloc_user_space(sizeof(*request)); 1459a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (!access_ok(VERIFY_WRITE, request, sizeof(*request)) 146b5e89ed53ed8d24f83ba1941c07382af00ed238eDave Airlie || __put_user((unsigned int __user *)(unsigned long)mask, 1479a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie &request->mask)) 1489a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return -EFAULT; 1499a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 150ed8b67040965e4fe695db333d5914e18ea5f146fArnd Bergmann return drm_ioctl(file, DRM_IOCTL_RADEON_STIPPLE, (unsigned long)request); 1519a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie} 1529a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 1539a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlietypedef struct drm_radeon_tex_image32 { 154b5e89ed53ed8d24f83ba1941c07382af00ed238eDave Airlie unsigned int x, y; /* Blit coordinates */ 1559a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie unsigned int width, height; 1569a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie u32 data; 1579a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie} drm_radeon_tex_image32_t; 1589a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 1599a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlietypedef struct drm_radeon_texture32 { 1609a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie unsigned int offset; 1619a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie int pitch; 1629a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie int format; 163b5e89ed53ed8d24f83ba1941c07382af00ed238eDave Airlie int width; /* Texture image coordinates */ 1649a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie int height; 1659a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie u32 image; 1669a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie} drm_radeon_texture32_t; 1679a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 1689a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airliestatic int compat_radeon_cp_texture(struct file *file, unsigned int cmd, 1699a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie unsigned long arg) 1709a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie{ 1719a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie drm_radeon_texture32_t req32; 1729a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie drm_radeon_texture_t __user *request; 1739a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie drm_radeon_tex_image32_t img32; 1749a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie drm_radeon_tex_image_t __user *image; 1759a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 176b5e89ed53ed8d24f83ba1941c07382af00ed238eDave Airlie if (copy_from_user(&req32, (void __user *)arg, sizeof(req32))) 1779a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return -EFAULT; 1789a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (req32.image == 0) 1799a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return -EINVAL; 1809a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (copy_from_user(&img32, (void __user *)(unsigned long)req32.image, 1819a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie sizeof(img32))) 1829a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return -EFAULT; 1839a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 1849a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie request = compat_alloc_user_space(sizeof(*request) + sizeof(*image)); 1859a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (!access_ok(VERIFY_WRITE, request, 1869a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie sizeof(*request) + sizeof(*image))) 1879a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return -EFAULT; 1889a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie image = (drm_radeon_tex_image_t __user *) (request + 1); 1899a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 1909a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (__put_user(req32.offset, &request->offset) 1919a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie || __put_user(req32.pitch, &request->pitch) 1929a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie || __put_user(req32.format, &request->format) 1939a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie || __put_user(req32.width, &request->width) 1949a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie || __put_user(req32.height, &request->height) 1959a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie || __put_user(image, &request->image) 1969a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie || __put_user(img32.x, &image->x) 1979a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie || __put_user(img32.y, &image->y) 1989a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie || __put_user(img32.width, &image->width) 1999a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie || __put_user(img32.height, &image->height) 2009a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie || __put_user((const void __user *)(unsigned long)img32.data, 2019a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie &image->data)) 2029a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return -EFAULT; 2039a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 204ed8b67040965e4fe695db333d5914e18ea5f146fArnd Bergmann return drm_ioctl(file, DRM_IOCTL_RADEON_TEXTURE, (unsigned long)request); 2059a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie} 2069a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 2079a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlietypedef struct drm_radeon_vertex2_32 { 208b5e89ed53ed8d24f83ba1941c07382af00ed238eDave Airlie int idx; /* Index of vertex buffer */ 209b5e89ed53ed8d24f83ba1941c07382af00ed238eDave Airlie int discard; /* Client finished with buffer? */ 2109a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie int nr_states; 2119a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie u32 state; 2129a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie int nr_prims; 2139a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie u32 prim; 2149a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie} drm_radeon_vertex2_32_t; 2159a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 2169a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airliestatic int compat_radeon_cp_vertex2(struct file *file, unsigned int cmd, 2179a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie unsigned long arg) 2189a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie{ 2199a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie drm_radeon_vertex2_32_t req32; 2209a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie drm_radeon_vertex2_t __user *request; 2219a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 222b5e89ed53ed8d24f83ba1941c07382af00ed238eDave Airlie if (copy_from_user(&req32, (void __user *)arg, sizeof(req32))) 2239a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return -EFAULT; 2249a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 2259a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie request = compat_alloc_user_space(sizeof(*request)); 2269a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (!access_ok(VERIFY_WRITE, request, sizeof(*request)) 2279a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie || __put_user(req32.idx, &request->idx) 2289a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie || __put_user(req32.discard, &request->discard) 2299a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie || __put_user(req32.nr_states, &request->nr_states) 2309a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie || __put_user((void __user *)(unsigned long)req32.state, 2319a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie &request->state) 2329a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie || __put_user(req32.nr_prims, &request->nr_prims) 2339a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie || __put_user((void __user *)(unsigned long)req32.prim, 2349a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie &request->prim)) 2359a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return -EFAULT; 2369a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 237ed8b67040965e4fe695db333d5914e18ea5f146fArnd Bergmann return drm_ioctl(file, DRM_IOCTL_RADEON_VERTEX2, (unsigned long)request); 2389a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie} 2399a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 2409a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlietypedef struct drm_radeon_cmd_buffer32 { 2419a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie int bufsz; 2429a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie u32 buf; 2439a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie int nbox; 2449a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie u32 boxes; 2459a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie} drm_radeon_cmd_buffer32_t; 2469a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 2479a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airliestatic int compat_radeon_cp_cmdbuf(struct file *file, unsigned int cmd, 2489a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie unsigned long arg) 2499a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie{ 2509a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie drm_radeon_cmd_buffer32_t req32; 2519a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie drm_radeon_cmd_buffer_t __user *request; 2529a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 253b5e89ed53ed8d24f83ba1941c07382af00ed238eDave Airlie if (copy_from_user(&req32, (void __user *)arg, sizeof(req32))) 2549a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return -EFAULT; 2559a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 2569a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie request = compat_alloc_user_space(sizeof(*request)); 2579a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (!access_ok(VERIFY_WRITE, request, sizeof(*request)) 2589a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie || __put_user(req32.bufsz, &request->bufsz) 2599a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie || __put_user((void __user *)(unsigned long)req32.buf, 2609a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie &request->buf) 2619a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie || __put_user(req32.nbox, &request->nbox) 2629a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie || __put_user((void __user *)(unsigned long)req32.boxes, 2639a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie &request->boxes)) 2649a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return -EFAULT; 2659a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 266ed8b67040965e4fe695db333d5914e18ea5f146fArnd Bergmann return drm_ioctl(file, DRM_IOCTL_RADEON_CMDBUF, (unsigned long)request); 2679a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie} 2689a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 2699a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlietypedef struct drm_radeon_getparam32 { 2709a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie int param; 2719a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie u32 value; 2729a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie} drm_radeon_getparam32_t; 2739a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 2749a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airliestatic int compat_radeon_cp_getparam(struct file *file, unsigned int cmd, 2759a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie unsigned long arg) 2769a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie{ 2779a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie drm_radeon_getparam32_t req32; 2789a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie drm_radeon_getparam_t __user *request; 2799a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 280b5e89ed53ed8d24f83ba1941c07382af00ed238eDave Airlie if (copy_from_user(&req32, (void __user *)arg, sizeof(req32))) 2819a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return -EFAULT; 2829a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 2839a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie request = compat_alloc_user_space(sizeof(*request)); 2849a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (!access_ok(VERIFY_WRITE, request, sizeof(*request)) 2859a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie || __put_user(req32.param, &request->param) 2869a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie || __put_user((void __user *)(unsigned long)req32.value, 2879a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie &request->value)) 2889a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return -EFAULT; 2899a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 290ed8b67040965e4fe695db333d5914e18ea5f146fArnd Bergmann return drm_ioctl(file, DRM_IOCTL_RADEON_GETPARAM, (unsigned long)request); 2919a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie} 2929a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 2939a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlietypedef struct drm_radeon_mem_alloc32 { 2949a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie int region; 2959a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie int alignment; 2969a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie int size; 2979a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie u32 region_offset; /* offset from start of fb or GART */ 2989a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie} drm_radeon_mem_alloc32_t; 2999a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 3009a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airliestatic int compat_radeon_mem_alloc(struct file *file, unsigned int cmd, 3019a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie unsigned long arg) 3029a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie{ 3039a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie drm_radeon_mem_alloc32_t req32; 3049a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie drm_radeon_mem_alloc_t __user *request; 3059a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 306b5e89ed53ed8d24f83ba1941c07382af00ed238eDave Airlie if (copy_from_user(&req32, (void __user *)arg, sizeof(req32))) 3079a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return -EFAULT; 3089a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 3099a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie request = compat_alloc_user_space(sizeof(*request)); 3109a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (!access_ok(VERIFY_WRITE, request, sizeof(*request)) 3119a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie || __put_user(req32.region, &request->region) 3129a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie || __put_user(req32.alignment, &request->alignment) 3139a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie || __put_user(req32.size, &request->size) 3149a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie || __put_user((int __user *)(unsigned long)req32.region_offset, 3159a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie &request->region_offset)) 3169a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return -EFAULT; 3179a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 318ed8b67040965e4fe695db333d5914e18ea5f146fArnd Bergmann return drm_ioctl(file, DRM_IOCTL_RADEON_ALLOC, (unsigned long)request); 3199a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie} 3209a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 3219a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlietypedef struct drm_radeon_irq_emit32 { 3229a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie u32 irq_seq; 3239a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie} drm_radeon_irq_emit32_t; 3249a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 3259a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airliestatic int compat_radeon_irq_emit(struct file *file, unsigned int cmd, 3269a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie unsigned long arg) 3279a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie{ 3289a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie drm_radeon_irq_emit32_t req32; 3299a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie drm_radeon_irq_emit_t __user *request; 3309a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 331b5e89ed53ed8d24f83ba1941c07382af00ed238eDave Airlie if (copy_from_user(&req32, (void __user *)arg, sizeof(req32))) 3329a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return -EFAULT; 3339a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 3349a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie request = compat_alloc_user_space(sizeof(*request)); 3359a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (!access_ok(VERIFY_WRITE, request, sizeof(*request)) 3369a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie || __put_user((int __user *)(unsigned long)req32.irq_seq, 3379a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie &request->irq_seq)) 3389a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return -EFAULT; 3399a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 340ed8b67040965e4fe695db333d5914e18ea5f146fArnd Bergmann return drm_ioctl(file, DRM_IOCTL_RADEON_IRQ_EMIT, (unsigned long)request); 3419a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie} 3429a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 343f4d2781731e846c2f01dd85e71883d120860c6ddDavid Woodhouse/* The two 64-bit arches where alignof(u64)==4 in 32-bit code */ 344f4d2781731e846c2f01dd85e71883d120860c6ddDavid Woodhouse#if defined (CONFIG_X86_64) || defined(CONFIG_IA64) 3459b01bd5b284bbf519b726b39f1352023cb5e9e69Dave Airlietypedef struct drm_radeon_setparam32 { 3469b01bd5b284bbf519b726b39f1352023cb5e9e69Dave Airlie int param; 3479b01bd5b284bbf519b726b39f1352023cb5e9e69Dave Airlie u64 value; 3489b01bd5b284bbf519b726b39f1352023cb5e9e69Dave Airlie} __attribute__((packed)) drm_radeon_setparam32_t; 3499b01bd5b284bbf519b726b39f1352023cb5e9e69Dave Airlie 3509b01bd5b284bbf519b726b39f1352023cb5e9e69Dave Airliestatic int compat_radeon_cp_setparam(struct file *file, unsigned int cmd, 3519b01bd5b284bbf519b726b39f1352023cb5e9e69Dave Airlie unsigned long arg) 3529b01bd5b284bbf519b726b39f1352023cb5e9e69Dave Airlie{ 3539b01bd5b284bbf519b726b39f1352023cb5e9e69Dave Airlie drm_radeon_setparam32_t req32; 3549b01bd5b284bbf519b726b39f1352023cb5e9e69Dave Airlie drm_radeon_setparam_t __user *request; 3559b01bd5b284bbf519b726b39f1352023cb5e9e69Dave Airlie 3569b01bd5b284bbf519b726b39f1352023cb5e9e69Dave Airlie if (copy_from_user(&req32, (void __user *) arg, sizeof(req32))) 3579b01bd5b284bbf519b726b39f1352023cb5e9e69Dave Airlie return -EFAULT; 3589b01bd5b284bbf519b726b39f1352023cb5e9e69Dave Airlie 3599b01bd5b284bbf519b726b39f1352023cb5e9e69Dave Airlie request = compat_alloc_user_space(sizeof(*request)); 3609b01bd5b284bbf519b726b39f1352023cb5e9e69Dave Airlie if (!access_ok(VERIFY_WRITE, request, sizeof(*request)) 3619b01bd5b284bbf519b726b39f1352023cb5e9e69Dave Airlie || __put_user(req32.param, &request->param) 3629b01bd5b284bbf519b726b39f1352023cb5e9e69Dave Airlie || __put_user((void __user *)(unsigned long)req32.value, 3639b01bd5b284bbf519b726b39f1352023cb5e9e69Dave Airlie &request->value)) 3649b01bd5b284bbf519b726b39f1352023cb5e9e69Dave Airlie return -EFAULT; 3659b01bd5b284bbf519b726b39f1352023cb5e9e69Dave Airlie 366ed8b67040965e4fe695db333d5914e18ea5f146fArnd Bergmann return drm_ioctl(file, DRM_IOCTL_RADEON_SETPARAM, (unsigned long) request); 3679b01bd5b284bbf519b726b39f1352023cb5e9e69Dave Airlie} 368f4d2781731e846c2f01dd85e71883d120860c6ddDavid Woodhouse#else 369f4d2781731e846c2f01dd85e71883d120860c6ddDavid Woodhouse#define compat_radeon_cp_setparam NULL 370f4d2781731e846c2f01dd85e71883d120860c6ddDavid Woodhouse#endif /* X86_64 || IA64 */ 3719b01bd5b284bbf519b726b39f1352023cb5e9e69Dave Airlie 3729a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airliedrm_ioctl_compat_t *radeon_compat_ioctls[] = { 3739a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie [DRM_RADEON_CP_INIT] = compat_radeon_cp_init, 3749a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie [DRM_RADEON_CLEAR] = compat_radeon_cp_clear, 3759a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie [DRM_RADEON_STIPPLE] = compat_radeon_cp_stipple, 3769a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie [DRM_RADEON_TEXTURE] = compat_radeon_cp_texture, 3779a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie [DRM_RADEON_VERTEX2] = compat_radeon_cp_vertex2, 3789a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie [DRM_RADEON_CMDBUF] = compat_radeon_cp_cmdbuf, 3799a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie [DRM_RADEON_GETPARAM] = compat_radeon_cp_getparam, 3809b01bd5b284bbf519b726b39f1352023cb5e9e69Dave Airlie [DRM_RADEON_SETPARAM] = compat_radeon_cp_setparam, 3819a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie [DRM_RADEON_ALLOC] = compat_radeon_mem_alloc, 3829a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie [DRM_RADEON_IRQ_EMIT] = compat_radeon_irq_emit, 3839a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie}; 3849a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 3859a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie/** 3869a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie * Called whenever a 32-bit process running under a 64-bit kernel 3879a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie * performs an ioctl on /dev/dri/card<n>. 3889a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie * 3899a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie * \param filp file pointer. 3909a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie * \param cmd command. 3919a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie * \param arg user argument. 3929a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie * \return zero on success or negative number on failure. 3939a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie */ 394b5e89ed53ed8d24f83ba1941c07382af00ed238eDave Airlielong radeon_compat_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) 3959a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie{ 3969a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie unsigned int nr = DRM_IOCTL_NR(cmd); 3979a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie drm_ioctl_compat_t *fn = NULL; 3989a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie int ret; 3999a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 4009a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (nr < DRM_COMMAND_BASE) 4019a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return drm_compat_ioctl(filp, cmd, arg); 4029a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 4039a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (nr < DRM_COMMAND_BASE + DRM_ARRAY_SIZE(radeon_compat_ioctls)) 4049a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie fn = radeon_compat_ioctls[nr - DRM_COMMAND_BASE]; 4059a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 4069a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie if (fn != NULL) 407b5e89ed53ed8d24f83ba1941c07382af00ed238eDave Airlie ret = (*fn) (filp, cmd, arg); 4089a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie else 409ed8b67040965e4fe695db333d5914e18ea5f146fArnd Bergmann ret = drm_ioctl(filp, cmd, arg); 4109a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie 4119a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie return ret; 4129a18664506dbce5e23f3c5de7b1c5a042dd26520Dave Airlie} 41370ba2a374704e00df8868a7ac3d7350329d28924Dave Airlie 41470ba2a374704e00df8868a7ac3d7350329d28924Dave Airlielong radeon_kms_compat_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) 41570ba2a374704e00df8868a7ac3d7350329d28924Dave Airlie{ 41670ba2a374704e00df8868a7ac3d7350329d28924Dave Airlie unsigned int nr = DRM_IOCTL_NR(cmd); 41770ba2a374704e00df8868a7ac3d7350329d28924Dave Airlie int ret; 41870ba2a374704e00df8868a7ac3d7350329d28924Dave Airlie 41970ba2a374704e00df8868a7ac3d7350329d28924Dave Airlie if (nr < DRM_COMMAND_BASE) 42070ba2a374704e00df8868a7ac3d7350329d28924Dave Airlie return drm_compat_ioctl(filp, cmd, arg); 42170ba2a374704e00df8868a7ac3d7350329d28924Dave Airlie 422ed8b67040965e4fe695db333d5914e18ea5f146fArnd Bergmann ret = drm_ioctl(filp, cmd, arg); 42370ba2a374704e00df8868a7ac3d7350329d28924Dave Airlie 42470ba2a374704e00df8868a7ac3d7350329d28924Dave Airlie return ret; 42570ba2a374704e00df8868a7ac3d7350329d28924Dave Airlie} 426