summaryrefslogtreecommitdiffstats
path: root/drivers/iommu/arm-smmu-v3.c
diff options
context:
space:
mode:
authorJoerg Roedel <jroedel@suse.de>2017-02-01 12:11:36 -0500
committerJoerg Roedel <jroedel@suse.de>2017-02-10 07:44:57 -0500
commit9648cbc9625b67c91ed1aaf4b8b77f3f0c537496 (patch)
tree59a37f9c5ecd841b23c084b109f3120f8eaadc9c /drivers/iommu/arm-smmu-v3.c
parentc73e1ac8b2bc6ab18d9f9a96b17ee7388b49a0c0 (diff)
iommu/arm-smmu: Make use of the iommu_register interface
Also add the smmu devices to sysfs. Signed-off-by: Joerg Roedel <jroedel@suse.de>
Diffstat (limited to 'drivers/iommu/arm-smmu-v3.c')
-rw-r--r--drivers/iommu/arm-smmu-v3.c22
1 files changed, 21 insertions, 1 deletions
diff --git a/drivers/iommu/arm-smmu-v3.c b/drivers/iommu/arm-smmu-v3.c
index 4d6ec444a9d6..32133e289ff6 100644
--- a/drivers/iommu/arm-smmu-v3.c
+++ b/drivers/iommu/arm-smmu-v3.c
@@ -616,6 +616,9 @@ struct arm_smmu_device {
616 unsigned int sid_bits; 616 unsigned int sid_bits;
617 617
618 struct arm_smmu_strtab_cfg strtab_cfg; 618 struct arm_smmu_strtab_cfg strtab_cfg;
619
620 /* IOMMU core code handle */
621 struct iommu_device iommu;
619}; 622};
620 623
621/* SMMU private data for each master */ 624/* SMMU private data for each master */
@@ -1795,8 +1798,10 @@ static int arm_smmu_add_device(struct device *dev)
1795 } 1798 }
1796 1799
1797 group = iommu_group_get_for_dev(dev); 1800 group = iommu_group_get_for_dev(dev);
1798 if (!IS_ERR(group)) 1801 if (!IS_ERR(group)) {
1799 iommu_group_put(group); 1802 iommu_group_put(group);
1803 iommu_device_link(&smmu->iommu, dev);
1804 }
1800 1805
1801 return PTR_ERR_OR_ZERO(group); 1806 return PTR_ERR_OR_ZERO(group);
1802} 1807}
@@ -1805,14 +1810,17 @@ static void arm_smmu_remove_device(struct device *dev)
1805{ 1810{
1806 struct iommu_fwspec *fwspec = dev->iommu_fwspec; 1811 struct iommu_fwspec *fwspec = dev->iommu_fwspec;
1807 struct arm_smmu_master_data *master; 1812 struct arm_smmu_master_data *master;
1813 struct arm_smmu_device *smmu;
1808 1814
1809 if (!fwspec || fwspec->ops != &arm_smmu_ops) 1815 if (!fwspec || fwspec->ops != &arm_smmu_ops)
1810 return; 1816 return;
1811 1817
1812 master = fwspec->iommu_priv; 1818 master = fwspec->iommu_priv;
1819 smmu = master->smmu;
1813 if (master && master->ste.valid) 1820 if (master && master->ste.valid)
1814 arm_smmu_detach_dev(dev); 1821 arm_smmu_detach_dev(dev);
1815 iommu_group_remove_device(dev); 1822 iommu_group_remove_device(dev);
1823 iommu_device_unlink(&smmu->iommu, dev);
1816 kfree(master); 1824 kfree(master);
1817 iommu_fwspec_free(dev); 1825 iommu_fwspec_free(dev);
1818} 1826}
@@ -2613,6 +2621,7 @@ static int arm_smmu_device_probe(struct platform_device *pdev)
2613{ 2621{
2614 int irq, ret; 2622 int irq, ret;
2615 struct resource *res; 2623 struct resource *res;
2624 resource_size_t ioaddr;
2616 struct arm_smmu_device *smmu; 2625 struct arm_smmu_device *smmu;
2617 struct device *dev = &pdev->dev; 2626 struct device *dev = &pdev->dev;
2618 bool bypass; 2627 bool bypass;
@@ -2630,6 +2639,7 @@ static int arm_smmu_device_probe(struct platform_device *pdev)
2630 dev_err(dev, "MMIO region too small (%pr)\n", res); 2639 dev_err(dev, "MMIO region too small (%pr)\n", res);
2631 return -EINVAL; 2640 return -EINVAL;
2632 } 2641 }
2642 ioaddr = res->start;
2633 2643
2634 smmu->base = devm_ioremap_resource(dev, res); 2644 smmu->base = devm_ioremap_resource(dev, res);
2635 if (IS_ERR(smmu->base)) 2645 if (IS_ERR(smmu->base))
@@ -2682,6 +2692,16 @@ static int arm_smmu_device_probe(struct platform_device *pdev)
2682 return ret; 2692 return ret;
2683 2693
2684 /* And we're up. Go go go! */ 2694 /* And we're up. Go go go! */
2695 ret = iommu_device_sysfs_add(&smmu->iommu, dev, NULL,
2696 "smmu3.%pa", &ioaddr);
2697 if (ret)
2698 return ret;
2699
2700 iommu_device_set_ops(&smmu->iommu, &arm_smmu_ops);
2701 iommu_device_set_fwnode(&smmu->iommu, dev->fwnode);
2702
2703 ret = iommu_device_register(&smmu->iommu);
2704
2685 iommu_register_instance(dev->fwnode, &arm_smmu_ops); 2705 iommu_register_instance(dev->fwnode, &arm_smmu_ops);
2686 2706
2687#ifdef CONFIG_PCI 2707#ifdef CONFIG_PCI