Loading drivers/gpu/drm/msm/sde/sde_crtc.c +11 −1 Original line number Diff line number Diff line Loading @@ -1408,8 +1408,10 @@ static u32 _sde_crtc_get_displays_affected(struct drm_crtc *crtc, { struct sde_crtc *sde_crtc; struct sde_crtc_state *crtc_state; struct drm_encoder *encoder; u32 disp_bitmask = 0; int i; bool is_ppsplit = false; if (!crtc || !state) { pr_err("Invalid crtc or state\n"); Loading @@ -1419,8 +1421,16 @@ static u32 _sde_crtc_get_displays_affected(struct drm_crtc *crtc, sde_crtc = to_sde_crtc(crtc); crtc_state = to_sde_crtc_state(state); list_for_each_entry(encoder, &crtc->dev->mode_config.encoder_list, head) { if (encoder->crtc != state->crtc) continue; is_ppsplit |= sde_encoder_is_topology_ppsplit(encoder); } /* pingpong split: one ROI, one LM, two physical displays */ if (crtc_state->is_ppsplit) { if (is_ppsplit) { u32 lm_split_width = crtc_state->lm_bounds[0].w / 2; struct sde_rect *roi = &crtc_state->lm_roi[0]; Loading drivers/gpu/drm/msm/sde/sde_encoder.c +18 −0 Original line number Diff line number Diff line Loading @@ -954,6 +954,24 @@ bool sde_encoder_in_clone_mode(struct drm_encoder *drm_enc) return false; } bool sde_encoder_is_topology_ppsplit(struct drm_encoder *drm_enc) { struct sde_encoder_virt *sde_enc; struct sde_encoder_phys *master; if (!drm_enc) return false; sde_enc = to_sde_encoder_virt(drm_enc); master = sde_enc->cur_master; if (!master || !master->connector) return false; return (sde_connector_get_topology_name(master->connector) == SDE_RM_TOPOLOGY_PPSPLIT); } static int sde_encoder_virt_atomic_check( struct drm_encoder *drm_enc, struct drm_crtc_state *crtc_state, Loading drivers/gpu/drm/msm/sde/sde_encoder.h +8 −0 Original line number Diff line number Diff line Loading @@ -312,6 +312,14 @@ void sde_encoder_recovery_events_handler(struct drm_encoder *encoder, */ bool sde_encoder_in_clone_mode(struct drm_encoder *enc); /** *sde_encoder_is_topology_ppsplit - checks if the current encoder is in ppsplit topology. *@drm_enc: Pointer to drm encoder structure *@Return: true if the present topology is ppsplit */ bool sde_encoder_is_topology_ppsplit(struct drm_encoder *drm_enc); /** * sde_encoder_is_primary_display - checks if underlying display is primary * display or not. Loading Loading
drivers/gpu/drm/msm/sde/sde_crtc.c +11 −1 Original line number Diff line number Diff line Loading @@ -1408,8 +1408,10 @@ static u32 _sde_crtc_get_displays_affected(struct drm_crtc *crtc, { struct sde_crtc *sde_crtc; struct sde_crtc_state *crtc_state; struct drm_encoder *encoder; u32 disp_bitmask = 0; int i; bool is_ppsplit = false; if (!crtc || !state) { pr_err("Invalid crtc or state\n"); Loading @@ -1419,8 +1421,16 @@ static u32 _sde_crtc_get_displays_affected(struct drm_crtc *crtc, sde_crtc = to_sde_crtc(crtc); crtc_state = to_sde_crtc_state(state); list_for_each_entry(encoder, &crtc->dev->mode_config.encoder_list, head) { if (encoder->crtc != state->crtc) continue; is_ppsplit |= sde_encoder_is_topology_ppsplit(encoder); } /* pingpong split: one ROI, one LM, two physical displays */ if (crtc_state->is_ppsplit) { if (is_ppsplit) { u32 lm_split_width = crtc_state->lm_bounds[0].w / 2; struct sde_rect *roi = &crtc_state->lm_roi[0]; Loading
drivers/gpu/drm/msm/sde/sde_encoder.c +18 −0 Original line number Diff line number Diff line Loading @@ -954,6 +954,24 @@ bool sde_encoder_in_clone_mode(struct drm_encoder *drm_enc) return false; } bool sde_encoder_is_topology_ppsplit(struct drm_encoder *drm_enc) { struct sde_encoder_virt *sde_enc; struct sde_encoder_phys *master; if (!drm_enc) return false; sde_enc = to_sde_encoder_virt(drm_enc); master = sde_enc->cur_master; if (!master || !master->connector) return false; return (sde_connector_get_topology_name(master->connector) == SDE_RM_TOPOLOGY_PPSPLIT); } static int sde_encoder_virt_atomic_check( struct drm_encoder *drm_enc, struct drm_crtc_state *crtc_state, Loading
drivers/gpu/drm/msm/sde/sde_encoder.h +8 −0 Original line number Diff line number Diff line Loading @@ -312,6 +312,14 @@ void sde_encoder_recovery_events_handler(struct drm_encoder *encoder, */ bool sde_encoder_in_clone_mode(struct drm_encoder *enc); /** *sde_encoder_is_topology_ppsplit - checks if the current encoder is in ppsplit topology. *@drm_enc: Pointer to drm encoder structure *@Return: true if the present topology is ppsplit */ bool sde_encoder_is_topology_ppsplit(struct drm_encoder *drm_enc); /** * sde_encoder_is_primary_display - checks if underlying display is primary * display or not. Loading