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

drm/nouveau/fifo: add id_engine hook



Will be used by common code in subsequent commits to lookup driver
engine state from HW engine ID.

Signed-off-by: default avatarBen Skeggs <bskeggs@redhat.com>
Reviewed-by: default avatarLyude Paul <lyude@redhat.com>
parent 3e7d4a0c
Loading
Loading
Loading
Loading
+47 −0
Original line number Diff line number Diff line
@@ -38,6 +38,52 @@ g84_fifo_uevent_init(struct nvkm_fifo *fifo)
	nvkm_mask(device, 0x002140, 0x40000000, 0x40000000);
}

static 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);
}

static int
g84_fifo_engine_id(struct nvkm_fifo *base, struct nvkm_engine *engine)
{
@@ -67,6 +113,7 @@ 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,
+17 −13
Original line number Diff line number Diff line
@@ -105,23 +105,26 @@ gf100_fifo_runlist_insert(struct gf100_fifo *fifo, struct gf100_fifo_chan *chan)
	mutex_unlock(&fifo->base.mutex);
}

static inline struct nvkm_engine *
gf100_fifo_engine(struct gf100_fifo *fifo, u32 engn)
static struct nvkm_engine *
gf100_fifo_id_engine(struct nvkm_fifo *fifo, int engi)
{
	struct nvkm_device *device = fifo->base.engine.subdev.device;

	switch (engn) {
	case 0: engn = NVKM_ENGINE_GR; break;
	case 1: engn = NVKM_ENGINE_MSVLD; break;
	case 2: engn = NVKM_ENGINE_MSPPP; break;
	case 3: engn = NVKM_ENGINE_MSPDEC; break;
	case 4: engn = NVKM_ENGINE_CE0; break;
	case 5: engn = NVKM_ENGINE_CE1; break;
	enum nvkm_subdev_type type;
	int inst;

	switch (engi) {
	case GF100_FIFO_ENGN_GR    : type = NVKM_ENGINE_GR    ; inst = 0; break;
	case GF100_FIFO_ENGN_MSPDEC: type = NVKM_ENGINE_MSPDEC; inst = 0; break;
	case GF100_FIFO_ENGN_MSPPP : type = NVKM_ENGINE_MSPPP ; inst = 0; break;
	case GF100_FIFO_ENGN_MSVLD : type = NVKM_ENGINE_MSVLD ; inst = 0; break;
	case GF100_FIFO_ENGN_CE0   : type = NVKM_ENGINE_CE    ; inst = 0; break;
	case GF100_FIFO_ENGN_CE1   : type = NVKM_ENGINE_CE    ; inst = 1; break;
	case GF100_FIFO_ENGN_SW    : type = NVKM_ENGINE_SW    ; inst = 0; break;
	default:
		WARN_ON(1);
		return NULL;
	}

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

static int
@@ -337,7 +340,7 @@ gf100_fifo_intr_sched_ctxsw(struct gf100_fifo *fifo)
		if (busy && unk0 && unk1) {
			list_for_each_entry(chan, &fifo->chan, head) {
				if (chan->base.chid == chid) {
					engine = gf100_fifo_engine(fifo, engn);
					engine = gf100_fifo_id_engine(&fifo->base, engn);
					if (!engine)
						break;
					gf100_fifo_recover(fifo, engine, chan);
@@ -676,6 +679,7 @@ gf100_fifo = {
	.intr = gf100_fifo_intr,
	.fault = gf100_fifo_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,
	.chan = {
+7 −0
Original line number Diff line number Diff line
@@ -258,6 +258,12 @@ gk104_fifo_pbdma = {
	.init = gk104_fifo_pbdma_init,
};

struct nvkm_engine *
gk104_fifo_id_engine(struct nvkm_fifo *base, int engi)
{
	return gk104_fifo(base)->engine[engi].engine;
}

int
gk104_fifo_engine_id(struct nvkm_fifo *base, struct nvkm_engine *engine)
{
@@ -1037,6 +1043,7 @@ gk104_fifo_ = {
	.intr = gk104_fifo_intr,
	.fault = gk104_fifo_fault,
	.engine_id = gk104_fifo_engine_id,
	.id_engine = gk104_fifo_id_engine,
	.uevent_init = gk104_fifo_uevent_init,
	.uevent_fini = gk104_fifo_uevent_fini,
	.recover_chan = gk104_fifo_recover_chan,
+19 −0
Original line number Diff line number Diff line
@@ -94,6 +94,24 @@ __releases(fifo->base.lock)
	spin_unlock_irqrestore(&fifo->base.lock, flags);
}

struct nvkm_engine *
nv04_fifo_id_engine(struct nvkm_fifo *fifo, int engi)
{
	enum nvkm_subdev_type type;

	switch (engi) {
	case NV04_FIFO_ENGN_SW  : type = NVKM_ENGINE_SW; break;
	case NV04_FIFO_ENGN_GR  : type = NVKM_ENGINE_GR; break;
	case NV04_FIFO_ENGN_MPEG: type = NVKM_ENGINE_MPEG; break;
	case NV04_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
nv04_fifo_engine_id(struct nvkm_fifo *base, struct nvkm_engine *engine)
{
@@ -364,6 +382,7 @@ nv04_fifo = {
	.init = nv04_fifo_init,
	.intr = nv04_fifo_intr,
	.engine_id = nv04_fifo_engine_id,
	.id_engine = nv04_fifo_id_engine,
	.pause = nv04_fifo_pause,
	.start = nv04_fifo_start,
	.chan = {
+1 −0
Original line number Diff line number Diff line
@@ -44,6 +44,7 @@ nv10_fifo = {
	.init = nv04_fifo_init,
	.intr = nv04_fifo_intr,
	.engine_id = nv04_fifo_engine_id,
	.id_engine = nv04_fifo_id_engine,
	.pause = nv04_fifo_pause,
	.start = nv04_fifo_start,
	.chan = {
Loading