[Freedreno] [DPU PATCH 3/6] drm/msm: remove panel autorefresh support for SDM845
Sean Paul
seanpaul at chromium.org
Tue Apr 17 20:54:12 UTC 2018
On Mon, Apr 16, 2018 at 11:22:18AM -0700, Jeykumar Sankaran wrote:
> Remove autorefresh support for smart panels in SDM845 for now.
> It needs more discussion to figure out the user space
> communication to set preference for the feature.
>
> 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 | 7 -
> drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c | 37 +--
> drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys.h | 20 --
> .../gpu/drm/msm/disp/dpu1/dpu_encoder_phys_cmd.c | 298 +--------------------
> drivers/gpu/drm/msm/disp/dpu1/dpu_hw_pingpong.c | 41 ---
> drivers/gpu/drm/msm/disp/dpu1/dpu_hw_pingpong.h | 18 --
> 6 files changed, 11 insertions(+), 410 deletions(-)
>
> diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_connector.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_connector.c
> index f7e9f76..dc0978d 100644
> --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_connector.c
> +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_connector.c
> @@ -24,9 +24,6 @@
>
> #define BL_NODE_NAME_SIZE 32
>
> -/* Autorefresh will occur after FRAME_CNT frames. Large values are unlikely */
> -#define AUTOREFRESH_MAX_FRAME_CNT 6
> -
> #define DPU_DEBUG_CONN(c, fmt, ...) DPU_DEBUG("conn%d " fmt,\
> (c) ? (c)->base.base.id : -1, ##__VA_ARGS__)
>
> @@ -1126,10 +1123,6 @@ struct drm_connector *dpu_connector_init(struct drm_device *dev,
> CONNECTOR_PROP_AD_BL_SCALE);
> #endif
>
> - msm_property_install_range(&c_conn->property_info, "autorefresh",
> - 0x0, 0, AUTOREFRESH_MAX_FRAME_CNT, 0,
> - CONNECTOR_PROP_AUTOREFRESH);
> -
> /* enum/bitmask properties */
> msm_property_install_enum(&c_conn->property_info, "topology_name",
> DRM_MODE_PROP_IMMUTABLE, 0, e_topology_name,
> diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c
> index 32375b1..3004569 100644
> --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c
> +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c
> @@ -815,7 +815,6 @@ static void _dpu_encoder_resource_control_helper(struct drm_encoder *drm_enc,
> static int dpu_encoder_resource_control(struct drm_encoder *drm_enc,
> u32 sw_event)
> {
> - bool autorefresh_enabled = false;
> unsigned int lp, idle_timeout;
> struct dpu_encoder_virt *dpu_enc;
> struct msm_drm_private *priv;
> @@ -922,13 +921,6 @@ static int dpu_encoder_resource_control(struct drm_encoder *drm_enc,
> return 0;
> }
>
> - /* schedule delayed off work if autorefresh is disabled */
> - if (dpu_enc->cur_master &&
> - dpu_enc->cur_master->ops.is_autorefresh_enabled)
> - autorefresh_enabled =
> - dpu_enc->cur_master->ops.is_autorefresh_enabled(
> - dpu_enc->cur_master);
> -
> /* set idle timeout based on master connector's lp value */
> if (dpu_enc->cur_master)
> lp = dpu_connector_get_lp(
> @@ -941,13 +933,12 @@ static int dpu_encoder_resource_control(struct drm_encoder *drm_enc,
> else
> idle_timeout = dpu_enc->idle_timeout;
>
> - if (!autorefresh_enabled)
> - kthread_queue_delayed_work(
> - &disp_thread->worker,
> - &dpu_enc->delayed_off_work,
> - msecs_to_jiffies(idle_timeout));
> + kthread_queue_delayed_work(
> + &disp_thread->worker,
> + &dpu_enc->delayed_off_work,
> + msecs_to_jiffies(idle_timeout));
> +
> DPU_EVT32(DRMID(drm_enc), sw_event, dpu_enc->rc_state,
> - autorefresh_enabled,
> idle_timeout, DPU_EVTLOG_FUNC_CASE2);
> DPU_DEBUG_ENC(dpu_enc, "sw_event:%d, work scheduled\n",
> sw_event);
> @@ -1990,7 +1981,6 @@ static void dpu_encoder_vsync_event_handler(struct timer_list *t)
> struct drm_encoder *drm_enc = &dpu_enc->base;
> struct msm_drm_private *priv;
> struct msm_drm_thread *event_thread;
> - bool autorefresh_enabled = false;
>
> if (!drm_enc->dev || !drm_enc->dev->dev_private ||
> !drm_enc->crtc) {
> @@ -2011,22 +2001,7 @@ static void dpu_encoder_vsync_event_handler(struct timer_list *t)
> return;
> }
>
> - if (dpu_enc->cur_master &&
> - dpu_enc->cur_master->ops.is_autorefresh_enabled)
> - autorefresh_enabled =
> - dpu_enc->cur_master->ops.is_autorefresh_enabled(
> - dpu_enc->cur_master);
> -
> - /*
> - * Queue work to update the vsync event timer
> - * if autorefresh is enabled.
> - */
> - DPU_EVT32_VERBOSE(autorefresh_enabled);
> - if (autorefresh_enabled)
> - kthread_queue_work(&event_thread->worker,
> - &dpu_enc->vsync_event_work);
> - else
> - del_timer(&dpu_enc->vsync_event_timer);
> + del_timer(&dpu_enc->vsync_event_timer);
> }
>
> static void dpu_encoder_vsync_event_work_handler(struct kthread_work *work)
> 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 69ec2b6..d3bfc99 100644
> --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys.h
> +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys.h
> @@ -124,8 +124,6 @@ struct dpu_encoder_virt_ops {
> * @prepare_idle_pc: phys encoder can update the vsync_enable status
> * on idle power collapse prepare
> * @restore: Restore all the encoder configs.
> - * @is_autorefresh_enabled: provides the autorefresh current
> - * enable/disable state.
> * @get_line_count: Obtain current vertical line count
> */
>
> @@ -166,7 +164,6 @@ struct dpu_encoder_phys_ops {
> void (*irq_control)(struct dpu_encoder_phys *phys, bool enable);
> 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);
> int (*get_line_count)(struct dpu_encoder_phys *phys);
> };
>
> @@ -176,8 +173,6 @@ struct dpu_encoder_phys_ops {
> * @INTR_IDX_PINGPONG: Pingpong done unterrupt for cmd mode panel
> * @INTR_IDX_UNDERRUN: Underrun unterrupt for video and cmd mode panel
> * @INTR_IDX_RDPTR: Readpointer done unterrupt for cmd mode panel
> - * @INTR_IDX_AUTOREFRESH_DONE: Autorefresh done for cmd mode panel meaning
> - * autorefresh has triggered a double buffer flip
> */
> enum dpu_intr_idx {
> INTR_IDX_VSYNC,
> @@ -185,7 +180,6 @@ enum dpu_intr_idx {
> INTR_IDX_UNDERRUN,
> INTR_IDX_CTL_START,
> INTR_IDX_RDPTR,
> - INTR_IDX_AUTOREFRESH_DONE,
> INTR_IDX_MAX,
> };
>
> @@ -287,18 +281,6 @@ struct dpu_encoder_phys_vid {
> };
>
> /**
> - * struct dpu_encoder_phys_cmd_autorefresh - autorefresh state tracking
> - * @cfg: current active autorefresh configuration
> - * @kickoff_cnt: atomic count tracking autorefresh done irq kickoffs pending
> - * @kickoff_wq: wait queue for waiting on autorefresh done irq
> - */
> -struct dpu_encoder_phys_cmd_autorefresh {
> - struct dpu_hw_autorefresh cfg;
> - atomic_t kickoff_cnt;
> - wait_queue_head_t kickoff_wq;
> -};
> -
> -/**
> * struct dpu_encoder_phys_cmd - sub-class of dpu_encoder_phys to handle command
> * mode specific operations
> * @base: Baseclass physical encoder structure
> @@ -307,7 +289,6 @@ struct dpu_encoder_phys_cmd_autorefresh {
> * @serialize_wait4pp: serialize wait4pp feature waits for pp_done interrupt
> * after ctl_start instead of before next frame kickoff
> * @pp_timeout_report_cnt: number of pingpong done irq timeout errors
> - * @autorefresh: autorefresh feature state
> * @pending_vblank_cnt: Atomic counter tracking pending wait for VBLANK
> * @pending_vblank_wq: Wait queue for blocking until VBLANK received
> */
> @@ -316,7 +297,6 @@ struct dpu_encoder_phys_cmd {
> int stream_sel;
> bool serialize_wait4pp;
> int pp_timeout_report_cnt;
> - struct dpu_encoder_phys_cmd_autorefresh autorefresh;
> atomic_t pending_vblank_cnt;
> wait_queue_head_t pending_vblank_wq;
> };
> 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 3436788..072939c 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
> @@ -47,9 +47,7 @@
> static inline int _dpu_encoder_phys_cmd_get_idle_timeout(
> struct dpu_encoder_phys_cmd *cmd_enc)
> {
> - return cmd_enc->autorefresh.cfg.frame_count ?
> - cmd_enc->autorefresh.cfg.frame_count *
> - KICKOFF_TIMEOUT_MS : KICKOFF_TIMEOUT_MS;
> + return KICKOFF_TIMEOUT_MS;
> }
>
> static inline bool dpu_encoder_phys_cmd_is_master(
> @@ -68,52 +66,6 @@ static bool dpu_encoder_phys_cmd_mode_fixup(
> return true;
> }
>
> -static uint64_t _dpu_encoder_phys_cmd_get_autorefresh_property(
> - struct dpu_encoder_phys *phys_enc)
> -{
> - struct drm_connector *conn = phys_enc->connector;
> -
> - if (!conn || !conn->state)
> - return 0;
> -
> - return dpu_connector_get_property(conn->state,
> - CONNECTOR_PROP_AUTOREFRESH);
> -}
> -
> -static void _dpu_encoder_phys_cmd_config_autorefresh(
> - struct dpu_encoder_phys *phys_enc,
> - u32 new_frame_count)
> -{
> - struct dpu_encoder_phys_cmd *cmd_enc =
> - to_dpu_encoder_phys_cmd(phys_enc);
> - struct dpu_hw_pingpong *hw_pp = phys_enc->hw_pp;
> - struct drm_connector *conn = phys_enc->connector;
> - struct dpu_hw_autorefresh *cfg_cur, cfg_nxt;
> -
> - if (!conn || !conn->state || !hw_pp)
> - return;
> -
> - cfg_cur = &cmd_enc->autorefresh.cfg;
> -
> - /* autorefresh property value should be validated already */
> - memset(&cfg_nxt, 0, sizeof(cfg_nxt));
> - cfg_nxt.frame_count = new_frame_count;
> - cfg_nxt.enable = (cfg_nxt.frame_count != 0);
> -
> - DPU_DEBUG_CMDENC(cmd_enc, "autorefresh state %d->%d framecount %d\n",
> - cfg_cur->enable, cfg_nxt.enable, cfg_nxt.frame_count);
> - DPU_EVT32(DRMID(phys_enc->parent), hw_pp->idx, cfg_cur->enable,
> - cfg_nxt.enable, cfg_nxt.frame_count);
> -
> - /* only proceed on state changes */
> - if (cfg_nxt.enable == cfg_cur->enable)
> - return;
> -
> - memcpy(cfg_cur, &cfg_nxt, sizeof(*cfg_cur));
> - if (hw_pp->ops.setup_autorefresh)
> - hw_pp->ops.setup_autorefresh(hw_pp, cfg_cur);
> -}
> -
> static void _dpu_encoder_phys_cmd_update_intf_cfg(
> struct dpu_encoder_phys *phys_enc)
> {
> @@ -164,29 +116,6 @@ static void dpu_encoder_phys_cmd_pp_tx_done_irq(void *arg, int irq_idx)
> DPU_ATRACE_END("pp_done_irq");
> }
>
> -static void dpu_encoder_phys_cmd_autorefresh_done_irq(void *arg, int irq_idx)
> -{
> - struct dpu_encoder_phys *phys_enc = arg;
> - struct dpu_encoder_phys_cmd *cmd_enc =
> - to_dpu_encoder_phys_cmd(phys_enc);
> - unsigned long lock_flags;
> - int new_cnt;
> -
> - if (!cmd_enc)
> - return;
> -
> - phys_enc = &cmd_enc->base;
> - spin_lock_irqsave(phys_enc->enc_spinlock, lock_flags);
> - new_cnt = atomic_add_unless(&cmd_enc->autorefresh.kickoff_cnt, -1, 0);
> - spin_unlock_irqrestore(phys_enc->enc_spinlock, lock_flags);
> -
> - DPU_EVT32_IRQ(DRMID(phys_enc->parent),
> - phys_enc->hw_pp->idx - PINGPONG_0, new_cnt);
> -
> - /* Signal any waiting atomic commit thread */
> - wake_up_all(&cmd_enc->autorefresh.kickoff_wq);
> -}
> -
> static void dpu_encoder_phys_cmd_pp_rd_ptr_irq(void *arg, int irq_idx)
> {
> struct dpu_encoder_phys *phys_enc = arg;
> @@ -257,10 +186,6 @@ static void _dpu_encoder_phys_cmd_setup_irq_hw_idx(
> irq = &phys_enc->irq[INTR_IDX_UNDERRUN];
> irq->hw_idx = phys_enc->intf_idx;
> irq->irq_idx = -EINVAL;
> -
> - irq = &phys_enc->irq[INTR_IDX_AUTOREFRESH_DONE];
> - irq->hw_idx = phys_enc->hw_pp->idx;
> - irq->irq_idx = -EINVAL;
> }
>
> static void dpu_encoder_phys_cmd_mode_set(
> @@ -352,73 +277,6 @@ static int _dpu_encoder_phys_cmd_handle_ppdone_timeout(
> return -ETIMEDOUT;
> }
>
> -static int _dpu_encoder_phys_cmd_poll_write_pointer_started(
> - struct dpu_encoder_phys *phys_enc)
> -{
> - struct dpu_encoder_phys_cmd *cmd_enc =
> - to_dpu_encoder_phys_cmd(phys_enc);
> - struct dpu_hw_pingpong *hw_pp = phys_enc->hw_pp;
> - struct dpu_hw_pp_vsync_info info;
> - u32 timeout_us = DPU_ENC_WR_PTR_START_TIMEOUT_US;
> - int ret;
> -
> - if (!hw_pp || !hw_pp->ops.get_vsync_info ||
> - !hw_pp->ops.poll_timeout_wr_ptr)
> - return 0;
> -
> - ret = hw_pp->ops.get_vsync_info(hw_pp, &info);
> - if (ret)
> - return ret;
> -
> - DPU_DEBUG_CMDENC(cmd_enc,
> - "pp:%d rd_ptr %d wr_ptr %d\n",
> - phys_enc->hw_pp->idx - PINGPONG_0,
> - info.rd_ptr_line_count,
> - info.wr_ptr_line_count);
> - DPU_EVT32_VERBOSE(DRMID(phys_enc->parent),
> - phys_enc->hw_pp->idx - PINGPONG_0,
> - info.wr_ptr_line_count);
> -
> - ret = hw_pp->ops.poll_timeout_wr_ptr(hw_pp, timeout_us);
> - if (ret) {
> - DPU_EVT32(DRMID(phys_enc->parent),
> - phys_enc->hw_pp->idx - PINGPONG_0,
> - timeout_us,
> - ret);
> - DPU_DBG_DUMP("all", "dbg_bus", "vbif_dbg_bus", "panic");
> - }
> -
> - return ret;
> -}
> -
> -static bool _dpu_encoder_phys_cmd_is_ongoing_pptx(
> - struct dpu_encoder_phys *phys_enc)
> -{
> - struct dpu_hw_pingpong *hw_pp;
> - struct dpu_hw_pp_vsync_info info;
> -
> - if (!phys_enc)
> - return false;
> -
> - hw_pp = phys_enc->hw_pp;
> - if (!hw_pp || !hw_pp->ops.get_vsync_info)
> - return false;
> -
> - hw_pp->ops.get_vsync_info(hw_pp, &info);
> -
> - DPU_EVT32(DRMID(phys_enc->parent),
> - phys_enc->hw_pp->idx - PINGPONG_0,
> - atomic_read(&phys_enc->pending_kickoff_cnt),
> - info.wr_ptr_line_count,
> - phys_enc->cached_mode.vdisplay);
> -
> - if (info.wr_ptr_line_count > 0 && info.wr_ptr_line_count <
> - phys_enc->cached_mode.vdisplay)
> - return true;
> -
> - return false;
> -}
> -
> static int _dpu_encoder_phys_cmd_wait_for_idle(
> struct dpu_encoder_phys *phys_enc)
> {
> @@ -446,42 +304,6 @@ static int _dpu_encoder_phys_cmd_wait_for_idle(
> return ret;
> }
>
> -static int _dpu_encoder_phys_cmd_wait_for_autorefresh_done(
> - struct dpu_encoder_phys *phys_enc)
> -{
> - struct dpu_encoder_phys_cmd *cmd_enc =
> - to_dpu_encoder_phys_cmd(phys_enc);
> - struct dpu_encoder_wait_info wait_info;
> - int ret = 0;
> -
> - if (!phys_enc) {
> - DPU_ERROR("invalid encoder\n");
> - return -EINVAL;
> - }
> -
> - /* only master deals with autorefresh */
> - if (!dpu_encoder_phys_cmd_is_master(phys_enc))
> - return 0;
> -
> - wait_info.wq = &cmd_enc->autorefresh.kickoff_wq;
> - wait_info.atomic_cnt = &cmd_enc->autorefresh.kickoff_cnt;
> - wait_info.timeout_ms = _dpu_encoder_phys_cmd_get_idle_timeout(cmd_enc);
> -
> - /* wait for autorefresh kickoff to start */
> - ret = dpu_encoder_helper_wait_for_irq(phys_enc,
> - INTR_IDX_AUTOREFRESH_DONE, &wait_info);
> -
> - /* double check that kickoff has started by reading write ptr reg */
> - if (!ret)
> - ret = _dpu_encoder_phys_cmd_poll_write_pointer_started(
> - phys_enc);
> - else
> - dpu_encoder_helper_report_irq_timeout(phys_enc,
> - INTR_IDX_AUTOREFRESH_DONE);
> -
> - return ret;
> -}
> -
> static int dpu_encoder_phys_cmd_control_vblank_irq(
> struct dpu_encoder_phys *phys_enc,
> bool enable)
> @@ -550,20 +372,13 @@ void dpu_encoder_phys_cmd_irq_control(struct dpu_encoder_phys *phys_enc,
> dpu_encoder_helper_register_irq(phys_enc, INTR_IDX_UNDERRUN);
> dpu_encoder_phys_cmd_control_vblank_irq(phys_enc, true);
>
> - if (dpu_encoder_phys_cmd_is_master(phys_enc)) {
> + if (dpu_encoder_phys_cmd_is_master(phys_enc))
> dpu_encoder_helper_register_irq(phys_enc,
> INTR_IDX_CTL_START);
> - dpu_encoder_helper_register_irq(phys_enc,
> - INTR_IDX_AUTOREFRESH_DONE);
> - }
> -
> } else {
> - if (dpu_encoder_phys_cmd_is_master(phys_enc)) {
> + if (dpu_encoder_phys_cmd_is_master(phys_enc))
> dpu_encoder_helper_unregister_irq(phys_enc,
> INTR_IDX_CTL_START);
> - dpu_encoder_helper_unregister_irq(phys_enc,
> - INTR_IDX_AUTOREFRESH_DONE);
> - }
>
> dpu_encoder_helper_unregister_irq(phys_enc, INTR_IDX_UNDERRUN);
> dpu_encoder_phys_cmd_control_vblank_irq(phys_enc, false);
> @@ -736,30 +551,6 @@ static void dpu_encoder_phys_cmd_enable(struct dpu_encoder_phys *phys_enc)
> phys_enc->enable_state = DPU_ENC_ENABLED;
> }
>
> -static bool dpu_encoder_phys_cmd_is_autorefresh_enabled(
> - struct dpu_encoder_phys *phys_enc)
> -{
> - struct dpu_hw_pingpong *hw_pp;
> - struct dpu_hw_autorefresh cfg;
> - int ret;
> -
> - if (!phys_enc || !phys_enc->hw_pp)
> - return 0;
> -
> - if (!dpu_encoder_phys_cmd_is_master(phys_enc))
> - return 0;
> -
> - hw_pp = phys_enc->hw_pp;
> - if (!hw_pp->ops.get_autorefresh)
> - return 0;
> -
> - ret = hw_pp->ops.get_autorefresh(hw_pp, &cfg);
> - if (ret)
> - return 0;
> -
> - return cfg.enable;
> -}
> -
> static void _dpu_encoder_phys_cmd_connect_te(
> struct dpu_encoder_phys *phys_enc, bool enable)
> {
> @@ -869,8 +660,7 @@ static void dpu_encoder_phys_cmd_prepare_for_kickoff(
> DPU_DEBUG_CMDENC(cmd_enc, "pp %d\n", phys_enc->hw_pp->idx - PINGPONG_0);
>
> DPU_EVT32(DRMID(phys_enc->parent), phys_enc->hw_pp->idx - PINGPONG_0,
> - atomic_read(&phys_enc->pending_kickoff_cnt),
> - atomic_read(&cmd_enc->autorefresh.kickoff_cnt));
> + atomic_read(&phys_enc->pending_kickoff_cnt));
>
> /*
> * Mark kickoff request as outstanding. If there are more than one,
> @@ -954,10 +744,6 @@ static int dpu_encoder_phys_cmd_wait_for_commit_done(
> if (dpu_encoder_phys_cmd_is_master(phys_enc))
> rc = _dpu_encoder_phys_cmd_wait_for_ctl_start(phys_enc);
>
> - if (!rc && dpu_encoder_phys_cmd_is_master(phys_enc) &&
> - cmd_enc->autorefresh.cfg.enable)
> - rc = _dpu_encoder_phys_cmd_wait_for_autorefresh_done(phys_enc);
> -
> /* required for both controllers */
> if (!rc && cmd_enc->serialize_wait4pp)
> dpu_encoder_phys_cmd_prepare_for_kickoff(phys_enc, NULL);
> @@ -993,58 +779,6 @@ static int dpu_encoder_phys_cmd_wait_for_vblank(
> return rc;
> }
>
> -static void dpu_encoder_phys_cmd_prepare_commit(
> - struct dpu_encoder_phys *phys_enc)
> -{
> - struct dpu_encoder_phys_cmd *cmd_enc =
> - to_dpu_encoder_phys_cmd(phys_enc);
> - unsigned long lock_flags;
> -
> - if (!phys_enc)
> - return;
> -
> - if (!dpu_encoder_phys_cmd_is_master(phys_enc))
> - return;
> -
> - DPU_EVT32(DRMID(phys_enc->parent), phys_enc->intf_idx - INTF_0,
> - cmd_enc->autorefresh.cfg.enable);
> -
> - if (!dpu_encoder_phys_cmd_is_autorefresh_enabled(phys_enc))
> - return;
> -
> - /**
> - * Autorefresh must be disabled carefully:
> - * - Autorefresh must be disabled between pp_done and te
> - * signal prior to sdm845 targets. All targets after sdm845
> - * supports autorefresh disable without turning off the
> - * hardware TE and pp_done wait.
> - *
> - * - Wait for TX to Complete
> - * Wait for PPDone confirms the last frame transfer is complete.
> - *
> - * - Leave Autorefresh Disabled
> - * - Assume disable of Autorefresh since it is now safe
> - * - Can now safely Disable Encoder, do debug printing, etc.
> - * without worrying that Autorefresh will kickoff
> - */
> -
> - spin_lock_irqsave(phys_enc->enc_spinlock, lock_flags);
> -
> - _dpu_encoder_phys_cmd_config_autorefresh(phys_enc, 0);
> -
> - /* check for outstanding TX */
> - if (_dpu_encoder_phys_cmd_is_ongoing_pptx(phys_enc))
> - atomic_add_unless(&phys_enc->pending_kickoff_cnt, 1, 1);
> - spin_unlock_irqrestore(phys_enc->enc_spinlock, lock_flags);
> -
> - /* wait for ppdone if necessary due to catching ongoing TX */
> - if (_dpu_encoder_phys_cmd_wait_for_idle(phys_enc))
> - DPU_ERROR_CMDENC(cmd_enc, "pp:%d kickoff timed out\n",
> - phys_enc->hw_pp->idx - PINGPONG_0);
> -
> - DPU_DEBUG_CMDENC(cmd_enc, "disabled autorefresh\n");
> -}
> -
> static void dpu_encoder_phys_cmd_handle_post_kickoff(
> struct dpu_encoder_phys *phys_enc)
> {
> @@ -1061,27 +795,15 @@ static void dpu_encoder_phys_cmd_handle_post_kickoff(
> static void dpu_encoder_phys_cmd_trigger_start(
> struct dpu_encoder_phys *phys_enc)
> {
> - struct dpu_encoder_phys_cmd *cmd_enc =
> - to_dpu_encoder_phys_cmd(phys_enc);
> - u32 frame_cnt;
> -
> if (!phys_enc)
> return;
>
> - /* we don't issue CTL_START when using autorefresh */
> - frame_cnt = _dpu_encoder_phys_cmd_get_autorefresh_property(phys_enc);
> - if (frame_cnt) {
> - _dpu_encoder_phys_cmd_config_autorefresh(phys_enc, frame_cnt);
> - atomic_inc(&cmd_enc->autorefresh.kickoff_cnt);
> - } else {
> - dpu_encoder_helper_trigger_start(phys_enc);
> - }
> + dpu_encoder_helper_trigger_start(phys_enc);
> }
>
> static void dpu_encoder_phys_cmd_init_ops(
> struct dpu_encoder_phys_ops *ops)
> {
> - ops->prepare_commit = dpu_encoder_phys_cmd_prepare_commit;
> ops->is_master = dpu_encoder_phys_cmd_is_master;
> ops->mode_set = dpu_encoder_phys_cmd_mode_set;
> ops->mode_fixup = dpu_encoder_phys_cmd_mode_fixup;
> @@ -1100,8 +822,6 @@ static void dpu_encoder_phys_cmd_init_ops(
> ops->irq_control = dpu_encoder_phys_cmd_irq_control;
> ops->restore = dpu_encoder_phys_cmd_enable_helper;
> ops->prepare_idle_pc = dpu_encoder_phys_cmd_prepare_idle_pc;
> - ops->is_autorefresh_enabled =
> - dpu_encoder_phys_cmd_is_autorefresh_enabled;
> ops->handle_post_kickoff = dpu_encoder_phys_cmd_handle_post_kickoff;
> ops->get_line_count = dpu_encoder_phys_cmd_get_line_count;
> }
> @@ -1175,20 +895,12 @@ struct dpu_encoder_phys *dpu_encoder_phys_cmd_init(
> irq->intr_idx = INTR_IDX_UNDERRUN;
> irq->cb.func = dpu_encoder_phys_cmd_underrun_irq;
>
> - irq = &phys_enc->irq[INTR_IDX_AUTOREFRESH_DONE];
> - irq->name = "autorefresh_done";
> - irq->intr_type = DPU_IRQ_TYPE_PING_PONG_AUTO_REF;
> - irq->intr_idx = INTR_IDX_AUTOREFRESH_DONE;
> - irq->cb.func = dpu_encoder_phys_cmd_autorefresh_done_irq;
> -
> atomic_set(&phys_enc->vblank_refcount, 0);
> atomic_set(&phys_enc->pending_kickoff_cnt, 0);
> atomic_set(&phys_enc->pending_ctlstart_cnt, 0);
> atomic_set(&cmd_enc->pending_vblank_cnt, 0);
> init_waitqueue_head(&phys_enc->pending_kickoff_wq);
> init_waitqueue_head(&cmd_enc->pending_vblank_wq);
> - atomic_set(&cmd_enc->autorefresh.kickoff_cnt, 0);
> - init_waitqueue_head(&cmd_enc->autorefresh.kickoff_wq);
>
> DPU_DEBUG_CMDENC(cmd_enc, "created\n");
>
> diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_pingpong.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_pingpong.c
> index 9308f5c..0bfb511 100644
> --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_pingpong.c
> +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_pingpong.c
> @@ -31,7 +31,6 @@
> #define PP_WR_PTR_IRQ 0x024
> #define PP_OUT_LINE_COUNT 0x028
> #define PP_LINE_COUNT 0x02C
> -#define PP_AUTOREFRESH_CONFIG 0x030
>
> #define PP_FBC_MODE 0x034
> #define PP_FBC_BUDGET_CTL 0x038
> @@ -93,44 +92,6 @@ static int dpu_hw_pp_setup_te_config(struct dpu_hw_pingpong *pp,
> return 0;
> }
>
> -static int dpu_hw_pp_setup_autorefresh_config(struct dpu_hw_pingpong *pp,
> - struct dpu_hw_autorefresh *cfg)
> -{
> - struct dpu_hw_blk_reg_map *c;
> - u32 refresh_cfg;
> -
> - if (!pp || !cfg)
> - return -EINVAL;
> - c = &pp->hw;
> -
> - if (cfg->enable)
> - refresh_cfg = BIT(31) | cfg->frame_count;
> - else
> - refresh_cfg = 0;
> -
> - DPU_REG_WRITE(c, PP_AUTOREFRESH_CONFIG, refresh_cfg);
> - DPU_EVT32(pp->idx - PINGPONG_0, refresh_cfg);
> -
> - return 0;
> -}
> -
> -static int dpu_hw_pp_get_autorefresh_config(struct dpu_hw_pingpong *pp,
> - struct dpu_hw_autorefresh *cfg)
> -{
> - struct dpu_hw_blk_reg_map *c;
> - u32 val;
> -
> - if (!pp || !cfg)
> - return -EINVAL;
> -
> - c = &pp->hw;
> - val = DPU_REG_READ(c, PP_AUTOREFRESH_CONFIG);
> - cfg->enable = (val & BIT(31)) >> 31;
> - cfg->frame_count = val & 0xffff;
> -
> - return 0;
> -}
> -
> static int dpu_hw_pp_poll_timeout_wr_ptr(struct dpu_hw_pingpong *pp,
> u32 timeout_us)
> {
> @@ -293,8 +254,6 @@ static void _setup_pingpong_ops(struct dpu_hw_pingpong_ops *ops,
> ops->enable_tearcheck = dpu_hw_pp_enable_te;
> ops->connect_external_te = dpu_hw_pp_connect_external_te;
> ops->get_vsync_info = dpu_hw_pp_get_vsync_info;
> - ops->setup_autorefresh = dpu_hw_pp_setup_autorefresh_config;
> - ops->get_autorefresh = dpu_hw_pp_get_autorefresh_config;
> ops->poll_timeout_wr_ptr = dpu_hw_pp_poll_timeout_wr_ptr;
> ops->get_line_count = dpu_hw_pp_get_line_count;
>
> diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_pingpong.h b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_pingpong.h
> index 93d03cce..7dbfcae 100644
> --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_pingpong.h
> +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_pingpong.h
> @@ -36,11 +36,6 @@ struct dpu_hw_tear_check {
> u8 hw_vsync_mode;
> };
>
> -struct dpu_hw_autorefresh {
> - bool enable;
> - u32 frame_count;
> -};
> -
> struct dpu_hw_pp_vsync_info {
> u32 rd_ptr_init_val; /* value of rd pointer at vsync edge */
> u32 rd_ptr_frame_count; /* num frames sent since enabling interface */
> @@ -55,7 +50,6 @@ struct dpu_hw_pp_vsync_info {
> * @setup_tearcheck : program tear check values
> * @enable_tearcheck : enables tear check
> * @get_vsync_info : retries timing info of the panel
> - * @setup_autorefresh : program auto refresh
> * @setup_dither : function to program the dither hw block
> * @get_line_count: obtain current vertical line counter
> */
> @@ -88,18 +82,6 @@ struct dpu_hw_pingpong_ops {
> struct dpu_hw_pp_vsync_info *info);
>
> /**
> - * configure and enable the autorefresh config
> - */
> - int (*setup_autorefresh)(struct dpu_hw_pingpong *pp,
> - struct dpu_hw_autorefresh *cfg);
> -
> - /**
> - * retrieve autorefresh config from hardware
> - */
> - int (*get_autorefresh)(struct dpu_hw_pingpong *pp,
> - struct dpu_hw_autorefresh *cfg);
> -
> - /**
> * poll until write pointer transmission starts
> * @Return: 0 on success, -ETIMEDOUT on timeout
> */
> --
> 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