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)
 {
                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;
 
                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;
 
                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);
 {
        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;