[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <aAqYrkqshxHZtz3h@pollux>
Date: Thu, 24 Apr 2025 22:01:50 +0200
From: Danilo Krummrich <dakr@...nel.org>
To: Joel Fernandes <joelagnelf@...dia.com>
Cc: Alexandre Courbot <acourbot@...dia.com>,
Miguel Ojeda <ojeda@...nel.org>,
Alex Gaynor <alex.gaynor@...il.com>,
Boqun Feng <boqun.feng@...il.com>, Gary Guo <gary@...yguo.net>,
Björn Roy Baron <bjorn3_gh@...tonmail.com>,
Benno Lossin <benno.lossin@...ton.me>,
Andreas Hindborg <a.hindborg@...nel.org>,
Alice Ryhl <aliceryhl@...gle.com>, Trevor Gross <tmgross@...ch.edu>,
David Airlie <airlied@...il.com>, Simona Vetter <simona@...ll.ch>,
Maarten Lankhorst <maarten.lankhorst@...ux.intel.com>,
Maxime Ripard <mripard@...nel.org>,
Thomas Zimmermann <tzimmermann@...e.de>,
Jonathan Corbet <corbet@....net>,
John Hubbard <jhubbard@...dia.com>, Ben Skeggs <bskeggs@...dia.com>,
Timur Tabi <ttabi@...dia.com>, Alistair Popple <apopple@...dia.com>,
linux-kernel@...r.kernel.org, rust-for-linux@...r.kernel.org,
nouveau@...ts.freedesktop.org, dri-devel@...ts.freedesktop.org
Subject: Re: [PATCH 13/16] gpu: nova-core: Add support for VBIOS ucode
extraction for boot
On Thu, Apr 24, 2025 at 03:19:00PM -0400, Joel Fernandes wrote:
> On Wed, Apr 23, 2025 at 05:02:58PM +0200, Danilo Krummrich wrote:
>
> [..]
>
> > > >> + data.extend_with(len, 0, GFP_KERNEL)?;
> > > >> + with_bar!(?bar0, |bar0_ref| {
> > > >> + let dst = &mut data[current_len..current_len + len];
> > > >> + for (idx, chunk) in dst
> > > >> + .chunks_exact_mut(core::mem::size_of::<u32>())
> > > >> + .enumerate()
> > > >> + {
> > > >> + let addr = start + (idx * core::mem::size_of::<u32>());
> > > >> + // Convert the u32 to a 4 byte array. We use the .to_ne_bytes()
> > > >> + // method out of convenience to convert the 32-bit integer as it
> > > >> + // is in memory into a byte array without any endianness
> > > >> + // conversion or byte-swapping.
> > > >> + chunk.copy_from_slice(&bar0_ref.try_read32(addr)?.to_ne_bytes());
> > > >> + }
> > > >> + Ok(())
> > > >> + })?;
> > > >> +
> > > >> + Ok(())
> > > >> + }
> > > ..actually initially was:
> > >
> > > + with_bar!(self.bar0, |bar0| {
> > > + // Get current length
> > > + let current_len = self.data.len();
> > > +
> > > + // Read ROM data bytes push directly to vector
> > > + for i in 0..bytes as usize {
> > > + // Read byte from the VBIOS ROM and push it to the data vector
> > > + let rom_addr = ROM_OFFSET + current_len + i;
> > > + let byte = bar0.try_readb(rom_addr)?;
> > > + self.data.push(byte, GFP_KERNEL)?;
> > >
> > > Where this bit could result in a lot of allocation.
> > >
> > > There was an unsafe() way of not having to do this but we settled with
> > > extends_with().
> > >
> > > Thoughts?
> >
> > If I understand you correctly, you just want to make sure that subsequent push()
> > calls don't re-allocate? If so, you can just use reserve() [1] and keep the
> > subsequent push() calls.
> >
> > [1] https://rust.docs.kernel.org/kernel/alloc/kvec/struct.Vec.html#method.reserve
>
>
>
> Ok that does turn out to be cleaner! I replaced it with the following and it works.
>
> Let me know if it looks good now? Here's a preview:
>
> - data.extend_with(len, 0, GFP_KERNEL)?;
> + data.reserve(len, GFP_KERNEL)?;
> +
> with_bar_res!(bar0, |bar0_ref| {
> - let dst = &mut data[current_len..current_len + len];
> - for (idx, chunk) in dst
> - .chunks_exact_mut(core::mem::size_of::<u32>())
> - .enumerate()
> - {
> - let addr = start + (idx * core::mem::size_of::<u32>());
> - // Convert the u32 to a 4 byte array. We use the .to_ne_bytes()
> - // method out of convenience to convert the 32-bit integer as it
> - // is in memory into a byte array without any endianness
> - // conversion or byte-swapping.
> - chunk.copy_from_slice(&bar0_ref.try_read32(addr)?.to_ne_bytes());
> + // Read ROM data bytes and push directly to vector
> + for i in 0..len {
> + // Read 32-bit word from the VBIOS ROM
> + let rom_addr = start + i * core::mem::size_of::<u32>();
> + let word = bar0_ref.try_read32(rom_addr)?;
> +
> + // Convert the u32 to a 4 byte array and push each byte
> + word.to_ne_bytes().iter().try_for_each(|&b| data.push(b, GFP_KERNEL))?;
> }
Looks good to me, thanks!
Powered by blists - more mailing lists