xref: /openbsd/sys/dev/pci/drm/i915/display/g4x_hdmi.c (revision f005ef32)
1 // SPDX-License-Identifier: MIT
2 /*
3  * Copyright © 2020 Intel Corporation
4  *
5  * HDMI support for G4x,ILK,SNB,IVB,VLV,CHV (HSW+ handled by the DDI code).
6  */
7 
8 #include "g4x_hdmi.h"
9 #include "i915_reg.h"
10 #include "intel_atomic.h"
11 #include "intel_audio.h"
12 #include "intel_connector.h"
13 #include "intel_crtc.h"
14 #include "intel_de.h"
15 #include "intel_display_power.h"
16 #include "intel_display_types.h"
17 #include "intel_dp_aux.h"
18 #include "intel_dpio_phy.h"
19 #include "intel_fifo_underrun.h"
20 #include "intel_hdmi.h"
21 #include "intel_hotplug.h"
22 #include "intel_sdvo.h"
23 #include "vlv_sideband.h"
24 
intel_hdmi_prepare(struct intel_encoder * encoder,const struct intel_crtc_state * crtc_state)25 static void intel_hdmi_prepare(struct intel_encoder *encoder,
26 			       const struct intel_crtc_state *crtc_state)
27 {
28 	struct drm_device *dev = encoder->base.dev;
29 	struct drm_i915_private *dev_priv = to_i915(dev);
30 	struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
31 	struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(encoder);
32 	const struct drm_display_mode *adjusted_mode = &crtc_state->hw.adjusted_mode;
33 	u32 hdmi_val;
34 
35 	intel_dp_dual_mode_set_tmds_output(intel_hdmi, true);
36 
37 	hdmi_val = SDVO_ENCODING_HDMI;
38 	if (!HAS_PCH_SPLIT(dev_priv) && crtc_state->limited_color_range)
39 		hdmi_val |= HDMI_COLOR_RANGE_16_235;
40 	if (adjusted_mode->flags & DRM_MODE_FLAG_PVSYNC)
41 		hdmi_val |= SDVO_VSYNC_ACTIVE_HIGH;
42 	if (adjusted_mode->flags & DRM_MODE_FLAG_PHSYNC)
43 		hdmi_val |= SDVO_HSYNC_ACTIVE_HIGH;
44 
45 	if (crtc_state->pipe_bpp > 24)
46 		hdmi_val |= HDMI_COLOR_FORMAT_12bpc;
47 	else
48 		hdmi_val |= SDVO_COLOR_FORMAT_8bpc;
49 
50 	if (crtc_state->has_hdmi_sink)
51 		hdmi_val |= HDMI_MODE_SELECT_HDMI;
52 
53 	if (HAS_PCH_CPT(dev_priv))
54 		hdmi_val |= SDVO_PIPE_SEL_CPT(crtc->pipe);
55 	else if (IS_CHERRYVIEW(dev_priv))
56 		hdmi_val |= SDVO_PIPE_SEL_CHV(crtc->pipe);
57 	else
58 		hdmi_val |= SDVO_PIPE_SEL(crtc->pipe);
59 
60 	intel_de_write(dev_priv, intel_hdmi->hdmi_reg, hdmi_val);
61 	intel_de_posting_read(dev_priv, intel_hdmi->hdmi_reg);
62 }
63 
intel_hdmi_get_hw_state(struct intel_encoder * encoder,enum pipe * pipe)64 static bool intel_hdmi_get_hw_state(struct intel_encoder *encoder,
65 				    enum pipe *pipe)
66 {
67 	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
68 	struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(encoder);
69 	intel_wakeref_t wakeref;
70 	bool ret;
71 
72 	wakeref = intel_display_power_get_if_enabled(dev_priv,
73 						     encoder->power_domain);
74 	if (!wakeref)
75 		return false;
76 
77 	ret = intel_sdvo_port_enabled(dev_priv, intel_hdmi->hdmi_reg, pipe);
78 
79 	intel_display_power_put(dev_priv, encoder->power_domain, wakeref);
80 
81 	return ret;
82 }
83 
connector_is_hdmi(struct drm_connector * connector)84 static bool connector_is_hdmi(struct drm_connector *connector)
85 {
86 	struct intel_encoder *encoder =
87 		intel_attached_encoder(to_intel_connector(connector));
88 
89 	return encoder && encoder->type == INTEL_OUTPUT_HDMI;
90 }
91 
g4x_compute_has_hdmi_sink(struct intel_atomic_state * state,struct intel_crtc * this_crtc)92 static bool g4x_compute_has_hdmi_sink(struct intel_atomic_state *state,
93 				      struct intel_crtc *this_crtc)
94 {
95 	const struct drm_connector_state *conn_state;
96 	struct drm_connector *connector;
97 	int i;
98 
99 	/*
100 	 * On g4x only one HDMI port can transmit infoframes/audio at
101 	 * any given time. Select the first suitable port for this duty.
102 	 *
103 	 * See also g4x_hdmi_connector_atomic_check().
104 	 */
105 	for_each_new_connector_in_state(&state->base, connector, conn_state, i) {
106 		struct intel_encoder *encoder = to_intel_encoder(conn_state->best_encoder);
107 		const struct intel_crtc_state *crtc_state;
108 		struct intel_crtc *crtc;
109 
110 		if (!connector_is_hdmi(connector))
111 			continue;
112 
113 		crtc = to_intel_crtc(conn_state->crtc);
114 		if (!crtc)
115 			continue;
116 
117 		crtc_state = intel_atomic_get_new_crtc_state(state, crtc);
118 
119 		if (!intel_hdmi_compute_has_hdmi_sink(encoder, crtc_state, conn_state))
120 			continue;
121 
122 		return crtc == this_crtc;
123 	}
124 
125 	return false;
126 }
127 
g4x_hdmi_compute_config(struct intel_encoder * encoder,struct intel_crtc_state * crtc_state,struct drm_connector_state * conn_state)128 static int g4x_hdmi_compute_config(struct intel_encoder *encoder,
129 				   struct intel_crtc_state *crtc_state,
130 				   struct drm_connector_state *conn_state)
131 {
132 	struct intel_atomic_state *state = to_intel_atomic_state(crtc_state->uapi.state);
133 	struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
134 	struct drm_i915_private *i915 = to_i915(encoder->base.dev);
135 
136 	if (HAS_PCH_SPLIT(i915))
137 		crtc_state->has_pch_encoder = true;
138 
139 	if (IS_G4X(i915))
140 		crtc_state->has_hdmi_sink = g4x_compute_has_hdmi_sink(state, crtc);
141 	else
142 		crtc_state->has_hdmi_sink =
143 			intel_hdmi_compute_has_hdmi_sink(encoder, crtc_state, conn_state);
144 
145 	return intel_hdmi_compute_config(encoder, crtc_state, conn_state);
146 }
147 
intel_hdmi_get_config(struct intel_encoder * encoder,struct intel_crtc_state * pipe_config)148 static void intel_hdmi_get_config(struct intel_encoder *encoder,
149 				  struct intel_crtc_state *pipe_config)
150 {
151 	struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(encoder);
152 	struct drm_device *dev = encoder->base.dev;
153 	struct drm_i915_private *dev_priv = to_i915(dev);
154 	u32 tmp, flags = 0;
155 	int dotclock;
156 
157 	pipe_config->output_types |= BIT(INTEL_OUTPUT_HDMI);
158 
159 	tmp = intel_de_read(dev_priv, intel_hdmi->hdmi_reg);
160 
161 	if (tmp & SDVO_HSYNC_ACTIVE_HIGH)
162 		flags |= DRM_MODE_FLAG_PHSYNC;
163 	else
164 		flags |= DRM_MODE_FLAG_NHSYNC;
165 
166 	if (tmp & SDVO_VSYNC_ACTIVE_HIGH)
167 		flags |= DRM_MODE_FLAG_PVSYNC;
168 	else
169 		flags |= DRM_MODE_FLAG_NVSYNC;
170 
171 	if (tmp & HDMI_MODE_SELECT_HDMI)
172 		pipe_config->has_hdmi_sink = true;
173 
174 	pipe_config->infoframes.enable |=
175 		intel_hdmi_infoframes_enabled(encoder, pipe_config);
176 
177 	if (pipe_config->infoframes.enable)
178 		pipe_config->has_infoframe = true;
179 
180 	if (tmp & HDMI_AUDIO_ENABLE)
181 		pipe_config->has_audio = true;
182 
183 	if (!HAS_PCH_SPLIT(dev_priv) &&
184 	    tmp & HDMI_COLOR_RANGE_16_235)
185 		pipe_config->limited_color_range = true;
186 
187 	pipe_config->hw.adjusted_mode.flags |= flags;
188 
189 	if ((tmp & SDVO_COLOR_FORMAT_MASK) == HDMI_COLOR_FORMAT_12bpc)
190 		dotclock = DIV_ROUND_CLOSEST(pipe_config->port_clock * 2, 3);
191 	else
192 		dotclock = pipe_config->port_clock;
193 
194 	if (pipe_config->pixel_multiplier)
195 		dotclock /= pipe_config->pixel_multiplier;
196 
197 	pipe_config->hw.adjusted_mode.crtc_clock = dotclock;
198 
199 	pipe_config->lane_count = 4;
200 
201 	intel_hdmi_read_gcp_infoframe(encoder, pipe_config);
202 
203 	intel_read_infoframe(encoder, pipe_config,
204 			     HDMI_INFOFRAME_TYPE_AVI,
205 			     &pipe_config->infoframes.avi);
206 	intel_read_infoframe(encoder, pipe_config,
207 			     HDMI_INFOFRAME_TYPE_SPD,
208 			     &pipe_config->infoframes.spd);
209 	intel_read_infoframe(encoder, pipe_config,
210 			     HDMI_INFOFRAME_TYPE_VENDOR,
211 			     &pipe_config->infoframes.hdmi);
212 
213 	intel_audio_codec_get_config(encoder, pipe_config);
214 }
215 
g4x_hdmi_enable_port(struct intel_encoder * encoder,const struct intel_crtc_state * pipe_config)216 static void g4x_hdmi_enable_port(struct intel_encoder *encoder,
217 				 const struct intel_crtc_state *pipe_config)
218 {
219 	struct drm_device *dev = encoder->base.dev;
220 	struct drm_i915_private *dev_priv = to_i915(dev);
221 	struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(encoder);
222 	u32 temp;
223 
224 	temp = intel_de_read(dev_priv, intel_hdmi->hdmi_reg);
225 
226 	temp |= SDVO_ENABLE;
227 	if (pipe_config->has_audio)
228 		temp |= HDMI_AUDIO_ENABLE;
229 
230 	intel_de_write(dev_priv, intel_hdmi->hdmi_reg, temp);
231 	intel_de_posting_read(dev_priv, intel_hdmi->hdmi_reg);
232 }
233 
g4x_enable_hdmi(struct intel_atomic_state * state,struct intel_encoder * encoder,const struct intel_crtc_state * pipe_config,const struct drm_connector_state * conn_state)234 static void g4x_enable_hdmi(struct intel_atomic_state *state,
235 			    struct intel_encoder *encoder,
236 			    const struct intel_crtc_state *pipe_config,
237 			    const struct drm_connector_state *conn_state)
238 {
239 	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
240 
241 	g4x_hdmi_enable_port(encoder, pipe_config);
242 
243 	drm_WARN_ON(&dev_priv->drm, pipe_config->has_audio &&
244 		    !pipe_config->has_hdmi_sink);
245 	intel_audio_codec_enable(encoder, pipe_config, conn_state);
246 }
247 
ibx_enable_hdmi(struct intel_atomic_state * state,struct intel_encoder * encoder,const struct intel_crtc_state * pipe_config,const struct drm_connector_state * conn_state)248 static void ibx_enable_hdmi(struct intel_atomic_state *state,
249 			    struct intel_encoder *encoder,
250 			    const struct intel_crtc_state *pipe_config,
251 			    const struct drm_connector_state *conn_state)
252 {
253 	struct drm_device *dev = encoder->base.dev;
254 	struct drm_i915_private *dev_priv = to_i915(dev);
255 	struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(encoder);
256 	u32 temp;
257 
258 	temp = intel_de_read(dev_priv, intel_hdmi->hdmi_reg);
259 
260 	temp |= SDVO_ENABLE;
261 	if (pipe_config->has_audio)
262 		temp |= HDMI_AUDIO_ENABLE;
263 
264 	/*
265 	 * HW workaround, need to write this twice for issue
266 	 * that may result in first write getting masked.
267 	 */
268 	intel_de_write(dev_priv, intel_hdmi->hdmi_reg, temp);
269 	intel_de_posting_read(dev_priv, intel_hdmi->hdmi_reg);
270 	intel_de_write(dev_priv, intel_hdmi->hdmi_reg, temp);
271 	intel_de_posting_read(dev_priv, intel_hdmi->hdmi_reg);
272 
273 	/*
274 	 * HW workaround, need to toggle enable bit off and on
275 	 * for 12bpc with pixel repeat.
276 	 *
277 	 * FIXME: BSpec says this should be done at the end of
278 	 * the modeset sequence, so not sure if this isn't too soon.
279 	 */
280 	if (pipe_config->pipe_bpp > 24 &&
281 	    pipe_config->pixel_multiplier > 1) {
282 		intel_de_write(dev_priv, intel_hdmi->hdmi_reg,
283 			       temp & ~SDVO_ENABLE);
284 		intel_de_posting_read(dev_priv, intel_hdmi->hdmi_reg);
285 
286 		/*
287 		 * HW workaround, need to write this twice for issue
288 		 * that may result in first write getting masked.
289 		 */
290 		intel_de_write(dev_priv, intel_hdmi->hdmi_reg, temp);
291 		intel_de_posting_read(dev_priv, intel_hdmi->hdmi_reg);
292 		intel_de_write(dev_priv, intel_hdmi->hdmi_reg, temp);
293 		intel_de_posting_read(dev_priv, intel_hdmi->hdmi_reg);
294 	}
295 
296 	drm_WARN_ON(&dev_priv->drm, pipe_config->has_audio &&
297 		    !pipe_config->has_hdmi_sink);
298 	intel_audio_codec_enable(encoder, pipe_config, conn_state);
299 }
300 
cpt_enable_hdmi(struct intel_atomic_state * state,struct intel_encoder * encoder,const struct intel_crtc_state * pipe_config,const struct drm_connector_state * conn_state)301 static void cpt_enable_hdmi(struct intel_atomic_state *state,
302 			    struct intel_encoder *encoder,
303 			    const struct intel_crtc_state *pipe_config,
304 			    const struct drm_connector_state *conn_state)
305 {
306 	struct drm_device *dev = encoder->base.dev;
307 	struct drm_i915_private *dev_priv = to_i915(dev);
308 	struct intel_crtc *crtc = to_intel_crtc(pipe_config->uapi.crtc);
309 	struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(encoder);
310 	enum pipe pipe = crtc->pipe;
311 	u32 temp;
312 
313 	temp = intel_de_read(dev_priv, intel_hdmi->hdmi_reg);
314 
315 	temp |= SDVO_ENABLE;
316 	if (pipe_config->has_audio)
317 		temp |= HDMI_AUDIO_ENABLE;
318 
319 	/*
320 	 * WaEnableHDMI8bpcBefore12bpc:snb,ivb
321 	 *
322 	 * The procedure for 12bpc is as follows:
323 	 * 1. disable HDMI clock gating
324 	 * 2. enable HDMI with 8bpc
325 	 * 3. enable HDMI with 12bpc
326 	 * 4. enable HDMI clock gating
327 	 */
328 
329 	if (pipe_config->pipe_bpp > 24) {
330 		intel_de_rmw(dev_priv, TRANS_CHICKEN1(pipe),
331 			     0, TRANS_CHICKEN1_HDMIUNIT_GC_DISABLE);
332 
333 		temp &= ~SDVO_COLOR_FORMAT_MASK;
334 		temp |= SDVO_COLOR_FORMAT_8bpc;
335 	}
336 
337 	intel_de_write(dev_priv, intel_hdmi->hdmi_reg, temp);
338 	intel_de_posting_read(dev_priv, intel_hdmi->hdmi_reg);
339 
340 	if (pipe_config->pipe_bpp > 24) {
341 		temp &= ~SDVO_COLOR_FORMAT_MASK;
342 		temp |= HDMI_COLOR_FORMAT_12bpc;
343 
344 		intel_de_write(dev_priv, intel_hdmi->hdmi_reg, temp);
345 		intel_de_posting_read(dev_priv, intel_hdmi->hdmi_reg);
346 
347 		intel_de_rmw(dev_priv, TRANS_CHICKEN1(pipe),
348 			     TRANS_CHICKEN1_HDMIUNIT_GC_DISABLE, 0);
349 	}
350 
351 	drm_WARN_ON(&dev_priv->drm, pipe_config->has_audio &&
352 		    !pipe_config->has_hdmi_sink);
353 	intel_audio_codec_enable(encoder, pipe_config, conn_state);
354 }
355 
vlv_enable_hdmi(struct intel_atomic_state * state,struct intel_encoder * encoder,const struct intel_crtc_state * pipe_config,const struct drm_connector_state * conn_state)356 static void vlv_enable_hdmi(struct intel_atomic_state *state,
357 			    struct intel_encoder *encoder,
358 			    const struct intel_crtc_state *pipe_config,
359 			    const struct drm_connector_state *conn_state)
360 {
361 	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
362 
363 	drm_WARN_ON(&dev_priv->drm, pipe_config->has_audio &&
364 		    !pipe_config->has_hdmi_sink);
365 	intel_audio_codec_enable(encoder, pipe_config, conn_state);
366 }
367 
intel_disable_hdmi(struct intel_atomic_state * state,struct intel_encoder * encoder,const struct intel_crtc_state * old_crtc_state,const struct drm_connector_state * old_conn_state)368 static void intel_disable_hdmi(struct intel_atomic_state *state,
369 			       struct intel_encoder *encoder,
370 			       const struct intel_crtc_state *old_crtc_state,
371 			       const struct drm_connector_state *old_conn_state)
372 {
373 	struct drm_device *dev = encoder->base.dev;
374 	struct drm_i915_private *dev_priv = to_i915(dev);
375 	struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(encoder);
376 	struct intel_digital_port *dig_port =
377 		hdmi_to_dig_port(intel_hdmi);
378 	struct intel_crtc *crtc = to_intel_crtc(old_crtc_state->uapi.crtc);
379 	u32 temp;
380 
381 	temp = intel_de_read(dev_priv, intel_hdmi->hdmi_reg);
382 
383 	temp &= ~(SDVO_ENABLE | HDMI_AUDIO_ENABLE);
384 	intel_de_write(dev_priv, intel_hdmi->hdmi_reg, temp);
385 	intel_de_posting_read(dev_priv, intel_hdmi->hdmi_reg);
386 
387 	/*
388 	 * HW workaround for IBX, we need to move the port
389 	 * to transcoder A after disabling it to allow the
390 	 * matching DP port to be enabled on transcoder A.
391 	 */
392 	if (HAS_PCH_IBX(dev_priv) && crtc->pipe == PIPE_B) {
393 		/*
394 		 * We get CPU/PCH FIFO underruns on the other pipe when
395 		 * doing the workaround. Sweep them under the rug.
396 		 */
397 		intel_set_cpu_fifo_underrun_reporting(dev_priv, PIPE_A, false);
398 		intel_set_pch_fifo_underrun_reporting(dev_priv, PIPE_A, false);
399 
400 		temp &= ~SDVO_PIPE_SEL_MASK;
401 		temp |= SDVO_ENABLE | SDVO_PIPE_SEL(PIPE_A);
402 		/*
403 		 * HW workaround, need to write this twice for issue
404 		 * that may result in first write getting masked.
405 		 */
406 		intel_de_write(dev_priv, intel_hdmi->hdmi_reg, temp);
407 		intel_de_posting_read(dev_priv, intel_hdmi->hdmi_reg);
408 		intel_de_write(dev_priv, intel_hdmi->hdmi_reg, temp);
409 		intel_de_posting_read(dev_priv, intel_hdmi->hdmi_reg);
410 
411 		temp &= ~SDVO_ENABLE;
412 		intel_de_write(dev_priv, intel_hdmi->hdmi_reg, temp);
413 		intel_de_posting_read(dev_priv, intel_hdmi->hdmi_reg);
414 
415 		intel_wait_for_vblank_if_active(dev_priv, PIPE_A);
416 		intel_set_cpu_fifo_underrun_reporting(dev_priv, PIPE_A, true);
417 		intel_set_pch_fifo_underrun_reporting(dev_priv, PIPE_A, true);
418 	}
419 
420 	dig_port->set_infoframes(encoder,
421 				       false,
422 				       old_crtc_state, old_conn_state);
423 
424 	intel_dp_dual_mode_set_tmds_output(intel_hdmi, false);
425 }
426 
g4x_disable_hdmi(struct intel_atomic_state * state,struct intel_encoder * encoder,const struct intel_crtc_state * old_crtc_state,const struct drm_connector_state * old_conn_state)427 static void g4x_disable_hdmi(struct intel_atomic_state *state,
428 			     struct intel_encoder *encoder,
429 			     const struct intel_crtc_state *old_crtc_state,
430 			     const struct drm_connector_state *old_conn_state)
431 {
432 	intel_audio_codec_disable(encoder, old_crtc_state, old_conn_state);
433 
434 	intel_disable_hdmi(state, encoder, old_crtc_state, old_conn_state);
435 }
436 
pch_disable_hdmi(struct intel_atomic_state * state,struct intel_encoder * encoder,const struct intel_crtc_state * old_crtc_state,const struct drm_connector_state * old_conn_state)437 static void pch_disable_hdmi(struct intel_atomic_state *state,
438 			     struct intel_encoder *encoder,
439 			     const struct intel_crtc_state *old_crtc_state,
440 			     const struct drm_connector_state *old_conn_state)
441 {
442 	intel_audio_codec_disable(encoder, old_crtc_state, old_conn_state);
443 }
444 
pch_post_disable_hdmi(struct intel_atomic_state * state,struct intel_encoder * encoder,const struct intel_crtc_state * old_crtc_state,const struct drm_connector_state * old_conn_state)445 static void pch_post_disable_hdmi(struct intel_atomic_state *state,
446 				  struct intel_encoder *encoder,
447 				  const struct intel_crtc_state *old_crtc_state,
448 				  const struct drm_connector_state *old_conn_state)
449 {
450 	intel_disable_hdmi(state, encoder, old_crtc_state, old_conn_state);
451 }
452 
intel_hdmi_pre_enable(struct intel_atomic_state * state,struct intel_encoder * encoder,const struct intel_crtc_state * pipe_config,const struct drm_connector_state * conn_state)453 static void intel_hdmi_pre_enable(struct intel_atomic_state *state,
454 				  struct intel_encoder *encoder,
455 				  const struct intel_crtc_state *pipe_config,
456 				  const struct drm_connector_state *conn_state)
457 {
458 	struct intel_digital_port *dig_port =
459 		enc_to_dig_port(encoder);
460 
461 	intel_hdmi_prepare(encoder, pipe_config);
462 
463 	dig_port->set_infoframes(encoder,
464 				       pipe_config->has_infoframe,
465 				       pipe_config, conn_state);
466 }
467 
vlv_hdmi_pre_enable(struct intel_atomic_state * state,struct intel_encoder * encoder,const struct intel_crtc_state * pipe_config,const struct drm_connector_state * conn_state)468 static void vlv_hdmi_pre_enable(struct intel_atomic_state *state,
469 				struct intel_encoder *encoder,
470 				const struct intel_crtc_state *pipe_config,
471 				const struct drm_connector_state *conn_state)
472 {
473 	struct intel_digital_port *dig_port = enc_to_dig_port(encoder);
474 	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
475 
476 	vlv_phy_pre_encoder_enable(encoder, pipe_config);
477 
478 	/* HDMI 1.0V-2dB */
479 	vlv_set_phy_signal_level(encoder, pipe_config,
480 				 0x2b245f5f, 0x00002000,
481 				 0x5578b83a, 0x2b247878);
482 
483 	dig_port->set_infoframes(encoder,
484 			      pipe_config->has_infoframe,
485 			      pipe_config, conn_state);
486 
487 	g4x_hdmi_enable_port(encoder, pipe_config);
488 
489 	vlv_wait_port_ready(dev_priv, dig_port, 0x0);
490 }
491 
vlv_hdmi_pre_pll_enable(struct intel_atomic_state * state,struct intel_encoder * encoder,const struct intel_crtc_state * pipe_config,const struct drm_connector_state * conn_state)492 static void vlv_hdmi_pre_pll_enable(struct intel_atomic_state *state,
493 				    struct intel_encoder *encoder,
494 				    const struct intel_crtc_state *pipe_config,
495 				    const struct drm_connector_state *conn_state)
496 {
497 	intel_hdmi_prepare(encoder, pipe_config);
498 
499 	vlv_phy_pre_pll_enable(encoder, pipe_config);
500 }
501 
chv_hdmi_pre_pll_enable(struct intel_atomic_state * state,struct intel_encoder * encoder,const struct intel_crtc_state * pipe_config,const struct drm_connector_state * conn_state)502 static void chv_hdmi_pre_pll_enable(struct intel_atomic_state *state,
503 				    struct intel_encoder *encoder,
504 				    const struct intel_crtc_state *pipe_config,
505 				    const struct drm_connector_state *conn_state)
506 {
507 	intel_hdmi_prepare(encoder, pipe_config);
508 
509 	chv_phy_pre_pll_enable(encoder, pipe_config);
510 }
511 
chv_hdmi_post_pll_disable(struct intel_atomic_state * state,struct intel_encoder * encoder,const struct intel_crtc_state * old_crtc_state,const struct drm_connector_state * old_conn_state)512 static void chv_hdmi_post_pll_disable(struct intel_atomic_state *state,
513 				      struct intel_encoder *encoder,
514 				      const struct intel_crtc_state *old_crtc_state,
515 				      const struct drm_connector_state *old_conn_state)
516 {
517 	chv_phy_post_pll_disable(encoder, old_crtc_state);
518 }
519 
vlv_hdmi_post_disable(struct intel_atomic_state * state,struct intel_encoder * encoder,const struct intel_crtc_state * old_crtc_state,const struct drm_connector_state * old_conn_state)520 static void vlv_hdmi_post_disable(struct intel_atomic_state *state,
521 				  struct intel_encoder *encoder,
522 				  const struct intel_crtc_state *old_crtc_state,
523 				  const struct drm_connector_state *old_conn_state)
524 {
525 	/* Reset lanes to avoid HDMI flicker (VLV w/a) */
526 	vlv_phy_reset_lanes(encoder, old_crtc_state);
527 }
528 
chv_hdmi_post_disable(struct intel_atomic_state * state,struct intel_encoder * encoder,const struct intel_crtc_state * old_crtc_state,const struct drm_connector_state * old_conn_state)529 static void chv_hdmi_post_disable(struct intel_atomic_state *state,
530 				  struct intel_encoder *encoder,
531 				  const struct intel_crtc_state *old_crtc_state,
532 				  const struct drm_connector_state *old_conn_state)
533 {
534 	struct drm_device *dev = encoder->base.dev;
535 	struct drm_i915_private *dev_priv = to_i915(dev);
536 
537 	vlv_dpio_get(dev_priv);
538 
539 	/* Assert data lane reset */
540 	chv_data_lane_soft_reset(encoder, old_crtc_state, true);
541 
542 	vlv_dpio_put(dev_priv);
543 }
544 
chv_hdmi_pre_enable(struct intel_atomic_state * state,struct intel_encoder * encoder,const struct intel_crtc_state * pipe_config,const struct drm_connector_state * conn_state)545 static void chv_hdmi_pre_enable(struct intel_atomic_state *state,
546 				struct intel_encoder *encoder,
547 				const struct intel_crtc_state *pipe_config,
548 				const struct drm_connector_state *conn_state)
549 {
550 	struct intel_digital_port *dig_port = enc_to_dig_port(encoder);
551 	struct drm_device *dev = encoder->base.dev;
552 	struct drm_i915_private *dev_priv = to_i915(dev);
553 
554 	chv_phy_pre_encoder_enable(encoder, pipe_config);
555 
556 	/* FIXME: Program the support xxx V-dB */
557 	/* Use 800mV-0dB */
558 	chv_set_phy_signal_level(encoder, pipe_config, 128, 102, false);
559 
560 	dig_port->set_infoframes(encoder,
561 			      pipe_config->has_infoframe,
562 			      pipe_config, conn_state);
563 
564 	g4x_hdmi_enable_port(encoder, pipe_config);
565 
566 	vlv_wait_port_ready(dev_priv, dig_port, 0x0);
567 
568 	/* Second common lane will stay alive on its own now */
569 	chv_phy_release_cl2_override(encoder);
570 }
571 
572 static const struct drm_encoder_funcs intel_hdmi_enc_funcs = {
573 	.destroy = intel_encoder_destroy,
574 };
575 
576 static enum intel_hotplug_state
intel_hdmi_hotplug(struct intel_encoder * encoder,struct intel_connector * connector)577 intel_hdmi_hotplug(struct intel_encoder *encoder,
578 		   struct intel_connector *connector)
579 {
580 	enum intel_hotplug_state state;
581 
582 	state = intel_encoder_hotplug(encoder, connector);
583 
584 	/*
585 	 * On many platforms the HDMI live state signal is known to be
586 	 * unreliable, so we can't use it to detect if a sink is connected or
587 	 * not. Instead we detect if it's connected based on whether we can
588 	 * read the EDID or not. That in turn has a problem during disconnect,
589 	 * since the HPD interrupt may be raised before the DDC lines get
590 	 * disconnected (due to how the required length of DDC vs. HPD
591 	 * connector pins are specified) and so we'll still be able to get a
592 	 * valid EDID. To solve this schedule another detection cycle if this
593 	 * time around we didn't detect any change in the sink's connection
594 	 * status.
595 	 */
596 	if (state == INTEL_HOTPLUG_UNCHANGED && !connector->hotplug_retries)
597 		state = INTEL_HOTPLUG_RETRY;
598 
599 	return state;
600 }
601 
g4x_hdmi_connector_atomic_check(struct drm_connector * connector,struct drm_atomic_state * state)602 int g4x_hdmi_connector_atomic_check(struct drm_connector *connector,
603 				    struct drm_atomic_state *state)
604 {
605 	struct drm_i915_private *i915 = to_i915(state->dev);
606 	struct drm_connector_list_iter conn_iter;
607 	struct drm_connector *conn;
608 	int ret;
609 
610 	ret = intel_digital_connector_atomic_check(connector, state);
611 	if (ret)
612 		return ret;
613 
614 	if (!IS_G4X(i915))
615 		return 0;
616 
617 	if (!intel_connector_needs_modeset(to_intel_atomic_state(state), connector))
618 		return 0;
619 
620 	/*
621 	 * On g4x only one HDMI port can transmit infoframes/audio
622 	 * at any given time. Make sure all enabled HDMI ports are
623 	 * included in the state so that it's possible to select
624 	 * one of them for this duty.
625 	 *
626 	 * See also g4x_compute_has_hdmi_sink().
627 	 */
628 	drm_connector_list_iter_begin(&i915->drm, &conn_iter);
629 	drm_for_each_connector_iter(conn, &conn_iter) {
630 		struct drm_connector_state *conn_state;
631 		struct drm_crtc_state *crtc_state;
632 		struct drm_crtc *crtc;
633 
634 		if (!connector_is_hdmi(conn))
635 			continue;
636 
637 		drm_dbg_kms(&i915->drm, "Adding [CONNECTOR:%d:%s]\n",
638 			    conn->base.id, conn->name);
639 
640 		conn_state = drm_atomic_get_connector_state(state, conn);
641 		if (IS_ERR(conn_state)) {
642 			ret = PTR_ERR(conn_state);
643 			break;
644 		}
645 
646 		crtc = conn_state->crtc;
647 		if (!crtc)
648 			continue;
649 
650 		crtc_state = drm_atomic_get_new_crtc_state(state, crtc);
651 		crtc_state->mode_changed = true;
652 
653 		ret = drm_atomic_add_affected_planes(state, crtc);
654 		if (ret)
655 			break;
656 	}
657 	drm_connector_list_iter_end(&conn_iter);
658 
659 	return ret;
660 }
661 
is_hdmi_port_valid(struct drm_i915_private * i915,enum port port)662 static bool is_hdmi_port_valid(struct drm_i915_private *i915, enum port port)
663 {
664 	if (IS_G4X(i915) || IS_VALLEYVIEW(i915))
665 		return port == PORT_B || port == PORT_C;
666 	else
667 		return port == PORT_B || port == PORT_C || port == PORT_D;
668 }
669 
assert_hdmi_port_valid(struct drm_i915_private * i915,enum port port)670 static bool assert_hdmi_port_valid(struct drm_i915_private *i915, enum port port)
671 {
672 	return !drm_WARN(&i915->drm, !is_hdmi_port_valid(i915, port),
673 			 "Platform does not support HDMI %c\n", port_name(port));
674 }
675 
g4x_hdmi_init(struct drm_i915_private * dev_priv,i915_reg_t hdmi_reg,enum port port)676 void g4x_hdmi_init(struct drm_i915_private *dev_priv,
677 		   i915_reg_t hdmi_reg, enum port port)
678 {
679 	const struct intel_bios_encoder_data *devdata;
680 	struct intel_digital_port *dig_port;
681 	struct intel_encoder *intel_encoder;
682 	struct intel_connector *intel_connector;
683 
684 	if (!assert_port_valid(dev_priv, port))
685 		return;
686 
687 	if (!assert_hdmi_port_valid(dev_priv, port))
688 		return;
689 
690 	devdata = intel_bios_encoder_data_lookup(dev_priv, port);
691 
692 	/* FIXME bail? */
693 	if (!devdata)
694 		drm_dbg_kms(&dev_priv->drm, "No VBT child device for HDMI-%c\n",
695 			    port_name(port));
696 
697 	dig_port = kzalloc(sizeof(*dig_port), GFP_KERNEL);
698 	if (!dig_port)
699 		return;
700 
701 	dig_port->aux_ch = AUX_CH_NONE;
702 
703 	intel_connector = intel_connector_alloc();
704 	if (!intel_connector) {
705 		kfree(dig_port);
706 		return;
707 	}
708 
709 	intel_encoder = &dig_port->base;
710 
711 	intel_encoder->devdata = devdata;
712 
713 	rw_init(&dig_port->hdcp_mutex, "hhdcp");
714 
715 	drm_encoder_init(&dev_priv->drm, &intel_encoder->base,
716 			 &intel_hdmi_enc_funcs, DRM_MODE_ENCODER_TMDS,
717 			 "HDMI %c", port_name(port));
718 
719 	intel_encoder->hotplug = intel_hdmi_hotplug;
720 	intel_encoder->compute_config = g4x_hdmi_compute_config;
721 	if (HAS_PCH_SPLIT(dev_priv)) {
722 		intel_encoder->disable = pch_disable_hdmi;
723 		intel_encoder->post_disable = pch_post_disable_hdmi;
724 	} else {
725 		intel_encoder->disable = g4x_disable_hdmi;
726 	}
727 	intel_encoder->get_hw_state = intel_hdmi_get_hw_state;
728 	intel_encoder->get_config = intel_hdmi_get_config;
729 	if (IS_CHERRYVIEW(dev_priv)) {
730 		intel_encoder->pre_pll_enable = chv_hdmi_pre_pll_enable;
731 		intel_encoder->pre_enable = chv_hdmi_pre_enable;
732 		intel_encoder->enable = vlv_enable_hdmi;
733 		intel_encoder->post_disable = chv_hdmi_post_disable;
734 		intel_encoder->post_pll_disable = chv_hdmi_post_pll_disable;
735 	} else if (IS_VALLEYVIEW(dev_priv)) {
736 		intel_encoder->pre_pll_enable = vlv_hdmi_pre_pll_enable;
737 		intel_encoder->pre_enable = vlv_hdmi_pre_enable;
738 		intel_encoder->enable = vlv_enable_hdmi;
739 		intel_encoder->post_disable = vlv_hdmi_post_disable;
740 	} else {
741 		intel_encoder->pre_enable = intel_hdmi_pre_enable;
742 		if (HAS_PCH_CPT(dev_priv))
743 			intel_encoder->enable = cpt_enable_hdmi;
744 		else if (HAS_PCH_IBX(dev_priv))
745 			intel_encoder->enable = ibx_enable_hdmi;
746 		else
747 			intel_encoder->enable = g4x_enable_hdmi;
748 	}
749 	intel_encoder->shutdown = intel_hdmi_encoder_shutdown;
750 
751 	intel_encoder->type = INTEL_OUTPUT_HDMI;
752 	intel_encoder->power_domain = intel_display_power_ddi_lanes_domain(dev_priv, port);
753 	intel_encoder->port = port;
754 	if (IS_CHERRYVIEW(dev_priv)) {
755 		if (port == PORT_D)
756 			intel_encoder->pipe_mask = BIT(PIPE_C);
757 		else
758 			intel_encoder->pipe_mask = BIT(PIPE_A) | BIT(PIPE_B);
759 	} else {
760 		intel_encoder->pipe_mask = ~0;
761 	}
762 	intel_encoder->cloneable = BIT(INTEL_OUTPUT_ANALOG);
763 	intel_encoder->hpd_pin = intel_hpd_pin_default(dev_priv, port);
764 	/*
765 	 * BSpec is unclear about HDMI+HDMI cloning on g4x, but it seems
766 	 * to work on real hardware. And since g4x can send infoframes to
767 	 * only one port anyway, nothing is lost by allowing it.
768 	 */
769 	if (IS_G4X(dev_priv))
770 		intel_encoder->cloneable |= BIT(INTEL_OUTPUT_HDMI);
771 
772 	dig_port->hdmi.hdmi_reg = hdmi_reg;
773 	dig_port->dp.output_reg = INVALID_MMIO_REG;
774 	dig_port->max_lanes = 4;
775 
776 	intel_infoframe_init(dig_port);
777 
778 	intel_hdmi_init_connector(dig_port, intel_connector);
779 }
780