OSDN Git Service

drm/nouveau/fifo: index base engctx by engine id
authorBen Skeggs <bskeggs@redhat.com>
Sat, 6 Feb 2021 09:27:08 +0000 (19:27 +1000)
committerBen Skeggs <bskeggs@redhat.com>
Thu, 11 Feb 2021 01:49:56 +0000 (11:49 +1000)
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
Reviewed-by: Lyude Paul <lyude@redhat.com>
drivers/gpu/drm/nouveau/include/nvkm/engine/fifo.h
drivers/gpu/drm/nouveau/nvkm/engine/fifo/chan.c

index 3b5cf6b..8edfe8c 100644 (file)
@@ -7,6 +7,7 @@
 struct nvkm_fault_data;
 
 #define NVKM_FIFO_CHID_NR 4096
+#define NVKM_FIFO_ENGN_NR 16
 
 struct nvkm_fifo_engn {
        struct nvkm_object *object;
@@ -29,7 +30,7 @@ struct nvkm_fifo_chan {
        u64 addr;
        u32 size;
 
-       struct nvkm_fifo_engn engn[NVKM_SUBDEV_NR];
+       struct nvkm_fifo_engn engn[NVKM_FIFO_ENGN_NR];
 };
 
 struct nvkm_fifo {
index cc05c91..ee5551e 100644 (file)
@@ -35,6 +35,15 @@ struct nvkm_fifo_chan_object {
        int hash;
 };
 
+static struct nvkm_fifo_engn *
+nvkm_fifo_chan_engn(struct nvkm_fifo_chan *chan, struct nvkm_engine *engine)
+{
+       int engi = chan->fifo->func->engine_id(chan->fifo, engine);
+       if (engi >= 0)
+               return &chan->engn[engi];
+       return NULL;
+}
+
 static int
 nvkm_fifo_chan_child_fini(struct nvkm_oproxy *base, bool suspend)
 {
@@ -42,7 +51,7 @@ nvkm_fifo_chan_child_fini(struct nvkm_oproxy *base, bool suspend)
                container_of(base, typeof(*object), oproxy);
        struct nvkm_engine *engine  = object->oproxy.object->engine;
        struct nvkm_fifo_chan *chan = object->chan;
-       struct nvkm_fifo_engn *engn = &chan->engn[engine->subdev.index];
+       struct nvkm_fifo_engn *engn = nvkm_fifo_chan_engn(chan, engine);
        const char *name = engine->subdev.name;
        int ret = 0;
 
@@ -75,7 +84,7 @@ nvkm_fifo_chan_child_init(struct nvkm_oproxy *base)
                container_of(base, typeof(*object), oproxy);
        struct nvkm_engine *engine  = object->oproxy.object->engine;
        struct nvkm_fifo_chan *chan = object->chan;
-       struct nvkm_fifo_engn *engn = &chan->engn[engine->subdev.index];
+       struct nvkm_fifo_engn *engn = nvkm_fifo_chan_engn(chan, engine);
        const char *name = engine->subdev.name;
        int ret;
 
@@ -108,7 +117,7 @@ nvkm_fifo_chan_child_del(struct nvkm_oproxy *base)
                container_of(base, typeof(*object), oproxy);
        struct nvkm_engine *engine  = object->oproxy.base.engine;
        struct nvkm_fifo_chan *chan = object->chan;
-       struct nvkm_fifo_engn *engn = &chan->engn[engine->subdev.index];
+       struct nvkm_fifo_engn *engn = nvkm_fifo_chan_engn(chan, engine);
 
        if (chan->func->object_dtor)
                chan->func->object_dtor(chan, object->hash);
@@ -135,7 +144,7 @@ nvkm_fifo_chan_child_new(const struct nvkm_oclass *oclass, void *data, u32 size,
 {
        struct nvkm_engine *engine = oclass->engine;
        struct nvkm_fifo_chan *chan = nvkm_fifo_chan(oclass->parent);
-       struct nvkm_fifo_engn *engn = &chan->engn[engine->subdev.index];
+       struct nvkm_fifo_engn *engn = nvkm_fifo_chan_engn(chan, engine);
        struct nvkm_fifo_chan_object *object;
        int ret = 0;