From: Derek Lai <[email protected]>

[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 <[email protected]>
Signed-off-by: Derek Lai <[email protected]>
Signed-off-by: Alex Hung <[email protected]>
---
 .../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 6d31f4967f1a..9746bb2f6c3b 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 475f71bb48ff..1b1ce3839922 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 ad90a0106938..3884851e2a9e 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 99741c1334ca..0b05ee9f6ea1 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 360129732109..fd63b5d0f948 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.43.0

Reply via email to