aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/i915/intel_pm.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/drm/i915/intel_pm.c')
-rw-r--r--drivers/gpu/drm/i915/intel_pm.c54
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
3460static void gen6_enable_rps(struct drm_device *dev) 3460static 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
3607static void gen6_update_ring_freq(struct drm_device *dev) 3610void 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. */
5402void intel_aux_display_runtime_get(struct drm_i915_private *dev_priv)
5403{
5404 hsw_disable_package_c8(dev_priv);
5405}
5406
5407void 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 */
5415void intel_init_pm(struct drm_device *dev) 5413void intel_init_pm(struct drm_device *dev)
5416{ 5414{