]> git.proxmox.com Git - mirror_edk2.git/blobdiff - ArmPlatformPkg/PrePi/MainMPCore.c
FatBinPkg: Update EBC/IA32/X64/IPF binaries
[mirror_edk2.git] / ArmPlatformPkg / PrePi / MainMPCore.c
index 8e61be1985b82436fca0b295f12286204ad6f818..bf813730d341aef0bcc65339f92aee49f92b1f04 100644 (file)
@@ -1,6 +1,6 @@
 /** @file\r
 *\r
-*  Copyright (c) 2011, ARM Limited. All rights reserved.\r
+*  Copyright (c) 2011-2014, 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
 #include <Ppi/ArmMpCoreInfo.h>\r
 \r
-EFI_STATUS\r
-GetPlatformPpi (\r
-  IN  EFI_GUID  *PpiGuid,\r
-  OUT VOID      **Ppi\r
-  )\r
-{\r
-  UINTN                   PpiListSize;\r
-  UINTN                   PpiListCount;\r
-  EFI_PEI_PPI_DESCRIPTOR  *PpiList;\r
-  UINTN                   Index;\r
-\r
-  PpiListSize = 0;\r
-  ArmPlatformGetPlatformPpiList (&PpiListSize, &PpiList);\r
-  PpiListCount = PpiListSize / sizeof(EFI_PEI_PPI_DESCRIPTOR);\r
-  for (Index = 0; Index < PpiListCount; Index++, PpiList++) {\r
-    if (CompareGuid (PpiList->Guid, PpiGuid) == TRUE) {\r
-      *Ppi = PpiList->Ppi;\r
-      return EFI_SUCCESS;\r
-    }\r
-  }\r
-\r
-  return EFI_NOT_FOUND;\r
-}\r
-\r
 VOID\r
 PrimaryMain (\r
   IN  UINTN                     UefiMemoryBase,\r
@@ -50,22 +26,13 @@ PrimaryMain (
   IN  UINT64                    StartTimeStamp\r
   )\r
 {\r
-  // On MP Core Platform we must implement the ARM MP Core Info PPI (gArmMpCoreInfoPpiGuid)\r
-  DEBUG_CODE_BEGIN();\r
-    EFI_STATUS              Status;\r
-    ARM_MP_CORE_INFO_PPI    *ArmMpCoreInfoPpi;\r
-\r
-    Status = GetPlatformPpi (&gArmMpCoreInfoPpiGuid, (VOID**)&ArmMpCoreInfoPpi);\r
-    ASSERT_EFI_ERROR (Status);\r
-  DEBUG_CODE_END();\r
-\r
   // Enable the GIC Distributor\r
   ArmGicEnableDistributor(PcdGet32(PcdGicDistributorBase));\r
 \r
-  // In some cases, the secondary cores are waiting for an SGI from the next stage boot loader toresume their initialization\r
+  // In some cases, the secondary cores are waiting for an SGI from the next stage boot loader to resume their initialization\r
   if (!FixedPcdGet32(PcdSendSgiToBringUpSecondaryCores)) {\r
     // Sending SGI to all the Secondary CPU interfaces\r
-    ArmGicSendSgiTo (PcdGet32(PcdGicDistributorBase), ARM_GIC_ICDSGIR_FILTER_EVERYONEELSE, 0x0E);\r
+    ArmGicSendSgiTo (PcdGet32(PcdGicDistributorBase), ARM_GIC_ICDSGIR_FILTER_EVERYONEELSE, 0x0E, PcdGet32 (PcdGicSgiIntId));\r
   }\r
 \r
   PrePiMain (UefiMemoryBase, StacksBase, GlobalVariableBase, StartTimeStamp);\r
@@ -88,6 +55,8 @@ SecondaryMain (
   UINT32                  CoreId;\r
   VOID                    (*SecondaryStart)(VOID);\r
   UINTN                   SecondaryEntryAddr;\r
+  UINTN                   AcknowledgeInterrupt;\r
+  UINTN                   InterruptId;\r
 \r
   ClusterId = GET_CLUSTER_ID(MpId);\r
   CoreId    = GET_CORE_ID(MpId);\r
@@ -113,12 +82,20 @@ SecondaryMain (
   // Clear Secondary cores MailBox\r
   MmioWrite32 (ArmCoreInfoTable[Index].MailboxClearAddress, ArmCoreInfoTable[Index].MailboxClearValue);\r
 \r
-  SecondaryEntryAddr = 0;\r
-  while (SecondaryEntryAddr = MmioRead32 (ArmCoreInfoTable[Index].MailboxGetAddress), SecondaryEntryAddr == 0) {\r
+  do {\r
     ArmCallWFI ();\r
+\r
+    // Read the Mailbox\r
+    SecondaryEntryAddr = MmioRead32 (ArmCoreInfoTable[Index].MailboxGetAddress);\r
+\r
     // Acknowledge the interrupt and send End of Interrupt signal.\r
-    ArmGicAcknowledgeSgiFrom (PcdGet32(PcdGicInterruptInterfaceBase), PRIMARY_CORE_ID);\r
-  }\r
+    AcknowledgeInterrupt = ArmGicAcknowledgeInterrupt (PcdGet32 (PcdGicInterruptInterfaceBase), &InterruptId);\r
+    // Check if it is a valid interrupt ID\r
+    if (InterruptId < ArmGicGetMaxNumInterrupts (PcdGet32 (PcdGicDistributorBase))) {\r
+      // Got a valid SGI number hence signal End of Interrupt\r
+      ArmGicEndOfInterrupt (PcdGet32 (PcdGicInterruptInterfaceBase), AcknowledgeInterrupt);\r
+    }\r
+  } while (SecondaryEntryAddr == 0);\r
 \r
   // Jump to secondary core entry point.\r
   SecondaryStart = (VOID (*)())SecondaryEntryAddr;\r