linux/Documentation/gpu/nova/core/tlv.rst
Timur Tabi 33f40117c0 gpu: nova-core: add TLV parser for firmware files
TLV (type, length, value) files are the new image format used by Nova
to encapsulate firmware images and their metadata.  Unlike the firmware
files for previous versions of the firmware, TLV filenames are not
versioned, and they have a .tlv suffix.

Add function request_tlv() to load TLV firmware images.

Add the Tlv struct and supporting types for parsing TLV firmware images.
TLV files begin with a 4-byte magic header, which must be "NVFW" for
Nvidia firmware files.  This is followed by a sequence of blocks each
containing a 4-byte ASCII tag, a 4-byte little-endian length, and a
payload padded to a 4-byte boundary.

Tlv::new() validates the entire image up front, so that the iterator can
subsequently yield blocks without fallible parsing.

Also add accessor methods for the various encoded types that will be used
by the driver.

Signed-off-by: Timur Tabi <ttabi@nvidia.com>
Reviewed-by: Alexandre Courbot <acourbot@nvidia.com>
Tested-by: Alexandre Courbot <acourbot@nvidia.com>
Link: https://patch.msgid.link/20260731201017.2580713-4-ttabi@nvidia.com
[ Drop unnecessary payload.is_empty() check in Tlv::new(), use EINVAL
  instead of ENODATA in Tlv::get_bytes() and add a corresponding TODO
  comment. - Danilo ]
Signed-off-by: Danilo Krummrich <dakr@kernel.org>
2026-08-06 01:54:12 +02:00

185 lines
6.4 KiB
ReStructuredText

.. SPDX-License-Identifier: (GPL-2.0+ OR MIT)
==================================
TLV Tags in Nova Firmware Images
==================================
Nova firmware images use a Type-Length-Value (TLV) format to encapsulate
firmware components and metadata. The TLV file begins with a 4-byte "magic"
header that contains the string "NVFW". Following the header is a sequence of
TLV blocks.
Each block consists of a 4-byte tag of ASCII characters, a 4-byte length
encoded as a little-endian unsigned integer, and a sequence of bytes, the size
of which is equal to the length rounded up to the next multiple of 4.
The driver code that reads the TLV and uses its contents is called the parser.
It is the responsibility of the parser to handle missing or malformed tags,
lengths, and values in the TLV.
::
+------+------+------+------+
| 'N' | 'V' | 'F' | 'W' | Magic header
+------+------+------+------+
| Tag (4 bytes, ASCII) | TLV block 0
+---------------------------+
| Length (4 bytes, LE) |
+---------------------------+
| |
| Value (length bytes, |
| padded to 4-byte align) |
| |
+---------------------------+
| Tag (4 bytes, ASCII) | TLV block 1
+---------------------------+
| Length (4 bytes, LE) |
+---------------------------+
| |
| Value (length bytes, |
| padded to 4-byte align) |
| |
+---------------------------+
| ... | More TLV blocks
+---------------------------+
Tags and Length
===============
TLV tags are always four-character words, with all letters being upper case.
Duplicate tags are not allowed.
A TLV file may contain additional tags not described in this document.
Values
======
Values are one of four types. The type is not encoded in the format; rather,
the parser expects a given tag to have a value of a given type.
1) Integers, encoded in 32-bit or 64-bit little-endian format.
2) Strings, encoded as-is and required to be only printable ASCII characters
and without a null terminator.
3) An array of bytes, for binary data.
4) Boolean, encoded as single byte, with a value of 0 for False or 1 for True.
Common Tags
===========
These tags are shared across firmware types and carry the same meaning
wherever they appear. Unlike the firmware-specific tags below, a common tag
is reserved: its meaning is fixed and may never be redefined for a particular
firmware type.
``VERS`` (string)
Human-readable firmware version string. Present in all TLV files.
A TLV image must contain either a single ``BLOB`` tag (firmware embedded
inline) or a ``SIZE``/``FILE`` pair (firmware stored in a separate file).
``BLOB`` (bytes)
If the firmware microcode binary is stored in the TLV, this tag contains
the actual firmware image bytes.
``FILE`` (string)
If the firmware binary is stored as a separate file, this tag contains the
name of that file, which is required to be in the same directory as the TLV,
so no paths are allowed in the filename. This tag is always paired with
``SIZE``, so as to allow the driver to pre-allocate the buffer before
loading the file.
``SIZE`` (u32)
Total size in bytes of the firmware image to be loaded from the companion
file named by ``FILE``. This tag is mandatory if ``FILE`` exists, so the
size of the firmware image must be known when the TLV is created. If the
firmware image is updated and its size changes, then the TLV must be
updated with it.
GSP Firmware Tags
=================
``SIGN`` (bytes)
Cryptographic signature for the GSP firmware.
``BLID`` (string)
The build ID, extracted from the ".note.gnu.build-id" section.
Booter Firmware Tags
====================
``DAOF`` (u32) - ``os_data_offset``
OS data section offset within the firmware image (absolute byte offset).
Maps to the DMEM load source.
``DASZ`` (u32) - ``os_data_size``
OS data section size in bytes.
``CDOF`` (u32) - ``os_code_offset``
OS code section offset within the firmware image (absolute byte offset).
Maps to the non-secure IMEM load source.
``CDSZ`` (u32) - ``os_code_size``
OS code section size in bytes.
``PLOC`` (u32) - ``patch_loc``
Signature patch location -- byte offset within the firmware image where the
selected signature should be written.
``FUSE`` (u32) - ``fuse_version``
Fuse version of the firmware, used with the hardware fuse register to
select the correct signature index.
``ENID`` (u32) - ``engine_id``
Engine ID mask identifying the falcon engine this firmware targets.
``UCID`` (u32) - ``ucode_id``
Microcode ID used together with the engine ID to query hardware signature
fuse registers.
``A0CO`` (u32) - ``app0_code_offset``
App0 code offset -- start of the secure code region within the firmware
image. Used as the IMEM secure section source.
``A0CS`` (u32) - ``app0_code_size``
App0 code size in bytes.
``NSIG`` (u32) - ``num_sigs``
Number of signatures included in the ``SIGN`` tag.
``SIGN`` (bytes)
Concatenated array of firmware signatures. The size of each signature is
the total length of the ``SIGN`` value divided by ``NSIG``. The correct
signature is selected using the fuse-version-derived index.
Generic Bootloader Tags
=======================
``CDSZ`` (u32) - ``code_size``
Size in bytes of the bootloader code to copy from the ``BLOB`` tag and
PIO-load into falcon IMEM.
``STRT`` (u32) - ``start_tag``
Start tag identifying the IMEM block where execution begins. The falcon
boot address is derived as ``start_tag << 8``.
GSP Bootloader Tags
===================
``CDOF`` (u32) - ``code_offset``
Offset within the firmware image at which the code section starts.
``DAOF`` (u32) - ``data_offset``
Offset within the firmware image at which the data section starts.
``MFOF`` (u32) - ``manifest_offset``
Offset within the firmware image at which the manifest starts.
``APPV`` (u32) - ``app_version``
Application version of the firmware.
FMC Firmware Tags
=================
``HASH`` (bytes)
SHA-384 hash of the FMC firmware, exactly 48 bytes long.
``PKEY`` (bytes)
Public key used to verify the FMC firmware. At most 384 bytes (RSA-3072),
but may be shorter.
``SIGN`` (bytes)
Signature of the FMC firmware. At most 384 bytes (RSA-3072), but may
be shorter.