lkml.org 
[lkml]   [2020]   [May]   [27]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v3 050/105] drm/vc4: encoder: Add finer-grained encoder callbacks
    Date
    In the BCM2711, the setup of the HVS, pixelvalve and HDMI controller
    requires very precise ordering and timing that the regular atomic callbacks
    don't provide. Let's add new callbacks on top of the regular ones to be
    able to split the configuration as needed.

    Signed-off-by: Maxime Ripard <maxime@cerno.tech>
    ---
    drivers/gpu/drm/vc4/vc4_crtc.c | 19 +++++++++++++++++++
    drivers/gpu/drm/vc4/vc4_drv.h | 7 +++++++
    2 files changed, 26 insertions(+)

    diff --git a/drivers/gpu/drm/vc4/vc4_crtc.c b/drivers/gpu/drm/vc4/vc4_crtc.c
    index 83fb5ba19b43..b3721bce7c81 100644
    --- a/drivers/gpu/drm/vc4/vc4_crtc.c
    +++ b/drivers/gpu/drm/vc4/vc4_crtc.c
    @@ -387,6 +387,8 @@ static void vc4_crtc_atomic_disable(struct drm_crtc *crtc,
    {
    struct drm_device *dev = crtc->dev;
    struct vc4_crtc *vc4_crtc = to_vc4_crtc(crtc);
    + struct drm_encoder *encoder = vc4_get_crtc_encoder(crtc);
    + struct vc4_encoder *vc4_encoder = to_vc4_encoder(encoder);
    int ret;

    require_hvs_enabled(dev);
    @@ -399,10 +401,16 @@ static void vc4_crtc_atomic_disable(struct drm_crtc *crtc,
    ret = wait_for(!(CRTC_READ(PV_V_CONTROL) & PV_VCONTROL_VIDEN), 1);
    WARN_ONCE(ret, "Timeout waiting for !PV_VCONTROL_VIDEN\n");

    + if (vc4_encoder->post_crtc_disable)
    + vc4_encoder->post_crtc_disable(encoder);
    +
    CRTC_WRITE(PV_CONTROL, CRTC_READ(PV_CONTROL) & ~PV_CONTROL_EN);

    vc4_hvs_atomic_disable(crtc, old_state);

    + if (vc4_encoder->post_crtc_powerdown)
    + vc4_encoder->post_crtc_powerdown(encoder);
    +
    /*
    * Make sure we issue a vblank event after disabling the CRTC if
    * someone was waiting it.
    @@ -430,6 +438,8 @@ static void vc4_crtc_atomic_enable(struct drm_crtc *crtc,
    struct drm_device *dev = crtc->dev;
    struct vc4_crtc *vc4_crtc = to_vc4_crtc(crtc);
    struct vc4_crtc_state *vc4_state = to_vc4_crtc_state(crtc->state);
    + struct drm_encoder *encoder = vc4_get_crtc_encoder(crtc);
    + struct vc4_encoder *vc4_encoder = to_vc4_encoder(encoder);

    require_hvs_enabled(dev);

    @@ -440,17 +450,26 @@ static void vc4_crtc_atomic_enable(struct drm_crtc *crtc,

    vc4_hvs_atomic_enable(crtc, old_state);

    + if (vc4_encoder->pre_crtc_configure)
    + vc4_encoder->pre_crtc_configure(encoder);
    +
    if (!vc4_state->feed_txp)
    vc4_crtc_config_pv(crtc);

    CRTC_WRITE(PV_CONTROL, CRTC_READ(PV_CONTROL) | PV_CONTROL_EN);

    + if (vc4_encoder->pre_crtc_enable)
    + vc4_encoder->pre_crtc_enable(encoder);
    +
    /* When feeding the transposer block the pixelvalve is unneeded and
    * should not be enabled.
    */
    if (!vc4_state->feed_txp)
    CRTC_WRITE(PV_V_CONTROL,
    CRTC_READ(PV_V_CONTROL) | PV_VCONTROL_VIDEN);
    +
    + if (vc4_encoder->post_crtc_enable)
    + vc4_encoder->post_crtc_enable(encoder);
    }

    static enum drm_mode_status vc4_crtc_mode_valid(struct drm_crtc *crtc,
    diff --git a/drivers/gpu/drm/vc4/vc4_drv.h b/drivers/gpu/drm/vc4/vc4_drv.h
    index d86228e1e338..ba24bad86905 100644
    --- a/drivers/gpu/drm/vc4/vc4_drv.h
    +++ b/drivers/gpu/drm/vc4/vc4_drv.h
    @@ -442,6 +442,13 @@ struct vc4_encoder {
    struct drm_encoder base;
    enum vc4_encoder_type type;
    u32 clock_select;
    +
    + void (*pre_crtc_configure)(struct drm_encoder *encoder);
    + void (*pre_crtc_enable)(struct drm_encoder *encoder);
    + void (*post_crtc_enable)(struct drm_encoder *encoder);
    +
    + void (*post_crtc_disable)(struct drm_encoder *encoder);
    + void (*post_crtc_powerdown)(struct drm_encoder *encoder);
    };

    static inline struct vc4_encoder *
    --
    git-series 0.9.1
    \
     
     \ /
      Last update: 2020-05-27 17:56    [W:4.133 / U:0.148 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site