xref: /haiku/src/add-ons/accelerants/intel_extreme/Ports.cpp (revision dd2a1e350b303b855a50fd64e6cb55618be1ae6a)
1 /*
2  * Copyright 2006-2015, Haiku, Inc. All Rights Reserved.
3  * Distributed under the terms of the MIT License.
4  *
5  * Authors:
6  *		Axel Dörfler, axeld@pinc-software.de
7  *		Michael Lotz, mmlr@mlotz.ch
8  *		Alexander von Gluck IV, kallisti5@unixzen.com
9  *		Rudolf Cornelissen, ruud@highsand-juicylake.nl
10  */
11 
12 
13 #include "Ports.h"
14 
15 #include <ddc.h>
16 #include <dp_raw.h>
17 #include <stdlib.h>
18 #include <string.h>
19 #include <Debug.h>
20 #include <KernelExport.h>
21 
22 #include "accelerant.h"
23 #include "accelerant_protos.h"
24 #include "FlexibleDisplayInterface.h"
25 #include "intel_extreme.h"
26 #include "PanelFitter.h"
27 
28 #include <new>
29 
30 
31 #undef TRACE
32 #define TRACE_PORTS
33 #ifdef TRACE_PORTS
34 #   define TRACE(x...) _sPrintf("intel_extreme: " x)
35 #else
36 #   define TRACE(x...)
37 #endif
38 
39 #define ERROR(x...) _sPrintf("intel_extreme: " x)
40 #define CALLED(x...) TRACE("CALLED %s\n", __PRETTY_FUNCTION__)
41 
42 
43 static bool
44 wait_for_set(addr_t address, uint32 mask, uint32 timeout)
45 {
46 	int interval = 50;
47 	uint32 i = 0;
48 	for(i = 0; i <= timeout; i += interval) {
49 		spin(interval);
50 		if ((read32(address) & mask) != 0)
51 			return true;
52 	}
53 	return false;
54 }
55 
56 
57 static bool
58 wait_for_clear(addr_t address, uint32 mask, uint32 timeout)
59 {
60 	int interval = 50;
61 	uint32 i = 0;
62 	for(i = 0; i <= timeout; i += interval) {
63 		spin(interval);
64 		if ((read32(address) & mask) == 0)
65 			return true;
66 	}
67 	return false;
68 }
69 
70 
71 static uint32
72 wait_for_clear_status(addr_t address, uint32 mask, uint32 timeout)
73 {
74 	int interval = 50;
75 	uint32 i = 0;
76 	uint32 status = 0;
77 	for(i = 0; i <= timeout; i += interval) {
78 		spin(interval);
79 		status = read32(address);
80 		if ((status & mask) == 0)
81 			return status;
82 	}
83 	return status;
84 }
85 
86 
87 Port::Port(port_index index, const char* baseName)
88 	:
89 	fPipe(NULL),
90 	fEDIDState(B_NO_INIT),
91 	fPortIndex(index),
92 	fPortName(NULL)
93 {
94 	char portID[2];
95 	portID[0] = 'A' + index - INTEL_PORT_A;
96 	portID[1] = 0;
97 
98 	char buffer[32];
99 	buffer[0] = 0;
100 
101 	strlcat(buffer, baseName, sizeof(buffer));
102 	strlcat(buffer, " ", sizeof(buffer));
103 	strlcat(buffer, portID, sizeof(buffer));
104 	fPortName = strdup(buffer);
105 }
106 
107 
108 Port::~Port()
109 {
110 	free(fPortName);
111 }
112 
113 
114 bool
115 Port::HasEDID()
116 {
117 	if (fEDIDState == B_NO_INIT)
118 		GetEDID(NULL);
119 
120 	return fEDIDState == B_OK;
121 }
122 
123 
124 status_t
125 Port::SetPipe(Pipe* pipe)
126 {
127 	CALLED();
128 
129 	if (pipe == NULL) {
130 		ERROR("%s: Invalid pipe provided!\n", __func__);
131 		return B_ERROR;
132 	}
133 
134 	uint32 portRegister = _PortRegister();
135 	if (portRegister == 0) {
136 		ERROR("%s: Invalid PortRegister ((0x%" B_PRIx32 ") for %s\n", __func__,
137 			portRegister, PortName());
138 		return B_ERROR;
139 	}
140 
141 	// TODO: UnAssignPipe?  This likely needs reworked a little
142 	if (fPipe != NULL) {
143 		ERROR("%s: Can't reassign display pipe (yet)\n", __func__);
144 		return B_ERROR;
145 	}
146 
147 	switch (pipe->Index()) {
148 		case INTEL_PIPE_B:
149 			TRACE("%s: Assigning %s (0x%" B_PRIx32 ") to pipe B\n", __func__,
150 				PortName(), portRegister);
151 			break;
152 		case INTEL_PIPE_C:
153 			TRACE("%s: Assigning %s (0x%" B_PRIx32 ") to pipe C\n", __func__,
154 				PortName(), portRegister);
155 			break;
156 		case INTEL_PIPE_D:
157 			TRACE("%s: Assigning %s (0x%" B_PRIx32 ") to pipe D\n", __func__,
158 				PortName(), portRegister);
159 			break;
160 		default:
161 			TRACE("%s: Assigning %s (0x%" B_PRIx32 ") to pipe A\n", __func__,
162 				PortName(), portRegister);
163 			break;
164 	}
165 
166 	uint32 portState = read32(portRegister);
167 
168 	// generation 6 gfx SandyBridge/SNB non-DP use the same 2 bits on all ports (eDP = 1 bit).
169 	// generation 7 gfx IvyBridge/IVB non-DP use the same 2 bits on all ports (eDP = 2 bits).
170 	// DP ports/all DDI ports: Pipe selections works differently, via own SetPipe() implementation.
171 	if (gInfo->shared_info->pch_info == INTEL_PCH_CPT) {
172 		portState &= ~PORT_TRANS_SEL_MASK;
173 		switch (pipe->Index()) {
174 			case INTEL_PIPE_B:
175 				write32(portRegister, portState | PORT_TRANS_B_SEL_CPT);
176 				break;
177 			case INTEL_PIPE_C:
178 				write32(portRegister, portState | PORT_TRANS_C_SEL_CPT);
179 				break;
180 			default:
181 				write32(portRegister, portState | PORT_TRANS_A_SEL_CPT);
182 				break;
183 		}
184 	} else {
185 		// generation 3/4/5 gfx uses the same single bit on all ports
186 		if (pipe->Index() == INTEL_PIPE_A)
187 			write32(portRegister, portState & ~DISPLAY_MONITOR_PIPE_B);
188 		else
189 			write32(portRegister, portState | DISPLAY_MONITOR_PIPE_B);
190 	}
191 	fPipe = pipe;
192 
193 	if (fPipe == NULL)
194 		return B_NO_MEMORY;
195 
196 	// Disable display pipe until modesetting enables it
197 	if (fPipe->IsEnabled())
198 		fPipe->Enable(false);
199 
200 	read32(portRegister);
201 
202 	return B_OK;
203 }
204 
205 
206 status_t
207 Port::Power(bool enabled)
208 {
209 	if (fPipe == NULL) {
210 		ERROR("%s: Setting power mode without assigned pipe!\n", __func__);
211 		return B_ERROR;
212 	}
213 
214 	fPipe->Enable(enabled);
215 
216 	return B_OK;
217 }
218 
219 
220 status_t
221 Port::GetEDID(edid1_info* edid, bool forceRead)
222 {
223 	CALLED();
224 
225 	if (fEDIDState == B_NO_INIT || forceRead) {
226 		TRACE("%s: trying to read EDID\n", PortName());
227 
228 		i2c_bus bus;
229 		if (SetupI2c(&bus) != B_OK)
230 			return fEDIDState;
231 
232 		fEDIDState = ddc2_read_edid1(&bus, &fEDIDInfo, NULL, NULL);
233 
234 		if (fEDIDState == B_OK) {
235 			TRACE("%s: found EDID information!\n", PortName());
236 			edid_dump(&fEDIDInfo);
237 		} else if (SetupI2cFallback(&bus) == B_OK) {
238 			fEDIDState = ddc2_read_edid1(&bus, &fEDIDInfo, NULL, NULL);
239 
240 			if (fEDIDState == B_OK) {
241 				TRACE("%s: found EDID information!\n", PortName());
242 				edid_dump(&fEDIDInfo);
243 			}
244 		}
245 	}
246 
247 	if (fEDIDState != B_OK) {
248 		TRACE("%s: no EDID information found.\n", PortName());
249 		return fEDIDState;
250 	}
251 
252 	if (edid != NULL)
253 		memcpy(edid, &fEDIDInfo, sizeof(edid1_info));
254 
255 	return B_OK;
256 }
257 
258 
259 status_t
260 Port::SetupI2c(i2c_bus *bus)
261 {
262 	addr_t ddcRegister = _DDCRegister();
263 	if (ddcRegister == 0) {
264 		TRACE("%s: no DDC register found\n", PortName());
265 		fEDIDState = B_ERROR;
266 		return fEDIDState;
267 	}
268 
269 	TRACE("%s: using ddc @ 0x%" B_PRIxADDR "\n", PortName(), ddcRegister);
270 
271 	ddc2_init_timing(bus);
272 	bus->cookie = (void*)ddcRegister;
273 	bus->set_signals = &_SetI2CSignals;
274 	bus->get_signals = &_GetI2CSignals;
275 
276 	return B_OK;
277 }
278 
279 
280 status_t
281 Port::SetupI2cFallback(i2c_bus *bus)
282 {
283 	return B_ERROR;
284 }
285 
286 
287 status_t
288 Port::GetPLLLimits(pll_limits& limits)
289 {
290 	return B_ERROR;
291 }
292 
293 
294 pipe_index
295 Port::PipePreference()
296 {
297 	CALLED();
298 	// Ideally we could just return INTEL_PIPE_ANY for all devices by default, but
299 	// this doesn't quite work yet. We need to use the BIOS presetup pipes for now.
300 	if (gInfo->shared_info->device_type.Generation() < 4)
301 		return INTEL_PIPE_ANY;
302 
303 	// Notes:
304 	// - The BIOSes seen sofar do not use PIPE C by default.
305 	// - The BIOSes seen sofar program transcoder A to PIPE A, etc.
306 	// - Later devices add a pipe C alongside the added transcoder C.
307 
308 	if ((gInfo->shared_info->device_type.Generation() <= 7) &&
309 		(!gInfo->shared_info->device_type.HasDDI())) {
310 		uint32 portState = read32(_PortRegister());
311 		if (gInfo->shared_info->pch_info == INTEL_PCH_CPT) {
312 			portState &= PORT_TRANS_SEL_MASK;
313 			if (portState == PORT_TRANS_B_SEL_CPT)
314 				return INTEL_PIPE_B;
315 			else
316 				return INTEL_PIPE_A;
317 		} else {
318 			if (portState & DISPLAY_MONITOR_PIPE_B)
319 				return INTEL_PIPE_B;
320 			else
321 				return INTEL_PIPE_A;
322 		}
323 	}
324 
325 	if (gInfo->shared_info->device_type.HasDDI()) {
326 		// scan all our pipes to find the one connected to the current port
327 		uint32 pipeState = 0;
328 		for (uint32 pipeCnt = 0; pipeCnt < 4; pipeCnt++) {
329 			switch (pipeCnt) {
330 				case 0:
331 					pipeState = read32(PIPE_DDI_FUNC_CTL_A);
332 					break;
333 				case 1:
334 					pipeState = read32(PIPE_DDI_FUNC_CTL_B);
335 					break;
336 				case 2:
337 					pipeState = read32(PIPE_DDI_FUNC_CTL_C);
338 					break;
339 				default:
340 					pipeState = read32(PIPE_DDI_FUNC_CTL_EDP);
341 					break;
342 			}
343 
344 			if ((((pipeState & PIPE_DDI_SELECT_MASK) >> PIPE_DDI_SELECT_SHIFT) + 1)
345 				== (uint32)PortIndex()) {
346 				switch (pipeCnt) {
347 					case 0:
348 						return INTEL_PIPE_A;
349 					case 1:
350 						return INTEL_PIPE_B;
351 					case 2:
352 						return INTEL_PIPE_C;
353 					default:
354 						return INTEL_PIPE_D;
355 				}
356 			}
357 		}
358 	}
359 
360 	return INTEL_PIPE_ANY;
361 }
362 
363 
364 status_t
365 Port::_GetI2CSignals(void* cookie, int* _clock, int* _data)
366 {
367 	addr_t ioRegister = (addr_t)cookie;
368 	uint32 value = read32(ioRegister);
369 
370 	*_clock = (value & I2C_CLOCK_VALUE_IN) != 0;
371 	*_data = (value & I2C_DATA_VALUE_IN) != 0;
372 
373 	return B_OK;
374 }
375 
376 
377 status_t
378 Port::_SetI2CSignals(void* cookie, int clock, int data)
379 {
380 	addr_t ioRegister = (addr_t)cookie;
381 	uint32 value;
382 
383 	if (gInfo->shared_info->device_type.InGroup(INTEL_GROUP_83x)) {
384 		// on these chips, the reserved values are fixed
385 		value = 0;
386 	} else {
387 		// on all others, we have to preserve them manually
388 		value = read32(ioRegister) & I2C_RESERVED;
389 	}
390 
391 	// if we send clk or data, we always send low logic level;
392 	// if we want to send high level, we actually receive and let the
393 	// external pullup resistors create the high level on the bus.
394 	value |= I2C_DATA_VALUE_MASK;  //sets data = 0, always latch
395 	value |= I2C_CLOCK_VALUE_MASK; //sets clock = 0, always latch
396 
397 	if (data != 0)
398 		value |= I2C_DATA_DIRECTION_MASK;
399 	else {
400 		value |= I2C_DATA_DIRECTION_MASK | I2C_DATA_DIRECTION_OUT;
401 	}
402 
403 	if (clock != 0)
404 		value |= I2C_CLOCK_DIRECTION_MASK;
405 	else {
406 		value |= I2C_CLOCK_DIRECTION_MASK | I2C_CLOCK_DIRECTION_OUT;
407 	}
408 
409 	write32(ioRegister, value);
410 	read32(ioRegister);
411 		// make sure the PCI bus has flushed the write
412 
413 	return B_OK;
414 }
415 
416 
417 bool
418 Port::_IsPortInVBT(uint32* foundIndex)
419 {
420 	// check VBT mapping
421 	bool found = false;
422 	const uint32 deviceConfigCount = gInfo->shared_info->device_config_count;
423 	for (uint32 i = 0; i < deviceConfigCount; i++) {
424 		child_device_config& config = gInfo->shared_info->device_configs[i];
425 		if (config.dvo_port > DVO_PORT_HDMII) {
426 			ERROR("%s: DVO port unknown\n", __func__);
427 			continue;
428 		}
429 		dvo_port port = (dvo_port)config.dvo_port;
430 		switch (PortIndex()) {
431 			case INTEL_PORT_A:
432 				found = port == DVO_PORT_HDMIA || port == DVO_PORT_DPA;
433 				break;
434 			case INTEL_PORT_B:
435 				found = port == DVO_PORT_HDMIB || port == DVO_PORT_DPB;
436 				break;
437 			case INTEL_PORT_C:
438 				found = port == DVO_PORT_HDMIC || port == DVO_PORT_DPC;
439 				break;
440 			case INTEL_PORT_D:
441 				found = port == DVO_PORT_HDMID || port == DVO_PORT_DPD;
442 				break;
443 			case INTEL_PORT_E:
444 				found = port == DVO_PORT_HDMIE || port == DVO_PORT_DPE || port == DVO_PORT_CRT;
445 				break;
446 			case INTEL_PORT_F:
447 				found = port == DVO_PORT_HDMIF || port == DVO_PORT_DPF;
448 				break;
449 			case INTEL_PORT_G:
450 				found = port == DVO_PORT_HDMIG || port == DVO_PORT_DPG;
451 				break;
452 			default:
453 				ERROR("%s: DDI port unknown\n", __func__);
454 				break;
455 		}
456 		if (found) {
457 			if (foundIndex != NULL)
458 				*foundIndex = i;
459 			break;
460 		}
461 	}
462 	return found;
463 }
464 
465 
466 bool
467 Port::_IsDisplayPortInVBT()
468 {
469 	uint32 foundIndex = 0;
470 	if (!_IsPortInVBT(&foundIndex))
471 		return false;
472 	child_device_config& config = gInfo->shared_info->device_configs[foundIndex];
473 	return config.aux_channel > 0 && (config.device_type & DEVICE_TYPE_DISPLAYPORT_OUTPUT) != 0;
474 }
475 
476 
477 bool
478 Port::_IsHdmiInVBT()
479 {
480 	uint32 foundIndex = 0;
481 	if (!_IsPortInVBT(&foundIndex))
482 		return false;
483 	child_device_config& config = gInfo->shared_info->device_configs[foundIndex];
484 	return config.ddc_pin > 0 && ((config.device_type & DEVICE_TYPE_NOT_HDMI_OUTPUT) == 0
485 			|| (config.device_type & DEVICE_TYPE_TMDS_DVI_SIGNALING) != 0);
486 }
487 
488 
489 bool
490 Port::_IsEDPPort()
491 {
492 	uint32 foundIndex = 0;
493 	if (!_IsPortInVBT(&foundIndex))
494 		return false;
495 	child_device_config& config = gInfo->shared_info->device_configs[foundIndex];
496 	return (config.device_type & (DEVICE_TYPE_INTERNAL_CONNECTOR | DEVICE_TYPE_DISPLAYPORT_OUTPUT))
497 		== (DEVICE_TYPE_INTERNAL_CONNECTOR | DEVICE_TYPE_DISPLAYPORT_OUTPUT);
498 }
499 
500 
501 addr_t
502 Port::_DDCPin()
503 {
504 	uint32 foundIndex = 0;
505 	if (!_IsPortInVBT(&foundIndex))
506 		return 0;
507 	child_device_config& config = gInfo->shared_info->device_configs[foundIndex];
508 	if (gInfo->shared_info->pch_info >= INTEL_PCH_ICP) {
509 		switch (config.ddc_pin) {
510 			case 1:
511 				return INTEL_I2C_IO_A;
512 			case 2:
513 				return INTEL_I2C_IO_B;
514 			case 3:
515 				return INTEL_I2C_IO_C;
516 			case 4:
517 				return INTEL_I2C_IO_I;
518 			case 5:
519 				return INTEL_I2C_IO_J;
520 			case 6:
521 				return INTEL_I2C_IO_K;
522 			case 7:
523 				return INTEL_I2C_IO_L;
524 			case 8:
525 				return INTEL_I2C_IO_M;
526 			case 9:
527 				return INTEL_I2C_IO_N;
528 			default:
529 				return 0;
530 		}
531 	} else if (gInfo->shared_info->pch_info >= INTEL_PCH_CNP) {
532 		switch (config.ddc_pin) {
533 			case 1:
534 				return INTEL_I2C_IO_A;
535 			case 2:
536 				return INTEL_I2C_IO_B;
537 			case 3:
538 				return INTEL_I2C_IO_D;
539 			case 4:
540 				return INTEL_I2C_IO_C;
541 			default:
542 				return 0;
543 		}
544 	} else if (gInfo->shared_info->device_type.Generation() == 9) {
545 		switch (config.ddc_pin) {
546 			case 4:
547 				return INTEL_I2C_IO_D;
548 			case 5:
549 				return INTEL_I2C_IO_E;
550 			case 6:
551 				return INTEL_I2C_IO_F;
552 			default:
553 				return 0;
554 		}
555 	} else if (gInfo->shared_info->device_type.InGroup(INTEL_GROUP_BDW)) {
556 		switch (config.ddc_pin) {
557 			case 2:
558 				return INTEL_I2C_IO_A;
559 			case 4:
560 				return INTEL_I2C_IO_D;
561 			case 5:
562 				return INTEL_I2C_IO_E;
563 			case 6:
564 				return INTEL_I2C_IO_F;
565 			default:
566 				return 0;
567 		}
568 	} else {
569 		switch (config.ddc_pin) {
570 			case 1:
571 				return INTEL_I2C_IO_B;
572 			case 2:
573 				return INTEL_I2C_IO_A;
574 			case 3:
575 				return INTEL_I2C_IO_C;
576 			case 4:
577 				return INTEL_I2C_IO_D;
578 			case 5:
579 				return INTEL_I2C_IO_E;
580 			case 6:
581 				return INTEL_I2C_IO_F;
582 			default:
583 				return 0;
584 		}
585 	}
586 
587 }
588 
589 
590 status_t
591 Port::_SetupDpAuxI2c(i2c_bus *bus)
592 {
593 	CALLED();
594 
595 	ddc2_init_timing(bus);
596 	bus->cookie = this;
597 	bus->send_receive = &_DpAuxSendReceiveHook;
598 
599 	if (gInfo->shared_info->device_type.Generation() >= 11) {
600 		uint32 value = read32(ICL_PWR_WELL_CTL_AUX2);
601 		if ((value & HSW_PWR_WELL_CTL_STATE(0)) != 0)
602 			return B_OK;
603 
604 		write32(ICL_PWR_WELL_CTL_AUX2, value | HSW_PWR_WELL_CTL_REQ(0));
605 		if (!wait_for_set(ICL_PWR_WELL_CTL_AUX2, HSW_PWR_WELL_CTL_STATE(0), 1000))
606 			ERROR("%s: %s AUX didn't power on within 1000us!\n", __func__, PortName());
607 	}
608 	return B_OK;
609 }
610 
611 
612 status_t
613 Port::_DpAuxSendReceive(uint32 slaveAddress,
614 	const uint8 *writeBuffer, size_t writeLength, uint8 *readBuffer, size_t readLength)
615 {
616 	size_t transferLength = 16;
617 
618 	dp_aux_msg message;
619 	memset(&message, 0, sizeof(message));
620 
621 	if (writeBuffer != NULL) {
622 		message.address = slaveAddress;
623 		message.buffer = NULL;
624 		message.request = DP_AUX_I2C_WRITE;
625 		message.size = 0;
626 		ssize_t result = _DpAuxTransfer(&message);
627 		if (result < 0)
628 			return result;
629 
630 		for (size_t i = 0; i < writeLength;) {
631 			message.buffer = (void*)(writeBuffer + i);
632 			message.size = min_c(transferLength, writeLength - i);
633 			// Middle-Of-Transmission on final transaction
634 			if (writeLength - i > transferLength)
635 				message.request |= DP_AUX_I2C_MOT;
636 			else
637 				message.request &= ~DP_AUX_I2C_MOT;
638 
639 			for (int attempt = 0; attempt < 7; attempt++) {
640 				ssize_t result = _DpAuxTransfer(&message);
641 				if (result < 0) {
642 					ERROR("%s: aux_ch transaction failed!\n", __func__);
643 					return result;
644 				}
645 
646 				switch (message.reply & DP_AUX_I2C_REPLY_MASK) {
647 					case DP_AUX_I2C_REPLY_ACK:
648 						goto nextWrite;
649 					case DP_AUX_I2C_REPLY_NACK:
650 						TRACE("%s: aux i2c nack\n", __func__);
651 						return B_IO_ERROR;
652 					case DP_AUX_I2C_REPLY_DEFER:
653 						TRACE("%s: aux i2c defer\n", __func__);
654 						snooze(400);
655 						break;
656 					default:
657 						TRACE("%s: aux invalid I2C reply: 0x%02x\n",
658 							__func__, message.reply);
659 						return B_ERROR;
660 				}
661 			}
662 nextWrite:
663 			if (result < 0)
664 				return result;
665 			i += message.size;
666 		}
667 	}
668 
669 
670 	if (readBuffer != NULL) {
671 		message.address = slaveAddress;
672 		message.buffer = NULL;
673 		message.request = DP_AUX_I2C_READ;
674 		message.size = 0;
675 		ssize_t result = _DpAuxTransfer(&message);
676 		if (result < 0)
677 			return result;
678 
679 		for (size_t i = 0; i < readLength;) {
680 			message.buffer = readBuffer + i;
681 			message.size = min_c(transferLength, readLength - i);
682 			// Middle-Of-Transmission on final transaction
683 			if (readLength - i > transferLength)
684 				message.request |= DP_AUX_I2C_MOT;
685 			else
686 				message.request &= ~DP_AUX_I2C_MOT;
687 
688 			for (int attempt = 0; attempt < 7; attempt++) {
689 				result = _DpAuxTransfer(&message);
690 				if (result < 0) {
691 					ERROR("%s: aux_ch transaction failed!\n", __func__);
692 					return result;
693 				}
694 
695 				switch (message.reply & DP_AUX_I2C_REPLY_MASK) {
696 					case DP_AUX_I2C_REPLY_ACK:
697 						goto nextRead;
698 					case DP_AUX_I2C_REPLY_NACK:
699 						TRACE("%s: aux i2c nack\n", __func__);
700 						return B_IO_ERROR;
701 					case DP_AUX_I2C_REPLY_DEFER:
702 						TRACE("%s: aux i2c defer\n", __func__);
703 						snooze(400);
704 						break;
705 					default:
706 						TRACE("%s: aux invalid I2C reply: 0x%02x\n",
707 							__func__, message.reply);
708 						return B_ERROR;
709 				}
710 			}
711 nextRead:
712 			if (result < 0)
713 				return result;
714 			if (result == 0)
715 				i += message.size;
716 		}
717 	}
718 
719 	return B_OK;
720 }
721 
722 
723 status_t
724 Port::_DpAuxSendReceiveHook(const struct i2c_bus *bus, uint32 slaveAddress,
725 	const uint8 *writeBuffer, size_t writeLength, uint8 *readBuffer, size_t readLength)
726 {
727 	CALLED();
728 	Port* port = (Port*)bus->cookie;
729 	return port->_DpAuxSendReceive(slaveAddress, writeBuffer, writeLength, readBuffer, readLength);
730 }
731 
732 
733 ssize_t
734 Port::_DpAuxTransfer(dp_aux_msg* message)
735 {
736 	CALLED();
737 	if (message == NULL) {
738 		ERROR("%s: DP message is invalid!\n", __func__);
739 		return B_ERROR;
740 	}
741 
742 	if (message->size > 16) {
743 		ERROR("%s: Too many bytes! (%" B_PRIuSIZE ")\n", __func__,
744 			message->size);
745 		return B_ERROR;
746 	}
747 
748 	uint8 transmitSize = message->size > 0 ? 4 : 3;
749 	uint8 receiveSize;
750 
751 	switch(message->request & ~DP_AUX_I2C_MOT) {
752 		case DP_AUX_NATIVE_WRITE:
753 		case DP_AUX_I2C_WRITE:
754 		case DP_AUX_I2C_WRITE_STATUS_UPDATE:
755 			transmitSize += message->size;
756 			break;
757 	}
758 
759 	// If not bare address, check for buffer
760 	if (message->size > 0 && message->buffer == NULL) {
761 		ERROR("%s: DP message uninitalized buffer!\n", __func__);
762 		return B_ERROR;
763 	}
764 
765 	uint8 receiveBuffer[20];
766 	uint8 transmitBuffer[20];
767 	transmitBuffer[0] = (message->request << 4) | ((message->address >> 16) & 0xf);
768 	transmitBuffer[1] = (message->address >> 8) & 0xff;
769 	transmitBuffer[2] = message->address & 0xff;
770 	transmitBuffer[3] = message->size != 0 ? (message->size - 1) : 0;
771 
772 	uint8 retry;
773 	for (retry = 0; retry < 7; retry++) {
774 		ssize_t result = B_ERROR;
775 		switch(message->request & ~DP_AUX_I2C_MOT) {
776 			case DP_AUX_NATIVE_WRITE:
777 			case DP_AUX_I2C_WRITE:
778 			case DP_AUX_I2C_WRITE_STATUS_UPDATE:
779 				receiveSize = 2;
780 				if (message->buffer != NULL)
781 					memcpy(transmitBuffer + 4, message->buffer, message->size);
782 				result = _DpAuxTransfer(transmitBuffer,
783 					transmitSize, receiveBuffer, receiveSize);
784 				if (result > 0) {
785 					message->reply = receiveBuffer[0] >> 4;
786 					if (result > 1)
787 						result = min_c(receiveBuffer[1], message->size);
788 					else
789 						result = message->size;
790 				}
791 				break;
792 			case DP_AUX_NATIVE_READ:
793 			case DP_AUX_I2C_READ:
794 				receiveSize = message->size + 1;
795 				result = _DpAuxTransfer(transmitBuffer,
796 					transmitSize, receiveBuffer, receiveSize);
797 				if (result > 0) {
798 					message->reply = receiveBuffer[0] >> 4;
799 					result--;
800 					if (message->buffer != NULL)
801 						memcpy(message->buffer, receiveBuffer + 1, result);
802 				}
803 				break;
804 			default:
805 				ERROR("%s: Unknown dp_aux_msg request!\n", __func__);
806 				return B_ERROR;
807 		}
808 
809 		if (result == B_BUSY)
810 			continue;
811 		else if (result < B_OK)
812 			return result;
813 
814 		switch (message->reply & DP_AUX_NATIVE_REPLY_MASK) {
815 			case DP_AUX_NATIVE_REPLY_ACK:
816 				return B_OK;
817 			case DP_AUX_NATIVE_REPLY_NACK:
818 				TRACE("%s: aux native reply nack\n", __func__);
819 				return B_IO_ERROR;
820 			case DP_AUX_NATIVE_REPLY_DEFER:
821 				TRACE("%s: aux reply defer received. Snoozing.\n", __func__);
822 				snooze(400);
823 				break;
824 			default:
825 				TRACE("%s: aux invalid native reply: 0x%02x\n", __func__,
826 					message->reply);
827 				return B_IO_ERROR;
828 		}
829 	}
830 
831 	ERROR("%s: IO Error. %" B_PRIu8 " attempts\n", __func__, retry);
832 	return B_IO_ERROR;
833 }
834 
835 
836 ssize_t
837 Port::_DpAuxTransfer(uint8* transmitBuffer, uint8 transmitSize,
838 	uint8* receiveBuffer, uint8 receiveSize)
839 {
840 	addr_t channelControl;
841 	addr_t channelData[5];
842 	aux_channel channel = _DpAuxChannel();
843 	TRACE("%s: %s DpAuxChannel: 0x%x\n", __func__, PortName(), channel);
844 	if (gInfo->shared_info->device_type.Generation() >= 9
845 		|| (gInfo->shared_info->pch_info != INTEL_PCH_NONE && channel == AUX_CH_A)) {
846 		channelControl = DP_AUX_CH_CTL(channel);
847 		for (int i = 0; i < 5; i++)
848 			channelData[i] = DP_AUX_CH_DATA(channel, i);
849 	} else if (gInfo->shared_info->pch_info != INTEL_PCH_NONE) {
850 		channelControl = PCH_DP_AUX_CH_CTL(channel);
851 		for (int i = 0; i < 5; i++)
852 			channelData[i] = PCH_DP_AUX_CH_DATA(channel, i);
853 	} else {
854 		ERROR("Port::_DpAuxTransfer() unknown register config\n");
855 		return B_BUSY;
856 	}
857 	if (transmitSize > 20 || receiveSize > 20)
858 		return E2BIG;
859 
860 	int tries = 0;
861 	while ((read32(channelControl) & INTEL_DP_AUX_CTL_BUSY) != 0) {
862 		if (tries++ == 3) {
863 			ERROR("%s: %s AUX channel is busy!\n", __func__, PortName());
864 			return B_BUSY;
865 		}
866 		snooze(1000);
867 	}
868 
869 	uint32 sendControl = 0;
870 	if (gInfo->shared_info->device_type.Generation() >= 9) {
871 		sendControl = INTEL_DP_AUX_CTL_BUSY | INTEL_DP_AUX_CTL_DONE | INTEL_DP_AUX_CTL_INTERRUPT
872 			| INTEL_DP_AUX_CTL_TIMEOUT_ERROR | INTEL_DP_AUX_CTL_TIMEOUT_1600us | INTEL_DP_AUX_CTL_RECEIVE_ERROR
873 			| (transmitSize << INTEL_DP_AUX_CTL_MSG_SIZE_SHIFT) | INTEL_DP_AUX_CTL_FW_SYNC_PULSE_SKL(32)
874 			| INTEL_DP_AUX_CTL_SYNC_PULSE_SKL(32);
875 	} else {
876 		uint32 frequency = gInfo->shared_info->hw_cdclk;
877 		if (channel != AUX_CH_A)
878 			frequency = gInfo->shared_info->hraw_clock;
879 		uint32 aux_clock_divider = (frequency + 2000 / 2) / 2000;
880 		if (gInfo->shared_info->pch_info == INTEL_PCH_LPT && channel != AUX_CH_A)
881 			aux_clock_divider = 0x48; // or 0x3f
882 		uint32 timeout = INTEL_DP_AUX_CTL_TIMEOUT_400us;
883 		if (gInfo->shared_info->device_type.InGroup(INTEL_GROUP_BDW))
884 			timeout = INTEL_DP_AUX_CTL_TIMEOUT_600us;
885 		sendControl = INTEL_DP_AUX_CTL_BUSY | INTEL_DP_AUX_CTL_DONE | INTEL_DP_AUX_CTL_INTERRUPT
886 			| INTEL_DP_AUX_CTL_TIMEOUT_ERROR | timeout | INTEL_DP_AUX_CTL_RECEIVE_ERROR
887 			| (transmitSize << INTEL_DP_AUX_CTL_MSG_SIZE_SHIFT) | (3 << INTEL_DP_AUX_CTL_PRECHARGE_2US_SHIFT)
888 			| (aux_clock_divider << INTEL_DP_AUX_CTL_BIT_CLOCK_2X_SHIFT);
889 	}
890 
891 	uint8 retry;
892 	uint32 status = 0;
893 	for (retry = 0; retry < 5; retry++) {
894 		for (uint8 i = 0; i < transmitSize;) {
895 			uint8 index = i / 4;
896 			uint32 data = ((uint32)transmitBuffer[i++]) << 24;
897 			if (i < transmitSize)
898 				data |= ((uint32)transmitBuffer[i++]) << 16;
899 			if (i < transmitSize)
900 				data |= ((uint32)transmitBuffer[i++]) << 8;
901 			if (i < transmitSize)
902 				data |= transmitBuffer[i++];
903 			write32(channelData[index], data);
904 		}
905 		write32(channelControl, sendControl);
906 
907 		// wait 10 ms reading channelControl until INTEL_DP_AUX_CTL_BUSY
908 		status = wait_for_clear_status(channelControl, INTEL_DP_AUX_CTL_BUSY, 10000);
909 		if ((status & INTEL_DP_AUX_CTL_BUSY) != 0) {
910 			ERROR("%s: %s AUX channel stayed busy for 10000us!\n", __func__, PortName());
911 		}
912 
913 		write32(channelControl, status | INTEL_DP_AUX_CTL_DONE | INTEL_DP_AUX_CTL_TIMEOUT_ERROR
914 			| INTEL_DP_AUX_CTL_RECEIVE_ERROR);
915 		if ((status & INTEL_DP_AUX_CTL_TIMEOUT_ERROR) != 0)
916 			continue;
917 		if ((status & INTEL_DP_AUX_CTL_RECEIVE_ERROR) != 0) {
918 			snooze(400);
919 			continue;
920 		}
921 		if ((status & INTEL_DP_AUX_CTL_DONE) != 0)
922 			goto done;
923 	}
924 
925 	if ((status & INTEL_DP_AUX_CTL_DONE) == 0) {
926 		ERROR("%s: Busy Error. %" B_PRIu8 " attempts\n", __func__, retry);
927 		return B_BUSY;
928 	}
929 done:
930 	if ((status & INTEL_DP_AUX_CTL_RECEIVE_ERROR) != 0)
931 		return B_IO_ERROR;
932 	if ((status & INTEL_DP_AUX_CTL_TIMEOUT_ERROR) != 0)
933 		return B_TIMEOUT;
934 
935 	uint8 bytes = (status & INTEL_DP_AUX_CTL_MSG_SIZE_MASK) >> INTEL_DP_AUX_CTL_MSG_SIZE_SHIFT;
936 	if (bytes == 0 || bytes > 20) {
937 		ERROR("%s: Status byte count incorrect %u\n", __func__, bytes);
938 		return B_BUSY;
939 	}
940 	if (bytes > receiveSize)
941 		bytes = receiveSize;
942 	for (uint8 i = 0; i < bytes;) {
943 		uint32 data = read32(channelData[i / 4]);
944 		receiveBuffer[i++] = data >> 24;
945 		if (i < bytes)
946 			receiveBuffer[i++] = data >> 16;
947 		if (i < bytes)
948 			receiveBuffer[i++] = data >> 8;
949 		if (i < bytes)
950 			receiveBuffer[i++] = data;
951 	}
952 
953 	return bytes;
954 }
955 
956 
957 aux_channel
958 Port::_DpAuxChannel()
959 {
960 	uint32 foundIndex = 0;
961 	if (!_IsPortInVBT(&foundIndex))
962 		return AUX_CH_A;
963 	child_device_config& config = gInfo->shared_info->device_configs[foundIndex];
964 	switch (config.aux_channel) {
965 		case DP_AUX_B:
966 			return AUX_CH_B;
967 		case DP_AUX_C:
968 			return AUX_CH_C;
969 		case DP_AUX_D:
970 			return AUX_CH_D;
971 		case DP_AUX_E:
972 			return AUX_CH_E;
973 		case DP_AUX_F:
974 			return AUX_CH_F;
975 		default:
976 			return AUX_CH_A;
977 	}
978 }
979 
980 
981 // #pragma mark - Analog Port
982 
983 
984 AnalogPort::AnalogPort()
985 	:
986 	Port(INTEL_PORT_A, "Analog")
987 {
988 }
989 
990 
991 bool
992 AnalogPort::IsConnected()
993 {
994 	TRACE("%s: %s PortRegister: 0x%" B_PRIxADDR "\n", __func__, PortName(),
995 		_PortRegister());
996 	return HasEDID();
997 }
998 
999 
1000 addr_t
1001 AnalogPort::_DDCRegister()
1002 {
1003 	// always fixed
1004 	return INTEL_I2C_IO_A;
1005 }
1006 
1007 
1008 addr_t
1009 AnalogPort::_PortRegister()
1010 {
1011 	// always fixed
1012 	return INTEL_ANALOG_PORT;
1013 }
1014 
1015 
1016 status_t
1017 AnalogPort::SetDisplayMode(display_mode* target, uint32 colorMode)
1018 {
1019 	CALLED();
1020 	TRACE("%s: %s %dx%d\n", __func__, PortName(), target->timing.h_display,
1021 		target->timing.v_display);
1022 
1023 	if (fPipe == NULL) {
1024 		ERROR("%s: Setting display mode without assigned pipe!\n", __func__);
1025 		return B_ERROR;
1026 	}
1027 
1028 	// Setup PanelFitter and Train FDI if it exists
1029 	PanelFitter* fitter = fPipe->PFT();
1030 	if (fitter != NULL)
1031 		fitter->Enable(target->timing);
1032 	FDILink* link = fPipe->FDI();
1033 	if (link != NULL) {
1034 		uint32 lanes = 0;
1035 		uint32 linkBandwidth = 0;
1036 		uint32 bitsPerPixel = 0;
1037 		link->PreTrain(&target->timing, &linkBandwidth, &lanes, &bitsPerPixel);
1038 		fPipe->SetFDILink(target->timing, linkBandwidth, lanes, bitsPerPixel);
1039 		link->Train(&target->timing, lanes);
1040 	}
1041 	pll_divisors divisors;
1042 	compute_pll_divisors(&target->timing, &divisors, false);
1043 
1044 	uint32 extraPLLFlags = 0;
1045 	if (gInfo->shared_info->device_type.Generation() >= 3)
1046 		extraPLLFlags |= DISPLAY_PLL_MODE_NORMAL;
1047 
1048 	// Program general pipe config
1049 	fPipe->Configure(target);
1050 
1051 	// Program pipe PLL's
1052 	fPipe->ConfigureClocks(divisors, target->timing.pixel_clock, extraPLLFlags);
1053 
1054 	write32(_PortRegister(), (read32(_PortRegister())
1055 		& ~(DISPLAY_MONITOR_POLARITY_MASK | DISPLAY_MONITOR_VGA_POLARITY))
1056 		| ((target->timing.flags & B_POSITIVE_HSYNC) != 0
1057 			? DISPLAY_MONITOR_POSITIVE_HSYNC : 0)
1058 		| ((target->timing.flags & B_POSITIVE_VSYNC) != 0
1059 			? DISPLAY_MONITOR_POSITIVE_VSYNC : 0));
1060 
1061 	// Program target display mode
1062 	fPipe->ConfigureTimings(target);
1063 
1064 	// Set fCurrentMode to our set display mode
1065 	memcpy(&fCurrentMode, target, sizeof(display_mode));
1066 
1067 	return B_OK;
1068 }
1069 
1070 
1071 // #pragma mark - LVDS Panel
1072 
1073 
1074 LVDSPort::LVDSPort()
1075 	:
1076 	Port(INTEL_PORT_C, "LVDS")
1077 {
1078 	// Always unlock LVDS port as soon as we start messing with it.
1079 	uint32 panelControl = INTEL_PANEL_CONTROL;
1080 	if (gInfo->shared_info->pch_info != INTEL_PCH_NONE) {
1081 		// FIXME writing there results in black screen on SandyBridge
1082 		return;
1083 		// panelControl = PCH_PANEL_CONTROL;
1084 	}
1085 	write32(panelControl, read32(panelControl) | PANEL_REGISTER_UNLOCK);
1086 }
1087 
1088 
1089 pipe_index
1090 LVDSPort::PipePreference()
1091 {
1092 	CALLED();
1093 	// Older devices have hardcoded pipe/port mappings, so just use that
1094 	if (gInfo->shared_info->device_type.Generation() < 4)
1095 		return INTEL_PIPE_B;
1096 
1097 	// Ideally we could just return INTEL_PIPE_ANY for the newer devices, but
1098 	// this doesn't quite work yet.
1099 
1100 	// On SandyBridge and later, there is a transcoder C. On SandyBridge at least
1101 	// that can't be used by the LVDS port (but A and B would be fine).
1102 	// On Ibex Point, SandyBridge and IvyBridge (tested) changing pipes does not
1103 	// work yet.
1104 	// Notes:
1105 	// - Switching Pipes only works reliably when a 'full modeswitch' is executed
1106 	//   (FDI training) so we have to reuse the BIOS preset setup always for now.
1107 	// - The BIOSes seen sofar do not use PIPE C by default.
1108 	// - The BIOSes seen sofar program transcoder A to PIPE A, etc.
1109 	// - Later devices add a pipe C alongside the added transcoder C.
1110 
1111 	// FIXME How's this setup in newer gens? Currently return Pipe B fixed there..
1112 	if (gInfo->shared_info->device_type.Generation() <= 7) {
1113 		uint32 portState = read32(_PortRegister());
1114 		if (gInfo->shared_info->pch_info == INTEL_PCH_CPT) {
1115 			portState &= PORT_TRANS_SEL_MASK;
1116 			if (portState == PORT_TRANS_B_SEL_CPT)
1117 				return INTEL_PIPE_B;
1118 			else
1119 				return INTEL_PIPE_A;
1120 		} else {
1121 			if (portState & DISPLAY_MONITOR_PIPE_B)
1122 				return INTEL_PIPE_B;
1123 			else
1124 				return INTEL_PIPE_A;
1125 		}
1126 	}
1127 
1128 	return INTEL_PIPE_B;
1129 }
1130 
1131 
1132 bool
1133 LVDSPort::IsConnected()
1134 {
1135 	TRACE("%s: %s PortRegister: 0x%" B_PRIxADDR "\n", __func__, PortName(),
1136 		_PortRegister());
1137 
1138 	if (gInfo->shared_info->pch_info != INTEL_PCH_NONE) {
1139 		uint32 registerValue = read32(_PortRegister());
1140 		// there's a detection bit we can use
1141 		if ((registerValue & PCH_LVDS_DETECTED) == 0) {
1142 			TRACE("LVDS: Not detected\n");
1143 			return false;
1144 		}
1145 		// TODO: Skip if eDP support
1146 	} else if (gInfo->shared_info->device_type.Generation() <= 4) {
1147 		// Older generations don't have LVDS detection. If not mobile skip.
1148 		if (!gInfo->shared_info->device_type.IsMobile()) {
1149 			TRACE("LVDS: Skipping LVDS detection due to gen and not mobile\n");
1150 			return false;
1151 		}
1152 		// If mobile, try to grab EDID
1153 		// Linux seems to look at lid status for LVDS port detection
1154 		// If we don't get EDID, we can use vbios native mode or vesa?
1155 		if (!HasEDID()) {
1156 			if (gInfo->shared_info->has_vesa_edid_info) {
1157 				TRACE("LVDS: Using VESA edid info\n");
1158 				memcpy(&fEDIDInfo, &gInfo->shared_info->vesa_edid_info,
1159 					sizeof(edid1_info));
1160 				if (fEDIDState != B_OK) {
1161 					fEDIDState = B_OK;
1162 					// HasEDID now true
1163 					edid_dump(&fEDIDInfo);
1164 				}
1165 			} else if (gInfo->shared_info->got_vbt) {
1166 				TRACE("LVDS: No EDID, but force enabled as we have a VBT\n");
1167 				return true;
1168 			} else {
1169 				TRACE("LVDS: Couldn't find any valid EDID!\n");
1170 				return false;
1171 			}
1172 		}
1173 	}
1174 
1175 	// Try getting EDID, as the LVDS port doesn't overlap with anything else,
1176 	// we don't run the risk of getting someone else's data.
1177 	return HasEDID();
1178 }
1179 
1180 
1181 addr_t
1182 LVDSPort::_DDCRegister()
1183 {
1184 	// always fixed
1185 	return INTEL_I2C_IO_C;
1186 }
1187 
1188 
1189 addr_t
1190 LVDSPort::_PortRegister()
1191 {
1192 	// always fixed
1193 	return INTEL_DIGITAL_LVDS_PORT;
1194 }
1195 
1196 
1197 status_t
1198 LVDSPort::SetDisplayMode(display_mode* target, uint32 colorMode)
1199 {
1200 	CALLED();
1201 	if (target == NULL) {
1202 		ERROR("%s: Invalid target mode passed!\n", __func__);
1203 		return B_ERROR;
1204 	}
1205 
1206 	TRACE("%s: %s-%d %dx%d\n", __func__, PortName(), PortIndex(),
1207 		target->timing.h_display, target->timing.v_display);
1208 
1209 	if (fPipe == NULL) {
1210 		ERROR("%s: Setting display mode without assigned pipe!\n", __func__);
1211 		return B_ERROR;
1212 	}
1213 
1214 	addr_t panelControl = INTEL_PANEL_CONTROL;
1215 	addr_t panelStatus = INTEL_PANEL_STATUS;
1216 	if (gInfo->shared_info->pch_info != INTEL_PCH_NONE) {
1217 		panelControl = PCH_PANEL_CONTROL;
1218 		panelStatus = PCH_PANEL_STATUS;
1219 	}
1220 
1221 	if (gInfo->shared_info->device_type.Generation() != 4) {
1222 		// TODO not needed on any generation if we are using the panel fitter
1223 		// Power off Panel
1224 		write32(panelControl,
1225 			read32(panelControl) & ~PANEL_CONTROL_POWER_TARGET_ON);
1226 		read32(panelControl);
1227 
1228 		if (!wait_for_clear(panelStatus, PANEL_STATUS_POWER_ON, 1000)) {
1229 			ERROR("%s: %s didn't power off within 1000ms!\n", __func__,
1230 				PortName());
1231 		}
1232 	}
1233 
1234 	// For LVDS panels, we may need to set the timings according to the panel
1235 	// native video mode, and let the panel fitter do the scaling. But the
1236 	// place where the scaling happens varies accross generations of devices.
1237 	display_timing hardwareTarget;
1238 	bool needsScaling = false;
1239 
1240 	// TODO figure out how it's done (or if we need to configure something at
1241 	// all) for other generations
1242 	if (gInfo->shared_info->device_type.Generation() <= 6
1243 		&& gInfo->shared_info->device_type.Generation() >= 3
1244 		&& gInfo->shared_info->got_vbt) {
1245 		// Set vbios hardware panel mode as base
1246 		hardwareTarget = gInfo->shared_info->panel_timing;
1247 
1248 		if (hardwareTarget.h_display == target->timing.h_display
1249 				&& hardwareTarget.v_display == target->timing.v_display) {
1250 			// We are setting the native video mode, nothing special to do
1251 			// Note: this means refresh and timing might vary according to requested mode.
1252 			hardwareTarget = target->timing;
1253 			TRACE("%s: Setting LVDS to native resolution at %" B_PRIu32 "Hz\n", __func__,
1254 				hardwareTarget.pixel_clock * 1000 / (hardwareTarget.h_total * hardwareTarget.v_total));
1255 		} else {
1256 			// We need to enable the panel fitter
1257 			TRACE("%s: Hardware mode will actually be %dx%d at %" B_PRIu32 "Hz\n", __func__,
1258 				hardwareTarget.h_display, hardwareTarget.v_display,
1259 				hardwareTarget.pixel_clock * 1000 / (hardwareTarget.h_total * hardwareTarget.v_total));
1260 
1261 			// FIXME we should also get the refresh frequency from the target
1262 			// mode, and then "sanitize" the resulting mode we made up.
1263 			needsScaling = true;
1264 		}
1265 	} else {
1266 		TRACE("Setting LVDS mode without VBT info or on unhandled hardware "
1267 			"generation, scaling may not work\n");
1268 		// We don't have VBT data, try to set the requested mode directly
1269 		// and hope for the best
1270 		hardwareTarget = target->timing;
1271 	}
1272 
1273 	// Setup PanelFitter and Train FDI if it exists
1274 	PanelFitter* fitter = fPipe->PFT();
1275 	if (fitter != NULL)
1276 		fitter->Enable(hardwareTarget);
1277 	FDILink* link = fPipe->FDI();
1278 	if (link != NULL) {
1279 		uint32 lanes = 0;
1280 		uint32 linkBandwidth = 0;
1281 		uint32 bitsPerPixel = 0;
1282 		link->PreTrain(&hardwareTarget, &linkBandwidth, &lanes, &bitsPerPixel);
1283 		fPipe->SetFDILink(hardwareTarget, linkBandwidth, lanes, bitsPerPixel);
1284 		link->Train(&hardwareTarget, lanes);
1285 	}
1286 
1287 	pll_divisors divisors;
1288 	compute_pll_divisors(&hardwareTarget, &divisors, true);
1289 
1290 	uint32 lvds = read32(_PortRegister())
1291 		| LVDS_PORT_EN | LVDS_A0A2_CLKA_POWER_UP;
1292 
1293 	if (gInfo->shared_info->device_type.Generation() == 4) {
1294 		// LVDS_A3_POWER_UP == 24bpp
1295 		// otherwise, 18bpp
1296 		if ((lvds & LVDS_A3_POWER_MASK) != LVDS_A3_POWER_UP)
1297 			lvds |= LVDS_18BIT_DITHER;
1298 	}
1299 
1300 	// LVDS on PCH needs set before display enable
1301 	if (gInfo->shared_info->pch_info == INTEL_PCH_CPT) {
1302 		lvds &= ~PORT_TRANS_SEL_MASK;
1303 		if (fPipe->Index() == INTEL_PIPE_A)
1304 			lvds |= PORT_TRANS_A_SEL_CPT;
1305 		else
1306 			lvds |= PORT_TRANS_B_SEL_CPT;
1307 	}
1308 
1309 	// Set the B0-B3 data pairs corresponding to whether we're going to
1310 	// set the DPLLs for dual-channel mode or not.
1311 	if (divisors.p2 == 5 || divisors.p2 == 7) {
1312 		TRACE("LVDS: dual channel\n");
1313 		lvds |= LVDS_B0B3_POWER_UP | LVDS_CLKB_POWER_UP;
1314 	} else {
1315 		TRACE("LVDS: single channel\n");
1316 		lvds &= ~(LVDS_B0B3_POWER_UP | LVDS_CLKB_POWER_UP);
1317 	}
1318 
1319 	// LVDS port control moves polarity bits because Intel hates you.
1320 	// Set LVDS sync polarity
1321 	lvds &= ~(LVDS_HSYNC_POLARITY | LVDS_VSYNC_POLARITY);
1322 
1323 	// set on - polarity.
1324 	if ((target->timing.flags & B_POSITIVE_HSYNC) == 0)
1325 		lvds |= LVDS_HSYNC_POLARITY;
1326 	if ((target->timing.flags & B_POSITIVE_VSYNC) == 0)
1327 		lvds |= LVDS_VSYNC_POLARITY;
1328 
1329 	TRACE("%s: LVDS Write: 0x%" B_PRIx32 "\n", __func__, lvds);
1330 	write32(_PortRegister(), lvds);
1331 	read32(_PortRegister());
1332 
1333 	uint32 extraPLLFlags = 0;
1334 
1335 	// DPLL mode LVDS for i915+
1336 	if (gInfo->shared_info->device_type.Generation() >= 3)
1337 		extraPLLFlags |= DISPLAY_PLL_MODE_LVDS | DISPLAY_PLL_2X_CLOCK;
1338 
1339 	// Program general pipe config
1340 	fPipe->Configure(target);
1341 
1342 	// Program pipe PLL's (using the hardware mode timings, since that's what
1343 	// the PLL is used for)
1344 	fPipe->ConfigureClocks(divisors, hardwareTarget.pixel_clock,
1345 		extraPLLFlags);
1346 
1347 	if (gInfo->shared_info->device_type.Generation() != 4) {
1348 		// G45: no need to power the panel off
1349 		// Power on Panel
1350 		write32(panelControl,
1351 			read32(panelControl) | PANEL_CONTROL_POWER_TARGET_ON);
1352 		read32(panelControl);
1353 
1354 		if (!wait_for_set(panelStatus, PANEL_STATUS_POWER_ON, 1000)) {
1355 			ERROR("%s: %s didn't power on within 1000us!\n", __func__,
1356 				PortName());
1357 		}
1358 	}
1359 
1360 	// Program target display mode
1361 	fPipe->ConfigureTimings(target, !needsScaling);
1362 
1363 	if (needsScaling) {
1364 		if (gInfo->shared_info->device_type.Generation() <= 4) {
1365 			// Enable panel fitter in automatic mode. It will figure out
1366 			// the scaling ratios automatically.
1367 			uint32 panelFitterControl = read32(INTEL_PANEL_FIT_CONTROL);
1368 			panelFitterControl |= PANEL_FITTER_ENABLED;
1369 			panelFitterControl &= ~(PANEL_FITTER_SCALING_MODE_MASK
1370 				| PANEL_FITTER_PIPE_MASK);
1371 			panelFitterControl |= PANEL_FITTER_PIPE_B;
1372 			// LVDS is always on pipe B.
1373 			write32(INTEL_PANEL_FIT_CONTROL, panelFitterControl);
1374 		}
1375 		// TODO do we need to do anything on later generations?
1376 	} else {
1377 		if (gInfo->shared_info->device_type.Generation() == 4
1378 			|| gInfo->shared_info->device_type.Generation() == 3) {
1379 			// Bypass the panel fitter
1380 			uint32 panelFitterControl = read32(INTEL_PANEL_FIT_CONTROL);
1381 			panelFitterControl &= ~PANEL_FITTER_ENABLED;
1382 			write32(INTEL_PANEL_FIT_CONTROL, panelFitterControl);
1383 		} else {
1384 			// We don't need to do anything more for later generations, the
1385 			// scaling is handled at the transcoder level. We may want to
1386 			// configure dithering, but the code below ignores the previous
1387 			// value in the register and may mess things up so we should do
1388 			// this in a safeer way. For now, assume the BIOS did the right
1389 			// thing.
1390 #if 0
1391 			// Disable panel fitting, but enable 8 to 6-bit dithering
1392 			write32(INTEL_PANEL_FIT_CONTROL, 0x4);
1393 				// TODO: do not do this if the connected panel is 24-bit
1394 				// (I don't know how to detect that)
1395 #endif
1396 		}
1397 	}
1398 
1399 	// Set fCurrentMode to our set display mode
1400 	memcpy(&fCurrentMode, target, sizeof(display_mode));
1401 
1402 	return B_OK;
1403 }
1404 
1405 
1406 // #pragma mark - DVI/SDVO/generic
1407 
1408 
1409 DigitalPort::DigitalPort(port_index index, const char* baseName)
1410 	:
1411 	Port(index, baseName)
1412 {
1413 }
1414 
1415 
1416 bool
1417 DigitalPort::IsConnected()
1418 {
1419 	TRACE("%s: %s PortRegister: 0x%" B_PRIxADDR "\n", __func__, PortName(),
1420 		_PortRegister());
1421 
1422 	// As this port overlaps with pretty much everything, this must be called
1423 	// after having ruled out all other port types.
1424 	return HasEDID();
1425 }
1426 
1427 
1428 addr_t
1429 DigitalPort::_DDCRegister()
1430 {
1431 	//TODO: IS BROXTON, B = B, C = C, D = NIL
1432 	switch (PortIndex()) {
1433 		case INTEL_PORT_B:
1434 			return INTEL_I2C_IO_E;
1435 		case INTEL_PORT_C:
1436 			return INTEL_I2C_IO_D;
1437 		case INTEL_PORT_D:
1438 			return INTEL_I2C_IO_F;
1439 		default:
1440 			return 0;
1441 	}
1442 
1443 	return 0;
1444 }
1445 
1446 
1447 addr_t
1448 DigitalPort::_PortRegister()
1449 {
1450 	switch (PortIndex()) {
1451 		case INTEL_PORT_A:
1452 			return INTEL_DIGITAL_PORT_A;
1453 		case INTEL_PORT_B:
1454 			return INTEL_DIGITAL_PORT_B;
1455 		case INTEL_PORT_C:
1456 			return INTEL_DIGITAL_PORT_C;
1457 		default:
1458 			return 0;
1459 	}
1460 	return 0;
1461 }
1462 
1463 
1464 status_t
1465 DigitalPort::SetDisplayMode(display_mode* target, uint32 colorMode)
1466 {
1467 	CALLED();
1468 	TRACE("%s: %s %dx%d\n", __func__, PortName(), target->timing.h_display,
1469 		target->timing.v_display);
1470 
1471 	if (fPipe == NULL) {
1472 		ERROR("%s: Setting display mode without assigned pipe!\n", __func__);
1473 		return B_ERROR;
1474 	}
1475 
1476 	// Setup PanelFitter and Train FDI if it exists
1477 	PanelFitter* fitter = fPipe->PFT();
1478 	if (fitter != NULL)
1479 		fitter->Enable(target->timing);
1480 	FDILink* link = fPipe->FDI();
1481 	if (link != NULL) {
1482 		uint32 lanes = 0;
1483 		uint32 linkBandwidth = 0;
1484 		uint32 bitsPerPixel = 0;
1485 		link->PreTrain(&target->timing, &linkBandwidth, &lanes, &bitsPerPixel);
1486 		fPipe->SetFDILink(target->timing, linkBandwidth, lanes, bitsPerPixel);
1487 		link->Train(&target->timing, lanes);
1488 	}
1489 
1490 	pll_divisors divisors;
1491 	compute_pll_divisors(&target->timing, &divisors, false);
1492 
1493 	uint32 extraPLLFlags = 0;
1494 	if (gInfo->shared_info->device_type.Generation() >= 3)
1495 		extraPLLFlags |= DISPLAY_PLL_MODE_NORMAL | DISPLAY_PLL_2X_CLOCK;
1496 
1497 	// Program general pipe config
1498 	fPipe->Configure(target);
1499 
1500 	// Program pipe PLL's
1501 	fPipe->ConfigureClocks(divisors, target->timing.pixel_clock, extraPLLFlags);
1502 
1503 	// Program target display mode
1504 	fPipe->ConfigureTimings(target);
1505 
1506 	// Set fCurrentMode to our set display mode
1507 	memcpy(&fCurrentMode, target, sizeof(display_mode));
1508 
1509 	return B_OK;
1510 }
1511 
1512 
1513 // #pragma mark - LVDS Panel
1514 // #pragma mark - HDMI
1515 
1516 
1517 HDMIPort::HDMIPort(port_index index)
1518 	:
1519 	DigitalPort(index, "HDMI")
1520 {
1521 }
1522 
1523 
1524 bool
1525 HDMIPort::IsConnected()
1526 {
1527 	if (!gInfo->shared_info->device_type.SupportsHDMI())
1528 		return false;
1529 
1530 	addr_t portRegister = _PortRegister();
1531 	TRACE("%s: %s PortRegister: 0x%" B_PRIxADDR "\n", __func__, PortName(),
1532 		portRegister);
1533 
1534 	if (portRegister == 0)
1535 		return false;
1536 
1537 	const uint32 deviceConfigCount = gInfo->shared_info->device_config_count;
1538 	if (gInfo->shared_info->device_type.Generation() >= 6 && deviceConfigCount > 0) {
1539 		// check VBT mapping
1540 		if (!_IsPortInVBT()) {
1541 			TRACE("%s: %s: port not found in VBT\n", __func__, PortName());
1542 			return false;
1543 		} else
1544 			TRACE("%s: %s: port found in VBT\n", __func__, PortName());
1545 	}
1546 
1547 	//Notes:
1548 	//- DISPLAY_MONITOR_PORT_DETECTED does only tell you *some* sort of digital display is
1549 	//  connected to the port *if* you have the AUX channel stuff under power. It does not
1550 	//  tell you which -type- of digital display is connected.
1551 	//- Since we rely on the BIOS anyway, let's just use the conclusions it made for us :)
1552 	//  Beware though: set_display_power_mode() uses this DISPLAY_MONITOR_PORT_ENABLED bit
1553 	//  for DPMS as well. So we should better buffer our findings here for i.e. possible
1554 	//  accelerant clones starting up. For DPMS there's currently no problem as this bit
1555 	//  is only programmed for LVDS, DVI and VGA while we detect presence only for DP and HDMI.
1556 	//
1557 	//if ((read32(portRegister) & DISPLAY_MONITOR_PORT_DETECTED) == 0)
1558 	if ((read32(portRegister) & DISPLAY_MONITOR_PORT_ENABLED) == 0)
1559 		return false;
1560 
1561 	return HasEDID();
1562 }
1563 
1564 
1565 addr_t
1566 HDMIPort::_PortRegister()
1567 {
1568 	// on PCH there's an additional port sandwiched in
1569 	bool hasPCH = (gInfo->shared_info->pch_info != INTEL_PCH_NONE);
1570 	bool fourthGen = gInfo->shared_info->device_type.InGroup(INTEL_GROUP_VLV);
1571 
1572 	switch (PortIndex()) {
1573 		case INTEL_PORT_B:
1574 			if (fourthGen)
1575 				return GEN4_HDMI_PORT_B;
1576 			return hasPCH ? PCH_HDMI_PORT_B : INTEL_HDMI_PORT_B;
1577 		case INTEL_PORT_C:
1578 			if (fourthGen)
1579 				return GEN4_HDMI_PORT_C;
1580 			return hasPCH ? PCH_HDMI_PORT_C : INTEL_HDMI_PORT_C;
1581 		case INTEL_PORT_D:
1582 			if (gInfo->shared_info->device_type.InGroup(INTEL_GROUP_CHV))
1583 				return CHV_HDMI_PORT_D;
1584 			return hasPCH ? PCH_HDMI_PORT_D : 0;
1585 		default:
1586 			return 0;
1587 		}
1588 
1589 	return 0;
1590 }
1591 
1592 
1593 // #pragma mark - DisplayPort
1594 
1595 
1596 DisplayPort::DisplayPort(port_index index, const char* baseName)
1597 	:
1598 	Port(index, baseName)
1599 {
1600 }
1601 
1602 
1603 pipe_index
1604 DisplayPort::PipePreference()
1605 {
1606 	CALLED();
1607 	if (gInfo->shared_info->device_type.Generation() <= 4)
1608 		return INTEL_PIPE_ANY;
1609 
1610 	// Notes:
1611 	// - The BIOSes seen sofar do not use PIPE C by default.
1612 	// - Looks like BIOS selected Transcoder (A,B,C) is not always same as selected Pipe (A,B,C)
1613 	//   so these should probably be handled seperately. For now this is OK as we don't touch
1614 	//   the pipe for DisplayPort, only the transcoder..
1615 	uint32 TranscoderPort = INTEL_TRANS_DP_PORT_NONE;
1616 	switch (PortIndex()) {
1617 		case INTEL_PORT_A:
1618 			if (gInfo->shared_info->device_type.Generation() == 6) {
1619 				if (((read32(INTEL_DISPLAY_PORT_A) & INTEL_DISP_PORTA_SNB_PIPE_MASK)
1620 					>> INTEL_DISP_PORTA_SNB_PIPE_SHIFT) == INTEL_DISP_PORTA_SNB_PIPE_A) {
1621 					return INTEL_PIPE_A;
1622 				} else {
1623 					return INTEL_PIPE_B;
1624 				}
1625 			}
1626 			if (gInfo->shared_info->device_type.Generation() == 7) {
1627 				uint32 Pipe = (read32(INTEL_DISPLAY_PORT_A) & INTEL_DISP_PORTA_IVB_PIPE_MASK)
1628 					>> INTEL_DISP_PORTA_IVB_PIPE_SHIFT;
1629 				switch (Pipe) {
1630 					case INTEL_DISP_PORTA_IVB_PIPE_A:
1631 						return INTEL_PIPE_A;
1632 					case INTEL_DISP_PORTA_IVB_PIPE_B:
1633 						return INTEL_PIPE_B;
1634 					case INTEL_DISP_PORTA_IVB_PIPE_C:
1635 						return INTEL_PIPE_C;
1636 					default:
1637 						return INTEL_PIPE_ANY;
1638 				}
1639 			}
1640 			return INTEL_PIPE_ANY;
1641 		case INTEL_PORT_B:
1642 			TranscoderPort = INTEL_TRANS_DP_PORT_B;
1643 			break;
1644 		case INTEL_PORT_C:
1645 			TranscoderPort = INTEL_TRANS_DP_PORT_C;
1646 			break;
1647 		case INTEL_PORT_D:
1648 			TranscoderPort = INTEL_TRANS_DP_PORT_D;
1649 			break;
1650 		default:
1651 			return INTEL_PIPE_ANY;
1652 	}
1653 
1654 	for (uint32 Transcoder = 0; Transcoder < 3; Transcoder++) {
1655 		if ((read32(INTEL_TRANSCODER_A_DP_CTL + (Transcoder << 12)) & INTEL_TRANS_DP_PORT_MASK) ==
1656 			INTEL_TRANS_DP_PORT(TranscoderPort)) {
1657 			switch (Transcoder) {
1658 				case 0:
1659 					return INTEL_PIPE_A;
1660 				case 1:
1661 					return INTEL_PIPE_B;
1662 				case 2:
1663 					return INTEL_PIPE_C;
1664 			}
1665 		}
1666 	}
1667 
1668 	return INTEL_PIPE_ANY;
1669 }
1670 
1671 
1672 status_t
1673 DisplayPort::SetPipe(Pipe* pipe)
1674 {
1675 	CALLED();
1676 
1677 	if (pipe == NULL) {
1678 		ERROR("%s: Invalid pipe provided!\n", __func__);
1679 		return B_ERROR;
1680 	}
1681 
1682 	// TODO: UnAssignPipe?  This likely needs reworked a little
1683 	if (fPipe != NULL) {
1684 		ERROR("%s: Can't reassign display pipe (yet)\n", __func__);
1685 		return B_ERROR;
1686 	}
1687 
1688 	// generation 3/4/5 gfx have no eDP ports.
1689 	// generation 6 gfx SandyBridge/SNB uses one bit (b30) on the eDP port.
1690 	// generation 7 gfx IvyBridge/IVB uses 2 bits (b29-30) on the eDP port.
1691 	// on all other DP ports pipe selections works differently (indirect).
1692 	// fixme: implement..
1693 	TRACE("%s: Assuming pipe is assigned by BIOS (fixme)\n", __func__);
1694 
1695 	fPipe = pipe;
1696 
1697 	if (fPipe == NULL)
1698 		return B_NO_MEMORY;
1699 
1700 	// Disable display pipe until modesetting enables it
1701 	if (fPipe->IsEnabled())
1702 		fPipe->Enable(false);
1703 
1704 	return B_OK;
1705 }
1706 
1707 
1708 status_t
1709 DisplayPort::SetupI2c(i2c_bus *bus)
1710 {
1711 	CALLED();
1712 
1713 	const uint32 deviceConfigCount = gInfo->shared_info->device_config_count;
1714 	if (gInfo->shared_info->device_type.Generation() >= 6 && deviceConfigCount > 0) {
1715 		if (!_IsDisplayPortInVBT())
1716 			return Port::SetupI2c(bus);
1717 	}
1718 
1719 	return _SetupDpAuxI2c(bus);
1720 }
1721 
1722 
1723 bool
1724 DisplayPort::IsConnected()
1725 {
1726 	addr_t portRegister = _PortRegister();
1727 
1728 	TRACE("%s: %s PortRegister: 0x%" B_PRIxADDR "\n", __func__, PortName(),
1729 		portRegister);
1730 
1731 	if (portRegister == 0)
1732 		return false;
1733 
1734 	const uint32 deviceConfigCount = gInfo->shared_info->device_config_count;
1735 	if (gInfo->shared_info->device_type.Generation() >= 6 && deviceConfigCount > 0) {
1736 		// check VBT mapping
1737 		if (!_IsPortInVBT()) {
1738 			TRACE("%s: %s: port not found in VBT\n", __func__, PortName());
1739 			return false;
1740 		} else
1741 			TRACE("%s: %s: port found in VBT\n", __func__, PortName());
1742 	}
1743 
1744 	//Notes:
1745 	//- DISPLAY_MONITOR_PORT_DETECTED does only tell you *some* sort of digital display is
1746 	//  connected to the port *if* you have the AUX channel stuff under power. It does not
1747 	//  tell you which -type- of digital display is connected.
1748 	//- Since we rely on the BIOS anyway, let's just use the conclusions it made for us :)
1749 	//  Beware though: set_display_power_mode() uses this DISPLAY_MONITOR_PORT_ENABLED bit
1750 	//  for DPMS as well. So we should better buffer our findings here for i.e. possible
1751 	//  accelerant clones starting up. For DPMS there's currently no problem as this bit
1752 	//  is only programmed for LVDS, DVI and VGA while we detect presence only for DP and HDMI.
1753 	//
1754 	//if ((read32(portRegister) & DISPLAY_MONITOR_PORT_DETECTED) == 0) {
1755 	if ((read32(portRegister) & DISPLAY_MONITOR_PORT_ENABLED) == 0) {
1756 		TRACE("%s: %s link not detected\n", __func__, PortName());
1757 		return false;
1758 	}
1759 
1760 	TRACE("%s: %s link detected\n", __func__, PortName());
1761 	bool edidDetected = HasEDID();
1762 
1763 	// On laptops we always have an internal panel.. (this is on the eDP port)
1764 	if ((gInfo->shared_info->device_type.IsMobile() || _IsEDPPort())
1765 		&& (PortIndex() == INTEL_PORT_A) && !edidDetected) {
1766 		if (gInfo->shared_info->has_vesa_edid_info) {
1767 			TRACE("%s: Laptop. Using VESA edid info\n", __func__);
1768 			memcpy(&fEDIDInfo, &gInfo->shared_info->vesa_edid_info,
1769 				sizeof(edid1_info));
1770 			if (fEDIDState != B_OK) {
1771 				fEDIDState = B_OK;
1772 				// HasEDID now true
1773 				edid_dump(&fEDIDInfo);
1774 			}
1775 			return true;
1776 		} else if (gInfo->shared_info->got_vbt) {
1777 			TRACE("%s: Laptop. No EDID, but force enabled as we have a VBT\n", __func__);
1778 			return true;
1779 		}
1780 	}
1781 
1782 	//since EDID is not correctly implemented yet for this connection type we'll do without it for now
1783 	//return HasEDID();
1784 	return true;
1785 }
1786 
1787 
1788 addr_t
1789 DisplayPort::_DDCRegister()
1790 {
1791 	return 0;
1792 }
1793 
1794 
1795 addr_t
1796 DisplayPort::_PortRegister()
1797 {
1798 	// There are 6000 lines of intel linux code probing DP registers
1799 	// to properly detect DP vs eDP to then in-turn properly figure out
1800 	// what is DP and what is HDMI. It only takes 3 lines to
1801 	// ignore DisplayPort on ValleyView / CherryView
1802 
1803 	if (gInfo->shared_info->device_type.InGroup(INTEL_GROUP_VLV)
1804 		|| gInfo->shared_info->device_type.InGroup(INTEL_GROUP_CHV)) {
1805 		ERROR("TODO: DisplayPort on ValleyView / CherryView");
1806 		return 0;
1807 	}
1808 
1809 	// Intel, are humans even involved anymore?
1810 	// This is a lot more complex than this code makes it look. (see defines)
1811 	// INTEL_DISPLAY_PORT_X moves around a lot based on PCH
1812 	// except on ValleyView and CherryView.
1813 	switch (PortIndex()) {
1814 		case INTEL_PORT_A:
1815 			return INTEL_DISPLAY_PORT_A;
1816 		case INTEL_PORT_B:
1817 			if (gInfo->shared_info->device_type.InGroup(INTEL_GROUP_VLV))
1818 				return VLV_DISPLAY_PORT_B;
1819 			return INTEL_DISPLAY_PORT_B;
1820 		case INTEL_PORT_C:
1821 			if (gInfo->shared_info->device_type.InGroup(INTEL_GROUP_VLV))
1822 				return VLV_DISPLAY_PORT_C;
1823 			return INTEL_DISPLAY_PORT_C;
1824 		case INTEL_PORT_D:
1825 			if (gInfo->shared_info->device_type.InGroup(INTEL_GROUP_CHV))
1826 				return CHV_DISPLAY_PORT_D;
1827 			else if (gInfo->shared_info->device_type.InGroup(INTEL_GROUP_VLV))
1828 				return 0;
1829 			return INTEL_DISPLAY_PORT_D;
1830 		default:
1831 			return 0;
1832 	}
1833 
1834 	return 0;
1835 }
1836 
1837 
1838 status_t
1839 DisplayPort::_SetPortLinkGen4(const display_timing& timing)
1840 {
1841 	// Khz / 10. ( each output octet encoded as 10 bits.
1842 	//fixme: always so?
1843 	uint32 linkBandwidth = 270000; //khz
1844 	uint32 fPipeOffset = 0;
1845 	if (fPipe->Index() == INTEL_PIPE_B)
1846 		fPipeOffset = 0x1000;
1847 
1848 	TRACE("%s: DP M1 data before: 0x%" B_PRIx32 "\n", __func__, read32(INTEL_PIPE_A_DATA_M + fPipeOffset));
1849 	TRACE("%s: DP N1 data before: 0x%" B_PRIx32 "\n", __func__, read32(INTEL_PIPE_A_DATA_N + fPipeOffset));
1850 	TRACE("%s: DP M1 link before: 0x%" B_PRIx32 "\n", __func__, read32(INTEL_PIPE_A_LINK_M + fPipeOffset));
1851 	TRACE("%s: DP N1 link before: 0x%" B_PRIx32 "\n", __func__, read32(INTEL_PIPE_A_LINK_N + fPipeOffset));
1852 
1853 	uint32 bitsPerPixel = 24;	//fixme: always so?
1854 	uint32 lanes = 4;			//fixme: always so?
1855 
1856 	//Setup Data M/N
1857 	uint64 linkspeed = lanes * linkBandwidth * 8;
1858 	uint64 ret_n = 1;
1859 	while(ret_n < linkspeed) {
1860 		ret_n *= 2;
1861 	}
1862 	if (ret_n > 0x800000) {
1863 		ret_n = 0x800000;
1864 	}
1865 	uint64 ret_m = timing.pixel_clock * ret_n * bitsPerPixel / linkspeed;
1866 	while ((ret_n > 0xffffff) || (ret_m > 0xffffff)) {
1867 		ret_m >>= 1;
1868 		ret_n >>= 1;
1869 	}
1870 	//Set TU size bits (to default, max) before link training so that error detection works
1871 	write32(INTEL_PIPE_A_DATA_M + fPipeOffset, ret_m | FDI_PIPE_MN_TU_SIZE_MASK);
1872 	write32(INTEL_PIPE_A_DATA_N + fPipeOffset, ret_n);
1873 
1874 	//Setup Link M/N
1875 	linkspeed = linkBandwidth;
1876 	ret_n = 1;
1877 	while(ret_n < linkspeed) {
1878 		ret_n *= 2;
1879 	}
1880 	if (ret_n > 0x800000) {
1881 		ret_n = 0x800000;
1882 	}
1883 	ret_m = timing.pixel_clock * ret_n / linkspeed;
1884 	while ((ret_n > 0xffffff) || (ret_m > 0xffffff)) {
1885 		ret_m >>= 1;
1886 		ret_n >>= 1;
1887 	}
1888 	write32(INTEL_PIPE_A_LINK_M + fPipeOffset, ret_m);
1889 	//Writing Link N triggers all four registers to be activated also (on next VBlank)
1890 	write32(INTEL_PIPE_A_LINK_N + fPipeOffset, ret_n);
1891 
1892 	TRACE("%s: DP M1 data after: 0x%" B_PRIx32 "\n", __func__, read32(INTEL_PIPE_A_DATA_M + fPipeOffset));
1893 	TRACE("%s: DP N1 data after: 0x%" B_PRIx32 "\n", __func__, read32(INTEL_PIPE_A_DATA_N + fPipeOffset));
1894 	TRACE("%s: DP M1 link after: 0x%" B_PRIx32 "\n", __func__, read32(INTEL_PIPE_A_LINK_M + fPipeOffset));
1895 	TRACE("%s: DP N1 link after: 0x%" B_PRIx32 "\n", __func__, read32(INTEL_PIPE_A_LINK_N + fPipeOffset));
1896 
1897 	return B_OK;
1898 }
1899 
1900 
1901 status_t
1902 DisplayPort::_SetPortLinkGen6(const display_timing& timing)
1903 {
1904 	// Khz / 10. ( each output octet encoded as 10 bits.
1905 	//note: (fixme) eDP is fixed option 162 or 270Mc, other DPs go via DPLL programming to one of the same vals.
1906 	uint32 linkBandwidth = 270000; //khz
1907 	TRACE("%s: DP link reference clock is %gMhz\n", __func__, linkBandwidth / 1000.0f);
1908 
1909 	uint32 fPipeOffset = 0;
1910 	switch (fPipe->Index()) {
1911 		case INTEL_PIPE_B:
1912 			fPipeOffset = 0x1000;
1913 			break;
1914 		case INTEL_PIPE_C:
1915 			fPipeOffset = 0x2000;
1916 			break;
1917 		default:
1918 			break;
1919 	}
1920 
1921 	TRACE("%s: DP M1 data before: 0x%" B_PRIx32 "\n", __func__, read32(INTEL_TRANSCODER_A_DATA_M1 + fPipeOffset));
1922 	TRACE("%s: DP N1 data before: 0x%" B_PRIx32 "\n", __func__, read32(INTEL_TRANSCODER_A_DATA_N1 + fPipeOffset));
1923 	TRACE("%s: DP M1 link before: 0x%" B_PRIx32 "\n", __func__, read32(INTEL_TRANSCODER_A_LINK_M1 + fPipeOffset));
1924 	TRACE("%s: DP N1 link before: 0x%" B_PRIx32 "\n", __func__, read32(INTEL_TRANSCODER_A_LINK_N1 + fPipeOffset));
1925 
1926 	uint32 bitsPerPixel =
1927 		(read32(INTEL_TRANSCODER_A_DP_CTL + fPipeOffset) & INTEL_TRANS_DP_BPC_MASK) >> INTEL_TRANS_DP_COLOR_SHIFT;
1928 	switch (bitsPerPixel) {
1929 		case PIPE_DDI_8BPC:
1930 			bitsPerPixel = 24;
1931 			break;
1932 		case PIPE_DDI_10BPC:
1933 			bitsPerPixel = 30;
1934 			break;
1935 		case PIPE_DDI_6BPC:
1936 			bitsPerPixel = 18;
1937 			break;
1938 		case PIPE_DDI_12BPC:
1939 			bitsPerPixel = 36;
1940 			break;
1941 		default:
1942 			ERROR("%s: DP illegal link colordepth set.\n", __func__);
1943 			return B_ERROR;
1944 	}
1945 	TRACE("%s: DP link colordepth: %" B_PRIu32 "\n", __func__, bitsPerPixel);
1946 
1947 	uint32 lanes = ((read32(_PortRegister()) & INTEL_DISP_PORT_WIDTH_MASK) >> INTEL_DISP_PORT_WIDTH_SHIFT) + 1;
1948 	if (lanes > 4) {
1949 		ERROR("%s: DP illegal number of lanes set.\n", __func__);
1950 		return B_ERROR;
1951 	}
1952 	TRACE("%s: DP mode with %" B_PRIx32 " lane(s) in use\n", __func__, lanes);
1953 
1954 	//Reserving 5% bandwidth for possible spread spectrum clock use
1955 	uint32 bps = timing.pixel_clock * bitsPerPixel * 21 / 20;
1956 	//use DIV_ROUND_UP:
1957 	uint32 required_lanes = (bps + (linkBandwidth * 8) - 1) / (linkBandwidth * 8);
1958 	TRACE("%s: DP mode needs %" B_PRIx32 " lane(s) in use\n", __func__, required_lanes);
1959 	if (required_lanes > lanes) {
1960 		//Note that we *must* abort as otherwise the PIPE/DP-link hangs forever (without retraining!).
1961 		ERROR("%s: DP not enough lanes active for requested mode.\n", __func__);
1962 		return B_ERROR;
1963 	}
1964 
1965 	//Setup Data M/N
1966 	uint64 linkspeed = lanes * linkBandwidth * 8;
1967 	uint64 ret_n = 1;
1968 	while(ret_n < linkspeed) {
1969 		ret_n *= 2;
1970 	}
1971 	if (ret_n > 0x800000) {
1972 		ret_n = 0x800000;
1973 	}
1974 	uint64 ret_m = timing.pixel_clock * ret_n * bitsPerPixel / linkspeed;
1975 	while ((ret_n > 0xffffff) || (ret_m > 0xffffff)) {
1976 		ret_m >>= 1;
1977 		ret_n >>= 1;
1978 	}
1979 	//Set TU size bits (to default, max) before link training so that error detection works
1980 	write32(INTEL_TRANSCODER_A_DATA_M1 + fPipeOffset, ret_m | INTEL_TRANSCODER_MN_TU_SIZE_MASK);
1981 	write32(INTEL_TRANSCODER_A_DATA_N1 + fPipeOffset, ret_n);
1982 
1983 	//Setup Link M/N
1984 	linkspeed = linkBandwidth;
1985 	ret_n = 1;
1986 	while(ret_n < linkspeed) {
1987 		ret_n *= 2;
1988 	}
1989 	if (ret_n > 0x800000) {
1990 		ret_n = 0x800000;
1991 	}
1992 	ret_m = timing.pixel_clock * ret_n / linkspeed;
1993 	while ((ret_n > 0xffffff) || (ret_m > 0xffffff)) {
1994 		ret_m >>= 1;
1995 		ret_n >>= 1;
1996 	}
1997 	write32(INTEL_TRANSCODER_A_LINK_M1 + fPipeOffset, ret_m);
1998 	//Writing Link N triggers all four registers to be activated also (on next VBlank)
1999 	write32(INTEL_TRANSCODER_A_LINK_N1 + fPipeOffset, ret_n);
2000 
2001 	TRACE("%s: DP M1 data after: 0x%" B_PRIx32 "\n", __func__, read32(INTEL_TRANSCODER_A_DATA_M1 + fPipeOffset));
2002 	TRACE("%s: DP N1 data after: 0x%" B_PRIx32 "\n", __func__, read32(INTEL_TRANSCODER_A_DATA_N1 + fPipeOffset));
2003 	TRACE("%s: DP M1 link after: 0x%" B_PRIx32 "\n", __func__, read32(INTEL_TRANSCODER_A_LINK_M1 + fPipeOffset));
2004 	TRACE("%s: DP N1 link after: 0x%" B_PRIx32 "\n", __func__, read32(INTEL_TRANSCODER_A_LINK_N1 + fPipeOffset));
2005 
2006 	return B_OK;
2007 }
2008 
2009 
2010 status_t
2011 DisplayPort::SetDisplayMode(display_mode* target, uint32 colorMode)
2012 {
2013 	CALLED();
2014 	TRACE("%s: %s %dx%d\n", __func__, PortName(), target->timing.h_display,
2015 		target->timing.v_display);
2016 
2017 	if (fPipe == NULL) {
2018 		ERROR("%s: Setting display mode without assigned pipe!\n", __func__);
2019 		return B_ERROR;
2020 	}
2021 
2022 	status_t result = B_OK;
2023 	if (gInfo->shared_info->device_type.Generation() <= 4) {
2024 		fPipe->ConfigureTimings(target);
2025 		result = _SetPortLinkGen4(target->timing);
2026 	} else {
2027 		display_timing hardwareTarget = target->timing;
2028 		bool needsScaling = false;
2029 		if ((PortIndex() == INTEL_PORT_A)
2030 			&& (gInfo->shared_info->device_type.IsMobile() || _IsEDPPort())) {
2031 			// For internal panels, we may need to set the timings according to the panel
2032 			// native video mode, and let the panel fitter do the scaling.
2033 			// note: upto/including generation 5 laptop panels are still LVDS types, handled elsewhere.
2034 
2035 			if (gInfo->shared_info->got_vbt) {
2036 				// Set vbios hardware panel mode as base
2037 				hardwareTarget = gInfo->shared_info->panel_timing;
2038 
2039 				if (hardwareTarget.h_display == target->timing.h_display
2040 						&& hardwareTarget.v_display == target->timing.v_display) {
2041 					// We are feeding the native video mode, nothing to do: disable scaling
2042 					TRACE("%s: Requested mode is panel's native resolution: disabling scaling\n", __func__);
2043 				} else {
2044 					// We need to enable the panel fitter
2045 					TRACE("%s: Requested mode is not panel's native resolution: enabling scaling\n", __func__);
2046 					needsScaling = true;
2047 				}
2048 			} else {
2049 				//fixme: We should now first try for EDID info detailed timing, highest res in list: that's the
2050 				//native mode as well. If we also have no EDID, then fallback to setting mode directly as below.
2051 
2052 				TRACE("%s: Setting internal panel mode without VBT info generation, scaling may not work\n",
2053 					__func__);
2054 				// We don't have VBT data, try to set the requested mode directly
2055 				// and hope for the best
2056 				hardwareTarget = target->timing;
2057 			}
2058 		}
2059 
2060 		result = B_OK;
2061 		if (PortIndex() != INTEL_PORT_A)
2062 			result = _SetPortLinkGen6(hardwareTarget);
2063 
2064 		if (result == B_OK) {
2065 			// Setup PanelFitter and Train FDI if it exists
2066 			PanelFitter* fitter = fPipe->PFT();
2067 			if (fitter != NULL)
2068 				fitter->Enable(hardwareTarget);
2069 
2070 			uint32 lanes = 0;
2071 			uint32 linkBandwidth = 0;
2072 			uint32 bitsPerPixel = 0;
2073 			if (PortIndex() != INTEL_PORT_A) {
2074 				FDILink* link = fPipe->FDI();
2075 				if (link != NULL) {
2076 					link->PreTrain(&hardwareTarget, &linkBandwidth, &lanes, &bitsPerPixel);
2077 					fPipe->SetFDILink(hardwareTarget, linkBandwidth, lanes, bitsPerPixel);
2078 					link->Train(&hardwareTarget, lanes);
2079 				}
2080 			} else {
2081 				// 'local' eDP port is in use
2082 				linkBandwidth =
2083 					(read32(INTEL_DISPLAY_PORT_A) & INTEL_DISP_EDP_PLL_FREQ_MASK) >> INTEL_DISP_EDP_PLL_FREQ_SHIFT;
2084 				switch (linkBandwidth) {
2085 					case INTEL_DISP_EDP_PLL_FREQ_270:
2086 						linkBandwidth = 270000; //khz
2087 						break;
2088 					case INTEL_DISP_EDP_PLL_FREQ_162:
2089 						linkBandwidth = 162000; //khz
2090 						break;
2091 					default:
2092 						TRACE("%s: eDP illegal reference clock ID set, assuming 270Mhz.\n", __func__);
2093 						linkBandwidth = 270000; //khz
2094 				}
2095 
2096 				bitsPerPixel =
2097 					(read32(INTEL_DISPLAY_A_PIPE_CONTROL) & INTEL_PIPE_BPC_MASK) >> INTEL_PIPE_COLOR_SHIFT;
2098 				switch (bitsPerPixel) {
2099 					case INTEL_PIPE_8BPC:
2100 						bitsPerPixel = 24;
2101 						break;
2102 					case INTEL_PIPE_10BPC:
2103 						bitsPerPixel = 30;
2104 						break;
2105 					case INTEL_PIPE_6BPC:
2106 						bitsPerPixel = 18;
2107 						break;
2108 					case INTEL_PIPE_12BPC:
2109 						bitsPerPixel = 36;
2110 						break;
2111 					default:
2112 						bitsPerPixel = 0;
2113 				}
2114 
2115 				lanes =
2116 					((read32(INTEL_DISPLAY_PORT_A) & INTEL_DISP_PORT_WIDTH_MASK) >> INTEL_DISP_PORT_WIDTH_SHIFT) + 1;
2117 
2118 				fPipe->SetFDILink(hardwareTarget, linkBandwidth, lanes, bitsPerPixel);
2119 			}
2120 
2121 			// Program general pipe config
2122 			fPipe->Configure(target);
2123 
2124 			// Pll programming is not needed for (e)DP..
2125 
2126 			// Program target display mode
2127 			fPipe->ConfigureTimings(target, !needsScaling, PortIndex());
2128 		} else {
2129 			TRACE("%s: Setting display mode via fallback: using scaling!\n", __func__);
2130 			// Keep monitor at native mode and scale image to that
2131 			fPipe->ConfigureScalePos(target);
2132 		}
2133 	}
2134 
2135 	// Set fCurrentMode to our set display mode
2136 	memcpy(&fCurrentMode, target, sizeof(display_mode));
2137 
2138 	return result;
2139 }
2140 
2141 
2142 // #pragma mark - Embedded DisplayPort
2143 
2144 
2145 EmbeddedDisplayPort::EmbeddedDisplayPort()
2146 	:
2147 	DisplayPort(INTEL_PORT_A, "Embedded DisplayPort")
2148 {
2149 }
2150 
2151 
2152 bool
2153 EmbeddedDisplayPort::IsConnected()
2154 {
2155 	addr_t portRegister = _PortRegister();
2156 
2157 	TRACE("%s: %s PortRegister: 0x%" B_PRIxADDR "\n", __func__, PortName(),
2158 		portRegister);
2159 
2160 	if (!gInfo->shared_info->device_type.IsMobile()) {
2161 		TRACE("%s: skipping eDP on non-mobile GPU\n", __func__);
2162 		return false;
2163 	}
2164 
2165 	if ((read32(portRegister) & DISPLAY_MONITOR_PORT_DETECTED) == 0) {
2166 		TRACE("%s: %s link not detected\n", __func__, PortName());
2167 		return false;
2168 	}
2169 
2170 	HasEDID();
2171 
2172 	// If eDP has EDID, awesome. We use it.
2173 	// No EDID? The modesetting code falls back to VBIOS panel_mode
2174 	return true;
2175 }
2176 
2177 
2178 // #pragma mark - Digital Display Port
2179 
2180 
2181 DigitalDisplayInterface::DigitalDisplayInterface(port_index index,
2182 		const char* baseName)
2183 	:
2184 	Port(index, baseName)
2185 {
2186 	// As of Haswell, Intel decided to change eDP ports to a "DDI" bus...
2187 	// on a dare because the hardware engineers were drunk one night.
2188 }
2189 
2190 
2191 addr_t
2192 DigitalDisplayInterface::_PortRegister()
2193 {
2194 	// TODO: Linux does a DDI_BUF_CTL(INTEL_PORT_A) which is cleaner
2195 	// (but we have to ensure the offsets + region base is correct)
2196 	switch (PortIndex()) {
2197 		case INTEL_PORT_A:
2198 			return DDI_BUF_CTL_A;
2199 		case INTEL_PORT_B:
2200 			return DDI_BUF_CTL_B;
2201 		case INTEL_PORT_C:
2202 			return DDI_BUF_CTL_C;
2203 		case INTEL_PORT_D:
2204 			return DDI_BUF_CTL_D;
2205 		case INTEL_PORT_E:
2206 			return DDI_BUF_CTL_E;
2207 		case INTEL_PORT_F:
2208 			if ((gInfo->shared_info->device_type.Generation() > 8) &&
2209 				!gInfo->shared_info->device_type.InGroup(INTEL_GROUP_SKY))
2210 				return DDI_BUF_CTL_F;
2211 			return 0;
2212 		case INTEL_PORT_G:
2213 			if (gInfo->shared_info->device_type.Generation() >= 12)
2214 				return DDI_BUF_CTL_G;
2215 			return 0;
2216 		default:
2217 			return 0;
2218 	}
2219 	return 0;
2220 }
2221 
2222 
2223 addr_t
2224 DigitalDisplayInterface::_DDCRegister()
2225 {
2226 	return Port::_DDCPin();
2227 }
2228 
2229 
2230 status_t
2231 DigitalDisplayInterface::Power(bool enabled)
2232 {
2233 	if (fPipe == NULL) {
2234 		ERROR("%s: Setting power without assigned pipe!\n", __func__);
2235 		return B_ERROR;
2236 	}
2237 	TRACE("%s: %s DDI enabled: %s\n", __func__, PortName(),
2238 		enabled ? "true" : "false");
2239 
2240 	fPipe->Enable(enabled);
2241 
2242 	//nogo currently.. (kills output forever)
2243 #if 0
2244 	addr_t portRegister = _PortRegister();
2245 	uint32 state = read32(portRegister);
2246 	write32(portRegister,
2247 		enabled ? (state | DDI_BUF_CTL_ENABLE) : (state & ~DDI_BUF_CTL_ENABLE));
2248 	read32(portRegister);
2249 #endif
2250 
2251 	return B_OK;
2252 }
2253 
2254 
2255 status_t
2256 DigitalDisplayInterface::SetPipe(Pipe* pipe)
2257 {
2258 	CALLED();
2259 
2260 	if (pipe == NULL) {
2261 		ERROR("%s: Invalid pipe provided!\n", __func__);
2262 		return B_ERROR;
2263 	}
2264 
2265 	// TODO: UnAssignPipe?  This likely needs reworked a little
2266 	if (fPipe != NULL) {
2267 		ERROR("%s: Can't reassign display pipe (yet)\n", __func__);
2268 		return B_ERROR;
2269 	}
2270 
2271 	// all DDI ports pipe selections works differently than on the old port types (indirect).
2272 	// fixme: implement..
2273 	TRACE("%s: Assuming pipe is assigned by BIOS (fixme)\n", __func__);
2274 
2275 	fPipe = pipe;
2276 
2277 	if (fPipe == NULL)
2278 		return B_NO_MEMORY;
2279 
2280 	// Disable display pipe until modesetting enables it
2281 	if (fPipe->IsEnabled())
2282 		fPipe->Enable(false);
2283 
2284 	return B_OK;
2285 }
2286 
2287 
2288 status_t
2289 DigitalDisplayInterface::SetupI2c(i2c_bus *bus)
2290 {
2291 	CALLED();
2292 
2293 	const uint32 deviceConfigCount = gInfo->shared_info->device_config_count;
2294 	if (gInfo->shared_info->device_type.Generation() >= 6 && deviceConfigCount > 0) {
2295 		if (!_IsDisplayPortInVBT())
2296 			return Port::SetupI2c(bus);
2297 	}
2298 
2299 	return _SetupDpAuxI2c(bus);
2300 }
2301 
2302 
2303 status_t
2304 DigitalDisplayInterface::SetupI2cFallback(i2c_bus *bus)
2305 {
2306 	CALLED();
2307 
2308 	const uint32 deviceConfigCount = gInfo->shared_info->device_config_count;
2309 	if (gInfo->shared_info->device_type.Generation() >= 6 && deviceConfigCount > 0
2310 		&& _IsDisplayPortInVBT() && _IsHdmiInVBT()) {
2311 		return Port::SetupI2c(bus);
2312 	}
2313 
2314 	return B_ERROR;
2315 }
2316 
2317 
2318 bool
2319 DigitalDisplayInterface::IsConnected()
2320 {
2321 	addr_t portRegister = _PortRegister();
2322 
2323 	TRACE("%s: %s PortRegister: 0x%" B_PRIxADDR "\n", __func__, PortName(),
2324 		portRegister);
2325 
2326 	// Please note: Skylake and up (Desktop) might use eDP for a seperate active VGA converter chip.
2327 	if (portRegister == 0) {
2328 		TRACE("%s: Port not implemented\n", __func__);
2329 		return false;
2330 	}
2331 
2332 	// newer chipsets support 4 lanes on all ports
2333 	fMaxLanes = 4;
2334 	if ((gInfo->shared_info->device_type.Generation() < 9) ||
2335 		gInfo->shared_info->device_type.InGroup(INTEL_GROUP_SKY)) {
2336 		// Probe a little port info.
2337 		if ((read32(DDI_BUF_CTL_A) & DDI_A_4_LANES) != 0) {
2338 			switch (PortIndex()) {
2339 				case INTEL_PORT_A:
2340 					fMaxLanes = 4;
2341 					break;
2342 				case INTEL_PORT_E:
2343 					fMaxLanes = 0;
2344 					break;
2345 				default:
2346 					fMaxLanes = 4;
2347 					break;
2348 			}
2349 		} else {
2350 			switch (PortIndex()) {
2351 				case INTEL_PORT_A:
2352 					fMaxLanes = 2;
2353 					break;
2354 				case INTEL_PORT_E:
2355 					fMaxLanes = 2;
2356 					break;
2357 				default:
2358 					fMaxLanes = 4;
2359 					break;
2360 			}
2361 		}
2362 	}
2363 
2364 	const uint32 deviceConfigCount = gInfo->shared_info->device_config_count;
2365 	if (gInfo->shared_info->device_type.Generation() >= 6 && deviceConfigCount > 0) {
2366 		// check VBT mapping
2367 		if (!_IsPortInVBT()) {
2368 			TRACE("%s: %s: port not found in VBT\n", __func__, PortName());
2369 			return false;
2370 		} else
2371 			TRACE("%s: %s: port found in VBT\n", __func__, PortName());
2372 	}
2373 
2374 	TRACE("%s: %s Maximum Lanes: %" B_PRId8 "\n", __func__,
2375 		PortName(), fMaxLanes);
2376 
2377 	// fetch EDID but determine 'in use' later (below) so we also catch screens that fail EDID
2378 	bool edidDetected = HasEDID();
2379 
2380 	// On laptops we always have an internal panel.. (on the eDP port on DDI systems, fixed on eDP pipe)
2381 	uint32 pipeState = 0;
2382 	if ((gInfo->shared_info->device_type.IsMobile() || _IsEDPPort())
2383 		&& (PortIndex() == INTEL_PORT_A)) {
2384 		if (gInfo->shared_info->device_type.Generation() < 12) {
2385 			// TODO: the pipe state isn't reliable after gen11
2386 			pipeState = read32(PIPE_DDI_FUNC_CTL_EDP);
2387 			TRACE("%s: PIPE_DDI_FUNC_CTL_EDP: 0x%" B_PRIx32 "\n", __func__, pipeState);
2388 			if (!(pipeState & PIPE_DDI_FUNC_CTL_ENABLE)) {
2389 				TRACE("%s: Laptop, but eDP port down\n", __func__);
2390 				return false;
2391 			}
2392 		}
2393 		if (edidDetected)
2394 			return true;
2395 		else if (gInfo->shared_info->has_vesa_edid_info) {
2396 			TRACE("%s: Laptop. Using VESA edid info\n", __func__);
2397 			memcpy(&fEDIDInfo, &gInfo->shared_info->vesa_edid_info,	sizeof(edid1_info));
2398 			if (fEDIDState != B_OK) {
2399 				fEDIDState = B_OK;
2400 				// HasEDID now true
2401 				edid_dump(&fEDIDInfo);
2402 			}
2403 			return true;
2404 		} else if (gInfo->shared_info->got_vbt) {
2405 			TRACE("%s: Laptop. No VESA EDID, but force enabled as we have a VBT\n", __func__);
2406 			return true;
2407 		}
2408 		//should not happen:
2409 		TRACE("%s: No (panel) type info found, assuming not connected\n", __func__);
2410 		return false;
2411 	}
2412 
2413 	// scan all our non-eDP pipes to find the one connected to the current port and check it's enabled
2414 	for (uint32 pipeCnt = 0; pipeCnt < 3; pipeCnt++) {
2415 		switch (pipeCnt) {
2416 			case 1:
2417 				pipeState = read32(PIPE_DDI_FUNC_CTL_B);
2418 				break;
2419 			case 2:
2420 				pipeState = read32(PIPE_DDI_FUNC_CTL_C);
2421 				break;
2422 			default:
2423 				pipeState = read32(PIPE_DDI_FUNC_CTL_A);
2424 				break;
2425 		}
2426 		if ((((pipeState & PIPE_DDI_SELECT_MASK) >> PIPE_DDI_SELECT_SHIFT) + 1) == (uint32)PortIndex()) {
2427 			TRACE("%s: PIPE_DDI_FUNC_CTL nr %" B_PRIx32 ": 0x%" B_PRIx32 "\n", __func__, pipeCnt + 1, pipeState);
2428 			// See if the BIOS enabled our output as it indicates it's in use
2429 			if (pipeState & PIPE_DDI_FUNC_CTL_ENABLE) {
2430 				TRACE("%s: Connected\n", __func__);
2431 				return true;
2432 			}
2433 		}
2434 	}
2435 
2436 	if (edidDetected) {
2437 		for (uint32 pipeCnt = 0; pipeCnt < 3; pipeCnt++) {
2438 			uint32 pipeReg = 0;
2439 			switch (pipeCnt) {
2440 				case 1:
2441 					pipeReg = PIPE_DDI_FUNC_CTL_B;
2442 					break;
2443 				case 2:
2444 					pipeReg = PIPE_DDI_FUNC_CTL_C;
2445 					break;
2446 				default:
2447 					pipeReg = PIPE_DDI_FUNC_CTL_A;
2448 					break;
2449 			}
2450 			pipeState = read32(pipeReg);
2451 			if ((pipeState & PIPE_DDI_FUNC_CTL_ENABLE) == 0) {
2452 				TRACE("%s: Connected but port down\n", __func__);
2453 				return false;
2454 			}
2455 			return true;
2456 		}
2457 		TRACE("%s: No pipe available, ignoring connected screen\n", __func__);
2458 	}
2459 
2460 	TRACE("%s: Not connected\n", __func__);
2461 	return false;
2462 }
2463 
2464 status_t
2465 DigitalDisplayInterface::_SetPortLinkGen8(const display_timing& timing, uint32 pllSel)
2466 {
2467 	//fixme: always so on pre gen 9?
2468 	uint32 linkBandwidth = 270000; //khz
2469 
2470 	if (gInfo->shared_info->device_type.Generation() >= 9) {
2471 		if (pllSel != 0xff) {
2472 			linkBandwidth = (read32(SKL_DPLL_CTRL1) >> (1 + 6 * pllSel)) & SKL_DPLL_DP_LINKRATE_MASK;
2473 			switch (linkBandwidth) {
2474 				case SKL_DPLL_CTRL1_2700:
2475 					linkBandwidth = 2700000 / 5;
2476 					break;
2477 				case SKL_DPLL_CTRL1_1350:
2478 					linkBandwidth = 1350000 / 5;
2479 					break;
2480 				case SKL_DPLL_CTRL1_810:
2481 					linkBandwidth =  810000 / 5;
2482 					break;
2483 				case SKL_DPLL_CTRL1_1620:
2484 					linkBandwidth = 1620000 / 5;
2485 					break;
2486 				case SKL_DPLL_CTRL1_1080:
2487 					linkBandwidth = 1080000 / 5;
2488 					break;
2489 				case SKL_DPLL_CTRL1_2160:
2490 					linkBandwidth = 2160000 / 5;
2491 					break;
2492 				default:
2493 					linkBandwidth = 270000;
2494 					ERROR("%s: DDI No known DP-link reference clock selected, assuming default\n", __func__);
2495 					break;
2496 			}
2497 		} else {
2498 			ERROR("%s: DDI No known PLL selected, assuming default DP-link reference\n", __func__);
2499 		}
2500 	}
2501 	TRACE("%s: DDI DP-link reference clock is %gMhz\n", __func__, linkBandwidth / 1000.0f);
2502 
2503 	uint32 fPipeOffset = 0;
2504 	switch (fPipe->Index()) {
2505 		case INTEL_PIPE_B:
2506 			fPipeOffset = 0x1000;
2507 			break;
2508 		case INTEL_PIPE_C:
2509 			fPipeOffset = 0x2000;
2510 			break;
2511 		case INTEL_PIPE_D:
2512 			fPipeOffset = 0xf000;
2513 			break;
2514 		default:
2515 			break;
2516 	}
2517 
2518 	TRACE("%s: DDI M1 data before: 0x%" B_PRIx32 "\n", __func__, read32(INTEL_DDI_PIPE_A_DATA_M + fPipeOffset));
2519 	TRACE("%s: DDI N1 data before: 0x%" B_PRIx32 "\n", __func__, read32(INTEL_DDI_PIPE_A_DATA_N + fPipeOffset));
2520 	TRACE("%s: DDI M1 link before: 0x%" B_PRIx32 "\n", __func__, read32(INTEL_DDI_PIPE_A_LINK_M + fPipeOffset));
2521 	TRACE("%s: DDI N1 link before: 0x%" B_PRIx32 "\n", __func__, read32(INTEL_DDI_PIPE_A_LINK_N + fPipeOffset));
2522 
2523 	uint32 pipeFunc = read32(PIPE_DDI_FUNC_CTL_A + fPipeOffset);
2524 	uint32 bitsPerPixel = (pipeFunc & PIPE_DDI_BPC_MASK) >> PIPE_DDI_COLOR_SHIFT;
2525 	switch (bitsPerPixel) {
2526 		case PIPE_DDI_8BPC:
2527 			bitsPerPixel = 24;
2528 			break;
2529 		case PIPE_DDI_10BPC:
2530 			bitsPerPixel = 30;
2531 			break;
2532 		case PIPE_DDI_6BPC:
2533 			bitsPerPixel = 18;
2534 			break;
2535 		case PIPE_DDI_12BPC:
2536 			bitsPerPixel = 36;
2537 			break;
2538 		default:
2539 			ERROR("%s: DDI illegal link colordepth set.\n", __func__);
2540 			return B_ERROR;
2541 	}
2542 	TRACE("%s: DDI Link Colordepth: %" B_PRIu32 "\n", __func__, bitsPerPixel);
2543 
2544 	uint32 lanes = 4;
2545 	// Only DP modes supports less than 4 lanes: read current config
2546 	if (((pipeFunc & PIPE_DDI_MODESEL_MASK) >> PIPE_DDI_MODESEL_SHIFT) >= PIPE_DDI_MODE_DP_SST) {
2547 		// On gen 9.5 IceLake 3x mode exists (DSI only), earlier models: reserved value.
2548 		lanes = ((pipeFunc & PIPE_DDI_DP_WIDTH_MASK) >> PIPE_DDI_DP_WIDTH_SHIFT) + 1;
2549 		TRACE("%s: DDI in DP mode with %" B_PRIx32 " lane(s) in use\n", __func__, lanes);
2550 	} else {
2551 		TRACE("%s: DDI in non-DP mode with %" B_PRIx32 " lane(s) in use\n", __func__, lanes);
2552 	}
2553 
2554 	//Setup Data M/N
2555 	uint64 linkspeed = lanes * linkBandwidth * 8;
2556 	uint64 ret_n = 1;
2557 	while(ret_n < linkspeed) {
2558 		ret_n *= 2;
2559 	}
2560 	if (ret_n > 0x800000) {
2561 		ret_n = 0x800000;
2562 	}
2563 	uint64 ret_m = timing.pixel_clock * ret_n * bitsPerPixel / linkspeed;
2564 	while ((ret_n > 0xffffff) || (ret_m > 0xffffff)) {
2565 		ret_m >>= 1;
2566 		ret_n >>= 1;
2567 	}
2568 	//Set TU size bits (to default, max) before link training so that error detection works
2569 	write32(INTEL_DDI_PIPE_A_DATA_M + fPipeOffset, ret_m | FDI_PIPE_MN_TU_SIZE_MASK);
2570 	write32(INTEL_DDI_PIPE_A_DATA_N + fPipeOffset, ret_n);
2571 
2572 	//Setup Link M/N
2573 	linkspeed = linkBandwidth;
2574 	ret_n = 1;
2575 	while(ret_n < linkspeed) {
2576 		ret_n *= 2;
2577 	}
2578 	if (ret_n > 0x800000) {
2579 		ret_n = 0x800000;
2580 	}
2581 	ret_m = timing.pixel_clock * ret_n / linkspeed;
2582 	while ((ret_n > 0xffffff) || (ret_m > 0xffffff)) {
2583 		ret_m >>= 1;
2584 		ret_n >>= 1;
2585 	}
2586 	write32(INTEL_DDI_PIPE_A_LINK_M + fPipeOffset, ret_m);
2587 	//Writing Link N triggers all four registers to be activated also (on next VBlank)
2588 	write32(INTEL_DDI_PIPE_A_LINK_N + fPipeOffset, ret_n);
2589 
2590 	TRACE("%s: DDI M1 data after: 0x%" B_PRIx32 "\n", __func__, read32(INTEL_DDI_PIPE_A_DATA_M + fPipeOffset));
2591 	TRACE("%s: DDI N1 data after: 0x%" B_PRIx32 "\n", __func__, read32(INTEL_DDI_PIPE_A_DATA_N + fPipeOffset));
2592 	TRACE("%s: DDI M1 link after: 0x%" B_PRIx32 "\n", __func__, read32(INTEL_DDI_PIPE_A_LINK_M + fPipeOffset));
2593 	TRACE("%s: DDI N1 link after: 0x%" B_PRIx32 "\n", __func__, read32(INTEL_DDI_PIPE_A_LINK_N + fPipeOffset));
2594 
2595 	return B_OK;
2596 }
2597 
2598 status_t
2599 DigitalDisplayInterface::SetDisplayMode(display_mode* target, uint32 colorMode)
2600 {
2601 	CALLED();
2602 	TRACE("%s: %s %dx%d\n", __func__, PortName(), target->timing.h_display,
2603 		target->timing.v_display);
2604 
2605 	if (fPipe == NULL) {
2606 		ERROR("%s: Setting display mode without assigned pipe!\n", __func__);
2607 		return B_ERROR;
2608 	}
2609 
2610 	display_timing hardwareTarget = target->timing;
2611 	bool needsScaling = false;
2612 	if ((PortIndex() == INTEL_PORT_A)
2613 		&& (gInfo->shared_info->device_type.IsMobile() || _IsEDPPort())) {
2614 		// For internal panels, we may need to set the timings according to the panel
2615 		// native video mode, and let the panel fitter do the scaling.
2616 
2617 		if (gInfo->shared_info->got_vbt || HasEDID()) {
2618 			// Set vbios hardware panel mode as base
2619 			hardwareTarget = gInfo->shared_info->panel_timing;
2620 			if (HasEDID()) {
2621 				// the first detailed timing supposed to be the best supported one
2622 				int i;
2623 				for (i = 0; i < EDID1_NUM_DETAILED_MONITOR_DESC; ++i) {
2624 					edid1_detailed_monitor *monitor = &fEDIDInfo.detailed_monitor[i];
2625 					if (monitor->monitor_desc_type == EDID1_IS_DETAILED_TIMING)
2626 						break;
2627 				}
2628 				if (i < EDID1_NUM_DETAILED_MONITOR_DESC) {
2629 					TRACE("%s: Using EDID detailed timing %d for the internal panel\n",
2630 						__func__, i);
2631 					const edid1_detailed_timing& timing
2632 						= fEDIDInfo.detailed_monitor[i].data.detailed_timing;
2633 					hardwareTarget.pixel_clock = timing.pixel_clock * 10;
2634 					hardwareTarget.h_display = timing.h_active;
2635 					hardwareTarget.h_sync_start = timing.h_active + timing.h_sync_off;
2636 					hardwareTarget.h_sync_end = hardwareTarget.h_sync_start + timing.h_sync_width;
2637 					hardwareTarget.h_total = timing.h_active + timing.h_blank;
2638 					hardwareTarget.v_display = timing.v_active;
2639 					hardwareTarget.v_sync_start = timing.v_active + timing.v_sync_off;
2640 					hardwareTarget.v_sync_end = hardwareTarget.v_sync_start + timing.v_sync_width;
2641 					hardwareTarget.v_total = timing.v_active + timing.v_blank;
2642 					hardwareTarget.flags = 0;
2643 					if (timing.sync == 3) {
2644 						if (timing.misc & 1)
2645 							hardwareTarget.flags |= B_POSITIVE_HSYNC;
2646 						if (timing.misc & 2)
2647 							hardwareTarget.flags |= B_POSITIVE_VSYNC;
2648 					}
2649 					if (timing.interlaced)
2650 						hardwareTarget.flags |= B_TIMING_INTERLACED;
2651 				}
2652 			}
2653 			if (hardwareTarget.h_display == target->timing.h_display
2654 					&& hardwareTarget.v_display == target->timing.v_display) {
2655 				// We are setting the native video mode, nothing special to do
2656 				// Note: this means refresh and timing might vary according to requested mode.
2657 				hardwareTarget = target->timing;
2658 				TRACE("%s: Setting internal panel to native resolution at %" B_PRIu32 "Hz\n", __func__,
2659 					hardwareTarget.pixel_clock * 1000 / (hardwareTarget.h_total * hardwareTarget.v_total));
2660 			} else {
2661 				// We need to enable the panel fitter
2662 				TRACE("%s: Hardware mode will actually be %dx%d at %" B_PRIu32 "Hz\n", __func__,
2663 					hardwareTarget.h_display, hardwareTarget.v_display,
2664 					hardwareTarget.pixel_clock * 1000 / (hardwareTarget.h_total * hardwareTarget.v_total));
2665 
2666 				// FIXME we should also get the refresh frequency from the target
2667 				// mode, and then "sanitize" the resulting mode we made up.
2668 				needsScaling = true;
2669 			}
2670 		} else {
2671 			TRACE("%s: Setting internal panel mode without VBT info generation, scaling may not work\n",
2672 				__func__);
2673 			// We don't have VBT data, try to set the requested mode directly
2674 			// and hope for the best
2675 			hardwareTarget = target->timing;
2676 		}
2677 	}
2678 
2679 	// Setup PanelFitter
2680 	PanelFitter* fitter = fPipe->PFT();
2681 	if (fitter != NULL)
2682 		fitter->Enable(hardwareTarget);
2683 
2684 	// skip FDI as it never applies to DDI (on gen7 and 8 only for the real analog VGA port)
2685 
2686 	// Program general pipe config
2687 	fPipe->Configure(target);
2688 
2689 	uint32 pllSel = 0xff; // no PLL selected
2690 	if (gInfo->shared_info->device_type.Generation() <= 8) {
2691 		unsigned int r2_out, n2_out, p_out;
2692 		hsw_ddi_calculate_wrpll(
2693 			hardwareTarget.pixel_clock * 1000 /* in Hz */,
2694 			&r2_out, &n2_out, &p_out);
2695 	} else {
2696 		skl_wrpll_params wrpll_params;
2697 		skl_ddi_calculate_wrpll(
2698 			hardwareTarget.pixel_clock * 1000 /* in Hz */,
2699 			gInfo->shared_info->pll_info.reference_frequency,
2700 			&wrpll_params);
2701 		fPipe->ConfigureClocksSKL(wrpll_params,
2702 			hardwareTarget.pixel_clock,
2703 			PortIndex(),
2704 			&pllSel);
2705 	}
2706 
2707 	// Program target display mode
2708 	fPipe->ConfigureTimings(target, !needsScaling);
2709 	_SetPortLinkGen8(hardwareTarget, pllSel);
2710 
2711 	// Set fCurrentMode to our set display mode
2712 	memcpy(&fCurrentMode, target, sizeof(display_mode));
2713 
2714 	return B_OK;
2715 }
2716