Re: [PATCH 15/15] drm: Upcast struct drm_device.dev to struct pci_device; replace pdev
Hi Thomas, On Tue, Nov 24, 2020 at 12:38:24PM +0100, Thomas Zimmermann wrote: > We have DRM drivers based on USB, SPI and platform devices. All of them > are fine with storing their device reference in struct drm_device.dev. > PCI devices should be no exception. Therefore struct drm_device.pdev is > deprecated. > > Instead upcast from struct drm_device.dev with to_pci_dev(). PCI-specific > code can use dev_is_pci() to test for a PCI device. This patch changes > the DRM core code and documentation accordingly. Struct drm_device.pdev > is being moved to legacy status. > > Signed-off-by: Thomas Zimmermann > --- > drivers/gpu/drm/drm_agpsupport.c | 9 ++--- > drivers/gpu/drm/drm_bufs.c | 4 ++-- > drivers/gpu/drm/drm_edid.c | 7 ++- > drivers/gpu/drm/drm_irq.c| 12 +++- > drivers/gpu/drm/drm_pci.c| 26 +++--- > drivers/gpu/drm/drm_vm.c | 2 +- > include/drm/drm_device.h | 12 +--- > 7 files changed, 46 insertions(+), 26 deletions(-) > > diff --git a/drivers/gpu/drm/drm_agpsupport.c > b/drivers/gpu/drm/drm_agpsupport.c > index 4c7ad46fdd21..a4040fe4f4ba 100644 > --- a/drivers/gpu/drm/drm_agpsupport.c > +++ b/drivers/gpu/drm/drm_agpsupport.c > @@ -103,11 +103,13 @@ int drm_agp_info_ioctl(struct drm_device *dev, void > *data, > */ > int drm_agp_acquire(struct drm_device *dev) > { > + struct pci_dev *pdev = to_pci_dev(dev->dev); > + > if (!dev->agp) > return -ENODEV; > if (dev->agp->acquired) > return -EBUSY; > - dev->agp->bridge = agp_backend_acquire(dev->pdev); > + dev->agp->bridge = agp_backend_acquire(pdev); > if (!dev->agp->bridge) > return -ENODEV; > dev->agp->acquired = 1; > @@ -402,14 +404,15 @@ int drm_agp_free_ioctl(struct drm_device *dev, void > *data, > */ > struct drm_agp_head *drm_agp_init(struct drm_device *dev) > { > + struct pci_dev *pdev = to_pci_dev(dev->dev); > struct drm_agp_head *head = NULL; > > head = kzalloc(sizeof(*head), GFP_KERNEL); > if (!head) > return NULL; > - head->bridge = agp_find_bridge(dev->pdev); > + head->bridge = agp_find_bridge(pdev); > if (!head->bridge) { > - head->bridge = agp_backend_acquire(dev->pdev); > + head->bridge = agp_backend_acquire(pdev); > if (!head->bridge) { > kfree(head); > return NULL; > diff --git a/drivers/gpu/drm/drm_bufs.c b/drivers/gpu/drm/drm_bufs.c > index 7a01d0918861..1da8b360b60a 100644 > --- a/drivers/gpu/drm/drm_bufs.c > +++ b/drivers/gpu/drm/drm_bufs.c > @@ -325,7 +325,7 @@ static int drm_addmap_core(struct drm_device *dev, > resource_size_t offset, >* As we're limiting the address to 2^32-1 (or less), >* casting it down to 32 bits is no problem, but we >* need to point to a 64bit variable first. */ > - map->handle = dma_alloc_coherent(>pdev->dev, > + map->handle = dma_alloc_coherent(dev->dev, >map->size, >>offset, >GFP_KERNEL); > @@ -555,7 +555,7 @@ int drm_legacy_rmmap_locked(struct drm_device *dev, > struct drm_local_map *map) > case _DRM_SCATTER_GATHER: > break; > case _DRM_CONSISTENT: > - dma_free_coherent(>pdev->dev, > + dma_free_coherent(dev->dev, > map->size, > map->handle, > map->offset); > diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c > index 74f5a3197214..555a04ce2179 100644 > --- a/drivers/gpu/drm/drm_edid.c > +++ b/drivers/gpu/drm/drm_edid.c > @@ -32,6 +32,7 @@ > #include > #include > #include > +#include > #include > #include > > @@ -2075,9 +2076,13 @@ EXPORT_SYMBOL(drm_get_edid); > struct edid *drm_get_edid_switcheroo(struct drm_connector *connector, >struct i2c_adapter *adapter) > { > - struct pci_dev *pdev = connector->dev->pdev; > + struct drm_device *dev = connector->dev; > + struct pci_dev *pdev = to_pci_dev(dev->dev); > struct edid *edid; Maybe add a comment that explain why this can trigger - so people are helped it they are catched by this. As it is now it is not even mentioned in the changelog. > + if (drm_WARN_ON_ONCE(dev, !dev_is_pci(dev->dev))) > + return NULL; > + > vga_switcheroo_lock_ddc(pdev); > edid = drm_get_edid(connector, adapter); > vga_switcheroo_unlock_ddc(pdev); > diff --git a/drivers/gpu/drm/drm_irq.c b/drivers/gpu/drm/drm_irq.c > index 09d6e9e2e075..22986a9a593b 100644 > --- a/drivers/gpu/drm/drm_irq.c > +++ b/drivers/gpu/drm/drm_irq.c > @@ -122,7 +122,7 @@ int drm_irq_install(struct drm_device *dev, int
[PATCH 15/15] drm: Upcast struct drm_device.dev to struct pci_device; replace pdev
We have DRM drivers based on USB, SPI and platform devices. All of them are fine with storing their device reference in struct drm_device.dev. PCI devices should be no exception. Therefore struct drm_device.pdev is deprecated. Instead upcast from struct drm_device.dev with to_pci_dev(). PCI-specific code can use dev_is_pci() to test for a PCI device. This patch changes the DRM core code and documentation accordingly. Struct drm_device.pdev is being moved to legacy status. Signed-off-by: Thomas Zimmermann --- drivers/gpu/drm/drm_agpsupport.c | 9 ++--- drivers/gpu/drm/drm_bufs.c | 4 ++-- drivers/gpu/drm/drm_edid.c | 7 ++- drivers/gpu/drm/drm_irq.c| 12 +++- drivers/gpu/drm/drm_pci.c| 26 +++--- drivers/gpu/drm/drm_vm.c | 2 +- include/drm/drm_device.h | 12 +--- 7 files changed, 46 insertions(+), 26 deletions(-) diff --git a/drivers/gpu/drm/drm_agpsupport.c b/drivers/gpu/drm/drm_agpsupport.c index 4c7ad46fdd21..a4040fe4f4ba 100644 --- a/drivers/gpu/drm/drm_agpsupport.c +++ b/drivers/gpu/drm/drm_agpsupport.c @@ -103,11 +103,13 @@ int drm_agp_info_ioctl(struct drm_device *dev, void *data, */ int drm_agp_acquire(struct drm_device *dev) { + struct pci_dev *pdev = to_pci_dev(dev->dev); + if (!dev->agp) return -ENODEV; if (dev->agp->acquired) return -EBUSY; - dev->agp->bridge = agp_backend_acquire(dev->pdev); + dev->agp->bridge = agp_backend_acquire(pdev); if (!dev->agp->bridge) return -ENODEV; dev->agp->acquired = 1; @@ -402,14 +404,15 @@ int drm_agp_free_ioctl(struct drm_device *dev, void *data, */ struct drm_agp_head *drm_agp_init(struct drm_device *dev) { + struct pci_dev *pdev = to_pci_dev(dev->dev); struct drm_agp_head *head = NULL; head = kzalloc(sizeof(*head), GFP_KERNEL); if (!head) return NULL; - head->bridge = agp_find_bridge(dev->pdev); + head->bridge = agp_find_bridge(pdev); if (!head->bridge) { - head->bridge = agp_backend_acquire(dev->pdev); + head->bridge = agp_backend_acquire(pdev); if (!head->bridge) { kfree(head); return NULL; diff --git a/drivers/gpu/drm/drm_bufs.c b/drivers/gpu/drm/drm_bufs.c index 7a01d0918861..1da8b360b60a 100644 --- a/drivers/gpu/drm/drm_bufs.c +++ b/drivers/gpu/drm/drm_bufs.c @@ -325,7 +325,7 @@ static int drm_addmap_core(struct drm_device *dev, resource_size_t offset, * As we're limiting the address to 2^32-1 (or less), * casting it down to 32 bits is no problem, but we * need to point to a 64bit variable first. */ - map->handle = dma_alloc_coherent(>pdev->dev, + map->handle = dma_alloc_coherent(dev->dev, map->size, >offset, GFP_KERNEL); @@ -555,7 +555,7 @@ int drm_legacy_rmmap_locked(struct drm_device *dev, struct drm_local_map *map) case _DRM_SCATTER_GATHER: break; case _DRM_CONSISTENT: - dma_free_coherent(>pdev->dev, + dma_free_coherent(dev->dev, map->size, map->handle, map->offset); diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c index 74f5a3197214..555a04ce2179 100644 --- a/drivers/gpu/drm/drm_edid.c +++ b/drivers/gpu/drm/drm_edid.c @@ -32,6 +32,7 @@ #include #include #include +#include #include #include @@ -2075,9 +2076,13 @@ EXPORT_SYMBOL(drm_get_edid); struct edid *drm_get_edid_switcheroo(struct drm_connector *connector, struct i2c_adapter *adapter) { - struct pci_dev *pdev = connector->dev->pdev; + struct drm_device *dev = connector->dev; + struct pci_dev *pdev = to_pci_dev(dev->dev); struct edid *edid; + if (drm_WARN_ON_ONCE(dev, !dev_is_pci(dev->dev))) + return NULL; + vga_switcheroo_lock_ddc(pdev); edid = drm_get_edid(connector, adapter); vga_switcheroo_unlock_ddc(pdev); diff --git a/drivers/gpu/drm/drm_irq.c b/drivers/gpu/drm/drm_irq.c index 09d6e9e2e075..22986a9a593b 100644 --- a/drivers/gpu/drm/drm_irq.c +++ b/drivers/gpu/drm/drm_irq.c @@ -122,7 +122,7 @@ int drm_irq_install(struct drm_device *dev, int irq) dev->driver->irq_preinstall(dev); /* PCI devices require shared interrupts. */ - if (dev->pdev) + if (dev_is_pci(dev->dev)) sh_flags = IRQF_SHARED; ret = request_irq(irq, dev->driver->irq_handler, @@ -140,7 +140,7 @@ int drm_irq_install(struct drm_device *dev, int irq) if (ret < 0) {