mirror of
https://github.com/raspberrypi/linux.git
synced 2026-01-03 08:14:12 +00:00
drm/amd/display: Update SW cursor fallback for subvp high refresh
[Description] Since SubVP high refresh is now enabled, we must fallback to SW cursor under if we're in a SubVP high refresh config Reviewed-by: Samson Tam <samson.tam@amd.com> Acked-by: Alan Liu <haoping.liu@amd.com> Signed-off-by: Alvin Lee <alvin.lee2@amd.com> Tested-by: Daniel Wheeler <daniel.wheeler@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
This commit is contained in:
@@ -306,6 +306,32 @@ bool dc_optimize_timing_for_fsft(
|
||||
}
|
||||
#endif
|
||||
|
||||
static bool is_subvp_high_refresh_candidate(struct dc_stream_state *stream)
|
||||
{
|
||||
uint32_t refresh_rate;
|
||||
struct dc *dc = stream->ctx->dc;
|
||||
|
||||
refresh_rate = (stream->timing.pix_clk_100hz * (uint64_t)100 +
|
||||
stream->timing.v_total * stream->timing.h_total - (uint64_t)1);
|
||||
refresh_rate = div_u64(refresh_rate, stream->timing.v_total);
|
||||
refresh_rate = div_u64(refresh_rate, stream->timing.h_total);
|
||||
|
||||
/* If there's any stream that fits the SubVP high refresh criteria,
|
||||
* we must return true. This is because cursor updates are asynchronous
|
||||
* with full updates, so we could transition into a SubVP config and
|
||||
* remain in HW cursor mode if there's no cursor update which will
|
||||
* then cause corruption.
|
||||
*/
|
||||
if ((refresh_rate >= 120 && refresh_rate <= 165 &&
|
||||
stream->timing.v_addressable >= 1440 &&
|
||||
stream->timing.v_addressable <= 2160) &&
|
||||
(dc->current_state->stream_count > 1 ||
|
||||
(dc->current_state->stream_count == 1 && !stream->allow_freesync)))
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/*
|
||||
* dc_stream_set_cursor_attributes() - Update cursor attributes and set cursor surface address
|
||||
*/
|
||||
@@ -334,12 +360,13 @@ bool dc_stream_set_cursor_attributes(
|
||||
|
||||
/* SubVP is not compatible with HW cursor larger than 64 x 64 x 4.
|
||||
* Therefore, if cursor is greater than 64 x 64 x 4, fallback to SW cursor in the following case:
|
||||
* 1. For single display cases, if resolution is >= 5K and refresh rate < 120hz
|
||||
* 2. For multi display cases, if resolution is >= 4K and refresh rate < 120hz
|
||||
*
|
||||
* [< 120hz is a requirement for SubVP configs]
|
||||
* 1. If the config is a candidate for SubVP high refresh (both single an dual display configs)
|
||||
* 2. If not subvp high refresh, for single display cases, if resolution is >= 5K and refresh rate < 120hz
|
||||
* 3. If not subvp high refresh, for multi display cases, if resolution is >= 4K and refresh rate < 120hz
|
||||
*/
|
||||
if (dc->debug.allow_sw_cursor_fallback && attributes->height * attributes->width * 4 > 16384) {
|
||||
if (!dc->debug.disable_subvp_high_refresh && is_subvp_high_refresh_candidate(stream))
|
||||
return false;
|
||||
if (dc->current_state->stream_count == 1 && stream->timing.v_addressable >= 2880 &&
|
||||
((stream->timing.pix_clk_100hz * 100) / stream->timing.v_total / stream->timing.h_total) < 120)
|
||||
return false;
|
||||
|
||||
Reference in New Issue
Block a user