public inbox for intel-gfx@lists.freedesktop.org
 help / color / mirror / Atom feed
From: Deepak S <deepak.s@linux.intel.com>
To: intel-gfx@lists.freedesktop.org
Subject: Re: [PATCH 5/8] drm/i915: Consolidate forcewake code
Date: Fri, 12 Dec 2014 18:43:49 +0530	[thread overview]
Message-ID: <548AEA0D.9000308@linux.intel.com> (raw)
In-Reply-To: <1418063262-32256-5-git-send-email-mika.kuoppala@intel.com>


On Monday 08 December 2014 11:57 PM, Mika Kuoppala wrote:
> As we now have forcewake domains, take advantage of it
> by putting the differences in gen fw handling in data rather
> than in code.
>
> In past we have opencoded this quite extensively as the fw handling
> is in the fast path. There has also been a lot of cargo-culted
> copy'n'pasting from older gens to newer ones.
>
> Now when the releasing of the forcewake is done by deferred timer,
> it gives chance to consolidate more. Due to the frequency of actual hw
> access being significantly less.
>
> Take advantage of this and generalize the fw handling code
> as much as possible. But we still aim to keep the forcewake sequence
> particularities for each gen intact. So the access pattern
> to fw engines should remain the same.
>
> v2: - s/old_ack/clear_ack (Chris)
>      - s/post_read/posting_read (Chris)
>      - less polite commit msg (Chris)
>
> Signed-off-by: Mika Kuoppala <mika.kuoppala@intel.com>
> ---
>   drivers/gpu/drm/i915/i915_debugfs.c |   7 +-
>   drivers/gpu/drm/i915/i915_drv.h     |   7 +
>   drivers/gpu/drm/i915/intel_uncore.c | 469 ++++++++++++++++--------------------
>   3 files changed, 212 insertions(+), 271 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/i915_debugfs.c b/drivers/gpu/drm/i915/i915_debugfs.c
> index 5cc838b..93390c9 100644
> --- a/drivers/gpu/drm/i915/i915_debugfs.c
> +++ b/drivers/gpu/drm/i915/i915_debugfs.c
> @@ -1241,17 +1241,12 @@ static int i915_gen6_forcewake_count_info(struct seq_file *m, void *data)
>   	struct drm_device *dev = node->minor->dev;
>   	struct drm_i915_private *dev_priv = dev->dev_private;
>   	struct intel_uncore_forcewake_domain *fw_domain;
> -	const char *domain_names[] = {
> -		"render",
> -		"blitter",
> -		"media",
> -	};
>   	int i;
>   
>   	spin_lock_irq(&dev_priv->uncore.lock);
>   	for_each_fw_domain(fw_domain, dev_priv, i) {
>   		seq_printf(m, "%s.wake_count = %u\n",
> -			   domain_names[i],
> +			   intel_uncore_forcewake_domain_to_str(i),
>   			   fw_domain->wake_count);
>   	}
>   	spin_unlock_irq(&dev_priv->uncore.lock);
> diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
> index 410558a..4263084 100644
> --- a/drivers/gpu/drm/i915/i915_drv.h
> +++ b/drivers/gpu/drm/i915/i915_drv.h
> @@ -575,6 +575,12 @@ struct intel_uncore {
>   		int id;
>   		unsigned wake_count;
>   		struct timer_list timer;
> +		u32 reg_set;
> +		u32 val_set;
> +		u32 val_clear;
> +		u32 reg_ack;
> +		u32 reg_post;
> +		u32 val_reset;
>   	} fw_domain[FW_DOMAIN_ID_COUNT];
>   #define FORCEWAKE_RENDER	(1 << FW_DOMAIN_ID_RENDER)
>   #define FORCEWAKE_BLITTER	(1 << FW_DOMAIN_ID_BLITTER)
> @@ -2443,6 +2449,7 @@ extern void intel_uncore_init(struct drm_device *dev);
>   extern void intel_uncore_check_errors(struct drm_device *dev);
>   extern void intel_uncore_fini(struct drm_device *dev);
>   extern void intel_uncore_forcewake_reset(struct drm_device *dev, bool restore);
> +const char *intel_uncore_forcewake_domain_to_str(const int domain_id);
>   
>   void
>   i915_enable_pipestat(struct drm_i915_private *dev_priv, enum pipe pipe,
> diff --git a/drivers/gpu/drm/i915/intel_uncore.c b/drivers/gpu/drm/i915/intel_uncore.c
> index 85e46b0..e883790 100644
> --- a/drivers/gpu/drm/i915/intel_uncore.c
> +++ b/drivers/gpu/drm/i915/intel_uncore.c
> @@ -42,6 +42,26 @@
>   
>   #define __raw_posting_read(dev_priv__, reg__) (void)__raw_i915_read32(dev_priv__, reg__)
>   
> +static const char * const forcewake_domain_names[] = {
> +	"render",
> +	"blitter",
> +	"media",
> +};
> +
> +const char *
> +intel_uncore_forcewake_domain_to_str(const int id)
> +{
> +	BUILD_BUG_ON((sizeof(forcewake_domain_names)/sizeof(const char *)) !=
> +		     FW_DOMAIN_ID_COUNT);
> +
> +	if (id >= 0 && id < FW_DOMAIN_ID_COUNT)
> +		return forcewake_domain_names[id];
> +
> +	WARN_ON(id);
> +
> +	return "unknown";
> +}
> +
>   static void
>   assert_device_not_suspended(struct drm_i915_private *dev_priv)
>   {
> @@ -49,73 +69,123 @@ assert_device_not_suspended(struct drm_i915_private *dev_priv)
>   		  "Device suspended\n");
>   }
>   
> -static void __gen6_gt_wait_for_thread_c0(struct drm_i915_private *dev_priv)
> +static inline void
> +fw_domain_reset(const struct intel_uncore_forcewake_domain *d)
>   {
> -	/* w/a for a sporadic read returning 0 by waiting for the GT
> -	 * thread to wake up.
> -	 */
> -	if (wait_for_atomic_us((__raw_i915_read32(dev_priv, GEN6_GT_THREAD_STATUS_REG) &
> -				GEN6_GT_THREAD_STATUS_CORE_MASK) == 0, 500))
> -		DRM_ERROR("GT thread status wait timed out\n");
> +	__raw_i915_write32(d->i915, d->reg_set, d->val_reset);
>   }
>   
> -static void __gen6_gt_force_wake_reset(struct drm_i915_private *dev_priv)
> +static inline void
> +fw_domain_arm_timer(struct intel_uncore_forcewake_domain *d)
>   {
> -	__raw_i915_write32(dev_priv, FORCEWAKE, 0);
> -	/* something from same cacheline, but !FORCEWAKE */
> -	__raw_posting_read(dev_priv, ECOBUS);
> +	mod_timer_pinned(&d->timer, jiffies + 1);
>   }
>   
> -static void __gen6_gt_force_wake_get(struct drm_i915_private *dev_priv,
> -				     int fw_engine)
> +static inline void
> +fw_domain_wait_ack_clear(const struct intel_uncore_forcewake_domain *d)
>   {
> -	if (wait_for_atomic((__raw_i915_read32(dev_priv, FORCEWAKE_ACK) & 1) == 0,
> +	if (wait_for_atomic((__raw_i915_read32(d->i915, d->reg_ack) &
> +			     FORCEWAKE_KERNEL) == 0,
>   			    FORCEWAKE_ACK_TIMEOUT_MS))
> -		DRM_ERROR("Timed out waiting for forcewake old ack to clear.\n");
> +		DRM_ERROR("%s: timed out waiting for forcewake ack to clear.\n",
> +			  intel_uncore_forcewake_domain_to_str(d->id));
> +}
>   
> -	__raw_i915_write32(dev_priv, FORCEWAKE, 1);
> -	/* something from same cacheline, but !FORCEWAKE */
> -	__raw_posting_read(dev_priv, ECOBUS);
> +static inline void
> +fw_domain_get(const struct intel_uncore_forcewake_domain *d)
> +{
> +	__raw_i915_write32(d->i915, d->reg_set, d->val_set);
> +}
>   
> -	if (wait_for_atomic((__raw_i915_read32(dev_priv, FORCEWAKE_ACK) & 1),
> +static inline void
> +fw_domain_wait_ack(const struct intel_uncore_forcewake_domain *d)
> +{
> +	if (wait_for_atomic((__raw_i915_read32(d->i915, d->reg_ack) &
> +			     FORCEWAKE_KERNEL),
>   			    FORCEWAKE_ACK_TIMEOUT_MS))
> -		DRM_ERROR("Timed out waiting for forcewake to ack request.\n");
> +		DRM_ERROR("%s: timed out waiting for forcewake ack request.\n",
> +			  intel_uncore_forcewake_domain_to_str(d->id));
> +}
>   
> -	/* WaRsForcewakeWaitTC0:snb */
> -	__gen6_gt_wait_for_thread_c0(dev_priv);
> +static inline void
> +fw_domain_put(const struct intel_uncore_forcewake_domain *d)
> +{
> +	__raw_i915_write32(d->i915, d->reg_set, d->val_clear);
>   }
>   
> -static void __gen7_gt_force_wake_mt_reset(struct drm_i915_private *dev_priv)
> +static inline void
> +fw_domain_posting_read(const struct intel_uncore_forcewake_domain *d)
>   {
> -	__raw_i915_write32(dev_priv, FORCEWAKE_MT, _MASKED_BIT_DISABLE(0xffff));
> -	/* something from same cacheline, but !FORCEWAKE_MT */
> -	__raw_posting_read(dev_priv, ECOBUS);
> +	/* something from same cacheline, but not from the set register */
> +	if (d->reg_post)
> +		__raw_posting_read(d->i915, d->reg_post);
>   }
>   
> -static void __gen7_gt_force_wake_mt_get(struct drm_i915_private *dev_priv,
> -					int fw_engine)
> +static void
> +fw_domains_get(struct drm_i915_private *dev_priv, int fw_domains)
>   {
> -	u32 forcewake_ack;
> +	struct intel_uncore_forcewake_domain *d;
> +	int id;
>   
> -	if (IS_HASWELL(dev_priv->dev) || IS_BROADWELL(dev_priv->dev))
> -		forcewake_ack = FORCEWAKE_ACK_HSW;
> -	else
> -		forcewake_ack = FORCEWAKE_MT_ACK;
> +	for_each_fw_domain_mask(d, fw_domains, dev_priv, id) {
> +		fw_domain_wait_ack_clear(d);
> +		fw_domain_get(d);
> +		fw_domain_posting_read(d);
> +		fw_domain_wait_ack(d);
> +	}
> +}
>   
> -	if (wait_for_atomic((__raw_i915_read32(dev_priv, forcewake_ack) & FORCEWAKE_KERNEL) == 0,
> -			    FORCEWAKE_ACK_TIMEOUT_MS))
> -		DRM_ERROR("Timed out waiting for forcewake old ack to clear.\n");
> +static void
> +fw_domains_put(struct drm_i915_private *dev_priv, int fw_domains)
> +{
> +	struct intel_uncore_forcewake_domain *d;
> +	int id;
>   
> -	__raw_i915_write32(dev_priv, FORCEWAKE_MT,
> -			   _MASKED_BIT_ENABLE(FORCEWAKE_KERNEL));
> -	/* something from same cacheline, but !FORCEWAKE_MT */
> -	__raw_posting_read(dev_priv, ECOBUS);
> +	for_each_fw_domain_mask(d, fw_domains, dev_priv, id)
> +		fw_domain_put(d);
> +}
>   
> -	if (wait_for_atomic((__raw_i915_read32(dev_priv, forcewake_ack) & FORCEWAKE_KERNEL),
> -			    FORCEWAKE_ACK_TIMEOUT_MS))
> -		DRM_ERROR("Timed out waiting for forcewake to ack request.\n");
> +static void
> +fw_domains_posting_read(struct drm_i915_private *dev_priv)
> +{
> +	struct intel_uncore_forcewake_domain *d;
> +	int id;
> +
> +	/* No need to do for all, just do for first found */
> +	for_each_fw_domain(d, dev_priv, id) {
> +		fw_domain_posting_read(d);
> +		break;
> +	}
> +}
> +
> +static void
> +fw_domains_reset(struct drm_i915_private *dev_priv, const unsigned fw_domains)
> +{
> +	struct intel_uncore_forcewake_domain *d;
> +	int id;
> +
> +	for_each_fw_domain_mask(d, fw_domains, dev_priv, id)
> +		fw_domain_reset(d);
> +
> +	fw_domains_posting_read(dev_priv);
> +}
> +
> +static void __gen6_gt_wait_for_thread_c0(struct drm_i915_private *dev_priv)
> +{
> +	/* w/a for a sporadic read returning 0 by waiting for the GT
> +	 * thread to wake up.
> +	 */
> +	if (wait_for_atomic_us((__raw_i915_read32(dev_priv, GEN6_GT_THREAD_STATUS_REG) &
> +				GEN6_GT_THREAD_STATUS_CORE_MASK) == 0, 500))
> +		DRM_ERROR("GT thread status wait timed out\n");
> +}
>   
> -	/* WaRsForcewakeWaitTC0:ivb,hsw */
> +static void fw_domains_get_with_thread_status(struct drm_i915_private *dev_priv,
> +					      int fw_domains)
> +{
> +	fw_domains_get(dev_priv, fw_domains);
> +
> +	/* WaRsForcewakeWaitTC0:snb,ivb,hsw,bdw,vlv */
>   	__gen6_gt_wait_for_thread_c0(dev_priv);
>   }
>   
> @@ -128,27 +198,13 @@ static void gen6_gt_check_fifodbg(struct drm_i915_private *dev_priv)
>   		__raw_i915_write32(dev_priv, GTFIFODBG, gtfifodbg);
>   }
>   
> -static void __gen6_gt_force_wake_put(struct drm_i915_private *dev_priv,
> -				     int fw_engine)
> +static void fw_domains_put_with_fifo(struct drm_i915_private *dev_priv,
> +				     int fw_domains)
>   {
> -	__raw_i915_write32(dev_priv, FORCEWAKE, 0);
> -	/* something from same cacheline, but !FORCEWAKE */
> -	__raw_posting_read(dev_priv, ECOBUS);
> +	fw_domains_put(dev_priv, fw_domains);
>   	gen6_gt_check_fifodbg(dev_priv);
>   }
>   
> -static void __gen7_gt_force_wake_mt_put(struct drm_i915_private *dev_priv,
> -					int fw_engine)
> -{
> -	__raw_i915_write32(dev_priv, FORCEWAKE_MT,
> -			   _MASKED_BIT_DISABLE(FORCEWAKE_KERNEL));
> -	/* something from same cacheline, but !FORCEWAKE_MT */
> -	__raw_posting_read(dev_priv, ECOBUS);
> -
> -	if (IS_GEN7(dev_priv->dev))
> -		gen6_gt_check_fifodbg(dev_priv);
> -}
> -
>   static int __gen6_gt_wait_for_fifo(struct drm_i915_private *dev_priv)
>   {
>   	int ret = 0;
> @@ -176,165 +232,16 @@ static int __gen6_gt_wait_for_fifo(struct drm_i915_private *dev_priv)
>   	return ret;
>   }
>   
> -static void vlv_force_wake_reset(struct drm_i915_private *dev_priv)
> -{
> -	__raw_i915_write32(dev_priv, FORCEWAKE_VLV,
> -			   _MASKED_BIT_DISABLE(0xffff));
> -	__raw_i915_write32(dev_priv, FORCEWAKE_MEDIA_VLV,
> -			   _MASKED_BIT_DISABLE(0xffff));
> -	/* something from same cacheline, but !FORCEWAKE_VLV */
> -	__raw_posting_read(dev_priv, FORCEWAKE_ACK_VLV);
> -}
> -
> -static void __vlv_force_wake_get(struct drm_i915_private *dev_priv,
> -				 int fw_engine)
> -{
> -	/* Check for Render Engine */
> -	if (FORCEWAKE_RENDER & fw_engine) {
> -		if (wait_for_atomic((__raw_i915_read32(dev_priv,
> -						FORCEWAKE_ACK_VLV) &
> -						FORCEWAKE_KERNEL) == 0,
> -					FORCEWAKE_ACK_TIMEOUT_MS))
> -			DRM_ERROR("Timed out: Render forcewake old ack to clear.\n");
> -
> -		__raw_i915_write32(dev_priv, FORCEWAKE_VLV,
> -				   _MASKED_BIT_ENABLE(FORCEWAKE_KERNEL));
> -
> -		if (wait_for_atomic((__raw_i915_read32(dev_priv,
> -						FORCEWAKE_ACK_VLV) &
> -						FORCEWAKE_KERNEL),
> -					FORCEWAKE_ACK_TIMEOUT_MS))
> -			DRM_ERROR("Timed out: waiting for Render to ack.\n");
> -	}
> -
> -	/* Check for Media Engine */
> -	if (FORCEWAKE_MEDIA & fw_engine) {
> -		if (wait_for_atomic((__raw_i915_read32(dev_priv,
> -						FORCEWAKE_ACK_MEDIA_VLV) &
> -						FORCEWAKE_KERNEL) == 0,
> -					FORCEWAKE_ACK_TIMEOUT_MS))
> -			DRM_ERROR("Timed out: Media forcewake old ack to clear.\n");
> -
> -		__raw_i915_write32(dev_priv, FORCEWAKE_MEDIA_VLV,
> -				   _MASKED_BIT_ENABLE(FORCEWAKE_KERNEL));
> -
> -		if (wait_for_atomic((__raw_i915_read32(dev_priv,
> -						FORCEWAKE_ACK_MEDIA_VLV) &
> -						FORCEWAKE_KERNEL),
> -					FORCEWAKE_ACK_TIMEOUT_MS))
> -			DRM_ERROR("Timed out: waiting for media to ack.\n");
> -	}
> -}
> -
>   static void __vlv_force_wake_put(struct drm_i915_private *dev_priv,
>   				 int fw_engine)
>   {
> -	/* Check for Render Engine */
> -	if (FORCEWAKE_RENDER & fw_engine)
> -		__raw_i915_write32(dev_priv, FORCEWAKE_VLV,
> -					_MASKED_BIT_DISABLE(FORCEWAKE_KERNEL));
> +	fw_domains_put(dev_priv, fw_engine);
> +	fw_domains_posting_read(dev_priv);
>   
> -
> -	/* Check for Media Engine */
> -	if (FORCEWAKE_MEDIA & fw_engine)
> -		__raw_i915_write32(dev_priv, FORCEWAKE_MEDIA_VLV,
> -				_MASKED_BIT_DISABLE(FORCEWAKE_KERNEL));
> -
> -	/* something from same cacheline, but !FORCEWAKE_VLV */
> -	__raw_posting_read(dev_priv, FORCEWAKE_ACK_VLV);
>   	if (!IS_CHERRYVIEW(dev_priv->dev))
>   		gen6_gt_check_fifodbg(dev_priv);
>   }
>   
> -static void __gen9_gt_force_wake_mt_reset(struct drm_i915_private *dev_priv)
> -{
> -	__raw_i915_write32(dev_priv, FORCEWAKE_RENDER_GEN9,
> -			_MASKED_BIT_DISABLE(0xffff));
> -
> -	__raw_i915_write32(dev_priv, FORCEWAKE_MEDIA_GEN9,
> -			_MASKED_BIT_DISABLE(0xffff));
> -
> -	__raw_i915_write32(dev_priv, FORCEWAKE_BLITTER_GEN9,
> -			_MASKED_BIT_DISABLE(0xffff));
> -}
> -
> -static void
> -__gen9_force_wake_get(struct drm_i915_private *dev_priv, int fw_engine)
> -{
> -	/* Check for Render Engine */
> -	if (FORCEWAKE_RENDER & fw_engine) {
> -		if (wait_for_atomic((__raw_i915_read32(dev_priv,
> -						FORCEWAKE_ACK_RENDER_GEN9) &
> -						FORCEWAKE_KERNEL) == 0,
> -					FORCEWAKE_ACK_TIMEOUT_MS))
> -			DRM_ERROR("Timed out: Render forcewake old ack to clear.\n");
> -
> -		__raw_i915_write32(dev_priv, FORCEWAKE_RENDER_GEN9,
> -				   _MASKED_BIT_ENABLE(FORCEWAKE_KERNEL));
> -
> -		if (wait_for_atomic((__raw_i915_read32(dev_priv,
> -						FORCEWAKE_ACK_RENDER_GEN9) &
> -						FORCEWAKE_KERNEL),
> -					FORCEWAKE_ACK_TIMEOUT_MS))
> -			DRM_ERROR("Timed out: waiting for Render to ack.\n");
> -	}
> -
> -	/* Check for Media Engine */
> -	if (FORCEWAKE_MEDIA & fw_engine) {
> -		if (wait_for_atomic((__raw_i915_read32(dev_priv,
> -						FORCEWAKE_ACK_MEDIA_GEN9) &
> -						FORCEWAKE_KERNEL) == 0,
> -					FORCEWAKE_ACK_TIMEOUT_MS))
> -			DRM_ERROR("Timed out: Media forcewake old ack to clear.\n");
> -
> -		__raw_i915_write32(dev_priv, FORCEWAKE_MEDIA_GEN9,
> -				   _MASKED_BIT_ENABLE(FORCEWAKE_KERNEL));
> -
> -		if (wait_for_atomic((__raw_i915_read32(dev_priv,
> -						FORCEWAKE_ACK_MEDIA_GEN9) &
> -						FORCEWAKE_KERNEL),
> -					FORCEWAKE_ACK_TIMEOUT_MS))
> -			DRM_ERROR("Timed out: waiting for Media to ack.\n");
> -	}
> -
> -	/* Check for Blitter Engine */
> -	if (FORCEWAKE_BLITTER & fw_engine) {
> -		if (wait_for_atomic((__raw_i915_read32(dev_priv,
> -						FORCEWAKE_ACK_BLITTER_GEN9) &
> -						FORCEWAKE_KERNEL) == 0,
> -					FORCEWAKE_ACK_TIMEOUT_MS))
> -			DRM_ERROR("Timed out: Blitter forcewake old ack to clear.\n");
> -
> -		__raw_i915_write32(dev_priv, FORCEWAKE_BLITTER_GEN9,
> -				   _MASKED_BIT_ENABLE(FORCEWAKE_KERNEL));
> -
> -		if (wait_for_atomic((__raw_i915_read32(dev_priv,
> -						FORCEWAKE_ACK_BLITTER_GEN9) &
> -						FORCEWAKE_KERNEL),
> -					FORCEWAKE_ACK_TIMEOUT_MS))
> -			DRM_ERROR("Timed out: waiting for Blitter to ack.\n");
> -	}
> -}
> -
> -static void
> -__gen9_force_wake_put(struct drm_i915_private *dev_priv, int fw_engine)
> -{
> -	/* Check for Render Engine */
> -	if (FORCEWAKE_RENDER & fw_engine)
> -		__raw_i915_write32(dev_priv, FORCEWAKE_RENDER_GEN9,
> -				_MASKED_BIT_DISABLE(FORCEWAKE_KERNEL));
> -
> -	/* Check for Media Engine */
> -	if (FORCEWAKE_MEDIA & fw_engine)
> -		__raw_i915_write32(dev_priv, FORCEWAKE_MEDIA_GEN9,
> -				_MASKED_BIT_DISABLE(FORCEWAKE_KERNEL));
> -
> -	/* Check for Blitter Engine */
> -	if (FORCEWAKE_BLITTER & fw_engine)
> -		__raw_i915_write32(dev_priv, FORCEWAKE_BLITTER_GEN9,
> -				_MASKED_BIT_DISABLE(FORCEWAKE_KERNEL));
> -}
> -
>   static void gen6_force_wake_timer(unsigned long arg)
>   {
>   	struct intel_uncore_forcewake_domain *domain = (void *)arg;
> @@ -358,28 +265,20 @@ void intel_uncore_forcewake_reset(struct drm_device *dev, bool restore)
>   	struct intel_uncore_forcewake_domain *domain;
>   	int id;
>   
> -	spin_lock_irqsave(&dev_priv->uncore.lock, irqflags);
>   	/* Hold uncore.lock across reset to prevent any register access
>   	 * with forcewake not set correctly
>   	 */
> +	spin_lock_irqsave(&dev_priv->uncore.lock, irqflags);
>   
>   	for_each_fw_domain(domain, dev_priv, id)
>   		if (domain->wake_count)
>   			fw |= 1 << id;
>   
> +	/* Don't stop the timer, just turn domains off for reset */
>   	if (fw)
>   		dev_priv->uncore.funcs.force_wake_put(dev_priv, fw);
>   
> -	if (IS_VALLEYVIEW(dev))
> -		vlv_force_wake_reset(dev_priv);
> -	else if (IS_GEN6(dev) || IS_GEN7(dev))
> -		__gen6_gt_force_wake_reset(dev_priv);
> -
> -	if (IS_IVYBRIDGE(dev) || IS_HASWELL(dev) || IS_BROADWELL(dev))
> -		__gen7_gt_force_wake_mt_reset(dev_priv);
> -
> -	if (IS_GEN9(dev))
> -		__gen9_gt_force_wake_mt_reset(dev_priv);
> +	fw_domains_reset(dev_priv, FORCEWAKE_ALL);
>   
>   	if (restore) { /* If reset with a user forcewake, try to restore */
>   		if (fw)
> @@ -488,7 +387,7 @@ void gen6_gt_force_wake_put(struct drm_i915_private *dev_priv,
>   			continue;
>   
>   		domain->wake_count++;
> -		mod_timer_pinned(&domain->timer, jiffies + 1);
> +		fw_domain_arm_timer(domain);
>   	}
>   
>   	spin_unlock_irqrestore(&dev_priv->uncore.lock, irqflags);
> @@ -497,12 +396,12 @@ void gen6_gt_force_wake_put(struct drm_i915_private *dev_priv,
>   void assert_force_wake_inactive(struct drm_i915_private *dev_priv)
>   {
>   	struct intel_uncore_forcewake_domain *domain;
> -	int i;
> +	int id;
>   
>   	if (!dev_priv->uncore.funcs.force_wake_get)
>   		return;
>   
> -	for_each_fw_domain(domain, dev_priv, i)
> +	for_each_fw_domain(domain, dev_priv, id)
>   		WARN_ON(domain->wake_count);
>   }
>   
> @@ -673,19 +572,19 @@ static inline void __force_wake_get(struct drm_i915_private *dev_priv,
>   				    unsigned fw_domains)
>   {
>   	struct intel_uncore_forcewake_domain *domain;
> -	int i;
> +	int id;
>   
>   	if (WARN_ON(!fw_domains))
>   		return;
>   
>   	/* Ideally GCC would be constant-fold and eliminate this loop */
> -	for_each_fw_domain_mask(domain, fw_domains, dev_priv, i) {
> +	for_each_fw_domain_mask(domain, fw_domains, dev_priv, id) {
>   		if (domain->wake_count)
> -			fw_domains &= ~(1 << i);
> +			fw_domains &= ~(1 << id);
>   		else
>   			domain->wake_count++;
>   
> -		mod_timer_pinned(&domain->timer, jiffies + 1);
> +		fw_domain_arm_timer(domain);
>   	}
>   
>   	if (fw_domains)
> @@ -1001,27 +900,75 @@ do { \
>   	dev_priv->uncore.funcs.mmio_readq = x##_read64; \
>   } while (0)
>   
> +
> +static void fw_domain_init(struct drm_i915_private *dev_priv,
> +			   u32 domain_id, u32 reg_set, u32 reg_ack)
> +{
> +	struct intel_uncore_forcewake_domain *d;
> +
> +	if (WARN_ON(domain_id >= FW_DOMAIN_ID_COUNT))
> +		return;
> +
> +	d = &dev_priv->uncore.fw_domain[domain_id];
> +
> +	d->reg_set = reg_set;
> +	d->reg_ack = reg_ack;
> +
> +	if (IS_GEN6(dev_priv)) {
> +		d->val_reset = 0;
> +		d->val_set = FORCEWAKE_KERNEL;
> +		d->val_clear = 0;
> +	} else {
> +		d->val_reset = _MASKED_BIT_DISABLE(0xffff);
> +		d->val_set = _MASKED_BIT_ENABLE(FORCEWAKE_KERNEL);
> +		d->val_clear = _MASKED_BIT_DISABLE(FORCEWAKE_KERNEL);
> +	}
> +
> +	if (IS_VALLEYVIEW(dev_priv))
> +		d->reg_post = FORCEWAKE_ACK_VLV;
> +	else if (IS_GEN6(dev_priv) || IS_GEN7(dev_priv))
> +		d->reg_post = ECOBUS;
> +	else
> +		d->reg_post = 0;
> +
> +	d->i915 = dev_priv;
> +	d->id = domain_id;
> +
> +	setup_timer(&d->timer, gen6_force_wake_timer, (unsigned long)d);
> +
> +	dev_priv->uncore.fw_domains |= (1 << domain_id);
> +}
> +
>   void intel_uncore_init(struct drm_device *dev)
>   {
>   	struct drm_i915_private *dev_priv = dev->dev_private;
> -	struct intel_uncore_forcewake_domain *domain;
> -	int i;
>   
>   	__intel_uncore_early_sanitize(dev, false);
>   
>   	if (IS_GEN9(dev)) {
> -		dev_priv->uncore.funcs.force_wake_get = __gen9_force_wake_get;
> -		dev_priv->uncore.funcs.force_wake_put = __gen9_force_wake_put;
> -		dev_priv->uncore.fw_domains = FORCEWAKE_RENDER |
> -			FORCEWAKE_BLITTER | FORCEWAKE_MEDIA;
> +		dev_priv->uncore.funcs.force_wake_get = fw_domains_get;
> +		dev_priv->uncore.funcs.force_wake_put = fw_domains_put;
> +		fw_domain_init(dev_priv, FW_DOMAIN_ID_RENDER,
> +			       FORCEWAKE_RENDER_GEN9,
> +			       FORCEWAKE_ACK_RENDER_GEN9);
> +		fw_domain_init(dev_priv, FW_DOMAIN_ID_BLITTER,
> +			       FORCEWAKE_BLITTER_GEN9,
> +			       FORCEWAKE_ACK_BLITTER_GEN9);
> +		fw_domain_init(dev_priv, FW_DOMAIN_ID_MEDIA,
> +			       FORCEWAKE_MEDIA_GEN9, FORCEWAKE_ACK_MEDIA_GEN9);
>   	} else if (IS_VALLEYVIEW(dev)) {
> -		dev_priv->uncore.funcs.force_wake_get = __vlv_force_wake_get;
> +		dev_priv->uncore.funcs.force_wake_get = fw_domains_get;
>   		dev_priv->uncore.funcs.force_wake_put = __vlv_force_wake_put;
> -		dev_priv->uncore.fw_domains = FORCEWAKE_RENDER | FORCEWAKE_MEDIA;
> +		fw_domain_init(dev_priv, FW_DOMAIN_ID_RENDER,
> +			       FORCEWAKE_VLV, FORCEWAKE_ACK_VLV);
> +		fw_domain_init(dev_priv, FW_DOMAIN_ID_MEDIA,
> +			       FORCEWAKE_MEDIA_VLV, FORCEWAKE_ACK_MEDIA_VLV);
>   	} else if (IS_HASWELL(dev) || IS_BROADWELL(dev)) {
> -		dev_priv->uncore.funcs.force_wake_get = __gen7_gt_force_wake_mt_get;
> -		dev_priv->uncore.funcs.force_wake_put = __gen7_gt_force_wake_mt_put;
> -		dev_priv->uncore.fw_domains = FORCEWAKE_RENDER;
> +		dev_priv->uncore.funcs.force_wake_get =
> +			fw_domains_get_with_thread_status;
> +		dev_priv->uncore.funcs.force_wake_put = fw_domains_put;
> +		fw_domain_init(dev_priv, FW_DOMAIN_ID_RENDER,
> +			       FORCEWAKE_MT, FORCEWAKE_ACK_HSW);
>   	} else if (IS_IVYBRIDGE(dev)) {
>   		u32 ecobus;
>   
> @@ -1034,40 +981,32 @@ void intel_uncore_init(struct drm_device *dev)
>   		 * (correctly) interpreted by the test below as MT
>   		 * forcewake being disabled.
>   		 */
> +		dev_priv->uncore.funcs.force_wake_get =
> +			fw_domains_get_with_thread_status;
> +		dev_priv->uncore.funcs.force_wake_put =
> +			fw_domains_put_with_fifo;
> +
> +		fw_domain_init(dev_priv, FW_DOMAIN_ID_RENDER,
> +			       FORCEWAKE_MT, FORCEWAKE_MT_ACK);
>   		mutex_lock(&dev->struct_mutex);
> -		__gen7_gt_force_wake_mt_get(dev_priv, FORCEWAKE_ALL);
> +		fw_domains_get_with_thread_status(dev_priv, FORCEWAKE_ALL);
>   		ecobus = __raw_i915_read32(dev_priv, ECOBUS);
> -		__gen7_gt_force_wake_mt_put(dev_priv, FORCEWAKE_ALL);
> +		fw_domains_put_with_fifo(dev_priv, FORCEWAKE_ALL);
>   		mutex_unlock(&dev->struct_mutex);
>   
> -		if (ecobus & FORCEWAKE_MT_ENABLE) {
> -			dev_priv->uncore.funcs.force_wake_get =
> -				__gen7_gt_force_wake_mt_get;
> -			dev_priv->uncore.funcs.force_wake_put =
> -				__gen7_gt_force_wake_mt_put;
> -		} else {
> +		if (!(ecobus & FORCEWAKE_MT_ENABLE)) {
>   			DRM_INFO("No MT forcewake available on Ivybridge, this can result in issues\n");
>   			DRM_INFO("when using vblank-synced partial screen updates.\n");
> -			dev_priv->uncore.funcs.force_wake_get =
> -				__gen6_gt_force_wake_get;
> -			dev_priv->uncore.funcs.force_wake_put =
> -				__gen6_gt_force_wake_put;
> +			fw_domain_init(dev_priv, FW_DOMAIN_ID_RENDER,
> +				       FORCEWAKE, FORCEWAKE_ACK);
>   		}
> -		dev_priv->uncore.fw_domains = FORCEWAKE_RENDER;
>   	} else if (IS_GEN6(dev)) {
>   		dev_priv->uncore.funcs.force_wake_get =
> -			__gen6_gt_force_wake_get;
> +			fw_domains_get_with_thread_status;
>   		dev_priv->uncore.funcs.force_wake_put =
> -			__gen6_gt_force_wake_put;
> -		dev_priv->uncore.fw_domains = FORCEWAKE_RENDER;
> -	}
> -
> -	for_each_fw_domain(domain, dev_priv, i) {
> -		domain->i915 = dev_priv;
> -		domain->id = i;
> -
> -		setup_timer(&domain->timer, gen6_force_wake_timer,
> -			    (unsigned long)domain);
> +			fw_domains_put_with_fifo;
> +		fw_domain_init(dev_priv, FW_DOMAIN_ID_RENDER,
> +			       FORCEWAKE, FORCEWAKE_ACK);
>   	}
>   
>   	switch (INTEL_INFO(dev)->gen) {
>

Looks fine
Reviewed-by: Deepak S <deepak.s@linux.intel.com>


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

  reply	other threads:[~2014-12-11 13:17 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
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 [this message]
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=548AEA0D.9000308@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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox