Loading drivers/iommu/arm-smmu.c +13 −0 Original line number Diff line number Diff line Loading @@ -1790,6 +1790,8 @@ static void arm_smmu_write_context_bank(struct arm_smmu_device *smmu, int idx) reg &= ~SCTLR_CFCFG; reg |= SCTLR_HUPCF; } if (cb->attributes & (1 << DOMAIN_ATTR_NO_CFRE)) reg &= ~SCTLR_CFRE; if ((!(cb->attributes & (1 << DOMAIN_ATTR_S1_BYPASS)) && !(cb->attributes & (1 << DOMAIN_ATTR_EARLY_MAP))) || Loading Loading @@ -3316,6 +3318,11 @@ static int arm_smmu_domain_get_attr(struct iommu_domain *domain, & (1 << DOMAIN_ATTR_CB_STALL_DISABLE)); ret = 0; break; case DOMAIN_ATTR_NO_CFRE: *((int *)data) = !!(smmu_domain->attributes & (1 << DOMAIN_ATTR_NO_CFRE)); ret = 0; break; case DOMAIN_ATTR_MMU500_ERRATA_MIN_ALIGN: *((int *)data) = smmu_domain->qsmmuv500_errata2_min_align; ret = 0; Loading Loading @@ -3550,6 +3557,12 @@ static int arm_smmu_domain_set_attr(struct iommu_domain *domain, break; } case DOMAIN_ATTR_NO_CFRE: if (*((int *)data)) smmu_domain->attributes |= 1 << DOMAIN_ATTR_NO_CFRE; ret = 0; break; default: ret = -ENODEV; } Loading include/linux/iommu.h +6 −0 Original line number Diff line number Diff line Loading @@ -119,6 +119,11 @@ enum iommu_cap { * DOMAIN_ATTR_FSL_PAMUV1 corresponds to the above mentioned contraints. * The caller can invoke iommu_domain_get_attr to check if the underlying * iommu implementation supports these constraints. * * DOMAIN_ATTR_NO_CFRE * Some bus implementations may enter a bad state if iommu reports an error * on context fault. As context faults are not always fatal, this must be * avoided. */ enum iommu_attr { Loading Loading @@ -149,6 +154,7 @@ enum iommu_attr { DOMAIN_ATTR_UPSTREAM_IOVA_ALLOCATOR, DOMAIN_ATTR_MMU500_ERRATA_MIN_ALIGN, DOMAIN_ATTR_FORCE_IOVA_GUARD_PAGE, DOMAIN_ATTR_NO_CFRE, DOMAIN_ATTR_MAX, }; Loading Loading
drivers/iommu/arm-smmu.c +13 −0 Original line number Diff line number Diff line Loading @@ -1790,6 +1790,8 @@ static void arm_smmu_write_context_bank(struct arm_smmu_device *smmu, int idx) reg &= ~SCTLR_CFCFG; reg |= SCTLR_HUPCF; } if (cb->attributes & (1 << DOMAIN_ATTR_NO_CFRE)) reg &= ~SCTLR_CFRE; if ((!(cb->attributes & (1 << DOMAIN_ATTR_S1_BYPASS)) && !(cb->attributes & (1 << DOMAIN_ATTR_EARLY_MAP))) || Loading Loading @@ -3316,6 +3318,11 @@ static int arm_smmu_domain_get_attr(struct iommu_domain *domain, & (1 << DOMAIN_ATTR_CB_STALL_DISABLE)); ret = 0; break; case DOMAIN_ATTR_NO_CFRE: *((int *)data) = !!(smmu_domain->attributes & (1 << DOMAIN_ATTR_NO_CFRE)); ret = 0; break; case DOMAIN_ATTR_MMU500_ERRATA_MIN_ALIGN: *((int *)data) = smmu_domain->qsmmuv500_errata2_min_align; ret = 0; Loading Loading @@ -3550,6 +3557,12 @@ static int arm_smmu_domain_set_attr(struct iommu_domain *domain, break; } case DOMAIN_ATTR_NO_CFRE: if (*((int *)data)) smmu_domain->attributes |= 1 << DOMAIN_ATTR_NO_CFRE; ret = 0; break; default: ret = -ENODEV; } Loading
include/linux/iommu.h +6 −0 Original line number Diff line number Diff line Loading @@ -119,6 +119,11 @@ enum iommu_cap { * DOMAIN_ATTR_FSL_PAMUV1 corresponds to the above mentioned contraints. * The caller can invoke iommu_domain_get_attr to check if the underlying * iommu implementation supports these constraints. * * DOMAIN_ATTR_NO_CFRE * Some bus implementations may enter a bad state if iommu reports an error * on context fault. As context faults are not always fatal, this must be * avoided. */ enum iommu_attr { Loading Loading @@ -149,6 +154,7 @@ enum iommu_attr { DOMAIN_ATTR_UPSTREAM_IOVA_ALLOCATOR, DOMAIN_ATTR_MMU500_ERRATA_MIN_ALIGN, DOMAIN_ATTR_FORCE_IOVA_GUARD_PAGE, DOMAIN_ATTR_NO_CFRE, DOMAIN_ATTR_MAX, }; Loading