Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 36cc549d authored by Shirish S's avatar Shirish S Committed by Alex Deucher
Browse files

drm/amd/display: disable CRTCs with NULL FB on their primary plane (V2)



The below commit

"drm/atomic: Try to preserve the crtc enabled state in drm_atomic_remove_fb, v2"

introduces a slight behavioral change to rmfb. Instead of disabling a crtc
when the primary plane is disabled, it now preserves it.

This change leads to BUG hit while performing atomic commit on amd driver.

As a fix this patch ensures that we disable the CRTC's with NULL FB by returning
-EINVAL and hence triggering fall back to the old behavior and turning off the
crtc in atomic_remove_fb().

V2: Added error check for plane_state and removed sanity check for crtc.

Signed-off-by: default avatarShirish S <shirish.s@amd.com>
Signed-off-by: default avatarPratik Vishwakarma <Pratik.Vishwakarma@amd.com>
Reviewed-by: default avatarHarry Wentland <harry.wentland@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent 3c27b3f4
Loading
Loading
Loading
Loading
+28 −0
Original line number Diff line number Diff line
@@ -4746,6 +4746,30 @@ static int dm_update_planes_state(struct dc *dc,
	return ret;
}

static int dm_atomic_check_plane_state_fb(struct drm_atomic_state *state,
					  struct drm_crtc *crtc)
{
	struct drm_plane *plane;
	struct drm_crtc_state *crtc_state;

	WARN_ON(!drm_atomic_get_new_crtc_state(state, crtc));

	drm_for_each_plane_mask(plane, state->dev, crtc->state->plane_mask) {
		struct drm_plane_state *plane_state =
			drm_atomic_get_plane_state(state, plane);

		if (IS_ERR(plane_state))
			return -EDEADLK;

		crtc_state = drm_atomic_get_crtc_state(plane_state->state, crtc);
		if (crtc->primary == plane && crtc_state->active) {
			if (!plane_state->fb)
				return -EINVAL;
		}
	}
	return 0;
}

static int amdgpu_dm_atomic_check(struct drm_device *dev,
				  struct drm_atomic_state *state)
{
@@ -4769,6 +4793,10 @@ static int amdgpu_dm_atomic_check(struct drm_device *dev,
		goto fail;

	for_each_oldnew_crtc_in_state(state, crtc, old_crtc_state, new_crtc_state, i) {
		ret = dm_atomic_check_plane_state_fb(state, crtc);
		if (ret)
			goto fail;

		if (!drm_atomic_crtc_needs_modeset(new_crtc_state) &&
		    !new_crtc_state->color_mgmt_changed)
			continue;