diff --git a/drivers/iommu/arm-smmu.c b/drivers/iommu/arm-smmu.c index 371b241cd190..da03fb12c036 100644 --- a/drivers/iommu/arm-smmu.c +++ b/drivers/iommu/arm-smmu.c @@ -1517,6 +1517,22 @@ static void arm_smmu_pgtbl_unlock(struct arm_smmu_domain *smmu_domain, spin_unlock_irqrestore(&smmu_domain->pgtbl_spin_lock, flags); } +static int arm_smmu_restore_sec_cfg(struct arm_smmu_device *smmu) +{ + int ret, scm_ret; + + if (!arm_smmu_is_static_cb(smmu)) + return 0; + + ret = scm_restore_sec_cfg(smmu->sec_id, 0x0, &scm_ret); + if (ret || scm_ret) { + pr_err("scm call IOMMU_SECURE_CFG failed\n"); + return -EINVAL; + } + + return 0; +} + static int arm_smmu_init_domain_context(struct iommu_domain *domain, struct arm_smmu_device *smmu) { @@ -2525,15 +2541,8 @@ static void arm_smmu_resume(struct arm_smmu_device *smmu) void __iomem *impl_def1_base = ARM_SMMU_IMPL_DEF1(smmu); u32 reg; - if (arm_smmu_is_static_cb(smmu)) { - int ret, scm_ret; - - ret = scm_restore_sec_cfg(smmu->sec_id, 0x0, &scm_ret); - if (ret || scm_ret) { - pr_err("scm call IOMMU_SECURE_CFG failed\n"); - return; - } - } + if (arm_smmu_restore_sec_cfg(smmu)) + return; reg = readl_relaxed(impl_def1_base + IMPL_DEF1_MICRO_MMU_CTRL); reg &= ~MICRO_MMU_CTRL_LOCAL_HALT_REQ; @@ -3322,6 +3331,9 @@ static int arm_smmu_device_cfg_probe(struct arm_smmu_device *smmu) u32 id; bool cttw_dt, cttw_reg; + if (arm_smmu_restore_sec_cfg(smmu)) + return -ENODEV; + dev_dbg(smmu->dev, "probing hardware configuration...\n"); dev_dbg(smmu->dev, "SMMUv%d with:\n", smmu->version);