📄 metrics.c
字号:
/**************************************************************************
* Name : metrics.c
* Created : 22/09/2004
*
* Copyright : 2004 by Imagination Technologies Limited. All rights reserved.
* : No part of this software, either material or conceptual
* : may be copied or distributed, transmitted, transcribed,
* : stored in a retrieval system or translated into any
* : human or computer language in any form by any means,
* : electronic, mechanical, manual or other-wise, or
* : disclosed to third parties without the express written
* : permission of Imagination Technologies Limited, Unit 8, HomePark
* : Industrial Estate, King's Langley, Hertfordshire,
* : WD4 8LZ, U.K.
*
* Platform : ANSI
*
* $Log: metrics.c $
**************************************************************************/
#if defined(DEBUG) || defined(TIMING)
#include "services_headers.h"
static IMG_UINT32 *pui32TimerRegister = 0;
#if defined(__SH4__)
/* timer control registers */
#define TST_REG (*(volatile unsigned char *)(psDevLocation->pvSOCRegsBaseKM)) // timer start register
#define TCOR_0 (*(volatile unsigned int *)(psDevLocation->pvSOCRegsBaseKM+4)) // timer constant register_0
#define TCNT_0 (*(volatile unsigned int *)(psDevLocation->pvSOCRegsBaseKM+8)) // timer counter register_0
#define TCR_0 (*(volatile unsigned short *)(psDevLocation->pvSOCRegsBaseKM+12)) // timer control register_0
#define TCOR_1 (*(volatile unsigned int *)(psDevLocation->pvSOCRegsBaseKM+16)) // timer constant register_1
#define TCNT_1 (*(volatile unsigned int *)(psDevLocation->pvSOCRegsBaseKM+20)) // timer counter register_1
#define TCR_1 (*(volatile unsigned short *)(psDevLocation->pvSOCRegsBaseKM+24)) // timer control register_1
#define TCOR_2 (*(volatile unsigned int *)(psDevLocation->pvSOCRegsBaseKM+28)) // timer constant register_2
#define TCNT_2 (*(volatile unsigned int *)(psDevLocation->pvSOCRegsBaseKM+32)) // timer counter register_2
#define TCR_2 (*(volatile unsigned short *)(psDevLocation->pvSOCRegsBaseKM+36)) // timer control register_2
#define TIMER_DIVISOR 4
#endif /* __SH4__ */
#define PVRSRV_TIMER_TOTAL_IN_TICKS(X) asTimers[X].ui32Total
#define PVRSRV_TIMER_TOTAL_IN_MS(X) ((1000*asTimers[X].ui32Total)/ui32TicksPerMS)
#define PVRSRV_TIMER_COUNT(X) asTimers[X].ui32Count
Temporal_Data asTimers[PVRSRV_NUM_TIMERS];
/***********************************************************************************
Function Name : PVRSRVTimeNow
Inputs :
Outputs :
Returns :
Description :
************************************************************************************/
IMG_UINT32 PVRSRVTimeNow(IMG_VOID)
{
if (!pui32TimerRegister)
{
static IMG_BOOL bFirstTime = IMG_TRUE;
if (bFirstTime)
{
PVR_DPF((PVR_DBG_ERROR,"PVRSRVTimeNow: No timer register set up"));
bFirstTime = IMG_FALSE;
}
return 0;
}
#if defined(__arm__)
return *pui32TimerRegister;
#elif defined(__SH4__)
return (0xffffffff-*pui32TimerRegister);
#else
return 0;
#endif
}
/***********************************************************************************
Function Name : PVRSRVGetCPUFreq
Inputs :
Outputs :
Returns :
Description :
************************************************************************************/
static IMG_UINT32 PVRSRVGetCPUFreq(IMG_VOID)
{
IMG_UINT32 ui32Time1, ui32Time2;
ui32Time1 = PVRSRVTimeNow();
HostWaitus(1000000);
ui32Time2 = PVRSRVTimeNow();
return (ui32Time2 - ui32Time1);
}
/***********************************************************************************
Function Name : PVRSRVSetupMetricTimers
Inputs :
Outputs :
Returns :
Description :
************************************************************************************/
IMG_VOID PVRSRVSetupMetricTimers(PPVRSRV_DEV_INFO psDevInfo)
{
PVRSRV_DEV_LOCATION *psDevLocation = &psDevInfo->sDevLocation;
IMG_UINT32 ui32Loop;
for(ui32Loop=0; ui32Loop < (PVRSRV_NUM_TIMERS); ui32Loop++)
{
asTimers[ui32Loop].ui32Total = 0;
asTimers[ui32Loop].ui32Count = 0;
}
#if defined(__arm__)
pui32TimerRegister = (IMG_UINT32 *)psDevLocation->pvSOCRegsBaseKM;
#elif defined(__SH4__)
/* timer control register */
// clock / 1024 when TIMER_DIVISOR = 4
// underflow int disabled
// we get approx 38 uS per timer tick
TCR_2 = TIMER_DIVISOR;
/* reset the timer counter to 0 */
TCOR_2 = TCNT_2 = (unsigned int)0xffffffff;
/* start timer 2 */
TST_REG |= (unsigned char)0x04;
pui32TimerRegister = (IMG_UINT32 *)(psDevLocation->pvSOCRegsBaseKM+32);
#else
pui32TimerRegister = 0;
#endif
}
/***********************************************************************************
Function Name : PVRSRVOutputMetricTotals
Inputs :
Outputs :
Returns :
Description :
************************************************************************************/
IMG_VOID PVRSRVOutputMetricTotals(IMG_VOID)
{
IMG_UINT32 ui32TicksPerMS, ui32Loop;
ui32TicksPerMS = PVRSRVGetCPUFreq();
if (!ui32TicksPerMS)
{
PVR_DPF((PVR_DBG_ERROR,"PVRSRVOutputMetricTotals: Failed to get CPU Freq"));
return;
}
for(ui32Loop=0; ui32Loop < (PVRSRV_NUM_TIMERS); ui32Loop++)
{
if (asTimers[ui32Loop].ui32Count & 0x80000000L)
{
PVR_DPF((PVR_DBG_WARNING,"PVRSRVOutputMetricTotals: Timer %u is still ON", ui32Loop));
}
}
#if 0
/*
** EXAMPLE TIMER OUTPUT
*/
PVR_DPF((PVR_DBG_ERROR," Timer(%u): Total = %u",PVRSRV_TIMER_EXAMPLE_1, PVRSRV_TIMER_TOTAL_IN_TICKS(PVRSRV_TIMER_EXAMPLE_1)));
PVR_DPF((PVR_DBG_ERROR," Timer(%u): Time = %ums",PVRSRV_TIMER_EXAMPLE_1, PVRSRV_TIMER_TOTAL_IN_MS(PVRSRV_TIMER_EXAMPLE_1)));
PVR_DPF((PVR_DBG_ERROR," Timer(%u): Count = %u",PVRSRV_TIMER_EXAMPLE_1, PVRSRV_TIMER_COUNT(PVRSRV_TIMER_EXAMPLE_1)));
#endif
}
#endif /* DLL_METRIC */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -