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