summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ArmPkg/Drivers/ArmGicDxe/ArmGicCommonDxe.c73
-rw-r--r--ArmPkg/Drivers/ArmGicDxe/ArmGicDxe.h1
-rw-r--r--ArmPkg/Drivers/ArmGicDxe/ArmGicDxe.inf4
-rw-r--r--ArmPkg/Drivers/ArmGicDxe/ArmGicV2Dxe.inf4
-rw-r--r--ArmPkg/Drivers/ArmGicDxe/ArmGicV3Dxe.inf4
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