[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-devel] [PATCH 1/7] xen/arm: SMMU: Implement the add_device callback in SMMU



This add_device callback function is taking care of adding a device
to SMMU and make sure it is fully prepare to be used by the SMMU
afterwards.

In previous code, we don't implement the add_device callback in
iommu_ops for ARM SMMU. We placed the work of add_device to
assign_device callback. The function assign_device should not care
about adding the device to an iommu_group. It might not even be
able to decide how to do that. In this patch, we move this work
back to add_device callback.

This add_device callback is only called while we are handling all
devices for constructing the Domain0.

Signed-off-by: Wei Chen <Wei.Chen@xxxxxxx>
---
 xen/drivers/passthrough/arm/smmu.c | 34 +++++++++++++++++++++++-----------
 1 file changed, 23 insertions(+), 11 deletions(-)

diff --git a/xen/drivers/passthrough/arm/smmu.c 
b/xen/drivers/passthrough/arm/smmu.c
index 74c09b0..2efa52d 100644
--- a/xen/drivers/passthrough/arm/smmu.c
+++ b/xen/drivers/passthrough/arm/smmu.c
@@ -2591,6 +2591,26 @@ static void arm_smmu_destroy_iommu_domain(struct 
iommu_domain *domain)
        xfree(domain);
 }
 
+static int arm_smmu_xen_add_device(u8 devfn, struct device*dev)
+{
+       if (dt_device_is_protected(dev->of_node)) {
+               if (!dev->archdata.iommu) {
+                       dev->archdata.iommu = xzalloc(struct 
arm_smmu_xen_device);
+                       if (!dev->archdata.iommu)
+                               return -ENOMEM;
+               }
+
+               if (!dev_iommu_group(dev))
+                       return arm_smmu_add_device(dev);
+       }
+
+       /*
+        * Return 0 if the device is not protected to follow the behavior
+        * of PCI add device.
+        */
+       return 0;
+}
+
 static int arm_smmu_assign_dev(struct domain *d, u8 devfn,
                               struct device *dev, u32 flag)
 {
@@ -2600,17 +2620,8 @@ static int arm_smmu_assign_dev(struct domain *d, u8 
devfn,
 
        xen_domain = dom_iommu(d)->arch.priv;
 
-       if (!dev->archdata.iommu) {
-               dev->archdata.iommu = xzalloc(struct arm_smmu_xen_device);
-               if (!dev->archdata.iommu)
-                       return -ENOMEM;
-       }
-
-       if (!dev_iommu_group(dev)) {
-               ret = arm_smmu_add_device(dev);
-               if (ret)
-                       return ret;
-       }
+       if (!dev_iommu_group(dev))
+           return -ENODEV;
 
        spin_lock(&xen_domain->lock);
 
@@ -2784,6 +2795,7 @@ static const struct iommu_ops arm_smmu_iommu_ops = {
     .teardown = arm_smmu_iommu_domain_teardown,
     .iotlb_flush = arm_smmu_iotlb_flush,
     .iotlb_flush_all = arm_smmu_iotlb_flush_all,
+    .add_device = arm_smmu_xen_add_device,
     .assign_device = arm_smmu_assign_dev,
     .reassign_device = arm_smmu_reassign_dev,
     .map_page = arm_smmu_map_page,
-- 
2.7.4


_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
https://lists.xen.org/xen-devel

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.