Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

drm/amd/display: disable SubVP + DRR to prevent underflow

[Why&How]
Temporarily disable SubVP+DRR since Xorg has an architectural limitation
where freesync will not work in a multi monitor configuration. SubVP+DRR
requires that freesync be working.

Whether OS has variable refresh setting enabled or not, the state on
the crtc remains same unless an application requests VRR. Due to this,
there is no way to know whether freesync will actually work or not
while we are on the desktop from the kernel's perspective.

If userspace does not have a limitation with multi-display freesync (for
example wayland), then this feature can be enabled by adding a
dcfeaturemask option to amdgpu on the kernel cmdline like:

amdgpu.dcfeaturemask=0x200

Signed-off-by: Aurabindo Pillai <aurabindo.pillai@amd.com>
Reviewed-by: Rodrigo Siqueira <Rodrigo.Siqueira@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>

authored by

Aurabindo Pillai and committed by
Alex Deucher
80c6d680 ac0bb08d

+11 -1
+5
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
··· 1604 1604 if (amdgpu_dc_feature_mask & DC_DISABLE_LTTPR_DP2_0) 1605 1605 init_data.flags.allow_lttpr_non_transparent_mode.bits.DP2_0 = true; 1606 1606 1607 + /* Disable SubVP + DRR config by default */ 1608 + init_data.flags.disable_subvp_drr = true; 1609 + if (amdgpu_dc_feature_mask & DC_ENABLE_SUBVP_DRR) 1610 + init_data.flags.disable_subvp_drr = false; 1611 + 1607 1612 init_data.flags.seamless_boot_edp_requested = false; 1608 1613 1609 1614 if (check_seamless_boot_capability(adev)) {
+1 -1
drivers/gpu/drm/amd/display/dc/dc.h
··· 409 409 bool force_bios_enable_lttpr; 410 410 uint8_t force_bios_fixed_vs; 411 411 int sdpif_request_limit_words_per_umc; 412 - 412 + bool disable_subvp_drr; 413 413 }; 414 414 415 415 enum visual_confirm {
+4
drivers/gpu/drm/amd/display/dc/dml/dcn32/dcn32_fpu.c
··· 880 880 int16_t stretched_drr_us = 0; 881 881 int16_t drr_stretched_vblank_us = 0; 882 882 int16_t max_vblank_mallregion = 0; 883 + const struct dc_config *config = &dc->config; 884 + 885 + if (config->disable_subvp_drr) 886 + return false; 883 887 884 888 // Find SubVP pipe 885 889 for (i = 0; i < dc->res_pool->pipe_count; i++) {
+1
drivers/gpu/drm/amd/include/amd_shared.h
··· 240 240 DC_DISABLE_LTTPR_DP2_0 = (1 << 6), //0x40, disabled by default 241 241 DC_PSR_ALLOW_SMU_OPT = (1 << 7), //0x80, disabled by default 242 242 DC_PSR_ALLOW_MULTI_DISP_OPT = (1 << 8), //0x100, disabled by default 243 + DC_ENABLE_SUBVP_DRR = (1 << 9), // 0x200, disabled by default 243 244 }; 244 245 245 246 enum DC_DEBUG_MASK {