drm/nouveau: ensure channels are stopped before saving fences for suspend
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
This commit is contained in:
parent
b5096566f6
commit
81dff21b64
|
@ -453,18 +453,32 @@ nouveau_do_suspend(struct drm_device *dev)
|
||||||
NV_INFO(drm, "evicting buffers...\n");
|
NV_INFO(drm, "evicting buffers...\n");
|
||||||
ttm_bo_evict_mm(&drm->ttm.bdev, TTM_PL_VRAM);
|
ttm_bo_evict_mm(&drm->ttm.bdev, TTM_PL_VRAM);
|
||||||
|
|
||||||
|
NV_INFO(drm, "waiting for kernel channels to go idle...\n");
|
||||||
|
if (drm->cechan) {
|
||||||
|
ret = nouveau_channel_idle(drm->cechan);
|
||||||
|
if (ret)
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (drm->channel) {
|
||||||
|
ret = nouveau_channel_idle(drm->channel);
|
||||||
|
if (ret)
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
NV_INFO(drm, "suspending client object trees...\n");
|
||||||
if (drm->fence && nouveau_fence(drm)->suspend) {
|
if (drm->fence && nouveau_fence(drm)->suspend) {
|
||||||
if (!nouveau_fence(drm)->suspend(drm))
|
if (!nouveau_fence(drm)->suspend(drm))
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
}
|
}
|
||||||
|
|
||||||
NV_INFO(drm, "suspending client object trees...\n");
|
|
||||||
list_for_each_entry(cli, &drm->clients, head) {
|
list_for_each_entry(cli, &drm->clients, head) {
|
||||||
ret = nouveau_client_fini(&cli->base, true);
|
ret = nouveau_client_fini(&cli->base, true);
|
||||||
if (ret)
|
if (ret)
|
||||||
goto fail_client;
|
goto fail_client;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
NV_INFO(drm, "suspending kernel object tree...\n");
|
||||||
ret = nouveau_client_fini(&drm->client.base, true);
|
ret = nouveau_client_fini(&drm->client.base, true);
|
||||||
if (ret)
|
if (ret)
|
||||||
goto fail_client;
|
goto fail_client;
|
||||||
|
@ -514,17 +528,18 @@ nouveau_do_resume(struct drm_device *dev)
|
||||||
|
|
||||||
nouveau_agp_reset(drm);
|
nouveau_agp_reset(drm);
|
||||||
|
|
||||||
NV_INFO(drm, "resuming client object trees...\n");
|
NV_INFO(drm, "resuming kernel object tree...\n");
|
||||||
nouveau_client_init(&drm->client.base);
|
nouveau_client_init(&drm->client.base);
|
||||||
nouveau_agp_init(drm);
|
nouveau_agp_init(drm);
|
||||||
|
|
||||||
|
NV_INFO(drm, "resuming client object trees...\n");
|
||||||
|
if (drm->fence && nouveau_fence(drm)->resume)
|
||||||
|
nouveau_fence(drm)->resume(drm);
|
||||||
|
|
||||||
list_for_each_entry(cli, &drm->clients, head) {
|
list_for_each_entry(cli, &drm->clients, head) {
|
||||||
nouveau_client_init(&cli->base);
|
nouveau_client_init(&cli->base);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (drm->fence && nouveau_fence(drm)->resume)
|
|
||||||
nouveau_fence(drm)->resume(drm);
|
|
||||||
|
|
||||||
nouveau_run_vbios_init(dev);
|
nouveau_run_vbios_init(dev);
|
||||||
nouveau_pm_resume(dev);
|
nouveau_pm_resume(dev);
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue