iommu: qcom: wire up fault handler
Subsystems (2)
PATCH 1/1 iommu: qcom: wire up fault handler
This is quite useful for debugging. Currently, always TERMINATE the translation when the fault handler returns (since this is all we need for debugging drivers). But I expect the SVM work should eventually let us do something more clever.
Signed-off-by Rob Clark <[email protected]>
--- drivers/iommu/qcom_iommu.c | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-)
drivers/iommu/qcom_iommu.c +12 -4
@@ -66,6 +66,7 @@ struct qcom_iommu_ctx {void __iomem *base;bool secure_init;u8 asid;/* asid and ctx bank # are 1:1 */ +struct iommu_domain *domain; };struct qcom_iommu_domain {
@@ -194,12 +195,15 @@ static irqreturn_t qcom_iommu_fault(int irq, void *dev) fsynr =iommu_readl (ctx,ARM_SMMU_CB_FSYNR0 ); iova =iommu_readq (ctx,ARM_SMMU_CB_FAR ); -dev_err_ratelimited (ctx->dev, -"Unhandled context fault: fsr=0x%x, " -"iova=0x%016llx, fsynr=0x%x, cb=%d\n" , - fsr, iova, fsynr, ctx->asid); +if (!report_iommu_fault (ctx->domain, ctx->dev, iova,0 )) { +dev_err_ratelimited (ctx->dev, +"Unhandled context fault: fsr=0x%x, " +"iova=0x%016llx, fsynr=0x%x, cb=%d\n" , + fsr, iova, fsynr, ctx->asid); + }iommu_writel (ctx,ARM_SMMU_CB_FSR , fsr); +iommu_writel (ctx,ARM_SMMU_CB_RESUME ,RESUME_TERMINATE );return IRQ_HANDLED ; }
@@ -280,6 +284,8 @@ static int qcom_iommu_init_domain(struct iommu_domain *domain, reg |=SCTLR_E ;iommu_writel (ctx,ARM_SMMU_CB_SCTLR , reg); + + ctx->domain = domain; }mutex_unlock (&qcom_domain->init_mutex);
@@ -395,6 +401,8 @@ static void qcom_iommu_detach_dev(struct iommu_domain *domain, struct device *de/* Disable the context bank: */ iommu_writel (ctx,ARM_SMMU_CB_SCTLR ,0 ); + + ctx->domain =NULL ; }pm_runtime_put_sync (qcom_iommu->dev);
Signature · 1 line
2.13.6