lkml.org 
[lkml]   [2022]   [Jan]   [24]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.15 759/846] drm/vc4: crtc: Drop feed_txp from state
    Date
    From: Maxime Ripard <maxime@cerno.tech>

    commit a16c66401fd831f70a02d33e9bcaac585637c29f upstream.

    Accessing the crtc->state pointer from outside the modesetting context
    is not allowed. We thus need to copy whatever we need from the KMS state
    to our structure in order to access it.

    In VC4, a number of users of that pointers have crept in over the years,
    the first one being whether or not the downstream controller of the
    pixelvalve is our writeback controller.

    Fortunately for us, Since commit 39fcb2808376 ("drm/vc4: txp: Turn the
    TXP into a CRTC of its own") this is no longer something that can change
    from one commit to the other and is hardcoded.

    Let's set this flag in struct vc4_crtc if we happen to be the TXP, and
    drop the flag from our private state structure.

    Link: https://lore.kernel.org/all/YWgteNaNeaS9uWDe@phenom.ffwll.local/
    Link: https://lore.kernel.org/r/20211025141113.702757-2-maxime@cerno.tech
    Fixes: 008095e065a8 ("drm/vc4: Add support for the transposer block")
    Acked-by: Daniel Vetter <daniel.vetter@ffwll.ch>
    Signed-off-by: Maxime Ripard <maxime@cerno.tech>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    ---
    drivers/gpu/drm/vc4/vc4_crtc.c | 3 +--
    drivers/gpu/drm/vc4/vc4_drv.h | 6 +++++-
    drivers/gpu/drm/vc4/vc4_hvs.c | 7 +++----
    drivers/gpu/drm/vc4/vc4_kms.c | 3 ++-
    drivers/gpu/drm/vc4/vc4_txp.c | 3 +--
    5 files changed, 12 insertions(+), 10 deletions(-)

    --- a/drivers/gpu/drm/vc4/vc4_crtc.c
    +++ b/drivers/gpu/drm/vc4/vc4_crtc.c
    @@ -715,7 +715,7 @@ static void vc4_crtc_handle_page_flip(st
    spin_lock_irqsave(&dev->event_lock, flags);
    if (vc4_crtc->event &&
    (vc4_state->mm.start == HVS_READ(SCALER_DISPLACTX(chan)) ||
    - vc4_state->feed_txp)) {
    + vc4_crtc->feeds_txp)) {
    drm_crtc_send_vblank_event(crtc, vc4_crtc->event);
    vc4_crtc->event = NULL;
    drm_crtc_vblank_put(crtc);
    @@ -893,7 +893,6 @@ struct drm_crtc_state *vc4_crtc_duplicat
    return NULL;

    old_vc4_state = to_vc4_crtc_state(crtc->state);
    - vc4_state->feed_txp = old_vc4_state->feed_txp;
    vc4_state->margins = old_vc4_state->margins;
    vc4_state->assigned_channel = old_vc4_state->assigned_channel;

    --- a/drivers/gpu/drm/vc4/vc4_drv.h
    +++ b/drivers/gpu/drm/vc4/vc4_drv.h
    @@ -495,6 +495,11 @@ struct vc4_crtc {
    struct drm_pending_vblank_event *event;

    struct debugfs_regset32 regset;
    +
    + /**
    + * @feeds_txp: True if the CRTC feeds our writeback controller.
    + */
    + bool feeds_txp;
    };

    static inline struct vc4_crtc *
    @@ -521,7 +526,6 @@ struct vc4_crtc_state {
    struct drm_crtc_state base;
    /* Dlist area for this CRTC configuration. */
    struct drm_mm_node mm;
    - bool feed_txp;
    bool txp_armed;
    unsigned int assigned_channel;

    --- a/drivers/gpu/drm/vc4/vc4_hvs.c
    +++ b/drivers/gpu/drm/vc4/vc4_hvs.c
    @@ -375,7 +375,7 @@ static void vc4_hvs_update_dlist(struct

    spin_lock_irqsave(&dev->event_lock, flags);

    - if (!vc4_state->feed_txp || vc4_state->txp_armed) {
    + if (!vc4_crtc->feeds_txp || vc4_state->txp_armed) {
    vc4_crtc->event = crtc->state->event;
    crtc->state->event = NULL;
    }
    @@ -395,10 +395,9 @@ void vc4_hvs_atomic_enable(struct drm_cr
    {
    struct drm_device *dev = crtc->dev;
    struct vc4_dev *vc4 = to_vc4_dev(dev);
    - struct drm_crtc_state *new_crtc_state = drm_atomic_get_new_crtc_state(state, crtc);
    - struct vc4_crtc_state *vc4_state = to_vc4_crtc_state(new_crtc_state);
    struct drm_display_mode *mode = &crtc->state->adjusted_mode;
    - bool oneshot = vc4_state->feed_txp;
    + struct vc4_crtc *vc4_crtc = to_vc4_crtc(crtc);
    + bool oneshot = vc4_crtc->feeds_txp;

    vc4_hvs_update_dlist(crtc);
    vc4_hvs_init_channel(vc4, crtc, mode, oneshot);
    --- a/drivers/gpu/drm/vc4/vc4_kms.c
    +++ b/drivers/gpu/drm/vc4/vc4_kms.c
    @@ -233,6 +233,7 @@ static void vc4_hvs_pv_muxing_commit(str
    unsigned int i;

    for_each_new_crtc_in_state(state, crtc, crtc_state, i) {
    + struct vc4_crtc *vc4_crtc = to_vc4_crtc(crtc);
    struct vc4_crtc_state *vc4_state = to_vc4_crtc_state(crtc_state);
    u32 dispctrl;
    u32 dsp3_mux;
    @@ -253,7 +254,7 @@ static void vc4_hvs_pv_muxing_commit(str
    * TXP IP, and we need to disable the FIFO2 -> pixelvalve1
    * route.
    */
    - if (vc4_state->feed_txp)
    + if (vc4_crtc->feeds_txp)
    dsp3_mux = VC4_SET_FIELD(3, SCALER_DISPCTRL_DSP3_MUX);
    else
    dsp3_mux = VC4_SET_FIELD(2, SCALER_DISPCTRL_DSP3_MUX);
    --- a/drivers/gpu/drm/vc4/vc4_txp.c
    +++ b/drivers/gpu/drm/vc4/vc4_txp.c
    @@ -391,7 +391,6 @@ static int vc4_txp_atomic_check(struct d
    {
    struct drm_crtc_state *crtc_state = drm_atomic_get_new_crtc_state(state,
    crtc);
    - struct vc4_crtc_state *vc4_state = to_vc4_crtc_state(crtc_state);
    int ret;

    ret = vc4_hvs_atomic_check(crtc, state);
    @@ -399,7 +398,6 @@ static int vc4_txp_atomic_check(struct d
    return ret;

    crtc_state->no_vblank = true;
    - vc4_state->feed_txp = true;

    return 0;
    }
    @@ -482,6 +480,7 @@ static int vc4_txp_bind(struct device *d

    vc4_crtc->pdev = pdev;
    vc4_crtc->data = &vc4_txp_crtc_data;
    + vc4_crtc->feeds_txp = true;

    txp->pdev = pdev;


    \
     
     \ /
      Last update: 2022-01-25 01:11    [W:7.402 / U:0.080 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site