forked from Minki/linux
Merge branch 'work.drm' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs
Pull DRM compat ioctl handling updates from Al Viro: "This kills the double-copies in there and tons of field-by-field copyin/copyout. Several dead ioctls put to rest, while we are at it - the native counterparts had been gone for a decade, so we can bloody well fail early on the compat side. No point rearranging the 32bit structure into 64bit one (and back) only to be told "piss off, I don't know that ioctl" by the native code..." * 'work.drm' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs: (29 commits) Fix trivial misannotations mga: switch compat ioctls to drm_ioctl_kernel() radeon: take out dead compat ioctls drm compat: ia64 is not biarch drm_compat_ioctl(): tidy up a bit switch compat_drm_mapbufs() to drm_ioctl_kernel() switch compat_drm_rmmap() to drm_ioctl_kernel() switch compat_drm_mode_addfb2() to drm_ioctl_kernel() switch compat_drm_wait_vblank() to drm_ioctl_kernel() switch compat_drm_update_draw() compat_drm: switch sg ioctls compat_drm: switch AGP compat ioctls to drm_ioctl_kernel() switch compat_drm_dma() to drm_ioctl_kernel() switch compat_drm_resctx() to drm_ioctl_kernel() switch compat_drm_getsareactx() to drm_ioctl_kernel() switch compat_drm_setsareactx() to drm_ioctl_kernel() switch compat_drm_freebufs() to drm_ioctl_kernel() switch compat_drm_markbufs() to drm_ioctl_kernel() switch compat_drm_addmap() to drm_ioctl_kernel() switch compat_drm_getstats() to drm_ioctl_kernel() ...
This commit is contained in:
commit
771d3feb4b
@ -1258,11 +1258,11 @@ int drm_legacy_addbufs(struct drm_device *dev, void *data,
|
||||
* lock, preventing of allocating more buffers after this call. Information
|
||||
* about each requested buffer is then copied into user space.
|
||||
*/
|
||||
int drm_legacy_infobufs(struct drm_device *dev, void *data,
|
||||
struct drm_file *file_priv)
|
||||
int __drm_legacy_infobufs(struct drm_device *dev,
|
||||
void *data, int *p,
|
||||
int (*f)(void *, int, struct drm_buf_entry *))
|
||||
{
|
||||
struct drm_device_dma *dma = dev->dma;
|
||||
struct drm_buf_info *request = data;
|
||||
int i;
|
||||
int count;
|
||||
|
||||
@ -1290,26 +1290,12 @@ int drm_legacy_infobufs(struct drm_device *dev, void *data,
|
||||
|
||||
DRM_DEBUG("count = %d\n", count);
|
||||
|
||||
if (request->count >= count) {
|
||||
if (*p >= count) {
|
||||
for (i = 0, count = 0; i < DRM_MAX_ORDER + 1; i++) {
|
||||
if (dma->bufs[i].buf_count) {
|
||||
struct drm_buf_desc __user *to =
|
||||
&request->list[count];
|
||||
struct drm_buf_entry *from = &dma->bufs[i];
|
||||
if (copy_to_user(&to->count,
|
||||
&from->buf_count,
|
||||
sizeof(from->buf_count)) ||
|
||||
copy_to_user(&to->size,
|
||||
&from->buf_size,
|
||||
sizeof(from->buf_size)) ||
|
||||
copy_to_user(&to->low_mark,
|
||||
&from->low_mark,
|
||||
sizeof(from->low_mark)) ||
|
||||
copy_to_user(&to->high_mark,
|
||||
&from->high_mark,
|
||||
sizeof(from->high_mark)))
|
||||
struct drm_buf_entry *from = &dma->bufs[i];
|
||||
if (from->buf_count) {
|
||||
if (f(data, count, from) < 0)
|
||||
return -EFAULT;
|
||||
|
||||
DRM_DEBUG("%d %d %d %d %d\n",
|
||||
i,
|
||||
dma->bufs[i].buf_count,
|
||||
@ -1320,11 +1306,29 @@ int drm_legacy_infobufs(struct drm_device *dev, void *data,
|
||||
}
|
||||
}
|
||||
}
|
||||
request->count = count;
|
||||
*p = count;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int copy_one_buf(void *data, int count, struct drm_buf_entry *from)
|
||||
{
|
||||
struct drm_buf_info *request = data;
|
||||
struct drm_buf_desc __user *to = &request->list[count];
|
||||
struct drm_buf_desc v = {.count = from->buf_count,
|
||||
.size = from->buf_size,
|
||||
.low_mark = from->low_mark,
|
||||
.high_mark = from->high_mark};
|
||||
return copy_to_user(to, &v, offsetof(struct drm_buf_desc, flags));
|
||||
}
|
||||
|
||||
int drm_legacy_infobufs(struct drm_device *dev, void *data,
|
||||
struct drm_file *file_priv)
|
||||
{
|
||||
struct drm_buf_info *request = data;
|
||||
return __drm_legacy_infobufs(dev, data, &request->count, copy_one_buf);
|
||||
}
|
||||
|
||||
/**
|
||||
* Specifies a low and high water mark for buffer allocation
|
||||
*
|
||||
@ -1439,15 +1443,15 @@ int drm_legacy_freebufs(struct drm_device *dev, void *data,
|
||||
* offset equal to 0, which drm_mmap() interpretes as PCI buffers and calls
|
||||
* drm_mmap_dma().
|
||||
*/
|
||||
int drm_legacy_mapbufs(struct drm_device *dev, void *data,
|
||||
struct drm_file *file_priv)
|
||||
int __drm_legacy_mapbufs(struct drm_device *dev, void *data, int *p,
|
||||
void __user **v,
|
||||
int (*f)(void *, int, unsigned long,
|
||||
struct drm_buf *),
|
||||
struct drm_file *file_priv)
|
||||
{
|
||||
struct drm_device_dma *dma = dev->dma;
|
||||
int retcode = 0;
|
||||
const int zero = 0;
|
||||
unsigned long virtual;
|
||||
unsigned long address;
|
||||
struct drm_buf_map *request = data;
|
||||
int i;
|
||||
|
||||
if (!drm_core_check_feature(dev, DRIVER_LEGACY))
|
||||
@ -1467,7 +1471,7 @@ int drm_legacy_mapbufs(struct drm_device *dev, void *data,
|
||||
dev->buf_use++; /* Can't allocate more after this call */
|
||||
spin_unlock(&dev->buf_lock);
|
||||
|
||||
if (request->count >= dma->buf_count) {
|
||||
if (*p >= dma->buf_count) {
|
||||
if ((dev->agp && (dma->flags & _DRM_DMA_USE_AGP))
|
||||
|| (drm_core_check_feature(dev, DRIVER_SG)
|
||||
&& (dma->flags & _DRM_DMA_USE_SG))) {
|
||||
@ -1492,41 +1496,51 @@ int drm_legacy_mapbufs(struct drm_device *dev, void *data,
|
||||
retcode = (signed long)virtual;
|
||||
goto done;
|
||||
}
|
||||
request->virtual = (void __user *)virtual;
|
||||
*v = (void __user *)virtual;
|
||||
|
||||
for (i = 0; i < dma->buf_count; i++) {
|
||||
if (copy_to_user(&request->list[i].idx,
|
||||
&dma->buflist[i]->idx,
|
||||
sizeof(request->list[0].idx))) {
|
||||
retcode = -EFAULT;
|
||||
goto done;
|
||||
}
|
||||
if (copy_to_user(&request->list[i].total,
|
||||
&dma->buflist[i]->total,
|
||||
sizeof(request->list[0].total))) {
|
||||
retcode = -EFAULT;
|
||||
goto done;
|
||||
}
|
||||
if (copy_to_user(&request->list[i].used,
|
||||
&zero, sizeof(zero))) {
|
||||
retcode = -EFAULT;
|
||||
goto done;
|
||||
}
|
||||
address = virtual + dma->buflist[i]->offset; /* *** */
|
||||
if (copy_to_user(&request->list[i].address,
|
||||
&address, sizeof(address))) {
|
||||
if (f(data, i, virtual, dma->buflist[i]) < 0) {
|
||||
retcode = -EFAULT;
|
||||
goto done;
|
||||
}
|
||||
}
|
||||
}
|
||||
done:
|
||||
request->count = dma->buf_count;
|
||||
DRM_DEBUG("%d buffers, retcode = %d\n", request->count, retcode);
|
||||
*p = dma->buf_count;
|
||||
DRM_DEBUG("%d buffers, retcode = %d\n", *p, retcode);
|
||||
|
||||
return retcode;
|
||||
}
|
||||
|
||||
static int map_one_buf(void *data, int idx, unsigned long virtual,
|
||||
struct drm_buf *buf)
|
||||
{
|
||||
struct drm_buf_map *request = data;
|
||||
unsigned long address = virtual + buf->offset; /* *** */
|
||||
|
||||
if (copy_to_user(&request->list[idx].idx, &buf->idx,
|
||||
sizeof(request->list[0].idx)))
|
||||
return -EFAULT;
|
||||
if (copy_to_user(&request->list[idx].total, &buf->total,
|
||||
sizeof(request->list[0].total)))
|
||||
return -EFAULT;
|
||||
if (clear_user(&request->list[idx].used, sizeof(int)))
|
||||
return -EFAULT;
|
||||
if (copy_to_user(&request->list[idx].address, &address,
|
||||
sizeof(address)))
|
||||
return -EFAULT;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int drm_legacy_mapbufs(struct drm_device *dev, void *data,
|
||||
struct drm_file *file_priv)
|
||||
{
|
||||
struct drm_buf_map *request = data;
|
||||
return __drm_legacy_mapbufs(dev, data, &request->count,
|
||||
&request->virtual, map_one_buf,
|
||||
file_priv);
|
||||
}
|
||||
|
||||
int drm_legacy_dma_ioctl(struct drm_device *dev, void *data,
|
||||
struct drm_file *file_priv)
|
||||
{
|
||||
|
@ -143,3 +143,6 @@ static inline int drm_debugfs_crtc_crc_add(struct drm_crtc *crtc)
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
drm_ioctl_t drm_version;
|
||||
drm_ioctl_t drm_getunique;
|
||||
drm_ioctl_t drm_getclient;
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -107,7 +107,7 @@
|
||||
*
|
||||
* Copies the bus id from drm_device::unique into user space.
|
||||
*/
|
||||
static int drm_getunique(struct drm_device *dev, void *data,
|
||||
int drm_getunique(struct drm_device *dev, void *data,
|
||||
struct drm_file *file_priv)
|
||||
{
|
||||
struct drm_unique *u = data;
|
||||
@ -172,7 +172,7 @@ static int drm_set_busid(struct drm_device *dev, struct drm_file *file_priv)
|
||||
* Searches for the client with the specified index and copies its information
|
||||
* into userspace
|
||||
*/
|
||||
static int drm_getclient(struct drm_device *dev, void *data,
|
||||
int drm_getclient(struct drm_device *dev, void *data,
|
||||
struct drm_file *file_priv)
|
||||
{
|
||||
struct drm_client *client = data;
|
||||
@ -461,7 +461,7 @@ static int drm_copy_field(char __user *buf, size_t *buf_len, const char *value)
|
||||
*
|
||||
* Fills in the version information in \p arg.
|
||||
*/
|
||||
static int drm_version(struct drm_device *dev, void *data,
|
||||
int drm_version(struct drm_device *dev, void *data,
|
||||
struct drm_file *file_priv)
|
||||
{
|
||||
struct drm_version *version = data;
|
||||
@ -694,6 +694,33 @@ static const struct drm_ioctl_desc drm_ioctls[] = {
|
||||
* structure.
|
||||
*/
|
||||
|
||||
long drm_ioctl_kernel(struct file *file, drm_ioctl_t *func, void *kdata,
|
||||
u32 flags)
|
||||
{
|
||||
struct drm_file *file_priv = file->private_data;
|
||||
struct drm_device *dev = file_priv->minor->dev;
|
||||
int retcode;
|
||||
|
||||
if (drm_device_is_unplugged(dev))
|
||||
return -ENODEV;
|
||||
|
||||
retcode = drm_ioctl_permit(flags, file_priv);
|
||||
if (unlikely(retcode))
|
||||
return retcode;
|
||||
|
||||
/* Enforce sane locking for modern driver ioctls. */
|
||||
if (!drm_core_check_feature(dev, DRIVER_LEGACY) ||
|
||||
(flags & DRM_UNLOCKED))
|
||||
retcode = func(dev, kdata, file_priv);
|
||||
else {
|
||||
mutex_lock(&drm_global_mutex);
|
||||
retcode = func(dev, kdata, file_priv);
|
||||
mutex_unlock(&drm_global_mutex);
|
||||
}
|
||||
return retcode;
|
||||
}
|
||||
EXPORT_SYMBOL(drm_ioctl_kernel);
|
||||
|
||||
/**
|
||||
* drm_ioctl - ioctl callback implementation for DRM drivers
|
||||
* @filp: file this ioctl is called on
|
||||
@ -762,10 +789,6 @@ long drm_ioctl(struct file *filp,
|
||||
goto err_i1;
|
||||
}
|
||||
|
||||
retcode = drm_ioctl_permit(ioctl->flags, file_priv);
|
||||
if (unlikely(retcode))
|
||||
goto err_i1;
|
||||
|
||||
if (ksize <= sizeof(stack_kdata)) {
|
||||
kdata = stack_kdata;
|
||||
} else {
|
||||
@ -784,16 +807,7 @@ long drm_ioctl(struct file *filp,
|
||||
if (ksize > in_size)
|
||||
memset(kdata + in_size, 0, ksize - in_size);
|
||||
|
||||
/* Enforce sane locking for modern driver ioctls. */
|
||||
if (!drm_core_check_feature(dev, DRIVER_LEGACY) ||
|
||||
(ioctl->flags & DRM_UNLOCKED))
|
||||
retcode = func(dev, kdata, file_priv);
|
||||
else {
|
||||
mutex_lock(&drm_global_mutex);
|
||||
retcode = func(dev, kdata, file_priv);
|
||||
mutex_unlock(&drm_global_mutex);
|
||||
}
|
||||
|
||||
retcode = drm_ioctl_kernel(filp, func, kdata, ioctl->flags);
|
||||
if (copy_to_user((void __user *)arg, kdata, out_size) != 0)
|
||||
retcode = -EFAULT;
|
||||
|
||||
|
@ -74,6 +74,13 @@ int drm_legacy_freebufs(struct drm_device *d, void *v, struct drm_file *f);
|
||||
int drm_legacy_mapbufs(struct drm_device *d, void *v, struct drm_file *f);
|
||||
int drm_legacy_dma_ioctl(struct drm_device *d, void *v, struct drm_file *f);
|
||||
|
||||
int __drm_legacy_infobufs(struct drm_device *, void *, int *,
|
||||
int (*)(void *, int, struct drm_buf_entry *));
|
||||
int __drm_legacy_mapbufs(struct drm_device *, void *, int *,
|
||||
void __user **,
|
||||
int (*)(void *, int, unsigned long, struct drm_buf *),
|
||||
struct drm_file *);
|
||||
|
||||
#ifdef CONFIG_DRM_VM
|
||||
void drm_legacy_vma_flush(struct drm_device *d);
|
||||
#else
|
||||
|
@ -159,6 +159,8 @@ extern int mga_dma_bootstrap(struct drm_device *dev, void *data,
|
||||
struct drm_file *file_priv);
|
||||
extern int mga_dma_init(struct drm_device *dev, void *data,
|
||||
struct drm_file *file_priv);
|
||||
extern int mga_getparam(struct drm_device *dev, void *data,
|
||||
struct drm_file *file_priv);
|
||||
extern int mga_dma_flush(struct drm_device *dev, void *data,
|
||||
struct drm_file *file_priv);
|
||||
extern int mga_dma_reset(struct drm_device *dev, void *data,
|
||||
|
@ -61,46 +61,25 @@ static int compat_mga_init(struct file *file, unsigned int cmd,
|
||||
unsigned long arg)
|
||||
{
|
||||
drm_mga_init32_t init32;
|
||||
drm_mga_init_t __user *init;
|
||||
int err = 0, i;
|
||||
drm_mga_init_t init;
|
||||
|
||||
if (copy_from_user(&init32, (void __user *)arg, sizeof(init32)))
|
||||
return -EFAULT;
|
||||
|
||||
init = compat_alloc_user_space(sizeof(*init));
|
||||
if (!access_ok(VERIFY_WRITE, init, sizeof(*init))
|
||||
|| __put_user(init32.func, &init->func)
|
||||
|| __put_user(init32.sarea_priv_offset, &init->sarea_priv_offset)
|
||||
|| __put_user(init32.chipset, &init->chipset)
|
||||
|| __put_user(init32.sgram, &init->sgram)
|
||||
|| __put_user(init32.maccess, &init->maccess)
|
||||
|| __put_user(init32.fb_cpp, &init->fb_cpp)
|
||||
|| __put_user(init32.front_offset, &init->front_offset)
|
||||
|| __put_user(init32.front_pitch, &init->front_pitch)
|
||||
|| __put_user(init32.back_offset, &init->back_offset)
|
||||
|| __put_user(init32.back_pitch, &init->back_pitch)
|
||||
|| __put_user(init32.depth_cpp, &init->depth_cpp)
|
||||
|| __put_user(init32.depth_offset, &init->depth_offset)
|
||||
|| __put_user(init32.depth_pitch, &init->depth_pitch)
|
||||
|| __put_user(init32.fb_offset, &init->fb_offset)
|
||||
|| __put_user(init32.mmio_offset, &init->mmio_offset)
|
||||
|| __put_user(init32.status_offset, &init->status_offset)
|
||||
|| __put_user(init32.warp_offset, &init->warp_offset)
|
||||
|| __put_user(init32.primary_offset, &init->primary_offset)
|
||||
|| __put_user(init32.buffers_offset, &init->buffers_offset))
|
||||
return -EFAULT;
|
||||
init.func = init32.func;
|
||||
init.sarea_priv_offset = init32.sarea_priv_offset;
|
||||
memcpy(&init.chipset, &init32.chipset,
|
||||
offsetof(drm_mga_init_t, fb_offset) -
|
||||
offsetof(drm_mga_init_t, chipset));
|
||||
init.fb_offset = init32.fb_offset;
|
||||
init.mmio_offset = init32.mmio_offset;
|
||||
init.status_offset = init32.status_offset;
|
||||
init.warp_offset = init32.warp_offset;
|
||||
init.primary_offset = init32.primary_offset;
|
||||
init.buffers_offset = init32.buffers_offset;
|
||||
|
||||
for (i = 0; i < MGA_NR_TEX_HEAPS; i++) {
|
||||
err |=
|
||||
__put_user(init32.texture_offset[i],
|
||||
&init->texture_offset[i]);
|
||||
err |=
|
||||
__put_user(init32.texture_size[i], &init->texture_size[i]);
|
||||
}
|
||||
if (err)
|
||||
return -EFAULT;
|
||||
|
||||
return drm_ioctl(file, DRM_IOCTL_MGA_INIT, (unsigned long)init);
|
||||
return drm_ioctl_kernel(file, mga_dma_init, &init,
|
||||
DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY);
|
||||
}
|
||||
|
||||
typedef struct drm_mga_getparam32 {
|
||||
@ -112,19 +91,14 @@ static int compat_mga_getparam(struct file *file, unsigned int cmd,
|
||||
unsigned long arg)
|
||||
{
|
||||
drm_mga_getparam32_t getparam32;
|
||||
drm_mga_getparam_t __user *getparam;
|
||||
drm_mga_getparam_t getparam;
|
||||
|
||||
if (copy_from_user(&getparam32, (void __user *)arg, sizeof(getparam32)))
|
||||
return -EFAULT;
|
||||
|
||||
getparam = compat_alloc_user_space(sizeof(*getparam));
|
||||
if (!access_ok(VERIFY_WRITE, getparam, sizeof(*getparam))
|
||||
|| __put_user(getparam32.param, &getparam->param)
|
||||
|| __put_user((void __user *)(unsigned long)getparam32.value,
|
||||
&getparam->value))
|
||||
return -EFAULT;
|
||||
|
||||
return drm_ioctl(file, DRM_IOCTL_MGA_GETPARAM, (unsigned long)getparam);
|
||||
getparam.param = getparam32.param;
|
||||
getparam.value = compat_ptr(getparam32.value);
|
||||
return drm_ioctl_kernel(file, mga_getparam, &getparam, DRM_AUTH);
|
||||
}
|
||||
|
||||
typedef struct drm_mga_drm_bootstrap32 {
|
||||
@ -141,48 +115,33 @@ static int compat_mga_dma_bootstrap(struct file *file, unsigned int cmd,
|
||||
unsigned long arg)
|
||||
{
|
||||
drm_mga_dma_bootstrap32_t dma_bootstrap32;
|
||||
drm_mga_dma_bootstrap_t __user *dma_bootstrap;
|
||||
drm_mga_dma_bootstrap_t dma_bootstrap;
|
||||
int err;
|
||||
|
||||
if (copy_from_user(&dma_bootstrap32, (void __user *)arg,
|
||||
sizeof(dma_bootstrap32)))
|
||||
return -EFAULT;
|
||||
|
||||
dma_bootstrap = compat_alloc_user_space(sizeof(*dma_bootstrap));
|
||||
if (!access_ok(VERIFY_WRITE, dma_bootstrap, sizeof(*dma_bootstrap))
|
||||
|| __put_user(dma_bootstrap32.texture_handle,
|
||||
&dma_bootstrap->texture_handle)
|
||||
|| __put_user(dma_bootstrap32.texture_size,
|
||||
&dma_bootstrap->texture_size)
|
||||
|| __put_user(dma_bootstrap32.primary_size,
|
||||
&dma_bootstrap->primary_size)
|
||||
|| __put_user(dma_bootstrap32.secondary_bin_count,
|
||||
&dma_bootstrap->secondary_bin_count)
|
||||
|| __put_user(dma_bootstrap32.secondary_bin_size,
|
||||
&dma_bootstrap->secondary_bin_size)
|
||||
|| __put_user(dma_bootstrap32.agp_mode, &dma_bootstrap->agp_mode)
|
||||
|| __put_user(dma_bootstrap32.agp_size, &dma_bootstrap->agp_size))
|
||||
return -EFAULT;
|
||||
dma_bootstrap.texture_handle = dma_bootstrap32.texture_handle;
|
||||
dma_bootstrap.texture_size = dma_bootstrap32.texture_size;
|
||||
dma_bootstrap.primary_size = dma_bootstrap32.primary_size;
|
||||
dma_bootstrap.secondary_bin_count = dma_bootstrap32.secondary_bin_count;
|
||||
dma_bootstrap.secondary_bin_size = dma_bootstrap32.secondary_bin_size;
|
||||
dma_bootstrap.agp_mode = dma_bootstrap32.agp_mode;
|
||||
dma_bootstrap.agp_size = dma_bootstrap32.agp_size;
|
||||
|
||||
err = drm_ioctl(file, DRM_IOCTL_MGA_DMA_BOOTSTRAP,
|
||||
(unsigned long)dma_bootstrap);
|
||||
err = drm_ioctl_kernel(file, mga_dma_bootstrap, &dma_bootstrap,
|
||||
DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
if (__get_user(dma_bootstrap32.texture_handle,
|
||||
&dma_bootstrap->texture_handle)
|
||||
|| __get_user(dma_bootstrap32.texture_size,
|
||||
&dma_bootstrap->texture_size)
|
||||
|| __get_user(dma_bootstrap32.primary_size,
|
||||
&dma_bootstrap->primary_size)
|
||||
|| __get_user(dma_bootstrap32.secondary_bin_count,
|
||||
&dma_bootstrap->secondary_bin_count)
|
||||
|| __get_user(dma_bootstrap32.secondary_bin_size,
|
||||
&dma_bootstrap->secondary_bin_size)
|
||||
|| __get_user(dma_bootstrap32.agp_mode, &dma_bootstrap->agp_mode)
|
||||
|| __get_user(dma_bootstrap32.agp_size, &dma_bootstrap->agp_size))
|
||||
return -EFAULT;
|
||||
|
||||
dma_bootstrap32.texture_handle = dma_bootstrap.texture_handle;
|
||||
dma_bootstrap32.texture_size = dma_bootstrap.texture_size;
|
||||
dma_bootstrap32.primary_size = dma_bootstrap.primary_size;
|
||||
dma_bootstrap32.secondary_bin_count = dma_bootstrap.secondary_bin_count;
|
||||
dma_bootstrap32.secondary_bin_size = dma_bootstrap.secondary_bin_size;
|
||||
dma_bootstrap32.agp_mode = dma_bootstrap.agp_mode;
|
||||
dma_bootstrap32.agp_size = dma_bootstrap.agp_size;
|
||||
if (copy_to_user((void __user *)arg, &dma_bootstrap32,
|
||||
sizeof(dma_bootstrap32)))
|
||||
return -EFAULT;
|
||||
@ -190,10 +149,14 @@ static int compat_mga_dma_bootstrap(struct file *file, unsigned int cmd,
|
||||
return 0;
|
||||
}
|
||||
|
||||
drm_ioctl_compat_t *mga_compat_ioctls[] = {
|
||||
[DRM_MGA_INIT] = compat_mga_init,
|
||||
[DRM_MGA_GETPARAM] = compat_mga_getparam,
|
||||
[DRM_MGA_DMA_BOOTSTRAP] = compat_mga_dma_bootstrap,
|
||||
static struct {
|
||||
drm_ioctl_compat_t *fn;
|
||||
char *name;
|
||||
} mga_compat_ioctls[] = {
|
||||
#define DRM_IOCTL32_DEF(n, f)[DRM_##n] = {.fn = f, .name = #n}
|
||||
DRM_IOCTL32_DEF(MGA_INIT, compat_mga_init),
|
||||
DRM_IOCTL32_DEF(MGA_GETPARAM, compat_mga_getparam),
|
||||
DRM_IOCTL32_DEF(MGA_DMA_BOOTSTRAP, compat_mga_dma_bootstrap),
|
||||
};
|
||||
|
||||
/**
|
||||
@ -208,19 +171,27 @@ drm_ioctl_compat_t *mga_compat_ioctls[] = {
|
||||
long mga_compat_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
|
||||
{
|
||||
unsigned int nr = DRM_IOCTL_NR(cmd);
|
||||
struct drm_file *file_priv = filp->private_data;
|
||||
drm_ioctl_compat_t *fn = NULL;
|
||||
int ret;
|
||||
|
||||
if (nr < DRM_COMMAND_BASE)
|
||||
return drm_compat_ioctl(filp, cmd, arg);
|
||||
|
||||
if (nr < DRM_COMMAND_BASE + ARRAY_SIZE(mga_compat_ioctls))
|
||||
fn = mga_compat_ioctls[nr - DRM_COMMAND_BASE];
|
||||
if (nr >= DRM_COMMAND_BASE + ARRAY_SIZE(mga_compat_ioctls))
|
||||
return drm_ioctl(filp, cmd, arg);
|
||||
|
||||
if (fn != NULL)
|
||||
ret = (*fn) (filp, cmd, arg);
|
||||
else
|
||||
ret = drm_ioctl(filp, cmd, arg);
|
||||
fn = mga_compat_ioctls[nr - DRM_COMMAND_BASE].fn;
|
||||
if (!fn)
|
||||
return drm_ioctl(filp, cmd, arg);
|
||||
|
||||
DRM_DEBUG("pid=%d, dev=0x%lx, auth=%d, %s\n",
|
||||
task_pid_nr(current),
|
||||
(long)old_encode_dev(file_priv->minor->kdev->devt),
|
||||
file_priv->authenticated,
|
||||
mga_compat_ioctls[nr - DRM_COMMAND_BASE].name);
|
||||
ret = (*fn) (filp, cmd, arg);
|
||||
if (ret)
|
||||
DRM_DEBUG("ret = %d\n", ret);
|
||||
return ret;
|
||||
}
|
||||
|
@ -1005,7 +1005,7 @@ static int mga_dma_blit(struct drm_device *dev, void *data, struct drm_file *fil
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int mga_getparam(struct drm_device *dev, void *data, struct drm_file *file_priv)
|
||||
int mga_getparam(struct drm_device *dev, void *data, struct drm_file *file_priv)
|
||||
{
|
||||
drm_mga_private_t *dev_priv = dev->dev_private;
|
||||
drm_mga_getparam_t *param = data;
|
||||
|
@ -105,7 +105,6 @@ radeon-y += \
|
||||
vce_v2_0.o \
|
||||
radeon_kfd.o
|
||||
|
||||
radeon-$(CONFIG_COMPAT) += radeon_ioc32.o
|
||||
radeon-$(CONFIG_VGA_SWITCHEROO) += radeon_atpx_handler.o
|
||||
radeon-$(CONFIG_ACPI) += radeon_acpi.o
|
||||
|
||||
|
@ -38,6 +38,7 @@
|
||||
#include <linux/module.h>
|
||||
#include <linux/pm_runtime.h>
|
||||
#include <linux/vga_switcheroo.h>
|
||||
#include <linux/compat.h>
|
||||
#include <drm/drm_gem.h>
|
||||
#include <drm/drm_fb_helper.h>
|
||||
|
||||
@ -154,8 +155,6 @@ void radeon_gem_prime_unpin(struct drm_gem_object *obj);
|
||||
struct reservation_object *radeon_gem_prime_res_obj(struct drm_gem_object *);
|
||||
void *radeon_gem_prime_vmap(struct drm_gem_object *obj);
|
||||
void radeon_gem_prime_vunmap(struct drm_gem_object *obj, void *vaddr);
|
||||
extern long radeon_kms_compat_ioctl(struct file *filp, unsigned int cmd,
|
||||
unsigned long arg);
|
||||
|
||||
/* atpx handler */
|
||||
#if defined(CONFIG_VGA_SWITCHEROO)
|
||||
@ -505,6 +504,21 @@ long radeon_drm_ioctl(struct file *filp,
|
||||
return ret;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_COMPAT
|
||||
static long radeon_kms_compat_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
|
||||
{
|
||||
unsigned int nr = DRM_IOCTL_NR(cmd);
|
||||
int ret;
|
||||
|
||||
if (nr < DRM_COMMAND_BASE)
|
||||
return drm_compat_ioctl(filp, cmd, arg);
|
||||
|
||||
ret = radeon_drm_ioctl(filp, cmd, arg);
|
||||
|
||||
return ret;
|
||||
}
|
||||
#endif
|
||||
|
||||
static const struct dev_pm_ops radeon_pm_ops = {
|
||||
.suspend = radeon_pmops_suspend,
|
||||
.resume = radeon_pmops_resume,
|
||||
|
@ -1,424 +0,0 @@
|
||||
/**
|
||||
* \file radeon_ioc32.c
|
||||
*
|
||||
* 32-bit ioctl compatibility routines for the Radeon DRM.
|
||||
*
|
||||
* \author Paul Mackerras <paulus@samba.org>
|
||||
*
|
||||
* Copyright (C) Paul Mackerras 2005
|
||||
* All Rights Reserved.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
* and/or sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice (including the next
|
||||
* paragraph) shall be included in all copies or substantial portions of the
|
||||
* Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
* THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
* IN THE SOFTWARE.
|
||||
*/
|
||||
#include <linux/compat.h>
|
||||
|
||||
#include <drm/drmP.h>
|
||||
#include <drm/radeon_drm.h>
|
||||
#include "radeon_drv.h"
|
||||
|
||||
typedef struct drm_radeon_init32 {
|
||||
int func;
|
||||
u32 sarea_priv_offset;
|
||||
int is_pci;
|
||||
int cp_mode;
|
||||
int gart_size;
|
||||
int ring_size;
|
||||
int usec_timeout;
|
||||
|
||||
unsigned int fb_bpp;
|
||||
unsigned int front_offset, front_pitch;
|
||||
unsigned int back_offset, back_pitch;
|
||||
unsigned int depth_bpp;
|
||||
unsigned int depth_offset, depth_pitch;
|
||||
|
||||
u32 fb_offset;
|
||||
u32 mmio_offset;
|
||||
u32 ring_offset;
|
||||
u32 ring_rptr_offset;
|
||||
u32 buffers_offset;
|
||||
u32 gart_textures_offset;
|
||||
} drm_radeon_init32_t;
|
||||
|
||||
static int compat_radeon_cp_init(struct file *file, unsigned int cmd,
|
||||
unsigned long arg)
|
||||
{
|
||||
drm_radeon_init32_t init32;
|
||||
drm_radeon_init_t __user *init;
|
||||
|
||||
if (copy_from_user(&init32, (void __user *)arg, sizeof(init32)))
|
||||
return -EFAULT;
|
||||
|
||||
init = compat_alloc_user_space(sizeof(*init));
|
||||
if (!access_ok(VERIFY_WRITE, init, sizeof(*init))
|
||||
|| __put_user(init32.func, &init->func)
|
||||
|| __put_user(init32.sarea_priv_offset, &init->sarea_priv_offset)
|
||||
|| __put_user(init32.is_pci, &init->is_pci)
|
||||
|| __put_user(init32.cp_mode, &init->cp_mode)
|
||||
|| __put_user(init32.gart_size, &init->gart_size)
|
||||
|| __put_user(init32.ring_size, &init->ring_size)
|
||||
|| __put_user(init32.usec_timeout, &init->usec_timeout)
|
||||
|| __put_user(init32.fb_bpp, &init->fb_bpp)
|
||||
|| __put_user(init32.front_offset, &init->front_offset)
|
||||
|| __put_user(init32.front_pitch, &init->front_pitch)
|
||||
|| __put_user(init32.back_offset, &init->back_offset)
|
||||
|| __put_user(init32.back_pitch, &init->back_pitch)
|
||||
|| __put_user(init32.depth_bpp, &init->depth_bpp)
|
||||
|| __put_user(init32.depth_offset, &init->depth_offset)
|
||||
|| __put_user(init32.depth_pitch, &init->depth_pitch)
|
||||
|| __put_user(init32.fb_offset, &init->fb_offset)
|
||||
|| __put_user(init32.mmio_offset, &init->mmio_offset)
|
||||
|| __put_user(init32.ring_offset, &init->ring_offset)
|
||||
|| __put_user(init32.ring_rptr_offset, &init->ring_rptr_offset)
|
||||
|| __put_user(init32.buffers_offset, &init->buffers_offset)
|
||||
|| __put_user(init32.gart_textures_offset,
|
||||
&init->gart_textures_offset))
|
||||
return -EFAULT;
|
||||
|
||||
return drm_ioctl(file, DRM_IOCTL_RADEON_CP_INIT, (unsigned long)init);
|
||||
}
|
||||
|
||||
typedef struct drm_radeon_clear32 {
|
||||
unsigned int flags;
|
||||
unsigned int clear_color;
|
||||
unsigned int clear_depth;
|
||||
unsigned int color_mask;
|
||||
unsigned int depth_mask; /* misnamed field: should be stencil */
|
||||
u32 depth_boxes;
|
||||
} drm_radeon_clear32_t;
|
||||
|
||||
static int compat_radeon_cp_clear(struct file *file, unsigned int cmd,
|
||||
unsigned long arg)
|
||||
{
|
||||
drm_radeon_clear32_t clr32;
|
||||
drm_radeon_clear_t __user *clr;
|
||||
|
||||
if (copy_from_user(&clr32, (void __user *)arg, sizeof(clr32)))
|
||||
return -EFAULT;
|
||||
|
||||
clr = compat_alloc_user_space(sizeof(*clr));
|
||||
if (!access_ok(VERIFY_WRITE, clr, sizeof(*clr))
|
||||
|| __put_user(clr32.flags, &clr->flags)
|
||||
|| __put_user(clr32.clear_color, &clr->clear_color)
|
||||
|| __put_user(clr32.clear_depth, &clr->clear_depth)
|
||||
|| __put_user(clr32.color_mask, &clr->color_mask)
|
||||
|| __put_user(clr32.depth_mask, &clr->depth_mask)
|
||||
|| __put_user((void __user *)(unsigned long)clr32.depth_boxes,
|
||||
&clr->depth_boxes))
|
||||
return -EFAULT;
|
||||
|
||||
return drm_ioctl(file, DRM_IOCTL_RADEON_CLEAR, (unsigned long)clr);
|
||||
}
|
||||
|
||||
typedef struct drm_radeon_stipple32 {
|
||||
u32 mask;
|
||||
} drm_radeon_stipple32_t;
|
||||
|
||||
static int compat_radeon_cp_stipple(struct file *file, unsigned int cmd,
|
||||
unsigned long arg)
|
||||
{
|
||||
drm_radeon_stipple32_t __user *argp = (void __user *)arg;
|
||||
drm_radeon_stipple_t __user *request;
|
||||
u32 mask;
|
||||
|
||||
if (get_user(mask, &argp->mask))
|
||||
return -EFAULT;
|
||||
|
||||
request = compat_alloc_user_space(sizeof(*request));
|
||||
if (!access_ok(VERIFY_WRITE, request, sizeof(*request))
|
||||
|| __put_user((unsigned int __user *)(unsigned long)mask,
|
||||
&request->mask))
|
||||
return -EFAULT;
|
||||
|
||||
return drm_ioctl(file, DRM_IOCTL_RADEON_STIPPLE, (unsigned long)request);
|
||||
}
|
||||
|
||||
typedef struct drm_radeon_tex_image32 {
|
||||
unsigned int x, y; /* Blit coordinates */
|
||||
unsigned int width, height;
|
||||
u32 data;
|
||||
} drm_radeon_tex_image32_t;
|
||||
|
||||
typedef struct drm_radeon_texture32 {
|
||||
unsigned int offset;
|
||||
int pitch;
|
||||
int format;
|
||||
int width; /* Texture image coordinates */
|
||||
int height;
|
||||
u32 image;
|
||||
} drm_radeon_texture32_t;
|
||||
|
||||
static int compat_radeon_cp_texture(struct file *file, unsigned int cmd,
|
||||
unsigned long arg)
|
||||
{
|
||||
drm_radeon_texture32_t req32;
|
||||
drm_radeon_texture_t __user *request;
|
||||
drm_radeon_tex_image32_t img32;
|
||||
drm_radeon_tex_image_t __user *image;
|
||||
|
||||
if (copy_from_user(&req32, (void __user *)arg, sizeof(req32)))
|
||||
return -EFAULT;
|
||||
if (req32.image == 0)
|
||||
return -EINVAL;
|
||||
if (copy_from_user(&img32, (void __user *)(unsigned long)req32.image,
|
||||
sizeof(img32)))
|
||||
return -EFAULT;
|
||||
|
||||
request = compat_alloc_user_space(sizeof(*request) + sizeof(*image));
|
||||
if (!access_ok(VERIFY_WRITE, request,
|
||||
sizeof(*request) + sizeof(*image)))
|
||||
return -EFAULT;
|
||||
image = (drm_radeon_tex_image_t __user *) (request + 1);
|
||||
|
||||
if (__put_user(req32.offset, &request->offset)
|
||||
|| __put_user(req32.pitch, &request->pitch)
|
||||
|| __put_user(req32.format, &request->format)
|
||||
|| __put_user(req32.width, &request->width)
|
||||
|| __put_user(req32.height, &request->height)
|
||||
|| __put_user(image, &request->image)
|
||||
|| __put_user(img32.x, &image->x)
|
||||
|| __put_user(img32.y, &image->y)
|
||||
|| __put_user(img32.width, &image->width)
|
||||
|| __put_user(img32.height, &image->height)
|
||||
|| __put_user((const void __user *)(unsigned long)img32.data,
|
||||
&image->data))
|
||||
return -EFAULT;
|
||||
|
||||
return drm_ioctl(file, DRM_IOCTL_RADEON_TEXTURE, (unsigned long)request);
|
||||
}
|
||||
|
||||
typedef struct drm_radeon_vertex2_32 {
|
||||
int idx; /* Index of vertex buffer */
|
||||
int discard; /* Client finished with buffer? */
|
||||
int nr_states;
|
||||
u32 state;
|
||||
int nr_prims;
|
||||
u32 prim;
|
||||
} drm_radeon_vertex2_32_t;
|
||||
|
||||
static int compat_radeon_cp_vertex2(struct file *file, unsigned int cmd,
|
||||
unsigned long arg)
|
||||
{
|
||||
drm_radeon_vertex2_32_t req32;
|
||||
drm_radeon_vertex2_t __user *request;
|
||||
|
||||
if (copy_from_user(&req32, (void __user *)arg, sizeof(req32)))
|
||||
return -EFAULT;
|
||||
|
||||
request = compat_alloc_user_space(sizeof(*request));
|
||||
if (!access_ok(VERIFY_WRITE, request, sizeof(*request))
|
||||
|| __put_user(req32.idx, &request->idx)
|
||||
|| __put_user(req32.discard, &request->discard)
|
||||
|| __put_user(req32.nr_states, &request->nr_states)
|
||||
|| __put_user((void __user *)(unsigned long)req32.state,
|
||||
&request->state)
|
||||
|| __put_user(req32.nr_prims, &request->nr_prims)
|
||||
|| __put_user((void __user *)(unsigned long)req32.prim,
|
||||
&request->prim))
|
||||
return -EFAULT;
|
||||
|
||||
return drm_ioctl(file, DRM_IOCTL_RADEON_VERTEX2, (unsigned long)request);
|
||||
}
|
||||
|
||||
typedef struct drm_radeon_cmd_buffer32 {
|
||||
int bufsz;
|
||||
u32 buf;
|
||||
int nbox;
|
||||
u32 boxes;
|
||||
} drm_radeon_cmd_buffer32_t;
|
||||
|
||||
static int compat_radeon_cp_cmdbuf(struct file *file, unsigned int cmd,
|
||||
unsigned long arg)
|
||||
{
|
||||
drm_radeon_cmd_buffer32_t req32;
|
||||
drm_radeon_cmd_buffer_t __user *request;
|
||||
|
||||
if (copy_from_user(&req32, (void __user *)arg, sizeof(req32)))
|
||||
return -EFAULT;
|
||||
|
||||
request = compat_alloc_user_space(sizeof(*request));
|
||||
if (!access_ok(VERIFY_WRITE, request, sizeof(*request))
|
||||
|| __put_user(req32.bufsz, &request->bufsz)
|
||||
|| __put_user((void __user *)(unsigned long)req32.buf,
|
||||
&request->buf)
|
||||
|| __put_user(req32.nbox, &request->nbox)
|
||||
|| __put_user((void __user *)(unsigned long)req32.boxes,
|
||||
&request->boxes))
|
||||
return -EFAULT;
|
||||
|
||||
return drm_ioctl(file, DRM_IOCTL_RADEON_CMDBUF, (unsigned long)request);
|
||||
}
|
||||
|
||||
typedef struct drm_radeon_getparam32 {
|
||||
int param;
|
||||
u32 value;
|
||||
} drm_radeon_getparam32_t;
|
||||
|
||||
static int compat_radeon_cp_getparam(struct file *file, unsigned int cmd,
|
||||
unsigned long arg)
|
||||
{
|
||||
drm_radeon_getparam32_t req32;
|
||||
drm_radeon_getparam_t __user *request;
|
||||
|
||||
if (copy_from_user(&req32, (void __user *)arg, sizeof(req32)))
|
||||
return -EFAULT;
|
||||
|
||||
request = compat_alloc_user_space(sizeof(*request));
|
||||
if (!access_ok(VERIFY_WRITE, request, sizeof(*request))
|
||||
|| __put_user(req32.param, &request->param)
|
||||
|| __put_user((void __user *)(unsigned long)req32.value,
|
||||
&request->value))
|
||||
return -EFAULT;
|
||||
|
||||
return drm_ioctl(file, DRM_IOCTL_RADEON_GETPARAM, (unsigned long)request);
|
||||
}
|
||||
|
||||
typedef struct drm_radeon_mem_alloc32 {
|
||||
int region;
|
||||
int alignment;
|
||||
int size;
|
||||
u32 region_offset; /* offset from start of fb or GART */
|
||||
} drm_radeon_mem_alloc32_t;
|
||||
|
||||
static int compat_radeon_mem_alloc(struct file *file, unsigned int cmd,
|
||||
unsigned long arg)
|
||||
{
|
||||
drm_radeon_mem_alloc32_t req32;
|
||||
drm_radeon_mem_alloc_t __user *request;
|
||||
|
||||
if (copy_from_user(&req32, (void __user *)arg, sizeof(req32)))
|
||||
return -EFAULT;
|
||||
|
||||
request = compat_alloc_user_space(sizeof(*request));
|
||||
if (!access_ok(VERIFY_WRITE, request, sizeof(*request))
|
||||
|| __put_user(req32.region, &request->region)
|
||||
|| __put_user(req32.alignment, &request->alignment)
|
||||
|| __put_user(req32.size, &request->size)
|
||||
|| __put_user((int __user *)(unsigned long)req32.region_offset,
|
||||
&request->region_offset))
|
||||
return -EFAULT;
|
||||
|
||||
return drm_ioctl(file, DRM_IOCTL_RADEON_ALLOC, (unsigned long)request);
|
||||
}
|
||||
|
||||
typedef struct drm_radeon_irq_emit32 {
|
||||
u32 irq_seq;
|
||||
} drm_radeon_irq_emit32_t;
|
||||
|
||||
static int compat_radeon_irq_emit(struct file *file, unsigned int cmd,
|
||||
unsigned long arg)
|
||||
{
|
||||
drm_radeon_irq_emit32_t req32;
|
||||
drm_radeon_irq_emit_t __user *request;
|
||||
|
||||
if (copy_from_user(&req32, (void __user *)arg, sizeof(req32)))
|
||||
return -EFAULT;
|
||||
|
||||
request = compat_alloc_user_space(sizeof(*request));
|
||||
if (!access_ok(VERIFY_WRITE, request, sizeof(*request))
|
||||
|| __put_user((int __user *)(unsigned long)req32.irq_seq,
|
||||
&request->irq_seq))
|
||||
return -EFAULT;
|
||||
|
||||
return drm_ioctl(file, DRM_IOCTL_RADEON_IRQ_EMIT, (unsigned long)request);
|
||||
}
|
||||
|
||||
/* The two 64-bit arches where alignof(u64)==4 in 32-bit code */
|
||||
#if defined (CONFIG_X86_64) || defined(CONFIG_IA64)
|
||||
typedef struct drm_radeon_setparam32 {
|
||||
int param;
|
||||
u64 value;
|
||||
} __attribute__((packed)) drm_radeon_setparam32_t;
|
||||
|
||||
static int compat_radeon_cp_setparam(struct file *file, unsigned int cmd,
|
||||
unsigned long arg)
|
||||
{
|
||||
drm_radeon_setparam32_t req32;
|
||||
drm_radeon_setparam_t __user *request;
|
||||
|
||||
if (copy_from_user(&req32, (void __user *) arg, sizeof(req32)))
|
||||
return -EFAULT;
|
||||
|
||||
request = compat_alloc_user_space(sizeof(*request));
|
||||
if (!access_ok(VERIFY_WRITE, request, sizeof(*request))
|
||||
|| __put_user(req32.param, &request->param)
|
||||
|| __put_user((void __user *)(unsigned long)req32.value,
|
||||
&request->value))
|
||||
return -EFAULT;
|
||||
|
||||
return drm_ioctl(file, DRM_IOCTL_RADEON_SETPARAM, (unsigned long) request);
|
||||
}
|
||||
#else
|
||||
#define compat_radeon_cp_setparam NULL
|
||||
#endif /* X86_64 || IA64 */
|
||||
|
||||
static drm_ioctl_compat_t *radeon_compat_ioctls[] = {
|
||||
[DRM_RADEON_CP_INIT] = compat_radeon_cp_init,
|
||||
[DRM_RADEON_CLEAR] = compat_radeon_cp_clear,
|
||||
[DRM_RADEON_STIPPLE] = compat_radeon_cp_stipple,
|
||||
[DRM_RADEON_TEXTURE] = compat_radeon_cp_texture,
|
||||
[DRM_RADEON_VERTEX2] = compat_radeon_cp_vertex2,
|
||||
[DRM_RADEON_CMDBUF] = compat_radeon_cp_cmdbuf,
|
||||
[DRM_RADEON_GETPARAM] = compat_radeon_cp_getparam,
|
||||
[DRM_RADEON_SETPARAM] = compat_radeon_cp_setparam,
|
||||
[DRM_RADEON_ALLOC] = compat_radeon_mem_alloc,
|
||||
[DRM_RADEON_IRQ_EMIT] = compat_radeon_irq_emit,
|
||||
};
|
||||
|
||||
/**
|
||||
* Called whenever a 32-bit process running under a 64-bit kernel
|
||||
* performs an ioctl on /dev/dri/card<n>.
|
||||
*
|
||||
* \param filp file pointer.
|
||||
* \param cmd command.
|
||||
* \param arg user argument.
|
||||
* \return zero on success or negative number on failure.
|
||||
*/
|
||||
long radeon_compat_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
|
||||
{
|
||||
unsigned int nr = DRM_IOCTL_NR(cmd);
|
||||
drm_ioctl_compat_t *fn = NULL;
|
||||
int ret;
|
||||
|
||||
if (nr < DRM_COMMAND_BASE)
|
||||
return drm_compat_ioctl(filp, cmd, arg);
|
||||
|
||||
if (nr < DRM_COMMAND_BASE + ARRAY_SIZE(radeon_compat_ioctls))
|
||||
fn = radeon_compat_ioctls[nr - DRM_COMMAND_BASE];
|
||||
|
||||
if (fn != NULL)
|
||||
ret = (*fn) (filp, cmd, arg);
|
||||
else
|
||||
ret = drm_ioctl(filp, cmd, arg);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
long radeon_kms_compat_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
|
||||
{
|
||||
unsigned int nr = DRM_IOCTL_NR(cmd);
|
||||
int ret;
|
||||
|
||||
if (nr < DRM_COMMAND_BASE)
|
||||
return drm_compat_ioctl(filp, cmd, arg);
|
||||
|
||||
ret = radeon_drm_ioctl(filp, cmd, arg);
|
||||
|
||||
return ret;
|
||||
}
|
@ -172,6 +172,7 @@ struct drm_ioctl_desc {
|
||||
|
||||
int drm_ioctl_permit(u32 flags, struct drm_file *file_priv);
|
||||
long drm_ioctl(struct file *filp, unsigned int cmd, unsigned long arg);
|
||||
long drm_ioctl_kernel(struct file *, drm_ioctl_t, void *, u32);
|
||||
#ifdef CONFIG_COMPAT
|
||||
long drm_compat_ioctl(struct file *filp, unsigned int cmd, unsigned long arg);
|
||||
#else
|
||||
|
Loading…
Reference in New Issue
Block a user