drm/i915: Adjust system agent voltage on CNL if required by DDI ports
[linux-block.git] / drivers / gpu / drm / i915 / intel_cdclk.c
CommitLineData
7ff89ca2
VS
1/*
2 * Copyright © 2006-2017 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: CDCLK / RAWCLK
28 *
29 * The display engine uses several different clocks to do its work. There
30 * are two main clocks involved that aren't directly related to the actual
31 * pixel clock or any symbol/bit clock of the actual output port. These
32 * are the core display clock (CDCLK) and RAWCLK.
33 *
34 * CDCLK clocks most of the display pipe logic, and thus its frequency
35 * must be high enough to support the rate at which pixels are flowing
36 * through the pipes. Downscaling must also be accounted as that increases
37 * the effective pixel rate.
38 *
39 * On several platforms the CDCLK frequency can be changed dynamically
40 * to minimize power consumption for a given display configuration.
41 * Typically changes to the CDCLK frequency require all the display pipes
42 * to be shut down while the frequency is being changed.
43 *
44 * On SKL+ the DMC will toggle the CDCLK off/on during DC5/6 entry/exit.
45 * DMC will not change the active CDCLK frequency however, so that part
46 * will still be performed by the driver directly.
47 *
48 * RAWCLK is a fixed frequency clock, often used by various auxiliary
49 * blocks such as AUX CH or backlight PWM. Hence the only thing we
50 * really need to know about RAWCLK is its frequency so that various
51 * dividers can be programmed correctly.
52 */
53
49cd97a3
VS
54static void fixed_133mhz_get_cdclk(struct drm_i915_private *dev_priv,
55 struct intel_cdclk_state *cdclk_state)
7ff89ca2 56{
49cd97a3 57 cdclk_state->cdclk = 133333;
7ff89ca2
VS
58}
59
49cd97a3
VS
60static void fixed_200mhz_get_cdclk(struct drm_i915_private *dev_priv,
61 struct intel_cdclk_state *cdclk_state)
7ff89ca2 62{
49cd97a3 63 cdclk_state->cdclk = 200000;
7ff89ca2
VS
64}
65
49cd97a3
VS
66static void fixed_266mhz_get_cdclk(struct drm_i915_private *dev_priv,
67 struct intel_cdclk_state *cdclk_state)
7ff89ca2 68{
49cd97a3 69 cdclk_state->cdclk = 266667;
7ff89ca2
VS
70}
71
49cd97a3
VS
72static void fixed_333mhz_get_cdclk(struct drm_i915_private *dev_priv,
73 struct intel_cdclk_state *cdclk_state)
7ff89ca2 74{
49cd97a3 75 cdclk_state->cdclk = 333333;
7ff89ca2
VS
76}
77
49cd97a3
VS
78static void fixed_400mhz_get_cdclk(struct drm_i915_private *dev_priv,
79 struct intel_cdclk_state *cdclk_state)
7ff89ca2 80{
49cd97a3 81 cdclk_state->cdclk = 400000;
7ff89ca2
VS
82}
83
49cd97a3
VS
84static void fixed_450mhz_get_cdclk(struct drm_i915_private *dev_priv,
85 struct intel_cdclk_state *cdclk_state)
7ff89ca2 86{
49cd97a3 87 cdclk_state->cdclk = 450000;
7ff89ca2
VS
88}
89
49cd97a3
VS
90static void i85x_get_cdclk(struct drm_i915_private *dev_priv,
91 struct intel_cdclk_state *cdclk_state)
7ff89ca2
VS
92{
93 struct pci_dev *pdev = dev_priv->drm.pdev;
94 u16 hpllcc = 0;
95
96 /*
97 * 852GM/852GMV only supports 133 MHz and the HPLLCC
98 * encoding is different :(
99 * FIXME is this the right way to detect 852GM/852GMV?
100 */
49cd97a3
VS
101 if (pdev->revision == 0x1) {
102 cdclk_state->cdclk = 133333;
103 return;
104 }
7ff89ca2
VS
105
106 pci_bus_read_config_word(pdev->bus,
107 PCI_DEVFN(0, 3), HPLLCC, &hpllcc);
108
109 /* Assume that the hardware is in the high speed state. This
110 * should be the default.
111 */
112 switch (hpllcc & GC_CLOCK_CONTROL_MASK) {
113 case GC_CLOCK_133_200:
114 case GC_CLOCK_133_200_2:
115 case GC_CLOCK_100_200:
49cd97a3
VS
116 cdclk_state->cdclk = 200000;
117 break;
7ff89ca2 118 case GC_CLOCK_166_250:
49cd97a3
VS
119 cdclk_state->cdclk = 250000;
120 break;
7ff89ca2 121 case GC_CLOCK_100_133:
49cd97a3
VS
122 cdclk_state->cdclk = 133333;
123 break;
7ff89ca2
VS
124 case GC_CLOCK_133_266:
125 case GC_CLOCK_133_266_2:
126 case GC_CLOCK_166_266:
49cd97a3
VS
127 cdclk_state->cdclk = 266667;
128 break;
7ff89ca2 129 }
7ff89ca2
VS
130}
131
49cd97a3
VS
132static void i915gm_get_cdclk(struct drm_i915_private *dev_priv,
133 struct intel_cdclk_state *cdclk_state)
7ff89ca2
VS
134{
135 struct pci_dev *pdev = dev_priv->drm.pdev;
136 u16 gcfgc = 0;
137
138 pci_read_config_word(pdev, GCFGC, &gcfgc);
139
49cd97a3
VS
140 if (gcfgc & GC_LOW_FREQUENCY_ENABLE) {
141 cdclk_state->cdclk = 133333;
142 return;
143 }
7ff89ca2
VS
144
145 switch (gcfgc & GC_DISPLAY_CLOCK_MASK) {
146 case GC_DISPLAY_CLOCK_333_320_MHZ:
49cd97a3
VS
147 cdclk_state->cdclk = 333333;
148 break;
7ff89ca2
VS
149 default:
150 case GC_DISPLAY_CLOCK_190_200_MHZ:
49cd97a3
VS
151 cdclk_state->cdclk = 190000;
152 break;
7ff89ca2
VS
153 }
154}
155
49cd97a3
VS
156static void i945gm_get_cdclk(struct drm_i915_private *dev_priv,
157 struct intel_cdclk_state *cdclk_state)
7ff89ca2
VS
158{
159 struct pci_dev *pdev = dev_priv->drm.pdev;
160 u16 gcfgc = 0;
161
162 pci_read_config_word(pdev, GCFGC, &gcfgc);
163
49cd97a3
VS
164 if (gcfgc & GC_LOW_FREQUENCY_ENABLE) {
165 cdclk_state->cdclk = 133333;
166 return;
167 }
7ff89ca2
VS
168
169 switch (gcfgc & GC_DISPLAY_CLOCK_MASK) {
170 case GC_DISPLAY_CLOCK_333_320_MHZ:
49cd97a3
VS
171 cdclk_state->cdclk = 320000;
172 break;
7ff89ca2
VS
173 default:
174 case GC_DISPLAY_CLOCK_190_200_MHZ:
49cd97a3
VS
175 cdclk_state->cdclk = 200000;
176 break;
7ff89ca2
VS
177 }
178}
179
180static unsigned int intel_hpll_vco(struct drm_i915_private *dev_priv)
181{
182 static const unsigned int blb_vco[8] = {
183 [0] = 3200000,
184 [1] = 4000000,
185 [2] = 5333333,
186 [3] = 4800000,
187 [4] = 6400000,
188 };
189 static const unsigned int pnv_vco[8] = {
190 [0] = 3200000,
191 [1] = 4000000,
192 [2] = 5333333,
193 [3] = 4800000,
194 [4] = 2666667,
195 };
196 static const unsigned int cl_vco[8] = {
197 [0] = 3200000,
198 [1] = 4000000,
199 [2] = 5333333,
200 [3] = 6400000,
201 [4] = 3333333,
202 [5] = 3566667,
203 [6] = 4266667,
204 };
205 static const unsigned int elk_vco[8] = {
206 [0] = 3200000,
207 [1] = 4000000,
208 [2] = 5333333,
209 [3] = 4800000,
210 };
211 static const unsigned int ctg_vco[8] = {
212 [0] = 3200000,
213 [1] = 4000000,
214 [2] = 5333333,
215 [3] = 6400000,
216 [4] = 2666667,
217 [5] = 4266667,
218 };
219 const unsigned int *vco_table;
220 unsigned int vco;
221 uint8_t tmp = 0;
222
223 /* FIXME other chipsets? */
224 if (IS_GM45(dev_priv))
225 vco_table = ctg_vco;
6b9e441d 226 else if (IS_G45(dev_priv))
7ff89ca2
VS
227 vco_table = elk_vco;
228 else if (IS_I965GM(dev_priv))
229 vco_table = cl_vco;
230 else if (IS_PINEVIEW(dev_priv))
231 vco_table = pnv_vco;
232 else if (IS_G33(dev_priv))
233 vco_table = blb_vco;
234 else
235 return 0;
236
237 tmp = I915_READ(IS_MOBILE(dev_priv) ? HPLLVCO_MOBILE : HPLLVCO);
238
239 vco = vco_table[tmp & 0x7];
240 if (vco == 0)
241 DRM_ERROR("Bad HPLL VCO (HPLLVCO=0x%02x)\n", tmp);
242 else
243 DRM_DEBUG_KMS("HPLL VCO %u kHz\n", vco);
244
245 return vco;
246}
247
49cd97a3
VS
248static void g33_get_cdclk(struct drm_i915_private *dev_priv,
249 struct intel_cdclk_state *cdclk_state)
7ff89ca2
VS
250{
251 struct pci_dev *pdev = dev_priv->drm.pdev;
252 static const uint8_t div_3200[] = { 12, 10, 8, 7, 5, 16 };
253 static const uint8_t div_4000[] = { 14, 12, 10, 8, 6, 20 };
254 static const uint8_t div_4800[] = { 20, 14, 12, 10, 8, 24 };
255 static const uint8_t div_5333[] = { 20, 16, 12, 12, 8, 28 };
256 const uint8_t *div_table;
49cd97a3 257 unsigned int cdclk_sel;
7ff89ca2
VS
258 uint16_t tmp = 0;
259
49cd97a3
VS
260 cdclk_state->vco = intel_hpll_vco(dev_priv);
261
7ff89ca2
VS
262 pci_read_config_word(pdev, GCFGC, &tmp);
263
264 cdclk_sel = (tmp >> 4) & 0x7;
265
266 if (cdclk_sel >= ARRAY_SIZE(div_3200))
267 goto fail;
268
49cd97a3 269 switch (cdclk_state->vco) {
7ff89ca2
VS
270 case 3200000:
271 div_table = div_3200;
272 break;
273 case 4000000:
274 div_table = div_4000;
275 break;
276 case 4800000:
277 div_table = div_4800;
278 break;
279 case 5333333:
280 div_table = div_5333;
281 break;
282 default:
283 goto fail;
284 }
285
49cd97a3
VS
286 cdclk_state->cdclk = DIV_ROUND_CLOSEST(cdclk_state->vco,
287 div_table[cdclk_sel]);
288 return;
7ff89ca2
VS
289
290fail:
291 DRM_ERROR("Unable to determine CDCLK. HPLL VCO=%u kHz, CFGC=0x%08x\n",
49cd97a3
VS
292 cdclk_state->vco, tmp);
293 cdclk_state->cdclk = 190476;
7ff89ca2
VS
294}
295
49cd97a3
VS
296static void pnv_get_cdclk(struct drm_i915_private *dev_priv,
297 struct intel_cdclk_state *cdclk_state)
7ff89ca2
VS
298{
299 struct pci_dev *pdev = dev_priv->drm.pdev;
300 u16 gcfgc = 0;
301
302 pci_read_config_word(pdev, GCFGC, &gcfgc);
303
304 switch (gcfgc & GC_DISPLAY_CLOCK_MASK) {
305 case GC_DISPLAY_CLOCK_267_MHZ_PNV:
49cd97a3
VS
306 cdclk_state->cdclk = 266667;
307 break;
7ff89ca2 308 case GC_DISPLAY_CLOCK_333_MHZ_PNV:
49cd97a3
VS
309 cdclk_state->cdclk = 333333;
310 break;
7ff89ca2 311 case GC_DISPLAY_CLOCK_444_MHZ_PNV:
49cd97a3
VS
312 cdclk_state->cdclk = 444444;
313 break;
7ff89ca2 314 case GC_DISPLAY_CLOCK_200_MHZ_PNV:
49cd97a3
VS
315 cdclk_state->cdclk = 200000;
316 break;
7ff89ca2
VS
317 default:
318 DRM_ERROR("Unknown pnv display core clock 0x%04x\n", gcfgc);
319 case GC_DISPLAY_CLOCK_133_MHZ_PNV:
49cd97a3
VS
320 cdclk_state->cdclk = 133333;
321 break;
7ff89ca2 322 case GC_DISPLAY_CLOCK_167_MHZ_PNV:
49cd97a3
VS
323 cdclk_state->cdclk = 166667;
324 break;
7ff89ca2
VS
325 }
326}
327
49cd97a3
VS
328static void i965gm_get_cdclk(struct drm_i915_private *dev_priv,
329 struct intel_cdclk_state *cdclk_state)
7ff89ca2
VS
330{
331 struct pci_dev *pdev = dev_priv->drm.pdev;
332 static const uint8_t div_3200[] = { 16, 10, 8 };
333 static const uint8_t div_4000[] = { 20, 12, 10 };
334 static const uint8_t div_5333[] = { 24, 16, 14 };
335 const uint8_t *div_table;
49cd97a3 336 unsigned int cdclk_sel;
7ff89ca2
VS
337 uint16_t tmp = 0;
338
49cd97a3
VS
339 cdclk_state->vco = intel_hpll_vco(dev_priv);
340
7ff89ca2
VS
341 pci_read_config_word(pdev, GCFGC, &tmp);
342
343 cdclk_sel = ((tmp >> 8) & 0x1f) - 1;
344
345 if (cdclk_sel >= ARRAY_SIZE(div_3200))
346 goto fail;
347
49cd97a3 348 switch (cdclk_state->vco) {
7ff89ca2
VS
349 case 3200000:
350 div_table = div_3200;
351 break;
352 case 4000000:
353 div_table = div_4000;
354 break;
355 case 5333333:
356 div_table = div_5333;
357 break;
358 default:
359 goto fail;
360 }
361
49cd97a3
VS
362 cdclk_state->cdclk = DIV_ROUND_CLOSEST(cdclk_state->vco,
363 div_table[cdclk_sel]);
364 return;
7ff89ca2
VS
365
366fail:
367 DRM_ERROR("Unable to determine CDCLK. HPLL VCO=%u kHz, CFGC=0x%04x\n",
49cd97a3
VS
368 cdclk_state->vco, tmp);
369 cdclk_state->cdclk = 200000;
7ff89ca2
VS
370}
371
49cd97a3
VS
372static void gm45_get_cdclk(struct drm_i915_private *dev_priv,
373 struct intel_cdclk_state *cdclk_state)
7ff89ca2
VS
374{
375 struct pci_dev *pdev = dev_priv->drm.pdev;
49cd97a3 376 unsigned int cdclk_sel;
7ff89ca2
VS
377 uint16_t tmp = 0;
378
49cd97a3
VS
379 cdclk_state->vco = intel_hpll_vco(dev_priv);
380
7ff89ca2
VS
381 pci_read_config_word(pdev, GCFGC, &tmp);
382
383 cdclk_sel = (tmp >> 12) & 0x1;
384
49cd97a3 385 switch (cdclk_state->vco) {
7ff89ca2
VS
386 case 2666667:
387 case 4000000:
388 case 5333333:
49cd97a3
VS
389 cdclk_state->cdclk = cdclk_sel ? 333333 : 222222;
390 break;
7ff89ca2 391 case 3200000:
49cd97a3
VS
392 cdclk_state->cdclk = cdclk_sel ? 320000 : 228571;
393 break;
7ff89ca2
VS
394 default:
395 DRM_ERROR("Unable to determine CDCLK. HPLL VCO=%u, CFGC=0x%04x\n",
49cd97a3
VS
396 cdclk_state->vco, tmp);
397 cdclk_state->cdclk = 222222;
398 break;
7ff89ca2
VS
399 }
400}
401
49cd97a3
VS
402static void hsw_get_cdclk(struct drm_i915_private *dev_priv,
403 struct intel_cdclk_state *cdclk_state)
7ff89ca2
VS
404{
405 uint32_t lcpll = I915_READ(LCPLL_CTL);
406 uint32_t freq = lcpll & LCPLL_CLK_FREQ_MASK;
407
408 if (lcpll & LCPLL_CD_SOURCE_FCLK)
49cd97a3 409 cdclk_state->cdclk = 800000;
7ff89ca2 410 else if (I915_READ(FUSE_STRAP) & HSW_CDCLK_LIMIT)
49cd97a3 411 cdclk_state->cdclk = 450000;
7ff89ca2 412 else if (freq == LCPLL_CLK_FREQ_450)
49cd97a3 413 cdclk_state->cdclk = 450000;
7ff89ca2 414 else if (IS_HSW_ULT(dev_priv))
49cd97a3 415 cdclk_state->cdclk = 337500;
7ff89ca2 416 else
49cd97a3 417 cdclk_state->cdclk = 540000;
7ff89ca2
VS
418}
419
d305e061 420static int vlv_calc_cdclk(struct drm_i915_private *dev_priv, int min_cdclk)
7ff89ca2
VS
421{
422 int freq_320 = (dev_priv->hpll_freq << 1) % 320000 != 0 ?
423 333333 : 320000;
7ff89ca2
VS
424
425 /*
426 * We seem to get an unstable or solid color picture at 200MHz.
427 * Not sure what's wrong. For now use 200MHz only when all pipes
428 * are off.
429 */
d305e061 430 if (IS_VALLEYVIEW(dev_priv) && min_cdclk > freq_320)
7ff89ca2 431 return 400000;
d305e061 432 else if (min_cdclk > 266667)
7ff89ca2 433 return freq_320;
d305e061 434 else if (min_cdclk > 0)
7ff89ca2
VS
435 return 266667;
436 else
437 return 200000;
438}
439
999c5766
VS
440static u8 vlv_calc_voltage_level(struct drm_i915_private *dev_priv, int cdclk)
441{
442 if (IS_VALLEYVIEW(dev_priv)) {
443 if (cdclk >= 320000) /* jump to highest voltage for 400MHz too */
444 return 2;
445 else if (cdclk >= 266667)
446 return 1;
447 else
448 return 0;
449 } else {
450 /*
451 * Specs are full of misinformation, but testing on actual
452 * hardware has shown that we just need to write the desired
453 * CCK divider into the Punit register.
454 */
455 return DIV_ROUND_CLOSEST(dev_priv->hpll_freq << 1, cdclk) - 1;
456 }
457}
458
49cd97a3
VS
459static void vlv_get_cdclk(struct drm_i915_private *dev_priv,
460 struct intel_cdclk_state *cdclk_state)
7ff89ca2 461{
999c5766
VS
462 u32 val;
463
49cd97a3
VS
464 cdclk_state->vco = vlv_get_hpll_vco(dev_priv);
465 cdclk_state->cdclk = vlv_get_cck_clock(dev_priv, "cdclk",
466 CCK_DISPLAY_CLOCK_CONTROL,
467 cdclk_state->vco);
999c5766
VS
468
469 mutex_lock(&dev_priv->pcu_lock);
470 val = vlv_punit_read(dev_priv, PUNIT_REG_DSPFREQ);
471 mutex_unlock(&dev_priv->pcu_lock);
472
473 if (IS_VALLEYVIEW(dev_priv))
474 cdclk_state->voltage_level = (val & DSPFREQGUAR_MASK) >>
475 DSPFREQGUAR_SHIFT;
476 else
477 cdclk_state->voltage_level = (val & DSPFREQGUAR_MASK_CHV) >>
478 DSPFREQGUAR_SHIFT_CHV;
7ff89ca2
VS
479}
480
481static void vlv_program_pfi_credits(struct drm_i915_private *dev_priv)
482{
483 unsigned int credits, default_credits;
484
485 if (IS_CHERRYVIEW(dev_priv))
486 default_credits = PFI_CREDIT(12);
487 else
488 default_credits = PFI_CREDIT(8);
489
49cd97a3 490 if (dev_priv->cdclk.hw.cdclk >= dev_priv->czclk_freq) {
7ff89ca2
VS
491 /* CHV suggested value is 31 or 63 */
492 if (IS_CHERRYVIEW(dev_priv))
493 credits = PFI_CREDIT_63;
494 else
495 credits = PFI_CREDIT(15);
496 } else {
497 credits = default_credits;
498 }
499
500 /*
501 * WA - write default credits before re-programming
502 * FIXME: should we also set the resend bit here?
503 */
504 I915_WRITE(GCI_CONTROL, VGA_FAST_MODE_DISABLE |
505 default_credits);
506
507 I915_WRITE(GCI_CONTROL, VGA_FAST_MODE_DISABLE |
508 credits | PFI_CREDIT_RESEND);
509
510 /*
511 * FIXME is this guaranteed to clear
512 * immediately or should we poll for it?
513 */
514 WARN_ON(I915_READ(GCI_CONTROL) & PFI_CREDIT_RESEND);
515}
516
83c5fda7
VS
517static void vlv_set_cdclk(struct drm_i915_private *dev_priv,
518 const struct intel_cdclk_state *cdclk_state)
7ff89ca2 519{
83c5fda7 520 int cdclk = cdclk_state->cdclk;
999c5766 521 u32 val, cmd = cdclk_state->voltage_level;
7ff89ca2 522
886015a0
GKB
523 /* There are cases where we can end up here with power domains
524 * off and a CDCLK frequency other than the minimum, like when
525 * issuing a modeset without actually changing any display after
526 * a system suspend. So grab the PIPE-A domain, which covers
527 * the HW blocks needed for the following programming.
528 */
529 intel_display_power_get(dev_priv, POWER_DOMAIN_PIPE_A);
530
9f817501 531 mutex_lock(&dev_priv->pcu_lock);
7ff89ca2
VS
532 val = vlv_punit_read(dev_priv, PUNIT_REG_DSPFREQ);
533 val &= ~DSPFREQGUAR_MASK;
534 val |= (cmd << DSPFREQGUAR_SHIFT);
535 vlv_punit_write(dev_priv, PUNIT_REG_DSPFREQ, val);
536 if (wait_for((vlv_punit_read(dev_priv, PUNIT_REG_DSPFREQ) &
537 DSPFREQSTAT_MASK) == (cmd << DSPFREQSTAT_SHIFT),
538 50)) {
539 DRM_ERROR("timed out waiting for CDclk change\n");
540 }
9f817501 541 mutex_unlock(&dev_priv->pcu_lock);
7ff89ca2
VS
542
543 mutex_lock(&dev_priv->sb_lock);
544
545 if (cdclk == 400000) {
546 u32 divider;
547
548 divider = DIV_ROUND_CLOSEST(dev_priv->hpll_freq << 1,
549 cdclk) - 1;
550
551 /* adjust cdclk divider */
552 val = vlv_cck_read(dev_priv, CCK_DISPLAY_CLOCK_CONTROL);
553 val &= ~CCK_FREQUENCY_VALUES;
554 val |= divider;
555 vlv_cck_write(dev_priv, CCK_DISPLAY_CLOCK_CONTROL, val);
556
557 if (wait_for((vlv_cck_read(dev_priv, CCK_DISPLAY_CLOCK_CONTROL) &
558 CCK_FREQUENCY_STATUS) == (divider << CCK_FREQUENCY_STATUS_SHIFT),
559 50))
560 DRM_ERROR("timed out waiting for CDclk change\n");
561 }
562
563 /* adjust self-refresh exit latency value */
564 val = vlv_bunit_read(dev_priv, BUNIT_REG_BISOC);
565 val &= ~0x7f;
566
567 /*
568 * For high bandwidth configs, we set a higher latency in the bunit
569 * so that the core display fetch happens in time to avoid underruns.
570 */
571 if (cdclk == 400000)
572 val |= 4500 / 250; /* 4.5 usec */
573 else
574 val |= 3000 / 250; /* 3.0 usec */
575 vlv_bunit_write(dev_priv, BUNIT_REG_BISOC, val);
576
577 mutex_unlock(&dev_priv->sb_lock);
578
579 intel_update_cdclk(dev_priv);
1a5301a5
VS
580
581 vlv_program_pfi_credits(dev_priv);
886015a0
GKB
582
583 intel_display_power_put(dev_priv, POWER_DOMAIN_PIPE_A);
7ff89ca2
VS
584}
585
83c5fda7
VS
586static void chv_set_cdclk(struct drm_i915_private *dev_priv,
587 const struct intel_cdclk_state *cdclk_state)
7ff89ca2 588{
83c5fda7 589 int cdclk = cdclk_state->cdclk;
999c5766 590 u32 val, cmd = cdclk_state->voltage_level;
7ff89ca2 591
7ff89ca2
VS
592 switch (cdclk) {
593 case 333333:
594 case 320000:
595 case 266667:
596 case 200000:
597 break;
598 default:
599 MISSING_CASE(cdclk);
600 return;
601 }
602
886015a0
GKB
603 /* There are cases where we can end up here with power domains
604 * off and a CDCLK frequency other than the minimum, like when
605 * issuing a modeset without actually changing any display after
606 * a system suspend. So grab the PIPE-A domain, which covers
607 * the HW blocks needed for the following programming.
608 */
609 intel_display_power_get(dev_priv, POWER_DOMAIN_PIPE_A);
610
9f817501 611 mutex_lock(&dev_priv->pcu_lock);
7ff89ca2
VS
612 val = vlv_punit_read(dev_priv, PUNIT_REG_DSPFREQ);
613 val &= ~DSPFREQGUAR_MASK_CHV;
614 val |= (cmd << DSPFREQGUAR_SHIFT_CHV);
615 vlv_punit_write(dev_priv, PUNIT_REG_DSPFREQ, val);
616 if (wait_for((vlv_punit_read(dev_priv, PUNIT_REG_DSPFREQ) &
617 DSPFREQSTAT_MASK_CHV) == (cmd << DSPFREQSTAT_SHIFT_CHV),
618 50)) {
619 DRM_ERROR("timed out waiting for CDclk change\n");
620 }
9f817501 621 mutex_unlock(&dev_priv->pcu_lock);
7ff89ca2
VS
622
623 intel_update_cdclk(dev_priv);
1a5301a5
VS
624
625 vlv_program_pfi_credits(dev_priv);
886015a0
GKB
626
627 intel_display_power_put(dev_priv, POWER_DOMAIN_PIPE_A);
7ff89ca2
VS
628}
629
d305e061 630static int bdw_calc_cdclk(int min_cdclk)
7ff89ca2 631{
d305e061 632 if (min_cdclk > 540000)
7ff89ca2 633 return 675000;
d305e061 634 else if (min_cdclk > 450000)
7ff89ca2 635 return 540000;
d305e061 636 else if (min_cdclk > 337500)
7ff89ca2
VS
637 return 450000;
638 else
639 return 337500;
640}
641
d7ffaeef
VS
642static u8 bdw_calc_voltage_level(int cdclk)
643{
644 switch (cdclk) {
645 default:
646 case 337500:
647 return 2;
648 case 450000:
649 return 0;
650 case 540000:
651 return 1;
652 case 675000:
653 return 3;
654 }
655}
656
49cd97a3
VS
657static void bdw_get_cdclk(struct drm_i915_private *dev_priv,
658 struct intel_cdclk_state *cdclk_state)
7ff89ca2
VS
659{
660 uint32_t lcpll = I915_READ(LCPLL_CTL);
661 uint32_t freq = lcpll & LCPLL_CLK_FREQ_MASK;
662
663 if (lcpll & LCPLL_CD_SOURCE_FCLK)
49cd97a3 664 cdclk_state->cdclk = 800000;
7ff89ca2 665 else if (I915_READ(FUSE_STRAP) & HSW_CDCLK_LIMIT)
49cd97a3 666 cdclk_state->cdclk = 450000;
7ff89ca2 667 else if (freq == LCPLL_CLK_FREQ_450)
49cd97a3 668 cdclk_state->cdclk = 450000;
7ff89ca2 669 else if (freq == LCPLL_CLK_FREQ_54O_BDW)
49cd97a3 670 cdclk_state->cdclk = 540000;
7ff89ca2 671 else if (freq == LCPLL_CLK_FREQ_337_5_BDW)
49cd97a3 672 cdclk_state->cdclk = 337500;
7ff89ca2 673 else
49cd97a3 674 cdclk_state->cdclk = 675000;
d7ffaeef
VS
675
676 /*
677 * Can't read this out :( Let's assume it's
678 * at least what the CDCLK frequency requires.
679 */
680 cdclk_state->voltage_level =
681 bdw_calc_voltage_level(cdclk_state->cdclk);
7ff89ca2
VS
682}
683
83c5fda7
VS
684static void bdw_set_cdclk(struct drm_i915_private *dev_priv,
685 const struct intel_cdclk_state *cdclk_state)
7ff89ca2 686{
83c5fda7 687 int cdclk = cdclk_state->cdclk;
d7ffaeef 688 uint32_t val;
7ff89ca2
VS
689 int ret;
690
691 if (WARN((I915_READ(LCPLL_CTL) &
692 (LCPLL_PLL_DISABLE | LCPLL_PLL_LOCK |
693 LCPLL_CD_CLOCK_DISABLE | LCPLL_ROOT_CD_CLOCK_DISABLE |
694 LCPLL_CD2X_CLOCK_DISABLE | LCPLL_POWER_DOWN_ALLOW |
695 LCPLL_CD_SOURCE_FCLK)) != LCPLL_PLL_LOCK,
696 "trying to change cdclk frequency with cdclk not enabled\n"))
697 return;
698
9f817501 699 mutex_lock(&dev_priv->pcu_lock);
7ff89ca2
VS
700 ret = sandybridge_pcode_write(dev_priv,
701 BDW_PCODE_DISPLAY_FREQ_CHANGE_REQ, 0x0);
9f817501 702 mutex_unlock(&dev_priv->pcu_lock);
7ff89ca2
VS
703 if (ret) {
704 DRM_ERROR("failed to inform pcode about cdclk change\n");
705 return;
706 }
707
708 val = I915_READ(LCPLL_CTL);
709 val |= LCPLL_CD_SOURCE_FCLK;
710 I915_WRITE(LCPLL_CTL, val);
711
3164888a
ML
712 /*
713 * According to the spec, it should be enough to poll for this 1 us.
714 * However, extensive testing shows that this can take longer.
715 */
7ff89ca2 716 if (wait_for_us(I915_READ(LCPLL_CTL) &
3164888a 717 LCPLL_CD_SOURCE_FCLK_DONE, 100))
7ff89ca2
VS
718 DRM_ERROR("Switching to FCLK failed\n");
719
720 val = I915_READ(LCPLL_CTL);
721 val &= ~LCPLL_CLK_FREQ_MASK;
722
723 switch (cdclk) {
2b58417f
VS
724 default:
725 MISSING_CASE(cdclk);
726 /* fall through */
727 case 337500:
728 val |= LCPLL_CLK_FREQ_337_5_BDW;
2b58417f 729 break;
7ff89ca2
VS
730 case 450000:
731 val |= LCPLL_CLK_FREQ_450;
7ff89ca2
VS
732 break;
733 case 540000:
734 val |= LCPLL_CLK_FREQ_54O_BDW;
7ff89ca2 735 break;
7ff89ca2
VS
736 case 675000:
737 val |= LCPLL_CLK_FREQ_675_BDW;
7ff89ca2 738 break;
7ff89ca2
VS
739 }
740
741 I915_WRITE(LCPLL_CTL, val);
742
743 val = I915_READ(LCPLL_CTL);
744 val &= ~LCPLL_CD_SOURCE_FCLK;
745 I915_WRITE(LCPLL_CTL, val);
746
747 if (wait_for_us((I915_READ(LCPLL_CTL) &
748 LCPLL_CD_SOURCE_FCLK_DONE) == 0, 1))
749 DRM_ERROR("Switching back to LCPLL failed\n");
750
9f817501 751 mutex_lock(&dev_priv->pcu_lock);
d7ffaeef
VS
752 sandybridge_pcode_write(dev_priv, HSW_PCODE_DE_WRITE_FREQ_REQ,
753 cdclk_state->voltage_level);
9f817501 754 mutex_unlock(&dev_priv->pcu_lock);
7ff89ca2
VS
755
756 I915_WRITE(CDCLK_FREQ, DIV_ROUND_CLOSEST(cdclk, 1000) - 1);
757
758 intel_update_cdclk(dev_priv);
759
49cd97a3 760 WARN(cdclk != dev_priv->cdclk.hw.cdclk,
7ff89ca2 761 "cdclk requested %d kHz but got %d kHz\n",
49cd97a3 762 cdclk, dev_priv->cdclk.hw.cdclk);
7ff89ca2
VS
763}
764
d305e061 765static int skl_calc_cdclk(int min_cdclk, int vco)
7ff89ca2
VS
766{
767 if (vco == 8640000) {
d305e061 768 if (min_cdclk > 540000)
7ff89ca2 769 return 617143;
d305e061 770 else if (min_cdclk > 432000)
7ff89ca2 771 return 540000;
d305e061 772 else if (min_cdclk > 308571)
7ff89ca2
VS
773 return 432000;
774 else
775 return 308571;
776 } else {
d305e061 777 if (min_cdclk > 540000)
7ff89ca2 778 return 675000;
d305e061 779 else if (min_cdclk > 450000)
7ff89ca2 780 return 540000;
d305e061 781 else if (min_cdclk > 337500)
7ff89ca2
VS
782 return 450000;
783 else
784 return 337500;
785 }
786}
787
2aa97491
VS
788static u8 skl_calc_voltage_level(int cdclk)
789{
790 switch (cdclk) {
791 default:
792 case 308571:
793 case 337500:
794 return 0;
795 case 450000:
796 case 432000:
797 return 1;
798 case 540000:
799 return 2;
800 case 617143:
801 case 675000:
802 return 3;
803 }
804}
805
49cd97a3
VS
806static void skl_dpll0_update(struct drm_i915_private *dev_priv,
807 struct intel_cdclk_state *cdclk_state)
7ff89ca2
VS
808{
809 u32 val;
810
49cd97a3
VS
811 cdclk_state->ref = 24000;
812 cdclk_state->vco = 0;
7ff89ca2
VS
813
814 val = I915_READ(LCPLL1_CTL);
815 if ((val & LCPLL_PLL_ENABLE) == 0)
816 return;
817
818 if (WARN_ON((val & LCPLL_PLL_LOCK) == 0))
819 return;
820
821 val = I915_READ(DPLL_CTRL1);
822
823 if (WARN_ON((val & (DPLL_CTRL1_HDMI_MODE(SKL_DPLL0) |
824 DPLL_CTRL1_SSC(SKL_DPLL0) |
825 DPLL_CTRL1_OVERRIDE(SKL_DPLL0))) !=
826 DPLL_CTRL1_OVERRIDE(SKL_DPLL0)))
827 return;
828
829 switch (val & DPLL_CTRL1_LINK_RATE_MASK(SKL_DPLL0)) {
830 case DPLL_CTRL1_LINK_RATE(DPLL_CTRL1_LINK_RATE_810, SKL_DPLL0):
831 case DPLL_CTRL1_LINK_RATE(DPLL_CTRL1_LINK_RATE_1350, SKL_DPLL0):
832 case DPLL_CTRL1_LINK_RATE(DPLL_CTRL1_LINK_RATE_1620, SKL_DPLL0):
833 case DPLL_CTRL1_LINK_RATE(DPLL_CTRL1_LINK_RATE_2700, SKL_DPLL0):
49cd97a3 834 cdclk_state->vco = 8100000;
7ff89ca2
VS
835 break;
836 case DPLL_CTRL1_LINK_RATE(DPLL_CTRL1_LINK_RATE_1080, SKL_DPLL0):
837 case DPLL_CTRL1_LINK_RATE(DPLL_CTRL1_LINK_RATE_2160, SKL_DPLL0):
49cd97a3 838 cdclk_state->vco = 8640000;
7ff89ca2
VS
839 break;
840 default:
841 MISSING_CASE(val & DPLL_CTRL1_LINK_RATE_MASK(SKL_DPLL0));
842 break;
843 }
844}
845
49cd97a3
VS
846static void skl_get_cdclk(struct drm_i915_private *dev_priv,
847 struct intel_cdclk_state *cdclk_state)
7ff89ca2
VS
848{
849 u32 cdctl;
850
49cd97a3 851 skl_dpll0_update(dev_priv, cdclk_state);
7ff89ca2 852
49cd97a3
VS
853 cdclk_state->cdclk = cdclk_state->ref;
854
855 if (cdclk_state->vco == 0)
2aa97491 856 goto out;
7ff89ca2
VS
857
858 cdctl = I915_READ(CDCLK_CTL);
859
49cd97a3 860 if (cdclk_state->vco == 8640000) {
7ff89ca2
VS
861 switch (cdctl & CDCLK_FREQ_SEL_MASK) {
862 case CDCLK_FREQ_450_432:
49cd97a3
VS
863 cdclk_state->cdclk = 432000;
864 break;
7ff89ca2 865 case CDCLK_FREQ_337_308:
49cd97a3
VS
866 cdclk_state->cdclk = 308571;
867 break;
7ff89ca2 868 case CDCLK_FREQ_540:
49cd97a3
VS
869 cdclk_state->cdclk = 540000;
870 break;
7ff89ca2 871 case CDCLK_FREQ_675_617:
49cd97a3
VS
872 cdclk_state->cdclk = 617143;
873 break;
7ff89ca2
VS
874 default:
875 MISSING_CASE(cdctl & CDCLK_FREQ_SEL_MASK);
49cd97a3 876 break;
7ff89ca2
VS
877 }
878 } else {
879 switch (cdctl & CDCLK_FREQ_SEL_MASK) {
880 case CDCLK_FREQ_450_432:
49cd97a3
VS
881 cdclk_state->cdclk = 450000;
882 break;
7ff89ca2 883 case CDCLK_FREQ_337_308:
49cd97a3
VS
884 cdclk_state->cdclk = 337500;
885 break;
7ff89ca2 886 case CDCLK_FREQ_540:
49cd97a3
VS
887 cdclk_state->cdclk = 540000;
888 break;
7ff89ca2 889 case CDCLK_FREQ_675_617:
49cd97a3
VS
890 cdclk_state->cdclk = 675000;
891 break;
7ff89ca2
VS
892 default:
893 MISSING_CASE(cdctl & CDCLK_FREQ_SEL_MASK);
49cd97a3 894 break;
7ff89ca2
VS
895 }
896 }
2aa97491
VS
897
898 out:
899 /*
900 * Can't read this out :( Let's assume it's
901 * at least what the CDCLK frequency requires.
902 */
903 cdclk_state->voltage_level =
904 skl_calc_voltage_level(cdclk_state->cdclk);
7ff89ca2
VS
905}
906
907/* convert from kHz to .1 fixpoint MHz with -1MHz offset */
908static int skl_cdclk_decimal(int cdclk)
909{
910 return DIV_ROUND_CLOSEST(cdclk - 1000, 500);
911}
912
913static void skl_set_preferred_cdclk_vco(struct drm_i915_private *dev_priv,
914 int vco)
915{
916 bool changed = dev_priv->skl_preferred_vco_freq != vco;
917
918 dev_priv->skl_preferred_vco_freq = vco;
919
920 if (changed)
921 intel_update_max_cdclk(dev_priv);
922}
923
924static void skl_dpll0_enable(struct drm_i915_private *dev_priv, int vco)
925{
926 int min_cdclk = skl_calc_cdclk(0, vco);
927 u32 val;
928
929 WARN_ON(vco != 8100000 && vco != 8640000);
930
931 /* select the minimum CDCLK before enabling DPLL 0 */
932 val = CDCLK_FREQ_337_308 | skl_cdclk_decimal(min_cdclk);
933 I915_WRITE(CDCLK_CTL, val);
934 POSTING_READ(CDCLK_CTL);
935
936 /*
937 * We always enable DPLL0 with the lowest link rate possible, but still
938 * taking into account the VCO required to operate the eDP panel at the
939 * desired frequency. The usual DP link rates operate with a VCO of
940 * 8100 while the eDP 1.4 alternate link rates need a VCO of 8640.
941 * The modeset code is responsible for the selection of the exact link
942 * rate later on, with the constraint of choosing a frequency that
943 * works with vco.
944 */
945 val = I915_READ(DPLL_CTRL1);
946
947 val &= ~(DPLL_CTRL1_HDMI_MODE(SKL_DPLL0) | DPLL_CTRL1_SSC(SKL_DPLL0) |
948 DPLL_CTRL1_LINK_RATE_MASK(SKL_DPLL0));
949 val |= DPLL_CTRL1_OVERRIDE(SKL_DPLL0);
950 if (vco == 8640000)
951 val |= DPLL_CTRL1_LINK_RATE(DPLL_CTRL1_LINK_RATE_1080,
952 SKL_DPLL0);
953 else
954 val |= DPLL_CTRL1_LINK_RATE(DPLL_CTRL1_LINK_RATE_810,
955 SKL_DPLL0);
956
957 I915_WRITE(DPLL_CTRL1, val);
958 POSTING_READ(DPLL_CTRL1);
959
960 I915_WRITE(LCPLL1_CTL, I915_READ(LCPLL1_CTL) | LCPLL_PLL_ENABLE);
961
962 if (intel_wait_for_register(dev_priv,
963 LCPLL1_CTL, LCPLL_PLL_LOCK, LCPLL_PLL_LOCK,
964 5))
965 DRM_ERROR("DPLL0 not locked\n");
966
49cd97a3 967 dev_priv->cdclk.hw.vco = vco;
7ff89ca2
VS
968
969 /* We'll want to keep using the current vco from now on. */
970 skl_set_preferred_cdclk_vco(dev_priv, vco);
971}
972
973static void skl_dpll0_disable(struct drm_i915_private *dev_priv)
974{
975 I915_WRITE(LCPLL1_CTL, I915_READ(LCPLL1_CTL) & ~LCPLL_PLL_ENABLE);
976 if (intel_wait_for_register(dev_priv,
977 LCPLL1_CTL, LCPLL_PLL_LOCK, 0,
978 1))
979 DRM_ERROR("Couldn't disable DPLL0\n");
980
49cd97a3 981 dev_priv->cdclk.hw.vco = 0;
7ff89ca2
VS
982}
983
984static void skl_set_cdclk(struct drm_i915_private *dev_priv,
83c5fda7 985 const struct intel_cdclk_state *cdclk_state)
7ff89ca2 986{
83c5fda7
VS
987 int cdclk = cdclk_state->cdclk;
988 int vco = cdclk_state->vco;
2aa97491 989 u32 freq_select;
7ff89ca2
VS
990 int ret;
991
9f817501 992 mutex_lock(&dev_priv->pcu_lock);
7ff89ca2
VS
993 ret = skl_pcode_request(dev_priv, SKL_PCODE_CDCLK_CONTROL,
994 SKL_CDCLK_PREPARE_FOR_CHANGE,
995 SKL_CDCLK_READY_FOR_CHANGE,
996 SKL_CDCLK_READY_FOR_CHANGE, 3);
9f817501 997 mutex_unlock(&dev_priv->pcu_lock);
7ff89ca2
VS
998 if (ret) {
999 DRM_ERROR("Failed to inform PCU about cdclk change (%d)\n",
1000 ret);
1001 return;
1002 }
1003
1004 /* set CDCLK_CTL */
1005 switch (cdclk) {
2b58417f
VS
1006 default:
1007 WARN_ON(cdclk != dev_priv->cdclk.hw.ref);
1008 WARN_ON(vco != 0);
1009 /* fall through */
1010 case 308571:
1011 case 337500:
1012 freq_select = CDCLK_FREQ_337_308;
2b58417f 1013 break;
7ff89ca2
VS
1014 case 450000:
1015 case 432000:
1016 freq_select = CDCLK_FREQ_450_432;
7ff89ca2
VS
1017 break;
1018 case 540000:
1019 freq_select = CDCLK_FREQ_540;
7ff89ca2 1020 break;
7ff89ca2
VS
1021 case 617143:
1022 case 675000:
1023 freq_select = CDCLK_FREQ_675_617;
7ff89ca2
VS
1024 break;
1025 }
1026
49cd97a3
VS
1027 if (dev_priv->cdclk.hw.vco != 0 &&
1028 dev_priv->cdclk.hw.vco != vco)
7ff89ca2
VS
1029 skl_dpll0_disable(dev_priv);
1030
49cd97a3 1031 if (dev_priv->cdclk.hw.vco != vco)
7ff89ca2
VS
1032 skl_dpll0_enable(dev_priv, vco);
1033
1034 I915_WRITE(CDCLK_CTL, freq_select | skl_cdclk_decimal(cdclk));
1035 POSTING_READ(CDCLK_CTL);
1036
1037 /* inform PCU of the change */
9f817501 1038 mutex_lock(&dev_priv->pcu_lock);
2aa97491
VS
1039 sandybridge_pcode_write(dev_priv, SKL_PCODE_CDCLK_CONTROL,
1040 cdclk_state->voltage_level);
9f817501 1041 mutex_unlock(&dev_priv->pcu_lock);
7ff89ca2
VS
1042
1043 intel_update_cdclk(dev_priv);
1044}
1045
1046static void skl_sanitize_cdclk(struct drm_i915_private *dev_priv)
1047{
1048 uint32_t cdctl, expected;
1049
1050 /*
1051 * check if the pre-os initialized the display
1052 * There is SWF18 scratchpad register defined which is set by the
1053 * pre-os which can be used by the OS drivers to check the status
1054 */
1055 if ((I915_READ(SWF_ILK(0x18)) & 0x00FFFFFF) == 0)
1056 goto sanitize;
1057
1058 intel_update_cdclk(dev_priv);
1059 /* Is PLL enabled and locked ? */
49cd97a3
VS
1060 if (dev_priv->cdclk.hw.vco == 0 ||
1061 dev_priv->cdclk.hw.cdclk == dev_priv->cdclk.hw.ref)
7ff89ca2
VS
1062 goto sanitize;
1063
1064 /* DPLL okay; verify the cdclock
1065 *
1066 * Noticed in some instances that the freq selection is correct but
1067 * decimal part is programmed wrong from BIOS where pre-os does not
1068 * enable display. Verify the same as well.
1069 */
1070 cdctl = I915_READ(CDCLK_CTL);
1071 expected = (cdctl & CDCLK_FREQ_SEL_MASK) |
49cd97a3 1072 skl_cdclk_decimal(dev_priv->cdclk.hw.cdclk);
7ff89ca2
VS
1073 if (cdctl == expected)
1074 /* All well; nothing to sanitize */
1075 return;
1076
1077sanitize:
1078 DRM_DEBUG_KMS("Sanitizing cdclk programmed by pre-os\n");
1079
1080 /* force cdclk programming */
49cd97a3 1081 dev_priv->cdclk.hw.cdclk = 0;
7ff89ca2 1082 /* force full PLL disable + enable */
49cd97a3 1083 dev_priv->cdclk.hw.vco = -1;
7ff89ca2
VS
1084}
1085
1086/**
1087 * skl_init_cdclk - Initialize CDCLK on SKL
1088 * @dev_priv: i915 device
1089 *
1090 * Initialize CDCLK for SKL and derivatives. This is generally
1091 * done only during the display core initialization sequence,
1092 * after which the DMC will take care of turning CDCLK off/on
1093 * as needed.
1094 */
1095void skl_init_cdclk(struct drm_i915_private *dev_priv)
1096{
83c5fda7 1097 struct intel_cdclk_state cdclk_state;
7ff89ca2
VS
1098
1099 skl_sanitize_cdclk(dev_priv);
1100
49cd97a3
VS
1101 if (dev_priv->cdclk.hw.cdclk != 0 &&
1102 dev_priv->cdclk.hw.vco != 0) {
7ff89ca2
VS
1103 /*
1104 * Use the current vco as our initial
1105 * guess as to what the preferred vco is.
1106 */
1107 if (dev_priv->skl_preferred_vco_freq == 0)
1108 skl_set_preferred_cdclk_vco(dev_priv,
49cd97a3 1109 dev_priv->cdclk.hw.vco);
7ff89ca2
VS
1110 return;
1111 }
1112
83c5fda7
VS
1113 cdclk_state = dev_priv->cdclk.hw;
1114
1115 cdclk_state.vco = dev_priv->skl_preferred_vco_freq;
1116 if (cdclk_state.vco == 0)
1117 cdclk_state.vco = 8100000;
1118 cdclk_state.cdclk = skl_calc_cdclk(0, cdclk_state.vco);
2aa97491 1119 cdclk_state.voltage_level = skl_calc_voltage_level(cdclk_state.cdclk);
7ff89ca2 1120
83c5fda7 1121 skl_set_cdclk(dev_priv, &cdclk_state);
7ff89ca2
VS
1122}
1123
1124/**
1125 * skl_uninit_cdclk - Uninitialize CDCLK on SKL
1126 * @dev_priv: i915 device
1127 *
1128 * Uninitialize CDCLK for SKL and derivatives. This is done only
1129 * during the display core uninitialization sequence.
1130 */
1131void skl_uninit_cdclk(struct drm_i915_private *dev_priv)
1132{
83c5fda7
VS
1133 struct intel_cdclk_state cdclk_state = dev_priv->cdclk.hw;
1134
1135 cdclk_state.cdclk = cdclk_state.ref;
1136 cdclk_state.vco = 0;
2aa97491 1137 cdclk_state.voltage_level = skl_calc_voltage_level(cdclk_state.cdclk);
83c5fda7
VS
1138
1139 skl_set_cdclk(dev_priv, &cdclk_state);
7ff89ca2
VS
1140}
1141
d305e061 1142static int bxt_calc_cdclk(int min_cdclk)
7ff89ca2 1143{
d305e061 1144 if (min_cdclk > 576000)
7ff89ca2 1145 return 624000;
d305e061 1146 else if (min_cdclk > 384000)
7ff89ca2 1147 return 576000;
d305e061 1148 else if (min_cdclk > 288000)
7ff89ca2 1149 return 384000;
d305e061 1150 else if (min_cdclk > 144000)
7ff89ca2
VS
1151 return 288000;
1152 else
1153 return 144000;
1154}
1155
d305e061 1156static int glk_calc_cdclk(int min_cdclk)
7ff89ca2 1157{
d305e061 1158 if (min_cdclk > 158400)
7ff89ca2 1159 return 316800;
d305e061 1160 else if (min_cdclk > 79200)
7ff89ca2
VS
1161 return 158400;
1162 else
1163 return 79200;
1164}
1165
2123f442
VS
1166static u8 bxt_calc_voltage_level(int cdclk)
1167{
1168 return DIV_ROUND_UP(cdclk, 25000);
1169}
1170
7ff89ca2
VS
1171static int bxt_de_pll_vco(struct drm_i915_private *dev_priv, int cdclk)
1172{
1173 int ratio;
1174
49cd97a3 1175 if (cdclk == dev_priv->cdclk.hw.ref)
7ff89ca2
VS
1176 return 0;
1177
1178 switch (cdclk) {
1179 default:
1180 MISSING_CASE(cdclk);
2b58417f 1181 /* fall through */
7ff89ca2
VS
1182 case 144000:
1183 case 288000:
1184 case 384000:
1185 case 576000:
1186 ratio = 60;
1187 break;
1188 case 624000:
1189 ratio = 65;
1190 break;
1191 }
1192
49cd97a3 1193 return dev_priv->cdclk.hw.ref * ratio;
7ff89ca2
VS
1194}
1195
1196static int glk_de_pll_vco(struct drm_i915_private *dev_priv, int cdclk)
1197{
1198 int ratio;
1199
49cd97a3 1200 if (cdclk == dev_priv->cdclk.hw.ref)
7ff89ca2
VS
1201 return 0;
1202
1203 switch (cdclk) {
1204 default:
1205 MISSING_CASE(cdclk);
2b58417f 1206 /* fall through */
7ff89ca2
VS
1207 case 79200:
1208 case 158400:
1209 case 316800:
1210 ratio = 33;
1211 break;
1212 }
1213
49cd97a3 1214 return dev_priv->cdclk.hw.ref * ratio;
7ff89ca2
VS
1215}
1216
49cd97a3
VS
1217static void bxt_de_pll_update(struct drm_i915_private *dev_priv,
1218 struct intel_cdclk_state *cdclk_state)
7ff89ca2
VS
1219{
1220 u32 val;
1221
49cd97a3
VS
1222 cdclk_state->ref = 19200;
1223 cdclk_state->vco = 0;
7ff89ca2
VS
1224
1225 val = I915_READ(BXT_DE_PLL_ENABLE);
1226 if ((val & BXT_DE_PLL_PLL_ENABLE) == 0)
1227 return;
1228
1229 if (WARN_ON((val & BXT_DE_PLL_LOCK) == 0))
1230 return;
1231
1232 val = I915_READ(BXT_DE_PLL_CTL);
49cd97a3 1233 cdclk_state->vco = (val & BXT_DE_PLL_RATIO_MASK) * cdclk_state->ref;
7ff89ca2
VS
1234}
1235
49cd97a3
VS
1236static void bxt_get_cdclk(struct drm_i915_private *dev_priv,
1237 struct intel_cdclk_state *cdclk_state)
7ff89ca2
VS
1238{
1239 u32 divider;
49cd97a3 1240 int div;
7ff89ca2 1241
49cd97a3 1242 bxt_de_pll_update(dev_priv, cdclk_state);
7ff89ca2 1243
49cd97a3
VS
1244 cdclk_state->cdclk = cdclk_state->ref;
1245
1246 if (cdclk_state->vco == 0)
2123f442 1247 goto out;
7ff89ca2
VS
1248
1249 divider = I915_READ(CDCLK_CTL) & BXT_CDCLK_CD2X_DIV_SEL_MASK;
1250
1251 switch (divider) {
1252 case BXT_CDCLK_CD2X_DIV_SEL_1:
1253 div = 2;
1254 break;
1255 case BXT_CDCLK_CD2X_DIV_SEL_1_5:
1256 WARN(IS_GEMINILAKE(dev_priv), "Unsupported divider\n");
1257 div = 3;
1258 break;
1259 case BXT_CDCLK_CD2X_DIV_SEL_2:
1260 div = 4;
1261 break;
1262 case BXT_CDCLK_CD2X_DIV_SEL_4:
1263 div = 8;
1264 break;
1265 default:
1266 MISSING_CASE(divider);
49cd97a3 1267 return;
7ff89ca2
VS
1268 }
1269
49cd97a3 1270 cdclk_state->cdclk = DIV_ROUND_CLOSEST(cdclk_state->vco, div);
2123f442
VS
1271
1272 out:
1273 /*
1274 * Can't read this out :( Let's assume it's
1275 * at least what the CDCLK frequency requires.
1276 */
1277 cdclk_state->voltage_level =
1278 bxt_calc_voltage_level(cdclk_state->cdclk);
7ff89ca2
VS
1279}
1280
1281static void bxt_de_pll_disable(struct drm_i915_private *dev_priv)
1282{
1283 I915_WRITE(BXT_DE_PLL_ENABLE, 0);
1284
1285 /* Timeout 200us */
1286 if (intel_wait_for_register(dev_priv,
1287 BXT_DE_PLL_ENABLE, BXT_DE_PLL_LOCK, 0,
1288 1))
1289 DRM_ERROR("timeout waiting for DE PLL unlock\n");
1290
49cd97a3 1291 dev_priv->cdclk.hw.vco = 0;
7ff89ca2
VS
1292}
1293
1294static void bxt_de_pll_enable(struct drm_i915_private *dev_priv, int vco)
1295{
49cd97a3 1296 int ratio = DIV_ROUND_CLOSEST(vco, dev_priv->cdclk.hw.ref);
7ff89ca2
VS
1297 u32 val;
1298
1299 val = I915_READ(BXT_DE_PLL_CTL);
1300 val &= ~BXT_DE_PLL_RATIO_MASK;
1301 val |= BXT_DE_PLL_RATIO(ratio);
1302 I915_WRITE(BXT_DE_PLL_CTL, val);
1303
1304 I915_WRITE(BXT_DE_PLL_ENABLE, BXT_DE_PLL_PLL_ENABLE);
1305
1306 /* Timeout 200us */
1307 if (intel_wait_for_register(dev_priv,
1308 BXT_DE_PLL_ENABLE,
1309 BXT_DE_PLL_LOCK,
1310 BXT_DE_PLL_LOCK,
1311 1))
1312 DRM_ERROR("timeout waiting for DE PLL lock\n");
1313
49cd97a3 1314 dev_priv->cdclk.hw.vco = vco;
7ff89ca2
VS
1315}
1316
8f0cfa4d 1317static void bxt_set_cdclk(struct drm_i915_private *dev_priv,
83c5fda7 1318 const struct intel_cdclk_state *cdclk_state)
7ff89ca2 1319{
83c5fda7
VS
1320 int cdclk = cdclk_state->cdclk;
1321 int vco = cdclk_state->vco;
7ff89ca2 1322 u32 val, divider;
8f0cfa4d 1323 int ret;
7ff89ca2 1324
7ff89ca2
VS
1325 /* cdclk = vco / 2 / div{1,1.5,2,4} */
1326 switch (DIV_ROUND_CLOSEST(vco, cdclk)) {
2b58417f
VS
1327 default:
1328 WARN_ON(cdclk != dev_priv->cdclk.hw.ref);
1329 WARN_ON(vco != 0);
1330 /* fall through */
1331 case 2:
1332 divider = BXT_CDCLK_CD2X_DIV_SEL_1;
7ff89ca2
VS
1333 break;
1334 case 3:
1335 WARN(IS_GEMINILAKE(dev_priv), "Unsupported divider\n");
1336 divider = BXT_CDCLK_CD2X_DIV_SEL_1_5;
1337 break;
2b58417f
VS
1338 case 4:
1339 divider = BXT_CDCLK_CD2X_DIV_SEL_2;
7ff89ca2 1340 break;
2b58417f
VS
1341 case 8:
1342 divider = BXT_CDCLK_CD2X_DIV_SEL_4;
7ff89ca2
VS
1343 break;
1344 }
1345
1346 /* Inform power controller of upcoming frequency change */
9f817501 1347 mutex_lock(&dev_priv->pcu_lock);
7ff89ca2
VS
1348 ret = sandybridge_pcode_write(dev_priv, HSW_PCODE_DE_WRITE_FREQ_REQ,
1349 0x80000000);
9f817501 1350 mutex_unlock(&dev_priv->pcu_lock);
7ff89ca2
VS
1351
1352 if (ret) {
1353 DRM_ERROR("PCode CDCLK freq change notify failed (err %d, freq %d)\n",
1354 ret, cdclk);
1355 return;
1356 }
1357
49cd97a3
VS
1358 if (dev_priv->cdclk.hw.vco != 0 &&
1359 dev_priv->cdclk.hw.vco != vco)
7ff89ca2
VS
1360 bxt_de_pll_disable(dev_priv);
1361
49cd97a3 1362 if (dev_priv->cdclk.hw.vco != vco)
7ff89ca2
VS
1363 bxt_de_pll_enable(dev_priv, vco);
1364
1365 val = divider | skl_cdclk_decimal(cdclk);
1366 /*
1367 * FIXME if only the cd2x divider needs changing, it could be done
1368 * without shutting off the pipe (if only one pipe is active).
1369 */
1370 val |= BXT_CDCLK_CD2X_PIPE_NONE;
1371 /*
1372 * Disable SSA Precharge when CD clock frequency < 500 MHz,
1373 * enable otherwise.
1374 */
1375 if (cdclk >= 500000)
1376 val |= BXT_CDCLK_SSA_PRECHARGE_ENABLE;
1377 I915_WRITE(CDCLK_CTL, val);
1378
9f817501 1379 mutex_lock(&dev_priv->pcu_lock);
7ff89ca2 1380 ret = sandybridge_pcode_write(dev_priv, HSW_PCODE_DE_WRITE_FREQ_REQ,
2123f442 1381 cdclk_state->voltage_level);
9f817501 1382 mutex_unlock(&dev_priv->pcu_lock);
7ff89ca2
VS
1383
1384 if (ret) {
1385 DRM_ERROR("PCode CDCLK freq set failed, (err %d, freq %d)\n",
1386 ret, cdclk);
1387 return;
1388 }
1389
1390 intel_update_cdclk(dev_priv);
1391}
1392
1393static void bxt_sanitize_cdclk(struct drm_i915_private *dev_priv)
1394{
1395 u32 cdctl, expected;
1396
1397 intel_update_cdclk(dev_priv);
1398
49cd97a3
VS
1399 if (dev_priv->cdclk.hw.vco == 0 ||
1400 dev_priv->cdclk.hw.cdclk == dev_priv->cdclk.hw.ref)
7ff89ca2
VS
1401 goto sanitize;
1402
1403 /* DPLL okay; verify the cdclock
1404 *
1405 * Some BIOS versions leave an incorrect decimal frequency value and
1406 * set reserved MBZ bits in CDCLK_CTL at least during exiting from S4,
1407 * so sanitize this register.
1408 */
1409 cdctl = I915_READ(CDCLK_CTL);
1410 /*
1411 * Let's ignore the pipe field, since BIOS could have configured the
1412 * dividers both synching to an active pipe, or asynchronously
1413 * (PIPE_NONE).
1414 */
1415 cdctl &= ~BXT_CDCLK_CD2X_PIPE_NONE;
1416
1417 expected = (cdctl & BXT_CDCLK_CD2X_DIV_SEL_MASK) |
49cd97a3 1418 skl_cdclk_decimal(dev_priv->cdclk.hw.cdclk);
7ff89ca2
VS
1419 /*
1420 * Disable SSA Precharge when CD clock frequency < 500 MHz,
1421 * enable otherwise.
1422 */
49cd97a3 1423 if (dev_priv->cdclk.hw.cdclk >= 500000)
7ff89ca2
VS
1424 expected |= BXT_CDCLK_SSA_PRECHARGE_ENABLE;
1425
1426 if (cdctl == expected)
1427 /* All well; nothing to sanitize */
1428 return;
1429
1430sanitize:
1431 DRM_DEBUG_KMS("Sanitizing cdclk programmed by pre-os\n");
1432
1433 /* force cdclk programming */
49cd97a3 1434 dev_priv->cdclk.hw.cdclk = 0;
7ff89ca2
VS
1435
1436 /* force full PLL disable + enable */
49cd97a3 1437 dev_priv->cdclk.hw.vco = -1;
7ff89ca2
VS
1438}
1439
1440/**
1441 * bxt_init_cdclk - Initialize CDCLK on BXT
1442 * @dev_priv: i915 device
1443 *
1444 * Initialize CDCLK for BXT and derivatives. This is generally
1445 * done only during the display core initialization sequence,
1446 * after which the DMC will take care of turning CDCLK off/on
1447 * as needed.
1448 */
1449void bxt_init_cdclk(struct drm_i915_private *dev_priv)
1450{
83c5fda7 1451 struct intel_cdclk_state cdclk_state;
7ff89ca2
VS
1452
1453 bxt_sanitize_cdclk(dev_priv);
1454
49cd97a3
VS
1455 if (dev_priv->cdclk.hw.cdclk != 0 &&
1456 dev_priv->cdclk.hw.vco != 0)
7ff89ca2
VS
1457 return;
1458
83c5fda7
VS
1459 cdclk_state = dev_priv->cdclk.hw;
1460
7ff89ca2
VS
1461 /*
1462 * FIXME:
1463 * - The initial CDCLK needs to be read from VBT.
1464 * Need to make this change after VBT has changes for BXT.
1465 */
8f0cfa4d 1466 if (IS_GEMINILAKE(dev_priv)) {
83c5fda7
VS
1467 cdclk_state.cdclk = glk_calc_cdclk(0);
1468 cdclk_state.vco = glk_de_pll_vco(dev_priv, cdclk_state.cdclk);
8f0cfa4d 1469 } else {
83c5fda7
VS
1470 cdclk_state.cdclk = bxt_calc_cdclk(0);
1471 cdclk_state.vco = bxt_de_pll_vco(dev_priv, cdclk_state.cdclk);
8f0cfa4d 1472 }
2123f442 1473 cdclk_state.voltage_level = bxt_calc_voltage_level(cdclk_state.cdclk);
7ff89ca2 1474
83c5fda7 1475 bxt_set_cdclk(dev_priv, &cdclk_state);
7ff89ca2
VS
1476}
1477
1478/**
1479 * bxt_uninit_cdclk - Uninitialize CDCLK on BXT
1480 * @dev_priv: i915 device
1481 *
1482 * Uninitialize CDCLK for BXT and derivatives. This is done only
1483 * during the display core uninitialization sequence.
1484 */
1485void bxt_uninit_cdclk(struct drm_i915_private *dev_priv)
1486{
83c5fda7
VS
1487 struct intel_cdclk_state cdclk_state = dev_priv->cdclk.hw;
1488
1489 cdclk_state.cdclk = cdclk_state.ref;
1490 cdclk_state.vco = 0;
2123f442 1491 cdclk_state.voltage_level = bxt_calc_voltage_level(cdclk_state.cdclk);
83c5fda7
VS
1492
1493 bxt_set_cdclk(dev_priv, &cdclk_state);
49cd97a3
VS
1494}
1495
d305e061 1496static int cnl_calc_cdclk(int min_cdclk)
d1999e9e 1497{
d305e061 1498 if (min_cdclk > 336000)
d1999e9e 1499 return 528000;
d305e061 1500 else if (min_cdclk > 168000)
d1999e9e
RV
1501 return 336000;
1502 else
1503 return 168000;
1504}
1505
48469ece
VS
1506static u8 cnl_calc_voltage_level(int cdclk)
1507{
1508 switch (cdclk) {
1509 default:
1510 case 168000:
1511 return 0;
1512 case 336000:
1513 return 1;
1514 case 528000:
1515 return 2;
1516 }
1517}
1518
945f2672
VS
1519static void cnl_cdclk_pll_update(struct drm_i915_private *dev_priv,
1520 struct intel_cdclk_state *cdclk_state)
1521{
1522 u32 val;
1523
1524 if (I915_READ(SKL_DSSM) & CNL_DSSM_CDCLK_PLL_REFCLK_24MHz)
1525 cdclk_state->ref = 24000;
1526 else
1527 cdclk_state->ref = 19200;
1528
1529 cdclk_state->vco = 0;
1530
1531 val = I915_READ(BXT_DE_PLL_ENABLE);
1532 if ((val & BXT_DE_PLL_PLL_ENABLE) == 0)
1533 return;
1534
1535 if (WARN_ON((val & BXT_DE_PLL_LOCK) == 0))
1536 return;
1537
1538 cdclk_state->vco = (val & CNL_CDCLK_PLL_RATIO_MASK) * cdclk_state->ref;
1539}
1540
1541static void cnl_get_cdclk(struct drm_i915_private *dev_priv,
1542 struct intel_cdclk_state *cdclk_state)
1543{
1544 u32 divider;
1545 int div;
1546
1547 cnl_cdclk_pll_update(dev_priv, cdclk_state);
1548
1549 cdclk_state->cdclk = cdclk_state->ref;
1550
1551 if (cdclk_state->vco == 0)
48469ece 1552 goto out;
945f2672
VS
1553
1554 divider = I915_READ(CDCLK_CTL) & BXT_CDCLK_CD2X_DIV_SEL_MASK;
1555
1556 switch (divider) {
1557 case BXT_CDCLK_CD2X_DIV_SEL_1:
1558 div = 2;
1559 break;
1560 case BXT_CDCLK_CD2X_DIV_SEL_2:
1561 div = 4;
1562 break;
1563 default:
1564 MISSING_CASE(divider);
1565 return;
1566 }
1567
1568 cdclk_state->cdclk = DIV_ROUND_CLOSEST(cdclk_state->vco, div);
48469ece
VS
1569
1570 out:
1571 /*
1572 * Can't read this out :( Let's assume it's
1573 * at least what the CDCLK frequency requires.
1574 */
1575 cdclk_state->voltage_level =
1576 cnl_calc_voltage_level(cdclk_state->cdclk);
945f2672
VS
1577}
1578
ef4f7a68
VS
1579static void cnl_cdclk_pll_disable(struct drm_i915_private *dev_priv)
1580{
1581 u32 val;
1582
1583 val = I915_READ(BXT_DE_PLL_ENABLE);
1584 val &= ~BXT_DE_PLL_PLL_ENABLE;
1585 I915_WRITE(BXT_DE_PLL_ENABLE, val);
1586
1587 /* Timeout 200us */
1588 if (wait_for((I915_READ(BXT_DE_PLL_ENABLE) & BXT_DE_PLL_LOCK) == 0, 1))
1589 DRM_ERROR("timout waiting for CDCLK PLL unlock\n");
1590
1591 dev_priv->cdclk.hw.vco = 0;
1592}
1593
1594static void cnl_cdclk_pll_enable(struct drm_i915_private *dev_priv, int vco)
1595{
1596 int ratio = DIV_ROUND_CLOSEST(vco, dev_priv->cdclk.hw.ref);
1597 u32 val;
1598
1599 val = CNL_CDCLK_PLL_RATIO(ratio);
1600 I915_WRITE(BXT_DE_PLL_ENABLE, val);
1601
1602 val |= BXT_DE_PLL_PLL_ENABLE;
1603 I915_WRITE(BXT_DE_PLL_ENABLE, val);
1604
1605 /* Timeout 200us */
1606 if (wait_for((I915_READ(BXT_DE_PLL_ENABLE) & BXT_DE_PLL_LOCK) != 0, 1))
1607 DRM_ERROR("timout waiting for CDCLK PLL lock\n");
1608
1609 dev_priv->cdclk.hw.vco = vco;
1610}
1611
ef4f7a68
VS
1612static void cnl_set_cdclk(struct drm_i915_private *dev_priv,
1613 const struct intel_cdclk_state *cdclk_state)
1614{
1615 int cdclk = cdclk_state->cdclk;
1616 int vco = cdclk_state->vco;
48469ece 1617 u32 val, divider;
ef4f7a68
VS
1618 int ret;
1619
9f817501 1620 mutex_lock(&dev_priv->pcu_lock);
ef4f7a68
VS
1621 ret = skl_pcode_request(dev_priv, SKL_PCODE_CDCLK_CONTROL,
1622 SKL_CDCLK_PREPARE_FOR_CHANGE,
1623 SKL_CDCLK_READY_FOR_CHANGE,
1624 SKL_CDCLK_READY_FOR_CHANGE, 3);
9f817501 1625 mutex_unlock(&dev_priv->pcu_lock);
ef4f7a68
VS
1626 if (ret) {
1627 DRM_ERROR("Failed to inform PCU about cdclk change (%d)\n",
1628 ret);
1629 return;
1630 }
1631
1632 /* cdclk = vco / 2 / div{1,2} */
1633 switch (DIV_ROUND_CLOSEST(vco, cdclk)) {
ef4f7a68
VS
1634 default:
1635 WARN_ON(cdclk != dev_priv->cdclk.hw.ref);
1636 WARN_ON(vco != 0);
2b58417f
VS
1637 /* fall through */
1638 case 2:
ef4f7a68
VS
1639 divider = BXT_CDCLK_CD2X_DIV_SEL_1;
1640 break;
2b58417f
VS
1641 case 4:
1642 divider = BXT_CDCLK_CD2X_DIV_SEL_2;
1643 break;
ef4f7a68
VS
1644 }
1645
ef4f7a68
VS
1646 if (dev_priv->cdclk.hw.vco != 0 &&
1647 dev_priv->cdclk.hw.vco != vco)
1648 cnl_cdclk_pll_disable(dev_priv);
1649
1650 if (dev_priv->cdclk.hw.vco != vco)
1651 cnl_cdclk_pll_enable(dev_priv, vco);
1652
1653 val = divider | skl_cdclk_decimal(cdclk);
1654 /*
1655 * FIXME if only the cd2x divider needs changing, it could be done
1656 * without shutting off the pipe (if only one pipe is active).
1657 */
1658 val |= BXT_CDCLK_CD2X_PIPE_NONE;
1659 I915_WRITE(CDCLK_CTL, val);
1660
1661 /* inform PCU of the change */
9f817501 1662 mutex_lock(&dev_priv->pcu_lock);
48469ece
VS
1663 sandybridge_pcode_write(dev_priv, SKL_PCODE_CDCLK_CONTROL,
1664 cdclk_state->voltage_level);
9f817501 1665 mutex_unlock(&dev_priv->pcu_lock);
ef4f7a68
VS
1666
1667 intel_update_cdclk(dev_priv);
53e9bf5e
VS
1668
1669 /*
1670 * Can't read out the voltage level :(
1671 * Let's just assume everything is as expected.
1672 */
1673 dev_priv->cdclk.hw.voltage_level = cdclk_state->voltage_level;
ef4f7a68
VS
1674}
1675
d8d4a512
VS
1676static int cnl_cdclk_pll_vco(struct drm_i915_private *dev_priv, int cdclk)
1677{
1678 int ratio;
1679
1680 if (cdclk == dev_priv->cdclk.hw.ref)
1681 return 0;
1682
1683 switch (cdclk) {
1684 default:
1685 MISSING_CASE(cdclk);
2b58417f 1686 /* fall through */
d8d4a512
VS
1687 case 168000:
1688 case 336000:
1689 ratio = dev_priv->cdclk.hw.ref == 19200 ? 35 : 28;
1690 break;
1691 case 528000:
1692 ratio = dev_priv->cdclk.hw.ref == 19200 ? 55 : 44;
1693 break;
1694 }
1695
1696 return dev_priv->cdclk.hw.ref * ratio;
1697}
1698
1699static void cnl_sanitize_cdclk(struct drm_i915_private *dev_priv)
1700{
1701 u32 cdctl, expected;
1702
1703 intel_update_cdclk(dev_priv);
1704
1705 if (dev_priv->cdclk.hw.vco == 0 ||
1706 dev_priv->cdclk.hw.cdclk == dev_priv->cdclk.hw.ref)
1707 goto sanitize;
1708
1709 /* DPLL okay; verify the cdclock
1710 *
1711 * Some BIOS versions leave an incorrect decimal frequency value and
1712 * set reserved MBZ bits in CDCLK_CTL at least during exiting from S4,
1713 * so sanitize this register.
1714 */
1715 cdctl = I915_READ(CDCLK_CTL);
1716 /*
1717 * Let's ignore the pipe field, since BIOS could have configured the
1718 * dividers both synching to an active pipe, or asynchronously
1719 * (PIPE_NONE).
1720 */
1721 cdctl &= ~BXT_CDCLK_CD2X_PIPE_NONE;
1722
1723 expected = (cdctl & BXT_CDCLK_CD2X_DIV_SEL_MASK) |
1724 skl_cdclk_decimal(dev_priv->cdclk.hw.cdclk);
1725
1726 if (cdctl == expected)
1727 /* All well; nothing to sanitize */
1728 return;
1729
1730sanitize:
1731 DRM_DEBUG_KMS("Sanitizing cdclk programmed by pre-os\n");
1732
1733 /* force cdclk programming */
1734 dev_priv->cdclk.hw.cdclk = 0;
1735
1736 /* force full PLL disable + enable */
1737 dev_priv->cdclk.hw.vco = -1;
1738}
1739
1740/**
1741 * cnl_init_cdclk - Initialize CDCLK on CNL
1742 * @dev_priv: i915 device
1743 *
1744 * Initialize CDCLK for CNL. This is generally
1745 * done only during the display core initialization sequence,
1746 * after which the DMC will take care of turning CDCLK off/on
1747 * as needed.
1748 */
1749void cnl_init_cdclk(struct drm_i915_private *dev_priv)
1750{
1751 struct intel_cdclk_state cdclk_state;
1752
1753 cnl_sanitize_cdclk(dev_priv);
1754
1755 if (dev_priv->cdclk.hw.cdclk != 0 &&
1756 dev_priv->cdclk.hw.vco != 0)
1757 return;
1758
1759 cdclk_state = dev_priv->cdclk.hw;
1760
d1999e9e 1761 cdclk_state.cdclk = cnl_calc_cdclk(0);
d8d4a512 1762 cdclk_state.vco = cnl_cdclk_pll_vco(dev_priv, cdclk_state.cdclk);
48469ece 1763 cdclk_state.voltage_level = cnl_calc_voltage_level(cdclk_state.cdclk);
d8d4a512
VS
1764
1765 cnl_set_cdclk(dev_priv, &cdclk_state);
1766}
1767
1768/**
1769 * cnl_uninit_cdclk - Uninitialize CDCLK on CNL
1770 * @dev_priv: i915 device
1771 *
1772 * Uninitialize CDCLK for CNL. This is done only
1773 * during the display core uninitialization sequence.
1774 */
1775void cnl_uninit_cdclk(struct drm_i915_private *dev_priv)
1776{
1777 struct intel_cdclk_state cdclk_state = dev_priv->cdclk.hw;
1778
1779 cdclk_state.cdclk = cdclk_state.ref;
1780 cdclk_state.vco = 0;
48469ece 1781 cdclk_state.voltage_level = cnl_calc_voltage_level(cdclk_state.cdclk);
d8d4a512
VS
1782
1783 cnl_set_cdclk(dev_priv, &cdclk_state);
1784}
1785
49cd97a3 1786/**
64600bd5 1787 * intel_cdclk_needs_modeset - Determine if two CDCLK states require a modeset on all pipes
49cd97a3
VS
1788 * @a: first CDCLK state
1789 * @b: second CDCLK state
1790 *
1791 * Returns:
64600bd5 1792 * True if the CDCLK states require pipes to be off during reprogramming, false if not.
49cd97a3 1793 */
64600bd5 1794bool intel_cdclk_needs_modeset(const struct intel_cdclk_state *a,
49cd97a3
VS
1795 const struct intel_cdclk_state *b)
1796{
64600bd5
VS
1797 return a->cdclk != b->cdclk ||
1798 a->vco != b->vco ||
1799 a->ref != b->ref;
1800}
1801
1802/**
1803 * intel_cdclk_changed - Determine if two CDCLK states are different
1804 * @a: first CDCLK state
1805 * @b: second CDCLK state
1806 *
1807 * Returns:
1808 * True if the CDCLK states don't match, false if they do.
1809 */
1810bool intel_cdclk_changed(const struct intel_cdclk_state *a,
1811 const struct intel_cdclk_state *b)
1812{
1813 return intel_cdclk_needs_modeset(a, b) ||
1814 a->voltage_level != b->voltage_level;
7ff89ca2
VS
1815}
1816
b0587e4d
VS
1817/**
1818 * intel_set_cdclk - Push the CDCLK state to the hardware
1819 * @dev_priv: i915 device
1820 * @cdclk_state: new CDCLK state
1821 *
1822 * Program the hardware based on the passed in CDCLK state,
1823 * if necessary.
1824 */
1825void intel_set_cdclk(struct drm_i915_private *dev_priv,
1826 const struct intel_cdclk_state *cdclk_state)
1827{
64600bd5 1828 if (!intel_cdclk_changed(&dev_priv->cdclk.hw, cdclk_state))
b0587e4d
VS
1829 return;
1830
1831 if (WARN_ON_ONCE(!dev_priv->display.set_cdclk))
1832 return;
1833
64600bd5 1834 DRM_DEBUG_DRIVER("Changing CDCLK to %d kHz, VCO %d kHz, ref %d kHz, voltage_level %d\n",
b0587e4d 1835 cdclk_state->cdclk, cdclk_state->vco,
64600bd5 1836 cdclk_state->ref, cdclk_state->voltage_level);
b0587e4d
VS
1837
1838 dev_priv->display.set_cdclk(dev_priv, cdclk_state);
1839}
1840
d305e061
VS
1841static int intel_pixel_rate_to_cdclk(struct drm_i915_private *dev_priv,
1842 int pixel_rate)
1843{
1844 if (INTEL_GEN(dev_priv) >= 10)
1845 /*
1846 * FIXME: Switch to DIV_ROUND_UP(pixel_rate, 2)
1847 * once DDI clock voltage requirements are
1848 * handled correctly.
1849 */
1850 return pixel_rate;
1851 else if (IS_GEMINILAKE(dev_priv))
1852 /*
1853 * FIXME: Avoid using a pixel clock that is more than 99% of the cdclk
1854 * as a temporary workaround. Use a higher cdclk instead. (Note that
1855 * intel_compute_max_dotclk() limits the max pixel clock to 99% of max
1856 * cdclk.)
1857 */
1858 return DIV_ROUND_UP(pixel_rate * 100, 2 * 99);
1859 else if (IS_GEN9(dev_priv) ||
1860 IS_BROADWELL(dev_priv) || IS_HASWELL(dev_priv))
1861 return pixel_rate;
1862 else if (IS_CHERRYVIEW(dev_priv))
1863 return DIV_ROUND_UP(pixel_rate * 100, 95);
1864 else
1865 return DIV_ROUND_UP(pixel_rate * 100, 90);
1866}
1867
1868int intel_crtc_compute_min_cdclk(const struct intel_crtc_state *crtc_state)
7ff89ca2
VS
1869{
1870 struct drm_i915_private *dev_priv =
1871 to_i915(crtc_state->base.crtc->dev);
d305e061
VS
1872 int min_cdclk;
1873
1874 if (!crtc_state->base.enable)
1875 return 0;
1876
1877 min_cdclk = intel_pixel_rate_to_cdclk(dev_priv, crtc_state->pixel_rate);
7ff89ca2
VS
1878
1879 /* pixel rate mustn't exceed 95% of cdclk with IPS on BDW */
1880 if (IS_BROADWELL(dev_priv) && crtc_state->ips_enabled)
d305e061 1881 min_cdclk = DIV_ROUND_UP(min_cdclk * 100, 95);
7ff89ca2 1882
78cfa580
PD
1883 /* BSpec says "Do not use DisplayPort with CDCLK less than 432 MHz,
1884 * audio enabled, port width x4, and link rate HBR2 (5.4 GHz), or else
1885 * there may be audio corruption or screen corruption." This cdclk
d305e061 1886 * restriction for GLK is 316.8 MHz.
7ff89ca2
VS
1887 */
1888 if (intel_crtc_has_dp_encoder(crtc_state) &&
1889 crtc_state->has_audio &&
1890 crtc_state->port_clock >= 540000 &&
78cfa580 1891 crtc_state->lane_count == 4) {
d305e061
VS
1892 if (IS_CANNONLAKE(dev_priv) || IS_GEMINILAKE(dev_priv)) {
1893 /* Display WA #1145: glk,cnl */
1894 min_cdclk = max(316800, min_cdclk);
1895 } else if (IS_GEN9(dev_priv) || IS_BROADWELL(dev_priv)) {
1896 /* Display WA #1144: skl,bxt */
1897 min_cdclk = max(432000, min_cdclk);
1898 }
78cfa580 1899 }
7ff89ca2 1900
8cbeb06d
PD
1901 /* According to BSpec, "The CD clock frequency must be at least twice
1902 * the frequency of the Azalia BCLK." and BCLK is 96 MHz by default.
8cbeb06d 1903 */
d305e061
VS
1904 if (crtc_state->has_audio && INTEL_GEN(dev_priv) >= 9)
1905 min_cdclk = max(2 * 96000, min_cdclk);
8cbeb06d 1906
9c61de4c
VS
1907 if (min_cdclk > dev_priv->max_cdclk_freq) {
1908 DRM_DEBUG_KMS("required cdclk (%d kHz) exceeds max (%d kHz)\n",
1909 min_cdclk, dev_priv->max_cdclk_freq);
1910 return -EINVAL;
1911 }
1912
d305e061 1913 return min_cdclk;
7ff89ca2
VS
1914}
1915
d305e061 1916static int intel_compute_min_cdclk(struct drm_atomic_state *state)
7ff89ca2
VS
1917{
1918 struct intel_atomic_state *intel_state = to_intel_atomic_state(state);
1919 struct drm_i915_private *dev_priv = to_i915(state->dev);
d305e061 1920 struct intel_crtc *crtc;
7ff89ca2 1921 struct intel_crtc_state *crtc_state;
9c61de4c 1922 int min_cdclk, i;
7ff89ca2
VS
1923 enum pipe pipe;
1924
d305e061
VS
1925 memcpy(intel_state->min_cdclk, dev_priv->min_cdclk,
1926 sizeof(intel_state->min_cdclk));
7ff89ca2 1927
9c61de4c
VS
1928 for_each_new_intel_crtc_in_state(intel_state, crtc, crtc_state, i) {
1929 min_cdclk = intel_crtc_compute_min_cdclk(crtc_state);
1930 if (min_cdclk < 0)
1931 return min_cdclk;
1932
1933 intel_state->min_cdclk[i] = min_cdclk;
1934 }
7ff89ca2 1935
9c61de4c 1936 min_cdclk = 0;
7ff89ca2 1937 for_each_pipe(dev_priv, pipe)
d305e061 1938 min_cdclk = max(intel_state->min_cdclk[pipe], min_cdclk);
7ff89ca2 1939
d305e061 1940 return min_cdclk;
7ff89ca2
VS
1941}
1942
53e9bf5e
VS
1943/*
1944 * Note that this functions assumes that 0 is
1945 * the lowest voltage value, and higher values
1946 * correspond to increasingly higher voltages.
1947 *
1948 * Should that relationship no longer hold on
1949 * future platforms this code will need to be
1950 * adjusted.
1951 */
1952static u8 cnl_compute_min_voltage_level(struct intel_atomic_state *state)
1953{
1954 struct drm_i915_private *dev_priv = to_i915(state->base.dev);
1955 struct intel_crtc *crtc;
1956 struct intel_crtc_state *crtc_state;
1957 u8 min_voltage_level;
1958 int i;
1959 enum pipe pipe;
1960
1961 memcpy(state->min_voltage_level, dev_priv->min_voltage_level,
1962 sizeof(state->min_voltage_level));
1963
1964 for_each_new_intel_crtc_in_state(state, crtc, crtc_state, i) {
1965 if (crtc_state->base.enable)
1966 state->min_voltage_level[i] =
1967 crtc_state->min_voltage_level;
1968 else
1969 state->min_voltage_level[i] = 0;
1970 }
1971
1972 min_voltage_level = 0;
1973 for_each_pipe(dev_priv, pipe)
1974 min_voltage_level = max(state->min_voltage_level[pipe],
1975 min_voltage_level);
1976
1977 return min_voltage_level;
1978}
1979
7ff89ca2
VS
1980static int vlv_modeset_calc_cdclk(struct drm_atomic_state *state)
1981{
3d5dbb10 1982 struct drm_i915_private *dev_priv = to_i915(state->dev);
9c61de4c
VS
1983 struct intel_atomic_state *intel_state = to_intel_atomic_state(state);
1984 int min_cdclk, cdclk;
bb0f4aab 1985
9c61de4c
VS
1986 min_cdclk = intel_compute_min_cdclk(state);
1987 if (min_cdclk < 0)
1988 return min_cdclk;
7ff89ca2 1989
9c61de4c 1990 cdclk = vlv_calc_cdclk(dev_priv, min_cdclk);
7ff89ca2 1991
bb0f4aab 1992 intel_state->cdclk.logical.cdclk = cdclk;
999c5766
VS
1993 intel_state->cdclk.logical.voltage_level =
1994 vlv_calc_voltage_level(dev_priv, cdclk);
bb0f4aab
VS
1995
1996 if (!intel_state->active_crtcs) {
1997 cdclk = vlv_calc_cdclk(dev_priv, 0);
1998
1999 intel_state->cdclk.actual.cdclk = cdclk;
999c5766
VS
2000 intel_state->cdclk.actual.voltage_level =
2001 vlv_calc_voltage_level(dev_priv, cdclk);
bb0f4aab
VS
2002 } else {
2003 intel_state->cdclk.actual =
2004 intel_state->cdclk.logical;
2005 }
7ff89ca2
VS
2006
2007 return 0;
2008}
2009
7ff89ca2
VS
2010static int bdw_modeset_calc_cdclk(struct drm_atomic_state *state)
2011{
7ff89ca2 2012 struct intel_atomic_state *intel_state = to_intel_atomic_state(state);
9c61de4c
VS
2013 int min_cdclk, cdclk;
2014
2015 min_cdclk = intel_compute_min_cdclk(state);
2016 if (min_cdclk < 0)
2017 return min_cdclk;
7ff89ca2
VS
2018
2019 /*
2020 * FIXME should also account for plane ratio
2021 * once 64bpp pixel formats are supported.
2022 */
d305e061 2023 cdclk = bdw_calc_cdclk(min_cdclk);
7ff89ca2 2024
bb0f4aab 2025 intel_state->cdclk.logical.cdclk = cdclk;
d7ffaeef
VS
2026 intel_state->cdclk.logical.voltage_level =
2027 bdw_calc_voltage_level(cdclk);
bb0f4aab
VS
2028
2029 if (!intel_state->active_crtcs) {
2030 cdclk = bdw_calc_cdclk(0);
2031
2032 intel_state->cdclk.actual.cdclk = cdclk;
d7ffaeef
VS
2033 intel_state->cdclk.actual.voltage_level =
2034 bdw_calc_voltage_level(cdclk);
bb0f4aab
VS
2035 } else {
2036 intel_state->cdclk.actual =
2037 intel_state->cdclk.logical;
2038 }
7ff89ca2
VS
2039
2040 return 0;
2041}
2042
7ff89ca2
VS
2043static int skl_modeset_calc_cdclk(struct drm_atomic_state *state)
2044{
7ff89ca2 2045 struct drm_i915_private *dev_priv = to_i915(state->dev);
9c61de4c
VS
2046 struct intel_atomic_state *intel_state = to_intel_atomic_state(state);
2047 int min_cdclk, cdclk, vco;
2048
2049 min_cdclk = intel_compute_min_cdclk(state);
2050 if (min_cdclk < 0)
2051 return min_cdclk;
bb0f4aab
VS
2052
2053 vco = intel_state->cdclk.logical.vco;
2054 if (!vco)
2055 vco = dev_priv->skl_preferred_vco_freq;
7ff89ca2
VS
2056
2057 /*
2058 * FIXME should also account for plane ratio
2059 * once 64bpp pixel formats are supported.
2060 */
d305e061 2061 cdclk = skl_calc_cdclk(min_cdclk, vco);
7ff89ca2 2062
bb0f4aab
VS
2063 intel_state->cdclk.logical.vco = vco;
2064 intel_state->cdclk.logical.cdclk = cdclk;
2aa97491
VS
2065 intel_state->cdclk.logical.voltage_level =
2066 skl_calc_voltage_level(cdclk);
bb0f4aab
VS
2067
2068 if (!intel_state->active_crtcs) {
2069 cdclk = skl_calc_cdclk(0, vco);
2070
2071 intel_state->cdclk.actual.vco = vco;
2072 intel_state->cdclk.actual.cdclk = cdclk;
2aa97491
VS
2073 intel_state->cdclk.actual.voltage_level =
2074 skl_calc_voltage_level(cdclk);
bb0f4aab
VS
2075 } else {
2076 intel_state->cdclk.actual =
2077 intel_state->cdclk.logical;
2078 }
7ff89ca2
VS
2079
2080 return 0;
2081}
2082
7ff89ca2
VS
2083static int bxt_modeset_calc_cdclk(struct drm_atomic_state *state)
2084{
2085 struct drm_i915_private *dev_priv = to_i915(state->dev);
9c61de4c
VS
2086 struct intel_atomic_state *intel_state = to_intel_atomic_state(state);
2087 int min_cdclk, cdclk, vco;
2088
2089 min_cdclk = intel_compute_min_cdclk(state);
2090 if (min_cdclk < 0)
2091 return min_cdclk;
7ff89ca2 2092
bb0f4aab 2093 if (IS_GEMINILAKE(dev_priv)) {
d305e061 2094 cdclk = glk_calc_cdclk(min_cdclk);
bb0f4aab
VS
2095 vco = glk_de_pll_vco(dev_priv, cdclk);
2096 } else {
d305e061 2097 cdclk = bxt_calc_cdclk(min_cdclk);
bb0f4aab
VS
2098 vco = bxt_de_pll_vco(dev_priv, cdclk);
2099 }
2100
bb0f4aab
VS
2101 intel_state->cdclk.logical.vco = vco;
2102 intel_state->cdclk.logical.cdclk = cdclk;
2123f442
VS
2103 intel_state->cdclk.logical.voltage_level =
2104 bxt_calc_voltage_level(cdclk);
7ff89ca2
VS
2105
2106 if (!intel_state->active_crtcs) {
bb0f4aab 2107 if (IS_GEMINILAKE(dev_priv)) {
7ff89ca2 2108 cdclk = glk_calc_cdclk(0);
bb0f4aab
VS
2109 vco = glk_de_pll_vco(dev_priv, cdclk);
2110 } else {
7ff89ca2 2111 cdclk = bxt_calc_cdclk(0);
bb0f4aab
VS
2112 vco = bxt_de_pll_vco(dev_priv, cdclk);
2113 }
7ff89ca2 2114
bb0f4aab
VS
2115 intel_state->cdclk.actual.vco = vco;
2116 intel_state->cdclk.actual.cdclk = cdclk;
2123f442
VS
2117 intel_state->cdclk.actual.voltage_level =
2118 bxt_calc_voltage_level(cdclk);
bb0f4aab
VS
2119 } else {
2120 intel_state->cdclk.actual =
2121 intel_state->cdclk.logical;
7ff89ca2
VS
2122 }
2123
2124 return 0;
2125}
2126
d1999e9e
RV
2127static int cnl_modeset_calc_cdclk(struct drm_atomic_state *state)
2128{
2129 struct drm_i915_private *dev_priv = to_i915(state->dev);
9c61de4c
VS
2130 struct intel_atomic_state *intel_state = to_intel_atomic_state(state);
2131 int min_cdclk, cdclk, vco;
2132
2133 min_cdclk = intel_compute_min_cdclk(state);
2134 if (min_cdclk < 0)
2135 return min_cdclk;
d1999e9e 2136
d305e061 2137 cdclk = cnl_calc_cdclk(min_cdclk);
d1999e9e
RV
2138 vco = cnl_cdclk_pll_vco(dev_priv, cdclk);
2139
d1999e9e
RV
2140 intel_state->cdclk.logical.vco = vco;
2141 intel_state->cdclk.logical.cdclk = cdclk;
48469ece 2142 intel_state->cdclk.logical.voltage_level =
53e9bf5e
VS
2143 max(cnl_calc_voltage_level(cdclk),
2144 cnl_compute_min_voltage_level(intel_state));
d1999e9e
RV
2145
2146 if (!intel_state->active_crtcs) {
2147 cdclk = cnl_calc_cdclk(0);
2148 vco = cnl_cdclk_pll_vco(dev_priv, cdclk);
2149
2150 intel_state->cdclk.actual.vco = vco;
2151 intel_state->cdclk.actual.cdclk = cdclk;
48469ece
VS
2152 intel_state->cdclk.actual.voltage_level =
2153 cnl_calc_voltage_level(cdclk);
d1999e9e
RV
2154 } else {
2155 intel_state->cdclk.actual =
2156 intel_state->cdclk.logical;
2157 }
2158
2159 return 0;
2160}
2161
7ff89ca2
VS
2162static int intel_compute_max_dotclk(struct drm_i915_private *dev_priv)
2163{
2164 int max_cdclk_freq = dev_priv->max_cdclk_freq;
2165
d305e061
VS
2166 if (INTEL_GEN(dev_priv) >= 10)
2167 /*
2168 * FIXME: Allow '2 * max_cdclk_freq'
2169 * once DDI clock voltage requirements are
2170 * handled correctly.
2171 */
2172 return max_cdclk_freq;
2173 else if (IS_GEMINILAKE(dev_priv))
97f55ca5
MC
2174 /*
2175 * FIXME: Limiting to 99% as a temporary workaround. See
d305e061 2176 * intel_min_cdclk() for details.
97f55ca5
MC
2177 */
2178 return 2 * max_cdclk_freq * 99 / 100;
d305e061
VS
2179 else if (IS_GEN9(dev_priv) ||
2180 IS_BROADWELL(dev_priv) || IS_HASWELL(dev_priv))
7ff89ca2
VS
2181 return max_cdclk_freq;
2182 else if (IS_CHERRYVIEW(dev_priv))
2183 return max_cdclk_freq*95/100;
2184 else if (INTEL_INFO(dev_priv)->gen < 4)
2185 return 2*max_cdclk_freq*90/100;
2186 else
2187 return max_cdclk_freq*90/100;
2188}
2189
2190/**
2191 * intel_update_max_cdclk - Determine the maximum support CDCLK frequency
2192 * @dev_priv: i915 device
2193 *
2194 * Determine the maximum CDCLK frequency the platform supports, and also
2195 * derive the maximum dot clock frequency the maximum CDCLK frequency
2196 * allows.
2197 */
2198void intel_update_max_cdclk(struct drm_i915_private *dev_priv)
2199{
d1999e9e
RV
2200 if (IS_CANNONLAKE(dev_priv)) {
2201 dev_priv->max_cdclk_freq = 528000;
2202 } else if (IS_GEN9_BC(dev_priv)) {
7ff89ca2
VS
2203 u32 limit = I915_READ(SKL_DFSM) & SKL_DFSM_CDCLK_LIMIT_MASK;
2204 int max_cdclk, vco;
2205
2206 vco = dev_priv->skl_preferred_vco_freq;
2207 WARN_ON(vco != 8100000 && vco != 8640000);
2208
2209 /*
2210 * Use the lower (vco 8640) cdclk values as a
2211 * first guess. skl_calc_cdclk() will correct it
2212 * if the preferred vco is 8100 instead.
2213 */
2214 if (limit == SKL_DFSM_CDCLK_LIMIT_675)
2215 max_cdclk = 617143;
2216 else if (limit == SKL_DFSM_CDCLK_LIMIT_540)
2217 max_cdclk = 540000;
2218 else if (limit == SKL_DFSM_CDCLK_LIMIT_450)
2219 max_cdclk = 432000;
2220 else
2221 max_cdclk = 308571;
2222
2223 dev_priv->max_cdclk_freq = skl_calc_cdclk(max_cdclk, vco);
2224 } else if (IS_GEMINILAKE(dev_priv)) {
2225 dev_priv->max_cdclk_freq = 316800;
2226 } else if (IS_BROXTON(dev_priv)) {
2227 dev_priv->max_cdclk_freq = 624000;
2228 } else if (IS_BROADWELL(dev_priv)) {
2229 /*
2230 * FIXME with extra cooling we can allow
2231 * 540 MHz for ULX and 675 Mhz for ULT.
2232 * How can we know if extra cooling is
2233 * available? PCI ID, VTB, something else?
2234 */
2235 if (I915_READ(FUSE_STRAP) & HSW_CDCLK_LIMIT)
2236 dev_priv->max_cdclk_freq = 450000;
2237 else if (IS_BDW_ULX(dev_priv))
2238 dev_priv->max_cdclk_freq = 450000;
2239 else if (IS_BDW_ULT(dev_priv))
2240 dev_priv->max_cdclk_freq = 540000;
2241 else
2242 dev_priv->max_cdclk_freq = 675000;
2243 } else if (IS_CHERRYVIEW(dev_priv)) {
2244 dev_priv->max_cdclk_freq = 320000;
2245 } else if (IS_VALLEYVIEW(dev_priv)) {
2246 dev_priv->max_cdclk_freq = 400000;
2247 } else {
2248 /* otherwise assume cdclk is fixed */
49cd97a3 2249 dev_priv->max_cdclk_freq = dev_priv->cdclk.hw.cdclk;
7ff89ca2
VS
2250 }
2251
2252 dev_priv->max_dotclk_freq = intel_compute_max_dotclk(dev_priv);
2253
2254 DRM_DEBUG_DRIVER("Max CD clock rate: %d kHz\n",
2255 dev_priv->max_cdclk_freq);
2256
2257 DRM_DEBUG_DRIVER("Max dotclock rate: %d kHz\n",
2258 dev_priv->max_dotclk_freq);
2259}
2260
2261/**
2262 * intel_update_cdclk - Determine the current CDCLK frequency
2263 * @dev_priv: i915 device
2264 *
2265 * Determine the current CDCLK frequency.
2266 */
2267void intel_update_cdclk(struct drm_i915_private *dev_priv)
2268{
49cd97a3 2269 dev_priv->display.get_cdclk(dev_priv, &dev_priv->cdclk.hw);
7ff89ca2 2270
49cd97a3
VS
2271 DRM_DEBUG_DRIVER("Current CD clock rate: %d kHz, VCO: %d kHz, ref: %d kHz\n",
2272 dev_priv->cdclk.hw.cdclk, dev_priv->cdclk.hw.vco,
2273 dev_priv->cdclk.hw.ref);
7ff89ca2
VS
2274
2275 /*
2276 * 9:0 CMBUS [sic] CDCLK frequency (cdfreq):
2277 * Programmng [sic] note: bit[9:2] should be programmed to the number
2278 * of cdclk that generates 4MHz reference clock freq which is used to
2279 * generate GMBus clock. This will vary with the cdclk freq.
2280 */
2281 if (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv))
2282 I915_WRITE(GMBUSFREQ_VLV,
49cd97a3 2283 DIV_ROUND_UP(dev_priv->cdclk.hw.cdclk, 1000));
7ff89ca2
VS
2284}
2285
9d81a997
RV
2286static int cnp_rawclk(struct drm_i915_private *dev_priv)
2287{
2288 u32 rawclk;
2289 int divider, fraction;
2290
2291 if (I915_READ(SFUSE_STRAP) & SFUSE_STRAP_RAW_FREQUENCY) {
2292 /* 24 MHz */
2293 divider = 24000;
2294 fraction = 0;
2295 } else {
2296 /* 19.2 MHz */
2297 divider = 19000;
2298 fraction = 200;
2299 }
2300
2301 rawclk = CNP_RAWCLK_DIV((divider / 1000) - 1);
2302 if (fraction)
2303 rawclk |= CNP_RAWCLK_FRAC(DIV_ROUND_CLOSEST(1000,
2304 fraction) - 1);
2305
2306 I915_WRITE(PCH_RAWCLK_FREQ, rawclk);
2307 return divider + fraction;
2308}
2309
7ff89ca2
VS
2310static int pch_rawclk(struct drm_i915_private *dev_priv)
2311{
2312 return (I915_READ(PCH_RAWCLK_FREQ) & RAWCLK_FREQ_MASK) * 1000;
2313}
2314
2315static int vlv_hrawclk(struct drm_i915_private *dev_priv)
2316{
2317 /* RAWCLK_FREQ_VLV register updated from power well code */
2318 return vlv_get_cck_clock_hpll(dev_priv, "hrawclk",
2319 CCK_DISPLAY_REF_CLOCK_CONTROL);
2320}
2321
2322static int g4x_hrawclk(struct drm_i915_private *dev_priv)
2323{
2324 uint32_t clkcfg;
2325
2326 /* hrawclock is 1/4 the FSB frequency */
2327 clkcfg = I915_READ(CLKCFG);
2328 switch (clkcfg & CLKCFG_FSB_MASK) {
2329 case CLKCFG_FSB_400:
2330 return 100000;
2331 case CLKCFG_FSB_533:
2332 return 133333;
2333 case CLKCFG_FSB_667:
2334 return 166667;
2335 case CLKCFG_FSB_800:
2336 return 200000;
2337 case CLKCFG_FSB_1067:
6f38123e 2338 case CLKCFG_FSB_1067_ALT:
7ff89ca2
VS
2339 return 266667;
2340 case CLKCFG_FSB_1333:
6f38123e 2341 case CLKCFG_FSB_1333_ALT:
7ff89ca2 2342 return 333333;
7ff89ca2
VS
2343 default:
2344 return 133333;
2345 }
2346}
2347
2348/**
2349 * intel_update_rawclk - Determine the current RAWCLK frequency
2350 * @dev_priv: i915 device
2351 *
2352 * Determine the current RAWCLK frequency. RAWCLK is a fixed
2353 * frequency clock so this needs to done only once.
2354 */
2355void intel_update_rawclk(struct drm_i915_private *dev_priv)
2356{
9d81a997
RV
2357
2358 if (HAS_PCH_CNP(dev_priv))
2359 dev_priv->rawclk_freq = cnp_rawclk(dev_priv);
2360 else if (HAS_PCH_SPLIT(dev_priv))
7ff89ca2
VS
2361 dev_priv->rawclk_freq = pch_rawclk(dev_priv);
2362 else if (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv))
2363 dev_priv->rawclk_freq = vlv_hrawclk(dev_priv);
2364 else if (IS_G4X(dev_priv) || IS_PINEVIEW(dev_priv))
2365 dev_priv->rawclk_freq = g4x_hrawclk(dev_priv);
2366 else
2367 /* no rawclk on other platforms, or no need to know it */
2368 return;
2369
2370 DRM_DEBUG_DRIVER("rawclk rate: %d kHz\n", dev_priv->rawclk_freq);
2371}
2372
2373/**
2374 * intel_init_cdclk_hooks - Initialize CDCLK related modesetting hooks
2375 * @dev_priv: i915 device
2376 */
2377void intel_init_cdclk_hooks(struct drm_i915_private *dev_priv)
2378{
b0587e4d
VS
2379 if (IS_CHERRYVIEW(dev_priv)) {
2380 dev_priv->display.set_cdclk = chv_set_cdclk;
2381 dev_priv->display.modeset_calc_cdclk =
2382 vlv_modeset_calc_cdclk;
2383 } else if (IS_VALLEYVIEW(dev_priv)) {
2384 dev_priv->display.set_cdclk = vlv_set_cdclk;
7ff89ca2
VS
2385 dev_priv->display.modeset_calc_cdclk =
2386 vlv_modeset_calc_cdclk;
2387 } else if (IS_BROADWELL(dev_priv)) {
b0587e4d 2388 dev_priv->display.set_cdclk = bdw_set_cdclk;
7ff89ca2
VS
2389 dev_priv->display.modeset_calc_cdclk =
2390 bdw_modeset_calc_cdclk;
2391 } else if (IS_GEN9_LP(dev_priv)) {
b0587e4d 2392 dev_priv->display.set_cdclk = bxt_set_cdclk;
7ff89ca2
VS
2393 dev_priv->display.modeset_calc_cdclk =
2394 bxt_modeset_calc_cdclk;
2395 } else if (IS_GEN9_BC(dev_priv)) {
b0587e4d 2396 dev_priv->display.set_cdclk = skl_set_cdclk;
7ff89ca2
VS
2397 dev_priv->display.modeset_calc_cdclk =
2398 skl_modeset_calc_cdclk;
d1999e9e
RV
2399 } else if (IS_CANNONLAKE(dev_priv)) {
2400 dev_priv->display.set_cdclk = cnl_set_cdclk;
2401 dev_priv->display.modeset_calc_cdclk =
2402 cnl_modeset_calc_cdclk;
7ff89ca2
VS
2403 }
2404
945f2672
VS
2405 if (IS_CANNONLAKE(dev_priv))
2406 dev_priv->display.get_cdclk = cnl_get_cdclk;
2407 else if (IS_GEN9_BC(dev_priv))
7ff89ca2
VS
2408 dev_priv->display.get_cdclk = skl_get_cdclk;
2409 else if (IS_GEN9_LP(dev_priv))
2410 dev_priv->display.get_cdclk = bxt_get_cdclk;
2411 else if (IS_BROADWELL(dev_priv))
2412 dev_priv->display.get_cdclk = bdw_get_cdclk;
2413 else if (IS_HASWELL(dev_priv))
2414 dev_priv->display.get_cdclk = hsw_get_cdclk;
2415 else if (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv))
2416 dev_priv->display.get_cdclk = vlv_get_cdclk;
2417 else if (IS_GEN6(dev_priv) || IS_IVYBRIDGE(dev_priv))
2418 dev_priv->display.get_cdclk = fixed_400mhz_get_cdclk;
2419 else if (IS_GEN5(dev_priv))
2420 dev_priv->display.get_cdclk = fixed_450mhz_get_cdclk;
2421 else if (IS_GM45(dev_priv))
2422 dev_priv->display.get_cdclk = gm45_get_cdclk;
6b9e441d 2423 else if (IS_G45(dev_priv))
7ff89ca2
VS
2424 dev_priv->display.get_cdclk = g33_get_cdclk;
2425 else if (IS_I965GM(dev_priv))
2426 dev_priv->display.get_cdclk = i965gm_get_cdclk;
2427 else if (IS_I965G(dev_priv))
2428 dev_priv->display.get_cdclk = fixed_400mhz_get_cdclk;
2429 else if (IS_PINEVIEW(dev_priv))
2430 dev_priv->display.get_cdclk = pnv_get_cdclk;
2431 else if (IS_G33(dev_priv))
2432 dev_priv->display.get_cdclk = g33_get_cdclk;
2433 else if (IS_I945GM(dev_priv))
2434 dev_priv->display.get_cdclk = i945gm_get_cdclk;
2435 else if (IS_I945G(dev_priv))
2436 dev_priv->display.get_cdclk = fixed_400mhz_get_cdclk;
2437 else if (IS_I915GM(dev_priv))
2438 dev_priv->display.get_cdclk = i915gm_get_cdclk;
2439 else if (IS_I915G(dev_priv))
2440 dev_priv->display.get_cdclk = fixed_333mhz_get_cdclk;
2441 else if (IS_I865G(dev_priv))
2442 dev_priv->display.get_cdclk = fixed_266mhz_get_cdclk;
2443 else if (IS_I85X(dev_priv))
2444 dev_priv->display.get_cdclk = i85x_get_cdclk;
2445 else if (IS_I845G(dev_priv))
2446 dev_priv->display.get_cdclk = fixed_200mhz_get_cdclk;
2447 else { /* 830 */
2448 WARN(!IS_I830(dev_priv),
2449 "Unknown platform. Assuming 133 MHz CDCLK\n");
2450 dev_priv->display.get_cdclk = fixed_133mhz_get_cdclk;
2451 }
2452}