⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sysutils.c

📁 Lido PXA270平台开发板的最新BSP,包括源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
			{
				/* 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 + -