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

drm/nouveau/fifo: unify handling of channel classes



Adds the basic skeleton for common channel (group) interfaces.

- common behaviour between <gk104 and >=gk104 impl's
- separates priv/user channel objects
- passthrough to existing object for now, kludges removed later

Signed-off-by: default avatarBen Skeggs <bskeggs@redhat.com>
Reviewed-by: default avatarLyude Paul <lyude@redhat.com>
parent 8c18138c
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -41,6 +41,7 @@
#define NVIF_CLASS_DISP_CHAN                         /* if0014.h */  0x80000014

#define NVIF_CLASS_CHAN                              /* if0020.h */  0x80000020
#define NVIF_CLASS_CGRP                              /* if0021.h */  0x80000021

/* the below match nvidia-assigned (either in hw, or sw) class numbers */
#define NV_NULL_CLASS                                                0x00000030
@@ -74,6 +75,8 @@
#define NV17_CHANNEL_DMA                              /* cl506b.h */ 0x0000176e
#define NV40_CHANNEL_DMA                              /* cl506b.h */ 0x0000406e

#define KEPLER_CHANNEL_GROUP_A                        /* if0021.h */ 0x0000a06c

#define NV50_CHANNEL_GPFIFO                           /* cl506f.h */ 0x0000506f
#define G82_CHANNEL_GPFIFO                            /* cl826f.h */ 0x0000826f
#define FERMI_CHANNEL_GPFIFO                          /* cl906f.h */ 0x0000906f
+4 −0
Original line number Diff line number Diff line
@@ -35,4 +35,8 @@ nvkm_blob_dtor(struct nvkm_blob *blob)
	blob->size = 0;
}

/*FIXME: remove after */
#define nvkm_fifo_chan nvkm_chan
#define nvkm_fifo_chan_func nvkm_chan_func
#define nvkm_fifo_cgrp nvkm_cgrp
#endif
+3 −2
Original line number Diff line number Diff line
@@ -15,8 +15,9 @@ struct nvkm_fifo_engn {
	int usecount;
};

struct nvkm_fifo_chan {
	const struct nvkm_fifo_chan_func *func;
struct nvkm_chan {
	const struct nvkm_chan_func *func;

	struct nvkm_fifo *fifo;
	u32 engm;
	struct nvkm_object object;
+2 −0
Original line number Diff line number Diff line
@@ -33,3 +33,5 @@ nvkm-y += nvkm/engine/fifo/gpfifogf100.o
nvkm-y += nvkm/engine/fifo/gpfifogk104.o
nvkm-y += nvkm/engine/fifo/gpfifogv100.o
nvkm-y += nvkm/engine/fifo/gpfifotu102.o

nvkm-y += nvkm/engine/fifo/uchan.o
+14 −29
Original line number Diff line number Diff line
@@ -155,27 +155,16 @@ nvkm_fifo_uevent(struct nvkm_fifo *fifo)
}

static int
nvkm_fifo_class_new_(struct nvkm_device *device,
		     const struct nvkm_oclass *oclass, void *data, u32 size,
		     struct nvkm_object **pobject)
nvkm_fifo_class_new(struct nvkm_device *device, const struct nvkm_oclass *oclass,
		    void *argv, u32 argc, struct nvkm_object **pobject)
{
	struct nvkm_fifo *fifo = nvkm_fifo(oclass->engine);
	return fifo->func->class_new(fifo, oclass, data, size, pobject);
}

static const struct nvkm_device_oclass
nvkm_fifo_class_ = {
	.ctor = nvkm_fifo_class_new_,
};
	if (oclass->engn == &fifo->func->chan.user)
		return nvkm_uchan_new(fifo, NULL, oclass, argv, argc, pobject);

static int
nvkm_fifo_class_new(struct nvkm_device *device,
		    const struct nvkm_oclass *oclass, void *data, u32 size,
		    struct nvkm_object **pobject)
{
	const struct nvkm_fifo_chan_oclass *sclass = oclass->engn;
	struct nvkm_fifo *fifo = nvkm_fifo(oclass->engine);
	return sclass->ctor(fifo, oclass, data, size, pobject);
	WARN_ON(1);
	return -ENOSYS;
}

static const struct nvkm_device_oclass
@@ -184,24 +173,20 @@ nvkm_fifo_class = {
};

static int
nvkm_fifo_class_get(struct nvkm_oclass *oclass, int index,
		    const struct nvkm_device_oclass **class)
nvkm_fifo_class_get(struct nvkm_oclass *oclass, int index, const struct nvkm_device_oclass **class)
{
	struct nvkm_fifo *fifo = nvkm_fifo(oclass->engine);
	const struct nvkm_fifo_chan_oclass *sclass;
	const struct nvkm_fifo_func_chan *chan = &fifo->func->chan;
	int c = 0;

	if (fifo->func->class_get) {
		int ret = fifo->func->class_get(fifo, index, oclass);
		if (ret == 0)
			*class = &nvkm_fifo_class_;
		return ret;
	}
	if (fifo->func->engine_id == gk104_fifo_engine_id)
		chan = &gk104_fifo(fifo)->func->chan;

	while ((sclass = fifo->func->chan[c])) {
	/* *_CHANNEL_DMA, *_CHANNEL_GPFIFO_* */
	if (chan->user.oclass) {
		if (c++ == index) {
			oclass->base = sclass->base;
			oclass->engn = sclass;
			oclass->base = chan->user;
			oclass->engn = &fifo->func->chan.user;
			*class = &nvkm_fifo_class;
			return 0;
		}
Loading