Skip to content

Commit

Permalink
gpu: host1x: Do not link logical devices to DT nodes
Browse files Browse the repository at this point in the history
Logical devices created by the host1x bus infrastructure don't need to
be associated with a device tree node. Doing so will cause the driver
core to attempt to hook up IOMMU operations and fail because it is not
a real device.

However, for backwards-compatibility, we need to provide various OF_*
uevent variables that were previously provided by of_device_uevent() and
which are parsed by libdrm in userspace when querying the available
devices. Do this by implementing a uevent callback for the host1x bus.

Signed-off-by: Thierry Reding <treding@nvidia.com>
  • Loading branch information
Thierry Reding committed Jun 5, 2019
1 parent 1e39047 commit 31fa25f
Showing 1 changed file with 31 additions and 1 deletion.
32 changes: 31 additions & 1 deletion drivers/gpu/host1x/bus.c
Original file line number Diff line number Diff line change
Expand Up @@ -316,6 +316,36 @@ static int host1x_device_match(struct device *dev, struct device_driver *drv)
return strcmp(dev_name(dev), drv->name) == 0;
}

static int host1x_device_uevent(struct device *dev,
struct kobj_uevent_env *env)
{
struct device_node *np = dev->parent->of_node;
unsigned int count = 0;
struct property *p;
const char *compat;

/*
* This duplicates most of of_device_uevent(), but the latter cannot
* be called from modules and operates on dev->of_node, which is not
* available in this case.
*
* Note that this is really only needed for backwards compatibility
* with libdrm, which parses this information from sysfs and will
* fail if it can't find the OF_FULLNAME, specifically.
*/
add_uevent_var(env, "OF_NAME=%pOFn", np);
add_uevent_var(env, "OF_FULLNAME=%pOF", np);

of_property_for_each_string(np, "compatible", p, compat) {
add_uevent_var(env, "OF_COMPATIBLE_%u=%s", count, compat);
count++;
}

add_uevent_var(env, "OF_COMPATIBLE_N=%u", count);

return 0;
}

static int host1x_dma_configure(struct device *dev)
{
return of_dma_configure(dev, dev->of_node, true);
Expand All @@ -333,6 +363,7 @@ static const struct dev_pm_ops host1x_device_pm_ops = {
struct bus_type host1x_bus_type = {
.name = "host1x",
.match = host1x_device_match,
.uevent = host1x_device_uevent,
.dma_configure = host1x_dma_configure,
.pm = &host1x_device_pm_ops,
};
Expand Down Expand Up @@ -419,7 +450,6 @@ static int host1x_device_add(struct host1x *host1x,
device->dev.dma_mask = &device->dev.coherent_dma_mask;
dev_set_name(&device->dev, "%s", driver->driver.name);
device->dev.release = host1x_device_release;
device->dev.of_node = host1x->dev->of_node;
device->dev.bus = &host1x_bus_type;
device->dev.parent = host1x->dev;

Expand Down

0 comments on commit 31fa25f

Please sign in to comment.