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