[PATCH 3/7] drm/nova: use `zerocopy` in booter.rs
Pedro Yudi Honda
niyudi.honda em usp.br
Seg Jun 22 15:40:23 -03 2026
From: Pedro Yudi Honda <niyudi.honda em usp.br>
In firmware/booter.rs, replace the following `transmute` traits with
their `zerocopy` equivalents:
- `transmute::FromBytes` -> `zerocopy::FromBytes`
Update call sites accordingly.
Signed-off-by: Pedro Yudi Honda <niyudi.honda em usp.br>
---
drivers/gpu/nova-core/firmware/booter.rs | 26 +++++++-----------------
1 file changed, 7 insertions(+), 19 deletions(-)
diff --git a/drivers/gpu/nova-core/firmware/booter.rs b/drivers/gpu/nova-core/firmware/booter.rs
index de2a4536b532..d715ae4120ab 100644
--- a/drivers/gpu/nova-core/firmware/booter.rs
+++ b/drivers/gpu/nova-core/firmware/booter.rs
@@ -8,8 +8,7 @@
use kernel::{
device,
- prelude::*,
- transmute::FromBytes, //
+ prelude::*, //
};
use crate::{
@@ -42,7 +41,7 @@ fn frombytes_at<S: FromBytes + Sized>(slice: &[u8], offset: usize) -> Result<S>
let end = offset.checked_add(size_of::<S>()).ok_or(EINVAL)?;
slice
.get(offset..end)
- .and_then(S::from_bytes_copy)
+ .and_then(|b| S::read_from_bytes(b).ok())
.ok_or(EINVAL)
}
@@ -51,7 +50,7 @@ fn frombytes_at<S: FromBytes + Sized>(slice: &[u8], offset: usize) -> Result<S>
/// Such firmwares have an application-specific payload that needs to be patched with a given
/// signature.
#[repr(C)]
-#[derive(Debug, Clone)]
+#[derive(Debug, Clone, FromBytes)]
struct HsHeaderV2 {
/// Offset to the start of the signatures.
sig_prod_offset: u32,
@@ -74,9 +73,6 @@ struct HsHeaderV2 {
header_size: u32,
}
-// SAFETY: all bit patterns are valid for this type, and it doesn't use interior mutability.
-unsafe impl FromBytes for HsHeaderV2 {}
-
/// Heavy-Secured Firmware image container.
///
/// This provides convenient access to the fields of [`HsHeaderV2`] that are actually indices to
@@ -143,6 +139,7 @@ fn signatures_iter(&'a self) -> Result<impl Iterator<Item = BooterSignature<'a>>
/// Signature parameters, as defined in the firmware.
#[repr(C)]
+#[derive(FromBytes)]
struct HsSignatureParams {
/// Fuse version to use.
fuse_ver: u32,
@@ -152,9 +149,6 @@ struct HsSignatureParams {
ucode_id: u32,
}
-// SAFETY: all bit patterns are valid for this type, and it doesn't use interior mutability.
-unsafe impl FromBytes for HsSignatureParams {}
-
impl HsSignatureParams {
/// Returns the signature parameters contained in `hs_fw`.
///
@@ -169,14 +163,14 @@ fn new(hs_fw: &HsFirmwareV2<'_>) -> Result<Self> {
hs_fw
.fw
.get(start..end)
- .and_then(Self::from_bytes_copy)
+ .and_then(|b| Self::read_from_bytes(b).ok())
.ok_or(EINVAL)
}
}
/// Header for code and data load offsets.
#[repr(C)]
-#[derive(Debug, Clone)]
+#[derive(Debug, Clone, FromBytes)]
struct HsLoadHeaderV2 {
// Offset at which the code starts.
os_code_offset: u32,
@@ -190,9 +184,6 @@ struct HsLoadHeaderV2 {
num_apps: u32,
}
-// SAFETY: all bit patterns are valid for this type, and it doesn't use interior mutability.
-unsafe impl FromBytes for HsLoadHeaderV2 {}
-
impl HsLoadHeaderV2 {
/// Returns the load header contained in `hs_fw`.
///
@@ -204,7 +195,7 @@ fn new(hs_fw: &HsFirmwareV2<'_>) -> Result<Self> {
/// Header for app code loader.
#[repr(C)]
-#[derive(Debug, Clone)]
+#[derive(Debug, Clone, FromBytes)]
struct HsLoadHeaderV2App {
/// Offset at which to load the app code.
offset: u32,
@@ -212,9 +203,6 @@ struct HsLoadHeaderV2App {
len: u32,
}
-// SAFETY: all bit patterns are valid for this type, and it doesn't use interior mutability.
-unsafe impl FromBytes for HsLoadHeaderV2App {}
-
impl HsLoadHeaderV2App {
/// Returns the [`HsLoadHeaderV2App`] for app `idx` of `hs_fw`.
///
--
2.34.1
Mais detalhes sobre a lista de discussão kernel