VBIOS

This document describes the layout of the VBIOS image which is a series of concatenatedimages in the ROM of the GPU. The VBIOS is mirrored onto the BAR 0 space and is readby both Boot ROM firmware (also known as IFR or init-from-rom firmware) on the GPU tobootstrap various microcontrollers (PMU, SEC, GSP) with critical initialization beforethe driver loads, as well as by the nova-core driver in the kernel to boot the GSP.

The format of the images in the ROM follow the “BIOS Specification” part of thePCI specification, with Nvidia-specific extensions. The ROM images of type FwSecare the ones that contain Falcon ucode and what we are mainly looking for.

As an example, the following are the different image types that can be found in theVBIOS of an Ampere GA102 GPU which is supported by the nova-core driver.

  • PciAt Image (Type 0x00) - This is the standard PCI BIOS image, whose namelikely comes from the “IBM PC/AT” architecture.

  • EFI Image (Type 0x03) - This is the EFI BIOS image. It contains the UEFI GOPdriver that is used to display UEFI graphics output.

  • First FwSec Image (Type 0xE0) - The first FwSec image (Secure Firmware)

  • Second FwSec Image (Type 0xE0) - The second FwSec image (Secure Firmware)contains various microcodes (also known as an applications) that do a rangeof different functions. The FWSEC ucode is run in heavy-secure mode andtypically runs directly on the GSP (it could be running on a differentdesignated processor in future generations but as of Ampere, it is the GSP).This firmware then loads other firmware ucodes onto the PMU and SEC2microcontrollers for gfw initialization after GPU reset and before the driverloads (seeDevice Initialization (devinit)). The DEVINIT ucode is itself another ucode that isstored in this ROM partition.

Once located, the Falcon ucodes have “Application Interfaces” in their datamemory (DMEM). For FWSEC, the application interface we use for FWSEC is the“DMEM mapper” interface which is configured to run the “FRTS” command. Thiscommand carves out the WPR2 (Write-Protected Region) in VRAM. It then placesimportant power-management data, called ‘FRTS’, into this region. The WPR2region is only accessible to heavy-secure ucode.

Note

It is not clear why FwSec has 2 different partitions in the ROM, but they bothare of type 0xE0 and can be identified as such. This could be subject to changein future generations.

VBIOS ROM Layout

The VBIOS layout is roughly a series of concatenated images laid out as follows:

+----------------------------------------------------------------------------+| VBIOS (Starting at ROM_OFFSET: 0x300000)                                   |+----------------------------------------------------------------------------+| +-----------------------------------------------+                          || | PciAt Image (Type 0x00)                       |                          || +-----------------------------------------------+                          || | +-------------------+                         |                          || | | ROM Header        |                         |                          || | | (Signature 0xAA55)|                         |                          || | +-------------------+                         |                          || |         | rom header's pci_data_struct_offset |                          || |         | points to the PCIR structure        |                          || |         V                                     |                          || | +-------------------+                         |                          || | | PCIR Structure    |                         |                          || | | (Signature "PCIR")|                         |                          || | | last_image: 0x80  |                         |                          || | | image_len: size   |                         |                          || | | in 512-byte units |                         |                          || | +-------------------+                         |                          || |         |                                     |                          || |         | NPDE immediately follows PCIR       |                          || |         V                                     |                          || | +-------------------+                         |                          || | | NPDE Structure    |                         |                          || | | (Signature "NPDE")|                         |                          || | | last_image: 0x00  |                         |                          || | +-------------------+                         |                          || |                                               |                          || | +-------------------+                         |                          || | | BIT Header        | (Signature scanning     |                          || | | (Signature "BIT") |  provides the location  |                          || | +-------------------+  of the BIT table)      |                          || |         | header is                           |                          || |         | followed by a table of tokens       |                          || |         V one of which is for falcon data.    |                          || | +-------------------+                         |                          || | | BIT Tokens        |                         |                          || | |  ______________   |                         |                          || | | | Falcon Data |   |                         |                          || | | | Token (0x70)|---+------------>------------+--+                       || | | +-------------+   |  falcon_data_ptr()      |  |                       || | +-------------------+                         |  V                       || +-----------------------------------------------+  |                       ||              (no gap between images)               |                       || +-----------------------------------------------+  |                       || | EFI Image (Type 0x03)                         |  |                       || +-----------------------------------------------+  |                       || | Contains the UEFI GOP driver (Graphics Output)|  |                       || | +-------------------+                         |  |                       || | | ROM Header        |                         |  |                       || | +-------------------+                         |  |                       || | | PCIR Structure    |                         |  |                       || | +-------------------+                         |  |                       || | | NPDE Structure    |                         |  |                       || | +-------------------+                         |  |                       || | | Image data        |                         |  |                       || | +-------------------+                         |  |                       || +-----------------------------------------------+  |                       ||              (no gap between images)               |                       || +-----------------------------------------------+  |                       || | First FwSec Image (Type 0xE0)                 |  |                       || +-----------------------------------------------+  |                       || | +-------------------+                         |  |                       || | | ROM Header        |                         |  |                       || | +-------------------+                         |  |                       || | | PCIR Structure    |                         |  |                       || | +-------------------+                         |  |                       || | | NPDE Structure    |                         |  |                       || | +-------------------+                         |  |                       || | | Image data        |                         |  |                       || | +-------------------+                         |  |                       || +-----------------------------------------------+  |                       ||              (no gap between images)               |                       || +-----------------------------------------------+  |                       || | Second FwSec Image (Type 0xE0)                |  |                       || +-----------------------------------------------+  |                       || | +-------------------+                         |  |                       || | | ROM Header        |                         |  |                       || | +-------------------+                         |  |                       || | | PCIR Structure    |                         |  |                       || | +-------------------+                         |  |                       || | | NPDE Structure    |                         |  |                       || | +-------------------+                         |  |                       || |                                               |  |                       || | +-------------------+                         |  |                       || | | PMU Lookup Table  | <- falcon_data_offset <----+                       || | | +-------------+   |    pmu_lookup_table     |                          || | | | Entry 0x85  |   |                         |                          || | | | FWSEC_PROD  |   |                         |                          || | | +-------------+   |                         |                          || | +-------------------+                         |                          || |         |                                     |                          || |         | points to                           |                          || |         V                                     |                          || | +-------------------+                         |                          || | | FalconUCodeDescV3 | <- falcon_ucode_offset  |                          || | | (FWSEC Firmware)  |    fwsec_header()       |                          || | +-------------------+                         |                          || |         |   immediately followed  by...       |                          || |         V                                     |                          || | +----------------------------+                |                          || | | Signatures + FWSEC Ucode   |                |                          || | | fwsec_sigs(), fwsec_ucode()|                |                          || | +----------------------------+                |                          || +-----------------------------------------------+                          ||                                                                            |+----------------------------------------------------------------------------+

Note

This diagram is created based on an GA-102 Ampere GPU as an example and couldvary for future or other GPUs.

Note

For more explanations of acronyms, see the detailed descriptions invbios.rs.

Falcon data Lookup

A key part of the VBIOS extraction code (vbios.rs) is to find the location of theFalcon data in the VBIOS which contains the PMU lookup table. This lookup table isused to find the required Falcon ucode based on an application ID.

The location of the PMU lookup table is found by scanning the BIT (BIOS Information Table)tokens for a token with the idBIT_TOKEN_ID_FALCON_DATA (0x70) which indicates theoffset of the same from the start of the VBIOS image. Unfortunately, the offsetdoes not account for the EFI image located between the PciAt and FwSec images.Thevbios.rs code compensates for this with appropriate arithmetic.