Fixup FKMS interrupt handing for non-existent display
authorJames Hughes <james.hughes@raspberrypi.org>
Mon, 29 Jul 2019 11:02:59 +0000 (12:02 +0100)
committerpopcornmix <popcornmix@gmail.com>
Wed, 1 Jul 2020 15:33:03 +0000 (16:33 +0100)
If an errant interrupt flag was received from a non-existent display,
a NULL pointer access was made. Protect against this by checking if a
second display is present prior to checking the interrupt flags.

drivers/gpu/drm/vc4/vc4_firmware_kms.c

index 653c9f6..14d660a 100644 (file)
@@ -1087,14 +1087,17 @@ static irqreturn_t vc4_crtc_irq_handler(int irq, void *data)
                                vc4_crtc_handle_page_flip(crtc_list[0]);
                        }
 
-                       /* Check for the secondary display too */
-                       chan = readl(crtc_list[0]->regs + SMIDSW1);
+                       if (crtc_list[1]) {
+                               /* Check for the secondary display too */
+                               chan = readl(crtc_list[0]->regs + SMIDSW1);
 
-                       if (chan & 1) {
-                               writel(SMI_NEW, crtc_list[0]->regs + SMIDSW1);
-                               if (crtc_list[1]->vblank_enabled)
-                                       drm_crtc_handle_vblank(&crtc_list[1]->base);
-                               vc4_crtc_handle_page_flip(crtc_list[1]);
+                               if (chan & 1) {
+                                       writel(SMI_NEW, crtc_list[0]->regs + SMIDSW1);
+
+                                       if (crtc_list[1]->vblank_enabled)
+                                               drm_crtc_handle_vblank(&crtc_list[1]->base);
+                                       vc4_crtc_handle_page_flip(crtc_list[1]);
+                               }
                        }
                }