mirror of
https://github.com/torvalds/linux
synced 2024-11-05 18:23:50 +00:00
drm/nouveau: resume display if any later suspend bits fail
If either idling channels or suspending the fence were to fail, the display would never be resumed. Also if a client fails, resume the fence (not functionally important, but it would potentially leak memory). See https://bugs.freedesktop.org/show_bug.cgi?id=70213 Signed-off-by: Ilia Mirkin <imirkin@alum.mit.edu> Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
This commit is contained in:
parent
09c3de1350
commit
f3980dc50c
1 changed files with 10 additions and 4 deletions
|
@ -503,19 +503,21 @@ nouveau_do_suspend(struct drm_device *dev)
|
|||
if (drm->cechan) {
|
||||
ret = nouveau_channel_idle(drm->cechan);
|
||||
if (ret)
|
||||
return ret;
|
||||
goto fail_display;
|
||||
}
|
||||
|
||||
if (drm->channel) {
|
||||
ret = nouveau_channel_idle(drm->channel);
|
||||
if (ret)
|
||||
return ret;
|
||||
goto fail_display;
|
||||
}
|
||||
|
||||
NV_INFO(drm, "suspending client object trees...\n");
|
||||
if (drm->fence && nouveau_fence(drm)->suspend) {
|
||||
if (!nouveau_fence(drm)->suspend(drm))
|
||||
return -ENOMEM;
|
||||
if (!nouveau_fence(drm)->suspend(drm)) {
|
||||
ret = -ENOMEM;
|
||||
goto fail_display;
|
||||
}
|
||||
}
|
||||
|
||||
list_for_each_entry(cli, &drm->clients, head) {
|
||||
|
@ -537,6 +539,10 @@ nouveau_do_suspend(struct drm_device *dev)
|
|||
nouveau_client_init(&cli->base);
|
||||
}
|
||||
|
||||
if (drm->fence && nouveau_fence(drm)->resume)
|
||||
nouveau_fence(drm)->resume(drm);
|
||||
|
||||
fail_display:
|
||||
if (dev->mode_config.num_crtc) {
|
||||
NV_INFO(drm, "resuming display...\n");
|
||||
nouveau_display_resume(dev);
|
||||
|
|
Loading…
Reference in a new issue