From: Thierry Reding <tred...@nvidia.com>

The only reason why struct drm_bus is still around is because the
SETVERSION IOCTL calls a bus specific .set_busid() function. This commit
provides a fallback implementation if a device either doesn't have a bus
associated with it or if it doesn't implement .set_busid(). The bus ID
will be set to the device's name as returned by dev_name().

This can be useful to create DRM devices directly in drivers using the
drm_dev_alloc() and drm_dev_register() functions rather than going
through the bus-specific implementations, with the goal of eventually
getting rid of drm_bus entirely.

Signed-off-by: Thierry Reding <treding at nvidia.com>
---
 drivers/gpu/drm/drm_ioctl.c | 26 +++++++++++++++++++++++---
 1 file changed, 23 insertions(+), 3 deletions(-)

diff --git a/drivers/gpu/drm/drm_ioctl.c b/drivers/gpu/drm/drm_ioctl.c
index 93a42040bedb..d27134a94d69 100644
--- a/drivers/gpu/drm/drm_ioctl.c
+++ b/drivers/gpu/drm/drm_ioctl.c
@@ -122,6 +122,19 @@ err:
        return ret;
 }

+static int __drm_set_busid(struct drm_device *dev, struct drm_master *master)
+{
+       const char *name = dev_name(dev->dev);
+
+       master->unique = kstrdup(name, GFP_KERNEL);
+       if (!master->unique)
+               return -ENOMEM;
+
+       master->unique_len = strlen(name);
+
+       return 0;
+}
+
 static int drm_set_busid(struct drm_device *dev, struct drm_file *file_priv)
 {
        struct drm_master *master = file_priv->master;
@@ -130,9 +143,16 @@ static int drm_set_busid(struct drm_device *dev, struct 
drm_file *file_priv)
        if (master->unique != NULL)
                drm_unset_busid(dev, master);

-       ret = dev->driver->bus->set_busid(dev, master);
-       if (ret)
-               goto err;
+       if (dev->driver->bus && dev->driver->bus->set_busid) {
+               ret = dev->driver->bus->set_busid(dev, master);
+               if (ret)
+                       goto err;
+       } else {
+               ret = __drm_set_busid(dev, master);
+               if (ret)
+                       goto err;
+       }
+
        return 0;
 err:
        drm_unset_busid(dev, master);
-- 
1.9.1

Reply via email to