diff options
author | Ben Skeggs <bskeggs@redhat.com> | 2022-06-01 13:47:35 +0300 |
---|---|---|
committer | Ben Skeggs <bskeggs@redhat.com> | 2022-11-09 03:44:49 +0300 |
commit | d3e7a4392c82ec2d3c573cdc0fbcc843f3d76b12 (patch) | |
tree | 6a6af1dbb0416792927ee13a73aa33a5623066f7 /drivers/gpu/drm/nouveau/nvkm/engine | |
parent | b084fff210bfd00de5cdef1802291272c77f581d (diff) | |
download | linux-d3e7a4392c82ec2d3c573cdc0fbcc843f3d76b12.tar.xz |
drm/nouveau/fifo: add RAMIN info to nvkm_chan_func
Currently provided by {chan,dma,gpfifo}*.c, and those are going away.
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
Reviewed-by: Lyude Paul <lyude@redhat.com>
Diffstat (limited to 'drivers/gpu/drm/nouveau/nvkm/engine')
-rw-r--r-- | drivers/gpu/drm/nouveau/nvkm/engine/fifo/chan.c | 41 | ||||
-rw-r--r-- | drivers/gpu/drm/nouveau/nvkm/engine/fifo/chan.h | 6 | ||||
-rw-r--r-- | drivers/gpu/drm/nouveau/nvkm/engine/fifo/g84.c | 1 | ||||
-rw-r--r-- | drivers/gpu/drm/nouveau/nvkm/engine/fifo/gf100.c | 8 | ||||
-rw-r--r-- | drivers/gpu/drm/nouveau/nvkm/engine/fifo/gk104.c | 1 | ||||
-rw-r--r-- | drivers/gpu/drm/nouveau/nvkm/engine/fifo/gk110.c | 1 | ||||
-rw-r--r-- | drivers/gpu/drm/nouveau/nvkm/engine/fifo/gm107.c | 1 | ||||
-rw-r--r-- | drivers/gpu/drm/nouveau/nvkm/engine/fifo/gv100.c | 1 | ||||
-rw-r--r-- | drivers/gpu/drm/nouveau/nvkm/engine/fifo/nv04.c | 6 | ||||
-rw-r--r-- | drivers/gpu/drm/nouveau/nvkm/engine/fifo/nv10.c | 1 | ||||
-rw-r--r-- | drivers/gpu/drm/nouveau/nvkm/engine/fifo/nv17.c | 1 | ||||
-rw-r--r-- | drivers/gpu/drm/nouveau/nvkm/engine/fifo/nv40.c | 1 | ||||
-rw-r--r-- | drivers/gpu/drm/nouveau/nvkm/engine/fifo/nv50.c | 7 | ||||
-rw-r--r-- | drivers/gpu/drm/nouveau/nvkm/engine/fifo/priv.h | 3 | ||||
-rw-r--r-- | drivers/gpu/drm/nouveau/nvkm/engine/fifo/tu102.c | 1 |
15 files changed, 62 insertions, 18 deletions
diff --git a/drivers/gpu/drm/nouveau/nvkm/engine/fifo/chan.c b/drivers/gpu/drm/nouveau/nvkm/engine/fifo/chan.c index 3832a9aad80a..5b6377ec0df0 100644 --- a/drivers/gpu/drm/nouveau/nvkm/engine/fifo/chan.c +++ b/drivers/gpu/drm/nouveau/nvkm/engine/fifo/chan.c @@ -602,39 +602,44 @@ nvkm_fifo_chan_ctor(const struct nvkm_fifo_chan_func *fn, chan->cgrp = nvkm_cgrp_ref(cgrp); } - /* instance memory */ - ret = nvkm_gpuobj_new(device, size, align, zero, NULL, &chan->inst); - if (ret) + /* Allocate instance block. */ + ret = nvkm_gpuobj_new(device, func->inst->size, 0x1000, func->inst->zero, NULL, + &chan->inst); + if (ret) { + RUNL_DEBUG(runl, "inst %d", ret); return ret; - - /* allocate push buffer ctxdma instance */ - if (push) { - dmaobj = nvkm_dmaobj_search(client, push); - if (IS_ERR(dmaobj)) - return PTR_ERR(dmaobj); - - ret = nvkm_object_bind(&dmaobj->object, chan->inst, -16, - &chan->push); - if (ret) - return ret; } - /* channel address space */ - if (hvmm) { + /* Initialise virtual address-space. */ + if (func->inst->vmm) { struct nvkm_vmm *vmm = nvkm_uvmm_search(client, hvmm); if (IS_ERR(vmm)) return PTR_ERR(vmm); - if (vmm->mmu != device->mmu) + if (WARN_ON(vmm->mmu != device->mmu)) return -EINVAL; ret = nvkm_vmm_join(vmm, chan->inst->memory); - if (ret) + if (ret) { + RUNL_DEBUG(runl, "vmm %d", ret); return ret; + } chan->vmm = nvkm_vmm_ref(vmm); } + /* allocate push buffer ctxdma instance */ + if (push) { + dmaobj = nvkm_dmaobj_search(client, push); + if (IS_ERR(dmaobj)) + return PTR_ERR(dmaobj); + + ret = nvkm_object_bind(&dmaobj->object, chan->inst, -16, + &chan->push); + if (ret) + return ret; + } + /* Allocate channel ID. */ chan->id = nvkm_chid_get(runl->chid, chan); 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 804441f30f44..0b764d28117e 100644 --- a/drivers/gpu/drm/nouveau/nvkm/engine/fifo/chan.h +++ b/drivers/gpu/drm/nouveau/nvkm/engine/fifo/chan.h @@ -16,6 +16,12 @@ struct nvkm_cctx { }; struct nvkm_chan_func { + const struct nvkm_chan_func_inst { + u32 size; + bool zero; + bool vmm; + } *inst; + void (*bind)(struct nvkm_chan *); void (*unbind)(struct nvkm_chan *); void (*start)(struct nvkm_chan *); diff --git a/drivers/gpu/drm/nouveau/nvkm/engine/fifo/g84.c b/drivers/gpu/drm/nouveau/nvkm/engine/fifo/g84.c index 18ec982f4f54..beb51dcb8863 100644 --- a/drivers/gpu/drm/nouveau/nvkm/engine/fifo/g84.c +++ b/drivers/gpu/drm/nouveau/nvkm/engine/fifo/g84.c @@ -42,6 +42,7 @@ g84_chan_bind(struct nvkm_chan *chan) const struct nvkm_chan_func g84_chan = { + .inst = &nv50_chan_inst, .bind = g84_chan_bind, .unbind = nv50_chan_unbind, .start = nv50_chan_start, diff --git a/drivers/gpu/drm/nouveau/nvkm/engine/fifo/gf100.c b/drivers/gpu/drm/nouveau/nvkm/engine/fifo/gf100.c index 767507e0e239..8d1ffeb10c45 100644 --- a/drivers/gpu/drm/nouveau/nvkm/engine/fifo/gf100.c +++ b/drivers/gpu/drm/nouveau/nvkm/engine/fifo/gf100.c @@ -82,8 +82,16 @@ gf100_chan_bind(struct nvkm_chan *chan) nvkm_wr32(device, 0x003000 + (chan->id * 8), 0xc0000000 | chan->inst->addr >> 12); } +const struct nvkm_chan_func_inst +gf100_chan_inst = { + .size = 0x1000, + .zero = true, + .vmm = true, +}; + static const struct nvkm_chan_func gf100_chan = { + .inst = &gf100_chan_inst, .bind = gf100_chan_bind, .unbind = gf100_chan_unbind, .start = gf100_chan_start, diff --git a/drivers/gpu/drm/nouveau/nvkm/engine/fifo/gk104.c b/drivers/gpu/drm/nouveau/nvkm/engine/fifo/gk104.c index b5e698a223b6..a7e2b58f5029 100644 --- a/drivers/gpu/drm/nouveau/nvkm/engine/fifo/gk104.c +++ b/drivers/gpu/drm/nouveau/nvkm/engine/fifo/gk104.c @@ -81,6 +81,7 @@ gk104_chan_bind(struct nvkm_chan *chan) static const struct nvkm_chan_func gk104_chan = { + .inst = &gf100_chan_inst, .bind = gk104_chan_bind, .unbind = gk104_chan_unbind, .start = gk104_chan_start, diff --git a/drivers/gpu/drm/nouveau/nvkm/engine/fifo/gk110.c b/drivers/gpu/drm/nouveau/nvkm/engine/fifo/gk110.c index 812fefff0925..5cc48a367c0d 100644 --- a/drivers/gpu/drm/nouveau/nvkm/engine/fifo/gk110.c +++ b/drivers/gpu/drm/nouveau/nvkm/engine/fifo/gk110.c @@ -49,6 +49,7 @@ gk110_chan_preempt(struct nvkm_chan *chan) const struct nvkm_chan_func gk110_chan = { + .inst = &gf100_chan_inst, .bind = gk104_chan_bind, .unbind = gk104_chan_unbind, .start = gk104_chan_start, diff --git a/drivers/gpu/drm/nouveau/nvkm/engine/fifo/gm107.c b/drivers/gpu/drm/nouveau/nvkm/engine/fifo/gm107.c index c0eca7da7d09..f8bc89ac35ab 100644 --- a/drivers/gpu/drm/nouveau/nvkm/engine/fifo/gm107.c +++ b/drivers/gpu/drm/nouveau/nvkm/engine/fifo/gm107.c @@ -34,6 +34,7 @@ const struct nvkm_chan_func gm107_chan = { + .inst = &gf100_chan_inst, .bind = gk104_chan_bind_inst, .unbind = gk104_chan_unbind, .start = gk104_chan_start, diff --git a/drivers/gpu/drm/nouveau/nvkm/engine/fifo/gv100.c b/drivers/gpu/drm/nouveau/nvkm/engine/fifo/gv100.c index 29a83ed3404f..db998c9de3ad 100644 --- a/drivers/gpu/drm/nouveau/nvkm/engine/fifo/gv100.c +++ b/drivers/gpu/drm/nouveau/nvkm/engine/fifo/gv100.c @@ -40,6 +40,7 @@ gv100_chan_doorbell_handle(struct nvkm_chan *chan) static const struct nvkm_chan_func gv100_chan = { + .inst = &gf100_chan_inst, .bind = gk104_chan_bind_inst, .unbind = gk104_chan_unbind, .start = gk104_chan_start, diff --git a/drivers/gpu/drm/nouveau/nvkm/engine/fifo/nv04.c b/drivers/gpu/drm/nouveau/nvkm/engine/fifo/nv04.c index a0a28a81f7f4..aeb24f838e3f 100644 --- a/drivers/gpu/drm/nouveau/nvkm/engine/fifo/nv04.c +++ b/drivers/gpu/drm/nouveau/nvkm/engine/fifo/nv04.c @@ -113,8 +113,14 @@ nv04_chan_start(struct nvkm_chan *chan) spin_unlock_irqrestore(&fifo->lock, flags); } +const struct nvkm_chan_func_inst +nv04_chan_inst = { + .size = 0x1000, +}; + static const struct nvkm_chan_func nv04_chan = { + .inst = &nv04_chan_inst, .start = nv04_chan_start, .stop = nv04_chan_stop, }; diff --git a/drivers/gpu/drm/nouveau/nvkm/engine/fifo/nv10.c b/drivers/gpu/drm/nouveau/nvkm/engine/fifo/nv10.c index 8d302cb8ba8c..b9111fcfbcad 100644 --- a/drivers/gpu/drm/nouveau/nvkm/engine/fifo/nv10.c +++ b/drivers/gpu/drm/nouveau/nvkm/engine/fifo/nv10.c @@ -45,6 +45,7 @@ nv10_fifo_ramfc[] = { static const struct nvkm_chan_func nv10_chan = { + .inst = &nv04_chan_inst, .start = nv04_chan_start, .stop = nv04_chan_stop, }; diff --git a/drivers/gpu/drm/nouveau/nvkm/engine/fifo/nv17.c b/drivers/gpu/drm/nouveau/nvkm/engine/fifo/nv17.c index 7b1b90d285c1..e0ad8fabb2d6 100644 --- a/drivers/gpu/drm/nouveau/nvkm/engine/fifo/nv17.c +++ b/drivers/gpu/drm/nouveau/nvkm/engine/fifo/nv17.c @@ -54,6 +54,7 @@ nv17_fifo_ramfc[] = { static const struct nvkm_chan_func nv17_chan = { + .inst = &nv04_chan_inst, .start = nv04_chan_start, .stop = nv04_chan_stop, }; diff --git a/drivers/gpu/drm/nouveau/nvkm/engine/fifo/nv40.c b/drivers/gpu/drm/nouveau/nvkm/engine/fifo/nv40.c index 19f7c0407e70..c2d892a7400b 100644 --- a/drivers/gpu/drm/nouveau/nvkm/engine/fifo/nv40.c +++ b/drivers/gpu/drm/nouveau/nvkm/engine/fifo/nv40.c @@ -64,6 +64,7 @@ nv40_fifo_ramfc[] = { static const struct nvkm_chan_func nv40_chan = { + .inst = &nv04_chan_inst, .start = nv04_chan_start, .stop = nv04_chan_stop, }; diff --git a/drivers/gpu/drm/nouveau/nvkm/engine/fifo/nv50.c b/drivers/gpu/drm/nouveau/nvkm/engine/fifo/nv50.c index 6a069e84006c..384772d522af 100644 --- a/drivers/gpu/drm/nouveau/nvkm/engine/fifo/nv50.c +++ b/drivers/gpu/drm/nouveau/nvkm/engine/fifo/nv50.c @@ -66,8 +66,15 @@ nv50_chan_bind(struct nvkm_chan *chan) nvkm_wr32(device, 0x002600 + (chan->id * 4), nv50_fifo_chan(chan)->ramfc->addr >> 12); } +const struct nvkm_chan_func_inst +nv50_chan_inst = { + .size = 0x10000, + .vmm = true, +}; + static const struct nvkm_chan_func nv50_chan = { + .inst = &nv50_chan_inst, .bind = nv50_chan_bind, .unbind = nv50_chan_unbind, .start = nv50_chan_start, diff --git a/drivers/gpu/drm/nouveau/nvkm/engine/fifo/priv.h b/drivers/gpu/drm/nouveau/nvkm/engine/fifo/priv.h index 78c6d2218398..bf8067e97ba2 100644 --- a/drivers/gpu/drm/nouveau/nvkm/engine/fifo/priv.h +++ b/drivers/gpu/drm/nouveau/nvkm/engine/fifo/priv.h @@ -80,6 +80,7 @@ void nv04_fifo_start(struct nvkm_fifo *, unsigned long *); extern const struct nvkm_runl_func nv04_runl; extern const struct nvkm_engn_func nv04_engn; extern const struct nvkm_cgrp_func nv04_cgrp; +extern const struct nvkm_chan_func_inst nv04_chan_inst; void nv04_chan_start(struct nvkm_chan *); void nv04_chan_stop(struct nvkm_chan *); @@ -92,6 +93,7 @@ extern const struct nvkm_runl_func nv50_runl; int nv50_runl_update(struct nvkm_runl *); int nv50_runl_wait(struct nvkm_runl *); extern const struct nvkm_engn_func nv50_engn_sw; +extern const struct nvkm_chan_func_inst nv50_chan_inst; void nv50_chan_unbind(struct nvkm_chan *); void nv50_chan_start(struct nvkm_chan *); void nv50_chan_stop(struct nvkm_chan *); @@ -117,6 +119,7 @@ bool gf100_runq_intr(struct nvkm_runq *, struct nvkm_runl *); void gf100_engn_mmu_fault_trigger(struct nvkm_engn *); bool gf100_engn_mmu_fault_triggered(struct nvkm_engn *); extern const struct nvkm_engn_func gf100_engn_sw; +extern const struct nvkm_chan_func_inst gf100_chan_inst; void gf100_chan_preempt(struct nvkm_chan *); int gk104_fifo_chid_nr(struct nvkm_fifo *); diff --git a/drivers/gpu/drm/nouveau/nvkm/engine/fifo/tu102.c b/drivers/gpu/drm/nouveau/nvkm/engine/fifo/tu102.c index babadc8641dc..75e4c0db40bc 100644 --- a/drivers/gpu/drm/nouveau/nvkm/engine/fifo/tu102.c +++ b/drivers/gpu/drm/nouveau/nvkm/engine/fifo/tu102.c @@ -49,6 +49,7 @@ tu102_chan_start(struct nvkm_chan *chan) static const struct nvkm_chan_func tu102_chan = { + .inst = &gf100_chan_inst, .bind = gk104_chan_bind_inst, .unbind = gk104_chan_unbind, .start = tu102_chan_start, |