Commit d93654d6 authored by Camille Cho's avatar Camille Cho Committed by Zheng Zengkai
Browse files

drm/amd/display: Simplify brightness initialization

stable inclusion
from stable-v6.6.5
commit d05614ebad8c2eff20f40ca1f55e36a76d4b0dd8
category: bugfix
bugzilla: https://gitee.com/openeuler/kernel/issues/I8N21P

Reference: https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/commit/?id=d05614ebad8c2eff20f40ca1f55e36a76d4b0dd8



--------------------------------

[ Upstream commit d9e865826c202b262f9ee3f17a03cc4ac5d44ced ]

[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: default avatarKrunoslav Kovac <krunoslav.kovac@amd.com>
Acked-by: default avatarHamza Mahfooz <hamza.mahfooz@amd.com>
Signed-off-by: default avatarCamille Cho <camille.cho@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
Signed-off-by: default avatarZheng Zengkai <zhengzengkai@huawei.com>
parent a0d25bad
Loading
Loading
Loading
Loading
+0 −1
Original line number Diff line number Diff line
@@ -1538,7 +1538,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;
+0 −4
Original line number Diff line number Diff line
@@ -1003,10 +1003,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
+1 −1
Original line number Diff line number Diff line
@@ -876,7 +876,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;
+1 −2
Original line number Diff line number Diff line
@@ -2140,8 +2140,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);
+3 −13
Original line number Diff line number Diff line
@@ -168,7 +168,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,
@@ -281,9 +280,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);
@@ -291,15 +290,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)
Loading