RadeonHD: Bit-bang LVDS for edid
* Older cards have to use the LVDS_Info table, newer cards also have an ddc pin for EDID. * Some buggy sbios don't inject the EDID into the vbios as they should * This corrects hrev45812 as we need to still call connector_read_mode_lvds to obtain the spread spectrum data for the lvds. * Call connector_read_mode_lvds, bit-bang the connector, choose the best outcome.
This commit is contained in:
@@ -291,14 +291,36 @@ detect_displays()
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
if (gConnector[id]->type == VIDEO_CONNECTOR_LVDS) {
|
||||||
|
display_mode preferredMode;
|
||||||
|
bool lvdsInfoFound = connector_read_mode_lvds(id,
|
||||||
|
&preferredMode);
|
||||||
|
TRACE("%s: connector(%" B_PRIu32 "): bit-banging LVDS for EDID.\n",
|
||||||
|
__func__, id);
|
||||||
|
|
||||||
|
gDisplay[displayIndex]->attached = connector_read_edid(id,
|
||||||
|
&gDisplay[displayIndex]->edidData);
|
||||||
|
|
||||||
|
if (!gDisplay[displayIndex]->attached && lvdsInfoFound) {
|
||||||
|
// If we didn't find ddc edid data, fallback to lvdsInfo
|
||||||
|
// We have to call connector_read_mode_lvds first to
|
||||||
|
// collect SS data for the lvds connector
|
||||||
|
TRACE("%s: connector(%" B_PRIu32 "): using AtomBIOS LVDS_Info "
|
||||||
|
"preferred mode\n", __func__, id);
|
||||||
|
gDisplay[displayIndex]->attached = true;
|
||||||
|
memcpy(&gDisplay[displayIndex]->preferredMode,
|
||||||
|
&preferredMode, sizeof(display_mode));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// If no display found yet, try more standard detection methods
|
// If no display found yet, try more standard detection methods
|
||||||
if (gDisplay[displayIndex]->attached == false) {
|
if (gDisplay[displayIndex]->attached == false) {
|
||||||
TRACE("%s: connector(%" B_PRIu32 "): bit-banging ddc for EDID.\n",
|
TRACE("%s: connector(%" B_PRIu32 "): bit-banging ddc for EDID.\n",
|
||||||
__func__, id);
|
__func__, id);
|
||||||
|
|
||||||
// Lets try bit-banging edid from connector
|
// Bit-bang edid from connector
|
||||||
gDisplay[displayIndex]->attached
|
gDisplay[displayIndex]->attached = connector_read_edid(id,
|
||||||
= connector_read_edid(id, &gDisplay[displayIndex]->edidData);
|
&gDisplay[displayIndex]->edidData);
|
||||||
|
|
||||||
// Found EDID data?
|
// Found EDID data?
|
||||||
if (gDisplay[displayIndex]->attached) {
|
if (gDisplay[displayIndex]->attached) {
|
||||||
@@ -334,17 +356,6 @@ detect_displays()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// If we haven't found EDID yet and LVDS, check LVDS_Info table
|
|
||||||
if (gDisplay[displayIndex]->attached == false
|
|
||||||
&& gConnector[id]->type == VIDEO_CONNECTOR_LVDS) {
|
|
||||||
gDisplay[displayIndex]->attached = connector_read_mode_lvds(id,
|
|
||||||
&gDisplay[displayIndex]->preferredMode);
|
|
||||||
if (gDisplay[displayIndex]->attached) {
|
|
||||||
TRACE("%s: connector(%" B_PRIu32 "): using AtomBIOS LVDS_Info "
|
|
||||||
"preferred mode\n", __func__, id);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (gDisplay[displayIndex]->attached != true) {
|
if (gDisplay[displayIndex]->attached != true) {
|
||||||
// Nothing interesting here, move along
|
// Nothing interesting here, move along
|
||||||
continue;
|
continue;
|
||||||
|
|||||||
Reference in New Issue
Block a user