intel_extreme: fixed DP/DDI clk init switch and link det, accept EDID still down.
This commit is contained in:
@@ -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) {
|
||||||
|
|||||||
Reference in New Issue
Block a user