From cc5d8c5609f28191305fa8efce3dd51ad97a3d26 Mon Sep 17 00:00:00 2001 From: Naman Padhiar Date: Tue, 19 Jan 2021 15:57:09 +0530 Subject: [PATCH] icnss2: Add handler for SMMU faults For WCN6750, add SMMU fault handler and perform host triggered SSR for recovery. Change-Id: I653b0cd4699dc111e1154476bd1d778d1210f81b Signed-off-by: Naman Padhiar --- drivers/soc/qcom/icnss2/main.c | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/drivers/soc/qcom/icnss2/main.c b/drivers/soc/qcom/icnss2/main.c index 56c369b9cfc0..4a35b807d18c 100644 --- a/drivers/soc/qcom/icnss2/main.c +++ b/drivers/soc/qcom/icnss2/main.c @@ -3530,6 +3530,32 @@ out: return ret; } +static int icnss_smmu_fault_handler(struct iommu_domain *domain, + struct device *dev, unsigned long iova, + int flags, void *handler_token) +{ + struct icnss_priv *priv = handler_token; + struct icnss_uevent_fw_down_data fw_down_data = {0}; + + icnss_fatal_err("SMMU fault happened with IOVA 0x%lx\n", iova); + + if (!priv) { + icnss_pr_err("priv is NULL\n"); + return -ENODEV; + } + + if (test_bit(ICNSS_FW_READY, &priv->state)) { + fw_down_data.crashed = true; + icnss_call_driver_uevent(priv, ICNSS_UEVENT_FW_DOWN, + &fw_down_data); + } + + icnss_trigger_recovery(&priv->pdev->dev); + + /* IOMMU driver requires non-zero return value to print debug info. */ + return -EINVAL; +} + static int icnss_smmu_dt_parse(struct icnss_priv *priv) { int ret = 0; @@ -3561,6 +3587,10 @@ static int icnss_smmu_dt_parse(struct icnss_priv *priv) if (!ret && !strcmp("fastmap", iommu_dma_type)) { icnss_pr_dbg("SMMU S1 stage enabled\n"); priv->smmu_s1_enable = true; + if (priv->device_id == WCN6750_DEVICE_ID) + iommu_set_fault_handler(priv->iommu_domain, + icnss_smmu_fault_handler, + priv); } res = platform_get_resource_byname(pdev,