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);
 
        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;
 }
        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);
        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
        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
        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;
                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;
 
 struct iommu_domain {
        unsigned type;
        const struct iommu_ops *ops;
+       unsigned long pgsize_bitmap;    /* Bitmap of page sizes in use */
        iommu_fault_handler_t handler;
        void *handler_token;
        struct iommu_domain_geometry geometry;
  * @domain_set_windows: Set the number of windows for a domain
  * @domain_get_windows: Return the number of windows for a domain
  * @of_xlate: add OF master IDs to iommu grouping
- * @pgsize_bitmap: bitmap of supported page sizes
+ * @pgsize_bitmap: bitmap of all possible supported page sizes
  */
 struct iommu_ops {
        bool (*capable)(enum iommu_cap);