From d5ebf8009b983b7f1f0f4bb7d5ead5c454af91d5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Roberto=20de=20Souza?= Date: Fri, 4 Oct 2019 16:34:22 -0700 Subject: [PATCH] drm/i915/psr: Blacklist PSR2 for a specific panel MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit As reported in the bug bellow, enabling PSR2 causes some glitches for this specific panel; visually, it looks like panel is not showing some selective update blocks. We have panels of the same model in our CI (fi-icl-u3 and fi-icl-u2), and I have one in my desk, but all of them behave as expected, so it is probably some panel batch or model variation problem. So here, search in the EDID for the monitor string TK6R7 that is only present in panels of this notebook model and disable PSR2 support when it is found. Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=111701 Co-authored-by: Sultan Alsawaf Signed-off-by: José Roberto de Souza --- drivers/gpu/drm/i915/display/intel_psr.c | 51 ++++++++++++++++++++++++ 1 file changed, 51 insertions(+) diff --git a/drivers/gpu/drm/i915/display/intel_psr.c b/drivers/gpu/drm/i915/display/intel_psr.c index b3c7eef53..c3be0bf84 100644 --- a/drivers/gpu/drm/i915/display/intel_psr.c +++ b/drivers/gpu/drm/i915/display/intel_psr.c @@ -534,6 +534,52 @@ transcoder_has_psr2(struct drm_i915_private *dev_priv, enum transcoder trans) return trans == TRANSCODER_EDP; } +static bool panel_in_psr2_blacklist(struct intel_dp *intel_dp, + struct intel_crtc_state *crtc_state) +{ + static const char *const monitor_blacklist[] = { + "TK6R7" + }; + struct intel_connector *intel_connector = intel_dp->attached_connector; + struct edid *edid = intel_connector->detect_edid; + int i; + + if (!edid) + return false; + + for (i = 0; i < ARRAY_SIZE(edid->detailed_timings); i++) { + struct detailed_non_pixel *data; + struct detailed_timing *timing; + const char *edid_str; + int j, k; + + timing = &edid->detailed_timings[i]; + if (timing->pixel_clock) + continue; + + data = &timing->data.other_data; + if (data->type != EDID_DETAIL_MONITOR_STRING) + continue; + + edid_str = data->data.str.str; + for (j = 0; j < ARRAY_SIZE(monitor_blacklist); j++) { + for (k = 0; k < sizeof(data->data.str.str); k++) { + if (monitor_blacklist[j][k] != edid_str[k]) { + if (!monitor_blacklist[j][k] && + !isgraph(edid_str[k])) + return true; + break; + } + } + + if (k == sizeof(data->data.str.str)) + return true; + } + } + + return false; +} + static bool intel_psr2_config_valid(struct intel_dp *intel_dp, struct intel_crtc_state *crtc_state) { @@ -596,6 +642,11 @@ static bool intel_psr2_config_valid(struct intel_dp *intel_dp, return false; } + if (panel_in_psr2_blacklist(intel_dp, crtc_state)) { + DRM_DEBUG_KMS("PSR2 not enabled, panel in PSR2 blacklist\n"); + return false; + } + return true; } -- 2.20.1