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