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

📄 radeon_bios.c

📁 x.org上有关ati系列显卡最新驱动
💻 C
📖 第 1 页 / 共 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;	    connector_found = 1;	}	if (connector_found == 0) {	    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);	}	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);	}#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;            xf86DrvMsg(pScrn->scrnIndex, X_INFO, "External TMDS found.\n");        } else {            xf86DrvMsg(pScrn->scrnIndex, X_INFO, "NO External TMDS Info found\n");        }#endif    }    return TRUE;}/* Read PLL parameters from BIOS block.  Default to typical values if there   is no BIOS. */Bool RADEONGetClockInfoFromBIOS (ScrnInfoPtr pScrn){    RADEONInfoPtr info = RADEONPTR (pScrn);    RADEONPLLPtr pll = &info->pll;    CARD16 pll_info_block;    if (!info->VBIOS) {	return FALSE;    } else {	if (info->IsAtomBios) {	    pll_info_block = RADEON_BIOS16 (info->MasterDataStart + 12);	    pll->reference_freq = RADEON_BIOS16 (pll_info_block + 82);	    pll->reference_div = 0; /* Need to derive from existing setting					or use a new algorithm to calculate					from min_input and max_input				     */	    pll->min_pll_freq = RADEON_BIOS16 (pll_info_block + 78);	    pll->max_pll_freq = RADEON_BIOS32 (pll_info_block + 32);	    pll->xclk = RADEON_BIOS16 (pll_info_block + 72);	    info->sclk = RADEON_BIOS32(pll_info_block + 8) / 100.0;	    info->mclk = RADEON_BIOS32(pll_info_block + 12) / 100.0;	    if (info->sclk == 0) info->sclk = 200;	    if (info->mclk == 0) info->mclk = 200;			    xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ref_freq: %d, min_pll: %ld, max_pll: %ld, xclk: %d, sclk: %f, mclk: %f\n",		       pll->reference_freq, pll->min_pll_freq, pll->max_pll_freq, pll->xclk, info->sclk, info->mclk);	} else {	    pll_info_block = RADEON_BIOS16 (info->ROMHeaderStart + 0x30);	    pll->reference_freq = RADEON_BIOS16 (pll_info_block + 0x0e);	    pll->reference_div = RADEON_BIOS16 (pll_info_block + 0x10);	    pll->min_pll_freq = RADEON_BIOS32 (pll_info_block + 0x12);	    pll->max_pll_freq = RADEON_BIOS32 (pll_info_block + 0x16);	    pll->xclk = RADEON_BIOS16 (pll_info_block + 0x08);	    info->sclk = RADEON_BIOS16(pll_info_block + 8) / 100.0;	    info->mclk = RADEON_BIOS16(pll_info_block + 10) / 100.0;	}    }    return TRUE;}Bool RADEONGetLVDSInfoFromBIOS (ScrnInfoPtr pScrn){    RADEONInfoPtr info     = RADEONPTR(pScrn);    unsigned long tmp, i;    if (!info->VBIOS) return FALSE;    if (info->IsAtomBios) {	if((tmp = RADEON_BIOS16 (info->MasterDataStart + 16))) {	    info->PanelXRes = RADEON_BIOS16(tmp+6);	    info->PanelYRes = RADEON_BIOS16(tmp+10);	    info->DotClock   = RADEON_BIOS16(tmp+4)*10;	    info->HBlank     = RADEON_BIOS16(tmp+8);	    info->HOverPlus  = RADEON_BIOS16(tmp+14);	    info->HSyncWidth = RADEON_BIOS16(tmp+16);	    info->VBlank     = RADEON_BIOS16(tmp+12);	    info->VOverPlus  = RADEON_BIOS16(tmp+18);	    info->VSyncWidth = RADEON_BIOS16(tmp+20);	    info->PanelPwrDly = RADEON_BIOS16(tmp+40);	    info->Flags = 0;	    xf86DrvMsg(pScrn->scrnIndex, X_WARNING, 		       "LVDS Info:\n"		       "XRes: %d, YRes: %d, DotClock: %d\n"		       "HBlank: %d, HOverPlus: %d, HSyncWidth: %d\n"		       "VBlank: %d, VOverPlus: %d, VSyncWidth: %d\n",		       info->PanelXRes, info->PanelYRes, info->DotClock,		       info->HBlank,info->HOverPlus, info->HSyncWidth,		       info->VBlank, info->VOverPlus, info->VSyncWidth);	} else {	    xf86DrvMsg(pScrn->scrnIndex, X_WARNING,		       "No LVDS Info Table found in BIOS!\n");	    return FALSE;	}    } else {	tmp = RADEON_BIOS16(info->ROMHeaderStart + 0x40);	if (!tmp) {	    xf86DrvMsg(pScrn->scrnIndex, X_WARNING,		       "No Panel Info Table found in BIOS!\n");	    return FALSE;	} else {	    char  stmp[30];	    int   tmp0;	    for (i = 0; i < 24; i++)	    stmp[i] = RADEON_BIOS8(tmp+i+1);	    stmp[24] = 0;	    xf86DrvMsg(pScrn->scrnIndex, X_INFO,		       "Panel ID string: %s\n", stmp);	    info->PanelXRes = RADEON_BIOS16(tmp+25);	    info->PanelYRes = RADEON_BIOS16(tmp+27);	    xf86DrvMsg(0, X_INFO, "Panel Size from BIOS: %dx%d\n",		       info->PanelXRes, info->PanelYRes);		    info->PanelPwrDly = RADEON_BIOS16(tmp+44);	    if (info->PanelPwrDly > 2000 || info->PanelPwrDly < 0)		info->PanelPwrDly = 2000;	    /* some panels only work well with certain divider combinations.	     */	    info->RefDivider = RADEON_BIOS16(tmp+46);	    info->PostDivider = RADEON_BIOS8(tmp+48);	    info->FeedbackDivider = RADEON_BIOS16(tmp+49);	    if ((info->RefDivider != 0) &&		(info->FeedbackDivider > 3)) {		info->UseBiosDividers = TRUE;		xf86DrvMsg(pScrn->scrnIndex, X_INFO,			   "BIOS provided dividers will be used.\n");	    }	    /* We don't use a while loop here just in case we have a corrupted BIOS image.	       The max number of table entries is 23 at present, but may grow in future.	       To ensure it works with future revisions we loop it to 32.	    */	    for (i = 0; i < 32; i++) {		tmp0 = RADEON_BIOS16(tmp+64+i*2);		if (tmp0 == 0) break;		if ((RADEON_BIOS16(tmp0) == info->PanelXRes) &&		    (RADEON_BIOS16(tmp0+2) == info->PanelYRes)) {		    info->HBlank     = (RADEON_BIOS16(tmp0+17) -					RADEON_BIOS16(tmp0+19)) * 8;		    info->HOverPlus  = (RADEON_BIOS16(tmp0+21) -					RADEON_BIOS16(tmp0+19) - 1) * 8;		    info->HSyncWidth = RADEON_BIOS8(tmp0+23) * 8;		    info->VBlank     = (RADEON_BIOS16(tmp0+24) -					RADEON_BIOS16(tmp0+26));		    info->VOverPlus  = ((RADEON_BIOS16(tmp0+28) & 0x7ff) -					RADEON_BIOS16(tmp0+26));		    info->VSyncWidth = ((RADEON_BIOS16(tmp0+28) & 0xf800) >> 11);		    info->DotClock   = RADEON_BIOS16(tmp0+9) * 10;		    info->Flags = 0;		}	    }	}    }    return TRUE;}Bool RADEONGetHardCodedEDIDFromBIOS (ScrnInfoPtr pScrn){    RADEONInfoPtr info     = RADEONPTR(pScrn);    unsigned long tmp;    char EDID[256];    if (!info->VBIOS) return FALSE;    if (info->IsAtomBios) {	/* Not yet */	return FALSE;    } else {	if (!(tmp = RADEON_BIOS16(info->ROMHeaderStart + 0x4c))) {	    return FALSE;	}	memcpy(EDID, (char*)(info->VBIOS + tmp), 256);	info->DotClock = (*(CARD16*)(EDID+54)) * 10;	info->PanelXRes = (*(CARD8*)(EDID+56)) + ((*(CARD8*)(EDID+58))>>4)*256;	info->HBlank = (*(CARD8*)(EDID+57)) + ((*(CARD8*)(EDID+58)) & 0xf)*256;	info->HOverPlus = (*(CARD8*)(EDID+62)) + ((*(CARD8*)(EDID+65)>>6)*256);	info->HSyncWidth = (*(CARD8*)(EDID+63)) + (((*(CARD8*)(EDID+65)>>4) & 3)*256);	info->PanelYRes = (*(CARD8*)(EDID+59)) + ((*(CARD8*)(EDID+61))>>4)*256;	info->VBlank = ((*(CARD8*)(EDID+60)) + ((*(CARD8*)(EDID+61)) & 0xf)*256);	info->VOverPlus = (((*(CARD8*)(EDID+64))>>4) + (((*(CARD8*)(EDID+65)>>2) & 3)*16));	info->VSyncWidth = (((*(CARD8*)(EDID+64)) & 0xf) + ((*(CARD8*)(EDID+65)) & 3)*256);	info->Flags      = V_NHSYNC | V_NVSYNC; /**(CARD8*)(EDID+71);*/	xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Hardcoded EDID data will be used for TMDS panel\n");    }    return TRUE;}Bool RADEONGetTMDSInfoFromBIOS (ScrnInfoPtr pScrn){    RADEONInfoPtr info     = RADEONPTR(pScrn);    CARD32 tmp, maxfreq;    int i, n;    if (!info->VBIOS) return FALSE;    if (info->IsAtomBios) {	if((tmp = RADEON_BIOS16 (info->MasterDataStart + 18))) {	    maxfreq = RADEON_BIOS16(tmp+4);	    	    for (i=0; i<4; i++) {		info->tmds_pll[i].freq = RADEON_BIOS16(tmp+i*6+6);		/* This assumes each field in TMDS_PLL has 6 bit as in R300/R420 */		info->tmds_pll[i].value = ((RADEON_BIOS8(tmp+i*6+8) & 0x3f) |					   ((RADEON_BIOS8(tmp+i*6+10) & 0x3f)<<6) |					   ((RADEON_BIOS8(tmp+i*6+9) & 0xf)<<12) |					   ((RADEON_BIOS8(tmp+i*6+11) & 0xf)<<16));		xf86DrvMsg(pScrn->scrnIndex, X_INFO, 			   "TMDS PLL from BIOS: %ld %lx\n", 			   info->tmds_pll[i].freq, info->tmds_pll[i].value);		       		if (maxfreq == info->tmds_pll[i].freq) {		    info->tmds_pll[i].freq = 0xffffffff;		    break;		}	    }	    return TRUE;	}    } else {	tmp = RADEON_BIOS16(info->ROMHeaderStart + 0x34);	if (tmp) {	    xf86DrvMsg(pScrn->scrnIndex, X_INFO,		       "DFP table revision: %d\n", RADEON_BIOS8(tmp));	    if (RADEON_BIOS8(tmp) == 3) {		n = RADEON_BIOS8(tmp + 5) + 1;		if (n > 4) n = 4;		for (i=0; i<n; i++) {		    info->tmds_pll[i].value = RADEON_BIOS32(tmp+i*10+0x08);		    info->tmds_pll[i].freq = RADEON_BIOS16(tmp+i*10+0x10);		}		return TRUE;	    } else if (RADEON_BIOS8(tmp) == 4) {	        int stride = 0;		n = RADEON_BIOS8(tmp + 5) + 1;		if (n > 4) n = 4;		for (i=0; i<n; i++) {		    info->tmds_pll[i].value = RADEON_BIOS32(tmp+stride+0x08);		    info->tmds_pll[i].freq = RADEON_BIOS16(tmp+stride+0x10);		    if (i == 0) stride += 10;		    else stride += 6;		}		return TRUE;	    }	    /* revision 4 has some problem as it appears in RV280, 	       comment it off for now, use default instead */ 	    /*    		  else if (RADEON_BIOS8(tmp) == 4) {		  int stride = 0;		  n = RADEON_BIOS8(tmp + 5) + 1;		  if (n > 4) n = 4;		  for (i=0; i<n; i++) {		  info->tmds_pll[i].value = RADEON_BIOS32(tmp+stride+0x08);		  info->tmds_pll[i].freq = RADEON_BIOS16(tmp+stride+0x10);		  if (i == 0) stride += 10;		  else stride += 6;		  }		  return TRUE;		  }	    */  	}    }    return FALSE;}

⌨️ 快捷键说明

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