From 36948b2c48248b6a17f3eded2edf51ad8d411088 Mon Sep 17 00:00:00 2001 From: Philipp Stanner Date: Fri, 13 Jun 2025 13:50:05 +0200 Subject: [PATCH 1/2] Users: Nova: Add architecture PNG image The documentation for Nova should be updated. To prepare for that, add an architecture overview image. Signed-off-by: Philipp Stanner --- src/nova-core-vm.png | Bin 0 -> 51065 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 src/nova-core-vm.png diff --git a/src/nova-core-vm.png b/src/nova-core-vm.png new file mode 100644 index 0000000000000000000000000000000000000000..7f38bebc969aa82290116e3db559c799333910fb GIT binary patch literal 51065 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 Date: Fri, 13 Jun 2025 13:51:25 +0200 Subject: [PATCH 2/2] Users: Nova: Update documentation The current documentation for the RfL-User "Nova" is more than one year old and quite outdated. Update the Nova documentation. Signed-off-by: Philipp Stanner --- src/Nova-GPU-Driver.md | 114 ++++++++++++++++++++++++++++------------- 1 file changed, 79 insertions(+), 35 deletions(-) diff --git a/src/Nova-GPU-Driver.md b/src/Nova-GPU-Driver.md index d3aa338..439bebf 100644 --- a/src/Nova-GPU-Driver.md +++ b/src/Nova-GPU-Driver.md @@ -1,62 +1,106 @@ # Nova GPU Driver -Nova is a driver for GSP-based Nvidia GPUs that is currently under development -and is being written in Rust. +Nova is a driver for GSP (GPU system processor) based Nvidia GPUs. It is +intended to become the successor of Nouveau as the mainline driver for Nvidia +(GSP) GPUs in Linux. -Currently, the objective is to upstream Rust abstractions for the relevant -subsystems a prerequisite for the actual driver. Hence, the first mainline -version of Nova will be a stub driver which helps establishing the necessary -infrastructure in other subsystems (notably PCI and DRM). +It will support all Nvidia GPUs beginning with the GeForce RTX20 (Turing family) +series and newer. ## Contact -To contact the team and / or participate in development, please use the mailing -list: nouveau@lists.freedesktop.org +Available communication channels are: + +- The mailing list: nouveau@lists.freedesktop.org +- IRC: #nouveau on OFTC +- [Zulip Chat](https://rust-for-linux.zulipchat.com/#narrow/channel/509436-Nova) ## Resources -- [Official Source Tree](https://gitlab.freedesktop.org/drm/nova) -- [Announcement E-Mail](https://lore.kernel.org/dri-devel/Zfsj0_tb-0-tNrJy@cassiopeiae/) +The parts that are already in mainline Linux can be found in +`drivers/gpu/nova-core/` and `drivers/gpu/drm/nova/` + +The development repository for the in-tree driver is located on +[Freedesktop](https://gitlab.freedesktop.org/drm/nova). + + +## Background + +### Why a new driver? + +Nouveau was, for the most part, designed for pre-GSP hardware. The driver exists +since ~2009 and its authors back in the day had to reverse engineer a lot about +the hardware's internals, resulting in a relatively difficult to maintain +codebase. + +Moreover, Nouveau's maintainers concluded that a new driver, exclusively for +GSP hardware, would allow for significantly simplifying the driver design: Most +of the hardware internals that Nouveau had to reverse engineer reside in the +GSP firmware. Hereby, the GSP takes up the role of a hardware abstraction layer +which communicates with the host kernel through IPC. Thereby, a lot of the +stack's complexity is moved from the GPU driver into the GSP firmware. + +This, in consequence, enables better maintainability. Another chance with a new +driver is to obtain active community participation from the very beginning. + -In the source tree, the driver lives in `drivers/gpu/drm/nova`. +### Why write it in Rust? +Rust's most desired feature are its guarantees for memory safety, notably the +elimination of Use-after-Free errors. Those are errors GPU drivers suffer from +significantly, because GPUs are, by definition, asynchronous in regards to the +CPU and can handle a great many jobs (i.e., memory objects) simultaneously. +Jobs' status can be changed at different places in the code base at different +points in time (through work items, interrupt handlers, userspace calls, ...). -## Status +In short, GPU drivers were expected to profit the most from the promised memory +safety. -Currently, Nova is just a stub driver intended to lift the bindings necessary -for a real GPU driver into the (mainline) kernel. +Since Nova is a freshly written new driver, it was an opportunity to try to +leverage the advantages of Rust and obtain a more reliable, maintainable driver. -Currently, those efforts are mostly focused on getting bindings for PCI, DRM -and the Device (driver) model upstream. +Besides Rust's built-in ownership and lifetime model, its powerful type system +allows us to avoid a large portion of a whole class of bugs (i.e. memory safety +bugs). -It can be expected that, as the driver continues to grow, various other abstractions -will be needed. +Additionally, the same features allow us to model APIs in a way that also +certain logic errors can be caught at compile time already. +## Architecture -## Utilized Common Rust Infrastructure +![Nova Architecture with vGPUs](./nova-core-vm.png) -Nova depends on the Rust for Linux `staging/*` [branches](Branches.md). +The overall GPU driver is split into two parts: +1. "Nova-Core", living in `drivers/gpu/nova-core/`. Nova-Core implements + the fundamental interaction with the hardware (through PCI etc.) and, + notably, boots up the GSP and interacts with it through a command queue. +2. "Nova-DRM" (the official name is actually just "Nova", but to avoid + confusion developers usually call it "Nova-DRM"), living in + `drivers/gpu/drm/nova/`. This is the actual graphics driver, + implementing all the typical DRM interfaces for userspace. -## Contributing +This split architecture allows for virtualizing GPUs: Nova-Core can be used to +instruct the GPU's firmware to spawn a new PCI virtual function (Through +[SR-IOV](https://docs.kernel.org/PCI/pci-iov-howto.html)), thus +creating new PCI virtual functions), which can then be passed to a virtual +machine, which then, for example, can run another Linux with another Nova-Core +bound to the virtual GPU. Then, on top, Nova-DRM can be utilized as a +conventional GPU driver to use the vGPU. -As with every real open source program, help and participation is highly welcome! +Of course, it is also possible to use Nova-Core + Nova-DRM on one physical +machine, then directly using the GPU through Mesa in the host's userspace. -As the driver is very young, however, it is currently difficult to assign tasks -to people. Many things still have to settle until a steadily paced workflow -produces atomic work topics a new one can work on. +For more details about vGPUs, take a look at +[Zhi's announcement email](https://lore.kernel.org/nouveau/20240922124951.1946072-1-zhiw@nvidia.com/). -If you really want to jump in immediately regardless, here are a few things you -can consider: -- Most work to do right now is with more bindings for Rust. Notably, this - includes the device driver model, DRM and PCI. If you have expertise there, - have a look at the existing code in the [topic branches](Branches.md) and see - if there's something you can add or improve. -- Feel free to go over Nova's code base and make suggestions or send patches, - for example for improved comments, grammar fixes, improving code readability - etc. +## Status and Contributing +The necessary Rust infrastructure has been progressing a lot. Current work now +focuses more on the actual driver. In case you want to contribute, take a look +at the +[NOVA TODO List](https://docs.kernel.org/gpu/nova/core/todo.html). -Happy hacking! +Don't hesitate reaching out on the aforementioned community channels.