aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBen Skeggs <bskeggs@redhat.com>2017-11-01 03:56:19 +1000
committerBen Skeggs <bskeggs@redhat.com>2017-11-02 13:32:20 +1000
commitffd937bbd219331e4b67344c104dea09b9ed4a6a (patch)
tree6f2e90e3506bae84f076aa27608b2e2977a794e9
parentdrm/nouveau/imem: use fast-path for suspend backup (diff)
downloadlinux-dev-ffd937bbd219331e4b67344c104dea09b9ed4a6a.tar.xz
linux-dev-ffd937bbd219331e4b67344c104dea09b9ed4a6a.zip
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: Ben Skeggs <bskeggs@redhat.com>
-rw-r--r--drivers/gpu/drm/nouveau/nvkm/subdev/bar/base.c1
-rw-r--r--drivers/gpu/drm/nouveau/nvkm/subdev/instmem/base.c13
-rw-r--r--drivers/gpu/drm/nouveau/nvkm/subdev/instmem/nv50.c3
3 files changed, 12 insertions, 5 deletions
diff --git a/drivers/gpu/drm/nouveau/nvkm/subdev/bar/base.c b/drivers/gpu/drm/nouveau/nvkm/subdev/bar/base.c
index 190fb730de17..9646adec57cb 100644
--- a/drivers/gpu/drm/nouveau/nvkm/subdev/bar/base.c
+++ b/drivers/gpu/drm/nouveau/nvkm/subdev/bar/base.c
@@ -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)
diff --git a/drivers/gpu/drm/nouveau/nvkm/subdev/instmem/base.c b/drivers/gpu/drm/nouveau/nvkm/subdev/instmem/base.c
index d7df7cb6bed3..b03940591a3a 100644
--- a/drivers/gpu/drm/nouveau/nvkm/subdev/instmem/base.c
+++ b/drivers/gpu/drm/nouveau/nvkm/subdev/instmem/base.c
@@ -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;
- for (i = 0; i < size; i += 4)
- nvkm_wo32(memory, i, iobj->suspend[i / 4]);
+ 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);
diff --git a/drivers/gpu/drm/nouveau/nvkm/subdev/instmem/nv50.c b/drivers/gpu/drm/nouveau/nvkm/subdev/instmem/nv50.c
index be5670f9fefa..4ccb8cdc7dbc 100644
--- a/drivers/gpu/drm/nouveau/nvkm/subdev/instmem/nv50.c
+++ b/drivers/gpu/drm/nouveau/nvkm/subdev/instmem/nv50.c
@@ -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);