Commit 9be9c606 authored by Ben Skeggs's avatar Ben Skeggs
Browse files

drm/nouveau/fifo: merge gk104_fifo_func into nvkm_host_func



This makes it easier to transition everything.

- a couple of function renames for collisions

Signed-off-by: default avatarBen Skeggs <bskeggs@redhat.com>
Reviewed-by: default avatarLyude Paul <lyude@redhat.com>
parent fd67738a
Loading
Loading
Loading
Loading
+2 −7
Original line number Diff line number Diff line
@@ -30,8 +30,6 @@
#include <nvif/cl0080.h>
#include <nvif/unpack.h>

#include "gk104.h"

void
nvkm_fifo_recover_chan(struct nvkm_fifo *fifo, int chid)
{
@@ -58,7 +56,7 @@ nvkm_fifo_start(struct nvkm_fifo *fifo, unsigned long *flags)
void
nvkm_fifo_fault(struct nvkm_fifo *fifo, struct nvkm_fault_data *info)
{
	return fifo->func->fault(fifo, info);
	return fifo->func->mmu_fault->recover(fifo, info);
}

void
@@ -179,9 +177,6 @@ nvkm_fifo_class_get(struct nvkm_oclass *oclass, int index, const struct nvkm_dev
	const struct nvkm_fifo_func_chan *chan = &fifo->func->chan;
	int c = 0;

	if (fifo->func->engine_id == gk104_fifo_engine_id)
		chan = &gk104_fifo(fifo)->func->chan;

	/* *_CHANNEL_DMA, *_CHANNEL_GPFIFO_* */
	if (chan->user.oclass) {
		if (c++ == index) {
@@ -289,7 +284,7 @@ nvkm_fifo_ctor(const struct nvkm_fifo_func *func, struct nvkm_device *device,

	INIT_LIST_HEAD(&fifo->chan);

	nr = func->chid_nr ? func->chid_nr(fifo) : gk104_fifo(fifo)->func->chid_nr(fifo);
	nr = func->chid_nr(fifo);
	if (WARN_ON(fifo->nr > NVKM_FIFO_CHID_NR))
		fifo->nr = NVKM_FIFO_CHID_NR;
	else
+8 −3
Original line number Diff line number Diff line
@@ -359,6 +359,11 @@ gf100_fifo_fault(struct nvkm_fifo *base, struct nvkm_fault_data *info)
	nvkm_fifo_chan_put(&fifo->base, flags, &chan);
}

static const struct nvkm_fifo_func_mmu_fault
gf100_fifo_mmu_fault = {
	.recover = gf100_fifo_fault,
};

static const struct nvkm_enum
gf100_fifo_sched_reason[] = {
	{ 0x0a, "CTXSW_TIMEOUT" },
@@ -422,7 +427,7 @@ gf100_fifo_intr_sched(struct gf100_fifo *fifo)
}

void
gf100_fifo_intr_fault(struct nvkm_fifo *fifo, int unit)
gf100_fifo_intr_mmu_fault_unit(struct nvkm_fifo *fifo, int unit)
{
	struct nvkm_device *device = fifo->engine.subdev.device;
	u32 inst = nvkm_rd32(device, 0x002800 + (unit * 0x10));
@@ -541,7 +546,7 @@ gf100_fifo_intr(struct nvkm_fifo *base)
		u32 mask = nvkm_rd32(device, 0x00259c);
		while (mask) {
			u32 unit = __ffs(mask);
			gf100_fifo_intr_fault(&fifo->base, unit);
			gf100_fifo_intr_mmu_fault_unit(&fifo->base, unit);
			nvkm_wr32(device, 0x00259c, (1 << unit));
			mask &= ~(1 << unit);
		}
@@ -679,7 +684,7 @@ gf100_fifo = {
	.init = gf100_fifo_init,
	.fini = gf100_fifo_fini,
	.intr = gf100_fifo_intr,
	.fault = gf100_fifo_fault,
	.mmu_fault = &gf100_fifo_mmu_fault,
	.engine_id = gf100_fifo_engine_id,
	.id_engine = gf100_fifo_id_engine,
	.uevent_init = gf100_fifo_uevent_init,
+25 −24
Original line number Diff line number Diff line
@@ -397,7 +397,7 @@ gk104_fifo_recover_chid(struct gk104_fifo *fifo, int runl, int chid)
	return NULL;
}

static void
void
gk104_fifo_recover_chan(struct nvkm_fifo *base, int chid)
{
	struct gk104_fifo *fifo = gk104_fifo(base);
@@ -629,7 +629,7 @@ gk104_fifo_fault_gpcclient[] = {
	{}
};

static void
void
gk104_fifo_fault(struct nvkm_fifo *base, struct nvkm_fault_data *info)
{
	struct gk104_fifo *fifo = gk104_fifo(base);
@@ -709,6 +709,11 @@ gk104_fifo_fault(struct nvkm_fifo *base, struct nvkm_fault_data *info)
	spin_unlock_irqrestore(&fifo->base.lock, flags);
}

const struct nvkm_fifo_func_mmu_fault
gk104_fifo_mmu_fault = {
	.recover = gk104_fifo_fault,
};

static const struct nvkm_enum
gk104_fifo_bind_reason[] = {
	{ 0x01, "BIND_NOT_UNBOUND" },
@@ -869,7 +874,7 @@ gk104_fifo_intr_engine(struct gk104_fifo *fifo)
	nvkm_fifo_uevent(&fifo->base);
}

static void
void
gk104_fifo_intr(struct nvkm_fifo *base)
{
	struct gk104_fifo *fifo = gk104_fifo(base);
@@ -924,7 +929,7 @@ gk104_fifo_intr(struct nvkm_fifo *base)
		u32 mask = nvkm_rd32(device, 0x00259c);
		while (mask) {
			u32 unit = __ffs(mask);
			fifo->func->intr.fault(&fifo->base, unit);
			fifo->func->intr_mmu_fault_unit(&fifo->base, unit);
			nvkm_wr32(device, 0x00259c, (1 << unit));
			mask &= ~(1 << unit);
		}
@@ -1168,22 +1173,6 @@ 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,
	.info = gk104_fifo_info,
	.init = gk104_fifo_init,
	.fini = gk104_fifo_fini,
	.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,
};

int
gk104_fifo_new_(const struct gk104_fifo_func *func, struct nvkm_device *device,
		enum nvkm_subdev_type type, int inst, int nr, struct nvkm_fifo **pfifo)
@@ -1196,20 +1185,32 @@ gk104_fifo_new_(const struct gk104_fifo_func *func, struct nvkm_device *device,
	INIT_WORK(&fifo->recover.work, gk104_fifo_recover_work);
	*pfifo = &fifo->base;

	return nvkm_fifo_ctor(&gk104_fifo_, device, type, inst, &fifo->base);
	return nvkm_fifo_ctor(func, device, type, inst, &fifo->base);
}

static const struct gk104_fifo_func
static const struct nvkm_fifo_func
gk104_fifo = {
	.dtor = gk104_fifo_dtor,
	.oneinit = gk104_fifo_oneinit,
	.chid_nr = gk104_fifo_chid_nr,
	.intr.fault = gf100_fifo_intr_fault,
	.pbdma = &gk104_fifo_pbdma,
	.info = gk104_fifo_info,
	.init = gk104_fifo_init,
	.fini = gk104_fifo_fini,
	.intr = gk104_fifo_intr,
	.intr_mmu_fault_unit = gf100_fifo_intr_mmu_fault_unit,
	.mmu_fault = &gk104_fifo_mmu_fault,
	.fault.access = gk104_fifo_fault_access,
	.fault.engine = gk104_fifo_fault_engine,
	.fault.reason = gk104_fifo_fault_reason,
	.fault.hubclient = gk104_fifo_fault_hubclient,
	.fault.gpcclient = gk104_fifo_fault_gpcclient,
	.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,
	.runlist = &gk104_fifo_runlist,
	.pbdma = &gk104_fifo_pbdma,
	.cgrp = {{                               }, &nv04_cgrp },
	.chan = {{ 0, 0, KEPLER_CHANNEL_GPFIFO_A }, &gk104_chan, .ctor = &gk104_fifo_gpfifo_new },
};
+2 −37
Original line number Diff line number Diff line
@@ -8,6 +8,8 @@ struct nvkm_fifo_cgrp;
#include <core/enum.h>
#include <subdev/mmu.h>

#define gk104_fifo_func nvkm_fifo_func

struct gk104_fifo_chan;
struct gk104_fifo {
	const struct gk104_fifo_func *func;
@@ -45,41 +47,6 @@ struct gk104_fifo {
	} user;
};

struct gk104_fifo_func {
	int (*chid_nr)(struct nvkm_fifo *);

	struct {
		void (*fault)(struct nvkm_fifo *, int unit);
	} intr;

	const struct gk104_fifo_pbdma_func {
		int (*nr)(struct gk104_fifo *);
		void (*init)(struct gk104_fifo *);
		void (*init_timeout)(struct gk104_fifo *);
	} *pbdma;

	struct {
		const struct nvkm_enum *access;
		const struct nvkm_enum *engine;
		const struct nvkm_enum *reason;
		const struct nvkm_enum *hubclient;
		const struct nvkm_enum *gpcclient;
	} fault;

	const struct gk104_fifo_runlist_func {
		u8 size;
		void (*cgrp)(struct nvkm_fifo_cgrp *,
			     struct nvkm_memory *, u32 offset);
		void (*chan)(struct gk104_fifo_chan *,
			     struct nvkm_memory *, u32 offset);
		void (*commit)(struct gk104_fifo *, int runl,
			       struct nvkm_memory *, int entries);
	} *runlist;

	struct nvkm_fifo_func_cgrp cgrp;
	struct nvkm_fifo_func_chan chan;
};

struct gk104_fifo_engine_status {
	bool busy;
	bool faulted;
@@ -135,14 +102,12 @@ void gk110_fifo_runlist_cgrp(struct nvkm_fifo_cgrp *,
extern const struct gk104_fifo_pbdma_func gk208_fifo_pbdma;
void gk208_fifo_pbdma_init_timeout(struct gk104_fifo *);

void gm107_fifo_intr_fault(struct nvkm_fifo *, int);
extern const struct nvkm_enum gm107_fifo_fault_engine[];
extern const struct gk104_fifo_runlist_func gm107_fifo_runlist;

extern const struct gk104_fifo_pbdma_func gm200_fifo_pbdma;
int gm200_fifo_pbdma_nr(struct gk104_fifo *);

void gp100_fifo_intr_fault(struct nvkm_fifo *, int);
extern const struct nvkm_enum gp100_fifo_fault_engine[];

extern const struct nvkm_enum gv100_fifo_fault_access[];
+15 −3
Original line number Diff line number Diff line
@@ -56,17 +56,29 @@ gk110_fifo_runlist = {
	.commit = gk104_fifo_runlist_commit,
};

static const struct gk104_fifo_func
static const struct nvkm_fifo_func
gk110_fifo = {
	.dtor = gk104_fifo_dtor,
	.oneinit = gk104_fifo_oneinit,
	.chid_nr = gk104_fifo_chid_nr,
	.intr.fault = gf100_fifo_intr_fault,
	.pbdma = &gk104_fifo_pbdma,
	.info = gk104_fifo_info,
	.init = gk104_fifo_init,
	.fini = gk104_fifo_fini,
	.intr = gk104_fifo_intr,
	.intr_mmu_fault_unit = gf100_fifo_intr_mmu_fault_unit,
	.mmu_fault = &gk104_fifo_mmu_fault,
	.fault.access = gk104_fifo_fault_access,
	.fault.engine = gk104_fifo_fault_engine,
	.fault.reason = gk104_fifo_fault_reason,
	.fault.hubclient = gk104_fifo_fault_hubclient,
	.fault.gpcclient = gk104_fifo_fault_gpcclient,
	.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,
	.runlist = &gk110_fifo_runlist,
	.pbdma = &gk104_fifo_pbdma,
	.cgrp = {{ 0, 0, KEPLER_CHANNEL_GROUP_A  }, &gk110_cgrp },
	.chan = {{ 0, 0, KEPLER_CHANNEL_GPFIFO_B }, &gk110_chan, .ctor = &gk104_fifo_gpfifo_new },
};
Loading