@ -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 ( & region - > 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 */
} ;
} ;