Module Name:    src
Committed By:   riastradh
Date:           Tue Mar  4 20:45:17 UTC 2014

Modified Files:
        src/sys/conf [riastradh-drm2]: files majors
        src/sys/dev/pci [riastradh-drm2]: files.pci
        src/sys/external/bsd/drm2/dist/include/drm [riastradh-drm2]: drmP.h
        src/sys/external/bsd/drm2/drm [riastradh-drm2]: drm_drv.c drm_fops.c
            drm_module.c drm_vm.c
        src/sys/external/bsd/drm2/i915drm [riastradh-drm2]: i915_module.c
        src/sys/external/bsd/drm2/include/drm [riastradh-drm2]: drm_os_netbsd.h
        src/sys/external/bsd/drm2/linux [riastradh-drm2]: linux_work.c
        src/sys/external/bsd/drm2/pci [riastradh-drm2]: drm_pci_module.c
Added Files:
        src/sys/external/bsd/drm2/drm [riastradh-drm2]: files.drmkms
        src/sys/external/bsd/drm2/i915drm [riastradh-drm2]: files.i915drmkms
        src/sys/external/bsd/drm2/linux [riastradh-drm2]: files.drmkms_linux
            linux_module.c
        src/sys/external/bsd/drm2/pci [riastradh-drm2]: files.drmkms_pci
        src/sys/modules/drmkms [riastradh-drm2]: Makefile Makefile.inc
            drmkms.ioconf
        src/sys/modules/drmkms_linux [riastradh-drm2]: Makefile
        src/sys/modules/drmkms_pci [riastradh-drm2]: Makefile
        src/sys/modules/i915drmkms [riastradh-drm2]: Makefile i915drmkms.ioconf
Removed Files:
        src/sys/external/bsd/drm2/conf [riastradh-drm2]: files.drm2

Log Message:
Rework drm2 configuration and modularization.

- Split drm2.kmod into drmkms_linux, drmkms, drmkms_pci.
- Split up drmkms-related files.* similarly.
- Make drm_agp_* routines hooks that the drmkms_pci module installs.
- Reuse drm device major 180 for (old) drm and drmkms.

Now old drm and new drmkms can coexist happily in the same tree, with
or without PCI, and require no changes to userland.


To generate a diff of this commit:
cvs rdiff -u -r1.1077.2.3 -r1.1077.2.4 src/sys/conf/files
cvs rdiff -u -r1.66.6.1 -r1.66.6.2 src/sys/conf/majors
cvs rdiff -u -r1.364.6.2 -r1.364.6.3 src/sys/dev/pci/files.pci
cvs rdiff -u -r1.1.2.7 -r0 src/sys/external/bsd/drm2/conf/files.drm2
cvs rdiff -u -r1.1.1.1.2.56 -r1.1.1.1.2.57 \
    src/sys/external/bsd/drm2/dist/include/drm/drmP.h
cvs rdiff -u -r1.1.2.35 -r1.1.2.36 src/sys/external/bsd/drm2/drm/drm_drv.c
cvs rdiff -u -r1.1.2.8 -r1.1.2.9 src/sys/external/bsd/drm2/drm/drm_fops.c
cvs rdiff -u -r1.1.2.9 -r1.1.2.10 src/sys/external/bsd/drm2/drm/drm_module.c
cvs rdiff -u -r1.1.2.5 -r1.1.2.6 src/sys/external/bsd/drm2/drm/drm_vm.c
cvs rdiff -u -r0 -r1.1.2.1 src/sys/external/bsd/drm2/drm/files.drmkms
cvs rdiff -u -r0 -r1.1.2.1 src/sys/external/bsd/drm2/i915drm/files.i915drmkms
cvs rdiff -u -r1.1.2.8 -r1.1.2.9 \
    src/sys/external/bsd/drm2/i915drm/i915_module.c
cvs rdiff -u -r1.1.2.6 -r1.1.2.7 \
    src/sys/external/bsd/drm2/include/drm/drm_os_netbsd.h
cvs rdiff -u -r0 -r1.1.2.1 src/sys/external/bsd/drm2/linux/files.drmkms_linux \
    src/sys/external/bsd/drm2/linux/linux_module.c
cvs rdiff -u -r1.1.2.9 -r1.1.2.10 \
    src/sys/external/bsd/drm2/linux/linux_work.c
cvs rdiff -u -r1.1.2.1 -r1.1.2.2 \
    src/sys/external/bsd/drm2/pci/drm_pci_module.c
cvs rdiff -u -r0 -r1.1.2.1 src/sys/external/bsd/drm2/pci/files.drmkms_pci
cvs rdiff -u -r0 -r1.1.2.1 src/sys/modules/drmkms/Makefile \
    src/sys/modules/drmkms/Makefile.inc src/sys/modules/drmkms/drmkms.ioconf
cvs rdiff -u -r0 -r1.1.2.1 src/sys/modules/drmkms_linux/Makefile
cvs rdiff -u -r0 -r1.1.2.1 src/sys/modules/drmkms_pci/Makefile
cvs rdiff -u -r0 -r1.1.2.1 src/sys/modules/i915drmkms/Makefile \
    src/sys/modules/i915drmkms/i915drmkms.ioconf

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/conf/files
diff -u src/sys/conf/files:1.1077.2.3 src/sys/conf/files:1.1077.2.4
--- src/sys/conf/files:1.1077.2.3	Wed Jan 29 19:47:38 2014
+++ src/sys/conf/files	Tue Mar  4 20:45:16 2014
@@ -1,4 +1,4 @@
-#	$NetBSD: files,v 1.1077.2.3 2014/01/29 19:47:38 riastradh Exp $
+#	$NetBSD: files,v 1.1077.2.4 2014/03/04 20:45:16 riastradh Exp $
 #	@(#)files.newconf	7.5 (Berkeley) 5/10/93
 
 version 	20100430
@@ -1093,11 +1093,13 @@ device	smsh: arp, ether, ifnet, mii
 file	dev/ic/lan9118.c		smsh
 
 # DRM - Direct Rendering Infrastructure: dev/drm
-# This is the old DRM; new DRM is in dev/pci/files.pci (XXX for now).
 define drm {}
 include "external/bsd/drm/conf/files.drm"
 include "dev/drm/files.drm"
 
+# DRM/KMS - Newer direct rendering manager with kernel mode-switching
+include "external/bsd/drm2/drm/files.drmkms"
+
 
 # Definitions for wscons
 # device attributes: display, display with emulator, keyboard, and mouse

Index: src/sys/conf/majors
diff -u src/sys/conf/majors:1.66.6.1 src/sys/conf/majors:1.66.6.2
--- src/sys/conf/majors:1.66.6.1	Wed Jan 29 19:47:54 2014
+++ src/sys/conf/majors	Tue Mar  4 20:45:16 2014
@@ -1,4 +1,4 @@
-# $NetBSD: majors,v 1.66.6.1 2014/01/29 19:47:54 riastradh Exp $
+# $NetBSD: majors,v 1.66.6.2 2014/03/04 20:45:16 riastradh Exp $
 #
 # Device majors for Machine-Independent drivers.
 #
@@ -29,7 +29,7 @@ device-major amr       char 176		   amr	
 device-major lockstat  char 177		   lockstat	single
 device-major putter    char 178		   putter
 device-major srt       char 179		   srt		
-device-major drm       char 180		   drmbase
+device-major drm       char 180		   drmbase | drmkms
 device-major bio       char 181		   bio		single
 device-major altmem    char 182 block 182  altmem	
 device-major twa       char 187		   twa
@@ -54,4 +54,3 @@ device-major mfi       char 205		   mfi
 device-major seeprom   char 206		   seeprom
 device-major dtrace    char 207		   dtrace
 device-major spiflash  char 208 block 208  spiflash
-device-major drmkms    char 209            drmkms

Index: src/sys/dev/pci/files.pci
diff -u src/sys/dev/pci/files.pci:1.364.6.2 src/sys/dev/pci/files.pci:1.364.6.3
--- src/sys/dev/pci/files.pci:1.364.6.2	Wed Jan 29 19:47:38 2014
+++ src/sys/dev/pci/files.pci	Tue Mar  4 20:45:16 2014
@@ -1,4 +1,4 @@
-#	$NetBSD: files.pci,v 1.364.6.2 2014/01/29 19:47:38 riastradh Exp $
+#	$NetBSD: files.pci,v 1.364.6.3 2014/03/04 20:45:16 riastradh Exp $
 #
 # Config file and device description for machine-independent PCI code.
 # Included by ports that need it.  Requires that the SCSI files be
@@ -1130,6 +1130,5 @@ device	tdvfb: wsemuldisplaydev, rasops16
 attach	tdvfb at pci
 file	dev/pci/tdvfb.c		tdvfb	
 
-# DRMKMS, DRM2 with kernel mode-switching, PCI-only for now.
-define drmkms
-include "external/bsd/drm2/conf/files.drm2"
+# PCI graphics devices with DRM/KMS
+include "external/bsd/drm2/pci/files.drmkms_pci"

Index: src/sys/external/bsd/drm2/dist/include/drm/drmP.h
diff -u src/sys/external/bsd/drm2/dist/include/drm/drmP.h:1.1.1.1.2.56 src/sys/external/bsd/drm2/dist/include/drm/drmP.h:1.1.1.1.2.57
--- src/sys/external/bsd/drm2/dist/include/drm/drmP.h:1.1.1.1.2.56	Wed Jan 22 16:40:44 2014
+++ src/sys/external/bsd/drm2/dist/include/drm/drmP.h	Tue Mar  4 20:45:16 2014
@@ -1706,6 +1706,25 @@ extern int drm_agp_bind(struct drm_devic
 extern int drm_agp_bind_ioctl(struct drm_device *dev, void *data,
 			struct drm_file *file_priv);
 
+#ifdef __NetBSD__
+struct drm_agp_hooks {
+	drm_ioctl_t	*agph_acquire_ioctl;
+	drm_ioctl_t	*agph_release_ioctl;
+	drm_ioctl_t	*agph_enable_ioctl;
+	drm_ioctl_t	*agph_info_ioctl;
+	drm_ioctl_t	*agph_alloc_ioctl;
+	drm_ioctl_t	*agph_free_ioctl;
+	drm_ioctl_t	*agph_bind_ioctl;
+	drm_ioctl_t	*agph_unbind_ioctl;
+	int		(*agph_release)(struct drm_device *);
+};
+
+extern int drm_agp_release_hook(struct drm_device *);
+
+extern int drm_agp_register(const struct drm_agp_hooks *);
+extern void drm_agp_deregister(const struct drm_agp_hooks *);
+#endif
+
 				/* Stub support (drm_stub.h) */
 extern int drm_setmaster_ioctl(struct drm_device *dev, void *data,
 			       struct drm_file *file_priv);
@@ -2154,5 +2173,9 @@ drm_io_mapping_create_wc(struct drm_devi
 
 #endif	/* defined(__NetBSD__) */
 
+#ifdef __NetBSD__
+extern const struct cdevsw drm_cdevsw;
+#endif
+
 #endif				/* __KERNEL__ */
 #endif

Index: src/sys/external/bsd/drm2/drm/drm_drv.c
diff -u src/sys/external/bsd/drm2/drm/drm_drv.c:1.1.2.35 src/sys/external/bsd/drm2/drm/drm_drv.c:1.1.2.36
--- src/sys/external/bsd/drm2/drm/drm_drv.c:1.1.2.35	Wed Jan 29 19:47:38 2014
+++ src/sys/external/bsd/drm2/drm/drm_drv.c	Tue Mar  4 20:45:16 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: drm_drv.c,v 1.1.2.35 2014/01/29 19:47:38 riastradh Exp $	*/
+/*	$NetBSD: drm_drv.c,v 1.1.2.36 2014/03/04 20:45:16 riastradh Exp $	*/
 
 /*-
  * Copyright (c) 2013 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: drm_drv.c,v 1.1.2.35 2014/01/29 19:47:38 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: drm_drv.c,v 1.1.2.36 2014/03/04 20:45:16 riastradh Exp $");
 
 #include <sys/param.h>
 #include <sys/types.h>
@@ -125,6 +125,25 @@ struct mutex drm_global_mutex;
 		.cmd_drv = 0,						\
 	}
 
+/* 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
+
 /* Table copied verbatim from dist/drm/drm_drv.c.  */
 static const struct drm_ioctl_desc drm_ioctls[] = {
 	DRM_IOCTL_DEF(DRM_IOCTL_VERSION, drm_version, DRM_UNLOCKED),
@@ -240,7 +259,7 @@ static const struct drm_ioctl_desc drm_i
 #endif
 };
 
-const struct cdevsw drmkms_cdevsw = {
+const struct cdevsw drm_cdevsw = {
 	.d_open = drm_open,
 	.d_close = noclose,
 	.d_read = noread,
@@ -315,7 +334,7 @@ drm_attach(device_t parent, device_t sel
 		sc->sc_minor[i].index = (i * 64) + device_unit(self);
 		sc->sc_minor[i].type = drm_minor_types[i];
 		sc->sc_minor[i].device =
-		    makedev(cdevsw_lookup_major(&drmkms_cdevsw),
+		    makedev(cdevsw_lookup_major(&drm_cdevsw),
 			sc->sc_minor[i].index);
 		sc->sc_minor[i].kdev = self;
 		sc->sc_minor[i].dev = dev;
@@ -407,9 +426,10 @@ drm_detach(device_t self, int flags)
 static int
 drm_init(void)
 {
+	extern int linux_suppress_init;
 	int error;
 
-	linux_mutex_init(&drm_global_mutex);
+	KASSERT(!linux_suppress_init);
 
 	error = linux_kmap_init();
 	if (error) {
@@ -425,6 +445,9 @@ drm_init(void)
 		goto fail1;
 	}
 
+	linux_suppress_init = 1;
+	linux_mutex_init(&drm_global_mutex);
+
 	return 0;
 
 fail1:	linux_kmap_fini();
@@ -984,3 +1007,67 @@ map:	vm_prot = ((ISSET(prot, PROT_READ)?
 	args->dnm_addr = (void *)vaddr;
 	return 0;
 }
+
+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);
+}
+
+int
+drm_agp_release_hook(struct drm_device *dev)
+{
+	const struct drm_agp_hooks *const hooks = drm_current_agp_hooks;
+
+	if (hooks == NULL) {
+		if ((dev != NULL) &&
+		    (dev->control != NULL) &&
+		    (dev->control->kdev != NULL))
+			panic("drm_agp_release(%s): no agp loaded",
+			    device_xname(dev->control->kdev));
+		else
+			panic("drm_agp_release(drm_device %p): no agp loaded",
+			    dev);
+	}
+	membar_consumer();
+	return (*hooks->agph_release)(dev);
+}
+
+#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)

Index: src/sys/external/bsd/drm2/drm/drm_fops.c
diff -u src/sys/external/bsd/drm2/drm/drm_fops.c:1.1.2.8 src/sys/external/bsd/drm2/drm/drm_fops.c:1.1.2.9
--- src/sys/external/bsd/drm2/drm/drm_fops.c:1.1.2.8	Wed Jan 15 21:25:29 2014
+++ src/sys/external/bsd/drm2/drm/drm_fops.c	Tue Mar  4 20:45:16 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: drm_fops.c,v 1.1.2.8 2014/01/15 21:25:29 riastradh Exp $	*/
+/*	$NetBSD: drm_fops.c,v 1.1.2.9 2014/03/04 20:45:16 riastradh Exp $	*/
 
 /*-
  * Copyright (c) 2013 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: drm_fops.c,v 1.1.2.8 2014/01/15 21:25:29 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: drm_fops.c,v 1.1.2.9 2014/03/04 20:45:16 riastradh Exp $");
 
 #include <drm/drmP.h>
 
@@ -402,7 +402,7 @@ drm_lastclose_agp(struct drm_device *dev
 	INIT_LIST_HEAD(&dev->agp->memory); /* XXX seems kludgey */
 
 	if (dev->agp->acquired)
-		drm_agp_release(dev);
+		(void)drm_agp_release_hook(dev);
 
 	dev->agp->acquired = 0;
 	dev->agp->enabled = 0;

Index: src/sys/external/bsd/drm2/drm/drm_module.c
diff -u src/sys/external/bsd/drm2/drm/drm_module.c:1.1.2.9 src/sys/external/bsd/drm2/drm/drm_module.c:1.1.2.10
--- src/sys/external/bsd/drm2/drm/drm_module.c:1.1.2.9	Wed Jan 29 19:47:38 2014
+++ src/sys/external/bsd/drm2/drm/drm_module.c	Tue Mar  4 20:45:16 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: drm_module.c,v 1.1.2.9 2014/01/29 19:47:38 riastradh Exp $	*/
+/*	$NetBSD: drm_module.c,v 1.1.2.10 2014/03/04 20:45:16 riastradh Exp $	*/
 
 /*-
  * Copyright (c) 2013 The NetBSD Foundation, Inc.
@@ -30,32 +30,29 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: drm_module.c,v 1.1.2.9 2014/01/29 19:47:38 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: drm_module.c,v 1.1.2.10 2014/03/04 20:45:16 riastradh Exp $");
 
 #include <sys/types.h>
 #include <sys/device.h>
 #include <sys/module.h>
 #include <sys/systm.h>
 
-#include <linux/highmem.h>
-#include <linux/mutex.h>
-#include <linux/workqueue.h>
-
 #include <drm/drmP.h>
 
 /*
- * XXX I2C stuff should be moved to a separate drmkms_edid module.
- *
- * XXX PCI stuff should be moved to a separate drmkms_pci module.
- *
- * XXX Other Linux stuff should be moved to a linux compatibility
- * module on which this one depends.
+ * XXX I2C stuff should be moved to a separate drmkms_i2c module.
  */
-MODULE(MODULE_CLASS_DRIVER, drmkms, "iic,pci");
+MODULE(MODULE_CLASS_DRIVER, drmkms, "iic,drmkms_linux");
 
 #ifdef _MODULE
 #include "ioconf.c"
-extern const struct cdevsw drmkms_cdevsw; /* XXX */
+#endif
+
+#ifndef _MODULE
+/*
+ * XXX Mega-kludge.  See drm_init in drm_drv.c for details.
+ */
+extern int linux_suppress_init;
 #endif
 
 static int
@@ -68,52 +65,40 @@ drmkms_modcmd(modcmd_t cmd, void *arg __
 
 	switch (cmd) {
 	case MODULE_CMD_INIT:
-#ifdef _MODULE
+#ifndef _MODULE
+		if (!linux_suppress_init)
+#endif
 		linux_mutex_init(&drm_global_mutex);
-		error = linux_kmap_init();
-		if (error) {
-			aprint_error("drmkms: unable to initialize linux kmap:"
-			    " %d", error);
-			goto init_fail0;
-		}
-		error = linux_workqueue_init();
-		if (error) {
-			aprint_error("drmkms: unable to initialize workqueues:"
-			    " %d", error);
-			goto init_fail1;
-		}
+#ifdef _MODULE
 		error = config_init_component(cfdriver_ioconf_drmkms,
 		    cfattach_ioconf_drmkms, cfdata_ioconf_drmkms);
 		if (error) {
 			aprint_error("drmkms: unable to init component: %d\n",
 			    error);
-			goto init_fail2;
+			goto init_fail0;
 		}
 		error = devsw_attach("drm", NULL, &bmajor,
-		    &drmkms_cdevsw, &cmajor);
+		    &drm_cdevsw, &cmajor);
 		if (error) {
 			aprint_error("drmkms: unable to attach devsw: %d\n",
 			    error);
-			goto init_fail3;
+			goto init_fail1;
 		}
 #endif
 		return 0;
 
 #ifdef _MODULE
-#if 0
-init_fail4:	(void)devsw_detach(NULL, &drmkms_cdevsw);
-#endif
-init_fail3:	(void)config_fini_component(cfdriver_ioconf_drmkms,
+init_fail2: __unused
+		(void)devsw_detach(NULL, &drm_cdevsw);
+init_fail1:	(void)config_fini_component(cfdriver_ioconf_drmkms,
 		    cfattach_ioconf_drmkms, cfdata_ioconf_drmkms);
-init_fail2:	linux_workqueue_fini();
-init_fail1:	linux_kmap_fini();
 init_fail0:	linux_mutex_destroy(&drm_global_mutex);
 		return error;
 #endif	/* _MODULE */
 
 	case MODULE_CMD_FINI:
 #ifdef _MODULE
-		error = devsw_detach(NULL, &drmkms_cdevsw);
+		error = devsw_detach(NULL, &drm_cdevsw);
 		if (error)
 			return error;
 		error = config_fini_component(cfdriver_ioconf_drmkms,
@@ -121,10 +106,8 @@ init_fail0:	linux_mutex_destroy(&drm_glo
 		if (error)
 			/* XXX Now what?  Reattach the devsw?  */
 			return error;
-		linux_workqueue_fini();
-		linux_kmap_fini();
-		linux_mutex_destroy(&drm_global_mutex);
 #endif
+		linux_mutex_destroy(&drm_global_mutex);
 		return 0;
 
 	default:

Index: src/sys/external/bsd/drm2/drm/drm_vm.c
diff -u src/sys/external/bsd/drm2/drm/drm_vm.c:1.1.2.5 src/sys/external/bsd/drm2/drm/drm_vm.c:1.1.2.6
--- src/sys/external/bsd/drm2/drm/drm_vm.c:1.1.2.5	Wed Jan 29 19:47:38 2014
+++ src/sys/external/bsd/drm2/drm/drm_vm.c	Tue Mar  4 20:45:16 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: drm_vm.c,v 1.1.2.5 2014/01/29 19:47:38 riastradh Exp $	*/
+/*	$NetBSD: drm_vm.c,v 1.1.2.6 2014/03/04 20:45:16 riastradh Exp $	*/
 
 /*-
  * Copyright (c) 2013 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: drm_vm.c,v 1.1.2.5 2014/01/29 19:47:38 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: drm_vm.c,v 1.1.2.6 2014/03/04 20:45:16 riastradh Exp $");
 
 #include <sys/types.h>
 #include <sys/conf.h>
@@ -45,13 +45,11 @@ static paddr_t	drm_mmap_dma_paddr(struct
 static paddr_t	drm_mmap_map_paddr(struct drm_device *, struct drm_local_map *,
 		    off_t, int);
 
-extern struct cdevsw drmkms_cdevsw;	/* XXX */
-
 int
 drm_mmap_object(struct drm_device *dev, off_t offset, size_t size, int prot,
     struct uvm_object **uobjp)
 {
-	dev_t devno = cdevsw_lookup_major(&drmkms_cdevsw);
+	dev_t devno = cdevsw_lookup_major(&drm_cdevsw);
 	struct uvm_object *uobj;
 
 	uobj = udv_attach(&devno, prot, offset, size);

Index: src/sys/external/bsd/drm2/i915drm/i915_module.c
diff -u src/sys/external/bsd/drm2/i915drm/i915_module.c:1.1.2.8 src/sys/external/bsd/drm2/i915drm/i915_module.c:1.1.2.9
--- src/sys/external/bsd/drm2/i915drm/i915_module.c:1.1.2.8	Wed Jan 29 19:47:38 2014
+++ src/sys/external/bsd/drm2/i915drm/i915_module.c	Tue Mar  4 20:45:17 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: i915_module.c,v 1.1.2.8 2014/01/29 19:47:38 riastradh Exp $	*/
+/*	$NetBSD: i915_module.c,v 1.1.2.9 2014/03/04 20:45:17 riastradh Exp $	*/
 
 /*-
  * Copyright (c) 2013 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: i915_module.c,v 1.1.2.8 2014/01/29 19:47:38 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: i915_module.c,v 1.1.2.9 2014/03/04 20:45:17 riastradh Exp $");
 
 #include <sys/types.h>
 #include <sys/module.h>
@@ -40,7 +40,7 @@ __KERNEL_RCSID(0, "$NetBSD: i915_module.
 
 #include "i915_drv.h"
 
-MODULE(MODULE_CLASS_DRIVER, i915drmkms, "drmkms"); /* XXX drmkms_pci, drmkms_edid */
+MODULE(MODULE_CLASS_DRIVER, i915drmkms, "drmkms,drmkms_pci"); /* XXX drmkms_i2c */
 
 #ifdef _MODULE
 #include "ioconf.c"

Index: src/sys/external/bsd/drm2/include/drm/drm_os_netbsd.h
diff -u src/sys/external/bsd/drm2/include/drm/drm_os_netbsd.h:1.1.2.6 src/sys/external/bsd/drm2/include/drm/drm_os_netbsd.h:1.1.2.7
--- src/sys/external/bsd/drm2/include/drm/drm_os_netbsd.h:1.1.2.6	Wed Jul 24 02:06:38 2013
+++ src/sys/external/bsd/drm2/include/drm/drm_os_netbsd.h	Tue Mar  4 20:45:17 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: drm_os_netbsd.h,v 1.1.2.6 2013/07/24 02:06:38 riastradh Exp $	*/
+/*	$NetBSD: drm_os_netbsd.h,v 1.1.2.7 2014/03/04 20:45:17 riastradh Exp $	*/
 
 /*-
  * Copyright (c) 2013 The NetBSD Foundation, Inc.
@@ -33,7 +33,7 @@
 #define _DRM_DRM_OS_NETBSD_H_
 
 #if defined(_KERNEL_OPT)
-#include "opt_drm.h"
+#include "opt_drmkms.h"
 #endif
 
 #include <drm/drm_agp_netbsd.h>

Index: src/sys/external/bsd/drm2/linux/linux_work.c
diff -u src/sys/external/bsd/drm2/linux/linux_work.c:1.1.2.9 src/sys/external/bsd/drm2/linux/linux_work.c:1.1.2.10
--- src/sys/external/bsd/drm2/linux/linux_work.c:1.1.2.9	Wed Jan 22 14:58:20 2014
+++ src/sys/external/bsd/drm2/linux/linux_work.c	Tue Mar  4 20:45:17 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: linux_work.c,v 1.1.2.9 2014/01/22 14:58:20 riastradh Exp $	*/
+/*	$NetBSD: linux_work.c,v 1.1.2.10 2014/03/04 20:45:17 riastradh Exp $	*/
 
 /*-
  * Copyright (c) 2013 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: linux_work.c,v 1.1.2.9 2014/01/22 14:58:20 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: linux_work.c,v 1.1.2.10 2014/03/04 20:45:17 riastradh Exp $");
 
 #include <sys/types.h>
 #include <sys/param.h>
@@ -49,6 +49,13 @@ __KERNEL_RCSID(0, "$NetBSD: linux_work.c
 
 #include <linux/workqueue.h>
 
+/* XXX Kludge until we sync with HEAD.  */
+#if DIAGNOSTIC
+#define	__diagused
+#else
+#define	__diagused	__unused
+#endif
+
 struct workqueue_struct {
 	struct workqueue		*wq_workqueue;
 
@@ -69,7 +76,7 @@ struct workqueue_struct {
 static void	linux_work_lock_init(struct work_struct *);
 static void	linux_work_lock(struct work_struct *);
 static void	linux_work_unlock(struct work_struct *);
-static bool	linux_work_locked(struct work_struct *);
+static bool	linux_work_locked(struct work_struct *) __diagused;
 
 static void	linux_wq_barrier(struct work_struct *);
 
@@ -285,7 +292,7 @@ linux_work_unlock(struct work_struct *wo
 	__cpu_simple_unlock(&work->w_lock);
 }
 
-static bool
+static bool __diagused
 linux_work_locked(struct work_struct *work)
 {
 	return __SIMPLELOCK_LOCKED_P(&work->w_lock);

Index: src/sys/external/bsd/drm2/pci/drm_pci_module.c
diff -u src/sys/external/bsd/drm2/pci/drm_pci_module.c:1.1.2.1 src/sys/external/bsd/drm2/pci/drm_pci_module.c:1.1.2.2
--- src/sys/external/bsd/drm2/pci/drm_pci_module.c:1.1.2.1	Wed Jul 24 02:44:20 2013
+++ src/sys/external/bsd/drm2/pci/drm_pci_module.c	Tue Mar  4 20:45:17 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: drm_pci_module.c,v 1.1.2.1 2013/07/24 02:44:20 riastradh Exp $	*/
+/*	$NetBSD: drm_pci_module.c,v 1.1.2.2 2014/03/04 20:45:17 riastradh Exp $	*/
 
 /*-
  * Copyright (c) 2013 The NetBSD Foundation, Inc.
@@ -30,22 +30,40 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: drm_pci_module.c,v 1.1.2.1 2013/07/24 02:44:20 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: drm_pci_module.c,v 1.1.2.2 2014/03/04 20:45:17 riastradh Exp $");
 
 #include <sys/module.h>
 
-MODULE(MODULE_CLASS_MISC, drm2pci, "drm2,pci");
+#include <drm/drmP.h>
+
+MODULE(MODULE_CLASS_MISC, drmkms_pci, "drmkms,pci");
+
+const struct drm_agp_hooks drmkms_pci_agp_hooks = {
+	.agph_acquire_ioctl = &drm_agp_acquire_ioctl,
+	.agph_release_ioctl = &drm_agp_release_ioctl,
+	.agph_enable_ioctl = &drm_agp_enable_ioctl,
+	.agph_info_ioctl = &drm_agp_info_ioctl,
+	.agph_alloc_ioctl = &drm_agp_alloc_ioctl,
+	.agph_free_ioctl = &drm_agp_free_ioctl,
+	.agph_bind_ioctl = &drm_agp_bind_ioctl,
+	.agph_unbind_ioctl = &drm_agp_unbind_ioctl,
+	.agph_release = &drm_agp_release,
+};
 
 static int
-drm2pci_modcmd(modcmd_t cmd, void *arg __unused)
+drmkms_pci_modcmd(modcmd_t cmd, void *arg __unused)
 {
+	int error;
+
 	switch (cmd) {
 	case MODULE_CMD_INIT:
-		/* XXX Install pci/agp hooks.  */
+		error = drm_agp_register(&drmkms_pci_agp_hooks);
+		if (error)
+			return error;
 		return 0;
 
 	case MODULE_CMD_FINI:
-		/* XXX Uninstall pci/agp hooks.  */
+		drm_agp_deregister(&drmkms_pci_agp_hooks);
 		return 0;
 
 	default:

Added files:

Index: src/sys/external/bsd/drm2/drm/files.drmkms
diff -u /dev/null src/sys/external/bsd/drm2/drm/files.drmkms:1.1.2.1
--- /dev/null	Tue Mar  4 20:45:17 2014
+++ src/sys/external/bsd/drm2/drm/files.drmkms	Tue Mar  4 20:45:16 2014
@@ -0,0 +1,62 @@
+#	$NetBSD: files.drmkms,v 1.1.2.1 2014/03/04 20:45:16 riastradh Exp $
+
+define	drmkmsbus	{ }
+
+include "external/bsd/drm2/linux/files.drmkms_linux"
+
+# i2c code is not separated out, but it is marked so that it could be
+# if we wanted.  Not clear that this provides as much advantage as
+# separating out PCI code, which will be necessary for, e.g., PCIless
+# ARM SoC graphics drivers.
+define	drmkms_i2c
+
+define	drmkms
+device	drmkms: drmkms_linux, drmkms_i2c
+attach	drmkms at drmkmsbus
+
+defflag		opt_drmkms.h	DRMKMS_DEBUG
+makeoptions 	drmkms	CPPFLAGS+="-I$S/external/bsd/drm2/include"
+makeoptions 	drmkms	CPPFLAGS+="-I$S/external/bsd/drm2/dist/uapi"
+makeoptions 	drmkms	CPPFLAGS+="-I$S/external/bsd/drm2/dist/include"
+
+makeoptions 	drmkms 	"CWARNFLAGS.drm_crtc.c"+="-Wno-shadow"
+makeoptions 	drmkms 	"CWARNFLAGS.drm_edid.c"+="-Wno-shadow"
+
+# XXX Should probably be in a header file.  opt_drmkms.h?
+makeoptions	drmkms	CPPFLAGS+="-D__KERNEL__"
+
+file	external/bsd/drm2/dist/drm/drm_auth.c		drmkms
+file	external/bsd/drm2/dist/drm/drm_buffer.c		drmkms
+file	external/bsd/drm2/dist/drm/drm_bufs.c		drmkms
+file	external/bsd/drm2/drm/drm_cache.c		drmkms
+file	external/bsd/drm2/dist/drm/drm_context.c	drmkms
+file	external/bsd/drm2/dist/drm/drm_crtc.c		drmkms
+file	external/bsd/drm2/dist/drm/drm_crtc_helper.c	drmkms
+file	external/bsd/drm2/dist/drm/drm_dma.c		drmkms
+file	external/bsd/drm2/dist/drm/drm_dp_helper.c	drmkms_i2c
+file	external/bsd/drm2/drm/drm_drv.c			drmkms
+file	external/bsd/drm2/dist/drm/drm_edid.c		drmkms_i2c
+#file	external/bsd/drm2/dist/drm/drm_encoder_slave.c	drmkms_i2c
+file	external/bsd/drm2/dist/drm/drm_fb_helper.c	drmkms
+file	external/bsd/drm2/drm/drm_fops.c		drmkms
+file	external/bsd/drm2/dist/drm/drm_gem.c		drmkms
+file	external/bsd/drm2/dist/drm/drm_global.c		drmkms
+file	external/bsd/drm2/dist/drm/drm_hashtab.c	drmkms
+#file	external/bsd/drm2/dist/drm/drm_info.c		drmkms
+#file	external/bsd/drm2/dist/drm/drm_ioc32.c		drmkms
+file	external/bsd/drm2/dist/drm/drm_ioctl.c		drmkms
+file	external/bsd/drm2/dist/drm/drm_irq.c		drmkms
+file	external/bsd/drm2/drm/drm_lock.c		drmkms
+file	external/bsd/drm2/drm/drm_memory.c		drmkms
+file	external/bsd/drm2/dist/drm/drm_mm.c		drmkms
+file	external/bsd/drm2/dist/drm/drm_modes.c		drmkms
+#file	external/bsd/drm2/dist/drm/drm_platform.c	drmkms
+#file	external/bsd/drm2/dist/drm/drm_prime.c		drmkms
+#file	external/bsd/drm2/dist/drm/drm_proc.c		drmkms
+file	external/bsd/drm2/drm/drm_scatter.c		drmkms
+file	external/bsd/drm2/dist/drm/drm_stub.c		drmkms
+file	external/bsd/drm2/drm/drm_vm.c			drmkms
+
+file	external/bsd/drm2/drm/drm_gem_vm.c		drmkms
+file	external/bsd/drm2/drm/drm_module.c		drmkms
+file	external/bsd/drm2/drm/drm_sysfs.c		drmkms

Index: src/sys/external/bsd/drm2/i915drm/files.i915drmkms
diff -u /dev/null src/sys/external/bsd/drm2/i915drm/files.i915drmkms:1.1.2.1
--- /dev/null	Tue Mar  4 20:45:17 2014
+++ src/sys/external/bsd/drm2/i915drm/files.i915drmkms	Tue Mar  4 20:45:17 2014
@@ -0,0 +1,60 @@
+#	$NetBSD: files.i915drmkms,v 1.1.2.1 2014/03/04 20:45:17 riastradh Exp $
+
+device	i915drmkms: drmkms, drmkmsbus, drmkms_pci, genfb, wsemuldisplaydev
+attach	i915drmkms at pci
+
+makeoptions	i915drmkms	CPPFLAGS+="-I$S/external/bsd/drm2/dist/drm/i915"
+
+makeoptions 	i915drmkms 	"CWARNFLAGS.intel_panel.c"+="-Wno-shadow"
+makeoptions 	i915drmkms 	"CWARNFLAGS.intel_pm.c"+="-Wno-shadow"
+
+# XXX x86 kludge.
+makeoptions	i915drmkms	CPPFLAGS+="-DCONFIG_MTRR"
+makeoptions	i915drmkms	CPPFLAGS+="-DCONFIG_X86"
+makeoptions	i915drmkms	CPPFLAGS+="-DMTRR"
+
+file	external/bsd/drm2/dist/drm/i915/dvo_ch7017.c	i915drmkms
+file	external/bsd/drm2/dist/drm/i915/dvo_ch7xxx.c	i915drmkms
+file	external/bsd/drm2/dist/drm/i915/dvo_ivch.c	i915drmkms
+file	external/bsd/drm2/dist/drm/i915/dvo_ns2501.c	i915drmkms
+file	external/bsd/drm2/dist/drm/i915/dvo_sil164.c	i915drmkms
+file	external/bsd/drm2/dist/drm/i915/dvo_tfp410.c	i915drmkms
+#file	external/bsd/drm2/dist/drm/i915/i915_debugfs.c	i915drmkms
+file	external/bsd/drm2/dist/drm/i915/i915_dma.c	i915drmkms
+file	external/bsd/drm2/dist/drm/i915/i915_drv.c	i915drmkms
+file	external/bsd/drm2/dist/drm/i915/i915_gem.c		i915drmkms
+file	external/bsd/drm2/dist/drm/i915/i915_gem_context.c	i915drmkms
+file	external/bsd/drm2/dist/drm/i915/i915_gem_debug.c	i915drmkms
+#file	external/bsd/drm2/dist/drm/i915/i915_gem_dmabuf.c	i915drmkms
+file	external/bsd/drm2/dist/drm/i915/i915_gem_evict.c	i915drmkms
+file	external/bsd/drm2/dist/drm/i915/i915_gem_execbuffer.c	i915drmkms
+file	external/bsd/drm2/i915drm/i915_gem_gtt.c		i915drmkms
+file	external/bsd/drm2/dist/drm/i915/i915_gem_stolen.c	i915drmkms
+file	external/bsd/drm2/dist/drm/i915/i915_gem_tiling.c	i915drmkms
+#file	external/bsd/drm2/dist/drm/i915/i915_ioc32.c	i915drmkms
+file	external/bsd/drm2/dist/drm/i915/i915_irq.c	i915drmkms
+file	external/bsd/drm2/dist/drm/i915/i915_suspend.c	i915drmkms
+file	external/bsd/drm2/i915drm/i915_sysfs.c		i915drmkms
+file	external/bsd/drm2/dist/drm/i915/intel_bios.c	i915drmkms
+file	external/bsd/drm2/dist/drm/i915/intel_crt.c	i915drmkms
+file	external/bsd/drm2/dist/drm/i915/intel_ddi.c	i915drmkms
+file	external/bsd/drm2/dist/drm/i915/intel_display.c	i915drmkms
+file	external/bsd/drm2/dist/drm/i915/intel_dp.c	i915drmkms
+file	external/bsd/drm2/dist/drm/i915/intel_dvo.c	i915drmkms
+file	external/bsd/drm2/i915drm/intel_fb.c		i915drmkms
+file	external/bsd/drm2/dist/drm/i915/intel_hdmi.c	i915drmkms
+file	external/bsd/drm2/dist/drm/i915/intel_i2c.c	i915drmkms
+file	external/bsd/drm2/dist/drm/i915/intel_lvds.c	i915drmkms
+file	external/bsd/drm2/dist/drm/i915/intel_modes.c	i915drmkms
+file	external/bsd/drm2/dist/drm/i915/intel_opregion.c	i915drmkms
+file	external/bsd/drm2/dist/drm/i915/intel_overlay.c	i915drmkms
+file	external/bsd/drm2/dist/drm/i915/intel_panel.c	i915drmkms
+file	external/bsd/drm2/dist/drm/i915/intel_pm.c	i915drmkms
+file	external/bsd/drm2/dist/drm/i915/intel_ringbuffer.c	i915drmkms
+file	external/bsd/drm2/dist/drm/i915/intel_sdvo.c	i915drmkms
+file	external/bsd/drm2/dist/drm/i915/intel_sprite.c	i915drmkms
+file	external/bsd/drm2/dist/drm/i915/intel_tv.c	i915drmkms
+
+file	external/bsd/drm2/i915drm/i915_module.c		i915drmkms
+file	external/bsd/drm2/i915drm/i915_pci.c		i915drmkms
+file	external/bsd/drm2/i915drm/intel_gtt.c		i915drmkms

Index: src/sys/external/bsd/drm2/linux/files.drmkms_linux
diff -u /dev/null src/sys/external/bsd/drm2/linux/files.drmkms_linux:1.1.2.1
--- /dev/null	Tue Mar  4 20:45:17 2014
+++ src/sys/external/bsd/drm2/linux/files.drmkms_linux	Tue Mar  4 20:45:17 2014
@@ -0,0 +1,13 @@
+#       $NetBSD: files.drmkms_linux,v 1.1.2.1 2014/03/04 20:45:17 riastradh Exp $
+
+define	drmkms_linux
+
+makeoptions 	drmkms_linux	CPPFLAGS+="-I$S/external/bsd/drm2/include"
+
+file	external/bsd/drm2/linux/linux_gfp.c		drmkms_linux
+file	external/bsd/drm2/linux/linux_kmap.c		drmkms_linux
+file	external/bsd/drm2/linux/linux_i2c.c		drmkms_linux
+file	external/bsd/drm2/linux/linux_idr.c		drmkms_linux
+file	external/bsd/drm2/linux/linux_list_sort.c	drmkms_linux
+file	external/bsd/drm2/linux/linux_module.c		drmkms_linux
+file	external/bsd/drm2/linux/linux_work.c		drmkms_linux
Index: src/sys/external/bsd/drm2/linux/linux_module.c
diff -u /dev/null src/sys/external/bsd/drm2/linux/linux_module.c:1.1.2.1
--- /dev/null	Tue Mar  4 20:45:17 2014
+++ src/sys/external/bsd/drm2/linux/linux_module.c	Tue Mar  4 20:45:17 2014
@@ -0,0 +1,88 @@
+/*	$NetBSD: linux_module.c,v 1.1.2.1 2014/03/04 20:45:17 riastradh Exp $	*/
+
+/*-
+ * Copyright (c) 2014 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software contributed to The NetBSD Foundation
+ * by Taylor R. Campbell.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+__KERNEL_RCSID(0, "$NetBSD: linux_module.c,v 1.1.2.1 2014/03/04 20:45:17 riastradh Exp $");
+
+#include <sys/module.h>
+
+#include <linux/highmem.h>
+#include <linux/mutex.h>
+#include <linux/workqueue.h>
+
+MODULE(MODULE_CLASS_MISC, drmkms_linux, NULL);
+
+#ifndef _MODULE
+/*
+ * XXX Mega-kludge.  See drm_init in drm_drv.c for details.
+ */
+int linux_suppress_init = 0;
+#endif
+
+static int
+drmkms_linux_modcmd(modcmd_t cmd, void *arg __unused)
+{
+	int error;
+
+	switch (cmd) {
+	case MODULE_CMD_INIT:
+#ifndef _MODULE
+		if (linux_suppress_init)
+			return 0;
+#endif
+		error = linux_kmap_init();
+		if (error) {
+			aprint_error("drmkms_linux:"
+			    " unable to initialize linux kmap: %d",
+			    error);
+			goto init_fail0;
+		}
+		error = linux_workqueue_init();
+		if (error) {
+			aprint_error("drmkms_linux:"
+			    " unable to initialize workqueues: %d",
+			    error);
+			goto init_fail1;
+		}
+		return 0;
+
+init_fail1:	linux_kmap_fini();
+init_fail0:	return error;
+
+	case MODULE_CMD_FINI:
+		linux_workqueue_fini();
+		linux_kmap_fini();
+		return 0;
+
+	default:
+		return ENOTTY;
+	}
+}

Index: src/sys/external/bsd/drm2/pci/files.drmkms_pci
diff -u /dev/null src/sys/external/bsd/drm2/pci/files.drmkms_pci:1.1.2.1
--- /dev/null	Tue Mar  4 20:45:17 2014
+++ src/sys/external/bsd/drm2/pci/files.drmkms_pci	Tue Mar  4 20:45:17 2014
@@ -0,0 +1,13 @@
+#	$NetBSD: files.drmkms_pci,v 1.1.2.1 2014/03/04 20:45:17 riastradh Exp $
+
+define	drmkms_pci: drmkms
+
+#file	external/bsd/drm2/dist/drm/ati_pcigart.c	drmkms_pci
+file	external/bsd/drm2/dist/drm/drm_agpsupport.c	drmkms_pci
+file	external/bsd/drm2/pci/drm_pci.c			drmkms_pci
+file	external/bsd/drm2/pci/drm_pci_module.c		drmkms_pci
+
+include "external/bsd/drm2/i915drm/files.i915drmkms"
+#include "external/bsd/drm2/radeon/files.radeondrmkms"
+#include "external/bsd/drm2/nouveau/files.nouveaudrmkms"
+#...

Index: src/sys/modules/drmkms/Makefile
diff -u /dev/null src/sys/modules/drmkms/Makefile:1.1.2.1
--- /dev/null	Tue Mar  4 20:45:17 2014
+++ src/sys/modules/drmkms/Makefile	Tue Mar  4 20:45:17 2014
@@ -0,0 +1,57 @@
+# $NetBSD: Makefile,v 1.1.2.1 2014/03/04 20:45:17 riastradh Exp $
+
+.include "../Makefile.inc"
+.include "Makefile.inc"
+
+.PATH:	${S}/external/bsd/drm2/drm
+.PATH:	${S}/external/bsd/drm2/pci
+.PATH:	${S}/external/bsd/drm2/dist/drm
+
+KMOD=	drmkms
+IOCONF=	drmkms.ioconf
+
+# Upstream source files.
+#SRCS+=	ati_pcigart.c		# Moved to drmkms_pci module.
+#SRCS+=	drm_agpsupport.c	# Moved to drmkms_pci module.
+SRCS+=	drm_auth.c
+SRCS+=	drm_buffer.c
+SRCS+=	drm_bufs.c
+SRCS+=	drm_cache.c
+SRCS+=	drm_context.c
+SRCS+=	drm_crtc.c
+SRCS+=	drm_crtc_helper.c
+SRCS+=	drm_dma.c
+SRCS+=	drm_dp_helper.c
+SRCS+=	drm_drv.c
+SRCS+=	drm_edid.c
+#SRCS+=	drm_encoder_slave.c	# XXX Rewrite for i2c.
+SRCS+=	drm_fb_helper.c		# XXX Rewrite for wsconsole.
+SRCS+=	drm_fops.c
+SRCS+=	drm_gem.c
+SRCS+=	drm_global.c
+SRCS+=	drm_hashtab.c
+#SRCS+=	drm_info.c		# XXX Rewrite for sysctl or something.
+#SRCS+=	drm_ioc32.c
+SRCS+=	drm_ioctl.c
+SRCS+=	drm_irq.c
+SRCS+=	drm_lock.c
+SRCS+=	drm_memory.c
+SRCS+=	drm_mm.c
+SRCS+=	drm_modes.c
+#SRCS+=	drm_pci.c		# Moved to drmkms_pci module.
+#SRCS+=	drm_platform.c		# XXX Rewrite per platform.
+#SRCS+=	drm_prime.c		# XXX Revisit later.
+#SRCS+=	drm_proc.c		# XXX Rewrite for sysctl.
+SRCS+=	drm_scatter.c
+SRCS+=	drm_stub.c
+SRCS+=	drm_vm.c
+
+# NetBSD additions.
+SRCS+=	drm_gem_vm.c
+SRCS+=	drm_module.c
+SRCS+=	drm_sysfs.c
+
+COPTS.drm_crtc.c+=	-Wno-shadow
+COPTS.drm_edid.c+=	-Wno-shadow
+
+.include <bsd.kmodule.mk>
Index: src/sys/modules/drmkms/Makefile.inc
diff -u /dev/null src/sys/modules/drmkms/Makefile.inc:1.1.2.1
--- /dev/null	Tue Mar  4 20:45:17 2014
+++ src/sys/modules/drmkms/Makefile.inc	Tue Mar  4 20:45:17 2014
@@ -0,0 +1,20 @@
+# $NetBSD: Makefile.inc,v 1.1.2.1 2014/03/04 20:45:17 riastradh Exp $
+
+# Common makefile cruft for drm2 code.
+
+# XXX All the -D crap needs to go in a header file instead so changing
+# it correctly triggers rebuilds.
+
+CPPFLAGS+=	-I${S}/external/bsd/drm2/include
+CPPFLAGS+=	-I${S}/external/bsd/drm2/dist/uapi
+CPPFLAGS+=	-I${S}/external/bsd/drm2/dist/include
+CPPFLAGS+=	-D__KERNEL__
+
+# XXX Is this the right place to set this?
+CPPFLAGS+=	-DDIAGNOSTIC
+
+.if ${MACHINE_ARCH} == "i386" || ${MACHINE_ARCH} == "x86_64"
+CPPFLAGS+=	-DCONFIG_MTRR
+CPPFLAGS+=	-DCONFIG_X86
+CPPFLAGS+=	-DMTRR
+.endif
Index: src/sys/modules/drmkms/drmkms.ioconf
diff -u /dev/null src/sys/modules/drmkms/drmkms.ioconf:1.1.2.1
--- /dev/null	Tue Mar  4 20:45:17 2014
+++ src/sys/modules/drmkms/drmkms.ioconf	Tue Mar  4 20:45:17 2014
@@ -0,0 +1,9 @@
+#       $NetBSD: drmkms.ioconf,v 1.1.2.1 2014/03/04 20:45:17 riastradh Exp $
+
+ioconf drmkms
+
+include "conf/files"
+
+pseudo-root	drmkmsbus*
+
+drmkms*		at drmkmsbus?

Index: src/sys/modules/drmkms_linux/Makefile
diff -u /dev/null src/sys/modules/drmkms_linux/Makefile:1.1.2.1
--- /dev/null	Tue Mar  4 20:45:17 2014
+++ src/sys/modules/drmkms_linux/Makefile	Tue Mar  4 20:45:17 2014
@@ -0,0 +1,22 @@
+# $NetBSD: Makefile,v 1.1.2.1 2014/03/04 20:45:17 riastradh Exp $
+
+.include "../Makefile.inc"
+
+.PATH: ${S}/external/bsd/drm2/linux
+
+CPPFLAGS+=	-I${S}/external/bsd/drm2/include
+
+# XXX Kludge!
+CPPFLAGS+=	-DDIAGNOSTIC
+
+KMOD=	drmkms_linux
+
+SRCS+=	linux_gfp.c
+SRCS+=	linux_kmap.c
+SRCS+=	linux_i2c.c
+SRCS+=	linux_idr.c
+SRCS+=	linux_list_sort.c
+SRCS+=	linux_module.c
+SRCS+=	linux_work.c
+
+.include <bsd.kmodule.mk>

Index: src/sys/modules/drmkms_pci/Makefile
diff -u /dev/null src/sys/modules/drmkms_pci/Makefile:1.1.2.1
--- /dev/null	Tue Mar  4 20:45:17 2014
+++ src/sys/modules/drmkms_pci/Makefile	Tue Mar  4 20:45:17 2014
@@ -0,0 +1,16 @@
+# $NetBSD: Makefile,v 1.1.2.1 2014/03/04 20:45:17 riastradh Exp $
+
+.include "../Makefile.inc"
+.include "../drmkms/Makefile.inc"
+
+.PATH:	${S}/external/bsd/drm2/pci
+.PATH:	${S}/external/bsd/drm2/dist/drm
+
+KMOD=	drmkms_pci
+
+#SRCS+=	ati_pcigart.c		# XXX Restore for ATI support.
+SRCS+=	drm_agpsupport.c
+SRCS+=	drm_pci.c
+SRCS+=	drm_pci_module.c
+
+.include <bsd.kmodule.mk>

Index: src/sys/modules/i915drmkms/Makefile
diff -u /dev/null src/sys/modules/i915drmkms/Makefile:1.1.2.1
--- /dev/null	Tue Mar  4 20:45:17 2014
+++ src/sys/modules/i915drmkms/Makefile	Tue Mar  4 20:45:17 2014
@@ -0,0 +1,63 @@
+# $NetBSD: Makefile,v 1.1.2.1 2014/03/04 20:45:17 riastradh Exp $
+
+.include "../Makefile.inc"
+.include "../drmkms/Makefile.inc"
+
+CPPFLAGS+=	-I${S}/external/bsd/drm2/dist/drm/i915
+
+.PATH:	${S}/external/bsd/drm2/i915drm
+.PATH:	${S}/external/bsd/drm2/dist/drm/i915
+
+KMOD=	i915drmkms
+IOCONF=	i915drmkms.ioconf
+
+SRCS+=	dvo_ch7017.c
+SRCS+=	dvo_ch7xxx.c
+SRCS+=	dvo_ivch.c
+SRCS+=	dvo_ns2501.c
+SRCS+=	dvo_sil164.c
+SRCS+=	dvo_tfp410.c
+#SRCS+=	i915_debugfs.c		# XXX No debugfs in NetBSD.
+SRCS+=	i915_dma.c
+SRCS+=	i915_drv.c
+SRCS+=	i915_gem.c
+SRCS+=	i915_gem_context.c
+SRCS+=	i915_gem_debug.c
+#SRCS+=	i915_gem_dmabuf.c
+SRCS+=	i915_gem_evict.c
+SRCS+=	i915_gem_execbuffer.c
+SRCS+=	i915_gem_gtt.c
+SRCS+=	i915_gem_stolen.c
+SRCS+=	i915_gem_tiling.c
+#SRCS+=	i915_ioc32.c
+SRCS+=	i915_irq.c
+SRCS+=	i915_suspend.c
+SRCS+=	i915_sysfs.c		# XXX No sysfs in NetBSD.
+SRCS+=	intel_bios.c
+SRCS+=	intel_crt.c
+SRCS+=	intel_ddi.c
+SRCS+=	intel_display.c
+SRCS+=	intel_dp.c
+SRCS+=	intel_dvo.c
+SRCS+=	intel_fb.c		# XXX Rewrite for wscons.
+SRCS+=	intel_hdmi.c
+SRCS+=	intel_i2c.c
+SRCS+=	intel_lvds.c
+SRCS+=	intel_modes.c
+SRCS+=	intel_opregion.c
+SRCS+=	intel_overlay.c
+SRCS+=	intel_panel.c
+SRCS+=	intel_pm.c
+SRCS+=	intel_ringbuffer.c
+SRCS+=	intel_sdvo.c
+SRCS+=	intel_sprite.c
+SRCS+=	intel_tv.c
+
+SRCS+=	i915_module.c
+SRCS+=	i915_pci.c
+SRCS+=	intel_gtt.c
+
+COPTS.intel_panel.c+=	-Wno-shadow
+COPTS.intel_pm.c+=	-Wno-shadow
+
+.include <bsd.kmodule.mk>
Index: src/sys/modules/i915drmkms/i915drmkms.ioconf
diff -u /dev/null src/sys/modules/i915drmkms/i915drmkms.ioconf:1.1.2.1
--- /dev/null	Tue Mar  4 20:45:17 2014
+++ src/sys/modules/i915drmkms/i915drmkms.ioconf	Tue Mar  4 20:45:17 2014
@@ -0,0 +1,10 @@
+#	$NetBSD: i915drmkms.ioconf,v 1.1.2.1 2014/03/04 20:45:17 riastradh Exp $
+
+ioconf i915drmkms
+
+include "conf/files"
+include "dev/pci/files.pci"
+
+pseudo-root	pci*
+
+i915drmkms* 	at pci? dev ? function ?

Reply via email to