Skip to content
Merged
Changes from 1 commit
Commits
Show all changes
19 commits
Select commit Hold shift + click to select a range
df47421
[FROM-ML] drm/amd/display: Return if DisplayID not found in parse_amd…
Lawstorant Feb 3, 2026
f755cd0
[FROM-ML] drm/amd/display: Refactor amdgpu_dm_update_freesync_caps()
Lawstorant Feb 3, 2026
b33f640
[FROM-ML] drm/amd/display: Check for VRR range in CEA AMD vsdb
Lawstorant Feb 3, 2026
f7e80a4
[FROM-ML] drm/amd/display: Use bigger VRR range if found in AMD vsdb
Lawstorant Feb 3, 2026
fd22189
[FROM-ML] drm/amd/display: Refactor PCON VRR compatibility check
Lawstorant Feb 3, 2026
6089fe9
[FROM-ML] drm/amd/display: Add PCON VRR ID check override
Lawstorant Feb 3, 2026
5e007f7
[FROM-ML] drm/amd/display: Add CH7218 PCON ID
Lawstorant Feb 3, 2026
72a5beb
[FROM-ML] drm/edid: Parse more info from HDMI Forum vsdb
Lawstorant Feb 3, 2026
6531fec
[FROM-ML] drm/amd/display: Rename PCON adaptive sync types
Lawstorant Feb 3, 2026
75e4c16
[FROM-ML] drm/amd/display: Enable HDMI VRR over PCON
Lawstorant Feb 3, 2026
d90fba5
[FROM-ML] drm/amd/display: Support HDMI VRRmax=0
Lawstorant Feb 3, 2026
4a8f620
[FROM-ML] drm/amd/display: Build HDMI vsif in correct slot
Lawstorant Feb 3, 2026
bd9c923
[FROM-ML] drm/amd/display: Save HDMI gaming info to edid caps
Lawstorant Feb 3, 2026
1269ebc
[FROM-ML] drm/amd/display: Restore ALLM support in HDMI vsif
Lawstorant Feb 3, 2026
47b0301
[FROM-ML] drm/amd/display: Trigger ALLM if it's available
Lawstorant Feb 3, 2026
fae1544
[FROM-ML] drm/amd/display: Add parameter to control ALLM behavior
Lawstorant Feb 3, 2026
9a24bba
[FROM-ML] drm/amd/display: Reintroduce VTEM info frame
Lawstorant Feb 3, 2026
fd09ba3
[FROM-ML] drm/amd/display: Enable HDMI VRR
Lawstorant Feb 3, 2026
b252e03
[FROM-ML] drm/amd/display: Add HDMI VRR desktop mode
Lawstorant Feb 3, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
[FROM-ML] drm/amd/display: Enable HDMI VRR over PCON
[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ła <tomasz.pakula.oficjalny@gmail.com>
Tested-by: Bernhard Berger <bernhard.berger@gmail.com>
  • Loading branch information
Lawstorant authored and KyleGospo committed Feb 13, 2026
commit 75e4c1631db8f4dc26ba9fbff43e0e7e0da96707
28 changes: 23 additions & 5 deletions drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
Original file line number Diff line number Diff line change
Expand Up @@ -13206,6 +13206,17 @@ static void monitor_range_from_vsdb(struct drm_display_info *display,
display->monitor_range.max_vfreq = vsdb->max_refresh_rate_hz;
}

/**
* 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 = display->hdmi.vrr_cap.vrr_min;
display->monitor_range.max_vfreq = display->hdmi.vrr_cap.vrr_max;
}

/*
* Returns true if connector is capable of freesync
* Optionally, can fetch the range from AMD vsdb
Expand Down Expand Up @@ -13254,6 +13265,7 @@ void amdgpu_dm_update_freesync_caps(struct drm_connector *connector,
struct amdgpu_device *adev = drm_to_adev(connector->dev);
struct amdgpu_hdmi_vsdb_info vsdb_info = {0};
struct amdgpu_hdmi_vsdb_info vsdb_did = {0};
struct drm_hdmi_vrr_cap hdmi_vrr = {0};
struct dpcd_caps dpcd_caps = {0};
const struct edid *edid;
bool freesync_capable = false;
Expand Down Expand Up @@ -13289,6 +13301,7 @@ void amdgpu_dm_update_freesync_caps(struct drm_connector *connector,
/* Gather all data */
edid = drm_edid_raw(drm_edid); // FIXME: Get rid of drm_edid_raw()
parse_amd_vsdb_cea(amdgpu_dm_connector, edid, &vsdb_info);
hdmi_vrr = connector->display_info.hdmi.vrr_cap;

if (amdgpu_dm_connector->dc_link) {
dpcd_caps = amdgpu_dm_connector->dc_link->dpcd_caps;
Expand Down Expand Up @@ -13334,12 +13347,17 @@ void amdgpu_dm_update_freesync_caps(struct drm_connector *connector,
freesync_capable = copy_range_to_amdgpu_connector(connector);

/* DP -> HDMI PCON */
} else if (pcon_allowed && vsdb_info.freesync_supported) {
amdgpu_dm_connector->as_type = ADAPTIVE_SYNC_TYPE_PCON_ALLOWED;
amdgpu_dm_connector->pack_sdp_v1_3 = true;
amdgpu_dm_connector->vsdb_info = 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 = vsdb_info;
monitor_range_from_vsdb(&connector->display_info, &vsdb_info);
}

monitor_range_from_vsdb(&connector->display_info, &vsdb_info);
amdgpu_dm_connector->pack_sdp_v1_3 = true;
amdgpu_dm_connector->as_type = ADAPTIVE_SYNC_TYPE_PCON_ALLOWED;
freesync_capable = copy_range_to_amdgpu_connector(connector);
}

Expand Down