]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
drm/amd/display: Simplify brightness initialization
authorCamille Cho <camille.cho@amd.com>
Fri, 3 Nov 2023 04:08:42 +0000 (12:08 +0800)
committerAlex Deucher <alexander.deucher@amd.com>
Wed, 29 Nov 2023 23:01:05 +0000 (18:01 -0500)
[Why]
Remove the brightness cache in DC. It uses a single value to represent
the brightness for both SDR and HDR mode. This leads to flash in HDR
on/off. It also unconditionally programs brightness as in HDR mode. This
may introduce garbage on SDR mode in miniLED panel.

[How]
Simplify the initialization flow by removing the DC cache and taking
what panel has as default. Expand the mechanism for PWM to DPCD Aux to
restore cached brightness value generally.

Cc: stable@vger.kernel.org # 6.1+
Reviewed-by: Krunoslav Kovac <krunoslav.kovac@amd.com>
Acked-by: Hamza Mahfooz <hamza.mahfooz@amd.com>
Signed-off-by: Camille Cho <camille.cho@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/display/dc/dc.h
drivers/gpu/drm/amd/display/dc/dc_types.h
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_edp_panel_control.c
drivers/gpu/drm/amd/display/dc/link/protocols/link_edp_panel_control.h

index c4e5c3350b754f487452e7c87d95f05ed5e75d82..2cafd644baff83c06c763c876361b8f43a4b31d3 100644 (file)
@@ -1609,7 +1609,6 @@ struct dc_link {
        enum edp_revision edp_revision;
        union dpcd_sink_ext_caps dpcd_sink_ext_caps;
 
-       struct backlight_settings backlight_settings;
        struct psr_settings psr_settings;
 
        struct replay_settings replay_settings;
index fcb825e4f1bb8f8dfba4107bc3bb9c642aa726f1..35d146217aef0fec6a88bef698f71bb7fa0acbe9 100644 (file)
@@ -991,10 +991,6 @@ struct link_mst_stream_allocation_table {
        struct link_mst_stream_allocation stream_allocations[MAX_CONTROLLER_NUM];
 };
 
-struct backlight_settings {
-       uint32_t backlight_millinits;
-};
-
 /* PSR feature flags */
 struct psr_settings {
        bool psr_feature_enabled;               // PSR is supported by sink
index f2fe523f914f1179106426684e010cfea1b170ef..24153b0df503dd77a672526ac911947ac272e789 100644 (file)
@@ -879,7 +879,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_cached_brightness_aux(link);
+                       set_default_brightness_aux(link);
                }
 
                return true;
index 34a4a8c0e18c3f0ca000f20402481386c4ad9a80..f8e01ca09d964697a0ec6e19abdbd62c97f3a985 100644 (file)
@@ -2142,8 +2142,7 @@ static enum dc_status enable_link_dp(struct dc_state *state,
        if (link->dpcd_sink_ext_caps.bits.oled == 1 ||
                link->dpcd_sink_ext_caps.bits.sdr_aux_backlight_control == 1 ||
                link->dpcd_sink_ext_caps.bits.hdr_aux_backlight_control == 1) {
-               set_cached_brightness_aux(link);
-
+               set_default_brightness_aux(link);
                if (link->dpcd_sink_ext_caps.bits.oled == 1)
                        msleep(bl_oled_enable_delay);
                edp_backlight_enable_aux(link, true);
index e32a7974a4bc68c1dcf5767d805a6c66ecf97772..996e4ee99023a8b283219b7cc08537a256db1025 100644 (file)
@@ -170,7 +170,6 @@ bool edp_set_backlight_level_nits(struct dc_link *link,
        *(uint32_t *)&dpcd_backlight_set.backlight_level_millinits = backlight_millinits;
        *(uint16_t *)&dpcd_backlight_set.backlight_transition_time_ms = (uint16_t)transition_time_in_ms;
 
-       link->backlight_settings.backlight_millinits = backlight_millinits;
 
        if (!link->dpcd_caps.panel_luminance_control) {
                if (core_link_write_dpcd(link, DP_SOURCE_BACKLIGHT_LEVEL,
@@ -288,9 +287,9 @@ bool set_default_brightness_aux(struct dc_link *link)
        if (link && link->dpcd_sink_ext_caps.bits.oled == 1) {
                if (!read_default_bl_aux(link, &default_backlight))
                        default_backlight = 150000;
-               // if < 1 nits or > 5000, it might be wrong readback
-               if (default_backlight < 1000 || default_backlight > 5000000)
-                       default_backlight = 150000; //
+               // if > 5000, it might be wrong readback
+               if (default_backlight > 5000000)
+                       default_backlight = 150000;
 
                return edp_set_backlight_level_nits(link, true,
                                default_backlight, 0);
@@ -298,15 +297,6 @@ bool set_default_brightness_aux(struct dc_link *link)
        return false;
 }
 
-bool set_cached_brightness_aux(struct dc_link *link)
-{
-       if (link->backlight_settings.backlight_millinits)
-               return edp_set_backlight_level_nits(link, true,
-                                                   link->backlight_settings.backlight_millinits, 0);
-       else
-               return set_default_brightness_aux(link);
-       return false;
-}
 bool edp_is_ilr_optimization_enabled(struct dc_link *link)
 {
        if (link->dpcd_caps.edp_supported_link_rates_count == 0 || !link->panel_config.ilr.optimize_edp_link_rate)
index ebf7deb63d136e95b5da85ac0bb4a01675940a5f..a034288ad75d4a97605bef0e0d238081d612db5e 100644 (file)
@@ -30,7 +30,6 @@
 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_cached_brightness_aux(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);
 bool edp_get_backlight_level_nits(struct dc_link *link,