From: John Hubbard <jhubbard@nvidia.com>
To: Eliot Courtney <ecourtney@nvidia.com>,
Danilo Krummrich <dakr@kernel.org>,
Alice Ryhl <aliceryhl@google.com>,
Alexandre Courbot <acourbot@nvidia.com>,
David Airlie <airlied@gmail.com>, Simona Vetter <simona@ffwll.ch>
Cc: Alistair Popple <apopple@nvidia.com>,
Timur Tabi <ttabi@nvidia.com>,
nova-gpu@lists.linux.dev, rust-for-linux@vger.kernel.org,
dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org
Subject: Re: [PATCH v4 17/20] gpu: nova-core: vbios: remove unnecessary fields in PciRomHeader
Date: Fri, 22 May 2026 20:05:44 -0700 [thread overview]
Message-ID: <f93061f5-a7ea-4e30-a1ac-2883bcbda53b@nvidia.com> (raw)
In-Reply-To: <20260519-fix-vbios-v4-17-5d3f210c5602@nvidia.com>
On 5/18/26 7:55 PM, Eliot Courtney wrote:
> Remove unnecessary fields in PciRomHeader. This allows a simplification
> to use `FromBytes` instead of reading fields piecemeal. A lot of these
> checks were redundant as well since it checks the size of the `data`
> first in `BiosImage`.
>
> Signed-off-by: Eliot Courtney <ecourtney@nvidia.com>
> ---
> drivers/gpu/nova-core/vbios.rs | 68 ++++++++++--------------------------------
> 1 file changed, 16 insertions(+), 52 deletions(-)
Reviewed-by: John Hubbard <jhubbard@nvidia.com>
thanks,
--
John Hubbard
>
> diff --git a/drivers/gpu/nova-core/vbios.rs b/drivers/gpu/nova-core/vbios.rs
> index 64d100b6699b..1dca7933fac5 100644
> --- a/drivers/gpu/nova-core/vbios.rs
> +++ b/drivers/gpu/nova-core/vbios.rs
> @@ -546,67 +546,38 @@ fn from_id(image: &PciAtBiosImage, token_id: u8) -> Result<Self> {
>
> /// PCI ROM Expansion Header as defined in PCI Firmware Specification.
> ///
> -/// This is header is at the beginning of every image in the set of images in the ROM. It contains
> -/// a pointer to the PCI Data Structure which describes the image. For "NBSI" images (NoteBook
> -/// System Information), the ROM header deviates from the standard and contains an offset to the
> -/// NBSI image however we do not yet parse that in this module and keep it for future reference.
> +/// This header is at the beginning of every image in the set of images in the ROM. It contains a
> +/// pointer to the PCI Data Structure which describes the image.
> #[derive(Debug, Clone, Copy)]
> -#[expect(dead_code)]
> +#[repr(C)]
> struct PciRomHeader {
> /// 00h: Signature (0xAA55)
> signature: u16,
> - /// 02h: Reserved bytes for processor architecture unique data (20 bytes)
> - reserved: [u8; 20],
> - /// 16h: NBSI Data Offset (NBSI-specific, offset from header to NBSI image)
> - nbsi_data_offset: Option<u16>,
> + /// 02h: Reserved bytes for processor architecture unique data (22 bytes)
> + reserved: [u8; 22],
> /// 18h: Pointer to PCI Data Structure (offset from start of ROM image)
> pci_data_struct_offset: u16,
> - /// 1Ah: Size of block (this is NBSI-specific)
> - size_of_block: Option<u32>,
> }
>
> +// SAFETY: all bit patterns are valid for `PciRomHeader`.
> +unsafe impl FromBytes for PciRomHeader {}
> +
> impl PciRomHeader {
> fn new(dev: &device::Device, data: &[u8]) -> Result<Self> {
> - if data.len() < 26 {
> - // Need at least 26 bytes to read pciDataStrucPtr and sizeOfBlock.
> - return Err(EINVAL);
> - }
> -
> - let signature = u16::from_le_bytes([data[0], data[1]]);
> + let (rom_header, _) = PciRomHeader::from_bytes_copy_prefix(data)
> + .ok_or(EINVAL)
> + .inspect_err(|_| dev_err!(dev, "Not enough data for ROM header\n"))?;
>
> // Check for valid ROM signatures.
> - match signature {
> + match rom_header.signature {
> 0xAA55 | 0x4E56 => {}
> _ => {
> - dev_err!(dev, "ROM signature unknown {:#x}\n", signature);
> + dev_err!(dev, "ROM signature unknown {:#x}\n", rom_header.signature);
> return Err(EINVAL);
> }
> }
>
> - // Read the pointer to the PCI Data Structure at offset 0x18.
> - let pci_data_struct_ptr = u16::from_le_bytes([data[24], data[25]]);
> -
> - // Try to read optional fields if enough data.
> - let mut size_of_block = None;
> - let mut nbsi_data_offset = None;
> -
> - if data.len() >= 30 {
> - // Read size_of_block at offset 0x1A.
> - size_of_block = Some(u32::from_le_bytes([data[26], data[27], data[28], data[29]]));
> - }
> -
> - // For NBSI images, try to read the nbsiDataOffset at offset 0x16.
> - if data.len() >= 24 {
> - nbsi_data_offset = Some(u16::from_le_bytes([data[22], data[23]]));
> - }
> -
> - Ok(PciRomHeader {
> - signature,
> - reserved: [0u8; 20],
> - pci_data_struct_offset: pci_data_struct_ptr,
> - size_of_block,
> - nbsi_data_offset,
> - })
> + Ok(rom_header)
> }
> }
>
> @@ -722,11 +693,11 @@ pub(crate) struct FwSecBiosImage {
> /// BIOS Image structure containing various headers and reference fields to all BIOS images.
> ///
> /// A BiosImage struct is embedded into all image types and implements common operations.
> -#[expect(dead_code)]
> struct BiosImage {
> /// Used for logging.
> dev: ARef<device::Device>,
> /// PCI ROM Expansion Header
> + #[expect(dead_code)]
> rom_header: PciRomHeader,
> /// PCI Data Structure
> pcir: PcirStruct,
> @@ -771,15 +742,8 @@ fn is_last(&self) -> bool {
>
> /// Creates a new BiosImage from raw byte data.
> fn new(dev: &device::Device, data: &[u8]) -> Result<Self> {
> - // Ensure we have enough data for the ROM header.
> - if data.len() < 26 {
> - dev_err!(dev, "Not enough data for ROM header\n");
> - return Err(EINVAL);
> - }
> -
> // Parse the ROM header.
> - let rom_header = PciRomHeader::new(dev, &data[0..26])
> - .inspect_err(|e| dev_err!(dev, "Failed to create PciRomHeader: {:?}\n", e))?;
> + let rom_header = PciRomHeader::new(dev, data)?;
>
> // Get the PCI Data Structure using the pointer from the ROM header.
> let pcir_offset = usize::from(rom_header.pci_data_struct_offset);
>
next prev parent reply other threads:[~2026-05-23 3:05 UTC|newest]
Thread overview: 43+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-05-19 2:54 [PATCH v4 00/20] gpu: nova-core: vbios: harden various array accesses and refactor Eliot Courtney
2026-05-19 2:54 ` [PATCH v4 01/20] gpu: nova-core: vbios: stop scanning at BIOS_MAX_SCAN_LEN Eliot Courtney
2026-05-23 2:47 ` John Hubbard
2026-05-19 2:54 ` [PATCH v4 02/20] gpu: nova-core: vbios: use checked arithmetic for bios image range end Eliot Courtney
2026-05-23 2:47 ` John Hubbard
2026-05-19 2:54 ` [PATCH v4 03/20] gpu: nova-core: vbios: avoid reading too far in read_more_at_offset Eliot Courtney
2026-05-23 2:48 ` John Hubbard
2026-05-19 2:54 ` [PATCH v4 04/20] gpu: nova-core: vbios: read BitToken using FromBytes Eliot Courtney
2026-05-23 2:48 ` John Hubbard
2026-05-19 2:54 ` [PATCH v4 05/20] gpu: nova-core: vbios: use checked ops and accesses in `FwSecBiosImage::ucode` Eliot Courtney
2026-05-23 2:48 ` John Hubbard
2026-05-19 2:55 ` [PATCH v4 06/20] gpu: nova-core: vbios: use checked access in `FwSecBiosImage::header` Eliot Courtney
2026-05-23 2:48 ` John Hubbard
2026-05-19 2:55 ` [PATCH v4 07/20] gpu: nova-core: vbios: use checked accesses in `setup_falcon_data` Eliot Courtney
2026-05-23 2:49 ` John Hubbard
2026-05-19 2:55 ` [PATCH v4 08/20] gpu: nova-core: vbios: drop unused falcon_data_offset from FwSecBiosBuilder Eliot Courtney
2026-05-23 2:49 ` John Hubbard
2026-05-19 2:55 ` [PATCH v4 09/20] gpu: nova-core: vbios: keep PmuLookupTable local in setup_falcon_data Eliot Courtney
2026-05-23 2:49 ` John Hubbard
2026-05-19 2:55 ` [PATCH v4 10/20] gpu: nova-core: vbios: compute FWSEC-relative Falcon data offset Eliot Courtney
2026-05-23 2:50 ` John Hubbard
2026-05-19 2:55 ` [PATCH v4 11/20] gpu: nova-core: vbios: simplify setup_falcon_data Eliot Courtney
2026-05-23 2:50 ` John Hubbard
2026-05-19 2:55 ` [PATCH v4 12/20] gpu: nova-core: vbios: read PMU lookup entries using FromBytes Eliot Courtney
2026-05-23 2:55 ` John Hubbard
2026-05-19 2:55 ` [PATCH v4 13/20] gpu: nova-core: vbios: store PMU lookup entries in a KVVec Eliot Courtney
2026-05-23 2:56 ` John Hubbard
2026-05-19 2:55 ` [PATCH v4 14/20] gpu: nova-core: vbios: construct `FwSecBiosImage` directly from BIOS images Eliot Courtney
2026-05-23 0:13 ` John Hubbard
2026-05-25 12:38 ` Eliot Courtney
2026-05-23 2:46 ` John Hubbard
2026-05-19 2:55 ` [PATCH v4 15/20] gpu: nova-core: vbios: use the first PCI-AT and FWSEC images Eliot Courtney
2026-05-23 3:35 ` John Hubbard
2026-05-19 2:55 ` [PATCH v4 16/20] gpu: nova-core: vbios: use let-else in Vbios::new Eliot Courtney
2026-05-23 3:05 ` John Hubbard
2026-05-19 2:55 ` [PATCH v4 17/20] gpu: nova-core: vbios: remove unnecessary fields in PciRomHeader Eliot Courtney
2026-05-23 3:05 ` John Hubbard [this message]
2026-05-19 2:55 ` [PATCH v4 18/20] gpu: nova-core: vbios: drop unused image wrappers Eliot Courtney
2026-05-23 3:06 ` John Hubbard
2026-05-19 2:55 ` [PATCH v4 19/20] gpu: nova-core: vbios: drop redundant TryFrom import Eliot Courtney
2026-05-23 3:06 ` John Hubbard
2026-05-19 2:55 ` [PATCH v4 20/20] gpu: nova-core: vbios: move constants and functions to be associated Eliot Courtney
2026-05-23 3:10 ` John Hubbard
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=f93061f5-a7ea-4e30-a1ac-2883bcbda53b@nvidia.com \
--to=jhubbard@nvidia.com \
--cc=acourbot@nvidia.com \
--cc=airlied@gmail.com \
--cc=aliceryhl@google.com \
--cc=apopple@nvidia.com \
--cc=dakr@kernel.org \
--cc=dri-devel@lists.freedesktop.org \
--cc=ecourtney@nvidia.com \
--cc=linux-kernel@vger.kernel.org \
--cc=nova-gpu@lists.linux.dev \
--cc=rust-for-linux@vger.kernel.org \
--cc=simona@ffwll.ch \
--cc=ttabi@nvidia.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.