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

Commit 98ac3f06 authored by Ben Skeggs's avatar Ben Skeggs
Browse files

drm/nouveau/fifo/gk104-: subclass func



Signed-off-by: default avatarBen Skeggs <bskeggs@redhat.com>
parent e93e198d
Loading
Loading
Loading
Loading
+11 −0
Original line number Diff line number Diff line
@@ -178,6 +178,17 @@ nvkm_fifo_class_get(struct nvkm_oclass *oclass, int index,
	const struct nvkm_fifo_chan_oclass *sclass;
	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;
		}
		return ret;
	}

	while ((sclass = fifo->func->chan[c])) {
		if (c++ == index) {
			oclass->base = sclass->base;
+38 −17
Original line number Diff line number Diff line
@@ -33,14 +33,29 @@

#include <nvif/class.h>

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

	while ((*psclass = fifo->func->chan[c])) {
		if (c++ == index)
			return 0;
	}

	return c;
}

static void
gk104_fifo_uevent_fini(struct nvkm_fifo *fifo)
{
	struct nvkm_device *device = fifo->engine.subdev.device;
	nvkm_mask(device, 0x002140, 0x80000000, 0x00000000);
}

void
static void
gk104_fifo_uevent_init(struct nvkm_fifo *fifo)
{
	struct nvkm_device *device = fifo->engine.subdev.device;
@@ -558,7 +573,7 @@ gk104_fifo_intr_engine(struct gk104_fifo *fifo)
	nvkm_fifo_uevent(&fifo->base);
}

void
static void
gk104_fifo_intr(struct nvkm_fifo *base)
{
	struct gk104_fifo *fifo = gk104_fifo(base);
@@ -650,7 +665,7 @@ gk104_fifo_intr(struct nvkm_fifo *base)
	}
}

void
static void
gk104_fifo_fini(struct nvkm_fifo *base)
{
	struct gk104_fifo *fifo = gk104_fifo(base);
@@ -660,7 +675,7 @@ gk104_fifo_fini(struct nvkm_fifo *base)
	nvkm_mask(device, 0x002140, 0x10000000, 0x10000000);
}

int
static int
gk104_fifo_oneinit(struct nvkm_fifo *base)
{
	struct gk104_fifo *fifo = gk104_fifo(base);
@@ -739,7 +754,7 @@ gk104_fifo_oneinit(struct nvkm_fifo *base)
	return 0;
}

void
static void
gk104_fifo_init(struct nvkm_fifo *base)
{
	struct gk104_fifo *fifo = gk104_fifo(base);
@@ -768,7 +783,7 @@ gk104_fifo_init(struct nvkm_fifo *base)
	nvkm_wr32(device, 0x002140, 0x7fffffff);
}

void *
static void *
gk104_fifo_dtor(struct nvkm_fifo *base)
{
	struct gk104_fifo *fifo = gk104_fifo(base);
@@ -785,29 +800,35 @@ gk104_fifo_dtor(struct nvkm_fifo *base)
	return fifo;
}

static const struct nvkm_fifo_func
gk104_fifo_ = {
	.dtor = gk104_fifo_dtor,
	.oneinit = gk104_fifo_oneinit,
	.init = gk104_fifo_init,
	.fini = gk104_fifo_fini,
	.intr = gk104_fifo_intr,
	.uevent_init = gk104_fifo_uevent_init,
	.uevent_fini = gk104_fifo_uevent_fini,
	.class_get = gk104_fifo_class_get,
};

int
gk104_fifo_new_(const struct nvkm_fifo_func *func, struct nvkm_device *device,
gk104_fifo_new_(const struct gk104_fifo_func *func, struct nvkm_device *device,
		int index, int nr, struct nvkm_fifo **pfifo)
{
	struct gk104_fifo *fifo;

	if (!(fifo = kzalloc(sizeof(*fifo), GFP_KERNEL)))
		return -ENOMEM;
	fifo->func = func;
	INIT_WORK(&fifo->recover.work, gk104_fifo_recover_work);
	*pfifo = &fifo->base;

	return nvkm_fifo_ctor(func, device, index, nr, &fifo->base);
	return nvkm_fifo_ctor(&gk104_fifo_, device, index, nr, &fifo->base);
}

static const struct nvkm_fifo_func
static const struct gk104_fifo_func
gk104_fifo = {
	.dtor = gk104_fifo_dtor,
	.oneinit = gk104_fifo_oneinit,
	.init = gk104_fifo_init,
	.fini = gk104_fifo_fini,
	.intr = gk104_fifo_intr,
	.uevent_init = gk104_fifo_uevent_init,
	.uevent_fini = gk104_fifo_uevent_fini,
	.chan = {
		&gk104_fifo_gpfifo_oclass,
		NULL
+7 −8
Original line number Diff line number Diff line
@@ -7,6 +7,7 @@

struct gk104_fifo_chan;
struct gk104_fifo {
	const struct gk104_fifo_func *func;
	struct nvkm_fifo base;

	struct {
@@ -39,15 +40,13 @@ struct gk104_fifo {
	} user;
};

int gk104_fifo_new_(const struct nvkm_fifo_func *, struct nvkm_device *,
struct gk104_fifo_func {
	int dummy;
	const struct nvkm_fifo_chan_oclass *chan[];
};

int gk104_fifo_new_(const struct gk104_fifo_func *, struct nvkm_device *,
		    int index, int nr, struct nvkm_fifo **);
void *gk104_fifo_dtor(struct nvkm_fifo *);
int gk104_fifo_oneinit(struct nvkm_fifo *);
void gk104_fifo_init(struct nvkm_fifo *);
void gk104_fifo_fini(struct nvkm_fifo *);
void gk104_fifo_intr(struct nvkm_fifo *);
void gk104_fifo_uevent_init(struct nvkm_fifo *);
void gk104_fifo_uevent_fini(struct nvkm_fifo *);
void gk104_fifo_runlist_insert(struct gk104_fifo *, struct gk104_fifo_chan *);
void gk104_fifo_runlist_remove(struct gk104_fifo *, struct gk104_fifo_chan *);
void gk104_fifo_runlist_commit(struct gk104_fifo *, int runl);
+1 −8
Original line number Diff line number Diff line
@@ -24,15 +24,8 @@
#include "gk104.h"
#include "changk104.h"

static const struct nvkm_fifo_func
static const struct gk104_fifo_func
gk110_fifo = {
	.dtor = gk104_fifo_dtor,
	.oneinit = gk104_fifo_oneinit,
	.init = gk104_fifo_init,
	.fini = gk104_fifo_fini,
	.intr = gk104_fifo_intr,
	.uevent_init = gk104_fifo_uevent_init,
	.uevent_fini = gk104_fifo_uevent_fini,
	.chan = {
		&gk110_fifo_gpfifo_oclass,
		NULL
+1 −8
Original line number Diff line number Diff line
@@ -24,15 +24,8 @@
#include "gk104.h"
#include "changk104.h"

static const struct nvkm_fifo_func
static const struct gk104_fifo_func
gk208_fifo = {
	.dtor = gk104_fifo_dtor,
	.oneinit = gk104_fifo_oneinit,
	.init = gk104_fifo_init,
	.fini = gk104_fifo_fini,
	.intr = gk104_fifo_intr,
	.uevent_init = gk104_fifo_uevent_init,
	.uevent_fini = gk104_fifo_uevent_fini,
	.chan = {
		&gk104_fifo_gpfifo_oclass,
		NULL
Loading