mirror of
https://github.com/acidanthera/audk.git
synced 2025-07-18 11:14:26 +02:00
REF: https://bugzilla.tianocore.org/show_bug.cgi?id=2698 To enhance FSP silicon initialization flexibility an optional Multi-Phase API is introduced and FSP header needs update for new API offset. Also new SecCore module created for FspMultiPhaseSiInit API New ARCH_UPD introduced for enhancing FSP debug message flexibility now bootloader can pass its own debug handler function pointer and FSP will call the function to handle debug message. To support calling bootloader functions, a FspGlobalData field added to indicate if FSP needs to switch stack when FSP running on separate stack from bootloader. Cc: Maurice Ma <maurice.ma@intel.com> Cc: Nate DeSimone <nathaniel.l.desimone@intel.com> Cc: Star Zeng <star.zeng@intel.com> Signed-off-by: Chasel Chiu <chasel.chiu@intel.com> Reviewed-by: Nate DeSimone <nathaniel.l.desimone@intel.com>
92 lines
2.3 KiB
C
92 lines
2.3 KiB
C
/** @file
|
|
|
|
Copyright (c) 2016 - 2020, Intel Corporation. All rights reserved.<BR>
|
|
SPDX-License-Identifier: BSD-2-Clause-Patent
|
|
|
|
**/
|
|
|
|
#include "SecFsp.h"
|
|
|
|
|
|
/**
|
|
This function check the FSP API calling condition.
|
|
|
|
@param[in] ApiIdx Internal index of the FSP API.
|
|
@param[in] ApiParam Parameter of the FSP API.
|
|
|
|
**/
|
|
EFI_STATUS
|
|
EFIAPI
|
|
FspApiCallingCheck (
|
|
IN UINT8 ApiIdx,
|
|
IN VOID *ApiParam
|
|
)
|
|
{
|
|
EFI_STATUS Status;
|
|
FSP_GLOBAL_DATA *FspData;
|
|
|
|
Status = EFI_SUCCESS;
|
|
FspData = GetFspGlobalDataPointer ();
|
|
|
|
if (ApiIdx == NotifyPhaseApiIndex) {
|
|
//
|
|
// NotifyPhase check
|
|
//
|
|
if ((FspData == NULL) || ((UINT32)FspData == 0xFFFFFFFF)) {
|
|
Status = EFI_UNSUPPORTED;
|
|
} else {
|
|
if (FspData->Signature != FSP_GLOBAL_DATA_SIGNATURE) {
|
|
Status = EFI_UNSUPPORTED;
|
|
}
|
|
}
|
|
} else if (ApiIdx == FspMemoryInitApiIndex) {
|
|
//
|
|
// FspMemoryInit check
|
|
//
|
|
if ((UINT32)FspData != 0xFFFFFFFF) {
|
|
Status = EFI_UNSUPPORTED;
|
|
} else if (EFI_ERROR (FspUpdSignatureCheck (ApiIdx, ApiParam))) {
|
|
Status = EFI_INVALID_PARAMETER;
|
|
}
|
|
} else if (ApiIdx == TempRamExitApiIndex) {
|
|
//
|
|
// TempRamExit check
|
|
//
|
|
if ((FspData == NULL) || ((UINT32)FspData == 0xFFFFFFFF)) {
|
|
Status = EFI_UNSUPPORTED;
|
|
} else {
|
|
if (FspData->Signature != FSP_GLOBAL_DATA_SIGNATURE) {
|
|
Status = EFI_UNSUPPORTED;
|
|
}
|
|
}
|
|
} else if ((ApiIdx == FspSiliconInitApiIndex) || (ApiIdx == FspMultiPhaseSiInitApiIndex)) {
|
|
//
|
|
// FspSiliconInit check
|
|
//
|
|
if ((FspData == NULL) || ((UINT32)FspData == 0xFFFFFFFF)) {
|
|
Status = EFI_UNSUPPORTED;
|
|
} else {
|
|
if (FspData->Signature != FSP_GLOBAL_DATA_SIGNATURE) {
|
|
Status = EFI_UNSUPPORTED;
|
|
} else if (EFI_ERROR (FspUpdSignatureCheck (FspSiliconInitApiIndex, ApiParam))) {
|
|
Status = EFI_INVALID_PARAMETER;
|
|
}
|
|
}
|
|
} else {
|
|
Status = EFI_UNSUPPORTED;
|
|
}
|
|
|
|
if (!EFI_ERROR (Status)) {
|
|
if ((ApiIdx != FspMemoryInitApiIndex)) {
|
|
//
|
|
// For FspMemoryInit, the global data is not valid yet
|
|
// The API index will be updated by SecCore after the global data
|
|
// is initialized
|
|
//
|
|
SetFspApiCallingIndex (ApiIdx);
|
|
}
|
|
}
|
|
|
|
return Status;
|
|
}
|