Re: [PATCH v3 2/2] gpu: nova-core: add initial documentation

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]<

 



On Thu, Feb 13, 2025 at 12:33:21AM +0000, Benno Lossin wrote:
> On 13.02.25 00:27, Alistair Popple wrote:
> > On Sun, Feb 09, 2025 at 06:30:25PM +0100, Danilo Krummrich wrote:
> > 
> > [...]
> > 
> >> +FromPrimitive API
> >> +-----------------
> >> +
> >> +Sometimes the need arises to convert a number to a value of an enum or a
> >> +structure.
> >> +
> >> +A good example from nova-core would be the ``Chipset`` enum type, which defines
> >> +the value ``AD102``. When probing the GPU the value ``0x192`` can be read from a
> >> +certain register indication the chipset AD102. Hence, the enum value ``AD102``
> >> +should be derived from the number ``0x192``. Currently, nova-core uses a custom
> >> +implementation (``Chipset::from_u32`` for this.
> >> +
> >> +Instead, it would be desirable to have something like the ``FromPrimitive``
> >> +trait [1] from the num crate.
> > 
> > I took a quick look at this, mainly to get more up to speed on Rust macros.
> > 
> > It seemed to me that bulk of the work here is actually in getting enough
> > functionality added to rust/macros/quote.rs to make writing procedural macros
> > pleasant. That seemed reasonably involved (probably beyond beginner level) and
> > not the most pressing thing so I'm not currently looking at it, but thought I'd
> > drop this note here in case it's useful for anyone else that is/wants to take
> > a look.
> 
> We're already aware of this and actively working on a solution.

Argh, great! Good to know.

> Note that we don't actually have to write this code ourselves, as it
> already exists in the user-space ecosystem in the form of the quote
> crate [1].
> Also, since this is a dependency of the macros kernel crate, its fine to
> use user-space rust, since proc-macros end up as "compiler plugins", so
> they run on the host and not inside of the kernel that is being built
> (so they also have access to std).
> The only problem is that we need access to quote and since we don't use
> cargo, it's not as easy as adding it as a dependency. Currently we're
> working on a solution that will give us not only the quote crate but
> also the syn crate [2] which will make building proc-macros feasible.
> 
> (Note that both crates are highly used in the Rust ecosystem and IIRC
> also the compiler depends on them. So it is not just any random Rust
> library that we would add to our dependencies.)

Of course, I was wondering why they weren't already included so many thanks for
filling me in on the background.

> [1]: https://crates.io/crates/quote
> [2]: https://crates.io/crates/syn
> 
> ---
> Cheers,
> Benno
> 
> > 
> >  - Alistair
> > 
> >> +Having this generalization also helps with implementing a generic macro that
> >> +automatically generates the corresponding mappings between a value and a number.
> >> +
> >> +| Complexity: Beginner
> >> +| Link: https://docs.rs/num/latest/num/trait.FromPrimitive.html
> >> +
> >> +Generic register abstraction
> >> +----------------------------
> >> +
> >> +Work out how register constants and structures can be automatically generated
> >> +through generalized macros.
> >> +
> >> +Example:
> >> +
> >> +.. code-block:: rust
> >> +
> >> +	register!(BOOT0, 0x0, u32, pci::Bar<SIZE>, Fields [
> >> +	   MINOR_REVISION(3:0, RO),
> >> +	   MAJOR_REVISION(7:4, RO),
> >> +	   REVISION(7:0, RO), // Virtual register combining major and minor rev.
> >> +	])
> >> +
> >> +This could expand to something like:
> >> +
> >> +.. code-block:: rust
> >> +
> >> +	const BOOT0_OFFSET: usize = 0x00000000;
> >> +	const BOOT0_MINOR_REVISION_SHIFT: u8 = 0;
> >> +	const BOOT0_MINOR_REVISION_MASK: u32 = 0x0000000f;
> >> +	const BOOT0_MAJOR_REVISION_SHIFT: u8 = 4;
> >> +	const BOOT0_MAJOR_REVISION_MASK: u32 = 0x000000f0;
> >> +	const BOOT0_REVISION_SHIFT: u8 = BOOT0_MINOR_REVISION_SHIFT;
> >> +	const BOOT0_REVISION_MASK: u32 = BOOT0_MINOR_REVISION_MASK | BOOT0_MAJOR_REVISION_MASK;
> >> +
> >> +	struct Boot0(u32);
> >> +
> >> +	impl Boot0 {
> >> +	   #[inline]
> >> +	   fn read(bar: &RevocableGuard<'_, pci::Bar<SIZE>>) -> Self {
> >> +	      Self(bar.readl(BOOT0_OFFSET))
> >> +	   }
> >> +
> >> +	   #[inline]
> >> +	   fn minor_revision(&self) -> u32 {
> >> +	      (self.0 & BOOT0_MINOR_REVISION_MASK) >> BOOT0_MINOR_REVISION_SHIFT
> >> +	   }
> >> +
> >> +	   #[inline]
> >> +	   fn major_revision(&self) -> u32 {
> >> +	      (self.0 & BOOT0_MAJOR_REVISION_MASK) >> BOOT0_MAJOR_REVISION_SHIFT
> >> +	   }
> >> +
> >> +	   #[inline]
> >> +	   fn revision(&self) -> u32 {
> >> +	      (self.0 & BOOT0_REVISION_MASK) >> BOOT0_REVISION_SHIFT
> >> +	   }
> >> +	}
> >> +
> >> +Usage:
> >> +
> >> +.. code-block:: rust
> >> +
> >> +	let bar = bar.try_access().ok_or(ENXIO)?;
> >> +
> >> +	let boot0 = Boot0::read(&bar);
> >> +	pr_info!("Revision: {}\n", boot0.revision());
> >> +
> >> +| Complexity: Advanced
> >> +
> >> +Delay / Sleep abstractions
> >> +--------------------------
> >> +
> >> +Rust abstractions for the kernel's delay() and sleep() functions.
> >> +
> >> +There is some ongoing work from FUJITA Tomonori [1], which has not seen any updates
> >> +since Oct. 24.
> >> +
> >> +| Complexity: Beginner
> >> +| Link: https://lore.kernel.org/netdev/20241001112512.4861-2-fujita.tomonori@xxxxxxxxx/ [1]
> >> +
> >> +IRQ abstractions
> >> +----------------
> >> +
> >> +Rust abstractions for IRQ handling.
> >> +
> >> +There is active ongoing work from Daniel Almeida [1] for the "core" abstractions
> >> +to request IRQs.
> >> +
> >> +Besides optional review and testing work, the required ``pci::Device`` code
> >> +around those core abstractions needs to be worked out.
> >> +
> >> +| Complexity: Intermediate
> >> +| Link: https://lore.kernel.org/lkml/20250122163932.46697-1-daniel.almeida@xxxxxxxxxxxxx/ [1]
> >> +| Contact: Daniel Almeida
> >> +
> >> +Page abstraction for foreign pages
> >> +----------------------------------
> >> +
> >> +Rust abstractions for pages not created by the Rust page abstraction without
> >> +direct ownership.
> >> +
> >> +There is active onging work from Abdiel Janulgue [1] and Lina [2].
> >> +
> >> +| Complexity: Advanced
> >> +| Link: https://lore.kernel.org/linux-mm/20241119112408.779243-1-abdiel.janulgue@xxxxxxxxx/ [1]
> >> +| Link: https://lore.kernel.org/rust-for-linux/20250202-rust-page-v1-0-e3170d7fe55e@xxxxxxxxxxxxx/ [2]
> >> +
> >> +Scatterlist / sg_table abstractions
> >> +-----------------------------------
> >> +
> >> +Rust abstractions for scatterlist / sg_table.
> >> +
> >> +There is preceding work from Abdiel Janulgue, which hasn't made it to the
> >> +mailing list yet.
> >> +
> >> +| Complexity: Intermediate
> >> +| Contact: Abdiel Janulgue
> >> +
> >> +ELF utils
> >> +---------
> >> +
> >> +Rust implementation of ELF header representation to retrieve section header
> >> +tables, names, and data from an ELF-formatted images.
> >> +
> >> +There is preceding work from Abdiel Janulgue, which hasn't made it to the
> >> +mailing list yet.
> >> +
> >> +| Complexity: Beginner
> >> +| Contact: Abdiel Janulgue
> >> +
> >> +PCI MISC APIs
> >> +-------------
> >> +
> >> +Extend the existing PCI device / driver abstractions by SR-IOV, config space,
> >> +capability, MSI API abstractions.
> >> +
> >> +| Complexity: Beginner
> >> +
> >> +Auxiliary bus abstractions
> >> +--------------------------
> >> +
> >> +Rust abstraction for the auxiliary bus APIs.
> >> +
> >> +This is needed to connect nova-core to the nova-drm driver.
> >> +
> >> +| Complexity: Intermediate
> >> +
> >> +Debugfs abstractions
> >> +--------------------
> >> +
> >> +Rust abstraction for debugfs APIs.
> >> +
> >> +| Reference: Export GSP log buffers
> >> +| Complexity: Intermediate
> >> +
> >> +Vec extensions
> >> +--------------
> >> +
> >> +Implement ``Vec::truncate`` and ``Vec::resize``.
> >> +
> >> +Currently this is used for some experimental code to parse the vBIOS.
> >> +
> >> +| Reference vBIOS support
> >> +| Complexity: Beginner
> >> +
> >> +GPU (general)
> >> +=============
> >> +
> >> +Parse firmware headers
> >> +----------------------
> >> +
> >> +Parse ELF headers from the firmware files loaded from the filesystem.
> >> +
> >> +| Reference: ELF utils
> >> +| Complexity: Beginner
> >> +| Contact: Abdiel Janulgue
> >> +
> >> +Build radix3 page table
> >> +-----------------------
> >> +
> >> +Build the radix3 page table to map the firmware.
> >> +
> >> +| Complexity: Intermediate
> >> +| Contact: Abdiel Janulgue
> >> +
> >> +vBIOS support
> >> +-------------
> >> +
> >> +Parse the vBIOS and probe the structures required for driver initialization.
> >> +
> >> +| Contact: Dave Airlie
> >> +| Reference: Vec extensions
> >> +| Complexity: Intermediate
> >> +
> >> +Initial Devinit support
> >> +-----------------------
> >> +
> >> +Implement BIOS Device Initialization, i.e. memory sizing, waiting, PLL
> >> +configuration.
> >> +
> >> +| Contact: Dave Airlie
> >> +| Complexity: Beginner
> >> +
> >> +Boot Falcon controller
> >> +----------------------
> >> +
> >> +Infrastructure to load and execute falcon (sec2) firmware images; handle the
> >> +GSP falcon processor and fwsec loading.
> >> +
> >> +| Complexity: Advanced
> >> +| Contact: Dave Airlie
> >> +
> >> +GPU Timer support
> >> +-----------------
> >> +
> >> +Support for the GPU's internal timer peripheral.
> >> +
> >> +| Complexity: Beginner
> >> +| Contact: Dave Airlie
> >> +
> >> +MMU / PT management
> >> +-------------------
> >> +
> >> +Work out the architecture for MMU / page table management.
> >> +
> >> +We need to consider that nova-drm will need rather fine-grained control,
> >> +especially in terms of locking, in order to be able to implement asynchronous
> >> +Vulkan queues.
> >> +
> >> +While generally sharing the corresponding code is desirable, it needs to be
> >> +evaluated how (and if at all) sharing the corresponding code is expedient.
> >> +
> >> +| Complexity: Expert
> >> +
> >> +VRAM memory allocator
> >> +---------------------
> >> +
> >> +Investigate options for a VRAM memory allocator.
> >> +
> >> +Some possible options:
> >> +  - Rust abstractions for
> >> +    - RB tree (interval tree) / drm_mm
> >> +    - maple_tree
> >> +  - native Rust collections
> >> +
> >> +| Complexity: Advanced
> >> +
> >> +Instance Memory
> >> +---------------
> >> +
> >> +Implement support for instmem (bar2) used to store page tables.
> >> +
> >> +| Complexity: Intermediate
> >> +| Contact: Dave Airlie
> >> +
> >> +GPU System Processor (GSP)
> >> +==========================
> >> +
> >> +Export GSP log buffers
> >> +----------------------
> >> +
> >> +Recent patches from Timur Tabi [1] added support to expose GSP-RM log buffers
> >> +(even after failure to probe the driver) through debugfs.
> >> +
> >> +This is also an interesting feature for nova-core, especially in the early days.
> >> +
> >> +| Link: https://lore.kernel.org/nouveau/20241030202952.694055-2-ttabi@xxxxxxxxxx/ [1]
> >> +| Reference: Debugfs abstractions
> >> +| Complexity: Intermediate
> >> +
> >> +GSP firmware abstraction
> >> +------------------------
> >> +
> >> +The GSP-RM firmware API is unstable and may incompatibly change from version to
> >> +version, in terms of data structures and semantics.
> >> +
> >> +This problem is one of the big motivations for using Rust for nova-core, since
> >> +it turns out that Rust's procedural macro feature provides a rather elegant way
> >> +to address this issue:
> >> +
> >> +1. generate Rust structures from the C headers in a separate namespace per version
> >> +2. build abstraction structures (within a generic namespace) that implement the
> >> +   firmware interfaces; annotate the differences in implementation with version
> >> +   identifiers
> >> +3. use a procedural macro to generate the actual per version implementation out
> >> +   of this abstraction
> >> +4. instantiate the correct version type one on runtime (can be sure that all
> >> +   have the same interface because it's defined by a common trait)
> >> +
> >> +There is a PoC implementation of this pattern, in the context of the nova-core
> >> +PoC driver.
> >> +
> >> +This task aims at refining the feature and ideally generalize it, to be usable
> >> +by other drivers as well.
> >> +
> >> +| Complexity: Expert
> >> +
> >> +GSP message queue
> >> +-----------------
> >> +
> >> +Implement low level GSP message queue (command, status) for communication
> >> +between the kernel driver and GSP.
> >> +
> >> +| Complexity: Advanced
> >> +| Contact: Dave Airlie
> >> +
> >> +Bootstrap GSP
> >> +-------------
> >> +
> >> +Call the boot firmware to boot the GSP processor; execute initial control
> >> +messages.
> >> +
> >> +| Complexity: Intermediate
> >> +| Contact: Dave Airlie
> >> +
> >> +Client / Device APIs
> >> +--------------------
> >> +
> >> +Implement the GSP message interface for client / device allocation and the
> >> +corresponding client and device allocation APIs.
> >> +
> >> +| Complexity: Intermediate
> >> +| Contact: Dave Airlie
> >> +
> >> +Bar PDE handling
> >> +----------------
> >> +
> >> +Synchronize page table handling for BARs between the kernel driver and GSP.
> >> +
> >> +| Complexity: Beginner
> >> +| Contact: Dave Airlie
> >> +
> >> +FIFO engine
> >> +-----------
> >> +
> >> +Implement support for the FIFO engine, i.e. the corresponding GSP message
> >> +interface and provide an API for chid allocation and channel handling.
> >> +
> >> +| Complexity: Advanced
> >> +| Contact: Dave Airlie
> >> +
> >> +GR engine
> >> +---------
> >> +
> >> +Implement support for the graphics engine, i.e. the corresponding GSP message
> >> +interface and provide an API for (golden) context creation and promotion.
> >> +
> >> +| Complexity: Advanced
> >> +| Contact: Dave Airlie
> >> +
> >> +CE engine
> >> +---------
> >> +
> >> +Implement support for the copy engine, i.e. the corresponding GSP message
> >> +interface.
> >> +
> >> +| Complexity: Intermediate
> >> +| Contact: Dave Airlie
> >> +
> >> +VFN IRQ controller
> >> +------------------
> >> +
> >> +Support for the VFN interrupt controller.
> >> +
> >> +| Complexity: Intermediate
> >> +| Contact: Dave Airlie
> >> +
> >> +External APIs
> >> +=============
> >> +
> >> +nova-core base API
> >> +------------------
> >> +
> >> +Work out the common pieces of the API to connect 2nd level drivers, i.e. vGPU
> >> +manager and nova-drm.
> >> +
> >> +| Complexity: Advanced
> >> +
> >> +vGPU manager API
> >> +----------------
> >> +
> >> +Work out the API parts required by the vGPU manager, which are not covered by
> >> +the base API.
> >> +
> >> +| Complexity: Advanced
> >> +
> >> +nova-core C API
> >> +---------------
> >> +
> >> +Implement a C wrapper for the APIs required by the vGPU manager driver.
> >> +
> >> +| Complexity: Intermediate
> >> +
> >> +Testing
> >> +=======
> >> +
> >> +CI pipeline
> >> +-----------
> >> +
> >> +Investigate option for continuous integration testing.
> >> +
> >> +This can go from as simple as running KUnit tests over running (graphics) CTS to
> >> +booting up (multiple) guest VMs to test VFIO use-cases.
> >> +
> >> +It might also be worth to consider the introduction of a new test suite directly
> >> +sitting on top of the uAPI for more targeted testing and debugging. There may be
> >> +options for collaboration / shared code with the Mesa project.
> >> +
> >> +| Complexity: Advanced
> >> diff --git a/Documentation/gpu/nova/guidelines.rst b/Documentation/gpu/nova/guidelines.rst
> >> new file mode 100644
> >> index 000000000000..13ab13984a18
> >> --- /dev/null
> >> +++ b/Documentation/gpu/nova/guidelines.rst
> >> @@ -0,0 +1,69 @@
> >> +.. SPDX-License-Identifier: (GPL-2.0+ OR MIT)
> >> +
> >> +==========
> >> +Guidelines
> >> +==========
> >> +
> >> +This document describes the general project guidelines that apply to nova-core
> >> +and nova-drm.
> >> +
> >> +Language
> >> +========
> >> +
> >> +The Nova project uses the Rust programming language. In this context, all rules
> >> +of the Rust for Linux project as documented in
> >> +:doc:`../../rust/general-information` apply. Additionally, the following rules
> >> +apply.
> >> +
> >> +- Unless technically necessary otherwise (e.g. uAPI), any driver code is written
> >> +  in Rust.
> >> +
> >> +- Unless technically necessary, unsafe Rust code must be avoided. In case of
> >> +  technical necessity, unsafe code should be isolated in a separate component
> >> +  providing a safe API for other driver code to use.
> >> +
> >> +Style
> >> +-----
> >> +
> >> +All rules of the Rust for Linux project as documented in
> >> +:doc:`../../rust/coding-guidelines` apply.
> >> +
> >> +For a submit checklist, please also see the `Rust for Linux Submit checklist
> >> +addendum <https://rust-for-linux.com/contributing#submit-checklist-addendum>`_.
> >> +
> >> +Documentation
> >> +=============
> >> +
> >> +The availability of proper documentation is essential in terms of scalability,
> >> +accessibility for new contributors and maintainability of a project in general,
> >> +but especially for a driver running as complex hardware as Nova is targeting.
> >> +
> >> +Hence, adding documentation of any kind is very much encouraged by the project.
> >> +
> >> +Besides that, there are some minimum requirements.
> >> +
> >> +- Every non-private structure needs at least a brief doc comment explaining the
> >> +  semantical sense of the structure, as well as potential locking and lifetime
> >> +  requirements. It is encouraged to have the same minimum documentation for
> >> +  non-trivial private structures.
> >> +
> >> +- uAPIs must be fully documented with kernel-doc comments; additionally, the
> >> +  semantical behavior must be explained including potential special or corner
> >> +  cases.
> >> +
> >> +- The APIs connecting the 1st level driver (nova-core) with 2nd level drivers
> >> +  must be fully documented. This includes doc comments, potential locking and
> >> +  lifetime requirements, as well as example code if applicable.
> >> +
> >> +- Abbreviations must be explained when introduced; terminology must be uniquely
> >> +  defined.
> >> +
> >> +- Register addresses, layouts, shift values and masks must be defined properly;
> >> +  unless obvious, the semantical sense must be documented. This only applies if
> >> +  the author is able to obtain the corresponding information.
> >> +
> >> +Acceptance Criteria
> >> +===================
> >> +
> >> +- Patches must only be applied if reviewed by at least one other person on the
> >> +  mailing list; this also applies for maintainers.
> >> diff --git a/Documentation/gpu/nova/index.rst b/Documentation/gpu/nova/index.rst
> >> new file mode 100644
> >> index 000000000000..2701b3f4af35
> >> --- /dev/null
> >> +++ b/Documentation/gpu/nova/index.rst
> >> @@ -0,0 +1,30 @@
> >> +.. SPDX-License-Identifier: (GPL-2.0+ OR MIT)
> >> +
> >> +=======================
> >> +nova NVIDIA GPU drivers
> >> +=======================
> >> +
> >> +The nova driver project consists out of two separate drivers nova-core and
> >> +nova-drm and intends to supersede the nouveau driver for NVIDIA GPUs based on
> >> +the GPU System Processor (GSP).
> >> +
> >> +The following documents apply to both nova-core and nova-drm.
> >> +
> >> +.. toctree::
> >> +   :titlesonly:
> >> +
> >> +   guidelines
> >> +
> >> +nova-core
> >> +=========
> >> +
> >> +The nova-core driver is the core driver for NVIDIA GPUs based on GSP. nova-core,
> >> +as the 1st level driver, provides an abstraction around the GPUs hard- and
> >> +firmware interfaces providing a common base for 2nd level drivers, such as the
> >> +vGPU manager VFIO driver and the nova-drm driver.
> >> +
> >> +.. toctree::
> >> +   :titlesonly:
> >> +
> >> +   core/guidelines
> >> +   core/todo
> >> diff --git a/MAINTAINERS b/MAINTAINERS
> >> index 5d5b7ed7da9e..ed618e8757a5 100644
> >> --- a/MAINTAINERS
> >> +++ b/MAINTAINERS
> >> @@ -7454,6 +7454,7 @@ Q:	https://patchwork.freedesktop.org/project/nouveau/
> >>  B:	https://gitlab.freedesktop.org/drm/nova/-/issues
> >>  C:	irc://irc.oftc.net/nouveau
> >>  T:	git https://gitlab.freedesktop.org/drm/nova.git nova-next
> >> +F:	Documentation/gpu/nova/
> >>  F:	drivers/gpu/nova-core/
> >>
> >>  DRM DRIVER FOR OLIMEX LCD-OLINUXINO PANELS
> >> --
> >> 2.48.1
> >>
> >>
> 



[Index of Archives]     [Linux ARM Kernel]     [Linux ARM]     [Linux Omap]     [Fedora ARM]     [IETF Annouce]     [Security]     [Bugtraq]     [Linux]     [Linux OMAP]     [Linux MIPS]     [eCos]     [Asterisk Internet PBX]     [Linux API]

  Powered by Linux