lkml.org 
[lkml]   [2019]   [Aug]   [29]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 03/10] drm/msm/dpu: handle_frame_done() from vblank irq
    Date
    From: Rob Clark <robdclark@chromium.org>

    Previously the callback was called from whoever called wait_for_vblank(),
    but that isn't a great plan when wait_for_vblank() stops getting called,
    and results in frame_done_timer expiring.

    Signed-off-by: Rob Clark <robdclark@chromium.org>
    Reviewed-by: Sean Paul <sean@poorly.run>
    ---
    drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c | 7 +-----
    .../drm/msm/disp/dpu1/dpu_encoder_phys_vid.c | 25 ++++++-------------
    2 files changed, 9 insertions(+), 23 deletions(-)

    diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c
    index c3f7154017c4..e7354aef9805 100644
    --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c
    +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c
    @@ -311,12 +311,7 @@ static void dpu_crtc_frame_event_work(struct kthread_work *work)
    | DPU_ENCODER_FRAME_EVENT_PANEL_DEAD)) {

    if (atomic_read(&dpu_crtc->frame_pending) < 1) {
    - /* this should not happen */
    - DRM_ERROR("crtc%d ev:%u ts:%lld frame_pending:%d\n",
    - crtc->base.id,
    - fevent->event,
    - ktime_to_ns(fevent->ts),
    - atomic_read(&dpu_crtc->frame_pending));
    + /* ignore vblank when not pending */
    } else if (atomic_dec_return(&dpu_crtc->frame_pending) == 0) {
    /* release bandwidth and other resources */
    trace_dpu_crtc_frame_event_done(DRMID(crtc),
    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 7c73b09894f0..b9c84fb4d4a1 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
    @@ -324,6 +324,10 @@ static void dpu_encoder_phys_vid_vblank_irq(void *arg, int irq_idx)

    /* Signal any waiting atomic commit thread */
    wake_up_all(&phys_enc->pending_kickoff_wq);
    +
    + phys_enc->parent_ops->handle_frame_done(phys_enc->parent, phys_enc,
    + DPU_ENCODER_FRAME_EVENT_DONE);
    +
    DPU_ATRACE_END("vblank_irq");
    }

    @@ -483,8 +487,8 @@ static void dpu_encoder_phys_vid_get_hw_resources(
    hw_res->intfs[phys_enc->intf_idx - INTF_0] = INTF_MODE_VIDEO;
    }

    -static int _dpu_encoder_phys_vid_wait_for_vblank(
    - struct dpu_encoder_phys *phys_enc, bool notify)
    +static int dpu_encoder_phys_vid_wait_for_vblank(
    + struct dpu_encoder_phys *phys_enc)
    {
    struct dpu_encoder_wait_info wait_info;
    int ret;
    @@ -499,10 +503,6 @@ 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)) {
    - 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);
    return 0;
    }

    @@ -512,20 +512,11 @@ static int _dpu_encoder_phys_vid_wait_for_vblank(

    if (ret == -ETIMEDOUT) {
    dpu_encoder_helper_report_irq_timeout(phys_enc, INTR_IDX_VSYNC);
    - } else if (!ret && 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);
    + }

    return ret;
    }

    -static int dpu_encoder_phys_vid_wait_for_vblank(
    - struct dpu_encoder_phys *phys_enc)
    -{
    - return _dpu_encoder_phys_vid_wait_for_vblank(phys_enc, true);
    -}
    -
    static int dpu_encoder_phys_vid_wait_for_commit_done(
    struct dpu_encoder_phys *phys_enc)
    {
    @@ -615,7 +606,7 @@ static void dpu_encoder_phys_vid_disable(struct dpu_encoder_phys *phys_enc)
    * scanout buffer) don't latch properly..
    */
    if (dpu_encoder_phys_vid_is_master(phys_enc)) {
    - ret = _dpu_encoder_phys_vid_wait_for_vblank(phys_enc, false);
    + ret = dpu_encoder_phys_vid_wait_for_vblank(phys_enc);
    if (ret) {
    atomic_set(&phys_enc->pending_kickoff_cnt, 0);
    DRM_ERROR("wait disable failed: id:%u intf:%d ret:%d\n",
    --
    2.21.0
    \
     
     \ /
      Last update: 2019-08-29 18:57    [W:3.623 / U:0.016 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site