]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
gpu/drm: ingenic: Avoid null pointer deference in plane atomic update
authorPaul Cercueil <paul@crapouillou.net>
Tue, 10 Dec 2019 14:41:38 +0000 (15:41 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 24 Feb 2020 07:36:36 +0000 (08:36 +0100)
[ Upstream commit 354b051c5dcbeb35bbfd5d54161364fc7a75a58a ]

It is possible that there is no drm_framebuffer associated with a given
plane state.

v2: Handle drm_plane->state which can be NULL too

Signed-off-by: Paul Cercueil <paul@crapouillou.net>
Link: https://patchwork.freedesktop.org/patch/msgid/20191210144142.33143-2-paul@crapouillou.net
# *** extracted tags ***
Acked-by: Sam Ravnborg <sam@ravnborg.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/gpu/drm/ingenic/ingenic-drm.c

index 2e2ed653e9c6b452e281ea4625fe56863ee7f7d1..f156f245fdecf5cc380a5cc003a486d4e230ff05 100644 (file)
@@ -371,14 +371,18 @@ static void ingenic_drm_plane_atomic_update(struct drm_plane *plane,
        struct ingenic_drm *priv = drm_plane_get_priv(plane);
        struct drm_plane_state *state = plane->state;
        unsigned int width, height, cpp;
+       dma_addr_t addr;
 
-       width = state->crtc->state->adjusted_mode.hdisplay;
-       height = state->crtc->state->adjusted_mode.vdisplay;
-       cpp = state->fb->format->cpp[plane->index];
+       if (state && state->fb) {
+               addr = drm_fb_cma_get_gem_addr(state->fb, state, 0);
+               width = state->crtc->state->adjusted_mode.hdisplay;
+               height = state->crtc->state->adjusted_mode.vdisplay;
+               cpp = state->fb->format->cpp[plane->index];
 
-       priv->dma_hwdesc->addr = drm_fb_cma_get_gem_addr(state->fb, state, 0);
-       priv->dma_hwdesc->cmd = width * height * cpp / 4;
-       priv->dma_hwdesc->cmd |= JZ_LCD_CMD_EOF_IRQ;
+               priv->dma_hwdesc->addr = addr;
+               priv->dma_hwdesc->cmd = width * height * cpp / 4;
+               priv->dma_hwdesc->cmd |= JZ_LCD_CMD_EOF_IRQ;
+       }
 }
 
 static void ingenic_drm_encoder_atomic_mode_set(struct drm_encoder *encoder,