aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRobin Murphy <robin.murphy@arm.com>2017-10-13 14:23:41 -0400
committerAlex Williamson <alex.williamson@redhat.com>2017-11-06 12:29:39 -0500
commite4efe4a9a2ace658a36b5a4f515c11d4d36400a8 (patch)
treeeb6f10f7c78becc383877c612e204017b6ebbdf8
parentb354c73edc7eb8d6ee643866e9e4de7842213b06 (diff)
iommu/ipmmu-vmsa: Clean up struct ipmmu_vmsa_iommu_priv
Now that the IPMMU instance pointer is the only thing remaining in the private data structure, we no longer need the extra level of indirection and can simply stash that directlty in the fwspec. Signed-off-by: Robin Murphy <robin.murphy@arm.com> Signed-off-by: Alex Williamson <alex.williamson@redhat.com>
-rw-r--r--drivers/iommu/ipmmu-vmsa.c36
1 files changed, 12 insertions, 24 deletions
diff --git a/drivers/iommu/ipmmu-vmsa.c b/drivers/iommu/ipmmu-vmsa.c
index 6e6a86f3c375..fd05a5f5a47e 100644
--- a/drivers/iommu/ipmmu-vmsa.c
+++ b/drivers/iommu/ipmmu-vmsa.c
@@ -58,16 +58,12 @@ struct ipmmu_vmsa_domain {
58 spinlock_t lock; /* Protects mappings */ 58 spinlock_t lock; /* Protects mappings */
59}; 59};
60 60
61struct ipmmu_vmsa_iommu_priv {
62 struct ipmmu_vmsa_device *mmu;
63};
64
65static struct ipmmu_vmsa_domain *to_vmsa_domain(struct iommu_domain *dom) 61static struct ipmmu_vmsa_domain *to_vmsa_domain(struct iommu_domain *dom)
66{ 62{
67 return container_of(dom, struct ipmmu_vmsa_domain, io_domain); 63 return container_of(dom, struct ipmmu_vmsa_domain, io_domain);
68} 64}
69 65
70static struct ipmmu_vmsa_iommu_priv *to_priv(struct device *dev) 66static struct ipmmu_vmsa_device *to_ipmmu(struct device *dev)
71{ 67{
72 return dev->iommu_fwspec ? dev->iommu_fwspec->iommu_priv : NULL; 68 return dev->iommu_fwspec ? dev->iommu_fwspec->iommu_priv : NULL;
73} 69}
@@ -565,15 +561,14 @@ static void ipmmu_domain_free(struct iommu_domain *io_domain)
565static int ipmmu_attach_device(struct iommu_domain *io_domain, 561static int ipmmu_attach_device(struct iommu_domain *io_domain,
566 struct device *dev) 562 struct device *dev)
567{ 563{
568 struct ipmmu_vmsa_iommu_priv *priv = to_priv(dev);
569 struct iommu_fwspec *fwspec = dev->iommu_fwspec; 564 struct iommu_fwspec *fwspec = dev->iommu_fwspec;
570 struct ipmmu_vmsa_device *mmu = priv->mmu; 565 struct ipmmu_vmsa_device *mmu = to_ipmmu(dev);
571 struct ipmmu_vmsa_domain *domain = to_vmsa_domain(io_domain); 566 struct ipmmu_vmsa_domain *domain = to_vmsa_domain(io_domain);
572 unsigned long flags; 567 unsigned long flags;
573 unsigned int i; 568 unsigned int i;
574 int ret = 0; 569 int ret = 0;
575 570
576 if (!priv || !priv->mmu) { 571 if (!mmu) {
577 dev_err(dev, "Cannot attach to IPMMU\n"); 572 dev_err(dev, "Cannot attach to IPMMU\n");
578 return -ENXIO; 573 return -ENXIO;
579 } 574 }
@@ -662,18 +657,12 @@ static int ipmmu_init_platform_device(struct device *dev,
662 struct of_phandle_args *args) 657 struct of_phandle_args *args)
663{ 658{
664 struct platform_device *ipmmu_pdev; 659 struct platform_device *ipmmu_pdev;
665 struct ipmmu_vmsa_iommu_priv *priv;
666 660
667 ipmmu_pdev = of_find_device_by_node(args->np); 661 ipmmu_pdev = of_find_device_by_node(args->np);
668 if (!ipmmu_pdev) 662 if (!ipmmu_pdev)
669 return -ENODEV; 663 return -ENODEV;
670 664
671 priv = kzalloc(sizeof(*priv), GFP_KERNEL); 665 dev->iommu_fwspec->iommu_priv = platform_get_drvdata(ipmmu_pdev);
672 if (!priv)
673 return -ENOMEM;
674
675 priv->mmu = platform_get_drvdata(ipmmu_pdev);
676 dev->iommu_fwspec->iommu_priv = priv;
677 return 0; 666 return 0;
678} 667}
679 668
@@ -683,7 +672,7 @@ static int ipmmu_of_xlate(struct device *dev,
683 iommu_fwspec_add_ids(dev, spec->args, 1); 672 iommu_fwspec_add_ids(dev, spec->args, 1);
684 673
685 /* Initialize once - xlate() will call multiple times */ 674 /* Initialize once - xlate() will call multiple times */
686 if (to_priv(dev)) 675 if (to_ipmmu(dev))
687 return 0; 676 return 0;
688 677
689 return ipmmu_init_platform_device(dev, spec); 678 return ipmmu_init_platform_device(dev, spec);
@@ -693,14 +682,14 @@ static int ipmmu_of_xlate(struct device *dev,
693 682
694static int ipmmu_add_device(struct device *dev) 683static int ipmmu_add_device(struct device *dev)
695{ 684{
696 struct ipmmu_vmsa_device *mmu = NULL; 685 struct ipmmu_vmsa_device *mmu = to_ipmmu(dev);
697 struct iommu_group *group; 686 struct iommu_group *group;
698 int ret; 687 int ret;
699 688
700 /* 689 /*
701 * Only let through devices that have been verified in xlate() 690 * Only let through devices that have been verified in xlate()
702 */ 691 */
703 if (!to_priv(dev)) 692 if (!mmu)
704 return -ENODEV; 693 return -ENODEV;
705 694
706 /* Create a device group and add the device to it. */ 695 /* Create a device group and add the device to it. */
@@ -729,7 +718,6 @@ static int ipmmu_add_device(struct device *dev)
729 * - Make the mapping size configurable ? We currently use a 2GB mapping 718 * - Make the mapping size configurable ? We currently use a 2GB mapping
730 * at a 1GB offset to ensure that NULL VAs will fault. 719 * at a 1GB offset to ensure that NULL VAs will fault.
731 */ 720 */
732 mmu = to_priv(dev)->mmu;
733 if (!mmu->mapping) { 721 if (!mmu->mapping) {
734 struct dma_iommu_mapping *mapping; 722 struct dma_iommu_mapping *mapping;
735 723
@@ -795,7 +783,7 @@ static int ipmmu_add_device_dma(struct device *dev)
795 /* 783 /*
796 * Only let through devices that have been verified in xlate() 784 * Only let through devices that have been verified in xlate()
797 */ 785 */
798 if (!to_priv(dev)) 786 if (!to_ipmmu(dev))
799 return -ENODEV; 787 return -ENODEV;
800 788
801 group = iommu_group_get_for_dev(dev); 789 group = iommu_group_get_for_dev(dev);
@@ -812,15 +800,15 @@ static void ipmmu_remove_device_dma(struct device *dev)
812 800
813static struct iommu_group *ipmmu_find_group(struct device *dev) 801static struct iommu_group *ipmmu_find_group(struct device *dev)
814{ 802{
815 struct ipmmu_vmsa_iommu_priv *priv = to_priv(dev); 803 struct ipmmu_vmsa_device *mmu = to_ipmmu(dev);
816 struct iommu_group *group; 804 struct iommu_group *group;
817 805
818 if (priv->mmu->group) 806 if (mmu->group)
819 return iommu_group_ref_get(priv->mmu->group); 807 return iommu_group_ref_get(mmu->group);
820 808
821 group = iommu_group_alloc(); 809 group = iommu_group_alloc();
822 if (!IS_ERR(group)) 810 if (!IS_ERR(group))
823 priv->mmu->group = group; 811 mmu->group = group;
824 812
825 return group; 813 return group;
826} 814}