2 * Copyright © 2006-2017 Intel Corporation
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:
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
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.
24 #include <linux/time.h>
28 #include "intel_atomic.h"
29 #include "intel_atomic_plane.h"
30 #include "intel_audio.h"
32 #include "intel_cdclk.h"
33 #include "intel_crtc.h"
36 #include "intel_display_types.h"
37 #include "intel_mchbar_regs.h"
38 #include "intel_pci_config.h"
39 #include "intel_pcode.h"
40 #include "intel_psr.h"
41 #include "intel_vdsc.h"
42 #include "skl_watermark.h"
43 #include "skl_watermark_regs.h"
44 #include "vlv_sideband.h"
49 * The display engine uses several different clocks to do its work. There
50 * are two main clocks involved that aren't directly related to the actual
51 * pixel clock or any symbol/bit clock of the actual output port. These
52 * are the core display clock (CDCLK) and RAWCLK.
54 * CDCLK clocks most of the display pipe logic, and thus its frequency
55 * must be high enough to support the rate at which pixels are flowing
56 * through the pipes. Downscaling must also be accounted as that increases
57 * the effective pixel rate.
59 * On several platforms the CDCLK frequency can be changed dynamically
60 * to minimize power consumption for a given display configuration.
61 * Typically changes to the CDCLK frequency require all the display pipes
62 * to be shut down while the frequency is being changed.
64 * On SKL+ the DMC will toggle the CDCLK off/on during DC5/6 entry/exit.
65 * DMC will not change the active CDCLK frequency however, so that part
66 * will still be performed by the driver directly.
68 * There are multiple components involved in the generation of the CDCLK
71 * - We have the CDCLK PLL, which generates an output clock based on a
72 * reference clock and a ratio parameter.
73 * - The CD2X Divider, which divides the output of the PLL based on a
74 * divisor selected from a set of pre-defined choices.
75 * - The CD2X Squasher, which further divides the output based on a
76 * waveform represented as a sequence of bits where each zero
77 * "squashes out" a clock cycle.
78 * - And, finally, a fixed divider that divides the output frequency by 2.
80 * As such, the resulting CDCLK frequency can be calculated with the
83 * cdclk = vco / cd2x_div / (sq_len / sq_div) / 2
85 * , where vco is the frequency generated by the PLL; cd2x_div
86 * represents the CD2X Divider; sq_len and sq_div are the bit length
87 * and the number of high bits for the CD2X Squasher waveform, respectively;
88 * and 2 represents the fixed divider.
90 * Note that some older platforms do not contain the CD2X Divider
91 * and/or CD2X Squasher, in which case we can ignore their respective
92 * factors in the formula above.
94 * Several methods exist to change the CDCLK frequency, which ones are
95 * supported depends on the platform:
97 * - Full PLL disable + re-enable with new VCO frequency. Pipes must be inactive.
98 * - CD2X divider update. Single pipe can be active as the divider update
99 * can be synchronized with the pipe's start of vblank.
100 * - Crawl the PLL smoothly to the new VCO frequency. Pipes can be active.
101 * - Squash waveform update. Pipes can be active.
102 * - Crawl and squash can also be done back to back. Pipes can be active.
104 * RAWCLK is a fixed frequency clock, often used by various auxiliary
105 * blocks such as AUX CH or backlight PWM. Hence the only thing we
106 * really need to know about RAWCLK is its frequency so that various
107 * dividers can be programmed correctly.
110 struct intel_cdclk_funcs {
111 void (*get_cdclk)(struct drm_i915_private *i915,
112 struct intel_cdclk_config *cdclk_config);
113 void (*set_cdclk)(struct drm_i915_private *i915,
114 const struct intel_cdclk_config *cdclk_config,
116 int (*modeset_calc_cdclk)(struct intel_cdclk_state *state);
117 u8 (*calc_voltage_level)(int cdclk);
120 void intel_cdclk_get_cdclk(struct drm_i915_private *dev_priv,
121 struct intel_cdclk_config *cdclk_config)
123 dev_priv->display.funcs.cdclk->get_cdclk(dev_priv, cdclk_config);
126 static void intel_cdclk_set_cdclk(struct drm_i915_private *dev_priv,
127 const struct intel_cdclk_config *cdclk_config,
130 dev_priv->display.funcs.cdclk->set_cdclk(dev_priv, cdclk_config, pipe);
133 static int intel_cdclk_modeset_calc_cdclk(struct drm_i915_private *dev_priv,
134 struct intel_cdclk_state *cdclk_config)
136 return dev_priv->display.funcs.cdclk->modeset_calc_cdclk(cdclk_config);
139 static u8 intel_cdclk_calc_voltage_level(struct drm_i915_private *dev_priv,
142 return dev_priv->display.funcs.cdclk->calc_voltage_level(cdclk);
145 static void fixed_133mhz_get_cdclk(struct drm_i915_private *dev_priv,
146 struct intel_cdclk_config *cdclk_config)
148 cdclk_config->cdclk = 133333;
151 static void fixed_200mhz_get_cdclk(struct drm_i915_private *dev_priv,
152 struct intel_cdclk_config *cdclk_config)
154 cdclk_config->cdclk = 200000;
157 static void fixed_266mhz_get_cdclk(struct drm_i915_private *dev_priv,
158 struct intel_cdclk_config *cdclk_config)
160 cdclk_config->cdclk = 266667;
163 static void fixed_333mhz_get_cdclk(struct drm_i915_private *dev_priv,
164 struct intel_cdclk_config *cdclk_config)
166 cdclk_config->cdclk = 333333;
169 static void fixed_400mhz_get_cdclk(struct drm_i915_private *dev_priv,
170 struct intel_cdclk_config *cdclk_config)
172 cdclk_config->cdclk = 400000;
175 static void fixed_450mhz_get_cdclk(struct drm_i915_private *dev_priv,
176 struct intel_cdclk_config *cdclk_config)
178 cdclk_config->cdclk = 450000;
181 static void i85x_get_cdclk(struct drm_i915_private *dev_priv,
182 struct intel_cdclk_config *cdclk_config)
184 struct pci_dev *pdev = to_pci_dev(dev_priv->drm.dev);
188 * 852GM/852GMV only supports 133 MHz and the HPLLCC
189 * encoding is different :(
190 * FIXME is this the right way to detect 852GM/852GMV?
192 if (pdev->revision == 0x1) {
193 cdclk_config->cdclk = 133333;
197 pci_bus_read_config_word(pdev->bus,
198 PCI_DEVFN(0, 3), HPLLCC, &hpllcc);
200 /* Assume that the hardware is in the high speed state. This
201 * should be the default.
203 switch (hpllcc & GC_CLOCK_CONTROL_MASK) {
204 case GC_CLOCK_133_200:
205 case GC_CLOCK_133_200_2:
206 case GC_CLOCK_100_200:
207 cdclk_config->cdclk = 200000;
209 case GC_CLOCK_166_250:
210 cdclk_config->cdclk = 250000;
212 case GC_CLOCK_100_133:
213 cdclk_config->cdclk = 133333;
215 case GC_CLOCK_133_266:
216 case GC_CLOCK_133_266_2:
217 case GC_CLOCK_166_266:
218 cdclk_config->cdclk = 266667;
223 static void i915gm_get_cdclk(struct drm_i915_private *dev_priv,
224 struct intel_cdclk_config *cdclk_config)
226 struct pci_dev *pdev = to_pci_dev(dev_priv->drm.dev);
229 pci_read_config_word(pdev, GCFGC, &gcfgc);
231 if (gcfgc & GC_LOW_FREQUENCY_ENABLE) {
232 cdclk_config->cdclk = 133333;
236 switch (gcfgc & GC_DISPLAY_CLOCK_MASK) {
237 case GC_DISPLAY_CLOCK_333_320_MHZ:
238 cdclk_config->cdclk = 333333;
241 case GC_DISPLAY_CLOCK_190_200_MHZ:
242 cdclk_config->cdclk = 190000;
247 static void i945gm_get_cdclk(struct drm_i915_private *dev_priv,
248 struct intel_cdclk_config *cdclk_config)
250 struct pci_dev *pdev = to_pci_dev(dev_priv->drm.dev);
253 pci_read_config_word(pdev, GCFGC, &gcfgc);
255 if (gcfgc & GC_LOW_FREQUENCY_ENABLE) {
256 cdclk_config->cdclk = 133333;
260 switch (gcfgc & GC_DISPLAY_CLOCK_MASK) {
261 case GC_DISPLAY_CLOCK_333_320_MHZ:
262 cdclk_config->cdclk = 320000;
265 case GC_DISPLAY_CLOCK_190_200_MHZ:
266 cdclk_config->cdclk = 200000;
271 static unsigned int intel_hpll_vco(struct drm_i915_private *dev_priv)
273 static const unsigned int blb_vco[8] = {
280 static const unsigned int pnv_vco[8] = {
287 static const unsigned int cl_vco[8] = {
296 static const unsigned int elk_vco[8] = {
302 static const unsigned int ctg_vco[8] = {
310 const unsigned int *vco_table;
314 /* FIXME other chipsets? */
315 if (IS_GM45(dev_priv))
317 else if (IS_G45(dev_priv))
319 else if (IS_I965GM(dev_priv))
321 else if (IS_PINEVIEW(dev_priv))
323 else if (IS_G33(dev_priv))
328 tmp = intel_de_read(dev_priv,
329 IS_PINEVIEW(dev_priv) || IS_MOBILE(dev_priv) ? HPLLVCO_MOBILE : HPLLVCO);
331 vco = vco_table[tmp & 0x7];
333 drm_err(&dev_priv->drm, "Bad HPLL VCO (HPLLVCO=0x%02x)\n",
336 drm_dbg_kms(&dev_priv->drm, "HPLL VCO %u kHz\n", vco);
341 static void g33_get_cdclk(struct drm_i915_private *dev_priv,
342 struct intel_cdclk_config *cdclk_config)
344 struct pci_dev *pdev = to_pci_dev(dev_priv->drm.dev);
345 static const u8 div_3200[] = { 12, 10, 8, 7, 5, 16 };
346 static const u8 div_4000[] = { 14, 12, 10, 8, 6, 20 };
347 static const u8 div_4800[] = { 20, 14, 12, 10, 8, 24 };
348 static const u8 div_5333[] = { 20, 16, 12, 12, 8, 28 };
350 unsigned int cdclk_sel;
353 cdclk_config->vco = intel_hpll_vco(dev_priv);
355 pci_read_config_word(pdev, GCFGC, &tmp);
357 cdclk_sel = (tmp >> 4) & 0x7;
359 if (cdclk_sel >= ARRAY_SIZE(div_3200))
362 switch (cdclk_config->vco) {
364 div_table = div_3200;
367 div_table = div_4000;
370 div_table = div_4800;
373 div_table = div_5333;
379 cdclk_config->cdclk = DIV_ROUND_CLOSEST(cdclk_config->vco,
380 div_table[cdclk_sel]);
384 drm_err(&dev_priv->drm,
385 "Unable to determine CDCLK. HPLL VCO=%u kHz, CFGC=0x%08x\n",
386 cdclk_config->vco, tmp);
387 cdclk_config->cdclk = 190476;
390 static void pnv_get_cdclk(struct drm_i915_private *dev_priv,
391 struct intel_cdclk_config *cdclk_config)
393 struct pci_dev *pdev = to_pci_dev(dev_priv->drm.dev);
396 pci_read_config_word(pdev, GCFGC, &gcfgc);
398 switch (gcfgc & GC_DISPLAY_CLOCK_MASK) {
399 case GC_DISPLAY_CLOCK_267_MHZ_PNV:
400 cdclk_config->cdclk = 266667;
402 case GC_DISPLAY_CLOCK_333_MHZ_PNV:
403 cdclk_config->cdclk = 333333;
405 case GC_DISPLAY_CLOCK_444_MHZ_PNV:
406 cdclk_config->cdclk = 444444;
408 case GC_DISPLAY_CLOCK_200_MHZ_PNV:
409 cdclk_config->cdclk = 200000;
412 drm_err(&dev_priv->drm,
413 "Unknown pnv display core clock 0x%04x\n", gcfgc);
415 case GC_DISPLAY_CLOCK_133_MHZ_PNV:
416 cdclk_config->cdclk = 133333;
418 case GC_DISPLAY_CLOCK_167_MHZ_PNV:
419 cdclk_config->cdclk = 166667;
424 static void i965gm_get_cdclk(struct drm_i915_private *dev_priv,
425 struct intel_cdclk_config *cdclk_config)
427 struct pci_dev *pdev = to_pci_dev(dev_priv->drm.dev);
428 static const u8 div_3200[] = { 16, 10, 8 };
429 static const u8 div_4000[] = { 20, 12, 10 };
430 static const u8 div_5333[] = { 24, 16, 14 };
432 unsigned int cdclk_sel;
435 cdclk_config->vco = intel_hpll_vco(dev_priv);
437 pci_read_config_word(pdev, GCFGC, &tmp);
439 cdclk_sel = ((tmp >> 8) & 0x1f) - 1;
441 if (cdclk_sel >= ARRAY_SIZE(div_3200))
444 switch (cdclk_config->vco) {
446 div_table = div_3200;
449 div_table = div_4000;
452 div_table = div_5333;
458 cdclk_config->cdclk = DIV_ROUND_CLOSEST(cdclk_config->vco,
459 div_table[cdclk_sel]);
463 drm_err(&dev_priv->drm,
464 "Unable to determine CDCLK. HPLL VCO=%u kHz, CFGC=0x%04x\n",
465 cdclk_config->vco, tmp);
466 cdclk_config->cdclk = 200000;
469 static void gm45_get_cdclk(struct drm_i915_private *dev_priv,
470 struct intel_cdclk_config *cdclk_config)
472 struct pci_dev *pdev = to_pci_dev(dev_priv->drm.dev);
473 unsigned int cdclk_sel;
476 cdclk_config->vco = intel_hpll_vco(dev_priv);
478 pci_read_config_word(pdev, GCFGC, &tmp);
480 cdclk_sel = (tmp >> 12) & 0x1;
482 switch (cdclk_config->vco) {
486 cdclk_config->cdclk = cdclk_sel ? 333333 : 222222;
489 cdclk_config->cdclk = cdclk_sel ? 320000 : 228571;
492 drm_err(&dev_priv->drm,
493 "Unable to determine CDCLK. HPLL VCO=%u, CFGC=0x%04x\n",
494 cdclk_config->vco, tmp);
495 cdclk_config->cdclk = 222222;
500 static void hsw_get_cdclk(struct drm_i915_private *dev_priv,
501 struct intel_cdclk_config *cdclk_config)
503 u32 lcpll = intel_de_read(dev_priv, LCPLL_CTL);
504 u32 freq = lcpll & LCPLL_CLK_FREQ_MASK;
506 if (lcpll & LCPLL_CD_SOURCE_FCLK)
507 cdclk_config->cdclk = 800000;
508 else if (intel_de_read(dev_priv, FUSE_STRAP) & HSW_CDCLK_LIMIT)
509 cdclk_config->cdclk = 450000;
510 else if (freq == LCPLL_CLK_FREQ_450)
511 cdclk_config->cdclk = 450000;
512 else if (IS_HASWELL_ULT(dev_priv))
513 cdclk_config->cdclk = 337500;
515 cdclk_config->cdclk = 540000;
518 static int vlv_calc_cdclk(struct drm_i915_private *dev_priv, int min_cdclk)
520 int freq_320 = (dev_priv->hpll_freq << 1) % 320000 != 0 ?
524 * We seem to get an unstable or solid color picture at 200MHz.
525 * Not sure what's wrong. For now use 200MHz only when all pipes
528 if (IS_VALLEYVIEW(dev_priv) && min_cdclk > freq_320)
530 else if (min_cdclk > 266667)
532 else if (min_cdclk > 0)
538 static u8 vlv_calc_voltage_level(struct drm_i915_private *dev_priv, int cdclk)
540 if (IS_VALLEYVIEW(dev_priv)) {
541 if (cdclk >= 320000) /* jump to highest voltage for 400MHz too */
543 else if (cdclk >= 266667)
549 * Specs are full of misinformation, but testing on actual
550 * hardware has shown that we just need to write the desired
551 * CCK divider into the Punit register.
553 return DIV_ROUND_CLOSEST(dev_priv->hpll_freq << 1, cdclk) - 1;
557 static void vlv_get_cdclk(struct drm_i915_private *dev_priv,
558 struct intel_cdclk_config *cdclk_config)
562 vlv_iosf_sb_get(dev_priv,
563 BIT(VLV_IOSF_SB_CCK) | BIT(VLV_IOSF_SB_PUNIT));
565 cdclk_config->vco = vlv_get_hpll_vco(dev_priv);
566 cdclk_config->cdclk = vlv_get_cck_clock(dev_priv, "cdclk",
567 CCK_DISPLAY_CLOCK_CONTROL,
570 val = vlv_punit_read(dev_priv, PUNIT_REG_DSPSSPM);
572 vlv_iosf_sb_put(dev_priv,
573 BIT(VLV_IOSF_SB_CCK) | BIT(VLV_IOSF_SB_PUNIT));
575 if (IS_VALLEYVIEW(dev_priv))
576 cdclk_config->voltage_level = (val & DSPFREQGUAR_MASK) >>
579 cdclk_config->voltage_level = (val & DSPFREQGUAR_MASK_CHV) >>
580 DSPFREQGUAR_SHIFT_CHV;
583 static void vlv_program_pfi_credits(struct drm_i915_private *dev_priv)
585 unsigned int credits, default_credits;
587 if (IS_CHERRYVIEW(dev_priv))
588 default_credits = PFI_CREDIT(12);
590 default_credits = PFI_CREDIT(8);
592 if (dev_priv->display.cdclk.hw.cdclk >= dev_priv->czclk_freq) {
593 /* CHV suggested value is 31 or 63 */
594 if (IS_CHERRYVIEW(dev_priv))
595 credits = PFI_CREDIT_63;
597 credits = PFI_CREDIT(15);
599 credits = default_credits;
603 * WA - write default credits before re-programming
604 * FIXME: should we also set the resend bit here?
606 intel_de_write(dev_priv, GCI_CONTROL,
607 VGA_FAST_MODE_DISABLE | default_credits);
609 intel_de_write(dev_priv, GCI_CONTROL,
610 VGA_FAST_MODE_DISABLE | credits | PFI_CREDIT_RESEND);
613 * FIXME is this guaranteed to clear
614 * immediately or should we poll for it?
616 drm_WARN_ON(&dev_priv->drm,
617 intel_de_read(dev_priv, GCI_CONTROL) & PFI_CREDIT_RESEND);
620 static void vlv_set_cdclk(struct drm_i915_private *dev_priv,
621 const struct intel_cdclk_config *cdclk_config,
624 int cdclk = cdclk_config->cdclk;
625 u32 val, cmd = cdclk_config->voltage_level;
626 intel_wakeref_t wakeref;
640 /* There are cases where we can end up here with power domains
641 * off and a CDCLK frequency other than the minimum, like when
642 * issuing a modeset without actually changing any display after
643 * a system suspend. So grab the display core domain, which covers
644 * the HW blocks needed for the following programming.
646 wakeref = intel_display_power_get(dev_priv, POWER_DOMAIN_DISPLAY_CORE);
648 vlv_iosf_sb_get(dev_priv,
649 BIT(VLV_IOSF_SB_CCK) |
650 BIT(VLV_IOSF_SB_BUNIT) |
651 BIT(VLV_IOSF_SB_PUNIT));
653 val = vlv_punit_read(dev_priv, PUNIT_REG_DSPSSPM);
654 val &= ~DSPFREQGUAR_MASK;
655 val |= (cmd << DSPFREQGUAR_SHIFT);
656 vlv_punit_write(dev_priv, PUNIT_REG_DSPSSPM, val);
657 if (wait_for((vlv_punit_read(dev_priv, PUNIT_REG_DSPSSPM) &
658 DSPFREQSTAT_MASK) == (cmd << DSPFREQSTAT_SHIFT),
660 drm_err(&dev_priv->drm,
661 "timed out waiting for CDclk change\n");
664 if (cdclk == 400000) {
667 divider = DIV_ROUND_CLOSEST(dev_priv->hpll_freq << 1,
670 /* adjust cdclk divider */
671 val = vlv_cck_read(dev_priv, CCK_DISPLAY_CLOCK_CONTROL);
672 val &= ~CCK_FREQUENCY_VALUES;
674 vlv_cck_write(dev_priv, CCK_DISPLAY_CLOCK_CONTROL, val);
676 if (wait_for((vlv_cck_read(dev_priv, CCK_DISPLAY_CLOCK_CONTROL) &
677 CCK_FREQUENCY_STATUS) == (divider << CCK_FREQUENCY_STATUS_SHIFT),
679 drm_err(&dev_priv->drm,
680 "timed out waiting for CDclk change\n");
683 /* adjust self-refresh exit latency value */
684 val = vlv_bunit_read(dev_priv, BUNIT_REG_BISOC);
688 * For high bandwidth configs, we set a higher latency in the bunit
689 * so that the core display fetch happens in time to avoid underruns.
692 val |= 4500 / 250; /* 4.5 usec */
694 val |= 3000 / 250; /* 3.0 usec */
695 vlv_bunit_write(dev_priv, BUNIT_REG_BISOC, val);
697 vlv_iosf_sb_put(dev_priv,
698 BIT(VLV_IOSF_SB_CCK) |
699 BIT(VLV_IOSF_SB_BUNIT) |
700 BIT(VLV_IOSF_SB_PUNIT));
702 intel_update_cdclk(dev_priv);
704 vlv_program_pfi_credits(dev_priv);
706 intel_display_power_put(dev_priv, POWER_DOMAIN_DISPLAY_CORE, wakeref);
709 static void chv_set_cdclk(struct drm_i915_private *dev_priv,
710 const struct intel_cdclk_config *cdclk_config,
713 int cdclk = cdclk_config->cdclk;
714 u32 val, cmd = cdclk_config->voltage_level;
715 intel_wakeref_t wakeref;
728 /* There are cases where we can end up here with power domains
729 * off and a CDCLK frequency other than the minimum, like when
730 * issuing a modeset without actually changing any display after
731 * a system suspend. So grab the display core domain, which covers
732 * the HW blocks needed for the following programming.
734 wakeref = intel_display_power_get(dev_priv, POWER_DOMAIN_DISPLAY_CORE);
736 vlv_punit_get(dev_priv);
737 val = vlv_punit_read(dev_priv, PUNIT_REG_DSPSSPM);
738 val &= ~DSPFREQGUAR_MASK_CHV;
739 val |= (cmd << DSPFREQGUAR_SHIFT_CHV);
740 vlv_punit_write(dev_priv, PUNIT_REG_DSPSSPM, val);
741 if (wait_for((vlv_punit_read(dev_priv, PUNIT_REG_DSPSSPM) &
742 DSPFREQSTAT_MASK_CHV) == (cmd << DSPFREQSTAT_SHIFT_CHV),
744 drm_err(&dev_priv->drm,
745 "timed out waiting for CDclk change\n");
748 vlv_punit_put(dev_priv);
750 intel_update_cdclk(dev_priv);
752 vlv_program_pfi_credits(dev_priv);
754 intel_display_power_put(dev_priv, POWER_DOMAIN_DISPLAY_CORE, wakeref);
757 static int bdw_calc_cdclk(int min_cdclk)
759 if (min_cdclk > 540000)
761 else if (min_cdclk > 450000)
763 else if (min_cdclk > 337500)
769 static u8 bdw_calc_voltage_level(int cdclk)
784 static void bdw_get_cdclk(struct drm_i915_private *dev_priv,
785 struct intel_cdclk_config *cdclk_config)
787 u32 lcpll = intel_de_read(dev_priv, LCPLL_CTL);
788 u32 freq = lcpll & LCPLL_CLK_FREQ_MASK;
790 if (lcpll & LCPLL_CD_SOURCE_FCLK)
791 cdclk_config->cdclk = 800000;
792 else if (intel_de_read(dev_priv, FUSE_STRAP) & HSW_CDCLK_LIMIT)
793 cdclk_config->cdclk = 450000;
794 else if (freq == LCPLL_CLK_FREQ_450)
795 cdclk_config->cdclk = 450000;
796 else if (freq == LCPLL_CLK_FREQ_54O_BDW)
797 cdclk_config->cdclk = 540000;
798 else if (freq == LCPLL_CLK_FREQ_337_5_BDW)
799 cdclk_config->cdclk = 337500;
801 cdclk_config->cdclk = 675000;
804 * Can't read this out :( Let's assume it's
805 * at least what the CDCLK frequency requires.
807 cdclk_config->voltage_level =
808 bdw_calc_voltage_level(cdclk_config->cdclk);
811 static u32 bdw_cdclk_freq_sel(int cdclk)
818 return LCPLL_CLK_FREQ_337_5_BDW;
820 return LCPLL_CLK_FREQ_450;
822 return LCPLL_CLK_FREQ_54O_BDW;
824 return LCPLL_CLK_FREQ_675_BDW;
828 static void bdw_set_cdclk(struct drm_i915_private *dev_priv,
829 const struct intel_cdclk_config *cdclk_config,
832 int cdclk = cdclk_config->cdclk;
835 if (drm_WARN(&dev_priv->drm,
836 (intel_de_read(dev_priv, LCPLL_CTL) &
837 (LCPLL_PLL_DISABLE | LCPLL_PLL_LOCK |
838 LCPLL_CD_CLOCK_DISABLE | LCPLL_ROOT_CD_CLOCK_DISABLE |
839 LCPLL_CD2X_CLOCK_DISABLE | LCPLL_POWER_DOWN_ALLOW |
840 LCPLL_CD_SOURCE_FCLK)) != LCPLL_PLL_LOCK,
841 "trying to change cdclk frequency with cdclk not enabled\n"))
844 ret = snb_pcode_write(&dev_priv->uncore, BDW_PCODE_DISPLAY_FREQ_CHANGE_REQ, 0x0);
846 drm_err(&dev_priv->drm,
847 "failed to inform pcode about cdclk change\n");
851 intel_de_rmw(dev_priv, LCPLL_CTL,
852 0, LCPLL_CD_SOURCE_FCLK);
855 * According to the spec, it should be enough to poll for this 1 us.
856 * However, extensive testing shows that this can take longer.
858 if (wait_for_us(intel_de_read(dev_priv, LCPLL_CTL) &
859 LCPLL_CD_SOURCE_FCLK_DONE, 100))
860 drm_err(&dev_priv->drm, "Switching to FCLK failed\n");
862 intel_de_rmw(dev_priv, LCPLL_CTL,
863 LCPLL_CLK_FREQ_MASK, bdw_cdclk_freq_sel(cdclk));
865 intel_de_rmw(dev_priv, LCPLL_CTL,
866 LCPLL_CD_SOURCE_FCLK, 0);
868 if (wait_for_us((intel_de_read(dev_priv, LCPLL_CTL) &
869 LCPLL_CD_SOURCE_FCLK_DONE) == 0, 1))
870 drm_err(&dev_priv->drm, "Switching back to LCPLL failed\n");
872 snb_pcode_write(&dev_priv->uncore, HSW_PCODE_DE_WRITE_FREQ_REQ,
873 cdclk_config->voltage_level);
875 intel_de_write(dev_priv, CDCLK_FREQ,
876 DIV_ROUND_CLOSEST(cdclk, 1000) - 1);
878 intel_update_cdclk(dev_priv);
881 static int skl_calc_cdclk(int min_cdclk, int vco)
883 if (vco == 8640000) {
884 if (min_cdclk > 540000)
886 else if (min_cdclk > 432000)
888 else if (min_cdclk > 308571)
893 if (min_cdclk > 540000)
895 else if (min_cdclk > 450000)
897 else if (min_cdclk > 337500)
904 static u8 skl_calc_voltage_level(int cdclk)
908 else if (cdclk > 450000)
910 else if (cdclk > 337500)
916 static void skl_dpll0_update(struct drm_i915_private *dev_priv,
917 struct intel_cdclk_config *cdclk_config)
921 cdclk_config->ref = 24000;
922 cdclk_config->vco = 0;
924 val = intel_de_read(dev_priv, LCPLL1_CTL);
925 if ((val & LCPLL_PLL_ENABLE) == 0)
928 if (drm_WARN_ON(&dev_priv->drm, (val & LCPLL_PLL_LOCK) == 0))
931 val = intel_de_read(dev_priv, DPLL_CTRL1);
933 if (drm_WARN_ON(&dev_priv->drm,
934 (val & (DPLL_CTRL1_HDMI_MODE(SKL_DPLL0) |
935 DPLL_CTRL1_SSC(SKL_DPLL0) |
936 DPLL_CTRL1_OVERRIDE(SKL_DPLL0))) !=
937 DPLL_CTRL1_OVERRIDE(SKL_DPLL0)))
940 switch (val & DPLL_CTRL1_LINK_RATE_MASK(SKL_DPLL0)) {
941 case DPLL_CTRL1_LINK_RATE(DPLL_CTRL1_LINK_RATE_810, SKL_DPLL0):
942 case DPLL_CTRL1_LINK_RATE(DPLL_CTRL1_LINK_RATE_1350, SKL_DPLL0):
943 case DPLL_CTRL1_LINK_RATE(DPLL_CTRL1_LINK_RATE_1620, SKL_DPLL0):
944 case DPLL_CTRL1_LINK_RATE(DPLL_CTRL1_LINK_RATE_2700, SKL_DPLL0):
945 cdclk_config->vco = 8100000;
947 case DPLL_CTRL1_LINK_RATE(DPLL_CTRL1_LINK_RATE_1080, SKL_DPLL0):
948 case DPLL_CTRL1_LINK_RATE(DPLL_CTRL1_LINK_RATE_2160, SKL_DPLL0):
949 cdclk_config->vco = 8640000;
952 MISSING_CASE(val & DPLL_CTRL1_LINK_RATE_MASK(SKL_DPLL0));
957 static void skl_get_cdclk(struct drm_i915_private *dev_priv,
958 struct intel_cdclk_config *cdclk_config)
962 skl_dpll0_update(dev_priv, cdclk_config);
964 cdclk_config->cdclk = cdclk_config->bypass = cdclk_config->ref;
966 if (cdclk_config->vco == 0)
969 cdctl = intel_de_read(dev_priv, CDCLK_CTL);
971 if (cdclk_config->vco == 8640000) {
972 switch (cdctl & CDCLK_FREQ_SEL_MASK) {
973 case CDCLK_FREQ_450_432:
974 cdclk_config->cdclk = 432000;
976 case CDCLK_FREQ_337_308:
977 cdclk_config->cdclk = 308571;
980 cdclk_config->cdclk = 540000;
982 case CDCLK_FREQ_675_617:
983 cdclk_config->cdclk = 617143;
986 MISSING_CASE(cdctl & CDCLK_FREQ_SEL_MASK);
990 switch (cdctl & CDCLK_FREQ_SEL_MASK) {
991 case CDCLK_FREQ_450_432:
992 cdclk_config->cdclk = 450000;
994 case CDCLK_FREQ_337_308:
995 cdclk_config->cdclk = 337500;
998 cdclk_config->cdclk = 540000;
1000 case CDCLK_FREQ_675_617:
1001 cdclk_config->cdclk = 675000;
1004 MISSING_CASE(cdctl & CDCLK_FREQ_SEL_MASK);
1011 * Can't read this out :( Let's assume it's
1012 * at least what the CDCLK frequency requires.
1014 cdclk_config->voltage_level =
1015 skl_calc_voltage_level(cdclk_config->cdclk);
1018 /* convert from kHz to .1 fixpoint MHz with -1MHz offset */
1019 static int skl_cdclk_decimal(int cdclk)
1021 return DIV_ROUND_CLOSEST(cdclk - 1000, 500);
1024 static void skl_set_preferred_cdclk_vco(struct drm_i915_private *i915, int vco)
1026 bool changed = i915->display.cdclk.skl_preferred_vco_freq != vco;
1028 i915->display.cdclk.skl_preferred_vco_freq = vco;
1031 intel_update_max_cdclk(i915);
1034 static u32 skl_dpll0_link_rate(struct drm_i915_private *dev_priv, int vco)
1036 drm_WARN_ON(&dev_priv->drm, vco != 8100000 && vco != 8640000);
1039 * We always enable DPLL0 with the lowest link rate possible, but still
1040 * taking into account the VCO required to operate the eDP panel at the
1041 * desired frequency. The usual DP link rates operate with a VCO of
1042 * 8100 while the eDP 1.4 alternate link rates need a VCO of 8640.
1043 * The modeset code is responsible for the selection of the exact link
1044 * rate later on, with the constraint of choosing a frequency that
1048 return DPLL_CTRL1_LINK_RATE(DPLL_CTRL1_LINK_RATE_1080, SKL_DPLL0);
1050 return DPLL_CTRL1_LINK_RATE(DPLL_CTRL1_LINK_RATE_810, SKL_DPLL0);
1053 static void skl_dpll0_enable(struct drm_i915_private *dev_priv, int vco)
1055 intel_de_rmw(dev_priv, DPLL_CTRL1,
1056 DPLL_CTRL1_HDMI_MODE(SKL_DPLL0) |
1057 DPLL_CTRL1_SSC(SKL_DPLL0) |
1058 DPLL_CTRL1_LINK_RATE_MASK(SKL_DPLL0),
1059 DPLL_CTRL1_OVERRIDE(SKL_DPLL0) |
1060 skl_dpll0_link_rate(dev_priv, vco));
1061 intel_de_posting_read(dev_priv, DPLL_CTRL1);
1063 intel_de_rmw(dev_priv, LCPLL1_CTL,
1064 0, LCPLL_PLL_ENABLE);
1066 if (intel_de_wait_for_set(dev_priv, LCPLL1_CTL, LCPLL_PLL_LOCK, 5))
1067 drm_err(&dev_priv->drm, "DPLL0 not locked\n");
1069 dev_priv->display.cdclk.hw.vco = vco;
1071 /* We'll want to keep using the current vco from now on. */
1072 skl_set_preferred_cdclk_vco(dev_priv, vco);
1075 static void skl_dpll0_disable(struct drm_i915_private *dev_priv)
1077 intel_de_rmw(dev_priv, LCPLL1_CTL,
1078 LCPLL_PLL_ENABLE, 0);
1080 if (intel_de_wait_for_clear(dev_priv, LCPLL1_CTL, LCPLL_PLL_LOCK, 1))
1081 drm_err(&dev_priv->drm, "Couldn't disable DPLL0\n");
1083 dev_priv->display.cdclk.hw.vco = 0;
1086 static u32 skl_cdclk_freq_sel(struct drm_i915_private *dev_priv,
1091 drm_WARN_ON(&dev_priv->drm,
1092 cdclk != dev_priv->display.cdclk.hw.bypass);
1093 drm_WARN_ON(&dev_priv->drm, vco != 0);
1097 return CDCLK_FREQ_337_308;
1100 return CDCLK_FREQ_450_432;
1102 return CDCLK_FREQ_540;
1105 return CDCLK_FREQ_675_617;
1109 static void skl_set_cdclk(struct drm_i915_private *dev_priv,
1110 const struct intel_cdclk_config *cdclk_config,
1113 int cdclk = cdclk_config->cdclk;
1114 int vco = cdclk_config->vco;
1115 u32 freq_select, cdclk_ctl;
1119 * Based on WA#1183 CDCLK rates 308 and 617MHz CDCLK rates are
1120 * unsupported on SKL. In theory this should never happen since only
1121 * the eDP1.4 2.16 and 4.32Gbps rates require it, but eDP1.4 is not
1122 * supported on SKL either, see the above WA. WARN whenever trying to
1123 * use the corresponding VCO freq as that always leads to using the
1124 * minimum 308MHz CDCLK.
1126 drm_WARN_ON_ONCE(&dev_priv->drm,
1127 IS_SKYLAKE(dev_priv) && vco == 8640000);
1129 ret = skl_pcode_request(&dev_priv->uncore, SKL_PCODE_CDCLK_CONTROL,
1130 SKL_CDCLK_PREPARE_FOR_CHANGE,
1131 SKL_CDCLK_READY_FOR_CHANGE,
1132 SKL_CDCLK_READY_FOR_CHANGE, 3);
1134 drm_err(&dev_priv->drm,
1135 "Failed to inform PCU about cdclk change (%d)\n", ret);
1139 freq_select = skl_cdclk_freq_sel(dev_priv, cdclk, vco);
1141 if (dev_priv->display.cdclk.hw.vco != 0 &&
1142 dev_priv->display.cdclk.hw.vco != vco)
1143 skl_dpll0_disable(dev_priv);
1145 cdclk_ctl = intel_de_read(dev_priv, CDCLK_CTL);
1147 if (dev_priv->display.cdclk.hw.vco != vco) {
1148 /* Wa Display #1183: skl,kbl,cfl */
1149 cdclk_ctl &= ~(CDCLK_FREQ_SEL_MASK | CDCLK_FREQ_DECIMAL_MASK);
1150 cdclk_ctl |= freq_select | skl_cdclk_decimal(cdclk);
1151 intel_de_write(dev_priv, CDCLK_CTL, cdclk_ctl);
1154 /* Wa Display #1183: skl,kbl,cfl */
1155 cdclk_ctl |= CDCLK_DIVMUX_CD_OVERRIDE;
1156 intel_de_write(dev_priv, CDCLK_CTL, cdclk_ctl);
1157 intel_de_posting_read(dev_priv, CDCLK_CTL);
1159 if (dev_priv->display.cdclk.hw.vco != vco)
1160 skl_dpll0_enable(dev_priv, vco);
1162 /* Wa Display #1183: skl,kbl,cfl */
1163 cdclk_ctl &= ~(CDCLK_FREQ_SEL_MASK | CDCLK_FREQ_DECIMAL_MASK);
1164 intel_de_write(dev_priv, CDCLK_CTL, cdclk_ctl);
1166 cdclk_ctl |= freq_select | skl_cdclk_decimal(cdclk);
1167 intel_de_write(dev_priv, CDCLK_CTL, cdclk_ctl);
1169 /* Wa Display #1183: skl,kbl,cfl */
1170 cdclk_ctl &= ~CDCLK_DIVMUX_CD_OVERRIDE;
1171 intel_de_write(dev_priv, CDCLK_CTL, cdclk_ctl);
1172 intel_de_posting_read(dev_priv, CDCLK_CTL);
1174 /* inform PCU of the change */
1175 snb_pcode_write(&dev_priv->uncore, SKL_PCODE_CDCLK_CONTROL,
1176 cdclk_config->voltage_level);
1178 intel_update_cdclk(dev_priv);
1181 static void skl_sanitize_cdclk(struct drm_i915_private *dev_priv)
1183 u32 cdctl, expected;
1186 * check if the pre-os initialized the display
1187 * There is SWF18 scratchpad register defined which is set by the
1188 * pre-os which can be used by the OS drivers to check the status
1190 if ((intel_de_read(dev_priv, SWF_ILK(0x18)) & 0x00FFFFFF) == 0)
1193 intel_update_cdclk(dev_priv);
1194 intel_cdclk_dump_config(dev_priv, &dev_priv->display.cdclk.hw, "Current CDCLK");
1196 /* Is PLL enabled and locked ? */
1197 if (dev_priv->display.cdclk.hw.vco == 0 ||
1198 dev_priv->display.cdclk.hw.cdclk == dev_priv->display.cdclk.hw.bypass)
1201 /* DPLL okay; verify the cdclock
1203 * Noticed in some instances that the freq selection is correct but
1204 * decimal part is programmed wrong from BIOS where pre-os does not
1205 * enable display. Verify the same as well.
1207 cdctl = intel_de_read(dev_priv, CDCLK_CTL);
1208 expected = (cdctl & CDCLK_FREQ_SEL_MASK) |
1209 skl_cdclk_decimal(dev_priv->display.cdclk.hw.cdclk);
1210 if (cdctl == expected)
1211 /* All well; nothing to sanitize */
1215 drm_dbg_kms(&dev_priv->drm, "Sanitizing cdclk programmed by pre-os\n");
1217 /* force cdclk programming */
1218 dev_priv->display.cdclk.hw.cdclk = 0;
1219 /* force full PLL disable + enable */
1220 dev_priv->display.cdclk.hw.vco = ~0;
1223 static void skl_cdclk_init_hw(struct drm_i915_private *dev_priv)
1225 struct intel_cdclk_config cdclk_config;
1227 skl_sanitize_cdclk(dev_priv);
1229 if (dev_priv->display.cdclk.hw.cdclk != 0 &&
1230 dev_priv->display.cdclk.hw.vco != 0) {
1232 * Use the current vco as our initial
1233 * guess as to what the preferred vco is.
1235 if (dev_priv->display.cdclk.skl_preferred_vco_freq == 0)
1236 skl_set_preferred_cdclk_vco(dev_priv,
1237 dev_priv->display.cdclk.hw.vco);
1241 cdclk_config = dev_priv->display.cdclk.hw;
1243 cdclk_config.vco = dev_priv->display.cdclk.skl_preferred_vco_freq;
1244 if (cdclk_config.vco == 0)
1245 cdclk_config.vco = 8100000;
1246 cdclk_config.cdclk = skl_calc_cdclk(0, cdclk_config.vco);
1247 cdclk_config.voltage_level = skl_calc_voltage_level(cdclk_config.cdclk);
1249 skl_set_cdclk(dev_priv, &cdclk_config, INVALID_PIPE);
1252 static void skl_cdclk_uninit_hw(struct drm_i915_private *dev_priv)
1254 struct intel_cdclk_config cdclk_config = dev_priv->display.cdclk.hw;
1256 cdclk_config.cdclk = cdclk_config.bypass;
1257 cdclk_config.vco = 0;
1258 cdclk_config.voltage_level = skl_calc_voltage_level(cdclk_config.cdclk);
1260 skl_set_cdclk(dev_priv, &cdclk_config, INVALID_PIPE);
1263 struct intel_cdclk_vals {
1270 static const struct intel_cdclk_vals bxt_cdclk_table[] = {
1271 { .refclk = 19200, .cdclk = 144000, .ratio = 60 },
1272 { .refclk = 19200, .cdclk = 288000, .ratio = 60 },
1273 { .refclk = 19200, .cdclk = 384000, .ratio = 60 },
1274 { .refclk = 19200, .cdclk = 576000, .ratio = 60 },
1275 { .refclk = 19200, .cdclk = 624000, .ratio = 65 },
1279 static const struct intel_cdclk_vals glk_cdclk_table[] = {
1280 { .refclk = 19200, .cdclk = 79200, .ratio = 33 },
1281 { .refclk = 19200, .cdclk = 158400, .ratio = 33 },
1282 { .refclk = 19200, .cdclk = 316800, .ratio = 33 },
1286 static const struct intel_cdclk_vals icl_cdclk_table[] = {
1287 { .refclk = 19200, .cdclk = 172800, .ratio = 18 },
1288 { .refclk = 19200, .cdclk = 192000, .ratio = 20 },
1289 { .refclk = 19200, .cdclk = 307200, .ratio = 32 },
1290 { .refclk = 19200, .cdclk = 326400, .ratio = 68 },
1291 { .refclk = 19200, .cdclk = 556800, .ratio = 58 },
1292 { .refclk = 19200, .cdclk = 652800, .ratio = 68 },
1294 { .refclk = 24000, .cdclk = 180000, .ratio = 15 },
1295 { .refclk = 24000, .cdclk = 192000, .ratio = 16 },
1296 { .refclk = 24000, .cdclk = 312000, .ratio = 26 },
1297 { .refclk = 24000, .cdclk = 324000, .ratio = 54 },
1298 { .refclk = 24000, .cdclk = 552000, .ratio = 46 },
1299 { .refclk = 24000, .cdclk = 648000, .ratio = 54 },
1301 { .refclk = 38400, .cdclk = 172800, .ratio = 9 },
1302 { .refclk = 38400, .cdclk = 192000, .ratio = 10 },
1303 { .refclk = 38400, .cdclk = 307200, .ratio = 16 },
1304 { .refclk = 38400, .cdclk = 326400, .ratio = 34 },
1305 { .refclk = 38400, .cdclk = 556800, .ratio = 29 },
1306 { .refclk = 38400, .cdclk = 652800, .ratio = 34 },
1310 static const struct intel_cdclk_vals rkl_cdclk_table[] = {
1311 { .refclk = 19200, .cdclk = 172800, .ratio = 36 },
1312 { .refclk = 19200, .cdclk = 192000, .ratio = 40 },
1313 { .refclk = 19200, .cdclk = 307200, .ratio = 64 },
1314 { .refclk = 19200, .cdclk = 326400, .ratio = 136 },
1315 { .refclk = 19200, .cdclk = 556800, .ratio = 116 },
1316 { .refclk = 19200, .cdclk = 652800, .ratio = 136 },
1318 { .refclk = 24000, .cdclk = 180000, .ratio = 30 },
1319 { .refclk = 24000, .cdclk = 192000, .ratio = 32 },
1320 { .refclk = 24000, .cdclk = 312000, .ratio = 52 },
1321 { .refclk = 24000, .cdclk = 324000, .ratio = 108 },
1322 { .refclk = 24000, .cdclk = 552000, .ratio = 92 },
1323 { .refclk = 24000, .cdclk = 648000, .ratio = 108 },
1325 { .refclk = 38400, .cdclk = 172800, .ratio = 18 },
1326 { .refclk = 38400, .cdclk = 192000, .ratio = 20 },
1327 { .refclk = 38400, .cdclk = 307200, .ratio = 32 },
1328 { .refclk = 38400, .cdclk = 326400, .ratio = 68 },
1329 { .refclk = 38400, .cdclk = 556800, .ratio = 58 },
1330 { .refclk = 38400, .cdclk = 652800, .ratio = 68 },
1334 static const struct intel_cdclk_vals adlp_a_step_cdclk_table[] = {
1335 { .refclk = 19200, .cdclk = 307200, .ratio = 32 },
1336 { .refclk = 19200, .cdclk = 556800, .ratio = 58 },
1337 { .refclk = 19200, .cdclk = 652800, .ratio = 68 },
1339 { .refclk = 24000, .cdclk = 312000, .ratio = 26 },
1340 { .refclk = 24000, .cdclk = 552000, .ratio = 46 },
1341 { .refclk = 24400, .cdclk = 648000, .ratio = 54 },
1343 { .refclk = 38400, .cdclk = 307200, .ratio = 16 },
1344 { .refclk = 38400, .cdclk = 556800, .ratio = 29 },
1345 { .refclk = 38400, .cdclk = 652800, .ratio = 34 },
1349 static const struct intel_cdclk_vals adlp_cdclk_table[] = {
1350 { .refclk = 19200, .cdclk = 172800, .ratio = 27 },
1351 { .refclk = 19200, .cdclk = 192000, .ratio = 20 },
1352 { .refclk = 19200, .cdclk = 307200, .ratio = 32 },
1353 { .refclk = 19200, .cdclk = 556800, .ratio = 58 },
1354 { .refclk = 19200, .cdclk = 652800, .ratio = 68 },
1356 { .refclk = 24000, .cdclk = 176000, .ratio = 22 },
1357 { .refclk = 24000, .cdclk = 192000, .ratio = 16 },
1358 { .refclk = 24000, .cdclk = 312000, .ratio = 26 },
1359 { .refclk = 24000, .cdclk = 552000, .ratio = 46 },
1360 { .refclk = 24000, .cdclk = 648000, .ratio = 54 },
1362 { .refclk = 38400, .cdclk = 179200, .ratio = 14 },
1363 { .refclk = 38400, .cdclk = 192000, .ratio = 10 },
1364 { .refclk = 38400, .cdclk = 307200, .ratio = 16 },
1365 { .refclk = 38400, .cdclk = 556800, .ratio = 29 },
1366 { .refclk = 38400, .cdclk = 652800, .ratio = 34 },
1370 static const struct intel_cdclk_vals rplu_cdclk_table[] = {
1371 { .refclk = 19200, .cdclk = 172800, .ratio = 27 },
1372 { .refclk = 19200, .cdclk = 192000, .ratio = 20 },
1373 { .refclk = 19200, .cdclk = 307200, .ratio = 32 },
1374 { .refclk = 19200, .cdclk = 480000, .ratio = 50 },
1375 { .refclk = 19200, .cdclk = 556800, .ratio = 58 },
1376 { .refclk = 19200, .cdclk = 652800, .ratio = 68 },
1378 { .refclk = 24000, .cdclk = 176000, .ratio = 22 },
1379 { .refclk = 24000, .cdclk = 192000, .ratio = 16 },
1380 { .refclk = 24000, .cdclk = 312000, .ratio = 26 },
1381 { .refclk = 24000, .cdclk = 480000, .ratio = 40 },
1382 { .refclk = 24000, .cdclk = 552000, .ratio = 46 },
1383 { .refclk = 24000, .cdclk = 648000, .ratio = 54 },
1385 { .refclk = 38400, .cdclk = 179200, .ratio = 14 },
1386 { .refclk = 38400, .cdclk = 192000, .ratio = 10 },
1387 { .refclk = 38400, .cdclk = 307200, .ratio = 16 },
1388 { .refclk = 38400, .cdclk = 480000, .ratio = 25 },
1389 { .refclk = 38400, .cdclk = 556800, .ratio = 29 },
1390 { .refclk = 38400, .cdclk = 652800, .ratio = 34 },
1394 static const struct intel_cdclk_vals dg2_cdclk_table[] = {
1395 { .refclk = 38400, .cdclk = 163200, .ratio = 34, .waveform = 0x8888 },
1396 { .refclk = 38400, .cdclk = 204000, .ratio = 34, .waveform = 0x9248 },
1397 { .refclk = 38400, .cdclk = 244800, .ratio = 34, .waveform = 0xa4a4 },
1398 { .refclk = 38400, .cdclk = 285600, .ratio = 34, .waveform = 0xa54a },
1399 { .refclk = 38400, .cdclk = 326400, .ratio = 34, .waveform = 0xaaaa },
1400 { .refclk = 38400, .cdclk = 367200, .ratio = 34, .waveform = 0xad5a },
1401 { .refclk = 38400, .cdclk = 408000, .ratio = 34, .waveform = 0xb6b6 },
1402 { .refclk = 38400, .cdclk = 448800, .ratio = 34, .waveform = 0xdbb6 },
1403 { .refclk = 38400, .cdclk = 489600, .ratio = 34, .waveform = 0xeeee },
1404 { .refclk = 38400, .cdclk = 530400, .ratio = 34, .waveform = 0xf7de },
1405 { .refclk = 38400, .cdclk = 571200, .ratio = 34, .waveform = 0xfefe },
1406 { .refclk = 38400, .cdclk = 612000, .ratio = 34, .waveform = 0xfffe },
1407 { .refclk = 38400, .cdclk = 652800, .ratio = 34, .waveform = 0xffff },
1411 static const struct intel_cdclk_vals mtl_cdclk_table[] = {
1412 { .refclk = 38400, .cdclk = 172800, .ratio = 16, .waveform = 0xad5a },
1413 { .refclk = 38400, .cdclk = 192000, .ratio = 16, .waveform = 0xb6b6 },
1414 { .refclk = 38400, .cdclk = 307200, .ratio = 16, .waveform = 0x0000 },
1415 { .refclk = 38400, .cdclk = 480000, .ratio = 25, .waveform = 0x0000 },
1416 { .refclk = 38400, .cdclk = 556800, .ratio = 29, .waveform = 0x0000 },
1417 { .refclk = 38400, .cdclk = 652800, .ratio = 34, .waveform = 0x0000 },
1421 static const struct intel_cdclk_vals xe2lpd_cdclk_table[] = {
1422 { .refclk = 38400, .cdclk = 153600, .ratio = 16, .waveform = 0xaaaa },
1423 { .refclk = 38400, .cdclk = 172800, .ratio = 16, .waveform = 0xad5a },
1424 { .refclk = 38400, .cdclk = 192000, .ratio = 16, .waveform = 0xb6b6 },
1425 { .refclk = 38400, .cdclk = 211200, .ratio = 16, .waveform = 0xdbb6 },
1426 { .refclk = 38400, .cdclk = 230400, .ratio = 16, .waveform = 0xeeee },
1427 { .refclk = 38400, .cdclk = 249600, .ratio = 16, .waveform = 0xf7de },
1428 { .refclk = 38400, .cdclk = 268800, .ratio = 16, .waveform = 0xfefe },
1429 { .refclk = 38400, .cdclk = 288000, .ratio = 16, .waveform = 0xfffe },
1430 { .refclk = 38400, .cdclk = 307200, .ratio = 16, .waveform = 0xffff },
1431 { .refclk = 38400, .cdclk = 330000, .ratio = 25, .waveform = 0xdbb6 },
1432 { .refclk = 38400, .cdclk = 360000, .ratio = 25, .waveform = 0xeeee },
1433 { .refclk = 38400, .cdclk = 390000, .ratio = 25, .waveform = 0xf7de },
1434 { .refclk = 38400, .cdclk = 420000, .ratio = 25, .waveform = 0xfefe },
1435 { .refclk = 38400, .cdclk = 450000, .ratio = 25, .waveform = 0xfffe },
1436 { .refclk = 38400, .cdclk = 480000, .ratio = 25, .waveform = 0xffff },
1437 { .refclk = 38400, .cdclk = 487200, .ratio = 29, .waveform = 0xfefe },
1438 { .refclk = 38400, .cdclk = 522000, .ratio = 29, .waveform = 0xfffe },
1439 { .refclk = 38400, .cdclk = 556800, .ratio = 29, .waveform = 0xffff },
1440 { .refclk = 38400, .cdclk = 571200, .ratio = 34, .waveform = 0xfefe },
1441 { .refclk = 38400, .cdclk = 612000, .ratio = 34, .waveform = 0xfffe },
1442 { .refclk = 38400, .cdclk = 652800, .ratio = 34, .waveform = 0xffff },
1446 static const int cdclk_squash_len = 16;
1448 static int cdclk_squash_divider(u16 waveform)
1450 return hweight16(waveform ?: 0xffff);
1453 static int cdclk_divider(int cdclk, int vco, u16 waveform)
1455 /* 2 * cd2x divider */
1456 return DIV_ROUND_CLOSEST(vco * cdclk_squash_divider(waveform),
1457 cdclk * cdclk_squash_len);
1460 static int bxt_calc_cdclk(struct drm_i915_private *dev_priv, int min_cdclk)
1462 const struct intel_cdclk_vals *table = dev_priv->display.cdclk.table;
1465 for (i = 0; table[i].refclk; i++)
1466 if (table[i].refclk == dev_priv->display.cdclk.hw.ref &&
1467 table[i].cdclk >= min_cdclk)
1468 return table[i].cdclk;
1470 drm_WARN(&dev_priv->drm, 1,
1471 "Cannot satisfy minimum cdclk %d with refclk %u\n",
1472 min_cdclk, dev_priv->display.cdclk.hw.ref);
1476 static int bxt_calc_cdclk_pll_vco(struct drm_i915_private *dev_priv, int cdclk)
1478 const struct intel_cdclk_vals *table = dev_priv->display.cdclk.table;
1481 if (cdclk == dev_priv->display.cdclk.hw.bypass)
1484 for (i = 0; table[i].refclk; i++)
1485 if (table[i].refclk == dev_priv->display.cdclk.hw.ref &&
1486 table[i].cdclk == cdclk)
1487 return dev_priv->display.cdclk.hw.ref * table[i].ratio;
1489 drm_WARN(&dev_priv->drm, 1, "cdclk %d not valid for refclk %u\n",
1490 cdclk, dev_priv->display.cdclk.hw.ref);
1494 static u8 bxt_calc_voltage_level(int cdclk)
1496 return DIV_ROUND_UP(cdclk, 25000);
1499 static u8 calc_voltage_level(int cdclk, int num_voltage_levels,
1500 const int voltage_level_max_cdclk[])
1504 for (voltage_level = 0; voltage_level < num_voltage_levels; voltage_level++) {
1505 if (cdclk <= voltage_level_max_cdclk[voltage_level])
1506 return voltage_level;
1509 MISSING_CASE(cdclk);
1510 return num_voltage_levels - 1;
1513 static u8 icl_calc_voltage_level(int cdclk)
1515 static const int icl_voltage_level_max_cdclk[] = {
1521 return calc_voltage_level(cdclk,
1522 ARRAY_SIZE(icl_voltage_level_max_cdclk),
1523 icl_voltage_level_max_cdclk);
1526 static u8 ehl_calc_voltage_level(int cdclk)
1528 static const int ehl_voltage_level_max_cdclk[] = {
1533 * Bspec lists the limit as 556.8 MHz, but some JSL
1534 * development boards (at least) boot with 652.8 MHz
1539 return calc_voltage_level(cdclk,
1540 ARRAY_SIZE(ehl_voltage_level_max_cdclk),
1541 ehl_voltage_level_max_cdclk);
1544 static u8 tgl_calc_voltage_level(int cdclk)
1546 static const int tgl_voltage_level_max_cdclk[] = {
1553 return calc_voltage_level(cdclk,
1554 ARRAY_SIZE(tgl_voltage_level_max_cdclk),
1555 tgl_voltage_level_max_cdclk);
1558 static u8 rplu_calc_voltage_level(int cdclk)
1560 static const int rplu_voltage_level_max_cdclk[] = {
1567 return calc_voltage_level(cdclk,
1568 ARRAY_SIZE(rplu_voltage_level_max_cdclk),
1569 rplu_voltage_level_max_cdclk);
1572 static void icl_readout_refclk(struct drm_i915_private *dev_priv,
1573 struct intel_cdclk_config *cdclk_config)
1575 u32 dssm = intel_de_read(dev_priv, SKL_DSSM) & ICL_DSSM_CDCLK_PLL_REFCLK_MASK;
1581 case ICL_DSSM_CDCLK_PLL_REFCLK_24MHz:
1582 cdclk_config->ref = 24000;
1584 case ICL_DSSM_CDCLK_PLL_REFCLK_19_2MHz:
1585 cdclk_config->ref = 19200;
1587 case ICL_DSSM_CDCLK_PLL_REFCLK_38_4MHz:
1588 cdclk_config->ref = 38400;
1593 static void bxt_de_pll_readout(struct drm_i915_private *dev_priv,
1594 struct intel_cdclk_config *cdclk_config)
1598 if (IS_DG2(dev_priv))
1599 cdclk_config->ref = 38400;
1600 else if (DISPLAY_VER(dev_priv) >= 11)
1601 icl_readout_refclk(dev_priv, cdclk_config);
1603 cdclk_config->ref = 19200;
1605 val = intel_de_read(dev_priv, BXT_DE_PLL_ENABLE);
1606 if ((val & BXT_DE_PLL_PLL_ENABLE) == 0 ||
1607 (val & BXT_DE_PLL_LOCK) == 0) {
1609 * CDCLK PLL is disabled, the VCO/ratio doesn't matter, but
1610 * setting it to zero is a way to signal that.
1612 cdclk_config->vco = 0;
1617 * DISPLAY_VER >= 11 have the ratio directly in the PLL enable register,
1618 * gen9lp had it in a separate PLL control register.
1620 if (DISPLAY_VER(dev_priv) >= 11)
1621 ratio = val & ICL_CDCLK_PLL_RATIO_MASK;
1623 ratio = intel_de_read(dev_priv, BXT_DE_PLL_CTL) & BXT_DE_PLL_RATIO_MASK;
1625 cdclk_config->vco = ratio * cdclk_config->ref;
1628 static void bxt_get_cdclk(struct drm_i915_private *dev_priv,
1629 struct intel_cdclk_config *cdclk_config)
1635 bxt_de_pll_readout(dev_priv, cdclk_config);
1637 if (DISPLAY_VER(dev_priv) >= 12)
1638 cdclk_config->bypass = cdclk_config->ref / 2;
1639 else if (DISPLAY_VER(dev_priv) >= 11)
1640 cdclk_config->bypass = 50000;
1642 cdclk_config->bypass = cdclk_config->ref;
1644 if (cdclk_config->vco == 0) {
1645 cdclk_config->cdclk = cdclk_config->bypass;
1649 divider = intel_de_read(dev_priv, CDCLK_CTL) & BXT_CDCLK_CD2X_DIV_SEL_MASK;
1652 case BXT_CDCLK_CD2X_DIV_SEL_1:
1655 case BXT_CDCLK_CD2X_DIV_SEL_1_5:
1658 case BXT_CDCLK_CD2X_DIV_SEL_2:
1661 case BXT_CDCLK_CD2X_DIV_SEL_4:
1665 MISSING_CASE(divider);
1669 if (HAS_CDCLK_SQUASH(dev_priv))
1670 squash_ctl = intel_de_read(dev_priv, CDCLK_SQUASH_CTL);
1672 if (squash_ctl & CDCLK_SQUASH_ENABLE) {
1676 size = REG_FIELD_GET(CDCLK_SQUASH_WINDOW_SIZE_MASK, squash_ctl) + 1;
1677 waveform = REG_FIELD_GET(CDCLK_SQUASH_WAVEFORM_MASK, squash_ctl) >> (16 - size);
1679 cdclk_config->cdclk = DIV_ROUND_CLOSEST(hweight16(waveform) *
1680 cdclk_config->vco, size * div);
1682 cdclk_config->cdclk = DIV_ROUND_CLOSEST(cdclk_config->vco, div);
1686 if (DISPLAY_VER(dev_priv) >= 20)
1687 cdclk_config->joined_mbus = intel_de_read(dev_priv, MBUS_CTL) & MBUS_JOIN;
1689 * Can't read this out :( Let's assume it's
1690 * at least what the CDCLK frequency requires.
1692 cdclk_config->voltage_level =
1693 intel_cdclk_calc_voltage_level(dev_priv, cdclk_config->cdclk);
1696 static void bxt_de_pll_disable(struct drm_i915_private *dev_priv)
1698 intel_de_write(dev_priv, BXT_DE_PLL_ENABLE, 0);
1701 if (intel_de_wait_for_clear(dev_priv,
1702 BXT_DE_PLL_ENABLE, BXT_DE_PLL_LOCK, 1))
1703 drm_err(&dev_priv->drm, "timeout waiting for DE PLL unlock\n");
1705 dev_priv->display.cdclk.hw.vco = 0;
1708 static void bxt_de_pll_enable(struct drm_i915_private *dev_priv, int vco)
1710 int ratio = DIV_ROUND_CLOSEST(vco, dev_priv->display.cdclk.hw.ref);
1712 intel_de_rmw(dev_priv, BXT_DE_PLL_CTL,
1713 BXT_DE_PLL_RATIO_MASK, BXT_DE_PLL_RATIO(ratio));
1715 intel_de_write(dev_priv, BXT_DE_PLL_ENABLE, BXT_DE_PLL_PLL_ENABLE);
1718 if (intel_de_wait_for_set(dev_priv,
1719 BXT_DE_PLL_ENABLE, BXT_DE_PLL_LOCK, 1))
1720 drm_err(&dev_priv->drm, "timeout waiting for DE PLL lock\n");
1722 dev_priv->display.cdclk.hw.vco = vco;
1725 static void icl_cdclk_pll_disable(struct drm_i915_private *dev_priv)
1727 intel_de_rmw(dev_priv, BXT_DE_PLL_ENABLE,
1728 BXT_DE_PLL_PLL_ENABLE, 0);
1731 if (intel_de_wait_for_clear(dev_priv, BXT_DE_PLL_ENABLE, BXT_DE_PLL_LOCK, 1))
1732 drm_err(&dev_priv->drm, "timeout waiting for CDCLK PLL unlock\n");
1734 dev_priv->display.cdclk.hw.vco = 0;
1737 static void icl_cdclk_pll_enable(struct drm_i915_private *dev_priv, int vco)
1739 int ratio = DIV_ROUND_CLOSEST(vco, dev_priv->display.cdclk.hw.ref);
1742 val = ICL_CDCLK_PLL_RATIO(ratio);
1743 intel_de_write(dev_priv, BXT_DE_PLL_ENABLE, val);
1745 val |= BXT_DE_PLL_PLL_ENABLE;
1746 intel_de_write(dev_priv, BXT_DE_PLL_ENABLE, val);
1749 if (intel_de_wait_for_set(dev_priv, BXT_DE_PLL_ENABLE, BXT_DE_PLL_LOCK, 1))
1750 drm_err(&dev_priv->drm, "timeout waiting for CDCLK PLL lock\n");
1752 dev_priv->display.cdclk.hw.vco = vco;
1755 static void adlp_cdclk_pll_crawl(struct drm_i915_private *dev_priv, int vco)
1757 int ratio = DIV_ROUND_CLOSEST(vco, dev_priv->display.cdclk.hw.ref);
1760 /* Write PLL ratio without disabling */
1761 val = ICL_CDCLK_PLL_RATIO(ratio) | BXT_DE_PLL_PLL_ENABLE;
1762 intel_de_write(dev_priv, BXT_DE_PLL_ENABLE, val);
1764 /* Submit freq change request */
1765 val |= BXT_DE_PLL_FREQ_REQ;
1766 intel_de_write(dev_priv, BXT_DE_PLL_ENABLE, val);
1769 if (intel_de_wait_for_set(dev_priv, BXT_DE_PLL_ENABLE,
1770 BXT_DE_PLL_LOCK | BXT_DE_PLL_FREQ_REQ_ACK, 1))
1771 drm_err(&dev_priv->drm, "timeout waiting for FREQ change request ack\n");
1773 val &= ~BXT_DE_PLL_FREQ_REQ;
1774 intel_de_write(dev_priv, BXT_DE_PLL_ENABLE, val);
1776 dev_priv->display.cdclk.hw.vco = vco;
1779 static u32 bxt_cdclk_cd2x_pipe(struct drm_i915_private *dev_priv, enum pipe pipe)
1781 if (DISPLAY_VER(dev_priv) >= 12) {
1782 if (pipe == INVALID_PIPE)
1783 return TGL_CDCLK_CD2X_PIPE_NONE;
1785 return TGL_CDCLK_CD2X_PIPE(pipe);
1786 } else if (DISPLAY_VER(dev_priv) >= 11) {
1787 if (pipe == INVALID_PIPE)
1788 return ICL_CDCLK_CD2X_PIPE_NONE;
1790 return ICL_CDCLK_CD2X_PIPE(pipe);
1792 if (pipe == INVALID_PIPE)
1793 return BXT_CDCLK_CD2X_PIPE_NONE;
1795 return BXT_CDCLK_CD2X_PIPE(pipe);
1799 static u32 bxt_cdclk_cd2x_div_sel(struct drm_i915_private *dev_priv,
1800 int cdclk, int vco, u16 waveform)
1802 /* cdclk = vco / 2 / div{1,1.5,2,4} */
1803 switch (cdclk_divider(cdclk, vco, waveform)) {
1805 drm_WARN_ON(&dev_priv->drm,
1806 cdclk != dev_priv->display.cdclk.hw.bypass);
1807 drm_WARN_ON(&dev_priv->drm, vco != 0);
1810 return BXT_CDCLK_CD2X_DIV_SEL_1;
1812 return BXT_CDCLK_CD2X_DIV_SEL_1_5;
1814 return BXT_CDCLK_CD2X_DIV_SEL_2;
1816 return BXT_CDCLK_CD2X_DIV_SEL_4;
1820 static u16 cdclk_squash_waveform(struct drm_i915_private *dev_priv,
1823 const struct intel_cdclk_vals *table = dev_priv->display.cdclk.table;
1826 if (cdclk == dev_priv->display.cdclk.hw.bypass)
1829 for (i = 0; table[i].refclk; i++)
1830 if (table[i].refclk == dev_priv->display.cdclk.hw.ref &&
1831 table[i].cdclk == cdclk)
1832 return table[i].waveform;
1834 drm_WARN(&dev_priv->drm, 1, "cdclk %d not valid for refclk %u\n",
1835 cdclk, dev_priv->display.cdclk.hw.ref);
1840 static void icl_cdclk_pll_update(struct drm_i915_private *i915, int vco)
1842 if (i915->display.cdclk.hw.vco != 0 &&
1843 i915->display.cdclk.hw.vco != vco)
1844 icl_cdclk_pll_disable(i915);
1846 if (i915->display.cdclk.hw.vco != vco)
1847 icl_cdclk_pll_enable(i915, vco);
1850 static void bxt_cdclk_pll_update(struct drm_i915_private *i915, int vco)
1852 if (i915->display.cdclk.hw.vco != 0 &&
1853 i915->display.cdclk.hw.vco != vco)
1854 bxt_de_pll_disable(i915);
1856 if (i915->display.cdclk.hw.vco != vco)
1857 bxt_de_pll_enable(i915, vco);
1860 static void dg2_cdclk_squash_program(struct drm_i915_private *i915,
1866 squash_ctl = CDCLK_SQUASH_ENABLE |
1867 CDCLK_SQUASH_WINDOW_SIZE(0xf) | waveform;
1869 intel_de_write(i915, CDCLK_SQUASH_CTL, squash_ctl);
1872 static bool cdclk_pll_is_unknown(unsigned int vco)
1875 * Ensure driver does not take the crawl path for the
1876 * case when the vco is set to ~0 in the
1882 static bool mdclk_source_is_cdclk_pll(struct drm_i915_private *i915)
1884 return DISPLAY_VER(i915) >= 20;
1887 static u32 xe2lpd_mdclk_source_sel(struct drm_i915_private *i915)
1889 if (mdclk_source_is_cdclk_pll(i915))
1890 return MDCLK_SOURCE_SEL_CDCLK_PLL;
1892 return MDCLK_SOURCE_SEL_CD2XCLK;
1895 int intel_mdclk_cdclk_ratio(struct drm_i915_private *i915,
1896 const struct intel_cdclk_config *cdclk_config)
1898 if (mdclk_source_is_cdclk_pll(i915))
1899 return DIV_ROUND_UP(cdclk_config->vco, cdclk_config->cdclk);
1901 /* Otherwise, source for MDCLK is CD2XCLK. */
1905 static void xe2lpd_mdclk_cdclk_ratio_program(struct drm_i915_private *i915,
1906 const struct intel_cdclk_config *cdclk_config)
1908 intel_dbuf_mdclk_cdclk_ratio_update(i915,
1909 intel_mdclk_cdclk_ratio(i915, cdclk_config),
1910 cdclk_config->joined_mbus);
1913 static bool cdclk_compute_crawl_and_squash_midpoint(struct drm_i915_private *i915,
1914 const struct intel_cdclk_config *old_cdclk_config,
1915 const struct intel_cdclk_config *new_cdclk_config,
1916 struct intel_cdclk_config *mid_cdclk_config)
1918 u16 old_waveform, new_waveform, mid_waveform;
1919 int old_div, new_div, mid_div;
1921 /* Return if PLL is in an unknown state, force a complete disable and re-enable. */
1922 if (cdclk_pll_is_unknown(old_cdclk_config->vco))
1925 /* Return if both Squash and Crawl are not present */
1926 if (!HAS_CDCLK_CRAWL(i915) || !HAS_CDCLK_SQUASH(i915))
1929 old_waveform = cdclk_squash_waveform(i915, old_cdclk_config->cdclk);
1930 new_waveform = cdclk_squash_waveform(i915, new_cdclk_config->cdclk);
1932 /* Return if Squash only or Crawl only is the desired action */
1933 if (old_cdclk_config->vco == 0 || new_cdclk_config->vco == 0 ||
1934 old_cdclk_config->vco == new_cdclk_config->vco ||
1935 old_waveform == new_waveform)
1938 old_div = cdclk_divider(old_cdclk_config->cdclk,
1939 old_cdclk_config->vco, old_waveform);
1940 new_div = cdclk_divider(new_cdclk_config->cdclk,
1941 new_cdclk_config->vco, new_waveform);
1944 * Should not happen currently. We might need more midpoint
1945 * transitions if we need to also change the cd2x divider.
1947 if (drm_WARN_ON(&i915->drm, old_div != new_div))
1950 *mid_cdclk_config = *new_cdclk_config;
1953 * Populate the mid_cdclk_config accordingly.
1954 * - If moving to a higher cdclk, the desired action is squashing.
1955 * The mid cdclk config should have the new (squash) waveform.
1956 * - If moving to a lower cdclk, the desired action is crawling.
1957 * The mid cdclk config should have the new vco.
1960 if (cdclk_squash_divider(new_waveform) > cdclk_squash_divider(old_waveform)) {
1961 mid_cdclk_config->vco = old_cdclk_config->vco;
1963 mid_waveform = new_waveform;
1965 mid_cdclk_config->vco = new_cdclk_config->vco;
1967 mid_waveform = old_waveform;
1970 mid_cdclk_config->cdclk = DIV_ROUND_CLOSEST(cdclk_squash_divider(mid_waveform) *
1971 mid_cdclk_config->vco,
1972 cdclk_squash_len * mid_div);
1974 /* make sure the mid clock came out sane */
1976 drm_WARN_ON(&i915->drm, mid_cdclk_config->cdclk <
1977 min(old_cdclk_config->cdclk, new_cdclk_config->cdclk));
1978 drm_WARN_ON(&i915->drm, mid_cdclk_config->cdclk >
1979 i915->display.cdclk.max_cdclk_freq);
1980 drm_WARN_ON(&i915->drm, cdclk_squash_waveform(i915, mid_cdclk_config->cdclk) !=
1986 static bool pll_enable_wa_needed(struct drm_i915_private *dev_priv)
1988 return (DISPLAY_VER_FULL(dev_priv) == IP_VER(20, 0) ||
1989 DISPLAY_VER_FULL(dev_priv) == IP_VER(14, 0) ||
1990 IS_DG2(dev_priv)) &&
1991 dev_priv->display.cdclk.hw.vco > 0;
1994 static u32 bxt_cdclk_ctl(struct drm_i915_private *i915,
1995 const struct intel_cdclk_config *cdclk_config,
1998 int cdclk = cdclk_config->cdclk;
1999 int vco = cdclk_config->vco;
2003 waveform = cdclk_squash_waveform(i915, cdclk);
2005 val = bxt_cdclk_cd2x_div_sel(i915, cdclk, vco, waveform) |
2006 bxt_cdclk_cd2x_pipe(i915, pipe);
2009 * Disable SSA Precharge when CD clock frequency < 500 MHz,
2012 if ((IS_GEMINILAKE(i915) || IS_BROXTON(i915)) &&
2014 val |= BXT_CDCLK_SSA_PRECHARGE_ENABLE;
2016 if (DISPLAY_VER(i915) >= 20)
2017 val |= xe2lpd_mdclk_source_sel(i915);
2019 val |= skl_cdclk_decimal(cdclk);
2024 static void _bxt_set_cdclk(struct drm_i915_private *dev_priv,
2025 const struct intel_cdclk_config *cdclk_config,
2028 int cdclk = cdclk_config->cdclk;
2029 int vco = cdclk_config->vco;
2031 if (HAS_CDCLK_CRAWL(dev_priv) && dev_priv->display.cdclk.hw.vco > 0 && vco > 0 &&
2032 !cdclk_pll_is_unknown(dev_priv->display.cdclk.hw.vco)) {
2033 if (dev_priv->display.cdclk.hw.vco != vco)
2034 adlp_cdclk_pll_crawl(dev_priv, vco);
2035 } else if (DISPLAY_VER(dev_priv) >= 11) {
2036 /* wa_15010685871: dg2, mtl */
2037 if (pll_enable_wa_needed(dev_priv))
2038 dg2_cdclk_squash_program(dev_priv, 0);
2040 icl_cdclk_pll_update(dev_priv, vco);
2042 bxt_cdclk_pll_update(dev_priv, vco);
2044 if (HAS_CDCLK_SQUASH(dev_priv)) {
2045 u16 waveform = cdclk_squash_waveform(dev_priv, cdclk);
2047 dg2_cdclk_squash_program(dev_priv, waveform);
2050 intel_de_write(dev_priv, CDCLK_CTL, bxt_cdclk_ctl(dev_priv, cdclk_config, pipe));
2052 if (pipe != INVALID_PIPE)
2053 intel_crtc_wait_for_next_vblank(intel_crtc_for_pipe(dev_priv, pipe));
2056 static void bxt_set_cdclk(struct drm_i915_private *dev_priv,
2057 const struct intel_cdclk_config *cdclk_config,
2060 struct intel_cdclk_config mid_cdclk_config;
2061 int cdclk = cdclk_config->cdclk;
2065 * Inform power controller of upcoming frequency change.
2066 * Display versions 14 and beyond do not follow the PUnit
2067 * mailbox communication, skip
2070 if (DISPLAY_VER(dev_priv) >= 14 || IS_DG2(dev_priv))
2072 else if (DISPLAY_VER(dev_priv) >= 11)
2073 ret = skl_pcode_request(&dev_priv->uncore, SKL_PCODE_CDCLK_CONTROL,
2074 SKL_CDCLK_PREPARE_FOR_CHANGE,
2075 SKL_CDCLK_READY_FOR_CHANGE,
2076 SKL_CDCLK_READY_FOR_CHANGE, 3);
2079 * BSpec requires us to wait up to 150usec, but that leads to
2080 * timeouts; the 2ms used here is based on experiment.
2082 ret = snb_pcode_write_timeout(&dev_priv->uncore,
2083 HSW_PCODE_DE_WRITE_FREQ_REQ,
2084 0x80000000, 150, 2);
2087 drm_err(&dev_priv->drm,
2088 "Failed to inform PCU about cdclk change (err %d, freq %d)\n",
2093 if (DISPLAY_VER(dev_priv) >= 20 && cdclk < dev_priv->display.cdclk.hw.cdclk)
2094 xe2lpd_mdclk_cdclk_ratio_program(dev_priv, cdclk_config);
2096 if (cdclk_compute_crawl_and_squash_midpoint(dev_priv, &dev_priv->display.cdclk.hw,
2097 cdclk_config, &mid_cdclk_config)) {
2098 _bxt_set_cdclk(dev_priv, &mid_cdclk_config, pipe);
2099 _bxt_set_cdclk(dev_priv, cdclk_config, pipe);
2101 _bxt_set_cdclk(dev_priv, cdclk_config, pipe);
2104 if (DISPLAY_VER(dev_priv) >= 20 && cdclk > dev_priv->display.cdclk.hw.cdclk)
2105 xe2lpd_mdclk_cdclk_ratio_program(dev_priv, cdclk_config);
2107 if (DISPLAY_VER(dev_priv) >= 14)
2109 * NOOP - No Pcode communication needed for
2110 * Display versions 14 and beyond
2112 else if (DISPLAY_VER(dev_priv) >= 11 && !IS_DG2(dev_priv))
2113 ret = snb_pcode_write(&dev_priv->uncore, SKL_PCODE_CDCLK_CONTROL,
2114 cdclk_config->voltage_level);
2115 if (DISPLAY_VER(dev_priv) < 11) {
2117 * The timeout isn't specified, the 2ms used here is based on
2119 * FIXME: Waiting for the request completion could be delayed
2120 * until the next PCODE request based on BSpec.
2122 ret = snb_pcode_write_timeout(&dev_priv->uncore,
2123 HSW_PCODE_DE_WRITE_FREQ_REQ,
2124 cdclk_config->voltage_level,
2128 drm_err(&dev_priv->drm,
2129 "PCode CDCLK freq set failed, (err %d, freq %d)\n",
2134 intel_update_cdclk(dev_priv);
2136 if (DISPLAY_VER(dev_priv) >= 11)
2138 * Can't read out the voltage level :(
2139 * Let's just assume everything is as expected.
2141 dev_priv->display.cdclk.hw.voltage_level = cdclk_config->voltage_level;
2144 static void bxt_sanitize_cdclk(struct drm_i915_private *dev_priv)
2146 u32 cdctl, expected;
2149 intel_update_cdclk(dev_priv);
2150 intel_cdclk_dump_config(dev_priv, &dev_priv->display.cdclk.hw, "Current CDCLK");
2152 if (dev_priv->display.cdclk.hw.vco == 0 ||
2153 dev_priv->display.cdclk.hw.cdclk == dev_priv->display.cdclk.hw.bypass)
2156 /* Make sure this is a legal cdclk value for the platform */
2157 cdclk = bxt_calc_cdclk(dev_priv, dev_priv->display.cdclk.hw.cdclk);
2158 if (cdclk != dev_priv->display.cdclk.hw.cdclk)
2161 /* Make sure the VCO is correct for the cdclk */
2162 vco = bxt_calc_cdclk_pll_vco(dev_priv, cdclk);
2163 if (vco != dev_priv->display.cdclk.hw.vco)
2167 * Some BIOS versions leave an incorrect decimal frequency value and
2168 * set reserved MBZ bits in CDCLK_CTL at least during exiting from S4,
2169 * so sanitize this register.
2171 cdctl = intel_de_read(dev_priv, CDCLK_CTL);
2172 expected = bxt_cdclk_ctl(dev_priv, &dev_priv->display.cdclk.hw, INVALID_PIPE);
2175 * Let's ignore the pipe field, since BIOS could have configured the
2176 * dividers both synching to an active pipe, or asynchronously
2179 cdctl &= ~bxt_cdclk_cd2x_pipe(dev_priv, INVALID_PIPE);
2180 expected &= ~bxt_cdclk_cd2x_pipe(dev_priv, INVALID_PIPE);
2182 if (cdctl == expected)
2183 /* All well; nothing to sanitize */
2187 drm_dbg_kms(&dev_priv->drm, "Sanitizing cdclk programmed by pre-os\n");
2189 /* force cdclk programming */
2190 dev_priv->display.cdclk.hw.cdclk = 0;
2192 /* force full PLL disable + enable */
2193 dev_priv->display.cdclk.hw.vco = ~0;
2196 static void bxt_cdclk_init_hw(struct drm_i915_private *dev_priv)
2198 struct intel_cdclk_config cdclk_config;
2200 bxt_sanitize_cdclk(dev_priv);
2202 if (dev_priv->display.cdclk.hw.cdclk != 0 &&
2203 dev_priv->display.cdclk.hw.vco != 0)
2206 cdclk_config = dev_priv->display.cdclk.hw;
2210 * - The initial CDCLK needs to be read from VBT.
2211 * Need to make this change after VBT has changes for BXT.
2213 cdclk_config.cdclk = bxt_calc_cdclk(dev_priv, 0);
2214 cdclk_config.vco = bxt_calc_cdclk_pll_vco(dev_priv, cdclk_config.cdclk);
2215 cdclk_config.voltage_level =
2216 intel_cdclk_calc_voltage_level(dev_priv, cdclk_config.cdclk);
2218 bxt_set_cdclk(dev_priv, &cdclk_config, INVALID_PIPE);
2221 static void bxt_cdclk_uninit_hw(struct drm_i915_private *dev_priv)
2223 struct intel_cdclk_config cdclk_config = dev_priv->display.cdclk.hw;
2225 cdclk_config.cdclk = cdclk_config.bypass;
2226 cdclk_config.vco = 0;
2227 cdclk_config.voltage_level =
2228 intel_cdclk_calc_voltage_level(dev_priv, cdclk_config.cdclk);
2230 bxt_set_cdclk(dev_priv, &cdclk_config, INVALID_PIPE);
2234 * intel_cdclk_init_hw - Initialize CDCLK hardware
2235 * @i915: i915 device
2237 * Initialize CDCLK. This consists mainly of initializing dev_priv->display.cdclk.hw and
2238 * sanitizing the state of the hardware if needed. This is generally done only
2239 * during the display core initialization sequence, after which the DMC will
2240 * take care of turning CDCLK off/on as needed.
2242 void intel_cdclk_init_hw(struct drm_i915_private *i915)
2244 if (DISPLAY_VER(i915) >= 10 || IS_BROXTON(i915))
2245 bxt_cdclk_init_hw(i915);
2246 else if (DISPLAY_VER(i915) == 9)
2247 skl_cdclk_init_hw(i915);
2251 * intel_cdclk_uninit_hw - Uninitialize CDCLK hardware
2252 * @i915: i915 device
2254 * Uninitialize CDCLK. This is done only during the display core
2255 * uninitialization sequence.
2257 void intel_cdclk_uninit_hw(struct drm_i915_private *i915)
2259 if (DISPLAY_VER(i915) >= 10 || IS_BROXTON(i915))
2260 bxt_cdclk_uninit_hw(i915);
2261 else if (DISPLAY_VER(i915) == 9)
2262 skl_cdclk_uninit_hw(i915);
2265 static bool intel_cdclk_can_crawl_and_squash(struct drm_i915_private *i915,
2266 const struct intel_cdclk_config *a,
2267 const struct intel_cdclk_config *b)
2272 drm_WARN_ON(&i915->drm, cdclk_pll_is_unknown(a->vco));
2274 if (a->vco == 0 || b->vco == 0)
2277 if (!HAS_CDCLK_CRAWL(i915) || !HAS_CDCLK_SQUASH(i915))
2280 old_waveform = cdclk_squash_waveform(i915, a->cdclk);
2281 new_waveform = cdclk_squash_waveform(i915, b->cdclk);
2283 return a->vco != b->vco &&
2284 old_waveform != new_waveform;
2287 static bool intel_cdclk_can_crawl(struct drm_i915_private *dev_priv,
2288 const struct intel_cdclk_config *a,
2289 const struct intel_cdclk_config *b)
2293 if (!HAS_CDCLK_CRAWL(dev_priv))
2297 * The vco and cd2x divider will change independently
2298 * from each, so we disallow cd2x change when crawling.
2300 a_div = DIV_ROUND_CLOSEST(a->vco, a->cdclk);
2301 b_div = DIV_ROUND_CLOSEST(b->vco, b->cdclk);
2303 return a->vco != 0 && b->vco != 0 &&
2309 static bool intel_cdclk_can_squash(struct drm_i915_private *dev_priv,
2310 const struct intel_cdclk_config *a,
2311 const struct intel_cdclk_config *b)
2314 * FIXME should store a bit more state in intel_cdclk_config
2315 * to differentiate squasher vs. cd2x divider properly. For
2316 * the moment all platforms with squasher use a fixed cd2x
2319 if (!HAS_CDCLK_SQUASH(dev_priv))
2322 return a->cdclk != b->cdclk &&
2329 * intel_cdclk_clock_changed - Check whether the clock changed
2330 * @a: first CDCLK configuration
2331 * @b: second CDCLK configuration
2334 * True if CDCLK changed in a way that requires re-programming and
2337 bool intel_cdclk_clock_changed(const struct intel_cdclk_config *a,
2338 const struct intel_cdclk_config *b)
2340 return a->cdclk != b->cdclk ||
2346 * intel_cdclk_can_cd2x_update - Determine if changing between the two CDCLK
2347 * configurations requires only a cd2x divider update
2348 * @dev_priv: i915 device
2349 * @a: first CDCLK configuration
2350 * @b: second CDCLK configuration
2353 * True if changing between the two CDCLK configurations
2354 * can be done with just a cd2x divider update, false if not.
2356 static bool intel_cdclk_can_cd2x_update(struct drm_i915_private *dev_priv,
2357 const struct intel_cdclk_config *a,
2358 const struct intel_cdclk_config *b)
2360 /* Older hw doesn't have the capability */
2361 if (DISPLAY_VER(dev_priv) < 10 && !IS_BROXTON(dev_priv))
2365 * FIXME should store a bit more state in intel_cdclk_config
2366 * to differentiate squasher vs. cd2x divider properly. For
2367 * the moment all platforms with squasher use a fixed cd2x
2370 if (HAS_CDCLK_SQUASH(dev_priv))
2373 return a->cdclk != b->cdclk &&
2380 * intel_cdclk_changed - Determine if two CDCLK configurations are different
2381 * @a: first CDCLK configuration
2382 * @b: second CDCLK configuration
2385 * True if the CDCLK configurations don't match, false if they do.
2387 static bool intel_cdclk_changed(const struct intel_cdclk_config *a,
2388 const struct intel_cdclk_config *b)
2390 return intel_cdclk_clock_changed(a, b) ||
2391 a->voltage_level != b->voltage_level;
2394 void intel_cdclk_dump_config(struct drm_i915_private *i915,
2395 const struct intel_cdclk_config *cdclk_config,
2396 const char *context)
2398 drm_dbg_kms(&i915->drm, "%s %d kHz, VCO %d kHz, ref %d kHz, bypass %d kHz, voltage level %d\n",
2399 context, cdclk_config->cdclk, cdclk_config->vco,
2400 cdclk_config->ref, cdclk_config->bypass,
2401 cdclk_config->voltage_level);
2404 static void intel_pcode_notify(struct drm_i915_private *i915,
2406 u8 active_pipe_count,
2408 bool cdclk_update_valid,
2409 bool pipe_count_update_valid)
2412 u32 update_mask = 0;
2417 update_mask = DISPLAY_TO_PCODE_UPDATE_MASK(cdclk, active_pipe_count, voltage_level);
2419 if (cdclk_update_valid)
2420 update_mask |= DISPLAY_TO_PCODE_CDCLK_VALID;
2422 if (pipe_count_update_valid)
2423 update_mask |= DISPLAY_TO_PCODE_PIPE_COUNT_VALID;
2425 ret = skl_pcode_request(&i915->uncore, SKL_PCODE_CDCLK_CONTROL,
2426 SKL_CDCLK_PREPARE_FOR_CHANGE |
2428 SKL_CDCLK_READY_FOR_CHANGE,
2429 SKL_CDCLK_READY_FOR_CHANGE, 3);
2432 "Failed to inform PCU about display config (err %d)\n",
2436 static void intel_set_cdclk(struct drm_i915_private *dev_priv,
2437 const struct intel_cdclk_config *cdclk_config,
2438 enum pipe pipe, const char *context)
2440 struct intel_encoder *encoder;
2442 if (!intel_cdclk_changed(&dev_priv->display.cdclk.hw, cdclk_config))
2445 if (drm_WARN_ON_ONCE(&dev_priv->drm, !dev_priv->display.funcs.cdclk->set_cdclk))
2448 intel_cdclk_dump_config(dev_priv, cdclk_config, context);
2450 for_each_intel_encoder_with_psr(&dev_priv->drm, encoder) {
2451 struct intel_dp *intel_dp = enc_to_intel_dp(encoder);
2453 intel_psr_pause(intel_dp);
2456 intel_audio_cdclk_change_pre(dev_priv);
2459 * Lock aux/gmbus while we change cdclk in case those
2460 * functions use cdclk. Not all platforms/ports do,
2461 * but we'll lock them all for simplicity.
2463 mutex_lock(&dev_priv->display.gmbus.mutex);
2464 for_each_intel_dp(&dev_priv->drm, encoder) {
2465 struct intel_dp *intel_dp = enc_to_intel_dp(encoder);
2467 mutex_lock_nest_lock(&intel_dp->aux.hw_mutex,
2468 &dev_priv->display.gmbus.mutex);
2471 intel_cdclk_set_cdclk(dev_priv, cdclk_config, pipe);
2473 for_each_intel_dp(&dev_priv->drm, encoder) {
2474 struct intel_dp *intel_dp = enc_to_intel_dp(encoder);
2476 mutex_unlock(&intel_dp->aux.hw_mutex);
2478 mutex_unlock(&dev_priv->display.gmbus.mutex);
2480 for_each_intel_encoder_with_psr(&dev_priv->drm, encoder) {
2481 struct intel_dp *intel_dp = enc_to_intel_dp(encoder);
2483 intel_psr_resume(intel_dp);
2486 intel_audio_cdclk_change_post(dev_priv);
2488 if (drm_WARN(&dev_priv->drm,
2489 intel_cdclk_changed(&dev_priv->display.cdclk.hw, cdclk_config),
2490 "cdclk state doesn't match!\n")) {
2491 intel_cdclk_dump_config(dev_priv, &dev_priv->display.cdclk.hw, "[hw state]");
2492 intel_cdclk_dump_config(dev_priv, cdclk_config, "[sw state]");
2496 static void intel_cdclk_pcode_pre_notify(struct intel_atomic_state *state)
2498 struct drm_i915_private *i915 = to_i915(state->base.dev);
2499 const struct intel_cdclk_state *old_cdclk_state =
2500 intel_atomic_get_old_cdclk_state(state);
2501 const struct intel_cdclk_state *new_cdclk_state =
2502 intel_atomic_get_new_cdclk_state(state);
2503 unsigned int cdclk = 0; u8 voltage_level, num_active_pipes = 0;
2504 bool change_cdclk, update_pipe_count;
2506 if (!intel_cdclk_changed(&old_cdclk_state->actual,
2507 &new_cdclk_state->actual) &&
2508 new_cdclk_state->active_pipes ==
2509 old_cdclk_state->active_pipes)
2512 /* According to "Sequence Before Frequency Change", voltage level set to 0x3 */
2513 voltage_level = DISPLAY_TO_PCODE_VOLTAGE_MAX;
2515 change_cdclk = new_cdclk_state->actual.cdclk != old_cdclk_state->actual.cdclk;
2516 update_pipe_count = hweight8(new_cdclk_state->active_pipes) >
2517 hweight8(old_cdclk_state->active_pipes);
2520 * According to "Sequence Before Frequency Change",
2521 * if CDCLK is increasing, set bits 25:16 to upcoming CDCLK,
2522 * if CDCLK is decreasing or not changing, set bits 25:16 to current CDCLK,
2523 * which basically means we choose the maximum of old and new CDCLK, if we know both
2526 cdclk = max(new_cdclk_state->actual.cdclk, old_cdclk_state->actual.cdclk);
2529 * According to "Sequence For Pipe Count Change",
2530 * if pipe count is increasing, set bits 25:16 to upcoming pipe count
2531 * (power well is enabled)
2532 * no action if it is decreasing, before the change
2534 if (update_pipe_count)
2535 num_active_pipes = hweight8(new_cdclk_state->active_pipes);
2537 intel_pcode_notify(i915, voltage_level, num_active_pipes, cdclk,
2538 change_cdclk, update_pipe_count);
2541 static void intel_cdclk_pcode_post_notify(struct intel_atomic_state *state)
2543 struct drm_i915_private *i915 = to_i915(state->base.dev);
2544 const struct intel_cdclk_state *new_cdclk_state =
2545 intel_atomic_get_new_cdclk_state(state);
2546 const struct intel_cdclk_state *old_cdclk_state =
2547 intel_atomic_get_old_cdclk_state(state);
2548 unsigned int cdclk = 0; u8 voltage_level, num_active_pipes = 0;
2549 bool update_cdclk, update_pipe_count;
2551 /* According to "Sequence After Frequency Change", set voltage to used level */
2552 voltage_level = new_cdclk_state->actual.voltage_level;
2554 update_cdclk = new_cdclk_state->actual.cdclk != old_cdclk_state->actual.cdclk;
2555 update_pipe_count = hweight8(new_cdclk_state->active_pipes) <
2556 hweight8(old_cdclk_state->active_pipes);
2559 * According to "Sequence After Frequency Change",
2560 * set bits 25:16 to current CDCLK
2563 cdclk = new_cdclk_state->actual.cdclk;
2566 * According to "Sequence For Pipe Count Change",
2567 * if pipe count is decreasing, set bits 25:16 to current pipe count,
2568 * after the change(power well is disabled)
2569 * no action if it is increasing, after the change
2571 if (update_pipe_count)
2572 num_active_pipes = hweight8(new_cdclk_state->active_pipes);
2574 intel_pcode_notify(i915, voltage_level, num_active_pipes, cdclk,
2575 update_cdclk, update_pipe_count);
2578 bool intel_cdclk_is_decreasing_later(struct intel_atomic_state *state)
2580 const struct intel_cdclk_state *old_cdclk_state =
2581 intel_atomic_get_old_cdclk_state(state);
2582 const struct intel_cdclk_state *new_cdclk_state =
2583 intel_atomic_get_new_cdclk_state(state);
2585 return new_cdclk_state && !new_cdclk_state->disable_pipes &&
2586 new_cdclk_state->actual.cdclk < old_cdclk_state->actual.cdclk;
2590 * intel_set_cdclk_pre_plane_update - Push the CDCLK state to the hardware
2591 * @state: intel atomic state
2593 * Program the hardware before updating the HW plane state based on the
2594 * new CDCLK state, if necessary.
2597 intel_set_cdclk_pre_plane_update(struct intel_atomic_state *state)
2599 struct drm_i915_private *i915 = to_i915(state->base.dev);
2600 const struct intel_cdclk_state *old_cdclk_state =
2601 intel_atomic_get_old_cdclk_state(state);
2602 const struct intel_cdclk_state *new_cdclk_state =
2603 intel_atomic_get_new_cdclk_state(state);
2604 struct intel_cdclk_config cdclk_config;
2607 if (!intel_cdclk_changed(&old_cdclk_state->actual,
2608 &new_cdclk_state->actual))
2612 intel_cdclk_pcode_pre_notify(state);
2614 if (new_cdclk_state->disable_pipes) {
2615 cdclk_config = new_cdclk_state->actual;
2616 pipe = INVALID_PIPE;
2618 if (new_cdclk_state->actual.cdclk >= old_cdclk_state->actual.cdclk) {
2619 cdclk_config = new_cdclk_state->actual;
2620 pipe = new_cdclk_state->pipe;
2622 cdclk_config = old_cdclk_state->actual;
2623 pipe = INVALID_PIPE;
2626 cdclk_config.voltage_level = max(new_cdclk_state->actual.voltage_level,
2627 old_cdclk_state->actual.voltage_level);
2631 * mbus joining will be changed later by
2632 * intel_dbuf_mbus_{pre,post}_ddb_update()
2634 cdclk_config.joined_mbus = old_cdclk_state->actual.joined_mbus;
2636 drm_WARN_ON(&i915->drm, !new_cdclk_state->base.changed);
2638 intel_set_cdclk(i915, &cdclk_config, pipe,
2639 "Pre changing CDCLK to");
2643 * intel_set_cdclk_post_plane_update - Push the CDCLK state to the hardware
2644 * @state: intel atomic state
2646 * Program the hardware after updating the HW plane state based on the
2647 * new CDCLK state, if necessary.
2650 intel_set_cdclk_post_plane_update(struct intel_atomic_state *state)
2652 struct drm_i915_private *i915 = to_i915(state->base.dev);
2653 const struct intel_cdclk_state *old_cdclk_state =
2654 intel_atomic_get_old_cdclk_state(state);
2655 const struct intel_cdclk_state *new_cdclk_state =
2656 intel_atomic_get_new_cdclk_state(state);
2659 if (!intel_cdclk_changed(&old_cdclk_state->actual,
2660 &new_cdclk_state->actual))
2664 intel_cdclk_pcode_post_notify(state);
2666 if (!new_cdclk_state->disable_pipes &&
2667 new_cdclk_state->actual.cdclk < old_cdclk_state->actual.cdclk)
2668 pipe = new_cdclk_state->pipe;
2670 pipe = INVALID_PIPE;
2672 drm_WARN_ON(&i915->drm, !new_cdclk_state->base.changed);
2674 intel_set_cdclk(i915, &new_cdclk_state->actual, pipe,
2675 "Post changing CDCLK to");
2678 static int intel_pixel_rate_to_cdclk(const struct intel_crtc_state *crtc_state)
2680 struct drm_i915_private *dev_priv = to_i915(crtc_state->uapi.crtc->dev);
2681 int pixel_rate = crtc_state->pixel_rate;
2683 if (DISPLAY_VER(dev_priv) >= 10)
2684 return DIV_ROUND_UP(pixel_rate, 2);
2685 else if (DISPLAY_VER(dev_priv) == 9 ||
2686 IS_BROADWELL(dev_priv) || IS_HASWELL(dev_priv))
2688 else if (IS_CHERRYVIEW(dev_priv))
2689 return DIV_ROUND_UP(pixel_rate * 100, 95);
2690 else if (crtc_state->double_wide)
2691 return DIV_ROUND_UP(pixel_rate * 100, 90 * 2);
2693 return DIV_ROUND_UP(pixel_rate * 100, 90);
2696 static int intel_planes_min_cdclk(const struct intel_crtc_state *crtc_state)
2698 struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
2699 struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
2700 struct intel_plane *plane;
2703 for_each_intel_plane_on_crtc(&dev_priv->drm, crtc, plane)
2704 min_cdclk = max(crtc_state->min_cdclk[plane->id], min_cdclk);
2709 static int intel_vdsc_min_cdclk(const struct intel_crtc_state *crtc_state)
2711 struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
2712 struct drm_i915_private *i915 = to_i915(crtc->base.dev);
2713 int num_vdsc_instances = intel_dsc_get_num_vdsc_instances(crtc_state);
2717 * When we decide to use only one VDSC engine, since
2718 * each VDSC operates with 1 ppc throughput, pixel clock
2719 * cannot be higher than the VDSC clock (cdclk)
2720 * If there 2 VDSC engines, then pixel clock can't be higher than
2721 * VDSC clock(cdclk) * 2 and so on.
2723 min_cdclk = max_t(int, min_cdclk,
2724 DIV_ROUND_UP(crtc_state->pixel_rate, num_vdsc_instances));
2726 if (crtc_state->bigjoiner_pipes) {
2727 int pixel_clock = intel_dp_mode_to_fec_clock(crtc_state->hw.adjusted_mode.clock);
2730 * According to Bigjoiner bw check:
2731 * compressed_bpp <= PPC * CDCLK * Big joiner Interface bits / Pixel clock
2733 * We have already computed compressed_bpp, so now compute the min CDCLK that
2734 * is required to support this compressed_bpp.
2736 * => CDCLK >= compressed_bpp * Pixel clock / (PPC * Bigjoiner Interface bits)
2738 * Since PPC = 2 with bigjoiner
2739 * => CDCLK >= compressed_bpp * Pixel clock / 2 * Bigjoiner Interface bits
2741 int bigjoiner_interface_bits = DISPLAY_VER(i915) >= 14 ? 36 : 24;
2743 (to_bpp_int_roundup(crtc_state->dsc.compressed_bpp_x16) *
2744 pixel_clock) / (2 * bigjoiner_interface_bits);
2746 min_cdclk = max(min_cdclk, min_cdclk_bj);
2752 int intel_crtc_compute_min_cdclk(const struct intel_crtc_state *crtc_state)
2754 struct drm_i915_private *dev_priv =
2755 to_i915(crtc_state->uapi.crtc->dev);
2758 if (!crtc_state->hw.enable)
2761 min_cdclk = intel_pixel_rate_to_cdclk(crtc_state);
2763 /* pixel rate mustn't exceed 95% of cdclk with IPS on BDW */
2764 if (IS_BROADWELL(dev_priv) && hsw_crtc_state_ips_capable(crtc_state))
2765 min_cdclk = DIV_ROUND_UP(min_cdclk * 100, 95);
2767 /* BSpec says "Do not use DisplayPort with CDCLK less than 432 MHz,
2768 * audio enabled, port width x4, and link rate HBR2 (5.4 GHz), or else
2769 * there may be audio corruption or screen corruption." This cdclk
2770 * restriction for GLK is 316.8 MHz.
2772 if (intel_crtc_has_dp_encoder(crtc_state) &&
2773 crtc_state->has_audio &&
2774 crtc_state->port_clock >= 540000 &&
2775 crtc_state->lane_count == 4) {
2776 if (DISPLAY_VER(dev_priv) == 10) {
2777 /* Display WA #1145: glk */
2778 min_cdclk = max(316800, min_cdclk);
2779 } else if (DISPLAY_VER(dev_priv) == 9 || IS_BROADWELL(dev_priv)) {
2780 /* Display WA #1144: skl,bxt */
2781 min_cdclk = max(432000, min_cdclk);
2786 * According to BSpec, "The CD clock frequency must be at least twice
2787 * the frequency of the Azalia BCLK." and BCLK is 96 MHz by default.
2789 if (crtc_state->has_audio && DISPLAY_VER(dev_priv) >= 9)
2790 min_cdclk = max(2 * 96000, min_cdclk);
2793 * "For DP audio configuration, cdclk frequency shall be set to
2794 * meet the following requirements:
2795 * DP Link Frequency(MHz) | Cdclk frequency(MHz)
2796 * 270 | 320 or higher
2797 * 162 | 200 or higher"
2799 if ((IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv)) &&
2800 intel_crtc_has_dp_encoder(crtc_state) && crtc_state->has_audio)
2801 min_cdclk = max(crtc_state->port_clock, min_cdclk);
2804 * On Valleyview some DSI panels lose (v|h)sync when the clock is lower
2807 if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_DSI) &&
2808 IS_VALLEYVIEW(dev_priv))
2809 min_cdclk = max(320000, min_cdclk);
2812 * On Geminilake once the CDCLK gets as low as 79200
2813 * picture gets unstable, despite that values are
2814 * correct for DSI PLL and DE PLL.
2816 if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_DSI) &&
2817 IS_GEMINILAKE(dev_priv))
2818 min_cdclk = max(158400, min_cdclk);
2820 /* Account for additional needs from the planes */
2821 min_cdclk = max(intel_planes_min_cdclk(crtc_state), min_cdclk);
2823 if (crtc_state->dsc.compression_enable)
2824 min_cdclk = max(min_cdclk, intel_vdsc_min_cdclk(crtc_state));
2829 static int intel_compute_min_cdclk(struct intel_cdclk_state *cdclk_state)
2831 struct intel_atomic_state *state = cdclk_state->base.state;
2832 struct drm_i915_private *dev_priv = to_i915(state->base.dev);
2833 const struct intel_bw_state *bw_state;
2834 struct intel_crtc *crtc;
2835 struct intel_crtc_state *crtc_state;
2839 for_each_new_intel_crtc_in_state(state, crtc, crtc_state, i) {
2842 min_cdclk = intel_crtc_compute_min_cdclk(crtc_state);
2846 if (cdclk_state->min_cdclk[crtc->pipe] == min_cdclk)
2849 cdclk_state->min_cdclk[crtc->pipe] = min_cdclk;
2851 ret = intel_atomic_lock_global_state(&cdclk_state->base);
2856 bw_state = intel_atomic_get_new_bw_state(state);
2858 min_cdclk = intel_bw_min_cdclk(dev_priv, bw_state);
2860 if (cdclk_state->bw_min_cdclk != min_cdclk) {
2863 cdclk_state->bw_min_cdclk = min_cdclk;
2865 ret = intel_atomic_lock_global_state(&cdclk_state->base);
2871 min_cdclk = max(cdclk_state->force_min_cdclk,
2872 cdclk_state->bw_min_cdclk);
2873 for_each_pipe(dev_priv, pipe)
2874 min_cdclk = max(cdclk_state->min_cdclk[pipe], min_cdclk);
2877 * Avoid glk_force_audio_cdclk() causing excessive screen
2878 * blinking when multiple pipes are active by making sure
2879 * CDCLK frequency is always high enough for audio. With a
2880 * single active pipe we can always change CDCLK frequency
2881 * by changing the cd2x divider (see glk_cdclk_table[]) and
2882 * thus a full modeset won't be needed then.
2884 if (IS_GEMINILAKE(dev_priv) && cdclk_state->active_pipes &&
2885 !is_power_of_2(cdclk_state->active_pipes))
2886 min_cdclk = max(2 * 96000, min_cdclk);
2888 if (min_cdclk > dev_priv->display.cdclk.max_cdclk_freq) {
2889 drm_dbg_kms(&dev_priv->drm,
2890 "required cdclk (%d kHz) exceeds max (%d kHz)\n",
2891 min_cdclk, dev_priv->display.cdclk.max_cdclk_freq);
2899 * Account for port clock min voltage level requirements.
2900 * This only really does something on DISPLA_VER >= 11 but can be
2901 * called on earlier platforms as well.
2903 * Note that this functions assumes that 0 is
2904 * the lowest voltage value, and higher values
2905 * correspond to increasingly higher voltages.
2907 * Should that relationship no longer hold on
2908 * future platforms this code will need to be
2911 static int bxt_compute_min_voltage_level(struct intel_cdclk_state *cdclk_state)
2913 struct intel_atomic_state *state = cdclk_state->base.state;
2914 struct drm_i915_private *dev_priv = to_i915(state->base.dev);
2915 struct intel_crtc *crtc;
2916 struct intel_crtc_state *crtc_state;
2917 u8 min_voltage_level;
2921 for_each_new_intel_crtc_in_state(state, crtc, crtc_state, i) {
2924 if (crtc_state->hw.enable)
2925 min_voltage_level = crtc_state->min_voltage_level;
2927 min_voltage_level = 0;
2929 if (cdclk_state->min_voltage_level[crtc->pipe] == min_voltage_level)
2932 cdclk_state->min_voltage_level[crtc->pipe] = min_voltage_level;
2934 ret = intel_atomic_lock_global_state(&cdclk_state->base);
2939 min_voltage_level = 0;
2940 for_each_pipe(dev_priv, pipe)
2941 min_voltage_level = max(cdclk_state->min_voltage_level[pipe],
2944 return min_voltage_level;
2947 static int vlv_modeset_calc_cdclk(struct intel_cdclk_state *cdclk_state)
2949 struct intel_atomic_state *state = cdclk_state->base.state;
2950 struct drm_i915_private *dev_priv = to_i915(state->base.dev);
2951 int min_cdclk, cdclk;
2953 min_cdclk = intel_compute_min_cdclk(cdclk_state);
2957 cdclk = vlv_calc_cdclk(dev_priv, min_cdclk);
2959 cdclk_state->logical.cdclk = cdclk;
2960 cdclk_state->logical.voltage_level =
2961 vlv_calc_voltage_level(dev_priv, cdclk);
2963 if (!cdclk_state->active_pipes) {
2964 cdclk = vlv_calc_cdclk(dev_priv, cdclk_state->force_min_cdclk);
2966 cdclk_state->actual.cdclk = cdclk;
2967 cdclk_state->actual.voltage_level =
2968 vlv_calc_voltage_level(dev_priv, cdclk);
2970 cdclk_state->actual = cdclk_state->logical;
2976 static int bdw_modeset_calc_cdclk(struct intel_cdclk_state *cdclk_state)
2978 int min_cdclk, cdclk;
2980 min_cdclk = intel_compute_min_cdclk(cdclk_state);
2984 cdclk = bdw_calc_cdclk(min_cdclk);
2986 cdclk_state->logical.cdclk = cdclk;
2987 cdclk_state->logical.voltage_level =
2988 bdw_calc_voltage_level(cdclk);
2990 if (!cdclk_state->active_pipes) {
2991 cdclk = bdw_calc_cdclk(cdclk_state->force_min_cdclk);
2993 cdclk_state->actual.cdclk = cdclk;
2994 cdclk_state->actual.voltage_level =
2995 bdw_calc_voltage_level(cdclk);
2997 cdclk_state->actual = cdclk_state->logical;
3003 static int skl_dpll0_vco(struct intel_cdclk_state *cdclk_state)
3005 struct intel_atomic_state *state = cdclk_state->base.state;
3006 struct drm_i915_private *dev_priv = to_i915(state->base.dev);
3007 struct intel_crtc *crtc;
3008 struct intel_crtc_state *crtc_state;
3011 vco = cdclk_state->logical.vco;
3013 vco = dev_priv->display.cdclk.skl_preferred_vco_freq;
3015 for_each_new_intel_crtc_in_state(state, crtc, crtc_state, i) {
3016 if (!crtc_state->hw.enable)
3019 if (!intel_crtc_has_type(crtc_state, INTEL_OUTPUT_EDP))
3023 * DPLL0 VCO may need to be adjusted to get the correct
3024 * clock for eDP. This will affect cdclk as well.
3026 switch (crtc_state->port_clock / 2) {
3040 static int skl_modeset_calc_cdclk(struct intel_cdclk_state *cdclk_state)
3042 int min_cdclk, cdclk, vco;
3044 min_cdclk = intel_compute_min_cdclk(cdclk_state);
3048 vco = skl_dpll0_vco(cdclk_state);
3050 cdclk = skl_calc_cdclk(min_cdclk, vco);
3052 cdclk_state->logical.vco = vco;
3053 cdclk_state->logical.cdclk = cdclk;
3054 cdclk_state->logical.voltage_level =
3055 skl_calc_voltage_level(cdclk);
3057 if (!cdclk_state->active_pipes) {
3058 cdclk = skl_calc_cdclk(cdclk_state->force_min_cdclk, vco);
3060 cdclk_state->actual.vco = vco;
3061 cdclk_state->actual.cdclk = cdclk;
3062 cdclk_state->actual.voltage_level =
3063 skl_calc_voltage_level(cdclk);
3065 cdclk_state->actual = cdclk_state->logical;
3071 static int bxt_modeset_calc_cdclk(struct intel_cdclk_state *cdclk_state)
3073 struct intel_atomic_state *state = cdclk_state->base.state;
3074 struct drm_i915_private *dev_priv = to_i915(state->base.dev);
3075 int min_cdclk, min_voltage_level, cdclk, vco;
3077 min_cdclk = intel_compute_min_cdclk(cdclk_state);
3081 min_voltage_level = bxt_compute_min_voltage_level(cdclk_state);
3082 if (min_voltage_level < 0)
3083 return min_voltage_level;
3085 cdclk = bxt_calc_cdclk(dev_priv, min_cdclk);
3086 vco = bxt_calc_cdclk_pll_vco(dev_priv, cdclk);
3088 cdclk_state->logical.vco = vco;
3089 cdclk_state->logical.cdclk = cdclk;
3090 cdclk_state->logical.voltage_level =
3091 max_t(int, min_voltage_level,
3092 intel_cdclk_calc_voltage_level(dev_priv, cdclk));
3094 if (!cdclk_state->active_pipes) {
3095 cdclk = bxt_calc_cdclk(dev_priv, cdclk_state->force_min_cdclk);
3096 vco = bxt_calc_cdclk_pll_vco(dev_priv, cdclk);
3098 cdclk_state->actual.vco = vco;
3099 cdclk_state->actual.cdclk = cdclk;
3100 cdclk_state->actual.voltage_level =
3101 intel_cdclk_calc_voltage_level(dev_priv, cdclk);
3103 cdclk_state->actual = cdclk_state->logical;
3109 static int fixed_modeset_calc_cdclk(struct intel_cdclk_state *cdclk_state)
3114 * We can't change the cdclk frequency, but we still want to
3115 * check that the required minimum frequency doesn't exceed
3116 * the actual cdclk frequency.
3118 min_cdclk = intel_compute_min_cdclk(cdclk_state);
3125 static struct intel_global_state *intel_cdclk_duplicate_state(struct intel_global_obj *obj)
3127 struct intel_cdclk_state *cdclk_state;
3129 cdclk_state = kmemdup(obj->state, sizeof(*cdclk_state), GFP_KERNEL);
3133 cdclk_state->pipe = INVALID_PIPE;
3134 cdclk_state->disable_pipes = false;
3136 return &cdclk_state->base;
3139 static void intel_cdclk_destroy_state(struct intel_global_obj *obj,
3140 struct intel_global_state *state)
3145 static const struct intel_global_state_funcs intel_cdclk_funcs = {
3146 .atomic_duplicate_state = intel_cdclk_duplicate_state,
3147 .atomic_destroy_state = intel_cdclk_destroy_state,
3150 struct intel_cdclk_state *
3151 intel_atomic_get_cdclk_state(struct intel_atomic_state *state)
3153 struct drm_i915_private *dev_priv = to_i915(state->base.dev);
3154 struct intel_global_state *cdclk_state;
3156 cdclk_state = intel_atomic_get_global_obj_state(state, &dev_priv->display.cdclk.obj);
3157 if (IS_ERR(cdclk_state))
3158 return ERR_CAST(cdclk_state);
3160 return to_intel_cdclk_state(cdclk_state);
3163 int intel_cdclk_atomic_check(struct intel_atomic_state *state,
3164 bool *need_cdclk_calc)
3166 const struct intel_cdclk_state *old_cdclk_state;
3167 const struct intel_cdclk_state *new_cdclk_state;
3168 struct intel_plane_state __maybe_unused *plane_state;
3169 struct intel_plane *plane;
3174 * active_planes bitmask has been updated, and potentially affected
3175 * planes are part of the state. We can now compute the minimum cdclk
3178 for_each_new_intel_plane_in_state(state, plane, plane_state, i) {
3179 ret = intel_plane_calc_min_cdclk(state, plane, need_cdclk_calc);
3184 ret = intel_bw_calc_min_cdclk(state, need_cdclk_calc);
3188 old_cdclk_state = intel_atomic_get_old_cdclk_state(state);
3189 new_cdclk_state = intel_atomic_get_new_cdclk_state(state);
3191 if (new_cdclk_state &&
3192 old_cdclk_state->force_min_cdclk != new_cdclk_state->force_min_cdclk)
3193 *need_cdclk_calc = true;
3198 int intel_cdclk_state_set_joined_mbus(struct intel_atomic_state *state, bool joined_mbus)
3200 struct intel_cdclk_state *cdclk_state;
3202 cdclk_state = intel_atomic_get_cdclk_state(state);
3203 if (IS_ERR(cdclk_state))
3204 return PTR_ERR(cdclk_state);
3206 cdclk_state->actual.joined_mbus = joined_mbus;
3207 cdclk_state->logical.joined_mbus = joined_mbus;
3209 return intel_atomic_lock_global_state(&cdclk_state->base);
3212 int intel_cdclk_init(struct drm_i915_private *dev_priv)
3214 struct intel_cdclk_state *cdclk_state;
3216 cdclk_state = kzalloc(sizeof(*cdclk_state), GFP_KERNEL);
3220 intel_atomic_global_obj_init(dev_priv, &dev_priv->display.cdclk.obj,
3221 &cdclk_state->base, &intel_cdclk_funcs);
3226 static bool intel_cdclk_need_serialize(struct drm_i915_private *i915,
3227 const struct intel_cdclk_state *old_cdclk_state,
3228 const struct intel_cdclk_state *new_cdclk_state)
3230 bool power_well_cnt_changed = hweight8(old_cdclk_state->active_pipes) !=
3231 hweight8(new_cdclk_state->active_pipes);
3232 bool cdclk_changed = intel_cdclk_changed(&old_cdclk_state->actual,
3233 &new_cdclk_state->actual);
3235 * We need to poke hw for gen >= 12, because we notify PCode if
3236 * pipe power well count changes.
3238 return cdclk_changed || (IS_DG2(i915) && power_well_cnt_changed);
3241 int intel_modeset_calc_cdclk(struct intel_atomic_state *state)
3243 struct drm_i915_private *dev_priv = to_i915(state->base.dev);
3244 const struct intel_cdclk_state *old_cdclk_state;
3245 struct intel_cdclk_state *new_cdclk_state;
3246 enum pipe pipe = INVALID_PIPE;
3249 new_cdclk_state = intel_atomic_get_cdclk_state(state);
3250 if (IS_ERR(new_cdclk_state))
3251 return PTR_ERR(new_cdclk_state);
3253 old_cdclk_state = intel_atomic_get_old_cdclk_state(state);
3255 new_cdclk_state->active_pipes =
3256 intel_calc_active_pipes(state, old_cdclk_state->active_pipes);
3258 ret = intel_cdclk_modeset_calc_cdclk(dev_priv, new_cdclk_state);
3262 if (intel_cdclk_need_serialize(dev_priv, old_cdclk_state, new_cdclk_state)) {
3264 * Also serialize commits across all crtcs
3265 * if the actual hw needs to be poked.
3267 ret = intel_atomic_serialize_global_state(&new_cdclk_state->base);
3270 } else if (old_cdclk_state->active_pipes != new_cdclk_state->active_pipes ||
3271 old_cdclk_state->force_min_cdclk != new_cdclk_state->force_min_cdclk ||
3272 intel_cdclk_changed(&old_cdclk_state->logical,
3273 &new_cdclk_state->logical)) {
3274 ret = intel_atomic_lock_global_state(&new_cdclk_state->base);
3281 if (is_power_of_2(new_cdclk_state->active_pipes) &&
3282 intel_cdclk_can_cd2x_update(dev_priv,
3283 &old_cdclk_state->actual,
3284 &new_cdclk_state->actual)) {
3285 struct intel_crtc *crtc;
3286 struct intel_crtc_state *crtc_state;
3288 pipe = ilog2(new_cdclk_state->active_pipes);
3289 crtc = intel_crtc_for_pipe(dev_priv, pipe);
3291 crtc_state = intel_atomic_get_crtc_state(&state->base, crtc);
3292 if (IS_ERR(crtc_state))
3293 return PTR_ERR(crtc_state);
3295 if (intel_crtc_needs_modeset(crtc_state))
3296 pipe = INVALID_PIPE;
3299 if (intel_cdclk_can_crawl_and_squash(dev_priv,
3300 &old_cdclk_state->actual,
3301 &new_cdclk_state->actual)) {
3302 drm_dbg_kms(&dev_priv->drm,
3303 "Can change cdclk via crawling and squashing\n");
3304 } else if (intel_cdclk_can_squash(dev_priv,
3305 &old_cdclk_state->actual,
3306 &new_cdclk_state->actual)) {
3307 drm_dbg_kms(&dev_priv->drm,
3308 "Can change cdclk via squashing\n");
3309 } else if (intel_cdclk_can_crawl(dev_priv,
3310 &old_cdclk_state->actual,
3311 &new_cdclk_state->actual)) {
3312 drm_dbg_kms(&dev_priv->drm,
3313 "Can change cdclk via crawling\n");
3314 } else if (pipe != INVALID_PIPE) {
3315 new_cdclk_state->pipe = pipe;
3317 drm_dbg_kms(&dev_priv->drm,
3318 "Can change cdclk cd2x divider with pipe %c active\n",
3320 } else if (intel_cdclk_clock_changed(&old_cdclk_state->actual,
3321 &new_cdclk_state->actual)) {
3322 /* All pipes must be switched off while we change the cdclk. */
3323 ret = intel_modeset_all_pipes_late(state, "CDCLK change");
3327 new_cdclk_state->disable_pipes = true;
3329 drm_dbg_kms(&dev_priv->drm,
3330 "Modeset required for cdclk change\n");
3333 if (intel_mdclk_cdclk_ratio(dev_priv, &old_cdclk_state->actual) !=
3334 intel_mdclk_cdclk_ratio(dev_priv, &new_cdclk_state->actual)) {
3335 int ratio = intel_mdclk_cdclk_ratio(dev_priv, &new_cdclk_state->actual);
3337 ret = intel_dbuf_state_set_mdclk_cdclk_ratio(state, ratio);
3342 drm_dbg_kms(&dev_priv->drm,
3343 "New cdclk calculated to be logical %u kHz, actual %u kHz\n",
3344 new_cdclk_state->logical.cdclk,
3345 new_cdclk_state->actual.cdclk);
3346 drm_dbg_kms(&dev_priv->drm,
3347 "New voltage level calculated to be logical %u, actual %u\n",
3348 new_cdclk_state->logical.voltage_level,
3349 new_cdclk_state->actual.voltage_level);
3354 static int intel_compute_max_dotclk(struct drm_i915_private *dev_priv)
3356 int max_cdclk_freq = dev_priv->display.cdclk.max_cdclk_freq;
3358 if (DISPLAY_VER(dev_priv) >= 10)
3359 return 2 * max_cdclk_freq;
3360 else if (DISPLAY_VER(dev_priv) == 9 ||
3361 IS_BROADWELL(dev_priv) || IS_HASWELL(dev_priv))
3362 return max_cdclk_freq;
3363 else if (IS_CHERRYVIEW(dev_priv))
3364 return max_cdclk_freq*95/100;
3365 else if (DISPLAY_VER(dev_priv) < 4)
3366 return 2*max_cdclk_freq*90/100;
3368 return max_cdclk_freq*90/100;
3372 * intel_update_max_cdclk - Determine the maximum support CDCLK frequency
3373 * @dev_priv: i915 device
3375 * Determine the maximum CDCLK frequency the platform supports, and also
3376 * derive the maximum dot clock frequency the maximum CDCLK frequency
3379 void intel_update_max_cdclk(struct drm_i915_private *dev_priv)
3381 if (IS_JASPERLAKE(dev_priv) || IS_ELKHARTLAKE(dev_priv)) {
3382 if (dev_priv->display.cdclk.hw.ref == 24000)
3383 dev_priv->display.cdclk.max_cdclk_freq = 552000;
3385 dev_priv->display.cdclk.max_cdclk_freq = 556800;
3386 } else if (DISPLAY_VER(dev_priv) >= 11) {
3387 if (dev_priv->display.cdclk.hw.ref == 24000)
3388 dev_priv->display.cdclk.max_cdclk_freq = 648000;
3390 dev_priv->display.cdclk.max_cdclk_freq = 652800;
3391 } else if (IS_GEMINILAKE(dev_priv)) {
3392 dev_priv->display.cdclk.max_cdclk_freq = 316800;
3393 } else if (IS_BROXTON(dev_priv)) {
3394 dev_priv->display.cdclk.max_cdclk_freq = 624000;
3395 } else if (DISPLAY_VER(dev_priv) == 9) {
3396 u32 limit = intel_de_read(dev_priv, SKL_DFSM) & SKL_DFSM_CDCLK_LIMIT_MASK;
3399 vco = dev_priv->display.cdclk.skl_preferred_vco_freq;
3400 drm_WARN_ON(&dev_priv->drm, vco != 8100000 && vco != 8640000);
3403 * Use the lower (vco 8640) cdclk values as a
3404 * first guess. skl_calc_cdclk() will correct it
3405 * if the preferred vco is 8100 instead.
3407 if (limit == SKL_DFSM_CDCLK_LIMIT_675)
3409 else if (limit == SKL_DFSM_CDCLK_LIMIT_540)
3411 else if (limit == SKL_DFSM_CDCLK_LIMIT_450)
3416 dev_priv->display.cdclk.max_cdclk_freq = skl_calc_cdclk(max_cdclk, vco);
3417 } else if (IS_BROADWELL(dev_priv)) {
3419 * FIXME with extra cooling we can allow
3420 * 540 MHz for ULX and 675 Mhz for ULT.
3421 * How can we know if extra cooling is
3422 * available? PCI ID, VTB, something else?
3424 if (intel_de_read(dev_priv, FUSE_STRAP) & HSW_CDCLK_LIMIT)
3425 dev_priv->display.cdclk.max_cdclk_freq = 450000;
3426 else if (IS_BROADWELL_ULX(dev_priv))
3427 dev_priv->display.cdclk.max_cdclk_freq = 450000;
3428 else if (IS_BROADWELL_ULT(dev_priv))
3429 dev_priv->display.cdclk.max_cdclk_freq = 540000;
3431 dev_priv->display.cdclk.max_cdclk_freq = 675000;
3432 } else if (IS_CHERRYVIEW(dev_priv)) {
3433 dev_priv->display.cdclk.max_cdclk_freq = 320000;
3434 } else if (IS_VALLEYVIEW(dev_priv)) {
3435 dev_priv->display.cdclk.max_cdclk_freq = 400000;
3437 /* otherwise assume cdclk is fixed */
3438 dev_priv->display.cdclk.max_cdclk_freq = dev_priv->display.cdclk.hw.cdclk;
3441 dev_priv->display.cdclk.max_dotclk_freq = intel_compute_max_dotclk(dev_priv);
3443 drm_dbg(&dev_priv->drm, "Max CD clock rate: %d kHz\n",
3444 dev_priv->display.cdclk.max_cdclk_freq);
3446 drm_dbg(&dev_priv->drm, "Max dotclock rate: %d kHz\n",
3447 dev_priv->display.cdclk.max_dotclk_freq);
3451 * intel_update_cdclk - Determine the current CDCLK frequency
3452 * @dev_priv: i915 device
3454 * Determine the current CDCLK frequency.
3456 void intel_update_cdclk(struct drm_i915_private *dev_priv)
3458 intel_cdclk_get_cdclk(dev_priv, &dev_priv->display.cdclk.hw);
3461 * 9:0 CMBUS [sic] CDCLK frequency (cdfreq):
3462 * Programmng [sic] note: bit[9:2] should be programmed to the number
3463 * of cdclk that generates 4MHz reference clock freq which is used to
3464 * generate GMBus clock. This will vary with the cdclk freq.
3466 if (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv))
3467 intel_de_write(dev_priv, GMBUSFREQ_VLV,
3468 DIV_ROUND_UP(dev_priv->display.cdclk.hw.cdclk, 1000));
3471 static int dg1_rawclk(struct drm_i915_private *dev_priv)
3474 * DG1 always uses a 38.4 MHz rawclk. The bspec tells us
3475 * "Program Numerator=2, Denominator=4, Divider=37 decimal."
3477 intel_de_write(dev_priv, PCH_RAWCLK_FREQ,
3478 CNP_RAWCLK_DEN(4) | CNP_RAWCLK_DIV(37) | ICP_RAWCLK_NUM(2));
3483 static int cnp_rawclk(struct drm_i915_private *dev_priv)
3486 int divider, fraction;
3488 if (intel_de_read(dev_priv, SFUSE_STRAP) & SFUSE_STRAP_RAW_FREQUENCY) {
3498 rawclk = CNP_RAWCLK_DIV(divider / 1000);
3502 rawclk |= CNP_RAWCLK_DEN(DIV_ROUND_CLOSEST(numerator * 1000,
3504 if (INTEL_PCH_TYPE(dev_priv) >= PCH_ICP)
3505 rawclk |= ICP_RAWCLK_NUM(numerator);
3508 intel_de_write(dev_priv, PCH_RAWCLK_FREQ, rawclk);
3509 return divider + fraction;
3512 static int pch_rawclk(struct drm_i915_private *dev_priv)
3514 return (intel_de_read(dev_priv, PCH_RAWCLK_FREQ) & RAWCLK_FREQ_MASK) * 1000;
3517 static int vlv_hrawclk(struct drm_i915_private *dev_priv)
3519 /* RAWCLK_FREQ_VLV register updated from power well code */
3520 return vlv_get_cck_clock_hpll(dev_priv, "hrawclk",
3521 CCK_DISPLAY_REF_CLOCK_CONTROL);
3524 static int i9xx_hrawclk(struct drm_i915_private *dev_priv)
3529 * hrawclock is 1/4 the FSB frequency
3531 * Note that this only reads the state of the FSB
3532 * straps, not the actual FSB frequency. Some BIOSen
3533 * let you configure each independently. Ideally we'd
3534 * read out the actual FSB frequency but sadly we
3535 * don't know which registers have that information,
3536 * and all the relevant docs have gone to bit heaven :(
3538 clkcfg = intel_de_read(dev_priv, CLKCFG) & CLKCFG_FSB_MASK;
3540 if (IS_MOBILE(dev_priv)) {
3542 case CLKCFG_FSB_400:
3544 case CLKCFG_FSB_533:
3546 case CLKCFG_FSB_667:
3548 case CLKCFG_FSB_800:
3550 case CLKCFG_FSB_1067:
3552 case CLKCFG_FSB_1333:
3555 MISSING_CASE(clkcfg);
3560 case CLKCFG_FSB_400_ALT:
3562 case CLKCFG_FSB_533:
3564 case CLKCFG_FSB_667:
3566 case CLKCFG_FSB_800:
3568 case CLKCFG_FSB_1067_ALT:
3570 case CLKCFG_FSB_1333_ALT:
3572 case CLKCFG_FSB_1600_ALT:
3581 * intel_read_rawclk - Determine the current RAWCLK frequency
3582 * @dev_priv: i915 device
3584 * Determine the current RAWCLK frequency. RAWCLK is a fixed
3585 * frequency clock so this needs to done only once.
3587 u32 intel_read_rawclk(struct drm_i915_private *dev_priv)
3591 if (INTEL_PCH_TYPE(dev_priv) >= PCH_MTL)
3593 * MTL always uses a 38.4 MHz rawclk. The bspec tells us
3594 * "RAWCLK_FREQ defaults to the values for 38.4 and does
3595 * not need to be programmed."
3598 else if (INTEL_PCH_TYPE(dev_priv) >= PCH_DG1)
3599 freq = dg1_rawclk(dev_priv);
3600 else if (INTEL_PCH_TYPE(dev_priv) >= PCH_CNP)
3601 freq = cnp_rawclk(dev_priv);
3602 else if (HAS_PCH_SPLIT(dev_priv))
3603 freq = pch_rawclk(dev_priv);
3604 else if (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv))
3605 freq = vlv_hrawclk(dev_priv);
3606 else if (DISPLAY_VER(dev_priv) >= 3)
3607 freq = i9xx_hrawclk(dev_priv);
3609 /* no rawclk on other platforms, or no need to know it */
3615 static int i915_cdclk_info_show(struct seq_file *m, void *unused)
3617 struct drm_i915_private *i915 = m->private;
3619 seq_printf(m, "Current CD clock frequency: %d kHz\n", i915->display.cdclk.hw.cdclk);
3620 seq_printf(m, "Max CD clock frequency: %d kHz\n", i915->display.cdclk.max_cdclk_freq);
3621 seq_printf(m, "Max pixel clock frequency: %d kHz\n", i915->display.cdclk.max_dotclk_freq);
3626 DEFINE_SHOW_ATTRIBUTE(i915_cdclk_info);
3628 void intel_cdclk_debugfs_register(struct drm_i915_private *i915)
3630 struct drm_minor *minor = i915->drm.primary;
3632 debugfs_create_file("i915_cdclk_info", 0444, minor->debugfs_root,
3633 i915, &i915_cdclk_info_fops);
3636 static const struct intel_cdclk_funcs rplu_cdclk_funcs = {
3637 .get_cdclk = bxt_get_cdclk,
3638 .set_cdclk = bxt_set_cdclk,
3639 .modeset_calc_cdclk = bxt_modeset_calc_cdclk,
3640 .calc_voltage_level = rplu_calc_voltage_level,
3643 static const struct intel_cdclk_funcs tgl_cdclk_funcs = {
3644 .get_cdclk = bxt_get_cdclk,
3645 .set_cdclk = bxt_set_cdclk,
3646 .modeset_calc_cdclk = bxt_modeset_calc_cdclk,
3647 .calc_voltage_level = tgl_calc_voltage_level,
3650 static const struct intel_cdclk_funcs ehl_cdclk_funcs = {
3651 .get_cdclk = bxt_get_cdclk,
3652 .set_cdclk = bxt_set_cdclk,
3653 .modeset_calc_cdclk = bxt_modeset_calc_cdclk,
3654 .calc_voltage_level = ehl_calc_voltage_level,
3657 static const struct intel_cdclk_funcs icl_cdclk_funcs = {
3658 .get_cdclk = bxt_get_cdclk,
3659 .set_cdclk = bxt_set_cdclk,
3660 .modeset_calc_cdclk = bxt_modeset_calc_cdclk,
3661 .calc_voltage_level = icl_calc_voltage_level,
3664 static const struct intel_cdclk_funcs bxt_cdclk_funcs = {
3665 .get_cdclk = bxt_get_cdclk,
3666 .set_cdclk = bxt_set_cdclk,
3667 .modeset_calc_cdclk = bxt_modeset_calc_cdclk,
3668 .calc_voltage_level = bxt_calc_voltage_level,
3671 static const struct intel_cdclk_funcs skl_cdclk_funcs = {
3672 .get_cdclk = skl_get_cdclk,
3673 .set_cdclk = skl_set_cdclk,
3674 .modeset_calc_cdclk = skl_modeset_calc_cdclk,
3677 static const struct intel_cdclk_funcs bdw_cdclk_funcs = {
3678 .get_cdclk = bdw_get_cdclk,
3679 .set_cdclk = bdw_set_cdclk,
3680 .modeset_calc_cdclk = bdw_modeset_calc_cdclk,
3683 static const struct intel_cdclk_funcs chv_cdclk_funcs = {
3684 .get_cdclk = vlv_get_cdclk,
3685 .set_cdclk = chv_set_cdclk,
3686 .modeset_calc_cdclk = vlv_modeset_calc_cdclk,
3689 static const struct intel_cdclk_funcs vlv_cdclk_funcs = {
3690 .get_cdclk = vlv_get_cdclk,
3691 .set_cdclk = vlv_set_cdclk,
3692 .modeset_calc_cdclk = vlv_modeset_calc_cdclk,
3695 static const struct intel_cdclk_funcs hsw_cdclk_funcs = {
3696 .get_cdclk = hsw_get_cdclk,
3697 .modeset_calc_cdclk = fixed_modeset_calc_cdclk,
3700 /* SNB, IVB, 965G, 945G */
3701 static const struct intel_cdclk_funcs fixed_400mhz_cdclk_funcs = {
3702 .get_cdclk = fixed_400mhz_get_cdclk,
3703 .modeset_calc_cdclk = fixed_modeset_calc_cdclk,
3706 static const struct intel_cdclk_funcs ilk_cdclk_funcs = {
3707 .get_cdclk = fixed_450mhz_get_cdclk,
3708 .modeset_calc_cdclk = fixed_modeset_calc_cdclk,
3711 static const struct intel_cdclk_funcs gm45_cdclk_funcs = {
3712 .get_cdclk = gm45_get_cdclk,
3713 .modeset_calc_cdclk = fixed_modeset_calc_cdclk,
3718 static const struct intel_cdclk_funcs i965gm_cdclk_funcs = {
3719 .get_cdclk = i965gm_get_cdclk,
3720 .modeset_calc_cdclk = fixed_modeset_calc_cdclk,
3723 /* i965G uses fixed 400 */
3725 static const struct intel_cdclk_funcs pnv_cdclk_funcs = {
3726 .get_cdclk = pnv_get_cdclk,
3727 .modeset_calc_cdclk = fixed_modeset_calc_cdclk,
3730 static const struct intel_cdclk_funcs g33_cdclk_funcs = {
3731 .get_cdclk = g33_get_cdclk,
3732 .modeset_calc_cdclk = fixed_modeset_calc_cdclk,
3735 static const struct intel_cdclk_funcs i945gm_cdclk_funcs = {
3736 .get_cdclk = i945gm_get_cdclk,
3737 .modeset_calc_cdclk = fixed_modeset_calc_cdclk,
3740 /* i945G uses fixed 400 */
3742 static const struct intel_cdclk_funcs i915gm_cdclk_funcs = {
3743 .get_cdclk = i915gm_get_cdclk,
3744 .modeset_calc_cdclk = fixed_modeset_calc_cdclk,
3747 static const struct intel_cdclk_funcs i915g_cdclk_funcs = {
3748 .get_cdclk = fixed_333mhz_get_cdclk,
3749 .modeset_calc_cdclk = fixed_modeset_calc_cdclk,
3752 static const struct intel_cdclk_funcs i865g_cdclk_funcs = {
3753 .get_cdclk = fixed_266mhz_get_cdclk,
3754 .modeset_calc_cdclk = fixed_modeset_calc_cdclk,
3757 static const struct intel_cdclk_funcs i85x_cdclk_funcs = {
3758 .get_cdclk = i85x_get_cdclk,
3759 .modeset_calc_cdclk = fixed_modeset_calc_cdclk,
3762 static const struct intel_cdclk_funcs i845g_cdclk_funcs = {
3763 .get_cdclk = fixed_200mhz_get_cdclk,
3764 .modeset_calc_cdclk = fixed_modeset_calc_cdclk,
3767 static const struct intel_cdclk_funcs i830_cdclk_funcs = {
3768 .get_cdclk = fixed_133mhz_get_cdclk,
3769 .modeset_calc_cdclk = fixed_modeset_calc_cdclk,
3773 * intel_init_cdclk_hooks - Initialize CDCLK related modesetting hooks
3774 * @dev_priv: i915 device
3776 void intel_init_cdclk_hooks(struct drm_i915_private *dev_priv)
3778 if (DISPLAY_VER(dev_priv) >= 20) {
3779 dev_priv->display.funcs.cdclk = &rplu_cdclk_funcs;
3780 dev_priv->display.cdclk.table = xe2lpd_cdclk_table;
3781 } else if (DISPLAY_VER(dev_priv) >= 14) {
3782 dev_priv->display.funcs.cdclk = &rplu_cdclk_funcs;
3783 dev_priv->display.cdclk.table = mtl_cdclk_table;
3784 } else if (IS_DG2(dev_priv)) {
3785 dev_priv->display.funcs.cdclk = &tgl_cdclk_funcs;
3786 dev_priv->display.cdclk.table = dg2_cdclk_table;
3787 } else if (IS_ALDERLAKE_P(dev_priv)) {
3788 /* Wa_22011320316:adl-p[a0] */
3789 if (IS_ALDERLAKE_P(dev_priv) && IS_DISPLAY_STEP(dev_priv, STEP_A0, STEP_B0)) {
3790 dev_priv->display.cdclk.table = adlp_a_step_cdclk_table;
3791 dev_priv->display.funcs.cdclk = &tgl_cdclk_funcs;
3792 } else if (IS_RAPTORLAKE_U(dev_priv)) {
3793 dev_priv->display.cdclk.table = rplu_cdclk_table;
3794 dev_priv->display.funcs.cdclk = &rplu_cdclk_funcs;
3796 dev_priv->display.cdclk.table = adlp_cdclk_table;
3797 dev_priv->display.funcs.cdclk = &tgl_cdclk_funcs;
3799 } else if (IS_ROCKETLAKE(dev_priv)) {
3800 dev_priv->display.funcs.cdclk = &tgl_cdclk_funcs;
3801 dev_priv->display.cdclk.table = rkl_cdclk_table;
3802 } else if (DISPLAY_VER(dev_priv) >= 12) {
3803 dev_priv->display.funcs.cdclk = &tgl_cdclk_funcs;
3804 dev_priv->display.cdclk.table = icl_cdclk_table;
3805 } else if (IS_JASPERLAKE(dev_priv) || IS_ELKHARTLAKE(dev_priv)) {
3806 dev_priv->display.funcs.cdclk = &ehl_cdclk_funcs;
3807 dev_priv->display.cdclk.table = icl_cdclk_table;
3808 } else if (DISPLAY_VER(dev_priv) >= 11) {
3809 dev_priv->display.funcs.cdclk = &icl_cdclk_funcs;
3810 dev_priv->display.cdclk.table = icl_cdclk_table;
3811 } else if (IS_GEMINILAKE(dev_priv) || IS_BROXTON(dev_priv)) {
3812 dev_priv->display.funcs.cdclk = &bxt_cdclk_funcs;
3813 if (IS_GEMINILAKE(dev_priv))
3814 dev_priv->display.cdclk.table = glk_cdclk_table;
3816 dev_priv->display.cdclk.table = bxt_cdclk_table;
3817 } else if (DISPLAY_VER(dev_priv) == 9) {
3818 dev_priv->display.funcs.cdclk = &skl_cdclk_funcs;
3819 } else if (IS_BROADWELL(dev_priv)) {
3820 dev_priv->display.funcs.cdclk = &bdw_cdclk_funcs;
3821 } else if (IS_HASWELL(dev_priv)) {
3822 dev_priv->display.funcs.cdclk = &hsw_cdclk_funcs;
3823 } else if (IS_CHERRYVIEW(dev_priv)) {
3824 dev_priv->display.funcs.cdclk = &chv_cdclk_funcs;
3825 } else if (IS_VALLEYVIEW(dev_priv)) {
3826 dev_priv->display.funcs.cdclk = &vlv_cdclk_funcs;
3827 } else if (IS_SANDYBRIDGE(dev_priv) || IS_IVYBRIDGE(dev_priv)) {
3828 dev_priv->display.funcs.cdclk = &fixed_400mhz_cdclk_funcs;
3829 } else if (IS_IRONLAKE(dev_priv)) {
3830 dev_priv->display.funcs.cdclk = &ilk_cdclk_funcs;
3831 } else if (IS_GM45(dev_priv)) {
3832 dev_priv->display.funcs.cdclk = &gm45_cdclk_funcs;
3833 } else if (IS_G45(dev_priv)) {
3834 dev_priv->display.funcs.cdclk = &g33_cdclk_funcs;
3835 } else if (IS_I965GM(dev_priv)) {
3836 dev_priv->display.funcs.cdclk = &i965gm_cdclk_funcs;
3837 } else if (IS_I965G(dev_priv)) {
3838 dev_priv->display.funcs.cdclk = &fixed_400mhz_cdclk_funcs;
3839 } else if (IS_PINEVIEW(dev_priv)) {
3840 dev_priv->display.funcs.cdclk = &pnv_cdclk_funcs;
3841 } else if (IS_G33(dev_priv)) {
3842 dev_priv->display.funcs.cdclk = &g33_cdclk_funcs;
3843 } else if (IS_I945GM(dev_priv)) {
3844 dev_priv->display.funcs.cdclk = &i945gm_cdclk_funcs;
3845 } else if (IS_I945G(dev_priv)) {
3846 dev_priv->display.funcs.cdclk = &fixed_400mhz_cdclk_funcs;
3847 } else if (IS_I915GM(dev_priv)) {
3848 dev_priv->display.funcs.cdclk = &i915gm_cdclk_funcs;
3849 } else if (IS_I915G(dev_priv)) {
3850 dev_priv->display.funcs.cdclk = &i915g_cdclk_funcs;
3851 } else if (IS_I865G(dev_priv)) {
3852 dev_priv->display.funcs.cdclk = &i865g_cdclk_funcs;
3853 } else if (IS_I85X(dev_priv)) {
3854 dev_priv->display.funcs.cdclk = &i85x_cdclk_funcs;
3855 } else if (IS_I845G(dev_priv)) {
3856 dev_priv->display.funcs.cdclk = &i845g_cdclk_funcs;
3857 } else if (IS_I830(dev_priv)) {
3858 dev_priv->display.funcs.cdclk = &i830_cdclk_funcs;
3861 if (drm_WARN(&dev_priv->drm, !dev_priv->display.funcs.cdclk,
3862 "Unknown platform. Assuming i830\n"))
3863 dev_priv->display.funcs.cdclk = &i830_cdclk_funcs;