iommu: Add DOMAIN_ATTR_WINDOWS domain attribute
[platform/adaptation/renesas_rcar/renesas_kernel.git] / drivers / iommu / iommu.c
index b3aced7..b972d43 100644 (file)
@@ -891,6 +891,7 @@ int iommu_domain_get_attr(struct iommu_domain *domain,
        struct iommu_domain_geometry *geometry;
        bool *paging;
        int ret = 0;
+       u32 *count;
 
        switch (attr) {
        case DOMAIN_ATTR_GEOMETRY:
@@ -902,6 +903,15 @@ int iommu_domain_get_attr(struct iommu_domain *domain,
                paging  = data;
                *paging = (domain->ops->pgsize_bitmap != 0UL);
                break;
+       case DOMAIN_ATTR_WINDOWS:
+               count = data;
+
+               if (domain->ops->domain_get_windows != NULL)
+                       *count = domain->ops->domain_get_windows(domain);
+               else
+                       ret = -ENODEV;
+
+               break;
        default:
                if (!domain->ops->domain_get_attr)
                        return -EINVAL;
@@ -916,9 +926,26 @@ EXPORT_SYMBOL_GPL(iommu_domain_get_attr);
 int iommu_domain_set_attr(struct iommu_domain *domain,
                          enum iommu_attr attr, void *data)
 {
-       if (!domain->ops->domain_set_attr)
-               return -EINVAL;
+       int ret = 0;
+       u32 *count;
+
+       switch (attr) {
+       case DOMAIN_ATTR_WINDOWS:
+               count = data;
+
+               if (domain->ops->domain_set_windows != NULL)
+                       ret = domain->ops->domain_set_windows(domain, *count);
+               else
+                       ret = -ENODEV;
 
-       return domain->ops->domain_set_attr(domain, attr, data);
+               break;
+       default:
+               if (domain->ops->domain_set_attr == NULL)
+                       return -EINVAL;
+
+               ret = domain->ops->domain_set_attr(domain, attr, data);
+       }
+
+       return ret;
 }
 EXPORT_SYMBOL_GPL(iommu_domain_set_attr);