]> git.proxmox.com Git - mirror_edk2.git/blame - IntelFsp2Pkg/FspSecCore/SecFspApiChk.c
IntelFsp2Pkg/FspSecCore: Add FSP-I API for SMM support.
[mirror_edk2.git] / IntelFsp2Pkg / FspSecCore / SecFspApiChk.c
CommitLineData
cf1d4549
JY
1/** @file\r
2\r
630df8c8 3 Copyright (c) 2016 - 2022, Intel Corporation. All rights reserved.<BR>\r
9672cd30 4 SPDX-License-Identifier: BSD-2-Clause-Patent\r
cf1d4549
JY
5\r
6**/\r
7\r
8#include "SecFsp.h"\r
9\r
cf1d4549
JY
10/**\r
11 This function check the FSP API calling condition.\r
12\r
13 @param[in] ApiIdx Internal index of the FSP API.\r
14 @param[in] ApiParam Parameter of the FSP API.\r
15\r
16**/\r
17EFI_STATUS\r
18EFIAPI\r
19FspApiCallingCheck (\r
111f2228
MK
20 IN UINT8 ApiIdx,\r
21 IN VOID *ApiParam\r
cf1d4549
JY
22 )\r
23{\r
111f2228
MK
24 EFI_STATUS Status;\r
25 FSP_GLOBAL_DATA *FspData;\r
cf1d4549 26\r
111f2228 27 Status = EFI_SUCCESS;\r
cf1d4549 28 FspData = GetFspGlobalDataPointer ();\r
e37bb20c 29\r
cf1d4549
JY
30 if (ApiIdx == NotifyPhaseApiIndex) {\r
31 //\r
32 // NotifyPhase check\r
33 //\r
630df8c8 34 if ((FspData == NULL) || ((UINTN)FspData == MAX_ADDRESS) || ((UINTN)FspData == MAX_UINT32)) {\r
cf1d4549
JY
35 Status = EFI_UNSUPPORTED;\r
36 } else {\r
37 if (FspData->Signature != FSP_GLOBAL_DATA_SIGNATURE) {\r
38 Status = EFI_UNSUPPORTED;\r
39 }\r
40 }\r
41 } else if (ApiIdx == FspMemoryInitApiIndex) {\r
42 //\r
43 // FspMemoryInit check\r
44 //\r
630df8c8 45 if (((UINTN)FspData != MAX_ADDRESS) && ((UINTN)FspData != MAX_UINT32)) {\r
cf1d4549
JY
46 Status = EFI_UNSUPPORTED;\r
47 } else if (EFI_ERROR (FspUpdSignatureCheck (ApiIdx, ApiParam))) {\r
48 Status = EFI_INVALID_PARAMETER;\r
49 }\r
50 } else if (ApiIdx == TempRamExitApiIndex) {\r
51 //\r
52 // TempRamExit check\r
53 //\r
630df8c8 54 if ((FspData == NULL) || ((UINTN)FspData == MAX_ADDRESS) || ((UINTN)FspData == MAX_UINT32)) {\r
cf1d4549
JY
55 Status = EFI_UNSUPPORTED;\r
56 } else {\r
57 if (FspData->Signature != FSP_GLOBAL_DATA_SIGNATURE) {\r
58 Status = EFI_UNSUPPORTED;\r
59 }\r
60 }\r
f2cdb268 61 } else if ((ApiIdx == FspSiliconInitApiIndex) || (ApiIdx == FspMultiPhaseSiInitApiIndex)) {\r
cf1d4549
JY
62 //\r
63 // FspSiliconInit check\r
64 //\r
630df8c8 65 if ((FspData == NULL) || ((UINTN)FspData == MAX_ADDRESS) || ((UINTN)FspData == MAX_UINT32)) {\r
cf1d4549
JY
66 Status = EFI_UNSUPPORTED;\r
67 } else {\r
68 if (FspData->Signature != FSP_GLOBAL_DATA_SIGNATURE) {\r
69 Status = EFI_UNSUPPORTED;\r
f2cdb268 70 } else if (EFI_ERROR (FspUpdSignatureCheck (FspSiliconInitApiIndex, ApiParam))) {\r
cf1d4549
JY
71 Status = EFI_INVALID_PARAMETER;\r
72 }\r
73 }\r
48249243
HZ
74 } else if (ApiIdx == FspSmmInitApiIndex) {\r
75 //\r
76 // FspSmmInitApiIndex check\r
77 //\r
78 if ((FspData == NULL) || ((UINTN)FspData == MAX_ADDRESS) || ((UINTN)FspData == MAX_UINT32)) {\r
79 Status = EFI_UNSUPPORTED;\r
80 } else {\r
81 if (FspData->Signature != FSP_GLOBAL_DATA_SIGNATURE) {\r
82 Status = EFI_UNSUPPORTED;\r
83 } else if (EFI_ERROR (FspUpdSignatureCheck (FspSmmInitApiIndex, ApiParam))) {\r
84 Status = EFI_INVALID_PARAMETER;\r
85 }\r
86 }\r
cf1d4549
JY
87 } else {\r
88 Status = EFI_UNSUPPORTED;\r
89 }\r
90\r
91 if (!EFI_ERROR (Status)) {\r
92 if ((ApiIdx != FspMemoryInitApiIndex)) {\r
93 //\r
94 // For FspMemoryInit, the global data is not valid yet\r
95 // The API index will be updated by SecCore after the global data\r
96 // is initialized\r
97 //\r
98 SetFspApiCallingIndex (ApiIdx);\r
99 }\r
100 }\r
e37bb20c 101\r
cf1d4549
JY
102 return Status;\r
103}\r