lkml.org 
[lkml]   [2022]   [Jul]   [11]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v6 01/10] drm/msm/disp/dpu: clear dpu_assign_crtc and get crtc from connector state instead of dpu_enc
    Date
    Update crtc retrieval from dpu_enc to dpu_enc connector state,
    since new links get set as part of the dpu enc virt mode set.
    The dpu_enc->crtc cache is no more needed, hence cleaning it as
    part of this change.

    Signed-off-by: Vinod Polimera <quic_vpolimer@quicinc.com>
    ---
    drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c | 4 ----
    drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c | 30 ++++++++++++++---------------
    drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.h | 8 --------
    3 files changed, 14 insertions(+), 28 deletions(-)

    diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c
    index b56f777..f91e3d1 100644
    --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c
    +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c
    @@ -972,7 +972,6 @@ static void dpu_crtc_disable(struct drm_crtc *crtc,
    */
    if (dpu_encoder_get_intf_mode(encoder) == INTF_MODE_VIDEO)
    release_bandwidth = true;
    - dpu_encoder_assign_crtc(encoder, NULL);
    }

    /* wait for frame_event_done completion */
    @@ -1042,9 +1041,6 @@ static void dpu_crtc_enable(struct drm_crtc *crtc,
    trace_dpu_crtc_enable(DRMID(crtc), true, dpu_crtc);
    dpu_crtc->enabled = true;

    - drm_for_each_encoder_mask(encoder, crtc->dev, crtc->state->encoder_mask)
    - dpu_encoder_assign_crtc(encoder, crtc);
    -
    /* Enable/restore vblank irq handling */
    drm_crtc_vblank_on(crtc);
    }
    diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c
    index 52516eb..0fddc9d 100644
    --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c
    +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c
    @@ -181,7 +181,6 @@ struct dpu_encoder_virt {

    bool intfs_swapped;

    - struct drm_crtc *crtc;
    struct drm_connector *connector;

    struct dentry *debugfs_root;
    @@ -1245,6 +1244,7 @@ static void dpu_encoder_vblank_callback(struct drm_encoder *drm_enc,
    struct dpu_encoder_phys *phy_enc)
    {
    struct dpu_encoder_virt *dpu_enc = NULL;
    + struct drm_crtc *crtc;
    unsigned long lock_flags;

    if (!drm_enc || !phy_enc)
    @@ -1253,9 +1253,14 @@ static void dpu_encoder_vblank_callback(struct drm_encoder *drm_enc,
    DPU_ATRACE_BEGIN("encoder_vblank_callback");
    dpu_enc = to_dpu_encoder_virt(drm_enc);

    + if (!dpu_enc->connector || !dpu_enc->connector->state)
    + return;
    +
    + crtc = dpu_enc->connector->state->crtc;
    +
    spin_lock_irqsave(&dpu_enc->enc_spinlock, lock_flags);
    - if (dpu_enc->crtc)
    - dpu_crtc_vblank_callback(dpu_enc->crtc);
    + if (crtc)
    + dpu_crtc_vblank_callback(crtc);
    spin_unlock_irqrestore(&dpu_enc->enc_spinlock, lock_flags);

    atomic_inc(&phy_enc->vsync_cnt);
    @@ -1280,29 +1285,22 @@ static void dpu_encoder_underrun_callback(struct drm_encoder *drm_enc,
    DPU_ATRACE_END("encoder_underrun_callback");
    }

    -void dpu_encoder_assign_crtc(struct drm_encoder *drm_enc, struct drm_crtc *crtc)
    -{
    - struct dpu_encoder_virt *dpu_enc = to_dpu_encoder_virt(drm_enc);
    - unsigned long lock_flags;
    -
    - spin_lock_irqsave(&dpu_enc->enc_spinlock, lock_flags);
    - /* crtc should always be cleared before re-assigning */
    - WARN_ON(crtc && dpu_enc->crtc);
    - dpu_enc->crtc = crtc;
    - spin_unlock_irqrestore(&dpu_enc->enc_spinlock, lock_flags);
    -}
    -
    void dpu_encoder_toggle_vblank_for_crtc(struct drm_encoder *drm_enc,
    struct drm_crtc *crtc, bool enable)
    {
    struct dpu_encoder_virt *dpu_enc = to_dpu_encoder_virt(drm_enc);
    + struct drm_crtc *new_crtc;
    unsigned long lock_flags;
    int i;

    trace_dpu_enc_vblank_cb(DRMID(drm_enc), enable);

    + if (!dpu_enc->connector || !dpu_enc->connector->state)
    + return;
    +
    + new_crtc = dpu_enc->connector->state->crtc;
    spin_lock_irqsave(&dpu_enc->enc_spinlock, lock_flags);
    - if (dpu_enc->crtc != crtc) {
    + if (!new_crtc || new_crtc != crtc) {
    spin_unlock_irqrestore(&dpu_enc->enc_spinlock, lock_flags);
    return;
    }
    diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.h b/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.h
    index 781d41c..edba815 100644
    --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.h
    +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.h
    @@ -39,14 +39,6 @@ struct msm_display_info {
    };

    /**
    - * dpu_encoder_assign_crtc - Link the encoder to the crtc it's assigned to
    - * @encoder: encoder pointer
    - * @crtc: crtc pointer
    - */
    -void dpu_encoder_assign_crtc(struct drm_encoder *encoder,
    - struct drm_crtc *crtc);
    -
    -/**
    * dpu_encoder_toggle_vblank_for_crtc - Toggles vblank interrupts on or off if
    * the encoder is assigned to the given crtc
    * @encoder: encoder pointer
    --
    2.7.4
    \
     
     \ /
      Last update: 2022-07-11 14:58    [W:4.294 / U:0.460 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site