drivers/gpu/nova-core/vbios.rs | 56 +++++++++++++++++++++------------- 1 file changed, 35 insertions(+), 21 deletions(-)
Separating the header allows the use of `size_of::<PmuLookupTableHeader>()`
instead of the magic number 4.
Signed-off-by: Rhys Lloyd <krakow20@gmail.com>
---
drivers/gpu/nova-core/vbios.rs | 56 +++++++++++++++++++++-------------
1 file changed, 35 insertions(+), 21 deletions(-)
diff --git a/drivers/gpu/nova-core/vbios.rs b/drivers/gpu/nova-core/vbios.rs
index 663fc50e8b66..20011c5c9bbc 100644
--- a/drivers/gpu/nova-core/vbios.rs
+++ b/drivers/gpu/nova-core/vbios.rs
@@ -889,6 +889,32 @@ fn try_from(base: BiosImageBase) -> Result<Self> {
}
}
+/// The [`PmuLookupTableHeader`] structure is header information for [`PmuLookupTable`].
+///
+/// See the [`PmuLookupTable`] description for more information.
+#[expect(dead_code)]
+struct PmuLookupTableHeader {
+ version: u8,
+ header_len: u8,
+ entry_len: u8,
+ entry_count: u8,
+}
+
+impl PmuLookupTableHeader {
+ fn new(data: &[u8]) -> Result<Self> {
+ if data.len() < core::mem::size_of::<Self>() {
+ return Err(EINVAL);
+ }
+
+ Ok(PmuLookupTableHeader {
+ version: data[0],
+ header_len: data[1],
+ entry_len: data[2],
+ entry_count: data[3],
+ })
+ }
+}
+
/// The [`PmuLookupTableEntry`] structure is a single entry in the [`PmuLookupTable`].
///
/// See the [`PmuLookupTable`] description for more information.
@@ -918,24 +944,18 @@ fn new(data: &[u8]) -> Result<Self> {
///
/// The table of entries is pointed to by the falcon data pointer in the BIT table, and is used to
/// locate the Falcon Ucode.
-#[expect(dead_code)]
struct PmuLookupTable {
- version: u8,
- header_len: u8,
- entry_len: u8,
- entry_count: u8,
+ header: PmuLookupTableHeader,
table_data: KVec<u8>,
}
impl PmuLookupTable {
fn new(pdev: &pci::Device, data: &[u8]) -> Result<Self> {
- if data.len() < 4 {
- return Err(EINVAL);
- }
+ let header = PmuLookupTableHeader::new(data)?;
- let header_len = data[1] as usize;
- let entry_len = data[2] as usize;
- let entry_count = data[3] as usize;
+ let header_len = header.header_len as usize;
+ let entry_len = header.entry_len as usize;
+ let entry_count = header.entry_count as usize;
let required_bytes = header_len + (entry_count * entry_len);
@@ -963,27 +983,21 @@ fn new(pdev: &pci::Device, data: &[u8]) -> Result<Self> {
);
}
- Ok(PmuLookupTable {
- version: data[0],
- header_len: header_len as u8,
- entry_len: entry_len as u8,
- entry_count: entry_count as u8,
- table_data,
- })
+ Ok(PmuLookupTable { header, table_data })
}
fn lookup_index(&self, idx: u8) -> Result<PmuLookupTableEntry> {
- if idx >= self.entry_count {
+ if idx >= self.header.entry_count {
return Err(EINVAL);
}
- let index = (idx as usize) * self.entry_len as usize;
+ let index = (idx as usize) * self.header.entry_len as usize;
PmuLookupTableEntry::new(&self.table_data[index..])
}
// find entry by type value
fn find_entry_by_type(&self, entry_type: u8) -> Result<PmuLookupTableEntry> {
- for i in 0..self.entry_count {
+ for i in 0..self.header.entry_count {
let entry = self.lookup_index(i)?;
if entry.application_id == entry_type {
return Ok(entry);
base-commit: 215a3f91713383a3c0d2da82d223a608a3c17ac1
--
2.50.1
On Mon Jul 14, 2025 at 7:43 PM JST, Rhys Lloyd wrote: > Separating the header allows the use of `size_of::<PmuLookupTableHeader>()` > instead of the magic number 4. > > Signed-off-by: Rhys Lloyd <krakow20@gmail.com> > --- > drivers/gpu/nova-core/vbios.rs | 56 +++++++++++++++++++++------------- > 1 file changed, 35 insertions(+), 21 deletions(-) > > diff --git a/drivers/gpu/nova-core/vbios.rs b/drivers/gpu/nova-core/vbios.rs > index 663fc50e8b66..20011c5c9bbc 100644 > --- a/drivers/gpu/nova-core/vbios.rs > +++ b/drivers/gpu/nova-core/vbios.rs > @@ -889,6 +889,32 @@ fn try_from(base: BiosImageBase) -> Result<Self> { > } > } > > +/// The [`PmuLookupTableHeader`] structure is header information for [`PmuLookupTable`]. > +/// > +/// See the [`PmuLookupTable`] description for more information. > +#[expect(dead_code)] > +struct PmuLookupTableHeader { > + version: u8, > + header_len: u8, > + entry_len: u8, > + entry_count: u8, > +} > + > +impl PmuLookupTableHeader { Can you add a // TODO[TRSM]: use FromBytes::from_bytes when it becomes available. as ultimately that's what we want to do. (we are using these markers to keep track of tasks to complete as Rust features land, see Documentation/gpu/nova/core/todo.rst) > + fn new(data: &[u8]) -> Result<Self> { > + if data.len() < core::mem::size_of::<Self>() { > + return Err(EINVAL); > + } > + > + Ok(PmuLookupTableHeader { > + version: data[0], How about making `PmuLookupTableHeader` `#[repr(C)]` and using `offset_of!`? This will also set the stage for the transition to using `FromBytes::from_bytes`.
© 2016 - 2025 Red Hat, Inc.