diff options
Diffstat (limited to 'drivers/gpu/drm/i915/intel_pm.c')
| -rw-r--r-- | drivers/gpu/drm/i915/intel_pm.c | 47 |
1 files changed, 41 insertions, 6 deletions
diff --git a/drivers/gpu/drm/i915/intel_pm.c b/drivers/gpu/drm/i915/intel_pm.c index ccbdd83f5220..f895d1508df8 100644 --- a/drivers/gpu/drm/i915/intel_pm.c +++ b/drivers/gpu/drm/i915/intel_pm.c | |||
| @@ -5476,7 +5476,7 @@ static void vlv_force_wake_put(struct drm_i915_private *dev_priv) | |||
| 5476 | gen6_gt_check_fifodbg(dev_priv); | 5476 | gen6_gt_check_fifodbg(dev_priv); |
| 5477 | } | 5477 | } |
| 5478 | 5478 | ||
| 5479 | void intel_gt_reset(struct drm_device *dev) | 5479 | void intel_gt_sanitize(struct drm_device *dev) |
| 5480 | { | 5480 | { |
| 5481 | struct drm_i915_private *dev_priv = dev->dev_private; | 5481 | struct drm_i915_private *dev_priv = dev->dev_private; |
| 5482 | 5482 | ||
| @@ -5487,26 +5487,61 @@ void intel_gt_reset(struct drm_device *dev) | |||
| 5487 | if (IS_IVYBRIDGE(dev) || IS_HASWELL(dev)) | 5487 | if (IS_IVYBRIDGE(dev) || IS_HASWELL(dev)) |
| 5488 | __gen6_gt_force_wake_mt_reset(dev_priv); | 5488 | __gen6_gt_force_wake_mt_reset(dev_priv); |
| 5489 | } | 5489 | } |
| 5490 | |||
| 5491 | /* BIOS often leaves RC6 enabled, but disable it for hw init */ | ||
| 5492 | if (INTEL_INFO(dev)->gen >= 6) | ||
| 5493 | intel_disable_gt_powersave(dev); | ||
| 5490 | } | 5494 | } |
| 5491 | 5495 | ||
| 5492 | void intel_gt_init(struct drm_device *dev) | 5496 | void intel_gt_init(struct drm_device *dev) |
| 5493 | { | 5497 | { |
| 5494 | struct drm_i915_private *dev_priv = dev->dev_private; | 5498 | struct drm_i915_private *dev_priv = dev->dev_private; |
| 5495 | 5499 | ||
| 5496 | spin_lock_init(&dev_priv->gt_lock); | ||
| 5497 | |||
| 5498 | intel_gt_reset(dev); | ||
| 5499 | |||
| 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; |
| 5509 | } | 5538 | } |
| 5539 | } | ||
| 5540 | |||
| 5541 | void intel_pm_init(struct drm_device *dev) | ||
| 5542 | { | ||
| 5543 | struct drm_i915_private *dev_priv = dev->dev_private; | ||
| 5544 | |||
| 5510 | INIT_DELAYED_WORK(&dev_priv->rps.delayed_resume_work, | 5545 | INIT_DELAYED_WORK(&dev_priv->rps.delayed_resume_work, |
| 5511 | intel_gen6_powersave_work); | 5546 | intel_gen6_powersave_work); |
| 5512 | } | 5547 | } |
