|
@@ -412,6 +412,9 @@
|
|
/* High-level queue structures */
|
|
/* High-level queue structures */
|
|
#define ARM_SMMU_POLL_TIMEOUT_US 100
|
|
#define ARM_SMMU_POLL_TIMEOUT_US 100
|
|
|
|
|
|
|
|
+#define MSI_IOVA_BASE 0x8000000
|
|
|
|
+#define MSI_IOVA_LENGTH 0x100000
|
|
|
|
+
|
|
static bool disable_bypass;
|
|
static bool disable_bypass;
|
|
module_param_named(disable_bypass, disable_bypass, bool, S_IRUGO);
|
|
module_param_named(disable_bypass, disable_bypass, bool, S_IRUGO);
|
|
MODULE_PARM_DESC(disable_bypass,
|
|
MODULE_PARM_DESC(disable_bypass,
|
|
@@ -1883,6 +1886,29 @@ static int arm_smmu_of_xlate(struct device *dev, struct of_phandle_args *args)
|
|
return iommu_fwspec_add_ids(dev, args->args, 1);
|
|
return iommu_fwspec_add_ids(dev, args->args, 1);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+static void arm_smmu_get_resv_regions(struct device *dev,
|
|
|
|
+ struct list_head *head)
|
|
|
|
+{
|
|
|
|
+ struct iommu_resv_region *region;
|
|
|
|
+ int prot = IOMMU_WRITE | IOMMU_NOEXEC | IOMMU_MMIO;
|
|
|
|
+
|
|
|
|
+ region = iommu_alloc_resv_region(MSI_IOVA_BASE, MSI_IOVA_LENGTH,
|
|
|
|
+ prot, IOMMU_RESV_MSI);
|
|
|
|
+ if (!region)
|
|
|
|
+ return;
|
|
|
|
+
|
|
|
|
+ list_add_tail(®ion->list, head);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+static void arm_smmu_put_resv_regions(struct device *dev,
|
|
|
|
+ struct list_head *head)
|
|
|
|
+{
|
|
|
|
+ struct iommu_resv_region *entry, *next;
|
|
|
|
+
|
|
|
|
+ list_for_each_entry_safe(entry, next, head, list)
|
|
|
|
+ kfree(entry);
|
|
|
|
+}
|
|
|
|
+
|
|
static struct iommu_ops arm_smmu_ops = {
|
|
static struct iommu_ops arm_smmu_ops = {
|
|
.capable = arm_smmu_capable,
|
|
.capable = arm_smmu_capable,
|
|
.domain_alloc = arm_smmu_domain_alloc,
|
|
.domain_alloc = arm_smmu_domain_alloc,
|
|
@@ -1898,6 +1924,8 @@ static struct iommu_ops arm_smmu_ops = {
|
|
.domain_get_attr = arm_smmu_domain_get_attr,
|
|
.domain_get_attr = arm_smmu_domain_get_attr,
|
|
.domain_set_attr = arm_smmu_domain_set_attr,
|
|
.domain_set_attr = arm_smmu_domain_set_attr,
|
|
.of_xlate = arm_smmu_of_xlate,
|
|
.of_xlate = arm_smmu_of_xlate,
|
|
|
|
+ .get_resv_regions = arm_smmu_get_resv_regions,
|
|
|
|
+ .put_resv_regions = arm_smmu_put_resv_regions,
|
|
.pgsize_bitmap = -1UL, /* Restricted during device attach */
|
|
.pgsize_bitmap = -1UL, /* Restricted during device attach */
|
|
};
|
|
};
|
|
|
|
|