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 { ...@@ -9,6 +9,7 @@ struct nvkm_instmem {
spinlock_t lock; spinlock_t lock;
struct list_head list; struct list_head list;
struct list_head boot;
u32 reserved; u32 reserved;
struct nvkm_memory *vbios; struct nvkm_memory *vbios;
......
...@@ -129,6 +129,21 @@ nvkm_instmem_wr32(struct nvkm_instmem *imem, u32 addr, u32 data) ...@@ -129,6 +129,21 @@ nvkm_instmem_wr32(struct nvkm_instmem *imem, u32 addr, u32 data)
return imem->func->wr32(imem, addr, 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 static int
nvkm_instmem_fini(struct nvkm_subdev *subdev, bool suspend) nvkm_instmem_fini(struct nvkm_subdev *subdev, bool suspend)
{ {
...@@ -141,6 +156,12 @@ nvkm_instmem_fini(struct nvkm_subdev *subdev, bool suspend) ...@@ -141,6 +156,12 @@ nvkm_instmem_fini(struct nvkm_subdev *subdev, bool suspend)
if (ret) if (ret)
return 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) if (imem->func->fini)
...@@ -155,6 +176,11 @@ nvkm_instmem_init(struct nvkm_subdev *subdev) ...@@ -155,6 +176,11 @@ nvkm_instmem_init(struct nvkm_subdev *subdev)
struct nvkm_instmem *imem = nvkm_instmem(subdev); struct nvkm_instmem *imem = nvkm_instmem(subdev);
struct nvkm_instobj *iobj; 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) { list_for_each_entry(iobj, &imem->list, head) {
if (iobj->suspend) if (iobj->suspend)
nvkm_instobj_load(iobj); nvkm_instobj_load(iobj);
...@@ -198,4 +224,5 @@ nvkm_instmem_ctor(const struct nvkm_instmem_func *func, ...@@ -198,4 +224,5 @@ nvkm_instmem_ctor(const struct nvkm_instmem_func *func,
imem->func = func; imem->func = func;
spin_lock_init(&imem->lock); spin_lock_init(&imem->lock);
INIT_LIST_HEAD(&imem->list); 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) ...@@ -271,6 +271,7 @@ nv50_instobj_boot(struct nvkm_memory *memory, struct nvkm_vmm *vmm)
} }
nv50_instobj_kmap(iobj, vmm); nv50_instobj_kmap(iobj, vmm);
nvkm_instmem_boot(imem);
mutex_unlock(&imem->subdev.mutex); mutex_unlock(&imem->subdev.mutex);
} }
......
...@@ -16,6 +16,7 @@ struct nvkm_instmem_func { ...@@ -16,6 +16,7 @@ struct nvkm_instmem_func {
void nvkm_instmem_ctor(const struct nvkm_instmem_func *, struct nvkm_device *, void nvkm_instmem_ctor(const struct nvkm_instmem_func *, struct nvkm_device *,
int index, struct nvkm_instmem *); int index, struct nvkm_instmem *);
void nvkm_instmem_boot(struct nvkm_instmem *);
#include <core/memory.h> #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