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 <linux/string_helpers.h> 25 26 #include "intel_de.h" 27 #include "intel_display_types.h" 28 #include "intel_dkl_phy.h" 29 #include "intel_dpio_phy.h" 30 #include "intel_dpll.h" 31 #include "intel_dpll_mgr.h" 32 #include "intel_pch_refclk.h" 33 #include "intel_tc.h" 34 #include "intel_tc_phy_regs.h" 35 36 /** 37 * DOC: Display PLLs 38 * 39 * Display PLLs used for driving outputs vary by platform. While some have 40 * per-pipe or per-encoder dedicated PLLs, others allow the use of any PLL 41 * from a pool. In the latter scenario, it is possible that multiple pipes 42 * share a PLL if their configurations match. 43 * 44 * This file provides an abstraction over display PLLs. The function 45 * intel_shared_dpll_init() initializes the PLLs for the given platform. The 46 * users of a PLL are tracked and that tracking is integrated with the atomic 47 * modset interface. During an atomic operation, required PLLs can be reserved 48 * for a given CRTC and encoder configuration by calling 49 * intel_reserve_shared_dplls() and previously reserved PLLs can be released 50 * with intel_release_shared_dplls(). 51 * Changes to the users are first staged in the atomic state, and then made 52 * effective by calling intel_shared_dpll_swap_state() during the atomic 53 * commit phase. 54 */ 55 56 /* platform specific hooks for managing DPLLs */ 57 struct intel_shared_dpll_funcs { 58 /* 59 * Hook for enabling the pll, called from intel_enable_shared_dpll() if 60 * the pll is not already enabled. 61 */ 62 void (*enable)(struct drm_i915_private *i915, 63 struct intel_shared_dpll *pll); 64 65 /* 66 * Hook for disabling the pll, called from intel_disable_shared_dpll() 67 * only when it is safe to disable the pll, i.e., there are no more 68 * tracked users for it. 69 */ 70 void (*disable)(struct drm_i915_private *i915, 71 struct intel_shared_dpll *pll); 72 73 /* 74 * Hook for reading the values currently programmed to the DPLL 75 * registers. This is used for initial hw state readout and state 76 * verification after a mode set. 77 */ 78 bool (*get_hw_state)(struct drm_i915_private *i915, 79 struct intel_shared_dpll *pll, 80 struct intel_dpll_hw_state *hw_state); 81 82 /* 83 * Hook for calculating the pll's output frequency based on its passed 84 * in state. 85 */ 86 int (*get_freq)(struct drm_i915_private *i915, 87 const struct intel_shared_dpll *pll, 88 const struct intel_dpll_hw_state *pll_state); 89 }; 90 91 struct intel_dpll_mgr { 92 const struct dpll_info *dpll_info; 93 94 int (*compute_dplls)(struct intel_atomic_state *state, 95 struct intel_crtc *crtc, 96 struct intel_encoder *encoder); 97 int (*get_dplls)(struct intel_atomic_state *state, 98 struct intel_crtc *crtc, 99 struct intel_encoder *encoder); 100 void (*put_dplls)(struct intel_atomic_state *state, 101 struct intel_crtc *crtc); 102 void (*update_active_dpll)(struct intel_atomic_state *state, 103 struct intel_crtc *crtc, 104 struct intel_encoder *encoder); 105 void (*update_ref_clks)(struct drm_i915_private *i915); 106 void (*dump_hw_state)(struct drm_i915_private *dev_priv, 107 const struct intel_dpll_hw_state *hw_state); 108 }; 109 110 static void 111 intel_atomic_duplicate_dpll_state(struct drm_i915_private *dev_priv, 112 struct intel_shared_dpll_state *shared_dpll) 113 { 114 enum intel_dpll_id i; 115 116 /* Copy shared dpll state */ 117 for (i = 0; i < dev_priv->display.dpll.num_shared_dpll; i++) { 118 struct intel_shared_dpll *pll = &dev_priv->display.dpll.shared_dplls[i]; 119 120 shared_dpll[i] = pll->state; 121 } 122 } 123 124 static struct intel_shared_dpll_state * 125 intel_atomic_get_shared_dpll_state(struct drm_atomic_state *s) 126 { 127 struct intel_atomic_state *state = to_intel_atomic_state(s); 128 129 drm_WARN_ON(s->dev, !drm_modeset_is_locked(&s->dev->mode_config.connection_mutex)); 130 131 if (!state->dpll_set) { 132 state->dpll_set = true; 133 134 intel_atomic_duplicate_dpll_state(to_i915(s->dev), 135 state->shared_dpll); 136 } 137 138 return state->shared_dpll; 139 } 140 141 /** 142 * intel_get_shared_dpll_by_id - get a DPLL given its id 143 * @dev_priv: i915 device instance 144 * @id: pll id 145 * 146 * Returns: 147 * A pointer to the DPLL with @id 148 */ 149 struct intel_shared_dpll * 150 intel_get_shared_dpll_by_id(struct drm_i915_private *dev_priv, 151 enum intel_dpll_id id) 152 { 153 return &dev_priv->display.dpll.shared_dplls[id]; 154 } 155 156 /** 157 * intel_get_shared_dpll_id - get the id of a DPLL 158 * @dev_priv: i915 device instance 159 * @pll: the DPLL 160 * 161 * Returns: 162 * The id of @pll 163 */ 164 enum intel_dpll_id 165 intel_get_shared_dpll_id(struct drm_i915_private *dev_priv, 166 struct intel_shared_dpll *pll) 167 { 168 long pll_idx = pll - dev_priv->display.dpll.shared_dplls; 169 170 if (drm_WARN_ON(&dev_priv->drm, 171 pll_idx < 0 || 172 pll_idx >= dev_priv->display.dpll.num_shared_dpll)) 173 return -1; 174 175 return pll_idx; 176 } 177 178 /* For ILK+ */ 179 void assert_shared_dpll(struct drm_i915_private *dev_priv, 180 struct intel_shared_dpll *pll, 181 bool state) 182 { 183 bool cur_state; 184 struct intel_dpll_hw_state hw_state; 185 186 if (drm_WARN(&dev_priv->drm, !pll, 187 "asserting DPLL %s with no DPLL\n", str_on_off(state))) 188 return; 189 190 cur_state = intel_dpll_get_hw_state(dev_priv, pll, &hw_state); 191 I915_STATE_WARN(cur_state != state, 192 "%s assertion failure (expected %s, current %s)\n", 193 pll->info->name, str_on_off(state), 194 str_on_off(cur_state)); 195 } 196 197 static enum tc_port icl_pll_id_to_tc_port(enum intel_dpll_id id) 198 { 199 return TC_PORT_1 + id - DPLL_ID_ICL_MGPLL1; 200 } 201 202 enum intel_dpll_id icl_tc_port_to_pll_id(enum tc_port tc_port) 203 { 204 return tc_port - TC_PORT_1 + DPLL_ID_ICL_MGPLL1; 205 } 206 207 static i915_reg_t 208 intel_combo_pll_enable_reg(struct drm_i915_private *i915, 209 struct intel_shared_dpll *pll) 210 { 211 if (IS_DG1(i915)) 212 return DG1_DPLL_ENABLE(pll->info->id); 213 else if (IS_JSL_EHL(i915) && (pll->info->id == DPLL_ID_EHL_DPLL4)) 214 return MG_PLL_ENABLE(0); 215 216 return ICL_DPLL_ENABLE(pll->info->id); 217 } 218 219 static i915_reg_t 220 intel_tc_pll_enable_reg(struct drm_i915_private *i915, 221 struct intel_shared_dpll *pll) 222 { 223 const enum intel_dpll_id id = pll->info->id; 224 enum tc_port tc_port = icl_pll_id_to_tc_port(id); 225 226 if (IS_ALDERLAKE_P(i915)) 227 return ADLP_PORTTC_PLL_ENABLE(tc_port); 228 229 return MG_PLL_ENABLE(tc_port); 230 } 231 232 /** 233 * intel_enable_shared_dpll - enable a CRTC's shared DPLL 234 * @crtc_state: CRTC, and its state, which has a shared DPLL 235 * 236 * Enable the shared DPLL used by @crtc. 237 */ 238 void intel_enable_shared_dpll(const struct intel_crtc_state *crtc_state) 239 { 240 struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc); 241 struct drm_i915_private *dev_priv = to_i915(crtc->base.dev); 242 struct intel_shared_dpll *pll = crtc_state->shared_dpll; 243 unsigned int pipe_mask = BIT(crtc->pipe); 244 unsigned int old_mask; 245 246 if (drm_WARN_ON(&dev_priv->drm, pll == NULL)) 247 return; 248 249 mutex_lock(&dev_priv->display.dpll.lock); 250 old_mask = pll->active_mask; 251 252 if (drm_WARN_ON(&dev_priv->drm, !(pll->state.pipe_mask & pipe_mask)) || 253 drm_WARN_ON(&dev_priv->drm, pll->active_mask & pipe_mask)) 254 goto out; 255 256 pll->active_mask |= pipe_mask; 257 258 drm_dbg_kms(&dev_priv->drm, 259 "enable %s (active 0x%x, on? %d) for [CRTC:%d:%s]\n", 260 pll->info->name, pll->active_mask, pll->on, 261 crtc->base.base.id, crtc->base.name); 262 263 if (old_mask) { 264 drm_WARN_ON(&dev_priv->drm, !pll->on); 265 assert_shared_dpll_enabled(dev_priv, pll); 266 goto out; 267 } 268 drm_WARN_ON(&dev_priv->drm, pll->on); 269 270 drm_dbg_kms(&dev_priv->drm, "enabling %s\n", pll->info->name); 271 pll->info->funcs->enable(dev_priv, pll); 272 pll->on = true; 273 274 out: 275 mutex_unlock(&dev_priv->display.dpll.lock); 276 } 277 278 /** 279 * intel_disable_shared_dpll - disable a CRTC's shared DPLL 280 * @crtc_state: CRTC, and its state, which has a shared DPLL 281 * 282 * Disable the shared DPLL used by @crtc. 283 */ 284 void intel_disable_shared_dpll(const struct intel_crtc_state *crtc_state) 285 { 286 struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc); 287 struct drm_i915_private *dev_priv = to_i915(crtc->base.dev); 288 struct intel_shared_dpll *pll = crtc_state->shared_dpll; 289 unsigned int pipe_mask = BIT(crtc->pipe); 290 291 /* PCH only available on ILK+ */ 292 if (DISPLAY_VER(dev_priv) < 5) 293 return; 294 295 if (pll == NULL) 296 return; 297 298 mutex_lock(&dev_priv->display.dpll.lock); 299 if (drm_WARN(&dev_priv->drm, !(pll->active_mask & pipe_mask), 300 "%s not used by [CRTC:%d:%s]\n", pll->info->name, 301 crtc->base.base.id, crtc->base.name)) 302 goto out; 303 304 drm_dbg_kms(&dev_priv->drm, 305 "disable %s (active 0x%x, on? %d) for [CRTC:%d:%s]\n", 306 pll->info->name, pll->active_mask, pll->on, 307 crtc->base.base.id, crtc->base.name); 308 309 assert_shared_dpll_enabled(dev_priv, pll); 310 drm_WARN_ON(&dev_priv->drm, !pll->on); 311 312 pll->active_mask &= ~pipe_mask; 313 if (pll->active_mask) 314 goto out; 315 316 drm_dbg_kms(&dev_priv->drm, "disabling %s\n", pll->info->name); 317 pll->info->funcs->disable(dev_priv, pll); 318 pll->on = false; 319 320 out: 321 mutex_unlock(&dev_priv->display.dpll.lock); 322 } 323 324 static struct intel_shared_dpll * 325 intel_find_shared_dpll(struct intel_atomic_state *state, 326 const struct intel_crtc *crtc, 327 const struct intel_dpll_hw_state *pll_state, 328 unsigned long dpll_mask) 329 { 330 struct drm_i915_private *dev_priv = to_i915(crtc->base.dev); 331 struct intel_shared_dpll *pll, *unused_pll = NULL; 332 struct intel_shared_dpll_state *shared_dpll; 333 enum intel_dpll_id i; 334 335 shared_dpll = intel_atomic_get_shared_dpll_state(&state->base); 336 337 drm_WARN_ON(&dev_priv->drm, dpll_mask & ~(BIT(I915_NUM_PLLS) - 1)); 338 339 for_each_set_bit(i, &dpll_mask, I915_NUM_PLLS) { 340 pll = &dev_priv->display.dpll.shared_dplls[i]; 341 342 /* Only want to check enabled timings first */ 343 if (shared_dpll[i].pipe_mask == 0) { 344 if (!unused_pll) 345 unused_pll = pll; 346 continue; 347 } 348 349 if (memcmp(pll_state, 350 &shared_dpll[i].hw_state, 351 sizeof(*pll_state)) == 0) { 352 drm_dbg_kms(&dev_priv->drm, 353 "[CRTC:%d:%s] sharing existing %s (pipe mask 0x%x, active 0x%x)\n", 354 crtc->base.base.id, crtc->base.name, 355 pll->info->name, 356 shared_dpll[i].pipe_mask, 357 pll->active_mask); 358 return pll; 359 } 360 } 361 362 /* Ok no matching timings, maybe there's a free one? */ 363 if (unused_pll) { 364 drm_dbg_kms(&dev_priv->drm, "[CRTC:%d:%s] allocated %s\n", 365 crtc->base.base.id, crtc->base.name, 366 unused_pll->info->name); 367 return unused_pll; 368 } 369 370 return NULL; 371 } 372 373 static void 374 intel_reference_shared_dpll(struct intel_atomic_state *state, 375 const struct intel_crtc *crtc, 376 const struct intel_shared_dpll *pll, 377 const struct intel_dpll_hw_state *pll_state) 378 { 379 struct drm_i915_private *i915 = to_i915(state->base.dev); 380 struct intel_shared_dpll_state *shared_dpll; 381 const enum intel_dpll_id id = pll->info->id; 382 383 shared_dpll = intel_atomic_get_shared_dpll_state(&state->base); 384 385 if (shared_dpll[id].pipe_mask == 0) 386 shared_dpll[id].hw_state = *pll_state; 387 388 drm_dbg(&i915->drm, "using %s for pipe %c\n", pll->info->name, 389 pipe_name(crtc->pipe)); 390 391 shared_dpll[id].pipe_mask |= BIT(crtc->pipe); 392 } 393 394 static void intel_unreference_shared_dpll(struct intel_atomic_state *state, 395 const struct intel_crtc *crtc, 396 const struct intel_shared_dpll *pll) 397 { 398 struct intel_shared_dpll_state *shared_dpll; 399 400 shared_dpll = intel_atomic_get_shared_dpll_state(&state->base); 401 shared_dpll[pll->info->id].pipe_mask &= ~BIT(crtc->pipe); 402 } 403 404 static void intel_put_dpll(struct intel_atomic_state *state, 405 struct intel_crtc *crtc) 406 { 407 const struct intel_crtc_state *old_crtc_state = 408 intel_atomic_get_old_crtc_state(state, crtc); 409 struct intel_crtc_state *new_crtc_state = 410 intel_atomic_get_new_crtc_state(state, crtc); 411 412 new_crtc_state->shared_dpll = NULL; 413 414 if (!old_crtc_state->shared_dpll) 415 return; 416 417 intel_unreference_shared_dpll(state, crtc, old_crtc_state->shared_dpll); 418 } 419 420 /** 421 * intel_shared_dpll_swap_state - make atomic DPLL configuration effective 422 * @state: atomic state 423 * 424 * This is the dpll version of drm_atomic_helper_swap_state() since the 425 * helper does not handle driver-specific global state. 426 * 427 * For consistency with atomic helpers this function does a complete swap, 428 * i.e. it also puts the current state into @state, even though there is no 429 * need for that at this moment. 430 */ 431 void intel_shared_dpll_swap_state(struct intel_atomic_state *state) 432 { 433 struct drm_i915_private *dev_priv = to_i915(state->base.dev); 434 struct intel_shared_dpll_state *shared_dpll = state->shared_dpll; 435 enum intel_dpll_id i; 436 437 if (!state->dpll_set) 438 return; 439 440 for (i = 0; i < dev_priv->display.dpll.num_shared_dpll; i++) { 441 struct intel_shared_dpll *pll = 442 &dev_priv->display.dpll.shared_dplls[i]; 443 444 swap(pll->state, shared_dpll[i]); 445 } 446 } 447 448 static bool ibx_pch_dpll_get_hw_state(struct drm_i915_private *dev_priv, 449 struct intel_shared_dpll *pll, 450 struct intel_dpll_hw_state *hw_state) 451 { 452 const enum intel_dpll_id id = pll->info->id; 453 intel_wakeref_t wakeref; 454 u32 val; 455 456 wakeref = intel_display_power_get_if_enabled(dev_priv, 457 POWER_DOMAIN_DISPLAY_CORE); 458 if (!wakeref) 459 return false; 460 461 val = intel_de_read(dev_priv, PCH_DPLL(id)); 462 hw_state->dpll = val; 463 hw_state->fp0 = intel_de_read(dev_priv, PCH_FP0(id)); 464 hw_state->fp1 = intel_de_read(dev_priv, PCH_FP1(id)); 465 466 intel_display_power_put(dev_priv, POWER_DOMAIN_DISPLAY_CORE, wakeref); 467 468 return val & DPLL_VCO_ENABLE; 469 } 470 471 static void ibx_assert_pch_refclk_enabled(struct drm_i915_private *dev_priv) 472 { 473 u32 val; 474 bool enabled; 475 476 I915_STATE_WARN_ON(!(HAS_PCH_IBX(dev_priv) || HAS_PCH_CPT(dev_priv))); 477 478 val = intel_de_read(dev_priv, PCH_DREF_CONTROL); 479 enabled = !!(val & (DREF_SSC_SOURCE_MASK | DREF_NONSPREAD_SOURCE_MASK | 480 DREF_SUPERSPREAD_SOURCE_MASK)); 481 I915_STATE_WARN(!enabled, "PCH refclk assertion failure, should be active but is disabled\n"); 482 } 483 484 static void ibx_pch_dpll_enable(struct drm_i915_private *dev_priv, 485 struct intel_shared_dpll *pll) 486 { 487 const enum intel_dpll_id id = pll->info->id; 488 489 /* PCH refclock must be enabled first */ 490 ibx_assert_pch_refclk_enabled(dev_priv); 491 492 intel_de_write(dev_priv, PCH_FP0(id), pll->state.hw_state.fp0); 493 intel_de_write(dev_priv, PCH_FP1(id), pll->state.hw_state.fp1); 494 495 intel_de_write(dev_priv, PCH_DPLL(id), pll->state.hw_state.dpll); 496 497 /* Wait for the clocks to stabilize. */ 498 intel_de_posting_read(dev_priv, PCH_DPLL(id)); 499 udelay(150); 500 501 /* The pixel multiplier can only be updated once the 502 * DPLL is enabled and the clocks are stable. 503 * 504 * So write it again. 505 */ 506 intel_de_write(dev_priv, PCH_DPLL(id), pll->state.hw_state.dpll); 507 intel_de_posting_read(dev_priv, PCH_DPLL(id)); 508 udelay(200); 509 } 510 511 static void ibx_pch_dpll_disable(struct drm_i915_private *dev_priv, 512 struct intel_shared_dpll *pll) 513 { 514 const enum intel_dpll_id id = pll->info->id; 515 516 intel_de_write(dev_priv, PCH_DPLL(id), 0); 517 intel_de_posting_read(dev_priv, PCH_DPLL(id)); 518 udelay(200); 519 } 520 521 static int ibx_compute_dpll(struct intel_atomic_state *state, 522 struct intel_crtc *crtc, 523 struct intel_encoder *encoder) 524 { 525 return 0; 526 } 527 528 static int ibx_get_dpll(struct intel_atomic_state *state, 529 struct intel_crtc *crtc, 530 struct intel_encoder *encoder) 531 { 532 struct intel_crtc_state *crtc_state = 533 intel_atomic_get_new_crtc_state(state, crtc); 534 struct drm_i915_private *dev_priv = to_i915(crtc->base.dev); 535 struct intel_shared_dpll *pll; 536 enum intel_dpll_id i; 537 538 if (HAS_PCH_IBX(dev_priv)) { 539 /* Ironlake PCH has a fixed PLL->PCH pipe mapping. */ 540 i = (enum intel_dpll_id) crtc->pipe; 541 pll = &dev_priv->display.dpll.shared_dplls[i]; 542 543 drm_dbg_kms(&dev_priv->drm, 544 "[CRTC:%d:%s] using pre-allocated %s\n", 545 crtc->base.base.id, crtc->base.name, 546 pll->info->name); 547 } else { 548 pll = intel_find_shared_dpll(state, crtc, 549 &crtc_state->dpll_hw_state, 550 BIT(DPLL_ID_PCH_PLL_B) | 551 BIT(DPLL_ID_PCH_PLL_A)); 552 } 553 554 if (!pll) 555 return -EINVAL; 556 557 /* reference the pll */ 558 intel_reference_shared_dpll(state, crtc, 559 pll, &crtc_state->dpll_hw_state); 560 561 crtc_state->shared_dpll = pll; 562 563 return 0; 564 } 565 566 static void ibx_dump_hw_state(struct drm_i915_private *dev_priv, 567 const struct intel_dpll_hw_state *hw_state) 568 { 569 drm_dbg_kms(&dev_priv->drm, 570 "dpll_hw_state: dpll: 0x%x, dpll_md: 0x%x, " 571 "fp0: 0x%x, fp1: 0x%x\n", 572 hw_state->dpll, 573 hw_state->dpll_md, 574 hw_state->fp0, 575 hw_state->fp1); 576 } 577 578 static const struct intel_shared_dpll_funcs ibx_pch_dpll_funcs = { 579 .enable = ibx_pch_dpll_enable, 580 .disable = ibx_pch_dpll_disable, 581 .get_hw_state = ibx_pch_dpll_get_hw_state, 582 }; 583 584 static const struct dpll_info pch_plls[] = { 585 { "PCH DPLL A", &ibx_pch_dpll_funcs, DPLL_ID_PCH_PLL_A, 0 }, 586 { "PCH DPLL B", &ibx_pch_dpll_funcs, DPLL_ID_PCH_PLL_B, 0 }, 587 { }, 588 }; 589 590 static const struct intel_dpll_mgr pch_pll_mgr = { 591 .dpll_info = pch_plls, 592 .compute_dplls = ibx_compute_dpll, 593 .get_dplls = ibx_get_dpll, 594 .put_dplls = intel_put_dpll, 595 .dump_hw_state = ibx_dump_hw_state, 596 }; 597 598 static void hsw_ddi_wrpll_enable(struct drm_i915_private *dev_priv, 599 struct intel_shared_dpll *pll) 600 { 601 const enum intel_dpll_id id = pll->info->id; 602 603 intel_de_write(dev_priv, WRPLL_CTL(id), pll->state.hw_state.wrpll); 604 intel_de_posting_read(dev_priv, WRPLL_CTL(id)); 605 udelay(20); 606 } 607 608 static void hsw_ddi_spll_enable(struct drm_i915_private *dev_priv, 609 struct intel_shared_dpll *pll) 610 { 611 intel_de_write(dev_priv, SPLL_CTL, pll->state.hw_state.spll); 612 intel_de_posting_read(dev_priv, SPLL_CTL); 613 udelay(20); 614 } 615 616 static void hsw_ddi_wrpll_disable(struct drm_i915_private *dev_priv, 617 struct intel_shared_dpll *pll) 618 { 619 const enum intel_dpll_id id = pll->info->id; 620 u32 val; 621 622 val = intel_de_read(dev_priv, WRPLL_CTL(id)); 623 intel_de_write(dev_priv, WRPLL_CTL(id), val & ~WRPLL_PLL_ENABLE); 624 intel_de_posting_read(dev_priv, WRPLL_CTL(id)); 625 626 /* 627 * Try to set up the PCH reference clock once all DPLLs 628 * that depend on it have been shut down. 629 */ 630 if (dev_priv->pch_ssc_use & BIT(id)) 631 intel_init_pch_refclk(dev_priv); 632 } 633 634 static void hsw_ddi_spll_disable(struct drm_i915_private *dev_priv, 635 struct intel_shared_dpll *pll) 636 { 637 enum intel_dpll_id id = pll->info->id; 638 u32 val; 639 640 val = intel_de_read(dev_priv, SPLL_CTL); 641 intel_de_write(dev_priv, SPLL_CTL, val & ~SPLL_PLL_ENABLE); 642 intel_de_posting_read(dev_priv, SPLL_CTL); 643 644 /* 645 * Try to set up the PCH reference clock once all DPLLs 646 * that depend on it have been shut down. 647 */ 648 if (dev_priv->pch_ssc_use & BIT(id)) 649 intel_init_pch_refclk(dev_priv); 650 } 651 652 static bool hsw_ddi_wrpll_get_hw_state(struct drm_i915_private *dev_priv, 653 struct intel_shared_dpll *pll, 654 struct intel_dpll_hw_state *hw_state) 655 { 656 const enum intel_dpll_id id = pll->info->id; 657 intel_wakeref_t wakeref; 658 u32 val; 659 660 wakeref = intel_display_power_get_if_enabled(dev_priv, 661 POWER_DOMAIN_DISPLAY_CORE); 662 if (!wakeref) 663 return false; 664 665 val = intel_de_read(dev_priv, WRPLL_CTL(id)); 666 hw_state->wrpll = val; 667 668 intel_display_power_put(dev_priv, POWER_DOMAIN_DISPLAY_CORE, wakeref); 669 670 return val & WRPLL_PLL_ENABLE; 671 } 672 673 static bool hsw_ddi_spll_get_hw_state(struct drm_i915_private *dev_priv, 674 struct intel_shared_dpll *pll, 675 struct intel_dpll_hw_state *hw_state) 676 { 677 intel_wakeref_t wakeref; 678 u32 val; 679 680 wakeref = intel_display_power_get_if_enabled(dev_priv, 681 POWER_DOMAIN_DISPLAY_CORE); 682 if (!wakeref) 683 return false; 684 685 val = intel_de_read(dev_priv, SPLL_CTL); 686 hw_state->spll = val; 687 688 intel_display_power_put(dev_priv, POWER_DOMAIN_DISPLAY_CORE, wakeref); 689 690 return val & SPLL_PLL_ENABLE; 691 } 692 693 #define LC_FREQ 2700 694 #define LC_FREQ_2K U64_C(LC_FREQ * 2000) 695 696 #define P_MIN 2 697 #define P_MAX 64 698 #define P_INC 2 699 700 /* Constraints for PLL good behavior */ 701 #define REF_MIN 48 702 #define REF_MAX 400 703 #define VCO_MIN 2400 704 #define VCO_MAX 4800 705 706 struct hsw_wrpll_rnp { 707 unsigned p, n2, r2; 708 }; 709 710 static unsigned hsw_wrpll_get_budget_for_freq(int clock) 711 { 712 unsigned budget; 713 714 switch (clock) { 715 case 25175000: 716 case 25200000: 717 case 27000000: 718 case 27027000: 719 case 37762500: 720 case 37800000: 721 case 40500000: 722 case 40541000: 723 case 54000000: 724 case 54054000: 725 case 59341000: 726 case 59400000: 727 case 72000000: 728 case 74176000: 729 case 74250000: 730 case 81000000: 731 case 81081000: 732 case 89012000: 733 case 89100000: 734 case 108000000: 735 case 108108000: 736 case 111264000: 737 case 111375000: 738 case 148352000: 739 case 148500000: 740 case 162000000: 741 case 162162000: 742 case 222525000: 743 case 222750000: 744 case 296703000: 745 case 297000000: 746 budget = 0; 747 break; 748 case 233500000: 749 case 245250000: 750 case 247750000: 751 case 253250000: 752 case 298000000: 753 budget = 1500; 754 break; 755 case 169128000: 756 case 169500000: 757 case 179500000: 758 case 202000000: 759 budget = 2000; 760 break; 761 case 256250000: 762 case 262500000: 763 case 270000000: 764 case 272500000: 765 case 273750000: 766 case 280750000: 767 case 281250000: 768 case 286000000: 769 case 291750000: 770 budget = 4000; 771 break; 772 case 267250000: 773 case 268500000: 774 budget = 5000; 775 break; 776 default: 777 budget = 1000; 778 break; 779 } 780 781 return budget; 782 } 783 784 static void hsw_wrpll_update_rnp(u64 freq2k, unsigned int budget, 785 unsigned int r2, unsigned int n2, 786 unsigned int p, 787 struct hsw_wrpll_rnp *best) 788 { 789 u64 a, b, c, d, diff, diff_best; 790 791 /* No best (r,n,p) yet */ 792 if (best->p == 0) { 793 best->p = p; 794 best->n2 = n2; 795 best->r2 = r2; 796 return; 797 } 798 799 /* 800 * Output clock is (LC_FREQ_2K / 2000) * N / (P * R), which compares to 801 * freq2k. 802 * 803 * delta = 1e6 * 804 * abs(freq2k - (LC_FREQ_2K * n2/(p * r2))) / 805 * freq2k; 806 * 807 * and we would like delta <= budget. 808 * 809 * If the discrepancy is above the PPM-based budget, always prefer to 810 * improve upon the previous solution. However, if you're within the 811 * budget, try to maximize Ref * VCO, that is N / (P * R^2). 812 */ 813 a = freq2k * budget * p * r2; 814 b = freq2k * budget * best->p * best->r2; 815 diff = abs_diff(freq2k * p * r2, LC_FREQ_2K * n2); 816 diff_best = abs_diff(freq2k * best->p * best->r2, 817 LC_FREQ_2K * best->n2); 818 c = 1000000 * diff; 819 d = 1000000 * diff_best; 820 821 if (a < c && b < d) { 822 /* If both are above the budget, pick the closer */ 823 if (best->p * best->r2 * diff < p * r2 * diff_best) { 824 best->p = p; 825 best->n2 = n2; 826 best->r2 = r2; 827 } 828 } else if (a >= c && b < d) { 829 /* If A is below the threshold but B is above it? Update. */ 830 best->p = p; 831 best->n2 = n2; 832 best->r2 = r2; 833 } else if (a >= c && b >= d) { 834 /* Both are below the limit, so pick the higher n2/(r2*r2) */ 835 if (n2 * best->r2 * best->r2 > best->n2 * r2 * r2) { 836 best->p = p; 837 best->n2 = n2; 838 best->r2 = r2; 839 } 840 } 841 /* Otherwise a < c && b >= d, do nothing */ 842 } 843 844 static void 845 hsw_ddi_calculate_wrpll(int clock /* in Hz */, 846 unsigned *r2_out, unsigned *n2_out, unsigned *p_out) 847 { 848 u64 freq2k; 849 unsigned p, n2, r2; 850 struct hsw_wrpll_rnp best = {}; 851 unsigned budget; 852 853 freq2k = clock / 100; 854 855 budget = hsw_wrpll_get_budget_for_freq(clock); 856 857 /* Special case handling for 540 pixel clock: bypass WR PLL entirely 858 * and directly pass the LC PLL to it. */ 859 if (freq2k == 5400000) { 860 *n2_out = 2; 861 *p_out = 1; 862 *r2_out = 2; 863 return; 864 } 865 866 /* 867 * Ref = LC_FREQ / R, where Ref is the actual reference input seen by 868 * the WR PLL. 869 * 870 * We want R so that REF_MIN <= Ref <= REF_MAX. 871 * Injecting R2 = 2 * R gives: 872 * REF_MAX * r2 > LC_FREQ * 2 and 873 * REF_MIN * r2 < LC_FREQ * 2 874 * 875 * Which means the desired boundaries for r2 are: 876 * LC_FREQ * 2 / REF_MAX < r2 < LC_FREQ * 2 / REF_MIN 877 * 878 */ 879 for (r2 = LC_FREQ * 2 / REF_MAX + 1; 880 r2 <= LC_FREQ * 2 / REF_MIN; 881 r2++) { 882 883 /* 884 * VCO = N * Ref, that is: VCO = N * LC_FREQ / R 885 * 886 * Once again we want VCO_MIN <= VCO <= VCO_MAX. 887 * Injecting R2 = 2 * R and N2 = 2 * N, we get: 888 * VCO_MAX * r2 > n2 * LC_FREQ and 889 * VCO_MIN * r2 < n2 * LC_FREQ) 890 * 891 * Which means the desired boundaries for n2 are: 892 * VCO_MIN * r2 / LC_FREQ < n2 < VCO_MAX * r2 / LC_FREQ 893 */ 894 for (n2 = VCO_MIN * r2 / LC_FREQ + 1; 895 n2 <= VCO_MAX * r2 / LC_FREQ; 896 n2++) { 897 898 for (p = P_MIN; p <= P_MAX; p += P_INC) 899 hsw_wrpll_update_rnp(freq2k, budget, 900 r2, n2, p, &best); 901 } 902 } 903 904 *n2_out = best.n2; 905 *p_out = best.p; 906 *r2_out = best.r2; 907 } 908 909 static int hsw_ddi_wrpll_get_freq(struct drm_i915_private *dev_priv, 910 const struct intel_shared_dpll *pll, 911 const struct intel_dpll_hw_state *pll_state) 912 { 913 int refclk; 914 int n, p, r; 915 u32 wrpll = pll_state->wrpll; 916 917 switch (wrpll & WRPLL_REF_MASK) { 918 case WRPLL_REF_SPECIAL_HSW: 919 /* Muxed-SSC for BDW, non-SSC for non-ULT HSW. */ 920 if (IS_HASWELL(dev_priv) && !IS_HSW_ULT(dev_priv)) { 921 refclk = dev_priv->display.dpll.ref_clks.nssc; 922 break; 923 } 924 fallthrough; 925 case WRPLL_REF_PCH_SSC: 926 /* 927 * We could calculate spread here, but our checking 928 * code only cares about 5% accuracy, and spread is a max of 929 * 0.5% downspread. 930 */ 931 refclk = dev_priv->display.dpll.ref_clks.ssc; 932 break; 933 case WRPLL_REF_LCPLL: 934 refclk = 2700000; 935 break; 936 default: 937 MISSING_CASE(wrpll); 938 return 0; 939 } 940 941 r = wrpll & WRPLL_DIVIDER_REF_MASK; 942 p = (wrpll & WRPLL_DIVIDER_POST_MASK) >> WRPLL_DIVIDER_POST_SHIFT; 943 n = (wrpll & WRPLL_DIVIDER_FB_MASK) >> WRPLL_DIVIDER_FB_SHIFT; 944 945 /* Convert to KHz, p & r have a fixed point portion */ 946 return (refclk * n / 10) / (p * r) * 2; 947 } 948 949 static int 950 hsw_ddi_wrpll_compute_dpll(struct intel_atomic_state *state, 951 struct intel_crtc *crtc) 952 { 953 struct drm_i915_private *i915 = to_i915(state->base.dev); 954 struct intel_crtc_state *crtc_state = 955 intel_atomic_get_new_crtc_state(state, crtc); 956 unsigned int p, n2, r2; 957 958 hsw_ddi_calculate_wrpll(crtc_state->port_clock * 1000, &r2, &n2, &p); 959 960 crtc_state->dpll_hw_state.wrpll = 961 WRPLL_PLL_ENABLE | WRPLL_REF_LCPLL | 962 WRPLL_DIVIDER_REFERENCE(r2) | WRPLL_DIVIDER_FEEDBACK(n2) | 963 WRPLL_DIVIDER_POST(p); 964 965 crtc_state->port_clock = hsw_ddi_wrpll_get_freq(i915, NULL, 966 &crtc_state->dpll_hw_state); 967 968 return 0; 969 } 970 971 static struct intel_shared_dpll * 972 hsw_ddi_wrpll_get_dpll(struct intel_atomic_state *state, 973 struct intel_crtc *crtc) 974 { 975 struct intel_crtc_state *crtc_state = 976 intel_atomic_get_new_crtc_state(state, crtc); 977 978 return intel_find_shared_dpll(state, crtc, 979 &crtc_state->dpll_hw_state, 980 BIT(DPLL_ID_WRPLL2) | 981 BIT(DPLL_ID_WRPLL1)); 982 } 983 984 static int 985 hsw_ddi_lcpll_compute_dpll(struct intel_crtc_state *crtc_state) 986 { 987 struct drm_i915_private *dev_priv = to_i915(crtc_state->uapi.crtc->dev); 988 int clock = crtc_state->port_clock; 989 990 switch (clock / 2) { 991 case 81000: 992 case 135000: 993 case 270000: 994 return 0; 995 default: 996 drm_dbg_kms(&dev_priv->drm, "Invalid clock for DP: %d\n", 997 clock); 998 return -EINVAL; 999 } 1000 } 1001 1002 static struct intel_shared_dpll * 1003 hsw_ddi_lcpll_get_dpll(struct intel_crtc_state *crtc_state) 1004 { 1005 struct drm_i915_private *dev_priv = to_i915(crtc_state->uapi.crtc->dev); 1006 struct intel_shared_dpll *pll; 1007 enum intel_dpll_id pll_id; 1008 int clock = crtc_state->port_clock; 1009 1010 switch (clock / 2) { 1011 case 81000: 1012 pll_id = DPLL_ID_LCPLL_810; 1013 break; 1014 case 135000: 1015 pll_id = DPLL_ID_LCPLL_1350; 1016 break; 1017 case 270000: 1018 pll_id = DPLL_ID_LCPLL_2700; 1019 break; 1020 default: 1021 MISSING_CASE(clock / 2); 1022 return NULL; 1023 } 1024 1025 pll = intel_get_shared_dpll_by_id(dev_priv, pll_id); 1026 1027 if (!pll) 1028 return NULL; 1029 1030 return pll; 1031 } 1032 1033 static int hsw_ddi_lcpll_get_freq(struct drm_i915_private *i915, 1034 const struct intel_shared_dpll *pll, 1035 const struct intel_dpll_hw_state *pll_state) 1036 { 1037 int link_clock = 0; 1038 1039 switch (pll->info->id) { 1040 case DPLL_ID_LCPLL_810: 1041 link_clock = 81000; 1042 break; 1043 case DPLL_ID_LCPLL_1350: 1044 link_clock = 135000; 1045 break; 1046 case DPLL_ID_LCPLL_2700: 1047 link_clock = 270000; 1048 break; 1049 default: 1050 drm_WARN(&i915->drm, 1, "bad port clock sel\n"); 1051 break; 1052 } 1053 1054 return link_clock * 2; 1055 } 1056 1057 static int 1058 hsw_ddi_spll_compute_dpll(struct intel_atomic_state *state, 1059 struct intel_crtc *crtc) 1060 { 1061 struct intel_crtc_state *crtc_state = 1062 intel_atomic_get_new_crtc_state(state, crtc); 1063 1064 if (drm_WARN_ON(crtc->base.dev, crtc_state->port_clock / 2 != 135000)) 1065 return -EINVAL; 1066 1067 crtc_state->dpll_hw_state.spll = 1068 SPLL_PLL_ENABLE | SPLL_FREQ_1350MHz | SPLL_REF_MUXED_SSC; 1069 1070 return 0; 1071 } 1072 1073 static struct intel_shared_dpll * 1074 hsw_ddi_spll_get_dpll(struct intel_atomic_state *state, 1075 struct intel_crtc *crtc) 1076 { 1077 struct intel_crtc_state *crtc_state = 1078 intel_atomic_get_new_crtc_state(state, crtc); 1079 1080 return intel_find_shared_dpll(state, crtc, &crtc_state->dpll_hw_state, 1081 BIT(DPLL_ID_SPLL)); 1082 } 1083 1084 static int hsw_ddi_spll_get_freq(struct drm_i915_private *i915, 1085 const struct intel_shared_dpll *pll, 1086 const struct intel_dpll_hw_state *pll_state) 1087 { 1088 int link_clock = 0; 1089 1090 switch (pll_state->spll & SPLL_FREQ_MASK) { 1091 case SPLL_FREQ_810MHz: 1092 link_clock = 81000; 1093 break; 1094 case SPLL_FREQ_1350MHz: 1095 link_clock = 135000; 1096 break; 1097 case SPLL_FREQ_2700MHz: 1098 link_clock = 270000; 1099 break; 1100 default: 1101 drm_WARN(&i915->drm, 1, "bad spll freq\n"); 1102 break; 1103 } 1104 1105 return link_clock * 2; 1106 } 1107 1108 static int hsw_compute_dpll(struct intel_atomic_state *state, 1109 struct intel_crtc *crtc, 1110 struct intel_encoder *encoder) 1111 { 1112 struct intel_crtc_state *crtc_state = 1113 intel_atomic_get_new_crtc_state(state, crtc); 1114 1115 if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_HDMI)) 1116 return hsw_ddi_wrpll_compute_dpll(state, crtc); 1117 else if (intel_crtc_has_dp_encoder(crtc_state)) 1118 return hsw_ddi_lcpll_compute_dpll(crtc_state); 1119 else if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_ANALOG)) 1120 return hsw_ddi_spll_compute_dpll(state, crtc); 1121 else 1122 return -EINVAL; 1123 } 1124 1125 static int hsw_get_dpll(struct intel_atomic_state *state, 1126 struct intel_crtc *crtc, 1127 struct intel_encoder *encoder) 1128 { 1129 struct intel_crtc_state *crtc_state = 1130 intel_atomic_get_new_crtc_state(state, crtc); 1131 struct intel_shared_dpll *pll = NULL; 1132 1133 if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_HDMI)) 1134 pll = hsw_ddi_wrpll_get_dpll(state, crtc); 1135 else if (intel_crtc_has_dp_encoder(crtc_state)) 1136 pll = hsw_ddi_lcpll_get_dpll(crtc_state); 1137 else if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_ANALOG)) 1138 pll = hsw_ddi_spll_get_dpll(state, crtc); 1139 1140 if (!pll) 1141 return -EINVAL; 1142 1143 intel_reference_shared_dpll(state, crtc, 1144 pll, &crtc_state->dpll_hw_state); 1145 1146 crtc_state->shared_dpll = pll; 1147 1148 return 0; 1149 } 1150 1151 static void hsw_update_dpll_ref_clks(struct drm_i915_private *i915) 1152 { 1153 i915->display.dpll.ref_clks.ssc = 135000; 1154 /* Non-SSC is only used on non-ULT HSW. */ 1155 if (intel_de_read(i915, FUSE_STRAP3) & HSW_REF_CLK_SELECT) 1156 i915->display.dpll.ref_clks.nssc = 24000; 1157 else 1158 i915->display.dpll.ref_clks.nssc = 135000; 1159 } 1160 1161 static void hsw_dump_hw_state(struct drm_i915_private *dev_priv, 1162 const struct intel_dpll_hw_state *hw_state) 1163 { 1164 drm_dbg_kms(&dev_priv->drm, "dpll_hw_state: wrpll: 0x%x spll: 0x%x\n", 1165 hw_state->wrpll, hw_state->spll); 1166 } 1167 1168 static const struct intel_shared_dpll_funcs hsw_ddi_wrpll_funcs = { 1169 .enable = hsw_ddi_wrpll_enable, 1170 .disable = hsw_ddi_wrpll_disable, 1171 .get_hw_state = hsw_ddi_wrpll_get_hw_state, 1172 .get_freq = hsw_ddi_wrpll_get_freq, 1173 }; 1174 1175 static const struct intel_shared_dpll_funcs hsw_ddi_spll_funcs = { 1176 .enable = hsw_ddi_spll_enable, 1177 .disable = hsw_ddi_spll_disable, 1178 .get_hw_state = hsw_ddi_spll_get_hw_state, 1179 .get_freq = hsw_ddi_spll_get_freq, 1180 }; 1181 1182 static void hsw_ddi_lcpll_enable(struct drm_i915_private *dev_priv, 1183 struct intel_shared_dpll *pll) 1184 { 1185 } 1186 1187 static void hsw_ddi_lcpll_disable(struct drm_i915_private *dev_priv, 1188 struct intel_shared_dpll *pll) 1189 { 1190 } 1191 1192 static bool hsw_ddi_lcpll_get_hw_state(struct drm_i915_private *dev_priv, 1193 struct intel_shared_dpll *pll, 1194 struct intel_dpll_hw_state *hw_state) 1195 { 1196 return true; 1197 } 1198 1199 static const struct intel_shared_dpll_funcs hsw_ddi_lcpll_funcs = { 1200 .enable = hsw_ddi_lcpll_enable, 1201 .disable = hsw_ddi_lcpll_disable, 1202 .get_hw_state = hsw_ddi_lcpll_get_hw_state, 1203 .get_freq = hsw_ddi_lcpll_get_freq, 1204 }; 1205 1206 static const struct dpll_info hsw_plls[] = { 1207 { "WRPLL 1", &hsw_ddi_wrpll_funcs, DPLL_ID_WRPLL1, 0 }, 1208 { "WRPLL 2", &hsw_ddi_wrpll_funcs, DPLL_ID_WRPLL2, 0 }, 1209 { "SPLL", &hsw_ddi_spll_funcs, DPLL_ID_SPLL, 0 }, 1210 { "LCPLL 810", &hsw_ddi_lcpll_funcs, DPLL_ID_LCPLL_810, INTEL_DPLL_ALWAYS_ON }, 1211 { "LCPLL 1350", &hsw_ddi_lcpll_funcs, DPLL_ID_LCPLL_1350, INTEL_DPLL_ALWAYS_ON }, 1212 { "LCPLL 2700", &hsw_ddi_lcpll_funcs, DPLL_ID_LCPLL_2700, INTEL_DPLL_ALWAYS_ON }, 1213 { }, 1214 }; 1215 1216 static const struct intel_dpll_mgr hsw_pll_mgr = { 1217 .dpll_info = hsw_plls, 1218 .compute_dplls = hsw_compute_dpll, 1219 .get_dplls = hsw_get_dpll, 1220 .put_dplls = intel_put_dpll, 1221 .update_ref_clks = hsw_update_dpll_ref_clks, 1222 .dump_hw_state = hsw_dump_hw_state, 1223 }; 1224 1225 struct skl_dpll_regs { 1226 i915_reg_t ctl, cfgcr1, cfgcr2; 1227 }; 1228 1229 /* this array is indexed by the *shared* pll id */ 1230 static const struct skl_dpll_regs skl_dpll_regs[4] = { 1231 { 1232 /* DPLL 0 */ 1233 .ctl = LCPLL1_CTL, 1234 /* DPLL 0 doesn't support HDMI mode */ 1235 }, 1236 { 1237 /* DPLL 1 */ 1238 .ctl = LCPLL2_CTL, 1239 .cfgcr1 = DPLL_CFGCR1(SKL_DPLL1), 1240 .cfgcr2 = DPLL_CFGCR2(SKL_DPLL1), 1241 }, 1242 { 1243 /* DPLL 2 */ 1244 .ctl = WRPLL_CTL(0), 1245 .cfgcr1 = DPLL_CFGCR1(SKL_DPLL2), 1246 .cfgcr2 = DPLL_CFGCR2(SKL_DPLL2), 1247 }, 1248 { 1249 /* DPLL 3 */ 1250 .ctl = WRPLL_CTL(1), 1251 .cfgcr1 = DPLL_CFGCR1(SKL_DPLL3), 1252 .cfgcr2 = DPLL_CFGCR2(SKL_DPLL3), 1253 }, 1254 }; 1255 1256 static void skl_ddi_pll_write_ctrl1(struct drm_i915_private *dev_priv, 1257 struct intel_shared_dpll *pll) 1258 { 1259 const enum intel_dpll_id id = pll->info->id; 1260 u32 val; 1261 1262 val = intel_de_read(dev_priv, DPLL_CTRL1); 1263 1264 val &= ~(DPLL_CTRL1_HDMI_MODE(id) | 1265 DPLL_CTRL1_SSC(id) | 1266 DPLL_CTRL1_LINK_RATE_MASK(id)); 1267 val |= pll->state.hw_state.ctrl1 << (id * 6); 1268 1269 intel_de_write(dev_priv, DPLL_CTRL1, val); 1270 intel_de_posting_read(dev_priv, DPLL_CTRL1); 1271 } 1272 1273 static void skl_ddi_pll_enable(struct drm_i915_private *dev_priv, 1274 struct intel_shared_dpll *pll) 1275 { 1276 const struct skl_dpll_regs *regs = skl_dpll_regs; 1277 const enum intel_dpll_id id = pll->info->id; 1278 1279 skl_ddi_pll_write_ctrl1(dev_priv, pll); 1280 1281 intel_de_write(dev_priv, regs[id].cfgcr1, pll->state.hw_state.cfgcr1); 1282 intel_de_write(dev_priv, regs[id].cfgcr2, pll->state.hw_state.cfgcr2); 1283 intel_de_posting_read(dev_priv, regs[id].cfgcr1); 1284 intel_de_posting_read(dev_priv, regs[id].cfgcr2); 1285 1286 /* the enable bit is always bit 31 */ 1287 intel_de_write(dev_priv, regs[id].ctl, 1288 intel_de_read(dev_priv, regs[id].ctl) | LCPLL_PLL_ENABLE); 1289 1290 if (intel_de_wait_for_set(dev_priv, DPLL_STATUS, DPLL_LOCK(id), 5)) 1291 drm_err(&dev_priv->drm, "DPLL %d not locked\n", id); 1292 } 1293 1294 static void skl_ddi_dpll0_enable(struct drm_i915_private *dev_priv, 1295 struct intel_shared_dpll *pll) 1296 { 1297 skl_ddi_pll_write_ctrl1(dev_priv, pll); 1298 } 1299 1300 static void skl_ddi_pll_disable(struct drm_i915_private *dev_priv, 1301 struct intel_shared_dpll *pll) 1302 { 1303 const struct skl_dpll_regs *regs = skl_dpll_regs; 1304 const enum intel_dpll_id id = pll->info->id; 1305 1306 /* the enable bit is always bit 31 */ 1307 intel_de_write(dev_priv, regs[id].ctl, 1308 intel_de_read(dev_priv, regs[id].ctl) & ~LCPLL_PLL_ENABLE); 1309 intel_de_posting_read(dev_priv, regs[id].ctl); 1310 } 1311 1312 static void skl_ddi_dpll0_disable(struct drm_i915_private *dev_priv, 1313 struct intel_shared_dpll *pll) 1314 { 1315 } 1316 1317 static bool skl_ddi_pll_get_hw_state(struct drm_i915_private *dev_priv, 1318 struct intel_shared_dpll *pll, 1319 struct intel_dpll_hw_state *hw_state) 1320 { 1321 u32 val; 1322 const struct skl_dpll_regs *regs = skl_dpll_regs; 1323 const enum intel_dpll_id id = pll->info->id; 1324 intel_wakeref_t wakeref; 1325 bool ret; 1326 1327 wakeref = intel_display_power_get_if_enabled(dev_priv, 1328 POWER_DOMAIN_DISPLAY_CORE); 1329 if (!wakeref) 1330 return false; 1331 1332 ret = false; 1333 1334 val = intel_de_read(dev_priv, regs[id].ctl); 1335 if (!(val & LCPLL_PLL_ENABLE)) 1336 goto out; 1337 1338 val = intel_de_read(dev_priv, DPLL_CTRL1); 1339 hw_state->ctrl1 = (val >> (id * 6)) & 0x3f; 1340 1341 /* avoid reading back stale values if HDMI mode is not enabled */ 1342 if (val & DPLL_CTRL1_HDMI_MODE(id)) { 1343 hw_state->cfgcr1 = intel_de_read(dev_priv, regs[id].cfgcr1); 1344 hw_state->cfgcr2 = intel_de_read(dev_priv, regs[id].cfgcr2); 1345 } 1346 ret = true; 1347 1348 out: 1349 intel_display_power_put(dev_priv, POWER_DOMAIN_DISPLAY_CORE, wakeref); 1350 1351 return ret; 1352 } 1353 1354 static bool skl_ddi_dpll0_get_hw_state(struct drm_i915_private *dev_priv, 1355 struct intel_shared_dpll *pll, 1356 struct intel_dpll_hw_state *hw_state) 1357 { 1358 const struct skl_dpll_regs *regs = skl_dpll_regs; 1359 const enum intel_dpll_id id = pll->info->id; 1360 intel_wakeref_t wakeref; 1361 u32 val; 1362 bool ret; 1363 1364 wakeref = intel_display_power_get_if_enabled(dev_priv, 1365 POWER_DOMAIN_DISPLAY_CORE); 1366 if (!wakeref) 1367 return false; 1368 1369 ret = false; 1370 1371 /* DPLL0 is always enabled since it drives CDCLK */ 1372 val = intel_de_read(dev_priv, regs[id].ctl); 1373 if (drm_WARN_ON(&dev_priv->drm, !(val & LCPLL_PLL_ENABLE))) 1374 goto out; 1375 1376 val = intel_de_read(dev_priv, DPLL_CTRL1); 1377 hw_state->ctrl1 = (val >> (id * 6)) & 0x3f; 1378 1379 ret = true; 1380 1381 out: 1382 intel_display_power_put(dev_priv, POWER_DOMAIN_DISPLAY_CORE, wakeref); 1383 1384 return ret; 1385 } 1386 1387 struct skl_wrpll_context { 1388 u64 min_deviation; /* current minimal deviation */ 1389 u64 central_freq; /* chosen central freq */ 1390 u64 dco_freq; /* chosen dco freq */ 1391 unsigned int p; /* chosen divider */ 1392 }; 1393 1394 /* DCO freq must be within +1%/-6% of the DCO central freq */ 1395 #define SKL_DCO_MAX_PDEVIATION 100 1396 #define SKL_DCO_MAX_NDEVIATION 600 1397 1398 static void skl_wrpll_try_divider(struct skl_wrpll_context *ctx, 1399 u64 central_freq, 1400 u64 dco_freq, 1401 unsigned int divider) 1402 { 1403 u64 deviation; 1404 1405 deviation = div64_u64(10000 * abs_diff(dco_freq, central_freq), 1406 central_freq); 1407 1408 /* positive deviation */ 1409 if (dco_freq >= central_freq) { 1410 if (deviation < SKL_DCO_MAX_PDEVIATION && 1411 deviation < ctx->min_deviation) { 1412 ctx->min_deviation = deviation; 1413 ctx->central_freq = central_freq; 1414 ctx->dco_freq = dco_freq; 1415 ctx->p = divider; 1416 } 1417 /* negative deviation */ 1418 } else if (deviation < SKL_DCO_MAX_NDEVIATION && 1419 deviation < ctx->min_deviation) { 1420 ctx->min_deviation = deviation; 1421 ctx->central_freq = central_freq; 1422 ctx->dco_freq = dco_freq; 1423 ctx->p = divider; 1424 } 1425 } 1426 1427 static void skl_wrpll_get_multipliers(unsigned int p, 1428 unsigned int *p0 /* out */, 1429 unsigned int *p1 /* out */, 1430 unsigned int *p2 /* out */) 1431 { 1432 /* even dividers */ 1433 if (p % 2 == 0) { 1434 unsigned int half = p / 2; 1435 1436 if (half == 1 || half == 2 || half == 3 || half == 5) { 1437 *p0 = 2; 1438 *p1 = 1; 1439 *p2 = half; 1440 } else if (half % 2 == 0) { 1441 *p0 = 2; 1442 *p1 = half / 2; 1443 *p2 = 2; 1444 } else if (half % 3 == 0) { 1445 *p0 = 3; 1446 *p1 = half / 3; 1447 *p2 = 2; 1448 } else if (half % 7 == 0) { 1449 *p0 = 7; 1450 *p1 = half / 7; 1451 *p2 = 2; 1452 } 1453 } else if (p == 3 || p == 9) { /* 3, 5, 7, 9, 15, 21, 35 */ 1454 *p0 = 3; 1455 *p1 = 1; 1456 *p2 = p / 3; 1457 } else if (p == 5 || p == 7) { 1458 *p0 = p; 1459 *p1 = 1; 1460 *p2 = 1; 1461 } else if (p == 15) { 1462 *p0 = 3; 1463 *p1 = 1; 1464 *p2 = 5; 1465 } else if (p == 21) { 1466 *p0 = 7; 1467 *p1 = 1; 1468 *p2 = 3; 1469 } else if (p == 35) { 1470 *p0 = 7; 1471 *p1 = 1; 1472 *p2 = 5; 1473 } 1474 } 1475 1476 struct skl_wrpll_params { 1477 u32 dco_fraction; 1478 u32 dco_integer; 1479 u32 qdiv_ratio; 1480 u32 qdiv_mode; 1481 u32 kdiv; 1482 u32 pdiv; 1483 u32 central_freq; 1484 }; 1485 1486 static void skl_wrpll_params_populate(struct skl_wrpll_params *params, 1487 u64 afe_clock, 1488 int ref_clock, 1489 u64 central_freq, 1490 u32 p0, u32 p1, u32 p2) 1491 { 1492 u64 dco_freq; 1493 1494 switch (central_freq) { 1495 case 9600000000ULL: 1496 params->central_freq = 0; 1497 break; 1498 case 9000000000ULL: 1499 params->central_freq = 1; 1500 break; 1501 case 8400000000ULL: 1502 params->central_freq = 3; 1503 } 1504 1505 switch (p0) { 1506 case 1: 1507 params->pdiv = 0; 1508 break; 1509 case 2: 1510 params->pdiv = 1; 1511 break; 1512 case 3: 1513 params->pdiv = 2; 1514 break; 1515 case 7: 1516 params->pdiv = 4; 1517 break; 1518 default: 1519 WARN(1, "Incorrect PDiv\n"); 1520 } 1521 1522 switch (p2) { 1523 case 5: 1524 params->kdiv = 0; 1525 break; 1526 case 2: 1527 params->kdiv = 1; 1528 break; 1529 case 3: 1530 params->kdiv = 2; 1531 break; 1532 case 1: 1533 params->kdiv = 3; 1534 break; 1535 default: 1536 WARN(1, "Incorrect KDiv\n"); 1537 } 1538 1539 params->qdiv_ratio = p1; 1540 params->qdiv_mode = (params->qdiv_ratio == 1) ? 0 : 1; 1541 1542 dco_freq = p0 * p1 * p2 * afe_clock; 1543 1544 /* 1545 * Intermediate values are in Hz. 1546 * Divide by MHz to match bsepc 1547 */ 1548 params->dco_integer = div_u64(dco_freq, ref_clock * KHz(1)); 1549 params->dco_fraction = 1550 div_u64((div_u64(dco_freq, ref_clock / KHz(1)) - 1551 params->dco_integer * MHz(1)) * 0x8000, MHz(1)); 1552 } 1553 1554 static int 1555 skl_ddi_calculate_wrpll(int clock /* in Hz */, 1556 int ref_clock, 1557 struct skl_wrpll_params *wrpll_params) 1558 { 1559 static const u64 dco_central_freq[3] = { 8400000000ULL, 1560 9000000000ULL, 1561 9600000000ULL }; 1562 static const u8 even_dividers[] = { 4, 6, 8, 10, 12, 14, 16, 18, 20, 1563 24, 28, 30, 32, 36, 40, 42, 44, 1564 48, 52, 54, 56, 60, 64, 66, 68, 1565 70, 72, 76, 78, 80, 84, 88, 90, 1566 92, 96, 98 }; 1567 static const u8 odd_dividers[] = { 3, 5, 7, 9, 15, 21, 35 }; 1568 static const struct { 1569 const u8 *list; 1570 int n_dividers; 1571 } dividers[] = { 1572 { even_dividers, ARRAY_SIZE(even_dividers) }, 1573 { odd_dividers, ARRAY_SIZE(odd_dividers) }, 1574 }; 1575 struct skl_wrpll_context ctx = { 1576 .min_deviation = U64_MAX, 1577 }; 1578 unsigned int dco, d, i; 1579 unsigned int p0, p1, p2; 1580 u64 afe_clock = clock * 5; /* AFE Clock is 5x Pixel clock */ 1581 1582 for (d = 0; d < ARRAY_SIZE(dividers); d++) { 1583 for (dco = 0; dco < ARRAY_SIZE(dco_central_freq); dco++) { 1584 for (i = 0; i < dividers[d].n_dividers; i++) { 1585 unsigned int p = dividers[d].list[i]; 1586 u64 dco_freq = p * afe_clock; 1587 1588 skl_wrpll_try_divider(&ctx, 1589 dco_central_freq[dco], 1590 dco_freq, 1591 p); 1592 /* 1593 * Skip the remaining dividers if we're sure to 1594 * have found the definitive divider, we can't 1595 * improve a 0 deviation. 1596 */ 1597 if (ctx.min_deviation == 0) 1598 goto skip_remaining_dividers; 1599 } 1600 } 1601 1602 skip_remaining_dividers: 1603 /* 1604 * If a solution is found with an even divider, prefer 1605 * this one. 1606 */ 1607 if (d == 0 && ctx.p) 1608 break; 1609 } 1610 1611 if (!ctx.p) 1612 return -EINVAL; 1613 1614 /* 1615 * gcc incorrectly analyses that these can be used without being 1616 * initialized. To be fair, it's hard to guess. 1617 */ 1618 p0 = p1 = p2 = 0; 1619 skl_wrpll_get_multipliers(ctx.p, &p0, &p1, &p2); 1620 skl_wrpll_params_populate(wrpll_params, afe_clock, ref_clock, 1621 ctx.central_freq, p0, p1, p2); 1622 1623 return 0; 1624 } 1625 1626 static int skl_ddi_wrpll_get_freq(struct drm_i915_private *i915, 1627 const struct intel_shared_dpll *pll, 1628 const struct intel_dpll_hw_state *pll_state) 1629 { 1630 int ref_clock = i915->display.dpll.ref_clks.nssc; 1631 u32 p0, p1, p2, dco_freq; 1632 1633 p0 = pll_state->cfgcr2 & DPLL_CFGCR2_PDIV_MASK; 1634 p2 = pll_state->cfgcr2 & DPLL_CFGCR2_KDIV_MASK; 1635 1636 if (pll_state->cfgcr2 & DPLL_CFGCR2_QDIV_MODE(1)) 1637 p1 = (pll_state->cfgcr2 & DPLL_CFGCR2_QDIV_RATIO_MASK) >> 8; 1638 else 1639 p1 = 1; 1640 1641 1642 switch (p0) { 1643 case DPLL_CFGCR2_PDIV_1: 1644 p0 = 1; 1645 break; 1646 case DPLL_CFGCR2_PDIV_2: 1647 p0 = 2; 1648 break; 1649 case DPLL_CFGCR2_PDIV_3: 1650 p0 = 3; 1651 break; 1652 case DPLL_CFGCR2_PDIV_7_INVALID: 1653 /* 1654 * Incorrect ASUS-Z170M BIOS setting, the HW seems to ignore bit#0, 1655 * handling it the same way as PDIV_7. 1656 */ 1657 drm_dbg_kms(&i915->drm, "Invalid WRPLL PDIV divider value, fixing it.\n"); 1658 fallthrough; 1659 case DPLL_CFGCR2_PDIV_7: 1660 p0 = 7; 1661 break; 1662 default: 1663 MISSING_CASE(p0); 1664 return 0; 1665 } 1666 1667 switch (p2) { 1668 case DPLL_CFGCR2_KDIV_5: 1669 p2 = 5; 1670 break; 1671 case DPLL_CFGCR2_KDIV_2: 1672 p2 = 2; 1673 break; 1674 case DPLL_CFGCR2_KDIV_3: 1675 p2 = 3; 1676 break; 1677 case DPLL_CFGCR2_KDIV_1: 1678 p2 = 1; 1679 break; 1680 default: 1681 MISSING_CASE(p2); 1682 return 0; 1683 } 1684 1685 dco_freq = (pll_state->cfgcr1 & DPLL_CFGCR1_DCO_INTEGER_MASK) * 1686 ref_clock; 1687 1688 dco_freq += ((pll_state->cfgcr1 & DPLL_CFGCR1_DCO_FRACTION_MASK) >> 9) * 1689 ref_clock / 0x8000; 1690 1691 if (drm_WARN_ON(&i915->drm, p0 == 0 || p1 == 0 || p2 == 0)) 1692 return 0; 1693 1694 return dco_freq / (p0 * p1 * p2 * 5); 1695 } 1696 1697 static int skl_ddi_hdmi_pll_dividers(struct intel_crtc_state *crtc_state) 1698 { 1699 struct drm_i915_private *i915 = to_i915(crtc_state->uapi.crtc->dev); 1700 struct skl_wrpll_params wrpll_params = {}; 1701 u32 ctrl1, cfgcr1, cfgcr2; 1702 int ret; 1703 1704 /* 1705 * See comment in intel_dpll_hw_state to understand why we always use 0 1706 * as the DPLL id in this function. 1707 */ 1708 ctrl1 = DPLL_CTRL1_OVERRIDE(0); 1709 1710 ctrl1 |= DPLL_CTRL1_HDMI_MODE(0); 1711 1712 ret = skl_ddi_calculate_wrpll(crtc_state->port_clock * 1000, 1713 i915->display.dpll.ref_clks.nssc, &wrpll_params); 1714 if (ret) 1715 return ret; 1716 1717 cfgcr1 = DPLL_CFGCR1_FREQ_ENABLE | 1718 DPLL_CFGCR1_DCO_FRACTION(wrpll_params.dco_fraction) | 1719 wrpll_params.dco_integer; 1720 1721 cfgcr2 = DPLL_CFGCR2_QDIV_RATIO(wrpll_params.qdiv_ratio) | 1722 DPLL_CFGCR2_QDIV_MODE(wrpll_params.qdiv_mode) | 1723 DPLL_CFGCR2_KDIV(wrpll_params.kdiv) | 1724 DPLL_CFGCR2_PDIV(wrpll_params.pdiv) | 1725 wrpll_params.central_freq; 1726 1727 crtc_state->dpll_hw_state.ctrl1 = ctrl1; 1728 crtc_state->dpll_hw_state.cfgcr1 = cfgcr1; 1729 crtc_state->dpll_hw_state.cfgcr2 = cfgcr2; 1730 1731 crtc_state->port_clock = skl_ddi_wrpll_get_freq(i915, NULL, 1732 &crtc_state->dpll_hw_state); 1733 1734 return 0; 1735 } 1736 1737 static int 1738 skl_ddi_dp_set_dpll_hw_state(struct intel_crtc_state *crtc_state) 1739 { 1740 u32 ctrl1; 1741 1742 /* 1743 * See comment in intel_dpll_hw_state to understand why we always use 0 1744 * as the DPLL id in this function. 1745 */ 1746 ctrl1 = DPLL_CTRL1_OVERRIDE(0); 1747 switch (crtc_state->port_clock / 2) { 1748 case 81000: 1749 ctrl1 |= DPLL_CTRL1_LINK_RATE(DPLL_CTRL1_LINK_RATE_810, 0); 1750 break; 1751 case 135000: 1752 ctrl1 |= DPLL_CTRL1_LINK_RATE(DPLL_CTRL1_LINK_RATE_1350, 0); 1753 break; 1754 case 270000: 1755 ctrl1 |= DPLL_CTRL1_LINK_RATE(DPLL_CTRL1_LINK_RATE_2700, 0); 1756 break; 1757 /* eDP 1.4 rates */ 1758 case 162000: 1759 ctrl1 |= DPLL_CTRL1_LINK_RATE(DPLL_CTRL1_LINK_RATE_1620, 0); 1760 break; 1761 case 108000: 1762 ctrl1 |= DPLL_CTRL1_LINK_RATE(DPLL_CTRL1_LINK_RATE_1080, 0); 1763 break; 1764 case 216000: 1765 ctrl1 |= DPLL_CTRL1_LINK_RATE(DPLL_CTRL1_LINK_RATE_2160, 0); 1766 break; 1767 } 1768 1769 crtc_state->dpll_hw_state.ctrl1 = ctrl1; 1770 1771 return 0; 1772 } 1773 1774 static int skl_ddi_lcpll_get_freq(struct drm_i915_private *i915, 1775 const struct intel_shared_dpll *pll, 1776 const struct intel_dpll_hw_state *pll_state) 1777 { 1778 int link_clock = 0; 1779 1780 switch ((pll_state->ctrl1 & DPLL_CTRL1_LINK_RATE_MASK(0)) >> 1781 DPLL_CTRL1_LINK_RATE_SHIFT(0)) { 1782 case DPLL_CTRL1_LINK_RATE_810: 1783 link_clock = 81000; 1784 break; 1785 case DPLL_CTRL1_LINK_RATE_1080: 1786 link_clock = 108000; 1787 break; 1788 case DPLL_CTRL1_LINK_RATE_1350: 1789 link_clock = 135000; 1790 break; 1791 case DPLL_CTRL1_LINK_RATE_1620: 1792 link_clock = 162000; 1793 break; 1794 case DPLL_CTRL1_LINK_RATE_2160: 1795 link_clock = 216000; 1796 break; 1797 case DPLL_CTRL1_LINK_RATE_2700: 1798 link_clock = 270000; 1799 break; 1800 default: 1801 drm_WARN(&i915->drm, 1, "Unsupported link rate\n"); 1802 break; 1803 } 1804 1805 return link_clock * 2; 1806 } 1807 1808 static int skl_compute_dpll(struct intel_atomic_state *state, 1809 struct intel_crtc *crtc, 1810 struct intel_encoder *encoder) 1811 { 1812 struct intel_crtc_state *crtc_state = 1813 intel_atomic_get_new_crtc_state(state, crtc); 1814 1815 if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_HDMI)) 1816 return skl_ddi_hdmi_pll_dividers(crtc_state); 1817 else if (intel_crtc_has_dp_encoder(crtc_state)) 1818 return skl_ddi_dp_set_dpll_hw_state(crtc_state); 1819 else 1820 return -EINVAL; 1821 } 1822 1823 static int skl_get_dpll(struct intel_atomic_state *state, 1824 struct intel_crtc *crtc, 1825 struct intel_encoder *encoder) 1826 { 1827 struct intel_crtc_state *crtc_state = 1828 intel_atomic_get_new_crtc_state(state, crtc); 1829 struct intel_shared_dpll *pll; 1830 1831 if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_EDP)) 1832 pll = intel_find_shared_dpll(state, crtc, 1833 &crtc_state->dpll_hw_state, 1834 BIT(DPLL_ID_SKL_DPLL0)); 1835 else 1836 pll = intel_find_shared_dpll(state, crtc, 1837 &crtc_state->dpll_hw_state, 1838 BIT(DPLL_ID_SKL_DPLL3) | 1839 BIT(DPLL_ID_SKL_DPLL2) | 1840 BIT(DPLL_ID_SKL_DPLL1)); 1841 if (!pll) 1842 return -EINVAL; 1843 1844 intel_reference_shared_dpll(state, crtc, 1845 pll, &crtc_state->dpll_hw_state); 1846 1847 crtc_state->shared_dpll = pll; 1848 1849 return 0; 1850 } 1851 1852 static int skl_ddi_pll_get_freq(struct drm_i915_private *i915, 1853 const struct intel_shared_dpll *pll, 1854 const struct intel_dpll_hw_state *pll_state) 1855 { 1856 /* 1857 * ctrl1 register is already shifted for each pll, just use 0 to get 1858 * the internal shift for each field 1859 */ 1860 if (pll_state->ctrl1 & DPLL_CTRL1_HDMI_MODE(0)) 1861 return skl_ddi_wrpll_get_freq(i915, pll, pll_state); 1862 else 1863 return skl_ddi_lcpll_get_freq(i915, pll, pll_state); 1864 } 1865 1866 static void skl_update_dpll_ref_clks(struct drm_i915_private *i915) 1867 { 1868 /* No SSC ref */ 1869 i915->display.dpll.ref_clks.nssc = i915->display.cdclk.hw.ref; 1870 } 1871 1872 static void skl_dump_hw_state(struct drm_i915_private *dev_priv, 1873 const struct intel_dpll_hw_state *hw_state) 1874 { 1875 drm_dbg_kms(&dev_priv->drm, "dpll_hw_state: " 1876 "ctrl1: 0x%x, cfgcr1: 0x%x, cfgcr2: 0x%x\n", 1877 hw_state->ctrl1, 1878 hw_state->cfgcr1, 1879 hw_state->cfgcr2); 1880 } 1881 1882 static const struct intel_shared_dpll_funcs skl_ddi_pll_funcs = { 1883 .enable = skl_ddi_pll_enable, 1884 .disable = skl_ddi_pll_disable, 1885 .get_hw_state = skl_ddi_pll_get_hw_state, 1886 .get_freq = skl_ddi_pll_get_freq, 1887 }; 1888 1889 static const struct intel_shared_dpll_funcs skl_ddi_dpll0_funcs = { 1890 .enable = skl_ddi_dpll0_enable, 1891 .disable = skl_ddi_dpll0_disable, 1892 .get_hw_state = skl_ddi_dpll0_get_hw_state, 1893 .get_freq = skl_ddi_pll_get_freq, 1894 }; 1895 1896 static const struct dpll_info skl_plls[] = { 1897 { "DPLL 0", &skl_ddi_dpll0_funcs, DPLL_ID_SKL_DPLL0, INTEL_DPLL_ALWAYS_ON }, 1898 { "DPLL 1", &skl_ddi_pll_funcs, DPLL_ID_SKL_DPLL1, 0 }, 1899 { "DPLL 2", &skl_ddi_pll_funcs, DPLL_ID_SKL_DPLL2, 0 }, 1900 { "DPLL 3", &skl_ddi_pll_funcs, DPLL_ID_SKL_DPLL3, 0 }, 1901 { }, 1902 }; 1903 1904 static const struct intel_dpll_mgr skl_pll_mgr = { 1905 .dpll_info = skl_plls, 1906 .compute_dplls = skl_compute_dpll, 1907 .get_dplls = skl_get_dpll, 1908 .put_dplls = intel_put_dpll, 1909 .update_ref_clks = skl_update_dpll_ref_clks, 1910 .dump_hw_state = skl_dump_hw_state, 1911 }; 1912 1913 static void bxt_ddi_pll_enable(struct drm_i915_private *dev_priv, 1914 struct intel_shared_dpll *pll) 1915 { 1916 u32 temp; 1917 enum port port = (enum port)pll->info->id; /* 1:1 port->PLL mapping */ 1918 enum dpio_phy phy; 1919 enum dpio_channel ch; 1920 1921 bxt_port_to_phy_channel(dev_priv, port, &phy, &ch); 1922 1923 /* Non-SSC reference */ 1924 temp = intel_de_read(dev_priv, BXT_PORT_PLL_ENABLE(port)); 1925 temp |= PORT_PLL_REF_SEL; 1926 intel_de_write(dev_priv, BXT_PORT_PLL_ENABLE(port), temp); 1927 1928 if (IS_GEMINILAKE(dev_priv)) { 1929 temp = intel_de_read(dev_priv, BXT_PORT_PLL_ENABLE(port)); 1930 temp |= PORT_PLL_POWER_ENABLE; 1931 intel_de_write(dev_priv, BXT_PORT_PLL_ENABLE(port), temp); 1932 1933 if (wait_for_us((intel_de_read(dev_priv, BXT_PORT_PLL_ENABLE(port)) & 1934 PORT_PLL_POWER_STATE), 200)) 1935 drm_err(&dev_priv->drm, 1936 "Power state not set for PLL:%d\n", port); 1937 } 1938 1939 /* Disable 10 bit clock */ 1940 temp = intel_de_read(dev_priv, BXT_PORT_PLL_EBB_4(phy, ch)); 1941 temp &= ~PORT_PLL_10BIT_CLK_ENABLE; 1942 intel_de_write(dev_priv, BXT_PORT_PLL_EBB_4(phy, ch), temp); 1943 1944 /* Write P1 & P2 */ 1945 temp = intel_de_read(dev_priv, BXT_PORT_PLL_EBB_0(phy, ch)); 1946 temp &= ~(PORT_PLL_P1_MASK | PORT_PLL_P2_MASK); 1947 temp |= pll->state.hw_state.ebb0; 1948 intel_de_write(dev_priv, BXT_PORT_PLL_EBB_0(phy, ch), temp); 1949 1950 /* Write M2 integer */ 1951 temp = intel_de_read(dev_priv, BXT_PORT_PLL(phy, ch, 0)); 1952 temp &= ~PORT_PLL_M2_INT_MASK; 1953 temp |= pll->state.hw_state.pll0; 1954 intel_de_write(dev_priv, BXT_PORT_PLL(phy, ch, 0), temp); 1955 1956 /* Write N */ 1957 temp = intel_de_read(dev_priv, BXT_PORT_PLL(phy, ch, 1)); 1958 temp &= ~PORT_PLL_N_MASK; 1959 temp |= pll->state.hw_state.pll1; 1960 intel_de_write(dev_priv, BXT_PORT_PLL(phy, ch, 1), temp); 1961 1962 /* Write M2 fraction */ 1963 temp = intel_de_read(dev_priv, BXT_PORT_PLL(phy, ch, 2)); 1964 temp &= ~PORT_PLL_M2_FRAC_MASK; 1965 temp |= pll->state.hw_state.pll2; 1966 intel_de_write(dev_priv, BXT_PORT_PLL(phy, ch, 2), temp); 1967 1968 /* Write M2 fraction enable */ 1969 temp = intel_de_read(dev_priv, BXT_PORT_PLL(phy, ch, 3)); 1970 temp &= ~PORT_PLL_M2_FRAC_ENABLE; 1971 temp |= pll->state.hw_state.pll3; 1972 intel_de_write(dev_priv, BXT_PORT_PLL(phy, ch, 3), temp); 1973 1974 /* Write coeff */ 1975 temp = intel_de_read(dev_priv, BXT_PORT_PLL(phy, ch, 6)); 1976 temp &= ~PORT_PLL_PROP_COEFF_MASK; 1977 temp &= ~PORT_PLL_INT_COEFF_MASK; 1978 temp &= ~PORT_PLL_GAIN_CTL_MASK; 1979 temp |= pll->state.hw_state.pll6; 1980 intel_de_write(dev_priv, BXT_PORT_PLL(phy, ch, 6), temp); 1981 1982 /* Write calibration val */ 1983 temp = intel_de_read(dev_priv, BXT_PORT_PLL(phy, ch, 8)); 1984 temp &= ~PORT_PLL_TARGET_CNT_MASK; 1985 temp |= pll->state.hw_state.pll8; 1986 intel_de_write(dev_priv, BXT_PORT_PLL(phy, ch, 8), temp); 1987 1988 temp = intel_de_read(dev_priv, BXT_PORT_PLL(phy, ch, 9)); 1989 temp &= ~PORT_PLL_LOCK_THRESHOLD_MASK; 1990 temp |= pll->state.hw_state.pll9; 1991 intel_de_write(dev_priv, BXT_PORT_PLL(phy, ch, 9), temp); 1992 1993 temp = intel_de_read(dev_priv, BXT_PORT_PLL(phy, ch, 10)); 1994 temp &= ~PORT_PLL_DCO_AMP_OVR_EN_H; 1995 temp &= ~PORT_PLL_DCO_AMP_MASK; 1996 temp |= pll->state.hw_state.pll10; 1997 intel_de_write(dev_priv, BXT_PORT_PLL(phy, ch, 10), temp); 1998 1999 /* Recalibrate with new settings */ 2000 temp = intel_de_read(dev_priv, BXT_PORT_PLL_EBB_4(phy, ch)); 2001 temp |= PORT_PLL_RECALIBRATE; 2002 intel_de_write(dev_priv, BXT_PORT_PLL_EBB_4(phy, ch), temp); 2003 temp &= ~PORT_PLL_10BIT_CLK_ENABLE; 2004 temp |= pll->state.hw_state.ebb4; 2005 intel_de_write(dev_priv, BXT_PORT_PLL_EBB_4(phy, ch), temp); 2006 2007 /* Enable PLL */ 2008 temp = intel_de_read(dev_priv, BXT_PORT_PLL_ENABLE(port)); 2009 temp |= PORT_PLL_ENABLE; 2010 intel_de_write(dev_priv, BXT_PORT_PLL_ENABLE(port), temp); 2011 intel_de_posting_read(dev_priv, BXT_PORT_PLL_ENABLE(port)); 2012 2013 if (wait_for_us((intel_de_read(dev_priv, BXT_PORT_PLL_ENABLE(port)) & PORT_PLL_LOCK), 2014 200)) 2015 drm_err(&dev_priv->drm, "PLL %d not locked\n", port); 2016 2017 if (IS_GEMINILAKE(dev_priv)) { 2018 temp = intel_de_read(dev_priv, BXT_PORT_TX_DW5_LN0(phy, ch)); 2019 temp |= DCC_DELAY_RANGE_2; 2020 intel_de_write(dev_priv, BXT_PORT_TX_DW5_GRP(phy, ch), temp); 2021 } 2022 2023 /* 2024 * While we write to the group register to program all lanes at once we 2025 * can read only lane registers and we pick lanes 0/1 for that. 2026 */ 2027 temp = intel_de_read(dev_priv, BXT_PORT_PCS_DW12_LN01(phy, ch)); 2028 temp &= ~LANE_STAGGER_MASK; 2029 temp &= ~LANESTAGGER_STRAP_OVRD; 2030 temp |= pll->state.hw_state.pcsdw12; 2031 intel_de_write(dev_priv, BXT_PORT_PCS_DW12_GRP(phy, ch), temp); 2032 } 2033 2034 static void bxt_ddi_pll_disable(struct drm_i915_private *dev_priv, 2035 struct intel_shared_dpll *pll) 2036 { 2037 enum port port = (enum port)pll->info->id; /* 1:1 port->PLL mapping */ 2038 u32 temp; 2039 2040 temp = intel_de_read(dev_priv, BXT_PORT_PLL_ENABLE(port)); 2041 temp &= ~PORT_PLL_ENABLE; 2042 intel_de_write(dev_priv, BXT_PORT_PLL_ENABLE(port), temp); 2043 intel_de_posting_read(dev_priv, BXT_PORT_PLL_ENABLE(port)); 2044 2045 if (IS_GEMINILAKE(dev_priv)) { 2046 temp = intel_de_read(dev_priv, BXT_PORT_PLL_ENABLE(port)); 2047 temp &= ~PORT_PLL_POWER_ENABLE; 2048 intel_de_write(dev_priv, BXT_PORT_PLL_ENABLE(port), temp); 2049 2050 if (wait_for_us(!(intel_de_read(dev_priv, BXT_PORT_PLL_ENABLE(port)) & 2051 PORT_PLL_POWER_STATE), 200)) 2052 drm_err(&dev_priv->drm, 2053 "Power state not reset for PLL:%d\n", port); 2054 } 2055 } 2056 2057 static bool bxt_ddi_pll_get_hw_state(struct drm_i915_private *dev_priv, 2058 struct intel_shared_dpll *pll, 2059 struct intel_dpll_hw_state *hw_state) 2060 { 2061 enum port port = (enum port)pll->info->id; /* 1:1 port->PLL mapping */ 2062 intel_wakeref_t wakeref; 2063 enum dpio_phy phy; 2064 enum dpio_channel ch; 2065 u32 val; 2066 bool ret; 2067 2068 bxt_port_to_phy_channel(dev_priv, port, &phy, &ch); 2069 2070 wakeref = intel_display_power_get_if_enabled(dev_priv, 2071 POWER_DOMAIN_DISPLAY_CORE); 2072 if (!wakeref) 2073 return false; 2074 2075 ret = false; 2076 2077 val = intel_de_read(dev_priv, BXT_PORT_PLL_ENABLE(port)); 2078 if (!(val & PORT_PLL_ENABLE)) 2079 goto out; 2080 2081 hw_state->ebb0 = intel_de_read(dev_priv, BXT_PORT_PLL_EBB_0(phy, ch)); 2082 hw_state->ebb0 &= PORT_PLL_P1_MASK | PORT_PLL_P2_MASK; 2083 2084 hw_state->ebb4 = intel_de_read(dev_priv, BXT_PORT_PLL_EBB_4(phy, ch)); 2085 hw_state->ebb4 &= PORT_PLL_10BIT_CLK_ENABLE; 2086 2087 hw_state->pll0 = intel_de_read(dev_priv, BXT_PORT_PLL(phy, ch, 0)); 2088 hw_state->pll0 &= PORT_PLL_M2_INT_MASK; 2089 2090 hw_state->pll1 = intel_de_read(dev_priv, BXT_PORT_PLL(phy, ch, 1)); 2091 hw_state->pll1 &= PORT_PLL_N_MASK; 2092 2093 hw_state->pll2 = intel_de_read(dev_priv, BXT_PORT_PLL(phy, ch, 2)); 2094 hw_state->pll2 &= PORT_PLL_M2_FRAC_MASK; 2095 2096 hw_state->pll3 = intel_de_read(dev_priv, BXT_PORT_PLL(phy, ch, 3)); 2097 hw_state->pll3 &= PORT_PLL_M2_FRAC_ENABLE; 2098 2099 hw_state->pll6 = intel_de_read(dev_priv, BXT_PORT_PLL(phy, ch, 6)); 2100 hw_state->pll6 &= PORT_PLL_PROP_COEFF_MASK | 2101 PORT_PLL_INT_COEFF_MASK | 2102 PORT_PLL_GAIN_CTL_MASK; 2103 2104 hw_state->pll8 = intel_de_read(dev_priv, BXT_PORT_PLL(phy, ch, 8)); 2105 hw_state->pll8 &= PORT_PLL_TARGET_CNT_MASK; 2106 2107 hw_state->pll9 = intel_de_read(dev_priv, BXT_PORT_PLL(phy, ch, 9)); 2108 hw_state->pll9 &= PORT_PLL_LOCK_THRESHOLD_MASK; 2109 2110 hw_state->pll10 = intel_de_read(dev_priv, BXT_PORT_PLL(phy, ch, 10)); 2111 hw_state->pll10 &= PORT_PLL_DCO_AMP_OVR_EN_H | 2112 PORT_PLL_DCO_AMP_MASK; 2113 2114 /* 2115 * While we write to the group register to program all lanes at once we 2116 * can read only lane registers. We configure all lanes the same way, so 2117 * here just read out lanes 0/1 and output a note if lanes 2/3 differ. 2118 */ 2119 hw_state->pcsdw12 = intel_de_read(dev_priv, 2120 BXT_PORT_PCS_DW12_LN01(phy, ch)); 2121 if (intel_de_read(dev_priv, BXT_PORT_PCS_DW12_LN23(phy, ch)) != hw_state->pcsdw12) 2122 drm_dbg(&dev_priv->drm, 2123 "lane stagger config different for lane 01 (%08x) and 23 (%08x)\n", 2124 hw_state->pcsdw12, 2125 intel_de_read(dev_priv, 2126 BXT_PORT_PCS_DW12_LN23(phy, ch))); 2127 hw_state->pcsdw12 &= LANE_STAGGER_MASK | LANESTAGGER_STRAP_OVRD; 2128 2129 ret = true; 2130 2131 out: 2132 intel_display_power_put(dev_priv, POWER_DOMAIN_DISPLAY_CORE, wakeref); 2133 2134 return ret; 2135 } 2136 2137 /* pre-calculated values for DP linkrates */ 2138 static const struct dpll bxt_dp_clk_val[] = { 2139 /* m2 is .22 binary fixed point */ 2140 { .dot = 162000, .p1 = 4, .p2 = 2, .n = 1, .m1 = 2, .m2 = 0x819999a /* 32.4 */ }, 2141 { .dot = 270000, .p1 = 4, .p2 = 1, .n = 1, .m1 = 2, .m2 = 0x6c00000 /* 27.0 */ }, 2142 { .dot = 540000, .p1 = 2, .p2 = 1, .n = 1, .m1 = 2, .m2 = 0x6c00000 /* 27.0 */ }, 2143 { .dot = 216000, .p1 = 3, .p2 = 2, .n = 1, .m1 = 2, .m2 = 0x819999a /* 32.4 */ }, 2144 { .dot = 243000, .p1 = 4, .p2 = 1, .n = 1, .m1 = 2, .m2 = 0x6133333 /* 24.3 */ }, 2145 { .dot = 324000, .p1 = 4, .p2 = 1, .n = 1, .m1 = 2, .m2 = 0x819999a /* 32.4 */ }, 2146 { .dot = 432000, .p1 = 3, .p2 = 1, .n = 1, .m1 = 2, .m2 = 0x819999a /* 32.4 */ }, 2147 }; 2148 2149 static int 2150 bxt_ddi_hdmi_pll_dividers(struct intel_crtc_state *crtc_state, 2151 struct dpll *clk_div) 2152 { 2153 struct drm_i915_private *i915 = to_i915(crtc_state->uapi.crtc->dev); 2154 2155 /* Calculate HDMI div */ 2156 /* 2157 * FIXME: tie the following calculation into 2158 * i9xx_crtc_compute_clock 2159 */ 2160 if (!bxt_find_best_dpll(crtc_state, clk_div)) 2161 return -EINVAL; 2162 2163 drm_WARN_ON(&i915->drm, clk_div->m1 != 2); 2164 2165 return 0; 2166 } 2167 2168 static void bxt_ddi_dp_pll_dividers(struct intel_crtc_state *crtc_state, 2169 struct dpll *clk_div) 2170 { 2171 struct drm_i915_private *i915 = to_i915(crtc_state->uapi.crtc->dev); 2172 int i; 2173 2174 *clk_div = bxt_dp_clk_val[0]; 2175 for (i = 0; i < ARRAY_SIZE(bxt_dp_clk_val); ++i) { 2176 if (crtc_state->port_clock == bxt_dp_clk_val[i].dot) { 2177 *clk_div = bxt_dp_clk_val[i]; 2178 break; 2179 } 2180 } 2181 2182 chv_calc_dpll_params(i915->display.dpll.ref_clks.nssc, clk_div); 2183 2184 drm_WARN_ON(&i915->drm, clk_div->vco == 0 || 2185 clk_div->dot != crtc_state->port_clock); 2186 } 2187 2188 static int bxt_ddi_set_dpll_hw_state(struct intel_crtc_state *crtc_state, 2189 const struct dpll *clk_div) 2190 { 2191 struct drm_i915_private *i915 = to_i915(crtc_state->uapi.crtc->dev); 2192 struct intel_dpll_hw_state *dpll_hw_state = &crtc_state->dpll_hw_state; 2193 int clock = crtc_state->port_clock; 2194 int vco = clk_div->vco; 2195 u32 prop_coef, int_coef, gain_ctl, targ_cnt; 2196 u32 lanestagger; 2197 2198 if (vco >= 6200000 && vco <= 6700000) { 2199 prop_coef = 4; 2200 int_coef = 9; 2201 gain_ctl = 3; 2202 targ_cnt = 8; 2203 } else if ((vco > 5400000 && vco < 6200000) || 2204 (vco >= 4800000 && vco < 5400000)) { 2205 prop_coef = 5; 2206 int_coef = 11; 2207 gain_ctl = 3; 2208 targ_cnt = 9; 2209 } else if (vco == 5400000) { 2210 prop_coef = 3; 2211 int_coef = 8; 2212 gain_ctl = 1; 2213 targ_cnt = 9; 2214 } else { 2215 drm_err(&i915->drm, "Invalid VCO\n"); 2216 return -EINVAL; 2217 } 2218 2219 if (clock > 270000) 2220 lanestagger = 0x18; 2221 else if (clock > 135000) 2222 lanestagger = 0x0d; 2223 else if (clock > 67000) 2224 lanestagger = 0x07; 2225 else if (clock > 33000) 2226 lanestagger = 0x04; 2227 else 2228 lanestagger = 0x02; 2229 2230 dpll_hw_state->ebb0 = PORT_PLL_P1(clk_div->p1) | PORT_PLL_P2(clk_div->p2); 2231 dpll_hw_state->pll0 = PORT_PLL_M2_INT(clk_div->m2 >> 22); 2232 dpll_hw_state->pll1 = PORT_PLL_N(clk_div->n); 2233 dpll_hw_state->pll2 = PORT_PLL_M2_FRAC(clk_div->m2 & 0x3fffff); 2234 2235 if (clk_div->m2 & 0x3fffff) 2236 dpll_hw_state->pll3 = PORT_PLL_M2_FRAC_ENABLE; 2237 2238 dpll_hw_state->pll6 = PORT_PLL_PROP_COEFF(prop_coef) | 2239 PORT_PLL_INT_COEFF(int_coef) | 2240 PORT_PLL_GAIN_CTL(gain_ctl); 2241 2242 dpll_hw_state->pll8 = PORT_PLL_TARGET_CNT(targ_cnt); 2243 2244 dpll_hw_state->pll9 = PORT_PLL_LOCK_THRESHOLD(5); 2245 2246 dpll_hw_state->pll10 = PORT_PLL_DCO_AMP(15) | 2247 PORT_PLL_DCO_AMP_OVR_EN_H; 2248 2249 dpll_hw_state->ebb4 = PORT_PLL_10BIT_CLK_ENABLE; 2250 2251 dpll_hw_state->pcsdw12 = LANESTAGGER_STRAP_OVRD | lanestagger; 2252 2253 return 0; 2254 } 2255 2256 static int bxt_ddi_pll_get_freq(struct drm_i915_private *i915, 2257 const struct intel_shared_dpll *pll, 2258 const struct intel_dpll_hw_state *pll_state) 2259 { 2260 struct dpll clock; 2261 2262 clock.m1 = 2; 2263 clock.m2 = REG_FIELD_GET(PORT_PLL_M2_INT_MASK, pll_state->pll0) << 22; 2264 if (pll_state->pll3 & PORT_PLL_M2_FRAC_ENABLE) 2265 clock.m2 |= REG_FIELD_GET(PORT_PLL_M2_FRAC_MASK, pll_state->pll2); 2266 clock.n = REG_FIELD_GET(PORT_PLL_N_MASK, pll_state->pll1); 2267 clock.p1 = REG_FIELD_GET(PORT_PLL_P1_MASK, pll_state->ebb0); 2268 clock.p2 = REG_FIELD_GET(PORT_PLL_P2_MASK, pll_state->ebb0); 2269 2270 return chv_calc_dpll_params(i915->display.dpll.ref_clks.nssc, &clock); 2271 } 2272 2273 static int 2274 bxt_ddi_dp_set_dpll_hw_state(struct intel_crtc_state *crtc_state) 2275 { 2276 struct dpll clk_div = {}; 2277 2278 bxt_ddi_dp_pll_dividers(crtc_state, &clk_div); 2279 2280 return bxt_ddi_set_dpll_hw_state(crtc_state, &clk_div); 2281 } 2282 2283 static int 2284 bxt_ddi_hdmi_set_dpll_hw_state(struct intel_crtc_state *crtc_state) 2285 { 2286 struct drm_i915_private *i915 = to_i915(crtc_state->uapi.crtc->dev); 2287 struct dpll clk_div = {}; 2288 int ret; 2289 2290 bxt_ddi_hdmi_pll_dividers(crtc_state, &clk_div); 2291 2292 ret = bxt_ddi_set_dpll_hw_state(crtc_state, &clk_div); 2293 if (ret) 2294 return ret; 2295 2296 crtc_state->port_clock = bxt_ddi_pll_get_freq(i915, NULL, 2297 &crtc_state->dpll_hw_state); 2298 2299 return 0; 2300 } 2301 2302 static int bxt_compute_dpll(struct intel_atomic_state *state, 2303 struct intel_crtc *crtc, 2304 struct intel_encoder *encoder) 2305 { 2306 struct intel_crtc_state *crtc_state = 2307 intel_atomic_get_new_crtc_state(state, crtc); 2308 2309 if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_HDMI)) 2310 return bxt_ddi_hdmi_set_dpll_hw_state(crtc_state); 2311 else if (intel_crtc_has_dp_encoder(crtc_state)) 2312 return bxt_ddi_dp_set_dpll_hw_state(crtc_state); 2313 else 2314 return -EINVAL; 2315 } 2316 2317 static int bxt_get_dpll(struct intel_atomic_state *state, 2318 struct intel_crtc *crtc, 2319 struct intel_encoder *encoder) 2320 { 2321 struct intel_crtc_state *crtc_state = 2322 intel_atomic_get_new_crtc_state(state, crtc); 2323 struct drm_i915_private *dev_priv = to_i915(crtc->base.dev); 2324 struct intel_shared_dpll *pll; 2325 enum intel_dpll_id id; 2326 2327 /* 1:1 mapping between ports and PLLs */ 2328 id = (enum intel_dpll_id) encoder->port; 2329 pll = intel_get_shared_dpll_by_id(dev_priv, id); 2330 2331 drm_dbg_kms(&dev_priv->drm, "[CRTC:%d:%s] using pre-allocated %s\n", 2332 crtc->base.base.id, crtc->base.name, pll->info->name); 2333 2334 intel_reference_shared_dpll(state, crtc, 2335 pll, &crtc_state->dpll_hw_state); 2336 2337 crtc_state->shared_dpll = pll; 2338 2339 return 0; 2340 } 2341 2342 static void bxt_update_dpll_ref_clks(struct drm_i915_private *i915) 2343 { 2344 i915->display.dpll.ref_clks.ssc = 100000; 2345 i915->display.dpll.ref_clks.nssc = 100000; 2346 /* DSI non-SSC ref 19.2MHz */ 2347 } 2348 2349 static void bxt_dump_hw_state(struct drm_i915_private *dev_priv, 2350 const struct intel_dpll_hw_state *hw_state) 2351 { 2352 drm_dbg_kms(&dev_priv->drm, "dpll_hw_state: ebb0: 0x%x, ebb4: 0x%x," 2353 "pll0: 0x%x, pll1: 0x%x, pll2: 0x%x, pll3: 0x%x, " 2354 "pll6: 0x%x, pll8: 0x%x, pll9: 0x%x, pll10: 0x%x, pcsdw12: 0x%x\n", 2355 hw_state->ebb0, 2356 hw_state->ebb4, 2357 hw_state->pll0, 2358 hw_state->pll1, 2359 hw_state->pll2, 2360 hw_state->pll3, 2361 hw_state->pll6, 2362 hw_state->pll8, 2363 hw_state->pll9, 2364 hw_state->pll10, 2365 hw_state->pcsdw12); 2366 } 2367 2368 static const struct intel_shared_dpll_funcs bxt_ddi_pll_funcs = { 2369 .enable = bxt_ddi_pll_enable, 2370 .disable = bxt_ddi_pll_disable, 2371 .get_hw_state = bxt_ddi_pll_get_hw_state, 2372 .get_freq = bxt_ddi_pll_get_freq, 2373 }; 2374 2375 static const struct dpll_info bxt_plls[] = { 2376 { "PORT PLL A", &bxt_ddi_pll_funcs, DPLL_ID_SKL_DPLL0, 0 }, 2377 { "PORT PLL B", &bxt_ddi_pll_funcs, DPLL_ID_SKL_DPLL1, 0 }, 2378 { "PORT PLL C", &bxt_ddi_pll_funcs, DPLL_ID_SKL_DPLL2, 0 }, 2379 { }, 2380 }; 2381 2382 static const struct intel_dpll_mgr bxt_pll_mgr = { 2383 .dpll_info = bxt_plls, 2384 .compute_dplls = bxt_compute_dpll, 2385 .get_dplls = bxt_get_dpll, 2386 .put_dplls = intel_put_dpll, 2387 .update_ref_clks = bxt_update_dpll_ref_clks, 2388 .dump_hw_state = bxt_dump_hw_state, 2389 }; 2390 2391 static void icl_wrpll_get_multipliers(int bestdiv, int *pdiv, 2392 int *qdiv, int *kdiv) 2393 { 2394 /* even dividers */ 2395 if (bestdiv % 2 == 0) { 2396 if (bestdiv == 2) { 2397 *pdiv = 2; 2398 *qdiv = 1; 2399 *kdiv = 1; 2400 } else if (bestdiv % 4 == 0) { 2401 *pdiv = 2; 2402 *qdiv = bestdiv / 4; 2403 *kdiv = 2; 2404 } else if (bestdiv % 6 == 0) { 2405 *pdiv = 3; 2406 *qdiv = bestdiv / 6; 2407 *kdiv = 2; 2408 } else if (bestdiv % 5 == 0) { 2409 *pdiv = 5; 2410 *qdiv = bestdiv / 10; 2411 *kdiv = 2; 2412 } else if (bestdiv % 14 == 0) { 2413 *pdiv = 7; 2414 *qdiv = bestdiv / 14; 2415 *kdiv = 2; 2416 } 2417 } else { 2418 if (bestdiv == 3 || bestdiv == 5 || bestdiv == 7) { 2419 *pdiv = bestdiv; 2420 *qdiv = 1; 2421 *kdiv = 1; 2422 } else { /* 9, 15, 21 */ 2423 *pdiv = bestdiv / 3; 2424 *qdiv = 1; 2425 *kdiv = 3; 2426 } 2427 } 2428 } 2429 2430 static void icl_wrpll_params_populate(struct skl_wrpll_params *params, 2431 u32 dco_freq, u32 ref_freq, 2432 int pdiv, int qdiv, int kdiv) 2433 { 2434 u32 dco; 2435 2436 switch (kdiv) { 2437 case 1: 2438 params->kdiv = 1; 2439 break; 2440 case 2: 2441 params->kdiv = 2; 2442 break; 2443 case 3: 2444 params->kdiv = 4; 2445 break; 2446 default: 2447 WARN(1, "Incorrect KDiv\n"); 2448 } 2449 2450 switch (pdiv) { 2451 case 2: 2452 params->pdiv = 1; 2453 break; 2454 case 3: 2455 params->pdiv = 2; 2456 break; 2457 case 5: 2458 params->pdiv = 4; 2459 break; 2460 case 7: 2461 params->pdiv = 8; 2462 break; 2463 default: 2464 WARN(1, "Incorrect PDiv\n"); 2465 } 2466 2467 WARN_ON(kdiv != 2 && qdiv != 1); 2468 2469 params->qdiv_ratio = qdiv; 2470 params->qdiv_mode = (qdiv == 1) ? 0 : 1; 2471 2472 dco = div_u64((u64)dco_freq << 15, ref_freq); 2473 2474 params->dco_integer = dco >> 15; 2475 params->dco_fraction = dco & 0x7fff; 2476 } 2477 2478 /* 2479 * Display WA #22010492432: ehl, tgl, adl-s, adl-p 2480 * Program half of the nominal DCO divider fraction value. 2481 */ 2482 static bool 2483 ehl_combo_pll_div_frac_wa_needed(struct drm_i915_private *i915) 2484 { 2485 return ((IS_PLATFORM(i915, INTEL_ELKHARTLAKE) && 2486 IS_JSL_EHL_DISPLAY_STEP(i915, STEP_B0, STEP_FOREVER)) || 2487 IS_TIGERLAKE(i915) || IS_ALDERLAKE_S(i915) || IS_ALDERLAKE_P(i915)) && 2488 i915->display.dpll.ref_clks.nssc == 38400; 2489 } 2490 2491 struct icl_combo_pll_params { 2492 int clock; 2493 struct skl_wrpll_params wrpll; 2494 }; 2495 2496 /* 2497 * These values alrea already adjusted: they're the bits we write to the 2498 * registers, not the logical values. 2499 */ 2500 static const struct icl_combo_pll_params icl_dp_combo_pll_24MHz_values[] = { 2501 { 540000, 2502 { .dco_integer = 0x151, .dco_fraction = 0x4000, /* [0]: 5.4 */ 2503 .pdiv = 0x2 /* 3 */, .kdiv = 1, .qdiv_mode = 0, .qdiv_ratio = 0, }, }, 2504 { 270000, 2505 { .dco_integer = 0x151, .dco_fraction = 0x4000, /* [1]: 2.7 */ 2506 .pdiv = 0x2 /* 3 */, .kdiv = 2, .qdiv_mode = 0, .qdiv_ratio = 0, }, }, 2507 { 162000, 2508 { .dco_integer = 0x151, .dco_fraction = 0x4000, /* [2]: 1.62 */ 2509 .pdiv = 0x4 /* 5 */, .kdiv = 2, .qdiv_mode = 0, .qdiv_ratio = 0, }, }, 2510 { 324000, 2511 { .dco_integer = 0x151, .dco_fraction = 0x4000, /* [3]: 3.24 */ 2512 .pdiv = 0x4 /* 5 */, .kdiv = 1, .qdiv_mode = 0, .qdiv_ratio = 0, }, }, 2513 { 216000, 2514 { .dco_integer = 0x168, .dco_fraction = 0x0000, /* [4]: 2.16 */ 2515 .pdiv = 0x1 /* 2 */, .kdiv = 2, .qdiv_mode = 1, .qdiv_ratio = 2, }, }, 2516 { 432000, 2517 { .dco_integer = 0x168, .dco_fraction = 0x0000, /* [5]: 4.32 */ 2518 .pdiv = 0x1 /* 2 */, .kdiv = 2, .qdiv_mode = 0, .qdiv_ratio = 0, }, }, 2519 { 648000, 2520 { .dco_integer = 0x195, .dco_fraction = 0x0000, /* [6]: 6.48 */ 2521 .pdiv = 0x2 /* 3 */, .kdiv = 1, .qdiv_mode = 0, .qdiv_ratio = 0, }, }, 2522 { 810000, 2523 { .dco_integer = 0x151, .dco_fraction = 0x4000, /* [7]: 8.1 */ 2524 .pdiv = 0x1 /* 2 */, .kdiv = 1, .qdiv_mode = 0, .qdiv_ratio = 0, }, }, 2525 }; 2526 2527 2528 /* Also used for 38.4 MHz values. */ 2529 static const struct icl_combo_pll_params icl_dp_combo_pll_19_2MHz_values[] = { 2530 { 540000, 2531 { .dco_integer = 0x1A5, .dco_fraction = 0x7000, /* [0]: 5.4 */ 2532 .pdiv = 0x2 /* 3 */, .kdiv = 1, .qdiv_mode = 0, .qdiv_ratio = 0, }, }, 2533 { 270000, 2534 { .dco_integer = 0x1A5, .dco_fraction = 0x7000, /* [1]: 2.7 */ 2535 .pdiv = 0x2 /* 3 */, .kdiv = 2, .qdiv_mode = 0, .qdiv_ratio = 0, }, }, 2536 { 162000, 2537 { .dco_integer = 0x1A5, .dco_fraction = 0x7000, /* [2]: 1.62 */ 2538 .pdiv = 0x4 /* 5 */, .kdiv = 2, .qdiv_mode = 0, .qdiv_ratio = 0, }, }, 2539 { 324000, 2540 { .dco_integer = 0x1A5, .dco_fraction = 0x7000, /* [3]: 3.24 */ 2541 .pdiv = 0x4 /* 5 */, .kdiv = 1, .qdiv_mode = 0, .qdiv_ratio = 0, }, }, 2542 { 216000, 2543 { .dco_integer = 0x1C2, .dco_fraction = 0x0000, /* [4]: 2.16 */ 2544 .pdiv = 0x1 /* 2 */, .kdiv = 2, .qdiv_mode = 1, .qdiv_ratio = 2, }, }, 2545 { 432000, 2546 { .dco_integer = 0x1C2, .dco_fraction = 0x0000, /* [5]: 4.32 */ 2547 .pdiv = 0x1 /* 2 */, .kdiv = 2, .qdiv_mode = 0, .qdiv_ratio = 0, }, }, 2548 { 648000, 2549 { .dco_integer = 0x1FA, .dco_fraction = 0x2000, /* [6]: 6.48 */ 2550 .pdiv = 0x2 /* 3 */, .kdiv = 1, .qdiv_mode = 0, .qdiv_ratio = 0, }, }, 2551 { 810000, 2552 { .dco_integer = 0x1A5, .dco_fraction = 0x7000, /* [7]: 8.1 */ 2553 .pdiv = 0x1 /* 2 */, .kdiv = 1, .qdiv_mode = 0, .qdiv_ratio = 0, }, }, 2554 }; 2555 2556 static const struct skl_wrpll_params icl_tbt_pll_24MHz_values = { 2557 .dco_integer = 0x151, .dco_fraction = 0x4000, 2558 .pdiv = 0x4 /* 5 */, .kdiv = 1, .qdiv_mode = 0, .qdiv_ratio = 0, 2559 }; 2560 2561 static const struct skl_wrpll_params icl_tbt_pll_19_2MHz_values = { 2562 .dco_integer = 0x1A5, .dco_fraction = 0x7000, 2563 .pdiv = 0x4 /* 5 */, .kdiv = 1, .qdiv_mode = 0, .qdiv_ratio = 0, 2564 }; 2565 2566 static const struct skl_wrpll_params tgl_tbt_pll_19_2MHz_values = { 2567 .dco_integer = 0x54, .dco_fraction = 0x3000, 2568 /* the following params are unused */ 2569 .pdiv = 0, .kdiv = 0, .qdiv_mode = 0, .qdiv_ratio = 0, 2570 }; 2571 2572 static const struct skl_wrpll_params tgl_tbt_pll_24MHz_values = { 2573 .dco_integer = 0x43, .dco_fraction = 0x4000, 2574 /* the following params are unused */ 2575 }; 2576 2577 static int icl_calc_dp_combo_pll(struct intel_crtc_state *crtc_state, 2578 struct skl_wrpll_params *pll_params) 2579 { 2580 struct drm_i915_private *dev_priv = to_i915(crtc_state->uapi.crtc->dev); 2581 const struct icl_combo_pll_params *params = 2582 dev_priv->display.dpll.ref_clks.nssc == 24000 ? 2583 icl_dp_combo_pll_24MHz_values : 2584 icl_dp_combo_pll_19_2MHz_values; 2585 int clock = crtc_state->port_clock; 2586 int i; 2587 2588 for (i = 0; i < ARRAY_SIZE(icl_dp_combo_pll_24MHz_values); i++) { 2589 if (clock == params[i].clock) { 2590 *pll_params = params[i].wrpll; 2591 return 0; 2592 } 2593 } 2594 2595 MISSING_CASE(clock); 2596 return -EINVAL; 2597 } 2598 2599 static int icl_calc_tbt_pll(struct intel_crtc_state *crtc_state, 2600 struct skl_wrpll_params *pll_params) 2601 { 2602 struct drm_i915_private *dev_priv = to_i915(crtc_state->uapi.crtc->dev); 2603 2604 if (DISPLAY_VER(dev_priv) >= 12) { 2605 switch (dev_priv->display.dpll.ref_clks.nssc) { 2606 default: 2607 MISSING_CASE(dev_priv->display.dpll.ref_clks.nssc); 2608 fallthrough; 2609 case 19200: 2610 case 38400: 2611 *pll_params = tgl_tbt_pll_19_2MHz_values; 2612 break; 2613 case 24000: 2614 *pll_params = tgl_tbt_pll_24MHz_values; 2615 break; 2616 } 2617 } else { 2618 switch (dev_priv->display.dpll.ref_clks.nssc) { 2619 default: 2620 MISSING_CASE(dev_priv->display.dpll.ref_clks.nssc); 2621 fallthrough; 2622 case 19200: 2623 case 38400: 2624 *pll_params = icl_tbt_pll_19_2MHz_values; 2625 break; 2626 case 24000: 2627 *pll_params = icl_tbt_pll_24MHz_values; 2628 break; 2629 } 2630 } 2631 2632 return 0; 2633 } 2634 2635 static int icl_ddi_tbt_pll_get_freq(struct drm_i915_private *i915, 2636 const struct intel_shared_dpll *pll, 2637 const struct intel_dpll_hw_state *pll_state) 2638 { 2639 /* 2640 * The PLL outputs multiple frequencies at the same time, selection is 2641 * made at DDI clock mux level. 2642 */ 2643 drm_WARN_ON(&i915->drm, 1); 2644 2645 return 0; 2646 } 2647 2648 static int icl_wrpll_ref_clock(struct drm_i915_private *i915) 2649 { 2650 int ref_clock = i915->display.dpll.ref_clks.nssc; 2651 2652 /* 2653 * For ICL+, the spec states: if reference frequency is 38.4, 2654 * use 19.2 because the DPLL automatically divides that by 2. 2655 */ 2656 if (ref_clock == 38400) 2657 ref_clock = 19200; 2658 2659 return ref_clock; 2660 } 2661 2662 static int 2663 icl_calc_wrpll(struct intel_crtc_state *crtc_state, 2664 struct skl_wrpll_params *wrpll_params) 2665 { 2666 struct drm_i915_private *i915 = to_i915(crtc_state->uapi.crtc->dev); 2667 int ref_clock = icl_wrpll_ref_clock(i915); 2668 u32 afe_clock = crtc_state->port_clock * 5; 2669 u32 dco_min = 7998000; 2670 u32 dco_max = 10000000; 2671 u32 dco_mid = (dco_min + dco_max) / 2; 2672 static const int dividers[] = { 2, 4, 6, 8, 10, 12, 14, 16, 2673 18, 20, 24, 28, 30, 32, 36, 40, 2674 42, 44, 48, 50, 52, 54, 56, 60, 2675 64, 66, 68, 70, 72, 76, 78, 80, 2676 84, 88, 90, 92, 96, 98, 100, 102, 2677 3, 5, 7, 9, 15, 21 }; 2678 u32 dco, best_dco = 0, dco_centrality = 0; 2679 u32 best_dco_centrality = U32_MAX; /* Spec meaning of 999999 MHz */ 2680 int d, best_div = 0, pdiv = 0, qdiv = 0, kdiv = 0; 2681 2682 for (d = 0; d < ARRAY_SIZE(dividers); d++) { 2683 dco = afe_clock * dividers[d]; 2684 2685 if (dco <= dco_max && dco >= dco_min) { 2686 dco_centrality = abs(dco - dco_mid); 2687 2688 if (dco_centrality < best_dco_centrality) { 2689 best_dco_centrality = dco_centrality; 2690 best_div = dividers[d]; 2691 best_dco = dco; 2692 } 2693 } 2694 } 2695 2696 if (best_div == 0) 2697 return -EINVAL; 2698 2699 icl_wrpll_get_multipliers(best_div, &pdiv, &qdiv, &kdiv); 2700 icl_wrpll_params_populate(wrpll_params, best_dco, ref_clock, 2701 pdiv, qdiv, kdiv); 2702 2703 return 0; 2704 } 2705 2706 static int icl_ddi_combo_pll_get_freq(struct drm_i915_private *i915, 2707 const struct intel_shared_dpll *pll, 2708 const struct intel_dpll_hw_state *pll_state) 2709 { 2710 int ref_clock = icl_wrpll_ref_clock(i915); 2711 u32 dco_fraction; 2712 u32 p0, p1, p2, dco_freq; 2713 2714 p0 = pll_state->cfgcr1 & DPLL_CFGCR1_PDIV_MASK; 2715 p2 = pll_state->cfgcr1 & DPLL_CFGCR1_KDIV_MASK; 2716 2717 if (pll_state->cfgcr1 & DPLL_CFGCR1_QDIV_MODE(1)) 2718 p1 = (pll_state->cfgcr1 & DPLL_CFGCR1_QDIV_RATIO_MASK) >> 2719 DPLL_CFGCR1_QDIV_RATIO_SHIFT; 2720 else 2721 p1 = 1; 2722 2723 switch (p0) { 2724 case DPLL_CFGCR1_PDIV_2: 2725 p0 = 2; 2726 break; 2727 case DPLL_CFGCR1_PDIV_3: 2728 p0 = 3; 2729 break; 2730 case DPLL_CFGCR1_PDIV_5: 2731 p0 = 5; 2732 break; 2733 case DPLL_CFGCR1_PDIV_7: 2734 p0 = 7; 2735 break; 2736 } 2737 2738 switch (p2) { 2739 case DPLL_CFGCR1_KDIV_1: 2740 p2 = 1; 2741 break; 2742 case DPLL_CFGCR1_KDIV_2: 2743 p2 = 2; 2744 break; 2745 case DPLL_CFGCR1_KDIV_3: 2746 p2 = 3; 2747 break; 2748 } 2749 2750 dco_freq = (pll_state->cfgcr0 & DPLL_CFGCR0_DCO_INTEGER_MASK) * 2751 ref_clock; 2752 2753 dco_fraction = (pll_state->cfgcr0 & DPLL_CFGCR0_DCO_FRACTION_MASK) >> 2754 DPLL_CFGCR0_DCO_FRACTION_SHIFT; 2755 2756 if (ehl_combo_pll_div_frac_wa_needed(i915)) 2757 dco_fraction *= 2; 2758 2759 dco_freq += (dco_fraction * ref_clock) / 0x8000; 2760 2761 if (drm_WARN_ON(&i915->drm, p0 == 0 || p1 == 0 || p2 == 0)) 2762 return 0; 2763 2764 return dco_freq / (p0 * p1 * p2 * 5); 2765 } 2766 2767 static void icl_calc_dpll_state(struct drm_i915_private *i915, 2768 const struct skl_wrpll_params *pll_params, 2769 struct intel_dpll_hw_state *pll_state) 2770 { 2771 u32 dco_fraction = pll_params->dco_fraction; 2772 2773 if (ehl_combo_pll_div_frac_wa_needed(i915)) 2774 dco_fraction = DIV_ROUND_CLOSEST(dco_fraction, 2); 2775 2776 pll_state->cfgcr0 = DPLL_CFGCR0_DCO_FRACTION(dco_fraction) | 2777 pll_params->dco_integer; 2778 2779 pll_state->cfgcr1 = DPLL_CFGCR1_QDIV_RATIO(pll_params->qdiv_ratio) | 2780 DPLL_CFGCR1_QDIV_MODE(pll_params->qdiv_mode) | 2781 DPLL_CFGCR1_KDIV(pll_params->kdiv) | 2782 DPLL_CFGCR1_PDIV(pll_params->pdiv); 2783 2784 if (DISPLAY_VER(i915) >= 12) 2785 pll_state->cfgcr1 |= TGL_DPLL_CFGCR1_CFSELOVRD_NORMAL_XTAL; 2786 else 2787 pll_state->cfgcr1 |= DPLL_CFGCR1_CENTRAL_FREQ_8400; 2788 2789 if (i915->display.vbt.override_afc_startup) 2790 pll_state->div0 = TGL_DPLL0_DIV0_AFC_STARTUP(i915->display.vbt.override_afc_startup_val); 2791 } 2792 2793 static int icl_mg_pll_find_divisors(int clock_khz, bool is_dp, bool use_ssc, 2794 u32 *target_dco_khz, 2795 struct intel_dpll_hw_state *state, 2796 bool is_dkl) 2797 { 2798 static const u8 div1_vals[] = { 7, 5, 3, 2 }; 2799 u32 dco_min_freq, dco_max_freq; 2800 unsigned int i; 2801 int div2; 2802 2803 dco_min_freq = is_dp ? 8100000 : use_ssc ? 8000000 : 7992000; 2804 dco_max_freq = is_dp ? 8100000 : 10000000; 2805 2806 for (i = 0; i < ARRAY_SIZE(div1_vals); i++) { 2807 int div1 = div1_vals[i]; 2808 2809 for (div2 = 10; div2 > 0; div2--) { 2810 int dco = div1 * div2 * clock_khz * 5; 2811 int a_divratio, tlinedrv, inputsel; 2812 u32 hsdiv; 2813 2814 if (dco < dco_min_freq || dco > dco_max_freq) 2815 continue; 2816 2817 if (div2 >= 2) { 2818 /* 2819 * Note: a_divratio not matching TGL BSpec 2820 * algorithm but matching hardcoded values and 2821 * working on HW for DP alt-mode at least 2822 */ 2823 a_divratio = is_dp ? 10 : 5; 2824 tlinedrv = is_dkl ? 1 : 2; 2825 } else { 2826 a_divratio = 5; 2827 tlinedrv = 0; 2828 } 2829 inputsel = is_dp ? 0 : 1; 2830 2831 switch (div1) { 2832 default: 2833 MISSING_CASE(div1); 2834 fallthrough; 2835 case 2: 2836 hsdiv = MG_CLKTOP2_HSCLKCTL_HSDIV_RATIO_2; 2837 break; 2838 case 3: 2839 hsdiv = MG_CLKTOP2_HSCLKCTL_HSDIV_RATIO_3; 2840 break; 2841 case 5: 2842 hsdiv = MG_CLKTOP2_HSCLKCTL_HSDIV_RATIO_5; 2843 break; 2844 case 7: 2845 hsdiv = MG_CLKTOP2_HSCLKCTL_HSDIV_RATIO_7; 2846 break; 2847 } 2848 2849 *target_dco_khz = dco; 2850 2851 state->mg_refclkin_ctl = MG_REFCLKIN_CTL_OD_2_MUX(1); 2852 2853 state->mg_clktop2_coreclkctl1 = 2854 MG_CLKTOP2_CORECLKCTL1_A_DIVRATIO(a_divratio); 2855 2856 state->mg_clktop2_hsclkctl = 2857 MG_CLKTOP2_HSCLKCTL_TLINEDRV_CLKSEL(tlinedrv) | 2858 MG_CLKTOP2_HSCLKCTL_CORE_INPUTSEL(inputsel) | 2859 hsdiv | 2860 MG_CLKTOP2_HSCLKCTL_DSDIV_RATIO(div2); 2861 2862 return 0; 2863 } 2864 } 2865 2866 return -EINVAL; 2867 } 2868 2869 /* 2870 * The specification for this function uses real numbers, so the math had to be 2871 * adapted to integer-only calculation, that's why it looks so different. 2872 */ 2873 static int icl_calc_mg_pll_state(struct intel_crtc_state *crtc_state, 2874 struct intel_dpll_hw_state *pll_state) 2875 { 2876 struct drm_i915_private *dev_priv = to_i915(crtc_state->uapi.crtc->dev); 2877 int refclk_khz = dev_priv->display.dpll.ref_clks.nssc; 2878 int clock = crtc_state->port_clock; 2879 u32 dco_khz, m1div, m2div_int, m2div_rem, m2div_frac; 2880 u32 iref_ndiv, iref_trim, iref_pulse_w; 2881 u32 prop_coeff, int_coeff; 2882 u32 tdc_targetcnt, feedfwgain; 2883 u64 ssc_stepsize, ssc_steplen, ssc_steplog; 2884 u64 tmp; 2885 bool use_ssc = false; 2886 bool is_dp = !intel_crtc_has_type(crtc_state, INTEL_OUTPUT_HDMI); 2887 bool is_dkl = DISPLAY_VER(dev_priv) >= 12; 2888 int ret; 2889 2890 ret = icl_mg_pll_find_divisors(clock, is_dp, use_ssc, &dco_khz, 2891 pll_state, is_dkl); 2892 if (ret) 2893 return ret; 2894 2895 m1div = 2; 2896 m2div_int = dco_khz / (refclk_khz * m1div); 2897 if (m2div_int > 255) { 2898 if (!is_dkl) { 2899 m1div = 4; 2900 m2div_int = dco_khz / (refclk_khz * m1div); 2901 } 2902 2903 if (m2div_int > 255) 2904 return -EINVAL; 2905 } 2906 m2div_rem = dco_khz % (refclk_khz * m1div); 2907 2908 tmp = (u64)m2div_rem * (1 << 22); 2909 do_div(tmp, refclk_khz * m1div); 2910 m2div_frac = tmp; 2911 2912 switch (refclk_khz) { 2913 case 19200: 2914 iref_ndiv = 1; 2915 iref_trim = 28; 2916 iref_pulse_w = 1; 2917 break; 2918 case 24000: 2919 iref_ndiv = 1; 2920 iref_trim = 25; 2921 iref_pulse_w = 2; 2922 break; 2923 case 38400: 2924 iref_ndiv = 2; 2925 iref_trim = 28; 2926 iref_pulse_w = 1; 2927 break; 2928 default: 2929 MISSING_CASE(refclk_khz); 2930 return -EINVAL; 2931 } 2932 2933 /* 2934 * tdc_res = 0.000003 2935 * tdc_targetcnt = int(2 / (tdc_res * 8 * 50 * 1.1) / refclk_mhz + 0.5) 2936 * 2937 * The multiplication by 1000 is due to refclk MHz to KHz conversion. It 2938 * was supposed to be a division, but we rearranged the operations of 2939 * the formula to avoid early divisions so we don't multiply the 2940 * rounding errors. 2941 * 2942 * 0.000003 * 8 * 50 * 1.1 = 0.00132, also known as 132 / 100000, which 2943 * we also rearrange to work with integers. 2944 * 2945 * The 0.5 transformed to 5 results in a multiplication by 10 and the 2946 * last division by 10. 2947 */ 2948 tdc_targetcnt = (2 * 1000 * 100000 * 10 / (132 * refclk_khz) + 5) / 10; 2949 2950 /* 2951 * Here we divide dco_khz by 10 in order to allow the dividend to fit in 2952 * 32 bits. That's not a problem since we round the division down 2953 * anyway. 2954 */ 2955 feedfwgain = (use_ssc || m2div_rem > 0) ? 2956 m1div * 1000000 * 100 / (dco_khz * 3 / 10) : 0; 2957 2958 if (dco_khz >= 9000000) { 2959 prop_coeff = 5; 2960 int_coeff = 10; 2961 } else { 2962 prop_coeff = 4; 2963 int_coeff = 8; 2964 } 2965 2966 if (use_ssc) { 2967 tmp = mul_u32_u32(dco_khz, 47 * 32); 2968 do_div(tmp, refclk_khz * m1div * 10000); 2969 ssc_stepsize = tmp; 2970 2971 tmp = mul_u32_u32(dco_khz, 1000); 2972 ssc_steplen = DIV_ROUND_UP_ULL(tmp, 32 * 2 * 32); 2973 } else { 2974 ssc_stepsize = 0; 2975 ssc_steplen = 0; 2976 } 2977 ssc_steplog = 4; 2978 2979 /* write pll_state calculations */ 2980 if (is_dkl) { 2981 pll_state->mg_pll_div0 = DKL_PLL_DIV0_INTEG_COEFF(int_coeff) | 2982 DKL_PLL_DIV0_PROP_COEFF(prop_coeff) | 2983 DKL_PLL_DIV0_FBPREDIV(m1div) | 2984 DKL_PLL_DIV0_FBDIV_INT(m2div_int); 2985 if (dev_priv->display.vbt.override_afc_startup) { 2986 u8 val = dev_priv->display.vbt.override_afc_startup_val; 2987 2988 pll_state->mg_pll_div0 |= DKL_PLL_DIV0_AFC_STARTUP(val); 2989 } 2990 2991 pll_state->mg_pll_div1 = DKL_PLL_DIV1_IREF_TRIM(iref_trim) | 2992 DKL_PLL_DIV1_TDC_TARGET_CNT(tdc_targetcnt); 2993 2994 pll_state->mg_pll_ssc = DKL_PLL_SSC_IREF_NDIV_RATIO(iref_ndiv) | 2995 DKL_PLL_SSC_STEP_LEN(ssc_steplen) | 2996 DKL_PLL_SSC_STEP_NUM(ssc_steplog) | 2997 (use_ssc ? DKL_PLL_SSC_EN : 0); 2998 2999 pll_state->mg_pll_bias = (m2div_frac ? DKL_PLL_BIAS_FRAC_EN_H : 0) | 3000 DKL_PLL_BIAS_FBDIV_FRAC(m2div_frac); 3001 3002 pll_state->mg_pll_tdc_coldst_bias = 3003 DKL_PLL_TDC_SSC_STEP_SIZE(ssc_stepsize) | 3004 DKL_PLL_TDC_FEED_FWD_GAIN(feedfwgain); 3005 3006 } else { 3007 pll_state->mg_pll_div0 = 3008 (m2div_rem > 0 ? MG_PLL_DIV0_FRACNEN_H : 0) | 3009 MG_PLL_DIV0_FBDIV_FRAC(m2div_frac) | 3010 MG_PLL_DIV0_FBDIV_INT(m2div_int); 3011 3012 pll_state->mg_pll_div1 = 3013 MG_PLL_DIV1_IREF_NDIVRATIO(iref_ndiv) | 3014 MG_PLL_DIV1_DITHER_DIV_2 | 3015 MG_PLL_DIV1_NDIVRATIO(1) | 3016 MG_PLL_DIV1_FBPREDIV(m1div); 3017 3018 pll_state->mg_pll_lf = 3019 MG_PLL_LF_TDCTARGETCNT(tdc_targetcnt) | 3020 MG_PLL_LF_AFCCNTSEL_512 | 3021 MG_PLL_LF_GAINCTRL(1) | 3022 MG_PLL_LF_INT_COEFF(int_coeff) | 3023 MG_PLL_LF_PROP_COEFF(prop_coeff); 3024 3025 pll_state->mg_pll_frac_lock = 3026 MG_PLL_FRAC_LOCK_TRUELOCK_CRIT_32 | 3027 MG_PLL_FRAC_LOCK_EARLYLOCK_CRIT_32 | 3028 MG_PLL_FRAC_LOCK_LOCKTHRESH(10) | 3029 MG_PLL_FRAC_LOCK_DCODITHEREN | 3030 MG_PLL_FRAC_LOCK_FEEDFWRDGAIN(feedfwgain); 3031 if (use_ssc || m2div_rem > 0) 3032 pll_state->mg_pll_frac_lock |= 3033 MG_PLL_FRAC_LOCK_FEEDFWRDCAL_EN; 3034 3035 pll_state->mg_pll_ssc = 3036 (use_ssc ? MG_PLL_SSC_EN : 0) | 3037 MG_PLL_SSC_TYPE(2) | 3038 MG_PLL_SSC_STEPLENGTH(ssc_steplen) | 3039 MG_PLL_SSC_STEPNUM(ssc_steplog) | 3040 MG_PLL_SSC_FLLEN | 3041 MG_PLL_SSC_STEPSIZE(ssc_stepsize); 3042 3043 pll_state->mg_pll_tdc_coldst_bias = 3044 MG_PLL_TDC_COLDST_COLDSTART | 3045 MG_PLL_TDC_COLDST_IREFINT_EN | 3046 MG_PLL_TDC_COLDST_REFBIAS_START_PULSE_W(iref_pulse_w) | 3047 MG_PLL_TDC_TDCOVCCORR_EN | 3048 MG_PLL_TDC_TDCSEL(3); 3049 3050 pll_state->mg_pll_bias = 3051 MG_PLL_BIAS_BIAS_GB_SEL(3) | 3052 MG_PLL_BIAS_INIT_DCOAMP(0x3F) | 3053 MG_PLL_BIAS_BIAS_BONUS(10) | 3054 MG_PLL_BIAS_BIASCAL_EN | 3055 MG_PLL_BIAS_CTRIM(12) | 3056 MG_PLL_BIAS_VREF_RDAC(4) | 3057 MG_PLL_BIAS_IREFTRIM(iref_trim); 3058 3059 if (refclk_khz == 38400) { 3060 pll_state->mg_pll_tdc_coldst_bias_mask = 3061 MG_PLL_TDC_COLDST_COLDSTART; 3062 pll_state->mg_pll_bias_mask = 0; 3063 } else { 3064 pll_state->mg_pll_tdc_coldst_bias_mask = -1U; 3065 pll_state->mg_pll_bias_mask = -1U; 3066 } 3067 3068 pll_state->mg_pll_tdc_coldst_bias &= 3069 pll_state->mg_pll_tdc_coldst_bias_mask; 3070 pll_state->mg_pll_bias &= pll_state->mg_pll_bias_mask; 3071 } 3072 3073 return 0; 3074 } 3075 3076 static int icl_ddi_mg_pll_get_freq(struct drm_i915_private *dev_priv, 3077 const struct intel_shared_dpll *pll, 3078 const struct intel_dpll_hw_state *pll_state) 3079 { 3080 u32 m1, m2_int, m2_frac, div1, div2, ref_clock; 3081 u64 tmp; 3082 3083 ref_clock = dev_priv->display.dpll.ref_clks.nssc; 3084 3085 if (DISPLAY_VER(dev_priv) >= 12) { 3086 m1 = pll_state->mg_pll_div0 & DKL_PLL_DIV0_FBPREDIV_MASK; 3087 m1 = m1 >> DKL_PLL_DIV0_FBPREDIV_SHIFT; 3088 m2_int = pll_state->mg_pll_div0 & DKL_PLL_DIV0_FBDIV_INT_MASK; 3089 3090 if (pll_state->mg_pll_bias & DKL_PLL_BIAS_FRAC_EN_H) { 3091 m2_frac = pll_state->mg_pll_bias & 3092 DKL_PLL_BIAS_FBDIV_FRAC_MASK; 3093 m2_frac = m2_frac >> DKL_PLL_BIAS_FBDIV_SHIFT; 3094 } else { 3095 m2_frac = 0; 3096 } 3097 } else { 3098 m1 = pll_state->mg_pll_div1 & MG_PLL_DIV1_FBPREDIV_MASK; 3099 m2_int = pll_state->mg_pll_div0 & MG_PLL_DIV0_FBDIV_INT_MASK; 3100 3101 if (pll_state->mg_pll_div0 & MG_PLL_DIV0_FRACNEN_H) { 3102 m2_frac = pll_state->mg_pll_div0 & 3103 MG_PLL_DIV0_FBDIV_FRAC_MASK; 3104 m2_frac = m2_frac >> MG_PLL_DIV0_FBDIV_FRAC_SHIFT; 3105 } else { 3106 m2_frac = 0; 3107 } 3108 } 3109 3110 switch (pll_state->mg_clktop2_hsclkctl & 3111 MG_CLKTOP2_HSCLKCTL_HSDIV_RATIO_MASK) { 3112 case MG_CLKTOP2_HSCLKCTL_HSDIV_RATIO_2: 3113 div1 = 2; 3114 break; 3115 case MG_CLKTOP2_HSCLKCTL_HSDIV_RATIO_3: 3116 div1 = 3; 3117 break; 3118 case MG_CLKTOP2_HSCLKCTL_HSDIV_RATIO_5: 3119 div1 = 5; 3120 break; 3121 case MG_CLKTOP2_HSCLKCTL_HSDIV_RATIO_7: 3122 div1 = 7; 3123 break; 3124 default: 3125 MISSING_CASE(pll_state->mg_clktop2_hsclkctl); 3126 return 0; 3127 } 3128 3129 div2 = (pll_state->mg_clktop2_hsclkctl & 3130 MG_CLKTOP2_HSCLKCTL_DSDIV_RATIO_MASK) >> 3131 MG_CLKTOP2_HSCLKCTL_DSDIV_RATIO_SHIFT; 3132 3133 /* div2 value of 0 is same as 1 means no div */ 3134 if (div2 == 0) 3135 div2 = 1; 3136 3137 /* 3138 * Adjust the original formula to delay the division by 2^22 in order to 3139 * minimize possible rounding errors. 3140 */ 3141 tmp = (u64)m1 * m2_int * ref_clock + 3142 (((u64)m1 * m2_frac * ref_clock) >> 22); 3143 tmp = div_u64(tmp, 5 * div1 * div2); 3144 3145 return tmp; 3146 } 3147 3148 /** 3149 * icl_set_active_port_dpll - select the active port DPLL for a given CRTC 3150 * @crtc_state: state for the CRTC to select the DPLL for 3151 * @port_dpll_id: the active @port_dpll_id to select 3152 * 3153 * Select the given @port_dpll_id instance from the DPLLs reserved for the 3154 * CRTC. 3155 */ 3156 void icl_set_active_port_dpll(struct intel_crtc_state *crtc_state, 3157 enum icl_port_dpll_id port_dpll_id) 3158 { 3159 struct icl_port_dpll *port_dpll = 3160 &crtc_state->icl_port_dplls[port_dpll_id]; 3161 3162 crtc_state->shared_dpll = port_dpll->pll; 3163 crtc_state->dpll_hw_state = port_dpll->hw_state; 3164 } 3165 3166 static void icl_update_active_dpll(struct intel_atomic_state *state, 3167 struct intel_crtc *crtc, 3168 struct intel_encoder *encoder) 3169 { 3170 struct intel_crtc_state *crtc_state = 3171 intel_atomic_get_new_crtc_state(state, crtc); 3172 struct intel_digital_port *primary_port; 3173 enum icl_port_dpll_id port_dpll_id = ICL_PORT_DPLL_DEFAULT; 3174 3175 primary_port = encoder->type == INTEL_OUTPUT_DP_MST ? 3176 enc_to_mst(encoder)->primary : 3177 enc_to_dig_port(encoder); 3178 3179 if (primary_port && 3180 (intel_tc_port_in_dp_alt_mode(primary_port) || 3181 intel_tc_port_in_legacy_mode(primary_port))) 3182 port_dpll_id = ICL_PORT_DPLL_MG_PHY; 3183 3184 icl_set_active_port_dpll(crtc_state, port_dpll_id); 3185 } 3186 3187 static u32 intel_get_hti_plls(struct drm_i915_private *i915) 3188 { 3189 if (!(i915->hti_state & HDPORT_ENABLED)) 3190 return 0; 3191 3192 return REG_FIELD_GET(HDPORT_DPLL_USED_MASK, i915->hti_state); 3193 } 3194 3195 static int icl_compute_combo_phy_dpll(struct intel_atomic_state *state, 3196 struct intel_crtc *crtc) 3197 { 3198 struct drm_i915_private *dev_priv = to_i915(crtc->base.dev); 3199 struct intel_crtc_state *crtc_state = 3200 intel_atomic_get_new_crtc_state(state, crtc); 3201 struct icl_port_dpll *port_dpll = 3202 &crtc_state->icl_port_dplls[ICL_PORT_DPLL_DEFAULT]; 3203 struct skl_wrpll_params pll_params = {}; 3204 int ret; 3205 3206 if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_HDMI) || 3207 intel_crtc_has_type(crtc_state, INTEL_OUTPUT_DSI)) 3208 ret = icl_calc_wrpll(crtc_state, &pll_params); 3209 else 3210 ret = icl_calc_dp_combo_pll(crtc_state, &pll_params); 3211 3212 if (ret) 3213 return ret; 3214 3215 icl_calc_dpll_state(dev_priv, &pll_params, &port_dpll->hw_state); 3216 3217 /* this is mainly for the fastset check */ 3218 icl_set_active_port_dpll(crtc_state, ICL_PORT_DPLL_DEFAULT); 3219 3220 crtc_state->port_clock = icl_ddi_combo_pll_get_freq(dev_priv, NULL, 3221 &port_dpll->hw_state); 3222 3223 return 0; 3224 } 3225 3226 static int icl_get_combo_phy_dpll(struct intel_atomic_state *state, 3227 struct intel_crtc *crtc, 3228 struct intel_encoder *encoder) 3229 { 3230 struct drm_i915_private *dev_priv = to_i915(crtc->base.dev); 3231 struct intel_crtc_state *crtc_state = 3232 intel_atomic_get_new_crtc_state(state, crtc); 3233 struct icl_port_dpll *port_dpll = 3234 &crtc_state->icl_port_dplls[ICL_PORT_DPLL_DEFAULT]; 3235 enum port port = encoder->port; 3236 unsigned long dpll_mask; 3237 3238 if (IS_ALDERLAKE_S(dev_priv)) { 3239 dpll_mask = 3240 BIT(DPLL_ID_DG1_DPLL3) | 3241 BIT(DPLL_ID_DG1_DPLL2) | 3242 BIT(DPLL_ID_ICL_DPLL1) | 3243 BIT(DPLL_ID_ICL_DPLL0); 3244 } else if (IS_DG1(dev_priv)) { 3245 if (port == PORT_D || port == PORT_E) { 3246 dpll_mask = 3247 BIT(DPLL_ID_DG1_DPLL2) | 3248 BIT(DPLL_ID_DG1_DPLL3); 3249 } else { 3250 dpll_mask = 3251 BIT(DPLL_ID_DG1_DPLL0) | 3252 BIT(DPLL_ID_DG1_DPLL1); 3253 } 3254 } else if (IS_ROCKETLAKE(dev_priv)) { 3255 dpll_mask = 3256 BIT(DPLL_ID_EHL_DPLL4) | 3257 BIT(DPLL_ID_ICL_DPLL1) | 3258 BIT(DPLL_ID_ICL_DPLL0); 3259 } else if (IS_JSL_EHL(dev_priv) && port != PORT_A) { 3260 dpll_mask = 3261 BIT(DPLL_ID_EHL_DPLL4) | 3262 BIT(DPLL_ID_ICL_DPLL1) | 3263 BIT(DPLL_ID_ICL_DPLL0); 3264 } else { 3265 dpll_mask = BIT(DPLL_ID_ICL_DPLL1) | BIT(DPLL_ID_ICL_DPLL0); 3266 } 3267 3268 /* Eliminate DPLLs from consideration if reserved by HTI */ 3269 dpll_mask &= ~intel_get_hti_plls(dev_priv); 3270 3271 port_dpll->pll = intel_find_shared_dpll(state, crtc, 3272 &port_dpll->hw_state, 3273 dpll_mask); 3274 if (!port_dpll->pll) 3275 return -EINVAL; 3276 3277 intel_reference_shared_dpll(state, crtc, 3278 port_dpll->pll, &port_dpll->hw_state); 3279 3280 icl_update_active_dpll(state, crtc, encoder); 3281 3282 return 0; 3283 } 3284 3285 static int icl_compute_tc_phy_dplls(struct intel_atomic_state *state, 3286 struct intel_crtc *crtc) 3287 { 3288 struct drm_i915_private *dev_priv = to_i915(state->base.dev); 3289 struct intel_crtc_state *crtc_state = 3290 intel_atomic_get_new_crtc_state(state, crtc); 3291 struct icl_port_dpll *port_dpll = 3292 &crtc_state->icl_port_dplls[ICL_PORT_DPLL_DEFAULT]; 3293 struct skl_wrpll_params pll_params = {}; 3294 int ret; 3295 3296 port_dpll = &crtc_state->icl_port_dplls[ICL_PORT_DPLL_DEFAULT]; 3297 ret = icl_calc_tbt_pll(crtc_state, &pll_params); 3298 if (ret) 3299 return ret; 3300 3301 icl_calc_dpll_state(dev_priv, &pll_params, &port_dpll->hw_state); 3302 3303 port_dpll = &crtc_state->icl_port_dplls[ICL_PORT_DPLL_MG_PHY]; 3304 ret = icl_calc_mg_pll_state(crtc_state, &port_dpll->hw_state); 3305 if (ret) 3306 return ret; 3307 3308 /* this is mainly for the fastset check */ 3309 icl_set_active_port_dpll(crtc_state, ICL_PORT_DPLL_MG_PHY); 3310 3311 crtc_state->port_clock = icl_ddi_mg_pll_get_freq(dev_priv, NULL, 3312 &port_dpll->hw_state); 3313 3314 return 0; 3315 } 3316 3317 static int icl_get_tc_phy_dplls(struct intel_atomic_state *state, 3318 struct intel_crtc *crtc, 3319 struct intel_encoder *encoder) 3320 { 3321 struct drm_i915_private *dev_priv = to_i915(state->base.dev); 3322 struct intel_crtc_state *crtc_state = 3323 intel_atomic_get_new_crtc_state(state, crtc); 3324 struct icl_port_dpll *port_dpll = 3325 &crtc_state->icl_port_dplls[ICL_PORT_DPLL_DEFAULT]; 3326 enum intel_dpll_id dpll_id; 3327 int ret; 3328 3329 port_dpll = &crtc_state->icl_port_dplls[ICL_PORT_DPLL_DEFAULT]; 3330 port_dpll->pll = intel_find_shared_dpll(state, crtc, 3331 &port_dpll->hw_state, 3332 BIT(DPLL_ID_ICL_TBTPLL)); 3333 if (!port_dpll->pll) 3334 return -EINVAL; 3335 intel_reference_shared_dpll(state, crtc, 3336 port_dpll->pll, &port_dpll->hw_state); 3337 3338 3339 port_dpll = &crtc_state->icl_port_dplls[ICL_PORT_DPLL_MG_PHY]; 3340 dpll_id = icl_tc_port_to_pll_id(intel_port_to_tc(dev_priv, 3341 encoder->port)); 3342 port_dpll->pll = intel_find_shared_dpll(state, crtc, 3343 &port_dpll->hw_state, 3344 BIT(dpll_id)); 3345 if (!port_dpll->pll) { 3346 ret = -EINVAL; 3347 goto err_unreference_tbt_pll; 3348 } 3349 intel_reference_shared_dpll(state, crtc, 3350 port_dpll->pll, &port_dpll->hw_state); 3351 3352 icl_update_active_dpll(state, crtc, encoder); 3353 3354 return 0; 3355 3356 err_unreference_tbt_pll: 3357 port_dpll = &crtc_state->icl_port_dplls[ICL_PORT_DPLL_DEFAULT]; 3358 intel_unreference_shared_dpll(state, crtc, port_dpll->pll); 3359 3360 return ret; 3361 } 3362 3363 static int icl_compute_dplls(struct intel_atomic_state *state, 3364 struct intel_crtc *crtc, 3365 struct intel_encoder *encoder) 3366 { 3367 struct drm_i915_private *dev_priv = to_i915(state->base.dev); 3368 enum phy phy = intel_port_to_phy(dev_priv, encoder->port); 3369 3370 if (intel_phy_is_combo(dev_priv, phy)) 3371 return icl_compute_combo_phy_dpll(state, crtc); 3372 else if (intel_phy_is_tc(dev_priv, phy)) 3373 return icl_compute_tc_phy_dplls(state, crtc); 3374 3375 MISSING_CASE(phy); 3376 3377 return 0; 3378 } 3379 3380 static int icl_get_dplls(struct intel_atomic_state *state, 3381 struct intel_crtc *crtc, 3382 struct intel_encoder *encoder) 3383 { 3384 struct drm_i915_private *dev_priv = to_i915(state->base.dev); 3385 enum phy phy = intel_port_to_phy(dev_priv, encoder->port); 3386 3387 if (intel_phy_is_combo(dev_priv, phy)) 3388 return icl_get_combo_phy_dpll(state, crtc, encoder); 3389 else if (intel_phy_is_tc(dev_priv, phy)) 3390 return icl_get_tc_phy_dplls(state, crtc, encoder); 3391 3392 MISSING_CASE(phy); 3393 3394 return -EINVAL; 3395 } 3396 3397 static void icl_put_dplls(struct intel_atomic_state *state, 3398 struct intel_crtc *crtc) 3399 { 3400 const struct intel_crtc_state *old_crtc_state = 3401 intel_atomic_get_old_crtc_state(state, crtc); 3402 struct intel_crtc_state *new_crtc_state = 3403 intel_atomic_get_new_crtc_state(state, crtc); 3404 enum icl_port_dpll_id id; 3405 3406 new_crtc_state->shared_dpll = NULL; 3407 3408 for (id = ICL_PORT_DPLL_DEFAULT; id < ICL_PORT_DPLL_COUNT; id++) { 3409 const struct icl_port_dpll *old_port_dpll = 3410 &old_crtc_state->icl_port_dplls[id]; 3411 struct icl_port_dpll *new_port_dpll = 3412 &new_crtc_state->icl_port_dplls[id]; 3413 3414 new_port_dpll->pll = NULL; 3415 3416 if (!old_port_dpll->pll) 3417 continue; 3418 3419 intel_unreference_shared_dpll(state, crtc, old_port_dpll->pll); 3420 } 3421 } 3422 3423 static bool mg_pll_get_hw_state(struct drm_i915_private *dev_priv, 3424 struct intel_shared_dpll *pll, 3425 struct intel_dpll_hw_state *hw_state) 3426 { 3427 const enum intel_dpll_id id = pll->info->id; 3428 enum tc_port tc_port = icl_pll_id_to_tc_port(id); 3429 intel_wakeref_t wakeref; 3430 bool ret = false; 3431 u32 val; 3432 3433 i915_reg_t enable_reg = intel_tc_pll_enable_reg(dev_priv, pll); 3434 3435 wakeref = intel_display_power_get_if_enabled(dev_priv, 3436 POWER_DOMAIN_DISPLAY_CORE); 3437 if (!wakeref) 3438 return false; 3439 3440 val = intel_de_read(dev_priv, enable_reg); 3441 if (!(val & PLL_ENABLE)) 3442 goto out; 3443 3444 hw_state->mg_refclkin_ctl = intel_de_read(dev_priv, 3445 MG_REFCLKIN_CTL(tc_port)); 3446 hw_state->mg_refclkin_ctl &= MG_REFCLKIN_CTL_OD_2_MUX_MASK; 3447 3448 hw_state->mg_clktop2_coreclkctl1 = 3449 intel_de_read(dev_priv, MG_CLKTOP2_CORECLKCTL1(tc_port)); 3450 hw_state->mg_clktop2_coreclkctl1 &= 3451 MG_CLKTOP2_CORECLKCTL1_A_DIVRATIO_MASK; 3452 3453 hw_state->mg_clktop2_hsclkctl = 3454 intel_de_read(dev_priv, MG_CLKTOP2_HSCLKCTL(tc_port)); 3455 hw_state->mg_clktop2_hsclkctl &= 3456 MG_CLKTOP2_HSCLKCTL_TLINEDRV_CLKSEL_MASK | 3457 MG_CLKTOP2_HSCLKCTL_CORE_INPUTSEL_MASK | 3458 MG_CLKTOP2_HSCLKCTL_HSDIV_RATIO_MASK | 3459 MG_CLKTOP2_HSCLKCTL_DSDIV_RATIO_MASK; 3460 3461 hw_state->mg_pll_div0 = intel_de_read(dev_priv, MG_PLL_DIV0(tc_port)); 3462 hw_state->mg_pll_div1 = intel_de_read(dev_priv, MG_PLL_DIV1(tc_port)); 3463 hw_state->mg_pll_lf = intel_de_read(dev_priv, MG_PLL_LF(tc_port)); 3464 hw_state->mg_pll_frac_lock = intel_de_read(dev_priv, 3465 MG_PLL_FRAC_LOCK(tc_port)); 3466 hw_state->mg_pll_ssc = intel_de_read(dev_priv, MG_PLL_SSC(tc_port)); 3467 3468 hw_state->mg_pll_bias = intel_de_read(dev_priv, MG_PLL_BIAS(tc_port)); 3469 hw_state->mg_pll_tdc_coldst_bias = 3470 intel_de_read(dev_priv, MG_PLL_TDC_COLDST_BIAS(tc_port)); 3471 3472 if (dev_priv->display.dpll.ref_clks.nssc == 38400) { 3473 hw_state->mg_pll_tdc_coldst_bias_mask = MG_PLL_TDC_COLDST_COLDSTART; 3474 hw_state->mg_pll_bias_mask = 0; 3475 } else { 3476 hw_state->mg_pll_tdc_coldst_bias_mask = -1U; 3477 hw_state->mg_pll_bias_mask = -1U; 3478 } 3479 3480 hw_state->mg_pll_tdc_coldst_bias &= hw_state->mg_pll_tdc_coldst_bias_mask; 3481 hw_state->mg_pll_bias &= hw_state->mg_pll_bias_mask; 3482 3483 ret = true; 3484 out: 3485 intel_display_power_put(dev_priv, POWER_DOMAIN_DISPLAY_CORE, wakeref); 3486 return ret; 3487 } 3488 3489 static bool dkl_pll_get_hw_state(struct drm_i915_private *dev_priv, 3490 struct intel_shared_dpll *pll, 3491 struct intel_dpll_hw_state *hw_state) 3492 { 3493 const enum intel_dpll_id id = pll->info->id; 3494 enum tc_port tc_port = icl_pll_id_to_tc_port(id); 3495 intel_wakeref_t wakeref; 3496 bool ret = false; 3497 u32 val; 3498 3499 wakeref = intel_display_power_get_if_enabled(dev_priv, 3500 POWER_DOMAIN_DISPLAY_CORE); 3501 if (!wakeref) 3502 return false; 3503 3504 val = intel_de_read(dev_priv, intel_tc_pll_enable_reg(dev_priv, pll)); 3505 if (!(val & PLL_ENABLE)) 3506 goto out; 3507 3508 /* 3509 * All registers read here have the same HIP_INDEX_REG even though 3510 * they are on different building blocks 3511 */ 3512 hw_state->mg_refclkin_ctl = intel_dkl_phy_read(dev_priv, 3513 DKL_REFCLKIN_CTL(tc_port), 2); 3514 hw_state->mg_refclkin_ctl &= MG_REFCLKIN_CTL_OD_2_MUX_MASK; 3515 3516 hw_state->mg_clktop2_hsclkctl = 3517 intel_dkl_phy_read(dev_priv, DKL_CLKTOP2_HSCLKCTL(tc_port), 2); 3518 hw_state->mg_clktop2_hsclkctl &= 3519 MG_CLKTOP2_HSCLKCTL_TLINEDRV_CLKSEL_MASK | 3520 MG_CLKTOP2_HSCLKCTL_CORE_INPUTSEL_MASK | 3521 MG_CLKTOP2_HSCLKCTL_HSDIV_RATIO_MASK | 3522 MG_CLKTOP2_HSCLKCTL_DSDIV_RATIO_MASK; 3523 3524 hw_state->mg_clktop2_coreclkctl1 = 3525 intel_dkl_phy_read(dev_priv, DKL_CLKTOP2_CORECLKCTL1(tc_port), 2); 3526 hw_state->mg_clktop2_coreclkctl1 &= 3527 MG_CLKTOP2_CORECLKCTL1_A_DIVRATIO_MASK; 3528 3529 hw_state->mg_pll_div0 = intel_dkl_phy_read(dev_priv, DKL_PLL_DIV0(tc_port), 2); 3530 val = DKL_PLL_DIV0_MASK; 3531 if (dev_priv->display.vbt.override_afc_startup) 3532 val |= DKL_PLL_DIV0_AFC_STARTUP_MASK; 3533 hw_state->mg_pll_div0 &= val; 3534 3535 hw_state->mg_pll_div1 = intel_dkl_phy_read(dev_priv, DKL_PLL_DIV1(tc_port), 2); 3536 hw_state->mg_pll_div1 &= (DKL_PLL_DIV1_IREF_TRIM_MASK | 3537 DKL_PLL_DIV1_TDC_TARGET_CNT_MASK); 3538 3539 hw_state->mg_pll_ssc = intel_dkl_phy_read(dev_priv, DKL_PLL_SSC(tc_port), 2); 3540 hw_state->mg_pll_ssc &= (DKL_PLL_SSC_IREF_NDIV_RATIO_MASK | 3541 DKL_PLL_SSC_STEP_LEN_MASK | 3542 DKL_PLL_SSC_STEP_NUM_MASK | 3543 DKL_PLL_SSC_EN); 3544 3545 hw_state->mg_pll_bias = intel_dkl_phy_read(dev_priv, DKL_PLL_BIAS(tc_port), 2); 3546 hw_state->mg_pll_bias &= (DKL_PLL_BIAS_FRAC_EN_H | 3547 DKL_PLL_BIAS_FBDIV_FRAC_MASK); 3548 3549 hw_state->mg_pll_tdc_coldst_bias = 3550 intel_dkl_phy_read(dev_priv, DKL_PLL_TDC_COLDST_BIAS(tc_port), 2); 3551 hw_state->mg_pll_tdc_coldst_bias &= (DKL_PLL_TDC_SSC_STEP_SIZE_MASK | 3552 DKL_PLL_TDC_FEED_FWD_GAIN_MASK); 3553 3554 ret = true; 3555 out: 3556 intel_display_power_put(dev_priv, POWER_DOMAIN_DISPLAY_CORE, wakeref); 3557 return ret; 3558 } 3559 3560 static bool icl_pll_get_hw_state(struct drm_i915_private *dev_priv, 3561 struct intel_shared_dpll *pll, 3562 struct intel_dpll_hw_state *hw_state, 3563 i915_reg_t enable_reg) 3564 { 3565 const enum intel_dpll_id id = pll->info->id; 3566 intel_wakeref_t wakeref; 3567 bool ret = false; 3568 u32 val; 3569 3570 wakeref = intel_display_power_get_if_enabled(dev_priv, 3571 POWER_DOMAIN_DISPLAY_CORE); 3572 if (!wakeref) 3573 return false; 3574 3575 val = intel_de_read(dev_priv, enable_reg); 3576 if (!(val & PLL_ENABLE)) 3577 goto out; 3578 3579 if (IS_ALDERLAKE_S(dev_priv)) { 3580 hw_state->cfgcr0 = intel_de_read(dev_priv, ADLS_DPLL_CFGCR0(id)); 3581 hw_state->cfgcr1 = intel_de_read(dev_priv, ADLS_DPLL_CFGCR1(id)); 3582 } else if (IS_DG1(dev_priv)) { 3583 hw_state->cfgcr0 = intel_de_read(dev_priv, DG1_DPLL_CFGCR0(id)); 3584 hw_state->cfgcr1 = intel_de_read(dev_priv, DG1_DPLL_CFGCR1(id)); 3585 } else if (IS_ROCKETLAKE(dev_priv)) { 3586 hw_state->cfgcr0 = intel_de_read(dev_priv, 3587 RKL_DPLL_CFGCR0(id)); 3588 hw_state->cfgcr1 = intel_de_read(dev_priv, 3589 RKL_DPLL_CFGCR1(id)); 3590 } else if (DISPLAY_VER(dev_priv) >= 12) { 3591 hw_state->cfgcr0 = intel_de_read(dev_priv, 3592 TGL_DPLL_CFGCR0(id)); 3593 hw_state->cfgcr1 = intel_de_read(dev_priv, 3594 TGL_DPLL_CFGCR1(id)); 3595 if (dev_priv->display.vbt.override_afc_startup) { 3596 hw_state->div0 = intel_de_read(dev_priv, TGL_DPLL0_DIV0(id)); 3597 hw_state->div0 &= TGL_DPLL0_DIV0_AFC_STARTUP_MASK; 3598 } 3599 } else { 3600 if (IS_JSL_EHL(dev_priv) && id == DPLL_ID_EHL_DPLL4) { 3601 hw_state->cfgcr0 = intel_de_read(dev_priv, 3602 ICL_DPLL_CFGCR0(4)); 3603 hw_state->cfgcr1 = intel_de_read(dev_priv, 3604 ICL_DPLL_CFGCR1(4)); 3605 } else { 3606 hw_state->cfgcr0 = intel_de_read(dev_priv, 3607 ICL_DPLL_CFGCR0(id)); 3608 hw_state->cfgcr1 = intel_de_read(dev_priv, 3609 ICL_DPLL_CFGCR1(id)); 3610 } 3611 } 3612 3613 ret = true; 3614 out: 3615 intel_display_power_put(dev_priv, POWER_DOMAIN_DISPLAY_CORE, wakeref); 3616 return ret; 3617 } 3618 3619 static bool combo_pll_get_hw_state(struct drm_i915_private *dev_priv, 3620 struct intel_shared_dpll *pll, 3621 struct intel_dpll_hw_state *hw_state) 3622 { 3623 i915_reg_t enable_reg = intel_combo_pll_enable_reg(dev_priv, pll); 3624 3625 return icl_pll_get_hw_state(dev_priv, pll, hw_state, enable_reg); 3626 } 3627 3628 static bool tbt_pll_get_hw_state(struct drm_i915_private *dev_priv, 3629 struct intel_shared_dpll *pll, 3630 struct intel_dpll_hw_state *hw_state) 3631 { 3632 return icl_pll_get_hw_state(dev_priv, pll, hw_state, TBT_PLL_ENABLE); 3633 } 3634 3635 static void icl_dpll_write(struct drm_i915_private *dev_priv, 3636 struct intel_shared_dpll *pll) 3637 { 3638 struct intel_dpll_hw_state *hw_state = &pll->state.hw_state; 3639 const enum intel_dpll_id id = pll->info->id; 3640 i915_reg_t cfgcr0_reg, cfgcr1_reg, div0_reg = INVALID_MMIO_REG; 3641 3642 if (IS_ALDERLAKE_S(dev_priv)) { 3643 cfgcr0_reg = ADLS_DPLL_CFGCR0(id); 3644 cfgcr1_reg = ADLS_DPLL_CFGCR1(id); 3645 } else if (IS_DG1(dev_priv)) { 3646 cfgcr0_reg = DG1_DPLL_CFGCR0(id); 3647 cfgcr1_reg = DG1_DPLL_CFGCR1(id); 3648 } else if (IS_ROCKETLAKE(dev_priv)) { 3649 cfgcr0_reg = RKL_DPLL_CFGCR0(id); 3650 cfgcr1_reg = RKL_DPLL_CFGCR1(id); 3651 } else if (DISPLAY_VER(dev_priv) >= 12) { 3652 cfgcr0_reg = TGL_DPLL_CFGCR0(id); 3653 cfgcr1_reg = TGL_DPLL_CFGCR1(id); 3654 div0_reg = TGL_DPLL0_DIV0(id); 3655 } else { 3656 if (IS_JSL_EHL(dev_priv) && id == DPLL_ID_EHL_DPLL4) { 3657 cfgcr0_reg = ICL_DPLL_CFGCR0(4); 3658 cfgcr1_reg = ICL_DPLL_CFGCR1(4); 3659 } else { 3660 cfgcr0_reg = ICL_DPLL_CFGCR0(id); 3661 cfgcr1_reg = ICL_DPLL_CFGCR1(id); 3662 } 3663 } 3664 3665 intel_de_write(dev_priv, cfgcr0_reg, hw_state->cfgcr0); 3666 intel_de_write(dev_priv, cfgcr1_reg, hw_state->cfgcr1); 3667 drm_WARN_ON_ONCE(&dev_priv->drm, dev_priv->display.vbt.override_afc_startup && 3668 !i915_mmio_reg_valid(div0_reg)); 3669 if (dev_priv->display.vbt.override_afc_startup && 3670 i915_mmio_reg_valid(div0_reg)) 3671 intel_de_rmw(dev_priv, div0_reg, TGL_DPLL0_DIV0_AFC_STARTUP_MASK, 3672 hw_state->div0); 3673 intel_de_posting_read(dev_priv, cfgcr1_reg); 3674 } 3675 3676 static void icl_mg_pll_write(struct drm_i915_private *dev_priv, 3677 struct intel_shared_dpll *pll) 3678 { 3679 struct intel_dpll_hw_state *hw_state = &pll->state.hw_state; 3680 enum tc_port tc_port = icl_pll_id_to_tc_port(pll->info->id); 3681 u32 val; 3682 3683 /* 3684 * Some of the following registers have reserved fields, so program 3685 * these with RMW based on a mask. The mask can be fixed or generated 3686 * during the calc/readout phase if the mask depends on some other HW 3687 * state like refclk, see icl_calc_mg_pll_state(). 3688 */ 3689 val = intel_de_read(dev_priv, MG_REFCLKIN_CTL(tc_port)); 3690 val &= ~MG_REFCLKIN_CTL_OD_2_MUX_MASK; 3691 val |= hw_state->mg_refclkin_ctl; 3692 intel_de_write(dev_priv, MG_REFCLKIN_CTL(tc_port), val); 3693 3694 val = intel_de_read(dev_priv, MG_CLKTOP2_CORECLKCTL1(tc_port)); 3695 val &= ~MG_CLKTOP2_CORECLKCTL1_A_DIVRATIO_MASK; 3696 val |= hw_state->mg_clktop2_coreclkctl1; 3697 intel_de_write(dev_priv, MG_CLKTOP2_CORECLKCTL1(tc_port), val); 3698 3699 val = intel_de_read(dev_priv, MG_CLKTOP2_HSCLKCTL(tc_port)); 3700 val &= ~(MG_CLKTOP2_HSCLKCTL_TLINEDRV_CLKSEL_MASK | 3701 MG_CLKTOP2_HSCLKCTL_CORE_INPUTSEL_MASK | 3702 MG_CLKTOP2_HSCLKCTL_HSDIV_RATIO_MASK | 3703 MG_CLKTOP2_HSCLKCTL_DSDIV_RATIO_MASK); 3704 val |= hw_state->mg_clktop2_hsclkctl; 3705 intel_de_write(dev_priv, MG_CLKTOP2_HSCLKCTL(tc_port), val); 3706 3707 intel_de_write(dev_priv, MG_PLL_DIV0(tc_port), hw_state->mg_pll_div0); 3708 intel_de_write(dev_priv, MG_PLL_DIV1(tc_port), hw_state->mg_pll_div1); 3709 intel_de_write(dev_priv, MG_PLL_LF(tc_port), hw_state->mg_pll_lf); 3710 intel_de_write(dev_priv, MG_PLL_FRAC_LOCK(tc_port), 3711 hw_state->mg_pll_frac_lock); 3712 intel_de_write(dev_priv, MG_PLL_SSC(tc_port), hw_state->mg_pll_ssc); 3713 3714 val = intel_de_read(dev_priv, MG_PLL_BIAS(tc_port)); 3715 val &= ~hw_state->mg_pll_bias_mask; 3716 val |= hw_state->mg_pll_bias; 3717 intel_de_write(dev_priv, MG_PLL_BIAS(tc_port), val); 3718 3719 val = intel_de_read(dev_priv, MG_PLL_TDC_COLDST_BIAS(tc_port)); 3720 val &= ~hw_state->mg_pll_tdc_coldst_bias_mask; 3721 val |= hw_state->mg_pll_tdc_coldst_bias; 3722 intel_de_write(dev_priv, MG_PLL_TDC_COLDST_BIAS(tc_port), val); 3723 3724 intel_de_posting_read(dev_priv, MG_PLL_TDC_COLDST_BIAS(tc_port)); 3725 } 3726 3727 static void dkl_pll_write(struct drm_i915_private *dev_priv, 3728 struct intel_shared_dpll *pll) 3729 { 3730 struct intel_dpll_hw_state *hw_state = &pll->state.hw_state; 3731 enum tc_port tc_port = icl_pll_id_to_tc_port(pll->info->id); 3732 u32 val; 3733 3734 /* 3735 * All registers programmed here have the same HIP_INDEX_REG even 3736 * though on different building block 3737 */ 3738 /* All the registers are RMW */ 3739 val = intel_dkl_phy_read(dev_priv, DKL_REFCLKIN_CTL(tc_port), 2); 3740 val &= ~MG_REFCLKIN_CTL_OD_2_MUX_MASK; 3741 val |= hw_state->mg_refclkin_ctl; 3742 intel_dkl_phy_write(dev_priv, DKL_REFCLKIN_CTL(tc_port), 2, val); 3743 3744 val = intel_dkl_phy_read(dev_priv, DKL_CLKTOP2_CORECLKCTL1(tc_port), 2); 3745 val &= ~MG_CLKTOP2_CORECLKCTL1_A_DIVRATIO_MASK; 3746 val |= hw_state->mg_clktop2_coreclkctl1; 3747 intel_dkl_phy_write(dev_priv, DKL_CLKTOP2_CORECLKCTL1(tc_port), 2, val); 3748 3749 val = intel_dkl_phy_read(dev_priv, DKL_CLKTOP2_HSCLKCTL(tc_port), 2); 3750 val &= ~(MG_CLKTOP2_HSCLKCTL_TLINEDRV_CLKSEL_MASK | 3751 MG_CLKTOP2_HSCLKCTL_CORE_INPUTSEL_MASK | 3752 MG_CLKTOP2_HSCLKCTL_HSDIV_RATIO_MASK | 3753 MG_CLKTOP2_HSCLKCTL_DSDIV_RATIO_MASK); 3754 val |= hw_state->mg_clktop2_hsclkctl; 3755 intel_dkl_phy_write(dev_priv, DKL_CLKTOP2_HSCLKCTL(tc_port), 2, val); 3756 3757 val = DKL_PLL_DIV0_MASK; 3758 if (dev_priv->display.vbt.override_afc_startup) 3759 val |= DKL_PLL_DIV0_AFC_STARTUP_MASK; 3760 intel_dkl_phy_rmw(dev_priv, DKL_PLL_DIV0(tc_port), 2, val, 3761 hw_state->mg_pll_div0); 3762 3763 val = intel_dkl_phy_read(dev_priv, DKL_PLL_DIV1(tc_port), 2); 3764 val &= ~(DKL_PLL_DIV1_IREF_TRIM_MASK | 3765 DKL_PLL_DIV1_TDC_TARGET_CNT_MASK); 3766 val |= hw_state->mg_pll_div1; 3767 intel_dkl_phy_write(dev_priv, DKL_PLL_DIV1(tc_port), 2, val); 3768 3769 val = intel_dkl_phy_read(dev_priv, DKL_PLL_SSC(tc_port), 2); 3770 val &= ~(DKL_PLL_SSC_IREF_NDIV_RATIO_MASK | 3771 DKL_PLL_SSC_STEP_LEN_MASK | 3772 DKL_PLL_SSC_STEP_NUM_MASK | 3773 DKL_PLL_SSC_EN); 3774 val |= hw_state->mg_pll_ssc; 3775 intel_dkl_phy_write(dev_priv, DKL_PLL_SSC(tc_port), 2, val); 3776 3777 val = intel_dkl_phy_read(dev_priv, DKL_PLL_BIAS(tc_port), 2); 3778 val &= ~(DKL_PLL_BIAS_FRAC_EN_H | 3779 DKL_PLL_BIAS_FBDIV_FRAC_MASK); 3780 val |= hw_state->mg_pll_bias; 3781 intel_dkl_phy_write(dev_priv, DKL_PLL_BIAS(tc_port), 2, val); 3782 3783 val = intel_dkl_phy_read(dev_priv, DKL_PLL_TDC_COLDST_BIAS(tc_port), 2); 3784 val &= ~(DKL_PLL_TDC_SSC_STEP_SIZE_MASK | 3785 DKL_PLL_TDC_FEED_FWD_GAIN_MASK); 3786 val |= hw_state->mg_pll_tdc_coldst_bias; 3787 intel_dkl_phy_write(dev_priv, DKL_PLL_TDC_COLDST_BIAS(tc_port), 2, val); 3788 3789 intel_dkl_phy_posting_read(dev_priv, DKL_PLL_TDC_COLDST_BIAS(tc_port), 2); 3790 } 3791 3792 static void icl_pll_power_enable(struct drm_i915_private *dev_priv, 3793 struct intel_shared_dpll *pll, 3794 i915_reg_t enable_reg) 3795 { 3796 u32 val; 3797 3798 val = intel_de_read(dev_priv, enable_reg); 3799 val |= PLL_POWER_ENABLE; 3800 intel_de_write(dev_priv, enable_reg, val); 3801 3802 /* 3803 * The spec says we need to "wait" but it also says it should be 3804 * immediate. 3805 */ 3806 if (intel_de_wait_for_set(dev_priv, enable_reg, PLL_POWER_STATE, 1)) 3807 drm_err(&dev_priv->drm, "PLL %d Power not enabled\n", 3808 pll->info->id); 3809 } 3810 3811 static void icl_pll_enable(struct drm_i915_private *dev_priv, 3812 struct intel_shared_dpll *pll, 3813 i915_reg_t enable_reg) 3814 { 3815 u32 val; 3816 3817 val = intel_de_read(dev_priv, enable_reg); 3818 val |= PLL_ENABLE; 3819 intel_de_write(dev_priv, enable_reg, val); 3820 3821 /* Timeout is actually 600us. */ 3822 if (intel_de_wait_for_set(dev_priv, enable_reg, PLL_LOCK, 1)) 3823 drm_err(&dev_priv->drm, "PLL %d not locked\n", pll->info->id); 3824 } 3825 3826 static void adlp_cmtg_clock_gating_wa(struct drm_i915_private *i915, struct intel_shared_dpll *pll) 3827 { 3828 u32 val; 3829 3830 if (!IS_ADLP_DISPLAY_STEP(i915, STEP_A0, STEP_B0) || 3831 pll->info->id != DPLL_ID_ICL_DPLL0) 3832 return; 3833 /* 3834 * Wa_16011069516:adl-p[a0] 3835 * 3836 * All CMTG regs are unreliable until CMTG clock gating is disabled, 3837 * so we can only assume the default TRANS_CMTG_CHICKEN reg value and 3838 * sanity check this assumption with a double read, which presumably 3839 * returns the correct value even with clock gating on. 3840 * 3841 * Instead of the usual place for workarounds we apply this one here, 3842 * since TRANS_CMTG_CHICKEN is only accessible while DPLL0 is enabled. 3843 */ 3844 val = intel_de_read(i915, TRANS_CMTG_CHICKEN); 3845 val = intel_de_read(i915, TRANS_CMTG_CHICKEN); 3846 intel_de_write(i915, TRANS_CMTG_CHICKEN, DISABLE_DPT_CLK_GATING); 3847 if (drm_WARN_ON(&i915->drm, val & ~DISABLE_DPT_CLK_GATING)) 3848 drm_dbg_kms(&i915->drm, "Unexpected flags in TRANS_CMTG_CHICKEN: %08x\n", val); 3849 } 3850 3851 static void combo_pll_enable(struct drm_i915_private *dev_priv, 3852 struct intel_shared_dpll *pll) 3853 { 3854 i915_reg_t enable_reg = intel_combo_pll_enable_reg(dev_priv, pll); 3855 3856 if (IS_JSL_EHL(dev_priv) && 3857 pll->info->id == DPLL_ID_EHL_DPLL4) { 3858 3859 /* 3860 * We need to disable DC states when this DPLL is enabled. 3861 * This can be done by taking a reference on DPLL4 power 3862 * domain. 3863 */ 3864 pll->wakeref = intel_display_power_get(dev_priv, 3865 POWER_DOMAIN_DC_OFF); 3866 } 3867 3868 icl_pll_power_enable(dev_priv, pll, enable_reg); 3869 3870 icl_dpll_write(dev_priv, pll); 3871 3872 /* 3873 * DVFS pre sequence would be here, but in our driver the cdclk code 3874 * paths should already be setting the appropriate voltage, hence we do 3875 * nothing here. 3876 */ 3877 3878 icl_pll_enable(dev_priv, pll, enable_reg); 3879 3880 adlp_cmtg_clock_gating_wa(dev_priv, pll); 3881 3882 /* DVFS post sequence would be here. See the comment above. */ 3883 } 3884 3885 static void tbt_pll_enable(struct drm_i915_private *dev_priv, 3886 struct intel_shared_dpll *pll) 3887 { 3888 icl_pll_power_enable(dev_priv, pll, TBT_PLL_ENABLE); 3889 3890 icl_dpll_write(dev_priv, pll); 3891 3892 /* 3893 * DVFS pre sequence would be here, but in our driver the cdclk code 3894 * paths should already be setting the appropriate voltage, hence we do 3895 * nothing here. 3896 */ 3897 3898 icl_pll_enable(dev_priv, pll, TBT_PLL_ENABLE); 3899 3900 /* DVFS post sequence would be here. See the comment above. */ 3901 } 3902 3903 static void mg_pll_enable(struct drm_i915_private *dev_priv, 3904 struct intel_shared_dpll *pll) 3905 { 3906 i915_reg_t enable_reg = intel_tc_pll_enable_reg(dev_priv, pll); 3907 3908 icl_pll_power_enable(dev_priv, pll, enable_reg); 3909 3910 if (DISPLAY_VER(dev_priv) >= 12) 3911 dkl_pll_write(dev_priv, pll); 3912 else 3913 icl_mg_pll_write(dev_priv, pll); 3914 3915 /* 3916 * DVFS pre sequence would be here, but in our driver the cdclk code 3917 * paths should already be setting the appropriate voltage, hence we do 3918 * nothing here. 3919 */ 3920 3921 icl_pll_enable(dev_priv, pll, enable_reg); 3922 3923 /* DVFS post sequence would be here. See the comment above. */ 3924 } 3925 3926 static void icl_pll_disable(struct drm_i915_private *dev_priv, 3927 struct intel_shared_dpll *pll, 3928 i915_reg_t enable_reg) 3929 { 3930 u32 val; 3931 3932 /* The first steps are done by intel_ddi_post_disable(). */ 3933 3934 /* 3935 * DVFS pre sequence would be here, but in our driver the cdclk code 3936 * paths should already be setting the appropriate voltage, hence we do 3937 * nothing here. 3938 */ 3939 3940 val = intel_de_read(dev_priv, enable_reg); 3941 val &= ~PLL_ENABLE; 3942 intel_de_write(dev_priv, enable_reg, val); 3943 3944 /* Timeout is actually 1us. */ 3945 if (intel_de_wait_for_clear(dev_priv, enable_reg, PLL_LOCK, 1)) 3946 drm_err(&dev_priv->drm, "PLL %d locked\n", pll->info->id); 3947 3948 /* DVFS post sequence would be here. See the comment above. */ 3949 3950 val = intel_de_read(dev_priv, enable_reg); 3951 val &= ~PLL_POWER_ENABLE; 3952 intel_de_write(dev_priv, enable_reg, val); 3953 3954 /* 3955 * The spec says we need to "wait" but it also says it should be 3956 * immediate. 3957 */ 3958 if (intel_de_wait_for_clear(dev_priv, enable_reg, PLL_POWER_STATE, 1)) 3959 drm_err(&dev_priv->drm, "PLL %d Power not disabled\n", 3960 pll->info->id); 3961 } 3962 3963 static void combo_pll_disable(struct drm_i915_private *dev_priv, 3964 struct intel_shared_dpll *pll) 3965 { 3966 i915_reg_t enable_reg = intel_combo_pll_enable_reg(dev_priv, pll); 3967 3968 icl_pll_disable(dev_priv, pll, enable_reg); 3969 3970 if (IS_JSL_EHL(dev_priv) && 3971 pll->info->id == DPLL_ID_EHL_DPLL4) 3972 intel_display_power_put(dev_priv, POWER_DOMAIN_DC_OFF, 3973 pll->wakeref); 3974 } 3975 3976 static void tbt_pll_disable(struct drm_i915_private *dev_priv, 3977 struct intel_shared_dpll *pll) 3978 { 3979 icl_pll_disable(dev_priv, pll, TBT_PLL_ENABLE); 3980 } 3981 3982 static void mg_pll_disable(struct drm_i915_private *dev_priv, 3983 struct intel_shared_dpll *pll) 3984 { 3985 i915_reg_t enable_reg = intel_tc_pll_enable_reg(dev_priv, pll); 3986 3987 icl_pll_disable(dev_priv, pll, enable_reg); 3988 } 3989 3990 static void icl_update_dpll_ref_clks(struct drm_i915_private *i915) 3991 { 3992 /* No SSC ref */ 3993 i915->display.dpll.ref_clks.nssc = i915->display.cdclk.hw.ref; 3994 } 3995 3996 static void icl_dump_hw_state(struct drm_i915_private *dev_priv, 3997 const struct intel_dpll_hw_state *hw_state) 3998 { 3999 drm_dbg_kms(&dev_priv->drm, 4000 "dpll_hw_state: cfgcr0: 0x%x, cfgcr1: 0x%x, div0: 0x%x, " 4001 "mg_refclkin_ctl: 0x%x, hg_clktop2_coreclkctl1: 0x%x, " 4002 "mg_clktop2_hsclkctl: 0x%x, mg_pll_div0: 0x%x, " 4003 "mg_pll_div2: 0x%x, mg_pll_lf: 0x%x, " 4004 "mg_pll_frac_lock: 0x%x, mg_pll_ssc: 0x%x, " 4005 "mg_pll_bias: 0x%x, mg_pll_tdc_coldst_bias: 0x%x\n", 4006 hw_state->cfgcr0, hw_state->cfgcr1, 4007 hw_state->div0, 4008 hw_state->mg_refclkin_ctl, 4009 hw_state->mg_clktop2_coreclkctl1, 4010 hw_state->mg_clktop2_hsclkctl, 4011 hw_state->mg_pll_div0, 4012 hw_state->mg_pll_div1, 4013 hw_state->mg_pll_lf, 4014 hw_state->mg_pll_frac_lock, 4015 hw_state->mg_pll_ssc, 4016 hw_state->mg_pll_bias, 4017 hw_state->mg_pll_tdc_coldst_bias); 4018 } 4019 4020 static const struct intel_shared_dpll_funcs combo_pll_funcs = { 4021 .enable = combo_pll_enable, 4022 .disable = combo_pll_disable, 4023 .get_hw_state = combo_pll_get_hw_state, 4024 .get_freq = icl_ddi_combo_pll_get_freq, 4025 }; 4026 4027 static const struct intel_shared_dpll_funcs tbt_pll_funcs = { 4028 .enable = tbt_pll_enable, 4029 .disable = tbt_pll_disable, 4030 .get_hw_state = tbt_pll_get_hw_state, 4031 .get_freq = icl_ddi_tbt_pll_get_freq, 4032 }; 4033 4034 static const struct intel_shared_dpll_funcs mg_pll_funcs = { 4035 .enable = mg_pll_enable, 4036 .disable = mg_pll_disable, 4037 .get_hw_state = mg_pll_get_hw_state, 4038 .get_freq = icl_ddi_mg_pll_get_freq, 4039 }; 4040 4041 static const struct dpll_info icl_plls[] = { 4042 { "DPLL 0", &combo_pll_funcs, DPLL_ID_ICL_DPLL0, 0 }, 4043 { "DPLL 1", &combo_pll_funcs, DPLL_ID_ICL_DPLL1, 0 }, 4044 { "TBT PLL", &tbt_pll_funcs, DPLL_ID_ICL_TBTPLL, 0 }, 4045 { "MG PLL 1", &mg_pll_funcs, DPLL_ID_ICL_MGPLL1, 0 }, 4046 { "MG PLL 2", &mg_pll_funcs, DPLL_ID_ICL_MGPLL2, 0 }, 4047 { "MG PLL 3", &mg_pll_funcs, DPLL_ID_ICL_MGPLL3, 0 }, 4048 { "MG PLL 4", &mg_pll_funcs, DPLL_ID_ICL_MGPLL4, 0 }, 4049 { }, 4050 }; 4051 4052 static const struct intel_dpll_mgr icl_pll_mgr = { 4053 .dpll_info = icl_plls, 4054 .compute_dplls = icl_compute_dplls, 4055 .get_dplls = icl_get_dplls, 4056 .put_dplls = icl_put_dplls, 4057 .update_active_dpll = icl_update_active_dpll, 4058 .update_ref_clks = icl_update_dpll_ref_clks, 4059 .dump_hw_state = icl_dump_hw_state, 4060 }; 4061 4062 static const struct dpll_info ehl_plls[] = { 4063 { "DPLL 0", &combo_pll_funcs, DPLL_ID_ICL_DPLL0, 0 }, 4064 { "DPLL 1", &combo_pll_funcs, DPLL_ID_ICL_DPLL1, 0 }, 4065 { "DPLL 4", &combo_pll_funcs, DPLL_ID_EHL_DPLL4, 0 }, 4066 { }, 4067 }; 4068 4069 static const struct intel_dpll_mgr ehl_pll_mgr = { 4070 .dpll_info = ehl_plls, 4071 .compute_dplls = icl_compute_dplls, 4072 .get_dplls = icl_get_dplls, 4073 .put_dplls = icl_put_dplls, 4074 .update_ref_clks = icl_update_dpll_ref_clks, 4075 .dump_hw_state = icl_dump_hw_state, 4076 }; 4077 4078 static const struct intel_shared_dpll_funcs dkl_pll_funcs = { 4079 .enable = mg_pll_enable, 4080 .disable = mg_pll_disable, 4081 .get_hw_state = dkl_pll_get_hw_state, 4082 .get_freq = icl_ddi_mg_pll_get_freq, 4083 }; 4084 4085 static const struct dpll_info tgl_plls[] = { 4086 { "DPLL 0", &combo_pll_funcs, DPLL_ID_ICL_DPLL0, 0 }, 4087 { "DPLL 1", &combo_pll_funcs, DPLL_ID_ICL_DPLL1, 0 }, 4088 { "TBT PLL", &tbt_pll_funcs, DPLL_ID_ICL_TBTPLL, 0 }, 4089 { "TC PLL 1", &dkl_pll_funcs, DPLL_ID_ICL_MGPLL1, 0 }, 4090 { "TC PLL 2", &dkl_pll_funcs, DPLL_ID_ICL_MGPLL2, 0 }, 4091 { "TC PLL 3", &dkl_pll_funcs, DPLL_ID_ICL_MGPLL3, 0 }, 4092 { "TC PLL 4", &dkl_pll_funcs, DPLL_ID_ICL_MGPLL4, 0 }, 4093 { "TC PLL 5", &dkl_pll_funcs, DPLL_ID_TGL_MGPLL5, 0 }, 4094 { "TC PLL 6", &dkl_pll_funcs, DPLL_ID_TGL_MGPLL6, 0 }, 4095 { }, 4096 }; 4097 4098 static const struct intel_dpll_mgr tgl_pll_mgr = { 4099 .dpll_info = tgl_plls, 4100 .compute_dplls = icl_compute_dplls, 4101 .get_dplls = icl_get_dplls, 4102 .put_dplls = icl_put_dplls, 4103 .update_active_dpll = icl_update_active_dpll, 4104 .update_ref_clks = icl_update_dpll_ref_clks, 4105 .dump_hw_state = icl_dump_hw_state, 4106 }; 4107 4108 static const struct dpll_info rkl_plls[] = { 4109 { "DPLL 0", &combo_pll_funcs, DPLL_ID_ICL_DPLL0, 0 }, 4110 { "DPLL 1", &combo_pll_funcs, DPLL_ID_ICL_DPLL1, 0 }, 4111 { "DPLL 4", &combo_pll_funcs, DPLL_ID_EHL_DPLL4, 0 }, 4112 { }, 4113 }; 4114 4115 static const struct intel_dpll_mgr rkl_pll_mgr = { 4116 .dpll_info = rkl_plls, 4117 .compute_dplls = icl_compute_dplls, 4118 .get_dplls = icl_get_dplls, 4119 .put_dplls = icl_put_dplls, 4120 .update_ref_clks = icl_update_dpll_ref_clks, 4121 .dump_hw_state = icl_dump_hw_state, 4122 }; 4123 4124 static const struct dpll_info dg1_plls[] = { 4125 { "DPLL 0", &combo_pll_funcs, DPLL_ID_DG1_DPLL0, 0 }, 4126 { "DPLL 1", &combo_pll_funcs, DPLL_ID_DG1_DPLL1, 0 }, 4127 { "DPLL 2", &combo_pll_funcs, DPLL_ID_DG1_DPLL2, 0 }, 4128 { "DPLL 3", &combo_pll_funcs, DPLL_ID_DG1_DPLL3, 0 }, 4129 { }, 4130 }; 4131 4132 static const struct intel_dpll_mgr dg1_pll_mgr = { 4133 .dpll_info = dg1_plls, 4134 .compute_dplls = icl_compute_dplls, 4135 .get_dplls = icl_get_dplls, 4136 .put_dplls = icl_put_dplls, 4137 .update_ref_clks = icl_update_dpll_ref_clks, 4138 .dump_hw_state = icl_dump_hw_state, 4139 }; 4140 4141 static const struct dpll_info adls_plls[] = { 4142 { "DPLL 0", &combo_pll_funcs, DPLL_ID_ICL_DPLL0, 0 }, 4143 { "DPLL 1", &combo_pll_funcs, DPLL_ID_ICL_DPLL1, 0 }, 4144 { "DPLL 2", &combo_pll_funcs, DPLL_ID_DG1_DPLL2, 0 }, 4145 { "DPLL 3", &combo_pll_funcs, DPLL_ID_DG1_DPLL3, 0 }, 4146 { }, 4147 }; 4148 4149 static const struct intel_dpll_mgr adls_pll_mgr = { 4150 .dpll_info = adls_plls, 4151 .compute_dplls = icl_compute_dplls, 4152 .get_dplls = icl_get_dplls, 4153 .put_dplls = icl_put_dplls, 4154 .update_ref_clks = icl_update_dpll_ref_clks, 4155 .dump_hw_state = icl_dump_hw_state, 4156 }; 4157 4158 static const struct dpll_info adlp_plls[] = { 4159 { "DPLL 0", &combo_pll_funcs, DPLL_ID_ICL_DPLL0, 0 }, 4160 { "DPLL 1", &combo_pll_funcs, DPLL_ID_ICL_DPLL1, 0 }, 4161 { "TBT PLL", &tbt_pll_funcs, DPLL_ID_ICL_TBTPLL, 0 }, 4162 { "TC PLL 1", &dkl_pll_funcs, DPLL_ID_ICL_MGPLL1, 0 }, 4163 { "TC PLL 2", &dkl_pll_funcs, DPLL_ID_ICL_MGPLL2, 0 }, 4164 { "TC PLL 3", &dkl_pll_funcs, DPLL_ID_ICL_MGPLL3, 0 }, 4165 { "TC PLL 4", &dkl_pll_funcs, DPLL_ID_ICL_MGPLL4, 0 }, 4166 { }, 4167 }; 4168 4169 static const struct intel_dpll_mgr adlp_pll_mgr = { 4170 .dpll_info = adlp_plls, 4171 .compute_dplls = icl_compute_dplls, 4172 .get_dplls = icl_get_dplls, 4173 .put_dplls = icl_put_dplls, 4174 .update_active_dpll = icl_update_active_dpll, 4175 .update_ref_clks = icl_update_dpll_ref_clks, 4176 .dump_hw_state = icl_dump_hw_state, 4177 }; 4178 4179 /** 4180 * intel_shared_dpll_init - Initialize shared DPLLs 4181 * @dev_priv: i915 device 4182 * 4183 * Initialize shared DPLLs for @dev_priv. 4184 */ 4185 void intel_shared_dpll_init(struct drm_i915_private *dev_priv) 4186 { 4187 const struct intel_dpll_mgr *dpll_mgr = NULL; 4188 const struct dpll_info *dpll_info; 4189 int i; 4190 4191 if (IS_DG2(dev_priv)) 4192 /* No shared DPLLs on DG2; port PLLs are part of the PHY */ 4193 dpll_mgr = NULL; 4194 else if (IS_ALDERLAKE_P(dev_priv)) 4195 dpll_mgr = &adlp_pll_mgr; 4196 else if (IS_ALDERLAKE_S(dev_priv)) 4197 dpll_mgr = &adls_pll_mgr; 4198 else if (IS_DG1(dev_priv)) 4199 dpll_mgr = &dg1_pll_mgr; 4200 else if (IS_ROCKETLAKE(dev_priv)) 4201 dpll_mgr = &rkl_pll_mgr; 4202 else if (DISPLAY_VER(dev_priv) >= 12) 4203 dpll_mgr = &tgl_pll_mgr; 4204 else if (IS_JSL_EHL(dev_priv)) 4205 dpll_mgr = &ehl_pll_mgr; 4206 else if (DISPLAY_VER(dev_priv) >= 11) 4207 dpll_mgr = &icl_pll_mgr; 4208 else if (IS_GEMINILAKE(dev_priv) || IS_BROXTON(dev_priv)) 4209 dpll_mgr = &bxt_pll_mgr; 4210 else if (DISPLAY_VER(dev_priv) == 9) 4211 dpll_mgr = &skl_pll_mgr; 4212 else if (HAS_DDI(dev_priv)) 4213 dpll_mgr = &hsw_pll_mgr; 4214 else if (HAS_PCH_IBX(dev_priv) || HAS_PCH_CPT(dev_priv)) 4215 dpll_mgr = &pch_pll_mgr; 4216 4217 if (!dpll_mgr) { 4218 dev_priv->display.dpll.num_shared_dpll = 0; 4219 return; 4220 } 4221 4222 dpll_info = dpll_mgr->dpll_info; 4223 4224 for (i = 0; dpll_info[i].name; i++) { 4225 if (drm_WARN_ON(&dev_priv->drm, 4226 i >= ARRAY_SIZE(dev_priv->display.dpll.shared_dplls))) 4227 break; 4228 4229 drm_WARN_ON(&dev_priv->drm, i != dpll_info[i].id); 4230 dev_priv->display.dpll.shared_dplls[i].info = &dpll_info[i]; 4231 } 4232 4233 dev_priv->display.dpll.mgr = dpll_mgr; 4234 dev_priv->display.dpll.num_shared_dpll = i; 4235 mutex_init(&dev_priv->display.dpll.lock); 4236 } 4237 4238 /** 4239 * intel_compute_shared_dplls - compute DPLL state CRTC and encoder combination 4240 * @state: atomic state 4241 * @crtc: CRTC to compute DPLLs for 4242 * @encoder: encoder 4243 * 4244 * This function computes the DPLL state for the given CRTC and encoder. 4245 * 4246 * The new configuration in the atomic commit @state is made effective by 4247 * calling intel_shared_dpll_swap_state(). 4248 * 4249 * Returns: 4250 * 0 on success, negative error code on falure. 4251 */ 4252 int intel_compute_shared_dplls(struct intel_atomic_state *state, 4253 struct intel_crtc *crtc, 4254 struct intel_encoder *encoder) 4255 { 4256 struct drm_i915_private *dev_priv = to_i915(state->base.dev); 4257 const struct intel_dpll_mgr *dpll_mgr = dev_priv->display.dpll.mgr; 4258 4259 if (drm_WARN_ON(&dev_priv->drm, !dpll_mgr)) 4260 return -EINVAL; 4261 4262 return dpll_mgr->compute_dplls(state, crtc, encoder); 4263 } 4264 4265 /** 4266 * intel_reserve_shared_dplls - reserve DPLLs for CRTC and encoder combination 4267 * @state: atomic state 4268 * @crtc: CRTC to reserve DPLLs for 4269 * @encoder: encoder 4270 * 4271 * This function reserves all required DPLLs for the given CRTC and encoder 4272 * combination in the current atomic commit @state and the new @crtc atomic 4273 * state. 4274 * 4275 * The new configuration in the atomic commit @state is made effective by 4276 * calling intel_shared_dpll_swap_state(). 4277 * 4278 * The reserved DPLLs should be released by calling 4279 * intel_release_shared_dplls(). 4280 * 4281 * Returns: 4282 * 0 if all required DPLLs were successfully reserved, 4283 * negative error code otherwise. 4284 */ 4285 int intel_reserve_shared_dplls(struct intel_atomic_state *state, 4286 struct intel_crtc *crtc, 4287 struct intel_encoder *encoder) 4288 { 4289 struct drm_i915_private *dev_priv = to_i915(state->base.dev); 4290 const struct intel_dpll_mgr *dpll_mgr = dev_priv->display.dpll.mgr; 4291 4292 if (drm_WARN_ON(&dev_priv->drm, !dpll_mgr)) 4293 return -EINVAL; 4294 4295 return dpll_mgr->get_dplls(state, crtc, encoder); 4296 } 4297 4298 /** 4299 * intel_release_shared_dplls - end use of DPLLs by CRTC in atomic state 4300 * @state: atomic state 4301 * @crtc: crtc from which the DPLLs are to be released 4302 * 4303 * This function releases all DPLLs reserved by intel_reserve_shared_dplls() 4304 * from the current atomic commit @state and the old @crtc atomic state. 4305 * 4306 * The new configuration in the atomic commit @state is made effective by 4307 * calling intel_shared_dpll_swap_state(). 4308 */ 4309 void intel_release_shared_dplls(struct intel_atomic_state *state, 4310 struct intel_crtc *crtc) 4311 { 4312 struct drm_i915_private *dev_priv = to_i915(state->base.dev); 4313 const struct intel_dpll_mgr *dpll_mgr = dev_priv->display.dpll.mgr; 4314 4315 /* 4316 * FIXME: this function is called for every platform having a 4317 * compute_clock hook, even though the platform doesn't yet support 4318 * the shared DPLL framework and intel_reserve_shared_dplls() is not 4319 * called on those. 4320 */ 4321 if (!dpll_mgr) 4322 return; 4323 4324 dpll_mgr->put_dplls(state, crtc); 4325 } 4326 4327 /** 4328 * intel_update_active_dpll - update the active DPLL for a CRTC/encoder 4329 * @state: atomic state 4330 * @crtc: the CRTC for which to update the active DPLL 4331 * @encoder: encoder determining the type of port DPLL 4332 * 4333 * Update the active DPLL for the given @crtc/@encoder in @crtc's atomic state, 4334 * from the port DPLLs reserved previously by intel_reserve_shared_dplls(). The 4335 * DPLL selected will be based on the current mode of the encoder's port. 4336 */ 4337 void intel_update_active_dpll(struct intel_atomic_state *state, 4338 struct intel_crtc *crtc, 4339 struct intel_encoder *encoder) 4340 { 4341 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev); 4342 const struct intel_dpll_mgr *dpll_mgr = dev_priv->display.dpll.mgr; 4343 4344 if (drm_WARN_ON(&dev_priv->drm, !dpll_mgr)) 4345 return; 4346 4347 dpll_mgr->update_active_dpll(state, crtc, encoder); 4348 } 4349 4350 /** 4351 * intel_dpll_get_freq - calculate the DPLL's output frequency 4352 * @i915: i915 device 4353 * @pll: DPLL for which to calculate the output frequency 4354 * @pll_state: DPLL state from which to calculate the output frequency 4355 * 4356 * Return the output frequency corresponding to @pll's passed in @pll_state. 4357 */ 4358 int intel_dpll_get_freq(struct drm_i915_private *i915, 4359 const struct intel_shared_dpll *pll, 4360 const struct intel_dpll_hw_state *pll_state) 4361 { 4362 if (drm_WARN_ON(&i915->drm, !pll->info->funcs->get_freq)) 4363 return 0; 4364 4365 return pll->info->funcs->get_freq(i915, pll, pll_state); 4366 } 4367 4368 /** 4369 * intel_dpll_get_hw_state - readout the DPLL's hardware state 4370 * @i915: i915 device 4371 * @pll: DPLL for which to calculate the output frequency 4372 * @hw_state: DPLL's hardware state 4373 * 4374 * Read out @pll's hardware state into @hw_state. 4375 */ 4376 bool intel_dpll_get_hw_state(struct drm_i915_private *i915, 4377 struct intel_shared_dpll *pll, 4378 struct intel_dpll_hw_state *hw_state) 4379 { 4380 return pll->info->funcs->get_hw_state(i915, pll, hw_state); 4381 } 4382 4383 static void readout_dpll_hw_state(struct drm_i915_private *i915, 4384 struct intel_shared_dpll *pll) 4385 { 4386 struct intel_crtc *crtc; 4387 4388 pll->on = intel_dpll_get_hw_state(i915, pll, &pll->state.hw_state); 4389 4390 if (IS_JSL_EHL(i915) && pll->on && 4391 pll->info->id == DPLL_ID_EHL_DPLL4) { 4392 pll->wakeref = intel_display_power_get(i915, 4393 POWER_DOMAIN_DC_OFF); 4394 } 4395 4396 pll->state.pipe_mask = 0; 4397 for_each_intel_crtc(&i915->drm, crtc) { 4398 struct intel_crtc_state *crtc_state = 4399 to_intel_crtc_state(crtc->base.state); 4400 4401 if (crtc_state->hw.active && crtc_state->shared_dpll == pll) 4402 pll->state.pipe_mask |= BIT(crtc->pipe); 4403 } 4404 pll->active_mask = pll->state.pipe_mask; 4405 4406 drm_dbg_kms(&i915->drm, 4407 "%s hw state readout: pipe_mask 0x%x, on %i\n", 4408 pll->info->name, pll->state.pipe_mask, pll->on); 4409 } 4410 4411 void intel_dpll_update_ref_clks(struct drm_i915_private *i915) 4412 { 4413 if (i915->display.dpll.mgr && i915->display.dpll.mgr->update_ref_clks) 4414 i915->display.dpll.mgr->update_ref_clks(i915); 4415 } 4416 4417 void intel_dpll_readout_hw_state(struct drm_i915_private *i915) 4418 { 4419 int i; 4420 4421 for (i = 0; i < i915->display.dpll.num_shared_dpll; i++) 4422 readout_dpll_hw_state(i915, &i915->display.dpll.shared_dplls[i]); 4423 } 4424 4425 static void sanitize_dpll_state(struct drm_i915_private *i915, 4426 struct intel_shared_dpll *pll) 4427 { 4428 if (!pll->on) 4429 return; 4430 4431 adlp_cmtg_clock_gating_wa(i915, pll); 4432 4433 if (pll->active_mask) 4434 return; 4435 4436 drm_dbg_kms(&i915->drm, 4437 "%s enabled but not in use, disabling\n", 4438 pll->info->name); 4439 4440 pll->info->funcs->disable(i915, pll); 4441 pll->on = false; 4442 } 4443 4444 void intel_dpll_sanitize_state(struct drm_i915_private *i915) 4445 { 4446 int i; 4447 4448 for (i = 0; i < i915->display.dpll.num_shared_dpll; i++) 4449 sanitize_dpll_state(i915, &i915->display.dpll.shared_dplls[i]); 4450 } 4451 4452 /** 4453 * intel_dpll_dump_hw_state - write hw_state to dmesg 4454 * @dev_priv: i915 drm device 4455 * @hw_state: hw state to be written to the log 4456 * 4457 * Write the relevant values in @hw_state to dmesg using drm_dbg_kms. 4458 */ 4459 void intel_dpll_dump_hw_state(struct drm_i915_private *dev_priv, 4460 const struct intel_dpll_hw_state *hw_state) 4461 { 4462 if (dev_priv->display.dpll.mgr) { 4463 dev_priv->display.dpll.mgr->dump_hw_state(dev_priv, hw_state); 4464 } else { 4465 /* fallback for platforms that don't use the shared dpll 4466 * infrastructure 4467 */ 4468 drm_dbg_kms(&dev_priv->drm, 4469 "dpll_hw_state: dpll: 0x%x, dpll_md: 0x%x, " 4470 "fp0: 0x%x, fp1: 0x%x\n", 4471 hw_state->dpll, 4472 hw_state->dpll_md, 4473 hw_state->fp0, 4474 hw_state->fp1); 4475 } 4476 } 4477 4478 static void 4479 verify_single_dpll_state(struct drm_i915_private *dev_priv, 4480 struct intel_shared_dpll *pll, 4481 struct intel_crtc *crtc, 4482 struct intel_crtc_state *new_crtc_state) 4483 { 4484 struct intel_dpll_hw_state dpll_hw_state; 4485 u8 pipe_mask; 4486 bool active; 4487 4488 memset(&dpll_hw_state, 0, sizeof(dpll_hw_state)); 4489 4490 drm_dbg_kms(&dev_priv->drm, "%s\n", pll->info->name); 4491 4492 active = intel_dpll_get_hw_state(dev_priv, pll, &dpll_hw_state); 4493 4494 if (!(pll->info->flags & INTEL_DPLL_ALWAYS_ON)) { 4495 I915_STATE_WARN(!pll->on && pll->active_mask, 4496 "pll in active use but not on in sw tracking\n"); 4497 I915_STATE_WARN(pll->on && !pll->active_mask, 4498 "pll is on but not used by any active pipe\n"); 4499 I915_STATE_WARN(pll->on != active, 4500 "pll on state mismatch (expected %i, found %i)\n", 4501 pll->on, active); 4502 } 4503 4504 if (!crtc) { 4505 I915_STATE_WARN(pll->active_mask & ~pll->state.pipe_mask, 4506 "more active pll users than references: 0x%x vs 0x%x\n", 4507 pll->active_mask, pll->state.pipe_mask); 4508 4509 return; 4510 } 4511 4512 pipe_mask = BIT(crtc->pipe); 4513 4514 if (new_crtc_state->hw.active) 4515 I915_STATE_WARN(!(pll->active_mask & pipe_mask), 4516 "pll active mismatch (expected pipe %c in active mask 0x%x)\n", 4517 pipe_name(crtc->pipe), pll->active_mask); 4518 else 4519 I915_STATE_WARN(pll->active_mask & pipe_mask, 4520 "pll active mismatch (didn't expect pipe %c in active mask 0x%x)\n", 4521 pipe_name(crtc->pipe), pll->active_mask); 4522 4523 I915_STATE_WARN(!(pll->state.pipe_mask & pipe_mask), 4524 "pll enabled crtcs mismatch (expected 0x%x in 0x%x)\n", 4525 pipe_mask, pll->state.pipe_mask); 4526 4527 I915_STATE_WARN(pll->on && memcmp(&pll->state.hw_state, 4528 &dpll_hw_state, 4529 sizeof(dpll_hw_state)), 4530 "pll hw state mismatch\n"); 4531 } 4532 4533 void intel_shared_dpll_state_verify(struct intel_crtc *crtc, 4534 struct intel_crtc_state *old_crtc_state, 4535 struct intel_crtc_state *new_crtc_state) 4536 { 4537 struct drm_i915_private *dev_priv = to_i915(crtc->base.dev); 4538 4539 if (new_crtc_state->shared_dpll) 4540 verify_single_dpll_state(dev_priv, new_crtc_state->shared_dpll, 4541 crtc, new_crtc_state); 4542 4543 if (old_crtc_state->shared_dpll && 4544 old_crtc_state->shared_dpll != new_crtc_state->shared_dpll) { 4545 u8 pipe_mask = BIT(crtc->pipe); 4546 struct intel_shared_dpll *pll = old_crtc_state->shared_dpll; 4547 4548 I915_STATE_WARN(pll->active_mask & pipe_mask, 4549 "pll active mismatch (didn't expect pipe %c in active mask (0x%x))\n", 4550 pipe_name(crtc->pipe), pll->active_mask); 4551 I915_STATE_WARN(pll->state.pipe_mask & pipe_mask, 4552 "pll enabled crtcs mismatch (found %x in enabled mask (0x%x))\n", 4553 pipe_name(crtc->pipe), pll->state.pipe_mask); 4554 } 4555 } 4556 4557 void intel_shared_dpll_verify_disabled(struct drm_i915_private *i915) 4558 { 4559 int i; 4560 4561 for (i = 0; i < i915->display.dpll.num_shared_dpll; i++) 4562 verify_single_dpll_state(i915, &i915->display.dpll.shared_dplls[i], 4563 NULL, NULL); 4564 } 4565