On 04/05/2012 02:42 AM, Thierry Reding wrote: > Hi, > > I have a device tree where I have a GART device and a DRM device which uses > the GART. The GART is implemented by an IOMMU driver (tegra-gart) and > requires the user device to be a child of the GART device (it explicitly > checks for this when the user device is attached).
Isn't this wrong? I would expect the device parent/child relationship to reflect the CPU-initiated register access bus topology. A device's interaction with an IOMMU is an aspect of a device's initiating accesses itself, not CPU-initiated register accesses. > I've tried two alternatives to achieve this: create the GART device in the > user driver's .probe() function and explicitly set the DRM device's parent > to the resulting platform device like so: > > gart = platform_device_alloc(...); > ... > pdev->dev.parent = &gart->dev; I guess that won't work when there's more than one device affected by the IOMMU? > The alternative is to use the device tree to look up the GART device node and > resolve it to the corresponding struct device: > > gart_node = of_parse_phandle(drm->dev->of_node, "gart-parent", 0); That seems more logical to me. > gart = bus_find_device(drm->dev->bus, NULL, gart_node, match_of_node); That part should probably be encapsulated into the IOMMU subsystem? In fact, even the of_parse_phandle should perhaps be hidden inside some IOMMU iommu_get() call, that can use DT as a data source, or some other data structure set up by board files. _______________________________________________ devicetree-discuss mailing list devicetree-discuss@lists.ozlabs.org https://lists.ozlabs.org/listinfo/devicetree-discuss