mirror of
https://github.com/acidanthera/audk.git
synced 2025-07-31 01:24:12 +02:00
ArmPkg/ArmGic: Move the installation and the registration to InstallAndRegisterInterruptService()
It will allow reusing the same code for GICv2 and GICv3 only drivers. Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Olivier Martin <olivier.martin@arm.com> git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@15623 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
parent
397bdc990b
commit
69b5dc9f8e
99
ArmPkg/Drivers/ArmGic/ArmGicCommonDxe.c
Normal file
99
ArmPkg/Drivers/ArmGic/ArmGicCommonDxe.c
Normal file
@ -0,0 +1,99 @@
|
|||||||
|
/*++
|
||||||
|
|
||||||
|
Copyright (c) 2013-2014, ARM Ltd. All rights reserved.<BR>
|
||||||
|
|
||||||
|
This program and the accompanying materials
|
||||||
|
are licensed and made available under the terms and conditions of the BSD License
|
||||||
|
which accompanies this distribution. The full text of the license may be found at
|
||||||
|
http://opensource.org/licenses/bsd-license.php
|
||||||
|
|
||||||
|
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
||||||
|
|
||||||
|
--*/
|
||||||
|
|
||||||
|
#include "ArmGicDxe.h"
|
||||||
|
|
||||||
|
VOID
|
||||||
|
EFIAPI
|
||||||
|
IrqInterruptHandler (
|
||||||
|
IN EFI_EXCEPTION_TYPE InterruptType,
|
||||||
|
IN EFI_SYSTEM_CONTEXT SystemContext
|
||||||
|
);
|
||||||
|
|
||||||
|
VOID
|
||||||
|
EFIAPI
|
||||||
|
ExitBootServicesEvent (
|
||||||
|
IN EFI_EVENT Event,
|
||||||
|
IN VOID *Context
|
||||||
|
);
|
||||||
|
|
||||||
|
//
|
||||||
|
// Making this global saves a few bytes in image size
|
||||||
|
//
|
||||||
|
EFI_HANDLE gHardwareInterruptHandle = NULL;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Notifications
|
||||||
|
//
|
||||||
|
EFI_EVENT EfiExitBootServicesEvent = (EFI_EVENT)NULL;
|
||||||
|
|
||||||
|
// Maximum Number of Interrupts
|
||||||
|
UINTN mGicNumInterrupts = 0;
|
||||||
|
|
||||||
|
HARDWARE_INTERRUPT_HANDLER *gRegisteredInterruptHandlers = NULL;
|
||||||
|
|
||||||
|
EFI_STATUS
|
||||||
|
InstallAndRegisterInterruptService (
|
||||||
|
IN EFI_HARDWARE_INTERRUPT_PROTOCOL *InterruptProtocol,
|
||||||
|
IN EFI_CPU_INTERRUPT_HANDLER InterruptHandler,
|
||||||
|
IN EFI_EVENT_NOTIFY ExitBootServicesEvent
|
||||||
|
)
|
||||||
|
{
|
||||||
|
EFI_STATUS Status;
|
||||||
|
EFI_CPU_ARCH_PROTOCOL *Cpu;
|
||||||
|
|
||||||
|
// Initialize the array for the Interrupt Handlers
|
||||||
|
gRegisteredInterruptHandlers = (HARDWARE_INTERRUPT_HANDLER*)AllocateZeroPool (sizeof(HARDWARE_INTERRUPT_HANDLER) * mGicNumInterrupts);
|
||||||
|
if (gRegisteredInterruptHandlers == NULL) {
|
||||||
|
return EFI_OUT_OF_RESOURCES;
|
||||||
|
}
|
||||||
|
|
||||||
|
Status = gBS->InstallMultipleProtocolInterfaces (
|
||||||
|
&gHardwareInterruptHandle,
|
||||||
|
&gHardwareInterruptProtocolGuid, InterruptProtocol,
|
||||||
|
NULL
|
||||||
|
);
|
||||||
|
if (EFI_ERROR (Status)) {
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Get the CPU protocol that this driver requires.
|
||||||
|
//
|
||||||
|
Status = gBS->LocateProtocol (&gEfiCpuArchProtocolGuid, NULL, (VOID **)&Cpu);
|
||||||
|
if (EFI_ERROR (Status)) {
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Unregister the default exception handler.
|
||||||
|
//
|
||||||
|
Status = Cpu->RegisterInterruptHandler (Cpu, ARM_ARCH_EXCEPTION_IRQ, NULL);
|
||||||
|
if (EFI_ERROR (Status)) {
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Register to receive interrupts
|
||||||
|
//
|
||||||
|
Status = Cpu->RegisterInterruptHandler (Cpu, ARM_ARCH_EXCEPTION_IRQ, InterruptHandler);
|
||||||
|
if (EFI_ERROR (Status)) {
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Register for an ExitBootServicesEvent
|
||||||
|
Status = gBS->CreateEvent (EVT_SIGNAL_EXIT_BOOT_SERVICES, TPL_NOTIFY, ExitBootServicesEvent, NULL, &EfiExitBootServicesEvent);
|
||||||
|
|
||||||
|
return Status;
|
||||||
|
}
|
@ -24,34 +24,19 @@ Abstract:
|
|||||||
|
|
||||||
#include <PiDxe.h>
|
#include <PiDxe.h>
|
||||||
|
|
||||||
#include <Library/ArmLib.h>
|
|
||||||
#include <Library/BaseLib.h>
|
#include <Library/BaseLib.h>
|
||||||
#include <Library/DebugLib.h>
|
|
||||||
#include <Library/BaseMemoryLib.h>
|
#include <Library/BaseMemoryLib.h>
|
||||||
#include <Library/MemoryAllocationLib.h>
|
|
||||||
#include <Library/UefiBootServicesTableLib.h>
|
|
||||||
#include <Library/UefiLib.h>
|
#include <Library/UefiLib.h>
|
||||||
#include <Library/PcdLib.h>
|
#include <Library/PcdLib.h>
|
||||||
#include <Library/IoLib.h>
|
#include <Library/IoLib.h>
|
||||||
#include <Library/ArmGicLib.h>
|
#include <Library/ArmGicLib.h>
|
||||||
|
|
||||||
#include <Protocol/Cpu.h>
|
#include "ArmGicDxe.h"
|
||||||
#include <Protocol/HardwareInterrupt.h>
|
|
||||||
|
|
||||||
#define ARM_GIC_DEFAULT_PRIORITY 0x80
|
#define ARM_GIC_DEFAULT_PRIORITY 0x80
|
||||||
|
|
||||||
extern EFI_HARDWARE_INTERRUPT_PROTOCOL gHardwareInterruptProtocol;
|
extern EFI_HARDWARE_INTERRUPT_PROTOCOL gHardwareInterruptProtocol;
|
||||||
|
|
||||||
//
|
|
||||||
// Notifications
|
|
||||||
//
|
|
||||||
EFI_EVENT EfiExitBootServicesEvent = (EFI_EVENT)NULL;
|
|
||||||
|
|
||||||
// Maximum Number of Interrupts
|
|
||||||
UINTN mGicNumInterrupts = 0;
|
|
||||||
|
|
||||||
HARDWARE_INTERRUPT_HANDLER *gRegisteredInterruptHandlers = NULL;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Register Handler for the specified interrupt source.
|
Register Handler for the specified interrupt source.
|
||||||
|
|
||||||
@ -244,11 +229,6 @@ IrqInterruptHandler (
|
|||||||
EndOfInterrupt (&gHardwareInterruptProtocol, GicInterrupt);
|
EndOfInterrupt (&gHardwareInterruptProtocol, GicInterrupt);
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
|
||||||
// Making this global saves a few bytes in image size
|
|
||||||
//
|
|
||||||
EFI_HANDLE gHardwareInterruptHandle = NULL;
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// The protocol instance produced by this driver
|
// The protocol instance produced by this driver
|
||||||
//
|
//
|
||||||
@ -315,7 +295,6 @@ InterruptDxeInitialize (
|
|||||||
UINTN Index;
|
UINTN Index;
|
||||||
UINT32 RegOffset;
|
UINT32 RegOffset;
|
||||||
UINTN RegShift;
|
UINTN RegShift;
|
||||||
EFI_CPU_ARCH_PROTOCOL *Cpu;
|
|
||||||
UINT32 CpuTarget;
|
UINT32 CpuTarget;
|
||||||
|
|
||||||
// Make sure the Interrupt Controller Protocol is not already installed in the system.
|
// Make sure the Interrupt Controller Protocol is not already installed in the system.
|
||||||
@ -370,37 +349,8 @@ InterruptDxeInitialize (
|
|||||||
// Enable gic distributor
|
// Enable gic distributor
|
||||||
ArmGicEnableDistributor (PcdGet32(PcdGicDistributorBase));
|
ArmGicEnableDistributor (PcdGet32(PcdGicDistributorBase));
|
||||||
|
|
||||||
// Initialize the array for the Interrupt Handlers
|
Status = InstallAndRegisterInterruptService (
|
||||||
gRegisteredInterruptHandlers = (HARDWARE_INTERRUPT_HANDLER*)AllocateZeroPool (sizeof(HARDWARE_INTERRUPT_HANDLER) * mGicNumInterrupts);
|
&gHardwareInterruptProtocol, IrqInterruptHandler, ExitBootServicesEvent);
|
||||||
|
|
||||||
Status = gBS->InstallMultipleProtocolInterfaces (
|
|
||||||
&gHardwareInterruptHandle,
|
|
||||||
&gHardwareInterruptProtocolGuid, &gHardwareInterruptProtocol,
|
|
||||||
NULL
|
|
||||||
);
|
|
||||||
ASSERT_EFI_ERROR (Status);
|
|
||||||
|
|
||||||
//
|
|
||||||
// Get the CPU protocol that this driver requires.
|
|
||||||
//
|
|
||||||
Status = gBS->LocateProtocol(&gEfiCpuArchProtocolGuid, NULL, (VOID **)&Cpu);
|
|
||||||
ASSERT_EFI_ERROR(Status);
|
|
||||||
|
|
||||||
//
|
|
||||||
// Unregister the default exception handler.
|
|
||||||
//
|
|
||||||
Status = Cpu->RegisterInterruptHandler(Cpu, ARM_ARCH_EXCEPTION_IRQ, NULL);
|
|
||||||
ASSERT_EFI_ERROR(Status);
|
|
||||||
|
|
||||||
//
|
|
||||||
// Register to receive interrupts
|
|
||||||
//
|
|
||||||
Status = Cpu->RegisterInterruptHandler(Cpu, ARM_ARCH_EXCEPTION_IRQ, IrqInterruptHandler);
|
|
||||||
ASSERT_EFI_ERROR(Status);
|
|
||||||
|
|
||||||
// Register for an ExitBootServicesEvent
|
|
||||||
Status = gBS->CreateEvent (EVT_SIGNAL_EXIT_BOOT_SERVICES, TPL_NOTIFY, ExitBootServicesEvent, NULL, &EfiExitBootServicesEvent);
|
|
||||||
ASSERT_EFI_ERROR (Status);
|
|
||||||
|
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
39
ArmPkg/Drivers/ArmGic/ArmGicDxe.h
Normal file
39
ArmPkg/Drivers/ArmGic/ArmGicDxe.h
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
/*++
|
||||||
|
|
||||||
|
Copyright (c) 2013-2014, ARM Ltd. All rights reserved.<BR>
|
||||||
|
|
||||||
|
This program and the accompanying materials
|
||||||
|
are licensed and made available under the terms and conditions of the BSD License
|
||||||
|
which accompanies this distribution. The full text of the license may be found at
|
||||||
|
http://opensource.org/licenses/bsd-license.php
|
||||||
|
|
||||||
|
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
||||||
|
|
||||||
|
--*/
|
||||||
|
|
||||||
|
#ifndef __ARM_GIC_DXE_H__
|
||||||
|
#define __ARM_GIC_DXE_H__
|
||||||
|
|
||||||
|
#include <Library/ArmLib.h>
|
||||||
|
#include <Library/DebugLib.h>
|
||||||
|
#include <Library/MemoryAllocationLib.h>
|
||||||
|
#include <Library/UefiBootServicesTableLib.h>
|
||||||
|
|
||||||
|
#include <Protocol/Cpu.h>
|
||||||
|
#include <Protocol/HardwareInterrupt.h>
|
||||||
|
|
||||||
|
extern UINTN mGicNumInterrupts;
|
||||||
|
extern HARDWARE_INTERRUPT_HANDLER *gRegisteredInterruptHandlers;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Common API
|
||||||
|
//
|
||||||
|
EFI_STATUS
|
||||||
|
InstallAndRegisterInterruptService (
|
||||||
|
IN EFI_HARDWARE_INTERRUPT_PROTOCOL *InterruptProtocol,
|
||||||
|
IN EFI_CPU_INTERRUPT_HANDLER InterruptHandler,
|
||||||
|
IN EFI_EVENT_NOTIFY ExitBootServicesEvent
|
||||||
|
);
|
||||||
|
|
||||||
|
#endif
|
@ -24,6 +24,7 @@
|
|||||||
|
|
||||||
[Sources.common]
|
[Sources.common]
|
||||||
ArmGicDxe.c
|
ArmGicDxe.c
|
||||||
|
ArmGicCommonDxe.c
|
||||||
|
|
||||||
[Packages]
|
[Packages]
|
||||||
MdePkg/MdePkg.dec
|
MdePkg/MdePkg.dec
|
||||||
|
Loading…
x
Reference in New Issue
Block a user