The Huge Nouveau Kernel Driver Rewrite Surfaces

Posted by Michael Larabel on August 06, 2012

Over the weekend there was the push by Red Hat's Ben Skeggs that effectively reworks/rewrites the Nouveau DRM kernel module for reverse-engineered open-source NVIDIA graphics under Linux.

Skeggs work rewrites a large portion of the Nouveau kernel driver code -- it measures in at about 50 commits and thousands of lines of code have been changed. We knew a big Nouveau DRM rewrite was happening following minimal changes for Nouveau with the Linux 3.6 kernel but on Saturday was when the code finally landed within the Nouveau project's kernel repository.

This Nouveau overhaul won't land in the mainline tree of Linus Torvalds until the Linux 3.7 kernel, but the developers are already asking interested parties to begin testing the code to look out for regressions. "I expect that for a while there will be a *lot* of stupid typos/thinkos that cause all sorts of breakage, so please test everything any anything you can and report *regressions* from the pre-rework code (vs 3.6-rc1 for example)."

The rewrite that happened so far is to basically allow for improved features to come in the future, but just sets the groundwork for now. "At this point don't expect any exciting cool functionality, the work so far is merely a restructure to allow moving forward on a number of fronts in the future."

Ben Skeggs mentioned the "BIG changes to kernel module" on the Nouveau mailing list. The Nouveau Linux kernel Git repository his hosted at FreeDesktop.org.

Among the big work in this Nouveau driver re-write is porting all engines to using the Nouveau driver's new module engine format (this alone is ~14,000 lines of new code), moving code and headers around, a completely new implementation of "instmem", memory management changes, and a lot of new infrastructure. Below is the main commit that added over 4,000 lines of new code to provide new core infrastructure for the Nouveau DRM driver.
This commit provides most of the infrastructure to support a major overhaul of Nouveau's internals coming in the following commits. This work aims to take all the things we've learned over the last several years, and turn that into a cleaner architecture that's more maintainable going forward.

RAMHT and MM bits of the new core have been left out for the moment, and will be pulled in as I go through the process of porting the code to become either subdev or engine modules.

There are several main goals I wanted to achieve through this work:

-- Reduce complexity

The goal here was to make each component of the driver as independent as possible, which will ease maintainability and readability, and provide a good base for resetting locked up GPU units in the future.

-- Better tracking of GPU units that are required at any given time

This is for future PM work, we'll be able to tell exactly what parts of the GPU we need powered at any given point (etc).

-- Expose all available NVIDIA GPUs to the client

In order to support things such as multi-GPU channels, we want to be able to expose all the NVIDIA GPUs to the client over a single file descriptor so it can send a single push buffer to multiple GPUs.

-- Untangle the core hardware support code from the DRM implementation

This happened initially as an unexpected side-effect of developing the initial core infrastructure in userspace, but it turned into a goal of the whole project. Initial benefits will be the availablility of a number of userspace tools and tests using the same code as the driver itself, but will also be important as I look into some virtualisation ideas.
While this just puts down lots of new low-level code as opposed to feature commits, new Phoronix benchmarks of the latest Nouveau code will happen in the coming days to look out for any regressions.

Discuss this article in our forums, IRC channel, or email the author. You can also follow our content via RSS and on social networks like Facebook, Identi.ca, and Twitter (@Phoronix and @MichaelLarabel). Subscribe to Phoronix Premium to view our content without advertisements, view entire articles on a single page, and experience other benefits.
Latest Hardware Reviews
  1. Sumo Lounge Emperor
  2. Gallium3D Continues Improving OpenGL For Older Radeon GPUs
  3. 15-Way Open vs. Closed Source NVIDIA/AMD Linux GPU Comparison
  4. Nouveau vs. NVIDIA Linux Comparison Shows Shortcomings
Latest Software Articles
  1. Btrfs vs. EXT4 vs. XFS vs. F2FS On Linux 3.10
  2. AMD Radeon R600 GPU LLVM 3.3 Back-End Testing
  3. F2FS File-System Shows Regressions On Linux 3.10
  4. Previewing The Radeon Gallium3D Shader Optimizations
Latest Linux News
  1. Benchmarking The Intel P-State, CPUfreq Changes
  2. FreeBSD Still Working On Next-Gen Package Manager
  3. DNF Still Advancing As Experimental Yum For Fedora
  4. Logitech Begins Supporting Linux Users
  5. Modern Intel Gallium3D Driver Still Being Toyed With
  6. Linux 3.10 Kernel Benchmarks On A Core i7 Laptop
  7. GCC 4.8.1 Compiler Due To Be Out Next Week
  8. Linux 3.10 Kernel Benchmarks For Intel Ivy Bridge
  9. Linux's "Ondemand" Governor Is No Longer Fit
  10. Firefox 22 Beta Enables WebRTC Support
  11. OpenSUSE 13.1 Milestone 1 Released
Latest Forum Talk
  1. Benchmarking The Intel P-State, CPUfreq Changes
  2. DNF Still Advancing As Experimental Yum For Fedora
  3. Openbenchmarking.org main page is damaged
  4. Logitech Begins Supporting Linux Users
  5. X3: Albion Prelude Released For Linux Gamers
  6. Sumo Lounge Emperor
  1. Computers
  2. Display Drivers
  3. Graphics Cards
  4. Motherboards
  5. Peripherals
  6. Processors
  7. Software
  8. Operating Systems
  9. All Articles
  1. Linux Benchmarking
  2. OpenBenchmarking.org
  3. Phoronix Test Suite