Re: [PATCH v2 19/19] gpu: nova-core: firmware: parse `FalconUCodeDescV2` via `zerocopy`
"Gary Guo" <[email protected]>
| Newsgroups | org.kernel.vger.linux-kbuild,org.kernel.vger.rust-for-linux |
|---|---|
| Message-ID | <[email protected]> |
On Mon Jun 8, 2026 at 3:14 PM BST, Miguel Ojeda wrote: > Now that we have `zerocopy` support, we can avoid some `unsafe` code. > > For instance, for `FalconUCodeDescV2`, we can replace the `unsafe impl > FromBytes` by safely deriving `zerocopy`'s `FromBytes` and then calling > `read_from_prefix`. > > Reviewed-by: Alexandre Courbot <[email protected]> > Acked-by: Danilo Krummrich <[email protected]> > Signed-off-by: Miguel Ojeda <[email protected]> > --- > drivers/gpu/nova-core/firmware.rs | 5 +---- > drivers/gpu/nova-core/vbios.rs | 6 ++++-- > 2 files changed, 5 insertions(+), 6 deletions(-) > > diff --git a/drivers/gpu/nova-core/firmware.rs b/drivers/gpu/nova-core/firmware.rs > index 6c2ab69cb605..ad37994ac15a 100644 > --- a/drivers/gpu/nova-core/firmware.rs > +++ b/drivers/gpu/nova-core/firmware.rs > @@ -48,7 +48,7 @@ fn request_firmware( > > /// Structure used to describe some firmwares, notably FWSEC-FRTS. > #[repr(C)] > -#[derive(Debug, Clone)] > +#[derive(Debug, Clone, FromBytes)] > pub(crate) struct FalconUCodeDescV2 { > /// Header defined by 'NV_BIT_FALCON_UCODE_DESC_HEADER_VDESC*' in OpenRM. > hdr: u32, > @@ -84,9 +84,6 @@ pub(crate) struct FalconUCodeDescV2 { > pub(crate) alt_dmem_load_size: u32, > } > > -// SAFETY: all bit patterns are valid for this type, and it doesn't use interior mutability. > -unsafe impl FromBytes for FalconUCodeDescV2 {} > - > /// Structure used to describe some firmwares, notably FWSEC-FRTS. > #[repr(C)] > #[derive(Debug, Clone)] > diff --git a/drivers/gpu/nova-core/vbios.rs b/drivers/gpu/nova-core/vbios.rs > index ebda28e596c5..8b7d17a24660 100644 > --- a/drivers/gpu/nova-core/vbios.rs > +++ b/drivers/gpu/nova-core/vbios.rs > @@ -16,6 +16,8 @@ > transmute::FromBytes, > }; > > +use zerocopy::FromBytes as _; Is this still needed given the prelude additional? Best, Gary > + > use crate::{ > driver::Bar0, > firmware::{ > @@ -1011,8 +1013,8 @@ pub(crate) fn header(&self) -> Result<FalconUCodeDesc> { > let data = self.base.data.get(falcon_ucode_offset..).ok_or(EINVAL)?; > match ver { > 2 => { > - let v2 = FalconUCodeDescV2::from_bytes_copy_prefix(data) > - .ok_or(EINVAL)? > + let v2 = FalconUCodeDescV2::read_from_prefix(data) > + .map_err(|_| EINVAL)? > .0; > Ok(FalconUCodeDesc::V2(v2)) > }