]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
drm/amd/display: Write default Vesa Aux backlight control in dmub
authorDerek Lai <Derek.Lai@amd.com>
Fri, 31 Oct 2025 02:58:52 +0000 (10:58 +0800)
committerAlex Deucher <alexander.deucher@amd.com>
Mon, 8 Dec 2025 18:56:36 +0000 (13:56 -0500)
[WHY]
Some OLED panels require driver to write Aux BL before link training or
turning on backlight; otherwise monitor brightness will change.

[HOW]
Write the default Vesa Aux backlight control in dmub.

Reviewed-by: Wenjing Liu <wenjing.liu@amd.com>
Signed-off-by: Derek Lai <Derek.Lai@amd.com>
Signed-off-by: Alex Hung <alex.hung@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/display/dc/link/link_detection.c
drivers/gpu/drm/amd/display/dc/link/link_dpms.c
drivers/gpu/drm/amd/display/dc/link/protocols/link_dp_capability.c
drivers/gpu/drm/amd/display/dc/link/protocols/link_edp_panel_control.c
drivers/gpu/drm/amd/display/dc/link/protocols/link_edp_panel_control.h

index 6d31f4967f1a972a9e49ecf4269efb86bb694038..9746bb2f6c3b7c0e154e84bff896f2b54bb6c23f 100644 (file)
@@ -989,7 +989,7 @@ static bool detect_link_and_local_sink(struct dc_link *link,
                        (link->dpcd_sink_ext_caps.bits.oled == 1)) {
                        dpcd_set_source_specific_data(link);
                        msleep(post_oui_delay);
-                       set_default_brightness_aux(link);
+                       set_default_brightness(link);
                }
 
                return true;
index 6ae134147617167a3bb84ecc556cb5852a9f8f81..31ce52734edd5d4178f52387d24a41bae025bc73 100644 (file)
@@ -2115,7 +2115,7 @@ static enum dc_status enable_link_dp(struct dc_state *state,
                skip_video_pattern = false;
 
        if (stream->sink_patches.oled_optimize_display_on)
-               set_default_brightness_aux(link);
+               set_default_brightness(link);
 
        if (perform_link_training_with_retries(link_settings,
                                               skip_video_pattern,
@@ -2141,7 +2141,7 @@ static enum dc_status enable_link_dp(struct dc_state *state,
                link->dpcd_sink_ext_caps.bits.sdr_aux_backlight_control == 1 ||
                link->dpcd_sink_ext_caps.bits.hdr_aux_backlight_control == 1) {
                if (!stream->sink_patches.oled_optimize_display_on) {
-                       set_default_brightness_aux(link);
+                       set_default_brightness(link);
                        if (link->dpcd_sink_ext_caps.bits.oled == 1)
                                msleep(bl_oled_enable_delay);
                        edp_backlight_enable_aux(link, true);
index ad90a0106938c222c6db5c8a6ded4cb0b2c1362e..3884851e2a9e7f924a94af5900d7698780195045 100644 (file)
@@ -2167,7 +2167,7 @@ void detect_edp_sink_caps(struct dc_link *link)
        link->dpcd_caps.set_power_state_capable_edp =
                                (general_edp_cap & DP_EDP_SET_POWER_CAP) ? true : false;
 
-       set_default_brightness_aux(link);
+       set_default_brightness(link);
 
        core_link_read_dpcd(link, DP_EDP_DPCD_REV,
                &link->dpcd_caps.edp_rev,
index 99741c1334ca4ec2d3bf0a988f8ef02de9cc2dda..0b05ee9f6ea1a5085f7acb106e5565348917fc92 100644 (file)
@@ -50,6 +50,11 @@ static const uint8_t DP_VGA_LVDS_CONVERTER_ID_2[] = "sivarT";
 /* Nutmeg */
 static const uint8_t DP_VGA_LVDS_CONVERTER_ID_3[] = "dnomlA";
 
+static const unsigned int pwr_default_min_brightness_millinits = 1000;
+static const unsigned int pwr_default_sdr_brightness_millinits = 270000;
+static const unsigned int pwr_default_min_backlight_pwm = 0xC0C;
+static const unsigned int pwr_default_max_backlight_pwm = 0xFFFF;
+
 void dp_set_panel_mode(struct dc_link *link, enum dp_panel_mode panel_mode)
 {
        union dpcd_edp_config edp_config_set;
@@ -309,7 +314,7 @@ static bool read_default_bl_aux(struct dc_link *link, uint32_t *backlight_millin
        return true;
 }
 
-bool set_default_brightness_aux(struct dc_link *link)
+bool set_default_brightness(struct dc_link *link)
 {
        uint32_t default_backlight;
 
@@ -320,8 +325,23 @@ bool set_default_brightness_aux(struct dc_link *link)
                if (default_backlight < 1000 || default_backlight > 5000000)
                        default_backlight = 150000;
 
-               return edp_set_backlight_level_nits(link, true,
-                               default_backlight, 0);
+               if (link->backlight_control_type == BACKLIGHT_CONTROL_VESA_AUX &&
+                       link->dc->caps.dmub_caps.aux_backlight_support) {
+                       struct set_backlight_level_params backlight_level_params = { 0 };
+
+                       backlight_level_params.aux_inst =  link->ddc->ddc_pin->hw_info.ddc_channel;
+                       backlight_level_params.control_type = BACKLIGHT_CONTROL_VESA_AUX;
+                       backlight_level_params.backlight_pwm_u16_16 = default_backlight;
+                       backlight_level_params.transition_time_in_ms = 0;
+                       // filled in the driver BL default values
+                       backlight_level_params.min_luminance = pwr_default_min_brightness_millinits;
+                       backlight_level_params.max_luminance = pwr_default_sdr_brightness_millinits;
+                       backlight_level_params.min_backlight_pwm = pwr_default_min_backlight_pwm;
+                       backlight_level_params.max_backlight_pwm = pwr_default_max_backlight_pwm;
+                       return edp_set_backlight_level(link, &backlight_level_params);
+               } else
+                       return edp_set_backlight_level_nits(link, true,
+                                       default_backlight, 0);
        }
        return false;
 }
index 360129732109ce512313005518d9710a64c3d2bc..fd63b5d0f9480f8ac3cb0e3c00c010326a606d68 100644 (file)
@@ -29,7 +29,7 @@
 
 enum dp_panel_mode dp_get_panel_mode(struct dc_link *link);
 void dp_set_panel_mode(struct dc_link *link, enum dp_panel_mode panel_mode);
-bool set_default_brightness_aux(struct dc_link *link);
+bool set_default_brightness(struct dc_link *link);
 bool is_smartmux_suported(struct dc_link *link);
 void edp_panel_backlight_power_on(struct dc_link *link, bool wait_for_hpd);
 int edp_get_backlight_level(const struct dc_link *link);