€•FeŒsphinx.addnodes”Œdocument”“”)”}”(Œ rawsource”Œ”Œchildren”]”(Œ translations”Œ LanguagesNode”“”)”}”(hhh]”(hŒ pending_xref”“”)”}”(hhh]”Œdocutils.nodes”ŒText”“”ŒChinese (Simplified)”…””}”Œparent”hsbaŒ attributes”}”(Œids”]”Œclasses”]”Œnames”]”Œdupnames”]”Œbackrefs”]”Œ refdomain”Œstd”Œreftype”Œdoc”Œ reftarget”Œ(/translations/zh_CN/gpu/nova/core/falcon”Œmodname”NŒ classname”NŒ refexplicit”ˆuŒtagname”hhh ubh)”}”(hhh]”hŒChinese (Traditional)”…””}”hh2sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ(/translations/zh_TW/gpu/nova/core/falcon”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒItalian”…””}”hhFsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ(/translations/it_IT/gpu/nova/core/falcon”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒJapanese”…””}”hhZsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ(/translations/ja_JP/gpu/nova/core/falcon”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒKorean”…””}”hhnsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ(/translations/ko_KR/gpu/nova/core/falcon”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒSpanish”…””}”hh‚sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ(/translations/sp_SP/gpu/nova/core/falcon”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubeh}”(h]”h ]”h"]”h$]”h&]”Œcurrent_language”ŒEnglish”uh1h hhŒ _document”hŒsource”NŒline”NubhŒcomment”“”)”}”(hŒ SPDX-License-Identifier: GPL-2.0”h]”hŒ SPDX-License-Identifier: GPL-2.0”…””}”hh£sbah}”(h]”h ]”h"]”h$]”h&]”Œ xml:space”Œpreserve”uh1h¡hhhžhhŸŒB/var/lib/git/docbuild/linux/Documentation/gpu/nova/core/falcon.rst”h KubhŒsection”“”)”}”(hhh]”(hŒtitle”“”)”}”(hŒFalcon (FAst Logic Controller)”h]”hŒFalcon (FAst Logic Controller)”…””}”(hh»hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h¹hh¶hžhhŸh³h KubhŒ paragraph”“”)”}”(hXiThe following sections describe the Falcon core and the ucode running on it. The descriptions are based on the Ampere GPU or earlier designs; however, they should mostly apply to future designs as well, but everything is subject to change. The overview provided here is mainly tailored towards understanding the interactions of nova-core driver with the Falcon.”h]”hXiThe following sections describe the Falcon core and the ucode running on it. The descriptions are based on the Ampere GPU or earlier designs; however, they should mostly apply to future designs as well, but everything is subject to change. The overview provided here is mainly tailored towards understanding the interactions of nova-core driver with the Falcon.”…””}”(hhËhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÉhŸh³h Khh¶hžhubhÊ)”}”(hXuNVIDIA GPUs embed small RISC-like microcontrollers called Falcon cores, which handle secure firmware tasks, initialization, and power management. Modern NVIDIA GPUs may have multiple such Falcon instances (e.g., GSP (the GPU system processor) and SEC2 (the security engine)) and also may integrate a RISC-V core. This core is capable of running both RISC-V and Falcon code.”h]”hXuNVIDIA GPUs embed small RISC-like microcontrollers called Falcon cores, which handle secure firmware tasks, initialization, and power management. Modern NVIDIA GPUs may have multiple such Falcon instances (e.g., GSP (the GPU system processor) and SEC2 (the security engine)) and also may integrate a RISC-V core. This core is capable of running both RISC-V and Falcon code.”…””}”(hhÙhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÉhŸh³h K hh¶hžhubhÊ)”}”(hŒwThe code running on the Falcon cores is also called 'ucode', and will be referred to as such in the following sections.”h]”hŒ{The code running on the Falcon cores is also called ‘ucode’, and will be referred to as such in the following sections.”…””}”(hhçhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÉhŸh³h Khh¶hžhubhÊ)”}”(hXFalcons have separate instruction and data memories (IMEM/DMEM) and provide a small DMA engine (via the FBIF - "Frame Buffer Interface") to load code from system memory. The nova-core driver must reset and configure the Falcon, load its firmware via DMA, and start its CPU.”h]”hXFalcons have separate instruction and data memories (IMEM/DMEM) and provide a small DMA engine (via the FBIF - “Frame Buffer Interfaceâ€) to load code from system memory. The nova-core driver must reset and configure the Falcon, load its firmware via DMA, and start its CPU.”…””}”(hhõhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÉhŸh³h Khh¶hžhubhµ)”}”(hhh]”(hº)”}”(hŒFalcon security levels”h]”hŒFalcon security levels”…””}”(hjhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h¹hjhžhhŸh³h KubhÊ)”}”(hŒRFalcons can run in Non-secure (NS), Light Secure (LS), or Heavy Secure (HS) modes.”h]”hŒRFalcons can run in Non-secure (NS), Light Secure (LS), or Heavy Secure (HS) modes.”…””}”(hjhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÉhŸh³h Khjhžhubhµ)”}”(hhh]”(hº)”}”(hŒ8Heavy Secured (HS) also known as Privilege Level 3 (PL3)”h]”hŒ8Heavy Secured (HS) also known as Privilege Level 3 (PL3)”…””}”(hj%hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h¹hj"hžhhŸh³h K ubhÊ)”}”(hXòHS ucode is the most trusted code and has access to pretty much everything on the chip. The HS binary includes a signature in it which is verified at boot. This signature verification is done by the hardware itself, thus establishing a root of trust. For example, the FWSEC-FRTS command (see fwsec.rst) runs on the GSP in HS mode. FRTS, which involves setting up and loading content into the WPR (Write Protect Region), has to be done by the HS ucode and cannot be done by the host CPU or LS ucode.”h]”hXòHS ucode is the most trusted code and has access to pretty much everything on the chip. The HS binary includes a signature in it which is verified at boot. This signature verification is done by the hardware itself, thus establishing a root of trust. For example, the FWSEC-FRTS command (see fwsec.rst) runs on the GSP in HS mode. FRTS, which involves setting up and loading content into the WPR (Write Protect Region), has to be done by the HS ucode and cannot be done by the host CPU or LS ucode.”…””}”(hj3hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÉhŸh³h K!hj"hžhubeh}”(h]”Œ4heavy-secured-hs-also-known-as-privilege-level-3-pl3”ah ]”h"]”Œ8heavy secured (hs) also known as privilege level 3 (pl3)”ah$]”h&]”uh1h´hjhžhhŸh³h K ubhµ)”}”(hhh]”(hº)”}”(hŒ5Light Secured (LS or PL2) and Non Secured (NS or PL0)”h]”hŒ5Light Secured (LS or PL2) and Non Secured (NS or PL0)”…””}”(hjLhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h¹hjIhžhhŸh³h K*ubhÊ)”}”(hXNThese modes are less secure than HS. Like HS, the LS or NS ucode binary also typically includes a signature in it. To load firmware in LS or NS mode onto a Falcon, another Falcon needs to be running in HS mode, which also establishes the root of trust. For example, in the case of an Ampere GPU, the CPU runs the "Booter" ucode in HS mode on the SEC2 Falcon, which then authenticates and runs the run-time GSP binary (GSP-RM) in LS mode on the GSP Falcon. Similarly, as an example, after reset on an Ampere, FWSEC runs on the GSP which then loads the devinit engine onto the PMU in LS mode.”h]”hXRThese modes are less secure than HS. Like HS, the LS or NS ucode binary also typically includes a signature in it. To load firmware in LS or NS mode onto a Falcon, another Falcon needs to be running in HS mode, which also establishes the root of trust. For example, in the case of an Ampere GPU, the CPU runs the “Booter†ucode in HS mode on the SEC2 Falcon, which then authenticates and runs the run-time GSP binary (GSP-RM) in LS mode on the GSP Falcon. Similarly, as an example, after reset on an Ampere, FWSEC runs on the GSP which then loads the devinit engine onto the PMU in LS mode.”…””}”(hjZhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÉhŸh³h K+hjIhžhubeh}”(h]”Œ1light-secured-ls-or-pl2-and-non-secured-ns-or-pl0”ah ]”h"]”Œ5light secured (ls or pl2) and non secured (ns or pl0)”ah$]”h&]”uh1h´hjhžhhŸh³h K*ubhµ)”}”(hhh]”(hº)”}”(hŒRoot of trust establishment”h]”hŒRoot of trust establishment”…””}”(hjshžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h¹hjphžhhŸh³h K5ubhÊ)”}”(hXeTo establish a root of trust, the code running on a Falcon must be immutable and hardwired into a read-only memory (ROM). This follows industry norms for verification of firmware. This code is called the Boot ROM (BROM). The nova-core driver on the CPU communicates with Falcon's Boot ROM through various Falcon registers prefixed with "BROM" (see regs.rs).”h]”hXkTo establish a root of trust, the code running on a Falcon must be immutable and hardwired into a read-only memory (ROM). This follows industry norms for verification of firmware. This code is called the Boot ROM (BROM). The nova-core driver on the CPU communicates with Falcon’s Boot ROM through various Falcon registers prefixed with “BROM†(see regs.rs).”…””}”(hjhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÉhŸh³h K6hjphžhubhÊ)”}”(hXAfter nova-core driver reads the necessary ucode from VBIOS, it programs the BROM and DMA registers to trigger the Falcon to load the HS ucode from the system memory into the Falcon's IMEM/DMEM. Once the HS ucode is loaded, it is verified by the Falcon's Boot ROM.”h]”hX After nova-core driver reads the necessary ucode from VBIOS, it programs the BROM and DMA registers to trigger the Falcon to load the HS ucode from the system memory into the Falcon’s IMEM/DMEM. Once the HS ucode is loaded, it is verified by the Falcon’s Boot ROM.”…””}”(hjhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÉhŸh³h K HS ucode -> LS/NS ucode. ”h]”(hŒterm”“”)”}”(hŒ6The root of trust is therefore established as follows:”h]”hŒ6The root of trust is therefore established as follows:”…””}”(hj¸hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¶hŸh³h KGhj²ubhŒ definition”“”)”}”(hhh]”hÊ)”}”(hŒEHardware (Boot ROM running on the Falcon) -> HS ucode -> LS/NS ucode.”h]”hŒEHardware (Boot ROM running on the Falcon) -> HS ucode -> LS/NS ucode.”…””}”(hjËhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÉhŸh³h KGhjÈubah}”(h]”h ]”h"]”h$]”h&]”uh1jÆhj²ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j°hŸh³h KGhj­ubj±)”}”(hŒÆOn an Ampere GPU, for example, the boot verification flow is: Hardware (Boot ROM running on the SEC2) -> HS ucode (Booter running on the SEC2) -> LS ucode (GSP-RM running on the GSP) ”h]”(j·)”}”(hŒ=On an Ampere GPU, for example, the boot verification flow is:”h]”hŒ=On an Ampere GPU, for example, the boot verification flow is:”…””}”(hjéhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¶hŸh³h KLhjåubjÇ)”}”(hhh]”j¬)”}”(hhh]”j±)”}”(hŒ~Hardware (Boot ROM running on the SEC2) -> HS ucode (Booter running on the SEC2) -> LS ucode (GSP-RM running on the GSP) ”h]”(j·)”}”(hŒ*Hardware (Boot ROM running on the SEC2) ->”h]”hŒ*Hardware (Boot ROM running on the SEC2) ->”…””}”(hjhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¶hŸh³h KLhjýubjÇ)”}”(hhh]”j¬)”}”(hhh]”j±)”}”(hŒNHS ucode (Booter running on the SEC2) -> LS ucode (GSP-RM running on the GSP) ”h]”(j·)”}”(hŒ(HS ucode (Booter running on the SEC2) ->”h]”hŒ(HS ucode (Booter running on the SEC2) ->”…””}”(hjhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¶hŸh³h KLhjubjÇ)”}”(hhh]”hÊ)”}”(hŒ$LS ucode (GSP-RM running on the GSP)”h]”hŒ$LS ucode (GSP-RM running on the GSP)”…””}”(hj*hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÉhŸh³h KLhj'ubah}”(h]”h ]”h"]”h$]”h&]”uh1jÆhjubeh}”(h]”h ]”h"]”h$]”h&]”uh1j°hŸh³h KLhjubah}”(h]”h ]”h"]”h$]”h&]”uh1j«hjubah}”(h]”h ]”h"]”h$]”h&]”uh1jÆhjýubeh}”(h]”h ]”h"]”h$]”h&]”uh1j°hŸh³h KLhjúubah}”(h]”h ]”h"]”h$]”h&]”uh1j«hj÷ubah}”(h]”h ]”h"]”h$]”h&]”uh1jÆhjåubeh}”(h]”h ]”h"]”h$]”h&]”uh1j°hŸh³h KLhj­hžhubeh}”(h]”h ]”h"]”h$]”h&]”uh1j«hjphžhhŸh³h NubhŒnote”“”)”}”(hX=While the CPU can load HS ucode onto a Falcon microcontroller and have it verified by the hardware and run, the CPU itself typically does not load LS or NS ucode and run it. Loading of LS or NS ucode is done mainly by the HS ucode. For example, on an Ampere GPU, after the Booter ucode runs on the SEC2 in HS mode and loads the GSP-RM binary onto the GSP, it needs to run the "SEC2-RTOS" ucode at runtime. This presents a problem: there is no component to load the SEC2-RTOS ucode onto the SEC2. The CPU cannot load LS code, and GSP-RM must run in LS mode. To overcome this, the GSP is temporarily made to run HS ucode (which is itself loaded by the CPU via the nova-core driver using a "GSP-provided sequencer") which then loads the SEC2-RTOS ucode onto the SEC2 in LS mode. The GSP then resumes running its own GSP-RM LS ucode.”h]”hÊ)”}”(hX=While the CPU can load HS ucode onto a Falcon microcontroller and have it verified by the hardware and run, the CPU itself typically does not load LS or NS ucode and run it. Loading of LS or NS ucode is done mainly by the HS ucode. For example, on an Ampere GPU, after the Booter ucode runs on the SEC2 in HS mode and loads the GSP-RM binary onto the GSP, it needs to run the "SEC2-RTOS" ucode at runtime. This presents a problem: there is no component to load the SEC2-RTOS ucode onto the SEC2. The CPU cannot load LS code, and GSP-RM must run in LS mode. To overcome this, the GSP is temporarily made to run HS ucode (which is itself loaded by the CPU via the nova-core driver using a "GSP-provided sequencer") which then loads the SEC2-RTOS ucode onto the SEC2 in LS mode. The GSP then resumes running its own GSP-RM LS ucode.”h]”hXEWhile the CPU can load HS ucode onto a Falcon microcontroller and have it verified by the hardware and run, the CPU itself typically does not load LS or NS ucode and run it. Loading of LS or NS ucode is done mainly by the HS ucode. For example, on an Ampere GPU, after the Booter ucode runs on the SEC2 in HS mode and loads the GSP-RM binary onto the GSP, it needs to run the “SEC2-RTOS†ucode at runtime. This presents a problem: there is no component to load the SEC2-RTOS ucode onto the SEC2. The CPU cannot load LS code, and GSP-RM must run in LS mode. To overcome this, the GSP is temporarily made to run HS ucode (which is itself loaded by the CPU via the nova-core driver using a “GSP-provided sequencerâ€) which then loads the SEC2-RTOS ucode onto the SEC2 in LS mode. The GSP then resumes running its own GSP-RM LS ucode.”…””}”(hjthžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÉhŸh³h KOhjpubah}”(h]”h ]”h"]”h$]”h&]”uh1jnhjphžhhŸh³h Nubeh}”(h]”Œroot-of-trust-establishment”ah ]”h"]”Œroot of trust establishment”ah$]”h&]”uh1h´hjhžhhŸh³h K5ubeh}”(h]”Œfalcon-security-levels”ah ]”h"]”Œfalcon security levels”ah$]”h&]”uh1h´hh¶hžhhŸh³h Kubhµ)”}”(hhh]”(hº)”}”(hŒ&Falcon memory subsystem and DMA engine”h]”hŒ&Falcon memory subsystem and DMA engine”…””}”(hj›hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h¹hj˜hžhhŸh³h K]ubhÊ)”}”(hXFalcons have separate instruction and data memories (IMEM/DMEM) and contains a small DMA engine called FBDMA (Framebuffer DMA) which does DMA transfers to/from the IMEM/DMEM memory inside the Falcon via the FBIF (Framebuffer Interface), to external memory.”h]”hXFalcons have separate instruction and data memories (IMEM/DMEM) and contains a small DMA engine called FBDMA (Framebuffer DMA) which does DMA transfers to/from the IMEM/DMEM memory inside the Falcon via the FBIF (Framebuffer Interface), to external memory.”…””}”(hj©hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÉhŸh³h K^hj˜hžhubhÊ)”}”(hŒpDMA transfers are possible from the Falcon's memory to both the system memory and the framebuffer memory (VRAM).”h]”hŒrDMA transfers are possible from the Falcon’s memory to both the system memory and the framebuffer memory (VRAM).”…””}”(hj·hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÉhŸh³h Kchj˜hžhubhÊ)”}”(hŒÆTo perform a DMA via the FBDMA, the FBIF is configured to decide how the memory is accessed (also known as aperture type). In the nova-core driver, this is determined by the `FalconFbifTarget` enum.”h]”(hŒ®To perform a DMA via the FBDMA, the FBIF is configured to decide how the memory is accessed (also known as aperture type). In the nova-core driver, this is determined by the ”…””}”(hjÅhžhhŸNh NubhŒtitle_reference”“”)”}”(hŒ`FalconFbifTarget`”h]”hŒFalconFbifTarget”…””}”(hjÏhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÍhjÅubhŒ enum.”…””}”(hjÅhžhhŸNh Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÉhŸh³h Kfhj˜hžhubhÊ)”}”(hŒ‚The IO-PMP block (Input/Output Physical Memory Protection) unit in the Falcon controls access by the FBDMA to the external memory.”h]”hŒ‚The IO-PMP block (Input/Output Physical Memory Protection) unit in the Falcon controls access by the FBDMA to the external memory.”…””}”(hjçhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÉhŸh³h Kjhj˜hžhubhÊ)”}”(hŒUConceptual diagram (not exact) of the Falcon and its memory subsystem is as follows::”h]”hŒTConceptual diagram (not exact) of the Falcon and its memory subsystem is as follows:”…””}”(hjõhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÉhŸh³h Kmhj˜hžhubhŒ literal_block”“”)”}”(hXâ External Memory (Framebuffer / System DRAM) ^ | | | | v +-----------------------------------------------------+ | | | | +---------------+ | | | | FBIF |-------+ | FALCON | | (FrameBuffer | Memory Interface | PROCESSOR | | InterFace) | | | | Apertures | | | | Configures | | | | mem access | | | +-------^-------+ | | | | | | FBDMA uses configured FBIF apertures | | | to access External Memory | | | +-------v--------+ +---------------+ | | FBDMA | cfg | RISC | | | (FrameBuffer |<---->| CORE |----->. Direct Core Access | | DMA Engine) | | | | | | - Master dev. | | (can run both | | | +-------^--------+ | Falcon and | | | | cfg--->| RISC-V code) | | | | / | | | | | | +---------------+ | +------------+ | | | | | BROM | | | | <--->| (Boot ROM) | | | / | +------------+ | | v | | +---------------+ | | | IO-PMP | Controls access by FBDMA | | | (IO Physical | and other IO Masters | | | Memory Protect) | | +-------^-------+ | | | | | | Protected Access Path for FBDMA | | v | | +---------------------------------------+ | | | Memory | | | | +---------------+ +------------+ | | | | | IMEM | | DMEM | |<-----+ | | | (Instruction | | (Data | | | | | Memory) | | Memory) | | | | +---------------+ +------------+ | | +---------------------------------------+ +-----------------------------------------------------+”h]”hXâ External Memory (Framebuffer / System DRAM) ^ | | | | v +-----------------------------------------------------+ | | | | +---------------+ | | | | FBIF |-------+ | FALCON | | (FrameBuffer | Memory Interface | PROCESSOR | | InterFace) | | | | Apertures | | | | Configures | | | | mem access | | | +-------^-------+ | | | | | | FBDMA uses configured FBIF apertures | | | to access External Memory | | | +-------v--------+ +---------------+ | | FBDMA | cfg | RISC | | | (FrameBuffer |<---->| CORE |----->. Direct Core Access | | DMA Engine) | | | | | | - Master dev. | | (can run both | | | +-------^--------+ | Falcon and | | | | cfg--->| RISC-V code) | | | | / | | | | | | +---------------+ | +------------+ | | | | | BROM | | | | <--->| (Boot ROM) | | | / | +------------+ | | v | | +---------------+ | | | IO-PMP | Controls access by FBDMA | | | (IO Physical | and other IO Masters | | | Memory Protect) | | +-------^-------+ | | | | | | Protected Access Path for FBDMA | | v | | +---------------------------------------+ | | | Memory | | | | +---------------+ +------------+ | | | | | IMEM | | DMEM | |<-----+ | | | (Instruction | | (Data | | | | | Memory) | | Memory) | | | | +---------------+ +------------+ | | +---------------------------------------+ +-----------------------------------------------------+”…””}”hjsbah}”(h]”h ]”h"]”h$]”h&]”h±h²uh1jhŸh³h Kohj˜hžhubeh}”(h]”Œ&falcon-memory-subsystem-and-dma-engine”ah ]”h"]”Œ&falcon memory subsystem and dma engine”ah$]”h&]”uh1h´hh¶hžhhŸh³h K]ubeh}”(h]”Œfalcon-fast-logic-controller”ah ]”h"]”Œfalcon (fast logic controller)”ah$]”h&]”uh1h´hhhžhhŸh³h Kubeh}”(h]”h ]”h"]”h$]”h&]”Œsource”h³uh1hŒcurrent_source”NŒ current_line”NŒsettings”Œdocutils.frontend”ŒValues”“”)”}”(h¹NŒ generator”NŒ datestamp”NŒ source_link”NŒ source_url”NŒ toc_backlinks”Œentry”Œfootnote_backlinks”KŒ sectnum_xform”KŒstrip_comments”NŒstrip_elements_with_classes”NŒ strip_classes”NŒ report_level”KŒ halt_level”KŒexit_status_level”KŒdebug”NŒwarning_stream”NŒ traceback”ˆŒinput_encoding”Œ utf-8-sig”Œinput_encoding_error_handler”Œstrict”Œoutput_encoding”Œutf-8”Œoutput_encoding_error_handler”jFŒerror_encoding”Œutf-8”Œerror_encoding_error_handler”Œbackslashreplace”Œ language_code”Œen”Œrecord_dependencies”NŒconfig”NŒ id_prefix”hŒauto_id_prefix”Œid”Œ dump_settings”NŒdump_internals”NŒdump_transforms”NŒdump_pseudo_xml”NŒexpose_internals”NŒstrict_visitor”NŒ_disable_config”NŒ_source”h³Œ _destination”NŒ _config_files”]”Œ7/var/lib/git/docbuild/linux/Documentation/docutils.conf”aŒfile_insertion_enabled”ˆŒ raw_enabled”KŒline_length_limit”M'Œpep_references”NŒ pep_base_url”Œhttps://peps.python.org/”Œpep_file_url_template”Œpep-%04d”Œrfc_references”NŒ rfc_base_url”Œ&https://datatracker.ietf.org/doc/html/”Œ tab_width”KŒtrim_footnote_reference_space”‰Œsyntax_highlight”Œlong”Œ smart_quotes”ˆŒsmartquotes_locales”]”Œcharacter_level_inline_markup”‰Œdoctitle_xform”‰Œ docinfo_xform”KŒsectsubtitle_xform”‰Œ image_loading”Œlink”Œembed_stylesheet”‰Œcloak_email_addresses”ˆŒsection_self_link”‰Œenv”NubŒreporter”NŒindirect_targets”]”Œsubstitution_defs”}”Œsubstitution_names”}”Œrefnames”}”Œrefids”}”Œnameids”}”(j jj•j’jFjCjmjjjjŠjjuŒ nametypes”}”(j ‰j•‰jF‰jm‰j‰j‰uh}”(jh¶j’jjCj"jjjIjŠjpjj˜uŒ footnote_refs”}”Œ citation_refs”}”Œ autofootnotes”]”Œautofootnote_refs”]”Œsymbol_footnotes”]”Œsymbol_footnote_refs”]”Œ footnotes”]”Œ citations”]”Œautofootnote_start”KŒsymbol_footnote_start”KŒ id_counter”Œ collections”ŒCounter”“”}”…”R”Œparse_messages”]”Œtransform_messages”]”Œ transformer”NŒ include_log”]”Œ decoration”Nhžhub.