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 Move drm_ioctl to drm_ioctl.c.



details:   https://anonhg.NetBSD.org/src/rev/3e868aecc5f3
branches:  trunk
changeset: 365812:3e868aecc5f3
user:      riastradh <riastradh%NetBSD.org@localhost>
date:      Mon Aug 27 06:50:58 2018 +0000

description:
Move drm_ioctl to drm_ioctl.c.

Previously it was in drm_drv.c upstream, which we overrode; then it
got moved to drm_ioctl.c and drm_drv.c got deleted, so we no longer
need to maintain a separate copy of the table in what we now call
drm_cdevsw.c.

diffstat:

 sys/external/bsd/drm2/dist/drm/drm_ioctl.c    |  184 +++++++++++++-
 sys/external/bsd/drm2/dist/include/drm/drmP.h |    8 +-
 sys/external/bsd/drm2/drm/drm_cdevsw.c        |  354 +-------------------------
 sys/external/bsd/drm2/drm/files.drmkms        |    3 +-
 4 files changed, 191 insertions(+), 358 deletions(-)

diffs (truncated from 673 to 300 lines):

diff -r 5de37438857b -r 3e868aecc5f3 sys/external/bsd/drm2/dist/drm/drm_ioctl.c
--- a/sys/external/bsd/drm2/dist/drm/drm_ioctl.c        Mon Aug 27 06:50:45 2018 +0000
+++ b/sys/external/bsd/drm2/dist/drm/drm_ioctl.c        Mon Aug 27 06:50:58 2018 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: drm_ioctl.c,v 1.5 2018/08/27 04:58:19 riastradh Exp $  */
+/*     $NetBSD: drm_ioctl.c,v 1.6 2018/08/27 06:50:58 riastradh Exp $  */
 
 /*
  * Created: Fri Jan  8 09:01:26 1999 by faith%valinux.com@localhost
@@ -31,7 +31,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: drm_ioctl.c,v 1.5 2018/08/27 04:58:19 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: drm_ioctl.c,v 1.6 2018/08/27 06:50:58 riastradh Exp $");
 
 #include <drm/drmP.h>
 #include <drm/drm_core.h>
@@ -45,6 +45,27 @@
 static int drm_version(struct drm_device *dev, void *data,
                       struct drm_file *file_priv);
 
+#if IS_ENABLED(CONFIG_AGP)
+/* XXX Kludge for AGP.  */
+static drm_ioctl_t     drm_agp_acquire_hook_ioctl;
+static drm_ioctl_t     drm_agp_release_hook_ioctl;
+static drm_ioctl_t     drm_agp_enable_hook_ioctl;
+static drm_ioctl_t     drm_agp_info_hook_ioctl;
+static drm_ioctl_t     drm_agp_alloc_hook_ioctl;
+static drm_ioctl_t     drm_agp_free_hook_ioctl;
+static drm_ioctl_t     drm_agp_bind_hook_ioctl;
+static drm_ioctl_t     drm_agp_unbind_hook_ioctl;
+
+#define        drm_agp_acquire_ioctl   drm_agp_acquire_hook_ioctl
+#define        drm_agp_release_ioctl   drm_agp_release_hook_ioctl
+#define        drm_agp_enable_ioctl    drm_agp_enable_hook_ioctl
+#define        drm_agp_info_ioctl      drm_agp_info_hook_ioctl
+#define        drm_agp_alloc_ioctl     drm_agp_alloc_hook_ioctl
+#define        drm_agp_free_ioctl      drm_agp_free_hook_ioctl
+#define        drm_agp_bind_ioctl      drm_agp_bind_hook_ioctl
+#define        drm_agp_unbind_ioctl    drm_agp_unbind_hook_ioctl
+#endif
+
 /*
  * Get the bus id.
  *
@@ -526,7 +547,11 @@
 int drm_ioctl_permit(u32 flags, struct drm_file *file_priv)
 {
        /* ROOT_ONLY is only for CAP_SYS_ADMIN */
+#ifdef __NetBSD__
+       if (unlikely((flags & DRM_ROOT_ONLY) && !DRM_SUSER()))
+#else
        if (unlikely((flags & DRM_ROOT_ONLY) && !capable(CAP_SYS_ADMIN)))
+#endif
                return -EACCES;
 
        /* AUTH is only for authenticated or render client */
@@ -689,6 +714,71 @@
  * Returns:
  * Zero on success, negative error code on failure.
  */
+#ifdef __NetBSD__
+#include <sys/file.h>
+int
+drm_ioctl(struct file *fp, unsigned long cmd, void *data)
+{
+       struct drm_file *const file = fp->f_data;
+       const unsigned int nr = DRM_IOCTL_NR(cmd);
+       int error;
+
+       switch (cmd) {
+       case FIONBIO:
+       case FIOASYNC:
+               return 0;
+       default:
+               break;
+       }
+
+       if (IOCGROUP(cmd) != DRM_IOCTL_BASE)
+               return EINVAL;
+
+       KASSERT(file != NULL);
+       KASSERT(file->minor != NULL);
+       KASSERT(file->minor->dev != NULL);
+       struct drm_device *const dev = file->minor->dev;
+       const struct drm_ioctl_desc *ioctl;
+
+       if (drm_device_is_unplugged(dev))
+               return ENXIO;
+
+       const bool is_driver_ioctl =
+           (DRM_COMMAND_BASE <= nr) && (nr < DRM_COMMAND_END);
+
+       if (is_driver_ioctl) {
+               const unsigned int driver_nr = nr - DRM_COMMAND_BASE;
+               if (driver_nr >= dev->driver->num_ioctls)
+                       return EINVAL;
+               ioctl = &dev->driver->ioctls[driver_nr];
+       } else if (nr < __arraycount(drm_ioctls)) {
+               ioctl = &drm_ioctls[nr];
+       } else {
+               ioctl = NULL;
+       }
+
+       if ((ioctl == NULL) || (ioctl->func == NULL))
+               return EINVAL;
+
+       /* XXX errno Linux->NetBSD */
+       error = -drm_ioctl_permit(ioctl->flags, file);
+       if (error)
+               return error;
+
+       if ((drm_core_check_feature(dev, DRIVER_MODESET) && is_driver_ioctl) ||
+           ISSET(ioctl->flags, DRM_UNLOCKED)) {
+               /* XXX errno Linux->NetBSD */
+               error = -(*ioctl->func)(dev, data, file);
+       } else {
+               mutex_lock(&drm_global_mutex);
+               /* XXX errno Linux->NetBSD */
+               error = -(*ioctl->func)(dev, data, file);
+               mutex_unlock(&drm_global_mutex);
+       }
+
+       return error;
+}
+#else
 long drm_ioctl(struct file *filp,
              unsigned int cmd, unsigned long arg)
 {
@@ -799,6 +889,7 @@
                DRM_DEBUG("ret = %d\n", retcode);
        return retcode;
 }
+#endif
 EXPORT_SYMBOL(drm_ioctl);
 
 /**
@@ -825,3 +916,92 @@
        return true;
 }
 EXPORT_SYMBOL(drm_ioctl_flags);
+
+/* XXX Kludge to allow agp to be implemented in another kernel module.  */
+#ifdef __NetBSD__
+
+#include <sys/atomic.h>
+
+static const struct drm_agp_hooks *volatile drm_current_agp_hooks;
+
+int
+drm_agp_register(const struct drm_agp_hooks *hooks)
+{
+
+       membar_producer();
+       if (atomic_cas_ptr(&drm_current_agp_hooks, NULL, __UNCONST(hooks))
+           != NULL)
+               return EBUSY;
+
+       return 0;
+}
+
+void
+drm_agp_deregister(const struct drm_agp_hooks *hooks)
+{
+
+       if (atomic_cas_ptr(&drm_current_agp_hooks, __UNCONST(hooks), NULL)
+           != hooks)
+               panic("%s: wrong hooks: %p != %p", __func__,
+                   hooks, drm_current_agp_hooks);
+}
+
+static void __dead
+drm_noagp_panic(struct drm_device *dev)
+{
+       if ((dev != NULL) &&
+           (dev->control != NULL) &&
+           (dev->control->kdev != NULL))
+               panic("%s: no agp loaded", device_xname(dev->control->kdev));
+       else
+               panic("drm_device %p: no agp loaded", dev);
+}
+
+int
+drm_agp_release_hook(struct drm_device *dev)
+{
+       const struct drm_agp_hooks *const hooks = drm_current_agp_hooks;
+
+       if (hooks == NULL)
+               drm_noagp_panic(dev);
+       membar_consumer();
+       return (*hooks->agph_release)(dev);
+}
+
+void
+drm_agp_clear_hook(struct drm_device *dev)
+{
+       const struct drm_agp_hooks *const hooks = drm_current_agp_hooks;
+
+       if (hooks == NULL)
+               drm_noagp_panic(dev);
+       membar_consumer();
+       (*hooks->agph_clear)(dev);
+}
+
+#if IS_ENABLED(CONFIG_AGP)
+
+#define        DEFINE_AGP_HOOK_IOCTL(NAME, HOOK)                                     \
+static int                                                                   \
+NAME(struct drm_device *dev, void *data, struct drm_file *file)                      \
+{                                                                            \
+       const struct drm_agp_hooks *const hooks = drm_current_agp_hooks;      \
+                                                                             \
+       if (hooks == NULL)                                                    \
+               return -ENODEV;                                               \
+       membar_consumer();                                                    \
+       return (*hooks->HOOK)(dev, data, file);                               \
+}
+
+DEFINE_AGP_HOOK_IOCTL(drm_agp_acquire_hook_ioctl, agph_acquire_ioctl)
+DEFINE_AGP_HOOK_IOCTL(drm_agp_release_hook_ioctl, agph_release_ioctl)
+DEFINE_AGP_HOOK_IOCTL(drm_agp_enable_hook_ioctl, agph_enable_ioctl)
+DEFINE_AGP_HOOK_IOCTL(drm_agp_info_hook_ioctl, agph_info_ioctl)
+DEFINE_AGP_HOOK_IOCTL(drm_agp_alloc_hook_ioctl, agph_alloc_ioctl)
+DEFINE_AGP_HOOK_IOCTL(drm_agp_free_hook_ioctl, agph_free_ioctl)
+DEFINE_AGP_HOOK_IOCTL(drm_agp_bind_hook_ioctl, agph_bind_ioctl)
+DEFINE_AGP_HOOK_IOCTL(drm_agp_unbind_hook_ioctl, agph_unbind_ioctl)
+
+#endif
+
+#endif
diff -r 5de37438857b -r 3e868aecc5f3 sys/external/bsd/drm2/dist/include/drm/drmP.h
--- a/sys/external/bsd/drm2/dist/include/drm/drmP.h     Mon Aug 27 06:50:45 2018 +0000
+++ b/sys/external/bsd/drm2/dist/include/drm/drmP.h     Mon Aug 27 06:50:58 2018 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: drmP.h,v 1.19 2018/08/27 06:43:24 riastradh Exp $      */
+/*     $NetBSD: drmP.h,v 1.20 2018/08/27 06:50:58 riastradh Exp $      */
 
 /*
  * Internal Header for the Direct Rendering Manager
@@ -983,14 +983,16 @@
 /*@{*/
 
                                /* Driver support (drm_drv.h) */
-#ifndef __NetBSD__
 extern int drm_ioctl_permit(u32 flags, struct drm_file *file_priv);
+#ifdef __NetBSD__
+extern int drm_ioctl(struct file *, unsigned long, void *);
+#else
 extern long drm_ioctl(struct file *filp,
                      unsigned int cmd, unsigned long arg);
 extern long drm_compat_ioctl(struct file *filp,
                             unsigned int cmd, unsigned long arg);
+#endif
 extern bool drm_ioctl_flags(unsigned int nr, unsigned int *flags);
-#endif
 
                                /* Device support (drm_fops.h) */
 #ifdef __NetBSD__
diff -r 5de37438857b -r 3e868aecc5f3 sys/external/bsd/drm2/drm/drm_cdevsw.c
--- a/sys/external/bsd/drm2/drm/drm_cdevsw.c    Mon Aug 27 06:50:45 2018 +0000
+++ b/sys/external/bsd/drm2/drm/drm_cdevsw.c    Mon Aug 27 06:50:58 2018 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: drm_cdevsw.c,v 1.3 2018/08/27 06:49:01 riastradh Exp $ */
+/*     $NetBSD: drm_cdevsw.c,v 1.4 2018/08/27 06:50:58 riastradh 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.3 2018/08/27 06:49:01 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: drm_cdevsw.c,v 1.4 2018/08/27 06:50:58 riastradh Exp $");
 
 #include <sys/param.h>
 #include <sys/types.h>
@@ -72,155 +72,10 @@
 static int     drm_poll(struct file *, int);
 static int     drm_kqfilter(struct file *, struct knote *);
 static int     drm_stat(struct file *, struct stat *);
-static int     drm_ioctl(struct file *, unsigned long, void *);
 static int     drm_fop_mmap(struct file *, off_t *, size_t, int, int *, int *,
                             struct uvm_object **, int *);
-static int     drm_version_string(char *, size_t *, const char *);
 static paddr_t drm_mmap(dev_t, off_t, int);
 
-static drm_ioctl_t     drm_version;
-
-#define        DRM_IOCTL_DEF(IOCTL, FUNC, FLAGS)                               \
-       [DRM_IOCTL_NR(IOCTL)] = {                                       \
-               .cmd = (IOCTL),                                         \
-               .flags = (FLAGS),                                       \
-               .func = (FUNC),                                         \
-               .name = #IOCTL,                                         \
-       }
-
-#if __OS_HAS_AGP
-/* XXX Kludge for AGP.  */
-static drm_ioctl_t     drm_agp_acquire_hook_ioctl;



Home | Main Index | Thread Index | Old Index