Since we recently started warning about uses of this function after the
atomic check phase completes, we've started getting warnings about this in
nouveau. It appears a misplaced drm_atomic_get_crtc_state() call has been
hiding in our .prepare_fb callback for a while.

So, fix this by adding a new nv50_head_atom_get_new() function and use that
in our .prepare_fb callback instead.

Signed-off-by: Lyude Paul <[email protected]>

Fixes: 1590700d94ac ("drm/nouveau/kms/nv50-: split each resource type into 
their own source files")
Cc: <[email protected]> # v4.18+
Signed-off-by: Lyude Paul <[email protected]>
---
 drivers/gpu/drm/nouveau/dispnv50/atom.h | 13 +++++++++++++
 drivers/gpu/drm/nouveau/dispnv50/wndw.c |  2 +-
 2 files changed, 14 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/nouveau/dispnv50/atom.h 
b/drivers/gpu/drm/nouveau/dispnv50/atom.h
index 93f8f4f645784..85b7cf70d13c4 100644
--- a/drivers/gpu/drm/nouveau/dispnv50/atom.h
+++ b/drivers/gpu/drm/nouveau/dispnv50/atom.h
@@ -152,8 +152,21 @@ static inline struct nv50_head_atom *
 nv50_head_atom_get(struct drm_atomic_state *state, struct drm_crtc *crtc)
 {
        struct drm_crtc_state *statec = drm_atomic_get_crtc_state(state, crtc);
+
        if (IS_ERR(statec))
                return (void *)statec;
+
+       return nv50_head_atom(statec);
+}
+
+static inline struct nv50_head_atom *
+nv50_head_atom_get_new(struct drm_atomic_state *state, struct drm_crtc *crtc)
+{
+       struct drm_crtc_state *statec = drm_atomic_get_new_crtc_state(state, 
crtc);
+
+       if (IS_ERR(statec))
+               return (void*)statec;
+
        return nv50_head_atom(statec);
 }
 
diff --git a/drivers/gpu/drm/nouveau/dispnv50/wndw.c 
b/drivers/gpu/drm/nouveau/dispnv50/wndw.c
index ef9e410babbfb..9a2c20fce0f3e 100644
--- a/drivers/gpu/drm/nouveau/dispnv50/wndw.c
+++ b/drivers/gpu/drm/nouveau/dispnv50/wndw.c
@@ -583,7 +583,7 @@ nv50_wndw_prepare_fb(struct drm_plane *plane, struct 
drm_plane_state *state)
        asyw->image.offset[0] = nvbo->offset;
 
        if (wndw->func->prepare) {
-               asyh = nv50_head_atom_get(asyw->state.state, asyw->state.crtc);
+               asyh = nv50_head_atom_get_new(asyw->state.state, 
asyw->state.crtc);
                if (IS_ERR(asyh))
                        return PTR_ERR(asyh);
 
-- 
2.52.0

Reply via email to