mirror of
https://github.com/nxp-imx/linux-imx.git
synced 2025-07-08 18:35:20 +02:00
drm/amd/display: Add HDR workaround for specific eDP
commit 05af800704
upstream.
[WHY & HOW]
Some eDP panels suffer from flicking when HDR is enabled in KDE. This
quirk works around it by skipping VSC that is incompatible with eDP
panels.
Link: https://gitlab.freedesktop.org/drm/amd/-/issues/3151
Cc: Mario Limonciello <mario.limonciello@amd.com>
Cc: Alex Deucher <alexander.deucher@amd.com>
Reviewed-by: Rodrigo Siqueira <rodrigo.siqueira@amd.com>
Signed-off-by: Alex Hung <alex.hung@amd.com>
Signed-off-by: Aurabindo Pillai <aurabindo.pillai@amd.com>
Tested-by: Daniel Wheeler <daniel.wheeler@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
(cherry picked from commit 4d4257280d7957727998ef90ccc7b69c7cca8376)
Cc: stable@vger.kernel.org
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
579a0a84e3
commit
487f6450bc
|
@ -6153,12 +6153,21 @@ create_stream_for_sink(struct amdgpu_dm_connector *aconnector,
|
||||||
if (stream->signal == SIGNAL_TYPE_DISPLAY_PORT ||
|
if (stream->signal == SIGNAL_TYPE_DISPLAY_PORT ||
|
||||||
stream->signal == SIGNAL_TYPE_DISPLAY_PORT_MST ||
|
stream->signal == SIGNAL_TYPE_DISPLAY_PORT_MST ||
|
||||||
stream->signal == SIGNAL_TYPE_EDP) {
|
stream->signal == SIGNAL_TYPE_EDP) {
|
||||||
|
const struct dc_edid_caps *edid_caps;
|
||||||
|
unsigned int disable_colorimetry = 0;
|
||||||
|
|
||||||
|
if (aconnector->dc_sink) {
|
||||||
|
edid_caps = &aconnector->dc_sink->edid_caps;
|
||||||
|
disable_colorimetry = edid_caps->panel_patch.disable_colorimetry;
|
||||||
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// should decide stream support vsc sdp colorimetry capability
|
// should decide stream support vsc sdp colorimetry capability
|
||||||
// before building vsc info packet
|
// before building vsc info packet
|
||||||
//
|
//
|
||||||
stream->use_vsc_sdp_for_colorimetry = stream->link->dpcd_caps.dpcd_rev.raw >= 0x14 &&
|
stream->use_vsc_sdp_for_colorimetry = stream->link->dpcd_caps.dpcd_rev.raw >= 0x14 &&
|
||||||
stream->link->dpcd_caps.dprx_feature.bits.VSC_SDP_COLORIMETRY_SUPPORTED;
|
stream->link->dpcd_caps.dprx_feature.bits.VSC_SDP_COLORIMETRY_SUPPORTED &&
|
||||||
|
!disable_colorimetry;
|
||||||
|
|
||||||
if (stream->out_transfer_func->tf == TRANSFER_FUNCTION_GAMMA22)
|
if (stream->out_transfer_func->tf == TRANSFER_FUNCTION_GAMMA22)
|
||||||
tf = TRANSFER_FUNC_GAMMA_22;
|
tf = TRANSFER_FUNC_GAMMA_22;
|
||||||
|
|
|
@ -71,6 +71,10 @@ static void apply_edid_quirks(struct edid *edid, struct dc_edid_caps *edid_caps)
|
||||||
DRM_DEBUG_DRIVER("Clearing DPCD 0x317 on monitor with panel id %X\n", panel_id);
|
DRM_DEBUG_DRIVER("Clearing DPCD 0x317 on monitor with panel id %X\n", panel_id);
|
||||||
edid_caps->panel_patch.remove_sink_ext_caps = true;
|
edid_caps->panel_patch.remove_sink_ext_caps = true;
|
||||||
break;
|
break;
|
||||||
|
case drm_edid_encode_panel_id('S', 'D', 'C', 0x4154):
|
||||||
|
DRM_DEBUG_DRIVER("Disabling VSC on monitor with panel id %X\n", panel_id);
|
||||||
|
edid_caps->panel_patch.disable_colorimetry = true;
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
|
@ -190,6 +190,7 @@ struct dc_panel_patch {
|
||||||
unsigned int skip_avmute;
|
unsigned int skip_avmute;
|
||||||
unsigned int mst_start_top_delay;
|
unsigned int mst_start_top_delay;
|
||||||
unsigned int remove_sink_ext_caps;
|
unsigned int remove_sink_ext_caps;
|
||||||
|
unsigned int disable_colorimetry;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct dc_edid_caps {
|
struct dc_edid_caps {
|
||||||
|
|
Loading…
Reference in New Issue
Block a user