Commit ffd937bb authored by Ben Skeggs's avatar Ben Skeggs
Browse files

drm/nouveau/imem: use fast-path for resume restore



Before: "imem: init completed in 299277us"
 After: "imem: init completed in  11574us"

Suspend from Fedora 26 gnome desktop on GP102.

Signed-off-by: default avatarBen Skeggs <bskeggs@redhat.com>
parent e9be3c7d
Loading
Loading
Loading
Loading
+0 −1
Original line number Diff line number Diff line
@@ -81,7 +81,6 @@ static int
nvkm_bar_init(struct nvkm_subdev *subdev)
{
	struct nvkm_bar *bar = nvkm_bar(subdev);
	nvkm_bar_bar2_init(subdev->device);
	bar->func->bar1.init(bar);
	bar->func->bar1.wait(bar);
	if (bar->func->init)
+11 −2
Original line number Diff line number Diff line
@@ -33,10 +33,17 @@ nvkm_instobj_load(struct nvkm_instobj *iobj)
{
	struct nvkm_memory *memory = &iobj->memory;
	const u64 size = nvkm_memory_size(memory);
	void __iomem *map;
	int i;

	if (!(map = nvkm_kmap(memory))) {
		for (i = 0; i < size; i += 4)
			nvkm_wo32(memory, i, iobj->suspend[i / 4]);
	} else {
		memcpy_toio(map, iobj->suspend, size);
	}
	nvkm_done(memory);

	kvfree(iobj->suspend);
	iobj->suspend = NULL;
}
@@ -188,6 +195,8 @@ nvkm_instmem_init(struct nvkm_subdev *subdev)
			nvkm_instobj_load(iobj);
	}

	nvkm_bar_bar2_init(subdev->device);

	list_for_each_entry(iobj, &imem->list, head) {
		if (iobj->suspend)
			nvkm_instobj_load(iobj);
+1 −2
Original line number Diff line number Diff line
@@ -206,7 +206,7 @@ nv50_instobj_release(struct nvkm_memory *memory)
		}

		/* Switch back to NULL accessors when last map is gone. */
		iobj->base.memory.ptrs = &nv50_instobj_slow;
		iobj->base.memory.ptrs = NULL;
		mutex_unlock(&subdev->mutex);
	}
}
@@ -345,7 +345,6 @@ nv50_instobj_new(struct nvkm_instmem *base, u32 size, u32 align, bool zero,
	*pmemory = &iobj->base.memory;

	nvkm_instobj_ctor(&nv50_instobj_func, &imem->base, &iobj->base);
	iobj->base.memory.ptrs = &nv50_instobj_slow;
	iobj->imem = imem;
	refcount_set(&iobj->maps, 0);
	INIT_LIST_HEAD(&iobj->lru);