xref: /OK3568_Linux_fs/kernel/Documentation/gpu/drm-kms.rst (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun=========================
2*4882a593SmuzhiyunKernel Mode Setting (KMS)
3*4882a593Smuzhiyun=========================
4*4882a593Smuzhiyun
5*4882a593SmuzhiyunDrivers must initialize the mode setting core by calling
6*4882a593Smuzhiyundrmm_mode_config_init() on the DRM device. The function
7*4882a593Smuzhiyuninitializes the :c:type:`struct drm_device <drm_device>`
8*4882a593Smuzhiyunmode_config field and never fails. Once done, mode configuration must
9*4882a593Smuzhiyunbe setup by initializing the following fields.
10*4882a593Smuzhiyun
11*4882a593Smuzhiyun-  int min_width, min_height; int max_width, max_height;
12*4882a593Smuzhiyun   Minimum and maximum width and height of the frame buffers in pixel
13*4882a593Smuzhiyun   units.
14*4882a593Smuzhiyun
15*4882a593Smuzhiyun-  struct drm_mode_config_funcs \*funcs;
16*4882a593Smuzhiyun   Mode setting functions.
17*4882a593Smuzhiyun
18*4882a593SmuzhiyunOverview
19*4882a593Smuzhiyun========
20*4882a593Smuzhiyun
21*4882a593Smuzhiyun.. kernel-render:: DOT
22*4882a593Smuzhiyun   :alt: KMS Display Pipeline
23*4882a593Smuzhiyun   :caption: KMS Display Pipeline Overview
24*4882a593Smuzhiyun
25*4882a593Smuzhiyun   digraph "KMS" {
26*4882a593Smuzhiyun      node [shape=box]
27*4882a593Smuzhiyun
28*4882a593Smuzhiyun      subgraph cluster_static {
29*4882a593Smuzhiyun          style=dashed
30*4882a593Smuzhiyun          label="Static Objects"
31*4882a593Smuzhiyun
32*4882a593Smuzhiyun          node [bgcolor=grey style=filled]
33*4882a593Smuzhiyun          "drm_plane A" -> "drm_crtc"
34*4882a593Smuzhiyun          "drm_plane B" -> "drm_crtc"
35*4882a593Smuzhiyun          "drm_crtc" -> "drm_encoder A"
36*4882a593Smuzhiyun          "drm_crtc" -> "drm_encoder B"
37*4882a593Smuzhiyun      }
38*4882a593Smuzhiyun
39*4882a593Smuzhiyun      subgraph cluster_user_created {
40*4882a593Smuzhiyun          style=dashed
41*4882a593Smuzhiyun          label="Userspace-Created"
42*4882a593Smuzhiyun
43*4882a593Smuzhiyun          node [shape=oval]
44*4882a593Smuzhiyun          "drm_framebuffer 1" -> "drm_plane A"
45*4882a593Smuzhiyun          "drm_framebuffer 2" -> "drm_plane B"
46*4882a593Smuzhiyun      }
47*4882a593Smuzhiyun
48*4882a593Smuzhiyun      subgraph cluster_connector {
49*4882a593Smuzhiyun          style=dashed
50*4882a593Smuzhiyun          label="Hotpluggable"
51*4882a593Smuzhiyun
52*4882a593Smuzhiyun          "drm_encoder A" -> "drm_connector A"
53*4882a593Smuzhiyun          "drm_encoder B" -> "drm_connector B"
54*4882a593Smuzhiyun      }
55*4882a593Smuzhiyun   }
56*4882a593Smuzhiyun
57*4882a593SmuzhiyunThe basic object structure KMS presents to userspace is fairly simple.
58*4882a593SmuzhiyunFramebuffers (represented by :c:type:`struct drm_framebuffer <drm_framebuffer>`,
59*4882a593Smuzhiyunsee `Frame Buffer Abstraction`_) feed into planes. Planes are represented by
60*4882a593Smuzhiyun:c:type:`struct drm_plane <drm_plane>`, see `Plane Abstraction`_ for more
61*4882a593Smuzhiyundetails. One or more (or even no) planes feed their pixel data into a CRTC
62*4882a593Smuzhiyun(represented by :c:type:`struct drm_crtc <drm_crtc>`, see `CRTC Abstraction`_)
63*4882a593Smuzhiyunfor blending. The precise blending step is explained in more detail in `Plane
64*4882a593SmuzhiyunComposition Properties`_ and related chapters.
65*4882a593Smuzhiyun
66*4882a593SmuzhiyunFor the output routing the first step is encoders (represented by
67*4882a593Smuzhiyun:c:type:`struct drm_encoder <drm_encoder>`, see `Encoder Abstraction`_). Those
68*4882a593Smuzhiyunare really just internal artifacts of the helper libraries used to implement KMS
69*4882a593Smuzhiyundrivers. Besides that they make it unecessarily more complicated for userspace
70*4882a593Smuzhiyunto figure out which connections between a CRTC and a connector are possible, and
71*4882a593Smuzhiyunwhat kind of cloning is supported, they serve no purpose in the userspace API.
72*4882a593SmuzhiyunUnfortunately encoders have been exposed to userspace, hence can't remove them
73*4882a593Smuzhiyunat this point.  Futhermore the exposed restrictions are often wrongly set by
74*4882a593Smuzhiyundrivers, and in many cases not powerful enough to express the real restrictions.
75*4882a593SmuzhiyunA CRTC can be connected to multiple encoders, and for an active CRTC there must
76*4882a593Smuzhiyunbe at least one encoder.
77*4882a593Smuzhiyun
78*4882a593SmuzhiyunThe final, and real, endpoint in the display chain is the connector (represented
79*4882a593Smuzhiyunby :c:type:`struct drm_connector <drm_connector>`, see `Connector
80*4882a593SmuzhiyunAbstraction`_). Connectors can have different possible encoders, but the kernel
81*4882a593Smuzhiyundriver selects which encoder to use for each connector. The use case is DVI,
82*4882a593Smuzhiyunwhich could switch between an analog and a digital encoder. Encoders can also
83*4882a593Smuzhiyundrive multiple different connectors. There is exactly one active connector for
84*4882a593Smuzhiyunevery active encoder.
85*4882a593Smuzhiyun
86*4882a593SmuzhiyunInternally the output pipeline is a bit more complex and matches today's
87*4882a593Smuzhiyunhardware more closely:
88*4882a593Smuzhiyun
89*4882a593Smuzhiyun.. kernel-render:: DOT
90*4882a593Smuzhiyun   :alt: KMS Output Pipeline
91*4882a593Smuzhiyun   :caption: KMS Output Pipeline
92*4882a593Smuzhiyun
93*4882a593Smuzhiyun   digraph "Output Pipeline" {
94*4882a593Smuzhiyun      node [shape=box]
95*4882a593Smuzhiyun
96*4882a593Smuzhiyun      subgraph {
97*4882a593Smuzhiyun          "drm_crtc" [bgcolor=grey style=filled]
98*4882a593Smuzhiyun      }
99*4882a593Smuzhiyun
100*4882a593Smuzhiyun      subgraph cluster_internal {
101*4882a593Smuzhiyun          style=dashed
102*4882a593Smuzhiyun          label="Internal Pipeline"
103*4882a593Smuzhiyun          {
104*4882a593Smuzhiyun              node [bgcolor=grey style=filled]
105*4882a593Smuzhiyun              "drm_encoder A";
106*4882a593Smuzhiyun              "drm_encoder B";
107*4882a593Smuzhiyun              "drm_encoder C";
108*4882a593Smuzhiyun          }
109*4882a593Smuzhiyun
110*4882a593Smuzhiyun          {
111*4882a593Smuzhiyun              node [bgcolor=grey style=filled]
112*4882a593Smuzhiyun              "drm_encoder B" -> "drm_bridge B"
113*4882a593Smuzhiyun              "drm_encoder C" -> "drm_bridge C1"
114*4882a593Smuzhiyun              "drm_bridge C1" -> "drm_bridge C2";
115*4882a593Smuzhiyun          }
116*4882a593Smuzhiyun      }
117*4882a593Smuzhiyun
118*4882a593Smuzhiyun      "drm_crtc" -> "drm_encoder A"
119*4882a593Smuzhiyun      "drm_crtc" -> "drm_encoder B"
120*4882a593Smuzhiyun      "drm_crtc" -> "drm_encoder C"
121*4882a593Smuzhiyun
122*4882a593Smuzhiyun
123*4882a593Smuzhiyun      subgraph cluster_output {
124*4882a593Smuzhiyun          style=dashed
125*4882a593Smuzhiyun          label="Outputs"
126*4882a593Smuzhiyun
127*4882a593Smuzhiyun          "drm_encoder A" -> "drm_connector A";
128*4882a593Smuzhiyun          "drm_bridge B" -> "drm_connector B";
129*4882a593Smuzhiyun          "drm_bridge C2" -> "drm_connector C";
130*4882a593Smuzhiyun
131*4882a593Smuzhiyun          "drm_panel"
132*4882a593Smuzhiyun      }
133*4882a593Smuzhiyun   }
134*4882a593Smuzhiyun
135*4882a593SmuzhiyunInternally two additional helper objects come into play. First, to be able to
136*4882a593Smuzhiyunshare code for encoders (sometimes on the same SoC, sometimes off-chip) one or
137*4882a593Smuzhiyunmore :ref:`drm_bridges` (represented by :c:type:`struct drm_bridge
138*4882a593Smuzhiyun<drm_bridge>`) can be linked to an encoder. This link is static and cannot be
139*4882a593Smuzhiyunchanged, which means the cross-bar (if there is any) needs to be mapped between
140*4882a593Smuzhiyunthe CRTC and any encoders. Often for drivers with bridges there's no code left
141*4882a593Smuzhiyunat the encoder level. Atomic drivers can leave out all the encoder callbacks to
142*4882a593Smuzhiyunessentially only leave a dummy routing object behind, which is needed for
143*4882a593Smuzhiyunbackwards compatibility since encoders are exposed to userspace.
144*4882a593Smuzhiyun
145*4882a593SmuzhiyunThe second object is for panels, represented by :c:type:`struct drm_panel
146*4882a593Smuzhiyun<drm_panel>`, see :ref:`drm_panel_helper`. Panels do not have a fixed binding
147*4882a593Smuzhiyunpoint, but are generally linked to the driver private structure that embeds
148*4882a593Smuzhiyun:c:type:`struct drm_connector <drm_connector>`.
149*4882a593Smuzhiyun
150*4882a593SmuzhiyunNote that currently the bridge chaining and interactions with connectors and
151*4882a593Smuzhiyunpanels are still in-flux and not really fully sorted out yet.
152*4882a593Smuzhiyun
153*4882a593SmuzhiyunKMS Core Structures and Functions
154*4882a593Smuzhiyun=================================
155*4882a593Smuzhiyun
156*4882a593Smuzhiyun.. kernel-doc:: include/drm/drm_mode_config.h
157*4882a593Smuzhiyun   :internal:
158*4882a593Smuzhiyun
159*4882a593Smuzhiyun.. kernel-doc:: drivers/gpu/drm/drm_mode_config.c
160*4882a593Smuzhiyun   :export:
161*4882a593Smuzhiyun
162*4882a593SmuzhiyunModeset Base Object Abstraction
163*4882a593Smuzhiyun===============================
164*4882a593Smuzhiyun
165*4882a593Smuzhiyun.. kernel-render:: DOT
166*4882a593Smuzhiyun   :alt: Mode Objects and Properties
167*4882a593Smuzhiyun   :caption: Mode Objects and Properties
168*4882a593Smuzhiyun
169*4882a593Smuzhiyun   digraph {
170*4882a593Smuzhiyun      node [shape=box]
171*4882a593Smuzhiyun
172*4882a593Smuzhiyun      "drm_property A" -> "drm_mode_object A"
173*4882a593Smuzhiyun      "drm_property A" -> "drm_mode_object B"
174*4882a593Smuzhiyun      "drm_property B" -> "drm_mode_object A"
175*4882a593Smuzhiyun   }
176*4882a593Smuzhiyun
177*4882a593SmuzhiyunThe base structure for all KMS objects is :c:type:`struct drm_mode_object
178*4882a593Smuzhiyun<drm_mode_object>`. One of the base services it provides is tracking properties,
179*4882a593Smuzhiyunwhich are especially important for the atomic IOCTL (see `Atomic Mode
180*4882a593SmuzhiyunSetting`_). The somewhat surprising part here is that properties are not
181*4882a593Smuzhiyundirectly instantiated on each object, but free-standing mode objects themselves,
182*4882a593Smuzhiyunrepresented by :c:type:`struct drm_property <drm_property>`, which only specify
183*4882a593Smuzhiyunthe type and value range of a property. Any given property can be attached
184*4882a593Smuzhiyunmultiple times to different objects using drm_object_attach_property().
185*4882a593Smuzhiyun
186*4882a593Smuzhiyun.. kernel-doc:: include/drm/drm_mode_object.h
187*4882a593Smuzhiyun   :internal:
188*4882a593Smuzhiyun
189*4882a593Smuzhiyun.. kernel-doc:: drivers/gpu/drm/drm_mode_object.c
190*4882a593Smuzhiyun   :export:
191*4882a593Smuzhiyun
192*4882a593SmuzhiyunAtomic Mode Setting
193*4882a593Smuzhiyun===================
194*4882a593Smuzhiyun
195*4882a593Smuzhiyun
196*4882a593Smuzhiyun.. kernel-render:: DOT
197*4882a593Smuzhiyun   :alt: Mode Objects and Properties
198*4882a593Smuzhiyun   :caption: Mode Objects and Properties
199*4882a593Smuzhiyun
200*4882a593Smuzhiyun   digraph {
201*4882a593Smuzhiyun      node [shape=box]
202*4882a593Smuzhiyun
203*4882a593Smuzhiyun      subgraph cluster_state {
204*4882a593Smuzhiyun          style=dashed
205*4882a593Smuzhiyun          label="Free-standing state"
206*4882a593Smuzhiyun
207*4882a593Smuzhiyun          "drm_atomic_state" -> "duplicated drm_plane_state A"
208*4882a593Smuzhiyun          "drm_atomic_state" -> "duplicated drm_plane_state B"
209*4882a593Smuzhiyun          "drm_atomic_state" -> "duplicated drm_crtc_state"
210*4882a593Smuzhiyun          "drm_atomic_state" -> "duplicated drm_connector_state"
211*4882a593Smuzhiyun          "drm_atomic_state" -> "duplicated driver private state"
212*4882a593Smuzhiyun      }
213*4882a593Smuzhiyun
214*4882a593Smuzhiyun      subgraph cluster_current {
215*4882a593Smuzhiyun          style=dashed
216*4882a593Smuzhiyun          label="Current state"
217*4882a593Smuzhiyun
218*4882a593Smuzhiyun          "drm_device" -> "drm_plane A"
219*4882a593Smuzhiyun          "drm_device" -> "drm_plane B"
220*4882a593Smuzhiyun          "drm_device" -> "drm_crtc"
221*4882a593Smuzhiyun          "drm_device" -> "drm_connector"
222*4882a593Smuzhiyun          "drm_device" -> "driver private object"
223*4882a593Smuzhiyun
224*4882a593Smuzhiyun          "drm_plane A" -> "drm_plane_state A"
225*4882a593Smuzhiyun          "drm_plane B" -> "drm_plane_state B"
226*4882a593Smuzhiyun          "drm_crtc" -> "drm_crtc_state"
227*4882a593Smuzhiyun          "drm_connector" -> "drm_connector_state"
228*4882a593Smuzhiyun          "driver private object" -> "driver private state"
229*4882a593Smuzhiyun      }
230*4882a593Smuzhiyun
231*4882a593Smuzhiyun      "drm_atomic_state" -> "drm_device" [label="atomic_commit"]
232*4882a593Smuzhiyun      "duplicated drm_plane_state A" -> "drm_device"[style=invis]
233*4882a593Smuzhiyun   }
234*4882a593Smuzhiyun
235*4882a593SmuzhiyunAtomic provides transactional modeset (including planes) updates, but a
236*4882a593Smuzhiyunbit differently from the usual transactional approach of try-commit and
237*4882a593Smuzhiyunrollback:
238*4882a593Smuzhiyun
239*4882a593Smuzhiyun- Firstly, no hardware changes are allowed when the commit would fail. This
240*4882a593Smuzhiyun  allows us to implement the DRM_MODE_ATOMIC_TEST_ONLY mode, which allows
241*4882a593Smuzhiyun  userspace to explore whether certain configurations would work or not.
242*4882a593Smuzhiyun
243*4882a593Smuzhiyun- This would still allow setting and rollback of just the software state,
244*4882a593Smuzhiyun  simplifying conversion of existing drivers. But auditing drivers for
245*4882a593Smuzhiyun  correctness of the atomic_check code becomes really hard with that: Rolling
246*4882a593Smuzhiyun  back changes in data structures all over the place is hard to get right.
247*4882a593Smuzhiyun
248*4882a593Smuzhiyun- Lastly, for backwards compatibility and to support all use-cases, atomic
249*4882a593Smuzhiyun  updates need to be incremental and be able to execute in parallel. Hardware
250*4882a593Smuzhiyun  doesn't always allow it, but where possible plane updates on different CRTCs
251*4882a593Smuzhiyun  should not interfere, and not get stalled due to output routing changing on
252*4882a593Smuzhiyun  different CRTCs.
253*4882a593Smuzhiyun
254*4882a593SmuzhiyunTaken all together there's two consequences for the atomic design:
255*4882a593Smuzhiyun
256*4882a593Smuzhiyun- The overall state is split up into per-object state structures:
257*4882a593Smuzhiyun  :c:type:`struct drm_plane_state <drm_plane_state>` for planes, :c:type:`struct
258*4882a593Smuzhiyun  drm_crtc_state <drm_crtc_state>` for CRTCs and :c:type:`struct
259*4882a593Smuzhiyun  drm_connector_state <drm_connector_state>` for connectors. These are the only
260*4882a593Smuzhiyun  objects with userspace-visible and settable state. For internal state drivers
261*4882a593Smuzhiyun  can subclass these structures through embeddeding, or add entirely new state
262*4882a593Smuzhiyun  structures for their globally shared hardware functions, see :c:type:`struct
263*4882a593Smuzhiyun  drm_private_state<drm_private_state>`.
264*4882a593Smuzhiyun
265*4882a593Smuzhiyun- An atomic update is assembled and validated as an entirely free-standing pile
266*4882a593Smuzhiyun  of structures within the :c:type:`drm_atomic_state <drm_atomic_state>`
267*4882a593Smuzhiyun  container. Driver private state structures are also tracked in the same
268*4882a593Smuzhiyun  structure; see the next chapter.  Only when a state is committed is it applied
269*4882a593Smuzhiyun  to the driver and modeset objects. This way rolling back an update boils down
270*4882a593Smuzhiyun  to releasing memory and unreferencing objects like framebuffers.
271*4882a593Smuzhiyun
272*4882a593SmuzhiyunLocking of atomic state structures is internally using :c:type:`struct
273*4882a593Smuzhiyundrm_modeset_lock <drm_modeset_lock>`. As a general rule the locking shouldn't be
274*4882a593Smuzhiyunexposed to drivers, instead the right locks should be automatically acquired by
275*4882a593Smuzhiyunany function that duplicates or peeks into a state, like e.g.
276*4882a593Smuzhiyundrm_atomic_get_crtc_state().  Locking only protects the software data
277*4882a593Smuzhiyunstructure, ordering of committing state changes to hardware is sequenced using
278*4882a593Smuzhiyun:c:type:`struct drm_crtc_commit <drm_crtc_commit>`.
279*4882a593Smuzhiyun
280*4882a593SmuzhiyunRead on in this chapter, and also in :ref:`drm_atomic_helper` for more detailed
281*4882a593Smuzhiyuncoverage of specific topics.
282*4882a593Smuzhiyun
283*4882a593SmuzhiyunHandling Driver Private State
284*4882a593Smuzhiyun-----------------------------
285*4882a593Smuzhiyun
286*4882a593Smuzhiyun.. kernel-doc:: drivers/gpu/drm/drm_atomic.c
287*4882a593Smuzhiyun   :doc: handling driver private state
288*4882a593Smuzhiyun
289*4882a593SmuzhiyunAtomic Mode Setting Function Reference
290*4882a593Smuzhiyun--------------------------------------
291*4882a593Smuzhiyun
292*4882a593Smuzhiyun.. kernel-doc:: include/drm/drm_atomic.h
293*4882a593Smuzhiyun   :internal:
294*4882a593Smuzhiyun
295*4882a593Smuzhiyun.. kernel-doc:: drivers/gpu/drm/drm_atomic.c
296*4882a593Smuzhiyun   :export:
297*4882a593Smuzhiyun
298*4882a593SmuzhiyunAtomic Mode Setting IOCTL and UAPI Functions
299*4882a593Smuzhiyun--------------------------------------------
300*4882a593Smuzhiyun
301*4882a593Smuzhiyun.. kernel-doc:: drivers/gpu/drm/drm_atomic_uapi.c
302*4882a593Smuzhiyun   :doc: overview
303*4882a593Smuzhiyun
304*4882a593Smuzhiyun.. kernel-doc:: drivers/gpu/drm/drm_atomic_uapi.c
305*4882a593Smuzhiyun   :export:
306*4882a593Smuzhiyun
307*4882a593SmuzhiyunCRTC Abstraction
308*4882a593Smuzhiyun================
309*4882a593Smuzhiyun
310*4882a593Smuzhiyun.. kernel-doc:: drivers/gpu/drm/drm_crtc.c
311*4882a593Smuzhiyun   :doc: overview
312*4882a593Smuzhiyun
313*4882a593SmuzhiyunCRTC Functions Reference
314*4882a593Smuzhiyun--------------------------------
315*4882a593Smuzhiyun
316*4882a593Smuzhiyun.. kernel-doc:: include/drm/drm_crtc.h
317*4882a593Smuzhiyun   :internal:
318*4882a593Smuzhiyun
319*4882a593Smuzhiyun.. kernel-doc:: drivers/gpu/drm/drm_crtc.c
320*4882a593Smuzhiyun   :export:
321*4882a593Smuzhiyun
322*4882a593SmuzhiyunFrame Buffer Abstraction
323*4882a593Smuzhiyun========================
324*4882a593Smuzhiyun
325*4882a593Smuzhiyun.. kernel-doc:: drivers/gpu/drm/drm_framebuffer.c
326*4882a593Smuzhiyun   :doc: overview
327*4882a593Smuzhiyun
328*4882a593SmuzhiyunFrame Buffer Functions Reference
329*4882a593Smuzhiyun--------------------------------
330*4882a593Smuzhiyun
331*4882a593Smuzhiyun.. kernel-doc:: include/drm/drm_framebuffer.h
332*4882a593Smuzhiyun   :internal:
333*4882a593Smuzhiyun
334*4882a593Smuzhiyun.. kernel-doc:: drivers/gpu/drm/drm_framebuffer.c
335*4882a593Smuzhiyun   :export:
336*4882a593Smuzhiyun
337*4882a593SmuzhiyunDRM Format Handling
338*4882a593Smuzhiyun===================
339*4882a593Smuzhiyun
340*4882a593Smuzhiyun.. kernel-doc:: include/uapi/drm/drm_fourcc.h
341*4882a593Smuzhiyun   :doc: overview
342*4882a593Smuzhiyun
343*4882a593SmuzhiyunFormat Functions Reference
344*4882a593Smuzhiyun--------------------------
345*4882a593Smuzhiyun
346*4882a593Smuzhiyun.. kernel-doc:: include/drm/drm_fourcc.h
347*4882a593Smuzhiyun   :internal:
348*4882a593Smuzhiyun
349*4882a593Smuzhiyun.. kernel-doc:: drivers/gpu/drm/drm_fourcc.c
350*4882a593Smuzhiyun   :export:
351*4882a593Smuzhiyun
352*4882a593SmuzhiyunDumb Buffer Objects
353*4882a593Smuzhiyun===================
354*4882a593Smuzhiyun
355*4882a593Smuzhiyun.. kernel-doc:: drivers/gpu/drm/drm_dumb_buffers.c
356*4882a593Smuzhiyun   :doc: overview
357*4882a593Smuzhiyun
358*4882a593SmuzhiyunPlane Abstraction
359*4882a593Smuzhiyun=================
360*4882a593Smuzhiyun
361*4882a593Smuzhiyun.. kernel-doc:: drivers/gpu/drm/drm_plane.c
362*4882a593Smuzhiyun   :doc: overview
363*4882a593Smuzhiyun
364*4882a593SmuzhiyunPlane Functions Reference
365*4882a593Smuzhiyun-------------------------
366*4882a593Smuzhiyun
367*4882a593Smuzhiyun.. kernel-doc:: include/drm/drm_plane.h
368*4882a593Smuzhiyun   :internal:
369*4882a593Smuzhiyun
370*4882a593Smuzhiyun.. kernel-doc:: drivers/gpu/drm/drm_plane.c
371*4882a593Smuzhiyun   :export:
372*4882a593Smuzhiyun
373*4882a593SmuzhiyunDisplay Modes Function Reference
374*4882a593Smuzhiyun================================
375*4882a593Smuzhiyun
376*4882a593Smuzhiyun.. kernel-doc:: include/drm/drm_modes.h
377*4882a593Smuzhiyun   :internal:
378*4882a593Smuzhiyun
379*4882a593Smuzhiyun.. kernel-doc:: drivers/gpu/drm/drm_modes.c
380*4882a593Smuzhiyun   :export:
381*4882a593Smuzhiyun
382*4882a593SmuzhiyunConnector Abstraction
383*4882a593Smuzhiyun=====================
384*4882a593Smuzhiyun
385*4882a593Smuzhiyun.. kernel-doc:: drivers/gpu/drm/drm_connector.c
386*4882a593Smuzhiyun   :doc: overview
387*4882a593Smuzhiyun
388*4882a593SmuzhiyunConnector Functions Reference
389*4882a593Smuzhiyun-----------------------------
390*4882a593Smuzhiyun
391*4882a593Smuzhiyun.. kernel-doc:: include/drm/drm_connector.h
392*4882a593Smuzhiyun   :internal:
393*4882a593Smuzhiyun
394*4882a593Smuzhiyun.. kernel-doc:: drivers/gpu/drm/drm_connector.c
395*4882a593Smuzhiyun   :export:
396*4882a593Smuzhiyun
397*4882a593SmuzhiyunWriteback Connectors
398*4882a593Smuzhiyun--------------------
399*4882a593Smuzhiyun
400*4882a593Smuzhiyun.. kernel-doc:: include/drm/drm_writeback.h
401*4882a593Smuzhiyun  :internal:
402*4882a593Smuzhiyun
403*4882a593Smuzhiyun.. kernel-doc:: drivers/gpu/drm/drm_writeback.c
404*4882a593Smuzhiyun  :doc: overview
405*4882a593Smuzhiyun
406*4882a593Smuzhiyun.. kernel-doc:: drivers/gpu/drm/drm_writeback.c
407*4882a593Smuzhiyun  :export:
408*4882a593Smuzhiyun
409*4882a593SmuzhiyunEncoder Abstraction
410*4882a593Smuzhiyun===================
411*4882a593Smuzhiyun
412*4882a593Smuzhiyun.. kernel-doc:: drivers/gpu/drm/drm_encoder.c
413*4882a593Smuzhiyun   :doc: overview
414*4882a593Smuzhiyun
415*4882a593SmuzhiyunEncoder Functions Reference
416*4882a593Smuzhiyun---------------------------
417*4882a593Smuzhiyun
418*4882a593Smuzhiyun.. kernel-doc:: include/drm/drm_encoder.h
419*4882a593Smuzhiyun   :internal:
420*4882a593Smuzhiyun
421*4882a593Smuzhiyun.. kernel-doc:: drivers/gpu/drm/drm_encoder.c
422*4882a593Smuzhiyun   :export:
423*4882a593Smuzhiyun
424*4882a593SmuzhiyunKMS Locking
425*4882a593Smuzhiyun===========
426*4882a593Smuzhiyun
427*4882a593Smuzhiyun.. kernel-doc:: drivers/gpu/drm/drm_modeset_lock.c
428*4882a593Smuzhiyun   :doc: kms locking
429*4882a593Smuzhiyun
430*4882a593Smuzhiyun.. kernel-doc:: include/drm/drm_modeset_lock.h
431*4882a593Smuzhiyun   :internal:
432*4882a593Smuzhiyun
433*4882a593Smuzhiyun.. kernel-doc:: drivers/gpu/drm/drm_modeset_lock.c
434*4882a593Smuzhiyun   :export:
435*4882a593Smuzhiyun
436*4882a593SmuzhiyunKMS Properties
437*4882a593Smuzhiyun==============
438*4882a593Smuzhiyun
439*4882a593SmuzhiyunProperty Types and Blob Property Support
440*4882a593Smuzhiyun----------------------------------------
441*4882a593Smuzhiyun
442*4882a593Smuzhiyun.. kernel-doc:: drivers/gpu/drm/drm_property.c
443*4882a593Smuzhiyun   :doc: overview
444*4882a593Smuzhiyun
445*4882a593Smuzhiyun.. kernel-doc:: include/drm/drm_property.h
446*4882a593Smuzhiyun   :internal:
447*4882a593Smuzhiyun
448*4882a593Smuzhiyun.. kernel-doc:: drivers/gpu/drm/drm_property.c
449*4882a593Smuzhiyun   :export:
450*4882a593Smuzhiyun
451*4882a593SmuzhiyunStandard Connector Properties
452*4882a593Smuzhiyun-----------------------------
453*4882a593Smuzhiyun
454*4882a593Smuzhiyun.. kernel-doc:: drivers/gpu/drm/drm_connector.c
455*4882a593Smuzhiyun   :doc: standard connector properties
456*4882a593Smuzhiyun
457*4882a593SmuzhiyunHDMI Specific Connector Properties
458*4882a593Smuzhiyun----------------------------------
459*4882a593Smuzhiyun
460*4882a593Smuzhiyun.. kernel-doc:: drivers/gpu/drm/drm_connector.c
461*4882a593Smuzhiyun   :doc: HDMI connector properties
462*4882a593Smuzhiyun
463*4882a593SmuzhiyunStandard CRTC Properties
464*4882a593Smuzhiyun------------------------
465*4882a593Smuzhiyun
466*4882a593Smuzhiyun.. kernel-doc:: drivers/gpu/drm/drm_crtc.c
467*4882a593Smuzhiyun   :doc: standard CRTC properties
468*4882a593Smuzhiyun
469*4882a593SmuzhiyunPlane Composition Properties
470*4882a593Smuzhiyun----------------------------
471*4882a593Smuzhiyun
472*4882a593Smuzhiyun.. kernel-doc:: drivers/gpu/drm/drm_blend.c
473*4882a593Smuzhiyun   :doc: overview
474*4882a593Smuzhiyun
475*4882a593Smuzhiyun.. kernel-doc:: drivers/gpu/drm/drm_blend.c
476*4882a593Smuzhiyun   :export:
477*4882a593Smuzhiyun
478*4882a593SmuzhiyunFB_DAMAGE_CLIPS
479*4882a593Smuzhiyun~~~~~~~~~~~~~~~
480*4882a593Smuzhiyun
481*4882a593Smuzhiyun.. kernel-doc:: drivers/gpu/drm/drm_damage_helper.c
482*4882a593Smuzhiyun   :doc: overview
483*4882a593Smuzhiyun
484*4882a593Smuzhiyun.. kernel-doc:: drivers/gpu/drm/drm_damage_helper.c
485*4882a593Smuzhiyun   :export:
486*4882a593Smuzhiyun
487*4882a593Smuzhiyun.. kernel-doc:: include/drm/drm_damage_helper.h
488*4882a593Smuzhiyun   :internal:
489*4882a593Smuzhiyun
490*4882a593SmuzhiyunColor Management Properties
491*4882a593Smuzhiyun---------------------------
492*4882a593Smuzhiyun
493*4882a593Smuzhiyun.. kernel-doc:: drivers/gpu/drm/drm_color_mgmt.c
494*4882a593Smuzhiyun   :doc: overview
495*4882a593Smuzhiyun
496*4882a593Smuzhiyun.. kernel-doc:: drivers/gpu/drm/drm_color_mgmt.c
497*4882a593Smuzhiyun   :export:
498*4882a593Smuzhiyun
499*4882a593Smuzhiyun.. kernel-doc:: include/drm/drm_color_mgmt.h
500*4882a593Smuzhiyun   :internal:
501*4882a593Smuzhiyun
502*4882a593SmuzhiyunTile Group Property
503*4882a593Smuzhiyun-------------------
504*4882a593Smuzhiyun
505*4882a593Smuzhiyun.. kernel-doc:: drivers/gpu/drm/drm_connector.c
506*4882a593Smuzhiyun   :doc: Tile group
507*4882a593Smuzhiyun
508*4882a593SmuzhiyunExplicit Fencing Properties
509*4882a593Smuzhiyun---------------------------
510*4882a593Smuzhiyun
511*4882a593Smuzhiyun.. kernel-doc:: drivers/gpu/drm/drm_atomic_uapi.c
512*4882a593Smuzhiyun   :doc: explicit fencing properties
513*4882a593Smuzhiyun
514*4882a593Smuzhiyun
515*4882a593SmuzhiyunVariable Refresh Properties
516*4882a593Smuzhiyun---------------------------
517*4882a593Smuzhiyun
518*4882a593Smuzhiyun.. kernel-doc:: drivers/gpu/drm/drm_connector.c
519*4882a593Smuzhiyun   :doc: Variable refresh properties
520*4882a593Smuzhiyun
521*4882a593SmuzhiyunExisting KMS Properties
522*4882a593Smuzhiyun-----------------------
523*4882a593Smuzhiyun
524*4882a593SmuzhiyunThe following table gives description of drm properties exposed by various
525*4882a593Smuzhiyunmodules/drivers. Because this table is very unwieldy, do not add any new
526*4882a593Smuzhiyunproperties here. Instead document them in a section above.
527*4882a593Smuzhiyun
528*4882a593Smuzhiyun.. csv-table::
529*4882a593Smuzhiyun   :header-rows: 1
530*4882a593Smuzhiyun   :file: kms-properties.csv
531*4882a593Smuzhiyun
532*4882a593SmuzhiyunVertical Blanking
533*4882a593Smuzhiyun=================
534*4882a593Smuzhiyun
535*4882a593Smuzhiyun.. kernel-doc:: drivers/gpu/drm/drm_vblank.c
536*4882a593Smuzhiyun   :doc: vblank handling
537*4882a593Smuzhiyun
538*4882a593SmuzhiyunVertical Blanking and Interrupt Handling Functions Reference
539*4882a593Smuzhiyun------------------------------------------------------------
540*4882a593Smuzhiyun
541*4882a593Smuzhiyun.. kernel-doc:: include/drm/drm_vblank.h
542*4882a593Smuzhiyun   :internal:
543*4882a593Smuzhiyun
544*4882a593Smuzhiyun.. kernel-doc:: drivers/gpu/drm/drm_vblank.c
545*4882a593Smuzhiyun   :export:
546*4882a593Smuzhiyun
547*4882a593SmuzhiyunVertical Blank Work
548*4882a593Smuzhiyun===================
549*4882a593Smuzhiyun
550*4882a593Smuzhiyun.. kernel-doc:: drivers/gpu/drm/drm_vblank_work.c
551*4882a593Smuzhiyun   :doc: vblank works
552*4882a593Smuzhiyun
553*4882a593SmuzhiyunVertical Blank Work Functions Reference
554*4882a593Smuzhiyun---------------------------------------
555*4882a593Smuzhiyun
556*4882a593Smuzhiyun.. kernel-doc:: include/drm/drm_vblank_work.h
557*4882a593Smuzhiyun   :internal:
558*4882a593Smuzhiyun
559*4882a593Smuzhiyun.. kernel-doc:: drivers/gpu/drm/drm_vblank_work.c
560*4882a593Smuzhiyun   :export:
561