From patchwork Fri Jan 25 20:57:42 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Paulo Zanoni X-Patchwork-Id: 2048451 Return-Path: X-Original-To: patchwork-intel-gfx@patchwork.kernel.org Delivered-To: patchwork-process-083081@patchwork2.kernel.org Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) by patchwork2.kernel.org (Postfix) with ESMTP id 081BCDF23E for ; Fri, 25 Jan 2013 23:29:33 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id D0A87E5FE2 for ; Fri, 25 Jan 2013 15:29:32 -0800 (PST) X-Original-To: intel-gfx@lists.freedesktop.org Delivered-To: intel-gfx@lists.freedesktop.org Received: from mail-ye0-f181.google.com (mail-ye0-f181.google.com [209.85.213.181]) by gabe.freedesktop.org (Postfix) with ESMTP id 0B98CE5F6F for ; Fri, 25 Jan 2013 12:58:10 -0800 (PST) Received: by mail-ye0-f181.google.com with SMTP id m11so132298yen.26 for ; Fri, 25 Jan 2013 12:58:10 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=x-received:from:to:cc:subject:date:message-id:x-mailer:in-reply-to :references; bh=gqzPHI/NUuZofMrZXhAi/XikrLTIplugFQWaZTteDWo=; b=mHMwz70sLfsiDG0ikkvb7w5eqA6ggsx0vaCCItXlK8iFZ2sE86TpZR7IRNke9BYvH5 ZspvpBTaR/LkZx52TEg2R4KmeV5dPyBn3BwxEYZiOkd73n6WDsoEpgbVdnO+f99CF6jq D5siqcCSw7wgMjJr3A6jo7i37/sCtPTGE9YvholXRV3r61dkRojko2bhFyIGw+UMiy1a 5ibgzGYMGMbh4qwz/yt2LA4hkMsQRpaEtQsZYI3Tw8sjIc2ApS5VDLcmi9zA3+xdjBBL AwusAs/Lf0UHS1K4SsS0ks1CAInA2pH1iqFVdyld+dwFcp+uaFJG6OCAValqLig0svpV NfvQ== X-Received: by 10.236.191.202 with SMTP id g50mr7537910yhn.78.1359147490433; Fri, 25 Jan 2013 12:58:10 -0800 (PST) Received: from vicky.domain.invalid ([177.42.13.174]) by mx.google.com with ESMTPS id k63sm2088659yhj.20.2013.01.25.12.58.08 (version=TLSv1.2 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Fri, 25 Jan 2013 12:58:09 -0800 (PST) From: Paulo Zanoni To: intel-gfx@lists.freedesktop.org Date: Fri, 25 Jan 2013 18:57:42 -0200 Message-Id: <1359147462-3902-8-git-send-email-przanoni@gmail.com> X-Mailer: git-send-email 1.7.10.4 In-Reply-To: <1359147462-3902-1-git-send-email-przanoni@gmail.com> References: <1359147462-3902-1-git-send-email-przanoni@gmail.com> Cc: Paulo Zanoni Subject: [Intel-gfx] [PATCH 7/7] drm/i915: print Gen 7 error interrupts X-BeenThere: intel-gfx@lists.freedesktop.org X-Mailman-Version: 2.1.13 Precedence: list List-Id: Intel graphics driver community testing & development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Sender: intel-gfx-bounces+patchwork-intel-gfx=patchwork.kernel.org@lists.freedesktop.org Errors-To: intel-gfx-bounces+patchwork-intel-gfx=patchwork.kernel.org@lists.freedesktop.org From: Paulo Zanoni If we get one of these messages it means we did something wrong, and the first step to fix wrong things is to detect them and recognize they exist. For now, leave most messages as DRM_DEBUG_KMS. After we conclude that a certain message should not be print since our code is correct, then we can promote that specific message to DRM_ERROR. Also notice that on Haswell the only interrupt I ever get is for "unclaimed registers", so it looks like at least on Haswell we're in a good shape. Signed-off-by: Paulo Zanoni --- drivers/gpu/drm/i915/i915_irq.c | 28 +++++++++++++++++++++++++++- drivers/gpu/drm/i915/i915_reg.h | 2 +- 2 files changed, 28 insertions(+), 2 deletions(-) diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c index 943db10..c2136cd 100644 --- a/drivers/gpu/drm/i915/i915_irq.c +++ b/drivers/gpu/drm/i915/i915_irq.c @@ -697,6 +697,17 @@ static void cpt_irq_handler(struct drm_device *dev, u32 pch_iir) I915_READ(FDI_RX_IIR(pipe))); } +static void ivb_err_int_handler(struct drm_device *dev) +{ + drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; + u32 err_int = I915_READ(GEN7_ERR_INT); + + if (err_int) + DRM_DEBUG_KMS("Error interrupt: 0x%08x\n", err_int); + + I915_WRITE(GEN7_ERR_INT, err_int); +} + static irqreturn_t ivybridge_irq_handler(int irq, void *arg) { struct drm_device *dev = (struct drm_device *) arg; @@ -707,6 +718,14 @@ static irqreturn_t ivybridge_irq_handler(int irq, void *arg) atomic_inc(&dev_priv->irq_received); + /* We get interrupts on unclaimed registers, so check this before we do + * any I915_{READ,WRITE}. */ + if (drm_debug && IS_HASWELL(dev) && + (I915_READ_NOTRACE(FPGA_DBG) & FPGA_DBG_RM_NOCLAIM)) { + DRM_ERROR("Unclaimed register before interrupt\n"); + I915_WRITE_NOTRACE(FPGA_DBG, FPGA_DBG_RM_NOCLAIM); + } + /* disable master interrupt before clearing iir */ de_ier = I915_READ(DEIER); I915_WRITE(DEIER, de_ier & ~DE_MASTER_IRQ_CONTROL); @@ -720,6 +739,9 @@ static irqreturn_t ivybridge_irq_handler(int irq, void *arg) de_iir = I915_READ(DEIIR); if (de_iir) { + if (de_iir & DE_ERR_INT_IVB) + ivb_err_int_handler(dev); + if (de_iir & DE_AUX_CHANNEL_A_IVB) dp_aux_irq_handler(dev); @@ -2006,7 +2028,8 @@ static int ivybridge_irq_postinstall(struct drm_device *dev) DE_PLANEC_FLIP_DONE_IVB | DE_PLANEB_FLIP_DONE_IVB | DE_PLANEA_FLIP_DONE_IVB | - DE_AUX_CHANNEL_A_IVB; + DE_AUX_CHANNEL_A_IVB | + DE_ERR_INT_IVB; u32 render_irqs; u32 hotplug_mask; u32 pch_irq_mask; @@ -2014,6 +2037,7 @@ static int ivybridge_irq_postinstall(struct drm_device *dev) dev_priv->irq_mask = ~display_mask; /* should always can generate irq */ + I915_WRITE(GEN7_ERR_INT, I915_READ(GEN7_ERR_INT)); I915_WRITE(DEIIR, I915_READ(DEIIR)); I915_WRITE(DEIMR, dev_priv->irq_mask); I915_WRITE(DEIER, @@ -2177,6 +2201,8 @@ static void ironlake_irq_uninstall(struct drm_device *dev) I915_WRITE(DEIMR, 0xffffffff); I915_WRITE(DEIER, 0x0); I915_WRITE(DEIIR, I915_READ(DEIIR)); + if (IS_GEN7(dev)) + I915_WRITE(GEN7_ERR_INT, I915_READ(GEN7_ERR_INT)); I915_WRITE(GTIMR, 0xffffffff); I915_WRITE(GTIER, 0x0); diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h index ee30fb9..86cace1 100644 --- a/drivers/gpu/drm/i915/i915_reg.h +++ b/drivers/gpu/drm/i915/i915_reg.h @@ -3379,7 +3379,7 @@ #define DE_PIPEA_FIFO_UNDERRUN (1 << 0) /* More Ivybridge lolz */ -#define DE_ERR_DEBUG_IVB (1<<30) +#define DE_ERR_INT_IVB (1<<30) #define DE_GSE_IVB (1<<29) #define DE_PCH_EVENT_IVB (1<<28) #define DE_DP_A_HOTPLUG_IVB (1<<27)