/********************************************************************** * * Copyright (C) Imagination Technologies Ltd. All rights reserved. * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License, * version 2, as published by the Free Software Foundation. * * This program is distributed in the hope it will be useful but, except * as otherwise stated in writing, without any warranty; without even the * implied warranty of merchantability or fitness for a particular purpose. * See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along with * this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. * * The full GNU General Public License is included in this distribution in * the file called "COPYING". * * Contact Information: * Imagination Technologies Ltd. * Home Park Estate, Kings Langley, Herts, WD4 8LZ, UK * ******************************************************************************/ #include "services_headers.h" #include "metrics.h" #if defined(SUPPORT_VGX) #include "vgxapi_km.h" #endif #if defined(SUPPORT_SGX) #include "sgxapi_km.h" #endif #if defined(DEBUG) || defined(TIMING) static volatile IMG_UINT32 *pui32TimerRegister = 0; #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]; 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(__sh__) return (0xffffffff-*pui32TimerRegister); #else return 0; #endif } static IMG_UINT32 PVRSRVGetCPUFreq(IMG_VOID) { IMG_UINT32 ui32Time1, ui32Time2; ui32Time1 = PVRSRVTimeNow(); OSWaitus(1000000); ui32Time2 = PVRSRVTimeNow(); PVR_DPF((PVR_DBG_WARNING, "PVRSRVGetCPUFreq: timer frequency = %d Hz", ui32Time2 - ui32Time1)); return (ui32Time2 - ui32Time1); } IMG_VOID PVRSRVSetupMetricTimers(IMG_VOID *pvDevInfo) { IMG_UINT32 ui32Loop; PVR_UNREFERENCED_PARAMETER(pvDevInfo); for(ui32Loop=0; ui32Loop < (PVRSRV_NUM_TIMERS); ui32Loop++) { asTimers[ui32Loop].ui32Total = 0; asTimers[ui32Loop].ui32Count = 0; } #if defined(__sh__) *TCR_2 = TIMER_DIVISOR; *TCOR_2 = *TCNT_2 = (IMG_UINT)0xffffffff; *TST_REG |= (IMG_UINT8)0x04; pui32TimerRegister = (IMG_UINT32 *)TCNT_2; #else pui32TimerRegister = 0; #endif } 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 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