]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
drm/amd/display: Support OLED SDR with AMD ABC
authorCamille Cho <Camille.Cho@amd.com>
Wed, 7 May 2025 11:00:54 +0000 (19:00 +0800)
committerAlex Deucher <alexander.deucher@amd.com>
Tue, 3 Jun 2025 19:35:04 +0000 (15:35 -0400)
[Why]
Nits programming for SDR panel is only supported by VESA ABC.

[How]
1. Loose nits programming for OLED SDR panel with AMD ABC.
2. We support two ABC methods. Disable one before we program the other
   in case panel freaks out.
3. Update HDR judgement in setBR with a solider condition.

Reviewed-by: Krunoslav Kovac <krunoslav.kovac@amd.com>
Signed-off-by: Camille Cho <Camille.Cho@amd.com>
Signed-off-by: Wayne Lin <wayne.lin@amd.com>
Tested-by: Daniel Wheeler <daniel.wheeler@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/display/dc/link/protocols/link_edp_panel_control.c

index da74c2b5854f3abdedba41235dd5ee713d7c5117..035795042a01d73295a3e008f30a9fee8c061898 100644 (file)
@@ -173,6 +173,15 @@ bool edp_set_backlight_level_nits(struct dc_link *link,
 
                target_luminance = (struct target_luminance_value *)&backlight_millinits;
 
+               //make sure we disable AMD ABC first.
+               core_link_read_dpcd(link, DP_SOURCE_BACKLIGHT_CONTROL,
+                       &backlight_enable, sizeof(uint8_t));
+               if (backlight_enable) {
+                       backlight_enable = 0;
+                       core_link_write_dpcd(link, DP_SOURCE_BACKLIGHT_CONTROL,
+                                       &backlight_enable, 1);
+               }
+
                core_link_read_dpcd(link, DP_EDP_BACKLIGHT_MODE_SET_REGISTER,
                        &backlight_enable, sizeof(uint8_t));
 
@@ -193,10 +202,22 @@ bool edp_set_backlight_level_nits(struct dc_link *link,
                *(uint16_t *)&dpcd_backlight_set.backlight_transition_time_ms = (uint16_t)transition_time_in_ms;
 
                uint8_t backlight_control = isHDR ? 1 : 0;
+               uint8_t backlight_enable = 0;
+
                // OLEDs have no PWM, they can only use AUX
                if (link->dpcd_sink_ext_caps.bits.oled == 1)
                        backlight_control = 1;
 
+               //make sure we disable VESA ABC first.
+               core_link_read_dpcd(link, DP_EDP_BACKLIGHT_MODE_SET_REGISTER,
+                       &backlight_enable, sizeof(uint8_t));
+
+               if (backlight_enable & DP_EDP_PANEL_LUMINANCE_CONTROL_ENABLE) {
+                       backlight_enable &= ~DP_EDP_PANEL_LUMINANCE_CONTROL_ENABLE;
+                       core_link_write_dpcd(link, DP_EDP_BACKLIGHT_MODE_SET_REGISTER,
+                                       &backlight_enable, sizeof(backlight_enable));
+               }
+
                if (core_link_write_dpcd(link, DP_SOURCE_BACKLIGHT_LEVEL,
                        (uint8_t *)(&dpcd_backlight_set),
                        sizeof(dpcd_backlight_set)) != DC_OK)