1 /*
2 * Copyright © 2006-2016 Intel Corporation
3 *
4 * Permission is hereby granted, free of charge, to any person obtaining a
5 * copy of this software and associated documentation files (the "Software"),
6 * to deal in the Software without restriction, including without limitation
7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8 * and/or sell copies of the Software, and to permit persons to whom the
9 * Software is furnished to do so, subject to the following conditions:
10 *
11 * The above copyright notice and this permission notice (including the next
12 * paragraph) shall be included in all copies or substantial portions of the
13 * Software.
14 *
15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
18 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
21 * DEALINGS IN THE SOFTWARE.
22 */
23
24 #include "intel_drv.h"
25
26 /**
27 * DOC: Display PLLs
28 *
29 * Display PLLs used for driving outputs vary by platform. While some have
30 * per-pipe or per-encoder dedicated PLLs, others allow the use of any PLL
31 * from a pool. In the latter scenario, it is possible that multiple pipes
32 * share a PLL if their configurations match.
33 *
34 * This file provides an abstraction over display PLLs. The function
35 * intel_shared_dpll_init() initializes the PLLs for the given platform. The
36 * users of a PLL are tracked and that tracking is integrated with the atomic
37 * modest interface. During an atomic operation, a PLL can be requested for a
38 * given CRTC and encoder configuration by calling intel_get_shared_dpll() and
39 * a previously used PLL can be released with intel_release_shared_dpll().
40 * Changes to the users are first staged in the atomic state, and then made
41 * effective by calling intel_shared_dpll_swap_state() during the atomic
42 * commit phase.
43 */
44
45 static void
intel_atomic_duplicate_dpll_state(struct drm_i915_private * dev_priv,struct intel_shared_dpll_state * shared_dpll)46 intel_atomic_duplicate_dpll_state(struct drm_i915_private *dev_priv,
47 struct intel_shared_dpll_state *shared_dpll)
48 {
49 enum intel_dpll_id i;
50
51 /* Copy shared dpll state */
52 for (i = 0; i < dev_priv->num_shared_dpll; i++) {
53 struct intel_shared_dpll *pll = &dev_priv->shared_dplls[i];
54
55 shared_dpll[i] = pll->state;
56 }
57 }
58
59 static struct intel_shared_dpll_state *
intel_atomic_get_shared_dpll_state(struct drm_atomic_state * s)60 intel_atomic_get_shared_dpll_state(struct drm_atomic_state *s)
61 {
62 struct intel_atomic_state *state = to_intel_atomic_state(s);
63
64 WARN_ON(!drm_modeset_is_locked(&s->dev->mode_config.connection_mutex));
65
66 if (!state->dpll_set) {
67 state->dpll_set = true;
68
69 intel_atomic_duplicate_dpll_state(to_i915(s->dev),
70 state->shared_dpll);
71 }
72
73 return state->shared_dpll;
74 }
75
76 /**
77 * intel_get_shared_dpll_by_id - get a DPLL given its id
78 * @dev_priv: i915 device instance
79 * @id: pll id
80 *
81 * Returns:
82 * A pointer to the DPLL with @id
83 */
84 struct intel_shared_dpll *
intel_get_shared_dpll_by_id(struct drm_i915_private * dev_priv,enum intel_dpll_id id)85 intel_get_shared_dpll_by_id(struct drm_i915_private *dev_priv,
86 enum intel_dpll_id id)
87 {
88 return &dev_priv->shared_dplls[id];
89 }
90
91 /**
92 * intel_get_shared_dpll_id - get the id of a DPLL
93 * @dev_priv: i915 device instance
94 * @pll: the DPLL
95 *
96 * Returns:
97 * The id of @pll
98 */
99 enum intel_dpll_id
intel_get_shared_dpll_id(struct drm_i915_private * dev_priv,struct intel_shared_dpll * pll)100 intel_get_shared_dpll_id(struct drm_i915_private *dev_priv,
101 struct intel_shared_dpll *pll)
102 {
103 if (WARN_ON(pll < dev_priv->shared_dplls||
104 pll > &dev_priv->shared_dplls[dev_priv->num_shared_dpll]))
105 return -1;
106
107 return (enum intel_dpll_id) (pll - dev_priv->shared_dplls);
108 }
109
110 /* For ILK+ */
assert_shared_dpll(struct drm_i915_private * dev_priv,struct intel_shared_dpll * pll,bool state)111 void assert_shared_dpll(struct drm_i915_private *dev_priv,
112 struct intel_shared_dpll *pll,
113 bool state)
114 {
115 bool cur_state;
116 struct intel_dpll_hw_state hw_state;
117
118 if (WARN(!pll, "asserting DPLL %s with no DPLL\n", onoff(state)))
119 return;
120
121 cur_state = pll->info->funcs->get_hw_state(dev_priv, pll, &hw_state);
122 I915_STATE_WARN(cur_state != state,
123 "%s assertion failure (expected %s, current %s)\n",
124 pll->info->name, onoff(state), onoff(cur_state));
125 }
126
127 /**
128 * intel_prepare_shared_dpll - call a dpll's prepare hook
129 * @crtc: CRTC which has a shared dpll
130 *
131 * This calls the PLL's prepare hook if it has one and if the PLL is not
132 * already enabled. The prepare hook is platform specific.
133 */
intel_prepare_shared_dpll(struct intel_crtc * crtc)134 void intel_prepare_shared_dpll(struct intel_crtc *crtc)
135 {
136 struct drm_device *dev = crtc->base.dev;
137 struct drm_i915_private *dev_priv = to_i915(dev);
138 struct intel_shared_dpll *pll = crtc->config->shared_dpll;
139
140 if (WARN_ON(pll == NULL))
141 return;
142
143 mutex_lock(&dev_priv->dpll_lock);
144 WARN_ON(!pll->state.crtc_mask);
145 if (!pll->active_mask) {
146 DRM_DEBUG_DRIVER("setting up %s\n", pll->info->name);
147 WARN_ON(pll->on);
148 assert_shared_dpll_disabled(dev_priv, pll);
149
150 pll->info->funcs->prepare(dev_priv, pll);
151 }
152 mutex_unlock(&dev_priv->dpll_lock);
153 }
154
155 /**
156 * intel_enable_shared_dpll - enable a CRTC's shared DPLL
157 * @crtc: CRTC which has a shared DPLL
158 *
159 * Enable the shared DPLL used by @crtc.
160 */
intel_enable_shared_dpll(struct intel_crtc * crtc)161 void intel_enable_shared_dpll(struct intel_crtc *crtc)
162 {
163 struct drm_device *dev = crtc->base.dev;
164 struct drm_i915_private *dev_priv = to_i915(dev);
165 struct intel_shared_dpll *pll = crtc->config->shared_dpll;
166 unsigned int crtc_mask = drm_crtc_mask(&crtc->base);
167 unsigned int old_mask;
168
169 if (WARN_ON(pll == NULL))
170 return;
171
172 mutex_lock(&dev_priv->dpll_lock);
173 old_mask = pll->active_mask;
174
175 if (WARN_ON(!(pll->state.crtc_mask & crtc_mask)) ||
176 WARN_ON(pll->active_mask & crtc_mask))
177 goto out;
178
179 pll->active_mask |= crtc_mask;
180
181 DRM_DEBUG_KMS("enable %s (active %x, on? %d) for crtc %d\n",
182 pll->info->name, pll->active_mask, pll->on,
183 crtc->base.base.id);
184
185 if (old_mask) {
186 WARN_ON(!pll->on);
187 assert_shared_dpll_enabled(dev_priv, pll);
188 goto out;
189 }
190 WARN_ON(pll->on);
191
192 DRM_DEBUG_KMS("enabling %s\n", pll->info->name);
193 pll->info->funcs->enable(dev_priv, pll);
194 pll->on = true;
195
196 out:
197 mutex_unlock(&dev_priv->dpll_lock);
198 }
199
200 /**
201 * intel_disable_shared_dpll - disable a CRTC's shared DPLL
202 * @crtc: CRTC which has a shared DPLL
203 *
204 * Disable the shared DPLL used by @crtc.
205 */
intel_disable_shared_dpll(struct intel_crtc * crtc)206 void intel_disable_shared_dpll(struct intel_crtc *crtc)
207 {
208 struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
209 struct intel_shared_dpll *pll = crtc->config->shared_dpll;
210 unsigned int crtc_mask = drm_crtc_mask(&crtc->base);
211
212 /* PCH only available on ILK+ */
213 if (INTEL_GEN(dev_priv) < 5)
214 return;
215
216 if (pll == NULL)
217 return;
218
219 mutex_lock(&dev_priv->dpll_lock);
220 if (WARN_ON(!(pll->active_mask & crtc_mask)))
221 goto out;
222
223 DRM_DEBUG_KMS("disable %s (active %x, on? %d) for crtc %d\n",
224 pll->info->name, pll->active_mask, pll->on,
225 crtc->base.base.id);
226
227 assert_shared_dpll_enabled(dev_priv, pll);
228 WARN_ON(!pll->on);
229
230 pll->active_mask &= ~crtc_mask;
231 if (pll->active_mask)
232 goto out;
233
234 DRM_DEBUG_KMS("disabling %s\n", pll->info->name);
235 pll->info->funcs->disable(dev_priv, pll);
236 pll->on = false;
237
238 out:
239 mutex_unlock(&dev_priv->dpll_lock);
240 }
241
242 static struct intel_shared_dpll *
intel_find_shared_dpll(struct intel_crtc * crtc,struct intel_crtc_state * crtc_state,enum intel_dpll_id range_min,enum intel_dpll_id range_max)243 intel_find_shared_dpll(struct intel_crtc *crtc,
244 struct intel_crtc_state *crtc_state,
245 enum intel_dpll_id range_min,
246 enum intel_dpll_id range_max)
247 {
248 struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
249 struct intel_shared_dpll *pll;
250 struct intel_shared_dpll_state *shared_dpll;
251 enum intel_dpll_id i;
252
253 shared_dpll = intel_atomic_get_shared_dpll_state(crtc_state->base.state);
254
255 for (i = range_min; i <= range_max; i++) {
256 pll = &dev_priv->shared_dplls[i];
257
258 /* Only want to check enabled timings first */
259 if (shared_dpll[i].crtc_mask == 0)
260 continue;
261
262 if (memcmp(&crtc_state->dpll_hw_state,
263 &shared_dpll[i].hw_state,
264 sizeof(crtc_state->dpll_hw_state)) == 0) {
265 DRM_DEBUG_KMS("[CRTC:%d:%s] sharing existing %s (crtc mask 0x%08x, active %x)\n",
266 crtc->base.base.id, crtc->base.name,
267 pll->info->name,
268 shared_dpll[i].crtc_mask,
269 pll->active_mask);
270 return pll;
271 }
272 }
273
274 /* Ok no matching timings, maybe there's a free one? */
275 for (i = range_min; i <= range_max; i++) {
276 pll = &dev_priv->shared_dplls[i];
277 if (shared_dpll[i].crtc_mask == 0) {
278 DRM_DEBUG_KMS("[CRTC:%d:%s] allocated %s\n",
279 crtc->base.base.id, crtc->base.name,
280 pll->info->name);
281 return pll;
282 }
283 }
284
285 return NULL;
286 }
287
288 static void
intel_reference_shared_dpll(struct intel_shared_dpll * pll,struct intel_crtc_state * crtc_state)289 intel_reference_shared_dpll(struct intel_shared_dpll *pll,
290 struct intel_crtc_state *crtc_state)
291 {
292 struct intel_shared_dpll_state *shared_dpll;
293 struct intel_crtc *crtc = to_intel_crtc(crtc_state->base.crtc);
294 const enum intel_dpll_id id = pll->info->id;
295
296 shared_dpll = intel_atomic_get_shared_dpll_state(crtc_state->base.state);
297
298 if (shared_dpll[id].crtc_mask == 0)
299 shared_dpll[id].hw_state =
300 crtc_state->dpll_hw_state;
301
302 crtc_state->shared_dpll = pll;
303 DRM_DEBUG_DRIVER("using %s for pipe %c\n", pll->info->name,
304 pipe_name(crtc->pipe));
305
306 shared_dpll[id].crtc_mask |= 1 << crtc->pipe;
307 }
308
309 /**
310 * intel_shared_dpll_swap_state - make atomic DPLL configuration effective
311 * @state: atomic state
312 *
313 * This is the dpll version of drm_atomic_helper_swap_state() since the
314 * helper does not handle driver-specific global state.
315 *
316 * For consistency with atomic helpers this function does a complete swap,
317 * i.e. it also puts the current state into @state, even though there is no
318 * need for that at this moment.
319 */
intel_shared_dpll_swap_state(struct drm_atomic_state * state)320 void intel_shared_dpll_swap_state(struct drm_atomic_state *state)
321 {
322 struct drm_i915_private *dev_priv = to_i915(state->dev);
323 struct intel_shared_dpll_state *shared_dpll;
324 struct intel_shared_dpll *pll;
325 enum intel_dpll_id i;
326
327 if (!to_intel_atomic_state(state)->dpll_set)
328 return;
329
330 shared_dpll = to_intel_atomic_state(state)->shared_dpll;
331 for (i = 0; i < dev_priv->num_shared_dpll; i++) {
332 struct intel_shared_dpll_state tmp;
333
334 pll = &dev_priv->shared_dplls[i];
335
336 tmp = pll->state;
337 pll->state = shared_dpll[i];
338 shared_dpll[i] = tmp;
339 }
340 }
341
ibx_pch_dpll_get_hw_state(struct drm_i915_private * dev_priv,struct intel_shared_dpll * pll,struct intel_dpll_hw_state * hw_state)342 static bool ibx_pch_dpll_get_hw_state(struct drm_i915_private *dev_priv,
343 struct intel_shared_dpll *pll,
344 struct intel_dpll_hw_state *hw_state)
345 {
346 const enum intel_dpll_id id = pll->info->id;
347 uint32_t val;
348
349 if (!intel_display_power_get_if_enabled(dev_priv, POWER_DOMAIN_PLLS))
350 return false;
351
352 val = I915_READ(PCH_DPLL(id));
353 hw_state->dpll = val;
354 hw_state->fp0 = I915_READ(PCH_FP0(id));
355 hw_state->fp1 = I915_READ(PCH_FP1(id));
356
357 intel_display_power_put(dev_priv, POWER_DOMAIN_PLLS);
358
359 return val & DPLL_VCO_ENABLE;
360 }
361
ibx_pch_dpll_prepare(struct drm_i915_private * dev_priv,struct intel_shared_dpll * pll)362 static void ibx_pch_dpll_prepare(struct drm_i915_private *dev_priv,
363 struct intel_shared_dpll *pll)
364 {
365 const enum intel_dpll_id id = pll->info->id;
366
367 I915_WRITE(PCH_FP0(id), pll->state.hw_state.fp0);
368 I915_WRITE(PCH_FP1(id), pll->state.hw_state.fp1);
369 }
370
ibx_assert_pch_refclk_enabled(struct drm_i915_private * dev_priv)371 static void ibx_assert_pch_refclk_enabled(struct drm_i915_private *dev_priv)
372 {
373 u32 val;
374 bool enabled;
375
376 I915_STATE_WARN_ON(!(HAS_PCH_IBX(dev_priv) || HAS_PCH_CPT(dev_priv)));
377
378 val = I915_READ(PCH_DREF_CONTROL);
379 enabled = !!(val & (DREF_SSC_SOURCE_MASK | DREF_NONSPREAD_SOURCE_MASK |
380 DREF_SUPERSPREAD_SOURCE_MASK));
381 I915_STATE_WARN(!enabled, "PCH refclk assertion failure, should be active but is disabled\n");
382 }
383
ibx_pch_dpll_enable(struct drm_i915_private * dev_priv,struct intel_shared_dpll * pll)384 static void ibx_pch_dpll_enable(struct drm_i915_private *dev_priv,
385 struct intel_shared_dpll *pll)
386 {
387 const enum intel_dpll_id id = pll->info->id;
388
389 /* PCH refclock must be enabled first */
390 ibx_assert_pch_refclk_enabled(dev_priv);
391
392 I915_WRITE(PCH_DPLL(id), pll->state.hw_state.dpll);
393
394 /* Wait for the clocks to stabilize. */
395 POSTING_READ(PCH_DPLL(id));
396 udelay(150);
397
398 /* The pixel multiplier can only be updated once the
399 * DPLL is enabled and the clocks are stable.
400 *
401 * So write it again.
402 */
403 I915_WRITE(PCH_DPLL(id), pll->state.hw_state.dpll);
404 POSTING_READ(PCH_DPLL(id));
405 udelay(200);
406 }
407
ibx_pch_dpll_disable(struct drm_i915_private * dev_priv,struct intel_shared_dpll * pll)408 static void ibx_pch_dpll_disable(struct drm_i915_private *dev_priv,
409 struct intel_shared_dpll *pll)
410 {
411 const enum intel_dpll_id id = pll->info->id;
412 struct drm_device *dev = &dev_priv->drm;
413 struct intel_crtc *crtc;
414
415 /* Make sure no transcoder isn't still depending on us. */
416 for_each_intel_crtc(dev, crtc) {
417 if (crtc->config->shared_dpll == pll)
418 assert_pch_transcoder_disabled(dev_priv, crtc->pipe);
419 }
420
421 I915_WRITE(PCH_DPLL(id), 0);
422 POSTING_READ(PCH_DPLL(id));
423 udelay(200);
424 }
425
426 static struct intel_shared_dpll *
ibx_get_dpll(struct intel_crtc * crtc,struct intel_crtc_state * crtc_state,struct intel_encoder * encoder)427 ibx_get_dpll(struct intel_crtc *crtc, struct intel_crtc_state *crtc_state,
428 struct intel_encoder *encoder)
429 {
430 struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
431 struct intel_shared_dpll *pll;
432 enum intel_dpll_id i;
433
434 if (HAS_PCH_IBX(dev_priv)) {
435 /* Ironlake PCH has a fixed PLL->PCH pipe mapping. */
436 i = (enum intel_dpll_id) crtc->pipe;
437 pll = &dev_priv->shared_dplls[i];
438
439 DRM_DEBUG_KMS("[CRTC:%d:%s] using pre-allocated %s\n",
440 crtc->base.base.id, crtc->base.name,
441 pll->info->name);
442 } else {
443 pll = intel_find_shared_dpll(crtc, crtc_state,
444 DPLL_ID_PCH_PLL_A,
445 DPLL_ID_PCH_PLL_B);
446 }
447
448 if (!pll)
449 return NULL;
450
451 /* reference the pll */
452 intel_reference_shared_dpll(pll, crtc_state);
453
454 return pll;
455 }
456
ibx_dump_hw_state(struct drm_i915_private * dev_priv,struct intel_dpll_hw_state * hw_state)457 static void ibx_dump_hw_state(struct drm_i915_private *dev_priv,
458 struct intel_dpll_hw_state *hw_state)
459 {
460 DRM_DEBUG_KMS("dpll_hw_state: dpll: 0x%x, dpll_md: 0x%x, "
461 "fp0: 0x%x, fp1: 0x%x\n",
462 hw_state->dpll,
463 hw_state->dpll_md,
464 hw_state->fp0,
465 hw_state->fp1);
466 }
467
468 static const struct intel_shared_dpll_funcs ibx_pch_dpll_funcs = {
469 .prepare = ibx_pch_dpll_prepare,
470 .enable = ibx_pch_dpll_enable,
471 .disable = ibx_pch_dpll_disable,
472 .get_hw_state = ibx_pch_dpll_get_hw_state,
473 };
474
hsw_ddi_wrpll_enable(struct drm_i915_private * dev_priv,struct intel_shared_dpll * pll)475 static void hsw_ddi_wrpll_enable(struct drm_i915_private *dev_priv,
476 struct intel_shared_dpll *pll)
477 {
478 const enum intel_dpll_id id = pll->info->id;
479
480 I915_WRITE(WRPLL_CTL(id), pll->state.hw_state.wrpll);
481 POSTING_READ(WRPLL_CTL(id));
482 udelay(20);
483 }
484
hsw_ddi_spll_enable(struct drm_i915_private * dev_priv,struct intel_shared_dpll * pll)485 static void hsw_ddi_spll_enable(struct drm_i915_private *dev_priv,
486 struct intel_shared_dpll *pll)
487 {
488 I915_WRITE(SPLL_CTL, pll->state.hw_state.spll);
489 POSTING_READ(SPLL_CTL);
490 udelay(20);
491 }
492
hsw_ddi_wrpll_disable(struct drm_i915_private * dev_priv,struct intel_shared_dpll * pll)493 static void hsw_ddi_wrpll_disable(struct drm_i915_private *dev_priv,
494 struct intel_shared_dpll *pll)
495 {
496 const enum intel_dpll_id id = pll->info->id;
497 uint32_t val;
498
499 val = I915_READ(WRPLL_CTL(id));
500 I915_WRITE(WRPLL_CTL(id), val & ~WRPLL_PLL_ENABLE);
501 POSTING_READ(WRPLL_CTL(id));
502 }
503
hsw_ddi_spll_disable(struct drm_i915_private * dev_priv,struct intel_shared_dpll * pll)504 static void hsw_ddi_spll_disable(struct drm_i915_private *dev_priv,
505 struct intel_shared_dpll *pll)
506 {
507 uint32_t val;
508
509 val = I915_READ(SPLL_CTL);
510 I915_WRITE(SPLL_CTL, val & ~SPLL_PLL_ENABLE);
511 POSTING_READ(SPLL_CTL);
512 }
513
hsw_ddi_wrpll_get_hw_state(struct drm_i915_private * dev_priv,struct intel_shared_dpll * pll,struct intel_dpll_hw_state * hw_state)514 static bool hsw_ddi_wrpll_get_hw_state(struct drm_i915_private *dev_priv,
515 struct intel_shared_dpll *pll,
516 struct intel_dpll_hw_state *hw_state)
517 {
518 const enum intel_dpll_id id = pll->info->id;
519 uint32_t val;
520
521 if (!intel_display_power_get_if_enabled(dev_priv, POWER_DOMAIN_PLLS))
522 return false;
523
524 val = I915_READ(WRPLL_CTL(id));
525 hw_state->wrpll = val;
526
527 intel_display_power_put(dev_priv, POWER_DOMAIN_PLLS);
528
529 return val & WRPLL_PLL_ENABLE;
530 }
531
hsw_ddi_spll_get_hw_state(struct drm_i915_private * dev_priv,struct intel_shared_dpll * pll,struct intel_dpll_hw_state * hw_state)532 static bool hsw_ddi_spll_get_hw_state(struct drm_i915_private *dev_priv,
533 struct intel_shared_dpll *pll,
534 struct intel_dpll_hw_state *hw_state)
535 {
536 uint32_t val;
537
538 if (!intel_display_power_get_if_enabled(dev_priv, POWER_DOMAIN_PLLS))
539 return false;
540
541 val = I915_READ(SPLL_CTL);
542 hw_state->spll = val;
543
544 intel_display_power_put(dev_priv, POWER_DOMAIN_PLLS);
545
546 return val & SPLL_PLL_ENABLE;
547 }
548
549 #define LC_FREQ 2700
550 #define LC_FREQ_2K U64_C(LC_FREQ * 2000)
551
552 #define P_MIN 2
553 #define P_MAX 64
554 #define P_INC 2
555
556 /* Constraints for PLL good behavior */
557 #define REF_MIN 48
558 #define REF_MAX 400
559 #define VCO_MIN 2400
560 #define VCO_MAX 4800
561
562 struct hsw_wrpll_rnp {
563 unsigned p, n2, r2;
564 };
565
hsw_wrpll_get_budget_for_freq(int clock)566 static unsigned hsw_wrpll_get_budget_for_freq(int clock)
567 {
568 unsigned budget;
569
570 switch (clock) {
571 case 25175000:
572 case 25200000:
573 case 27000000:
574 case 27027000:
575 case 37762500:
576 case 37800000:
577 case 40500000:
578 case 40541000:
579 case 54000000:
580 case 54054000:
581 case 59341000:
582 case 59400000:
583 case 72000000:
584 case 74176000:
585 case 74250000:
586 case 81000000:
587 case 81081000:
588 case 89012000:
589 case 89100000:
590 case 108000000:
591 case 108108000:
592 case 111264000:
593 case 111375000:
594 case 148352000:
595 case 148500000:
596 case 162000000:
597 case 162162000:
598 case 222525000:
599 case 222750000:
600 case 296703000:
601 case 297000000:
602 budget = 0;
603 break;
604 case 233500000:
605 case 245250000:
606 case 247750000:
607 case 253250000:
608 case 298000000:
609 budget = 1500;
610 break;
611 case 169128000:
612 case 169500000:
613 case 179500000:
614 case 202000000:
615 budget = 2000;
616 break;
617 case 256250000:
618 case 262500000:
619 case 270000000:
620 case 272500000:
621 case 273750000:
622 case 280750000:
623 case 281250000:
624 case 286000000:
625 case 291750000:
626 budget = 4000;
627 break;
628 case 267250000:
629 case 268500000:
630 budget = 5000;
631 break;
632 default:
633 budget = 1000;
634 break;
635 }
636
637 return budget;
638 }
639
hsw_wrpll_update_rnp(uint64_t freq2k,unsigned budget,unsigned r2,unsigned n2,unsigned p,struct hsw_wrpll_rnp * best)640 static void hsw_wrpll_update_rnp(uint64_t freq2k, unsigned budget,
641 unsigned r2, unsigned n2, unsigned p,
642 struct hsw_wrpll_rnp *best)
643 {
644 uint64_t a, b, c, d, diff, diff_best;
645
646 /* No best (r,n,p) yet */
647 if (best->p == 0) {
648 best->p = p;
649 best->n2 = n2;
650 best->r2 = r2;
651 return;
652 }
653
654 /*
655 * Output clock is (LC_FREQ_2K / 2000) * N / (P * R), which compares to
656 * freq2k.
657 *
658 * delta = 1e6 *
659 * abs(freq2k - (LC_FREQ_2K * n2/(p * r2))) /
660 * freq2k;
661 *
662 * and we would like delta <= budget.
663 *
664 * If the discrepancy is above the PPM-based budget, always prefer to
665 * improve upon the previous solution. However, if you're within the
666 * budget, try to maximize Ref * VCO, that is N / (P * R^2).
667 */
668 a = freq2k * budget * p * r2;
669 b = freq2k * budget * best->p * best->r2;
670 diff = abs_diff(freq2k * p * r2, LC_FREQ_2K * n2);
671 diff_best = abs_diff(freq2k * best->p * best->r2,
672 LC_FREQ_2K * best->n2);
673 c = 1000000 * diff;
674 d = 1000000 * diff_best;
675
676 if (a < c && b < d) {
677 /* If both are above the budget, pick the closer */
678 if (best->p * best->r2 * diff < p * r2 * diff_best) {
679 best->p = p;
680 best->n2 = n2;
681 best->r2 = r2;
682 }
683 } else if (a >= c && b < d) {
684 /* If A is below the threshold but B is above it? Update. */
685 best->p = p;
686 best->n2 = n2;
687 best->r2 = r2;
688 } else if (a >= c && b >= d) {
689 /* Both are below the limit, so pick the higher n2/(r2*r2) */
690 if (n2 * best->r2 * best->r2 > best->n2 * r2 * r2) {
691 best->p = p;
692 best->n2 = n2;
693 best->r2 = r2;
694 }
695 }
696 /* Otherwise a < c && b >= d, do nothing */
697 }
698
699 static void
hsw_ddi_calculate_wrpll(int clock,unsigned * r2_out,unsigned * n2_out,unsigned * p_out)700 hsw_ddi_calculate_wrpll(int clock /* in Hz */,
701 unsigned *r2_out, unsigned *n2_out, unsigned *p_out)
702 {
703 uint64_t freq2k;
704 unsigned p, n2, r2;
705 struct hsw_wrpll_rnp best = { 0, 0, 0 };
706 unsigned budget;
707
708 freq2k = clock / 100;
709
710 budget = hsw_wrpll_get_budget_for_freq(clock);
711
712 /* Special case handling for 540 pixel clock: bypass WR PLL entirely
713 * and directly pass the LC PLL to it. */
714 if (freq2k == 5400000) {
715 *n2_out = 2;
716 *p_out = 1;
717 *r2_out = 2;
718 return;
719 }
720
721 /*
722 * Ref = LC_FREQ / R, where Ref is the actual reference input seen by
723 * the WR PLL.
724 *
725 * We want R so that REF_MIN <= Ref <= REF_MAX.
726 * Injecting R2 = 2 * R gives:
727 * REF_MAX * r2 > LC_FREQ * 2 and
728 * REF_MIN * r2 < LC_FREQ * 2
729 *
730 * Which means the desired boundaries for r2 are:
731 * LC_FREQ * 2 / REF_MAX < r2 < LC_FREQ * 2 / REF_MIN
732 *
733 */
734 for (r2 = LC_FREQ * 2 / REF_MAX + 1;
735 r2 <= LC_FREQ * 2 / REF_MIN;
736 r2++) {
737
738 /*
739 * VCO = N * Ref, that is: VCO = N * LC_FREQ / R
740 *
741 * Once again we want VCO_MIN <= VCO <= VCO_MAX.
742 * Injecting R2 = 2 * R and N2 = 2 * N, we get:
743 * VCO_MAX * r2 > n2 * LC_FREQ and
744 * VCO_MIN * r2 < n2 * LC_FREQ)
745 *
746 * Which means the desired boundaries for n2 are:
747 * VCO_MIN * r2 / LC_FREQ < n2 < VCO_MAX * r2 / LC_FREQ
748 */
749 for (n2 = VCO_MIN * r2 / LC_FREQ + 1;
750 n2 <= VCO_MAX * r2 / LC_FREQ;
751 n2++) {
752
753 for (p = P_MIN; p <= P_MAX; p += P_INC)
754 hsw_wrpll_update_rnp(freq2k, budget,
755 r2, n2, p, &best);
756 }
757 }
758
759 *n2_out = best.n2;
760 *p_out = best.p;
761 *r2_out = best.r2;
762 }
763
hsw_ddi_hdmi_get_dpll(int clock,struct intel_crtc * crtc,struct intel_crtc_state * crtc_state)764 static struct intel_shared_dpll *hsw_ddi_hdmi_get_dpll(int clock,
765 struct intel_crtc *crtc,
766 struct intel_crtc_state *crtc_state)
767 {
768 struct intel_shared_dpll *pll;
769 uint32_t val;
770 unsigned int p, n2, r2;
771
772 hsw_ddi_calculate_wrpll(clock * 1000, &r2, &n2, &p);
773
774 val = WRPLL_PLL_ENABLE | WRPLL_PLL_LCPLL |
775 WRPLL_DIVIDER_REFERENCE(r2) | WRPLL_DIVIDER_FEEDBACK(n2) |
776 WRPLL_DIVIDER_POST(p);
777
778 crtc_state->dpll_hw_state.wrpll = val;
779
780 pll = intel_find_shared_dpll(crtc, crtc_state,
781 DPLL_ID_WRPLL1, DPLL_ID_WRPLL2);
782
783 if (!pll)
784 return NULL;
785
786 return pll;
787 }
788
789 static struct intel_shared_dpll *
hsw_ddi_dp_get_dpll(struct intel_encoder * encoder,int clock)790 hsw_ddi_dp_get_dpll(struct intel_encoder *encoder, int clock)
791 {
792 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
793 struct intel_shared_dpll *pll;
794 enum intel_dpll_id pll_id;
795
796 switch (clock / 2) {
797 case 81000:
798 pll_id = DPLL_ID_LCPLL_810;
799 break;
800 case 135000:
801 pll_id = DPLL_ID_LCPLL_1350;
802 break;
803 case 270000:
804 pll_id = DPLL_ID_LCPLL_2700;
805 break;
806 default:
807 DRM_DEBUG_KMS("Invalid clock for DP: %d\n", clock);
808 return NULL;
809 }
810
811 pll = intel_get_shared_dpll_by_id(dev_priv, pll_id);
812
813 if (!pll)
814 return NULL;
815
816 return pll;
817 }
818
819 static struct intel_shared_dpll *
hsw_get_dpll(struct intel_crtc * crtc,struct intel_crtc_state * crtc_state,struct intel_encoder * encoder)820 hsw_get_dpll(struct intel_crtc *crtc, struct intel_crtc_state *crtc_state,
821 struct intel_encoder *encoder)
822 {
823 struct intel_shared_dpll *pll;
824 int clock = crtc_state->port_clock;
825
826 memset(&crtc_state->dpll_hw_state, 0,
827 sizeof(crtc_state->dpll_hw_state));
828
829 if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_HDMI)) {
830 pll = hsw_ddi_hdmi_get_dpll(clock, crtc, crtc_state);
831 } else if (intel_crtc_has_dp_encoder(crtc_state)) {
832 pll = hsw_ddi_dp_get_dpll(encoder, clock);
833 } else if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_ANALOG)) {
834 if (WARN_ON(crtc_state->port_clock / 2 != 135000))
835 return NULL;
836
837 crtc_state->dpll_hw_state.spll =
838 SPLL_PLL_ENABLE | SPLL_PLL_FREQ_1350MHz | SPLL_PLL_SSC;
839
840 pll = intel_find_shared_dpll(crtc, crtc_state,
841 DPLL_ID_SPLL, DPLL_ID_SPLL);
842 } else {
843 return NULL;
844 }
845
846 if (!pll)
847 return NULL;
848
849 intel_reference_shared_dpll(pll, crtc_state);
850
851 return pll;
852 }
853
hsw_dump_hw_state(struct drm_i915_private * dev_priv,struct intel_dpll_hw_state * hw_state)854 static void hsw_dump_hw_state(struct drm_i915_private *dev_priv,
855 struct intel_dpll_hw_state *hw_state)
856 {
857 DRM_DEBUG_KMS("dpll_hw_state: wrpll: 0x%x spll: 0x%x\n",
858 hw_state->wrpll, hw_state->spll);
859 }
860
861 static const struct intel_shared_dpll_funcs hsw_ddi_wrpll_funcs = {
862 .enable = hsw_ddi_wrpll_enable,
863 .disable = hsw_ddi_wrpll_disable,
864 .get_hw_state = hsw_ddi_wrpll_get_hw_state,
865 };
866
867 static const struct intel_shared_dpll_funcs hsw_ddi_spll_funcs = {
868 .enable = hsw_ddi_spll_enable,
869 .disable = hsw_ddi_spll_disable,
870 .get_hw_state = hsw_ddi_spll_get_hw_state,
871 };
872
hsw_ddi_lcpll_enable(struct drm_i915_private * dev_priv,struct intel_shared_dpll * pll)873 static void hsw_ddi_lcpll_enable(struct drm_i915_private *dev_priv,
874 struct intel_shared_dpll *pll)
875 {
876 }
877
hsw_ddi_lcpll_disable(struct drm_i915_private * dev_priv,struct intel_shared_dpll * pll)878 static void hsw_ddi_lcpll_disable(struct drm_i915_private *dev_priv,
879 struct intel_shared_dpll *pll)
880 {
881 }
882
hsw_ddi_lcpll_get_hw_state(struct drm_i915_private * dev_priv,struct intel_shared_dpll * pll,struct intel_dpll_hw_state * hw_state)883 static bool hsw_ddi_lcpll_get_hw_state(struct drm_i915_private *dev_priv,
884 struct intel_shared_dpll *pll,
885 struct intel_dpll_hw_state *hw_state)
886 {
887 return true;
888 }
889
890 static const struct intel_shared_dpll_funcs hsw_ddi_lcpll_funcs = {
891 .enable = hsw_ddi_lcpll_enable,
892 .disable = hsw_ddi_lcpll_disable,
893 .get_hw_state = hsw_ddi_lcpll_get_hw_state,
894 };
895
896 struct skl_dpll_regs {
897 i915_reg_t ctl, cfgcr1, cfgcr2;
898 };
899
900 /* this array is indexed by the *shared* pll id */
901 static const struct skl_dpll_regs skl_dpll_regs[4] = {
902 {
903 /* DPLL 0 */
904 .ctl = LCPLL1_CTL,
905 /* DPLL 0 doesn't support HDMI mode */
906 },
907 {
908 /* DPLL 1 */
909 .ctl = LCPLL2_CTL,
910 .cfgcr1 = DPLL_CFGCR1(SKL_DPLL1),
911 .cfgcr2 = DPLL_CFGCR2(SKL_DPLL1),
912 },
913 {
914 /* DPLL 2 */
915 .ctl = WRPLL_CTL(0),
916 .cfgcr1 = DPLL_CFGCR1(SKL_DPLL2),
917 .cfgcr2 = DPLL_CFGCR2(SKL_DPLL2),
918 },
919 {
920 /* DPLL 3 */
921 .ctl = WRPLL_CTL(1),
922 .cfgcr1 = DPLL_CFGCR1(SKL_DPLL3),
923 .cfgcr2 = DPLL_CFGCR2(SKL_DPLL3),
924 },
925 };
926
skl_ddi_pll_write_ctrl1(struct drm_i915_private * dev_priv,struct intel_shared_dpll * pll)927 static void skl_ddi_pll_write_ctrl1(struct drm_i915_private *dev_priv,
928 struct intel_shared_dpll *pll)
929 {
930 const enum intel_dpll_id id = pll->info->id;
931 uint32_t val;
932
933 val = I915_READ(DPLL_CTRL1);
934
935 val &= ~(DPLL_CTRL1_HDMI_MODE(id) |
936 DPLL_CTRL1_SSC(id) |
937 DPLL_CTRL1_LINK_RATE_MASK(id));
938 val |= pll->state.hw_state.ctrl1 << (id * 6);
939
940 I915_WRITE(DPLL_CTRL1, val);
941 POSTING_READ(DPLL_CTRL1);
942 }
943
skl_ddi_pll_enable(struct drm_i915_private * dev_priv,struct intel_shared_dpll * pll)944 static void skl_ddi_pll_enable(struct drm_i915_private *dev_priv,
945 struct intel_shared_dpll *pll)
946 {
947 const struct skl_dpll_regs *regs = skl_dpll_regs;
948 const enum intel_dpll_id id = pll->info->id;
949
950 skl_ddi_pll_write_ctrl1(dev_priv, pll);
951
952 I915_WRITE(regs[id].cfgcr1, pll->state.hw_state.cfgcr1);
953 I915_WRITE(regs[id].cfgcr2, pll->state.hw_state.cfgcr2);
954 POSTING_READ(regs[id].cfgcr1);
955 POSTING_READ(regs[id].cfgcr2);
956
957 /* the enable bit is always bit 31 */
958 I915_WRITE(regs[id].ctl,
959 I915_READ(regs[id].ctl) | LCPLL_PLL_ENABLE);
960
961 if (intel_wait_for_register(dev_priv,
962 DPLL_STATUS,
963 DPLL_LOCK(id),
964 DPLL_LOCK(id),
965 5))
966 DRM_ERROR("DPLL %d not locked\n", id);
967 }
968
skl_ddi_dpll0_enable(struct drm_i915_private * dev_priv,struct intel_shared_dpll * pll)969 static void skl_ddi_dpll0_enable(struct drm_i915_private *dev_priv,
970 struct intel_shared_dpll *pll)
971 {
972 skl_ddi_pll_write_ctrl1(dev_priv, pll);
973 }
974
skl_ddi_pll_disable(struct drm_i915_private * dev_priv,struct intel_shared_dpll * pll)975 static void skl_ddi_pll_disable(struct drm_i915_private *dev_priv,
976 struct intel_shared_dpll *pll)
977 {
978 const struct skl_dpll_regs *regs = skl_dpll_regs;
979 const enum intel_dpll_id id = pll->info->id;
980
981 /* the enable bit is always bit 31 */
982 I915_WRITE(regs[id].ctl,
983 I915_READ(regs[id].ctl) & ~LCPLL_PLL_ENABLE);
984 POSTING_READ(regs[id].ctl);
985 }
986
skl_ddi_dpll0_disable(struct drm_i915_private * dev_priv,struct intel_shared_dpll * pll)987 static void skl_ddi_dpll0_disable(struct drm_i915_private *dev_priv,
988 struct intel_shared_dpll *pll)
989 {
990 }
991
skl_ddi_pll_get_hw_state(struct drm_i915_private * dev_priv,struct intel_shared_dpll * pll,struct intel_dpll_hw_state * hw_state)992 static bool skl_ddi_pll_get_hw_state(struct drm_i915_private *dev_priv,
993 struct intel_shared_dpll *pll,
994 struct intel_dpll_hw_state *hw_state)
995 {
996 uint32_t val;
997 const struct skl_dpll_regs *regs = skl_dpll_regs;
998 const enum intel_dpll_id id = pll->info->id;
999 bool ret;
1000
1001 if (!intel_display_power_get_if_enabled(dev_priv, POWER_DOMAIN_PLLS))
1002 return false;
1003
1004 ret = false;
1005
1006 val = I915_READ(regs[id].ctl);
1007 if (!(val & LCPLL_PLL_ENABLE))
1008 goto out;
1009
1010 val = I915_READ(DPLL_CTRL1);
1011 hw_state->ctrl1 = (val >> (id * 6)) & 0x3f;
1012
1013 /* avoid reading back stale values if HDMI mode is not enabled */
1014 if (val & DPLL_CTRL1_HDMI_MODE(id)) {
1015 hw_state->cfgcr1 = I915_READ(regs[id].cfgcr1);
1016 hw_state->cfgcr2 = I915_READ(regs[id].cfgcr2);
1017 }
1018 ret = true;
1019
1020 out:
1021 intel_display_power_put(dev_priv, POWER_DOMAIN_PLLS);
1022
1023 return ret;
1024 }
1025
skl_ddi_dpll0_get_hw_state(struct drm_i915_private * dev_priv,struct intel_shared_dpll * pll,struct intel_dpll_hw_state * hw_state)1026 static bool skl_ddi_dpll0_get_hw_state(struct drm_i915_private *dev_priv,
1027 struct intel_shared_dpll *pll,
1028 struct intel_dpll_hw_state *hw_state)
1029 {
1030 uint32_t val;
1031 const struct skl_dpll_regs *regs = skl_dpll_regs;
1032 const enum intel_dpll_id id = pll->info->id;
1033 bool ret;
1034
1035 if (!intel_display_power_get_if_enabled(dev_priv, POWER_DOMAIN_PLLS))
1036 return false;
1037
1038 ret = false;
1039
1040 /* DPLL0 is always enabled since it drives CDCLK */
1041 val = I915_READ(regs[id].ctl);
1042 if (WARN_ON(!(val & LCPLL_PLL_ENABLE)))
1043 goto out;
1044
1045 val = I915_READ(DPLL_CTRL1);
1046 hw_state->ctrl1 = (val >> (id * 6)) & 0x3f;
1047
1048 ret = true;
1049
1050 out:
1051 intel_display_power_put(dev_priv, POWER_DOMAIN_PLLS);
1052
1053 return ret;
1054 }
1055
1056 struct skl_wrpll_context {
1057 uint64_t min_deviation; /* current minimal deviation */
1058 uint64_t central_freq; /* chosen central freq */
1059 uint64_t dco_freq; /* chosen dco freq */
1060 unsigned int p; /* chosen divider */
1061 };
1062
skl_wrpll_context_init(struct skl_wrpll_context * ctx)1063 static void skl_wrpll_context_init(struct skl_wrpll_context *ctx)
1064 {
1065 memset(ctx, 0, sizeof(*ctx));
1066
1067 ctx->min_deviation = U64_MAX;
1068 }
1069
1070 /* DCO freq must be within +1%/-6% of the DCO central freq */
1071 #define SKL_DCO_MAX_PDEVIATION 100
1072 #define SKL_DCO_MAX_NDEVIATION 600
1073
skl_wrpll_try_divider(struct skl_wrpll_context * ctx,uint64_t central_freq,uint64_t dco_freq,unsigned int divider)1074 static void skl_wrpll_try_divider(struct skl_wrpll_context *ctx,
1075 uint64_t central_freq,
1076 uint64_t dco_freq,
1077 unsigned int divider)
1078 {
1079 uint64_t deviation;
1080
1081 deviation = div64_u64(10000 * abs_diff(dco_freq, central_freq),
1082 central_freq);
1083
1084 /* positive deviation */
1085 if (dco_freq >= central_freq) {
1086 if (deviation < SKL_DCO_MAX_PDEVIATION &&
1087 deviation < ctx->min_deviation) {
1088 ctx->min_deviation = deviation;
1089 ctx->central_freq = central_freq;
1090 ctx->dco_freq = dco_freq;
1091 ctx->p = divider;
1092 }
1093 /* negative deviation */
1094 } else if (deviation < SKL_DCO_MAX_NDEVIATION &&
1095 deviation < ctx->min_deviation) {
1096 ctx->min_deviation = deviation;
1097 ctx->central_freq = central_freq;
1098 ctx->dco_freq = dco_freq;
1099 ctx->p = divider;
1100 }
1101 }
1102
skl_wrpll_get_multipliers(unsigned int p,unsigned int * p0,unsigned int * p1,unsigned int * p2)1103 static void skl_wrpll_get_multipliers(unsigned int p,
1104 unsigned int *p0 /* out */,
1105 unsigned int *p1 /* out */,
1106 unsigned int *p2 /* out */)
1107 {
1108 /* even dividers */
1109 if (p % 2 == 0) {
1110 unsigned int half = p / 2;
1111
1112 if (half == 1 || half == 2 || half == 3 || half == 5) {
1113 *p0 = 2;
1114 *p1 = 1;
1115 *p2 = half;
1116 } else if (half % 2 == 0) {
1117 *p0 = 2;
1118 *p1 = half / 2;
1119 *p2 = 2;
1120 } else if (half % 3 == 0) {
1121 *p0 = 3;
1122 *p1 = half / 3;
1123 *p2 = 2;
1124 } else if (half % 7 == 0) {
1125 *p0 = 7;
1126 *p1 = half / 7;
1127 *p2 = 2;
1128 }
1129 } else if (p == 3 || p == 9) { /* 3, 5, 7, 9, 15, 21, 35 */
1130 *p0 = 3;
1131 *p1 = 1;
1132 *p2 = p / 3;
1133 } else if (p == 5 || p == 7) {
1134 *p0 = p;
1135 *p1 = 1;
1136 *p2 = 1;
1137 } else if (p == 15) {
1138 *p0 = 3;
1139 *p1 = 1;
1140 *p2 = 5;
1141 } else if (p == 21) {
1142 *p0 = 7;
1143 *p1 = 1;
1144 *p2 = 3;
1145 } else if (p == 35) {
1146 *p0 = 7;
1147 *p1 = 1;
1148 *p2 = 5;
1149 }
1150 }
1151
1152 struct skl_wrpll_params {
1153 uint32_t dco_fraction;
1154 uint32_t dco_integer;
1155 uint32_t qdiv_ratio;
1156 uint32_t qdiv_mode;
1157 uint32_t kdiv;
1158 uint32_t pdiv;
1159 uint32_t central_freq;
1160 };
1161
skl_wrpll_params_populate(struct skl_wrpll_params * params,uint64_t afe_clock,uint64_t central_freq,uint32_t p0,uint32_t p1,uint32_t p2)1162 static void skl_wrpll_params_populate(struct skl_wrpll_params *params,
1163 uint64_t afe_clock,
1164 uint64_t central_freq,
1165 uint32_t p0, uint32_t p1, uint32_t p2)
1166 {
1167 uint64_t dco_freq;
1168
1169 switch (central_freq) {
1170 case 9600000000ULL:
1171 params->central_freq = 0;
1172 break;
1173 case 9000000000ULL:
1174 params->central_freq = 1;
1175 break;
1176 case 8400000000ULL:
1177 params->central_freq = 3;
1178 }
1179
1180 switch (p0) {
1181 case 1:
1182 params->pdiv = 0;
1183 break;
1184 case 2:
1185 params->pdiv = 1;
1186 break;
1187 case 3:
1188 params->pdiv = 2;
1189 break;
1190 case 7:
1191 params->pdiv = 4;
1192 break;
1193 default:
1194 WARN(1, "Incorrect PDiv\n");
1195 }
1196
1197 switch (p2) {
1198 case 5:
1199 params->kdiv = 0;
1200 break;
1201 case 2:
1202 params->kdiv = 1;
1203 break;
1204 case 3:
1205 params->kdiv = 2;
1206 break;
1207 case 1:
1208 params->kdiv = 3;
1209 break;
1210 default:
1211 WARN(1, "Incorrect KDiv\n");
1212 }
1213
1214 params->qdiv_ratio = p1;
1215 params->qdiv_mode = (params->qdiv_ratio == 1) ? 0 : 1;
1216
1217 dco_freq = p0 * p1 * p2 * afe_clock;
1218
1219 /*
1220 * Intermediate values are in Hz.
1221 * Divide by MHz to match bsepc
1222 */
1223 params->dco_integer = div_u64(dco_freq, 24 * MHz(1));
1224 params->dco_fraction =
1225 div_u64((div_u64(dco_freq, 24) -
1226 params->dco_integer * MHz(1)) * 0x8000, MHz(1));
1227 }
1228
1229 static bool
skl_ddi_calculate_wrpll(int clock,struct skl_wrpll_params * wrpll_params)1230 skl_ddi_calculate_wrpll(int clock /* in Hz */,
1231 struct skl_wrpll_params *wrpll_params)
1232 {
1233 uint64_t afe_clock = clock * 5; /* AFE Clock is 5x Pixel clock */
1234 uint64_t dco_central_freq[3] = {8400000000ULL,
1235 9000000000ULL,
1236 9600000000ULL};
1237 static const int even_dividers[] = { 4, 6, 8, 10, 12, 14, 16, 18, 20,
1238 24, 28, 30, 32, 36, 40, 42, 44,
1239 48, 52, 54, 56, 60, 64, 66, 68,
1240 70, 72, 76, 78, 80, 84, 88, 90,
1241 92, 96, 98 };
1242 static const int odd_dividers[] = { 3, 5, 7, 9, 15, 21, 35 };
1243 static const struct {
1244 const int *list;
1245 int n_dividers;
1246 } dividers[] = {
1247 { even_dividers, ARRAY_SIZE(even_dividers) },
1248 { odd_dividers, ARRAY_SIZE(odd_dividers) },
1249 };
1250 struct skl_wrpll_context ctx;
1251 unsigned int dco, d, i;
1252 unsigned int p0, p1, p2;
1253
1254 skl_wrpll_context_init(&ctx);
1255
1256 for (d = 0; d < ARRAY_SIZE(dividers); d++) {
1257 for (dco = 0; dco < ARRAY_SIZE(dco_central_freq); dco++) {
1258 for (i = 0; i < dividers[d].n_dividers; i++) {
1259 unsigned int p = dividers[d].list[i];
1260 uint64_t dco_freq = p * afe_clock;
1261
1262 skl_wrpll_try_divider(&ctx,
1263 dco_central_freq[dco],
1264 dco_freq,
1265 p);
1266 /*
1267 * Skip the remaining dividers if we're sure to
1268 * have found the definitive divider, we can't
1269 * improve a 0 deviation.
1270 */
1271 if (ctx.min_deviation == 0)
1272 goto skip_remaining_dividers;
1273 }
1274 }
1275
1276 skip_remaining_dividers:
1277 /*
1278 * If a solution is found with an even divider, prefer
1279 * this one.
1280 */
1281 if (d == 0 && ctx.p)
1282 break;
1283 }
1284
1285 if (!ctx.p) {
1286 DRM_DEBUG_DRIVER("No valid divider found for %dHz\n", clock);
1287 return false;
1288 }
1289
1290 /*
1291 * gcc incorrectly analyses that these can be used without being
1292 * initialized. To be fair, it's hard to guess.
1293 */
1294 p0 = p1 = p2 = 0;
1295 skl_wrpll_get_multipliers(ctx.p, &p0, &p1, &p2);
1296 skl_wrpll_params_populate(wrpll_params, afe_clock, ctx.central_freq,
1297 p0, p1, p2);
1298
1299 return true;
1300 }
1301
skl_ddi_hdmi_pll_dividers(struct intel_crtc * crtc,struct intel_crtc_state * crtc_state,int clock)1302 static bool skl_ddi_hdmi_pll_dividers(struct intel_crtc *crtc,
1303 struct intel_crtc_state *crtc_state,
1304 int clock)
1305 {
1306 uint32_t ctrl1, cfgcr1, cfgcr2;
1307 struct skl_wrpll_params wrpll_params = { 0, };
1308
1309 /*
1310 * See comment in intel_dpll_hw_state to understand why we always use 0
1311 * as the DPLL id in this function.
1312 */
1313 ctrl1 = DPLL_CTRL1_OVERRIDE(0);
1314
1315 ctrl1 |= DPLL_CTRL1_HDMI_MODE(0);
1316
1317 if (!skl_ddi_calculate_wrpll(clock * 1000, &wrpll_params))
1318 return false;
1319
1320 cfgcr1 = DPLL_CFGCR1_FREQ_ENABLE |
1321 DPLL_CFGCR1_DCO_FRACTION(wrpll_params.dco_fraction) |
1322 wrpll_params.dco_integer;
1323
1324 cfgcr2 = DPLL_CFGCR2_QDIV_RATIO(wrpll_params.qdiv_ratio) |
1325 DPLL_CFGCR2_QDIV_MODE(wrpll_params.qdiv_mode) |
1326 DPLL_CFGCR2_KDIV(wrpll_params.kdiv) |
1327 DPLL_CFGCR2_PDIV(wrpll_params.pdiv) |
1328 wrpll_params.central_freq;
1329
1330 memset(&crtc_state->dpll_hw_state, 0,
1331 sizeof(crtc_state->dpll_hw_state));
1332
1333 crtc_state->dpll_hw_state.ctrl1 = ctrl1;
1334 crtc_state->dpll_hw_state.cfgcr1 = cfgcr1;
1335 crtc_state->dpll_hw_state.cfgcr2 = cfgcr2;
1336 return true;
1337 }
1338
1339 static bool
skl_ddi_dp_set_dpll_hw_state(int clock,struct intel_dpll_hw_state * dpll_hw_state)1340 skl_ddi_dp_set_dpll_hw_state(int clock,
1341 struct intel_dpll_hw_state *dpll_hw_state)
1342 {
1343 uint32_t ctrl1;
1344
1345 /*
1346 * See comment in intel_dpll_hw_state to understand why we always use 0
1347 * as the DPLL id in this function.
1348 */
1349 ctrl1 = DPLL_CTRL1_OVERRIDE(0);
1350 switch (clock / 2) {
1351 case 81000:
1352 ctrl1 |= DPLL_CTRL1_LINK_RATE(DPLL_CTRL1_LINK_RATE_810, 0);
1353 break;
1354 case 135000:
1355 ctrl1 |= DPLL_CTRL1_LINK_RATE(DPLL_CTRL1_LINK_RATE_1350, 0);
1356 break;
1357 case 270000:
1358 ctrl1 |= DPLL_CTRL1_LINK_RATE(DPLL_CTRL1_LINK_RATE_2700, 0);
1359 break;
1360 /* eDP 1.4 rates */
1361 case 162000:
1362 ctrl1 |= DPLL_CTRL1_LINK_RATE(DPLL_CTRL1_LINK_RATE_1620, 0);
1363 break;
1364 case 108000:
1365 ctrl1 |= DPLL_CTRL1_LINK_RATE(DPLL_CTRL1_LINK_RATE_1080, 0);
1366 break;
1367 case 216000:
1368 ctrl1 |= DPLL_CTRL1_LINK_RATE(DPLL_CTRL1_LINK_RATE_2160, 0);
1369 break;
1370 }
1371
1372 dpll_hw_state->ctrl1 = ctrl1;
1373 return true;
1374 }
1375
1376 static struct intel_shared_dpll *
skl_get_dpll(struct intel_crtc * crtc,struct intel_crtc_state * crtc_state,struct intel_encoder * encoder)1377 skl_get_dpll(struct intel_crtc *crtc, struct intel_crtc_state *crtc_state,
1378 struct intel_encoder *encoder)
1379 {
1380 struct intel_shared_dpll *pll;
1381 int clock = crtc_state->port_clock;
1382 bool bret;
1383 struct intel_dpll_hw_state dpll_hw_state;
1384
1385 memset(&dpll_hw_state, 0, sizeof(dpll_hw_state));
1386
1387 if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_HDMI)) {
1388 bret = skl_ddi_hdmi_pll_dividers(crtc, crtc_state, clock);
1389 if (!bret) {
1390 DRM_DEBUG_KMS("Could not get HDMI pll dividers.\n");
1391 return NULL;
1392 }
1393 } else if (intel_crtc_has_dp_encoder(crtc_state)) {
1394 bret = skl_ddi_dp_set_dpll_hw_state(clock, &dpll_hw_state);
1395 if (!bret) {
1396 DRM_DEBUG_KMS("Could not set DP dpll HW state.\n");
1397 return NULL;
1398 }
1399 crtc_state->dpll_hw_state = dpll_hw_state;
1400 } else {
1401 return NULL;
1402 }
1403
1404 if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_EDP))
1405 pll = intel_find_shared_dpll(crtc, crtc_state,
1406 DPLL_ID_SKL_DPLL0,
1407 DPLL_ID_SKL_DPLL0);
1408 else
1409 pll = intel_find_shared_dpll(crtc, crtc_state,
1410 DPLL_ID_SKL_DPLL1,
1411 DPLL_ID_SKL_DPLL3);
1412 if (!pll)
1413 return NULL;
1414
1415 intel_reference_shared_dpll(pll, crtc_state);
1416
1417 return pll;
1418 }
1419
skl_dump_hw_state(struct drm_i915_private * dev_priv,struct intel_dpll_hw_state * hw_state)1420 static void skl_dump_hw_state(struct drm_i915_private *dev_priv,
1421 struct intel_dpll_hw_state *hw_state)
1422 {
1423 DRM_DEBUG_KMS("dpll_hw_state: "
1424 "ctrl1: 0x%x, cfgcr1: 0x%x, cfgcr2: 0x%x\n",
1425 hw_state->ctrl1,
1426 hw_state->cfgcr1,
1427 hw_state->cfgcr2);
1428 }
1429
1430 static const struct intel_shared_dpll_funcs skl_ddi_pll_funcs = {
1431 .enable = skl_ddi_pll_enable,
1432 .disable = skl_ddi_pll_disable,
1433 .get_hw_state = skl_ddi_pll_get_hw_state,
1434 };
1435
1436 static const struct intel_shared_dpll_funcs skl_ddi_dpll0_funcs = {
1437 .enable = skl_ddi_dpll0_enable,
1438 .disable = skl_ddi_dpll0_disable,
1439 .get_hw_state = skl_ddi_dpll0_get_hw_state,
1440 };
1441
bxt_ddi_pll_enable(struct drm_i915_private * dev_priv,struct intel_shared_dpll * pll)1442 static void bxt_ddi_pll_enable(struct drm_i915_private *dev_priv,
1443 struct intel_shared_dpll *pll)
1444 {
1445 uint32_t temp;
1446 enum port port = (enum port)pll->info->id; /* 1:1 port->PLL mapping */
1447 enum dpio_phy phy;
1448 enum dpio_channel ch;
1449
1450 bxt_port_to_phy_channel(dev_priv, port, &phy, &ch);
1451
1452 /* Non-SSC reference */
1453 temp = I915_READ(BXT_PORT_PLL_ENABLE(port));
1454 temp |= PORT_PLL_REF_SEL;
1455 I915_WRITE(BXT_PORT_PLL_ENABLE(port), temp);
1456
1457 if (IS_GEMINILAKE(dev_priv)) {
1458 temp = I915_READ(BXT_PORT_PLL_ENABLE(port));
1459 temp |= PORT_PLL_POWER_ENABLE;
1460 I915_WRITE(BXT_PORT_PLL_ENABLE(port), temp);
1461
1462 if (wait_for_us((I915_READ(BXT_PORT_PLL_ENABLE(port)) &
1463 PORT_PLL_POWER_STATE), 200))
1464 DRM_ERROR("Power state not set for PLL:%d\n", port);
1465 }
1466
1467 /* Disable 10 bit clock */
1468 temp = I915_READ(BXT_PORT_PLL_EBB_4(phy, ch));
1469 temp &= ~PORT_PLL_10BIT_CLK_ENABLE;
1470 I915_WRITE(BXT_PORT_PLL_EBB_4(phy, ch), temp);
1471
1472 /* Write P1 & P2 */
1473 temp = I915_READ(BXT_PORT_PLL_EBB_0(phy, ch));
1474 temp &= ~(PORT_PLL_P1_MASK | PORT_PLL_P2_MASK);
1475 temp |= pll->state.hw_state.ebb0;
1476 I915_WRITE(BXT_PORT_PLL_EBB_0(phy, ch), temp);
1477
1478 /* Write M2 integer */
1479 temp = I915_READ(BXT_PORT_PLL(phy, ch, 0));
1480 temp &= ~PORT_PLL_M2_MASK;
1481 temp |= pll->state.hw_state.pll0;
1482 I915_WRITE(BXT_PORT_PLL(phy, ch, 0), temp);
1483
1484 /* Write N */
1485 temp = I915_READ(BXT_PORT_PLL(phy, ch, 1));
1486 temp &= ~PORT_PLL_N_MASK;
1487 temp |= pll->state.hw_state.pll1;
1488 I915_WRITE(BXT_PORT_PLL(phy, ch, 1), temp);
1489
1490 /* Write M2 fraction */
1491 temp = I915_READ(BXT_PORT_PLL(phy, ch, 2));
1492 temp &= ~PORT_PLL_M2_FRAC_MASK;
1493 temp |= pll->state.hw_state.pll2;
1494 I915_WRITE(BXT_PORT_PLL(phy, ch, 2), temp);
1495
1496 /* Write M2 fraction enable */
1497 temp = I915_READ(BXT_PORT_PLL(phy, ch, 3));
1498 temp &= ~PORT_PLL_M2_FRAC_ENABLE;
1499 temp |= pll->state.hw_state.pll3;
1500 I915_WRITE(BXT_PORT_PLL(phy, ch, 3), temp);
1501
1502 /* Write coeff */
1503 temp = I915_READ(BXT_PORT_PLL(phy, ch, 6));
1504 temp &= ~PORT_PLL_PROP_COEFF_MASK;
1505 temp &= ~PORT_PLL_INT_COEFF_MASK;
1506 temp &= ~PORT_PLL_GAIN_CTL_MASK;
1507 temp |= pll->state.hw_state.pll6;
1508 I915_WRITE(BXT_PORT_PLL(phy, ch, 6), temp);
1509
1510 /* Write calibration val */
1511 temp = I915_READ(BXT_PORT_PLL(phy, ch, 8));
1512 temp &= ~PORT_PLL_TARGET_CNT_MASK;
1513 temp |= pll->state.hw_state.pll8;
1514 I915_WRITE(BXT_PORT_PLL(phy, ch, 8), temp);
1515
1516 temp = I915_READ(BXT_PORT_PLL(phy, ch, 9));
1517 temp &= ~PORT_PLL_LOCK_THRESHOLD_MASK;
1518 temp |= pll->state.hw_state.pll9;
1519 I915_WRITE(BXT_PORT_PLL(phy, ch, 9), temp);
1520
1521 temp = I915_READ(BXT_PORT_PLL(phy, ch, 10));
1522 temp &= ~PORT_PLL_DCO_AMP_OVR_EN_H;
1523 temp &= ~PORT_PLL_DCO_AMP_MASK;
1524 temp |= pll->state.hw_state.pll10;
1525 I915_WRITE(BXT_PORT_PLL(phy, ch, 10), temp);
1526
1527 /* Recalibrate with new settings */
1528 temp = I915_READ(BXT_PORT_PLL_EBB_4(phy, ch));
1529 temp |= PORT_PLL_RECALIBRATE;
1530 I915_WRITE(BXT_PORT_PLL_EBB_4(phy, ch), temp);
1531 temp &= ~PORT_PLL_10BIT_CLK_ENABLE;
1532 temp |= pll->state.hw_state.ebb4;
1533 I915_WRITE(BXT_PORT_PLL_EBB_4(phy, ch), temp);
1534
1535 /* Enable PLL */
1536 temp = I915_READ(BXT_PORT_PLL_ENABLE(port));
1537 temp |= PORT_PLL_ENABLE;
1538 I915_WRITE(BXT_PORT_PLL_ENABLE(port), temp);
1539 POSTING_READ(BXT_PORT_PLL_ENABLE(port));
1540
1541 if (wait_for_us((I915_READ(BXT_PORT_PLL_ENABLE(port)) & PORT_PLL_LOCK),
1542 200))
1543 DRM_ERROR("PLL %d not locked\n", port);
1544
1545 if (IS_GEMINILAKE(dev_priv)) {
1546 temp = I915_READ(BXT_PORT_TX_DW5_LN0(phy, ch));
1547 temp |= DCC_DELAY_RANGE_2;
1548 I915_WRITE(BXT_PORT_TX_DW5_GRP(phy, ch), temp);
1549 }
1550
1551 /*
1552 * While we write to the group register to program all lanes at once we
1553 * can read only lane registers and we pick lanes 0/1 for that.
1554 */
1555 temp = I915_READ(BXT_PORT_PCS_DW12_LN01(phy, ch));
1556 temp &= ~LANE_STAGGER_MASK;
1557 temp &= ~LANESTAGGER_STRAP_OVRD;
1558 temp |= pll->state.hw_state.pcsdw12;
1559 I915_WRITE(BXT_PORT_PCS_DW12_GRP(phy, ch), temp);
1560 }
1561
bxt_ddi_pll_disable(struct drm_i915_private * dev_priv,struct intel_shared_dpll * pll)1562 static void bxt_ddi_pll_disable(struct drm_i915_private *dev_priv,
1563 struct intel_shared_dpll *pll)
1564 {
1565 enum port port = (enum port)pll->info->id; /* 1:1 port->PLL mapping */
1566 uint32_t temp;
1567
1568 temp = I915_READ(BXT_PORT_PLL_ENABLE(port));
1569 temp &= ~PORT_PLL_ENABLE;
1570 I915_WRITE(BXT_PORT_PLL_ENABLE(port), temp);
1571 POSTING_READ(BXT_PORT_PLL_ENABLE(port));
1572
1573 if (IS_GEMINILAKE(dev_priv)) {
1574 temp = I915_READ(BXT_PORT_PLL_ENABLE(port));
1575 temp &= ~PORT_PLL_POWER_ENABLE;
1576 I915_WRITE(BXT_PORT_PLL_ENABLE(port), temp);
1577
1578 if (wait_for_us(!(I915_READ(BXT_PORT_PLL_ENABLE(port)) &
1579 PORT_PLL_POWER_STATE), 200))
1580 DRM_ERROR("Power state not reset for PLL:%d\n", port);
1581 }
1582 }
1583
bxt_ddi_pll_get_hw_state(struct drm_i915_private * dev_priv,struct intel_shared_dpll * pll,struct intel_dpll_hw_state * hw_state)1584 static bool bxt_ddi_pll_get_hw_state(struct drm_i915_private *dev_priv,
1585 struct intel_shared_dpll *pll,
1586 struct intel_dpll_hw_state *hw_state)
1587 {
1588 enum port port = (enum port)pll->info->id; /* 1:1 port->PLL mapping */
1589 uint32_t val;
1590 bool ret;
1591 enum dpio_phy phy;
1592 enum dpio_channel ch;
1593
1594 bxt_port_to_phy_channel(dev_priv, port, &phy, &ch);
1595
1596 if (!intel_display_power_get_if_enabled(dev_priv, POWER_DOMAIN_PLLS))
1597 return false;
1598
1599 ret = false;
1600
1601 val = I915_READ(BXT_PORT_PLL_ENABLE(port));
1602 if (!(val & PORT_PLL_ENABLE))
1603 goto out;
1604
1605 hw_state->ebb0 = I915_READ(BXT_PORT_PLL_EBB_0(phy, ch));
1606 hw_state->ebb0 &= PORT_PLL_P1_MASK | PORT_PLL_P2_MASK;
1607
1608 hw_state->ebb4 = I915_READ(BXT_PORT_PLL_EBB_4(phy, ch));
1609 hw_state->ebb4 &= PORT_PLL_10BIT_CLK_ENABLE;
1610
1611 hw_state->pll0 = I915_READ(BXT_PORT_PLL(phy, ch, 0));
1612 hw_state->pll0 &= PORT_PLL_M2_MASK;
1613
1614 hw_state->pll1 = I915_READ(BXT_PORT_PLL(phy, ch, 1));
1615 hw_state->pll1 &= PORT_PLL_N_MASK;
1616
1617 hw_state->pll2 = I915_READ(BXT_PORT_PLL(phy, ch, 2));
1618 hw_state->pll2 &= PORT_PLL_M2_FRAC_MASK;
1619
1620 hw_state->pll3 = I915_READ(BXT_PORT_PLL(phy, ch, 3));
1621 hw_state->pll3 &= PORT_PLL_M2_FRAC_ENABLE;
1622
1623 hw_state->pll6 = I915_READ(BXT_PORT_PLL(phy, ch, 6));
1624 hw_state->pll6 &= PORT_PLL_PROP_COEFF_MASK |
1625 PORT_PLL_INT_COEFF_MASK |
1626 PORT_PLL_GAIN_CTL_MASK;
1627
1628 hw_state->pll8 = I915_READ(BXT_PORT_PLL(phy, ch, 8));
1629 hw_state->pll8 &= PORT_PLL_TARGET_CNT_MASK;
1630
1631 hw_state->pll9 = I915_READ(BXT_PORT_PLL(phy, ch, 9));
1632 hw_state->pll9 &= PORT_PLL_LOCK_THRESHOLD_MASK;
1633
1634 hw_state->pll10 = I915_READ(BXT_PORT_PLL(phy, ch, 10));
1635 hw_state->pll10 &= PORT_PLL_DCO_AMP_OVR_EN_H |
1636 PORT_PLL_DCO_AMP_MASK;
1637
1638 /*
1639 * While we write to the group register to program all lanes at once we
1640 * can read only lane registers. We configure all lanes the same way, so
1641 * here just read out lanes 0/1 and output a note if lanes 2/3 differ.
1642 */
1643 hw_state->pcsdw12 = I915_READ(BXT_PORT_PCS_DW12_LN01(phy, ch));
1644 if (I915_READ(BXT_PORT_PCS_DW12_LN23(phy, ch)) != hw_state->pcsdw12)
1645 DRM_DEBUG_DRIVER("lane stagger config different for lane 01 (%08x) and 23 (%08x)\n",
1646 hw_state->pcsdw12,
1647 I915_READ(BXT_PORT_PCS_DW12_LN23(phy, ch)));
1648 hw_state->pcsdw12 &= LANE_STAGGER_MASK | LANESTAGGER_STRAP_OVRD;
1649
1650 ret = true;
1651
1652 out:
1653 intel_display_power_put(dev_priv, POWER_DOMAIN_PLLS);
1654
1655 return ret;
1656 }
1657
1658 /* bxt clock parameters */
1659 struct bxt_clk_div {
1660 int clock;
1661 uint32_t p1;
1662 uint32_t p2;
1663 uint32_t m2_int;
1664 uint32_t m2_frac;
1665 bool m2_frac_en;
1666 uint32_t n;
1667
1668 int vco;
1669 };
1670
1671 /* pre-calculated values for DP linkrates */
1672 static const struct bxt_clk_div bxt_dp_clk_val[] = {
1673 {162000, 4, 2, 32, 1677722, 1, 1},
1674 {270000, 4, 1, 27, 0, 0, 1},
1675 {540000, 2, 1, 27, 0, 0, 1},
1676 {216000, 3, 2, 32, 1677722, 1, 1},
1677 {243000, 4, 1, 24, 1258291, 1, 1},
1678 {324000, 4, 1, 32, 1677722, 1, 1},
1679 {432000, 3, 1, 32, 1677722, 1, 1}
1680 };
1681
1682 static bool
bxt_ddi_hdmi_pll_dividers(struct intel_crtc * intel_crtc,struct intel_crtc_state * crtc_state,int clock,struct bxt_clk_div * clk_div)1683 bxt_ddi_hdmi_pll_dividers(struct intel_crtc *intel_crtc,
1684 struct intel_crtc_state *crtc_state, int clock,
1685 struct bxt_clk_div *clk_div)
1686 {
1687 struct dpll best_clock;
1688
1689 /* Calculate HDMI div */
1690 /*
1691 * FIXME: tie the following calculation into
1692 * i9xx_crtc_compute_clock
1693 */
1694 if (!bxt_find_best_dpll(crtc_state, clock, &best_clock)) {
1695 DRM_DEBUG_DRIVER("no PLL dividers found for clock %d pipe %c\n",
1696 clock, pipe_name(intel_crtc->pipe));
1697 return false;
1698 }
1699
1700 clk_div->p1 = best_clock.p1;
1701 clk_div->p2 = best_clock.p2;
1702 WARN_ON(best_clock.m1 != 2);
1703 clk_div->n = best_clock.n;
1704 clk_div->m2_int = best_clock.m2 >> 22;
1705 clk_div->m2_frac = best_clock.m2 & ((1 << 22) - 1);
1706 clk_div->m2_frac_en = clk_div->m2_frac != 0;
1707
1708 clk_div->vco = best_clock.vco;
1709
1710 return true;
1711 }
1712
bxt_ddi_dp_pll_dividers(int clock,struct bxt_clk_div * clk_div)1713 static void bxt_ddi_dp_pll_dividers(int clock, struct bxt_clk_div *clk_div)
1714 {
1715 int i;
1716
1717 *clk_div = bxt_dp_clk_val[0];
1718 for (i = 0; i < ARRAY_SIZE(bxt_dp_clk_val); ++i) {
1719 if (bxt_dp_clk_val[i].clock == clock) {
1720 *clk_div = bxt_dp_clk_val[i];
1721 break;
1722 }
1723 }
1724
1725 clk_div->vco = clock * 10 / 2 * clk_div->p1 * clk_div->p2;
1726 }
1727
bxt_ddi_set_dpll_hw_state(int clock,struct bxt_clk_div * clk_div,struct intel_dpll_hw_state * dpll_hw_state)1728 static bool bxt_ddi_set_dpll_hw_state(int clock,
1729 struct bxt_clk_div *clk_div,
1730 struct intel_dpll_hw_state *dpll_hw_state)
1731 {
1732 int vco = clk_div->vco;
1733 uint32_t prop_coef, int_coef, gain_ctl, targ_cnt;
1734 uint32_t lanestagger;
1735
1736 if (vco >= 6200000 && vco <= 6700000) {
1737 prop_coef = 4;
1738 int_coef = 9;
1739 gain_ctl = 3;
1740 targ_cnt = 8;
1741 } else if ((vco > 5400000 && vco < 6200000) ||
1742 (vco >= 4800000 && vco < 5400000)) {
1743 prop_coef = 5;
1744 int_coef = 11;
1745 gain_ctl = 3;
1746 targ_cnt = 9;
1747 } else if (vco == 5400000) {
1748 prop_coef = 3;
1749 int_coef = 8;
1750 gain_ctl = 1;
1751 targ_cnt = 9;
1752 } else {
1753 DRM_ERROR("Invalid VCO\n");
1754 return false;
1755 }
1756
1757 if (clock > 270000)
1758 lanestagger = 0x18;
1759 else if (clock > 135000)
1760 lanestagger = 0x0d;
1761 else if (clock > 67000)
1762 lanestagger = 0x07;
1763 else if (clock > 33000)
1764 lanestagger = 0x04;
1765 else
1766 lanestagger = 0x02;
1767
1768 dpll_hw_state->ebb0 = PORT_PLL_P1(clk_div->p1) | PORT_PLL_P2(clk_div->p2);
1769 dpll_hw_state->pll0 = clk_div->m2_int;
1770 dpll_hw_state->pll1 = PORT_PLL_N(clk_div->n);
1771 dpll_hw_state->pll2 = clk_div->m2_frac;
1772
1773 if (clk_div->m2_frac_en)
1774 dpll_hw_state->pll3 = PORT_PLL_M2_FRAC_ENABLE;
1775
1776 dpll_hw_state->pll6 = prop_coef | PORT_PLL_INT_COEFF(int_coef);
1777 dpll_hw_state->pll6 |= PORT_PLL_GAIN_CTL(gain_ctl);
1778
1779 dpll_hw_state->pll8 = targ_cnt;
1780
1781 dpll_hw_state->pll9 = 5 << PORT_PLL_LOCK_THRESHOLD_SHIFT;
1782
1783 dpll_hw_state->pll10 =
1784 PORT_PLL_DCO_AMP(PORT_PLL_DCO_AMP_DEFAULT)
1785 | PORT_PLL_DCO_AMP_OVR_EN_H;
1786
1787 dpll_hw_state->ebb4 = PORT_PLL_10BIT_CLK_ENABLE;
1788
1789 dpll_hw_state->pcsdw12 = LANESTAGGER_STRAP_OVRD | lanestagger;
1790
1791 return true;
1792 }
1793
1794 static bool
bxt_ddi_dp_set_dpll_hw_state(int clock,struct intel_dpll_hw_state * dpll_hw_state)1795 bxt_ddi_dp_set_dpll_hw_state(int clock,
1796 struct intel_dpll_hw_state *dpll_hw_state)
1797 {
1798 struct bxt_clk_div clk_div = {0};
1799
1800 bxt_ddi_dp_pll_dividers(clock, &clk_div);
1801
1802 return bxt_ddi_set_dpll_hw_state(clock, &clk_div, dpll_hw_state);
1803 }
1804
1805 static bool
bxt_ddi_hdmi_set_dpll_hw_state(struct intel_crtc * intel_crtc,struct intel_crtc_state * crtc_state,int clock,struct intel_dpll_hw_state * dpll_hw_state)1806 bxt_ddi_hdmi_set_dpll_hw_state(struct intel_crtc *intel_crtc,
1807 struct intel_crtc_state *crtc_state, int clock,
1808 struct intel_dpll_hw_state *dpll_hw_state)
1809 {
1810 struct bxt_clk_div clk_div = { };
1811
1812 bxt_ddi_hdmi_pll_dividers(intel_crtc, crtc_state, clock, &clk_div);
1813
1814 return bxt_ddi_set_dpll_hw_state(clock, &clk_div, dpll_hw_state);
1815 }
1816
1817 static struct intel_shared_dpll *
bxt_get_dpll(struct intel_crtc * crtc,struct intel_crtc_state * crtc_state,struct intel_encoder * encoder)1818 bxt_get_dpll(struct intel_crtc *crtc,
1819 struct intel_crtc_state *crtc_state,
1820 struct intel_encoder *encoder)
1821 {
1822 struct intel_dpll_hw_state dpll_hw_state = { };
1823 struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
1824 struct intel_shared_dpll *pll;
1825 int i, clock = crtc_state->port_clock;
1826
1827 if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_HDMI) &&
1828 !bxt_ddi_hdmi_set_dpll_hw_state(crtc, crtc_state, clock,
1829 &dpll_hw_state))
1830 return NULL;
1831
1832 if (intel_crtc_has_dp_encoder(crtc_state) &&
1833 !bxt_ddi_dp_set_dpll_hw_state(clock, &dpll_hw_state))
1834 return NULL;
1835
1836 memset(&crtc_state->dpll_hw_state, 0,
1837 sizeof(crtc_state->dpll_hw_state));
1838
1839 crtc_state->dpll_hw_state = dpll_hw_state;
1840
1841 /* 1:1 mapping between ports and PLLs */
1842 i = (enum intel_dpll_id) encoder->port;
1843 pll = intel_get_shared_dpll_by_id(dev_priv, i);
1844
1845 DRM_DEBUG_KMS("[CRTC:%d:%s] using pre-allocated %s\n",
1846 crtc->base.base.id, crtc->base.name, pll->info->name);
1847
1848 intel_reference_shared_dpll(pll, crtc_state);
1849
1850 return pll;
1851 }
1852
bxt_dump_hw_state(struct drm_i915_private * dev_priv,struct intel_dpll_hw_state * hw_state)1853 static void bxt_dump_hw_state(struct drm_i915_private *dev_priv,
1854 struct intel_dpll_hw_state *hw_state)
1855 {
1856 DRM_DEBUG_KMS("dpll_hw_state: ebb0: 0x%x, ebb4: 0x%x,"
1857 "pll0: 0x%x, pll1: 0x%x, pll2: 0x%x, pll3: 0x%x, "
1858 "pll6: 0x%x, pll8: 0x%x, pll9: 0x%x, pll10: 0x%x, pcsdw12: 0x%x\n",
1859 hw_state->ebb0,
1860 hw_state->ebb4,
1861 hw_state->pll0,
1862 hw_state->pll1,
1863 hw_state->pll2,
1864 hw_state->pll3,
1865 hw_state->pll6,
1866 hw_state->pll8,
1867 hw_state->pll9,
1868 hw_state->pll10,
1869 hw_state->pcsdw12);
1870 }
1871
1872 static const struct intel_shared_dpll_funcs bxt_ddi_pll_funcs = {
1873 .enable = bxt_ddi_pll_enable,
1874 .disable = bxt_ddi_pll_disable,
1875 .get_hw_state = bxt_ddi_pll_get_hw_state,
1876 };
1877
intel_ddi_pll_init(struct drm_device * dev)1878 static void intel_ddi_pll_init(struct drm_device *dev)
1879 {
1880 struct drm_i915_private *dev_priv = to_i915(dev);
1881
1882 if (INTEL_GEN(dev_priv) < 9) {
1883 uint32_t val = I915_READ(LCPLL_CTL);
1884
1885 /*
1886 * The LCPLL register should be turned on by the BIOS. For now
1887 * let's just check its state and print errors in case
1888 * something is wrong. Don't even try to turn it on.
1889 */
1890
1891 if (val & LCPLL_CD_SOURCE_FCLK)
1892 DRM_ERROR("CDCLK source is not LCPLL\n");
1893
1894 if (val & LCPLL_PLL_DISABLE)
1895 DRM_ERROR("LCPLL is disabled\n");
1896 }
1897 }
1898
1899 struct intel_dpll_mgr {
1900 const struct dpll_info *dpll_info;
1901
1902 struct intel_shared_dpll *(*get_dpll)(struct intel_crtc *crtc,
1903 struct intel_crtc_state *crtc_state,
1904 struct intel_encoder *encoder);
1905
1906 void (*dump_hw_state)(struct drm_i915_private *dev_priv,
1907 struct intel_dpll_hw_state *hw_state);
1908 };
1909
1910 static const struct dpll_info pch_plls[] = {
1911 { "PCH DPLL A", &ibx_pch_dpll_funcs, DPLL_ID_PCH_PLL_A, 0 },
1912 { "PCH DPLL B", &ibx_pch_dpll_funcs, DPLL_ID_PCH_PLL_B, 0 },
1913 { },
1914 };
1915
1916 static const struct intel_dpll_mgr pch_pll_mgr = {
1917 .dpll_info = pch_plls,
1918 .get_dpll = ibx_get_dpll,
1919 .dump_hw_state = ibx_dump_hw_state,
1920 };
1921
1922 static const struct dpll_info hsw_plls[] = {
1923 { "WRPLL 1", &hsw_ddi_wrpll_funcs, DPLL_ID_WRPLL1, 0 },
1924 { "WRPLL 2", &hsw_ddi_wrpll_funcs, DPLL_ID_WRPLL2, 0 },
1925 { "SPLL", &hsw_ddi_spll_funcs, DPLL_ID_SPLL, 0 },
1926 { "LCPLL 810", &hsw_ddi_lcpll_funcs, DPLL_ID_LCPLL_810, INTEL_DPLL_ALWAYS_ON },
1927 { "LCPLL 1350", &hsw_ddi_lcpll_funcs, DPLL_ID_LCPLL_1350, INTEL_DPLL_ALWAYS_ON },
1928 { "LCPLL 2700", &hsw_ddi_lcpll_funcs, DPLL_ID_LCPLL_2700, INTEL_DPLL_ALWAYS_ON },
1929 { },
1930 };
1931
1932 static const struct intel_dpll_mgr hsw_pll_mgr = {
1933 .dpll_info = hsw_plls,
1934 .get_dpll = hsw_get_dpll,
1935 .dump_hw_state = hsw_dump_hw_state,
1936 };
1937
1938 static const struct dpll_info skl_plls[] = {
1939 { "DPLL 0", &skl_ddi_dpll0_funcs, DPLL_ID_SKL_DPLL0, INTEL_DPLL_ALWAYS_ON },
1940 { "DPLL 1", &skl_ddi_pll_funcs, DPLL_ID_SKL_DPLL1, 0 },
1941 { "DPLL 2", &skl_ddi_pll_funcs, DPLL_ID_SKL_DPLL2, 0 },
1942 { "DPLL 3", &skl_ddi_pll_funcs, DPLL_ID_SKL_DPLL3, 0 },
1943 { },
1944 };
1945
1946 static const struct intel_dpll_mgr skl_pll_mgr = {
1947 .dpll_info = skl_plls,
1948 .get_dpll = skl_get_dpll,
1949 .dump_hw_state = skl_dump_hw_state,
1950 };
1951
1952 static const struct dpll_info bxt_plls[] = {
1953 { "PORT PLL A", &bxt_ddi_pll_funcs, DPLL_ID_SKL_DPLL0, 0 },
1954 { "PORT PLL B", &bxt_ddi_pll_funcs, DPLL_ID_SKL_DPLL1, 0 },
1955 { "PORT PLL C", &bxt_ddi_pll_funcs, DPLL_ID_SKL_DPLL2, 0 },
1956 { },
1957 };
1958
1959 static const struct intel_dpll_mgr bxt_pll_mgr = {
1960 .dpll_info = bxt_plls,
1961 .get_dpll = bxt_get_dpll,
1962 .dump_hw_state = bxt_dump_hw_state,
1963 };
1964
cnl_ddi_pll_enable(struct drm_i915_private * dev_priv,struct intel_shared_dpll * pll)1965 static void cnl_ddi_pll_enable(struct drm_i915_private *dev_priv,
1966 struct intel_shared_dpll *pll)
1967 {
1968 const enum intel_dpll_id id = pll->info->id;
1969 uint32_t val;
1970
1971 /* 1. Enable DPLL power in DPLL_ENABLE. */
1972 val = I915_READ(CNL_DPLL_ENABLE(id));
1973 val |= PLL_POWER_ENABLE;
1974 I915_WRITE(CNL_DPLL_ENABLE(id), val);
1975
1976 /* 2. Wait for DPLL power state enabled in DPLL_ENABLE. */
1977 if (intel_wait_for_register(dev_priv,
1978 CNL_DPLL_ENABLE(id),
1979 PLL_POWER_STATE,
1980 PLL_POWER_STATE,
1981 5))
1982 DRM_ERROR("PLL %d Power not enabled\n", id);
1983
1984 /*
1985 * 3. Configure DPLL_CFGCR0 to set SSC enable/disable,
1986 * select DP mode, and set DP link rate.
1987 */
1988 val = pll->state.hw_state.cfgcr0;
1989 I915_WRITE(CNL_DPLL_CFGCR0(id), val);
1990
1991 /* 4. Reab back to ensure writes completed */
1992 POSTING_READ(CNL_DPLL_CFGCR0(id));
1993
1994 /* 3. Configure DPLL_CFGCR0 */
1995 /* Avoid touch CFGCR1 if HDMI mode is not enabled */
1996 if (pll->state.hw_state.cfgcr0 & DPLL_CFGCR0_HDMI_MODE) {
1997 val = pll->state.hw_state.cfgcr1;
1998 I915_WRITE(CNL_DPLL_CFGCR1(id), val);
1999 /* 4. Reab back to ensure writes completed */
2000 POSTING_READ(CNL_DPLL_CFGCR1(id));
2001 }
2002
2003 /*
2004 * 5. If the frequency will result in a change to the voltage
2005 * requirement, follow the Display Voltage Frequency Switching
2006 * Sequence Before Frequency Change
2007 *
2008 * Note: DVFS is actually handled via the cdclk code paths,
2009 * hence we do nothing here.
2010 */
2011
2012 /* 6. Enable DPLL in DPLL_ENABLE. */
2013 val = I915_READ(CNL_DPLL_ENABLE(id));
2014 val |= PLL_ENABLE;
2015 I915_WRITE(CNL_DPLL_ENABLE(id), val);
2016
2017 /* 7. Wait for PLL lock status in DPLL_ENABLE. */
2018 if (intel_wait_for_register(dev_priv,
2019 CNL_DPLL_ENABLE(id),
2020 PLL_LOCK,
2021 PLL_LOCK,
2022 5))
2023 DRM_ERROR("PLL %d not locked\n", id);
2024
2025 /*
2026 * 8. If the frequency will result in a change to the voltage
2027 * requirement, follow the Display Voltage Frequency Switching
2028 * Sequence After Frequency Change
2029 *
2030 * Note: DVFS is actually handled via the cdclk code paths,
2031 * hence we do nothing here.
2032 */
2033
2034 /*
2035 * 9. turn on the clock for the DDI and map the DPLL to the DDI
2036 * Done at intel_ddi_clk_select
2037 */
2038 }
2039
cnl_ddi_pll_disable(struct drm_i915_private * dev_priv,struct intel_shared_dpll * pll)2040 static void cnl_ddi_pll_disable(struct drm_i915_private *dev_priv,
2041 struct intel_shared_dpll *pll)
2042 {
2043 const enum intel_dpll_id id = pll->info->id;
2044 uint32_t val;
2045
2046 /*
2047 * 1. Configure DPCLKA_CFGCR0 to turn off the clock for the DDI.
2048 * Done at intel_ddi_post_disable
2049 */
2050
2051 /*
2052 * 2. If the frequency will result in a change to the voltage
2053 * requirement, follow the Display Voltage Frequency Switching
2054 * Sequence Before Frequency Change
2055 *
2056 * Note: DVFS is actually handled via the cdclk code paths,
2057 * hence we do nothing here.
2058 */
2059
2060 /* 3. Disable DPLL through DPLL_ENABLE. */
2061 val = I915_READ(CNL_DPLL_ENABLE(id));
2062 val &= ~PLL_ENABLE;
2063 I915_WRITE(CNL_DPLL_ENABLE(id), val);
2064
2065 /* 4. Wait for PLL not locked status in DPLL_ENABLE. */
2066 if (intel_wait_for_register(dev_priv,
2067 CNL_DPLL_ENABLE(id),
2068 PLL_LOCK,
2069 0,
2070 5))
2071 DRM_ERROR("PLL %d locked\n", id);
2072
2073 /*
2074 * 5. If the frequency will result in a change to the voltage
2075 * requirement, follow the Display Voltage Frequency Switching
2076 * Sequence After Frequency Change
2077 *
2078 * Note: DVFS is actually handled via the cdclk code paths,
2079 * hence we do nothing here.
2080 */
2081
2082 /* 6. Disable DPLL power in DPLL_ENABLE. */
2083 val = I915_READ(CNL_DPLL_ENABLE(id));
2084 val &= ~PLL_POWER_ENABLE;
2085 I915_WRITE(CNL_DPLL_ENABLE(id), val);
2086
2087 /* 7. Wait for DPLL power state disabled in DPLL_ENABLE. */
2088 if (intel_wait_for_register(dev_priv,
2089 CNL_DPLL_ENABLE(id),
2090 PLL_POWER_STATE,
2091 0,
2092 5))
2093 DRM_ERROR("PLL %d Power not disabled\n", id);
2094 }
2095
cnl_ddi_pll_get_hw_state(struct drm_i915_private * dev_priv,struct intel_shared_dpll * pll,struct intel_dpll_hw_state * hw_state)2096 static bool cnl_ddi_pll_get_hw_state(struct drm_i915_private *dev_priv,
2097 struct intel_shared_dpll *pll,
2098 struct intel_dpll_hw_state *hw_state)
2099 {
2100 const enum intel_dpll_id id = pll->info->id;
2101 uint32_t val;
2102 bool ret;
2103
2104 if (!intel_display_power_get_if_enabled(dev_priv, POWER_DOMAIN_PLLS))
2105 return false;
2106
2107 ret = false;
2108
2109 val = I915_READ(CNL_DPLL_ENABLE(id));
2110 if (!(val & PLL_ENABLE))
2111 goto out;
2112
2113 val = I915_READ(CNL_DPLL_CFGCR0(id));
2114 hw_state->cfgcr0 = val;
2115
2116 /* avoid reading back stale values if HDMI mode is not enabled */
2117 if (val & DPLL_CFGCR0_HDMI_MODE) {
2118 hw_state->cfgcr1 = I915_READ(CNL_DPLL_CFGCR1(id));
2119 }
2120 ret = true;
2121
2122 out:
2123 intel_display_power_put(dev_priv, POWER_DOMAIN_PLLS);
2124
2125 return ret;
2126 }
2127
cnl_wrpll_get_multipliers(int bestdiv,int * pdiv,int * qdiv,int * kdiv)2128 static void cnl_wrpll_get_multipliers(int bestdiv, int *pdiv,
2129 int *qdiv, int *kdiv)
2130 {
2131 /* even dividers */
2132 if (bestdiv % 2 == 0) {
2133 if (bestdiv == 2) {
2134 *pdiv = 2;
2135 *qdiv = 1;
2136 *kdiv = 1;
2137 } else if (bestdiv % 4 == 0) {
2138 *pdiv = 2;
2139 *qdiv = bestdiv / 4;
2140 *kdiv = 2;
2141 } else if (bestdiv % 6 == 0) {
2142 *pdiv = 3;
2143 *qdiv = bestdiv / 6;
2144 *kdiv = 2;
2145 } else if (bestdiv % 5 == 0) {
2146 *pdiv = 5;
2147 *qdiv = bestdiv / 10;
2148 *kdiv = 2;
2149 } else if (bestdiv % 14 == 0) {
2150 *pdiv = 7;
2151 *qdiv = bestdiv / 14;
2152 *kdiv = 2;
2153 }
2154 } else {
2155 if (bestdiv == 3 || bestdiv == 5 || bestdiv == 7) {
2156 *pdiv = bestdiv;
2157 *qdiv = 1;
2158 *kdiv = 1;
2159 } else { /* 9, 15, 21 */
2160 *pdiv = bestdiv / 3;
2161 *qdiv = 1;
2162 *kdiv = 3;
2163 }
2164 }
2165 }
2166
cnl_wrpll_params_populate(struct skl_wrpll_params * params,u32 dco_freq,u32 ref_freq,int pdiv,int qdiv,int kdiv)2167 static void cnl_wrpll_params_populate(struct skl_wrpll_params *params,
2168 u32 dco_freq, u32 ref_freq,
2169 int pdiv, int qdiv, int kdiv)
2170 {
2171 u32 dco;
2172
2173 switch (kdiv) {
2174 case 1:
2175 params->kdiv = 1;
2176 break;
2177 case 2:
2178 params->kdiv = 2;
2179 break;
2180 case 3:
2181 params->kdiv = 4;
2182 break;
2183 default:
2184 WARN(1, "Incorrect KDiv\n");
2185 }
2186
2187 switch (pdiv) {
2188 case 2:
2189 params->pdiv = 1;
2190 break;
2191 case 3:
2192 params->pdiv = 2;
2193 break;
2194 case 5:
2195 params->pdiv = 4;
2196 break;
2197 case 7:
2198 params->pdiv = 8;
2199 break;
2200 default:
2201 WARN(1, "Incorrect PDiv\n");
2202 }
2203
2204 WARN_ON(kdiv != 2 && qdiv != 1);
2205
2206 params->qdiv_ratio = qdiv;
2207 params->qdiv_mode = (qdiv == 1) ? 0 : 1;
2208
2209 dco = div_u64((u64)dco_freq << 15, ref_freq);
2210
2211 params->dco_integer = dco >> 15;
2212 params->dco_fraction = dco & 0x7fff;
2213 }
2214
2215 static bool
cnl_ddi_calculate_wrpll(int clock,struct drm_i915_private * dev_priv,struct skl_wrpll_params * wrpll_params)2216 cnl_ddi_calculate_wrpll(int clock,
2217 struct drm_i915_private *dev_priv,
2218 struct skl_wrpll_params *wrpll_params)
2219 {
2220 u32 afe_clock = clock * 5;
2221 uint32_t ref_clock;
2222 u32 dco_min = 7998000;
2223 u32 dco_max = 10000000;
2224 u32 dco_mid = (dco_min + dco_max) / 2;
2225 static const int dividers[] = { 2, 4, 6, 8, 10, 12, 14, 16,
2226 18, 20, 24, 28, 30, 32, 36, 40,
2227 42, 44, 48, 50, 52, 54, 56, 60,
2228 64, 66, 68, 70, 72, 76, 78, 80,
2229 84, 88, 90, 92, 96, 98, 100, 102,
2230 3, 5, 7, 9, 15, 21 };
2231 u32 dco, best_dco = 0, dco_centrality = 0;
2232 u32 best_dco_centrality = U32_MAX; /* Spec meaning of 999999 MHz */
2233 int d, best_div = 0, pdiv = 0, qdiv = 0, kdiv = 0;
2234
2235 for (d = 0; d < ARRAY_SIZE(dividers); d++) {
2236 dco = afe_clock * dividers[d];
2237
2238 if ((dco <= dco_max) && (dco >= dco_min)) {
2239 dco_centrality = abs(dco - dco_mid);
2240
2241 if (dco_centrality < best_dco_centrality) {
2242 best_dco_centrality = dco_centrality;
2243 best_div = dividers[d];
2244 best_dco = dco;
2245 }
2246 }
2247 }
2248
2249 if (best_div == 0)
2250 return false;
2251
2252 cnl_wrpll_get_multipliers(best_div, &pdiv, &qdiv, &kdiv);
2253
2254 ref_clock = dev_priv->cdclk.hw.ref;
2255
2256 /*
2257 * For ICL, the spec states: if reference frequency is 38.4, use 19.2
2258 * because the DPLL automatically divides that by 2.
2259 */
2260 if (IS_ICELAKE(dev_priv) && ref_clock == 38400)
2261 ref_clock = 19200;
2262
2263 cnl_wrpll_params_populate(wrpll_params, best_dco, ref_clock, pdiv, qdiv,
2264 kdiv);
2265
2266 return true;
2267 }
2268
cnl_ddi_hdmi_pll_dividers(struct intel_crtc * crtc,struct intel_crtc_state * crtc_state,int clock)2269 static bool cnl_ddi_hdmi_pll_dividers(struct intel_crtc *crtc,
2270 struct intel_crtc_state *crtc_state,
2271 int clock)
2272 {
2273 struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
2274 uint32_t cfgcr0, cfgcr1;
2275 struct skl_wrpll_params wrpll_params = { 0, };
2276
2277 cfgcr0 = DPLL_CFGCR0_HDMI_MODE;
2278
2279 if (!cnl_ddi_calculate_wrpll(clock, dev_priv, &wrpll_params))
2280 return false;
2281
2282 cfgcr0 |= DPLL_CFGCR0_DCO_FRACTION(wrpll_params.dco_fraction) |
2283 wrpll_params.dco_integer;
2284
2285 cfgcr1 = DPLL_CFGCR1_QDIV_RATIO(wrpll_params.qdiv_ratio) |
2286 DPLL_CFGCR1_QDIV_MODE(wrpll_params.qdiv_mode) |
2287 DPLL_CFGCR1_KDIV(wrpll_params.kdiv) |
2288 DPLL_CFGCR1_PDIV(wrpll_params.pdiv) |
2289 DPLL_CFGCR1_CENTRAL_FREQ;
2290
2291 memset(&crtc_state->dpll_hw_state, 0,
2292 sizeof(crtc_state->dpll_hw_state));
2293
2294 crtc_state->dpll_hw_state.cfgcr0 = cfgcr0;
2295 crtc_state->dpll_hw_state.cfgcr1 = cfgcr1;
2296 return true;
2297 }
2298
2299 static bool
cnl_ddi_dp_set_dpll_hw_state(int clock,struct intel_dpll_hw_state * dpll_hw_state)2300 cnl_ddi_dp_set_dpll_hw_state(int clock,
2301 struct intel_dpll_hw_state *dpll_hw_state)
2302 {
2303 uint32_t cfgcr0;
2304
2305 cfgcr0 = DPLL_CFGCR0_SSC_ENABLE;
2306
2307 switch (clock / 2) {
2308 case 81000:
2309 cfgcr0 |= DPLL_CFGCR0_LINK_RATE_810;
2310 break;
2311 case 135000:
2312 cfgcr0 |= DPLL_CFGCR0_LINK_RATE_1350;
2313 break;
2314 case 270000:
2315 cfgcr0 |= DPLL_CFGCR0_LINK_RATE_2700;
2316 break;
2317 /* eDP 1.4 rates */
2318 case 162000:
2319 cfgcr0 |= DPLL_CFGCR0_LINK_RATE_1620;
2320 break;
2321 case 108000:
2322 cfgcr0 |= DPLL_CFGCR0_LINK_RATE_1080;
2323 break;
2324 case 216000:
2325 cfgcr0 |= DPLL_CFGCR0_LINK_RATE_2160;
2326 break;
2327 case 324000:
2328 /* Some SKUs may require elevated I/O voltage to support this */
2329 cfgcr0 |= DPLL_CFGCR0_LINK_RATE_3240;
2330 break;
2331 case 405000:
2332 /* Some SKUs may require elevated I/O voltage to support this */
2333 cfgcr0 |= DPLL_CFGCR0_LINK_RATE_4050;
2334 break;
2335 }
2336
2337 dpll_hw_state->cfgcr0 = cfgcr0;
2338 return true;
2339 }
2340
2341 static struct intel_shared_dpll *
cnl_get_dpll(struct intel_crtc * crtc,struct intel_crtc_state * crtc_state,struct intel_encoder * encoder)2342 cnl_get_dpll(struct intel_crtc *crtc, struct intel_crtc_state *crtc_state,
2343 struct intel_encoder *encoder)
2344 {
2345 struct intel_shared_dpll *pll;
2346 int clock = crtc_state->port_clock;
2347 bool bret;
2348 struct intel_dpll_hw_state dpll_hw_state;
2349
2350 memset(&dpll_hw_state, 0, sizeof(dpll_hw_state));
2351
2352 if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_HDMI)) {
2353 bret = cnl_ddi_hdmi_pll_dividers(crtc, crtc_state, clock);
2354 if (!bret) {
2355 DRM_DEBUG_KMS("Could not get HDMI pll dividers.\n");
2356 return NULL;
2357 }
2358 } else if (intel_crtc_has_dp_encoder(crtc_state)) {
2359 bret = cnl_ddi_dp_set_dpll_hw_state(clock, &dpll_hw_state);
2360 if (!bret) {
2361 DRM_DEBUG_KMS("Could not set DP dpll HW state.\n");
2362 return NULL;
2363 }
2364 crtc_state->dpll_hw_state = dpll_hw_state;
2365 } else {
2366 DRM_DEBUG_KMS("Skip DPLL setup for output_types 0x%x\n",
2367 crtc_state->output_types);
2368 return NULL;
2369 }
2370
2371 pll = intel_find_shared_dpll(crtc, crtc_state,
2372 DPLL_ID_SKL_DPLL0,
2373 DPLL_ID_SKL_DPLL2);
2374 if (!pll) {
2375 DRM_DEBUG_KMS("No PLL selected\n");
2376 return NULL;
2377 }
2378
2379 intel_reference_shared_dpll(pll, crtc_state);
2380
2381 return pll;
2382 }
2383
cnl_dump_hw_state(struct drm_i915_private * dev_priv,struct intel_dpll_hw_state * hw_state)2384 static void cnl_dump_hw_state(struct drm_i915_private *dev_priv,
2385 struct intel_dpll_hw_state *hw_state)
2386 {
2387 DRM_DEBUG_KMS("dpll_hw_state: "
2388 "cfgcr0: 0x%x, cfgcr1: 0x%x\n",
2389 hw_state->cfgcr0,
2390 hw_state->cfgcr1);
2391 }
2392
2393 static const struct intel_shared_dpll_funcs cnl_ddi_pll_funcs = {
2394 .enable = cnl_ddi_pll_enable,
2395 .disable = cnl_ddi_pll_disable,
2396 .get_hw_state = cnl_ddi_pll_get_hw_state,
2397 };
2398
2399 static const struct dpll_info cnl_plls[] = {
2400 { "DPLL 0", &cnl_ddi_pll_funcs, DPLL_ID_SKL_DPLL0, 0 },
2401 { "DPLL 1", &cnl_ddi_pll_funcs, DPLL_ID_SKL_DPLL1, 0 },
2402 { "DPLL 2", &cnl_ddi_pll_funcs, DPLL_ID_SKL_DPLL2, 0 },
2403 { },
2404 };
2405
2406 static const struct intel_dpll_mgr cnl_pll_mgr = {
2407 .dpll_info = cnl_plls,
2408 .get_dpll = cnl_get_dpll,
2409 .dump_hw_state = cnl_dump_hw_state,
2410 };
2411
2412 /*
2413 * These values alrea already adjusted: they're the bits we write to the
2414 * registers, not the logical values.
2415 */
2416 static const struct skl_wrpll_params icl_dp_combo_pll_24MHz_values[] = {
2417 { .dco_integer = 0x151, .dco_fraction = 0x4000, /* [0]: 5.4 */
2418 .pdiv = 0x2 /* 3 */, .kdiv = 1, .qdiv_mode = 0, .qdiv_ratio = 0},
2419 { .dco_integer = 0x151, .dco_fraction = 0x4000, /* [1]: 2.7 */
2420 .pdiv = 0x2 /* 3 */, .kdiv = 2, .qdiv_mode = 0, .qdiv_ratio = 0},
2421 { .dco_integer = 0x151, .dco_fraction = 0x4000, /* [2]: 1.62 */
2422 .pdiv = 0x4 /* 5 */, .kdiv = 2, .qdiv_mode = 0, .qdiv_ratio = 0},
2423 { .dco_integer = 0x151, .dco_fraction = 0x4000, /* [3]: 3.24 */
2424 .pdiv = 0x4 /* 5 */, .kdiv = 1, .qdiv_mode = 0, .qdiv_ratio = 0},
2425 { .dco_integer = 0x168, .dco_fraction = 0x0000, /* [4]: 2.16 */
2426 .pdiv = 0x1 /* 2 */, .kdiv = 2, .qdiv_mode = 1, .qdiv_ratio = 2},
2427 { .dco_integer = 0x168, .dco_fraction = 0x0000, /* [5]: 4.32 */
2428 .pdiv = 0x1 /* 2 */, .kdiv = 2, .qdiv_mode = 0, .qdiv_ratio = 0},
2429 { .dco_integer = 0x195, .dco_fraction = 0x0000, /* [6]: 6.48 */
2430 .pdiv = 0x2 /* 3 */, .kdiv = 1, .qdiv_mode = 0, .qdiv_ratio = 0},
2431 { .dco_integer = 0x151, .dco_fraction = 0x4000, /* [7]: 8.1 */
2432 .pdiv = 0x1 /* 2 */, .kdiv = 1, .qdiv_mode = 0, .qdiv_ratio = 0},
2433 };
2434
2435 /* Also used for 38.4 MHz values. */
2436 static const struct skl_wrpll_params icl_dp_combo_pll_19_2MHz_values[] = {
2437 { .dco_integer = 0x1A5, .dco_fraction = 0x7000, /* [0]: 5.4 */
2438 .pdiv = 0x2 /* 3 */, .kdiv = 1, .qdiv_mode = 0, .qdiv_ratio = 0},
2439 { .dco_integer = 0x1A5, .dco_fraction = 0x7000, /* [1]: 2.7 */
2440 .pdiv = 0x2 /* 3 */, .kdiv = 2, .qdiv_mode = 0, .qdiv_ratio = 0},
2441 { .dco_integer = 0x1A5, .dco_fraction = 0x7000, /* [2]: 1.62 */
2442 .pdiv = 0x4 /* 5 */, .kdiv = 2, .qdiv_mode = 0, .qdiv_ratio = 0},
2443 { .dco_integer = 0x1A5, .dco_fraction = 0x7000, /* [3]: 3.24 */
2444 .pdiv = 0x4 /* 5 */, .kdiv = 1, .qdiv_mode = 0, .qdiv_ratio = 0},
2445 { .dco_integer = 0x1C2, .dco_fraction = 0x0000, /* [4]: 2.16 */
2446 .pdiv = 0x1 /* 2 */, .kdiv = 2, .qdiv_mode = 1, .qdiv_ratio = 2},
2447 { .dco_integer = 0x1C2, .dco_fraction = 0x0000, /* [5]: 4.32 */
2448 .pdiv = 0x1 /* 2 */, .kdiv = 2, .qdiv_mode = 0, .qdiv_ratio = 0},
2449 { .dco_integer = 0x1FA, .dco_fraction = 0x2000, /* [6]: 6.48 */
2450 .pdiv = 0x2 /* 3 */, .kdiv = 1, .qdiv_mode = 0, .qdiv_ratio = 0},
2451 { .dco_integer = 0x1A5, .dco_fraction = 0x7000, /* [7]: 8.1 */
2452 .pdiv = 0x1 /* 2 */, .kdiv = 1, .qdiv_mode = 0, .qdiv_ratio = 0},
2453 };
2454
icl_calc_dp_combo_pll(struct drm_i915_private * dev_priv,int clock,struct skl_wrpll_params * pll_params)2455 static bool icl_calc_dp_combo_pll(struct drm_i915_private *dev_priv, int clock,
2456 struct skl_wrpll_params *pll_params)
2457 {
2458 const struct skl_wrpll_params *params;
2459
2460 params = dev_priv->cdclk.hw.ref == 24000 ?
2461 icl_dp_combo_pll_24MHz_values :
2462 icl_dp_combo_pll_19_2MHz_values;
2463
2464 switch (clock) {
2465 case 540000:
2466 *pll_params = params[0];
2467 break;
2468 case 270000:
2469 *pll_params = params[1];
2470 break;
2471 case 162000:
2472 *pll_params = params[2];
2473 break;
2474 case 324000:
2475 *pll_params = params[3];
2476 break;
2477 case 216000:
2478 *pll_params = params[4];
2479 break;
2480 case 432000:
2481 *pll_params = params[5];
2482 break;
2483 case 648000:
2484 *pll_params = params[6];
2485 break;
2486 case 810000:
2487 *pll_params = params[7];
2488 break;
2489 default:
2490 MISSING_CASE(clock);
2491 return false;
2492 }
2493
2494 return true;
2495 }
2496
icl_calc_dpll_state(struct intel_crtc_state * crtc_state,struct intel_encoder * encoder,int clock,struct intel_dpll_hw_state * pll_state)2497 static bool icl_calc_dpll_state(struct intel_crtc_state *crtc_state,
2498 struct intel_encoder *encoder, int clock,
2499 struct intel_dpll_hw_state *pll_state)
2500 {
2501 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
2502 uint32_t cfgcr0, cfgcr1;
2503 struct skl_wrpll_params pll_params = { 0 };
2504 bool ret;
2505
2506 if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_HDMI))
2507 ret = cnl_ddi_calculate_wrpll(clock, dev_priv, &pll_params);
2508 else
2509 ret = icl_calc_dp_combo_pll(dev_priv, clock, &pll_params);
2510
2511 if (!ret)
2512 return false;
2513
2514 cfgcr0 = DPLL_CFGCR0_DCO_FRACTION(pll_params.dco_fraction) |
2515 pll_params.dco_integer;
2516
2517 cfgcr1 = DPLL_CFGCR1_QDIV_RATIO(pll_params.qdiv_ratio) |
2518 DPLL_CFGCR1_QDIV_MODE(pll_params.qdiv_mode) |
2519 DPLL_CFGCR1_KDIV(pll_params.kdiv) |
2520 DPLL_CFGCR1_PDIV(pll_params.pdiv) |
2521 DPLL_CFGCR1_CENTRAL_FREQ_8400;
2522
2523 pll_state->cfgcr0 = cfgcr0;
2524 pll_state->cfgcr1 = cfgcr1;
2525 return true;
2526 }
2527
icl_calc_dp_combo_pll_link(struct drm_i915_private * dev_priv,uint32_t pll_id)2528 int icl_calc_dp_combo_pll_link(struct drm_i915_private *dev_priv,
2529 uint32_t pll_id)
2530 {
2531 uint32_t cfgcr0, cfgcr1;
2532 uint32_t pdiv, kdiv, qdiv_mode, qdiv_ratio, dco_integer, dco_fraction;
2533 const struct skl_wrpll_params *params;
2534 int index, n_entries, link_clock;
2535
2536 /* Read back values from DPLL CFGCR registers */
2537 cfgcr0 = I915_READ(ICL_DPLL_CFGCR0(pll_id));
2538 cfgcr1 = I915_READ(ICL_DPLL_CFGCR1(pll_id));
2539
2540 dco_integer = cfgcr0 & DPLL_CFGCR0_DCO_INTEGER_MASK;
2541 dco_fraction = (cfgcr0 & DPLL_CFGCR0_DCO_FRACTION_MASK) >>
2542 DPLL_CFGCR0_DCO_FRACTION_SHIFT;
2543 pdiv = (cfgcr1 & DPLL_CFGCR1_PDIV_MASK) >> DPLL_CFGCR1_PDIV_SHIFT;
2544 kdiv = (cfgcr1 & DPLL_CFGCR1_KDIV_MASK) >> DPLL_CFGCR1_KDIV_SHIFT;
2545 qdiv_mode = (cfgcr1 & DPLL_CFGCR1_QDIV_MODE(1)) >>
2546 DPLL_CFGCR1_QDIV_MODE_SHIFT;
2547 qdiv_ratio = (cfgcr1 & DPLL_CFGCR1_QDIV_RATIO_MASK) >>
2548 DPLL_CFGCR1_QDIV_RATIO_SHIFT;
2549
2550 params = dev_priv->cdclk.hw.ref == 24000 ?
2551 icl_dp_combo_pll_24MHz_values :
2552 icl_dp_combo_pll_19_2MHz_values;
2553 n_entries = ARRAY_SIZE(icl_dp_combo_pll_24MHz_values);
2554
2555 for (index = 0; index < n_entries; index++) {
2556 if (dco_integer == params[index].dco_integer &&
2557 dco_fraction == params[index].dco_fraction &&
2558 pdiv == params[index].pdiv &&
2559 kdiv == params[index].kdiv &&
2560 qdiv_mode == params[index].qdiv_mode &&
2561 qdiv_ratio == params[index].qdiv_ratio)
2562 break;
2563 }
2564
2565 /* Map PLL Index to Link Clock */
2566 switch (index) {
2567 default:
2568 MISSING_CASE(index);
2569 /* fall through */
2570 case 0:
2571 link_clock = 540000;
2572 break;
2573 case 1:
2574 link_clock = 270000;
2575 break;
2576 case 2:
2577 link_clock = 162000;
2578 break;
2579 case 3:
2580 link_clock = 324000;
2581 break;
2582 case 4:
2583 link_clock = 216000;
2584 break;
2585 case 5:
2586 link_clock = 432000;
2587 break;
2588 case 6:
2589 link_clock = 648000;
2590 break;
2591 case 7:
2592 link_clock = 810000;
2593 break;
2594 }
2595
2596 return link_clock;
2597 }
2598
icl_mg_pll_id_to_port(enum intel_dpll_id id)2599 static enum port icl_mg_pll_id_to_port(enum intel_dpll_id id)
2600 {
2601 return id - DPLL_ID_ICL_MGPLL1 + PORT_C;
2602 }
2603
icl_port_to_mg_pll_id(enum port port)2604 static enum intel_dpll_id icl_port_to_mg_pll_id(enum port port)
2605 {
2606 return port - PORT_C + DPLL_ID_ICL_MGPLL1;
2607 }
2608
icl_mg_pll_find_divisors(int clock_khz,bool is_dp,bool use_ssc,uint32_t * target_dco_khz,struct intel_dpll_hw_state * state)2609 static bool icl_mg_pll_find_divisors(int clock_khz, bool is_dp, bool use_ssc,
2610 uint32_t *target_dco_khz,
2611 struct intel_dpll_hw_state *state)
2612 {
2613 uint32_t dco_min_freq, dco_max_freq;
2614 int div1_vals[] = {7, 5, 3, 2};
2615 unsigned int i;
2616 int div2;
2617
2618 dco_min_freq = is_dp ? 8100000 : use_ssc ? 8000000 : 7992000;
2619 dco_max_freq = is_dp ? 8100000 : 10000000;
2620
2621 for (i = 0; i < ARRAY_SIZE(div1_vals); i++) {
2622 int div1 = div1_vals[i];
2623
2624 for (div2 = 10; div2 > 0; div2--) {
2625 int dco = div1 * div2 * clock_khz * 5;
2626 int a_divratio, tlinedrv, inputsel, hsdiv;
2627
2628 if (dco < dco_min_freq || dco > dco_max_freq)
2629 continue;
2630
2631 if (div2 >= 2) {
2632 a_divratio = is_dp ? 10 : 5;
2633 tlinedrv = 2;
2634 } else {
2635 a_divratio = 5;
2636 tlinedrv = 0;
2637 }
2638 inputsel = is_dp ? 0 : 1;
2639
2640 switch (div1) {
2641 default:
2642 MISSING_CASE(div1);
2643 /* fall through */
2644 case 2:
2645 hsdiv = 0;
2646 break;
2647 case 3:
2648 hsdiv = 1;
2649 break;
2650 case 5:
2651 hsdiv = 2;
2652 break;
2653 case 7:
2654 hsdiv = 3;
2655 break;
2656 }
2657
2658 *target_dco_khz = dco;
2659
2660 state->mg_refclkin_ctl = MG_REFCLKIN_CTL_OD_2_MUX(1);
2661
2662 state->mg_clktop2_coreclkctl1 =
2663 MG_CLKTOP2_CORECLKCTL1_A_DIVRATIO(a_divratio);
2664
2665 state->mg_clktop2_hsclkctl =
2666 MG_CLKTOP2_HSCLKCTL_TLINEDRV_CLKSEL(tlinedrv) |
2667 MG_CLKTOP2_HSCLKCTL_CORE_INPUTSEL(inputsel) |
2668 MG_CLKTOP2_HSCLKCTL_HSDIV_RATIO(hsdiv) |
2669 MG_CLKTOP2_HSCLKCTL_DSDIV_RATIO(div2);
2670
2671 return true;
2672 }
2673 }
2674
2675 return false;
2676 }
2677
2678 /*
2679 * The specification for this function uses real numbers, so the math had to be
2680 * adapted to integer-only calculation, that's why it looks so different.
2681 */
icl_calc_mg_pll_state(struct intel_crtc_state * crtc_state,struct intel_encoder * encoder,int clock,struct intel_dpll_hw_state * pll_state)2682 static bool icl_calc_mg_pll_state(struct intel_crtc_state *crtc_state,
2683 struct intel_encoder *encoder, int clock,
2684 struct intel_dpll_hw_state *pll_state)
2685 {
2686 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
2687 int refclk_khz = dev_priv->cdclk.hw.ref;
2688 uint32_t dco_khz, m1div, m2div_int, m2div_rem, m2div_frac;
2689 uint32_t iref_ndiv, iref_trim, iref_pulse_w;
2690 uint32_t prop_coeff, int_coeff;
2691 uint32_t tdc_targetcnt, feedfwgain;
2692 uint64_t ssc_stepsize, ssc_steplen, ssc_steplog;
2693 uint64_t tmp;
2694 bool use_ssc = false;
2695 bool is_dp = !intel_crtc_has_type(crtc_state, INTEL_OUTPUT_HDMI);
2696
2697 if (!icl_mg_pll_find_divisors(clock, is_dp, use_ssc, &dco_khz,
2698 pll_state)) {
2699 DRM_DEBUG_KMS("Failed to find divisors for clock %d\n", clock);
2700 return false;
2701 }
2702
2703 m1div = 2;
2704 m2div_int = dco_khz / (refclk_khz * m1div);
2705 if (m2div_int > 255) {
2706 m1div = 4;
2707 m2div_int = dco_khz / (refclk_khz * m1div);
2708 if (m2div_int > 255) {
2709 DRM_DEBUG_KMS("Failed to find mdiv for clock %d\n",
2710 clock);
2711 return false;
2712 }
2713 }
2714 m2div_rem = dco_khz % (refclk_khz * m1div);
2715
2716 tmp = (uint64_t)m2div_rem * (1 << 22);
2717 do_div(tmp, refclk_khz * m1div);
2718 m2div_frac = tmp;
2719
2720 switch (refclk_khz) {
2721 case 19200:
2722 iref_ndiv = 1;
2723 iref_trim = 28;
2724 iref_pulse_w = 1;
2725 break;
2726 case 24000:
2727 iref_ndiv = 1;
2728 iref_trim = 25;
2729 iref_pulse_w = 2;
2730 break;
2731 case 38400:
2732 iref_ndiv = 2;
2733 iref_trim = 28;
2734 iref_pulse_w = 1;
2735 break;
2736 default:
2737 MISSING_CASE(refclk_khz);
2738 return false;
2739 }
2740
2741 /*
2742 * tdc_res = 0.000003
2743 * tdc_targetcnt = int(2 / (tdc_res * 8 * 50 * 1.1) / refclk_mhz + 0.5)
2744 *
2745 * The multiplication by 1000 is due to refclk MHz to KHz conversion. It
2746 * was supposed to be a division, but we rearranged the operations of
2747 * the formula to avoid early divisions so we don't multiply the
2748 * rounding errors.
2749 *
2750 * 0.000003 * 8 * 50 * 1.1 = 0.00132, also known as 132 / 100000, which
2751 * we also rearrange to work with integers.
2752 *
2753 * The 0.5 transformed to 5 results in a multiplication by 10 and the
2754 * last division by 10.
2755 */
2756 tdc_targetcnt = (2 * 1000 * 100000 * 10 / (132 * refclk_khz) + 5) / 10;
2757
2758 /*
2759 * Here we divide dco_khz by 10 in order to allow the dividend to fit in
2760 * 32 bits. That's not a problem since we round the division down
2761 * anyway.
2762 */
2763 feedfwgain = (use_ssc || m2div_rem > 0) ?
2764 m1div * 1000000 * 100 / (dco_khz * 3 / 10) : 0;
2765
2766 if (dco_khz >= 9000000) {
2767 prop_coeff = 5;
2768 int_coeff = 10;
2769 } else {
2770 prop_coeff = 4;
2771 int_coeff = 8;
2772 }
2773
2774 if (use_ssc) {
2775 tmp = (uint64_t)dco_khz * 47 * 32;
2776 do_div(tmp, refclk_khz * m1div * 10000);
2777 ssc_stepsize = tmp;
2778
2779 tmp = (uint64_t)dco_khz * 1000;
2780 ssc_steplen = DIV_ROUND_UP_ULL(tmp, 32 * 2 * 32);
2781 } else {
2782 ssc_stepsize = 0;
2783 ssc_steplen = 0;
2784 }
2785 ssc_steplog = 4;
2786
2787 pll_state->mg_pll_div0 = (m2div_rem > 0 ? MG_PLL_DIV0_FRACNEN_H : 0) |
2788 MG_PLL_DIV0_FBDIV_FRAC(m2div_frac) |
2789 MG_PLL_DIV0_FBDIV_INT(m2div_int);
2790
2791 pll_state->mg_pll_div1 = MG_PLL_DIV1_IREF_NDIVRATIO(iref_ndiv) |
2792 MG_PLL_DIV1_DITHER_DIV_2 |
2793 MG_PLL_DIV1_NDIVRATIO(1) |
2794 MG_PLL_DIV1_FBPREDIV(m1div);
2795
2796 pll_state->mg_pll_lf = MG_PLL_LF_TDCTARGETCNT(tdc_targetcnt) |
2797 MG_PLL_LF_AFCCNTSEL_512 |
2798 MG_PLL_LF_GAINCTRL(1) |
2799 MG_PLL_LF_INT_COEFF(int_coeff) |
2800 MG_PLL_LF_PROP_COEFF(prop_coeff);
2801
2802 pll_state->mg_pll_frac_lock = MG_PLL_FRAC_LOCK_TRUELOCK_CRIT_32 |
2803 MG_PLL_FRAC_LOCK_EARLYLOCK_CRIT_32 |
2804 MG_PLL_FRAC_LOCK_LOCKTHRESH(10) |
2805 MG_PLL_FRAC_LOCK_DCODITHEREN |
2806 MG_PLL_FRAC_LOCK_FEEDFWRDGAIN(feedfwgain);
2807 if (use_ssc || m2div_rem > 0)
2808 pll_state->mg_pll_frac_lock |= MG_PLL_FRAC_LOCK_FEEDFWRDCAL_EN;
2809
2810 pll_state->mg_pll_ssc = (use_ssc ? MG_PLL_SSC_EN : 0) |
2811 MG_PLL_SSC_TYPE(2) |
2812 MG_PLL_SSC_STEPLENGTH(ssc_steplen) |
2813 MG_PLL_SSC_STEPNUM(ssc_steplog) |
2814 MG_PLL_SSC_FLLEN |
2815 MG_PLL_SSC_STEPSIZE(ssc_stepsize);
2816
2817 pll_state->mg_pll_tdc_coldst_bias = MG_PLL_TDC_COLDST_COLDSTART |
2818 MG_PLL_TDC_COLDST_IREFINT_EN |
2819 MG_PLL_TDC_COLDST_REFBIAS_START_PULSE_W(iref_pulse_w) |
2820 MG_PLL_TDC_TDCOVCCORR_EN |
2821 MG_PLL_TDC_TDCSEL(3);
2822
2823 pll_state->mg_pll_bias = MG_PLL_BIAS_BIAS_GB_SEL(3) |
2824 MG_PLL_BIAS_INIT_DCOAMP(0x3F) |
2825 MG_PLL_BIAS_BIAS_BONUS(10) |
2826 MG_PLL_BIAS_BIASCAL_EN |
2827 MG_PLL_BIAS_CTRIM(12) |
2828 MG_PLL_BIAS_VREF_RDAC(4) |
2829 MG_PLL_BIAS_IREFTRIM(iref_trim);
2830
2831 if (refclk_khz == 38400) {
2832 pll_state->mg_pll_tdc_coldst_bias_mask = MG_PLL_TDC_COLDST_COLDSTART;
2833 pll_state->mg_pll_bias_mask = 0;
2834 } else {
2835 pll_state->mg_pll_tdc_coldst_bias_mask = -1U;
2836 pll_state->mg_pll_bias_mask = -1U;
2837 }
2838
2839 pll_state->mg_pll_tdc_coldst_bias &= pll_state->mg_pll_tdc_coldst_bias_mask;
2840 pll_state->mg_pll_bias &= pll_state->mg_pll_bias_mask;
2841
2842 return true;
2843 }
2844
2845 static struct intel_shared_dpll *
icl_get_dpll(struct intel_crtc * crtc,struct intel_crtc_state * crtc_state,struct intel_encoder * encoder)2846 icl_get_dpll(struct intel_crtc *crtc, struct intel_crtc_state *crtc_state,
2847 struct intel_encoder *encoder)
2848 {
2849 struct intel_shared_dpll *pll;
2850 struct intel_dpll_hw_state pll_state = {};
2851 enum port port = encoder->port;
2852 enum intel_dpll_id min, max;
2853 int clock = crtc_state->port_clock;
2854 bool ret;
2855
2856 switch (port) {
2857 case PORT_A:
2858 case PORT_B:
2859 min = DPLL_ID_ICL_DPLL0;
2860 max = DPLL_ID_ICL_DPLL1;
2861 ret = icl_calc_dpll_state(crtc_state, encoder, clock,
2862 &pll_state);
2863 break;
2864 case PORT_C:
2865 case PORT_D:
2866 case PORT_E:
2867 case PORT_F:
2868 if (0 /* TODO: TBT PLLs */) {
2869 min = DPLL_ID_ICL_TBTPLL;
2870 max = min;
2871 ret = icl_calc_dpll_state(crtc_state, encoder, clock,
2872 &pll_state);
2873 } else {
2874 min = icl_port_to_mg_pll_id(port);
2875 max = min;
2876 ret = icl_calc_mg_pll_state(crtc_state, encoder, clock,
2877 &pll_state);
2878 }
2879 break;
2880 default:
2881 MISSING_CASE(port);
2882 return NULL;
2883 }
2884
2885 if (!ret) {
2886 DRM_DEBUG_KMS("Could not calculate PLL state.\n");
2887 return NULL;
2888 }
2889
2890 crtc_state->dpll_hw_state = pll_state;
2891
2892 pll = intel_find_shared_dpll(crtc, crtc_state, min, max);
2893 if (!pll) {
2894 DRM_DEBUG_KMS("No PLL selected\n");
2895 return NULL;
2896 }
2897
2898 intel_reference_shared_dpll(pll, crtc_state);
2899
2900 return pll;
2901 }
2902
icl_pll_id_to_enable_reg(enum intel_dpll_id id)2903 static i915_reg_t icl_pll_id_to_enable_reg(enum intel_dpll_id id)
2904 {
2905 switch (id) {
2906 default:
2907 MISSING_CASE(id);
2908 /* fall through */
2909 case DPLL_ID_ICL_DPLL0:
2910 case DPLL_ID_ICL_DPLL1:
2911 return CNL_DPLL_ENABLE(id);
2912 case DPLL_ID_ICL_TBTPLL:
2913 return TBT_PLL_ENABLE;
2914 case DPLL_ID_ICL_MGPLL1:
2915 case DPLL_ID_ICL_MGPLL2:
2916 case DPLL_ID_ICL_MGPLL3:
2917 case DPLL_ID_ICL_MGPLL4:
2918 return MG_PLL_ENABLE(icl_mg_pll_id_to_port(id));
2919 }
2920 }
2921
icl_pll_get_hw_state(struct drm_i915_private * dev_priv,struct intel_shared_dpll * pll,struct intel_dpll_hw_state * hw_state)2922 static bool icl_pll_get_hw_state(struct drm_i915_private *dev_priv,
2923 struct intel_shared_dpll *pll,
2924 struct intel_dpll_hw_state *hw_state)
2925 {
2926 const enum intel_dpll_id id = pll->info->id;
2927 uint32_t val;
2928 enum port port;
2929 bool ret = false;
2930
2931 if (!intel_display_power_get_if_enabled(dev_priv, POWER_DOMAIN_PLLS))
2932 return false;
2933
2934 val = I915_READ(icl_pll_id_to_enable_reg(id));
2935 if (!(val & PLL_ENABLE))
2936 goto out;
2937
2938 switch (id) {
2939 case DPLL_ID_ICL_DPLL0:
2940 case DPLL_ID_ICL_DPLL1:
2941 case DPLL_ID_ICL_TBTPLL:
2942 hw_state->cfgcr0 = I915_READ(ICL_DPLL_CFGCR0(id));
2943 hw_state->cfgcr1 = I915_READ(ICL_DPLL_CFGCR1(id));
2944 break;
2945 case DPLL_ID_ICL_MGPLL1:
2946 case DPLL_ID_ICL_MGPLL2:
2947 case DPLL_ID_ICL_MGPLL3:
2948 case DPLL_ID_ICL_MGPLL4:
2949 port = icl_mg_pll_id_to_port(id);
2950 hw_state->mg_refclkin_ctl = I915_READ(MG_REFCLKIN_CTL(port));
2951 hw_state->mg_refclkin_ctl &= MG_REFCLKIN_CTL_OD_2_MUX_MASK;
2952
2953 hw_state->mg_clktop2_coreclkctl1 =
2954 I915_READ(MG_CLKTOP2_CORECLKCTL1(port));
2955 hw_state->mg_clktop2_coreclkctl1 &=
2956 MG_CLKTOP2_CORECLKCTL1_A_DIVRATIO_MASK;
2957
2958 hw_state->mg_clktop2_hsclkctl =
2959 I915_READ(MG_CLKTOP2_HSCLKCTL(port));
2960 hw_state->mg_clktop2_hsclkctl &=
2961 MG_CLKTOP2_HSCLKCTL_TLINEDRV_CLKSEL_MASK |
2962 MG_CLKTOP2_HSCLKCTL_CORE_INPUTSEL_MASK |
2963 MG_CLKTOP2_HSCLKCTL_HSDIV_RATIO_MASK |
2964 MG_CLKTOP2_HSCLKCTL_DSDIV_RATIO_MASK;
2965
2966 hw_state->mg_pll_div0 = I915_READ(MG_PLL_DIV0(port));
2967 hw_state->mg_pll_div1 = I915_READ(MG_PLL_DIV1(port));
2968 hw_state->mg_pll_lf = I915_READ(MG_PLL_LF(port));
2969 hw_state->mg_pll_frac_lock = I915_READ(MG_PLL_FRAC_LOCK(port));
2970 hw_state->mg_pll_ssc = I915_READ(MG_PLL_SSC(port));
2971
2972 hw_state->mg_pll_bias = I915_READ(MG_PLL_BIAS(port));
2973 hw_state->mg_pll_tdc_coldst_bias =
2974 I915_READ(MG_PLL_TDC_COLDST_BIAS(port));
2975
2976 if (dev_priv->cdclk.hw.ref == 38400) {
2977 hw_state->mg_pll_tdc_coldst_bias_mask = MG_PLL_TDC_COLDST_COLDSTART;
2978 hw_state->mg_pll_bias_mask = 0;
2979 } else {
2980 hw_state->mg_pll_tdc_coldst_bias_mask = -1U;
2981 hw_state->mg_pll_bias_mask = -1U;
2982 }
2983
2984 hw_state->mg_pll_tdc_coldst_bias &= hw_state->mg_pll_tdc_coldst_bias_mask;
2985 hw_state->mg_pll_bias &= hw_state->mg_pll_bias_mask;
2986 break;
2987 default:
2988 MISSING_CASE(id);
2989 }
2990
2991 ret = true;
2992 out:
2993 intel_display_power_put(dev_priv, POWER_DOMAIN_PLLS);
2994 return ret;
2995 }
2996
icl_dpll_write(struct drm_i915_private * dev_priv,struct intel_shared_dpll * pll)2997 static void icl_dpll_write(struct drm_i915_private *dev_priv,
2998 struct intel_shared_dpll *pll)
2999 {
3000 struct intel_dpll_hw_state *hw_state = &pll->state.hw_state;
3001 const enum intel_dpll_id id = pll->info->id;
3002
3003 I915_WRITE(ICL_DPLL_CFGCR0(id), hw_state->cfgcr0);
3004 I915_WRITE(ICL_DPLL_CFGCR1(id), hw_state->cfgcr1);
3005 POSTING_READ(ICL_DPLL_CFGCR1(id));
3006 }
3007
icl_mg_pll_write(struct drm_i915_private * dev_priv,struct intel_shared_dpll * pll)3008 static void icl_mg_pll_write(struct drm_i915_private *dev_priv,
3009 struct intel_shared_dpll *pll)
3010 {
3011 struct intel_dpll_hw_state *hw_state = &pll->state.hw_state;
3012 enum port port = icl_mg_pll_id_to_port(pll->info->id);
3013 u32 val;
3014
3015 /*
3016 * Some of the following registers have reserved fields, so program
3017 * these with RMW based on a mask. The mask can be fixed or generated
3018 * during the calc/readout phase if the mask depends on some other HW
3019 * state like refclk, see icl_calc_mg_pll_state().
3020 */
3021 val = I915_READ(MG_REFCLKIN_CTL(port));
3022 val &= ~MG_REFCLKIN_CTL_OD_2_MUX_MASK;
3023 val |= hw_state->mg_refclkin_ctl;
3024 I915_WRITE(MG_REFCLKIN_CTL(port), val);
3025
3026 val = I915_READ(MG_CLKTOP2_CORECLKCTL1(port));
3027 val &= ~MG_CLKTOP2_CORECLKCTL1_A_DIVRATIO_MASK;
3028 val |= hw_state->mg_clktop2_coreclkctl1;
3029 I915_WRITE(MG_CLKTOP2_CORECLKCTL1(port), val);
3030
3031 val = I915_READ(MG_CLKTOP2_HSCLKCTL(port));
3032 val &= ~(MG_CLKTOP2_HSCLKCTL_TLINEDRV_CLKSEL_MASK |
3033 MG_CLKTOP2_HSCLKCTL_CORE_INPUTSEL_MASK |
3034 MG_CLKTOP2_HSCLKCTL_HSDIV_RATIO_MASK |
3035 MG_CLKTOP2_HSCLKCTL_DSDIV_RATIO_MASK);
3036 val |= hw_state->mg_clktop2_hsclkctl;
3037 I915_WRITE(MG_CLKTOP2_HSCLKCTL(port), val);
3038
3039 I915_WRITE(MG_PLL_DIV0(port), hw_state->mg_pll_div0);
3040 I915_WRITE(MG_PLL_DIV1(port), hw_state->mg_pll_div1);
3041 I915_WRITE(MG_PLL_LF(port), hw_state->mg_pll_lf);
3042 I915_WRITE(MG_PLL_FRAC_LOCK(port), hw_state->mg_pll_frac_lock);
3043 I915_WRITE(MG_PLL_SSC(port), hw_state->mg_pll_ssc);
3044
3045 val = I915_READ(MG_PLL_BIAS(port));
3046 val &= ~hw_state->mg_pll_bias_mask;
3047 val |= hw_state->mg_pll_bias;
3048 I915_WRITE(MG_PLL_BIAS(port), val);
3049
3050 val = I915_READ(MG_PLL_TDC_COLDST_BIAS(port));
3051 val &= ~hw_state->mg_pll_tdc_coldst_bias_mask;
3052 val |= hw_state->mg_pll_tdc_coldst_bias;
3053 I915_WRITE(MG_PLL_TDC_COLDST_BIAS(port), val);
3054
3055 POSTING_READ(MG_PLL_TDC_COLDST_BIAS(port));
3056 }
3057
icl_pll_enable(struct drm_i915_private * dev_priv,struct intel_shared_dpll * pll)3058 static void icl_pll_enable(struct drm_i915_private *dev_priv,
3059 struct intel_shared_dpll *pll)
3060 {
3061 const enum intel_dpll_id id = pll->info->id;
3062 i915_reg_t enable_reg = icl_pll_id_to_enable_reg(id);
3063 uint32_t val;
3064
3065 val = I915_READ(enable_reg);
3066 val |= PLL_POWER_ENABLE;
3067 I915_WRITE(enable_reg, val);
3068
3069 /*
3070 * The spec says we need to "wait" but it also says it should be
3071 * immediate.
3072 */
3073 if (intel_wait_for_register(dev_priv, enable_reg, PLL_POWER_STATE,
3074 PLL_POWER_STATE, 1))
3075 DRM_ERROR("PLL %d Power not enabled\n", id);
3076
3077 switch (id) {
3078 case DPLL_ID_ICL_DPLL0:
3079 case DPLL_ID_ICL_DPLL1:
3080 case DPLL_ID_ICL_TBTPLL:
3081 icl_dpll_write(dev_priv, pll);
3082 break;
3083 case DPLL_ID_ICL_MGPLL1:
3084 case DPLL_ID_ICL_MGPLL2:
3085 case DPLL_ID_ICL_MGPLL3:
3086 case DPLL_ID_ICL_MGPLL4:
3087 icl_mg_pll_write(dev_priv, pll);
3088 break;
3089 default:
3090 MISSING_CASE(id);
3091 }
3092
3093 /*
3094 * DVFS pre sequence would be here, but in our driver the cdclk code
3095 * paths should already be setting the appropriate voltage, hence we do
3096 * nothign here.
3097 */
3098
3099 val = I915_READ(enable_reg);
3100 val |= PLL_ENABLE;
3101 I915_WRITE(enable_reg, val);
3102
3103 if (intel_wait_for_register(dev_priv, enable_reg, PLL_LOCK, PLL_LOCK,
3104 1)) /* 600us actually. */
3105 DRM_ERROR("PLL %d not locked\n", id);
3106
3107 /* DVFS post sequence would be here. See the comment above. */
3108 }
3109
icl_pll_disable(struct drm_i915_private * dev_priv,struct intel_shared_dpll * pll)3110 static void icl_pll_disable(struct drm_i915_private *dev_priv,
3111 struct intel_shared_dpll *pll)
3112 {
3113 const enum intel_dpll_id id = pll->info->id;
3114 i915_reg_t enable_reg = icl_pll_id_to_enable_reg(id);
3115 uint32_t val;
3116
3117 /* The first steps are done by intel_ddi_post_disable(). */
3118
3119 /*
3120 * DVFS pre sequence would be here, but in our driver the cdclk code
3121 * paths should already be setting the appropriate voltage, hence we do
3122 * nothign here.
3123 */
3124
3125 val = I915_READ(enable_reg);
3126 val &= ~PLL_ENABLE;
3127 I915_WRITE(enable_reg, val);
3128
3129 /* Timeout is actually 1us. */
3130 if (intel_wait_for_register(dev_priv, enable_reg, PLL_LOCK, 0, 1))
3131 DRM_ERROR("PLL %d locked\n", id);
3132
3133 /* DVFS post sequence would be here. See the comment above. */
3134
3135 val = I915_READ(enable_reg);
3136 val &= ~PLL_POWER_ENABLE;
3137 I915_WRITE(enable_reg, val);
3138
3139 /*
3140 * The spec says we need to "wait" but it also says it should be
3141 * immediate.
3142 */
3143 if (intel_wait_for_register(dev_priv, enable_reg, PLL_POWER_STATE, 0,
3144 1))
3145 DRM_ERROR("PLL %d Power not disabled\n", id);
3146 }
3147
icl_dump_hw_state(struct drm_i915_private * dev_priv,struct intel_dpll_hw_state * hw_state)3148 static void icl_dump_hw_state(struct drm_i915_private *dev_priv,
3149 struct intel_dpll_hw_state *hw_state)
3150 {
3151 DRM_DEBUG_KMS("dpll_hw_state: cfgcr0: 0x%x, cfgcr1: 0x%x, "
3152 "mg_refclkin_ctl: 0x%x, hg_clktop2_coreclkctl1: 0x%x, "
3153 "mg_clktop2_hsclkctl: 0x%x, mg_pll_div0: 0x%x, "
3154 "mg_pll_div2: 0x%x, mg_pll_lf: 0x%x, "
3155 "mg_pll_frac_lock: 0x%x, mg_pll_ssc: 0x%x, "
3156 "mg_pll_bias: 0x%x, mg_pll_tdc_coldst_bias: 0x%x\n",
3157 hw_state->cfgcr0, hw_state->cfgcr1,
3158 hw_state->mg_refclkin_ctl,
3159 hw_state->mg_clktop2_coreclkctl1,
3160 hw_state->mg_clktop2_hsclkctl,
3161 hw_state->mg_pll_div0,
3162 hw_state->mg_pll_div1,
3163 hw_state->mg_pll_lf,
3164 hw_state->mg_pll_frac_lock,
3165 hw_state->mg_pll_ssc,
3166 hw_state->mg_pll_bias,
3167 hw_state->mg_pll_tdc_coldst_bias);
3168 }
3169
3170 static const struct intel_shared_dpll_funcs icl_pll_funcs = {
3171 .enable = icl_pll_enable,
3172 .disable = icl_pll_disable,
3173 .get_hw_state = icl_pll_get_hw_state,
3174 };
3175
3176 static const struct dpll_info icl_plls[] = {
3177 { "DPLL 0", &icl_pll_funcs, DPLL_ID_ICL_DPLL0, 0 },
3178 { "DPLL 1", &icl_pll_funcs, DPLL_ID_ICL_DPLL1, 0 },
3179 { "TBT PLL", &icl_pll_funcs, DPLL_ID_ICL_TBTPLL, 0 },
3180 { "MG PLL 1", &icl_pll_funcs, DPLL_ID_ICL_MGPLL1, 0 },
3181 { "MG PLL 2", &icl_pll_funcs, DPLL_ID_ICL_MGPLL2, 0 },
3182 { "MG PLL 3", &icl_pll_funcs, DPLL_ID_ICL_MGPLL3, 0 },
3183 { "MG PLL 4", &icl_pll_funcs, DPLL_ID_ICL_MGPLL4, 0 },
3184 { },
3185 };
3186
3187 static const struct intel_dpll_mgr icl_pll_mgr = {
3188 .dpll_info = icl_plls,
3189 .get_dpll = icl_get_dpll,
3190 .dump_hw_state = icl_dump_hw_state,
3191 };
3192
3193 /**
3194 * intel_shared_dpll_init - Initialize shared DPLLs
3195 * @dev: drm device
3196 *
3197 * Initialize shared DPLLs for @dev.
3198 */
intel_shared_dpll_init(struct drm_device * dev)3199 void intel_shared_dpll_init(struct drm_device *dev)
3200 {
3201 struct drm_i915_private *dev_priv = to_i915(dev);
3202 const struct intel_dpll_mgr *dpll_mgr = NULL;
3203 const struct dpll_info *dpll_info;
3204 int i;
3205
3206 if (IS_ICELAKE(dev_priv))
3207 dpll_mgr = &icl_pll_mgr;
3208 else if (IS_CANNONLAKE(dev_priv))
3209 dpll_mgr = &cnl_pll_mgr;
3210 else if (IS_GEN9_BC(dev_priv))
3211 dpll_mgr = &skl_pll_mgr;
3212 else if (IS_GEN9_LP(dev_priv))
3213 dpll_mgr = &bxt_pll_mgr;
3214 else if (HAS_DDI(dev_priv))
3215 dpll_mgr = &hsw_pll_mgr;
3216 else if (HAS_PCH_IBX(dev_priv) || HAS_PCH_CPT(dev_priv))
3217 dpll_mgr = &pch_pll_mgr;
3218
3219 if (!dpll_mgr) {
3220 dev_priv->num_shared_dpll = 0;
3221 return;
3222 }
3223
3224 dpll_info = dpll_mgr->dpll_info;
3225
3226 for (i = 0; dpll_info[i].name; i++) {
3227 WARN_ON(i != dpll_info[i].id);
3228 dev_priv->shared_dplls[i].info = &dpll_info[i];
3229 }
3230
3231 dev_priv->dpll_mgr = dpll_mgr;
3232 dev_priv->num_shared_dpll = i;
3233 mutex_init(&dev_priv->dpll_lock);
3234
3235 BUG_ON(dev_priv->num_shared_dpll > I915_NUM_PLLS);
3236
3237 /* FIXME: Move this to a more suitable place */
3238 if (HAS_DDI(dev_priv))
3239 intel_ddi_pll_init(dev);
3240 }
3241
3242 /**
3243 * intel_get_shared_dpll - get a shared DPLL for CRTC and encoder combination
3244 * @crtc: CRTC
3245 * @crtc_state: atomic state for @crtc
3246 * @encoder: encoder
3247 *
3248 * Find an appropriate DPLL for the given CRTC and encoder combination. A
3249 * reference from the @crtc to the returned pll is registered in the atomic
3250 * state. That configuration is made effective by calling
3251 * intel_shared_dpll_swap_state(). The reference should be released by calling
3252 * intel_release_shared_dpll().
3253 *
3254 * Returns:
3255 * A shared DPLL to be used by @crtc and @encoder with the given @crtc_state.
3256 */
3257 struct intel_shared_dpll *
intel_get_shared_dpll(struct intel_crtc * crtc,struct intel_crtc_state * crtc_state,struct intel_encoder * encoder)3258 intel_get_shared_dpll(struct intel_crtc *crtc,
3259 struct intel_crtc_state *crtc_state,
3260 struct intel_encoder *encoder)
3261 {
3262 struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
3263 const struct intel_dpll_mgr *dpll_mgr = dev_priv->dpll_mgr;
3264
3265 if (WARN_ON(!dpll_mgr))
3266 return NULL;
3267
3268 return dpll_mgr->get_dpll(crtc, crtc_state, encoder);
3269 }
3270
3271 /**
3272 * intel_release_shared_dpll - end use of DPLL by CRTC in atomic state
3273 * @dpll: dpll in use by @crtc
3274 * @crtc: crtc
3275 * @state: atomic state
3276 *
3277 * This function releases the reference from @crtc to @dpll from the
3278 * atomic @state. The new configuration is made effective by calling
3279 * intel_shared_dpll_swap_state().
3280 */
intel_release_shared_dpll(struct intel_shared_dpll * dpll,struct intel_crtc * crtc,struct drm_atomic_state * state)3281 void intel_release_shared_dpll(struct intel_shared_dpll *dpll,
3282 struct intel_crtc *crtc,
3283 struct drm_atomic_state *state)
3284 {
3285 struct intel_shared_dpll_state *shared_dpll_state;
3286
3287 shared_dpll_state = intel_atomic_get_shared_dpll_state(state);
3288 shared_dpll_state[dpll->info->id].crtc_mask &= ~(1 << crtc->pipe);
3289 }
3290
3291 /**
3292 * intel_shared_dpll_dump_hw_state - write hw_state to dmesg
3293 * @dev_priv: i915 drm device
3294 * @hw_state: hw state to be written to the log
3295 *
3296 * Write the relevant values in @hw_state to dmesg using DRM_DEBUG_KMS.
3297 */
intel_dpll_dump_hw_state(struct drm_i915_private * dev_priv,struct intel_dpll_hw_state * hw_state)3298 void intel_dpll_dump_hw_state(struct drm_i915_private *dev_priv,
3299 struct intel_dpll_hw_state *hw_state)
3300 {
3301 if (dev_priv->dpll_mgr) {
3302 dev_priv->dpll_mgr->dump_hw_state(dev_priv, hw_state);
3303 } else {
3304 /* fallback for platforms that don't use the shared dpll
3305 * infrastructure
3306 */
3307 DRM_DEBUG_KMS("dpll_hw_state: dpll: 0x%x, dpll_md: 0x%x, "
3308 "fp0: 0x%x, fp1: 0x%x\n",
3309 hw_state->dpll,
3310 hw_state->dpll_md,
3311 hw_state->fp0,
3312 hw_state->fp1);
3313 }
3314 }
3315