[Freedreno] [DPU PATCH 2/6] drm/msm: remove support for ping pong split topology
Sean Paul
seanpaul at chromium.org
Tue Apr 17 20:52:43 UTC 2018
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 <jsanka at codeaurora.org>
Reviewed-by: Sean Paul <seanpaul at 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
More information about the Freedreno
mailing list