[PATCH v3 31/37] drm/nouveau: pass cli to nouveau_channel_new() instead of drm+device

Zhi Wang zhiw at nvidia.com
Wed Jul 31 18:07:18 UTC 2024


On Fri, 26 Jul 2024 14:38:22 +1000
Ben Skeggs <bskeggs at nvidia.com> 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 at nvidia.com>
> ---
>  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);



More information about the Nouveau mailing list