On Fri, 26 Jul 2024 14:38:22 +1000 Ben Skeggs <bskeggs@xxxxxxxxxx> wrote: Can you elaborate a little bit about the plan for nouveau_cli and nouveau_drm? Like at what level of the function takes nouveau_cli and nouveau_drm. I understand their previous positions, but after the re-factors, their positions seem a little bit overlapped with each other to me. > Both of these are stored in nouveau_cli already, and also allows the > removal of some void casts. > > Signed-off-by: Ben Skeggs <bskeggs@xxxxxxxxxx> > --- > drivers/gpu/drm/nouveau/dispnv04/crtc.c | 2 +- > drivers/gpu/drm/nouveau/nouveau_abi16.c | 2 +- > drivers/gpu/drm/nouveau/nouveau_bo.c | 2 +- > drivers/gpu/drm/nouveau/nouveau_chan.c | 21 +++++++++++---------- > drivers/gpu/drm/nouveau/nouveau_chan.h | 3 ++- > drivers/gpu/drm/nouveau/nouveau_drm.c | 4 ++-- > 6 files changed, 18 insertions(+), 16 deletions(-) > > diff --git a/drivers/gpu/drm/nouveau/dispnv04/crtc.c > b/drivers/gpu/drm/nouveau/dispnv04/crtc.c index > 98736f6eab16..2ac5b6b904db 100644 --- > a/drivers/gpu/drm/nouveau/dispnv04/crtc.c +++ > b/drivers/gpu/drm/nouveau/dispnv04/crtc.c @@ -1172,7 +1172,7 @@ > nv04_crtc_page_flip(struct drm_crtc *crtc, struct drm_framebuffer > *fb, chan = drm->channel; if (!chan) > return -ENODEV; > - cli = (void *)chan->user.client; > + cli = chan->cli; > push = chan->chan.push; > > s = kzalloc(sizeof(*s), GFP_KERNEL); > diff --git a/drivers/gpu/drm/nouveau/nouveau_abi16.c > b/drivers/gpu/drm/nouveau/nouveau_abi16.c index > 768912cc5d8a..2a0617e5fe2a 100644 --- > a/drivers/gpu/drm/nouveau/nouveau_abi16.c +++ > b/drivers/gpu/drm/nouveau/nouveau_abi16.c @@ -405,7 +405,7 @@ > nouveau_abi16_ioctl_channel_alloc(ABI16_IOCTL_ARGS) > list_add(&chan->head, &abi16->channels); > /* create channel object and initialise dma and fence > management */ > - ret = nouveau_channel_new(drm, device, false, runm, > init->fb_ctxdma_handle, > + ret = nouveau_channel_new(cli, false, runm, > init->fb_ctxdma_handle, init->tt_ctxdma_handle, &chan->chan); > if (ret) > goto done; > diff --git a/drivers/gpu/drm/nouveau/nouveau_bo.c > b/drivers/gpu/drm/nouveau/nouveau_bo.c index > 6631d85ea749..745b7d7503f7 100644 --- > a/drivers/gpu/drm/nouveau/nouveau_bo.c +++ > b/drivers/gpu/drm/nouveau/nouveau_bo.c @@ -859,7 +859,7 @@ > nouveau_bo_move_m2mf(struct ttm_buffer_object *bo, int evict, { > struct nouveau_drm *drm = nouveau_bdev(bo->bdev); > struct nouveau_channel *chan = drm->ttm.chan; > - struct nouveau_cli *cli = (void *)chan->user.client; > + struct nouveau_cli *cli = chan->cli; > struct nouveau_fence *fence; > int ret; > > diff --git a/drivers/gpu/drm/nouveau/nouveau_chan.c > b/drivers/gpu/drm/nouveau/nouveau_chan.c index > 16e0a87e030a..e18a80fda2ca 100644 --- > a/drivers/gpu/drm/nouveau/nouveau_chan.c +++ > b/drivers/gpu/drm/nouveau/nouveau_chan.c @@ -52,7 +52,7 @@ static int > nouveau_channel_killed(struct nvif_event *event, void *repv, u32 > repc) { > struct nouveau_channel *chan = container_of(event, > typeof(*chan), kill); > - struct nouveau_cli *cli = (void *)chan->user.client; > + struct nouveau_cli *cli = chan->cli; > > NV_PRINTK(warn, cli, "channel %d killed!\n", chan->chid); > > @@ -66,7 +66,7 @@ int > nouveau_channel_idle(struct nouveau_channel *chan) > { > if (likely(chan && chan->fence && > !atomic_read(&chan->killed))) { > - struct nouveau_cli *cli = (void *)chan->user.client; > + struct nouveau_cli *cli = chan->cli; > struct nouveau_fence *fence = NULL; > int ret; > > @@ -142,10 +142,11 @@ nouveau_channel_wait(struct nvif_push *push, > u32 size) } > > static int > -nouveau_channel_prep(struct nouveau_drm *drm, struct nvif_device > *device, +nouveau_channel_prep(struct nouveau_cli *cli, > u32 size, struct nouveau_channel **pchan) > { > - struct nouveau_cli *cli = (void *)device->object.client; > + struct nouveau_drm *drm = cli->drm; > + struct nvif_device *device = &cli->device; > struct nv_dma_v0 args = {}; > struct nouveau_channel *chan; > u32 target; > @@ -155,6 +156,7 @@ nouveau_channel_prep(struct nouveau_drm *drm, > struct nvif_device *device, if (!chan) > return -ENOMEM; > > + chan->cli = cli; > chan->device = device; > chan->drm = drm; > chan->vmm = nouveau_cli_vmm(cli); > @@ -253,7 +255,7 @@ nouveau_channel_prep(struct nouveau_drm *drm, > struct nvif_device *device, } > > static int > -nouveau_channel_ctor(struct nouveau_drm *drm, struct nvif_device > *device, bool priv, u64 runm, +nouveau_channel_ctor(struct > nouveau_cli *cli, bool priv, u64 runm, struct nouveau_channel **pchan) > { > const struct nvif_mclass hosts[] = { > @@ -278,7 +280,7 @@ nouveau_channel_ctor(struct nouveau_drm *drm, > struct nvif_device *device, bool p struct nvif_chan_v0 chan; > char name[TASK_COMM_LEN+16]; > } args; > - struct nouveau_cli *cli = (void *)device->object.client; > + struct nvif_device *device = &cli->device; > struct nouveau_channel *chan; > const u64 plength = 0x10000; > const u64 ioffset = plength; > @@ -297,7 +299,7 @@ nouveau_channel_ctor(struct nouveau_drm *drm, > struct nvif_device *device, bool p size = ioffset + ilength; > > /* allocate dma push buffer */ > - ret = nouveau_channel_prep(drm, device, size, &chan); > + ret = nouveau_channel_prep(cli, size, &chan); > *pchan = chan; > if (ret) > return ret; > @@ -492,13 +494,12 @@ nouveau_channel_init(struct nouveau_channel > *chan, u32 vram, u32 gart) } > > int > -nouveau_channel_new(struct nouveau_drm *drm, struct nvif_device > *device, +nouveau_channel_new(struct nouveau_cli *cli, > bool priv, u64 runm, u32 vram, u32 gart, struct > nouveau_channel **pchan) { > - struct nouveau_cli *cli = (void *)device->object.client; > int ret; > > - ret = nouveau_channel_ctor(drm, device, priv, runm, pchan); > + ret = nouveau_channel_ctor(cli, priv, runm, pchan); > if (ret) { > NV_PRINTK(dbg, cli, "channel create, %d\n", ret); > return ret; > diff --git a/drivers/gpu/drm/nouveau/nouveau_chan.h > b/drivers/gpu/drm/nouveau/nouveau_chan.h index > 5de2ef4e98c2..260febd634ee 100644 --- > a/drivers/gpu/drm/nouveau/nouveau_chan.h +++ > b/drivers/gpu/drm/nouveau/nouveau_chan.h @@ -12,6 +12,7 @@ struct > nouveau_channel { struct nvif_push *push; > } chan; > > + struct nouveau_cli *cli; > struct nvif_device *device; > struct nouveau_drm *drm; > struct nouveau_vmm *vmm; > @@ -62,7 +63,7 @@ struct nouveau_channel { > int nouveau_channels_init(struct nouveau_drm *); > void nouveau_channels_fini(struct nouveau_drm *); > > -int nouveau_channel_new(struct nouveau_drm *, struct nvif_device *, > bool priv, u64 runm, +int nouveau_channel_new(struct nouveau_cli *, > bool priv, u64 runm, u32 vram, u32 gart, struct nouveau_channel **); > void nouveau_channel_del(struct nouveau_channel **); > int nouveau_channel_idle(struct nouveau_channel *); > diff --git a/drivers/gpu/drm/nouveau/nouveau_drm.c > b/drivers/gpu/drm/nouveau/nouveau_drm.c index > 6b33d1d0a4eb..8b9c463d21ac 100644 --- > a/drivers/gpu/drm/nouveau/nouveau_drm.c +++ > b/drivers/gpu/drm/nouveau/nouveau_drm.c @@ -335,7 +335,7 @@ > nouveau_accel_ce_init(struct nouveau_drm *drm) return; > } > > - ret = nouveau_channel_new(drm, device, false, runm, NvDmaFB, > NvDmaTT, &drm->cechan); > + ret = nouveau_channel_new(&drm->client, false, runm, > NvDmaFB, NvDmaTT, &drm->cechan); if (ret) > NV_ERROR(drm, "failed to create ce channel, %d\n", > ret); } > @@ -363,7 +363,7 @@ nouveau_accel_gr_init(struct nouveau_drm *drm) > return; > } > > - ret = nouveau_channel_new(drm, device, false, runm, NvDmaFB, > NvDmaTT, &drm->channel); > + ret = nouveau_channel_new(&drm->client, false, runm, > NvDmaFB, NvDmaTT, &drm->channel); if (ret) { > NV_ERROR(drm, "failed to create kernel channel, > %d\n", ret); nouveau_accel_gr_fini(drm);