xref: /linux/Documentation/gpu/drm-kms.rst (revision e5c86679d5e864947a52fb31e45a425dea3e7fa9)
1=========================
2Kernel Mode Setting (KMS)
3=========================
4
5Drivers must initialize the mode setting core by calling
6:c:func:`drm_mode_config_init()` on the DRM device. The function
7initializes the :c:type:`struct drm_device <drm_device>`
8mode_config field and never fails. Once done, mode configuration must
9be setup by initializing the following fields.
10
11-  int min_width, min_height; int max_width, max_height;
12   Minimum and maximum width and height of the frame buffers in pixel
13   units.
14
15-  struct drm_mode_config_funcs \*funcs;
16   Mode setting functions.
17
18Mode Configuration
19
20KMS Core Structures and Functions
21=================================
22
23.. kernel-doc:: drivers/gpu/drm/drm_mode_config.c
24   :export:
25
26.. kernel-doc:: include/drm/drm_mode_config.h
27   :internal:
28
29Modeset Base Object Abstraction
30===============================
31
32.. kernel-doc:: include/drm/drm_mode_object.h
33   :internal:
34
35.. kernel-doc:: drivers/gpu/drm/drm_mode_object.c
36   :export:
37
38Atomic Mode Setting Function Reference
39======================================
40
41.. kernel-doc:: drivers/gpu/drm/drm_atomic.c
42   :export:
43
44.. kernel-doc:: include/drm/drm_atomic.h
45   :internal:
46
47CRTC Abstraction
48================
49
50.. kernel-doc:: drivers/gpu/drm/drm_crtc.c
51   :doc: overview
52
53CRTC Functions Reference
54--------------------------------
55
56.. kernel-doc:: include/drm/drm_crtc.h
57   :internal:
58
59.. kernel-doc:: drivers/gpu/drm/drm_crtc.c
60   :export:
61
62Frame Buffer Abstraction
63========================
64
65.. kernel-doc:: drivers/gpu/drm/drm_framebuffer.c
66   :doc: overview
67
68Frame Buffer Functions Reference
69--------------------------------
70
71.. kernel-doc:: drivers/gpu/drm/drm_framebuffer.c
72   :export:
73
74.. kernel-doc:: include/drm/drm_framebuffer.h
75   :internal:
76
77DRM Format Handling
78===================
79
80.. kernel-doc:: include/drm/drm_fourcc.h
81   :internal:
82
83.. kernel-doc:: drivers/gpu/drm/drm_fourcc.c
84   :export:
85
86Dumb Buffer Objects
87===================
88
89.. kernel-doc:: drivers/gpu/drm/drm_dumb_buffers.c
90   :doc: overview
91
92Plane Abstraction
93=================
94
95.. kernel-doc:: drivers/gpu/drm/drm_plane.c
96   :doc: overview
97
98Plane Functions Reference
99-------------------------
100
101.. kernel-doc:: include/drm/drm_plane.h
102   :internal:
103
104.. kernel-doc:: drivers/gpu/drm/drm_plane.c
105   :export:
106
107Display Modes Function Reference
108================================
109
110.. kernel-doc:: include/drm/drm_modes.h
111   :internal:
112
113.. kernel-doc:: drivers/gpu/drm/drm_modes.c
114   :export:
115
116Connector Abstraction
117=====================
118
119.. kernel-doc:: drivers/gpu/drm/drm_connector.c
120   :doc: overview
121
122Connector Functions Reference
123-----------------------------
124
125.. kernel-doc:: include/drm/drm_connector.h
126   :internal:
127
128.. kernel-doc:: drivers/gpu/drm/drm_connector.c
129   :export:
130
131Encoder Abstraction
132===================
133
134.. kernel-doc:: drivers/gpu/drm/drm_encoder.c
135   :doc: overview
136
137Encoder Functions Reference
138---------------------------
139
140.. kernel-doc:: include/drm/drm_encoder.h
141   :internal:
142
143.. kernel-doc:: drivers/gpu/drm/drm_encoder.c
144   :export:
145
146KMS Initialization and Cleanup
147==============================
148
149A KMS device is abstracted and exposed as a set of planes, CRTCs,
150encoders and connectors. KMS drivers must thus create and initialize all
151those objects at load time after initializing mode setting.
152
153CRTCs (:c:type:`struct drm_crtc <drm_crtc>`)
154--------------------------------------------
155
156A CRTC is an abstraction representing a part of the chip that contains a
157pointer to a scanout buffer. Therefore, the number of CRTCs available
158determines how many independent scanout buffers can be active at any
159given time. The CRTC structure contains several fields to support this:
160a pointer to some video memory (abstracted as a frame buffer object), a
161display mode, and an (x, y) offset into the video memory to support
162panning or configurations where one piece of video memory spans multiple
163CRTCs.
164
165CRTC Initialization
166~~~~~~~~~~~~~~~~~~~
167
168A KMS device must create and register at least one struct
169:c:type:`struct drm_crtc <drm_crtc>` instance. The instance is
170allocated and zeroed by the driver, possibly as part of a larger
171structure, and registered with a call to :c:func:`drm_crtc_init()`
172with a pointer to CRTC functions.
173
174
175Cleanup
176-------
177
178The DRM core manages its objects' lifetime. When an object is not needed
179anymore the core calls its destroy function, which must clean up and
180free every resource allocated for the object. Every
181:c:func:`drm_\*_init()` call must be matched with a corresponding
182:c:func:`drm_\*_cleanup()` call to cleanup CRTCs
183(:c:func:`drm_crtc_cleanup()`), planes
184(:c:func:`drm_plane_cleanup()`), encoders
185(:c:func:`drm_encoder_cleanup()`) and connectors
186(:c:func:`drm_connector_cleanup()`). Furthermore, connectors that
187have been added to sysfs must be removed by a call to
188:c:func:`drm_connector_unregister()` before calling
189:c:func:`drm_connector_cleanup()`.
190
191Connectors state change detection must be cleanup up with a call to
192:c:func:`drm_kms_helper_poll_fini()`.
193
194Output discovery and initialization example
195-------------------------------------------
196
197.. code-block:: c
198
199    void intel_crt_init(struct drm_device *dev)
200    {
201        struct drm_connector *connector;
202        struct intel_output *intel_output;
203
204        intel_output = kzalloc(sizeof(struct intel_output), GFP_KERNEL);
205        if (!intel_output)
206            return;
207
208        connector = &intel_output->base;
209        drm_connector_init(dev, &intel_output->base,
210                   &intel_crt_connector_funcs, DRM_MODE_CONNECTOR_VGA);
211
212        drm_encoder_init(dev, &intel_output->enc, &intel_crt_enc_funcs,
213                 DRM_MODE_ENCODER_DAC);
214
215        drm_mode_connector_attach_encoder(&intel_output->base,
216                          &intel_output->enc);
217
218        /* Set up the DDC bus. */
219        intel_output->ddc_bus = intel_i2c_create(dev, GPIOA, "CRTDDC_A");
220        if (!intel_output->ddc_bus) {
221            dev_printk(KERN_ERR, &dev->pdev->dev, "DDC bus registration "
222                   "failed.\n");
223            return;
224        }
225
226        intel_output->type = INTEL_OUTPUT_ANALOG;
227        connector->interlace_allowed = 0;
228        connector->doublescan_allowed = 0;
229
230        drm_encoder_helper_add(&intel_output->enc, &intel_crt_helper_funcs);
231        drm_connector_helper_add(connector, &intel_crt_connector_helper_funcs);
232
233        drm_connector_register(connector);
234    }
235
236In the example above (taken from the i915 driver), a CRTC, connector and
237encoder combination is created. A device-specific i2c bus is also
238created for fetching EDID data and performing monitor detection. Once
239the process is complete, the new connector is registered with sysfs to
240make its properties available to applications.
241
242KMS Locking
243===========
244
245.. kernel-doc:: drivers/gpu/drm/drm_modeset_lock.c
246   :doc: kms locking
247
248.. kernel-doc:: include/drm/drm_modeset_lock.h
249   :internal:
250
251.. kernel-doc:: drivers/gpu/drm/drm_modeset_lock.c
252   :export:
253
254KMS Properties
255==============
256
257Property Types and Blob Property Support
258----------------------------------------
259
260.. kernel-doc:: drivers/gpu/drm/drm_property.c
261   :doc: overview
262
263.. kernel-doc:: include/drm/drm_property.h
264   :internal:
265
266.. kernel-doc:: drivers/gpu/drm/drm_property.c
267   :export:
268
269Standard Connector Properties
270-----------------------------
271
272.. kernel-doc:: drivers/gpu/drm/drm_connector.c
273   :doc: standard connector properties
274
275Plane Composition Properties
276----------------------------
277
278.. kernel-doc:: drivers/gpu/drm/drm_blend.c
279   :doc: overview
280
281.. kernel-doc:: drivers/gpu/drm/drm_blend.c
282   :export:
283
284Color Management Properties
285---------------------------
286
287.. kernel-doc:: drivers/gpu/drm/drm_color_mgmt.c
288   :doc: overview
289
290.. kernel-doc:: include/drm/drm_color_mgmt.h
291   :internal:
292
293.. kernel-doc:: drivers/gpu/drm/drm_color_mgmt.c
294   :export:
295
296Tile Group Property
297-------------------
298
299.. kernel-doc:: drivers/gpu/drm/drm_connector.c
300   :doc: Tile group
301
302Explicit Fencing Properties
303---------------------------
304
305.. kernel-doc:: drivers/gpu/drm/drm_atomic.c
306   :doc: explicit fencing properties
307
308Existing KMS Properties
309-----------------------
310
311The following table gives description of drm properties exposed by
312various modules/drivers.
313
314.. csv-table::
315   :header-rows: 1
316   :file: kms-properties.csv
317
318Vertical Blanking
319=================
320
321Vertical blanking plays a major role in graphics rendering. To achieve
322tear-free display, users must synchronize page flips and/or rendering to
323vertical blanking. The DRM API offers ioctls to perform page flips
324synchronized to vertical blanking and wait for vertical blanking.
325
326The DRM core handles most of the vertical blanking management logic,
327which involves filtering out spurious interrupts, keeping race-free
328blanking counters, coping with counter wrap-around and resets and
329keeping use counts. It relies on the driver to generate vertical
330blanking interrupts and optionally provide a hardware vertical blanking
331counter. Drivers must implement the following operations.
332
333-  int (\*enable_vblank) (struct drm_device \*dev, int crtc); void
334   (\*disable_vblank) (struct drm_device \*dev, int crtc);
335   Enable or disable vertical blanking interrupts for the given CRTC.
336
337-  u32 (\*get_vblank_counter) (struct drm_device \*dev, int crtc);
338   Retrieve the value of the vertical blanking counter for the given
339   CRTC. If the hardware maintains a vertical blanking counter its value
340   should be returned. Otherwise drivers can use the
341   :c:func:`drm_vblank_count()` helper function to handle this
342   operation.
343
344Drivers must initialize the vertical blanking handling core with a call
345to :c:func:`drm_vblank_init()` in their load operation.
346
347Vertical blanking interrupts can be enabled by the DRM core or by
348drivers themselves (for instance to handle page flipping operations).
349The DRM core maintains a vertical blanking use count to ensure that the
350interrupts are not disabled while a user still needs them. To increment
351the use count, drivers call :c:func:`drm_vblank_get()`. Upon
352return vertical blanking interrupts are guaranteed to be enabled.
353
354To decrement the use count drivers call
355:c:func:`drm_vblank_put()`. Only when the use count drops to zero
356will the DRM core disable the vertical blanking interrupts after a delay
357by scheduling a timer. The delay is accessible through the
358vblankoffdelay module parameter or the ``drm_vblank_offdelay`` global
359variable and expressed in milliseconds. Its default value is 5000 ms.
360Zero means never disable, and a negative value means disable
361immediately. Drivers may override the behaviour by setting the
362:c:type:`struct drm_device <drm_device>`
363vblank_disable_immediate flag, which when set causes vblank interrupts
364to be disabled immediately regardless of the drm_vblank_offdelay
365value. The flag should only be set if there's a properly working
366hardware vblank counter present.
367
368When a vertical blanking interrupt occurs drivers only need to call the
369:c:func:`drm_handle_vblank()` function to account for the
370interrupt.
371
372Resources allocated by :c:func:`drm_vblank_init()` must be freed
373with a call to :c:func:`drm_vblank_cleanup()` in the driver unload
374operation handler.
375
376Vertical Blanking and Interrupt Handling Functions Reference
377------------------------------------------------------------
378
379.. kernel-doc:: drivers/gpu/drm/drm_irq.c
380   :export:
381
382.. kernel-doc:: include/drm/drm_irq.h
383   :internal:
384