All of lore.kernel.org
 help / color / mirror / Atom feed
From: Deepak S <deepak.s@linux.intel.com>
To: intel-gfx@lists.freedesktop.org
Subject: Re: [PATCH 2/8] drm/i915: Assert that runtime pm is active on user fw access
Date: Fri, 12 Dec 2014 17:09:26 +0530	[thread overview]
Message-ID: <548AD3EE.7000203@linux.intel.com> (raw)
In-Reply-To: <1418063262-32256-2-git-send-email-mika.kuoppala@intel.com>


On Monday 08 December 2014 11:57 PM, Mika Kuoppala wrote:
> From: Chris Wilson <chris@chris-wilson.co.uk>
>
> On user forcewake access, assert that runtime pm reference is held.
> Fix and cleanup the callsites accordingly.
>
> Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
> Signed-off-by: Mika Kuoppala <mika.kuoppala@intel.com>
> ---
>   drivers/gpu/drm/i915/i915_debugfs.c  |  2 +
>   drivers/gpu/drm/i915/intel_display.c | 19 +--------
>   drivers/gpu/drm/i915/intel_lrc.c     | 53 ++-----------------------
>   drivers/gpu/drm/i915/intel_uncore.c  | 76 ++++++++++++------------------------
>   4 files changed, 31 insertions(+), 119 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/i915_debugfs.c b/drivers/gpu/drm/i915/i915_debugfs.c
> index d0e445e..e142629 100644
> --- a/drivers/gpu/drm/i915/i915_debugfs.c
> +++ b/drivers/gpu/drm/i915/i915_debugfs.c
> @@ -4250,6 +4250,7 @@ static int i915_forcewake_open(struct inode *inode, struct file *file)
>   	if (INTEL_INFO(dev)->gen < 6)
>   		return 0;
>   
> +	intel_runtime_pm_get(dev_priv);
>   	gen6_gt_force_wake_get(dev_priv, FORCEWAKE_ALL);
>   
>   	return 0;
> @@ -4264,6 +4265,7 @@ static int i915_forcewake_release(struct inode *inode, struct file *file)
>   		return 0;
>   
>   	gen6_gt_force_wake_put(dev_priv, FORCEWAKE_ALL);
> +	intel_runtime_pm_put(dev_priv);
>   
>   	return 0;
>   }
> diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
> index d5153a4..86c2885 100644
> --- a/drivers/gpu/drm/i915/intel_display.c
> +++ b/drivers/gpu/drm/i915/intel_display.c
> @@ -7862,19 +7862,8 @@ static void hsw_restore_lcpll(struct drm_i915_private *dev_priv)
>   	/*
>   	 * Make sure we're not on PC8 state before disabling PC8, otherwise
>   	 * we'll hang the machine. To prevent PC8 state, just enable force_wake.
> -	 *
> -	 * The other problem is that hsw_restore_lcpll() is called as part of
> -	 * the runtime PM resume sequence, so we can't just call
> -	 * gen6_gt_force_wake_get() because that function calls
> -	 * intel_runtime_pm_get(), and we can't change the runtime PM refcount
> -	 * while we are on the resume sequence. So to solve this problem we have
> -	 * to call special forcewake code that doesn't touch runtime PM and
> -	 * doesn't enable the forcewake delayed work.
>   	 */
> -	spin_lock_irq(&dev_priv->uncore.lock);
> -	if (dev_priv->uncore.forcewake_count++ == 0)
> -		dev_priv->uncore.funcs.force_wake_get(dev_priv, FORCEWAKE_ALL);
> -	spin_unlock_irq(&dev_priv->uncore.lock);
> +	gen6_gt_force_wake_get(dev_priv, FORCEWAKE_ALL);
>   
>   	if (val & LCPLL_POWER_DOWN_ALLOW) {
>   		val &= ~LCPLL_POWER_DOWN_ALLOW;
> @@ -7904,11 +7893,7 @@ static void hsw_restore_lcpll(struct drm_i915_private *dev_priv)
>   			DRM_ERROR("Switching back to LCPLL failed\n");
>   	}
>   
> -	/* See the big comment above. */
> -	spin_lock_irq(&dev_priv->uncore.lock);
> -	if (--dev_priv->uncore.forcewake_count == 0)
> -		dev_priv->uncore.funcs.force_wake_put(dev_priv, FORCEWAKE_ALL);
> -	spin_unlock_irq(&dev_priv->uncore.lock);
> +	gen6_gt_force_wake_put(dev_priv, FORCEWAKE_ALL);
>   }
>   
>   /*
> diff --git a/drivers/gpu/drm/i915/intel_lrc.c b/drivers/gpu/drm/i915/intel_lrc.c
> index a82020e..fcb5140 100644
> --- a/drivers/gpu/drm/i915/intel_lrc.c
> +++ b/drivers/gpu/drm/i915/intel_lrc.c
> @@ -284,7 +284,6 @@ static void execlists_elsp_write(struct intel_engine_cs *ring,
>   	struct drm_i915_private *dev_priv = dev->dev_private;
>   	uint64_t temp = 0;
>   	uint32_t desc[4];
> -	unsigned long flags;
>   
>   	/* XXX: You must always write both descriptors in the order below. */
>   	if (ctx_obj1)
> @@ -298,63 +297,17 @@ static void execlists_elsp_write(struct intel_engine_cs *ring,
>   	desc[3] = (u32)(temp >> 32);
>   	desc[2] = (u32)temp;
>   
> -	/* Set Force Wakeup bit to prevent GT from entering C6 while ELSP writes
> -	 * are in progress.
> -	 *
> -	 * The other problem is that we can't just call gen6_gt_force_wake_get()
> -	 * because that function calls intel_runtime_pm_get(), which might sleep.
> -	 * Instead, we do the runtime_pm_get/put when creating/destroying requests.
> -	 */
> -	spin_lock_irqsave(&dev_priv->uncore.lock, flags);
> -	if (IS_CHERRYVIEW(dev) || INTEL_INFO(dev)->gen >= 9) {
> -		if (dev_priv->uncore.fw_rendercount++ == 0)
> -			dev_priv->uncore.funcs.force_wake_get(dev_priv,
> -							      FORCEWAKE_RENDER);
> -		if (dev_priv->uncore.fw_mediacount++ == 0)
> -			dev_priv->uncore.funcs.force_wake_get(dev_priv,
> -							      FORCEWAKE_MEDIA);
> -		if (INTEL_INFO(dev)->gen >= 9) {
> -			if (dev_priv->uncore.fw_blittercount++ == 0)
> -				dev_priv->uncore.funcs.force_wake_get(dev_priv,
> -							FORCEWAKE_BLITTER);
> -		}
> -	} else {
> -		if (dev_priv->uncore.forcewake_count++ == 0)
> -			dev_priv->uncore.funcs.force_wake_get(dev_priv,
> -							      FORCEWAKE_ALL);
> -	}
> -	spin_unlock_irqrestore(&dev_priv->uncore.lock, flags);
> -
> +	gen6_gt_force_wake_get(dev_priv, FORCEWAKE_ALL);
>   	I915_WRITE(RING_ELSP(ring), desc[1]);
>   	I915_WRITE(RING_ELSP(ring), desc[0]);
>   	I915_WRITE(RING_ELSP(ring), desc[3]);
> +
>   	/* The context is automatically loaded after the following */
>   	I915_WRITE(RING_ELSP(ring), desc[2]);
>   
>   	/* ELSP is a wo register, so use another nearby reg for posting instead */
>   	POSTING_READ(RING_EXECLIST_STATUS(ring));
> -
> -	/* Release Force Wakeup (see the big comment above). */
> -	spin_lock_irqsave(&dev_priv->uncore.lock, flags);
> -	if (IS_CHERRYVIEW(dev) || INTEL_INFO(dev)->gen >= 9) {
> -		if (--dev_priv->uncore.fw_rendercount == 0)
> -			dev_priv->uncore.funcs.force_wake_put(dev_priv,
> -							      FORCEWAKE_RENDER);
> -		if (--dev_priv->uncore.fw_mediacount == 0)
> -			dev_priv->uncore.funcs.force_wake_put(dev_priv,
> -							      FORCEWAKE_MEDIA);
> -		if (INTEL_INFO(dev)->gen >= 9) {
> -			if (--dev_priv->uncore.fw_blittercount == 0)
> -				dev_priv->uncore.funcs.force_wake_put(dev_priv,
> -							FORCEWAKE_BLITTER);
> -		}
> -	} else {
> -		if (--dev_priv->uncore.forcewake_count == 0)
> -			dev_priv->uncore.funcs.force_wake_put(dev_priv,
> -							      FORCEWAKE_ALL);
> -	}
> -
> -	spin_unlock_irqrestore(&dev_priv->uncore.lock, flags);
> +	gen6_gt_force_wake_put(dev_priv, FORCEWAKE_ALL);
>   }
>   
>   static int execlists_update_context(struct drm_i915_gem_object *ctx_obj,
> diff --git a/drivers/gpu/drm/i915/intel_uncore.c b/drivers/gpu/drm/i915/intel_uncore.c
> index 38ac389..a1ceb92 100644
> --- a/drivers/gpu/drm/i915/intel_uncore.c
> +++ b/drivers/gpu/drm/i915/intel_uncore.c
> @@ -24,6 +24,8 @@
>   #include "i915_drv.h"
>   #include "intel_drv.h"
>   
> +#include <linux/pm_runtime.h>
> +
>   #define FORCEWAKE_ACK_TIMEOUT_MS 2
>   
>   #define __raw_i915_read8(dev_priv__, reg__) readb((dev_priv__)->regs + (reg__))
> @@ -247,10 +249,6 @@ static void __vlv_force_wake_put(struct drm_i915_private *dev_priv,
>   
>   static void vlv_force_wake_get(struct drm_i915_private *dev_priv, int fw_engine)
>   {
> -	unsigned long irqflags;
> -
> -	spin_lock_irqsave(&dev_priv->uncore.lock, irqflags);
> -
>   	if (fw_engine & FORCEWAKE_RENDER &&
>   	    dev_priv->uncore.fw_rendercount++ != 0)
>   		fw_engine &= ~FORCEWAKE_RENDER;
> @@ -260,16 +258,10 @@ static void vlv_force_wake_get(struct drm_i915_private *dev_priv, int fw_engine)
>   
>   	if (fw_engine)
>   		dev_priv->uncore.funcs.force_wake_get(dev_priv, fw_engine);
> -
> -	spin_unlock_irqrestore(&dev_priv->uncore.lock, irqflags);
>   }
>   
>   static void vlv_force_wake_put(struct drm_i915_private *dev_priv, int fw_engine)
>   {
> -	unsigned long irqflags;
> -
> -	spin_lock_irqsave(&dev_priv->uncore.lock, irqflags);
> -
>   	if (fw_engine & FORCEWAKE_RENDER) {
>   		WARN_ON(!dev_priv->uncore.fw_rendercount);
>   		if (--dev_priv->uncore.fw_rendercount != 0)
> @@ -284,8 +276,6 @@ static void vlv_force_wake_put(struct drm_i915_private *dev_priv, int fw_engine)
>   
>   	if (fw_engine)
>   		dev_priv->uncore.funcs.force_wake_put(dev_priv, fw_engine);
> -
> -	spin_unlock_irqrestore(&dev_priv->uncore.lock, irqflags);
>   }
>   
>   static void __gen9_gt_force_wake_mt_reset(struct drm_i915_private *dev_priv)
> @@ -380,10 +370,6 @@ __gen9_force_wake_put(struct drm_i915_private *dev_priv, int fw_engine)
>   static void
>   gen9_force_wake_get(struct drm_i915_private *dev_priv, int fw_engine)
>   {
> -	unsigned long irqflags;
> -
> -	spin_lock_irqsave(&dev_priv->uncore.lock, irqflags);
> -
>   	if (FORCEWAKE_RENDER & fw_engine) {
>   		if (dev_priv->uncore.fw_rendercount++ == 0)
>   			dev_priv->uncore.funcs.force_wake_get(dev_priv,
> @@ -401,17 +387,11 @@ gen9_force_wake_get(struct drm_i915_private *dev_priv, int fw_engine)
>   			dev_priv->uncore.funcs.force_wake_get(dev_priv,
>   							FORCEWAKE_BLITTER);
>   	}
> -
> -	spin_unlock_irqrestore(&dev_priv->uncore.lock, irqflags);
>   }
>   
>   static void
>   gen9_force_wake_put(struct drm_i915_private *dev_priv, int fw_engine)
>   {
> -	unsigned long irqflags;
> -
> -	spin_lock_irqsave(&dev_priv->uncore.lock, irqflags);
> -
>   	if (FORCEWAKE_RENDER & fw_engine) {
>   		WARN_ON(dev_priv->uncore.fw_rendercount == 0);
>   		if (--dev_priv->uncore.fw_rendercount == 0)
> @@ -432,8 +412,6 @@ gen9_force_wake_put(struct drm_i915_private *dev_priv, int fw_engine)
>   			dev_priv->uncore.funcs.force_wake_put(dev_priv,
>   							FORCEWAKE_BLITTER);
>   	}
> -
> -	spin_unlock_irqrestore(&dev_priv->uncore.lock, irqflags);
>   }
>   
>   static void gen6_force_wake_timer(unsigned long arg)
> @@ -564,17 +542,20 @@ void gen6_gt_force_wake_get(struct drm_i915_private *dev_priv, int fw_engine)
>   
>   	intel_runtime_pm_get(dev_priv);
>   

I think we need to remove "intel_runtime_pm_get" here?
I see runtime_put is removed from "gen6_gt_force_wake_put"

> -	/* Redirect to Gen9 specific routine */
> -	if (IS_GEN9(dev_priv->dev))
> -		return gen9_force_wake_get(dev_priv, fw_engine);
> -
> -	/* Redirect to VLV specific routine */
> -	if (IS_VALLEYVIEW(dev_priv->dev))
> -		return vlv_force_wake_get(dev_priv, fw_engine);
> +	WARN_ON(!pm_runtime_active(&dev_priv->dev->pdev->dev));
>   
>   	spin_lock_irqsave(&dev_priv->uncore.lock, irqflags);
> -	if (dev_priv->uncore.forcewake_count++ == 0)
> -		dev_priv->uncore.funcs.force_wake_get(dev_priv, FORCEWAKE_ALL);
> +
> +	if (IS_GEN9(dev_priv->dev)) {
> +		gen9_force_wake_get(dev_priv, fw_engine);
> +	} else if (IS_VALLEYVIEW(dev_priv->dev)) {
> +		vlv_force_wake_get(dev_priv, fw_engine);
> +	} else {
> +		if (dev_priv->uncore.forcewake_count++ == 0)
> +			dev_priv->uncore.funcs.force_wake_get(dev_priv,
> +							      FORCEWAKE_ALL);
> +	}
> +
>   	spin_unlock_irqrestore(&dev_priv->uncore.lock, irqflags);
>   }
>   
> @@ -588,31 +569,22 @@ void gen6_gt_force_wake_put(struct drm_i915_private *dev_priv, int fw_engine)
>   	if (!dev_priv->uncore.funcs.force_wake_put)
>   		return;
>   
> -	/* Redirect to Gen9 specific routine */
> +	spin_lock_irqsave(&dev_priv->uncore.lock, irqflags);
> +
>   	if (IS_GEN9(dev_priv->dev)) {
>   		gen9_force_wake_put(dev_priv, fw_engine);
> -		goto out;
> -	}
> -
> -	/* Redirect to VLV specific routine */
> -	if (IS_VALLEYVIEW(dev_priv->dev)) {
> +	} else if (IS_VALLEYVIEW(dev_priv->dev)) {
>   		vlv_force_wake_put(dev_priv, fw_engine);
> -		goto out;
> -	}
> -
> -	spin_lock_irqsave(&dev_priv->uncore.lock, irqflags);
> -	WARN_ON(!dev_priv->uncore.forcewake_count);
> -
> -	if (--dev_priv->uncore.forcewake_count == 0) {
> -		dev_priv->uncore.forcewake_count++;
> -		mod_timer_pinned(&dev_priv->uncore.force_wake_timer,
> -				 jiffies + 1);
> +	} else {
> +		WARN_ON(!dev_priv->uncore.forcewake_count);
> +		if (--dev_priv->uncore.forcewake_count == 0) {
> +			dev_priv->uncore.forcewake_count++;
> +			mod_timer_pinned(&dev_priv->uncore.force_wake_timer,
> +					 jiffies + 1);
> +		}
>   	}
>   
>   	spin_unlock_irqrestore(&dev_priv->uncore.lock, irqflags);
> -
> -out:
> -	intel_runtime_pm_put(dev_priv);
>   }
>   
>   void assert_force_wake_inactive(struct drm_i915_private *dev_priv)

_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx

  reply	other threads:[~2014-12-11 11:42 UTC|newest]

Thread overview: 57+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-12-08 18:27 [PATCH 1/8] drm/i915: Rebalance runtime pm vs forcewake Mika Kuoppala
2014-12-08 18:27 ` [PATCH 2/8] drm/i915: Assert that runtime pm is active on user fw access Mika Kuoppala
2014-12-12 11:39   ` Deepak S [this message]
2014-12-11 11:53     ` Chris Wilson
2014-12-12 11:59       ` Deepak S
2014-12-08 18:27 ` [PATCH 3/8] drm/i915: Skip uncore lock on earlier gens Mika Kuoppala
2014-12-12 11:57   ` Deepak S
2014-12-08 18:27 ` [PATCH 4/8] drm/i915: Reduce duplicated forcewake logic Mika Kuoppala
2014-12-12 12:48   ` Deepak S
2014-12-16 15:26     ` Mika Kuoppala
2014-12-08 18:27 ` [PATCH 5/8] drm/i915: Consolidate forcewake code Mika Kuoppala
2014-12-12 13:13   ` Deepak S
2014-12-08 18:27 ` [PATCH 6/8] drm/i915: Make vlv and chv forcewake put generic Mika Kuoppala
2014-12-12 13:16   ` Deepak S
2014-12-08 18:27 ` [PATCH 7/8] drm/i915: Rename the forcewake get/put functions Mika Kuoppala
2014-12-12 13:19   ` Deepak S
2014-12-08 18:27 ` [PATCH 8/8] drm/i915: Follow the forcewake domains type on hw accessors Mika Kuoppala
2014-12-09 11:46   ` [PATCH 8/8] drm/i915: Enum forcewake domains and domain identifiers Mika Kuoppala
2014-12-09 13:32     ` Jani Nikula
2014-12-09 13:36       ` Daniel Vetter
2014-12-09 15:37       ` Mika Kuoppala
2014-12-12 13:21     ` Deepak S
2014-12-09 23:29   ` [PATCH 8/8] drm/i915: Follow the forcewake domains type on hw accessors shuang.he
2014-12-12 13:20   ` Deepak S
2014-12-12 10:00 ` [PATCH 1/8] drm/i915: Rebalance runtime pm vs forcewake Deepak S
2014-12-11 10:15   ` Chris Wilson
2014-12-12 11:24     ` Deepak S
2014-12-15  8:46     ` Daniel Vetter
2014-12-12 16:22 ` Paulo Zanoni
2014-12-12 16:45   ` Chris Wilson
  -- strict thread matches above, loose matches on Subject: below --
2014-12-09 12:59 [PATCH 00/10] Prep work patches for GPU scheduler John.C.Harrison
2014-12-09 12:59 ` [PATCH 01/10] drm/i915: Rename 'flags' to 'dispatch_flags' for better code reading John.C.Harrison
2014-12-09 12:59 ` [PATCH 02/10] drm/i915: Add missing trace point to LRC execbuff code path John.C.Harrison
2014-12-09 12:59 ` [PATCH 03/10] drm/i915: Updating assorted register and status page definitions John.C.Harrison
2014-12-10 10:40   ` Daniel Vetter
2014-12-10 16:37     ` Dave Gordon
2014-12-09 12:59 ` [PATCH 04/10] drm/i915: FIFO space query code refactor John.C.Harrison
2014-12-10 10:41   ` Daniel Vetter
2014-12-10 18:12     ` [PATCH v2] " Dave Gordon
2015-02-20  9:34       ` Mika Kuoppala
2015-02-23 15:46         ` Daniel Vetter
2014-12-09 12:59 ` [PATCH 05/10] drm/i915: Disable 'get seqno' workaround for VLV John.C.Harrison
2014-12-10 10:42   ` Daniel Vetter
2014-12-10 17:11     ` Dave Gordon
2014-12-15  9:02       ` Daniel Vetter
2014-12-09 12:59 ` [PATCH 06/10] drm/i915: Add extra add_request calls John.C.Harrison
2014-12-10 10:55   ` Daniel Vetter
2014-12-09 12:59 ` [PATCH 07/10] drm/i915: Early alloc request John.C.Harrison
2014-12-09 12:59 ` [PATCH 08/10] drm/i915: Prelude to splitting i915_gem_do_execbuffer in two John.C.Harrison
2014-12-10 10:58   ` Daniel Vetter
2014-12-10 16:33     ` Dave Gordon
2014-12-10 17:15       ` Daniel Vetter
2014-12-16 14:26         ` Dave Gordon
2014-12-17 20:09           ` Daniel Vetter
2014-12-18 14:06             ` Dave Gordon
2014-12-09 12:59 ` [PATCH 09/10] drm/i915: Split i915_dem_do_execbuffer() in half John.C.Harrison
2014-12-09 12:59 ` [PATCH 10/10] drm/i915: Cache ringbuf pointer in request structure John.C.Harrison

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=548AD3EE.7000203@linux.intel.com \
    --to=deepak.s@linux.intel.com \
    --cc=intel-gfx@lists.freedesktop.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.