From 336e7e06eb91fee6f87b2559772aed948fb7bbfe Mon Sep 17 00:00:00 2001 From: Chao Li Date: Tue, 21 Jan 2025 14:59:47 +0800 Subject: UefiCpuPkg/CpuMpPei: Add LoongArch64 support Added LoongArch64 CPU multiple processor PPI support. Cc: Ray Ni Cc: Jiaxin Wu Cc: Zhiguang Liu Cc: Dun Tan Cc: Rahul Kumar Cc: Gerd Hoffmann Signed-off-by: Chao Li --- UefiCpuPkg/CpuMpPei/CpuMpPei.inf | 13 +++-- UefiCpuPkg/CpuMpPei/LoongArch64/CpuMpPei.c | 80 ++++++++++++++++++++++++++++++ 2 files changed, 90 insertions(+), 3 deletions(-) create mode 100644 UefiCpuPkg/CpuMpPei/LoongArch64/CpuMpPei.c diff --git a/UefiCpuPkg/CpuMpPei/CpuMpPei.inf b/UefiCpuPkg/CpuMpPei/CpuMpPei.inf index 1f24aa6f2e..93e7eace00 100644 --- a/UefiCpuPkg/CpuMpPei/CpuMpPei.inf +++ b/UefiCpuPkg/CpuMpPei/CpuMpPei.inf @@ -19,17 +19,22 @@ # # The following information is for reference only and not required by the build tools. # -# VALID_ARCHITECTURES = IA32 X64 +# VALID_ARCHITECTURES = IA32 X64 LOONGARCH64 # [Sources] CpuMpPei.h CpuMp.c CpuMp2.c + +[Sources.Ia32, Sources.X64] CpuBist.c CpuPaging.c CpuMpPei.c +[Sources.LoongArch64] + LoongArch64/CpuMpPei.c + [Packages] MdePkg/MdePkg.dec MdeModulePkg/MdeModulePkg.dec @@ -39,16 +44,18 @@ BaseLib DebugLib HobLib - LocalApicLib PeimEntryPoint PeiServicesLib ReportStatusCodeLib - CpuExceptionHandlerLib MpInitLib BaseMemoryLib CpuLib MemoryAllocationLib + +[LibraryClasses.Ia32, LibraryClasses.X64] + CpuExceptionHandlerLib CpuPageTableLib + LocalApicLib [Guids] gEdkiiMigratedFvInfoGuid ## SOMETIMES_CONSUMES ## HOB diff --git a/UefiCpuPkg/CpuMpPei/LoongArch64/CpuMpPei.c b/UefiCpuPkg/CpuMpPei/LoongArch64/CpuMpPei.c new file mode 100644 index 0000000000..705575b339 --- /dev/null +++ b/UefiCpuPkg/CpuMpPei/LoongArch64/CpuMpPei.c @@ -0,0 +1,80 @@ +/** @file + CPU PEI Module installs CPU Multiple Processor PPI. + + Copyright (c) 2015 - 2022, Intel Corporation. All rights reserved.
+ Copyright (c) 2025, Loongson Technology Corporation Limited. All rights reserved.
+ SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include "CpuMpPei.h" + +EFI_PEI_PPI_DESCRIPTOR mPeiCpuMpPpiList[] = { + { + EFI_PEI_PPI_DESCRIPTOR_PPI, + &gEdkiiPeiMpServices2PpiGuid, + &mMpServices2Ppi + }, + { + (EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST), + &gEfiPeiMpServicesPpiGuid, + &mMpServicesPpi + } +}; + +/** + Initializes MP and exceptions handlers. + + @param PeiServices The pointer to the PEI Services Table. + + @retval EFI_SUCCESS MP was successfully initialized. + @retval others Error occurred in MP initialization. + +**/ +EFI_STATUS +InitializeCpuMpWorker ( + IN CONST EFI_PEI_SERVICES **PeiServices + ) +{ + EFI_STATUS Status; + + Status = MpInitLibInitialize (); + if (EFI_ERROR (Status)) { + return Status; + } + + // + // Install CPU MP PPI + // + Status = PeiServicesInstallPpi (mPeiCpuMpPpiList); + ASSERT_EFI_ERROR (Status); + + return Status; +} + +/** + The Entry point of the MP CPU PEIM. + + This function will wakeup APs and collect CPU AP count and install the + Mp Service Ppi. + + @param FileHandle Handle of the file being invoked. + @param PeiServices Describes the list of possible PEI Services. + + @retval EFI_SUCCESS MpServicePpi is installed successfully. + +**/ +EFI_STATUS +EFIAPI +CpuMpPeimInit ( + IN EFI_PEI_FILE_HANDLE FileHandle, + IN CONST EFI_PEI_SERVICES **PeiServices + ) +{ + EFI_STATUS Status; + + Status = InitializeCpuMpWorker ((CONST EFI_PEI_SERVICES **)PeiServices); + ASSERT_EFI_ERROR (Status); + + return Status; +} -- cgit