intel_extreme: fixed DP/DDI clk init switch and link det, accept EDID still down.

This commit is contained in:
Rudolf Cornelissen
2021-06-17 21:59:28 +00:00
parent bf6a2a2bf1
commit 54ce952dd4
2 changed files with 46 additions and 20 deletions
+35 -13
View File
@@ -790,10 +790,18 @@ HDMIPort::IsConnected()
if (portRegister == 0) if (portRegister == 0)
return false; return false;
bool hasPCH = (gInfo->shared_info->pch_info != INTEL_PCH_NONE); //Notes:
if (!hasPCH && PortIndex() == INTEL_PORT_C) { //- DISPLAY_MONITOR_PORT_DETECTED does only tell you *some* sort of digital display is
// there's no detection bit on this port // connected to the port *if* you have the AUX channel stuff under power. It does not
} else if ((read32(portRegister) & DISPLAY_MONITOR_PORT_DETECTED) == 0) // tell you which -type- of digital display is connected.
//- Since we rely on the BIOS anyway, let's just use the conclusions it made for us :)
// Beware though: set_display_power_mode() uses this DISPLAY_MONITOR_PORT_ENABLED bit
// for DPMS as well. So we should better buffer our findings here for i.e. possible
// accelerant clones starting up. For DPMS there's currently no problem as this bit
// is only programmed for LVDS, DVI and VGA while we detect presence only for DP and HDMI.
//
//if ((read32(portRegister) & DISPLAY_MONITOR_PORT_DETECTED) == 0)
if ((read32(portRegister) & DISPLAY_MONITOR_PORT_ENABLED) == 0)
return false; return false;
return HasEDID(); return HasEDID();
@@ -849,12 +857,26 @@ DisplayPort::IsConnected()
if (portRegister == 0) if (portRegister == 0)
return false; return false;
if ((read32(portRegister) & DISPLAY_MONITOR_PORT_DETECTED) == 0) { //Notes:
//- DISPLAY_MONITOR_PORT_DETECTED does only tell you *some* sort of digital display is
// connected to the port *if* you have the AUX channel stuff under power. It does not
// tell you which -type- of digital display is connected.
//- Since we rely on the BIOS anyway, let's just use the conclusions it made for us :)
// Beware though: set_display_power_mode() uses this DISPLAY_MONITOR_PORT_ENABLED bit
// for DPMS as well. So we should better buffer our findings here for i.e. possible
// accelerant clones starting up. For DPMS there's currently no problem as this bit
// is only programmed for LVDS, DVI and VGA while we detect presence only for DP and HDMI.
//
//if ((read32(portRegister) & DISPLAY_MONITOR_PORT_DETECTED) == 0) {
if ((read32(portRegister) & DISPLAY_MONITOR_PORT_ENABLED) == 0) {
TRACE("%s: %s link not detected\n", __func__, PortName()); TRACE("%s: %s link not detected\n", __func__, PortName());
return false; return false;
} }
return HasEDID(); //since EDID is not correctly implemented yet for this connection type we'll do without it for now
//return HasEDID();
TRACE("%s: %s link detected\n", __func__, PortName());
return true;
} }
@@ -1086,8 +1108,9 @@ DigitalDisplayInterface::IsConnected()
TRACE("%s: %s Maximum Lanes: %" B_PRId8 "\n", __func__, TRACE("%s: %s Maximum Lanes: %" B_PRId8 "\n", __func__,
PortName(), fMaxLanes); PortName(), fMaxLanes);
HasEDID(); //since EDID is not correctly implemented yet for this connection type we'll do without it for now
//return HasEDID();
TRACE("%s: %s link detected\n", __func__, PortName());
return true; return true;
} }
@@ -1104,14 +1127,13 @@ DigitalDisplayInterface::SetDisplayMode(display_mode* target, uint32 colorMode)
return B_ERROR; return B_ERROR;
} }
#if 0 // Setup PanelFitter and Train FDI if it exists
// Disabled for now as our code doesn't work. Let's hope VESA/EFI has PanelFitter* fitter = fPipe->PFT();
// already set things up for us during boot. if (fitter != NULL)
// Train FDI if it exists fitter->Enable(*target);
FDILink* link = fPipe->FDI(); FDILink* link = fPipe->FDI();
if (link != NULL) if (link != NULL)
link->Train(target); link->Train(target);
#endif
pll_divisors divisors; pll_divisors divisors;
compute_pll_divisors(target, &divisors, false); compute_pll_divisors(target, &divisors, false);
@@ -243,6 +243,8 @@ probe_ports()
TRACE("lvds: %08" B_PRIx32 "\n", read32(INTEL_DIGITAL_LVDS_PORT)); TRACE("lvds: %08" B_PRIx32 "\n", read32(INTEL_DIGITAL_LVDS_PORT));
bool foundLVDS = false; bool foundLVDS = false;
bool foundDP = false;
bool foundDDI = false;
gInfo->port_count = 0; gInfo->port_count = 0;
for (int i = INTEL_PORT_A; i <= INTEL_PORT_D; i++) { for (int i = INTEL_PORT_A; i <= INTEL_PORT_D; i++) {
@@ -251,9 +253,10 @@ probe_ports()
if (displayPort == NULL) if (displayPort == NULL)
return B_NO_MEMORY; return B_NO_MEMORY;
if (displayPort->IsConnected()) if (displayPort->IsConnected()) {
foundDP = true;
gInfo->ports[gInfo->port_count++] = displayPort; gInfo->ports[gInfo->port_count++] = displayPort;
else } else
delete displayPort; delete displayPort;
} }
@@ -268,9 +271,10 @@ probe_ports()
if (ddiPort == NULL) if (ddiPort == NULL)
return B_NO_MEMORY; return B_NO_MEMORY;
if (ddiPort->IsConnected()) if (ddiPort->IsConnected()) {
foundDDI = true;
gInfo->ports[gInfo->port_count++] = ddiPort; gInfo->ports[gInfo->port_count++] = ddiPort;
else } else
delete ddiPort; delete ddiPort;
} }
} }
@@ -292,6 +296,7 @@ probe_ports()
TRACE("Probing HDMI %d\n", i); TRACE("Probing HDMI %d\n", i);
if (has_connected_port((port_index)i, INTEL_PORT_TYPE_ANY)) { if (has_connected_port((port_index)i, INTEL_PORT_TYPE_ANY)) {
// Ensure port not already claimed by something like DDI // Ensure port not already claimed by something like DDI
TRACE("Port already claimed\n");
continue; continue;
} }
@@ -318,8 +323,8 @@ probe_ports()
} else } else
delete lvdsPort; delete lvdsPort;
TRACE("Probing DVI\n");
if (!has_connected_port(INTEL_PORT_ANY, INTEL_PORT_TYPE_ANY)) { if (!has_connected_port(INTEL_PORT_ANY, INTEL_PORT_TYPE_ANY)) {
TRACE("Probing DVI\n");
// there's neither DisplayPort nor HDMI so far, assume DVI B // there's neither DisplayPort nor HDMI so far, assume DVI B
for (port_index index = INTEL_PORT_B; index <= INTEL_PORT_C; for (port_index index = INTEL_PORT_B; index <= INTEL_PORT_C;
index = (port_index)(index + 1)) { index = (port_index)(index + 1)) {
@@ -353,8 +358,7 @@ probe_ports()
if (gInfo->shared_info->pch_info == INTEL_PCH_IBX if (gInfo->shared_info->pch_info == INTEL_PCH_IBX
|| gInfo->shared_info->pch_info == INTEL_PCH_CPT) { || gInfo->shared_info->pch_info == INTEL_PCH_CPT) {
TRACE("Activating clocks\n"); TRACE("Activating clocks\n");
// XXX: Is LVDS the same as Panel? refclk_activate_ilk(foundLVDS || foundDP || foundDDI);
refclk_activate_ilk(foundLVDS);
} }
/* /*
} else if (gInfo->shared_info->pch_info == INTEL_PCH_LPT) { } else if (gInfo->shared_info->pch_info == INTEL_PCH_LPT) {