diff options
author | Joerg Roedel <jroedel@suse.de> | 2017-02-01 12:11:36 -0500 |
---|---|---|
committer | Joerg Roedel <jroedel@suse.de> | 2017-02-10 07:44:57 -0500 |
commit | 9648cbc9625b67c91ed1aaf4b8b77f3f0c537496 (patch) | |
tree | 59a37f9c5ecd841b23c084b109f3120f8eaadc9c /drivers/iommu/arm-smmu-v3.c | |
parent | c73e1ac8b2bc6ab18d9f9a96b17ee7388b49a0c0 (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.c | 22 |
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 |