mirror of
https://github.com/Ysurac/openmptcprouter.git
synced 2025-02-13 11:51:54 +00:00
114 lines
4.7 KiB
Diff
114 lines
4.7 KiB
Diff
From ed2955f9cdaf873fd2b470febe3da024e3aa3f11 Mon Sep 17 00:00:00 2001
|
|
From: Maxime Ripard <maxime@cerno.tech>
|
|
Date: Mon, 18 Oct 2021 15:56:44 +0200
|
|
Subject: [PATCH 013/634] drm/vc4: crtc: Copy assigned channel to the CRTC
|
|
|
|
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,
|
|
and the previous commits removed them all but the HVS channel a CRTC has
|
|
been assigned.
|
|
|
|
Let's move this channel in struct vc4_crtc at atomic_begin() time, drop
|
|
it from our private state structure, and remove our use of crtc->state
|
|
from our vblank handler entirely.
|
|
|
|
Link: https://lore.kernel.org/all/YWgteNaNeaS9uWDe@phenom.ffwll.local/
|
|
Fixes: 87ebcd42fb7b ("drm/vc4: crtc: Assign output to channel automatically")
|
|
Signed-off-by: Maxime Ripard <maxime@cerno.tech>
|
|
---
|
|
drivers/gpu/drm/vc4/vc4_crtc.c | 4 ++--
|
|
drivers/gpu/drm/vc4/vc4_drv.h | 9 +++++++++
|
|
drivers/gpu/drm/vc4/vc4_hvs.c | 12 ++++++++++++
|
|
drivers/gpu/drm/vc4/vc4_txp.c | 1 +
|
|
4 files changed, 24 insertions(+), 2 deletions(-)
|
|
|
|
diff --git a/drivers/gpu/drm/vc4/vc4_crtc.c b/drivers/gpu/drm/vc4/vc4_crtc.c
|
|
index 98de8b265220..e3ed52d96f42 100644
|
|
--- a/drivers/gpu/drm/vc4/vc4_crtc.c
|
|
+++ b/drivers/gpu/drm/vc4/vc4_crtc.c
|
|
@@ -708,8 +708,7 @@ static void vc4_crtc_handle_page_flip(struct vc4_crtc *vc4_crtc)
|
|
struct drm_crtc *crtc = &vc4_crtc->base;
|
|
struct drm_device *dev = crtc->dev;
|
|
struct vc4_dev *vc4 = to_vc4_dev(dev);
|
|
- struct vc4_crtc_state *vc4_state = to_vc4_crtc_state(crtc->state);
|
|
- u32 chan = vc4_state->assigned_channel;
|
|
+ u32 chan = vc4_crtc->current_hvs_channel;
|
|
unsigned long flags;
|
|
|
|
spin_lock_irqsave(&dev->event_lock, flags);
|
|
@@ -955,6 +954,7 @@ static const struct drm_crtc_funcs vc4_crtc_funcs = {
|
|
static const struct drm_crtc_helper_funcs vc4_crtc_helper_funcs = {
|
|
.mode_valid = vc4_crtc_mode_valid,
|
|
.atomic_check = vc4_crtc_atomic_check,
|
|
+ .atomic_begin = vc4_hvs_atomic_begin,
|
|
.atomic_flush = vc4_hvs_atomic_flush,
|
|
.atomic_enable = vc4_crtc_atomic_enable,
|
|
.atomic_disable = vc4_crtc_atomic_disable,
|
|
diff --git a/drivers/gpu/drm/vc4/vc4_drv.h b/drivers/gpu/drm/vc4/vc4_drv.h
|
|
index 6d2480abcf08..4b550ebd9572 100644
|
|
--- a/drivers/gpu/drm/vc4/vc4_drv.h
|
|
+++ b/drivers/gpu/drm/vc4/vc4_drv.h
|
|
@@ -514,6 +514,14 @@ struct vc4_crtc {
|
|
* handler to have access to that value.
|
|
*/
|
|
unsigned int current_dlist;
|
|
+
|
|
+ /**
|
|
+ * @current_hvs_channel: HVS channel currently assigned to the
|
|
+ * CRTC. Protected by @irq_lock, and copied in
|
|
+ * vc4_hvs_atomic_begin() for the CRTC interrupt handler to have
|
|
+ * access to that value.
|
|
+ */
|
|
+ unsigned int current_hvs_channel;
|
|
};
|
|
|
|
static inline struct vc4_crtc *
|
|
@@ -926,6 +934,7 @@ extern struct platform_driver vc4_hvs_driver;
|
|
void vc4_hvs_stop_channel(struct drm_device *dev, unsigned int output);
|
|
int vc4_hvs_get_fifo_from_output(struct drm_device *dev, unsigned int output);
|
|
int vc4_hvs_atomic_check(struct drm_crtc *crtc, struct drm_atomic_state *state);
|
|
+void vc4_hvs_atomic_begin(struct drm_crtc *crtc, struct drm_atomic_state *state);
|
|
void vc4_hvs_atomic_enable(struct drm_crtc *crtc, struct drm_atomic_state *state);
|
|
void vc4_hvs_atomic_disable(struct drm_crtc *crtc, struct drm_atomic_state *state);
|
|
void vc4_hvs_atomic_flush(struct drm_crtc *crtc, struct drm_atomic_state *state);
|
|
diff --git a/drivers/gpu/drm/vc4/vc4_hvs.c b/drivers/gpu/drm/vc4/vc4_hvs.c
|
|
index f8ed0f6a57e0..604933e20e6a 100644
|
|
--- a/drivers/gpu/drm/vc4/vc4_hvs.c
|
|
+++ b/drivers/gpu/drm/vc4/vc4_hvs.c
|
|
@@ -393,6 +393,18 @@ static void vc4_hvs_update_dlist(struct drm_crtc *crtc)
|
|
spin_unlock_irqrestore(&vc4_crtc->irq_lock, flags);
|
|
}
|
|
|
|
+void vc4_hvs_atomic_begin(struct drm_crtc *crtc,
|
|
+ struct drm_atomic_state *state)
|
|
+{
|
|
+ struct vc4_crtc *vc4_crtc = to_vc4_crtc(crtc);
|
|
+ struct vc4_crtc_state *vc4_state = to_vc4_crtc_state(crtc->state);
|
|
+ unsigned long flags;
|
|
+
|
|
+ spin_lock_irqsave(&vc4_crtc->irq_lock, flags);
|
|
+ vc4_crtc->current_hvs_channel = vc4_state->assigned_channel;
|
|
+ spin_unlock_irqrestore(&vc4_crtc->irq_lock, flags);
|
|
+}
|
|
+
|
|
void vc4_hvs_atomic_enable(struct drm_crtc *crtc,
|
|
struct drm_atomic_state *state)
|
|
{
|
|
diff --git a/drivers/gpu/drm/vc4/vc4_txp.c b/drivers/gpu/drm/vc4/vc4_txp.c
|
|
index 26eda7542f74..9809ca3e2945 100644
|
|
--- a/drivers/gpu/drm/vc4/vc4_txp.c
|
|
+++ b/drivers/gpu/drm/vc4/vc4_txp.c
|
|
@@ -435,6 +435,7 @@ static void vc4_txp_atomic_disable(struct drm_crtc *crtc,
|
|
|
|
static const struct drm_crtc_helper_funcs vc4_txp_crtc_helper_funcs = {
|
|
.atomic_check = vc4_txp_atomic_check,
|
|
+ .atomic_begin = vc4_hvs_atomic_begin,
|
|
.atomic_flush = vc4_hvs_atomic_flush,
|
|
.atomic_enable = vc4_txp_atomic_enable,
|
|
.atomic_disable = vc4_txp_atomic_disable,
|
|
--
|
|
2.33.1
|
|
|