drm/i915: Move shared dpll function prototypes to intel_dpll_mgr.h
[deliverable/linux.git] / drivers / gpu / drm / i915 / intel_dpll_mgr.c
CommitLineData
7abd4b35
ACO
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
26struct intel_shared_dpll *
8106ddbd
ACO
27intel_get_shared_dpll_by_id(struct drm_i915_private *dev_priv,
28 enum intel_dpll_id id)
7abd4b35 29{
8106ddbd
ACO
30 return &dev_priv->shared_dplls[id];
31}
7abd4b35 32
8106ddbd
ACO
33enum intel_dpll_id
34intel_get_shared_dpll_id(struct drm_i915_private *dev_priv,
35 struct intel_shared_dpll *pll)
36{
37 if (WARN_ON(pll < dev_priv->shared_dplls||
38 pll > &dev_priv->shared_dplls[dev_priv->num_shared_dpll]))
39 return -1;
40
41 return (enum intel_dpll_id) (pll - dev_priv->shared_dplls);
42}
43
44void
45intel_shared_dpll_config_get(struct intel_shared_dpll_config *config,
46 struct intel_shared_dpll *pll,
47 struct intel_crtc *crtc)
48{
49 struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
50 enum intel_dpll_id id = intel_get_shared_dpll_id(dev_priv, pll);
51
52 config[id].crtc_mask |= 1 << crtc->pipe;
53}
54
55void
56intel_shared_dpll_config_put(struct intel_shared_dpll_config *config,
57 struct intel_shared_dpll *pll,
58 struct intel_crtc *crtc)
59{
60 struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
61 enum intel_dpll_id id = intel_get_shared_dpll_id(dev_priv, pll);
7abd4b35 62
8106ddbd 63 config[id].crtc_mask &= ~(1 << crtc->pipe);
7abd4b35
ACO
64}
65
66/* For ILK+ */
67void assert_shared_dpll(struct drm_i915_private *dev_priv,
68 struct intel_shared_dpll *pll,
69 bool state)
70{
71 bool cur_state;
72 struct intel_dpll_hw_state hw_state;
73
74 if (WARN(!pll, "asserting DPLL %s with no DPLL\n", onoff(state)))
75 return;
76
77 cur_state = pll->get_hw_state(dev_priv, pll, &hw_state);
78 I915_STATE_WARN(cur_state != state,
79 "%s assertion failure (expected %s, current %s)\n",
80 pll->name, onoff(state), onoff(cur_state));
81}
82
83void intel_prepare_shared_dpll(struct intel_crtc *crtc)
84{
85 struct drm_device *dev = crtc->base.dev;
86 struct drm_i915_private *dev_priv = dev->dev_private;
8106ddbd 87 struct intel_shared_dpll *pll = crtc->config->shared_dpll;
7abd4b35
ACO
88
89 if (WARN_ON(pll == NULL))
90 return;
91
92 WARN_ON(!pll->config.crtc_mask);
93 if (pll->active == 0) {
94 DRM_DEBUG_DRIVER("setting up %s\n", pll->name);
95 WARN_ON(pll->on);
96 assert_shared_dpll_disabled(dev_priv, pll);
97
98 pll->mode_set(dev_priv, pll);
99 }
100}
101
102/**
103 * intel_enable_shared_dpll - enable PCH PLL
104 * @dev_priv: i915 private structure
105 * @pipe: pipe PLL to enable
106 *
107 * The PCH PLL needs to be enabled before the PCH transcoder, since it
108 * drives the transcoder clock.
109 */
110void intel_enable_shared_dpll(struct intel_crtc *crtc)
111{
112 struct drm_device *dev = crtc->base.dev;
113 struct drm_i915_private *dev_priv = dev->dev_private;
8106ddbd 114 struct intel_shared_dpll *pll = crtc->config->shared_dpll;
7abd4b35
ACO
115
116 if (WARN_ON(pll == NULL))
117 return;
118
119 if (WARN_ON(pll->config.crtc_mask == 0))
120 return;
121
122 DRM_DEBUG_KMS("enable %s (active %d, on? %d) for crtc %d\n",
123 pll->name, pll->active, pll->on,
124 crtc->base.base.id);
125
126 if (pll->active++) {
127 WARN_ON(!pll->on);
128 assert_shared_dpll_enabled(dev_priv, pll);
129 return;
130 }
131 WARN_ON(pll->on);
132
133 intel_display_power_get(dev_priv, POWER_DOMAIN_PLLS);
134
135 DRM_DEBUG_KMS("enabling %s\n", pll->name);
136 pll->enable(dev_priv, pll);
137 pll->on = true;
138}
139
140void intel_disable_shared_dpll(struct intel_crtc *crtc)
141{
142 struct drm_device *dev = crtc->base.dev;
143 struct drm_i915_private *dev_priv = dev->dev_private;
8106ddbd 144 struct intel_shared_dpll *pll = crtc->config->shared_dpll;
7abd4b35
ACO
145
146 /* PCH only available on ILK+ */
147 if (INTEL_INFO(dev)->gen < 5)
148 return;
149
150 if (pll == NULL)
151 return;
152
153 if (WARN_ON(!(pll->config.crtc_mask & (1 << drm_crtc_index(&crtc->base)))))
154 return;
155
156 DRM_DEBUG_KMS("disable %s (active %d, on? %d) for crtc %d\n",
157 pll->name, pll->active, pll->on,
158 crtc->base.base.id);
159
160 if (WARN_ON(pll->active == 0)) {
161 assert_shared_dpll_disabled(dev_priv, pll);
162 return;
163 }
164
165 assert_shared_dpll_enabled(dev_priv, pll);
166 WARN_ON(!pll->on);
167 if (--pll->active)
168 return;
169
170 DRM_DEBUG_KMS("disabling %s\n", pll->name);
171 pll->disable(dev_priv, pll);
172 pll->on = false;
173
174 intel_display_power_put(dev_priv, POWER_DOMAIN_PLLS);
175}
176
a4780b77
ACO
177static enum intel_dpll_id
178ibx_get_fixed_dpll(struct intel_crtc *crtc,
179 struct intel_crtc_state *crtc_state)
7abd4b35 180{
a4780b77 181 struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
7abd4b35 182 struct intel_shared_dpll *pll;
7abd4b35 183 enum intel_dpll_id i;
7abd4b35 184
a4780b77
ACO
185 /* Ironlake PCH has a fixed PLL->PCH pipe mapping. */
186 i = (enum intel_dpll_id) crtc->pipe;
187 pll = &dev_priv->shared_dplls[i];
7abd4b35 188
a4780b77
ACO
189 DRM_DEBUG_KMS("CRTC:%d using pre-allocated %s\n",
190 crtc->base.base.id, pll->name);
7abd4b35 191
a4780b77
ACO
192 return i;
193}
7abd4b35 194
a4780b77
ACO
195static enum intel_dpll_id
196bxt_get_fixed_dpll(struct intel_crtc *crtc,
197 struct intel_crtc_state *crtc_state)
198{
199 struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
200 struct intel_encoder *encoder;
201 struct intel_digital_port *intel_dig_port;
202 struct intel_shared_dpll *pll;
203 enum intel_dpll_id i;
7abd4b35 204
a4780b77
ACO
205 /* PLL is attached to port in bxt */
206 encoder = intel_ddi_get_crtc_new_encoder(crtc_state);
207 if (WARN_ON(!encoder))
208 return DPLL_ID_PRIVATE;
7abd4b35 209
a4780b77
ACO
210 intel_dig_port = enc_to_dig_port(&encoder->base);
211 /* 1:1 mapping between ports and PLLs */
212 i = (enum intel_dpll_id)intel_dig_port->port;
213 pll = &dev_priv->shared_dplls[i];
214 DRM_DEBUG_KMS("CRTC:%d using pre-allocated %s\n",
215 crtc->base.base.id, pll->name);
7abd4b35 216
a4780b77
ACO
217 return i;
218}
7abd4b35 219
a4780b77
ACO
220static enum intel_dpll_id
221intel_find_shared_dpll(struct intel_crtc *crtc,
222 struct intel_crtc_state *crtc_state)
223{
224 struct drm_i915_private *dev_priv = crtc->base.dev->dev_private;
225 struct intel_shared_dpll *pll;
226 struct intel_shared_dpll_config *shared_dpll;
227 enum intel_dpll_id i;
228 int max = dev_priv->num_shared_dpll;
7abd4b35 229
a4780b77 230 if (INTEL_INFO(dev_priv)->gen < 9 && HAS_DDI(dev_priv))
7abd4b35
ACO
231 /* Do not consider SPLL */
232 max = 2;
233
a4780b77
ACO
234 shared_dpll = intel_atomic_get_shared_dpll_state(crtc_state->base.state);
235
7abd4b35
ACO
236 for (i = 0; i < max; i++) {
237 pll = &dev_priv->shared_dplls[i];
238
239 /* Only want to check enabled timings first */
240 if (shared_dpll[i].crtc_mask == 0)
241 continue;
242
243 if (memcmp(&crtc_state->dpll_hw_state,
244 &shared_dpll[i].hw_state,
245 sizeof(crtc_state->dpll_hw_state)) == 0) {
246 DRM_DEBUG_KMS("CRTC:%d sharing existing %s (crtc mask 0x%08x, ative %d)\n",
247 crtc->base.base.id, pll->name,
248 shared_dpll[i].crtc_mask,
249 pll->active);
a4780b77 250 return i;
7abd4b35
ACO
251 }
252 }
253
254 /* Ok no matching timings, maybe there's a free one? */
255 for (i = 0; i < dev_priv->num_shared_dpll; i++) {
256 pll = &dev_priv->shared_dplls[i];
257 if (shared_dpll[i].crtc_mask == 0) {
258 DRM_DEBUG_KMS("CRTC:%d allocated %s\n",
259 crtc->base.base.id, pll->name);
a4780b77 260 return i;
7abd4b35
ACO
261 }
262 }
263
a4780b77
ACO
264 return DPLL_ID_PRIVATE;
265}
266
267struct intel_shared_dpll *
268intel_get_shared_dpll(struct intel_crtc *crtc,
269 struct intel_crtc_state *crtc_state)
270{
271 struct drm_i915_private *dev_priv = crtc->base.dev->dev_private;
272 struct intel_shared_dpll *pll;
273 struct intel_shared_dpll_config *shared_dpll;
274 enum intel_dpll_id i;
275
276 shared_dpll = intel_atomic_get_shared_dpll_state(crtc_state->base.state);
277
278 if (HAS_PCH_IBX(dev_priv->dev)) {
279 i = ibx_get_fixed_dpll(crtc, crtc_state);
280 WARN_ON(shared_dpll[i].crtc_mask);
281 } else if (IS_BROXTON(dev_priv->dev)) {
282 i = bxt_get_fixed_dpll(crtc, crtc_state);
283 WARN_ON(shared_dpll[i].crtc_mask);
284 } else {
285 i = intel_find_shared_dpll(crtc, crtc_state);
286 }
287
288 if (i < 0)
289 return NULL;
290
291 pll = &dev_priv->shared_dplls[i];
7abd4b35 292
7abd4b35
ACO
293 if (shared_dpll[i].crtc_mask == 0)
294 shared_dpll[i].hw_state =
295 crtc_state->dpll_hw_state;
296
8106ddbd 297 crtc_state->shared_dpll = pll;
7abd4b35
ACO
298 DRM_DEBUG_DRIVER("using %s for pipe %c\n", pll->name,
299 pipe_name(crtc->pipe));
300
8106ddbd 301 intel_shared_dpll_config_get(shared_dpll, pll, crtc);
7abd4b35
ACO
302
303 return pll;
304}
305
306void intel_shared_dpll_commit(struct drm_atomic_state *state)
307{
308 struct drm_i915_private *dev_priv = to_i915(state->dev);
309 struct intel_shared_dpll_config *shared_dpll;
310 struct intel_shared_dpll *pll;
311 enum intel_dpll_id i;
312
313 if (!to_intel_atomic_state(state)->dpll_set)
314 return;
315
316 shared_dpll = to_intel_atomic_state(state)->shared_dpll;
317 for (i = 0; i < dev_priv->num_shared_dpll; i++) {
318 pll = &dev_priv->shared_dplls[i];
319 pll->config = shared_dpll[i];
320 }
321}
322
323static bool ibx_pch_dpll_get_hw_state(struct drm_i915_private *dev_priv,
324 struct intel_shared_dpll *pll,
325 struct intel_dpll_hw_state *hw_state)
326{
327 uint32_t val;
328
329 if (!intel_display_power_get_if_enabled(dev_priv, POWER_DOMAIN_PLLS))
330 return false;
331
332 val = I915_READ(PCH_DPLL(pll->id));
333 hw_state->dpll = val;
334 hw_state->fp0 = I915_READ(PCH_FP0(pll->id));
335 hw_state->fp1 = I915_READ(PCH_FP1(pll->id));
336
337 intel_display_power_put(dev_priv, POWER_DOMAIN_PLLS);
338
339 return val & DPLL_VCO_ENABLE;
340}
341
342static void ibx_pch_dpll_mode_set(struct drm_i915_private *dev_priv,
343 struct intel_shared_dpll *pll)
344{
345 I915_WRITE(PCH_FP0(pll->id), pll->config.hw_state.fp0);
346 I915_WRITE(PCH_FP1(pll->id), pll->config.hw_state.fp1);
347}
348
349static void ibx_assert_pch_refclk_enabled(struct drm_i915_private *dev_priv)
350{
351 u32 val;
352 bool enabled;
353
354 I915_STATE_WARN_ON(!(HAS_PCH_IBX(dev_priv->dev) || HAS_PCH_CPT(dev_priv->dev)));
355
356 val = I915_READ(PCH_DREF_CONTROL);
357 enabled = !!(val & (DREF_SSC_SOURCE_MASK | DREF_NONSPREAD_SOURCE_MASK |
358 DREF_SUPERSPREAD_SOURCE_MASK));
359 I915_STATE_WARN(!enabled, "PCH refclk assertion failure, should be active but is disabled\n");
360}
361
362static void ibx_pch_dpll_enable(struct drm_i915_private *dev_priv,
363 struct intel_shared_dpll *pll)
364{
365 /* PCH refclock must be enabled first */
366 ibx_assert_pch_refclk_enabled(dev_priv);
367
368 I915_WRITE(PCH_DPLL(pll->id), pll->config.hw_state.dpll);
369
370 /* Wait for the clocks to stabilize. */
371 POSTING_READ(PCH_DPLL(pll->id));
372 udelay(150);
373
374 /* The pixel multiplier can only be updated once the
375 * DPLL is enabled and the clocks are stable.
376 *
377 * So write it again.
378 */
379 I915_WRITE(PCH_DPLL(pll->id), pll->config.hw_state.dpll);
380 POSTING_READ(PCH_DPLL(pll->id));
381 udelay(200);
382}
383
384static void ibx_pch_dpll_disable(struct drm_i915_private *dev_priv,
385 struct intel_shared_dpll *pll)
386{
387 struct drm_device *dev = dev_priv->dev;
388 struct intel_crtc *crtc;
389
390 /* Make sure no transcoder isn't still depending on us. */
391 for_each_intel_crtc(dev, crtc) {
8106ddbd 392 if (crtc->config->shared_dpll == pll)
7abd4b35
ACO
393 assert_pch_transcoder_disabled(dev_priv, crtc->pipe);
394 }
395
396 I915_WRITE(PCH_DPLL(pll->id), 0);
397 POSTING_READ(PCH_DPLL(pll->id));
398 udelay(200);
399}
400
401static char *ibx_pch_dpll_names[] = {
402 "PCH DPLL A",
403 "PCH DPLL B",
404};
405
406static void ibx_pch_dpll_init(struct drm_device *dev)
407{
408 struct drm_i915_private *dev_priv = dev->dev_private;
409 int i;
410
411 dev_priv->num_shared_dpll = 2;
412
413 for (i = 0; i < dev_priv->num_shared_dpll; i++) {
414 dev_priv->shared_dplls[i].id = i;
415 dev_priv->shared_dplls[i].name = ibx_pch_dpll_names[i];
416 dev_priv->shared_dplls[i].mode_set = ibx_pch_dpll_mode_set;
417 dev_priv->shared_dplls[i].enable = ibx_pch_dpll_enable;
418 dev_priv->shared_dplls[i].disable = ibx_pch_dpll_disable;
419 dev_priv->shared_dplls[i].get_hw_state =
420 ibx_pch_dpll_get_hw_state;
421 }
422}
423
55be2f08
ACO
424static void hsw_ddi_wrpll_enable(struct drm_i915_private *dev_priv,
425 struct intel_shared_dpll *pll)
426{
427 I915_WRITE(WRPLL_CTL(pll->id), pll->config.hw_state.wrpll);
428 POSTING_READ(WRPLL_CTL(pll->id));
429 udelay(20);
430}
431
432static void hsw_ddi_spll_enable(struct drm_i915_private *dev_priv,
433 struct intel_shared_dpll *pll)
434{
435 I915_WRITE(SPLL_CTL, pll->config.hw_state.spll);
436 POSTING_READ(SPLL_CTL);
437 udelay(20);
438}
439
440static void hsw_ddi_wrpll_disable(struct drm_i915_private *dev_priv,
441 struct intel_shared_dpll *pll)
442{
443 uint32_t val;
444
445 val = I915_READ(WRPLL_CTL(pll->id));
446 I915_WRITE(WRPLL_CTL(pll->id), val & ~WRPLL_PLL_ENABLE);
447 POSTING_READ(WRPLL_CTL(pll->id));
448}
449
450static void hsw_ddi_spll_disable(struct drm_i915_private *dev_priv,
451 struct intel_shared_dpll *pll)
452{
453 uint32_t val;
454
455 val = I915_READ(SPLL_CTL);
456 I915_WRITE(SPLL_CTL, val & ~SPLL_PLL_ENABLE);
457 POSTING_READ(SPLL_CTL);
458}
459
460static bool hsw_ddi_wrpll_get_hw_state(struct drm_i915_private *dev_priv,
461 struct intel_shared_dpll *pll,
462 struct intel_dpll_hw_state *hw_state)
463{
464 uint32_t val;
465
466 if (!intel_display_power_get_if_enabled(dev_priv, POWER_DOMAIN_PLLS))
467 return false;
468
469 val = I915_READ(WRPLL_CTL(pll->id));
470 hw_state->wrpll = val;
471
472 intel_display_power_put(dev_priv, POWER_DOMAIN_PLLS);
473
474 return val & WRPLL_PLL_ENABLE;
475}
476
477static bool hsw_ddi_spll_get_hw_state(struct drm_i915_private *dev_priv,
478 struct intel_shared_dpll *pll,
479 struct intel_dpll_hw_state *hw_state)
480{
481 uint32_t val;
482
483 if (!intel_display_power_get_if_enabled(dev_priv, POWER_DOMAIN_PLLS))
484 return false;
485
486 val = I915_READ(SPLL_CTL);
487 hw_state->spll = val;
488
489 intel_display_power_put(dev_priv, POWER_DOMAIN_PLLS);
490
491 return val & SPLL_PLL_ENABLE;
492}
493
494
495static const char * const hsw_ddi_pll_names[] = {
496 "WRPLL 1",
497 "WRPLL 2",
498 "SPLL"
499};
500
501static void hsw_shared_dplls_init(struct drm_i915_private *dev_priv)
502{
503 int i;
504
505 dev_priv->num_shared_dpll = 3;
506
507 for (i = 0; i < 2; i++) {
508 dev_priv->shared_dplls[i].id = i;
509 dev_priv->shared_dplls[i].name = hsw_ddi_pll_names[i];
510 dev_priv->shared_dplls[i].disable = hsw_ddi_wrpll_disable;
511 dev_priv->shared_dplls[i].enable = hsw_ddi_wrpll_enable;
512 dev_priv->shared_dplls[i].get_hw_state =
513 hsw_ddi_wrpll_get_hw_state;
514 }
515
516 /* SPLL is special, but needs to be initialized anyway.. */
517 dev_priv->shared_dplls[i].id = i;
518 dev_priv->shared_dplls[i].name = hsw_ddi_pll_names[i];
519 dev_priv->shared_dplls[i].disable = hsw_ddi_spll_disable;
520 dev_priv->shared_dplls[i].enable = hsw_ddi_spll_enable;
521 dev_priv->shared_dplls[i].get_hw_state = hsw_ddi_spll_get_hw_state;
522
523}
524
525static const char * const skl_ddi_pll_names[] = {
526 "DPLL 1",
527 "DPLL 2",
528 "DPLL 3",
529};
530
531struct skl_dpll_regs {
532 i915_reg_t ctl, cfgcr1, cfgcr2;
533};
534
535/* this array is indexed by the *shared* pll id */
536static const struct skl_dpll_regs skl_dpll_regs[3] = {
537 {
538 /* DPLL 1 */
539 .ctl = LCPLL2_CTL,
540 .cfgcr1 = DPLL_CFGCR1(SKL_DPLL1),
541 .cfgcr2 = DPLL_CFGCR2(SKL_DPLL1),
542 },
543 {
544 /* DPLL 2 */
545 .ctl = WRPLL_CTL(0),
546 .cfgcr1 = DPLL_CFGCR1(SKL_DPLL2),
547 .cfgcr2 = DPLL_CFGCR2(SKL_DPLL2),
548 },
549 {
550 /* DPLL 3 */
551 .ctl = WRPLL_CTL(1),
552 .cfgcr1 = DPLL_CFGCR1(SKL_DPLL3),
553 .cfgcr2 = DPLL_CFGCR2(SKL_DPLL3),
554 },
555};
556
557static void skl_ddi_pll_enable(struct drm_i915_private *dev_priv,
558 struct intel_shared_dpll *pll)
559{
560 uint32_t val;
561 unsigned int dpll;
562 const struct skl_dpll_regs *regs = skl_dpll_regs;
563
564 /* DPLL0 is not part of the shared DPLLs, so pll->id is 0 for DPLL1 */
565 dpll = pll->id + 1;
566
567 val = I915_READ(DPLL_CTRL1);
568
569 val &= ~(DPLL_CTRL1_HDMI_MODE(dpll) | DPLL_CTRL1_SSC(dpll) |
570 DPLL_CTRL1_LINK_RATE_MASK(dpll));
571 val |= pll->config.hw_state.ctrl1 << (dpll * 6);
572
573 I915_WRITE(DPLL_CTRL1, val);
574 POSTING_READ(DPLL_CTRL1);
575
576 I915_WRITE(regs[pll->id].cfgcr1, pll->config.hw_state.cfgcr1);
577 I915_WRITE(regs[pll->id].cfgcr2, pll->config.hw_state.cfgcr2);
578 POSTING_READ(regs[pll->id].cfgcr1);
579 POSTING_READ(regs[pll->id].cfgcr2);
580
581 /* the enable bit is always bit 31 */
582 I915_WRITE(regs[pll->id].ctl,
583 I915_READ(regs[pll->id].ctl) | LCPLL_PLL_ENABLE);
584
585 if (wait_for(I915_READ(DPLL_STATUS) & DPLL_LOCK(dpll), 5))
586 DRM_ERROR("DPLL %d not locked\n", dpll);
587}
588
589static void skl_ddi_pll_disable(struct drm_i915_private *dev_priv,
590 struct intel_shared_dpll *pll)
591{
592 const struct skl_dpll_regs *regs = skl_dpll_regs;
593
594 /* the enable bit is always bit 31 */
595 I915_WRITE(regs[pll->id].ctl,
596 I915_READ(regs[pll->id].ctl) & ~LCPLL_PLL_ENABLE);
597 POSTING_READ(regs[pll->id].ctl);
598}
599
600static bool skl_ddi_pll_get_hw_state(struct drm_i915_private *dev_priv,
601 struct intel_shared_dpll *pll,
602 struct intel_dpll_hw_state *hw_state)
603{
604 uint32_t val;
605 unsigned int dpll;
606 const struct skl_dpll_regs *regs = skl_dpll_regs;
607 bool ret;
608
609 if (!intel_display_power_get_if_enabled(dev_priv, POWER_DOMAIN_PLLS))
610 return false;
611
612 ret = false;
613
614 /* DPLL0 is not part of the shared DPLLs, so pll->id is 0 for DPLL1 */
615 dpll = pll->id + 1;
616
617 val = I915_READ(regs[pll->id].ctl);
618 if (!(val & LCPLL_PLL_ENABLE))
619 goto out;
620
621 val = I915_READ(DPLL_CTRL1);
622 hw_state->ctrl1 = (val >> (dpll * 6)) & 0x3f;
623
624 /* avoid reading back stale values if HDMI mode is not enabled */
625 if (val & DPLL_CTRL1_HDMI_MODE(dpll)) {
626 hw_state->cfgcr1 = I915_READ(regs[pll->id].cfgcr1);
627 hw_state->cfgcr2 = I915_READ(regs[pll->id].cfgcr2);
628 }
629 ret = true;
630
631out:
632 intel_display_power_put(dev_priv, POWER_DOMAIN_PLLS);
633
634 return ret;
635}
636
637static void skl_shared_dplls_init(struct drm_i915_private *dev_priv)
638{
639 int i;
640
641 dev_priv->num_shared_dpll = 3;
642
643 for (i = 0; i < dev_priv->num_shared_dpll; i++) {
644 dev_priv->shared_dplls[i].id = i;
645 dev_priv->shared_dplls[i].name = skl_ddi_pll_names[i];
646 dev_priv->shared_dplls[i].disable = skl_ddi_pll_disable;
647 dev_priv->shared_dplls[i].enable = skl_ddi_pll_enable;
648 dev_priv->shared_dplls[i].get_hw_state =
649 skl_ddi_pll_get_hw_state;
650 }
651}
652
653static const char * const bxt_ddi_pll_names[] = {
654 "PORT PLL A",
655 "PORT PLL B",
656 "PORT PLL C",
657};
658
659static void bxt_ddi_pll_enable(struct drm_i915_private *dev_priv,
660 struct intel_shared_dpll *pll)
661{
662 uint32_t temp;
663 enum port port = (enum port)pll->id; /* 1:1 port->PLL mapping */
664
665 temp = I915_READ(BXT_PORT_PLL_ENABLE(port));
666 temp &= ~PORT_PLL_REF_SEL;
667 /* Non-SSC reference */
668 I915_WRITE(BXT_PORT_PLL_ENABLE(port), temp);
669
670 /* Disable 10 bit clock */
671 temp = I915_READ(BXT_PORT_PLL_EBB_4(port));
672 temp &= ~PORT_PLL_10BIT_CLK_ENABLE;
673 I915_WRITE(BXT_PORT_PLL_EBB_4(port), temp);
674
675 /* Write P1 & P2 */
676 temp = I915_READ(BXT_PORT_PLL_EBB_0(port));
677 temp &= ~(PORT_PLL_P1_MASK | PORT_PLL_P2_MASK);
678 temp |= pll->config.hw_state.ebb0;
679 I915_WRITE(BXT_PORT_PLL_EBB_0(port), temp);
680
681 /* Write M2 integer */
682 temp = I915_READ(BXT_PORT_PLL(port, 0));
683 temp &= ~PORT_PLL_M2_MASK;
684 temp |= pll->config.hw_state.pll0;
685 I915_WRITE(BXT_PORT_PLL(port, 0), temp);
686
687 /* Write N */
688 temp = I915_READ(BXT_PORT_PLL(port, 1));
689 temp &= ~PORT_PLL_N_MASK;
690 temp |= pll->config.hw_state.pll1;
691 I915_WRITE(BXT_PORT_PLL(port, 1), temp);
692
693 /* Write M2 fraction */
694 temp = I915_READ(BXT_PORT_PLL(port, 2));
695 temp &= ~PORT_PLL_M2_FRAC_MASK;
696 temp |= pll->config.hw_state.pll2;
697 I915_WRITE(BXT_PORT_PLL(port, 2), temp);
698
699 /* Write M2 fraction enable */
700 temp = I915_READ(BXT_PORT_PLL(port, 3));
701 temp &= ~PORT_PLL_M2_FRAC_ENABLE;
702 temp |= pll->config.hw_state.pll3;
703 I915_WRITE(BXT_PORT_PLL(port, 3), temp);
704
705 /* Write coeff */
706 temp = I915_READ(BXT_PORT_PLL(port, 6));
707 temp &= ~PORT_PLL_PROP_COEFF_MASK;
708 temp &= ~PORT_PLL_INT_COEFF_MASK;
709 temp &= ~PORT_PLL_GAIN_CTL_MASK;
710 temp |= pll->config.hw_state.pll6;
711 I915_WRITE(BXT_PORT_PLL(port, 6), temp);
712
713 /* Write calibration val */
714 temp = I915_READ(BXT_PORT_PLL(port, 8));
715 temp &= ~PORT_PLL_TARGET_CNT_MASK;
716 temp |= pll->config.hw_state.pll8;
717 I915_WRITE(BXT_PORT_PLL(port, 8), temp);
718
719 temp = I915_READ(BXT_PORT_PLL(port, 9));
720 temp &= ~PORT_PLL_LOCK_THRESHOLD_MASK;
721 temp |= pll->config.hw_state.pll9;
722 I915_WRITE(BXT_PORT_PLL(port, 9), temp);
723
724 temp = I915_READ(BXT_PORT_PLL(port, 10));
725 temp &= ~PORT_PLL_DCO_AMP_OVR_EN_H;
726 temp &= ~PORT_PLL_DCO_AMP_MASK;
727 temp |= pll->config.hw_state.pll10;
728 I915_WRITE(BXT_PORT_PLL(port, 10), temp);
729
730 /* Recalibrate with new settings */
731 temp = I915_READ(BXT_PORT_PLL_EBB_4(port));
732 temp |= PORT_PLL_RECALIBRATE;
733 I915_WRITE(BXT_PORT_PLL_EBB_4(port), temp);
734 temp &= ~PORT_PLL_10BIT_CLK_ENABLE;
735 temp |= pll->config.hw_state.ebb4;
736 I915_WRITE(BXT_PORT_PLL_EBB_4(port), temp);
737
738 /* Enable PLL */
739 temp = I915_READ(BXT_PORT_PLL_ENABLE(port));
740 temp |= PORT_PLL_ENABLE;
741 I915_WRITE(BXT_PORT_PLL_ENABLE(port), temp);
742 POSTING_READ(BXT_PORT_PLL_ENABLE(port));
743
744 if (wait_for_atomic_us((I915_READ(BXT_PORT_PLL_ENABLE(port)) &
745 PORT_PLL_LOCK), 200))
746 DRM_ERROR("PLL %d not locked\n", port);
747
748 /*
749 * While we write to the group register to program all lanes at once we
750 * can read only lane registers and we pick lanes 0/1 for that.
751 */
752 temp = I915_READ(BXT_PORT_PCS_DW12_LN01(port));
753 temp &= ~LANE_STAGGER_MASK;
754 temp &= ~LANESTAGGER_STRAP_OVRD;
755 temp |= pll->config.hw_state.pcsdw12;
756 I915_WRITE(BXT_PORT_PCS_DW12_GRP(port), temp);
757}
758
759static void bxt_ddi_pll_disable(struct drm_i915_private *dev_priv,
760 struct intel_shared_dpll *pll)
761{
762 enum port port = (enum port)pll->id; /* 1:1 port->PLL mapping */
763 uint32_t temp;
764
765 temp = I915_READ(BXT_PORT_PLL_ENABLE(port));
766 temp &= ~PORT_PLL_ENABLE;
767 I915_WRITE(BXT_PORT_PLL_ENABLE(port), temp);
768 POSTING_READ(BXT_PORT_PLL_ENABLE(port));
769}
770
771static bool bxt_ddi_pll_get_hw_state(struct drm_i915_private *dev_priv,
772 struct intel_shared_dpll *pll,
773 struct intel_dpll_hw_state *hw_state)
774{
775 enum port port = (enum port)pll->id; /* 1:1 port->PLL mapping */
776 uint32_t val;
777 bool ret;
778
779 if (!intel_display_power_get_if_enabled(dev_priv, POWER_DOMAIN_PLLS))
780 return false;
781
782 ret = false;
783
784 val = I915_READ(BXT_PORT_PLL_ENABLE(port));
785 if (!(val & PORT_PLL_ENABLE))
786 goto out;
787
788 hw_state->ebb0 = I915_READ(BXT_PORT_PLL_EBB_0(port));
789 hw_state->ebb0 &= PORT_PLL_P1_MASK | PORT_PLL_P2_MASK;
790
791 hw_state->ebb4 = I915_READ(BXT_PORT_PLL_EBB_4(port));
792 hw_state->ebb4 &= PORT_PLL_10BIT_CLK_ENABLE;
793
794 hw_state->pll0 = I915_READ(BXT_PORT_PLL(port, 0));
795 hw_state->pll0 &= PORT_PLL_M2_MASK;
796
797 hw_state->pll1 = I915_READ(BXT_PORT_PLL(port, 1));
798 hw_state->pll1 &= PORT_PLL_N_MASK;
799
800 hw_state->pll2 = I915_READ(BXT_PORT_PLL(port, 2));
801 hw_state->pll2 &= PORT_PLL_M2_FRAC_MASK;
802
803 hw_state->pll3 = I915_READ(BXT_PORT_PLL(port, 3));
804 hw_state->pll3 &= PORT_PLL_M2_FRAC_ENABLE;
805
806 hw_state->pll6 = I915_READ(BXT_PORT_PLL(port, 6));
807 hw_state->pll6 &= PORT_PLL_PROP_COEFF_MASK |
808 PORT_PLL_INT_COEFF_MASK |
809 PORT_PLL_GAIN_CTL_MASK;
810
811 hw_state->pll8 = I915_READ(BXT_PORT_PLL(port, 8));
812 hw_state->pll8 &= PORT_PLL_TARGET_CNT_MASK;
813
814 hw_state->pll9 = I915_READ(BXT_PORT_PLL(port, 9));
815 hw_state->pll9 &= PORT_PLL_LOCK_THRESHOLD_MASK;
816
817 hw_state->pll10 = I915_READ(BXT_PORT_PLL(port, 10));
818 hw_state->pll10 &= PORT_PLL_DCO_AMP_OVR_EN_H |
819 PORT_PLL_DCO_AMP_MASK;
820
821 /*
822 * While we write to the group register to program all lanes at once we
823 * can read only lane registers. We configure all lanes the same way, so
824 * here just read out lanes 0/1 and output a note if lanes 2/3 differ.
825 */
826 hw_state->pcsdw12 = I915_READ(BXT_PORT_PCS_DW12_LN01(port));
827 if (I915_READ(BXT_PORT_PCS_DW12_LN23(port)) != hw_state->pcsdw12)
828 DRM_DEBUG_DRIVER("lane stagger config different for lane 01 (%08x) and 23 (%08x)\n",
829 hw_state->pcsdw12,
830 I915_READ(BXT_PORT_PCS_DW12_LN23(port)));
831 hw_state->pcsdw12 &= LANE_STAGGER_MASK | LANESTAGGER_STRAP_OVRD;
832
833 ret = true;
834
835out:
836 intel_display_power_put(dev_priv, POWER_DOMAIN_PLLS);
837
838 return ret;
839}
840
841static void bxt_shared_dplls_init(struct drm_i915_private *dev_priv)
842{
843 int i;
844
845 dev_priv->num_shared_dpll = 3;
846
847 for (i = 0; i < dev_priv->num_shared_dpll; i++) {
848 dev_priv->shared_dplls[i].id = i;
849 dev_priv->shared_dplls[i].name = bxt_ddi_pll_names[i];
850 dev_priv->shared_dplls[i].disable = bxt_ddi_pll_disable;
851 dev_priv->shared_dplls[i].enable = bxt_ddi_pll_enable;
852 dev_priv->shared_dplls[i].get_hw_state =
853 bxt_ddi_pll_get_hw_state;
854 }
855}
856
857static void intel_ddi_pll_init(struct drm_device *dev)
858{
859 struct drm_i915_private *dev_priv = dev->dev_private;
860 uint32_t val = I915_READ(LCPLL_CTL);
861
862 if (IS_SKYLAKE(dev) || IS_KABYLAKE(dev))
863 skl_shared_dplls_init(dev_priv);
864 else if (IS_BROXTON(dev))
865 bxt_shared_dplls_init(dev_priv);
866 else
867 hsw_shared_dplls_init(dev_priv);
868
869 if (IS_SKYLAKE(dev) || IS_KABYLAKE(dev)) {
870 int cdclk_freq;
871
872 cdclk_freq = dev_priv->display.get_display_clock_speed(dev);
873 dev_priv->skl_boot_cdclk = cdclk_freq;
874 if (skl_sanitize_cdclk(dev_priv))
875 DRM_DEBUG_KMS("Sanitized cdclk programmed by pre-os\n");
876 if (!(I915_READ(LCPLL1_CTL) & LCPLL_PLL_ENABLE))
877 DRM_ERROR("LCPLL1 is disabled\n");
878 } else if (IS_BROXTON(dev)) {
879 broxton_init_cdclk(dev);
880 broxton_ddi_phy_init(dev);
881 } else {
882 /*
883 * The LCPLL register should be turned on by the BIOS. For now
884 * let's just check its state and print errors in case
885 * something is wrong. Don't even try to turn it on.
886 */
887
888 if (val & LCPLL_CD_SOURCE_FCLK)
889 DRM_ERROR("CDCLK source is not LCPLL\n");
890
891 if (val & LCPLL_PLL_DISABLE)
892 DRM_ERROR("LCPLL is disabled\n");
893 }
894}
895
7abd4b35
ACO
896void intel_shared_dpll_init(struct drm_device *dev)
897{
898 struct drm_i915_private *dev_priv = dev->dev_private;
899
900 if (HAS_DDI(dev))
901 intel_ddi_pll_init(dev);
902 else if (HAS_PCH_IBX(dev) || HAS_PCH_CPT(dev))
903 ibx_pch_dpll_init(dev);
904 else
905 dev_priv->num_shared_dpll = 0;
906
907 BUG_ON(dev_priv->num_shared_dpll > I915_NUM_PLLS);
908}
This page took 0.058765 seconds and 5 git commands to generate.