iommu/qcom: restore IOMMU state if needed
authorVladimir Lypak <vladimir.lypak@gmail.com>
Wed, 11 Oct 2023 17:57:26 +0000 (19:57 +0200)
committerWill Deacon <will@kernel.org>
Tue, 12 Dec 2023 12:33:50 +0000 (12:33 +0000)
If the IOMMU has a power domain then some state will be lost in
qcom_iommu_suspend and TZ will reset device if we don't call
qcom_scm_restore_sec_cfg before accessing it again.

Signed-off-by: Vladimir Lypak <vladimir.lypak@gmail.com>
[luca@z3ntu.xyz: reword commit message a bit]
Signed-off-by: Luca Weiss <luca@z3ntu.xyz>
Link: https://lore.kernel.org/r/20231011-msm8953-iommu-restore-v1-1-48a0c93809a2@z3ntu.xyz
Signed-off-by: Will Deacon <will@kernel.org>
drivers/iommu/arm/arm-smmu/qcom_iommu.c

index 97b2122032b2371915047aa03d3118005fc49496..67abeb02cf536b443f92dbab83a0443bee01a6a3 100644 (file)
@@ -900,8 +900,16 @@ static void qcom_iommu_device_remove(struct platform_device *pdev)
 static int __maybe_unused qcom_iommu_resume(struct device *dev)
 {
        struct qcom_iommu_dev *qcom_iommu = dev_get_drvdata(dev);
+       int ret;
+
+       ret = clk_bulk_prepare_enable(CLK_NUM, qcom_iommu->clks);
+       if (ret < 0)
+               return ret;
+
+       if (dev->pm_domain)
+               return qcom_scm_restore_sec_cfg(qcom_iommu->sec_id, 0);
 
-       return clk_bulk_prepare_enable(CLK_NUM, qcom_iommu->clks);
+       return ret;
 }
 
 static int __maybe_unused qcom_iommu_suspend(struct device *dev)