2 * Copyright © 2006-2016 Intel Corporation
4 * Permission is hereby granted, free of charge, to any person obtaining a
5 * copy of this software and associated documentation files (the "Software"),
6 * to deal in the Software without restriction, including without limitation
7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8 * and/or sell copies of the Software, and to permit persons to whom the
9 * Software is furnished to do so, subject to the following conditions:
11 * The above copyright notice and this permission notice (including the next
12 * paragraph) shall be included in all copies or substantial portions of the
15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
18 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
21 * DEALINGS IN THE SOFTWARE.
24 #include "intel_drv.h"
26 struct intel_shared_dpll
*
27 intel_get_shared_dpll_by_id(struct drm_i915_private
*dev_priv
,
28 enum intel_dpll_id id
)
30 return &dev_priv
->shared_dplls
[id
];
34 intel_get_shared_dpll_id(struct drm_i915_private
*dev_priv
,
35 struct intel_shared_dpll
*pll
)
37 if (WARN_ON(pll
< dev_priv
->shared_dplls
||
38 pll
> &dev_priv
->shared_dplls
[dev_priv
->num_shared_dpll
]))
41 return (enum intel_dpll_id
) (pll
- dev_priv
->shared_dplls
);
45 intel_shared_dpll_config_get(struct intel_shared_dpll_config
*config
,
46 struct intel_shared_dpll
*pll
,
47 struct intel_crtc
*crtc
)
49 struct drm_i915_private
*dev_priv
= to_i915(crtc
->base
.dev
);
50 enum intel_dpll_id id
= intel_get_shared_dpll_id(dev_priv
, pll
);
52 config
[id
].crtc_mask
|= 1 << crtc
->pipe
;
56 intel_shared_dpll_config_put(struct intel_shared_dpll_config
*config
,
57 struct intel_shared_dpll
*pll
,
58 struct intel_crtc
*crtc
)
60 struct drm_i915_private
*dev_priv
= to_i915(crtc
->base
.dev
);
61 enum intel_dpll_id id
= intel_get_shared_dpll_id(dev_priv
, pll
);
63 config
[id
].crtc_mask
&= ~(1 << crtc
->pipe
);
67 void assert_shared_dpll(struct drm_i915_private
*dev_priv
,
68 struct intel_shared_dpll
*pll
,
72 struct intel_dpll_hw_state hw_state
;
74 if (WARN(!pll
, "asserting DPLL %s with no DPLL\n", onoff(state
)))
77 cur_state
= pll
->funcs
.get_hw_state(dev_priv
, pll
, &hw_state
);
78 I915_STATE_WARN(cur_state
!= state
,
79 "%s assertion failure (expected %s, current %s)\n",
80 pll
->name
, onoff(state
), onoff(cur_state
));
83 void intel_prepare_shared_dpll(struct intel_crtc
*crtc
)
85 struct drm_device
*dev
= crtc
->base
.dev
;
86 struct drm_i915_private
*dev_priv
= dev
->dev_private
;
87 struct intel_shared_dpll
*pll
= crtc
->config
->shared_dpll
;
89 if (WARN_ON(pll
== NULL
))
92 WARN_ON(!pll
->config
.crtc_mask
);
93 if (pll
->active
== 0) {
94 DRM_DEBUG_DRIVER("setting up %s\n", pll
->name
);
96 assert_shared_dpll_disabled(dev_priv
, pll
);
98 pll
->funcs
.mode_set(dev_priv
, pll
);
103 * intel_enable_shared_dpll - enable PCH PLL
104 * @dev_priv: i915 private structure
105 * @pipe: pipe PLL to enable
107 * The PCH PLL needs to be enabled before the PCH transcoder, since it
108 * drives the transcoder clock.
110 void intel_enable_shared_dpll(struct intel_crtc
*crtc
)
112 struct drm_device
*dev
= crtc
->base
.dev
;
113 struct drm_i915_private
*dev_priv
= dev
->dev_private
;
114 struct intel_shared_dpll
*pll
= crtc
->config
->shared_dpll
;
116 if (WARN_ON(pll
== NULL
))
119 if (WARN_ON(pll
->config
.crtc_mask
== 0))
122 DRM_DEBUG_KMS("enable %s (active %d, on? %d) for crtc %d\n",
123 pll
->name
, pll
->active
, pll
->on
,
128 assert_shared_dpll_enabled(dev_priv
, pll
);
133 intel_display_power_get(dev_priv
, POWER_DOMAIN_PLLS
);
135 DRM_DEBUG_KMS("enabling %s\n", pll
->name
);
136 pll
->funcs
.enable(dev_priv
, pll
);
140 void intel_disable_shared_dpll(struct intel_crtc
*crtc
)
142 struct drm_device
*dev
= crtc
->base
.dev
;
143 struct drm_i915_private
*dev_priv
= dev
->dev_private
;
144 struct intel_shared_dpll
*pll
= crtc
->config
->shared_dpll
;
146 /* PCH only available on ILK+ */
147 if (INTEL_INFO(dev
)->gen
< 5)
153 if (WARN_ON(!(pll
->config
.crtc_mask
& (1 << drm_crtc_index(&crtc
->base
)))))
156 DRM_DEBUG_KMS("disable %s (active %d, on? %d) for crtc %d\n",
157 pll
->name
, pll
->active
, pll
->on
,
160 if (WARN_ON(pll
->active
== 0)) {
161 assert_shared_dpll_disabled(dev_priv
, pll
);
165 assert_shared_dpll_enabled(dev_priv
, pll
);
170 DRM_DEBUG_KMS("disabling %s\n", pll
->name
);
171 pll
->funcs
.disable(dev_priv
, pll
);
174 intel_display_power_put(dev_priv
, POWER_DOMAIN_PLLS
);
177 static struct intel_shared_dpll
*
178 intel_find_shared_dpll(struct intel_crtc
*crtc
,
179 struct intel_crtc_state
*crtc_state
,
180 enum intel_dpll_id range_min
,
181 enum intel_dpll_id range_max
)
183 struct drm_i915_private
*dev_priv
= crtc
->base
.dev
->dev_private
;
184 struct intel_shared_dpll
*pll
;
185 struct intel_shared_dpll_config
*shared_dpll
;
186 enum intel_dpll_id i
;
188 shared_dpll
= intel_atomic_get_shared_dpll_state(crtc_state
->base
.state
);
190 for (i
= range_min
; i
<= range_max
; i
++) {
191 pll
= &dev_priv
->shared_dplls
[i
];
193 /* Only want to check enabled timings first */
194 if (shared_dpll
[i
].crtc_mask
== 0)
197 if (memcmp(&crtc_state
->dpll_hw_state
,
198 &shared_dpll
[i
].hw_state
,
199 sizeof(crtc_state
->dpll_hw_state
)) == 0) {
200 DRM_DEBUG_KMS("CRTC:%d sharing existing %s (crtc mask 0x%08x, ative %d)\n",
201 crtc
->base
.base
.id
, pll
->name
,
202 shared_dpll
[i
].crtc_mask
,
208 /* Ok no matching timings, maybe there's a free one? */
209 for (i
= range_min
; i
<= range_max
; i
++) {
210 pll
= &dev_priv
->shared_dplls
[i
];
211 if (shared_dpll
[i
].crtc_mask
== 0) {
212 DRM_DEBUG_KMS("CRTC:%d allocated %s\n",
213 crtc
->base
.base
.id
, pll
->name
);
222 intel_reference_shared_dpll(struct intel_shared_dpll
*pll
,
223 struct intel_crtc_state
*crtc_state
)
225 struct intel_shared_dpll_config
*shared_dpll
;
226 struct intel_crtc
*crtc
= to_intel_crtc(crtc_state
->base
.crtc
);
227 enum intel_dpll_id i
= pll
->id
;
229 shared_dpll
= intel_atomic_get_shared_dpll_state(crtc_state
->base
.state
);
231 if (shared_dpll
[i
].crtc_mask
== 0)
232 shared_dpll
[i
].hw_state
=
233 crtc_state
->dpll_hw_state
;
235 crtc_state
->shared_dpll
= pll
;
236 DRM_DEBUG_DRIVER("using %s for pipe %c\n", pll
->name
,
237 pipe_name(crtc
->pipe
));
239 intel_shared_dpll_config_get(shared_dpll
, pll
, crtc
);
242 void intel_shared_dpll_commit(struct drm_atomic_state
*state
)
244 struct drm_i915_private
*dev_priv
= to_i915(state
->dev
);
245 struct intel_shared_dpll_config
*shared_dpll
;
246 struct intel_shared_dpll
*pll
;
247 enum intel_dpll_id i
;
249 if (!to_intel_atomic_state(state
)->dpll_set
)
252 shared_dpll
= to_intel_atomic_state(state
)->shared_dpll
;
253 for (i
= 0; i
< dev_priv
->num_shared_dpll
; i
++) {
254 pll
= &dev_priv
->shared_dplls
[i
];
255 pll
->config
= shared_dpll
[i
];
259 static bool ibx_pch_dpll_get_hw_state(struct drm_i915_private
*dev_priv
,
260 struct intel_shared_dpll
*pll
,
261 struct intel_dpll_hw_state
*hw_state
)
265 if (!intel_display_power_get_if_enabled(dev_priv
, POWER_DOMAIN_PLLS
))
268 val
= I915_READ(PCH_DPLL(pll
->id
));
269 hw_state
->dpll
= val
;
270 hw_state
->fp0
= I915_READ(PCH_FP0(pll
->id
));
271 hw_state
->fp1
= I915_READ(PCH_FP1(pll
->id
));
273 intel_display_power_put(dev_priv
, POWER_DOMAIN_PLLS
);
275 return val
& DPLL_VCO_ENABLE
;
278 static void ibx_pch_dpll_mode_set(struct drm_i915_private
*dev_priv
,
279 struct intel_shared_dpll
*pll
)
281 I915_WRITE(PCH_FP0(pll
->id
), pll
->config
.hw_state
.fp0
);
282 I915_WRITE(PCH_FP1(pll
->id
), pll
->config
.hw_state
.fp1
);
285 static void ibx_assert_pch_refclk_enabled(struct drm_i915_private
*dev_priv
)
290 I915_STATE_WARN_ON(!(HAS_PCH_IBX(dev_priv
->dev
) || HAS_PCH_CPT(dev_priv
->dev
)));
292 val
= I915_READ(PCH_DREF_CONTROL
);
293 enabled
= !!(val
& (DREF_SSC_SOURCE_MASK
| DREF_NONSPREAD_SOURCE_MASK
|
294 DREF_SUPERSPREAD_SOURCE_MASK
));
295 I915_STATE_WARN(!enabled
, "PCH refclk assertion failure, should be active but is disabled\n");
298 static void ibx_pch_dpll_enable(struct drm_i915_private
*dev_priv
,
299 struct intel_shared_dpll
*pll
)
301 /* PCH refclock must be enabled first */
302 ibx_assert_pch_refclk_enabled(dev_priv
);
304 I915_WRITE(PCH_DPLL(pll
->id
), pll
->config
.hw_state
.dpll
);
306 /* Wait for the clocks to stabilize. */
307 POSTING_READ(PCH_DPLL(pll
->id
));
310 /* The pixel multiplier can only be updated once the
311 * DPLL is enabled and the clocks are stable.
315 I915_WRITE(PCH_DPLL(pll
->id
), pll
->config
.hw_state
.dpll
);
316 POSTING_READ(PCH_DPLL(pll
->id
));
320 static void ibx_pch_dpll_disable(struct drm_i915_private
*dev_priv
,
321 struct intel_shared_dpll
*pll
)
323 struct drm_device
*dev
= dev_priv
->dev
;
324 struct intel_crtc
*crtc
;
326 /* Make sure no transcoder isn't still depending on us. */
327 for_each_intel_crtc(dev
, crtc
) {
328 if (crtc
->config
->shared_dpll
== pll
)
329 assert_pch_transcoder_disabled(dev_priv
, crtc
->pipe
);
332 I915_WRITE(PCH_DPLL(pll
->id
), 0);
333 POSTING_READ(PCH_DPLL(pll
->id
));
337 static struct intel_shared_dpll
*
338 ibx_get_dpll(struct intel_crtc
*crtc
, struct intel_crtc_state
*crtc_state
,
339 struct intel_encoder
*encoder
)
341 struct drm_i915_private
*dev_priv
= to_i915(crtc
->base
.dev
);
342 struct intel_shared_dpll
*pll
;
343 enum intel_dpll_id i
;
345 if (HAS_PCH_IBX(dev_priv
)) {
346 /* Ironlake PCH has a fixed PLL->PCH pipe mapping. */
347 i
= (enum intel_dpll_id
) crtc
->pipe
;
348 pll
= &dev_priv
->shared_dplls
[i
];
350 DRM_DEBUG_KMS("CRTC:%d using pre-allocated %s\n",
351 crtc
->base
.base
.id
, pll
->name
);
353 pll
= intel_find_shared_dpll(crtc
, crtc_state
,
358 /* reference the pll */
359 intel_reference_shared_dpll(pll
, crtc_state
);
364 static const struct intel_shared_dpll_funcs ibx_pch_dpll_funcs
= {
365 .mode_set
= ibx_pch_dpll_mode_set
,
366 .enable
= ibx_pch_dpll_enable
,
367 .disable
= ibx_pch_dpll_disable
,
368 .get_hw_state
= ibx_pch_dpll_get_hw_state
,
371 static void hsw_ddi_wrpll_enable(struct drm_i915_private
*dev_priv
,
372 struct intel_shared_dpll
*pll
)
374 I915_WRITE(WRPLL_CTL(pll
->id
), pll
->config
.hw_state
.wrpll
);
375 POSTING_READ(WRPLL_CTL(pll
->id
));
379 static void hsw_ddi_spll_enable(struct drm_i915_private
*dev_priv
,
380 struct intel_shared_dpll
*pll
)
382 I915_WRITE(SPLL_CTL
, pll
->config
.hw_state
.spll
);
383 POSTING_READ(SPLL_CTL
);
387 static void hsw_ddi_wrpll_disable(struct drm_i915_private
*dev_priv
,
388 struct intel_shared_dpll
*pll
)
392 val
= I915_READ(WRPLL_CTL(pll
->id
));
393 I915_WRITE(WRPLL_CTL(pll
->id
), val
& ~WRPLL_PLL_ENABLE
);
394 POSTING_READ(WRPLL_CTL(pll
->id
));
397 static void hsw_ddi_spll_disable(struct drm_i915_private
*dev_priv
,
398 struct intel_shared_dpll
*pll
)
402 val
= I915_READ(SPLL_CTL
);
403 I915_WRITE(SPLL_CTL
, val
& ~SPLL_PLL_ENABLE
);
404 POSTING_READ(SPLL_CTL
);
407 static bool hsw_ddi_wrpll_get_hw_state(struct drm_i915_private
*dev_priv
,
408 struct intel_shared_dpll
*pll
,
409 struct intel_dpll_hw_state
*hw_state
)
413 if (!intel_display_power_get_if_enabled(dev_priv
, POWER_DOMAIN_PLLS
))
416 val
= I915_READ(WRPLL_CTL(pll
->id
));
417 hw_state
->wrpll
= val
;
419 intel_display_power_put(dev_priv
, POWER_DOMAIN_PLLS
);
421 return val
& WRPLL_PLL_ENABLE
;
424 static bool hsw_ddi_spll_get_hw_state(struct drm_i915_private
*dev_priv
,
425 struct intel_shared_dpll
*pll
,
426 struct intel_dpll_hw_state
*hw_state
)
430 if (!intel_display_power_get_if_enabled(dev_priv
, POWER_DOMAIN_PLLS
))
433 val
= I915_READ(SPLL_CTL
);
434 hw_state
->spll
= val
;
436 intel_display_power_put(dev_priv
, POWER_DOMAIN_PLLS
);
438 return val
& SPLL_PLL_ENABLE
;
441 static uint32_t hsw_pll_to_ddi_pll_sel(struct intel_shared_dpll
*pll
)
445 return PORT_CLK_SEL_WRPLL1
;
447 return PORT_CLK_SEL_WRPLL2
;
449 return PORT_CLK_SEL_SPLL
;
450 case DPLL_ID_LCPLL_810
:
451 return PORT_CLK_SEL_LCPLL_810
;
452 case DPLL_ID_LCPLL_1350
:
453 return PORT_CLK_SEL_LCPLL_1350
;
454 case DPLL_ID_LCPLL_2700
:
455 return PORT_CLK_SEL_LCPLL_2700
;
457 return PORT_CLK_SEL_NONE
;
462 #define LC_FREQ_2K U64_C(LC_FREQ * 2000)
468 /* Constraints for PLL good behavior */
474 struct hsw_wrpll_rnp
{
478 static unsigned hsw_wrpll_get_budget_for_freq(int clock
)
552 static void hsw_wrpll_update_rnp(uint64_t freq2k
, unsigned budget
,
553 unsigned r2
, unsigned n2
, unsigned p
,
554 struct hsw_wrpll_rnp
*best
)
556 uint64_t a
, b
, c
, d
, diff
, diff_best
;
558 /* No best (r,n,p) yet */
567 * Output clock is (LC_FREQ_2K / 2000) * N / (P * R), which compares to
571 * abs(freq2k - (LC_FREQ_2K * n2/(p * r2))) /
574 * and we would like delta <= budget.
576 * If the discrepancy is above the PPM-based budget, always prefer to
577 * improve upon the previous solution. However, if you're within the
578 * budget, try to maximize Ref * VCO, that is N / (P * R^2).
580 a
= freq2k
* budget
* p
* r2
;
581 b
= freq2k
* budget
* best
->p
* best
->r2
;
582 diff
= abs_diff(freq2k
* p
* r2
, LC_FREQ_2K
* n2
);
583 diff_best
= abs_diff(freq2k
* best
->p
* best
->r2
,
584 LC_FREQ_2K
* best
->n2
);
586 d
= 1000000 * diff_best
;
588 if (a
< c
&& b
< d
) {
589 /* If both are above the budget, pick the closer */
590 if (best
->p
* best
->r2
* diff
< p
* r2
* diff_best
) {
595 } else if (a
>= c
&& b
< d
) {
596 /* If A is below the threshold but B is above it? Update. */
600 } else if (a
>= c
&& b
>= d
) {
601 /* Both are below the limit, so pick the higher n2/(r2*r2) */
602 if (n2
* best
->r2
* best
->r2
> best
->n2
* r2
* r2
) {
608 /* Otherwise a < c && b >= d, do nothing */
612 hsw_ddi_calculate_wrpll(int clock
/* in Hz */,
613 unsigned *r2_out
, unsigned *n2_out
, unsigned *p_out
)
617 struct hsw_wrpll_rnp best
= { 0, 0, 0 };
620 freq2k
= clock
/ 100;
622 budget
= hsw_wrpll_get_budget_for_freq(clock
);
624 /* Special case handling for 540 pixel clock: bypass WR PLL entirely
625 * and directly pass the LC PLL to it. */
626 if (freq2k
== 5400000) {
634 * Ref = LC_FREQ / R, where Ref is the actual reference input seen by
637 * We want R so that REF_MIN <= Ref <= REF_MAX.
638 * Injecting R2 = 2 * R gives:
639 * REF_MAX * r2 > LC_FREQ * 2 and
640 * REF_MIN * r2 < LC_FREQ * 2
642 * Which means the desired boundaries for r2 are:
643 * LC_FREQ * 2 / REF_MAX < r2 < LC_FREQ * 2 / REF_MIN
646 for (r2
= LC_FREQ
* 2 / REF_MAX
+ 1;
647 r2
<= LC_FREQ
* 2 / REF_MIN
;
651 * VCO = N * Ref, that is: VCO = N * LC_FREQ / R
653 * Once again we want VCO_MIN <= VCO <= VCO_MAX.
654 * Injecting R2 = 2 * R and N2 = 2 * N, we get:
655 * VCO_MAX * r2 > n2 * LC_FREQ and
656 * VCO_MIN * r2 < n2 * LC_FREQ)
658 * Which means the desired boundaries for n2 are:
659 * VCO_MIN * r2 / LC_FREQ < n2 < VCO_MAX * r2 / LC_FREQ
661 for (n2
= VCO_MIN
* r2
/ LC_FREQ
+ 1;
662 n2
<= VCO_MAX
* r2
/ LC_FREQ
;
665 for (p
= P_MIN
; p
<= P_MAX
; p
+= P_INC
)
666 hsw_wrpll_update_rnp(freq2k
, budget
,
676 static struct intel_shared_dpll
*
677 hsw_get_dpll(struct intel_crtc
*crtc
, struct intel_crtc_state
*crtc_state
,
678 struct intel_encoder
*encoder
)
680 struct drm_i915_private
*dev_priv
= to_i915(crtc
->base
.dev
);
681 struct intel_shared_dpll
*pll
;
682 int clock
= crtc_state
->port_clock
;
684 memset(&crtc_state
->dpll_hw_state
, 0,
685 sizeof(crtc_state
->dpll_hw_state
));
687 if (encoder
->type
== INTEL_OUTPUT_HDMI
) {
691 hsw_ddi_calculate_wrpll(clock
* 1000, &r2
, &n2
, &p
);
693 val
= WRPLL_PLL_ENABLE
| WRPLL_PLL_LCPLL
|
694 WRPLL_DIVIDER_REFERENCE(r2
) | WRPLL_DIVIDER_FEEDBACK(n2
) |
695 WRPLL_DIVIDER_POST(p
);
697 crtc_state
->dpll_hw_state
.wrpll
= val
;
699 pll
= intel_find_shared_dpll(crtc
, crtc_state
,
700 DPLL_ID_WRPLL1
, DPLL_ID_WRPLL2
);
702 } else if (encoder
->type
== INTEL_OUTPUT_DISPLAYPORT
||
703 encoder
->type
== INTEL_OUTPUT_DP_MST
||
704 encoder
->type
== INTEL_OUTPUT_EDP
) {
705 enum intel_dpll_id pll_id
;
709 pll_id
= DPLL_ID_LCPLL_810
;
712 pll_id
= DPLL_ID_LCPLL_1350
;
715 pll_id
= DPLL_ID_LCPLL_2700
;
718 DRM_DEBUG_KMS("Invalid clock for DP: %d\n", clock
);
722 pll
= intel_get_shared_dpll_by_id(dev_priv
, pll_id
);
724 } else if (encoder
->type
== INTEL_OUTPUT_ANALOG
) {
725 if (WARN_ON(crtc_state
->port_clock
/ 2 != 135000))
728 crtc_state
->dpll_hw_state
.spll
=
729 SPLL_PLL_ENABLE
| SPLL_PLL_FREQ_1350MHz
| SPLL_PLL_SSC
;
731 pll
= intel_find_shared_dpll(crtc
, crtc_state
,
732 DPLL_ID_SPLL
, DPLL_ID_SPLL
);
740 crtc_state
->ddi_pll_sel
= hsw_pll_to_ddi_pll_sel(pll
);
742 intel_reference_shared_dpll(pll
, crtc_state
);
748 static const struct intel_shared_dpll_funcs hsw_ddi_wrpll_funcs
= {
749 .enable
= hsw_ddi_wrpll_enable
,
750 .disable
= hsw_ddi_wrpll_disable
,
751 .get_hw_state
= hsw_ddi_wrpll_get_hw_state
,
754 static const struct intel_shared_dpll_funcs hsw_ddi_spll_funcs
= {
755 .enable
= hsw_ddi_spll_enable
,
756 .disable
= hsw_ddi_spll_disable
,
757 .get_hw_state
= hsw_ddi_spll_get_hw_state
,
760 static void hsw_ddi_lcpll_enable(struct drm_i915_private
*dev_priv
,
761 struct intel_shared_dpll
*pll
)
765 static void hsw_ddi_lcpll_disable(struct drm_i915_private
*dev_priv
,
766 struct intel_shared_dpll
*pll
)
770 static bool hsw_ddi_lcpll_get_hw_state(struct drm_i915_private
*dev_priv
,
771 struct intel_shared_dpll
*pll
,
772 struct intel_dpll_hw_state
*hw_state
)
777 static const struct intel_shared_dpll_funcs hsw_ddi_lcpll_funcs
= {
778 .enable
= hsw_ddi_lcpll_enable
,
779 .disable
= hsw_ddi_lcpll_disable
,
780 .get_hw_state
= hsw_ddi_lcpll_get_hw_state
,
783 struct skl_dpll_regs
{
784 i915_reg_t ctl
, cfgcr1
, cfgcr2
;
787 /* this array is indexed by the *shared* pll id */
788 static const struct skl_dpll_regs skl_dpll_regs
[4] = {
792 /* DPLL 0 doesn't support HDMI mode */
797 .cfgcr1
= DPLL_CFGCR1(SKL_DPLL1
),
798 .cfgcr2
= DPLL_CFGCR2(SKL_DPLL1
),
803 .cfgcr1
= DPLL_CFGCR1(SKL_DPLL2
),
804 .cfgcr2
= DPLL_CFGCR2(SKL_DPLL2
),
809 .cfgcr1
= DPLL_CFGCR1(SKL_DPLL3
),
810 .cfgcr2
= DPLL_CFGCR2(SKL_DPLL3
),
814 static void skl_ddi_pll_write_ctrl1(struct drm_i915_private
*dev_priv
,
815 struct intel_shared_dpll
*pll
)
819 val
= I915_READ(DPLL_CTRL1
);
821 val
&= ~(DPLL_CTRL1_HDMI_MODE(pll
->id
) | DPLL_CTRL1_SSC(pll
->id
) |
822 DPLL_CTRL1_LINK_RATE_MASK(pll
->id
));
823 val
|= pll
->config
.hw_state
.ctrl1
<< (pll
->id
* 6);
825 I915_WRITE(DPLL_CTRL1
, val
);
826 POSTING_READ(DPLL_CTRL1
);
829 static void skl_ddi_pll_enable(struct drm_i915_private
*dev_priv
,
830 struct intel_shared_dpll
*pll
)
832 const struct skl_dpll_regs
*regs
= skl_dpll_regs
;
834 skl_ddi_pll_write_ctrl1(dev_priv
, pll
);
836 I915_WRITE(regs
[pll
->id
].cfgcr1
, pll
->config
.hw_state
.cfgcr1
);
837 I915_WRITE(regs
[pll
->id
].cfgcr2
, pll
->config
.hw_state
.cfgcr2
);
838 POSTING_READ(regs
[pll
->id
].cfgcr1
);
839 POSTING_READ(regs
[pll
->id
].cfgcr2
);
841 /* the enable bit is always bit 31 */
842 I915_WRITE(regs
[pll
->id
].ctl
,
843 I915_READ(regs
[pll
->id
].ctl
) | LCPLL_PLL_ENABLE
);
845 if (wait_for(I915_READ(DPLL_STATUS
) & DPLL_LOCK(pll
->id
), 5))
846 DRM_ERROR("DPLL %d not locked\n", pll
->id
);
849 static void skl_ddi_dpll0_enable(struct drm_i915_private
*dev_priv
,
850 struct intel_shared_dpll
*pll
)
852 skl_ddi_pll_write_ctrl1(dev_priv
, pll
);
855 static void skl_ddi_pll_disable(struct drm_i915_private
*dev_priv
,
856 struct intel_shared_dpll
*pll
)
858 const struct skl_dpll_regs
*regs
= skl_dpll_regs
;
860 /* the enable bit is always bit 31 */
861 I915_WRITE(regs
[pll
->id
].ctl
,
862 I915_READ(regs
[pll
->id
].ctl
) & ~LCPLL_PLL_ENABLE
);
863 POSTING_READ(regs
[pll
->id
].ctl
);
866 static void skl_ddi_dpll0_disable(struct drm_i915_private
*dev_priv
,
867 struct intel_shared_dpll
*pll
)
871 static bool skl_ddi_pll_get_hw_state(struct drm_i915_private
*dev_priv
,
872 struct intel_shared_dpll
*pll
,
873 struct intel_dpll_hw_state
*hw_state
)
876 const struct skl_dpll_regs
*regs
= skl_dpll_regs
;
879 if (!intel_display_power_get_if_enabled(dev_priv
, POWER_DOMAIN_PLLS
))
884 val
= I915_READ(regs
[pll
->id
].ctl
);
885 if (!(val
& LCPLL_PLL_ENABLE
))
888 val
= I915_READ(DPLL_CTRL1
);
889 hw_state
->ctrl1
= (val
>> (pll
->id
* 6)) & 0x3f;
891 /* avoid reading back stale values if HDMI mode is not enabled */
892 if (val
& DPLL_CTRL1_HDMI_MODE(pll
->id
)) {
893 hw_state
->cfgcr1
= I915_READ(regs
[pll
->id
].cfgcr1
);
894 hw_state
->cfgcr2
= I915_READ(regs
[pll
->id
].cfgcr2
);
899 intel_display_power_put(dev_priv
, POWER_DOMAIN_PLLS
);
904 static bool skl_ddi_dpll0_get_hw_state(struct drm_i915_private
*dev_priv
,
905 struct intel_shared_dpll
*pll
,
906 struct intel_dpll_hw_state
*hw_state
)
909 const struct skl_dpll_regs
*regs
= skl_dpll_regs
;
912 if (!intel_display_power_get_if_enabled(dev_priv
, POWER_DOMAIN_PLLS
))
917 /* DPLL0 is always enabled since it drives CDCLK */
918 val
= I915_READ(regs
[pll
->id
].ctl
);
919 if (WARN_ON(!(val
& LCPLL_PLL_ENABLE
)))
922 val
= I915_READ(DPLL_CTRL1
);
923 hw_state
->ctrl1
= (val
>> (pll
->id
* 6)) & 0x3f;
928 intel_display_power_put(dev_priv
, POWER_DOMAIN_PLLS
);
933 struct skl_wrpll_context
{
934 uint64_t min_deviation
; /* current minimal deviation */
935 uint64_t central_freq
; /* chosen central freq */
936 uint64_t dco_freq
; /* chosen dco freq */
937 unsigned int p
; /* chosen divider */
940 static void skl_wrpll_context_init(struct skl_wrpll_context
*ctx
)
942 memset(ctx
, 0, sizeof(*ctx
));
944 ctx
->min_deviation
= U64_MAX
;
947 /* DCO freq must be within +1%/-6% of the DCO central freq */
948 #define SKL_DCO_MAX_PDEVIATION 100
949 #define SKL_DCO_MAX_NDEVIATION 600
951 static void skl_wrpll_try_divider(struct skl_wrpll_context
*ctx
,
952 uint64_t central_freq
,
954 unsigned int divider
)
958 deviation
= div64_u64(10000 * abs_diff(dco_freq
, central_freq
),
961 /* positive deviation */
962 if (dco_freq
>= central_freq
) {
963 if (deviation
< SKL_DCO_MAX_PDEVIATION
&&
964 deviation
< ctx
->min_deviation
) {
965 ctx
->min_deviation
= deviation
;
966 ctx
->central_freq
= central_freq
;
967 ctx
->dco_freq
= dco_freq
;
970 /* negative deviation */
971 } else if (deviation
< SKL_DCO_MAX_NDEVIATION
&&
972 deviation
< ctx
->min_deviation
) {
973 ctx
->min_deviation
= deviation
;
974 ctx
->central_freq
= central_freq
;
975 ctx
->dco_freq
= dco_freq
;
980 static void skl_wrpll_get_multipliers(unsigned int p
,
981 unsigned int *p0
/* out */,
982 unsigned int *p1
/* out */,
983 unsigned int *p2
/* out */)
987 unsigned int half
= p
/ 2;
989 if (half
== 1 || half
== 2 || half
== 3 || half
== 5) {
993 } else if (half
% 2 == 0) {
997 } else if (half
% 3 == 0) {
1001 } else if (half
% 7 == 0) {
1006 } else if (p
== 3 || p
== 9) { /* 3, 5, 7, 9, 15, 21, 35 */
1010 } else if (p
== 5 || p
== 7) {
1014 } else if (p
== 15) {
1018 } else if (p
== 21) {
1022 } else if (p
== 35) {
1029 struct skl_wrpll_params
{
1030 uint32_t dco_fraction
;
1031 uint32_t dco_integer
;
1032 uint32_t qdiv_ratio
;
1036 uint32_t central_freq
;
1039 static void skl_wrpll_params_populate(struct skl_wrpll_params
*params
,
1041 uint64_t central_freq
,
1042 uint32_t p0
, uint32_t p1
, uint32_t p2
)
1046 switch (central_freq
) {
1048 params
->central_freq
= 0;
1051 params
->central_freq
= 1;
1054 params
->central_freq
= 3;
1071 WARN(1, "Incorrect PDiv\n");
1088 WARN(1, "Incorrect KDiv\n");
1091 params
->qdiv_ratio
= p1
;
1092 params
->qdiv_mode
= (params
->qdiv_ratio
== 1) ? 0 : 1;
1094 dco_freq
= p0
* p1
* p2
* afe_clock
;
1097 * Intermediate values are in Hz.
1098 * Divide by MHz to match bsepc
1100 params
->dco_integer
= div_u64(dco_freq
, 24 * MHz(1));
1101 params
->dco_fraction
=
1102 div_u64((div_u64(dco_freq
, 24) -
1103 params
->dco_integer
* MHz(1)) * 0x8000, MHz(1));
1107 skl_ddi_calculate_wrpll(int clock
/* in Hz */,
1108 struct skl_wrpll_params
*wrpll_params
)
1110 uint64_t afe_clock
= clock
* 5; /* AFE Clock is 5x Pixel clock */
1111 uint64_t dco_central_freq
[3] = {8400000000ULL,
1114 static const int even_dividers
[] = { 4, 6, 8, 10, 12, 14, 16, 18, 20,
1115 24, 28, 30, 32, 36, 40, 42, 44,
1116 48, 52, 54, 56, 60, 64, 66, 68,
1117 70, 72, 76, 78, 80, 84, 88, 90,
1119 static const int odd_dividers
[] = { 3, 5, 7, 9, 15, 21, 35 };
1120 static const struct {
1124 { even_dividers
, ARRAY_SIZE(even_dividers
) },
1125 { odd_dividers
, ARRAY_SIZE(odd_dividers
) },
1127 struct skl_wrpll_context ctx
;
1128 unsigned int dco
, d
, i
;
1129 unsigned int p0
, p1
, p2
;
1131 skl_wrpll_context_init(&ctx
);
1133 for (d
= 0; d
< ARRAY_SIZE(dividers
); d
++) {
1134 for (dco
= 0; dco
< ARRAY_SIZE(dco_central_freq
); dco
++) {
1135 for (i
= 0; i
< dividers
[d
].n_dividers
; i
++) {
1136 unsigned int p
= dividers
[d
].list
[i
];
1137 uint64_t dco_freq
= p
* afe_clock
;
1139 skl_wrpll_try_divider(&ctx
,
1140 dco_central_freq
[dco
],
1144 * Skip the remaining dividers if we're sure to
1145 * have found the definitive divider, we can't
1146 * improve a 0 deviation.
1148 if (ctx
.min_deviation
== 0)
1149 goto skip_remaining_dividers
;
1153 skip_remaining_dividers
:
1155 * If a solution is found with an even divider, prefer
1158 if (d
== 0 && ctx
.p
)
1163 DRM_DEBUG_DRIVER("No valid divider found for %dHz\n", clock
);
1168 * gcc incorrectly analyses that these can be used without being
1169 * initialized. To be fair, it's hard to guess.
1172 skl_wrpll_get_multipliers(ctx
.p
, &p0
, &p1
, &p2
);
1173 skl_wrpll_params_populate(wrpll_params
, afe_clock
, ctx
.central_freq
,
1179 static struct intel_shared_dpll
*
1180 skl_get_dpll(struct intel_crtc
*crtc
, struct intel_crtc_state
*crtc_state
,
1181 struct intel_encoder
*encoder
)
1183 struct intel_shared_dpll
*pll
;
1184 uint32_t ctrl1
, cfgcr1
, cfgcr2
;
1185 int clock
= crtc_state
->port_clock
;
1188 * See comment in intel_dpll_hw_state to understand why we always use 0
1189 * as the DPLL id in this function.
1192 ctrl1
= DPLL_CTRL1_OVERRIDE(0);
1194 if (encoder
->type
== INTEL_OUTPUT_HDMI
) {
1195 struct skl_wrpll_params wrpll_params
= { 0, };
1197 ctrl1
|= DPLL_CTRL1_HDMI_MODE(0);
1199 if (!skl_ddi_calculate_wrpll(clock
* 1000, &wrpll_params
))
1202 cfgcr1
= DPLL_CFGCR1_FREQ_ENABLE
|
1203 DPLL_CFGCR1_DCO_FRACTION(wrpll_params
.dco_fraction
) |
1204 wrpll_params
.dco_integer
;
1206 cfgcr2
= DPLL_CFGCR2_QDIV_RATIO(wrpll_params
.qdiv_ratio
) |
1207 DPLL_CFGCR2_QDIV_MODE(wrpll_params
.qdiv_mode
) |
1208 DPLL_CFGCR2_KDIV(wrpll_params
.kdiv
) |
1209 DPLL_CFGCR2_PDIV(wrpll_params
.pdiv
) |
1210 wrpll_params
.central_freq
;
1211 } else if (encoder
->type
== INTEL_OUTPUT_DISPLAYPORT
||
1212 encoder
->type
== INTEL_OUTPUT_DP_MST
||
1213 encoder
->type
== INTEL_OUTPUT_EDP
) {
1214 switch (crtc_state
->port_clock
/ 2) {
1216 ctrl1
|= DPLL_CTRL1_LINK_RATE(DPLL_CTRL1_LINK_RATE_810
, 0);
1219 ctrl1
|= DPLL_CTRL1_LINK_RATE(DPLL_CTRL1_LINK_RATE_1350
, 0);
1222 ctrl1
|= DPLL_CTRL1_LINK_RATE(DPLL_CTRL1_LINK_RATE_2700
, 0);
1226 ctrl1
|= DPLL_CTRL1_LINK_RATE(DPLL_CTRL1_LINK_RATE_1620
, 0);
1228 /* TBD: For DP link rates 2.16 GHz and 4.32 GHz, VCO is 8640 which
1229 results in CDCLK change. Need to handle the change of CDCLK by
1230 disabling pipes and re-enabling them */
1232 ctrl1
|= DPLL_CTRL1_LINK_RATE(DPLL_CTRL1_LINK_RATE_1080
, 0);
1235 ctrl1
|= DPLL_CTRL1_LINK_RATE(DPLL_CTRL1_LINK_RATE_2160
, 0);
1239 cfgcr1
= cfgcr2
= 0;
1244 memset(&crtc_state
->dpll_hw_state
, 0,
1245 sizeof(crtc_state
->dpll_hw_state
));
1247 crtc_state
->dpll_hw_state
.ctrl1
= ctrl1
;
1248 crtc_state
->dpll_hw_state
.cfgcr1
= cfgcr1
;
1249 crtc_state
->dpll_hw_state
.cfgcr2
= cfgcr2
;
1251 if (encoder
->type
== INTEL_OUTPUT_EDP
)
1252 pll
= intel_find_shared_dpll(crtc
, crtc_state
,
1256 pll
= intel_find_shared_dpll(crtc
, crtc_state
,
1262 crtc_state
->ddi_pll_sel
= pll
->id
;
1264 intel_reference_shared_dpll(pll
, crtc_state
);
1269 static const struct intel_shared_dpll_funcs skl_ddi_pll_funcs
= {
1270 .enable
= skl_ddi_pll_enable
,
1271 .disable
= skl_ddi_pll_disable
,
1272 .get_hw_state
= skl_ddi_pll_get_hw_state
,
1275 static const struct intel_shared_dpll_funcs skl_ddi_dpll0_funcs
= {
1276 .enable
= skl_ddi_dpll0_enable
,
1277 .disable
= skl_ddi_dpll0_disable
,
1278 .get_hw_state
= skl_ddi_dpll0_get_hw_state
,
1281 static void bxt_ddi_pll_enable(struct drm_i915_private
*dev_priv
,
1282 struct intel_shared_dpll
*pll
)
1285 enum port port
= (enum port
)pll
->id
; /* 1:1 port->PLL mapping */
1287 temp
= I915_READ(BXT_PORT_PLL_ENABLE(port
));
1288 temp
&= ~PORT_PLL_REF_SEL
;
1289 /* Non-SSC reference */
1290 I915_WRITE(BXT_PORT_PLL_ENABLE(port
), temp
);
1292 /* Disable 10 bit clock */
1293 temp
= I915_READ(BXT_PORT_PLL_EBB_4(port
));
1294 temp
&= ~PORT_PLL_10BIT_CLK_ENABLE
;
1295 I915_WRITE(BXT_PORT_PLL_EBB_4(port
), temp
);
1298 temp
= I915_READ(BXT_PORT_PLL_EBB_0(port
));
1299 temp
&= ~(PORT_PLL_P1_MASK
| PORT_PLL_P2_MASK
);
1300 temp
|= pll
->config
.hw_state
.ebb0
;
1301 I915_WRITE(BXT_PORT_PLL_EBB_0(port
), temp
);
1303 /* Write M2 integer */
1304 temp
= I915_READ(BXT_PORT_PLL(port
, 0));
1305 temp
&= ~PORT_PLL_M2_MASK
;
1306 temp
|= pll
->config
.hw_state
.pll0
;
1307 I915_WRITE(BXT_PORT_PLL(port
, 0), temp
);
1310 temp
= I915_READ(BXT_PORT_PLL(port
, 1));
1311 temp
&= ~PORT_PLL_N_MASK
;
1312 temp
|= pll
->config
.hw_state
.pll1
;
1313 I915_WRITE(BXT_PORT_PLL(port
, 1), temp
);
1315 /* Write M2 fraction */
1316 temp
= I915_READ(BXT_PORT_PLL(port
, 2));
1317 temp
&= ~PORT_PLL_M2_FRAC_MASK
;
1318 temp
|= pll
->config
.hw_state
.pll2
;
1319 I915_WRITE(BXT_PORT_PLL(port
, 2), temp
);
1321 /* Write M2 fraction enable */
1322 temp
= I915_READ(BXT_PORT_PLL(port
, 3));
1323 temp
&= ~PORT_PLL_M2_FRAC_ENABLE
;
1324 temp
|= pll
->config
.hw_state
.pll3
;
1325 I915_WRITE(BXT_PORT_PLL(port
, 3), temp
);
1328 temp
= I915_READ(BXT_PORT_PLL(port
, 6));
1329 temp
&= ~PORT_PLL_PROP_COEFF_MASK
;
1330 temp
&= ~PORT_PLL_INT_COEFF_MASK
;
1331 temp
&= ~PORT_PLL_GAIN_CTL_MASK
;
1332 temp
|= pll
->config
.hw_state
.pll6
;
1333 I915_WRITE(BXT_PORT_PLL(port
, 6), temp
);
1335 /* Write calibration val */
1336 temp
= I915_READ(BXT_PORT_PLL(port
, 8));
1337 temp
&= ~PORT_PLL_TARGET_CNT_MASK
;
1338 temp
|= pll
->config
.hw_state
.pll8
;
1339 I915_WRITE(BXT_PORT_PLL(port
, 8), temp
);
1341 temp
= I915_READ(BXT_PORT_PLL(port
, 9));
1342 temp
&= ~PORT_PLL_LOCK_THRESHOLD_MASK
;
1343 temp
|= pll
->config
.hw_state
.pll9
;
1344 I915_WRITE(BXT_PORT_PLL(port
, 9), temp
);
1346 temp
= I915_READ(BXT_PORT_PLL(port
, 10));
1347 temp
&= ~PORT_PLL_DCO_AMP_OVR_EN_H
;
1348 temp
&= ~PORT_PLL_DCO_AMP_MASK
;
1349 temp
|= pll
->config
.hw_state
.pll10
;
1350 I915_WRITE(BXT_PORT_PLL(port
, 10), temp
);
1352 /* Recalibrate with new settings */
1353 temp
= I915_READ(BXT_PORT_PLL_EBB_4(port
));
1354 temp
|= PORT_PLL_RECALIBRATE
;
1355 I915_WRITE(BXT_PORT_PLL_EBB_4(port
), temp
);
1356 temp
&= ~PORT_PLL_10BIT_CLK_ENABLE
;
1357 temp
|= pll
->config
.hw_state
.ebb4
;
1358 I915_WRITE(BXT_PORT_PLL_EBB_4(port
), temp
);
1361 temp
= I915_READ(BXT_PORT_PLL_ENABLE(port
));
1362 temp
|= PORT_PLL_ENABLE
;
1363 I915_WRITE(BXT_PORT_PLL_ENABLE(port
), temp
);
1364 POSTING_READ(BXT_PORT_PLL_ENABLE(port
));
1366 if (wait_for_atomic_us((I915_READ(BXT_PORT_PLL_ENABLE(port
)) &
1367 PORT_PLL_LOCK
), 200))
1368 DRM_ERROR("PLL %d not locked\n", port
);
1371 * While we write to the group register to program all lanes at once we
1372 * can read only lane registers and we pick lanes 0/1 for that.
1374 temp
= I915_READ(BXT_PORT_PCS_DW12_LN01(port
));
1375 temp
&= ~LANE_STAGGER_MASK
;
1376 temp
&= ~LANESTAGGER_STRAP_OVRD
;
1377 temp
|= pll
->config
.hw_state
.pcsdw12
;
1378 I915_WRITE(BXT_PORT_PCS_DW12_GRP(port
), temp
);
1381 static void bxt_ddi_pll_disable(struct drm_i915_private
*dev_priv
,
1382 struct intel_shared_dpll
*pll
)
1384 enum port port
= (enum port
)pll
->id
; /* 1:1 port->PLL mapping */
1387 temp
= I915_READ(BXT_PORT_PLL_ENABLE(port
));
1388 temp
&= ~PORT_PLL_ENABLE
;
1389 I915_WRITE(BXT_PORT_PLL_ENABLE(port
), temp
);
1390 POSTING_READ(BXT_PORT_PLL_ENABLE(port
));
1393 static bool bxt_ddi_pll_get_hw_state(struct drm_i915_private
*dev_priv
,
1394 struct intel_shared_dpll
*pll
,
1395 struct intel_dpll_hw_state
*hw_state
)
1397 enum port port
= (enum port
)pll
->id
; /* 1:1 port->PLL mapping */
1401 if (!intel_display_power_get_if_enabled(dev_priv
, POWER_DOMAIN_PLLS
))
1406 val
= I915_READ(BXT_PORT_PLL_ENABLE(port
));
1407 if (!(val
& PORT_PLL_ENABLE
))
1410 hw_state
->ebb0
= I915_READ(BXT_PORT_PLL_EBB_0(port
));
1411 hw_state
->ebb0
&= PORT_PLL_P1_MASK
| PORT_PLL_P2_MASK
;
1413 hw_state
->ebb4
= I915_READ(BXT_PORT_PLL_EBB_4(port
));
1414 hw_state
->ebb4
&= PORT_PLL_10BIT_CLK_ENABLE
;
1416 hw_state
->pll0
= I915_READ(BXT_PORT_PLL(port
, 0));
1417 hw_state
->pll0
&= PORT_PLL_M2_MASK
;
1419 hw_state
->pll1
= I915_READ(BXT_PORT_PLL(port
, 1));
1420 hw_state
->pll1
&= PORT_PLL_N_MASK
;
1422 hw_state
->pll2
= I915_READ(BXT_PORT_PLL(port
, 2));
1423 hw_state
->pll2
&= PORT_PLL_M2_FRAC_MASK
;
1425 hw_state
->pll3
= I915_READ(BXT_PORT_PLL(port
, 3));
1426 hw_state
->pll3
&= PORT_PLL_M2_FRAC_ENABLE
;
1428 hw_state
->pll6
= I915_READ(BXT_PORT_PLL(port
, 6));
1429 hw_state
->pll6
&= PORT_PLL_PROP_COEFF_MASK
|
1430 PORT_PLL_INT_COEFF_MASK
|
1431 PORT_PLL_GAIN_CTL_MASK
;
1433 hw_state
->pll8
= I915_READ(BXT_PORT_PLL(port
, 8));
1434 hw_state
->pll8
&= PORT_PLL_TARGET_CNT_MASK
;
1436 hw_state
->pll9
= I915_READ(BXT_PORT_PLL(port
, 9));
1437 hw_state
->pll9
&= PORT_PLL_LOCK_THRESHOLD_MASK
;
1439 hw_state
->pll10
= I915_READ(BXT_PORT_PLL(port
, 10));
1440 hw_state
->pll10
&= PORT_PLL_DCO_AMP_OVR_EN_H
|
1441 PORT_PLL_DCO_AMP_MASK
;
1444 * While we write to the group register to program all lanes at once we
1445 * can read only lane registers. We configure all lanes the same way, so
1446 * here just read out lanes 0/1 and output a note if lanes 2/3 differ.
1448 hw_state
->pcsdw12
= I915_READ(BXT_PORT_PCS_DW12_LN01(port
));
1449 if (I915_READ(BXT_PORT_PCS_DW12_LN23(port
)) != hw_state
->pcsdw12
)
1450 DRM_DEBUG_DRIVER("lane stagger config different for lane 01 (%08x) and 23 (%08x)\n",
1452 I915_READ(BXT_PORT_PCS_DW12_LN23(port
)));
1453 hw_state
->pcsdw12
&= LANE_STAGGER_MASK
| LANESTAGGER_STRAP_OVRD
;
1458 intel_display_power_put(dev_priv
, POWER_DOMAIN_PLLS
);
1463 /* bxt clock parameters */
1464 struct bxt_clk_div
{
1474 /* pre-calculated values for DP linkrates */
1475 static const struct bxt_clk_div bxt_dp_clk_val
[] = {
1476 {162000, 4, 2, 32, 1677722, 1, 1},
1477 {270000, 4, 1, 27, 0, 0, 1},
1478 {540000, 2, 1, 27, 0, 0, 1},
1479 {216000, 3, 2, 32, 1677722, 1, 1},
1480 {243000, 4, 1, 24, 1258291, 1, 1},
1481 {324000, 4, 1, 32, 1677722, 1, 1},
1482 {432000, 3, 1, 32, 1677722, 1, 1}
1485 static struct intel_shared_dpll
*
1486 bxt_get_dpll(struct intel_crtc
*crtc
, struct intel_crtc_state
*crtc_state
,
1487 struct intel_encoder
*encoder
)
1489 struct drm_i915_private
*dev_priv
= to_i915(crtc
->base
.dev
);
1490 struct intel_shared_dpll
*pll
;
1491 enum intel_dpll_id i
;
1492 struct intel_digital_port
*intel_dig_port
;
1493 struct bxt_clk_div clk_div
= {0};
1495 uint32_t prop_coef
, int_coef
, gain_ctl
, targ_cnt
;
1496 uint32_t lanestagger
;
1497 int clock
= crtc_state
->port_clock
;
1499 if (encoder
->type
== INTEL_OUTPUT_HDMI
) {
1500 intel_clock_t best_clock
;
1502 /* Calculate HDMI div */
1504 * FIXME: tie the following calculation into
1505 * i9xx_crtc_compute_clock
1507 if (!bxt_find_best_dpll(crtc_state
, clock
, &best_clock
)) {
1508 DRM_DEBUG_DRIVER("no PLL dividers found for clock %d pipe %c\n",
1509 clock
, pipe_name(crtc
->pipe
));
1513 clk_div
.p1
= best_clock
.p1
;
1514 clk_div
.p2
= best_clock
.p2
;
1515 WARN_ON(best_clock
.m1
!= 2);
1516 clk_div
.n
= best_clock
.n
;
1517 clk_div
.m2_int
= best_clock
.m2
>> 22;
1518 clk_div
.m2_frac
= best_clock
.m2
& ((1 << 22) - 1);
1519 clk_div
.m2_frac_en
= clk_div
.m2_frac
!= 0;
1521 vco
= best_clock
.vco
;
1522 } else if (encoder
->type
== INTEL_OUTPUT_DISPLAYPORT
||
1523 encoder
->type
== INTEL_OUTPUT_EDP
) {
1526 clk_div
= bxt_dp_clk_val
[0];
1527 for (i
= 0; i
< ARRAY_SIZE(bxt_dp_clk_val
); ++i
) {
1528 if (bxt_dp_clk_val
[i
].clock
== clock
) {
1529 clk_div
= bxt_dp_clk_val
[i
];
1533 vco
= clock
* 10 / 2 * clk_div
.p1
* clk_div
.p2
;
1536 if (vco
>= 6200000 && vco
<= 6700000) {
1541 } else if ((vco
> 5400000 && vco
< 6200000) ||
1542 (vco
>= 4800000 && vco
< 5400000)) {
1547 } else if (vco
== 5400000) {
1553 DRM_ERROR("Invalid VCO\n");
1557 memset(&crtc_state
->dpll_hw_state
, 0,
1558 sizeof(crtc_state
->dpll_hw_state
));
1562 else if (clock
> 135000)
1564 else if (clock
> 67000)
1566 else if (clock
> 33000)
1571 crtc_state
->dpll_hw_state
.ebb0
=
1572 PORT_PLL_P1(clk_div
.p1
) | PORT_PLL_P2(clk_div
.p2
);
1573 crtc_state
->dpll_hw_state
.pll0
= clk_div
.m2_int
;
1574 crtc_state
->dpll_hw_state
.pll1
= PORT_PLL_N(clk_div
.n
);
1575 crtc_state
->dpll_hw_state
.pll2
= clk_div
.m2_frac
;
1577 if (clk_div
.m2_frac_en
)
1578 crtc_state
->dpll_hw_state
.pll3
=
1579 PORT_PLL_M2_FRAC_ENABLE
;
1581 crtc_state
->dpll_hw_state
.pll6
=
1582 prop_coef
| PORT_PLL_INT_COEFF(int_coef
);
1583 crtc_state
->dpll_hw_state
.pll6
|=
1584 PORT_PLL_GAIN_CTL(gain_ctl
);
1586 crtc_state
->dpll_hw_state
.pll8
= targ_cnt
;
1588 crtc_state
->dpll_hw_state
.pll9
= 5 << PORT_PLL_LOCK_THRESHOLD_SHIFT
;
1590 crtc_state
->dpll_hw_state
.pll10
=
1591 PORT_PLL_DCO_AMP(PORT_PLL_DCO_AMP_DEFAULT
)
1592 | PORT_PLL_DCO_AMP_OVR_EN_H
;
1594 crtc_state
->dpll_hw_state
.ebb4
= PORT_PLL_10BIT_CLK_ENABLE
;
1596 crtc_state
->dpll_hw_state
.pcsdw12
=
1597 LANESTAGGER_STRAP_OVRD
| lanestagger
;
1599 intel_dig_port
= enc_to_dig_port(&encoder
->base
);
1601 /* 1:1 mapping between ports and PLLs */
1602 i
= (enum intel_dpll_id
) intel_dig_port
->port
;
1603 pll
= intel_get_shared_dpll_by_id(dev_priv
, i
);
1605 DRM_DEBUG_KMS("CRTC:%d using pre-allocated %s\n",
1606 crtc
->base
.base
.id
, pll
->name
);
1608 intel_reference_shared_dpll(pll
, crtc_state
);
1610 /* shared DPLL id 0 is DPLL A */
1611 crtc_state
->ddi_pll_sel
= pll
->id
;
1616 static const struct intel_shared_dpll_funcs bxt_ddi_pll_funcs
= {
1617 .enable
= bxt_ddi_pll_enable
,
1618 .disable
= bxt_ddi_pll_disable
,
1619 .get_hw_state
= bxt_ddi_pll_get_hw_state
,
1622 static void intel_ddi_pll_init(struct drm_device
*dev
)
1624 struct drm_i915_private
*dev_priv
= dev
->dev_private
;
1625 uint32_t val
= I915_READ(LCPLL_CTL
);
1627 if (IS_SKYLAKE(dev
) || IS_KABYLAKE(dev
)) {
1630 cdclk_freq
= dev_priv
->display
.get_display_clock_speed(dev
);
1631 dev_priv
->skl_boot_cdclk
= cdclk_freq
;
1632 if (skl_sanitize_cdclk(dev_priv
))
1633 DRM_DEBUG_KMS("Sanitized cdclk programmed by pre-os\n");
1634 if (!(I915_READ(LCPLL1_CTL
) & LCPLL_PLL_ENABLE
))
1635 DRM_ERROR("LCPLL1 is disabled\n");
1636 } else if (IS_BROXTON(dev
)) {
1637 broxton_init_cdclk(dev
);
1638 broxton_ddi_phy_init(dev
);
1641 * The LCPLL register should be turned on by the BIOS. For now
1642 * let's just check its state and print errors in case
1643 * something is wrong. Don't even try to turn it on.
1646 if (val
& LCPLL_CD_SOURCE_FCLK
)
1647 DRM_ERROR("CDCLK source is not LCPLL\n");
1649 if (val
& LCPLL_PLL_DISABLE
)
1650 DRM_ERROR("LCPLL is disabled\n");
1657 const struct intel_shared_dpll_funcs
*funcs
;
1661 struct intel_dpll_mgr
{
1662 const struct dpll_info
*dpll_info
;
1664 struct intel_shared_dpll
*(*get_dpll
)(struct intel_crtc
*crtc
,
1665 struct intel_crtc_state
*crtc_state
,
1666 struct intel_encoder
*encoder
);
1669 static const struct dpll_info pch_plls
[] = {
1670 { "PCH DPLL A", DPLL_ID_PCH_PLL_A
, &ibx_pch_dpll_funcs
, 0 },
1671 { "PCH DPLL B", DPLL_ID_PCH_PLL_B
, &ibx_pch_dpll_funcs
, 0 },
1672 { NULL
, -1, NULL
, 0 },
1675 static const struct intel_dpll_mgr pch_pll_mgr
= {
1676 .dpll_info
= pch_plls
,
1677 .get_dpll
= ibx_get_dpll
,
1680 static const struct dpll_info hsw_plls
[] = {
1681 { "WRPLL 1", DPLL_ID_WRPLL1
, &hsw_ddi_wrpll_funcs
, 0 },
1682 { "WRPLL 2", DPLL_ID_WRPLL2
, &hsw_ddi_wrpll_funcs
, 0 },
1683 { "SPLL", DPLL_ID_SPLL
, &hsw_ddi_spll_funcs
, 0 },
1684 { "LCPLL 810", DPLL_ID_LCPLL_810
, &hsw_ddi_lcpll_funcs
, INTEL_DPLL_ALWAYS_ON
},
1685 { "LCPLL 1350", DPLL_ID_LCPLL_1350
, &hsw_ddi_lcpll_funcs
, INTEL_DPLL_ALWAYS_ON
},
1686 { "LCPLL 2700", DPLL_ID_LCPLL_2700
, &hsw_ddi_lcpll_funcs
, INTEL_DPLL_ALWAYS_ON
},
1687 { NULL
, -1, NULL
, },
1690 static const struct intel_dpll_mgr hsw_pll_mgr
= {
1691 .dpll_info
= hsw_plls
,
1692 .get_dpll
= hsw_get_dpll
,
1695 static const struct dpll_info skl_plls
[] = {
1696 { "DPLL 0", DPLL_ID_SKL_DPLL0
, &skl_ddi_dpll0_funcs
, INTEL_DPLL_ALWAYS_ON
},
1697 { "DPPL 1", DPLL_ID_SKL_DPLL1
, &skl_ddi_pll_funcs
, 0 },
1698 { "DPPL 2", DPLL_ID_SKL_DPLL2
, &skl_ddi_pll_funcs
, 0 },
1699 { "DPPL 3", DPLL_ID_SKL_DPLL3
, &skl_ddi_pll_funcs
, 0 },
1700 { NULL
, -1, NULL
, },
1703 static const struct intel_dpll_mgr skl_pll_mgr
= {
1704 .dpll_info
= skl_plls
,
1705 .get_dpll
= skl_get_dpll
,
1708 static const struct dpll_info bxt_plls
[] = {
1709 { "PORT PLL A", DPLL_ID_SKL_DPLL0
, &bxt_ddi_pll_funcs
, 0 },
1710 { "PORT PLL B", DPLL_ID_SKL_DPLL1
, &bxt_ddi_pll_funcs
, 0 },
1711 { "PORT PLL C", DPLL_ID_SKL_DPLL2
, &bxt_ddi_pll_funcs
, 0 },
1712 { NULL
, -1, NULL
, },
1715 static const struct intel_dpll_mgr bxt_pll_mgr
= {
1716 .dpll_info
= bxt_plls
,
1717 .get_dpll
= bxt_get_dpll
,
1720 void intel_shared_dpll_init(struct drm_device
*dev
)
1722 struct drm_i915_private
*dev_priv
= dev
->dev_private
;
1723 const struct intel_dpll_mgr
*dpll_mgr
= NULL
;
1724 const struct dpll_info
*dpll_info
;
1727 if (IS_SKYLAKE(dev
) || IS_KABYLAKE(dev
))
1728 dpll_mgr
= &skl_pll_mgr
;
1729 else if (IS_BROXTON(dev
))
1730 dpll_mgr
= &bxt_pll_mgr
;
1731 else if (HAS_DDI(dev
))
1732 dpll_mgr
= &hsw_pll_mgr
;
1733 else if (HAS_PCH_IBX(dev
) || HAS_PCH_CPT(dev
))
1734 dpll_mgr
= &pch_pll_mgr
;
1737 dev_priv
->num_shared_dpll
= 0;
1741 dpll_info
= dpll_mgr
->dpll_info
;
1743 for (i
= 0; dpll_info
[i
].id
>= 0; i
++) {
1744 WARN_ON(i
!= dpll_info
[i
].id
);
1746 dev_priv
->shared_dplls
[i
].id
= dpll_info
[i
].id
;
1747 dev_priv
->shared_dplls
[i
].name
= dpll_info
[i
].name
;
1748 dev_priv
->shared_dplls
[i
].funcs
= *dpll_info
[i
].funcs
;
1749 dev_priv
->shared_dplls
[i
].flags
= dpll_info
[i
].flags
;
1752 dev_priv
->dpll_mgr
= dpll_mgr
;
1753 dev_priv
->num_shared_dpll
= i
;
1755 BUG_ON(dev_priv
->num_shared_dpll
> I915_NUM_PLLS
);
1757 /* FIXME: Move this to a more suitable place */
1759 intel_ddi_pll_init(dev
);
1762 struct intel_shared_dpll
*
1763 intel_get_shared_dpll(struct intel_crtc
*crtc
,
1764 struct intel_crtc_state
*crtc_state
,
1765 struct intel_encoder
*encoder
)
1767 struct drm_i915_private
*dev_priv
= to_i915(crtc
->base
.dev
);
1768 const struct intel_dpll_mgr
*dpll_mgr
= dev_priv
->dpll_mgr
;
1770 if (WARN_ON(!dpll_mgr
))
1773 return dpll_mgr
->get_dpll(crtc
, crtc_state
, encoder
);