Commit 41ad3662 authored by Simon Ser's avatar Simon Ser Committed by Alex Deucher
Browse files

amd/display: remove ChromeOS workaround

This reverts commits ddab8bd7 ("drm/amd/display: Fix two cursor duplication
when using overlay") and e7d9560a ("Revert "drm/amd/display: Fix overlay
validation by considering cursors"").

tl;dr ChromeOS uses the atomic interface for everything except the cursor. This
is incorrect and forces amdgpu to disable some hardware features. Let's revert
the ChromeOS-specific workaround in mainline and allow the Chrome team to keep
it internally in their own tree.

See [1] for more details. This patch is an alternative to [2], which added
ChromeOS detection.

[1]: https://lore.kernel.org/amd-gfx/JIQ_93_cHcshiIDsrMU1huBzx9P9LVQxucx8hQArpQu7Wk5DrCl_vTXj_Q20m_L-8C8A5dSpNcSJ8ehfcCrsQpfB5QG_Spn14EYkH9chtg0=@emersion.fr/
[2]: https://lore.kernel.org/amd-gfx/20211011151609.452132-1-contact@emersion.fr/



Signed-off-by: default avatarSimon Ser <contact@emersion.fr>
Cc: Alex Deucher <alexander.deucher@amd.com>
Cc: Harry Wentland <hwentlan@amd.com>
Cc: Nicholas Kazlauskas <nicholas.kazlauskas@amd.com>
Cc: Bas Nieuwenhuizen <bas@basnieuwenhuizen.nl>
Cc: Rodrigo Siqueira <Rodrigo.Siqueira@amd.com>
Cc: Sean Paul <seanpaul@chromium.org>
Fixes: ddab8bd7 ("drm/amd/display: Fix two cursor duplication when using overlay")
Fixes: e7d9560a ("Revert "drm/amd/display: Fix overlay validation by considering cursors"")
Reviewed-by: default avatarHarry Wentland <harry.wentland@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent 47b67c99
Loading
Loading
Loading
Loading
+0 −51
Original line number Diff line number Diff line
@@ -10627,53 +10627,6 @@ static int add_affected_mst_dsc_crtcs(struct drm_atomic_state *state, struct drm
}
#endif

static int validate_overlay(struct drm_atomic_state *state)
{
	int i;
	struct drm_plane *plane;
	struct drm_plane_state *new_plane_state;
	struct drm_plane_state *primary_state, *overlay_state = NULL;

	/* Check if primary plane is contained inside overlay */
	for_each_new_plane_in_state_reverse(state, plane, new_plane_state, i) {
		if (plane->type == DRM_PLANE_TYPE_OVERLAY) {
			if (drm_atomic_plane_disabling(plane->state, new_plane_state))
				return 0;

			overlay_state = new_plane_state;
			continue;
		}
	}

	/* check if we're making changes to the overlay plane */
	if (!overlay_state)
		return 0;

	/* check if overlay plane is enabled */
	if (!overlay_state->crtc)
		return 0;

	/* find the primary plane for the CRTC that the overlay is enabled on */
	primary_state = drm_atomic_get_plane_state(state, overlay_state->crtc->primary);
	if (IS_ERR(primary_state))
		return PTR_ERR(primary_state);

	/* check if primary plane is enabled */
	if (!primary_state->crtc)
		return 0;

	/* Perform the bounds check to ensure the overlay plane covers the primary */
	if (primary_state->crtc_x < overlay_state->crtc_x ||
	    primary_state->crtc_y < overlay_state->crtc_y ||
	    primary_state->crtc_x + primary_state->crtc_w > overlay_state->crtc_x + overlay_state->crtc_w ||
	    primary_state->crtc_y + primary_state->crtc_h > overlay_state->crtc_y + overlay_state->crtc_h) {
		DRM_DEBUG_ATOMIC("Overlay plane is enabled with hardware cursor but does not fully cover primary plane\n");
		return -EINVAL;
	}

	return 0;
}

/**
 * amdgpu_dm_atomic_check() - Atomic check implementation for AMDgpu DM.
 * @dev: The DRM device
@@ -10855,10 +10808,6 @@ static int amdgpu_dm_atomic_check(struct drm_device *dev,
			goto fail;
	}

	ret = validate_overlay(state);
	if (ret)
		goto fail;

	/* Add new/modified planes */
	for_each_oldnew_plane_in_state_reverse(state, plane, old_plane_state, new_plane_state, i) {
		ret = dm_update_plane_state(dc, state, plane,