diff options
author | Dave Airlie <airlied@redhat.com> | 2016-07-14 23:50:58 -0400 |
---|---|---|
committer | Dave Airlie <airlied@redhat.com> | 2016-07-14 23:50:58 -0400 |
commit | ff37c05a996bb96eccc21f4fb1b32ba0e24f3443 (patch) | |
tree | c09b09b37521f2f8f3f7a9bb3b0a33a2b3bde1a1 /drivers/gpu/drm/i915/intel_dsi_pll.c | |
parent | 6c181c82106e12dced317e93a7a396cbb8c64f75 (diff) | |
parent | 0b2c0582f1570bfc95aa9ac1cd340a215d8e8335 (diff) |
Merge tag 'drm-intel-next-2016-07-11' of git://anongit.freedesktop.org/drm-intel into drm-next
- select igt testing depencies for CONFIG_DRM_I915_DEBUG (Chris)
- track outputs in crtc state and clean up all our ad-hoc connector/encoder
walking in modest code (Ville)
- demidlayer drm_device/drm_i915_private (Chris Wilson)
- thundering herd fix from Chris Wilson, with lots of help from Tvrtko Ursulin
- piles of assorted clean and fallout from the thundering herd fix
- documentation and more tuning for waitboosting (Chris)
- pooled EU support on bxt (Arun Siluvery)
- bxt support is no longer considered prelimary!
- ring/engine vfunc cleanup from Tvrtko
- introduce intel_wait_for_register helper (Chris)
- opregion updates (Jani Nukla)
- tuning and fixes for wait_for macros (Tvrkto&Imre)
- more kabylake pci ids (Rodrigo)
- pps cleanup and fixes for bxt (Imre)
- move sink crc support over to atomic state (Maarten)
- fix up async fbdev init ordering (Chris)
- fbc fixes from Paulo and Chris
* tag 'drm-intel-next-2016-07-11' of git://anongit.freedesktop.org/drm-intel: (223 commits)
drm/i915: Update DRIVER_DATE to 20160711
drm/i915: Select DRM_VGEM for igt
drm/i915: Select X86_MSR for igt
drm/i915: Fill unused GGTT with scratch pages for VT-d
drm/i915: Introduce Kabypoint PCH for Kabylake H/DT.
drm/i915:gen9: implement WaMediaPoolStateCmdInWABB
drm/i915: Check for invalid cloning earlier during modeset
drm/i915: Simplify hdmi_12bpc_possible()
drm/i915: Kill has_dsi_encoder
drm/i915: s/INTEL_OUTPUT_DISPLAYPORT/INTEL_OUTPUT_DP/
drm/i915: Replace some open coded intel_crtc_has_dp_encoder()s
drm/i915: Kill has_dp_encoder from pipe_config
drm/i915: Replace manual lvds and sdvo/hdmi counting with intel_crtc_has_type()
drm/i915: Unify intel_pipe_has_type() and intel_pipe_will_have_type()
drm/i915: Add output_types bitmask into the crtc state
drm/i915: Remove encoder type checks from MST suspend/resume
drm/i915: Don't mark eDP encoders as MST capable
drm/i915: avoid wait_for_atomic() in non-atomic host2guc_action()
drm/i915: Group the irq breadcrumb variables into the same cacheline
drm/i915: Wake up the bottom-half if we steal their interrupt
...
Diffstat (limited to 'drivers/gpu/drm/i915/intel_dsi_pll.c')
-rw-r--r-- | drivers/gpu/drm/i915/intel_dsi_pll.c | 42 |
1 files changed, 25 insertions, 17 deletions
diff --git a/drivers/gpu/drm/i915/intel_dsi_pll.c b/drivers/gpu/drm/i915/intel_dsi_pll.c index 1765e6e18f2c..6ab58a01b18e 100644 --- a/drivers/gpu/drm/i915/intel_dsi_pll.c +++ b/drivers/gpu/drm/i915/intel_dsi_pll.c | |||
@@ -55,12 +55,10 @@ static int dsi_calc_mnp(struct drm_i915_private *dev_priv, | |||
55 | struct intel_crtc_state *config, | 55 | struct intel_crtc_state *config, |
56 | int target_dsi_clk) | 56 | int target_dsi_clk) |
57 | { | 57 | { |
58 | unsigned int calc_m = 0, calc_p = 0; | ||
59 | unsigned int m_min, m_max, p_min = 2, p_max = 6; | 58 | unsigned int m_min, m_max, p_min = 2, p_max = 6; |
60 | unsigned int m, n, p; | 59 | unsigned int m, n, p; |
61 | int ref_clk; | 60 | unsigned int calc_m, calc_p; |
62 | int delta = target_dsi_clk; | 61 | int delta, ref_clk; |
63 | u32 m_seed; | ||
64 | 62 | ||
65 | /* target_dsi_clk is expected in kHz */ | 63 | /* target_dsi_clk is expected in kHz */ |
66 | if (target_dsi_clk < 300000 || target_dsi_clk > 1150000) { | 64 | if (target_dsi_clk < 300000 || target_dsi_clk > 1150000) { |
@@ -80,6 +78,10 @@ static int dsi_calc_mnp(struct drm_i915_private *dev_priv, | |||
80 | m_max = 92; | 78 | m_max = 92; |
81 | } | 79 | } |
82 | 80 | ||
81 | calc_p = p_min; | ||
82 | calc_m = m_min; | ||
83 | delta = abs(target_dsi_clk - (m_min * ref_clk) / (p_min * n)); | ||
84 | |||
83 | for (m = m_min; m <= m_max && delta; m++) { | 85 | for (m = m_min; m <= m_max && delta; m++) { |
84 | for (p = p_min; p <= p_max && delta; p++) { | 86 | for (p = p_min; p <= p_max && delta; p++) { |
85 | /* | 87 | /* |
@@ -97,11 +99,10 @@ static int dsi_calc_mnp(struct drm_i915_private *dev_priv, | |||
97 | } | 99 | } |
98 | 100 | ||
99 | /* register has log2(N1), this works fine for powers of two */ | 101 | /* register has log2(N1), this works fine for powers of two */ |
100 | n = ffs(n) - 1; | ||
101 | m_seed = lfsr_converts[calc_m - 62]; | ||
102 | config->dsi_pll.ctrl = 1 << (DSI_PLL_P1_POST_DIV_SHIFT + calc_p - 2); | 102 | config->dsi_pll.ctrl = 1 << (DSI_PLL_P1_POST_DIV_SHIFT + calc_p - 2); |
103 | config->dsi_pll.div = n << DSI_PLL_N1_DIV_SHIFT | | 103 | config->dsi_pll.div = |
104 | m_seed << DSI_PLL_M1_DIV_SHIFT; | 104 | (ffs(n) - 1) << DSI_PLL_N1_DIV_SHIFT | |
105 | (u32)lfsr_converts[calc_m - 62] << DSI_PLL_M1_DIV_SHIFT; | ||
105 | 106 | ||
106 | return 0; | 107 | return 0; |
107 | } | 108 | } |
@@ -113,7 +114,7 @@ static int dsi_calc_mnp(struct drm_i915_private *dev_priv, | |||
113 | static int vlv_compute_dsi_pll(struct intel_encoder *encoder, | 114 | static int vlv_compute_dsi_pll(struct intel_encoder *encoder, |
114 | struct intel_crtc_state *config) | 115 | struct intel_crtc_state *config) |
115 | { | 116 | { |
116 | struct drm_i915_private *dev_priv = encoder->base.dev->dev_private; | 117 | struct drm_i915_private *dev_priv = to_i915(encoder->base.dev); |
117 | struct intel_dsi *intel_dsi = enc_to_intel_dsi(&encoder->base); | 118 | struct intel_dsi *intel_dsi = enc_to_intel_dsi(&encoder->base); |
118 | int ret; | 119 | int ret; |
119 | u32 dsi_clk; | 120 | u32 dsi_clk; |
@@ -234,8 +235,11 @@ static void bxt_disable_dsi_pll(struct intel_encoder *encoder) | |||
234 | * PLL lock should deassert within 200us. | 235 | * PLL lock should deassert within 200us. |
235 | * Wait up to 1ms before timing out. | 236 | * Wait up to 1ms before timing out. |
236 | */ | 237 | */ |
237 | if (wait_for((I915_READ(BXT_DSI_PLL_ENABLE) | 238 | if (intel_wait_for_register(dev_priv, |
238 | & BXT_DSI_PLL_LOCKED) == 0, 1)) | 239 | BXT_DSI_PLL_ENABLE, |
240 | BXT_DSI_PLL_LOCKED, | ||
241 | 0, | ||
242 | 1)) | ||
239 | DRM_ERROR("Timeout waiting for PLL lock deassertion\n"); | 243 | DRM_ERROR("Timeout waiting for PLL lock deassertion\n"); |
240 | } | 244 | } |
241 | 245 | ||
@@ -321,7 +325,7 @@ static u32 bxt_dsi_get_pclk(struct intel_encoder *encoder, int pipe_bpp, | |||
321 | u32 dsi_clk; | 325 | u32 dsi_clk; |
322 | u32 dsi_ratio; | 326 | u32 dsi_ratio; |
323 | struct intel_dsi *intel_dsi = enc_to_intel_dsi(&encoder->base); | 327 | struct intel_dsi *intel_dsi = enc_to_intel_dsi(&encoder->base); |
324 | struct drm_i915_private *dev_priv = encoder->base.dev->dev_private; | 328 | struct drm_i915_private *dev_priv = to_i915(encoder->base.dev); |
325 | 329 | ||
326 | /* Divide by zero */ | 330 | /* Divide by zero */ |
327 | if (!pipe_bpp) { | 331 | if (!pipe_bpp) { |
@@ -356,7 +360,7 @@ u32 intel_dsi_get_pclk(struct intel_encoder *encoder, int pipe_bpp, | |||
356 | static void vlv_dsi_reset_clocks(struct intel_encoder *encoder, enum port port) | 360 | static void vlv_dsi_reset_clocks(struct intel_encoder *encoder, enum port port) |
357 | { | 361 | { |
358 | u32 temp; | 362 | u32 temp; |
359 | struct drm_i915_private *dev_priv = encoder->base.dev->dev_private; | 363 | struct drm_i915_private *dev_priv = to_i915(encoder->base.dev); |
360 | struct intel_dsi *intel_dsi = enc_to_intel_dsi(&encoder->base); | 364 | struct intel_dsi *intel_dsi = enc_to_intel_dsi(&encoder->base); |
361 | 365 | ||
362 | temp = I915_READ(MIPI_CTRL(port)); | 366 | temp = I915_READ(MIPI_CTRL(port)); |
@@ -370,7 +374,7 @@ static void vlv_dsi_reset_clocks(struct intel_encoder *encoder, enum port port) | |||
370 | static void bxt_dsi_program_clocks(struct drm_device *dev, enum port port, | 374 | static void bxt_dsi_program_clocks(struct drm_device *dev, enum port port, |
371 | const struct intel_crtc_state *config) | 375 | const struct intel_crtc_state *config) |
372 | { | 376 | { |
373 | struct drm_i915_private *dev_priv = dev->dev_private; | 377 | struct drm_i915_private *dev_priv = to_i915(dev); |
374 | u32 tmp; | 378 | u32 tmp; |
375 | u32 dsi_rate = 0; | 379 | u32 dsi_rate = 0; |
376 | u32 pll_ratio = 0; | 380 | u32 pll_ratio = 0; |
@@ -465,7 +469,7 @@ static int bxt_compute_dsi_pll(struct intel_encoder *encoder, | |||
465 | static void bxt_enable_dsi_pll(struct intel_encoder *encoder, | 469 | static void bxt_enable_dsi_pll(struct intel_encoder *encoder, |
466 | const struct intel_crtc_state *config) | 470 | const struct intel_crtc_state *config) |
467 | { | 471 | { |
468 | struct drm_i915_private *dev_priv = encoder->base.dev->dev_private; | 472 | struct drm_i915_private *dev_priv = to_i915(encoder->base.dev); |
469 | struct intel_dsi *intel_dsi = enc_to_intel_dsi(&encoder->base); | 473 | struct intel_dsi *intel_dsi = enc_to_intel_dsi(&encoder->base); |
470 | enum port port; | 474 | enum port port; |
471 | u32 val; | 475 | u32 val; |
@@ -486,7 +490,11 @@ static void bxt_enable_dsi_pll(struct intel_encoder *encoder, | |||
486 | I915_WRITE(BXT_DSI_PLL_ENABLE, val); | 490 | I915_WRITE(BXT_DSI_PLL_ENABLE, val); |
487 | 491 | ||
488 | /* Timeout and fail if PLL not locked */ | 492 | /* Timeout and fail if PLL not locked */ |
489 | if (wait_for(I915_READ(BXT_DSI_PLL_ENABLE) & BXT_DSI_PLL_LOCKED, 1)) { | 493 | if (intel_wait_for_register(dev_priv, |
494 | BXT_DSI_PLL_ENABLE, | ||
495 | BXT_DSI_PLL_LOCKED, | ||
496 | BXT_DSI_PLL_LOCKED, | ||
497 | 1)) { | ||
490 | DRM_ERROR("Timed out waiting for DSI PLL to lock\n"); | 498 | DRM_ERROR("Timed out waiting for DSI PLL to lock\n"); |
491 | return; | 499 | return; |
492 | } | 500 | } |
@@ -542,7 +550,7 @@ static void bxt_dsi_reset_clocks(struct intel_encoder *encoder, enum port port) | |||
542 | { | 550 | { |
543 | u32 tmp; | 551 | u32 tmp; |
544 | struct drm_device *dev = encoder->base.dev; | 552 | struct drm_device *dev = encoder->base.dev; |
545 | struct drm_i915_private *dev_priv = dev->dev_private; | 553 | struct drm_i915_private *dev_priv = to_i915(dev); |
546 | 554 | ||
547 | /* Clear old configurations */ | 555 | /* Clear old configurations */ |
548 | tmp = I915_READ(BXT_MIPI_CLOCK_CTL); | 556 | tmp = I915_READ(BXT_MIPI_CLOCK_CTL); |