📄 sysutils.c
字号:
{
/* do nothing */
}
else if(!pMSysData->bAsync2DEnabled)
{
WriteHWReg(pSysRegs, MAR_MBXCLK_CONFIG, ((pMSysData->ui32MBXDivider-1) << 2) | MAR_MBXCLK_CONFIG_2D);
}
pMSysData->b2DEnabled = IMG_TRUE;
break;
case DEV_CGCORE_MBX_ASYNC_2D:
PDUMPSCRIPT("---- Enabling MBX Async 2D");
if (pMSysData->bTAEnabled || pMSysData->b3DEnabled)
{
/* do nothing */
}
else if(!pMSysData->b2DEnabled)
{
WriteHWReg(pSysRegs, MAR_MBXCLK_CONFIG, ((pMSysData->ui32MBXDivider-1) << 2) | MAR_MBXCLK_CONFIG_2D);
}
#ifdef LOCAL_MEMORY_SELF_REFRESH
if (!pMSysData->bAsync2DEnabled)
{
SysLocalMemoryEnable(psDevInfo);
}
#endif // LOCAL_MEMORY_SELF_REFRESH
pMSysData->bAsync2DEnabled = IMG_TRUE;
break;
case DEV_CGCORE_MBX_TA:
PDUMPSCRIPT("---- Enabling MBX 3D");
if(!pMSysData->bTAEnabled && !pMSysData->b3DEnabled)
{
WriteHWReg(pSysRegs, MAR_MBXCLK_CONFIG, ((pMSysData->ui32MBXDivider-1) << 2) | MAR_MBXCLK_CONFIG_ALL);
}
#ifdef LOCAL_MEMORY_SELF_REFRESH
if (!pMSysData->bTAEnabled)
{
SysLocalMemoryEnable(psDevInfo);
}
#endif // LOCAL_MEMORY_SELF_REFRESH
pMSysData->bTAEnabled = IMG_TRUE;
break;
case DEV_CGCORE_MBX_3D:
PDUMPSCRIPT("---- Enabling MBX 3D");
if(!pMSysData->bTAEnabled && !pMSysData->b3DEnabled)
{
WriteHWReg(pSysRegs, MAR_MBXCLK_CONFIG, ((pMSysData->ui32MBXDivider-1) << 2) | MAR_MBXCLK_CONFIG_ALL);
}
#ifdef LOCAL_MEMORY_SELF_REFRESH
if (!pMSysData->b3DEnabled)
{
SysLocalMemoryEnable(psDevInfo);
}
#endif // LOCAL_MEMORY_SELF_REFRESH
pMSysData->b3DEnabled = IMG_TRUE;
break;
case DEV_CGCORE_M24VA:
PDUMPSCRIPT("---- Enabling M24VA");
#ifdef LOCAL_MEMORY_SELF_REFRESH
if(!pMSysData->bM24VAEnabled)
{
SysLocalMemoryEnable(psDevInfo);
pMSysData->bM24VAEnabled = IMG_TRUE;
}
#endif // LOCAL_MEMORY_SELF_REFRESH
WriteHWReg(pSysRegs, MAR_M24CLK_CONFIG,((pMSysData->ui32M24VADivider-1) << 1) | MAR_M24CLK_CONFIG_ON);
break;
case DEV_CGCORE_PDP_GRAPHICS:
PDUMPSCRIPT("---- Enabling PDP Graphics");
WriteHWReg(pSysRegs, MAR_PIXCLK_CONFIG, MAR_PIXCLK_CONFIG_ON);
break;
case DEV_CGCORE_PDP_OVERLAY:
PDUMPSCRIPT("---- Enabling PDP Overlay");
#ifdef LOCAL_MEMORY_SELF_REFRESH
if(!pMSysData->bOverlayEnabled)
{
SysLocalMemoryEnable(psDevInfo);
pMSysData->bOverlayEnabled = IMG_TRUE;
}
#endif // LOCAL_MEMORY_SELF_REFRESH
WriteHWReg(pSysRegs, MAR_VIDCLK_CONFIG, MAR_VIDCLK_CONFIG_ON);
break;
default:
PVR_DPF((PVR_DBG_ERROR,"SysCoreEnable - *UNKNOWN*"));
break;
}
PDUMPSCRIPT("---- SysCoreEnable fini");
PDUMPREGMBX;
eError = HostReleaseMutex (&psDevInfo->hClockGateMutex);
if (eError != PVRSRV_OK)
{
return eError;
}
#endif /* #ifdef MAR_NO_CLOCKCONTROL */
return(PVRSRV_OK);
}
/*!
******************************************************************************
@Function SysCoreDisable
@Description
Turn off clock of the specified core
@Input psDevInfo
@Input eCGCore - id of core to disable
@Input bBlockMutex - block?
@Return PVRSRV_ERROR
******************************************************************************/
PVRSRV_ERROR SysCoreDisable(PPVRSRV_DEV_INFO psDevInfo, DEV_CLOCKGATE_CORE eCGCore, IMG_BOOL bBlockMutex)
{
#ifdef MAR_NO_CLOCKCONTROL
UNREFERENCED_PARAMETER(psDevInfo);
UNREFERENCED_PARAMETER(eCGCore);
#else
PVRSRV_ERROR eError;
PSYS_SPECIFIC_DATA pMSysData = psDevInfo->pvSysDataPtr;
IMG_PVOID pSysRegs = psDevInfo->pvSysRegsPtr;
/*
n.b. we only protect against concurrent execution for the same device (devinfo)
for example both M24VA and MBX code can run this function concurrently
*/
eError = HostAcquireMutex (&psDevInfo->hClockGateMutex, bBlockMutex);
if (eError != PVRSRV_OK)
{
return eError;
}
PDUMPSCRIPT("---- SysCoreDisable start");
PDUMPREGTAG(PDUMPTAGS_REG_MSOC, 0);
switch (eCGCore)
{
case DEV_CGCORE_MBX_2D:
PDUMPSCRIPT("---- Disabling MBX 2D");
pMSysData->b2DEnabled = IMG_FALSE;
if (!pMSysData->bAsync2DEnabled
&& !pMSysData->b3DEnabled
&& !pMSysData->bTAEnabled)
{
WriteHWReg(pSysRegs, MAR_MBXCLK_CONFIG, MAR_MBXCLK_CONFIG_OFF);
}
break;
case DEV_CGCORE_MBX_ASYNC_2D:
PDUMPSCRIPT("---- Disabling MBX Async 2D");
#ifdef LOCAL_MEMORY_SELF_REFRESH // does this apply to all cases? should the ifdef removed?
if(pMSysData->bAsync2DEnabled)
{
SysLocalMemoryDisable(psDevInfo);
}
#endif // LOCAL_MEMORY_SELF_REFRESH
pMSysData->bAsync2DEnabled = IMG_FALSE;
if (!pMSysData->b2DEnabled
&& !pMSysData->b3DEnabled
&& !pMSysData->bTAEnabled)
{
WriteHWReg(pSysRegs, MAR_MBXCLK_CONFIG, MAR_MBXCLK_CONFIG_OFF);
}
break;
case DEV_CGCORE_MBX_TA:
PDUMPSCRIPT("---- Disabling MBX 3D");
#ifdef LOCAL_MEMORY_SELF_REFRESH // does this apply to all cases? should the ifdef removed?
if(pMSysData->bTAEnabled)
{
SysLocalMemoryDisable(psDevInfo);
}
#endif // LOCAL_MEMORY_SELF_REFRESH
pMSysData->bTAEnabled = IMG_FALSE;
if(pMSysData->b3DEnabled)
{
/* do nothing */
}
else if(pMSysData->b2DEnabled || pMSysData->bAsync2DEnabled)
{
WriteHWReg(pSysRegs, MAR_MBXCLK_CONFIG,
((pMSysData->ui32MBXDivider-1) << 2) | MAR_MBXCLK_CONFIG_2D);
}
else
{
WriteHWReg(pSysRegs, MAR_MBXCLK_CONFIG, MAR_MBXCLK_CONFIG_OFF);
}
break;
case DEV_CGCORE_MBX_3D:
PDUMPSCRIPT("---- Disabling MBX 3D");
#ifdef LOCAL_MEMORY_SELF_REFRESH // does this apply to all cases? should the ifdef removed?
if(pMSysData->b3DEnabled)
{
SysLocalMemoryDisable(psDevInfo);
}
#endif // LOCAL_MEMORY_SELF_REFRESH
pMSysData->b3DEnabled = IMG_FALSE;
if(pMSysData->bTAEnabled)
{
/* do nothing */
}
else if(pMSysData->b2DEnabled || pMSysData->bAsync2DEnabled)
{
WriteHWReg(pSysRegs, MAR_MBXCLK_CONFIG,
((pMSysData->ui32MBXDivider-1) << 2) | MAR_MBXCLK_CONFIG_2D);
}
else
{
WriteHWReg(pSysRegs, MAR_MBXCLK_CONFIG, MAR_MBXCLK_CONFIG_OFF);
}
break;
case DEV_CGCORE_M24VA:
PDUMPSCRIPT("---- Disabling M24VA");
#ifdef LOCAL_MEMORY_SELF_REFRESH
if(pMSysData->bM24VAEnabled)
{
SysLocalMemoryDisable(psDevInfo);
pMSysData->bM24VAEnabled = IMG_FALSE;
}
#endif // LOCAL_MEMORY_SELF_REFRESH
WriteHWReg(pSysRegs, MAR_M24CLK_CONFIG,((pMSysData->ui32M24VADivider-1) << 1) | MAR_M24CLK_CONFIG_OFF);
break;
case DEV_CGCORE_PDP_GRAPHICS:
PDUMPSCRIPT("---- Disabling PDP Graphics");
WriteHWReg(pSysRegs, MAR_PIXCLK_CONFIG, MAR_PIXCLK_CONFIG_OFF);
break;
case DEV_CGCORE_PDP_OVERLAY:
PDUMPSCRIPT("---- Disabling PDP Overlay");
#ifdef LOCAL_MEMORY_SELF_REFRESH
if(pMSysData->bOverlayEnabled)
{
SysLocalMemoryDisable(psDevInfo);
pMSysData->bOverlayEnabled = IMG_FALSE;
}
#endif // LOCAL_MEMORY_SELF_REFRESH
WriteHWReg(pSysRegs, MAR_VIDCLK_CONFIG, MAR_VIDCLK_CONFIG_OFF);
break;
default:
PVR_DPF((PVR_DBG_ERROR,"DevCoreDisable - *UNKNOWN*"));
break;
}
PDUMPSCRIPT("---- SysCoreDisable fini");
PDUMPREGMBX;
eError = HostReleaseMutex (&psDevInfo->hClockGateMutex);
if (eError != PVRSRV_OK)
{
return eError;
}
#endif /* #ifdef MAR_NO_CLOCKCONTROL */
return(PVRSRV_OK);
}
#ifdef LOCAL_MEMORY_SELF_REFRESH
PVRSRV_ERROR SysLocalMemoryDisable(PPVRSRV_DEV_INFO psDevInfo)
{
PSYS_SPECIFIC_DATA pMSysData = psDevInfo->pvSysDataPtr;
static HANDLE hThread = NULL;
// Enter critical section
LockLocalMemoryFunction();
if(hThread == NULL)
{
hThread = HostWatchLocalMemory((IMG_VOID *)psDevInfo);
}
pMSysData->uiLocalMemoryUsers--;
if((signed long) pMSysData->uiLocalMemoryUsers < 0)
{
// This should never happen - only will happen if an Enable is
// not paired up correctly with a Disable.
pMSysData->uiLocalMemoryUsers = 0;
}
// Only set the event that we're not using local memory if we care.
if(pMSysData->bUseLocalMemorySelfRefresh == TRUE && // Only if user wants
pMSysData->sLCDState.sLCD2Config.bActive == FALSE && // Not using dual display
pMSysData->uiLocalMemoryUsers == 0) // No one using local memory
{
HostSetEvent(pMSysData->hLocalMemoryIdleEvent);
}
// Leave critical section
UnLockLocalMemoryFunction();
return PVRSRV_OK;
}
PVRSRV_ERROR SysLocalMemoryEnable(PPVRSRV_DEV_INFO psDevInfo)
{
PSYS_SPECIFIC_DATA pMSysData = psDevInfo->pvSysDataPtr;
// Enter critical section
LockLocalMemoryFunction();
pMSysData->uiLocalMemoryUsers++;
pMSysData->bLocalMemoryTimeoutRefresh = IMG_TRUE;
/* Wake SDRAM */
if(pMSysData && pMSysData->bSDRAMNeedsWaking)
{
#if REDUCE_FREQ_IN_DISP_REFRESH
SysSDRAMSetStateWithFreqChanges(SYS_SDRAM_POWER_ACTIVE);
#else
SysSDRAMSetState(SYS_SDRAM_POWER_ACTIVE);
#endif
pMSysData->bSDRAMNeedsWaking = IMG_FALSE;
}
// Leave critical section
UnLockLocalMemoryFunction();
return PVRSRV_OK;
}
#endif // LOCAL_MEMORY_SELF_REFRESH
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -