From patchwork Wed Apr 30 00:09:44 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Aleksandrs Vinarskis X-Patchwork-Id: 886525 Received: from mail-wr1-f45.google.com (mail-wr1-f45.google.com [209.85.221.45]) (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 8F3E81E9B29; Wed, 30 Apr 2025 00:13:46 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.221.45 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1745972028; cv=none; b=dCZreAvZvP2Oq7ZuobeC/1RjOBQO5DVGEikERO1TdJDjjQaFYPLTB0vOEePadVDvKYiyaAIBwyanuhPegpfBT7+BSCE025hxM4yzExFS14hAFqkZXiaZbKv6AlwWx+xgm084VkeCtMtD2XVGA45l3RysA7JqPIu8sRnj0vaJuNg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1745972028; c=relaxed/simple; bh=cMW/d5zwmtbymssSMD/70ErBzn6h68efLwDo+MGZpP4=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=q600PwHSfJ1OYHEerTtCPU82/J6pBSvMWXOl1AUVX6Z5dMYnANloT/H6u215QA33EJuP+ofbvmRAI/O7W3QP947+0zjr8aEwk1XgDgec27jGPc16VdjruZBXGCgFrVMlq8VTbYH362kAn4XeciQ/k9eSsVki9mHp+2vw2cXWako= 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=koGuSrxO; arc=none smtp.client-ip=209.85.221.45 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="koGuSrxO" Received: by mail-wr1-f45.google.com with SMTP id ffacd0b85a97d-39c1ee0fd43so6099628f8f.0; Tue, 29 Apr 2025 17:13:46 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1745972025; x=1746576825; 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=ogvjWHhGPza1oW9RrxL7y1JXsXzcr7Hp6fzi/vCOoIs=; b=koGuSrxO3bg3WtMwWoqaUL5SNOih4zuK7M2jaIduHWf5aA3wni+5JhCXZs6Ta/W2HL xr0fZfQbG/vP0nOMPGx2R0GzmA1vmCzBrFjrL2S54KI/Zap1AWbM1Q+Gat7fOM/au4Do rptiC3y27myYhjwvqlkfmFPTNTZqgdwzeDTXUzQFpg9lRO9OI3ps2smsaPAnvU+B/ZxC dYbxPQkpy3KAP3tSVB7X3NbbRzETqm7pVpnPs3Ga+SVjM5hWsNUHYvttSB6DUiot+7zW lIpjQHEhZsPqazcFBf/8ChPkzXXtSPHGYowpi3eq41fgX8o+Vhd9/3gZMNNVY9kNmso1 ymaQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1745972025; x=1746576825; 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=ogvjWHhGPza1oW9RrxL7y1JXsXzcr7Hp6fzi/vCOoIs=; b=RK4DOS8GEDqq21LsZh7T+W+UEqk1KcPLxqjhXk5grOcfmqZvz/Pb6lW23ilansWqgp pRS0U/L6Wg8u81K6lYvus3Lfbqs8eWwmcJdU+c9LxogooIcnpPYcrvGhp1CKc+foe3L7 eYpAKYc+yleEql04O37cjuclLKnhKUqGqwH8ZAURyV70SN6xbHaOc9XPhzsdZ1vNKpV1 /S/cTehHF6kziVisWI67HXPQa/+b5tCyQHXdnUwUn41wGj1FfjCVdtsXwIMQ5VH9nj0z 2Gj8TiXqDTQoRfoSA44ShV08nQ6Ml8tODpc1hzQrUhK17B2wGcWthY2B4I085BG+w6TM 9Vsg== X-Forwarded-Encrypted: i=1; AJvYcCUkh7XpLYsi020tR2UxWudK4W+xpLEMzQ96QYaqSl1njK2ZubjOWLoYd4RUhxK9j8ar/aovvoUpLoRr05j/@vger.kernel.org, AJvYcCXzRRL82/fgOmttEu6p5TRaUOcnH1KfKNm/79f2xnTkuJZ38NsKEAFB1+7u9uF8pZ331UKFsp1eOhby319Y@vger.kernel.org X-Gm-Message-State: AOJu0YzEm2d1BoQ8BIAetXSHDU5mXukjSkqOmvm4s0/PsbDOyKl/Y2gi xSNEN6iOgbE2FxvLhVV+i6VNWT34/7cJTCU3YB6qvmEkggN7Picz/xeZwXm7OA== X-Gm-Gg: ASbGncsC9xIFHatQLsdl7PiRX87IxsdnCGWx4ZJu9FPklODNENcn81AYeYszxWocDlL Oo8PFV/qMhNLAnFa5fPjyE5gCKwa+SBnehL90GVLlfT5HNDgL5GkN2vZXJ/YIDE8M9V8FprfYxL QsHq6/zyMlbXnObaJFXkL+rVeKLcLOFEPsUv4hHJ4O+5A1qk55Nhp/zKqsut8KFdGg0FAiyDXKW PB2BdrFd3wllCA7jWaMBLoakF797vPoINucb+wK8Hu4kWLQCloRJk4UBI8598mfiAV+lJIh8MV1 r5gjujdM603g05AU0171v2YyhcJe7EAz1qP4p6bW3TOjjQ== X-Google-Smtp-Source: AGHT+IFbQKEZ1AFrLLICetRLwpCJ3U1F+Y6rOZ+74zS0wzfxC/yOFpgNCU3Mxk3Pm3a0L+3jljE4mg== X-Received: by 2002:a05:6000:40e1:b0:3a0:82d4:ba90 with SMTP id ffacd0b85a97d-3a08ff377d4mr346265f8f.21.1745972024700; Tue, 29 Apr 2025 17:13:44 -0700 (PDT) Received: from alex-x1.lan ([84.226.118.249]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-3a073e5da4dsm15574565f8f.99.2025.04.29.17.13.44 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 29 Apr 2025 17:13:44 -0700 (PDT) From: Aleksandrs Vinarskis To: Dmitry Baryshkov , Abhinav Kumar , 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 , Sean Paul , Marijn Suijten , David Airlie , Simona Vetter , laurentiu.tudor1@dell.com, abel.vesa@linaro.org, johan@kernel.org, Aleksandrs Vinarskis , Johan Hovold Subject: [PATCH v4 1/4] drm/msm/dp: Fix support of LTTPR initialization Date: Wed, 30 Apr 2025 02:09:44 +0200 Message-ID: <20250430001330.265970-2-alex.vinarskis@gmail.com> X-Mailer: git-send-email 2.45.2 In-Reply-To: <20250430001330.265970-1-alex.vinarskis@gmail.com> References: <20250430001330.265970-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. Fixes: 72d0af4accd9 ("drm/msm/dp: Add support for LTTPR handling") Reviewed-by: Dmitry Baryshkov Signed-off-by: Aleksandrs Vinarskis Tested-by: Johan Hovold Tested-by: Rob Clark Tested-by: Jessica Zhang # SA8775P --- 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 Wed Apr 30 00:09:45 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Aleksandrs Vinarskis X-Patchwork-Id: 886524 Received: from mail-wr1-f45.google.com (mail-wr1-f45.google.com [209.85.221.45]) (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 DD5261EA7C4; Wed, 30 Apr 2025 00:13:47 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.221.45 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1745972029; cv=none; b=JIlDIt/uYg06nHvXOnZrGb0/ip96JrrqPEwu4/qOS2r3ejaT4ZSK8S9U9puvp0itBt22OG5TCOtrAVZXpdIvvAEFymor3eSo144VELbwNTcDCG6MTytuLG7cVFWaD+PgozGfr4Z33byxXtxeIeTHS/IGIMfQiYaf3MMLqmBwHoc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1745972029; c=relaxed/simple; bh=OrCDySuyEcSKdE24OYFPQuDDyNhs6Qiqaw1xXkN8dHE=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=hJthDCd9qFe3GqxyM/L9e0vcIsCP1aGlvYpoZ1USHsCtquB++Thcd/O5gXTe71ukE+w8Cw9Ujr5kh601tJz3/Q3/xNfBrJj3XdUoubTwiB/4b7BdYZ26GugIA3X4MLw+wFfSemaI1CxB7QOfapGQc7eISLLtABlso0rlLTrgSN8= 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=TTA6nCe3; arc=none smtp.client-ip=209.85.221.45 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="TTA6nCe3" Received: by mail-wr1-f45.google.com with SMTP id ffacd0b85a97d-3913d129c1aso268076f8f.0; Tue, 29 Apr 2025 17:13:47 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1745972026; x=1746576826; 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=TeBQSkZGCY/fF6ehFHkeTsPAOEs2fzD17DZuZTOEb9c=; b=TTA6nCe3xsTpZlhicmgYGcY3ZjyE6t2Is/lEebNOxFW3UqSPHlqZtEX+YvjtuHRfr6 vC4w0a/NbLE4D3JVytct33Ft8m0e5p/oysK+IfVcqIYjED1p5RF58hjuiWzK8JpaEklt bZm9PMVW21HPk43bALP532XQcuV/j5eXBeNcmdW/xMfSZjWB7GaRWJYpMEBhd4IijUMF 05Pt+X0IyZ1/mNXxnZQkQB7S/QPG91qSCDZxSfPEbX1ON7WuI72oPwdVyneDcDJHVVtF PnPhMLsxG3qQ1m1aOhX5yPJ+gN7MymUfvbW5Rye/6xRSUjouCZikHD9fVmdCn1v2lkM0 rDYA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1745972026; x=1746576826; 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=TeBQSkZGCY/fF6ehFHkeTsPAOEs2fzD17DZuZTOEb9c=; b=JmtIlhUKpf3NqG6xZ9/uqoEOTGucveNs7JOvkbh7ICsCH64DRfohBZ1LEOqGbCXCse U5fBiPXVF1mC6JwV2fpvT7rqy3itGPyGemNVgRYiC/PCmg3QZQJiXAdCnOEkhT8bLaiQ pP3IMijNyLl7Rp8lTszyemZq3FYLPTM1gmlLrq6PpVGSMMhysNUbKPuOwbQGkhK2QZha EH93UoorvZZnT454AWqA1/4U1zwjEsOm5CfECrTg90ReNXMyoQXTVNo+I43zIzImejOJ PtD17TYLHTC3h5TmHEcIO7XKiGHiK1QznYDYsgkSZI5/x9rqz3lQ6lffwmTOaqmBryJI l1qw== X-Forwarded-Encrypted: i=1; AJvYcCVAYh1HnLLKUJgCcyPe6KP3IvspLWdYxxqMyErQkBMXwA/msDDxiebUE2YC7jyH0oZz12KOKadvzOIxyt6V@vger.kernel.org, AJvYcCVfzjaquX0u8onYiZri5ZssQF8WmmBvLc3nDo6RRG/eeHuYm8XY3t/Kfmz12KbebRpOdQNSIWL5UOezwimP@vger.kernel.org X-Gm-Message-State: AOJu0YwhWdDSAzd2rMgaD6+NchQS4OxADZDUDCTSIWFVFDffLP0hhOSl EZQB1MM/I4T8SX7Wdt969cEJ6K/ugyfUAfELf7IcdiqjzrT8lRw= X-Gm-Gg: ASbGncs1s62TBbVeB0PJJmOF48/5ZYlzci8KdmLMU2iawoPNCfdYWtdPJJVS9vI22pt L9WQB3T7Hd+QZe2v0ku5jl6wUyTva7PkU/CY369qGzhFWxigIwj/KpFW8mntRkIFpaMSQLBznV3 my6OefOdFqeXr5XjichdL6Tbut1GaCJ9kxapWSGcqp5q1m6UceMUUZ92TH3hphWI49Hoe9Owj2N /onib70tbF3XUyPBxa3unwToi+4aKs7+h7+Q6GSAsoJIy5ZtqYtzyDX1nXa/k3rnRpgDXJ6J0nE gjlDTwlTKQ69PuEhukcjpIsLw50MH4vK1NikyBmvHUDh8vghIli4isM7 X-Google-Smtp-Source: AGHT+IHTReNXREapKvhXSnrpwwk2SY3zhJ2rPqmjyK732d0QelsnZwq4reEL9DnRspJ3K/VagfvFMA== X-Received: by 2002:a5d:588f:0:b0:3a0:6a86:9477 with SMTP id ffacd0b85a97d-3a08fae278bmr544338f8f.0.1745972025990; Tue, 29 Apr 2025 17:13:45 -0700 (PDT) Received: from alex-x1.lan ([84.226.118.249]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-3a073e5da4dsm15574565f8f.99.2025.04.29.17.13.44 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 29 Apr 2025 17:13:45 -0700 (PDT) From: Aleksandrs Vinarskis To: Dmitry Baryshkov , Abhinav Kumar , 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 , Sean Paul , Marijn Suijten , David Airlie , Simona Vetter , laurentiu.tudor1@dell.com, abel.vesa@linaro.org, johan@kernel.org, Aleksandrs Vinarskis , Johan Hovold Subject: [PATCH v4 2/4] drm/msm/dp: Account for LTTPRs capabilities Date: Wed, 30 Apr 2025 02:09:45 +0200 Message-ID: <20250430001330.265970-3-alex.vinarskis@gmail.com> X-Mailer: git-send-email 2.45.2 In-Reply-To: <20250430001330.265970-1-alex.vinarskis@gmail.com> References: <20250430001330.265970-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. Fixes: 72d0af4accd9 ("drm/msm/dp: Add support for LTTPR handling") Reviewed-by: Abel Vesa Reviewed-by: Dmitry Baryshkov Signed-off-by: Aleksandrs Vinarskis Tested-by: Johan Hovold Tested-by: Rob Clark --- 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 Wed Apr 30 00:09:46 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Aleksandrs Vinarskis X-Patchwork-Id: 886123 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 E625F1EB19E; Wed, 30 Apr 2025 00:13:48 +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=1745972030; cv=none; b=g9+xIBM3TCrerWi0uzQtzZoKH64jX17HymDEZHcsGNyNYxQXW60Cru9jD9m2mGUX6OnGGquiCfM4s4JLLLgpzA5JFi4S/BEFdtDweQFZLi3LA9Rd6EWZCxjAFNjeuE90Qfh39oO73CItS7tdn4+sn/lsRM3TD3VJt7ZODPzoEfA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1745972030; c=relaxed/simple; bh=YZo3X7lFPCHO8uBKKczS1I4rHacQG5bGWHRVSN8JSow=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=UgaIw1c3N+Rqz2xGWtaVGnQK21qgu5WxjvkdaPgg3n5aCp9CGI0wysbqjC156nnJu642Urjn8kpow8J6ETT7DH+cqfp0VcF/Q+jX7Ugrx7lNd7Hq5EEimUSOImMa4NqkXbCOhIyGAyWQiJIKayv4TbQv9CZ/pWHHXqM4yULlixA= 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=SyVgOAdS; 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="SyVgOAdS" Received: by mail-wr1-f54.google.com with SMTP id ffacd0b85a97d-39c14016868so6887006f8f.1; Tue, 29 Apr 2025 17:13:48 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1745972027; x=1746576827; 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=VEB780BvllckSDDuGiIZTMDsI8i4DHX4hYOyJXmgN/o=; b=SyVgOAdS7EMvTJiDd7lkscrNan/Pra5mHqGT9TRSZOrWPeWLGFYZFTSvnRMBsJdj4u 84CcH1GosxMFhaAYU9+w3T52t3uBk0O4SghiZBr1yj+Y6S3+ms+qbxriJ/Z8wxIVbENZ kzW405bGgUebAGo8fkr9rjK4lMphPWXR94tuhKJuVJwSxVT/tLsN7ixiuJWSPJwh8IdN FggS3bkqh+ckanquwrX3RT4G7Ss7BYbl+47XMjOiHEU9EO3c0VPMPhwQuSL3XPSItEQZ peUtTLoBxF9qQhxPnDaq0DcgvdAlc99FDkgEISsFaGiInCOfQrvPY7P/BHEJAdK624Ej PpOA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1745972027; x=1746576827; 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=VEB780BvllckSDDuGiIZTMDsI8i4DHX4hYOyJXmgN/o=; b=nNnir175QjQrW1A41lcuvLiWQThH5t0idxDffl25ifAyMffCidlBKEJeygx8PCupaP okqTbQX9gGza1ePcw3MUDF1Yy9S/RhaXKHVJfjP+h6vHjSgvjhfFHfyYBttg7uL5TXS0 cy1T93q2a+v0hn8OXrTqe0Cv73G6pjuyfejIE3hDsx9aStKakiaIxs30/G38cklSRfE/ s0rtiUwJi8l2caVKCMX7DR5SbMqmZX6UBR90MtwLQUxLcz0U/Dmh0o1AgcNbD2sDFKws PDlHzP2Wo6d/jQcBMcWvInZy+IeWV34ik/D2Qyw5R7A9A7SjUhD7BhJkDdwGc2h1OFEi XRWw== X-Forwarded-Encrypted: i=1; AJvYcCXcFWIGLe//xakSg66ZmeMVtEAqinBNb0CKhyUpbyBjgm3jWNLFTkHi7cq40faboxJmju6dfVXXji5WaX7v@vger.kernel.org, AJvYcCXsbtSJpUqs2VA9jokJW0eoI2atb1yyeX3AZdnNYJXXrGozGZJ0Y7Yxq1LnlTuYTKCh9Oh5R78pb0MmRPUz@vger.kernel.org X-Gm-Message-State: AOJu0YxvguPmp7dVargp/ATYyGeLD4YiSiisO/wxPTnurRvlo2zOvqyh HGylI0B1swMFhN3iYzO2Q+kzELDGyNxmGIGPGlYk2i6hWBXUGZo= X-Gm-Gg: ASbGnctBb3hKF++vUvsKOp8oxxsQ0Dnuyr6D0Kq6AXYOOyF4/aZkTLinX9iUKNA3VBw Y3o+27rSF09XHh6h15vwwo0QflqoEbLgUxTFvfxxGrlS/YHxJY2uqyUBeSjlYzNgCKSqJcKXOcL 0vMlKQp+8hyn6Dqu0VsXTn7dKvFjFgsW9oPKB4e9ssF+Mq2KjsT7RaRn79RWOmhiWLluV0ExNDG 73zIfWOPFkJXTvzkzCHAzMSd1go7jQcPvDP2KeKJetxdkbthwPDOgYLhOdFjwc77V45o4OYPvgd VNUKqrtl/dHueEeM+sqZncTiyXm3fhuPik3c654Q4yDZkA== X-Google-Smtp-Source: AGHT+IGyiSezCXDsWg2/kGxsNKzyHgKscgrko+ZyF3wR4mwxRBxDN49jMeBbkvKll6f3YqgfMMXJEg== X-Received: by 2002:a05:6000:144c:b0:3a0:8598:8e7c with SMTP id ffacd0b85a97d-3a08f753961mr989554f8f.6.1745972027040; Tue, 29 Apr 2025 17:13:47 -0700 (PDT) Received: from alex-x1.lan ([84.226.118.249]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-3a073e5da4dsm15574565f8f.99.2025.04.29.17.13.46 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 29 Apr 2025 17:13:46 -0700 (PDT) From: Aleksandrs Vinarskis To: Dmitry Baryshkov , Abhinav Kumar , 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 , Sean Paul , Marijn Suijten , David Airlie , Simona Vetter , laurentiu.tudor1@dell.com, abel.vesa@linaro.org, johan@kernel.org, Aleksandrs Vinarskis , Johan Hovold Subject: [PATCH v4 3/4] drm/msm/dp: Prepare for link training per-segment for LTTPRs Date: Wed, 30 Apr 2025 02:09:46 +0200 Message-ID: <20250430001330.265970-4-alex.vinarskis@gmail.com> X-Mailer: git-send-email 2.45.2 In-Reply-To: <20250430001330.265970-1-alex.vinarskis@gmail.com> References: <20250430001330.265970-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. Fixes: 72d0af4accd9 ("drm/msm/dp: Add support for LTTPR handling") Reviewed-by: Abel Vesa Reviewed-by: Dmitry Baryshkov Signed-off-by: Aleksandrs Vinarskis Tested-by: Johan Hovold Tested-by: Rob Clark --- 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 Wed Apr 30 00:09:47 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Aleksandrs Vinarskis X-Patchwork-Id: 886523 Received: from mail-wr1-f42.google.com (mail-wr1-f42.google.com [209.85.221.42]) (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 9F0AB1EEA4D; Wed, 30 Apr 2025 00:13:50 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.221.42 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1745972032; cv=none; b=tnsjLhy2wv2D1wYalwa51jyZ0rvns5JpOomlnMDfd0Xq0ugCzSRn9PIk0+OGnZf4v1l5/F+atnkBoh0ocB7xeHzG6xR6qjJYgsb8/J7wKUq9QpAyHu2MFWZBzpOLZcR3iXZD2rRu3/LTQZW0D/jGLOQwM5SEhRZgwadbZE2IyH8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1745972032; c=relaxed/simple; bh=ax5e9I/1ulRxNz6IVWBGa7vUO7DSEEt72VhKqp49JKs=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Riom9Qclj1VFJnHEN79Ue4o0irmO3+xhpKeKa0v4a01HuvU2GUTlxdt2Z+TZDJ+yrSMu+zpJ1DT1AuH2GDadhoAbZVU2V8SvuGeF9RxcERvitxFgv7p5O5alJHCTdaF9ArsyaDr5mFYFX3tLpb+yhlHblL4G9nuUxehKeAn9jt0= 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=h3LN15XG; arc=none smtp.client-ip=209.85.221.42 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="h3LN15XG" Received: by mail-wr1-f42.google.com with SMTP id ffacd0b85a97d-39c1efbefc6so4614543f8f.1; Tue, 29 Apr 2025 17:13:50 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1745972029; x=1746576829; 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=S1HB0pJCYnHHVtI6leB7kANPGdvrwtJT9eZo64kNwGM=; b=h3LN15XGZB3jPee7aucdtrT5+oabHtcKEMbFkgEORo+5uyfW787WxoCqcD5F91Ho4q rxgPtZ6Gl06F2siMx3OhAcpbcsY3S0/EzXAKIv3UY/xS8XP48ZjqTdJUUzx4DDzc1xN3 7SdOmTWQKpXRWY7dej3LD6ihMJTgntSEIK/QbKh4Kfz9OjcKtLzsfCkervFkV/nam7jX PB6eAq4aySlDj6DkEU530gZGR7Kug7uZJcL6QfV2W9UaI3jf6vFox94z90S6vyrq9Mc4 kwSNpOjk7XnX5GljUsW43Djf3JO14yFItEalGTOhuHYWNoqTbBaSbm398VnCS4w4mGxo Hpgw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1745972029; x=1746576829; 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=S1HB0pJCYnHHVtI6leB7kANPGdvrwtJT9eZo64kNwGM=; b=PvL/4AYYzsbk95ewtoTbpXMengfMj4lAqhRdVQvXp8jR/BQi3adGVwiNGl4wN/0NeV SV5wApArKACVrypNh46ddytiIPAh84Oe/zSCHxKaZ8VvcyyfhSD1Re9soRs3QnzJG0Z6 sNsWJ/eefh8QNa3fcQs6z5w0zvHJcE6jHIAoTVjpFgkUQsnbsWxu4uxpz2BZ54xzjSa0 PM9S8ClgscsrNe8rBverTRTSg7YAtzEUMUPC08WVo9Sx/i8R1nKdNH3iOCfrHGd1/H+z dcVXwalpSmw2zEBZP5HT36v/EL4tcKn6tqugMpHUawvfMxfYys2/MbNPSrBMVrWKpjJP AXKA== X-Forwarded-Encrypted: i=1; AJvYcCX01/oyC5wQ0EXuSU+5n62EUzrSkjLrioq0KgwghVbEesItJOiYSnR4lVgG8s3AvcUwpW3eiUncc9mdlhrd@vger.kernel.org, AJvYcCXYzOjrbb9/woMYHntcghcLIu2LCIaN4qxKYhKdt2IyF8sAumIOZ1rcStdHZDoUJGP2s7tHCS0EECkI5l6G@vger.kernel.org X-Gm-Message-State: AOJu0YxeHsxuRdPAZyJ7AtOl6V09V/6LKGCGU4wC0PSB7NoKVtyKzqBM 6Fi4Ji8y1i6PqZFbWJh2tQXnWOkw8/aNtDxOKtuQuqmTrwwTTvc= X-Gm-Gg: ASbGnctdWzBHDnmOVUuftXd/Te2PTZT2wuGjmI2zT4diII2I/nZ2FjD0OK71kLYkLPK MAjs+ymQhMrODQZNv72iJp6yQUBw+6ZaFYDROAKDAxlbysDGDhuELk83zVoxJYEFrGER5BzC40n K6ShyiiQ5hsm3dUU+gU6sJKMIwxXBpVoXuOjP2aYdYPJVbPGr3tELq5+4tEsZoema1xDCWiN9t8 bKVrtYywWdTBTrFcwqLgdogT6s3V4f1u+X1HuEaXg8crq5G1L4Vfy+Lp2+Tw8xLfLLZhUJqyn71 cdvmJvK1soUtQ9uq80EEeawILW+Cm9psl44bt/H4AOYyNz7h4WINcKiw X-Google-Smtp-Source: AGHT+IGbKUzfK8XZETH8woy9eFt8xfSQrWoqLCX0Oa2T7hxffwMabwMTUtRlu6be8fGYFcv0zYwhMg== X-Received: by 2002:a5d:584a:0:b0:3a0:8291:20d0 with SMTP id ffacd0b85a97d-3a08f779672mr864108f8f.29.1745972028377; Tue, 29 Apr 2025 17:13:48 -0700 (PDT) Received: from alex-x1.lan ([84.226.118.249]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-3a073e5da4dsm15574565f8f.99.2025.04.29.17.13.47 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 29 Apr 2025 17:13:47 -0700 (PDT) From: Aleksandrs Vinarskis To: Dmitry Baryshkov , Abhinav Kumar , 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 , Sean Paul , Marijn Suijten , David Airlie , Simona Vetter , laurentiu.tudor1@dell.com, abel.vesa@linaro.org, johan@kernel.org, Aleksandrs Vinarskis , Johan Hovold , Stefan Schmidt Subject: [PATCH v4 4/4] drm/msm/dp: Introduce link training per-segment for LTTPRs Date: Wed, 30 Apr 2025 02:09:47 +0200 Message-ID: <20250430001330.265970-5-alex.vinarskis@gmail.com> X-Mailer: git-send-email 2.45.2 In-Reply-To: <20250430001330.265970-1-alex.vinarskis@gmail.com> References: <20250430001330.265970-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). Fixes: 72d0af4accd9 ("drm/msm/dp: Add support for LTTPR handling") Tested-by: Johan Hovold Tested-by: Rob Clark Tested-by: Stefan Schmidt Signed-off-by: Aleksandrs Vinarskis Reviewed-by: Abel Vesa Reviewed-by: Dmitry Baryshkov --- 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 d8633a596f8d..35b28c2fcd64 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,7 +1104,12 @@ 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; } @@ -1115,12 +1128,16 @@ static int msm_dp_ctrl_read_link_status(struct msm_dp_ctrl_private *ctrl, } 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; @@ -1129,18 +1146,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 = msm_dp_ctrl_read_link_status(ctrl, link_status); + ret = drm_dp_dpcd_read_phy_link_status(ctrl->aux, dp_phy, link_status); if (ret) return ret; @@ -1161,7 +1179,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; } @@ -1213,21 +1231,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; @@ -1247,12 +1275,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 = msm_dp_ctrl_read_link_status(ctrl, link_status); + ret = drm_dp_dpcd_read_phy_link_status(ctrl->aux, dp_phy, link_status); if (ret) return ret; @@ -1262,7 +1290,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; @@ -1271,9 +1299,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 }; @@ -1286,8 +1337,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)) @@ -1302,24 +1351,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); @@ -1636,7 +1688,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); @@ -1660,7 +1712,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); @@ -1902,7 +1954,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); @@ -1926,7 +1978,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; @@ -1997,7 +2049,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