162306a36Sopenharmony_ci============
262306a36Sopenharmony_ciIntroduction
362306a36Sopenharmony_ci============
462306a36Sopenharmony_ci
562306a36Sopenharmony_ciThe Linux DRM layer contains code intended to support the needs of
662306a36Sopenharmony_cicomplex graphics devices, usually containing programmable pipelines well
762306a36Sopenharmony_cisuited to 3D graphics acceleration. Graphics drivers in the kernel may
862306a36Sopenharmony_cimake use of DRM functions to make tasks like memory management,
962306a36Sopenharmony_ciinterrupt handling and DMA easier, and provide a uniform interface to
1062306a36Sopenharmony_ciapplications.
1162306a36Sopenharmony_ci
1262306a36Sopenharmony_ciA note on versions: this guide covers features found in the DRM tree,
1362306a36Sopenharmony_ciincluding the TTM memory manager, output configuration and mode setting,
1462306a36Sopenharmony_ciand the new vblank internals, in addition to all the regular features
1562306a36Sopenharmony_cifound in current kernels.
1662306a36Sopenharmony_ci
1762306a36Sopenharmony_ci[Insert diagram of typical DRM stack here]
1862306a36Sopenharmony_ci
1962306a36Sopenharmony_ciStyle Guidelines
2062306a36Sopenharmony_ci================
2162306a36Sopenharmony_ci
2262306a36Sopenharmony_ciFor consistency this documentation uses American English. Abbreviations
2362306a36Sopenharmony_ciare written as all-uppercase, for example: DRM, KMS, IOCTL, CRTC, and so
2462306a36Sopenharmony_cion. To aid in reading, documentations make full use of the markup
2562306a36Sopenharmony_cicharacters kerneldoc provides: @parameter for function parameters,
2662306a36Sopenharmony_ci@member for structure members (within the same structure), &struct structure to
2762306a36Sopenharmony_cireference structures and function() for functions. These all get automatically
2862306a36Sopenharmony_cihyperlinked if kerneldoc for the referenced objects exists. When referencing
2962306a36Sopenharmony_cientries in function vtables (and structure members in general) please use
3062306a36Sopenharmony_ci&vtable_name.vfunc. Unfortunately this does not yet yield a direct link to the
3162306a36Sopenharmony_cimember, only the structure.
3262306a36Sopenharmony_ci
3362306a36Sopenharmony_ciExcept in special situations (to separate locked from unlocked variants)
3462306a36Sopenharmony_cilocking requirements for functions aren't documented in the kerneldoc.
3562306a36Sopenharmony_ciInstead locking should be check at runtime using e.g.
3662306a36Sopenharmony_ci``WARN_ON(!mutex_is_locked(...));``. Since it's much easier to ignore
3762306a36Sopenharmony_cidocumentation than runtime noise this provides more value. And on top of
3862306a36Sopenharmony_cithat runtime checks do need to be updated when the locking rules change,
3962306a36Sopenharmony_ciincreasing the chances that they're correct. Within the documentation
4062306a36Sopenharmony_cithe locking rules should be explained in the relevant structures: Either
4162306a36Sopenharmony_ciin the comment for the lock explaining what it protects, or data fields
4262306a36Sopenharmony_cineed a note about which lock protects them, or both.
4362306a36Sopenharmony_ci
4462306a36Sopenharmony_ciFunctions which have a non-\ ``void`` return value should have a section
4562306a36Sopenharmony_cicalled "Returns" explaining the expected return values in different
4662306a36Sopenharmony_cicases and their meanings. Currently there's no consensus whether that
4762306a36Sopenharmony_cisection name should be all upper-case or not, and whether it should end
4862306a36Sopenharmony_ciin a colon or not. Go with the file-local style. Other common section
4962306a36Sopenharmony_cinames are "Notes" with information for dangerous or tricky corner cases,
5062306a36Sopenharmony_ciand "FIXME" where the interface could be cleaned up.
5162306a36Sopenharmony_ci
5262306a36Sopenharmony_ciAlso read the :ref:`guidelines for the kernel documentation at large <doc_guide>`.
5362306a36Sopenharmony_ci
5462306a36Sopenharmony_ciDocumentation Requirements for kAPI
5562306a36Sopenharmony_ci-----------------------------------
5662306a36Sopenharmony_ci
5762306a36Sopenharmony_ciAll kernel APIs exported to other modules must be documented, including their
5862306a36Sopenharmony_cidatastructures and at least a short introductory section explaining the overall
5962306a36Sopenharmony_ciconcepts. Documentation should be put into the code itself as kerneldoc comments
6062306a36Sopenharmony_cias much as reasonable.
6162306a36Sopenharmony_ci
6262306a36Sopenharmony_ciDo not blindly document everything, but document only what's relevant for driver
6362306a36Sopenharmony_ciauthors: Internal functions of drm.ko and definitely static functions should not
6462306a36Sopenharmony_cihave formal kerneldoc comments. Use normal C comments if you feel like a comment
6562306a36Sopenharmony_ciis warranted. You may use kerneldoc syntax in the comment, but it shall not
6662306a36Sopenharmony_cistart with a /** kerneldoc marker. Similar for data structures, annotate
6762306a36Sopenharmony_cianything entirely private with ``/* private: */`` comments as per the
6862306a36Sopenharmony_cidocumentation guide.
6962306a36Sopenharmony_ci
7062306a36Sopenharmony_ciGetting Started
7162306a36Sopenharmony_ci===============
7262306a36Sopenharmony_ci
7362306a36Sopenharmony_ciDevelopers interested in helping out with the DRM subsystem are very welcome.
7462306a36Sopenharmony_ciOften people will resort to sending in patches for various issues reported by
7562306a36Sopenharmony_cicheckpatch or sparse. We welcome such contributions.
7662306a36Sopenharmony_ci
7762306a36Sopenharmony_ciAnyone looking to kick it up a notch can find a list of janitorial tasks on
7862306a36Sopenharmony_cithe :ref:`TODO list <todo>`.
7962306a36Sopenharmony_ci
8062306a36Sopenharmony_ciContribution Process
8162306a36Sopenharmony_ci====================
8262306a36Sopenharmony_ci
8362306a36Sopenharmony_ciMostly the DRM subsystem works like any other kernel subsystem, see :ref:`the
8462306a36Sopenharmony_cimain process guidelines and documentation <process_index>` for how things work.
8562306a36Sopenharmony_ciHere we just document some of the specialities of the GPU subsystem.
8662306a36Sopenharmony_ci
8762306a36Sopenharmony_ciFeature Merge Deadlines
8862306a36Sopenharmony_ci-----------------------
8962306a36Sopenharmony_ci
9062306a36Sopenharmony_ciAll feature work must be in the linux-next tree by the -rc6 release of the
9162306a36Sopenharmony_cicurrent release cycle, otherwise they must be postponed and can't reach the next
9262306a36Sopenharmony_cimerge window. All patches must have landed in the drm-next tree by latest -rc7,
9362306a36Sopenharmony_cibut if your branch is not in linux-next then this must have happened by -rc6
9462306a36Sopenharmony_cialready.
9562306a36Sopenharmony_ci
9662306a36Sopenharmony_ciAfter that point only bugfixes (like after the upstream merge window has closed
9762306a36Sopenharmony_ciwith the -rc1 release) are allowed. No new platform enabling or new drivers are
9862306a36Sopenharmony_ciallowed.
9962306a36Sopenharmony_ci
10062306a36Sopenharmony_ciThis means that there's a blackout-period of about one month where feature work
10162306a36Sopenharmony_cican't be merged. The recommended way to deal with that is having a -next tree
10262306a36Sopenharmony_cithat's always open, but making sure to not feed it into linux-next during the
10362306a36Sopenharmony_ciblackout period. As an example, drm-misc works like that.
10462306a36Sopenharmony_ci
10562306a36Sopenharmony_ciCode of Conduct
10662306a36Sopenharmony_ci---------------
10762306a36Sopenharmony_ci
10862306a36Sopenharmony_ciAs a freedesktop.org project, dri-devel, and the DRM community, follows the
10962306a36Sopenharmony_ciContributor Covenant, found at: https://www.freedesktop.org/wiki/CodeOfConduct
11062306a36Sopenharmony_ci
11162306a36Sopenharmony_ciPlease conduct yourself in a respectful and civilised manner when
11262306a36Sopenharmony_ciinteracting with community members on mailing lists, IRC, or bug
11362306a36Sopenharmony_citrackers. The community represents the project as a whole, and abusive
11462306a36Sopenharmony_cior bullying behaviour is not tolerated by the project.
11562306a36Sopenharmony_ci
11662306a36Sopenharmony_ciSimple DRM drivers to use as examples
11762306a36Sopenharmony_ci=====================================
11862306a36Sopenharmony_ci
11962306a36Sopenharmony_ciThe DRM subsystem contains a lot of helper functions to ease writing drivers for
12062306a36Sopenharmony_cisimple graphic devices. For example, the `drivers/gpu/drm/tiny/` directory has a
12162306a36Sopenharmony_ciset of drivers that are simple enough to be implemented in a single source file.
12262306a36Sopenharmony_ci
12362306a36Sopenharmony_ciThese drivers make use of the `struct drm_simple_display_pipe_funcs`, that hides
12462306a36Sopenharmony_ciany complexity of the DRM subsystem and just requires drivers to implement a few
12562306a36Sopenharmony_cifunctions needed to operate the device. This could be used for devices that just
12662306a36Sopenharmony_cineed a display pipeline with one full-screen scanout buffer feeding one output.
12762306a36Sopenharmony_ci
12862306a36Sopenharmony_ciThe tiny DRM drivers are good examples to understand how DRM drivers should look
12962306a36Sopenharmony_cilike. Since are just a few hundreds lines of code, they are quite easy to read.
13062306a36Sopenharmony_ci
13162306a36Sopenharmony_ciExternal References
13262306a36Sopenharmony_ci===================
13362306a36Sopenharmony_ci
13462306a36Sopenharmony_ciDelving into a Linux kernel subsystem for the first time can be an overwhelming
13562306a36Sopenharmony_ciexperience, one needs to get familiar with all the concepts and learn about the
13662306a36Sopenharmony_cisubsystem's internals, among other details.
13762306a36Sopenharmony_ci
13862306a36Sopenharmony_ciTo shallow the learning curve, this section contains a list of presentations
13962306a36Sopenharmony_ciand documents that can be used to learn about DRM/KMS and graphics in general.
14062306a36Sopenharmony_ci
14162306a36Sopenharmony_ciThere are different reasons why someone might want to get into DRM: porting an
14262306a36Sopenharmony_ciexisting fbdev driver, write a DRM driver for a new hardware, fixing bugs that
14362306a36Sopenharmony_cicould face when working on the graphics user-space stack, etc. For this reason,
14462306a36Sopenharmony_cithe learning material covers many aspects of the Linux graphics stack. From an
14562306a36Sopenharmony_cioverview of the kernel and user-space stacks to very specific topics.
14662306a36Sopenharmony_ci
14762306a36Sopenharmony_ciThe list is sorted in reverse chronological order, to keep the most up-to-date
14862306a36Sopenharmony_cimaterial at the top. But all of them contain useful information, and it can be
14962306a36Sopenharmony_civaluable to go through older material to understand the rationale and context
15062306a36Sopenharmony_ciin which the changes to the DRM subsystem were made.
15162306a36Sopenharmony_ci
15262306a36Sopenharmony_ciConference talks
15362306a36Sopenharmony_ci----------------
15462306a36Sopenharmony_ci
15562306a36Sopenharmony_ci* `An Overview of the Linux and Userspace Graphics Stack <https://www.youtube.com/watch?v=wjAJmqwg47k>`_ - Paul Kocialkowski (2020)
15662306a36Sopenharmony_ci* `Getting pixels on screen on Linux: introduction to Kernel Mode Setting <https://www.youtube.com/watch?v=haes4_Xnc5Q>`_ - Simon Ser (2020)
15762306a36Sopenharmony_ci* `Everything Great about Upstream Graphics <https://www.youtube.com/watch?v=kVzHOgt6WGE>`_ - Daniel Vetter (2019)
15862306a36Sopenharmony_ci* `An introduction to the Linux DRM subsystem <https://www.youtube.com/watch?v=LbDOCJcDRoo>`_ - Maxime Ripard (2017)
15962306a36Sopenharmony_ci* `Embrace the Atomic (Display) Age <https://www.youtube.com/watch?v=LjiB_JeDn2M>`_ - Daniel Vetter (2016)
16062306a36Sopenharmony_ci* `Anatomy of an Atomic KMS Driver <https://www.youtube.com/watch?v=lihqR9sENpc>`_ - Laurent Pinchart (2015)
16162306a36Sopenharmony_ci* `Atomic Modesetting for Drivers <https://www.youtube.com/watch?v=kl9suFgbTc8>`_ - Daniel Vetter (2015)
16262306a36Sopenharmony_ci* `Anatomy of an Embedded KMS Driver <https://www.youtube.com/watch?v=Ja8fM7rTae4>`_ - Laurent Pinchart (2013)
16362306a36Sopenharmony_ci
16462306a36Sopenharmony_ciSlides and articles
16562306a36Sopenharmony_ci-------------------
16662306a36Sopenharmony_ci
16762306a36Sopenharmony_ci* `Understanding the Linux Graphics Stack <https://bootlin.com/doc/training/graphics/graphics-slides.pdf>`_ - Bootlin (2022)
16862306a36Sopenharmony_ci* `DRM KMS overview <https://wiki.st.com/stm32mpu/wiki/DRM_KMS_overview>`_ - STMicroelectronics (2021)
16962306a36Sopenharmony_ci* `Linux graphic stack <https://studiopixl.com/2017-05-13/linux-graphic-stack-an-overview>`_ - Nathan Gauër (2017)
17062306a36Sopenharmony_ci* `Atomic mode setting design overview, part 1 <https://lwn.net/Articles/653071/>`_ - Daniel Vetter (2015)
17162306a36Sopenharmony_ci* `Atomic mode setting design overview, part 2 <https://lwn.net/Articles/653466/>`_ - Daniel Vetter (2015)
17262306a36Sopenharmony_ci* `The DRM/KMS subsystem from a newbie’s point of view <https://bootlin.com/pub/conferences/2014/elce/brezillon-drm-kms/brezillon-drm-kms.pdf>`_ - Boris Brezillon (2014)
17362306a36Sopenharmony_ci* `A brief introduction to the Linux graphics stack <https://blogs.igalia.com/itoral/2014/07/29/a-brief-introduction-to-the-linux-graphics-stack/>`_ - Iago Toral (2014)
17462306a36Sopenharmony_ci* `The Linux Graphics Stack <https://blog.mecheye.net/2012/06/the-linux-graphics-stack/>`_ - Jasper St. Pierre (2012)
175