From: Joerg Roedel <[email protected]>

A device that might be used for HSA needs to be in a direct
mapped domain so that all DMA-API mappings stay alive when
the IOMMUv2 stack is used.

Signed-off-by: Joerg Roedel <[email protected]>
---
 drivers/iommu/amd_iommu.c | 15 ++++++++++++++-
 1 file changed, 14 insertions(+), 1 deletion(-)

diff --git a/drivers/iommu/amd_iommu.c b/drivers/iommu/amd_iommu.c
index 33bbb4d..8682786 100644
--- a/drivers/iommu/amd_iommu.c
+++ b/drivers/iommu/amd_iommu.c
@@ -2253,6 +2253,8 @@ static void detach_device(struct device *dev)
 
 static int amd_iommu_add_device(struct device *dev)
 {
+       struct iommu_dev_data *dev_data;
+       struct iommu_domain *domain;
        struct amd_iommu *iommu;
        u16 devid;
        int ret;
@@ -2270,7 +2272,18 @@ static int amd_iommu_add_device(struct device *dev)
        }
        init_iommu_group(dev);
 
-       dev->archdata.dma_ops = &amd_iommu_dma_ops;
+       dev_data = get_dev_data(dev);
+       if (dev_data && dev_data->iommu_v2)
+               iommu_request_dm_for_dev(dev);
+
+       /* Domains are initialized for this device - have a look what we ended 
up with */
+       domain = iommu_get_domain_for_dev(dev);
+       if (domain->type == IOMMU_DOMAIN_IDENTITY) {
+               dev_data->passthrough = true;
+               dev->archdata.dma_ops = &nommu_dma_ops;
+       } else {
+               dev->archdata.dma_ops = &amd_iommu_dma_ops;
+       }
 
 out:
        iommu_completion_wait(iommu);
-- 
1.9.1

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to