drm/i915: Use cdclk_state->voltage on BDW
[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
49cd97a3
VS
788static void skl_dpll0_update(struct drm_i915_private *dev_priv,
789 struct intel_cdclk_state *cdclk_state)
7ff89ca2
VS
790{
791 u32 val;
792
49cd97a3
VS
793 cdclk_state->ref = 24000;
794 cdclk_state->vco = 0;
7ff89ca2
VS
795
796 val = I915_READ(LCPLL1_CTL);
797 if ((val & LCPLL_PLL_ENABLE) == 0)
798 return;
799
800 if (WARN_ON((val & LCPLL_PLL_LOCK) == 0))
801 return;
802
803 val = I915_READ(DPLL_CTRL1);
804
805 if (WARN_ON((val & (DPLL_CTRL1_HDMI_MODE(SKL_DPLL0) |
806 DPLL_CTRL1_SSC(SKL_DPLL0) |
807 DPLL_CTRL1_OVERRIDE(SKL_DPLL0))) !=
808 DPLL_CTRL1_OVERRIDE(SKL_DPLL0)))
809 return;
810
811 switch (val & DPLL_CTRL1_LINK_RATE_MASK(SKL_DPLL0)) {
812 case DPLL_CTRL1_LINK_RATE(DPLL_CTRL1_LINK_RATE_810, SKL_DPLL0):
813 case DPLL_CTRL1_LINK_RATE(DPLL_CTRL1_LINK_RATE_1350, SKL_DPLL0):
814 case DPLL_CTRL1_LINK_RATE(DPLL_CTRL1_LINK_RATE_1620, SKL_DPLL0):
815 case DPLL_CTRL1_LINK_RATE(DPLL_CTRL1_LINK_RATE_2700, SKL_DPLL0):
49cd97a3 816 cdclk_state->vco = 8100000;
7ff89ca2
VS
817 break;
818 case DPLL_CTRL1_LINK_RATE(DPLL_CTRL1_LINK_RATE_1080, SKL_DPLL0):
819 case DPLL_CTRL1_LINK_RATE(DPLL_CTRL1_LINK_RATE_2160, SKL_DPLL0):
49cd97a3 820 cdclk_state->vco = 8640000;
7ff89ca2
VS
821 break;
822 default:
823 MISSING_CASE(val & DPLL_CTRL1_LINK_RATE_MASK(SKL_DPLL0));
824 break;
825 }
826}
827
49cd97a3
VS
828static void skl_get_cdclk(struct drm_i915_private *dev_priv,
829 struct intel_cdclk_state *cdclk_state)
7ff89ca2
VS
830{
831 u32 cdctl;
832
49cd97a3 833 skl_dpll0_update(dev_priv, cdclk_state);
7ff89ca2 834
49cd97a3
VS
835 cdclk_state->cdclk = cdclk_state->ref;
836
837 if (cdclk_state->vco == 0)
838 return;
7ff89ca2
VS
839
840 cdctl = I915_READ(CDCLK_CTL);
841
49cd97a3 842 if (cdclk_state->vco == 8640000) {
7ff89ca2
VS
843 switch (cdctl & CDCLK_FREQ_SEL_MASK) {
844 case CDCLK_FREQ_450_432:
49cd97a3
VS
845 cdclk_state->cdclk = 432000;
846 break;
7ff89ca2 847 case CDCLK_FREQ_337_308:
49cd97a3
VS
848 cdclk_state->cdclk = 308571;
849 break;
7ff89ca2 850 case CDCLK_FREQ_540:
49cd97a3
VS
851 cdclk_state->cdclk = 540000;
852 break;
7ff89ca2 853 case CDCLK_FREQ_675_617:
49cd97a3
VS
854 cdclk_state->cdclk = 617143;
855 break;
7ff89ca2
VS
856 default:
857 MISSING_CASE(cdctl & CDCLK_FREQ_SEL_MASK);
49cd97a3 858 break;
7ff89ca2
VS
859 }
860 } else {
861 switch (cdctl & CDCLK_FREQ_SEL_MASK) {
862 case CDCLK_FREQ_450_432:
49cd97a3
VS
863 cdclk_state->cdclk = 450000;
864 break;
7ff89ca2 865 case CDCLK_FREQ_337_308:
49cd97a3
VS
866 cdclk_state->cdclk = 337500;
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 = 675000;
873 break;
7ff89ca2
VS
874 default:
875 MISSING_CASE(cdctl & CDCLK_FREQ_SEL_MASK);
49cd97a3 876 break;
7ff89ca2
VS
877 }
878 }
7ff89ca2
VS
879}
880
881/* convert from kHz to .1 fixpoint MHz with -1MHz offset */
882static int skl_cdclk_decimal(int cdclk)
883{
884 return DIV_ROUND_CLOSEST(cdclk - 1000, 500);
885}
886
887static void skl_set_preferred_cdclk_vco(struct drm_i915_private *dev_priv,
888 int vco)
889{
890 bool changed = dev_priv->skl_preferred_vco_freq != vco;
891
892 dev_priv->skl_preferred_vco_freq = vco;
893
894 if (changed)
895 intel_update_max_cdclk(dev_priv);
896}
897
898static void skl_dpll0_enable(struct drm_i915_private *dev_priv, int vco)
899{
900 int min_cdclk = skl_calc_cdclk(0, vco);
901 u32 val;
902
903 WARN_ON(vco != 8100000 && vco != 8640000);
904
905 /* select the minimum CDCLK before enabling DPLL 0 */
906 val = CDCLK_FREQ_337_308 | skl_cdclk_decimal(min_cdclk);
907 I915_WRITE(CDCLK_CTL, val);
908 POSTING_READ(CDCLK_CTL);
909
910 /*
911 * We always enable DPLL0 with the lowest link rate possible, but still
912 * taking into account the VCO required to operate the eDP panel at the
913 * desired frequency. The usual DP link rates operate with a VCO of
914 * 8100 while the eDP 1.4 alternate link rates need a VCO of 8640.
915 * The modeset code is responsible for the selection of the exact link
916 * rate later on, with the constraint of choosing a frequency that
917 * works with vco.
918 */
919 val = I915_READ(DPLL_CTRL1);
920
921 val &= ~(DPLL_CTRL1_HDMI_MODE(SKL_DPLL0) | DPLL_CTRL1_SSC(SKL_DPLL0) |
922 DPLL_CTRL1_LINK_RATE_MASK(SKL_DPLL0));
923 val |= DPLL_CTRL1_OVERRIDE(SKL_DPLL0);
924 if (vco == 8640000)
925 val |= DPLL_CTRL1_LINK_RATE(DPLL_CTRL1_LINK_RATE_1080,
926 SKL_DPLL0);
927 else
928 val |= DPLL_CTRL1_LINK_RATE(DPLL_CTRL1_LINK_RATE_810,
929 SKL_DPLL0);
930
931 I915_WRITE(DPLL_CTRL1, val);
932 POSTING_READ(DPLL_CTRL1);
933
934 I915_WRITE(LCPLL1_CTL, I915_READ(LCPLL1_CTL) | LCPLL_PLL_ENABLE);
935
936 if (intel_wait_for_register(dev_priv,
937 LCPLL1_CTL, LCPLL_PLL_LOCK, LCPLL_PLL_LOCK,
938 5))
939 DRM_ERROR("DPLL0 not locked\n");
940
49cd97a3 941 dev_priv->cdclk.hw.vco = vco;
7ff89ca2
VS
942
943 /* We'll want to keep using the current vco from now on. */
944 skl_set_preferred_cdclk_vco(dev_priv, vco);
945}
946
947static void skl_dpll0_disable(struct drm_i915_private *dev_priv)
948{
949 I915_WRITE(LCPLL1_CTL, I915_READ(LCPLL1_CTL) & ~LCPLL_PLL_ENABLE);
950 if (intel_wait_for_register(dev_priv,
951 LCPLL1_CTL, LCPLL_PLL_LOCK, 0,
952 1))
953 DRM_ERROR("Couldn't disable DPLL0\n");
954
49cd97a3 955 dev_priv->cdclk.hw.vco = 0;
7ff89ca2
VS
956}
957
958static void skl_set_cdclk(struct drm_i915_private *dev_priv,
83c5fda7 959 const struct intel_cdclk_state *cdclk_state)
7ff89ca2 960{
83c5fda7
VS
961 int cdclk = cdclk_state->cdclk;
962 int vco = cdclk_state->vco;
7ff89ca2
VS
963 u32 freq_select, pcu_ack;
964 int ret;
965
9f817501 966 mutex_lock(&dev_priv->pcu_lock);
7ff89ca2
VS
967 ret = skl_pcode_request(dev_priv, SKL_PCODE_CDCLK_CONTROL,
968 SKL_CDCLK_PREPARE_FOR_CHANGE,
969 SKL_CDCLK_READY_FOR_CHANGE,
970 SKL_CDCLK_READY_FOR_CHANGE, 3);
9f817501 971 mutex_unlock(&dev_priv->pcu_lock);
7ff89ca2
VS
972 if (ret) {
973 DRM_ERROR("Failed to inform PCU about cdclk change (%d)\n",
974 ret);
975 return;
976 }
977
978 /* set CDCLK_CTL */
979 switch (cdclk) {
2b58417f
VS
980 default:
981 WARN_ON(cdclk != dev_priv->cdclk.hw.ref);
982 WARN_ON(vco != 0);
983 /* fall through */
984 case 308571:
985 case 337500:
986 freq_select = CDCLK_FREQ_337_308;
987 pcu_ack = 0;
988 break;
7ff89ca2
VS
989 case 450000:
990 case 432000:
991 freq_select = CDCLK_FREQ_450_432;
992 pcu_ack = 1;
993 break;
994 case 540000:
995 freq_select = CDCLK_FREQ_540;
996 pcu_ack = 2;
997 break;
7ff89ca2
VS
998 case 617143:
999 case 675000:
1000 freq_select = CDCLK_FREQ_675_617;
1001 pcu_ack = 3;
1002 break;
1003 }
1004
49cd97a3
VS
1005 if (dev_priv->cdclk.hw.vco != 0 &&
1006 dev_priv->cdclk.hw.vco != vco)
7ff89ca2
VS
1007 skl_dpll0_disable(dev_priv);
1008
49cd97a3 1009 if (dev_priv->cdclk.hw.vco != vco)
7ff89ca2
VS
1010 skl_dpll0_enable(dev_priv, vco);
1011
1012 I915_WRITE(CDCLK_CTL, freq_select | skl_cdclk_decimal(cdclk));
1013 POSTING_READ(CDCLK_CTL);
1014
1015 /* inform PCU of the change */
9f817501 1016 mutex_lock(&dev_priv->pcu_lock);
7ff89ca2 1017 sandybridge_pcode_write(dev_priv, SKL_PCODE_CDCLK_CONTROL, pcu_ack);
9f817501 1018 mutex_unlock(&dev_priv->pcu_lock);
7ff89ca2
VS
1019
1020 intel_update_cdclk(dev_priv);
1021}
1022
1023static void skl_sanitize_cdclk(struct drm_i915_private *dev_priv)
1024{
1025 uint32_t cdctl, expected;
1026
1027 /*
1028 * check if the pre-os initialized the display
1029 * There is SWF18 scratchpad register defined which is set by the
1030 * pre-os which can be used by the OS drivers to check the status
1031 */
1032 if ((I915_READ(SWF_ILK(0x18)) & 0x00FFFFFF) == 0)
1033 goto sanitize;
1034
1035 intel_update_cdclk(dev_priv);
1036 /* Is PLL enabled and locked ? */
49cd97a3
VS
1037 if (dev_priv->cdclk.hw.vco == 0 ||
1038 dev_priv->cdclk.hw.cdclk == dev_priv->cdclk.hw.ref)
7ff89ca2
VS
1039 goto sanitize;
1040
1041 /* DPLL okay; verify the cdclock
1042 *
1043 * Noticed in some instances that the freq selection is correct but
1044 * decimal part is programmed wrong from BIOS where pre-os does not
1045 * enable display. Verify the same as well.
1046 */
1047 cdctl = I915_READ(CDCLK_CTL);
1048 expected = (cdctl & CDCLK_FREQ_SEL_MASK) |
49cd97a3 1049 skl_cdclk_decimal(dev_priv->cdclk.hw.cdclk);
7ff89ca2
VS
1050 if (cdctl == expected)
1051 /* All well; nothing to sanitize */
1052 return;
1053
1054sanitize:
1055 DRM_DEBUG_KMS("Sanitizing cdclk programmed by pre-os\n");
1056
1057 /* force cdclk programming */
49cd97a3 1058 dev_priv->cdclk.hw.cdclk = 0;
7ff89ca2 1059 /* force full PLL disable + enable */
49cd97a3 1060 dev_priv->cdclk.hw.vco = -1;
7ff89ca2
VS
1061}
1062
1063/**
1064 * skl_init_cdclk - Initialize CDCLK on SKL
1065 * @dev_priv: i915 device
1066 *
1067 * Initialize CDCLK for SKL and derivatives. This is generally
1068 * done only during the display core initialization sequence,
1069 * after which the DMC will take care of turning CDCLK off/on
1070 * as needed.
1071 */
1072void skl_init_cdclk(struct drm_i915_private *dev_priv)
1073{
83c5fda7 1074 struct intel_cdclk_state cdclk_state;
7ff89ca2
VS
1075
1076 skl_sanitize_cdclk(dev_priv);
1077
49cd97a3
VS
1078 if (dev_priv->cdclk.hw.cdclk != 0 &&
1079 dev_priv->cdclk.hw.vco != 0) {
7ff89ca2
VS
1080 /*
1081 * Use the current vco as our initial
1082 * guess as to what the preferred vco is.
1083 */
1084 if (dev_priv->skl_preferred_vco_freq == 0)
1085 skl_set_preferred_cdclk_vco(dev_priv,
49cd97a3 1086 dev_priv->cdclk.hw.vco);
7ff89ca2
VS
1087 return;
1088 }
1089
83c5fda7
VS
1090 cdclk_state = dev_priv->cdclk.hw;
1091
1092 cdclk_state.vco = dev_priv->skl_preferred_vco_freq;
1093 if (cdclk_state.vco == 0)
1094 cdclk_state.vco = 8100000;
1095 cdclk_state.cdclk = skl_calc_cdclk(0, cdclk_state.vco);
7ff89ca2 1096
83c5fda7 1097 skl_set_cdclk(dev_priv, &cdclk_state);
7ff89ca2
VS
1098}
1099
1100/**
1101 * skl_uninit_cdclk - Uninitialize CDCLK on SKL
1102 * @dev_priv: i915 device
1103 *
1104 * Uninitialize CDCLK for SKL and derivatives. This is done only
1105 * during the display core uninitialization sequence.
1106 */
1107void skl_uninit_cdclk(struct drm_i915_private *dev_priv)
1108{
83c5fda7
VS
1109 struct intel_cdclk_state cdclk_state = dev_priv->cdclk.hw;
1110
1111 cdclk_state.cdclk = cdclk_state.ref;
1112 cdclk_state.vco = 0;
1113
1114 skl_set_cdclk(dev_priv, &cdclk_state);
7ff89ca2
VS
1115}
1116
d305e061 1117static int bxt_calc_cdclk(int min_cdclk)
7ff89ca2 1118{
d305e061 1119 if (min_cdclk > 576000)
7ff89ca2 1120 return 624000;
d305e061 1121 else if (min_cdclk > 384000)
7ff89ca2 1122 return 576000;
d305e061 1123 else if (min_cdclk > 288000)
7ff89ca2 1124 return 384000;
d305e061 1125 else if (min_cdclk > 144000)
7ff89ca2
VS
1126 return 288000;
1127 else
1128 return 144000;
1129}
1130
d305e061 1131static int glk_calc_cdclk(int min_cdclk)
7ff89ca2 1132{
d305e061 1133 if (min_cdclk > 158400)
7ff89ca2 1134 return 316800;
d305e061 1135 else if (min_cdclk > 79200)
7ff89ca2
VS
1136 return 158400;
1137 else
1138 return 79200;
1139}
1140
1141static int bxt_de_pll_vco(struct drm_i915_private *dev_priv, int cdclk)
1142{
1143 int ratio;
1144
49cd97a3 1145 if (cdclk == dev_priv->cdclk.hw.ref)
7ff89ca2
VS
1146 return 0;
1147
1148 switch (cdclk) {
1149 default:
1150 MISSING_CASE(cdclk);
2b58417f 1151 /* fall through */
7ff89ca2
VS
1152 case 144000:
1153 case 288000:
1154 case 384000:
1155 case 576000:
1156 ratio = 60;
1157 break;
1158 case 624000:
1159 ratio = 65;
1160 break;
1161 }
1162
49cd97a3 1163 return dev_priv->cdclk.hw.ref * ratio;
7ff89ca2
VS
1164}
1165
1166static int glk_de_pll_vco(struct drm_i915_private *dev_priv, int cdclk)
1167{
1168 int ratio;
1169
49cd97a3 1170 if (cdclk == dev_priv->cdclk.hw.ref)
7ff89ca2
VS
1171 return 0;
1172
1173 switch (cdclk) {
1174 default:
1175 MISSING_CASE(cdclk);
2b58417f 1176 /* fall through */
7ff89ca2
VS
1177 case 79200:
1178 case 158400:
1179 case 316800:
1180 ratio = 33;
1181 break;
1182 }
1183
49cd97a3 1184 return dev_priv->cdclk.hw.ref * ratio;
7ff89ca2
VS
1185}
1186
49cd97a3
VS
1187static void bxt_de_pll_update(struct drm_i915_private *dev_priv,
1188 struct intel_cdclk_state *cdclk_state)
7ff89ca2
VS
1189{
1190 u32 val;
1191
49cd97a3
VS
1192 cdclk_state->ref = 19200;
1193 cdclk_state->vco = 0;
7ff89ca2
VS
1194
1195 val = I915_READ(BXT_DE_PLL_ENABLE);
1196 if ((val & BXT_DE_PLL_PLL_ENABLE) == 0)
1197 return;
1198
1199 if (WARN_ON((val & BXT_DE_PLL_LOCK) == 0))
1200 return;
1201
1202 val = I915_READ(BXT_DE_PLL_CTL);
49cd97a3 1203 cdclk_state->vco = (val & BXT_DE_PLL_RATIO_MASK) * cdclk_state->ref;
7ff89ca2
VS
1204}
1205
49cd97a3
VS
1206static void bxt_get_cdclk(struct drm_i915_private *dev_priv,
1207 struct intel_cdclk_state *cdclk_state)
7ff89ca2
VS
1208{
1209 u32 divider;
49cd97a3 1210 int div;
7ff89ca2 1211
49cd97a3 1212 bxt_de_pll_update(dev_priv, cdclk_state);
7ff89ca2 1213
49cd97a3
VS
1214 cdclk_state->cdclk = cdclk_state->ref;
1215
1216 if (cdclk_state->vco == 0)
1217 return;
7ff89ca2
VS
1218
1219 divider = I915_READ(CDCLK_CTL) & BXT_CDCLK_CD2X_DIV_SEL_MASK;
1220
1221 switch (divider) {
1222 case BXT_CDCLK_CD2X_DIV_SEL_1:
1223 div = 2;
1224 break;
1225 case BXT_CDCLK_CD2X_DIV_SEL_1_5:
1226 WARN(IS_GEMINILAKE(dev_priv), "Unsupported divider\n");
1227 div = 3;
1228 break;
1229 case BXT_CDCLK_CD2X_DIV_SEL_2:
1230 div = 4;
1231 break;
1232 case BXT_CDCLK_CD2X_DIV_SEL_4:
1233 div = 8;
1234 break;
1235 default:
1236 MISSING_CASE(divider);
49cd97a3 1237 return;
7ff89ca2
VS
1238 }
1239
49cd97a3 1240 cdclk_state->cdclk = DIV_ROUND_CLOSEST(cdclk_state->vco, div);
7ff89ca2
VS
1241}
1242
1243static void bxt_de_pll_disable(struct drm_i915_private *dev_priv)
1244{
1245 I915_WRITE(BXT_DE_PLL_ENABLE, 0);
1246
1247 /* Timeout 200us */
1248 if (intel_wait_for_register(dev_priv,
1249 BXT_DE_PLL_ENABLE, BXT_DE_PLL_LOCK, 0,
1250 1))
1251 DRM_ERROR("timeout waiting for DE PLL unlock\n");
1252
49cd97a3 1253 dev_priv->cdclk.hw.vco = 0;
7ff89ca2
VS
1254}
1255
1256static void bxt_de_pll_enable(struct drm_i915_private *dev_priv, int vco)
1257{
49cd97a3 1258 int ratio = DIV_ROUND_CLOSEST(vco, dev_priv->cdclk.hw.ref);
7ff89ca2
VS
1259 u32 val;
1260
1261 val = I915_READ(BXT_DE_PLL_CTL);
1262 val &= ~BXT_DE_PLL_RATIO_MASK;
1263 val |= BXT_DE_PLL_RATIO(ratio);
1264 I915_WRITE(BXT_DE_PLL_CTL, val);
1265
1266 I915_WRITE(BXT_DE_PLL_ENABLE, BXT_DE_PLL_PLL_ENABLE);
1267
1268 /* Timeout 200us */
1269 if (intel_wait_for_register(dev_priv,
1270 BXT_DE_PLL_ENABLE,
1271 BXT_DE_PLL_LOCK,
1272 BXT_DE_PLL_LOCK,
1273 1))
1274 DRM_ERROR("timeout waiting for DE PLL lock\n");
1275
49cd97a3 1276 dev_priv->cdclk.hw.vco = vco;
7ff89ca2
VS
1277}
1278
8f0cfa4d 1279static void bxt_set_cdclk(struct drm_i915_private *dev_priv,
83c5fda7 1280 const struct intel_cdclk_state *cdclk_state)
7ff89ca2 1281{
83c5fda7
VS
1282 int cdclk = cdclk_state->cdclk;
1283 int vco = cdclk_state->vco;
7ff89ca2 1284 u32 val, divider;
8f0cfa4d 1285 int ret;
7ff89ca2 1286
7ff89ca2
VS
1287 /* cdclk = vco / 2 / div{1,1.5,2,4} */
1288 switch (DIV_ROUND_CLOSEST(vco, cdclk)) {
2b58417f
VS
1289 default:
1290 WARN_ON(cdclk != dev_priv->cdclk.hw.ref);
1291 WARN_ON(vco != 0);
1292 /* fall through */
1293 case 2:
1294 divider = BXT_CDCLK_CD2X_DIV_SEL_1;
7ff89ca2
VS
1295 break;
1296 case 3:
1297 WARN(IS_GEMINILAKE(dev_priv), "Unsupported divider\n");
1298 divider = BXT_CDCLK_CD2X_DIV_SEL_1_5;
1299 break;
2b58417f
VS
1300 case 4:
1301 divider = BXT_CDCLK_CD2X_DIV_SEL_2;
7ff89ca2 1302 break;
2b58417f
VS
1303 case 8:
1304 divider = BXT_CDCLK_CD2X_DIV_SEL_4;
7ff89ca2
VS
1305 break;
1306 }
1307
1308 /* Inform power controller of upcoming frequency change */
9f817501 1309 mutex_lock(&dev_priv->pcu_lock);
7ff89ca2
VS
1310 ret = sandybridge_pcode_write(dev_priv, HSW_PCODE_DE_WRITE_FREQ_REQ,
1311 0x80000000);
9f817501 1312 mutex_unlock(&dev_priv->pcu_lock);
7ff89ca2
VS
1313
1314 if (ret) {
1315 DRM_ERROR("PCode CDCLK freq change notify failed (err %d, freq %d)\n",
1316 ret, cdclk);
1317 return;
1318 }
1319
49cd97a3
VS
1320 if (dev_priv->cdclk.hw.vco != 0 &&
1321 dev_priv->cdclk.hw.vco != vco)
7ff89ca2
VS
1322 bxt_de_pll_disable(dev_priv);
1323
49cd97a3 1324 if (dev_priv->cdclk.hw.vco != vco)
7ff89ca2
VS
1325 bxt_de_pll_enable(dev_priv, vco);
1326
1327 val = divider | skl_cdclk_decimal(cdclk);
1328 /*
1329 * FIXME if only the cd2x divider needs changing, it could be done
1330 * without shutting off the pipe (if only one pipe is active).
1331 */
1332 val |= BXT_CDCLK_CD2X_PIPE_NONE;
1333 /*
1334 * Disable SSA Precharge when CD clock frequency < 500 MHz,
1335 * enable otherwise.
1336 */
1337 if (cdclk >= 500000)
1338 val |= BXT_CDCLK_SSA_PRECHARGE_ENABLE;
1339 I915_WRITE(CDCLK_CTL, val);
1340
9f817501 1341 mutex_lock(&dev_priv->pcu_lock);
7ff89ca2
VS
1342 ret = sandybridge_pcode_write(dev_priv, HSW_PCODE_DE_WRITE_FREQ_REQ,
1343 DIV_ROUND_UP(cdclk, 25000));
9f817501 1344 mutex_unlock(&dev_priv->pcu_lock);
7ff89ca2
VS
1345
1346 if (ret) {
1347 DRM_ERROR("PCode CDCLK freq set failed, (err %d, freq %d)\n",
1348 ret, cdclk);
1349 return;
1350 }
1351
1352 intel_update_cdclk(dev_priv);
1353}
1354
1355static void bxt_sanitize_cdclk(struct drm_i915_private *dev_priv)
1356{
1357 u32 cdctl, expected;
1358
1359 intel_update_cdclk(dev_priv);
1360
49cd97a3
VS
1361 if (dev_priv->cdclk.hw.vco == 0 ||
1362 dev_priv->cdclk.hw.cdclk == dev_priv->cdclk.hw.ref)
7ff89ca2
VS
1363 goto sanitize;
1364
1365 /* DPLL okay; verify the cdclock
1366 *
1367 * Some BIOS versions leave an incorrect decimal frequency value and
1368 * set reserved MBZ bits in CDCLK_CTL at least during exiting from S4,
1369 * so sanitize this register.
1370 */
1371 cdctl = I915_READ(CDCLK_CTL);
1372 /*
1373 * Let's ignore the pipe field, since BIOS could have configured the
1374 * dividers both synching to an active pipe, or asynchronously
1375 * (PIPE_NONE).
1376 */
1377 cdctl &= ~BXT_CDCLK_CD2X_PIPE_NONE;
1378
1379 expected = (cdctl & BXT_CDCLK_CD2X_DIV_SEL_MASK) |
49cd97a3 1380 skl_cdclk_decimal(dev_priv->cdclk.hw.cdclk);
7ff89ca2
VS
1381 /*
1382 * Disable SSA Precharge when CD clock frequency < 500 MHz,
1383 * enable otherwise.
1384 */
49cd97a3 1385 if (dev_priv->cdclk.hw.cdclk >= 500000)
7ff89ca2
VS
1386 expected |= BXT_CDCLK_SSA_PRECHARGE_ENABLE;
1387
1388 if (cdctl == expected)
1389 /* All well; nothing to sanitize */
1390 return;
1391
1392sanitize:
1393 DRM_DEBUG_KMS("Sanitizing cdclk programmed by pre-os\n");
1394
1395 /* force cdclk programming */
49cd97a3 1396 dev_priv->cdclk.hw.cdclk = 0;
7ff89ca2
VS
1397
1398 /* force full PLL disable + enable */
49cd97a3 1399 dev_priv->cdclk.hw.vco = -1;
7ff89ca2
VS
1400}
1401
1402/**
1403 * bxt_init_cdclk - Initialize CDCLK on BXT
1404 * @dev_priv: i915 device
1405 *
1406 * Initialize CDCLK for BXT and derivatives. This is generally
1407 * done only during the display core initialization sequence,
1408 * after which the DMC will take care of turning CDCLK off/on
1409 * as needed.
1410 */
1411void bxt_init_cdclk(struct drm_i915_private *dev_priv)
1412{
83c5fda7 1413 struct intel_cdclk_state cdclk_state;
7ff89ca2
VS
1414
1415 bxt_sanitize_cdclk(dev_priv);
1416
49cd97a3
VS
1417 if (dev_priv->cdclk.hw.cdclk != 0 &&
1418 dev_priv->cdclk.hw.vco != 0)
7ff89ca2
VS
1419 return;
1420
83c5fda7
VS
1421 cdclk_state = dev_priv->cdclk.hw;
1422
7ff89ca2
VS
1423 /*
1424 * FIXME:
1425 * - The initial CDCLK needs to be read from VBT.
1426 * Need to make this change after VBT has changes for BXT.
1427 */
8f0cfa4d 1428 if (IS_GEMINILAKE(dev_priv)) {
83c5fda7
VS
1429 cdclk_state.cdclk = glk_calc_cdclk(0);
1430 cdclk_state.vco = glk_de_pll_vco(dev_priv, cdclk_state.cdclk);
8f0cfa4d 1431 } else {
83c5fda7
VS
1432 cdclk_state.cdclk = bxt_calc_cdclk(0);
1433 cdclk_state.vco = bxt_de_pll_vco(dev_priv, cdclk_state.cdclk);
8f0cfa4d 1434 }
7ff89ca2 1435
83c5fda7 1436 bxt_set_cdclk(dev_priv, &cdclk_state);
7ff89ca2
VS
1437}
1438
1439/**
1440 * bxt_uninit_cdclk - Uninitialize CDCLK on BXT
1441 * @dev_priv: i915 device
1442 *
1443 * Uninitialize CDCLK for BXT and derivatives. This is done only
1444 * during the display core uninitialization sequence.
1445 */
1446void bxt_uninit_cdclk(struct drm_i915_private *dev_priv)
1447{
83c5fda7
VS
1448 struct intel_cdclk_state cdclk_state = dev_priv->cdclk.hw;
1449
1450 cdclk_state.cdclk = cdclk_state.ref;
1451 cdclk_state.vco = 0;
1452
1453 bxt_set_cdclk(dev_priv, &cdclk_state);
49cd97a3
VS
1454}
1455
d305e061 1456static int cnl_calc_cdclk(int min_cdclk)
d1999e9e 1457{
d305e061 1458 if (min_cdclk > 336000)
d1999e9e 1459 return 528000;
d305e061 1460 else if (min_cdclk > 168000)
d1999e9e
RV
1461 return 336000;
1462 else
1463 return 168000;
1464}
1465
945f2672
VS
1466static void cnl_cdclk_pll_update(struct drm_i915_private *dev_priv,
1467 struct intel_cdclk_state *cdclk_state)
1468{
1469 u32 val;
1470
1471 if (I915_READ(SKL_DSSM) & CNL_DSSM_CDCLK_PLL_REFCLK_24MHz)
1472 cdclk_state->ref = 24000;
1473 else
1474 cdclk_state->ref = 19200;
1475
1476 cdclk_state->vco = 0;
1477
1478 val = I915_READ(BXT_DE_PLL_ENABLE);
1479 if ((val & BXT_DE_PLL_PLL_ENABLE) == 0)
1480 return;
1481
1482 if (WARN_ON((val & BXT_DE_PLL_LOCK) == 0))
1483 return;
1484
1485 cdclk_state->vco = (val & CNL_CDCLK_PLL_RATIO_MASK) * cdclk_state->ref;
1486}
1487
1488static void cnl_get_cdclk(struct drm_i915_private *dev_priv,
1489 struct intel_cdclk_state *cdclk_state)
1490{
1491 u32 divider;
1492 int div;
1493
1494 cnl_cdclk_pll_update(dev_priv, cdclk_state);
1495
1496 cdclk_state->cdclk = cdclk_state->ref;
1497
1498 if (cdclk_state->vco == 0)
1499 return;
1500
1501 divider = I915_READ(CDCLK_CTL) & BXT_CDCLK_CD2X_DIV_SEL_MASK;
1502
1503 switch (divider) {
1504 case BXT_CDCLK_CD2X_DIV_SEL_1:
1505 div = 2;
1506 break;
1507 case BXT_CDCLK_CD2X_DIV_SEL_2:
1508 div = 4;
1509 break;
1510 default:
1511 MISSING_CASE(divider);
1512 return;
1513 }
1514
1515 cdclk_state->cdclk = DIV_ROUND_CLOSEST(cdclk_state->vco, div);
1516}
1517
ef4f7a68
VS
1518static void cnl_cdclk_pll_disable(struct drm_i915_private *dev_priv)
1519{
1520 u32 val;
1521
1522 val = I915_READ(BXT_DE_PLL_ENABLE);
1523 val &= ~BXT_DE_PLL_PLL_ENABLE;
1524 I915_WRITE(BXT_DE_PLL_ENABLE, val);
1525
1526 /* Timeout 200us */
1527 if (wait_for((I915_READ(BXT_DE_PLL_ENABLE) & BXT_DE_PLL_LOCK) == 0, 1))
1528 DRM_ERROR("timout waiting for CDCLK PLL unlock\n");
1529
1530 dev_priv->cdclk.hw.vco = 0;
1531}
1532
1533static void cnl_cdclk_pll_enable(struct drm_i915_private *dev_priv, int vco)
1534{
1535 int ratio = DIV_ROUND_CLOSEST(vco, dev_priv->cdclk.hw.ref);
1536 u32 val;
1537
1538 val = CNL_CDCLK_PLL_RATIO(ratio);
1539 I915_WRITE(BXT_DE_PLL_ENABLE, val);
1540
1541 val |= BXT_DE_PLL_PLL_ENABLE;
1542 I915_WRITE(BXT_DE_PLL_ENABLE, val);
1543
1544 /* Timeout 200us */
1545 if (wait_for((I915_READ(BXT_DE_PLL_ENABLE) & BXT_DE_PLL_LOCK) != 0, 1))
1546 DRM_ERROR("timout waiting for CDCLK PLL lock\n");
1547
1548 dev_priv->cdclk.hw.vco = vco;
1549}
1550
ef4f7a68
VS
1551static void cnl_set_cdclk(struct drm_i915_private *dev_priv,
1552 const struct intel_cdclk_state *cdclk_state)
1553{
1554 int cdclk = cdclk_state->cdclk;
1555 int vco = cdclk_state->vco;
1556 u32 val, divider, pcu_ack;
1557 int ret;
1558
9f817501 1559 mutex_lock(&dev_priv->pcu_lock);
ef4f7a68
VS
1560 ret = skl_pcode_request(dev_priv, SKL_PCODE_CDCLK_CONTROL,
1561 SKL_CDCLK_PREPARE_FOR_CHANGE,
1562 SKL_CDCLK_READY_FOR_CHANGE,
1563 SKL_CDCLK_READY_FOR_CHANGE, 3);
9f817501 1564 mutex_unlock(&dev_priv->pcu_lock);
ef4f7a68
VS
1565 if (ret) {
1566 DRM_ERROR("Failed to inform PCU about cdclk change (%d)\n",
1567 ret);
1568 return;
1569 }
1570
1571 /* cdclk = vco / 2 / div{1,2} */
1572 switch (DIV_ROUND_CLOSEST(vco, cdclk)) {
ef4f7a68
VS
1573 default:
1574 WARN_ON(cdclk != dev_priv->cdclk.hw.ref);
1575 WARN_ON(vco != 0);
2b58417f
VS
1576 /* fall through */
1577 case 2:
ef4f7a68
VS
1578 divider = BXT_CDCLK_CD2X_DIV_SEL_1;
1579 break;
2b58417f
VS
1580 case 4:
1581 divider = BXT_CDCLK_CD2X_DIV_SEL_2;
1582 break;
ef4f7a68
VS
1583 }
1584
1585 switch (cdclk) {
1586 case 528000:
1587 pcu_ack = 2;
1588 break;
1589 case 336000:
1590 pcu_ack = 1;
1591 break;
1592 case 168000:
1593 default:
1594 pcu_ack = 0;
1595 break;
1596 }
1597
1598 if (dev_priv->cdclk.hw.vco != 0 &&
1599 dev_priv->cdclk.hw.vco != vco)
1600 cnl_cdclk_pll_disable(dev_priv);
1601
1602 if (dev_priv->cdclk.hw.vco != vco)
1603 cnl_cdclk_pll_enable(dev_priv, vco);
1604
1605 val = divider | skl_cdclk_decimal(cdclk);
1606 /*
1607 * FIXME if only the cd2x divider needs changing, it could be done
1608 * without shutting off the pipe (if only one pipe is active).
1609 */
1610 val |= BXT_CDCLK_CD2X_PIPE_NONE;
1611 I915_WRITE(CDCLK_CTL, val);
1612
1613 /* inform PCU of the change */
9f817501 1614 mutex_lock(&dev_priv->pcu_lock);
ef4f7a68 1615 sandybridge_pcode_write(dev_priv, SKL_PCODE_CDCLK_CONTROL, pcu_ack);
9f817501 1616 mutex_unlock(&dev_priv->pcu_lock);
ef4f7a68
VS
1617
1618 intel_update_cdclk(dev_priv);
1619}
1620
d8d4a512
VS
1621static int cnl_cdclk_pll_vco(struct drm_i915_private *dev_priv, int cdclk)
1622{
1623 int ratio;
1624
1625 if (cdclk == dev_priv->cdclk.hw.ref)
1626 return 0;
1627
1628 switch (cdclk) {
1629 default:
1630 MISSING_CASE(cdclk);
2b58417f 1631 /* fall through */
d8d4a512
VS
1632 case 168000:
1633 case 336000:
1634 ratio = dev_priv->cdclk.hw.ref == 19200 ? 35 : 28;
1635 break;
1636 case 528000:
1637 ratio = dev_priv->cdclk.hw.ref == 19200 ? 55 : 44;
1638 break;
1639 }
1640
1641 return dev_priv->cdclk.hw.ref * ratio;
1642}
1643
1644static void cnl_sanitize_cdclk(struct drm_i915_private *dev_priv)
1645{
1646 u32 cdctl, expected;
1647
1648 intel_update_cdclk(dev_priv);
1649
1650 if (dev_priv->cdclk.hw.vco == 0 ||
1651 dev_priv->cdclk.hw.cdclk == dev_priv->cdclk.hw.ref)
1652 goto sanitize;
1653
1654 /* DPLL okay; verify the cdclock
1655 *
1656 * Some BIOS versions leave an incorrect decimal frequency value and
1657 * set reserved MBZ bits in CDCLK_CTL at least during exiting from S4,
1658 * so sanitize this register.
1659 */
1660 cdctl = I915_READ(CDCLK_CTL);
1661 /*
1662 * Let's ignore the pipe field, since BIOS could have configured the
1663 * dividers both synching to an active pipe, or asynchronously
1664 * (PIPE_NONE).
1665 */
1666 cdctl &= ~BXT_CDCLK_CD2X_PIPE_NONE;
1667
1668 expected = (cdctl & BXT_CDCLK_CD2X_DIV_SEL_MASK) |
1669 skl_cdclk_decimal(dev_priv->cdclk.hw.cdclk);
1670
1671 if (cdctl == expected)
1672 /* All well; nothing to sanitize */
1673 return;
1674
1675sanitize:
1676 DRM_DEBUG_KMS("Sanitizing cdclk programmed by pre-os\n");
1677
1678 /* force cdclk programming */
1679 dev_priv->cdclk.hw.cdclk = 0;
1680
1681 /* force full PLL disable + enable */
1682 dev_priv->cdclk.hw.vco = -1;
1683}
1684
1685/**
1686 * cnl_init_cdclk - Initialize CDCLK on CNL
1687 * @dev_priv: i915 device
1688 *
1689 * Initialize CDCLK for CNL. This is generally
1690 * done only during the display core initialization sequence,
1691 * after which the DMC will take care of turning CDCLK off/on
1692 * as needed.
1693 */
1694void cnl_init_cdclk(struct drm_i915_private *dev_priv)
1695{
1696 struct intel_cdclk_state cdclk_state;
1697
1698 cnl_sanitize_cdclk(dev_priv);
1699
1700 if (dev_priv->cdclk.hw.cdclk != 0 &&
1701 dev_priv->cdclk.hw.vco != 0)
1702 return;
1703
1704 cdclk_state = dev_priv->cdclk.hw;
1705
d1999e9e 1706 cdclk_state.cdclk = cnl_calc_cdclk(0);
d8d4a512
VS
1707 cdclk_state.vco = cnl_cdclk_pll_vco(dev_priv, cdclk_state.cdclk);
1708
1709 cnl_set_cdclk(dev_priv, &cdclk_state);
1710}
1711
1712/**
1713 * cnl_uninit_cdclk - Uninitialize CDCLK on CNL
1714 * @dev_priv: i915 device
1715 *
1716 * Uninitialize CDCLK for CNL. This is done only
1717 * during the display core uninitialization sequence.
1718 */
1719void cnl_uninit_cdclk(struct drm_i915_private *dev_priv)
1720{
1721 struct intel_cdclk_state cdclk_state = dev_priv->cdclk.hw;
1722
1723 cdclk_state.cdclk = cdclk_state.ref;
1724 cdclk_state.vco = 0;
1725
1726 cnl_set_cdclk(dev_priv, &cdclk_state);
1727}
1728
49cd97a3 1729/**
64600bd5 1730 * intel_cdclk_needs_modeset - Determine if two CDCLK states require a modeset on all pipes
49cd97a3
VS
1731 * @a: first CDCLK state
1732 * @b: second CDCLK state
1733 *
1734 * Returns:
64600bd5 1735 * True if the CDCLK states require pipes to be off during reprogramming, false if not.
49cd97a3 1736 */
64600bd5 1737bool intel_cdclk_needs_modeset(const struct intel_cdclk_state *a,
49cd97a3
VS
1738 const struct intel_cdclk_state *b)
1739{
64600bd5
VS
1740 return a->cdclk != b->cdclk ||
1741 a->vco != b->vco ||
1742 a->ref != b->ref;
1743}
1744
1745/**
1746 * intel_cdclk_changed - Determine if two CDCLK states are different
1747 * @a: first CDCLK state
1748 * @b: second CDCLK state
1749 *
1750 * Returns:
1751 * True if the CDCLK states don't match, false if they do.
1752 */
1753bool intel_cdclk_changed(const struct intel_cdclk_state *a,
1754 const struct intel_cdclk_state *b)
1755{
1756 return intel_cdclk_needs_modeset(a, b) ||
1757 a->voltage_level != b->voltage_level;
7ff89ca2
VS
1758}
1759
b0587e4d
VS
1760/**
1761 * intel_set_cdclk - Push the CDCLK state to the hardware
1762 * @dev_priv: i915 device
1763 * @cdclk_state: new CDCLK state
1764 *
1765 * Program the hardware based on the passed in CDCLK state,
1766 * if necessary.
1767 */
1768void intel_set_cdclk(struct drm_i915_private *dev_priv,
1769 const struct intel_cdclk_state *cdclk_state)
1770{
64600bd5 1771 if (!intel_cdclk_changed(&dev_priv->cdclk.hw, cdclk_state))
b0587e4d
VS
1772 return;
1773
1774 if (WARN_ON_ONCE(!dev_priv->display.set_cdclk))
1775 return;
1776
64600bd5 1777 DRM_DEBUG_DRIVER("Changing CDCLK to %d kHz, VCO %d kHz, ref %d kHz, voltage_level %d\n",
b0587e4d 1778 cdclk_state->cdclk, cdclk_state->vco,
64600bd5 1779 cdclk_state->ref, cdclk_state->voltage_level);
b0587e4d
VS
1780
1781 dev_priv->display.set_cdclk(dev_priv, cdclk_state);
1782}
1783
d305e061
VS
1784static int intel_pixel_rate_to_cdclk(struct drm_i915_private *dev_priv,
1785 int pixel_rate)
1786{
1787 if (INTEL_GEN(dev_priv) >= 10)
1788 /*
1789 * FIXME: Switch to DIV_ROUND_UP(pixel_rate, 2)
1790 * once DDI clock voltage requirements are
1791 * handled correctly.
1792 */
1793 return pixel_rate;
1794 else if (IS_GEMINILAKE(dev_priv))
1795 /*
1796 * FIXME: Avoid using a pixel clock that is more than 99% of the cdclk
1797 * as a temporary workaround. Use a higher cdclk instead. (Note that
1798 * intel_compute_max_dotclk() limits the max pixel clock to 99% of max
1799 * cdclk.)
1800 */
1801 return DIV_ROUND_UP(pixel_rate * 100, 2 * 99);
1802 else if (IS_GEN9(dev_priv) ||
1803 IS_BROADWELL(dev_priv) || IS_HASWELL(dev_priv))
1804 return pixel_rate;
1805 else if (IS_CHERRYVIEW(dev_priv))
1806 return DIV_ROUND_UP(pixel_rate * 100, 95);
1807 else
1808 return DIV_ROUND_UP(pixel_rate * 100, 90);
1809}
1810
1811int intel_crtc_compute_min_cdclk(const struct intel_crtc_state *crtc_state)
7ff89ca2
VS
1812{
1813 struct drm_i915_private *dev_priv =
1814 to_i915(crtc_state->base.crtc->dev);
d305e061
VS
1815 int min_cdclk;
1816
1817 if (!crtc_state->base.enable)
1818 return 0;
1819
1820 min_cdclk = intel_pixel_rate_to_cdclk(dev_priv, crtc_state->pixel_rate);
7ff89ca2
VS
1821
1822 /* pixel rate mustn't exceed 95% of cdclk with IPS on BDW */
1823 if (IS_BROADWELL(dev_priv) && crtc_state->ips_enabled)
d305e061 1824 min_cdclk = DIV_ROUND_UP(min_cdclk * 100, 95);
7ff89ca2 1825
78cfa580
PD
1826 /* BSpec says "Do not use DisplayPort with CDCLK less than 432 MHz,
1827 * audio enabled, port width x4, and link rate HBR2 (5.4 GHz), or else
1828 * there may be audio corruption or screen corruption." This cdclk
d305e061 1829 * restriction for GLK is 316.8 MHz.
7ff89ca2
VS
1830 */
1831 if (intel_crtc_has_dp_encoder(crtc_state) &&
1832 crtc_state->has_audio &&
1833 crtc_state->port_clock >= 540000 &&
78cfa580 1834 crtc_state->lane_count == 4) {
d305e061
VS
1835 if (IS_CANNONLAKE(dev_priv) || IS_GEMINILAKE(dev_priv)) {
1836 /* Display WA #1145: glk,cnl */
1837 min_cdclk = max(316800, min_cdclk);
1838 } else if (IS_GEN9(dev_priv) || IS_BROADWELL(dev_priv)) {
1839 /* Display WA #1144: skl,bxt */
1840 min_cdclk = max(432000, min_cdclk);
1841 }
78cfa580 1842 }
7ff89ca2 1843
8cbeb06d
PD
1844 /* According to BSpec, "The CD clock frequency must be at least twice
1845 * the frequency of the Azalia BCLK." and BCLK is 96 MHz by default.
8cbeb06d 1846 */
d305e061
VS
1847 if (crtc_state->has_audio && INTEL_GEN(dev_priv) >= 9)
1848 min_cdclk = max(2 * 96000, min_cdclk);
8cbeb06d 1849
9c61de4c
VS
1850 if (min_cdclk > dev_priv->max_cdclk_freq) {
1851 DRM_DEBUG_KMS("required cdclk (%d kHz) exceeds max (%d kHz)\n",
1852 min_cdclk, dev_priv->max_cdclk_freq);
1853 return -EINVAL;
1854 }
1855
d305e061 1856 return min_cdclk;
7ff89ca2
VS
1857}
1858
d305e061 1859static int intel_compute_min_cdclk(struct drm_atomic_state *state)
7ff89ca2
VS
1860{
1861 struct intel_atomic_state *intel_state = to_intel_atomic_state(state);
1862 struct drm_i915_private *dev_priv = to_i915(state->dev);
d305e061 1863 struct intel_crtc *crtc;
7ff89ca2 1864 struct intel_crtc_state *crtc_state;
9c61de4c 1865 int min_cdclk, i;
7ff89ca2
VS
1866 enum pipe pipe;
1867
d305e061
VS
1868 memcpy(intel_state->min_cdclk, dev_priv->min_cdclk,
1869 sizeof(intel_state->min_cdclk));
7ff89ca2 1870
9c61de4c
VS
1871 for_each_new_intel_crtc_in_state(intel_state, crtc, crtc_state, i) {
1872 min_cdclk = intel_crtc_compute_min_cdclk(crtc_state);
1873 if (min_cdclk < 0)
1874 return min_cdclk;
1875
1876 intel_state->min_cdclk[i] = min_cdclk;
1877 }
7ff89ca2 1878
9c61de4c 1879 min_cdclk = 0;
7ff89ca2 1880 for_each_pipe(dev_priv, pipe)
d305e061 1881 min_cdclk = max(intel_state->min_cdclk[pipe], min_cdclk);
7ff89ca2 1882
d305e061 1883 return min_cdclk;
7ff89ca2
VS
1884}
1885
1886static int vlv_modeset_calc_cdclk(struct drm_atomic_state *state)
1887{
3d5dbb10 1888 struct drm_i915_private *dev_priv = to_i915(state->dev);
9c61de4c
VS
1889 struct intel_atomic_state *intel_state = to_intel_atomic_state(state);
1890 int min_cdclk, cdclk;
bb0f4aab 1891
9c61de4c
VS
1892 min_cdclk = intel_compute_min_cdclk(state);
1893 if (min_cdclk < 0)
1894 return min_cdclk;
7ff89ca2 1895
9c61de4c 1896 cdclk = vlv_calc_cdclk(dev_priv, min_cdclk);
7ff89ca2 1897
bb0f4aab 1898 intel_state->cdclk.logical.cdclk = cdclk;
999c5766
VS
1899 intel_state->cdclk.logical.voltage_level =
1900 vlv_calc_voltage_level(dev_priv, cdclk);
bb0f4aab
VS
1901
1902 if (!intel_state->active_crtcs) {
1903 cdclk = vlv_calc_cdclk(dev_priv, 0);
1904
1905 intel_state->cdclk.actual.cdclk = cdclk;
999c5766
VS
1906 intel_state->cdclk.actual.voltage_level =
1907 vlv_calc_voltage_level(dev_priv, cdclk);
bb0f4aab
VS
1908 } else {
1909 intel_state->cdclk.actual =
1910 intel_state->cdclk.logical;
1911 }
7ff89ca2
VS
1912
1913 return 0;
1914}
1915
7ff89ca2
VS
1916static int bdw_modeset_calc_cdclk(struct drm_atomic_state *state)
1917{
7ff89ca2 1918 struct intel_atomic_state *intel_state = to_intel_atomic_state(state);
9c61de4c
VS
1919 int min_cdclk, cdclk;
1920
1921 min_cdclk = intel_compute_min_cdclk(state);
1922 if (min_cdclk < 0)
1923 return min_cdclk;
7ff89ca2
VS
1924
1925 /*
1926 * FIXME should also account for plane ratio
1927 * once 64bpp pixel formats are supported.
1928 */
d305e061 1929 cdclk = bdw_calc_cdclk(min_cdclk);
7ff89ca2 1930
bb0f4aab 1931 intel_state->cdclk.logical.cdclk = cdclk;
d7ffaeef
VS
1932 intel_state->cdclk.logical.voltage_level =
1933 bdw_calc_voltage_level(cdclk);
bb0f4aab
VS
1934
1935 if (!intel_state->active_crtcs) {
1936 cdclk = bdw_calc_cdclk(0);
1937
1938 intel_state->cdclk.actual.cdclk = cdclk;
d7ffaeef
VS
1939 intel_state->cdclk.actual.voltage_level =
1940 bdw_calc_voltage_level(cdclk);
bb0f4aab
VS
1941 } else {
1942 intel_state->cdclk.actual =
1943 intel_state->cdclk.logical;
1944 }
7ff89ca2
VS
1945
1946 return 0;
1947}
1948
7ff89ca2
VS
1949static int skl_modeset_calc_cdclk(struct drm_atomic_state *state)
1950{
7ff89ca2 1951 struct drm_i915_private *dev_priv = to_i915(state->dev);
9c61de4c
VS
1952 struct intel_atomic_state *intel_state = to_intel_atomic_state(state);
1953 int min_cdclk, cdclk, vco;
1954
1955 min_cdclk = intel_compute_min_cdclk(state);
1956 if (min_cdclk < 0)
1957 return min_cdclk;
bb0f4aab
VS
1958
1959 vco = intel_state->cdclk.logical.vco;
1960 if (!vco)
1961 vco = dev_priv->skl_preferred_vco_freq;
7ff89ca2
VS
1962
1963 /*
1964 * FIXME should also account for plane ratio
1965 * once 64bpp pixel formats are supported.
1966 */
d305e061 1967 cdclk = skl_calc_cdclk(min_cdclk, vco);
7ff89ca2 1968
bb0f4aab
VS
1969 intel_state->cdclk.logical.vco = vco;
1970 intel_state->cdclk.logical.cdclk = cdclk;
1971
1972 if (!intel_state->active_crtcs) {
1973 cdclk = skl_calc_cdclk(0, vco);
1974
1975 intel_state->cdclk.actual.vco = vco;
1976 intel_state->cdclk.actual.cdclk = cdclk;
1977 } else {
1978 intel_state->cdclk.actual =
1979 intel_state->cdclk.logical;
1980 }
7ff89ca2
VS
1981
1982 return 0;
1983}
1984
7ff89ca2
VS
1985static int bxt_modeset_calc_cdclk(struct drm_atomic_state *state)
1986{
1987 struct drm_i915_private *dev_priv = to_i915(state->dev);
9c61de4c
VS
1988 struct intel_atomic_state *intel_state = to_intel_atomic_state(state);
1989 int min_cdclk, cdclk, vco;
1990
1991 min_cdclk = intel_compute_min_cdclk(state);
1992 if (min_cdclk < 0)
1993 return min_cdclk;
7ff89ca2 1994
bb0f4aab 1995 if (IS_GEMINILAKE(dev_priv)) {
d305e061 1996 cdclk = glk_calc_cdclk(min_cdclk);
bb0f4aab
VS
1997 vco = glk_de_pll_vco(dev_priv, cdclk);
1998 } else {
d305e061 1999 cdclk = bxt_calc_cdclk(min_cdclk);
bb0f4aab
VS
2000 vco = bxt_de_pll_vco(dev_priv, cdclk);
2001 }
2002
bb0f4aab
VS
2003 intel_state->cdclk.logical.vco = vco;
2004 intel_state->cdclk.logical.cdclk = cdclk;
7ff89ca2
VS
2005
2006 if (!intel_state->active_crtcs) {
bb0f4aab 2007 if (IS_GEMINILAKE(dev_priv)) {
7ff89ca2 2008 cdclk = glk_calc_cdclk(0);
bb0f4aab
VS
2009 vco = glk_de_pll_vco(dev_priv, cdclk);
2010 } else {
7ff89ca2 2011 cdclk = bxt_calc_cdclk(0);
bb0f4aab
VS
2012 vco = bxt_de_pll_vco(dev_priv, cdclk);
2013 }
7ff89ca2 2014
bb0f4aab
VS
2015 intel_state->cdclk.actual.vco = vco;
2016 intel_state->cdclk.actual.cdclk = cdclk;
2017 } else {
2018 intel_state->cdclk.actual =
2019 intel_state->cdclk.logical;
7ff89ca2
VS
2020 }
2021
2022 return 0;
2023}
2024
d1999e9e
RV
2025static int cnl_modeset_calc_cdclk(struct drm_atomic_state *state)
2026{
2027 struct drm_i915_private *dev_priv = to_i915(state->dev);
9c61de4c
VS
2028 struct intel_atomic_state *intel_state = to_intel_atomic_state(state);
2029 int min_cdclk, cdclk, vco;
2030
2031 min_cdclk = intel_compute_min_cdclk(state);
2032 if (min_cdclk < 0)
2033 return min_cdclk;
d1999e9e 2034
d305e061 2035 cdclk = cnl_calc_cdclk(min_cdclk);
d1999e9e
RV
2036 vco = cnl_cdclk_pll_vco(dev_priv, cdclk);
2037
d1999e9e
RV
2038 intel_state->cdclk.logical.vco = vco;
2039 intel_state->cdclk.logical.cdclk = cdclk;
2040
2041 if (!intel_state->active_crtcs) {
2042 cdclk = cnl_calc_cdclk(0);
2043 vco = cnl_cdclk_pll_vco(dev_priv, cdclk);
2044
2045 intel_state->cdclk.actual.vco = vco;
2046 intel_state->cdclk.actual.cdclk = cdclk;
2047 } else {
2048 intel_state->cdclk.actual =
2049 intel_state->cdclk.logical;
2050 }
2051
2052 return 0;
2053}
2054
7ff89ca2
VS
2055static int intel_compute_max_dotclk(struct drm_i915_private *dev_priv)
2056{
2057 int max_cdclk_freq = dev_priv->max_cdclk_freq;
2058
d305e061
VS
2059 if (INTEL_GEN(dev_priv) >= 10)
2060 /*
2061 * FIXME: Allow '2 * max_cdclk_freq'
2062 * once DDI clock voltage requirements are
2063 * handled correctly.
2064 */
2065 return max_cdclk_freq;
2066 else if (IS_GEMINILAKE(dev_priv))
97f55ca5
MC
2067 /*
2068 * FIXME: Limiting to 99% as a temporary workaround. See
d305e061 2069 * intel_min_cdclk() for details.
97f55ca5
MC
2070 */
2071 return 2 * max_cdclk_freq * 99 / 100;
d305e061
VS
2072 else if (IS_GEN9(dev_priv) ||
2073 IS_BROADWELL(dev_priv) || IS_HASWELL(dev_priv))
7ff89ca2
VS
2074 return max_cdclk_freq;
2075 else if (IS_CHERRYVIEW(dev_priv))
2076 return max_cdclk_freq*95/100;
2077 else if (INTEL_INFO(dev_priv)->gen < 4)
2078 return 2*max_cdclk_freq*90/100;
2079 else
2080 return max_cdclk_freq*90/100;
2081}
2082
2083/**
2084 * intel_update_max_cdclk - Determine the maximum support CDCLK frequency
2085 * @dev_priv: i915 device
2086 *
2087 * Determine the maximum CDCLK frequency the platform supports, and also
2088 * derive the maximum dot clock frequency the maximum CDCLK frequency
2089 * allows.
2090 */
2091void intel_update_max_cdclk(struct drm_i915_private *dev_priv)
2092{
d1999e9e
RV
2093 if (IS_CANNONLAKE(dev_priv)) {
2094 dev_priv->max_cdclk_freq = 528000;
2095 } else if (IS_GEN9_BC(dev_priv)) {
7ff89ca2
VS
2096 u32 limit = I915_READ(SKL_DFSM) & SKL_DFSM_CDCLK_LIMIT_MASK;
2097 int max_cdclk, vco;
2098
2099 vco = dev_priv->skl_preferred_vco_freq;
2100 WARN_ON(vco != 8100000 && vco != 8640000);
2101
2102 /*
2103 * Use the lower (vco 8640) cdclk values as a
2104 * first guess. skl_calc_cdclk() will correct it
2105 * if the preferred vco is 8100 instead.
2106 */
2107 if (limit == SKL_DFSM_CDCLK_LIMIT_675)
2108 max_cdclk = 617143;
2109 else if (limit == SKL_DFSM_CDCLK_LIMIT_540)
2110 max_cdclk = 540000;
2111 else if (limit == SKL_DFSM_CDCLK_LIMIT_450)
2112 max_cdclk = 432000;
2113 else
2114 max_cdclk = 308571;
2115
2116 dev_priv->max_cdclk_freq = skl_calc_cdclk(max_cdclk, vco);
2117 } else if (IS_GEMINILAKE(dev_priv)) {
2118 dev_priv->max_cdclk_freq = 316800;
2119 } else if (IS_BROXTON(dev_priv)) {
2120 dev_priv->max_cdclk_freq = 624000;
2121 } else if (IS_BROADWELL(dev_priv)) {
2122 /*
2123 * FIXME with extra cooling we can allow
2124 * 540 MHz for ULX and 675 Mhz for ULT.
2125 * How can we know if extra cooling is
2126 * available? PCI ID, VTB, something else?
2127 */
2128 if (I915_READ(FUSE_STRAP) & HSW_CDCLK_LIMIT)
2129 dev_priv->max_cdclk_freq = 450000;
2130 else if (IS_BDW_ULX(dev_priv))
2131 dev_priv->max_cdclk_freq = 450000;
2132 else if (IS_BDW_ULT(dev_priv))
2133 dev_priv->max_cdclk_freq = 540000;
2134 else
2135 dev_priv->max_cdclk_freq = 675000;
2136 } else if (IS_CHERRYVIEW(dev_priv)) {
2137 dev_priv->max_cdclk_freq = 320000;
2138 } else if (IS_VALLEYVIEW(dev_priv)) {
2139 dev_priv->max_cdclk_freq = 400000;
2140 } else {
2141 /* otherwise assume cdclk is fixed */
49cd97a3 2142 dev_priv->max_cdclk_freq = dev_priv->cdclk.hw.cdclk;
7ff89ca2
VS
2143 }
2144
2145 dev_priv->max_dotclk_freq = intel_compute_max_dotclk(dev_priv);
2146
2147 DRM_DEBUG_DRIVER("Max CD clock rate: %d kHz\n",
2148 dev_priv->max_cdclk_freq);
2149
2150 DRM_DEBUG_DRIVER("Max dotclock rate: %d kHz\n",
2151 dev_priv->max_dotclk_freq);
2152}
2153
2154/**
2155 * intel_update_cdclk - Determine the current CDCLK frequency
2156 * @dev_priv: i915 device
2157 *
2158 * Determine the current CDCLK frequency.
2159 */
2160void intel_update_cdclk(struct drm_i915_private *dev_priv)
2161{
49cd97a3 2162 dev_priv->display.get_cdclk(dev_priv, &dev_priv->cdclk.hw);
7ff89ca2 2163
49cd97a3
VS
2164 DRM_DEBUG_DRIVER("Current CD clock rate: %d kHz, VCO: %d kHz, ref: %d kHz\n",
2165 dev_priv->cdclk.hw.cdclk, dev_priv->cdclk.hw.vco,
2166 dev_priv->cdclk.hw.ref);
7ff89ca2
VS
2167
2168 /*
2169 * 9:0 CMBUS [sic] CDCLK frequency (cdfreq):
2170 * Programmng [sic] note: bit[9:2] should be programmed to the number
2171 * of cdclk that generates 4MHz reference clock freq which is used to
2172 * generate GMBus clock. This will vary with the cdclk freq.
2173 */
2174 if (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv))
2175 I915_WRITE(GMBUSFREQ_VLV,
49cd97a3 2176 DIV_ROUND_UP(dev_priv->cdclk.hw.cdclk, 1000));
7ff89ca2
VS
2177}
2178
9d81a997
RV
2179static int cnp_rawclk(struct drm_i915_private *dev_priv)
2180{
2181 u32 rawclk;
2182 int divider, fraction;
2183
2184 if (I915_READ(SFUSE_STRAP) & SFUSE_STRAP_RAW_FREQUENCY) {
2185 /* 24 MHz */
2186 divider = 24000;
2187 fraction = 0;
2188 } else {
2189 /* 19.2 MHz */
2190 divider = 19000;
2191 fraction = 200;
2192 }
2193
2194 rawclk = CNP_RAWCLK_DIV((divider / 1000) - 1);
2195 if (fraction)
2196 rawclk |= CNP_RAWCLK_FRAC(DIV_ROUND_CLOSEST(1000,
2197 fraction) - 1);
2198
2199 I915_WRITE(PCH_RAWCLK_FREQ, rawclk);
2200 return divider + fraction;
2201}
2202
7ff89ca2
VS
2203static int pch_rawclk(struct drm_i915_private *dev_priv)
2204{
2205 return (I915_READ(PCH_RAWCLK_FREQ) & RAWCLK_FREQ_MASK) * 1000;
2206}
2207
2208static int vlv_hrawclk(struct drm_i915_private *dev_priv)
2209{
2210 /* RAWCLK_FREQ_VLV register updated from power well code */
2211 return vlv_get_cck_clock_hpll(dev_priv, "hrawclk",
2212 CCK_DISPLAY_REF_CLOCK_CONTROL);
2213}
2214
2215static int g4x_hrawclk(struct drm_i915_private *dev_priv)
2216{
2217 uint32_t clkcfg;
2218
2219 /* hrawclock is 1/4 the FSB frequency */
2220 clkcfg = I915_READ(CLKCFG);
2221 switch (clkcfg & CLKCFG_FSB_MASK) {
2222 case CLKCFG_FSB_400:
2223 return 100000;
2224 case CLKCFG_FSB_533:
2225 return 133333;
2226 case CLKCFG_FSB_667:
2227 return 166667;
2228 case CLKCFG_FSB_800:
2229 return 200000;
2230 case CLKCFG_FSB_1067:
6f38123e 2231 case CLKCFG_FSB_1067_ALT:
7ff89ca2
VS
2232 return 266667;
2233 case CLKCFG_FSB_1333:
6f38123e 2234 case CLKCFG_FSB_1333_ALT:
7ff89ca2 2235 return 333333;
7ff89ca2
VS
2236 default:
2237 return 133333;
2238 }
2239}
2240
2241/**
2242 * intel_update_rawclk - Determine the current RAWCLK frequency
2243 * @dev_priv: i915 device
2244 *
2245 * Determine the current RAWCLK frequency. RAWCLK is a fixed
2246 * frequency clock so this needs to done only once.
2247 */
2248void intel_update_rawclk(struct drm_i915_private *dev_priv)
2249{
9d81a997
RV
2250
2251 if (HAS_PCH_CNP(dev_priv))
2252 dev_priv->rawclk_freq = cnp_rawclk(dev_priv);
2253 else if (HAS_PCH_SPLIT(dev_priv))
7ff89ca2
VS
2254 dev_priv->rawclk_freq = pch_rawclk(dev_priv);
2255 else if (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv))
2256 dev_priv->rawclk_freq = vlv_hrawclk(dev_priv);
2257 else if (IS_G4X(dev_priv) || IS_PINEVIEW(dev_priv))
2258 dev_priv->rawclk_freq = g4x_hrawclk(dev_priv);
2259 else
2260 /* no rawclk on other platforms, or no need to know it */
2261 return;
2262
2263 DRM_DEBUG_DRIVER("rawclk rate: %d kHz\n", dev_priv->rawclk_freq);
2264}
2265
2266/**
2267 * intel_init_cdclk_hooks - Initialize CDCLK related modesetting hooks
2268 * @dev_priv: i915 device
2269 */
2270void intel_init_cdclk_hooks(struct drm_i915_private *dev_priv)
2271{
b0587e4d
VS
2272 if (IS_CHERRYVIEW(dev_priv)) {
2273 dev_priv->display.set_cdclk = chv_set_cdclk;
2274 dev_priv->display.modeset_calc_cdclk =
2275 vlv_modeset_calc_cdclk;
2276 } else if (IS_VALLEYVIEW(dev_priv)) {
2277 dev_priv->display.set_cdclk = vlv_set_cdclk;
7ff89ca2
VS
2278 dev_priv->display.modeset_calc_cdclk =
2279 vlv_modeset_calc_cdclk;
2280 } else if (IS_BROADWELL(dev_priv)) {
b0587e4d 2281 dev_priv->display.set_cdclk = bdw_set_cdclk;
7ff89ca2
VS
2282 dev_priv->display.modeset_calc_cdclk =
2283 bdw_modeset_calc_cdclk;
2284 } else if (IS_GEN9_LP(dev_priv)) {
b0587e4d 2285 dev_priv->display.set_cdclk = bxt_set_cdclk;
7ff89ca2
VS
2286 dev_priv->display.modeset_calc_cdclk =
2287 bxt_modeset_calc_cdclk;
2288 } else if (IS_GEN9_BC(dev_priv)) {
b0587e4d 2289 dev_priv->display.set_cdclk = skl_set_cdclk;
7ff89ca2
VS
2290 dev_priv->display.modeset_calc_cdclk =
2291 skl_modeset_calc_cdclk;
d1999e9e
RV
2292 } else if (IS_CANNONLAKE(dev_priv)) {
2293 dev_priv->display.set_cdclk = cnl_set_cdclk;
2294 dev_priv->display.modeset_calc_cdclk =
2295 cnl_modeset_calc_cdclk;
7ff89ca2
VS
2296 }
2297
945f2672
VS
2298 if (IS_CANNONLAKE(dev_priv))
2299 dev_priv->display.get_cdclk = cnl_get_cdclk;
2300 else if (IS_GEN9_BC(dev_priv))
7ff89ca2
VS
2301 dev_priv->display.get_cdclk = skl_get_cdclk;
2302 else if (IS_GEN9_LP(dev_priv))
2303 dev_priv->display.get_cdclk = bxt_get_cdclk;
2304 else if (IS_BROADWELL(dev_priv))
2305 dev_priv->display.get_cdclk = bdw_get_cdclk;
2306 else if (IS_HASWELL(dev_priv))
2307 dev_priv->display.get_cdclk = hsw_get_cdclk;
2308 else if (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv))
2309 dev_priv->display.get_cdclk = vlv_get_cdclk;
2310 else if (IS_GEN6(dev_priv) || IS_IVYBRIDGE(dev_priv))
2311 dev_priv->display.get_cdclk = fixed_400mhz_get_cdclk;
2312 else if (IS_GEN5(dev_priv))
2313 dev_priv->display.get_cdclk = fixed_450mhz_get_cdclk;
2314 else if (IS_GM45(dev_priv))
2315 dev_priv->display.get_cdclk = gm45_get_cdclk;
6b9e441d 2316 else if (IS_G45(dev_priv))
7ff89ca2
VS
2317 dev_priv->display.get_cdclk = g33_get_cdclk;
2318 else if (IS_I965GM(dev_priv))
2319 dev_priv->display.get_cdclk = i965gm_get_cdclk;
2320 else if (IS_I965G(dev_priv))
2321 dev_priv->display.get_cdclk = fixed_400mhz_get_cdclk;
2322 else if (IS_PINEVIEW(dev_priv))
2323 dev_priv->display.get_cdclk = pnv_get_cdclk;
2324 else if (IS_G33(dev_priv))
2325 dev_priv->display.get_cdclk = g33_get_cdclk;
2326 else if (IS_I945GM(dev_priv))
2327 dev_priv->display.get_cdclk = i945gm_get_cdclk;
2328 else if (IS_I945G(dev_priv))
2329 dev_priv->display.get_cdclk = fixed_400mhz_get_cdclk;
2330 else if (IS_I915GM(dev_priv))
2331 dev_priv->display.get_cdclk = i915gm_get_cdclk;
2332 else if (IS_I915G(dev_priv))
2333 dev_priv->display.get_cdclk = fixed_333mhz_get_cdclk;
2334 else if (IS_I865G(dev_priv))
2335 dev_priv->display.get_cdclk = fixed_266mhz_get_cdclk;
2336 else if (IS_I85X(dev_priv))
2337 dev_priv->display.get_cdclk = i85x_get_cdclk;
2338 else if (IS_I845G(dev_priv))
2339 dev_priv->display.get_cdclk = fixed_200mhz_get_cdclk;
2340 else { /* 830 */
2341 WARN(!IS_I830(dev_priv),
2342 "Unknown platform. Assuming 133 MHz CDCLK\n");
2343 dev_priv->display.get_cdclk = fixed_133mhz_get_cdclk;
2344 }
2345}