diff options
Diffstat (limited to 'drivers/gpu/drm/i915/intel_pm.c')
-rw-r--r-- | drivers/gpu/drm/i915/intel_pm.c | 55 |
1 files changed, 55 insertions, 0 deletions
diff --git a/drivers/gpu/drm/i915/intel_pm.c b/drivers/gpu/drm/i915/intel_pm.c index cd3f511847ec..2590a5c90725 100644 --- a/drivers/gpu/drm/i915/intel_pm.c +++ b/drivers/gpu/drm/i915/intel_pm.c | |||
@@ -31,6 +31,7 @@ | |||
31 | #include "../../../platform/x86/intel_ips.h" | 31 | #include "../../../platform/x86/intel_ips.h" |
32 | #include <linux/module.h> | 32 | #include <linux/module.h> |
33 | #include <drm/i915_powerwell.h> | 33 | #include <drm/i915_powerwell.h> |
34 | #include <linux/pm_runtime.h> | ||
34 | 35 | ||
35 | /** | 36 | /** |
36 | * RC6 is a special power stage which allows the GPU to enter an very | 37 | * RC6 is a special power stage which allows the GPU to enter an very |
@@ -5961,6 +5962,60 @@ void intel_aux_display_runtime_put(struct drm_i915_private *dev_priv) | |||
5961 | hsw_enable_package_c8(dev_priv); | 5962 | hsw_enable_package_c8(dev_priv); |
5962 | } | 5963 | } |
5963 | 5964 | ||
5965 | void intel_runtime_pm_get(struct drm_i915_private *dev_priv) | ||
5966 | { | ||
5967 | struct drm_device *dev = dev_priv->dev; | ||
5968 | struct device *device = &dev->pdev->dev; | ||
5969 | |||
5970 | if (!HAS_RUNTIME_PM(dev)) | ||
5971 | return; | ||
5972 | |||
5973 | pm_runtime_get_sync(device); | ||
5974 | WARN(dev_priv->pm.suspended, "Device still suspended.\n"); | ||
5975 | } | ||
5976 | |||
5977 | void intel_runtime_pm_put(struct drm_i915_private *dev_priv) | ||
5978 | { | ||
5979 | struct drm_device *dev = dev_priv->dev; | ||
5980 | struct device *device = &dev->pdev->dev; | ||
5981 | |||
5982 | if (!HAS_RUNTIME_PM(dev)) | ||
5983 | return; | ||
5984 | |||
5985 | pm_runtime_mark_last_busy(device); | ||
5986 | pm_runtime_put_autosuspend(device); | ||
5987 | } | ||
5988 | |||
5989 | void intel_init_runtime_pm(struct drm_i915_private *dev_priv) | ||
5990 | { | ||
5991 | struct drm_device *dev = dev_priv->dev; | ||
5992 | struct device *device = &dev->pdev->dev; | ||
5993 | |||
5994 | dev_priv->pm.suspended = false; | ||
5995 | |||
5996 | if (!HAS_RUNTIME_PM(dev)) | ||
5997 | return; | ||
5998 | |||
5999 | pm_runtime_set_active(device); | ||
6000 | |||
6001 | pm_runtime_set_autosuspend_delay(device, 10000); /* 10s */ | ||
6002 | pm_runtime_mark_last_busy(device); | ||
6003 | pm_runtime_use_autosuspend(device); | ||
6004 | } | ||
6005 | |||
6006 | void intel_fini_runtime_pm(struct drm_i915_private *dev_priv) | ||
6007 | { | ||
6008 | struct drm_device *dev = dev_priv->dev; | ||
6009 | struct device *device = &dev->pdev->dev; | ||
6010 | |||
6011 | if (!HAS_RUNTIME_PM(dev)) | ||
6012 | return; | ||
6013 | |||
6014 | /* Make sure we're not suspended first. */ | ||
6015 | pm_runtime_get_sync(device); | ||
6016 | pm_runtime_disable(device); | ||
6017 | } | ||
6018 | |||
5964 | /* Set up chip specific power management-related functions */ | 6019 | /* Set up chip specific power management-related functions */ |
5965 | void intel_init_pm(struct drm_device *dev) | 6020 | void intel_init_pm(struct drm_device *dev) |
5966 | { | 6021 | { |