xref: /linux/drivers/gpu/drm/i915/display/intel_crt.c (revision 22c55fb9eb92395d999b8404d73e58540d11bdd8)
1 /*
2  * Copyright © 2006-2007 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  * Authors:
24  *	Eric Anholt <eric@anholt.net>
25  */
26 
27 #include <linux/dmi.h>
28 #include <linux/i2c.h>
29 #include <linux/slab.h>
30 
31 #include <drm/drm_atomic_helper.h>
32 #include <drm/drm_crtc.h>
33 #include <drm/drm_edid.h>
34 #include <drm/drm_print.h>
35 #include <drm/drm_probe_helper.h>
36 
37 #include "intel_connector.h"
38 #include "intel_crt.h"
39 #include "intel_crt_regs.h"
40 #include "intel_crtc.h"
41 #include "intel_ddi.h"
42 #include "intel_ddi_buf_trans.h"
43 #include "intel_de.h"
44 #include "intel_display_driver.h"
45 #include "intel_display_regs.h"
46 #include "intel_display_types.h"
47 #include "intel_fdi.h"
48 #include "intel_fdi_regs.h"
49 #include "intel_fifo_underrun.h"
50 #include "intel_gmbus.h"
51 #include "intel_hotplug.h"
52 #include "intel_hotplug_irq.h"
53 #include "intel_load_detect.h"
54 #include "intel_pch_display.h"
55 #include "intel_pch_refclk.h"
56 #include "intel_pfit.h"
57 
58 /* Here's the desired hotplug mode */
59 #define ADPA_HOTPLUG_BITS (ADPA_CRT_HOTPLUG_ENABLE |			\
60 			   ADPA_CRT_HOTPLUG_PERIOD_128 |		\
61 			   ADPA_CRT_HOTPLUG_WARMUP_10MS |		\
62 			   ADPA_CRT_HOTPLUG_SAMPLE_4S |			\
63 			   ADPA_CRT_HOTPLUG_VOLTAGE_50 |		\
64 			   ADPA_CRT_HOTPLUG_VOLREF_325MV)
65 #define ADPA_HOTPLUG_MASK (ADPA_CRT_HOTPLUG_MONITOR_MASK |		\
66 			   ADPA_CRT_HOTPLUG_ENABLE |			\
67 			   ADPA_CRT_HOTPLUG_PERIOD_MASK |		\
68 			   ADPA_CRT_HOTPLUG_WARMUP_MASK |		\
69 			   ADPA_CRT_HOTPLUG_SAMPLE_MASK |		\
70 			   ADPA_CRT_HOTPLUG_VOLTAGE_MASK |		\
71 			   ADPA_CRT_HOTPLUG_VOLREF_MASK |		\
72 			   ADPA_CRT_HOTPLUG_FORCE_TRIGGER)
73 
74 struct intel_crt {
75 	struct intel_encoder base;
76 	bool force_hotplug_required;
77 	i915_reg_t adpa_reg;
78 };
79 
80 static struct intel_crt *intel_encoder_to_crt(struct intel_encoder *encoder)
81 {
82 	return container_of(encoder, struct intel_crt, base);
83 }
84 
85 static struct intel_crt *intel_attached_crt(struct intel_connector *connector)
86 {
87 	return intel_encoder_to_crt(intel_attached_encoder(connector));
88 }
89 
90 bool intel_crt_port_enabled(struct intel_display *display,
91 			    i915_reg_t adpa_reg, enum pipe *pipe)
92 {
93 	u32 val;
94 
95 	val = intel_de_read(display, adpa_reg);
96 
97 	/* asserts want to know the pipe even if the port is disabled */
98 	if (HAS_PCH_CPT(display))
99 		*pipe = REG_FIELD_GET(ADPA_PIPE_SEL_MASK_CPT, val);
100 	else
101 		*pipe = REG_FIELD_GET(ADPA_PIPE_SEL_MASK, val);
102 
103 	return val & ADPA_DAC_ENABLE;
104 }
105 
106 static bool intel_crt_get_hw_state(struct intel_encoder *encoder,
107 				   enum pipe *pipe)
108 {
109 	struct intel_display *display = to_intel_display(encoder);
110 	struct intel_crt *crt = intel_encoder_to_crt(encoder);
111 	intel_wakeref_t wakeref;
112 	bool ret;
113 
114 	wakeref = intel_display_power_get_if_enabled(display,
115 						     encoder->power_domain);
116 	if (!wakeref)
117 		return false;
118 
119 	ret = intel_crt_port_enabled(display, crt->adpa_reg, pipe);
120 
121 	intel_display_power_put(display, encoder->power_domain, wakeref);
122 
123 	return ret;
124 }
125 
126 static unsigned int intel_crt_get_flags(struct intel_encoder *encoder)
127 {
128 	struct intel_display *display = to_intel_display(encoder);
129 	struct intel_crt *crt = intel_encoder_to_crt(encoder);
130 	u32 tmp, flags = 0;
131 
132 	tmp = intel_de_read(display, crt->adpa_reg);
133 
134 	if (tmp & ADPA_HSYNC_ACTIVE_HIGH)
135 		flags |= DRM_MODE_FLAG_PHSYNC;
136 	else
137 		flags |= DRM_MODE_FLAG_NHSYNC;
138 
139 	if (tmp & ADPA_VSYNC_ACTIVE_HIGH)
140 		flags |= DRM_MODE_FLAG_PVSYNC;
141 	else
142 		flags |= DRM_MODE_FLAG_NVSYNC;
143 
144 	return flags;
145 }
146 
147 static void intel_crt_get_config(struct intel_encoder *encoder,
148 				 struct intel_crtc_state *crtc_state)
149 {
150 	crtc_state->output_types |= BIT(INTEL_OUTPUT_ANALOG);
151 
152 	crtc_state->hw.adjusted_mode.flags |= intel_crt_get_flags(encoder);
153 
154 	crtc_state->hw.adjusted_mode.crtc_clock = crtc_state->port_clock;
155 }
156 
157 static void hsw_crt_get_config(struct intel_encoder *encoder,
158 			       struct intel_crtc_state *crtc_state)
159 {
160 	lpt_pch_get_config(crtc_state);
161 
162 	hsw_ddi_get_config(encoder, crtc_state);
163 
164 	crtc_state->hw.adjusted_mode.flags &= ~(DRM_MODE_FLAG_PHSYNC |
165 						DRM_MODE_FLAG_NHSYNC |
166 						DRM_MODE_FLAG_PVSYNC |
167 						DRM_MODE_FLAG_NVSYNC);
168 	crtc_state->hw.adjusted_mode.flags |= intel_crt_get_flags(encoder);
169 }
170 
171 /* Note: The caller is required to filter out dpms modes not supported by the
172  * platform. */
173 static void intel_crt_set_dpms(struct intel_encoder *encoder,
174 			       const struct intel_crtc_state *crtc_state,
175 			       int mode)
176 {
177 	struct intel_display *display = to_intel_display(encoder);
178 	struct intel_crt *crt = intel_encoder_to_crt(encoder);
179 	struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
180 	const struct drm_display_mode *adjusted_mode = &crtc_state->hw.adjusted_mode;
181 	u32 adpa;
182 
183 	if (DISPLAY_VER(display) >= 5)
184 		adpa = ADPA_HOTPLUG_BITS;
185 	else
186 		adpa = 0;
187 
188 	if (adjusted_mode->flags & DRM_MODE_FLAG_PHSYNC)
189 		adpa |= ADPA_HSYNC_ACTIVE_HIGH;
190 	if (adjusted_mode->flags & DRM_MODE_FLAG_PVSYNC)
191 		adpa |= ADPA_VSYNC_ACTIVE_HIGH;
192 
193 	/* For CPT allow 3 pipe config, for others just use A or B */
194 	if (HAS_PCH_LPT(display))
195 		; /* Those bits don't exist here */
196 	else if (HAS_PCH_CPT(display))
197 		adpa |= ADPA_PIPE_SEL_CPT(crtc->pipe);
198 	else
199 		adpa |= ADPA_PIPE_SEL(crtc->pipe);
200 
201 	if (!HAS_PCH_SPLIT(display))
202 		intel_de_write(display, BCLRPAT(display, crtc->pipe), 0);
203 
204 	switch (mode) {
205 	case DRM_MODE_DPMS_ON:
206 		adpa |= ADPA_DAC_ENABLE;
207 		break;
208 	case DRM_MODE_DPMS_STANDBY:
209 		adpa |= ADPA_DAC_ENABLE | ADPA_HSYNC_CNTL_DISABLE;
210 		break;
211 	case DRM_MODE_DPMS_SUSPEND:
212 		adpa |= ADPA_DAC_ENABLE | ADPA_VSYNC_CNTL_DISABLE;
213 		break;
214 	case DRM_MODE_DPMS_OFF:
215 		adpa |= ADPA_HSYNC_CNTL_DISABLE | ADPA_VSYNC_CNTL_DISABLE;
216 		break;
217 	}
218 
219 	intel_de_write(display, crt->adpa_reg, adpa);
220 }
221 
222 static void intel_disable_crt(struct intel_atomic_state *state,
223 			      struct intel_encoder *encoder,
224 			      const struct intel_crtc_state *old_crtc_state,
225 			      const struct drm_connector_state *old_conn_state)
226 {
227 	intel_crt_set_dpms(encoder, old_crtc_state, DRM_MODE_DPMS_OFF);
228 }
229 
230 static void pch_disable_crt(struct intel_atomic_state *state,
231 			    struct intel_encoder *encoder,
232 			    const struct intel_crtc_state *old_crtc_state,
233 			    const struct drm_connector_state *old_conn_state)
234 {
235 }
236 
237 static void pch_post_disable_crt(struct intel_atomic_state *state,
238 				 struct intel_encoder *encoder,
239 				 const struct intel_crtc_state *old_crtc_state,
240 				 const struct drm_connector_state *old_conn_state)
241 {
242 	intel_disable_crt(state, encoder, old_crtc_state, old_conn_state);
243 }
244 
245 static void hsw_disable_crt(struct intel_atomic_state *state,
246 			    struct intel_encoder *encoder,
247 			    const struct intel_crtc_state *old_crtc_state,
248 			    const struct drm_connector_state *old_conn_state)
249 {
250 	struct intel_display *display = to_intel_display(encoder);
251 
252 	drm_WARN_ON(display->drm, !old_crtc_state->has_pch_encoder);
253 
254 	intel_set_pch_fifo_underrun_reporting(display, PIPE_A, false);
255 }
256 
257 static void hsw_post_disable_crt(struct intel_atomic_state *state,
258 				 struct intel_encoder *encoder,
259 				 const struct intel_crtc_state *old_crtc_state,
260 				 const struct drm_connector_state *old_conn_state)
261 {
262 	struct intel_display *display = to_intel_display(encoder);
263 	struct intel_crtc *crtc = to_intel_crtc(old_crtc_state->uapi.crtc);
264 
265 	intel_crtc_vblank_off(old_crtc_state);
266 
267 	intel_disable_transcoder(old_crtc_state);
268 
269 	intel_ddi_disable_transcoder_func(old_crtc_state);
270 
271 	ilk_pfit_disable(old_crtc_state);
272 
273 	intel_ddi_disable_transcoder_clock(old_crtc_state);
274 
275 	pch_post_disable_crt(state, encoder, old_crtc_state, old_conn_state);
276 
277 	lpt_pch_disable(state, crtc);
278 
279 	hsw_fdi_disable(encoder);
280 
281 	drm_WARN_ON(display->drm, !old_crtc_state->has_pch_encoder);
282 
283 	intel_set_pch_fifo_underrun_reporting(display, PIPE_A, true);
284 }
285 
286 static void hsw_pre_pll_enable_crt(struct intel_atomic_state *state,
287 				   struct intel_encoder *encoder,
288 				   const struct intel_crtc_state *crtc_state,
289 				   const struct drm_connector_state *conn_state)
290 {
291 	struct intel_display *display = to_intel_display(encoder);
292 
293 	drm_WARN_ON(display->drm, !crtc_state->has_pch_encoder);
294 
295 	intel_set_pch_fifo_underrun_reporting(display, PIPE_A, false);
296 }
297 
298 static void hsw_pre_enable_crt(struct intel_atomic_state *state,
299 			       struct intel_encoder *encoder,
300 			       const struct intel_crtc_state *crtc_state,
301 			       const struct drm_connector_state *conn_state)
302 {
303 	struct intel_display *display = to_intel_display(encoder);
304 	struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
305 	enum pipe pipe = crtc->pipe;
306 
307 	drm_WARN_ON(display->drm, !crtc_state->has_pch_encoder);
308 
309 	intel_set_cpu_fifo_underrun_reporting(display, pipe, false);
310 
311 	hsw_fdi_link_train(encoder, crtc_state);
312 
313 	intel_ddi_enable_transcoder_clock(encoder, crtc_state);
314 }
315 
316 static void hsw_enable_crt(struct intel_atomic_state *state,
317 			   struct intel_encoder *encoder,
318 			   const struct intel_crtc_state *crtc_state,
319 			   const struct drm_connector_state *conn_state)
320 {
321 	struct intel_display *display = to_intel_display(encoder);
322 	struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
323 	enum pipe pipe = crtc->pipe;
324 
325 	drm_WARN_ON(display->drm, !crtc_state->has_pch_encoder);
326 
327 	intel_ddi_enable_transcoder_func(encoder, crtc_state);
328 
329 	intel_enable_transcoder(crtc_state);
330 
331 	lpt_pch_enable(state, crtc);
332 
333 	intel_crtc_vblank_on(crtc_state);
334 
335 	intel_crt_set_dpms(encoder, crtc_state, DRM_MODE_DPMS_ON);
336 
337 	intel_crtc_wait_for_next_vblank(crtc);
338 	intel_crtc_wait_for_next_vblank(crtc);
339 	intel_set_cpu_fifo_underrun_reporting(display, pipe, true);
340 	intel_set_pch_fifo_underrun_reporting(display, PIPE_A, true);
341 }
342 
343 static void intel_enable_crt(struct intel_atomic_state *state,
344 			     struct intel_encoder *encoder,
345 			     const struct intel_crtc_state *crtc_state,
346 			     const struct drm_connector_state *conn_state)
347 {
348 	intel_crt_set_dpms(encoder, crtc_state, DRM_MODE_DPMS_ON);
349 }
350 
351 static enum drm_mode_status
352 intel_crt_mode_valid(struct drm_connector *connector,
353 		     const struct drm_display_mode *mode)
354 {
355 	struct intel_display *display = to_intel_display(connector->dev);
356 	int max_dotclk = display->cdclk.max_dotclk_freq;
357 	enum drm_mode_status status;
358 	int max_clock;
359 
360 	status = intel_cpu_transcoder_mode_valid(display, mode);
361 	if (status != MODE_OK)
362 		return status;
363 
364 	if (mode->clock < 25000)
365 		return MODE_CLOCK_LOW;
366 
367 	if (HAS_PCH_LPT(display))
368 		max_clock = 180000;
369 	else if (display->platform.valleyview)
370 		/*
371 		 * 270 MHz due to current DPLL limits,
372 		 * DAC limit supposedly 355 MHz.
373 		 */
374 		max_clock = 270000;
375 	else if (IS_DISPLAY_VER(display, 3, 4))
376 		max_clock = 400000;
377 	else
378 		max_clock = 350000;
379 	if (mode->clock > max_clock)
380 		return MODE_CLOCK_HIGH;
381 
382 	if (mode->clock > max_dotclk)
383 		return MODE_CLOCK_HIGH;
384 
385 	/* The FDI receiver on LPT only supports 8bpc and only has 2 lanes. */
386 	if (HAS_PCH_LPT(display) &&
387 	    ilk_get_lanes_required(mode->clock, 270000, 24) > 2)
388 		return MODE_CLOCK_HIGH;
389 
390 	/* HSW/BDW FDI limited to 4k */
391 	if (mode->hdisplay > 4096)
392 		return MODE_H_ILLEGAL;
393 
394 	return MODE_OK;
395 }
396 
397 static int intel_crt_compute_config(struct intel_encoder *encoder,
398 				    struct intel_crtc_state *crtc_state,
399 				    struct drm_connector_state *conn_state)
400 {
401 	struct drm_display_mode *adjusted_mode =
402 		&crtc_state->hw.adjusted_mode;
403 
404 	if (adjusted_mode->flags & DRM_MODE_FLAG_DBLSCAN)
405 		return -EINVAL;
406 
407 	crtc_state->sink_format = INTEL_OUTPUT_FORMAT_RGB;
408 	crtc_state->output_format = INTEL_OUTPUT_FORMAT_RGB;
409 
410 	return 0;
411 }
412 
413 static int pch_crt_compute_config(struct intel_encoder *encoder,
414 				  struct intel_crtc_state *crtc_state,
415 				  struct drm_connector_state *conn_state)
416 {
417 	struct drm_display_mode *adjusted_mode =
418 		&crtc_state->hw.adjusted_mode;
419 
420 	if (adjusted_mode->flags & DRM_MODE_FLAG_DBLSCAN)
421 		return -EINVAL;
422 
423 	crtc_state->has_pch_encoder = true;
424 	if (!intel_fdi_compute_pipe_bpp(crtc_state))
425 		return -EINVAL;
426 
427 	crtc_state->output_format = INTEL_OUTPUT_FORMAT_RGB;
428 
429 	return 0;
430 }
431 
432 static int hsw_crt_compute_config(struct intel_encoder *encoder,
433 				  struct intel_crtc_state *crtc_state,
434 				  struct drm_connector_state *conn_state)
435 {
436 	struct intel_display *display = to_intel_display(encoder);
437 	struct drm_display_mode *adjusted_mode =
438 		&crtc_state->hw.adjusted_mode;
439 
440 	if (adjusted_mode->flags & DRM_MODE_FLAG_DBLSCAN)
441 		return -EINVAL;
442 
443 	/* HSW/BDW FDI limited to 4k */
444 	if (adjusted_mode->crtc_hdisplay > 4096 ||
445 	    adjusted_mode->crtc_hblank_start > 4096)
446 		return -EINVAL;
447 
448 	crtc_state->has_pch_encoder = true;
449 	if (!intel_fdi_compute_pipe_bpp(crtc_state))
450 		return -EINVAL;
451 
452 	crtc_state->output_format = INTEL_OUTPUT_FORMAT_RGB;
453 
454 	/* LPT FDI RX only supports 8bpc. */
455 	if (HAS_PCH_LPT(display)) {
456 		/* TODO: Check crtc_state->max_link_bpp_x16 instead of bw_constrained */
457 		if (crtc_state->bw_constrained && crtc_state->pipe_bpp < 24) {
458 			drm_dbg_kms(display->drm,
459 				    "LPT only supports 24bpp\n");
460 			return -EINVAL;
461 		}
462 
463 		crtc_state->pipe_bpp = 24;
464 	}
465 
466 	/* FDI must always be 2.7 GHz */
467 	crtc_state->port_clock = 135000 * 2;
468 
469 	crtc_state->enhanced_framing = true;
470 
471 	adjusted_mode->crtc_clock = lpt_iclkip(crtc_state);
472 
473 	return 0;
474 }
475 
476 static bool ilk_crt_detect_hotplug(struct drm_connector *connector)
477 {
478 	struct intel_display *display = to_intel_display(connector->dev);
479 	struct intel_crt *crt = intel_attached_crt(to_intel_connector(connector));
480 	u32 adpa;
481 	bool ret;
482 
483 	/* The first time through, trigger an explicit detection cycle */
484 	if (crt->force_hotplug_required) {
485 		bool turn_off_dac = HAS_PCH_SPLIT(display);
486 		u32 save_adpa;
487 
488 		crt->force_hotplug_required = false;
489 
490 		save_adpa = adpa = intel_de_read(display, crt->adpa_reg);
491 		drm_dbg_kms(display->drm,
492 			    "trigger hotplug detect cycle: adpa=0x%x\n", adpa);
493 
494 		adpa |= ADPA_CRT_HOTPLUG_FORCE_TRIGGER;
495 		if (turn_off_dac)
496 			adpa &= ~ADPA_DAC_ENABLE;
497 
498 		intel_de_write(display, crt->adpa_reg, adpa);
499 
500 		if (intel_de_wait_for_clear(display,
501 					    crt->adpa_reg,
502 					    ADPA_CRT_HOTPLUG_FORCE_TRIGGER,
503 					    1000))
504 			drm_dbg_kms(display->drm,
505 				    "timed out waiting for FORCE_TRIGGER");
506 
507 		if (turn_off_dac) {
508 			intel_de_write(display, crt->adpa_reg, save_adpa);
509 			intel_de_posting_read(display, crt->adpa_reg);
510 		}
511 	}
512 
513 	/* Check the status to see if both blue and green are on now */
514 	adpa = intel_de_read(display, crt->adpa_reg);
515 	if ((adpa & ADPA_CRT_HOTPLUG_MONITOR_MASK) != 0)
516 		ret = true;
517 	else
518 		ret = false;
519 	drm_dbg_kms(display->drm, "ironlake hotplug adpa=0x%x, result %d\n",
520 		    adpa, ret);
521 
522 	return ret;
523 }
524 
525 static bool valleyview_crt_detect_hotplug(struct drm_connector *connector)
526 {
527 	struct intel_display *display = to_intel_display(connector->dev);
528 	struct intel_crt *crt = intel_attached_crt(to_intel_connector(connector));
529 	u32 adpa;
530 	bool ret;
531 	u32 save_adpa;
532 
533 	/*
534 	 * Doing a force trigger causes a hpd interrupt to get sent, which can
535 	 * get us stuck in a loop if we're polling:
536 	 *  - We enable power wells and reset the ADPA
537 	 *  - output_poll_exec does force probe on VGA, triggering a hpd
538 	 *  - HPD handler waits for poll to unlock dev->mode_config.mutex
539 	 *  - output_poll_exec shuts off the ADPA, unlocks
540 	 *    dev->mode_config.mutex
541 	 *  - HPD handler runs, resets ADPA and brings us back to the start
542 	 *
543 	 * Just disable HPD interrupts here to prevent this
544 	 */
545 	intel_hpd_block(&crt->base);
546 
547 	save_adpa = adpa = intel_de_read(display, crt->adpa_reg);
548 	drm_dbg_kms(display->drm,
549 		    "trigger hotplug detect cycle: adpa=0x%x\n", adpa);
550 
551 	adpa |= ADPA_CRT_HOTPLUG_FORCE_TRIGGER;
552 
553 	intel_de_write(display, crt->adpa_reg, adpa);
554 
555 	if (intel_de_wait_for_clear(display, crt->adpa_reg,
556 				    ADPA_CRT_HOTPLUG_FORCE_TRIGGER, 1000)) {
557 		drm_dbg_kms(display->drm,
558 			    "timed out waiting for FORCE_TRIGGER");
559 		intel_de_write(display, crt->adpa_reg, save_adpa);
560 	}
561 
562 	/* Check the status to see if both blue and green are on now */
563 	adpa = intel_de_read(display, crt->adpa_reg);
564 	if ((adpa & ADPA_CRT_HOTPLUG_MONITOR_MASK) != 0)
565 		ret = true;
566 	else
567 		ret = false;
568 
569 	drm_dbg_kms(display->drm,
570 		    "valleyview hotplug adpa=0x%x, result %d\n", adpa, ret);
571 
572 	intel_hpd_clear_and_unblock(&crt->base);
573 
574 	return ret;
575 }
576 
577 static bool intel_crt_detect_hotplug(struct drm_connector *connector)
578 {
579 	struct intel_display *display = to_intel_display(connector->dev);
580 	u32 stat;
581 	bool ret = false;
582 	int i, tries = 0;
583 
584 	if (HAS_PCH_SPLIT(display))
585 		return ilk_crt_detect_hotplug(connector);
586 
587 	if (display->platform.valleyview)
588 		return valleyview_crt_detect_hotplug(connector);
589 
590 	/*
591 	 * On 4 series desktop, CRT detect sequence need to be done twice
592 	 * to get a reliable result.
593 	 */
594 
595 	if (display->platform.g45)
596 		tries = 2;
597 	else
598 		tries = 1;
599 
600 	for (i = 0; i < tries ; i++) {
601 		/* turn on the FORCE_DETECT */
602 		i915_hotplug_interrupt_update(display,
603 					      CRT_HOTPLUG_FORCE_DETECT,
604 					      CRT_HOTPLUG_FORCE_DETECT);
605 		/* wait for FORCE_DETECT to go off */
606 		if (intel_de_wait_for_clear(display, PORT_HOTPLUG_EN(display),
607 					    CRT_HOTPLUG_FORCE_DETECT, 1000))
608 			drm_dbg_kms(display->drm,
609 				    "timed out waiting for FORCE_DETECT to go off");
610 	}
611 
612 	stat = intel_de_read(display, PORT_HOTPLUG_STAT(display));
613 	if ((stat & CRT_HOTPLUG_MONITOR_MASK) != CRT_HOTPLUG_MONITOR_NONE)
614 		ret = true;
615 
616 	/* clear the interrupt we just generated, if any */
617 	intel_de_write(display, PORT_HOTPLUG_STAT(display),
618 		       CRT_HOTPLUG_INT_STATUS);
619 
620 	i915_hotplug_interrupt_update(display, CRT_HOTPLUG_FORCE_DETECT, 0);
621 
622 	return ret;
623 }
624 
625 static const struct drm_edid *intel_crt_get_edid(struct drm_connector *connector,
626 						 struct i2c_adapter *ddc)
627 {
628 	const struct drm_edid *drm_edid;
629 
630 	drm_edid = drm_edid_read_ddc(connector, ddc);
631 
632 	if (!drm_edid && !intel_gmbus_is_forced_bit(ddc)) {
633 		drm_dbg_kms(connector->dev,
634 			    "CRT GMBUS EDID read failed, retry using GPIO bit-banging\n");
635 		intel_gmbus_force_bit(ddc, true);
636 		drm_edid = drm_edid_read_ddc(connector, ddc);
637 		intel_gmbus_force_bit(ddc, false);
638 	}
639 
640 	return drm_edid;
641 }
642 
643 /* local version of intel_ddc_get_modes() to use intel_crt_get_edid() */
644 static int intel_crt_ddc_get_modes(struct drm_connector *connector,
645 				   struct i2c_adapter *ddc)
646 {
647 	const struct drm_edid *drm_edid;
648 	int ret;
649 
650 	drm_edid = intel_crt_get_edid(connector, ddc);
651 	if (!drm_edid)
652 		return 0;
653 
654 	ret = intel_connector_update_modes(connector, drm_edid);
655 
656 	drm_edid_free(drm_edid);
657 
658 	return ret;
659 }
660 
661 static bool intel_crt_detect_ddc(struct drm_connector *connector)
662 {
663 	struct intel_display *display = to_intel_display(connector->dev);
664 	const struct drm_edid *drm_edid;
665 	bool ret = false;
666 
667 	drm_edid = intel_crt_get_edid(connector, connector->ddc);
668 
669 	if (drm_edid) {
670 		/*
671 		 * This may be a DVI-I connector with a shared DDC
672 		 * link between analog and digital outputs, so we
673 		 * have to check the EDID input spec of the attached device.
674 		 */
675 		if (drm_edid_is_digital(drm_edid)) {
676 			drm_dbg_kms(display->drm,
677 				    "CRT not detected via DDC:0x50 [EDID reports a digital panel]\n");
678 		} else {
679 			drm_dbg_kms(display->drm,
680 				    "CRT detected via DDC:0x50 [EDID]\n");
681 			ret = true;
682 		}
683 	} else {
684 		drm_dbg_kms(display->drm,
685 			    "CRT not detected via DDC:0x50 [no valid EDID found]\n");
686 	}
687 
688 	drm_edid_free(drm_edid);
689 
690 	return ret;
691 }
692 
693 static enum drm_connector_status
694 intel_crt_load_detect(struct intel_crt *crt, enum pipe pipe)
695 {
696 	struct intel_display *display = to_intel_display(&crt->base);
697 	enum transcoder cpu_transcoder = (enum transcoder)pipe;
698 	u32 save_bclrpat;
699 	u32 save_vtotal;
700 	u32 vtotal, vactive;
701 	u32 vsample;
702 	u32 vblank, vblank_start, vblank_end;
703 	u32 dsl;
704 	u8 st00;
705 	enum drm_connector_status status;
706 
707 	drm_dbg_kms(display->drm, "starting load-detect on CRT\n");
708 
709 	save_bclrpat = intel_de_read(display,
710 				     BCLRPAT(display, cpu_transcoder));
711 	save_vtotal = intel_de_read(display,
712 				    TRANS_VTOTAL(display, cpu_transcoder));
713 	vblank = intel_de_read(display,
714 			       TRANS_VBLANK(display, cpu_transcoder));
715 
716 	vtotal = REG_FIELD_GET(VTOTAL_MASK, save_vtotal) + 1;
717 	vactive = REG_FIELD_GET(VACTIVE_MASK, save_vtotal) + 1;
718 
719 	vblank_start = REG_FIELD_GET(VBLANK_START_MASK, vblank) + 1;
720 	vblank_end = REG_FIELD_GET(VBLANK_END_MASK, vblank) + 1;
721 
722 	/* Set the border color to purple. */
723 	intel_de_write(display, BCLRPAT(display, cpu_transcoder), 0x500050);
724 
725 	if (DISPLAY_VER(display) != 2) {
726 		u32 transconf = intel_de_read(display,
727 					      TRANSCONF(display, cpu_transcoder));
728 
729 		intel_de_write(display, TRANSCONF(display, cpu_transcoder),
730 			       transconf | TRANSCONF_FORCE_BORDER);
731 		intel_de_posting_read(display,
732 				      TRANSCONF(display, cpu_transcoder));
733 		/*
734 		 * Wait for next Vblank to substitute
735 		 * border color for Color info.
736 		 */
737 		intel_crtc_wait_for_next_vblank(intel_crtc_for_pipe(display, pipe));
738 		st00 = intel_de_read8(display, _VGA_MSR_WRITE);
739 		status = ((st00 & (1 << 4)) != 0) ?
740 			connector_status_connected :
741 			connector_status_disconnected;
742 
743 		intel_de_write(display, TRANSCONF(display, cpu_transcoder),
744 			       transconf);
745 	} else {
746 		bool restore_vblank = false;
747 		int count, detect;
748 
749 		/*
750 		* If there isn't any border, add some.
751 		* Yes, this will flicker
752 		*/
753 		if (vblank_start <= vactive && vblank_end >= vtotal) {
754 			u32 vsync = intel_de_read(display,
755 						  TRANS_VSYNC(display, cpu_transcoder));
756 			u32 vsync_start = REG_FIELD_GET(VSYNC_START_MASK, vsync) + 1;
757 
758 			vblank_start = vsync_start;
759 			intel_de_write(display,
760 				       TRANS_VBLANK(display, cpu_transcoder),
761 				       VBLANK_START(vblank_start - 1) |
762 				       VBLANK_END(vblank_end - 1));
763 			restore_vblank = true;
764 		}
765 		/* sample in the vertical border, selecting the larger one */
766 		if (vblank_start - vactive >= vtotal - vblank_end)
767 			vsample = (vblank_start + vactive) >> 1;
768 		else
769 			vsample = (vtotal + vblank_end) >> 1;
770 
771 		/*
772 		 * Wait for the border to be displayed
773 		 */
774 		while (intel_de_read(display, PIPEDSL(display, pipe)) >= vactive)
775 			;
776 		while ((dsl = intel_de_read(display, PIPEDSL(display, pipe))) <= vsample)
777 			;
778 		/*
779 		 * Watch ST00 for an entire scanline
780 		 */
781 		detect = 0;
782 		count = 0;
783 		do {
784 			count++;
785 			/* Read the ST00 VGA status register */
786 			st00 = intel_de_read8(display, _VGA_MSR_WRITE);
787 			if (st00 & (1 << 4))
788 				detect++;
789 		} while ((intel_de_read(display, PIPEDSL(display, pipe)) == dsl));
790 
791 		/* restore vblank if necessary */
792 		if (restore_vblank)
793 			intel_de_write(display,
794 				       TRANS_VBLANK(display, cpu_transcoder),
795 				       vblank);
796 		/*
797 		 * If more than 3/4 of the scanline detected a monitor,
798 		 * then it is assumed to be present. This works even on i830,
799 		 * where there isn't any way to force the border color across
800 		 * the screen
801 		 */
802 		status = detect * 4 > count * 3 ?
803 			 connector_status_connected :
804 			 connector_status_disconnected;
805 	}
806 
807 	/* Restore previous settings */
808 	intel_de_write(display, BCLRPAT(display, cpu_transcoder),
809 		       save_bclrpat);
810 
811 	return status;
812 }
813 
814 static int intel_spurious_crt_detect_dmi_callback(const struct dmi_system_id *id)
815 {
816 	DRM_DEBUG_DRIVER("Skipping CRT detection for %s\n", id->ident);
817 	return 1;
818 }
819 
820 static const struct dmi_system_id intel_spurious_crt_detect[] = {
821 	{
822 		.callback = intel_spurious_crt_detect_dmi_callback,
823 		.ident = "ACER ZGB",
824 		.matches = {
825 			DMI_MATCH(DMI_SYS_VENDOR, "ACER"),
826 			DMI_MATCH(DMI_PRODUCT_NAME, "ZGB"),
827 		},
828 	},
829 	{
830 		.callback = intel_spurious_crt_detect_dmi_callback,
831 		.ident = "Intel DZ77BH-55K",
832 		.matches = {
833 			DMI_MATCH(DMI_BOARD_VENDOR, "Intel Corporation"),
834 			DMI_MATCH(DMI_BOARD_NAME, "DZ77BH-55K"),
835 		},
836 	},
837 	{ }
838 };
839 
840 static int
841 intel_crt_detect(struct drm_connector *connector,
842 		 struct drm_modeset_acquire_ctx *ctx,
843 		 bool force)
844 {
845 	struct intel_display *display = to_intel_display(connector->dev);
846 	struct intel_crt *crt = intel_attached_crt(to_intel_connector(connector));
847 	struct intel_encoder *encoder = &crt->base;
848 	struct drm_atomic_state *state;
849 	intel_wakeref_t wakeref;
850 	int status;
851 
852 	drm_dbg_kms(display->drm, "[CONNECTOR:%d:%s] force=%d\n",
853 		    connector->base.id, connector->name,
854 		    force);
855 
856 	if (!intel_display_device_enabled(display))
857 		return connector_status_disconnected;
858 
859 	if (!intel_display_driver_check_access(display))
860 		return connector->status;
861 
862 	if (display->params.load_detect_test) {
863 		wakeref = intel_display_power_get(display, encoder->power_domain);
864 		goto load_detect;
865 	}
866 
867 	/* Skip machines without VGA that falsely report hotplug events */
868 	if (dmi_check_system(intel_spurious_crt_detect))
869 		return connector_status_disconnected;
870 
871 	wakeref = intel_display_power_get(display, encoder->power_domain);
872 
873 	if (HAS_HOTPLUG(display)) {
874 		/* We can not rely on the HPD pin always being correctly wired
875 		 * up, for example many KVM do not pass it through, and so
876 		 * only trust an assertion that the monitor is connected.
877 		 */
878 		if (intel_crt_detect_hotplug(connector)) {
879 			drm_dbg_kms(display->drm,
880 				    "CRT detected via hotplug\n");
881 			status = connector_status_connected;
882 			goto out;
883 		} else
884 			drm_dbg_kms(display->drm,
885 				    "CRT not detected via hotplug\n");
886 	}
887 
888 	if (intel_crt_detect_ddc(connector)) {
889 		status = connector_status_connected;
890 		goto out;
891 	}
892 
893 	/* Load detection is broken on HPD capable machines. Whoever wants a
894 	 * broken monitor (without edid) to work behind a broken kvm (that fails
895 	 * to have the right resistors for HP detection) needs to fix this up.
896 	 * For now just bail out. */
897 	if (HAS_HOTPLUG(display)) {
898 		status = connector_status_disconnected;
899 		goto out;
900 	}
901 
902 load_detect:
903 	if (!force) {
904 		status = connector->status;
905 		goto out;
906 	}
907 
908 	/* for pre-945g platforms use load detect */
909 	state = intel_load_detect_get_pipe(connector, ctx);
910 	if (IS_ERR(state)) {
911 		status = PTR_ERR(state);
912 	} else if (!state) {
913 		status = connector_status_unknown;
914 	} else {
915 		if (intel_crt_detect_ddc(connector))
916 			status = connector_status_connected;
917 		else if (DISPLAY_VER(display) < 4)
918 			status = intel_crt_load_detect(crt,
919 				to_intel_crtc(connector->state->crtc)->pipe);
920 		else if (display->params.load_detect_test)
921 			status = connector_status_disconnected;
922 		else
923 			status = connector_status_unknown;
924 		intel_load_detect_release_pipe(connector, state, ctx);
925 	}
926 
927 out:
928 	intel_display_power_put(display, encoder->power_domain, wakeref);
929 
930 	return status;
931 }
932 
933 static int intel_crt_get_modes(struct drm_connector *connector)
934 {
935 	struct intel_display *display = to_intel_display(connector->dev);
936 	struct intel_crt *crt = intel_attached_crt(to_intel_connector(connector));
937 	struct intel_encoder *encoder = &crt->base;
938 	intel_wakeref_t wakeref;
939 	struct i2c_adapter *ddc;
940 	int ret;
941 
942 	if (!intel_display_driver_check_access(display))
943 		return drm_edid_connector_add_modes(connector);
944 
945 	wakeref = intel_display_power_get(display, encoder->power_domain);
946 
947 	ret = intel_crt_ddc_get_modes(connector, connector->ddc);
948 	if (ret || !display->platform.g4x)
949 		goto out;
950 
951 	/* Try to probe digital port for output in DVI-I -> VGA mode. */
952 	ddc = intel_gmbus_get_adapter(display, GMBUS_PIN_DPB);
953 	ret = intel_crt_ddc_get_modes(connector, ddc);
954 
955 out:
956 	intel_display_power_put(display, encoder->power_domain, wakeref);
957 
958 	return ret;
959 }
960 
961 void intel_crt_reset(struct drm_encoder *encoder)
962 {
963 	struct intel_display *display = to_intel_display(encoder->dev);
964 	struct intel_crt *crt = intel_encoder_to_crt(to_intel_encoder(encoder));
965 
966 	if (DISPLAY_VER(display) >= 5) {
967 		u32 adpa;
968 
969 		adpa = intel_de_read(display, crt->adpa_reg);
970 		adpa &= ~ADPA_HOTPLUG_MASK;
971 		adpa |= ADPA_HOTPLUG_BITS;
972 		intel_de_write(display, crt->adpa_reg, adpa);
973 		intel_de_posting_read(display, crt->adpa_reg);
974 
975 		drm_dbg_kms(display->drm, "crt adpa set to 0x%x\n", adpa);
976 		crt->force_hotplug_required = true;
977 	}
978 
979 }
980 
981 /*
982  * Routines for controlling stuff on the analog port
983  */
984 
985 static const struct drm_connector_funcs intel_crt_connector_funcs = {
986 	.fill_modes = drm_helper_probe_single_connector_modes,
987 	.late_register = intel_connector_register,
988 	.early_unregister = intel_connector_unregister,
989 	.destroy = intel_connector_destroy,
990 	.atomic_destroy_state = drm_atomic_helper_connector_destroy_state,
991 	.atomic_duplicate_state = drm_atomic_helper_connector_duplicate_state,
992 };
993 
994 static const struct drm_connector_helper_funcs intel_crt_connector_helper_funcs = {
995 	.detect_ctx = intel_crt_detect,
996 	.mode_valid = intel_crt_mode_valid,
997 	.get_modes = intel_crt_get_modes,
998 };
999 
1000 static const struct drm_encoder_funcs intel_crt_enc_funcs = {
1001 	.reset = intel_crt_reset,
1002 	.destroy = intel_encoder_destroy,
1003 };
1004 
1005 void intel_crt_init(struct intel_display *display)
1006 {
1007 	struct intel_connector *connector;
1008 	struct intel_crt *crt;
1009 	i915_reg_t adpa_reg;
1010 	u8 ddc_pin;
1011 	u32 adpa;
1012 
1013 	if (HAS_PCH_SPLIT(display))
1014 		adpa_reg = PCH_ADPA;
1015 	else if (display->platform.valleyview)
1016 		adpa_reg = VLV_ADPA;
1017 	else
1018 		adpa_reg = ADPA;
1019 
1020 	adpa = intel_de_read(display, adpa_reg);
1021 	if ((adpa & ADPA_DAC_ENABLE) == 0) {
1022 		/*
1023 		 * On some machines (some IVB at least) CRT can be
1024 		 * fused off, but there's no known fuse bit to
1025 		 * indicate that. On these machine the ADPA register
1026 		 * works normally, except the DAC enable bit won't
1027 		 * take. So the only way to tell is attempt to enable
1028 		 * it and see what happens.
1029 		 */
1030 		intel_de_write(display, adpa_reg,
1031 			       adpa | ADPA_DAC_ENABLE |
1032 			       ADPA_HSYNC_CNTL_DISABLE |
1033 			       ADPA_VSYNC_CNTL_DISABLE);
1034 		if ((intel_de_read(display, adpa_reg) & ADPA_DAC_ENABLE) == 0)
1035 			return;
1036 		intel_de_write(display, adpa_reg, adpa);
1037 	}
1038 
1039 	crt = kzalloc(sizeof(struct intel_crt), GFP_KERNEL);
1040 	if (!crt)
1041 		return;
1042 
1043 	connector = intel_connector_alloc();
1044 	if (!connector) {
1045 		kfree(crt);
1046 		return;
1047 	}
1048 
1049 	ddc_pin = display->vbt.crt_ddc_pin;
1050 
1051 	drm_connector_init_with_ddc(display->drm, &connector->base,
1052 				    &intel_crt_connector_funcs,
1053 				    DRM_MODE_CONNECTOR_VGA,
1054 				    intel_gmbus_get_adapter(display, ddc_pin));
1055 
1056 	drm_encoder_init(display->drm, &crt->base.base, &intel_crt_enc_funcs,
1057 			 DRM_MODE_ENCODER_DAC, "CRT");
1058 
1059 	intel_connector_attach_encoder(connector, &crt->base);
1060 
1061 	crt->base.type = INTEL_OUTPUT_ANALOG;
1062 	crt->base.cloneable = BIT(INTEL_OUTPUT_DVO) | BIT(INTEL_OUTPUT_HDMI);
1063 	if (display->platform.i830)
1064 		crt->base.pipe_mask = BIT(PIPE_A);
1065 	else
1066 		crt->base.pipe_mask = ~0;
1067 
1068 	if (DISPLAY_VER(display) != 2)
1069 		connector->base.interlace_allowed = true;
1070 
1071 	crt->adpa_reg = adpa_reg;
1072 
1073 	crt->base.power_domain = POWER_DOMAIN_PORT_CRT;
1074 
1075 	if (HAS_HOTPLUG(display) &&
1076 	    !dmi_check_system(intel_spurious_crt_detect)) {
1077 		crt->base.hpd_pin = HPD_CRT;
1078 		crt->base.hotplug = intel_encoder_hotplug;
1079 		connector->polled = DRM_CONNECTOR_POLL_HPD;
1080 	} else {
1081 		connector->polled = DRM_CONNECTOR_POLL_CONNECT;
1082 	}
1083 	connector->base.polled = connector->polled;
1084 
1085 	if (HAS_DDI(display)) {
1086 		assert_port_valid(display, PORT_E);
1087 
1088 		crt->base.port = PORT_E;
1089 		crt->base.get_config = hsw_crt_get_config;
1090 		crt->base.get_hw_state = intel_ddi_get_hw_state;
1091 		crt->base.compute_config = hsw_crt_compute_config;
1092 		crt->base.pre_pll_enable = hsw_pre_pll_enable_crt;
1093 		crt->base.pre_enable = hsw_pre_enable_crt;
1094 		crt->base.enable = hsw_enable_crt;
1095 		crt->base.disable = hsw_disable_crt;
1096 		crt->base.post_disable = hsw_post_disable_crt;
1097 		crt->base.enable_clock = hsw_ddi_enable_clock;
1098 		crt->base.disable_clock = hsw_ddi_disable_clock;
1099 		crt->base.is_clock_enabled = hsw_ddi_is_clock_enabled;
1100 
1101 		intel_ddi_buf_trans_init(&crt->base);
1102 	} else {
1103 		if (HAS_PCH_SPLIT(display)) {
1104 			crt->base.compute_config = pch_crt_compute_config;
1105 			crt->base.disable = pch_disable_crt;
1106 			crt->base.post_disable = pch_post_disable_crt;
1107 		} else {
1108 			crt->base.compute_config = intel_crt_compute_config;
1109 			crt->base.disable = intel_disable_crt;
1110 		}
1111 		crt->base.port = PORT_NONE;
1112 		crt->base.get_config = intel_crt_get_config;
1113 		crt->base.get_hw_state = intel_crt_get_hw_state;
1114 		crt->base.enable = intel_enable_crt;
1115 	}
1116 	connector->get_hw_state = intel_connector_get_hw_state;
1117 
1118 	drm_connector_helper_add(&connector->base, &intel_crt_connector_helper_funcs);
1119 
1120 	/*
1121 	 * TODO: find a proper way to discover whether we need to set the the
1122 	 * polarity and link reversal bits or not, instead of relying on the
1123 	 * BIOS.
1124 	 */
1125 	if (HAS_PCH_LPT(display)) {
1126 		u32 fdi_config = FDI_RX_POLARITY_REVERSED_LPT |
1127 				 FDI_RX_LINK_REVERSAL_OVERRIDE;
1128 
1129 		display->fdi.rx_config = intel_de_read(display,
1130 						       FDI_RX_CTL(PIPE_A)) & fdi_config;
1131 	}
1132 
1133 	intel_crt_reset(&crt->base.base);
1134 }
1135