Module Name: src Committed By: riastradh Date: Sun Dec 19 11:05:13 UTC 2021
Modified Files: src/sys/external/bsd/drm2/amdgpu: amdgpu_pci.c src/sys/external/bsd/drm2/dist/include/drm: drm_pci.h src/sys/external/bsd/drm2/i915drm: i915_pci_autoconf.c src/sys/external/bsd/drm2/nouveau: nouveau_pci.c src/sys/external/bsd/drm2/pci: drm_pci.c src/sys/external/bsd/drm2/radeon: radeon_pci.c Log Message: Split drm_dev_alloc/register out of drm_pci_attach. Needed by nouveau which needs to do drm_dev_alloc drm_pci_attach nouveau_drm_device_init drm_dev_register To generate a diff of this commit: cvs rdiff -u -r1.6 -r1.7 src/sys/external/bsd/drm2/amdgpu/amdgpu_pci.c cvs rdiff -u -r1.6 -r1.7 src/sys/external/bsd/drm2/dist/include/drm/drm_pci.h cvs rdiff -u -r1.3 -r1.4 \ src/sys/external/bsd/drm2/i915drm/i915_pci_autoconf.c cvs rdiff -u -r1.29 -r1.30 src/sys/external/bsd/drm2/nouveau/nouveau_pci.c cvs rdiff -u -r1.43 -r1.44 src/sys/external/bsd/drm2/pci/drm_pci.c cvs rdiff -u -r1.17 -r1.18 src/sys/external/bsd/drm2/radeon/radeon_pci.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/amdgpu/amdgpu_pci.c diff -u src/sys/external/bsd/drm2/amdgpu/amdgpu_pci.c:1.6 src/sys/external/bsd/drm2/amdgpu/amdgpu_pci.c:1.7 --- src/sys/external/bsd/drm2/amdgpu/amdgpu_pci.c:1.6 Sun Dec 19 10:32:59 2021 +++ src/sys/external/bsd/drm2/amdgpu/amdgpu_pci.c Sun Dec 19 11:05:12 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: amdgpu_pci.c,v 1.6 2021/12/19 10:32:59 riastradh Exp $ */ +/* $NetBSD: amdgpu_pci.c,v 1.7 2021/12/19 11:05:12 riastradh Exp $ */ /*- * Copyright (c) 2018 The NetBSD Foundation, Inc. @@ -30,7 +30,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: amdgpu_pci.c,v 1.6 2021/12/19 10:32:59 riastradh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: amdgpu_pci.c,v 1.7 2021/12/19 11:05:12 riastradh Exp $"); #include <sys/types.h> #include <sys/queue.h> @@ -58,6 +58,8 @@ struct amdgpu_softc { } sc_task_u; struct drm_device *sc_drm_dev; struct pci_dev sc_pci_dev; + bool sc_pci_attached; + bool sc_dev_registered; }; static bool amdgpu_pci_lookup(const struct pci_attach_args *, @@ -159,13 +161,29 @@ amdgpu_attach_real(device_t self) /* Initialize the Linux PCI device descriptor. */ linux_pci_dev_init(&sc->sc_pci_dev, self, device_parent(self), pa, 0); + sc->sc_drm_dev = drm_dev_alloc(amdgpu_drm_driver, self); + if (IS_ERR(sc->sc_drm_dev)) { + aprint_error_dev(self, "unable to create drm device: %ld\n", + PTR_ERR(sc->sc_drm_dev)); + sc->sc_drm_dev = NULL; + goto out; + } + /* XXX errno Linux->NetBSD */ - error = -drm_pci_attach(self, pa, &sc->sc_pci_dev, amdgpu_drm_driver, - flags, &sc->sc_drm_dev); + error = -drm_pci_attach(sc->sc_drm_dev, pa, &sc->sc_pci_dev); if (error) { aprint_error_dev(self, "unable to attach drm: %d\n", error); goto out; } + sc->sc_pci_attached = true; + + /* XXX errno Linux->NetBSD */ + error = -drm_dev_register(sc->sc_drm_dev, flags); + if (error) { + aprint_error_dev(self, "unable to register drm: %d\n", error); + return; + } + sc->sc_dev_registered = true; while (!SIMPLEQ_EMPTY(&sc->sc_task_u.attach)) { struct amdgpu_task *const task = @@ -211,17 +229,18 @@ amdgpu_detach(device_t self, int flags) } if (sc->sc_drm_dev == NULL) - goto out; - /* XXX errno Linux->NetBSD */ - error = -drm_pci_detach(sc->sc_drm_dev, flags); - if (error) - /* XXX Kinda too late to fail now... */ - return error; + goto out0; + if (!sc->sc_pci_attached) + goto out1; + if (!sc->sc_dev_registered) + goto out2; + + drm_dev_unregister(sc->sc_drm_dev); +out2: drm_pci_detach(sc->sc_drm_dev); +out1: drm_dev_put(sc->sc_drm_dev); sc->sc_drm_dev = NULL; - -out: linux_pci_dev_destroy(&sc->sc_pci_dev); +out0: linux_pci_dev_destroy(&sc->sc_pci_dev); pmf_device_deregister(self); - return 0; } Index: src/sys/external/bsd/drm2/dist/include/drm/drm_pci.h diff -u src/sys/external/bsd/drm2/dist/include/drm/drm_pci.h:1.6 src/sys/external/bsd/drm2/dist/include/drm/drm_pci.h:1.7 --- src/sys/external/bsd/drm2/dist/include/drm/drm_pci.h:1.6 Sun Dec 19 10:51:39 2021 +++ src/sys/external/bsd/drm2/dist/include/drm/drm_pci.h Sun Dec 19 11:05:12 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: drm_pci.h,v 1.6 2021/12/19 10:51:39 riastradh Exp $ */ +/* $NetBSD: drm_pci.h,v 1.7 2021/12/19 11:05:12 riastradh Exp $ */ /* * Internal Header for the Direct Rendering Manager @@ -76,10 +76,9 @@ static inline int drm_get_pci_dev(struct #ifdef __NetBSD__ int drm_pci_request_irq(struct drm_device *, int); void drm_pci_free_irq(struct drm_device *); -extern int drm_pci_attach(device_t, const struct pci_attach_args *, - struct pci_dev *, struct drm_driver *, unsigned long, - struct drm_device **); -extern int drm_pci_detach(struct drm_device *, int); +int drm_pci_attach(struct drm_device *, const struct pci_attach_args *, + struct pci_dev *); +void drm_pci_detach(struct drm_device *); int drm_pci_set_busid(struct drm_device *, struct drm_master *); #endif Index: src/sys/external/bsd/drm2/i915drm/i915_pci_autoconf.c diff -u src/sys/external/bsd/drm2/i915drm/i915_pci_autoconf.c:1.3 src/sys/external/bsd/drm2/i915drm/i915_pci_autoconf.c:1.4 --- src/sys/external/bsd/drm2/i915drm/i915_pci_autoconf.c:1.3 Sun Dec 19 10:32:59 2021 +++ src/sys/external/bsd/drm2/i915drm/i915_pci_autoconf.c Sun Dec 19 11:05:12 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: i915_pci_autoconf.c,v 1.3 2021/12/19 10:32:59 riastradh Exp $ */ +/* $NetBSD: i915_pci_autoconf.c,v 1.4 2021/12/19 11:05:12 riastradh Exp $ */ /*- * Copyright (c) 2013 The NetBSD Foundation, Inc. @@ -30,7 +30,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: i915_pci_autoconf.c,v 1.3 2021/12/19 10:32:59 riastradh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: i915_pci_autoconf.c,v 1.4 2021/12/19 11:05:12 riastradh Exp $"); #include <sys/types.h> #include <sys/queue.h> @@ -58,6 +58,8 @@ struct i915drmkms_softc { } sc_task_u; struct drm_device *sc_drm_dev; struct pci_dev sc_pci_dev; + bool sc_pci_attached; + bool sc_dev_registered; }; static const struct intel_device_info * @@ -177,13 +179,29 @@ i915drmkms_attach_real(device_t self) /* Initialize the Linux PCI device descriptor. */ linux_pci_dev_init(&sc->sc_pci_dev, self, device_parent(self), pa, 0); + sc->sc_drm_dev = drm_dev_alloc(i915_drm_driver, self); + if (IS_ERR(sc->sc_drm_dev)) { + aprint_error_dev(self, "unable to create drm device: %ld\n", + PTR_ERR(sc->sc_drm_dev)); + sc->sc_drm_dev = NULL; + return; + } + /* XXX errno Linux->NetBSD */ - error = -drm_pci_attach(self, pa, &sc->sc_pci_dev, i915_drm_driver, - cookie, &sc->sc_drm_dev); + error = -drm_pci_attach(sc->sc_drm_dev, pa, &sc->sc_pci_dev); if (error) { aprint_error_dev(self, "unable to attach drm: %d\n", error); return; } + sc->sc_pci_attached = true; + + /* XXX errno Linux->NetBSD */ + error = -drm_dev_register(sc->sc_drm_dev, cookie); + if (error) { + aprint_error_dev(self, "unable to register drm: %d\n", error); + return; + } + sc->sc_dev_registered = true; while (!SIMPLEQ_EMPTY(&sc->sc_task_u.attach)) { struct i915drmkms_task *const task = @@ -216,22 +234,24 @@ i915drmkms_detach(device_t self, int fla return error; if (sc->sc_task_state == I915DRMKMS_TASK_ATTACH) - goto out; + goto out0; if (sc->sc_task_u.workqueue != NULL) { workqueue_destroy(sc->sc_task_u.workqueue); sc->sc_task_u.workqueue = NULL; } if (sc->sc_drm_dev == NULL) - goto out; - /* XXX errno Linux->NetBSD */ - error = -drm_pci_detach(sc->sc_drm_dev, flags); - if (error) - /* XXX Kinda too late to fail now... */ - return error; + goto out0; + if (!sc->sc_pci_attached) + goto out1; + if (!sc->sc_dev_registered) + goto out2; + + drm_dev_unregister(sc->sc_drm_dev); +out2: drm_pci_detach(sc->sc_drm_dev); +out1: drm_dev_put(sc->sc_drm_dev); sc->sc_drm_dev = NULL; - -out: linux_pci_dev_destroy(&sc->sc_pci_dev); +out0: linux_pci_dev_destroy(&sc->sc_pci_dev); pmf_device_deregister(self); return 0; } Index: src/sys/external/bsd/drm2/nouveau/nouveau_pci.c diff -u src/sys/external/bsd/drm2/nouveau/nouveau_pci.c:1.29 src/sys/external/bsd/drm2/nouveau/nouveau_pci.c:1.30 --- src/sys/external/bsd/drm2/nouveau/nouveau_pci.c:1.29 Sun Dec 19 10:51:59 2021 +++ src/sys/external/bsd/drm2/nouveau/nouveau_pci.c Sun Dec 19 11:05:13 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: nouveau_pci.c,v 1.29 2021/12/19 10:51:59 riastradh Exp $ */ +/* $NetBSD: nouveau_pci.c,v 1.30 2021/12/19 11:05:13 riastradh Exp $ */ /*- * Copyright (c) 2015 The NetBSD Foundation, Inc. @@ -30,7 +30,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: nouveau_pci.c,v 1.29 2021/12/19 10:51:59 riastradh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: nouveau_pci.c,v 1.30 2021/12/19 11:05:13 riastradh Exp $"); #ifdef _KERNEL_OPT #if defined(__arm__) || defined(__aarch64__) @@ -76,6 +76,8 @@ struct nouveau_pci_softc { struct drm_device *sc_drm_dev; struct pci_dev sc_pci_dev; struct nvkm_device *sc_nv_dev; + bool sc_pci_attached; + bool sc_dev_registered; }; static int nouveau_pci_match(device_t, cfdata_t, void *); @@ -200,16 +202,33 @@ nouveau_pci_attach_real(device_t self) if (error) { aprint_error_dev(self, "unable to create nouveau device: %d\n", error); + sc->sc_nv_dev = NULL; + return; + } + + sc->sc_drm_dev = drm_dev_alloc(nouveau_drm_driver_pci, self); + if (IS_ERR(sc->sc_drm_dev)) { + aprint_error_dev(self, "unable to create drm device: %ld\n", + PTR_ERR(sc->sc_drm_dev)); + sc->sc_drm_dev = NULL; return; } /* XXX errno Linux->NetBSD */ - error = -drm_pci_attach(self, pa, &sc->sc_pci_dev, - nouveau_drm_driver_pci, 0, &sc->sc_drm_dev); + error = -drm_pci_attach(sc->sc_drm_dev, pa, &sc->sc_pci_dev); if (error) { aprint_error_dev(self, "unable to attach drm: %d\n", error); return; } + sc->sc_pci_attached = true; + + /* XXX errno Linux->NetBSD */ + error = -drm_dev_register(sc->sc_drm_dev, 0); + if (error) { + aprint_error_dev(self, "unable to register drm: %d\n", error); + return; + } + sc->sc_dev_registered = true; while (!SIMPLEQ_EMPTY(&sc->sc_task_u.attach)) { struct nouveau_pci_task *const task = @@ -254,16 +273,17 @@ nouveau_pci_detach(device_t self, int fl if (sc->sc_nv_dev == NULL) goto out0; - if (sc->sc_drm_dev == NULL) goto out1; - /* XXX errno Linux->NetBSD */ - error = -drm_pci_detach(sc->sc_drm_dev, flags); - if (error) - /* XXX Kinda too late to fail now... */ - return error; + if (!sc->sc_pci_attached) + goto out2; + if (!sc->sc_dev_registered) + goto out3; + + drm_dev_unregister(sc->sc_drm_dev); +out3: drm_pci_detach(sc->sc_drm_dev); +out2: drm_dev_put(sc->sc_drm_dev); sc->sc_drm_dev = NULL; - out1: nvkm_device_del(&sc->sc_nv_dev); out0: linux_pci_dev_destroy(&sc->sc_pci_dev); pmf_device_deregister(self); Index: src/sys/external/bsd/drm2/pci/drm_pci.c diff -u src/sys/external/bsd/drm2/pci/drm_pci.c:1.43 src/sys/external/bsd/drm2/pci/drm_pci.c:1.44 --- src/sys/external/bsd/drm2/pci/drm_pci.c:1.43 Sun Dec 19 11:01:22 2021 +++ src/sys/external/bsd/drm2/pci/drm_pci.c Sun Dec 19 11:05:13 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: drm_pci.c,v 1.43 2021/12/19 11:01:22 riastradh Exp $ */ +/* $NetBSD: drm_pci.c,v 1.44 2021/12/19 11:05:13 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.43 2021/12/19 11:01:22 riastradh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: drm_pci.c,v 1.44 2021/12/19 11:05:13 riastradh Exp $"); #include <sys/types.h> #include <sys/errno.h> @@ -59,11 +59,10 @@ drm_pci_attach_args(struct drm_device *d } int -drm_pci_attach(device_t self, const struct pci_attach_args *pa, - struct pci_dev *pdev, struct drm_driver *driver, unsigned long cookie, - struct drm_device **devp) +drm_pci_attach(struct drm_device *dev, const struct pci_attach_args *pa, + struct pci_dev *pdev) { - struct drm_device *dev; + device_t self = dev->dev; unsigned int unit; int ret; @@ -71,14 +70,7 @@ drm_pci_attach(device_t self, const stru /* XXX errno NetBSD->Linux */ ret = -drm_guarantee_initialized(); if (ret) - goto fail0; - - /* Create a DRM device. */ - dev = drm_dev_alloc(driver, self); - if (IS_ERR(dev)) { - ret = -ENOMEM; - goto fail0; - } + return ret; dev->pdev = pdev; @@ -139,34 +131,14 @@ drm_pci_attach(device_t self, const stru dev->agp->agp_info.aki_info.ai_aperture_size); } - /* Register the DRM device and do driver-specific initialization. */ - ret = drm_dev_register(dev, cookie); - if (ret) - goto fail1; - /* Success! */ - *devp = dev; return 0; - -fail2: __unused - drm_dev_unregister(dev); -fail1: drm_pci_agp_destroy(dev); - dev->bus_nmaps = 0; - kmem_free(dev->bus_maps, PCI_NUM_RESOURCES * sizeof(dev->bus_maps[0])); - if (dev->dmat_subregion_p) { - bus_dmatag_destroy(dev->dmat); - } - drm_dev_put(dev); -fail0: return ret; } -int -drm_pci_detach(struct drm_device *dev, int flags __unused) +void +drm_pci_detach(struct drm_device *dev) { - /* Do driver-specific detachment and unregister the device. */ - drm_dev_unregister(dev); - /* Tear down AGP stuff if necessary. */ drm_pci_agp_destroy(dev); @@ -178,10 +150,6 @@ drm_pci_detach(struct drm_device *dev, i if (dev->dmat_subregion_p) { bus_dmatag_destroy(dev->dmat); } - - drm_dev_put(dev); - - return 0; } void Index: src/sys/external/bsd/drm2/radeon/radeon_pci.c diff -u src/sys/external/bsd/drm2/radeon/radeon_pci.c:1.17 src/sys/external/bsd/drm2/radeon/radeon_pci.c:1.18 --- src/sys/external/bsd/drm2/radeon/radeon_pci.c:1.17 Sun Dec 19 10:33:00 2021 +++ src/sys/external/bsd/drm2/radeon/radeon_pci.c Sun Dec 19 11:05:13 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: radeon_pci.c,v 1.17 2021/12/19 10:33:00 riastradh Exp $ */ +/* $NetBSD: radeon_pci.c,v 1.18 2021/12/19 11:05:13 riastradh Exp $ */ /*- * Copyright (c) 2014 The NetBSD Foundation, Inc. @@ -30,7 +30,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: radeon_pci.c,v 1.17 2021/12/19 10:33:00 riastradh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: radeon_pci.c,v 1.18 2021/12/19 11:05:13 riastradh Exp $"); #ifdef _KERNEL_OPT #include "vga.h" @@ -68,6 +68,7 @@ __KERNEL_RCSID(0, "$NetBSD: radeon_pci.c #endif #include <drm/drm_device.h> +#include <drm/drm_drv.h> #include <drm/drm_fb_helper.h> #include <drm/drm_pci.h> @@ -90,6 +91,8 @@ struct radeon_softc { } sc_task_u; struct drm_device *sc_drm_dev; struct pci_dev sc_pci_dev; + bool sc_pci_attached; + bool sc_dev_registered; #if defined(__i386__) #define RADEON_PCI_UGLY_MAP_HACK /* XXX Used to claim the VGA device before attach_real */ @@ -248,13 +251,29 @@ radeon_attach_real(device_t self) /* Initialize the Linux PCI device descriptor. */ linux_pci_dev_init(&sc->sc_pci_dev, self, device_parent(self), pa, 0); + sc->sc_drm_dev = drm_dev_alloc(radeon_drm_driver, self); + if (IS_ERR(sc->sc_drm_dev)) { + aprint_error_dev(self, "unable to create drm device: %ld\n", + PTR_ERR(sc->sc_drm_dev)); + sc->sc_drm_dev = NULL; + goto out; + } + /* XXX errno Linux->NetBSD */ - error = -drm_pci_attach(self, pa, &sc->sc_pci_dev, radeon_drm_driver, - flags, &sc->sc_drm_dev); + error = -drm_pci_attach(sc->sc_drm_dev, pa, &sc->sc_pci_dev); if (error) { aprint_error_dev(self, "unable to attach drm: %d\n", error); goto out; } + sc->sc_pci_attached = true; + + /* XXX errno Linux->NetBSD */ + error = -drm_dev_register(sc->sc_drm_dev, flags); + if (error) { + aprint_error_dev(self, "unable to register drm: %d\n", error); + return; + } + sc->sc_dev_registered = true; while (!SIMPLEQ_EMPTY(&sc->sc_task_u.attach)) { struct radeon_task *const task = @@ -293,24 +312,25 @@ radeon_detach(device_t self, int flags) return error; if (sc->sc_task_state == RADEON_TASK_ATTACH) - goto out; + goto out0; if (sc->sc_task_u.workqueue != NULL) { workqueue_destroy(sc->sc_task_u.workqueue); sc->sc_task_u.workqueue = NULL; } if (sc->sc_drm_dev == NULL) - goto out; - /* XXX errno Linux->NetBSD */ - error = -drm_pci_detach(sc->sc_drm_dev, flags); - if (error) - /* XXX Kinda too late to fail now... */ - return error; + goto out0; + if (!sc->sc_pci_attached) + goto out1; + if (!sc->sc_dev_registered) + goto out2; + + drm_dev_unregister(sc->sc_drm_dev); +out2: drm_pci_detach(sc->sc_drm_dev); +out1: drm_dev_put(sc->sc_drm_dev); sc->sc_drm_dev = NULL; - -out: linux_pci_dev_destroy(&sc->sc_pci_dev); +out0: linux_pci_dev_destroy(&sc->sc_pci_dev); pmf_device_deregister(self); - return 0; }