4 * 32-bit ioctl compatibility routines for the R128 DRM.
6 * \author Dave Airlie <airlied@linux.ie> with code from patches by Egbert Eich
8 * Copyright (C) Paul Mackerras 2005
9 * Copyright (C) Egbert Eich 2003,2004
10 * Copyright (C) Dave Airlie 2005
11 * All Rights Reserved.
13 * Permission is hereby granted, free of charge, to any person obtaining a
14 * copy of this software and associated documentation files (the "Software"),
15 * to deal in the Software without restriction, including without limitation
16 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
17 * and/or sell copies of the Software, and to permit persons to whom the
18 * Software is furnished to do so, subject to the following conditions:
20 * The above copyright notice and this permission notice (including the next
21 * paragraph) shall be included in all copies or substantial portions of the
24 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
25 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
26 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
27 * THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
28 * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
29 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
33 #include <linux/compat.h>
35 #include <drm/r128_drm.h>
39 typedef struct drm_r128_init32
{
41 unsigned int sarea_priv_offset
;
49 unsigned int front_offset
, front_pitch
;
50 unsigned int back_offset
, back_pitch
;
51 unsigned int depth_bpp
;
52 unsigned int depth_offset
, depth_pitch
;
53 unsigned int span_offset
;
55 unsigned int fb_offset
;
56 unsigned int mmio_offset
;
57 unsigned int ring_offset
;
58 unsigned int ring_rptr_offset
;
59 unsigned int buffers_offset
;
60 unsigned int agp_textures_offset
;
63 static int compat_r128_init(struct file
*file
, unsigned int cmd
,
66 drm_r128_init32_t init32
;
69 if (copy_from_user(&init32
, (void __user
*)arg
, sizeof(init32
)))
72 init
.func
= init32
.func
;
73 init
.sarea_priv_offset
= init32
.sarea_priv_offset
;
74 init
.is_pci
= init32
.is_pci
;
75 init
.cce_mode
= init32
.cce_mode
;
76 init
.cce_secure
= init32
.cce_secure
;
77 init
.ring_size
= init32
.ring_size
;
78 init
.usec_timeout
= init32
.usec_timeout
;
79 init
.fb_bpp
= init32
.fb_bpp
;
80 init
.front_offset
= init32
.front_offset
;
81 init
.front_pitch
= init32
.front_pitch
;
82 init
.back_offset
= init32
.back_offset
;
83 init
.back_pitch
= init32
.back_pitch
;
84 init
.depth_bpp
= init32
.depth_bpp
;
85 init
.depth_offset
= init32
.depth_offset
;
86 init
.depth_pitch
= init32
.depth_pitch
;
87 init
.span_offset
= init32
.span_offset
;
88 init
.fb_offset
= init32
.fb_offset
;
89 init
.mmio_offset
= init32
.mmio_offset
;
90 init
.ring_offset
= init32
.ring_offset
;
91 init
.ring_rptr_offset
= init32
.ring_rptr_offset
;
92 init
.buffers_offset
= init32
.buffers_offset
;
93 init
.agp_textures_offset
= init32
.agp_textures_offset
;
95 return drm_ioctl_kernel(file
, r128_cce_init
, &init
,
96 DRM_AUTH
|DRM_MASTER
|DRM_ROOT_ONLY
);
99 typedef struct drm_r128_depth32
{
106 } drm_r128_depth32_t
;
108 static int compat_r128_depth(struct file
*file
, unsigned int cmd
,
111 drm_r128_depth32_t depth32
;
112 drm_r128_depth_t depth
;
114 if (copy_from_user(&depth32
, (void __user
*)arg
, sizeof(depth32
)))
117 depth
.func
= depth32
.func
;
119 depth
.x
= compat_ptr(depth32
.x
);
120 depth
.y
= compat_ptr(depth32
.y
);
121 depth
.buffer
= compat_ptr(depth32
.buffer
);
122 depth
.mask
= compat_ptr(depth32
.mask
);
124 return drm_ioctl_kernel(file
, r128_cce_depth
, &depth
, DRM_AUTH
);
127 typedef struct drm_r128_stipple32
{
129 } drm_r128_stipple32_t
;
131 static int compat_r128_stipple(struct file
*file
, unsigned int cmd
,
134 drm_r128_stipple32_t stipple32
;
135 drm_r128_stipple_t stipple
;
137 if (copy_from_user(&stipple32
, (void __user
*)arg
, sizeof(stipple32
)))
140 stipple
.mask
= compat_ptr(stipple32
.mask
);
142 return drm_ioctl_kernel(file
, r128_cce_stipple
, &stipple
, DRM_AUTH
);
145 typedef struct drm_r128_getparam32
{
148 } drm_r128_getparam32_t
;
150 static int compat_r128_getparam(struct file
*file
, unsigned int cmd
,
153 drm_r128_getparam32_t getparam32
;
154 drm_r128_getparam_t getparam
;
156 if (copy_from_user(&getparam32
, (void __user
*)arg
, sizeof(getparam32
)))
159 getparam
.param
= getparam32
.param
;
160 getparam
.value
= compat_ptr(getparam32
.value
);
162 return drm_ioctl_kernel(file
, r128_getparam
, &getparam
, DRM_AUTH
);
165 drm_ioctl_compat_t
*r128_compat_ioctls
[] = {
166 [DRM_R128_INIT
] = compat_r128_init
,
167 [DRM_R128_DEPTH
] = compat_r128_depth
,
168 [DRM_R128_STIPPLE
] = compat_r128_stipple
,
169 [DRM_R128_GETPARAM
] = compat_r128_getparam
,
173 * Called whenever a 32-bit process running under a 64-bit kernel
174 * performs an ioctl on /dev/dri/card<n>.
176 * \param filp file pointer.
177 * \param cmd command.
178 * \param arg user argument.
179 * \return zero on success or negative number on failure.
181 long r128_compat_ioctl(struct file
*filp
, unsigned int cmd
, unsigned long arg
)
183 unsigned int nr
= DRM_IOCTL_NR(cmd
);
184 drm_ioctl_compat_t
*fn
= NULL
;
187 if (nr
< DRM_COMMAND_BASE
)
188 return drm_compat_ioctl(filp
, cmd
, arg
);
190 if (nr
< DRM_COMMAND_BASE
+ ARRAY_SIZE(r128_compat_ioctls
))
191 fn
= r128_compat_ioctls
[nr
- DRM_COMMAND_BASE
];
194 ret
= (*fn
) (filp
, cmd
, arg
);
196 ret
= drm_ioctl(filp
, cmd
, arg
);