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>
This commit is contained in:
Родитель
e9be3c7d7a
Коммит
ffd937bbd2
|
@ -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)
|
||||||
{
|
{
|
||||||
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)
|
||||||
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)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* 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,
|
||||||
*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);
|
||||||
|
|
Загрузка…
Ссылка в новой задаче