Guide to contribute to kernel video drivers
Ruediger Gad
r.c.g at gmx.de
Fri Feb 19 21:45:50 UTC 2016
Hi Jean-Sébastien,
huge thanks for the guide! :)
So far, I just used a rather blunt approach for my testing and I think
your guide will help me a lot for improving my workflow.
BR,
Ruediger
PS:
I also appreciate the very welcoming attitude I see here in the list.
On 02/19/2016 13:22, Jean-Sébastien Pédron wrote:
> Hi!
>
> As promised a (too) long time ago, here are some instructions to get you
> started with kernel video drivers.
>
> First, don't be afraid by the kernel. In the kernel, you have to live
> with some constraints and debugging is more challenging, but it's not an
> order of magnitude harder than userland. Moreover, we are porting
> existing working code.
>
> == Requirements ==
>
> o You need to run CURRENT on the test computer. I recommend you work
> from another computer. You only need to copy the built kernel to the
> test computer.
>
> o You need to setup kernel core dumps on the test computer. This is
> step #1 here:
>
> https://wiki.freebsd.org/Graphics/Update%20i915%20GPU%20driver%20to%20Linux%203.8#Testing_Instructions_.2F_How_To
>
> To test core dumps work:
> sysctl debug.kdb.panic=1
>
> o You need a clone of Linux. I use the following Git remotes:
> git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
> git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git
>
> The second one is useful to get the patch releases, such as
> "v3.8.13". The former only provides "v3.8".
>
> o You need a clone of FreeBSD. You can fork this repository:
> https://github.com/freebsd/freebsd-base-graphics
>
> I recommend you add this one as a second remote (in addition to your
> fork), as well as the FreeBSD official Git mirror:
> https://github.com/freebsd/freebsd.git
>
> == Source code locations ==
>
> In Linux, DRM is located in three places:
> drivers/gpu/drm
> include/drm
> include/uapi/drm
>
> In FreeBSD, DRM is located in sys/dev/drm2, with the Makefiles in
> sys/modules/drm2.
>
> == Targets ==
>
> During the discussion, some wanted to work on Linux 3.9, some on Linux
> 4.3/4.4.
>
> That said, I believe we should start by moving to linuxkpi before
> anything. It would consist of modifying DRM to use sys/compat/linuxkpi
> instead of its own drm_os_freebsd.[ch] files. This would help a *lot*
> next updates.
>
> == Workflow ==
>
> The workflow was discussed in previous threads:
> https://lists.freebsd.org/pipermail/freebsd-x11/2015-December/017056.html
>
> The conslusion is here:
> https://lists.freebsd.org/pipermail/freebsd-x11/2016-January/017109.html
>
> The file-by-file workflow, which was more popular in the discussion, was
> explained in the link above.
>
> As for the branches, we are going to use drm-next-$target (eg.
> drm-next-3.9). Please send pull requests to these branches. At least in
> freebsd-base-graphics, "master" will remain the same code as
> Subversion's HEAD so we have a point of comparison.
>
> Let's take drm-next-3.9 as an example. We want to update the entire DRM
> to Linux 3.9: DRM core (the device-independent code), the i915 driver
> and the Radeon driver.
>
> As we are testing the file-by-file approach, we need to coordinate who
> does what. And before the task is finished, the kernel won't compile
> (that's the risk with the file-by-file approach).
>
> I would like to record all the contributors on the wiki or on GitHub,
> I'm not sure yet. Maybe it should take the form of issues on GitHub (ie.
> one issue per file to update and an assignee). The issue even let us
> discuss specific details about the file.
>
> DRM core should be updated first, then the drivers.
>
> == How to build ==
>
> I usually build a full kernel with "make buildkernel". Then, I can
> rebuild the DRM part with:
> make buildkernel -DKERNFAST DEBUG_FLAGS="-g -O0"
>
> Add -j$N to accelerate the build.
>
> You can't use "-O0" for the entire kernel otherwise the kernel will
> overflow the stack. However, use it for subsequent rebuilds (ie. when
> using -DKERNFAST), otherwise, you'll get a lot of "<optimized out>"
> variables in gdb.
>
> When working on the update of a single file, you should move that file
> to the top of $(SRCS) in the Makefile (eg.
> sys/modules/drm2/drm2/Makefile) so other files don't prevent you from
> build-testing your work.
>
> I (re)install the new kernel in /tmp, because I use tmpfs there (I don't
> care about the installed kernel on my working computer):
> make (re)installkernel DESTDIR=/tmp
>
> From the test computer, I rsync the new kernel.
>
> == How to test ==
>
> Do not load the driver from /boot/loader.conf or /etc/rc.conf. Load it
> manually after boot.
>
> You can set drm.debug=7 in /boot/loader.conf to have more debug
> informations during kldload. To lower the log level afterward (in case
> it's too verbose), the corresponding sysctl is hw.dri.debug.
>
> Play with several applications and use cases. I use:
> o glxinfo/glxgears
> o clinfo
> o Some of the games listed in the following page:
> https://dri.freedesktop.org/wiki/Benchmarking/
> (OpenArena and Xonotic in my case)
> o WebGL, I use this demo: http://www.david.li/waves/
> o Desktop environments (GNOME 3, KDE 4) and compositors such as
> compton. I use compton to have a tearfree environment:
> compton -CG --backend glx -b
> o Some video players with the GL and XVideo backends.
> o HTML5 videos. I watched this video which is exposes tearing a
> lot:
> https://www.youtube.com/watch?v=hpHknKaq_M0
> o Stellarium
> o xrandr(1) to manage output connectors
> o Suspend/resume
> o Piglit (from our development Ports tree; we should definitely
> commit it)
>
> If you find a problem, try to reduce it to the minimum, then:
> 1. From a remote computer, use tmux or screen for your session (not
> mandatory, but quite handy)
> 2. From one tab, start a plain X server:
> Xorg
> 3. From another tab, start the bad, bad program:
> DISPLAY=:0 bad_application
> 4. Use other tabs to look at log files, run dtrace scripts, etc.
>
> By doing so, you limit the number of calls to the video drivers to the
> minmum. Running a full desktop environment will spam a lot of unrelated
> messages.
>
> If the computer doesn't crash and you want to load a newer driver, you can:
> 1. Close all applications and the X server
> 2. kldunload the driver (note that it doesn't work for i915kms in
> HEAD, the update will fix that)
> 3. kldload the new one.
>
> It saves you a reboot. Again, do this from a remote computer because
> after kldunloading, you may not get a console back (it works with the
> Radeon driver, but so far, not with the updated i915 driver).
>
> If you get a core dump, it will be available in /var/crash after the
> reboot. Usually, core.txt.$N has enough informations. If not, you can
> start gdb (either the one in base or the one from Ports):
> gdb /boot/kernel/kernel /var/crash/vmcore.last
> (change /boot/kernel/kernel to match the kernel you used)
>
> Thanks for reading! :) If something is missing, please ask! I will put
> this information on the wiki.
>
More information about the freebsd-x11
mailing list