From nobody Thu Mar 5 08:20:50 2026 Received: from mail-ej1-f65.google.com (mail-ej1-f65.google.com [209.85.218.65]) (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 04E8E1FF61E for ; Mon, 16 Feb 2026 16:45:39 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.218.65 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1771260347; cv=none; b=M8XyCWEcP4fYM3GuqtuNhQ23mVh/iPlcInv9aNUj3rpjJ0Xr3Q+DMZFSeXto3a8QdMHUEJaZJT2CWW+SliL1Jw6U0wB27VdOgiJsXAisgXPSkYigNfudGz33aWqk8BbSrEGe3v/VDlW/4mReRUtaklnmdBc8rzDw+u5J3lYs7yE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1771260347; c=relaxed/simple; bh=OaV7INhLDBtKO2pacItOc8inBGBdNvcL+LnxqzWxIuY=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=pOK5YWko+zDI2fqE/GycsIxqp6RZQ/Srtx3LJzPPB68AG9PWTAA3VLTBTttVmH9gik6v5UQQ8IRaFe5jxFI27oHYW+Q4uOeuwDmlkKL4GIjxptli/HAW7wgCFyMsMC1WEhBEj8lN+tI3Dvhjho37BDYAcBTFSi0fZJaIdYetdoY= 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=XllNFSgV; arc=none smtp.client-ip=209.85.218.65 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="XllNFSgV" Received: by mail-ej1-f65.google.com with SMTP id a640c23a62f3a-b8f8fa9067fso37156566b.0 for ; Mon, 16 Feb 2026 08:45:39 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1771260338; x=1771865138; 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=Qp5SXJGMlbR2C2KjVkdcVn6F2JKroblos6Aoghsh/Sw=; b=XllNFSgVpmGGTapTRQgrWtHGnFOO1VYBydDvxV2YjKQ3Bi1NVmx7URf2VDCBELKnqX 836DnBy6fue3Tr6wYVszkAISZuOcTUx8jMRrdAPuhwRIsqlTL/HSyiqXvUy6UEQjJNdN J/tFiYQYHCEAFE52YXgMVfEHmnPA0fq7nleTTyXR8QVHL2t+LjrBLENx1v9tQWUHY3Jy ZwG9rx5cy/5T5AwZ2AsG+hwvGlj7RXLRxInUslhxZZEVmw+GyzSvm4GDxjeWjKYJ0x3g pRPlXeIob+bGrxt7+h4chn0CsEGi2LdGviXrV1JTD5di2s+cs05wywJYgjbAFqWTT48Z 1ZwA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1771260338; x=1771865138; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=Qp5SXJGMlbR2C2KjVkdcVn6F2JKroblos6Aoghsh/Sw=; b=f9EdanytY7PnziZ3dutJqymQidwYQStIgCFWaVDQuN4hUkjomKhktRria2XdeAdLE5 ON7GgHQ/Wl/ha/X++fklXpmXEsTuiftix/i3nxR+dor0TF7mbMDJ/V3at74QRvYMDSXF VwgzdMGxvvbrftQr5beOWOQB1u4KhLC2bBl5xLQxv3YLDgJ9yz/D3vvCuthWF/lQY6Dp a6Wos5MmpdRNHPmoXyJVdd/PZGHy4LWR4mLSVfsA7V84S5xH4t8u9bhiW7URo6C8ubV8 lVX5WSLwl5h3AWMMm1eLQ+KEzgdngdSZ8XIdTmnoZNSZpK/V1usJtoRbHdsqkVG26xPd ZpFg== X-Forwarded-Encrypted: i=1; AJvYcCUUv6axUzXltUffcFnf4Idywor3bSMImh7D0P2VXhZkb0XAX5BPh6BpAYqvDD3xehc9+oXSU1xFW1vSW50=@vger.kernel.org X-Gm-Message-State: AOJu0YxhmuDlaz98G/Q/ShtoBV+Dhs42JB1NyV16dPLsxtuEIUEfEag6 N1UOLAMpwDBOEQC9i9y5FglcmOs87eAXLhbU26OvnReBYzKfhvH0fAUj X-Gm-Gg: AZuq6aJ2EQ47JOwE4PGxVu8mQRqwnT43sNtLUGFyVTWSIHPNLzFhuNhp9BOw9H+mbm7 cUKuuysD5t75n/x1+qzwaBvP6iz3QD2RgFiy4yhEi9Q9G5INZCIoy6R4w/aMbVJaghno2olDw65 K03Px+Ze3lih+xRf01K7INfQyWZQ5xYj7aTCbIrNHqmeKF+Pgf5fR6ZPuloAqhjT3DTkvOfxdBF cma0QaZaQR3x6uv28ctPjffy3q6VEh2IC9wn1mPRFANXe3SsNu2KIigOPKUTPXS88AINnebCmyW UmEr8S502ChvlDIQaMZ3UZoVWCedt9xlnarf8kz1nVykgq0qL9FpXY3MwirTGChI/hIHchZrXSn 41tAXlprQvb07zJvJELf7SmkD+CcnCO6r2qQ2kRubtF+Rt28EH6JegT68BreoRcYgb2i2KWDUhu 7INMhK4i127FqGlWH6nGdpcpORvylu5cgrGefiTgxYfCFqeJiiCThv05gyWgTr7JukO5SWsE1Mf zQm X-Received: by 2002:a17:907:9628:b0:b87:6c5c:d3d4 with SMTP id a640c23a62f3a-b8facc7b4ebmr343317866b.2.1771260337873; Mon, 16 Feb 2026 08:45:37 -0800 (PST) Received: from laptok.lan (87-205-5-123.static.ip.netia.com.pl. [87.205.5.123]) by smtp.gmail.com with ESMTPSA id a640c23a62f3a-b8fc735d185sm264683866b.14.2026.02.16.08.45.36 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 16 Feb 2026 08:45:37 -0800 (PST) From: =?UTF-8?q?Tomasz=20Paku=C5=82a?= To: alexander.deucher@amd.com, harry.wentland@amd.com, sunpeng.li@amd.com Cc: maarten.lankhorst@linux.intel.com, mripard@kernel.org, tzimmermann@suse.de, airlied@gmail.com, simona@ffwll.ch, siqueira@igalia.com, dri-devel@lists.freedesktop.org, amd-gfx@lists.freedesktop.org, linux-kernel@vger.kernel.org, tomasz.pakula.oficjalny@gmail.com, bernhard.berger@gmail.com, michel.daenzer@mailbox.org, daniel@fooishbar.org Subject: [PATCH v4 14/27] drm/amd/display: Enable HDMI VRR over PCON Date: Mon, 16 Feb 2026 17:45:03 +0100 Message-ID: <20260216164516.36803-15-tomasz.pakula.oficjalny@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260216164516.36803-1-tomasz.pakula.oficjalny@gmail.com> References: <20260216164516.36803-1-tomasz.pakula.oficjalny@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable [Why] Not all TVs support FreeSync and many TVs suffer from VRR flickering while Freesync is activated. [How] This works the same as FreeSync over PCON just without sending FreeSync info packets (we're sending standard DisplayPort info packets) + reading the VRR range from the HDMI Forum vendor specific data block. PCONs take over HDMI VRR triggering. Prefer HDMI VRR over FreeSync to reduce VRR flickering on many TVs. FreeSync over HDMI seems to be a fallback solution and not a first-class citizen. This especially helps VMM7100. Tested with VMM7100 and CH7218 based adapters on multiple HDMI 2.1 and HDMI 2.0 devices. (Samsung S95B, LG C4, Sony Bravia 8, Dell AW3423DWF) Closes: https://gitlab.freedesktop.org/drm/amd/-/issues/4805 Signed-off-by: Tomasz Paku=C5=82a Tested-by: Bernhard Berger Reviewed-by: Harry Wentland --- .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 29 +++++++++++++++---- 1 file changed, 23 insertions(+), 6 deletions(-) diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c b/drivers/gp= u/drm/amd/display/amdgpu_dm/amdgpu_dm.c index e511eb5a1f7f..931493433439 100644 --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c @@ -13258,6 +13258,17 @@ static void monitor_range_from_vsdb(struct drm_dis= play_info *display, display->monitor_range.max_vfreq =3D vsdb->max_refresh_rate_hz; } =20 +/** + * Get VRR range from HDMI VRR info in EDID. + * + * @conn: drm_connector with HDMI VRR info + */ +static void monitor_range_from_hdmi(struct drm_display_info *display) +{ + display->monitor_range.min_vfreq =3D display->hdmi.vrr_cap.vrr_min; + display->monitor_range.max_vfreq =3D display->hdmi.vrr_cap.vrr_max; +} + /* * Returns true if connector is capable of freesync * Optionally, can fetch the range from AMD vsdb @@ -13322,6 +13333,7 @@ void amdgpu_dm_update_freesync_caps(struct drm_conn= ector *connector, struct amdgpu_device *adev =3D drm_to_adev(connector->dev); struct amdgpu_hdmi_vsdb_info vsdb_info =3D {0}; struct amdgpu_hdmi_vsdb_info vsdb_did =3D {0}; + struct drm_hdmi_vrr_cap hdmi_vrr =3D {0}; struct dpcd_caps dpcd_caps =3D {0}; const struct edid *edid; bool freesync_capable =3D false; @@ -13357,6 +13369,7 @@ void amdgpu_dm_update_freesync_caps(struct drm_conn= ector *connector, /* Gather all data */ edid =3D drm_edid_raw(drm_edid); // FIXME: Get rid of drm_edid_raw() parse_amd_vsdb_cea(amdgpu_dm_connector, edid, &vsdb_info); + hdmi_vrr =3D connector->display_info.hdmi.vrr_cap; =20 if (amdgpu_dm_connector->dc_link) { dpcd_caps =3D amdgpu_dm_connector->dc_link->dpcd_caps; @@ -13398,13 +13411,17 @@ void amdgpu_dm_update_freesync_caps(struct drm_co= nnector *connector, freesync_capable =3D copy_range_to_amdgpu_connector(connector); =20 /* DP -> HDMI PCON */ - } else if (pcon_allowed && vsdb_info.freesync_supported) { - amdgpu_dm_connector->as_type =3D ADAPTIVE_SYNC_TYPE_PCON_ALLOWED; - amdgpu_dm_connector->pack_sdp_v1_3 =3D true; - amdgpu_dm_connector->vsdb_info =3D vsdb_info; + } else if (pcon_allowed) { + /* Prefer HDMI VRR */ + if (hdmi_vrr.supported && hdmi_vrr.vrr_max > 0) + monitor_range_from_hdmi(&connector->display_info); + else if (vsdb_info.freesync_supported) { + amdgpu_dm_connector->vsdb_info =3D vsdb_info; + monitor_range_from_vsdb(&connector->display_info, &vsdb_info); + } =20 - parse_amd_vsdb_cea(amdgpu_dm_connector, edid, &vsdb_info); - monitor_range_from_vsdb(&connector->display_info, &vsdb_info); + amdgpu_dm_connector->pack_sdp_v1_3 =3D true; + amdgpu_dm_connector->as_type =3D ADAPTIVE_SYNC_TYPE_PCON_ALLOWED; freesync_capable =3D copy_range_to_amdgpu_connector(connector); } =20 --=20 2.53.0