[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-Id: <20260109-nouveau-gpfifo-increase-v1-1-ed0be9822878@mary.zone>
Date: Fri, 09 Jan 2026 18:30:10 +0100
From: Mary Guillemard <mary@...y.zone>
To: Lyude Paul <lyude@...hat.com>, Danilo Krummrich <dakr@...nel.org>,
Maarten Lankhorst <maarten.lankhorst@...ux.intel.com>,
Maxime Ripard <mripard@...nel.org>, Thomas Zimmermann <tzimmermann@...e.de>,
David Airlie <airlied@...il.com>, Simona Vetter <simona@...ll.ch>
Cc: dri-devel@...ts.freedesktop.org, nouveau@...ts.freedesktop.org,
linux-kernel@...r.kernel.org, Mary Guillemard <mary@...y.zone>
Subject: [PATCH 1/3] drm/nouveau/chan: Store channel allocation details in
nouveau_channel
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@...y.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
Powered by blists - more mailing lists