Home | History | Annotate | Download | only in ArmGenericTimerVirtCounterLib
      1 /** @file
      2 
      3   Copyright (c) 2011 - 2014, ARM Ltd. All rights reserved.<BR>
      4   Copyright (c) 2014, Linaro Ltd. All rights reserved.<BR>
      5 
      6   This program and the accompanying materials
      7   are licensed and made available under the terms and conditions of the BSD License
      8   which accompanies this distribution.  The full text of the license may be found at
      9   http://opensource.org/licenses/bsd-license.php
     10 
     11   THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
     12   WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
     13 
     14 **/
     15 
     16 #include <Library/ArmGenericTimerCounterLib.h>
     17 #include <Library/ArmArchTimer.h>
     18 
     19 VOID
     20 EFIAPI
     21 ArmGenericTimerEnableTimer (
     22   VOID
     23   )
     24 {
     25   UINTN TimerCtrlReg;
     26 
     27   ArmArchTimerReadReg (CntvCtl, (VOID *)&TimerCtrlReg);
     28   TimerCtrlReg |= ARM_ARCH_TIMER_ENABLE;
     29 
     30   //
     31   // When running under KVM, we need to unmask the interrupt on the timer side
     32   // as KVM will mask it when servicing the interrupt at the hypervisor level
     33   // and delivering the virtual timer interrupt to the guest. Otherwise, the
     34   // interrupt will fire again, trapping into the hypervisor again, etc. etc.
     35   // This is scheduled to be fixed on the KVM side, but there is no harm in
     36   // leaving this in once KVM gets fixed.
     37   //
     38   TimerCtrlReg &= ~ARM_ARCH_TIMER_IMASK;
     39   ArmArchTimerWriteReg (CntvCtl, (VOID *)&TimerCtrlReg);
     40 }
     41 
     42 VOID
     43 EFIAPI
     44 ArmGenericTimerDisableTimer (
     45   VOID
     46   )
     47 {
     48   UINTN TimerCtrlReg;
     49 
     50   ArmArchTimerReadReg (CntvCtl, (VOID *)&TimerCtrlReg);
     51   TimerCtrlReg &= ~ARM_ARCH_TIMER_ENABLE;
     52   ArmArchTimerWriteReg (CntvCtl, (VOID *)&TimerCtrlReg);
     53 }
     54 
     55 VOID
     56 EFIAPI
     57 ArmGenericTimerSetTimerFreq (
     58   IN   UINTN  FreqInHz
     59   )
     60 {
     61   ArmArchTimerWriteReg (CntFrq, (VOID *)&FreqInHz);
     62 }
     63 
     64 UINTN
     65 EFIAPI
     66 ArmGenericTimerGetTimerFreq (
     67   VOID
     68   )
     69 {
     70   UINTN ArchTimerFreq = 0;
     71   ArmArchTimerReadReg (CntFrq, (VOID *)&ArchTimerFreq);
     72   return ArchTimerFreq;
     73 }
     74 
     75 UINTN
     76 EFIAPI
     77 ArmGenericTimerGetTimerVal (
     78   VOID
     79   )
     80 {
     81   UINTN ArchTimerValue;
     82   ArmArchTimerReadReg (CntvTval, (VOID *)&ArchTimerValue);
     83 
     84   return ArchTimerValue;
     85 }
     86 
     87 
     88 VOID
     89 EFIAPI
     90 ArmGenericTimerSetTimerVal (
     91   IN   UINTN   Value
     92   )
     93 {
     94   ArmArchTimerWriteReg (CntvTval, (VOID *)&Value);
     95 }
     96 
     97 UINT64
     98 EFIAPI
     99 ArmGenericTimerGetSystemCount (
    100   VOID
    101   )
    102 {
    103   UINT64 SystemCount;
    104   ArmArchTimerReadReg (CntvCt, (VOID *)&SystemCount);
    105 
    106   return SystemCount;
    107 }
    108 
    109 UINTN
    110 EFIAPI
    111 ArmGenericTimerGetTimerCtrlReg (
    112   VOID
    113   )
    114 {
    115   UINTN  Value;
    116   ArmArchTimerReadReg (CntvCtl, (VOID *)&Value);
    117 
    118   return Value;
    119 }
    120 
    121 VOID
    122 EFIAPI
    123 ArmGenericTimerSetTimerCtrlReg (
    124   UINTN Value
    125   )
    126 {
    127   ArmArchTimerWriteReg (CntvCtl, (VOID *)&Value);
    128 }
    129 
    130 UINT64
    131 EFIAPI
    132 ArmGenericTimerGetCompareVal (
    133   VOID
    134   )
    135 {
    136   UINT64  Value;
    137   ArmArchTimerReadReg (CntvCval, (VOID *)&Value);
    138 
    139   return Value;
    140 }
    141 
    142 VOID
    143 EFIAPI
    144 ArmGenericTimerSetCompareVal (
    145   IN   UINT64   Value
    146   )
    147 {
    148   ArmArchTimerWriteReg (CntvCval, (VOID *)&Value);
    149 }
    150