| ====================== | |
| AMDgpu Display Manager | |
| ====================== | |
| .. contents:: Table of Contents | |
| :depth: 3 | |
| .. kernel-doc:: drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | |
| :doc: overview | |
| .. kernel-doc:: drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h | |
| :internal: | |
| Lifecycle | |
| ========= | |
| .. kernel-doc:: drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | |
| :doc: DM Lifecycle | |
| .. kernel-doc:: drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | |
| :functions: dm_hw_init dm_hw_fini | |
| Interrupts | |
| ========== | |
| .. kernel-doc:: drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_irq.c | |
| :doc: overview | |
| .. kernel-doc:: drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_irq.c | |
| :internal: | |
| .. kernel-doc:: drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | |
| :functions: register_hpd_handlers dm_crtc_high_irq dm_pflip_high_irq | |
| .. kernel-doc:: drivers/gpu/drm/amd/amdgpu/amdgpu_display.c | |
| :functions: amdgpu_display_hotplug_work_func | |
| Atomic Implementation | |
| ===================== | |
| .. kernel-doc:: drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | |
| :doc: atomic | |
| .. kernel-doc:: drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | |
| :functions: amdgpu_dm_atomic_check amdgpu_dm_atomic_commit_tail | |
| Color Management Properties | |
| =========================== | |
| .. kernel-doc:: drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_color.c | |
| :doc: overview | |
| .. kernel-doc:: drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_color.c | |
| :internal: | |
| DC Color Capabilities between DCN generations | |
| --------------------------------------------- | |
| DRM/KMS framework defines three CRTC color correction properties: degamma, | |
| color transformation matrix (CTM) and gamma, and two properties for degamma and | |
| gamma LUT sizes. AMD DC programs some of the color correction features | |
| pre-blending but DRM/KMS has not per-plane color correction properties. | |
| In general, the DRM CRTC color properties are programmed to DC, as follows: | |
| CRTC gamma after blending, and CRTC degamma pre-blending. Although CTM is | |
| programmed after blending, it is mapped to DPP hw blocks (pre-blending). Other | |
| color caps available in the hw is not currently exposed by DRM interface and | |
| are bypassed. | |
| .. kernel-doc:: drivers/gpu/drm/amd/display/dc/dc.h | |
| :doc: color-management-caps | |
| .. kernel-doc:: drivers/gpu/drm/amd/display/dc/dc.h | |
| :internal: | |
| The color pipeline has undergone major changes between DCN hardware | |
| generations. What's possible to do before and after blending depends on | |
| hardware capabilities, as illustrated below by the DCN 2.0 and DCN 3.0 families | |
| schemas. | |
| **DCN 2.0 family color caps and mapping** | |
| .. kernel-figure:: dcn2_cm_drm_current.svg | |
| **DCN 3.0 family color caps and mapping** | |
| .. kernel-figure:: dcn3_cm_drm_current.svg | |
| Blend Mode Properties | |
| ===================== | |
| Pixel blend mode is a DRM plane composition property of :c:type:`drm_plane` used to | |
| describes how pixels from a foreground plane (fg) are composited with the | |
| background plane (bg). Here, we present main concepts of DRM blend mode to help | |
| to understand how this property is mapped to AMD DC interface. See more about | |
| this DRM property and the alpha blending equations in :ref:`DRM Plane | |
| Composition Properties <plane_composition_properties>`. | |
| Basically, a blend mode sets the alpha blending equation for plane | |
| composition that fits the mode in which the alpha channel affects the state of | |
| pixel color values and, therefore, the resulted pixel color. For | |
| example, consider the following elements of the alpha blending equation: | |
| - *fg.rgb*: Each of the RGB component values from the foreground's pixel. | |
| - *fg.alpha*: Alpha component value from the foreground's pixel. | |
| - *bg.rgb*: Each of the RGB component values from the background. | |
| - *plane_alpha*: Plane alpha value set by the **plane "alpha" property**, see | |
| more in :ref:`DRM Plane Composition Properties <plane_composition_properties>`. | |
| in the basic alpha blending equation:: | |
| out.rgb = alpha * fg.rgb + (1 - alpha) * bg.rgb | |
| the alpha channel value of each pixel in a plane is ignored and only the plane | |
| alpha affects the resulted pixel color values. | |
| DRM has three blend mode to define the blend formula in the plane composition: | |
| * **None**: Blend formula that ignores the pixel alpha. | |
| * **Pre-multiplied**: Blend formula that assumes the pixel color values in a | |
| plane was already pre-multiplied by its own alpha channel before storage. | |
| * **Coverage**: Blend formula that assumes the pixel color values were not | |
| pre-multiplied with the alpha channel values. | |
| and pre-multiplied is the default pixel blend mode, that means, when no blend | |
| mode property is created or defined, DRM considers the plane's pixels has | |
| pre-multiplied color values. On IGT GPU tools, the kms_plane_alpha_blend test | |
| provides a set of subtests to verify plane alpha and blend mode properties. | |
| The DRM blend mode and its elements are then mapped by AMDGPU display manager | |
| (DM) to program the blending configuration of the Multiple Pipe/Plane Combined | |
| (MPC), as follows: | |
| .. kernel-doc:: drivers/gpu/drm/amd/display/dc/inc/hw/mpc.h | |
| :identifiers: mpcc_blnd_cfg | |
| Therefore, the blending configuration for a single MPCC instance on the MPC | |
| tree is defined by :c:type:`mpcc_blnd_cfg`, where | |
| :c:type:`pre_multiplied_alpha` is the alpha pre-multiplied mode flag used to | |
| set :c:type:`MPCC_ALPHA_MULTIPLIED_MODE`. It controls whether alpha is | |
| multiplied (true/false), being only true for DRM pre-multiplied blend mode. | |
| :c:type:`mpcc_alpha_blend_mode` defines the alpha blend mode regarding pixel | |
| alpha and plane alpha values. It sets one of the three modes for | |
| :c:type:`MPCC_ALPHA_BLND_MODE`, as described below. | |
| .. kernel-doc:: drivers/gpu/drm/amd/display/dc/inc/hw/mpc.h | |
| :identifiers: mpcc_alpha_blend_mode | |
| DM then maps the elements of `enum mpcc_alpha_blend_mode` to those in the DRM | |
| blend formula, as follows: | |
| * *MPC pixel alpha* matches *DRM fg.alpha* as the alpha component value | |
| from the plane's pixel | |
| * *MPC global alpha* matches *DRM plane_alpha* when the pixel alpha should | |
| be ignored and, therefore, pixel values are not pre-multiplied | |
| * *MPC global gain* assumes *MPC global alpha* value when both *DRM | |
| fg.alpha* and *DRM plane_alpha* participate in the blend equation | |
| In short, *fg.alpha* is ignored by selecting | |
| :c:type:`MPCC_ALPHA_BLEND_MODE_GLOBAL_ALPHA`. On the other hand, (plane_alpha * | |
| fg.alpha) component becomes available by selecting | |
| :c:type:`MPCC_ALPHA_BLEND_MODE_PER_PIXEL_ALPHA_COMBINED_GLOBAL_GAIN`. And the | |
| :c:type:`MPCC_ALPHA_MULTIPLIED_MODE` defines if the pixel color values are | |
| pre-multiplied by alpha or not. | |
| Blend configuration flow | |
| ------------------------ | |
| The alpha blending equation is configured from DRM to DC interface by the | |
| following path: | |
| 1. When updating a :c:type:`drm_plane_state <drm_plane_state>`, DM calls | |
| :c:type:`amdgpu_dm_plane_fill_blending_from_plane_state()` that maps | |
| :c:type:`drm_plane_state <drm_plane_state>` attributes to | |
| :c:type:`dc_plane_info <dc_plane_info>` struct to be handled in the | |
| OS-agnostic component (DC). | |
| 2. On DC interface, :c:type:`struct mpcc_blnd_cfg <mpcc_blnd_cfg>` programs the | |
| MPCC blend configuration considering the :c:type:`dc_plane_info | |
| <dc_plane_info>` input from DPP. | |
| Display Properties | |
| ================== | |
| .. kernel-doc:: drivers/gpu/drm/amd/amdgpu/amdgpu_display.c | |
| :doc: property for adaptive backlight modulation |