Back to home page

OSCL-LXR

 
 

    


0001 /*
0002  * Copyright © 2006-2017 Intel Corporation
0003  *
0004  * Permission is hereby granted, free of charge, to any person obtaining a
0005  * copy of this software and associated documentation files (the "Software"),
0006  * to deal in the Software without restriction, including without limitation
0007  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
0008  * and/or sell copies of the Software, and to permit persons to whom the
0009  * Software is furnished to do so, subject to the following conditions:
0010  *
0011  * The above copyright notice and this permission notice (including the next
0012  * paragraph) shall be included in all copies or substantial portions of the
0013  * Software.
0014  *
0015  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
0016  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
0017  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
0018  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
0019  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
0020  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
0021  * DEALINGS IN THE SOFTWARE.
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  * DOC: CDCLK / RAWCLK
0043  *
0044  * The display engine uses several different clocks to do its work. There
0045  * are two main clocks involved that aren't directly related to the actual
0046  * pixel clock or any symbol/bit clock of the actual output port. These
0047  * are the core display clock (CDCLK) and RAWCLK.
0048  *
0049  * CDCLK clocks most of the display pipe logic, and thus its frequency
0050  * must be high enough to support the rate at which pixels are flowing
0051  * through the pipes. Downscaling must also be accounted as that increases
0052  * the effective pixel rate.
0053  *
0054  * On several platforms the CDCLK frequency can be changed dynamically
0055  * to minimize power consumption for a given display configuration.
0056  * Typically changes to the CDCLK frequency require all the display pipes
0057  * to be shut down while the frequency is being changed.
0058  *
0059  * On SKL+ the DMC will toggle the CDCLK off/on during DC5/6 entry/exit.
0060  * DMC will not change the active CDCLK frequency however, so that part
0061  * will still be performed by the driver directly.
0062  *
0063  * RAWCLK is a fixed frequency clock, often used by various auxiliary
0064  * blocks such as AUX CH or backlight PWM. Hence the only thing we
0065  * really need to know about RAWCLK is its frequency so that various
0066  * dividers can be programmed correctly.
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      * 852GM/852GMV only supports 133 MHz and the HPLLCC
0148      * encoding is different :(
0149      * FIXME is this the right way to detect 852GM/852GMV?
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     /* Assume that the hardware is in the high speed state.  This
0160      * should be the default.
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     /* FIXME other chipsets? */
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      * We seem to get an unstable or solid color picture at 200MHz.
0484      * Not sure what's wrong. For now use 200MHz only when all pipes
0485      * are off.
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) /* jump to highest voltage for 400MHz too */
0501             return 2;
0502         else if (cdclk >= 266667)
0503             return 1;
0504         else
0505             return 0;
0506     } else {
0507         /*
0508          * Specs are full of misinformation, but testing on actual
0509          * hardware has shown that we just need to write the desired
0510          * CCK divider into the Punit register.
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         /* CHV suggested value is 31 or 63 */
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      * WA - write default credits before re-programming
0563      * FIXME: should we also set the resend bit here?
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      * FIXME is this guaranteed to clear
0573      * immediately or should we poll for it?
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     /* There are cases where we can end up here with power domains
0600      * off and a CDCLK frequency other than the minimum, like when
0601      * issuing a modeset without actually changing any display after
0602      * a system suspend.  So grab the display core domain, which covers
0603      * the HW blocks needed for the following programming.
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         /* adjust cdclk divider */
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     /* adjust self-refresh exit latency value */
0643     val = vlv_bunit_read(dev_priv, BUNIT_REG_BISOC);
0644     val &= ~0x7f;
0645 
0646     /*
0647      * For high bandwidth configs, we set a higher latency in the bunit
0648      * so that the core display fetch happens in time to avoid underruns.
0649      */
0650     if (cdclk == 400000)
0651         val |= 4500 / 250; /* 4.5 usec */
0652     else
0653         val |= 3000 / 250; /* 3.0 usec */
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     /* There are cases where we can end up here with power domains
0688      * off and a CDCLK frequency other than the minimum, like when
0689      * issuing a modeset without actually changing any display after
0690      * a system suspend.  So grab the display core domain, which covers
0691      * the HW blocks needed for the following programming.
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      * Can't read this out :( Let's assume it's
0764      * at least what the CDCLK frequency requires.
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      * According to the spec, it should be enough to poll for this 1 us.
0815      * However, extensive testing shows that this can take longer.
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      * Can't read this out :( Let's assume it's
0971      * at least what the CDCLK frequency requires.
0972      */
0973     cdclk_config->voltage_level =
0974         skl_calc_voltage_level(cdclk_config->cdclk);
0975 }
0976 
0977 /* convert from kHz to .1 fixpoint MHz with -1MHz offset */
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      * We always enable DPLL0 with the lowest link rate possible, but still
1000      * taking into account the VCO required to operate the eDP panel at the
1001      * desired frequency. The usual DP link rates operate with a VCO of
1002      * 8100 while the eDP 1.4 alternate link rates need a VCO of 8640.
1003      * The modeset code is responsible for the selection of the exact link
1004      * rate later on, with the constraint of choosing a frequency that
1005      * works with vco.
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     /* We'll want to keep using the current vco from now on. */
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      * Based on WA#1183 CDCLK rates 308 and 617MHz CDCLK rates are
1080      * unsupported on SKL. In theory this should never happen since only
1081      * the eDP1.4 2.16 and 4.32Gbps rates require it, but eDP1.4 is not
1082      * supported on SKL either, see the above WA. WARN whenever trying to
1083      * use the corresponding VCO freq as that always leads to using the
1084      * minimum 308MHz CDCLK.
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         /* Wa Display #1183: skl,kbl,cfl */
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     /* Wa Display #1183: skl,kbl,cfl */
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     /* Wa Display #1183: skl,kbl,cfl */
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     /* Wa Display #1183: skl,kbl,cfl */
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     /* inform PCU of the change */
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      * check if the pre-os initialized the display
1147      * There is SWF18 scratchpad register defined which is set by the
1148      * pre-os which can be used by the OS drivers to check the status
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     /* Is PLL enabled and locked ? */
1157     if (dev_priv->cdclk.hw.vco == 0 ||
1158         dev_priv->cdclk.hw.cdclk == dev_priv->cdclk.hw.bypass)
1159         goto sanitize;
1160 
1161     /* DPLL okay; verify the cdclock
1162      *
1163      * Noticed in some instances that the freq selection is correct but
1164      * decimal part is programmed wrong from BIOS where pre-os does not
1165      * enable display. Verify the same as well.
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         /* All well; nothing to sanitize */
1172         return;
1173 
1174 sanitize:
1175     drm_dbg_kms(&dev_priv->drm, "Sanitizing cdclk programmed by pre-os\n");
1176 
1177     /* force cdclk programming */
1178     dev_priv->cdclk.hw.cdclk = 0;
1179     /* force full PLL disable + enable */
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          * Use the current vco as our initial
1193          * guess as to what the preferred vco is.
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; /* CD2X divider * 2 */
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          * CDCLK PLL is disabled, the VCO/ratio doesn't matter, but
1464          * setting it to zero is a way to signal that.
1465          */
1466         cdclk_config->vco = 0;
1467         return;
1468     }
1469 
1470     /*
1471      * DISPLAY_VER >= 11 have the ratio directly in the PLL enable register,
1472      * gen9lp had it in a separate PLL control register.
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      * Can't read this out :( Let's assume it's
1542      * at least what the CDCLK frequency requires.
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     /* Timeout 200us */
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     /* Timeout 200us */
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     /* Timeout 200us */
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     /* Timeout 200us */
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     /* Write PLL ratio without disabling */
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     /* Submit freq change request */
1617     val |= BXT_DE_PLL_FREQ_REQ;
1618     intel_de_write(dev_priv, BXT_DE_PLL_ENABLE, val);
1619 
1620     /* Timeout 200us */
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     /* cdclk = vco / 2 / div{1,1.5,2,4} */
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     /* Inform power controller of upcoming frequency change. */
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          * BSpec requires us to wait up to 150usec, but that leads to
1712          * timeouts; the 2ms used here is based on experiment.
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      * Disable SSA Precharge when CD clock frequency < 500 MHz,
1766      * enable otherwise.
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          * The timeout isn't specified, the 2ms used here is based on
1782          * experiment.
1783          * FIXME: Waiting for the request completion could be delayed
1784          * until the next PCODE request based on BSpec.
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          * Can't read out the voltage level :(
1804          * Let's just assume everything is as expected.
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     /* DPLL okay; verify the cdclock
1822      *
1823      * Some BIOS versions leave an incorrect decimal frequency value and
1824      * set reserved MBZ bits in CDCLK_CTL at least during exiting from S4,
1825      * so sanitize this register.
1826      */
1827     cdctl = intel_de_read(dev_priv, CDCLK_CTL);
1828     /*
1829      * Let's ignore the pipe field, since BIOS could have configured the
1830      * dividers both synching to an active pipe, or asynchronously
1831      * (PIPE_NONE).
1832      */
1833     cdctl &= ~bxt_cdclk_cd2x_pipe(dev_priv, INVALID_PIPE);
1834 
1835     /* Make sure this is a legal cdclk value for the platform */
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     /* Make sure the VCO is correct for the cdclk */
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     /* Figure out what CD2X divider we should be using for this cdclk */
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      * Disable SSA Precharge when CD clock frequency < 500 MHz,
1858      * enable otherwise.
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         /* All well; nothing to sanitize */
1866         return;
1867 
1868 sanitize:
1869     drm_dbg_kms(&dev_priv->drm, "Sanitizing cdclk programmed by pre-os\n");
1870 
1871     /* force cdclk programming */
1872     dev_priv->cdclk.hw.cdclk = 0;
1873 
1874     /* force full PLL disable + enable */
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      * FIXME:
1892      * - The initial CDCLK needs to be read from VBT.
1893      *   Need to make this change after VBT has changes for BXT.
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  * intel_cdclk_init_hw - Initialize CDCLK hardware
1917  * @i915: i915 device
1918  *
1919  * Initialize CDCLK. This consists mainly of initializing dev_priv->cdclk.hw and
1920  * sanitizing the state of the hardware if needed. This is generally done only
1921  * during the display core initialization sequence, after which the DMC will
1922  * take care of turning CDCLK off/on as needed.
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  * intel_cdclk_uninit_hw - Uninitialize CDCLK hardware
1934  * @i915: i915 device
1935  *
1936  * Uninitialize CDCLK. This is done only during the display core
1937  * uninitialization sequence.
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      * The vco and cd2x divider will change independently
1958      * from each, so we disallow cd2x change when crawling.
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      * FIXME should store a bit more state in intel_cdclk_config
1975      * to differentiate squasher vs. cd2x divider properly. For
1976      * the moment all platforms with squasher use a fixed cd2x
1977      * divider.
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  * intel_cdclk_needs_modeset - Determine if changong between the CDCLK
1990  *                             configurations requires a modeset on all pipes
1991  * @a: first CDCLK configuration
1992  * @b: second CDCLK configuration
1993  *
1994  * Returns:
1995  * True if changing between the two CDCLK configurations
1996  * requires all pipes to be off, false if not.
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  * intel_cdclk_can_cd2x_update - Determine if changing between the two CDCLK
2008  *                               configurations requires only a cd2x divider update
2009  * @dev_priv: i915 device
2010  * @a: first CDCLK configuration
2011  * @b: second CDCLK configuration
2012  *
2013  * Returns:
2014  * True if changing between the two CDCLK configurations
2015  * can be done with just a cd2x divider update, false if not.
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     /* Older hw doesn't have the capability */
2022     if (DISPLAY_VER(dev_priv) < 10 && !IS_BROXTON(dev_priv))
2023         return false;
2024 
2025     /*
2026      * FIXME should store a bit more state in intel_cdclk_config
2027      * to differentiate squasher vs. cd2x divider properly. For
2028      * the moment all platforms with squasher use a fixed cd2x
2029      * divider.
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  * intel_cdclk_changed - Determine if two CDCLK configurations are different
2042  * @a: first CDCLK configuration
2043  * @b: second CDCLK configuration
2044  *
2045  * Returns:
2046  * True if the CDCLK configurations don't match, false if they do.
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  * intel_set_cdclk - Push the CDCLK configuration to the hardware
2067  * @dev_priv: i915 device
2068  * @cdclk_config: new CDCLK configuration
2069  * @pipe: pipe with which to synchronize the update
2070  *
2071  * Program the hardware based on the passed in CDCLK state,
2072  * if necessary.
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      * Lock aux/gmbus while we change cdclk in case those
2098      * functions use cdclk. Not all platforms/ports do,
2099      * but we'll lock them all for simplicity.
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  * intel_set_cdclk_pre_plane_update - Push the CDCLK state to the hardware
2136  * @state: intel atomic state
2137  *
2138  * Program the hardware before updating the HW plane state based on the
2139  * new CDCLK state, if necessary.
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  * intel_set_cdclk_post_plane_update - Push the CDCLK state to the hardware
2165  * @state: intel atomic state
2166  *
2167  * Program the hardware after updating the HW plane state based on the
2168  * new CDCLK state, if necessary.
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     /* pixel rate mustn't exceed 95% of cdclk with IPS on BDW */
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     /* BSpec says "Do not use DisplayPort with CDCLK less than 432 MHz,
2239      * audio enabled, port width x4, and link rate HBR2 (5.4 GHz), or else
2240      * there may be audio corruption or screen corruption." This cdclk
2241      * restriction for GLK is 316.8 MHz.
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             /* Display WA #1145: glk */
2249             min_cdclk = max(316800, min_cdclk);
2250         } else if (DISPLAY_VER(dev_priv) == 9 || IS_BROADWELL(dev_priv)) {
2251             /* Display WA #1144: skl,bxt */
2252             min_cdclk = max(432000, min_cdclk);
2253         }
2254     }
2255 
2256     /*
2257      * According to BSpec, "The CD clock frequency must be at least twice
2258      * the frequency of the Azalia BCLK." and BCLK is 96 MHz by default.
2259      */
2260     if (crtc_state->has_audio && DISPLAY_VER(dev_priv) >= 9)
2261         min_cdclk = max(2 * 96000, min_cdclk);
2262 
2263     /*
2264      * "For DP audio configuration, cdclk frequency shall be set to
2265      *  meet the following requirements:
2266      *  DP Link Frequency(MHz) | Cdclk frequency(MHz)
2267      *  270                    | 320 or higher
2268      *  162                    | 200 or higher"
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      * On Valleyview some DSI panels lose (v|h)sync when the clock is lower
2276      * than 320000KHz.
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      * On Geminilake once the CDCLK gets as low as 79200
2284      * picture gets unstable, despite that values are
2285      * correct for DSI PLL and DE PLL.
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     /* Account for additional needs from the planes */
2292     min_cdclk = max(intel_planes_min_cdclk(crtc_state), min_cdclk);
2293 
2294     /*
2295      * When we decide to use only one VDSC engine, since
2296      * each VDSC operates with 1 ppc throughput, pixel clock
2297      * cannot be higher than the VDSC clock (cdclk)
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      * HACK. Currently for TGL platforms we calculate
2304      * min_cdclk initially based on pixel_rate divided
2305      * by 2, accounting for also plane requirements,
2306      * however in some cases the lowest possible CDCLK
2307      * doesn't work and causing the underruns.
2308      * Explicitly stating here that this seems to be currently
2309      * rather a Hack, than final solution.
2310      */
2311     if (IS_TIGERLAKE(dev_priv)) {
2312         /*
2313          * Clamp to max_cdclk_freq in case pixel rate is higher,
2314          * in order not to break an 8K, but still leave W/A at place.
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  * Account for port clock min voltage level requirements.
2383  * This only really does something on DISPLA_VER >= 11 but can be
2384  * called on earlier platforms as well.
2385  *
2386  * Note that this functions assumes that 0 is
2387  * the lowest voltage value, and higher values
2388  * correspond to increasingly higher voltages.
2389  *
2390  * Should that relationship no longer hold on
2391  * future platforms this code will need to be
2392  * adjusted.
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      * FIXME should also account for plane ratio
2469      * once 64bpp pixel formats are supported.
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          * DPLL0 VCO may need to be adjusted to get the correct
2511          * clock for eDP. This will affect cdclk as well.
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      * FIXME should also account for plane ratio
2539      * once 64bpp pixel formats are supported.
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      * We can't change the cdclk frequency, but we still want to
2606      * check that the required minimum frequency doesn't exceed
2607      * the actual cdclk frequency.
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      * active_planes bitmask has been updated, and potentially affected
2665      * planes are part of the state. We can now compute the minimum cdclk
2666      * for each plane.
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          * Also serialize commits across all crtcs
2727          * if the actual hw needs to be poked.
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         /* All pipes must be switched off while we change the cdclk. */
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  * intel_update_max_cdclk - Determine the maximum support CDCLK frequency
2819  * @dev_priv: i915 device
2820  *
2821  * Determine the maximum CDCLK frequency the platform supports, and also
2822  * derive the maximum dot clock frequency the maximum CDCLK frequency
2823  * allows.
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          * Use the lower (vco 8640) cdclk values as a
2850          * first guess. skl_calc_cdclk() will correct it
2851          * if the preferred vco is 8100 instead.
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          * FIXME with extra cooling we can allow
2866          * 540 MHz for ULX and 675 Mhz for ULT.
2867          * How can we know if extra cooling is
2868          * available? PCI ID, VTB, something else?
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         /* otherwise assume cdclk is fixed */
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  * intel_update_cdclk - Determine the current CDCLK frequency
2898  * @dev_priv: i915 device
2899  *
2900  * Determine the current CDCLK frequency.
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      * 9:0 CMBUS [sic] CDCLK frequency (cdfreq):
2908      * Programmng [sic] note: bit[9:2] should be programmed to the number
2909      * of cdclk that generates 4MHz reference clock freq which is used to
2910      * generate GMBus clock. This will vary with the cdclk freq.
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      * DG1 always uses a 38.4 MHz rawclk.  The bspec tells us
2921      * "Program Numerator=2, Denominator=4, Divider=37 decimal."
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         /* 24 MHz */
2936         divider = 24000;
2937         fraction = 0;
2938     } else {
2939         /* 19.2 MHz */
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     /* RAWCLK_FREQ_VLV register updated from power well code */
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      * hrawclock is 1/4 the FSB frequency
2976      *
2977      * Note that this only reads the state of the FSB
2978      * straps, not the actual FSB frequency. Some BIOSen
2979      * let you configure each independently. Ideally we'd
2980      * read out the actual FSB frequency but sadly we
2981      * don't know which registers have that information,
2982      * and all the relevant docs have gone to bit heaven :(
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  * intel_read_rawclk - Determine the current RAWCLK frequency
3028  * @dev_priv: i915 device
3029  *
3030  * Determine the current RAWCLK frequency. RAWCLK is a fixed
3031  * frequency clock so this needs to done only once.
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         /* no rawclk on other platforms, or no need to know it */
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 /* SNB, IVB, 965G, 945G */
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 /* G45 uses G33 */
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 /* i965G uses fixed 400 */
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 /* i945G uses fixed 400 */
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  * intel_init_cdclk_hooks - Initialize CDCLK related modesetting hooks
3185  * @dev_priv: i915 device
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         /* Wa_22011320316:adl-p[a0] */
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 }