aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVille Syrjälä <ville.syrjala@linux.intel.com>2014-05-19 12:23:27 -0400
committerDaniel Vetter <daniel.vetter@ffwll.ch>2014-05-22 10:34:57 -0400
commitfa4f53c4416de49dd4cc3debd8be98d2c0ba0eb6 (patch)
treea4807bcb240d51b0840fde32977ed9c2960ef9c1
parent80715b2f7b97154ad8d791ddf85a386081fcceab (diff)
drm/i915: Implement WaVcpClkGateDisableForMediaReset:ctg, elk
Apparently we need to disable VCP unit clock gating around media reset on g4x. 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>
-rw-r--r--drivers/gpu/drm/i915/i915_reg.h4
-rw-r--r--drivers/gpu/drm/i915/intel_uncore.c36
2 files changed, 39 insertions, 1 deletions
diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h
index 9b3681ee4a69..5122254e7213 100644
--- a/drivers/gpu/drm/i915/i915_reg.h
+++ b/drivers/gpu/drm/i915/i915_reg.h
@@ -1835,6 +1835,10 @@ enum punit_power_well {
1835#define VF_UNIT_CLOCK_GATE_DISABLE (1 << 9) 1835#define VF_UNIT_CLOCK_GATE_DISABLE (1 << 9)
1836#define GS_UNIT_CLOCK_GATE_DISABLE (1 << 7) 1836#define GS_UNIT_CLOCK_GATE_DISABLE (1 << 7)
1837#define CL_UNIT_CLOCK_GATE_DISABLE (1 << 6) 1837#define CL_UNIT_CLOCK_GATE_DISABLE (1 << 6)
1838
1839#define VDECCLK_GATE_D 0x620C /* g4x only */
1840#define VCP_UNIT_CLOCK_GATE_DISABLE (1 << 4)
1841
1838#define RAMCLK_GATE_D 0x6210 /* CRL only */ 1842#define RAMCLK_GATE_D 0x6210 /* CRL only */
1839#define DEUC 0x6214 /* CRL only */ 1843#define DEUC 0x6214 /* CRL only */
1840 1844
diff --git a/drivers/gpu/drm/i915/intel_uncore.c b/drivers/gpu/drm/i915/intel_uncore.c
index 4ec192bc27ba..e7aa42d10f6c 100644
--- a/drivers/gpu/drm/i915/intel_uncore.c
+++ b/drivers/gpu/drm/i915/intel_uncore.c
@@ -988,6 +988,36 @@ static int i965_do_reset(struct drm_device *dev)
988 return 0; 988 return 0;
989} 989}
990 990
991static int g4x_do_reset(struct drm_device *dev)
992{
993 struct drm_i915_private *dev_priv = dev->dev_private;
994 int ret;
995
996 pci_write_config_byte(dev->pdev, I965_GDRST,
997 GRDOM_RENDER | GRDOM_RESET_ENABLE);
998 ret = wait_for(i965_reset_complete(dev), 500);
999 if (ret)
1000 return ret;
1001
1002 /* WaVcpClkGateDisableForMediaReset:ctg,elk */
1003 I915_WRITE(VDECCLK_GATE_D, I915_READ(VDECCLK_GATE_D) | VCP_UNIT_CLOCK_GATE_DISABLE);
1004 POSTING_READ(VDECCLK_GATE_D);
1005
1006 pci_write_config_byte(dev->pdev, I965_GDRST,
1007 GRDOM_MEDIA | GRDOM_RESET_ENABLE);
1008 ret = wait_for(i965_reset_complete(dev), 500);
1009 if (ret)
1010 return ret;
1011
1012 /* WaVcpClkGateDisableForMediaReset:ctg,elk */
1013 I915_WRITE(VDECCLK_GATE_D, I915_READ(VDECCLK_GATE_D) & ~VCP_UNIT_CLOCK_GATE_DISABLE);
1014 POSTING_READ(VDECCLK_GATE_D);
1015
1016 pci_write_config_byte(dev->pdev, I965_GDRST, 0);
1017
1018 return 0;
1019}
1020
991static int ironlake_do_reset(struct drm_device *dev) 1021static int ironlake_do_reset(struct drm_device *dev)
992{ 1022{
993 struct drm_i915_private *dev_priv = dev->dev_private; 1023 struct drm_i915_private *dev_priv = dev->dev_private;
@@ -1040,7 +1070,11 @@ int intel_gpu_reset(struct drm_device *dev)
1040 case 7: 1070 case 7:
1041 case 6: return gen6_do_reset(dev); 1071 case 6: return gen6_do_reset(dev);
1042 case 5: return ironlake_do_reset(dev); 1072 case 5: return ironlake_do_reset(dev);
1043 case 4: return i965_do_reset(dev); 1073 case 4:
1074 if (IS_G4X(dev))
1075 return g4x_do_reset(dev);
1076 else
1077 return i965_do_reset(dev);
1044 default: return -ENODEV; 1078 default: return -ENODEV;
1045 } 1079 }
1046} 1080}