1 /** @file
2 
3   Copyright (c) 2016 - 2020, Intel Corporation. All rights reserved.<BR>
4   SPDX-License-Identifier: BSD-2-Clause-Patent
5 
6 **/
7 
8 #include "SecFsp.h"
9 
10 
11 /**
12   This function check the FSP API calling condition.
13 
14   @param[in]  ApiIdx           Internal index of the FSP API.
15   @param[in]  ApiParam         Parameter of the FSP API.
16 
17 **/
18 EFI_STATUS
19 EFIAPI
FspApiCallingCheck(IN UINT8 ApiIdx,IN VOID * ApiParam)20 FspApiCallingCheck (
21   IN UINT8     ApiIdx,
22   IN VOID     *ApiParam
23   )
24 {
25   EFI_STATUS                Status;
26   FSP_GLOBAL_DATA           *FspData;
27 
28   Status = EFI_SUCCESS;
29   FspData = GetFspGlobalDataPointer ();
30 
31   if (ApiIdx == NotifyPhaseApiIndex) {
32     //
33     // NotifyPhase check
34     //
35     if ((FspData == NULL) || ((UINT32)FspData == 0xFFFFFFFF)) {
36       Status = EFI_UNSUPPORTED;
37     } else {
38       if (FspData->Signature != FSP_GLOBAL_DATA_SIGNATURE) {
39         Status = EFI_UNSUPPORTED;
40       }
41     }
42   } else if (ApiIdx == FspMemoryInitApiIndex) {
43     //
44     // FspMemoryInit check
45     //
46     if ((UINT32)FspData != 0xFFFFFFFF) {
47       Status = EFI_UNSUPPORTED;
48     } else if (EFI_ERROR (FspUpdSignatureCheck (ApiIdx, ApiParam))) {
49       Status = EFI_INVALID_PARAMETER;
50     }
51   } else if (ApiIdx == TempRamExitApiIndex) {
52     //
53     // TempRamExit check
54     //
55     if ((FspData == NULL) || ((UINT32)FspData == 0xFFFFFFFF)) {
56       Status = EFI_UNSUPPORTED;
57     } else {
58       if (FspData->Signature != FSP_GLOBAL_DATA_SIGNATURE) {
59         Status = EFI_UNSUPPORTED;
60       }
61     }
62   } else if ((ApiIdx == FspSiliconInitApiIndex) || (ApiIdx == FspMultiPhaseSiInitApiIndex)) {
63     //
64     // FspSiliconInit check
65     //
66     if ((FspData == NULL) || ((UINT32)FspData == 0xFFFFFFFF)) {
67       Status = EFI_UNSUPPORTED;
68     } else {
69       if (FspData->Signature != FSP_GLOBAL_DATA_SIGNATURE) {
70         Status = EFI_UNSUPPORTED;
71       } else if (EFI_ERROR (FspUpdSignatureCheck (FspSiliconInitApiIndex, ApiParam))) {
72         Status = EFI_INVALID_PARAMETER;
73       }
74     }
75   } else {
76     Status = EFI_UNSUPPORTED;
77   }
78 
79   if (!EFI_ERROR (Status)) {
80     if ((ApiIdx != FspMemoryInitApiIndex)) {
81       //
82       // For FspMemoryInit, the global data is not valid yet
83       // The API index will be updated by SecCore after the global data
84       // is initialized
85       //
86       SetFspApiCallingIndex (ApiIdx);
87     }
88   }
89 
90   return Status;
91 }
92