From nobody Tue Feb 10 04:13:13 2026 Received: from mail-ed1-f65.google.com (mail-ed1-f65.google.com [209.85.208.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 3F7952F0C7F for ; Sun, 25 Jan 2026 18:39:32 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.208.65 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769366373; cv=none; b=Lv0ls9GwFMFJ7kQKA412h1++l3Pi7n0ZWVdgGZ80U8ZUOe5QyLz0Xsc/WX9Lc4I2yYBYBHwTQrBx4XYED9FlsoNndcS7fRIHoPdzpMt5a/1PbeK6vIF/RHXeNYy8b5DZzNGIFtzDQghPr9GKVnKVEFVEporVYm34nUqMu8ICim0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769366373; c=relaxed/simple; bh=wHoRnU9Rzxv4b5jLR9rQC0aLORVpg2sXfsqoy2ebfTo=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=IO5Pbuljk4cL0ImKlP1uI8kaF8l8savDL3F9dqen5xx+QUaIykSAp1phiWvGXlftSPqYRLAotDyUaU5l6l3oGToiwEXQTgvHkaQzk0UYUv3/AXonyHftAXNsi62uNbbxr607TxLJGnSuQ/9NAedm3J8Obu4udsl2gcfdtU293ak= 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=ay86f/Za; arc=none smtp.client-ip=209.85.208.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="ay86f/Za" Received: by mail-ed1-f65.google.com with SMTP id 4fb4d7f45d1cf-64b7a91f9daso544573a12.2 for ; Sun, 25 Jan 2026 10:39:32 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1769366371; x=1769971171; 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=wD3DZNrHRBINvEokamMq5jiUBWudz0vnljedektK4oE=; b=ay86f/Za721mlE7nvw9VTuzkq9/gEk62k9MV/hzp9bi/1NBfi0n8RJ+FmxNyk7b4Mg il87IH78EdlEzwduRUNIchUj53nWeGiPiYDqbXjWAP02PLTwOtvVQdXVH4bpZvONvU3Q 06UZpbW50ToA/tw6dKxvC7LB87YovU717Pu+ZFMY4VfCPtP4IjdT7M40bKKZHHhXkszc 3EtMsauk17zNwAOqk73SHyxKDEOvwWbYoR/FVGgPK1Yr0knrpMRvsVE7NtpeuAeZa5Y6 UyBEZh8/vnRQ6sVZrQ8gbnmjT/ciE8shupk0ReC6CwAlQ6A6al/IYq/NogVC7lgFb1I9 KRBg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1769366371; x=1769971171; 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=wD3DZNrHRBINvEokamMq5jiUBWudz0vnljedektK4oE=; b=pjtoRA2hmz1LClLe44+M59tKXghT4/jcX8/I7mrk9EL5f5JX6QEVrQ1GNH5PstDf2T BFb5nd6uMl+Wtq58vWE3mNGUDje1xQhuufSCs/KbtoReZVfBsCrqyGJ23RlyYJgSajyP 4H6pcAfCz16OTiZNwg7NQIwMZbxaQBqzalfJAHaNa5nBkLaM2x2Z/pG6wv2djLhplzFa lcPph7vJHgYflaTUwQiRl0ijr3X5N6KXLV9ZMxkO5VAIqD2HhZXmBpEyGX+biCxox4LY 0uM+cgvWlZcFF4fH1jU13XcUTaZnOA2Ayp2j6p8ste4faeGmv5NErVUNwxtNpkeeFTfz JbZg== X-Forwarded-Encrypted: i=1; AJvYcCWnnA9J56gwHjTJXERZ4MwhoM1psCkRifpfACuZNO/drroeKY3wcrdKBUh6tO0emuv4xAMmQBoyzp5D7Sc=@vger.kernel.org X-Gm-Message-State: AOJu0Yyp2iA6XS2hJkqyWzb29vmwd2asi2DdGthVGK1+2wKkOnVUpyMw t0FQwZjYitrHYZpCSrVRE1IVXwY3NU07EtxX8Aixq68KL5vUfEJO1QOC X-Gm-Gg: AZuq6aLMArUnqYReSY4SeV46VEtck6JdZyW43xRvhN167l7168axJzZr1xTpFuZ27Jk 8XZ0PdGhMdlAL8Z6XYqnPO7/tqn8KUp2/51wroy3kmJSEshT1v/abM9t8afZbUE2EWW/Y/U+csH VBCi+kLXeVRNwlOr5k4jj3Ely3R0J3gKgRlpXyt0Bpqcn1Rvk7hjLH2A0BHqPmx4aCZFWeB3Kw6 UR71DUVu0QOWMnbPrdFRlLeGKKnJWx75CS5+S+kvjxrryzhRCXVnouFm7FwYf2UHpKso0rBxkec CjR9p4FljqPAxm9OYgL7rrrBr6y28yki/4hObd+SfzhcE/HbMSDyQOs7AtBTFPLIsGN/+UZQNZF LW1PgYn/SfSo2jRJo5Hrmlx3bZjlaN8ESaswEy9FKt9cdoGlNqq1mhPfXN9bpW6vy9RagR67WQ1 yNey7egnxO56kS2c5KnrfULQJq2ZnQ48GXbfd9SAYhynCoYUXHj3V4t+uulspiax/S X-Received: by 2002:a05:6402:1467:b0:658:1299:8a03 with SMTP id 4fb4d7f45d1cf-658706c3572mr823565a12.1.1769366370537; Sun, 25 Jan 2026 10:39:30 -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-b885b3dad3asm499133766b.12.2026.01.25.10.39.29 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 25 Jan 2026 10:39:30 -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 v2 10/19] drm/amd/display: Enable HDMI VRR over PCON Date: Sun, 25 Jan 2026 19:39:05 +0100 Message-ID: <20260125183914.459228-11-tomasz.pakula.oficjalny@gmail.com> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20260125183914.459228-1-tomasz.pakula.oficjalny@gmail.com> References: <20260125183914.459228-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 --- .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 32 ++++++++++++++++--- 1 file changed, 27 insertions(+), 5 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 2f856833806e..d3464705ab7f 100644 --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c @@ -13210,6 +13210,21 @@ static void monitor_range_from_vsdb(struct drm_con= nector *conn, range->max_vfreq =3D vsdb->max_refresh_rate_hz; } =20 +/** + * Get VRR range from HDMI VRR info in EDID. If VRRmax =3D=3D 0, + * try getting upper bound from AMD vsdb (if passed). + * + * @conn: drm_connector with HDMI VRR info + */ +static void monitor_range_from_hdmi(struct drm_connector *conn) +{ + struct drm_monitor_range_info *range =3D &conn->display_info.monitor_rang= e; + struct drm_hdmi_vrr_cap *caps =3D &conn->display_info.hdmi.vrr_cap; + + range->min_vfreq =3D caps->vrr_min; + range->max_vfreq =3D caps->vrr_max; +} + /* * Returns true if connector is capable of freesync * Optionally, can fetch the range from AMD vsdb @@ -13259,6 +13274,7 @@ void amdgpu_dm_update_freesync_caps(struct drm_conn= ector *connector, struct amdgpu_hdmi_vsdb_info vsdb_info =3D {0}; struct amdgpu_hdmi_vsdb_info vsdb_did =3D {0}; struct dpcd_caps dpcd_caps =3D {0}; + struct drm_hdmi_vrr_cap *hdmi_vrr; const struct edid *edid; bool freesync_capable =3D false; bool valid_vsdb_cea =3D false; @@ -13296,6 +13312,7 @@ void amdgpu_dm_update_freesync_caps(struct drm_conn= ector *connector, edid =3D drm_edid_raw(drm_edid); // FIXME: Get rid of drm_edid_raw() valid_vsdb_cea =3D parse_amd_vsdb_cea(amdgpu_dm_connector, edid, &vsdb_in= fo) >=3D 0; vsdb_freesync =3D valid_vsdb_cea && vsdb_info.freesync_supported; + 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; @@ -13341,12 +13358,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_freesync) { - 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); + else if (vsdb_freesync) { + amdgpu_dm_connector->vsdb_info =3D vsdb_info; + monitor_range_from_vsdb(connector, &vsdb_info); + } =20 - monitor_range_from_vsdb(connector, &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.52.0