Commit 0fc72ee9 authored by Ben Skeggs's avatar Ben Skeggs
Browse files

drm/nouveau/fifo: use runlist engine info to lookup engine classes



Signed-off-by: default avatarBen Skeggs <bskeggs@redhat.com>
Reviewed-by: default avatarLyude Paul <lyude@redhat.com>
parent 468fae7b
Loading
Loading
Loading
Loading
+0 −1
Original line number Diff line number Diff line
@@ -22,7 +22,6 @@ struct nvkm_chan {
	union { int id; int chid; }; /*FIXME: remove later */

	struct nvkm_fifo *fifo;
	u32 engm;
	struct nvkm_object object;

	struct list_head head;
+0 −46
Original line number Diff line number Diff line
@@ -216,50 +216,6 @@ nvkm_fifo_chan_child_new(const struct nvkm_oclass *oclass, void *data, u32 size,
	return 0;
}

static int
nvkm_fifo_chan_child_get(struct nvkm_object *object, int index,
			 struct nvkm_oclass *oclass)
{
	struct nvkm_fifo_chan *chan = nvkm_fifo_chan(object);
	struct nvkm_fifo *fifo = chan->fifo;
	struct nvkm_engine *engine;
	u32 engm = chan->engm;
	int engi, ret, c;

	for (; c = 0, engi = __ffs(engm), engm; engm &= ~(1ULL << engi)) {
		if (!(engine = fifo->func->id_engine(fifo, engi)))
			continue;
		oclass->engine = engine;
		oclass->base.oclass = 0;

		if (engine->func->fifo.sclass) {
			ret = engine->func->fifo.sclass(oclass, index);
			if (oclass->base.oclass) {
				if (!oclass->base.ctor)
					oclass->base.ctor = nvkm_object_new;
				oclass->ctor = nvkm_fifo_chan_child_new;
				return 0;
			}

			index -= ret;
			continue;
		}

		while (engine->func->sclass[c].oclass) {
			if (c++ == index) {
				oclass->base = engine->func->sclass[index];
				if (!oclass->base.ctor)
					oclass->base.ctor = nvkm_object_new;
				oclass->ctor = nvkm_fifo_chan_child_new;
				return 0;
			}
		}
		index -= c;
	}

	return -EINVAL;
}

static int
nvkm_fifo_chan_uevent(struct nvkm_object *object, void *argv, u32 argc, struct nvkm_uevent *uevent)
{
@@ -355,7 +311,6 @@ nvkm_fifo_chan_func = {
	.init = nvkm_fifo_chan_init,
	.fini = nvkm_fifo_chan_fini,
	.map = nvkm_fifo_chan_map,
	.sclass = nvkm_fifo_chan_child_get,
	.uevent = nvkm_fifo_chan_uevent,
};

@@ -407,7 +362,6 @@ nvkm_fifo_chan_ctor(const struct nvkm_fifo_chan_func *fn,

	nvkm_object_ctor(&nvkm_fifo_chan_func, oclass, &chan->object);
	chan->fifo = fifo;
	chan->engm = engm;
	INIT_LIST_HEAD(&chan->head);

	/* Join channel group.
+0 −47
Original line number Diff line number Diff line
@@ -51,52 +51,6 @@ g84_fifo_uevent_init(struct nvkm_fifo *fifo)
	nvkm_mask(device, 0x002140, 0x40000000, 0x40000000);
}

struct nvkm_engine *
g84_fifo_id_engine(struct nvkm_fifo *fifo, int engi)
{
	struct nvkm_device *device = fifo->engine.subdev.device;
	struct nvkm_engine *engine;
	enum nvkm_subdev_type type;

	switch (engi) {
	case G84_FIFO_ENGN_SW    : type = NVKM_ENGINE_SW; break;
	case G84_FIFO_ENGN_GR    : type = NVKM_ENGINE_GR; break;
	case G84_FIFO_ENGN_MPEG  :
		if ((engine = nvkm_device_engine(device, NVKM_ENGINE_MSPPP, 0)))
			return engine;
		type = NVKM_ENGINE_MPEG;
		break;
	case G84_FIFO_ENGN_ME    :
		if ((engine = nvkm_device_engine(device, NVKM_ENGINE_CE, 0)))
			return engine;
		type = NVKM_ENGINE_ME;
		break;
	case G84_FIFO_ENGN_VP    :
		if ((engine = nvkm_device_engine(device, NVKM_ENGINE_MSPDEC, 0)))
			return engine;
		type = NVKM_ENGINE_VP;
		break;
	case G84_FIFO_ENGN_CIPHER:
		if ((engine = nvkm_device_engine(device, NVKM_ENGINE_VIC, 0)))
			return engine;
		if ((engine = nvkm_device_engine(device, NVKM_ENGINE_SEC, 0)))
			return engine;
		type = NVKM_ENGINE_CIPHER;
		break;
	case G84_FIFO_ENGN_BSP   :
		if ((engine = nvkm_device_engine(device, NVKM_ENGINE_MSVLD, 0)))
			return engine;
		type = NVKM_ENGINE_BSP;
		break;
	case G84_FIFO_ENGN_DMA   : type = NVKM_ENGINE_DMAOBJ; break;
	default:
		WARN_ON(1);
		return NULL;
	}

	return nvkm_device_engine(fifo->engine.subdev.device, type, 0);
}

int
g84_fifo_engine_id(struct nvkm_fifo *base, struct nvkm_engine *engine)
{
@@ -149,7 +103,6 @@ g84_fifo = {
	.init = nv50_fifo_init,
	.intr = nv04_fifo_intr,
	.engine_id = g84_fifo_engine_id,
	.id_engine = g84_fifo_id_engine,
	.pause = nv04_fifo_pause,
	.start = nv04_fifo_start,
	.uevent_init = g84_fifo_uevent_init,
+0 −1
Original line number Diff line number Diff line
@@ -57,7 +57,6 @@ g98_fifo = {
	.init = nv50_fifo_init,
	.intr = nv04_fifo_intr,
	.engine_id = g84_fifo_engine_id,
	.id_engine = g84_fifo_id_engine,
	.pause = nv04_fifo_pause,
	.start = nv04_fifo_start,
	.uevent_init = g84_fifo_uevent_init,
+0 −1
Original line number Diff line number Diff line
@@ -741,7 +741,6 @@ gf100_fifo = {
	.intr = gf100_fifo_intr,
	.mmu_fault = &gf100_fifo_mmu_fault,
	.engine_id = gf100_fifo_engine_id,
	.id_engine = gf100_fifo_id_engine,
	.uevent_init = gf100_fifo_uevent_init,
	.uevent_fini = gf100_fifo_uevent_fini,
	.runl = &gf100_runl,
Loading