In order to specify a channel ID to RM during channel allocation, the
channel ID is broken down into a "userd page" index and an index into
that page.

It was assumed that RM would enforce that the same physical block of
memory be used for all CHIDs within a "userd page", and the GSP paths
override NVKM's normal CHID allocation to handle this.

However, none of that turns out to be necessary.

Remove the GSP-specific code and use the regular CHID allocation path.

Signed-off-by: Ben Skeggs <bske...@nvidia.com>
---
 .../drm/nouveau/include/nvkm/engine/fifo.h    |   3 -
 .../gpu/drm/nouveau/nvkm/engine/fifo/base.c   |   5 -
 .../gpu/drm/nouveau/nvkm/engine/fifo/chan.c   |  46 +++----
 .../gpu/drm/nouveau/nvkm/engine/fifo/chan.h   |   3 -
 .../gpu/drm/nouveau/nvkm/engine/fifo/r535.c   | 115 ------------------
 .../gpu/drm/nouveau/nvkm/subdev/gsp/r535.c    |   2 +-
 6 files changed, 20 insertions(+), 154 deletions(-)

diff --git a/drivers/gpu/drm/nouveau/include/nvkm/engine/fifo.h 
b/drivers/gpu/drm/nouveau/include/nvkm/engine/fifo.h
index be508f65b280..96c16cfccf16 100644
--- a/drivers/gpu/drm/nouveau/include/nvkm/engine/fifo.h
+++ b/drivers/gpu/drm/nouveau/include/nvkm/engine/fifo.h
@@ -78,9 +78,6 @@ struct nvkm_fifo {
        struct {
                struct nvkm_memory *mem;
                struct nvkm_vma *bar1;
-
-               struct mutex mutex;
-               struct list_head list;
        } userd;
 
        struct {
diff --git a/drivers/gpu/drm/nouveau/nvkm/engine/fifo/base.c 
b/drivers/gpu/drm/nouveau/nvkm/engine/fifo/base.c
index 22443fe4a39f..3c2ca711dc5c 100644
--- a/drivers/gpu/drm/nouveau/nvkm/engine/fifo/base.c
+++ b/drivers/gpu/drm/nouveau/nvkm/engine/fifo/base.c
@@ -349,8 +349,6 @@ nvkm_fifo_dtor(struct nvkm_engine *engine)
        nvkm_chid_unref(&fifo->cgid);
        nvkm_chid_unref(&fifo->chid);
 
-       mutex_destroy(&fifo->userd.mutex);
-
        nvkm_event_fini(&fifo->nonstall.event);
        mutex_destroy(&fifo->mutex);
 
@@ -391,8 +389,5 @@ nvkm_fifo_new_(const struct nvkm_fifo_func *func, struct 
nvkm_device *device,
        spin_lock_init(&fifo->lock);
        mutex_init(&fifo->mutex);
 
-       INIT_LIST_HEAD(&fifo->userd.list);
-       mutex_init(&fifo->userd.mutex);
-
        return nvkm_engine_ctor(&nvkm_fifo, device, type, inst, true, 
&fifo->engine);
 }
diff --git a/drivers/gpu/drm/nouveau/nvkm/engine/fifo/chan.c 
b/drivers/gpu/drm/nouveau/nvkm/engine/fifo/chan.c
index 7d4716dcd512..78be7abc90d1 100644
--- a/drivers/gpu/drm/nouveau/nvkm/engine/fifo/chan.c
+++ b/drivers/gpu/drm/nouveau/nvkm/engine/fifo/chan.c
@@ -275,11 +275,7 @@ nvkm_chan_del(struct nvkm_chan **pchan)
        nvkm_gpuobj_del(&chan->ramfc);
 
        if (chan->cgrp) {
-               if (!chan->func->id_put)
-                       nvkm_chid_put(chan->cgrp->runl->chid, chan->id, 
&chan->cgrp->lock);
-               else
-                       chan->func->id_put(chan);
-
+               nvkm_chid_put(chan->cgrp->runl->chid, chan->id, 
&chan->cgrp->lock);
                nvkm_cgrp_unref(&chan->cgrp);
        }
 
@@ -441,30 +437,26 @@ nvkm_chan_new_(const struct nvkm_chan_func *func, struct 
nvkm_runl *runl, int ru
        }
 
        /* Allocate channel ID. */
-       if (!chan->func->id_get) {
-               chan->id = nvkm_chid_get(runl->chid, chan);
-               if (chan->id >= 0) {
-                       if (func->userd->bar < 0) {
-                               if (ouserd + chan->func->userd->size >=
-                                       nvkm_memory_size(userd)) {
-                                       RUNL_DEBUG(runl, "ouserd %llx", ouserd);
-                                       return -EINVAL;
-                               }
-
-                               ret = nvkm_memory_kmap(userd, &chan->userd.mem);
-                               if (ret) {
-                                       RUNL_DEBUG(runl, "userd %d", ret);
-                                       return ret;
-                               }
-
-                               chan->userd.base = ouserd;
-                       } else {
-                               chan->userd.mem = 
nvkm_memory_ref(fifo->userd.mem);
-                               chan->userd.base = chan->id * 
chan->func->userd->size;
+       chan->id = nvkm_chid_get(runl->chid, chan);
+       if (chan->id >= 0) {
+               if (func->userd->bar < 0) {
+                       if (ouserd + chan->func->userd->size >=
+                               nvkm_memory_size(userd)) {
+                               RUNL_DEBUG(runl, "ouserd %llx", ouserd);
+                               return -EINVAL;
+                       }
+
+                       ret = nvkm_memory_kmap(userd, &chan->userd.mem);
+                       if (ret) {
+                               RUNL_DEBUG(runl, "userd %d", ret);
+                               return ret;
                        }
+
+                       chan->userd.base = ouserd;
+               } else {
+                       chan->userd.mem = nvkm_memory_ref(fifo->userd.mem);
+                       chan->userd.base = chan->id * chan->func->userd->size;
                }
-       } else {
-               chan->id = chan->func->id_get(chan, userd, ouserd);
        }
 
        if (chan->id < 0) {
diff --git a/drivers/gpu/drm/nouveau/nvkm/engine/fifo/chan.h 
b/drivers/gpu/drm/nouveau/nvkm/engine/fifo/chan.h
index 013682a709d5..85b94f699128 100644
--- a/drivers/gpu/drm/nouveau/nvkm/engine/fifo/chan.h
+++ b/drivers/gpu/drm/nouveau/nvkm/engine/fifo/chan.h
@@ -17,9 +17,6 @@ struct nvkm_cctx {
 };
 
 struct nvkm_chan_func {
-       int (*id_get)(struct nvkm_chan *, struct nvkm_memory *userd, u64 
ouserd);
-       void (*id_put)(struct nvkm_chan *);
-
        const struct nvkm_chan_func_inst {
                u32 size;
                bool zero;
diff --git a/drivers/gpu/drm/nouveau/nvkm/engine/fifo/r535.c 
b/drivers/gpu/drm/nouveau/nvkm/engine/fifo/r535.c
index 3454c7d29502..129f274c9bfd 100644
--- a/drivers/gpu/drm/nouveau/nvkm/engine/fifo/r535.c
+++ b/drivers/gpu/drm/nouveau/nvkm/engine/fifo/r535.c
@@ -215,123 +215,8 @@ r535_chan_ramfc = {
        .priv = true,
 };
 
-struct r535_chan_userd {
-       struct nvkm_memory *mem;
-       struct nvkm_memory *map;
-       int chid;
-       u32 used;
-
-       struct list_head head;
-} *userd;
-
-static void
-r535_chan_id_put(struct nvkm_chan *chan)
-{
-       struct nvkm_runl *runl = chan->cgrp->runl;
-       struct nvkm_fifo *fifo = runl->fifo;
-       struct r535_chan_userd *userd;
-
-       mutex_lock(&fifo->userd.mutex);
-       list_for_each_entry(userd, &fifo->userd.list, head) {
-               if (userd->map == chan->userd.mem) {
-                       u32 chid = chan->userd.base / chan->func->userd->size;
-
-                       userd->used &= ~BIT(chid);
-                       if (!userd->used) {
-                               nvkm_memory_unref(&userd->map);
-                               nvkm_memory_unref(&userd->mem);
-                               nvkm_chid_put(runl->chid, userd->chid, 
&chan->cgrp->lock);
-                               list_del(&userd->head);
-                               kfree(userd);
-                       }
-
-                       break;
-               }
-       }
-       mutex_unlock(&fifo->userd.mutex);
-
-}
-
-static int
-r535_chan_id_get_locked(struct nvkm_chan *chan, struct nvkm_memory *muserd, 
u64 ouserd)
-{
-       const u32 userd_size = CHID_PER_USERD * chan->func->userd->size;
-       struct nvkm_runl *runl = chan->cgrp->runl;
-       struct nvkm_fifo *fifo = runl->fifo;
-       struct r535_chan_userd *userd;
-       u32 chid;
-       int ret;
-
-       if (ouserd + chan->func->userd->size >= userd_size ||
-           (ouserd & (chan->func->userd->size - 1))) {
-               RUNL_DEBUG(runl, "ouserd %llx", ouserd);
-               return -EINVAL;
-       }
-
-       chid = div_u64(ouserd, chan->func->userd->size);
-
-       list_for_each_entry(userd, &fifo->userd.list, head) {
-               if (userd->mem == muserd) {
-                       if (userd->used & BIT(chid))
-                               return -EBUSY;
-                       break;
-               }
-       }
-
-       if (&userd->head == &fifo->userd.list) {
-               if (nvkm_memory_size(muserd) < userd_size) {
-                       RUNL_DEBUG(runl, "userd too small");
-                       return -EINVAL;
-               }
-
-               userd = kzalloc(sizeof(*userd), GFP_KERNEL);
-               if (!userd)
-                       return -ENOMEM;
-
-               userd->chid = nvkm_chid_get(runl->chid, chan);
-               if (userd->chid < 0) {
-                       ret = userd->chid;
-                       kfree(userd);
-                       return ret;
-               }
-
-               userd->mem = nvkm_memory_ref(muserd);
-
-               ret = nvkm_memory_kmap(userd->mem, &userd->map);
-               if (ret) {
-                       nvkm_chid_put(runl->chid, userd->chid, 
&chan->cgrp->lock);
-                       kfree(userd);
-                       return ret;
-               }
-
-
-               list_add(&userd->head, &fifo->userd.list);
-       }
-
-       userd->used |= BIT(chid);
-
-       chan->userd.mem = nvkm_memory_ref(userd->map);
-       chan->userd.base = ouserd;
-
-       return (userd->chid * CHID_PER_USERD) + chid;
-}
-
-static int
-r535_chan_id_get(struct nvkm_chan *chan, struct nvkm_memory *muserd, u64 
ouserd)
-{
-       struct nvkm_fifo *fifo = chan->cgrp->runl->fifo;
-       int ret;
-
-       mutex_lock(&fifo->userd.mutex);
-       ret = r535_chan_id_get_locked(chan, muserd, ouserd);
-       mutex_unlock(&fifo->userd.mutex);
-       return ret;
-}
-
 static const struct nvkm_chan_func
 r535_chan = {
-       .id_get = r535_chan_id_get,
-       .id_put = r535_chan_id_put,
        .inst = &gf100_chan_inst,
        .userd = &gv100_chan_userd,
        .ramfc = &r535_chan_ramfc,
diff --git a/drivers/gpu/drm/nouveau/nvkm/subdev/gsp/r535.c 
b/drivers/gpu/drm/nouveau/nvkm/subdev/gsp/r535.c
index 64b58efd3132..2bb726c0c49f 100644
--- a/drivers/gpu/drm/nouveau/nvkm/subdev/gsp/r535.c
+++ b/drivers/gpu/drm/nouveau/nvkm/subdev/gsp/r535.c
@@ -1932,7 +1932,7 @@ r535_gsp_msg_rc_triggered(void *priv, u32 fn, void *repv, 
u32 repc)
                   msg->nv2080EngineType, msg->chid, msg->exceptType, 
msg->scope,
                   msg->partitionAttributionId);
 
-       chan = nvkm_chan_get_chid(&subdev->device->fifo->engine, msg->chid / 8, 
&flags);
+       chan = nvkm_chan_get_chid(&subdev->device->fifo->engine, msg->chid, 
&flags);
        if (!chan) {
                nvkm_error(subdev, "rc chid:%d not found!\n", msg->chid);
                return 0;
-- 
2.49.0

Reply via email to