drm/i915: Fix ILK GPU reset domain bits
authorVille Syrjälä <ville.syrjala@linux.intel.com>
Mon, 19 May 2014 16:23:24 +0000 (19:23 +0300)
committerDaniel Vetter <daniel.vetter@ffwll.ch>
Tue, 20 May 2014 08:45:04 +0000 (10:45 +0200)
We're using the reset domains bits for g4x on ilk. But on ilk those bits
actually shifted by one bit. Fix it up so that we use the correct bits.

We were actually always writing 0x2 to the reset domain bits, which
is a reserved value. In practice it looks like the hardware ignores that
value since nothing happens if I write that value when there's a 3D
workload running. Writing the _correct_ render domain value actually
makes the GPU stop.

Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
Acked-by: Jesse Barnes <jbarnes@virtuousgeek.org>
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
drivers/gpu/drm/i915/i915_reg.h
drivers/gpu/drm/i915/intel_uncore.c

index 2a4aac4e34234896be73a1f04cff23a72273c1b9..d34db4ddd904437aa1d3881b09c5c79bf3751cdd 100644 (file)
 
 /* Graphics reset regs */
 #define I965_GDRST 0xc0 /* PCI config register */
-#define ILK_GDSR 0x2ca4 /* MCHBAR offset */
 #define  GRDOM_FULL    (0<<2)
 #define  GRDOM_RENDER  (1<<2)
 #define  GRDOM_MEDIA   (3<<2)
 #define  GRDOM_MASK    (3<<2)
 #define  GRDOM_RESET_ENABLE (1<<0)
 
+#define ILK_GDSR 0x2ca4 /* MCHBAR offset */
+#define  ILK_GRDOM_FULL                (0<<1)
+#define  ILK_GRDOM_RENDER      (1<<1)
+#define  ILK_GRDOM_MEDIA       (3<<1)
+#define  ILK_GRDOM_MASK                (3<<1)
+#define  ILK_GRDOM_RESET_ENABLE (1<<0)
+
 #define GEN6_MBCUNIT_SNPCR     0x900c /* for LLC config */
 #define   GEN6_MBC_SNPCR_SHIFT 21
 #define   GEN6_MBC_SNPCR_MASK  (3<<21)
index ba5a9b8705a448295d97689e323fb3c70ddc08ff..bfcd3bda67b16999248b64e985699952b5f5e68f 100644 (file)
@@ -995,20 +995,20 @@ static int ironlake_do_reset(struct drm_device *dev)
        int ret;
 
        gdrst = I915_READ(MCHBAR_MIRROR_BASE + ILK_GDSR);
-       gdrst &= ~GRDOM_MASK;
+       gdrst &= ~ILK_GRDOM_MASK;
        I915_WRITE(MCHBAR_MIRROR_BASE + ILK_GDSR,
-                  gdrst | GRDOM_RENDER | GRDOM_RESET_ENABLE);
+                  gdrst | ILK_GRDOM_RENDER | ILK_GRDOM_RESET_ENABLE);
        ret = wait_for((I915_READ(MCHBAR_MIRROR_BASE + ILK_GDSR) &
-                       GRDOM_RESET_ENABLE) == 0, 500);
+                       ILK_GRDOM_RESET_ENABLE) == 0, 500);
        if (ret)
                return ret;
 
        gdrst = I915_READ(MCHBAR_MIRROR_BASE + ILK_GDSR);
-       gdrst &= ~GRDOM_MASK;
+       gdrst &= ~ILK_GRDOM_MASK;
        I915_WRITE(MCHBAR_MIRROR_BASE + ILK_GDSR,
-                  gdrst | GRDOM_MEDIA | GRDOM_RESET_ENABLE);
+                  gdrst | ILK_GRDOM_MEDIA | ILK_GRDOM_RESET_ENABLE);
        return wait_for((I915_READ(MCHBAR_MIRROR_BASE + ILK_GDSR) &
-                        GRDOM_RESET_ENABLE) == 0, 500);
+                        ILK_GRDOM_RESET_ENABLE) == 0, 500);
 }
 
 static int gen6_do_reset(struct drm_device *dev)