/** @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;
}