Commit 1786bf56 authored by Ben Skeggs's avatar Ben Skeggs
Browse files

drm/nouveau/imem/nv50: support pinning objects in BAR2 and returning address



Various structures are accessed by the GPU through BAR2 for some reason
on newer GPUs.  This commit makes it more convenient to handle.

Will be used for GP100- fault buffers, and GV100- fault method buffers.

Signed-off-by: default avatarBen Skeggs <bskeggs@redhat.com>
parent e4f90a35
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -29,6 +29,7 @@ struct nvkm_memory_func {
	void *(*dtor)(struct nvkm_memory *);
	enum nvkm_memory_target (*target)(struct nvkm_memory *);
	u8 (*page)(struct nvkm_memory *);
	u64 (*bar2)(struct nvkm_memory *);
	u64 (*addr)(struct nvkm_memory *);
	u64 (*size)(struct nvkm_memory *);
	void (*boot)(struct nvkm_memory *, struct nvkm_vmm *);
@@ -56,6 +57,7 @@ void nvkm_memory_tags_put(struct nvkm_memory *, struct nvkm_device *,

#define nvkm_memory_target(p) (p)->func->target(p)
#define nvkm_memory_page(p) (p)->func->page(p)
#define nvkm_memory_bar2(p) (p)->func->bar2(p)
#define nvkm_memory_addr(p) (p)->func->addr(p)
#define nvkm_memory_size(p) (p)->func->size(p)
#define nvkm_memory_boot(p,v) (p)->func->boot((p),(v))
+15 −1
Original line number Diff line number Diff line
@@ -288,6 +288,19 @@ nv50_instobj_addr(struct nvkm_memory *memory)
	return nvkm_memory_addr(nv50_instobj(memory)->ram);
}

static u64
nv50_instobj_bar2(struct nvkm_memory *memory)
{
	struct nv50_instobj *iobj = nv50_instobj(memory);
	u64 addr = ~0ULL;
	if (nv50_instobj_acquire(&iobj->base.memory)) {
		iobj->lru.next = NULL; /* Exclude from eviction. */
		addr = iobj->bar->addr;
	}
	nv50_instobj_release(&iobj->base.memory);
	return addr;
}

static enum nvkm_memory_target
nv50_instobj_target(struct nvkm_memory *memory)
{
@@ -325,8 +338,9 @@ static const struct nvkm_memory_func
nv50_instobj_func = {
	.dtor = nv50_instobj_dtor,
	.target = nv50_instobj_target,
	.size = nv50_instobj_size,
	.bar2 = nv50_instobj_bar2,
	.addr = nv50_instobj_addr,
	.size = nv50_instobj_size,
	.boot = nv50_instobj_boot,
	.acquire = nv50_instobj_acquire,
	.release = nv50_instobj_release,