From 08f133e932cccd9a039bde367fe436594220bde3 Mon Sep 17 00:00:00 2001 From: Derek Lai Date: Fri, 31 Oct 2025 10:58:52 +0800 Subject: [PATCH] drm/amd/display: Write default Vesa Aux backlight control in dmub [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 Signed-off-by: Derek Lai Signed-off-by: Alex Hung Signed-off-by: Alex Deucher --- .../drm/amd/display/dc/link/link_detection.c | 2 +- .../gpu/drm/amd/display/dc/link/link_dpms.c | 4 +-- .../dc/link/protocols/link_dp_capability.c | 2 +- .../link/protocols/link_edp_panel_control.c | 26 ++++++++++++++++--- .../link/protocols/link_edp_panel_control.h | 2 +- 5 files changed, 28 insertions(+), 8 deletions(-) diff --git a/drivers/gpu/drm/amd/display/dc/link/link_detection.c b/drivers/gpu/drm/amd/display/dc/link/link_detection.c index 6d31f4967f1a9..9746bb2f6c3b7 100644 --- a/drivers/gpu/drm/amd/display/dc/link/link_detection.c +++ b/drivers/gpu/drm/amd/display/dc/link/link_detection.c @@ -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; diff --git a/drivers/gpu/drm/amd/display/dc/link/link_dpms.c b/drivers/gpu/drm/amd/display/dc/link/link_dpms.c index 6ae1341476171..31ce52734edd5 100644 --- a/drivers/gpu/drm/amd/display/dc/link/link_dpms.c +++ b/drivers/gpu/drm/amd/display/dc/link/link_dpms.c @@ -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); diff --git a/drivers/gpu/drm/amd/display/dc/link/protocols/link_dp_capability.c b/drivers/gpu/drm/amd/display/dc/link/protocols/link_dp_capability.c index ad90a0106938c..3884851e2a9e7 100644 --- a/drivers/gpu/drm/amd/display/dc/link/protocols/link_dp_capability.c +++ b/drivers/gpu/drm/amd/display/dc/link/protocols/link_dp_capability.c @@ -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, diff --git a/drivers/gpu/drm/amd/display/dc/link/protocols/link_edp_panel_control.c b/drivers/gpu/drm/amd/display/dc/link/protocols/link_edp_panel_control.c index 99741c1334ca4..0b05ee9f6ea1a 100644 --- a/drivers/gpu/drm/amd/display/dc/link/protocols/link_edp_panel_control.c +++ b/drivers/gpu/drm/amd/display/dc/link/protocols/link_edp_panel_control.c @@ -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; } diff --git a/drivers/gpu/drm/amd/display/dc/link/protocols/link_edp_panel_control.h b/drivers/gpu/drm/amd/display/dc/link/protocols/link_edp_panel_control.h index 360129732109c..fd63b5d0f9480 100644 --- a/drivers/gpu/drm/amd/display/dc/link/protocols/link_edp_panel_control.h +++ b/drivers/gpu/drm/amd/display/dc/link/protocols/link_edp_panel_control.h @@ -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); -- 2.47.3