iommu/ipmmu-vmsa: Link IOMMUs and devices in sysfs

As of commit 7af9a5fdb9 ("iommu/ipmmu-vmsa: Use
iommu_device_sysfs_add()/remove()"), IOMMU devices show up under
/sys/class/iommu/, but their "devices" subdirectories are empty.
Likewise, devices tied to an IOMMU do not have an "iommu" backlink.

Make sure all links are created, on both arm32 and arm64.

Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be>
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: Yoshihiro Shimoda <yoshihiro.shimoda.uh@renesas.com>
Tested-by: Yoshihiro Shimoda <yoshihiro.shimoda.uh@renesas.com>
Signed-off-by: Joerg Roedel <jroedel@suse.de>
This commit is contained in:
Geert Uytterhoeven 2019-05-27 13:52:48 +02:00 committed by Joerg Roedel
parent f2c7c76c5d
commit 80eaa9f558
1 changed files with 17 additions and 7 deletions

View File

@ -885,27 +885,37 @@ error:
static int ipmmu_add_device(struct device *dev) static int ipmmu_add_device(struct device *dev)
{ {
struct ipmmu_vmsa_device *mmu = to_ipmmu(dev);
struct iommu_group *group; struct iommu_group *group;
int ret;
/* /*
* Only let through devices that have been verified in xlate() * Only let through devices that have been verified in xlate()
*/ */
if (!to_ipmmu(dev)) if (!mmu)
return -ENODEV; return -ENODEV;
if (IS_ENABLED(CONFIG_ARM) && !IS_ENABLED(CONFIG_IOMMU_DMA)) if (IS_ENABLED(CONFIG_ARM) && !IS_ENABLED(CONFIG_IOMMU_DMA)) {
return ipmmu_init_arm_mapping(dev); ret = ipmmu_init_arm_mapping(dev);
if (ret)
return ret;
} else {
group = iommu_group_get_for_dev(dev);
if (IS_ERR(group))
return PTR_ERR(group);
group = iommu_group_get_for_dev(dev); iommu_group_put(group);
if (IS_ERR(group)) }
return PTR_ERR(group);
iommu_group_put(group); iommu_device_link(&mmu->iommu, dev);
return 0; return 0;
} }
static void ipmmu_remove_device(struct device *dev) static void ipmmu_remove_device(struct device *dev)
{ {
struct ipmmu_vmsa_device *mmu = to_ipmmu(dev);
iommu_device_unlink(&mmu->iommu, dev);
arm_iommu_detach_device(dev); arm_iommu_detach_device(dev);
iommu_group_remove_device(dev); iommu_group_remove_device(dev);
} }