Prechádzať zdrojové kódy

Merge "disp: msm: sde: update QoS values on FPS switch"

qctecmdr 5 rokov pred
rodič
commit
a590ad8a8a

+ 17 - 0
msm/sde/sde_crtc.c

@@ -5332,6 +5332,23 @@ exit:
 	return ret;
 }
 
+void sde_crtc_set_qos_dirty(struct drm_crtc *crtc)
+{
+	struct drm_plane *plane;
+	struct drm_plane_state *state;
+	struct sde_plane_state *pstate;
+
+	drm_atomic_crtc_for_each_plane(plane, crtc) {
+		state = plane->state;
+		if (!state)
+			continue;
+
+		pstate = to_sde_plane_state(state);
+
+		pstate->dirty |= SDE_PLANE_DIRTY_QOS;
+	}
+}
+
 /**
  * sde_crtc_atomic_get_property - retrieve a crtc drm property
  * @crtc: Pointer to drm crtc structure

+ 7 - 0
msm/sde/sde_crtc.h

@@ -819,6 +819,13 @@ void sde_crtc_timeline_status(struct drm_crtc *crtc);
 void sde_crtc_update_cont_splash_settings(
 		struct drm_crtc *crtc);
 
+/**
+ * sde_crtc_set_qos_dirty - update plane dirty flag to include
+ *	QoS reprogramming which is required during fps switch
+ * @crtc: Pointer to drm crtc structure
+ */
+void sde_crtc_set_qos_dirty(struct drm_crtc *crtc);
+
 /**
  * sde_crtc_misr_setup - to configure and enable/disable MISR
  * @crtc: Pointer to drm crtc structure

+ 2 - 0
msm/sde/sde_encoder.c

@@ -2122,6 +2122,8 @@ static void sde_encoder_virt_mode_set(struct drm_encoder *drm_enc,
 	}
 	drm_connector_list_iter_end(&conn_iter);
 
+	sde_crtc_set_qos_dirty(sde_enc->crtc);
+
 	if (!conn) {
 		SDE_ERROR_ENC(sde_enc, "failed to find attached connector\n");
 		return;

+ 12 - 3
msm/sde/sde_plane.c

@@ -3129,7 +3129,9 @@ static void _sde_plane_update_properties(struct drm_plane *plane,
 		psde->pipe_hw->ops.setup_sharpening)
 		_sde_plane_update_sharpening(psde);
 
-	_sde_plane_set_qos_lut(plane, crtc, fb);
+	if (pstate->dirty & (SDE_PLANE_DIRTY_QOS | SDE_PLANE_DIRTY_RECTS |
+			SDE_PLANE_DIRTY_FORMAT))
+		_sde_plane_set_qos_lut(plane, crtc, fb);
 
 	if (plane->type != DRM_PLANE_TYPE_CURSOR) {
 		_sde_plane_set_qos_ctrl(plane, true, SDE_PLANE_QOS_PANIC_CTRL);
@@ -3138,7 +3140,8 @@ static void _sde_plane_update_properties(struct drm_plane *plane,
 			_sde_plane_set_ts_prefill(plane, pstate);
 	}
 
-	_sde_plane_set_qos_remap(plane);
+	if (pstate->dirty & SDE_PLANE_DIRTY_QOS)
+		_sde_plane_set_qos_remap(plane);
 
 	/* clear dirty */
 	pstate->dirty = 0x0;
@@ -3155,6 +3158,7 @@ static int sde_plane_sspp_atomic_update(struct drm_plane *plane,
 	struct drm_framebuffer *fb;
 	int idx;
 	int dirty_prop_flag;
+	bool is_rt;
 
 	if (!plane) {
 		SDE_ERROR("invalid plane\n");
@@ -3231,12 +3235,17 @@ static int sde_plane_sspp_atomic_update(struct drm_plane *plane,
 
 	_sde_plane_set_scanout(plane, pstate, &psde->pipe_cfg, fb);
 
+	is_rt = sde_crtc_is_rt_client(crtc, crtc->state);
+	if (is_rt != psde->is_rt_pipe) {
+		psde->is_rt_pipe = is_rt;
+		pstate->dirty |= SDE_PLANE_DIRTY_QOS;
+	}
+
 	/* early out if nothing dirty */
 	if (!pstate->dirty)
 		return 0;
 	pstate->pending = true;
 
-	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);

+ 1 - 0
msm/sde/sde_plane.h

@@ -36,6 +36,7 @@
 #define SDE_PLANE_DIRTY_VIG_IGC 0x40
 #define SDE_PLANE_DIRTY_DMA_IGC 0x80
 #define SDE_PLANE_DIRTY_DMA_GC 0x100
+#define SDE_PLANE_DIRTY_QOS     0x200
 #define SDE_PLANE_DIRTY_CP (SDE_PLANE_DIRTY_VIG_GAMUT |\
 		SDE_PLANE_DIRTY_VIG_IGC | SDE_PLANE_DIRTY_DMA_IGC |\
 		SDE_PLANE_DIRTY_DMA_GC)