mirror of https://gitee.com/openkylin/linux.git
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: Joerg Roedel <joro@8bytes.org>
This commit is contained in:
parent
d7787d579c
commit
693567125b
|
@ -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,
|
||||||
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);
|
||||||
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;
|
||||||
|
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;
|
||||||
|
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
if (domain->ops->domain_set_attr == NULL)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
return domain->ops->domain_set_attr(domain, attr, data);
|
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 {
|
||||||
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 {
|
||||||
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;
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in New Issue