1 // SPDX-License-Identifier: MIT 2 /* 3 * Copyright © 2021 Intel Corporation 4 */ 5 6 #include <drm/drm_print.h> 7 8 #include "g4x_dp.h" 9 #include "i915_reg.h" 10 #include "intel_crt.h" 11 #include "intel_crt_regs.h" 12 #include "intel_de.h" 13 #include "intel_display_types.h" 14 #include "intel_dpll.h" 15 #include "intel_fdi.h" 16 #include "intel_fdi_regs.h" 17 #include "intel_lvds.h" 18 #include "intel_lvds_regs.h" 19 #include "intel_pch_display.h" 20 #include "intel_pch_refclk.h" 21 #include "intel_pps.h" 22 #include "intel_sdvo.h" 23 24 bool intel_has_pch_trancoder(struct intel_display *display, 25 enum pipe pch_transcoder) 26 { 27 return HAS_PCH_IBX(display) || HAS_PCH_CPT(display) || 28 (HAS_PCH_LPT_H(display) && pch_transcoder == PIPE_A); 29 } 30 31 enum pipe intel_crtc_pch_transcoder(struct intel_crtc *crtc) 32 { 33 struct intel_display *display = to_intel_display(crtc); 34 35 if (HAS_PCH_LPT(display)) 36 return PIPE_A; 37 else 38 return crtc->pipe; 39 } 40 41 static void assert_pch_dp_disabled(struct intel_display *display, 42 enum pipe pipe, enum port port, 43 i915_reg_t dp_reg) 44 { 45 enum pipe port_pipe; 46 bool state; 47 48 state = g4x_dp_port_enabled(display, dp_reg, port, &port_pipe); 49 50 INTEL_DISPLAY_STATE_WARN(display, state && port_pipe == pipe, 51 "PCH DP %c enabled on transcoder %c, should be disabled\n", 52 port_name(port), pipe_name(pipe)); 53 54 INTEL_DISPLAY_STATE_WARN(display, 55 HAS_PCH_IBX(display) && !state && port_pipe == PIPE_B, 56 "IBX PCH DP %c still using transcoder B\n", 57 port_name(port)); 58 } 59 60 static void assert_pch_hdmi_disabled(struct intel_display *display, 61 enum pipe pipe, enum port port, 62 i915_reg_t hdmi_reg) 63 { 64 enum pipe port_pipe; 65 bool state; 66 67 state = intel_sdvo_port_enabled(display, hdmi_reg, &port_pipe); 68 69 INTEL_DISPLAY_STATE_WARN(display, state && port_pipe == pipe, 70 "PCH HDMI %c enabled on transcoder %c, should be disabled\n", 71 port_name(port), pipe_name(pipe)); 72 73 INTEL_DISPLAY_STATE_WARN(display, 74 HAS_PCH_IBX(display) && !state && port_pipe == PIPE_B, 75 "IBX PCH HDMI %c still using transcoder B\n", 76 port_name(port)); 77 } 78 79 static void assert_pch_ports_disabled(struct intel_display *display, 80 enum pipe pipe) 81 { 82 enum pipe port_pipe; 83 84 assert_pch_dp_disabled(display, pipe, PORT_B, PCH_DP_B); 85 assert_pch_dp_disabled(display, pipe, PORT_C, PCH_DP_C); 86 assert_pch_dp_disabled(display, pipe, PORT_D, PCH_DP_D); 87 88 INTEL_DISPLAY_STATE_WARN(display, 89 intel_crt_port_enabled(display, PCH_ADPA, &port_pipe) && port_pipe == pipe, 90 "PCH VGA enabled on transcoder %c, should be disabled\n", 91 pipe_name(pipe)); 92 93 INTEL_DISPLAY_STATE_WARN(display, 94 intel_lvds_port_enabled(display, PCH_LVDS, &port_pipe) && port_pipe == pipe, 95 "PCH LVDS enabled on transcoder %c, should be disabled\n", 96 pipe_name(pipe)); 97 98 /* PCH SDVOB multiplex with HDMIB */ 99 assert_pch_hdmi_disabled(display, pipe, PORT_B, PCH_HDMIB); 100 assert_pch_hdmi_disabled(display, pipe, PORT_C, PCH_HDMIC); 101 assert_pch_hdmi_disabled(display, pipe, PORT_D, PCH_HDMID); 102 } 103 104 static void assert_pch_transcoder_disabled(struct intel_display *display, 105 enum pipe pipe) 106 { 107 u32 val; 108 bool enabled; 109 110 val = intel_de_read(display, PCH_TRANSCONF(pipe)); 111 enabled = !!(val & TRANS_ENABLE); 112 INTEL_DISPLAY_STATE_WARN(display, enabled, 113 "transcoder assertion failed, should be off on pipe %c but is still active\n", 114 pipe_name(pipe)); 115 } 116 117 static void ibx_sanitize_pch_hdmi_port(struct intel_display *display, 118 enum port port, i915_reg_t hdmi_reg) 119 { 120 u32 val = intel_de_read(display, hdmi_reg); 121 122 if (val & SDVO_ENABLE || 123 (val & SDVO_PIPE_SEL_MASK) == SDVO_PIPE_SEL(PIPE_A)) 124 return; 125 126 drm_dbg_kms(display->drm, 127 "Sanitizing transcoder select for HDMI %c\n", 128 port_name(port)); 129 130 val &= ~SDVO_PIPE_SEL_MASK; 131 val |= SDVO_PIPE_SEL(PIPE_A); 132 133 intel_de_write(display, hdmi_reg, val); 134 } 135 136 static void ibx_sanitize_pch_dp_port(struct intel_display *display, 137 enum port port, i915_reg_t dp_reg) 138 { 139 u32 val = intel_de_read(display, dp_reg); 140 141 if (val & DP_PORT_EN || 142 (val & DP_PIPE_SEL_MASK) == DP_PIPE_SEL(PIPE_A)) 143 return; 144 145 drm_dbg_kms(display->drm, 146 "Sanitizing transcoder select for DP %c\n", 147 port_name(port)); 148 149 val &= ~DP_PIPE_SEL_MASK; 150 val |= DP_PIPE_SEL(PIPE_A); 151 152 intel_de_write(display, dp_reg, val); 153 } 154 155 static void ibx_sanitize_pch_ports(struct intel_display *display) 156 { 157 /* 158 * The BIOS may select transcoder B on some of the PCH 159 * ports even it doesn't enable the port. This would trip 160 * assert_pch_dp_disabled() and assert_pch_hdmi_disabled(). 161 * Sanitize the transcoder select bits to prevent that. We 162 * assume that the BIOS never actually enabled the port, 163 * because if it did we'd actually have to toggle the port 164 * on and back off to make the transcoder A select stick 165 * (see. intel_dp_link_down(), intel_disable_hdmi(), 166 * intel_disable_sdvo()). 167 */ 168 ibx_sanitize_pch_dp_port(display, PORT_B, PCH_DP_B); 169 ibx_sanitize_pch_dp_port(display, PORT_C, PCH_DP_C); 170 ibx_sanitize_pch_dp_port(display, PORT_D, PCH_DP_D); 171 172 /* PCH SDVOB multiplex with HDMIB */ 173 ibx_sanitize_pch_hdmi_port(display, PORT_B, PCH_HDMIB); 174 ibx_sanitize_pch_hdmi_port(display, PORT_C, PCH_HDMIC); 175 ibx_sanitize_pch_hdmi_port(display, PORT_D, PCH_HDMID); 176 } 177 178 static void intel_pch_transcoder_set_m1_n1(struct intel_crtc *crtc, 179 const struct intel_link_m_n *m_n) 180 { 181 struct intel_display *display = to_intel_display(crtc); 182 enum pipe pipe = crtc->pipe; 183 184 intel_set_m_n(display, m_n, 185 PCH_TRANS_DATA_M1(pipe), PCH_TRANS_DATA_N1(pipe), 186 PCH_TRANS_LINK_M1(pipe), PCH_TRANS_LINK_N1(pipe)); 187 } 188 189 static void intel_pch_transcoder_set_m2_n2(struct intel_crtc *crtc, 190 const struct intel_link_m_n *m_n) 191 { 192 struct intel_display *display = to_intel_display(crtc); 193 enum pipe pipe = crtc->pipe; 194 195 intel_set_m_n(display, m_n, 196 PCH_TRANS_DATA_M2(pipe), PCH_TRANS_DATA_N2(pipe), 197 PCH_TRANS_LINK_M2(pipe), PCH_TRANS_LINK_N2(pipe)); 198 } 199 200 void intel_pch_transcoder_get_m1_n1(struct intel_crtc *crtc, 201 struct intel_link_m_n *m_n) 202 { 203 struct intel_display *display = to_intel_display(crtc); 204 enum pipe pipe = crtc->pipe; 205 206 intel_get_m_n(display, m_n, 207 PCH_TRANS_DATA_M1(pipe), PCH_TRANS_DATA_N1(pipe), 208 PCH_TRANS_LINK_M1(pipe), PCH_TRANS_LINK_N1(pipe)); 209 } 210 211 void intel_pch_transcoder_get_m2_n2(struct intel_crtc *crtc, 212 struct intel_link_m_n *m_n) 213 { 214 struct intel_display *display = to_intel_display(crtc); 215 enum pipe pipe = crtc->pipe; 216 217 intel_get_m_n(display, m_n, 218 PCH_TRANS_DATA_M2(pipe), PCH_TRANS_DATA_N2(pipe), 219 PCH_TRANS_LINK_M2(pipe), PCH_TRANS_LINK_N2(pipe)); 220 } 221 222 static void ilk_pch_transcoder_set_timings(const struct intel_crtc_state *crtc_state, 223 enum pipe pch_transcoder) 224 { 225 struct intel_display *display = to_intel_display(crtc_state); 226 enum transcoder cpu_transcoder = crtc_state->cpu_transcoder; 227 228 intel_de_write(display, PCH_TRANS_HTOTAL(pch_transcoder), 229 intel_de_read(display, TRANS_HTOTAL(display, cpu_transcoder))); 230 intel_de_write(display, PCH_TRANS_HBLANK(pch_transcoder), 231 intel_de_read(display, TRANS_HBLANK(display, cpu_transcoder))); 232 intel_de_write(display, PCH_TRANS_HSYNC(pch_transcoder), 233 intel_de_read(display, TRANS_HSYNC(display, cpu_transcoder))); 234 235 intel_de_write(display, PCH_TRANS_VTOTAL(pch_transcoder), 236 intel_de_read(display, TRANS_VTOTAL(display, cpu_transcoder))); 237 intel_de_write(display, PCH_TRANS_VBLANK(pch_transcoder), 238 intel_de_read(display, TRANS_VBLANK(display, cpu_transcoder))); 239 intel_de_write(display, PCH_TRANS_VSYNC(pch_transcoder), 240 intel_de_read(display, TRANS_VSYNC(display, cpu_transcoder))); 241 intel_de_write(display, PCH_TRANS_VSYNCSHIFT(pch_transcoder), 242 intel_de_read(display, TRANS_VSYNCSHIFT(display, cpu_transcoder))); 243 } 244 245 static void ilk_enable_pch_transcoder(const struct intel_crtc_state *crtc_state) 246 { 247 struct intel_display *display = to_intel_display(crtc_state); 248 struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc); 249 enum pipe pipe = crtc->pipe; 250 i915_reg_t reg; 251 u32 val, pipeconf_val; 252 253 /* Make sure PCH DPLL is enabled */ 254 assert_shared_dpll_enabled(display, crtc_state->shared_dpll); 255 256 /* FDI must be feeding us bits for PCH ports */ 257 assert_fdi_tx_enabled(display, pipe); 258 assert_fdi_rx_enabled(display, pipe); 259 260 if (HAS_PCH_CPT(display)) { 261 reg = TRANS_CHICKEN2(pipe); 262 val = intel_de_read(display, reg); 263 /* 264 * Workaround: Set the timing override bit 265 * before enabling the pch transcoder. 266 */ 267 val |= TRANS_CHICKEN2_TIMING_OVERRIDE; 268 /* Configure frame start delay to match the CPU */ 269 val &= ~TRANS_CHICKEN2_FRAME_START_DELAY_MASK; 270 val |= TRANS_CHICKEN2_FRAME_START_DELAY(crtc_state->framestart_delay - 1); 271 intel_de_write(display, reg, val); 272 } 273 274 reg = PCH_TRANSCONF(pipe); 275 val = intel_de_read(display, reg); 276 pipeconf_val = intel_de_read(display, TRANSCONF(display, pipe)); 277 278 if (HAS_PCH_IBX(display)) { 279 /* Configure frame start delay to match the CPU */ 280 val &= ~TRANS_FRAME_START_DELAY_MASK; 281 val |= TRANS_FRAME_START_DELAY(crtc_state->framestart_delay - 1); 282 283 /* 284 * Make the BPC in transcoder be consistent with 285 * that in pipeconf reg. For HDMI we must use 8bpc 286 * here for both 8bpc and 12bpc. 287 */ 288 val &= ~TRANSCONF_BPC_MASK; 289 if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_HDMI)) 290 val |= TRANSCONF_BPC_8; 291 else 292 val |= pipeconf_val & TRANSCONF_BPC_MASK; 293 } 294 295 val &= ~TRANS_INTERLACE_MASK; 296 if ((pipeconf_val & TRANSCONF_INTERLACE_MASK_ILK) == TRANSCONF_INTERLACE_IF_ID_ILK) { 297 if (HAS_PCH_IBX(display) && 298 intel_crtc_has_type(crtc_state, INTEL_OUTPUT_SDVO)) 299 val |= TRANS_INTERLACE_LEGACY_VSYNC_IBX; 300 else 301 val |= TRANS_INTERLACE_INTERLACED; 302 } else { 303 val |= TRANS_INTERLACE_PROGRESSIVE; 304 } 305 306 intel_de_write(display, reg, val | TRANS_ENABLE); 307 if (intel_de_wait_for_set(display, reg, TRANS_STATE_ENABLE, 100)) 308 drm_err(display->drm, "failed to enable transcoder %c\n", 309 pipe_name(pipe)); 310 } 311 312 static void ilk_disable_pch_transcoder(struct intel_crtc *crtc) 313 { 314 struct intel_display *display = to_intel_display(crtc); 315 enum pipe pipe = crtc->pipe; 316 i915_reg_t reg; 317 318 /* FDI relies on the transcoder */ 319 assert_fdi_tx_disabled(display, pipe); 320 assert_fdi_rx_disabled(display, pipe); 321 322 /* Ports must be off as well */ 323 assert_pch_ports_disabled(display, pipe); 324 325 reg = PCH_TRANSCONF(pipe); 326 intel_de_rmw(display, reg, TRANS_ENABLE, 0); 327 /* wait for PCH transcoder off, transcoder state */ 328 if (intel_de_wait_for_clear(display, reg, TRANS_STATE_ENABLE, 50)) 329 drm_err(display->drm, "failed to disable transcoder %c\n", 330 pipe_name(pipe)); 331 332 if (HAS_PCH_CPT(display)) 333 /* Workaround: Clear the timing override chicken bit again. */ 334 intel_de_rmw(display, TRANS_CHICKEN2(pipe), 335 TRANS_CHICKEN2_TIMING_OVERRIDE, 0); 336 } 337 338 void ilk_pch_pre_enable(struct intel_atomic_state *state, 339 struct intel_crtc *crtc) 340 { 341 const struct intel_crtc_state *crtc_state = 342 intel_atomic_get_new_crtc_state(state, crtc); 343 344 /* 345 * Note: FDI PLL enabling _must_ be done before we enable the 346 * cpu pipes, hence this is separate from all the other fdi/pch 347 * enabling. 348 */ 349 ilk_fdi_pll_enable(crtc_state); 350 } 351 352 /* 353 * Enable PCH resources required for PCH ports: 354 * - PCH PLLs 355 * - FDI training & RX/TX 356 * - update transcoder timings 357 * - DP transcoding bits 358 * - transcoder 359 */ 360 void ilk_pch_enable(struct intel_atomic_state *state, 361 struct intel_crtc *crtc) 362 { 363 struct intel_display *display = to_intel_display(crtc); 364 const struct intel_crtc_state *crtc_state = 365 intel_atomic_get_new_crtc_state(state, crtc); 366 enum pipe pipe = crtc->pipe; 367 u32 temp; 368 369 assert_pch_transcoder_disabled(display, pipe); 370 371 /* For PCH output, training FDI link */ 372 intel_fdi_link_train(crtc, crtc_state); 373 374 /* 375 * We need to program the right clock selection 376 * before writing the pixel multiplier into the DPLL. 377 */ 378 if (HAS_PCH_CPT(display)) { 379 u32 sel; 380 381 temp = intel_de_read(display, PCH_DPLL_SEL); 382 temp |= TRANS_DPLL_ENABLE(pipe); 383 sel = TRANS_DPLLB_SEL(pipe); 384 if (crtc_state->shared_dpll == 385 intel_get_shared_dpll_by_id(display, DPLL_ID_PCH_PLL_B)) 386 temp |= sel; 387 else 388 temp &= ~sel; 389 intel_de_write(display, PCH_DPLL_SEL, temp); 390 } 391 392 /* 393 * XXX: pch pll's can be enabled any time before we enable the PCH 394 * transcoder, and we actually should do this to not upset any PCH 395 * transcoder that already use the clock when we share it. 396 * 397 * Note that enable_shared_dpll tries to do the right thing, but 398 * get_shared_dpll unconditionally resets the pll - we need that 399 * to have the right LVDS enable sequence. 400 */ 401 intel_enable_shared_dpll(crtc_state); 402 403 /* set transcoder timing, panel must allow it */ 404 assert_pps_unlocked(display, pipe); 405 if (intel_crtc_has_dp_encoder(crtc_state)) { 406 intel_pch_transcoder_set_m1_n1(crtc, &crtc_state->dp_m_n); 407 intel_pch_transcoder_set_m2_n2(crtc, &crtc_state->dp_m2_n2); 408 } 409 ilk_pch_transcoder_set_timings(crtc_state, pipe); 410 411 intel_fdi_normal_train(crtc); 412 413 /* For PCH DP, enable TRANS_DP_CTL */ 414 if (HAS_PCH_CPT(display) && 415 intel_crtc_has_dp_encoder(crtc_state)) { 416 const struct drm_display_mode *adjusted_mode = 417 &crtc_state->hw.adjusted_mode; 418 u32 bpc = (intel_de_read(display, TRANSCONF(display, pipe)) 419 & TRANSCONF_BPC_MASK) >> 5; 420 i915_reg_t reg = TRANS_DP_CTL(pipe); 421 enum port port; 422 423 temp = intel_de_read(display, reg); 424 temp &= ~(TRANS_DP_PORT_SEL_MASK | 425 TRANS_DP_VSYNC_ACTIVE_HIGH | 426 TRANS_DP_HSYNC_ACTIVE_HIGH | 427 TRANS_DP_BPC_MASK); 428 temp |= TRANS_DP_OUTPUT_ENABLE; 429 temp |= bpc << 9; /* same format but at 11:9 */ 430 431 if (adjusted_mode->flags & DRM_MODE_FLAG_PHSYNC) 432 temp |= TRANS_DP_HSYNC_ACTIVE_HIGH; 433 if (adjusted_mode->flags & DRM_MODE_FLAG_PVSYNC) 434 temp |= TRANS_DP_VSYNC_ACTIVE_HIGH; 435 436 port = intel_get_crtc_new_encoder(state, crtc_state)->port; 437 drm_WARN_ON(display->drm, port < PORT_B || port > PORT_D); 438 temp |= TRANS_DP_PORT_SEL(port); 439 440 intel_de_write(display, reg, temp); 441 } 442 443 ilk_enable_pch_transcoder(crtc_state); 444 } 445 446 void ilk_pch_disable(struct intel_atomic_state *state, 447 struct intel_crtc *crtc) 448 { 449 ilk_fdi_disable(crtc); 450 } 451 452 void ilk_pch_post_disable(struct intel_atomic_state *state, 453 struct intel_crtc *crtc) 454 { 455 struct intel_display *display = to_intel_display(crtc); 456 const struct intel_crtc_state *old_crtc_state = 457 intel_atomic_get_old_crtc_state(state, crtc); 458 enum pipe pipe = crtc->pipe; 459 460 ilk_disable_pch_transcoder(crtc); 461 462 if (HAS_PCH_CPT(display)) { 463 /* disable TRANS_DP_CTL */ 464 intel_de_rmw(display, TRANS_DP_CTL(pipe), 465 TRANS_DP_OUTPUT_ENABLE | TRANS_DP_PORT_SEL_MASK, 466 TRANS_DP_PORT_SEL_NONE); 467 468 /* disable DPLL_SEL */ 469 intel_de_rmw(display, PCH_DPLL_SEL, 470 TRANS_DPLL_ENABLE(pipe) | TRANS_DPLLB_SEL(pipe), 0); 471 } 472 473 ilk_fdi_pll_disable(crtc); 474 475 intel_disable_shared_dpll(old_crtc_state); 476 } 477 478 static void ilk_pch_clock_get(struct intel_crtc_state *crtc_state) 479 { 480 struct intel_display *display = to_intel_display(crtc_state); 481 482 /* read out port_clock from the DPLL */ 483 i9xx_crtc_clock_get(crtc_state); 484 485 /* 486 * In case there is an active pipe without active ports, 487 * we may need some idea for the dotclock anyway. 488 * Calculate one based on the FDI configuration. 489 */ 490 crtc_state->hw.adjusted_mode.crtc_clock = 491 intel_dotclock_calculate(intel_fdi_link_freq(display, crtc_state), 492 &crtc_state->fdi_m_n); 493 } 494 495 void ilk_pch_get_config(struct intel_crtc_state *crtc_state) 496 { 497 struct intel_display *display = to_intel_display(crtc_state); 498 struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc); 499 struct intel_shared_dpll *pll; 500 enum pipe pipe = crtc->pipe; 501 enum intel_dpll_id pll_id; 502 bool pll_active; 503 u32 tmp; 504 505 if ((intel_de_read(display, PCH_TRANSCONF(pipe)) & TRANS_ENABLE) == 0) 506 return; 507 508 crtc_state->has_pch_encoder = true; 509 510 tmp = intel_de_read(display, FDI_RX_CTL(pipe)); 511 crtc_state->fdi_lanes = ((FDI_DP_PORT_WIDTH_MASK & tmp) >> 512 FDI_DP_PORT_WIDTH_SHIFT) + 1; 513 514 intel_cpu_transcoder_get_m1_n1(crtc, crtc_state->cpu_transcoder, 515 &crtc_state->fdi_m_n); 516 517 if (HAS_PCH_IBX(display)) { 518 /* 519 * The pipe->pch transcoder and pch transcoder->pll 520 * mapping is fixed. 521 */ 522 pll_id = (enum intel_dpll_id) pipe; 523 } else { 524 tmp = intel_de_read(display, PCH_DPLL_SEL); 525 if (tmp & TRANS_DPLLB_SEL(pipe)) 526 pll_id = DPLL_ID_PCH_PLL_B; 527 else 528 pll_id = DPLL_ID_PCH_PLL_A; 529 } 530 531 crtc_state->shared_dpll = intel_get_shared_dpll_by_id(display, pll_id); 532 pll = crtc_state->shared_dpll; 533 534 pll_active = intel_dpll_get_hw_state(display, pll, 535 &crtc_state->dpll_hw_state); 536 drm_WARN_ON(display->drm, !pll_active); 537 538 tmp = crtc_state->dpll_hw_state.i9xx.dpll; 539 crtc_state->pixel_multiplier = 540 ((tmp & PLL_REF_SDVO_HDMI_MULTIPLIER_MASK) 541 >> PLL_REF_SDVO_HDMI_MULTIPLIER_SHIFT) + 1; 542 543 ilk_pch_clock_get(crtc_state); 544 } 545 546 static void lpt_enable_pch_transcoder(const struct intel_crtc_state *crtc_state) 547 { 548 struct intel_display *display = to_intel_display(crtc_state); 549 enum transcoder cpu_transcoder = crtc_state->cpu_transcoder; 550 u32 val, pipeconf_val; 551 552 /* FDI must be feeding us bits for PCH ports */ 553 assert_fdi_tx_enabled(display, (enum pipe)cpu_transcoder); 554 assert_fdi_rx_enabled(display, PIPE_A); 555 556 val = intel_de_read(display, TRANS_CHICKEN2(PIPE_A)); 557 /* Workaround: set timing override bit. */ 558 val |= TRANS_CHICKEN2_TIMING_OVERRIDE; 559 /* Configure frame start delay to match the CPU */ 560 val &= ~TRANS_CHICKEN2_FRAME_START_DELAY_MASK; 561 val |= TRANS_CHICKEN2_FRAME_START_DELAY(crtc_state->framestart_delay - 1); 562 intel_de_write(display, TRANS_CHICKEN2(PIPE_A), val); 563 564 val = TRANS_ENABLE; 565 pipeconf_val = intel_de_read(display, 566 TRANSCONF(display, cpu_transcoder)); 567 568 if ((pipeconf_val & TRANSCONF_INTERLACE_MASK_HSW) == TRANSCONF_INTERLACE_IF_ID_ILK) 569 val |= TRANS_INTERLACE_INTERLACED; 570 else 571 val |= TRANS_INTERLACE_PROGRESSIVE; 572 573 intel_de_write(display, LPT_TRANSCONF, val); 574 if (intel_de_wait_for_set(display, LPT_TRANSCONF, 575 TRANS_STATE_ENABLE, 100)) 576 drm_err(display->drm, "Failed to enable PCH transcoder\n"); 577 } 578 579 static void lpt_disable_pch_transcoder(struct intel_display *display) 580 { 581 intel_de_rmw(display, LPT_TRANSCONF, TRANS_ENABLE, 0); 582 /* wait for PCH transcoder off, transcoder state */ 583 if (intel_de_wait_for_clear(display, LPT_TRANSCONF, 584 TRANS_STATE_ENABLE, 50)) 585 drm_err(display->drm, "Failed to disable PCH transcoder\n"); 586 587 /* Workaround: clear timing override bit. */ 588 intel_de_rmw(display, TRANS_CHICKEN2(PIPE_A), TRANS_CHICKEN2_TIMING_OVERRIDE, 0); 589 } 590 591 void lpt_pch_enable(struct intel_atomic_state *state, 592 struct intel_crtc *crtc) 593 { 594 struct intel_display *display = to_intel_display(crtc); 595 const struct intel_crtc_state *crtc_state = 596 intel_atomic_get_new_crtc_state(state, crtc); 597 598 assert_pch_transcoder_disabled(display, PIPE_A); 599 600 lpt_program_iclkip(crtc_state); 601 602 /* Set transcoder timing. */ 603 ilk_pch_transcoder_set_timings(crtc_state, PIPE_A); 604 605 lpt_enable_pch_transcoder(crtc_state); 606 } 607 608 void lpt_pch_disable(struct intel_atomic_state *state, 609 struct intel_crtc *crtc) 610 { 611 struct intel_display *display = to_intel_display(crtc); 612 613 lpt_disable_pch_transcoder(display); 614 615 lpt_disable_iclkip(display); 616 } 617 618 void lpt_pch_get_config(struct intel_crtc_state *crtc_state) 619 { 620 struct intel_display *display = to_intel_display(crtc_state); 621 struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc); 622 u32 tmp; 623 624 if ((intel_de_read(display, LPT_TRANSCONF) & TRANS_ENABLE) == 0) 625 return; 626 627 crtc_state->has_pch_encoder = true; 628 629 tmp = intel_de_read(display, FDI_RX_CTL(PIPE_A)); 630 crtc_state->fdi_lanes = ((FDI_DP_PORT_WIDTH_MASK & tmp) >> 631 FDI_DP_PORT_WIDTH_SHIFT) + 1; 632 633 intel_cpu_transcoder_get_m1_n1(crtc, crtc_state->cpu_transcoder, 634 &crtc_state->fdi_m_n); 635 636 crtc_state->hw.adjusted_mode.crtc_clock = lpt_get_iclkip(display); 637 } 638 639 void intel_pch_sanitize(struct intel_display *display) 640 { 641 if (HAS_PCH_IBX(display)) 642 ibx_sanitize_pch_ports(display); 643 } 644