public inbox for intel-gfx@lists.freedesktop.org
 help / color / mirror / Atom feed
* [PATCH 1/2] drm/i915: Reorganize uncore_init
@ 2014-04-06 19:54 Ben Widawsky
  2014-04-06 19:54 ` [PATCH 2/2] drm/i915/bdw: Create a state setup hook Ben Widawsky
  0 siblings, 1 reply; 4+ messages in thread
From: Ben Widawsky @ 2014-04-06 19:54 UTC (permalink / raw)
  To: Intel GFX

Right now we have two separate tables for doing platform specific init.
With one table it's a lot clearer exactly where new things need to go
(which I'll be doing in a subsequent patch).

There is no intended functional change here. Only cleanup.

Signed-off-by: Ben Widawsky <ben@bwidawsk.net>
---
 drivers/gpu/drm/i915/intel_uncore.c | 134 ++++++++++++++++++++----------------
 1 file changed, 74 insertions(+), 60 deletions(-)

diff --git a/drivers/gpu/drm/i915/intel_uncore.c b/drivers/gpu/drm/i915/intel_uncore.c
index 76dc185..e206c41 100644
--- a/drivers/gpu/drm/i915/intel_uncore.c
+++ b/drivers/gpu/drm/i915/intel_uncore.c
@@ -739,6 +739,47 @@ __gen4_write(64)
 #undef REG_WRITE_FOOTER
 #undef REG_WRITE_HEADER
 
+
+static void ivybridge_setup_forcewake(struct drm_device *dev)
+{
+	struct drm_i915_private *dev_priv = dev->dev_private;
+	u32 ecobus;
+
+	/* IVB configs may use multi-threaded forcewake */
+
+	/* A small trick here - if the bios hasn't configured MT forcewake, and
+	 * if the device is in RC6, then force_wake_mt_get will not wake the
+	 * device and the ECOBUS read will return zero. Which will be
+	 * (correctly) interpreted by the test below as MT forcewake being
+	 * disabled.
+	 */
+	mutex_lock(&dev->struct_mutex);
+	__gen7_gt_force_wake_mt_get(dev_priv, FORCEWAKE_ALL);
+	ecobus = __raw_i915_read32(dev_priv, ECOBUS);
+	__gen7_gt_force_wake_mt_put(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 {
+		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;
+	}
+}
+
+#define gen6_setup_read_mmio(dev_priv) do {				\
+		(dev_priv)->uncore.funcs.mmio_readb  = gen6_read8;	\
+		(dev_priv)->uncore.funcs.mmio_readw  = gen6_read16;	\
+		(dev_priv)->uncore.funcs.mmio_readl  = gen6_read32;	\
+		(dev_priv)->uncore.funcs.mmio_readq  = gen6_read64;	\
+} while (0)
+
+/* You can use this function to initialize gen specific function pointers
+ * that need to be initialized early.
+ */
 void intel_uncore_init(struct drm_device *dev)
 {
 	struct drm_i915_private *dev_priv = dev->dev_private;
@@ -748,87 +789,60 @@ void intel_uncore_init(struct drm_device *dev)
 
 	intel_uncore_early_sanitize(dev);
 
-	if (IS_VALLEYVIEW(dev)) {
-		dev_priv->uncore.funcs.force_wake_get = __vlv_force_wake_get;
-		dev_priv->uncore.funcs.force_wake_put = __vlv_force_wake_put;
-	} else if (IS_HASWELL(dev) || IS_GEN8(dev)) {
+	switch (INTEL_INFO(dev)->gen) {
+	case 8:
 		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 (IS_IVYBRIDGE(dev)) {
-		u32 ecobus;
-
-		/* IVB configs may use multi-threaded forcewake */
-
-		/* A small trick here - if the bios hasn't configured
-		 * MT forcewake, and if the device is in RC6, then
-		 * force_wake_mt_get will not wake the device and the
-		 * ECOBUS read will return zero. Which will be
-		 * (correctly) interpreted by the test below as MT
-		 * forcewake being disabled.
-		 */
-		mutex_lock(&dev->struct_mutex);
-		__gen7_gt_force_wake_mt_get(dev_priv, FORCEWAKE_ALL);
-		ecobus = __raw_i915_read32(dev_priv, ECOBUS);
-		__gen7_gt_force_wake_mt_put(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 {
-			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;
-		}
-	} else if (IS_GEN6(dev)) {
-		dev_priv->uncore.funcs.force_wake_get =
-			__gen6_gt_force_wake_get;
-		dev_priv->uncore.funcs.force_wake_put =
-			__gen6_gt_force_wake_put;
-	}
 
-	switch (INTEL_INFO(dev)->gen) {
-	default:
+		gen6_setup_read_mmio(dev_priv);
 		dev_priv->uncore.funcs.mmio_writeb  = gen8_write8;
 		dev_priv->uncore.funcs.mmio_writew  = gen8_write16;
 		dev_priv->uncore.funcs.mmio_writel  = gen8_write32;
 		dev_priv->uncore.funcs.mmio_writeq  = gen8_write64;
-		dev_priv->uncore.funcs.mmio_readb  = gen6_read8;
-		dev_priv->uncore.funcs.mmio_readw  = gen6_read16;
-		dev_priv->uncore.funcs.mmio_readl  = gen6_read32;
-		dev_priv->uncore.funcs.mmio_readq  = gen6_read64;
+
 		break;
 	case 7:
-	case 6:
 		if (IS_HASWELL(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;
+
+			gen6_setup_read_mmio(dev_priv);
 			dev_priv->uncore.funcs.mmio_writeb  = hsw_write8;
 			dev_priv->uncore.funcs.mmio_writew  = hsw_write16;
 			dev_priv->uncore.funcs.mmio_writel  = hsw_write32;
 			dev_priv->uncore.funcs.mmio_writeq  = hsw_write64;
-		} else {
-			dev_priv->uncore.funcs.mmio_writeb  = gen6_write8;
-			dev_priv->uncore.funcs.mmio_writew  = gen6_write16;
-			dev_priv->uncore.funcs.mmio_writel  = gen6_write32;
-			dev_priv->uncore.funcs.mmio_writeq  = gen6_write64;
-		}
+		} else if (IS_VALLEYVIEW(dev)) {
+			dev_priv->uncore.funcs.force_wake_get = __vlv_force_wake_get;
+			dev_priv->uncore.funcs.force_wake_put = __vlv_force_wake_put;
 
-		if (IS_VALLEYVIEW(dev)) {
+			gen6_setup_read_mmio(dev_priv);
 			dev_priv->uncore.funcs.mmio_readb  = vlv_read8;
 			dev_priv->uncore.funcs.mmio_readw  = vlv_read16;
 			dev_priv->uncore.funcs.mmio_readl  = vlv_read32;
 			dev_priv->uncore.funcs.mmio_readq  = vlv_read64;
-		} else {
-			dev_priv->uncore.funcs.mmio_readb  = gen6_read8;
-			dev_priv->uncore.funcs.mmio_readw  = gen6_read16;
-			dev_priv->uncore.funcs.mmio_readl  = gen6_read32;
-			dev_priv->uncore.funcs.mmio_readq  = gen6_read64;
+		} else if (IS_IVYBRIDGE(dev)) {
+			ivybridge_setup_forcewake(dev);
+			BUG_ON(!dev_priv->uncore.funcs.force_wake_get);
+			BUG_ON(!dev_priv->uncore.funcs.force_wake_put);
+
+			gen6_setup_read_mmio(dev_priv);
+			dev_priv->uncore.funcs.mmio_writeb  = gen6_write8;
+			dev_priv->uncore.funcs.mmio_writew  = gen6_write16;
+			dev_priv->uncore.funcs.mmio_writel  = gen6_write32;
+			dev_priv->uncore.funcs.mmio_writeq  = gen6_write64;
 		}
 		break;
+	case 6:
+		dev_priv->uncore.funcs.force_wake_get = __gen6_gt_force_wake_get;
+		dev_priv->uncore.funcs.force_wake_put = __gen6_gt_force_wake_put;
+
+		gen6_setup_read_mmio(dev_priv);
+		dev_priv->uncore.funcs.mmio_writeb  = gen6_write8;
+		dev_priv->uncore.funcs.mmio_writew  = gen6_write16;
+		dev_priv->uncore.funcs.mmio_writel  = gen6_write32;
+		dev_priv->uncore.funcs.mmio_writeq  = gen6_write64;
+
+		break;
 	case 5:
 		dev_priv->uncore.funcs.mmio_writeb  = gen5_write8;
 		dev_priv->uncore.funcs.mmio_writew  = gen5_write16;
-- 
1.9.1

^ permalink raw reply related	[flat|nested] 4+ messages in thread

* [PATCH 2/2] drm/i915/bdw: Create a state setup hook
  2014-04-06 19:54 [PATCH 1/2] drm/i915: Reorganize uncore_init Ben Widawsky
@ 2014-04-06 19:54 ` Ben Widawsky
  2014-04-06 19:58   ` Ben Widawsky
  0 siblings, 1 reply; 4+ messages in thread
From: Ben Widawsky @ 2014-04-06 19:54 UTC (permalink / raw)
  To: Intel GFX

Mika Kuoppala <miku@iki.fi>
Signed-off-by: Ben Widawsky <ben@bwidawsk.net>
---
 drivers/gpu/drm/i915/i915_drv.h         | 2 ++
 drivers/gpu/drm/i915/i915_gem_context.c | 3 +++
 drivers/gpu/drm/i915/intel_uncore.c     | 8 ++++++++
 3 files changed, 13 insertions(+)

diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
index 952fdba..9f6a8c1 100644
--- a/drivers/gpu/drm/i915/i915_drv.h
+++ b/drivers/gpu/drm/i915/i915_drv.h
@@ -501,6 +501,8 @@ struct intel_uncore_funcs {
 				uint32_t val, bool trace);
 	void (*mmio_writeq)(struct drm_i915_private *dev_priv, off_t offset,
 				uint64_t val, bool trace);
+
+	int (*hw_state_setup)(struct drm_device *dev);
 };
 
 struct intel_uncore {
diff --git a/drivers/gpu/drm/i915/i915_gem_context.c b/drivers/gpu/drm/i915/i915_gem_context.c
index fdf1736..513beea 100644
--- a/drivers/gpu/drm/i915/i915_gem_context.c
+++ b/drivers/gpu/drm/i915/i915_gem_context.c
@@ -491,6 +491,9 @@ int i915_gem_context_enable(struct drm_i915_private *dev_priv)
 	struct intel_ring_buffer *ring;
 	int ret, i;
 
+        if (dev_priv->uncore.funcs.hw_state_setup(dev_priv->dev))
+		dev_priv->uncore.funcs.hw_state_setup(dev_priv->dev);
+
 	if (!HAS_HW_CONTEXTS(dev_priv->dev))
 		return 0;
 
diff --git a/drivers/gpu/drm/i915/intel_uncore.c b/drivers/gpu/drm/i915/intel_uncore.c
index e206c41..9241901 100644
--- a/drivers/gpu/drm/i915/intel_uncore.c
+++ b/drivers/gpu/drm/i915/intel_uncore.c
@@ -40,6 +40,8 @@
 
 #define __raw_posting_read(dev_priv__, reg__) (void)__raw_i915_read32(dev_priv__, reg__)
 
+static int gen8_hw_state_setup(struct drm_device *dev);
+
 static void
 assert_device_not_suspended(struct drm_i915_private *dev_priv)
 {
@@ -800,6 +802,7 @@ void intel_uncore_init(struct drm_device *dev)
 		dev_priv->uncore.funcs.mmio_writel  = gen8_write32;
 		dev_priv->uncore.funcs.mmio_writeq  = gen8_write64;
 
+		dev_priv->uncore.funcs.hw_state_setup = gen8_hw_state_setup;
 		break;
 	case 7:
 		if (IS_HASWELL(dev)) {
@@ -1068,3 +1071,8 @@ void intel_uncore_check_errors(struct drm_device *dev)
 		__raw_i915_write32(dev_priv, FPGA_DBG, FPGA_DBG_RM_NOCLAIM);
 	}
 }
+
+static int gen8_hw_state_setup(struct drm_device *dev)
+{
+	return 0;
+}
-- 
1.9.1

^ permalink raw reply related	[flat|nested] 4+ messages in thread

* Re: [PATCH 2/2] drm/i915/bdw: Create a state setup hook
  2014-04-06 19:54 ` [PATCH 2/2] drm/i915/bdw: Create a state setup hook Ben Widawsky
@ 2014-04-06 19:58   ` Ben Widawsky
  2014-04-08  0:22     ` Ben Widawsky
  0 siblings, 1 reply; 4+ messages in thread
From: Ben Widawsky @ 2014-04-06 19:58 UTC (permalink / raw)
  To: Ben Widawsky; +Cc: Intel GFX, Mika Kuoppala

Screwed up the CC... my bad. Basically, I started doing my own state
setup thing, and thought Mika could benefit. In the end my thing didn't
solve the problem I was trying to solve.

On Sun, Apr 06, 2014 at 12:54:10PM -0700, Ben Widawsky wrote:
> Mika Kuoppala <miku@iki.fi>
> Signed-off-by: Ben Widawsky <ben@bwidawsk.net>
> ---
>  drivers/gpu/drm/i915/i915_drv.h         | 2 ++
>  drivers/gpu/drm/i915/i915_gem_context.c | 3 +++
>  drivers/gpu/drm/i915/intel_uncore.c     | 8 ++++++++
>  3 files changed, 13 insertions(+)
> 
> diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
> index 952fdba..9f6a8c1 100644
> --- a/drivers/gpu/drm/i915/i915_drv.h
> +++ b/drivers/gpu/drm/i915/i915_drv.h
> @@ -501,6 +501,8 @@ struct intel_uncore_funcs {
>  				uint32_t val, bool trace);
>  	void (*mmio_writeq)(struct drm_i915_private *dev_priv, off_t offset,
>  				uint64_t val, bool trace);
> +
> +	int (*hw_state_setup)(struct drm_device *dev);
>  };
>  
>  struct intel_uncore {
> diff --git a/drivers/gpu/drm/i915/i915_gem_context.c b/drivers/gpu/drm/i915/i915_gem_context.c
> index fdf1736..513beea 100644
> --- a/drivers/gpu/drm/i915/i915_gem_context.c
> +++ b/drivers/gpu/drm/i915/i915_gem_context.c
> @@ -491,6 +491,9 @@ int i915_gem_context_enable(struct drm_i915_private *dev_priv)
>  	struct intel_ring_buffer *ring;
>  	int ret, i;
>  
> +        if (dev_priv->uncore.funcs.hw_state_setup(dev_priv->dev))
> +		dev_priv->uncore.funcs.hw_state_setup(dev_priv->dev);
> +
>  	if (!HAS_HW_CONTEXTS(dev_priv->dev))
>  		return 0;
>  
> diff --git a/drivers/gpu/drm/i915/intel_uncore.c b/drivers/gpu/drm/i915/intel_uncore.c
> index e206c41..9241901 100644
> --- a/drivers/gpu/drm/i915/intel_uncore.c
> +++ b/drivers/gpu/drm/i915/intel_uncore.c
> @@ -40,6 +40,8 @@
>  
>  #define __raw_posting_read(dev_priv__, reg__) (void)__raw_i915_read32(dev_priv__, reg__)
>  
> +static int gen8_hw_state_setup(struct drm_device *dev);
> +
>  static void
>  assert_device_not_suspended(struct drm_i915_private *dev_priv)
>  {
> @@ -800,6 +802,7 @@ void intel_uncore_init(struct drm_device *dev)
>  		dev_priv->uncore.funcs.mmio_writel  = gen8_write32;
>  		dev_priv->uncore.funcs.mmio_writeq  = gen8_write64;
>  
> +		dev_priv->uncore.funcs.hw_state_setup = gen8_hw_state_setup;
>  		break;
>  	case 7:
>  		if (IS_HASWELL(dev)) {
> @@ -1068,3 +1071,8 @@ void intel_uncore_check_errors(struct drm_device *dev)
>  		__raw_i915_write32(dev_priv, FPGA_DBG, FPGA_DBG_RM_NOCLAIM);
>  	}
>  }
> +
> +static int gen8_hw_state_setup(struct drm_device *dev)
> +{
> +	return 0;
> +}
> -- 
> 1.9.1
> 
> _______________________________________________
> Intel-gfx mailing list
> Intel-gfx@lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/intel-gfx

-- 
Ben Widawsky, Intel Open Source Technology Center

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [PATCH 2/2] drm/i915/bdw: Create a state setup hook
  2014-04-06 19:58   ` Ben Widawsky
@ 2014-04-08  0:22     ` Ben Widawsky
  0 siblings, 0 replies; 4+ messages in thread
From: Ben Widawsky @ 2014-04-08  0:22 UTC (permalink / raw)
  To: Ben Widawsky; +Cc: Intel GFX, Mika Kuoppala

On Sun, Apr 06, 2014 at 12:58:56PM -0700, Ben Widawsky wrote:
> Screwed up the CC... my bad. Basically, I started doing my own state
> setup thing, and thought Mika could benefit. In the end my thing didn't
> solve the problem I was trying to solve.

Okay, I botched the patch too. See below, if you use it.

> 
> On Sun, Apr 06, 2014 at 12:54:10PM -0700, Ben Widawsky wrote:
> > Mika Kuoppala <miku@iki.fi>
> > Signed-off-by: Ben Widawsky <ben@bwidawsk.net>
> > ---
> >  drivers/gpu/drm/i915/i915_drv.h         | 2 ++
> >  drivers/gpu/drm/i915/i915_gem_context.c | 3 +++
> >  drivers/gpu/drm/i915/intel_uncore.c     | 8 ++++++++
> >  3 files changed, 13 insertions(+)
> > 
> > diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
> > index 952fdba..9f6a8c1 100644
> > --- a/drivers/gpu/drm/i915/i915_drv.h
> > +++ b/drivers/gpu/drm/i915/i915_drv.h
> > @@ -501,6 +501,8 @@ struct intel_uncore_funcs {
> >  				uint32_t val, bool trace);
> >  	void (*mmio_writeq)(struct drm_i915_private *dev_priv, off_t offset,
> >  				uint64_t val, bool trace);
> > +
> > +	int (*hw_state_setup)(struct drm_device *dev);
> >  };
> >  
> >  struct intel_uncore {
> > diff --git a/drivers/gpu/drm/i915/i915_gem_context.c b/drivers/gpu/drm/i915/i915_gem_context.c
> > index fdf1736..513beea 100644
> > --- a/drivers/gpu/drm/i915/i915_gem_context.c
> > +++ b/drivers/gpu/drm/i915/i915_gem_context.c
> > @@ -491,6 +491,9 @@ int i915_gem_context_enable(struct drm_i915_private *dev_priv)
> >  	struct intel_ring_buffer *ring;
> >  	int ret, i;
> >  
> > +        if (dev_priv->uncore.funcs.hw_state_setup(dev_priv->dev))
> > +		dev_priv->uncore.funcs.hw_state_setup(dev_priv->dev);
> > +

+        if (dev_priv->uncore.funcs.hw_state_setup)

> >  	if (!HAS_HW_CONTEXTS(dev_priv->dev))
> >  		return 0;
> >  
> > diff --git a/drivers/gpu/drm/i915/intel_uncore.c b/drivers/gpu/drm/i915/intel_uncore.c
> > index e206c41..9241901 100644
> > --- a/drivers/gpu/drm/i915/intel_uncore.c
> > +++ b/drivers/gpu/drm/i915/intel_uncore.c
> > @@ -40,6 +40,8 @@
> >  
> >  #define __raw_posting_read(dev_priv__, reg__) (void)__raw_i915_read32(dev_priv__, reg__)
> >  
> > +static int gen8_hw_state_setup(struct drm_device *dev);
> > +
> >  static void
> >  assert_device_not_suspended(struct drm_i915_private *dev_priv)
> >  {
> > @@ -800,6 +802,7 @@ void intel_uncore_init(struct drm_device *dev)
> >  		dev_priv->uncore.funcs.mmio_writel  = gen8_write32;
> >  		dev_priv->uncore.funcs.mmio_writeq  = gen8_write64;
> >  
> > +		dev_priv->uncore.funcs.hw_state_setup = gen8_hw_state_setup;
> >  		break;
> >  	case 7:
> >  		if (IS_HASWELL(dev)) {
> > @@ -1068,3 +1071,8 @@ void intel_uncore_check_errors(struct drm_device *dev)
> >  		__raw_i915_write32(dev_priv, FPGA_DBG, FPGA_DBG_RM_NOCLAIM);
> >  	}
> >  }
> > +
> > +static int gen8_hw_state_setup(struct drm_device *dev)
> > +{
> > +	return 0;
> > +}
> > -- 
> > 1.9.1
> > 
> > _______________________________________________
> > Intel-gfx mailing list
> > Intel-gfx@lists.freedesktop.org
> > http://lists.freedesktop.org/mailman/listinfo/intel-gfx
> 
> -- 
> Ben Widawsky, Intel Open Source Technology Center
> _______________________________________________
> Intel-gfx mailing list
> Intel-gfx@lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/intel-gfx

-- 
Ben Widawsky, Intel Open Source Technology Center

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2014-04-08  0:22 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2014-04-06 19:54 [PATCH 1/2] drm/i915: Reorganize uncore_init Ben Widawsky
2014-04-06 19:54 ` [PATCH 2/2] drm/i915/bdw: Create a state setup hook Ben Widawsky
2014-04-06 19:58   ` Ben Widawsky
2014-04-08  0:22     ` Ben Widawsky

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox