1 /** @file
2   Instance of Fsp Policy Initialization Library.
3 
4 Copyright (c) 2017, Intel Corporation. All rights reserved.<BR>
5 SPDX-License-Identifier: BSD-2-Clause-Patent
6 
7 **/
8 
9 #include <PeiFspPolicyInitLib.h>
10 #include <Library/FspWrapperApiLib.h>
11 #include <Library/BaseMemoryLib.h>
12 #include <Library/MemoryAllocationLib.h>
13 /**
14   Performs silicon pre-mem policy initialization.
15 
16   The meaning of Policy is defined by silicon code.
17   It could be the raw data, a handle, a PPI, etc.
18 
19   The returned data must be used as input data for SiliconPolicyDonePreMem(),
20   and SiliconPolicyUpdateLib.SiliconPolicyUpdatePreMem().
21 
22   1) In FSP path, the input Policy should be FspmUpd.
23   Value of FspmUpd has been initialized by FSP binary default value.
24   Only a subset of FspmUpd needs to be updated for different silicon sku.
25   The return data is same FspmUpd.
26 
27   2) In non-FSP path, the input policy could be NULL.
28   The return data is the initialized policy.
29 
30   @param[in, out] Policy       Pointer to policy.
31 
32   @return the initialized policy.
33 **/
34 VOID *
35 EFIAPI
SiliconPolicyInitPreMem(IN OUT VOID * FspmUpd)36 SiliconPolicyInitPreMem (
37   IN OUT VOID    *FspmUpd
38   )
39 {
40   FSPM_UPD              *FspmUpdDataPtr;
41   EFI_STATUS            Status;
42   UINTN                 *SourceData;
43   FSP_INFO_HEADER       *FspmHeaderPtr;
44 
45   if (FspmUpd == NULL) {
46     //
47     // Allocate and initialize UPD buffer, copy default FSP-M UPD data
48     //
49     FspmHeaderPtr = (FSP_INFO_HEADER *) FspFindFspHeader (PcdGet32 (PcdFspmBaseAddress));
50     ASSERT (FspmHeaderPtr != NULL);
51     if (FspmHeaderPtr != NULL) {
52       DEBUG ((DEBUG_INFO, "FspmHeaderPtr - 0x%x\n", FspmHeaderPtr));
53       FspmUpdDataPtr = (FSPM_UPD *) AllocateZeroPool ((UINTN) FspmHeaderPtr->CfgRegionSize);
54       ASSERT (FspmUpdDataPtr != NULL);
55       if (FspmUpdDataPtr != NULL) {
56         SourceData = (UINTN *) ((UINTN) FspmHeaderPtr->ImageBase + (UINTN) FspmHeaderPtr->CfgRegionOffset);
57         CopyMem (FspmUpdDataPtr, SourceData, (UINTN) FspmHeaderPtr->CfgRegionSize);
58         PcdSet32S (PcdFspmUpdDataAddress, (UINT32) FspmUpdDataPtr);
59       }
60     }
61   } else {
62     FspmUpdDataPtr = FspmUpd;
63   }
64   //
65   // Return NULL pointer as error occurried and do not continue rest of the steps.
66   //
67   if (FspmUpdDataPtr == NULL) {
68     return NULL;
69   }
70   DEBUG ((DEBUG_INFO, "FspmUpdDataPtr - 0x%x\n", FspmUpdDataPtr));
71   //
72   // Initialize Intel PEI Platform Policy
73   //
74   PeiPolicyInitPreMem ();
75 
76   //
77   // SI Pei Fsp Policy Initialization
78   //
79   Status = PeiFspSiPolicyInitPreMem (FspmUpdDataPtr);
80   if (EFI_ERROR (Status)) {
81     DEBUG ((DEBUG_WARN, "ERROR - SI Pei Fsp Policy in Pre-Memory Initialization fail, Status = %r\n", Status));
82   }
83 
84   //
85   // PCH Pei Fsp Policy Initialization
86   //
87   Status = PeiFspPchPolicyInitPreMem (FspmUpdDataPtr);
88   if (EFI_ERROR (Status)) {
89     DEBUG ((DEBUG_WARN, "ERROR - PCH Pei Fsp Policy in Pre-Memory Initialization fail, Status = %r\n", Status));
90   }
91 
92   //
93   // Cpu Pei Fsp Policy Initialization
94   //
95   Status = PeiFspCpuPolicyInitPreMem (FspmUpdDataPtr);
96   if (EFI_ERROR (Status)) {
97     DEBUG ((DEBUG_WARN, "ERROR - CPU Pei Fsp Policy in Pre-Memory Initialization fail, Status = %r\n", Status));
98   }
99 
100 
101   //
102   // ME Pei Fsp Policy Initialization
103   //
104   Status = PeiFspMePolicyInitPreMem (FspmUpdDataPtr);
105   if (EFI_ERROR (Status)) {
106     DEBUG ((DEBUG_WARN, "ERROR - ME Pei Fsp Policy in Pre-Memory Initialization fail, Status = %r\n", Status));
107   }
108 
109   //
110   // SystemAgent Pei Fsp Policy Initialization
111   //
112   Status = PeiFspSaPolicyInitPreMem (FspmUpdDataPtr);
113   if (EFI_ERROR (Status)) {
114     DEBUG ((DEBUG_WARN, "ERROR - SystemAgent Pei Fsp Policy in Pre-Memory Initialization fail, Status = %r\n", Status));
115   }
116 
117   //
118   // Other Upd Initialization
119   //
120   Status = PeiFspMiscUpdInitPreMem (FspmUpdDataPtr);
121 
122   return FspmUpdDataPtr;
123 }
124 
125 /*
126   The silicon pre-mem policy is finalized.
127   Silicon code can do initialization based upon the policy data.
128 
129   The input Policy must be returned by SiliconPolicyInitPreMem().
130 
131   @param[in] Policy       Pointer to policy.
132 
133   @retval EFI_SUCCESS The policy is handled consumed by silicon code.
134 */
135 EFI_STATUS
136 EFIAPI
SiliconPolicyDonePreMem(IN OUT VOID * FspmUpd)137 SiliconPolicyDonePreMem (
138   IN OUT VOID    *FspmUpd
139   )
140 {
141   return EFI_SUCCESS;
142 }
143 
144 /**
145   Performs silicon post-mem policy initialization.
146 
147   The meaning of Policy is defined by silicon code.
148   It could be the raw data, a handle, a PPI, etc.
149 
150   The returned data must be used as input data for SiliconPolicyDonePostMem(),
151   and SiliconPolicyUpdateLib.SiliconPolicyUpdatePostMem().
152 
153   1) In FSP path, the input Policy should be FspsUpd.
154   Value of FspsUpd has been initialized by FSP binary default value.
155   Only a subset of FspsUpd needs to be updated for different silicon sku.
156   The return data is same FspsUpd.
157 
158   2) In non-FSP path, the input policy could be NULL.
159   The return data is the initialized policy.
160 
161   @param[in, out] Policy       Pointer to policy.
162 
163   @return the initialized policy.
164 **/
165 VOID *
166 EFIAPI
SiliconPolicyInitPostMem(IN OUT VOID * FspsUpd)167 SiliconPolicyInitPostMem (
168   IN OUT VOID    *FspsUpd
169   )
170 {
171   FSPS_UPD              *FspsUpdDataPtr;
172   EFI_STATUS            Status;
173   FSP_INFO_HEADER       *FspsHeaderPtr;
174   UINTN                 *SourceData;
175 
176   if (FspsUpd == NULL) {
177     //
178     // Allocate and initialize UPD buffer, copy default FSP-S UPD data
179     //
180     FspsHeaderPtr = (FSP_INFO_HEADER *) FspFindFspHeader (PcdGet32 (PcdFspsBaseAddress));
181     ASSERT (FspsHeaderPtr != NULL);
182     if (FspsHeaderPtr != NULL) {
183       DEBUG ((DEBUG_INFO, "FspsHeaderPtr - 0x%x\n", FspsHeaderPtr));
184       FspsUpdDataPtr = (FSPS_UPD *) AllocateZeroPool ((UINTN) FspsHeaderPtr->CfgRegionSize);
185       ASSERT (FspsUpdDataPtr != NULL);
186       if (FspsUpdDataPtr != NULL) {
187         SourceData = (UINTN *) ((UINTN) FspsHeaderPtr->ImageBase + (UINTN) FspsHeaderPtr->CfgRegionOffset);
188         CopyMem (FspsUpdDataPtr, SourceData, (UINTN) FspsHeaderPtr->CfgRegionSize);
189         PcdSet32S (PcdFspsUpdDataAddress, (UINT32) FspsUpdDataPtr);
190       }
191     }
192   } else {
193     FspsUpdDataPtr = FspsUpd;
194   }
195   //
196   // Return NULL pointer as error occurried and do not continue rest of the steps.
197   //
198   if (FspsUpdDataPtr == NULL) {
199     return NULL;
200   }
201   DEBUG ((DEBUG_INFO, "FspsUpdDataPtr - 0x%x\n", FspsUpdDataPtr));
202   //
203   // Initialize Intel PEI Platform Policy
204   //
205   PeiPolicyInit ();
206 
207   //
208   // PCH Pei Fsp Policy Initialization
209   //
210   Status = PeiFspPchPolicyInit (FspsUpdDataPtr);
211   if (EFI_ERROR (Status)) {
212     DEBUG ((DEBUG_WARN, "ERROR - PCH Pei Fsp Policy iInitialization fail, Status = %r\n", Status));
213   }
214 
215   //
216   // ME Pei Fsp Policy Initialization
217   //
218   Status = PeiFspMePolicyInit (FspsUpdDataPtr);
219   if (EFI_ERROR (Status)) {
220     DEBUG ((DEBUG_WARN, "ERROR - ME Pei Fsp Policy Initialization fail, Status = %r\n", Status));
221   }
222 
223   //
224   // SystemAgent Pei Fsp Policy Initialization
225   //
226   Status = PeiFspSaPolicyInit (FspsUpdDataPtr);
227   if (EFI_ERROR (Status)) {
228     DEBUG ((DEBUG_WARN, "ERROR - SystemAgent Pei Fsp Policy Initialization fail, Status = %r\n", Status));
229   }
230 
231 
232   //
233   // Cpu Pei Fsp Policy Initialization
234   //
235   Status = PeiFspCpuPolicyInit (FspsUpdDataPtr);
236   if (EFI_ERROR (Status)) {
237     DEBUG ((DEBUG_WARN, "ERROR - CPU Pei Fsp Policy Initialization fail, Status = %r\n", Status));
238   }
239 
240   return FspsUpdDataPtr;
241 }
242 
243 /*
244   The silicon post-mem policy is finalized.
245   Silicon code can do initialization based upon the policy data.
246 
247   The input Policy must be returned by SiliconPolicyInitPostMem().
248 
249   @param[in] Policy       Pointer to policy.
250 
251   @retval EFI_SUCCESS The policy is handled consumed by silicon code.
252 */
253 EFI_STATUS
254 EFIAPI
SiliconPolicyDonePostMem(IN OUT VOID * FspsUpd)255 SiliconPolicyDonePostMem (
256   IN OUT VOID    *FspsUpd
257   )
258 {
259   return EFI_SUCCESS;
260 }
261