static int
 g84_fifo_chan_engine_addr(struct nvkm_engine *engine)
 {
-       switch (engine->subdev.index) {
+       switch (engine->subdev.type) {
        case NVKM_ENGINE_DMAOBJ:
        case NVKM_ENGINE_SW    : return -1;
        case NVKM_ENGINE_GR    : return 0x0020;
        case NVKM_ENGINE_MSVLD : return 0x0080;
        case NVKM_ENGINE_CIPHER:
        case NVKM_ENGINE_SEC   : return 0x00a0;
-       case NVKM_ENGINE_CE0   : return 0x00c0;
+       case NVKM_ENGINE_CE    : return 0x00c0;
        default:
                WARN_ON(1);
                return -1;
        u32 handle = object->handle;
        u32 context;
 
-       switch (object->engine->subdev.index) {
+       switch (object->engine->subdev.type) {
        case NVKM_ENGINE_DMAOBJ:
        case NVKM_ENGINE_SW    : context = 0x00000000; break;
        case NVKM_ENGINE_GR    : context = 0x00100000; break;
        case NVKM_ENGINE_MPEG  :
        case NVKM_ENGINE_MSPPP : context = 0x00200000; break;
        case NVKM_ENGINE_ME    :
-       case NVKM_ENGINE_CE0   : context = 0x00300000; break;
+       case NVKM_ENGINE_CE    : context = 0x00300000; break;
        case NVKM_ENGINE_VP    :
        case NVKM_ENGINE_MSPDEC: context = 0x00400000; break;
        case NVKM_ENGINE_CIPHER:
 
 static int
 nv50_fifo_chan_engine_addr(struct nvkm_engine *engine)
 {
-       switch (engine->subdev.index) {
+       switch (engine->subdev.type) {
        case NVKM_ENGINE_DMAOBJ:
        case NVKM_ENGINE_SW    : return -1;
        case NVKM_ENGINE_GR    : return 0x0000;
        u32 handle = object->handle;
        u32 context;
 
-       switch (object->engine->subdev.index) {
+       switch (object->engine->subdev.type) {
        case NVKM_ENGINE_DMAOBJ:
        case NVKM_ENGINE_SW    : context = 0x00000000; break;
        case NVKM_ENGINE_GR    : context = 0x00100000; break;
 
        u32 handle  = object->handle;
        int hash;
 
-       switch (object->engine->subdev.index) {
+       switch (object->engine->subdev.type) {
        case NVKM_ENGINE_DMAOBJ:
        case NVKM_ENGINE_SW    : context |= 0x00000000; break;
        case NVKM_ENGINE_GR    : context |= 0x00010000; break;
 
 static bool
 nv40_fifo_dma_engine(struct nvkm_engine *engine, u32 *reg, u32 *ctx)
 {
-       switch (engine->subdev.index) {
+       switch (engine->subdev.type) {
        case NVKM_ENGINE_DMAOBJ:
        case NVKM_ENGINE_SW:
                return false;
        u32 handle  = object->handle;
        int hash;
 
-       switch (object->engine->subdev.index) {
+       switch (object->engine->subdev.type) {
        case NVKM_ENGINE_DMAOBJ:
        case NVKM_ENGINE_SW    : context |= 0x00000000; break;
        case NVKM_ENGINE_GR    : context |= 0x00100000; break;
 
 static u32
 gf100_fifo_gpfifo_engine_addr(struct nvkm_engine *engine)
 {
-       switch (engine->subdev.index) {
+       switch (engine->subdev.type) {
        case NVKM_ENGINE_SW    : return 0;
        case NVKM_ENGINE_GR    : return 0x0210;
-       case NVKM_ENGINE_CE0   : return 0x0230;
-       case NVKM_ENGINE_CE1   : return 0x0240;
+       case NVKM_ENGINE_CE    : return 0x0230 + (engine->subdev.inst * 0x10);
        case NVKM_ENGINE_MSPDEC: return 0x0250;
        case NVKM_ENGINE_MSPPP : return 0x0260;
        case NVKM_ENGINE_MSVLD : return 0x0270;
 
 static u32
 gk104_fifo_gpfifo_engine_addr(struct nvkm_engine *engine)
 {
-       switch (engine->subdev.index) {
+       switch (engine->subdev.type) {
        case NVKM_ENGINE_SW    :
-       case NVKM_ENGINE_CE0...NVKM_ENGINE_CE_LAST:
-               return 0;
+       case NVKM_ENGINE_CE    : return 0;
        case NVKM_ENGINE_GR    : return 0x0210;
        case NVKM_ENGINE_SEC   : return 0x0220;
        case NVKM_ENGINE_MSPDEC: return 0x0250;
        case NVKM_ENGINE_MSVLD : return 0x0270;
        case NVKM_ENGINE_VIC   : return 0x0280;
        case NVKM_ENGINE_MSENC : return 0x0290;
-       case NVKM_ENGINE_NVDEC0: return 0x02100270;
-       case NVKM_ENGINE_NVENC0: return 0x02100290;
-       case NVKM_ENGINE_NVENC1: return 0x0210;
+       case NVKM_ENGINE_NVDEC : return 0x02100270;
+       case NVKM_ENGINE_NVENC :
+               if (engine->subdev.inst)
+                       return 0x0210;
+               return 0x02100290;
        default:
                WARN_ON(1);
                return 0;
 
        struct nvkm_gpuobj *inst = chan->base.inst;
        int ret;
 
-       if (engine->subdev.index >= NVKM_ENGINE_CE0 &&
-           engine->subdev.index <= NVKM_ENGINE_CE_LAST)
+       if (engine->subdev.type == NVKM_ENGINE_CE)
                return gk104_fifo_gpfifo_kick(chan);
 
        ret = gv100_fifo_gpfifo_engine_valid(chan, false, false);
        struct gk104_fifo_engn *engn = gk104_fifo_gpfifo_engine(chan, engine);
        struct nvkm_gpuobj *inst = chan->base.inst;
 
-       if (engine->subdev.index >= NVKM_ENGINE_CE0 &&
-           engine->subdev.index <= NVKM_ENGINE_CE_LAST)
+       if (engine->subdev.type == NVKM_ENGINE_CE)
                return 0;
 
        nvkm_kmap(inst);