[PATCH 03/11] drm/i915: Enable wakeref tracking for ref held for disabling runtime PM
Imre Deak
imre.deak at intel.com
Wed May 1 08:12:27 UTC 2019
After the previous patch, to disable runtime PM we can take a permanent
RPM ref that keeps the device-powered wakeref checks still enabled but
also has wakeref owner tracking for this reference enabled.
While at it fix a comment in intel_runtime_pm_enable().
Signed-off-by: Imre Deak <imre.deak at intel.com>
---
drivers/gpu/drm/i915/i915_drv.h | 1 +
drivers/gpu/drm/i915/intel_runtime_pm.c | 18 ++++++++----------
2 files changed, 9 insertions(+), 10 deletions(-)
diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
index cd420791b1aa..cf581beb1e89 100644
--- a/drivers/gpu/drm/i915/i915_drv.h
+++ b/drivers/gpu/drm/i915/i915_drv.h
@@ -1178,6 +1178,7 @@ struct skl_wm_params {
struct i915_runtime_pm {
atomic_t wakeref_count;
atomic_t wakeref_track_count;
+ intel_wakeref_t rpm_disable_wakeref;
bool suspended;
bool irqs_enabled;
diff --git a/drivers/gpu/drm/i915/intel_runtime_pm.c b/drivers/gpu/drm/i915/intel_runtime_pm.c
index 1f4f9e69fa1d..583873701172 100644
--- a/drivers/gpu/drm/i915/intel_runtime_pm.c
+++ b/drivers/gpu/drm/i915/intel_runtime_pm.c
@@ -4380,7 +4380,6 @@ intel_wakeref_t intel_runtime_pm_get(struct drm_i915_private *i915)
return track_intel_runtime_pm_wakeref(i915);
}
-__attribute__((__used__))
static intel_wakeref_t intel_runtime_pm_get_raw(struct drm_i915_private *i915)
{
__intel_runtime_pm_get(i915);
@@ -4487,7 +4486,6 @@ void intel_runtime_pm_put(struct drm_i915_private *i915, intel_wakeref_t wref)
intel_runtime_pm_put_unchecked(i915);
}
-__attribute__((__used__))
static void intel_runtime_pm_put_raw(struct drm_i915_private *i915,
intel_wakeref_t wref)
{
@@ -4495,7 +4493,6 @@ static void intel_runtime_pm_put_raw(struct drm_i915_private *i915,
intel_runtime_pm_put_unchecked_raw(i915);
}
#else
-__attribute__((__used__))
static void intel_runtime_pm_put_raw(struct drm_i915_private *i915,
intel_wakeref_t wref)
{
@@ -4538,11 +4535,9 @@ void intel_runtime_pm_enable(struct drm_i915_private *i915)
* platforms without RPM support.
*/
if (!HAS_RUNTIME_PM(i915)) {
- int ret;
-
pm_runtime_dont_use_autosuspend(kdev);
- ret = pm_runtime_get_sync(kdev);
- WARN(ret < 0, "pm_runtime_get_sync() failed: %d\n", ret);
+ i915->runtime_pm.rpm_disable_wakeref =
+ intel_runtime_pm_get_raw(i915);
} else {
pm_runtime_use_autosuspend(kdev);
}
@@ -4550,7 +4545,7 @@ void intel_runtime_pm_enable(struct drm_i915_private *i915)
/*
* The core calls the driver load handler with an RPM reference held.
* We drop that here and will reacquire it during unloading in
- * intel_power_domains_fini().
+ * intel_runtime_pm_disable().
*/
pm_runtime_put_autosuspend(kdev);
}
@@ -4559,6 +4554,8 @@ void intel_runtime_pm_disable(struct drm_i915_private *i915)
{
struct pci_dev *pdev = i915->drm.pdev;
struct device *kdev = &pdev->dev;
+ intel_wakeref_t rpm_disable_wakeref =
+ fetch_and_zero(&i915->runtime_pm.rpm_disable_wakeref);
/* Transfer rpm ownership back to core */
WARN(pm_runtime_get_sync(kdev) < 0,
@@ -4566,8 +4563,9 @@ void intel_runtime_pm_disable(struct drm_i915_private *i915)
pm_runtime_dont_use_autosuspend(kdev);
- if (!HAS_RUNTIME_PM(i915))
- pm_runtime_put(kdev);
+ WARN_ON(HAS_RUNTIME_PM(i915) == rpm_disable_wakeref);
+ if (rpm_disable_wakeref)
+ intel_runtime_pm_put_raw(i915, rpm_disable_wakeref);
}
void intel_runtime_pm_cleanup(struct drm_i915_private *i915)
--
2.17.1
More information about the Intel-gfx-trybot
mailing list