That's actually what I also had in mind when I saw your Feature PCD and your TimerDxe changes. I was waiting the v6 to get a better understanding of the impact of this new library interface.
My suggestion would be to use this interface and libraries: - ArmPkg/Include/Library/ArmGenericTimerCounterLib.h: Definition of the Generic Timer Counter library interface - ArmPkg/Library/ArmGenericTimerPhyCounterLib: implementation for the Generic Timer Physical Counter - ArmPkg/Library/ArmGenericTimerVirtCounterLib: implementation for the Generic Timer Virtual Counter The ARM ARM refers this timer as the 'Generic Timer'. And the idea is to encapsulate the physical and virtual counters under a same interface - both part of the Generic Timer (controller). The question is should these changes move the Architectural Timer code from ArmLib to these new libraries? I am not sure. If we do so, we might have problems if a EDK2 modules need to access both counter registers. My suggestion would be to: 1) Add Virtual Counter support to ArmLib 2) Introduce the new Generic Timer library interface and library implementations > -----Original Message----- > From: Ard Biesheuvel [mailto:[email protected]] > Sent: 01 September 2014 19:18 > To: Olivier Martin > Cc: Laszlo Ersek; [email protected]; Peter Maydell; > Christoffer Dall; Andrew Jones; Ilias Biris; Leif Lindholm; Michael > Casadevall > Subject: Re: [PATCH v4 01/16] ArmPkg/TimerDxe: allow virtual timer to > be selected > > On 1 September 2014 17:19, Olivier Martin <[email protected]> > wrote: > > I have pushed your patxhes through our CI build to make sure there is > no > > regression. > > The build system raised these errors: > > # Line endings (CRLF): > > - ArmPkg/Library/ArmLib/AArch64/AArch64Lib.inf > > # Trailing space: > > - ArmPkg/Drivers/TimerDxe/TimerDxe.inf > > > > I would prefer you introduce new functions for the Virtual Timer for > > instance: ArmArchTimerEnableVirtTimer(), > > ArmArchTimerDisableVirtTimer(),ArmArchTimerGetVirtTimerVal(), etc > instead of > > using the new Feature PCD. > > That would allow to use both counters (physical & virtual). > > > > Actually, I think the correct way would be to make ArmArchTimerLib > depend on a control library which can be instantiated both in a > physical version and in a virtual version. > So this would mean creating an abstract ArmArchTimerControlLib, and > implementations in ArmPhysArchTimerControlLib and > ArmVirtArchTimerControlLib. > > Do you agree? > > > > ArmLib is a helper library to access architectural registers. > > > >> -----Original Message----- > >> From: Ard Biesheuvel [mailto:[email protected]] > >> Sent: 28 August 2014 15:14 > >> To: [email protected]; Olivier Martin; edk2- > >> [email protected]; [email protected]; > >> [email protected]; [email protected]; > >> [email protected]; [email protected] > >> Cc: Michael Casadevall; Ard Biesheuvel > >> Subject: [PATCH v4 01/16] ArmPkg/TimerDxe: allow virtual timer to be > >> selected > >> > >> From: Michael Casadevall <[email protected]> > >> > >> For virtual machines, the physical architected timer may not be > >> available, > >> so we need to allow the virtual timer to be used instead. > >> > >> Contributed-under: TianoCore Contribution Agreement 1.0 > >> Signed-off-by: Michael Casadevall <[email protected]> > >> Acked-by: Laszlo Ersek <[email protected]> > >> Signed-off-by: Ard Biesheuvel <[email protected]> > >> --- > >> ArmPkg/ArmPkg.dec | 3 + > >> ArmPkg/Drivers/TimerDxe/TimerDxe.c | 6 ++ > >> ArmPkg/Drivers/TimerDxe/TimerDxe.inf | 4 +- > >> ArmPkg/Library/ArmLib/AArch64/AArch64ArchTimer.c | 74 > >> +++++++++++++++++++---- > >> ArmPkg/Library/ArmLib/AArch64/AArch64Lib.inf | 4 ++ > >> ArmPkg/Library/ArmLib/AArch64/AArch64LibPrePi.inf | 3 + > >> ArmPkg/Library/ArmLib/AArch64/AArch64LibSec.inf | 3 + > >> ArmPkg/Library/ArmLib/ArmV7/ArmV7ArchTimer.c | 70 > >> +++++++++++++++++---- > >> ArmPkg/Library/ArmLib/ArmV7/ArmV7Lib.inf | 3 + > >> ArmPkg/Library/ArmLib/ArmV7/ArmV7LibPrePi.inf | 3 + > >> ArmPkg/Library/ArmLib/ArmV7/ArmV7LibSec.inf | 3 + > >> 11 files changed, 151 insertions(+), 25 deletions(-) > >> > >> diff --git a/ArmPkg/ArmPkg.dec b/ArmPkg/ArmPkg.dec > >> index a8ca28fccc82..c2551d7c3307 100644 > >> --- a/ArmPkg/ArmPkg.dec > >> +++ b/ArmPkg/ArmPkg.dec > >> @@ -69,6 +69,9 @@ > >> # Linux (instead of PSCI) > >> gArmTokenSpaceGuid.PcdArmLinuxSpinTable|FALSE|BOOLEAN|0x00000033 > >> > >> + # Whether to use the virtual rather than the physical architected > >> timer > >> + > >> > gArmTokenSpaceGuid.PcdArmArchTimerUseVirtual|FALSE|BOOLEAN|0x0000003F > >> + > >> [PcdsFixedAtBuild.common] > >> gArmTokenSpaceGuid.PcdTrustzoneSupport|FALSE|BOOLEAN|0x00000006 > >> > >> diff --git a/ArmPkg/Drivers/TimerDxe/TimerDxe.c > >> b/ArmPkg/Drivers/TimerDxe/TimerDxe.c > >> index 633876bea6bd..9227be8326b0 100644 > >> --- a/ArmPkg/Drivers/TimerDxe/TimerDxe.c > >> +++ b/ArmPkg/Drivers/TimerDxe/TimerDxe.c > >> @@ -347,6 +347,12 @@ TimerInitialize ( > >> // Note: Because it is not possible to determine the security > state > >> of the > >> // CPU dynamically, we just install interrupt handler for both > sec > >> and non-sec > >> // timer PPI > >> + Status = gInterrupt->RegisterInterruptSource (gInterrupt, > PcdGet32 > >> (PcdArmArchTimerVirtIntrNum), TimerInterruptHandler); > >> + ASSERT_EFI_ERROR (Status); > >> + > >> + Status = gInterrupt->RegisterInterruptSource (gInterrupt, > PcdGet32 > >> (PcdArmArchTimerHypIntrNum), TimerInterruptHandler); > >> + ASSERT_EFI_ERROR (Status); > >> + > >> Status = gInterrupt->RegisterInterruptSource (gInterrupt, > PcdGet32 > >> (PcdArmArchTimerSecIntrNum), TimerInterruptHandler); > >> ASSERT_EFI_ERROR (Status); > >> > >> diff --git a/ArmPkg/Drivers/TimerDxe/TimerDxe.inf > >> b/ArmPkg/Drivers/TimerDxe/TimerDxe.inf > >> index 50477ba42a7a..98b09ba8d203 100644 > >> --- a/ArmPkg/Drivers/TimerDxe/TimerDxe.inf > >> +++ b/ArmPkg/Drivers/TimerDxe/TimerDxe.inf > >> @@ -52,7 +52,9 @@ > >> gEmbeddedTokenSpaceGuid.PcdTimerPeriod > >> gArmTokenSpaceGuid.PcdArmArchTimerSecIntrNum > >> gArmTokenSpaceGuid.PcdArmArchTimerIntrNum > >> - gArmTokenSpaceGuid.PcdArmArchTimerFreqInHz > >> + gArmTokenSpaceGuid.PcdArmArchTimerVirtIntrNum > >> + gArmTokenSpaceGuid.PcdArmArchTimerHypIntrNum > >> + gArmTokenSpaceGuid.PcdArmArchTimerFreqInHz > >> > >> [Depex] > >> gHardwareInterruptProtocolGuid > >> diff --git a/ArmPkg/Library/ArmLib/AArch64/AArch64ArchTimer.c > >> b/ArmPkg/Library/ArmLib/AArch64/AArch64ArchTimer.c > >> index fa4f7c741b15..f7ef69d5d4c1 100644 > >> --- a/ArmPkg/Library/ArmLib/AArch64/AArch64ArchTimer.c > >> +++ b/ArmPkg/Library/ArmLib/AArch64/AArch64ArchTimer.c > >> @@ -175,9 +175,25 @@ ArmArchTimerEnableTimer ( > >> { > >> UINTN TimerCtrlReg; > >> > >> - ArmArchTimerReadReg (CntpCtl, (VOID *)&TimerCtrlReg); > >> - TimerCtrlReg |= ARM_ARCH_TIMER_ENABLE; > >> - ArmArchTimerWriteReg (CntpCtl, (VOID *)&TimerCtrlReg); > >> + if (FeaturePcdGet (PcdArmArchTimerUseVirtual)) { > >> + ArmArchTimerReadReg (CntvCtl, (VOID *)&TimerCtrlReg); > >> + TimerCtrlReg |= ARM_ARCH_TIMER_ENABLE; > >> + > >> + /* > >> + * When running under KVM, we need to unmask the interrupt on > the > >> timer side > >> + * as KVM will mask it when servicing the interrupt at the > >> hypervisor level > >> + * and delivering the virtual timer interrupt to the guest. > >> Otherwise, the > >> + * interrupt will fire again, trapping into the hypervisor > again, > >> etc. etc. > >> + * This is scheduled to be fixed on the KVM side, but there is > no > >> harm in > >> + * leaving this in once KVM gets fixed. > >> + */ > >> + TimerCtrlReg &= ~ARM_ARCH_TIMER_IMASK; > >> + ArmArchTimerWriteReg (CntvCtl, (VOID *)&TimerCtrlReg); > >> + } else { > >> + ArmArchTimerReadReg (CntpCtl, (VOID *)&TimerCtrlReg); > >> + TimerCtrlReg |= ARM_ARCH_TIMER_ENABLE; > >> + ArmArchTimerWriteReg (CntpCtl, (VOID *)&TimerCtrlReg); > >> + } > >> } > >> > >> VOID > >> @@ -188,9 +204,15 @@ ArmArchTimerDisableTimer ( > >> { > >> UINTN TimerCtrlReg; > >> > >> - ArmArchTimerReadReg (CntpCtl, (VOID *)&TimerCtrlReg); > >> - TimerCtrlReg &= ~ARM_ARCH_TIMER_ENABLE; > >> - ArmArchTimerWriteReg (CntpCtl, (VOID *)&TimerCtrlReg); > >> + if (FeaturePcdGet (PcdArmArchTimerUseVirtual)) { > >> + ArmArchTimerReadReg (CntvCtl, (VOID *)&TimerCtrlReg); > >> + TimerCtrlReg &= ~ARM_ARCH_TIMER_ENABLE; > >> + ArmArchTimerWriteReg (CntvCtl, (VOID *)&TimerCtrlReg); > >> + } else { > >> + ArmArchTimerReadReg (CntpCtl, (VOID *)&TimerCtrlReg); > >> + TimerCtrlReg &= ~ARM_ARCH_TIMER_ENABLE; > >> + ArmArchTimerWriteReg (CntpCtl, (VOID *)&TimerCtrlReg); > >> + } > >> } > >> > >> VOID > >> @@ -220,7 +242,12 @@ ArmArchTimerGetTimerVal ( > >> ) > >> { > >> UINTN ArchTimerVal; > >> - ArmArchTimerReadReg (CntpTval, (VOID *)&ArchTimerVal); > >> + if (FeaturePcdGet (PcdArmArchTimerUseVirtual)) { > >> + ArmArchTimerReadReg (CntvTval, (VOID *)&ArchTimerVal); > >> + } else { > >> + ArmArchTimerReadReg (CntpTval, (VOID *)&ArchTimerVal); > >> + } > >> + > >> return ArchTimerVal; > >> } > >> > >> @@ -231,7 +258,11 @@ ArmArchTimerSetTimerVal ( > >> IN UINTN Val > >> ) > >> { > >> - ArmArchTimerWriteReg (CntpTval, (VOID *)&Val); > >> + if (FeaturePcdGet (PcdArmArchTimerUseVirtual)) { > >> + ArmArchTimerWriteReg (CntvTval, (VOID *)&Val); > >> + } else { > >> + ArmArchTimerWriteReg (CntpTval, (VOID *)&Val); > >> + } > >> } > >> > >> UINT64 > >> @@ -241,7 +272,12 @@ ArmArchTimerGetSystemCount ( > >> ) > >> { > >> UINT64 SystemCount; > >> - ArmArchTimerReadReg (CntPct, (VOID *)&SystemCount); > >> + if (FeaturePcdGet (PcdArmArchTimerUseVirtual)) { > >> + ArmArchTimerReadReg (CntvCt, (VOID *)&SystemCount); > >> + } else { > >> + ArmArchTimerReadReg (CntPct, (VOID *)&SystemCount); > >> + } > >> + > >> return SystemCount; > >> } > >> > >> @@ -252,7 +288,13 @@ ArmArchTimerGetTimerCtrlReg ( > >> ) > >> { > >> UINTN Val; > >> - ArmArchTimerReadReg (CntpCtl, (VOID *)&Val); > >> + > >> + if (FeaturePcdGet (PcdArmArchTimerUseVirtual)) { > >> + ArmArchTimerReadReg (CntvCtl, (VOID *)&Val); > >> + } else { > >> + ArmArchTimerReadReg (CntpCtl, (VOID *)&Val); > >> + } > >> + > >> return Val; > >> } > >> > >> @@ -262,7 +304,11 @@ ArmArchTimerSetTimerCtrlReg ( > >> UINTN Val > >> ) > >> { > >> - ArmArchTimerWriteReg (CntpCtl, (VOID *)&Val); > >> + if (FeaturePcdGet (PcdArmArchTimerUseVirtual)) { > >> + ArmArchTimerWriteReg (CntvCtl, (VOID *)&Val); > >> + } else { > >> + ArmArchTimerWriteReg (CntpCtl, (VOID *)&Val); > >> + } > >> } > >> > >> VOID > >> @@ -271,5 +317,9 @@ ArmArchTimerSetCompareVal ( > >> IN UINT64 Val > >> ) > >> { > >> - ArmArchTimerWriteReg (CntpCval, (VOID *)&Val); > >> + if (FeaturePcdGet (PcdArmArchTimerUseVirtual)) { > >> + ArmArchTimerWriteReg (CntvCval, (VOID *)&Val); > >> + } else { > >> + ArmArchTimerWriteReg (CntpCval, (VOID *)&Val); > >> + } > >> } > >> diff --git a/ArmPkg/Library/ArmLib/AArch64/AArch64Lib.inf > >> b/ArmPkg/Library/ArmLib/AArch64/AArch64Lib.inf > >> index e5247848b549..0dc2f26a21b5 100644 > >> --- a/ArmPkg/Library/ArmLib/AArch64/AArch64Lib.inf > >> +++ b/ArmPkg/Library/ArmLib/AArch64/AArch64Lib.inf > >> @@ -42,5 +42,9 @@ > >> [Protocols] > >> gEfiCpuArchProtocolGuid > >> > >> +[FeaturePcd] > >> + gArmTokenSpaceGuid.PcdArmArchTimerUseVirtual > >> + > >> [FixedPcd] > >> gArmTokenSpaceGuid.PcdArmCacheOperationThreshold > >> + > >> diff --git a/ArmPkg/Library/ArmLib/AArch64/AArch64LibPrePi.inf > >> b/ArmPkg/Library/ArmLib/AArch64/AArch64LibPrePi.inf > >> index 3a99e1b713cc..081c6fb66cdc 100644 > >> --- a/ArmPkg/Library/ArmLib/AArch64/AArch64LibPrePi.inf > >> +++ b/ArmPkg/Library/ArmLib/AArch64/AArch64LibPrePi.inf > >> @@ -44,5 +44,8 @@ > >> [Protocols] > >> gEfiCpuArchProtocolGuid > >> > >> +[FeaturePcd] > >> + gArmTokenSpaceGuid.PcdArmArchTimerUseVirtual > >> + > >> [FixedPcd] > >> gArmTokenSpaceGuid.PcdArmCacheOperationThreshold > >> diff --git a/ArmPkg/Library/ArmLib/AArch64/AArch64LibSec.inf > >> b/ArmPkg/Library/ArmLib/AArch64/AArch64LibSec.inf > >> index 57ac694cd733..1210b337b9c7 100644 > >> --- a/ArmPkg/Library/ArmLib/AArch64/AArch64LibSec.inf > >> +++ b/ArmPkg/Library/ArmLib/AArch64/AArch64LibSec.inf > >> @@ -39,5 +39,8 @@ > >> [Protocols] > >> gEfiCpuArchProtocolGuid > >> > >> +[FeaturePcd] > >> + gArmTokenSpaceGuid.PcdArmArchTimerUseVirtual > >> + > >> [FixedPcd] > >> gArmTokenSpaceGuid.PcdArmCacheOperationThreshold > >> diff --git a/ArmPkg/Library/ArmLib/ArmV7/ArmV7ArchTimer.c > >> b/ArmPkg/Library/ArmLib/ArmV7/ArmV7ArchTimer.c > >> index 79083f56b708..150ae60272ca 100644 > >> --- a/ArmPkg/Library/ArmLib/ArmV7/ArmV7ArchTimer.c > >> +++ b/ArmPkg/Library/ArmLib/ArmV7/ArmV7ArchTimer.c > >> @@ -175,9 +175,25 @@ ArmArchTimerEnableTimer ( > >> { > >> UINTN TimerCtrlReg; > >> > >> - ArmArchTimerReadReg (CntpCtl, (VOID *)&TimerCtrlReg); > >> - TimerCtrlReg |= ARM_ARCH_TIMER_ENABLE; > >> - ArmArchTimerWriteReg (CntpCtl, (VOID *)&TimerCtrlReg); > >> + if (FeaturePcdGet (PcdArmArchTimerUseVirtual)) { > >> + ArmArchTimerReadReg (CntvCtl, (VOID *)&TimerCtrlReg); > >> + TimerCtrlReg |= ARM_ARCH_TIMER_ENABLE; > >> + > >> + /* > >> + * When running under KVM, we need to unmask the interrupt on > the > >> timer side > >> + * as KVM will mask it when servicing the interrupt at the > >> hypervisor level > >> + * and delivering the virtual timer interrupt to the guest. > >> Otherwise, the > >> + * interrupt will fire again, trapping into the hypervisor > again, > >> etc. etc. > >> + * This is scheduled to be fixed on the KVM side, but there is > no > >> harm in > >> + * leaving this in once KVM gets fixed. > >> + */ > >> + TimerCtrlReg &= ~ARM_ARCH_TIMER_IMASK; > >> + ArmArchTimerWriteReg (CntvCtl, (VOID *)&TimerCtrlReg); > >> + } else { > >> + ArmArchTimerReadReg (CntpCtl, (VOID *)&TimerCtrlReg); > >> + TimerCtrlReg |= ARM_ARCH_TIMER_ENABLE; > >> + ArmArchTimerWriteReg (CntpCtl, (VOID *)&TimerCtrlReg); > >> + } > >> } > >> > >> VOID > >> @@ -188,9 +204,15 @@ ArmArchTimerDisableTimer ( > >> { > >> UINTN TimerCtrlReg; > >> > >> - ArmArchTimerReadReg (CntpCtl, (VOID *)&TimerCtrlReg); > >> - TimerCtrlReg &= ~ARM_ARCH_TIMER_ENABLE; > >> - ArmArchTimerWriteReg (CntpCtl, (VOID *)&TimerCtrlReg); > >> + if (FeaturePcdGet (PcdArmArchTimerUseVirtual)) { > >> + ArmArchTimerReadReg (CntvCtl, (VOID *)&TimerCtrlReg); > >> + TimerCtrlReg &= ~ARM_ARCH_TIMER_ENABLE; > >> + ArmArchTimerWriteReg (CntvCtl, (VOID *)&TimerCtrlReg); > >> + } else { > >> + ArmArchTimerReadReg (CntpCtl, (VOID *)&TimerCtrlReg); > >> + TimerCtrlReg &= ~ARM_ARCH_TIMER_ENABLE; > >> + ArmArchTimerWriteReg (CntpCtl, (VOID *)&TimerCtrlReg); > >> + } > >> } > >> > >> VOID > >> @@ -220,7 +242,11 @@ ArmArchTimerGetTimerVal ( > >> ) > >> { > >> UINTN ArchTimerVal; > >> - ArmArchTimerReadReg (CntpTval, (VOID *)&ArchTimerVal); > >> + if (FeaturePcdGet (PcdArmArchTimerUseVirtual)) { > >> + ArmArchTimerReadReg (CntvTval, (VOID *)&ArchTimerVal); > >> + } else { > >> + ArmArchTimerReadReg (CntpTval, (VOID *)&ArchTimerVal); > >> + } > >> return ArchTimerVal; > >> } > >> > >> @@ -231,7 +257,11 @@ ArmArchTimerSetTimerVal ( > >> IN UINTN Val > >> ) > >> { > >> - ArmArchTimerWriteReg (CntpTval, (VOID *)&Val); > >> + if (FeaturePcdGet (PcdArmArchTimerUseVirtual)) { > >> + ArmArchTimerWriteReg (CntvTval, (VOID *)&Val); > >> + } else { > >> + ArmArchTimerWriteReg (CntpTval, (VOID *)&Val); > >> + } > >> } > >> > >> UINT64 > >> @@ -241,7 +271,11 @@ ArmArchTimerGetSystemCount ( > >> ) > >> { > >> UINT64 SystemCount; > >> - ArmArchTimerReadReg (CntPct, (VOID *)&SystemCount); > >> + if (FeaturePcdGet (PcdArmArchTimerUseVirtual)) { > >> + ArmArchTimerReadReg (CntvCt, (VOID *)&SystemCount); > >> + } else { > >> + ArmArchTimerReadReg (CntPct, (VOID *)&SystemCount); > >> + } > >> return SystemCount; > >> } > >> > >> @@ -252,7 +286,11 @@ ArmArchTimerGetTimerCtrlReg ( > >> ) > >> { > >> UINTN Val; > >> - ArmArchTimerReadReg (CntpCtl, (VOID *)&Val); > >> + if (FeaturePcdGet (PcdArmArchTimerUseVirtual)) { > >> + ArmArchTimerReadReg (CntvCtl, (VOID *)&Val); > >> + } else { > >> + ArmArchTimerReadReg (CntpCtl, (VOID *)&Val); > >> + } > >> return Val; > >> } > >> > >> @@ -262,7 +300,11 @@ ArmArchTimerSetTimerCtrlReg ( > >> UINTN Val > >> ) > >> { > >> - ArmArchTimerWriteReg (CntpCtl, (VOID *)&Val); > >> + if (FeaturePcdGet (PcdArmArchTimerUseVirtual)) { > >> + ArmArchTimerWriteReg (CntvCtl, (VOID *)&Val); > >> + } else { > >> + ArmArchTimerWriteReg (CntpCtl, (VOID *)&Val); > >> + } > >> } > >> > >> VOID > >> @@ -271,5 +313,9 @@ ArmArchTimerSetCompareVal ( > >> IN UINT64 Val > >> ) > >> { > >> - ArmArchTimerWriteReg (CntpCval, (VOID *)&Val); > >> + if (FeaturePcdGet (PcdArmArchTimerUseVirtual)) { > >> + ArmArchTimerWriteReg (CntvCval, (VOID *)&Val); > >> + } else { > >> + ArmArchTimerWriteReg (CntpCval, (VOID *)&Val); > >> + } > >> } > >> diff --git a/ArmPkg/Library/ArmLib/ArmV7/ArmV7Lib.inf > >> b/ArmPkg/Library/ArmLib/ArmV7/ArmV7Lib.inf > >> index 55c0ec661a81..5fce083fc428 100644 > >> --- a/ArmPkg/Library/ArmLib/ArmV7/ArmV7Lib.inf > >> +++ b/ArmPkg/Library/ArmLib/ArmV7/ArmV7Lib.inf > >> @@ -49,5 +49,8 @@ > >> [Protocols] > >> gEfiCpuArchProtocolGuid > >> > >> +[FeaturePcd] > >> + gArmTokenSpaceGuid.PcdArmArchTimerUseVirtual > >> + > >> [FixedPcd] > >> gArmTokenSpaceGuid.PcdArmCacheOperationThreshold > >> diff --git a/ArmPkg/Library/ArmLib/ArmV7/ArmV7LibPrePi.inf > >> b/ArmPkg/Library/ArmLib/ArmV7/ArmV7LibPrePi.inf > >> index bc403d5613ca..bccd4b1f99bd 100644 > >> --- a/ArmPkg/Library/ArmLib/ArmV7/ArmV7LibPrePi.inf > >> +++ b/ArmPkg/Library/ArmLib/ArmV7/ArmV7LibPrePi.inf > >> @@ -49,5 +49,8 @@ > >> [Protocols] > >> gEfiCpuArchProtocolGuid > >> > >> +[FeaturePcd] > >> + gArmTokenSpaceGuid.PcdArmArchTimerUseVirtual > >> + > >> [FixedPcd] > >> gArmTokenSpaceGuid.PcdArmCacheOperationThreshold > >> diff --git a/ArmPkg/Library/ArmLib/ArmV7/ArmV7LibSec.inf > >> b/ArmPkg/Library/ArmLib/ArmV7/ArmV7LibSec.inf > >> index 4081d1a3e563..5a87b2bc080a 100644 > >> --- a/ArmPkg/Library/ArmLib/ArmV7/ArmV7LibSec.inf > >> +++ b/ArmPkg/Library/ArmLib/ArmV7/ArmV7LibSec.inf > >> @@ -43,5 +43,8 @@ > >> [Protocols] > >> gEfiCpuArchProtocolGuid > >> > >> +[FeaturePcd] > >> + gArmTokenSpaceGuid.PcdArmArchTimerUseVirtual > >> + > >> [FixedPcd] > >> gArmTokenSpaceGuid.PcdArmCacheOperationThreshold > >> -- > >> 1.8.3.2 > >> > > > > > > > > ------------------------------------------------------------------------------ Slashdot TV. Video for Nerds. Stuff that matters. http://tv.slashdot.org/ _______________________________________________ edk2-devel mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/edk2-devel
