xref: /linux/drivers/gpu/drm/i915/display/intel_pch_display.c (revision e78f70bad29c5ae1e1076698b690b15794e9b81e)
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