summaryrefslogtreecommitdiff
path: root/drivers/gpu/drm/i915/intel_display.c
diff options
context:
space:
mode:
authorDave Airlie <airlied@redhat.com>2012-06-20 19:17:08 +0100
committerDave Airlie <airlied@redhat.com>2012-06-20 19:17:08 +0100
commit9c19415c233499c26081798b880910ec0e1d7bad (patch)
treeb3296d2ec56cd9fc2eb9dfea7bc85afeab6dd98d /drivers/gpu/drm/i915/intel_display.c
parentfb09185a88cad9c59e22e84f8c0594303595e9af (diff)
parent1523c310b3ed964b71a8db16f70c3bc21cc0642e (diff)
Merge tag 'drm-intel-next-2012-06-04' of git://people.freedesktop.org/~danvet/drm-intel into drm-core-next
Daniel Vetter writes: rc2 is out the door so I've figured I'll annoy you with the first -next pull request for 3.6 already. Highlights: - new wait_rendring_timeout interface (Ben) - l3 cache remapping and error uevent support (Ben) - even more infoframes work from Paulo - gen4 hotplug rework from Chris - prep work to make Laurent Pincharts original mode constification for connector->mode_fixup possible QA reported a few new bugs this time around, but no regressions afact. For 3.5 the only thing I'm aware of is the edp vdd dmesg spam Linus originally reported - it looks like that might have been introduced in 3.5. But somehow my brain is routinely offline when I work on that issue, so things seem to take forever (and atm I'm at patch v4 for that little problem). * tag 'drm-intel-next-2012-06-04' of git://people.freedesktop.org/~danvet/drm-intel: (39 commits) drm/i915: add min freq control to debugfs drm/i915: don't chnage the original mode in dp_mode_fixup drm/i915: adjusted_mode->clock in the dp mode_fixup drm/i915: compute the target_clock for edp directly drm/i915: extract object active state flushing code drm/i915: clarify IBX dp workaround drm/i915: simplify sysfs setup code drm/i915: initialize the parity work only once drm/i915: ivybridge_handle_parity_error should be static drm/i915: l3 parity sysfs interface drm/i915: remap l3 on hw init drm/i915: enable parity error interrupts drm/i915: Dynamic Parity Detection handling drm/i915: s/mdelay/msleep/ in the sdvo detect function drm/i915: reuse the sdvo tv clock adjustment in ilk mode_set drm/i915: there's no cxsr on ilk drm/i915: add some barriers when changing DIPs drm/i915: remove comment about HSW HDMI DIPs drm/i915: don't set SDVO_BORDER_ENABLE when we're HDMI drm/i915: don't write 0 to DIP control at HDMI init ...
Diffstat (limited to 'drivers/gpu/drm/i915/intel_display.c')
-rw-r--r--drivers/gpu/drm/i915/intel_display.c47
1 files changed, 12 insertions, 35 deletions
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
index a7c727d0c105..add1a15dc8b3 100644
--- a/drivers/gpu/drm/i915/intel_display.c
+++ b/drivers/gpu/drm/i915/intel_display.c
@@ -4405,25 +4405,10 @@ static int ironlake_crtc_mode_set(struct drm_crtc *crtc,
&clock,
&reduced_clock);
}
- /* SDVO TV has fixed PLL values depend on its clock range,
- this mirrors vbios setting. */
- if (is_sdvo && is_tv) {
- if (adjusted_mode->clock >= 100000
- && adjusted_mode->clock < 140500) {
- clock.p1 = 2;
- clock.p2 = 10;
- clock.n = 3;
- clock.m1 = 16;
- clock.m2 = 8;
- } else if (adjusted_mode->clock >= 140500
- && adjusted_mode->clock <= 200000) {
- clock.p1 = 1;
- clock.p2 = 10;
- clock.n = 6;
- clock.m1 = 12;
- clock.m2 = 8;
- }
- }
+
+ if (is_sdvo && is_tv)
+ i9xx_adjust_sdvo_tv_clock(adjusted_mode, &clock);
+
/* FDI link */
pixel_multiplier = intel_mode_get_pixel_multiplier(adjusted_mode);
@@ -4431,16 +4416,8 @@ static int ironlake_crtc_mode_set(struct drm_crtc *crtc,
/* CPU eDP doesn't require FDI link, so just set DP M/N
according to current link config */
if (is_cpu_edp) {
- target_clock = mode->clock;
intel_edp_link_config(edp_encoder, &lane, &link_bw);
} else {
- /* [e]DP over FDI requires target mode clock
- instead of link clock */
- if (is_dp)
- target_clock = mode->clock;
- else
- target_clock = adjusted_mode->clock;
-
/* FDI is a binary signal running at ~2.7GHz, encoding
* each output octet as 10 bits. The actual frequency
* is stored as a divider into a 100MHz clock, and the
@@ -4451,6 +4428,14 @@ static int ironlake_crtc_mode_set(struct drm_crtc *crtc,
link_bw = intel_fdi_link_freq(dev) * MHz(100)/KHz(1)/10;
}
+ /* [e]DP over FDI requires target mode clock instead of link clock. */
+ if (edp_encoder)
+ target_clock = intel_edp_target_clock(edp_encoder, mode);
+ else if (is_dp)
+ target_clock = mode->clock;
+ else
+ target_clock = adjusted_mode->clock;
+
/* determine panel color depth */
temp = I915_READ(PIPECONF(pipe));
temp &= ~PIPE_BPC_MASK;
@@ -4662,16 +4647,8 @@ static int ironlake_crtc_mode_set(struct drm_crtc *crtc,
if (is_lvds && has_reduced_clock && i915_powersave) {
I915_WRITE(intel_crtc->pch_pll->fp1_reg, fp2);
intel_crtc->lowfreq_avail = true;
- if (HAS_PIPE_CXSR(dev)) {
- DRM_DEBUG_KMS("enabling CxSR downclocking\n");
- pipeconf |= PIPECONF_CXSR_DOWNCLOCK;
- }
} else {
I915_WRITE(intel_crtc->pch_pll->fp1_reg, fp);
- if (HAS_PIPE_CXSR(dev)) {
- DRM_DEBUG_KMS("disabling CxSR downclocking\n");
- pipeconf &= ~PIPECONF_CXSR_DOWNCLOCK;
- }
}
}