Commit 69356712 authored by Joerg Roedel's avatar Joerg Roedel

iommu: Add DOMAIN_ATTR_WINDOWS domain attribute

This attribute can be used to set and get the number of
subwindows on IOMMUs that are window-based.
Signed-off-by: default avatarJoerg Roedel <joro@8bytes.org>
parent d7787d57
...@@ -891,6 +891,7 @@ int iommu_domain_get_attr(struct iommu_domain *domain, ...@@ -891,6 +891,7 @@ int iommu_domain_get_attr(struct iommu_domain *domain,
struct iommu_domain_geometry *geometry; struct iommu_domain_geometry *geometry;
bool *paging; bool *paging;
int ret = 0; int ret = 0;
u32 *count;
switch (attr) { switch (attr) {
case DOMAIN_ATTR_GEOMETRY: case DOMAIN_ATTR_GEOMETRY:
...@@ -901,6 +902,15 @@ int iommu_domain_get_attr(struct iommu_domain *domain, ...@@ -901,6 +902,15 @@ int iommu_domain_get_attr(struct iommu_domain *domain,
case DOMAIN_ATTR_PAGING: case DOMAIN_ATTR_PAGING:
paging = data; paging = data;
*paging = (domain->ops->pgsize_bitmap != 0UL); *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; break;
default: default:
if (!domain->ops->domain_get_attr) if (!domain->ops->domain_get_attr)
...@@ -916,9 +926,26 @@ EXPORT_SYMBOL_GPL(iommu_domain_get_attr); ...@@ -916,9 +926,26 @@ EXPORT_SYMBOL_GPL(iommu_domain_get_attr);
int iommu_domain_set_attr(struct iommu_domain *domain, int iommu_domain_set_attr(struct iommu_domain *domain,
enum iommu_attr attr, void *data) enum iommu_attr attr, void *data)
{ {
if (!domain->ops->domain_set_attr) int ret = 0;
return -EINVAL; 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); EXPORT_SYMBOL_GPL(iommu_domain_set_attr);
...@@ -60,6 +60,7 @@ struct iommu_domain { ...@@ -60,6 +60,7 @@ struct iommu_domain {
enum iommu_attr { enum iommu_attr {
DOMAIN_ATTR_GEOMETRY, DOMAIN_ATTR_GEOMETRY,
DOMAIN_ATTR_PAGING, DOMAIN_ATTR_PAGING,
DOMAIN_ATTR_WINDOWS,
DOMAIN_ATTR_MAX, DOMAIN_ATTR_MAX,
}; };
...@@ -106,6 +107,10 @@ struct iommu_ops { ...@@ -106,6 +107,10 @@ struct iommu_ops {
int (*domain_window_enable)(struct iommu_domain *domain, u32 wnd_nr, int (*domain_window_enable)(struct iommu_domain *domain, u32 wnd_nr,
phys_addr_t paddr, u64 size); phys_addr_t paddr, u64 size);
void (*domain_window_disable)(struct iommu_domain *domain, u32 wnd_nr); void (*domain_window_disable)(struct iommu_domain *domain, u32 wnd_nr);
/* Set the numer of window per domain */
int (*domain_set_windows)(struct iommu_domain *domain, u32 w_count);
/* Get the numer of window per domain */
u32 (*domain_get_windows)(struct iommu_domain *domain);
unsigned long pgsize_bitmap; unsigned long pgsize_bitmap;
}; };
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment