mirror of
https://github.com/torvalds/linux.git
synced 2026-05-23 14:42:08 +02:00
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 <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>
This commit is contained in:
parent
201648dc81
commit
08f133e932
|
|
@ -989,7 +989,7 @@ static bool detect_link_and_local_sink(struct dc_link *link,
|
||||||
(link->dpcd_sink_ext_caps.bits.oled == 1)) {
|
(link->dpcd_sink_ext_caps.bits.oled == 1)) {
|
||||||
dpcd_set_source_specific_data(link);
|
dpcd_set_source_specific_data(link);
|
||||||
msleep(post_oui_delay);
|
msleep(post_oui_delay);
|
||||||
set_default_brightness_aux(link);
|
set_default_brightness(link);
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
|
|
||||||
|
|
@ -2115,7 +2115,7 @@ static enum dc_status enable_link_dp(struct dc_state *state,
|
||||||
skip_video_pattern = false;
|
skip_video_pattern = false;
|
||||||
|
|
||||||
if (stream->sink_patches.oled_optimize_display_on)
|
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,
|
if (perform_link_training_with_retries(link_settings,
|
||||||
skip_video_pattern,
|
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.sdr_aux_backlight_control == 1 ||
|
||||||
link->dpcd_sink_ext_caps.bits.hdr_aux_backlight_control == 1) {
|
link->dpcd_sink_ext_caps.bits.hdr_aux_backlight_control == 1) {
|
||||||
if (!stream->sink_patches.oled_optimize_display_on) {
|
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)
|
if (link->dpcd_sink_ext_caps.bits.oled == 1)
|
||||||
msleep(bl_oled_enable_delay);
|
msleep(bl_oled_enable_delay);
|
||||||
edp_backlight_enable_aux(link, true);
|
edp_backlight_enable_aux(link, true);
|
||||||
|
|
|
||||||
|
|
@ -2167,7 +2167,7 @@ void detect_edp_sink_caps(struct dc_link *link)
|
||||||
link->dpcd_caps.set_power_state_capable_edp =
|
link->dpcd_caps.set_power_state_capable_edp =
|
||||||
(general_edp_cap & DP_EDP_SET_POWER_CAP) ? true : false;
|
(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,
|
core_link_read_dpcd(link, DP_EDP_DPCD_REV,
|
||||||
&link->dpcd_caps.edp_rev,
|
&link->dpcd_caps.edp_rev,
|
||||||
|
|
|
||||||
|
|
@ -50,6 +50,11 @@ static const uint8_t DP_VGA_LVDS_CONVERTER_ID_2[] = "sivarT";
|
||||||
/* Nutmeg */
|
/* Nutmeg */
|
||||||
static const uint8_t DP_VGA_LVDS_CONVERTER_ID_3[] = "dnomlA";
|
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)
|
void dp_set_panel_mode(struct dc_link *link, enum dp_panel_mode panel_mode)
|
||||||
{
|
{
|
||||||
union dpcd_edp_config edp_config_set;
|
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;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool set_default_brightness_aux(struct dc_link *link)
|
bool set_default_brightness(struct dc_link *link)
|
||||||
{
|
{
|
||||||
uint32_t default_backlight;
|
uint32_t default_backlight;
|
||||||
|
|
||||||
|
|
@ -320,8 +325,23 @@ bool set_default_brightness_aux(struct dc_link *link)
|
||||||
if (default_backlight < 1000 || default_backlight > 5000000)
|
if (default_backlight < 1000 || default_backlight > 5000000)
|
||||||
default_backlight = 150000;
|
default_backlight = 150000;
|
||||||
|
|
||||||
return edp_set_backlight_level_nits(link, true,
|
if (link->backlight_control_type == BACKLIGHT_CONTROL_VESA_AUX &&
|
||||||
default_backlight, 0);
|
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;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -29,7 +29,7 @@
|
||||||
|
|
||||||
enum dp_panel_mode dp_get_panel_mode(struct dc_link *link);
|
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);
|
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);
|
bool is_smartmux_suported(struct dc_link *link);
|
||||||
void edp_panel_backlight_power_on(struct dc_link *link, bool wait_for_hpd);
|
void edp_panel_backlight_power_on(struct dc_link *link, bool wait_for_hpd);
|
||||||
int edp_get_backlight_level(const struct dc_link *link);
|
int edp_get_backlight_level(const struct dc_link *link);
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user