drm/vc4: crtc: Drop feed_txp from state
authorMaxime Ripard <maxime@cerno.tech>
Mon, 25 Oct 2021 14:11:05 +0000 (16:11 +0200)
committerMaxime Ripard <maxime@cerno.tech>
Fri, 5 Nov 2021 11:53:16 +0000 (12:53 +0100)
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>
drivers/gpu/drm/vc4/vc4_crtc.c
drivers/gpu/drm/vc4/vc4_drv.h
drivers/gpu/drm/vc4/vc4_hvs.c
drivers/gpu/drm/vc4/vc4_kms.c
drivers/gpu/drm/vc4/vc4_txp.c

index e7d8f4594044257382567481d7c279fae8277923..7d21ea150b983e9b644a5a150442268003252dd6 100644 (file)
@@ -723,7 +723,7 @@ static void vc4_crtc_handle_page_flip(struct vc4_crtc *vc4_crtc)
        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);
@@ -901,7 +901,6 @@ struct drm_crtc_state *vc4_crtc_duplicate_state(struct drm_crtc *crtc)
                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;
 
index 5abb3c0902538309309078bb6d225d9d128bfeaa..3dc593a48d094af80120da61b69458fee94fdcbc 100644 (file)
@@ -492,6 +492,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;
 
index c239045e05d6f1efd65c6501a3cb7f99ff0e5b1b..9ddaee6b368d321a270834308d3d5bbc1f718e16 100644 (file)
@@ -375,7 +375,7 @@ static void vc4_hvs_update_dlist(struct drm_crtc *crtc)
 
                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_crtc *crtc,
 {
        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);
index 0a4fca043c655122233d00b691118605fd8c34ca..79d4d9dd13948d370e53abb6a756bcef957e51fd 100644 (file)
@@ -235,6 +235,7 @@ static void vc4_hvs_pv_muxing_commit(struct vc4_dev *vc4,
        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;
@@ -255,7 +256,7 @@ static void vc4_hvs_pv_muxing_commit(struct vc4_dev *vc4,
                 * 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);
index 2fc7f4b5fa0983b472c045ac861fb05e08308c1d..26eda7542f74d380ddb6db97f30704a3faf4d6c6 100644 (file)
@@ -391,7 +391,6 @@ static int vc4_txp_atomic_check(struct drm_crtc *crtc,
 {
        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 drm_crtc *crtc,
                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 *dev, struct device *master, void *data)
 
        vc4_crtc->pdev = pdev;
        vc4_crtc->data = &vc4_txp_crtc_data;
+       vc4_crtc->feeds_txp = true;
 
        txp->pdev = pdev;