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 09/10] drm/msm/disp/dpu: add PSR support for eDP interface in dpu driver
    Date
    Enable PSR on eDP interface using drm self-refresh librabry.
    This patch uses a trigger from self-refresh library to enter/exit
    into PSR, when there are no updates from framework.

    Signed-off-by: Kalyan Thota <quic_kalyant@quicinc.com>
    Signed-off-by: Vinod Polimera <quic_vpolimer@quicinc.com>
    ---
    drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c | 13 ++++++++++++-
    drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c | 14 ++++++++++++++
    drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c | 2 +-
    3 files changed, 27 insertions(+), 2 deletions(-)

    diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c
    index f91e3d1..eb3915a 100644
    --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c
    +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c
    @@ -18,6 +18,7 @@
    #include <drm/drm_probe_helper.h>
    #include <drm/drm_rect.h>
    #include <drm/drm_vblank.h>
    +#include <drm/drm_self_refresh_helper.h>

    #include "dpu_kms.h"
    #include "dpu_hw_lm.h"
    @@ -961,6 +962,9 @@ static void dpu_crtc_disable(struct drm_crtc *crtc,

    DRM_DEBUG_KMS("crtc%d\n", crtc->base.id);

    + if (old_crtc_state->self_refresh_active)
    + return;
    +
    /* Disable/save vblank irq handling */
    drm_crtc_vblank_off(crtc);

    @@ -1521,7 +1525,7 @@ struct drm_crtc *dpu_crtc_init(struct drm_device *dev, struct drm_plane *plane,
    {
    struct drm_crtc *crtc = NULL;
    struct dpu_crtc *dpu_crtc = NULL;
    - int i;
    + int i, ret;

    dpu_crtc = kzalloc(sizeof(*dpu_crtc), GFP_KERNEL);
    if (!dpu_crtc)
    @@ -1558,6 +1562,13 @@ struct drm_crtc *dpu_crtc_init(struct drm_device *dev, struct drm_plane *plane,
    /* initialize event handling */
    spin_lock_init(&dpu_crtc->event_lock);

    + ret = drm_self_refresh_helper_init(crtc);
    + if (ret) {
    + DPU_ERROR("Failed to initialize %s with self-refresh helpers %d\n",
    + crtc->name, ret);
    + return ERR_PTR(ret);
    + }
    +
    DRM_DEBUG_KMS("%s: successfully initialized crtc\n", dpu_crtc->name);
    return crtc;
    }
    diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c
    index 3156efb..5dfb56a 100644
    --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c
    +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c
    @@ -12,6 +12,7 @@
    #include <linux/kthread.h>
    #include <linux/seq_file.h>

    +#include <drm/drm_atomic.h>
    #include <drm/drm_crtc.h>
    #include <drm/drm_file.h>
    #include <drm/drm_probe_helper.h>
    @@ -1170,11 +1171,24 @@ static void dpu_encoder_virt_atomic_disable(struct drm_encoder *drm_enc,
    struct drm_atomic_state *state)
    {
    struct dpu_encoder_virt *dpu_enc = NULL;
    + struct drm_crtc *crtc;
    + struct drm_crtc_state *old_state = NULL;
    int i = 0;

    dpu_enc = to_dpu_encoder_virt(drm_enc);
    DPU_DEBUG_ENC(dpu_enc, "\n");

    + crtc = drm_atomic_get_old_crtc_for_encoder(state, drm_enc);
    + if (crtc)
    + old_state = drm_atomic_get_old_crtc_state(state, crtc);
    +
    + /*
    + * The encoder is already disabled if self refresh mode was set earlier,
    + * in the old_state for the corresponding crtc.
    + */
    + if (old_state && old_state->self_refresh_active)
    + return;
    +
    mutex_lock(&dpu_enc->enc_lock);
    dpu_enc->enabled = false;

    diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c
    index bce4764..cc0a674 100644
    --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c
    +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c
    @@ -507,7 +507,7 @@ static void dpu_kms_wait_for_commit_done(struct msm_kms *kms,
    return;
    }

    - if (!crtc->state->active) {
    + if (!drm_atomic_crtc_effectively_active(crtc->state)) {
    DPU_DEBUG("[crtc:%d] not active\n", crtc->base.id);
    return;
    }
    --
    2.7.4
    \
     
     \ /
      Last update: 2022-07-11 14:58    [W:4.078 / U:0.064 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site