Browse Source

disp: msm: sde: fix inline rotator downscale ratio check

During the validation of inline-rotator downscale ratio,
in the plane atomic_check phase, the client_type is
derived from the crtc->state. This leads to wrong
client_type as in check phase, it has to be derived
from the new crtc state. Fix it to derive from
new crtc, which would in turn be used to get the
correct inline-rotator downscale ratio.

Change-Id: I109fc6fd81182b1cda1c4feefbf421d3fab433c7
Signed-off-by: Veera Sundaram Sankaran <[email protected]>
Veera Sundaram Sankaran 5 years ago
parent
commit
b7ba56ff00
4 changed files with 31 additions and 17 deletions
  1. 5 5
      msm/sde/sde_core_perf.c
  2. 6 4
      msm/sde/sde_crtc.c
  3. 10 6
      msm/sde/sde_crtc.h
  4. 10 2
      msm/sde/sde_plane.c

+ 5 - 5
msm/sde/sde_core_perf.c

@@ -456,7 +456,7 @@ static inline bool _sde_core_perf_is_wb(struct drm_crtc *crtc)
 {
 	enum sde_intf_mode if_mode = INTF_MODE_NONE;
 
-	if_mode = sde_crtc_get_intf_mode(crtc);
+	if_mode = sde_crtc_get_intf_mode(crtc, crtc->state);
 	if (if_mode == INTF_MODE_WB_BLOCK ||
 		if_mode == INTF_MODE_WB_LINE)
 		return true;
@@ -678,7 +678,7 @@ void sde_core_perf_crtc_release_bw(struct drm_crtc *crtc)
 	sde_cstate = to_sde_crtc_state(crtc->state);
 
 	/* only do this for command mode rt client (non-rsc client) */
-	if ((sde_crtc_get_intf_mode(crtc) != INTF_MODE_CMD) &&
+	if ((sde_crtc_get_intf_mode(crtc, crtc->state) != INTF_MODE_CMD) &&
 		(sde_crtc_get_client_type(crtc) != RT_RSC_CLIENT))
 		return;
 
@@ -686,11 +686,11 @@ void sde_core_perf_crtc_release_bw(struct drm_crtc *crtc)
 	 * If video interface present, cmd panel bandwidth cannot be
 	 * released.
 	 */
-	if (sde_crtc_get_intf_mode(crtc) == INTF_MODE_CMD)
+	if (sde_crtc_get_intf_mode(crtc, crtc->state) == INTF_MODE_CMD)
 		drm_for_each_crtc(tmp_crtc, crtc->dev) {
 			if (_sde_core_perf_crtc_is_power_on(tmp_crtc) &&
-				sde_crtc_get_intf_mode(tmp_crtc) ==
-						INTF_MODE_VIDEO)
+				sde_crtc_get_intf_mode(tmp_crtc,
+					tmp_crtc->state) == INTF_MODE_VIDEO)
 				return;
 		}
 

+ 6 - 4
msm/sde/sde_crtc.c

@@ -2227,17 +2227,18 @@ end:
 	spin_unlock_irqrestore(&dev->event_lock, flags);
 }
 
-enum sde_intf_mode sde_crtc_get_intf_mode(struct drm_crtc *crtc)
+enum sde_intf_mode sde_crtc_get_intf_mode(struct drm_crtc *crtc,
+		struct drm_crtc_state *cstate)
 {
 	struct drm_encoder *encoder;
 
-	if (!crtc || !crtc->dev) {
+	if (!crtc || !crtc->dev || !cstate) {
 		SDE_ERROR("invalid crtc\n");
 		return INTF_MODE_NONE;
 	}
 
 	drm_for_each_encoder_mask(encoder, crtc->dev,
-			crtc->state->encoder_mask) {
+			cstate->encoder_mask) {
 		/* continue if copy encoder is encountered */
 		if (sde_encoder_in_clone_mode(encoder))
 			continue;
@@ -5589,7 +5590,8 @@ static int sde_crtc_debugfs_state_show(struct seq_file *s, void *v)
 
 	seq_printf(s, "num_connectors: %d\n", cstate->num_connectors);
 	seq_printf(s, "client type: %d\n", sde_crtc_get_client_type(crtc));
-	seq_printf(s, "intf_mode: %d\n", sde_crtc_get_intf_mode(crtc));
+	seq_printf(s, "intf_mode: %d\n", sde_crtc_get_intf_mode(crtc,
+				crtc->state));
 	seq_printf(s, "core_clk_rate: %llu\n",
 			sde_crtc->cur_perf.core_clk_rate);
 	for (i = SDE_POWER_HANDLE_DBUS_ID_MNOC;

+ 10 - 6
msm/sde/sde_crtc.h

@@ -593,9 +593,11 @@ int sde_crtc_register_custom_event(struct sde_kms *kms,
 
 /**
  * sde_crtc_get_intf_mode - get interface mode of the given crtc
- * @crtc: Pointert to crtc
+ * @crtc: Pointert to DRM crtc
+ * @crtc: Pointert to DRM crtc_state
  */
-enum sde_intf_mode sde_crtc_get_intf_mode(struct drm_crtc *crtc);
+enum sde_intf_mode sde_crtc_get_intf_mode(struct drm_crtc *crtc,
+		struct drm_crtc_state *cstate);
 
 /**
  * sde_crtc_get_fps_mode - get frame rate of the given crtc
@@ -621,14 +623,16 @@ static inline enum sde_crtc_client_type sde_crtc_get_client_type(
 
 /**
  * sde_crtc_is_rt_client - check if real-time client or not
- * @crtc: Pointer to crtc
+ * @crtc: Pointer to DRM crtc
+ * @crtc_state: Pointer to DRM crtc_state
  */
-static inline bool sde_crtc_is_rt_client(struct drm_crtc *crtc)
+static inline bool sde_crtc_is_rt_client(struct drm_crtc *crtc,
+		struct drm_crtc_state *cstate)
 {
-	if (!crtc || !crtc->state)
+	if (!crtc || !cstate)
 		return true;
 
-	return (sde_crtc_get_intf_mode(crtc) != INTF_MODE_WB_LINE);
+	return (sde_crtc_get_intf_mode(crtc, cstate) != INTF_MODE_WB_LINE);
 }
 
 /**

+ 10 - 2
msm/sde/sde_plane.c

@@ -2406,6 +2406,12 @@ static int _sde_atomic_check_decimation_scaler(struct drm_plane_state *state,
 	uint32_t max_upscale, max_linewidth;
 	bool inline_rotation, rt_client;
 	struct drm_crtc *crtc;
+	struct drm_crtc_state *new_cstate;
+
+	if (!state || !state->state || !state->crtc) {
+		SDE_ERROR_PLANE(psde, "invalid arguments\n");
+		return -EINVAL;
+	}
 
 	deci_w = sde_plane_get_property(pstate, PLANE_PROP_H_DECIMATE);
 	deci_h = sde_plane_get_property(pstate, PLANE_PROP_V_DECIMATE);
@@ -2427,7 +2433,9 @@ static int _sde_atomic_check_decimation_scaler(struct drm_plane_state *state,
 	max_linewidth = psde->pipe_sblk->maxlinewidth;
 
 	crtc = state->crtc;
-	rt_client = sde_crtc_is_rt_client(crtc);
+	new_cstate = drm_atomic_get_new_crtc_state(state->state, crtc);
+
+	rt_client = sde_crtc_is_rt_client(crtc, new_cstate);
 
 	max_downscale_denom = 1;
 	/* inline rotation RT clients have a different max downscaling limit */
@@ -3208,7 +3216,7 @@ static int sde_plane_sspp_atomic_update(struct drm_plane *plane,
 		return 0;
 	pstate->pending = true;
 
-	psde->is_rt_pipe = sde_crtc_is_rt_client(crtc);
+	psde->is_rt_pipe = sde_crtc_is_rt_client(crtc, crtc->state);
 	_sde_plane_set_qos_ctrl(plane, false, SDE_PLANE_QOS_PANIC_CTRL);
 
 	_sde_plane_update_properties(plane, crtc, fb);