diff options
-rw-r--r-- | src/radeon.h | 1 | ||||
-rw-r--r-- | src/radeon_bios.c | 102 | ||||
-rw-r--r-- | src/radeon_display.c | 237 | ||||
-rw-r--r-- | src/radeon_driver.c | 10 | ||||
-rw-r--r-- | src/radeon_probe.h | 3 |
5 files changed, 190 insertions, 163 deletions
diff --git a/src/radeon.h b/src/radeon.h index 922afa55..32692cd0 100644 --- a/src/radeon.h +++ b/src/radeon.h @@ -905,6 +905,7 @@ extern void RADEONDisplayPowerManagementSet(ScrnInfoPtr pScrn, int PowerManagementMode, int flags); extern Bool RADEONAllocateControllers(ScrnInfoPtr pScrn); +extern Bool RADEONAllocateConnectors(ScrnInfoPtr pScrn); extern int RADEONValidateMergeModes(ScrnInfoPtr pScrn); extern int RADEONValidateDDCModes(ScrnInfoPtr pScrn1, char **ppModeName, diff --git a/src/radeon_bios.c b/src/radeon_bios.c index 38a5f8b5..1d4c9bbb 100644 --- a/src/radeon_bios.c +++ b/src/radeon_bios.c @@ -148,46 +148,46 @@ Bool RADEONGetConnectorInfoFromBIOS (ScrnInfoPtr pScrn) /* sharing same port with id[0] */ if (((portinfo>>8) & 0xf) == id[0]) { if (i == 3) - pRADEONEnt->PortInfo[0].TMDSType = TMDS_INT; + pRADEONEnt->PortInfo[0]->TMDSType = TMDS_INT; else if (i == 7) - pRADEONEnt->PortInfo[0].TMDSType = TMDS_EXT; + pRADEONEnt->PortInfo[0]->TMDSType = TMDS_EXT; - if (pRADEONEnt->PortInfo[0].DACType == DAC_UNKNOWN) - pRADEONEnt->PortInfo[0].DACType = (portinfo & 0xf) - 1; + if (pRADEONEnt->PortInfo[0]->DACType == DAC_UNKNOWN) + pRADEONEnt->PortInfo[0]->DACType = (portinfo & 0xf) - 1; continue; } } id[crtc] = (portinfo>>8) & 0xf; - pRADEONEnt->PortInfo[crtc].DACType = (portinfo & 0xf) - 1; - pRADEONEnt->PortInfo[crtc].ConnectorType = (portinfo>>4) & 0xf; + pRADEONEnt->PortInfo[crtc]->DACType = (portinfo & 0xf) - 1; + pRADEONEnt->PortInfo[crtc]->ConnectorType = (portinfo>>4) & 0xf; if (i == 3) - pRADEONEnt->PortInfo[crtc].TMDSType = TMDS_INT; + pRADEONEnt->PortInfo[crtc]->TMDSType = TMDS_INT; else if (i == 7) - pRADEONEnt->PortInfo[crtc].TMDSType = TMDS_EXT; + pRADEONEnt->PortInfo[crtc]->TMDSType = TMDS_EXT; if((tmp0 = RADEON_BIOS16 (info->MasterDataStart + 24)) && id[crtc]) { switch (RADEON_BIOS16 (tmp0 + 4 + 27 * id[crtc]) * 4) { case RADEON_GPIO_MONID: - pRADEONEnt->PortInfo[crtc].DDCType = DDC_MONID; + pRADEONEnt->PortInfo[crtc]->DDCType = DDC_MONID; break; case RADEON_GPIO_DVI_DDC: - pRADEONEnt->PortInfo[crtc].DDCType = DDC_DVI; + pRADEONEnt->PortInfo[crtc]->DDCType = DDC_DVI; break; case RADEON_GPIO_VGA_DDC: - pRADEONEnt->PortInfo[crtc].DDCType = DDC_VGA; + pRADEONEnt->PortInfo[crtc]->DDCType = DDC_VGA; break; case RADEON_GPIO_CRT2_DDC: - pRADEONEnt->PortInfo[crtc].DDCType = DDC_CRT2; + pRADEONEnt->PortInfo[crtc]->DDCType = DDC_CRT2; break; default: - pRADEONEnt->PortInfo[crtc].DDCType = DDC_NONE_DETECTED; + pRADEONEnt->PortInfo[crtc]->DDCType = DDC_NONE_DETECTED; break; } } else { - pRADEONEnt->PortInfo[crtc].DDCType = DDC_NONE_DETECTED; + pRADEONEnt->PortInfo[crtc]->DDCType = DDC_NONE_DETECTED; } crtc++; } else { @@ -197,12 +197,12 @@ Bool RADEONGetConnectorInfoFromBIOS (ScrnInfoPtr pScrn) for (j=0; j<2; j++) { if (((portinfo>>8) & 0xf) == id[j]) { if (i == 3) - pRADEONEnt->PortInfo[j].TMDSType = TMDS_INT; + pRADEONEnt->PortInfo[j]->TMDSType = TMDS_INT; else if (i == 7) - pRADEONEnt->PortInfo[j].TMDSType = TMDS_EXT; + pRADEONEnt->PortInfo[j]->TMDSType = TMDS_EXT; - if (pRADEONEnt->PortInfo[j].DACType == DAC_UNKNOWN) - pRADEONEnt->PortInfo[j].DACType = (portinfo & 0xf) - 1; + if (pRADEONEnt->PortInfo[j]->DACType == DAC_UNKNOWN) + pRADEONEnt->PortInfo[j]->DACType = (portinfo & 0xf) - 1; } } } @@ -211,8 +211,8 @@ Bool RADEONGetConnectorInfoFromBIOS (ScrnInfoPtr pScrn) for (i=0; i<2; i++) { xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Port%d: DDCType-%d, DACType-%d, TMDSType-%d, ConnectorType-%d\n", - i, pRADEONEnt->PortInfo[i].DDCType, pRADEONEnt->PortInfo[i].DACType, - pRADEONEnt->PortInfo[i].TMDSType, pRADEONEnt->PortInfo[i].ConnectorType); + i, pRADEONEnt->PortInfo[i]->DDCType, pRADEONEnt->PortInfo[i]->DACType, + pRADEONEnt->PortInfo[i]->TMDSType, pRADEONEnt->PortInfo[i]->ConnectorType); } } else { xf86DrvMsg(pScrn->scrnIndex, X_WARNING, "No Device Info Table found!\n"); @@ -239,25 +239,25 @@ Bool RADEONGetConnectorInfoFromBIOS (ScrnInfoPtr pScrn) tmp0 = RADEON_BIOS16(tmp + i*2); if (((tmp0 >> 12) & 0x0f) == 0) continue; /* no connector */ if (connector_found > 0) { - if (pRADEONEnt->PortInfo[tmp1].DDCType == ((tmp0 >> 8) & 0x0f)) + if (pRADEONEnt->PortInfo[tmp1]->DDCType == ((tmp0 >> 8) & 0x0f)) continue; /* same connector */ } /* internal DDC_DVI port will get assigned to PortInfo[0], or if there is no DDC_DVI (like in some IGPs). */ tmp1 = ((((tmp0 >> 8) & 0xf) == DDC_DVI) || (tmp1 == 1)) ? 0 : 1; /* determine port info index */ - pRADEONEnt->PortInfo[tmp1].DDCType = (tmp0 >> 8) & 0x0f; - if (pRADEONEnt->PortInfo[tmp1].DDCType > DDC_CRT2) pRADEONEnt->PortInfo[tmp1].DDCType = DDC_NONE_DETECTED; - pRADEONEnt->PortInfo[tmp1].DACType = (tmp0 & 0x01) ? DAC_TVDAC : DAC_PRIMARY; - pRADEONEnt->PortInfo[tmp1].ConnectorType = (tmp0 >> 12) & 0x0f; - if (pRADEONEnt->PortInfo[tmp1].ConnectorType > CONNECTOR_UNSUPPORTED) pRADEONEnt->PortInfo[tmp1].ConnectorType = CONNECTOR_UNSUPPORTED; - pRADEONEnt->PortInfo[tmp1].TMDSType = ((tmp0 >> 4) & 0x01) ? TMDS_EXT : TMDS_INT; + pRADEONEnt->PortInfo[tmp1]->DDCType = (tmp0 >> 8) & 0x0f; + if (pRADEONEnt->PortInfo[tmp1]->DDCType > DDC_CRT2) pRADEONEnt->PortInfo[tmp1]->DDCType = DDC_NONE_DETECTED; + pRADEONEnt->PortInfo[tmp1]->DACType = (tmp0 & 0x01) ? DAC_TVDAC : DAC_PRIMARY; + pRADEONEnt->PortInfo[tmp1]->ConnectorType = (tmp0 >> 12) & 0x0f; + if (pRADEONEnt->PortInfo[tmp1]->ConnectorType > CONNECTOR_UNSUPPORTED) pRADEONEnt->PortInfo[tmp1]->ConnectorType = CONNECTOR_UNSUPPORTED; + pRADEONEnt->PortInfo[tmp1]->TMDSType = ((tmp0 >> 4) & 0x01) ? TMDS_EXT : TMDS_INT; /* some sanity checks */ - if (((pRADEONEnt->PortInfo[tmp1].ConnectorType != CONNECTOR_DVI_D) && - (pRADEONEnt->PortInfo[tmp1].ConnectorType != CONNECTOR_DVI_I)) && - pRADEONEnt->PortInfo[tmp1].TMDSType == TMDS_INT) - pRADEONEnt->PortInfo[tmp1].TMDSType = TMDS_UNKNOWN; + if (((pRADEONEnt->PortInfo[tmp1]->ConnectorType != CONNECTOR_DVI_D) && + (pRADEONEnt->PortInfo[tmp1]->ConnectorType != CONNECTOR_DVI_I)) && + pRADEONEnt->PortInfo[tmp1]->TMDSType == TMDS_INT) + pRADEONEnt->PortInfo[tmp1]->TMDSType = TMDS_UNKNOWN; connector_found += (tmp1 + 1); } @@ -271,15 +271,15 @@ Bool RADEONGetConnectorInfoFromBIOS (ScrnInfoPtr pScrn) we assume LVDS is not listed in the connector table, add it in here as the first port. */ - if ((connector_found < 3) && (pRADEONEnt->PortInfo[tmp1].ConnectorType == CONNECTOR_CRT)) { + if ((connector_found < 3) && (pRADEONEnt->PortInfo[tmp1]->ConnectorType == CONNECTOR_CRT)) { if (connector_found == 1) { memcpy (&pRADEONEnt->PortInfo[1], &pRADEONEnt->PortInfo[0], sizeof (pRADEONEnt->PortInfo[0])); } - pRADEONEnt->PortInfo[0].DACType = DAC_TVDAC; - pRADEONEnt->PortInfo[0].TMDSType = TMDS_UNKNOWN; - pRADEONEnt->PortInfo[0].DDCType = DDC_NONE_DETECTED; - pRADEONEnt->PortInfo[0].ConnectorType = CONNECTOR_PROPRIETARY; + pRADEONEnt->PortInfo[0]->DACType = DAC_TVDAC; + pRADEONEnt->PortInfo[0]->TMDSType = TMDS_UNKNOWN; + pRADEONEnt->PortInfo[0]->DDCType = DDC_NONE_DETECTED; + pRADEONEnt->PortInfo[0]->ConnectorType = CONNECTOR_PROPRIETARY; xf86DrvMsg(pScrn->scrnIndex, X_INFO, "LVDS port is not in connector table, added in.\n"); if (connector_found == 0) connector_found = 1; @@ -289,12 +289,12 @@ Bool RADEONGetConnectorInfoFromBIOS (ScrnInfoPtr pScrn) if ((tmp = RADEON_BIOS16(info->ROMHeaderStart + 0x42))) { if ((tmp0 = RADEON_BIOS16(tmp + 0x15))) { if ((tmp1 = RADEON_BIOS8(tmp0+2) & 0x07)) { - pRADEONEnt->PortInfo[0].DDCType = tmp1; - if (pRADEONEnt->PortInfo[0].DDCType > DDC_CRT2) { + pRADEONEnt->PortInfo[0]->DDCType = tmp1; + if (pRADEONEnt->PortInfo[0]->DDCType > DDC_CRT2) { xf86DrvMsg(pScrn->scrnIndex, X_WARNING, "Unknown DDCType %d found\n", - pRADEONEnt->PortInfo[0].DDCType); - pRADEONEnt->PortInfo[0].DDCType = DDC_NONE_DETECTED; + pRADEONEnt->PortInfo[0]->DDCType); + pRADEONEnt->PortInfo[0]->DDCType = DDC_NONE_DETECTED; } xf86DrvMsg(pScrn->scrnIndex, X_WARNING, "LCD DDC Info Table found!\n"); } @@ -303,10 +303,10 @@ Bool RADEONGetConnectorInfoFromBIOS (ScrnInfoPtr pScrn) } else if (connector_found == 2) { memcpy (&pRADEONEnt->PortInfo[0], &pRADEONEnt->PortInfo[1], sizeof (pRADEONEnt->PortInfo[0])); - pRADEONEnt->PortInfo[1].DACType = DAC_UNKNOWN; - pRADEONEnt->PortInfo[1].TMDSType = TMDS_UNKNOWN; - pRADEONEnt->PortInfo[1].DDCType = DDC_NONE_DETECTED; - pRADEONEnt->PortInfo[1].ConnectorType = CONNECTOR_NONE; + pRADEONEnt->PortInfo[1]->DACType = DAC_UNKNOWN; + pRADEONEnt->PortInfo[1]->TMDSType = TMDS_UNKNOWN; + pRADEONEnt->PortInfo[1]->DDCType = DDC_NONE_DETECTED; + pRADEONEnt->PortInfo[1]->ConnectorType = CONNECTOR_NONE; connector_found = 1; } @@ -314,22 +314,22 @@ Bool RADEONGetConnectorInfoFromBIOS (ScrnInfoPtr pScrn) xf86DrvMsg(pScrn->scrnIndex, X_WARNING, "No connector found in Connector Info Table.\n"); } else { xf86DrvMsg(0, X_INFO, "Connector0: DDCType-%d, DACType-%d, TMDSType-%d, ConnectorType-%d\n", - pRADEONEnt->PortInfo[0].DDCType, pRADEONEnt->PortInfo[0].DACType, - pRADEONEnt->PortInfo[0].TMDSType, pRADEONEnt->PortInfo[0].ConnectorType); + pRADEONEnt->PortInfo[0]->DDCType, pRADEONEnt->PortInfo[0]->DACType, + pRADEONEnt->PortInfo[0]->TMDSType, pRADEONEnt->PortInfo[0]->ConnectorType); } if (connector_found == 3) { xf86DrvMsg(0, X_INFO, "Connector1: DDCType-%d, DACType-%d, TMDSType-%d, ConnectorType-%d\n", - pRADEONEnt->PortInfo[1].DDCType, pRADEONEnt->PortInfo[1].DACType, - pRADEONEnt->PortInfo[1].TMDSType, pRADEONEnt->PortInfo[1].ConnectorType); + pRADEONEnt->PortInfo[1]->DDCType, pRADEONEnt->PortInfo[1]->DACType, + pRADEONEnt->PortInfo[1]->TMDSType, pRADEONEnt->PortInfo[1]->ConnectorType); } #if 0 /* External TMDS Table, not used now */ if ((tmp0 = RADEON_BIOS16(info->ROMHeaderStart + 0x58))) { - //pRADEONEnt->PortInfo[1].DDCType = (RADEON_BIOS8(tmp0 + 7) & 0x07); - //pRADEONEnt->PortInfo[1].ConnectorType = CONNECTOR_DVI_I; - //pRADEONEnt->PortInfo[1].TMDSType = TMDS_EXT; + //pRADEONEnt->PortInfo[1]->DDCType = (RADEON_BIOS8(tmp0 + 7) & 0x07); + //pRADEONEnt->PortInfo[1]->ConnectorType = CONNECTOR_DVI_I; + //pRADEONEnt->PortInfo[1]->TMDSType = TMDS_EXT; xf86DrvMsg(pScrn->scrnIndex, X_INFO, "External TMDS found.\n"); } else { diff --git a/src/radeon_display.c b/src/radeon_display.c index 76dfc49f..bf068d6c 100644 --- a/src/radeon_display.c +++ b/src/radeon_display.c @@ -850,7 +850,7 @@ static Bool RADEONGetLVDSInfo (ScrnInfoPtr pScrn) tmp_mode = tmp_mode->next; } } - if ((info->DotClock == 0) && !pRADEONEnt->PortInfo[0].MonInfo) { + if ((info->DotClock == 0) && !pRADEONEnt->PortInfo[0]->MonInfo) { xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "Panel size is not correctly detected.\n" "Please try to use PanelSize option for correct settings.\n"); @@ -935,12 +935,12 @@ void RADEONSetupConnectors(ScrnInfoPtr pScrn) * If not, we may have problem -- need to use MonitorLayout option. */ for (i = 0; i < 2; i++) { - pRADEONEnt->PortInfo[i].MonType = MT_UNKNOWN; - pRADEONEnt->PortInfo[i].MonInfo = NULL; - pRADEONEnt->PortInfo[i].DDCType = DDC_NONE_DETECTED; - pRADEONEnt->PortInfo[i].DACType = DAC_UNKNOWN; - pRADEONEnt->PortInfo[i].TMDSType = TMDS_UNKNOWN; - pRADEONEnt->PortInfo[i].ConnectorType = CONNECTOR_NONE; + pRADEONEnt->PortInfo[i]->MonType = MT_UNKNOWN; + pRADEONEnt->PortInfo[i]->MonInfo = NULL; + pRADEONEnt->PortInfo[i]->DDCType = DDC_NONE_DETECTED; + pRADEONEnt->PortInfo[i]->DACType = DAC_UNKNOWN; + pRADEONEnt->PortInfo[i]->TMDSType = TMDS_UNKNOWN; + pRADEONEnt->PortInfo[i]->ConnectorType = CONNECTOR_NONE; } pRADEONEnt->Controller[0]->IsUsed = FALSE; pRADEONEnt->Controller[1]->IsUsed = FALSE; @@ -948,48 +948,48 @@ void RADEONSetupConnectors(ScrnInfoPtr pScrn) pRADEONEnt->Controller[1]->IsActive = FALSE; if (!RADEONGetConnectorInfoFromBIOS(pScrn) || - ((pRADEONEnt->PortInfo[0].DDCType == 0) && - (pRADEONEnt->PortInfo[1].DDCType == 0))) { + ((pRADEONEnt->PortInfo[0]->DDCType == 0) && + (pRADEONEnt->PortInfo[1]->DDCType == 0))) { /* Below is the most common setting, but may not be true */ - pRADEONEnt->PortInfo[0].MonType = MT_UNKNOWN; - pRADEONEnt->PortInfo[0].MonInfo = NULL; - pRADEONEnt->PortInfo[0].DDCType = DDC_DVI; - pRADEONEnt->PortInfo[0].DACType = DAC_TVDAC; - pRADEONEnt->PortInfo[0].TMDSType = TMDS_INT; - pRADEONEnt->PortInfo[0].ConnectorType = CONNECTOR_DVI_I; + pRADEONEnt->PortInfo[0]->MonType = MT_UNKNOWN; + pRADEONEnt->PortInfo[0]->MonInfo = NULL; + pRADEONEnt->PortInfo[0]->DDCType = DDC_DVI; + pRADEONEnt->PortInfo[0]->DACType = DAC_TVDAC; + pRADEONEnt->PortInfo[0]->TMDSType = TMDS_INT; + pRADEONEnt->PortInfo[0]->ConnectorType = CONNECTOR_DVI_I; - pRADEONEnt->PortInfo[1].MonType = MT_UNKNOWN; - pRADEONEnt->PortInfo[1].MonInfo = NULL; - pRADEONEnt->PortInfo[1].DDCType = DDC_VGA; - pRADEONEnt->PortInfo[1].DACType = DAC_PRIMARY; - pRADEONEnt->PortInfo[1].TMDSType = TMDS_EXT; - pRADEONEnt->PortInfo[1].ConnectorType = CONNECTOR_CRT; + pRADEONEnt->PortInfo[1]->MonType = MT_UNKNOWN; + pRADEONEnt->PortInfo[1]->MonInfo = NULL; + pRADEONEnt->PortInfo[1]->DDCType = DDC_VGA; + pRADEONEnt->PortInfo[1]->DACType = DAC_PRIMARY; + pRADEONEnt->PortInfo[1]->TMDSType = TMDS_EXT; + pRADEONEnt->PortInfo[1]->ConnectorType = CONNECTOR_CRT; /* Some cards have the DDC lines swapped and we have no way to * detect it yet (Mac cards) */ if (xf86ReturnOptValBool(info->Options, OPTION_REVERSE_DDC, FALSE)) { - pRADEONEnt->PortInfo[0].DDCType = DDC_VGA; - pRADEONEnt->PortInfo[1].DDCType = DDC_DVI; + pRADEONEnt->PortInfo[0]->DDCType = DDC_VGA; + pRADEONEnt->PortInfo[1]->DDCType = DDC_DVI; } } /* always make TMDS_INT port first*/ - if (pRADEONEnt->PortInfo[1].TMDSType == TMDS_INT) { - RADEONConnector connector; + if (pRADEONEnt->PortInfo[1]->TMDSType == TMDS_INT) { + RADEONConnector *connector; connector = pRADEONEnt->PortInfo[0]; pRADEONEnt->PortInfo[0] = pRADEONEnt->PortInfo[1]; pRADEONEnt->PortInfo[1] = connector; - } else if ((pRADEONEnt->PortInfo[0].TMDSType != TMDS_INT && - pRADEONEnt->PortInfo[1].TMDSType != TMDS_INT)) { + } else if ((pRADEONEnt->PortInfo[0]->TMDSType != TMDS_INT && + pRADEONEnt->PortInfo[1]->TMDSType != TMDS_INT)) { /* no TMDS_INT port, make primary DAC port first */ /* On my Inspiron 8600 both internal and external ports are marked DAC_PRIMARY in BIOS. So be extra careful - only swap when the first port is not DAC_PRIMARY */ - if ((!(pRADEONEnt->PortInfo[0].ConnectorType == CONNECTOR_PROPRIETARY)) && (pRADEONEnt->PortInfo[1].DACType == DAC_PRIMARY) && - (pRADEONEnt->PortInfo[0].DACType != DAC_PRIMARY)) { - RADEONConnector connector; + if ((!(pRADEONEnt->PortInfo[0]->ConnectorType == CONNECTOR_PROPRIETARY)) && (pRADEONEnt->PortInfo[1]->DACType == DAC_PRIMARY) && + (pRADEONEnt->PortInfo[0]->DACType != DAC_PRIMARY)) { + RADEONConnector *connector; connector = pRADEONEnt->PortInfo[0]; pRADEONEnt->PortInfo[0] = pRADEONEnt->PortInfo[1]; pRADEONEnt->PortInfo[1] = connector; @@ -998,15 +998,15 @@ void RADEONSetupConnectors(ScrnInfoPtr pScrn) if (info->HasSingleDAC) { /* For RS300/RS350/RS400 chips, there is no primary DAC. Force VGA port to use TVDAC*/ - if (pRADEONEnt->PortInfo[0].ConnectorType == CONNECTOR_CRT) { - pRADEONEnt->PortInfo[0].DACType = DAC_TVDAC; - pRADEONEnt->PortInfo[1].DACType = DAC_PRIMARY; + if (pRADEONEnt->PortInfo[0]->ConnectorType == CONNECTOR_CRT) { + pRADEONEnt->PortInfo[0]->DACType = DAC_TVDAC; + pRADEONEnt->PortInfo[1]->DACType = DAC_PRIMARY; } else { - pRADEONEnt->PortInfo[1].DACType = DAC_TVDAC; - pRADEONEnt->PortInfo[0].DACType = DAC_PRIMARY; + pRADEONEnt->PortInfo[1]->DACType = DAC_TVDAC; + pRADEONEnt->PortInfo[0]->DACType = DAC_PRIMARY; } } else if (!pRADEONEnt->HasCRTC2) { - pRADEONEnt->PortInfo[0].DACType = DAC_PRIMARY; + pRADEONEnt->PortInfo[0]->DACType = DAC_PRIMARY; } /* IgnoreEDID option is different from the NoDDCxx options used by DDC module @@ -1084,7 +1084,7 @@ void RADEONSetupConnectors(ScrnInfoPtr pScrn) { if (strcmp(s1, MonTypeName[i]) == 0) { - pRADEONEnt->PortInfo[0].MonType = MonTypeID[i]; + pRADEONEnt->PortInfo[0]->MonType = MonTypeID[i]; break; } } @@ -1096,7 +1096,7 @@ void RADEONSetupConnectors(ScrnInfoPtr pScrn) { if (strcmp(s2, MonTypeName[i]) == 0) { - pRADEONEnt->PortInfo[1].MonType = MonTypeID[i]; + pRADEONEnt->PortInfo[1]->MonType = MonTypeID[i]; break; } @@ -1112,29 +1112,29 @@ void RADEONSetupConnectors(ScrnInfoPtr pScrn) xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "MonitorLayout Option: \n\tMonitor1--Type %s, Monitor2--Type %s\n\n", s1, s2); #if 0 - if (pRADEONEnt->PortInfo[1].MonType == MT_CRT) { - pRADEONEnt->PortInfo[1].DACType = DAC_PRIMARY; - pRADEONEnt->PortInfo[1].TMDSType = TMDS_UNKNOWN; - pRADEONEnt->PortInfo[1].DDCType = DDC_VGA; - pRADEONEnt->PortInfo[1].ConnectorType = CONNECTOR_CRT; - pRADEONEnt->PortInfo[0].DACType = DAC_TVDAC; - pRADEONEnt->PortInfo[0].TMDSType = TMDS_UNKNOWN; - pRADEONEnt->PortInfo[0].DDCType = DDC_NONE_DETECTED; - pRADEONEnt->PortInfo[0].ConnectorType = pRADEONEnt->PortInfo[0].MonType+1; - pRADEONEnt->PortInfo[0].MonInfo = NULL; + if (pRADEONEnt->PortInfo[1]->MonType == MT_CRT) { + pRADEONEnt->PortInfo[1]->DACType = DAC_PRIMARY; + pRADEONEnt->PortInfo[1]->TMDSType = TMDS_UNKNOWN; + pRADEONEnt->PortInfo[1]->DDCType = DDC_VGA; + pRADEONEnt->PortInfo[1]->ConnectorType = CONNECTOR_CRT; + pRADEONEnt->PortInfo[0]->DACType = DAC_TVDAC; + pRADEONEnt->PortInfo[0]->TMDSType = TMDS_UNKNOWN; + pRADEONEnt->PortInfo[0]->DDCType = DDC_NONE_DETECTED; + pRADEONEnt->PortInfo[0]->ConnectorType = pRADEONEnt->PortInfo[0]->MonType+1; + pRADEONEnt->PortInfo[0]->MonInfo = NULL; } #endif /* some thinkpads and powerbooks use lvds and internal tmds * at the same time. --AGD */ - if ((pRADEONEnt->PortInfo[0].MonType == MT_LCD) && - (pRADEONEnt->PortInfo[1].MonType == MT_DFP)) { - pRADEONEnt->PortInfo[1].DDCType = DDC_DVI; - pRADEONEnt->PortInfo[0].DDCType = DDC_MONID; - pRADEONEnt->PortInfo[1].TMDSType = TMDS_INT; - pRADEONEnt->PortInfo[1].ConnectorType = CONNECTOR_DVI_I; - pRADEONEnt->PortInfo[0].TMDSType = TMDS_UNKNOWN; + if ((pRADEONEnt->PortInfo[0]->MonType == MT_LCD) && + (pRADEONEnt->PortInfo[1]->MonType == MT_DFP)) { + pRADEONEnt->PortInfo[1]->DDCType = DDC_DVI; + pRADEONEnt->PortInfo[0]->DDCType = DDC_MONID; + pRADEONEnt->PortInfo[1]->TMDSType = TMDS_INT; + pRADEONEnt->PortInfo[1]->ConnectorType = CONNECTOR_DVI_I; + pRADEONEnt->PortInfo[0]->TMDSType = TMDS_UNKNOWN; } } @@ -1163,96 +1163,96 @@ static void RADEONQueryConnectedDisplays(ScrnInfoPtr pScrn) if ((s = xf86GetOptValString(info->Options, OPTION_MONITOR_LAYOUT))) { if (!ignore_edid) { - if ((pRADEONEnt->PortInfo[0].MonType > MT_NONE) && - (pRADEONEnt->PortInfo[0].MonType < MT_STV)) - RADEONDisplayDDCConnected(pScrn, pRADEONEnt->PortInfo[0].DDCType, - &pRADEONEnt->PortInfo[0]); - if ((pRADEONEnt->PortInfo[1].MonType > MT_NONE) && - (pRADEONEnt->PortInfo[1].MonType < MT_STV)) - RADEONDisplayDDCConnected(pScrn, pRADEONEnt->PortInfo[1].DDCType, - &pRADEONEnt->PortInfo[1]); + if ((pRADEONEnt->PortInfo[0]->MonType > MT_NONE) && + (pRADEONEnt->PortInfo[0]->MonType < MT_STV)) + RADEONDisplayDDCConnected(pScrn, pRADEONEnt->PortInfo[0]->DDCType, + pRADEONEnt->PortInfo[0]); + if ((pRADEONEnt->PortInfo[1]->MonType > MT_NONE) && + (pRADEONEnt->PortInfo[1]->MonType < MT_STV)) + RADEONDisplayDDCConnected(pScrn, pRADEONEnt->PortInfo[1]->DDCType, + pRADEONEnt->PortInfo[1]); } } else { /* force monitor redetection */ - pRADEONEnt->PortInfo[0].MonType = MT_UNKNOWN; - pRADEONEnt->PortInfo[1].MonType = MT_UNKNOWN; + pRADEONEnt->PortInfo[0]->MonType = MT_UNKNOWN; + pRADEONEnt->PortInfo[1]->MonType = MT_UNKNOWN; } - if (pRADEONEnt->PortInfo[0].MonType == MT_UNKNOWN || pRADEONEnt->PortInfo[1].MonType == MT_UNKNOWN) { + if (pRADEONEnt->PortInfo[0]->MonType == MT_UNKNOWN || pRADEONEnt->PortInfo[1]->MonType == MT_UNKNOWN) { - if ((!pRADEONEnt->HasCRTC2) && (pRADEONEnt->PortInfo[0].MonType == MT_UNKNOWN)) { - if((pRADEONEnt->PortInfo[0].MonType = RADEONDisplayDDCConnected(pScrn, DDC_DVI, - &pRADEONEnt->PortInfo[0]))); - else if((pRADEONEnt->PortInfo[0].MonType = RADEONDisplayDDCConnected(pScrn, DDC_VGA, - &pRADEONEnt->PortInfo[0]))); - else if((pRADEONEnt->PortInfo[0].MonType = RADEONDisplayDDCConnected(pScrn, DDC_CRT2, - &pRADEONEnt->PortInfo[0]))); + if ((!pRADEONEnt->HasCRTC2) && (pRADEONEnt->PortInfo[0]->MonType == MT_UNKNOWN)) { + if((pRADEONEnt->PortInfo[0]->MonType = RADEONDisplayDDCConnected(pScrn, DDC_DVI, + pRADEONEnt->PortInfo[0]))); + else if((pRADEONEnt->PortInfo[0]->MonType = RADEONDisplayDDCConnected(pScrn, DDC_VGA, + pRADEONEnt->PortInfo[0]))); + else if((pRADEONEnt->PortInfo[0]->MonType = RADEONDisplayDDCConnected(pScrn, DDC_CRT2, + pRADEONEnt->PortInfo[0]))); else - pRADEONEnt->PortInfo[0].MonType = MT_CRT; + pRADEONEnt->PortInfo[0]->MonType = MT_CRT; if (!ignore_edid) { - if (pRADEONEnt->PortInfo[0].MonInfo) { + if (pRADEONEnt->PortInfo[0]->MonInfo) { xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Monitor1 EDID data ---------------------------\n"); - xf86PrintEDID(pRADEONEnt->PortInfo[0].MonInfo ); + xf86PrintEDID(pRADEONEnt->PortInfo[0]->MonInfo ); xf86DrvMsg(pScrn->scrnIndex, X_INFO, "End of Monitor1 EDID data --------------------\n"); } } - pRADEONEnt->PortInfo[1].MonType = MT_NONE; - pRADEONEnt->PortInfo[1].MonInfo = NULL; - pRADEONEnt->PortInfo[1].DDCType = DDC_NONE_DETECTED; - pRADEONEnt->PortInfo[1].DACType = DAC_UNKNOWN; - pRADEONEnt->PortInfo[1].TMDSType = TMDS_UNKNOWN; - pRADEONEnt->PortInfo[1].ConnectorType = CONNECTOR_NONE; + pRADEONEnt->PortInfo[1]->MonType = MT_NONE; + pRADEONEnt->PortInfo[1]->MonInfo = NULL; + pRADEONEnt->PortInfo[1]->DDCType = DDC_NONE_DETECTED; + pRADEONEnt->PortInfo[1]->DACType = DAC_UNKNOWN; + pRADEONEnt->PortInfo[1]->TMDSType = TMDS_UNKNOWN; + pRADEONEnt->PortInfo[1]->ConnectorType = CONNECTOR_NONE; - pRADEONEnt->Controller[0]->pPort = &pRADEONEnt->PortInfo[0]; - pRADEONEnt->Controller[1]->pPort = &pRADEONEnt->PortInfo[1]; + pRADEONEnt->Controller[0]->pPort = pRADEONEnt->PortInfo[0]; + pRADEONEnt->Controller[1]->pPort = pRADEONEnt->PortInfo[1]; return; } /* Primary Head (DVI or Laptop Int. panel)*/ /* A ddc capable display connected on DVI port */ - if (pRADEONEnt->PortInfo[0].MonType == MT_UNKNOWN) { - if((pRADEONEnt->PortInfo[0].MonType = RADEONDisplayDDCConnected(pScrn, - pRADEONEnt->PortInfo[0].DDCType, - &pRADEONEnt->PortInfo[0]))); + if (pRADEONEnt->PortInfo[0]->MonType == MT_UNKNOWN) { + if((pRADEONEnt->PortInfo[0]->MonType = RADEONDisplayDDCConnected(pScrn, + pRADEONEnt->PortInfo[0]->DDCType, + pRADEONEnt->PortInfo[0]))); else if (info->IsMobility && (INREG(RADEON_BIOS_4_SCRATCH) & 4)) { /* non-DDC laptop panel connected on primary */ - pRADEONEnt->PortInfo[0].MonType = MT_LCD; + pRADEONEnt->PortInfo[0]->MonType = MT_LCD; } else { /* CRT on DVI, TODO: not reliable, make it always return false for now*/ - pRADEONEnt->PortInfo[0].MonType = RADEONCrtIsPhysicallyConnected(pScrn, !(pRADEONEnt->PortInfo[0].DACType)); + pRADEONEnt->PortInfo[0]->MonType = RADEONCrtIsPhysicallyConnected(pScrn, !(pRADEONEnt->PortInfo[0]->DACType)); } } /* Secondary Head (mostly VGA, can be DVI on some OEM boards)*/ - if (pRADEONEnt->PortInfo[1].MonType == MT_UNKNOWN) { - if((pRADEONEnt->PortInfo[1].MonType = - RADEONDisplayDDCConnected(pScrn, pRADEONEnt->PortInfo[1].DDCType, &pRADEONEnt->PortInfo[1]))); + if (pRADEONEnt->PortInfo[1]->MonType == MT_UNKNOWN) { + if((pRADEONEnt->PortInfo[1]->MonType = + RADEONDisplayDDCConnected(pScrn, pRADEONEnt->PortInfo[1]->DDCType, pRADEONEnt->PortInfo[1]))); else if (info->IsMobility && (INREG(RADEON_FP2_GEN_CNTL) & RADEON_FP2_ON)) { /* non-DDC TMDS panel connected through DVO */ - pRADEONEnt->PortInfo[1].MonType = MT_DFP; + pRADEONEnt->PortInfo[1]->MonType = MT_DFP; } else - pRADEONEnt->PortInfo[1].MonType = RADEONCrtIsPhysicallyConnected(pScrn, !(pRADEONEnt->PortInfo[1].DACType)); + pRADEONEnt->PortInfo[1]->MonType = RADEONCrtIsPhysicallyConnected(pScrn, !(pRADEONEnt->PortInfo[1]->DACType)); } } if(ignore_edid) { - pRADEONEnt->PortInfo[0].MonInfo = NULL; - pRADEONEnt->PortInfo[1].MonInfo = NULL; + pRADEONEnt->PortInfo[0]->MonInfo = NULL; + pRADEONEnt->PortInfo[1]->MonInfo = NULL; } else { - if (pRADEONEnt->PortInfo[0].MonInfo) { + if (pRADEONEnt->PortInfo[0]->MonInfo) { xf86DrvMsg(pScrn->scrnIndex, X_INFO, "EDID data from the display on 1st port ----------------------\n"); - xf86PrintEDID( pRADEONEnt->PortInfo[0].MonInfo ); + xf86PrintEDID( pRADEONEnt->PortInfo[0]->MonInfo ); } - if (pRADEONEnt->PortInfo[1].MonInfo) { + if (pRADEONEnt->PortInfo[1]->MonInfo) { xf86DrvMsg(pScrn->scrnIndex, X_INFO, "EDID data from the display on 2nd port -----------------------\n"); - xf86PrintEDID( pRADEONEnt->PortInfo[1].MonInfo ); + xf86PrintEDID( pRADEONEnt->PortInfo[1]->MonInfo ); } } @@ -1273,8 +1273,8 @@ Bool RADEONMapControllers(ScrnInfoPtr pScrn) if (!info->IsSecondary) { RADEONQueryConnectedDisplays(pScrn); - pRADEONEnt->Controller[0]->pPort = &(pRADEONEnt->PortInfo[0]); - pRADEONEnt->Controller[1]->pPort = &(pRADEONEnt->PortInfo[1]); + pRADEONEnt->Controller[0]->pPort = pRADEONEnt->PortInfo[0]; + pRADEONEnt->Controller[1]->pPort = pRADEONEnt->PortInfo[1]; xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Port1:\n Monitor -- %s\n Connector -- %s\n DAC Type -- %s\n TMDS Type -- %s\n DDC Type -- %s\n", @@ -1300,8 +1300,8 @@ Bool RADEONMapControllers(ScrnInfoPtr pScrn) if (pRADEONEnt->Controller[0]->pPort->MonType == MT_NONE) { if (pRADEONEnt->Controller[1]->pPort->MonType != MT_NONE) { /* Only one detected on secondary, let it to be primary */ - pRADEONEnt->Controller[0]->pPort = &(pRADEONEnt->PortInfo[1]); - pRADEONEnt->Controller[1]->pPort = &(pRADEONEnt->PortInfo[0]); + pRADEONEnt->Controller[0]->pPort = pRADEONEnt->PortInfo[1]; + pRADEONEnt->Controller[1]->pPort = pRADEONEnt->PortInfo[0]; head_reversed = TRUE; } else { /* None detected, Default to a CRT connected */ @@ -1313,8 +1313,8 @@ Bool RADEONMapControllers(ScrnInfoPtr pScrn) (pRADEONEnt->Controller[1]->pPort->MonType == MT_CRT)) { if (!(INREG(RADEON_LVDS_GEN_CNTL) & RADEON_LVDS_ON)) { /* LCD is switched off, don't turn it on, otherwise it may casue lockup due to SS issue. */ - pRADEONEnt->Controller[0]->pPort = &(pRADEONEnt->PortInfo[1]); - pRADEONEnt->Controller[1]->pPort = &(pRADEONEnt->PortInfo[0]); + pRADEONEnt->Controller[0]->pPort = pRADEONEnt->PortInfo[1]; + pRADEONEnt->Controller[1]->pPort = pRADEONEnt->PortInfo[0]; pRADEONEnt->Controller[1]->pPort->MonType = MT_NONE; head_reversed = TRUE; xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "LCD is switched off, only CRT will be used\n"); @@ -1330,8 +1330,8 @@ Bool RADEONMapControllers(ScrnInfoPtr pScrn) */ xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "Reverse Display cannot be used for mobility chip\n"); } else { - pRADEONEnt->Controller[0]->pPort = &(pRADEONEnt->PortInfo[1]); - pRADEONEnt->Controller[1]->pPort = &(pRADEONEnt->PortInfo[0]); + pRADEONEnt->Controller[0]->pPort = pRADEONEnt->PortInfo[1]; + pRADEONEnt->Controller[1]->pPort = pRADEONEnt->PortInfo[0]; head_reversed = TRUE; xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "Primary and Secondary mapping is reversed\n"); } @@ -2326,3 +2326,22 @@ Bool RADEONAllocateControllers(ScrnInfoPtr pScrn) return TRUE; } + +Bool RADEONAllocateConnectors(ScrnInfoPtr pScrn) +{ + RADEONEntPtr pRADEONEnt = RADEONEntPriv(pScrn); + int num_connectors; + int i; + + if (pRADEONEnt->PortInfo[0]) + return TRUE; + + /* for now always allocate max connectors */ + for (i = 0 ; i < RADEON_MAX_CONNECTOR; i++) { + pRADEONEnt->PortInfo[i] = xcalloc(sizeof(RADEONConnector), 1); + if (!pRADEONEnt->PortInfo[i]) + return FALSE; + } + + return TRUE; +} diff --git a/src/radeon_driver.c b/src/radeon_driver.c index 405d96fc..8b1a374b 100644 --- a/src/radeon_driver.c +++ b/src/radeon_driver.c @@ -2821,8 +2821,14 @@ static Bool RADEONPreInitControllers(ScrnInfoPtr pScrn, xf86Int10InfoPtr pInt10 { RADEONInfoPtr info = RADEONPTR(pScrn); - if (!info->IsSecondary) - RADEONAllocateControllers(pScrn); + if (!info->IsSecondary) { + if (!RADEONAllocateConnectors(pScrn)) + return FALSE; + + if (!RADEONAllocateControllers(pScrn)) + return FALSE; + + } RADEONGetBIOSInfo(pScrn, pInt10); diff --git a/src/radeon_probe.h b/src/radeon_probe.h index 34dad61d..355e9354 100644 --- a/src/radeon_probe.h +++ b/src/radeon_probe.h @@ -121,6 +121,7 @@ typedef struct RADEONConnector* pPort; } RADEONController; +#define RADEON_MAX_CONNECTOR 2 #define RADEON_MAX_CRTC 2 typedef struct @@ -139,7 +140,7 @@ typedef struct Bool ReversedDAC; /* TVDAC used as primary dac */ Bool ReversedTMDS; /* DDC_DVI is used for external TMDS */ - RADEONConnector PortInfo[2]; + RADEONConnector *PortInfo[RADEON_MAX_CONNECTOR]; RADEONController *Controller[RADEON_MAX_CRTC]; /* pointer to a controller */ } RADEONEntRec, *RADEONEntPtr; |