drm/nouveau/nvif: add supported engines query to kepler gpfifo class
authorBen Skeggs <bskeggs@redhat.com>
Thu, 20 Aug 2015 04:54:16 +0000 (14:54 +1000)
committerBen Skeggs <bskeggs@redhat.com>
Fri, 28 Aug 2015 02:40:33 +0000 (12:40 +1000)
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
drivers/gpu/drm/nouveau/nvkm/engine/fifo/gk104.c

index 49d7ea0acbd100d8e63dd3fc2b036743fb607417..bdd0b00c59c9fdc106d3d03f06879584c8679562 100644 (file)
@@ -245,9 +245,9 @@ gk104_fifo_chan_ctor(struct nvkm_object *parent, struct nvkm_object *engine,
        struct gk104_fifo *fifo = (void *)engine;
        struct gk104_fifo_base *base = (void *)parent;
        struct gk104_fifo_chan *chan;
-       struct nvkm_subdev *subdev = &fifo->base.engine.subdev;
        struct nvkm_gpuobj *ramfc = &base->base.gpuobj;
        u64 usermem, ioffset, ilength;
+       u32 engines;
        int ret, i;
 
        nvif_ioctl(parent, "create channel gpfifo size %d\n", size);
@@ -259,20 +259,27 @@ gk104_fifo_chan_ctor(struct nvkm_object *parent, struct nvkm_object *engine,
        } else
                return ret;
 
-       for (i = 0; i < FIFO_ENGINE_NR; i++) {
-               if (args->v0.engine & (1 << i)) {
-                       if (nvkm_engine(parent, fifo_engine[i].subdev)) {
-                               args->v0.engine = (1 << i);
-                               break;
-                       }
-               }
+       for (i = 0, engines = 0; i < FIFO_ENGINE_NR; i++) {
+               if (!nvkm_engine(parent, fifo_engine[i].subdev))
+                       continue;
+               engines |= (1 << i);
+       }
+
+       if (!args->v0.engine) {
+               static struct nvkm_oclass oclass = {
+                       .ofuncs = &nvkm_object_ofuncs,
+               };
+               args->v0.engine = engines;
+               return nvkm_object_ctor(parent, engine, &oclass, NULL, 0, pobject);
        }
 
-       if (i == FIFO_ENGINE_NR) {
-               nvkm_error(subdev, "unsupported engines %08x\n",
+       engines &= args->v0.engine;
+       if (!engines) {
+               nvif_ioctl(parent, "unsupported engines %08x\n",
                           args->v0.engine);
                return -ENODEV;
        }
+       i = __ffs(engines);
 
        ret = nvkm_fifo_channel_create(parent, engine, oclass, 1,
                                       fifo->user.bar.offset, 0x200,