diff options
-rw-r--r-- | ArmPkg/Drivers/ArmGicDxe/ArmGicCommonDxe.c | 73 | ||||
-rw-r--r-- | ArmPkg/Drivers/ArmGicDxe/ArmGicDxe.h | 1 | ||||
-rw-r--r-- | ArmPkg/Drivers/ArmGicDxe/ArmGicDxe.inf | 4 | ||||
-rw-r--r-- | ArmPkg/Drivers/ArmGicDxe/ArmGicV2Dxe.inf | 4 | ||||
-rw-r--r-- | ArmPkg/Drivers/ArmGicDxe/ArmGicV3Dxe.inf | 4 |
5 files changed, 20 insertions, 66 deletions
diff --git a/ArmPkg/Drivers/ArmGicDxe/ArmGicCommonDxe.c b/ArmPkg/Drivers/ArmGicDxe/ArmGicCommonDxe.c index 8e845511d6..e777aee468 100644 --- a/ArmPkg/Drivers/ArmGicDxe/ArmGicCommonDxe.c +++ b/ArmPkg/Drivers/ArmGicDxe/ArmGicCommonDxe.c @@ -18,6 +18,7 @@ EFI_EVENT EfiExitBootServicesEvent = (EFI_EVENT)NULL; UINTN mGicNumInterrupts = 0;
HARDWARE_INTERRUPT_HANDLER *gRegisteredInterruptHandlers = NULL;
+EFI_CPU_ARCH_PROTOCOL *gCpuArch;
/**
Calculate GICD_ICFGRn base address and corresponding bit
@@ -98,55 +99,6 @@ RegisterInterruptSource ( }
}
-STATIC VOID *mCpuArchProtocolNotifyEventRegistration;
-
-STATIC
-VOID
-EFIAPI
-CpuArchEventProtocolNotify (
- IN EFI_EVENT Event,
- IN VOID *Context
- )
-{
- EFI_CPU_ARCH_PROTOCOL *Cpu;
- EFI_STATUS Status;
-
- // Get the CPU protocol that this driver requires.
- Status = gBS->LocateProtocol (&gEfiCpuArchProtocolGuid, NULL, (VOID **)&Cpu);
- if (EFI_ERROR (Status)) {
- return;
- }
-
- // Unregister the default exception handler.
- Status = Cpu->RegisterInterruptHandler (Cpu, ARM_ARCH_EXCEPTION_IRQ, NULL);
- if (EFI_ERROR (Status)) {
- DEBUG ((
- DEBUG_ERROR,
- "%a: Cpu->RegisterInterruptHandler() - %r\n",
- __func__,
- Status
- ));
- return;
- }
-
- // Register to receive interrupts
- Status = Cpu->RegisterInterruptHandler (
- Cpu,
- ARM_ARCH_EXCEPTION_IRQ,
- Context
- );
- if (EFI_ERROR (Status)) {
- DEBUG ((
- DEBUG_ERROR,
- "%a: Cpu->RegisterInterruptHandler() - %r\n",
- __func__,
- Status
- ));
- }
-
- gBS->CloseEvent (Event);
-}
-
EFI_STATUS
InstallAndRegisterInterruptService (
IN EFI_HARDWARE_INTERRUPT_PROTOCOL *InterruptProtocol,
@@ -159,12 +111,24 @@ InstallAndRegisterInterruptService ( CONST UINTN RihArraySize =
(sizeof (HARDWARE_INTERRUPT_HANDLER) * mGicNumInterrupts);
+ // Locate the CPU arch protocol - cannot fail because of DEPEX
+ Status = gBS->LocateProtocol (&gEfiCpuArchProtocolGuid, NULL, (VOID **)&gCpuArch);
+ ASSERT_EFI_ERROR (Status);
+
// Initialize the array for the Interrupt Handlers
gRegisteredInterruptHandlers = AllocateZeroPool (RihArraySize);
if (gRegisteredInterruptHandlers == NULL) {
return EFI_OUT_OF_RESOURCES;
}
+ // Register to receive interrupts
+ Status = gCpuArch->RegisterInterruptHandler (gCpuArch, ARM_ARCH_EXCEPTION_IRQ, InterruptHandler);
+ if (EFI_ERROR (Status)) {
+ DEBUG ((DEBUG_ERROR, "%a: Cpu->RegisterInterruptHandler() - %r\n", __func__, Status));
+ FreePool (gRegisteredInterruptHandlers);
+ return Status;
+ }
+
Status = gBS->InstallMultipleProtocolInterfaces (
&gHardwareInterruptHandle,
&gHardwareInterruptProtocolGuid,
@@ -177,17 +141,6 @@ InstallAndRegisterInterruptService ( return Status;
}
- //
- // Install the interrupt handler as soon as the CPU arch protocol appears.
- //
- EfiCreateProtocolNotifyEvent (
- &gEfiCpuArchProtocolGuid,
- TPL_CALLBACK,
- CpuArchEventProtocolNotify,
- InterruptHandler,
- &mCpuArchProtocolNotifyEventRegistration
- );
-
// Register for an ExitBootServicesEvent
Status = gBS->CreateEvent (
EVT_SIGNAL_EXIT_BOOT_SERVICES,
diff --git a/ArmPkg/Drivers/ArmGicDxe/ArmGicDxe.h b/ArmPkg/Drivers/ArmGicDxe/ArmGicDxe.h index 57732661d2..4ae46e7c90 100644 --- a/ArmPkg/Drivers/ArmGicDxe/ArmGicDxe.h +++ b/ArmPkg/Drivers/ArmGicDxe/ArmGicDxe.h @@ -23,6 +23,7 @@ SPDX-License-Identifier: BSD-2-Clause-Patent extern UINTN mGicNumInterrupts;
extern HARDWARE_INTERRUPT_HANDLER *gRegisteredInterruptHandlers;
+extern EFI_CPU_ARCH_PROTOCOL *gCpuArch;
// Common API
EFI_STATUS
diff --git a/ArmPkg/Drivers/ArmGicDxe/ArmGicDxe.inf b/ArmPkg/Drivers/ArmGicDxe/ArmGicDxe.inf index 26cc1b740b..688993b89d 100644 --- a/ArmPkg/Drivers/ArmGicDxe/ArmGicDxe.inf +++ b/ArmPkg/Drivers/ArmGicDxe/ArmGicDxe.inf @@ -51,7 +51,7 @@ [Protocols]
gHardwareInterruptProtocolGuid ## PRODUCES
gHardwareInterrupt2ProtocolGuid ## PRODUCES
- gEfiCpuArchProtocolGuid ## CONSUMES ## NOTIFY
+ gEfiCpuArchProtocolGuid ## CONSUMES
[Pcd.common]
gArmTokenSpaceGuid.PcdGicDistributorBase
@@ -59,4 +59,4 @@ gArmTokenSpaceGuid.PcdGicInterruptInterfaceBase
[Depex]
- TRUE
+ gEfiCpuArchProtocolGuid
diff --git a/ArmPkg/Drivers/ArmGicDxe/ArmGicV2Dxe.inf b/ArmPkg/Drivers/ArmGicDxe/ArmGicV2Dxe.inf index 21db74c07a..37407f30e9 100644 --- a/ArmPkg/Drivers/ArmGicDxe/ArmGicV2Dxe.inf +++ b/ArmPkg/Drivers/ArmGicDxe/ArmGicV2Dxe.inf @@ -41,11 +41,11 @@ [Protocols]
gHardwareInterruptProtocolGuid ## PRODUCES
gHardwareInterrupt2ProtocolGuid ## PRODUCES
- gEfiCpuArchProtocolGuid ## CONSUMES ## NOTIFY
+ gEfiCpuArchProtocolGuid ## CONSUMES
[Pcd.common]
gArmTokenSpaceGuid.PcdGicDistributorBase
gArmTokenSpaceGuid.PcdGicInterruptInterfaceBase
[Depex]
- TRUE
+ gEfiCpuArchProtocolGuid
diff --git a/ArmPkg/Drivers/ArmGicDxe/ArmGicV3Dxe.inf b/ArmPkg/Drivers/ArmGicDxe/ArmGicV3Dxe.inf index 9136677084..a74018217f 100644 --- a/ArmPkg/Drivers/ArmGicDxe/ArmGicV3Dxe.inf +++ b/ArmPkg/Drivers/ArmGicDxe/ArmGicV3Dxe.inf @@ -47,11 +47,11 @@ [Protocols]
gHardwareInterruptProtocolGuid ## PRODUCES
gHardwareInterrupt2ProtocolGuid ## PRODUCES
- gEfiCpuArchProtocolGuid ## CONSUMES ## NOTIFY
+ gEfiCpuArchProtocolGuid ## CONSUMES
[Pcd.common]
gArmTokenSpaceGuid.PcdGicDistributorBase
gArmTokenSpaceGuid.PcdGicRedistributorsBase
[Depex]
- TRUE
+ gEfiCpuArchProtocolGuid
|