Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 81dff21b authored by Ben Skeggs's avatar Ben Skeggs
Browse files

drm/nouveau: ensure channels are stopped before saving fences for suspend



Signed-off-by: default avatarBen Skeggs <bskeggs@redhat.com>
parent b5096566
Loading
Loading
Loading
Loading
+20 −5
Original line number Diff line number Diff line
@@ -453,18 +453,32 @@ nouveau_do_suspend(struct drm_device *dev)
	NV_INFO(drm, "evicting buffers...\n");
	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 (!nouveau_fence(drm)->suspend(drm))
			return -ENOMEM;
	}

	NV_INFO(drm, "suspending client object trees...\n");
	list_for_each_entry(cli, &drm->clients, head) {
		ret = nouveau_client_fini(&cli->base, true);
		if (ret)
			goto fail_client;
	}

	NV_INFO(drm, "suspending kernel object tree...\n");
	ret = nouveau_client_fini(&drm->client.base, true);
	if (ret)
		goto fail_client;
@@ -514,17 +528,18 @@ nouveau_do_resume(struct drm_device *dev)

	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_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) {
		nouveau_client_init(&cli->base);
	}

	if (drm->fence && nouveau_fence(drm)->resume)
		nouveau_fence(drm)->resume(drm);

	nouveau_run_vbios_init(dev);
	nouveau_pm_resume(dev);