diff options
author | Egbert Eich <eich@freedesktop.org> | 2009-10-26 15:56:28 +0100 |
---|---|---|
committer | Egbert Eich <eich@freedesktop.org> | 2009-10-26 15:56:28 +0100 |
commit | 7f896deecf82bca550c57d8079ec10c041926548 (patch) | |
tree | c8f8381eb9c897a06d96052b5b3823c4437298b5 | |
parent | a838114e998a779ce64b894bf8cc34f93647c001 (diff) |
Print out value of MC status register if it is busy when tested.
-rw-r--r-- | src/rhd_mc.c | 110 |
1 files changed, 63 insertions, 47 deletions
diff --git a/src/rhd_mc.c b/src/rhd_mc.c index def871b..8989b28 100644 --- a/src/rhd_mc.c +++ b/src/rhd_mc.c @@ -79,7 +79,7 @@ struct rhdMC { void (*Save)(struct rhdMC *MC); void (*Restore)(struct rhdMC *MC); - Bool (*Idle)(struct rhdMC *MC); + CARD32 (*Idle)(struct rhdMC *MC); CARD64 (*GetFBLocation)(struct rhdMC *MC, CARD32 *size); void (*SetupFBLocation)(struct rhdMC *MC, CARD64 Address, CARD32 Size); void (*TuneAccessForDisplay)(struct rhdMC *MC, int crtc, @@ -144,12 +144,14 @@ RV515MCRestore(struct rhdMC *MC) /* * */ -static Bool -RV515MCWaitIdle(struct rhdMC *MC) +static CARD32 +RV515MCStateIdle(struct rhdMC *MC) { - if (RHDReadMC(MC, MC_IND_ALL | RV515_MC_STATUS) & RV515_MC_IDLE) - return TRUE; - return FALSE; + CARD32 val; + + if ((val = RHDReadMC(MC, MC_IND_ALL | RV515_MC_STATUS)) & RV515_MC_IDLE) + return 0; + return val; } /* @@ -217,12 +219,14 @@ R500MCRestore(struct rhdMC *MC) /* * */ -static Bool -R500MCWaitIdle(struct rhdMC *MC) +static CARD32 +R500MCStateIdle(struct rhdMC *MC) { - if (RHDReadMC(MC, MC_IND_ALL | R5XX_MC_STATUS) & R5XX_MC_IDLE) - return TRUE; - return FALSE; + CARD32 val; + + if ((val = RHDReadMC(MC, MC_IND_ALL | R5XX_MC_STATUS)) & R5XX_MC_IDLE) + return 0; + return val; } /* @@ -268,12 +272,14 @@ RS600MCRestore(struct rhdMC *MC) /* * */ -static Bool -RS600MCWaitIdle(struct rhdMC *MC) +static CARD32 +RS600MCStateIdle(struct rhdMC *MC) { - if (RHDReadMC(MC, RS60_MC_SYSTEM_STATUS) & RS6X_MC_SEQUENCER_IDLE) - return TRUE; - return FALSE; + CARD32 val; + + if ((val = RHDReadMC(MC, RS60_MC_SYSTEM_STATUS)) & RS6X_MC_SEQUENCER_IDLE) + return 0; + return val; } /* @@ -320,12 +326,15 @@ RS690MCRestore(struct rhdMC *MC) /* * */ -static Bool -RS690MCWaitIdle(struct rhdMC *MC) +static CARD32 +RS690MCStateIdle(struct rhdMC *MC) { - if (RHDReadMC(MC, RS69_MC_SYSTEM_STATUS) & RS6X_MC_SYSTEM_IDLE) - return TRUE; - return FALSE; + CARD32 val; + + if ((val = RHDReadMC(MC, RS69_MC_SYSTEM_STATUS)) & RS6X_MC_SYSTEM_IDLE) + return 0; + + return val; } /* @@ -392,14 +401,16 @@ R600MCRestore(struct rhdMC *MC) /* * */ -static Bool -R600MCWaitIdle(struct rhdMC *MC) +static CARD32 +R600MCStateIdle(struct rhdMC *MC) { - if (!(RHDRegRead(MC, SRBM_STATUS) & + CARD32 val; + + if (!((val = RHDRegRead(MC, SRBM_STATUS)) & (VMC_BUSY_bit | MCB_BUSY_bit | MCDZ_BUSY_bit | MCDY_BUSY_bit | MCDX_BUSY_bit | MCDW_BUSY_bit))) - return TRUE; - return FALSE; + return 0; + return val; } /* @@ -450,11 +461,13 @@ RS780MCRestore(struct rhdMC *MC) * */ static Bool -RS780MCWaitIdle(struct rhdMC *MC) +RS780MCStateIdle(struct rhdMC *MC) { - if (RHDReadMC(MC, RS78_MC_SYSTEM_STATUS) & RS78_MC_SEQUENCER_IDLE) - return TRUE; - return FALSE; + CARD32 val; + + if ((val = RHDReadMC(MC, RS78_MC_SYSTEM_STATUS)) & RS78_MC_SEQUENCER_IDLE) + return 0; + return val; } /* @@ -566,7 +579,7 @@ RHDMCInit(RHDPtr rhdPtr) MC->Restore = RV515MCRestore; MC->SetupFBLocation = RV515MCSetupFBLocation; MC->GetFBLocation = RV515MCGetFBLocation; - MC->Idle = RV515MCWaitIdle; + MC->Idle = RV515MCStateIdle; MC->TuneAccessForDisplay = RV515MCTuneMCAccessForDisplay; break; default: @@ -574,27 +587,27 @@ RHDMCInit(RHDPtr rhdPtr) MC->Restore = R500MCRestore; MC->SetupFBLocation = R500MCSetupFBLocation; MC->GetFBLocation = R500MCGetFBLocation; - MC->Idle = R500MCWaitIdle; + MC->Idle = R500MCStateIdle; break; } } else if (rhdPtr->ChipSet == RHD_RS600) { MC->Save = RS600MCSave; MC->Restore = RS600MCRestore; MC->SetupFBLocation = RS600MCSetupFBLocation; - MC->Idle = RS600MCWaitIdle; + MC->Idle = RS600MCStateIdle; MC->GetFBLocation = RS600MCGetFBLocation; } else if (rhdPtr->ChipSet < RHD_R600) { MC->Save = RS690MCSave; MC->Restore = RS690MCRestore; MC->SetupFBLocation = RS690MCSetupFBLocation; - MC->Idle = RS690MCWaitIdle; + MC->Idle = RS690MCStateIdle; MC->GetFBLocation = RS690MCGetFBLocation; MC->TuneAccessForDisplay = RS690MCTuneMCAccessForDisplay; } else if (rhdPtr->ChipSet <= RHD_RS880) { MC->Save = R600MCSave; MC->Restore = R600MCRestore; MC->SetupFBLocation = R600MCSetupFBLocation; - MC->Idle = R600MCWaitIdle; + MC->Idle = R600MCStateIdle; MC->GetFBLocation = R600MCGetFBLocation; } #ifdef NOTYET @@ -602,7 +615,7 @@ RHDMCInit(RHDPtr rhdPtr) MC->Save = RS780MCSave; MC->Restore = RS780MCRestore; MC->SetupFBLocation = RS780MCSetupFBLocation; - MC->Idle = RS780MCWaitIdle; + MC->Idle = RS780MCStateIdle; MC->GetFBLocation = RS780MCGetFBLocation; } #endif /* NOTYET */ @@ -610,7 +623,7 @@ RHDMCInit(RHDPtr rhdPtr) MC->Save = R700MCSave; MC->Restore = R700MCRestore; MC->SetupFBLocation = R700MCSetupFBLocation; - MC->Idle = R600MCWaitIdle; + MC->Idle = R600MCStateIdle; MC->GetFBLocation = R700MCGetFBLocation; } else { xf86DrvMsg(rhdPtr->scrnIndex, X_ERROR, "I don't know anything about MC on this chipset\n"); @@ -666,6 +679,7 @@ void RHDMCRestore(RHDPtr rhdPtr) { struct rhdMC *MC = rhdPtr->MC; + int idle; ASSERT(MC); RHD_UNSETDEBUGFLAG(rhdPtr, MC_SETUP); @@ -678,11 +692,11 @@ RHDMCRestore(RHDPtr rhdPtr) return; } - if (MC->Idle(MC)) + if ((idle = MC->Idle(MC)) == 0) MC->Restore(MC); else xf86DrvMsg(rhdPtr->scrnIndex, X_ERROR, - "%s: MC is still not idle!!!\n", __func__); + "%s: MC is still not idle: 0x%x !!!\n", __func__,idle); } /* @@ -692,18 +706,19 @@ Bool RHDMCIdleWait(RHDPtr rhdPtr, CARD32 count) { struct rhdMC *MC = rhdPtr->MC; + CARD32 idle; RHDFUNC(rhdPtr); ASSERT(MC); do { - if (MC->Idle(MC)) + if ((idle = MC->Idle(MC)) == 0) return TRUE; usleep(1000); } while (count--); - RHDDebug(rhdPtr->scrnIndex, "%s: MC not idle\n",__func__); + RHDDebug(rhdPtr->scrnIndex, "%s: MC not idle: 0x%x\n",__func__,idle); return FALSE; } @@ -733,18 +748,13 @@ RHDMCSetupFBLocation(RHDPtr rhdPtr, CARD64 Address, CARD32 Size) struct rhdMC *MC = rhdPtr->MC; CARD64 OldAddress; CARD32 OldSize; + CARD32 idle; ASSERT(MC); RHD_SETDEBUGFLAG(rhdPtr, MC_SETUP); RHDFUNC(rhdPtr); - if (!MC->Idle(MC)) { - xf86DrvMsg(rhdPtr->scrnIndex, X_ERROR, - "%s: Cannot setup MC: not idle!!!\n", __func__); - return FALSE; - } - OldAddress = MC->GetFBLocation(MC, &OldSize); if (OldAddress == Address && OldSize == Size) return TRUE; @@ -754,6 +764,12 @@ RHDMCSetupFBLocation(RHDPtr rhdPtr, CARD64 Address, CARD32 Size) xf86DrvMsg(rhdPtr->scrnIndex, X_WARNING, "%s: Board claims to use a " "higher than 32bit address for its FB\n", __func__); + if ((idle = MC->Idle(MC))) { + xf86DrvMsg(rhdPtr->scrnIndex, X_ERROR, + "%s: Cannot setup MC: not idle %x!!!\n", __func__,idle); + return FALSE; + } + RHDDebug(rhdPtr->scrnIndex, "Setting MC from 0x%08X to 0x%08X [Size 0x%08X]\n", OldAddress, rhdPtr->FbIntAddress, Size); |