XORG_NV/sun-src/xf86-video-ati-6.5.8.0/src/radeon_driver.c
changeset 33 36c599198505
parent 28 d7de7f091eb4
child 45 56271cedb955
equal deleted inserted replaced
32:235a80428f96 33:36c599198505
   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 
  1005     unsigned char *RADEONMMIO = info->MMIO;
  1007     unsigned char *RADEONMMIO = info->MMIO;
  1006     unsigned long DDCReg;
  1008     unsigned long DDCReg;
  1007     RADEONMonitorType MonType = MT_NONE;
  1009     RADEONMonitorType MonType = MT_NONE;
  1008     xf86MonPtr* MonInfo = &port->MonInfo;
  1010     xf86MonPtr* MonInfo = &port->MonInfo;
  1009     int i, j;
  1011     int i, j;
       
  1012     RADEONEntPtr pRADEONEnt  = RADEONEntPriv(pScrn);
       
  1013     int vbeProbe = FALSE;;
  1010 
  1014 
  1011     DDCReg = info->DDCReg;
  1015     DDCReg = info->DDCReg;
  1012     switch(DDCType)
  1016     switch(DDCType)
  1013     {
  1017     {
  1014     case DDC_MONID:
  1018     case DDC_MONID:
  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;
  4972 	    pRADEONEnt->IsSecondaryRestored = FALSE;
  5033 	    pRADEONEnt->IsSecondaryRestored = FALSE;
  4973 	}
  5034 	}
  4974     }
  5035     }
  4975 
  5036 
  4976     if (flags & PROBE_DETECT) {
  5037     if (flags & PROBE_DETECT) {
  4977 	RADEONProbeDDC(pScrn, info->pEnt->index);
  5038 	ConfiguredMonitor = RADEONProbeDDC(pScrn, info->pEnt->index);
  4978 	RADEONPostInt10Check(pScrn, int10_save);
  5039 	RADEONPostInt10Check(pScrn, int10_save);
  4979 	if(info->MMIO) RADEONUnmapMMIO(pScrn);
  5040 	if(info->MMIO) RADEONUnmapMMIO(pScrn);
  4980 	return TRUE;
  5041 	return TRUE;
  4981     }
  5042     }
  4982 
  5043