Commit b00b8430 authored by Ben Skeggs's avatar Ben Skeggs
Browse files

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
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -9,6 +9,7 @@ struct nvkm_instmem {

	spinlock_t lock;
	struct list_head list;
	struct list_head boot;
	u32 reserved;

	struct nvkm_memory *vbios;
+27 −0
Original line number Diff line number Diff line
@@ -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);
}
+1 −0
Original line number Diff line number Diff line
@@ -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);
}

+1 −0
Original line number Diff line number Diff line
@@ -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>