⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 radeon_driver.c

📁 x.org上有关ati系列显卡最新驱动
💻 C
📖 第 1 页 / 共 5 页
字号:
	!(crtc_gen_cntl & RADEON_CRTC_EN))	return;    /* Clear the CRTC_VBLANK_SAVE bit */    OUTREG(RADEON_CRTC_STATUS, RADEON_CRTC_VBLANK_SAVE_CLEAR);    /* Wait for it to go back up */    for (i = 0; i < RADEON_TIMEOUT/1000; i++) {	if (INREG(RADEON_CRTC_STATUS) & RADEON_CRTC_VBLANK_SAVE) break;	usleep(1);    }}/* Wait for vertical sync on secondary CRTC */void RADEONWaitForVerticalSync2(ScrnInfoPtr pScrn){    RADEONInfoPtr  info       = RADEONPTR(pScrn);    unsigned char *RADEONMMIO = info->MMIO;    CARD32         crtc2_gen_cntl;    int            i;     crtc2_gen_cntl = INREG(RADEON_CRTC2_GEN_CNTL);    if ((crtc2_gen_cntl & RADEON_CRTC2_DISP_REQ_EN_B) ||	!(crtc2_gen_cntl & RADEON_CRTC2_EN))	return;    /* Clear the CRTC2_VBLANK_SAVE bit */    OUTREG(RADEON_CRTC2_STATUS, RADEON_CRTC2_VBLANK_SAVE_CLEAR);    /* Wait for it to go back up */    for (i = 0; i < RADEON_TIMEOUT/1000; i++) {	if (INREG(RADEON_CRTC2_STATUS) & RADEON_CRTC2_VBLANK_SAVE) break;	usleep(1);    }}/* Blank screen */static void RADEONBlank(ScrnInfoPtr pScrn){    RADEONInfoPtr  info       = RADEONPTR(pScrn);    unsigned char *RADEONMMIO = info->MMIO;    if (!info->IsSecondary) {	switch(info->DisplayType) {	case MT_LCD:	case MT_CRT:	case MT_DFP:	    OUTREGP(RADEON_CRTC_EXT_CNTL,		    RADEON_CRTC_DISPLAY_DIS,		    ~(RADEON_CRTC_DISPLAY_DIS));	    break;	case MT_NONE:	default:	    break;	}	if (info->MergedFB)	    OUTREGP(RADEON_CRTC2_GEN_CNTL,		    RADEON_CRTC2_DISP_DIS,		    ~(RADEON_CRTC2_DISP_DIS));    } else {	OUTREGP(RADEON_CRTC2_GEN_CNTL,		RADEON_CRTC2_DISP_DIS,		~(RADEON_CRTC2_DISP_DIS));    }}/* Unblank screen */static void RADEONUnblank(ScrnInfoPtr pScrn){    RADEONInfoPtr  info       = RADEONPTR(pScrn);    unsigned char *RADEONMMIO = info->MMIO;    if (!info->IsSecondary) {	switch (info->DisplayType) {	case MT_LCD:	case MT_CRT:	case MT_DFP:	    OUTREGP(RADEON_CRTC_EXT_CNTL,		    RADEON_CRTC_CRT_ON,		    ~(RADEON_CRTC_DISPLAY_DIS));	    break;	case MT_NONE:	default:	    break;	}	if (info->MergedFB)	    OUTREGP(RADEON_CRTC2_GEN_CNTL,		    0,		    ~(RADEON_CRTC2_DISP_DIS));    } else {	switch (info->DisplayType) {	case MT_LCD:	case MT_DFP:	case MT_CRT:	    OUTREGP(RADEON_CRTC2_GEN_CNTL,		    0,		    ~(RADEON_CRTC2_DISP_DIS));	    break;	case MT_NONE:	default:	    break;	}    }}/* Compute log base 2 of val */int RADEONMinBits(int val){    int  bits;    if (!val) return 1;    for (bits = 0; val; val >>= 1, ++bits);    return bits;}/* Compute n/d with rounding */static int RADEONDiv(int n, int d){    return (n + (d / 2)) / d;}static RADEONMonitorType RADEONDisplayDDCConnected(ScrnInfoPtr pScrn, RADEONDDCType DDCType, RADEONConnector* port){    RADEONInfoPtr info = RADEONPTR(pScrn);    unsigned char *RADEONMMIO = info->MMIO;    unsigned long DDCReg;    RADEONMonitorType MonType = MT_NONE;    xf86MonPtr* MonInfo = &port->MonInfo;    int i, j;    DDCReg = info->DDCReg;    switch(DDCType)    {    case DDC_MONID:	info->DDCReg = RADEON_GPIO_MONID;	break;    case DDC_DVI:	info->DDCReg = RADEON_GPIO_DVI_DDC;	break;    case DDC_VGA:	info->DDCReg = RADEON_GPIO_VGA_DDC;	break;    case DDC_CRT2:	info->DDCReg = RADEON_GPIO_CRT2_DDC;	break;    default:	info->DDCReg = DDCReg;	return MT_NONE;    }    /* Read and output monitor info using DDC2 over I2C bus */    if (info->pI2CBus && info->ddc2) {	OUTREG(info->DDCReg, INREG(info->DDCReg) &	       (CARD32)~(RADEON_GPIO_A_0 | RADEON_GPIO_A_1));	/* For some old monitors (like Compaq Presario FP500), we need	 * following process to initialize/stop DDC	 */	OUTREG(info->DDCReg, INREG(info->DDCReg) & ~(RADEON_GPIO_EN_1));	for (j = 0; j < 3; j++) {	    OUTREG(info->DDCReg,		   INREG(info->DDCReg) & ~(RADEON_GPIO_EN_0));	    usleep(13000);	    OUTREG(info->DDCReg,		   INREG(info->DDCReg) & ~(RADEON_GPIO_EN_1));	    for (i = 0; i < 10; i++) {		usleep(15000);		if (INREG(info->DDCReg) & RADEON_GPIO_Y_1)		    break;	    }	    if (i == 10) continue;	    usleep(15000);	    OUTREG(info->DDCReg, INREG(info->DDCReg) | RADEON_GPIO_EN_0);	    usleep(15000);	    OUTREG(info->DDCReg, INREG(info->DDCReg) | RADEON_GPIO_EN_1);	    usleep(15000);	    OUTREG(info->DDCReg,		   INREG(info->DDCReg) & ~(RADEON_GPIO_EN_0));	    usleep(15000);	    *MonInfo = xf86DoEDID_DDC2(pScrn->scrnIndex, info->pI2CBus);	    OUTREG(info->DDCReg, INREG(info->DDCReg) | RADEON_GPIO_EN_1);	    OUTREG(info->DDCReg, INREG(info->DDCReg) | RADEON_GPIO_EN_0);	    usleep(15000);	    OUTREG(info->DDCReg,		   INREG(info->DDCReg) & ~(RADEON_GPIO_EN_1));	    for (i = 0; i < 5; i++) {		usleep(15000);		if (INREG(info->DDCReg) & RADEON_GPIO_Y_1)		    break;	    }	    usleep(15000);	    OUTREG(info->DDCReg,		   INREG(info->DDCReg) & ~(RADEON_GPIO_EN_0));	    usleep(15000);	    OUTREG(info->DDCReg, INREG(info->DDCReg) | RADEON_GPIO_EN_1);	    OUTREG(info->DDCReg, INREG(info->DDCReg) | RADEON_GPIO_EN_0);	    usleep(15000);	    if(*MonInfo) break;	}    } else {	xf86DrvMsg(pScrn->scrnIndex, X_WARNING, "DDC2/I2C is not properly initialized\n");	MonType = MT_NONE;    }    OUTREG(info->DDCReg, INREG(info->DDCReg) &	   ~(RADEON_GPIO_EN_0 | RADEON_GPIO_EN_1));    if (*MonInfo) {	if ((*MonInfo)->rawData[0x14] & 0x80) {	    /* Note some laptops have a DVI output that uses internal TMDS,	     * when its DVI is enabled by hotkey, LVDS panel is not used.	     * In this case, the laptop is configured as DVI+VGA as a normal 	     * desktop card.	     * Also for laptop, when X starts with lid closed (no DVI connection)	     * both LDVS and TMDS are disable, we still need to treat it as a LVDS panel.	     */	    if (port->TMDSType == TMDS_EXT) MonType = MT_DFP;	    else {		if ((INREG(RADEON_FP_GEN_CNTL) & (1<<7)) || !info->IsMobility)		    MonType = MT_DFP;		else 		    MonType = MT_LCD;	    }	} else MonType = MT_CRT;    } else MonType = MT_NONE;    info->DDCReg = DDCReg;    xf86DrvMsg(pScrn->scrnIndex, X_INFO,	       "DDC Type: %d, Detected Type: %d\n", DDCType, MonType);    return MonType;}static RADEONMonitorTypeRADEONCrtIsPhysicallyConnected(ScrnInfoPtr pScrn, int IsCrtDac){    RADEONInfoPtr info       = RADEONPTR(pScrn);    unsigned char *RADEONMMIO = info->MMIO;    int		  bConnected = 0;    /* the monitor either wasn't connected or it is a non-DDC CRT.     * try to probe it     */    if(IsCrtDac) {	unsigned long ulOrigVCLK_ECP_CNTL;	unsigned long ulOrigDAC_CNTL;	unsigned long ulOrigDAC_MACRO_CNTL;	unsigned long ulOrigDAC_EXT_CNTL;	unsigned long ulOrigCRTC_EXT_CNTL;	unsigned long ulData;	unsigned long ulMask;	ulOrigVCLK_ECP_CNTL = INPLL(pScrn, RADEON_VCLK_ECP_CNTL);	ulData              = ulOrigVCLK_ECP_CNTL;	ulData             &= ~(RADEON_PIXCLK_ALWAYS_ONb				| RADEON_PIXCLK_DAC_ALWAYS_ONb);	ulMask              = ~(RADEON_PIXCLK_ALWAYS_ONb				|RADEON_PIXCLK_DAC_ALWAYS_ONb);	OUTPLLP(pScrn, RADEON_VCLK_ECP_CNTL, ulData, ulMask);	ulOrigCRTC_EXT_CNTL = INREG(RADEON_CRTC_EXT_CNTL);	ulData              = ulOrigCRTC_EXT_CNTL;	ulData             |= RADEON_CRTC_CRT_ON;	OUTREG(RADEON_CRTC_EXT_CNTL, ulData);	ulOrigDAC_EXT_CNTL = INREG(RADEON_DAC_EXT_CNTL);	ulData             = ulOrigDAC_EXT_CNTL;	ulData            &= ~RADEON_DAC_FORCE_DATA_MASK;	ulData            |=  (RADEON_DAC_FORCE_BLANK_OFF_EN			       |RADEON_DAC_FORCE_DATA_EN			       |RADEON_DAC_FORCE_DATA_SEL_MASK);	if ((info->ChipFamily == CHIP_FAMILY_RV250) ||	    (info->ChipFamily == CHIP_FAMILY_RV280))	    ulData |= (0x01b6 << RADEON_DAC_FORCE_DATA_SHIFT);	else	    ulData |= (0x01ac << RADEON_DAC_FORCE_DATA_SHIFT);	OUTREG(RADEON_DAC_EXT_CNTL, ulData);	ulOrigDAC_CNTL     = INREG(RADEON_DAC_CNTL);	if (ulOrigDAC_CNTL & RADEON_DAC_PDWN) {	    /* turn on power so testing can go through */	    ulOrigDAC_MACRO_CNTL = INREG(RADEON_DAC_MACRO_CNTL);	    ulOrigDAC_MACRO_CNTL &= ~(RADEON_DAC_PDWN_R | RADEON_DAC_PDWN_G |		RADEON_DAC_PDWN_B);	    OUTREG(RADEON_DAC_MACRO_CNTL, ulOrigDAC_MACRO_CNTL);	}	ulData             = ulOrigDAC_CNTL;	ulData            |= RADEON_DAC_CMP_EN;	ulData            &= ~(RADEON_DAC_RANGE_CNTL_MASK			       | RADEON_DAC_PDWN);	ulData            |= 0x2;	OUTREG(RADEON_DAC_CNTL, ulData);	usleep(10000);	ulData     = INREG(RADEON_DAC_CNTL);	bConnected =  (RADEON_DAC_CMP_OUTPUT & ulData)?1:0;	ulData    = ulOrigVCLK_ECP_CNTL;	ulMask    = 0xFFFFFFFFL;	OUTPLLP(pScrn, RADEON_VCLK_ECP_CNTL, ulData, ulMask);	OUTREG(RADEON_DAC_CNTL,      ulOrigDAC_CNTL     );	OUTREG(RADEON_DAC_EXT_CNTL,  ulOrigDAC_EXT_CNTL );	OUTREG(RADEON_CRTC_EXT_CNTL, ulOrigCRTC_EXT_CNTL);	if (!bConnected) {	    /* Power DAC down if CRT is not connected */            ulOrigDAC_MACRO_CNTL = INREG(RADEON_DAC_MACRO_CNTL);            ulOrigDAC_MACRO_CNTL |= (RADEON_DAC_PDWN_R | RADEON_DAC_PDWN_G |	    	RADEON_DAC_PDWN_B);            OUTREG(RADEON_DAC_MACRO_CNTL, ulOrigDAC_MACRO_CNTL);	    ulData     = INREG(RADEON_DAC_CNTL);	    ulData     |= RADEON_DAC_PDWN ;	    OUTREG(RADEON_DAC_CNTL, ulData);    	}    } else { /* TV DAC */        /* This doesn't seem to work reliably (maybe worse on some OEM cards),           for now we always return false. If one wants to connected a           non-DDC monitor on the DVI port when CRT port is also connected,           he will need to explicitly tell the driver in the config file           with Option MonitorLayout.        */        bConnected = FALSE;#if 0	if (info->ChipFamily == CHIP_FAMILY_R200) {	    unsigned long ulOrigGPIO_MONID;	    unsigned long ulOrigFP2_GEN_CNTL;	    unsigned long ulOrigDISP_OUTPUT_CNTL;	    unsigned long ulOrigCRTC2_GEN_CNTL;	    unsigned long ulOrigDISP_LIN_TRANS_GRPH_A;	    unsigned long ulOrigDISP_LIN_TRANS_GRPH_B;	    unsigned long ulOrigDISP_LIN_TRANS_GRPH_C;	    unsigned long ulOrigDISP_LIN_TRANS_GRPH_D;	    unsigned long ulOrigDISP_LIN_TRANS_GRPH_E;	    unsigned long ulOrigDISP_LIN_TRANS_GRPH_F;	    unsigned long ulOrigCRTC2_H_TOTAL_DISP;	    unsigned long ulOrigCRTC2_V_TOTAL_DISP;	    unsigned long ulOrigCRTC2_H_SYNC_STRT_WID;	    unsigned long ulOrigCRTC2_V_SYNC_STRT_WID;	    unsigned long ulData, i;	    ulOrigGPIO_MONID = INREG(RADEON_GPIO_MONID);	    ulOrigFP2_GEN_CNTL = INREG(RADEON_FP2_GEN_CNTL);	    ulOrigDISP_OUTPUT_CNTL = INREG(RADEON_DISP_OUTPUT_CNTL);	    ulOrigCRTC2_GEN_CNTL = INREG(RADEON_CRTC2_GEN_CNTL);	    ulOrigDISP_LIN_TRANS_GRPH_A = INREG(RADEON_DISP_LIN_TRANS_GRPH_A);	    ulOrigDISP_LIN_TRANS_GRPH_B = INREG(RADEON_DISP_LIN_TRANS_GRPH_B);	    ulOrigDISP_LIN_TRANS_GRPH_C = INREG(RADEON_DISP_LIN_TRANS_GRPH_C);	    ulOrigDISP_LIN_TRANS_GRPH_D = INREG(RADEON_DISP_LIN_TRANS_GRPH_D);	    ulOrigDISP_LIN_TRANS_GRPH_E = INREG(RADEON_DISP_LIN_TRANS_GRPH_E);	    ulOrigDISP_LIN_TRANS_GRPH_F = INREG(RADEON_DISP_LIN_TRANS_GRPH_F);	    ulOrigCRTC2_H_TOTAL_DISP = INREG(RADEON_CRTC2_H_TOTAL_DISP);	    ulOrigCRTC2_V_TOTAL_DISP = INREG(RADEON_CRTC2_V_TOTAL_DISP);	    ulOrigCRTC2_H_SYNC_STRT_WID = INREG(RADEON_CRTC2_H_SYNC_STRT_WID);	    ulOrigCRTC2_V_SYNC_STRT_WID = INREG(RADEON_CRTC2_V_SYNC_STRT_WID);	    ulData     = INREG(RADEON_GPIO_MONID);	    ulData    &= ~RADEON_GPIO_A_0;	    OUTREG(RADEON_GPIO_MONID, ulData);	    OUTREG(RADEON_FP2_GEN_CNTL, 0x0a000c0c);	    OUTREG(RADEON_DISP_OUTPUT_CNTL, 0x00000012);	    OUTREG(RADEON_CRTC2_GEN_CNTL, 0x06000000);	    OUTREG(RADEON_DISP_LIN_TRANS_GRPH_A, 0x00000000);	    OUTREG(RADEON_DISP_LIN_TRANS_GRPH_B, 0x000003f0);	    OUTREG(RADEON_DISP_LIN_TRANS_GRPH_C, 0x00000000);	    OUTREG(RADEON_DISP_LIN_TRANS_GRPH_D, 0x000003f0);	    OUTREG(RADEON_DISP_LIN_TRANS_GRPH_E, 0x00000000);	    OUTREG(RADEON_DISP_LIN_TRANS_GRPH_F, 0x000003f0);	    OUTREG(RADEON_CRTC2_H_TOTAL_DISP, 0x01000008);	    OUTREG(RADEON_CRTC2_H_SYNC_STRT_WID, 0x00000800);	    OUTREG(RADEON_CRTC2_V_TOTAL_DISP, 0x00080001);	    OUTREG(RADEON_CRTC2_V_SYNC_STRT_WID, 0x00000080);	    for (i = 0; i < 200; i++) {		ulData     = INREG(RADEON_GPIO_MONID);		bConnected = (ulData & RADEON_GPIO_Y_0)?1:0;		if (!bConnected) break;		usleep(1000);	    }	    OUTREG(RADEON_DISP_LIN_TRANS_GRPH_A, ulOrigDISP_LIN_TRANS_GRPH_A);	    OUTREG(RADEON_DISP_LIN_TRANS_GRPH_B, ulOrigDISP_LIN_TRANS_GRPH_B);	    OUTREG(RADEON_DISP_LIN_TRANS_GRPH_C, ulOrigDISP_LIN_TRANS_GRPH_C);	    OUTREG(RADEON_DISP_LIN_TRANS_GRPH_D, ulOrigDISP_LIN_TRANS_GRPH_D);	    OUTREG(RADEON_DISP_LIN_TRANS_GRPH_E, ulOrigDISP_LIN_TRANS_GRPH_E);	    OUTREG(RADEON_DISP_LIN_TRANS_GRPH_F, ulOrigDISP_LIN_TRANS_GRPH_F);	    OUTREG(RADEON_CRTC2_H_TOTAL_DISP, ulOrigCRTC2_H_TOTAL_DISP);	    OUTREG(RADEON_CRTC2_V_TOTAL_DISP, ulOrigCRTC2_V_TOTAL_DISP);	    OUTREG(RADEON_CRTC2_H_SYNC_STRT_WID, ulOrigCRTC2_H_SYNC_STRT_WID);	    OUTREG(RADEON_CRTC2_V_SYNC_STRT_WID, ulOrigCRTC2_V_SYNC_STRT_WID);	    OUTREG(RADEON_CRTC2_GEN_CNTL, ulOrigCRTC2_GEN_CNTL);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -