diff options
-rw-r--r-- | drivers/gpu/drm/i915/intel_display.c | 100 |
1 files changed, 36 insertions, 64 deletions
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c index 4e451faf96c6..1a8a01bc28a4 100644 --- a/drivers/gpu/drm/i915/intel_display.c +++ b/drivers/gpu/drm/i915/intel_display.c | |||
@@ -1331,32 +1331,48 @@ static void vlv_enable_pll(struct drm_i915_private *dev_priv, enum pipe pipe) | |||
1331 | udelay(150); /* wait for warmup */ | 1331 | udelay(150); /* wait for warmup */ |
1332 | } | 1332 | } |
1333 | 1333 | ||
1334 | static void i9xx_enable_pll(struct drm_i915_private *dev_priv, enum pipe pipe) | 1334 | static void i9xx_enable_pll(struct intel_crtc *crtc) |
1335 | { | 1335 | { |
1336 | int reg; | 1336 | struct drm_device *dev = crtc->base.dev; |
1337 | u32 val; | 1337 | struct drm_i915_private *dev_priv = dev->dev_private; |
1338 | int reg = DPLL(crtc->pipe); | ||
1339 | u32 dpll = crtc->config.dpll_hw_state.dpll; | ||
1338 | 1340 | ||
1339 | assert_pipe_disabled(dev_priv, pipe); | 1341 | assert_pipe_disabled(dev_priv, crtc->pipe); |
1340 | 1342 | ||
1341 | /* No really, not for ILK+ */ | 1343 | /* No really, not for ILK+ */ |
1342 | BUG_ON(dev_priv->info->gen >= 5); | 1344 | BUG_ON(dev_priv->info->gen >= 5); |
1343 | 1345 | ||
1344 | /* PLL is protected by panel, make sure we can write it */ | 1346 | /* PLL is protected by panel, make sure we can write it */ |
1345 | if (IS_MOBILE(dev_priv->dev) && !IS_I830(dev_priv->dev)) | 1347 | if (IS_MOBILE(dev) && !IS_I830(dev)) |
1346 | assert_panel_unlocked(dev_priv, pipe); | 1348 | assert_panel_unlocked(dev_priv, crtc->pipe); |
1347 | 1349 | ||
1348 | reg = DPLL(pipe); | 1350 | I915_WRITE(reg, dpll); |
1349 | val = I915_READ(reg); | 1351 | |
1350 | val |= DPLL_VCO_ENABLE; | 1352 | /* Wait for the clocks to stabilize. */ |
1353 | POSTING_READ(reg); | ||
1354 | udelay(150); | ||
1355 | |||
1356 | if (INTEL_INFO(dev)->gen >= 4) { | ||
1357 | I915_WRITE(DPLL_MD(crtc->pipe), | ||
1358 | crtc->config.dpll_hw_state.dpll_md); | ||
1359 | } else { | ||
1360 | /* The pixel multiplier can only be updated once the | ||
1361 | * DPLL is enabled and the clocks are stable. | ||
1362 | * | ||
1363 | * So write it again. | ||
1364 | */ | ||
1365 | I915_WRITE(reg, dpll); | ||
1366 | } | ||
1351 | 1367 | ||
1352 | /* We do this three times for luck */ | 1368 | /* We do this three times for luck */ |
1353 | I915_WRITE(reg, val); | 1369 | I915_WRITE(reg, dpll); |
1354 | POSTING_READ(reg); | 1370 | POSTING_READ(reg); |
1355 | udelay(150); /* wait for warmup */ | 1371 | udelay(150); /* wait for warmup */ |
1356 | I915_WRITE(reg, val); | 1372 | I915_WRITE(reg, dpll); |
1357 | POSTING_READ(reg); | 1373 | POSTING_READ(reg); |
1358 | udelay(150); /* wait for warmup */ | 1374 | udelay(150); /* wait for warmup */ |
1359 | I915_WRITE(reg, val); | 1375 | I915_WRITE(reg, dpll); |
1360 | POSTING_READ(reg); | 1376 | POSTING_READ(reg); |
1361 | udelay(150); /* wait for warmup */ | 1377 | udelay(150); /* wait for warmup */ |
1362 | } | 1378 | } |
@@ -3646,7 +3662,11 @@ static void i9xx_crtc_enable(struct drm_crtc *crtc) | |||
3646 | intel_crtc->active = true; | 3662 | intel_crtc->active = true; |
3647 | intel_update_watermarks(dev); | 3663 | intel_update_watermarks(dev); |
3648 | 3664 | ||
3649 | i9xx_enable_pll(dev_priv, pipe); | 3665 | for_each_encoder_on_crtc(dev, crtc, encoder) |
3666 | if (encoder->pre_pll_enable) | ||
3667 | encoder->pre_pll_enable(encoder); | ||
3668 | |||
3669 | i9xx_enable_pll(intel_crtc); | ||
3650 | 3670 | ||
3651 | for_each_encoder_on_crtc(dev, crtc, encoder) | 3671 | for_each_encoder_on_crtc(dev, crtc, encoder) |
3652 | if (encoder->pre_enable) | 3672 | if (encoder->pre_enable) |
@@ -4488,8 +4508,6 @@ static void i9xx_update_pll(struct intel_crtc *crtc, | |||
4488 | { | 4508 | { |
4489 | struct drm_device *dev = crtc->base.dev; | 4509 | struct drm_device *dev = crtc->base.dev; |
4490 | struct drm_i915_private *dev_priv = dev->dev_private; | 4510 | struct drm_i915_private *dev_priv = dev->dev_private; |
4491 | struct intel_encoder *encoder; | ||
4492 | int pipe = crtc->pipe; | ||
4493 | u32 dpll; | 4511 | u32 dpll; |
4494 | bool is_sdvo; | 4512 | bool is_sdvo; |
4495 | struct dpll *clock = &crtc->config.dpll; | 4513 | struct dpll *clock = &crtc->config.dpll; |
@@ -4553,37 +4571,14 @@ static void i9xx_update_pll(struct intel_crtc *crtc, | |||
4553 | dpll |= DPLL_VCO_ENABLE; | 4571 | dpll |= DPLL_VCO_ENABLE; |
4554 | crtc->config.dpll_hw_state.dpll = dpll; | 4572 | crtc->config.dpll_hw_state.dpll = dpll; |
4555 | 4573 | ||
4556 | I915_WRITE(DPLL(pipe), dpll & ~DPLL_VCO_ENABLE); | ||
4557 | POSTING_READ(DPLL(pipe)); | ||
4558 | udelay(150); | ||
4559 | |||
4560 | for_each_encoder_on_crtc(dev, &crtc->base, encoder) | ||
4561 | if (encoder->pre_pll_enable) | ||
4562 | encoder->pre_pll_enable(encoder); | ||
4563 | |||
4564 | if (crtc->config.has_dp_encoder) | ||
4565 | intel_dp_set_m_n(crtc); | ||
4566 | |||
4567 | I915_WRITE(DPLL(pipe), dpll); | ||
4568 | |||
4569 | /* Wait for the clocks to stabilize. */ | ||
4570 | POSTING_READ(DPLL(pipe)); | ||
4571 | udelay(150); | ||
4572 | |||
4573 | if (INTEL_INFO(dev)->gen >= 4) { | 4574 | if (INTEL_INFO(dev)->gen >= 4) { |
4574 | u32 dpll_md = (crtc->config.pixel_multiplier - 1) | 4575 | u32 dpll_md = (crtc->config.pixel_multiplier - 1) |
4575 | << DPLL_MD_UDI_MULTIPLIER_SHIFT; | 4576 | << DPLL_MD_UDI_MULTIPLIER_SHIFT; |
4576 | crtc->config.dpll_hw_state.dpll_md = dpll_md; | 4577 | crtc->config.dpll_hw_state.dpll_md = dpll_md; |
4577 | |||
4578 | I915_WRITE(DPLL_MD(pipe), dpll_md); | ||
4579 | } else { | ||
4580 | /* The pixel multiplier can only be updated once the | ||
4581 | * DPLL is enabled and the clocks are stable. | ||
4582 | * | ||
4583 | * So write it again. | ||
4584 | */ | ||
4585 | I915_WRITE(DPLL(pipe), dpll); | ||
4586 | } | 4578 | } |
4579 | |||
4580 | if (crtc->config.has_dp_encoder) | ||
4581 | intel_dp_set_m_n(crtc); | ||
4587 | } | 4582 | } |
4588 | 4583 | ||
4589 | static void i8xx_update_pll(struct intel_crtc *crtc, | 4584 | static void i8xx_update_pll(struct intel_crtc *crtc, |
@@ -4592,8 +4587,6 @@ static void i8xx_update_pll(struct intel_crtc *crtc, | |||
4592 | { | 4587 | { |
4593 | struct drm_device *dev = crtc->base.dev; | 4588 | struct drm_device *dev = crtc->base.dev; |
4594 | struct drm_i915_private *dev_priv = dev->dev_private; | 4589 | struct drm_i915_private *dev_priv = dev->dev_private; |
4595 | struct intel_encoder *encoder; | ||
4596 | int pipe = crtc->pipe; | ||
4597 | u32 dpll; | 4590 | u32 dpll; |
4598 | struct dpll *clock = &crtc->config.dpll; | 4591 | struct dpll *clock = &crtc->config.dpll; |
4599 | 4592 | ||
@@ -4620,27 +4613,6 @@ static void i8xx_update_pll(struct intel_crtc *crtc, | |||
4620 | 4613 | ||
4621 | dpll |= DPLL_VCO_ENABLE; | 4614 | dpll |= DPLL_VCO_ENABLE; |
4622 | crtc->config.dpll_hw_state.dpll = dpll; | 4615 | crtc->config.dpll_hw_state.dpll = dpll; |
4623 | |||
4624 | I915_WRITE(DPLL(pipe), dpll & ~DPLL_VCO_ENABLE); | ||
4625 | POSTING_READ(DPLL(pipe)); | ||
4626 | udelay(150); | ||
4627 | |||
4628 | for_each_encoder_on_crtc(dev, &crtc->base, encoder) | ||
4629 | if (encoder->pre_pll_enable) | ||
4630 | encoder->pre_pll_enable(encoder); | ||
4631 | |||
4632 | I915_WRITE(DPLL(pipe), dpll); | ||
4633 | |||
4634 | /* Wait for the clocks to stabilize. */ | ||
4635 | POSTING_READ(DPLL(pipe)); | ||
4636 | udelay(150); | ||
4637 | |||
4638 | /* The pixel multiplier can only be updated once the | ||
4639 | * DPLL is enabled and the clocks are stable. | ||
4640 | * | ||
4641 | * So write it again. | ||
4642 | */ | ||
4643 | I915_WRITE(DPLL(pipe), dpll); | ||
4644 | } | 4616 | } |
4645 | 4617 | ||
4646 | static void intel_set_pipe_timings(struct intel_crtc *intel_crtc) | 4618 | static void intel_set_pipe_timings(struct intel_crtc *intel_crtc) |