]> xenbits.xensource.com Git - people/tklengyel/xen.git/commitdiff
xen/arm : smmuv3: Fix to handle multiple StreamIds per device.
authorRahul Singh <rahul.singh@arm.com>
Wed, 17 Feb 2021 10:05:14 +0000 (10:05 +0000)
committerJulien Grall <jgrall@amazon.com>
Fri, 19 Feb 2021 14:55:54 +0000 (14:55 +0000)
SMMUv3 driver does not handle multiple StreamId if the master device
supports more than one StreamID.

This bug was introduced when the driver was ported from Linux to XEN.
dt_device_set_protected(..) should be called from add_device(..) not
from the dt_xlate(..).

Move dt_device_set_protected(..) from dt_xlate(..) to add_device().

Signed-off-by: Rahul Singh <rahul.singh@arm.com>
Reviewed-by: Bertrand Marquis <bertrand.marquis@arm.com>
Reviewed-by: Stefano Stabellini <sstabellini@kernel.org>
xen/drivers/passthrough/arm/smmu-v3.c

index 914cdc1cf46aa9d052d19ec30daa47636eec18ad..53d150cdb6a058522510e9a71e77faa8b5ee2328 100644 (file)
@@ -2207,24 +2207,6 @@ static int arm_smmu_add_device(u8 devfn, struct device *dev)
         */
        arm_smmu_enable_pasid(master);
 
-       return 0;
-
-err_free_master:
-       xfree(master);
-       dev_iommu_priv_set(dev, NULL);
-       return ret;
-}
-
-static int arm_smmu_dt_xlate(struct device *dev,
-                               const struct dt_phandle_args *args)
-{
-       int ret;
-       struct iommu_fwspec *fwspec = dev_iommu_fwspec_get(dev);
-
-       ret = iommu_fwspec_add_ids(dev, args->args, 1);
-       if (ret)
-               return ret;
-
        if (dt_device_is_protected(dev_to_dt(dev))) {
                dev_err(dev, "Already added to SMMUv3\n");
                return -EEXIST;
@@ -2237,6 +2219,17 @@ static int arm_smmu_dt_xlate(struct device *dev,
                        dev_name(fwspec->iommu_dev), fwspec->num_ids);
 
        return 0;
+
+err_free_master:
+       xfree(master);
+       dev_iommu_priv_set(dev, NULL);
+       return ret;
+}
+
+static int arm_smmu_dt_xlate(struct device *dev,
+                               const struct dt_phandle_args *args)
+{
+       return iommu_fwspec_add_ids(dev, args->args, 1);
 }
 
 /* Probing and initialisation functions */