Index: sys/external/bsd/drm2/dist/include/drm/drmP.h =================================================================== RCS file: /cvsroot/src/sys/external/bsd/drm2/dist/include/drm/drmP.h,v retrieving revision 1.9 diff -p -u -r1.9 drmP.h --- sys/external/bsd/drm2/dist/include/drm/drmP.h 2 Dec 2014 21:49:36 -0000 1.9 +++ sys/external/bsd/drm2/dist/include/drm/drmP.h 5 Mar 2015 21:45:45 -0000 @@ -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: sys/external/bsd/drm2/pci/drm_pci.c =================================================================== RCS file: /cvsroot/src/sys/external/bsd/drm2/pci/drm_pci.c,v retrieving revision 1.9 diff -p -u -r1.9 drm_pci.c --- sys/external/bsd/drm2/pci/drm_pci.c 1 Jan 2015 01:15:43 -0000 1.9 +++ sys/external/bsd/drm2/pci/drm_pci.c 5 Mar 2015 21:45:46 -0000 @@ -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: sys/external/bsd/drm2/pci/drm_pci_module.c =================================================================== RCS file: /cvsroot/src/sys/external/bsd/drm2/pci/drm_pci_module.c,v retrieving revision 1.3 diff -p -u -r1.3 drm_pci_module.c --- sys/external/bsd/drm2/pci/drm_pci_module.c 22 Nov 2014 19:18:07 -0000 1.3 +++ sys/external/bsd/drm2/pci/drm_pci_module.c 5 Mar 2015 21:45:46 -0000 @@ -33,6 +33,7 @@ __KERNEL_RCSID(0, "$NetBSD: drm_pci_module.c,v 1.3 2014/11/22 19:18:07 riastradh Exp $"); #include +#include #include @@ -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: