ArmPkg/ArmGic: Move out the EndOfInterrupt from the interrupt acknowledgement
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@15619 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
committed by
oliviermartin
parent
d80401a16f
commit
2ca815a495
@@ -1,6 +1,6 @@
|
||||
/** @file
|
||||
*
|
||||
* Copyright (c) 2011-2012, ARM Limited. All rights reserved.
|
||||
* Copyright (c) 2011-2013, ARM Limited. All rights reserved.
|
||||
*
|
||||
* This program and the accompanying materials
|
||||
* are licensed and made available under the terms and conditions of the BSD License
|
||||
@@ -38,35 +38,14 @@ ArmGicSendSgiTo (
|
||||
MmioWrite32 (GicDistributorBase + ARM_GIC_ICDSGIR, ((TargetListFilter & 0x3) << 24) | ((CPUTargetList & 0xFF) << 16) | SgiId);
|
||||
}
|
||||
|
||||
RETURN_STATUS
|
||||
UINTN
|
||||
EFIAPI
|
||||
ArmGicAcknowledgeInterrupt (
|
||||
IN UINTN GicDistributorBase,
|
||||
IN UINTN GicInterruptInterfaceBase,
|
||||
OUT UINTN *CoreId,
|
||||
OUT UINTN *InterruptId
|
||||
IN UINTN GicInterruptInterfaceBase
|
||||
)
|
||||
{
|
||||
UINT32 Interrupt;
|
||||
|
||||
// Read the Interrupt Acknowledge Register
|
||||
Interrupt = MmioRead32 (GicInterruptInterfaceBase + ARM_GIC_ICCIAR);
|
||||
|
||||
// Check if it is a valid interrupt ID
|
||||
if ((Interrupt & 0x3FF) < ArmGicGetMaxNumInterrupts (GicDistributorBase)) {
|
||||
// Got a valid SGI number hence signal End of Interrupt by writing to ICCEOIR
|
||||
ArmGicEndOfInterrupt (GicInterruptInterfaceBase, Interrupt);
|
||||
|
||||
if (CoreId) {
|
||||
*CoreId = (Interrupt >> 10) & 0x7;
|
||||
}
|
||||
if (InterruptId) {
|
||||
*InterruptId = Interrupt & 0x3FF;
|
||||
}
|
||||
return RETURN_SUCCESS;
|
||||
} else {
|
||||
return RETURN_INVALID_PARAMETER;
|
||||
}
|
||||
return MmioRead32 (GicInterruptInterfaceBase + ARM_GIC_ICCIAR);
|
||||
}
|
||||
|
||||
VOID
|
||||
|
@@ -252,10 +252,10 @@ IrqInterruptHandler (
|
||||
UINT32 GicInterrupt;
|
||||
HARDWARE_INTERRUPT_HANDLER InterruptHandler;
|
||||
|
||||
GicInterrupt = MmioRead32 (PcdGet32(PcdGicInterruptInterfaceBase) + ARM_GIC_ICCIAR);
|
||||
GicInterrupt = ArmGicAcknowledgeInterrupt (PcdGet32(PcdGicInterruptInterfaceBase));
|
||||
|
||||
// Special Interrupts (ID1020-ID1023) have an Interrupt ID greater than the number of interrupt (ie: Spurious interrupt).
|
||||
if (GicInterrupt >= mGicNumInterrupts) {
|
||||
if ((GicInterrupt & ARM_GIC_ICCIAR_ACKINTID) >= mGicNumInterrupts) {
|
||||
// The special interrupt do not need to be acknowledge
|
||||
return;
|
||||
}
|
||||
|
@@ -1,7 +1,7 @@
|
||||
#/** @file
|
||||
#
|
||||
# Copyright (c) 2008 - 2010, Apple Inc. All rights reserved.<BR>
|
||||
# Copyright (c) 2012, ARM Ltd. All rights reserved.<BR>
|
||||
# Copyright (c) 2012 - 2013, 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
|
||||
|
Reference in New Issue
Block a user