[PATCH 1/3] drm/nouveau/chan: Store channel allocation details in nouveau_channel

Mary Guillemard posted 3 patches 1 month ago
[PATCH 1/3] drm/nouveau/chan: Store channel allocation details in nouveau_channel
Posted by Mary Guillemard 1 month ago
Previously, nouveau_channel_init was hardcoding offsets and length
for the internal pushbuf and GPFIFO entries details.

As we are going to extend the size of the GPFIFO ring, we now store
those information in nouveau_channel_ctor and use those when creating
related NVIF objects for channels.

Signed-off-by: Mary Guillemard <mary@mary.zone>
---
 drivers/gpu/drm/nouveau/nouveau_chan.c | 20 ++++++++++++--------
 drivers/gpu/drm/nouveau/nouveau_chan.h |  3 +++
 2 files changed, 15 insertions(+), 8 deletions(-)

diff --git a/drivers/gpu/drm/nouveau/nouveau_chan.c b/drivers/gpu/drm/nouveau/nouveau_chan.c
index b1e92b1f7a26..b646212a34b3 100644
--- a/drivers/gpu/drm/nouveau/nouveau_chan.c
+++ b/drivers/gpu/drm/nouveau/nouveau_chan.c
@@ -293,6 +293,10 @@ nouveau_channel_ctor(struct nouveau_cli *cli, bool priv, u64 runm,
 	if (ret)
 		return ret;
 
+	chan->push.plength = plength;
+	chan->push.ioffset = ioffset;
+	chan->push.ilength = ilength;
+
 	/* create channel object */
 	args->version = 0;
 	args->namelen = __member_size(args->name);
@@ -311,8 +315,8 @@ nouveau_channel_ctor(struct nouveau_cli *cli, bool priv, u64 runm,
 			args->ctxdma = nvif_handle(&chan->push.ctxdma);
 		else
 			args->ctxdma = 0;
-		args->offset = ioffset + chan->push.addr;
-		args->length = ilength;
+		args->offset = chan->push.addr + chan->push.ioffset;
+		args->length = chan->push.ilength;
 	}
 	args->huserd = 0;
 	args->ouserd = 0;
@@ -437,22 +441,22 @@ nouveau_channel_init(struct nouveau_channel *chan, u32 vram, u32 gart)
 	} else
 	if (chan->user.oclass < FERMI_CHANNEL_GPFIFO) {
 		ret = nvif_chan506f_ctor(&chan->chan, chan->userd->map.ptr,
-					 (u8*)chan->push.buffer->kmap.virtual + 0x10000, 0x2000,
-					 chan->push.buffer->kmap.virtual, chan->push.addr, 0x10000);
+					 (u8 *)chan->push.buffer->kmap.virtual + chan->push.ioffset, chan->push.ilength,
+					 chan->push.buffer->kmap.virtual, chan->push.addr, chan->push.plength);
 		if (ret)
 			return ret;
 	} else
 	if (chan->user.oclass < VOLTA_CHANNEL_GPFIFO_A) {
 		ret = nvif_chan906f_ctor(&chan->chan, chan->userd->map.ptr,
-					 (u8*)chan->push.buffer->kmap.virtual + 0x10000, 0x2000,
-					 chan->push.buffer->kmap.virtual, chan->push.addr, 0x10000,
+					 (u8 *)chan->push.buffer->kmap.virtual + chan->push.ioffset, chan->push.ilength,
+					 chan->push.buffer->kmap.virtual, chan->push.addr, chan->push.plength,
 					 chan->sema.bo->kmap.virtual, chan->sema.vma->addr);
 		if (ret)
 			return ret;
 	} else {
 		ret = nvif_chanc36f_ctor(&chan->chan, chan->userd->map.ptr,
-					 (u8*)chan->push.buffer->kmap.virtual + 0x10000, 0x2000,
-					 chan->push.buffer->kmap.virtual, chan->push.addr, 0x10000,
+					 (u8 *)chan->push.buffer->kmap.virtual + chan->push.ioffset, chan->push.ilength,
+					 chan->push.buffer->kmap.virtual, chan->push.addr, chan->push.plength,
 					 chan->sema.bo->kmap.virtual, chan->sema.vma->addr,
 					 &drm->client.device.user, chan->token);
 		if (ret)
diff --git a/drivers/gpu/drm/nouveau/nouveau_chan.h b/drivers/gpu/drm/nouveau/nouveau_chan.h
index bb34b0a6082d..9839de8da985 100644
--- a/drivers/gpu/drm/nouveau/nouveau_chan.h
+++ b/drivers/gpu/drm/nouveau/nouveau_chan.h
@@ -29,6 +29,9 @@ struct nouveau_channel {
 		struct nouveau_vma *vma;
 		struct nvif_object ctxdma;
 		u64 addr;
+		u64 plength;
+		u64 ioffset;
+		u64 ilength;
 	} push;
 
 	void *fence;

-- 
2.52.0