diff options
author | Will Deacon <will.deacon@arm.com> | 2017-01-06 11:28:17 -0500 |
---|---|---|
committer | Will Deacon <will.deacon@arm.com> | 2017-04-06 11:06:43 -0400 |
commit | 0834cc28fa56c65887c614b6c045be2ba06fdcb0 (patch) | |
tree | 2b999c010be5d5e05aa805f9d1a79f37e1cc89a3 | |
parent | 56fbf600dd8e2f32a5317437fe310b56719f7d2b (diff) |
iommu/arm-smmu: Restrict domain attributes to UNMANAGED domains
The ARM SMMU drivers provide a DOMAIN_ATTR_NESTING domain attribute,
which allows callers of the IOMMU API to request that the page table
for a domain is installed at stage-2, if supported by the hardware.
Since setting this attribute only makes sense for UNMANAGED domains,
this patch returns -ENODEV if the domain_{get,set}_attr operations are
called on other domain types.
Signed-off-by: Will Deacon <will.deacon@arm.com>
-rw-r--r-- | drivers/iommu/arm-smmu-v3.c | 6 | ||||
-rw-r--r-- | drivers/iommu/arm-smmu.c | 6 |
2 files changed, 12 insertions, 0 deletions
diff --git a/drivers/iommu/arm-smmu-v3.c b/drivers/iommu/arm-smmu-v3.c index 591bb96047c9..b47a88757c18 100644 --- a/drivers/iommu/arm-smmu-v3.c +++ b/drivers/iommu/arm-smmu-v3.c | |||
@@ -1837,6 +1837,9 @@ static int arm_smmu_domain_get_attr(struct iommu_domain *domain, | |||
1837 | { | 1837 | { |
1838 | struct arm_smmu_domain *smmu_domain = to_smmu_domain(domain); | 1838 | struct arm_smmu_domain *smmu_domain = to_smmu_domain(domain); |
1839 | 1839 | ||
1840 | if (domain->type != IOMMU_DOMAIN_UNMANAGED) | ||
1841 | return -EINVAL; | ||
1842 | |||
1840 | switch (attr) { | 1843 | switch (attr) { |
1841 | case DOMAIN_ATTR_NESTING: | 1844 | case DOMAIN_ATTR_NESTING: |
1842 | *(int *)data = (smmu_domain->stage == ARM_SMMU_DOMAIN_NESTED); | 1845 | *(int *)data = (smmu_domain->stage == ARM_SMMU_DOMAIN_NESTED); |
@@ -1852,6 +1855,9 @@ static int arm_smmu_domain_set_attr(struct iommu_domain *domain, | |||
1852 | int ret = 0; | 1855 | int ret = 0; |
1853 | struct arm_smmu_domain *smmu_domain = to_smmu_domain(domain); | 1856 | struct arm_smmu_domain *smmu_domain = to_smmu_domain(domain); |
1854 | 1857 | ||
1858 | if (domain->type != IOMMU_DOMAIN_UNMANAGED) | ||
1859 | return -EINVAL; | ||
1860 | |||
1855 | mutex_lock(&smmu_domain->init_mutex); | 1861 | mutex_lock(&smmu_domain->init_mutex); |
1856 | 1862 | ||
1857 | switch (attr) { | 1863 | switch (attr) { |
diff --git a/drivers/iommu/arm-smmu.c b/drivers/iommu/arm-smmu.c index 6560c4a34b96..099215bbff89 100644 --- a/drivers/iommu/arm-smmu.c +++ b/drivers/iommu/arm-smmu.c | |||
@@ -1603,6 +1603,9 @@ static int arm_smmu_domain_get_attr(struct iommu_domain *domain, | |||
1603 | { | 1603 | { |
1604 | struct arm_smmu_domain *smmu_domain = to_smmu_domain(domain); | 1604 | struct arm_smmu_domain *smmu_domain = to_smmu_domain(domain); |
1605 | 1605 | ||
1606 | if (domain->type != IOMMU_DOMAIN_UNMANAGED) | ||
1607 | return -EINVAL; | ||
1608 | |||
1606 | switch (attr) { | 1609 | switch (attr) { |
1607 | case DOMAIN_ATTR_NESTING: | 1610 | case DOMAIN_ATTR_NESTING: |
1608 | *(int *)data = (smmu_domain->stage == ARM_SMMU_DOMAIN_NESTED); | 1611 | *(int *)data = (smmu_domain->stage == ARM_SMMU_DOMAIN_NESTED); |
@@ -1618,6 +1621,9 @@ static int arm_smmu_domain_set_attr(struct iommu_domain *domain, | |||
1618 | int ret = 0; | 1621 | int ret = 0; |
1619 | struct arm_smmu_domain *smmu_domain = to_smmu_domain(domain); | 1622 | struct arm_smmu_domain *smmu_domain = to_smmu_domain(domain); |
1620 | 1623 | ||
1624 | if (domain->type != IOMMU_DOMAIN_UNMANAGED) | ||
1625 | return -EINVAL; | ||
1626 | |||
1621 | mutex_lock(&smmu_domain->init_mutex); | 1627 | mutex_lock(&smmu_domain->init_mutex); |
1622 | 1628 | ||
1623 | switch (attr) { | 1629 | switch (attr) { |