Skip to contentSkip to conversation

gpu: nova-core: vbios: use offset_of in PmuLookupTableHeader::new

PATCH In review Rhys Lloyd 3 participants 8 messages Jul 18, 2025 – Jul 27, 2025

Subsystems (4)
lore
Share & tools
lore

Rhys Lloyd

author
#0 lore raw

PATCH 1/1 gpu: nova-core: vbios: use offset_of in PmuLookupTableHeader::new

Use the offset_of macro for each struct field, annotate the PmuLookupTableHeader struct with #[repr(C)] attribute, and add a TODO message to use FromBytes when available.

---
 drivers/gpu/nova-core/vbios.rs | 10 ++++++----
 1 file changed, 6 insertions(+), 4 deletions(-)
drivers/gpu/nova-core/vbios.rs +6 -4
index a77d7a4c8595..cedfcf3476bb 100644
@@ -893,6 +893,7 @@ fn try_from(base: BiosImageBase) -> Result<Self> {
 ///
 /// See the [`PmuLookupTable`] description for more information.
 #[expect(dead_code)]
+#[repr(C)]
 struct PmuLookupTableHeader {
     version: u8,
     header_len: u8,
@@ -901,16 +902,17 @@ struct PmuLookupTableHeader {
 }
 
 impl PmuLookupTableHeader {
+    // TODO[TRSM]: use FromBytes::from_bytes when it becomes available.
     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],
+            version: data[const { core::mem::offset_of!(PmuLookupTableHeader, version) }],
+            header_len: data[const { core::mem::offset_of!(PmuLookupTableHeader, header_len) }],
+            entry_len: data[const { core::mem::offset_of!(PmuLookupTableHeader, entry_len) }],
+            entry_count: data[const { core::mem::offset_of!(PmuLookupTableHeader, entry_count) }],
         })
     }
 }

base-commit: 14ae91a81ec8fa0bc23170d4aa16dd2a20d54105
prerequisite-patch-id: 6f9311de987d56f4313d5fbdd85ed8c48a44e78c

Signature · 1 line
2.50.1
author
#1 lore raw

PATCH v2 1/1 gpu: nova-core: vbios: use size_of instead of magic number

12 is identical to the value of size_of::<BitHeader>(), so use the latter instead.

---
Changes in v2:
- Added #[repr(C)] to BitHeader

---
 drivers/gpu/nova-core/vbios.rs | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/gpu/nova-core/vbios.rs +2 -1
index 5b5d9f38cbb3..912698308102 100644
@@ -346,6 +346,7 @@ fn image_size_bytes(&self) -> usize {
 /// [`FwSecBiosImage`].
 #[derive(Debug, Clone, Copy)]
 #[expect(dead_code)]
+#[repr(C)]
 struct BitHeader {
     /// 0h: BIT Header Identifier (BMP=0x7FFF/BIT=0xB8FF)
     id: u16,
@@ -365,7 +366,7 @@ struct BitHeader {
 
 impl BitHeader {
     fn new(data: &[u8]) -> Result<Self> {
-        if data.len() < 12 {
+        if data.len() < core::mem::size_of::<Self>() {
             return Err(EINVAL);
         }
 

base-commit: 14ae91a81ec8fa0bc23170d4aa16dd2a20d54105 --
2.50.1

#2 lore raw

Re: [PATCH v2] gpu: nova-core: vbios: use size_of instead of magic number

Quoted 4 lines · Rhys Lloyd

12 is identical to the value of size_of::<BitHeader>(), so use the latter instead.

Looking good - I'll push this to nova-next unless someone complains. Thanks!

author
#3 lore raw

PATCH v3 1/1 gpu: nova-core: vbios: change PmuLookupTableEntry to use size_of

In reply to Rhys Lloyd

Annotate the PmuLookupTableEntry with an #[repr(C, packed)] attribute. Removes another magic number by making the struct the same size as the data it needs to read, allowing the use of size_of::<PmuLookupTableEntry>()

---
Changes in v2:
- get_data helper function renamed to data Changes in v3:
- Change PmuLookupTableEntry.data back to u32
- Remove helper function
- Annotate PmuLookupTableEntry with #[repr(C, packed)]

---
 drivers/gpu/nova-core/vbios.rs | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/gpu/nova-core/vbios.rs +2 -1
index 5b5d9f38cbb3..4c8368946bd6 100644
@@ -893,6 +893,7 @@ fn try_from(base: BiosImageBase) -> Result<Self> {
 ///
 /// See the [`PmuLookupTable`] description for more information.
 #[expect(dead_code)]
+#[repr(C, packed)]
 struct PmuLookupTableEntry {
     application_id: u8,
     target_id: u8,
@@ -901,7 +902,7 @@ struct PmuLookupTableEntry {
 
 impl PmuLookupTableEntry {
     fn new(data: &[u8]) -> Result<Self> {
-        if data.len() < 6 {
+        if data.len() < core::mem::size_of::<Self>() {
             return Err(EINVAL);
         }
 

base-commit: 14ae91a81ec8fa0bc23170d4aa16dd2a20d54105 --
2.50.1

#4 lore raw

Re: [PATCH v3] gpu: nova-core: vbios: change PmuLookupTableEntry to use size_of

Quoted 6 lines · Rhys Lloyd

Annotate the PmuLookupTableEntry with an #[repr(C, packed)] attribute. Removes another magic number by making the struct the same size as the data it needs to read, allowing the use of size_of::<PmuLookupTableEntry>()

Looking good - I'll also push this one after a short grace period. Thanks!

#5 lore raw
In reply to Rhys Lloyd
Quoted 30 lines · Rhys Lloyd

Use the offset_of macro for each struct field, annotate the PmuLookupTableHeader struct with #[repr(C)] attribute, and add a TODO message to use FromBytes when available.

---
 drivers/gpu/nova-core/vbios.rs | 10 ++++++----
 1 file changed, 6 insertions(+), 4 deletions(-)
drivers/gpu/nova-core/vbios.rs +2 -0
index a77d7a4c8595..cedfcf3476bb 100644
@@ -893,6 +893,7 @@ fn try_from(base: BiosImageBase) -> Result<Self> {
 ///
 /// See the [`PmuLookupTable`] description for more information.
 #[expect(dead_code)]
+#[repr(C)]
 struct PmuLookupTableHeader {
     version: u8,
     header_len: u8,
@@ -901,16 +902,17 @@ struct PmuLookupTableHeader {
 }
 
 impl PmuLookupTableHeader {
+    // TODO[TRSM]: use FromBytes::from_bytes when it becomes available.
     fn new(data: &[u8]) -> Result<Self> {
         if data.len() < core::mem::size_of::<Self>() {
             return Err(EINVAL);
         }

drivers/gpu/nova-core/vbios.rs struct PmuLookupTableHeader { · line 915

Quoted 10 lines
drivers/gpu/nova-core/vbios.rs +4 -4
 
         Ok(PmuLookupTableHeader {
-            version: data[0],
-            header_len: data[1],
-            entry_len: data[2],
-            entry_count: data[3],
+            version: data[const { core::mem::offset_of!(PmuLookupTableHeader, version) }],
+            header_len: data[const { core::mem::offset_of!(PmuLookupTableHeader, header_len) }],
+            entry_len: data[const { core::mem::offset_of!(PmuLookupTableHeader, entry_len) }],
+            entry_count: data[const { core::mem::offset_of!(PmuLookupTableHeader, entry_count) }],

This chunk does not apply - on nova-next PmuLookupTableHeader does not seem to exist. I think I remember you split PmuLookupTableHeader in another patch, so can you send all the relevant patches as a series that applies cleanly on top of nova-next?

maintainer
#6 lore raw
Quoted 4 lines · Alexandre Courbot

This chunk does not apply - on nova-next PmuLookupTableHeader does not seem to exist. I think I remember you split PmuLookupTableHeader in another patch, so can you send all the relevant patches as a series that applies cleanly on top of nova-next?

If otherwise the series is ready, please wait for -rc1 to be out, and rebase on -rc1.

Thanks,
Danilo

author
#7 lore raw
Quoted 7 lines · Danilo Krummrich
Quoted 4 lines · Alexandre Courbot

This chunk does not apply - on nova-next PmuLookupTableHeader does not seem to exist. I think I remember you split PmuLookupTableHeader in another patch, so can you send all the relevant patches as a series that applies cleanly on top of nova-next?

Quoted 5 lines

If otherwise the series is ready, please wait for -rc1 to be out, and rebase on -rc1.

Thanks,
Danilo

Strange that it does not apply. I'll figure out how to send a patch series and resend it without any changes.