]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
iommu/arm-smmu: Set rpm auto_suspend once during probe
authorPranjal Shrivastava <praan@google.com>
Thu, 23 Jan 2025 19:56:36 +0000 (19:56 +0000)
committerWill Deacon <will@kernel.org>
Tue, 11 Mar 2025 13:23:24 +0000 (13:23 +0000)
The current code calls arm_smmu_rpm_use_autosuspend() during device
attach, which seems unusual as it sets the autosuspend delay and the
'use_autosuspend' flag for the smmu device. These parameters can be
simply set once during the smmu probe and in order to avoid bouncing
rpm states, we can simply mark_last_busy() during a client dev attach
as discussed in [1].

Move the handling of arm_smmu_rpm_use_autosuspend() to the SMMU probe
and modify the arm_smmu_rpm_put() function to mark_last_busy() before
calling __pm_runtime_put_autosuspend(). Additionally,
s/pm_runtime_put_autosuspend/__pm_runtime_put_autosuspend/ to help with
the refactor of the pm_runtime_put_autosuspend() API [2].

Link: https://lore.kernel.org/r/20241023164835.GF29251@willie-the-truck
Link: https://git.kernel.org/linus/b7d46644e554
Signed-off-by: Pranjal Shrivastava <praan@google.com>
Link: https://lore.kernel.org/r/20250123195636.4182099-1-praan@google.com
Signed-off-by: Will Deacon <will@kernel.org>
drivers/iommu/arm/arm-smmu/arm-smmu.c

index de205a34ffc6df36c08f8db92499e6b99ba50308..746187051e03f62ebebabff8ad6ec1d585e0c20a 100644 (file)
@@ -79,8 +79,11 @@ static inline int arm_smmu_rpm_get(struct arm_smmu_device *smmu)
 
 static inline void arm_smmu_rpm_put(struct arm_smmu_device *smmu)
 {
-       if (pm_runtime_enabled(smmu->dev))
-               pm_runtime_put_autosuspend(smmu->dev);
+       if (pm_runtime_enabled(smmu->dev)) {
+               pm_runtime_mark_last_busy(smmu->dev);
+               __pm_runtime_put_autosuspend(smmu->dev);
+
+       }
 }
 
 static void arm_smmu_rpm_use_autosuspend(struct arm_smmu_device *smmu)
@@ -1195,7 +1198,6 @@ static int arm_smmu_attach_dev(struct iommu_domain *domain, struct device *dev)
        /* Looks ok, so add the device to the domain */
        arm_smmu_master_install_s2crs(cfg, S2CR_TYPE_TRANS,
                                      smmu_domain->cfg.cbndx, fwspec);
-       arm_smmu_rpm_use_autosuspend(smmu);
 rpm_put:
        arm_smmu_rpm_put(smmu);
        return ret;
@@ -1218,7 +1220,6 @@ static int arm_smmu_attach_dev_type(struct device *dev,
                return ret;
 
        arm_smmu_master_install_s2crs(cfg, type, 0, fwspec);
-       arm_smmu_rpm_use_autosuspend(smmu);
        arm_smmu_rpm_put(smmu);
        return 0;
 }
@@ -2246,6 +2247,7 @@ static int arm_smmu_device_probe(struct platform_device *pdev)
        if (dev->pm_domain) {
                pm_runtime_set_active(dev);
                pm_runtime_enable(dev);
+               arm_smmu_rpm_use_autosuspend(smmu);
        }
 
        return 0;