소스 검색

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: Samantha Tran <[email protected]>
Samantha Tran 5 년 전
부모
커밋
4de15bb6ef
4개의 변경된 파일9개의 추가작업 그리고 6개의 파일을 삭제
  1. 2 2
      msm/msm_prop.c
  2. 3 1
      msm/msm_prop.h
  3. 2 0
      msm/sde/sde_connector.c
  4. 2 3
      msm/sde/sde_plane.c

+ 2 - 2
msm/msm_prop.c

@@ -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
msm/msm_prop.h

@@ -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
msm/sde/sde_connector.c

@@ -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
msm/sde/sde_plane.c

@@ -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