diff --git a/msm/dsi/dsi_ctrl.c b/msm/dsi/dsi_ctrl.c index 120f15fcd3..4f9034222c 100644 --- a/msm/dsi/dsi_ctrl.c +++ b/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) diff --git a/msm/sde/sde_crtc.h b/msm/sde/sde_crtc.h index 655ee9a8e0..3f463a45b8 100644 --- a/msm/sde/sde_crtc.h +++ b/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; diff --git a/msm/sde/sde_encoder.c b/msm/sde/sde_encoder.c index 6838c5c890..dcea4cd00a 100644 --- a/msm/sde/sde_encoder.c +++ b/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) {