summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAlex Deucher <alex@botch2.(none)>2008-01-19 17:17:26 -0500
committerAlex Deucher <alex@botch2.(none)>2008-01-19 17:17:26 -0500
commitd4596c52ac9994be26e9ec2d7d57b3892c34abdb (patch)
tree1443bfec6c3a11a2a1b6b9568b497a573101ea83 /src
parent9a0947c812d0d38d1bca6a91140ac210831a6cb4 (diff)
RADEON: grab pll_in_min/pll_in_max from bios tables if available
Diffstat (limited to 'src')
-rw-r--r--src/radeon_bios.c25
1 files changed, 17 insertions, 8 deletions
diff --git a/src/radeon_bios.c b/src/radeon_bios.c
index 92a4927..f928eb4 100644
--- a/src/radeon_bios.c
+++ b/src/radeon_bios.c
@@ -556,18 +556,26 @@ Bool RADEONGetClockInfoFromBIOS (ScrnInfoPtr pScrn)
info->sclk = RADEON_BIOS32(pll_info_block + 8) / 100.0;
info->mclk = RADEON_BIOS32(pll_info_block + 12) / 100.0;
} else {
+ int rev;
+
pll_info_block = RADEON_BIOS16 (info->ROMHeaderStart + 0x30);
+ rev = RADEON_BIOS8(pll_info_block);
+
pll->reference_freq = RADEON_BIOS16 (pll_info_block + 0x0e);
pll->reference_div = RADEON_BIOS16 (pll_info_block + 0x10);
pll->pll_out_min = RADEON_BIOS32 (pll_info_block + 0x12);
pll->pll_out_max = RADEON_BIOS32 (pll_info_block + 0x16);
- /* not available in the bios */
- pll->pll_in_min = 40;
- pll->pll_in_max = 500;
+ if (rev > 9) {
+ pll->pll_in_min = RADEON_BIOS32(pll_info_block + 0x36);
+ pll->pll_in_max = RADEON_BIOS32(pll_info_block + 0x3a);
+ } else {
+ pll->pll_in_min = 40;
+ pll->pll_in_max = 500;
+ }
- pll->xclk = RADEON_BIOS16 (pll_info_block + 0x08);
+ 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;
@@ -577,11 +585,12 @@ Bool RADEONGetClockInfoFromBIOS (ScrnInfoPtr pScrn)
if (info->mclk == 0) info->mclk = 200;
}
- xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ref_freq: %d, min_pll: %u, "
- "max_pll: %u, xclk: %d, sclk: %f, mclk: %f\n",
+ xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ref_freq: %d, min_out_pll: %u, "
+ "max_out_pll: %u, min_in_pll: %u, max_in_pll: %u, xclk: %d, "
+ "sclk: %f, mclk: %f\n",
pll->reference_freq, (unsigned)pll->pll_out_min,
- (unsigned)pll->pll_out_max, pll->xclk, info->sclk,
- info->mclk);
+ (unsigned)pll->pll_out_max, (unsigned)pll->pll_in_min,
+ (unsigned)pll->pll_in_max, pll->xclk, info->sclk, info->mclk);
return TRUE;
}