From: "Leif Lindholm" <quic_llindhol@quicinc.com>
To: Ard Biesheuvel <ardb@kernel.org>,
Sami Mujawar <sami.mujawar@arm.com>,
Thomas Abraham <thomas.abraham@arm.com>
Cc: <devel@edk2.groups.io>, <quic_rcran@quicinc.com>,
Ard Biesheuvel <ardb+tianocore@kernel.org>,
Rebecca Cran <rebecca@quicinc.com>
Subject: Re: [edk2-devel] [PATCH 1/1] ArmPlatformPkg: Remove AP support from PrePi/PrePeiCore
Date: Fri, 28 Oct 2022 10:17:59 +0100 [thread overview]
Message-ID: <Y1ueR322Bct02bP6@qc-i7.hemma.eciton.net> (raw)
In-Reply-To: <CAMj1kXE6whkKGvb=6C_Yg88UxwbDvdF1cVoiyJQWFw=kyOOwHw@mail.gmail.com>
On Thu, Oct 27, 2022 at 20:10:33 +0200, Ard Biesheuvel wrote:
> On Thu, 27 Oct 2022 at 19:31, Rebecca Cran <quic_rcran@quicinc.com> wrote:
> >
> > Modern platforms use TF-A, so there's no need for support of
> > secondary cores in EDK2 since TF-A will keep them in a holding
> > pen until the PSCI_CPU_ON SMC call is received.
> >
> > Therefore, remove the code that handles secondary CPUs from
> > PrePeiCore and PrePi and add ASSERTs if a secondary core
> > reaches the functions.
> >
> > Signed-off-by: Rebecca Cran <rebecca@quicinc.com>
>
> No objections to this patch, but this change will break the old SMP
> 32-bit ARM platforms in edk2-platforms so you will need to propose a
> solution for those as well.
I think TC2 is the last one of those standing. And I don't see much
value in keeping all of this around for such a niche (and old)
platform. If someone ports TF-A to it, we could always add it back in
later.
Single-core non-PSCI platforms (i.e. beagleboard) aren't affected.
Sami: would you be OK with deleting the TC2 support in edk2-platforms?
/
Leif
> > ---
> > ArmPlatformPkg/PrePeiCore/MainMPCore.c | 92 --------------------
> > ArmPlatformPkg/PrePeiCore/MainUniCore.c | 9 --
> > ArmPlatformPkg/PrePeiCore/PrePeiCore.c | 37 ++++----
> > ArmPlatformPkg/PrePi/MainMPCore.c | 69 ---------------
> > ArmPlatformPkg/PrePi/MainUniCore.c | 9 --
> > ArmPlatformPkg/PrePi/PrePi.c | 36 ++++----
> > 6 files changed, 34 insertions(+), 218 deletions(-)
> >
> > diff --git a/ArmPlatformPkg/PrePeiCore/MainMPCore.c b/ArmPlatformPkg/PrePeiCore/MainMPCore.c
> > index b5d0d3a6442f..44850a4f3946 100644
> > --- a/ArmPlatformPkg/PrePeiCore/MainMPCore.c
> > +++ b/ArmPlatformPkg/PrePeiCore/MainMPCore.c
> > @@ -12,98 +12,6 @@
> >
> > #include "PrePeiCore.h"
> >
> > -/*
> > - * This is the main function for secondary cores. They loop around until a non Null value is written to
> > - * SYS_FLAGS register.The SYS_FLAGS register is platform specific.
> > - * Note:The secondary cores, while executing secondary_main, assumes that:
> > - * : SGI 0 is configured as Non-secure interrupt
> > - * : Priority Mask is configured to allow SGI 0
> > - * : Interrupt Distributor and CPU interfaces are enabled
> > - *
> > - */
> > -VOID
> > -EFIAPI
> > -SecondaryMain (
> > - IN UINTN MpId
> > - )
> > -{
> > - EFI_STATUS Status;
> > - UINTN PpiListSize;
> > - UINTN PpiListCount;
> > - EFI_PEI_PPI_DESCRIPTOR *PpiList;
> > - ARM_MP_CORE_INFO_PPI *ArmMpCoreInfoPpi;
> > - UINTN Index;
> > - UINTN ArmCoreCount;
> > - ARM_CORE_INFO *ArmCoreInfoTable;
> > - UINT32 ClusterId;
> > - UINT32 CoreId;
> > -
> > - VOID (*SecondaryStart)(
> > - VOID
> > - );
> > - UINTN SecondaryEntryAddr;
> > - UINTN AcknowledgeInterrupt;
> > - UINTN InterruptId;
> > -
> > - ClusterId = GET_CLUSTER_ID (MpId);
> > - CoreId = GET_CORE_ID (MpId);
> > -
> > - // Get the gArmMpCoreInfoPpiGuid
> > - PpiListSize = 0;
> > - ArmPlatformGetPlatformPpiList (&PpiListSize, &PpiList);
> > - PpiListCount = PpiListSize / sizeof (EFI_PEI_PPI_DESCRIPTOR);
> > - for (Index = 0; Index < PpiListCount; Index++, PpiList++) {
> > - if (CompareGuid (PpiList->Guid, &gArmMpCoreInfoPpiGuid) == TRUE) {
> > - break;
> > - }
> > - }
> > -
> > - // On MP Core Platform we must implement the ARM MP Core Info PPI
> > - ASSERT (Index != PpiListCount);
> > -
> > - ArmMpCoreInfoPpi = PpiList->Ppi;
> > - ArmCoreCount = 0;
> > - Status = ArmMpCoreInfoPpi->GetMpCoreInfo (&ArmCoreCount, &ArmCoreInfoTable);
> > - ASSERT_EFI_ERROR (Status);
> > -
> > - // Find the core in the ArmCoreTable
> > - for (Index = 0; Index < ArmCoreCount; Index++) {
> > - if ((GET_MPIDR_AFF1 (ArmCoreInfoTable[Index].Mpidr) == ClusterId) &&
> > - (GET_MPIDR_AFF0 (ArmCoreInfoTable[Index].Mpidr) == CoreId))
> > - {
> > - break;
> > - }
> > - }
> > -
> > - // The ARM Core Info Table must define every core
> > - ASSERT (Index != ArmCoreCount);
> > -
> > - // Clear Secondary cores MailBox
> > - MmioWrite32 (ArmCoreInfoTable[Index].MailboxClearAddress, ArmCoreInfoTable[Index].MailboxClearValue);
> > -
> > - do {
> > - ArmCallWFI ();
> > -
> > - // Read the Mailbox
> > - SecondaryEntryAddr = MmioRead32 (ArmCoreInfoTable[Index].MailboxGetAddress);
> > -
> > - // Acknowledge the interrupt and send End of Interrupt signal.
> > - AcknowledgeInterrupt = ArmGicAcknowledgeInterrupt (PcdGet64 (PcdGicInterruptInterfaceBase), &InterruptId);
> > - // Check if it is a valid interrupt ID
> > - if (InterruptId < ArmGicGetMaxNumInterrupts (PcdGet64 (PcdGicDistributorBase))) {
> > - // Got a valid SGI number hence signal End of Interrupt
> > - ArmGicEndOfInterrupt (PcdGet64 (PcdGicInterruptInterfaceBase), AcknowledgeInterrupt);
> > - }
> > - } while (SecondaryEntryAddr == 0);
> > -
> > - // Jump to secondary core entry point.
> > - SecondaryStart = (VOID (*)()) SecondaryEntryAddr;
> > - SecondaryStart ();
> > -
> > - // The secondaries shouldn't reach here
> > - ASSERT (FALSE);
> > -}
> > -
> > VOID
> > EFIAPI
> > PrimaryMain (
> > diff --git a/ArmPlatformPkg/PrePeiCore/MainUniCore.c b/ArmPlatformPkg/PrePeiCore/MainUniCore.c
> > index 1c2580eb923b..3d3c6caaa32a 100644
> > --- a/ArmPlatformPkg/PrePeiCore/MainUniCore.c
> > +++ b/ArmPlatformPkg/PrePeiCore/MainUniCore.c
> > @@ -8,15 +8,6 @@
> >
> > #include "PrePeiCore.h"
> >
> > -VOID
> > -EFIAPI
> > -SecondaryMain (
> > - IN UINTN MpId
> > - )
> > -{
> > - ASSERT (FALSE);
> > -}
> > -
> > VOID
> > EFIAPI
> > PrimaryMain (
> > diff --git a/ArmPlatformPkg/PrePeiCore/PrePeiCore.c b/ArmPlatformPkg/PrePeiCore/PrePeiCore.c
> > index 42a7ccc9c6a0..64d1ef601ea3 100644
> > --- a/ArmPlatformPkg/PrePeiCore/PrePeiCore.c
> > +++ b/ArmPlatformPkg/PrePeiCore/PrePeiCore.c
> > @@ -117,27 +117,26 @@ CEntryPoint (
> >
> > // Note: The MMU will be enabled by MemoryPeim. Only the primary core will have the MMU on.
> >
> > - // If not primary Jump to Secondary Main
> > - if (ArmPlatformIsPrimaryCore (MpId)) {
> > - // Invoke "ProcessLibraryConstructorList" to have all library constructors
> > - // called.
> > - ProcessLibraryConstructorList ();
> > -
> > - PrintFirmwareVersion ();
> > -
> > - // Initialize the Debug Agent for Source Level Debugging
> > - InitializeDebugAgent (DEBUG_AGENT_INIT_POSTMEM_SEC, NULL, NULL);
> > - SaveAndSetDebugTimerInterrupt (TRUE);
> > -
> > - // Initialize the platform specific controllers
> > - ArmPlatformInitialize (MpId);
> > -
> > - // Goto primary Main.
> > - PrimaryMain (PeiCoreEntryPoint);
> > - } else {
> > - SecondaryMain (MpId);
> > + if (!ArmPlatformIsPrimaryCore (MpId)) {
> > + ASSERT (FALSE);
> > }
> >
> > + // Invoke "ProcessLibraryConstructorList" to have all library constructors
> > + // called.
> > + ProcessLibraryConstructorList ();
> > +
> > + PrintFirmwareVersion ();
> > +
> > + // Initialize the Debug Agent for Source Level Debugging
> > + InitializeDebugAgent (DEBUG_AGENT_INIT_POSTMEM_SEC, NULL, NULL);
> > + SaveAndSetDebugTimerInterrupt (TRUE);
> > +
> > + // Initialize the platform specific controllers
> > + ArmPlatformInitialize (MpId);
> > +
> > + // Goto primary Main.
> > + PrimaryMain (PeiCoreEntryPoint);
> > +
> > // PEI Core should always load and never return
> > ASSERT (FALSE);
> > }
> > diff --git a/ArmPlatformPkg/PrePi/MainMPCore.c b/ArmPlatformPkg/PrePi/MainMPCore.c
> > index 68a7c13298d0..ce7058a2846f 100644
> > --- a/ArmPlatformPkg/PrePi/MainMPCore.c
> > +++ b/ArmPlatformPkg/PrePi/MainMPCore.c
> > @@ -33,72 +33,3 @@ PrimaryMain (
> > // We must never return
> > ASSERT (FALSE);
> > }
> > -
> > -VOID
> > -SecondaryMain (
> > - IN UINTN MpId
> > - )
> > -{
> > - EFI_STATUS Status;
> > - ARM_MP_CORE_INFO_PPI *ArmMpCoreInfoPpi;
> > - UINTN Index;
> > - UINTN ArmCoreCount;
> > - ARM_CORE_INFO *ArmCoreInfoTable;
> > - UINT32 ClusterId;
> > - UINT32 CoreId;
> > -
> > - VOID (*SecondaryStart)(
> > - VOID
> > - );
> > - UINTN SecondaryEntryAddr;
> > - UINTN AcknowledgeInterrupt;
> > - UINTN InterruptId;
> > -
> > - ClusterId = GET_CLUSTER_ID (MpId);
> > - CoreId = GET_CORE_ID (MpId);
> > -
> > - // On MP Core Platform we must implement the ARM MP Core Info PPI (gArmMpCoreInfoPpiGuid)
> > - Status = GetPlatformPpi (&gArmMpCoreInfoPpiGuid, (VOID **)&ArmMpCoreInfoPpi);
> > - ASSERT_EFI_ERROR (Status);
> > -
> > - ArmCoreCount = 0;
> > - Status = ArmMpCoreInfoPpi->GetMpCoreInfo (&ArmCoreCount, &ArmCoreInfoTable);
> > - ASSERT_EFI_ERROR (Status);
> > -
> > - // Find the core in the ArmCoreTable
> > - for (Index = 0; Index < ArmCoreCount; Index++) {
> > - if ((GET_MPIDR_AFF1 (ArmCoreInfoTable[Index].Mpidr) == ClusterId) &&
> > - (GET_MPIDR_AFF0 (ArmCoreInfoTable[Index].Mpidr) == CoreId))
> > - {
> > - break;
> > - }
> > - }
> > -
> > - // The ARM Core Info Table must define every core
> > - ASSERT (Index != ArmCoreCount);
> > -
> > - // Clear Secondary cores MailBox
> > - MmioWrite32 (ArmCoreInfoTable[Index].MailboxClearAddress, ArmCoreInfoTable[Index].MailboxClearValue);
> > -
> > - do {
> > - ArmCallWFI ();
> > -
> > - // Read the Mailbox
> > - SecondaryEntryAddr = MmioRead32 (ArmCoreInfoTable[Index].MailboxGetAddress);
> > -
> > - // Acknowledge the interrupt and send End of Interrupt signal.
> > - AcknowledgeInterrupt = ArmGicAcknowledgeInterrupt (PcdGet64 (PcdGicInterruptInterfaceBase), &InterruptId);
> > - // Check if it is a valid interrupt ID
> > - if (InterruptId < ArmGicGetMaxNumInterrupts (PcdGet64 (PcdGicDistributorBase))) {
> > - // Got a valid SGI number hence signal End of Interrupt
> > - ArmGicEndOfInterrupt (PcdGet64 (PcdGicInterruptInterfaceBase), AcknowledgeInterrupt);
> > - }
> > - } while (SecondaryEntryAddr == 0);
> > -
> > - // Jump to secondary core entry point.
> > - SecondaryStart = (VOID (*)()) SecondaryEntryAddr;
> > - SecondaryStart ();
> > -
> > - // The secondaries shouldn't reach here
> > - ASSERT (FALSE);
> > -}
> > diff --git a/ArmPlatformPkg/PrePi/MainUniCore.c b/ArmPlatformPkg/PrePi/MainUniCore.c
> > index 6162d1241f84..7449facacd51 100644
> > --- a/ArmPlatformPkg/PrePi/MainUniCore.c
> > +++ b/ArmPlatformPkg/PrePi/MainUniCore.c
> > @@ -20,12 +20,3 @@ PrimaryMain (
> > // We must never return
> > ASSERT (FALSE);
> > }
> > -
> > -VOID
> > -SecondaryMain (
> > - IN UINTN MpId
> > - )
> > -{
> > - // We must never get into this function on UniCore system
> > - ASSERT (FALSE);
> > -}
> > diff --git a/ArmPlatformPkg/PrePi/PrePi.c b/ArmPlatformPkg/PrePi/PrePi.c
> > index 9b127b94a67c..60061b8b6963 100644
> > --- a/ArmPlatformPkg/PrePi/PrePi.c
> > +++ b/ArmPlatformPkg/PrePi/PrePi.c
> > @@ -177,7 +177,11 @@ CEntryPoint (
> > // Initialize the platform specific controllers
> > ArmPlatformInitialize (MpId);
> >
> > - if (ArmPlatformIsPrimaryCore (MpId) && PerformanceMeasurementEnabled ()) {
> > + if (!ArmPlatformIsPrimaryCore (MpId)) {
> > + ASSERT (FALSE);
> > + }
> > +
> > + if (PerformanceMeasurementEnabled ()) {
> > // Initialize the Timer Library to setup the Timer HW controller
> > TimerConstructor ();
> > // We cannot call yet the PerformanceLib because the HOB List has not been initialized
> > @@ -195,29 +199,21 @@ CEntryPoint (
> >
> > // Define the Global Variable region when we are not running in XIP
> > if (!IS_XIP ()) {
> > - if (ArmPlatformIsPrimaryCore (MpId)) {
> > - if (ArmIsMpCore ()) {
> > - // Signal the Global Variable Region is defined (event: ARM_CPU_EVENT_DEFAULT)
> > - ArmCallSEV ();
> > - }
> > - } else {
> > - // Wait the Primary core has defined the address of the Global Variable region (event: ARM_CPU_EVENT_DEFAULT)
> > - ArmCallWFE ();
> > + if (ArmIsMpCore ()) {
> > + // Signal the Global Variable Region is defined (event: ARM_CPU_EVENT_DEFAULT)
> > + ArmCallSEV ();
> > }
> > }
> >
> > - // If not primary Jump to Secondary Main
> > - if (ArmPlatformIsPrimaryCore (MpId)) {
> > - InvalidateDataCacheRange (
> > - (VOID *)UefiMemoryBase,
> > - FixedPcdGet32 (PcdSystemMemoryUefiRegionSize)
> > - );
> > + InvalidateDataCacheRange (
> > + (VOID *)UefiMemoryBase,
> > + FixedPcdGet32 (PcdSystemMemoryUefiRegionSize)
> > + );
> >
> > - // Goto primary Main.
> > - PrimaryMain (UefiMemoryBase, StacksBase, StartTimeStamp);
> > - } else {
> > - SecondaryMain (MpId);
> > - }
> > + PrePiMain (UefiMemoryBase, StacksBase, StartTimeStamp);
> > +
> > + // We must never return
> > + ASSERT (FALSE);
> >
> > // DXE Core should always load and never return
> > ASSERT (FALSE);
> > --
> > 2.30.2
> >
> >
> >
> >
> >
> >
next prev parent reply other threads:[~2022-10-28 9:18 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-10-27 17:31 [PATCH 1/1] ArmPlatformPkg: Remove AP support from PrePi/PrePeiCore Rebecca Cran
2022-10-27 18:10 ` [edk2-devel] " Ard Biesheuvel
2022-10-28 9:17 ` Leif Lindholm [this message]
2022-11-18 14:09 ` Rebecca Cran
2022-11-24 14:51 ` Sami Mujawar
2022-11-24 14:52 ` Sami Mujawar
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-list from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=Y1ueR322Bct02bP6@qc-i7.hemma.eciton.net \
--to=devel@edk2.groups.io \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox