Commit d3e79f33 authored by Nicholas Kazlauskas's avatar Nicholas Kazlauskas Committed by Alex Deucher
Browse files

drm/amd/display: Fix HWSS v3 fast path determination



[WHY]
We're checking surface and stream updates after they've been applied to
their respective states within `update_planes_and_stream_state`.

Medium updates under the HWSS V3 fast path that are not supported or
tested are getting implicitly if they don't trigger a DML validation
and getting updated in place on the dc->current_state context.

[HOW]
Fix this issue by moving up the fast path determination check prior
to `update_planes_and_stream_state`. This is how the V2 path works
and how the V3 path used to work prior to the refactors in this area.

Reviewed-by: default avatarDillon Varone <dillon.varone@amd.com>
Signed-off-by: default avatarNicholas Kazlauskas <nicholas.kazlauskas@amd.com>
Signed-off-by: default avatarAlex Hung <alex.hung@amd.com>
Tested-by: default avatarDan Wheeler <daniel.wheeler@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent e6e2b956
Loading
Loading
Loading
Loading
+18 −20
Original line number Diff line number Diff line
@@ -7295,6 +7295,23 @@ static bool update_planes_and_stream_prepare_v3(
	ASSERT(scratch->flow == UPDATE_V3_FLOW_INVALID);
	dc_exit_ips_for_hw_access(scratch->dc);

	/* HWSS path determination needs to be done prior to updating the surface and stream states. */
	struct dc_fast_update fast_update[MAX_SURFACES] = { 0 };

	populate_fast_updates(fast_update,
			      scratch->surface_updates,
			      scratch->surface_count,
			      scratch->stream_update);

	const bool is_hwss_fast_path_only =
		fast_update_only(scratch->dc,
				 fast_update,
				 scratch->surface_updates,
				 scratch->surface_count,
				 scratch->stream_update,
				 scratch->stream) &&
		!scratch->dc->check_config.enable_legacy_fast_update;

	if (!update_planes_and_stream_state(
			scratch->dc,
			scratch->surface_updates,
@@ -7310,26 +7327,7 @@ static bool update_planes_and_stream_prepare_v3(
	if (scratch->new_context == scratch->dc->current_state) {
		ASSERT(scratch->update_type < UPDATE_TYPE_FULL);

		// TODO: Do we need this to be alive in execute?
		struct dc_fast_update fast_update[MAX_SURFACES] = { 0 };

		populate_fast_updates(
				fast_update,
				scratch->surface_updates,
				scratch->surface_count,
				scratch->stream_update
		);
		const bool fast = fast_update_only(
				scratch->dc,
				fast_update,
				scratch->surface_updates,
				scratch->surface_count,
				scratch->stream_update,
				scratch->stream
		)
		// TODO: Can this be used to skip `populate_fast_updates`?
				&& !scratch->dc->check_config.enable_legacy_fast_update;
		scratch->flow = fast
		scratch->flow = is_hwss_fast_path_only
				? UPDATE_V3_FLOW_NO_NEW_CONTEXT_CONTEXT_FAST
				: UPDATE_V3_FLOW_NO_NEW_CONTEXT_CONTEXT_FULL;
		return true;