XenArmGenericTimerVirtCounterLib.c 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. /** @file
  2. Copyright (c) 2011 - 2014, ARM Ltd. All rights reserved.<BR>
  3. Copyright (c) 2014 - 2018, Linaro Ltd. All rights reserved.<BR>
  4. SPDX-License-Identifier: BSD-2-Clause-Patent
  5. **/
  6. #include <Library/ArmGenericTimerCounterLib.h>
  7. #include <Library/ArmLib.h>
  8. VOID
  9. EFIAPI
  10. ArmGenericTimerEnableTimer (
  11. VOID
  12. )
  13. {
  14. UINTN TimerCtrlReg;
  15. TimerCtrlReg = ArmReadCntvCtl ();
  16. TimerCtrlReg |= ARM_ARCH_TIMER_ENABLE;
  17. ArmWriteCntvCtl (TimerCtrlReg);
  18. }
  19. VOID
  20. EFIAPI
  21. ArmGenericTimerReenableTimer (
  22. VOID
  23. )
  24. {
  25. UINTN TimerCtrlReg;
  26. TimerCtrlReg = ArmReadCntvCtl ();
  27. TimerCtrlReg |= ARM_ARCH_TIMER_ENABLE;
  28. //
  29. // When running under Xen, we need to unmask the interrupt on the timer side
  30. // as Xen will mask it when servicing the interrupt at the hypervisor level
  31. // and delivering the virtual timer interrupt to the guest. Otherwise, the
  32. // interrupt will fire again, trapping into the hypervisor again, etc. etc.
  33. //
  34. TimerCtrlReg &= ~ARM_ARCH_TIMER_IMASK;
  35. ArmWriteCntvCtl (TimerCtrlReg);
  36. }
  37. VOID
  38. EFIAPI
  39. ArmGenericTimerDisableTimer (
  40. VOID
  41. )
  42. {
  43. UINTN TimerCtrlReg;
  44. TimerCtrlReg = ArmReadCntvCtl ();
  45. TimerCtrlReg &= ~ARM_ARCH_TIMER_ENABLE;
  46. ArmWriteCntvCtl (TimerCtrlReg);
  47. }
  48. VOID
  49. EFIAPI
  50. ArmGenericTimerSetTimerFreq (
  51. IN UINTN FreqInHz
  52. )
  53. {
  54. ArmWriteCntFrq (FreqInHz);
  55. }
  56. UINTN
  57. EFIAPI
  58. ArmGenericTimerGetTimerFreq (
  59. VOID
  60. )
  61. {
  62. return ArmReadCntFrq ();
  63. }
  64. UINTN
  65. EFIAPI
  66. ArmGenericTimerGetTimerVal (
  67. VOID
  68. )
  69. {
  70. return ArmReadCntvTval ();
  71. }
  72. VOID
  73. EFIAPI
  74. ArmGenericTimerSetTimerVal (
  75. IN UINTN Value
  76. )
  77. {
  78. ArmWriteCntvTval (Value);
  79. }
  80. UINT64
  81. EFIAPI
  82. ArmGenericTimerGetSystemCount (
  83. VOID
  84. )
  85. {
  86. return ArmReadCntvCt ();
  87. }
  88. UINTN
  89. EFIAPI
  90. ArmGenericTimerGetTimerCtrlReg (
  91. VOID
  92. )
  93. {
  94. return ArmReadCntvCtl ();
  95. }
  96. VOID
  97. EFIAPI
  98. ArmGenericTimerSetTimerCtrlReg (
  99. UINTN Value
  100. )
  101. {
  102. ArmWriteCntvCtl (Value);
  103. }
  104. UINT64
  105. EFIAPI
  106. ArmGenericTimerGetCompareVal (
  107. VOID
  108. )
  109. {
  110. return ArmReadCntvCval ();
  111. }
  112. VOID
  113. EFIAPI
  114. ArmGenericTimerSetCompareVal (
  115. IN UINT64 Value
  116. )
  117. {
  118. ArmWriteCntvCval (Value);
  119. }