Commit ffd937bb authored by Ben Skeggs's avatar Ben Skeggs

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
...@@ -81,7 +81,6 @@ static int ...@@ -81,7 +81,6 @@ static int
nvkm_bar_init(struct nvkm_subdev *subdev) nvkm_bar_init(struct nvkm_subdev *subdev)
{ {
struct nvkm_bar *bar = nvkm_bar(subdev); struct nvkm_bar *bar = nvkm_bar(subdev);
nvkm_bar_bar2_init(subdev->device);
bar->func->bar1.init(bar); bar->func->bar1.init(bar);
bar->func->bar1.wait(bar); bar->func->bar1.wait(bar);
if (bar->func->init) if (bar->func->init)
......
...@@ -33,10 +33,17 @@ nvkm_instobj_load(struct nvkm_instobj *iobj) ...@@ -33,10 +33,17 @@ nvkm_instobj_load(struct nvkm_instobj *iobj)
{ {
struct nvkm_memory *memory = &iobj->memory; struct nvkm_memory *memory = &iobj->memory;
const u64 size = nvkm_memory_size(memory); const u64 size = nvkm_memory_size(memory);
void __iomem *map;
int i; int i;
for (i = 0; i < size; i += 4) if (!(map = nvkm_kmap(memory))) {
nvkm_wo32(memory, i, iobj->suspend[i / 4]); 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); kvfree(iobj->suspend);
iobj->suspend = NULL; iobj->suspend = NULL;
} }
...@@ -188,6 +195,8 @@ nvkm_instmem_init(struct nvkm_subdev *subdev) ...@@ -188,6 +195,8 @@ nvkm_instmem_init(struct nvkm_subdev *subdev)
nvkm_instobj_load(iobj); nvkm_instobj_load(iobj);
} }
nvkm_bar_bar2_init(subdev->device);
list_for_each_entry(iobj, &imem->list, head) { list_for_each_entry(iobj, &imem->list, head) {
if (iobj->suspend) if (iobj->suspend)
nvkm_instobj_load(iobj); nvkm_instobj_load(iobj);
......
...@@ -206,7 +206,7 @@ nv50_instobj_release(struct nvkm_memory *memory) ...@@ -206,7 +206,7 @@ nv50_instobj_release(struct nvkm_memory *memory)
} }
/* Switch back to NULL accessors when last map is gone. */ /* 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); mutex_unlock(&subdev->mutex);
} }
} }
...@@ -345,7 +345,6 @@ nv50_instobj_new(struct nvkm_instmem *base, u32 size, u32 align, bool zero, ...@@ -345,7 +345,6 @@ nv50_instobj_new(struct nvkm_instmem *base, u32 size, u32 align, bool zero,
*pmemory = &iobj->base.memory; *pmemory = &iobj->base.memory;
nvkm_instobj_ctor(&nv50_instobj_func, &imem->base, &iobj->base); nvkm_instobj_ctor(&nv50_instobj_func, &imem->base, &iobj->base);
iobj->base.memory.ptrs = &nv50_instobj_slow;
iobj->imem = imem; iobj->imem = imem;
refcount_set(&iobj->maps, 0); refcount_set(&iobj->maps, 0);
INIT_LIST_HEAD(&iobj->lru); INIT_LIST_HEAD(&iobj->lru);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment