|
@@ -337,9 +337,9 @@ static int iommu_group_create_direct_mappings(struct iommu_group *group,
|
|
|
if (!domain || domain->type != IOMMU_DOMAIN_DMA)
|
|
|
return 0;
|
|
|
|
|
|
- BUG_ON(!domain->ops->pgsize_bitmap);
|
|
|
+ BUG_ON(!domain->pgsize_bitmap);
|
|
|
|
|
|
- pg_size = 1UL << __ffs(domain->ops->pgsize_bitmap);
|
|
|
+ pg_size = 1UL << __ffs(domain->pgsize_bitmap);
|
|
|
INIT_LIST_HEAD(&mappings);
|
|
|
|
|
|
iommu_get_dm_regions(dev, &mappings);
|
|
@@ -1073,6 +1073,8 @@ static struct iommu_domain *__iommu_domain_alloc(struct bus_type *bus,
|
|
|
|
|
|
domain->ops = bus->iommu_ops;
|
|
|
domain->type = type;
|
|
|
+ /* Assume all sizes by default; the driver may override this later */
|
|
|
+ domain->pgsize_bitmap = bus->iommu_ops->pgsize_bitmap;
|
|
|
|
|
|
return domain;
|
|
|
}
|
|
@@ -1297,7 +1299,7 @@ static size_t iommu_pgsize(struct iommu_domain *domain,
|
|
|
pgsize = (1UL << (pgsize_idx + 1)) - 1;
|
|
|
|
|
|
/* throw away page sizes not supported by the hardware */
|
|
|
- pgsize &= domain->ops->pgsize_bitmap;
|
|
|
+ pgsize &= domain->pgsize_bitmap;
|
|
|
|
|
|
/* make sure we're still sane */
|
|
|
BUG_ON(!pgsize);
|
|
@@ -1319,14 +1321,14 @@ int iommu_map(struct iommu_domain *domain, unsigned long iova,
|
|
|
int ret = 0;
|
|
|
|
|
|
if (unlikely(domain->ops->map == NULL ||
|
|
|
- domain->ops->pgsize_bitmap == 0UL))
|
|
|
+ domain->pgsize_bitmap == 0UL))
|
|
|
return -ENODEV;
|
|
|
|
|
|
if (unlikely(!(domain->type & __IOMMU_DOMAIN_PAGING)))
|
|
|
return -EINVAL;
|
|
|
|
|
|
/* find out the minimum page size supported */
|
|
|
- min_pagesz = 1 << __ffs(domain->ops->pgsize_bitmap);
|
|
|
+ min_pagesz = 1 << __ffs(domain->pgsize_bitmap);
|
|
|
|
|
|
/*
|
|
|
* both the virtual address and the physical one, as well as
|
|
@@ -1373,14 +1375,14 @@ size_t iommu_unmap(struct iommu_domain *domain, unsigned long iova, size_t size)
|
|
|
unsigned long orig_iova = iova;
|
|
|
|
|
|
if (unlikely(domain->ops->unmap == NULL ||
|
|
|
- domain->ops->pgsize_bitmap == 0UL))
|
|
|
+ domain->pgsize_bitmap == 0UL))
|
|
|
return -ENODEV;
|
|
|
|
|
|
if (unlikely(!(domain->type & __IOMMU_DOMAIN_PAGING)))
|
|
|
return -EINVAL;
|
|
|
|
|
|
/* find out the minimum page size supported */
|
|
|
- min_pagesz = 1 << __ffs(domain->ops->pgsize_bitmap);
|
|
|
+ min_pagesz = 1 << __ffs(domain->pgsize_bitmap);
|
|
|
|
|
|
/*
|
|
|
* The virtual address, as well as the size of the mapping, must be
|
|
@@ -1426,10 +1428,10 @@ size_t default_iommu_map_sg(struct iommu_domain *domain, unsigned long iova,
|
|
|
unsigned int i, min_pagesz;
|
|
|
int ret;
|
|
|
|
|
|
- if (unlikely(domain->ops->pgsize_bitmap == 0UL))
|
|
|
+ if (unlikely(domain->pgsize_bitmap == 0UL))
|
|
|
return 0;
|
|
|
|
|
|
- min_pagesz = 1 << __ffs(domain->ops->pgsize_bitmap);
|
|
|
+ min_pagesz = 1 << __ffs(domain->pgsize_bitmap);
|
|
|
|
|
|
for_each_sg(sg, s, nents, i) {
|
|
|
phys_addr_t phys = page_to_phys(sg_page(s)) + s->offset;
|
|
@@ -1510,7 +1512,7 @@ int iommu_domain_get_attr(struct iommu_domain *domain,
|
|
|
break;
|
|
|
case DOMAIN_ATTR_PAGING:
|
|
|
paging = data;
|
|
|
- *paging = (domain->ops->pgsize_bitmap != 0UL);
|
|
|
+ *paging = (domain->pgsize_bitmap != 0UL);
|
|
|
break;
|
|
|
case DOMAIN_ATTR_WINDOWS:
|
|
|
count = data;
|