Merge tag 'drm-intel-next-queued-2020-11-27' of git://anongit.freedesktop.org/drm...
[linux-2.6-microblaze.git] / drivers / gpu / drm / i915 / display / intel_dpll_mgr.c
1 /*
2  * Copyright © 2006-2016 Intel Corporation
3  *
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:
10  *
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
13  * Software.
14  *
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.
22  */
23
24 #include "intel_display_types.h"
25 #include "intel_dpio_phy.h"
26 #include "intel_dpll_mgr.h"
27
28 /**
29  * DOC: Display PLLs
30  *
31  * Display PLLs used for driving outputs vary by platform. While some have
32  * per-pipe or per-encoder dedicated PLLs, others allow the use of any PLL
33  * from a pool. In the latter scenario, it is possible that multiple pipes
34  * share a PLL if their configurations match.
35  *
36  * This file provides an abstraction over display PLLs. The function
37  * intel_shared_dpll_init() initializes the PLLs for the given platform.  The
38  * users of a PLL are tracked and that tracking is integrated with the atomic
39  * modset interface. During an atomic operation, required PLLs can be reserved
40  * for a given CRTC and encoder configuration by calling
41  * intel_reserve_shared_dplls() and previously reserved PLLs can be released
42  * with intel_release_shared_dplls().
43  * Changes to the users are first staged in the atomic state, and then made
44  * effective by calling intel_shared_dpll_swap_state() during the atomic
45  * commit phase.
46  */
47
48 struct intel_dpll_mgr {
49         const struct dpll_info *dpll_info;
50
51         bool (*get_dplls)(struct intel_atomic_state *state,
52                           struct intel_crtc *crtc,
53                           struct intel_encoder *encoder);
54         void (*put_dplls)(struct intel_atomic_state *state,
55                           struct intel_crtc *crtc);
56         void (*update_active_dpll)(struct intel_atomic_state *state,
57                                    struct intel_crtc *crtc,
58                                    struct intel_encoder *encoder);
59         void (*update_ref_clks)(struct drm_i915_private *i915);
60         void (*dump_hw_state)(struct drm_i915_private *dev_priv,
61                               const struct intel_dpll_hw_state *hw_state);
62 };
63
64 static void
65 intel_atomic_duplicate_dpll_state(struct drm_i915_private *dev_priv,
66                                   struct intel_shared_dpll_state *shared_dpll)
67 {
68         enum intel_dpll_id i;
69
70         /* Copy shared dpll state */
71         for (i = 0; i < dev_priv->dpll.num_shared_dpll; i++) {
72                 struct intel_shared_dpll *pll = &dev_priv->dpll.shared_dplls[i];
73
74                 shared_dpll[i] = pll->state;
75         }
76 }
77
78 static struct intel_shared_dpll_state *
79 intel_atomic_get_shared_dpll_state(struct drm_atomic_state *s)
80 {
81         struct intel_atomic_state *state = to_intel_atomic_state(s);
82
83         drm_WARN_ON(s->dev, !drm_modeset_is_locked(&s->dev->mode_config.connection_mutex));
84
85         if (!state->dpll_set) {
86                 state->dpll_set = true;
87
88                 intel_atomic_duplicate_dpll_state(to_i915(s->dev),
89                                                   state->shared_dpll);
90         }
91
92         return state->shared_dpll;
93 }
94
95 /**
96  * intel_get_shared_dpll_by_id - get a DPLL given its id
97  * @dev_priv: i915 device instance
98  * @id: pll id
99  *
100  * Returns:
101  * A pointer to the DPLL with @id
102  */
103 struct intel_shared_dpll *
104 intel_get_shared_dpll_by_id(struct drm_i915_private *dev_priv,
105                             enum intel_dpll_id id)
106 {
107         return &dev_priv->dpll.shared_dplls[id];
108 }
109
110 /**
111  * intel_get_shared_dpll_id - get the id of a DPLL
112  * @dev_priv: i915 device instance
113  * @pll: the DPLL
114  *
115  * Returns:
116  * The id of @pll
117  */
118 enum intel_dpll_id
119 intel_get_shared_dpll_id(struct drm_i915_private *dev_priv,
120                          struct intel_shared_dpll *pll)
121 {
122         long pll_idx = pll - dev_priv->dpll.shared_dplls;
123
124         if (drm_WARN_ON(&dev_priv->drm,
125                         pll_idx < 0 ||
126                         pll_idx >= dev_priv->dpll.num_shared_dpll))
127                 return -1;
128
129         return pll_idx;
130 }
131
132 /* For ILK+ */
133 void assert_shared_dpll(struct drm_i915_private *dev_priv,
134                         struct intel_shared_dpll *pll,
135                         bool state)
136 {
137         bool cur_state;
138         struct intel_dpll_hw_state hw_state;
139
140         if (drm_WARN(&dev_priv->drm, !pll,
141                      "asserting DPLL %s with no DPLL\n", onoff(state)))
142                 return;
143
144         cur_state = intel_dpll_get_hw_state(dev_priv, pll, &hw_state);
145         I915_STATE_WARN(cur_state != state,
146              "%s assertion failure (expected %s, current %s)\n",
147                         pll->info->name, onoff(state), onoff(cur_state));
148 }
149
150 static i915_reg_t
151 intel_combo_pll_enable_reg(struct drm_i915_private *i915,
152                            struct intel_shared_dpll *pll)
153 {
154         if (IS_DG1(i915))
155                 return DG1_DPLL_ENABLE(pll->info->id);
156         else if (IS_JSL_EHL(i915) && (pll->info->id == DPLL_ID_EHL_DPLL4))
157                 return MG_PLL_ENABLE(0);
158
159         return CNL_DPLL_ENABLE(pll->info->id);
160 }
161
162 /**
163  * intel_prepare_shared_dpll - call a dpll's prepare hook
164  * @crtc_state: CRTC, and its state, which has a shared dpll
165  *
166  * This calls the PLL's prepare hook if it has one and if the PLL is not
167  * already enabled. The prepare hook is platform specific.
168  */
169 void intel_prepare_shared_dpll(const struct intel_crtc_state *crtc_state)
170 {
171         struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
172         struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
173         struct intel_shared_dpll *pll = crtc_state->shared_dpll;
174
175         if (drm_WARN_ON(&dev_priv->drm, pll == NULL))
176                 return;
177
178         mutex_lock(&dev_priv->dpll.lock);
179         drm_WARN_ON(&dev_priv->drm, !pll->state.crtc_mask);
180         if (!pll->active_mask) {
181                 drm_dbg(&dev_priv->drm, "setting up %s\n", pll->info->name);
182                 drm_WARN_ON(&dev_priv->drm, pll->on);
183                 assert_shared_dpll_disabled(dev_priv, pll);
184
185                 pll->info->funcs->prepare(dev_priv, pll);
186         }
187         mutex_unlock(&dev_priv->dpll.lock);
188 }
189
190 /**
191  * intel_enable_shared_dpll - enable a CRTC's shared DPLL
192  * @crtc_state: CRTC, and its state, which has a shared DPLL
193  *
194  * Enable the shared DPLL used by @crtc.
195  */
196 void intel_enable_shared_dpll(const struct intel_crtc_state *crtc_state)
197 {
198         struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
199         struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
200         struct intel_shared_dpll *pll = crtc_state->shared_dpll;
201         unsigned int crtc_mask = drm_crtc_mask(&crtc->base);
202         unsigned int old_mask;
203
204         if (drm_WARN_ON(&dev_priv->drm, pll == NULL))
205                 return;
206
207         mutex_lock(&dev_priv->dpll.lock);
208         old_mask = pll->active_mask;
209
210         if (drm_WARN_ON(&dev_priv->drm, !(pll->state.crtc_mask & crtc_mask)) ||
211             drm_WARN_ON(&dev_priv->drm, pll->active_mask & crtc_mask))
212                 goto out;
213
214         pll->active_mask |= crtc_mask;
215
216         drm_dbg_kms(&dev_priv->drm,
217                     "enable %s (active %x, on? %d) for crtc %d\n",
218                     pll->info->name, pll->active_mask, pll->on,
219                     crtc->base.base.id);
220
221         if (old_mask) {
222                 drm_WARN_ON(&dev_priv->drm, !pll->on);
223                 assert_shared_dpll_enabled(dev_priv, pll);
224                 goto out;
225         }
226         drm_WARN_ON(&dev_priv->drm, pll->on);
227
228         drm_dbg_kms(&dev_priv->drm, "enabling %s\n", pll->info->name);
229         pll->info->funcs->enable(dev_priv, pll);
230         pll->on = true;
231
232 out:
233         mutex_unlock(&dev_priv->dpll.lock);
234 }
235
236 /**
237  * intel_disable_shared_dpll - disable a CRTC's shared DPLL
238  * @crtc_state: CRTC, and its state, which has a shared DPLL
239  *
240  * Disable the shared DPLL used by @crtc.
241  */
242 void intel_disable_shared_dpll(const struct intel_crtc_state *crtc_state)
243 {
244         struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
245         struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
246         struct intel_shared_dpll *pll = crtc_state->shared_dpll;
247         unsigned int crtc_mask = drm_crtc_mask(&crtc->base);
248
249         /* PCH only available on ILK+ */
250         if (INTEL_GEN(dev_priv) < 5)
251                 return;
252
253         if (pll == NULL)
254                 return;
255
256         mutex_lock(&dev_priv->dpll.lock);
257         if (drm_WARN_ON(&dev_priv->drm, !(pll->active_mask & crtc_mask)))
258                 goto out;
259
260         drm_dbg_kms(&dev_priv->drm,
261                     "disable %s (active %x, on? %d) for crtc %d\n",
262                     pll->info->name, pll->active_mask, pll->on,
263                     crtc->base.base.id);
264
265         assert_shared_dpll_enabled(dev_priv, pll);
266         drm_WARN_ON(&dev_priv->drm, !pll->on);
267
268         pll->active_mask &= ~crtc_mask;
269         if (pll->active_mask)
270                 goto out;
271
272         drm_dbg_kms(&dev_priv->drm, "disabling %s\n", pll->info->name);
273         pll->info->funcs->disable(dev_priv, pll);
274         pll->on = false;
275
276 out:
277         mutex_unlock(&dev_priv->dpll.lock);
278 }
279
280 static struct intel_shared_dpll *
281 intel_find_shared_dpll(struct intel_atomic_state *state,
282                        const struct intel_crtc *crtc,
283                        const struct intel_dpll_hw_state *pll_state,
284                        unsigned long dpll_mask)
285 {
286         struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
287         struct intel_shared_dpll *pll, *unused_pll = NULL;
288         struct intel_shared_dpll_state *shared_dpll;
289         enum intel_dpll_id i;
290
291         shared_dpll = intel_atomic_get_shared_dpll_state(&state->base);
292
293         drm_WARN_ON(&dev_priv->drm, dpll_mask & ~(BIT(I915_NUM_PLLS) - 1));
294
295         for_each_set_bit(i, &dpll_mask, I915_NUM_PLLS) {
296                 pll = &dev_priv->dpll.shared_dplls[i];
297
298                 /* Only want to check enabled timings first */
299                 if (shared_dpll[i].crtc_mask == 0) {
300                         if (!unused_pll)
301                                 unused_pll = pll;
302                         continue;
303                 }
304
305                 if (memcmp(pll_state,
306                            &shared_dpll[i].hw_state,
307                            sizeof(*pll_state)) == 0) {
308                         drm_dbg_kms(&dev_priv->drm,
309                                     "[CRTC:%d:%s] sharing existing %s (crtc mask 0x%08x, active %x)\n",
310                                     crtc->base.base.id, crtc->base.name,
311                                     pll->info->name,
312                                     shared_dpll[i].crtc_mask,
313                                     pll->active_mask);
314                         return pll;
315                 }
316         }
317
318         /* Ok no matching timings, maybe there's a free one? */
319         if (unused_pll) {
320                 drm_dbg_kms(&dev_priv->drm, "[CRTC:%d:%s] allocated %s\n",
321                             crtc->base.base.id, crtc->base.name,
322                             unused_pll->info->name);
323                 return unused_pll;
324         }
325
326         return NULL;
327 }
328
329 static void
330 intel_reference_shared_dpll(struct intel_atomic_state *state,
331                             const struct intel_crtc *crtc,
332                             const struct intel_shared_dpll *pll,
333                             const struct intel_dpll_hw_state *pll_state)
334 {
335         struct drm_i915_private *i915 = to_i915(state->base.dev);
336         struct intel_shared_dpll_state *shared_dpll;
337         const enum intel_dpll_id id = pll->info->id;
338
339         shared_dpll = intel_atomic_get_shared_dpll_state(&state->base);
340
341         if (shared_dpll[id].crtc_mask == 0)
342                 shared_dpll[id].hw_state = *pll_state;
343
344         drm_dbg(&i915->drm, "using %s for pipe %c\n", pll->info->name,
345                 pipe_name(crtc->pipe));
346
347         shared_dpll[id].crtc_mask |= 1 << crtc->pipe;
348 }
349
350 static void intel_unreference_shared_dpll(struct intel_atomic_state *state,
351                                           const struct intel_crtc *crtc,
352                                           const struct intel_shared_dpll *pll)
353 {
354         struct intel_shared_dpll_state *shared_dpll;
355
356         shared_dpll = intel_atomic_get_shared_dpll_state(&state->base);
357         shared_dpll[pll->info->id].crtc_mask &= ~(1 << crtc->pipe);
358 }
359
360 static void intel_put_dpll(struct intel_atomic_state *state,
361                            struct intel_crtc *crtc)
362 {
363         const struct intel_crtc_state *old_crtc_state =
364                 intel_atomic_get_old_crtc_state(state, crtc);
365         struct intel_crtc_state *new_crtc_state =
366                 intel_atomic_get_new_crtc_state(state, crtc);
367
368         new_crtc_state->shared_dpll = NULL;
369
370         if (!old_crtc_state->shared_dpll)
371                 return;
372
373         intel_unreference_shared_dpll(state, crtc, old_crtc_state->shared_dpll);
374 }
375
376 /**
377  * intel_shared_dpll_swap_state - make atomic DPLL configuration effective
378  * @state: atomic state
379  *
380  * This is the dpll version of drm_atomic_helper_swap_state() since the
381  * helper does not handle driver-specific global state.
382  *
383  * For consistency with atomic helpers this function does a complete swap,
384  * i.e. it also puts the current state into @state, even though there is no
385  * need for that at this moment.
386  */
387 void intel_shared_dpll_swap_state(struct intel_atomic_state *state)
388 {
389         struct drm_i915_private *dev_priv = to_i915(state->base.dev);
390         struct intel_shared_dpll_state *shared_dpll = state->shared_dpll;
391         enum intel_dpll_id i;
392
393         if (!state->dpll_set)
394                 return;
395
396         for (i = 0; i < dev_priv->dpll.num_shared_dpll; i++) {
397                 struct intel_shared_dpll *pll =
398                         &dev_priv->dpll.shared_dplls[i];
399
400                 swap(pll->state, shared_dpll[i]);
401         }
402 }
403
404 static bool ibx_pch_dpll_get_hw_state(struct drm_i915_private *dev_priv,
405                                       struct intel_shared_dpll *pll,
406                                       struct intel_dpll_hw_state *hw_state)
407 {
408         const enum intel_dpll_id id = pll->info->id;
409         intel_wakeref_t wakeref;
410         u32 val;
411
412         wakeref = intel_display_power_get_if_enabled(dev_priv,
413                                                      POWER_DOMAIN_DISPLAY_CORE);
414         if (!wakeref)
415                 return false;
416
417         val = intel_de_read(dev_priv, PCH_DPLL(id));
418         hw_state->dpll = val;
419         hw_state->fp0 = intel_de_read(dev_priv, PCH_FP0(id));
420         hw_state->fp1 = intel_de_read(dev_priv, PCH_FP1(id));
421
422         intel_display_power_put(dev_priv, POWER_DOMAIN_DISPLAY_CORE, wakeref);
423
424         return val & DPLL_VCO_ENABLE;
425 }
426
427 static void ibx_pch_dpll_prepare(struct drm_i915_private *dev_priv,
428                                  struct intel_shared_dpll *pll)
429 {
430         const enum intel_dpll_id id = pll->info->id;
431
432         intel_de_write(dev_priv, PCH_FP0(id), pll->state.hw_state.fp0);
433         intel_de_write(dev_priv, PCH_FP1(id), pll->state.hw_state.fp1);
434 }
435
436 static void ibx_assert_pch_refclk_enabled(struct drm_i915_private *dev_priv)
437 {
438         u32 val;
439         bool enabled;
440
441         I915_STATE_WARN_ON(!(HAS_PCH_IBX(dev_priv) || HAS_PCH_CPT(dev_priv)));
442
443         val = intel_de_read(dev_priv, PCH_DREF_CONTROL);
444         enabled = !!(val & (DREF_SSC_SOURCE_MASK | DREF_NONSPREAD_SOURCE_MASK |
445                             DREF_SUPERSPREAD_SOURCE_MASK));
446         I915_STATE_WARN(!enabled, "PCH refclk assertion failure, should be active but is disabled\n");
447 }
448
449 static void ibx_pch_dpll_enable(struct drm_i915_private *dev_priv,
450                                 struct intel_shared_dpll *pll)
451 {
452         const enum intel_dpll_id id = pll->info->id;
453
454         /* PCH refclock must be enabled first */
455         ibx_assert_pch_refclk_enabled(dev_priv);
456
457         intel_de_write(dev_priv, PCH_DPLL(id), pll->state.hw_state.dpll);
458
459         /* Wait for the clocks to stabilize. */
460         intel_de_posting_read(dev_priv, PCH_DPLL(id));
461         udelay(150);
462
463         /* The pixel multiplier can only be updated once the
464          * DPLL is enabled and the clocks are stable.
465          *
466          * So write it again.
467          */
468         intel_de_write(dev_priv, PCH_DPLL(id), pll->state.hw_state.dpll);
469         intel_de_posting_read(dev_priv, PCH_DPLL(id));
470         udelay(200);
471 }
472
473 static void ibx_pch_dpll_disable(struct drm_i915_private *dev_priv,
474                                  struct intel_shared_dpll *pll)
475 {
476         const enum intel_dpll_id id = pll->info->id;
477
478         intel_de_write(dev_priv, PCH_DPLL(id), 0);
479         intel_de_posting_read(dev_priv, PCH_DPLL(id));
480         udelay(200);
481 }
482
483 static bool ibx_get_dpll(struct intel_atomic_state *state,
484                          struct intel_crtc *crtc,
485                          struct intel_encoder *encoder)
486 {
487         struct intel_crtc_state *crtc_state =
488                 intel_atomic_get_new_crtc_state(state, crtc);
489         struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
490         struct intel_shared_dpll *pll;
491         enum intel_dpll_id i;
492
493         if (HAS_PCH_IBX(dev_priv)) {
494                 /* Ironlake PCH has a fixed PLL->PCH pipe mapping. */
495                 i = (enum intel_dpll_id) crtc->pipe;
496                 pll = &dev_priv->dpll.shared_dplls[i];
497
498                 drm_dbg_kms(&dev_priv->drm,
499                             "[CRTC:%d:%s] using pre-allocated %s\n",
500                             crtc->base.base.id, crtc->base.name,
501                             pll->info->name);
502         } else {
503                 pll = intel_find_shared_dpll(state, crtc,
504                                              &crtc_state->dpll_hw_state,
505                                              BIT(DPLL_ID_PCH_PLL_B) |
506                                              BIT(DPLL_ID_PCH_PLL_A));
507         }
508
509         if (!pll)
510                 return false;
511
512         /* reference the pll */
513         intel_reference_shared_dpll(state, crtc,
514                                     pll, &crtc_state->dpll_hw_state);
515
516         crtc_state->shared_dpll = pll;
517
518         return true;
519 }
520
521 static void ibx_dump_hw_state(struct drm_i915_private *dev_priv,
522                               const struct intel_dpll_hw_state *hw_state)
523 {
524         drm_dbg_kms(&dev_priv->drm,
525                     "dpll_hw_state: dpll: 0x%x, dpll_md: 0x%x, "
526                     "fp0: 0x%x, fp1: 0x%x\n",
527                     hw_state->dpll,
528                     hw_state->dpll_md,
529                     hw_state->fp0,
530                     hw_state->fp1);
531 }
532
533 static const struct intel_shared_dpll_funcs ibx_pch_dpll_funcs = {
534         .prepare = ibx_pch_dpll_prepare,
535         .enable = ibx_pch_dpll_enable,
536         .disable = ibx_pch_dpll_disable,
537         .get_hw_state = ibx_pch_dpll_get_hw_state,
538 };
539
540 static const struct dpll_info pch_plls[] = {
541         { "PCH DPLL A", &ibx_pch_dpll_funcs, DPLL_ID_PCH_PLL_A, 0 },
542         { "PCH DPLL B", &ibx_pch_dpll_funcs, DPLL_ID_PCH_PLL_B, 0 },
543         { },
544 };
545
546 static const struct intel_dpll_mgr pch_pll_mgr = {
547         .dpll_info = pch_plls,
548         .get_dplls = ibx_get_dpll,
549         .put_dplls = intel_put_dpll,
550         .dump_hw_state = ibx_dump_hw_state,
551 };
552
553 static void hsw_ddi_wrpll_enable(struct drm_i915_private *dev_priv,
554                                struct intel_shared_dpll *pll)
555 {
556         const enum intel_dpll_id id = pll->info->id;
557
558         intel_de_write(dev_priv, WRPLL_CTL(id), pll->state.hw_state.wrpll);
559         intel_de_posting_read(dev_priv, WRPLL_CTL(id));
560         udelay(20);
561 }
562
563 static void hsw_ddi_spll_enable(struct drm_i915_private *dev_priv,
564                                 struct intel_shared_dpll *pll)
565 {
566         intel_de_write(dev_priv, SPLL_CTL, pll->state.hw_state.spll);
567         intel_de_posting_read(dev_priv, SPLL_CTL);
568         udelay(20);
569 }
570
571 static void hsw_ddi_wrpll_disable(struct drm_i915_private *dev_priv,
572                                   struct intel_shared_dpll *pll)
573 {
574         const enum intel_dpll_id id = pll->info->id;
575         u32 val;
576
577         val = intel_de_read(dev_priv, WRPLL_CTL(id));
578         intel_de_write(dev_priv, WRPLL_CTL(id), val & ~WRPLL_PLL_ENABLE);
579         intel_de_posting_read(dev_priv, WRPLL_CTL(id));
580
581         /*
582          * Try to set up the PCH reference clock once all DPLLs
583          * that depend on it have been shut down.
584          */
585         if (dev_priv->pch_ssc_use & BIT(id))
586                 intel_init_pch_refclk(dev_priv);
587 }
588
589 static void hsw_ddi_spll_disable(struct drm_i915_private *dev_priv,
590                                  struct intel_shared_dpll *pll)
591 {
592         enum intel_dpll_id id = pll->info->id;
593         u32 val;
594
595         val = intel_de_read(dev_priv, SPLL_CTL);
596         intel_de_write(dev_priv, SPLL_CTL, val & ~SPLL_PLL_ENABLE);
597         intel_de_posting_read(dev_priv, SPLL_CTL);
598
599         /*
600          * Try to set up the PCH reference clock once all DPLLs
601          * that depend on it have been shut down.
602          */
603         if (dev_priv->pch_ssc_use & BIT(id))
604                 intel_init_pch_refclk(dev_priv);
605 }
606
607 static bool hsw_ddi_wrpll_get_hw_state(struct drm_i915_private *dev_priv,
608                                        struct intel_shared_dpll *pll,
609                                        struct intel_dpll_hw_state *hw_state)
610 {
611         const enum intel_dpll_id id = pll->info->id;
612         intel_wakeref_t wakeref;
613         u32 val;
614
615         wakeref = intel_display_power_get_if_enabled(dev_priv,
616                                                      POWER_DOMAIN_DISPLAY_CORE);
617         if (!wakeref)
618                 return false;
619
620         val = intel_de_read(dev_priv, WRPLL_CTL(id));
621         hw_state->wrpll = val;
622
623         intel_display_power_put(dev_priv, POWER_DOMAIN_DISPLAY_CORE, wakeref);
624
625         return val & WRPLL_PLL_ENABLE;
626 }
627
628 static bool hsw_ddi_spll_get_hw_state(struct drm_i915_private *dev_priv,
629                                       struct intel_shared_dpll *pll,
630                                       struct intel_dpll_hw_state *hw_state)
631 {
632         intel_wakeref_t wakeref;
633         u32 val;
634
635         wakeref = intel_display_power_get_if_enabled(dev_priv,
636                                                      POWER_DOMAIN_DISPLAY_CORE);
637         if (!wakeref)
638                 return false;
639
640         val = intel_de_read(dev_priv, SPLL_CTL);
641         hw_state->spll = val;
642
643         intel_display_power_put(dev_priv, POWER_DOMAIN_DISPLAY_CORE, wakeref);
644
645         return val & SPLL_PLL_ENABLE;
646 }
647
648 #define LC_FREQ 2700
649 #define LC_FREQ_2K U64_C(LC_FREQ * 2000)
650
651 #define P_MIN 2
652 #define P_MAX 64
653 #define P_INC 2
654
655 /* Constraints for PLL good behavior */
656 #define REF_MIN 48
657 #define REF_MAX 400
658 #define VCO_MIN 2400
659 #define VCO_MAX 4800
660
661 struct hsw_wrpll_rnp {
662         unsigned p, n2, r2;
663 };
664
665 static unsigned hsw_wrpll_get_budget_for_freq(int clock)
666 {
667         unsigned budget;
668
669         switch (clock) {
670         case 25175000:
671         case 25200000:
672         case 27000000:
673         case 27027000:
674         case 37762500:
675         case 37800000:
676         case 40500000:
677         case 40541000:
678         case 54000000:
679         case 54054000:
680         case 59341000:
681         case 59400000:
682         case 72000000:
683         case 74176000:
684         case 74250000:
685         case 81000000:
686         case 81081000:
687         case 89012000:
688         case 89100000:
689         case 108000000:
690         case 108108000:
691         case 111264000:
692         case 111375000:
693         case 148352000:
694         case 148500000:
695         case 162000000:
696         case 162162000:
697         case 222525000:
698         case 222750000:
699         case 296703000:
700         case 297000000:
701                 budget = 0;
702                 break;
703         case 233500000:
704         case 245250000:
705         case 247750000:
706         case 253250000:
707         case 298000000:
708                 budget = 1500;
709                 break;
710         case 169128000:
711         case 169500000:
712         case 179500000:
713         case 202000000:
714                 budget = 2000;
715                 break;
716         case 256250000:
717         case 262500000:
718         case 270000000:
719         case 272500000:
720         case 273750000:
721         case 280750000:
722         case 281250000:
723         case 286000000:
724         case 291750000:
725                 budget = 4000;
726                 break;
727         case 267250000:
728         case 268500000:
729                 budget = 5000;
730                 break;
731         default:
732                 budget = 1000;
733                 break;
734         }
735
736         return budget;
737 }
738
739 static void hsw_wrpll_update_rnp(u64 freq2k, unsigned int budget,
740                                  unsigned int r2, unsigned int n2,
741                                  unsigned int p,
742                                  struct hsw_wrpll_rnp *best)
743 {
744         u64 a, b, c, d, diff, diff_best;
745
746         /* No best (r,n,p) yet */
747         if (best->p == 0) {
748                 best->p = p;
749                 best->n2 = n2;
750                 best->r2 = r2;
751                 return;
752         }
753
754         /*
755          * Output clock is (LC_FREQ_2K / 2000) * N / (P * R), which compares to
756          * freq2k.
757          *
758          * delta = 1e6 *
759          *         abs(freq2k - (LC_FREQ_2K * n2/(p * r2))) /
760          *         freq2k;
761          *
762          * and we would like delta <= budget.
763          *
764          * If the discrepancy is above the PPM-based budget, always prefer to
765          * improve upon the previous solution.  However, if you're within the
766          * budget, try to maximize Ref * VCO, that is N / (P * R^2).
767          */
768         a = freq2k * budget * p * r2;
769         b = freq2k * budget * best->p * best->r2;
770         diff = abs_diff(freq2k * p * r2, LC_FREQ_2K * n2);
771         diff_best = abs_diff(freq2k * best->p * best->r2,
772                              LC_FREQ_2K * best->n2);
773         c = 1000000 * diff;
774         d = 1000000 * diff_best;
775
776         if (a < c && b < d) {
777                 /* If both are above the budget, pick the closer */
778                 if (best->p * best->r2 * diff < p * r2 * diff_best) {
779                         best->p = p;
780                         best->n2 = n2;
781                         best->r2 = r2;
782                 }
783         } else if (a >= c && b < d) {
784                 /* If A is below the threshold but B is above it?  Update. */
785                 best->p = p;
786                 best->n2 = n2;
787                 best->r2 = r2;
788         } else if (a >= c && b >= d) {
789                 /* Both are below the limit, so pick the higher n2/(r2*r2) */
790                 if (n2 * best->r2 * best->r2 > best->n2 * r2 * r2) {
791                         best->p = p;
792                         best->n2 = n2;
793                         best->r2 = r2;
794                 }
795         }
796         /* Otherwise a < c && b >= d, do nothing */
797 }
798
799 static void
800 hsw_ddi_calculate_wrpll(int clock /* in Hz */,
801                         unsigned *r2_out, unsigned *n2_out, unsigned *p_out)
802 {
803         u64 freq2k;
804         unsigned p, n2, r2;
805         struct hsw_wrpll_rnp best = { 0, 0, 0 };
806         unsigned budget;
807
808         freq2k = clock / 100;
809
810         budget = hsw_wrpll_get_budget_for_freq(clock);
811
812         /* Special case handling for 540 pixel clock: bypass WR PLL entirely
813          * and directly pass the LC PLL to it. */
814         if (freq2k == 5400000) {
815                 *n2_out = 2;
816                 *p_out = 1;
817                 *r2_out = 2;
818                 return;
819         }
820
821         /*
822          * Ref = LC_FREQ / R, where Ref is the actual reference input seen by
823          * the WR PLL.
824          *
825          * We want R so that REF_MIN <= Ref <= REF_MAX.
826          * Injecting R2 = 2 * R gives:
827          *   REF_MAX * r2 > LC_FREQ * 2 and
828          *   REF_MIN * r2 < LC_FREQ * 2
829          *
830          * Which means the desired boundaries for r2 are:
831          *  LC_FREQ * 2 / REF_MAX < r2 < LC_FREQ * 2 / REF_MIN
832          *
833          */
834         for (r2 = LC_FREQ * 2 / REF_MAX + 1;
835              r2 <= LC_FREQ * 2 / REF_MIN;
836              r2++) {
837
838                 /*
839                  * VCO = N * Ref, that is: VCO = N * LC_FREQ / R
840                  *
841                  * Once again we want VCO_MIN <= VCO <= VCO_MAX.
842                  * Injecting R2 = 2 * R and N2 = 2 * N, we get:
843                  *   VCO_MAX * r2 > n2 * LC_FREQ and
844                  *   VCO_MIN * r2 < n2 * LC_FREQ)
845                  *
846                  * Which means the desired boundaries for n2 are:
847                  * VCO_MIN * r2 / LC_FREQ < n2 < VCO_MAX * r2 / LC_FREQ
848                  */
849                 for (n2 = VCO_MIN * r2 / LC_FREQ + 1;
850                      n2 <= VCO_MAX * r2 / LC_FREQ;
851                      n2++) {
852
853                         for (p = P_MIN; p <= P_MAX; p += P_INC)
854                                 hsw_wrpll_update_rnp(freq2k, budget,
855                                                      r2, n2, p, &best);
856                 }
857         }
858
859         *n2_out = best.n2;
860         *p_out = best.p;
861         *r2_out = best.r2;
862 }
863
864 static struct intel_shared_dpll *
865 hsw_ddi_wrpll_get_dpll(struct intel_atomic_state *state,
866                        struct intel_crtc *crtc)
867 {
868         struct intel_crtc_state *crtc_state =
869                 intel_atomic_get_new_crtc_state(state, crtc);
870         struct intel_shared_dpll *pll;
871         u32 val;
872         unsigned int p, n2, r2;
873
874         hsw_ddi_calculate_wrpll(crtc_state->port_clock * 1000, &r2, &n2, &p);
875
876         val = WRPLL_PLL_ENABLE | WRPLL_REF_LCPLL |
877               WRPLL_DIVIDER_REFERENCE(r2) | WRPLL_DIVIDER_FEEDBACK(n2) |
878               WRPLL_DIVIDER_POST(p);
879
880         crtc_state->dpll_hw_state.wrpll = val;
881
882         pll = intel_find_shared_dpll(state, crtc,
883                                      &crtc_state->dpll_hw_state,
884                                      BIT(DPLL_ID_WRPLL2) |
885                                      BIT(DPLL_ID_WRPLL1));
886
887         if (!pll)
888                 return NULL;
889
890         return pll;
891 }
892
893 static int hsw_ddi_wrpll_get_freq(struct drm_i915_private *dev_priv,
894                                   const struct intel_shared_dpll *pll,
895                                   const struct intel_dpll_hw_state *pll_state)
896 {
897         int refclk;
898         int n, p, r;
899         u32 wrpll = pll_state->wrpll;
900
901         switch (wrpll & WRPLL_REF_MASK) {
902         case WRPLL_REF_SPECIAL_HSW:
903                 /* Muxed-SSC for BDW, non-SSC for non-ULT HSW. */
904                 if (IS_HASWELL(dev_priv) && !IS_HSW_ULT(dev_priv)) {
905                         refclk = dev_priv->dpll.ref_clks.nssc;
906                         break;
907                 }
908                 fallthrough;
909         case WRPLL_REF_PCH_SSC:
910                 /*
911                  * We could calculate spread here, but our checking
912                  * code only cares about 5% accuracy, and spread is a max of
913                  * 0.5% downspread.
914                  */
915                 refclk = dev_priv->dpll.ref_clks.ssc;
916                 break;
917         case WRPLL_REF_LCPLL:
918                 refclk = 2700000;
919                 break;
920         default:
921                 MISSING_CASE(wrpll);
922                 return 0;
923         }
924
925         r = wrpll & WRPLL_DIVIDER_REF_MASK;
926         p = (wrpll & WRPLL_DIVIDER_POST_MASK) >> WRPLL_DIVIDER_POST_SHIFT;
927         n = (wrpll & WRPLL_DIVIDER_FB_MASK) >> WRPLL_DIVIDER_FB_SHIFT;
928
929         /* Convert to KHz, p & r have a fixed point portion */
930         return (refclk * n / 10) / (p * r) * 2;
931 }
932
933 static struct intel_shared_dpll *
934 hsw_ddi_lcpll_get_dpll(struct intel_crtc_state *crtc_state)
935 {
936         struct drm_i915_private *dev_priv = to_i915(crtc_state->uapi.crtc->dev);
937         struct intel_shared_dpll *pll;
938         enum intel_dpll_id pll_id;
939         int clock = crtc_state->port_clock;
940
941         switch (clock / 2) {
942         case 81000:
943                 pll_id = DPLL_ID_LCPLL_810;
944                 break;
945         case 135000:
946                 pll_id = DPLL_ID_LCPLL_1350;
947                 break;
948         case 270000:
949                 pll_id = DPLL_ID_LCPLL_2700;
950                 break;
951         default:
952                 drm_dbg_kms(&dev_priv->drm, "Invalid clock for DP: %d\n",
953                             clock);
954                 return NULL;
955         }
956
957         pll = intel_get_shared_dpll_by_id(dev_priv, pll_id);
958
959         if (!pll)
960                 return NULL;
961
962         return pll;
963 }
964
965 static int hsw_ddi_lcpll_get_freq(struct drm_i915_private *i915,
966                                   const struct intel_shared_dpll *pll,
967                                   const struct intel_dpll_hw_state *pll_state)
968 {
969         int link_clock = 0;
970
971         switch (pll->info->id) {
972         case DPLL_ID_LCPLL_810:
973                 link_clock = 81000;
974                 break;
975         case DPLL_ID_LCPLL_1350:
976                 link_clock = 135000;
977                 break;
978         case DPLL_ID_LCPLL_2700:
979                 link_clock = 270000;
980                 break;
981         default:
982                 drm_WARN(&i915->drm, 1, "bad port clock sel\n");
983                 break;
984         }
985
986         return link_clock * 2;
987 }
988
989 static struct intel_shared_dpll *
990 hsw_ddi_spll_get_dpll(struct intel_atomic_state *state,
991                       struct intel_crtc *crtc)
992 {
993         struct intel_crtc_state *crtc_state =
994                 intel_atomic_get_new_crtc_state(state, crtc);
995
996         if (drm_WARN_ON(crtc->base.dev, crtc_state->port_clock / 2 != 135000))
997                 return NULL;
998
999         crtc_state->dpll_hw_state.spll = SPLL_PLL_ENABLE | SPLL_FREQ_1350MHz |
1000                                          SPLL_REF_MUXED_SSC;
1001
1002         return intel_find_shared_dpll(state, crtc, &crtc_state->dpll_hw_state,
1003                                       BIT(DPLL_ID_SPLL));
1004 }
1005
1006 static int hsw_ddi_spll_get_freq(struct drm_i915_private *i915,
1007                                  const struct intel_shared_dpll *pll,
1008                                  const struct intel_dpll_hw_state *pll_state)
1009 {
1010         int link_clock = 0;
1011
1012         switch (pll_state->spll & SPLL_FREQ_MASK) {
1013         case SPLL_FREQ_810MHz:
1014                 link_clock = 81000;
1015                 break;
1016         case SPLL_FREQ_1350MHz:
1017                 link_clock = 135000;
1018                 break;
1019         case SPLL_FREQ_2700MHz:
1020                 link_clock = 270000;
1021                 break;
1022         default:
1023                 drm_WARN(&i915->drm, 1, "bad spll freq\n");
1024                 break;
1025         }
1026
1027         return link_clock * 2;
1028 }
1029
1030 static bool hsw_get_dpll(struct intel_atomic_state *state,
1031                          struct intel_crtc *crtc,
1032                          struct intel_encoder *encoder)
1033 {
1034         struct intel_crtc_state *crtc_state =
1035                 intel_atomic_get_new_crtc_state(state, crtc);
1036         struct intel_shared_dpll *pll;
1037
1038         memset(&crtc_state->dpll_hw_state, 0,
1039                sizeof(crtc_state->dpll_hw_state));
1040
1041         if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_HDMI))
1042                 pll = hsw_ddi_wrpll_get_dpll(state, crtc);
1043         else if (intel_crtc_has_dp_encoder(crtc_state))
1044                 pll = hsw_ddi_lcpll_get_dpll(crtc_state);
1045         else if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_ANALOG))
1046                 pll = hsw_ddi_spll_get_dpll(state, crtc);
1047         else
1048                 return false;
1049
1050         if (!pll)
1051                 return false;
1052
1053         intel_reference_shared_dpll(state, crtc,
1054                                     pll, &crtc_state->dpll_hw_state);
1055
1056         crtc_state->shared_dpll = pll;
1057
1058         return true;
1059 }
1060
1061 static void hsw_update_dpll_ref_clks(struct drm_i915_private *i915)
1062 {
1063         i915->dpll.ref_clks.ssc = 135000;
1064         /* Non-SSC is only used on non-ULT HSW. */
1065         if (intel_de_read(i915, FUSE_STRAP3) & HSW_REF_CLK_SELECT)
1066                 i915->dpll.ref_clks.nssc = 24000;
1067         else
1068                 i915->dpll.ref_clks.nssc = 135000;
1069 }
1070
1071 static void hsw_dump_hw_state(struct drm_i915_private *dev_priv,
1072                               const struct intel_dpll_hw_state *hw_state)
1073 {
1074         drm_dbg_kms(&dev_priv->drm, "dpll_hw_state: wrpll: 0x%x spll: 0x%x\n",
1075                     hw_state->wrpll, hw_state->spll);
1076 }
1077
1078 static const struct intel_shared_dpll_funcs hsw_ddi_wrpll_funcs = {
1079         .enable = hsw_ddi_wrpll_enable,
1080         .disable = hsw_ddi_wrpll_disable,
1081         .get_hw_state = hsw_ddi_wrpll_get_hw_state,
1082         .get_freq = hsw_ddi_wrpll_get_freq,
1083 };
1084
1085 static const struct intel_shared_dpll_funcs hsw_ddi_spll_funcs = {
1086         .enable = hsw_ddi_spll_enable,
1087         .disable = hsw_ddi_spll_disable,
1088         .get_hw_state = hsw_ddi_spll_get_hw_state,
1089         .get_freq = hsw_ddi_spll_get_freq,
1090 };
1091
1092 static void hsw_ddi_lcpll_enable(struct drm_i915_private *dev_priv,
1093                                  struct intel_shared_dpll *pll)
1094 {
1095 }
1096
1097 static void hsw_ddi_lcpll_disable(struct drm_i915_private *dev_priv,
1098                                   struct intel_shared_dpll *pll)
1099 {
1100 }
1101
1102 static bool hsw_ddi_lcpll_get_hw_state(struct drm_i915_private *dev_priv,
1103                                        struct intel_shared_dpll *pll,
1104                                        struct intel_dpll_hw_state *hw_state)
1105 {
1106         return true;
1107 }
1108
1109 static const struct intel_shared_dpll_funcs hsw_ddi_lcpll_funcs = {
1110         .enable = hsw_ddi_lcpll_enable,
1111         .disable = hsw_ddi_lcpll_disable,
1112         .get_hw_state = hsw_ddi_lcpll_get_hw_state,
1113         .get_freq = hsw_ddi_lcpll_get_freq,
1114 };
1115
1116 static const struct dpll_info hsw_plls[] = {
1117         { "WRPLL 1",    &hsw_ddi_wrpll_funcs, DPLL_ID_WRPLL1,     0 },
1118         { "WRPLL 2",    &hsw_ddi_wrpll_funcs, DPLL_ID_WRPLL2,     0 },
1119         { "SPLL",       &hsw_ddi_spll_funcs,  DPLL_ID_SPLL,       0 },
1120         { "LCPLL 810",  &hsw_ddi_lcpll_funcs, DPLL_ID_LCPLL_810,  INTEL_DPLL_ALWAYS_ON },
1121         { "LCPLL 1350", &hsw_ddi_lcpll_funcs, DPLL_ID_LCPLL_1350, INTEL_DPLL_ALWAYS_ON },
1122         { "LCPLL 2700", &hsw_ddi_lcpll_funcs, DPLL_ID_LCPLL_2700, INTEL_DPLL_ALWAYS_ON },
1123         { },
1124 };
1125
1126 static const struct intel_dpll_mgr hsw_pll_mgr = {
1127         .dpll_info = hsw_plls,
1128         .get_dplls = hsw_get_dpll,
1129         .put_dplls = intel_put_dpll,
1130         .update_ref_clks = hsw_update_dpll_ref_clks,
1131         .dump_hw_state = hsw_dump_hw_state,
1132 };
1133
1134 struct skl_dpll_regs {
1135         i915_reg_t ctl, cfgcr1, cfgcr2;
1136 };
1137
1138 /* this array is indexed by the *shared* pll id */
1139 static const struct skl_dpll_regs skl_dpll_regs[4] = {
1140         {
1141                 /* DPLL 0 */
1142                 .ctl = LCPLL1_CTL,
1143                 /* DPLL 0 doesn't support HDMI mode */
1144         },
1145         {
1146                 /* DPLL 1 */
1147                 .ctl = LCPLL2_CTL,
1148                 .cfgcr1 = DPLL_CFGCR1(SKL_DPLL1),
1149                 .cfgcr2 = DPLL_CFGCR2(SKL_DPLL1),
1150         },
1151         {
1152                 /* DPLL 2 */
1153                 .ctl = WRPLL_CTL(0),
1154                 .cfgcr1 = DPLL_CFGCR1(SKL_DPLL2),
1155                 .cfgcr2 = DPLL_CFGCR2(SKL_DPLL2),
1156         },
1157         {
1158                 /* DPLL 3 */
1159                 .ctl = WRPLL_CTL(1),
1160                 .cfgcr1 = DPLL_CFGCR1(SKL_DPLL3),
1161                 .cfgcr2 = DPLL_CFGCR2(SKL_DPLL3),
1162         },
1163 };
1164
1165 static void skl_ddi_pll_write_ctrl1(struct drm_i915_private *dev_priv,
1166                                     struct intel_shared_dpll *pll)
1167 {
1168         const enum intel_dpll_id id = pll->info->id;
1169         u32 val;
1170
1171         val = intel_de_read(dev_priv, DPLL_CTRL1);
1172
1173         val &= ~(DPLL_CTRL1_HDMI_MODE(id) |
1174                  DPLL_CTRL1_SSC(id) |
1175                  DPLL_CTRL1_LINK_RATE_MASK(id));
1176         val |= pll->state.hw_state.ctrl1 << (id * 6);
1177
1178         intel_de_write(dev_priv, DPLL_CTRL1, val);
1179         intel_de_posting_read(dev_priv, DPLL_CTRL1);
1180 }
1181
1182 static void skl_ddi_pll_enable(struct drm_i915_private *dev_priv,
1183                                struct intel_shared_dpll *pll)
1184 {
1185         const struct skl_dpll_regs *regs = skl_dpll_regs;
1186         const enum intel_dpll_id id = pll->info->id;
1187
1188         skl_ddi_pll_write_ctrl1(dev_priv, pll);
1189
1190         intel_de_write(dev_priv, regs[id].cfgcr1, pll->state.hw_state.cfgcr1);
1191         intel_de_write(dev_priv, regs[id].cfgcr2, pll->state.hw_state.cfgcr2);
1192         intel_de_posting_read(dev_priv, regs[id].cfgcr1);
1193         intel_de_posting_read(dev_priv, regs[id].cfgcr2);
1194
1195         /* the enable bit is always bit 31 */
1196         intel_de_write(dev_priv, regs[id].ctl,
1197                        intel_de_read(dev_priv, regs[id].ctl) | LCPLL_PLL_ENABLE);
1198
1199         if (intel_de_wait_for_set(dev_priv, DPLL_STATUS, DPLL_LOCK(id), 5))
1200                 drm_err(&dev_priv->drm, "DPLL %d not locked\n", id);
1201 }
1202
1203 static void skl_ddi_dpll0_enable(struct drm_i915_private *dev_priv,
1204                                  struct intel_shared_dpll *pll)
1205 {
1206         skl_ddi_pll_write_ctrl1(dev_priv, pll);
1207 }
1208
1209 static void skl_ddi_pll_disable(struct drm_i915_private *dev_priv,
1210                                 struct intel_shared_dpll *pll)
1211 {
1212         const struct skl_dpll_regs *regs = skl_dpll_regs;
1213         const enum intel_dpll_id id = pll->info->id;
1214
1215         /* the enable bit is always bit 31 */
1216         intel_de_write(dev_priv, regs[id].ctl,
1217                        intel_de_read(dev_priv, regs[id].ctl) & ~LCPLL_PLL_ENABLE);
1218         intel_de_posting_read(dev_priv, regs[id].ctl);
1219 }
1220
1221 static void skl_ddi_dpll0_disable(struct drm_i915_private *dev_priv,
1222                                   struct intel_shared_dpll *pll)
1223 {
1224 }
1225
1226 static bool skl_ddi_pll_get_hw_state(struct drm_i915_private *dev_priv,
1227                                      struct intel_shared_dpll *pll,
1228                                      struct intel_dpll_hw_state *hw_state)
1229 {
1230         u32 val;
1231         const struct skl_dpll_regs *regs = skl_dpll_regs;
1232         const enum intel_dpll_id id = pll->info->id;
1233         intel_wakeref_t wakeref;
1234         bool ret;
1235
1236         wakeref = intel_display_power_get_if_enabled(dev_priv,
1237                                                      POWER_DOMAIN_DISPLAY_CORE);
1238         if (!wakeref)
1239                 return false;
1240
1241         ret = false;
1242
1243         val = intel_de_read(dev_priv, regs[id].ctl);
1244         if (!(val & LCPLL_PLL_ENABLE))
1245                 goto out;
1246
1247         val = intel_de_read(dev_priv, DPLL_CTRL1);
1248         hw_state->ctrl1 = (val >> (id * 6)) & 0x3f;
1249
1250         /* avoid reading back stale values if HDMI mode is not enabled */
1251         if (val & DPLL_CTRL1_HDMI_MODE(id)) {
1252                 hw_state->cfgcr1 = intel_de_read(dev_priv, regs[id].cfgcr1);
1253                 hw_state->cfgcr2 = intel_de_read(dev_priv, regs[id].cfgcr2);
1254         }
1255         ret = true;
1256
1257 out:
1258         intel_display_power_put(dev_priv, POWER_DOMAIN_DISPLAY_CORE, wakeref);
1259
1260         return ret;
1261 }
1262
1263 static bool skl_ddi_dpll0_get_hw_state(struct drm_i915_private *dev_priv,
1264                                        struct intel_shared_dpll *pll,
1265                                        struct intel_dpll_hw_state *hw_state)
1266 {
1267         const struct skl_dpll_regs *regs = skl_dpll_regs;
1268         const enum intel_dpll_id id = pll->info->id;
1269         intel_wakeref_t wakeref;
1270         u32 val;
1271         bool ret;
1272
1273         wakeref = intel_display_power_get_if_enabled(dev_priv,
1274                                                      POWER_DOMAIN_DISPLAY_CORE);
1275         if (!wakeref)
1276                 return false;
1277
1278         ret = false;
1279
1280         /* DPLL0 is always enabled since it drives CDCLK */
1281         val = intel_de_read(dev_priv, regs[id].ctl);
1282         if (drm_WARN_ON(&dev_priv->drm, !(val & LCPLL_PLL_ENABLE)))
1283                 goto out;
1284
1285         val = intel_de_read(dev_priv, DPLL_CTRL1);
1286         hw_state->ctrl1 = (val >> (id * 6)) & 0x3f;
1287
1288         ret = true;
1289
1290 out:
1291         intel_display_power_put(dev_priv, POWER_DOMAIN_DISPLAY_CORE, wakeref);
1292
1293         return ret;
1294 }
1295
1296 struct skl_wrpll_context {
1297         u64 min_deviation;              /* current minimal deviation */
1298         u64 central_freq;               /* chosen central freq */
1299         u64 dco_freq;                   /* chosen dco freq */
1300         unsigned int p;                 /* chosen divider */
1301 };
1302
1303 static void skl_wrpll_context_init(struct skl_wrpll_context *ctx)
1304 {
1305         memset(ctx, 0, sizeof(*ctx));
1306
1307         ctx->min_deviation = U64_MAX;
1308 }
1309
1310 /* DCO freq must be within +1%/-6%  of the DCO central freq */
1311 #define SKL_DCO_MAX_PDEVIATION  100
1312 #define SKL_DCO_MAX_NDEVIATION  600
1313
1314 static void skl_wrpll_try_divider(struct skl_wrpll_context *ctx,
1315                                   u64 central_freq,
1316                                   u64 dco_freq,
1317                                   unsigned int divider)
1318 {
1319         u64 deviation;
1320
1321         deviation = div64_u64(10000 * abs_diff(dco_freq, central_freq),
1322                               central_freq);
1323
1324         /* positive deviation */
1325         if (dco_freq >= central_freq) {
1326                 if (deviation < SKL_DCO_MAX_PDEVIATION &&
1327                     deviation < ctx->min_deviation) {
1328                         ctx->min_deviation = deviation;
1329                         ctx->central_freq = central_freq;
1330                         ctx->dco_freq = dco_freq;
1331                         ctx->p = divider;
1332                 }
1333         /* negative deviation */
1334         } else if (deviation < SKL_DCO_MAX_NDEVIATION &&
1335                    deviation < ctx->min_deviation) {
1336                 ctx->min_deviation = deviation;
1337                 ctx->central_freq = central_freq;
1338                 ctx->dco_freq = dco_freq;
1339                 ctx->p = divider;
1340         }
1341 }
1342
1343 static void skl_wrpll_get_multipliers(unsigned int p,
1344                                       unsigned int *p0 /* out */,
1345                                       unsigned int *p1 /* out */,
1346                                       unsigned int *p2 /* out */)
1347 {
1348         /* even dividers */
1349         if (p % 2 == 0) {
1350                 unsigned int half = p / 2;
1351
1352                 if (half == 1 || half == 2 || half == 3 || half == 5) {
1353                         *p0 = 2;
1354                         *p1 = 1;
1355                         *p2 = half;
1356                 } else if (half % 2 == 0) {
1357                         *p0 = 2;
1358                         *p1 = half / 2;
1359                         *p2 = 2;
1360                 } else if (half % 3 == 0) {
1361                         *p0 = 3;
1362                         *p1 = half / 3;
1363                         *p2 = 2;
1364                 } else if (half % 7 == 0) {
1365                         *p0 = 7;
1366                         *p1 = half / 7;
1367                         *p2 = 2;
1368                 }
1369         } else if (p == 3 || p == 9) {  /* 3, 5, 7, 9, 15, 21, 35 */
1370                 *p0 = 3;
1371                 *p1 = 1;
1372                 *p2 = p / 3;
1373         } else if (p == 5 || p == 7) {
1374                 *p0 = p;
1375                 *p1 = 1;
1376                 *p2 = 1;
1377         } else if (p == 15) {
1378                 *p0 = 3;
1379                 *p1 = 1;
1380                 *p2 = 5;
1381         } else if (p == 21) {
1382                 *p0 = 7;
1383                 *p1 = 1;
1384                 *p2 = 3;
1385         } else if (p == 35) {
1386                 *p0 = 7;
1387                 *p1 = 1;
1388                 *p2 = 5;
1389         }
1390 }
1391
1392 struct skl_wrpll_params {
1393         u32 dco_fraction;
1394         u32 dco_integer;
1395         u32 qdiv_ratio;
1396         u32 qdiv_mode;
1397         u32 kdiv;
1398         u32 pdiv;
1399         u32 central_freq;
1400 };
1401
1402 static void skl_wrpll_params_populate(struct skl_wrpll_params *params,
1403                                       u64 afe_clock,
1404                                       int ref_clock,
1405                                       u64 central_freq,
1406                                       u32 p0, u32 p1, u32 p2)
1407 {
1408         u64 dco_freq;
1409
1410         switch (central_freq) {
1411         case 9600000000ULL:
1412                 params->central_freq = 0;
1413                 break;
1414         case 9000000000ULL:
1415                 params->central_freq = 1;
1416                 break;
1417         case 8400000000ULL:
1418                 params->central_freq = 3;
1419         }
1420
1421         switch (p0) {
1422         case 1:
1423                 params->pdiv = 0;
1424                 break;
1425         case 2:
1426                 params->pdiv = 1;
1427                 break;
1428         case 3:
1429                 params->pdiv = 2;
1430                 break;
1431         case 7:
1432                 params->pdiv = 4;
1433                 break;
1434         default:
1435                 WARN(1, "Incorrect PDiv\n");
1436         }
1437
1438         switch (p2) {
1439         case 5:
1440                 params->kdiv = 0;
1441                 break;
1442         case 2:
1443                 params->kdiv = 1;
1444                 break;
1445         case 3:
1446                 params->kdiv = 2;
1447                 break;
1448         case 1:
1449                 params->kdiv = 3;
1450                 break;
1451         default:
1452                 WARN(1, "Incorrect KDiv\n");
1453         }
1454
1455         params->qdiv_ratio = p1;
1456         params->qdiv_mode = (params->qdiv_ratio == 1) ? 0 : 1;
1457
1458         dco_freq = p0 * p1 * p2 * afe_clock;
1459
1460         /*
1461          * Intermediate values are in Hz.
1462          * Divide by MHz to match bsepc
1463          */
1464         params->dco_integer = div_u64(dco_freq, ref_clock * KHz(1));
1465         params->dco_fraction =
1466                 div_u64((div_u64(dco_freq, ref_clock / KHz(1)) -
1467                          params->dco_integer * MHz(1)) * 0x8000, MHz(1));
1468 }
1469
1470 static bool
1471 skl_ddi_calculate_wrpll(int clock /* in Hz */,
1472                         int ref_clock,
1473                         struct skl_wrpll_params *wrpll_params)
1474 {
1475         u64 afe_clock = clock * 5; /* AFE Clock is 5x Pixel clock */
1476         u64 dco_central_freq[3] = { 8400000000ULL,
1477                                     9000000000ULL,
1478                                     9600000000ULL };
1479         static const int even_dividers[] = {  4,  6,  8, 10, 12, 14, 16, 18, 20,
1480                                              24, 28, 30, 32, 36, 40, 42, 44,
1481                                              48, 52, 54, 56, 60, 64, 66, 68,
1482                                              70, 72, 76, 78, 80, 84, 88, 90,
1483                                              92, 96, 98 };
1484         static const int odd_dividers[] = { 3, 5, 7, 9, 15, 21, 35 };
1485         static const struct {
1486                 const int *list;
1487                 int n_dividers;
1488         } dividers[] = {
1489                 { even_dividers, ARRAY_SIZE(even_dividers) },
1490                 { odd_dividers, ARRAY_SIZE(odd_dividers) },
1491         };
1492         struct skl_wrpll_context ctx;
1493         unsigned int dco, d, i;
1494         unsigned int p0, p1, p2;
1495
1496         skl_wrpll_context_init(&ctx);
1497
1498         for (d = 0; d < ARRAY_SIZE(dividers); d++) {
1499                 for (dco = 0; dco < ARRAY_SIZE(dco_central_freq); dco++) {
1500                         for (i = 0; i < dividers[d].n_dividers; i++) {
1501                                 unsigned int p = dividers[d].list[i];
1502                                 u64 dco_freq = p * afe_clock;
1503
1504                                 skl_wrpll_try_divider(&ctx,
1505                                                       dco_central_freq[dco],
1506                                                       dco_freq,
1507                                                       p);
1508                                 /*
1509                                  * Skip the remaining dividers if we're sure to
1510                                  * have found the definitive divider, we can't
1511                                  * improve a 0 deviation.
1512                                  */
1513                                 if (ctx.min_deviation == 0)
1514                                         goto skip_remaining_dividers;
1515                         }
1516                 }
1517
1518 skip_remaining_dividers:
1519                 /*
1520                  * If a solution is found with an even divider, prefer
1521                  * this one.
1522                  */
1523                 if (d == 0 && ctx.p)
1524                         break;
1525         }
1526
1527         if (!ctx.p) {
1528                 DRM_DEBUG_DRIVER("No valid divider found for %dHz\n", clock);
1529                 return false;
1530         }
1531
1532         /*
1533          * gcc incorrectly analyses that these can be used without being
1534          * initialized. To be fair, it's hard to guess.
1535          */
1536         p0 = p1 = p2 = 0;
1537         skl_wrpll_get_multipliers(ctx.p, &p0, &p1, &p2);
1538         skl_wrpll_params_populate(wrpll_params, afe_clock, ref_clock,
1539                                   ctx.central_freq, p0, p1, p2);
1540
1541         return true;
1542 }
1543
1544 static bool skl_ddi_hdmi_pll_dividers(struct intel_crtc_state *crtc_state)
1545 {
1546         struct drm_i915_private *i915 = to_i915(crtc_state->uapi.crtc->dev);
1547         u32 ctrl1, cfgcr1, cfgcr2;
1548         struct skl_wrpll_params wrpll_params = { 0, };
1549
1550         /*
1551          * See comment in intel_dpll_hw_state to understand why we always use 0
1552          * as the DPLL id in this function.
1553          */
1554         ctrl1 = DPLL_CTRL1_OVERRIDE(0);
1555
1556         ctrl1 |= DPLL_CTRL1_HDMI_MODE(0);
1557
1558         if (!skl_ddi_calculate_wrpll(crtc_state->port_clock * 1000,
1559                                      i915->dpll.ref_clks.nssc,
1560                                      &wrpll_params))
1561                 return false;
1562
1563         cfgcr1 = DPLL_CFGCR1_FREQ_ENABLE |
1564                 DPLL_CFGCR1_DCO_FRACTION(wrpll_params.dco_fraction) |
1565                 wrpll_params.dco_integer;
1566
1567         cfgcr2 = DPLL_CFGCR2_QDIV_RATIO(wrpll_params.qdiv_ratio) |
1568                 DPLL_CFGCR2_QDIV_MODE(wrpll_params.qdiv_mode) |
1569                 DPLL_CFGCR2_KDIV(wrpll_params.kdiv) |
1570                 DPLL_CFGCR2_PDIV(wrpll_params.pdiv) |
1571                 wrpll_params.central_freq;
1572
1573         memset(&crtc_state->dpll_hw_state, 0,
1574                sizeof(crtc_state->dpll_hw_state));
1575
1576         crtc_state->dpll_hw_state.ctrl1 = ctrl1;
1577         crtc_state->dpll_hw_state.cfgcr1 = cfgcr1;
1578         crtc_state->dpll_hw_state.cfgcr2 = cfgcr2;
1579         return true;
1580 }
1581
1582 static int skl_ddi_wrpll_get_freq(struct drm_i915_private *i915,
1583                                   const struct intel_shared_dpll *pll,
1584                                   const struct intel_dpll_hw_state *pll_state)
1585 {
1586         int ref_clock = i915->dpll.ref_clks.nssc;
1587         u32 p0, p1, p2, dco_freq;
1588
1589         p0 = pll_state->cfgcr2 & DPLL_CFGCR2_PDIV_MASK;
1590         p2 = pll_state->cfgcr2 & DPLL_CFGCR2_KDIV_MASK;
1591
1592         if (pll_state->cfgcr2 &  DPLL_CFGCR2_QDIV_MODE(1))
1593                 p1 = (pll_state->cfgcr2 & DPLL_CFGCR2_QDIV_RATIO_MASK) >> 8;
1594         else
1595                 p1 = 1;
1596
1597
1598         switch (p0) {
1599         case DPLL_CFGCR2_PDIV_1:
1600                 p0 = 1;
1601                 break;
1602         case DPLL_CFGCR2_PDIV_2:
1603                 p0 = 2;
1604                 break;
1605         case DPLL_CFGCR2_PDIV_3:
1606                 p0 = 3;
1607                 break;
1608         case DPLL_CFGCR2_PDIV_7_INVALID:
1609                 /*
1610                  * Incorrect ASUS-Z170M BIOS setting, the HW seems to ignore bit#0,
1611                  * handling it the same way as PDIV_7.
1612                  */
1613                 drm_dbg_kms(&i915->drm, "Invalid WRPLL PDIV divider value, fixing it.\n");
1614                 fallthrough;
1615         case DPLL_CFGCR2_PDIV_7:
1616                 p0 = 7;
1617                 break;
1618         default:
1619                 MISSING_CASE(p0);
1620                 return 0;
1621         }
1622
1623         switch (p2) {
1624         case DPLL_CFGCR2_KDIV_5:
1625                 p2 = 5;
1626                 break;
1627         case DPLL_CFGCR2_KDIV_2:
1628                 p2 = 2;
1629                 break;
1630         case DPLL_CFGCR2_KDIV_3:
1631                 p2 = 3;
1632                 break;
1633         case DPLL_CFGCR2_KDIV_1:
1634                 p2 = 1;
1635                 break;
1636         default:
1637                 MISSING_CASE(p2);
1638                 return 0;
1639         }
1640
1641         dco_freq = (pll_state->cfgcr1 & DPLL_CFGCR1_DCO_INTEGER_MASK) *
1642                    ref_clock;
1643
1644         dco_freq += ((pll_state->cfgcr1 & DPLL_CFGCR1_DCO_FRACTION_MASK) >> 9) *
1645                     ref_clock / 0x8000;
1646
1647         if (drm_WARN_ON(&i915->drm, p0 == 0 || p1 == 0 || p2 == 0))
1648                 return 0;
1649
1650         return dco_freq / (p0 * p1 * p2 * 5);
1651 }
1652
1653 static bool
1654 skl_ddi_dp_set_dpll_hw_state(struct intel_crtc_state *crtc_state)
1655 {
1656         u32 ctrl1;
1657
1658         /*
1659          * See comment in intel_dpll_hw_state to understand why we always use 0
1660          * as the DPLL id in this function.
1661          */
1662         ctrl1 = DPLL_CTRL1_OVERRIDE(0);
1663         switch (crtc_state->port_clock / 2) {
1664         case 81000:
1665                 ctrl1 |= DPLL_CTRL1_LINK_RATE(DPLL_CTRL1_LINK_RATE_810, 0);
1666                 break;
1667         case 135000:
1668                 ctrl1 |= DPLL_CTRL1_LINK_RATE(DPLL_CTRL1_LINK_RATE_1350, 0);
1669                 break;
1670         case 270000:
1671                 ctrl1 |= DPLL_CTRL1_LINK_RATE(DPLL_CTRL1_LINK_RATE_2700, 0);
1672                 break;
1673                 /* eDP 1.4 rates */
1674         case 162000:
1675                 ctrl1 |= DPLL_CTRL1_LINK_RATE(DPLL_CTRL1_LINK_RATE_1620, 0);
1676                 break;
1677         case 108000:
1678                 ctrl1 |= DPLL_CTRL1_LINK_RATE(DPLL_CTRL1_LINK_RATE_1080, 0);
1679                 break;
1680         case 216000:
1681                 ctrl1 |= DPLL_CTRL1_LINK_RATE(DPLL_CTRL1_LINK_RATE_2160, 0);
1682                 break;
1683         }
1684
1685         memset(&crtc_state->dpll_hw_state, 0,
1686                sizeof(crtc_state->dpll_hw_state));
1687
1688         crtc_state->dpll_hw_state.ctrl1 = ctrl1;
1689
1690         return true;
1691 }
1692
1693 static int skl_ddi_lcpll_get_freq(struct drm_i915_private *i915,
1694                                   const struct intel_shared_dpll *pll,
1695                                   const struct intel_dpll_hw_state *pll_state)
1696 {
1697         int link_clock = 0;
1698
1699         switch ((pll_state->ctrl1 & DPLL_CTRL1_LINK_RATE_MASK(0)) >>
1700                 DPLL_CTRL1_LINK_RATE_SHIFT(0)) {
1701         case DPLL_CTRL1_LINK_RATE_810:
1702                 link_clock = 81000;
1703                 break;
1704         case DPLL_CTRL1_LINK_RATE_1080:
1705                 link_clock = 108000;
1706                 break;
1707         case DPLL_CTRL1_LINK_RATE_1350:
1708                 link_clock = 135000;
1709                 break;
1710         case DPLL_CTRL1_LINK_RATE_1620:
1711                 link_clock = 162000;
1712                 break;
1713         case DPLL_CTRL1_LINK_RATE_2160:
1714                 link_clock = 216000;
1715                 break;
1716         case DPLL_CTRL1_LINK_RATE_2700:
1717                 link_clock = 270000;
1718                 break;
1719         default:
1720                 drm_WARN(&i915->drm, 1, "Unsupported link rate\n");
1721                 break;
1722         }
1723
1724         return link_clock * 2;
1725 }
1726
1727 static bool skl_get_dpll(struct intel_atomic_state *state,
1728                          struct intel_crtc *crtc,
1729                          struct intel_encoder *encoder)
1730 {
1731         struct intel_crtc_state *crtc_state =
1732                 intel_atomic_get_new_crtc_state(state, crtc);
1733         struct drm_i915_private *i915 = to_i915(crtc->base.dev);
1734         struct intel_shared_dpll *pll;
1735         bool bret;
1736
1737         if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_HDMI)) {
1738                 bret = skl_ddi_hdmi_pll_dividers(crtc_state);
1739                 if (!bret) {
1740                         drm_dbg_kms(&i915->drm,
1741                                     "Could not get HDMI pll dividers.\n");
1742                         return false;
1743                 }
1744         } else if (intel_crtc_has_dp_encoder(crtc_state)) {
1745                 bret = skl_ddi_dp_set_dpll_hw_state(crtc_state);
1746                 if (!bret) {
1747                         drm_dbg_kms(&i915->drm,
1748                                     "Could not set DP dpll HW state.\n");
1749                         return false;
1750                 }
1751         } else {
1752                 return false;
1753         }
1754
1755         if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_EDP))
1756                 pll = intel_find_shared_dpll(state, crtc,
1757                                              &crtc_state->dpll_hw_state,
1758                                              BIT(DPLL_ID_SKL_DPLL0));
1759         else
1760                 pll = intel_find_shared_dpll(state, crtc,
1761                                              &crtc_state->dpll_hw_state,
1762                                              BIT(DPLL_ID_SKL_DPLL3) |
1763                                              BIT(DPLL_ID_SKL_DPLL2) |
1764                                              BIT(DPLL_ID_SKL_DPLL1));
1765         if (!pll)
1766                 return false;
1767
1768         intel_reference_shared_dpll(state, crtc,
1769                                     pll, &crtc_state->dpll_hw_state);
1770
1771         crtc_state->shared_dpll = pll;
1772
1773         return true;
1774 }
1775
1776 static int skl_ddi_pll_get_freq(struct drm_i915_private *i915,
1777                                 const struct intel_shared_dpll *pll,
1778                                 const struct intel_dpll_hw_state *pll_state)
1779 {
1780         /*
1781          * ctrl1 register is already shifted for each pll, just use 0 to get
1782          * the internal shift for each field
1783          */
1784         if (pll_state->ctrl1 & DPLL_CTRL1_HDMI_MODE(0))
1785                 return skl_ddi_wrpll_get_freq(i915, pll, pll_state);
1786         else
1787                 return skl_ddi_lcpll_get_freq(i915, pll, pll_state);
1788 }
1789
1790 static void skl_update_dpll_ref_clks(struct drm_i915_private *i915)
1791 {
1792         /* No SSC ref */
1793         i915->dpll.ref_clks.nssc = i915->cdclk.hw.ref;
1794 }
1795
1796 static void skl_dump_hw_state(struct drm_i915_private *dev_priv,
1797                               const struct intel_dpll_hw_state *hw_state)
1798 {
1799         drm_dbg_kms(&dev_priv->drm, "dpll_hw_state: "
1800                       "ctrl1: 0x%x, cfgcr1: 0x%x, cfgcr2: 0x%x\n",
1801                       hw_state->ctrl1,
1802                       hw_state->cfgcr1,
1803                       hw_state->cfgcr2);
1804 }
1805
1806 static const struct intel_shared_dpll_funcs skl_ddi_pll_funcs = {
1807         .enable = skl_ddi_pll_enable,
1808         .disable = skl_ddi_pll_disable,
1809         .get_hw_state = skl_ddi_pll_get_hw_state,
1810         .get_freq = skl_ddi_pll_get_freq,
1811 };
1812
1813 static const struct intel_shared_dpll_funcs skl_ddi_dpll0_funcs = {
1814         .enable = skl_ddi_dpll0_enable,
1815         .disable = skl_ddi_dpll0_disable,
1816         .get_hw_state = skl_ddi_dpll0_get_hw_state,
1817         .get_freq = skl_ddi_pll_get_freq,
1818 };
1819
1820 static const struct dpll_info skl_plls[] = {
1821         { "DPLL 0", &skl_ddi_dpll0_funcs, DPLL_ID_SKL_DPLL0, INTEL_DPLL_ALWAYS_ON },
1822         { "DPLL 1", &skl_ddi_pll_funcs,   DPLL_ID_SKL_DPLL1, 0 },
1823         { "DPLL 2", &skl_ddi_pll_funcs,   DPLL_ID_SKL_DPLL2, 0 },
1824         { "DPLL 3", &skl_ddi_pll_funcs,   DPLL_ID_SKL_DPLL3, 0 },
1825         { },
1826 };
1827
1828 static const struct intel_dpll_mgr skl_pll_mgr = {
1829         .dpll_info = skl_plls,
1830         .get_dplls = skl_get_dpll,
1831         .put_dplls = intel_put_dpll,
1832         .update_ref_clks = skl_update_dpll_ref_clks,
1833         .dump_hw_state = skl_dump_hw_state,
1834 };
1835
1836 static void bxt_ddi_pll_enable(struct drm_i915_private *dev_priv,
1837                                 struct intel_shared_dpll *pll)
1838 {
1839         u32 temp;
1840         enum port port = (enum port)pll->info->id; /* 1:1 port->PLL mapping */
1841         enum dpio_phy phy;
1842         enum dpio_channel ch;
1843
1844         bxt_port_to_phy_channel(dev_priv, port, &phy, &ch);
1845
1846         /* Non-SSC reference */
1847         temp = intel_de_read(dev_priv, BXT_PORT_PLL_ENABLE(port));
1848         temp |= PORT_PLL_REF_SEL;
1849         intel_de_write(dev_priv, BXT_PORT_PLL_ENABLE(port), temp);
1850
1851         if (IS_GEMINILAKE(dev_priv)) {
1852                 temp = intel_de_read(dev_priv, BXT_PORT_PLL_ENABLE(port));
1853                 temp |= PORT_PLL_POWER_ENABLE;
1854                 intel_de_write(dev_priv, BXT_PORT_PLL_ENABLE(port), temp);
1855
1856                 if (wait_for_us((intel_de_read(dev_priv, BXT_PORT_PLL_ENABLE(port)) &
1857                                  PORT_PLL_POWER_STATE), 200))
1858                         drm_err(&dev_priv->drm,
1859                                 "Power state not set for PLL:%d\n", port);
1860         }
1861
1862         /* Disable 10 bit clock */
1863         temp = intel_de_read(dev_priv, BXT_PORT_PLL_EBB_4(phy, ch));
1864         temp &= ~PORT_PLL_10BIT_CLK_ENABLE;
1865         intel_de_write(dev_priv, BXT_PORT_PLL_EBB_4(phy, ch), temp);
1866
1867         /* Write P1 & P2 */
1868         temp = intel_de_read(dev_priv, BXT_PORT_PLL_EBB_0(phy, ch));
1869         temp &= ~(PORT_PLL_P1_MASK | PORT_PLL_P2_MASK);
1870         temp |= pll->state.hw_state.ebb0;
1871         intel_de_write(dev_priv, BXT_PORT_PLL_EBB_0(phy, ch), temp);
1872
1873         /* Write M2 integer */
1874         temp = intel_de_read(dev_priv, BXT_PORT_PLL(phy, ch, 0));
1875         temp &= ~PORT_PLL_M2_MASK;
1876         temp |= pll->state.hw_state.pll0;
1877         intel_de_write(dev_priv, BXT_PORT_PLL(phy, ch, 0), temp);
1878
1879         /* Write N */
1880         temp = intel_de_read(dev_priv, BXT_PORT_PLL(phy, ch, 1));
1881         temp &= ~PORT_PLL_N_MASK;
1882         temp |= pll->state.hw_state.pll1;
1883         intel_de_write(dev_priv, BXT_PORT_PLL(phy, ch, 1), temp);
1884
1885         /* Write M2 fraction */
1886         temp = intel_de_read(dev_priv, BXT_PORT_PLL(phy, ch, 2));
1887         temp &= ~PORT_PLL_M2_FRAC_MASK;
1888         temp |= pll->state.hw_state.pll2;
1889         intel_de_write(dev_priv, BXT_PORT_PLL(phy, ch, 2), temp);
1890
1891         /* Write M2 fraction enable */
1892         temp = intel_de_read(dev_priv, BXT_PORT_PLL(phy, ch, 3));
1893         temp &= ~PORT_PLL_M2_FRAC_ENABLE;
1894         temp |= pll->state.hw_state.pll3;
1895         intel_de_write(dev_priv, BXT_PORT_PLL(phy, ch, 3), temp);
1896
1897         /* Write coeff */
1898         temp = intel_de_read(dev_priv, BXT_PORT_PLL(phy, ch, 6));
1899         temp &= ~PORT_PLL_PROP_COEFF_MASK;
1900         temp &= ~PORT_PLL_INT_COEFF_MASK;
1901         temp &= ~PORT_PLL_GAIN_CTL_MASK;
1902         temp |= pll->state.hw_state.pll6;
1903         intel_de_write(dev_priv, BXT_PORT_PLL(phy, ch, 6), temp);
1904
1905         /* Write calibration val */
1906         temp = intel_de_read(dev_priv, BXT_PORT_PLL(phy, ch, 8));
1907         temp &= ~PORT_PLL_TARGET_CNT_MASK;
1908         temp |= pll->state.hw_state.pll8;
1909         intel_de_write(dev_priv, BXT_PORT_PLL(phy, ch, 8), temp);
1910
1911         temp = intel_de_read(dev_priv, BXT_PORT_PLL(phy, ch, 9));
1912         temp &= ~PORT_PLL_LOCK_THRESHOLD_MASK;
1913         temp |= pll->state.hw_state.pll9;
1914         intel_de_write(dev_priv, BXT_PORT_PLL(phy, ch, 9), temp);
1915
1916         temp = intel_de_read(dev_priv, BXT_PORT_PLL(phy, ch, 10));
1917         temp &= ~PORT_PLL_DCO_AMP_OVR_EN_H;
1918         temp &= ~PORT_PLL_DCO_AMP_MASK;
1919         temp |= pll->state.hw_state.pll10;
1920         intel_de_write(dev_priv, BXT_PORT_PLL(phy, ch, 10), temp);
1921
1922         /* Recalibrate with new settings */
1923         temp = intel_de_read(dev_priv, BXT_PORT_PLL_EBB_4(phy, ch));
1924         temp |= PORT_PLL_RECALIBRATE;
1925         intel_de_write(dev_priv, BXT_PORT_PLL_EBB_4(phy, ch), temp);
1926         temp &= ~PORT_PLL_10BIT_CLK_ENABLE;
1927         temp |= pll->state.hw_state.ebb4;
1928         intel_de_write(dev_priv, BXT_PORT_PLL_EBB_4(phy, ch), temp);
1929
1930         /* Enable PLL */
1931         temp = intel_de_read(dev_priv, BXT_PORT_PLL_ENABLE(port));
1932         temp |= PORT_PLL_ENABLE;
1933         intel_de_write(dev_priv, BXT_PORT_PLL_ENABLE(port), temp);
1934         intel_de_posting_read(dev_priv, BXT_PORT_PLL_ENABLE(port));
1935
1936         if (wait_for_us((intel_de_read(dev_priv, BXT_PORT_PLL_ENABLE(port)) & PORT_PLL_LOCK),
1937                         200))
1938                 drm_err(&dev_priv->drm, "PLL %d not locked\n", port);
1939
1940         if (IS_GEMINILAKE(dev_priv)) {
1941                 temp = intel_de_read(dev_priv, BXT_PORT_TX_DW5_LN0(phy, ch));
1942                 temp |= DCC_DELAY_RANGE_2;
1943                 intel_de_write(dev_priv, BXT_PORT_TX_DW5_GRP(phy, ch), temp);
1944         }
1945
1946         /*
1947          * While we write to the group register to program all lanes at once we
1948          * can read only lane registers and we pick lanes 0/1 for that.
1949          */
1950         temp = intel_de_read(dev_priv, BXT_PORT_PCS_DW12_LN01(phy, ch));
1951         temp &= ~LANE_STAGGER_MASK;
1952         temp &= ~LANESTAGGER_STRAP_OVRD;
1953         temp |= pll->state.hw_state.pcsdw12;
1954         intel_de_write(dev_priv, BXT_PORT_PCS_DW12_GRP(phy, ch), temp);
1955 }
1956
1957 static void bxt_ddi_pll_disable(struct drm_i915_private *dev_priv,
1958                                         struct intel_shared_dpll *pll)
1959 {
1960         enum port port = (enum port)pll->info->id; /* 1:1 port->PLL mapping */
1961         u32 temp;
1962
1963         temp = intel_de_read(dev_priv, BXT_PORT_PLL_ENABLE(port));
1964         temp &= ~PORT_PLL_ENABLE;
1965         intel_de_write(dev_priv, BXT_PORT_PLL_ENABLE(port), temp);
1966         intel_de_posting_read(dev_priv, BXT_PORT_PLL_ENABLE(port));
1967
1968         if (IS_GEMINILAKE(dev_priv)) {
1969                 temp = intel_de_read(dev_priv, BXT_PORT_PLL_ENABLE(port));
1970                 temp &= ~PORT_PLL_POWER_ENABLE;
1971                 intel_de_write(dev_priv, BXT_PORT_PLL_ENABLE(port), temp);
1972
1973                 if (wait_for_us(!(intel_de_read(dev_priv, BXT_PORT_PLL_ENABLE(port)) &
1974                                   PORT_PLL_POWER_STATE), 200))
1975                         drm_err(&dev_priv->drm,
1976                                 "Power state not reset for PLL:%d\n", port);
1977         }
1978 }
1979
1980 static bool bxt_ddi_pll_get_hw_state(struct drm_i915_private *dev_priv,
1981                                         struct intel_shared_dpll *pll,
1982                                         struct intel_dpll_hw_state *hw_state)
1983 {
1984         enum port port = (enum port)pll->info->id; /* 1:1 port->PLL mapping */
1985         intel_wakeref_t wakeref;
1986         enum dpio_phy phy;
1987         enum dpio_channel ch;
1988         u32 val;
1989         bool ret;
1990
1991         bxt_port_to_phy_channel(dev_priv, port, &phy, &ch);
1992
1993         wakeref = intel_display_power_get_if_enabled(dev_priv,
1994                                                      POWER_DOMAIN_DISPLAY_CORE);
1995         if (!wakeref)
1996                 return false;
1997
1998         ret = false;
1999
2000         val = intel_de_read(dev_priv, BXT_PORT_PLL_ENABLE(port));
2001         if (!(val & PORT_PLL_ENABLE))
2002                 goto out;
2003
2004         hw_state->ebb0 = intel_de_read(dev_priv, BXT_PORT_PLL_EBB_0(phy, ch));
2005         hw_state->ebb0 &= PORT_PLL_P1_MASK | PORT_PLL_P2_MASK;
2006
2007         hw_state->ebb4 = intel_de_read(dev_priv, BXT_PORT_PLL_EBB_4(phy, ch));
2008         hw_state->ebb4 &= PORT_PLL_10BIT_CLK_ENABLE;
2009
2010         hw_state->pll0 = intel_de_read(dev_priv, BXT_PORT_PLL(phy, ch, 0));
2011         hw_state->pll0 &= PORT_PLL_M2_MASK;
2012
2013         hw_state->pll1 = intel_de_read(dev_priv, BXT_PORT_PLL(phy, ch, 1));
2014         hw_state->pll1 &= PORT_PLL_N_MASK;
2015
2016         hw_state->pll2 = intel_de_read(dev_priv, BXT_PORT_PLL(phy, ch, 2));
2017         hw_state->pll2 &= PORT_PLL_M2_FRAC_MASK;
2018
2019         hw_state->pll3 = intel_de_read(dev_priv, BXT_PORT_PLL(phy, ch, 3));
2020         hw_state->pll3 &= PORT_PLL_M2_FRAC_ENABLE;
2021
2022         hw_state->pll6 = intel_de_read(dev_priv, BXT_PORT_PLL(phy, ch, 6));
2023         hw_state->pll6 &= PORT_PLL_PROP_COEFF_MASK |
2024                           PORT_PLL_INT_COEFF_MASK |
2025                           PORT_PLL_GAIN_CTL_MASK;
2026
2027         hw_state->pll8 = intel_de_read(dev_priv, BXT_PORT_PLL(phy, ch, 8));
2028         hw_state->pll8 &= PORT_PLL_TARGET_CNT_MASK;
2029
2030         hw_state->pll9 = intel_de_read(dev_priv, BXT_PORT_PLL(phy, ch, 9));
2031         hw_state->pll9 &= PORT_PLL_LOCK_THRESHOLD_MASK;
2032
2033         hw_state->pll10 = intel_de_read(dev_priv, BXT_PORT_PLL(phy, ch, 10));
2034         hw_state->pll10 &= PORT_PLL_DCO_AMP_OVR_EN_H |
2035                            PORT_PLL_DCO_AMP_MASK;
2036
2037         /*
2038          * While we write to the group register to program all lanes at once we
2039          * can read only lane registers. We configure all lanes the same way, so
2040          * here just read out lanes 0/1 and output a note if lanes 2/3 differ.
2041          */
2042         hw_state->pcsdw12 = intel_de_read(dev_priv,
2043                                           BXT_PORT_PCS_DW12_LN01(phy, ch));
2044         if (intel_de_read(dev_priv, BXT_PORT_PCS_DW12_LN23(phy, ch)) != hw_state->pcsdw12)
2045                 drm_dbg(&dev_priv->drm,
2046                         "lane stagger config different for lane 01 (%08x) and 23 (%08x)\n",
2047                         hw_state->pcsdw12,
2048                         intel_de_read(dev_priv,
2049                                       BXT_PORT_PCS_DW12_LN23(phy, ch)));
2050         hw_state->pcsdw12 &= LANE_STAGGER_MASK | LANESTAGGER_STRAP_OVRD;
2051
2052         ret = true;
2053
2054 out:
2055         intel_display_power_put(dev_priv, POWER_DOMAIN_DISPLAY_CORE, wakeref);
2056
2057         return ret;
2058 }
2059
2060 /* bxt clock parameters */
2061 struct bxt_clk_div {
2062         int clock;
2063         u32 p1;
2064         u32 p2;
2065         u32 m2_int;
2066         u32 m2_frac;
2067         bool m2_frac_en;
2068         u32 n;
2069
2070         int vco;
2071 };
2072
2073 /* pre-calculated values for DP linkrates */
2074 static const struct bxt_clk_div bxt_dp_clk_val[] = {
2075         {162000, 4, 2, 32, 1677722, 1, 1},
2076         {270000, 4, 1, 27,       0, 0, 1},
2077         {540000, 2, 1, 27,       0, 0, 1},
2078         {216000, 3, 2, 32, 1677722, 1, 1},
2079         {243000, 4, 1, 24, 1258291, 1, 1},
2080         {324000, 4, 1, 32, 1677722, 1, 1},
2081         {432000, 3, 1, 32, 1677722, 1, 1}
2082 };
2083
2084 static bool
2085 bxt_ddi_hdmi_pll_dividers(struct intel_crtc_state *crtc_state,
2086                           struct bxt_clk_div *clk_div)
2087 {
2088         struct drm_i915_private *i915 = to_i915(crtc_state->uapi.crtc->dev);
2089         struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
2090         struct dpll best_clock;
2091
2092         /* Calculate HDMI div */
2093         /*
2094          * FIXME: tie the following calculation into
2095          * i9xx_crtc_compute_clock
2096          */
2097         if (!bxt_find_best_dpll(crtc_state, &best_clock)) {
2098                 drm_dbg(&i915->drm, "no PLL dividers found for clock %d pipe %c\n",
2099                         crtc_state->port_clock,
2100                         pipe_name(crtc->pipe));
2101                 return false;
2102         }
2103
2104         clk_div->p1 = best_clock.p1;
2105         clk_div->p2 = best_clock.p2;
2106         drm_WARN_ON(&i915->drm, best_clock.m1 != 2);
2107         clk_div->n = best_clock.n;
2108         clk_div->m2_int = best_clock.m2 >> 22;
2109         clk_div->m2_frac = best_clock.m2 & ((1 << 22) - 1);
2110         clk_div->m2_frac_en = clk_div->m2_frac != 0;
2111
2112         clk_div->vco = best_clock.vco;
2113
2114         return true;
2115 }
2116
2117 static void bxt_ddi_dp_pll_dividers(struct intel_crtc_state *crtc_state,
2118                                     struct bxt_clk_div *clk_div)
2119 {
2120         int clock = crtc_state->port_clock;
2121         int i;
2122
2123         *clk_div = bxt_dp_clk_val[0];
2124         for (i = 0; i < ARRAY_SIZE(bxt_dp_clk_val); ++i) {
2125                 if (bxt_dp_clk_val[i].clock == clock) {
2126                         *clk_div = bxt_dp_clk_val[i];
2127                         break;
2128                 }
2129         }
2130
2131         clk_div->vco = clock * 10 / 2 * clk_div->p1 * clk_div->p2;
2132 }
2133
2134 static bool bxt_ddi_set_dpll_hw_state(struct intel_crtc_state *crtc_state,
2135                                       const struct bxt_clk_div *clk_div)
2136 {
2137         struct drm_i915_private *i915 = to_i915(crtc_state->uapi.crtc->dev);
2138         struct intel_dpll_hw_state *dpll_hw_state = &crtc_state->dpll_hw_state;
2139         int clock = crtc_state->port_clock;
2140         int vco = clk_div->vco;
2141         u32 prop_coef, int_coef, gain_ctl, targ_cnt;
2142         u32 lanestagger;
2143
2144         memset(dpll_hw_state, 0, sizeof(*dpll_hw_state));
2145
2146         if (vco >= 6200000 && vco <= 6700000) {
2147                 prop_coef = 4;
2148                 int_coef = 9;
2149                 gain_ctl = 3;
2150                 targ_cnt = 8;
2151         } else if ((vco > 5400000 && vco < 6200000) ||
2152                         (vco >= 4800000 && vco < 5400000)) {
2153                 prop_coef = 5;
2154                 int_coef = 11;
2155                 gain_ctl = 3;
2156                 targ_cnt = 9;
2157         } else if (vco == 5400000) {
2158                 prop_coef = 3;
2159                 int_coef = 8;
2160                 gain_ctl = 1;
2161                 targ_cnt = 9;
2162         } else {
2163                 drm_err(&i915->drm, "Invalid VCO\n");
2164                 return false;
2165         }
2166
2167         if (clock > 270000)
2168                 lanestagger = 0x18;
2169         else if (clock > 135000)
2170                 lanestagger = 0x0d;
2171         else if (clock > 67000)
2172                 lanestagger = 0x07;
2173         else if (clock > 33000)
2174                 lanestagger = 0x04;
2175         else
2176                 lanestagger = 0x02;
2177
2178         dpll_hw_state->ebb0 = PORT_PLL_P1(clk_div->p1) | PORT_PLL_P2(clk_div->p2);
2179         dpll_hw_state->pll0 = clk_div->m2_int;
2180         dpll_hw_state->pll1 = PORT_PLL_N(clk_div->n);
2181         dpll_hw_state->pll2 = clk_div->m2_frac;
2182
2183         if (clk_div->m2_frac_en)
2184                 dpll_hw_state->pll3 = PORT_PLL_M2_FRAC_ENABLE;
2185
2186         dpll_hw_state->pll6 = prop_coef | PORT_PLL_INT_COEFF(int_coef);
2187         dpll_hw_state->pll6 |= PORT_PLL_GAIN_CTL(gain_ctl);
2188
2189         dpll_hw_state->pll8 = targ_cnt;
2190
2191         dpll_hw_state->pll9 = 5 << PORT_PLL_LOCK_THRESHOLD_SHIFT;
2192
2193         dpll_hw_state->pll10 =
2194                 PORT_PLL_DCO_AMP(PORT_PLL_DCO_AMP_DEFAULT)
2195                 | PORT_PLL_DCO_AMP_OVR_EN_H;
2196
2197         dpll_hw_state->ebb4 = PORT_PLL_10BIT_CLK_ENABLE;
2198
2199         dpll_hw_state->pcsdw12 = LANESTAGGER_STRAP_OVRD | lanestagger;
2200
2201         return true;
2202 }
2203
2204 static bool
2205 bxt_ddi_dp_set_dpll_hw_state(struct intel_crtc_state *crtc_state)
2206 {
2207         struct bxt_clk_div clk_div = {};
2208
2209         bxt_ddi_dp_pll_dividers(crtc_state, &clk_div);
2210
2211         return bxt_ddi_set_dpll_hw_state(crtc_state, &clk_div);
2212 }
2213
2214 static bool
2215 bxt_ddi_hdmi_set_dpll_hw_state(struct intel_crtc_state *crtc_state)
2216 {
2217         struct bxt_clk_div clk_div = {};
2218
2219         bxt_ddi_hdmi_pll_dividers(crtc_state, &clk_div);
2220
2221         return bxt_ddi_set_dpll_hw_state(crtc_state, &clk_div);
2222 }
2223
2224 static int bxt_ddi_pll_get_freq(struct drm_i915_private *i915,
2225                                 const struct intel_shared_dpll *pll,
2226                                 const struct intel_dpll_hw_state *pll_state)
2227 {
2228         struct dpll clock;
2229
2230         clock.m1 = 2;
2231         clock.m2 = (pll_state->pll0 & PORT_PLL_M2_MASK) << 22;
2232         if (pll_state->pll3 & PORT_PLL_M2_FRAC_ENABLE)
2233                 clock.m2 |= pll_state->pll2 & PORT_PLL_M2_FRAC_MASK;
2234         clock.n = (pll_state->pll1 & PORT_PLL_N_MASK) >> PORT_PLL_N_SHIFT;
2235         clock.p1 = (pll_state->ebb0 & PORT_PLL_P1_MASK) >> PORT_PLL_P1_SHIFT;
2236         clock.p2 = (pll_state->ebb0 & PORT_PLL_P2_MASK) >> PORT_PLL_P2_SHIFT;
2237
2238         return chv_calc_dpll_params(i915->dpll.ref_clks.nssc, &clock);
2239 }
2240
2241 static bool bxt_get_dpll(struct intel_atomic_state *state,
2242                          struct intel_crtc *crtc,
2243                          struct intel_encoder *encoder)
2244 {
2245         struct intel_crtc_state *crtc_state =
2246                 intel_atomic_get_new_crtc_state(state, crtc);
2247         struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
2248         struct intel_shared_dpll *pll;
2249         enum intel_dpll_id id;
2250
2251         if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_HDMI) &&
2252             !bxt_ddi_hdmi_set_dpll_hw_state(crtc_state))
2253                 return false;
2254
2255         if (intel_crtc_has_dp_encoder(crtc_state) &&
2256             !bxt_ddi_dp_set_dpll_hw_state(crtc_state))
2257                 return false;
2258
2259         /* 1:1 mapping between ports and PLLs */
2260         id = (enum intel_dpll_id) encoder->port;
2261         pll = intel_get_shared_dpll_by_id(dev_priv, id);
2262
2263         drm_dbg_kms(&dev_priv->drm, "[CRTC:%d:%s] using pre-allocated %s\n",
2264                     crtc->base.base.id, crtc->base.name, pll->info->name);
2265
2266         intel_reference_shared_dpll(state, crtc,
2267                                     pll, &crtc_state->dpll_hw_state);
2268
2269         crtc_state->shared_dpll = pll;
2270
2271         return true;
2272 }
2273
2274 static void bxt_update_dpll_ref_clks(struct drm_i915_private *i915)
2275 {
2276         i915->dpll.ref_clks.ssc = 100000;
2277         i915->dpll.ref_clks.nssc = 100000;
2278         /* DSI non-SSC ref 19.2MHz */
2279 }
2280
2281 static void bxt_dump_hw_state(struct drm_i915_private *dev_priv,
2282                               const struct intel_dpll_hw_state *hw_state)
2283 {
2284         drm_dbg_kms(&dev_priv->drm, "dpll_hw_state: ebb0: 0x%x, ebb4: 0x%x,"
2285                     "pll0: 0x%x, pll1: 0x%x, pll2: 0x%x, pll3: 0x%x, "
2286                     "pll6: 0x%x, pll8: 0x%x, pll9: 0x%x, pll10: 0x%x, pcsdw12: 0x%x\n",
2287                     hw_state->ebb0,
2288                     hw_state->ebb4,
2289                     hw_state->pll0,
2290                     hw_state->pll1,
2291                     hw_state->pll2,
2292                     hw_state->pll3,
2293                     hw_state->pll6,
2294                     hw_state->pll8,
2295                     hw_state->pll9,
2296                     hw_state->pll10,
2297                     hw_state->pcsdw12);
2298 }
2299
2300 static const struct intel_shared_dpll_funcs bxt_ddi_pll_funcs = {
2301         .enable = bxt_ddi_pll_enable,
2302         .disable = bxt_ddi_pll_disable,
2303         .get_hw_state = bxt_ddi_pll_get_hw_state,
2304         .get_freq = bxt_ddi_pll_get_freq,
2305 };
2306
2307 static const struct dpll_info bxt_plls[] = {
2308         { "PORT PLL A", &bxt_ddi_pll_funcs, DPLL_ID_SKL_DPLL0, 0 },
2309         { "PORT PLL B", &bxt_ddi_pll_funcs, DPLL_ID_SKL_DPLL1, 0 },
2310         { "PORT PLL C", &bxt_ddi_pll_funcs, DPLL_ID_SKL_DPLL2, 0 },
2311         { },
2312 };
2313
2314 static const struct intel_dpll_mgr bxt_pll_mgr = {
2315         .dpll_info = bxt_plls,
2316         .get_dplls = bxt_get_dpll,
2317         .put_dplls = intel_put_dpll,
2318         .update_ref_clks = bxt_update_dpll_ref_clks,
2319         .dump_hw_state = bxt_dump_hw_state,
2320 };
2321
2322 static void cnl_ddi_pll_enable(struct drm_i915_private *dev_priv,
2323                                struct intel_shared_dpll *pll)
2324 {
2325         const enum intel_dpll_id id = pll->info->id;
2326         u32 val;
2327
2328         /* 1. Enable DPLL power in DPLL_ENABLE. */
2329         val = intel_de_read(dev_priv, CNL_DPLL_ENABLE(id));
2330         val |= PLL_POWER_ENABLE;
2331         intel_de_write(dev_priv, CNL_DPLL_ENABLE(id), val);
2332
2333         /* 2. Wait for DPLL power state enabled in DPLL_ENABLE. */
2334         if (intel_de_wait_for_set(dev_priv, CNL_DPLL_ENABLE(id),
2335                                   PLL_POWER_STATE, 5))
2336                 drm_err(&dev_priv->drm, "PLL %d Power not enabled\n", id);
2337
2338         /*
2339          * 3. Configure DPLL_CFGCR0 to set SSC enable/disable,
2340          * select DP mode, and set DP link rate.
2341          */
2342         val = pll->state.hw_state.cfgcr0;
2343         intel_de_write(dev_priv, CNL_DPLL_CFGCR0(id), val);
2344
2345         /* 4. Reab back to ensure writes completed */
2346         intel_de_posting_read(dev_priv, CNL_DPLL_CFGCR0(id));
2347
2348         /* 3. Configure DPLL_CFGCR0 */
2349         /* Avoid touch CFGCR1 if HDMI mode is not enabled */
2350         if (pll->state.hw_state.cfgcr0 & DPLL_CFGCR0_HDMI_MODE) {
2351                 val = pll->state.hw_state.cfgcr1;
2352                 intel_de_write(dev_priv, CNL_DPLL_CFGCR1(id), val);
2353                 /* 4. Reab back to ensure writes completed */
2354                 intel_de_posting_read(dev_priv, CNL_DPLL_CFGCR1(id));
2355         }
2356
2357         /*
2358          * 5. If the frequency will result in a change to the voltage
2359          * requirement, follow the Display Voltage Frequency Switching
2360          * Sequence Before Frequency Change
2361          *
2362          * Note: DVFS is actually handled via the cdclk code paths,
2363          * hence we do nothing here.
2364          */
2365
2366         /* 6. Enable DPLL in DPLL_ENABLE. */
2367         val = intel_de_read(dev_priv, CNL_DPLL_ENABLE(id));
2368         val |= PLL_ENABLE;
2369         intel_de_write(dev_priv, CNL_DPLL_ENABLE(id), val);
2370
2371         /* 7. Wait for PLL lock status in DPLL_ENABLE. */
2372         if (intel_de_wait_for_set(dev_priv, CNL_DPLL_ENABLE(id), PLL_LOCK, 5))
2373                 drm_err(&dev_priv->drm, "PLL %d not locked\n", id);
2374
2375         /*
2376          * 8. If the frequency will result in a change to the voltage
2377          * requirement, follow the Display Voltage Frequency Switching
2378          * Sequence After Frequency Change
2379          *
2380          * Note: DVFS is actually handled via the cdclk code paths,
2381          * hence we do nothing here.
2382          */
2383
2384         /*
2385          * 9. turn on the clock for the DDI and map the DPLL to the DDI
2386          * Done at intel_ddi_clk_select
2387          */
2388 }
2389
2390 static void cnl_ddi_pll_disable(struct drm_i915_private *dev_priv,
2391                                 struct intel_shared_dpll *pll)
2392 {
2393         const enum intel_dpll_id id = pll->info->id;
2394         u32 val;
2395
2396         /*
2397          * 1. Configure DPCLKA_CFGCR0 to turn off the clock for the DDI.
2398          * Done at intel_ddi_post_disable
2399          */
2400
2401         /*
2402          * 2. If the frequency will result in a change to the voltage
2403          * requirement, follow the Display Voltage Frequency Switching
2404          * Sequence Before Frequency Change
2405          *
2406          * Note: DVFS is actually handled via the cdclk code paths,
2407          * hence we do nothing here.
2408          */
2409
2410         /* 3. Disable DPLL through DPLL_ENABLE. */
2411         val = intel_de_read(dev_priv, CNL_DPLL_ENABLE(id));
2412         val &= ~PLL_ENABLE;
2413         intel_de_write(dev_priv, CNL_DPLL_ENABLE(id), val);
2414
2415         /* 4. Wait for PLL not locked status in DPLL_ENABLE. */
2416         if (intel_de_wait_for_clear(dev_priv, CNL_DPLL_ENABLE(id), PLL_LOCK, 5))
2417                 drm_err(&dev_priv->drm, "PLL %d locked\n", id);
2418
2419         /*
2420          * 5. If the frequency will result in a change to the voltage
2421          * requirement, follow the Display Voltage Frequency Switching
2422          * Sequence After Frequency Change
2423          *
2424          * Note: DVFS is actually handled via the cdclk code paths,
2425          * hence we do nothing here.
2426          */
2427
2428         /* 6. Disable DPLL power in DPLL_ENABLE. */
2429         val = intel_de_read(dev_priv, CNL_DPLL_ENABLE(id));
2430         val &= ~PLL_POWER_ENABLE;
2431         intel_de_write(dev_priv, CNL_DPLL_ENABLE(id), val);
2432
2433         /* 7. Wait for DPLL power state disabled in DPLL_ENABLE. */
2434         if (intel_de_wait_for_clear(dev_priv, CNL_DPLL_ENABLE(id),
2435                                     PLL_POWER_STATE, 5))
2436                 drm_err(&dev_priv->drm, "PLL %d Power not disabled\n", id);
2437 }
2438
2439 static bool cnl_ddi_pll_get_hw_state(struct drm_i915_private *dev_priv,
2440                                      struct intel_shared_dpll *pll,
2441                                      struct intel_dpll_hw_state *hw_state)
2442 {
2443         const enum intel_dpll_id id = pll->info->id;
2444         intel_wakeref_t wakeref;
2445         u32 val;
2446         bool ret;
2447
2448         wakeref = intel_display_power_get_if_enabled(dev_priv,
2449                                                      POWER_DOMAIN_DISPLAY_CORE);
2450         if (!wakeref)
2451                 return false;
2452
2453         ret = false;
2454
2455         val = intel_de_read(dev_priv, CNL_DPLL_ENABLE(id));
2456         if (!(val & PLL_ENABLE))
2457                 goto out;
2458
2459         val = intel_de_read(dev_priv, CNL_DPLL_CFGCR0(id));
2460         hw_state->cfgcr0 = val;
2461
2462         /* avoid reading back stale values if HDMI mode is not enabled */
2463         if (val & DPLL_CFGCR0_HDMI_MODE) {
2464                 hw_state->cfgcr1 = intel_de_read(dev_priv,
2465                                                  CNL_DPLL_CFGCR1(id));
2466         }
2467         ret = true;
2468
2469 out:
2470         intel_display_power_put(dev_priv, POWER_DOMAIN_DISPLAY_CORE, wakeref);
2471
2472         return ret;
2473 }
2474
2475 static void cnl_wrpll_get_multipliers(int bestdiv, int *pdiv,
2476                                       int *qdiv, int *kdiv)
2477 {
2478         /* even dividers */
2479         if (bestdiv % 2 == 0) {
2480                 if (bestdiv == 2) {
2481                         *pdiv = 2;
2482                         *qdiv = 1;
2483                         *kdiv = 1;
2484                 } else if (bestdiv % 4 == 0) {
2485                         *pdiv = 2;
2486                         *qdiv = bestdiv / 4;
2487                         *kdiv = 2;
2488                 } else if (bestdiv % 6 == 0) {
2489                         *pdiv = 3;
2490                         *qdiv = bestdiv / 6;
2491                         *kdiv = 2;
2492                 } else if (bestdiv % 5 == 0) {
2493                         *pdiv = 5;
2494                         *qdiv = bestdiv / 10;
2495                         *kdiv = 2;
2496                 } else if (bestdiv % 14 == 0) {
2497                         *pdiv = 7;
2498                         *qdiv = bestdiv / 14;
2499                         *kdiv = 2;
2500                 }
2501         } else {
2502                 if (bestdiv == 3 || bestdiv == 5 || bestdiv == 7) {
2503                         *pdiv = bestdiv;
2504                         *qdiv = 1;
2505                         *kdiv = 1;
2506                 } else { /* 9, 15, 21 */
2507                         *pdiv = bestdiv / 3;
2508                         *qdiv = 1;
2509                         *kdiv = 3;
2510                 }
2511         }
2512 }
2513
2514 static void cnl_wrpll_params_populate(struct skl_wrpll_params *params,
2515                                       u32 dco_freq, u32 ref_freq,
2516                                       int pdiv, int qdiv, int kdiv)
2517 {
2518         u32 dco;
2519
2520         switch (kdiv) {
2521         case 1:
2522                 params->kdiv = 1;
2523                 break;
2524         case 2:
2525                 params->kdiv = 2;
2526                 break;
2527         case 3:
2528                 params->kdiv = 4;
2529                 break;
2530         default:
2531                 WARN(1, "Incorrect KDiv\n");
2532         }
2533
2534         switch (pdiv) {
2535         case 2:
2536                 params->pdiv = 1;
2537                 break;
2538         case 3:
2539                 params->pdiv = 2;
2540                 break;
2541         case 5:
2542                 params->pdiv = 4;
2543                 break;
2544         case 7:
2545                 params->pdiv = 8;
2546                 break;
2547         default:
2548                 WARN(1, "Incorrect PDiv\n");
2549         }
2550
2551         WARN_ON(kdiv != 2 && qdiv != 1);
2552
2553         params->qdiv_ratio = qdiv;
2554         params->qdiv_mode = (qdiv == 1) ? 0 : 1;
2555
2556         dco = div_u64((u64)dco_freq << 15, ref_freq);
2557
2558         params->dco_integer = dco >> 15;
2559         params->dco_fraction = dco & 0x7fff;
2560 }
2561
2562 static bool
2563 __cnl_ddi_calculate_wrpll(struct intel_crtc_state *crtc_state,
2564                           struct skl_wrpll_params *wrpll_params,
2565                           int ref_clock)
2566 {
2567         u32 afe_clock = crtc_state->port_clock * 5;
2568         u32 dco_min = 7998000;
2569         u32 dco_max = 10000000;
2570         u32 dco_mid = (dco_min + dco_max) / 2;
2571         static const int dividers[] = {  2,  4,  6,  8, 10, 12,  14,  16,
2572                                          18, 20, 24, 28, 30, 32,  36,  40,
2573                                          42, 44, 48, 50, 52, 54,  56,  60,
2574                                          64, 66, 68, 70, 72, 76,  78,  80,
2575                                          84, 88, 90, 92, 96, 98, 100, 102,
2576                                           3,  5,  7,  9, 15, 21 };
2577         u32 dco, best_dco = 0, dco_centrality = 0;
2578         u32 best_dco_centrality = U32_MAX; /* Spec meaning of 999999 MHz */
2579         int d, best_div = 0, pdiv = 0, qdiv = 0, kdiv = 0;
2580
2581         for (d = 0; d < ARRAY_SIZE(dividers); d++) {
2582                 dco = afe_clock * dividers[d];
2583
2584                 if ((dco <= dco_max) && (dco >= dco_min)) {
2585                         dco_centrality = abs(dco - dco_mid);
2586
2587                         if (dco_centrality < best_dco_centrality) {
2588                                 best_dco_centrality = dco_centrality;
2589                                 best_div = dividers[d];
2590                                 best_dco = dco;
2591                         }
2592                 }
2593         }
2594
2595         if (best_div == 0)
2596                 return false;
2597
2598         cnl_wrpll_get_multipliers(best_div, &pdiv, &qdiv, &kdiv);
2599         cnl_wrpll_params_populate(wrpll_params, best_dco, ref_clock,
2600                                   pdiv, qdiv, kdiv);
2601
2602         return true;
2603 }
2604
2605 static bool
2606 cnl_ddi_calculate_wrpll(struct intel_crtc_state *crtc_state,
2607                         struct skl_wrpll_params *wrpll_params)
2608 {
2609         struct drm_i915_private *i915 = to_i915(crtc_state->uapi.crtc->dev);
2610
2611         return __cnl_ddi_calculate_wrpll(crtc_state, wrpll_params,
2612                                          i915->dpll.ref_clks.nssc);
2613 }
2614
2615 static bool cnl_ddi_hdmi_pll_dividers(struct intel_crtc_state *crtc_state)
2616 {
2617         u32 cfgcr0, cfgcr1;
2618         struct skl_wrpll_params wrpll_params = { 0, };
2619
2620         cfgcr0 = DPLL_CFGCR0_HDMI_MODE;
2621
2622         if (!cnl_ddi_calculate_wrpll(crtc_state, &wrpll_params))
2623                 return false;
2624
2625         cfgcr0 |= DPLL_CFGCR0_DCO_FRACTION(wrpll_params.dco_fraction) |
2626                 wrpll_params.dco_integer;
2627
2628         cfgcr1 = DPLL_CFGCR1_QDIV_RATIO(wrpll_params.qdiv_ratio) |
2629                 DPLL_CFGCR1_QDIV_MODE(wrpll_params.qdiv_mode) |
2630                 DPLL_CFGCR1_KDIV(wrpll_params.kdiv) |
2631                 DPLL_CFGCR1_PDIV(wrpll_params.pdiv) |
2632                 DPLL_CFGCR1_CENTRAL_FREQ;
2633
2634         memset(&crtc_state->dpll_hw_state, 0,
2635                sizeof(crtc_state->dpll_hw_state));
2636
2637         crtc_state->dpll_hw_state.cfgcr0 = cfgcr0;
2638         crtc_state->dpll_hw_state.cfgcr1 = cfgcr1;
2639         return true;
2640 }
2641
2642 /*
2643  * Display WA #22010492432: ehl, tgl
2644  * Program half of the nominal DCO divider fraction value.
2645  */
2646 static bool
2647 ehl_combo_pll_div_frac_wa_needed(struct drm_i915_private *i915)
2648 {
2649         return ((IS_PLATFORM(i915, INTEL_ELKHARTLAKE) &&
2650                  IS_JSL_EHL_REVID(i915, EHL_REVID_B0, REVID_FOREVER)) ||
2651                  IS_TIGERLAKE(i915)) &&
2652                  i915->dpll.ref_clks.nssc == 38400;
2653 }
2654
2655 static int __cnl_ddi_wrpll_get_freq(struct drm_i915_private *dev_priv,
2656                                     const struct intel_shared_dpll *pll,
2657                                     const struct intel_dpll_hw_state *pll_state,
2658                                     int ref_clock)
2659 {
2660         u32 dco_fraction;
2661         u32 p0, p1, p2, dco_freq;
2662
2663         p0 = pll_state->cfgcr1 & DPLL_CFGCR1_PDIV_MASK;
2664         p2 = pll_state->cfgcr1 & DPLL_CFGCR1_KDIV_MASK;
2665
2666         if (pll_state->cfgcr1 & DPLL_CFGCR1_QDIV_MODE(1))
2667                 p1 = (pll_state->cfgcr1 & DPLL_CFGCR1_QDIV_RATIO_MASK) >>
2668                         DPLL_CFGCR1_QDIV_RATIO_SHIFT;
2669         else
2670                 p1 = 1;
2671
2672
2673         switch (p0) {
2674         case DPLL_CFGCR1_PDIV_2:
2675                 p0 = 2;
2676                 break;
2677         case DPLL_CFGCR1_PDIV_3:
2678                 p0 = 3;
2679                 break;
2680         case DPLL_CFGCR1_PDIV_5:
2681                 p0 = 5;
2682                 break;
2683         case DPLL_CFGCR1_PDIV_7:
2684                 p0 = 7;
2685                 break;
2686         }
2687
2688         switch (p2) {
2689         case DPLL_CFGCR1_KDIV_1:
2690                 p2 = 1;
2691                 break;
2692         case DPLL_CFGCR1_KDIV_2:
2693                 p2 = 2;
2694                 break;
2695         case DPLL_CFGCR1_KDIV_3:
2696                 p2 = 3;
2697                 break;
2698         }
2699
2700         dco_freq = (pll_state->cfgcr0 & DPLL_CFGCR0_DCO_INTEGER_MASK) *
2701                    ref_clock;
2702
2703         dco_fraction = (pll_state->cfgcr0 & DPLL_CFGCR0_DCO_FRACTION_MASK) >>
2704                        DPLL_CFGCR0_DCO_FRACTION_SHIFT;
2705
2706         if (ehl_combo_pll_div_frac_wa_needed(dev_priv))
2707                 dco_fraction *= 2;
2708
2709         dco_freq += (dco_fraction * ref_clock) / 0x8000;
2710
2711         if (drm_WARN_ON(&dev_priv->drm, p0 == 0 || p1 == 0 || p2 == 0))
2712                 return 0;
2713
2714         return dco_freq / (p0 * p1 * p2 * 5);
2715 }
2716
2717 static int cnl_ddi_wrpll_get_freq(struct drm_i915_private *i915,
2718                                   const struct intel_shared_dpll *pll,
2719                                   const struct intel_dpll_hw_state *pll_state)
2720 {
2721         return __cnl_ddi_wrpll_get_freq(i915, pll, pll_state,
2722                                         i915->dpll.ref_clks.nssc);
2723 }
2724
2725 static bool
2726 cnl_ddi_dp_set_dpll_hw_state(struct intel_crtc_state *crtc_state)
2727 {
2728         u32 cfgcr0;
2729
2730         cfgcr0 = DPLL_CFGCR0_SSC_ENABLE;
2731
2732         switch (crtc_state->port_clock / 2) {
2733         case 81000:
2734                 cfgcr0 |= DPLL_CFGCR0_LINK_RATE_810;
2735                 break;
2736         case 135000:
2737                 cfgcr0 |= DPLL_CFGCR0_LINK_RATE_1350;
2738                 break;
2739         case 270000:
2740                 cfgcr0 |= DPLL_CFGCR0_LINK_RATE_2700;
2741                 break;
2742                 /* eDP 1.4 rates */
2743         case 162000:
2744                 cfgcr0 |= DPLL_CFGCR0_LINK_RATE_1620;
2745                 break;
2746         case 108000:
2747                 cfgcr0 |= DPLL_CFGCR0_LINK_RATE_1080;
2748                 break;
2749         case 216000:
2750                 cfgcr0 |= DPLL_CFGCR0_LINK_RATE_2160;
2751                 break;
2752         case 324000:
2753                 /* Some SKUs may require elevated I/O voltage to support this */
2754                 cfgcr0 |= DPLL_CFGCR0_LINK_RATE_3240;
2755                 break;
2756         case 405000:
2757                 /* Some SKUs may require elevated I/O voltage to support this */
2758                 cfgcr0 |= DPLL_CFGCR0_LINK_RATE_4050;
2759                 break;
2760         }
2761
2762         memset(&crtc_state->dpll_hw_state, 0,
2763                sizeof(crtc_state->dpll_hw_state));
2764
2765         crtc_state->dpll_hw_state.cfgcr0 = cfgcr0;
2766
2767         return true;
2768 }
2769
2770 static int cnl_ddi_lcpll_get_freq(struct drm_i915_private *i915,
2771                                   const struct intel_shared_dpll *pll,
2772                                   const struct intel_dpll_hw_state *pll_state)
2773 {
2774         int link_clock = 0;
2775
2776         switch (pll_state->cfgcr0 & DPLL_CFGCR0_LINK_RATE_MASK) {
2777         case DPLL_CFGCR0_LINK_RATE_810:
2778                 link_clock = 81000;
2779                 break;
2780         case DPLL_CFGCR0_LINK_RATE_1080:
2781                 link_clock = 108000;
2782                 break;
2783         case DPLL_CFGCR0_LINK_RATE_1350:
2784                 link_clock = 135000;
2785                 break;
2786         case DPLL_CFGCR0_LINK_RATE_1620:
2787                 link_clock = 162000;
2788                 break;
2789         case DPLL_CFGCR0_LINK_RATE_2160:
2790                 link_clock = 216000;
2791                 break;
2792         case DPLL_CFGCR0_LINK_RATE_2700:
2793                 link_clock = 270000;
2794                 break;
2795         case DPLL_CFGCR0_LINK_RATE_3240:
2796                 link_clock = 324000;
2797                 break;
2798         case DPLL_CFGCR0_LINK_RATE_4050:
2799                 link_clock = 405000;
2800                 break;
2801         default:
2802                 drm_WARN(&i915->drm, 1, "Unsupported link rate\n");
2803                 break;
2804         }
2805
2806         return link_clock * 2;
2807 }
2808
2809 static bool cnl_get_dpll(struct intel_atomic_state *state,
2810                          struct intel_crtc *crtc,
2811                          struct intel_encoder *encoder)
2812 {
2813         struct intel_crtc_state *crtc_state =
2814                 intel_atomic_get_new_crtc_state(state, crtc);
2815         struct drm_i915_private *i915 = to_i915(crtc_state->uapi.crtc->dev);
2816         struct intel_shared_dpll *pll;
2817         bool bret;
2818
2819         if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_HDMI)) {
2820                 bret = cnl_ddi_hdmi_pll_dividers(crtc_state);
2821                 if (!bret) {
2822                         drm_dbg_kms(&i915->drm,
2823                                     "Could not get HDMI pll dividers.\n");
2824                         return false;
2825                 }
2826         } else if (intel_crtc_has_dp_encoder(crtc_state)) {
2827                 bret = cnl_ddi_dp_set_dpll_hw_state(crtc_state);
2828                 if (!bret) {
2829                         drm_dbg_kms(&i915->drm,
2830                                     "Could not set DP dpll HW state.\n");
2831                         return false;
2832                 }
2833         } else {
2834                 drm_dbg_kms(&i915->drm,
2835                             "Skip DPLL setup for output_types 0x%x\n",
2836                             crtc_state->output_types);
2837                 return false;
2838         }
2839
2840         pll = intel_find_shared_dpll(state, crtc,
2841                                      &crtc_state->dpll_hw_state,
2842                                      BIT(DPLL_ID_SKL_DPLL2) |
2843                                      BIT(DPLL_ID_SKL_DPLL1) |
2844                                      BIT(DPLL_ID_SKL_DPLL0));
2845         if (!pll) {
2846                 drm_dbg_kms(&i915->drm, "No PLL selected\n");
2847                 return false;
2848         }
2849
2850         intel_reference_shared_dpll(state, crtc,
2851                                     pll, &crtc_state->dpll_hw_state);
2852
2853         crtc_state->shared_dpll = pll;
2854
2855         return true;
2856 }
2857
2858 static int cnl_ddi_pll_get_freq(struct drm_i915_private *i915,
2859                                 const struct intel_shared_dpll *pll,
2860                                 const struct intel_dpll_hw_state *pll_state)
2861 {
2862         if (pll_state->cfgcr0 & DPLL_CFGCR0_HDMI_MODE)
2863                 return cnl_ddi_wrpll_get_freq(i915, pll, pll_state);
2864         else
2865                 return cnl_ddi_lcpll_get_freq(i915, pll, pll_state);
2866 }
2867
2868 static void cnl_update_dpll_ref_clks(struct drm_i915_private *i915)
2869 {
2870         /* No SSC reference */
2871         i915->dpll.ref_clks.nssc = i915->cdclk.hw.ref;
2872 }
2873
2874 static void cnl_dump_hw_state(struct drm_i915_private *dev_priv,
2875                               const struct intel_dpll_hw_state *hw_state)
2876 {
2877         drm_dbg_kms(&dev_priv->drm, "dpll_hw_state: "
2878                     "cfgcr0: 0x%x, cfgcr1: 0x%x\n",
2879                     hw_state->cfgcr0,
2880                     hw_state->cfgcr1);
2881 }
2882
2883 static const struct intel_shared_dpll_funcs cnl_ddi_pll_funcs = {
2884         .enable = cnl_ddi_pll_enable,
2885         .disable = cnl_ddi_pll_disable,
2886         .get_hw_state = cnl_ddi_pll_get_hw_state,
2887         .get_freq = cnl_ddi_pll_get_freq,
2888 };
2889
2890 static const struct dpll_info cnl_plls[] = {
2891         { "DPLL 0", &cnl_ddi_pll_funcs, DPLL_ID_SKL_DPLL0, 0 },
2892         { "DPLL 1", &cnl_ddi_pll_funcs, DPLL_ID_SKL_DPLL1, 0 },
2893         { "DPLL 2", &cnl_ddi_pll_funcs, DPLL_ID_SKL_DPLL2, 0 },
2894         { },
2895 };
2896
2897 static const struct intel_dpll_mgr cnl_pll_mgr = {
2898         .dpll_info = cnl_plls,
2899         .get_dplls = cnl_get_dpll,
2900         .put_dplls = intel_put_dpll,
2901         .update_ref_clks = cnl_update_dpll_ref_clks,
2902         .dump_hw_state = cnl_dump_hw_state,
2903 };
2904
2905 struct icl_combo_pll_params {
2906         int clock;
2907         struct skl_wrpll_params wrpll;
2908 };
2909
2910 /*
2911  * These values alrea already adjusted: they're the bits we write to the
2912  * registers, not the logical values.
2913  */
2914 static const struct icl_combo_pll_params icl_dp_combo_pll_24MHz_values[] = {
2915         { 540000,
2916           { .dco_integer = 0x151, .dco_fraction = 0x4000,               /* [0]: 5.4 */
2917             .pdiv = 0x2 /* 3 */, .kdiv = 1, .qdiv_mode = 0, .qdiv_ratio = 0, }, },
2918         { 270000,
2919           { .dco_integer = 0x151, .dco_fraction = 0x4000,               /* [1]: 2.7 */
2920             .pdiv = 0x2 /* 3 */, .kdiv = 2, .qdiv_mode = 0, .qdiv_ratio = 0, }, },
2921         { 162000,
2922           { .dco_integer = 0x151, .dco_fraction = 0x4000,               /* [2]: 1.62 */
2923             .pdiv = 0x4 /* 5 */, .kdiv = 2, .qdiv_mode = 0, .qdiv_ratio = 0, }, },
2924         { 324000,
2925           { .dco_integer = 0x151, .dco_fraction = 0x4000,               /* [3]: 3.24 */
2926             .pdiv = 0x4 /* 5 */, .kdiv = 1, .qdiv_mode = 0, .qdiv_ratio = 0, }, },
2927         { 216000,
2928           { .dco_integer = 0x168, .dco_fraction = 0x0000,               /* [4]: 2.16 */
2929             .pdiv = 0x1 /* 2 */, .kdiv = 2, .qdiv_mode = 1, .qdiv_ratio = 2, }, },
2930         { 432000,
2931           { .dco_integer = 0x168, .dco_fraction = 0x0000,               /* [5]: 4.32 */
2932             .pdiv = 0x1 /* 2 */, .kdiv = 2, .qdiv_mode = 0, .qdiv_ratio = 0, }, },
2933         { 648000,
2934           { .dco_integer = 0x195, .dco_fraction = 0x0000,               /* [6]: 6.48 */
2935             .pdiv = 0x2 /* 3 */, .kdiv = 1, .qdiv_mode = 0, .qdiv_ratio = 0, }, },
2936         { 810000,
2937           { .dco_integer = 0x151, .dco_fraction = 0x4000,               /* [7]: 8.1 */
2938             .pdiv = 0x1 /* 2 */, .kdiv = 1, .qdiv_mode = 0, .qdiv_ratio = 0, }, },
2939 };
2940
2941
2942 /* Also used for 38.4 MHz values. */
2943 static const struct icl_combo_pll_params icl_dp_combo_pll_19_2MHz_values[] = {
2944         { 540000,
2945           { .dco_integer = 0x1A5, .dco_fraction = 0x7000,               /* [0]: 5.4 */
2946             .pdiv = 0x2 /* 3 */, .kdiv = 1, .qdiv_mode = 0, .qdiv_ratio = 0, }, },
2947         { 270000,
2948           { .dco_integer = 0x1A5, .dco_fraction = 0x7000,               /* [1]: 2.7 */
2949             .pdiv = 0x2 /* 3 */, .kdiv = 2, .qdiv_mode = 0, .qdiv_ratio = 0, }, },
2950         { 162000,
2951           { .dco_integer = 0x1A5, .dco_fraction = 0x7000,               /* [2]: 1.62 */
2952             .pdiv = 0x4 /* 5 */, .kdiv = 2, .qdiv_mode = 0, .qdiv_ratio = 0, }, },
2953         { 324000,
2954           { .dco_integer = 0x1A5, .dco_fraction = 0x7000,               /* [3]: 3.24 */
2955             .pdiv = 0x4 /* 5 */, .kdiv = 1, .qdiv_mode = 0, .qdiv_ratio = 0, }, },
2956         { 216000,
2957           { .dco_integer = 0x1C2, .dco_fraction = 0x0000,               /* [4]: 2.16 */
2958             .pdiv = 0x1 /* 2 */, .kdiv = 2, .qdiv_mode = 1, .qdiv_ratio = 2, }, },
2959         { 432000,
2960           { .dco_integer = 0x1C2, .dco_fraction = 0x0000,               /* [5]: 4.32 */
2961             .pdiv = 0x1 /* 2 */, .kdiv = 2, .qdiv_mode = 0, .qdiv_ratio = 0, }, },
2962         { 648000,
2963           { .dco_integer = 0x1FA, .dco_fraction = 0x2000,               /* [6]: 6.48 */
2964             .pdiv = 0x2 /* 3 */, .kdiv = 1, .qdiv_mode = 0, .qdiv_ratio = 0, }, },
2965         { 810000,
2966           { .dco_integer = 0x1A5, .dco_fraction = 0x7000,               /* [7]: 8.1 */
2967             .pdiv = 0x1 /* 2 */, .kdiv = 1, .qdiv_mode = 0, .qdiv_ratio = 0, }, },
2968 };
2969
2970 static const struct skl_wrpll_params icl_tbt_pll_24MHz_values = {
2971         .dco_integer = 0x151, .dco_fraction = 0x4000,
2972         .pdiv = 0x4 /* 5 */, .kdiv = 1, .qdiv_mode = 0, .qdiv_ratio = 0,
2973 };
2974
2975 static const struct skl_wrpll_params icl_tbt_pll_19_2MHz_values = {
2976         .dco_integer = 0x1A5, .dco_fraction = 0x7000,
2977         .pdiv = 0x4 /* 5 */, .kdiv = 1, .qdiv_mode = 0, .qdiv_ratio = 0,
2978 };
2979
2980 static const struct skl_wrpll_params tgl_tbt_pll_19_2MHz_values = {
2981         .dco_integer = 0x54, .dco_fraction = 0x3000,
2982         /* the following params are unused */
2983         .pdiv = 0, .kdiv = 0, .qdiv_mode = 0, .qdiv_ratio = 0,
2984 };
2985
2986 static const struct skl_wrpll_params tgl_tbt_pll_24MHz_values = {
2987         .dco_integer = 0x43, .dco_fraction = 0x4000,
2988         /* the following params are unused */
2989 };
2990
2991 static bool icl_calc_dp_combo_pll(struct intel_crtc_state *crtc_state,
2992                                   struct skl_wrpll_params *pll_params)
2993 {
2994         struct drm_i915_private *dev_priv = to_i915(crtc_state->uapi.crtc->dev);
2995         const struct icl_combo_pll_params *params =
2996                 dev_priv->dpll.ref_clks.nssc == 24000 ?
2997                 icl_dp_combo_pll_24MHz_values :
2998                 icl_dp_combo_pll_19_2MHz_values;
2999         int clock = crtc_state->port_clock;
3000         int i;
3001
3002         for (i = 0; i < ARRAY_SIZE(icl_dp_combo_pll_24MHz_values); i++) {
3003                 if (clock == params[i].clock) {
3004                         *pll_params = params[i].wrpll;
3005                         return true;
3006                 }
3007         }
3008
3009         MISSING_CASE(clock);
3010         return false;
3011 }
3012
3013 static bool icl_calc_tbt_pll(struct intel_crtc_state *crtc_state,
3014                              struct skl_wrpll_params *pll_params)
3015 {
3016         struct drm_i915_private *dev_priv = to_i915(crtc_state->uapi.crtc->dev);
3017
3018         if (INTEL_GEN(dev_priv) >= 12) {
3019                 switch (dev_priv->dpll.ref_clks.nssc) {
3020                 default:
3021                         MISSING_CASE(dev_priv->dpll.ref_clks.nssc);
3022                         fallthrough;
3023                 case 19200:
3024                 case 38400:
3025                         *pll_params = tgl_tbt_pll_19_2MHz_values;
3026                         break;
3027                 case 24000:
3028                         *pll_params = tgl_tbt_pll_24MHz_values;
3029                         break;
3030                 }
3031         } else {
3032                 switch (dev_priv->dpll.ref_clks.nssc) {
3033                 default:
3034                         MISSING_CASE(dev_priv->dpll.ref_clks.nssc);
3035                         fallthrough;
3036                 case 19200:
3037                 case 38400:
3038                         *pll_params = icl_tbt_pll_19_2MHz_values;
3039                         break;
3040                 case 24000:
3041                         *pll_params = icl_tbt_pll_24MHz_values;
3042                         break;
3043                 }
3044         }
3045
3046         return true;
3047 }
3048
3049 static int icl_ddi_tbt_pll_get_freq(struct drm_i915_private *i915,
3050                                     const struct intel_shared_dpll *pll,
3051                                     const struct intel_dpll_hw_state *pll_state)
3052 {
3053         /*
3054          * The PLL outputs multiple frequencies at the same time, selection is
3055          * made at DDI clock mux level.
3056          */
3057         drm_WARN_ON(&i915->drm, 1);
3058
3059         return 0;
3060 }
3061
3062 static int icl_wrpll_ref_clock(struct drm_i915_private *i915)
3063 {
3064         int ref_clock = i915->dpll.ref_clks.nssc;
3065
3066         /*
3067          * For ICL+, the spec states: if reference frequency is 38.4,
3068          * use 19.2 because the DPLL automatically divides that by 2.
3069          */
3070         if (ref_clock == 38400)
3071                 ref_clock = 19200;
3072
3073         return ref_clock;
3074 }
3075
3076 static bool
3077 icl_calc_wrpll(struct intel_crtc_state *crtc_state,
3078                struct skl_wrpll_params *wrpll_params)
3079 {
3080         struct drm_i915_private *i915 = to_i915(crtc_state->uapi.crtc->dev);
3081
3082         return __cnl_ddi_calculate_wrpll(crtc_state, wrpll_params,
3083                                          icl_wrpll_ref_clock(i915));
3084 }
3085
3086 static int icl_ddi_combo_pll_get_freq(struct drm_i915_private *i915,
3087                                       const struct intel_shared_dpll *pll,
3088                                       const struct intel_dpll_hw_state *pll_state)
3089 {
3090         return __cnl_ddi_wrpll_get_freq(i915, pll, pll_state,
3091                                         icl_wrpll_ref_clock(i915));
3092 }
3093
3094 static void icl_calc_dpll_state(struct drm_i915_private *i915,
3095                                 const struct skl_wrpll_params *pll_params,
3096                                 struct intel_dpll_hw_state *pll_state)
3097 {
3098         u32 dco_fraction = pll_params->dco_fraction;
3099
3100         memset(pll_state, 0, sizeof(*pll_state));
3101
3102         if (ehl_combo_pll_div_frac_wa_needed(i915))
3103                 dco_fraction = DIV_ROUND_CLOSEST(dco_fraction, 2);
3104
3105         pll_state->cfgcr0 = DPLL_CFGCR0_DCO_FRACTION(dco_fraction) |
3106                             pll_params->dco_integer;
3107
3108         pll_state->cfgcr1 = DPLL_CFGCR1_QDIV_RATIO(pll_params->qdiv_ratio) |
3109                             DPLL_CFGCR1_QDIV_MODE(pll_params->qdiv_mode) |
3110                             DPLL_CFGCR1_KDIV(pll_params->kdiv) |
3111                             DPLL_CFGCR1_PDIV(pll_params->pdiv);
3112
3113         if (INTEL_GEN(i915) >= 12)
3114                 pll_state->cfgcr1 |= TGL_DPLL_CFGCR1_CFSELOVRD_NORMAL_XTAL;
3115         else
3116                 pll_state->cfgcr1 |= DPLL_CFGCR1_CENTRAL_FREQ_8400;
3117 }
3118
3119 static enum tc_port icl_pll_id_to_tc_port(enum intel_dpll_id id)
3120 {
3121         return id - DPLL_ID_ICL_MGPLL1;
3122 }
3123
3124 enum intel_dpll_id icl_tc_port_to_pll_id(enum tc_port tc_port)
3125 {
3126         return tc_port + DPLL_ID_ICL_MGPLL1;
3127 }
3128
3129 static bool icl_mg_pll_find_divisors(int clock_khz, bool is_dp, bool use_ssc,
3130                                      u32 *target_dco_khz,
3131                                      struct intel_dpll_hw_state *state,
3132                                      bool is_dkl)
3133 {
3134         u32 dco_min_freq, dco_max_freq;
3135         int div1_vals[] = {7, 5, 3, 2};
3136         unsigned int i;
3137         int div2;
3138
3139         dco_min_freq = is_dp ? 8100000 : use_ssc ? 8000000 : 7992000;
3140         dco_max_freq = is_dp ? 8100000 : 10000000;
3141
3142         for (i = 0; i < ARRAY_SIZE(div1_vals); i++) {
3143                 int div1 = div1_vals[i];
3144
3145                 for (div2 = 10; div2 > 0; div2--) {
3146                         int dco = div1 * div2 * clock_khz * 5;
3147                         int a_divratio, tlinedrv, inputsel;
3148                         u32 hsdiv;
3149
3150                         if (dco < dco_min_freq || dco > dco_max_freq)
3151                                 continue;
3152
3153                         if (div2 >= 2) {
3154                                 /*
3155                                  * Note: a_divratio not matching TGL BSpec
3156                                  * algorithm but matching hardcoded values and
3157                                  * working on HW for DP alt-mode at least
3158                                  */
3159                                 a_divratio = is_dp ? 10 : 5;
3160                                 tlinedrv = is_dkl ? 1 : 2;
3161                         } else {
3162                                 a_divratio = 5;
3163                                 tlinedrv = 0;
3164                         }
3165                         inputsel = is_dp ? 0 : 1;
3166
3167                         switch (div1) {
3168                         default:
3169                                 MISSING_CASE(div1);
3170                                 fallthrough;
3171                         case 2:
3172                                 hsdiv = MG_CLKTOP2_HSCLKCTL_HSDIV_RATIO_2;
3173                                 break;
3174                         case 3:
3175                                 hsdiv = MG_CLKTOP2_HSCLKCTL_HSDIV_RATIO_3;
3176                                 break;
3177                         case 5:
3178                                 hsdiv = MG_CLKTOP2_HSCLKCTL_HSDIV_RATIO_5;
3179                                 break;
3180                         case 7:
3181                                 hsdiv = MG_CLKTOP2_HSCLKCTL_HSDIV_RATIO_7;
3182                                 break;
3183                         }
3184
3185                         *target_dco_khz = dco;
3186
3187                         state->mg_refclkin_ctl = MG_REFCLKIN_CTL_OD_2_MUX(1);
3188
3189                         state->mg_clktop2_coreclkctl1 =
3190                                 MG_CLKTOP2_CORECLKCTL1_A_DIVRATIO(a_divratio);
3191
3192                         state->mg_clktop2_hsclkctl =
3193                                 MG_CLKTOP2_HSCLKCTL_TLINEDRV_CLKSEL(tlinedrv) |
3194                                 MG_CLKTOP2_HSCLKCTL_CORE_INPUTSEL(inputsel) |
3195                                 hsdiv |
3196                                 MG_CLKTOP2_HSCLKCTL_DSDIV_RATIO(div2);
3197
3198                         return true;
3199                 }
3200         }
3201
3202         return false;
3203 }
3204
3205 /*
3206  * The specification for this function uses real numbers, so the math had to be
3207  * adapted to integer-only calculation, that's why it looks so different.
3208  */
3209 static bool icl_calc_mg_pll_state(struct intel_crtc_state *crtc_state,
3210                                   struct intel_dpll_hw_state *pll_state)
3211 {
3212         struct drm_i915_private *dev_priv = to_i915(crtc_state->uapi.crtc->dev);
3213         int refclk_khz = dev_priv->dpll.ref_clks.nssc;
3214         int clock = crtc_state->port_clock;
3215         u32 dco_khz, m1div, m2div_int, m2div_rem, m2div_frac;
3216         u32 iref_ndiv, iref_trim, iref_pulse_w;
3217         u32 prop_coeff, int_coeff;
3218         u32 tdc_targetcnt, feedfwgain;
3219         u64 ssc_stepsize, ssc_steplen, ssc_steplog;
3220         u64 tmp;
3221         bool use_ssc = false;
3222         bool is_dp = !intel_crtc_has_type(crtc_state, INTEL_OUTPUT_HDMI);
3223         bool is_dkl = INTEL_GEN(dev_priv) >= 12;
3224
3225         memset(pll_state, 0, sizeof(*pll_state));
3226
3227         if (!icl_mg_pll_find_divisors(clock, is_dp, use_ssc, &dco_khz,
3228                                       pll_state, is_dkl)) {
3229                 drm_dbg_kms(&dev_priv->drm,
3230                             "Failed to find divisors for clock %d\n", clock);
3231                 return false;
3232         }
3233
3234         m1div = 2;
3235         m2div_int = dco_khz / (refclk_khz * m1div);
3236         if (m2div_int > 255) {
3237                 if (!is_dkl) {
3238                         m1div = 4;
3239                         m2div_int = dco_khz / (refclk_khz * m1div);
3240                 }
3241
3242                 if (m2div_int > 255) {
3243                         drm_dbg_kms(&dev_priv->drm,
3244                                     "Failed to find mdiv for clock %d\n",
3245                                     clock);
3246                         return false;
3247                 }
3248         }
3249         m2div_rem = dco_khz % (refclk_khz * m1div);
3250
3251         tmp = (u64)m2div_rem * (1 << 22);
3252         do_div(tmp, refclk_khz * m1div);
3253         m2div_frac = tmp;
3254
3255         switch (refclk_khz) {
3256         case 19200:
3257                 iref_ndiv = 1;
3258                 iref_trim = 28;
3259                 iref_pulse_w = 1;
3260                 break;
3261         case 24000:
3262                 iref_ndiv = 1;
3263                 iref_trim = 25;
3264                 iref_pulse_w = 2;
3265                 break;
3266         case 38400:
3267                 iref_ndiv = 2;
3268                 iref_trim = 28;
3269                 iref_pulse_w = 1;
3270                 break;
3271         default:
3272                 MISSING_CASE(refclk_khz);
3273                 return false;
3274         }
3275
3276         /*
3277          * tdc_res = 0.000003
3278          * tdc_targetcnt = int(2 / (tdc_res * 8 * 50 * 1.1) / refclk_mhz + 0.5)
3279          *
3280          * The multiplication by 1000 is due to refclk MHz to KHz conversion. It
3281          * was supposed to be a division, but we rearranged the operations of
3282          * the formula to avoid early divisions so we don't multiply the
3283          * rounding errors.
3284          *
3285          * 0.000003 * 8 * 50 * 1.1 = 0.00132, also known as 132 / 100000, which
3286          * we also rearrange to work with integers.
3287          *
3288          * The 0.5 transformed to 5 results in a multiplication by 10 and the
3289          * last division by 10.
3290          */
3291         tdc_targetcnt = (2 * 1000 * 100000 * 10 / (132 * refclk_khz) + 5) / 10;
3292
3293         /*
3294          * Here we divide dco_khz by 10 in order to allow the dividend to fit in
3295          * 32 bits. That's not a problem since we round the division down
3296          * anyway.
3297          */
3298         feedfwgain = (use_ssc || m2div_rem > 0) ?
3299                 m1div * 1000000 * 100 / (dco_khz * 3 / 10) : 0;
3300
3301         if (dco_khz >= 9000000) {
3302                 prop_coeff = 5;
3303                 int_coeff = 10;
3304         } else {
3305                 prop_coeff = 4;
3306                 int_coeff = 8;
3307         }
3308
3309         if (use_ssc) {
3310                 tmp = mul_u32_u32(dco_khz, 47 * 32);
3311                 do_div(tmp, refclk_khz * m1div * 10000);
3312                 ssc_stepsize = tmp;
3313
3314                 tmp = mul_u32_u32(dco_khz, 1000);
3315                 ssc_steplen = DIV_ROUND_UP_ULL(tmp, 32 * 2 * 32);
3316         } else {
3317                 ssc_stepsize = 0;
3318                 ssc_steplen = 0;
3319         }
3320         ssc_steplog = 4;
3321
3322         /* write pll_state calculations */
3323         if (is_dkl) {
3324                 pll_state->mg_pll_div0 = DKL_PLL_DIV0_INTEG_COEFF(int_coeff) |
3325                                          DKL_PLL_DIV0_PROP_COEFF(prop_coeff) |
3326                                          DKL_PLL_DIV0_FBPREDIV(m1div) |
3327                                          DKL_PLL_DIV0_FBDIV_INT(m2div_int);
3328
3329                 pll_state->mg_pll_div1 = DKL_PLL_DIV1_IREF_TRIM(iref_trim) |
3330                                          DKL_PLL_DIV1_TDC_TARGET_CNT(tdc_targetcnt);
3331
3332                 pll_state->mg_pll_ssc = DKL_PLL_SSC_IREF_NDIV_RATIO(iref_ndiv) |
3333                                         DKL_PLL_SSC_STEP_LEN(ssc_steplen) |
3334                                         DKL_PLL_SSC_STEP_NUM(ssc_steplog) |
3335                                         (use_ssc ? DKL_PLL_SSC_EN : 0);
3336
3337                 pll_state->mg_pll_bias = (m2div_frac ? DKL_PLL_BIAS_FRAC_EN_H : 0) |
3338                                           DKL_PLL_BIAS_FBDIV_FRAC(m2div_frac);
3339
3340                 pll_state->mg_pll_tdc_coldst_bias =
3341                                 DKL_PLL_TDC_SSC_STEP_SIZE(ssc_stepsize) |
3342                                 DKL_PLL_TDC_FEED_FWD_GAIN(feedfwgain);
3343
3344         } else {
3345                 pll_state->mg_pll_div0 =
3346                         (m2div_rem > 0 ? MG_PLL_DIV0_FRACNEN_H : 0) |
3347                         MG_PLL_DIV0_FBDIV_FRAC(m2div_frac) |
3348                         MG_PLL_DIV0_FBDIV_INT(m2div_int);
3349
3350                 pll_state->mg_pll_div1 =
3351                         MG_PLL_DIV1_IREF_NDIVRATIO(iref_ndiv) |
3352                         MG_PLL_DIV1_DITHER_DIV_2 |
3353                         MG_PLL_DIV1_NDIVRATIO(1) |
3354                         MG_PLL_DIV1_FBPREDIV(m1div);
3355
3356                 pll_state->mg_pll_lf =
3357                         MG_PLL_LF_TDCTARGETCNT(tdc_targetcnt) |
3358                         MG_PLL_LF_AFCCNTSEL_512 |
3359                         MG_PLL_LF_GAINCTRL(1) |
3360                         MG_PLL_LF_INT_COEFF(int_coeff) |
3361                         MG_PLL_LF_PROP_COEFF(prop_coeff);
3362
3363                 pll_state->mg_pll_frac_lock =
3364                         MG_PLL_FRAC_LOCK_TRUELOCK_CRIT_32 |
3365                         MG_PLL_FRAC_LOCK_EARLYLOCK_CRIT_32 |
3366                         MG_PLL_FRAC_LOCK_LOCKTHRESH(10) |
3367                         MG_PLL_FRAC_LOCK_DCODITHEREN |
3368                         MG_PLL_FRAC_LOCK_FEEDFWRDGAIN(feedfwgain);
3369                 if (use_ssc || m2div_rem > 0)
3370                         pll_state->mg_pll_frac_lock |=
3371                                 MG_PLL_FRAC_LOCK_FEEDFWRDCAL_EN;
3372
3373                 pll_state->mg_pll_ssc =
3374                         (use_ssc ? MG_PLL_SSC_EN : 0) |
3375                         MG_PLL_SSC_TYPE(2) |
3376                         MG_PLL_SSC_STEPLENGTH(ssc_steplen) |
3377                         MG_PLL_SSC_STEPNUM(ssc_steplog) |
3378                         MG_PLL_SSC_FLLEN |
3379                         MG_PLL_SSC_STEPSIZE(ssc_stepsize);
3380
3381                 pll_state->mg_pll_tdc_coldst_bias =
3382                         MG_PLL_TDC_COLDST_COLDSTART |
3383                         MG_PLL_TDC_COLDST_IREFINT_EN |
3384                         MG_PLL_TDC_COLDST_REFBIAS_START_PULSE_W(iref_pulse_w) |
3385                         MG_PLL_TDC_TDCOVCCORR_EN |
3386                         MG_PLL_TDC_TDCSEL(3);
3387
3388                 pll_state->mg_pll_bias =
3389                         MG_PLL_BIAS_BIAS_GB_SEL(3) |
3390                         MG_PLL_BIAS_INIT_DCOAMP(0x3F) |
3391                         MG_PLL_BIAS_BIAS_BONUS(10) |
3392                         MG_PLL_BIAS_BIASCAL_EN |
3393                         MG_PLL_BIAS_CTRIM(12) |
3394                         MG_PLL_BIAS_VREF_RDAC(4) |
3395                         MG_PLL_BIAS_IREFTRIM(iref_trim);
3396
3397                 if (refclk_khz == 38400) {
3398                         pll_state->mg_pll_tdc_coldst_bias_mask =
3399                                 MG_PLL_TDC_COLDST_COLDSTART;
3400                         pll_state->mg_pll_bias_mask = 0;
3401                 } else {
3402                         pll_state->mg_pll_tdc_coldst_bias_mask = -1U;
3403                         pll_state->mg_pll_bias_mask = -1U;
3404                 }
3405
3406                 pll_state->mg_pll_tdc_coldst_bias &=
3407                         pll_state->mg_pll_tdc_coldst_bias_mask;
3408                 pll_state->mg_pll_bias &= pll_state->mg_pll_bias_mask;
3409         }
3410
3411         return true;
3412 }
3413
3414 static int icl_ddi_mg_pll_get_freq(struct drm_i915_private *dev_priv,
3415                                    const struct intel_shared_dpll *pll,
3416                                    const struct intel_dpll_hw_state *pll_state)
3417 {
3418         u32 m1, m2_int, m2_frac, div1, div2, ref_clock;
3419         u64 tmp;
3420
3421         ref_clock = dev_priv->dpll.ref_clks.nssc;
3422
3423         if (INTEL_GEN(dev_priv) >= 12) {
3424                 m1 = pll_state->mg_pll_div0 & DKL_PLL_DIV0_FBPREDIV_MASK;
3425                 m1 = m1 >> DKL_PLL_DIV0_FBPREDIV_SHIFT;
3426                 m2_int = pll_state->mg_pll_div0 & DKL_PLL_DIV0_FBDIV_INT_MASK;
3427
3428                 if (pll_state->mg_pll_bias & DKL_PLL_BIAS_FRAC_EN_H) {
3429                         m2_frac = pll_state->mg_pll_bias &
3430                                   DKL_PLL_BIAS_FBDIV_FRAC_MASK;
3431                         m2_frac = m2_frac >> DKL_PLL_BIAS_FBDIV_SHIFT;
3432                 } else {
3433                         m2_frac = 0;
3434                 }
3435         } else {
3436                 m1 = pll_state->mg_pll_div1 & MG_PLL_DIV1_FBPREDIV_MASK;
3437                 m2_int = pll_state->mg_pll_div0 & MG_PLL_DIV0_FBDIV_INT_MASK;
3438
3439                 if (pll_state->mg_pll_div0 & MG_PLL_DIV0_FRACNEN_H) {
3440                         m2_frac = pll_state->mg_pll_div0 &
3441                                   MG_PLL_DIV0_FBDIV_FRAC_MASK;
3442                         m2_frac = m2_frac >> MG_PLL_DIV0_FBDIV_FRAC_SHIFT;
3443                 } else {
3444                         m2_frac = 0;
3445                 }
3446         }
3447
3448         switch (pll_state->mg_clktop2_hsclkctl &
3449                 MG_CLKTOP2_HSCLKCTL_HSDIV_RATIO_MASK) {
3450         case MG_CLKTOP2_HSCLKCTL_HSDIV_RATIO_2:
3451                 div1 = 2;
3452                 break;
3453         case MG_CLKTOP2_HSCLKCTL_HSDIV_RATIO_3:
3454                 div1 = 3;
3455                 break;
3456         case MG_CLKTOP2_HSCLKCTL_HSDIV_RATIO_5:
3457                 div1 = 5;
3458                 break;
3459         case MG_CLKTOP2_HSCLKCTL_HSDIV_RATIO_7:
3460                 div1 = 7;
3461                 break;
3462         default:
3463                 MISSING_CASE(pll_state->mg_clktop2_hsclkctl);
3464                 return 0;
3465         }
3466
3467         div2 = (pll_state->mg_clktop2_hsclkctl &
3468                 MG_CLKTOP2_HSCLKCTL_DSDIV_RATIO_MASK) >>
3469                 MG_CLKTOP2_HSCLKCTL_DSDIV_RATIO_SHIFT;
3470
3471         /* div2 value of 0 is same as 1 means no div */
3472         if (div2 == 0)
3473                 div2 = 1;
3474
3475         /*
3476          * Adjust the original formula to delay the division by 2^22 in order to
3477          * minimize possible rounding errors.
3478          */
3479         tmp = (u64)m1 * m2_int * ref_clock +
3480               (((u64)m1 * m2_frac * ref_clock) >> 22);
3481         tmp = div_u64(tmp, 5 * div1 * div2);
3482
3483         return tmp;
3484 }
3485
3486 /**
3487  * icl_set_active_port_dpll - select the active port DPLL for a given CRTC
3488  * @crtc_state: state for the CRTC to select the DPLL for
3489  * @port_dpll_id: the active @port_dpll_id to select
3490  *
3491  * Select the given @port_dpll_id instance from the DPLLs reserved for the
3492  * CRTC.
3493  */
3494 void icl_set_active_port_dpll(struct intel_crtc_state *crtc_state,
3495                               enum icl_port_dpll_id port_dpll_id)
3496 {
3497         struct icl_port_dpll *port_dpll =
3498                 &crtc_state->icl_port_dplls[port_dpll_id];
3499
3500         crtc_state->shared_dpll = port_dpll->pll;
3501         crtc_state->dpll_hw_state = port_dpll->hw_state;
3502 }
3503
3504 static void icl_update_active_dpll(struct intel_atomic_state *state,
3505                                    struct intel_crtc *crtc,
3506                                    struct intel_encoder *encoder)
3507 {
3508         struct intel_crtc_state *crtc_state =
3509                 intel_atomic_get_new_crtc_state(state, crtc);
3510         struct intel_digital_port *primary_port;
3511         enum icl_port_dpll_id port_dpll_id = ICL_PORT_DPLL_DEFAULT;
3512
3513         primary_port = encoder->type == INTEL_OUTPUT_DP_MST ?
3514                 enc_to_mst(encoder)->primary :
3515                 enc_to_dig_port(encoder);
3516
3517         if (primary_port &&
3518             (primary_port->tc_mode == TC_PORT_DP_ALT ||
3519              primary_port->tc_mode == TC_PORT_LEGACY))
3520                 port_dpll_id = ICL_PORT_DPLL_MG_PHY;
3521
3522         icl_set_active_port_dpll(crtc_state, port_dpll_id);
3523 }
3524
3525 static u32 intel_get_hti_plls(struct drm_i915_private *i915)
3526 {
3527         if (!(i915->hti_state & HDPORT_ENABLED))
3528                 return 0;
3529
3530         return REG_FIELD_GET(HDPORT_DPLL_USED_MASK, i915->hti_state);
3531 }
3532
3533 static bool icl_get_combo_phy_dpll(struct intel_atomic_state *state,
3534                                    struct intel_crtc *crtc,
3535                                    struct intel_encoder *encoder)
3536 {
3537         struct intel_crtc_state *crtc_state =
3538                 intel_atomic_get_new_crtc_state(state, crtc);
3539         struct skl_wrpll_params pll_params = { };
3540         struct icl_port_dpll *port_dpll =
3541                 &crtc_state->icl_port_dplls[ICL_PORT_DPLL_DEFAULT];
3542         struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
3543         enum port port = encoder->port;
3544         unsigned long dpll_mask;
3545         int ret;
3546
3547         if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_HDMI) ||
3548             intel_crtc_has_type(crtc_state, INTEL_OUTPUT_DSI))
3549                 ret = icl_calc_wrpll(crtc_state, &pll_params);
3550         else
3551                 ret = icl_calc_dp_combo_pll(crtc_state, &pll_params);
3552
3553         if (!ret) {
3554                 drm_dbg_kms(&dev_priv->drm,
3555                             "Could not calculate combo PHY PLL state.\n");
3556
3557                 return false;
3558         }
3559
3560         icl_calc_dpll_state(dev_priv, &pll_params, &port_dpll->hw_state);
3561
3562         if (IS_DG1(dev_priv)) {
3563                 if (port == PORT_D || port == PORT_E) {
3564                         dpll_mask =
3565                                 BIT(DPLL_ID_DG1_DPLL2) |
3566                                 BIT(DPLL_ID_DG1_DPLL3);
3567                 } else {
3568                         dpll_mask =
3569                                 BIT(DPLL_ID_DG1_DPLL0) |
3570                                 BIT(DPLL_ID_DG1_DPLL1);
3571                 }
3572         } else if (IS_ROCKETLAKE(dev_priv)) {
3573                 dpll_mask =
3574                         BIT(DPLL_ID_EHL_DPLL4) |
3575                         BIT(DPLL_ID_ICL_DPLL1) |
3576                         BIT(DPLL_ID_ICL_DPLL0);
3577         } else if (IS_JSL_EHL(dev_priv) && port != PORT_A) {
3578                 dpll_mask =
3579                         BIT(DPLL_ID_EHL_DPLL4) |
3580                         BIT(DPLL_ID_ICL_DPLL1) |
3581                         BIT(DPLL_ID_ICL_DPLL0);
3582         } else {
3583                 dpll_mask = BIT(DPLL_ID_ICL_DPLL1) | BIT(DPLL_ID_ICL_DPLL0);
3584         }
3585
3586         /* Eliminate DPLLs from consideration if reserved by HTI */
3587         dpll_mask &= ~intel_get_hti_plls(dev_priv);
3588
3589         port_dpll->pll = intel_find_shared_dpll(state, crtc,
3590                                                 &port_dpll->hw_state,
3591                                                 dpll_mask);
3592         if (!port_dpll->pll) {
3593                 drm_dbg_kms(&dev_priv->drm,
3594                             "No combo PHY PLL found for [ENCODER:%d:%s]\n",
3595                             encoder->base.base.id, encoder->base.name);
3596                 return false;
3597         }
3598
3599         intel_reference_shared_dpll(state, crtc,
3600                                     port_dpll->pll, &port_dpll->hw_state);
3601
3602         icl_update_active_dpll(state, crtc, encoder);
3603
3604         return true;
3605 }
3606
3607 static bool icl_get_tc_phy_dplls(struct intel_atomic_state *state,
3608                                  struct intel_crtc *crtc,
3609                                  struct intel_encoder *encoder)
3610 {
3611         struct drm_i915_private *dev_priv = to_i915(state->base.dev);
3612         struct intel_crtc_state *crtc_state =
3613                 intel_atomic_get_new_crtc_state(state, crtc);
3614         struct skl_wrpll_params pll_params = { };
3615         struct icl_port_dpll *port_dpll;
3616         enum intel_dpll_id dpll_id;
3617
3618         port_dpll = &crtc_state->icl_port_dplls[ICL_PORT_DPLL_DEFAULT];
3619         if (!icl_calc_tbt_pll(crtc_state, &pll_params)) {
3620                 drm_dbg_kms(&dev_priv->drm,
3621                             "Could not calculate TBT PLL state.\n");
3622                 return false;
3623         }
3624
3625         icl_calc_dpll_state(dev_priv, &pll_params, &port_dpll->hw_state);
3626
3627         port_dpll->pll = intel_find_shared_dpll(state, crtc,
3628                                                 &port_dpll->hw_state,
3629                                                 BIT(DPLL_ID_ICL_TBTPLL));
3630         if (!port_dpll->pll) {
3631                 drm_dbg_kms(&dev_priv->drm, "No TBT-ALT PLL found\n");
3632                 return false;
3633         }
3634         intel_reference_shared_dpll(state, crtc,
3635                                     port_dpll->pll, &port_dpll->hw_state);
3636
3637
3638         port_dpll = &crtc_state->icl_port_dplls[ICL_PORT_DPLL_MG_PHY];
3639         if (!icl_calc_mg_pll_state(crtc_state, &port_dpll->hw_state)) {
3640                 drm_dbg_kms(&dev_priv->drm,
3641                             "Could not calculate MG PHY PLL state.\n");
3642                 goto err_unreference_tbt_pll;
3643         }
3644
3645         dpll_id = icl_tc_port_to_pll_id(intel_port_to_tc(dev_priv,
3646                                                          encoder->port));
3647         port_dpll->pll = intel_find_shared_dpll(state, crtc,
3648                                                 &port_dpll->hw_state,
3649                                                 BIT(dpll_id));
3650         if (!port_dpll->pll) {
3651                 drm_dbg_kms(&dev_priv->drm, "No MG PHY PLL found\n");
3652                 goto err_unreference_tbt_pll;
3653         }
3654         intel_reference_shared_dpll(state, crtc,
3655                                     port_dpll->pll, &port_dpll->hw_state);
3656
3657         icl_update_active_dpll(state, crtc, encoder);
3658
3659         return true;
3660
3661 err_unreference_tbt_pll:
3662         port_dpll = &crtc_state->icl_port_dplls[ICL_PORT_DPLL_DEFAULT];
3663         intel_unreference_shared_dpll(state, crtc, port_dpll->pll);
3664
3665         return false;
3666 }
3667
3668 static bool icl_get_dplls(struct intel_atomic_state *state,
3669                           struct intel_crtc *crtc,
3670                           struct intel_encoder *encoder)
3671 {
3672         struct drm_i915_private *dev_priv = to_i915(state->base.dev);
3673         enum phy phy = intel_port_to_phy(dev_priv, encoder->port);
3674
3675         if (intel_phy_is_combo(dev_priv, phy))
3676                 return icl_get_combo_phy_dpll(state, crtc, encoder);
3677         else if (intel_phy_is_tc(dev_priv, phy))
3678                 return icl_get_tc_phy_dplls(state, crtc, encoder);
3679
3680         MISSING_CASE(phy);
3681
3682         return false;
3683 }
3684
3685 static void icl_put_dplls(struct intel_atomic_state *state,
3686                           struct intel_crtc *crtc)
3687 {
3688         const struct intel_crtc_state *old_crtc_state =
3689                 intel_atomic_get_old_crtc_state(state, crtc);
3690         struct intel_crtc_state *new_crtc_state =
3691                 intel_atomic_get_new_crtc_state(state, crtc);
3692         enum icl_port_dpll_id id;
3693
3694         new_crtc_state->shared_dpll = NULL;
3695
3696         for (id = ICL_PORT_DPLL_DEFAULT; id < ICL_PORT_DPLL_COUNT; id++) {
3697                 const struct icl_port_dpll *old_port_dpll =
3698                         &old_crtc_state->icl_port_dplls[id];
3699                 struct icl_port_dpll *new_port_dpll =
3700                         &new_crtc_state->icl_port_dplls[id];
3701
3702                 new_port_dpll->pll = NULL;
3703
3704                 if (!old_port_dpll->pll)
3705                         continue;
3706
3707                 intel_unreference_shared_dpll(state, crtc, old_port_dpll->pll);
3708         }
3709 }
3710
3711 static bool mg_pll_get_hw_state(struct drm_i915_private *dev_priv,
3712                                 struct intel_shared_dpll *pll,
3713                                 struct intel_dpll_hw_state *hw_state)
3714 {
3715         const enum intel_dpll_id id = pll->info->id;
3716         enum tc_port tc_port = icl_pll_id_to_tc_port(id);
3717         intel_wakeref_t wakeref;
3718         bool ret = false;
3719         u32 val;
3720
3721         wakeref = intel_display_power_get_if_enabled(dev_priv,
3722                                                      POWER_DOMAIN_DISPLAY_CORE);
3723         if (!wakeref)
3724                 return false;
3725
3726         val = intel_de_read(dev_priv, MG_PLL_ENABLE(tc_port));
3727         if (!(val & PLL_ENABLE))
3728                 goto out;
3729
3730         hw_state->mg_refclkin_ctl = intel_de_read(dev_priv,
3731                                                   MG_REFCLKIN_CTL(tc_port));
3732         hw_state->mg_refclkin_ctl &= MG_REFCLKIN_CTL_OD_2_MUX_MASK;
3733
3734         hw_state->mg_clktop2_coreclkctl1 =
3735                 intel_de_read(dev_priv, MG_CLKTOP2_CORECLKCTL1(tc_port));
3736         hw_state->mg_clktop2_coreclkctl1 &=
3737                 MG_CLKTOP2_CORECLKCTL1_A_DIVRATIO_MASK;
3738
3739         hw_state->mg_clktop2_hsclkctl =
3740                 intel_de_read(dev_priv, MG_CLKTOP2_HSCLKCTL(tc_port));
3741         hw_state->mg_clktop2_hsclkctl &=
3742                 MG_CLKTOP2_HSCLKCTL_TLINEDRV_CLKSEL_MASK |
3743                 MG_CLKTOP2_HSCLKCTL_CORE_INPUTSEL_MASK |
3744                 MG_CLKTOP2_HSCLKCTL_HSDIV_RATIO_MASK |
3745                 MG_CLKTOP2_HSCLKCTL_DSDIV_RATIO_MASK;
3746
3747         hw_state->mg_pll_div0 = intel_de_read(dev_priv, MG_PLL_DIV0(tc_port));
3748         hw_state->mg_pll_div1 = intel_de_read(dev_priv, MG_PLL_DIV1(tc_port));
3749         hw_state->mg_pll_lf = intel_de_read(dev_priv, MG_PLL_LF(tc_port));
3750         hw_state->mg_pll_frac_lock = intel_de_read(dev_priv,
3751                                                    MG_PLL_FRAC_LOCK(tc_port));
3752         hw_state->mg_pll_ssc = intel_de_read(dev_priv, MG_PLL_SSC(tc_port));
3753
3754         hw_state->mg_pll_bias = intel_de_read(dev_priv, MG_PLL_BIAS(tc_port));
3755         hw_state->mg_pll_tdc_coldst_bias =
3756                 intel_de_read(dev_priv, MG_PLL_TDC_COLDST_BIAS(tc_port));
3757
3758         if (dev_priv->dpll.ref_clks.nssc == 38400) {
3759                 hw_state->mg_pll_tdc_coldst_bias_mask = MG_PLL_TDC_COLDST_COLDSTART;
3760                 hw_state->mg_pll_bias_mask = 0;
3761         } else {
3762                 hw_state->mg_pll_tdc_coldst_bias_mask = -1U;
3763                 hw_state->mg_pll_bias_mask = -1U;
3764         }
3765
3766         hw_state->mg_pll_tdc_coldst_bias &= hw_state->mg_pll_tdc_coldst_bias_mask;
3767         hw_state->mg_pll_bias &= hw_state->mg_pll_bias_mask;
3768
3769         ret = true;
3770 out:
3771         intel_display_power_put(dev_priv, POWER_DOMAIN_DISPLAY_CORE, wakeref);
3772         return ret;
3773 }
3774
3775 static bool dkl_pll_get_hw_state(struct drm_i915_private *dev_priv,
3776                                  struct intel_shared_dpll *pll,
3777                                  struct intel_dpll_hw_state *hw_state)
3778 {
3779         const enum intel_dpll_id id = pll->info->id;
3780         enum tc_port tc_port = icl_pll_id_to_tc_port(id);
3781         intel_wakeref_t wakeref;
3782         bool ret = false;
3783         u32 val;
3784
3785         wakeref = intel_display_power_get_if_enabled(dev_priv,
3786                                                      POWER_DOMAIN_DISPLAY_CORE);
3787         if (!wakeref)
3788                 return false;
3789
3790         val = intel_de_read(dev_priv, MG_PLL_ENABLE(tc_port));
3791         if (!(val & PLL_ENABLE))
3792                 goto out;
3793
3794         /*
3795          * All registers read here have the same HIP_INDEX_REG even though
3796          * they are on different building blocks
3797          */
3798         intel_de_write(dev_priv, HIP_INDEX_REG(tc_port),
3799                        HIP_INDEX_VAL(tc_port, 0x2));
3800
3801         hw_state->mg_refclkin_ctl = intel_de_read(dev_priv,
3802                                                   DKL_REFCLKIN_CTL(tc_port));
3803         hw_state->mg_refclkin_ctl &= MG_REFCLKIN_CTL_OD_2_MUX_MASK;
3804
3805         hw_state->mg_clktop2_hsclkctl =
3806                 intel_de_read(dev_priv, DKL_CLKTOP2_HSCLKCTL(tc_port));
3807         hw_state->mg_clktop2_hsclkctl &=
3808                 MG_CLKTOP2_HSCLKCTL_TLINEDRV_CLKSEL_MASK |
3809                 MG_CLKTOP2_HSCLKCTL_CORE_INPUTSEL_MASK |
3810                 MG_CLKTOP2_HSCLKCTL_HSDIV_RATIO_MASK |
3811                 MG_CLKTOP2_HSCLKCTL_DSDIV_RATIO_MASK;
3812
3813         hw_state->mg_clktop2_coreclkctl1 =
3814                 intel_de_read(dev_priv, DKL_CLKTOP2_CORECLKCTL1(tc_port));
3815         hw_state->mg_clktop2_coreclkctl1 &=
3816                 MG_CLKTOP2_CORECLKCTL1_A_DIVRATIO_MASK;
3817
3818         hw_state->mg_pll_div0 = intel_de_read(dev_priv, DKL_PLL_DIV0(tc_port));
3819         hw_state->mg_pll_div0 &= (DKL_PLL_DIV0_INTEG_COEFF_MASK |
3820                                   DKL_PLL_DIV0_PROP_COEFF_MASK |
3821                                   DKL_PLL_DIV0_FBPREDIV_MASK |
3822                                   DKL_PLL_DIV0_FBDIV_INT_MASK);
3823
3824         hw_state->mg_pll_div1 = intel_de_read(dev_priv, DKL_PLL_DIV1(tc_port));
3825         hw_state->mg_pll_div1 &= (DKL_PLL_DIV1_IREF_TRIM_MASK |
3826                                   DKL_PLL_DIV1_TDC_TARGET_CNT_MASK);
3827
3828         hw_state->mg_pll_ssc = intel_de_read(dev_priv, DKL_PLL_SSC(tc_port));
3829         hw_state->mg_pll_ssc &= (DKL_PLL_SSC_IREF_NDIV_RATIO_MASK |
3830                                  DKL_PLL_SSC_STEP_LEN_MASK |
3831                                  DKL_PLL_SSC_STEP_NUM_MASK |
3832                                  DKL_PLL_SSC_EN);
3833
3834         hw_state->mg_pll_bias = intel_de_read(dev_priv, DKL_PLL_BIAS(tc_port));
3835         hw_state->mg_pll_bias &= (DKL_PLL_BIAS_FRAC_EN_H |
3836                                   DKL_PLL_BIAS_FBDIV_FRAC_MASK);
3837
3838         hw_state->mg_pll_tdc_coldst_bias =
3839                 intel_de_read(dev_priv, DKL_PLL_TDC_COLDST_BIAS(tc_port));
3840         hw_state->mg_pll_tdc_coldst_bias &= (DKL_PLL_TDC_SSC_STEP_SIZE_MASK |
3841                                              DKL_PLL_TDC_FEED_FWD_GAIN_MASK);
3842
3843         ret = true;
3844 out:
3845         intel_display_power_put(dev_priv, POWER_DOMAIN_DISPLAY_CORE, wakeref);
3846         return ret;
3847 }
3848
3849 static bool icl_pll_get_hw_state(struct drm_i915_private *dev_priv,
3850                                  struct intel_shared_dpll *pll,
3851                                  struct intel_dpll_hw_state *hw_state,
3852                                  i915_reg_t enable_reg)
3853 {
3854         const enum intel_dpll_id id = pll->info->id;
3855         intel_wakeref_t wakeref;
3856         bool ret = false;
3857         u32 val;
3858
3859         wakeref = intel_display_power_get_if_enabled(dev_priv,
3860                                                      POWER_DOMAIN_DISPLAY_CORE);
3861         if (!wakeref)
3862                 return false;
3863
3864         val = intel_de_read(dev_priv, enable_reg);
3865         if (!(val & PLL_ENABLE))
3866                 goto out;
3867
3868         if (IS_DG1(dev_priv)) {
3869                 hw_state->cfgcr0 = intel_de_read(dev_priv, DG1_DPLL_CFGCR0(id));
3870                 hw_state->cfgcr1 = intel_de_read(dev_priv, DG1_DPLL_CFGCR1(id));
3871         } else if (IS_ROCKETLAKE(dev_priv)) {
3872                 hw_state->cfgcr0 = intel_de_read(dev_priv,
3873                                                  RKL_DPLL_CFGCR0(id));
3874                 hw_state->cfgcr1 = intel_de_read(dev_priv,
3875                                                  RKL_DPLL_CFGCR1(id));
3876         } else if (INTEL_GEN(dev_priv) >= 12) {
3877                 hw_state->cfgcr0 = intel_de_read(dev_priv,
3878                                                  TGL_DPLL_CFGCR0(id));
3879                 hw_state->cfgcr1 = intel_de_read(dev_priv,
3880                                                  TGL_DPLL_CFGCR1(id));
3881         } else {
3882                 if (IS_JSL_EHL(dev_priv) && id == DPLL_ID_EHL_DPLL4) {
3883                         hw_state->cfgcr0 = intel_de_read(dev_priv,
3884                                                          ICL_DPLL_CFGCR0(4));
3885                         hw_state->cfgcr1 = intel_de_read(dev_priv,
3886                                                          ICL_DPLL_CFGCR1(4));
3887                 } else {
3888                         hw_state->cfgcr0 = intel_de_read(dev_priv,
3889                                                          ICL_DPLL_CFGCR0(id));
3890                         hw_state->cfgcr1 = intel_de_read(dev_priv,
3891                                                          ICL_DPLL_CFGCR1(id));
3892                 }
3893         }
3894
3895         ret = true;
3896 out:
3897         intel_display_power_put(dev_priv, POWER_DOMAIN_DISPLAY_CORE, wakeref);
3898         return ret;
3899 }
3900
3901 static bool combo_pll_get_hw_state(struct drm_i915_private *dev_priv,
3902                                    struct intel_shared_dpll *pll,
3903                                    struct intel_dpll_hw_state *hw_state)
3904 {
3905         i915_reg_t enable_reg = intel_combo_pll_enable_reg(dev_priv, pll);
3906
3907         return icl_pll_get_hw_state(dev_priv, pll, hw_state, enable_reg);
3908 }
3909
3910 static bool tbt_pll_get_hw_state(struct drm_i915_private *dev_priv,
3911                                  struct intel_shared_dpll *pll,
3912                                  struct intel_dpll_hw_state *hw_state)
3913 {
3914         return icl_pll_get_hw_state(dev_priv, pll, hw_state, TBT_PLL_ENABLE);
3915 }
3916
3917 static void icl_dpll_write(struct drm_i915_private *dev_priv,
3918                            struct intel_shared_dpll *pll)
3919 {
3920         struct intel_dpll_hw_state *hw_state = &pll->state.hw_state;
3921         const enum intel_dpll_id id = pll->info->id;
3922         i915_reg_t cfgcr0_reg, cfgcr1_reg;
3923
3924         if (IS_DG1(dev_priv)) {
3925                 cfgcr0_reg = DG1_DPLL_CFGCR0(id);
3926                 cfgcr1_reg = DG1_DPLL_CFGCR1(id);
3927         } else if (IS_ROCKETLAKE(dev_priv)) {
3928                 cfgcr0_reg = RKL_DPLL_CFGCR0(id);
3929                 cfgcr1_reg = RKL_DPLL_CFGCR1(id);
3930         } else if (INTEL_GEN(dev_priv) >= 12) {
3931                 cfgcr0_reg = TGL_DPLL_CFGCR0(id);
3932                 cfgcr1_reg = TGL_DPLL_CFGCR1(id);
3933         } else {
3934                 if (IS_JSL_EHL(dev_priv) && id == DPLL_ID_EHL_DPLL4) {
3935                         cfgcr0_reg = ICL_DPLL_CFGCR0(4);
3936                         cfgcr1_reg = ICL_DPLL_CFGCR1(4);
3937                 } else {
3938                         cfgcr0_reg = ICL_DPLL_CFGCR0(id);
3939                         cfgcr1_reg = ICL_DPLL_CFGCR1(id);
3940                 }
3941         }
3942
3943         intel_de_write(dev_priv, cfgcr0_reg, hw_state->cfgcr0);
3944         intel_de_write(dev_priv, cfgcr1_reg, hw_state->cfgcr1);
3945         intel_de_posting_read(dev_priv, cfgcr1_reg);
3946 }
3947
3948 static void icl_mg_pll_write(struct drm_i915_private *dev_priv,
3949                              struct intel_shared_dpll *pll)
3950 {
3951         struct intel_dpll_hw_state *hw_state = &pll->state.hw_state;
3952         enum tc_port tc_port = icl_pll_id_to_tc_port(pll->info->id);
3953         u32 val;
3954
3955         /*
3956          * Some of the following registers have reserved fields, so program
3957          * these with RMW based on a mask. The mask can be fixed or generated
3958          * during the calc/readout phase if the mask depends on some other HW
3959          * state like refclk, see icl_calc_mg_pll_state().
3960          */
3961         val = intel_de_read(dev_priv, MG_REFCLKIN_CTL(tc_port));
3962         val &= ~MG_REFCLKIN_CTL_OD_2_MUX_MASK;
3963         val |= hw_state->mg_refclkin_ctl;
3964         intel_de_write(dev_priv, MG_REFCLKIN_CTL(tc_port), val);
3965
3966         val = intel_de_read(dev_priv, MG_CLKTOP2_CORECLKCTL1(tc_port));
3967         val &= ~MG_CLKTOP2_CORECLKCTL1_A_DIVRATIO_MASK;
3968         val |= hw_state->mg_clktop2_coreclkctl1;
3969         intel_de_write(dev_priv, MG_CLKTOP2_CORECLKCTL1(tc_port), val);
3970
3971         val = intel_de_read(dev_priv, MG_CLKTOP2_HSCLKCTL(tc_port));
3972         val &= ~(MG_CLKTOP2_HSCLKCTL_TLINEDRV_CLKSEL_MASK |
3973                  MG_CLKTOP2_HSCLKCTL_CORE_INPUTSEL_MASK |
3974                  MG_CLKTOP2_HSCLKCTL_HSDIV_RATIO_MASK |
3975                  MG_CLKTOP2_HSCLKCTL_DSDIV_RATIO_MASK);
3976         val |= hw_state->mg_clktop2_hsclkctl;
3977         intel_de_write(dev_priv, MG_CLKTOP2_HSCLKCTL(tc_port), val);
3978
3979         intel_de_write(dev_priv, MG_PLL_DIV0(tc_port), hw_state->mg_pll_div0);
3980         intel_de_write(dev_priv, MG_PLL_DIV1(tc_port), hw_state->mg_pll_div1);
3981         intel_de_write(dev_priv, MG_PLL_LF(tc_port), hw_state->mg_pll_lf);
3982         intel_de_write(dev_priv, MG_PLL_FRAC_LOCK(tc_port),
3983                        hw_state->mg_pll_frac_lock);
3984         intel_de_write(dev_priv, MG_PLL_SSC(tc_port), hw_state->mg_pll_ssc);
3985
3986         val = intel_de_read(dev_priv, MG_PLL_BIAS(tc_port));
3987         val &= ~hw_state->mg_pll_bias_mask;
3988         val |= hw_state->mg_pll_bias;
3989         intel_de_write(dev_priv, MG_PLL_BIAS(tc_port), val);
3990
3991         val = intel_de_read(dev_priv, MG_PLL_TDC_COLDST_BIAS(tc_port));
3992         val &= ~hw_state->mg_pll_tdc_coldst_bias_mask;
3993         val |= hw_state->mg_pll_tdc_coldst_bias;
3994         intel_de_write(dev_priv, MG_PLL_TDC_COLDST_BIAS(tc_port), val);
3995
3996         intel_de_posting_read(dev_priv, MG_PLL_TDC_COLDST_BIAS(tc_port));
3997 }
3998
3999 static void dkl_pll_write(struct drm_i915_private *dev_priv,
4000                           struct intel_shared_dpll *pll)
4001 {
4002         struct intel_dpll_hw_state *hw_state = &pll->state.hw_state;
4003         enum tc_port tc_port = icl_pll_id_to_tc_port(pll->info->id);
4004         u32 val;
4005
4006         /*
4007          * All registers programmed here have the same HIP_INDEX_REG even
4008          * though on different building block
4009          */
4010         intel_de_write(dev_priv, HIP_INDEX_REG(tc_port),
4011                        HIP_INDEX_VAL(tc_port, 0x2));
4012
4013         /* All the registers are RMW */
4014         val = intel_de_read(dev_priv, DKL_REFCLKIN_CTL(tc_port));
4015         val &= ~MG_REFCLKIN_CTL_OD_2_MUX_MASK;
4016         val |= hw_state->mg_refclkin_ctl;
4017         intel_de_write(dev_priv, DKL_REFCLKIN_CTL(tc_port), val);
4018
4019         val = intel_de_read(dev_priv, DKL_CLKTOP2_CORECLKCTL1(tc_port));
4020         val &= ~MG_CLKTOP2_CORECLKCTL1_A_DIVRATIO_MASK;
4021         val |= hw_state->mg_clktop2_coreclkctl1;
4022         intel_de_write(dev_priv, DKL_CLKTOP2_CORECLKCTL1(tc_port), val);
4023
4024         val = intel_de_read(dev_priv, DKL_CLKTOP2_HSCLKCTL(tc_port));
4025         val &= ~(MG_CLKTOP2_HSCLKCTL_TLINEDRV_CLKSEL_MASK |
4026                  MG_CLKTOP2_HSCLKCTL_CORE_INPUTSEL_MASK |
4027                  MG_CLKTOP2_HSCLKCTL_HSDIV_RATIO_MASK |
4028                  MG_CLKTOP2_HSCLKCTL_DSDIV_RATIO_MASK);
4029         val |= hw_state->mg_clktop2_hsclkctl;
4030         intel_de_write(dev_priv, DKL_CLKTOP2_HSCLKCTL(tc_port), val);
4031
4032         val = intel_de_read(dev_priv, DKL_PLL_DIV0(tc_port));
4033         val &= ~(DKL_PLL_DIV0_INTEG_COEFF_MASK |
4034                  DKL_PLL_DIV0_PROP_COEFF_MASK |
4035                  DKL_PLL_DIV0_FBPREDIV_MASK |
4036                  DKL_PLL_DIV0_FBDIV_INT_MASK);
4037         val |= hw_state->mg_pll_div0;
4038         intel_de_write(dev_priv, DKL_PLL_DIV0(tc_port), val);
4039
4040         val = intel_de_read(dev_priv, DKL_PLL_DIV1(tc_port));
4041         val &= ~(DKL_PLL_DIV1_IREF_TRIM_MASK |
4042                  DKL_PLL_DIV1_TDC_TARGET_CNT_MASK);
4043         val |= hw_state->mg_pll_div1;
4044         intel_de_write(dev_priv, DKL_PLL_DIV1(tc_port), val);
4045
4046         val = intel_de_read(dev_priv, DKL_PLL_SSC(tc_port));
4047         val &= ~(DKL_PLL_SSC_IREF_NDIV_RATIO_MASK |
4048                  DKL_PLL_SSC_STEP_LEN_MASK |
4049                  DKL_PLL_SSC_STEP_NUM_MASK |
4050                  DKL_PLL_SSC_EN);
4051         val |= hw_state->mg_pll_ssc;
4052         intel_de_write(dev_priv, DKL_PLL_SSC(tc_port), val);
4053
4054         val = intel_de_read(dev_priv, DKL_PLL_BIAS(tc_port));
4055         val &= ~(DKL_PLL_BIAS_FRAC_EN_H |
4056                  DKL_PLL_BIAS_FBDIV_FRAC_MASK);
4057         val |= hw_state->mg_pll_bias;
4058         intel_de_write(dev_priv, DKL_PLL_BIAS(tc_port), val);
4059
4060         val = intel_de_read(dev_priv, DKL_PLL_TDC_COLDST_BIAS(tc_port));
4061         val &= ~(DKL_PLL_TDC_SSC_STEP_SIZE_MASK |
4062                  DKL_PLL_TDC_FEED_FWD_GAIN_MASK);
4063         val |= hw_state->mg_pll_tdc_coldst_bias;
4064         intel_de_write(dev_priv, DKL_PLL_TDC_COLDST_BIAS(tc_port), val);
4065
4066         intel_de_posting_read(dev_priv, DKL_PLL_TDC_COLDST_BIAS(tc_port));
4067 }
4068
4069 static void icl_pll_power_enable(struct drm_i915_private *dev_priv,
4070                                  struct intel_shared_dpll *pll,
4071                                  i915_reg_t enable_reg)
4072 {
4073         u32 val;
4074
4075         val = intel_de_read(dev_priv, enable_reg);
4076         val |= PLL_POWER_ENABLE;
4077         intel_de_write(dev_priv, enable_reg, val);
4078
4079         /*
4080          * The spec says we need to "wait" but it also says it should be
4081          * immediate.
4082          */
4083         if (intel_de_wait_for_set(dev_priv, enable_reg, PLL_POWER_STATE, 1))
4084                 drm_err(&dev_priv->drm, "PLL %d Power not enabled\n",
4085                         pll->info->id);
4086 }
4087
4088 static void icl_pll_enable(struct drm_i915_private *dev_priv,
4089                            struct intel_shared_dpll *pll,
4090                            i915_reg_t enable_reg)
4091 {
4092         u32 val;
4093
4094         val = intel_de_read(dev_priv, enable_reg);
4095         val |= PLL_ENABLE;
4096         intel_de_write(dev_priv, enable_reg, val);
4097
4098         /* Timeout is actually 600us. */
4099         if (intel_de_wait_for_set(dev_priv, enable_reg, PLL_LOCK, 1))
4100                 drm_err(&dev_priv->drm, "PLL %d not locked\n", pll->info->id);
4101 }
4102
4103 static void combo_pll_enable(struct drm_i915_private *dev_priv,
4104                              struct intel_shared_dpll *pll)
4105 {
4106         i915_reg_t enable_reg = intel_combo_pll_enable_reg(dev_priv, pll);
4107
4108         if (IS_JSL_EHL(dev_priv) &&
4109             pll->info->id == DPLL_ID_EHL_DPLL4) {
4110
4111                 /*
4112                  * We need to disable DC states when this DPLL is enabled.
4113                  * This can be done by taking a reference on DPLL4 power
4114                  * domain.
4115                  */
4116                 pll->wakeref = intel_display_power_get(dev_priv,
4117                                                        POWER_DOMAIN_DPLL_DC_OFF);
4118         }
4119
4120         icl_pll_power_enable(dev_priv, pll, enable_reg);
4121
4122         icl_dpll_write(dev_priv, pll);
4123
4124         /*
4125          * DVFS pre sequence would be here, but in our driver the cdclk code
4126          * paths should already be setting the appropriate voltage, hence we do
4127          * nothing here.
4128          */
4129
4130         icl_pll_enable(dev_priv, pll, enable_reg);
4131
4132         /* DVFS post sequence would be here. See the comment above. */
4133 }
4134
4135 static void tbt_pll_enable(struct drm_i915_private *dev_priv,
4136                            struct intel_shared_dpll *pll)
4137 {
4138         icl_pll_power_enable(dev_priv, pll, TBT_PLL_ENABLE);
4139
4140         icl_dpll_write(dev_priv, pll);
4141
4142         /*
4143          * DVFS pre sequence would be here, but in our driver the cdclk code
4144          * paths should already be setting the appropriate voltage, hence we do
4145          * nothing here.
4146          */
4147
4148         icl_pll_enable(dev_priv, pll, TBT_PLL_ENABLE);
4149
4150         /* DVFS post sequence would be here. See the comment above. */
4151 }
4152
4153 static void mg_pll_enable(struct drm_i915_private *dev_priv,
4154                           struct intel_shared_dpll *pll)
4155 {
4156         i915_reg_t enable_reg =
4157                 MG_PLL_ENABLE(icl_pll_id_to_tc_port(pll->info->id));
4158
4159         icl_pll_power_enable(dev_priv, pll, enable_reg);
4160
4161         if (INTEL_GEN(dev_priv) >= 12)
4162                 dkl_pll_write(dev_priv, pll);
4163         else
4164                 icl_mg_pll_write(dev_priv, pll);
4165
4166         /*
4167          * DVFS pre sequence would be here, but in our driver the cdclk code
4168          * paths should already be setting the appropriate voltage, hence we do
4169          * nothing here.
4170          */
4171
4172         icl_pll_enable(dev_priv, pll, enable_reg);
4173
4174         /* DVFS post sequence would be here. See the comment above. */
4175 }
4176
4177 static void icl_pll_disable(struct drm_i915_private *dev_priv,
4178                             struct intel_shared_dpll *pll,
4179                             i915_reg_t enable_reg)
4180 {
4181         u32 val;
4182
4183         /* The first steps are done by intel_ddi_post_disable(). */
4184
4185         /*
4186          * DVFS pre sequence would be here, but in our driver the cdclk code
4187          * paths should already be setting the appropriate voltage, hence we do
4188          * nothign here.
4189          */
4190
4191         val = intel_de_read(dev_priv, enable_reg);
4192         val &= ~PLL_ENABLE;
4193         intel_de_write(dev_priv, enable_reg, val);
4194
4195         /* Timeout is actually 1us. */
4196         if (intel_de_wait_for_clear(dev_priv, enable_reg, PLL_LOCK, 1))
4197                 drm_err(&dev_priv->drm, "PLL %d locked\n", pll->info->id);
4198
4199         /* DVFS post sequence would be here. See the comment above. */
4200
4201         val = intel_de_read(dev_priv, enable_reg);
4202         val &= ~PLL_POWER_ENABLE;
4203         intel_de_write(dev_priv, enable_reg, val);
4204
4205         /*
4206          * The spec says we need to "wait" but it also says it should be
4207          * immediate.
4208          */
4209         if (intel_de_wait_for_clear(dev_priv, enable_reg, PLL_POWER_STATE, 1))
4210                 drm_err(&dev_priv->drm, "PLL %d Power not disabled\n",
4211                         pll->info->id);
4212 }
4213
4214 static void combo_pll_disable(struct drm_i915_private *dev_priv,
4215                               struct intel_shared_dpll *pll)
4216 {
4217         i915_reg_t enable_reg = intel_combo_pll_enable_reg(dev_priv, pll);
4218
4219         icl_pll_disable(dev_priv, pll, enable_reg);
4220
4221         if (IS_JSL_EHL(dev_priv) &&
4222             pll->info->id == DPLL_ID_EHL_DPLL4)
4223                 intel_display_power_put(dev_priv, POWER_DOMAIN_DPLL_DC_OFF,
4224                                         pll->wakeref);
4225 }
4226
4227 static void tbt_pll_disable(struct drm_i915_private *dev_priv,
4228                             struct intel_shared_dpll *pll)
4229 {
4230         icl_pll_disable(dev_priv, pll, TBT_PLL_ENABLE);
4231 }
4232
4233 static void mg_pll_disable(struct drm_i915_private *dev_priv,
4234                            struct intel_shared_dpll *pll)
4235 {
4236         i915_reg_t enable_reg =
4237                 MG_PLL_ENABLE(icl_pll_id_to_tc_port(pll->info->id));
4238
4239         icl_pll_disable(dev_priv, pll, enable_reg);
4240 }
4241
4242 static void icl_update_dpll_ref_clks(struct drm_i915_private *i915)
4243 {
4244         /* No SSC ref */
4245         i915->dpll.ref_clks.nssc = i915->cdclk.hw.ref;
4246 }
4247
4248 static void icl_dump_hw_state(struct drm_i915_private *dev_priv,
4249                               const struct intel_dpll_hw_state *hw_state)
4250 {
4251         drm_dbg_kms(&dev_priv->drm,
4252                     "dpll_hw_state: cfgcr0: 0x%x, cfgcr1: 0x%x, "
4253                     "mg_refclkin_ctl: 0x%x, hg_clktop2_coreclkctl1: 0x%x, "
4254                     "mg_clktop2_hsclkctl: 0x%x, mg_pll_div0: 0x%x, "
4255                     "mg_pll_div2: 0x%x, mg_pll_lf: 0x%x, "
4256                     "mg_pll_frac_lock: 0x%x, mg_pll_ssc: 0x%x, "
4257                     "mg_pll_bias: 0x%x, mg_pll_tdc_coldst_bias: 0x%x\n",
4258                     hw_state->cfgcr0, hw_state->cfgcr1,
4259                     hw_state->mg_refclkin_ctl,
4260                     hw_state->mg_clktop2_coreclkctl1,
4261                     hw_state->mg_clktop2_hsclkctl,
4262                     hw_state->mg_pll_div0,
4263                     hw_state->mg_pll_div1,
4264                     hw_state->mg_pll_lf,
4265                     hw_state->mg_pll_frac_lock,
4266                     hw_state->mg_pll_ssc,
4267                     hw_state->mg_pll_bias,
4268                     hw_state->mg_pll_tdc_coldst_bias);
4269 }
4270
4271 static const struct intel_shared_dpll_funcs combo_pll_funcs = {
4272         .enable = combo_pll_enable,
4273         .disable = combo_pll_disable,
4274         .get_hw_state = combo_pll_get_hw_state,
4275         .get_freq = icl_ddi_combo_pll_get_freq,
4276 };
4277
4278 static const struct intel_shared_dpll_funcs tbt_pll_funcs = {
4279         .enable = tbt_pll_enable,
4280         .disable = tbt_pll_disable,
4281         .get_hw_state = tbt_pll_get_hw_state,
4282         .get_freq = icl_ddi_tbt_pll_get_freq,
4283 };
4284
4285 static const struct intel_shared_dpll_funcs mg_pll_funcs = {
4286         .enable = mg_pll_enable,
4287         .disable = mg_pll_disable,
4288         .get_hw_state = mg_pll_get_hw_state,
4289         .get_freq = icl_ddi_mg_pll_get_freq,
4290 };
4291
4292 static const struct dpll_info icl_plls[] = {
4293         { "DPLL 0",   &combo_pll_funcs, DPLL_ID_ICL_DPLL0,  0 },
4294         { "DPLL 1",   &combo_pll_funcs, DPLL_ID_ICL_DPLL1,  0 },
4295         { "TBT PLL",  &tbt_pll_funcs, DPLL_ID_ICL_TBTPLL, 0 },
4296         { "MG PLL 1", &mg_pll_funcs, DPLL_ID_ICL_MGPLL1, 0 },
4297         { "MG PLL 2", &mg_pll_funcs, DPLL_ID_ICL_MGPLL2, 0 },
4298         { "MG PLL 3", &mg_pll_funcs, DPLL_ID_ICL_MGPLL3, 0 },
4299         { "MG PLL 4", &mg_pll_funcs, DPLL_ID_ICL_MGPLL4, 0 },
4300         { },
4301 };
4302
4303 static const struct intel_dpll_mgr icl_pll_mgr = {
4304         .dpll_info = icl_plls,
4305         .get_dplls = icl_get_dplls,
4306         .put_dplls = icl_put_dplls,
4307         .update_active_dpll = icl_update_active_dpll,
4308         .update_ref_clks = icl_update_dpll_ref_clks,
4309         .dump_hw_state = icl_dump_hw_state,
4310 };
4311
4312 static const struct dpll_info ehl_plls[] = {
4313         { "DPLL 0", &combo_pll_funcs, DPLL_ID_ICL_DPLL0, 0 },
4314         { "DPLL 1", &combo_pll_funcs, DPLL_ID_ICL_DPLL1, 0 },
4315         { "DPLL 4", &combo_pll_funcs, DPLL_ID_EHL_DPLL4, 0 },
4316         { },
4317 };
4318
4319 static const struct intel_dpll_mgr ehl_pll_mgr = {
4320         .dpll_info = ehl_plls,
4321         .get_dplls = icl_get_dplls,
4322         .put_dplls = icl_put_dplls,
4323         .update_ref_clks = icl_update_dpll_ref_clks,
4324         .dump_hw_state = icl_dump_hw_state,
4325 };
4326
4327 static const struct intel_shared_dpll_funcs dkl_pll_funcs = {
4328         .enable = mg_pll_enable,
4329         .disable = mg_pll_disable,
4330         .get_hw_state = dkl_pll_get_hw_state,
4331         .get_freq = icl_ddi_mg_pll_get_freq,
4332 };
4333
4334 static const struct dpll_info tgl_plls[] = {
4335         { "DPLL 0", &combo_pll_funcs, DPLL_ID_ICL_DPLL0,  0 },
4336         { "DPLL 1", &combo_pll_funcs, DPLL_ID_ICL_DPLL1,  0 },
4337         { "TBT PLL",  &tbt_pll_funcs, DPLL_ID_ICL_TBTPLL, 0 },
4338         { "TC PLL 1", &dkl_pll_funcs, DPLL_ID_ICL_MGPLL1, 0 },
4339         { "TC PLL 2", &dkl_pll_funcs, DPLL_ID_ICL_MGPLL2, 0 },
4340         { "TC PLL 3", &dkl_pll_funcs, DPLL_ID_ICL_MGPLL3, 0 },
4341         { "TC PLL 4", &dkl_pll_funcs, DPLL_ID_ICL_MGPLL4, 0 },
4342         { "TC PLL 5", &dkl_pll_funcs, DPLL_ID_TGL_MGPLL5, 0 },
4343         { "TC PLL 6", &dkl_pll_funcs, DPLL_ID_TGL_MGPLL6, 0 },
4344         { },
4345 };
4346
4347 static const struct intel_dpll_mgr tgl_pll_mgr = {
4348         .dpll_info = tgl_plls,
4349         .get_dplls = icl_get_dplls,
4350         .put_dplls = icl_put_dplls,
4351         .update_active_dpll = icl_update_active_dpll,
4352         .update_ref_clks = icl_update_dpll_ref_clks,
4353         .dump_hw_state = icl_dump_hw_state,
4354 };
4355
4356 static const struct dpll_info rkl_plls[] = {
4357         { "DPLL 0", &combo_pll_funcs, DPLL_ID_ICL_DPLL0, 0 },
4358         { "DPLL 1", &combo_pll_funcs, DPLL_ID_ICL_DPLL1, 0 },
4359         { "DPLL 4", &combo_pll_funcs, DPLL_ID_EHL_DPLL4, 0 },
4360         { },
4361 };
4362
4363 static const struct intel_dpll_mgr rkl_pll_mgr = {
4364         .dpll_info = rkl_plls,
4365         .get_dplls = icl_get_dplls,
4366         .put_dplls = icl_put_dplls,
4367         .update_ref_clks = icl_update_dpll_ref_clks,
4368         .dump_hw_state = icl_dump_hw_state,
4369 };
4370
4371 static const struct dpll_info dg1_plls[] = {
4372         { "DPLL 0", &combo_pll_funcs, DPLL_ID_DG1_DPLL0, 0 },
4373         { "DPLL 1", &combo_pll_funcs, DPLL_ID_DG1_DPLL1, 0 },
4374         { "DPLL 2", &combo_pll_funcs, DPLL_ID_DG1_DPLL2, 0 },
4375         { "DPLL 3", &combo_pll_funcs, DPLL_ID_DG1_DPLL3, 0 },
4376         { },
4377 };
4378
4379 static const struct intel_dpll_mgr dg1_pll_mgr = {
4380         .dpll_info = dg1_plls,
4381         .get_dplls = icl_get_dplls,
4382         .put_dplls = icl_put_dplls,
4383         .update_ref_clks = icl_update_dpll_ref_clks,
4384         .dump_hw_state = icl_dump_hw_state,
4385 };
4386
4387 /**
4388  * intel_shared_dpll_init - Initialize shared DPLLs
4389  * @dev: drm device
4390  *
4391  * Initialize shared DPLLs for @dev.
4392  */
4393 void intel_shared_dpll_init(struct drm_device *dev)
4394 {
4395         struct drm_i915_private *dev_priv = to_i915(dev);
4396         const struct intel_dpll_mgr *dpll_mgr = NULL;
4397         const struct dpll_info *dpll_info;
4398         int i;
4399
4400         if (IS_DG1(dev_priv))
4401                 dpll_mgr = &dg1_pll_mgr;
4402         else if (IS_ROCKETLAKE(dev_priv))
4403                 dpll_mgr = &rkl_pll_mgr;
4404         else if (INTEL_GEN(dev_priv) >= 12)
4405                 dpll_mgr = &tgl_pll_mgr;
4406         else if (IS_JSL_EHL(dev_priv))
4407                 dpll_mgr = &ehl_pll_mgr;
4408         else if (INTEL_GEN(dev_priv) >= 11)
4409                 dpll_mgr = &icl_pll_mgr;
4410         else if (IS_CANNONLAKE(dev_priv))
4411                 dpll_mgr = &cnl_pll_mgr;
4412         else if (IS_GEN9_BC(dev_priv))
4413                 dpll_mgr = &skl_pll_mgr;
4414         else if (IS_GEN9_LP(dev_priv))
4415                 dpll_mgr = &bxt_pll_mgr;
4416         else if (HAS_DDI(dev_priv))
4417                 dpll_mgr = &hsw_pll_mgr;
4418         else if (HAS_PCH_IBX(dev_priv) || HAS_PCH_CPT(dev_priv))
4419                 dpll_mgr = &pch_pll_mgr;
4420
4421         if (!dpll_mgr) {
4422                 dev_priv->dpll.num_shared_dpll = 0;
4423                 return;
4424         }
4425
4426         dpll_info = dpll_mgr->dpll_info;
4427
4428         for (i = 0; dpll_info[i].name; i++) {
4429                 drm_WARN_ON(dev, i != dpll_info[i].id);
4430                 dev_priv->dpll.shared_dplls[i].info = &dpll_info[i];
4431         }
4432
4433         dev_priv->dpll.mgr = dpll_mgr;
4434         dev_priv->dpll.num_shared_dpll = i;
4435         mutex_init(&dev_priv->dpll.lock);
4436
4437         BUG_ON(dev_priv->dpll.num_shared_dpll > I915_NUM_PLLS);
4438 }
4439
4440 /**
4441  * intel_reserve_shared_dplls - reserve DPLLs for CRTC and encoder combination
4442  * @state: atomic state
4443  * @crtc: CRTC to reserve DPLLs for
4444  * @encoder: encoder
4445  *
4446  * This function reserves all required DPLLs for the given CRTC and encoder
4447  * combination in the current atomic commit @state and the new @crtc atomic
4448  * state.
4449  *
4450  * The new configuration in the atomic commit @state is made effective by
4451  * calling intel_shared_dpll_swap_state().
4452  *
4453  * The reserved DPLLs should be released by calling
4454  * intel_release_shared_dplls().
4455  *
4456  * Returns:
4457  * True if all required DPLLs were successfully reserved.
4458  */
4459 bool intel_reserve_shared_dplls(struct intel_atomic_state *state,
4460                                 struct intel_crtc *crtc,
4461                                 struct intel_encoder *encoder)
4462 {
4463         struct drm_i915_private *dev_priv = to_i915(state->base.dev);
4464         const struct intel_dpll_mgr *dpll_mgr = dev_priv->dpll.mgr;
4465
4466         if (drm_WARN_ON(&dev_priv->drm, !dpll_mgr))
4467                 return false;
4468
4469         return dpll_mgr->get_dplls(state, crtc, encoder);
4470 }
4471
4472 /**
4473  * intel_release_shared_dplls - end use of DPLLs by CRTC in atomic state
4474  * @state: atomic state
4475  * @crtc: crtc from which the DPLLs are to be released
4476  *
4477  * This function releases all DPLLs reserved by intel_reserve_shared_dplls()
4478  * from the current atomic commit @state and the old @crtc atomic state.
4479  *
4480  * The new configuration in the atomic commit @state is made effective by
4481  * calling intel_shared_dpll_swap_state().
4482  */
4483 void intel_release_shared_dplls(struct intel_atomic_state *state,
4484                                 struct intel_crtc *crtc)
4485 {
4486         struct drm_i915_private *dev_priv = to_i915(state->base.dev);
4487         const struct intel_dpll_mgr *dpll_mgr = dev_priv->dpll.mgr;
4488
4489         /*
4490          * FIXME: this function is called for every platform having a
4491          * compute_clock hook, even though the platform doesn't yet support
4492          * the shared DPLL framework and intel_reserve_shared_dplls() is not
4493          * called on those.
4494          */
4495         if (!dpll_mgr)
4496                 return;
4497
4498         dpll_mgr->put_dplls(state, crtc);
4499 }
4500
4501 /**
4502  * intel_update_active_dpll - update the active DPLL for a CRTC/encoder
4503  * @state: atomic state
4504  * @crtc: the CRTC for which to update the active DPLL
4505  * @encoder: encoder determining the type of port DPLL
4506  *
4507  * Update the active DPLL for the given @crtc/@encoder in @crtc's atomic state,
4508  * from the port DPLLs reserved previously by intel_reserve_shared_dplls(). The
4509  * DPLL selected will be based on the current mode of the encoder's port.
4510  */
4511 void intel_update_active_dpll(struct intel_atomic_state *state,
4512                               struct intel_crtc *crtc,
4513                               struct intel_encoder *encoder)
4514 {
4515         struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
4516         const struct intel_dpll_mgr *dpll_mgr = dev_priv->dpll.mgr;
4517
4518         if (drm_WARN_ON(&dev_priv->drm, !dpll_mgr))
4519                 return;
4520
4521         dpll_mgr->update_active_dpll(state, crtc, encoder);
4522 }
4523
4524 /**
4525  * intel_dpll_get_freq - calculate the DPLL's output frequency
4526  * @i915: i915 device
4527  * @pll: DPLL for which to calculate the output frequency
4528  * @pll_state: DPLL state from which to calculate the output frequency
4529  *
4530  * Return the output frequency corresponding to @pll's passed in @pll_state.
4531  */
4532 int intel_dpll_get_freq(struct drm_i915_private *i915,
4533                         const struct intel_shared_dpll *pll,
4534                         const struct intel_dpll_hw_state *pll_state)
4535 {
4536         if (drm_WARN_ON(&i915->drm, !pll->info->funcs->get_freq))
4537                 return 0;
4538
4539         return pll->info->funcs->get_freq(i915, pll, pll_state);
4540 }
4541
4542 /**
4543  * intel_dpll_get_hw_state - readout the DPLL's hardware state
4544  * @i915: i915 device
4545  * @pll: DPLL for which to calculate the output frequency
4546  * @hw_state: DPLL's hardware state
4547  *
4548  * Read out @pll's hardware state into @hw_state.
4549  */
4550 bool intel_dpll_get_hw_state(struct drm_i915_private *i915,
4551                              struct intel_shared_dpll *pll,
4552                              struct intel_dpll_hw_state *hw_state)
4553 {
4554         return pll->info->funcs->get_hw_state(i915, pll, hw_state);
4555 }
4556
4557 static void readout_dpll_hw_state(struct drm_i915_private *i915,
4558                                   struct intel_shared_dpll *pll)
4559 {
4560         struct intel_crtc *crtc;
4561
4562         pll->on = intel_dpll_get_hw_state(i915, pll, &pll->state.hw_state);
4563
4564         if (IS_JSL_EHL(i915) && pll->on &&
4565             pll->info->id == DPLL_ID_EHL_DPLL4) {
4566                 pll->wakeref = intel_display_power_get(i915,
4567                                                        POWER_DOMAIN_DPLL_DC_OFF);
4568         }
4569
4570         pll->state.crtc_mask = 0;
4571         for_each_intel_crtc(&i915->drm, crtc) {
4572                 struct intel_crtc_state *crtc_state =
4573                         to_intel_crtc_state(crtc->base.state);
4574
4575                 if (crtc_state->hw.active && crtc_state->shared_dpll == pll)
4576                         pll->state.crtc_mask |= 1 << crtc->pipe;
4577         }
4578         pll->active_mask = pll->state.crtc_mask;
4579
4580         drm_dbg_kms(&i915->drm,
4581                     "%s hw state readout: crtc_mask 0x%08x, on %i\n",
4582                     pll->info->name, pll->state.crtc_mask, pll->on);
4583 }
4584
4585 void intel_dpll_readout_hw_state(struct drm_i915_private *i915)
4586 {
4587         int i;
4588
4589         if (i915->dpll.mgr && i915->dpll.mgr->update_ref_clks)
4590                 i915->dpll.mgr->update_ref_clks(i915);
4591
4592         for (i = 0; i < i915->dpll.num_shared_dpll; i++)
4593                 readout_dpll_hw_state(i915, &i915->dpll.shared_dplls[i]);
4594 }
4595
4596 static void sanitize_dpll_state(struct drm_i915_private *i915,
4597                                 struct intel_shared_dpll *pll)
4598 {
4599         if (!pll->on || pll->active_mask)
4600                 return;
4601
4602         drm_dbg_kms(&i915->drm,
4603                     "%s enabled but not in use, disabling\n",
4604                     pll->info->name);
4605
4606         pll->info->funcs->disable(i915, pll);
4607         pll->on = false;
4608 }
4609
4610 void intel_dpll_sanitize_state(struct drm_i915_private *i915)
4611 {
4612         int i;
4613
4614         for (i = 0; i < i915->dpll.num_shared_dpll; i++)
4615                 sanitize_dpll_state(i915, &i915->dpll.shared_dplls[i]);
4616 }
4617
4618 /**
4619  * intel_dpll_dump_hw_state - write hw_state to dmesg
4620  * @dev_priv: i915 drm device
4621  * @hw_state: hw state to be written to the log
4622  *
4623  * Write the relevant values in @hw_state to dmesg using drm_dbg_kms.
4624  */
4625 void intel_dpll_dump_hw_state(struct drm_i915_private *dev_priv,
4626                               const struct intel_dpll_hw_state *hw_state)
4627 {
4628         if (dev_priv->dpll.mgr) {
4629                 dev_priv->dpll.mgr->dump_hw_state(dev_priv, hw_state);
4630         } else {
4631                 /* fallback for platforms that don't use the shared dpll
4632                  * infrastructure
4633                  */
4634                 drm_dbg_kms(&dev_priv->drm,
4635                             "dpll_hw_state: dpll: 0x%x, dpll_md: 0x%x, "
4636                             "fp0: 0x%x, fp1: 0x%x\n",
4637                             hw_state->dpll,
4638                             hw_state->dpll_md,
4639                             hw_state->fp0,
4640                             hw_state->fp1);
4641         }
4642 }