[PATCH 1/7] drm/nova: use `zerocopy` in firmware.rs
Pedro Yudi Honda
niyudi.honda em usp.br
Seg Jun 22 15:40:21 -03 2026
From: Pedro Yudi Honda <niyudi.honda em usp.br>
In firmware.rs, replace the following `transmute` traits with their
`zerocopy` equivalents:
- `transmute::FromBytes` -> `zerocopy::FromBytes`
Update call sites accordingly.
Note that the module `elf` is untouched, as the bindings generated by
bindgen do not implement `FromBytes` for the structs.
Signed-off-by: Pedro Yudi Honda <niyudi.honda em usp.br>
---
drivers/gpu/nova-core/firmware.rs | 16 ++++------------
.../gpu/nova-core/firmware/fwsec/bootloader.rs | 4 +++-
drivers/gpu/nova-core/vbios.rs | 4 ++--
3 files changed, 9 insertions(+), 15 deletions(-)
diff --git a/drivers/gpu/nova-core/firmware.rs b/drivers/gpu/nova-core/firmware.rs
index ad37994ac15a..7f35b2e55dce 100644
--- a/drivers/gpu/nova-core/firmware.rs
+++ b/drivers/gpu/nova-core/firmware.rs
@@ -10,8 +10,7 @@
device,
firmware,
prelude::*,
- str::CString,
- transmute::FromBytes, //
+ str::CString, //
};
use crate::{
@@ -86,7 +85,7 @@ pub(crate) struct FalconUCodeDescV2 {
/// Structure used to describe some firmwares, notably FWSEC-FRTS.
#[repr(C)]
-#[derive(Debug, Clone)]
+#[derive(Debug, Clone, FromBytes)]
pub(crate) struct FalconUCodeDescV3 {
/// Header defined by `NV_BIT_FALCON_UCODE_DESC_HEADER_VDESC*` in OpenRM.
hdr: u32,
@@ -117,10 +116,6 @@ pub(crate) struct FalconUCodeDescV3 {
_reserved: u16,
}
-// SAFETY: all bit patterns are valid for this type, and it doesn't use
-// interior mutability.
-unsafe impl FromBytes for FalconUCodeDescV3 {}
-
/// Enum wrapping the different versions of Falcon microcode descriptors.
///
/// This allows handling both V2 and V3 descriptor formats through a
@@ -349,7 +344,7 @@ fn no_patch_signature(self) -> FirmwareObject<F, Signed> {
/// Header common to most firmware files.
#[repr(C)]
-#[derive(Debug, Clone)]
+#[derive(Debug, Clone, FromBytes)]
struct BinHdr {
/// Magic number, must be `0x10de`.
bin_magic: u32,
@@ -365,9 +360,6 @@ struct BinHdr {
data_size: u32,
}
-// SAFETY: all bit patterns are valid for this type, and it doesn't use interior mutability.
-unsafe impl FromBytes for BinHdr {}
-
// A firmware blob starting with a `BinHdr`.
struct BinFirmware<'a> {
hdr: BinHdr,
@@ -383,7 +375,7 @@ fn new(fw: &'a firmware::Firmware) -> Result<Self> {
fw.get(0..size_of::<BinHdr>())
// Extract header.
- .and_then(BinHdr::from_bytes_copy)
+ .and_then(|b| BinHdr::read_from_bytes(b).ok())
// Validate header.
.and_then(|hdr| {
if hdr.bin_magic == BIN_MAGIC {
diff --git a/drivers/gpu/nova-core/firmware/fwsec/bootloader.rs b/drivers/gpu/nova-core/firmware/fwsec/bootloader.rs
index bcb713a868e2..5d2ac63b95e8 100644
--- a/drivers/gpu/nova-core/firmware/fwsec/bootloader.rs
+++ b/drivers/gpu/nova-core/firmware/fwsec/bootloader.rs
@@ -29,6 +29,8 @@
},
};
+use zerocopy::FromBytes as _;
+
use crate::{
driver::Bar0,
falcon::{
@@ -154,7 +156,7 @@ pub(crate) fn new(
let hdr = fw
.data()
.get(0..size_of::<BinHdr>())
- .and_then(BinHdr::from_bytes_copy)
+ .and_then(|b| BinHdr::read_from_bytes(b).ok())
.ok_or(EINVAL)?;
let desc = {
diff --git a/drivers/gpu/nova-core/vbios.rs b/drivers/gpu/nova-core/vbios.rs
index 8b7d17a24660..6d700673686f 100644
--- a/drivers/gpu/nova-core/vbios.rs
+++ b/drivers/gpu/nova-core/vbios.rs
@@ -1019,8 +1019,8 @@ pub(crate) fn header(&self) -> Result<FalconUCodeDesc> {
Ok(FalconUCodeDesc::V2(v2))
}
3 => {
- let v3 = FalconUCodeDescV3::from_bytes_copy_prefix(data)
- .ok_or(EINVAL)?
+ let v3 = FalconUCodeDescV3::read_from_prefix(data)
+ .map_err(|_| EINVAL)?
.0;
Ok(FalconUCodeDesc::V3(v3))
}
--
2.34.1
Mais detalhes sobre a lista de discussão kernel