0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024 #include <linux/time.h>
0025
0026 #include "hsw_ips.h"
0027 #include "intel_atomic.h"
0028 #include "intel_atomic_plane.h"
0029 #include "intel_audio.h"
0030 #include "intel_bw.h"
0031 #include "intel_cdclk.h"
0032 #include "intel_crtc.h"
0033 #include "intel_de.h"
0034 #include "intel_display_types.h"
0035 #include "intel_mchbar_regs.h"
0036 #include "intel_pci_config.h"
0037 #include "intel_pcode.h"
0038 #include "intel_psr.h"
0039 #include "vlv_sideband.h"
0040
0041
0042
0043
0044
0045
0046
0047
0048
0049
0050
0051
0052
0053
0054
0055
0056
0057
0058
0059
0060
0061
0062
0063
0064
0065
0066
0067
0068
0069 struct intel_cdclk_funcs {
0070 void (*get_cdclk)(struct drm_i915_private *i915,
0071 struct intel_cdclk_config *cdclk_config);
0072 void (*set_cdclk)(struct drm_i915_private *i915,
0073 const struct intel_cdclk_config *cdclk_config,
0074 enum pipe pipe);
0075 int (*modeset_calc_cdclk)(struct intel_cdclk_state *state);
0076 u8 (*calc_voltage_level)(int cdclk);
0077 };
0078
0079 void intel_cdclk_get_cdclk(struct drm_i915_private *dev_priv,
0080 struct intel_cdclk_config *cdclk_config)
0081 {
0082 dev_priv->cdclk_funcs->get_cdclk(dev_priv, cdclk_config);
0083 }
0084
0085 static void intel_cdclk_set_cdclk(struct drm_i915_private *dev_priv,
0086 const struct intel_cdclk_config *cdclk_config,
0087 enum pipe pipe)
0088 {
0089 dev_priv->cdclk_funcs->set_cdclk(dev_priv, cdclk_config, pipe);
0090 }
0091
0092 static int intel_cdclk_modeset_calc_cdclk(struct drm_i915_private *dev_priv,
0093 struct intel_cdclk_state *cdclk_config)
0094 {
0095 return dev_priv->cdclk_funcs->modeset_calc_cdclk(cdclk_config);
0096 }
0097
0098 static u8 intel_cdclk_calc_voltage_level(struct drm_i915_private *dev_priv,
0099 int cdclk)
0100 {
0101 return dev_priv->cdclk_funcs->calc_voltage_level(cdclk);
0102 }
0103
0104 static void fixed_133mhz_get_cdclk(struct drm_i915_private *dev_priv,
0105 struct intel_cdclk_config *cdclk_config)
0106 {
0107 cdclk_config->cdclk = 133333;
0108 }
0109
0110 static void fixed_200mhz_get_cdclk(struct drm_i915_private *dev_priv,
0111 struct intel_cdclk_config *cdclk_config)
0112 {
0113 cdclk_config->cdclk = 200000;
0114 }
0115
0116 static void fixed_266mhz_get_cdclk(struct drm_i915_private *dev_priv,
0117 struct intel_cdclk_config *cdclk_config)
0118 {
0119 cdclk_config->cdclk = 266667;
0120 }
0121
0122 static void fixed_333mhz_get_cdclk(struct drm_i915_private *dev_priv,
0123 struct intel_cdclk_config *cdclk_config)
0124 {
0125 cdclk_config->cdclk = 333333;
0126 }
0127
0128 static void fixed_400mhz_get_cdclk(struct drm_i915_private *dev_priv,
0129 struct intel_cdclk_config *cdclk_config)
0130 {
0131 cdclk_config->cdclk = 400000;
0132 }
0133
0134 static void fixed_450mhz_get_cdclk(struct drm_i915_private *dev_priv,
0135 struct intel_cdclk_config *cdclk_config)
0136 {
0137 cdclk_config->cdclk = 450000;
0138 }
0139
0140 static void i85x_get_cdclk(struct drm_i915_private *dev_priv,
0141 struct intel_cdclk_config *cdclk_config)
0142 {
0143 struct pci_dev *pdev = to_pci_dev(dev_priv->drm.dev);
0144 u16 hpllcc = 0;
0145
0146
0147
0148
0149
0150
0151 if (pdev->revision == 0x1) {
0152 cdclk_config->cdclk = 133333;
0153 return;
0154 }
0155
0156 pci_bus_read_config_word(pdev->bus,
0157 PCI_DEVFN(0, 3), HPLLCC, &hpllcc);
0158
0159
0160
0161
0162 switch (hpllcc & GC_CLOCK_CONTROL_MASK) {
0163 case GC_CLOCK_133_200:
0164 case GC_CLOCK_133_200_2:
0165 case GC_CLOCK_100_200:
0166 cdclk_config->cdclk = 200000;
0167 break;
0168 case GC_CLOCK_166_250:
0169 cdclk_config->cdclk = 250000;
0170 break;
0171 case GC_CLOCK_100_133:
0172 cdclk_config->cdclk = 133333;
0173 break;
0174 case GC_CLOCK_133_266:
0175 case GC_CLOCK_133_266_2:
0176 case GC_CLOCK_166_266:
0177 cdclk_config->cdclk = 266667;
0178 break;
0179 }
0180 }
0181
0182 static void i915gm_get_cdclk(struct drm_i915_private *dev_priv,
0183 struct intel_cdclk_config *cdclk_config)
0184 {
0185 struct pci_dev *pdev = to_pci_dev(dev_priv->drm.dev);
0186 u16 gcfgc = 0;
0187
0188 pci_read_config_word(pdev, GCFGC, &gcfgc);
0189
0190 if (gcfgc & GC_LOW_FREQUENCY_ENABLE) {
0191 cdclk_config->cdclk = 133333;
0192 return;
0193 }
0194
0195 switch (gcfgc & GC_DISPLAY_CLOCK_MASK) {
0196 case GC_DISPLAY_CLOCK_333_320_MHZ:
0197 cdclk_config->cdclk = 333333;
0198 break;
0199 default:
0200 case GC_DISPLAY_CLOCK_190_200_MHZ:
0201 cdclk_config->cdclk = 190000;
0202 break;
0203 }
0204 }
0205
0206 static void i945gm_get_cdclk(struct drm_i915_private *dev_priv,
0207 struct intel_cdclk_config *cdclk_config)
0208 {
0209 struct pci_dev *pdev = to_pci_dev(dev_priv->drm.dev);
0210 u16 gcfgc = 0;
0211
0212 pci_read_config_word(pdev, GCFGC, &gcfgc);
0213
0214 if (gcfgc & GC_LOW_FREQUENCY_ENABLE) {
0215 cdclk_config->cdclk = 133333;
0216 return;
0217 }
0218
0219 switch (gcfgc & GC_DISPLAY_CLOCK_MASK) {
0220 case GC_DISPLAY_CLOCK_333_320_MHZ:
0221 cdclk_config->cdclk = 320000;
0222 break;
0223 default:
0224 case GC_DISPLAY_CLOCK_190_200_MHZ:
0225 cdclk_config->cdclk = 200000;
0226 break;
0227 }
0228 }
0229
0230 static unsigned int intel_hpll_vco(struct drm_i915_private *dev_priv)
0231 {
0232 static const unsigned int blb_vco[8] = {
0233 [0] = 3200000,
0234 [1] = 4000000,
0235 [2] = 5333333,
0236 [3] = 4800000,
0237 [4] = 6400000,
0238 };
0239 static const unsigned int pnv_vco[8] = {
0240 [0] = 3200000,
0241 [1] = 4000000,
0242 [2] = 5333333,
0243 [3] = 4800000,
0244 [4] = 2666667,
0245 };
0246 static const unsigned int cl_vco[8] = {
0247 [0] = 3200000,
0248 [1] = 4000000,
0249 [2] = 5333333,
0250 [3] = 6400000,
0251 [4] = 3333333,
0252 [5] = 3566667,
0253 [6] = 4266667,
0254 };
0255 static const unsigned int elk_vco[8] = {
0256 [0] = 3200000,
0257 [1] = 4000000,
0258 [2] = 5333333,
0259 [3] = 4800000,
0260 };
0261 static const unsigned int ctg_vco[8] = {
0262 [0] = 3200000,
0263 [1] = 4000000,
0264 [2] = 5333333,
0265 [3] = 6400000,
0266 [4] = 2666667,
0267 [5] = 4266667,
0268 };
0269 const unsigned int *vco_table;
0270 unsigned int vco;
0271 u8 tmp = 0;
0272
0273
0274 if (IS_GM45(dev_priv))
0275 vco_table = ctg_vco;
0276 else if (IS_G45(dev_priv))
0277 vco_table = elk_vco;
0278 else if (IS_I965GM(dev_priv))
0279 vco_table = cl_vco;
0280 else if (IS_PINEVIEW(dev_priv))
0281 vco_table = pnv_vco;
0282 else if (IS_G33(dev_priv))
0283 vco_table = blb_vco;
0284 else
0285 return 0;
0286
0287 tmp = intel_de_read(dev_priv,
0288 IS_PINEVIEW(dev_priv) || IS_MOBILE(dev_priv) ? HPLLVCO_MOBILE : HPLLVCO);
0289
0290 vco = vco_table[tmp & 0x7];
0291 if (vco == 0)
0292 drm_err(&dev_priv->drm, "Bad HPLL VCO (HPLLVCO=0x%02x)\n",
0293 tmp);
0294 else
0295 drm_dbg_kms(&dev_priv->drm, "HPLL VCO %u kHz\n", vco);
0296
0297 return vco;
0298 }
0299
0300 static void g33_get_cdclk(struct drm_i915_private *dev_priv,
0301 struct intel_cdclk_config *cdclk_config)
0302 {
0303 struct pci_dev *pdev = to_pci_dev(dev_priv->drm.dev);
0304 static const u8 div_3200[] = { 12, 10, 8, 7, 5, 16 };
0305 static const u8 div_4000[] = { 14, 12, 10, 8, 6, 20 };
0306 static const u8 div_4800[] = { 20, 14, 12, 10, 8, 24 };
0307 static const u8 div_5333[] = { 20, 16, 12, 12, 8, 28 };
0308 const u8 *div_table;
0309 unsigned int cdclk_sel;
0310 u16 tmp = 0;
0311
0312 cdclk_config->vco = intel_hpll_vco(dev_priv);
0313
0314 pci_read_config_word(pdev, GCFGC, &tmp);
0315
0316 cdclk_sel = (tmp >> 4) & 0x7;
0317
0318 if (cdclk_sel >= ARRAY_SIZE(div_3200))
0319 goto fail;
0320
0321 switch (cdclk_config->vco) {
0322 case 3200000:
0323 div_table = div_3200;
0324 break;
0325 case 4000000:
0326 div_table = div_4000;
0327 break;
0328 case 4800000:
0329 div_table = div_4800;
0330 break;
0331 case 5333333:
0332 div_table = div_5333;
0333 break;
0334 default:
0335 goto fail;
0336 }
0337
0338 cdclk_config->cdclk = DIV_ROUND_CLOSEST(cdclk_config->vco,
0339 div_table[cdclk_sel]);
0340 return;
0341
0342 fail:
0343 drm_err(&dev_priv->drm,
0344 "Unable to determine CDCLK. HPLL VCO=%u kHz, CFGC=0x%08x\n",
0345 cdclk_config->vco, tmp);
0346 cdclk_config->cdclk = 190476;
0347 }
0348
0349 static void pnv_get_cdclk(struct drm_i915_private *dev_priv,
0350 struct intel_cdclk_config *cdclk_config)
0351 {
0352 struct pci_dev *pdev = to_pci_dev(dev_priv->drm.dev);
0353 u16 gcfgc = 0;
0354
0355 pci_read_config_word(pdev, GCFGC, &gcfgc);
0356
0357 switch (gcfgc & GC_DISPLAY_CLOCK_MASK) {
0358 case GC_DISPLAY_CLOCK_267_MHZ_PNV:
0359 cdclk_config->cdclk = 266667;
0360 break;
0361 case GC_DISPLAY_CLOCK_333_MHZ_PNV:
0362 cdclk_config->cdclk = 333333;
0363 break;
0364 case GC_DISPLAY_CLOCK_444_MHZ_PNV:
0365 cdclk_config->cdclk = 444444;
0366 break;
0367 case GC_DISPLAY_CLOCK_200_MHZ_PNV:
0368 cdclk_config->cdclk = 200000;
0369 break;
0370 default:
0371 drm_err(&dev_priv->drm,
0372 "Unknown pnv display core clock 0x%04x\n", gcfgc);
0373 fallthrough;
0374 case GC_DISPLAY_CLOCK_133_MHZ_PNV:
0375 cdclk_config->cdclk = 133333;
0376 break;
0377 case GC_DISPLAY_CLOCK_167_MHZ_PNV:
0378 cdclk_config->cdclk = 166667;
0379 break;
0380 }
0381 }
0382
0383 static void i965gm_get_cdclk(struct drm_i915_private *dev_priv,
0384 struct intel_cdclk_config *cdclk_config)
0385 {
0386 struct pci_dev *pdev = to_pci_dev(dev_priv->drm.dev);
0387 static const u8 div_3200[] = { 16, 10, 8 };
0388 static const u8 div_4000[] = { 20, 12, 10 };
0389 static const u8 div_5333[] = { 24, 16, 14 };
0390 const u8 *div_table;
0391 unsigned int cdclk_sel;
0392 u16 tmp = 0;
0393
0394 cdclk_config->vco = intel_hpll_vco(dev_priv);
0395
0396 pci_read_config_word(pdev, GCFGC, &tmp);
0397
0398 cdclk_sel = ((tmp >> 8) & 0x1f) - 1;
0399
0400 if (cdclk_sel >= ARRAY_SIZE(div_3200))
0401 goto fail;
0402
0403 switch (cdclk_config->vco) {
0404 case 3200000:
0405 div_table = div_3200;
0406 break;
0407 case 4000000:
0408 div_table = div_4000;
0409 break;
0410 case 5333333:
0411 div_table = div_5333;
0412 break;
0413 default:
0414 goto fail;
0415 }
0416
0417 cdclk_config->cdclk = DIV_ROUND_CLOSEST(cdclk_config->vco,
0418 div_table[cdclk_sel]);
0419 return;
0420
0421 fail:
0422 drm_err(&dev_priv->drm,
0423 "Unable to determine CDCLK. HPLL VCO=%u kHz, CFGC=0x%04x\n",
0424 cdclk_config->vco, tmp);
0425 cdclk_config->cdclk = 200000;
0426 }
0427
0428 static void gm45_get_cdclk(struct drm_i915_private *dev_priv,
0429 struct intel_cdclk_config *cdclk_config)
0430 {
0431 struct pci_dev *pdev = to_pci_dev(dev_priv->drm.dev);
0432 unsigned int cdclk_sel;
0433 u16 tmp = 0;
0434
0435 cdclk_config->vco = intel_hpll_vco(dev_priv);
0436
0437 pci_read_config_word(pdev, GCFGC, &tmp);
0438
0439 cdclk_sel = (tmp >> 12) & 0x1;
0440
0441 switch (cdclk_config->vco) {
0442 case 2666667:
0443 case 4000000:
0444 case 5333333:
0445 cdclk_config->cdclk = cdclk_sel ? 333333 : 222222;
0446 break;
0447 case 3200000:
0448 cdclk_config->cdclk = cdclk_sel ? 320000 : 228571;
0449 break;
0450 default:
0451 drm_err(&dev_priv->drm,
0452 "Unable to determine CDCLK. HPLL VCO=%u, CFGC=0x%04x\n",
0453 cdclk_config->vco, tmp);
0454 cdclk_config->cdclk = 222222;
0455 break;
0456 }
0457 }
0458
0459 static void hsw_get_cdclk(struct drm_i915_private *dev_priv,
0460 struct intel_cdclk_config *cdclk_config)
0461 {
0462 u32 lcpll = intel_de_read(dev_priv, LCPLL_CTL);
0463 u32 freq = lcpll & LCPLL_CLK_FREQ_MASK;
0464
0465 if (lcpll & LCPLL_CD_SOURCE_FCLK)
0466 cdclk_config->cdclk = 800000;
0467 else if (intel_de_read(dev_priv, FUSE_STRAP) & HSW_CDCLK_LIMIT)
0468 cdclk_config->cdclk = 450000;
0469 else if (freq == LCPLL_CLK_FREQ_450)
0470 cdclk_config->cdclk = 450000;
0471 else if (IS_HSW_ULT(dev_priv))
0472 cdclk_config->cdclk = 337500;
0473 else
0474 cdclk_config->cdclk = 540000;
0475 }
0476
0477 static int vlv_calc_cdclk(struct drm_i915_private *dev_priv, int min_cdclk)
0478 {
0479 int freq_320 = (dev_priv->hpll_freq << 1) % 320000 != 0 ?
0480 333333 : 320000;
0481
0482
0483
0484
0485
0486
0487 if (IS_VALLEYVIEW(dev_priv) && min_cdclk > freq_320)
0488 return 400000;
0489 else if (min_cdclk > 266667)
0490 return freq_320;
0491 else if (min_cdclk > 0)
0492 return 266667;
0493 else
0494 return 200000;
0495 }
0496
0497 static u8 vlv_calc_voltage_level(struct drm_i915_private *dev_priv, int cdclk)
0498 {
0499 if (IS_VALLEYVIEW(dev_priv)) {
0500 if (cdclk >= 320000)
0501 return 2;
0502 else if (cdclk >= 266667)
0503 return 1;
0504 else
0505 return 0;
0506 } else {
0507
0508
0509
0510
0511
0512 return DIV_ROUND_CLOSEST(dev_priv->hpll_freq << 1, cdclk) - 1;
0513 }
0514 }
0515
0516 static void vlv_get_cdclk(struct drm_i915_private *dev_priv,
0517 struct intel_cdclk_config *cdclk_config)
0518 {
0519 u32 val;
0520
0521 vlv_iosf_sb_get(dev_priv,
0522 BIT(VLV_IOSF_SB_CCK) | BIT(VLV_IOSF_SB_PUNIT));
0523
0524 cdclk_config->vco = vlv_get_hpll_vco(dev_priv);
0525 cdclk_config->cdclk = vlv_get_cck_clock(dev_priv, "cdclk",
0526 CCK_DISPLAY_CLOCK_CONTROL,
0527 cdclk_config->vco);
0528
0529 val = vlv_punit_read(dev_priv, PUNIT_REG_DSPSSPM);
0530
0531 vlv_iosf_sb_put(dev_priv,
0532 BIT(VLV_IOSF_SB_CCK) | BIT(VLV_IOSF_SB_PUNIT));
0533
0534 if (IS_VALLEYVIEW(dev_priv))
0535 cdclk_config->voltage_level = (val & DSPFREQGUAR_MASK) >>
0536 DSPFREQGUAR_SHIFT;
0537 else
0538 cdclk_config->voltage_level = (val & DSPFREQGUAR_MASK_CHV) >>
0539 DSPFREQGUAR_SHIFT_CHV;
0540 }
0541
0542 static void vlv_program_pfi_credits(struct drm_i915_private *dev_priv)
0543 {
0544 unsigned int credits, default_credits;
0545
0546 if (IS_CHERRYVIEW(dev_priv))
0547 default_credits = PFI_CREDIT(12);
0548 else
0549 default_credits = PFI_CREDIT(8);
0550
0551 if (dev_priv->cdclk.hw.cdclk >= dev_priv->czclk_freq) {
0552
0553 if (IS_CHERRYVIEW(dev_priv))
0554 credits = PFI_CREDIT_63;
0555 else
0556 credits = PFI_CREDIT(15);
0557 } else {
0558 credits = default_credits;
0559 }
0560
0561
0562
0563
0564
0565 intel_de_write(dev_priv, GCI_CONTROL,
0566 VGA_FAST_MODE_DISABLE | default_credits);
0567
0568 intel_de_write(dev_priv, GCI_CONTROL,
0569 VGA_FAST_MODE_DISABLE | credits | PFI_CREDIT_RESEND);
0570
0571
0572
0573
0574
0575 drm_WARN_ON(&dev_priv->drm,
0576 intel_de_read(dev_priv, GCI_CONTROL) & PFI_CREDIT_RESEND);
0577 }
0578
0579 static void vlv_set_cdclk(struct drm_i915_private *dev_priv,
0580 const struct intel_cdclk_config *cdclk_config,
0581 enum pipe pipe)
0582 {
0583 int cdclk = cdclk_config->cdclk;
0584 u32 val, cmd = cdclk_config->voltage_level;
0585 intel_wakeref_t wakeref;
0586
0587 switch (cdclk) {
0588 case 400000:
0589 case 333333:
0590 case 320000:
0591 case 266667:
0592 case 200000:
0593 break;
0594 default:
0595 MISSING_CASE(cdclk);
0596 return;
0597 }
0598
0599
0600
0601
0602
0603
0604
0605 wakeref = intel_display_power_get(dev_priv, POWER_DOMAIN_DISPLAY_CORE);
0606
0607 vlv_iosf_sb_get(dev_priv,
0608 BIT(VLV_IOSF_SB_CCK) |
0609 BIT(VLV_IOSF_SB_BUNIT) |
0610 BIT(VLV_IOSF_SB_PUNIT));
0611
0612 val = vlv_punit_read(dev_priv, PUNIT_REG_DSPSSPM);
0613 val &= ~DSPFREQGUAR_MASK;
0614 val |= (cmd << DSPFREQGUAR_SHIFT);
0615 vlv_punit_write(dev_priv, PUNIT_REG_DSPSSPM, val);
0616 if (wait_for((vlv_punit_read(dev_priv, PUNIT_REG_DSPSSPM) &
0617 DSPFREQSTAT_MASK) == (cmd << DSPFREQSTAT_SHIFT),
0618 50)) {
0619 drm_err(&dev_priv->drm,
0620 "timed out waiting for CDclk change\n");
0621 }
0622
0623 if (cdclk == 400000) {
0624 u32 divider;
0625
0626 divider = DIV_ROUND_CLOSEST(dev_priv->hpll_freq << 1,
0627 cdclk) - 1;
0628
0629
0630 val = vlv_cck_read(dev_priv, CCK_DISPLAY_CLOCK_CONTROL);
0631 val &= ~CCK_FREQUENCY_VALUES;
0632 val |= divider;
0633 vlv_cck_write(dev_priv, CCK_DISPLAY_CLOCK_CONTROL, val);
0634
0635 if (wait_for((vlv_cck_read(dev_priv, CCK_DISPLAY_CLOCK_CONTROL) &
0636 CCK_FREQUENCY_STATUS) == (divider << CCK_FREQUENCY_STATUS_SHIFT),
0637 50))
0638 drm_err(&dev_priv->drm,
0639 "timed out waiting for CDclk change\n");
0640 }
0641
0642
0643 val = vlv_bunit_read(dev_priv, BUNIT_REG_BISOC);
0644 val &= ~0x7f;
0645
0646
0647
0648
0649
0650 if (cdclk == 400000)
0651 val |= 4500 / 250;
0652 else
0653 val |= 3000 / 250;
0654 vlv_bunit_write(dev_priv, BUNIT_REG_BISOC, val);
0655
0656 vlv_iosf_sb_put(dev_priv,
0657 BIT(VLV_IOSF_SB_CCK) |
0658 BIT(VLV_IOSF_SB_BUNIT) |
0659 BIT(VLV_IOSF_SB_PUNIT));
0660
0661 intel_update_cdclk(dev_priv);
0662
0663 vlv_program_pfi_credits(dev_priv);
0664
0665 intel_display_power_put(dev_priv, POWER_DOMAIN_DISPLAY_CORE, wakeref);
0666 }
0667
0668 static void chv_set_cdclk(struct drm_i915_private *dev_priv,
0669 const struct intel_cdclk_config *cdclk_config,
0670 enum pipe pipe)
0671 {
0672 int cdclk = cdclk_config->cdclk;
0673 u32 val, cmd = cdclk_config->voltage_level;
0674 intel_wakeref_t wakeref;
0675
0676 switch (cdclk) {
0677 case 333333:
0678 case 320000:
0679 case 266667:
0680 case 200000:
0681 break;
0682 default:
0683 MISSING_CASE(cdclk);
0684 return;
0685 }
0686
0687
0688
0689
0690
0691
0692
0693 wakeref = intel_display_power_get(dev_priv, POWER_DOMAIN_DISPLAY_CORE);
0694
0695 vlv_punit_get(dev_priv);
0696 val = vlv_punit_read(dev_priv, PUNIT_REG_DSPSSPM);
0697 val &= ~DSPFREQGUAR_MASK_CHV;
0698 val |= (cmd << DSPFREQGUAR_SHIFT_CHV);
0699 vlv_punit_write(dev_priv, PUNIT_REG_DSPSSPM, val);
0700 if (wait_for((vlv_punit_read(dev_priv, PUNIT_REG_DSPSSPM) &
0701 DSPFREQSTAT_MASK_CHV) == (cmd << DSPFREQSTAT_SHIFT_CHV),
0702 50)) {
0703 drm_err(&dev_priv->drm,
0704 "timed out waiting for CDclk change\n");
0705 }
0706
0707 vlv_punit_put(dev_priv);
0708
0709 intel_update_cdclk(dev_priv);
0710
0711 vlv_program_pfi_credits(dev_priv);
0712
0713 intel_display_power_put(dev_priv, POWER_DOMAIN_DISPLAY_CORE, wakeref);
0714 }
0715
0716 static int bdw_calc_cdclk(int min_cdclk)
0717 {
0718 if (min_cdclk > 540000)
0719 return 675000;
0720 else if (min_cdclk > 450000)
0721 return 540000;
0722 else if (min_cdclk > 337500)
0723 return 450000;
0724 else
0725 return 337500;
0726 }
0727
0728 static u8 bdw_calc_voltage_level(int cdclk)
0729 {
0730 switch (cdclk) {
0731 default:
0732 case 337500:
0733 return 2;
0734 case 450000:
0735 return 0;
0736 case 540000:
0737 return 1;
0738 case 675000:
0739 return 3;
0740 }
0741 }
0742
0743 static void bdw_get_cdclk(struct drm_i915_private *dev_priv,
0744 struct intel_cdclk_config *cdclk_config)
0745 {
0746 u32 lcpll = intel_de_read(dev_priv, LCPLL_CTL);
0747 u32 freq = lcpll & LCPLL_CLK_FREQ_MASK;
0748
0749 if (lcpll & LCPLL_CD_SOURCE_FCLK)
0750 cdclk_config->cdclk = 800000;
0751 else if (intel_de_read(dev_priv, FUSE_STRAP) & HSW_CDCLK_LIMIT)
0752 cdclk_config->cdclk = 450000;
0753 else if (freq == LCPLL_CLK_FREQ_450)
0754 cdclk_config->cdclk = 450000;
0755 else if (freq == LCPLL_CLK_FREQ_54O_BDW)
0756 cdclk_config->cdclk = 540000;
0757 else if (freq == LCPLL_CLK_FREQ_337_5_BDW)
0758 cdclk_config->cdclk = 337500;
0759 else
0760 cdclk_config->cdclk = 675000;
0761
0762
0763
0764
0765
0766 cdclk_config->voltage_level =
0767 bdw_calc_voltage_level(cdclk_config->cdclk);
0768 }
0769
0770 static u32 bdw_cdclk_freq_sel(int cdclk)
0771 {
0772 switch (cdclk) {
0773 default:
0774 MISSING_CASE(cdclk);
0775 fallthrough;
0776 case 337500:
0777 return LCPLL_CLK_FREQ_337_5_BDW;
0778 case 450000:
0779 return LCPLL_CLK_FREQ_450;
0780 case 540000:
0781 return LCPLL_CLK_FREQ_54O_BDW;
0782 case 675000:
0783 return LCPLL_CLK_FREQ_675_BDW;
0784 }
0785 }
0786
0787 static void bdw_set_cdclk(struct drm_i915_private *dev_priv,
0788 const struct intel_cdclk_config *cdclk_config,
0789 enum pipe pipe)
0790 {
0791 int cdclk = cdclk_config->cdclk;
0792 int ret;
0793
0794 if (drm_WARN(&dev_priv->drm,
0795 (intel_de_read(dev_priv, LCPLL_CTL) &
0796 (LCPLL_PLL_DISABLE | LCPLL_PLL_LOCK |
0797 LCPLL_CD_CLOCK_DISABLE | LCPLL_ROOT_CD_CLOCK_DISABLE |
0798 LCPLL_CD2X_CLOCK_DISABLE | LCPLL_POWER_DOWN_ALLOW |
0799 LCPLL_CD_SOURCE_FCLK)) != LCPLL_PLL_LOCK,
0800 "trying to change cdclk frequency with cdclk not enabled\n"))
0801 return;
0802
0803 ret = snb_pcode_write(&dev_priv->uncore, BDW_PCODE_DISPLAY_FREQ_CHANGE_REQ, 0x0);
0804 if (ret) {
0805 drm_err(&dev_priv->drm,
0806 "failed to inform pcode about cdclk change\n");
0807 return;
0808 }
0809
0810 intel_de_rmw(dev_priv, LCPLL_CTL,
0811 0, LCPLL_CD_SOURCE_FCLK);
0812
0813
0814
0815
0816
0817 if (wait_for_us(intel_de_read(dev_priv, LCPLL_CTL) &
0818 LCPLL_CD_SOURCE_FCLK_DONE, 100))
0819 drm_err(&dev_priv->drm, "Switching to FCLK failed\n");
0820
0821 intel_de_rmw(dev_priv, LCPLL_CTL,
0822 LCPLL_CLK_FREQ_MASK, bdw_cdclk_freq_sel(cdclk));
0823
0824 intel_de_rmw(dev_priv, LCPLL_CTL,
0825 LCPLL_CD_SOURCE_FCLK, 0);
0826
0827 if (wait_for_us((intel_de_read(dev_priv, LCPLL_CTL) &
0828 LCPLL_CD_SOURCE_FCLK_DONE) == 0, 1))
0829 drm_err(&dev_priv->drm, "Switching back to LCPLL failed\n");
0830
0831 snb_pcode_write(&dev_priv->uncore, HSW_PCODE_DE_WRITE_FREQ_REQ,
0832 cdclk_config->voltage_level);
0833
0834 intel_de_write(dev_priv, CDCLK_FREQ,
0835 DIV_ROUND_CLOSEST(cdclk, 1000) - 1);
0836
0837 intel_update_cdclk(dev_priv);
0838 }
0839
0840 static int skl_calc_cdclk(int min_cdclk, int vco)
0841 {
0842 if (vco == 8640000) {
0843 if (min_cdclk > 540000)
0844 return 617143;
0845 else if (min_cdclk > 432000)
0846 return 540000;
0847 else if (min_cdclk > 308571)
0848 return 432000;
0849 else
0850 return 308571;
0851 } else {
0852 if (min_cdclk > 540000)
0853 return 675000;
0854 else if (min_cdclk > 450000)
0855 return 540000;
0856 else if (min_cdclk > 337500)
0857 return 450000;
0858 else
0859 return 337500;
0860 }
0861 }
0862
0863 static u8 skl_calc_voltage_level(int cdclk)
0864 {
0865 if (cdclk > 540000)
0866 return 3;
0867 else if (cdclk > 450000)
0868 return 2;
0869 else if (cdclk > 337500)
0870 return 1;
0871 else
0872 return 0;
0873 }
0874
0875 static void skl_dpll0_update(struct drm_i915_private *dev_priv,
0876 struct intel_cdclk_config *cdclk_config)
0877 {
0878 u32 val;
0879
0880 cdclk_config->ref = 24000;
0881 cdclk_config->vco = 0;
0882
0883 val = intel_de_read(dev_priv, LCPLL1_CTL);
0884 if ((val & LCPLL_PLL_ENABLE) == 0)
0885 return;
0886
0887 if (drm_WARN_ON(&dev_priv->drm, (val & LCPLL_PLL_LOCK) == 0))
0888 return;
0889
0890 val = intel_de_read(dev_priv, DPLL_CTRL1);
0891
0892 if (drm_WARN_ON(&dev_priv->drm,
0893 (val & (DPLL_CTRL1_HDMI_MODE(SKL_DPLL0) |
0894 DPLL_CTRL1_SSC(SKL_DPLL0) |
0895 DPLL_CTRL1_OVERRIDE(SKL_DPLL0))) !=
0896 DPLL_CTRL1_OVERRIDE(SKL_DPLL0)))
0897 return;
0898
0899 switch (val & DPLL_CTRL1_LINK_RATE_MASK(SKL_DPLL0)) {
0900 case DPLL_CTRL1_LINK_RATE(DPLL_CTRL1_LINK_RATE_810, SKL_DPLL0):
0901 case DPLL_CTRL1_LINK_RATE(DPLL_CTRL1_LINK_RATE_1350, SKL_DPLL0):
0902 case DPLL_CTRL1_LINK_RATE(DPLL_CTRL1_LINK_RATE_1620, SKL_DPLL0):
0903 case DPLL_CTRL1_LINK_RATE(DPLL_CTRL1_LINK_RATE_2700, SKL_DPLL0):
0904 cdclk_config->vco = 8100000;
0905 break;
0906 case DPLL_CTRL1_LINK_RATE(DPLL_CTRL1_LINK_RATE_1080, SKL_DPLL0):
0907 case DPLL_CTRL1_LINK_RATE(DPLL_CTRL1_LINK_RATE_2160, SKL_DPLL0):
0908 cdclk_config->vco = 8640000;
0909 break;
0910 default:
0911 MISSING_CASE(val & DPLL_CTRL1_LINK_RATE_MASK(SKL_DPLL0));
0912 break;
0913 }
0914 }
0915
0916 static void skl_get_cdclk(struct drm_i915_private *dev_priv,
0917 struct intel_cdclk_config *cdclk_config)
0918 {
0919 u32 cdctl;
0920
0921 skl_dpll0_update(dev_priv, cdclk_config);
0922
0923 cdclk_config->cdclk = cdclk_config->bypass = cdclk_config->ref;
0924
0925 if (cdclk_config->vco == 0)
0926 goto out;
0927
0928 cdctl = intel_de_read(dev_priv, CDCLK_CTL);
0929
0930 if (cdclk_config->vco == 8640000) {
0931 switch (cdctl & CDCLK_FREQ_SEL_MASK) {
0932 case CDCLK_FREQ_450_432:
0933 cdclk_config->cdclk = 432000;
0934 break;
0935 case CDCLK_FREQ_337_308:
0936 cdclk_config->cdclk = 308571;
0937 break;
0938 case CDCLK_FREQ_540:
0939 cdclk_config->cdclk = 540000;
0940 break;
0941 case CDCLK_FREQ_675_617:
0942 cdclk_config->cdclk = 617143;
0943 break;
0944 default:
0945 MISSING_CASE(cdctl & CDCLK_FREQ_SEL_MASK);
0946 break;
0947 }
0948 } else {
0949 switch (cdctl & CDCLK_FREQ_SEL_MASK) {
0950 case CDCLK_FREQ_450_432:
0951 cdclk_config->cdclk = 450000;
0952 break;
0953 case CDCLK_FREQ_337_308:
0954 cdclk_config->cdclk = 337500;
0955 break;
0956 case CDCLK_FREQ_540:
0957 cdclk_config->cdclk = 540000;
0958 break;
0959 case CDCLK_FREQ_675_617:
0960 cdclk_config->cdclk = 675000;
0961 break;
0962 default:
0963 MISSING_CASE(cdctl & CDCLK_FREQ_SEL_MASK);
0964 break;
0965 }
0966 }
0967
0968 out:
0969
0970
0971
0972
0973 cdclk_config->voltage_level =
0974 skl_calc_voltage_level(cdclk_config->cdclk);
0975 }
0976
0977
0978 static int skl_cdclk_decimal(int cdclk)
0979 {
0980 return DIV_ROUND_CLOSEST(cdclk - 1000, 500);
0981 }
0982
0983 static void skl_set_preferred_cdclk_vco(struct drm_i915_private *dev_priv,
0984 int vco)
0985 {
0986 bool changed = dev_priv->skl_preferred_vco_freq != vco;
0987
0988 dev_priv->skl_preferred_vco_freq = vco;
0989
0990 if (changed)
0991 intel_update_max_cdclk(dev_priv);
0992 }
0993
0994 static u32 skl_dpll0_link_rate(struct drm_i915_private *dev_priv, int vco)
0995 {
0996 drm_WARN_ON(&dev_priv->drm, vco != 8100000 && vco != 8640000);
0997
0998
0999
1000
1001
1002
1003
1004
1005
1006
1007 if (vco == 8640000)
1008 return DPLL_CTRL1_LINK_RATE(DPLL_CTRL1_LINK_RATE_1080, SKL_DPLL0);
1009 else
1010 return DPLL_CTRL1_LINK_RATE(DPLL_CTRL1_LINK_RATE_810, SKL_DPLL0);
1011 }
1012
1013 static void skl_dpll0_enable(struct drm_i915_private *dev_priv, int vco)
1014 {
1015 intel_de_rmw(dev_priv, DPLL_CTRL1,
1016 DPLL_CTRL1_HDMI_MODE(SKL_DPLL0) |
1017 DPLL_CTRL1_SSC(SKL_DPLL0) |
1018 DPLL_CTRL1_LINK_RATE_MASK(SKL_DPLL0),
1019 DPLL_CTRL1_OVERRIDE(SKL_DPLL0) |
1020 skl_dpll0_link_rate(dev_priv, vco));
1021 intel_de_posting_read(dev_priv, DPLL_CTRL1);
1022
1023 intel_de_rmw(dev_priv, LCPLL1_CTL,
1024 0, LCPLL_PLL_ENABLE);
1025
1026 if (intel_de_wait_for_set(dev_priv, LCPLL1_CTL, LCPLL_PLL_LOCK, 5))
1027 drm_err(&dev_priv->drm, "DPLL0 not locked\n");
1028
1029 dev_priv->cdclk.hw.vco = vco;
1030
1031
1032 skl_set_preferred_cdclk_vco(dev_priv, vco);
1033 }
1034
1035 static void skl_dpll0_disable(struct drm_i915_private *dev_priv)
1036 {
1037 intel_de_rmw(dev_priv, LCPLL1_CTL,
1038 LCPLL_PLL_ENABLE, 0);
1039
1040 if (intel_de_wait_for_clear(dev_priv, LCPLL1_CTL, LCPLL_PLL_LOCK, 1))
1041 drm_err(&dev_priv->drm, "Couldn't disable DPLL0\n");
1042
1043 dev_priv->cdclk.hw.vco = 0;
1044 }
1045
1046 static u32 skl_cdclk_freq_sel(struct drm_i915_private *dev_priv,
1047 int cdclk, int vco)
1048 {
1049 switch (cdclk) {
1050 default:
1051 drm_WARN_ON(&dev_priv->drm,
1052 cdclk != dev_priv->cdclk.hw.bypass);
1053 drm_WARN_ON(&dev_priv->drm, vco != 0);
1054 fallthrough;
1055 case 308571:
1056 case 337500:
1057 return CDCLK_FREQ_337_308;
1058 case 450000:
1059 case 432000:
1060 return CDCLK_FREQ_450_432;
1061 case 540000:
1062 return CDCLK_FREQ_540;
1063 case 617143:
1064 case 675000:
1065 return CDCLK_FREQ_675_617;
1066 }
1067 }
1068
1069 static void skl_set_cdclk(struct drm_i915_private *dev_priv,
1070 const struct intel_cdclk_config *cdclk_config,
1071 enum pipe pipe)
1072 {
1073 int cdclk = cdclk_config->cdclk;
1074 int vco = cdclk_config->vco;
1075 u32 freq_select, cdclk_ctl;
1076 int ret;
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086 drm_WARN_ON_ONCE(&dev_priv->drm,
1087 IS_SKYLAKE(dev_priv) && vco == 8640000);
1088
1089 ret = skl_pcode_request(&dev_priv->uncore, SKL_PCODE_CDCLK_CONTROL,
1090 SKL_CDCLK_PREPARE_FOR_CHANGE,
1091 SKL_CDCLK_READY_FOR_CHANGE,
1092 SKL_CDCLK_READY_FOR_CHANGE, 3);
1093 if (ret) {
1094 drm_err(&dev_priv->drm,
1095 "Failed to inform PCU about cdclk change (%d)\n", ret);
1096 return;
1097 }
1098
1099 freq_select = skl_cdclk_freq_sel(dev_priv, cdclk, vco);
1100
1101 if (dev_priv->cdclk.hw.vco != 0 &&
1102 dev_priv->cdclk.hw.vco != vco)
1103 skl_dpll0_disable(dev_priv);
1104
1105 cdclk_ctl = intel_de_read(dev_priv, CDCLK_CTL);
1106
1107 if (dev_priv->cdclk.hw.vco != vco) {
1108
1109 cdclk_ctl &= ~(CDCLK_FREQ_SEL_MASK | CDCLK_FREQ_DECIMAL_MASK);
1110 cdclk_ctl |= freq_select | skl_cdclk_decimal(cdclk);
1111 intel_de_write(dev_priv, CDCLK_CTL, cdclk_ctl);
1112 }
1113
1114
1115 cdclk_ctl |= CDCLK_DIVMUX_CD_OVERRIDE;
1116 intel_de_write(dev_priv, CDCLK_CTL, cdclk_ctl);
1117 intel_de_posting_read(dev_priv, CDCLK_CTL);
1118
1119 if (dev_priv->cdclk.hw.vco != vco)
1120 skl_dpll0_enable(dev_priv, vco);
1121
1122
1123 cdclk_ctl &= ~(CDCLK_FREQ_SEL_MASK | CDCLK_FREQ_DECIMAL_MASK);
1124 intel_de_write(dev_priv, CDCLK_CTL, cdclk_ctl);
1125
1126 cdclk_ctl |= freq_select | skl_cdclk_decimal(cdclk);
1127 intel_de_write(dev_priv, CDCLK_CTL, cdclk_ctl);
1128
1129
1130 cdclk_ctl &= ~CDCLK_DIVMUX_CD_OVERRIDE;
1131 intel_de_write(dev_priv, CDCLK_CTL, cdclk_ctl);
1132 intel_de_posting_read(dev_priv, CDCLK_CTL);
1133
1134
1135 snb_pcode_write(&dev_priv->uncore, SKL_PCODE_CDCLK_CONTROL,
1136 cdclk_config->voltage_level);
1137
1138 intel_update_cdclk(dev_priv);
1139 }
1140
1141 static void skl_sanitize_cdclk(struct drm_i915_private *dev_priv)
1142 {
1143 u32 cdctl, expected;
1144
1145
1146
1147
1148
1149
1150 if ((intel_de_read(dev_priv, SWF_ILK(0x18)) & 0x00FFFFFF) == 0)
1151 goto sanitize;
1152
1153 intel_update_cdclk(dev_priv);
1154 intel_cdclk_dump_config(dev_priv, &dev_priv->cdclk.hw, "Current CDCLK");
1155
1156
1157 if (dev_priv->cdclk.hw.vco == 0 ||
1158 dev_priv->cdclk.hw.cdclk == dev_priv->cdclk.hw.bypass)
1159 goto sanitize;
1160
1161
1162
1163
1164
1165
1166
1167 cdctl = intel_de_read(dev_priv, CDCLK_CTL);
1168 expected = (cdctl & CDCLK_FREQ_SEL_MASK) |
1169 skl_cdclk_decimal(dev_priv->cdclk.hw.cdclk);
1170 if (cdctl == expected)
1171
1172 return;
1173
1174 sanitize:
1175 drm_dbg_kms(&dev_priv->drm, "Sanitizing cdclk programmed by pre-os\n");
1176
1177
1178 dev_priv->cdclk.hw.cdclk = 0;
1179
1180 dev_priv->cdclk.hw.vco = -1;
1181 }
1182
1183 static void skl_cdclk_init_hw(struct drm_i915_private *dev_priv)
1184 {
1185 struct intel_cdclk_config cdclk_config;
1186
1187 skl_sanitize_cdclk(dev_priv);
1188
1189 if (dev_priv->cdclk.hw.cdclk != 0 &&
1190 dev_priv->cdclk.hw.vco != 0) {
1191
1192
1193
1194
1195 if (dev_priv->skl_preferred_vco_freq == 0)
1196 skl_set_preferred_cdclk_vco(dev_priv,
1197 dev_priv->cdclk.hw.vco);
1198 return;
1199 }
1200
1201 cdclk_config = dev_priv->cdclk.hw;
1202
1203 cdclk_config.vco = dev_priv->skl_preferred_vco_freq;
1204 if (cdclk_config.vco == 0)
1205 cdclk_config.vco = 8100000;
1206 cdclk_config.cdclk = skl_calc_cdclk(0, cdclk_config.vco);
1207 cdclk_config.voltage_level = skl_calc_voltage_level(cdclk_config.cdclk);
1208
1209 skl_set_cdclk(dev_priv, &cdclk_config, INVALID_PIPE);
1210 }
1211
1212 static void skl_cdclk_uninit_hw(struct drm_i915_private *dev_priv)
1213 {
1214 struct intel_cdclk_config cdclk_config = dev_priv->cdclk.hw;
1215
1216 cdclk_config.cdclk = cdclk_config.bypass;
1217 cdclk_config.vco = 0;
1218 cdclk_config.voltage_level = skl_calc_voltage_level(cdclk_config.cdclk);
1219
1220 skl_set_cdclk(dev_priv, &cdclk_config, INVALID_PIPE);
1221 }
1222
1223 static bool has_cdclk_squasher(struct drm_i915_private *i915)
1224 {
1225 return IS_DG2(i915);
1226 }
1227
1228 struct intel_cdclk_vals {
1229 u32 cdclk;
1230 u16 refclk;
1231 u16 waveform;
1232 u8 divider;
1233 u8 ratio;
1234 };
1235
1236 static const struct intel_cdclk_vals bxt_cdclk_table[] = {
1237 { .refclk = 19200, .cdclk = 144000, .divider = 8, .ratio = 60 },
1238 { .refclk = 19200, .cdclk = 288000, .divider = 4, .ratio = 60 },
1239 { .refclk = 19200, .cdclk = 384000, .divider = 3, .ratio = 60 },
1240 { .refclk = 19200, .cdclk = 576000, .divider = 2, .ratio = 60 },
1241 { .refclk = 19200, .cdclk = 624000, .divider = 2, .ratio = 65 },
1242 {}
1243 };
1244
1245 static const struct intel_cdclk_vals glk_cdclk_table[] = {
1246 { .refclk = 19200, .cdclk = 79200, .divider = 8, .ratio = 33 },
1247 { .refclk = 19200, .cdclk = 158400, .divider = 4, .ratio = 33 },
1248 { .refclk = 19200, .cdclk = 316800, .divider = 2, .ratio = 33 },
1249 {}
1250 };
1251
1252 static const struct intel_cdclk_vals icl_cdclk_table[] = {
1253 { .refclk = 19200, .cdclk = 172800, .divider = 2, .ratio = 18 },
1254 { .refclk = 19200, .cdclk = 192000, .divider = 2, .ratio = 20 },
1255 { .refclk = 19200, .cdclk = 307200, .divider = 2, .ratio = 32 },
1256 { .refclk = 19200, .cdclk = 326400, .divider = 4, .ratio = 68 },
1257 { .refclk = 19200, .cdclk = 556800, .divider = 2, .ratio = 58 },
1258 { .refclk = 19200, .cdclk = 652800, .divider = 2, .ratio = 68 },
1259
1260 { .refclk = 24000, .cdclk = 180000, .divider = 2, .ratio = 15 },
1261 { .refclk = 24000, .cdclk = 192000, .divider = 2, .ratio = 16 },
1262 { .refclk = 24000, .cdclk = 312000, .divider = 2, .ratio = 26 },
1263 { .refclk = 24000, .cdclk = 324000, .divider = 4, .ratio = 54 },
1264 { .refclk = 24000, .cdclk = 552000, .divider = 2, .ratio = 46 },
1265 { .refclk = 24000, .cdclk = 648000, .divider = 2, .ratio = 54 },
1266
1267 { .refclk = 38400, .cdclk = 172800, .divider = 2, .ratio = 9 },
1268 { .refclk = 38400, .cdclk = 192000, .divider = 2, .ratio = 10 },
1269 { .refclk = 38400, .cdclk = 307200, .divider = 2, .ratio = 16 },
1270 { .refclk = 38400, .cdclk = 326400, .divider = 4, .ratio = 34 },
1271 { .refclk = 38400, .cdclk = 556800, .divider = 2, .ratio = 29 },
1272 { .refclk = 38400, .cdclk = 652800, .divider = 2, .ratio = 34 },
1273 {}
1274 };
1275
1276 static const struct intel_cdclk_vals rkl_cdclk_table[] = {
1277 { .refclk = 19200, .cdclk = 172800, .divider = 4, .ratio = 36 },
1278 { .refclk = 19200, .cdclk = 192000, .divider = 4, .ratio = 40 },
1279 { .refclk = 19200, .cdclk = 307200, .divider = 4, .ratio = 64 },
1280 { .refclk = 19200, .cdclk = 326400, .divider = 8, .ratio = 136 },
1281 { .refclk = 19200, .cdclk = 556800, .divider = 4, .ratio = 116 },
1282 { .refclk = 19200, .cdclk = 652800, .divider = 4, .ratio = 136 },
1283
1284 { .refclk = 24000, .cdclk = 180000, .divider = 4, .ratio = 30 },
1285 { .refclk = 24000, .cdclk = 192000, .divider = 4, .ratio = 32 },
1286 { .refclk = 24000, .cdclk = 312000, .divider = 4, .ratio = 52 },
1287 { .refclk = 24000, .cdclk = 324000, .divider = 8, .ratio = 108 },
1288 { .refclk = 24000, .cdclk = 552000, .divider = 4, .ratio = 92 },
1289 { .refclk = 24000, .cdclk = 648000, .divider = 4, .ratio = 108 },
1290
1291 { .refclk = 38400, .cdclk = 172800, .divider = 4, .ratio = 18 },
1292 { .refclk = 38400, .cdclk = 192000, .divider = 4, .ratio = 20 },
1293 { .refclk = 38400, .cdclk = 307200, .divider = 4, .ratio = 32 },
1294 { .refclk = 38400, .cdclk = 326400, .divider = 8, .ratio = 68 },
1295 { .refclk = 38400, .cdclk = 556800, .divider = 4, .ratio = 58 },
1296 { .refclk = 38400, .cdclk = 652800, .divider = 4, .ratio = 68 },
1297 {}
1298 };
1299
1300 static const struct intel_cdclk_vals adlp_a_step_cdclk_table[] = {
1301 { .refclk = 19200, .cdclk = 307200, .divider = 2, .ratio = 32 },
1302 { .refclk = 19200, .cdclk = 556800, .divider = 2, .ratio = 58 },
1303 { .refclk = 19200, .cdclk = 652800, .divider = 2, .ratio = 68 },
1304
1305 { .refclk = 24000, .cdclk = 312000, .divider = 2, .ratio = 26 },
1306 { .refclk = 24000, .cdclk = 552000, .divider = 2, .ratio = 46 },
1307 { .refclk = 24400, .cdclk = 648000, .divider = 2, .ratio = 54 },
1308
1309 { .refclk = 38400, .cdclk = 307200, .divider = 2, .ratio = 16 },
1310 { .refclk = 38400, .cdclk = 556800, .divider = 2, .ratio = 29 },
1311 { .refclk = 38400, .cdclk = 652800, .divider = 2, .ratio = 34 },
1312 {}
1313 };
1314
1315 static const struct intel_cdclk_vals adlp_cdclk_table[] = {
1316 { .refclk = 19200, .cdclk = 172800, .divider = 3, .ratio = 27 },
1317 { .refclk = 19200, .cdclk = 192000, .divider = 2, .ratio = 20 },
1318 { .refclk = 19200, .cdclk = 307200, .divider = 2, .ratio = 32 },
1319 { .refclk = 19200, .cdclk = 556800, .divider = 2, .ratio = 58 },
1320 { .refclk = 19200, .cdclk = 652800, .divider = 2, .ratio = 68 },
1321
1322 { .refclk = 24000, .cdclk = 176000, .divider = 3, .ratio = 22 },
1323 { .refclk = 24000, .cdclk = 192000, .divider = 2, .ratio = 16 },
1324 { .refclk = 24000, .cdclk = 312000, .divider = 2, .ratio = 26 },
1325 { .refclk = 24000, .cdclk = 552000, .divider = 2, .ratio = 46 },
1326 { .refclk = 24400, .cdclk = 648000, .divider = 2, .ratio = 54 },
1327
1328 { .refclk = 38400, .cdclk = 179200, .divider = 3, .ratio = 14 },
1329 { .refclk = 38400, .cdclk = 192000, .divider = 2, .ratio = 10 },
1330 { .refclk = 38400, .cdclk = 307200, .divider = 2, .ratio = 16 },
1331 { .refclk = 38400, .cdclk = 556800, .divider = 2, .ratio = 29 },
1332 { .refclk = 38400, .cdclk = 652800, .divider = 2, .ratio = 34 },
1333 {}
1334 };
1335
1336 static const struct intel_cdclk_vals dg2_cdclk_table[] = {
1337 { .refclk = 38400, .cdclk = 163200, .divider = 2, .ratio = 34, .waveform = 0x8888 },
1338 { .refclk = 38400, .cdclk = 204000, .divider = 2, .ratio = 34, .waveform = 0x9248 },
1339 { .refclk = 38400, .cdclk = 244800, .divider = 2, .ratio = 34, .waveform = 0xa4a4 },
1340 { .refclk = 38400, .cdclk = 285600, .divider = 2, .ratio = 34, .waveform = 0xa54a },
1341 { .refclk = 38400, .cdclk = 326400, .divider = 2, .ratio = 34, .waveform = 0xaaaa },
1342 { .refclk = 38400, .cdclk = 367200, .divider = 2, .ratio = 34, .waveform = 0xad5a },
1343 { .refclk = 38400, .cdclk = 408000, .divider = 2, .ratio = 34, .waveform = 0xb6b6 },
1344 { .refclk = 38400, .cdclk = 448800, .divider = 2, .ratio = 34, .waveform = 0xdbb6 },
1345 { .refclk = 38400, .cdclk = 489600, .divider = 2, .ratio = 34, .waveform = 0xeeee },
1346 { .refclk = 38400, .cdclk = 530400, .divider = 2, .ratio = 34, .waveform = 0xf7de },
1347 { .refclk = 38400, .cdclk = 571200, .divider = 2, .ratio = 34, .waveform = 0xfefe },
1348 { .refclk = 38400, .cdclk = 612000, .divider = 2, .ratio = 34, .waveform = 0xfffe },
1349 { .refclk = 38400, .cdclk = 652800, .divider = 2, .ratio = 34, .waveform = 0xffff },
1350 {}
1351 };
1352
1353 static int bxt_calc_cdclk(struct drm_i915_private *dev_priv, int min_cdclk)
1354 {
1355 const struct intel_cdclk_vals *table = dev_priv->cdclk.table;
1356 int i;
1357
1358 for (i = 0; table[i].refclk; i++)
1359 if (table[i].refclk == dev_priv->cdclk.hw.ref &&
1360 table[i].cdclk >= min_cdclk)
1361 return table[i].cdclk;
1362
1363 drm_WARN(&dev_priv->drm, 1,
1364 "Cannot satisfy minimum cdclk %d with refclk %u\n",
1365 min_cdclk, dev_priv->cdclk.hw.ref);
1366 return 0;
1367 }
1368
1369 static int bxt_calc_cdclk_pll_vco(struct drm_i915_private *dev_priv, int cdclk)
1370 {
1371 const struct intel_cdclk_vals *table = dev_priv->cdclk.table;
1372 int i;
1373
1374 if (cdclk == dev_priv->cdclk.hw.bypass)
1375 return 0;
1376
1377 for (i = 0; table[i].refclk; i++)
1378 if (table[i].refclk == dev_priv->cdclk.hw.ref &&
1379 table[i].cdclk == cdclk)
1380 return dev_priv->cdclk.hw.ref * table[i].ratio;
1381
1382 drm_WARN(&dev_priv->drm, 1, "cdclk %d not valid for refclk %u\n",
1383 cdclk, dev_priv->cdclk.hw.ref);
1384 return 0;
1385 }
1386
1387 static u8 bxt_calc_voltage_level(int cdclk)
1388 {
1389 return DIV_ROUND_UP(cdclk, 25000);
1390 }
1391
1392 static u8 icl_calc_voltage_level(int cdclk)
1393 {
1394 if (cdclk > 556800)
1395 return 2;
1396 else if (cdclk > 312000)
1397 return 1;
1398 else
1399 return 0;
1400 }
1401
1402 static u8 ehl_calc_voltage_level(int cdclk)
1403 {
1404 if (cdclk > 326400)
1405 return 3;
1406 else if (cdclk > 312000)
1407 return 2;
1408 else if (cdclk > 180000)
1409 return 1;
1410 else
1411 return 0;
1412 }
1413
1414 static u8 tgl_calc_voltage_level(int cdclk)
1415 {
1416 if (cdclk > 556800)
1417 return 3;
1418 else if (cdclk > 326400)
1419 return 2;
1420 else if (cdclk > 312000)
1421 return 1;
1422 else
1423 return 0;
1424 }
1425
1426 static void icl_readout_refclk(struct drm_i915_private *dev_priv,
1427 struct intel_cdclk_config *cdclk_config)
1428 {
1429 u32 dssm = intel_de_read(dev_priv, SKL_DSSM) & ICL_DSSM_CDCLK_PLL_REFCLK_MASK;
1430
1431 switch (dssm) {
1432 default:
1433 MISSING_CASE(dssm);
1434 fallthrough;
1435 case ICL_DSSM_CDCLK_PLL_REFCLK_24MHz:
1436 cdclk_config->ref = 24000;
1437 break;
1438 case ICL_DSSM_CDCLK_PLL_REFCLK_19_2MHz:
1439 cdclk_config->ref = 19200;
1440 break;
1441 case ICL_DSSM_CDCLK_PLL_REFCLK_38_4MHz:
1442 cdclk_config->ref = 38400;
1443 break;
1444 }
1445 }
1446
1447 static void bxt_de_pll_readout(struct drm_i915_private *dev_priv,
1448 struct intel_cdclk_config *cdclk_config)
1449 {
1450 u32 val, ratio;
1451
1452 if (IS_DG2(dev_priv))
1453 cdclk_config->ref = 38400;
1454 else if (DISPLAY_VER(dev_priv) >= 11)
1455 icl_readout_refclk(dev_priv, cdclk_config);
1456 else
1457 cdclk_config->ref = 19200;
1458
1459 val = intel_de_read(dev_priv, BXT_DE_PLL_ENABLE);
1460 if ((val & BXT_DE_PLL_PLL_ENABLE) == 0 ||
1461 (val & BXT_DE_PLL_LOCK) == 0) {
1462
1463
1464
1465
1466 cdclk_config->vco = 0;
1467 return;
1468 }
1469
1470
1471
1472
1473
1474 if (DISPLAY_VER(dev_priv) >= 11)
1475 ratio = val & ICL_CDCLK_PLL_RATIO_MASK;
1476 else
1477 ratio = intel_de_read(dev_priv, BXT_DE_PLL_CTL) & BXT_DE_PLL_RATIO_MASK;
1478
1479 cdclk_config->vco = ratio * cdclk_config->ref;
1480 }
1481
1482 static void bxt_get_cdclk(struct drm_i915_private *dev_priv,
1483 struct intel_cdclk_config *cdclk_config)
1484 {
1485 u32 squash_ctl = 0;
1486 u32 divider;
1487 int div;
1488
1489 bxt_de_pll_readout(dev_priv, cdclk_config);
1490
1491 if (DISPLAY_VER(dev_priv) >= 12)
1492 cdclk_config->bypass = cdclk_config->ref / 2;
1493 else if (DISPLAY_VER(dev_priv) >= 11)
1494 cdclk_config->bypass = 50000;
1495 else
1496 cdclk_config->bypass = cdclk_config->ref;
1497
1498 if (cdclk_config->vco == 0) {
1499 cdclk_config->cdclk = cdclk_config->bypass;
1500 goto out;
1501 }
1502
1503 divider = intel_de_read(dev_priv, CDCLK_CTL) & BXT_CDCLK_CD2X_DIV_SEL_MASK;
1504
1505 switch (divider) {
1506 case BXT_CDCLK_CD2X_DIV_SEL_1:
1507 div = 2;
1508 break;
1509 case BXT_CDCLK_CD2X_DIV_SEL_1_5:
1510 div = 3;
1511 break;
1512 case BXT_CDCLK_CD2X_DIV_SEL_2:
1513 div = 4;
1514 break;
1515 case BXT_CDCLK_CD2X_DIV_SEL_4:
1516 div = 8;
1517 break;
1518 default:
1519 MISSING_CASE(divider);
1520 return;
1521 }
1522
1523 if (has_cdclk_squasher(dev_priv))
1524 squash_ctl = intel_de_read(dev_priv, CDCLK_SQUASH_CTL);
1525
1526 if (squash_ctl & CDCLK_SQUASH_ENABLE) {
1527 u16 waveform;
1528 int size;
1529
1530 size = REG_FIELD_GET(CDCLK_SQUASH_WINDOW_SIZE_MASK, squash_ctl) + 1;
1531 waveform = REG_FIELD_GET(CDCLK_SQUASH_WAVEFORM_MASK, squash_ctl) >> (16 - size);
1532
1533 cdclk_config->cdclk = DIV_ROUND_CLOSEST(hweight16(waveform) *
1534 cdclk_config->vco, size * div);
1535 } else {
1536 cdclk_config->cdclk = DIV_ROUND_CLOSEST(cdclk_config->vco, div);
1537 }
1538
1539 out:
1540
1541
1542
1543
1544 cdclk_config->voltage_level =
1545 intel_cdclk_calc_voltage_level(dev_priv, cdclk_config->cdclk);
1546 }
1547
1548 static void bxt_de_pll_disable(struct drm_i915_private *dev_priv)
1549 {
1550 intel_de_write(dev_priv, BXT_DE_PLL_ENABLE, 0);
1551
1552
1553 if (intel_de_wait_for_clear(dev_priv,
1554 BXT_DE_PLL_ENABLE, BXT_DE_PLL_LOCK, 1))
1555 drm_err(&dev_priv->drm, "timeout waiting for DE PLL unlock\n");
1556
1557 dev_priv->cdclk.hw.vco = 0;
1558 }
1559
1560 static void bxt_de_pll_enable(struct drm_i915_private *dev_priv, int vco)
1561 {
1562 int ratio = DIV_ROUND_CLOSEST(vco, dev_priv->cdclk.hw.ref);
1563
1564 intel_de_rmw(dev_priv, BXT_DE_PLL_CTL,
1565 BXT_DE_PLL_RATIO_MASK, BXT_DE_PLL_RATIO(ratio));
1566
1567 intel_de_write(dev_priv, BXT_DE_PLL_ENABLE, BXT_DE_PLL_PLL_ENABLE);
1568
1569
1570 if (intel_de_wait_for_set(dev_priv,
1571 BXT_DE_PLL_ENABLE, BXT_DE_PLL_LOCK, 1))
1572 drm_err(&dev_priv->drm, "timeout waiting for DE PLL lock\n");
1573
1574 dev_priv->cdclk.hw.vco = vco;
1575 }
1576
1577 static void icl_cdclk_pll_disable(struct drm_i915_private *dev_priv)
1578 {
1579 intel_de_rmw(dev_priv, BXT_DE_PLL_ENABLE,
1580 BXT_DE_PLL_PLL_ENABLE, 0);
1581
1582
1583 if (intel_de_wait_for_clear(dev_priv, BXT_DE_PLL_ENABLE, BXT_DE_PLL_LOCK, 1))
1584 drm_err(&dev_priv->drm, "timeout waiting for CDCLK PLL unlock\n");
1585
1586 dev_priv->cdclk.hw.vco = 0;
1587 }
1588
1589 static void icl_cdclk_pll_enable(struct drm_i915_private *dev_priv, int vco)
1590 {
1591 int ratio = DIV_ROUND_CLOSEST(vco, dev_priv->cdclk.hw.ref);
1592 u32 val;
1593
1594 val = ICL_CDCLK_PLL_RATIO(ratio);
1595 intel_de_write(dev_priv, BXT_DE_PLL_ENABLE, val);
1596
1597 val |= BXT_DE_PLL_PLL_ENABLE;
1598 intel_de_write(dev_priv, BXT_DE_PLL_ENABLE, val);
1599
1600
1601 if (intel_de_wait_for_set(dev_priv, BXT_DE_PLL_ENABLE, BXT_DE_PLL_LOCK, 1))
1602 drm_err(&dev_priv->drm, "timeout waiting for CDCLK PLL lock\n");
1603
1604 dev_priv->cdclk.hw.vco = vco;
1605 }
1606
1607 static void adlp_cdclk_pll_crawl(struct drm_i915_private *dev_priv, int vco)
1608 {
1609 int ratio = DIV_ROUND_CLOSEST(vco, dev_priv->cdclk.hw.ref);
1610 u32 val;
1611
1612
1613 val = ICL_CDCLK_PLL_RATIO(ratio) | BXT_DE_PLL_PLL_ENABLE;
1614 intel_de_write(dev_priv, BXT_DE_PLL_ENABLE, val);
1615
1616
1617 val |= BXT_DE_PLL_FREQ_REQ;
1618 intel_de_write(dev_priv, BXT_DE_PLL_ENABLE, val);
1619
1620
1621 if (intel_de_wait_for_set(dev_priv, BXT_DE_PLL_ENABLE,
1622 BXT_DE_PLL_LOCK | BXT_DE_PLL_FREQ_REQ_ACK, 1))
1623 drm_err(&dev_priv->drm, "timeout waiting for FREQ change request ack\n");
1624
1625 val &= ~BXT_DE_PLL_FREQ_REQ;
1626 intel_de_write(dev_priv, BXT_DE_PLL_ENABLE, val);
1627
1628 dev_priv->cdclk.hw.vco = vco;
1629 }
1630
1631 static u32 bxt_cdclk_cd2x_pipe(struct drm_i915_private *dev_priv, enum pipe pipe)
1632 {
1633 if (DISPLAY_VER(dev_priv) >= 12) {
1634 if (pipe == INVALID_PIPE)
1635 return TGL_CDCLK_CD2X_PIPE_NONE;
1636 else
1637 return TGL_CDCLK_CD2X_PIPE(pipe);
1638 } else if (DISPLAY_VER(dev_priv) >= 11) {
1639 if (pipe == INVALID_PIPE)
1640 return ICL_CDCLK_CD2X_PIPE_NONE;
1641 else
1642 return ICL_CDCLK_CD2X_PIPE(pipe);
1643 } else {
1644 if (pipe == INVALID_PIPE)
1645 return BXT_CDCLK_CD2X_PIPE_NONE;
1646 else
1647 return BXT_CDCLK_CD2X_PIPE(pipe);
1648 }
1649 }
1650
1651 static u32 bxt_cdclk_cd2x_div_sel(struct drm_i915_private *dev_priv,
1652 int cdclk, int vco)
1653 {
1654
1655 switch (DIV_ROUND_CLOSEST(vco, cdclk)) {
1656 default:
1657 drm_WARN_ON(&dev_priv->drm,
1658 cdclk != dev_priv->cdclk.hw.bypass);
1659 drm_WARN_ON(&dev_priv->drm, vco != 0);
1660 fallthrough;
1661 case 2:
1662 return BXT_CDCLK_CD2X_DIV_SEL_1;
1663 case 3:
1664 return BXT_CDCLK_CD2X_DIV_SEL_1_5;
1665 case 4:
1666 return BXT_CDCLK_CD2X_DIV_SEL_2;
1667 case 8:
1668 return BXT_CDCLK_CD2X_DIV_SEL_4;
1669 }
1670 }
1671
1672 static u32 cdclk_squash_waveform(struct drm_i915_private *dev_priv,
1673 int cdclk)
1674 {
1675 const struct intel_cdclk_vals *table = dev_priv->cdclk.table;
1676 int i;
1677
1678 if (cdclk == dev_priv->cdclk.hw.bypass)
1679 return 0;
1680
1681 for (i = 0; table[i].refclk; i++)
1682 if (table[i].refclk == dev_priv->cdclk.hw.ref &&
1683 table[i].cdclk == cdclk)
1684 return table[i].waveform;
1685
1686 drm_WARN(&dev_priv->drm, 1, "cdclk %d not valid for refclk %u\n",
1687 cdclk, dev_priv->cdclk.hw.ref);
1688
1689 return 0xffff;
1690 }
1691
1692 static void bxt_set_cdclk(struct drm_i915_private *dev_priv,
1693 const struct intel_cdclk_config *cdclk_config,
1694 enum pipe pipe)
1695 {
1696 int cdclk = cdclk_config->cdclk;
1697 int vco = cdclk_config->vco;
1698 u32 val;
1699 u16 waveform;
1700 int clock;
1701 int ret;
1702
1703
1704 if (DISPLAY_VER(dev_priv) >= 11)
1705 ret = skl_pcode_request(&dev_priv->uncore, SKL_PCODE_CDCLK_CONTROL,
1706 SKL_CDCLK_PREPARE_FOR_CHANGE,
1707 SKL_CDCLK_READY_FOR_CHANGE,
1708 SKL_CDCLK_READY_FOR_CHANGE, 3);
1709 else
1710
1711
1712
1713
1714 ret = snb_pcode_write_timeout(&dev_priv->uncore,
1715 HSW_PCODE_DE_WRITE_FREQ_REQ,
1716 0x80000000, 150, 2);
1717 if (ret) {
1718 drm_err(&dev_priv->drm,
1719 "Failed to inform PCU about cdclk change (err %d, freq %d)\n",
1720 ret, cdclk);
1721 return;
1722 }
1723
1724 if (HAS_CDCLK_CRAWL(dev_priv) && dev_priv->cdclk.hw.vco > 0 && vco > 0) {
1725 if (dev_priv->cdclk.hw.vco != vco)
1726 adlp_cdclk_pll_crawl(dev_priv, vco);
1727 } else if (DISPLAY_VER(dev_priv) >= 11) {
1728 if (dev_priv->cdclk.hw.vco != 0 &&
1729 dev_priv->cdclk.hw.vco != vco)
1730 icl_cdclk_pll_disable(dev_priv);
1731
1732 if (dev_priv->cdclk.hw.vco != vco)
1733 icl_cdclk_pll_enable(dev_priv, vco);
1734 } else {
1735 if (dev_priv->cdclk.hw.vco != 0 &&
1736 dev_priv->cdclk.hw.vco != vco)
1737 bxt_de_pll_disable(dev_priv);
1738
1739 if (dev_priv->cdclk.hw.vco != vco)
1740 bxt_de_pll_enable(dev_priv, vco);
1741 }
1742
1743 waveform = cdclk_squash_waveform(dev_priv, cdclk);
1744
1745 if (waveform)
1746 clock = vco / 2;
1747 else
1748 clock = cdclk;
1749
1750 if (has_cdclk_squasher(dev_priv)) {
1751 u32 squash_ctl = 0;
1752
1753 if (waveform)
1754 squash_ctl = CDCLK_SQUASH_ENABLE |
1755 CDCLK_SQUASH_WINDOW_SIZE(0xf) | waveform;
1756
1757 intel_de_write(dev_priv, CDCLK_SQUASH_CTL, squash_ctl);
1758 }
1759
1760 val = bxt_cdclk_cd2x_div_sel(dev_priv, clock, vco) |
1761 bxt_cdclk_cd2x_pipe(dev_priv, pipe) |
1762 skl_cdclk_decimal(cdclk);
1763
1764
1765
1766
1767
1768 if ((IS_GEMINILAKE(dev_priv) || IS_BROXTON(dev_priv)) &&
1769 cdclk >= 500000)
1770 val |= BXT_CDCLK_SSA_PRECHARGE_ENABLE;
1771 intel_de_write(dev_priv, CDCLK_CTL, val);
1772
1773 if (pipe != INVALID_PIPE)
1774 intel_crtc_wait_for_next_vblank(intel_crtc_for_pipe(dev_priv, pipe));
1775
1776 if (DISPLAY_VER(dev_priv) >= 11) {
1777 ret = snb_pcode_write(&dev_priv->uncore, SKL_PCODE_CDCLK_CONTROL,
1778 cdclk_config->voltage_level);
1779 } else {
1780
1781
1782
1783
1784
1785
1786 ret = snb_pcode_write_timeout(&dev_priv->uncore,
1787 HSW_PCODE_DE_WRITE_FREQ_REQ,
1788 cdclk_config->voltage_level,
1789 150, 2);
1790 }
1791
1792 if (ret) {
1793 drm_err(&dev_priv->drm,
1794 "PCode CDCLK freq set failed, (err %d, freq %d)\n",
1795 ret, cdclk);
1796 return;
1797 }
1798
1799 intel_update_cdclk(dev_priv);
1800
1801 if (DISPLAY_VER(dev_priv) >= 11)
1802
1803
1804
1805
1806 dev_priv->cdclk.hw.voltage_level = cdclk_config->voltage_level;
1807 }
1808
1809 static void bxt_sanitize_cdclk(struct drm_i915_private *dev_priv)
1810 {
1811 u32 cdctl, expected;
1812 int cdclk, clock, vco;
1813
1814 intel_update_cdclk(dev_priv);
1815 intel_cdclk_dump_config(dev_priv, &dev_priv->cdclk.hw, "Current CDCLK");
1816
1817 if (dev_priv->cdclk.hw.vco == 0 ||
1818 dev_priv->cdclk.hw.cdclk == dev_priv->cdclk.hw.bypass)
1819 goto sanitize;
1820
1821
1822
1823
1824
1825
1826
1827 cdctl = intel_de_read(dev_priv, CDCLK_CTL);
1828
1829
1830
1831
1832
1833 cdctl &= ~bxt_cdclk_cd2x_pipe(dev_priv, INVALID_PIPE);
1834
1835
1836 cdclk = bxt_calc_cdclk(dev_priv, dev_priv->cdclk.hw.cdclk);
1837 if (cdclk != dev_priv->cdclk.hw.cdclk)
1838 goto sanitize;
1839
1840
1841 vco = bxt_calc_cdclk_pll_vco(dev_priv, cdclk);
1842 if (vco != dev_priv->cdclk.hw.vco)
1843 goto sanitize;
1844
1845 expected = skl_cdclk_decimal(cdclk);
1846
1847
1848 if (has_cdclk_squasher(dev_priv))
1849 clock = dev_priv->cdclk.hw.vco / 2;
1850 else
1851 clock = dev_priv->cdclk.hw.cdclk;
1852
1853 expected |= bxt_cdclk_cd2x_div_sel(dev_priv, clock,
1854 dev_priv->cdclk.hw.vco);
1855
1856
1857
1858
1859
1860 if ((IS_GEMINILAKE(dev_priv) || IS_BROXTON(dev_priv)) &&
1861 dev_priv->cdclk.hw.cdclk >= 500000)
1862 expected |= BXT_CDCLK_SSA_PRECHARGE_ENABLE;
1863
1864 if (cdctl == expected)
1865
1866 return;
1867
1868 sanitize:
1869 drm_dbg_kms(&dev_priv->drm, "Sanitizing cdclk programmed by pre-os\n");
1870
1871
1872 dev_priv->cdclk.hw.cdclk = 0;
1873
1874
1875 dev_priv->cdclk.hw.vco = -1;
1876 }
1877
1878 static void bxt_cdclk_init_hw(struct drm_i915_private *dev_priv)
1879 {
1880 struct intel_cdclk_config cdclk_config;
1881
1882 bxt_sanitize_cdclk(dev_priv);
1883
1884 if (dev_priv->cdclk.hw.cdclk != 0 &&
1885 dev_priv->cdclk.hw.vco != 0)
1886 return;
1887
1888 cdclk_config = dev_priv->cdclk.hw;
1889
1890
1891
1892
1893
1894
1895 cdclk_config.cdclk = bxt_calc_cdclk(dev_priv, 0);
1896 cdclk_config.vco = bxt_calc_cdclk_pll_vco(dev_priv, cdclk_config.cdclk);
1897 cdclk_config.voltage_level =
1898 intel_cdclk_calc_voltage_level(dev_priv, cdclk_config.cdclk);
1899
1900 bxt_set_cdclk(dev_priv, &cdclk_config, INVALID_PIPE);
1901 }
1902
1903 static void bxt_cdclk_uninit_hw(struct drm_i915_private *dev_priv)
1904 {
1905 struct intel_cdclk_config cdclk_config = dev_priv->cdclk.hw;
1906
1907 cdclk_config.cdclk = cdclk_config.bypass;
1908 cdclk_config.vco = 0;
1909 cdclk_config.voltage_level =
1910 intel_cdclk_calc_voltage_level(dev_priv, cdclk_config.cdclk);
1911
1912 bxt_set_cdclk(dev_priv, &cdclk_config, INVALID_PIPE);
1913 }
1914
1915
1916
1917
1918
1919
1920
1921
1922
1923
1924 void intel_cdclk_init_hw(struct drm_i915_private *i915)
1925 {
1926 if (DISPLAY_VER(i915) >= 10 || IS_BROXTON(i915))
1927 bxt_cdclk_init_hw(i915);
1928 else if (DISPLAY_VER(i915) == 9)
1929 skl_cdclk_init_hw(i915);
1930 }
1931
1932
1933
1934
1935
1936
1937
1938
1939 void intel_cdclk_uninit_hw(struct drm_i915_private *i915)
1940 {
1941 if (DISPLAY_VER(i915) >= 10 || IS_BROXTON(i915))
1942 bxt_cdclk_uninit_hw(i915);
1943 else if (DISPLAY_VER(i915) == 9)
1944 skl_cdclk_uninit_hw(i915);
1945 }
1946
1947 static bool intel_cdclk_can_crawl(struct drm_i915_private *dev_priv,
1948 const struct intel_cdclk_config *a,
1949 const struct intel_cdclk_config *b)
1950 {
1951 int a_div, b_div;
1952
1953 if (!HAS_CDCLK_CRAWL(dev_priv))
1954 return false;
1955
1956
1957
1958
1959
1960 a_div = DIV_ROUND_CLOSEST(a->vco, a->cdclk);
1961 b_div = DIV_ROUND_CLOSEST(b->vco, b->cdclk);
1962
1963 return a->vco != 0 && b->vco != 0 &&
1964 a->vco != b->vco &&
1965 a_div == b_div &&
1966 a->ref == b->ref;
1967 }
1968
1969 static bool intel_cdclk_can_squash(struct drm_i915_private *dev_priv,
1970 const struct intel_cdclk_config *a,
1971 const struct intel_cdclk_config *b)
1972 {
1973
1974
1975
1976
1977
1978
1979 if (!has_cdclk_squasher(dev_priv))
1980 return false;
1981
1982 return a->cdclk != b->cdclk &&
1983 a->vco != 0 &&
1984 a->vco == b->vco &&
1985 a->ref == b->ref;
1986 }
1987
1988
1989
1990
1991
1992
1993
1994
1995
1996
1997
1998 bool intel_cdclk_needs_modeset(const struct intel_cdclk_config *a,
1999 const struct intel_cdclk_config *b)
2000 {
2001 return a->cdclk != b->cdclk ||
2002 a->vco != b->vco ||
2003 a->ref != b->ref;
2004 }
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017 static bool intel_cdclk_can_cd2x_update(struct drm_i915_private *dev_priv,
2018 const struct intel_cdclk_config *a,
2019 const struct intel_cdclk_config *b)
2020 {
2021
2022 if (DISPLAY_VER(dev_priv) < 10 && !IS_BROXTON(dev_priv))
2023 return false;
2024
2025
2026
2027
2028
2029
2030
2031 if (has_cdclk_squasher(dev_priv))
2032 return false;
2033
2034 return a->cdclk != b->cdclk &&
2035 a->vco != 0 &&
2036 a->vco == b->vco &&
2037 a->ref == b->ref;
2038 }
2039
2040
2041
2042
2043
2044
2045
2046
2047
2048 static bool intel_cdclk_changed(const struct intel_cdclk_config *a,
2049 const struct intel_cdclk_config *b)
2050 {
2051 return intel_cdclk_needs_modeset(a, b) ||
2052 a->voltage_level != b->voltage_level;
2053 }
2054
2055 void intel_cdclk_dump_config(struct drm_i915_private *i915,
2056 const struct intel_cdclk_config *cdclk_config,
2057 const char *context)
2058 {
2059 drm_dbg_kms(&i915->drm, "%s %d kHz, VCO %d kHz, ref %d kHz, bypass %d kHz, voltage level %d\n",
2060 context, cdclk_config->cdclk, cdclk_config->vco,
2061 cdclk_config->ref, cdclk_config->bypass,
2062 cdclk_config->voltage_level);
2063 }
2064
2065
2066
2067
2068
2069
2070
2071
2072
2073
2074 static void intel_set_cdclk(struct drm_i915_private *dev_priv,
2075 const struct intel_cdclk_config *cdclk_config,
2076 enum pipe pipe)
2077 {
2078 struct intel_encoder *encoder;
2079
2080 if (!intel_cdclk_changed(&dev_priv->cdclk.hw, cdclk_config))
2081 return;
2082
2083 if (drm_WARN_ON_ONCE(&dev_priv->drm, !dev_priv->cdclk_funcs->set_cdclk))
2084 return;
2085
2086 intel_cdclk_dump_config(dev_priv, cdclk_config, "Changing CDCLK to");
2087
2088 for_each_intel_encoder_with_psr(&dev_priv->drm, encoder) {
2089 struct intel_dp *intel_dp = enc_to_intel_dp(encoder);
2090
2091 intel_psr_pause(intel_dp);
2092 }
2093
2094 intel_audio_cdclk_change_pre(dev_priv);
2095
2096
2097
2098
2099
2100
2101 mutex_lock(&dev_priv->gmbus_mutex);
2102 for_each_intel_dp(&dev_priv->drm, encoder) {
2103 struct intel_dp *intel_dp = enc_to_intel_dp(encoder);
2104
2105 mutex_lock_nest_lock(&intel_dp->aux.hw_mutex,
2106 &dev_priv->gmbus_mutex);
2107 }
2108
2109 intel_cdclk_set_cdclk(dev_priv, cdclk_config, pipe);
2110
2111 for_each_intel_dp(&dev_priv->drm, encoder) {
2112 struct intel_dp *intel_dp = enc_to_intel_dp(encoder);
2113
2114 mutex_unlock(&intel_dp->aux.hw_mutex);
2115 }
2116 mutex_unlock(&dev_priv->gmbus_mutex);
2117
2118 for_each_intel_encoder_with_psr(&dev_priv->drm, encoder) {
2119 struct intel_dp *intel_dp = enc_to_intel_dp(encoder);
2120
2121 intel_psr_resume(intel_dp);
2122 }
2123
2124 intel_audio_cdclk_change_post(dev_priv);
2125
2126 if (drm_WARN(&dev_priv->drm,
2127 intel_cdclk_changed(&dev_priv->cdclk.hw, cdclk_config),
2128 "cdclk state doesn't match!\n")) {
2129 intel_cdclk_dump_config(dev_priv, &dev_priv->cdclk.hw, "[hw state]");
2130 intel_cdclk_dump_config(dev_priv, cdclk_config, "[sw state]");
2131 }
2132 }
2133
2134
2135
2136
2137
2138
2139
2140
2141 void
2142 intel_set_cdclk_pre_plane_update(struct intel_atomic_state *state)
2143 {
2144 struct drm_i915_private *dev_priv = to_i915(state->base.dev);
2145 const struct intel_cdclk_state *old_cdclk_state =
2146 intel_atomic_get_old_cdclk_state(state);
2147 const struct intel_cdclk_state *new_cdclk_state =
2148 intel_atomic_get_new_cdclk_state(state);
2149 enum pipe pipe = new_cdclk_state->pipe;
2150
2151 if (!intel_cdclk_changed(&old_cdclk_state->actual,
2152 &new_cdclk_state->actual))
2153 return;
2154
2155 if (pipe == INVALID_PIPE ||
2156 old_cdclk_state->actual.cdclk <= new_cdclk_state->actual.cdclk) {
2157 drm_WARN_ON(&dev_priv->drm, !new_cdclk_state->base.changed);
2158
2159 intel_set_cdclk(dev_priv, &new_cdclk_state->actual, pipe);
2160 }
2161 }
2162
2163
2164
2165
2166
2167
2168
2169
2170 void
2171 intel_set_cdclk_post_plane_update(struct intel_atomic_state *state)
2172 {
2173 struct drm_i915_private *dev_priv = to_i915(state->base.dev);
2174 const struct intel_cdclk_state *old_cdclk_state =
2175 intel_atomic_get_old_cdclk_state(state);
2176 const struct intel_cdclk_state *new_cdclk_state =
2177 intel_atomic_get_new_cdclk_state(state);
2178 enum pipe pipe = new_cdclk_state->pipe;
2179
2180 if (!intel_cdclk_changed(&old_cdclk_state->actual,
2181 &new_cdclk_state->actual))
2182 return;
2183
2184 if (pipe != INVALID_PIPE &&
2185 old_cdclk_state->actual.cdclk > new_cdclk_state->actual.cdclk) {
2186 drm_WARN_ON(&dev_priv->drm, !new_cdclk_state->base.changed);
2187
2188 intel_set_cdclk(dev_priv, &new_cdclk_state->actual, pipe);
2189 }
2190 }
2191
2192 static int intel_pixel_rate_to_cdclk(const struct intel_crtc_state *crtc_state)
2193 {
2194 struct drm_i915_private *dev_priv = to_i915(crtc_state->uapi.crtc->dev);
2195 int pixel_rate = crtc_state->pixel_rate;
2196
2197 if (DISPLAY_VER(dev_priv) >= 10)
2198 return DIV_ROUND_UP(pixel_rate, 2);
2199 else if (DISPLAY_VER(dev_priv) == 9 ||
2200 IS_BROADWELL(dev_priv) || IS_HASWELL(dev_priv))
2201 return pixel_rate;
2202 else if (IS_CHERRYVIEW(dev_priv))
2203 return DIV_ROUND_UP(pixel_rate * 100, 95);
2204 else if (crtc_state->double_wide)
2205 return DIV_ROUND_UP(pixel_rate * 100, 90 * 2);
2206 else
2207 return DIV_ROUND_UP(pixel_rate * 100, 90);
2208 }
2209
2210 static int intel_planes_min_cdclk(const struct intel_crtc_state *crtc_state)
2211 {
2212 struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
2213 struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
2214 struct intel_plane *plane;
2215 int min_cdclk = 0;
2216
2217 for_each_intel_plane_on_crtc(&dev_priv->drm, crtc, plane)
2218 min_cdclk = max(crtc_state->min_cdclk[plane->id], min_cdclk);
2219
2220 return min_cdclk;
2221 }
2222
2223 int intel_crtc_compute_min_cdclk(const struct intel_crtc_state *crtc_state)
2224 {
2225 struct drm_i915_private *dev_priv =
2226 to_i915(crtc_state->uapi.crtc->dev);
2227 int min_cdclk;
2228
2229 if (!crtc_state->hw.enable)
2230 return 0;
2231
2232 min_cdclk = intel_pixel_rate_to_cdclk(crtc_state);
2233
2234
2235 if (IS_BROADWELL(dev_priv) && hsw_crtc_state_ips_capable(crtc_state))
2236 min_cdclk = DIV_ROUND_UP(min_cdclk * 100, 95);
2237
2238
2239
2240
2241
2242
2243 if (intel_crtc_has_dp_encoder(crtc_state) &&
2244 crtc_state->has_audio &&
2245 crtc_state->port_clock >= 540000 &&
2246 crtc_state->lane_count == 4) {
2247 if (DISPLAY_VER(dev_priv) == 10) {
2248
2249 min_cdclk = max(316800, min_cdclk);
2250 } else if (DISPLAY_VER(dev_priv) == 9 || IS_BROADWELL(dev_priv)) {
2251
2252 min_cdclk = max(432000, min_cdclk);
2253 }
2254 }
2255
2256
2257
2258
2259
2260 if (crtc_state->has_audio && DISPLAY_VER(dev_priv) >= 9)
2261 min_cdclk = max(2 * 96000, min_cdclk);
2262
2263
2264
2265
2266
2267
2268
2269
2270 if ((IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv)) &&
2271 intel_crtc_has_dp_encoder(crtc_state) && crtc_state->has_audio)
2272 min_cdclk = max(crtc_state->port_clock, min_cdclk);
2273
2274
2275
2276
2277
2278 if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_DSI) &&
2279 IS_VALLEYVIEW(dev_priv))
2280 min_cdclk = max(320000, min_cdclk);
2281
2282
2283
2284
2285
2286
2287 if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_DSI) &&
2288 IS_GEMINILAKE(dev_priv))
2289 min_cdclk = max(158400, min_cdclk);
2290
2291
2292 min_cdclk = max(intel_planes_min_cdclk(crtc_state), min_cdclk);
2293
2294
2295
2296
2297
2298
2299 if (crtc_state->dsc.compression_enable && !crtc_state->dsc.dsc_split)
2300 min_cdclk = max(min_cdclk, (int)crtc_state->pixel_rate);
2301
2302
2303
2304
2305
2306
2307
2308
2309
2310
2311 if (IS_TIGERLAKE(dev_priv)) {
2312
2313
2314
2315
2316 min_cdclk = max_t(int, min_cdclk,
2317 min_t(int, crtc_state->pixel_rate,
2318 dev_priv->max_cdclk_freq));
2319 }
2320
2321 return min_cdclk;
2322 }
2323
2324 static int intel_compute_min_cdclk(struct intel_cdclk_state *cdclk_state)
2325 {
2326 struct intel_atomic_state *state = cdclk_state->base.state;
2327 struct drm_i915_private *dev_priv = to_i915(state->base.dev);
2328 const struct intel_bw_state *bw_state;
2329 struct intel_crtc *crtc;
2330 struct intel_crtc_state *crtc_state;
2331 int min_cdclk, i;
2332 enum pipe pipe;
2333
2334 for_each_new_intel_crtc_in_state(state, crtc, crtc_state, i) {
2335 int ret;
2336
2337 min_cdclk = intel_crtc_compute_min_cdclk(crtc_state);
2338 if (min_cdclk < 0)
2339 return min_cdclk;
2340
2341 if (cdclk_state->min_cdclk[crtc->pipe] == min_cdclk)
2342 continue;
2343
2344 cdclk_state->min_cdclk[crtc->pipe] = min_cdclk;
2345
2346 ret = intel_atomic_lock_global_state(&cdclk_state->base);
2347 if (ret)
2348 return ret;
2349 }
2350
2351 bw_state = intel_atomic_get_new_bw_state(state);
2352 if (bw_state) {
2353 min_cdclk = intel_bw_min_cdclk(dev_priv, bw_state);
2354
2355 if (cdclk_state->bw_min_cdclk != min_cdclk) {
2356 int ret;
2357
2358 cdclk_state->bw_min_cdclk = min_cdclk;
2359
2360 ret = intel_atomic_lock_global_state(&cdclk_state->base);
2361 if (ret)
2362 return ret;
2363 }
2364 }
2365
2366 min_cdclk = max(cdclk_state->force_min_cdclk,
2367 cdclk_state->bw_min_cdclk);
2368 for_each_pipe(dev_priv, pipe)
2369 min_cdclk = max(cdclk_state->min_cdclk[pipe], min_cdclk);
2370
2371 if (min_cdclk > dev_priv->max_cdclk_freq) {
2372 drm_dbg_kms(&dev_priv->drm,
2373 "required cdclk (%d kHz) exceeds max (%d kHz)\n",
2374 min_cdclk, dev_priv->max_cdclk_freq);
2375 return -EINVAL;
2376 }
2377
2378 return min_cdclk;
2379 }
2380
2381
2382
2383
2384
2385
2386
2387
2388
2389
2390
2391
2392
2393
2394 static int bxt_compute_min_voltage_level(struct intel_cdclk_state *cdclk_state)
2395 {
2396 struct intel_atomic_state *state = cdclk_state->base.state;
2397 struct drm_i915_private *dev_priv = to_i915(state->base.dev);
2398 struct intel_crtc *crtc;
2399 struct intel_crtc_state *crtc_state;
2400 u8 min_voltage_level;
2401 int i;
2402 enum pipe pipe;
2403
2404 for_each_new_intel_crtc_in_state(state, crtc, crtc_state, i) {
2405 int ret;
2406
2407 if (crtc_state->hw.enable)
2408 min_voltage_level = crtc_state->min_voltage_level;
2409 else
2410 min_voltage_level = 0;
2411
2412 if (cdclk_state->min_voltage_level[crtc->pipe] == min_voltage_level)
2413 continue;
2414
2415 cdclk_state->min_voltage_level[crtc->pipe] = min_voltage_level;
2416
2417 ret = intel_atomic_lock_global_state(&cdclk_state->base);
2418 if (ret)
2419 return ret;
2420 }
2421
2422 min_voltage_level = 0;
2423 for_each_pipe(dev_priv, pipe)
2424 min_voltage_level = max(cdclk_state->min_voltage_level[pipe],
2425 min_voltage_level);
2426
2427 return min_voltage_level;
2428 }
2429
2430 static int vlv_modeset_calc_cdclk(struct intel_cdclk_state *cdclk_state)
2431 {
2432 struct intel_atomic_state *state = cdclk_state->base.state;
2433 struct drm_i915_private *dev_priv = to_i915(state->base.dev);
2434 int min_cdclk, cdclk;
2435
2436 min_cdclk = intel_compute_min_cdclk(cdclk_state);
2437 if (min_cdclk < 0)
2438 return min_cdclk;
2439
2440 cdclk = vlv_calc_cdclk(dev_priv, min_cdclk);
2441
2442 cdclk_state->logical.cdclk = cdclk;
2443 cdclk_state->logical.voltage_level =
2444 vlv_calc_voltage_level(dev_priv, cdclk);
2445
2446 if (!cdclk_state->active_pipes) {
2447 cdclk = vlv_calc_cdclk(dev_priv, cdclk_state->force_min_cdclk);
2448
2449 cdclk_state->actual.cdclk = cdclk;
2450 cdclk_state->actual.voltage_level =
2451 vlv_calc_voltage_level(dev_priv, cdclk);
2452 } else {
2453 cdclk_state->actual = cdclk_state->logical;
2454 }
2455
2456 return 0;
2457 }
2458
2459 static int bdw_modeset_calc_cdclk(struct intel_cdclk_state *cdclk_state)
2460 {
2461 int min_cdclk, cdclk;
2462
2463 min_cdclk = intel_compute_min_cdclk(cdclk_state);
2464 if (min_cdclk < 0)
2465 return min_cdclk;
2466
2467
2468
2469
2470
2471 cdclk = bdw_calc_cdclk(min_cdclk);
2472
2473 cdclk_state->logical.cdclk = cdclk;
2474 cdclk_state->logical.voltage_level =
2475 bdw_calc_voltage_level(cdclk);
2476
2477 if (!cdclk_state->active_pipes) {
2478 cdclk = bdw_calc_cdclk(cdclk_state->force_min_cdclk);
2479
2480 cdclk_state->actual.cdclk = cdclk;
2481 cdclk_state->actual.voltage_level =
2482 bdw_calc_voltage_level(cdclk);
2483 } else {
2484 cdclk_state->actual = cdclk_state->logical;
2485 }
2486
2487 return 0;
2488 }
2489
2490 static int skl_dpll0_vco(struct intel_cdclk_state *cdclk_state)
2491 {
2492 struct intel_atomic_state *state = cdclk_state->base.state;
2493 struct drm_i915_private *dev_priv = to_i915(state->base.dev);
2494 struct intel_crtc *crtc;
2495 struct intel_crtc_state *crtc_state;
2496 int vco, i;
2497
2498 vco = cdclk_state->logical.vco;
2499 if (!vco)
2500 vco = dev_priv->skl_preferred_vco_freq;
2501
2502 for_each_new_intel_crtc_in_state(state, crtc, crtc_state, i) {
2503 if (!crtc_state->hw.enable)
2504 continue;
2505
2506 if (!intel_crtc_has_type(crtc_state, INTEL_OUTPUT_EDP))
2507 continue;
2508
2509
2510
2511
2512
2513 switch (crtc_state->port_clock / 2) {
2514 case 108000:
2515 case 216000:
2516 vco = 8640000;
2517 break;
2518 default:
2519 vco = 8100000;
2520 break;
2521 }
2522 }
2523
2524 return vco;
2525 }
2526
2527 static int skl_modeset_calc_cdclk(struct intel_cdclk_state *cdclk_state)
2528 {
2529 int min_cdclk, cdclk, vco;
2530
2531 min_cdclk = intel_compute_min_cdclk(cdclk_state);
2532 if (min_cdclk < 0)
2533 return min_cdclk;
2534
2535 vco = skl_dpll0_vco(cdclk_state);
2536
2537
2538
2539
2540
2541 cdclk = skl_calc_cdclk(min_cdclk, vco);
2542
2543 cdclk_state->logical.vco = vco;
2544 cdclk_state->logical.cdclk = cdclk;
2545 cdclk_state->logical.voltage_level =
2546 skl_calc_voltage_level(cdclk);
2547
2548 if (!cdclk_state->active_pipes) {
2549 cdclk = skl_calc_cdclk(cdclk_state->force_min_cdclk, vco);
2550
2551 cdclk_state->actual.vco = vco;
2552 cdclk_state->actual.cdclk = cdclk;
2553 cdclk_state->actual.voltage_level =
2554 skl_calc_voltage_level(cdclk);
2555 } else {
2556 cdclk_state->actual = cdclk_state->logical;
2557 }
2558
2559 return 0;
2560 }
2561
2562 static int bxt_modeset_calc_cdclk(struct intel_cdclk_state *cdclk_state)
2563 {
2564 struct intel_atomic_state *state = cdclk_state->base.state;
2565 struct drm_i915_private *dev_priv = to_i915(state->base.dev);
2566 int min_cdclk, min_voltage_level, cdclk, vco;
2567
2568 min_cdclk = intel_compute_min_cdclk(cdclk_state);
2569 if (min_cdclk < 0)
2570 return min_cdclk;
2571
2572 min_voltage_level = bxt_compute_min_voltage_level(cdclk_state);
2573 if (min_voltage_level < 0)
2574 return min_voltage_level;
2575
2576 cdclk = bxt_calc_cdclk(dev_priv, min_cdclk);
2577 vco = bxt_calc_cdclk_pll_vco(dev_priv, cdclk);
2578
2579 cdclk_state->logical.vco = vco;
2580 cdclk_state->logical.cdclk = cdclk;
2581 cdclk_state->logical.voltage_level =
2582 max_t(int, min_voltage_level,
2583 intel_cdclk_calc_voltage_level(dev_priv, cdclk));
2584
2585 if (!cdclk_state->active_pipes) {
2586 cdclk = bxt_calc_cdclk(dev_priv, cdclk_state->force_min_cdclk);
2587 vco = bxt_calc_cdclk_pll_vco(dev_priv, cdclk);
2588
2589 cdclk_state->actual.vco = vco;
2590 cdclk_state->actual.cdclk = cdclk;
2591 cdclk_state->actual.voltage_level =
2592 intel_cdclk_calc_voltage_level(dev_priv, cdclk);
2593 } else {
2594 cdclk_state->actual = cdclk_state->logical;
2595 }
2596
2597 return 0;
2598 }
2599
2600 static int fixed_modeset_calc_cdclk(struct intel_cdclk_state *cdclk_state)
2601 {
2602 int min_cdclk;
2603
2604
2605
2606
2607
2608
2609 min_cdclk = intel_compute_min_cdclk(cdclk_state);
2610 if (min_cdclk < 0)
2611 return min_cdclk;
2612
2613 return 0;
2614 }
2615
2616 static struct intel_global_state *intel_cdclk_duplicate_state(struct intel_global_obj *obj)
2617 {
2618 struct intel_cdclk_state *cdclk_state;
2619
2620 cdclk_state = kmemdup(obj->state, sizeof(*cdclk_state), GFP_KERNEL);
2621 if (!cdclk_state)
2622 return NULL;
2623
2624 cdclk_state->pipe = INVALID_PIPE;
2625
2626 return &cdclk_state->base;
2627 }
2628
2629 static void intel_cdclk_destroy_state(struct intel_global_obj *obj,
2630 struct intel_global_state *state)
2631 {
2632 kfree(state);
2633 }
2634
2635 static const struct intel_global_state_funcs intel_cdclk_funcs = {
2636 .atomic_duplicate_state = intel_cdclk_duplicate_state,
2637 .atomic_destroy_state = intel_cdclk_destroy_state,
2638 };
2639
2640 struct intel_cdclk_state *
2641 intel_atomic_get_cdclk_state(struct intel_atomic_state *state)
2642 {
2643 struct drm_i915_private *dev_priv = to_i915(state->base.dev);
2644 struct intel_global_state *cdclk_state;
2645
2646 cdclk_state = intel_atomic_get_global_obj_state(state, &dev_priv->cdclk.obj);
2647 if (IS_ERR(cdclk_state))
2648 return ERR_CAST(cdclk_state);
2649
2650 return to_intel_cdclk_state(cdclk_state);
2651 }
2652
2653 int intel_cdclk_atomic_check(struct intel_atomic_state *state,
2654 bool *need_cdclk_calc)
2655 {
2656 const struct intel_cdclk_state *old_cdclk_state;
2657 const struct intel_cdclk_state *new_cdclk_state;
2658 struct intel_plane_state *plane_state;
2659 struct intel_plane *plane;
2660 int ret;
2661 int i;
2662
2663
2664
2665
2666
2667
2668 for_each_new_intel_plane_in_state(state, plane, plane_state, i) {
2669 ret = intel_plane_calc_min_cdclk(state, plane, need_cdclk_calc);
2670 if (ret)
2671 return ret;
2672 }
2673
2674 ret = intel_bw_calc_min_cdclk(state, need_cdclk_calc);
2675 if (ret)
2676 return ret;
2677
2678 old_cdclk_state = intel_atomic_get_old_cdclk_state(state);
2679 new_cdclk_state = intel_atomic_get_new_cdclk_state(state);
2680
2681 if (new_cdclk_state &&
2682 old_cdclk_state->force_min_cdclk != new_cdclk_state->force_min_cdclk)
2683 *need_cdclk_calc = true;
2684
2685 return 0;
2686 }
2687
2688 int intel_cdclk_init(struct drm_i915_private *dev_priv)
2689 {
2690 struct intel_cdclk_state *cdclk_state;
2691
2692 cdclk_state = kzalloc(sizeof(*cdclk_state), GFP_KERNEL);
2693 if (!cdclk_state)
2694 return -ENOMEM;
2695
2696 intel_atomic_global_obj_init(dev_priv, &dev_priv->cdclk.obj,
2697 &cdclk_state->base, &intel_cdclk_funcs);
2698
2699 return 0;
2700 }
2701
2702 int intel_modeset_calc_cdclk(struct intel_atomic_state *state)
2703 {
2704 struct drm_i915_private *dev_priv = to_i915(state->base.dev);
2705 const struct intel_cdclk_state *old_cdclk_state;
2706 struct intel_cdclk_state *new_cdclk_state;
2707 enum pipe pipe = INVALID_PIPE;
2708 int ret;
2709
2710 new_cdclk_state = intel_atomic_get_cdclk_state(state);
2711 if (IS_ERR(new_cdclk_state))
2712 return PTR_ERR(new_cdclk_state);
2713
2714 old_cdclk_state = intel_atomic_get_old_cdclk_state(state);
2715
2716 new_cdclk_state->active_pipes =
2717 intel_calc_active_pipes(state, old_cdclk_state->active_pipes);
2718
2719 ret = intel_cdclk_modeset_calc_cdclk(dev_priv, new_cdclk_state);
2720 if (ret)
2721 return ret;
2722
2723 if (intel_cdclk_changed(&old_cdclk_state->actual,
2724 &new_cdclk_state->actual)) {
2725
2726
2727
2728
2729 ret = intel_atomic_serialize_global_state(&new_cdclk_state->base);
2730 if (ret)
2731 return ret;
2732 } else if (old_cdclk_state->active_pipes != new_cdclk_state->active_pipes ||
2733 old_cdclk_state->force_min_cdclk != new_cdclk_state->force_min_cdclk ||
2734 intel_cdclk_changed(&old_cdclk_state->logical,
2735 &new_cdclk_state->logical)) {
2736 ret = intel_atomic_lock_global_state(&new_cdclk_state->base);
2737 if (ret)
2738 return ret;
2739 } else {
2740 return 0;
2741 }
2742
2743 if (is_power_of_2(new_cdclk_state->active_pipes) &&
2744 intel_cdclk_can_cd2x_update(dev_priv,
2745 &old_cdclk_state->actual,
2746 &new_cdclk_state->actual)) {
2747 struct intel_crtc *crtc;
2748 struct intel_crtc_state *crtc_state;
2749
2750 pipe = ilog2(new_cdclk_state->active_pipes);
2751 crtc = intel_crtc_for_pipe(dev_priv, pipe);
2752
2753 crtc_state = intel_atomic_get_crtc_state(&state->base, crtc);
2754 if (IS_ERR(crtc_state))
2755 return PTR_ERR(crtc_state);
2756
2757 if (drm_atomic_crtc_needs_modeset(&crtc_state->uapi))
2758 pipe = INVALID_PIPE;
2759 }
2760
2761 if (intel_cdclk_can_squash(dev_priv,
2762 &old_cdclk_state->actual,
2763 &new_cdclk_state->actual)) {
2764 drm_dbg_kms(&dev_priv->drm,
2765 "Can change cdclk via squasher\n");
2766 } else if (intel_cdclk_can_crawl(dev_priv,
2767 &old_cdclk_state->actual,
2768 &new_cdclk_state->actual)) {
2769 drm_dbg_kms(&dev_priv->drm,
2770 "Can change cdclk via crawl\n");
2771 } else if (pipe != INVALID_PIPE) {
2772 new_cdclk_state->pipe = pipe;
2773
2774 drm_dbg_kms(&dev_priv->drm,
2775 "Can change cdclk cd2x divider with pipe %c active\n",
2776 pipe_name(pipe));
2777 } else if (intel_cdclk_needs_modeset(&old_cdclk_state->actual,
2778 &new_cdclk_state->actual)) {
2779
2780 ret = intel_modeset_all_pipes(state);
2781 if (ret)
2782 return ret;
2783
2784 drm_dbg_kms(&dev_priv->drm,
2785 "Modeset required for cdclk change\n");
2786 }
2787
2788 drm_dbg_kms(&dev_priv->drm,
2789 "New cdclk calculated to be logical %u kHz, actual %u kHz\n",
2790 new_cdclk_state->logical.cdclk,
2791 new_cdclk_state->actual.cdclk);
2792 drm_dbg_kms(&dev_priv->drm,
2793 "New voltage level calculated to be logical %u, actual %u\n",
2794 new_cdclk_state->logical.voltage_level,
2795 new_cdclk_state->actual.voltage_level);
2796
2797 return 0;
2798 }
2799
2800 static int intel_compute_max_dotclk(struct drm_i915_private *dev_priv)
2801 {
2802 int max_cdclk_freq = dev_priv->max_cdclk_freq;
2803
2804 if (DISPLAY_VER(dev_priv) >= 10)
2805 return 2 * max_cdclk_freq;
2806 else if (DISPLAY_VER(dev_priv) == 9 ||
2807 IS_BROADWELL(dev_priv) || IS_HASWELL(dev_priv))
2808 return max_cdclk_freq;
2809 else if (IS_CHERRYVIEW(dev_priv))
2810 return max_cdclk_freq*95/100;
2811 else if (DISPLAY_VER(dev_priv) < 4)
2812 return 2*max_cdclk_freq*90/100;
2813 else
2814 return max_cdclk_freq*90/100;
2815 }
2816
2817
2818
2819
2820
2821
2822
2823
2824
2825 void intel_update_max_cdclk(struct drm_i915_private *dev_priv)
2826 {
2827 if (IS_JSL_EHL(dev_priv)) {
2828 if (dev_priv->cdclk.hw.ref == 24000)
2829 dev_priv->max_cdclk_freq = 552000;
2830 else
2831 dev_priv->max_cdclk_freq = 556800;
2832 } else if (DISPLAY_VER(dev_priv) >= 11) {
2833 if (dev_priv->cdclk.hw.ref == 24000)
2834 dev_priv->max_cdclk_freq = 648000;
2835 else
2836 dev_priv->max_cdclk_freq = 652800;
2837 } else if (IS_GEMINILAKE(dev_priv)) {
2838 dev_priv->max_cdclk_freq = 316800;
2839 } else if (IS_BROXTON(dev_priv)) {
2840 dev_priv->max_cdclk_freq = 624000;
2841 } else if (DISPLAY_VER(dev_priv) == 9) {
2842 u32 limit = intel_de_read(dev_priv, SKL_DFSM) & SKL_DFSM_CDCLK_LIMIT_MASK;
2843 int max_cdclk, vco;
2844
2845 vco = dev_priv->skl_preferred_vco_freq;
2846 drm_WARN_ON(&dev_priv->drm, vco != 8100000 && vco != 8640000);
2847
2848
2849
2850
2851
2852
2853 if (limit == SKL_DFSM_CDCLK_LIMIT_675)
2854 max_cdclk = 617143;
2855 else if (limit == SKL_DFSM_CDCLK_LIMIT_540)
2856 max_cdclk = 540000;
2857 else if (limit == SKL_DFSM_CDCLK_LIMIT_450)
2858 max_cdclk = 432000;
2859 else
2860 max_cdclk = 308571;
2861
2862 dev_priv->max_cdclk_freq = skl_calc_cdclk(max_cdclk, vco);
2863 } else if (IS_BROADWELL(dev_priv)) {
2864
2865
2866
2867
2868
2869
2870 if (intel_de_read(dev_priv, FUSE_STRAP) & HSW_CDCLK_LIMIT)
2871 dev_priv->max_cdclk_freq = 450000;
2872 else if (IS_BDW_ULX(dev_priv))
2873 dev_priv->max_cdclk_freq = 450000;
2874 else if (IS_BDW_ULT(dev_priv))
2875 dev_priv->max_cdclk_freq = 540000;
2876 else
2877 dev_priv->max_cdclk_freq = 675000;
2878 } else if (IS_CHERRYVIEW(dev_priv)) {
2879 dev_priv->max_cdclk_freq = 320000;
2880 } else if (IS_VALLEYVIEW(dev_priv)) {
2881 dev_priv->max_cdclk_freq = 400000;
2882 } else {
2883
2884 dev_priv->max_cdclk_freq = dev_priv->cdclk.hw.cdclk;
2885 }
2886
2887 dev_priv->max_dotclk_freq = intel_compute_max_dotclk(dev_priv);
2888
2889 drm_dbg(&dev_priv->drm, "Max CD clock rate: %d kHz\n",
2890 dev_priv->max_cdclk_freq);
2891
2892 drm_dbg(&dev_priv->drm, "Max dotclock rate: %d kHz\n",
2893 dev_priv->max_dotclk_freq);
2894 }
2895
2896
2897
2898
2899
2900
2901
2902 void intel_update_cdclk(struct drm_i915_private *dev_priv)
2903 {
2904 intel_cdclk_get_cdclk(dev_priv, &dev_priv->cdclk.hw);
2905
2906
2907
2908
2909
2910
2911
2912 if (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv))
2913 intel_de_write(dev_priv, GMBUSFREQ_VLV,
2914 DIV_ROUND_UP(dev_priv->cdclk.hw.cdclk, 1000));
2915 }
2916
2917 static int dg1_rawclk(struct drm_i915_private *dev_priv)
2918 {
2919
2920
2921
2922
2923 intel_de_write(dev_priv, PCH_RAWCLK_FREQ,
2924 CNP_RAWCLK_DEN(4) | CNP_RAWCLK_DIV(37) | ICP_RAWCLK_NUM(2));
2925
2926 return 38400;
2927 }
2928
2929 static int cnp_rawclk(struct drm_i915_private *dev_priv)
2930 {
2931 u32 rawclk;
2932 int divider, fraction;
2933
2934 if (intel_de_read(dev_priv, SFUSE_STRAP) & SFUSE_STRAP_RAW_FREQUENCY) {
2935
2936 divider = 24000;
2937 fraction = 0;
2938 } else {
2939
2940 divider = 19000;
2941 fraction = 200;
2942 }
2943
2944 rawclk = CNP_RAWCLK_DIV(divider / 1000);
2945 if (fraction) {
2946 int numerator = 1;
2947
2948 rawclk |= CNP_RAWCLK_DEN(DIV_ROUND_CLOSEST(numerator * 1000,
2949 fraction) - 1);
2950 if (INTEL_PCH_TYPE(dev_priv) >= PCH_ICP)
2951 rawclk |= ICP_RAWCLK_NUM(numerator);
2952 }
2953
2954 intel_de_write(dev_priv, PCH_RAWCLK_FREQ, rawclk);
2955 return divider + fraction;
2956 }
2957
2958 static int pch_rawclk(struct drm_i915_private *dev_priv)
2959 {
2960 return (intel_de_read(dev_priv, PCH_RAWCLK_FREQ) & RAWCLK_FREQ_MASK) * 1000;
2961 }
2962
2963 static int vlv_hrawclk(struct drm_i915_private *dev_priv)
2964 {
2965
2966 return vlv_get_cck_clock_hpll(dev_priv, "hrawclk",
2967 CCK_DISPLAY_REF_CLOCK_CONTROL);
2968 }
2969
2970 static int i9xx_hrawclk(struct drm_i915_private *dev_priv)
2971 {
2972 u32 clkcfg;
2973
2974
2975
2976
2977
2978
2979
2980
2981
2982
2983
2984 clkcfg = intel_de_read(dev_priv, CLKCFG) & CLKCFG_FSB_MASK;
2985
2986 if (IS_MOBILE(dev_priv)) {
2987 switch (clkcfg) {
2988 case CLKCFG_FSB_400:
2989 return 100000;
2990 case CLKCFG_FSB_533:
2991 return 133333;
2992 case CLKCFG_FSB_667:
2993 return 166667;
2994 case CLKCFG_FSB_800:
2995 return 200000;
2996 case CLKCFG_FSB_1067:
2997 return 266667;
2998 case CLKCFG_FSB_1333:
2999 return 333333;
3000 default:
3001 MISSING_CASE(clkcfg);
3002 return 133333;
3003 }
3004 } else {
3005 switch (clkcfg) {
3006 case CLKCFG_FSB_400_ALT:
3007 return 100000;
3008 case CLKCFG_FSB_533:
3009 return 133333;
3010 case CLKCFG_FSB_667:
3011 return 166667;
3012 case CLKCFG_FSB_800:
3013 return 200000;
3014 case CLKCFG_FSB_1067_ALT:
3015 return 266667;
3016 case CLKCFG_FSB_1333_ALT:
3017 return 333333;
3018 case CLKCFG_FSB_1600_ALT:
3019 return 400000;
3020 default:
3021 return 133333;
3022 }
3023 }
3024 }
3025
3026
3027
3028
3029
3030
3031
3032
3033 u32 intel_read_rawclk(struct drm_i915_private *dev_priv)
3034 {
3035 u32 freq;
3036
3037 if (INTEL_PCH_TYPE(dev_priv) >= PCH_DG1)
3038 freq = dg1_rawclk(dev_priv);
3039 else if (INTEL_PCH_TYPE(dev_priv) >= PCH_CNP)
3040 freq = cnp_rawclk(dev_priv);
3041 else if (HAS_PCH_SPLIT(dev_priv))
3042 freq = pch_rawclk(dev_priv);
3043 else if (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv))
3044 freq = vlv_hrawclk(dev_priv);
3045 else if (DISPLAY_VER(dev_priv) >= 3)
3046 freq = i9xx_hrawclk(dev_priv);
3047 else
3048
3049 return 0;
3050
3051 return freq;
3052 }
3053
3054 static const struct intel_cdclk_funcs tgl_cdclk_funcs = {
3055 .get_cdclk = bxt_get_cdclk,
3056 .set_cdclk = bxt_set_cdclk,
3057 .modeset_calc_cdclk = bxt_modeset_calc_cdclk,
3058 .calc_voltage_level = tgl_calc_voltage_level,
3059 };
3060
3061 static const struct intel_cdclk_funcs ehl_cdclk_funcs = {
3062 .get_cdclk = bxt_get_cdclk,
3063 .set_cdclk = bxt_set_cdclk,
3064 .modeset_calc_cdclk = bxt_modeset_calc_cdclk,
3065 .calc_voltage_level = ehl_calc_voltage_level,
3066 };
3067
3068 static const struct intel_cdclk_funcs icl_cdclk_funcs = {
3069 .get_cdclk = bxt_get_cdclk,
3070 .set_cdclk = bxt_set_cdclk,
3071 .modeset_calc_cdclk = bxt_modeset_calc_cdclk,
3072 .calc_voltage_level = icl_calc_voltage_level,
3073 };
3074
3075 static const struct intel_cdclk_funcs bxt_cdclk_funcs = {
3076 .get_cdclk = bxt_get_cdclk,
3077 .set_cdclk = bxt_set_cdclk,
3078 .modeset_calc_cdclk = bxt_modeset_calc_cdclk,
3079 .calc_voltage_level = bxt_calc_voltage_level,
3080 };
3081
3082 static const struct intel_cdclk_funcs skl_cdclk_funcs = {
3083 .get_cdclk = skl_get_cdclk,
3084 .set_cdclk = skl_set_cdclk,
3085 .modeset_calc_cdclk = skl_modeset_calc_cdclk,
3086 };
3087
3088 static const struct intel_cdclk_funcs bdw_cdclk_funcs = {
3089 .get_cdclk = bdw_get_cdclk,
3090 .set_cdclk = bdw_set_cdclk,
3091 .modeset_calc_cdclk = bdw_modeset_calc_cdclk,
3092 };
3093
3094 static const struct intel_cdclk_funcs chv_cdclk_funcs = {
3095 .get_cdclk = vlv_get_cdclk,
3096 .set_cdclk = chv_set_cdclk,
3097 .modeset_calc_cdclk = vlv_modeset_calc_cdclk,
3098 };
3099
3100 static const struct intel_cdclk_funcs vlv_cdclk_funcs = {
3101 .get_cdclk = vlv_get_cdclk,
3102 .set_cdclk = vlv_set_cdclk,
3103 .modeset_calc_cdclk = vlv_modeset_calc_cdclk,
3104 };
3105
3106 static const struct intel_cdclk_funcs hsw_cdclk_funcs = {
3107 .get_cdclk = hsw_get_cdclk,
3108 .modeset_calc_cdclk = fixed_modeset_calc_cdclk,
3109 };
3110
3111
3112 static const struct intel_cdclk_funcs fixed_400mhz_cdclk_funcs = {
3113 .get_cdclk = fixed_400mhz_get_cdclk,
3114 .modeset_calc_cdclk = fixed_modeset_calc_cdclk,
3115 };
3116
3117 static const struct intel_cdclk_funcs ilk_cdclk_funcs = {
3118 .get_cdclk = fixed_450mhz_get_cdclk,
3119 .modeset_calc_cdclk = fixed_modeset_calc_cdclk,
3120 };
3121
3122 static const struct intel_cdclk_funcs gm45_cdclk_funcs = {
3123 .get_cdclk = gm45_get_cdclk,
3124 .modeset_calc_cdclk = fixed_modeset_calc_cdclk,
3125 };
3126
3127
3128
3129 static const struct intel_cdclk_funcs i965gm_cdclk_funcs = {
3130 .get_cdclk = i965gm_get_cdclk,
3131 .modeset_calc_cdclk = fixed_modeset_calc_cdclk,
3132 };
3133
3134
3135
3136 static const struct intel_cdclk_funcs pnv_cdclk_funcs = {
3137 .get_cdclk = pnv_get_cdclk,
3138 .modeset_calc_cdclk = fixed_modeset_calc_cdclk,
3139 };
3140
3141 static const struct intel_cdclk_funcs g33_cdclk_funcs = {
3142 .get_cdclk = g33_get_cdclk,
3143 .modeset_calc_cdclk = fixed_modeset_calc_cdclk,
3144 };
3145
3146 static const struct intel_cdclk_funcs i945gm_cdclk_funcs = {
3147 .get_cdclk = i945gm_get_cdclk,
3148 .modeset_calc_cdclk = fixed_modeset_calc_cdclk,
3149 };
3150
3151
3152
3153 static const struct intel_cdclk_funcs i915gm_cdclk_funcs = {
3154 .get_cdclk = i915gm_get_cdclk,
3155 .modeset_calc_cdclk = fixed_modeset_calc_cdclk,
3156 };
3157
3158 static const struct intel_cdclk_funcs i915g_cdclk_funcs = {
3159 .get_cdclk = fixed_333mhz_get_cdclk,
3160 .modeset_calc_cdclk = fixed_modeset_calc_cdclk,
3161 };
3162
3163 static const struct intel_cdclk_funcs i865g_cdclk_funcs = {
3164 .get_cdclk = fixed_266mhz_get_cdclk,
3165 .modeset_calc_cdclk = fixed_modeset_calc_cdclk,
3166 };
3167
3168 static const struct intel_cdclk_funcs i85x_cdclk_funcs = {
3169 .get_cdclk = i85x_get_cdclk,
3170 .modeset_calc_cdclk = fixed_modeset_calc_cdclk,
3171 };
3172
3173 static const struct intel_cdclk_funcs i845g_cdclk_funcs = {
3174 .get_cdclk = fixed_200mhz_get_cdclk,
3175 .modeset_calc_cdclk = fixed_modeset_calc_cdclk,
3176 };
3177
3178 static const struct intel_cdclk_funcs i830_cdclk_funcs = {
3179 .get_cdclk = fixed_133mhz_get_cdclk,
3180 .modeset_calc_cdclk = fixed_modeset_calc_cdclk,
3181 };
3182
3183
3184
3185
3186
3187 void intel_init_cdclk_hooks(struct drm_i915_private *dev_priv)
3188 {
3189 if (IS_DG2(dev_priv)) {
3190 dev_priv->cdclk_funcs = &tgl_cdclk_funcs;
3191 dev_priv->cdclk.table = dg2_cdclk_table;
3192 } else if (IS_ALDERLAKE_P(dev_priv)) {
3193 dev_priv->cdclk_funcs = &tgl_cdclk_funcs;
3194
3195 if (IS_ADLP_DISPLAY_STEP(dev_priv, STEP_A0, STEP_B0))
3196 dev_priv->cdclk.table = adlp_a_step_cdclk_table;
3197 else
3198 dev_priv->cdclk.table = adlp_cdclk_table;
3199 } else if (IS_ROCKETLAKE(dev_priv)) {
3200 dev_priv->cdclk_funcs = &tgl_cdclk_funcs;
3201 dev_priv->cdclk.table = rkl_cdclk_table;
3202 } else if (DISPLAY_VER(dev_priv) >= 12) {
3203 dev_priv->cdclk_funcs = &tgl_cdclk_funcs;
3204 dev_priv->cdclk.table = icl_cdclk_table;
3205 } else if (IS_JSL_EHL(dev_priv)) {
3206 dev_priv->cdclk_funcs = &ehl_cdclk_funcs;
3207 dev_priv->cdclk.table = icl_cdclk_table;
3208 } else if (DISPLAY_VER(dev_priv) >= 11) {
3209 dev_priv->cdclk_funcs = &icl_cdclk_funcs;
3210 dev_priv->cdclk.table = icl_cdclk_table;
3211 } else if (IS_GEMINILAKE(dev_priv) || IS_BROXTON(dev_priv)) {
3212 dev_priv->cdclk_funcs = &bxt_cdclk_funcs;
3213 if (IS_GEMINILAKE(dev_priv))
3214 dev_priv->cdclk.table = glk_cdclk_table;
3215 else
3216 dev_priv->cdclk.table = bxt_cdclk_table;
3217 } else if (DISPLAY_VER(dev_priv) == 9) {
3218 dev_priv->cdclk_funcs = &skl_cdclk_funcs;
3219 } else if (IS_BROADWELL(dev_priv)) {
3220 dev_priv->cdclk_funcs = &bdw_cdclk_funcs;
3221 } else if (IS_HASWELL(dev_priv)) {
3222 dev_priv->cdclk_funcs = &hsw_cdclk_funcs;
3223 } else if (IS_CHERRYVIEW(dev_priv)) {
3224 dev_priv->cdclk_funcs = &chv_cdclk_funcs;
3225 } else if (IS_VALLEYVIEW(dev_priv)) {
3226 dev_priv->cdclk_funcs = &vlv_cdclk_funcs;
3227 } else if (IS_SANDYBRIDGE(dev_priv) || IS_IVYBRIDGE(dev_priv)) {
3228 dev_priv->cdclk_funcs = &fixed_400mhz_cdclk_funcs;
3229 } else if (IS_IRONLAKE(dev_priv)) {
3230 dev_priv->cdclk_funcs = &ilk_cdclk_funcs;
3231 } else if (IS_GM45(dev_priv)) {
3232 dev_priv->cdclk_funcs = &gm45_cdclk_funcs;
3233 } else if (IS_G45(dev_priv)) {
3234 dev_priv->cdclk_funcs = &g33_cdclk_funcs;
3235 } else if (IS_I965GM(dev_priv)) {
3236 dev_priv->cdclk_funcs = &i965gm_cdclk_funcs;
3237 } else if (IS_I965G(dev_priv)) {
3238 dev_priv->cdclk_funcs = &fixed_400mhz_cdclk_funcs;
3239 } else if (IS_PINEVIEW(dev_priv)) {
3240 dev_priv->cdclk_funcs = &pnv_cdclk_funcs;
3241 } else if (IS_G33(dev_priv)) {
3242 dev_priv->cdclk_funcs = &g33_cdclk_funcs;
3243 } else if (IS_I945GM(dev_priv)) {
3244 dev_priv->cdclk_funcs = &i945gm_cdclk_funcs;
3245 } else if (IS_I945G(dev_priv)) {
3246 dev_priv->cdclk_funcs = &fixed_400mhz_cdclk_funcs;
3247 } else if (IS_I915GM(dev_priv)) {
3248 dev_priv->cdclk_funcs = &i915gm_cdclk_funcs;
3249 } else if (IS_I915G(dev_priv)) {
3250 dev_priv->cdclk_funcs = &i915g_cdclk_funcs;
3251 } else if (IS_I865G(dev_priv)) {
3252 dev_priv->cdclk_funcs = &i865g_cdclk_funcs;
3253 } else if (IS_I85X(dev_priv)) {
3254 dev_priv->cdclk_funcs = &i85x_cdclk_funcs;
3255 } else if (IS_I845G(dev_priv)) {
3256 dev_priv->cdclk_funcs = &i845g_cdclk_funcs;
3257 } else if (IS_I830(dev_priv)) {
3258 dev_priv->cdclk_funcs = &i830_cdclk_funcs;
3259 }
3260
3261 if (drm_WARN(&dev_priv->drm, !dev_priv->cdclk_funcs,
3262 "Unknown platform. Assuming i830\n"))
3263 dev_priv->cdclk_funcs = &i830_cdclk_funcs;
3264 }