iommu/arm-smmu: Support DOMAIN_ATTR_S1_BYPASS
Certain configurations may require nested translation, but may want to avoid software performance limitation on map/unmap operations. Change-Id: I6653b3b6ceb071283fb5a8e07257c496e99dd1f3 Signed-off-by: Patrick Daly <pdaly@codeaurora.org>
This commit is contained in:
parent
a1b066a460
commit
c1b29ef10e
1 changed files with 20 additions and 1 deletions
|
@ -1453,7 +1453,9 @@ static void arm_smmu_init_context_bank(struct arm_smmu_domain *smmu_domain,
|
|||
}
|
||||
|
||||
/* SCTLR */
|
||||
reg = SCTLR_CFCFG | SCTLR_CFIE | SCTLR_CFRE | SCTLR_M | SCTLR_EAE_SBOP;
|
||||
reg = SCTLR_CFCFG | SCTLR_CFIE | SCTLR_CFRE | SCTLR_EAE_SBOP;
|
||||
if (!stage1 || !(smmu_domain->attributes & DOMAIN_ATTR_S1_BYPASS))
|
||||
reg |= SCTLR_M;
|
||||
if (stage1)
|
||||
reg |= SCTLR_S1_ASIDPNE;
|
||||
#ifdef __BIG_ENDIAN
|
||||
|
@ -2898,6 +2900,11 @@ static int arm_smmu_domain_get_attr(struct iommu_domain *domain,
|
|||
& (1 << DOMAIN_ATTR_NON_FATAL_FAULTS));
|
||||
ret = 0;
|
||||
break;
|
||||
case DOMAIN_ATTR_S1_BYPASS:
|
||||
*((int *)data) = !!(smmu_domain->attributes
|
||||
& (1 << DOMAIN_ATTR_S1_BYPASS));
|
||||
ret = 0;
|
||||
break;
|
||||
default:
|
||||
ret = -ENODEV;
|
||||
break;
|
||||
|
@ -3009,6 +3016,18 @@ static int arm_smmu_domain_set_attr(struct iommu_domain *domain,
|
|||
smmu_domain->non_fatal_faults = *((int *)data);
|
||||
ret = 0;
|
||||
break;
|
||||
case DOMAIN_ATTR_S1_BYPASS: {
|
||||
int bypass = *((int *)data);
|
||||
|
||||
if (bypass)
|
||||
smmu_domain->attributes |= 1 << DOMAIN_ATTR_S1_BYPASS;
|
||||
else
|
||||
smmu_domain->attributes &=
|
||||
~(1 << DOMAIN_ATTR_S1_BYPASS);
|
||||
|
||||
ret = 0;
|
||||
break;
|
||||
}
|
||||
default:
|
||||
ret = -ENODEV;
|
||||
break;
|
||||
|
|
Loading…
Add table
Reference in a new issue