1cece12d3f60fbf6e389e28e32f04c0990676c7acArd Biesheuvel/** @file 2cece12d3f60fbf6e389e28e32f04c0990676c7acArd Biesheuvel 3cece12d3f60fbf6e389e28e32f04c0990676c7acArd Biesheuvel Copyright (c) 2011 - 2014, ARM Ltd. All rights reserved.<BR> 4cece12d3f60fbf6e389e28e32f04c0990676c7acArd Biesheuvel Copyright (c) 2014, Linaro Ltd. All rights reserved.<BR> 5cece12d3f60fbf6e389e28e32f04c0990676c7acArd Biesheuvel 6cece12d3f60fbf6e389e28e32f04c0990676c7acArd Biesheuvel This program and the accompanying materials 7cece12d3f60fbf6e389e28e32f04c0990676c7acArd Biesheuvel are licensed and made available under the terms and conditions of the BSD License 8cece12d3f60fbf6e389e28e32f04c0990676c7acArd Biesheuvel which accompanies this distribution. The full text of the license may be found at 9cece12d3f60fbf6e389e28e32f04c0990676c7acArd Biesheuvel http://opensource.org/licenses/bsd-license.php 10cece12d3f60fbf6e389e28e32f04c0990676c7acArd Biesheuvel 11cece12d3f60fbf6e389e28e32f04c0990676c7acArd Biesheuvel THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, 12cece12d3f60fbf6e389e28e32f04c0990676c7acArd Biesheuvel WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. 13cece12d3f60fbf6e389e28e32f04c0990676c7acArd Biesheuvel 14cece12d3f60fbf6e389e28e32f04c0990676c7acArd Biesheuvel**/ 15cece12d3f60fbf6e389e28e32f04c0990676c7acArd Biesheuvel 16cece12d3f60fbf6e389e28e32f04c0990676c7acArd Biesheuvel#include <Library/ArmGenericTimerCounterLib.h> 17cece12d3f60fbf6e389e28e32f04c0990676c7acArd Biesheuvel#include <Library/ArmArchTimer.h> 18cece12d3f60fbf6e389e28e32f04c0990676c7acArd Biesheuvel 19cece12d3f60fbf6e389e28e32f04c0990676c7acArd BiesheuvelVOID 20cece12d3f60fbf6e389e28e32f04c0990676c7acArd BiesheuvelEFIAPI 21cece12d3f60fbf6e389e28e32f04c0990676c7acArd BiesheuvelArmGenericTimerEnableTimer ( 22cece12d3f60fbf6e389e28e32f04c0990676c7acArd Biesheuvel VOID 23cece12d3f60fbf6e389e28e32f04c0990676c7acArd Biesheuvel ) 24cece12d3f60fbf6e389e28e32f04c0990676c7acArd Biesheuvel{ 25cece12d3f60fbf6e389e28e32f04c0990676c7acArd Biesheuvel UINTN TimerCtrlReg; 26cece12d3f60fbf6e389e28e32f04c0990676c7acArd Biesheuvel 27cece12d3f60fbf6e389e28e32f04c0990676c7acArd Biesheuvel ArmArchTimerReadReg (CntpCtl, (VOID *)&TimerCtrlReg); 28cece12d3f60fbf6e389e28e32f04c0990676c7acArd Biesheuvel TimerCtrlReg |= ARM_ARCH_TIMER_ENABLE; 29cece12d3f60fbf6e389e28e32f04c0990676c7acArd Biesheuvel ArmArchTimerWriteReg (CntpCtl, (VOID *)&TimerCtrlReg); 30cece12d3f60fbf6e389e28e32f04c0990676c7acArd Biesheuvel} 31cece12d3f60fbf6e389e28e32f04c0990676c7acArd Biesheuvel 32cece12d3f60fbf6e389e28e32f04c0990676c7acArd BiesheuvelVOID 33cece12d3f60fbf6e389e28e32f04c0990676c7acArd BiesheuvelEFIAPI 34cece12d3f60fbf6e389e28e32f04c0990676c7acArd BiesheuvelArmGenericTimerDisableTimer ( 35cece12d3f60fbf6e389e28e32f04c0990676c7acArd Biesheuvel VOID 36cece12d3f60fbf6e389e28e32f04c0990676c7acArd Biesheuvel ) 37cece12d3f60fbf6e389e28e32f04c0990676c7acArd Biesheuvel{ 38cece12d3f60fbf6e389e28e32f04c0990676c7acArd Biesheuvel UINTN TimerCtrlReg; 39cece12d3f60fbf6e389e28e32f04c0990676c7acArd Biesheuvel 40cece12d3f60fbf6e389e28e32f04c0990676c7acArd Biesheuvel ArmArchTimerReadReg (CntpCtl, (VOID *)&TimerCtrlReg); 41cece12d3f60fbf6e389e28e32f04c0990676c7acArd Biesheuvel TimerCtrlReg &= ~ARM_ARCH_TIMER_ENABLE; 42cece12d3f60fbf6e389e28e32f04c0990676c7acArd Biesheuvel ArmArchTimerWriteReg (CntpCtl, (VOID *)&TimerCtrlReg); 43cece12d3f60fbf6e389e28e32f04c0990676c7acArd Biesheuvel} 44cece12d3f60fbf6e389e28e32f04c0990676c7acArd Biesheuvel 45cece12d3f60fbf6e389e28e32f04c0990676c7acArd BiesheuvelVOID 46cece12d3f60fbf6e389e28e32f04c0990676c7acArd BiesheuvelEFIAPI 47cece12d3f60fbf6e389e28e32f04c0990676c7acArd BiesheuvelArmGenericTimerSetTimerFreq ( 48cece12d3f60fbf6e389e28e32f04c0990676c7acArd Biesheuvel IN UINTN FreqInHz 49cece12d3f60fbf6e389e28e32f04c0990676c7acArd Biesheuvel ) 50cece12d3f60fbf6e389e28e32f04c0990676c7acArd Biesheuvel{ 51cece12d3f60fbf6e389e28e32f04c0990676c7acArd Biesheuvel ArmArchTimerWriteReg (CntFrq, (VOID *)&FreqInHz); 52cece12d3f60fbf6e389e28e32f04c0990676c7acArd Biesheuvel} 53cece12d3f60fbf6e389e28e32f04c0990676c7acArd Biesheuvel 54cece12d3f60fbf6e389e28e32f04c0990676c7acArd BiesheuvelUINTN 55cece12d3f60fbf6e389e28e32f04c0990676c7acArd BiesheuvelEFIAPI 56cece12d3f60fbf6e389e28e32f04c0990676c7acArd BiesheuvelArmGenericTimerGetTimerFreq ( 57cece12d3f60fbf6e389e28e32f04c0990676c7acArd Biesheuvel VOID 58cece12d3f60fbf6e389e28e32f04c0990676c7acArd Biesheuvel ) 59cece12d3f60fbf6e389e28e32f04c0990676c7acArd Biesheuvel{ 60cece12d3f60fbf6e389e28e32f04c0990676c7acArd Biesheuvel UINTN ArchTimerFreq = 0; 61cece12d3f60fbf6e389e28e32f04c0990676c7acArd Biesheuvel ArmArchTimerReadReg (CntFrq, (VOID *)&ArchTimerFreq); 62cece12d3f60fbf6e389e28e32f04c0990676c7acArd Biesheuvel return ArchTimerFreq; 63cece12d3f60fbf6e389e28e32f04c0990676c7acArd Biesheuvel} 64cece12d3f60fbf6e389e28e32f04c0990676c7acArd Biesheuvel 65cece12d3f60fbf6e389e28e32f04c0990676c7acArd BiesheuvelUINTN 66cece12d3f60fbf6e389e28e32f04c0990676c7acArd BiesheuvelEFIAPI 67cece12d3f60fbf6e389e28e32f04c0990676c7acArd BiesheuvelArmGenericTimerGetTimerVal ( 68cece12d3f60fbf6e389e28e32f04c0990676c7acArd Biesheuvel VOID 69cece12d3f60fbf6e389e28e32f04c0990676c7acArd Biesheuvel ) 70cece12d3f60fbf6e389e28e32f04c0990676c7acArd Biesheuvel{ 71cece12d3f60fbf6e389e28e32f04c0990676c7acArd Biesheuvel UINTN ArchTimerValue; 72cece12d3f60fbf6e389e28e32f04c0990676c7acArd Biesheuvel ArmArchTimerReadReg (CntpTval, (VOID *)&ArchTimerValue); 73cece12d3f60fbf6e389e28e32f04c0990676c7acArd Biesheuvel 74cece12d3f60fbf6e389e28e32f04c0990676c7acArd Biesheuvel return ArchTimerValue; 75cece12d3f60fbf6e389e28e32f04c0990676c7acArd Biesheuvel} 76cece12d3f60fbf6e389e28e32f04c0990676c7acArd Biesheuvel 77cece12d3f60fbf6e389e28e32f04c0990676c7acArd Biesheuvel 78cece12d3f60fbf6e389e28e32f04c0990676c7acArd BiesheuvelVOID 79cece12d3f60fbf6e389e28e32f04c0990676c7acArd BiesheuvelEFIAPI 80cece12d3f60fbf6e389e28e32f04c0990676c7acArd BiesheuvelArmGenericTimerSetTimerVal ( 81cece12d3f60fbf6e389e28e32f04c0990676c7acArd Biesheuvel IN UINTN Value 82cece12d3f60fbf6e389e28e32f04c0990676c7acArd Biesheuvel ) 83cece12d3f60fbf6e389e28e32f04c0990676c7acArd Biesheuvel{ 84cece12d3f60fbf6e389e28e32f04c0990676c7acArd Biesheuvel ArmArchTimerWriteReg (CntpTval, (VOID *)&Value); 85cece12d3f60fbf6e389e28e32f04c0990676c7acArd Biesheuvel} 86cece12d3f60fbf6e389e28e32f04c0990676c7acArd Biesheuvel 87cece12d3f60fbf6e389e28e32f04c0990676c7acArd BiesheuvelUINT64 88cece12d3f60fbf6e389e28e32f04c0990676c7acArd BiesheuvelEFIAPI 89cece12d3f60fbf6e389e28e32f04c0990676c7acArd BiesheuvelArmGenericTimerGetSystemCount ( 90cece12d3f60fbf6e389e28e32f04c0990676c7acArd Biesheuvel VOID 91cece12d3f60fbf6e389e28e32f04c0990676c7acArd Biesheuvel ) 92cece12d3f60fbf6e389e28e32f04c0990676c7acArd Biesheuvel{ 93cece12d3f60fbf6e389e28e32f04c0990676c7acArd Biesheuvel UINT64 SystemCount; 94cece12d3f60fbf6e389e28e32f04c0990676c7acArd Biesheuvel ArmArchTimerReadReg (CntPct, (VOID *)&SystemCount); 95cece12d3f60fbf6e389e28e32f04c0990676c7acArd Biesheuvel 96cece12d3f60fbf6e389e28e32f04c0990676c7acArd Biesheuvel return SystemCount; 97cece12d3f60fbf6e389e28e32f04c0990676c7acArd Biesheuvel} 98cece12d3f60fbf6e389e28e32f04c0990676c7acArd Biesheuvel 99cece12d3f60fbf6e389e28e32f04c0990676c7acArd BiesheuvelUINTN 100cece12d3f60fbf6e389e28e32f04c0990676c7acArd BiesheuvelEFIAPI 101cece12d3f60fbf6e389e28e32f04c0990676c7acArd BiesheuvelArmGenericTimerGetTimerCtrlReg ( 102cece12d3f60fbf6e389e28e32f04c0990676c7acArd Biesheuvel VOID 103cece12d3f60fbf6e389e28e32f04c0990676c7acArd Biesheuvel ) 104cece12d3f60fbf6e389e28e32f04c0990676c7acArd Biesheuvel{ 105cece12d3f60fbf6e389e28e32f04c0990676c7acArd Biesheuvel UINTN Value; 106cece12d3f60fbf6e389e28e32f04c0990676c7acArd Biesheuvel ArmArchTimerReadReg (CntpCtl, (VOID *)&Value); 107cece12d3f60fbf6e389e28e32f04c0990676c7acArd Biesheuvel 108cece12d3f60fbf6e389e28e32f04c0990676c7acArd Biesheuvel return Value; 109cece12d3f60fbf6e389e28e32f04c0990676c7acArd Biesheuvel} 110cece12d3f60fbf6e389e28e32f04c0990676c7acArd Biesheuvel 111cece12d3f60fbf6e389e28e32f04c0990676c7acArd BiesheuvelVOID 112cece12d3f60fbf6e389e28e32f04c0990676c7acArd BiesheuvelEFIAPI 113cece12d3f60fbf6e389e28e32f04c0990676c7acArd BiesheuvelArmGenericTimerSetTimerCtrlReg ( 114cece12d3f60fbf6e389e28e32f04c0990676c7acArd Biesheuvel UINTN Value 115cece12d3f60fbf6e389e28e32f04c0990676c7acArd Biesheuvel ) 116cece12d3f60fbf6e389e28e32f04c0990676c7acArd Biesheuvel{ 117cece12d3f60fbf6e389e28e32f04c0990676c7acArd Biesheuvel ArmArchTimerWriteReg (CntpCtl, (VOID *)&Value); 118cece12d3f60fbf6e389e28e32f04c0990676c7acArd Biesheuvel} 119cece12d3f60fbf6e389e28e32f04c0990676c7acArd Biesheuvel 120cece12d3f60fbf6e389e28e32f04c0990676c7acArd BiesheuvelUINT64 121cece12d3f60fbf6e389e28e32f04c0990676c7acArd BiesheuvelEFIAPI 122cece12d3f60fbf6e389e28e32f04c0990676c7acArd BiesheuvelArmGenericTimerGetCompareVal ( 123cece12d3f60fbf6e389e28e32f04c0990676c7acArd Biesheuvel VOID 124cece12d3f60fbf6e389e28e32f04c0990676c7acArd Biesheuvel ) 125cece12d3f60fbf6e389e28e32f04c0990676c7acArd Biesheuvel{ 126cece12d3f60fbf6e389e28e32f04c0990676c7acArd Biesheuvel UINT64 Value; 127cece12d3f60fbf6e389e28e32f04c0990676c7acArd Biesheuvel ArmArchTimerReadReg (CntpCval, (VOID *)&Value); 128cece12d3f60fbf6e389e28e32f04c0990676c7acArd Biesheuvel 129cece12d3f60fbf6e389e28e32f04c0990676c7acArd Biesheuvel return Value; 130cece12d3f60fbf6e389e28e32f04c0990676c7acArd Biesheuvel} 131cece12d3f60fbf6e389e28e32f04c0990676c7acArd Biesheuvel 132cece12d3f60fbf6e389e28e32f04c0990676c7acArd BiesheuvelVOID 133cece12d3f60fbf6e389e28e32f04c0990676c7acArd BiesheuvelEFIAPI 134cece12d3f60fbf6e389e28e32f04c0990676c7acArd BiesheuvelArmGenericTimerSetCompareVal ( 135cece12d3f60fbf6e389e28e32f04c0990676c7acArd Biesheuvel IN UINT64 Value 136cece12d3f60fbf6e389e28e32f04c0990676c7acArd Biesheuvel ) 137cece12d3f60fbf6e389e28e32f04c0990676c7acArd Biesheuvel{ 138cece12d3f60fbf6e389e28e32f04c0990676c7acArd Biesheuvel ArmArchTimerWriteReg (CntpCval, (VOID *)&Value); 139cece12d3f60fbf6e389e28e32f04c0990676c7acArd Biesheuvel} 140