Hi everyone, Second revision of this continuation of my previous RFCs [1] to complete the first step of GSP booting (running the FWSEC-FRTS firmware extracted from the BIOS) on Ampere devices. Thanks for all the feedback on the first version.
While this series is still far from bringing the GPU into a state where it can do anything useful, it sets up the basic layout of the driver upon which we can build in order to continue with the next steps of GSP booting, as well as supporting more chipsets. Upon successful probe, the driver will display the range of the WPR2 region constructed by FWSEC-FRTS: [ 95.436000] NovaCore 0000:01:00.0: WPR2: 0xffc00000-0xffce0000 [ 95.436002] NovaCore 0000:01:00.0: GPU instance built This code is based on nova-next with the try_access_with patch [2]. There are bits of documentation still missing, these are addressed by Joel in his own documentation patch series. I'll also double-check and send follow-up patches if anything is still missing after that. I have also tried to look at ways to split the patch adding falcon support, but couldn't find any that would not be awkward. Starting review from `falcon.rs` and going down to the HAL should be the logical order for a smooth review. [1] https://lore.kernel.org/rust-for-linux/20250320-nova_timer-v3-0-79aa2ad25...@nvidia.com/ [2] https://lore.kernel.org/rust-for-linux/20250411-try_with-v4-0-f470ac79e...@nvidia.com/ [3] https://lore.kernel.org/lkml/20250423192857.199712-1-fujita.tomon...@gmail.com/ Signed-off-by: Alexandre Courbot <acour...@nvidia.com> --- Changes in v2: - Rebased on latest nova-next. - Fixed all clippy warnings. - Added `count` and `size` methods to `CoherentAllocation`. - Added method to obtain a reference to the `Device` from a `Devres` (this is super convenient). - Split `DmaObject` into its own patch and added `Deref` implementation. - Squashed field names from [3] into "extract FWSEC from BIOS". - Fixed erroneous use of `ERANGE` error. - Reworked `register!()` macro towards a more intuitive syntax, moved its helper macros into internal rules to avoid polluting the macro namespace. - Renamed all registers to capital snake case to better match OpenRM. - Removed declarations for registers that are not used yet. - Added more documentation for items not covered by Joel's documentation patches. - Removed timer device and replaced it with a helper function using `Ktime`. This also made [4] unneeded so it is dropped. - Unregister the sysmem flush page upon device destruction. - ... probably more that I forgot. >_< - Link to v1: https://lore.kernel.org/r/20250420-nova-frts-v1-0-ecd1cca23...@nvidia.com [3] https://lore.kernel.org/all/20250423225405.139613-6-joelagn...@nvidia.com/ [4] https://lore.kernel.org/lkml/20250420-nova-frts-v1-1-ecd1cca23...@nvidia.com/ --- Alexandre Courbot (19): rust: devres: allow to borrow a reference to the resource's Device rust: dma: expose the count and size of CoherentAllocation gpu: nova-core: derive useful traits for Chipset gpu: nova-core: add missing GA100 definition gpu: nova-core: take bound device in Gpu::new gpu: nova-core: define registers layout using helper macro gpu: nova-core: fix layout of NV_PMC_BOOT_0 gpu: nova-core: introduce helper macro for register access gpu: nova-core: move Firmware to firmware module rust: make ETIMEDOUT error available gpu: nova-core: wait for GFW_BOOT completion gpu: nova-core: add DMA object struct gpu: nova-core: register sysmem flush page gpu: nova-core: add helper function to wait on condition gpu: nova-core: add falcon register definitions and base code gpu: nova-core: firmware: add ucode descriptor used by FWSEC-FRTS gpu: nova-core: compute layout of the FRTS region gpu: nova-core: extract FWSEC from BIOS and patch it to run FWSEC-FRTS gpu: nova-core: load and run FWSEC-FRTS Joel Fernandes (2): rust: num: Add an upward alignment helper for usize nova-core: Add support for VBIOS ucode extraction for boot Documentation/gpu/nova/core/todo.rst | 6 + drivers/gpu/nova-core/devinit.rs | 43 ++ drivers/gpu/nova-core/dma.rs | 57 ++ drivers/gpu/nova-core/driver.rs | 2 +- drivers/gpu/nova-core/falcon.rs | 543 ++++++++++++++ drivers/gpu/nova-core/falcon/gsp.rs | 25 + drivers/gpu/nova-core/falcon/hal.rs | 55 ++ drivers/gpu/nova-core/falcon/hal/ga102.rs | 115 +++ drivers/gpu/nova-core/falcon/sec2.rs | 8 + drivers/gpu/nova-core/firmware.rs | 105 ++- drivers/gpu/nova-core/firmware/fwsec.rs | 360 +++++++++ drivers/gpu/nova-core/gpu.rs | 223 ++++-- drivers/gpu/nova-core/gsp.rs | 3 + drivers/gpu/nova-core/gsp/fb.rs | 109 +++ drivers/gpu/nova-core/nova_core.rs | 23 + drivers/gpu/nova-core/regs.rs | 259 +++++-- drivers/gpu/nova-core/regs/macros.rs | 380 ++++++++++ drivers/gpu/nova-core/util.rs | 29 + drivers/gpu/nova-core/vbios.rs | 1149 +++++++++++++++++++++++++++++ rust/kernel/devres.rs | 6 + rust/kernel/dma.rs | 14 + rust/kernel/error.rs | 1 + rust/kernel/lib.rs | 1 + rust/kernel/num.rs | 21 + 24 files changed, 3445 insertions(+), 92 deletions(-) --- base-commit: fc55584e00fc8409cbaef4bcd984016dca6f1b6b change-id: 20250417-nova-frts-96ef299abe2c Best regards, -- Alexandre Courbot <acour...@nvidia.com>