linux/drivers/gpu/drm/i915/intel_dpll_mgr.c
<<
>>
Prefs
   1/*
   2 * Copyright © 2006-2016 Intel Corporation
   3 *
   4 * Permission is hereby granted, free of charge, to any person obtaining a
   5 * copy of this software and associated documentation files (the "Software"),
   6 * to deal in the Software without restriction, including without limitation
   7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
   8 * and/or sell copies of the Software, and to permit persons to whom the
   9 * Software is furnished to do so, subject to the following conditions:
  10 *
  11 * The above copyright notice and this permission notice (including the next
  12 * paragraph) shall be included in all copies or substantial portions of the
  13 * Software.
  14 *
  15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  16 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  17 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
  18 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  19 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
  20 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
  21 * DEALINGS IN THE SOFTWARE.
  22 */
  23
  24#include "intel_drv.h"
  25
  26/**
  27 * DOC: Display PLLs
  28 *
  29 * Display PLLs used for driving outputs vary by platform. While some have
  30 * per-pipe or per-encoder dedicated PLLs, others allow the use of any PLL
  31 * from a pool. In the latter scenario, it is possible that multiple pipes
  32 * share a PLL if their configurations match.
  33 *
  34 * This file provides an abstraction over display PLLs. The function
  35 * intel_shared_dpll_init() initializes the PLLs for the given platform.  The
  36 * users of a PLL are tracked and that tracking is integrated with the atomic
  37 * modest interface. During an atomic operation, a PLL can be requested for a
  38 * given CRTC and encoder configuration by calling intel_get_shared_dpll() and
  39 * a previously used PLL can be released with intel_release_shared_dpll().
  40 * Changes to the users are first staged in the atomic state, and then made
  41 * effective by calling intel_shared_dpll_swap_state() during the atomic
  42 * commit phase.
  43 */
  44
  45static void
  46intel_atomic_duplicate_dpll_state(struct drm_i915_private *dev_priv,
  47                                  struct intel_shared_dpll_state *shared_dpll)
  48{
  49        enum intel_dpll_id i;
  50
  51        /* Copy shared dpll state */
  52        for (i = 0; i < dev_priv->num_shared_dpll; i++) {
  53                struct intel_shared_dpll *pll = &dev_priv->shared_dplls[i];
  54
  55                shared_dpll[i] = pll->state;
  56        }
  57}
  58
  59static struct intel_shared_dpll_state *
  60intel_atomic_get_shared_dpll_state(struct drm_atomic_state *s)
  61{
  62        struct intel_atomic_state *state = to_intel_atomic_state(s);
  63
  64        WARN_ON(!drm_modeset_is_locked(&s->dev->mode_config.connection_mutex));
  65
  66        if (!state->dpll_set) {
  67                state->dpll_set = true;
  68
  69                intel_atomic_duplicate_dpll_state(to_i915(s->dev),
  70                                                  state->shared_dpll);
  71        }
  72
  73        return state->shared_dpll;
  74}
  75
  76/**
  77 * intel_get_shared_dpll_by_id - get a DPLL given its id
  78 * @dev_priv: i915 device instance
  79 * @id: pll id
  80 *
  81 * Returns:
  82 * A pointer to the DPLL with @id
  83 */
  84struct intel_shared_dpll *
  85intel_get_shared_dpll_by_id(struct drm_i915_private *dev_priv,
  86                            enum intel_dpll_id id)
  87{
  88        return &dev_priv->shared_dplls[id];
  89}
  90
  91/**
  92 * intel_get_shared_dpll_id - get the id of a DPLL
  93 * @dev_priv: i915 device instance
  94 * @pll: the DPLL
  95 *
  96 * Returns:
  97 * The id of @pll
  98 */
  99enum intel_dpll_id
 100intel_get_shared_dpll_id(struct drm_i915_private *dev_priv,
 101                         struct intel_shared_dpll *pll)
 102{
 103        if (WARN_ON(pll < dev_priv->shared_dplls||
 104                    pll > &dev_priv->shared_dplls[dev_priv->num_shared_dpll]))
 105                return -1;
 106
 107        return (enum intel_dpll_id) (pll - dev_priv->shared_dplls);
 108}
 109
 110/* For ILK+ */
 111void assert_shared_dpll(struct drm_i915_private *dev_priv,
 112                        struct intel_shared_dpll *pll,
 113                        bool state)
 114{
 115        bool cur_state;
 116        struct intel_dpll_hw_state hw_state;
 117
 118        if (WARN(!pll, "asserting DPLL %s with no DPLL\n", onoff(state)))
 119                return;
 120
 121        cur_state = pll->funcs.get_hw_state(dev_priv, pll, &hw_state);
 122        I915_STATE_WARN(cur_state != state,
 123             "%s assertion failure (expected %s, current %s)\n",
 124                        pll->name, onoff(state), onoff(cur_state));
 125}
 126
 127/**
 128 * intel_prepare_shared_dpll - call a dpll's prepare hook
 129 * @crtc: CRTC which has a shared dpll
 130 *
 131 * This calls the PLL's prepare hook if it has one and if the PLL is not
 132 * already enabled. The prepare hook is platform specific.
 133 */
 134void intel_prepare_shared_dpll(struct intel_crtc *crtc)
 135{
 136        struct drm_device *dev = crtc->base.dev;
 137        struct drm_i915_private *dev_priv = to_i915(dev);
 138        struct intel_shared_dpll *pll = crtc->config->shared_dpll;
 139
 140        if (WARN_ON(pll == NULL))
 141                return;
 142
 143        mutex_lock(&dev_priv->dpll_lock);
 144        WARN_ON(!pll->state.crtc_mask);
 145        if (!pll->active_mask) {
 146                DRM_DEBUG_DRIVER("setting up %s\n", pll->name);
 147                WARN_ON(pll->on);
 148                assert_shared_dpll_disabled(dev_priv, pll);
 149
 150                pll->funcs.prepare(dev_priv, pll);
 151        }
 152        mutex_unlock(&dev_priv->dpll_lock);
 153}
 154
 155/**
 156 * intel_enable_shared_dpll - enable a CRTC's shared DPLL
 157 * @crtc: CRTC which has a shared DPLL
 158 *
 159 * Enable the shared DPLL used by @crtc.
 160 */
 161void intel_enable_shared_dpll(struct intel_crtc *crtc)
 162{
 163        struct drm_device *dev = crtc->base.dev;
 164        struct drm_i915_private *dev_priv = to_i915(dev);
 165        struct intel_shared_dpll *pll = crtc->config->shared_dpll;
 166        unsigned crtc_mask = 1 << drm_crtc_index(&crtc->base);
 167        unsigned old_mask;
 168
 169        if (WARN_ON(pll == NULL))
 170                return;
 171
 172        mutex_lock(&dev_priv->dpll_lock);
 173        old_mask = pll->active_mask;
 174
 175        if (WARN_ON(!(pll->state.crtc_mask & crtc_mask)) ||
 176            WARN_ON(pll->active_mask & crtc_mask))
 177                goto out;
 178
 179        pll->active_mask |= crtc_mask;
 180
 181        DRM_DEBUG_KMS("enable %s (active %x, on? %d) for crtc %d\n",
 182                      pll->name, pll->active_mask, pll->on,
 183                      crtc->base.base.id);
 184
 185        if (old_mask) {
 186                WARN_ON(!pll->on);
 187                assert_shared_dpll_enabled(dev_priv, pll);
 188                goto out;
 189        }
 190        WARN_ON(pll->on);
 191
 192        DRM_DEBUG_KMS("enabling %s\n", pll->name);
 193        pll->funcs.enable(dev_priv, pll);
 194        pll->on = true;
 195
 196out:
 197        mutex_unlock(&dev_priv->dpll_lock);
 198}
 199
 200/**
 201 * intel_disable_shared_dpll - disable a CRTC's shared DPLL
 202 * @crtc: CRTC which has a shared DPLL
 203 *
 204 * Disable the shared DPLL used by @crtc.
 205 */
 206void intel_disable_shared_dpll(struct intel_crtc *crtc)
 207{
 208        struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
 209        struct intel_shared_dpll *pll = crtc->config->shared_dpll;
 210        unsigned crtc_mask = 1 << drm_crtc_index(&crtc->base);
 211
 212        /* PCH only available on ILK+ */
 213        if (INTEL_GEN(dev_priv) < 5)
 214                return;
 215
 216        if (pll == NULL)
 217                return;
 218
 219        mutex_lock(&dev_priv->dpll_lock);
 220        if (WARN_ON(!(pll->active_mask & crtc_mask)))
 221                goto out;
 222
 223        DRM_DEBUG_KMS("disable %s (active %x, on? %d) for crtc %d\n",
 224                      pll->name, pll->active_mask, pll->on,
 225                      crtc->base.base.id);
 226
 227        assert_shared_dpll_enabled(dev_priv, pll);
 228        WARN_ON(!pll->on);
 229
 230        pll->active_mask &= ~crtc_mask;
 231        if (pll->active_mask)
 232                goto out;
 233
 234        DRM_DEBUG_KMS("disabling %s\n", pll->name);
 235        pll->funcs.disable(dev_priv, pll);
 236        pll->on = false;
 237
 238out:
 239        mutex_unlock(&dev_priv->dpll_lock);
 240}
 241
 242static struct intel_shared_dpll *
 243intel_find_shared_dpll(struct intel_crtc *crtc,
 244                       struct intel_crtc_state *crtc_state,
 245                       enum intel_dpll_id range_min,
 246                       enum intel_dpll_id range_max)
 247{
 248        struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
 249        struct intel_shared_dpll *pll;
 250        struct intel_shared_dpll_state *shared_dpll;
 251        enum intel_dpll_id i;
 252
 253        shared_dpll = intel_atomic_get_shared_dpll_state(crtc_state->base.state);
 254
 255        for (i = range_min; i <= range_max; i++) {
 256                pll = &dev_priv->shared_dplls[i];
 257
 258                /* Only want to check enabled timings first */
 259                if (shared_dpll[i].crtc_mask == 0)
 260                        continue;
 261
 262                if (memcmp(&crtc_state->dpll_hw_state,
 263                           &shared_dpll[i].hw_state,
 264                           sizeof(crtc_state->dpll_hw_state)) == 0) {
 265                        DRM_DEBUG_KMS("[CRTC:%d:%s] sharing existing %s (crtc mask 0x%08x, active %x)\n",
 266                                      crtc->base.base.id, crtc->base.name, pll->name,
 267                                      shared_dpll[i].crtc_mask,
 268                                      pll->active_mask);
 269                        return pll;
 270                }
 271        }
 272
 273        /* Ok no matching timings, maybe there's a free one? */
 274        for (i = range_min; i <= range_max; i++) {
 275                pll = &dev_priv->shared_dplls[i];
 276                if (shared_dpll[i].crtc_mask == 0) {
 277                        DRM_DEBUG_KMS("[CRTC:%d:%s] allocated %s\n",
 278                                      crtc->base.base.id, crtc->base.name, pll->name);
 279                        return pll;
 280                }
 281        }
 282
 283        return NULL;
 284}
 285
 286static void
 287intel_reference_shared_dpll(struct intel_shared_dpll *pll,
 288                            struct intel_crtc_state *crtc_state)
 289{
 290        struct intel_shared_dpll_state *shared_dpll;
 291        struct intel_crtc *crtc = to_intel_crtc(crtc_state->base.crtc);
 292        enum intel_dpll_id i = pll->id;
 293
 294        shared_dpll = intel_atomic_get_shared_dpll_state(crtc_state->base.state);
 295
 296        if (shared_dpll[i].crtc_mask == 0)
 297                shared_dpll[i].hw_state =
 298                        crtc_state->dpll_hw_state;
 299
 300        crtc_state->shared_dpll = pll;
 301        DRM_DEBUG_DRIVER("using %s for pipe %c\n", pll->name,
 302                         pipe_name(crtc->pipe));
 303
 304        shared_dpll[pll->id].crtc_mask |= 1 << crtc->pipe;
 305}
 306
 307/**
 308 * intel_shared_dpll_swap_state - make atomic DPLL configuration effective
 309 * @state: atomic state
 310 *
 311 * This is the dpll version of drm_atomic_helper_swap_state() since the
 312 * helper does not handle driver-specific global state.
 313 *
 314 * For consistency with atomic helpers this function does a complete swap,
 315 * i.e. it also puts the current state into @state, even though there is no
 316 * need for that at this moment.
 317 */
 318void intel_shared_dpll_swap_state(struct drm_atomic_state *state)
 319{
 320        struct drm_i915_private *dev_priv = to_i915(state->dev);
 321        struct intel_shared_dpll_state *shared_dpll;
 322        struct intel_shared_dpll *pll;
 323        enum intel_dpll_id i;
 324
 325        if (!to_intel_atomic_state(state)->dpll_set)
 326                return;
 327
 328        shared_dpll = to_intel_atomic_state(state)->shared_dpll;
 329        for (i = 0; i < dev_priv->num_shared_dpll; i++) {
 330                struct intel_shared_dpll_state tmp;
 331
 332                pll = &dev_priv->shared_dplls[i];
 333
 334                tmp = pll->state;
 335                pll->state = shared_dpll[i];
 336                shared_dpll[i] = tmp;
 337        }
 338}
 339
 340static bool ibx_pch_dpll_get_hw_state(struct drm_i915_private *dev_priv,
 341                                      struct intel_shared_dpll *pll,
 342                                      struct intel_dpll_hw_state *hw_state)
 343{
 344        uint32_t val;
 345
 346        if (!intel_display_power_get_if_enabled(dev_priv, POWER_DOMAIN_PLLS))
 347                return false;
 348
 349        val = I915_READ(PCH_DPLL(pll->id));
 350        hw_state->dpll = val;
 351        hw_state->fp0 = I915_READ(PCH_FP0(pll->id));
 352        hw_state->fp1 = I915_READ(PCH_FP1(pll->id));
 353
 354        intel_display_power_put(dev_priv, POWER_DOMAIN_PLLS);
 355
 356        return val & DPLL_VCO_ENABLE;
 357}
 358
 359static void ibx_pch_dpll_prepare(struct drm_i915_private *dev_priv,
 360                                 struct intel_shared_dpll *pll)
 361{
 362        I915_WRITE(PCH_FP0(pll->id), pll->state.hw_state.fp0);
 363        I915_WRITE(PCH_FP1(pll->id), pll->state.hw_state.fp1);
 364}
 365
 366static void ibx_assert_pch_refclk_enabled(struct drm_i915_private *dev_priv)
 367{
 368        u32 val;
 369        bool enabled;
 370
 371        I915_STATE_WARN_ON(!(HAS_PCH_IBX(dev_priv) || HAS_PCH_CPT(dev_priv)));
 372
 373        val = I915_READ(PCH_DREF_CONTROL);
 374        enabled = !!(val & (DREF_SSC_SOURCE_MASK | DREF_NONSPREAD_SOURCE_MASK |
 375                            DREF_SUPERSPREAD_SOURCE_MASK));
 376        I915_STATE_WARN(!enabled, "PCH refclk assertion failure, should be active but is disabled\n");
 377}
 378
 379static void ibx_pch_dpll_enable(struct drm_i915_private *dev_priv,
 380                                struct intel_shared_dpll *pll)
 381{
 382        /* PCH refclock must be enabled first */
 383        ibx_assert_pch_refclk_enabled(dev_priv);
 384
 385        I915_WRITE(PCH_DPLL(pll->id), pll->state.hw_state.dpll);
 386
 387        /* Wait for the clocks to stabilize. */
 388        POSTING_READ(PCH_DPLL(pll->id));
 389        udelay(150);
 390
 391        /* The pixel multiplier can only be updated once the
 392         * DPLL is enabled and the clocks are stable.
 393         *
 394         * So write it again.
 395         */
 396        I915_WRITE(PCH_DPLL(pll->id), pll->state.hw_state.dpll);
 397        POSTING_READ(PCH_DPLL(pll->id));
 398        udelay(200);
 399}
 400
 401static void ibx_pch_dpll_disable(struct drm_i915_private *dev_priv,
 402                                 struct intel_shared_dpll *pll)
 403{
 404        struct drm_device *dev = &dev_priv->drm;
 405        struct intel_crtc *crtc;
 406
 407        /* Make sure no transcoder isn't still depending on us. */
 408        for_each_intel_crtc(dev, crtc) {
 409                if (crtc->config->shared_dpll == pll)
 410                        assert_pch_transcoder_disabled(dev_priv, crtc->pipe);
 411        }
 412
 413        I915_WRITE(PCH_DPLL(pll->id), 0);
 414        POSTING_READ(PCH_DPLL(pll->id));
 415        udelay(200);
 416}
 417
 418static struct intel_shared_dpll *
 419ibx_get_dpll(struct intel_crtc *crtc, struct intel_crtc_state *crtc_state,
 420             struct intel_encoder *encoder)
 421{
 422        struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
 423        struct intel_shared_dpll *pll;
 424        enum intel_dpll_id i;
 425
 426        if (HAS_PCH_IBX(dev_priv)) {
 427                /* Ironlake PCH has a fixed PLL->PCH pipe mapping. */
 428                i = (enum intel_dpll_id) crtc->pipe;
 429                pll = &dev_priv->shared_dplls[i];
 430
 431                DRM_DEBUG_KMS("[CRTC:%d:%s] using pre-allocated %s\n",
 432                              crtc->base.base.id, crtc->base.name, pll->name);
 433        } else {
 434                pll = intel_find_shared_dpll(crtc, crtc_state,
 435                                             DPLL_ID_PCH_PLL_A,
 436                                             DPLL_ID_PCH_PLL_B);
 437        }
 438
 439        if (!pll)
 440                return NULL;
 441
 442        /* reference the pll */
 443        intel_reference_shared_dpll(pll, crtc_state);
 444
 445        return pll;
 446}
 447
 448static void ibx_dump_hw_state(struct drm_i915_private *dev_priv,
 449                              struct intel_dpll_hw_state *hw_state)
 450{
 451        DRM_DEBUG_KMS("dpll_hw_state: dpll: 0x%x, dpll_md: 0x%x, "
 452                      "fp0: 0x%x, fp1: 0x%x\n",
 453                      hw_state->dpll,
 454                      hw_state->dpll_md,
 455                      hw_state->fp0,
 456                      hw_state->fp1);
 457}
 458
 459static const struct intel_shared_dpll_funcs ibx_pch_dpll_funcs = {
 460        .prepare = ibx_pch_dpll_prepare,
 461        .enable = ibx_pch_dpll_enable,
 462        .disable = ibx_pch_dpll_disable,
 463        .get_hw_state = ibx_pch_dpll_get_hw_state,
 464};
 465
 466static void hsw_ddi_wrpll_enable(struct drm_i915_private *dev_priv,
 467                               struct intel_shared_dpll *pll)
 468{
 469        I915_WRITE(WRPLL_CTL(pll->id), pll->state.hw_state.wrpll);
 470        POSTING_READ(WRPLL_CTL(pll->id));
 471        udelay(20);
 472}
 473
 474static void hsw_ddi_spll_enable(struct drm_i915_private *dev_priv,
 475                                struct intel_shared_dpll *pll)
 476{
 477        I915_WRITE(SPLL_CTL, pll->state.hw_state.spll);
 478        POSTING_READ(SPLL_CTL);
 479        udelay(20);
 480}
 481
 482static void hsw_ddi_wrpll_disable(struct drm_i915_private *dev_priv,
 483                                  struct intel_shared_dpll *pll)
 484{
 485        uint32_t val;
 486
 487        val = I915_READ(WRPLL_CTL(pll->id));
 488        I915_WRITE(WRPLL_CTL(pll->id), val & ~WRPLL_PLL_ENABLE);
 489        POSTING_READ(WRPLL_CTL(pll->id));
 490}
 491
 492static void hsw_ddi_spll_disable(struct drm_i915_private *dev_priv,
 493                                 struct intel_shared_dpll *pll)
 494{
 495        uint32_t val;
 496
 497        val = I915_READ(SPLL_CTL);
 498        I915_WRITE(SPLL_CTL, val & ~SPLL_PLL_ENABLE);
 499        POSTING_READ(SPLL_CTL);
 500}
 501
 502static bool hsw_ddi_wrpll_get_hw_state(struct drm_i915_private *dev_priv,
 503                                       struct intel_shared_dpll *pll,
 504                                       struct intel_dpll_hw_state *hw_state)
 505{
 506        uint32_t val;
 507
 508        if (!intel_display_power_get_if_enabled(dev_priv, POWER_DOMAIN_PLLS))
 509                return false;
 510
 511        val = I915_READ(WRPLL_CTL(pll->id));
 512        hw_state->wrpll = val;
 513
 514        intel_display_power_put(dev_priv, POWER_DOMAIN_PLLS);
 515
 516        return val & WRPLL_PLL_ENABLE;
 517}
 518
 519static bool hsw_ddi_spll_get_hw_state(struct drm_i915_private *dev_priv,
 520                                      struct intel_shared_dpll *pll,
 521                                      struct intel_dpll_hw_state *hw_state)
 522{
 523        uint32_t val;
 524
 525        if (!intel_display_power_get_if_enabled(dev_priv, POWER_DOMAIN_PLLS))
 526                return false;
 527
 528        val = I915_READ(SPLL_CTL);
 529        hw_state->spll = val;
 530
 531        intel_display_power_put(dev_priv, POWER_DOMAIN_PLLS);
 532
 533        return val & SPLL_PLL_ENABLE;
 534}
 535
 536#define LC_FREQ 2700
 537#define LC_FREQ_2K U64_C(LC_FREQ * 2000)
 538
 539#define P_MIN 2
 540#define P_MAX 64
 541#define P_INC 2
 542
 543/* Constraints for PLL good behavior */
 544#define REF_MIN 48
 545#define REF_MAX 400
 546#define VCO_MIN 2400
 547#define VCO_MAX 4800
 548
 549struct hsw_wrpll_rnp {
 550        unsigned p, n2, r2;
 551};
 552
 553static unsigned hsw_wrpll_get_budget_for_freq(int clock)
 554{
 555        unsigned budget;
 556
 557        switch (clock) {
 558        case 25175000:
 559        case 25200000:
 560        case 27000000:
 561        case 27027000:
 562        case 37762500:
 563        case 37800000:
 564        case 40500000:
 565        case 40541000:
 566        case 54000000:
 567        case 54054000:
 568        case 59341000:
 569        case 59400000:
 570        case 72000000:
 571        case 74176000:
 572        case 74250000:
 573        case 81000000:
 574        case 81081000:
 575        case 89012000:
 576        case 89100000:
 577        case 108000000:
 578        case 108108000:
 579        case 111264000:
 580        case 111375000:
 581        case 148352000:
 582        case 148500000:
 583        case 162000000:
 584        case 162162000:
 585        case 222525000:
 586        case 222750000:
 587        case 296703000:
 588        case 297000000:
 589                budget = 0;
 590                break;
 591        case 233500000:
 592        case 245250000:
 593        case 247750000:
 594        case 253250000:
 595        case 298000000:
 596                budget = 1500;
 597                break;
 598        case 169128000:
 599        case 169500000:
 600        case 179500000:
 601        case 202000000:
 602                budget = 2000;
 603                break;
 604        case 256250000:
 605        case 262500000:
 606        case 270000000:
 607        case 272500000:
 608        case 273750000:
 609        case 280750000:
 610        case 281250000:
 611        case 286000000:
 612        case 291750000:
 613                budget = 4000;
 614                break;
 615        case 267250000:
 616        case 268500000:
 617                budget = 5000;
 618                break;
 619        default:
 620                budget = 1000;
 621                break;
 622        }
 623
 624        return budget;
 625}
 626
 627static void hsw_wrpll_update_rnp(uint64_t freq2k, unsigned budget,
 628                                 unsigned r2, unsigned n2, unsigned p,
 629                                 struct hsw_wrpll_rnp *best)
 630{
 631        uint64_t a, b, c, d, diff, diff_best;
 632
 633        /* No best (r,n,p) yet */
 634        if (best->p == 0) {
 635                best->p = p;
 636                best->n2 = n2;
 637                best->r2 = r2;
 638                return;
 639        }
 640
 641        /*
 642         * Output clock is (LC_FREQ_2K / 2000) * N / (P * R), which compares to
 643         * freq2k.
 644         *
 645         * delta = 1e6 *
 646         *         abs(freq2k - (LC_FREQ_2K * n2/(p * r2))) /
 647         *         freq2k;
 648         *
 649         * and we would like delta <= budget.
 650         *
 651         * If the discrepancy is above the PPM-based budget, always prefer to
 652         * improve upon the previous solution.  However, if you're within the
 653         * budget, try to maximize Ref * VCO, that is N / (P * R^2).
 654         */
 655        a = freq2k * budget * p * r2;
 656        b = freq2k * budget * best->p * best->r2;
 657        diff = abs_diff(freq2k * p * r2, LC_FREQ_2K * n2);
 658        diff_best = abs_diff(freq2k * best->p * best->r2,
 659                             LC_FREQ_2K * best->n2);
 660        c = 1000000 * diff;
 661        d = 1000000 * diff_best;
 662
 663        if (a < c && b < d) {
 664                /* If both are above the budget, pick the closer */
 665                if (best->p * best->r2 * diff < p * r2 * diff_best) {
 666                        best->p = p;
 667                        best->n2 = n2;
 668                        best->r2 = r2;
 669                }
 670        } else if (a >= c && b < d) {
 671                /* If A is below the threshold but B is above it?  Update. */
 672                best->p = p;
 673                best->n2 = n2;
 674                best->r2 = r2;
 675        } else if (a >= c && b >= d) {
 676                /* Both are below the limit, so pick the higher n2/(r2*r2) */
 677                if (n2 * best->r2 * best->r2 > best->n2 * r2 * r2) {
 678                        best->p = p;
 679                        best->n2 = n2;
 680                        best->r2 = r2;
 681                }
 682        }
 683        /* Otherwise a < c && b >= d, do nothing */
 684}
 685
 686static void
 687hsw_ddi_calculate_wrpll(int clock /* in Hz */,
 688                        unsigned *r2_out, unsigned *n2_out, unsigned *p_out)
 689{
 690        uint64_t freq2k;
 691        unsigned p, n2, r2;
 692        struct hsw_wrpll_rnp best = { 0, 0, 0 };
 693        unsigned budget;
 694
 695        freq2k = clock / 100;
 696
 697        budget = hsw_wrpll_get_budget_for_freq(clock);
 698
 699        /* Special case handling for 540 pixel clock: bypass WR PLL entirely
 700         * and directly pass the LC PLL to it. */
 701        if (freq2k == 5400000) {
 702                *n2_out = 2;
 703                *p_out = 1;
 704                *r2_out = 2;
 705                return;
 706        }
 707
 708        /*
 709         * Ref = LC_FREQ / R, where Ref is the actual reference input seen by
 710         * the WR PLL.
 711         *
 712         * We want R so that REF_MIN <= Ref <= REF_MAX.
 713         * Injecting R2 = 2 * R gives:
 714         *   REF_MAX * r2 > LC_FREQ * 2 and
 715         *   REF_MIN * r2 < LC_FREQ * 2
 716         *
 717         * Which means the desired boundaries for r2 are:
 718         *  LC_FREQ * 2 / REF_MAX < r2 < LC_FREQ * 2 / REF_MIN
 719         *
 720         */
 721        for (r2 = LC_FREQ * 2 / REF_MAX + 1;
 722             r2 <= LC_FREQ * 2 / REF_MIN;
 723             r2++) {
 724
 725                /*
 726                 * VCO = N * Ref, that is: VCO = N * LC_FREQ / R
 727                 *
 728                 * Once again we want VCO_MIN <= VCO <= VCO_MAX.
 729                 * Injecting R2 = 2 * R and N2 = 2 * N, we get:
 730                 *   VCO_MAX * r2 > n2 * LC_FREQ and
 731                 *   VCO_MIN * r2 < n2 * LC_FREQ)
 732                 *
 733                 * Which means the desired boundaries for n2 are:
 734                 * VCO_MIN * r2 / LC_FREQ < n2 < VCO_MAX * r2 / LC_FREQ
 735                 */
 736                for (n2 = VCO_MIN * r2 / LC_FREQ + 1;
 737                     n2 <= VCO_MAX * r2 / LC_FREQ;
 738                     n2++) {
 739
 740                        for (p = P_MIN; p <= P_MAX; p += P_INC)
 741                                hsw_wrpll_update_rnp(freq2k, budget,
 742                                                     r2, n2, p, &best);
 743                }
 744        }
 745
 746        *n2_out = best.n2;
 747        *p_out = best.p;
 748        *r2_out = best.r2;
 749}
 750
 751static struct intel_shared_dpll *hsw_ddi_hdmi_get_dpll(int clock,
 752                                                       struct intel_crtc *crtc,
 753                                                       struct intel_crtc_state *crtc_state)
 754{
 755        struct intel_shared_dpll *pll;
 756        uint32_t val;
 757        unsigned int p, n2, r2;
 758
 759        hsw_ddi_calculate_wrpll(clock * 1000, &r2, &n2, &p);
 760
 761        val = WRPLL_PLL_ENABLE | WRPLL_PLL_LCPLL |
 762              WRPLL_DIVIDER_REFERENCE(r2) | WRPLL_DIVIDER_FEEDBACK(n2) |
 763              WRPLL_DIVIDER_POST(p);
 764
 765        crtc_state->dpll_hw_state.wrpll = val;
 766
 767        pll = intel_find_shared_dpll(crtc, crtc_state,
 768                                     DPLL_ID_WRPLL1, DPLL_ID_WRPLL2);
 769
 770        if (!pll)
 771                return NULL;
 772
 773        return pll;
 774}
 775
 776static struct intel_shared_dpll *
 777hsw_ddi_dp_get_dpll(struct intel_encoder *encoder, int clock)
 778{
 779        struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
 780        struct intel_shared_dpll *pll;
 781        enum intel_dpll_id pll_id;
 782
 783        switch (clock / 2) {
 784        case 81000:
 785                pll_id = DPLL_ID_LCPLL_810;
 786                break;
 787        case 135000:
 788                pll_id = DPLL_ID_LCPLL_1350;
 789                break;
 790        case 270000:
 791                pll_id = DPLL_ID_LCPLL_2700;
 792                break;
 793        default:
 794                DRM_DEBUG_KMS("Invalid clock for DP: %d\n", clock);
 795                return NULL;
 796        }
 797
 798        pll = intel_get_shared_dpll_by_id(dev_priv, pll_id);
 799
 800        if (!pll)
 801                return NULL;
 802
 803        return pll;
 804}
 805
 806static struct intel_shared_dpll *
 807hsw_get_dpll(struct intel_crtc *crtc, struct intel_crtc_state *crtc_state,
 808             struct intel_encoder *encoder)
 809{
 810        struct intel_shared_dpll *pll;
 811        int clock = crtc_state->port_clock;
 812
 813        memset(&crtc_state->dpll_hw_state, 0,
 814               sizeof(crtc_state->dpll_hw_state));
 815
 816        if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_HDMI)) {
 817                pll = hsw_ddi_hdmi_get_dpll(clock, crtc, crtc_state);
 818        } else if (intel_crtc_has_dp_encoder(crtc_state)) {
 819                pll = hsw_ddi_dp_get_dpll(encoder, clock);
 820        } else if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_ANALOG)) {
 821                if (WARN_ON(crtc_state->port_clock / 2 != 135000))
 822                        return NULL;
 823
 824                crtc_state->dpll_hw_state.spll =
 825                        SPLL_PLL_ENABLE | SPLL_PLL_FREQ_1350MHz | SPLL_PLL_SSC;
 826
 827                pll = intel_find_shared_dpll(crtc, crtc_state,
 828                                             DPLL_ID_SPLL, DPLL_ID_SPLL);
 829        } else {
 830                return NULL;
 831        }
 832
 833        if (!pll)
 834                return NULL;
 835
 836        intel_reference_shared_dpll(pll, crtc_state);
 837
 838        return pll;
 839}
 840
 841static void hsw_dump_hw_state(struct drm_i915_private *dev_priv,
 842                              struct intel_dpll_hw_state *hw_state)
 843{
 844        DRM_DEBUG_KMS("dpll_hw_state: wrpll: 0x%x spll: 0x%x\n",
 845                      hw_state->wrpll, hw_state->spll);
 846}
 847
 848static const struct intel_shared_dpll_funcs hsw_ddi_wrpll_funcs = {
 849        .enable = hsw_ddi_wrpll_enable,
 850        .disable = hsw_ddi_wrpll_disable,
 851        .get_hw_state = hsw_ddi_wrpll_get_hw_state,
 852};
 853
 854static const struct intel_shared_dpll_funcs hsw_ddi_spll_funcs = {
 855        .enable = hsw_ddi_spll_enable,
 856        .disable = hsw_ddi_spll_disable,
 857        .get_hw_state = hsw_ddi_spll_get_hw_state,
 858};
 859
 860static void hsw_ddi_lcpll_enable(struct drm_i915_private *dev_priv,
 861                                 struct intel_shared_dpll *pll)
 862{
 863}
 864
 865static void hsw_ddi_lcpll_disable(struct drm_i915_private *dev_priv,
 866                                  struct intel_shared_dpll *pll)
 867{
 868}
 869
 870static bool hsw_ddi_lcpll_get_hw_state(struct drm_i915_private *dev_priv,
 871                                       struct intel_shared_dpll *pll,
 872                                       struct intel_dpll_hw_state *hw_state)
 873{
 874        return true;
 875}
 876
 877static const struct intel_shared_dpll_funcs hsw_ddi_lcpll_funcs = {
 878        .enable = hsw_ddi_lcpll_enable,
 879        .disable = hsw_ddi_lcpll_disable,
 880        .get_hw_state = hsw_ddi_lcpll_get_hw_state,
 881};
 882
 883struct skl_dpll_regs {
 884        i915_reg_t ctl, cfgcr1, cfgcr2;
 885};
 886
 887/* this array is indexed by the *shared* pll id */
 888static const struct skl_dpll_regs skl_dpll_regs[4] = {
 889        {
 890                /* DPLL 0 */
 891                .ctl = LCPLL1_CTL,
 892                /* DPLL 0 doesn't support HDMI mode */
 893        },
 894        {
 895                /* DPLL 1 */
 896                .ctl = LCPLL2_CTL,
 897                .cfgcr1 = DPLL_CFGCR1(SKL_DPLL1),
 898                .cfgcr2 = DPLL_CFGCR2(SKL_DPLL1),
 899        },
 900        {
 901                /* DPLL 2 */
 902                .ctl = WRPLL_CTL(0),
 903                .cfgcr1 = DPLL_CFGCR1(SKL_DPLL2),
 904                .cfgcr2 = DPLL_CFGCR2(SKL_DPLL2),
 905        },
 906        {
 907                /* DPLL 3 */
 908                .ctl = WRPLL_CTL(1),
 909                .cfgcr1 = DPLL_CFGCR1(SKL_DPLL3),
 910                .cfgcr2 = DPLL_CFGCR2(SKL_DPLL3),
 911        },
 912};
 913
 914static void skl_ddi_pll_write_ctrl1(struct drm_i915_private *dev_priv,
 915                                    struct intel_shared_dpll *pll)
 916{
 917        uint32_t val;
 918
 919        val = I915_READ(DPLL_CTRL1);
 920
 921        val &= ~(DPLL_CTRL1_HDMI_MODE(pll->id) | DPLL_CTRL1_SSC(pll->id) |
 922                 DPLL_CTRL1_LINK_RATE_MASK(pll->id));
 923        val |= pll->state.hw_state.ctrl1 << (pll->id * 6);
 924
 925        I915_WRITE(DPLL_CTRL1, val);
 926        POSTING_READ(DPLL_CTRL1);
 927}
 928
 929static void skl_ddi_pll_enable(struct drm_i915_private *dev_priv,
 930                               struct intel_shared_dpll *pll)
 931{
 932        const struct skl_dpll_regs *regs = skl_dpll_regs;
 933
 934        skl_ddi_pll_write_ctrl1(dev_priv, pll);
 935
 936        I915_WRITE(regs[pll->id].cfgcr1, pll->state.hw_state.cfgcr1);
 937        I915_WRITE(regs[pll->id].cfgcr2, pll->state.hw_state.cfgcr2);
 938        POSTING_READ(regs[pll->id].cfgcr1);
 939        POSTING_READ(regs[pll->id].cfgcr2);
 940
 941        /* the enable bit is always bit 31 */
 942        I915_WRITE(regs[pll->id].ctl,
 943                   I915_READ(regs[pll->id].ctl) | LCPLL_PLL_ENABLE);
 944
 945        if (intel_wait_for_register(dev_priv,
 946                                    DPLL_STATUS,
 947                                    DPLL_LOCK(pll->id),
 948                                    DPLL_LOCK(pll->id),
 949                                    5))
 950                DRM_ERROR("DPLL %d not locked\n", pll->id);
 951}
 952
 953static void skl_ddi_dpll0_enable(struct drm_i915_private *dev_priv,
 954                                 struct intel_shared_dpll *pll)
 955{
 956        skl_ddi_pll_write_ctrl1(dev_priv, pll);
 957}
 958
 959static void skl_ddi_pll_disable(struct drm_i915_private *dev_priv,
 960                                struct intel_shared_dpll *pll)
 961{
 962        const struct skl_dpll_regs *regs = skl_dpll_regs;
 963
 964        /* the enable bit is always bit 31 */
 965        I915_WRITE(regs[pll->id].ctl,
 966                   I915_READ(regs[pll->id].ctl) & ~LCPLL_PLL_ENABLE);
 967        POSTING_READ(regs[pll->id].ctl);
 968}
 969
 970static void skl_ddi_dpll0_disable(struct drm_i915_private *dev_priv,
 971                                  struct intel_shared_dpll *pll)
 972{
 973}
 974
 975static bool skl_ddi_pll_get_hw_state(struct drm_i915_private *dev_priv,
 976                                     struct intel_shared_dpll *pll,
 977                                     struct intel_dpll_hw_state *hw_state)
 978{
 979        uint32_t val;
 980        const struct skl_dpll_regs *regs = skl_dpll_regs;
 981        bool ret;
 982
 983        if (!intel_display_power_get_if_enabled(dev_priv, POWER_DOMAIN_PLLS))
 984                return false;
 985
 986        ret = false;
 987
 988        val = I915_READ(regs[pll->id].ctl);
 989        if (!(val & LCPLL_PLL_ENABLE))
 990                goto out;
 991
 992        val = I915_READ(DPLL_CTRL1);
 993        hw_state->ctrl1 = (val >> (pll->id * 6)) & 0x3f;
 994
 995        /* avoid reading back stale values if HDMI mode is not enabled */
 996        if (val & DPLL_CTRL1_HDMI_MODE(pll->id)) {
 997                hw_state->cfgcr1 = I915_READ(regs[pll->id].cfgcr1);
 998                hw_state->cfgcr2 = I915_READ(regs[pll->id].cfgcr2);
 999        }
1000        ret = true;
1001
1002out:
1003        intel_display_power_put(dev_priv, POWER_DOMAIN_PLLS);
1004
1005        return ret;
1006}
1007
1008static bool skl_ddi_dpll0_get_hw_state(struct drm_i915_private *dev_priv,
1009                                       struct intel_shared_dpll *pll,
1010                                       struct intel_dpll_hw_state *hw_state)
1011{
1012        uint32_t val;
1013        const struct skl_dpll_regs *regs = skl_dpll_regs;
1014        bool ret;
1015
1016        if (!intel_display_power_get_if_enabled(dev_priv, POWER_DOMAIN_PLLS))
1017                return false;
1018
1019        ret = false;
1020
1021        /* DPLL0 is always enabled since it drives CDCLK */
1022        val = I915_READ(regs[pll->id].ctl);
1023        if (WARN_ON(!(val & LCPLL_PLL_ENABLE)))
1024                goto out;
1025
1026        val = I915_READ(DPLL_CTRL1);
1027        hw_state->ctrl1 = (val >> (pll->id * 6)) & 0x3f;
1028
1029        ret = true;
1030
1031out:
1032        intel_display_power_put(dev_priv, POWER_DOMAIN_PLLS);
1033
1034        return ret;
1035}
1036
1037struct skl_wrpll_context {
1038        uint64_t min_deviation;         /* current minimal deviation */
1039        uint64_t central_freq;          /* chosen central freq */
1040        uint64_t dco_freq;              /* chosen dco freq */
1041        unsigned int p;                 /* chosen divider */
1042};
1043
1044static void skl_wrpll_context_init(struct skl_wrpll_context *ctx)
1045{
1046        memset(ctx, 0, sizeof(*ctx));
1047
1048        ctx->min_deviation = U64_MAX;
1049}
1050
1051/* DCO freq must be within +1%/-6%  of the DCO central freq */
1052#define SKL_DCO_MAX_PDEVIATION  100
1053#define SKL_DCO_MAX_NDEVIATION  600
1054
1055static void skl_wrpll_try_divider(struct skl_wrpll_context *ctx,
1056                                  uint64_t central_freq,
1057                                  uint64_t dco_freq,
1058                                  unsigned int divider)
1059{
1060        uint64_t deviation;
1061
1062        deviation = div64_u64(10000 * abs_diff(dco_freq, central_freq),
1063                              central_freq);
1064
1065        /* positive deviation */
1066        if (dco_freq >= central_freq) {
1067                if (deviation < SKL_DCO_MAX_PDEVIATION &&
1068                    deviation < ctx->min_deviation) {
1069                        ctx->min_deviation = deviation;
1070                        ctx->central_freq = central_freq;
1071                        ctx->dco_freq = dco_freq;
1072                        ctx->p = divider;
1073                }
1074        /* negative deviation */
1075        } else if (deviation < SKL_DCO_MAX_NDEVIATION &&
1076                   deviation < ctx->min_deviation) {
1077                ctx->min_deviation = deviation;
1078                ctx->central_freq = central_freq;
1079                ctx->dco_freq = dco_freq;
1080                ctx->p = divider;
1081        }
1082}
1083
1084static void skl_wrpll_get_multipliers(unsigned int p,
1085                                      unsigned int *p0 /* out */,
1086                                      unsigned int *p1 /* out */,
1087                                      unsigned int *p2 /* out */)
1088{
1089        /* even dividers */
1090        if (p % 2 == 0) {
1091                unsigned int half = p / 2;
1092
1093                if (half == 1 || half == 2 || half == 3 || half == 5) {
1094                        *p0 = 2;
1095                        *p1 = 1;
1096                        *p2 = half;
1097                } else if (half % 2 == 0) {
1098                        *p0 = 2;
1099                        *p1 = half / 2;
1100                        *p2 = 2;
1101                } else if (half % 3 == 0) {
1102                        *p0 = 3;
1103                        *p1 = half / 3;
1104                        *p2 = 2;
1105                } else if (half % 7 == 0) {
1106                        *p0 = 7;
1107                        *p1 = half / 7;
1108                        *p2 = 2;
1109                }
1110        } else if (p == 3 || p == 9) {  /* 3, 5, 7, 9, 15, 21, 35 */
1111                *p0 = 3;
1112                *p1 = 1;
1113                *p2 = p / 3;
1114        } else if (p == 5 || p == 7) {
1115                *p0 = p;
1116                *p1 = 1;
1117                *p2 = 1;
1118        } else if (p == 15) {
1119                *p0 = 3;
1120                *p1 = 1;
1121                *p2 = 5;
1122        } else if (p == 21) {
1123                *p0 = 7;
1124                *p1 = 1;
1125                *p2 = 3;
1126        } else if (p == 35) {
1127                *p0 = 7;
1128                *p1 = 1;
1129                *p2 = 5;
1130        }
1131}
1132
1133struct skl_wrpll_params {
1134        uint32_t        dco_fraction;
1135        uint32_t        dco_integer;
1136        uint32_t        qdiv_ratio;
1137        uint32_t        qdiv_mode;
1138        uint32_t        kdiv;
1139        uint32_t        pdiv;
1140        uint32_t        central_freq;
1141};
1142
1143static void skl_wrpll_params_populate(struct skl_wrpll_params *params,
1144                                      uint64_t afe_clock,
1145                                      uint64_t central_freq,
1146                                      uint32_t p0, uint32_t p1, uint32_t p2)
1147{
1148        uint64_t dco_freq;
1149
1150        switch (central_freq) {
1151        case 9600000000ULL:
1152                params->central_freq = 0;
1153                break;
1154        case 9000000000ULL:
1155                params->central_freq = 1;
1156                break;
1157        case 8400000000ULL:
1158                params->central_freq = 3;
1159        }
1160
1161        switch (p0) {
1162        case 1:
1163                params->pdiv = 0;
1164                break;
1165        case 2:
1166                params->pdiv = 1;
1167                break;
1168        case 3:
1169                params->pdiv = 2;
1170                break;
1171        case 7:
1172                params->pdiv = 4;
1173                break;
1174        default:
1175                WARN(1, "Incorrect PDiv\n");
1176        }
1177
1178        switch (p2) {
1179        case 5:
1180                params->kdiv = 0;
1181                break;
1182        case 2:
1183                params->kdiv = 1;
1184                break;
1185        case 3:
1186                params->kdiv = 2;
1187                break;
1188        case 1:
1189                params->kdiv = 3;
1190                break;
1191        default:
1192                WARN(1, "Incorrect KDiv\n");
1193        }
1194
1195        params->qdiv_ratio = p1;
1196        params->qdiv_mode = (params->qdiv_ratio == 1) ? 0 : 1;
1197
1198        dco_freq = p0 * p1 * p2 * afe_clock;
1199
1200        /*
1201         * Intermediate values are in Hz.
1202         * Divide by MHz to match bsepc
1203         */
1204        params->dco_integer = div_u64(dco_freq, 24 * MHz(1));
1205        params->dco_fraction =
1206                div_u64((div_u64(dco_freq, 24) -
1207                         params->dco_integer * MHz(1)) * 0x8000, MHz(1));
1208}
1209
1210static bool
1211skl_ddi_calculate_wrpll(int clock /* in Hz */,
1212                        struct skl_wrpll_params *wrpll_params)
1213{
1214        uint64_t afe_clock = clock * 5; /* AFE Clock is 5x Pixel clock */
1215        uint64_t dco_central_freq[3] = {8400000000ULL,
1216                                        9000000000ULL,
1217                                        9600000000ULL};
1218        static const int even_dividers[] = {  4,  6,  8, 10, 12, 14, 16, 18, 20,
1219                                             24, 28, 30, 32, 36, 40, 42, 44,
1220                                             48, 52, 54, 56, 60, 64, 66, 68,
1221                                             70, 72, 76, 78, 80, 84, 88, 90,
1222                                             92, 96, 98 };
1223        static const int odd_dividers[] = { 3, 5, 7, 9, 15, 21, 35 };
1224        static const struct {
1225                const int *list;
1226                int n_dividers;
1227        } dividers[] = {
1228                { even_dividers, ARRAY_SIZE(even_dividers) },
1229                { odd_dividers, ARRAY_SIZE(odd_dividers) },
1230        };
1231        struct skl_wrpll_context ctx;
1232        unsigned int dco, d, i;
1233        unsigned int p0, p1, p2;
1234
1235        skl_wrpll_context_init(&ctx);
1236
1237        for (d = 0; d < ARRAY_SIZE(dividers); d++) {
1238                for (dco = 0; dco < ARRAY_SIZE(dco_central_freq); dco++) {
1239                        for (i = 0; i < dividers[d].n_dividers; i++) {
1240                                unsigned int p = dividers[d].list[i];
1241                                uint64_t dco_freq = p * afe_clock;
1242
1243                                skl_wrpll_try_divider(&ctx,
1244                                                      dco_central_freq[dco],
1245                                                      dco_freq,
1246                                                      p);
1247                                /*
1248                                 * Skip the remaining dividers if we're sure to
1249                                 * have found the definitive divider, we can't
1250                                 * improve a 0 deviation.
1251                                 */
1252                                if (ctx.min_deviation == 0)
1253                                        goto skip_remaining_dividers;
1254                        }
1255                }
1256
1257skip_remaining_dividers:
1258                /*
1259                 * If a solution is found with an even divider, prefer
1260                 * this one.
1261                 */
1262                if (d == 0 && ctx.p)
1263                        break;
1264        }
1265
1266        if (!ctx.p) {
1267                DRM_DEBUG_DRIVER("No valid divider found for %dHz\n", clock);
1268                return false;
1269        }
1270
1271        /*
1272         * gcc incorrectly analyses that these can be used without being
1273         * initialized. To be fair, it's hard to guess.
1274         */
1275        p0 = p1 = p2 = 0;
1276        skl_wrpll_get_multipliers(ctx.p, &p0, &p1, &p2);
1277        skl_wrpll_params_populate(wrpll_params, afe_clock, ctx.central_freq,
1278                                  p0, p1, p2);
1279
1280        return true;
1281}
1282
1283static bool skl_ddi_hdmi_pll_dividers(struct intel_crtc *crtc,
1284                                      struct intel_crtc_state *crtc_state,
1285                                      int clock)
1286{
1287        uint32_t ctrl1, cfgcr1, cfgcr2;
1288        struct skl_wrpll_params wrpll_params = { 0, };
1289
1290        /*
1291         * See comment in intel_dpll_hw_state to understand why we always use 0
1292         * as the DPLL id in this function.
1293         */
1294        ctrl1 = DPLL_CTRL1_OVERRIDE(0);
1295
1296        ctrl1 |= DPLL_CTRL1_HDMI_MODE(0);
1297
1298        if (!skl_ddi_calculate_wrpll(clock * 1000, &wrpll_params))
1299                return false;
1300
1301        cfgcr1 = DPLL_CFGCR1_FREQ_ENABLE |
1302                DPLL_CFGCR1_DCO_FRACTION(wrpll_params.dco_fraction) |
1303                wrpll_params.dco_integer;
1304
1305        cfgcr2 = DPLL_CFGCR2_QDIV_RATIO(wrpll_params.qdiv_ratio) |
1306                DPLL_CFGCR2_QDIV_MODE(wrpll_params.qdiv_mode) |
1307                DPLL_CFGCR2_KDIV(wrpll_params.kdiv) |
1308                DPLL_CFGCR2_PDIV(wrpll_params.pdiv) |
1309                wrpll_params.central_freq;
1310
1311        memset(&crtc_state->dpll_hw_state, 0,
1312               sizeof(crtc_state->dpll_hw_state));
1313
1314        crtc_state->dpll_hw_state.ctrl1 = ctrl1;
1315        crtc_state->dpll_hw_state.cfgcr1 = cfgcr1;
1316        crtc_state->dpll_hw_state.cfgcr2 = cfgcr2;
1317        return true;
1318}
1319
1320static bool
1321skl_ddi_dp_set_dpll_hw_state(int clock,
1322                             struct intel_dpll_hw_state *dpll_hw_state)
1323{
1324        uint32_t ctrl1;
1325
1326        /*
1327         * See comment in intel_dpll_hw_state to understand why we always use 0
1328         * as the DPLL id in this function.
1329         */
1330        ctrl1 = DPLL_CTRL1_OVERRIDE(0);
1331        switch (clock / 2) {
1332        case 81000:
1333                ctrl1 |= DPLL_CTRL1_LINK_RATE(DPLL_CTRL1_LINK_RATE_810, 0);
1334                break;
1335        case 135000:
1336                ctrl1 |= DPLL_CTRL1_LINK_RATE(DPLL_CTRL1_LINK_RATE_1350, 0);
1337                break;
1338        case 270000:
1339                ctrl1 |= DPLL_CTRL1_LINK_RATE(DPLL_CTRL1_LINK_RATE_2700, 0);
1340                break;
1341                /* eDP 1.4 rates */
1342        case 162000:
1343                ctrl1 |= DPLL_CTRL1_LINK_RATE(DPLL_CTRL1_LINK_RATE_1620, 0);
1344                break;
1345        case 108000:
1346                ctrl1 |= DPLL_CTRL1_LINK_RATE(DPLL_CTRL1_LINK_RATE_1080, 0);
1347                break;
1348        case 216000:
1349                ctrl1 |= DPLL_CTRL1_LINK_RATE(DPLL_CTRL1_LINK_RATE_2160, 0);
1350                break;
1351        }
1352
1353        dpll_hw_state->ctrl1 = ctrl1;
1354        return true;
1355}
1356
1357static struct intel_shared_dpll *
1358skl_get_dpll(struct intel_crtc *crtc, struct intel_crtc_state *crtc_state,
1359             struct intel_encoder *encoder)
1360{
1361        struct intel_shared_dpll *pll;
1362        int clock = crtc_state->port_clock;
1363        bool bret;
1364        struct intel_dpll_hw_state dpll_hw_state;
1365
1366        memset(&dpll_hw_state, 0, sizeof(dpll_hw_state));
1367
1368        if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_HDMI)) {
1369                bret = skl_ddi_hdmi_pll_dividers(crtc, crtc_state, clock);
1370                if (!bret) {
1371                        DRM_DEBUG_KMS("Could not get HDMI pll dividers.\n");
1372                        return NULL;
1373                }
1374        } else if (intel_crtc_has_dp_encoder(crtc_state)) {
1375                bret = skl_ddi_dp_set_dpll_hw_state(clock, &dpll_hw_state);
1376                if (!bret) {
1377                        DRM_DEBUG_KMS("Could not set DP dpll HW state.\n");
1378                        return NULL;
1379                }
1380                crtc_state->dpll_hw_state = dpll_hw_state;
1381        } else {
1382                return NULL;
1383        }
1384
1385        if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_EDP))
1386                pll = intel_find_shared_dpll(crtc, crtc_state,
1387                                             DPLL_ID_SKL_DPLL0,
1388                                             DPLL_ID_SKL_DPLL0);
1389        else
1390                pll = intel_find_shared_dpll(crtc, crtc_state,
1391                                             DPLL_ID_SKL_DPLL1,
1392                                             DPLL_ID_SKL_DPLL3);
1393        if (!pll)
1394                return NULL;
1395
1396        intel_reference_shared_dpll(pll, crtc_state);
1397
1398        return pll;
1399}
1400
1401static void skl_dump_hw_state(struct drm_i915_private *dev_priv,
1402                              struct intel_dpll_hw_state *hw_state)
1403{
1404        DRM_DEBUG_KMS("dpll_hw_state: "
1405                      "ctrl1: 0x%x, cfgcr1: 0x%x, cfgcr2: 0x%x\n",
1406                      hw_state->ctrl1,
1407                      hw_state->cfgcr1,
1408                      hw_state->cfgcr2);
1409}
1410
1411static const struct intel_shared_dpll_funcs skl_ddi_pll_funcs = {
1412        .enable = skl_ddi_pll_enable,
1413        .disable = skl_ddi_pll_disable,
1414        .get_hw_state = skl_ddi_pll_get_hw_state,
1415};
1416
1417static const struct intel_shared_dpll_funcs skl_ddi_dpll0_funcs = {
1418        .enable = skl_ddi_dpll0_enable,
1419        .disable = skl_ddi_dpll0_disable,
1420        .get_hw_state = skl_ddi_dpll0_get_hw_state,
1421};
1422
1423static void bxt_ddi_pll_enable(struct drm_i915_private *dev_priv,
1424                                struct intel_shared_dpll *pll)
1425{
1426        uint32_t temp;
1427        enum port port = (enum port)pll->id;    /* 1:1 port->PLL mapping */
1428        enum dpio_phy phy;
1429        enum dpio_channel ch;
1430
1431        bxt_port_to_phy_channel(dev_priv, port, &phy, &ch);
1432
1433        /* Non-SSC reference */
1434        temp = I915_READ(BXT_PORT_PLL_ENABLE(port));
1435        temp |= PORT_PLL_REF_SEL;
1436        I915_WRITE(BXT_PORT_PLL_ENABLE(port), temp);
1437
1438        if (IS_GEMINILAKE(dev_priv)) {
1439                temp = I915_READ(BXT_PORT_PLL_ENABLE(port));
1440                temp |= PORT_PLL_POWER_ENABLE;
1441                I915_WRITE(BXT_PORT_PLL_ENABLE(port), temp);
1442
1443                if (wait_for_us((I915_READ(BXT_PORT_PLL_ENABLE(port)) &
1444                                 PORT_PLL_POWER_STATE), 200))
1445                        DRM_ERROR("Power state not set for PLL:%d\n", port);
1446        }
1447
1448        /* Disable 10 bit clock */
1449        temp = I915_READ(BXT_PORT_PLL_EBB_4(phy, ch));
1450        temp &= ~PORT_PLL_10BIT_CLK_ENABLE;
1451        I915_WRITE(BXT_PORT_PLL_EBB_4(phy, ch), temp);
1452
1453        /* Write P1 & P2 */
1454        temp = I915_READ(BXT_PORT_PLL_EBB_0(phy, ch));
1455        temp &= ~(PORT_PLL_P1_MASK | PORT_PLL_P2_MASK);
1456        temp |= pll->state.hw_state.ebb0;
1457        I915_WRITE(BXT_PORT_PLL_EBB_0(phy, ch), temp);
1458
1459        /* Write M2 integer */
1460        temp = I915_READ(BXT_PORT_PLL(phy, ch, 0));
1461        temp &= ~PORT_PLL_M2_MASK;
1462        temp |= pll->state.hw_state.pll0;
1463        I915_WRITE(BXT_PORT_PLL(phy, ch, 0), temp);
1464
1465        /* Write N */
1466        temp = I915_READ(BXT_PORT_PLL(phy, ch, 1));
1467        temp &= ~PORT_PLL_N_MASK;
1468        temp |= pll->state.hw_state.pll1;
1469        I915_WRITE(BXT_PORT_PLL(phy, ch, 1), temp);
1470
1471        /* Write M2 fraction */
1472        temp = I915_READ(BXT_PORT_PLL(phy, ch, 2));
1473        temp &= ~PORT_PLL_M2_FRAC_MASK;
1474        temp |= pll->state.hw_state.pll2;
1475        I915_WRITE(BXT_PORT_PLL(phy, ch, 2), temp);
1476
1477        /* Write M2 fraction enable */
1478        temp = I915_READ(BXT_PORT_PLL(phy, ch, 3));
1479        temp &= ~PORT_PLL_M2_FRAC_ENABLE;
1480        temp |= pll->state.hw_state.pll3;
1481        I915_WRITE(BXT_PORT_PLL(phy, ch, 3), temp);
1482
1483        /* Write coeff */
1484        temp = I915_READ(BXT_PORT_PLL(phy, ch, 6));
1485        temp &= ~PORT_PLL_PROP_COEFF_MASK;
1486        temp &= ~PORT_PLL_INT_COEFF_MASK;
1487        temp &= ~PORT_PLL_GAIN_CTL_MASK;
1488        temp |= pll->state.hw_state.pll6;
1489        I915_WRITE(BXT_PORT_PLL(phy, ch, 6), temp);
1490
1491        /* Write calibration val */
1492        temp = I915_READ(BXT_PORT_PLL(phy, ch, 8));
1493        temp &= ~PORT_PLL_TARGET_CNT_MASK;
1494        temp |= pll->state.hw_state.pll8;
1495        I915_WRITE(BXT_PORT_PLL(phy, ch, 8), temp);
1496
1497        temp = I915_READ(BXT_PORT_PLL(phy, ch, 9));
1498        temp &= ~PORT_PLL_LOCK_THRESHOLD_MASK;
1499        temp |= pll->state.hw_state.pll9;
1500        I915_WRITE(BXT_PORT_PLL(phy, ch, 9), temp);
1501
1502        temp = I915_READ(BXT_PORT_PLL(phy, ch, 10));
1503        temp &= ~PORT_PLL_DCO_AMP_OVR_EN_H;
1504        temp &= ~PORT_PLL_DCO_AMP_MASK;
1505        temp |= pll->state.hw_state.pll10;
1506        I915_WRITE(BXT_PORT_PLL(phy, ch, 10), temp);
1507
1508        /* Recalibrate with new settings */
1509        temp = I915_READ(BXT_PORT_PLL_EBB_4(phy, ch));
1510        temp |= PORT_PLL_RECALIBRATE;
1511        I915_WRITE(BXT_PORT_PLL_EBB_4(phy, ch), temp);
1512        temp &= ~PORT_PLL_10BIT_CLK_ENABLE;
1513        temp |= pll->state.hw_state.ebb4;
1514        I915_WRITE(BXT_PORT_PLL_EBB_4(phy, ch), temp);
1515
1516        /* Enable PLL */
1517        temp = I915_READ(BXT_PORT_PLL_ENABLE(port));
1518        temp |= PORT_PLL_ENABLE;
1519        I915_WRITE(BXT_PORT_PLL_ENABLE(port), temp);
1520        POSTING_READ(BXT_PORT_PLL_ENABLE(port));
1521
1522        if (wait_for_us((I915_READ(BXT_PORT_PLL_ENABLE(port)) & PORT_PLL_LOCK),
1523                        200))
1524                DRM_ERROR("PLL %d not locked\n", port);
1525
1526        if (IS_GEMINILAKE(dev_priv)) {
1527                temp = I915_READ(BXT_PORT_TX_DW5_LN0(phy, ch));
1528                temp |= DCC_DELAY_RANGE_2;
1529                I915_WRITE(BXT_PORT_TX_DW5_GRP(phy, ch), temp);
1530        }
1531
1532        /*
1533         * While we write to the group register to program all lanes at once we
1534         * can read only lane registers and we pick lanes 0/1 for that.
1535         */
1536        temp = I915_READ(BXT_PORT_PCS_DW12_LN01(phy, ch));
1537        temp &= ~LANE_STAGGER_MASK;
1538        temp &= ~LANESTAGGER_STRAP_OVRD;
1539        temp |= pll->state.hw_state.pcsdw12;
1540        I915_WRITE(BXT_PORT_PCS_DW12_GRP(phy, ch), temp);
1541}
1542
1543static void bxt_ddi_pll_disable(struct drm_i915_private *dev_priv,
1544                                        struct intel_shared_dpll *pll)
1545{
1546        enum port port = (enum port)pll->id;    /* 1:1 port->PLL mapping */
1547        uint32_t temp;
1548
1549        temp = I915_READ(BXT_PORT_PLL_ENABLE(port));
1550        temp &= ~PORT_PLL_ENABLE;
1551        I915_WRITE(BXT_PORT_PLL_ENABLE(port), temp);
1552        POSTING_READ(BXT_PORT_PLL_ENABLE(port));
1553
1554        if (IS_GEMINILAKE(dev_priv)) {
1555                temp = I915_READ(BXT_PORT_PLL_ENABLE(port));
1556                temp &= ~PORT_PLL_POWER_ENABLE;
1557                I915_WRITE(BXT_PORT_PLL_ENABLE(port), temp);
1558
1559                if (wait_for_us(!(I915_READ(BXT_PORT_PLL_ENABLE(port)) &
1560                                PORT_PLL_POWER_STATE), 200))
1561                        DRM_ERROR("Power state not reset for PLL:%d\n", port);
1562        }
1563}
1564
1565static bool bxt_ddi_pll_get_hw_state(struct drm_i915_private *dev_priv,
1566                                        struct intel_shared_dpll *pll,
1567                                        struct intel_dpll_hw_state *hw_state)
1568{
1569        enum port port = (enum port)pll->id;    /* 1:1 port->PLL mapping */
1570        uint32_t val;
1571        bool ret;
1572        enum dpio_phy phy;
1573        enum dpio_channel ch;
1574
1575        bxt_port_to_phy_channel(dev_priv, port, &phy, &ch);
1576
1577        if (!intel_display_power_get_if_enabled(dev_priv, POWER_DOMAIN_PLLS))
1578                return false;
1579
1580        ret = false;
1581
1582        val = I915_READ(BXT_PORT_PLL_ENABLE(port));
1583        if (!(val & PORT_PLL_ENABLE))
1584                goto out;
1585
1586        hw_state->ebb0 = I915_READ(BXT_PORT_PLL_EBB_0(phy, ch));
1587        hw_state->ebb0 &= PORT_PLL_P1_MASK | PORT_PLL_P2_MASK;
1588
1589        hw_state->ebb4 = I915_READ(BXT_PORT_PLL_EBB_4(phy, ch));
1590        hw_state->ebb4 &= PORT_PLL_10BIT_CLK_ENABLE;
1591
1592        hw_state->pll0 = I915_READ(BXT_PORT_PLL(phy, ch, 0));
1593        hw_state->pll0 &= PORT_PLL_M2_MASK;
1594
1595        hw_state->pll1 = I915_READ(BXT_PORT_PLL(phy, ch, 1));
1596        hw_state->pll1 &= PORT_PLL_N_MASK;
1597
1598        hw_state->pll2 = I915_READ(BXT_PORT_PLL(phy, ch, 2));
1599        hw_state->pll2 &= PORT_PLL_M2_FRAC_MASK;
1600
1601        hw_state->pll3 = I915_READ(BXT_PORT_PLL(phy, ch, 3));
1602        hw_state->pll3 &= PORT_PLL_M2_FRAC_ENABLE;
1603
1604        hw_state->pll6 = I915_READ(BXT_PORT_PLL(phy, ch, 6));
1605        hw_state->pll6 &= PORT_PLL_PROP_COEFF_MASK |
1606                          PORT_PLL_INT_COEFF_MASK |
1607                          PORT_PLL_GAIN_CTL_MASK;
1608
1609        hw_state->pll8 = I915_READ(BXT_PORT_PLL(phy, ch, 8));
1610        hw_state->pll8 &= PORT_PLL_TARGET_CNT_MASK;
1611
1612        hw_state->pll9 = I915_READ(BXT_PORT_PLL(phy, ch, 9));
1613        hw_state->pll9 &= PORT_PLL_LOCK_THRESHOLD_MASK;
1614
1615        hw_state->pll10 = I915_READ(BXT_PORT_PLL(phy, ch, 10));
1616        hw_state->pll10 &= PORT_PLL_DCO_AMP_OVR_EN_H |
1617                           PORT_PLL_DCO_AMP_MASK;
1618
1619        /*
1620         * While we write to the group register to program all lanes at once we
1621         * can read only lane registers. We configure all lanes the same way, so
1622         * here just read out lanes 0/1 and output a note if lanes 2/3 differ.
1623         */
1624        hw_state->pcsdw12 = I915_READ(BXT_PORT_PCS_DW12_LN01(phy, ch));
1625        if (I915_READ(BXT_PORT_PCS_DW12_LN23(phy, ch)) != hw_state->pcsdw12)
1626                DRM_DEBUG_DRIVER("lane stagger config different for lane 01 (%08x) and 23 (%08x)\n",
1627                                 hw_state->pcsdw12,
1628                                 I915_READ(BXT_PORT_PCS_DW12_LN23(phy, ch)));
1629        hw_state->pcsdw12 &= LANE_STAGGER_MASK | LANESTAGGER_STRAP_OVRD;
1630
1631        ret = true;
1632
1633out:
1634        intel_display_power_put(dev_priv, POWER_DOMAIN_PLLS);
1635
1636        return ret;
1637}
1638
1639/* bxt clock parameters */
1640struct bxt_clk_div {
1641        int clock;
1642        uint32_t p1;
1643        uint32_t p2;
1644        uint32_t m2_int;
1645        uint32_t m2_frac;
1646        bool m2_frac_en;
1647        uint32_t n;
1648
1649        int vco;
1650};
1651
1652/* pre-calculated values for DP linkrates */
1653static const struct bxt_clk_div bxt_dp_clk_val[] = {
1654        {162000, 4, 2, 32, 1677722, 1, 1},
1655        {270000, 4, 1, 27,       0, 0, 1},
1656        {540000, 2, 1, 27,       0, 0, 1},
1657        {216000, 3, 2, 32, 1677722, 1, 1},
1658        {243000, 4, 1, 24, 1258291, 1, 1},
1659        {324000, 4, 1, 32, 1677722, 1, 1},
1660        {432000, 3, 1, 32, 1677722, 1, 1}
1661};
1662
1663static bool
1664bxt_ddi_hdmi_pll_dividers(struct intel_crtc *intel_crtc,
1665                          struct intel_crtc_state *crtc_state, int clock,
1666                          struct bxt_clk_div *clk_div)
1667{
1668        struct dpll best_clock;
1669
1670        /* Calculate HDMI div */
1671        /*
1672         * FIXME: tie the following calculation into
1673         * i9xx_crtc_compute_clock
1674         */
1675        if (!bxt_find_best_dpll(crtc_state, clock, &best_clock)) {
1676                DRM_DEBUG_DRIVER("no PLL dividers found for clock %d pipe %c\n",
1677                                 clock, pipe_name(intel_crtc->pipe));
1678                return false;
1679        }
1680
1681        clk_div->p1 = best_clock.p1;
1682        clk_div->p2 = best_clock.p2;
1683        WARN_ON(best_clock.m1 != 2);
1684        clk_div->n = best_clock.n;
1685        clk_div->m2_int = best_clock.m2 >> 22;
1686        clk_div->m2_frac = best_clock.m2 & ((1 << 22) - 1);
1687        clk_div->m2_frac_en = clk_div->m2_frac != 0;
1688
1689        clk_div->vco = best_clock.vco;
1690
1691        return true;
1692}
1693
1694static void bxt_ddi_dp_pll_dividers(int clock, struct bxt_clk_div *clk_div)
1695{
1696        int i;
1697
1698        *clk_div = bxt_dp_clk_val[0];
1699        for (i = 0; i < ARRAY_SIZE(bxt_dp_clk_val); ++i) {
1700                if (bxt_dp_clk_val[i].clock == clock) {
1701                        *clk_div = bxt_dp_clk_val[i];
1702                        break;
1703                }
1704        }
1705
1706        clk_div->vco = clock * 10 / 2 * clk_div->p1 * clk_div->p2;
1707}
1708
1709static bool bxt_ddi_set_dpll_hw_state(int clock,
1710                          struct bxt_clk_div *clk_div,
1711                          struct intel_dpll_hw_state *dpll_hw_state)
1712{
1713        int vco = clk_div->vco;
1714        uint32_t prop_coef, int_coef, gain_ctl, targ_cnt;
1715        uint32_t lanestagger;
1716
1717        if (vco >= 6200000 && vco <= 6700000) {
1718                prop_coef = 4;
1719                int_coef = 9;
1720                gain_ctl = 3;
1721                targ_cnt = 8;
1722        } else if ((vco > 5400000 && vco < 6200000) ||
1723                        (vco >= 4800000 && vco < 5400000)) {
1724                prop_coef = 5;
1725                int_coef = 11;
1726                gain_ctl = 3;
1727                targ_cnt = 9;
1728        } else if (vco == 5400000) {
1729                prop_coef = 3;
1730                int_coef = 8;
1731                gain_ctl = 1;
1732                targ_cnt = 9;
1733        } else {
1734                DRM_ERROR("Invalid VCO\n");
1735                return false;
1736        }
1737
1738        if (clock > 270000)
1739                lanestagger = 0x18;
1740        else if (clock > 135000)
1741                lanestagger = 0x0d;
1742        else if (clock > 67000)
1743                lanestagger = 0x07;
1744        else if (clock > 33000)
1745                lanestagger = 0x04;
1746        else
1747                lanestagger = 0x02;
1748
1749        dpll_hw_state->ebb0 = PORT_PLL_P1(clk_div->p1) | PORT_PLL_P2(clk_div->p2);
1750        dpll_hw_state->pll0 = clk_div->m2_int;
1751        dpll_hw_state->pll1 = PORT_PLL_N(clk_div->n);
1752        dpll_hw_state->pll2 = clk_div->m2_frac;
1753
1754        if (clk_div->m2_frac_en)
1755                dpll_hw_state->pll3 = PORT_PLL_M2_FRAC_ENABLE;
1756
1757        dpll_hw_state->pll6 = prop_coef | PORT_PLL_INT_COEFF(int_coef);
1758        dpll_hw_state->pll6 |= PORT_PLL_GAIN_CTL(gain_ctl);
1759
1760        dpll_hw_state->pll8 = targ_cnt;
1761
1762        dpll_hw_state->pll9 = 5 << PORT_PLL_LOCK_THRESHOLD_SHIFT;
1763
1764        dpll_hw_state->pll10 =
1765                PORT_PLL_DCO_AMP(PORT_PLL_DCO_AMP_DEFAULT)
1766                | PORT_PLL_DCO_AMP_OVR_EN_H;
1767
1768        dpll_hw_state->ebb4 = PORT_PLL_10BIT_CLK_ENABLE;
1769
1770        dpll_hw_state->pcsdw12 = LANESTAGGER_STRAP_OVRD | lanestagger;
1771
1772        return true;
1773}
1774
1775static bool
1776bxt_ddi_dp_set_dpll_hw_state(int clock,
1777                             struct intel_dpll_hw_state *dpll_hw_state)
1778{
1779        struct bxt_clk_div clk_div = {0};
1780
1781        bxt_ddi_dp_pll_dividers(clock, &clk_div);
1782
1783        return bxt_ddi_set_dpll_hw_state(clock, &clk_div, dpll_hw_state);
1784}
1785
1786static bool
1787bxt_ddi_hdmi_set_dpll_hw_state(struct intel_crtc *intel_crtc,
1788                               struct intel_crtc_state *crtc_state, int clock,
1789                               struct intel_dpll_hw_state *dpll_hw_state)
1790{
1791        struct bxt_clk_div clk_div = { };
1792
1793        bxt_ddi_hdmi_pll_dividers(intel_crtc, crtc_state, clock, &clk_div);
1794
1795        return bxt_ddi_set_dpll_hw_state(clock, &clk_div, dpll_hw_state);
1796}
1797
1798static struct intel_shared_dpll *
1799bxt_get_dpll(struct intel_crtc *crtc,
1800                struct intel_crtc_state *crtc_state,
1801                struct intel_encoder *encoder)
1802{
1803        struct intel_dpll_hw_state dpll_hw_state = { };
1804        struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
1805        struct intel_shared_dpll *pll;
1806        int i, clock = crtc_state->port_clock;
1807
1808        if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_HDMI) &&
1809            !bxt_ddi_hdmi_set_dpll_hw_state(crtc, crtc_state, clock,
1810                                            &dpll_hw_state))
1811                return NULL;
1812
1813        if (intel_crtc_has_dp_encoder(crtc_state) &&
1814            !bxt_ddi_dp_set_dpll_hw_state(clock, &dpll_hw_state))
1815                return NULL;
1816
1817        memset(&crtc_state->dpll_hw_state, 0,
1818               sizeof(crtc_state->dpll_hw_state));
1819
1820        crtc_state->dpll_hw_state = dpll_hw_state;
1821
1822        /* 1:1 mapping between ports and PLLs */
1823        i = (enum intel_dpll_id) encoder->port;
1824        pll = intel_get_shared_dpll_by_id(dev_priv, i);
1825
1826        DRM_DEBUG_KMS("[CRTC:%d:%s] using pre-allocated %s\n",
1827                      crtc->base.base.id, crtc->base.name, pll->name);
1828
1829        intel_reference_shared_dpll(pll, crtc_state);
1830
1831        return pll;
1832}
1833
1834static void bxt_dump_hw_state(struct drm_i915_private *dev_priv,
1835                              struct intel_dpll_hw_state *hw_state)
1836{
1837        DRM_DEBUG_KMS("dpll_hw_state: ebb0: 0x%x, ebb4: 0x%x,"
1838                      "pll0: 0x%x, pll1: 0x%x, pll2: 0x%x, pll3: 0x%x, "
1839                      "pll6: 0x%x, pll8: 0x%x, pll9: 0x%x, pll10: 0x%x, pcsdw12: 0x%x\n",
1840                      hw_state->ebb0,
1841                      hw_state->ebb4,
1842                      hw_state->pll0,
1843                      hw_state->pll1,
1844                      hw_state->pll2,
1845                      hw_state->pll3,
1846                      hw_state->pll6,
1847                      hw_state->pll8,
1848                      hw_state->pll9,
1849                      hw_state->pll10,
1850                      hw_state->pcsdw12);
1851}
1852
1853static const struct intel_shared_dpll_funcs bxt_ddi_pll_funcs = {
1854        .enable = bxt_ddi_pll_enable,
1855        .disable = bxt_ddi_pll_disable,
1856        .get_hw_state = bxt_ddi_pll_get_hw_state,
1857};
1858
1859static void intel_ddi_pll_init(struct drm_device *dev)
1860{
1861        struct drm_i915_private *dev_priv = to_i915(dev);
1862
1863        if (INTEL_GEN(dev_priv) < 9) {
1864                uint32_t val = I915_READ(LCPLL_CTL);
1865
1866                /*
1867                 * The LCPLL register should be turned on by the BIOS. For now
1868                 * let's just check its state and print errors in case
1869                 * something is wrong.  Don't even try to turn it on.
1870                 */
1871
1872                if (val & LCPLL_CD_SOURCE_FCLK)
1873                        DRM_ERROR("CDCLK source is not LCPLL\n");
1874
1875                if (val & LCPLL_PLL_DISABLE)
1876                        DRM_ERROR("LCPLL is disabled\n");
1877        }
1878}
1879
1880struct dpll_info {
1881        const char *name;
1882        const int id;
1883        const struct intel_shared_dpll_funcs *funcs;
1884        uint32_t flags;
1885};
1886
1887struct intel_dpll_mgr {
1888        const struct dpll_info *dpll_info;
1889
1890        struct intel_shared_dpll *(*get_dpll)(struct intel_crtc *crtc,
1891                                              struct intel_crtc_state *crtc_state,
1892                                              struct intel_encoder *encoder);
1893
1894        void (*dump_hw_state)(struct drm_i915_private *dev_priv,
1895                              struct intel_dpll_hw_state *hw_state);
1896};
1897
1898static const struct dpll_info pch_plls[] = {
1899        { "PCH DPLL A", DPLL_ID_PCH_PLL_A, &ibx_pch_dpll_funcs, 0 },
1900        { "PCH DPLL B", DPLL_ID_PCH_PLL_B, &ibx_pch_dpll_funcs, 0 },
1901        { NULL, -1, NULL, 0 },
1902};
1903
1904static const struct intel_dpll_mgr pch_pll_mgr = {
1905        .dpll_info = pch_plls,
1906        .get_dpll = ibx_get_dpll,
1907        .dump_hw_state = ibx_dump_hw_state,
1908};
1909
1910static const struct dpll_info hsw_plls[] = {
1911        { "WRPLL 1",    DPLL_ID_WRPLL1,     &hsw_ddi_wrpll_funcs, 0 },
1912        { "WRPLL 2",    DPLL_ID_WRPLL2,     &hsw_ddi_wrpll_funcs, 0 },
1913        { "SPLL",       DPLL_ID_SPLL,       &hsw_ddi_spll_funcs,  0 },
1914        { "LCPLL 810",  DPLL_ID_LCPLL_810,  &hsw_ddi_lcpll_funcs, INTEL_DPLL_ALWAYS_ON },
1915        { "LCPLL 1350", DPLL_ID_LCPLL_1350, &hsw_ddi_lcpll_funcs, INTEL_DPLL_ALWAYS_ON },
1916        { "LCPLL 2700", DPLL_ID_LCPLL_2700, &hsw_ddi_lcpll_funcs, INTEL_DPLL_ALWAYS_ON },
1917        { NULL, -1, NULL, },
1918};
1919
1920static const struct intel_dpll_mgr hsw_pll_mgr = {
1921        .dpll_info = hsw_plls,
1922        .get_dpll = hsw_get_dpll,
1923        .dump_hw_state = hsw_dump_hw_state,
1924};
1925
1926static const struct dpll_info skl_plls[] = {
1927        { "DPLL 0", DPLL_ID_SKL_DPLL0, &skl_ddi_dpll0_funcs, INTEL_DPLL_ALWAYS_ON },
1928        { "DPLL 1", DPLL_ID_SKL_DPLL1, &skl_ddi_pll_funcs,   0 },
1929        { "DPLL 2", DPLL_ID_SKL_DPLL2, &skl_ddi_pll_funcs,   0 },
1930        { "DPLL 3", DPLL_ID_SKL_DPLL3, &skl_ddi_pll_funcs,   0 },
1931        { NULL, -1, NULL, },
1932};
1933
1934static const struct intel_dpll_mgr skl_pll_mgr = {
1935        .dpll_info = skl_plls,
1936        .get_dpll = skl_get_dpll,
1937        .dump_hw_state = skl_dump_hw_state,
1938};
1939
1940static const struct dpll_info bxt_plls[] = {
1941        { "PORT PLL A", DPLL_ID_SKL_DPLL0, &bxt_ddi_pll_funcs, 0 },
1942        { "PORT PLL B", DPLL_ID_SKL_DPLL1, &bxt_ddi_pll_funcs, 0 },
1943        { "PORT PLL C", DPLL_ID_SKL_DPLL2, &bxt_ddi_pll_funcs, 0 },
1944        { NULL, -1, NULL, },
1945};
1946
1947static const struct intel_dpll_mgr bxt_pll_mgr = {
1948        .dpll_info = bxt_plls,
1949        .get_dpll = bxt_get_dpll,
1950        .dump_hw_state = bxt_dump_hw_state,
1951};
1952
1953static void cnl_ddi_pll_enable(struct drm_i915_private *dev_priv,
1954                               struct intel_shared_dpll *pll)
1955{
1956        uint32_t val;
1957
1958        /* 1. Enable DPLL power in DPLL_ENABLE. */
1959        val = I915_READ(CNL_DPLL_ENABLE(pll->id));
1960        val |= PLL_POWER_ENABLE;
1961        I915_WRITE(CNL_DPLL_ENABLE(pll->id), val);
1962
1963        /* 2. Wait for DPLL power state enabled in DPLL_ENABLE. */
1964        if (intel_wait_for_register(dev_priv,
1965                                    CNL_DPLL_ENABLE(pll->id),
1966                                    PLL_POWER_STATE,
1967                                    PLL_POWER_STATE,
1968                                    5))
1969                DRM_ERROR("PLL %d Power not enabled\n", pll->id);
1970
1971        /*
1972         * 3. Configure DPLL_CFGCR0 to set SSC enable/disable,
1973         * select DP mode, and set DP link rate.
1974         */
1975        val = pll->state.hw_state.cfgcr0;
1976        I915_WRITE(CNL_DPLL_CFGCR0(pll->id), val);
1977
1978        /* 4. Reab back to ensure writes completed */
1979        POSTING_READ(CNL_DPLL_CFGCR0(pll->id));
1980
1981        /* 3. Configure DPLL_CFGCR0 */
1982        /* Avoid touch CFGCR1 if HDMI mode is not enabled */
1983        if (pll->state.hw_state.cfgcr0 & DPLL_CFGCR0_HDMI_MODE) {
1984                val = pll->state.hw_state.cfgcr1;
1985                I915_WRITE(CNL_DPLL_CFGCR1(pll->id), val);
1986                /* 4. Reab back to ensure writes completed */
1987                POSTING_READ(CNL_DPLL_CFGCR1(pll->id));
1988        }
1989
1990        /*
1991         * 5. If the frequency will result in a change to the voltage
1992         * requirement, follow the Display Voltage Frequency Switching
1993         * Sequence Before Frequency Change
1994         *
1995         * Note: DVFS is actually handled via the cdclk code paths,
1996         * hence we do nothing here.
1997         */
1998
1999        /* 6. Enable DPLL in DPLL_ENABLE. */
2000        val = I915_READ(CNL_DPLL_ENABLE(pll->id));
2001        val |= PLL_ENABLE;
2002        I915_WRITE(CNL_DPLL_ENABLE(pll->id), val);
2003
2004        /* 7. Wait for PLL lock status in DPLL_ENABLE. */
2005        if (intel_wait_for_register(dev_priv,
2006                                    CNL_DPLL_ENABLE(pll->id),
2007                                    PLL_LOCK,
2008                                    PLL_LOCK,
2009                                    5))
2010                DRM_ERROR("PLL %d not locked\n", pll->id);
2011
2012        /*
2013         * 8. If the frequency will result in a change to the voltage
2014         * requirement, follow the Display Voltage Frequency Switching
2015         * Sequence After Frequency Change
2016         *
2017         * Note: DVFS is actually handled via the cdclk code paths,
2018         * hence we do nothing here.
2019         */
2020
2021        /*
2022         * 9. turn on the clock for the DDI and map the DPLL to the DDI
2023         * Done at intel_ddi_clk_select
2024         */
2025}
2026
2027static void cnl_ddi_pll_disable(struct drm_i915_private *dev_priv,
2028                                struct intel_shared_dpll *pll)
2029{
2030        uint32_t val;
2031
2032        /*
2033         * 1. Configure DPCLKA_CFGCR0 to turn off the clock for the DDI.
2034         * Done at intel_ddi_post_disable
2035         */
2036
2037        /*
2038         * 2. If the frequency will result in a change to the voltage
2039         * requirement, follow the Display Voltage Frequency Switching
2040         * Sequence Before Frequency Change
2041         *
2042         * Note: DVFS is actually handled via the cdclk code paths,
2043         * hence we do nothing here.
2044         */
2045
2046        /* 3. Disable DPLL through DPLL_ENABLE. */
2047        val = I915_READ(CNL_DPLL_ENABLE(pll->id));
2048        val &= ~PLL_ENABLE;
2049        I915_WRITE(CNL_DPLL_ENABLE(pll->id), val);
2050
2051        /* 4. Wait for PLL not locked status in DPLL_ENABLE. */
2052        if (intel_wait_for_register(dev_priv,
2053                                    CNL_DPLL_ENABLE(pll->id),
2054                                    PLL_LOCK,
2055                                    0,
2056                                    5))
2057                DRM_ERROR("PLL %d locked\n", pll->id);
2058
2059        /*
2060         * 5. If the frequency will result in a change to the voltage
2061         * requirement, follow the Display Voltage Frequency Switching
2062         * Sequence After Frequency Change
2063         *
2064         * Note: DVFS is actually handled via the cdclk code paths,
2065         * hence we do nothing here.
2066         */
2067
2068        /* 6. Disable DPLL power in DPLL_ENABLE. */
2069        val = I915_READ(CNL_DPLL_ENABLE(pll->id));
2070        val &= ~PLL_POWER_ENABLE;
2071        I915_WRITE(CNL_DPLL_ENABLE(pll->id), val);
2072
2073        /* 7. Wait for DPLL power state disabled in DPLL_ENABLE. */
2074        if (intel_wait_for_register(dev_priv,
2075                                    CNL_DPLL_ENABLE(pll->id),
2076                                    PLL_POWER_STATE,
2077                                    0,
2078                                    5))
2079                DRM_ERROR("PLL %d Power not disabled\n", pll->id);
2080}
2081
2082static bool cnl_ddi_pll_get_hw_state(struct drm_i915_private *dev_priv,
2083                                     struct intel_shared_dpll *pll,
2084                                     struct intel_dpll_hw_state *hw_state)
2085{
2086        uint32_t val;
2087        bool ret;
2088
2089        if (!intel_display_power_get_if_enabled(dev_priv, POWER_DOMAIN_PLLS))
2090                return false;
2091
2092        ret = false;
2093
2094        val = I915_READ(CNL_DPLL_ENABLE(pll->id));
2095        if (!(val & PLL_ENABLE))
2096                goto out;
2097
2098        val = I915_READ(CNL_DPLL_CFGCR0(pll->id));
2099        hw_state->cfgcr0 = val;
2100
2101        /* avoid reading back stale values if HDMI mode is not enabled */
2102        if (val & DPLL_CFGCR0_HDMI_MODE) {
2103                hw_state->cfgcr1 = I915_READ(CNL_DPLL_CFGCR1(pll->id));
2104        }
2105        ret = true;
2106
2107out:
2108        intel_display_power_put(dev_priv, POWER_DOMAIN_PLLS);
2109
2110        return ret;
2111}
2112
2113static void cnl_wrpll_get_multipliers(int bestdiv, int *pdiv,
2114                                      int *qdiv, int *kdiv)
2115{
2116        /* even dividers */
2117        if (bestdiv % 2 == 0) {
2118                if (bestdiv == 2) {
2119                        *pdiv = 2;
2120                        *qdiv = 1;
2121                        *kdiv = 1;
2122                } else if (bestdiv % 4 == 0) {
2123                        *pdiv = 2;
2124                        *qdiv = bestdiv / 4;
2125                        *kdiv = 2;
2126                } else if (bestdiv % 6 == 0) {
2127                        *pdiv = 3;
2128                        *qdiv = bestdiv / 6;
2129                        *kdiv = 2;
2130                } else if (bestdiv % 5 == 0) {
2131                        *pdiv = 5;
2132                        *qdiv = bestdiv / 10;
2133                        *kdiv = 2;
2134                } else if (bestdiv % 14 == 0) {
2135                        *pdiv = 7;
2136                        *qdiv = bestdiv / 14;
2137                        *kdiv = 2;
2138                }
2139        } else {
2140                if (bestdiv == 3 || bestdiv == 5 || bestdiv == 7) {
2141                        *pdiv = bestdiv;
2142                        *qdiv = 1;
2143                        *kdiv = 1;
2144                } else { /* 9, 15, 21 */
2145                        *pdiv = bestdiv / 3;
2146                        *qdiv = 1;
2147                        *kdiv = 3;
2148                }
2149        }
2150}
2151
2152static void cnl_wrpll_params_populate(struct skl_wrpll_params *params,
2153                                      u32 dco_freq, u32 ref_freq,
2154                                      int pdiv, int qdiv, int kdiv)
2155{
2156        u32 dco;
2157
2158        switch (kdiv) {
2159        case 1:
2160                params->kdiv = 1;
2161                break;
2162        case 2:
2163                params->kdiv = 2;
2164                break;
2165        case 3:
2166                params->kdiv = 4;
2167                break;
2168        default:
2169                WARN(1, "Incorrect KDiv\n");
2170        }
2171
2172        switch (pdiv) {
2173        case 2:
2174                params->pdiv = 1;
2175                break;
2176        case 3:
2177                params->pdiv = 2;
2178                break;
2179        case 5:
2180                params->pdiv = 4;
2181                break;
2182        case 7:
2183                params->pdiv = 8;
2184                break;
2185        default:
2186                WARN(1, "Incorrect PDiv\n");
2187        }
2188
2189        WARN_ON(kdiv != 2 && qdiv != 1);
2190
2191        params->qdiv_ratio = qdiv;
2192        params->qdiv_mode = (qdiv == 1) ? 0 : 1;
2193
2194        dco = div_u64((u64)dco_freq << 15, ref_freq);
2195
2196        params->dco_integer = dco >> 15;
2197        params->dco_fraction = dco & 0x7fff;
2198}
2199
2200static bool
2201cnl_ddi_calculate_wrpll(int clock,
2202                        struct drm_i915_private *dev_priv,
2203                        struct skl_wrpll_params *wrpll_params)
2204{
2205        u32 afe_clock = clock * 5;
2206        u32 dco_min = 7998000;
2207        u32 dco_max = 10000000;
2208        u32 dco_mid = (dco_min + dco_max) / 2;
2209        static const int dividers[] = {  2,  4,  6,  8, 10, 12,  14,  16,
2210                                         18, 20, 24, 28, 30, 32,  36,  40,
2211                                         42, 44, 48, 50, 52, 54,  56,  60,
2212                                         64, 66, 68, 70, 72, 76,  78,  80,
2213                                         84, 88, 90, 92, 96, 98, 100, 102,
2214                                          3,  5,  7,  9, 15, 21 };
2215        u32 dco, best_dco = 0, dco_centrality = 0;
2216        u32 best_dco_centrality = U32_MAX; /* Spec meaning of 999999 MHz */
2217        int d, best_div = 0, pdiv = 0, qdiv = 0, kdiv = 0;
2218
2219        for (d = 0; d < ARRAY_SIZE(dividers); d++) {
2220                dco = afe_clock * dividers[d];
2221
2222                if ((dco <= dco_max) && (dco >= dco_min)) {
2223                        dco_centrality = abs(dco - dco_mid);
2224
2225                        if (dco_centrality < best_dco_centrality) {
2226                                best_dco_centrality = dco_centrality;
2227                                best_div = dividers[d];
2228                                best_dco = dco;
2229                        }
2230                }
2231        }
2232
2233        if (best_div == 0)
2234                return false;
2235
2236        cnl_wrpll_get_multipliers(best_div, &pdiv, &qdiv, &kdiv);
2237
2238        cnl_wrpll_params_populate(wrpll_params, best_dco,
2239                                  dev_priv->cdclk.hw.ref, pdiv, qdiv, kdiv);
2240
2241        return true;
2242}
2243
2244static bool cnl_ddi_hdmi_pll_dividers(struct intel_crtc *crtc,
2245                                      struct intel_crtc_state *crtc_state,
2246                                      int clock)
2247{
2248        struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
2249        uint32_t cfgcr0, cfgcr1;
2250        struct skl_wrpll_params wrpll_params = { 0, };
2251
2252        cfgcr0 = DPLL_CFGCR0_HDMI_MODE;
2253
2254        if (!cnl_ddi_calculate_wrpll(clock, dev_priv, &wrpll_params))
2255                return false;
2256
2257        cfgcr0 |= DPLL_CFGCR0_DCO_FRACTION(wrpll_params.dco_fraction) |
2258                wrpll_params.dco_integer;
2259
2260        cfgcr1 = DPLL_CFGCR1_QDIV_RATIO(wrpll_params.qdiv_ratio) |
2261                DPLL_CFGCR1_QDIV_MODE(wrpll_params.qdiv_mode) |
2262                DPLL_CFGCR1_KDIV(wrpll_params.kdiv) |
2263                DPLL_CFGCR1_PDIV(wrpll_params.pdiv) |
2264                DPLL_CFGCR1_CENTRAL_FREQ;
2265
2266        memset(&crtc_state->dpll_hw_state, 0,
2267               sizeof(crtc_state->dpll_hw_state));
2268
2269        crtc_state->dpll_hw_state.cfgcr0 = cfgcr0;
2270        crtc_state->dpll_hw_state.cfgcr1 = cfgcr1;
2271        return true;
2272}
2273
2274static bool
2275cnl_ddi_dp_set_dpll_hw_state(int clock,
2276                             struct intel_dpll_hw_state *dpll_hw_state)
2277{
2278        uint32_t cfgcr0;
2279
2280        cfgcr0 = DPLL_CFGCR0_SSC_ENABLE;
2281
2282        switch (clock / 2) {
2283        case 81000:
2284                cfgcr0 |= DPLL_CFGCR0_LINK_RATE_810;
2285                break;
2286        case 135000:
2287                cfgcr0 |= DPLL_CFGCR0_LINK_RATE_1350;
2288                break;
2289        case 270000:
2290                cfgcr0 |= DPLL_CFGCR0_LINK_RATE_2700;
2291                break;
2292                /* eDP 1.4 rates */
2293        case 162000:
2294                cfgcr0 |= DPLL_CFGCR0_LINK_RATE_1620;
2295                break;
2296        case 108000:
2297                cfgcr0 |= DPLL_CFGCR0_LINK_RATE_1080;
2298                break;
2299        case 216000:
2300                cfgcr0 |= DPLL_CFGCR0_LINK_RATE_2160;
2301                break;
2302        case 324000:
2303                /* Some SKUs may require elevated I/O voltage to support this */
2304                cfgcr0 |= DPLL_CFGCR0_LINK_RATE_3240;
2305                break;
2306        case 405000:
2307                /* Some SKUs may require elevated I/O voltage to support this */
2308                cfgcr0 |= DPLL_CFGCR0_LINK_RATE_4050;
2309                break;
2310        }
2311
2312        dpll_hw_state->cfgcr0 = cfgcr0;
2313        return true;
2314}
2315
2316static struct intel_shared_dpll *
2317cnl_get_dpll(struct intel_crtc *crtc, struct intel_crtc_state *crtc_state,
2318             struct intel_encoder *encoder)
2319{
2320        struct intel_shared_dpll *pll;
2321        int clock = crtc_state->port_clock;
2322        bool bret;
2323        struct intel_dpll_hw_state dpll_hw_state;
2324
2325        memset(&dpll_hw_state, 0, sizeof(dpll_hw_state));
2326
2327        if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_HDMI)) {
2328                bret = cnl_ddi_hdmi_pll_dividers(crtc, crtc_state, clock);
2329                if (!bret) {
2330                        DRM_DEBUG_KMS("Could not get HDMI pll dividers.\n");
2331                        return NULL;
2332                }
2333        } else if (intel_crtc_has_dp_encoder(crtc_state)) {
2334                bret = cnl_ddi_dp_set_dpll_hw_state(clock, &dpll_hw_state);
2335                if (!bret) {
2336                        DRM_DEBUG_KMS("Could not set DP dpll HW state.\n");
2337                        return NULL;
2338                }
2339                crtc_state->dpll_hw_state = dpll_hw_state;
2340        } else {
2341                DRM_DEBUG_KMS("Skip DPLL setup for output_types 0x%x\n",
2342                              crtc_state->output_types);
2343                return NULL;
2344        }
2345
2346        pll = intel_find_shared_dpll(crtc, crtc_state,
2347                                     DPLL_ID_SKL_DPLL0,
2348                                     DPLL_ID_SKL_DPLL2);
2349        if (!pll) {
2350                DRM_DEBUG_KMS("No PLL selected\n");
2351                return NULL;
2352        }
2353
2354        intel_reference_shared_dpll(pll, crtc_state);
2355
2356        return pll;
2357}
2358
2359static void cnl_dump_hw_state(struct drm_i915_private *dev_priv,
2360                              struct intel_dpll_hw_state *hw_state)
2361{
2362        DRM_DEBUG_KMS("dpll_hw_state: "
2363                      "cfgcr0: 0x%x, cfgcr1: 0x%x\n",
2364                      hw_state->cfgcr0,
2365                      hw_state->cfgcr1);
2366}
2367
2368static const struct intel_shared_dpll_funcs cnl_ddi_pll_funcs = {
2369        .enable = cnl_ddi_pll_enable,
2370        .disable = cnl_ddi_pll_disable,
2371        .get_hw_state = cnl_ddi_pll_get_hw_state,
2372};
2373
2374static const struct dpll_info cnl_plls[] = {
2375        { "DPLL 0", DPLL_ID_SKL_DPLL0, &cnl_ddi_pll_funcs, 0 },
2376        { "DPLL 1", DPLL_ID_SKL_DPLL1, &cnl_ddi_pll_funcs, 0 },
2377        { "DPLL 2", DPLL_ID_SKL_DPLL2, &cnl_ddi_pll_funcs, 0 },
2378        { NULL, -1, NULL, },
2379};
2380
2381static const struct intel_dpll_mgr cnl_pll_mgr = {
2382        .dpll_info = cnl_plls,
2383        .get_dpll = cnl_get_dpll,
2384        .dump_hw_state = cnl_dump_hw_state,
2385};
2386
2387/**
2388 * intel_shared_dpll_init - Initialize shared DPLLs
2389 * @dev: drm device
2390 *
2391 * Initialize shared DPLLs for @dev.
2392 */
2393void intel_shared_dpll_init(struct drm_device *dev)
2394{
2395        struct drm_i915_private *dev_priv = to_i915(dev);
2396        const struct intel_dpll_mgr *dpll_mgr = NULL;
2397        const struct dpll_info *dpll_info;
2398        int i;
2399
2400        if (IS_CANNONLAKE(dev_priv))
2401                dpll_mgr = &cnl_pll_mgr;
2402        else if (IS_GEN9_BC(dev_priv))
2403                dpll_mgr = &skl_pll_mgr;
2404        else if (IS_GEN9_LP(dev_priv))
2405                dpll_mgr = &bxt_pll_mgr;
2406        else if (HAS_DDI(dev_priv))
2407                dpll_mgr = &hsw_pll_mgr;
2408        else if (HAS_PCH_IBX(dev_priv) || HAS_PCH_CPT(dev_priv))
2409                dpll_mgr = &pch_pll_mgr;
2410
2411        if (!dpll_mgr) {
2412                dev_priv->num_shared_dpll = 0;
2413                return;
2414        }
2415
2416        dpll_info = dpll_mgr->dpll_info;
2417
2418        for (i = 0; dpll_info[i].id >= 0; i++) {
2419                WARN_ON(i != dpll_info[i].id);
2420
2421                dev_priv->shared_dplls[i].id = dpll_info[i].id;
2422                dev_priv->shared_dplls[i].name = dpll_info[i].name;
2423                dev_priv->shared_dplls[i].funcs = *dpll_info[i].funcs;
2424                dev_priv->shared_dplls[i].flags = dpll_info[i].flags;
2425        }
2426
2427        dev_priv->dpll_mgr = dpll_mgr;
2428        dev_priv->num_shared_dpll = i;
2429        mutex_init(&dev_priv->dpll_lock);
2430
2431        BUG_ON(dev_priv->num_shared_dpll > I915_NUM_PLLS);
2432
2433        /* FIXME: Move this to a more suitable place */
2434        if (HAS_DDI(dev_priv))
2435                intel_ddi_pll_init(dev);
2436}
2437
2438/**
2439 * intel_get_shared_dpll - get a shared DPLL for CRTC and encoder combination
2440 * @crtc: CRTC
2441 * @crtc_state: atomic state for @crtc
2442 * @encoder: encoder
2443 *
2444 * Find an appropriate DPLL for the given CRTC and encoder combination. A
2445 * reference from the @crtc to the returned pll is registered in the atomic
2446 * state. That configuration is made effective by calling
2447 * intel_shared_dpll_swap_state(). The reference should be released by calling
2448 * intel_release_shared_dpll().
2449 *
2450 * Returns:
2451 * A shared DPLL to be used by @crtc and @encoder with the given @crtc_state.
2452 */
2453struct intel_shared_dpll *
2454intel_get_shared_dpll(struct intel_crtc *crtc,
2455                      struct intel_crtc_state *crtc_state,
2456                      struct intel_encoder *encoder)
2457{
2458        struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
2459        const struct intel_dpll_mgr *dpll_mgr = dev_priv->dpll_mgr;
2460
2461        if (WARN_ON(!dpll_mgr))
2462                return NULL;
2463
2464        return dpll_mgr->get_dpll(crtc, crtc_state, encoder);
2465}
2466
2467/**
2468 * intel_release_shared_dpll - end use of DPLL by CRTC in atomic state
2469 * @dpll: dpll in use by @crtc
2470 * @crtc: crtc
2471 * @state: atomic state
2472 *
2473 * This function releases the reference from @crtc to @dpll from the
2474 * atomic @state. The new configuration is made effective by calling
2475 * intel_shared_dpll_swap_state().
2476 */
2477void intel_release_shared_dpll(struct intel_shared_dpll *dpll,
2478                               struct intel_crtc *crtc,
2479                               struct drm_atomic_state *state)
2480{
2481        struct intel_shared_dpll_state *shared_dpll_state;
2482
2483        shared_dpll_state = intel_atomic_get_shared_dpll_state(state);
2484        shared_dpll_state[dpll->id].crtc_mask &= ~(1 << crtc->pipe);
2485}
2486
2487/**
2488 * intel_shared_dpll_dump_hw_state - write hw_state to dmesg
2489 * @dev_priv: i915 drm device
2490 * @hw_state: hw state to be written to the log
2491 *
2492 * Write the relevant values in @hw_state to dmesg using DRM_DEBUG_KMS.
2493 */
2494void intel_dpll_dump_hw_state(struct drm_i915_private *dev_priv,
2495                              struct intel_dpll_hw_state *hw_state)
2496{
2497        if (dev_priv->dpll_mgr) {
2498                dev_priv->dpll_mgr->dump_hw_state(dev_priv, hw_state);
2499        } else {
2500                /* fallback for platforms that don't use the shared dpll
2501                 * infrastructure
2502                 */
2503                DRM_DEBUG_KMS("dpll_hw_state: dpll: 0x%x, dpll_md: 0x%x, "
2504                              "fp0: 0x%x, fp1: 0x%x\n",
2505                              hw_state->dpll,
2506                              hw_state->dpll_md,
2507                              hw_state->fp0,
2508                              hw_state->fp1);
2509        }
2510}
2511