Module Name:    src
Committed By:   riastradh
Date:           Fri Mar  6 01:24:24 UTC 2015

Modified Files:
        src/sys/external/bsd/drm2/dist/include/drm: drmP.h
        src/sys/external/bsd/drm2/pci: drm_pci.c drm_pci_module.c

Log Message:
Adapt drmkms_pci module initialization to work as builtin, for agp.


To generate a diff of this commit:
cvs rdiff -u -r1.9 -r1.10 src/sys/external/bsd/drm2/dist/include/drm/drmP.h
cvs rdiff -u -r1.9 -r1.10 src/sys/external/bsd/drm2/pci/drm_pci.c
cvs rdiff -u -r1.3 -r1.4 src/sys/external/bsd/drm2/pci/drm_pci_module.c

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

Modified files:

Index: src/sys/external/bsd/drm2/dist/include/drm/drmP.h
diff -u src/sys/external/bsd/drm2/dist/include/drm/drmP.h:1.9 src/sys/external/bsd/drm2/dist/include/drm/drmP.h:1.10
--- src/sys/external/bsd/drm2/dist/include/drm/drmP.h:1.9	Tue Dec  2 21:49:36 2014
+++ src/sys/external/bsd/drm2/dist/include/drm/drmP.h	Fri Mar  6 01:24:24 2015
@@ -1751,6 +1751,7 @@ extern drm_dma_handle_t *drm_pci_alloc(s
 extern void __drm_pci_free(struct drm_device *dev, drm_dma_handle_t * dmah);
 extern void drm_pci_free(struct drm_device *dev, drm_dma_handle_t * dmah);
 #ifdef __NetBSD__
+extern int drmkms_pci_agp_guarantee_initialized(void);
 extern int drm_pci_attach(device_t, const struct pci_attach_args *,
     struct pci_dev *, struct drm_driver *, unsigned long,
     struct drm_device **);

Index: src/sys/external/bsd/drm2/pci/drm_pci.c
diff -u src/sys/external/bsd/drm2/pci/drm_pci.c:1.9 src/sys/external/bsd/drm2/pci/drm_pci.c:1.10
--- src/sys/external/bsd/drm2/pci/drm_pci.c:1.9	Thu Jan  1 01:15:43 2015
+++ src/sys/external/bsd/drm2/pci/drm_pci.c	Fri Mar  6 01:24:24 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: drm_pci.c,v 1.9 2015/01/01 01:15:43 mrg Exp $	*/
+/*	$NetBSD: drm_pci.c,v 1.10 2015/03/06 01:24:24 riastradh Exp $	*/
 
 /*-
  * Copyright (c) 2013 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: drm_pci.c,v 1.9 2015/01/01 01:15:43 mrg Exp $");
+__KERNEL_RCSID(0, "$NetBSD: drm_pci.c,v 1.10 2015/03/06 01:24:24 riastradh Exp $");
 
 #include <sys/types.h>
 #include <sys/errno.h>
@@ -94,6 +94,12 @@ drm_pci_attach(device_t self, const stru
 	unsigned int unit;
 	int ret;
 
+	/* Ensure the drm agp hooks are installed.  */
+	/* XXX errno NetBSD->Linux */
+	ret = -drmkms_pci_agp_guarantee_initialized();
+	if (ret)
+		goto fail0;
+
 	/* Initialize the Linux PCI device descriptor.  */
 	linux_pci_dev_init(pdev, self, pa, 0);
 

Index: src/sys/external/bsd/drm2/pci/drm_pci_module.c
diff -u src/sys/external/bsd/drm2/pci/drm_pci_module.c:1.3 src/sys/external/bsd/drm2/pci/drm_pci_module.c:1.4
--- src/sys/external/bsd/drm2/pci/drm_pci_module.c:1.3	Sat Nov 22 19:18:07 2014
+++ src/sys/external/bsd/drm2/pci/drm_pci_module.c	Fri Mar  6 01:24:24 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: drm_pci_module.c,v 1.3 2014/11/22 19:18:07 riastradh Exp $	*/
+/*	$NetBSD: drm_pci_module.c,v 1.4 2015/03/06 01:24:24 riastradh Exp $	*/
 
 /*-
  * Copyright (c) 2013 The NetBSD Foundation, Inc.
@@ -30,9 +30,10 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: drm_pci_module.c,v 1.3 2014/11/22 19:18:07 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: drm_pci_module.c,v 1.4 2015/03/06 01:24:24 riastradh Exp $");
 
 #include <sys/module.h>
+#include <sys/once.h>
 
 #include <drm/drmP.h>
 
@@ -52,19 +53,54 @@ const struct drm_agp_hooks drmkms_pci_ag
 };
 
 static int
+drmkms_pci_agp_init(void)
+{
+	int error;
+
+	error = drm_agp_register(&drmkms_pci_agp_hooks);
+	if (error)
+		return error;
+
+	return 0;
+}
+
+int
+drmkms_pci_agp_guarantee_initialized(void)
+{
+#ifdef _MODULE
+	return 0;
+#else
+	static ONCE_DECL(drmkms_pci_agp_init_once);
+
+	return RUN_ONCE(&drmkms_pci_agp_init_once, &drmkms_pci_agp_init);
+#endif
+}
+
+static void
+drmkms_pci_agp_fini(void)
+{
+
+	drm_agp_deregister(&drmkms_pci_agp_hooks);
+}
+
+static int
 drmkms_pci_modcmd(modcmd_t cmd, void *arg __unused)
 {
 	int error;
 
 	switch (cmd) {
 	case MODULE_CMD_INIT:
-		error = drm_agp_register(&drmkms_pci_agp_hooks);
+#ifdef _MODULE
+		error = drmkms_pci_agp_init();
+#else
+		error = drmkms_pci_agp_guarantee_initialized();
+#endif
 		if (error)
 			return error;
 		return 0;
 
 	case MODULE_CMD_FINI:
-		drm_agp_deregister(&drmkms_pci_agp_hooks);
+		drmkms_pci_agp_fini();
 		return 0;
 
 	default:

Reply via email to