From mboxrd@z Thu Jan 1 00:00:00 1970 From: Stephen Warren Subject: Re: Reparenting a platform device Date: Thu, 05 Apr 2012 12:36:55 -0600 Message-ID: <4F7DE647.7060409@wwwdotorg.org> References: <20120405084258.GA19798@avionic-0098.adnet.avionic-design.de> <4F7DBCEE.9080400@wwwdotorg.org> <20120405162318.GA10628@avionic-0098.adnet.avionic-design.de> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Return-path: In-Reply-To: <20120405162318.GA10628-RM9K5IK7kjIyiCvfTdI0JKcOhU4Rzj621B7CTYaBSLdn68oJJulU0Q@public.gmane.org> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: iommu-bounces-cunTk1MwBs9QetFLy7KEm3xJsTq8ys+cHZ5vskTnxNA@public.gmane.org Errors-To: iommu-bounces-cunTk1MwBs9QetFLy7KEm3xJsTq8ys+cHZ5vskTnxNA@public.gmane.org To: Thierry Reding Cc: devicetree-discuss-uLR06cmDAlY/bJ5BZ2RsiQ@public.gmane.org, iommu-cunTk1MwBs9QetFLy7KEm3xJsTq8ys+cHZ5vskTnxNA@public.gmane.org List-Id: devicetree@vger.kernel.org On 04/05/2012 10:23 AM, Thierry Reding wrote: > * Stephen Warren wrote: >> 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. > > Actually I have no idea why this was made a requirement. Maybe Hiroshi can > comment on this. The driver really only needs this to basically obtain a > pointer to itself. The MSM I/O MMU implementation does something similar, > though, and goes on to register actual child devices (they are instantiated > in arch/arm/mach-msm/devices-iommu.c). Each of those devices is then assigned > a specific memory area it seems. > >>> 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? > > I don't think having more than one device using the IOMMU will work properly > anyway in the context of the Tegra GART driver because there is not means to > allocate specific regions of the GART aperture to individual devices. So > really the one and only client actually needs to manage the allocations from > the GART aperture. > > I'm also not sure if it makes much sense to use the GART from anything other > than the DRM driver. I was thinking about this mostly from a Tegra30 perspective, where there are multiple devices affected by the SMMU, which is more capable that the Tegra20 GART, and can presumably support these multiple clients pretty independently. For Tegra20, I wouldn't be surprised if the DRM driver was the only client.