mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-05-03 18:12:25 -04:00
drm/nouveau/imem: separate pre-BAR2-bootstrap objects from the rest
These will require slow-path access during suspend/resume. Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
This commit is contained in:
@@ -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>
|
||||
|
||||
|
||||
Reference in New Issue
Block a user