.. SPDX-License-Identifier: GPL-2.0 =================================================== FSP (Foundation Security Processor) and Secure Boot =================================================== This document describes the role of the FSP in the GPU boot sequence on Hopper and Blackwell GPUs, and how it differs from the earlier Ampere boot flow. It also provides a brief overview of the PRC (Product Reconfiguration Control) protocol used to query device configuration through FSP. As with other documents in this directory, the information is subject to change and is intended to help developers understand the corresponding kernel code. What is FSP? ============ The Foundation Security Processor (FSP) is the GPU's Internal Root of Trust (IROT). It is a dedicated security processor that boots from immutable ROM (Boot ROM) inside the GPU and is responsible for establishing the Chain of Trust before any other firmware is allowed to run. FSP runs independently of the host CPU and starts executing as soon as the GPU is powered on. By the time the nova-core driver is loaded, FSP has already completed its own secure boot and is ready to accept commands from the driver. Simplified boot flow (Hopper/Blackwell) ======================================= Starting with Hopper, the boot flow is significantly simplified compared to earlier GPU generations like Ampere. On an **Ampere** GPU, the boot verification chain involves multiple Falcon engines and multiple ucode stages (see falcon.rst for details):: Hardware BROM (SEC2) -> HS Booter (SEC2) -> LS GSP-RM (GSP) The driver must extract ucode from VBIOS, manage SEC2 and GSP, and orchestrate the Booter to load GSP-RM. This involves FWSEC-FRTS, devinit, and the Booter stages. On **Hopper/Blackwell** GPUs, FSP replaces this multi-stage process with a single message-driven interface:: FSP (hardware root of trust, boots from ROM) -> FMC (Falcon Microcontroller, verified by FSP) -> GSP-RM (verified and loaded by FMC) The driver only needs to: 1. Wait for FSP to complete its own secure boot (polling a scratch register). 2. Send a Chain of Trust (COT) message to FSP with the FMC firmware location, cryptographic signatures, and GSP boot parameters. 3. FSP authenticates the FMC firmware and boots it, FMC in turn loads GSP-RM. There is no SEC2 involvement, no Booter ucode, and no FWSEC-FRTS stage. The entire secure boot is driven by a single FSP message exchange. Chain of Trust (COT) protocol ============================= The Chain of Trust establishes a cryptographically enforced boot sequence, ensuring the GPU reaches a known, trusted state. The driver communicates with FSP using a message queue (Falcon MSGQ interface). Each message consists of an MCTP (Management Component Transport Protocol) transport header and an NVDM (NVIDIA Vendor Defined Message) header, followed by a protocol-specific payload. For Chain of Trust, the payload includes: - The system memory address of the FMC firmware image. - Cryptographic material: a SHA-384 hash, RSA-3K public key, and RSA-3K signature extracted from the FMC ELF firmware. - FRTS (Firmware Runtime Services) region information (vidmem offset and size). - The system memory address of the GSP boot arguments structure. FSP verifies the signature against the provided public key and hash, and if verification succeeds, boots the FMC. The FMC then authenticates and launches GSP-RM. The message flow is:: nova-core FSP | | | 1. Poll scratch register | | (wait for FSP boot complete) | | | | 2. COT message ------------> | | (FMC addr, signatures, | | boot params) | | | | |--- Verify FMC signature | |--- Boot FMC | |--- FMC loads GSP-RM | | | 3. COT response <------------ | | (success/error) | | | FSP message format ================== All FSP messages share a common header format consisting of two 32-bit words: **MCTP header** (Management Component Transport Protocol): - Bit 31: SOM (Start of Message) - Bit 30: EOM (End of Message) - Bits 29:28: Packet sequence number - Bits 23:16: Source Endpoint ID **NVDM header** (NVIDIA Vendor Defined Message): - Bits 6:0: MCTP message type (0x7e = vendor-defined PCI) - Bits 23:8: PCI vendor ID (0x10de = NVIDIA) - Bits 31:24: NVDM type (0x14 = COT, 0x13 = PRC, 0x15 = FSP response) PRC (Product Reconfiguration Control) protocol =============================================== PRC is an API system exposed through FSP's Management Partition that allows querying and modifying device configuration without firmware updates. Configuration parameters are called "knobs". Each knob has a unique object ID and controls a specific device behavior. Examples include vGPU mode, ECC enable, confidential computing mode, and NVLINK configuration. Each knob has two values: - **Active**: the currently effective value for this boot cycle. - **Persistent**: the value stored in InfoROM, applied on subsequent boots. The nova-core driver uses PRC to read the vGPU mode knob (object ID 0x29) during early boot, before firmware loading, to determine whether the GPU should operate in vGPU mode. The PRC message format follows the same MCTP/NVDM header structure as COT, with NVDM type 0x13. The payload contains: - A sub-command (e.g., 0x0c for read). - Flags indicating which value to read (bit 0 = persistent, bit 1 = active). - The knob object ID. The response includes the common FSP response header (with error status) followed by the knob's 16-bit state value.