From patchwork Mon Oct 31 14:19:27 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Bartosz Golaszewski X-Patchwork-Id: 9405519 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id A19FF60234 for ; Mon, 31 Oct 2016 14:20:19 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 7EFFF262F2 for ; Mon, 31 Oct 2016 14:20:19 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 73EA628EDC; Mon, 31 Oct 2016 14:20:19 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-4.1 required=2.0 tests=BAYES_00,DKIM_SIGNED, RCVD_IN_DNSWL_MED,T_DKIM_INVALID autolearn=ham version=3.3.1 Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (using TLSv1.2 with cipher DHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id 1CFF828B29 for ; Mon, 31 Oct 2016 14:20:09 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id B7BCE6E313; Mon, 31 Oct 2016 14:20:06 +0000 (UTC) X-Original-To: dri-devel@lists.freedesktop.org Delivered-To: dri-devel@lists.freedesktop.org Received: from mail-wm0-x230.google.com (mail-wm0-x230.google.com [IPv6:2a00:1450:400c:c09::230]) by gabe.freedesktop.org (Postfix) with ESMTPS id 042D16E310 for ; Mon, 31 Oct 2016 14:20:06 +0000 (UTC) Received: by mail-wm0-x230.google.com with SMTP id n67so231685824wme.1 for ; Mon, 31 Oct 2016 07:20:05 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=baylibre-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=l6Za0nO71ws7M+2vtTKdnQxeZosFdRzVM3I5/LZk2mM=; b=KsNucN59FsdHjBCyLhbyOjRynpl+moYS0lhw0qMmVxANzL7JiKfj0+T3AYIxAhYfOJ z6s20+YfQJ51St0MtbXOyJLZlbqj8qSy/IAXbnQWNAQhm0N5P6xaSaCokZJ0G3lq7eDf yXBO9kouXP7YFeZG6Tt9DKqNzBUEiF7tonh5tfiTDHPzKKtzuhs5IbpToZ1bLzBJvyBG 7a/G+BpHyDJ+K1V4IOjgihlj5N0Wz/FZvwvubcvr6AMOvt+U4FOIJECytyTsoGOD6Vjp Ma/z2ynHFYP9wcADr64suUV5qaox5Yz3dkqJ8i3n8qsdknJC8BSj/b15QFh/VWbbFcKo YOJA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=l6Za0nO71ws7M+2vtTKdnQxeZosFdRzVM3I5/LZk2mM=; b=X4Im4qPcb33YtfTZGWGu8hRPfxRx+Kiy43QDxvmhRIqXy7nvzChR02t+2mqWMi+m6w Im4Dpyvc/jE0GcKaHhl5+xgyt9NW3w73J12XSuXry2pTW3D9/ob4++Ffejn50W1UQ28i Ds5a2KV9ZUlpp6lms1aukEdWEOwoW6S8f9nfiuApOD2GR6Y/G+0TiA4ApOMojqlqRrJM g5fb1PYquYZjcxt8/jG8FtAYwLSluW3hTCAjZVokkT1Hd3bY7TclGLCBgbsqT9YqLWiY sTIGY9i/B6UDnAFzkVCehMFU19aLZftAo/Zuwzrlgew93Do8ytqTHdV+57SvxJ3ubJRD QLDw== X-Gm-Message-State: ABUngvfLUK/8qLOR6dwODtRDtdZmWM5lsdQOyh+H3z67KahJ4fxLzRXhsQ4n6RJs5IKJegtT X-Received: by 10.28.19.131 with SMTP id 125mr10218859wmt.133.1477923604532; Mon, 31 Oct 2016 07:20:04 -0700 (PDT) Received: from localhost.localdomain ([90.63.244.31]) by smtp.gmail.com with ESMTPSA id f4sm24929965wmd.15.2016.10.31.07.20.03 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Mon, 31 Oct 2016 07:20:03 -0700 (PDT) From: Bartosz Golaszewski To: Jyri Sarha , Tomi Valkeinen , David Airlie , Kevin Hilman , Michael Turquette , Sekhar Nori Subject: [PATCH v5 2/2] drm: tilcdc: clear the sync lost bit in crtc isr Date: Mon, 31 Oct 2016 15:19:27 +0100 Message-Id: <1477923567-1610-3-git-send-email-bgolaszewski@baylibre.com> X-Mailer: git-send-email 2.1.4 In-Reply-To: <1477923567-1610-1-git-send-email-bgolaszewski@baylibre.com> References: <1477923567-1610-1-git-send-email-bgolaszewski@baylibre.com> Cc: Peter Ujfalusi , Bartosz Golaszewski , LKML , linux-drm , arm-soc X-BeenThere: dri-devel@lists.freedesktop.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: Direct Rendering Infrastructure - Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" X-Virus-Scanned: ClamAV using ClamSMTP The frame synchronization error happens when the DMA engine attempts to read what it believes to be the first word of the video buffer but it cannot be recognized as such or when the LCDC is starved of data due to insufficient bandwidth of the system interconnect. On some SoCs (notably: da850) the memory settings do not meet the LCDC throughput requirements even after increasing the memory controller command re-ordering and the LDCD master peripheral priority, sometimes causing the sync lost error (typically when changing the resolution). When the sync lost error occurs, simply reset the input FIFO in the DMA controller unless a sync lost flood is detected in which case disable the interrupt. Signed-off-by: Bartosz Golaszewski --- drivers/gpu/drm/tilcdc/tilcdc_crtc.c | 50 ++++++++++++++++++++++++++---------- drivers/gpu/drm/tilcdc/tilcdc_regs.h | 1 + 2 files changed, 37 insertions(+), 14 deletions(-) diff --git a/drivers/gpu/drm/tilcdc/tilcdc_crtc.c b/drivers/gpu/drm/tilcdc/tilcdc_crtc.c index 937697d..c4c6323 100644 --- a/drivers/gpu/drm/tilcdc/tilcdc_crtc.c +++ b/drivers/gpu/drm/tilcdc/tilcdc_crtc.c @@ -163,7 +163,7 @@ static void tilcdc_crtc_enable_irqs(struct drm_device *dev) if (priv->rev == 1) { tilcdc_set(dev, LCDC_RASTER_CTRL_REG, - LCDC_V1_UNDERFLOW_INT_ENA); + LCDC_V1_UNDERFLOW_INT_ENA | LCDC_V1_SYNC_LOST_ENA); tilcdc_set(dev, LCDC_DMA_CTRL_REG, LCDC_V1_END_OF_FRAME_INT_ENA); } else { @@ -181,7 +181,9 @@ static void tilcdc_crtc_disable_irqs(struct drm_device *dev) /* disable irqs that we might have enabled: */ if (priv->rev == 1) { tilcdc_clear(dev, LCDC_RASTER_CTRL_REG, - LCDC_V1_UNDERFLOW_INT_ENA | LCDC_V1_PL_INT_ENA); + LCDC_V1_UNDERFLOW_INT_ENA | + LCDC_V1_PL_INT_ENA | + LCDC_V1_SYNC_LOST_ENA); tilcdc_clear(dev, LCDC_DMA_CTRL_REG, LCDC_V1_END_OF_FRAME_INT_ENA); } else { @@ -885,24 +887,44 @@ irqreturn_t tilcdc_crtc_irq(struct drm_crtc *crtc) wake_up(&tilcdc_crtc->frame_done_wq); } - if (stat & LCDC_SYNC_LOST) { - dev_err_ratelimited(dev->dev, "%s(0x%08x): Sync lost", - __func__, stat); - tilcdc_crtc->frame_intact = false; - if (tilcdc_crtc->sync_lost_count++ > - SYNC_LOST_COUNT_LIMIT) { - dev_err(dev->dev, "%s(0x%08x): Sync lost flood detected, disabling the interrupt", __func__, stat); - tilcdc_write(dev, LCDC_INT_ENABLE_CLR_REG, - LCDC_SYNC_LOST); - } - } - /* Indicate to LCDC that the interrupt service routine has * completed, see 13.3.6.1.6 in AM335x TRM. */ tilcdc_write(dev, LCDC_END_OF_INT_IND_REG, 0); } + if (stat & LCDC_SYNC_LOST) { + dev_err_ratelimited(dev->dev, "%s(0x%08x): Sync lost", + __func__, stat); + + tilcdc_crtc->frame_intact = false; + if (tilcdc_crtc->sync_lost_count++ > SYNC_LOST_COUNT_LIMIT) { + dev_err(dev->dev, + "%s(0x%08x): Sync lost flood detected, disabling the interrupt", + __func__, stat); + if (priv->rev == 2) + tilcdc_write(dev, LCDC_INT_ENABLE_CLR_REG, + LCDC_SYNC_LOST); + else if (priv->rev == 1) + tilcdc_clear(dev, LCDC_RASTER_CTRL_REG, + LCDC_V1_SYNC_LOST_ENA); + } + + if (priv->rev == 2) { + /* + * Indicate to LCDC that the interrupt service routine + * has completed, see 13.3.6.1.6 in AM335x TRM. + */ + tilcdc_write(dev, LCDC_END_OF_INT_IND_REG, 0); + } else if (priv->rev == 1) { + /* Reset the input FIFO in the DMA controller. */ + tilcdc_clear(dev, + LCDC_RASTER_CTRL_REG, LCDC_RASTER_ENABLE); + tilcdc_set(dev, + LCDC_RASTER_CTRL_REG, LCDC_RASTER_ENABLE); + } + } + return IRQ_HANDLED; } diff --git a/drivers/gpu/drm/tilcdc/tilcdc_regs.h b/drivers/gpu/drm/tilcdc/tilcdc_regs.h index f57c0d6..beb8c21 100644 --- a/drivers/gpu/drm/tilcdc/tilcdc_regs.h +++ b/drivers/gpu/drm/tilcdc/tilcdc_regs.h @@ -61,6 +61,7 @@ #define LCDC_V2_UNDERFLOW_INT_ENA BIT(5) #define LCDC_V1_PL_INT_ENA BIT(4) #define LCDC_V2_PL_INT_ENA BIT(6) +#define LCDC_V1_SYNC_LOST_ENA BIT(5) #define LCDC_MONOCHROME_MODE BIT(1) #define LCDC_RASTER_ENABLE BIT(0) #define LCDC_TFT_ALT_ENABLE BIT(23)