From e27970cd68f7b52523ce0992446f43b7ed2fb211 Mon Sep 17 00:00:00 2001 From: James Hughes Date: Mon, 29 Jul 2019 12:02:59 +0100 Subject: [PATCH 738/826] Fixup FKMS interrupt handing for non-existent display 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 | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/drivers/gpu/drm/vc4/vc4_firmware_kms.c b/drivers/gpu/drm/vc4/vc4_firmware_kms.c index 8f3fe6f9246e..bcbd2f709c7f 100644 --- a/drivers/gpu/drm/vc4/vc4_firmware_kms.c +++ b/drivers/gpu/drm/vc4/vc4_firmware_kms.c @@ -1056,14 +1056,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]); + } } } -- 2.22.0