forked from Minki/linux
drm/amdgpu: Enter low power state if CRTC active.
CRTC in DPMS state off calls for low power state entry. Support both atomic mode setting and pre-atomic mode setting. v2: move comment Acked-by: Feifei Xu <Feifei.Xu@amd.com> Signed-off-by: Andrey Grodzovsky <andrey.grodzovsky@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
This commit is contained in:
parent
aec0f262f3
commit
97f6a21bfa
@ -1299,24 +1299,55 @@ static int amdgpu_pmops_runtime_idle(struct device *dev)
|
|||||||
{
|
{
|
||||||
struct drm_device *drm_dev = dev_get_drvdata(dev);
|
struct drm_device *drm_dev = dev_get_drvdata(dev);
|
||||||
struct amdgpu_device *adev = drm_dev->dev_private;
|
struct amdgpu_device *adev = drm_dev->dev_private;
|
||||||
struct drm_crtc *crtc;
|
/* we don't want the main rpm_idle to call suspend - we want to autosuspend */
|
||||||
|
int ret = 1;
|
||||||
|
|
||||||
if (!adev->runpm) {
|
if (!adev->runpm) {
|
||||||
pm_runtime_forbid(dev);
|
pm_runtime_forbid(dev);
|
||||||
return -EBUSY;
|
return -EBUSY;
|
||||||
}
|
}
|
||||||
|
|
||||||
list_for_each_entry(crtc, &drm_dev->mode_config.crtc_list, head) {
|
if (amdgpu_device_has_dc_support(adev)) {
|
||||||
if (crtc->enabled) {
|
struct drm_crtc *crtc;
|
||||||
DRM_DEBUG_DRIVER("failing to power off - crtc active\n");
|
|
||||||
return -EBUSY;
|
drm_modeset_lock_all(drm_dev);
|
||||||
|
|
||||||
|
drm_for_each_crtc(crtc, drm_dev) {
|
||||||
|
if (crtc->state->active) {
|
||||||
|
ret = -EBUSY;
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
drm_modeset_unlock_all(drm_dev);
|
||||||
|
|
||||||
|
} else {
|
||||||
|
struct drm_connector *list_connector;
|
||||||
|
struct drm_connector_list_iter iter;
|
||||||
|
|
||||||
|
mutex_lock(&drm_dev->mode_config.mutex);
|
||||||
|
drm_modeset_lock(&drm_dev->mode_config.connection_mutex, NULL);
|
||||||
|
|
||||||
|
drm_connector_list_iter_begin(drm_dev, &iter);
|
||||||
|
drm_for_each_connector_iter(list_connector, &iter) {
|
||||||
|
if (list_connector->dpms == DRM_MODE_DPMS_ON) {
|
||||||
|
ret = -EBUSY;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
drm_connector_list_iter_end(&iter);
|
||||||
|
|
||||||
|
drm_modeset_unlock(&drm_dev->mode_config.connection_mutex);
|
||||||
|
mutex_unlock(&drm_dev->mode_config.mutex);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (ret == -EBUSY)
|
||||||
|
DRM_DEBUG_DRIVER("failing to power off - crtc active\n");
|
||||||
|
|
||||||
pm_runtime_mark_last_busy(dev);
|
pm_runtime_mark_last_busy(dev);
|
||||||
pm_runtime_autosuspend(dev);
|
pm_runtime_autosuspend(dev);
|
||||||
/* we don't want the main rpm_idle to call suspend - we want to autosuspend */
|
return ret;
|
||||||
return 1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
long amdgpu_drm_ioctl(struct file *filp,
|
long amdgpu_drm_ioctl(struct file *filp,
|
||||||
|
Loading…
Reference in New Issue
Block a user