From owner-freebsd-x11@FreeBSD.ORG Tue Mar 18 11:09:26 2014 Return-Path: Delivered-To: freebsd-x11@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [8.8.178.115]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTPS id 232106C6 for ; Tue, 18 Mar 2014 11:09:26 +0000 (UTC) Received: from mail-wi0-x22a.google.com (mail-wi0-x22a.google.com [IPv6:2a00:1450:400c:c05::22a]) (using TLSv1 with cipher ECDHE-RSA-RC4-SHA (128/128 bits)) (No client certificate requested) by mx1.freebsd.org (Postfix) with ESMTPS id A6258E52 for ; Tue, 18 Mar 2014 11:09:25 +0000 (UTC) Received: by mail-wi0-f170.google.com with SMTP id bs8so2462998wib.1 for ; Tue, 18 Mar 2014 04:09:24 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=message-id:date:from:user-agent:mime-version:to:subject :content-type; bh=wq5li68PxxDOuoZObyTSPsvICK/Skrl1jdPTRodKcj8=; b=n2bPMJ4KtVVnODUnWa2mF5fV67KD6wkDPb1MQ/DYDaKWXbVzOewWzYhgOqVkoXiNOO pcBW8j8tLGp/cp3kOqHxx845JczJMRPI3HFO29AuwvHSUjNInOLJb4nlF6jKJeF1s9kc QPCE+eXmvQKpjcjNUHjiKl+fh4NmTYgdS3+wRPshU0rPB5y/73s1kSpw4uwYRLHdp9bQ L7NkSI3jfnuDPz0hWAfOPT7eOfARjzOZqLXFD+O6h1nV+66ew6OSToHq6BGaXD5yQBiy tJK4b/sXe+aLyZ+MeQjLzNQ0PdPkoSqUocvdVdV3RDY9A5xg5oNgGhwczqMY17KUJ19l MO0Q== X-Received: by 10.180.219.66 with SMTP id pm2mr13929401wic.60.1395140964019; Tue, 18 Mar 2014 04:09:24 -0700 (PDT) Received: from [192.168.178.100] (p5B36D4FC.dip0.t-ipconnect.de. [91.54.212.252]) by mx.google.com with ESMTPSA id ff9sm32978498wib.11.2014.03.18.04.09.22 for (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Tue, 18 Mar 2014 04:09:22 -0700 (PDT) Message-ID: <53282961.5010404@gmail.com> Date: Tue, 18 Mar 2014 12:09:21 +0100 From: =?ISO-8859-1?Q?Jan_Kokem=FCller?= User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:24.0) Gecko/20100101 Thunderbird/24.3.0 MIME-Version: 1.0 To: freebsd-x11@freebsd.org Subject: [PATCH] 32 bit compatibility ioctls for radeon driver Content-Type: multipart/mixed; boundary="------------000004090006040304010403" X-BeenThere: freebsd-x11@freebsd.org X-Mailman-Version: 2.1.17 Precedence: list List-Id: X11 on FreeBSD -- maintaining and support List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 18 Mar 2014 11:09:26 -0000 This is a multi-part message in MIME format. --------------000004090006040304010403 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Hi, I've noticed that the kernel currently pagefaults when trying to run 32-bit 3D applications under a 64-bit kernel with a Radeon card when COMPAT_FREEBSD32 is defined. The generic DRM code tries to access the compat_ioctls_nr and compat_ioctls fields of the drm_driver_info struct, but they aren't set by the radeon driver. I've tried to translate the compatibility ioctls in radeon_ioc32.c from the Linux versions to FreeBSD. It seems to work fine with 32-bit glxgears and some games under Wine. A patch is attached. --------------000004090006040304010403 Content-Type: text/x-patch; name="0001-radeon-add-32-bit-compatibility-ioctls.patch" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="0001-radeon-add-32-bit-compatibility-ioctls.patch" >From f14204dcd909eed4dcaaf5b5d7812ed89d4e75fe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Kokem=C3=BCller?= Date: Tue, 18 Mar 2014 11:36:59 +0100 Subject: [PATCH] radeon: add 32 bit compatibility ioctls --- sys/dev/drm2/radeon/radeon_drv.c | 9 + sys/dev/drm2/radeon/radeon_ioc32.c | 399 ++++++++++++------------------------ sys/modules/drm2/radeonkms/Makefile | 4 + 3 files changed, 148 insertions(+), 264 deletions(-) diff --git a/sys/dev/drm2/radeon/radeon_drv.c b/sys/dev/drm2/radeon/radeon_drv.c index 0cf96d2..ce29833 100644 --- a/sys/dev/drm2/radeon/radeon_drv.c +++ b/sys/dev/drm2/radeon/radeon_drv.c @@ -457,6 +457,11 @@ radeon_probe(device_t kdev) return drm_probe(kdev, pciidlist); } +#ifdef COMPAT_FREEBSD32 +extern drm_ioctl_desc_t radeon_compat_ioctls[]; +extern int radeon_compat_ioctls_nr; +#endif + static int radeon_attach(device_t kdev) { @@ -466,6 +471,10 @@ radeon_attach(device_t kdev) if (radeon_modeset == 1) { kms_driver.driver_features |= DRIVER_MODESET; kms_driver.max_ioctl = radeon_max_kms_ioctl; +#ifdef COMPAT_FREEBSD32 + kms_driver.compat_ioctls = radeon_compat_ioctls; + kms_driver.compat_ioctls_nr = &radeon_compat_ioctls_nr; +#endif radeon_register_atpx_handler(); } dev->driver = &kms_driver; diff --git a/sys/dev/drm2/radeon/radeon_ioc32.c b/sys/dev/drm2/radeon/radeon_ioc32.c index 361d48c..49b5cad 100644 --- a/sys/dev/drm2/radeon/radeon_ioc32.c +++ b/sys/dev/drm2/radeon/radeon_ioc32.c @@ -31,10 +31,13 @@ #include __FBSDID("$FreeBSD$"); -#include +#include "opt_compat.h" -#include -#include +#ifdef COMPAT_FREEBSD32 + +#include +#include +#include #include "radeon_drv.h" typedef struct drm_radeon_init32 { @@ -60,42 +63,34 @@ typedef struct drm_radeon_init32 { u32 gart_textures_offset; } drm_radeon_init32_t; -static int compat_radeon_cp_init(struct file *file, unsigned int cmd, - unsigned long arg) +static int compat_radeon_cp_init(struct drm_device *dev, void *data, struct drm_file *file_priv) { - 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); + drm_radeon_init32_t *req32 = data; + drm_radeon_init_t request; + + request.func = req32->func; + request.sarea_priv_offset = (unsigned long)req32->sarea_priv_offset; + request.is_pci = req32->is_pci; + request.cp_mode = req32->cp_mode; + request.gart_size = req32->gart_size; + request.ring_size = req32->ring_size; + request.usec_timeout = req32->usec_timeout; + request.fb_bpp = req32->fb_bpp; + request.front_offset = req32->front_offset; + request.front_pitch = req32->front_pitch; + request.back_offset = req32->back_offset; + request.back_pitch = req32->back_pitch; + request.depth_bpp = req32->depth_bpp; + request.depth_offset = req32->depth_offset; + request.depth_pitch = req32->depth_pitch; + request.fb_offset = (unsigned long)req32->fb_offset; + request.mmio_offset = (unsigned long)req32->mmio_offset; + request.ring_offset = (unsigned long)req32->ring_offset; + request.ring_rptr_offset = (unsigned long)req32->ring_rptr_offset; + request.buffers_offset = (unsigned long)req32->buffers_offset; + request.gart_textures_offset = (unsigned long)req32->gart_textures_offset; + + return radeon_cp_init(dev, (void *)&request, file_priv); } typedef struct drm_radeon_clear32 { @@ -107,50 +102,33 @@ typedef struct drm_radeon_clear32 { u32 depth_boxes; } drm_radeon_clear32_t; -static int compat_radeon_cp_clear(struct file *file, unsigned int cmd, - unsigned long arg) +static int compat_radeon_cp_clear(struct drm_device *dev, void *data, struct drm_file *file_priv) { - 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); + drm_radeon_clear32_t *req32 = data; + drm_radeon_clear_t request; + + request.flags = req32->flags; + request.clear_color = req32->clear_color; + request.clear_depth = req32->clear_depth; + request.color_mask = req32->color_mask; + request.depth_mask = req32->depth_mask; + request.depth_boxes = (void *)(unsigned long)req32->depth_boxes; + + return radeon_ioctls[DRM_IOCTL_RADEON_CLEAR].func(dev, (void *)&request, file_priv); } 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) +static int compat_radeon_cp_stipple(struct drm_device *dev, void *data, struct drm_file *file_priv) { - drm_radeon_stipple32_t __user *argp = (void __user *)arg; - drm_radeon_stipple_t __user *request; - u32 mask; + drm_radeon_stipple32_t *req32 = data; + drm_radeon_stipple_t request; - if (get_user(mask, &argp->mask)) - return -EFAULT; + request.mask = (void *)(unsigned long)req32->mask; - 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); + return radeon_ioctls[DRM_IOCTL_RADEON_STIPPLE].func(dev, (void *)&request, file_priv); } typedef struct drm_radeon_tex_image32 { @@ -168,43 +146,30 @@ typedef struct drm_radeon_texture32 { u32 image; } drm_radeon_texture32_t; -static int compat_radeon_cp_texture(struct file *file, unsigned int cmd, - unsigned long arg) +static int compat_radeon_cp_texture(struct drm_device *dev, void *data, struct drm_file *file_priv) { - 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) + drm_radeon_texture32_t *req32 = data; + drm_radeon_texture_t request; + drm_radeon_tex_image32_t *img32; + drm_radeon_tex_image_t image; + + 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); + + request.offset = req32->offset; + request.pitch = req32->pitch; + request.format = req32->format; + request.width = req32->width; + request.height = req32->height; + request.image = ℑ + img32 = (void *)(unsigned long)req32->image; + image.x = img32->x; + image.y = img32->y; + image.width = img32->width; + image.height = img32->height; + image.data = (void *)(unsigned long)img32->data; + + return radeon_ioctls[DRM_IOCTL_RADEON_TEXTURE].func(dev, (void *)&request, file_priv); } typedef struct drm_radeon_vertex2_32 { @@ -216,28 +181,19 @@ typedef struct drm_radeon_vertex2_32 { u32 prim; } drm_radeon_vertex2_32_t; -static int compat_radeon_cp_vertex2(struct file *file, unsigned int cmd, - unsigned long arg) +static int compat_radeon_cp_vertex2(struct drm_device *dev, void *data, struct drm_file *file_priv) { - 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); + drm_radeon_vertex2_32_t *req32 = data; + drm_radeon_vertex2_t request; + + request.idx = req32->idx; + request.discard = req32->discard; + request.nr_states = req32->nr_states; + request.state = (void *)(unsigned long)req32->state; + request.nr_prims = req32->nr_prims; + request.prim = (void *)(unsigned long)req32->prim; + + return radeon_ioctls[DRM_IOCTL_RADEON_VERTEX2].func(dev, (void *)&request, file_priv); } typedef struct drm_radeon_cmd_buffer32 { @@ -247,26 +203,17 @@ typedef struct drm_radeon_cmd_buffer32 { u32 boxes; } drm_radeon_cmd_buffer32_t; -static int compat_radeon_cp_cmdbuf(struct file *file, unsigned int cmd, - unsigned long arg) +static int compat_radeon_cp_cmdbuf(struct drm_device *dev, void *data, struct drm_file *file_priv) { - 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); + drm_radeon_cmd_buffer32_t *req32 = data; + drm_radeon_cmd_buffer_t request; + + request.bufsz = req32->bufsz; + request.buf = (void *)(unsigned long)req32->buf; + request.nbox = req32->nbox; + request.boxes = (void *)(unsigned long)req32->boxes; + + return radeon_ioctls[DRM_IOCTL_RADEON_CMDBUF].func(dev, (void *)&request, file_priv); } typedef struct drm_radeon_getparam32 { @@ -274,23 +221,15 @@ typedef struct drm_radeon_getparam32 { u32 value; } drm_radeon_getparam32_t; -static int compat_radeon_cp_getparam(struct file *file, unsigned int cmd, - unsigned long arg) +static int compat_radeon_cp_getparam(struct drm_device *dev, void *data, struct drm_file *file_priv) { - drm_radeon_getparam32_t req32; - drm_radeon_getparam_t __user *request; - - if (copy_from_user(&req32, (void __user *)arg, sizeof(req32))) - return -EFAULT; + drm_radeon_getparam32_t *req32 = data; + drm_radeon_getparam_t request; - 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; + request.param = req32->param; + request.value = (void *)(unsigned long)req32->value; - return drm_ioctl(file, DRM_IOCTL_RADEON_GETPARAM, (unsigned long)request); + return radeon_ioctls[DRM_IOCTL_RADEON_GETPARAM].func(dev, (void *)&request, file_priv); } typedef struct drm_radeon_mem_alloc32 { @@ -300,129 +239,61 @@ typedef struct drm_radeon_mem_alloc32 { 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) +static int compat_radeon_mem_alloc(struct drm_device *dev, void *data, struct drm_file *file_priv) { - 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); + drm_radeon_mem_alloc32_t *req32 = data; + drm_radeon_mem_alloc_t request; + + request.region = req32->region; + request.alignment = req32->alignment; + request.size = req32->size; + request.region_offset = (void *)(unsigned long)req32->region_offset; + + return radeon_mem_alloc(dev, (void *)&request, file_priv); } 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) +static int compat_radeon_irq_emit(struct drm_device *dev, void *data, struct drm_file *file_priv) { - drm_radeon_irq_emit32_t req32; - drm_radeon_irq_emit_t __user *request; + drm_radeon_irq_emit32_t *req32 = data; + drm_radeon_irq_emit_t request; - if (copy_from_user(&req32, (void __user *)arg, sizeof(req32))) - return -EFAULT; + request.irq_seq = (void *)(unsigned long)req32->irq_seq; - 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); + return radeon_irq_emit(dev, (void *)&request, file_priv); } -/* 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. - * - * \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) +static int compat_radeon_cp_setparam(struct drm_device *dev, void *data, struct drm_file *file_priv) { - 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); + drm_radeon_setparam32_t *req32 = data; + drm_radeon_setparam_t request; - if (nr < DRM_COMMAND_BASE + DRM_ARRAY_SIZE(radeon_compat_ioctls)) - fn = radeon_compat_ioctls[nr - DRM_COMMAND_BASE]; + request.param = req32->param; + request.value = req32->value; - if (fn != NULL) - ret = (*fn) (filp, cmd, arg); - else - ret = drm_ioctl(filp, cmd, arg); - - return ret; + return radeon_ioctls[DRM_IOCTL_RADEON_SETPARAM].func(dev, (void *)&request, file_priv); } -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 = drm_ioctl(filp, cmd, arg); +drm_ioctl_desc_t radeon_compat_ioctls[] = { + DRM_IOCTL_DEF(DRM_RADEON_CP_INIT, compat_radeon_cp_init, DRM_AUTH), + DRM_IOCTL_DEF(DRM_RADEON_CLEAR, compat_radeon_cp_clear, DRM_AUTH), + DRM_IOCTL_DEF(DRM_RADEON_STIPPLE, compat_radeon_cp_stipple, DRM_AUTH), + DRM_IOCTL_DEF(DRM_RADEON_TEXTURE, compat_radeon_cp_texture, DRM_AUTH), + DRM_IOCTL_DEF(DRM_RADEON_VERTEX2, compat_radeon_cp_vertex2, DRM_AUTH), + DRM_IOCTL_DEF(DRM_RADEON_CMDBUF, compat_radeon_cp_cmdbuf, DRM_AUTH), + DRM_IOCTL_DEF(DRM_RADEON_GETPARAM, compat_radeon_cp_getparam, DRM_AUTH), + DRM_IOCTL_DEF(DRM_RADEON_SETPARAM, compat_radeon_cp_setparam, DRM_AUTH), + DRM_IOCTL_DEF(DRM_RADEON_ALLOC, compat_radeon_mem_alloc, DRM_AUTH), + DRM_IOCTL_DEF(DRM_RADEON_IRQ_EMIT, compat_radeon_irq_emit, DRM_AUTH) +}; +int radeon_compat_ioctls_nr = DRM_ARRAY_SIZE(radeon_compat_ioctls); - return ret; -} +#endif diff --git a/sys/modules/drm2/radeonkms/Makefile b/sys/modules/drm2/radeonkms/Makefile index 3786a5e..4c7feb9 100644 --- a/sys/modules/drm2/radeonkms/Makefile +++ b/sys/modules/drm2/radeonkms/Makefile @@ -88,6 +88,10 @@ SRCS += \ si.c \ si_blit_shaders.c +.if ${MACHINE_CPUARCH} == "amd64" +SRCS += radeon_ioc32.c +.endif + #radeon_ioc32.c #radeon_prime.c #--radeon_trace_points.c -- 1.9.0 --------------000004090006040304010403--