mirror of https://gitee.com/openkylin/linux.git
drm/nouveau/fifo/gk104-: subclass func
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
This commit is contained in:
parent
e93e198d46
commit
98ac3f061a
|
@ -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;
|
||||
|
|
|
@ -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,22 +800,8 @@ gk104_fifo_dtor(struct nvkm_fifo *base)
|
|||
return fifo;
|
||||
}
|
||||
|
||||
int
|
||||
gk104_fifo_new_(const struct nvkm_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;
|
||||
INIT_WORK(&fifo->recover.work, gk104_fifo_recover_work);
|
||||
*pfifo = &fifo->base;
|
||||
|
||||
return nvkm_fifo_ctor(func, device, index, nr, &fifo->base);
|
||||
}
|
||||
|
||||
static const struct nvkm_fifo_func
|
||||
gk104_fifo = {
|
||||
gk104_fifo_ = {
|
||||
.dtor = gk104_fifo_dtor,
|
||||
.oneinit = gk104_fifo_oneinit,
|
||||
.init = gk104_fifo_init,
|
||||
|
@ -808,6 +809,26 @@ gk104_fifo = {
|
|||
.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 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(&gk104_fifo_, device, index, nr, &fifo->base);
|
||||
}
|
||||
|
||||
static const struct gk104_fifo_func
|
||||
gk104_fifo = {
|
||||
.chan = {
|
||||
&gk104_fifo_gpfifo_oclass,
|
||||
NULL
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -22,15 +22,8 @@
|
|||
#include "gk104.h"
|
||||
#include "changk104.h"
|
||||
|
||||
static const struct nvkm_fifo_func
|
||||
static const struct gk104_fifo_func
|
||||
gk20a_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
|
||||
|
|
|
@ -24,15 +24,8 @@
|
|||
#include "gk104.h"
|
||||
#include "changk104.h"
|
||||
|
||||
static const struct nvkm_fifo_func
|
||||
static const struct gk104_fifo_func
|
||||
gm107_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
|
||||
|
|
|
@ -24,15 +24,8 @@
|
|||
#include "gk104.h"
|
||||
#include "changk104.h"
|
||||
|
||||
static const struct nvkm_fifo_func
|
||||
static const struct gk104_fifo_func
|
||||
gm200_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 = {
|
||||
&gm200_fifo_gpfifo_oclass,
|
||||
NULL
|
||||
|
|
|
@ -22,15 +22,8 @@
|
|||
#include "gk104.h"
|
||||
#include "changk104.h"
|
||||
|
||||
static const struct nvkm_fifo_func
|
||||
static const struct gk104_fifo_func
|
||||
gm20b_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 = {
|
||||
&gm200_fifo_gpfifo_oclass,
|
||||
NULL
|
||||
|
|
|
@ -7,6 +7,7 @@ int nvkm_fifo_ctor(const struct nvkm_fifo_func *, struct nvkm_device *,
|
|||
int index, int nr, struct nvkm_fifo *);
|
||||
void nvkm_fifo_uevent(struct nvkm_fifo *);
|
||||
|
||||
struct nvkm_fifo_chan_oclass;
|
||||
struct nvkm_fifo_func {
|
||||
void *(*dtor)(struct nvkm_fifo *);
|
||||
int (*oneinit)(struct nvkm_fifo *);
|
||||
|
@ -17,6 +18,8 @@ struct nvkm_fifo_func {
|
|||
void (*start)(struct nvkm_fifo *, unsigned long *);
|
||||
void (*uevent_init)(struct nvkm_fifo *);
|
||||
void (*uevent_fini)(struct nvkm_fifo *);
|
||||
int (*class_get)(struct nvkm_fifo *, int index,
|
||||
const struct nvkm_fifo_chan_oclass **);
|
||||
const struct nvkm_fifo_chan_oclass *chan[];
|
||||
};
|
||||
|
||||
|
|
Loading…
Reference in New Issue