Commit b00b8430 authored by Ben Skeggs's avatar Ben Skeggs

drm/nouveau/imem: separate pre-BAR2-bootstrap objects from the rest

These will require slow-path access during suspend/resume.
Signed-off-by: default avatarBen Skeggs <bskeggs@redhat.com>
parent 54c70e3a
......@@ -9,6 +9,7 @@ struct nvkm_instmem {
spinlock_t lock;
struct list_head list;
struct list_head boot;
u32 reserved;
struct nvkm_memory *vbios;
......
......@@ -129,6 +129,21 @@ nvkm_instmem_wr32(struct nvkm_instmem *imem, u32 addr, u32 data)
return imem->func->wr32(imem, addr, data);
}
void
nvkm_instmem_boot(struct nvkm_instmem *imem)
{
/* Separate bootstrapped objects from normal list, as we need
* to make sure they're accessed with the slowpath on suspend
* and resume.
*/
struct nvkm_instobj *iobj, *itmp;
spin_lock(&imem->lock);
list_for_each_entry_safe(iobj, itmp, &imem->list, head) {
list_move_tail(&iobj->head, &imem->boot);
}
spin_unlock(&imem->lock);
}
static int
nvkm_instmem_fini(struct nvkm_subdev *subdev, bool suspend)
{
......@@ -141,6 +156,12 @@ nvkm_instmem_fini(struct nvkm_subdev *subdev, bool suspend)
if (ret)
return ret;
}
list_for_each_entry(iobj, &imem->boot, head) {
int ret = nvkm_instobj_save(iobj);
if (ret)
return ret;
}
}
if (imem->func->fini)
......@@ -155,6 +176,11 @@ nvkm_instmem_init(struct nvkm_subdev *subdev)
struct nvkm_instmem *imem = nvkm_instmem(subdev);
struct nvkm_instobj *iobj;
list_for_each_entry(iobj, &imem->boot, head) {
if (iobj->suspend)
nvkm_instobj_load(iobj);
}
list_for_each_entry(iobj, &imem->list, head) {
if (iobj->suspend)
nvkm_instobj_load(iobj);
......@@ -198,4 +224,5 @@ nvkm_instmem_ctor(const struct nvkm_instmem_func *func,
imem->func = func;
spin_lock_init(&imem->lock);
INIT_LIST_HEAD(&imem->list);
INIT_LIST_HEAD(&imem->boot);
}
......@@ -271,6 +271,7 @@ nv50_instobj_boot(struct nvkm_memory *memory, struct nvkm_vmm *vmm)
}
nv50_instobj_kmap(iobj, vmm);
nvkm_instmem_boot(imem);
mutex_unlock(&imem->subdev.mutex);
}
......
......@@ -16,6 +16,7 @@ struct nvkm_instmem_func {
void nvkm_instmem_ctor(const struct nvkm_instmem_func *, struct nvkm_device *,
int index, struct nvkm_instmem *);
void nvkm_instmem_boot(struct nvkm_instmem *);
#include <core/memory.h>
......
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