--- xc/programs/Xserver/hw/xfree86/drivers/ati/radeon_driver.c 2004-03-05 14:15:37.000000000 -0600 +++ radeon_driver.c 2004-03-27 11:44:45.468235848 -0600 @@ -156,7 +156,8 @@ OPTION_NORADEONXINERAMA, OPTION_CRT2ISSCRN0, OPTION_DISP_PRIORITY, - OPTION_PANEL_SIZE + OPTION_PANEL_SIZE, + OPTION_FWPLL } RADEONOpts; const OptionInfoRec RADEONOptions[] = { @@ -197,6 +198,7 @@ { OPTION_CRT2ISSCRN0, "MergedXineramaCRT2IsScreen0", OPTV_BOOLEAN, {0}, FALSE }, { OPTION_DISP_PRIORITY, "DisplayPriority", OPTV_ANYSTR, {0}, FALSE }, { OPTION_PANEL_SIZE, "PanelSize", OPTV_ANYSTR, {0}, FALSE }, + { OPTION_FWPLL, "UseFWPLL", OPTV_BOOLEAN, {0}, FALSE }, { -1, NULL, OPTV_NONE, {0}, FALSE } }; @@ -1892,6 +1894,10 @@ pll->xclk = RADEON_BIOS16(pll_info_block + 0x08); } + if (xf86ReturnOptValBool(info->Options, OPTION_FWPLL, FALSE)) + pll->reference_div = INPLL(pScrn, RADEON_PPLL_REF_DIV); + + return TRUE; } @@ -6551,10 +6557,11 @@ } /* Define PLL registers for requested video mode */ -static void RADEONInitPLLRegisters(RADEONSavePtr save, RADEONPLLPtr pll, +static void RADEONInitPLLRegisters(ScrnInfoPtr pScrn, RADEONSavePtr save, RADEONPLLPtr pll, double dot_clock) { unsigned long freq = dot_clock * 100; + RADEONInfoPtr info = RADEONPTR(pScrn); struct { int divider; @@ -6598,7 +6605,12 @@ save->post_div = post_div->divider; save->ppll_ref_div = pll->reference_div; - save->ppll_div_3 = (save->feedback_div | (post_div->bitvalue << 16)); + + if (xf86ReturnOptValBool(info->Options, OPTION_FWPLL, FALSE)) + save->ppll_div_3 = INPLL(pScrn, RADEON_PPLL_DIV_3); + else + save->ppll_div_3 = (save->feedback_div | (post_div->bitvalue << 16)); + save->htotal_cntl = 0; } @@ -6733,7 +6745,7 @@ return FALSE; dot_clock = (((RADEONMergedDisplayModePtr)mode->Private)->CRT1)->Clock / 1000.0; if (dot_clock) { - RADEONInitPLLRegisters(save, &info->pll, dot_clock); + RADEONInitPLLRegisters(pScrn, save, &info->pll, dot_clock); } else { save->ppll_ref_div = info->SavedReg.ppll_ref_div; save->ppll_div_3 = info->SavedReg.ppll_div_3; @@ -6754,7 +6766,7 @@ save->htotal_cntl = 0; } else - RADEONInitPLLRegisters(save, &info->pll, dot_clock); + RADEONInitPLLRegisters(pScrn, save, &info->pll, dot_clock); } else { save->ppll_ref_div = info->SavedReg.ppll_ref_div; save->ppll_div_3 = info->SavedReg.ppll_div_3;