summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBen Skeggs <bskeggs@redhat.com>2015-08-20 07:54:16 +0300
committerBen Skeggs <bskeggs@redhat.com>2015-08-28 05:40:33 +0300
commitd56241794c293ff7341d373d853e5a4e2f5de244 (patch)
tree7257a4d89ca6c0a6a98e3645581d51c8cb4fa824
parent41a634064db489713945e228e216336080ba57f8 (diff)
downloadlinux-d56241794c293ff7341d373d853e5a4e2f5de244.tar.xz
drm/nouveau/nvif: add supported engines query to kepler gpfifo class
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
-rw-r--r--drivers/gpu/drm/nouveau/nvkm/engine/fifo/gk104.c27
1 files changed, 17 insertions, 10 deletions
diff --git a/drivers/gpu/drm/nouveau/nvkm/engine/fifo/gk104.c b/drivers/gpu/drm/nouveau/nvkm/engine/fifo/gk104.c
index 49d7ea0acbd1..bdd0b00c59c9 100644
--- a/drivers/gpu/drm/nouveau/nvkm/engine/fifo/gk104.c
+++ b/drivers/gpu/drm/nouveau/nvkm/engine/fifo/gk104.c
@@ -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,