mirror of
https://github.com/torvalds/linux.git
synced 2026-08-02 05:12:01 +02: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:
parent
54c70e3ac6
commit
b00b843046
|
|
@ -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>
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user