diff options
author | Ben Skeggs <bskeggs@redhat.com> | 2022-10-13 08:05:53 +1000 |
---|---|---|
committer | Ben Skeggs <bskeggs@redhat.com> | 2022-10-13 08:05:53 +1000 |
commit | 530f7700a3d39a408bb212c45dab976a72e50067 (patch) | |
tree | 9d65fc0d0586de5062e51769387ecdfcf08e0287 | |
parent | f83c215785b82c7bccc4d9b46dac1b913851e4a8 (diff) |
pre:fifo: ramht hash->token
-rw-r--r-- | drivers/gpu/drm/nouveau/nvkm/engine/fifo/nv04.c | 11 | ||||
-rw-r--r-- | drivers/gpu/drm/nouveau/nvkm/engine/fifo/nv40.c | 9 | ||||
-rw-r--r-- | drivers/gpu/drm/nouveau/nvkm/engine/fifo/nv50.c | 14 | ||||
-rw-r--r-- | drivers/gpu/drm/nouveau/nvkm/engine/fifo/priv.h | 6 | ||||
-rw-r--r-- | drivers/gpu/drm/nouveau/nvkm/engine/fifo/runl.h | 5 | ||||
-rw-r--r-- | drivers/gpu/drm/nouveau/nvkm/engine/fifo/uchan.c | 21 |
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; |