linux/Documentation/gpu/drm-kms.rst
<<
>>
Prefs
   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