ArmVirtPkg: handle virtual EL2 timer in DT

FEAT_VHE, introduced in ARMv8.1, adds a virtual EL2 timer.
However, this library verifies that exactly 3 or 4 12-byte timer
interrupts are provided in input DT, ASSERTing when the new timer
is added.

Change the assert to >= 36.

Extend the current logic, also initializing PcdArmArchTimerHypVirtIntrNum
if 5 interrupts are provided.

Signed-off-by: Leif Lindholm <quic_llindhol@quicinc.com>
Reported-by: Peter Maydell <peter.maydell@linaro.org>
Cc: Ard Biesheuvel <ardb+tianocore@kernel.org>
Cc: Sami Mujawar <sami.mujawar@arm.com>
Reviewed-by: Ard Biesheuvel <ardb@kernel.org>
Tested-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
Leif Lindholm 2023-09-19 11:20:25 +01:00 committed by mergify[bot]
parent baee97670f
commit eb485b6438
7 changed files with 14 additions and 3 deletions

View File

@ -178,6 +178,7 @@
gArmTokenSpaceGuid.PcdArmArchTimerIntrNum|0x0 gArmTokenSpaceGuid.PcdArmArchTimerIntrNum|0x0
gArmTokenSpaceGuid.PcdArmArchTimerVirtIntrNum|0x0 gArmTokenSpaceGuid.PcdArmArchTimerVirtIntrNum|0x0
gArmTokenSpaceGuid.PcdArmArchTimerHypIntrNum|0x0 gArmTokenSpaceGuid.PcdArmArchTimerHypIntrNum|0x0
gArmTokenSpaceGuid.PcdArmArchTimerHypVirtIntrNum|0x0
# #
# ARM General Interrupt Controller # ARM General Interrupt Controller

View File

@ -183,6 +183,7 @@
gArmTokenSpaceGuid.PcdArmArchTimerIntrNum|0x0 gArmTokenSpaceGuid.PcdArmArchTimerIntrNum|0x0
gArmTokenSpaceGuid.PcdArmArchTimerVirtIntrNum|0x0 gArmTokenSpaceGuid.PcdArmArchTimerVirtIntrNum|0x0
gArmTokenSpaceGuid.PcdArmArchTimerHypIntrNum|0x0 gArmTokenSpaceGuid.PcdArmArchTimerHypIntrNum|0x0
gArmTokenSpaceGuid.PcdArmArchTimerHypVirtIntrNum|0x0
# #
# ARM General Interrupt Controller # ARM General Interrupt Controller

View File

@ -253,6 +253,7 @@
gArmTokenSpaceGuid.PcdArmArchTimerIntrNum|0x0 gArmTokenSpaceGuid.PcdArmArchTimerIntrNum|0x0
gArmTokenSpaceGuid.PcdArmArchTimerVirtIntrNum|0x0 gArmTokenSpaceGuid.PcdArmArchTimerVirtIntrNum|0x0
gArmTokenSpaceGuid.PcdArmArchTimerHypIntrNum|0x0 gArmTokenSpaceGuid.PcdArmArchTimerHypIntrNum|0x0
gArmTokenSpaceGuid.PcdArmArchTimerHypVirtIntrNum|0x0
# #
# ARM General Interrupt Controller # ARM General Interrupt Controller

View File

@ -214,6 +214,7 @@
gArmTokenSpaceGuid.PcdArmArchTimerIntrNum|0x0 gArmTokenSpaceGuid.PcdArmArchTimerIntrNum|0x0
gArmTokenSpaceGuid.PcdArmArchTimerVirtIntrNum|0x0 gArmTokenSpaceGuid.PcdArmArchTimerVirtIntrNum|0x0
gArmTokenSpaceGuid.PcdArmArchTimerHypIntrNum|0x0 gArmTokenSpaceGuid.PcdArmArchTimerHypIntrNum|0x0
gArmTokenSpaceGuid.PcdArmArchTimerHypVirtIntrNum|0x0
# #
# ARM General Interrupt Controller # ARM General Interrupt Controller

View File

@ -118,6 +118,7 @@
gArmTokenSpaceGuid.PcdArmArchTimerIntrNum|0x0 gArmTokenSpaceGuid.PcdArmArchTimerIntrNum|0x0
gArmTokenSpaceGuid.PcdArmArchTimerVirtIntrNum|0x0 gArmTokenSpaceGuid.PcdArmArchTimerVirtIntrNum|0x0
gArmTokenSpaceGuid.PcdArmArchTimerHypIntrNum|0x0 gArmTokenSpaceGuid.PcdArmArchTimerHypIntrNum|0x0
gArmTokenSpaceGuid.PcdArmArchTimerHypVirtIntrNum|0x0
# #
# ARM General Interrupt Controller # ARM General Interrupt Controller

View File

@ -35,6 +35,7 @@ ArmVirtTimerFdtClientLibConstructor (
CONST INTERRUPT_PROPERTY *InterruptProp; CONST INTERRUPT_PROPERTY *InterruptProp;
UINT32 PropSize; UINT32 PropSize;
INT32 SecIntrNum, IntrNum, VirtIntrNum, HypIntrNum; INT32 SecIntrNum, IntrNum, VirtIntrNum, HypIntrNum;
INT32 HypVirtIntrNum;
RETURN_STATUS PcdStatus; RETURN_STATUS PcdStatus;
Status = gBS->LocateProtocol ( Status = gBS->LocateProtocol (
@ -66,10 +67,10 @@ ArmVirtTimerFdtClientLibConstructor (
} }
// //
// - interrupts : Interrupt list for secure, non-secure, virtual and // - interrupts : Interrupt list for secure, non-secure, virtual,
// hypervisor timers, in that order. // hypervisor and hypervisor virtual timers, in that order.
// //
ASSERT (PropSize == 36 || PropSize == 48); ASSERT (PropSize >= 36);
SecIntrNum = SwapBytes32 (InterruptProp[0].Number) SecIntrNum = SwapBytes32 (InterruptProp[0].Number)
+ (InterruptProp[0].Type ? 16 : 0); + (InterruptProp[0].Type ? 16 : 0);
@ -79,6 +80,8 @@ ArmVirtTimerFdtClientLibConstructor (
+ (InterruptProp[2].Type ? 16 : 0); + (InterruptProp[2].Type ? 16 : 0);
HypIntrNum = PropSize < 48 ? 0 : SwapBytes32 (InterruptProp[3].Number) HypIntrNum = PropSize < 48 ? 0 : SwapBytes32 (InterruptProp[3].Number)
+ (InterruptProp[3].Type ? 16 : 0); + (InterruptProp[3].Type ? 16 : 0);
HypVirtIntrNum = PropSize < 60 ? 0 : SwapBytes32 (InterruptProp[4].Number)
+ (InterruptProp[4].Type ? 16 : 0);
DEBUG (( DEBUG ((
DEBUG_INFO, DEBUG_INFO,
@ -97,6 +100,8 @@ ArmVirtTimerFdtClientLibConstructor (
ASSERT_RETURN_ERROR (PcdStatus); ASSERT_RETURN_ERROR (PcdStatus);
PcdStatus = PcdSet32S (PcdArmArchTimerHypIntrNum, HypIntrNum); PcdStatus = PcdSet32S (PcdArmArchTimerHypIntrNum, HypIntrNum);
ASSERT_RETURN_ERROR (PcdStatus); ASSERT_RETURN_ERROR (PcdStatus);
PcdStatus = PcdSet32S (PcdArmArchTimerHypVirtIntrNum, HypVirtIntrNum);
ASSERT_RETURN_ERROR (PcdStatus);
return EFI_SUCCESS; return EFI_SUCCESS;
} }

View File

@ -40,6 +40,7 @@
gArmTokenSpaceGuid.PcdArmArchTimerIntrNum gArmTokenSpaceGuid.PcdArmArchTimerIntrNum
gArmTokenSpaceGuid.PcdArmArchTimerVirtIntrNum gArmTokenSpaceGuid.PcdArmArchTimerVirtIntrNum
gArmTokenSpaceGuid.PcdArmArchTimerHypIntrNum gArmTokenSpaceGuid.PcdArmArchTimerHypIntrNum
gArmTokenSpaceGuid.PcdArmArchTimerHypVirtIntrNum
[Depex] [Depex]
gFdtClientProtocolGuid gFdtClientProtocolGuid