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.c95
1 files changed, 83 insertions, 12 deletions
diff --git a/drivers/gpu/drm/i915/intel_pm.c b/drivers/gpu/drm/i915/intel_pm.c
index 906d06f73e51..d1e53abec1b5 100644
--- a/drivers/gpu/drm/i915/intel_pm.c
+++ b/drivers/gpu/drm/i915/intel_pm.c
@@ -5388,8 +5388,11 @@ static void valleyview_init_clock_gating(struct drm_device *dev)
5388 I915_WRITE(GEN6_UCGCTL2, 5388 I915_WRITE(GEN6_UCGCTL2,
5389 GEN6_RCZUNIT_CLOCK_GATE_DISABLE); 5389 GEN6_RCZUNIT_CLOCK_GATE_DISABLE);
5390 5390
5391 /* WaDisableL3Bank2xClockGate:vlv */ 5391 /* WaDisableL3Bank2xClockGate:vlv
5392 I915_WRITE(GEN7_UCGCTL4, GEN7_L3BANK2X_CLOCK_GATE_DISABLE); 5392 * Disabling L3 clock gating- MMIO 940c[25] = 1
5393 * Set bit 25, to disable L3_BANK_2x_CLK_GATING */
5394 I915_WRITE(GEN7_UCGCTL4,
5395 I915_READ(GEN7_UCGCTL4) | GEN7_L3BANK2X_CLOCK_GATE_DISABLE);
5393 5396
5394 I915_WRITE(MI_ARB_VLV, MI_ARB_DISPLAY_TRICKLE_FEED_DISABLE); 5397 I915_WRITE(MI_ARB_VLV, MI_ARB_DISPLAY_TRICKLE_FEED_DISABLE);
5395 5398
@@ -5541,6 +5544,12 @@ static void gen3_init_clock_gating(struct drm_device *dev)
5541 5544
5542 /* IIR "flip pending" means done if this bit is set */ 5545 /* IIR "flip pending" means done if this bit is set */
5543 I915_WRITE(ECOSKPD, _MASKED_BIT_DISABLE(ECO_FLIP_DONE)); 5546 I915_WRITE(ECOSKPD, _MASKED_BIT_DISABLE(ECO_FLIP_DONE));
5547
5548 /* interrupts should cause a wake up from C3 */
5549 I915_WRITE(INSTPM, _MASKED_BIT_ENABLE(INSTPM_AGPBUSY_INT_EN));
5550
5551 /* On GEN3 we really need to make sure the ARB C3 LP bit is set */
5552 I915_WRITE(MI_ARB_STATE, _MASKED_BIT_ENABLE(MI_ARB_C3_LP_WRITE_ENABLE));
5544} 5553}
5545 5554
5546static void i85x_init_clock_gating(struct drm_device *dev) 5555static void i85x_init_clock_gating(struct drm_device *dev)
@@ -5548,6 +5557,10 @@ static void i85x_init_clock_gating(struct drm_device *dev)
5548 struct drm_i915_private *dev_priv = dev->dev_private; 5557 struct drm_i915_private *dev_priv = dev->dev_private;
5549 5558
5550 I915_WRITE(RENCLK_GATE_D1, SV_CLOCK_GATE_DISABLE); 5559 I915_WRITE(RENCLK_GATE_D1, SV_CLOCK_GATE_DISABLE);
5560
5561 /* interrupts should cause a wake up from C3 */
5562 I915_WRITE(MI_STATE, _MASKED_BIT_ENABLE(MI_AGPBUSY_INT_EN) |
5563 _MASKED_BIT_DISABLE(MI_AGPBUSY_830_MODE));
5551} 5564}
5552 5565
5553static void i830_init_clock_gating(struct drm_device *dev) 5566static void i830_init_clock_gating(struct drm_device *dev)
@@ -5599,10 +5612,25 @@ bool intel_display_power_enabled_sw(struct drm_i915_private *dev_priv,
5599 enum intel_display_power_domain domain) 5612 enum intel_display_power_domain domain)
5600{ 5613{
5601 struct i915_power_domains *power_domains; 5614 struct i915_power_domains *power_domains;
5615 struct i915_power_well *power_well;
5616 bool is_enabled;
5617 int i;
5618
5619 if (dev_priv->pm.suspended)
5620 return false;
5602 5621
5603 power_domains = &dev_priv->power_domains; 5622 power_domains = &dev_priv->power_domains;
5623 is_enabled = true;
5624 for_each_power_well_rev(i, power_well, BIT(domain), power_domains) {
5625 if (power_well->always_on)
5626 continue;
5604 5627
5605 return power_domains->domain_use_count[domain]; 5628 if (!power_well->count) {
5629 is_enabled = false;
5630 break;
5631 }
5632 }
5633 return is_enabled;
5606} 5634}
5607 5635
5608bool intel_display_power_enabled(struct drm_i915_private *dev_priv, 5636bool intel_display_power_enabled(struct drm_i915_private *dev_priv,
@@ -5745,13 +5773,34 @@ static bool i9xx_always_on_power_well_enabled(struct drm_i915_private *dev_priv,
5745 return true; 5773 return true;
5746} 5774}
5747 5775
5748static void vlv_set_power_well(struct drm_i915_private *dev_priv, 5776void __vlv_set_power_well(struct drm_i915_private *dev_priv,
5749 struct i915_power_well *power_well, bool enable) 5777 enum punit_power_well power_well_id, bool enable)
5750{ 5778{
5751 enum punit_power_well power_well_id = power_well->data; 5779 struct drm_device *dev = dev_priv->dev;
5752 u32 mask; 5780 u32 mask;
5753 u32 state; 5781 u32 state;
5754 u32 ctrl; 5782 u32 ctrl;
5783 enum pipe pipe;
5784
5785 if (power_well_id == PUNIT_POWER_WELL_DPIO_CMN_BC) {
5786 if (enable) {
5787 /*
5788 * Enable the CRI clock source so we can get at the
5789 * display and the reference clock for VGA
5790 * hotplug / manual detection.
5791 */
5792 I915_WRITE(DPLL(PIPE_B), I915_READ(DPLL(PIPE_B)) |
5793 DPLL_REFA_CLK_ENABLE_VLV |
5794 DPLL_INTEGRATED_CRI_CLK_VLV);
5795 udelay(1); /* >10ns for cmnreset, >0ns for sidereset */
5796 } else {
5797 for_each_pipe(pipe)
5798 assert_pll_disabled(dev_priv, pipe);
5799 /* Assert common reset */
5800 I915_WRITE(DPIO_CTL, I915_READ(DPIO_CTL) &
5801 ~DPIO_CMNRST);
5802 }
5803 }
5755 5804
5756 mask = PUNIT_PWRGT_MASK(power_well_id); 5805 mask = PUNIT_PWRGT_MASK(power_well_id);
5757 state = enable ? PUNIT_PWRGT_PWR_ON(power_well_id) : 5806 state = enable ? PUNIT_PWRGT_PWR_ON(power_well_id) :
@@ -5779,6 +5828,28 @@ static void vlv_set_power_well(struct drm_i915_private *dev_priv,
5779 5828
5780out: 5829out:
5781 mutex_unlock(&dev_priv->rps.hw_lock); 5830 mutex_unlock(&dev_priv->rps.hw_lock);
5831
5832 /*
5833 * From VLV2A0_DP_eDP_DPIO_driver_vbios_notes_10.docx -
5834 * 6. De-assert cmn_reset/side_reset. Same as VLV X0.
5835 * a. GUnit 0x2110 bit[0] set to 1 (def 0)
5836 * b. The other bits such as sfr settings / modesel may all
5837 * be set to 0.
5838 *
5839 * This should only be done on init and resume from S3 with
5840 * both PLLs disabled, or we risk losing DPIO and PLL
5841 * synchronization.
5842 */
5843 if (power_well_id == PUNIT_POWER_WELL_DPIO_CMN_BC && enable)
5844 I915_WRITE(DPIO_CTL, I915_READ(DPIO_CTL) | DPIO_CMNRST);
5845}
5846
5847static void vlv_set_power_well(struct drm_i915_private *dev_priv,
5848 struct i915_power_well *power_well, bool enable)
5849{
5850 enum punit_power_well power_well_id = power_well->data;
5851
5852 __vlv_set_power_well(dev_priv, power_well_id, enable);
5782} 5853}
5783 5854
5784static void vlv_power_well_sync_hw(struct drm_i915_private *dev_priv, 5855static void vlv_power_well_sync_hw(struct drm_i915_private *dev_priv,
@@ -6114,12 +6185,6 @@ static struct i915_power_well vlv_power_wells[] = {
6114 .ops = &vlv_display_power_well_ops, 6185 .ops = &vlv_display_power_well_ops,
6115 }, 6186 },
6116 { 6187 {
6117 .name = "dpio-common",
6118 .domains = VLV_DPIO_CMN_BC_POWER_DOMAINS,
6119 .data = PUNIT_POWER_WELL_DPIO_CMN_BC,
6120 .ops = &vlv_dpio_power_well_ops,
6121 },
6122 {
6123 .name = "dpio-tx-b-01", 6188 .name = "dpio-tx-b-01",
6124 .domains = VLV_DPIO_TX_B_LANES_01_POWER_DOMAINS | 6189 .domains = VLV_DPIO_TX_B_LANES_01_POWER_DOMAINS |
6125 VLV_DPIO_TX_B_LANES_23_POWER_DOMAINS | 6190 VLV_DPIO_TX_B_LANES_23_POWER_DOMAINS |
@@ -6155,6 +6220,12 @@ static struct i915_power_well vlv_power_wells[] = {
6155 .ops = &vlv_dpio_power_well_ops, 6220 .ops = &vlv_dpio_power_well_ops,
6156 .data = PUNIT_POWER_WELL_DPIO_TX_C_LANES_23, 6221 .data = PUNIT_POWER_WELL_DPIO_TX_C_LANES_23,
6157 }, 6222 },
6223 {
6224 .name = "dpio-common",
6225 .domains = VLV_DPIO_CMN_BC_POWER_DOMAINS,
6226 .data = PUNIT_POWER_WELL_DPIO_CMN_BC,
6227 .ops = &vlv_dpio_power_well_ops,
6228 },
6158}; 6229};
6159 6230
6160#define set_power_wells(power_domains, __power_wells) ({ \ 6231#define set_power_wells(power_domains, __power_wells) ({ \