1 =========================
2 Kernel Mode Setting (KMS)
3 =========================
5 Drivers must initialize the mode setting core by calling
6 :c:func:`drm_mode_config_init()` on the DRM device. The function
7 initializes the :c:type:`struct drm_device <drm_device>`
8 mode_config field and never fails. Once done, mode configuration must
9 be setup by initializing the following fields.
11 - int min_width, min_height; int max_width, max_height;
12 Minimum and maximum width and height of the frame buffers in pixel
15 - struct drm_mode_config_funcs \*funcs;
16 Mode setting functions.
20 KMS Core Structures and Functions
21 =================================
23 .. kernel-doc:: drivers/gpu/drm/drm_mode_config.c
26 .. kernel-doc:: include/drm/drm_mode_config.h
29 Modeset Base Object Abstraction
30 ===============================
32 .. kernel-doc:: include/drm/drm_mode_object.h
35 .. kernel-doc:: drivers/gpu/drm/drm_mode_object.c
38 Atomic Mode Setting Function Reference
39 ======================================
41 .. kernel-doc:: drivers/gpu/drm/drm_atomic.c
44 .. kernel-doc:: include/drm/drm_atomic.h
50 .. kernel-doc:: drivers/gpu/drm/drm_crtc.c
53 CRTC Functions Reference
54 --------------------------------
56 .. kernel-doc:: include/drm/drm_crtc.h
59 .. kernel-doc:: drivers/gpu/drm/drm_crtc.c
62 Frame Buffer Abstraction
63 ========================
65 .. kernel-doc:: drivers/gpu/drm/drm_framebuffer.c
68 Frame Buffer Functions Reference
69 --------------------------------
71 .. kernel-doc:: drivers/gpu/drm/drm_framebuffer.c
74 .. kernel-doc:: include/drm/drm_framebuffer.h
80 .. kernel-doc:: include/drm/drm_fourcc.h
83 .. kernel-doc:: drivers/gpu/drm/drm_fourcc.c
89 .. kernel-doc:: drivers/gpu/drm/drm_dumb_buffers.c
95 .. kernel-doc:: drivers/gpu/drm/drm_plane.c
98 Plane Functions Reference
99 -------------------------
101 .. kernel-doc:: include/drm/drm_plane.h
104 .. kernel-doc:: drivers/gpu/drm/drm_plane.c
107 Display Modes Function Reference
108 ================================
110 .. kernel-doc:: include/drm/drm_modes.h
113 .. kernel-doc:: drivers/gpu/drm/drm_modes.c
116 Connector Abstraction
117 =====================
119 .. kernel-doc:: drivers/gpu/drm/drm_connector.c
122 Connector Functions Reference
123 -----------------------------
125 .. kernel-doc:: include/drm/drm_connector.h
128 .. kernel-doc:: drivers/gpu/drm/drm_connector.c
134 .. kernel-doc:: drivers/gpu/drm/drm_encoder.c
137 Encoder Functions Reference
138 ---------------------------
140 .. kernel-doc:: include/drm/drm_encoder.h
143 .. kernel-doc:: drivers/gpu/drm/drm_encoder.c
146 KMS Initialization and Cleanup
147 ==============================
149 A KMS device is abstracted and exposed as a set of planes, CRTCs,
150 encoders and connectors. KMS drivers must thus create and initialize all
151 those objects at load time after initializing mode setting.
153 CRTCs (:c:type:`struct drm_crtc <drm_crtc>`)
154 --------------------------------------------
156 A CRTC is an abstraction representing a part of the chip that contains a
157 pointer to a scanout buffer. Therefore, the number of CRTCs available
158 determines how many independent scanout buffers can be active at any
159 given time. The CRTC structure contains several fields to support this:
160 a pointer to some video memory (abstracted as a frame buffer object), a
161 display mode, and an (x, y) offset into the video memory to support
162 panning or configurations where one piece of video memory spans multiple
168 A KMS device must create and register at least one struct
169 :c:type:`struct drm_crtc <drm_crtc>` instance. The instance is
170 allocated and zeroed by the driver, possibly as part of a larger
171 structure, and registered with a call to :c:func:`drm_crtc_init()`
172 with a pointer to CRTC functions.
178 The DRM core manages its objects' lifetime. When an object is not needed
179 anymore the core calls its destroy function, which must clean up and
180 free 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
187 have 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()`.
191 Connectors state change detection must be cleanup up with a call to
192 :c:func:`drm_kms_helper_poll_fini()`.
194 Output discovery and initialization example
195 -------------------------------------------
199 void intel_crt_init(struct drm_device *dev)
201 struct drm_connector *connector;
202 struct intel_output *intel_output;
204 intel_output = kzalloc(sizeof(struct intel_output), GFP_KERNEL);
208 connector = &intel_output->base;
209 drm_connector_init(dev, &intel_output->base,
210 &intel_crt_connector_funcs, DRM_MODE_CONNECTOR_VGA);
212 drm_encoder_init(dev, &intel_output->enc, &intel_crt_enc_funcs,
213 DRM_MODE_ENCODER_DAC);
215 drm_mode_connector_attach_encoder(&intel_output->base,
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 "
226 intel_output->type = INTEL_OUTPUT_ANALOG;
227 connector->interlace_allowed = 0;
228 connector->doublescan_allowed = 0;
230 drm_encoder_helper_add(&intel_output->enc, &intel_crt_helper_funcs);
231 drm_connector_helper_add(connector, &intel_crt_connector_helper_funcs);
233 drm_connector_register(connector);
236 In the example above (taken from the i915 driver), a CRTC, connector and
237 encoder combination is created. A device-specific i2c bus is also
238 created for fetching EDID data and performing monitor detection. Once
239 the process is complete, the new connector is registered with sysfs to
240 make its properties available to applications.
245 .. kernel-doc:: drivers/gpu/drm/drm_modeset_lock.c
248 .. kernel-doc:: include/drm/drm_modeset_lock.h
251 .. kernel-doc:: drivers/gpu/drm/drm_modeset_lock.c
257 Property Types and Blob Property Support
258 ----------------------------------------
260 .. kernel-doc:: drivers/gpu/drm/drm_property.c
263 .. kernel-doc:: include/drm/drm_property.h
266 .. kernel-doc:: drivers/gpu/drm/drm_property.c
269 Standard Connector Properties
270 -----------------------------
272 .. kernel-doc:: drivers/gpu/drm/drm_connector.c
273 :doc: standard connector properties
275 Plane Composition Properties
276 ----------------------------
278 .. kernel-doc:: drivers/gpu/drm/drm_blend.c
281 .. kernel-doc:: drivers/gpu/drm/drm_blend.c
284 Color Management Properties
285 ---------------------------
287 .. kernel-doc:: drivers/gpu/drm/drm_color_mgmt.c
290 .. kernel-doc:: include/drm/drm_color_mgmt.h
293 .. kernel-doc:: drivers/gpu/drm/drm_color_mgmt.c
299 .. kernel-doc:: drivers/gpu/drm/drm_connector.c
302 Explicit Fencing Properties
303 ---------------------------
305 .. kernel-doc:: drivers/gpu/drm/drm_atomic.c
306 :doc: explicit fencing properties
308 Existing KMS Properties
309 -----------------------
311 The following table gives description of drm properties exposed by
312 various modules/drivers.
316 :file: kms-properties.csv
321 Vertical blanking plays a major role in graphics rendering. To achieve
322 tear-free display, users must synchronize page flips and/or rendering to
323 vertical blanking. The DRM API offers ioctls to perform page flips
324 synchronized to vertical blanking and wait for vertical blanking.
326 The DRM core handles most of the vertical blanking management logic,
327 which involves filtering out spurious interrupts, keeping race-free
328 blanking counters, coping with counter wrap-around and resets and
329 keeping use counts. It relies on the driver to generate vertical
330 blanking interrupts and optionally provide a hardware vertical blanking
331 counter. Drivers must implement the following operations.
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.
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
344 Drivers must initialize the vertical blanking handling core with a call
345 to :c:func:`drm_vblank_init()` in their load operation.
347 Vertical blanking interrupts can be enabled by the DRM core or by
348 drivers themselves (for instance to handle page flipping operations).
349 The DRM core maintains a vertical blanking use count to ensure that the
350 interrupts are not disabled while a user still needs them. To increment
351 the use count, drivers call :c:func:`drm_vblank_get()`. Upon
352 return vertical blanking interrupts are guaranteed to be enabled.
354 To decrement the use count drivers call
355 :c:func:`drm_vblank_put()`. Only when the use count drops to zero
356 will the DRM core disable the vertical blanking interrupts after a delay
357 by scheduling a timer. The delay is accessible through the
358 vblankoffdelay module parameter or the ``drm_vblank_offdelay`` global
359 variable and expressed in milliseconds. Its default value is 5000 ms.
360 Zero means never disable, and a negative value means disable
361 immediately. Drivers may override the behaviour by setting the
362 :c:type:`struct drm_device <drm_device>`
363 vblank_disable_immediate flag, which when set causes vblank interrupts
364 to be disabled immediately regardless of the drm_vblank_offdelay
365 value. The flag should only be set if there's a properly working
366 hardware vblank counter present.
368 When a vertical blanking interrupt occurs drivers only need to call the
369 :c:func:`drm_handle_vblank()` function to account for the
372 Resources allocated by :c:func:`drm_vblank_init()` must be freed
373 with a call to :c:func:`drm_vblank_cleanup()` in the driver unload
376 Vertical Blanking and Interrupt Handling Functions Reference
377 ------------------------------------------------------------
379 .. kernel-doc:: drivers/gpu/drm/drm_irq.c
382 .. kernel-doc:: include/drm/drm_irq.h