[Intel-gfx] [RFC 5/6] drm/i915: device specific runtime suspend/resume
naresh.kumar.kachhi at intel.com
naresh.kumar.kachhi at intel.com
Wed Jan 22 13:04:21 CET 2014
From: Naresh Kumar Kachhi <naresh.kumar.kachhi at intel.com>
we might need special handling for different platforms.
for ex. baytrail. To handle this this patch creates function
pointers for runtime suspend/resume which are assigned
during driver load time
Signed-off-by: Naresh Kumar Kachhi <naresh.kumar.kachhi at intel.com>
---
drivers/gpu/drm/i915/i915_drv.c | 23 ++++++++---------------
drivers/gpu/drm/i915/i915_drv.h | 6 ++++++
drivers/gpu/drm/i915/intel_pm.c | 38 ++++++++++++++++++++++++++++++++++++++
3 files changed, 52 insertions(+), 15 deletions(-)
diff --git a/drivers/gpu/drm/i915/i915_drv.c b/drivers/gpu/drm/i915/i915_drv.c
index 80965be..dc1cfab 100644
--- a/drivers/gpu/drm/i915/i915_drv.c
+++ b/drivers/gpu/drm/i915/i915_drv.c
@@ -935,19 +935,10 @@ static int i915_runtime_suspend(struct device *device)
DRM_DEBUG_KMS("Suspending device\n");
- i915_gem_release_all_mmaps(dev_priv);
-
- del_timer_sync(&dev_priv->gpu_error.hangcheck_timer);
- dev_priv->pm.suspended = true;
-
- /*
- * current versions of firmware which depend on this opregion
- * notification have repurposed the D1 definition to mean
- * "runtime suspended" vs. what you would normally expect (D3)
- * to distinguish it from notifications that might be sent
- * via the suspend path.
- */
- intel_opregion_notify_adapter(dev, PCI_D1);
+ if (dev_priv->pm.funcs.runtime_suspend)
+ dev_priv->pm.funcs.runtime_suspend(dev_priv);
+ else
+ DRM_ERROR("Device does not have runtime functions");
return 0;
}
@@ -962,8 +953,10 @@ static int i915_runtime_resume(struct device *device)
DRM_DEBUG_KMS("Resuming device\n");
- intel_opregion_notify_adapter(dev, PCI_D0);
- dev_priv->pm.suspended = false;
+ if (dev_priv->pm.funcs.runtime_resume)
+ dev_priv->pm.funcs.runtime_resume(dev_priv);
+ else
+ DRM_ERROR("Device does not have runtime functions");
return 0;
}
diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
index 6a6f046..54aa31d 100644
--- a/drivers/gpu/drm/i915/i915_drv.h
+++ b/drivers/gpu/drm/i915/i915_drv.h
@@ -1322,11 +1322,17 @@ struct i915_package_c8 {
} regsave;
};
+struct i915_runtime_pm_funcs {
+ int (*runtime_suspend)(struct drm_i915_private *dev_priv);
+ int (*runtime_resume)(struct drm_i915_private *dev_priv);
+};
+
struct i915_runtime_pm {
bool suspended;
bool gpu_idle;
bool disp_idle;
struct mutex lock;
+ struct i915_runtime_pm_funcs funcs;
};
enum intel_pipe_crc_source {
diff --git a/drivers/gpu/drm/i915/intel_pm.c b/drivers/gpu/drm/i915/intel_pm.c
index 9d6d0e1..6713995 100644
--- a/drivers/gpu/drm/i915/intel_pm.c
+++ b/drivers/gpu/drm/i915/intel_pm.c
@@ -5588,6 +5588,41 @@ void intel_runtime_pm_put(struct drm_i915_private *dev_priv)
pm_runtime_put_autosuspend(device);
}
+static int hsw_runtime_suspend(struct drm_i915_private *dev_priv)
+{
+ struct drm_device *dev = dev_priv->dev;
+
+ WARN_ON(!HAS_RUNTIME_PM(dev));
+
+ i915_gem_release_all_mmaps(dev_priv);
+
+ del_timer_sync(&dev_priv->gpu_error.hangcheck_timer);
+ dev_priv->pm.suspended = true;
+
+ /*
+ * current versions of firmware which depend on this opregion
+ * notification have repurposed the D1 definition to mean
+ * "runtime suspended" vs. what you would normally expect (D3)
+ * to distinguish it from notifications that might be sent
+ * via the suspend path.
+ */
+ intel_opregion_notify_adapter(dev, PCI_D1);
+
+
+ return 0;
+}
+
+static int hsw_runtime_resume(struct drm_i915_private *dev_priv)
+{
+ struct drm_device *dev = dev_priv->dev;
+ WARN_ON(!HAS_RUNTIME_PM(dev));
+
+ intel_opregion_notify_adapter(dev_priv->dev, PCI_D0);
+ dev_priv->pm.suspended = false;
+
+ return 0;
+}
+
void intel_init_runtime_pm(struct drm_i915_private *dev_priv)
{
struct drm_device *dev = dev_priv->dev;
@@ -5606,6 +5641,9 @@ void intel_init_runtime_pm(struct drm_i915_private *dev_priv)
pm_runtime_set_autosuspend_delay(device, 10000); /* 10s */
pm_runtime_mark_last_busy(device);
pm_runtime_use_autosuspend(device);
+
+ dev_priv->pm.funcs.runtime_suspend = hsw_runtime_suspend;
+ dev_priv->pm.funcs.runtime_resume = hsw_runtime_resume;
}
void intel_fini_runtime_pm(struct drm_i915_private *dev_priv)
--
1.8.1.2
More information about the Intel-gfx
mailing list