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