Add MP service for payload

This patch adds a MpServiceLib for payload so that a payload
can utilize this library to run tasks on specified processor.

Signed-off-by: Maurice Ma <maurice.ma@intel.com>
This commit is contained in:
Maurice Ma
2022-03-01 08:16:33 -08:00
parent eb84a4e4de
commit 6eb006beea
10 changed files with 956 additions and 9 deletions

View File

@@ -48,10 +48,21 @@ typedef struct {
CPU_TASK CpuTask[0];
} SYS_CPU_TASK;
typedef struct {
UINT32 ApicId;
} CPU_INFO;
typedef struct {
UINT32 CpuCount;
CPU_INFO CpuInfo[0];
} SYS_CPU_INFO;
typedef struct {
EFI_PHYSICAL_ADDRESS SysCpuTask;
EFI_PHYSICAL_ADDRESS SysCpuInfo;
} SYS_CPU_TASK_HOB;
#pragma pack()
#endif

View File

@@ -408,6 +408,7 @@
AbSupportLib | PayloadPkg/Library/AbSupportLib/AbSupportLib.inf
SblParameterLib | PayloadPkg/Library/SblParameterLib/SblParameterLib.inf
TrustyBootLib | PayloadPkg/Library/TrustyBootLib/TrustyBootLib.inf
MpServiceLib | PayloadPkg/Library/MpServiceLib/MpServiceLib.inf
}
!if $(ENABLE_FWU)

View File

@@ -18,15 +18,6 @@ typedef enum {
EnumMpInitFull = 0xFF
} MP_INIT_PHASE;
typedef struct {
UINT32 ApicId;
} CPU_INFO;
typedef struct {
UINT32 CpuCount;
CPU_INFO CpuInfo[0];
} SYS_CPU_INFO;
typedef VOID (*PLATFORM_CPU_INIT_HOOK) (UINT32 CpuIndex);

View File

@@ -956,6 +956,7 @@ BuildExtraInfoHob (
if (SysCpuTaskHob != NULL) {
SysCpuTaskHob->SysCpuTask = (UINTN) MpGetTask();
SysCpuTaskHob->SysCpuInfo = (UINTN) MpGetInfo();
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,71 @@
/** @file
Copyright (c) 2022, Intel Corporation. All rights reserved.<BR>
SPDX-License-Identifier: BSD-2-Clause-Patent
**/
#ifndef _MP_SERVICE_LIB_H_
#define _MP_SERVICE_LIB_H_
#include <Protocol/MpService.h>
#include <Guid/MpCpuTaskInfoHob.h>
/**
Get processor info pointer for all CPUs.
@retval Pointer to SYS_CPU_INFO structure.
**/
SYS_CPU_INFO *
EFIAPI
GetCpuInfo (
VOID
);
/**
Get processor task pointer for all CPUs.
@retval Pointer to SYS_CPU_TASK structure.
**/
SYS_CPU_TASK *
EFIAPI
GetCpuTask (
VOID
);
/**
Dump processor task running state
This is a debug function to dump current task running state for each
processor.
**/
VOID
EFIAPI
DumpCpuTask (
VOID
);
/**
Run a task function for a specific processor.
@param[in] Index CPU index
@param[in] TaskFunc Task function pointer
@param[in] Argument Argument for the task function
@retval EFI_NOT_FOUND CPU task hob does not exist.
@retval EFI_INVALID_PARAMETER Invalid Index parameter.
@retval EFI_NOT_READY CPU state is not ready for new task yet.
@retval EFI_SUCCESS CPU accepted the new task successfully.
**/
EFI_STATUS
EFIAPI
RunCpuTask (
IN UINT32 Index,
IN CPU_TASK_FUNC TaskFunc,
IN UINT64 Argument
);
#endif

View File

@@ -0,0 +1,160 @@
/** @file
Copyright (c) 2022, Intel Corporation. All rights reserved.<BR>
SPDX-License-Identifier: BSD-2-Clause-Patent
**/
#include <PiPei.h>
#include <Library/BaseLib.h>
#include <Library/BaseMemoryLib.h>
#include <Library/DebugLib.h>
#include <Library/PcdLib.h>
#include <Library/HobLib.h>
#include <Library/MpServiceLib.h>
#include <Library/SynchronizationLib.h>
#include <Library/BootloaderCommonLib.h>
STATIC SYS_CPU_TASK *mSysCpuTask;
STATIC SYS_CPU_INFO *mSysCpuInfo;
/**
Initial global data used by MP service library.
@retval TRUE Global data was successfully initialized.
FALSE Failed to initial global data.
**/
STATIC
BOOLEAN
InitCpuGlobal (
VOID
)
{
UINT8 *GuidHob;
SYS_CPU_TASK_HOB *SysCpuTaskHob;
GuidHob = GetNextGuidHob (&gLoaderMpCpuTaskInfoGuid, GetHobListPtr());
if (GuidHob != NULL) {
SysCpuTaskHob = (SYS_CPU_TASK_HOB *) GET_GUID_HOB_DATA (GuidHob);
mSysCpuTask = (SYS_CPU_TASK *)(UINTN)SysCpuTaskHob->SysCpuTask;
mSysCpuInfo = (SYS_CPU_INFO *)(UINTN)SysCpuTaskHob->SysCpuInfo;
return TRUE;
} else {
return FALSE;
}
}
/**
Get processor info pointer for all CPUs.
@retval Pointer to SYS_CPU_INFO structure.
**/
SYS_CPU_INFO *
EFIAPI
GetCpuInfo (
VOID
)
{
if (mSysCpuInfo == NULL) {
InitCpuGlobal ();
}
return mSysCpuInfo;
}
/**
Get processor task pointer for all CPUs.
@retval Pointer to SYS_CPU_TASK structure.
**/
SYS_CPU_TASK *
EFIAPI
GetCpuTask (
VOID
)
{
if (mSysCpuInfo == NULL) {
InitCpuGlobal ();
}
return mSysCpuTask;
}
/**
Dump processor task running state
This is a debug function to dump current task running state for each
processor.
**/
VOID
EFIAPI
DumpCpuTask (
VOID
)
{
UINT32 Index;
SYS_CPU_TASK *SysCpuTask;
SysCpuTask = GetCpuTask ();
if (SysCpuTask == NULL) {
return;
}
for (Index = 0; Index < SysCpuTask->CpuCount; Index++) {
DEBUG ((DEBUG_INFO, "CPU%02X: %02X %010lX %010lX %010lX\n",
Index,
SysCpuTask->CpuTask[Index].State,
SysCpuTask->CpuTask[Index].TaskFunc,
SysCpuTask->CpuTask[Index].Argument,
SysCpuTask->CpuTask[Index].Result));
}
DEBUG ((DEBUG_INFO, "\n"));
}
/**
Run a task function for a specific processor.
@param[in] Index CPU index
@param[in] TaskFunc Task function pointer
@param[in] Argument Argument for the task function
@retval EFI_NOT_FOUND CPU task hob does not exist.
@retval EFI_INVALID_PARAMETER Invalid Index parameter.
@retval EFI_NOT_READY CPU state is not ready for new task yet.
@retval EFI_SUCCESS CPU accepted the new task successfully.
**/
EFI_STATUS
EFIAPI
RunCpuTask (
IN UINT32 Index,
IN CPU_TASK_FUNC TaskFunc,
IN UINT64 Argument
)
{
SYS_CPU_TASK *SysCpuTask;
SysCpuTask = GetCpuTask ();
if (SysCpuTask == NULL) {
return EFI_NOT_FOUND;
}
if ((Index >= SysCpuTask->CpuCount) || (Index == 0)) {
return EFI_INVALID_PARAMETER;
}
if (SysCpuTask->CpuTask[Index].State != EnumCpuReady) {
return EFI_NOT_READY;
}
SysCpuTask->CpuTask[Index].TaskFunc = (UINT64)(UINTN)TaskFunc;
SysCpuTask->CpuTask[Index].Argument = Argument;
SysCpuTask->CpuTask[Index].State = EnumCpuStart;
return EFI_SUCCESS;
}

View File

@@ -0,0 +1,33 @@
## @file
# An instance to support MP CPU APIs.
#
# Copyright (c) 2022, Intel Corporation. All rights reserved.<BR>
#
# SPDX-License-Identifier: BSD-2-Clause-Patent
#
##
[Defines]
INF_VERSION = 0x00010005
BASE_NAME = MpServiceLib
FILE_GUID = 854BFC39-09C3-41BC-8920-3DB5B5B45FA3
MODULE_TYPE = BASE
VERSION_STRING = 1.0
LIBRARY_CLASS = MpServiceLib
[Sources]
MpServiceLib.c
[LibraryClasses]
[Packages]
MdePkg/MdePkg.dec
PayloadPkg/PayloadPkg.dec
BootloaderCommonPkg/BootloaderCommonPkg.dec
[Guids]
[Pcd]

View File

@@ -47,6 +47,7 @@
#include <Library/UniversalPayloadLib.h>
#include <Library/LinuxLib.h>
#include <Library/ThunkLib.h>
#include <Library/MpServiceLib.h>
#include <Library/ContainerLib.h>
#include <Library/DebugLogBufferLib.h>
#include <Guid/SeedInfoHobGuid.h>

View File

@@ -82,6 +82,9 @@
LinuxLib
ContainerLib
StringSupportLib
LocalApicLib
SynchronizationLib
MpServiceLib
[Guids]
gOsConfigDataGuid
@@ -90,6 +93,7 @@
gBootLoaderVersionGuid
gFlashMapInfoGuid
gSeedListInfoHobGuid
gLoaderMpCpuTaskInfoGuid
[Pcd]
gEfiMdePkgTokenSpaceGuid.PcdPciExpressBaseAddress