drm/nouveau/fifo/gk104-: subclass func
authorBen Skeggs <bskeggs@redhat.com>
Fri, 8 Apr 2016 07:24:40 +0000 (17:24 +1000)
committerBen Skeggs <bskeggs@redhat.com>
Fri, 20 May 2016 04:43:04 +0000 (14:43 +1000)
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
drivers/gpu/drm/nouveau/nvkm/engine/fifo/base.c
drivers/gpu/drm/nouveau/nvkm/engine/fifo/gk104.c
drivers/gpu/drm/nouveau/nvkm/engine/fifo/gk104.h
drivers/gpu/drm/nouveau/nvkm/engine/fifo/gk110.c
drivers/gpu/drm/nouveau/nvkm/engine/fifo/gk208.c
drivers/gpu/drm/nouveau/nvkm/engine/fifo/gk20a.c
drivers/gpu/drm/nouveau/nvkm/engine/fifo/gm107.c
drivers/gpu/drm/nouveau/nvkm/engine/fifo/gm200.c
drivers/gpu/drm/nouveau/nvkm/engine/fifo/gm20b.c
drivers/gpu/drm/nouveau/nvkm/engine/fifo/priv.h

index fce308f013426911199a112e38f9ef61c4cac333..1c9682ae3a6bf0a0b5b7bc6ddb129e7d1aa452d3 100644 (file)
@@ -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;
index fcb9a7593dbfbfe06bacd9b01707de28b5fee40d..ddab2c82c6d539158cac803352629bb9ae28cbb5 100644 (file)
 
 #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
index 9e5d00ba34a219bd6c3b9808783a4168f80c8c37..703b437c5cc1c9ea3640c7fc1a7c37f51f5ef11a 100644 (file)
@@ -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);
index 41307fcd4bb30460cdaf4995b71af4e2ecd8e86e..061cf29a77c57f4e974e7f719290f2f8680c5374 100644 (file)
 #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
index ce01c1a7d41cb3a7b396498495da39b986c298ec..6e0d0d700a4915396f0d56d910e0eeb135689feb 100644 (file)
 #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
index b47fe98f41818ab7105abbb237577f1665932268..dab911d4b292afad49253ce44c46ed9ff3722afb 100644 (file)
 #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
index 6d59d65794a19c112b99c1c21f01f48f90ed38b4..ad9bb67476f28ac75dd1d46012813ede94e69548 100644 (file)
 #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
index 4bdd43078df94e6483bf46011e2168e7303deb48..86cc11f0aa28b8fa07069741612b95717b3286af 100644 (file)
 #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
index 4c91d4aa1e9e92d73bebf9b78fd70229a4a9f30f..1b288d7bc69879adabbc3db71137353fd624bce3 100644 (file)
 #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
index cb1432e9be08ca6bbb618bccf584759a10b1bb1c..f6dfb37d94296378c65d368650fa07d9f8cad83a 100644 (file)
@@ -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[];
 };