130 static int RADEONValidateMergeModes(ScrnInfoPtr pScrn); |
130 static int RADEONValidateMergeModes(ScrnInfoPtr pScrn); |
131 static void RADEONSetDynamicClock(ScrnInfoPtr pScrn, int mode); |
131 static void RADEONSetDynamicClock(ScrnInfoPtr pScrn, int mode); |
132 static void RADEONUpdatePanelSize(ScrnInfoPtr pScrn); |
132 static void RADEONUpdatePanelSize(ScrnInfoPtr pScrn); |
133 static void RADEONSaveMemMapRegisters(ScrnInfoPtr pScrn, RADEONSavePtr save); |
133 static void RADEONSaveMemMapRegisters(ScrnInfoPtr pScrn, RADEONSavePtr save); |
134 static void RADEONAdjustMemMapRegisters(ScrnInfoPtr pScrn, RADEONSavePtr save); |
134 static void RADEONAdjustMemMapRegisters(ScrnInfoPtr pScrn, RADEONSavePtr save); |
|
135 static xf86MonPtr RADEONProbeDDC(ScrnInfoPtr pScrn, int indx); |
|
136 static RADEONMonitorType RADEONCrtIsPhysicallyConnected(ScrnInfoPtr pScrn, int IsCrtDac); |
135 |
137 |
136 /* psuedo xinerama support */ |
138 /* psuedo xinerama support */ |
137 |
139 |
138 extern Bool RADEONnoPanoramiXExtension; |
140 extern Bool RADEONnoPanoramiXExtension; |
139 |
141 |
1023 case DDC_CRT2: |
1027 case DDC_CRT2: |
1024 info->DDCReg = RADEON_GPIO_CRT2_DDC; |
1028 info->DDCReg = RADEON_GPIO_CRT2_DDC; |
1025 break; |
1029 break; |
1026 default: |
1030 default: |
1027 info->DDCReg = DDCReg; |
1031 info->DDCReg = DDCReg; |
|
1032 /* Fall through, can still try ... |
1028 return MT_NONE; |
1033 return MT_NONE; |
|
1034 */ |
1029 } |
1035 } |
1030 |
1036 |
1031 /* Read and output monitor info using DDC2 over I2C bus */ |
1037 /* Read and output monitor info using DDC2 over I2C bus */ |
1032 if (info->pI2CBus && info->ddc2) { |
1038 if (info->pI2CBus && info->ddc2) { |
1033 OUTREG(info->DDCReg, INREG(info->DDCReg) & |
1039 OUTREG(info->DDCReg, INREG(info->DDCReg) & |
1089 } |
1095 } |
1090 |
1096 |
1091 OUTREG(info->DDCReg, INREG(info->DDCReg) & |
1097 OUTREG(info->DDCReg, INREG(info->DDCReg) & |
1092 ~(RADEON_GPIO_EN_0 | RADEON_GPIO_EN_1)); |
1098 ~(RADEON_GPIO_EN_0 | RADEON_GPIO_EN_1)); |
1093 |
1099 |
|
1100 if ((!*MonInfo) && ((port == &pRADEONEnt->PortInfo[0]) || |
|
1101 (RADEONCrtIsPhysicallyConnected(pScrn, !(pRADEONEnt->PortInfo[1].DACType)) |
|
1102 == MT_CRT))) { |
|
1103 vbeProbe = TRUE; |
|
1104 xf86DrvMsg(pScrn->scrnIndex, X_INFO, "VBE DDC probing on port %d ::: \n", |
|
1105 (port == &pRADEONEnt->PortInfo[0])? 1:2); |
|
1106 *MonInfo = RADEONProbeDDC(pScrn, info->pEnt->index); |
|
1107 } |
|
1108 |
1094 if (*MonInfo) { |
1109 if (*MonInfo) { |
1095 if ((*MonInfo)->rawData[0x14] & 0x80) { |
1110 if ((*MonInfo)->rawData[0x14] & 0x80) { |
1096 /* Note some laptops have a DVI output that uses internal TMDS, |
1111 /* Note some laptops have a DVI output that uses internal TMDS, |
1097 * when its DVI is enabled by hotkey, LVDS panel is not used. |
1112 * when its DVI is enabled by hotkey, LVDS panel is not used. |
1098 * In this case, the laptop is configured as DVI+VGA as a normal |
1113 * In this case, the laptop is configured as DVI+VGA as a normal |
1099 * desktop card. |
1114 * desktop card. |
1100 * Also for laptop, when X starts with lid closed (no DVI connection) |
1115 * Also for laptop, when X starts with lid closed (no DVI connection) |
1101 * both LDVS and TMDS are disable, we still need to treat it as a LVDS panel. |
1116 * both LDVS and TMDS are disable, we still need to treat it as a LVDS panel. |
1102 */ |
1117 */ |
1103 if (port->TMDSType == TMDS_EXT) MonType = MT_DFP; |
1118 if (vbeProbe && |
1104 else { |
1119 (RADEONCrtIsPhysicallyConnected(pScrn, !(port->DACType)) == MT_CRT)) { |
1105 if ((INREG(RADEON_FP_GEN_CNTL) & (1<<7)) || !info->IsMobility) |
1120 MonType = MT_NONE; |
1106 MonType = MT_DFP; |
1121 *MonInfo = NULL; |
1107 else |
1122 xf86DrvMsg(pScrn->scrnIndex, X_INFO, "VBE probed DDC info nullified on port %d :::\n", (port == &pRADEONEnt->PortInfo[0])? 1:2); |
1108 MonType = MT_LCD; |
1123 xf86DrvMsg(pScrn->scrnIndex, X_INFO, "CRT physically connected but digital device indicated in DDC\n"); |
|
1124 } else { |
|
1125 if (port->TMDSType == TMDS_EXT) MonType = MT_DFP; |
|
1126 else { |
|
1127 if ((INREG(RADEON_FP_GEN_CNTL) & (1<<7)) || !info->IsMobility) |
|
1128 MonType = MT_DFP; |
|
1129 else |
|
1130 MonType = MT_LCD; |
|
1131 } |
1109 } |
1132 } |
1110 } else MonType = MT_CRT; |
1133 } else { |
|
1134 if ((RADEONCrtIsPhysicallyConnected(pScrn, |
|
1135 !(pRADEONEnt->PortInfo[1].DACType)) == MT_CRT) && |
|
1136 (port == &pRADEONEnt->PortInfo[0])) { |
|
1137 MonType = MT_NONE; |
|
1138 *MonInfo = NULL; |
|
1139 xf86DrvMsg(pScrn->scrnIndex, X_INFO, "DDC info nullified on port 1 :::\n"); |
|
1140 xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Analog device indicated in DDC and port 1 CRT physically connected\n"); |
|
1141 } else |
|
1142 MonType = MT_CRT; |
|
1143 } |
1111 } else MonType = MT_NONE; |
1144 } else MonType = MT_NONE; |
1112 |
1145 |
1113 info->DDCReg = DDCReg; |
1146 info->DDCReg = DDCReg; |
1114 |
1147 |
1115 xf86DrvMsg(pScrn->scrnIndex, X_INFO, |
1148 xf86DrvMsg(pScrn->scrnIndex, X_INFO, |
1129 * try to probe it |
1162 * try to probe it |
1130 */ |
1163 */ |
1131 if(IsCrtDac) { |
1164 if(IsCrtDac) { |
1132 unsigned long ulOrigVCLK_ECP_CNTL; |
1165 unsigned long ulOrigVCLK_ECP_CNTL; |
1133 unsigned long ulOrigDAC_CNTL; |
1166 unsigned long ulOrigDAC_CNTL; |
|
1167 unsigned long ulOrigDAC_MACRO_CNTL; |
1134 unsigned long ulOrigDAC_EXT_CNTL; |
1168 unsigned long ulOrigDAC_EXT_CNTL; |
1135 unsigned long ulOrigCRTC_EXT_CNTL; |
1169 unsigned long ulOrigCRTC_EXT_CNTL; |
1136 unsigned long ulData; |
1170 unsigned long ulData; |
1137 unsigned long ulMask; |
1171 unsigned long ulMask; |
1138 |
1172 |
1163 ulData |= (0x01ac << RADEON_DAC_FORCE_DATA_SHIFT); |
1197 ulData |= (0x01ac << RADEON_DAC_FORCE_DATA_SHIFT); |
1164 |
1198 |
1165 OUTREG(RADEON_DAC_EXT_CNTL, ulData); |
1199 OUTREG(RADEON_DAC_EXT_CNTL, ulData); |
1166 |
1200 |
1167 ulOrigDAC_CNTL = INREG(RADEON_DAC_CNTL); |
1201 ulOrigDAC_CNTL = INREG(RADEON_DAC_CNTL); |
|
1202 |
|
1203 if (ulOrigDAC_CNTL & RADEON_DAC_PDWN) { |
|
1204 /* turn on power so testing can go through */ |
|
1205 ulOrigDAC_MACRO_CNTL = INREG(RADEON_DAC_MACRO_CNTL); |
|
1206 ulOrigDAC_MACRO_CNTL &= ~(RADEON_DAC_PDWN_R | RADEON_DAC_PDWN_G | |
|
1207 RADEON_DAC_PDWN_B); |
|
1208 OUTREG(RADEON_DAC_MACRO_CNTL, ulOrigDAC_MACRO_CNTL); |
|
1209 } |
|
1210 |
1168 ulData = ulOrigDAC_CNTL; |
1211 ulData = ulOrigDAC_CNTL; |
1169 ulData |= RADEON_DAC_CMP_EN; |
1212 ulData |= RADEON_DAC_CMP_EN; |
1170 ulData &= ~(RADEON_DAC_RANGE_CNTL_MASK |
1213 ulData &= ~(RADEON_DAC_RANGE_CNTL_MASK |
1171 | RADEON_DAC_PDWN); |
1214 | RADEON_DAC_PDWN); |
1172 ulData |= 0x2; |
1215 ulData |= 0x2; |
|
1216 |
1173 OUTREG(RADEON_DAC_CNTL, ulData); |
1217 OUTREG(RADEON_DAC_CNTL, ulData); |
1174 |
1218 |
1175 usleep(10000); |
1219 usleep(10000); |
1176 |
1220 |
1177 ulData = INREG(RADEON_DAC_CNTL); |
1221 ulData = INREG(RADEON_DAC_CNTL); |
1182 OUTPLLP(pScrn, RADEON_VCLK_ECP_CNTL, ulData, ulMask); |
1226 OUTPLLP(pScrn, RADEON_VCLK_ECP_CNTL, ulData, ulMask); |
1183 |
1227 |
1184 OUTREG(RADEON_DAC_CNTL, ulOrigDAC_CNTL ); |
1228 OUTREG(RADEON_DAC_CNTL, ulOrigDAC_CNTL ); |
1185 OUTREG(RADEON_DAC_EXT_CNTL, ulOrigDAC_EXT_CNTL ); |
1229 OUTREG(RADEON_DAC_EXT_CNTL, ulOrigDAC_EXT_CNTL ); |
1186 OUTREG(RADEON_CRTC_EXT_CNTL, ulOrigCRTC_EXT_CNTL); |
1230 OUTREG(RADEON_CRTC_EXT_CNTL, ulOrigCRTC_EXT_CNTL); |
|
1231 |
|
1232 if (!bConnected) { |
|
1233 /* Power DAC down if CRT is not connected */ |
|
1234 ulOrigDAC_MACRO_CNTL = INREG(RADEON_DAC_MACRO_CNTL); |
|
1235 ulOrigDAC_MACRO_CNTL |= (RADEON_DAC_PDWN_R | RADEON_DAC_PDWN_G | |
|
1236 RADEON_DAC_PDWN_B); |
|
1237 OUTREG(RADEON_DAC_MACRO_CNTL, ulOrigDAC_MACRO_CNTL); |
|
1238 |
|
1239 ulData = INREG(RADEON_DAC_CNTL); |
|
1240 ulData |= RADEON_DAC_PDWN ; |
|
1241 OUTREG(RADEON_DAC_CNTL, ulData); |
|
1242 } |
1187 } else { /* TV DAC */ |
1243 } else { /* TV DAC */ |
1188 |
1244 |
1189 /* This doesn't seem to work reliably (maybe worse on some OEM cards), |
1245 /* This doesn't seem to work reliably (maybe worse on some OEM cards), |
1190 for now we always return false. If one wants to connected a |
1246 for now we always return false. If one wants to connected a |
1191 non-DDC monitor on the DVI port when CRT port is also connected, |
1247 non-DDC monitor on the DVI port when CRT port is also connected, |
1880 pRADEONEnt->PortInfo[i].DACType = DAC_UNKNOWN; |
1936 pRADEONEnt->PortInfo[i].DACType = DAC_UNKNOWN; |
1881 pRADEONEnt->PortInfo[i].TMDSType = TMDS_UNKNOWN; |
1937 pRADEONEnt->PortInfo[i].TMDSType = TMDS_UNKNOWN; |
1882 pRADEONEnt->PortInfo[i].ConnectorType = CONNECTOR_NONE; |
1938 pRADEONEnt->PortInfo[i].ConnectorType = CONNECTOR_NONE; |
1883 } |
1939 } |
1884 |
1940 |
1885 if (!RADEONGetConnectorInfoFromBIOS(pScrn)) { |
1941 if (!RADEONGetConnectorInfoFromBIOS(pScrn) || |
|
1942 ((pRADEONEnt->PortInfo[0].DDCType == 0) && |
|
1943 (pRADEONEnt->PortInfo[1].DDCType == 0))) { |
1886 /* Below is the most common setting, but may not be true */ |
1944 /* Below is the most common setting, but may not be true */ |
1887 pRADEONEnt->PortInfo[0].MonType = MT_UNKNOWN; |
1945 pRADEONEnt->PortInfo[0].MonType = MT_UNKNOWN; |
1888 pRADEONEnt->PortInfo[0].MonInfo = NULL; |
1946 pRADEONEnt->PortInfo[0].MonInfo = NULL; |
1889 pRADEONEnt->PortInfo[0].DDCType = DDC_DVI; |
1947 pRADEONEnt->PortInfo[0].DDCType = DDC_DVI; |
1890 pRADEONEnt->PortInfo[0].DACType = DAC_TVDAC; |
1948 pRADEONEnt->PortInfo[0].DACType = DAC_TVDAC; |
4872 info->video_decoder_type+=(((int)info->VBIOS[pll_info_block+0x09]+0)<<8); |
4930 info->video_decoder_type+=(((int)info->VBIOS[pll_info_block+0x09]+0)<<8); |
4873 |
4931 |
4874 return TRUE; |
4932 return TRUE; |
4875 } |
4933 } |
4876 |
4934 |
4877 static void |
4935 static xf86MonPtr |
4878 RADEONProbeDDC(ScrnInfoPtr pScrn, int indx) |
4936 RADEONProbeDDC(ScrnInfoPtr pScrn, int indx) |
4879 { |
4937 { |
4880 vbeInfoPtr pVbe; |
4938 vbeInfoPtr pVbe; |
|
4939 xf86MonPtr monitor; |
4881 |
4940 |
4882 if (xf86LoadSubModule(pScrn, "vbe")) { |
4941 if (xf86LoadSubModule(pScrn, "vbe")) { |
4883 pVbe = VBEInit(NULL,indx); |
4942 pVbe = VBEInit(NULL,indx); |
4884 ConfiguredMonitor = vbeDoEDID(pVbe, NULL); |
4943 monitor = vbeDoEDID(pVbe, NULL); |
4885 } |
4944 return (monitor); |
|
4945 } else |
|
4946 return (NULL); |
4886 } |
4947 } |
4887 |
4948 |
4888 _X_EXPORT Bool RADEONPreInit(ScrnInfoPtr pScrn, int flags) |
4949 _X_EXPORT Bool RADEONPreInit(ScrnInfoPtr pScrn, int flags) |
4889 { |
4950 { |
4890 RADEONInfoPtr info; |
4951 RADEONInfoPtr info; |