mirror of
https://github.com/Ysurac/openmptcprouter.git
synced 2025-02-15 04:42:02 +00:00
155 lines
5.6 KiB
Diff
155 lines
5.6 KiB
Diff
|
From 8dab6a99245dd443527dce15f99707b889c21248 Mon Sep 17 00:00:00 2001
|
||
|
From: Maxime Ripard <maxime@cerno.tech>
|
||
|
Date: Mon, 18 Oct 2021 15:19:30 +0200
|
||
|
Subject: [PATCH 011/634] drm/vc4: crtc: Drop feed_txp from state
|
||
|
|
||
|
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/
|
||
|
Fixes: 008095e065a8 ("drm/vc4: Add support for the transposer block")
|
||
|
Signed-off-by: Maxime Ripard <maxime@cerno.tech>
|
||
|
---
|
||
|
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(-)
|
||
|
|
||
|
diff --git a/drivers/gpu/drm/vc4/vc4_crtc.c b/drivers/gpu/drm/vc4/vc4_crtc.c
|
||
|
index c0df11e5fcf2..b90187d2c819 100644
|
||
|
--- 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(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);
|
||
|
@@ -893,7 +893,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;
|
||
|
|
||
|
diff --git a/drivers/gpu/drm/vc4/vc4_drv.h b/drivers/gpu/drm/vc4/vc4_drv.h
|
||
|
index ef73e0aaf726..3c69b89363cb 100644
|
||
|
--- 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;
|
||
|
|
||
|
diff --git a/drivers/gpu/drm/vc4/vc4_hvs.c b/drivers/gpu/drm/vc4/vc4_hvs.c
|
||
|
index c239045e05d6..9ddaee6b368d 100644
|
||
|
--- 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 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);
|
||
|
diff --git a/drivers/gpu/drm/vc4/vc4_kms.c b/drivers/gpu/drm/vc4/vc4_kms.c
|
||
|
index f0b3e4cf5bce..028f19f7a5f8 100644
|
||
|
--- 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(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;
|
||
|
@@ -253,7 +254,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);
|
||
|
diff --git a/drivers/gpu/drm/vc4/vc4_txp.c b/drivers/gpu/drm/vc4/vc4_txp.c
|
||
|
index 2fc7f4b5fa09..26eda7542f74 100644
|
||
|
--- 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 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;
|
||
|
|
||
|
--
|
||
|
2.33.1
|
||
|
|