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

Commit 4de15bb6 authored by Samantha Tran's avatar Samantha Tran Committed by Gerrit - the friendly Code Review server
Browse files

disp: msm: sde: check all dirty properties during plane update



Previously when updating a plane's dirty features, if the
dirty all flag was set, the optimization was to break early.
This optimization left out color property updates for that plane.
This fix removes the mutex locks in the msm_prop function so
the break optimization is no longer needed. Function callers will
now need to acquire the lock and unlock the property lock when done.
Now the plane will iterate through all dirty properties.

Change-Id: I3114ac44d62ac0f0633897d757b6fd9a5b1f5d2e
Signed-off-by: default avatarSamantha Tran <samtran@codeaurora.org>
parent d236dbd5
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -77,7 +77,8 @@ int msm_property_pop_dirty(struct msm_property_info *info,
		return -EINVAL;
	}

	mutex_lock(&info->property_lock);
	WARN_ON(!mutex_is_locked(&info->property_lock));

	if (list_empty(&property_state->dirty_list)) {
		rc = -EAGAIN;
	} else {
@@ -87,7 +88,6 @@ int msm_property_pop_dirty(struct msm_property_info *info,
			- property_state->values;
		DRM_DEBUG_KMS("property %d dirty\n", rc);
	}
	mutex_unlock(&info->property_lock);

	return rc;
}
+3 −1
Original line number Diff line number Diff line
@@ -162,7 +162,9 @@ bool msm_property_get_is_active(struct msm_property_info *info)

/**
 * msm_property_pop_dirty - determine next dirty property and clear
 *                          its dirty flag
 *                          its dirty flag. Caller needs to acquire property
 *			  lock before calling this function and release
 *			  the lock when finished.
 * @info: Pointer to property info container struct
 * @property_state: Pointer to property state container struct
 * Returns: Valid msm property index on success,
+2 −0
Original line number Diff line number Diff line
@@ -701,6 +701,7 @@ static int _sde_connector_update_dirty_properties(
	c_conn = to_sde_connector(connector);
	c_state = to_sde_connector_state(connector->state);

	mutex_lock(&c_conn->property_info.property_lock);
	while ((idx = msm_property_pop_dirty(&c_conn->property_info,
					&c_state->property_state)) >= 0) {
		switch (idx) {
@@ -723,6 +724,7 @@ static int _sde_connector_update_dirty_properties(
			break;
		}
	}
	mutex_unlock(&c_conn->property_info.property_lock);

	/* if colorspace needs to be updated do it first */
	if (c_conn->colorspace_updated) {
+2 −3
Original line number Diff line number Diff line
@@ -3182,14 +3182,13 @@ static int sde_plane_sspp_atomic_update(struct drm_plane *plane,
	}

	/* determine what needs to be refreshed */
	mutex_lock(&psde->property_info.property_lock);
	while ((idx = msm_property_pop_dirty(&psde->property_info,
				&pstate->property_state)) >= 0) {
		dirty_prop_flag = plane_prop_array[idx];
		pstate->dirty |= dirty_prop_flag;

		if (dirty_prop_flag == SDE_PLANE_DIRTY_ALL)
			break;
	}
	mutex_unlock(&psde->property_info.property_lock);

	/**
	 * since plane_atomic_check is invoked before crtc_atomic_check