Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/sys/external/bsd/drm2 Expose nvif ioctl interface.



details:   https://anonhg.NetBSD.org/src/rev/3c2c340cf0f5
branches:  trunk
changeset: 837788:3c2c340cf0f5
user:      maya <maya%NetBSD.org@localhost>
date:      Fri Dec 21 07:51:17 2018 +0000

description:
Expose nvif ioctl interface.

nvif is a variable length (nested..) ioctl, so it doesn't match the
usual drm_ioctl interface. linux uses a shim to override the ioctl
function for nouveau to allow this, do the same.

fixes 3D acceleration with nouveau.

from riastradh.

diffstat:

 sys/external/bsd/drm2/dist/drm/nouveau/nouveau_drm.c  |  37 +++++++++++++++++-
 sys/external/bsd/drm2/dist/drm/nouveau/nouveau_usif.c |  16 +++++++-
 sys/external/bsd/drm2/dist/drm/nouveau/nouveau_usif.h |   6 ++-
 sys/external/bsd/drm2/dist/include/drm/drmP.h         |   6 ++-
 sys/external/bsd/drm2/drm/drm_cdevsw.c                |  19 ++++++++-
 5 files changed, 74 insertions(+), 10 deletions(-)

diffs (231 lines):

diff -r 545ed393562d -r 3c2c340cf0f5 sys/external/bsd/drm2/dist/drm/nouveau/nouveau_drm.c
--- a/sys/external/bsd/drm2/dist/drm/nouveau/nouveau_drm.c      Fri Dec 21 07:13:30 2018 +0000
+++ b/sys/external/bsd/drm2/dist/drm/nouveau/nouveau_drm.c      Fri Dec 21 07:51:17 2018 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: nouveau_drm.c,v 1.15 2018/08/27 15:22:54 riastradh Exp $       */
+/*     $NetBSD: nouveau_drm.c,v 1.16 2018/12/21 07:51:17 maya Exp $    */
 
 /*
  * Copyright 2012 Red Hat Inc.
@@ -25,7 +25,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: nouveau_drm.c,v 1.15 2018/08/27 15:22:54 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: nouveau_drm.c,v 1.16 2018/12/21 07:51:17 maya Exp $");
 
 #include <linux/console.h>
 #include <linux/delay.h>
@@ -954,7 +954,35 @@
        DRM_IOCTL_DEF_DRV(NOUVEAU_GEM_INFO, nouveau_gem_ioctl_info, DRM_AUTH|DRM_RENDER_ALLOW),
 };
 
-#ifndef __NetBSD__             /* XXX nouveau pm */
+#ifdef __NetBSD__
+#include <sys/file.h>
+#include <sys/ioccom.h>
+static int                     /* XXX expose to ioc32 */
+nouveau_ioctl_override(struct file *fp, unsigned long cmd, void *data)
+{
+       struct drm_file *file = fp->f_data;
+       struct drm_device *dev = file->minor->dev;
+       int ret;
+
+       ret = pm_runtime_get_sync(dev->dev);
+       if (ret < 0 && ret != -EACCES)
+               return ret;
+
+       switch (DRM_IOCTL_NR(cmd) - DRM_COMMAND_BASE) {
+       case DRM_NOUVEAU_NVIF:
+               /* XXX errno NetBSD->Linux */
+               ret = -usif_ioctl(file, data, IOCPARM_LEN(cmd));
+               break;
+       default:
+               ret = drm_ioctl(fp, cmd, data);
+               break;
+       }
+
+       pm_runtime_mark_last_busy(dev->dev);
+       pm_runtime_put_autosuspend(dev->dev);
+       return ret;
+}
+#else
 long
 nouveau_drm_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
 {
@@ -979,7 +1007,9 @@
        pm_runtime_put_autosuspend(dev->dev);
        return ret;
 }
+#endif
 
+#ifndef __NetBSD__
 static const struct file_operations
 nouveau_driver_fops = {
        .owner = THIS_MODULE,
@@ -1026,6 +1056,7 @@
        .fops = NULL,
        .mmap_object = &nouveau_ttm_mmap_object,
        .gem_uvm_ops = &nouveau_gem_uvm_ops,
+       .ioctl_override = nouveau_ioctl_override,
 #else
        .fops = &nouveau_driver_fops,
 #endif
diff -r 545ed393562d -r 3c2c340cf0f5 sys/external/bsd/drm2/dist/drm/nouveau/nouveau_usif.c
--- a/sys/external/bsd/drm2/dist/drm/nouveau/nouveau_usif.c     Fri Dec 21 07:13:30 2018 +0000
+++ b/sys/external/bsd/drm2/dist/drm/nouveau/nouveau_usif.c     Fri Dec 21 07:51:17 2018 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: nouveau_usif.c,v 1.5 2018/08/27 07:43:16 riastradh Exp $       */
+/*     $NetBSD: nouveau_usif.c,v 1.6 2018/12/21 07:51:17 maya Exp $    */
 
 /*
  * Copyright 2014 Red Hat Inc.
@@ -25,7 +25,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: nouveau_usif.c,v 1.5 2018/08/27 07:43:16 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: nouveau_usif.c,v 1.6 2018/12/21 07:51:17 maya Exp $");
 
 #include "nouveau_drm.h"
 #include "nouveau_usif.h"
@@ -305,11 +305,17 @@
 }
 
 int
+#ifdef __NetBSD__
+usif_ioctl(struct drm_file *filp, void *data, u32 argc)
+#else
 usif_ioctl(struct drm_file *filp, void __user *user, u32 argc)
+#endif
 {
        struct nouveau_cli *cli = nouveau_cli(filp);
        struct nvif_client *client = &cli->base;
+#ifndef __NetBSD__
        void *data = kmalloc(argc, GFP_KERNEL);
+#endif
        u32   size = argc;
        union {
                struct nvif_ioctl_v0 v0;
@@ -318,10 +324,12 @@
        u8 owner;
        int ret;
 
+#ifndef __NetBSD__
        if (ret = -ENOMEM, !argv)
                goto done;
        if (ret = -EFAULT, copy_from_user(argv, user, size))
                goto done;
+#endif
 
        if (nvif_unpack(argv->v0, 0, 0, true)) {
                /* block access to objects not created via this interface */
@@ -385,10 +393,14 @@
        argv->v0.owner = owner;
        mutex_unlock(&cli->mutex);
 
+#ifndef __NetBSD__
        if (copy_to_user(user, argv, argc))
                ret = -EFAULT;
+#endif
 done:
+#ifndef __NetBSD__
        kfree(argv);
+#endif
        return ret;
 }
 
diff -r 545ed393562d -r 3c2c340cf0f5 sys/external/bsd/drm2/dist/drm/nouveau/nouveau_usif.h
--- a/sys/external/bsd/drm2/dist/drm/nouveau/nouveau_usif.h     Fri Dec 21 07:13:30 2018 +0000
+++ b/sys/external/bsd/drm2/dist/drm/nouveau/nouveau_usif.h     Fri Dec 21 07:51:17 2018 +0000
@@ -1,11 +1,15 @@
-/*     $NetBSD: nouveau_usif.h,v 1.2 2018/08/27 04:58:24 riastradh Exp $       */
+/*     $NetBSD: nouveau_usif.h,v 1.3 2018/12/21 07:51:17 maya Exp $    */
 
 #ifndef __NOUVEAU_USIF_H__
 #define __NOUVEAU_USIF_H__
 
 void usif_client_init(struct nouveau_cli *);
 void usif_client_fini(struct nouveau_cli *);
+#ifdef __NetBSD__
+int  usif_ioctl(struct drm_file *, void *, u32);
+#else
 int  usif_ioctl(struct drm_file *, void __user *, u32);
+#endif
 int  usif_notify(const void *, u32, const void *, u32);
 
 #endif
diff -r 545ed393562d -r 3c2c340cf0f5 sys/external/bsd/drm2/dist/include/drm/drmP.h
--- a/sys/external/bsd/drm2/dist/include/drm/drmP.h     Fri Dec 21 07:13:30 2018 +0000
+++ b/sys/external/bsd/drm2/dist/include/drm/drmP.h     Fri Dec 21 07:51:17 2018 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: drmP.h,v 1.34 2018/08/28 03:41:39 riastradh Exp $      */
+/*     $NetBSD: drmP.h,v 1.35 2018/12/21 07:51:18 maya Exp $   */
 
 /*
  * Internal Header for the Direct Rendering Manager
@@ -710,6 +710,10 @@
        int num_ioctls;
        const struct file_operations *fops;
 
+#ifdef __NetBSD__
+       int (*ioctl_override)(struct file *, unsigned long, void *);
+#endif
+
        /* List of devices hanging off this driver with stealth attach. */
        struct list_head legacy_dev_list;
 };
diff -r 545ed393562d -r 3c2c340cf0f5 sys/external/bsd/drm2/drm/drm_cdevsw.c
--- a/sys/external/bsd/drm2/drm/drm_cdevsw.c    Fri Dec 21 07:13:30 2018 +0000
+++ b/sys/external/bsd/drm2/drm/drm_cdevsw.c    Fri Dec 21 07:51:17 2018 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: drm_cdevsw.c,v 1.12 2018/08/28 03:41:39 riastradh Exp $        */
+/*     $NetBSD: drm_cdevsw.c,v 1.13 2018/12/21 07:51:18 maya Exp $     */
 
 /*-
  * Copyright (c) 2013 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: drm_cdevsw.c,v 1.12 2018/08/28 03:41:39 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: drm_cdevsw.c,v 1.13 2018/12/21 07:51:18 maya Exp $");
 
 #include <sys/param.h>
 #include <sys/types.h>
@@ -70,6 +70,7 @@
                    int);
 static int     drm_dequeue_event(struct drm_file *, size_t,
                    struct drm_pending_event **, int);
+static int     drm_ioctl_shim(struct file *, unsigned long, void *);
 static int     drm_poll(struct file *, int);
 static int     drm_kqfilter(struct file *, struct knote *);
 static int     drm_stat(struct file *, struct stat *);
@@ -98,7 +99,7 @@
        .fo_name = "drm",
        .fo_read = drm_read,
        .fo_write = fbadop_write,
-       .fo_ioctl = drm_ioctl,
+       .fo_ioctl = drm_ioctl_shim,
        .fo_fcntl = fnullop_fcntl,
        .fo_poll = drm_poll,
        .fo_stat = drm_stat,
@@ -340,6 +341,18 @@
 }
 
 static int
+drm_ioctl_shim(struct file *fp, unsigned long cmd, void *data)
+{
+       struct drm_file *file = fp->f_data;
+       struct drm_driver *driver = file->minor->dev->driver;
+
+       if (driver->ioctl_override)
+               return driver->ioctl_override(fp, cmd, data);
+       else
+               return drm_ioctl(fp, cmd, data);
+}
+
+static int
 drm_poll(struct file *fp __unused, int events __unused)
 {
        struct drm_file *const file = fp->f_data;



Home | Main Index | Thread Index | Old Index