1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24#include "intel_drv.h"
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45static void
46intel_atomic_duplicate_dpll_state(struct drm_i915_private *dev_priv,
47 struct intel_shared_dpll_state *shared_dpll)
48{
49 enum intel_dpll_id i;
50
51
52 for (i = 0; i < dev_priv->num_shared_dpll; i++) {
53 struct intel_shared_dpll *pll = &dev_priv->shared_dplls[i];
54
55 shared_dpll[i] = pll->state;
56 }
57}
58
59static struct intel_shared_dpll_state *
60intel_atomic_get_shared_dpll_state(struct drm_atomic_state *s)
61{
62 struct intel_atomic_state *state = to_intel_atomic_state(s);
63
64 WARN_ON(!drm_modeset_is_locked(&s->dev->mode_config.connection_mutex));
65
66 if (!state->dpll_set) {
67 state->dpll_set = true;
68
69 intel_atomic_duplicate_dpll_state(to_i915(s->dev),
70 state->shared_dpll);
71 }
72
73 return state->shared_dpll;
74}
75
76
77
78
79
80
81
82
83
84struct intel_shared_dpll *
85intel_get_shared_dpll_by_id(struct drm_i915_private *dev_priv,
86 enum intel_dpll_id id)
87{
88 return &dev_priv->shared_dplls[id];
89}
90
91
92
93
94
95
96
97
98
99enum intel_dpll_id
100intel_get_shared_dpll_id(struct drm_i915_private *dev_priv,
101 struct intel_shared_dpll *pll)
102{
103 if (WARN_ON(pll < dev_priv->shared_dplls||
104 pll > &dev_priv->shared_dplls[dev_priv->num_shared_dpll]))
105 return -1;
106
107 return (enum intel_dpll_id) (pll - dev_priv->shared_dplls);
108}
109
110
111void assert_shared_dpll(struct drm_i915_private *dev_priv,
112 struct intel_shared_dpll *pll,
113 bool state)
114{
115 bool cur_state;
116 struct intel_dpll_hw_state hw_state;
117
118 if (WARN(!pll, "asserting DPLL %s with no DPLL\n", onoff(state)))
119 return;
120
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));
125}
126
127
128
129
130
131
132
133
134void intel_prepare_shared_dpll(struct intel_crtc *crtc)
135{
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;
139
140 if (WARN_ON(pll == NULL))
141 return;
142
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);
147 WARN_ON(pll->on);
148 assert_shared_dpll_disabled(dev_priv, pll);
149
150 pll->funcs.prepare(dev_priv, pll);
151 }
152 mutex_unlock(&dev_priv->dpll_lock);
153}
154
155
156
157
158
159
160
161void intel_enable_shared_dpll(struct intel_crtc *crtc)
162{
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);
167 unsigned old_mask;
168
169 if (WARN_ON(pll == NULL))
170 return;
171
172 mutex_lock(&dev_priv->dpll_lock);
173 old_mask = pll->active_mask;
174
175 if (WARN_ON(!(pll->state.crtc_mask & crtc_mask)) ||
176 WARN_ON(pll->active_mask & crtc_mask))
177 goto out;
178
179 pll->active_mask |= crtc_mask;
180
181 DRM_DEBUG_KMS("enable %s (active %x, on? %d) for crtc %d\n",
182 pll->name, pll->active_mask, pll->on,
183 crtc->base.base.id);
184
185 if (old_mask) {
186 WARN_ON(!pll->on);
187 assert_shared_dpll_enabled(dev_priv, pll);
188 goto out;
189 }
190 WARN_ON(pll->on);
191
192 DRM_DEBUG_KMS("enabling %s\n", pll->name);
193 pll->funcs.enable(dev_priv, pll);
194 pll->on = true;
195
196out:
197 mutex_unlock(&dev_priv->dpll_lock);
198}
199
200
201
202
203
204
205
206void intel_disable_shared_dpll(struct intel_crtc *crtc)
207{
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);
211
212
213 if (INTEL_GEN(dev_priv) < 5)
214 return;
215
216 if (pll == NULL)
217 return;
218
219 mutex_lock(&dev_priv->dpll_lock);
220 if (WARN_ON(!(pll->active_mask & crtc_mask)))
221 goto out;
222
223 DRM_DEBUG_KMS("disable %s (active %x, on? %d) for crtc %d\n",
224 pll->name, pll->active_mask, pll->on,
225 crtc->base.base.id);
226
227 assert_shared_dpll_enabled(dev_priv, pll);
228 WARN_ON(!pll->on);
229
230 pll->active_mask &= ~crtc_mask;
231 if (pll->active_mask)
232 goto out;
233
234 DRM_DEBUG_KMS("disabling %s\n", pll->name);
235 pll->funcs.disable(dev_priv, pll);
236 pll->on = false;
237
238out:
239 mutex_unlock(&dev_priv->dpll_lock);
240}
241
242static struct intel_shared_dpll *
243intel_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)
247{
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;
252
253 shared_dpll = intel_atomic_get_shared_dpll_state(crtc_state->base.state);
254
255 for (i = range_min; i <= range_max; i++) {
256 pll = &dev_priv->shared_dplls[i];
257
258
259 if (shared_dpll[i].crtc_mask == 0)
260 continue;
261
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,
268 pll->active_mask);
269 return pll;
270 }
271 }
272
273
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);
279 return pll;
280 }
281 }
282
283 return NULL;
284}
285
286static void
287intel_reference_shared_dpll(struct intel_shared_dpll *pll,
288 struct intel_crtc_state *crtc_state)
289{
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;
293
294 shared_dpll = intel_atomic_get_shared_dpll_state(crtc_state->base.state);
295
296 if (shared_dpll[i].crtc_mask == 0)
297 shared_dpll[i].hw_state =
298 crtc_state->dpll_hw_state;
299
300 crtc_state->shared_dpll = pll;
301 DRM_DEBUG_DRIVER("using %s for pipe %c\n", pll->name,
302 pipe_name(crtc->pipe));
303
304 shared_dpll[pll->id].crtc_mask |= 1 << crtc->pipe;
305}
306
307
308
309
310
311
312
313
314
315
316
317
318void intel_shared_dpll_swap_state(struct drm_atomic_state *state)
319{
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;
324
325 if (!to_intel_atomic_state(state)->dpll_set)
326 return;
327
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;
331
332 pll = &dev_priv->shared_dplls[i];
333
334 tmp = pll->state;
335 pll->state = shared_dpll[i];
336 shared_dpll[i] = tmp;
337 }
338}
339
340static 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)
343{
344 uint32_t val;
345
346 if (!intel_display_power_get_if_enabled(dev_priv, POWER_DOMAIN_PLLS))
347 return false;
348
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));
353
354 intel_display_power_put(dev_priv, POWER_DOMAIN_PLLS);
355
356 return val & DPLL_VCO_ENABLE;
357}
358
359static void ibx_pch_dpll_prepare(struct drm_i915_private *dev_priv,
360 struct intel_shared_dpll *pll)
361{
362 I915_WRITE(PCH_FP0(pll->id), pll->state.hw_state.fp0);
363 I915_WRITE(PCH_FP1(pll->id), pll->state.hw_state.fp1);
364}
365
366static void ibx_assert_pch_refclk_enabled(struct drm_i915_private *dev_priv)
367{
368 u32 val;
369 bool enabled;
370
371 I915_STATE_WARN_ON(!(HAS_PCH_IBX(dev_priv) || HAS_PCH_CPT(dev_priv)));
372
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");
377}
378
379static void ibx_pch_dpll_enable(struct drm_i915_private *dev_priv,
380 struct intel_shared_dpll *pll)
381{
382
383 ibx_assert_pch_refclk_enabled(dev_priv);
384
385 I915_WRITE(PCH_DPLL(pll->id), pll->state.hw_state.dpll);
386
387
388 POSTING_READ(PCH_DPLL(pll->id));
389 udelay(150);
390
391
392
393
394
395
396 I915_WRITE(PCH_DPLL(pll->id), pll->state.hw_state.dpll);
397 POSTING_READ(PCH_DPLL(pll->id));
398 udelay(200);
399}
400
401static void ibx_pch_dpll_disable(struct drm_i915_private *dev_priv,
402 struct intel_shared_dpll *pll)
403{
404 struct drm_device *dev = &dev_priv->drm;
405 struct intel_crtc *crtc;
406
407
408 for_each_intel_crtc(dev, crtc) {
409 if (crtc->config->shared_dpll == pll)
410 assert_pch_transcoder_disabled(dev_priv, crtc->pipe);
411 }
412
413 I915_WRITE(PCH_DPLL(pll->id), 0);
414 POSTING_READ(PCH_DPLL(pll->id));
415 udelay(200);
416}
417
418static struct intel_shared_dpll *
419ibx_get_dpll(struct intel_crtc *crtc, struct intel_crtc_state *crtc_state,
420 struct intel_encoder *encoder)
421{
422 struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
423 struct intel_shared_dpll *pll;
424 enum intel_dpll_id i;
425
426 if (HAS_PCH_IBX(dev_priv)) {
427
428 i = (enum intel_dpll_id) crtc->pipe;
429 pll = &dev_priv->shared_dplls[i];
430
431 DRM_DEBUG_KMS("[CRTC:%d:%s] using pre-allocated %s\n",
432 crtc->base.base.id, crtc->base.name, pll->name);
433 } else {
434 pll = intel_find_shared_dpll(crtc, crtc_state,
435 DPLL_ID_PCH_PLL_A,
436 DPLL_ID_PCH_PLL_B);
437 }
438
439 if (!pll)
440 return NULL;
441
442
443 intel_reference_shared_dpll(pll, crtc_state);
444
445 return pll;
446}
447
448static void ibx_dump_hw_state(struct drm_i915_private *dev_priv,
449 struct intel_dpll_hw_state *hw_state)
450{
451 DRM_DEBUG_KMS("dpll_hw_state: dpll: 0x%x, dpll_md: 0x%x, "
452 "fp0: 0x%x, fp1: 0x%x\n",
453 hw_state->dpll,
454 hw_state->dpll_md,
455 hw_state->fp0,
456 hw_state->fp1);
457}
458
459static 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,
464};
465
466static void hsw_ddi_wrpll_enable(struct drm_i915_private *dev_priv,
467 struct intel_shared_dpll *pll)
468{
469 I915_WRITE(WRPLL_CTL(pll->id), pll->state.hw_state.wrpll);
470 POSTING_READ(WRPLL_CTL(pll->id));
471 udelay(20);
472}
473
474static void hsw_ddi_spll_enable(struct drm_i915_private *dev_priv,
475 struct intel_shared_dpll *pll)
476{
477 I915_WRITE(SPLL_CTL, pll->state.hw_state.spll);
478 POSTING_READ(SPLL_CTL);
479 udelay(20);
480}
481
482static void hsw_ddi_wrpll_disable(struct drm_i915_private *dev_priv,
483 struct intel_shared_dpll *pll)
484{
485 uint32_t val;
486
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));
490}
491
492static void hsw_ddi_spll_disable(struct drm_i915_private *dev_priv,
493 struct intel_shared_dpll *pll)
494{
495 uint32_t val;
496
497 val = I915_READ(SPLL_CTL);
498 I915_WRITE(SPLL_CTL, val & ~SPLL_PLL_ENABLE);
499 POSTING_READ(SPLL_CTL);
500}
501
502static 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)
505{
506 uint32_t val;
507
508 if (!intel_display_power_get_if_enabled(dev_priv, POWER_DOMAIN_PLLS))
509 return false;
510
511 val = I915_READ(WRPLL_CTL(pll->id));
512 hw_state->wrpll = val;
513
514 intel_display_power_put(dev_priv, POWER_DOMAIN_PLLS);
515
516 return val & WRPLL_PLL_ENABLE;
517}
518
519static 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)
522{
523 uint32_t val;
524
525 if (!intel_display_power_get_if_enabled(dev_priv, POWER_DOMAIN_PLLS))
526 return false;
527
528 val = I915_READ(SPLL_CTL);
529 hw_state->spll = val;
530
531 intel_display_power_put(dev_priv, POWER_DOMAIN_PLLS);
532
533 return val & SPLL_PLL_ENABLE;
534}
535
536#define LC_FREQ 2700
537#define LC_FREQ_2K U64_C(LC_FREQ * 2000)
538
539#define P_MIN 2
540#define P_MAX 64
541#define P_INC 2
542
543
544#define REF_MIN 48
545#define REF_MAX 400
546#define VCO_MIN 2400
547#define VCO_MAX 4800
548
549struct hsw_wrpll_rnp {
550 unsigned p, n2, r2;
551};
552
553static unsigned hsw_wrpll_get_budget_for_freq(int clock)
554{
555 unsigned budget;
556
557 switch (clock) {
558 case 25175000:
559 case 25200000:
560 case 27000000:
561 case 27027000:
562 case 37762500:
563 case 37800000:
564 case 40500000:
565 case 40541000:
566 case 54000000:
567 case 54054000:
568 case 59341000:
569 case 59400000:
570 case 72000000:
571 case 74176000:
572 case 74250000:
573 case 81000000:
574 case 81081000:
575 case 89012000:
576 case 89100000:
577 case 108000000:
578 case 108108000:
579 case 111264000:
580 case 111375000:
581 case 148352000:
582 case 148500000:
583 case 162000000:
584 case 162162000:
585 case 222525000:
586 case 222750000:
587 case 296703000:
588 case 297000000:
589 budget = 0;
590 break;
591 case 233500000:
592 case 245250000:
593 case 247750000:
594 case 253250000:
595 case 298000000:
596 budget = 1500;
597 break;
598 case 169128000:
599 case 169500000:
600 case 179500000:
601 case 202000000:
602 budget = 2000;
603 break;
604 case 256250000:
605 case 262500000:
606 case 270000000:
607 case 272500000:
608 case 273750000:
609 case 280750000:
610 case 281250000:
611 case 286000000:
612 case 291750000:
613 budget = 4000;
614 break;
615 case 267250000:
616 case 268500000:
617 budget = 5000;
618 break;
619 default:
620 budget = 1000;
621 break;
622 }
623
624 return budget;
625}
626
627static void hsw_wrpll_update_rnp(uint64_t freq2k, unsigned budget,
628 unsigned r2, unsigned n2, unsigned p,
629 struct hsw_wrpll_rnp *best)
630{
631 uint64_t a, b, c, d, diff, diff_best;
632
633
634 if (best->p == 0) {
635 best->p = p;
636 best->n2 = n2;
637 best->r2 = r2;
638 return;
639 }
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
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);
660 c = 1000000 * diff;
661 d = 1000000 * diff_best;
662
663 if (a < c && b < d) {
664
665 if (best->p * best->r2 * diff < p * r2 * diff_best) {
666 best->p = p;
667 best->n2 = n2;
668 best->r2 = r2;
669 }
670 } else if (a >= c && b < d) {
671
672 best->p = p;
673 best->n2 = n2;
674 best->r2 = r2;
675 } else if (a >= c && b >= d) {
676
677 if (n2 * best->r2 * best->r2 > best->n2 * r2 * r2) {
678 best->p = p;
679 best->n2 = n2;
680 best->r2 = r2;
681 }
682 }
683
684}
685
686static void
687hsw_ddi_calculate_wrpll(int clock ,
688 unsigned *r2_out, unsigned *n2_out, unsigned *p_out)
689{
690 uint64_t freq2k;
691 unsigned p, n2, r2;
692 struct hsw_wrpll_rnp best = { 0, 0, 0 };
693 unsigned budget;
694
695 freq2k = clock / 100;
696
697 budget = hsw_wrpll_get_budget_for_freq(clock);
698
699
700
701 if (freq2k == 5400000) {
702 *n2_out = 2;
703 *p_out = 1;
704 *r2_out = 2;
705 return;
706 }
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721 for (r2 = LC_FREQ * 2 / REF_MAX + 1;
722 r2 <= LC_FREQ * 2 / REF_MIN;
723 r2++) {
724
725
726
727
728
729
730
731
732
733
734
735
736 for (n2 = VCO_MIN * r2 / LC_FREQ + 1;
737 n2 <= VCO_MAX * r2 / LC_FREQ;
738 n2++) {
739
740 for (p = P_MIN; p <= P_MAX; p += P_INC)
741 hsw_wrpll_update_rnp(freq2k, budget,
742 r2, n2, p, &best);
743 }
744 }
745
746 *n2_out = best.n2;
747 *p_out = best.p;
748 *r2_out = best.r2;
749}
750
751static struct intel_shared_dpll *hsw_ddi_hdmi_get_dpll(int clock,
752 struct intel_crtc *crtc,
753 struct intel_crtc_state *crtc_state)
754{
755 struct intel_shared_dpll *pll;
756 uint32_t val;
757 unsigned int p, n2, r2;
758
759 hsw_ddi_calculate_wrpll(clock * 1000, &r2, &n2, &p);
760
761 val = WRPLL_PLL_ENABLE | WRPLL_PLL_LCPLL |
762 WRPLL_DIVIDER_REFERENCE(r2) | WRPLL_DIVIDER_FEEDBACK(n2) |
763 WRPLL_DIVIDER_POST(p);
764
765 crtc_state->dpll_hw_state.wrpll = val;
766
767 pll = intel_find_shared_dpll(crtc, crtc_state,
768 DPLL_ID_WRPLL1, DPLL_ID_WRPLL2);
769
770 if (!pll)
771 return NULL;
772
773 return pll;
774}
775
776static struct intel_shared_dpll *
777hsw_ddi_dp_get_dpll(struct intel_encoder *encoder, int clock)
778{
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;
782
783 switch (clock / 2) {
784 case 81000:
785 pll_id = DPLL_ID_LCPLL_810;
786 break;
787 case 135000:
788 pll_id = DPLL_ID_LCPLL_1350;
789 break;
790 case 270000:
791 pll_id = DPLL_ID_LCPLL_2700;
792 break;
793 default:
794 DRM_DEBUG_KMS("Invalid clock for DP: %d\n", clock);
795 return NULL;
796 }
797
798 pll = intel_get_shared_dpll_by_id(dev_priv, pll_id);
799
800 if (!pll)
801 return NULL;
802
803 return pll;
804}
805
806static struct intel_shared_dpll *
807hsw_get_dpll(struct intel_crtc *crtc, struct intel_crtc_state *crtc_state,
808 struct intel_encoder *encoder)
809{
810 struct intel_shared_dpll *pll;
811 int clock = crtc_state->port_clock;
812
813 memset(&crtc_state->dpll_hw_state, 0,
814 sizeof(crtc_state->dpll_hw_state));
815
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))
822 return NULL;
823
824 crtc_state->dpll_hw_state.spll =
825 SPLL_PLL_ENABLE | SPLL_PLL_FREQ_1350MHz | SPLL_PLL_SSC;
826
827 pll = intel_find_shared_dpll(crtc, crtc_state,
828 DPLL_ID_SPLL, DPLL_ID_SPLL);
829 } else {
830 return NULL;
831 }
832
833 if (!pll)
834 return NULL;
835
836 intel_reference_shared_dpll(pll, crtc_state);
837
838 return pll;
839}
840
841static void hsw_dump_hw_state(struct drm_i915_private *dev_priv,
842 struct intel_dpll_hw_state *hw_state)
843{
844 DRM_DEBUG_KMS("dpll_hw_state: wrpll: 0x%x spll: 0x%x\n",
845 hw_state->wrpll, hw_state->spll);
846}
847
848static 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,
852};
853
854static 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,
858};
859
860static void hsw_ddi_lcpll_enable(struct drm_i915_private *dev_priv,
861 struct intel_shared_dpll *pll)
862{
863}
864
865static void hsw_ddi_lcpll_disable(struct drm_i915_private *dev_priv,
866 struct intel_shared_dpll *pll)
867{
868}
869
870static 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)
873{
874 return true;
875}
876
877static 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,
881};
882
883struct skl_dpll_regs {
884 i915_reg_t ctl, cfgcr1, cfgcr2;
885};
886
887
888static const struct skl_dpll_regs skl_dpll_regs[4] = {
889 {
890
891 .ctl = LCPLL1_CTL,
892
893 },
894 {
895
896 .ctl = LCPLL2_CTL,
897 .cfgcr1 = DPLL_CFGCR1(SKL_DPLL1),
898 .cfgcr2 = DPLL_CFGCR2(SKL_DPLL1),
899 },
900 {
901
902 .ctl = WRPLL_CTL(0),
903 .cfgcr1 = DPLL_CFGCR1(SKL_DPLL2),
904 .cfgcr2 = DPLL_CFGCR2(SKL_DPLL2),
905 },
906 {
907
908 .ctl = WRPLL_CTL(1),
909 .cfgcr1 = DPLL_CFGCR1(SKL_DPLL3),
910 .cfgcr2 = DPLL_CFGCR2(SKL_DPLL3),
911 },
912};
913
914static void skl_ddi_pll_write_ctrl1(struct drm_i915_private *dev_priv,
915 struct intel_shared_dpll *pll)
916{
917 uint32_t val;
918
919 val = I915_READ(DPLL_CTRL1);
920
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);
924
925 I915_WRITE(DPLL_CTRL1, val);
926 POSTING_READ(DPLL_CTRL1);
927}
928
929static void skl_ddi_pll_enable(struct drm_i915_private *dev_priv,
930 struct intel_shared_dpll *pll)
931{
932 const struct skl_dpll_regs *regs = skl_dpll_regs;
933
934 skl_ddi_pll_write_ctrl1(dev_priv, pll);
935
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);
940
941
942 I915_WRITE(regs[pll->id].ctl,
943 I915_READ(regs[pll->id].ctl) | LCPLL_PLL_ENABLE);
944
945 if (intel_wait_for_register(dev_priv,
946 DPLL_STATUS,
947 DPLL_LOCK(pll->id),
948 DPLL_LOCK(pll->id),
949 5))
950 DRM_ERROR("DPLL %d not locked\n", pll->id);
951}
952
953static void skl_ddi_dpll0_enable(struct drm_i915_private *dev_priv,
954 struct intel_shared_dpll *pll)
955{
956 skl_ddi_pll_write_ctrl1(dev_priv, pll);
957}
958
959static void skl_ddi_pll_disable(struct drm_i915_private *dev_priv,
960 struct intel_shared_dpll *pll)
961{
962 const struct skl_dpll_regs *regs = skl_dpll_regs;
963
964
965 I915_WRITE(regs[pll->id].ctl,
966 I915_READ(regs[pll->id].ctl) & ~LCPLL_PLL_ENABLE);
967 POSTING_READ(regs[pll->id].ctl);
968}
969
970static void skl_ddi_dpll0_disable(struct drm_i915_private *dev_priv,
971 struct intel_shared_dpll *pll)
972{
973}
974
975static 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)
978{
979 uint32_t val;
980 const struct skl_dpll_regs *regs = skl_dpll_regs;
981 bool ret;
982
983 if (!intel_display_power_get_if_enabled(dev_priv, POWER_DOMAIN_PLLS))
984 return false;
985
986 ret = false;
987
988 val = I915_READ(regs[pll->id].ctl);
989 if (!(val & LCPLL_PLL_ENABLE))
990 goto out;
991
992 val = I915_READ(DPLL_CTRL1);
993 hw_state->ctrl1 = (val >> (pll->id * 6)) & 0x3f;
994
995
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);
999 }
1000 ret = true;
1001
1002out:
1003 intel_display_power_put(dev_priv, POWER_DOMAIN_PLLS);
1004
1005 return ret;
1006}
1007
1008static 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)
1011{
1012 uint32_t val;
1013 const struct skl_dpll_regs *regs = skl_dpll_regs;
1014 bool ret;
1015
1016 if (!intel_display_power_get_if_enabled(dev_priv, POWER_DOMAIN_PLLS))
1017 return false;
1018
1019 ret = false;
1020
1021
1022 val = I915_READ(regs[pll->id].ctl);
1023 if (WARN_ON(!(val & LCPLL_PLL_ENABLE)))
1024 goto out;
1025
1026 val = I915_READ(DPLL_CTRL1);
1027 hw_state->ctrl1 = (val >> (pll->id * 6)) & 0x3f;
1028
1029 ret = true;
1030
1031out:
1032 intel_display_power_put(dev_priv, POWER_DOMAIN_PLLS);
1033
1034 return ret;
1035}
1036
1037struct skl_wrpll_context {
1038 uint64_t min_deviation;
1039 uint64_t central_freq;
1040 uint64_t dco_freq;
1041 unsigned int p;
1042};
1043
1044static void skl_wrpll_context_init(struct skl_wrpll_context *ctx)
1045{
1046 memset(ctx, 0, sizeof(*ctx));
1047
1048 ctx->min_deviation = U64_MAX;
1049}
1050
1051
1052#define SKL_DCO_MAX_PDEVIATION 100
1053#define SKL_DCO_MAX_NDEVIATION 600
1054
1055static void skl_wrpll_try_divider(struct skl_wrpll_context *ctx,
1056 uint64_t central_freq,
1057 uint64_t dco_freq,
1058 unsigned int divider)
1059{
1060 uint64_t deviation;
1061
1062 deviation = div64_u64(10000 * abs_diff(dco_freq, central_freq),
1063 central_freq);
1064
1065
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;
1072 ctx->p = divider;
1073 }
1074
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;
1080 ctx->p = divider;
1081 }
1082}
1083
1084static void skl_wrpll_get_multipliers(unsigned int p,
1085 unsigned int *p0 ,
1086 unsigned int *p1 ,
1087 unsigned int *p2 )
1088{
1089
1090 if (p % 2 == 0) {
1091 unsigned int half = p / 2;
1092
1093 if (half == 1 || half == 2 || half == 3 || half == 5) {
1094 *p0 = 2;
1095 *p1 = 1;
1096 *p2 = half;
1097 } else if (half % 2 == 0) {
1098 *p0 = 2;
1099 *p1 = half / 2;
1100 *p2 = 2;
1101 } else if (half % 3 == 0) {
1102 *p0 = 3;
1103 *p1 = half / 3;
1104 *p2 = 2;
1105 } else if (half % 7 == 0) {
1106 *p0 = 7;
1107 *p1 = half / 7;
1108 *p2 = 2;
1109 }
1110 } else if (p == 3 || p == 9) {
1111 *p0 = 3;
1112 *p1 = 1;
1113 *p2 = p / 3;
1114 } else if (p == 5 || p == 7) {
1115 *p0 = p;
1116 *p1 = 1;
1117 *p2 = 1;
1118 } else if (p == 15) {
1119 *p0 = 3;
1120 *p1 = 1;
1121 *p2 = 5;
1122 } else if (p == 21) {
1123 *p0 = 7;
1124 *p1 = 1;
1125 *p2 = 3;
1126 } else if (p == 35) {
1127 *p0 = 7;
1128 *p1 = 1;
1129 *p2 = 5;
1130 }
1131}
1132
1133struct skl_wrpll_params {
1134 uint32_t dco_fraction;
1135 uint32_t dco_integer;
1136 uint32_t qdiv_ratio;
1137 uint32_t qdiv_mode;
1138 uint32_t kdiv;
1139 uint32_t pdiv;
1140 uint32_t central_freq;
1141};
1142
1143static void skl_wrpll_params_populate(struct skl_wrpll_params *params,
1144 uint64_t afe_clock,
1145 uint64_t central_freq,
1146 uint32_t p0, uint32_t p1, uint32_t p2)
1147{
1148 uint64_t dco_freq;
1149
1150 switch (central_freq) {
1151 case 9600000000ULL:
1152 params->central_freq = 0;
1153 break;
1154 case 9000000000ULL:
1155 params->central_freq = 1;
1156 break;
1157 case 8400000000ULL:
1158 params->central_freq = 3;
1159 }
1160
1161 switch (p0) {
1162 case 1:
1163 params->pdiv = 0;
1164 break;
1165 case 2:
1166 params->pdiv = 1;
1167 break;
1168 case 3:
1169 params->pdiv = 2;
1170 break;
1171 case 7:
1172 params->pdiv = 4;
1173 break;
1174 default:
1175 WARN(1, "Incorrect PDiv\n");
1176 }
1177
1178 switch (p2) {
1179 case 5:
1180 params->kdiv = 0;
1181 break;
1182 case 2:
1183 params->kdiv = 1;
1184 break;
1185 case 3:
1186 params->kdiv = 2;
1187 break;
1188 case 1:
1189 params->kdiv = 3;
1190 break;
1191 default:
1192 WARN(1, "Incorrect KDiv\n");
1193 }
1194
1195 params->qdiv_ratio = p1;
1196 params->qdiv_mode = (params->qdiv_ratio == 1) ? 0 : 1;
1197
1198 dco_freq = p0 * p1 * p2 * afe_clock;
1199
1200
1201
1202
1203
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));
1208}
1209
1210static bool
1211skl_ddi_calculate_wrpll(int clock ,
1212 struct skl_wrpll_params *wrpll_params)
1213{
1214 uint64_t afe_clock = clock * 5;
1215 uint64_t dco_central_freq[3] = {8400000000ULL,
1216 9000000000ULL,
1217 9600000000ULL};
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,
1222 92, 96, 98 };
1223 static const int odd_dividers[] = { 3, 5, 7, 9, 15, 21, 35 };
1224 static const struct {
1225 const int *list;
1226 int n_dividers;
1227 } dividers[] = {
1228 { even_dividers, ARRAY_SIZE(even_dividers) },
1229 { odd_dividers, ARRAY_SIZE(odd_dividers) },
1230 };
1231 struct skl_wrpll_context ctx;
1232 unsigned int dco, d, i;
1233 unsigned int p0, p1, p2;
1234
1235 skl_wrpll_context_init(&ctx);
1236
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;
1242
1243 skl_wrpll_try_divider(&ctx,
1244 dco_central_freq[dco],
1245 dco_freq,
1246 p);
1247
1248
1249
1250
1251
1252 if (ctx.min_deviation == 0)
1253 goto skip_remaining_dividers;
1254 }
1255 }
1256
1257skip_remaining_dividers:
1258
1259
1260
1261
1262 if (d == 0 && ctx.p)
1263 break;
1264 }
1265
1266 if (!ctx.p) {
1267 DRM_DEBUG_DRIVER("No valid divider found for %dHz\n", clock);
1268 return false;
1269 }
1270
1271
1272
1273
1274
1275 p0 = p1 = p2 = 0;
1276 skl_wrpll_get_multipliers(ctx.p, &p0, &p1, &p2);
1277 skl_wrpll_params_populate(wrpll_params, afe_clock, ctx.central_freq,
1278 p0, p1, p2);
1279
1280 return true;
1281}
1282
1283static bool skl_ddi_hdmi_pll_dividers(struct intel_crtc *crtc,
1284 struct intel_crtc_state *crtc_state,
1285 int clock)
1286{
1287 uint32_t ctrl1, cfgcr1, cfgcr2;
1288 struct skl_wrpll_params wrpll_params = { 0, };
1289
1290
1291
1292
1293
1294 ctrl1 = DPLL_CTRL1_OVERRIDE(0);
1295
1296 ctrl1 |= DPLL_CTRL1_HDMI_MODE(0);
1297
1298 if (!skl_ddi_calculate_wrpll(clock * 1000, &wrpll_params))
1299 return false;
1300
1301 cfgcr1 = DPLL_CFGCR1_FREQ_ENABLE |
1302 DPLL_CFGCR1_DCO_FRACTION(wrpll_params.dco_fraction) |
1303 wrpll_params.dco_integer;
1304
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;
1310
1311 memset(&crtc_state->dpll_hw_state, 0,
1312 sizeof(crtc_state->dpll_hw_state));
1313
1314 crtc_state->dpll_hw_state.ctrl1 = ctrl1;
1315 crtc_state->dpll_hw_state.cfgcr1 = cfgcr1;
1316 crtc_state->dpll_hw_state.cfgcr2 = cfgcr2;
1317 return true;
1318}
1319
1320static bool
1321skl_ddi_dp_set_dpll_hw_state(int clock,
1322 struct intel_dpll_hw_state *dpll_hw_state)
1323{
1324 uint32_t ctrl1;
1325
1326
1327
1328
1329
1330 ctrl1 = DPLL_CTRL1_OVERRIDE(0);
1331 switch (clock / 2) {
1332 case 81000:
1333 ctrl1 |= DPLL_CTRL1_LINK_RATE(DPLL_CTRL1_LINK_RATE_810, 0);
1334 break;
1335 case 135000:
1336 ctrl1 |= DPLL_CTRL1_LINK_RATE(DPLL_CTRL1_LINK_RATE_1350, 0);
1337 break;
1338 case 270000:
1339 ctrl1 |= DPLL_CTRL1_LINK_RATE(DPLL_CTRL1_LINK_RATE_2700, 0);
1340 break;
1341
1342 case 162000:
1343 ctrl1 |= DPLL_CTRL1_LINK_RATE(DPLL_CTRL1_LINK_RATE_1620, 0);
1344 break;
1345 case 108000:
1346 ctrl1 |= DPLL_CTRL1_LINK_RATE(DPLL_CTRL1_LINK_RATE_1080, 0);
1347 break;
1348 case 216000:
1349 ctrl1 |= DPLL_CTRL1_LINK_RATE(DPLL_CTRL1_LINK_RATE_2160, 0);
1350 break;
1351 }
1352
1353 dpll_hw_state->ctrl1 = ctrl1;
1354 return true;
1355}
1356
1357static struct intel_shared_dpll *
1358skl_get_dpll(struct intel_crtc *crtc, struct intel_crtc_state *crtc_state,
1359 struct intel_encoder *encoder)
1360{
1361 struct intel_shared_dpll *pll;
1362 int clock = crtc_state->port_clock;
1363 bool bret;
1364 struct intel_dpll_hw_state dpll_hw_state;
1365
1366 memset(&dpll_hw_state, 0, sizeof(dpll_hw_state));
1367
1368 if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_HDMI)) {
1369 bret = skl_ddi_hdmi_pll_dividers(crtc, crtc_state, clock);
1370 if (!bret) {
1371 DRM_DEBUG_KMS("Could not get HDMI pll dividers.\n");
1372 return NULL;
1373 }
1374 } else if (intel_crtc_has_dp_encoder(crtc_state)) {
1375 bret = skl_ddi_dp_set_dpll_hw_state(clock, &dpll_hw_state);
1376 if (!bret) {
1377 DRM_DEBUG_KMS("Could not set DP dpll HW state.\n");
1378 return NULL;
1379 }
1380 crtc_state->dpll_hw_state = dpll_hw_state;
1381 } else {
1382 return NULL;
1383 }
1384
1385 if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_EDP))
1386 pll = intel_find_shared_dpll(crtc, crtc_state,
1387 DPLL_ID_SKL_DPLL0,
1388 DPLL_ID_SKL_DPLL0);
1389 else
1390 pll = intel_find_shared_dpll(crtc, crtc_state,
1391 DPLL_ID_SKL_DPLL1,
1392 DPLL_ID_SKL_DPLL3);
1393 if (!pll)
1394 return NULL;
1395
1396 intel_reference_shared_dpll(pll, crtc_state);
1397
1398 return pll;
1399}
1400
1401static void skl_dump_hw_state(struct drm_i915_private *dev_priv,
1402 struct intel_dpll_hw_state *hw_state)
1403{
1404 DRM_DEBUG_KMS("dpll_hw_state: "
1405 "ctrl1: 0x%x, cfgcr1: 0x%x, cfgcr2: 0x%x\n",
1406 hw_state->ctrl1,
1407 hw_state->cfgcr1,
1408 hw_state->cfgcr2);
1409}
1410
1411static 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,
1415};
1416
1417static 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,
1421};
1422
1423static void bxt_ddi_pll_enable(struct drm_i915_private *dev_priv,
1424 struct intel_shared_dpll *pll)
1425{
1426 uint32_t temp;
1427 enum port port = (enum port)pll->id;
1428 enum dpio_phy phy;
1429 enum dpio_channel ch;
1430
1431 bxt_port_to_phy_channel(dev_priv, port, &phy, &ch);
1432
1433
1434 temp = I915_READ(BXT_PORT_PLL_ENABLE(port));
1435 temp |= PORT_PLL_REF_SEL;
1436 I915_WRITE(BXT_PORT_PLL_ENABLE(port), temp);
1437
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);
1442
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);
1446 }
1447
1448
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);
1452
1453
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);
1458
1459
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);
1464
1465
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);
1470
1471
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);
1476
1477
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);
1482
1483
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);
1490
1491
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);
1496
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);
1501
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);
1507
1508
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);
1515
1516
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));
1521
1522 if (wait_for_us((I915_READ(BXT_PORT_PLL_ENABLE(port)) & PORT_PLL_LOCK),
1523 200))
1524 DRM_ERROR("PLL %d not locked\n", port);
1525
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);
1530 }
1531
1532
1533
1534
1535
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);
1541}
1542
1543static void bxt_ddi_pll_disable(struct drm_i915_private *dev_priv,
1544 struct intel_shared_dpll *pll)
1545{
1546 enum port port = (enum port)pll->id;
1547 uint32_t temp;
1548
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));
1553
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);
1558
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);
1562 }
1563}
1564
1565static 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)
1568{
1569 enum port port = (enum port)pll->id;
1570 uint32_t val;
1571 bool ret;
1572 enum dpio_phy phy;
1573 enum dpio_channel ch;
1574
1575 bxt_port_to_phy_channel(dev_priv, port, &phy, &ch);
1576
1577 if (!intel_display_power_get_if_enabled(dev_priv, POWER_DOMAIN_PLLS))
1578 return false;
1579
1580 ret = false;
1581
1582 val = I915_READ(BXT_PORT_PLL_ENABLE(port));
1583 if (!(val & PORT_PLL_ENABLE))
1584 goto out;
1585
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;
1588
1589 hw_state->ebb4 = I915_READ(BXT_PORT_PLL_EBB_4(phy, ch));
1590 hw_state->ebb4 &= PORT_PLL_10BIT_CLK_ENABLE;
1591
1592 hw_state->pll0 = I915_READ(BXT_PORT_PLL(phy, ch, 0));
1593 hw_state->pll0 &= PORT_PLL_M2_MASK;
1594
1595 hw_state->pll1 = I915_READ(BXT_PORT_PLL(phy, ch, 1));
1596 hw_state->pll1 &= PORT_PLL_N_MASK;
1597
1598 hw_state->pll2 = I915_READ(BXT_PORT_PLL(phy, ch, 2));
1599 hw_state->pll2 &= PORT_PLL_M2_FRAC_MASK;
1600
1601 hw_state->pll3 = I915_READ(BXT_PORT_PLL(phy, ch, 3));
1602 hw_state->pll3 &= PORT_PLL_M2_FRAC_ENABLE;
1603
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;
1608
1609 hw_state->pll8 = I915_READ(BXT_PORT_PLL(phy, ch, 8));
1610 hw_state->pll8 &= PORT_PLL_TARGET_CNT_MASK;
1611
1612 hw_state->pll9 = I915_READ(BXT_PORT_PLL(phy, ch, 9));
1613 hw_state->pll9 &= PORT_PLL_LOCK_THRESHOLD_MASK;
1614
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;
1618
1619
1620
1621
1622
1623
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",
1627 hw_state->pcsdw12,
1628 I915_READ(BXT_PORT_PCS_DW12_LN23(phy, ch)));
1629 hw_state->pcsdw12 &= LANE_STAGGER_MASK | LANESTAGGER_STRAP_OVRD;
1630
1631 ret = true;
1632
1633out:
1634 intel_display_power_put(dev_priv, POWER_DOMAIN_PLLS);
1635
1636 return ret;
1637}
1638
1639
1640struct bxt_clk_div {
1641 int clock;
1642 uint32_t p1;
1643 uint32_t p2;
1644 uint32_t m2_int;
1645 uint32_t m2_frac;
1646 bool m2_frac_en;
1647 uint32_t n;
1648
1649 int vco;
1650};
1651
1652
1653static 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}
1661};
1662
1663static bool
1664bxt_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)
1667{
1668 struct dpll best_clock;
1669
1670
1671
1672
1673
1674
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));
1678 return false;
1679 }
1680
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;
1688
1689 clk_div->vco = best_clock.vco;
1690
1691 return true;
1692}
1693
1694static void bxt_ddi_dp_pll_dividers(int clock, struct bxt_clk_div *clk_div)
1695{
1696 int i;
1697
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];
1702 break;
1703 }
1704 }
1705
1706 clk_div->vco = clock * 10 / 2 * clk_div->p1 * clk_div->p2;
1707}
1708
1709static 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)
1712{
1713 int vco = clk_div->vco;
1714 uint32_t prop_coef, int_coef, gain_ctl, targ_cnt;
1715 uint32_t lanestagger;
1716
1717 if (vco >= 6200000 && vco <= 6700000) {
1718 prop_coef = 4;
1719 int_coef = 9;
1720 gain_ctl = 3;
1721 targ_cnt = 8;
1722 } else if ((vco > 5400000 && vco < 6200000) ||
1723 (vco >= 4800000 && vco < 5400000)) {
1724 prop_coef = 5;
1725 int_coef = 11;
1726 gain_ctl = 3;
1727 targ_cnt = 9;
1728 } else if (vco == 5400000) {
1729 prop_coef = 3;
1730 int_coef = 8;
1731 gain_ctl = 1;
1732 targ_cnt = 9;
1733 } else {
1734 DRM_ERROR("Invalid VCO\n");
1735 return false;
1736 }
1737
1738 if (clock > 270000)
1739 lanestagger = 0x18;
1740 else if (clock > 135000)
1741 lanestagger = 0x0d;
1742 else if (clock > 67000)
1743 lanestagger = 0x07;
1744 else if (clock > 33000)
1745 lanestagger = 0x04;
1746 else
1747 lanestagger = 0x02;
1748
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;
1753
1754 if (clk_div->m2_frac_en)
1755 dpll_hw_state->pll3 = PORT_PLL_M2_FRAC_ENABLE;
1756
1757 dpll_hw_state->pll6 = prop_coef | PORT_PLL_INT_COEFF(int_coef);
1758 dpll_hw_state->pll6 |= PORT_PLL_GAIN_CTL(gain_ctl);
1759
1760 dpll_hw_state->pll8 = targ_cnt;
1761
1762 dpll_hw_state->pll9 = 5 << PORT_PLL_LOCK_THRESHOLD_SHIFT;
1763
1764 dpll_hw_state->pll10 =
1765 PORT_PLL_DCO_AMP(PORT_PLL_DCO_AMP_DEFAULT)
1766 | PORT_PLL_DCO_AMP_OVR_EN_H;
1767
1768 dpll_hw_state->ebb4 = PORT_PLL_10BIT_CLK_ENABLE;
1769
1770 dpll_hw_state->pcsdw12 = LANESTAGGER_STRAP_OVRD | lanestagger;
1771
1772 return true;
1773}
1774
1775static bool
1776bxt_ddi_dp_set_dpll_hw_state(int clock,
1777 struct intel_dpll_hw_state *dpll_hw_state)
1778{
1779 struct bxt_clk_div clk_div = {0};
1780
1781 bxt_ddi_dp_pll_dividers(clock, &clk_div);
1782
1783 return bxt_ddi_set_dpll_hw_state(clock, &clk_div, dpll_hw_state);
1784}
1785
1786static bool
1787bxt_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)
1790{
1791 struct bxt_clk_div clk_div = { };
1792
1793 bxt_ddi_hdmi_pll_dividers(intel_crtc, crtc_state, clock, &clk_div);
1794
1795 return bxt_ddi_set_dpll_hw_state(clock, &clk_div, dpll_hw_state);
1796}
1797
1798static struct intel_shared_dpll *
1799bxt_get_dpll(struct intel_crtc *crtc,
1800 struct intel_crtc_state *crtc_state,
1801 struct intel_encoder *encoder)
1802{
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;
1807
1808 if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_HDMI) &&
1809 !bxt_ddi_hdmi_set_dpll_hw_state(crtc, crtc_state, clock,
1810 &dpll_hw_state))
1811 return NULL;
1812
1813 if (intel_crtc_has_dp_encoder(crtc_state) &&
1814 !bxt_ddi_dp_set_dpll_hw_state(clock, &dpll_hw_state))
1815 return NULL;
1816
1817 memset(&crtc_state->dpll_hw_state, 0,
1818 sizeof(crtc_state->dpll_hw_state));
1819
1820 crtc_state->dpll_hw_state = dpll_hw_state;
1821
1822
1823 i = (enum intel_dpll_id) encoder->port;
1824 pll = intel_get_shared_dpll_by_id(dev_priv, i);
1825
1826 DRM_DEBUG_KMS("[CRTC:%d:%s] using pre-allocated %s\n",
1827 crtc->base.base.id, crtc->base.name, pll->name);
1828
1829 intel_reference_shared_dpll(pll, crtc_state);
1830
1831 return pll;
1832}
1833
1834static void bxt_dump_hw_state(struct drm_i915_private *dev_priv,
1835 struct intel_dpll_hw_state *hw_state)
1836{
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",
1840 hw_state->ebb0,
1841 hw_state->ebb4,
1842 hw_state->pll0,
1843 hw_state->pll1,
1844 hw_state->pll2,
1845 hw_state->pll3,
1846 hw_state->pll6,
1847 hw_state->pll8,
1848 hw_state->pll9,
1849 hw_state->pll10,
1850 hw_state->pcsdw12);
1851}
1852
1853static 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,
1857};
1858
1859static void intel_ddi_pll_init(struct drm_device *dev)
1860{
1861 struct drm_i915_private *dev_priv = to_i915(dev);
1862
1863 if (INTEL_GEN(dev_priv) < 9) {
1864 uint32_t val = I915_READ(LCPLL_CTL);
1865
1866
1867
1868
1869
1870
1871
1872 if (val & LCPLL_CD_SOURCE_FCLK)
1873 DRM_ERROR("CDCLK source is not LCPLL\n");
1874
1875 if (val & LCPLL_PLL_DISABLE)
1876 DRM_ERROR("LCPLL is disabled\n");
1877 }
1878}
1879
1880struct dpll_info {
1881 const char *name;
1882 const int id;
1883 const struct intel_shared_dpll_funcs *funcs;
1884 uint32_t flags;
1885};
1886
1887struct intel_dpll_mgr {
1888 const struct dpll_info *dpll_info;
1889
1890 struct intel_shared_dpll *(*get_dpll)(struct intel_crtc *crtc,
1891 struct intel_crtc_state *crtc_state,
1892 struct intel_encoder *encoder);
1893
1894 void (*dump_hw_state)(struct drm_i915_private *dev_priv,
1895 struct intel_dpll_hw_state *hw_state);
1896};
1897
1898static 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 },
1902};
1903
1904static 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,
1908};
1909
1910static 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, },
1918};
1919
1920static 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,
1924};
1925
1926static 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, },
1932};
1933
1934static 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,
1938};
1939
1940static 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, },
1945};
1946
1947static 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,
1951};
1952
1953static void cnl_ddi_pll_enable(struct drm_i915_private *dev_priv,
1954 struct intel_shared_dpll *pll)
1955{
1956 uint32_t val;
1957
1958
1959 val = I915_READ(CNL_DPLL_ENABLE(pll->id));
1960 val |= PLL_POWER_ENABLE;
1961 I915_WRITE(CNL_DPLL_ENABLE(pll->id), val);
1962
1963
1964 if (intel_wait_for_register(dev_priv,
1965 CNL_DPLL_ENABLE(pll->id),
1966 PLL_POWER_STATE,
1967 PLL_POWER_STATE,
1968 5))
1969 DRM_ERROR("PLL %d Power not enabled\n", pll->id);
1970
1971
1972
1973
1974
1975 val = pll->state.hw_state.cfgcr0;
1976 I915_WRITE(CNL_DPLL_CFGCR0(pll->id), val);
1977
1978
1979 POSTING_READ(CNL_DPLL_CFGCR0(pll->id));
1980
1981
1982
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
1987 POSTING_READ(CNL_DPLL_CFGCR1(pll->id));
1988 }
1989
1990
1991
1992
1993
1994
1995
1996
1997
1998
1999
2000 val = I915_READ(CNL_DPLL_ENABLE(pll->id));
2001 val |= PLL_ENABLE;
2002 I915_WRITE(CNL_DPLL_ENABLE(pll->id), val);
2003
2004
2005 if (intel_wait_for_register(dev_priv,
2006 CNL_DPLL_ENABLE(pll->id),
2007 PLL_LOCK,
2008 PLL_LOCK,
2009 5))
2010 DRM_ERROR("PLL %d not locked\n", pll->id);
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025}
2026
2027static void cnl_ddi_pll_disable(struct drm_i915_private *dev_priv,
2028 struct intel_shared_dpll *pll)
2029{
2030 uint32_t val;
2031
2032
2033
2034
2035
2036
2037
2038
2039
2040
2041
2042
2043
2044
2045
2046
2047 val = I915_READ(CNL_DPLL_ENABLE(pll->id));
2048 val &= ~PLL_ENABLE;
2049 I915_WRITE(CNL_DPLL_ENABLE(pll->id), val);
2050
2051
2052 if (intel_wait_for_register(dev_priv,
2053 CNL_DPLL_ENABLE(pll->id),
2054 PLL_LOCK,
2055 0,
2056 5))
2057 DRM_ERROR("PLL %d locked\n", pll->id);
2058
2059
2060
2061
2062
2063
2064
2065
2066
2067
2068
2069 val = I915_READ(CNL_DPLL_ENABLE(pll->id));
2070 val &= ~PLL_POWER_ENABLE;
2071 I915_WRITE(CNL_DPLL_ENABLE(pll->id), val);
2072
2073
2074 if (intel_wait_for_register(dev_priv,
2075 CNL_DPLL_ENABLE(pll->id),
2076 PLL_POWER_STATE,
2077 0,
2078 5))
2079 DRM_ERROR("PLL %d Power not disabled\n", pll->id);
2080}
2081
2082static 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)
2085{
2086 uint32_t val;
2087 bool ret;
2088
2089 if (!intel_display_power_get_if_enabled(dev_priv, POWER_DOMAIN_PLLS))
2090 return false;
2091
2092 ret = false;
2093
2094 val = I915_READ(CNL_DPLL_ENABLE(pll->id));
2095 if (!(val & PLL_ENABLE))
2096 goto out;
2097
2098 val = I915_READ(CNL_DPLL_CFGCR0(pll->id));
2099 hw_state->cfgcr0 = val;
2100
2101
2102 if (val & DPLL_CFGCR0_HDMI_MODE) {
2103 hw_state->cfgcr1 = I915_READ(CNL_DPLL_CFGCR1(pll->id));
2104 }
2105 ret = true;
2106
2107out:
2108 intel_display_power_put(dev_priv, POWER_DOMAIN_PLLS);
2109
2110 return ret;
2111}
2112
2113static void cnl_wrpll_get_multipliers(int bestdiv, int *pdiv,
2114 int *qdiv, int *kdiv)
2115{
2116
2117 if (bestdiv % 2 == 0) {
2118 if (bestdiv == 2) {
2119 *pdiv = 2;
2120 *qdiv = 1;
2121 *kdiv = 1;
2122 } else if (bestdiv % 4 == 0) {
2123 *pdiv = 2;
2124 *qdiv = bestdiv / 4;
2125 *kdiv = 2;
2126 } else if (bestdiv % 6 == 0) {
2127 *pdiv = 3;
2128 *qdiv = bestdiv / 6;
2129 *kdiv = 2;
2130 } else if (bestdiv % 5 == 0) {
2131 *pdiv = 5;
2132 *qdiv = bestdiv / 10;
2133 *kdiv = 2;
2134 } else if (bestdiv % 14 == 0) {
2135 *pdiv = 7;
2136 *qdiv = bestdiv / 14;
2137 *kdiv = 2;
2138 }
2139 } else {
2140 if (bestdiv == 3 || bestdiv == 5 || bestdiv == 7) {
2141 *pdiv = bestdiv;
2142 *qdiv = 1;
2143 *kdiv = 1;
2144 } else {
2145 *pdiv = bestdiv / 3;
2146 *qdiv = 1;
2147 *kdiv = 3;
2148 }
2149 }
2150}
2151
2152static void cnl_wrpll_params_populate(struct skl_wrpll_params *params,
2153 u32 dco_freq, u32 ref_freq,
2154 int pdiv, int qdiv, int kdiv)
2155{
2156 u32 dco;
2157
2158 switch (kdiv) {
2159 case 1:
2160 params->kdiv = 1;
2161 break;
2162 case 2:
2163 params->kdiv = 2;
2164 break;
2165 case 3:
2166 params->kdiv = 4;
2167 break;
2168 default:
2169 WARN(1, "Incorrect KDiv\n");
2170 }
2171
2172 switch (pdiv) {
2173 case 2:
2174 params->pdiv = 1;
2175 break;
2176 case 3:
2177 params->pdiv = 2;
2178 break;
2179 case 5:
2180 params->pdiv = 4;
2181 break;
2182 case 7:
2183 params->pdiv = 8;
2184 break;
2185 default:
2186 WARN(1, "Incorrect PDiv\n");
2187 }
2188
2189 WARN_ON(kdiv != 2 && qdiv != 1);
2190
2191 params->qdiv_ratio = qdiv;
2192 params->qdiv_mode = (qdiv == 1) ? 0 : 1;
2193
2194 dco = div_u64((u64)dco_freq << 15, ref_freq);
2195
2196 params->dco_integer = dco >> 15;
2197 params->dco_fraction = dco & 0x7fff;
2198}
2199
2200static bool
2201cnl_ddi_calculate_wrpll(int clock,
2202 struct drm_i915_private *dev_priv,
2203 struct skl_wrpll_params *wrpll_params)
2204{
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;
2217 int d, best_div = 0, pdiv = 0, qdiv = 0, kdiv = 0;
2218
2219 for (d = 0; d < ARRAY_SIZE(dividers); d++) {
2220 dco = afe_clock * dividers[d];
2221
2222 if ((dco <= dco_max) && (dco >= dco_min)) {
2223 dco_centrality = abs(dco - dco_mid);
2224
2225 if (dco_centrality < best_dco_centrality) {
2226 best_dco_centrality = dco_centrality;
2227 best_div = dividers[d];
2228 best_dco = dco;
2229 }
2230 }
2231 }
2232
2233 if (best_div == 0)
2234 return false;
2235
2236 cnl_wrpll_get_multipliers(best_div, &pdiv, &qdiv, &kdiv);
2237
2238 cnl_wrpll_params_populate(wrpll_params, best_dco,
2239 dev_priv->cdclk.hw.ref, pdiv, qdiv, kdiv);
2240
2241 return true;
2242}
2243
2244static bool cnl_ddi_hdmi_pll_dividers(struct intel_crtc *crtc,
2245 struct intel_crtc_state *crtc_state,
2246 int clock)
2247{
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, };
2251
2252 cfgcr0 = DPLL_CFGCR0_HDMI_MODE;
2253
2254 if (!cnl_ddi_calculate_wrpll(clock, dev_priv, &wrpll_params))
2255 return false;
2256
2257 cfgcr0 |= DPLL_CFGCR0_DCO_FRACTION(wrpll_params.dco_fraction) |
2258 wrpll_params.dco_integer;
2259
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;
2265
2266 memset(&crtc_state->dpll_hw_state, 0,
2267 sizeof(crtc_state->dpll_hw_state));
2268
2269 crtc_state->dpll_hw_state.cfgcr0 = cfgcr0;
2270 crtc_state->dpll_hw_state.cfgcr1 = cfgcr1;
2271 return true;
2272}
2273
2274static bool
2275cnl_ddi_dp_set_dpll_hw_state(int clock,
2276 struct intel_dpll_hw_state *dpll_hw_state)
2277{
2278 uint32_t cfgcr0;
2279
2280 cfgcr0 = DPLL_CFGCR0_SSC_ENABLE;
2281
2282 switch (clock / 2) {
2283 case 81000:
2284 cfgcr0 |= DPLL_CFGCR0_LINK_RATE_810;
2285 break;
2286 case 135000:
2287 cfgcr0 |= DPLL_CFGCR0_LINK_RATE_1350;
2288 break;
2289 case 270000:
2290 cfgcr0 |= DPLL_CFGCR0_LINK_RATE_2700;
2291 break;
2292
2293 case 162000:
2294 cfgcr0 |= DPLL_CFGCR0_LINK_RATE_1620;
2295 break;
2296 case 108000:
2297 cfgcr0 |= DPLL_CFGCR0_LINK_RATE_1080;
2298 break;
2299 case 216000:
2300 cfgcr0 |= DPLL_CFGCR0_LINK_RATE_2160;
2301 break;
2302 case 324000:
2303
2304 cfgcr0 |= DPLL_CFGCR0_LINK_RATE_3240;
2305 break;
2306 case 405000:
2307
2308 cfgcr0 |= DPLL_CFGCR0_LINK_RATE_4050;
2309 break;
2310 }
2311
2312 dpll_hw_state->cfgcr0 = cfgcr0;
2313 return true;
2314}
2315
2316static struct intel_shared_dpll *
2317cnl_get_dpll(struct intel_crtc *crtc, struct intel_crtc_state *crtc_state,
2318 struct intel_encoder *encoder)
2319{
2320 struct intel_shared_dpll *pll;
2321 int clock = crtc_state->port_clock;
2322 bool bret;
2323 struct intel_dpll_hw_state dpll_hw_state;
2324
2325 memset(&dpll_hw_state, 0, sizeof(dpll_hw_state));
2326
2327 if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_HDMI)) {
2328 bret = cnl_ddi_hdmi_pll_dividers(crtc, crtc_state, clock);
2329 if (!bret) {
2330 DRM_DEBUG_KMS("Could not get HDMI pll dividers.\n");
2331 return NULL;
2332 }
2333 } else if (intel_crtc_has_dp_encoder(crtc_state)) {
2334 bret = cnl_ddi_dp_set_dpll_hw_state(clock, &dpll_hw_state);
2335 if (!bret) {
2336 DRM_DEBUG_KMS("Could not set DP dpll HW state.\n");
2337 return NULL;
2338 }
2339 crtc_state->dpll_hw_state = dpll_hw_state;
2340 } else {
2341 DRM_DEBUG_KMS("Skip DPLL setup for output_types 0x%x\n",
2342 crtc_state->output_types);
2343 return NULL;
2344 }
2345
2346 pll = intel_find_shared_dpll(crtc, crtc_state,
2347 DPLL_ID_SKL_DPLL0,
2348 DPLL_ID_SKL_DPLL2);
2349 if (!pll) {
2350 DRM_DEBUG_KMS("No PLL selected\n");
2351 return NULL;
2352 }
2353
2354 intel_reference_shared_dpll(pll, crtc_state);
2355
2356 return pll;
2357}
2358
2359static void cnl_dump_hw_state(struct drm_i915_private *dev_priv,
2360 struct intel_dpll_hw_state *hw_state)
2361{
2362 DRM_DEBUG_KMS("dpll_hw_state: "
2363 "cfgcr0: 0x%x, cfgcr1: 0x%x\n",
2364 hw_state->cfgcr0,
2365 hw_state->cfgcr1);
2366}
2367
2368static 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,
2372};
2373
2374static 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, },
2379};
2380
2381static 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,
2385};
2386
2387
2388
2389
2390
2391
2392
2393void intel_shared_dpll_init(struct drm_device *dev)
2394{
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;
2398 int i;
2399
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;
2410
2411 if (!dpll_mgr) {
2412 dev_priv->num_shared_dpll = 0;
2413 return;
2414 }
2415
2416 dpll_info = dpll_mgr->dpll_info;
2417
2418 for (i = 0; dpll_info[i].id >= 0; i++) {
2419 WARN_ON(i != dpll_info[i].id);
2420
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;
2425 }
2426
2427 dev_priv->dpll_mgr = dpll_mgr;
2428 dev_priv->num_shared_dpll = i;
2429 mutex_init(&dev_priv->dpll_lock);
2430
2431 BUG_ON(dev_priv->num_shared_dpll > I915_NUM_PLLS);
2432
2433
2434 if (HAS_DDI(dev_priv))
2435 intel_ddi_pll_init(dev);
2436}
2437
2438
2439
2440
2441
2442
2443
2444
2445
2446
2447
2448
2449
2450
2451
2452
2453struct intel_shared_dpll *
2454intel_get_shared_dpll(struct intel_crtc *crtc,
2455 struct intel_crtc_state *crtc_state,
2456 struct intel_encoder *encoder)
2457{
2458 struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
2459 const struct intel_dpll_mgr *dpll_mgr = dev_priv->dpll_mgr;
2460
2461 if (WARN_ON(!dpll_mgr))
2462 return NULL;
2463
2464 return dpll_mgr->get_dpll(crtc, crtc_state, encoder);
2465}
2466
2467
2468
2469
2470
2471
2472
2473
2474
2475
2476
2477void intel_release_shared_dpll(struct intel_shared_dpll *dpll,
2478 struct intel_crtc *crtc,
2479 struct drm_atomic_state *state)
2480{
2481 struct intel_shared_dpll_state *shared_dpll_state;
2482
2483 shared_dpll_state = intel_atomic_get_shared_dpll_state(state);
2484 shared_dpll_state[dpll->id].crtc_mask &= ~(1 << crtc->pipe);
2485}
2486
2487
2488
2489
2490
2491
2492
2493
2494void intel_dpll_dump_hw_state(struct drm_i915_private *dev_priv,
2495 struct intel_dpll_hw_state *hw_state)
2496{
2497 if (dev_priv->dpll_mgr) {
2498 dev_priv->dpll_mgr->dump_hw_state(dev_priv, hw_state);
2499 } else {
2500
2501
2502
2503 DRM_DEBUG_KMS("dpll_hw_state: dpll: 0x%x, dpll_md: 0x%x, "
2504 "fp0: 0x%x, fp1: 0x%x\n",
2505 hw_state->dpll,
2506 hw_state->dpll_md,
2507 hw_state->fp0,
2508 hw_state->fp1);
2509 }
2510}
2511