From patchwork Wed Nov 4 11:42:32 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Koba Ko X-Patchwork-Id: 1393840 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (no SPF record) smtp.mailfrom=lists.ubuntu.com (client-ip=91.189.94.19; helo=huckleberry.canonical.com; envelope-from=kernel-team-bounces@lists.ubuntu.com; receiver=) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=canonical.com Received: from huckleberry.canonical.com (huckleberry.canonical.com [91.189.94.19]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 4CR4X62K0Nz9sVM; Wed, 4 Nov 2020 22:42:45 +1100 (AEDT) Received: from localhost ([127.0.0.1] helo=huckleberry.canonical.com) by huckleberry.canonical.com with esmtp (Exim 4.86_2) (envelope-from ) id 1kaHBa-0006Ie-3p; Wed, 04 Nov 2020 11:42:42 +0000 Received: from youngberry.canonical.com ([91.189.89.112]) by huckleberry.canonical.com with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.86_2) (envelope-from ) id 1kaHBY-0006IQ-12 for kernel-team@lists.ubuntu.com; Wed, 04 Nov 2020 11:42:40 +0000 Received: from mail-pg1-f200.google.com ([209.85.215.200]) by youngberry.canonical.com with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.86_2) (envelope-from ) id 1kaHBX-0002Wn-Jy for kernel-team@lists.ubuntu.com; Wed, 04 Nov 2020 11:42:39 +0000 Received: by mail-pg1-f200.google.com with SMTP id f2so13691412pgf.5 for ; Wed, 04 Nov 2020 03:42:39 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=SYq6cwqmc1Mb/crs+X3Bn6NH2s/wMARRRSo/AGJER5w=; b=nW8W/MSVbpWhu8HLPeX3umxRO9entTqIF6gNeFtRYyFr3Uk02/t2R429pO+rEQbG1W TuNzc748eZBkwzlFwkF17Cp9QBW1Ww+Ke85sDrruvukguUp/FZZLCdGbJoNjRVSPaYRd znRcyjmzeFadi2jdZockQqjr/4CMaWQDwj4/nPElogdnFc5tU6yKpvI30p5YSsV0nV/3 uMt5ei1mHW/vLCEThK9P9WRPHZIm2jzKxfLxFiKvHCx58OmR7ZcGG/BRTumFcnt66oBy Efk7H2Hme4pSFjEU9KCKmvWHwcCfmWLEktztAVP8D04Hc4AhpRhhciXCGwDgDNh21CD7 BDCQ== X-Gm-Message-State: AOAM532YG/xcwpvs+9QbIfQDtwgytfmVXHipecUnXusrOXE5mFMoXOEF 6D0sKbaqqD6xTOc3KkDuIjN3Al2XM7TQm6Bsw1ZTLF8PSFG1qlbFaIiEcwfat5jnCUYlRsfFqp5 c65uasPbewVhOCiKSLb3EsvGGF/RJPgYbE7cenZZw/g== X-Received: by 2002:aa7:8bdd:0:b029:18b:9cb:dead with SMTP id s29-20020aa78bdd0000b029018b09cbdeadmr11825917pfd.24.1604490158108; Wed, 04 Nov 2020 03:42:38 -0800 (PST) X-Google-Smtp-Source: ABdhPJwuEAXiMdroznkDFsMTKOldJ17EpjKitBE+mkoXQBm8pybitwJukioSTI2BbsGnZtBqikJDcQ== X-Received: by 2002:aa7:8bdd:0:b029:18b:9cb:dead with SMTP id s29-20020aa78bdd0000b029018b09cbdeadmr11825903pfd.24.1604490157852; Wed, 04 Nov 2020 03:42:37 -0800 (PST) Received: from canonical.com (61-220-137-37.HINET-IP.hinet.net. [61.220.137.37]) by smtp.gmail.com with ESMTPSA id r4sm2352471pgs.54.2020.11.04.03.42.37 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 04 Nov 2020 03:42:37 -0800 (PST) From: Koba Ko To: kernel-team@lists.ubuntu.com Subject: [PATCH 1/1][SRU][OEM-5.6]UBUNTU: SAUCE: drm/i915/dp_mst: wait longer during the clock recovery Date: Wed, 4 Nov 2020 19:42:32 +0800 Message-Id: <20201104114232.154988-2-koba.ko@canonical.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20201104114232.154988-1-koba.ko@canonical.com> References: <20201104114232.154988-1-koba.ko@canonical.com> MIME-Version: 1.0 X-BeenThere: kernel-team@lists.ubuntu.com X-Mailman-Version: 2.1.20 Precedence: list List-Id: Kernel team discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: kernel-team-bounces@lists.ubuntu.com Sender: "kernel-team" BugLink: https://bugs.launchpad.net/bugs/1902861 For TGL platform, Connect with the MST hub, it always failed to recovery the clock for the dispaly port during the boot-up. Wait longer during the clock recovery and check the display port's status. Signed-off-by: Koba Ko --- drivers/gpu/drm/drm_dp_helper.c | 18 ++++++++++++++++++ .../drm/i915/display/intel_dp_link_training.c | 18 +++++++++++------- include/drm/drm_dp_helper.h | 1 + 3 files changed, 30 insertions(+), 7 deletions(-) diff --git a/drivers/gpu/drm/drm_dp_helper.c b/drivers/gpu/drm/drm_dp_helper.c index c5744d04ad0f..83175a36c343 100644 --- a/drivers/gpu/drm/drm_dp_helper.c +++ b/drivers/gpu/drm/drm_dp_helper.c @@ -131,6 +131,24 @@ u8 drm_dp_get_adjust_request_post_cursor(const u8 link_status[DP_LINK_STATUS_SIZ } EXPORT_SYMBOL(drm_dp_get_adjust_request_post_cursor); +void drm_dp_link_train_clock_recovery_larger_delay(const u8 dpcd[DP_RECEIVER_CAP_SIZE]) +{ + unsigned long rd_interval = dpcd[DP_TRAINING_AUX_RD_INTERVAL] & + DP_TRAINING_AUX_RD_MASK; + + if (rd_interval > 4) + DRM_DEBUG_KMS("AUX interval %lu, out of range (max 4)\n", + rd_interval); + + if (rd_interval == 0 || dpcd[DP_DPCD_REV] >= DP_DPCD_REV_14) + rd_interval = 100; + else + rd_interval *= 4 * USEC_PER_MSEC; + + usleep_range(rd_interval, rd_interval * 4); +} +EXPORT_SYMBOL(drm_dp_link_train_clock_recovery_larger_delay); + void drm_dp_link_train_clock_recovery_delay(const u8 dpcd[DP_RECEIVER_CAP_SIZE]) { unsigned long rd_interval = dpcd[DP_TRAINING_AUX_RD_INTERVAL] & diff --git a/drivers/gpu/drm/i915/display/intel_dp_link_training.c b/drivers/gpu/drm/i915/display/intel_dp_link_training.c index 9e0e0a97de39..3a1f4a3477b1 100644 --- a/drivers/gpu/drm/i915/display/intel_dp_link_training.c +++ b/drivers/gpu/drm/i915/display/intel_dp_link_training.c @@ -180,12 +180,17 @@ static bool intel_dp_link_max_vswing_reached(struct intel_dp *intel_dp) static bool intel_dp_link_training_clock_recovery(struct intel_dp *intel_dp) { + struct drm_i915_private *dev_priv; u8 voltage; int voltage_tries, cr_tries, max_cr_tries; bool max_vswing_reached = false; u8 link_config[2]; u8 link_bw, rate_select; + if (intel_dp->attached_connector) { + dev_priv = to_i915(intel_dp->attached_connector->base.dev); + } + if (intel_dp->prepare_link_retrain) intel_dp->prepare_link_retrain(intel_dp); @@ -237,10 +242,15 @@ intel_dp_link_training_clock_recovery(struct intel_dp *intel_dp) max_cr_tries = 80; voltage_tries = 1; + for (cr_tries = 0; cr_tries < max_cr_tries; ++cr_tries) { u8 link_status[DP_LINK_STATUS_SIZE]; - drm_dp_link_train_clock_recovery_delay(intel_dp->dpcd); + if (dev_priv && IS_TGL_REVID(dev_priv, TGL_REVID_A0, TGL_REVID_C0)) { + drm_dp_link_train_clock_recovery_larger_delay(intel_dp->dpcd); + } else { + drm_dp_link_train_clock_recovery_delay(intel_dp->dpcd); + } if (!intel_dp_get_link_status(intel_dp, link_status)) { DRM_ERROR("failed to get link status\n"); @@ -407,12 +417,6 @@ intel_dp_start_link_train(struct intel_dp *intel_dp) { struct intel_connector *intel_connector = intel_dp->attached_connector; - /* - * TODO: Reiniting LTTPRs here won't be needed once proper connector - * HW state readout is added. - */ - intel_dp_lttpr_init(intel_dp); - if (!intel_dp_link_training_clock_recovery(intel_dp)) goto failure_handling; if (!intel_dp_link_training_channel_equalization(intel_dp)) diff --git a/include/drm/drm_dp_helper.h b/include/drm/drm_dp_helper.h index 4f1f1f23675d..d087e801dd59 100644 --- a/include/drm/drm_dp_helper.h +++ b/include/drm/drm_dp_helper.h @@ -1188,6 +1188,7 @@ u8 drm_dp_get_adjust_request_post_cursor(const u8 link_status[DP_LINK_STATUS_SIZ #define DP_LTTPR_COMMON_CAP_SIZE 8 #define DP_LTTPR_PHY_CAP_SIZE 3 +void drm_dp_link_train_clock_recovery_larger_delay(const u8 dpcd[DP_RECEIVER_CAP_SIZE]); void drm_dp_link_train_clock_recovery_delay(const u8 dpcd[DP_RECEIVER_CAP_SIZE]); void drm_dp_lttpr_link_train_clock_recovery_delay(void); void drm_dp_link_train_channel_eq_delay(const u8 dpcd[DP_RECEIVER_CAP_SIZE]);