|
|
@@ -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);
|