diff options
author | Ville Syrjälä <ville.syrjala@linux.intel.com> | 2014-05-19 12:23:27 -0400 |
---|---|---|
committer | Daniel Vetter <daniel.vetter@ffwll.ch> | 2014-05-22 10:34:57 -0400 |
commit | fa4f53c4416de49dd4cc3debd8be98d2c0ba0eb6 (patch) | |
tree | a4807bcb240d51b0840fde32977ed9c2960ef9c1 | |
parent | 80715b2f7b97154ad8d791ddf85a386081fcceab (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.h | 4 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/intel_uncore.c | 36 |
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 | ||
991 | static 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 | |||
991 | static int ironlake_do_reset(struct drm_device *dev) | 1021 | static 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 | } |