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

drm/nouveau/fifo: add USERD info to nvkm_chan_func



And use it to cleanup multiple implementations of almost the same thing.

- prepares for non-polled / client-provided USERD
- only zeroes relevant "registers", rather than entire USERD

Signed-off-by: default avatarBen Skeggs <bskeggs@redhat.com>
Reviewed-by: default avatarLyude Paul <lyude@redhat.com>
parent d3e7a439
Loading
Loading
Loading
Loading
+10 −2
Original line number Diff line number Diff line
@@ -23,6 +23,11 @@ struct nvkm_chan {
	struct nvkm_vmm *vmm;
	union { int id; int chid; }; /*FIXME: remove later */

	struct {
		struct nvkm_memory *mem;
		u32 base;
	} userd;

	spinlock_t lock;
	atomic_t blocked;
	atomic_t errored;
@@ -34,8 +39,6 @@ struct nvkm_chan {

	struct list_head head;
	struct nvkm_gpuobj *push;
	u64 addr;
	u32 size;

	struct nvkm_fifo_engn engn[NVKM_FIFO_ENGN_NR];
};
@@ -63,6 +66,11 @@ struct nvkm_fifo {
		u32 chan_msec;
	} timeout;

	struct {
		struct nvkm_memory *mem;
		struct nvkm_vma *bar1;
	} userd;

	int nr;
	spinlock_t lock;
	struct mutex mutex;
+25 −0
Original line number Diff line number Diff line
@@ -28,7 +28,9 @@
#include "runq.h"

#include <core/gpuobj.h>
#include <subdev/bar.h>
#include <subdev/mc.h>
#include <subdev/mmu.h>

#include <nvif/cl0080.h>
#include <nvif/unpack.h>
@@ -243,6 +245,25 @@ nvkm_fifo_oneinit(struct nvkm_engine *engine)
		}
	}

	/* Allocate USERD + BAR1 polling area. */
	if (fifo->func->chan.func->userd->bar == 1) {
		struct nvkm_vmm *bar1 = nvkm_bar_bar1_vmm(device);

		ret = nvkm_memory_new(device, NVKM_MEM_TARGET_INST, fifo->chid->nr *
				      fifo->func->chan.func->userd->size, 0, true,
				      &fifo->userd.mem);
		if (ret)
			return ret;

		ret = nvkm_vmm_get(bar1, 12, nvkm_memory_size(fifo->userd.mem), &fifo->userd.bar1);
		if (ret)
			return ret;

		ret = nvkm_memory_map(fifo->userd.mem, 0, bar1, fifo->userd.bar1, NULL, 0);
		if (ret)
			return ret;
	}

	if (fifo->func->oneinit)
		return fifo->func->oneinit(fifo);

@@ -263,6 +284,10 @@ nvkm_fifo_dtor(struct nvkm_engine *engine)
	struct nvkm_runq *runq, *rtmp;
	void *data = fifo;

	if (fifo->userd.bar1)
		nvkm_vmm_put(nvkm_bar_bar1_vmm(engine->subdev.device), &fifo->userd.bar1);
	nvkm_memory_unref(&fifo->userd.mem);

	list_for_each_entry_safe(runl, runt, &fifo->runls, head)
		nvkm_runl_del(runl);
	list_for_each_entry_safe(runq, rtmp, &fifo->runqs, head)
+11 −16
Original line number Diff line number Diff line
@@ -328,17 +328,6 @@ nvkm_chan_preempt(struct nvkm_chan *chan, bool wait)
	return ret;
}

static int
nvkm_fifo_chan_map(struct nvkm_object *object, void *argv, u32 argc,
		   enum nvkm_object_map *type, u64 *addr, u64 *size)
{
	struct nvkm_fifo_chan *chan = nvkm_fifo_chan(object);
	*type = NVKM_OBJECT_MAP_IO;
	*addr = chan->addr;
	*size = chan->size;
	return 0;
}

void
nvkm_chan_remove_locked(struct nvkm_chan *chan)
{
@@ -445,6 +434,8 @@ nvkm_chan_del(struct nvkm_chan **pchan)
	if (!chan)
		return;

	nvkm_memory_unref(&chan->userd.mem);

	if (chan->cgrp) {
		nvkm_chid_put(chan->cgrp->runl->chid, chan->id, &chan->cgrp->lock);
		nvkm_cgrp_unref(&chan->cgrp);
@@ -524,7 +515,6 @@ nvkm_chan_get_chid(struct nvkm_engine *engine, int id, unsigned long *pirqflags)
static const struct nvkm_object_func
nvkm_fifo_chan_func = {
	.dtor = nvkm_fifo_chan_dtor,
	.map = nvkm_fifo_chan_map,
};

int
@@ -650,9 +640,14 @@ nvkm_fifo_chan_ctor(const struct nvkm_fifo_chan_func *fn,
	if (cgrp->id < 0)
		cgrp->id = chan->id;

	/* determine address of this channel's user registers */
	chan->addr = device->func->resource_addr(device, bar) +
		     base + user * chan->chid;
	chan->size = user;
	/* Initialise USERD. */
	if (1) {
		chan->userd.mem = nvkm_memory_ref(fifo->userd.mem);
		chan->userd.base = chan->id * chan->func->userd->size;
	}

	if (chan->func->userd->clear)
		chan->func->userd->clear(chan);

	return 0;
}
+7 −0
Original line number Diff line number Diff line
@@ -22,6 +22,13 @@ struct nvkm_chan_func {
		bool vmm;
	} *inst;

	const struct nvkm_chan_func_userd {
		int bar;
		u32 base;
		u32 size;
		void (*clear)(struct nvkm_chan *);
	} *userd;

	void (*bind)(struct nvkm_chan *);
	void (*unbind)(struct nvkm_chan *);
	void (*start)(struct nvkm_chan *);
+1 −0
Original line number Diff line number Diff line
@@ -43,6 +43,7 @@ g84_chan_bind(struct nvkm_chan *chan)
const struct nvkm_chan_func
g84_chan = {
	.inst = &nv50_chan_inst,
	.userd = &nv50_chan_userd,
	.bind = g84_chan_bind,
	.unbind = nv50_chan_unbind,
	.start = nv50_chan_start,
Loading