From: Dave Airlie <[email protected]> this has a lot of args, and it wants to grow more in the future, lets just refactor this out and make it cleaner.
Signed-off-by: Dave Airlie <[email protected]> --- .../nouveau/nvkm/subdev/gsp/rm/r535/fifo.c | 48 +++++++++++-------- .../drm/nouveau/nvkm/subdev/gsp/rm/r535/gr.c | 18 +++++-- .../nouveau/nvkm/subdev/gsp/rm/r570/fifo.c | 31 ++++++------ .../drm/nouveau/nvkm/subdev/gsp/rm/r570/gr.c | 18 +++++-- .../gpu/drm/nouveau/nvkm/subdev/gsp/rm/rm.h | 17 +++++-- 5 files changed, 83 insertions(+), 49 deletions(-) diff --git a/drivers/gpu/drm/nouveau/nvkm/subdev/gsp/rm/r535/fifo.c b/drivers/gpu/drm/nouveau/nvkm/subdev/gsp/rm/r535/fifo.c index 76ee938efea3..6603b1951772 100644 --- a/drivers/gpu/drm/nouveau/nvkm/subdev/gsp/rm/r535/fifo.c +++ b/drivers/gpu/drm/nouveau/nvkm/subdev/gsp/rm/r535/fifo.c @@ -72,15 +72,14 @@ r535_chan_ramfc_clear(struct nvkm_chan *chan) #define CHID_PER_USERD 8 static int -r535_chan_alloc(struct nvkm_gsp_device *device, u32 handle, u32 nv2080_engine_type, u8 runq, - bool priv, int chid, u64 inst_addr, u64 userd_addr, u64 mthdbuf_addr, - struct nvkm_vmm *vmm, u64 gpfifo_offset, u32 gpfifo_length, +r535_chan_alloc(struct nvkm_gsp_device *device, u32 handle, + const struct nvkm_rm_chan_alloc_args *chan_args, struct nvkm_gsp_object *chan) { struct nvkm_gsp *gsp = device->object.client->gsp; struct nvkm_fifo *fifo = gsp->subdev.device->fifo; - const int userd_p = chid / CHID_PER_USERD; - const int userd_i = chid % CHID_PER_USERD; + const int userd_p = chan_args->chid / CHID_PER_USERD; + const int userd_i = chan_args->chid % CHID_PER_USERD; NV_CHANNELGPFIFO_ALLOCATION_PARAMETERS *args; args = nvkm_gsp_rm_alloc_get(&device->object, handle, @@ -88,14 +87,14 @@ r535_chan_alloc(struct nvkm_gsp_device *device, u32 handle, u32 nv2080_engine_ty if (WARN_ON(IS_ERR(args))) return PTR_ERR(args); - args->gpFifoOffset = gpfifo_offset; - args->gpFifoEntries = gpfifo_length / 8; + args->gpFifoOffset = chan_args->gpfifo_offset; + args->gpFifoEntries = chan_args->gpfifo_length / 8; args->flags = NVDEF(NVOS04, FLAGS, CHANNEL_TYPE, PHYSICAL); args->flags |= NVDEF(NVOS04, FLAGS, VPR, FALSE); args->flags |= NVDEF(NVOS04, FLAGS, CHANNEL_SKIP_MAP_REFCOUNTING, FALSE); - args->flags |= NVVAL(NVOS04, FLAGS, GROUP_CHANNEL_RUNQUEUE, runq); - if (!priv) + args->flags |= NVVAL(NVOS04, FLAGS, GROUP_CHANNEL_RUNQUEUE, chan_args->runq); + if (!chan_args->priv) args->flags |= NVDEF(NVOS04, FLAGS, PRIVILEGED_CHANNEL, FALSE); else args->flags |= NVDEF(NVOS04, FLAGS, PRIVILEGED_CHANNEL, TRUE); @@ -117,30 +116,30 @@ r535_chan_alloc(struct nvkm_gsp_device *device, u32 handle, u32 nv2080_engine_ty args->flags |= NVDEF(NVOS04, FLAGS, MAP_CHANNEL, FALSE); args->flags |= NVDEF(NVOS04, FLAGS, SKIP_CTXBUFFER_ALLOC, FALSE); - args->hVASpace = vmm->rm.object.handle; - args->engineType = nv2080_engine_type; + args->hVASpace = chan_args->vmm->rm.object.handle; + args->engineType = chan_args->nv2080_engine_type; - args->instanceMem.base = inst_addr; + args->instanceMem.base = chan_args->inst_addr; args->instanceMem.size = fifo->func->chan.func->inst->size; args->instanceMem.addressSpace = 2; args->instanceMem.cacheAttrib = 1; - args->userdMem.base = userd_addr; + args->userdMem.base = chan_args->userd_addr; args->userdMem.size = fifo->func->chan.func->userd->size; args->userdMem.addressSpace = 2; args->userdMem.cacheAttrib = 1; - args->ramfcMem.base = inst_addr; + args->ramfcMem.base = chan_args->inst_addr; args->ramfcMem.size = 0x200; args->ramfcMem.addressSpace = 2; args->ramfcMem.cacheAttrib = 1; - args->mthdbufMem.base = mthdbuf_addr; + args->mthdbufMem.base = chan_args->mthdbuf_addr; args->mthdbufMem.size = fifo->rm.mthdbuf_size; args->mthdbufMem.addressSpace = 1; args->mthdbufMem.cacheAttrib = 0; - if (!priv) + if (!chan_args->priv) args->internalFlags = NVDEF(NV_KERNELCHANNEL, ALLOC_INTERNALFLAGS, PRIVILEGE, USER); else args->internalFlags = NVDEF(NV_KERNELCHANNEL, ALLOC_INTERNALFLAGS, PRIVILEGE, ADMIN); @@ -180,11 +179,20 @@ r535_chan_ramfc_write(struct nvkm_chan *chan, u64 offset, u64 length, u32 devm, if (!chan->rm.mthdbuf.ptr) return -ENOMEM; + struct nvkm_rm_chan_alloc_args chan_args = { + .nv2080_engine_type = eT, + .runq = chan->runq, + .priv = priv, + .chid = chan->id, + .inst_addr = chan->inst->addr, + .userd_addr = nvkm_memory_addr(chan->userd.mem) + chan->userd.base, + .mthdbuf_addr = chan->rm.mthdbuf.addr, + .vmm = chan->vmm, + .gpfifo_offset = offset, + .gpfifo_length = length + }; ret = rmapi->fifo->chan.alloc(&chan->vmm->rm.device, NVKM_RM_CHAN(chan->id), - eT, chan->runq, priv, chan->id, chan->inst->addr, - nvkm_memory_addr(chan->userd.mem) + chan->userd.base, - chan->rm.mthdbuf.addr, chan->vmm, offset, length, - &chan->rm.object); + &chan_args, &chan->rm.object); if (ret) return ret; diff --git a/drivers/gpu/drm/nouveau/nvkm/subdev/gsp/rm/r535/gr.c b/drivers/gpu/drm/nouveau/nvkm/subdev/gsp/rm/r535/gr.c index 034db286d285..4bec793a2caf 100644 --- a/drivers/gpu/drm/nouveau/nvkm/subdev/gsp/rm/r535/gr.c +++ b/drivers/gpu/drm/nouveau/nvkm/subdev/gsp/rm/r535/gr.c @@ -301,12 +301,20 @@ r535_gr_oneinit(struct nvkm_gr *base) if (ret) goto done; + struct nvkm_rm_chan_alloc_args chan_args = { + .nv2080_engine_type = 1, + .runq = 0, + .priv = true, + .chid = rm->api->fifo->rsvd_chids, + .inst_addr = nvkm_memory_addr(golden.inst), + .userd_addr = nvkm_memory_addr(golden.inst) + 0x1000, + .mthdbuf_addr = nvkm_memory_addr(golden.inst) + 0x2000, + .vmm = golden.vmm, + .gpfifo_offset = 0, + .gpfifo_length = 0x1000 + }; ret = rm->api->fifo->chan.alloc(&golden.vmm->rm.device, NVKM_RM_CHAN(0), - 1, 0, true, rm->api->fifo->rsvd_chids, - nvkm_memory_addr(golden.inst), - nvkm_memory_addr(golden.inst) + 0x1000, - nvkm_memory_addr(golden.inst) + 0x2000, - golden.vmm, 0, 0x1000, &golden.chan); + &chan_args, &golden.chan); if (ret) goto done; diff --git a/drivers/gpu/drm/nouveau/nvkm/subdev/gsp/rm/r570/fifo.c b/drivers/gpu/drm/nouveau/nvkm/subdev/gsp/rm/r570/fifo.c index 79132805cfcf..e28c7251ea10 100644 --- a/drivers/gpu/drm/nouveau/nvkm/subdev/gsp/rm/r570/fifo.c +++ b/drivers/gpu/drm/nouveau/nvkm/subdev/gsp/rm/r570/fifo.c @@ -17,15 +17,14 @@ #define CHID_PER_USERD 8 static int -r570_chan_alloc(struct nvkm_gsp_device *device, u32 handle, u32 nv2080_engine_type, u8 runq, - bool priv, int chid, u64 inst_addr, u64 userd_addr, u64 mthdbuf_addr, - struct nvkm_vmm *vmm, u64 gpfifo_offset, u32 gpfifo_length, +r570_chan_alloc(struct nvkm_gsp_device *device, u32 handle, + const struct nvkm_rm_chan_alloc_args *chan_args, struct nvkm_gsp_object *chan) { struct nvkm_gsp *gsp = device->object.client->gsp; struct nvkm_fifo *fifo = gsp->subdev.device->fifo; - const int userd_p = chid / CHID_PER_USERD; - const int userd_i = chid % CHID_PER_USERD; + const int userd_p = chan_args->chid / CHID_PER_USERD; + const int userd_i = chan_args->chid % CHID_PER_USERD; NV_CHANNELGPFIFO_ALLOCATION_PARAMETERS *args; args = nvkm_gsp_rm_alloc_get(&device->object, handle, @@ -33,14 +32,14 @@ r570_chan_alloc(struct nvkm_gsp_device *device, u32 handle, u32 nv2080_engine_ty if (WARN_ON(IS_ERR(args))) return PTR_ERR(args); - args->gpFifoOffset = gpfifo_offset; - args->gpFifoEntries = gpfifo_length / 8; + args->gpFifoOffset = chan_args->gpfifo_offset; + args->gpFifoEntries = chan_args->gpfifo_length / 8; args->flags = NVDEF(NVOS04, FLAGS, CHANNEL_TYPE, PHYSICAL); args->flags |= NVDEF(NVOS04, FLAGS, VPR, FALSE); args->flags |= NVDEF(NVOS04, FLAGS, CHANNEL_SKIP_MAP_REFCOUNTING, FALSE); - args->flags |= NVVAL(NVOS04, FLAGS, GROUP_CHANNEL_RUNQUEUE, runq); - if (!priv) + args->flags |= NVVAL(NVOS04, FLAGS, GROUP_CHANNEL_RUNQUEUE, chan_args->runq); + if (!chan_args->priv) args->flags |= NVDEF(NVOS04, FLAGS, PRIVILEGED_CHANNEL, FALSE); else args->flags |= NVDEF(NVOS04, FLAGS, PRIVILEGED_CHANNEL, TRUE); @@ -62,30 +61,30 @@ r570_chan_alloc(struct nvkm_gsp_device *device, u32 handle, u32 nv2080_engine_ty args->flags |= NVDEF(NVOS04, FLAGS, MAP_CHANNEL, FALSE); args->flags |= NVDEF(NVOS04, FLAGS, SKIP_CTXBUFFER_ALLOC, FALSE); - args->hVASpace = vmm->rm.object.handle; - args->engineType = nv2080_engine_type; + args->hVASpace = chan_args->vmm->rm.object.handle; + args->engineType = chan_args->nv2080_engine_type; - args->instanceMem.base = inst_addr; + args->instanceMem.base = chan_args->inst_addr; args->instanceMem.size = fifo->func->chan.func->inst->size; args->instanceMem.addressSpace = 2; args->instanceMem.cacheAttrib = 1; - args->userdMem.base = userd_addr; + args->userdMem.base = chan_args->userd_addr; args->userdMem.size = fifo->func->chan.func->userd->size; args->userdMem.addressSpace = 2; args->userdMem.cacheAttrib = 1; - args->ramfcMem.base = inst_addr; + args->ramfcMem.base = chan_args->inst_addr; args->ramfcMem.size = 0x200; args->ramfcMem.addressSpace = 2; args->ramfcMem.cacheAttrib = 1; - args->mthdbufMem.base = mthdbuf_addr; + args->mthdbufMem.base = chan_args->mthdbuf_addr; args->mthdbufMem.size = fifo->rm.mthdbuf_size; args->mthdbufMem.addressSpace = 1; args->mthdbufMem.cacheAttrib = 0; - if (!priv) + if (!chan_args->priv) args->internalFlags = NVDEF(NV_KERNELCHANNEL, ALLOC_INTERNALFLAGS, PRIVILEGE, USER); else args->internalFlags = NVDEF(NV_KERNELCHANNEL, ALLOC_INTERNALFLAGS, PRIVILEGE, ADMIN); diff --git a/drivers/gpu/drm/nouveau/nvkm/subdev/gsp/rm/r570/gr.c b/drivers/gpu/drm/nouveau/nvkm/subdev/gsp/rm/r570/gr.c index 8dd4552aeaa5..354562ba9d35 100644 --- a/drivers/gpu/drm/nouveau/nvkm/subdev/gsp/rm/r570/gr.c +++ b/drivers/gpu/drm/nouveau/nvkm/subdev/gsp/rm/r570/gr.c @@ -130,12 +130,20 @@ r570_gr_scrubber_init(struct r535_gr *gr) if (ret) goto done; + struct nvkm_rm_chan_alloc_args chan_args = { + .nv2080_engine_type = NV2080_ENGINE_TYPE_GR0, + .runq = 0, + .priv = false, + .chid = gr->scrubber.chid, + .inst_addr = nvkm_memory_addr(gr->scrubber.inst), + .userd_addr = nvkm_memory_addr(gr->scrubber.inst) + 0x1000, + .mthdbuf_addr = nvkm_memory_addr(gr->scrubber.inst) + 0x2000, + .vmm = gr->scrubber.vmm, + .gpfifo_offset = 0, + .gpfifo_length = 0x1000, + }; ret = rm->api->fifo->chan.alloc(&gr->scrubber.vmm->rm.device, KGRAPHICS_SCRUBBER_HANDLE_CHANNEL, - NV2080_ENGINE_TYPE_GR0, 0, false, gr->scrubber.chid, - nvkm_memory_addr(gr->scrubber.inst), - nvkm_memory_addr(gr->scrubber.inst) + 0x1000, - nvkm_memory_addr(gr->scrubber.inst) + 0x2000, - gr->scrubber.vmm, 0, 0x1000, &gr->scrubber.chan); + &chan_args, &gr->scrubber.chan); if (ret) goto done; diff --git a/drivers/gpu/drm/nouveau/nvkm/subdev/gsp/rm/rm.h b/drivers/gpu/drm/nouveau/nvkm/subdev/gsp/rm/rm.h index b77059e0ac12..b71ba74eec12 100644 --- a/drivers/gpu/drm/nouveau/nvkm/subdev/gsp/rm/rm.h +++ b/drivers/gpu/drm/nouveau/nvkm/subdev/gsp/rm/rm.h @@ -31,6 +31,19 @@ struct nvkm_rm_wpr { bool is_libos2; }; +struct nvkm_rm_chan_alloc_args { + u32 nv2080_engine_type; + u8 runq; + bool priv; + int chid; + u64 inst_addr; + u64 userd_addr; + u64 mthdbuf_addr; + struct nvkm_vmm *vmm; + u64 gpfifo_offset; + u32 gpfifo_length; +}; + struct nvkm_rm_api { const struct nvkm_rm_api_gsp { int (*libos_init)(struct nvkm_gsp *); @@ -113,9 +126,7 @@ struct nvkm_rm_api { int (*rc_triggered)(void *priv, u32 fn, void *repv, u32 repc); struct { int (*alloc)(struct nvkm_gsp_device *, u32 handle, - u32 nv2080_engine_type, u8 runq, bool priv, int chid, - u64 inst_addr, u64 userd_addr, u64 mthdbuf_addr, - struct nvkm_vmm *, u64 gpfifo_offset, u32 gpfifo_length, + const struct nvkm_rm_chan_alloc_args *chan_args, struct nvkm_gsp_object *); } chan; } *fifo; -- 2.55.0
