Parcourir la source

Merge "disp: msm: sde: cache cwb enc mask to use during seamless transitions"

qctecmdr il y a 2 ans
Parent
commit
2d49ae68e6
3 fichiers modifiés avec 22 ajouts et 0 suppressions
  1. 7 0
      msm/dsi/dsi_ctrl.c
  2. 2 0
      msm/sde/sde_crtc.h
  3. 13 0
      msm/sde/sde_encoder.c

+ 7 - 0
msm/dsi/dsi_ctrl.c

@@ -338,6 +338,13 @@ static int dsi_ctrl_debugfs_deinit(struct dsi_ctrl *dsi_ctrl)
 #else
 static int dsi_ctrl_debugfs_init(struct dsi_ctrl *dsi_ctrl, struct dentry *parent)
 {
+	char dbg_name[DSI_DEBUG_NAME_LEN];
+
+	snprintf(dbg_name, DSI_DEBUG_NAME_LEN, "dsi%d_ctrl",
+						dsi_ctrl->cell_index);
+	sde_dbg_reg_register_base(dbg_name,
+				dsi_ctrl->hw.base,
+				msm_iomap_size(dsi_ctrl->pdev, "dsi_ctrl"));
 	return 0;
 }
 static int dsi_ctrl_debugfs_deinit(struct dsi_ctrl *dsi_ctrl)

+ 2 - 0
msm/sde/sde_crtc.h

@@ -508,6 +508,7 @@ struct sde_line_insertion_param {
  * @input_fence_timeout_ns : Cached input fence timeout, in ns
  * @num_dim_layers: Number of dim layers
  * @cwb_enc_mask  : encoder mask populated during atomic_check if CWB is enabled
+ * @cached_cwb_enc_mask  : cached encoder mask populated during atomic_check if CWB is enabled
  * @dim_layer: Dim layer configs
  * @num_ds: Number of destination scalers to be configured
  * @num_ds_enabled: Number of destination scalers enabled
@@ -546,6 +547,7 @@ struct sde_crtc_state {
 	uint64_t input_fence_timeout_ns;
 	uint32_t num_dim_layers;
 	uint32_t cwb_enc_mask;
+	uint32_t cached_cwb_enc_mask;
 	struct sde_hw_dim_layer dim_layer[SDE_MAX_DIM_LAYERS];
 	uint32_t num_ds;
 	uint32_t num_ds_enabled;

+ 13 - 0
msm/sde/sde_encoder.c

@@ -930,6 +930,7 @@ void sde_encoder_set_clone_mode(struct drm_encoder *drm_enc,
 		}
 	}
 
+	sde_crtc_state->cached_cwb_enc_mask = sde_crtc_state->cwb_enc_mask;
 	sde_crtc_state->cwb_enc_mask = 0;
 }
 
@@ -2605,6 +2606,8 @@ static void sde_encoder_virt_mode_set(struct drm_encoder *drm_enc,
 	struct sde_encoder_virt *sde_enc;
 	struct sde_kms *sde_kms;
 	struct drm_connector *conn;
+	struct drm_crtc_state *crtc_state;
+	struct sde_crtc_state *sde_crtc_state;
 	struct sde_connector_state *c_state;
 	struct msm_display_mode *msm_mode;
 	struct sde_crtc *sde_crtc;
@@ -2669,6 +2672,16 @@ static void sde_encoder_virt_mode_set(struct drm_encoder *drm_enc,
 	if (ret)
 		return;
 
+	crtc_state = sde_crtc->base.state;
+	sde_crtc_state = to_sde_crtc_state(crtc_state);
+	if ((sde_enc->disp_info.intf_type == DRM_MODE_CONNECTOR_VIRTUAL) &&
+			((sde_crtc_state->cached_cwb_enc_mask & drm_encoder_mask(drm_enc)))) {
+		SDE_EVT32(DRMID(drm_enc), sde_crtc_state->cwb_enc_mask,
+				sde_crtc_state->cached_cwb_enc_mask);
+		sde_crtc_state->cwb_enc_mask = sde_crtc_state->cached_cwb_enc_mask;
+		sde_encoder_set_clone_mode(drm_enc, crtc_state);
+	}
+
 	/* reserve dynamic resources now, indicating non test-only */
 	ret = sde_rm_reserve(&sde_kms->rm, drm_enc, drm_enc->crtc->state, conn->state, false);
 	if (ret) {