Skip to content

Commit 40ba8a7

Browse files
Lawstorant1Naim
authored andcommitted
drm/amd/display: Use passive_vrr properties in amdgpu
[How] Attach and use this properties for HDMI sinks which are troublesome with their VRR state transitions. Hook into already-established freesync_on_desktop logic. Signed-off-by: Tomasz Pakuła <tomasz.pakula.oficjalny@gmail.com>
1 parent 5463430 commit 40ba8a7

2 files changed

Lines changed: 23 additions & 4 deletions

File tree

drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7860,6 +7860,8 @@ amdgpu_dm_connector_atomic_duplicate_state(struct drm_connector *connector)
78607860
__drm_atomic_helper_connector_duplicate_state(connector, &new_state->base);
78617861

78627862
new_state->freesync_capable = state->freesync_capable;
7863+
new_state->freesync_on_desktop_capable =
7864+
state->freesync_on_desktop_capable;
78637865
new_state->abm_level = state->abm_level;
78647866
new_state->scaling = state->scaling;
78657867
new_state->underscan_enable = state->underscan_enable;
@@ -9066,8 +9068,10 @@ void amdgpu_dm_connector_init_helper(struct amdgpu_display_manager *dm,
90669068
connector_type == DRM_MODE_CONNECTOR_eDP) {
90679069
drm_connector_attach_hdr_output_metadata_property(&aconnector->base);
90689070

9069-
if (!aconnector->mst_root)
9071+
if (!aconnector->mst_root) {
90709072
drm_connector_attach_vrr_capable_property(&aconnector->base);
9073+
drm_connector_attach_passive_vrr_capable_property(&aconnector->base);
9074+
}
90719075

90729076
if (adev->dm.hdcp_workqueue)
90739077
drm_connector_attach_content_protection_property(&aconnector->base, true);
@@ -11347,6 +11351,12 @@ static void get_freesync_config_for_crtc(
1134711351
config.vsif_supported = true;
1134811352
config.btr = true;
1134911353

11354+
if (new_con_state->freesync_on_desktop_capable)
11355+
new_crtc_state->stream->freesync_on_desktop =
11356+
!new_crtc_state->base.passive_vrr_disabled;
11357+
else
11358+
new_crtc_state->stream->freesync_on_desktop = false;
11359+
1135011360
if (fs_vid_mode) {
1135111361
config.state = VRR_STATE_ACTIVE_FIXED;
1135211362
config.fixed_refresh_in_uhz = new_crtc_state->freesync_config.fixed_refresh_in_uhz;
@@ -11358,6 +11368,7 @@ static void get_freesync_config_for_crtc(
1135811368
}
1135911369
} else {
1136011370
config.state = VRR_STATE_UNSUPPORTED;
11371+
new_crtc_state->stream->freesync_on_desktop = false;
1136111372
}
1136211373
out:
1136311374
new_crtc_state->freesync_config = config;
@@ -13361,6 +13372,7 @@ void amdgpu_dm_update_freesync_caps(struct drm_connector *connector,
1336113372
struct drm_hdmi_vrr_cap hdmi_vrr = {0};
1336213373
struct dpcd_caps dpcd_caps = {0};
1336313374
const struct edid *edid;
13375+
bool freesync_on_desktop = false;
1336413376
bool freesync_capable = false;
1336513377
bool pcon_allowed = false;
1336613378
bool is_pcon = false;
@@ -13440,6 +13452,7 @@ void amdgpu_dm_update_freesync_caps(struct drm_connector *connector,
1344013452
monitor_range_from_vsdb(&connector->display_info, &vsdb_info);
1344113453

1344213454
freesync_capable = copy_range_to_amdgpu_connector(connector);
13455+
freesync_on_desktop = freesync_capable;
1344313456

1344413457
/* DP -> HDMI PCON */
1344513458
} else if (pcon_allowed) {
@@ -13454,11 +13467,14 @@ void amdgpu_dm_update_freesync_caps(struct drm_connector *connector,
1345413467
amdgpu_dm_connector->pack_sdp_v1_3 = true;
1345513468
amdgpu_dm_connector->as_type = ADAPTIVE_SYNC_TYPE_PCON_ALLOWED;
1345613469
freesync_capable = copy_range_to_amdgpu_connector(connector);
13470+
freesync_on_desktop = freesync_capable;
1345713471
}
1345813472

1345913473
update:
13460-
if (dm_con_state)
13474+
if (dm_con_state) {
1346113475
dm_con_state->freesync_capable = freesync_capable;
13476+
dm_con_state->freesync_on_desktop_capable = freesync_on_desktop;
13477+
}
1346213478

1346313479
if (connector->state && amdgpu_dm_connector->dc_link && !freesync_capable &&
1346413480
amdgpu_dm_connector->dc_link->replay_settings.config.replay_supported) {
@@ -13467,8 +13483,10 @@ void amdgpu_dm_update_freesync_caps(struct drm_connector *connector,
1346713483
}
1346813484

1346913485
if (connector->vrr_capable_property)
13470-
drm_connector_set_vrr_capable_property(connector,
13471-
freesync_capable);
13486+
drm_connector_set_vrr_capable_property(connector, freesync_capable);
13487+
13488+
if (connector->passive_vrr_capable_property)
13489+
drm_connector_set_passive_vrr_capable_property(connector, freesync_on_desktop);
1347213490
}
1347313491

1347413492
void amdgpu_dm_trigger_timing_sync(struct drm_device *dev)

drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1020,6 +1020,7 @@ struct dm_connector_state {
10201020
uint8_t underscan_hborder;
10211021
bool underscan_enable;
10221022
bool freesync_capable;
1023+
bool freesync_on_desktop_capable;
10231024
bool update_hdcp;
10241025
bool abm_sysfs_forbidden;
10251026
uint8_t abm_level;

0 commit comments

Comments
 (0)