diff options
Diffstat (limited to 'drivers/gpu/drm/i915/intel_pm.c')
-rw-r--r-- | drivers/gpu/drm/i915/intel_pm.c | 54 |
1 files changed, 26 insertions, 28 deletions
diff --git a/drivers/gpu/drm/i915/intel_pm.c b/drivers/gpu/drm/i915/intel_pm.c index 3ac5fe9d428a..0150ba598bf0 100644 --- a/drivers/gpu/drm/i915/intel_pm.c +++ b/drivers/gpu/drm/i915/intel_pm.c | |||
@@ -3450,11 +3450,11 @@ static void gen6_enable_rps_interrupts(struct drm_device *dev) | |||
3450 | 3450 | ||
3451 | spin_lock_irq(&dev_priv->irq_lock); | 3451 | spin_lock_irq(&dev_priv->irq_lock); |
3452 | WARN_ON(dev_priv->rps.pm_iir); | 3452 | WARN_ON(dev_priv->rps.pm_iir); |
3453 | I915_WRITE(GEN6_PMIMR, I915_READ(GEN6_PMIMR) & ~GEN6_PM_RPS_EVENTS); | 3453 | snb_enable_pm_irq(dev_priv, GEN6_PM_RPS_EVENTS); |
3454 | I915_WRITE(GEN6_PMIIR, GEN6_PM_RPS_EVENTS); | 3454 | I915_WRITE(GEN6_PMIIR, GEN6_PM_RPS_EVENTS); |
3455 | spin_unlock_irq(&dev_priv->irq_lock); | 3455 | spin_unlock_irq(&dev_priv->irq_lock); |
3456 | /* unmask all PM interrupts */ | 3456 | /* only unmask PM interrupts we need. Mask all others. */ |
3457 | I915_WRITE(GEN6_PMINTRMSK, 0); | 3457 | I915_WRITE(GEN6_PMINTRMSK, ~GEN6_PM_RPS_EVENTS); |
3458 | } | 3458 | } |
3459 | 3459 | ||
3460 | static void gen6_enable_rps(struct drm_device *dev) | 3460 | static void gen6_enable_rps(struct drm_device *dev) |
@@ -3508,7 +3508,10 @@ static void gen6_enable_rps(struct drm_device *dev) | |||
3508 | 3508 | ||
3509 | I915_WRITE(GEN6_RC_SLEEP, 0); | 3509 | I915_WRITE(GEN6_RC_SLEEP, 0); |
3510 | I915_WRITE(GEN6_RC1e_THRESHOLD, 1000); | 3510 | I915_WRITE(GEN6_RC1e_THRESHOLD, 1000); |
3511 | I915_WRITE(GEN6_RC6_THRESHOLD, 50000); | 3511 | if (INTEL_INFO(dev)->gen <= 6 || IS_IVYBRIDGE(dev)) |
3512 | I915_WRITE(GEN6_RC6_THRESHOLD, 125000); | ||
3513 | else | ||
3514 | I915_WRITE(GEN6_RC6_THRESHOLD, 50000); | ||
3512 | I915_WRITE(GEN6_RC6p_THRESHOLD, 150000); | 3515 | I915_WRITE(GEN6_RC6p_THRESHOLD, 150000); |
3513 | I915_WRITE(GEN6_RC6pp_THRESHOLD, 64000); /* unused */ | 3516 | I915_WRITE(GEN6_RC6pp_THRESHOLD, 64000); /* unused */ |
3514 | 3517 | ||
@@ -3604,7 +3607,7 @@ static void gen6_enable_rps(struct drm_device *dev) | |||
3604 | gen6_gt_force_wake_put(dev_priv); | 3607 | gen6_gt_force_wake_put(dev_priv); |
3605 | } | 3608 | } |
3606 | 3609 | ||
3607 | static void gen6_update_ring_freq(struct drm_device *dev) | 3610 | void gen6_update_ring_freq(struct drm_device *dev) |
3608 | { | 3611 | { |
3609 | struct drm_i915_private *dev_priv = dev->dev_private; | 3612 | struct drm_i915_private *dev_priv = dev->dev_private; |
3610 | int min_freq = 15; | 3613 | int min_freq = 15; |
@@ -4861,10 +4864,6 @@ static void gen6_init_clock_gating(struct drm_device *dev) | |||
4861 | ILK_DPARBUNIT_CLOCK_GATE_ENABLE | | 4864 | ILK_DPARBUNIT_CLOCK_GATE_ENABLE | |
4862 | ILK_DPFDUNIT_CLOCK_GATE_ENABLE); | 4865 | ILK_DPFDUNIT_CLOCK_GATE_ENABLE); |
4863 | 4866 | ||
4864 | /* WaMbcDriverBootEnable:snb */ | ||
4865 | I915_WRITE(GEN6_MBCTL, I915_READ(GEN6_MBCTL) | | ||
4866 | GEN6_MBCTL_ENABLE_BOOT_FETCH); | ||
4867 | |||
4868 | g4x_disable_trickle_feed(dev); | 4867 | g4x_disable_trickle_feed(dev); |
4869 | 4868 | ||
4870 | /* The default value should be 0x200 according to docs, but the two | 4869 | /* The default value should be 0x200 according to docs, but the two |
@@ -4960,10 +4959,6 @@ static void haswell_init_clock_gating(struct drm_device *dev) | |||
4960 | I915_WRITE(CACHE_MODE_1, | 4959 | I915_WRITE(CACHE_MODE_1, |
4961 | _MASKED_BIT_ENABLE(PIXEL_SUBSPAN_COLLECT_OPT_DISABLE)); | 4960 | _MASKED_BIT_ENABLE(PIXEL_SUBSPAN_COLLECT_OPT_DISABLE)); |
4962 | 4961 | ||
4963 | /* WaMbcDriverBootEnable:hsw */ | ||
4964 | I915_WRITE(GEN6_MBCTL, I915_READ(GEN6_MBCTL) | | ||
4965 | GEN6_MBCTL_ENABLE_BOOT_FETCH); | ||
4966 | |||
4967 | /* WaSwitchSolVfFArbitrationPriority:hsw */ | 4962 | /* WaSwitchSolVfFArbitrationPriority:hsw */ |
4968 | I915_WRITE(GAM_ECOCHK, I915_READ(GAM_ECOCHK) | HSW_ECOCHK_ARB_PRIO_SOL); | 4963 | I915_WRITE(GAM_ECOCHK, I915_READ(GAM_ECOCHK) | HSW_ECOCHK_ARB_PRIO_SOL); |
4969 | 4964 | ||
@@ -5047,10 +5042,6 @@ static void ivybridge_init_clock_gating(struct drm_device *dev) | |||
5047 | 5042 | ||
5048 | g4x_disable_trickle_feed(dev); | 5043 | g4x_disable_trickle_feed(dev); |
5049 | 5044 | ||
5050 | /* WaMbcDriverBootEnable:ivb */ | ||
5051 | I915_WRITE(GEN6_MBCTL, I915_READ(GEN6_MBCTL) | | ||
5052 | GEN6_MBCTL_ENABLE_BOOT_FETCH); | ||
5053 | |||
5054 | /* WaVSRefCountFullforceMissDisable:ivb */ | 5045 | /* WaVSRefCountFullforceMissDisable:ivb */ |
5055 | gen7_setup_fixed_func_scheduler(dev_priv); | 5046 | gen7_setup_fixed_func_scheduler(dev_priv); |
5056 | 5047 | ||
@@ -5110,11 +5101,6 @@ static void valleyview_init_clock_gating(struct drm_device *dev) | |||
5110 | I915_READ(GEN7_SQ_CHICKEN_MBCUNIT_CONFIG) | | 5101 | I915_READ(GEN7_SQ_CHICKEN_MBCUNIT_CONFIG) | |
5111 | GEN7_SQ_CHICKEN_MBCUNIT_SQINTMOB); | 5102 | GEN7_SQ_CHICKEN_MBCUNIT_SQINTMOB); |
5112 | 5103 | ||
5113 | /* WaMbcDriverBootEnable:vlv */ | ||
5114 | I915_WRITE(GEN6_MBCTL, I915_READ(GEN6_MBCTL) | | ||
5115 | GEN6_MBCTL_ENABLE_BOOT_FETCH); | ||
5116 | |||
5117 | |||
5118 | /* According to the BSpec vol1g, bit 12 (RCPBUNIT) clock | 5104 | /* According to the BSpec vol1g, bit 12 (RCPBUNIT) clock |
5119 | * gating disable must be set. Failure to set it results in | 5105 | * gating disable must be set. Failure to set it results in |
5120 | * flickering pixels due to Z write ordering failures after | 5106 | * flickering pixels due to Z write ordering failures after |
@@ -5282,7 +5268,7 @@ bool intel_display_power_enabled(struct drm_device *dev, | |||
5282 | case POWER_DOMAIN_TRANSCODER_B: | 5268 | case POWER_DOMAIN_TRANSCODER_B: |
5283 | case POWER_DOMAIN_TRANSCODER_C: | 5269 | case POWER_DOMAIN_TRANSCODER_C: |
5284 | return I915_READ(HSW_PWR_WELL_DRIVER) == | 5270 | return I915_READ(HSW_PWR_WELL_DRIVER) == |
5285 | (HSW_PWR_WELL_ENABLE | HSW_PWR_WELL_STATE); | 5271 | (HSW_PWR_WELL_ENABLE_REQUEST | HSW_PWR_WELL_STATE_ENABLED); |
5286 | default: | 5272 | default: |
5287 | BUG(); | 5273 | BUG(); |
5288 | } | 5274 | } |
@@ -5295,17 +5281,18 @@ static void __intel_set_power_well(struct drm_device *dev, bool enable) | |||
5295 | uint32_t tmp; | 5281 | uint32_t tmp; |
5296 | 5282 | ||
5297 | tmp = I915_READ(HSW_PWR_WELL_DRIVER); | 5283 | tmp = I915_READ(HSW_PWR_WELL_DRIVER); |
5298 | is_enabled = tmp & HSW_PWR_WELL_STATE; | 5284 | is_enabled = tmp & HSW_PWR_WELL_STATE_ENABLED; |
5299 | enable_requested = tmp & HSW_PWR_WELL_ENABLE; | 5285 | enable_requested = tmp & HSW_PWR_WELL_ENABLE_REQUEST; |
5300 | 5286 | ||
5301 | if (enable) { | 5287 | if (enable) { |
5302 | if (!enable_requested) | 5288 | if (!enable_requested) |
5303 | I915_WRITE(HSW_PWR_WELL_DRIVER, HSW_PWR_WELL_ENABLE); | 5289 | I915_WRITE(HSW_PWR_WELL_DRIVER, |
5290 | HSW_PWR_WELL_ENABLE_REQUEST); | ||
5304 | 5291 | ||
5305 | if (!is_enabled) { | 5292 | if (!is_enabled) { |
5306 | DRM_DEBUG_KMS("Enabling power well\n"); | 5293 | DRM_DEBUG_KMS("Enabling power well\n"); |
5307 | if (wait_for((I915_READ(HSW_PWR_WELL_DRIVER) & | 5294 | if (wait_for((I915_READ(HSW_PWR_WELL_DRIVER) & |
5308 | HSW_PWR_WELL_STATE), 20)) | 5295 | HSW_PWR_WELL_STATE_ENABLED), 20)) |
5309 | DRM_ERROR("Timeout enabling power well\n"); | 5296 | DRM_ERROR("Timeout enabling power well\n"); |
5310 | } | 5297 | } |
5311 | } else { | 5298 | } else { |
@@ -5407,10 +5394,21 @@ void intel_init_power_well(struct drm_device *dev) | |||
5407 | 5394 | ||
5408 | /* We're taking over the BIOS, so clear any requests made by it since | 5395 | /* We're taking over the BIOS, so clear any requests made by it since |
5409 | * the driver is in charge now. */ | 5396 | * the driver is in charge now. */ |
5410 | if (I915_READ(HSW_PWR_WELL_BIOS) & HSW_PWR_WELL_ENABLE) | 5397 | if (I915_READ(HSW_PWR_WELL_BIOS) & HSW_PWR_WELL_ENABLE_REQUEST) |
5411 | I915_WRITE(HSW_PWR_WELL_BIOS, 0); | 5398 | I915_WRITE(HSW_PWR_WELL_BIOS, 0); |
5412 | } | 5399 | } |
5413 | 5400 | ||
5401 | /* Disables PC8 so we can use the GMBUS and DP AUX interrupts. */ | ||
5402 | void intel_aux_display_runtime_get(struct drm_i915_private *dev_priv) | ||
5403 | { | ||
5404 | hsw_disable_package_c8(dev_priv); | ||
5405 | } | ||
5406 | |||
5407 | void intel_aux_display_runtime_put(struct drm_i915_private *dev_priv) | ||
5408 | { | ||
5409 | hsw_enable_package_c8(dev_priv); | ||
5410 | } | ||
5411 | |||
5414 | /* Set up chip specific power management-related functions */ | 5412 | /* Set up chip specific power management-related functions */ |
5415 | void intel_init_pm(struct drm_device *dev) | 5413 | void intel_init_pm(struct drm_device *dev) |
5416 | { | 5414 | { |