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

drm/nouveau/fifo/gk104-: simplify definition of channel classes



Signed-off-by: default avatarBen Skeggs <bskeggs@redhat.com>
parent a7cf0180
Loading
Loading
Loading
Loading
+0 −3
Original line number Diff line number Diff line
@@ -31,6 +31,3 @@ nvkm-y += nvkm/engine/fifo/gpfifonv50.o
nvkm-y += nvkm/engine/fifo/gpfifog84.o
nvkm-y += nvkm/engine/fifo/gpfifogf100.o
nvkm-y += nvkm/engine/fifo/gpfifogk104.o
nvkm-y += nvkm/engine/fifo/gpfifogk110.o
nvkm-y += nvkm/engine/fifo/gpfifogm200.o
nvkm-y += nvkm/engine/fifo/gpfifogp100.o
+17 −7
Original line number Diff line number Diff line
@@ -215,6 +215,20 @@ nvkm_fifo_uevent(struct nvkm_fifo *fifo)
	nvkm_event_send(&fifo->uevent, 1, 0, &rep, sizeof(rep));
}

static int
nvkm_fifo_class_new_(struct nvkm_device *device,
		     const struct nvkm_oclass *oclass, void *data, u32 size,
		     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_,
};

static int
nvkm_fifo_class_new(struct nvkm_device *device,
		    const struct nvkm_oclass *oclass, void *data, u32 size,
@@ -239,13 +253,9 @@ nvkm_fifo_class_get(struct nvkm_oclass *oclass, int index,
	int c = 0;

	if (fifo->func->class_get) {
		int ret = fifo->func->class_get(fifo, index, &sclass);
		if (ret == 0) {
			oclass->base = sclass->base;
			oclass->engn = sclass;
			*class = &nvkm_fifo_class;
			return 0;
		}
		int ret = fifo->func->class_get(fifo, index, oclass);
		if (ret == 0)
			*class = &nvkm_fifo_class_;
		return ret;
	}

+1 −6
Original line number Diff line number Diff line
@@ -19,11 +19,6 @@ struct gk104_fifo_chan {
	} engn[NVKM_SUBDEV_NR];
};

int gk104_fifo_gpfifo_new(struct nvkm_fifo *, const struct nvkm_oclass *,
int gk104_fifo_gpfifo_new(struct gk104_fifo *, const struct nvkm_oclass *,
			  void *data, u32 size, struct nvkm_object **);

extern const struct nvkm_fifo_chan_oclass gk104_fifo_gpfifo_oclass;
extern const struct nvkm_fifo_chan_oclass gk110_fifo_gpfifo_oclass;
extern const struct nvkm_fifo_chan_oclass gm200_fifo_gpfifo_oclass;
extern const struct nvkm_fifo_chan_oclass gp100_fifo_gpfifo_oclass;
#endif
+20 −8
Original line number Diff line number Diff line
@@ -94,15 +94,29 @@ gk104_fifo_engine_status(struct gk104_fifo *fifo, int engn,
		   status->chan == &status->next ? "*" : " ");
}

static int
gk104_fifo_class_new(struct nvkm_fifo *base, const struct nvkm_oclass *oclass,
		     void *argv, u32 argc, struct nvkm_object **pobject)
{
	struct gk104_fifo *fifo = gk104_fifo(base);
	if (oclass->engn == &fifo->func->chan) {
		const struct gk104_fifo_chan_user *user = oclass->engn;
		return user->ctor(fifo, oclass, argv, argc, pobject);
	}
	WARN_ON(1);
	return -EINVAL;
}

static int
gk104_fifo_class_get(struct nvkm_fifo *base, int index,
		     const struct nvkm_fifo_chan_oclass **psclass)
		     struct nvkm_oclass *oclass)
{
	struct gk104_fifo *fifo = gk104_fifo(base);
	int c = 0;

	while ((*psclass = fifo->func->chan[c])) {
		if (c++ == index)
	if (fifo->func->chan.ctor && c++ == index) {
		oclass->base =  fifo->func->chan.user;
		oclass->engn = &fifo->func->chan;
		return 0;
	}

@@ -950,6 +964,7 @@ gk104_fifo_ = {
	.uevent_fini = gk104_fifo_uevent_fini,
	.recover_chan = gk104_fifo_recover_chan,
	.class_get = gk104_fifo_class_get,
	.class_new = gk104_fifo_class_new,
};

int
@@ -1096,10 +1111,7 @@ gk104_fifo = {
	.fault.reason = gk104_fifo_fault_reason,
	.fault.hubclient = gk104_fifo_fault_hubclient,
	.fault.gpcclient = gk104_fifo_fault_gpcclient,
	.chan = {
		&gk104_fifo_gpfifo_oclass,
		NULL
	},
	.chan = {{0,0,KEPLER_CHANNEL_GPFIFO_A}, gk104_fifo_gpfifo_new },
};

int
+5 −1
Original line number Diff line number Diff line
@@ -51,7 +51,11 @@ struct gk104_fifo_func {
		const struct nvkm_enum *gpcclient;
	} fault;

	const struct nvkm_fifo_chan_oclass *chan[];
	struct gk104_fifo_chan_user {
		struct nvkm_sclass user;
		int (*ctor)(struct gk104_fifo *, const struct nvkm_oclass *,
			    void *, u32, struct nvkm_object **);
	} chan;
};

int gk104_fifo_new_(const struct gk104_fifo_func *, struct nvkm_device *,
Loading