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:
parent
f2c7c76c5d
commit
80eaa9f558
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue