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