On Mon, Apr 16, 2018 at 11:22:17AM -0700, Jeykumar Sankaran wrote: > Ping pong split topology was meant for low end soc's which > doesn't have enough layer mixers to support split panels. > Considering how uncommon the topology is for current chipset's and > also to simply the driver programming, striping off the support > for SDM845. > > Signed-off-by: Jeykumar Sankaran <jsa...@codeaurora.org>
Reviewed-by: Sean Paul <seanp...@chromium.org> > --- > drivers/gpu/drm/msm/disp/dpu1/dpu_connector.c | 2 +- > drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c | 19 --- > drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c | 179 > +-------------------- > drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys.h | 5 - > .../gpu/drm/msm/disp/dpu1/dpu_encoder_phys_cmd.c | 110 +------------ > .../gpu/drm/msm/disp/dpu1/dpu_encoder_phys_vid.c | 21 +-- > drivers/gpu/drm/msm/disp/dpu1/dpu_hw_catalog.c | 5 +- > drivers/gpu/drm/msm/disp/dpu1/dpu_hw_catalog.h | 2 - > drivers/gpu/drm/msm/disp/dpu1/dpu_hw_top.c | 33 ---- > drivers/gpu/drm/msm/disp/dpu1/dpu_hw_top.h | 11 -- > drivers/gpu/drm/msm/disp/dpu1/dpu_hwio.h | 4 - > drivers/gpu/drm/msm/disp/dpu1/dpu_rm.c | 37 +---- > drivers/gpu/drm/msm/disp/dpu1/dpu_rm.h | 2 - > 13 files changed, 15 insertions(+), 415 deletions(-) > > diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_connector.c > b/drivers/gpu/drm/msm/disp/dpu1/dpu_connector.c > index 1237efc..f7e9f76 100644 > --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_connector.c > +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_connector.c > @@ -41,8 +41,8 @@ > {DPU_RM_TOPOLOGY_SINGLEPIPE, "dpu_singlepipe"}, > {DPU_RM_TOPOLOGY_DUALPIPE, "dpu_dualpipe"}, > {DPU_RM_TOPOLOGY_DUALPIPE_3DMERGE, "dpu_dualpipemerge"}, > - {DPU_RM_TOPOLOGY_PPSPLIT, "dpu_ppsplit"}, > }; > + > static const struct drm_prop_enum_list e_topology_control[] = { > {DPU_RM_TOPCTL_RESERVE_LOCK, "reserve_lock"}, > {DPU_RM_TOPCTL_RESERVE_CLEAR, "reserve_clear"}, > diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c > b/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c > index 516458e..8e464fa 100644 > --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c > +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c > @@ -1914,23 +1914,6 @@ static void _dpu_crtc_setup_mixers(struct drm_crtc > *crtc) > mutex_unlock(&dpu_crtc->crtc_lock); > } > > -static void _dpu_crtc_setup_is_ppsplit(struct drm_crtc_state *state) > -{ > - int i; > - struct dpu_crtc_state *cstate; > - > - cstate = to_dpu_crtc_state(state); > - > - cstate->is_ppsplit = false; > - for (i = 0; i < cstate->num_connectors; i++) { > - struct drm_connector *conn = cstate->connectors[i]; > - > - if (dpu_connector_get_topology_name(conn) == > - DPU_RM_TOPOLOGY_PPSPLIT) > - cstate->is_ppsplit = true; > - } > -} > - > static void _dpu_crtc_setup_lm_bounds(struct drm_crtc *crtc, > struct drm_crtc_state *state) > { > @@ -1993,7 +1976,6 @@ static void dpu_crtc_atomic_begin(struct drm_crtc *crtc, > > if (!dpu_crtc->num_mixers) { > _dpu_crtc_setup_mixers(crtc); > - _dpu_crtc_setup_is_ppsplit(crtc->state); > _dpu_crtc_setup_lm_bounds(crtc, crtc->state); > } > > @@ -2901,7 +2883,6 @@ static int dpu_crtc_atomic_check(struct drm_crtc *crtc, > > mixer_width = dpu_crtc_get_mixer_width(dpu_crtc, cstate, mode); > > - _dpu_crtc_setup_is_ppsplit(state); > _dpu_crtc_setup_lm_bounds(crtc, state); > > /* get plane state for all drm planes associated with crtc state */ > diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c > b/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c > index 6f12355..32375b1 100644 > --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c > +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c > @@ -545,7 +545,6 @@ void dpu_encoder_helper_split_config( > struct dpu_encoder_virt *dpu_enc; > struct split_pipe_cfg cfg = { 0 }; > struct dpu_hw_mdp *hw_mdptop; > - enum dpu_rm_topology_name topology; > struct msm_display_info *disp_info; > > if (!phys_enc || !phys_enc->hw_mdptop || !phys_enc->parent) { > @@ -569,8 +568,6 @@ void dpu_encoder_helper_split_config( > if (phys_enc->split_role == ENC_ROLE_SOLO) { > if (hw_mdptop->ops.setup_split_pipe) > hw_mdptop->ops.setup_split_pipe(hw_mdptop, &cfg); > - if (hw_mdptop->ops.setup_pp_split) > - hw_mdptop->ops.setup_pp_split(hw_mdptop, &cfg); > return; > } > > @@ -582,29 +579,11 @@ void dpu_encoder_helper_split_config( > phys_enc->ops.needs_single_flush(phys_enc)) > cfg.split_flush_en = true; > > - topology = dpu_connector_get_topology_name(phys_enc->connector); > - if (topology == DPU_RM_TOPOLOGY_PPSPLIT) > - cfg.pp_split_slave = cfg.intf; > - else > - cfg.pp_split_slave = INTF_MAX; > - > if (phys_enc->split_role == ENC_ROLE_MASTER) { > DPU_DEBUG_ENC(dpu_enc, "enable %d\n", cfg.en); > > if (hw_mdptop->ops.setup_split_pipe) > hw_mdptop->ops.setup_split_pipe(hw_mdptop, &cfg); > - } else if (dpu_enc->hw_pp[0]) { > - /* > - * slave encoder > - * - determine split index from master index, > - * assume master is first pp > - */ > - cfg.pp_split_index = dpu_enc->hw_pp[0]->idx - PINGPONG_0; > - DPU_DEBUG_ENC(dpu_enc, "master using pp%d\n", > - cfg.pp_split_index); > - > - if (hw_mdptop->ops.setup_pp_split) > - hw_mdptop->ops.setup_pp_split(hw_mdptop, &cfg); > } > } > > @@ -1665,14 +1644,6 @@ static inline void _dpu_encoder_trigger_flush(struct > drm_encoder *drm_enc, > return; > } > > - if (phys->split_role == ENC_ROLE_SKIP) { > - DPU_DEBUG_ENC(to_dpu_encoder_virt(phys->parent), > - "skip flush pp%d ctl%d\n", > - phys->hw_pp->idx - PINGPONG_0, > - ctl->idx - CTL_0); > - return; > - } > - > pending_kickoff_cnt = dpu_encoder_phys_inc_pending(phys); > > if (extra_flush_bits && ctl->ops.update_pending_flush) > @@ -1694,8 +1665,6 @@ static inline void _dpu_encoder_trigger_flush(struct > drm_encoder *drm_enc, > */ > static inline void _dpu_encoder_trigger_start(struct dpu_encoder_phys *phys) > { > - struct dpu_hw_ctl *ctl; > - > if (!phys) { > DPU_ERROR("invalid argument(s)\n"); > return; > @@ -1706,14 +1675,6 @@ static inline void _dpu_encoder_trigger_start(struct > dpu_encoder_phys *phys) > return; > } > > - ctl = phys->hw_ctl; > - if (phys->split_role == ENC_ROLE_SKIP) { > - DPU_DEBUG_ENC(to_dpu_encoder_virt(phys->parent), > - "skip start pp%d ctl%d\n", > - phys->hw_pp->idx - PINGPONG_0, > - ctl->idx - CTL_0); > - return; > - } > if (phys->ops.trigger_start && phys->enable_state != DPU_ENC_DISABLED) > phys->ops.trigger_start(phys); > } > @@ -1832,7 +1793,6 @@ static void _dpu_encoder_kickoff_phys(struct > dpu_encoder_virt *dpu_enc) > /* don't perform flush/start operations for slave encoders */ > for (i = 0; i < dpu_enc->num_phys_encs; i++) { > struct dpu_encoder_phys *phys = dpu_enc->phys_encs[i]; > - enum dpu_rm_topology_name topology = DPU_RM_TOPOLOGY_NONE; > > if (!phys || phys->enable_state == DPU_ENC_DISABLED) > continue; > @@ -1841,17 +1801,7 @@ static void _dpu_encoder_kickoff_phys(struct > dpu_encoder_virt *dpu_enc) > if (!ctl) > continue; > > - if (phys->connector) > - topology = dpu_connector_get_topology_name( > - phys->connector); > - > - /* > - * don't wait on ppsplit slaves or skipped encoders because > - * they dont receive irqs > - */ > - if (!(topology == DPU_RM_TOPOLOGY_PPSPLIT && > - phys->split_role == ENC_ROLE_SLAVE) && > - phys->split_role != ENC_ROLE_SKIP) > + if (phys->split_role != ENC_ROLE_SLAVE) > set_bit(i, dpu_enc->frame_busy_mask); > if (phys->hw_ctl->ops.reg_dma_flush) > phys->hw_ctl->ops.reg_dma_flush(phys->hw_ctl); > @@ -1875,126 +1825,6 @@ static void _dpu_encoder_kickoff_phys(struct > dpu_encoder_virt *dpu_enc) > spin_unlock_irqrestore(&dpu_enc->enc_spinlock, lock_flags); > } > > -static void _dpu_encoder_ppsplit_swap_intf_for_right_only_update( > - struct drm_encoder *drm_enc, > - unsigned long *affected_displays, > - int num_active_phys) > -{ > - struct dpu_encoder_virt *dpu_enc; > - struct dpu_encoder_phys *master; > - enum dpu_rm_topology_name topology; > - bool is_right_only; > - > - if (!drm_enc || !affected_displays) > - return; > - > - dpu_enc = to_dpu_encoder_virt(drm_enc); > - master = dpu_enc->cur_master; > - if (!master || !master->connector) > - return; > - > - topology = dpu_connector_get_topology_name(master->connector); > - if (topology != DPU_RM_TOPOLOGY_PPSPLIT) > - return; > - > - /* > - * For pingpong split, the slave pingpong won't generate IRQs. For > - * right-only updates, we can't swap pingpongs, or simply swap the > - * master/slave assignment, we actually have to swap the interfaces > - * so that the master physical encoder will use a pingpong/interface > - * that generates irqs on which to wait. > - */ > - is_right_only = !test_bit(0, affected_displays) && > - test_bit(1, affected_displays); > - > - if (is_right_only && !dpu_enc->intfs_swapped) { > - /* right-only update swap interfaces */ > - swap(dpu_enc->phys_encs[0]->intf_idx, > - dpu_enc->phys_encs[1]->intf_idx); > - dpu_enc->intfs_swapped = true; > - } else if (!is_right_only && dpu_enc->intfs_swapped) { > - /* left-only or full update, swap back */ > - swap(dpu_enc->phys_encs[0]->intf_idx, > - dpu_enc->phys_encs[1]->intf_idx); > - dpu_enc->intfs_swapped = false; > - } > - > - DPU_DEBUG_ENC(dpu_enc, > - "right_only %d swapped %d phys0->intf%d, > phys1->intf%d\n", > - is_right_only, dpu_enc->intfs_swapped, > - dpu_enc->phys_encs[0]->intf_idx - INTF_0, > - dpu_enc->phys_encs[1]->intf_idx - INTF_0); > - DPU_EVT32(DRMID(drm_enc), is_right_only, dpu_enc->intfs_swapped, > - dpu_enc->phys_encs[0]->intf_idx - INTF_0, > - dpu_enc->phys_encs[1]->intf_idx - INTF_0, > - *affected_displays); > - > - /* ppsplit always uses master since ppslave invalid for irqs*/ > - if (num_active_phys == 1) > - *affected_displays = BIT(0); > -} > - > -static void _dpu_encoder_update_master(struct drm_encoder *drm_enc, > - struct dpu_encoder_kickoff_params *params) > -{ > - struct dpu_encoder_virt *dpu_enc; > - struct dpu_encoder_phys *phys; > - int i, num_active_phys; > - bool master_assigned = false; > - > - if (!drm_enc || !params) > - return; > - > - dpu_enc = to_dpu_encoder_virt(drm_enc); > - > - if (dpu_enc->num_phys_encs <= 1) > - return; > - > - /* count bits set */ > - num_active_phys = hweight_long(params->affected_displays); > - > - DPU_DEBUG_ENC(dpu_enc, "affected_displays 0x%lx num_active_phys %d\n", > - params->affected_displays, num_active_phys); > - > - /* for left/right only update, ppsplit master switches interface */ > - _dpu_encoder_ppsplit_swap_intf_for_right_only_update(drm_enc, > - ¶ms->affected_displays, num_active_phys); > - > - for (i = 0; i < dpu_enc->num_phys_encs; i++) { > - enum dpu_enc_split_role prv_role, new_role; > - bool active; > - > - phys = dpu_enc->phys_encs[i]; > - if (!phys || !phys->ops.update_split_role || !phys->hw_pp) > - continue; > - > - active = test_bit(i, ¶ms->affected_displays); > - prv_role = phys->split_role; > - > - if (active && num_active_phys == 1) > - new_role = ENC_ROLE_SOLO; > - else if (active && !master_assigned) > - new_role = ENC_ROLE_MASTER; > - else if (active) > - new_role = ENC_ROLE_SLAVE; > - else > - new_role = ENC_ROLE_SKIP; > - > - phys->ops.update_split_role(phys, new_role); > - if (new_role == ENC_ROLE_SOLO || new_role == ENC_ROLE_MASTER) { > - dpu_enc->cur_master = phys; > - master_assigned = true; > - } > - > - DPU_DEBUG_ENC(dpu_enc, "pp %d role prv %d new %d active %d\n", > - phys->hw_pp->idx - PINGPONG_0, prv_role, > - phys->split_role, active); > - DPU_EVT32(DRMID(drm_enc), params->affected_displays, > - phys->hw_pp->idx - PINGPONG_0, prv_role, > - phys->split_role, active, num_active_phys); > - } > -} > - > bool dpu_encoder_check_mode(struct drm_encoder *drm_enc, u32 mode) > { > struct dpu_encoder_virt *dpu_enc; > @@ -2048,15 +1878,10 @@ static void _dpu_encoder_setup_dither(struct > dpu_encoder_phys *phys) > void *dither_cfg; > int ret = 0; > size_t len = 0; > - enum dpu_rm_topology_name topology; > > if (!phys || !phys->connector || !phys->hw_pp || > !phys->hw_pp->ops.setup_dither) > return; > - topology = dpu_connector_get_topology_name(phys->connector); > - if ((topology == DPU_RM_TOPOLOGY_PPSPLIT) && > - (phys->split_role == ENC_ROLE_SLAVE)) > - return; > > ret = dpu_connector_get_dither_cfg(phys->connector, > phys->connector->state, &dither_cfg, &len); > @@ -2267,8 +2092,6 @@ void dpu_encoder_prepare_for_kickoff(struct drm_encoder > *drm_enc, > } > } > > - _dpu_encoder_update_master(drm_enc, params); > - > if (dpu_enc->cur_master && dpu_enc->cur_master->connector) { > rc = dpu_connector_pre_kickoff(dpu_enc->cur_master->connector); > if (rc) > diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys.h > b/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys.h > index 4e2e6c6..69ec2b6 100644 > --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys.h > +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys.h > @@ -40,13 +40,11 @@ > * @ENC_ROLE_SOLO: This is the one and only panel. This encoder is master. > * @ENC_ROLE_MASTER: This encoder is the master of a split panel config. > * @ENC_ROLE_SLAVE: This encoder is not the master of a split panel config. > - * @ENC_ROLE_SKIP: This encoder is not participating in kickoffs > */ > enum dpu_enc_split_role { > ENC_ROLE_SOLO, > ENC_ROLE_MASTER, > ENC_ROLE_SLAVE, > - ENC_ROLE_SKIP > }; > > /** > @@ -123,7 +121,6 @@ struct dpu_encoder_virt_ops { > * @hw_reset: Issue HW recovery such as CTL reset and > clear > * DPU_ENC_ERR_NEEDS_HW_RESET state > * @irq_control: Handler to enable/disable all the encoder IRQs > - * @update_split_role: Update the split role of the phys enc > * @prepare_idle_pc: phys encoder can update the vsync_enable status > * on idle power collapse prepare > * @restore: Restore all the encoder configs. > @@ -167,8 +164,6 @@ struct dpu_encoder_phys_ops { > u32 (*collect_misr)(struct dpu_encoder_phys *phys_enc); > void (*hw_reset)(struct dpu_encoder_phys *phys_enc); > void (*irq_control)(struct dpu_encoder_phys *phys, bool enable); > - void (*update_split_role)(struct dpu_encoder_phys *phys_enc, > - enum dpu_enc_split_role role); > void (*prepare_idle_pc)(struct dpu_encoder_phys *phys_enc); > void (*restore)(struct dpu_encoder_phys *phys); > bool (*is_autorefresh_enabled)(struct dpu_encoder_phys *phys); > diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys_cmd.c > b/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys_cmd.c > index 71e2e5a..3436788 100644 > --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys_cmd.c > +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys_cmd.c > @@ -114,29 +114,6 @@ static void _dpu_encoder_phys_cmd_config_autorefresh( > hw_pp->ops.setup_autorefresh(hw_pp, cfg_cur); > } > > -static void _dpu_encoder_phys_cmd_update_flush_mask( > - struct dpu_encoder_phys *phys_enc) > -{ > - struct dpu_encoder_phys_cmd *cmd_enc = > - to_dpu_encoder_phys_cmd(phys_enc); > - struct dpu_hw_ctl *ctl; > - u32 flush_mask = 0; > - > - if (!phys_enc) > - return; > - > - ctl = phys_enc->hw_ctl; > - if (!ctl || !ctl->ops.get_bitmask_intf || > - !ctl->ops.update_pending_flush) > - return; > - > - ctl->ops.get_bitmask_intf(ctl, &flush_mask, phys_enc->intf_idx); > - ctl->ops.update_pending_flush(ctl, flush_mask); > - > - DPU_DEBUG_CMDENC(cmd_enc, "update pending flush ctl %d flush_mask %x\n", > - ctl->idx - CTL_0, flush_mask); > -} > - > static void _dpu_encoder_phys_cmd_update_intf_cfg( > struct dpu_encoder_phys *phys_enc) > { > @@ -324,20 +301,6 @@ static void dpu_encoder_phys_cmd_mode_set( > _dpu_encoder_phys_cmd_setup_irq_hw_idx(phys_enc); > } > > -static bool _dpu_encoder_phys_is_ppsplit(struct dpu_encoder_phys *phys_enc) > -{ > - enum dpu_rm_topology_name topology; > - > - if (!phys_enc) > - return false; > - > - topology = dpu_connector_get_topology_name(phys_enc->connector); > - if (topology == DPU_RM_TOPOLOGY_PPSPLIT) > - return true; > - > - return false; > -} > - > static int _dpu_encoder_phys_cmd_handle_ppdone_timeout( > struct dpu_encoder_phys *phys_enc) > { > @@ -389,16 +352,6 @@ static int _dpu_encoder_phys_cmd_handle_ppdone_timeout( > return -ETIMEDOUT; > } > > -static bool _dpu_encoder_phys_is_ppsplit_slave( > - struct dpu_encoder_phys *phys_enc) > -{ > - if (!phys_enc) > - return false; > - > - return _dpu_encoder_phys_is_ppsplit(phys_enc) && > - phys_enc->split_role == ENC_ROLE_SLAVE; > -} > - > static int _dpu_encoder_phys_cmd_poll_write_pointer_started( > struct dpu_encoder_phys *phys_enc) > { > @@ -483,10 +436,6 @@ static int _dpu_encoder_phys_cmd_wait_for_idle( > wait_info.atomic_cnt = &phys_enc->pending_kickoff_cnt; > wait_info.timeout_ms = KICKOFF_TIMEOUT_MS; > > - /* slave encoder doesn't enable for ppsplit */ > - if (_dpu_encoder_phys_is_ppsplit_slave(phys_enc)) > - return 0; > - > ret = dpu_encoder_helper_wait_for_irq(phys_enc, INTR_IDX_PINGPONG, > &wait_info); > if (ret == -ETIMEDOUT) > @@ -588,7 +537,7 @@ void dpu_encoder_phys_cmd_irq_control(struct > dpu_encoder_phys *phys_enc, > { > struct dpu_encoder_phys_cmd *cmd_enc; > > - if (!phys_enc || _dpu_encoder_phys_is_ppsplit_slave(phys_enc)) > + if (!phys_enc) > return; > > cmd_enc = to_dpu_encoder_phys_cmd(phys_enc); > @@ -726,18 +675,18 @@ static void _dpu_encoder_phys_cmd_pingpong_config( > phys_enc->hw_pp->idx - PINGPONG_0); > drm_mode_debug_printmodeline(&phys_enc->cached_mode); > > - if (!_dpu_encoder_phys_is_ppsplit_slave(phys_enc)) > - _dpu_encoder_phys_cmd_update_intf_cfg(phys_enc); > + _dpu_encoder_phys_cmd_update_intf_cfg(phys_enc); > dpu_encoder_phys_cmd_tearcheck_config(phys_enc); > } > > static bool dpu_encoder_phys_cmd_needs_single_flush( > struct dpu_encoder_phys *phys_enc) > { > - if (!phys_enc) > - return false; > - > - return _dpu_encoder_phys_is_ppsplit(phys_enc); > + /** > + * we do separate flush for each CTL and let > + * CTL_START synchronize them > + */ > + return false; > } > > static void dpu_encoder_phys_cmd_enable_helper( > @@ -755,12 +704,7 @@ static void dpu_encoder_phys_cmd_enable_helper( > > _dpu_encoder_phys_cmd_pingpong_config(phys_enc); > > - /* > - * For pp-split, skip setting the flush bit for the slave intf, since > - * both intfs use same ctl and HW will only flush the master. > - */ > - if (_dpu_encoder_phys_is_ppsplit(phys_enc) && > - !dpu_encoder_phys_cmd_is_master(phys_enc)) > + if (!dpu_encoder_phys_cmd_is_master(phys_enc)) > goto skip_flush; > > ctl = phys_enc->hw_ctl; > @@ -963,10 +907,6 @@ static int _dpu_encoder_phys_cmd_wait_for_ctl_start( > wait_info.atomic_cnt = &phys_enc->pending_ctlstart_cnt; > wait_info.timeout_ms = KICKOFF_TIMEOUT_MS; > > - /* slave encoder doesn't enable for ppsplit */ > - if (_dpu_encoder_phys_is_ppsplit_slave(phys_enc)) > - return 0; > - > ret = dpu_encoder_helper_wait_for_irq(phys_enc, INTR_IDX_CTL_START, > &wait_info); > if (ret == -ETIMEDOUT) { > @@ -1053,39 +993,6 @@ static int dpu_encoder_phys_cmd_wait_for_vblank( > return rc; > } > > -static void dpu_encoder_phys_cmd_update_split_role( > - struct dpu_encoder_phys *phys_enc, > - enum dpu_enc_split_role role) > -{ > - struct dpu_encoder_phys_cmd *cmd_enc; > - enum dpu_enc_split_role old_role; > - bool is_ppsplit; > - > - if (!phys_enc) > - return; > - > - cmd_enc = to_dpu_encoder_phys_cmd(phys_enc); > - old_role = phys_enc->split_role; > - is_ppsplit = _dpu_encoder_phys_is_ppsplit(phys_enc); > - > - phys_enc->split_role = role; > - > - DPU_DEBUG_CMDENC(cmd_enc, "old role %d new role %d\n", > - old_role, role); > - > - /* > - * ppsplit solo needs to reprogram because intf may have swapped without > - * role changing on left-only, right-only back-to-back commits > - */ > - if (!(is_ppsplit && role == ENC_ROLE_SOLO) && > - (role == old_role || role == ENC_ROLE_SKIP)) > - return; > - > - dpu_encoder_helper_split_config(phys_enc, phys_enc->intf_idx); > - _dpu_encoder_phys_cmd_pingpong_config(phys_enc); > - _dpu_encoder_phys_cmd_update_flush_mask(phys_enc); > -} > - > static void dpu_encoder_phys_cmd_prepare_commit( > struct dpu_encoder_phys *phys_enc) > { > @@ -1191,7 +1098,6 @@ static void dpu_encoder_phys_cmd_init_ops( > ops->needs_single_flush = dpu_encoder_phys_cmd_needs_single_flush; > ops->hw_reset = dpu_encoder_helper_hw_reset; > ops->irq_control = dpu_encoder_phys_cmd_irq_control; > - ops->update_split_role = dpu_encoder_phys_cmd_update_split_role; > ops->restore = dpu_encoder_phys_cmd_enable_helper; > ops->prepare_idle_pc = dpu_encoder_phys_cmd_prepare_idle_pc; > ops->is_autorefresh_enabled = > diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys_vid.c > b/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys_vid.c > index d6b72a3..b680718 100644 > --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys_vid.c > +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys_vid.c > @@ -354,20 +354,6 @@ static void dpu_encoder_phys_vid_underrun_irq(void *arg, > int irq_idx) > phys_enc); > } > > -static bool _dpu_encoder_phys_is_ppsplit(struct dpu_encoder_phys *phys_enc) > -{ > - enum dpu_rm_topology_name topology; > - > - if (!phys_enc) > - return false; > - > - topology = dpu_connector_get_topology_name(phys_enc->connector); > - if (topology == DPU_RM_TOPOLOGY_PPSPLIT) > - return true; > - > - return false; > -} > - > static bool _dpu_encoder_phys_is_dual_ctl(struct dpu_encoder_phys *phys_enc) > { > enum dpu_rm_topology_name topology; > @@ -385,8 +371,7 @@ static bool _dpu_encoder_phys_is_dual_ctl(struct > dpu_encoder_phys *phys_enc) > static bool dpu_encoder_phys_vid_needs_single_flush( > struct dpu_encoder_phys *phys_enc) > { > - return phys_enc && (_dpu_encoder_phys_is_ppsplit(phys_enc) || > - _dpu_encoder_phys_is_dual_ctl(phys_enc)); > + return (phys_enc && _dpu_encoder_phys_is_dual_ctl(phys_enc)); > } > > static void _dpu_encoder_phys_vid_setup_irq_hw_idx( > @@ -609,9 +594,7 @@ static int _dpu_encoder_phys_vid_wait_for_vblank( > wait_info.timeout_ms = KICKOFF_TIMEOUT_MS; > > if (!dpu_encoder_phys_vid_is_master(phys_enc)) { > - /* signal done for slave video encoder, unless it is pp-split */ > - if (!_dpu_encoder_phys_is_ppsplit(phys_enc) && > - notify && phys_enc->parent_ops.handle_frame_done) > + if (notify && phys_enc->parent_ops.handle_frame_done) > phys_enc->parent_ops.handle_frame_done( > phys_enc->parent, phys_enc, > DPU_ENCODER_FRAME_EVENT_DONE); > diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_catalog.c > b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_catalog.c > index 14e66ca..8e779c0 100644 > --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_catalog.c > +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_catalog.c > @@ -43,7 +43,7 @@ > #define PINGPONG_SDM845_MASK BIT(DPU_PINGPONG_DITHER) > > #define PINGPONG_SDM845_SPLIT_MASK \ > - (PINGPONG_SDM845_MASK | BIT(DPU_PINGPONG_SPLIT) | BIT(DPU_PINGPONG_TE2)) > + (PINGPONG_SDM845_MASK | BIT(DPU_PINGPONG_TE2)) > > #define WB2_SDM845_MASK \ > (BIT(DPU_WB_LINE_MODE) | BIT(DPU_WB_TRAFFIC_SHAPER) | BIT(DPU_WB_CDP) |\ > @@ -119,8 +119,7 @@ > { > .name = "ctl_0", .id = CTL_0, > .base = 0x2000, .len = 0xE4, > - .features = BIT(DPU_CTL_SPLIT_DISPLAY) | > - BIT(DPU_CTL_PINGPONG_SPLIT) > + .features = BIT(DPU_CTL_SPLIT_DISPLAY) > }, > { > .name = "ctl_1", .id = CTL_1, > diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_catalog.h > b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_catalog.h > index ceff3b7..39bec0a 100644 > --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_catalog.h > +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_catalog.h > @@ -214,12 +214,10 @@ enum { > /** > * CTL sub-blocks > * @DPU_CTL_SPLIT_DISPLAY CTL supports video mode split display > - * @DPU_CTL_PINGPONG_SPLIT CTL supports pingpong split > * @DPU_CTL_MAX > */ > enum { > DPU_CTL_SPLIT_DISPLAY = 0x1, > - DPU_CTL_PINGPONG_SPLIT, > DPU_CTL_MAX > }; > > diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_top.c > b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_top.c > index 60e4bef..8f7f932 100644 > --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_top.c > +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_top.c > @@ -80,11 +80,6 @@ static void dpu_hw_setup_split_pipe(struct dpu_hw_mdp *mdp, > lower_pipe |= FLD_INTF_1_SW_TRG_MUX; > else > lower_pipe |= FLD_INTF_2_SW_TRG_MUX; > - > - /* free run */ > - if (cfg->pp_split_slave != INTF_MAX) > - lower_pipe = FLD_SMART_PANEL_FREE_RUN; > - > upper_pipe = lower_pipe; > } else { > if (cfg->intf == INTF_2) { > @@ -103,33 +98,6 @@ static void dpu_hw_setup_split_pipe(struct dpu_hw_mdp > *mdp, > DPU_REG_WRITE(c, SPLIT_DISPLAY_EN, cfg->en & 0x1); > } > > -static void dpu_hw_setup_pp_split(struct dpu_hw_mdp *mdp, > - struct split_pipe_cfg *cfg) > -{ > - u32 ppb_config = 0x0; > - u32 ppb_control = 0x0; > - > - if (!mdp || !cfg) > - return; > - > - if (cfg->en && cfg->pp_split_slave != INTF_MAX) { > - ppb_config |= (cfg->pp_split_slave - INTF_0 + 1) << 20; > - ppb_config |= BIT(16); /* split enable */ > - ppb_control = BIT(5); /* horz split*/ > - } > - if (cfg->pp_split_index) { > - DPU_REG_WRITE(&mdp->hw, PPB0_CONFIG, 0x0); > - DPU_REG_WRITE(&mdp->hw, PPB0_CNTL, 0x0); > - DPU_REG_WRITE(&mdp->hw, PPB1_CONFIG, ppb_config); > - DPU_REG_WRITE(&mdp->hw, PPB1_CNTL, ppb_control); > - } else { > - DPU_REG_WRITE(&mdp->hw, PPB0_CONFIG, ppb_config); > - DPU_REG_WRITE(&mdp->hw, PPB0_CNTL, ppb_control); > - DPU_REG_WRITE(&mdp->hw, PPB1_CONFIG, 0x0); > - DPU_REG_WRITE(&mdp->hw, PPB1_CNTL, 0x0); > - } > -} > - > static void dpu_hw_setup_cdm_output(struct dpu_hw_mdp *mdp, > struct cdm_output_cfg *cfg) > { > @@ -349,7 +317,6 @@ static void _setup_mdp_ops(struct dpu_hw_mdp_ops *ops, > unsigned long cap) > { > ops->setup_split_pipe = dpu_hw_setup_split_pipe; > - ops->setup_pp_split = dpu_hw_setup_pp_split; > ops->setup_cdm_output = dpu_hw_setup_cdm_output; > ops->setup_clk_force_ctrl = dpu_hw_setup_clk_force_ctrl; > ops->get_danger_status = dpu_hw_get_danger_status; > diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_top.h > b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_top.h > index 1470d0f..5429cd5 100644 > --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_top.h > +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_top.h > @@ -41,8 +41,6 @@ struct traffic_shaper_cfg { > * @en : Enable/disable dual pipe confguration > * @mode : Panel interface mode > * @intf : Interface id for main control path > - * @pp_split_slave: Slave interface for ping pong split, INTF_MAX to disable > - * @pp_split_idx: Ping pong index for ping pong split > * @split_flush_en: Allows both the paths to be flushed when master path is > * flushed > */ > @@ -50,8 +48,6 @@ struct split_pipe_cfg { > bool en; > enum dpu_intf_mode mode; > enum dpu_intf intf; > - enum dpu_intf pp_split_slave; > - u32 pp_split_index; > bool split_flush_en; > }; > > @@ -109,13 +105,6 @@ struct dpu_hw_mdp_ops { > void (*setup_split_pipe)(struct dpu_hw_mdp *mdp, > struct split_pipe_cfg *p); > > - /** setup_pp_split() : Configure pp split related registers > - * @mdp : mdp top context driver > - * @cfg : upper and lower part of pipe configuration > - */ > - void (*setup_pp_split)(struct dpu_hw_mdp *mdp, > - struct split_pipe_cfg *cfg); > - > /** > * setup_cdm_output() : Setup selection control of the cdm data path > * @mdp : mdp top context driver > diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_hwio.h > b/drivers/gpu/drm/msm/disp/dpu1/dpu_hwio.h > index b887082..5b2bc9b 100644 > --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_hwio.h > +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_hwio.h > @@ -36,10 +36,6 @@ > #define DSPP_IGC_COLOR0_RAM_LUTN 0x300 > #define DSPP_IGC_COLOR1_RAM_LUTN 0x304 > #define DSPP_IGC_COLOR2_RAM_LUTN 0x308 > -#define PPB0_CNTL 0x330 > -#define PPB0_CONFIG 0x334 > -#define PPB1_CNTL 0x338 > -#define PPB1_CONFIG 0x33C > #define HW_EVENTS_CTL 0x37C > #define CLK_CTRL3 0x3A8 > #define CLK_STATUS3 0x3AC > diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_rm.c > b/drivers/gpu/drm/msm/disp/dpu1/dpu_rm.c > index 13efbeb..c8c12d3 100644 > --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_rm.c > +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_rm.c > @@ -50,7 +50,6 @@ struct dpu_rm_topology_def { > { DPU_RM_TOPOLOGY_SINGLEPIPE, 1, 0, 1, 1, false }, > { DPU_RM_TOPOLOGY_DUALPIPE, 2, 0, 2, 2, true }, > { DPU_RM_TOPOLOGY_DUALPIPE_3DMERGE, 2, 0, 1, 1, false }, > - { DPU_RM_TOPOLOGY_PPSPLIT, 1, 0, 2, 1, true }, > }; > > /** > @@ -531,7 +530,6 @@ static bool _dpu_rm_check_lm_and_get_connected_blks( > struct dpu_rm_hw_blk *primary_lm) > { > const struct dpu_lm_cfg *lm_cfg = to_dpu_hw_mixer(lm->hw)->cap; > - const struct dpu_pingpong_cfg *pp_cfg; > struct dpu_rm_hw_iter iter; > bool is_valid_dspp, is_valid_ds, ret; > > @@ -650,15 +648,6 @@ static bool _dpu_rm_check_lm_and_get_connected_blks( > return false; > } > > - pp_cfg = to_dpu_hw_pingpong((*pp)->hw)->caps; > - if ((reqs->topology->top_name == DPU_RM_TOPOLOGY_PPSPLIT) && > - !(test_bit(DPU_PINGPONG_SPLIT, &pp_cfg->features))) { > - DPU_DEBUG("pp %d doesn't support ppsplit\n", pp_cfg->id); > - *dspp = NULL; > - *ds = NULL; > - return false; > - } > - > return true; > } > > @@ -742,26 +731,6 @@ static int _dpu_rm_reserve_lms( > ds[i] ? ds[i]->id : 0); > } > > - if (reqs->topology->top_name == DPU_RM_TOPOLOGY_PPSPLIT) { > - /* reserve a free PINGPONG_SLAVE block */ > - rc = -ENAVAIL; > - dpu_rm_init_hw_iter(&iter_i, 0, DPU_HW_BLK_PINGPONG); > - while (_dpu_rm_get_hw_locked(rm, &iter_i)) { > - const struct dpu_hw_pingpong *pp = > - to_dpu_hw_pingpong(iter_i.blk->hw); > - const struct dpu_pingpong_cfg *pp_cfg = pp->caps; > - > - if (!(test_bit(DPU_PINGPONG_SLAVE, &pp_cfg->features))) > - continue; > - if (RESERVED_BY_OTHER(iter_i.blk, rsvp)) > - continue; > - > - iter_i.blk->rsvp_nxt = rsvp; > - rc = 0; > - break; > - } > - } > - > return rc; > } > > @@ -780,22 +749,18 @@ static int _dpu_rm_reserve_ctls( > while (_dpu_rm_get_hw_locked(rm, &iter)) { > const struct dpu_hw_ctl *ctl = to_dpu_hw_ctl(iter.blk->hw); > unsigned long features = ctl->caps->features; > - bool has_split_display, has_ppsplit; > + bool has_split_display; > > if (RESERVED_BY_OTHER(iter.blk, rsvp)) > continue; > > has_split_display = BIT(DPU_CTL_SPLIT_DISPLAY) & features; > - has_ppsplit = BIT(DPU_CTL_PINGPONG_SPLIT) & features; > > DPU_DEBUG("ctl %d caps 0x%lX\n", iter.blk->id, features); > > if (top->needs_split_display != has_split_display) > continue; > > - if (top->top_name == DPU_RM_TOPOLOGY_PPSPLIT && !has_ppsplit) > - continue; > - > ctls[i] = iter.blk; > DPU_DEBUG("ctl %d match\n", iter.blk->id); > > diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_rm.h > b/drivers/gpu/drm/msm/disp/dpu1/dpu_rm.h > index 3db61b5..8a6cbcf 100644 > --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_rm.h > +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_rm.h > @@ -26,14 +26,12 @@ > * @DPU_RM_TOPOLOGY_SINGLEPIPE: 1 LM, 1 PP, 1 INTF/WB > * @DPU_RM_TOPOLOGY_DUALPIPE: 2 LM, 2 PP, 2 INTF/WB > * @DPU_RM_TOPOLOGY_DUALPIPE_3DMERGE: 2 LM, 2 PP, 3DMux, 1 INTF/WB > - * @DPU_RM_TOPOLOGY_PPSPLIT: 1 LM, 2 PPs, 2 INTF/WB > */ > enum dpu_rm_topology_name { > DPU_RM_TOPOLOGY_NONE = 0, > DPU_RM_TOPOLOGY_SINGLEPIPE, > DPU_RM_TOPOLOGY_DUALPIPE, > DPU_RM_TOPOLOGY_DUALPIPE_3DMERGE, > - DPU_RM_TOPOLOGY_PPSPLIT, > DPU_RM_TOPOLOGY_MAX, > }; > > -- > The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum, > a Linux Foundation Collaborative Project > -- Sean Paul, Software Engineer, Google / Chromium OS _______________________________________________ Freedreno mailing list Freedreno@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/freedreno