diff options
Diffstat (limited to 'drivers/gpu/drm/i915/intel_pm.c')
-rw-r--r-- | drivers/gpu/drm/i915/intel_pm.c | 31 |
1 files changed, 30 insertions, 1 deletions
diff --git a/drivers/gpu/drm/i915/intel_pm.c b/drivers/gpu/drm/i915/intel_pm.c index ccbdd83f5220..d10e6735771f 100644 --- a/drivers/gpu/drm/i915/intel_pm.c +++ b/drivers/gpu/drm/i915/intel_pm.c | |||
@@ -5500,9 +5500,38 @@ void intel_gt_init(struct drm_device *dev) | |||
5500 | if (IS_VALLEYVIEW(dev)) { | 5500 | if (IS_VALLEYVIEW(dev)) { |
5501 | dev_priv->gt.force_wake_get = vlv_force_wake_get; | 5501 | dev_priv->gt.force_wake_get = vlv_force_wake_get; |
5502 | dev_priv->gt.force_wake_put = vlv_force_wake_put; | 5502 | dev_priv->gt.force_wake_put = vlv_force_wake_put; |
5503 | } else if (IS_IVYBRIDGE(dev) || IS_HASWELL(dev)) { | 5503 | } else if (IS_HASWELL(dev)) { |
5504 | dev_priv->gt.force_wake_get = __gen6_gt_force_wake_mt_get; | 5504 | dev_priv->gt.force_wake_get = __gen6_gt_force_wake_mt_get; |
5505 | dev_priv->gt.force_wake_put = __gen6_gt_force_wake_mt_put; | 5505 | dev_priv->gt.force_wake_put = __gen6_gt_force_wake_mt_put; |
5506 | } else if (IS_IVYBRIDGE(dev)) { | ||
5507 | u32 ecobus; | ||
5508 | |||
5509 | /* IVB configs may use multi-threaded forcewake */ | ||
5510 | |||
5511 | /* A small trick here - if the bios hasn't configured | ||
5512 | * MT forcewake, and if the device is in RC6, then | ||
5513 | * force_wake_mt_get will not wake the device and the | ||
5514 | * ECOBUS read will return zero. Which will be | ||
5515 | * (correctly) interpreted by the test below as MT | ||
5516 | * forcewake being disabled. | ||
5517 | */ | ||
5518 | mutex_lock(&dev->struct_mutex); | ||
5519 | __gen6_gt_force_wake_mt_get(dev_priv); | ||
5520 | ecobus = I915_READ_NOTRACE(ECOBUS); | ||
5521 | __gen6_gt_force_wake_mt_put(dev_priv); | ||
5522 | mutex_unlock(&dev->struct_mutex); | ||
5523 | |||
5524 | if (ecobus & FORCEWAKE_MT_ENABLE) { | ||
5525 | dev_priv->gt.force_wake_get = | ||
5526 | __gen6_gt_force_wake_mt_get; | ||
5527 | dev_priv->gt.force_wake_put = | ||
5528 | __gen6_gt_force_wake_mt_put; | ||
5529 | } else { | ||
5530 | DRM_INFO("No MT forcewake available on Ivybridge, this can result in issues\n"); | ||
5531 | DRM_INFO("when using vblank-synced partial screen updates.\n"); | ||
5532 | dev_priv->gt.force_wake_get = __gen6_gt_force_wake_get; | ||
5533 | dev_priv->gt.force_wake_put = __gen6_gt_force_wake_put; | ||
5534 | } | ||
5506 | } else if (IS_GEN6(dev)) { | 5535 | } else if (IS_GEN6(dev)) { |
5507 | dev_priv->gt.force_wake_get = __gen6_gt_force_wake_get; | 5536 | dev_priv->gt.force_wake_get = __gen6_gt_force_wake_get; |
5508 | dev_priv->gt.force_wake_put = __gen6_gt_force_wake_put; | 5537 | dev_priv->gt.force_wake_put = __gen6_gt_force_wake_put; |