Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 344c2d42 authored by Ben Skeggs's avatar Ben Skeggs
Browse files

drm/nouveau/fb: remove dependence on namedb/engctx lookup



Signed-off-by: default avatarBen Skeggs <bskeggs@redhat.com>
parent 898a2b32
Loading
Loading
Loading
Loading
+8 −0
Original line number Diff line number Diff line
@@ -9,6 +9,7 @@ struct nvkm_fifo_chan {
	u64 addr;
	u32 size;
	u16 chid;
	u64 inst;
};

static inline struct nvkm_fifo_chan *
@@ -81,6 +82,13 @@ struct nvkm_fifo {
	void (*start)(struct nvkm_fifo *, unsigned long *);
};

void nvkm_fifo_chan_put(struct nvkm_fifo *, unsigned long flags,
			struct nvkm_fifo_chan **);
struct nvkm_fifo_chan *
nvkm_fifo_chan_inst(struct nvkm_fifo *, u64 inst, unsigned long *flags);
struct nvkm_fifo_chan *
nvkm_fifo_chan_chid(struct nvkm_fifo *, int chid, unsigned long *flags);

static inline struct nvkm_fifo *
nvkm_fifo(void *obj)
{
+41 −0
Original line number Diff line number Diff line
@@ -32,6 +32,47 @@
#include <nvif/event.h>
#include <nvif/unpack.h>

void
nvkm_fifo_chan_put(struct nvkm_fifo *fifo, unsigned long flags,
		   struct nvkm_fifo_chan **pchan)
{
	struct nvkm_fifo_chan *chan = *pchan;
	if (likely(chan)) {
		*pchan = NULL;
		spin_unlock_irqrestore(&fifo->lock, flags);
	}
}

struct nvkm_fifo_chan *
nvkm_fifo_chan_inst(struct nvkm_fifo *fifo, u64 inst, unsigned long *rflags)
{
	unsigned long flags;
	int i;
	spin_lock_irqsave(&fifo->lock, flags);
	for (i = fifo->min; i < fifo->max; i++) {
		struct nvkm_fifo_chan *chan = (void *)fifo->channel[i];
		if (chan && chan->inst == inst) {
			*rflags = flags;
			return chan;
		}
	}
	spin_unlock_irqrestore(&fifo->lock, flags);
	return NULL;
}

struct nvkm_fifo_chan *
nvkm_fifo_chan_chid(struct nvkm_fifo *fifo, int chid, unsigned long *rflags)
{
	unsigned long flags;
	spin_lock_irqsave(&fifo->lock, flags);
	if (fifo->channel[chid]) {
		*rflags = flags;
		return (void *)fifo->channel[chid];
	}
	spin_unlock_irqrestore(&fifo->lock, flags);
	return NULL;
}

static int
nvkm_fifo_event_ctor(struct nvkm_object *object, void *data, u32 size,
		     struct nvkm_notify *notify)
+2 −0
Original line number Diff line number Diff line
@@ -207,6 +207,7 @@ g84_fifo_chan_ctor_dma(struct nvkm_object *parent, struct nvkm_object *engine,
	if (ret)
		return ret;

	chan->base.inst = base->base.gpuobj.addr;
	args->v0.chid = chan->base.chid;

	ret = nvkm_ramht_new(device, 0x8000, 16, &base->base.gpuobj,
@@ -285,6 +286,7 @@ g84_fifo_chan_ctor_ind(struct nvkm_object *parent, struct nvkm_object *engine,
	if (ret)
		return ret;

	chan->base.inst = base->base.gpuobj.addr;
	args->v0.chid = chan->base.chid;

	ret = nvkm_ramht_new(device, 0x8000, 16, &base->base.gpuobj,
+1 −0
Original line number Diff line number Diff line
@@ -226,6 +226,7 @@ gf100_fifo_chan_ctor(struct nvkm_object *parent, struct nvkm_object *engine,
	if (ret)
		return ret;

	chan->base.inst = base->base.gpuobj.addr;
	args->v0.chid = chan->base.chid;

	nv_parent(chan)->context_attach = gf100_fifo_context_attach;
+1 −0
Original line number Diff line number Diff line
@@ -283,6 +283,7 @@ gk104_fifo_chan_ctor(struct nvkm_object *parent, struct nvkm_object *engine,
	if (ret)
		return ret;

	chan->base.inst = base->base.gpuobj.addr;
	args->v0.chid = chan->base.chid;

	nv_parent(chan)->context_attach = gk104_fifo_context_attach;
Loading