]> git.proxmox.com Git - mirror_edk2.git/commitdiff
ArmPkg: Replaced gArmTokenSpaceGuid.PcdGicNumInterrupts by ArmGicGetMaxNumInterrupts()
authoroliviermartin <oliviermartin@6f19259b-4bc3-4df7-8a09-765794883524>
Wed, 2 May 2012 19:48:00 +0000 (19:48 +0000)
committeroliviermartin <oliviermartin@6f19259b-4bc3-4df7-8a09-765794883524>
Wed, 2 May 2012 19:48:00 +0000 (19:48 +0000)
The maximum number of interrupts can be retrieve through the GIC distributor.

Signed-off-by: Olivier Martin <olivier.martin@arm.com>
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@13244 6f19259b-4bc3-4df7-8a09-765794883524

ArmPkg/ArmPkg.dec
ArmPkg/Drivers/PL390Gic/PL390Gic.c
ArmPkg/Drivers/PL390Gic/PL390GicDxe.c
ArmPkg/Drivers/PL390Gic/PL390GicDxe.inf
ArmPkg/Drivers/PL390Gic/PL390GicSec.c
ArmPkg/Drivers/PL390Gic/PL390GicSecLib.inf
ArmPkg/Include/Library/ArmGicLib.h
ArmPlatformPkg/ArmRealViewEbPkg/ArmRealViewEb-RTSM-A8.dsc
ArmPlatformPkg/ArmRealViewEbPkg/ArmRealViewEb-RTSM-A9x2.dsc

index dba8928e31b3905429ef22f04deb5ff25333c94e..c41f04ad1a01c2d1e4a63f88ea1574cfb4338791 100644 (file)
@@ -2,7 +2,7 @@
 # ARM processor package.\r
 #\r
 # Copyright (c) 2009 - 2010, Apple Inc. All rights reserved.<BR>\r
-# Copyright (c) 2011, ARM Limited. All rights reserved.\r
+# Copyright (c) 2011-2012, ARM Limited. All rights reserved.\r
 #\r
 #    This program and the accompanying materials\r
 #    are licensed and made available under the terms and conditions of the BSD License\r
@@ -82,7 +82,6 @@
   #\r
   gArmTokenSpaceGuid.PcdGicDistributorBase|0|UINT32|0x0000000C\r
   gArmTokenSpaceGuid.PcdGicInterruptInterfaceBase|0|UINT32|0x0000000D\r
-  gArmTokenSpaceGuid.PcdGicNumInterrupts|96|UINT32|0x00000023\r
   gArmTokenSpaceGuid.PcdGicSgiIntId|0|UINT32|0x00000025\r
 \r
   #\r
index 25daabeb1d0bd722835b4c212664b389b827b806..c559e64a78f4c3bbf9d378c5699c26ebdbb860f9 100644 (file)
@@ -1,6 +1,6 @@
 /** @file\r
 *\r
-*  Copyright (c) 2011, ARM Limited. All rights reserved.\r
+*  Copyright (c) 2011-2012, ARM Limited. All rights reserved.\r
 *  \r
 *  This program and the accompanying materials                          \r
 *  are licensed and made available under the terms and conditions of the BSD License         \r
 #include <Library/ArmGicLib.h>\r
 #include <Library/PcdLib.h>\r
 \r
+UINTN\r
+EFIAPI\r
+ArmGicGetMaxNumInterrupts (\r
+  IN  INTN          GicDistributorBase\r
+  )\r
+{\r
+  return 32 * ((MmioRead32 (GicDistributorBase + ARM_GIC_ICDICTR) & 0x1F) + 1);\r
+}\r
+\r
 VOID\r
 EFIAPI\r
 ArmGicSendSgiTo (\r
index f382431e90cf054afd6bbcd84f26c44fcaacfbfd..74810ec22e381a90b4bb7b3109c360833c2da99a 100644 (file)
@@ -3,6 +3,7 @@
 Copyright (c) 2009, Hewlett-Packard Company. All rights reserved.<BR>
 Portions copyright (c) 2010, Apple Inc. All rights reserved.<BR>
 Portions copyright (c) 2011-2012, 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        
@@ -26,6 +27,7 @@ Abstract:
 #include <Library/BaseLib.h>
 #include <Library/DebugLib.h>
 #include <Library/BaseMemoryLib.h>
+#include <Library/MemoryAllocationLib.h>
 #include <Library/UefiBootServicesTableLib.h>
 #include <Library/UefiLib.h>
 #include <Library/PcdLib.h>
@@ -35,18 +37,6 @@ Abstract:
 #include <Protocol/Cpu.h>
 #include <Protocol/HardwareInterrupt.h>
 
-// number of 32-bit registers needed to represent those interrupts as a bit
-// (used for enable set, enable clear, pending set, pending clear, and active regs)
-#define ARM_GIC_NUM_REG_PER_INT_BITS   (PcdGet32(PcdGicNumInterrupts) / 32)
-
-// number of 32-bit registers needed to represent those interrupts as two bits
-// (used for configuration reg)
-#define ARM_GIC_NUM_REG_PER_INT_CFG    (PcdGet32(PcdGicNumInterrupts) / 16)
-
-// number of 32-bit registers needed to represent interrupts as 8-bit priority field
-// (used for priority regs)
-#define ARM_GIC_NUM_REG_PER_INT_BYTES  (PcdGet32(PcdGicNumInterrupts) / 4)
-
 #define ARM_GIC_DEFAULT_PRIORITY  0x80
 
 extern EFI_HARDWARE_INTERRUPT_PROTOCOL gHardwareInterruptProtocol;
@@ -56,7 +46,10 @@ extern EFI_HARDWARE_INTERRUPT_PROTOCOL gHardwareInterruptProtocol;
 //
 EFI_EVENT EfiExitBootServicesEvent      = (EFI_EVENT)NULL;
 
-HARDWARE_INTERRUPT_HANDLER  gRegisteredInterruptHandlers[FixedPcdGet32(PcdGicNumInterrupts)];
+// Maximum Number of Interrupts
+UINTN mGicNumInterrupts                 = 0;
+
+HARDWARE_INTERRUPT_HANDLER  *gRegisteredInterruptHandlers = NULL;
 
 /**
   Register Handler for the specified interrupt source.
@@ -77,7 +70,7 @@ RegisterInterruptSource (
   IN HARDWARE_INTERRUPT_HANDLER         Handler
   )
 {
-  if (Source > PcdGet32(PcdGicNumInterrupts)) {
+  if (Source > mGicNumInterrupts) {
     ASSERT(FALSE);
     return EFI_UNSUPPORTED;
   }
@@ -120,7 +113,7 @@ EnableInterruptSource (
   UINT32    RegOffset;
   UINTN     RegShift;
   
-  if (Source > PcdGet32(PcdGicNumInterrupts)) {
+  if (Source > mGicNumInterrupts) {
     ASSERT(FALSE);
     return EFI_UNSUPPORTED;
   }
@@ -155,7 +148,7 @@ DisableInterruptSource (
   UINT32    RegOffset;
   UINTN     RegShift;
   
-  if (Source > PcdGet32(PcdGicNumInterrupts)) {
+  if (Source > mGicNumInterrupts) {
     ASSERT(FALSE);
     return EFI_UNSUPPORTED;
   }
@@ -192,7 +185,7 @@ GetInterruptSourceState (
   UINT32    RegOffset;
   UINTN     RegShift;
   
-  if (Source > PcdGet32(PcdGicNumInterrupts)) {
+  if (Source > mGicNumInterrupts) {
     ASSERT(FALSE);
     return EFI_UNSUPPORTED;
   }
@@ -228,7 +221,7 @@ EndOfInterrupt (
   IN HARDWARE_INTERRUPT_SOURCE          Source
   )
 {
-  if (Source > PcdGet32(PcdGicNumInterrupts)) {
+  if (Source > mGicNumInterrupts) {
     ASSERT(FALSE);
     return EFI_UNSUPPORTED;
   }
@@ -261,7 +254,7 @@ IrqInterruptHandler (
   GicInterrupt = MmioRead32 (PcdGet32(PcdGicInterruptInterfaceBase) + ARM_GIC_ICCIAR);
 
   // Special Interrupts (ID1020-ID1023) have an Interrupt ID greater than the number of interrupt (ie: Spurious interrupt).
-  if (GicInterrupt >= PcdGet32(PcdGicNumInterrupts)) {
+  if (GicInterrupt >= mGicNumInterrupts) {
     // The special interrupt do not need to be acknowledge
     return;
   }
@@ -312,11 +305,11 @@ ExitBootServicesEvent (
   UINTN    Index;
   
   // Acknowledge all pending interrupts
-  for (Index = 0; Index < PcdGet32(PcdGicNumInterrupts); Index++) {
+  for (Index = 0; Index < mGicNumInterrupts; Index++) {
     DisableInterruptSource (&gHardwareInterruptProtocol, Index);
   }
 
-  for (Index = 0; Index < PcdGet32(PcdGicNumInterrupts); Index++) {
+  for (Index = 0; Index < mGicNumInterrupts; Index++) {
     EndOfInterrupt (&gHardwareInterruptProtocol, Index);
   }
 
@@ -354,7 +347,9 @@ InterruptDxeInitialize (
   // Make sure the Interrupt Controller Protocol is not already installed in the system.
   ASSERT_PROTOCOL_ALREADY_INSTALLED (NULL, &gHardwareInterruptProtocolGuid);
 
-  for (Index = 0; Index < PcdGet32(PcdGicNumInterrupts); Index++) {
+  mGicNumInterrupts = ArmGicGetMaxNumInterrupts (PcdGet32(PcdGicDistributorBase));
+
+  for (Index = 0; Index < mGicNumInterrupts; Index++) {
     DisableInterruptSource (&gHardwareInterruptProtocol, Index);
     
     // Set Priority 
@@ -368,7 +363,7 @@ InterruptDxeInitialize (
   }
 
   // Configure interrupts for cpu 0
-  for (Index = 0; Index < ARM_GIC_NUM_REG_PER_INT_BYTES; Index++) {
+  for (Index = 0; Index < (mGicNumInterrupts / 4); Index++) {
     MmioWrite32 (PcdGet32(PcdGicDistributorBase) + ARM_GIC_ICDIPTR + (Index*4), 0x01010101);
   }
 
@@ -384,7 +379,8 @@ InterruptDxeInitialize (
   // Enable gic distributor
   MmioWrite32 (PcdGet32(PcdGicDistributorBase) + ARM_GIC_ICDDCR, 0x1);
   
-  ZeroMem (&gRegisteredInterruptHandlers, sizeof (gRegisteredInterruptHandlers));
+  // Initialize the array for the Interrupt Handlers
+  gRegisteredInterruptHandlers = (HARDWARE_INTERRUPT_HANDLER*)AllocateZeroPool (sizeof(HARDWARE_INTERRUPT_HANDLER) * mGicNumInterrupts);
   
   Status = gBS->InstallMultipleProtocolInterfaces (
                   &gHardwareInterruptHandle,
index 48ae8ba82d1dda245012dd7e07e8d16d57b8f528..723931522360e8aa771f51d7d172082214170377 100644 (file)
@@ -1,6 +1,8 @@
 #/** @file
 #  
 #  Copyright (c) 2008 - 2010, Apple Inc. All rights reserved.<BR>
+#  Copyright (c) 2012, 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
@@ -22,6 +24,7 @@
 
 
 [Sources.common]
+  PL390Gic.c
   PL390GicDxe.c
 
 [Packages]
@@ -35,6 +38,7 @@
   UefiBootServicesTableLib
   DebugLib
   PrintLib
+  MemoryAllocationLib
   UefiDriverEntryPoint
   IoLib
 
@@ -45,7 +49,6 @@
 [FixedPcd.common]
   gArmTokenSpaceGuid.PcdGicDistributorBase
   gArmTokenSpaceGuid.PcdGicInterruptInterfaceBase
-  gArmTokenSpaceGuid.PcdGicNumInterrupts
 
 [Depex]
   gEfiCpuArchProtocolGuid
index 12f9e3e3fcacdcc12659173a5a59a88a735bafa8..c137c95f20587951a850ce280b20ead406ca4b08 100644 (file)
@@ -52,7 +52,7 @@ ArmGicSetupNonSecure (
   // Only the primary core should set the Non Secure bit to the SPIs (Shared Peripheral Interrupt).\r
   if (IS_PRIMARY_CORE(MpId)) {\r
     // Ensure all GIC interrupts are Non-Secure\r
-    for (Index = 0; Index < (PcdGet32(PcdGicNumInterrupts) / 32); Index++) {\r
+    for (Index = 0; Index < (ArmGicGetMaxNumInterrupts (GicDistributorBase) / 32); Index++) {\r
       MmioWrite32 (GicDistributorBase + ARM_GIC_ICDISR + (Index * 4), 0xffffffff);\r
     }\r
   } else {\r
@@ -80,7 +80,7 @@ ArmGicSetSecureInterrupts (
   UINT32 InterruptStatus;\r
 \r
   // We must not have more interrupts defined by the mask than the number of available interrupts\r
-  ASSERT(GicSecureInterruptMaskSize <= (PcdGet32(PcdGicNumInterrupts) / 32));\r
+  ASSERT(GicSecureInterruptMaskSize <= (ArmGicGetMaxNumInterrupts (GicDistributorBase) / 32));\r
 \r
   // Set all the interrupts defined by the mask as Secure\r
   for (Index = 0; Index < GicSecureInterruptMaskSize; Index++) {\r
index ff89103393192f21e6e2857cb0bdbcc1201edf19..fbbd38faadf4f39f3c1ce301e6da4da84de4e2a7 100644 (file)
@@ -34,7 +34,6 @@
   PcdLib\r
 \r
 [FixedPcd.common]\r
-  gArmTokenSpaceGuid.PcdGicNumInterrupts\r
   gArmTokenSpaceGuid.PcdGicSgiIntId\r
 \r
   gArmTokenSpaceGuid.PcdArmPrimaryCoreMask\r
index 44cc89c353b64e90796270839d87c8b2393d2c2f..26bd7c626a40adf76609c6863ab8011b1ed9047a 100644 (file)
@@ -102,6 +102,12 @@ ArmGicEnableDistributor (
   IN  INTN          GicDistributorBase\r
   );\r
 \r
+UINTN\r
+EFIAPI\r
+ArmGicGetMaxNumInterrupts (\r
+  IN  INTN          GicDistributorBase\r
+  );\r
+\r
 VOID\r
 EFIAPI\r
 ArmGicSendSgiTo (\r
index d274820b5d00498e335c636d3b6c59c3535de0b7..7bc81867f18894b0626eaf434dc2dfdd592ab542 100644 (file)
@@ -1,5 +1,5 @@
 #\r
-#  Copyright (c) 2011, ARM Limited. All rights reserved.\r
+#  Copyright (c) 2011-2012, ARM Limited. All rights reserved.\r
 #  \r
 #  This program and the accompanying materials                          \r
 #  are licensed and made available under the terms and conditions of the BSD License         \r
   #\r
   gArmTokenSpaceGuid.PcdGicDistributorBase|0x10041000\r
   gArmTokenSpaceGuid.PcdGicInterruptInterfaceBase|0x10040000\r
-  gArmTokenSpaceGuid.PcdGicNumInterrupts|96\r
 \r
   #\r
   # ARM L2x0 PCDs\r
index 195a202d365ab82885d537688469ee8781b01925..eb9f243a46b55ec089a6521292221bd280f3c56e 100644 (file)
   #\r
   gArmTokenSpaceGuid.PcdGicDistributorBase|0x1F001000\r
   gArmTokenSpaceGuid.PcdGicInterruptInterfaceBase|0x1F000100\r
-  gArmTokenSpaceGuid.PcdGicNumInterrupts|96\r
 \r
   #\r
   # ARM L2x0 PCDs\r