diff options
author | Alex Deucher <alexdeucher@gmail.com> | 2008-07-15 17:50:32 -0400 |
---|---|---|
committer | Alex Deucher <alexdeucher@gmail.com> | 2008-07-15 17:50:32 -0400 |
commit | e8c07270e1fc2ee455320370692aaf90abac2773 (patch) | |
tree | 5b4a5f71657b44444910914359ec88c9405720ff /src | |
parent | da41e71efd41907d9347a902720bce60b32550e5 (diff) |
ATOM: fix for r4xx cards with no VRAM_Usage tables
fixes bug 15954
Diffstat (limited to 'src')
-rw-r--r-- | src/radeon_atombios.c | 25 | ||||
-rw-r--r-- | src/radeon_bios.c | 67 |
2 files changed, 47 insertions, 45 deletions
diff --git a/src/radeon_atombios.c b/src/radeon_atombios.c index 9d2a84f2..d6675722 100644 --- a/src/radeon_atombios.c +++ b/src/radeon_atombios.c @@ -609,17 +609,6 @@ rhdAtomInit(atomBiosHandlePtr unused1, AtomBiosRequestID unused2, #endif handle->BIOSImageSize = BIOSImageSize; -# if ATOM_BIOS_PARSER - /* Try to find out if BIOS has been posted (either by system or int10 */ - if (!rhdAtomGetFbBaseAndSize(handle, NULL, NULL)) { - /* run AsicInit */ - if (!rhdAtomASICInit(handle)) - xf86DrvMsg(scrnIndex, X_WARNING, - "%s: AsicInit failed. Won't be able to obtain in VRAM " - "FB scratch space\n",__func__); - } -# endif - data->atomhandle = handle; return ATOM_SUCCESS; @@ -654,12 +643,18 @@ rhdAtomVramInfoQuery(atomBiosHandlePtr handle, AtomBiosRequestID func, switch (func) { case GET_FW_FB_START: - *val = le32_to_cpu(atomDataPtr->VRAM_UsageByFirmware - ->asFirmwareVramReserveInfo[0].ulStartAddrUsedByFirmware); + if (atomDataPtr->VRAM_UsageByFirmware) + *val = le32_to_cpu(atomDataPtr->VRAM_UsageByFirmware + ->asFirmwareVramReserveInfo[0].ulStartAddrUsedByFirmware); + else + return ATOM_NOT_IMPLEMENTED; break; case GET_FW_FB_SIZE: - *val = le16_to_cpu(atomDataPtr->VRAM_UsageByFirmware - ->asFirmwareVramReserveInfo[0].usFirmwareUseInKb); + if (atomDataPtr->VRAM_UsageByFirmware) + *val = le16_to_cpu(atomDataPtr->VRAM_UsageByFirmware + ->asFirmwareVramReserveInfo[0].usFirmwareUseInKb); + else + return ATOM_NOT_IMPLEMENTED; break; default: return ATOM_NOT_IMPLEMENTED; diff --git a/src/radeon_bios.c b/src/radeon_bios.c index 1faada9f..51484acc 100644 --- a/src/radeon_bios.c +++ b/src/radeon_bios.c @@ -273,6 +273,7 @@ RADEONGetBIOSInfo(ScrnInfoPtr pScrn, xf86Int10InfoPtr pInt10) RADEONInfoPtr info = RADEONPTR(pScrn); int tmp; unsigned short dptr; + Bool unposted = FALSE; #ifdef XSERVER_LIBPCIACCESS int size = info->PciInfo->rom_size > RADEON_VBIOS_SIZE ? info->PciInfo->rom_size : RADEON_VBIOS_SIZE; @@ -291,6 +292,7 @@ RADEONGetBIOSInfo(ScrnInfoPtr pScrn, xf86Int10InfoPtr pInt10) RADEON_VBIOS_SIZE); } else if (!radeon_read_bios(pScrn)) { (void)radeon_read_unposted_bios(pScrn); + unposted = TRUE; } } @@ -326,7 +328,7 @@ RADEONGetBIOSInfo(ScrnInfoPtr pScrn, xf86Int10InfoPtr pInt10) info->VBIOS = NULL; return FALSE; } - + tmp = info->ROMHeaderStart + 4; if ((RADEON_BIOS8(tmp) == 'A' && RADEON_BIOS8(tmp+1) == 'T' && @@ -344,51 +346,56 @@ RADEONGetBIOSInfo(ScrnInfoPtr pScrn, xf86Int10InfoPtr pInt10) info->IsAtomBios ? "ATOM":"Legacy"); if (info->IsAtomBios) { - AtomBiosArgRec atomBiosArg; + AtomBiosArgRec atomBiosArg; - if (RHDAtomBiosFunc(pScrn->scrnIndex, NULL, ATOMBIOS_INIT, &atomBiosArg) - == ATOM_SUCCESS) { - info->atomBIOS = atomBiosArg.atomhandle; - } + if (RHDAtomBiosFunc(pScrn->scrnIndex, NULL, ATOMBIOS_INIT, &atomBiosArg) + == ATOM_SUCCESS) { + info->atomBIOS = atomBiosArg.atomhandle; + } - atomBiosArg.fb.start = info->FbFreeStart; - atomBiosArg.fb.size = info->FbFreeSize; - if (RHDAtomBiosFunc(pScrn->scrnIndex, info->atomBIOS, ATOMBIOS_ALLOCATE_FB_SCRATCH, + atomBiosArg.fb.start = info->FbFreeStart; + atomBiosArg.fb.size = info->FbFreeSize; + if (RHDAtomBiosFunc(pScrn->scrnIndex, info->atomBIOS, ATOMBIOS_ALLOCATE_FB_SCRATCH, &atomBiosArg) == ATOM_SUCCESS) { info->FbFreeStart = atomBiosArg.fb.start; info->FbFreeSize = atomBiosArg.fb.size; - } - - RHDAtomBiosFunc(pScrn->scrnIndex, info->atomBIOS, GET_DEFAULT_ENGINE_CLOCK, - &atomBiosArg); - RHDAtomBiosFunc(pScrn->scrnIndex, info->atomBIOS, GET_DEFAULT_MEMORY_CLOCK, - &atomBiosArg); - RHDAtomBiosFunc(pScrn->scrnIndex, info->atomBIOS, - GET_MAX_PIXEL_CLOCK_PLL_OUTPUT, &atomBiosArg); - RHDAtomBiosFunc(pScrn->scrnIndex, info->atomBIOS, - GET_MIN_PIXEL_CLOCK_PLL_OUTPUT, &atomBiosArg); - RHDAtomBiosFunc(pScrn->scrnIndex, info->atomBIOS, - GET_MAX_PIXEL_CLOCK_PLL_INPUT, &atomBiosArg); - RHDAtomBiosFunc(pScrn->scrnIndex, info->atomBIOS, + } + + RHDAtomBiosFunc(pScrn->scrnIndex, info->atomBIOS, GET_DEFAULT_ENGINE_CLOCK, + &atomBiosArg); + RHDAtomBiosFunc(pScrn->scrnIndex, info->atomBIOS, GET_DEFAULT_MEMORY_CLOCK, + &atomBiosArg); + RHDAtomBiosFunc(pScrn->scrnIndex, info->atomBIOS, + GET_MAX_PIXEL_CLOCK_PLL_OUTPUT, &atomBiosArg); + RHDAtomBiosFunc(pScrn->scrnIndex, info->atomBIOS, + GET_MIN_PIXEL_CLOCK_PLL_OUTPUT, &atomBiosArg); + RHDAtomBiosFunc(pScrn->scrnIndex, info->atomBIOS, + GET_MAX_PIXEL_CLOCK_PLL_INPUT, &atomBiosArg); + RHDAtomBiosFunc(pScrn->scrnIndex, info->atomBIOS, GET_MIN_PIXEL_CLOCK_PLL_INPUT, &atomBiosArg); - RHDAtomBiosFunc(pScrn->scrnIndex, info->atomBIOS, + RHDAtomBiosFunc(pScrn->scrnIndex, info->atomBIOS, GET_MAX_PIXEL_CLK, &atomBiosArg); - RHDAtomBiosFunc(pScrn->scrnIndex, info->atomBIOS, - GET_REF_CLOCK, &atomBiosArg); + RHDAtomBiosFunc(pScrn->scrnIndex, info->atomBIOS, + GET_REF_CLOCK, &atomBiosArg); info->MasterDataStart = RADEON_BIOS16 (info->ROMHeaderStart + 32); } + + if (unposted && info->VBIOS) { + if (info->IsAtomBios) { + if (!rhdAtomASICInit(info->atomBIOS)) + xf86DrvMsg(pScrn->scrnIndex, X_WARNING, + "%s: AsicInit failed.\n",__func__); + } else { #if 0 - else { - /* non-primary card may need posting */ - if (!pInt10) { - xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Attempting to POST via BIOS tables\n"); + xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Attempting to POST via legacy BIOS tables\n"); RADEONGetBIOSInitTableOffsets(pScrn); RADEONPostCardFromBIOSTables(pScrn); +#endif } } -#endif + return TRUE; } |