|
@@ -59,7 +59,6 @@ struct iommu_cmd {
|
|
|
|
|
|
static int dma_ops_unity_map(struct dma_ops_domain *dma_dom,
|
|
|
struct unity_map_entry *e);
|
|
|
-static struct dma_ops_domain *find_protection_domain(u16 devid);
|
|
|
static u64 *alloc_pte(struct protection_domain *domain,
|
|
|
unsigned long address, int end_lvl,
|
|
|
u64 **pte_page, gfp_t gfp);
|
|
@@ -84,6 +83,34 @@ static inline u16 get_device_id(struct device *dev)
|
|
|
return calc_devid(pdev->bus->number, pdev->devfn);
|
|
|
}
|
|
|
|
|
|
+/*
|
|
|
+ * In this function the list of preallocated protection domains is traversed to
|
|
|
+ * find the domain for a specific device
|
|
|
+ */
|
|
|
+static struct dma_ops_domain *find_protection_domain(u16 devid)
|
|
|
+{
|
|
|
+ struct dma_ops_domain *entry, *ret = NULL;
|
|
|
+ unsigned long flags;
|
|
|
+ u16 alias = amd_iommu_alias_table[devid];
|
|
|
+
|
|
|
+ if (list_empty(&iommu_pd_list))
|
|
|
+ return NULL;
|
|
|
+
|
|
|
+ spin_lock_irqsave(&iommu_pd_list_lock, flags);
|
|
|
+
|
|
|
+ list_for_each_entry(entry, &iommu_pd_list, list) {
|
|
|
+ if (entry->target_dev == devid ||
|
|
|
+ entry->target_dev == alias) {
|
|
|
+ ret = entry;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ spin_unlock_irqrestore(&iommu_pd_list_lock, flags);
|
|
|
+
|
|
|
+ return ret;
|
|
|
+}
|
|
|
+
|
|
|
#ifdef CONFIG_AMD_IOMMU_STATS
|
|
|
|
|
|
/*
|
|
@@ -1455,34 +1482,6 @@ static bool check_device(struct device *dev)
|
|
|
return true;
|
|
|
}
|
|
|
|
|
|
-/*
|
|
|
- * In this function the list of preallocated protection domains is traversed to
|
|
|
- * find the domain for a specific device
|
|
|
- */
|
|
|
-static struct dma_ops_domain *find_protection_domain(u16 devid)
|
|
|
-{
|
|
|
- struct dma_ops_domain *entry, *ret = NULL;
|
|
|
- unsigned long flags;
|
|
|
- u16 alias = amd_iommu_alias_table[devid];
|
|
|
-
|
|
|
- if (list_empty(&iommu_pd_list))
|
|
|
- return NULL;
|
|
|
-
|
|
|
- spin_lock_irqsave(&iommu_pd_list_lock, flags);
|
|
|
-
|
|
|
- list_for_each_entry(entry, &iommu_pd_list, list) {
|
|
|
- if (entry->target_dev == devid ||
|
|
|
- entry->target_dev == alias) {
|
|
|
- ret = entry;
|
|
|
- break;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- spin_unlock_irqrestore(&iommu_pd_list_lock, flags);
|
|
|
-
|
|
|
- return ret;
|
|
|
-}
|
|
|
-
|
|
|
/*
|
|
|
* In the dma_ops path we only have the struct device. This function
|
|
|
* finds the corresponding IOMMU, the protection domain and the
|