lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<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

Powered by Openwall GNU/*/Linux Powered by OpenVZ