[PATCH 4/6] nouveau/gsp: refactor the chan allocation arguments into a struct
Dave Airlie <[email protected]> Wed, 29 Jul 2026 14:15:28 +1000
| Newsgroups | org.freedesktop.lists.nouveau,org.freedesktop.lists.dri-devel |
|---|---|
| Message-ID | <[email protected]> |
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/drive= rs/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 =20 static int -r535_chan_alloc(struct nvkm_gsp_device *device, u32 handle, u32 nv2080_eng= ine_type, u8 runq, -=09=09bool priv, int chid, u64 inst_addr, u64 userd_addr, u64 mthdbuf_addr= , -=09=09struct nvkm_vmm *vmm, u64 gpfifo_offset, u32 gpfifo_length, +r535_chan_alloc(struct nvkm_gsp_device *device, u32 handle, +=09=09const struct nvkm_rm_chan_alloc_args *chan_args, =09=09struct nvkm_gsp_object *chan) { =09struct nvkm_gsp *gsp =3D device->object.client->gsp; =09struct nvkm_fifo *fifo =3D gsp->subdev.device->fifo; -=09const int userd_p =3D chid / CHID_PER_USERD; -=09const int userd_i =3D chid % CHID_PER_USERD; +=09const int userd_p =3D chan_args->chid / CHID_PER_USERD; +=09const int userd_i =3D chan_args->chid % CHID_PER_USERD; =09NV_CHANNELGPFIFO_ALLOCATION_PARAMETERS *args; =20 =09args =3D nvkm_gsp_rm_alloc_get(&device->object, handle, @@ -88,14 +87,14 @@ r535_chan_alloc(struct nvkm_gsp_device *device, u32 han= dle, u32 nv2080_engine_ty =09if (WARN_ON(IS_ERR(args))) =09=09return PTR_ERR(args); =20 -=09args->gpFifoOffset =3D gpfifo_offset; -=09args->gpFifoEntries =3D gpfifo_length / 8; +=09args->gpFifoOffset =3D chan_args->gpfifo_offset; +=09args->gpFifoEntries =3D chan_args->gpfifo_length / 8; =20 =09args->flags =3D NVDEF(NVOS04, FLAGS, CHANNEL_TYPE, PHYSICAL); =09args->flags |=3D NVDEF(NVOS04, FLAGS, VPR, FALSE); =09args->flags |=3D NVDEF(NVOS04, FLAGS, CHANNEL_SKIP_MAP_REFCOUNTING, FAL= SE); -=09args->flags |=3D NVVAL(NVOS04, FLAGS, GROUP_CHANNEL_RUNQUEUE, runq); -=09if (!priv) +=09args->flags |=3D NVVAL(NVOS04, FLAGS, GROUP_CHANNEL_RUNQUEUE, chan_args= ->runq); +=09if (!chan_args->priv) =09=09args->flags |=3D NVDEF(NVOS04, FLAGS, PRIVILEGED_CHANNEL, FALSE); =09else =09=09args->flags |=3D NVDEF(NVOS04, FLAGS, PRIVILEGED_CHANNEL, TRUE); @@ -117,30 +116,30 @@ r535_chan_alloc(struct nvkm_gsp_device *device, u32 h= andle, u32 nv2080_engine_ty =09args->flags |=3D NVDEF(NVOS04, FLAGS, MAP_CHANNEL, FALSE); =09args->flags |=3D NVDEF(NVOS04, FLAGS, SKIP_CTXBUFFER_ALLOC, FALSE); =20 -=09args->hVASpace =3D vmm->rm.object.handle; -=09args->engineType =3D nv2080_engine_type; +=09args->hVASpace =3D chan_args->vmm->rm.object.handle; +=09args->engineType =3D chan_args->nv2080_engine_type; =20 -=09args->instanceMem.base =3D inst_addr; +=09args->instanceMem.base =3D chan_args->inst_addr; =09args->instanceMem.size =3D fifo->func->chan.func->inst->size; =09args->instanceMem.addressSpace =3D 2; =09args->instanceMem.cacheAttrib =3D 1; =20 -=09args->userdMem.base =3D userd_addr; +=09args->userdMem.base =3D chan_args->userd_addr; =09args->userdMem.size =3D fifo->func->chan.func->userd->size; =09args->userdMem.addressSpace =3D 2; =09args->userdMem.cacheAttrib =3D 1; =20 -=09args->ramfcMem.base =3D inst_addr; +=09args->ramfcMem.base =3D chan_args->inst_addr; =09args->ramfcMem.size =3D 0x200; =09args->ramfcMem.addressSpace =3D 2; =09args->ramfcMem.cacheAttrib =3D 1; =20 -=09args->mthdbufMem.base =3D mthdbuf_addr; +=09args->mthdbufMem.base =3D chan_args->mthdbuf_addr; =09args->mthdbufMem.size =3D fifo->rm.mthdbuf_size; =09args->mthdbufMem.addressSpace =3D 1; =09args->mthdbufMem.cacheAttrib =3D 0; =20 -=09if (!priv) +=09if (!chan_args->priv) =09=09args->internalFlags =3D NVDEF(NV_KERNELCHANNEL, ALLOC_INTERNALFLAGS,= PRIVILEGE, USER); =09else =09=09args->internalFlags =3D NVDEF(NV_KERNELCHANNEL, ALLOC_INTERNALFLAGS,= PRIVILEGE, ADMIN); @@ -180,11 +179,20 @@ r535_chan_ramfc_write(struct nvkm_chan *chan, u64 off= set, u64 length, u32 devm, =09if (!chan->rm.mthdbuf.ptr) =09=09return -ENOMEM; =20 +=09struct nvkm_rm_chan_alloc_args chan_args =3D { +=09=09.nv2080_engine_type =3D eT, +=09=09.runq =3D chan->runq, +=09=09.priv =3D priv, +=09=09.chid =3D chan->id, +=09=09.inst_addr =3D chan->inst->addr, +=09=09.userd_addr =3D nvkm_memory_addr(chan->userd.mem) + chan->userd.base= , +=09=09.mthdbuf_addr =3D chan->rm.mthdbuf.addr, +=09=09.vmm =3D chan->vmm, +=09=09.gpfifo_offset =3D offset, +=09=09.gpfifo_length =3D length +=09}; =09ret =3D rmapi->fifo->chan.alloc(&chan->vmm->rm.device, NVKM_RM_CHAN(cha= n->id), -=09=09=09=09 eT, chan->runq, priv, chan->id, chan->inst->addr, -=09=09=09=09 nvkm_memory_addr(chan->userd.mem) + chan->userd.base, -=09=09=09=09 chan->rm.mthdbuf.addr, chan->vmm, offset, length, -=09=09=09=09 &chan->rm.object); +=09=09=09=09 &chan_args, &chan->rm.object); =09if (ret) =09=09return ret; =20 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) =09if (ret) =09=09goto done; =20 +=09struct nvkm_rm_chan_alloc_args chan_args =3D { +=09=09.nv2080_engine_type =3D 1, +=09=09.runq =3D 0, +=09=09.priv =3D true, +=09=09.chid =3D rm->api->fifo->rsvd_chids, +=09=09.inst_addr =3D nvkm_memory_addr(golden.inst), +=09=09.userd_addr =3D nvkm_memory_addr(golden.inst) + 0x1000, +=09=09.mthdbuf_addr =3D nvkm_memory_addr(golden.inst) + 0x2000, +=09=09.vmm =3D golden.vmm, +=09=09.gpfifo_offset =3D 0, +=09=09.gpfifo_length =3D 0x1000 +=09}; =09ret =3D rm->api->fifo->chan.alloc(&golden.vmm->rm.device, NVKM_RM_CHAN(= 0), -=09=09=09=09=091, 0, true, rm->api->fifo->rsvd_chids, -=09=09=09=09=09nvkm_memory_addr(golden.inst), -=09=09=09=09=09nvkm_memory_addr(golden.inst) + 0x1000, -=09=09=09=09=09nvkm_memory_addr(golden.inst) + 0x2000, -=09=09=09=09=09golden.vmm, 0, 0x1000, &golden.chan); +=09=09=09=09=09&chan_args, &golden.chan); =09if (ret) =09=09goto done; =20 diff --git a/drivers/gpu/drm/nouveau/nvkm/subdev/gsp/rm/r570/fifo.c b/drive= rs/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 =20 static int -r570_chan_alloc(struct nvkm_gsp_device *device, u32 handle, u32 nv2080_eng= ine_type, u8 runq, -=09 bool priv, int chid, u64 inst_addr, u64 userd_addr, u64 mthdbuf= _addr, -=09=09struct nvkm_vmm *vmm, u64 gpfifo_offset, u32 gpfifo_length, +r570_chan_alloc(struct nvkm_gsp_device *device, u32 handle, +=09=09const struct nvkm_rm_chan_alloc_args *chan_args, =09=09struct nvkm_gsp_object *chan) { =09struct nvkm_gsp *gsp =3D device->object.client->gsp; =09struct nvkm_fifo *fifo =3D gsp->subdev.device->fifo; -=09const int userd_p =3D chid / CHID_PER_USERD; -=09const int userd_i =3D chid % CHID_PER_USERD; +=09const int userd_p =3D chan_args->chid / CHID_PER_USERD; +=09const int userd_i =3D chan_args->chid % CHID_PER_USERD; =09NV_CHANNELGPFIFO_ALLOCATION_PARAMETERS *args; =20 =09args =3D nvkm_gsp_rm_alloc_get(&device->object, handle, @@ -33,14 +32,14 @@ r570_chan_alloc(struct nvkm_gsp_device *device, u32 han= dle, u32 nv2080_engine_ty =09if (WARN_ON(IS_ERR(args))) =09=09return PTR_ERR(args); =20 -=09args->gpFifoOffset =3D gpfifo_offset; -=09args->gpFifoEntries =3D gpfifo_length / 8; +=09args->gpFifoOffset =3D chan_args->gpfifo_offset; +=09args->gpFifoEntries =3D chan_args->gpfifo_length / 8; =20 =09args->flags =3D NVDEF(NVOS04, FLAGS, CHANNEL_TYPE, PHYSICAL); =09args->flags |=3D NVDEF(NVOS04, FLAGS, VPR, FALSE); =09args->flags |=3D NVDEF(NVOS04, FLAGS, CHANNEL_SKIP_MAP_REFCOUNTING, FAL= SE); -=09args->flags |=3D NVVAL(NVOS04, FLAGS, GROUP_CHANNEL_RUNQUEUE, runq); -=09if (!priv) +=09args->flags |=3D NVVAL(NVOS04, FLAGS, GROUP_CHANNEL_RUNQUEUE, chan_args= ->runq); +=09if (!chan_args->priv) =09=09args->flags |=3D NVDEF(NVOS04, FLAGS, PRIVILEGED_CHANNEL, FALSE); =09else =09=09args->flags |=3D NVDEF(NVOS04, FLAGS, PRIVILEGED_CHANNEL, TRUE); @@ -62,30 +61,30 @@ r570_chan_alloc(struct nvkm_gsp_device *device, u32 han= dle, u32 nv2080_engine_ty =09args->flags |=3D NVDEF(NVOS04, FLAGS, MAP_CHANNEL, FALSE); =09args->flags |=3D NVDEF(NVOS04, FLAGS, SKIP_CTXBUFFER_ALLOC, FALSE); =20 -=09args->hVASpace =3D vmm->rm.object.handle; -=09args->engineType =3D nv2080_engine_type; +=09args->hVASpace =3D chan_args->vmm->rm.object.handle; +=09args->engineType =3D chan_args->nv2080_engine_type; =20 -=09args->instanceMem.base =3D inst_addr; +=09args->instanceMem.base =3D chan_args->inst_addr; =09args->instanceMem.size =3D fifo->func->chan.func->inst->size; =09args->instanceMem.addressSpace =3D 2; =09args->instanceMem.cacheAttrib =3D 1; =20 -=09args->userdMem.base =3D userd_addr; +=09args->userdMem.base =3D chan_args->userd_addr; =09args->userdMem.size =3D fifo->func->chan.func->userd->size; =09args->userdMem.addressSpace =3D 2; =09args->userdMem.cacheAttrib =3D 1; =20 -=09args->ramfcMem.base =3D inst_addr; +=09args->ramfcMem.base =3D chan_args->inst_addr; =09args->ramfcMem.size =3D 0x200; =09args->ramfcMem.addressSpace =3D 2; =09args->ramfcMem.cacheAttrib =3D 1; =20 -=09args->mthdbufMem.base =3D mthdbuf_addr; +=09args->mthdbufMem.base =3D chan_args->mthdbuf_addr; =09args->mthdbufMem.size =3D fifo->rm.mthdbuf_size; =09args->mthdbufMem.addressSpace =3D 1; =09args->mthdbufMem.cacheAttrib =3D 0; =20 -=09if (!priv) +=09if (!chan_args->priv) =09=09args->internalFlags =3D NVDEF(NV_KERNELCHANNEL, ALLOC_INTERNALFLAGS,= PRIVILEGE, USER); =09else =09=09args->internalFlags =3D 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) =09if (ret) =09=09goto done; =20 +=09struct nvkm_rm_chan_alloc_args chan_args =3D { +=09=09.nv2080_engine_type =3D NV2080_ENGINE_TYPE_GR0, +=09=09.runq =3D 0, +=09=09.priv =3D false, +=09=09.chid =3D gr->scrubber.chid, +=09=09.inst_addr =3D nvkm_memory_addr(gr->scrubber.inst), +=09=09.userd_addr =3D nvkm_memory_addr(gr->scrubber.inst) + 0x1000, +=09=09.mthdbuf_addr =3D nvkm_memory_addr(gr->scrubber.inst) + 0x2000, +=09=09.vmm =3D gr->scrubber.vmm, +=09=09.gpfifo_offset =3D 0, +=09=09.gpfifo_length =3D 0x1000, +=09}; =09ret =3D rm->api->fifo->chan.alloc(&gr->scrubber.vmm->rm.device, KGRAPHI= CS_SCRUBBER_HANDLE_CHANNEL, -=09=09=09=09=09NV2080_ENGINE_TYPE_GR0, 0, false, gr->scrubber.chid, -=09=09=09=09=09nvkm_memory_addr(gr->scrubber.inst), -=09=09=09=09=09nvkm_memory_addr(gr->scrubber.inst) + 0x1000, -=09=09=09=09=09nvkm_memory_addr(gr->scrubber.inst) + 0x2000, -=09=09=09=09=09gr->scrubber.vmm, 0, 0x1000, &gr->scrubber.chan); +=09=09=09=09=09&chan_args, &gr->scrubber.chan); =09if (ret) =09=09goto done; =20 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 { =09bool is_libos2; }; =20 +struct nvkm_rm_chan_alloc_args { +=09u32 nv2080_engine_type; +=09u8 runq; +=09bool priv; +=09int chid; +=09u64 inst_addr; +=09u64 userd_addr; +=09u64 mthdbuf_addr; +=09struct nvkm_vmm *vmm; +=09u64 gpfifo_offset; +=09u32 gpfifo_length; +}; + struct nvkm_rm_api { =09const struct nvkm_rm_api_gsp { =09=09int (*libos_init)(struct nvkm_gsp *); @@ -113,9 +126,7 @@ struct nvkm_rm_api { =09=09int (*rc_triggered)(void *priv, u32 fn, void *repv, u32 repc); =09=09struct { =09=09=09int (*alloc)(struct nvkm_gsp_device *, u32 handle, -=09=09=09=09 u32 nv2080_engine_type, u8 runq, bool priv, int chid, -=09=09=09=09 u64 inst_addr, u64 userd_addr, u64 mthdbuf_addr, -=09=09=09=09 struct nvkm_vmm *, u64 gpfifo_offset, u32 gpfifo_length, +=09=09=09=09 const struct nvkm_rm_chan_alloc_args *chan_args, =09=09=09=09 struct nvkm_gsp_object *); =09=09} chan; =09} *fifo; --=20 2.55.0