From patchwork Thu Apr 17 02:10:32 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Aleksandrs Vinarskis X-Patchwork-Id: 881919 Received: from mail-wr1-f54.google.com (mail-wr1-f54.google.com [209.85.221.54]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 6CE19747F; Thu, 17 Apr 2025 02:13:54 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.221.54 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1744856036; cv=none; b=AGOL5IXs6BLRpmxKXirpiTTS5xSLSf6VeDRO5BiRWIKBTejkKTbY54fy9TqF8zouUE0b1B88RPNOeHo8Rsko0IHh4rT0dg/rnFlLJZGciATB2w7QYjmQ7o2jgZcZ09LEqCQDprsThzVrKChahVZ1Fkl2hgtRvxvb4Uuyv8U4oIg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1744856036; c=relaxed/simple; bh=LAS8y6RQEU7U5RNx9S5FJG3mhSf2SFRYYNWPG81rDKI=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=DBRB4GhKHn5q1q8Qkhgdbw8jma8aq5GVq0DgdT1R43/m0yjca55UCuIZ4yVumIFoO+M7i1SDgCJaUKBO+4iZE8rvoIy1DPBZgK8ftES8SwpaUVuk/KiiV8K/rDB+3dGgDFEgpHOPRStQOxCVbRaaSIkd76K6aIwKzZ6bJvxJ37w= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=BsWncaH5; arc=none smtp.client-ip=209.85.221.54 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="BsWncaH5" Received: by mail-wr1-f54.google.com with SMTP id ffacd0b85a97d-39bf44be22fso153497f8f.0; Wed, 16 Apr 2025 19:13:54 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1744856033; x=1745460833; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=F5DHHgrjGd2rCCjwjWpNQeDoT3BghQC1sBR2u4Y5ESY=; b=BsWncaH5q5xFTV7ig/zP3w8OTuVJ/SpF199GNs3vE7iErwhOBWEiGYjwN2VctR8xrv lQzuT1UDjLPo39MyxmKFLs9MZIb+IhtT66e17ix6Ne9QYiLSua6fMt8dqhVGLgar5Ttv f7BDUSP3LmVXbP7qD76oEwI9RbEa1pAsAYWPX4XoEwMf4ePT7fb24KhgMTnjVp6HChK9 7i9fg6sXlnpKT82Sw0mlm1ocxhYw1DtdMtOAvv8zdZ1MO8oJcEzVoPMjGQuI9fv30e6r 9PYTCbAxXb7gKIifziheZ8HAZQyZMVKa0PC0xqhcs2XObhH4Y6e5gPmHxT1sps8ND98f tLgA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1744856033; x=1745460833; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=F5DHHgrjGd2rCCjwjWpNQeDoT3BghQC1sBR2u4Y5ESY=; b=XsXFxblaC4gSnJ6SgYx801A4Cn+b6w8bZOga1jCUdBYGXmVzS89bkJhORwxmKfBDAE YMOrmc7f1b3viJLk6Of6flu9sjXdO7QZtoGW03Z8ADfYa/pDm351U2NxZLE20B2EvqgO hWsdZ0EuqR070fyP72u8XYj7lBPZZSBqLesvrh7DbWLudfET8b42JSFmqWJ2KhuNbfrj y6nBA7h9boULW+il/02CkGf/Lrl8rETiCi0LcizyUpxNPGN5WwntbRgcT//A37dRb+eU 9C9/Mb986ZZcwHhiueZhMbh0Rjm6tNqPw2Zok3HFKWFM/DXgJWuHPNHJLMngBB/k60Tq OL5A== X-Forwarded-Encrypted: i=1; AJvYcCV87EDbRwaoIHxWmFm6ZKAsfj0+xCjRRl5e2ll7tllzyWWbL3Fj3kTWgsH7YoQdCrU2Cu4Q7o2wI3z2wTYd@vger.kernel.org, AJvYcCWK9DaiHX0PO8Y7jk0bLPwBqENN3PN0rpMlkL2aYtvk8Wy5U85FJLkEGH+cTRDeplxKw8XCqphTuPviifa6@vger.kernel.org X-Gm-Message-State: AOJu0YxNu4KrIpGesDcQi6sPDT5gvM2iDfaBZCwA5AiKhxGYaaw0h8d1 Eh2vKiHi8E0XqatR1sxlyITnpOPbFtM5+M8cA5iX1WCMI65gGCYdGhX1LLg= X-Gm-Gg: ASbGnctglqMasc6iR+fy2wEpfEyyTKgx7vbKa7JqAITdK08szhi3VmJp28so5VQeysx bFjAHv+6M7mOGTFz03NXUYILNuT7Y/sMRAbtcfgPfOLCji0yX7RRedqRM/hnKPV3F94kOi5UE4/ sU3BVOYzpkOSzlqC2oWe8M8A4ja9qjXub2a5VRagqs6KYiH/dPFSFoX9SpM/hUk6aa/Boh6dU5+ 6JzQt8E0vg7Tii0QqYy4q+N05+G1yysW/tUx77HbxI8CodSO89N1EHryTo76A8kk7/mIlOmxbMI nTKZ+KAnRbffJpYDG4PO7ZS64OGIuE9A8Fs5yyFcoi+H1Q== X-Google-Smtp-Source: AGHT+IGzrdbDSFpnoAxT/1N2SrlSqLje5cfHVitMqyyo32g8ydOGWS+ibmmSo/GsALjZ4OmYeGNfPg== X-Received: by 2002:a05:6000:1acf:b0:39c:1258:2dc7 with SMTP id ffacd0b85a97d-39ee5ba050emr3472141f8f.56.1744856032524; Wed, 16 Apr 2025 19:13:52 -0700 (PDT) Received: from alex-x1.lan ([84.226.118.249]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-4405b4d1236sm36940485e9.13.2025.04.16.19.13.51 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 16 Apr 2025 19:13:52 -0700 (PDT) From: Aleksandrs Vinarskis To: Dmitry Baryshkov , linux-arm-msm@vger.kernel.org, dri-devel@lists.freedesktop.org, freedreno@lists.freedesktop.org, linux-kernel@vger.kernel.org, dmitry.baryshkov@oss.qualcomm.com Cc: Rob Clark , Abhinav Kumar , Sean Paul , Marijn Suijten , David Airlie , Simona Vetter , laurentiu.tudor1@dell.com, abel.vesa@linaro.org, johan@kernel.org, Aleksandrs Vinarskis Subject: [PATCH v3 1/4] drm/msm/dp: Fix support of LTTPR initialization Date: Thu, 17 Apr 2025 04:10:32 +0200 Message-ID: <20250417021349.148911-2-alex.vinarskis@gmail.com> X-Mailer: git-send-email 2.45.2 In-Reply-To: <20250417021349.148911-1-alex.vinarskis@gmail.com> References: <20250417021349.148911-1-alex.vinarskis@gmail.com> Precedence: bulk X-Mailing-List: linux-arm-msm@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Initialize LTTPR before msm_dp_panel_read_sink_caps, as DPTX shall (re)read DPRX caps after LTTPR detection, as required by DP 2.1, Section 3.6.7.6.1. Signed-off-by: Aleksandrs Vinarskis --- drivers/gpu/drm/msm/dp/dp_display.c | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/drivers/gpu/drm/msm/dp/dp_display.c b/drivers/gpu/drm/msm/dp/dp_display.c index bbc47d86ae9e..fc07cce68382 100644 --- a/drivers/gpu/drm/msm/dp/dp_display.c +++ b/drivers/gpu/drm/msm/dp/dp_display.c @@ -367,12 +367,12 @@ static int msm_dp_display_send_hpd_notification(struct msm_dp_display_private *d return 0; } -static void msm_dp_display_lttpr_init(struct msm_dp_display_private *dp) +static void msm_dp_display_lttpr_init(struct msm_dp_display_private *dp, u8 *dpcd) { u8 lttpr_caps[DP_LTTPR_COMMON_CAP_SIZE]; int rc; - if (drm_dp_read_lttpr_common_caps(dp->aux, dp->panel->dpcd, lttpr_caps)) + if (drm_dp_read_lttpr_common_caps(dp->aux, dpcd, lttpr_caps)) return; rc = drm_dp_lttpr_init(dp->aux, drm_dp_lttpr_count(lttpr_caps)); @@ -385,12 +385,17 @@ static int msm_dp_display_process_hpd_high(struct msm_dp_display_private *dp) struct drm_connector *connector = dp->msm_dp_display.connector; const struct drm_display_info *info = &connector->display_info; int rc = 0; + u8 dpcd[DP_RECEIVER_CAP_SIZE]; - rc = msm_dp_panel_read_sink_caps(dp->panel, connector); + rc = drm_dp_read_dpcd_caps(dp->aux, dpcd); if (rc) goto end; - msm_dp_display_lttpr_init(dp); + msm_dp_display_lttpr_init(dp, dpcd); + + rc = msm_dp_panel_read_sink_caps(dp->panel, connector); + if (rc) + goto end; msm_dp_link_process_request(dp->link); From patchwork Thu Apr 17 02:10:33 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Aleksandrs Vinarskis X-Patchwork-Id: 882660 Received: from mail-wr1-f53.google.com (mail-wr1-f53.google.com [209.85.221.53]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 9EF321A314B; Thu, 17 Apr 2025 02:13:55 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.221.53 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1744856037; cv=none; b=CnWEtXCPWylIbh17KYvployt8gQhMVNLbCmTY1mTHBMWGFFkOpTh68QcpQUzzaCXC5KYvVUWdOQeupiT3KsrD79h856jljwdjJIUJHDjDwC88QDnmpmg3ue0ZLD78XtgNBO0a9Uux+ayV+oRwJPDQYqLof7N2zfOz9dsct+cx38= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1744856037; c=relaxed/simple; bh=TOHQAi3vLhD2HH4auq8iWvrYUmO6tddPj2Z3FgNNrk8=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=sIyHba0RNpZdvAgRX7c8sF3J2lD8lMKEQ4mtARCIlWbUSC3D+jslwSd9VJDP3YKG3m0BpZaC5VXtC7h+MGtMQjba07C/MapRYS1MwrWsrluxBEoUVE3ytHqAPC3QFrr2hQXQ1ZearzqQHIRFSt1Cev776EQCezEh0JaRI7M7mVA= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=mwlvoUda; arc=none smtp.client-ip=209.85.221.53 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="mwlvoUda" Received: by mail-wr1-f53.google.com with SMTP id ffacd0b85a97d-39c13fa05ebso174559f8f.0; Wed, 16 Apr 2025 19:13:55 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1744856034; x=1745460834; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=XiKAF8xumpKDG16lLTYF+amuABJyX9EUNgIyTBAAQEY=; b=mwlvoUdaRfXK167mFvLkSWLiPdK9cWHzYRJ8EJ1YOEksLqzH65jmjKmeBk6p81sNUH C00I/IbaaR5LMhnvnIVD+rtQVaiYUPbglaoo5knPmr/RD0f8EPiyK+L+gU8oS0YoI+Ei 6kI1qL6Zx/ty16ROWc8RoiZrb01BXptcjYV2BOmyRIJet5VgSPesHzZGxdxtvU2WeArD iLMM86mgGKFWPFvzmdmwU7EmMQHp7yhlavtVMA+rMLKmgjdPq5ZkoyJH2QylcGl9uC4F fHu9wOkzTZHTLjPJa+3A89TO5Ji2M8jDA70tco28W9C5ZabgniC9AyQUV6fh6ilyePOX pUpQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1744856034; x=1745460834; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=XiKAF8xumpKDG16lLTYF+amuABJyX9EUNgIyTBAAQEY=; b=uUQHgA2szuKy0DMqUmo8ey4jzL4Ps+rJdR0rnZq+ITBNxsPtmaQ9DE+aD216JC/Vf5 81qHu+uzSXx+fQW50LZgLklwdOaf+ul2Yp0buBJUBD6mfEIicA9/X1J4U+u8CLihGpA6 aqCvUVtEdLMK63ABmcpm+2fNoXtKhCzCEctwtElCV2i539phF3aiTY9+YMKNY3TKeKOy 2NQ4046DQdkIPZteaNeX9gWJ98FgD4bt+NXuYW4WmYTo0hNBQwzScYuBpz+AHlDV0kkT y9cTKnNrJY+SosFZ6mOQghFA3c0gcFfAn8vDagrILswmwdMpvY4+op7sHZVXgei3cNA/ alug== X-Forwarded-Encrypted: i=1; AJvYcCUmTsxz8GEWhXK+H9FHRgAqNm0yrmDAY5usT+3r2fep5wWPoGcuBJoZZH392h1AE8EhBX3UdlG/ogWtTNJE@vger.kernel.org, AJvYcCVw/9F5LtAieL3fxT11fVKscCtvXPByAs07FbaT2+XJnX5EYG2pXsCINdyZOqQTOLWRU2LanMWjmY/HNE6H@vger.kernel.org X-Gm-Message-State: AOJu0YxA6UIvgkAQs7KutrEAkU69HquQ8Zx4jexQmQJkCt2uBfDpyoZy 8OyJ3d0nmmSnxrPNadR5/aAasI2Krj1sJL9+iGwSkUtDLSgYYI8= X-Gm-Gg: ASbGncu+84Xgf8bEf1oCeVe/pVT8pxd6HYKCsSDhGmT4jSPrUpWncWZekYwlLuY3Skn ZeaNybvGS4u1AkndEZDV00MvVWHbZ8A05Cnd8g3ceTUSluOuggfrmAwsKcnOJVOv3HBXDrUBuxv 8lc8jFymEeQHSlX0RglpxHmSboBLrqDPoPfmKaMWTzp6qJq6v13Vc5sdJMuJbFRZVLcIBfjFjGS zKVgazDO7VGbeLsILKTD4agpegycUQ/+FhMOofhUjzbHlwBjyH7YUUiMkScGnHhLn+uSS69flO0 nrZR4Xz/ROEYIjsIJtVSqxpOXAEDt5dxUdWbATTkYPm76g== X-Google-Smtp-Source: AGHT+IER0MvpbQy2etmfGig8mHy40gEeXrIqD175eUCLOGtP2Y4C5981p4HcbO03f79MbWw6TR2cRA== X-Received: by 2002:a5d:5f90:0:b0:397:8f09:5f6 with SMTP id ffacd0b85a97d-39ee5bac57emr3587692f8f.47.1744856033728; Wed, 16 Apr 2025 19:13:53 -0700 (PDT) Received: from alex-x1.lan ([84.226.118.249]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-4405b4d1236sm36940485e9.13.2025.04.16.19.13.52 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 16 Apr 2025 19:13:53 -0700 (PDT) From: Aleksandrs Vinarskis To: Dmitry Baryshkov , linux-arm-msm@vger.kernel.org, dri-devel@lists.freedesktop.org, freedreno@lists.freedesktop.org, linux-kernel@vger.kernel.org, dmitry.baryshkov@oss.qualcomm.com Cc: Rob Clark , Abhinav Kumar , Sean Paul , Marijn Suijten , David Airlie , Simona Vetter , laurentiu.tudor1@dell.com, abel.vesa@linaro.org, johan@kernel.org, Aleksandrs Vinarskis Subject: [PATCH v3 2/4] drm/msm/dp: Account for LTTPRs capabilities Date: Thu, 17 Apr 2025 04:10:33 +0200 Message-ID: <20250417021349.148911-3-alex.vinarskis@gmail.com> X-Mailer: git-send-email 2.45.2 In-Reply-To: <20250417021349.148911-1-alex.vinarskis@gmail.com> References: <20250417021349.148911-1-alex.vinarskis@gmail.com> Precedence: bulk X-Mailing-List: linux-arm-msm@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Take into account LTTPR capabilities when selecting maximum allowed link rate, number of data lines. Signed-off-by: Aleksandrs Vinarskis --- drivers/gpu/drm/msm/dp/dp_display.c | 5 ++--- drivers/gpu/drm/msm/dp/dp_link.h | 3 +++ drivers/gpu/drm/msm/dp/dp_panel.c | 12 +++++++++++- 3 files changed, 16 insertions(+), 4 deletions(-) diff --git a/drivers/gpu/drm/msm/dp/dp_display.c b/drivers/gpu/drm/msm/dp/dp_display.c index fc07cce68382..5c57c1d7ac60 100644 --- a/drivers/gpu/drm/msm/dp/dp_display.c +++ b/drivers/gpu/drm/msm/dp/dp_display.c @@ -369,13 +369,12 @@ static int msm_dp_display_send_hpd_notification(struct msm_dp_display_private *d static void msm_dp_display_lttpr_init(struct msm_dp_display_private *dp, u8 *dpcd) { - u8 lttpr_caps[DP_LTTPR_COMMON_CAP_SIZE]; int rc; - if (drm_dp_read_lttpr_common_caps(dp->aux, dpcd, lttpr_caps)) + if (drm_dp_read_lttpr_common_caps(dp->aux, dpcd, dp->link->lttpr_common_caps)) return; - rc = drm_dp_lttpr_init(dp->aux, drm_dp_lttpr_count(lttpr_caps)); + rc = drm_dp_lttpr_init(dp->aux, drm_dp_lttpr_count(dp->link->lttpr_common_caps)); if (rc) DRM_ERROR("failed to set LTTPRs transparency mode, rc=%d\n", rc); } diff --git a/drivers/gpu/drm/msm/dp/dp_link.h b/drivers/gpu/drm/msm/dp/dp_link.h index 8db5d5698a97..c47d75cfc720 100644 --- a/drivers/gpu/drm/msm/dp/dp_link.h +++ b/drivers/gpu/drm/msm/dp/dp_link.h @@ -7,6 +7,7 @@ #define _DP_LINK_H_ #include "dp_aux.h" +#include #define DS_PORT_STATUS_CHANGED 0x200 #define DP_TEST_BIT_DEPTH_UNKNOWN 0xFFFFFFFF @@ -60,6 +61,8 @@ struct msm_dp_link_phy_params { }; struct msm_dp_link { + u8 lttpr_common_caps[DP_LTTPR_COMMON_CAP_SIZE]; + u32 sink_request; u32 test_response; diff --git a/drivers/gpu/drm/msm/dp/dp_panel.c b/drivers/gpu/drm/msm/dp/dp_panel.c index 92415bf8aa16..4e8ab75c771b 100644 --- a/drivers/gpu/drm/msm/dp/dp_panel.c +++ b/drivers/gpu/drm/msm/dp/dp_panel.c @@ -47,7 +47,7 @@ static void msm_dp_panel_read_psr_cap(struct msm_dp_panel_private *panel) static int msm_dp_panel_read_dpcd(struct msm_dp_panel *msm_dp_panel) { - int rc; + int rc, max_lttpr_lanes, max_lttpr_rate; struct msm_dp_panel_private *panel; struct msm_dp_link_info *link_info; u8 *dpcd, major, minor; @@ -75,6 +75,16 @@ static int msm_dp_panel_read_dpcd(struct msm_dp_panel *msm_dp_panel) if (link_info->rate > msm_dp_panel->max_dp_link_rate) link_info->rate = msm_dp_panel->max_dp_link_rate; + /* Limit data lanes from LTTPR capabilities, if any */ + max_lttpr_lanes = drm_dp_lttpr_max_lane_count(panel->link->lttpr_common_caps); + if (max_lttpr_lanes && max_lttpr_lanes < link_info->num_lanes) + link_info->num_lanes = max_lttpr_lanes; + + /* Limit link rate from LTTPR capabilities, if any */ + max_lttpr_rate = drm_dp_lttpr_max_link_rate(panel->link->lttpr_common_caps); + if (max_lttpr_rate && max_lttpr_rate < link_info->rate) + link_info->rate = max_lttpr_rate; + drm_dbg_dp(panel->drm_dev, "version: %d.%d\n", major, minor); drm_dbg_dp(panel->drm_dev, "link_rate=%d\n", link_info->rate); drm_dbg_dp(panel->drm_dev, "lane_count=%d\n", link_info->num_lanes); From patchwork Thu Apr 17 02:10:34 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Aleksandrs Vinarskis X-Patchwork-Id: 881918 Received: from mail-wm1-f48.google.com (mail-wm1-f48.google.com [209.85.128.48]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id E8A141CC8B0; Thu, 17 Apr 2025 02:13:56 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.48 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1744856038; cv=none; b=XZaOykQP1vTS3IKHvc7Q1trGvJuWEgUm+soq8CXtjsUG5YNSYotdEGco4qiFSTxNF3c3bfQaJWhyZ/Q20Qk+ErltKH3J/Kywo94m8Aj35sRHyZZ8MEnhr22MnluPYxulPepIot4oXcIRyw9x0WjEjpanvlMrRH6wd75EOdN8Xnk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1744856038; c=relaxed/simple; bh=7/ib5tCCZMeV+YTJlKqRwyUC+aTwtRQ6VJFeiDg5W5k=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=maTjeMcEObmPNIK8U6OgL55uoRfqnG/PNkIwYOg8fS5dtBe7BK27cOaOpURSozvci059h08T70PODMhwHYxhjdXy5NmoEMX4TAXB68StDvJC123Sm3ZykMvULs8yxyuMfPWozqQj1MnCpNZ0rilTyH8hGp1S3J1DUSOaNZBl9Nw= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=VA7ZzGf4; arc=none smtp.client-ip=209.85.128.48 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="VA7ZzGf4" Received: by mail-wm1-f48.google.com with SMTP id 5b1f17b1804b1-43edb40f357so1742375e9.0; Wed, 16 Apr 2025 19:13:56 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1744856035; x=1745460835; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=Pjqs00K/es5vuuaBVD8LAsqW6UPYNiv4vD65jbm2oo8=; b=VA7ZzGf4cIK3VJLxoNnJf17uzJc5uxw1BXPc7TOgwp6jR+nb7infsxmIp0kJw5S1HL UomawTdg7EzxJKZNQm3bNSpHAsmgqaxDn07rPpXaT15cb3jW+8bOVWZNFgbelV9F+x0G 3vXpzm17TWFxdrQ46JXvCRXD66br6GWVjtTDNbPqjAKMuHFXFHbkSOBcYctgnh8aqx27 hsuR40BBPvdRWlfVOBreocKsYP+hbrK2pJWKJJ8iiID4h9HhCcPfpimp3ebmgtrfyj9S Sb86KQiBcCBeLoDis6eI+VwfNVGYREKMpven5/keVD4puacSN7QbBi98vAjCSYBhsjfp wx3g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1744856035; x=1745460835; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=Pjqs00K/es5vuuaBVD8LAsqW6UPYNiv4vD65jbm2oo8=; b=l+7gfBU2TP7x7bSc9RADYOpu/BwcOpKJT5VCYn+ePY3u7P3tFv38uy28BYS1P5ReEZ HEdI+ehwa23QBjwfDzsiJcYmr8jFzshKIXJ0Jq4eTGJrxy4XbKEblw1wtEMKTTcUO0Er FnGwAzj0vdln16NtH8BqupLMnulhioKulik+tirFZZmxORhqWcUTwMuYVxvheqUqTnDZ Tz/tcfcKVj21HidNM6UNaWY5+D0kULb42XLD7ejILyGSzdg/sUzVUbO693jndZFbUgbs RlgE2tVAO8r3ITOkPRIM/yJctQlg6FvmyLwXwZ9ZR/gqs1QnRxG3YmbNiTVC2LqPPsxz ywSA== X-Forwarded-Encrypted: i=1; AJvYcCV6nunkWcVGk/Q0mUTUN5jAgiUyS1WunBkeNxC/5hqwQJKWb2Qf7AmB3QccxnFGO5wqYXW4MJLv4MU4sHML@vger.kernel.org, AJvYcCWc9+tm52jMNJLAIolHn4cQiKGBiWJSB/e4uvoeeKZy1zMsKwGaXfRpTLd0NZuJZiPBlEXLdCwMHl9iial6@vger.kernel.org X-Gm-Message-State: AOJu0YxiF/yKDhlM92Ih5mkoVdaRULOVZ6R45FKmpdVEIEDg0SLqJgws q3ZMF4T3r3wFxPIW4nQMUyO5N+5hmBrnND4j3rNyXGmvYh2LNyk= X-Gm-Gg: ASbGncthsL3gcXOanqCiihP9U4RMAslwI5H4VrPDpLl44w2pP0XVMppFa451oX+Bqsv eVrbYWfp1j5yItGgl7Xac1yJolPFAUwxCx/kw74wE1Q1X4mYPezsu/ncQ1WHAcA3NOCFHWdDx9M NkHquijxP19EdgLt3H1LXyLVAlSPAyDQ22KI+eecTxQHPR6u87X7RJzvAzjkxNYhNHDPl0e4HAR lC9tuyZJVATIUj540Cz57UnYJ//DmUdL3L9XINV1A/+WqF7EctS8MDP572vxL9uKlwTB3T93/If nFCq0GD73aBp1V8msKhAJ4zjcpvEU6Ugl6E5Wz+7D/rUl5crQA8yy1It X-Google-Smtp-Source: AGHT+IEr39c8D55+uEn9FSHRIQHSmdOqsYNb7pAPfA4vFCRFkBK/jkVX9f8a5d30XVrtd+wA46b93g== X-Received: by 2002:a05:600c:4e45:b0:43c:fceb:91a with SMTP id 5b1f17b1804b1-4405d616b5amr38046265e9.11.1744856034620; Wed, 16 Apr 2025 19:13:54 -0700 (PDT) Received: from alex-x1.lan ([84.226.118.249]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-4405b4d1236sm36940485e9.13.2025.04.16.19.13.53 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 16 Apr 2025 19:13:54 -0700 (PDT) From: Aleksandrs Vinarskis To: Dmitry Baryshkov , linux-arm-msm@vger.kernel.org, dri-devel@lists.freedesktop.org, freedreno@lists.freedesktop.org, linux-kernel@vger.kernel.org, dmitry.baryshkov@oss.qualcomm.com Cc: Rob Clark , Abhinav Kumar , Sean Paul , Marijn Suijten , David Airlie , Simona Vetter , laurentiu.tudor1@dell.com, abel.vesa@linaro.org, johan@kernel.org, Aleksandrs Vinarskis Subject: [PATCH v3 3/4] drm/msm/dp: Prepare for link training per-segment for LTTPRs Date: Thu, 17 Apr 2025 04:10:34 +0200 Message-ID: <20250417021349.148911-4-alex.vinarskis@gmail.com> X-Mailer: git-send-email 2.45.2 In-Reply-To: <20250417021349.148911-1-alex.vinarskis@gmail.com> References: <20250417021349.148911-1-alex.vinarskis@gmail.com> Precedence: bulk X-Mailing-List: linux-arm-msm@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Per-segment link training requires knowing the number of LTTPRs (if any) present. Store the count during LTTPRs' initialization. Signed-off-by: Aleksandrs Vinarskis --- drivers/gpu/drm/msm/dp/dp_display.c | 17 +++++++++++------ drivers/gpu/drm/msm/dp/dp_link.h | 1 + 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/drivers/gpu/drm/msm/dp/dp_display.c b/drivers/gpu/drm/msm/dp/dp_display.c index 5c57c1d7ac60..ab8c1f19dcb4 100644 --- a/drivers/gpu/drm/msm/dp/dp_display.c +++ b/drivers/gpu/drm/msm/dp/dp_display.c @@ -367,16 +367,21 @@ static int msm_dp_display_send_hpd_notification(struct msm_dp_display_private *d return 0; } -static void msm_dp_display_lttpr_init(struct msm_dp_display_private *dp, u8 *dpcd) +static int msm_dp_display_lttpr_init(struct msm_dp_display_private *dp, u8 *dpcd) { - int rc; + int rc, lttpr_count; if (drm_dp_read_lttpr_common_caps(dp->aux, dpcd, dp->link->lttpr_common_caps)) - return; + return 0; - rc = drm_dp_lttpr_init(dp->aux, drm_dp_lttpr_count(dp->link->lttpr_common_caps)); - if (rc) + lttpr_count = drm_dp_lttpr_count(dp->link->lttpr_common_caps); + rc = drm_dp_lttpr_init(dp->aux, lttpr_count); + if (rc) { DRM_ERROR("failed to set LTTPRs transparency mode, rc=%d\n", rc); + return 0; + } + + return lttpr_count; } static int msm_dp_display_process_hpd_high(struct msm_dp_display_private *dp) @@ -390,7 +395,7 @@ static int msm_dp_display_process_hpd_high(struct msm_dp_display_private *dp) if (rc) goto end; - msm_dp_display_lttpr_init(dp, dpcd); + dp->link->lttpr_count = msm_dp_display_lttpr_init(dp, dpcd); rc = msm_dp_panel_read_sink_caps(dp->panel, connector); if (rc) diff --git a/drivers/gpu/drm/msm/dp/dp_link.h b/drivers/gpu/drm/msm/dp/dp_link.h index c47d75cfc720..ba47c6d19fbf 100644 --- a/drivers/gpu/drm/msm/dp/dp_link.h +++ b/drivers/gpu/drm/msm/dp/dp_link.h @@ -62,6 +62,7 @@ struct msm_dp_link_phy_params { struct msm_dp_link { u8 lttpr_common_caps[DP_LTTPR_COMMON_CAP_SIZE]; + int lttpr_count; u32 sink_request; u32 test_response; From patchwork Thu Apr 17 02:10:35 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Aleksandrs Vinarskis X-Patchwork-Id: 882659 Received: from mail-wm1-f49.google.com (mail-wm1-f49.google.com [209.85.128.49]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id CA3411DB365; Thu, 17 Apr 2025 02:13:57 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.49 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1744856040; cv=none; b=iRXa4gXnM76sCdXXNC108MUAZA/Q2iapth331nmcok8QuXWnqt77Df+iuRxdMdqELwA4m4emPgYCs0F5zAMZ3Xrjg5RHh7QNAxo5gbGrjoQdKHTC64ywIEswqvWOET+nPvzgMO+byBfQljjVEZrxVIfkgjvAZFGP87T//mNDfiw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1744856040; c=relaxed/simple; bh=BbT3LhA0Gi6Cdb5psf44BjaAhUplh6ZchQRngKPe9Nk=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=gfBI3n2wTjn6BPCFuQiv8X7VyqKdKW/Y5Flhc+tn8yaU0/Md5rtQ8tQbvMt8kvAGHm/8jl8QQmbmJyixCgQ3Mh0txHIoHx4vi34lUG1PCXrQkcUPz/K1q2lOnu6UOjFNv5VKrZzq5Bh+BHweO8OvUSJu5sWOx9FTAvwF1fJdeXE= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=DE6VnU7l; arc=none smtp.client-ip=209.85.128.49 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="DE6VnU7l" Received: by mail-wm1-f49.google.com with SMTP id 5b1f17b1804b1-43cfe63c592so2999865e9.2; Wed, 16 Apr 2025 19:13:57 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1744856036; x=1745460836; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=rYDK8MO7JAoEQRHU7R+shDCnltN0/XfcZdUoIFwe50E=; b=DE6VnU7lBqzmgF+oouGCHjqEVbKtd2lP+31aacfVQBW7O7KYTsPN9V702Gemjb6wWl 6Eih7nRUEkrNdi5B50l0wSA6Jw5tIKMpdlb+FSMEGHKlSdt5IFgvaESM6HBtz+YTzD6H bSvTgWl3aCGlnu4OSpFG4gSkCoKr3NQUkvetJ8lsnwHPheBLanrAzmrJ5wFTFmhT5ivT KzpbHLK1uzhCqdtGwEENgiA1zQWDM2UAcIzWzakw8TDq3+h/f3hPL6OfAcue2ldok7E5 La469khPkNL4eVLH0rUUAgCRcFwo5j77CAz/g8cy4uXZJdMvMLV9Zus6VVsG0mYmM5/k tuaw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1744856036; x=1745460836; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=rYDK8MO7JAoEQRHU7R+shDCnltN0/XfcZdUoIFwe50E=; b=Jz2N2Tj+A4ZOdKB7Uc48NqavZVJ0BRoVpLcsgtDiQH7ohpDJuNCx06fOCa422duyH/ 9OY65Nt/DzZzDH/WN1YikdI5u7QjQg+5wRIZTXObSPyHoRE1PtuuiCcJUQgwBA3oUH/V V24CQZJX7CuFkkTOFwdy4c0H1erZKFeb05jYBAS51UeKVkpLPRxdyLyr7agjKvBBqI1T AO1A4uXGd/qch3A8WqbzhxcfdHBK0KrG9gQFVemCugRHe/3xXg794nkXYBMqwxjr5kBx HVDhdzq4HjDFtrK+N/SA1TFSjR6rdnV6XqHq0LcXYaAUn16Nv63+SEFa8JjxvFzhT+lx PDhw== X-Forwarded-Encrypted: i=1; AJvYcCVLt3Z29EBtwdkthNGb0lVBFhGFre1gsZ0wqkQs/Gn+AwGiKMNOPesPLSXDtFlVuyIyY5Yd7eyY4LTUewSQ@vger.kernel.org, AJvYcCXpmFMqoChCYx5huZnWXTaBfH8DnwV82aFEA50yNIXvR3AFjGGJtRcrYiupjKgF/DjxW7uKF9kF3G/U5Qvu@vger.kernel.org X-Gm-Message-State: AOJu0YzRlo++exmRv8iaJPZmB0aVp57zYACys4RMWkJW2DY1VlkjAhWB HHtnK+eN5ewX7nA8t483ftvhRaCpIF7SAz4mLb+rv1sL/UEZxLs= X-Gm-Gg: ASbGnctTJDREyQcRNHPy466UE42r/GzJlqPgqh7alq68bEynRuYF7G7f1VPzeAfr2XC Jz0KTGJtzlKRXdmYEzgj6CDI1N7g3ekIyR/btMLEpDa/lJZ3UyeCufaNcMDmYze9j6HASGlfgjT mrQ+9UeOGxWoSQpXusTb0xJVGG9jLtbvCdfsb+hNFMyMFxa1UTNrIRWJJ72paKqpQ2KfSs2kVr+ NOBxxqHrCLmIsB1Wul6dX+KltNe3hpYaSKlUadIMx4HINEDb18GFKsAZWPcUlWEJW7VfhBNMNvz wXoMPt+nG43yQQ5L7u6CTbDpTYcW/TRiQ3CIPBXcvYeAyA== X-Google-Smtp-Source: AGHT+IHcvL6u4p6HIC4ZehG4yHbh215Az7JL1A+vQxM3e7+Tr4ILiUpxPezP6UqCtyeQ8mKF9xaknQ== X-Received: by 2002:a05:600c:570b:b0:43d:b32:40aa with SMTP id 5b1f17b1804b1-4405d5fda03mr31634345e9.3.1744856035449; Wed, 16 Apr 2025 19:13:55 -0700 (PDT) Received: from alex-x1.lan ([84.226.118.249]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-4405b4d1236sm36940485e9.13.2025.04.16.19.13.54 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 16 Apr 2025 19:13:55 -0700 (PDT) From: Aleksandrs Vinarskis To: Dmitry Baryshkov , linux-arm-msm@vger.kernel.org, dri-devel@lists.freedesktop.org, freedreno@lists.freedesktop.org, linux-kernel@vger.kernel.org, dmitry.baryshkov@oss.qualcomm.com Cc: Rob Clark , Abhinav Kumar , Sean Paul , Marijn Suijten , David Airlie , Simona Vetter , laurentiu.tudor1@dell.com, abel.vesa@linaro.org, johan@kernel.org, Aleksandrs Vinarskis , Stefan Schmidt Subject: [PATCH v3 4/4] drm/msm/dp: Introduce link training per-segment for LTTPRs Date: Thu, 17 Apr 2025 04:10:35 +0200 Message-ID: <20250417021349.148911-5-alex.vinarskis@gmail.com> X-Mailer: git-send-email 2.45.2 In-Reply-To: <20250417021349.148911-1-alex.vinarskis@gmail.com> References: <20250417021349.148911-1-alex.vinarskis@gmail.com> Precedence: bulk X-Mailing-List: linux-arm-msm@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 DisplayPort requires per-segment link training when LTTPR are switched to non-transparent mode, starting with LTTPR closest to the source. Only when each segment is trained individually, source can link train to sink. Implement per-segment link traning when LTTPR(s) are detected, to support external docking stations. On higher level, changes are: * Pass phy being trained down to all required helpers * Run CR, EQ link training per phy * Set voltage swing, pre-emphasis levels per phy This ensures successful link training both when connected directly to the monitor (single LTTPR onboard most X1E laptops) and via the docking station (at least two LTTPRs). Tested-by: Stefan Schmidt Signed-off-by: Aleksandrs Vinarskis Reviewed-by: Abel Vesa --- drivers/gpu/drm/msm/dp/dp_ctrl.c | 126 ++++++++++++++++++++++--------- 1 file changed, 89 insertions(+), 37 deletions(-) diff --git a/drivers/gpu/drm/msm/dp/dp_ctrl.c b/drivers/gpu/drm/msm/dp/dp_ctrl.c index 69a26bb5fabd..a50bfafbb4ea 100644 --- a/drivers/gpu/drm/msm/dp/dp_ctrl.c +++ b/drivers/gpu/drm/msm/dp/dp_ctrl.c @@ -1034,10 +1034,12 @@ static int msm_dp_ctrl_set_vx_px(struct msm_dp_ctrl_private *ctrl, return 0; } -static int msm_dp_ctrl_update_vx_px(struct msm_dp_ctrl_private *ctrl) +static int msm_dp_ctrl_update_phy_vx_px(struct msm_dp_ctrl_private *ctrl, + enum drm_dp_phy dp_phy) { struct msm_dp_link *link = ctrl->link; - int ret = 0, lane, lane_cnt; + int lane, lane_cnt, reg; + int ret = 0; u8 buf[4]; u32 max_level_reached = 0; u32 voltage_swing_level = link->phy_params.v_level; @@ -1075,8 +1077,13 @@ static int msm_dp_ctrl_update_vx_px(struct msm_dp_ctrl_private *ctrl) drm_dbg_dp(ctrl->drm_dev, "sink: p|v=0x%x\n", voltage_swing_level | pre_emphasis_level); - ret = drm_dp_dpcd_write(ctrl->aux, DP_TRAINING_LANE0_SET, - buf, lane_cnt); + + if (dp_phy == DP_PHY_DPRX) + reg = DP_TRAINING_LANE0_SET; + else + reg = DP_TRAINING_LANE0_SET_PHY_REPEATER(dp_phy); + + ret = drm_dp_dpcd_write(ctrl->aux, reg, buf, lane_cnt); if (ret == lane_cnt) ret = 0; @@ -1084,9 +1091,10 @@ static int msm_dp_ctrl_update_vx_px(struct msm_dp_ctrl_private *ctrl) } static bool msm_dp_ctrl_train_pattern_set(struct msm_dp_ctrl_private *ctrl, - u8 pattern) + u8 pattern, enum drm_dp_phy dp_phy) { u8 buf; + int reg; int ret = 0; drm_dbg_dp(ctrl->drm_dev, "sink: pattern=%x\n", pattern); @@ -1096,17 +1104,26 @@ static bool msm_dp_ctrl_train_pattern_set(struct msm_dp_ctrl_private *ctrl, if (pattern && pattern != DP_TRAINING_PATTERN_4) buf |= DP_LINK_SCRAMBLING_DISABLE; - ret = drm_dp_dpcd_writeb(ctrl->aux, DP_TRAINING_PATTERN_SET, buf); + if (dp_phy == DP_PHY_DPRX) + reg = DP_TRAINING_PATTERN_SET; + else + reg = DP_TRAINING_PATTERN_SET_PHY_REPEATER(dp_phy); + + ret = drm_dp_dpcd_writeb(ctrl->aux, reg, buf); return ret == 1; } static int msm_dp_ctrl_link_train_1(struct msm_dp_ctrl_private *ctrl, - int *training_step) + int *training_step, enum drm_dp_phy dp_phy) { + int delay_us; int tries, old_v_level, ret = 0; u8 link_status[DP_LINK_STATUS_SIZE]; int const maximum_retries = 4; + delay_us = drm_dp_read_clock_recovery_delay(ctrl->aux, + ctrl->panel->dpcd, dp_phy, false); + msm_dp_catalog_ctrl_state_ctrl(ctrl->catalog, 0); *training_step = DP_TRAINING_1; @@ -1115,18 +1132,19 @@ static int msm_dp_ctrl_link_train_1(struct msm_dp_ctrl_private *ctrl, if (ret) return ret; msm_dp_ctrl_train_pattern_set(ctrl, DP_TRAINING_PATTERN_1 | - DP_LINK_SCRAMBLING_DISABLE); + DP_LINK_SCRAMBLING_DISABLE, dp_phy); - ret = msm_dp_ctrl_update_vx_px(ctrl); + msm_dp_link_reset_phy_params_vx_px(ctrl->link); + ret = msm_dp_ctrl_update_phy_vx_px(ctrl, dp_phy); if (ret) return ret; tries = 0; old_v_level = ctrl->link->phy_params.v_level; for (tries = 0; tries < maximum_retries; tries++) { - drm_dp_link_train_clock_recovery_delay(ctrl->aux, ctrl->panel->dpcd); + fsleep(delay_us); - ret = drm_dp_dpcd_read_link_status(ctrl->aux, link_status); + ret = drm_dp_dpcd_read_phy_link_status(ctrl->aux, dp_phy, link_status); if (ret) return ret; @@ -1147,7 +1165,7 @@ static int msm_dp_ctrl_link_train_1(struct msm_dp_ctrl_private *ctrl, } msm_dp_link_adjust_levels(ctrl->link, link_status); - ret = msm_dp_ctrl_update_vx_px(ctrl); + ret = msm_dp_ctrl_update_phy_vx_px(ctrl, dp_phy); if (ret) return ret; } @@ -1199,21 +1217,31 @@ static int msm_dp_ctrl_link_lane_down_shift(struct msm_dp_ctrl_private *ctrl) return 0; } -static void msm_dp_ctrl_clear_training_pattern(struct msm_dp_ctrl_private *ctrl) +static void msm_dp_ctrl_clear_training_pattern(struct msm_dp_ctrl_private *ctrl, + enum drm_dp_phy dp_phy) { - msm_dp_ctrl_train_pattern_set(ctrl, DP_TRAINING_PATTERN_DISABLE); - drm_dp_link_train_channel_eq_delay(ctrl->aux, ctrl->panel->dpcd); + int delay_us; + + msm_dp_ctrl_train_pattern_set(ctrl, DP_TRAINING_PATTERN_DISABLE, dp_phy); + + delay_us = drm_dp_read_channel_eq_delay(ctrl->aux, + ctrl->panel->dpcd, dp_phy, false); + fsleep(delay_us); } static int msm_dp_ctrl_link_train_2(struct msm_dp_ctrl_private *ctrl, - int *training_step) + int *training_step, enum drm_dp_phy dp_phy) { + int delay_us; int tries = 0, ret = 0; u8 pattern; u32 state_ctrl_bit; int const maximum_retries = 5; u8 link_status[DP_LINK_STATUS_SIZE]; + delay_us = drm_dp_read_channel_eq_delay(ctrl->aux, + ctrl->panel->dpcd, dp_phy, false); + msm_dp_catalog_ctrl_state_ctrl(ctrl->catalog, 0); *training_step = DP_TRAINING_2; @@ -1233,12 +1261,12 @@ static int msm_dp_ctrl_link_train_2(struct msm_dp_ctrl_private *ctrl, if (ret) return ret; - msm_dp_ctrl_train_pattern_set(ctrl, pattern); + msm_dp_ctrl_train_pattern_set(ctrl, pattern, dp_phy); for (tries = 0; tries <= maximum_retries; tries++) { - drm_dp_link_train_channel_eq_delay(ctrl->aux, ctrl->panel->dpcd); + fsleep(delay_us); - ret = drm_dp_dpcd_read_link_status(ctrl->aux, link_status); + ret = drm_dp_dpcd_read_phy_link_status(ctrl->aux, dp_phy, link_status); if (ret) return ret; @@ -1248,7 +1276,7 @@ static int msm_dp_ctrl_link_train_2(struct msm_dp_ctrl_private *ctrl, } msm_dp_link_adjust_levels(ctrl->link, link_status); - ret = msm_dp_ctrl_update_vx_px(ctrl); + ret = msm_dp_ctrl_update_phy_vx_px(ctrl, dp_phy); if (ret) return ret; @@ -1257,9 +1285,32 @@ static int msm_dp_ctrl_link_train_2(struct msm_dp_ctrl_private *ctrl, return -ETIMEDOUT; } +static int msm_dp_ctrl_link_train_1_2(struct msm_dp_ctrl_private *ctrl, + int *training_step, enum drm_dp_phy dp_phy) +{ + int ret; + + ret = msm_dp_ctrl_link_train_1(ctrl, training_step, dp_phy); + if (ret) { + DRM_ERROR("link training #1 on phy %d failed. ret=%d\n", dp_phy, ret); + return ret; + } + drm_dbg_dp(ctrl->drm_dev, "link training #1 on phy %d successful\n", dp_phy); + + ret = msm_dp_ctrl_link_train_2(ctrl, training_step, dp_phy); + if (ret) { + DRM_ERROR("link training #2 on phy %d failed. ret=%d\n", dp_phy, ret); + return ret; + } + drm_dbg_dp(ctrl->drm_dev, "link training #2 on phy %d successful\n", dp_phy); + + return 0; +} + static int msm_dp_ctrl_link_train(struct msm_dp_ctrl_private *ctrl, int *training_step) { + int i; int ret = 0; const u8 *dpcd = ctrl->panel->dpcd; u8 encoding[] = { 0, DP_SET_ANSI_8B10B }; @@ -1272,8 +1323,6 @@ static int msm_dp_ctrl_link_train(struct msm_dp_ctrl_private *ctrl, link_info.rate = ctrl->link->link_params.rate; link_info.capabilities = DP_LINK_CAP_ENHANCED_FRAMING; - msm_dp_link_reset_phy_params_vx_px(ctrl->link); - msm_dp_aux_link_configure(ctrl->aux, &link_info); if (drm_dp_max_downspread(dpcd)) @@ -1288,24 +1337,27 @@ static int msm_dp_ctrl_link_train(struct msm_dp_ctrl_private *ctrl, &assr, 1); } - ret = msm_dp_ctrl_link_train_1(ctrl, training_step); + for (i = ctrl->link->lttpr_count - 1; i >= 0; i--) { + enum drm_dp_phy dp_phy = DP_PHY_LTTPR(i); + + ret = msm_dp_ctrl_link_train_1_2(ctrl, training_step, dp_phy); + msm_dp_ctrl_clear_training_pattern(ctrl, dp_phy); + + if (ret) + break; + } + if (ret) { - DRM_ERROR("link training #1 failed. ret=%d\n", ret); + DRM_ERROR("link training of LTTPR(s) failed. ret=%d\n", ret); goto end; } - /* print success info as this is a result of user initiated action */ - drm_dbg_dp(ctrl->drm_dev, "link training #1 successful\n"); - - ret = msm_dp_ctrl_link_train_2(ctrl, training_step); + ret = msm_dp_ctrl_link_train_1_2(ctrl, training_step, DP_PHY_DPRX); if (ret) { - DRM_ERROR("link training #2 failed. ret=%d\n", ret); + DRM_ERROR("link training on sink failed. ret=%d\n", ret); goto end; } - /* print success info as this is a result of user initiated action */ - drm_dbg_dp(ctrl->drm_dev, "link training #2 successful\n"); - end: msm_dp_catalog_ctrl_state_ctrl(ctrl->catalog, 0); @@ -1622,7 +1674,7 @@ static int msm_dp_ctrl_link_maintenance(struct msm_dp_ctrl_private *ctrl) if (ret) goto end; - msm_dp_ctrl_clear_training_pattern(ctrl); + msm_dp_ctrl_clear_training_pattern(ctrl, DP_PHY_DPRX); msm_dp_catalog_ctrl_state_ctrl(ctrl->catalog, DP_STATE_CTRL_SEND_VIDEO); @@ -1646,7 +1698,7 @@ static bool msm_dp_ctrl_send_phy_test_pattern(struct msm_dp_ctrl_private *ctrl) return false; } msm_dp_catalog_ctrl_send_phy_pattern(ctrl->catalog, pattern_requested); - msm_dp_ctrl_update_vx_px(ctrl); + msm_dp_ctrl_update_phy_vx_px(ctrl, DP_PHY_DPRX); msm_dp_link_send_test_response(ctrl->link); pattern_sent = msm_dp_catalog_ctrl_read_phy_pattern(ctrl->catalog); @@ -1888,7 +1940,7 @@ int msm_dp_ctrl_on_link(struct msm_dp_ctrl *msm_dp_ctrl) } /* stop link training before start re training */ - msm_dp_ctrl_clear_training_pattern(ctrl); + msm_dp_ctrl_clear_training_pattern(ctrl, DP_PHY_DPRX); } rc = msm_dp_ctrl_reinitialize_mainlink(ctrl); @@ -1912,7 +1964,7 @@ int msm_dp_ctrl_on_link(struct msm_dp_ctrl *msm_dp_ctrl) * link training failed * end txing train pattern here */ - msm_dp_ctrl_clear_training_pattern(ctrl); + msm_dp_ctrl_clear_training_pattern(ctrl, DP_PHY_DPRX); msm_dp_ctrl_deinitialize_mainlink(ctrl); rc = -ECONNRESET; @@ -1983,7 +2035,7 @@ int msm_dp_ctrl_on_stream(struct msm_dp_ctrl *msm_dp_ctrl, bool force_link_train msm_dp_ctrl_link_retrain(ctrl); /* stop txing train pattern to end link training */ - msm_dp_ctrl_clear_training_pattern(ctrl); + msm_dp_ctrl_clear_training_pattern(ctrl, DP_PHY_DPRX); /* * Set up transfer unit values and set controller state to send