Re: [PATCH v2 3/5] drm/nova: use `zerocopy` in fwsec.rs

Alistair Popple <[email protected]>
Newsgroups dev.linux.lists.nova-gpu,org.freedesktop.lists.dri-devel,org.kernel.vger.rust-for-linux
Message-ID <[email protected]>
On 2026-07-02 at 22:03 +1000, Pedro Yudi Honda <[email protected]> wrote...
> From: Pedro Yudi Honda <[email protected]>
> 
> In firmware/fwsec.rs, replace the following `transmute` traits with
> their `zerocopy` equivalents:
> 
> - `transmute::FromBytes` -> `zerocopy::FromBytes`
> - `transmute::AsBytes` -> `zerocopy::IntoBytes`
> - add `zerocopy::KnownLayout` where necessary

Argh, ok. It makes more sense when there are more things in the list :-) That
said I'd also be ok without, but either is fine.

Reviewed-by: Alistair Popple <[email protected]>

> Update call sites accordingly.
> 
> Signed-off-by: Pedro Yudi Honda <[email protected]>
> ---
>  drivers/gpu/nova-core/firmware/fwsec.rs | 49 ++++++-------------------
>  1 file changed, 12 insertions(+), 37 deletions(-)
> 
> diff --git a/drivers/gpu/nova-core/firmware/fwsec.rs b/drivers/gpu/nova-core/firmware/fwsec.rs
> index 95e0dd77746b..1b75cdc02256 100644
> --- a/drivers/gpu/nova-core/firmware/fwsec.rs
> +++ b/drivers/gpu/nova-core/firmware/fwsec.rs
> @@ -19,11 +19,7 @@
>          self,
>          Device, //
>      },
> -    prelude::*,
> -    transmute::{
> -        AsBytes,
> -        FromBytes, //
> -    },
> +    prelude::*, //
>  };
>  
>  use crate::{
> @@ -49,26 +45,22 @@
>  const NVFW_FALCON_APPIF_ID_DMEMMAPPER: u32 = 0x4;
>  
>  #[repr(C)]
> -#[derive(Debug)]
> +#[derive(Debug, FromBytes)]
>  struct FalconAppifHdrV1 {
>      version: u8,
>      header_size: u8,
>      entry_size: u8,
>      entry_count: u8,
>  }
> -// SAFETY: Any byte sequence is valid for this struct.
> -unsafe impl FromBytes for FalconAppifHdrV1 {}
>  
>  #[repr(C, packed)]
> -#[derive(Debug)]
> +#[derive(Debug, FromBytes)]
>  struct FalconAppifV1 {
>      id: u32,
>      dmem_base: u32,
>  }
> -// SAFETY: Any byte sequence is valid for this struct.
> -unsafe impl FromBytes for FalconAppifV1 {}
>  
> -#[derive(Debug)]
> +#[derive(Debug, FromBytes, IntoBytes, zerocopy_derive::KnownLayout)]
>  #[repr(C, packed)]
>  struct FalconAppifDmemmapperV3 {
>      signature: u32,
> @@ -89,12 +81,8 @@ struct FalconAppifDmemmapperV3 {
>      ucode_cmd_mask1: u32,
>      multi_tgt_tbl: u32,
>  }
> -// SAFETY: Any byte sequence is valid for this struct.
> -unsafe impl FromBytes for FalconAppifDmemmapperV3 {}
> -// SAFETY: This struct doesn't contain uninitialized bytes and doesn't have interior mutability.
> -unsafe impl AsBytes for FalconAppifDmemmapperV3 {}
>  
> -#[derive(Debug)]
> +#[derive(Debug, FromBytes, IntoBytes, zerocopy_derive::KnownLayout)]
>  #[repr(C, packed)]
>  struct ReadVbios {
>      ver: u32,
> @@ -103,12 +91,8 @@ struct ReadVbios {
>      size: u32,
>      flags: u32,
>  }
> -// SAFETY: Any byte sequence is valid for this struct.
> -unsafe impl FromBytes for ReadVbios {}
> -// SAFETY: This struct doesn't contain uninitialized bytes and doesn't have interior mutability.
> -unsafe impl AsBytes for ReadVbios {}
>  
> -#[derive(Debug)]
> +#[derive(Debug, FromBytes, IntoBytes, zerocopy_derive::KnownLayout)]
>  #[repr(C, packed)]
>  struct FrtsRegion {
>      ver: u32,
> @@ -117,22 +101,15 @@ struct FrtsRegion {
>      size: u32,
>      ftype: u32,
>  }
> -// SAFETY: Any byte sequence is valid for this struct.
> -unsafe impl FromBytes for FrtsRegion {}
> -// SAFETY: This struct doesn't contain uninitialized bytes and doesn't have interior mutability.
> -unsafe impl AsBytes for FrtsRegion {}
>  
>  const NVFW_FRTS_CMD_REGION_TYPE_FB: u32 = 2;
>  
>  #[repr(C, packed)]
> +#[derive(FromBytes, IntoBytes, zerocopy_derive::KnownLayout)]
>  struct FrtsCmd {
>      read_vbios: ReadVbios,
>      frts_region: FrtsRegion,
>  }
> -// SAFETY: Any byte sequence is valid for this struct.
> -unsafe impl FromBytes for FrtsCmd {}
> -// SAFETY: This struct doesn't contain uninitialized bytes and doesn't have interior mutability.
> -unsafe impl AsBytes for FrtsCmd {}
>  
>  const NVFW_FALCON_APPIF_DMEMMAPPER_CMD_FRTS: u32 = 0x15;
>  const NVFW_FALCON_APPIF_DMEMMAPPER_CMD_SB: u32 = 0x19;
> @@ -151,11 +128,9 @@ pub(crate) enum FwsecCommand {
>  
>  /// A single signature that can be patched into a FWSEC image.
>  #[repr(transparent)]
> +#[derive(FromBytes)]
>  pub(crate) struct Bcrt30Rsa3kSignature([u8; BCRT30_RSA3K_SIG_SIZE]);
>  
> -/// SAFETY: A signature is just an array of bytes.
> -unsafe impl FromBytes for Bcrt30Rsa3kSignature {}
> -
>  impl From<[u8; BCRT30_RSA3K_SIG_SIZE]> for Bcrt30Rsa3kSignature {
>      fn from(sig: [u8; BCRT30_RSA3K_SIG_SIZE]) -> Self {
>          Self(sig)
> @@ -228,7 +203,7 @@ fn new_fwsec(bios: &Vbios, cmd: FwsecCommand) -> Result<Self> {
>  
>          let hdr = ucode
>              .get(hdr_offset..)
> -            .and_then(FalconAppifHdrV1::from_bytes_prefix)
> +            .and_then(|b| FalconAppifHdrV1::read_from_prefix(b).ok())
>              .ok_or(EINVAL)?
>              .0;
>  
> @@ -246,7 +221,7 @@ fn new_fwsec(bios: &Vbios, cmd: FwsecCommand) -> Result<Self> {
>  
>              let app = ucode
>                  .get(entry_offset..)
> -                .and_then(FalconAppifV1::from_bytes_prefix)
> +                .and_then(|b| FalconAppifV1::read_from_prefix(b).ok())
>                  .ok_or(EINVAL)?
>                  .0;
>  
> @@ -263,7 +238,7 @@ fn new_fwsec(bios: &Vbios, cmd: FwsecCommand) -> Result<Self> {
>  
>              let dmem_mapper = ucode
>                  .get_mut(dmem_mapper_offset..)
> -                .and_then(FalconAppifDmemmapperV3::from_bytes_mut_prefix)
> +                .and_then(|b| FalconAppifDmemmapperV3::mut_from_prefix(b).ok())
>                  .ok_or(EINVAL)?
>                  .0;
>  
> @@ -281,7 +256,7 @@ fn new_fwsec(bios: &Vbios, cmd: FwsecCommand) -> Result<Self> {
>  
>              let frts_cmd = ucode
>                  .get_mut(frts_cmd_offset..)
> -                .and_then(FrtsCmd::from_bytes_mut_prefix)
> +                .and_then(|b| FrtsCmd::mut_from_prefix(b).ok())
>                  .ok_or(EINVAL)?
>                  .0;
>  
> -- 
> 2.34.1
>
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.