From patchwork Sat Mar 26 02:07:49 2011 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ben Widawsky X-Patchwork-Id: 665481 Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) by demeter1.kernel.org (8.14.4/8.14.3) with ESMTP id p2Q28h3U008412 for ; Sat, 26 Mar 2011 02:09:03 GMT Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 3283A9E8B3 for ; Fri, 25 Mar 2011 19:08:43 -0700 (PDT) X-Original-To: intel-gfx@lists.freedesktop.org Delivered-To: intel-gfx@lists.freedesktop.org Received: from cloud01.chad-versace.us (184-106-247-128.static.cloud-ips.com [184.106.247.128]) by gabe.freedesktop.org (Postfix) with ESMTP id 55F649E7B4 for ; Fri, 25 Mar 2011 19:07:59 -0700 (PDT) Received: from localhost.localdomain (unknown [67.208.96.87]) by cloud01.chad-versace.us (Postfix) with ESMTPSA id D21381D4009; Sat, 26 Mar 2011 02:08:35 +0000 (UTC) From: Ben Widawsky To: intel-gfx@lists.freedesktop.org Date: Fri, 25 Mar 2011 19:07:49 -0700 Message-Id: <1301105269-23970-2-git-send-email-ben@bwidawsk.net> X-Mailer: git-send-email 1.7.3.4 In-Reply-To: <1301105269-23970-1-git-send-email-ben@bwidawsk.net> References: <1301105269-23970-1-git-send-email-ben@bwidawsk.net> Subject: [Intel-gfx] [PATCH] drm/i915: have a forcewake "refcount" X-BeenThere: intel-gfx@lists.freedesktop.org X-Mailman-Version: 2.1.11 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 X-Greylist: IP, sender and recipient auto-whitelisted, not delayed by milter-greylist-4.2.6 (demeter1.kernel.org [140.211.167.41]); Sat, 26 Mar 2011 02:09:03 +0000 (UTC) diff --git a/drivers/gpu/drm/i915/i915_debugfs.c b/drivers/gpu/drm/i915/i915_debugfs.c index 87c8e29..91ff99c 100644 --- a/drivers/gpu/drm/i915/i915_debugfs.c +++ b/drivers/gpu/drm/i915/i915_debugfs.c @@ -1186,6 +1186,16 @@ static int i915_gem_framebuffer_info(struct seq_file *m, void *data) return 0; } +static int i915_forcewake_count_info(struct seq_file *m, void *unused) +{ + struct drm_info_node *node = (struct drm_info_node *) m->private; + struct drm_device *dev = node->minor->dev; + drm_i915_private_t *dev_priv = dev->dev_private; + seq_printf(m, "forcewake_count: %d\n", + dev_priv->gen6_gt_forcewake_count); + return 0; +} + static int i915_wedged_open(struct inode *inode, struct file *filp) @@ -1324,6 +1334,7 @@ static struct drm_info_list i915_debugfs_list[] = { {"i915_sr_status", i915_sr_status, 0}, {"i915_opregion", i915_opregion, 0}, {"i915_gem_framebuffer", i915_gem_framebuffer_info, 0}, + {"i915_forcewake_count", i915_forcewake_count_info, 0}, }; #define I915_DEBUGFS_ENTRIES ARRAY_SIZE(i915_debugfs_list) diff --git a/drivers/gpu/drm/i915/i915_dma.c b/drivers/gpu/drm/i915/i915_dma.c index 7273037..35e0eaf 100644 --- a/drivers/gpu/drm/i915/i915_dma.c +++ b/drivers/gpu/drm/i915/i915_dma.c @@ -2026,6 +2026,9 @@ int i915_driver_load(struct drm_device *dev, unsigned long flags) spin_lock_init(&dev_priv->irq_lock); spin_lock_init(&dev_priv->error_lock); + if (IS_GEN6(dev)) + spin_lock_init(&dev_priv->gen6_gt_forcewake_lock); + if (IS_MOBILE(dev) || !IS_GEN2(dev)) dev_priv->num_pipe = 2; else diff --git a/drivers/gpu/drm/i915/i915_drv.c b/drivers/gpu/drm/i915/i915_drv.c index c34a8dd..d8da39f 100644 --- a/drivers/gpu/drm/i915/i915_drv.c +++ b/drivers/gpu/drm/i915/i915_drv.c @@ -266,6 +266,17 @@ void intel_detect_pch (struct drm_device *dev) void __gen6_gt_force_wake_get(struct drm_i915_private *dev_priv) { int count; + unsigned long flags; + + spin_lock_irqsave(&dev_priv->gen6_gt_forcewake_lock, flags); + if (++dev_priv->gen6_gt_forcewake_count > 1) { + count = 0; + while (count++ < 50 && (I915_READ_NOTRACE(FORCEWAKE_ACK) & 1)) + udelay(10); + spin_unlock_irqrestore(&dev_priv->gen6_gt_forcewake_lock, flags); + return; + } + WARN_ON(dev_priv->gen6_gt_forcewake_count != 1); count = 0; while (count++ < 50 && (I915_READ_NOTRACE(FORCEWAKE_ACK) & 1)) @@ -277,12 +288,25 @@ void __gen6_gt_force_wake_get(struct drm_i915_private *dev_priv) count = 0; while (count++ < 50 && (I915_READ_NOTRACE(FORCEWAKE_ACK) & 1) == 0) udelay(10); + + spin_unlock_irqrestore(&dev_priv->gen6_gt_forcewake_lock, flags); } void __gen6_gt_force_wake_put(struct drm_i915_private *dev_priv) { + unsigned long flags; + + spin_lock_irqsave(&dev_priv->gen6_gt_forcewake_lock, flags); + if (--dev_priv->gen6_gt_forcewake_count > 0) { + spin_unlock_irqrestore(&dev_priv->gen6_gt_forcewake_lock, flags); + return; + } + WARN_ON(dev_priv->gen6_gt_forcewake_count != 0); + I915_WRITE_NOTRACE(FORCEWAKE, 0); POSTING_READ(FORCEWAKE); + + spin_unlock_irqrestore(&dev_priv->gen6_gt_forcewake_lock, flags); } void __gen6_gt_wait_for_fifo(struct drm_i915_private *dev_priv) diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h index 5004724..f37bacd 100644 --- a/drivers/gpu/drm/i915/i915_drv.h +++ b/drivers/gpu/drm/i915/i915_drv.h @@ -703,6 +703,10 @@ typedef struct drm_i915_private { struct intel_fbdev *fbdev; struct drm_property *broadcast_rgb_property; + + /* gen6 forcewake state */ + spinlock_t gen6_gt_forcewake_lock; + int gen6_gt_forcewake_count; } drm_i915_private_t; struct drm_i915_gem_object {