iommu: arm-smmu: Add 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.
Change-Id: I60d1ccb7cad64dfc9e327967c903befd3fa72877
Signed-off-by: Patrick Daly <pdaly@codeaurora.org>
Signed-off-by: Srinivasarao P <spathi@codeaurora.org>
diff --git a/drivers/iommu/arm-smmu.c b/drivers/iommu/arm-smmu.c
index de05de4..004460d 100755
--- a/drivers/iommu/arm-smmu.c
+++ b/drivers/iommu/arm-smmu.c
@@ -1790,6 +1790,8 @@
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))) ||
@@ -3316,6 +3318,11 @@
& (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;
@@ -3550,6 +3557,12 @@
break;
}
+ case DOMAIN_ATTR_NO_CFRE:
+ if (*((int *)data))
+ smmu_domain->attributes |=
+ 1 << DOMAIN_ATTR_NO_CFRE;
+ ret = 0;
+ break;
default:
ret = -ENODEV;
}