Skip to content

Commit

Permalink
drm: restrict the device list for shadow attached drivers
Browse files Browse the repository at this point in the history
There's really no need for the drm core to keep a list of all
devices of a given driver - the linux device model keeps perfect
track of this already for us.

The exception is old legacy ums drivers using pci shadow attaching.
So rename the lists to make the use case clearer and rip out everything
else.

v2: Rebase on top of David Herrmann's drm device register changes.
Also drop the bogus dev_set_drvdata for platform drivers that somehow
crept into the original version - drivers really should be in full
control of that field.

v3: Initialize driver->legacy_dev_list outside of the loop, spotted by
David Herrmann.

v4: Rebase on top of the newly created host1x drm_bus for tegra.

Cc: David Herrmann <[email protected]>
Signed-off-by: Daniel Vetter <[email protected]>
Signed-off-by: Dave Airlie <[email protected]>
  • Loading branch information
danvet authored and airlied committed Dec 18, 2013
1 parent e2577d4 commit b3f2333
Show file tree
Hide file tree
Showing 6 changed files with 13 additions and 12 deletions.
12 changes: 10 additions & 2 deletions drivers/gpu/drm/drm_pci.c
Original file line number Diff line number Diff line change
Expand Up @@ -346,6 +346,11 @@ int drm_get_pci_dev(struct pci_dev *pdev, const struct pci_device_id *ent,
driver->name, driver->major, driver->minor, driver->patchlevel,
driver->date, pci_name(pdev), dev->primary->index);

/* No locking needed since shadow-attach is single-threaded since it may
* only be called from the per-driver module init hook. */
if (!drm_core_check_feature(dev, DRIVER_MODESET))
list_add_tail(&dev->legacy_dev_list, &driver->legacy_dev_list);

return 0;

err_pci:
Expand Down Expand Up @@ -375,14 +380,14 @@ int drm_pci_init(struct drm_driver *driver, struct pci_driver *pdriver)

DRM_DEBUG("\n");

INIT_LIST_HEAD(&driver->device_list);
driver->kdriver.pci = pdriver;
driver->bus = &drm_pci_bus;

if (driver->driver_features & DRIVER_MODESET)
return pci_register_driver(pdriver);

/* If not using KMS, fall back to stealth mode manual scanning. */
INIT_LIST_HEAD(&driver->legacy_dev_list);
for (i = 0; pdriver->id_table[i].vendor != 0; i++) {
pid = &pdriver->id_table[i];

Expand Down Expand Up @@ -465,8 +470,11 @@ void drm_pci_exit(struct drm_driver *driver, struct pci_driver *pdriver)
if (driver->driver_features & DRIVER_MODESET) {
pci_unregister_driver(pdriver);
} else {
list_for_each_entry_safe(dev, tmp, &driver->device_list, driver_item)
list_for_each_entry_safe(dev, tmp, &driver->legacy_dev_list,
legacy_dev_list) {
drm_put_dev(dev);
list_del(&dev->legacy_dev_list);
}
}
DRM_INFO("Module unloaded\n");
}
Expand Down
1 change: 0 additions & 1 deletion drivers/gpu/drm/drm_platform.c
Original file line number Diff line number Diff line change
Expand Up @@ -147,7 +147,6 @@ int drm_platform_init(struct drm_driver *driver, struct platform_device *platfor

driver->kdriver.platform_device = platform_device;
driver->bus = &drm_platform_bus;
INIT_LIST_HEAD(&driver->device_list);
return drm_get_platform_dev(platform_device, driver);
}
EXPORT_SYMBOL(drm_platform_init);
4 changes: 0 additions & 4 deletions drivers/gpu/drm/drm_stub.c
Original file line number Diff line number Diff line change
Expand Up @@ -563,8 +563,6 @@ int drm_dev_register(struct drm_device *dev, unsigned long flags)
goto err_unload;
}

list_add_tail(&dev->driver_item, &dev->driver->device_list);

ret = 0;
goto out_unlock;

Expand Down Expand Up @@ -614,7 +612,5 @@ void drm_dev_unregister(struct drm_device *dev)
drm_unplug_minor(dev->control);
drm_unplug_minor(dev->render);
drm_unplug_minor(dev->primary);

list_del(&dev->driver_item);
}
EXPORT_SYMBOL(drm_dev_unregister);
1 change: 0 additions & 1 deletion drivers/gpu/drm/drm_usb.c
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,6 @@ int drm_usb_init(struct drm_driver *driver, struct usb_driver *udriver)
int res;
DRM_DEBUG("\n");

INIT_LIST_HEAD(&driver->device_list);
driver->kdriver.usb = udriver;
driver->bus = &drm_usb_bus;

Expand Down
1 change: 0 additions & 1 deletion drivers/gpu/drm/tegra/bus.c
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,6 @@ int drm_host1x_init(struct drm_driver *driver, struct host1x_device *device)
struct drm_device *drm;
int ret;

INIT_LIST_HEAD(&driver->device_list);
driver->bus = &drm_host1x_bus;

drm = drm_dev_alloc(driver, &device->dev);
Expand Down
6 changes: 3 additions & 3 deletions include/drm/drmP.h
Original file line number Diff line number Diff line change
Expand Up @@ -1012,8 +1012,8 @@ struct drm_driver {
} kdriver;
struct drm_bus *bus;

/* List of devices hanging off this driver */
struct list_head device_list;
/* List of devices hanging off this driver with stealth attach. */
struct list_head legacy_dev_list;
};

#define DRM_MINOR_UNASSIGNED 0
Expand Down Expand Up @@ -1102,7 +1102,7 @@ struct drm_vblank_crtc {
* may contain multiple heads.
*/
struct drm_device {
struct list_head driver_item; /**< list of devices per driver */
struct list_head legacy_dev_list;/**< list of devices per driver for stealth attach cleanup */
char *devname; /**< For /proc/interrupts */
int if_version; /**< Highest interface version set */

Expand Down

0 comments on commit b3f2333

Please sign in to comment.