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"
29 * Display PLLs used for driving outputs vary by platform. While some have
30 * per-pipe or per-encoder dedicated PLLs, others allow the use of any PLL
31 * from a pool. In the latter scenario, it is possible that multiple pipes
32 * share a PLL if their configurations match.
34 * This file provides an abstraction over display PLLs. The function
35 * intel_shared_dpll_init() initializes the PLLs for the given platform. The
36 * users of a PLL are tracked and that tracking is integrated with the atomic
37 * modest interface. During an atomic operation, a PLL can be requested for a
38 * given CRTC and encoder configuration by calling intel_get_shared_dpll() and
39 * a previously used PLL can be released with intel_release_shared_dpll().
40 * Changes to the users are first staged in the atomic state, and then made
41 * effective by calling intel_shared_dpll_swap_state() during the atomic
46 intel_atomic_duplicate_dpll_state(struct drm_i915_private
*dev_priv
,
47 struct intel_shared_dpll_state
*shared_dpll
)
51 /* Copy shared dpll state */
52 for (i
= 0; i
< dev_priv
->num_shared_dpll
; i
++) {
53 struct intel_shared_dpll
*pll
= &dev_priv
->shared_dplls
[i
];
55 shared_dpll
[i
] = pll
->state
;
59 static struct intel_shared_dpll_state
*
60 intel_atomic_get_shared_dpll_state(struct drm_atomic_state
*s
)
62 struct intel_atomic_state
*state
= to_intel_atomic_state(s
);
64 WARN_ON(!drm_modeset_is_locked(&s
->dev
->mode_config
.connection_mutex
));
66 if (!state
->dpll_set
) {
67 state
->dpll_set
= true;
69 intel_atomic_duplicate_dpll_state(to_i915(s
->dev
),
73 return state
->shared_dpll
;
77 * intel_get_shared_dpll_by_id - get a DPLL given its id
78 * @dev_priv: i915 device instance
82 * A pointer to the DPLL with @id
84 struct intel_shared_dpll
*
85 intel_get_shared_dpll_by_id(struct drm_i915_private
*dev_priv
,
86 enum intel_dpll_id id
)
88 return &dev_priv
->shared_dplls
[id
];
92 * intel_get_shared_dpll_id - get the id of a DPLL
93 * @dev_priv: i915 device instance
100 intel_get_shared_dpll_id(struct drm_i915_private
*dev_priv
,
101 struct intel_shared_dpll
*pll
)
103 if (WARN_ON(pll
< dev_priv
->shared_dplls
||
104 pll
> &dev_priv
->shared_dplls
[dev_priv
->num_shared_dpll
]))
107 return (enum intel_dpll_id
) (pll
- dev_priv
->shared_dplls
);
111 void assert_shared_dpll(struct drm_i915_private
*dev_priv
,
112 struct intel_shared_dpll
*pll
,
116 struct intel_dpll_hw_state hw_state
;
118 if (WARN(!pll
, "asserting DPLL %s with no DPLL\n", onoff(state
)))
121 cur_state
= pll
->funcs
.get_hw_state(dev_priv
, pll
, &hw_state
);
122 I915_STATE_WARN(cur_state
!= state
,
123 "%s assertion failure (expected %s, current %s)\n",
124 pll
->name
, onoff(state
), onoff(cur_state
));
128 * intel_prepare_shared_dpll - call a dpll's prepare hook
129 * @crtc: CRTC which has a shared dpll
131 * This calls the PLL's prepare hook if it has one and if the PLL is not
132 * already enabled. The prepare hook is platform specific.
134 void intel_prepare_shared_dpll(struct intel_crtc
*crtc
)
136 struct drm_device
*dev
= crtc
->base
.dev
;
137 struct drm_i915_private
*dev_priv
= to_i915(dev
);
138 struct intel_shared_dpll
*pll
= crtc
->config
->shared_dpll
;
140 if (WARN_ON(pll
== NULL
))
143 mutex_lock(&dev_priv
->dpll_lock
);
144 WARN_ON(!pll
->state
.crtc_mask
);
145 if (!pll
->active_mask
) {
146 DRM_DEBUG_DRIVER("setting up %s\n", pll
->name
);
148 assert_shared_dpll_disabled(dev_priv
, pll
);
150 pll
->funcs
.prepare(dev_priv
, pll
);
152 mutex_unlock(&dev_priv
->dpll_lock
);
156 * intel_enable_shared_dpll - enable a CRTC's shared DPLL
157 * @crtc: CRTC which has a shared DPLL
159 * Enable the shared DPLL used by @crtc.
161 void intel_enable_shared_dpll(struct intel_crtc
*crtc
)
163 struct drm_device
*dev
= crtc
->base
.dev
;
164 struct drm_i915_private
*dev_priv
= to_i915(dev
);
165 struct intel_shared_dpll
*pll
= crtc
->config
->shared_dpll
;
166 unsigned crtc_mask
= 1 << drm_crtc_index(&crtc
->base
);
169 if (WARN_ON(pll
== NULL
))
172 mutex_lock(&dev_priv
->dpll_lock
);
173 old_mask
= pll
->active_mask
;
175 if (WARN_ON(!(pll
->state
.crtc_mask
& crtc_mask
)) ||
176 WARN_ON(pll
->active_mask
& crtc_mask
))
179 pll
->active_mask
|= crtc_mask
;
181 DRM_DEBUG_KMS("enable %s (active %x, on? %d) for crtc %d\n",
182 pll
->name
, pll
->active_mask
, pll
->on
,
187 assert_shared_dpll_enabled(dev_priv
, pll
);
192 DRM_DEBUG_KMS("enabling %s\n", pll
->name
);
193 pll
->funcs
.enable(dev_priv
, pll
);
197 mutex_unlock(&dev_priv
->dpll_lock
);
201 * intel_disable_shared_dpll - disable a CRTC's shared DPLL
202 * @crtc: CRTC which has a shared DPLL
204 * Disable the shared DPLL used by @crtc.
206 void intel_disable_shared_dpll(struct intel_crtc
*crtc
)
208 struct drm_i915_private
*dev_priv
= to_i915(crtc
->base
.dev
);
209 struct intel_shared_dpll
*pll
= crtc
->config
->shared_dpll
;
210 unsigned crtc_mask
= 1 << drm_crtc_index(&crtc
->base
);
212 /* PCH only available on ILK+ */
213 if (INTEL_GEN(dev_priv
) < 5)
219 mutex_lock(&dev_priv
->dpll_lock
);
220 if (WARN_ON(!(pll
->active_mask
& crtc_mask
)))
223 DRM_DEBUG_KMS("disable %s (active %x, on? %d) for crtc %d\n",
224 pll
->name
, pll
->active_mask
, pll
->on
,
227 assert_shared_dpll_enabled(dev_priv
, pll
);
230 pll
->active_mask
&= ~crtc_mask
;
231 if (pll
->active_mask
)
234 DRM_DEBUG_KMS("disabling %s\n", pll
->name
);
235 pll
->funcs
.disable(dev_priv
, pll
);
239 mutex_unlock(&dev_priv
->dpll_lock
);
242 static struct intel_shared_dpll
*
243 intel_find_shared_dpll(struct intel_crtc
*crtc
,
244 struct intel_crtc_state
*crtc_state
,
245 enum intel_dpll_id range_min
,
246 enum intel_dpll_id range_max
)
248 struct drm_i915_private
*dev_priv
= to_i915(crtc
->base
.dev
);
249 struct intel_shared_dpll
*pll
;
250 struct intel_shared_dpll_state
*shared_dpll
;
251 enum intel_dpll_id i
;
253 shared_dpll
= intel_atomic_get_shared_dpll_state(crtc_state
->base
.state
);
255 for (i
= range_min
; i
<= range_max
; i
++) {
256 pll
= &dev_priv
->shared_dplls
[i
];
258 /* Only want to check enabled timings first */
259 if (shared_dpll
[i
].crtc_mask
== 0)
262 if (memcmp(&crtc_state
->dpll_hw_state
,
263 &shared_dpll
[i
].hw_state
,
264 sizeof(crtc_state
->dpll_hw_state
)) == 0) {
265 DRM_DEBUG_KMS("[CRTC:%d:%s] sharing existing %s (crtc mask 0x%08x, active %x)\n",
266 crtc
->base
.base
.id
, crtc
->base
.name
, pll
->name
,
267 shared_dpll
[i
].crtc_mask
,
273 /* Ok no matching timings, maybe there's a free one? */
274 for (i
= range_min
; i
<= range_max
; i
++) {
275 pll
= &dev_priv
->shared_dplls
[i
];
276 if (shared_dpll
[i
].crtc_mask
== 0) {
277 DRM_DEBUG_KMS("[CRTC:%d:%s] allocated %s\n",
278 crtc
->base
.base
.id
, crtc
->base
.name
, pll
->name
);
287 intel_reference_shared_dpll(struct intel_shared_dpll
*pll
,
288 struct intel_crtc_state
*crtc_state
)
290 struct intel_shared_dpll_state
*shared_dpll
;
291 struct intel_crtc
*crtc
= to_intel_crtc(crtc_state
->base
.crtc
);
292 enum intel_dpll_id i
= pll
->id
;
294 shared_dpll
= intel_atomic_get_shared_dpll_state(crtc_state
->base
.state
);
296 if (shared_dpll
[i
].crtc_mask
== 0)
297 shared_dpll
[i
].hw_state
=
298 crtc_state
->dpll_hw_state
;
300 crtc_state
->shared_dpll
= pll
;
301 DRM_DEBUG_DRIVER("using %s for pipe %c\n", pll
->name
,
302 pipe_name(crtc
->pipe
));
304 shared_dpll
[pll
->id
].crtc_mask
|= 1 << crtc
->pipe
;
308 * intel_shared_dpll_swap_state - make atomic DPLL configuration effective
309 * @state: atomic state
311 * This is the dpll version of drm_atomic_helper_swap_state() since the
312 * helper does not handle driver-specific global state.
314 * For consistency with atomic helpers this function does a complete swap,
315 * i.e. it also puts the current state into @state, even though there is no
316 * need for that at this moment.
318 void intel_shared_dpll_swap_state(struct drm_atomic_state
*state
)
320 struct drm_i915_private
*dev_priv
= to_i915(state
->dev
);
321 struct intel_shared_dpll_state
*shared_dpll
;
322 struct intel_shared_dpll
*pll
;
323 enum intel_dpll_id i
;
325 if (!to_intel_atomic_state(state
)->dpll_set
)
328 shared_dpll
= to_intel_atomic_state(state
)->shared_dpll
;
329 for (i
= 0; i
< dev_priv
->num_shared_dpll
; i
++) {
330 struct intel_shared_dpll_state tmp
;
332 pll
= &dev_priv
->shared_dplls
[i
];
335 pll
->state
= shared_dpll
[i
];
336 shared_dpll
[i
] = tmp
;
340 static bool ibx_pch_dpll_get_hw_state(struct drm_i915_private
*dev_priv
,
341 struct intel_shared_dpll
*pll
,
342 struct intel_dpll_hw_state
*hw_state
)
346 if (!intel_display_power_get_if_enabled(dev_priv
, POWER_DOMAIN_PLLS
))
349 val
= I915_READ(PCH_DPLL(pll
->id
));
350 hw_state
->dpll
= val
;
351 hw_state
->fp0
= I915_READ(PCH_FP0(pll
->id
));
352 hw_state
->fp1
= I915_READ(PCH_FP1(pll
->id
));
354 intel_display_power_put(dev_priv
, POWER_DOMAIN_PLLS
);
356 return val
& DPLL_VCO_ENABLE
;
359 static void ibx_pch_dpll_prepare(struct drm_i915_private
*dev_priv
,
360 struct intel_shared_dpll
*pll
)
362 I915_WRITE(PCH_FP0(pll
->id
), pll
->state
.hw_state
.fp0
);
363 I915_WRITE(PCH_FP1(pll
->id
), pll
->state
.hw_state
.fp1
);
366 static void ibx_assert_pch_refclk_enabled(struct drm_i915_private
*dev_priv
)
371 I915_STATE_WARN_ON(!(HAS_PCH_IBX(dev_priv
) || HAS_PCH_CPT(dev_priv
)));
373 val
= I915_READ(PCH_DREF_CONTROL
);
374 enabled
= !!(val
& (DREF_SSC_SOURCE_MASK
| DREF_NONSPREAD_SOURCE_MASK
|
375 DREF_SUPERSPREAD_SOURCE_MASK
));
376 I915_STATE_WARN(!enabled
, "PCH refclk assertion failure, should be active but is disabled\n");
379 static void ibx_pch_dpll_enable(struct drm_i915_private
*dev_priv
,
380 struct intel_shared_dpll
*pll
)
382 /* PCH refclock must be enabled first */
383 ibx_assert_pch_refclk_enabled(dev_priv
);
385 I915_WRITE(PCH_DPLL(pll
->id
), pll
->state
.hw_state
.dpll
);
387 /* Wait for the clocks to stabilize. */
388 POSTING_READ(PCH_DPLL(pll
->id
));
391 /* The pixel multiplier can only be updated once the
392 * DPLL is enabled and the clocks are stable.
396 I915_WRITE(PCH_DPLL(pll
->id
), pll
->state
.hw_state
.dpll
);
397 POSTING_READ(PCH_DPLL(pll
->id
));
401 static void ibx_pch_dpll_disable(struct drm_i915_private
*dev_priv
,
402 struct intel_shared_dpll
*pll
)
404 struct drm_device
*dev
= &dev_priv
->drm
;
405 struct intel_crtc
*crtc
;
407 /* Make sure no transcoder isn't still depending on us. */
408 for_each_intel_crtc(dev
, crtc
) {
409 if (crtc
->config
->shared_dpll
== pll
)
410 assert_pch_transcoder_disabled(dev_priv
, crtc
->pipe
);
413 I915_WRITE(PCH_DPLL(pll
->id
), 0);
414 POSTING_READ(PCH_DPLL(pll
->id
));
418 static struct intel_shared_dpll
*
419 ibx_get_dpll(struct intel_crtc
*crtc
, struct intel_crtc_state
*crtc_state
,
420 struct intel_encoder
*encoder
)
422 struct drm_i915_private
*dev_priv
= to_i915(crtc
->base
.dev
);
423 struct intel_shared_dpll
*pll
;
424 enum intel_dpll_id i
;
426 if (HAS_PCH_IBX(dev_priv
)) {
427 /* Ironlake PCH has a fixed PLL->PCH pipe mapping. */
428 i
= (enum intel_dpll_id
) crtc
->pipe
;
429 pll
= &dev_priv
->shared_dplls
[i
];
431 DRM_DEBUG_KMS("[CRTC:%d:%s] using pre-allocated %s\n",
432 crtc
->base
.base
.id
, crtc
->base
.name
, pll
->name
);
434 pll
= intel_find_shared_dpll(crtc
, crtc_state
,
442 /* reference the pll */
443 intel_reference_shared_dpll(pll
, crtc_state
);
448 static void ibx_dump_hw_state(struct drm_i915_private
*dev_priv
,
449 struct intel_dpll_hw_state
*hw_state
)
451 DRM_DEBUG_KMS("dpll_hw_state: dpll: 0x%x, dpll_md: 0x%x, "
452 "fp0: 0x%x, fp1: 0x%x\n",
459 static const struct intel_shared_dpll_funcs ibx_pch_dpll_funcs
= {
460 .prepare
= ibx_pch_dpll_prepare
,
461 .enable
= ibx_pch_dpll_enable
,
462 .disable
= ibx_pch_dpll_disable
,
463 .get_hw_state
= ibx_pch_dpll_get_hw_state
,
466 static void hsw_ddi_wrpll_enable(struct drm_i915_private
*dev_priv
,
467 struct intel_shared_dpll
*pll
)
469 I915_WRITE(WRPLL_CTL(pll
->id
), pll
->state
.hw_state
.wrpll
);
470 POSTING_READ(WRPLL_CTL(pll
->id
));
474 static void hsw_ddi_spll_enable(struct drm_i915_private
*dev_priv
,
475 struct intel_shared_dpll
*pll
)
477 I915_WRITE(SPLL_CTL
, pll
->state
.hw_state
.spll
);
478 POSTING_READ(SPLL_CTL
);
482 static void hsw_ddi_wrpll_disable(struct drm_i915_private
*dev_priv
,
483 struct intel_shared_dpll
*pll
)
487 val
= I915_READ(WRPLL_CTL(pll
->id
));
488 I915_WRITE(WRPLL_CTL(pll
->id
), val
& ~WRPLL_PLL_ENABLE
);
489 POSTING_READ(WRPLL_CTL(pll
->id
));
492 static void hsw_ddi_spll_disable(struct drm_i915_private
*dev_priv
,
493 struct intel_shared_dpll
*pll
)
497 val
= I915_READ(SPLL_CTL
);
498 I915_WRITE(SPLL_CTL
, val
& ~SPLL_PLL_ENABLE
);
499 POSTING_READ(SPLL_CTL
);
502 static bool hsw_ddi_wrpll_get_hw_state(struct drm_i915_private
*dev_priv
,
503 struct intel_shared_dpll
*pll
,
504 struct intel_dpll_hw_state
*hw_state
)
508 if (!intel_display_power_get_if_enabled(dev_priv
, POWER_DOMAIN_PLLS
))
511 val
= I915_READ(WRPLL_CTL(pll
->id
));
512 hw_state
->wrpll
= val
;
514 intel_display_power_put(dev_priv
, POWER_DOMAIN_PLLS
);
516 return val
& WRPLL_PLL_ENABLE
;
519 static bool hsw_ddi_spll_get_hw_state(struct drm_i915_private
*dev_priv
,
520 struct intel_shared_dpll
*pll
,
521 struct intel_dpll_hw_state
*hw_state
)
525 if (!intel_display_power_get_if_enabled(dev_priv
, POWER_DOMAIN_PLLS
))
528 val
= I915_READ(SPLL_CTL
);
529 hw_state
->spll
= val
;
531 intel_display_power_put(dev_priv
, POWER_DOMAIN_PLLS
);
533 return val
& SPLL_PLL_ENABLE
;
537 #define LC_FREQ_2K U64_C(LC_FREQ * 2000)
543 /* Constraints for PLL good behavior */
549 struct hsw_wrpll_rnp
{
553 static unsigned hsw_wrpll_get_budget_for_freq(int clock
)
627 static void hsw_wrpll_update_rnp(uint64_t freq2k
, unsigned budget
,
628 unsigned r2
, unsigned n2
, unsigned p
,
629 struct hsw_wrpll_rnp
*best
)
631 uint64_t a
, b
, c
, d
, diff
, diff_best
;
633 /* No best (r,n,p) yet */
642 * Output clock is (LC_FREQ_2K / 2000) * N / (P * R), which compares to
646 * abs(freq2k - (LC_FREQ_2K * n2/(p * r2))) /
649 * and we would like delta <= budget.
651 * If the discrepancy is above the PPM-based budget, always prefer to
652 * improve upon the previous solution. However, if you're within the
653 * budget, try to maximize Ref * VCO, that is N / (P * R^2).
655 a
= freq2k
* budget
* p
* r2
;
656 b
= freq2k
* budget
* best
->p
* best
->r2
;
657 diff
= abs_diff(freq2k
* p
* r2
, LC_FREQ_2K
* n2
);
658 diff_best
= abs_diff(freq2k
* best
->p
* best
->r2
,
659 LC_FREQ_2K
* best
->n2
);
661 d
= 1000000 * diff_best
;
663 if (a
< c
&& b
< d
) {
664 /* If both are above the budget, pick the closer */
665 if (best
->p
* best
->r2
* diff
< p
* r2
* diff_best
) {
670 } else if (a
>= c
&& b
< d
) {
671 /* If A is below the threshold but B is above it? Update. */
675 } else if (a
>= c
&& b
>= d
) {
676 /* Both are below the limit, so pick the higher n2/(r2*r2) */
677 if (n2
* best
->r2
* best
->r2
> best
->n2
* r2
* r2
) {
683 /* Otherwise a < c && b >= d, do nothing */
687 hsw_ddi_calculate_wrpll(int clock
/* in Hz */,
688 unsigned *r2_out
, unsigned *n2_out
, unsigned *p_out
)
692 struct hsw_wrpll_rnp best
= { 0, 0, 0 };
695 freq2k
= clock
/ 100;
697 budget
= hsw_wrpll_get_budget_for_freq(clock
);
699 /* Special case handling for 540 pixel clock: bypass WR PLL entirely
700 * and directly pass the LC PLL to it. */
701 if (freq2k
== 5400000) {
709 * Ref = LC_FREQ / R, where Ref is the actual reference input seen by
712 * We want R so that REF_MIN <= Ref <= REF_MAX.
713 * Injecting R2 = 2 * R gives:
714 * REF_MAX * r2 > LC_FREQ * 2 and
715 * REF_MIN * r2 < LC_FREQ * 2
717 * Which means the desired boundaries for r2 are:
718 * LC_FREQ * 2 / REF_MAX < r2 < LC_FREQ * 2 / REF_MIN
721 for (r2
= LC_FREQ
* 2 / REF_MAX
+ 1;
722 r2
<= LC_FREQ
* 2 / REF_MIN
;
726 * VCO = N * Ref, that is: VCO = N * LC_FREQ / R
728 * Once again we want VCO_MIN <= VCO <= VCO_MAX.
729 * Injecting R2 = 2 * R and N2 = 2 * N, we get:
730 * VCO_MAX * r2 > n2 * LC_FREQ and
731 * VCO_MIN * r2 < n2 * LC_FREQ)
733 * Which means the desired boundaries for n2 are:
734 * VCO_MIN * r2 / LC_FREQ < n2 < VCO_MAX * r2 / LC_FREQ
736 for (n2
= VCO_MIN
* r2
/ LC_FREQ
+ 1;
737 n2
<= VCO_MAX
* r2
/ LC_FREQ
;
740 for (p
= P_MIN
; p
<= P_MAX
; p
+= P_INC
)
741 hsw_wrpll_update_rnp(freq2k
, budget
,
751 static struct intel_shared_dpll
*hsw_ddi_hdmi_get_dpll(int clock
,
752 struct intel_crtc
*crtc
,
753 struct intel_crtc_state
*crtc_state
)
755 struct intel_shared_dpll
*pll
;
757 unsigned int p
, n2
, r2
;
759 hsw_ddi_calculate_wrpll(clock
* 1000, &r2
, &n2
, &p
);
761 val
= WRPLL_PLL_ENABLE
| WRPLL_PLL_LCPLL
|
762 WRPLL_DIVIDER_REFERENCE(r2
) | WRPLL_DIVIDER_FEEDBACK(n2
) |
763 WRPLL_DIVIDER_POST(p
);
765 crtc_state
->dpll_hw_state
.wrpll
= val
;
767 pll
= intel_find_shared_dpll(crtc
, crtc_state
,
768 DPLL_ID_WRPLL1
, DPLL_ID_WRPLL2
);
776 static struct intel_shared_dpll
*
777 hsw_ddi_dp_get_dpll(struct intel_encoder
*encoder
, int clock
)
779 struct drm_i915_private
*dev_priv
= to_i915(encoder
->base
.dev
);
780 struct intel_shared_dpll
*pll
;
781 enum intel_dpll_id pll_id
;
785 pll_id
= DPLL_ID_LCPLL_810
;
788 pll_id
= DPLL_ID_LCPLL_1350
;
791 pll_id
= DPLL_ID_LCPLL_2700
;
794 DRM_DEBUG_KMS("Invalid clock for DP: %d\n", clock
);
798 pll
= intel_get_shared_dpll_by_id(dev_priv
, pll_id
);
806 static struct intel_shared_dpll
*
807 hsw_get_dpll(struct intel_crtc
*crtc
, struct intel_crtc_state
*crtc_state
,
808 struct intel_encoder
*encoder
)
810 struct intel_shared_dpll
*pll
;
811 int clock
= crtc_state
->port_clock
;
813 memset(&crtc_state
->dpll_hw_state
, 0,
814 sizeof(crtc_state
->dpll_hw_state
));
816 if (intel_crtc_has_type(crtc_state
, INTEL_OUTPUT_HDMI
)) {
817 pll
= hsw_ddi_hdmi_get_dpll(clock
, crtc
, crtc_state
);
818 } else if (intel_crtc_has_dp_encoder(crtc_state
)) {
819 pll
= hsw_ddi_dp_get_dpll(encoder
, clock
);
820 } else if (intel_crtc_has_type(crtc_state
, INTEL_OUTPUT_ANALOG
)) {
821 if (WARN_ON(crtc_state
->port_clock
/ 2 != 135000))
824 crtc_state
->dpll_hw_state
.spll
=
825 SPLL_PLL_ENABLE
| SPLL_PLL_FREQ_1350MHz
| SPLL_PLL_SSC
;
827 pll
= intel_find_shared_dpll(crtc
, crtc_state
,
828 DPLL_ID_SPLL
, DPLL_ID_SPLL
);
836 intel_reference_shared_dpll(pll
, crtc_state
);
841 static void hsw_dump_hw_state(struct drm_i915_private
*dev_priv
,
842 struct intel_dpll_hw_state
*hw_state
)
844 DRM_DEBUG_KMS("dpll_hw_state: wrpll: 0x%x spll: 0x%x\n",
845 hw_state
->wrpll
, hw_state
->spll
);
848 static const struct intel_shared_dpll_funcs hsw_ddi_wrpll_funcs
= {
849 .enable
= hsw_ddi_wrpll_enable
,
850 .disable
= hsw_ddi_wrpll_disable
,
851 .get_hw_state
= hsw_ddi_wrpll_get_hw_state
,
854 static const struct intel_shared_dpll_funcs hsw_ddi_spll_funcs
= {
855 .enable
= hsw_ddi_spll_enable
,
856 .disable
= hsw_ddi_spll_disable
,
857 .get_hw_state
= hsw_ddi_spll_get_hw_state
,
860 static void hsw_ddi_lcpll_enable(struct drm_i915_private
*dev_priv
,
861 struct intel_shared_dpll
*pll
)
865 static void hsw_ddi_lcpll_disable(struct drm_i915_private
*dev_priv
,
866 struct intel_shared_dpll
*pll
)
870 static bool hsw_ddi_lcpll_get_hw_state(struct drm_i915_private
*dev_priv
,
871 struct intel_shared_dpll
*pll
,
872 struct intel_dpll_hw_state
*hw_state
)
877 static const struct intel_shared_dpll_funcs hsw_ddi_lcpll_funcs
= {
878 .enable
= hsw_ddi_lcpll_enable
,
879 .disable
= hsw_ddi_lcpll_disable
,
880 .get_hw_state
= hsw_ddi_lcpll_get_hw_state
,
883 struct skl_dpll_regs
{
884 i915_reg_t ctl
, cfgcr1
, cfgcr2
;
887 /* this array is indexed by the *shared* pll id */
888 static const struct skl_dpll_regs skl_dpll_regs
[4] = {
892 /* DPLL 0 doesn't support HDMI mode */
897 .cfgcr1
= DPLL_CFGCR1(SKL_DPLL1
),
898 .cfgcr2
= DPLL_CFGCR2(SKL_DPLL1
),
903 .cfgcr1
= DPLL_CFGCR1(SKL_DPLL2
),
904 .cfgcr2
= DPLL_CFGCR2(SKL_DPLL2
),
909 .cfgcr1
= DPLL_CFGCR1(SKL_DPLL3
),
910 .cfgcr2
= DPLL_CFGCR2(SKL_DPLL3
),
914 static void skl_ddi_pll_write_ctrl1(struct drm_i915_private
*dev_priv
,
915 struct intel_shared_dpll
*pll
)
919 val
= I915_READ(DPLL_CTRL1
);
921 val
&= ~(DPLL_CTRL1_HDMI_MODE(pll
->id
) | DPLL_CTRL1_SSC(pll
->id
) |
922 DPLL_CTRL1_LINK_RATE_MASK(pll
->id
));
923 val
|= pll
->state
.hw_state
.ctrl1
<< (pll
->id
* 6);
925 I915_WRITE(DPLL_CTRL1
, val
);
926 POSTING_READ(DPLL_CTRL1
);
929 static void skl_ddi_pll_enable(struct drm_i915_private
*dev_priv
,
930 struct intel_shared_dpll
*pll
)
932 const struct skl_dpll_regs
*regs
= skl_dpll_regs
;
934 skl_ddi_pll_write_ctrl1(dev_priv
, pll
);
936 I915_WRITE(regs
[pll
->id
].cfgcr1
, pll
->state
.hw_state
.cfgcr1
);
937 I915_WRITE(regs
[pll
->id
].cfgcr2
, pll
->state
.hw_state
.cfgcr2
);
938 POSTING_READ(regs
[pll
->id
].cfgcr1
);
939 POSTING_READ(regs
[pll
->id
].cfgcr2
);
941 /* the enable bit is always bit 31 */
942 I915_WRITE(regs
[pll
->id
].ctl
,
943 I915_READ(regs
[pll
->id
].ctl
) | LCPLL_PLL_ENABLE
);
945 if (intel_wait_for_register(dev_priv
,
950 DRM_ERROR("DPLL %d not locked\n", pll
->id
);
953 static void skl_ddi_dpll0_enable(struct drm_i915_private
*dev_priv
,
954 struct intel_shared_dpll
*pll
)
956 skl_ddi_pll_write_ctrl1(dev_priv
, pll
);
959 static void skl_ddi_pll_disable(struct drm_i915_private
*dev_priv
,
960 struct intel_shared_dpll
*pll
)
962 const struct skl_dpll_regs
*regs
= skl_dpll_regs
;
964 /* the enable bit is always bit 31 */
965 I915_WRITE(regs
[pll
->id
].ctl
,
966 I915_READ(regs
[pll
->id
].ctl
) & ~LCPLL_PLL_ENABLE
);
967 POSTING_READ(regs
[pll
->id
].ctl
);
970 static void skl_ddi_dpll0_disable(struct drm_i915_private
*dev_priv
,
971 struct intel_shared_dpll
*pll
)
975 static bool skl_ddi_pll_get_hw_state(struct drm_i915_private
*dev_priv
,
976 struct intel_shared_dpll
*pll
,
977 struct intel_dpll_hw_state
*hw_state
)
980 const struct skl_dpll_regs
*regs
= skl_dpll_regs
;
983 if (!intel_display_power_get_if_enabled(dev_priv
, POWER_DOMAIN_PLLS
))
988 val
= I915_READ(regs
[pll
->id
].ctl
);
989 if (!(val
& LCPLL_PLL_ENABLE
))
992 val
= I915_READ(DPLL_CTRL1
);
993 hw_state
->ctrl1
= (val
>> (pll
->id
* 6)) & 0x3f;
995 /* avoid reading back stale values if HDMI mode is not enabled */
996 if (val
& DPLL_CTRL1_HDMI_MODE(pll
->id
)) {
997 hw_state
->cfgcr1
= I915_READ(regs
[pll
->id
].cfgcr1
);
998 hw_state
->cfgcr2
= I915_READ(regs
[pll
->id
].cfgcr2
);
1003 intel_display_power_put(dev_priv
, POWER_DOMAIN_PLLS
);
1008 static bool skl_ddi_dpll0_get_hw_state(struct drm_i915_private
*dev_priv
,
1009 struct intel_shared_dpll
*pll
,
1010 struct intel_dpll_hw_state
*hw_state
)
1013 const struct skl_dpll_regs
*regs
= skl_dpll_regs
;
1016 if (!intel_display_power_get_if_enabled(dev_priv
, POWER_DOMAIN_PLLS
))
1021 /* DPLL0 is always enabled since it drives CDCLK */
1022 val
= I915_READ(regs
[pll
->id
].ctl
);
1023 if (WARN_ON(!(val
& LCPLL_PLL_ENABLE
)))
1026 val
= I915_READ(DPLL_CTRL1
);
1027 hw_state
->ctrl1
= (val
>> (pll
->id
* 6)) & 0x3f;
1032 intel_display_power_put(dev_priv
, POWER_DOMAIN_PLLS
);
1037 struct skl_wrpll_context
{
1038 uint64_t min_deviation
; /* current minimal deviation */
1039 uint64_t central_freq
; /* chosen central freq */
1040 uint64_t dco_freq
; /* chosen dco freq */
1041 unsigned int p
; /* chosen divider */
1044 static void skl_wrpll_context_init(struct skl_wrpll_context
*ctx
)
1046 memset(ctx
, 0, sizeof(*ctx
));
1048 ctx
->min_deviation
= U64_MAX
;
1051 /* DCO freq must be within +1%/-6% of the DCO central freq */
1052 #define SKL_DCO_MAX_PDEVIATION 100
1053 #define SKL_DCO_MAX_NDEVIATION 600
1055 static void skl_wrpll_try_divider(struct skl_wrpll_context
*ctx
,
1056 uint64_t central_freq
,
1058 unsigned int divider
)
1062 deviation
= div64_u64(10000 * abs_diff(dco_freq
, central_freq
),
1065 /* positive deviation */
1066 if (dco_freq
>= central_freq
) {
1067 if (deviation
< SKL_DCO_MAX_PDEVIATION
&&
1068 deviation
< ctx
->min_deviation
) {
1069 ctx
->min_deviation
= deviation
;
1070 ctx
->central_freq
= central_freq
;
1071 ctx
->dco_freq
= dco_freq
;
1074 /* negative deviation */
1075 } else if (deviation
< SKL_DCO_MAX_NDEVIATION
&&
1076 deviation
< ctx
->min_deviation
) {
1077 ctx
->min_deviation
= deviation
;
1078 ctx
->central_freq
= central_freq
;
1079 ctx
->dco_freq
= dco_freq
;
1084 static void skl_wrpll_get_multipliers(unsigned int p
,
1085 unsigned int *p0
/* out */,
1086 unsigned int *p1
/* out */,
1087 unsigned int *p2
/* out */)
1091 unsigned int half
= p
/ 2;
1093 if (half
== 1 || half
== 2 || half
== 3 || half
== 5) {
1097 } else if (half
% 2 == 0) {
1101 } else if (half
% 3 == 0) {
1105 } else if (half
% 7 == 0) {
1110 } else if (p
== 3 || p
== 9) { /* 3, 5, 7, 9, 15, 21, 35 */
1114 } else if (p
== 5 || p
== 7) {
1118 } else if (p
== 15) {
1122 } else if (p
== 21) {
1126 } else if (p
== 35) {
1133 struct skl_wrpll_params
{
1134 uint32_t dco_fraction
;
1135 uint32_t dco_integer
;
1136 uint32_t qdiv_ratio
;
1140 uint32_t central_freq
;
1143 static void skl_wrpll_params_populate(struct skl_wrpll_params
*params
,
1145 uint64_t central_freq
,
1146 uint32_t p0
, uint32_t p1
, uint32_t p2
)
1150 switch (central_freq
) {
1152 params
->central_freq
= 0;
1155 params
->central_freq
= 1;
1158 params
->central_freq
= 3;
1175 WARN(1, "Incorrect PDiv\n");
1192 WARN(1, "Incorrect KDiv\n");
1195 params
->qdiv_ratio
= p1
;
1196 params
->qdiv_mode
= (params
->qdiv_ratio
== 1) ? 0 : 1;
1198 dco_freq
= p0
* p1
* p2
* afe_clock
;
1201 * Intermediate values are in Hz.
1202 * Divide by MHz to match bsepc
1204 params
->dco_integer
= div_u64(dco_freq
, 24 * MHz(1));
1205 params
->dco_fraction
=
1206 div_u64((div_u64(dco_freq
, 24) -
1207 params
->dco_integer
* MHz(1)) * 0x8000, MHz(1));
1211 skl_ddi_calculate_wrpll(int clock
/* in Hz */,
1212 struct skl_wrpll_params
*wrpll_params
)
1214 uint64_t afe_clock
= clock
* 5; /* AFE Clock is 5x Pixel clock */
1215 uint64_t dco_central_freq
[3] = {8400000000ULL,
1218 static const int even_dividers
[] = { 4, 6, 8, 10, 12, 14, 16, 18, 20,
1219 24, 28, 30, 32, 36, 40, 42, 44,
1220 48, 52, 54, 56, 60, 64, 66, 68,
1221 70, 72, 76, 78, 80, 84, 88, 90,
1223 static const int odd_dividers
[] = { 3, 5, 7, 9, 15, 21, 35 };
1224 static const struct {
1228 { even_dividers
, ARRAY_SIZE(even_dividers
) },
1229 { odd_dividers
, ARRAY_SIZE(odd_dividers
) },
1231 struct skl_wrpll_context ctx
;
1232 unsigned int dco
, d
, i
;
1233 unsigned int p0
, p1
, p2
;
1235 skl_wrpll_context_init(&ctx
);
1237 for (d
= 0; d
< ARRAY_SIZE(dividers
); d
++) {
1238 for (dco
= 0; dco
< ARRAY_SIZE(dco_central_freq
); dco
++) {
1239 for (i
= 0; i
< dividers
[d
].n_dividers
; i
++) {
1240 unsigned int p
= dividers
[d
].list
[i
];
1241 uint64_t dco_freq
= p
* afe_clock
;
1243 skl_wrpll_try_divider(&ctx
,
1244 dco_central_freq
[dco
],
1248 * Skip the remaining dividers if we're sure to
1249 * have found the definitive divider, we can't
1250 * improve a 0 deviation.
1252 if (ctx
.min_deviation
== 0)
1253 goto skip_remaining_dividers
;
1257 skip_remaining_dividers
:
1259 * If a solution is found with an even divider, prefer
1262 if (d
== 0 && ctx
.p
)
1267 DRM_DEBUG_DRIVER("No valid divider found for %dHz\n", clock
);
1272 * gcc incorrectly analyses that these can be used without being
1273 * initialized. To be fair, it's hard to guess.
1276 skl_wrpll_get_multipliers(ctx
.p
, &p0
, &p1
, &p2
);
1277 skl_wrpll_params_populate(wrpll_params
, afe_clock
, ctx
.central_freq
,
1283 static bool skl_ddi_hdmi_pll_dividers(struct intel_crtc
*crtc
,
1284 struct intel_crtc_state
*crtc_state
,
1287 uint32_t ctrl1
, cfgcr1
, cfgcr2
;
1288 struct skl_wrpll_params wrpll_params
= { 0, };
1291 * See comment in intel_dpll_hw_state to understand why we always use 0
1292 * as the DPLL id in this function.
1294 ctrl1
= DPLL_CTRL1_OVERRIDE(0);
1296 ctrl1
|= DPLL_CTRL1_HDMI_MODE(0);
1298 if (!skl_ddi_calculate_wrpll(clock
* 1000, &wrpll_params
))
1301 cfgcr1
= DPLL_CFGCR1_FREQ_ENABLE
|
1302 DPLL_CFGCR1_DCO_FRACTION(wrpll_params
.dco_fraction
) |
1303 wrpll_params
.dco_integer
;
1305 cfgcr2
= DPLL_CFGCR2_QDIV_RATIO(wrpll_params
.qdiv_ratio
) |
1306 DPLL_CFGCR2_QDIV_MODE(wrpll_params
.qdiv_mode
) |
1307 DPLL_CFGCR2_KDIV(wrpll_params
.kdiv
) |
1308 DPLL_CFGCR2_PDIV(wrpll_params
.pdiv
) |
1309 wrpll_params
.central_freq
;
1311 memset(&crtc_state
->dpll_hw_state
, 0,
1312 sizeof(crtc_state
->dpll_hw_state
));
1314 crtc_state
->dpll_hw_state
.ctrl1
= ctrl1
;
1315 crtc_state
->dpll_hw_state
.cfgcr1
= cfgcr1
;
1316 crtc_state
->dpll_hw_state
.cfgcr2
= cfgcr2
;
1321 skl_ddi_dp_set_dpll_hw_state(int clock
,
1322 struct intel_dpll_hw_state
*dpll_hw_state
)
1327 * See comment in intel_dpll_hw_state to understand why we always use 0
1328 * as the DPLL id in this function.
1330 ctrl1
= DPLL_CTRL1_OVERRIDE(0);
1331 switch (clock
/ 2) {
1333 ctrl1
|= DPLL_CTRL1_LINK_RATE(DPLL_CTRL1_LINK_RATE_810
, 0);
1336 ctrl1
|= DPLL_CTRL1_LINK_RATE(DPLL_CTRL1_LINK_RATE_1350
, 0);
1339 ctrl1
|= DPLL_CTRL1_LINK_RATE(DPLL_CTRL1_LINK_RATE_2700
, 0);
1343 ctrl1
|= DPLL_CTRL1_LINK_RATE(DPLL_CTRL1_LINK_RATE_1620
, 0);
1346 ctrl1
|= DPLL_CTRL1_LINK_RATE(DPLL_CTRL1_LINK_RATE_1080
, 0);
1349 ctrl1
|= DPLL_CTRL1_LINK_RATE(DPLL_CTRL1_LINK_RATE_2160
, 0);
1353 dpll_hw_state
->ctrl1
= ctrl1
;
1357 static struct intel_shared_dpll
*
1358 skl_get_dpll(struct intel_crtc
*crtc
, struct intel_crtc_state
*crtc_state
,
1359 struct intel_encoder
*encoder
)
1361 struct intel_shared_dpll
*pll
;
1362 int clock
= crtc_state
->port_clock
;
1364 struct intel_dpll_hw_state dpll_hw_state
;
1366 memset(&dpll_hw_state
, 0, sizeof(dpll_hw_state
));
1368 if (intel_crtc_has_type(crtc_state
, INTEL_OUTPUT_HDMI
)) {
1369 bret
= skl_ddi_hdmi_pll_dividers(crtc
, crtc_state
, clock
);
1371 DRM_DEBUG_KMS("Could not get HDMI pll dividers.\n");
1374 } else if (intel_crtc_has_dp_encoder(crtc_state
)) {
1375 bret
= skl_ddi_dp_set_dpll_hw_state(clock
, &dpll_hw_state
);
1377 DRM_DEBUG_KMS("Could not set DP dpll HW state.\n");
1380 crtc_state
->dpll_hw_state
= dpll_hw_state
;
1385 if (intel_crtc_has_type(crtc_state
, INTEL_OUTPUT_EDP
))
1386 pll
= intel_find_shared_dpll(crtc
, crtc_state
,
1390 pll
= intel_find_shared_dpll(crtc
, crtc_state
,
1396 intel_reference_shared_dpll(pll
, crtc_state
);
1401 static void skl_dump_hw_state(struct drm_i915_private
*dev_priv
,
1402 struct intel_dpll_hw_state
*hw_state
)
1404 DRM_DEBUG_KMS("dpll_hw_state: "
1405 "ctrl1: 0x%x, cfgcr1: 0x%x, cfgcr2: 0x%x\n",
1411 static const struct intel_shared_dpll_funcs skl_ddi_pll_funcs
= {
1412 .enable
= skl_ddi_pll_enable
,
1413 .disable
= skl_ddi_pll_disable
,
1414 .get_hw_state
= skl_ddi_pll_get_hw_state
,
1417 static const struct intel_shared_dpll_funcs skl_ddi_dpll0_funcs
= {
1418 .enable
= skl_ddi_dpll0_enable
,
1419 .disable
= skl_ddi_dpll0_disable
,
1420 .get_hw_state
= skl_ddi_dpll0_get_hw_state
,
1423 static void bxt_ddi_pll_enable(struct drm_i915_private
*dev_priv
,
1424 struct intel_shared_dpll
*pll
)
1427 enum port port
= (enum port
)pll
->id
; /* 1:1 port->PLL mapping */
1429 enum dpio_channel ch
;
1431 bxt_port_to_phy_channel(dev_priv
, port
, &phy
, &ch
);
1433 /* Non-SSC reference */
1434 temp
= I915_READ(BXT_PORT_PLL_ENABLE(port
));
1435 temp
|= PORT_PLL_REF_SEL
;
1436 I915_WRITE(BXT_PORT_PLL_ENABLE(port
), temp
);
1438 if (IS_GEMINILAKE(dev_priv
)) {
1439 temp
= I915_READ(BXT_PORT_PLL_ENABLE(port
));
1440 temp
|= PORT_PLL_POWER_ENABLE
;
1441 I915_WRITE(BXT_PORT_PLL_ENABLE(port
), temp
);
1443 if (wait_for_us((I915_READ(BXT_PORT_PLL_ENABLE(port
)) &
1444 PORT_PLL_POWER_STATE
), 200))
1445 DRM_ERROR("Power state not set for PLL:%d\n", port
);
1448 /* Disable 10 bit clock */
1449 temp
= I915_READ(BXT_PORT_PLL_EBB_4(phy
, ch
));
1450 temp
&= ~PORT_PLL_10BIT_CLK_ENABLE
;
1451 I915_WRITE(BXT_PORT_PLL_EBB_4(phy
, ch
), temp
);
1454 temp
= I915_READ(BXT_PORT_PLL_EBB_0(phy
, ch
));
1455 temp
&= ~(PORT_PLL_P1_MASK
| PORT_PLL_P2_MASK
);
1456 temp
|= pll
->state
.hw_state
.ebb0
;
1457 I915_WRITE(BXT_PORT_PLL_EBB_0(phy
, ch
), temp
);
1459 /* Write M2 integer */
1460 temp
= I915_READ(BXT_PORT_PLL(phy
, ch
, 0));
1461 temp
&= ~PORT_PLL_M2_MASK
;
1462 temp
|= pll
->state
.hw_state
.pll0
;
1463 I915_WRITE(BXT_PORT_PLL(phy
, ch
, 0), temp
);
1466 temp
= I915_READ(BXT_PORT_PLL(phy
, ch
, 1));
1467 temp
&= ~PORT_PLL_N_MASK
;
1468 temp
|= pll
->state
.hw_state
.pll1
;
1469 I915_WRITE(BXT_PORT_PLL(phy
, ch
, 1), temp
);
1471 /* Write M2 fraction */
1472 temp
= I915_READ(BXT_PORT_PLL(phy
, ch
, 2));
1473 temp
&= ~PORT_PLL_M2_FRAC_MASK
;
1474 temp
|= pll
->state
.hw_state
.pll2
;
1475 I915_WRITE(BXT_PORT_PLL(phy
, ch
, 2), temp
);
1477 /* Write M2 fraction enable */
1478 temp
= I915_READ(BXT_PORT_PLL(phy
, ch
, 3));
1479 temp
&= ~PORT_PLL_M2_FRAC_ENABLE
;
1480 temp
|= pll
->state
.hw_state
.pll3
;
1481 I915_WRITE(BXT_PORT_PLL(phy
, ch
, 3), temp
);
1484 temp
= I915_READ(BXT_PORT_PLL(phy
, ch
, 6));
1485 temp
&= ~PORT_PLL_PROP_COEFF_MASK
;
1486 temp
&= ~PORT_PLL_INT_COEFF_MASK
;
1487 temp
&= ~PORT_PLL_GAIN_CTL_MASK
;
1488 temp
|= pll
->state
.hw_state
.pll6
;
1489 I915_WRITE(BXT_PORT_PLL(phy
, ch
, 6), temp
);
1491 /* Write calibration val */
1492 temp
= I915_READ(BXT_PORT_PLL(phy
, ch
, 8));
1493 temp
&= ~PORT_PLL_TARGET_CNT_MASK
;
1494 temp
|= pll
->state
.hw_state
.pll8
;
1495 I915_WRITE(BXT_PORT_PLL(phy
, ch
, 8), temp
);
1497 temp
= I915_READ(BXT_PORT_PLL(phy
, ch
, 9));
1498 temp
&= ~PORT_PLL_LOCK_THRESHOLD_MASK
;
1499 temp
|= pll
->state
.hw_state
.pll9
;
1500 I915_WRITE(BXT_PORT_PLL(phy
, ch
, 9), temp
);
1502 temp
= I915_READ(BXT_PORT_PLL(phy
, ch
, 10));
1503 temp
&= ~PORT_PLL_DCO_AMP_OVR_EN_H
;
1504 temp
&= ~PORT_PLL_DCO_AMP_MASK
;
1505 temp
|= pll
->state
.hw_state
.pll10
;
1506 I915_WRITE(BXT_PORT_PLL(phy
, ch
, 10), temp
);
1508 /* Recalibrate with new settings */
1509 temp
= I915_READ(BXT_PORT_PLL_EBB_4(phy
, ch
));
1510 temp
|= PORT_PLL_RECALIBRATE
;
1511 I915_WRITE(BXT_PORT_PLL_EBB_4(phy
, ch
), temp
);
1512 temp
&= ~PORT_PLL_10BIT_CLK_ENABLE
;
1513 temp
|= pll
->state
.hw_state
.ebb4
;
1514 I915_WRITE(BXT_PORT_PLL_EBB_4(phy
, ch
), temp
);
1517 temp
= I915_READ(BXT_PORT_PLL_ENABLE(port
));
1518 temp
|= PORT_PLL_ENABLE
;
1519 I915_WRITE(BXT_PORT_PLL_ENABLE(port
), temp
);
1520 POSTING_READ(BXT_PORT_PLL_ENABLE(port
));
1522 if (wait_for_us((I915_READ(BXT_PORT_PLL_ENABLE(port
)) & PORT_PLL_LOCK
),
1524 DRM_ERROR("PLL %d not locked\n", port
);
1526 if (IS_GEMINILAKE(dev_priv
)) {
1527 temp
= I915_READ(BXT_PORT_TX_DW5_LN0(phy
, ch
));
1528 temp
|= DCC_DELAY_RANGE_2
;
1529 I915_WRITE(BXT_PORT_TX_DW5_GRP(phy
, ch
), temp
);
1533 * While we write to the group register to program all lanes at once we
1534 * can read only lane registers and we pick lanes 0/1 for that.
1536 temp
= I915_READ(BXT_PORT_PCS_DW12_LN01(phy
, ch
));
1537 temp
&= ~LANE_STAGGER_MASK
;
1538 temp
&= ~LANESTAGGER_STRAP_OVRD
;
1539 temp
|= pll
->state
.hw_state
.pcsdw12
;
1540 I915_WRITE(BXT_PORT_PCS_DW12_GRP(phy
, ch
), temp
);
1543 static void bxt_ddi_pll_disable(struct drm_i915_private
*dev_priv
,
1544 struct intel_shared_dpll
*pll
)
1546 enum port port
= (enum port
)pll
->id
; /* 1:1 port->PLL mapping */
1549 temp
= I915_READ(BXT_PORT_PLL_ENABLE(port
));
1550 temp
&= ~PORT_PLL_ENABLE
;
1551 I915_WRITE(BXT_PORT_PLL_ENABLE(port
), temp
);
1552 POSTING_READ(BXT_PORT_PLL_ENABLE(port
));
1554 if (IS_GEMINILAKE(dev_priv
)) {
1555 temp
= I915_READ(BXT_PORT_PLL_ENABLE(port
));
1556 temp
&= ~PORT_PLL_POWER_ENABLE
;
1557 I915_WRITE(BXT_PORT_PLL_ENABLE(port
), temp
);
1559 if (wait_for_us(!(I915_READ(BXT_PORT_PLL_ENABLE(port
)) &
1560 PORT_PLL_POWER_STATE
), 200))
1561 DRM_ERROR("Power state not reset for PLL:%d\n", port
);
1565 static bool bxt_ddi_pll_get_hw_state(struct drm_i915_private
*dev_priv
,
1566 struct intel_shared_dpll
*pll
,
1567 struct intel_dpll_hw_state
*hw_state
)
1569 enum port port
= (enum port
)pll
->id
; /* 1:1 port->PLL mapping */
1573 enum dpio_channel ch
;
1575 bxt_port_to_phy_channel(dev_priv
, port
, &phy
, &ch
);
1577 if (!intel_display_power_get_if_enabled(dev_priv
, POWER_DOMAIN_PLLS
))
1582 val
= I915_READ(BXT_PORT_PLL_ENABLE(port
));
1583 if (!(val
& PORT_PLL_ENABLE
))
1586 hw_state
->ebb0
= I915_READ(BXT_PORT_PLL_EBB_0(phy
, ch
));
1587 hw_state
->ebb0
&= PORT_PLL_P1_MASK
| PORT_PLL_P2_MASK
;
1589 hw_state
->ebb4
= I915_READ(BXT_PORT_PLL_EBB_4(phy
, ch
));
1590 hw_state
->ebb4
&= PORT_PLL_10BIT_CLK_ENABLE
;
1592 hw_state
->pll0
= I915_READ(BXT_PORT_PLL(phy
, ch
, 0));
1593 hw_state
->pll0
&= PORT_PLL_M2_MASK
;
1595 hw_state
->pll1
= I915_READ(BXT_PORT_PLL(phy
, ch
, 1));
1596 hw_state
->pll1
&= PORT_PLL_N_MASK
;
1598 hw_state
->pll2
= I915_READ(BXT_PORT_PLL(phy
, ch
, 2));
1599 hw_state
->pll2
&= PORT_PLL_M2_FRAC_MASK
;
1601 hw_state
->pll3
= I915_READ(BXT_PORT_PLL(phy
, ch
, 3));
1602 hw_state
->pll3
&= PORT_PLL_M2_FRAC_ENABLE
;
1604 hw_state
->pll6
= I915_READ(BXT_PORT_PLL(phy
, ch
, 6));
1605 hw_state
->pll6
&= PORT_PLL_PROP_COEFF_MASK
|
1606 PORT_PLL_INT_COEFF_MASK
|
1607 PORT_PLL_GAIN_CTL_MASK
;
1609 hw_state
->pll8
= I915_READ(BXT_PORT_PLL(phy
, ch
, 8));
1610 hw_state
->pll8
&= PORT_PLL_TARGET_CNT_MASK
;
1612 hw_state
->pll9
= I915_READ(BXT_PORT_PLL(phy
, ch
, 9));
1613 hw_state
->pll9
&= PORT_PLL_LOCK_THRESHOLD_MASK
;
1615 hw_state
->pll10
= I915_READ(BXT_PORT_PLL(phy
, ch
, 10));
1616 hw_state
->pll10
&= PORT_PLL_DCO_AMP_OVR_EN_H
|
1617 PORT_PLL_DCO_AMP_MASK
;
1620 * While we write to the group register to program all lanes at once we
1621 * can read only lane registers. We configure all lanes the same way, so
1622 * here just read out lanes 0/1 and output a note if lanes 2/3 differ.
1624 hw_state
->pcsdw12
= I915_READ(BXT_PORT_PCS_DW12_LN01(phy
, ch
));
1625 if (I915_READ(BXT_PORT_PCS_DW12_LN23(phy
, ch
)) != hw_state
->pcsdw12
)
1626 DRM_DEBUG_DRIVER("lane stagger config different for lane 01 (%08x) and 23 (%08x)\n",
1628 I915_READ(BXT_PORT_PCS_DW12_LN23(phy
, ch
)));
1629 hw_state
->pcsdw12
&= LANE_STAGGER_MASK
| LANESTAGGER_STRAP_OVRD
;
1634 intel_display_power_put(dev_priv
, POWER_DOMAIN_PLLS
);
1639 /* bxt clock parameters */
1640 struct bxt_clk_div
{
1652 /* pre-calculated values for DP linkrates */
1653 static const struct bxt_clk_div bxt_dp_clk_val
[] = {
1654 {162000, 4, 2, 32, 1677722, 1, 1},
1655 {270000, 4, 1, 27, 0, 0, 1},
1656 {540000, 2, 1, 27, 0, 0, 1},
1657 {216000, 3, 2, 32, 1677722, 1, 1},
1658 {243000, 4, 1, 24, 1258291, 1, 1},
1659 {324000, 4, 1, 32, 1677722, 1, 1},
1660 {432000, 3, 1, 32, 1677722, 1, 1}
1664 bxt_ddi_hdmi_pll_dividers(struct intel_crtc
*intel_crtc
,
1665 struct intel_crtc_state
*crtc_state
, int clock
,
1666 struct bxt_clk_div
*clk_div
)
1668 struct dpll best_clock
;
1670 /* Calculate HDMI div */
1672 * FIXME: tie the following calculation into
1673 * i9xx_crtc_compute_clock
1675 if (!bxt_find_best_dpll(crtc_state
, clock
, &best_clock
)) {
1676 DRM_DEBUG_DRIVER("no PLL dividers found for clock %d pipe %c\n",
1677 clock
, pipe_name(intel_crtc
->pipe
));
1681 clk_div
->p1
= best_clock
.p1
;
1682 clk_div
->p2
= best_clock
.p2
;
1683 WARN_ON(best_clock
.m1
!= 2);
1684 clk_div
->n
= best_clock
.n
;
1685 clk_div
->m2_int
= best_clock
.m2
>> 22;
1686 clk_div
->m2_frac
= best_clock
.m2
& ((1 << 22) - 1);
1687 clk_div
->m2_frac_en
= clk_div
->m2_frac
!= 0;
1689 clk_div
->vco
= best_clock
.vco
;
1694 static void bxt_ddi_dp_pll_dividers(int clock
, struct bxt_clk_div
*clk_div
)
1698 *clk_div
= bxt_dp_clk_val
[0];
1699 for (i
= 0; i
< ARRAY_SIZE(bxt_dp_clk_val
); ++i
) {
1700 if (bxt_dp_clk_val
[i
].clock
== clock
) {
1701 *clk_div
= bxt_dp_clk_val
[i
];
1706 clk_div
->vco
= clock
* 10 / 2 * clk_div
->p1
* clk_div
->p2
;
1709 static bool bxt_ddi_set_dpll_hw_state(int clock
,
1710 struct bxt_clk_div
*clk_div
,
1711 struct intel_dpll_hw_state
*dpll_hw_state
)
1713 int vco
= clk_div
->vco
;
1714 uint32_t prop_coef
, int_coef
, gain_ctl
, targ_cnt
;
1715 uint32_t lanestagger
;
1717 if (vco
>= 6200000 && vco
<= 6700000) {
1722 } else if ((vco
> 5400000 && vco
< 6200000) ||
1723 (vco
>= 4800000 && vco
< 5400000)) {
1728 } else if (vco
== 5400000) {
1734 DRM_ERROR("Invalid VCO\n");
1740 else if (clock
> 135000)
1742 else if (clock
> 67000)
1744 else if (clock
> 33000)
1749 dpll_hw_state
->ebb0
= PORT_PLL_P1(clk_div
->p1
) | PORT_PLL_P2(clk_div
->p2
);
1750 dpll_hw_state
->pll0
= clk_div
->m2_int
;
1751 dpll_hw_state
->pll1
= PORT_PLL_N(clk_div
->n
);
1752 dpll_hw_state
->pll2
= clk_div
->m2_frac
;
1754 if (clk_div
->m2_frac_en
)
1755 dpll_hw_state
->pll3
= PORT_PLL_M2_FRAC_ENABLE
;
1757 dpll_hw_state
->pll6
= prop_coef
| PORT_PLL_INT_COEFF(int_coef
);
1758 dpll_hw_state
->pll6
|= PORT_PLL_GAIN_CTL(gain_ctl
);
1760 dpll_hw_state
->pll8
= targ_cnt
;
1762 dpll_hw_state
->pll9
= 5 << PORT_PLL_LOCK_THRESHOLD_SHIFT
;
1764 dpll_hw_state
->pll10
=
1765 PORT_PLL_DCO_AMP(PORT_PLL_DCO_AMP_DEFAULT
)
1766 | PORT_PLL_DCO_AMP_OVR_EN_H
;
1768 dpll_hw_state
->ebb4
= PORT_PLL_10BIT_CLK_ENABLE
;
1770 dpll_hw_state
->pcsdw12
= LANESTAGGER_STRAP_OVRD
| lanestagger
;
1776 bxt_ddi_dp_set_dpll_hw_state(int clock
,
1777 struct intel_dpll_hw_state
*dpll_hw_state
)
1779 struct bxt_clk_div clk_div
= {0};
1781 bxt_ddi_dp_pll_dividers(clock
, &clk_div
);
1783 return bxt_ddi_set_dpll_hw_state(clock
, &clk_div
, dpll_hw_state
);
1787 bxt_ddi_hdmi_set_dpll_hw_state(struct intel_crtc
*intel_crtc
,
1788 struct intel_crtc_state
*crtc_state
, int clock
,
1789 struct intel_dpll_hw_state
*dpll_hw_state
)
1791 struct bxt_clk_div clk_div
= { };
1793 bxt_ddi_hdmi_pll_dividers(intel_crtc
, crtc_state
, clock
, &clk_div
);
1795 return bxt_ddi_set_dpll_hw_state(clock
, &clk_div
, dpll_hw_state
);
1798 static struct intel_shared_dpll
*
1799 bxt_get_dpll(struct intel_crtc
*crtc
,
1800 struct intel_crtc_state
*crtc_state
,
1801 struct intel_encoder
*encoder
)
1803 struct intel_dpll_hw_state dpll_hw_state
= { };
1804 struct drm_i915_private
*dev_priv
= to_i915(crtc
->base
.dev
);
1805 struct intel_shared_dpll
*pll
;
1806 int i
, clock
= crtc_state
->port_clock
;
1808 if (intel_crtc_has_type(crtc_state
, INTEL_OUTPUT_HDMI
) &&
1809 !bxt_ddi_hdmi_set_dpll_hw_state(crtc
, crtc_state
, clock
,
1813 if (intel_crtc_has_dp_encoder(crtc_state
) &&
1814 !bxt_ddi_dp_set_dpll_hw_state(clock
, &dpll_hw_state
))
1817 memset(&crtc_state
->dpll_hw_state
, 0,
1818 sizeof(crtc_state
->dpll_hw_state
));
1820 crtc_state
->dpll_hw_state
= dpll_hw_state
;
1822 /* 1:1 mapping between ports and PLLs */
1823 i
= (enum intel_dpll_id
) encoder
->port
;
1824 pll
= intel_get_shared_dpll_by_id(dev_priv
, i
);
1826 DRM_DEBUG_KMS("[CRTC:%d:%s] using pre-allocated %s\n",
1827 crtc
->base
.base
.id
, crtc
->base
.name
, pll
->name
);
1829 intel_reference_shared_dpll(pll
, crtc_state
);
1834 static void bxt_dump_hw_state(struct drm_i915_private
*dev_priv
,
1835 struct intel_dpll_hw_state
*hw_state
)
1837 DRM_DEBUG_KMS("dpll_hw_state: ebb0: 0x%x, ebb4: 0x%x,"
1838 "pll0: 0x%x, pll1: 0x%x, pll2: 0x%x, pll3: 0x%x, "
1839 "pll6: 0x%x, pll8: 0x%x, pll9: 0x%x, pll10: 0x%x, pcsdw12: 0x%x\n",
1853 static const struct intel_shared_dpll_funcs bxt_ddi_pll_funcs
= {
1854 .enable
= bxt_ddi_pll_enable
,
1855 .disable
= bxt_ddi_pll_disable
,
1856 .get_hw_state
= bxt_ddi_pll_get_hw_state
,
1859 static void intel_ddi_pll_init(struct drm_device
*dev
)
1861 struct drm_i915_private
*dev_priv
= to_i915(dev
);
1863 if (INTEL_GEN(dev_priv
) < 9) {
1864 uint32_t val
= I915_READ(LCPLL_CTL
);
1867 * The LCPLL register should be turned on by the BIOS. For now
1868 * let's just check its state and print errors in case
1869 * something is wrong. Don't even try to turn it on.
1872 if (val
& LCPLL_CD_SOURCE_FCLK
)
1873 DRM_ERROR("CDCLK source is not LCPLL\n");
1875 if (val
& LCPLL_PLL_DISABLE
)
1876 DRM_ERROR("LCPLL is disabled\n");
1883 const struct intel_shared_dpll_funcs
*funcs
;
1887 struct intel_dpll_mgr
{
1888 const struct dpll_info
*dpll_info
;
1890 struct intel_shared_dpll
*(*get_dpll
)(struct intel_crtc
*crtc
,
1891 struct intel_crtc_state
*crtc_state
,
1892 struct intel_encoder
*encoder
);
1894 void (*dump_hw_state
)(struct drm_i915_private
*dev_priv
,
1895 struct intel_dpll_hw_state
*hw_state
);
1898 static const struct dpll_info pch_plls
[] = {
1899 { "PCH DPLL A", DPLL_ID_PCH_PLL_A
, &ibx_pch_dpll_funcs
, 0 },
1900 { "PCH DPLL B", DPLL_ID_PCH_PLL_B
, &ibx_pch_dpll_funcs
, 0 },
1901 { NULL
, -1, NULL
, 0 },
1904 static const struct intel_dpll_mgr pch_pll_mgr
= {
1905 .dpll_info
= pch_plls
,
1906 .get_dpll
= ibx_get_dpll
,
1907 .dump_hw_state
= ibx_dump_hw_state
,
1910 static const struct dpll_info hsw_plls
[] = {
1911 { "WRPLL 1", DPLL_ID_WRPLL1
, &hsw_ddi_wrpll_funcs
, 0 },
1912 { "WRPLL 2", DPLL_ID_WRPLL2
, &hsw_ddi_wrpll_funcs
, 0 },
1913 { "SPLL", DPLL_ID_SPLL
, &hsw_ddi_spll_funcs
, 0 },
1914 { "LCPLL 810", DPLL_ID_LCPLL_810
, &hsw_ddi_lcpll_funcs
, INTEL_DPLL_ALWAYS_ON
},
1915 { "LCPLL 1350", DPLL_ID_LCPLL_1350
, &hsw_ddi_lcpll_funcs
, INTEL_DPLL_ALWAYS_ON
},
1916 { "LCPLL 2700", DPLL_ID_LCPLL_2700
, &hsw_ddi_lcpll_funcs
, INTEL_DPLL_ALWAYS_ON
},
1917 { NULL
, -1, NULL
, },
1920 static const struct intel_dpll_mgr hsw_pll_mgr
= {
1921 .dpll_info
= hsw_plls
,
1922 .get_dpll
= hsw_get_dpll
,
1923 .dump_hw_state
= hsw_dump_hw_state
,
1926 static const struct dpll_info skl_plls
[] = {
1927 { "DPLL 0", DPLL_ID_SKL_DPLL0
, &skl_ddi_dpll0_funcs
, INTEL_DPLL_ALWAYS_ON
},
1928 { "DPLL 1", DPLL_ID_SKL_DPLL1
, &skl_ddi_pll_funcs
, 0 },
1929 { "DPLL 2", DPLL_ID_SKL_DPLL2
, &skl_ddi_pll_funcs
, 0 },
1930 { "DPLL 3", DPLL_ID_SKL_DPLL3
, &skl_ddi_pll_funcs
, 0 },
1931 { NULL
, -1, NULL
, },
1934 static const struct intel_dpll_mgr skl_pll_mgr
= {
1935 .dpll_info
= skl_plls
,
1936 .get_dpll
= skl_get_dpll
,
1937 .dump_hw_state
= skl_dump_hw_state
,
1940 static const struct dpll_info bxt_plls
[] = {
1941 { "PORT PLL A", DPLL_ID_SKL_DPLL0
, &bxt_ddi_pll_funcs
, 0 },
1942 { "PORT PLL B", DPLL_ID_SKL_DPLL1
, &bxt_ddi_pll_funcs
, 0 },
1943 { "PORT PLL C", DPLL_ID_SKL_DPLL2
, &bxt_ddi_pll_funcs
, 0 },
1944 { NULL
, -1, NULL
, },
1947 static const struct intel_dpll_mgr bxt_pll_mgr
= {
1948 .dpll_info
= bxt_plls
,
1949 .get_dpll
= bxt_get_dpll
,
1950 .dump_hw_state
= bxt_dump_hw_state
,
1953 static void cnl_ddi_pll_enable(struct drm_i915_private
*dev_priv
,
1954 struct intel_shared_dpll
*pll
)
1958 /* 1. Enable DPLL power in DPLL_ENABLE. */
1959 val
= I915_READ(CNL_DPLL_ENABLE(pll
->id
));
1960 val
|= PLL_POWER_ENABLE
;
1961 I915_WRITE(CNL_DPLL_ENABLE(pll
->id
), val
);
1963 /* 2. Wait for DPLL power state enabled in DPLL_ENABLE. */
1964 if (intel_wait_for_register(dev_priv
,
1965 CNL_DPLL_ENABLE(pll
->id
),
1969 DRM_ERROR("PLL %d Power not enabled\n", pll
->id
);
1972 * 3. Configure DPLL_CFGCR0 to set SSC enable/disable,
1973 * select DP mode, and set DP link rate.
1975 val
= pll
->state
.hw_state
.cfgcr0
;
1976 I915_WRITE(CNL_DPLL_CFGCR0(pll
->id
), val
);
1978 /* 4. Reab back to ensure writes completed */
1979 POSTING_READ(CNL_DPLL_CFGCR0(pll
->id
));
1981 /* 3. Configure DPLL_CFGCR0 */
1982 /* Avoid touch CFGCR1 if HDMI mode is not enabled */
1983 if (pll
->state
.hw_state
.cfgcr0
& DPLL_CFGCR0_HDMI_MODE
) {
1984 val
= pll
->state
.hw_state
.cfgcr1
;
1985 I915_WRITE(CNL_DPLL_CFGCR1(pll
->id
), val
);
1986 /* 4. Reab back to ensure writes completed */
1987 POSTING_READ(CNL_DPLL_CFGCR1(pll
->id
));
1991 * 5. If the frequency will result in a change to the voltage
1992 * requirement, follow the Display Voltage Frequency Switching
1993 * Sequence Before Frequency Change
1995 * Note: DVFS is actually handled via the cdclk code paths,
1996 * hence we do nothing here.
1999 /* 6. Enable DPLL in DPLL_ENABLE. */
2000 val
= I915_READ(CNL_DPLL_ENABLE(pll
->id
));
2002 I915_WRITE(CNL_DPLL_ENABLE(pll
->id
), val
);
2004 /* 7. Wait for PLL lock status in DPLL_ENABLE. */
2005 if (intel_wait_for_register(dev_priv
,
2006 CNL_DPLL_ENABLE(pll
->id
),
2010 DRM_ERROR("PLL %d not locked\n", pll
->id
);
2013 * 8. If the frequency will result in a change to the voltage
2014 * requirement, follow the Display Voltage Frequency Switching
2015 * Sequence After Frequency Change
2017 * Note: DVFS is actually handled via the cdclk code paths,
2018 * hence we do nothing here.
2022 * 9. turn on the clock for the DDI and map the DPLL to the DDI
2023 * Done at intel_ddi_clk_select
2027 static void cnl_ddi_pll_disable(struct drm_i915_private
*dev_priv
,
2028 struct intel_shared_dpll
*pll
)
2033 * 1. Configure DPCLKA_CFGCR0 to turn off the clock for the DDI.
2034 * Done at intel_ddi_post_disable
2038 * 2. If the frequency will result in a change to the voltage
2039 * requirement, follow the Display Voltage Frequency Switching
2040 * Sequence Before Frequency Change
2042 * Note: DVFS is actually handled via the cdclk code paths,
2043 * hence we do nothing here.
2046 /* 3. Disable DPLL through DPLL_ENABLE. */
2047 val
= I915_READ(CNL_DPLL_ENABLE(pll
->id
));
2049 I915_WRITE(CNL_DPLL_ENABLE(pll
->id
), val
);
2051 /* 4. Wait for PLL not locked status in DPLL_ENABLE. */
2052 if (intel_wait_for_register(dev_priv
,
2053 CNL_DPLL_ENABLE(pll
->id
),
2057 DRM_ERROR("PLL %d locked\n", pll
->id
);
2060 * 5. If the frequency will result in a change to the voltage
2061 * requirement, follow the Display Voltage Frequency Switching
2062 * Sequence After Frequency Change
2064 * Note: DVFS is actually handled via the cdclk code paths,
2065 * hence we do nothing here.
2068 /* 6. Disable DPLL power in DPLL_ENABLE. */
2069 val
= I915_READ(CNL_DPLL_ENABLE(pll
->id
));
2070 val
&= ~PLL_POWER_ENABLE
;
2071 I915_WRITE(CNL_DPLL_ENABLE(pll
->id
), val
);
2073 /* 7. Wait for DPLL power state disabled in DPLL_ENABLE. */
2074 if (intel_wait_for_register(dev_priv
,
2075 CNL_DPLL_ENABLE(pll
->id
),
2079 DRM_ERROR("PLL %d Power not disabled\n", pll
->id
);
2082 static bool cnl_ddi_pll_get_hw_state(struct drm_i915_private
*dev_priv
,
2083 struct intel_shared_dpll
*pll
,
2084 struct intel_dpll_hw_state
*hw_state
)
2089 if (!intel_display_power_get_if_enabled(dev_priv
, POWER_DOMAIN_PLLS
))
2094 val
= I915_READ(CNL_DPLL_ENABLE(pll
->id
));
2095 if (!(val
& PLL_ENABLE
))
2098 val
= I915_READ(CNL_DPLL_CFGCR0(pll
->id
));
2099 hw_state
->cfgcr0
= val
;
2101 /* avoid reading back stale values if HDMI mode is not enabled */
2102 if (val
& DPLL_CFGCR0_HDMI_MODE
) {
2103 hw_state
->cfgcr1
= I915_READ(CNL_DPLL_CFGCR1(pll
->id
));
2108 intel_display_power_put(dev_priv
, POWER_DOMAIN_PLLS
);
2113 static void cnl_wrpll_get_multipliers(int bestdiv
, int *pdiv
,
2114 int *qdiv
, int *kdiv
)
2117 if (bestdiv
% 2 == 0) {
2122 } else if (bestdiv
% 4 == 0) {
2124 *qdiv
= bestdiv
/ 4;
2126 } else if (bestdiv
% 6 == 0) {
2128 *qdiv
= bestdiv
/ 6;
2130 } else if (bestdiv
% 5 == 0) {
2132 *qdiv
= bestdiv
/ 10;
2134 } else if (bestdiv
% 14 == 0) {
2136 *qdiv
= bestdiv
/ 14;
2140 if (bestdiv
== 3 || bestdiv
== 5 || bestdiv
== 7) {
2144 } else { /* 9, 15, 21 */
2145 *pdiv
= bestdiv
/ 3;
2152 static void cnl_wrpll_params_populate(struct skl_wrpll_params
*params
,
2153 u32 dco_freq
, u32 ref_freq
,
2154 int pdiv
, int qdiv
, int kdiv
)
2169 WARN(1, "Incorrect KDiv\n");
2186 WARN(1, "Incorrect PDiv\n");
2189 WARN_ON(kdiv
!= 2 && qdiv
!= 1);
2191 params
->qdiv_ratio
= qdiv
;
2192 params
->qdiv_mode
= (qdiv
== 1) ? 0 : 1;
2194 dco
= div_u64((u64
)dco_freq
<< 15, ref_freq
);
2196 params
->dco_integer
= dco
>> 15;
2197 params
->dco_fraction
= dco
& 0x7fff;
2201 cnl_ddi_calculate_wrpll(int clock
,
2202 struct drm_i915_private
*dev_priv
,
2203 struct skl_wrpll_params
*wrpll_params
)
2205 u32 afe_clock
= clock
* 5;
2206 u32 dco_min
= 7998000;
2207 u32 dco_max
= 10000000;
2208 u32 dco_mid
= (dco_min
+ dco_max
) / 2;
2209 static const int dividers
[] = { 2, 4, 6, 8, 10, 12, 14, 16,
2210 18, 20, 24, 28, 30, 32, 36, 40,
2211 42, 44, 48, 50, 52, 54, 56, 60,
2212 64, 66, 68, 70, 72, 76, 78, 80,
2213 84, 88, 90, 92, 96, 98, 100, 102,
2214 3, 5, 7, 9, 15, 21 };
2215 u32 dco
, best_dco
= 0, dco_centrality
= 0;
2216 u32 best_dco_centrality
= U32_MAX
; /* Spec meaning of 999999 MHz */
2217 int d
, best_div
= 0, pdiv
= 0, qdiv
= 0, kdiv
= 0;
2219 for (d
= 0; d
< ARRAY_SIZE(dividers
); d
++) {
2220 dco
= afe_clock
* dividers
[d
];
2222 if ((dco
<= dco_max
) && (dco
>= dco_min
)) {
2223 dco_centrality
= abs(dco
- dco_mid
);
2225 if (dco_centrality
< best_dco_centrality
) {
2226 best_dco_centrality
= dco_centrality
;
2227 best_div
= dividers
[d
];
2236 cnl_wrpll_get_multipliers(best_div
, &pdiv
, &qdiv
, &kdiv
);
2238 cnl_wrpll_params_populate(wrpll_params
, best_dco
,
2239 dev_priv
->cdclk
.hw
.ref
, pdiv
, qdiv
, kdiv
);
2244 static bool cnl_ddi_hdmi_pll_dividers(struct intel_crtc
*crtc
,
2245 struct intel_crtc_state
*crtc_state
,
2248 struct drm_i915_private
*dev_priv
= to_i915(crtc
->base
.dev
);
2249 uint32_t cfgcr0
, cfgcr1
;
2250 struct skl_wrpll_params wrpll_params
= { 0, };
2252 cfgcr0
= DPLL_CFGCR0_HDMI_MODE
;
2254 if (!cnl_ddi_calculate_wrpll(clock
, dev_priv
, &wrpll_params
))
2257 cfgcr0
|= DPLL_CFGCR0_DCO_FRACTION(wrpll_params
.dco_fraction
) |
2258 wrpll_params
.dco_integer
;
2260 cfgcr1
= DPLL_CFGCR1_QDIV_RATIO(wrpll_params
.qdiv_ratio
) |
2261 DPLL_CFGCR1_QDIV_MODE(wrpll_params
.qdiv_mode
) |
2262 DPLL_CFGCR1_KDIV(wrpll_params
.kdiv
) |
2263 DPLL_CFGCR1_PDIV(wrpll_params
.pdiv
) |
2264 DPLL_CFGCR1_CENTRAL_FREQ
;
2266 memset(&crtc_state
->dpll_hw_state
, 0,
2267 sizeof(crtc_state
->dpll_hw_state
));
2269 crtc_state
->dpll_hw_state
.cfgcr0
= cfgcr0
;
2270 crtc_state
->dpll_hw_state
.cfgcr1
= cfgcr1
;
2275 cnl_ddi_dp_set_dpll_hw_state(int clock
,
2276 struct intel_dpll_hw_state
*dpll_hw_state
)
2280 cfgcr0
= DPLL_CFGCR0_SSC_ENABLE
;
2282 switch (clock
/ 2) {
2284 cfgcr0
|= DPLL_CFGCR0_LINK_RATE_810
;
2287 cfgcr0
|= DPLL_CFGCR0_LINK_RATE_1350
;
2290 cfgcr0
|= DPLL_CFGCR0_LINK_RATE_2700
;
2294 cfgcr0
|= DPLL_CFGCR0_LINK_RATE_1620
;
2297 cfgcr0
|= DPLL_CFGCR0_LINK_RATE_1080
;
2300 cfgcr0
|= DPLL_CFGCR0_LINK_RATE_2160
;
2303 /* Some SKUs may require elevated I/O voltage to support this */
2304 cfgcr0
|= DPLL_CFGCR0_LINK_RATE_3240
;
2307 /* Some SKUs may require elevated I/O voltage to support this */
2308 cfgcr0
|= DPLL_CFGCR0_LINK_RATE_4050
;
2312 dpll_hw_state
->cfgcr0
= cfgcr0
;
2316 static struct intel_shared_dpll
*
2317 cnl_get_dpll(struct intel_crtc
*crtc
, struct intel_crtc_state
*crtc_state
,
2318 struct intel_encoder
*encoder
)
2320 struct intel_shared_dpll
*pll
;
2321 int clock
= crtc_state
->port_clock
;
2323 struct intel_dpll_hw_state dpll_hw_state
;
2325 memset(&dpll_hw_state
, 0, sizeof(dpll_hw_state
));
2327 if (intel_crtc_has_type(crtc_state
, INTEL_OUTPUT_HDMI
)) {
2328 bret
= cnl_ddi_hdmi_pll_dividers(crtc
, crtc_state
, clock
);
2330 DRM_DEBUG_KMS("Could not get HDMI pll dividers.\n");
2333 } else if (intel_crtc_has_dp_encoder(crtc_state
)) {
2334 bret
= cnl_ddi_dp_set_dpll_hw_state(clock
, &dpll_hw_state
);
2336 DRM_DEBUG_KMS("Could not set DP dpll HW state.\n");
2339 crtc_state
->dpll_hw_state
= dpll_hw_state
;
2341 DRM_DEBUG_KMS("Skip DPLL setup for output_types 0x%x\n",
2342 crtc_state
->output_types
);
2346 pll
= intel_find_shared_dpll(crtc
, crtc_state
,
2350 DRM_DEBUG_KMS("No PLL selected\n");
2354 intel_reference_shared_dpll(pll
, crtc_state
);
2359 static void cnl_dump_hw_state(struct drm_i915_private
*dev_priv
,
2360 struct intel_dpll_hw_state
*hw_state
)
2362 DRM_DEBUG_KMS("dpll_hw_state: "
2363 "cfgcr0: 0x%x, cfgcr1: 0x%x\n",
2368 static const struct intel_shared_dpll_funcs cnl_ddi_pll_funcs
= {
2369 .enable
= cnl_ddi_pll_enable
,
2370 .disable
= cnl_ddi_pll_disable
,
2371 .get_hw_state
= cnl_ddi_pll_get_hw_state
,
2374 static const struct dpll_info cnl_plls
[] = {
2375 { "DPLL 0", DPLL_ID_SKL_DPLL0
, &cnl_ddi_pll_funcs
, 0 },
2376 { "DPLL 1", DPLL_ID_SKL_DPLL1
, &cnl_ddi_pll_funcs
, 0 },
2377 { "DPLL 2", DPLL_ID_SKL_DPLL2
, &cnl_ddi_pll_funcs
, 0 },
2378 { NULL
, -1, NULL
, },
2381 static const struct intel_dpll_mgr cnl_pll_mgr
= {
2382 .dpll_info
= cnl_plls
,
2383 .get_dpll
= cnl_get_dpll
,
2384 .dump_hw_state
= cnl_dump_hw_state
,
2388 * intel_shared_dpll_init - Initialize shared DPLLs
2391 * Initialize shared DPLLs for @dev.
2393 void intel_shared_dpll_init(struct drm_device
*dev
)
2395 struct drm_i915_private
*dev_priv
= to_i915(dev
);
2396 const struct intel_dpll_mgr
*dpll_mgr
= NULL
;
2397 const struct dpll_info
*dpll_info
;
2400 if (IS_CANNONLAKE(dev_priv
))
2401 dpll_mgr
= &cnl_pll_mgr
;
2402 else if (IS_GEN9_BC(dev_priv
))
2403 dpll_mgr
= &skl_pll_mgr
;
2404 else if (IS_GEN9_LP(dev_priv
))
2405 dpll_mgr
= &bxt_pll_mgr
;
2406 else if (HAS_DDI(dev_priv
))
2407 dpll_mgr
= &hsw_pll_mgr
;
2408 else if (HAS_PCH_IBX(dev_priv
) || HAS_PCH_CPT(dev_priv
))
2409 dpll_mgr
= &pch_pll_mgr
;
2412 dev_priv
->num_shared_dpll
= 0;
2416 dpll_info
= dpll_mgr
->dpll_info
;
2418 for (i
= 0; dpll_info
[i
].id
>= 0; i
++) {
2419 WARN_ON(i
!= dpll_info
[i
].id
);
2421 dev_priv
->shared_dplls
[i
].id
= dpll_info
[i
].id
;
2422 dev_priv
->shared_dplls
[i
].name
= dpll_info
[i
].name
;
2423 dev_priv
->shared_dplls
[i
].funcs
= *dpll_info
[i
].funcs
;
2424 dev_priv
->shared_dplls
[i
].flags
= dpll_info
[i
].flags
;
2427 dev_priv
->dpll_mgr
= dpll_mgr
;
2428 dev_priv
->num_shared_dpll
= i
;
2429 mutex_init(&dev_priv
->dpll_lock
);
2431 BUG_ON(dev_priv
->num_shared_dpll
> I915_NUM_PLLS
);
2433 /* FIXME: Move this to a more suitable place */
2434 if (HAS_DDI(dev_priv
))
2435 intel_ddi_pll_init(dev
);
2439 * intel_get_shared_dpll - get a shared DPLL for CRTC and encoder combination
2441 * @crtc_state: atomic state for @crtc
2444 * Find an appropriate DPLL for the given CRTC and encoder combination. A
2445 * reference from the @crtc to the returned pll is registered in the atomic
2446 * state. That configuration is made effective by calling
2447 * intel_shared_dpll_swap_state(). The reference should be released by calling
2448 * intel_release_shared_dpll().
2451 * A shared DPLL to be used by @crtc and @encoder with the given @crtc_state.
2453 struct intel_shared_dpll
*
2454 intel_get_shared_dpll(struct intel_crtc
*crtc
,
2455 struct intel_crtc_state
*crtc_state
,
2456 struct intel_encoder
*encoder
)
2458 struct drm_i915_private
*dev_priv
= to_i915(crtc
->base
.dev
);
2459 const struct intel_dpll_mgr
*dpll_mgr
= dev_priv
->dpll_mgr
;
2461 if (WARN_ON(!dpll_mgr
))
2464 return dpll_mgr
->get_dpll(crtc
, crtc_state
, encoder
);
2468 * intel_release_shared_dpll - end use of DPLL by CRTC in atomic state
2469 * @dpll: dpll in use by @crtc
2471 * @state: atomic state
2473 * This function releases the reference from @crtc to @dpll from the
2474 * atomic @state. The new configuration is made effective by calling
2475 * intel_shared_dpll_swap_state().
2477 void intel_release_shared_dpll(struct intel_shared_dpll
*dpll
,
2478 struct intel_crtc
*crtc
,
2479 struct drm_atomic_state
*state
)
2481 struct intel_shared_dpll_state
*shared_dpll_state
;
2483 shared_dpll_state
= intel_atomic_get_shared_dpll_state(state
);
2484 shared_dpll_state
[dpll
->id
].crtc_mask
&= ~(1 << crtc
->pipe
);
2488 * intel_shared_dpll_dump_hw_state - write hw_state to dmesg
2489 * @dev_priv: i915 drm device
2490 * @hw_state: hw state to be written to the log
2492 * Write the relevant values in @hw_state to dmesg using DRM_DEBUG_KMS.
2494 void intel_dpll_dump_hw_state(struct drm_i915_private
*dev_priv
,
2495 struct intel_dpll_hw_state
*hw_state
)
2497 if (dev_priv
->dpll_mgr
) {
2498 dev_priv
->dpll_mgr
->dump_hw_state(dev_priv
, hw_state
);
2500 /* fallback for platforms that don't use the shared dpll
2503 DRM_DEBUG_KMS("dpll_hw_state: dpll: 0x%x, dpll_md: 0x%x, "
2504 "fp0: 0x%x, fp1: 0x%x\n",