mirror of
https://github.com/Ysurac/openmptcprouter.git
synced 2025-02-13 11:51:54 +00:00
183 lines
4.1 KiB
Diff
183 lines
4.1 KiB
Diff
From 85e00aae3a83bd2141aa251648f6e0a7416097b0 Mon Sep 17 00:00:00 2001
|
|
From: Maxime Ripard <maxime@cerno.tech>
|
|
Date: Thu, 8 Oct 2020 14:44:08 +0200
|
|
Subject: [PATCH 340/634] drm/atomic: Pass the full state to CRTC atomic
|
|
enable/disable
|
|
|
|
Commit 351f950db4ab28c321a1bd4b92e4bb03e34c4703 upstream.
|
|
|
|
If the CRTC driver ever needs to access the full DRM state, it can't do so
|
|
at atomic_enable / atomic_disable time since drm_atomic_helper_swap_state
|
|
will have cleared the pointer from the struct drm_crtc_state to the struct
|
|
drm_atomic_state before calling those hooks.
|
|
|
|
In order to allow that, let's pass the full DRM state to atomic_enable and
|
|
atomic_disable. The conversion was done using the coccinelle script below,
|
|
built tested on all the drivers and actually tested on vc4.
|
|
|
|
virtual report
|
|
|
|
@@
|
|
struct drm_crtc_helper_funcs *FUNCS;
|
|
identifier dev, state;
|
|
identifier crtc, crtc_state;
|
|
@@
|
|
|
|
disable_outputs(struct drm_device *dev, struct drm_atomic_state *state)
|
|
{
|
|
<...
|
|
- FUNCS->atomic_disable(crtc, crtc_state);
|
|
+ FUNCS->atomic_disable(crtc, state);
|
|
...>
|
|
}
|
|
|
|
@@
|
|
struct drm_crtc_helper_funcs *FUNCS;
|
|
identifier dev, state;
|
|
identifier crtc, crtc_state;
|
|
@@
|
|
|
|
drm_atomic_helper_commit_modeset_enables(struct drm_device *dev, struct drm_atomic_state *state)
|
|
{
|
|
<...
|
|
- FUNCS->atomic_enable(crtc, crtc_state);
|
|
+ FUNCS->atomic_enable(crtc, state);
|
|
...>
|
|
}
|
|
|
|
@@
|
|
identifier crtc, old_state;
|
|
@@
|
|
|
|
struct drm_crtc_helper_funcs {
|
|
...
|
|
- void (*atomic_enable)(struct drm_crtc *crtc, struct drm_crtc_state *old_state);
|
|
+ void (*atomic_enable)(struct drm_crtc *crtc, struct drm_atomic_state *state);
|
|
...
|
|
- void (*atomic_disable)(struct drm_crtc *crtc, struct drm_crtc_state *old_state);
|
|
+ void (*atomic_disable)(struct drm_crtc *crtc, struct drm_atomic_state *state);
|
|
...
|
|
}
|
|
|
|
@ crtc_atomic_func @
|
|
identifier helpers;
|
|
identifier func;
|
|
@@
|
|
|
|
(
|
|
static struct drm_crtc_helper_funcs helpers = {
|
|
...,
|
|
.atomic_enable = func,
|
|
...,
|
|
};
|
|
|
|
|
static struct drm_crtc_helper_funcs helpers = {
|
|
...,
|
|
.atomic_disable = func,
|
|
...,
|
|
};
|
|
)
|
|
|
|
@ ignores_old_state @
|
|
identifier crtc_atomic_func.func;
|
|
identifier crtc, old_state;
|
|
@@
|
|
|
|
void func(struct drm_crtc *crtc,
|
|
struct drm_crtc_state *old_state)
|
|
{
|
|
... when != old_state
|
|
}
|
|
|
|
@ adds_old_state depends on crtc_atomic_func && !ignores_old_state @
|
|
identifier crtc_atomic_func.func;
|
|
identifier crtc, old_state;
|
|
@@
|
|
|
|
void func(struct drm_crtc *crtc, struct drm_crtc_state *old_state)
|
|
{
|
|
+ struct drm_crtc_state *old_state = drm_atomic_get_old_crtc_state(state, crtc);
|
|
...
|
|
}
|
|
|
|
@ depends on crtc_atomic_func @
|
|
identifier crtc_atomic_func.func;
|
|
expression E;
|
|
type T;
|
|
@@
|
|
|
|
void func(...)
|
|
{
|
|
...
|
|
- T state = E;
|
|
+ T crtc_state = E;
|
|
<+...
|
|
- state
|
|
+ crtc_state
|
|
...+>
|
|
|
|
}
|
|
|
|
@ depends on crtc_atomic_func @
|
|
identifier crtc_atomic_func.func;
|
|
type T;
|
|
@@
|
|
|
|
void func(...)
|
|
{
|
|
...
|
|
- T state;
|
|
+ T crtc_state;
|
|
<+...
|
|
- state
|
|
+ crtc_state
|
|
...+>
|
|
|
|
}
|
|
|
|
@ depends on crtc_atomic_func @
|
|
identifier crtc_atomic_func.func;
|
|
identifier old_state;
|
|
identifier crtc;
|
|
@@
|
|
|
|
void func(struct drm_crtc *crtc,
|
|
- struct drm_crtc_state *old_state
|
|
+ struct drm_atomic_state *state
|
|
)
|
|
{ ... }
|
|
|
|
@ include depends on adds_old_state @
|
|
@@
|
|
|
|
#include <drm/drm_atomic.h>
|
|
|
|
@ no_include depends on !include && adds_old_state @
|
|
@@
|
|
|
|
+ #include <drm/drm_atomic.h>
|
|
#include <drm/...>
|
|
|
|
Signed-off-by: Maxime Ripard <maxime@cerno.tech>
|
|
Acked-by: Daniel Vetter <daniel.vetter@ffwll.ch>
|
|
Link: https://patchwork.freedesktop.org/patch/msgid/845aa10ef171fc0ea060495efef142a0c13f7870.1602161031.git-series.maxime@cerno.tech
|
|
---
|
|
drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c | 2 ++
|
|
1 file changed, 2 insertions(+)
|
|
|
|
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c
|
|
index 768012243b44..eff9dc6029c2 100644
|
|
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c
|
|
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c
|
|
@@ -797,6 +797,8 @@ static void dpu_crtc_disable(struct drm_crtc *crtc,
|
|
crtc);
|
|
struct dpu_crtc *dpu_crtc = to_dpu_crtc(crtc);
|
|
struct dpu_crtc_state *cstate = to_dpu_crtc_state(crtc->state);
|
|
+ struct drm_crtc_state *old_crtc_state = drm_atomic_get_old_crtc_state(state,
|
|
+ crtc);
|
|
struct drm_encoder *encoder;
|
|
unsigned long flags;
|
|
bool release_bandwidth = false;
|
|
--
|
|
2.33.1
|
|
|