On 1/6/22 11:35 PM, Jason Gunthorpe wrote:
On Thu, Jan 06, 2022 at 10:20:51AM +0800, Lu Baolu wrote:
Ordinary drivers should use iommu_attach/detach_device() for domain
attaching and detaching.
Signed-off-by: Lu Baolu <baolu.lu@xxxxxxxxxxxxxxx>
drivers/gpu/host1x/dev.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/drivers/gpu/host1x/dev.c b/drivers/gpu/host1x/dev.c
index fbb6447b8659..6e08cb6202cc 100644
+++ b/drivers/gpu/host1x/dev.c
@@ -265,7 +265,7 @@ static struct iommu_domain *host1x_iommu_attach(struct host1x *host)
goto put_cache;
}
- err = iommu_attach_group(host->domain, host->group);
+ err = iommu_attach_device(host->domain, host->dev);
if (err) {
if (err == -ENODEV)
err = 0;
@@ -335,7 +335,7 @@ static void host1x_iommu_exit(struct host1x *host)
{
if (host->domain) {
put_iova_domain(&host->iova);
- iommu_detach_group(host->domain, host->group);
+ iommu_detach_device(host->domain, host->dev);
iommu_domain_free(host->domain);
host->domain = NULL;
Shouldn't this add the flag to tegra_host1x_driver ?
This is called for a single driver. The call trace looks like below:
static struct platform_driver tegra_host1x_driver = {
.driver = {
.name = "tegra-host1x",
.of_match_table = host1x_of_match,
},
.probe = host1x_probe,
.remove = host1x_remove,
};
host1x_probe(dev)
->host1x_iommu_init(host) //host is a wrapper of dev
-->host1x_iommu_attach(host)
---->iommu_group_get(host->dev)
iommu_domain_alloc(&platform_bus_type)
iommu_attach_group(domain, group);
It seems that the existing code only works for singleton group.
And do like we did in the other tegra stuff and switch to the dma api
when !host1x_wants_iommu() ?
Jason
Best regards,
baolu