|
@@ -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:
|
|
@@ -901,6 +902,15 @@ int iommu_domain_get_attr(struct iommu_domain *domain,
|
|
|
case DOMAIN_ATTR_PAGING:
|
|
|
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)
|
|
@@ -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);
|