Merge "iommu/arm-smmu: Fix SMMU derivation in arm_smmu_power_off_atomic"

This commit is contained in:
qctecmdr 2019-10-01 18:44:28 -07:00 • committed by Gerrit - the friendly Code Review server
commit 97b5ab5509

View file

@ -928,10 +928,10 @@ static int arm_smmu_power_on_atomic(struct arm_smmu_power_resources *pwr)
}
/* Clocks should be unprepared after this (arm_smmu_unprepare_clocks) */
static void arm_smmu_power_off_atomic(struct arm_smmu_power_resources *pwr)
static void arm_smmu_power_off_atomic(struct arm_smmu_device *smmu,
struct arm_smmu_power_resources *pwr)
{
unsigned long flags;
struct arm_smmu_device *smmu = pwr->dev->driver_data;
arm_smmu_arch_write_sync(smmu);
@ -1029,9 +1029,10 @@ out_disable:
return ret;
}
static void arm_smmu_power_off(struct arm_smmu_power_resources *pwr)
static void arm_smmu_power_off(struct arm_smmu_device *smmu,
struct arm_smmu_power_resources *pwr)
{
arm_smmu_power_off_atomic(pwr);
arm_smmu_power_off_atomic(smmu, pwr);
arm_smmu_power_off_slow(pwr);
}
@ -1064,11 +1065,11 @@ static void arm_smmu_domain_power_off(struct iommu_domain *domain,
(1ULL << DOMAIN_ATTR_ATOMIC);
if (atomic_domain) {
arm_smmu_power_off_atomic(smmu->pwr);
arm_smmu_power_off_atomic(smmu, smmu->pwr);
return;
}
arm_smmu_power_off(smmu->pwr);
arm_smmu_power_off(smmu, smmu->pwr);
}
/* Wait for any pending TLB invalidations to complete */
@ -1578,7 +1579,7 @@ static irqreturn_t arm_smmu_context_fault(int irq, void *dev)
}
out_power_off:
arm_smmu_power_off(smmu->pwr);
arm_smmu_power_off(smmu, smmu->pwr);
return ret;
}
@ -1598,7 +1599,7 @@ static irqreturn_t arm_smmu_global_fault(int irq, void *dev)
gfsynr2 = readl_relaxed(gr0_base + ARM_SMMU_GR0_sGFSYNR2);
if (!gfsr) {
arm_smmu_power_off(smmu->pwr);
arm_smmu_power_off(smmu, smmu->pwr);
return IRQ_NONE;
}
@ -1609,7 +1610,7 @@ static irqreturn_t arm_smmu_global_fault(int irq, void *dev)
gfsr, gfsynr0, gfsynr1, gfsynr2);
writel(gfsr, gr0_base + ARM_SMMU_GR0_sGFSR);
arm_smmu_power_off(smmu->pwr);
arm_smmu_power_off(smmu, smmu->pwr);
return IRQ_HANDLED;
}
@ -2216,7 +2217,7 @@ static void arm_smmu_destroy_domain_context(struct iommu_domain *domain)
if (dynamic) {
arm_smmu_free_asid(domain);
free_io_pgtable_ops(smmu_domain->pgtbl_ops);
arm_smmu_power_off(smmu->pwr);
arm_smmu_power_off(smmu, smmu->pwr);
arm_smmu_rpm_put(smmu);
arm_smmu_secure_domain_lock(smmu_domain);
arm_smmu_secure_pool_destroy(smmu_domain);
@ -2246,7 +2247,7 @@ static void arm_smmu_destroy_domain_context(struct iommu_domain *domain)
arm_smmu_secure_domain_unlock(smmu_domain);
__arm_smmu_free_bitmap(smmu->context_map, cfg->cbndx);
arm_smmu_power_off(smmu->pwr);
arm_smmu_power_off(smmu, smmu->pwr);
arm_smmu_rpm_put(smmu);
arm_smmu_domain_reinit(smmu_domain);
}
@ -2593,7 +2594,7 @@ static void arm_smmu_detach_dev(struct iommu_domain *domain,
arm_smmu_power_on(smmu->pwr);
arm_smmu_domain_remove_master(smmu_domain, fwspec);
arm_smmu_power_off(smmu->pwr);
arm_smmu_power_off(smmu, smmu->pwr);
}
static int arm_smmu_assign_table(struct arm_smmu_domain *smmu_domain)
@ -2953,10 +2954,10 @@ out_power_off:
*/
if (!ret && atomic_domain) {
WARN_ON(arm_smmu_power_on(smmu->pwr));
arm_smmu_power_off_atomic(smmu->pwr);
arm_smmu_power_off_atomic(smmu, smmu->pwr);
}
arm_smmu_power_off(smmu->pwr);
arm_smmu_power_off(smmu, smmu->pwr);
arm_smmu_rpm_put(smmu);
return ret;
@ -3262,7 +3263,7 @@ static phys_addr_t arm_smmu_iova_to_phys_hard(struct iommu_domain *domain,
spin_unlock_irqrestore(&smmu_domain->cb_lock, flags);
out:
arm_smmu_power_off(smmu_domain->smmu->pwr);
arm_smmu_power_off(smmu, smmu_domain->smmu->pwr);
return ret;
}
@ -3367,7 +3368,7 @@ static int arm_smmu_add_device(struct device *dev)
ret = arm_smmu_master_alloc_smes(dev);
if (ret)
goto out_dev_link_free;
arm_smmu_power_off(smmu->pwr);
arm_smmu_power_off(smmu, smmu->pwr);
return 0;
out_dev_link_free:
@ -3375,7 +3376,7 @@ out_dev_link_free:
out_cfg_free:
kfree(cfg);
out_pwr_off:
arm_smmu_power_off(smmu->pwr);
arm_smmu_power_off(smmu, smmu->pwr);
out_free:
iommu_fwspec_free(dev);
return ret;
@ -3413,7 +3414,7 @@ static void arm_smmu_remove_device(struct device *dev)
iommu_group_remove_device(dev);
kfree(fwspec->iommu_priv);
iommu_fwspec_free(dev);
arm_smmu_power_off(smmu->pwr);
arm_smmu_power_off(smmu, smmu->pwr);
arm_smmu_rpm_put(smmu);
}
@ -3917,7 +3918,7 @@ static int arm_smmu_enable_s1_translations(struct arm_smmu_domain *smmu_domain)
reg |= SCTLR_M;
writel_relaxed(reg, cb_base + ARM_SMMU_CB_SCTLR);
arm_smmu_power_off(smmu->pwr);
arm_smmu_power_off(smmu, smmu->pwr);
return ret;
}
@ -3963,7 +3964,7 @@ static void arm_smmu_trigger_fault(struct iommu_domain *domain,
/* give the interrupt time to fire... */
msleep(1000);
arm_smmu_power_off(smmu->pwr);
arm_smmu_power_off(smmu, smmu->pwr);
}
static void arm_smmu_tlbi_domain(struct iommu_domain *domain)
@ -3982,7 +3983,7 @@ static void arm_smmu_disable_config_clocks(struct iommu_domain *domain)
{
struct arm_smmu_domain *smmu_domain = to_smmu_domain(domain);
arm_smmu_power_off(smmu_domain->smmu->pwr);
arm_smmu_power_off(smmu_domain->smmu, smmu_domain->smmu->pwr);
}
static struct msm_iommu_ops arm_smmu_ops = {
@ -4914,7 +4915,7 @@ static int arm_smmu_device_dt_probe(struct platform_device *pdev)
arm_smmu_device_reset(smmu);
arm_smmu_test_smr_masks(smmu);
arm_smmu_interrupt_selftest(smmu);
arm_smmu_power_off(smmu->pwr);
arm_smmu_power_off(smmu, smmu->pwr);
/*
* We want to avoid touching dev->power.lock in fastpaths unless
@ -4938,7 +4939,7 @@ static int arm_smmu_device_dt_probe(struct platform_device *pdev)
return 0;
out_power_off:
arm_smmu_power_off(smmu->pwr);
arm_smmu_power_off(smmu, smmu->pwr);
out_exit_power_resources:
arm_smmu_exit_power_resources(smmu->pwr);
@ -4978,7 +4979,7 @@ static int arm_smmu_device_remove(struct platform_device *pdev)
/* Turn the thing off */
writel_relaxed(sCR0_CLIENTPD,
ARM_SMMU_GR0_NS(smmu) + ARM_SMMU_GR0_sCR0);
arm_smmu_power_off(smmu->pwr);
arm_smmu_power_off(smmu, smmu->pwr);
arm_smmu_exit_power_resources(smmu->pwr);
@ -4999,7 +5000,7 @@ static int __maybe_unused arm_smmu_runtime_resume(struct device *dev)
return ret;
arm_smmu_device_reset(smmu);
arm_smmu_power_off(smmu->pwr);
arm_smmu_power_off(smmu, smmu->pwr);
return 0;
}
@ -5451,7 +5452,7 @@ out_power_off:
/* Wait for read to complete before off */
rmb();
arm_smmu_power_off(tbu->pwr);
arm_smmu_power_off(tbu->smmu, tbu->pwr);
return phys;
}