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