summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBen Skeggs <bskeggs@redhat.com>2022-10-13 08:05:53 +1000
committerBen Skeggs <bskeggs@redhat.com>2022-10-13 08:05:53 +1000
commit530f7700a3d39a408bb212c45dab976a72e50067 (patch)
tree9d65fc0d0586de5062e51769387ecdfcf08e0287
parentf83c215785b82c7bccc4d9b46dac1b913851e4a8 (diff)
pre:fifo: ramht hash->token
-rw-r--r--drivers/gpu/drm/nouveau/nvkm/engine/fifo/nv04.c11
-rw-r--r--drivers/gpu/drm/nouveau/nvkm/engine/fifo/nv40.c9
-rw-r--r--drivers/gpu/drm/nouveau/nvkm/engine/fifo/nv50.c14
-rw-r--r--drivers/gpu/drm/nouveau/nvkm/engine/fifo/priv.h6
-rw-r--r--drivers/gpu/drm/nouveau/nvkm/engine/fifo/runl.h5
-rw-r--r--drivers/gpu/drm/nouveau/nvkm/engine/fifo/uchan.c21
6 files changed, 45 insertions, 21 deletions
diff --git a/drivers/gpu/drm/nouveau/nvkm/engine/fifo/nv04.c b/drivers/gpu/drm/nouveau/nvkm/engine/fifo/nv04.c
index 674faf002b20..32d0d833340d 100644
--- a/drivers/gpu/drm/nouveau/nvkm/engine/fifo/nv04.c
+++ b/drivers/gpu/drm/nouveau/nvkm/engine/fifo/nv04.c
@@ -178,7 +178,7 @@ nv04_cgrp = {
};
void
-nv04_eobj_ramht_del(struct nvkm_chan *chan, int hash)
+nv04_eobj_ramht_del(struct nvkm_chan *chan, u32 hash)
{
struct nvkm_fifo *fifo = chan->cgrp->runl->fifo;
struct nvkm_instmem *imem = fifo->engine.subdev.device->imem;
@@ -189,7 +189,8 @@ nv04_eobj_ramht_del(struct nvkm_chan *chan, int hash)
}
static int
-nv04_eobj_ramht_add(struct nvkm_engn *engn, struct nvkm_object *eobj, struct nvkm_chan *chan)
+nv04_eobj_ramht_add(struct nvkm_engn *engn, struct nvkm_object *eobj, struct nvkm_chan *chan,
+ u32 *ptoken)
{
struct nvkm_fifo *fifo = chan->cgrp->runl->fifo;
struct nvkm_instmem *imem = fifo->engine.subdev.device->imem;
@@ -199,7 +200,11 @@ nv04_eobj_ramht_add(struct nvkm_engn *engn, struct nvkm_object *eobj, struct nvk
mutex_lock(&fifo->mutex);
hash = nvkm_ramht_insert(imem->ramht, eobj, chan->id, 4, eobj->handle, context);
mutex_unlock(&fifo->mutex);
- return hash;
+ if (hash < 0)
+ return hash;
+
+ *ptoken = hash;
+ return 0;
}
const struct nvkm_engn_func
diff --git a/drivers/gpu/drm/nouveau/nvkm/engine/fifo/nv40.c b/drivers/gpu/drm/nouveau/nvkm/engine/fifo/nv40.c
index e50a94b6d7f8..9b233fa646a4 100644
--- a/drivers/gpu/drm/nouveau/nvkm/engine/fifo/nv40.c
+++ b/drivers/gpu/drm/nouveau/nvkm/engine/fifo/nv40.c
@@ -108,7 +108,8 @@ nv40_chan = {
};
static int
-nv40_eobj_ramht_add(struct nvkm_engn *engn, struct nvkm_object *eobj, struct nvkm_chan *chan)
+nv40_eobj_ramht_add(struct nvkm_engn *engn, struct nvkm_object *eobj, struct nvkm_chan *chan,
+ u32 *ptoken)
{
struct nvkm_fifo *fifo = chan->cgrp->runl->fifo;
struct nvkm_instmem *imem = fifo->engine.subdev.device->imem;
@@ -118,7 +119,11 @@ nv40_eobj_ramht_add(struct nvkm_engn *engn, struct nvkm_object *eobj, struct nvk
mutex_lock(&fifo->mutex);
hash = nvkm_ramht_insert(imem->ramht, eobj, chan->id, 4, eobj->handle, context);
mutex_unlock(&fifo->mutex);
- return hash;
+ if (hash < 0)
+ return hash;
+
+ *ptoken = hash;
+ return 0;
}
static void
diff --git a/drivers/gpu/drm/nouveau/nvkm/engine/fifo/nv50.c b/drivers/gpu/drm/nouveau/nvkm/engine/fifo/nv50.c
index 954b5f3a7d57..845ce836d570 100644
--- a/drivers/gpu/drm/nouveau/nvkm/engine/fifo/nv50.c
+++ b/drivers/gpu/drm/nouveau/nvkm/engine/fifo/nv50.c
@@ -33,15 +33,23 @@
#include <nvif/class.h>
void
-nv50_eobj_ramht_del(struct nvkm_chan *chan, int hash)
+nv50_eobj_ramht_del(struct nvkm_chan *chan, u32 hash)
{
nvkm_ramht_remove(chan->ramht, hash);
}
int
-nv50_eobj_ramht_add(struct nvkm_engn *engn, struct nvkm_object *eobj, struct nvkm_chan *chan)
+nv50_eobj_ramht_add(struct nvkm_engn *engn, struct nvkm_object *eobj, struct nvkm_chan *chan,
+ u32 *ptoken)
{
- return nvkm_ramht_insert(chan->ramht, eobj, 0, 4, eobj->handle, engn->id << 20);
+ int hash;
+
+ hash = nvkm_ramht_insert(chan->ramht, eobj, 0, 4, eobj->handle, engn->id << 20);
+ if (hash < 0)
+ return hash;
+
+ *ptoken = hash;
+ return 0;
}
void
diff --git a/drivers/gpu/drm/nouveau/nvkm/engine/fifo/priv.h b/drivers/gpu/drm/nouveau/nvkm/engine/fifo/priv.h
index 4d448be19224..1712f34db962 100644
--- a/drivers/gpu/drm/nouveau/nvkm/engine/fifo/priv.h
+++ b/drivers/gpu/drm/nouveau/nvkm/engine/fifo/priv.h
@@ -75,7 +75,7 @@ extern const struct nvkm_chan_func_userd nv04_chan_userd;
void nv04_chan_ramfc_clear(struct nvkm_chan *);
void nv04_chan_start(struct nvkm_chan *);
void nv04_chan_stop(struct nvkm_chan *);
-void nv04_eobj_ramht_del(struct nvkm_chan *, int);
+void nv04_eobj_ramht_del(struct nvkm_chan *, u32);
int nv10_fifo_chid_nr(struct nvkm_fifo *);
@@ -92,8 +92,8 @@ void nv50_chan_unbind(struct nvkm_chan *);
void nv50_chan_start(struct nvkm_chan *);
void nv50_chan_stop(struct nvkm_chan *);
void nv50_chan_preempt(struct nvkm_chan *);
-int nv50_eobj_ramht_add(struct nvkm_engn *, struct nvkm_object *, struct nvkm_chan *);
-void nv50_eobj_ramht_del(struct nvkm_chan *, int);
+int nv50_eobj_ramht_add(struct nvkm_engn *, struct nvkm_object *, struct nvkm_chan *, u32 *);
+void nv50_eobj_ramht_del(struct nvkm_chan *, u32);
extern const struct nvkm_event_func g84_fifo_nonstall;
extern const struct nvkm_engn_func g84_engn;
diff --git a/drivers/gpu/drm/nouveau/nvkm/engine/fifo/runl.h b/drivers/gpu/drm/nouveau/nvkm/engine/fifo/runl.h
index c93d21bb7bd5..4eb0c08d9f45 100644
--- a/drivers/gpu/drm/nouveau/nvkm/engine/fifo/runl.h
+++ b/drivers/gpu/drm/nouveau/nvkm/engine/fifo/runl.h
@@ -17,8 +17,9 @@ struct nvkm_engn {
bool (*mmu_fault_triggered)(struct nvkm_engn *);
int (*ctor)(struct nvkm_engn *, struct nvkm_vctx *);
void (*bind)(struct nvkm_engn *, struct nvkm_cctx *, struct nvkm_chan *);
- int (*ramht_add)(struct nvkm_engn *, struct nvkm_object *, struct nvkm_chan *);
- void (*ramht_del)(struct nvkm_chan *, int hash);
+ int (*ramht_add)(struct nvkm_engn *, struct nvkm_object *, struct nvkm_chan *,
+ u32 *ptoken);
+ void (*ramht_del)(struct nvkm_chan *, u32 token);
} *func;
struct nvkm_runl *runl;
int id;
diff --git a/drivers/gpu/drm/nouveau/nvkm/engine/fifo/uchan.c b/drivers/gpu/drm/nouveau/nvkm/engine/fifo/uchan.c
index 1dac95ae7b43..12b48a23b7f4 100644
--- a/drivers/gpu/drm/nouveau/nvkm/engine/fifo/uchan.c
+++ b/drivers/gpu/drm/nouveau/nvkm/engine/fifo/uchan.c
@@ -68,7 +68,9 @@ struct nvkm_uobj {
struct nvkm_oproxy oproxy;
struct nvkm_chan *chan;
struct nvkm_cctx *cctx;
- int hash;
+
+ u32 token;
+ bool token_valid;
};
static int
@@ -131,14 +133,15 @@ static void
nvkm_uchan_object_dtor(struct nvkm_oproxy *oproxy)
{
struct nvkm_uobj *uobj = container_of(oproxy, typeof(*uobj), oproxy);
- struct nvkm_engn *engn;
if (!uobj->cctx)
return;
- engn = uobj->cctx->vctx->ectx->engn;
- if (engn->func->ramht_del)
- engn->func->ramht_del(uobj->chan, uobj->hash);
+ if (uobj->token_valid) {
+ struct nvkm_engn *engn = uobj->cctx->vctx->ectx->engn;
+
+ engn->func->ramht_del(uobj->chan, uobj->token);
+ }
nvkm_chan_cctx_put(uobj->chan, &uobj->cctx);
}
@@ -192,9 +195,11 @@ nvkm_uchan_object_new(const struct nvkm_oclass *oclass, void *argv, u32 argc,
return ret;
if (engn->func->ramht_add) {
- uobj->hash = engn->func->ramht_add(engn, uobj->oproxy.object, uobj->chan);
- if (uobj->hash < 0)
- return uobj->hash;
+ ret = engn->func->ramht_add(engn, uobj->oproxy.object, uobj->chan, &uobj->token);
+ if (ret)
+ return ret;
+
+ uobj->token_valid = true;
}
return 0;