1 /** @file
2 Implementation of Fsp SA Policy Initialization.
3
4 Copyright (c) 2021, Intel Corporation. All rights reserved.<BR>
5 SPDX-License-Identifier: BSD-2-Clause-Patent
6 **/
7
8 #include <PeiFspPolicyInitLib.h>
9
10 #include <Ppi/SiPolicy.h>
11 #include <MemoryConfig.h>
12 #include <Library/IoLib.h>
13 #include <Library/BaseMemoryLib.h>
14 #include <Library/ConfigBlockLib.h>
15 #include <Library/PcdLib.h>
16 #include <Library/PeiLib.h>
17 #include <IndustryStandard/Pci.h>
18 #include <IndustryStandard/Bmp.h>
19 #include <Ppi/FirmwareVolume.h>
20 #include <Pi/PiFirmwareFile.h>
21 #include <Pi/PiPeiCis.h>
22 #include <Core/Pei/PeiMain.h>
23 #include <Library/ConfigBlockLib.h>
24 #include <PolicyUpdateMacro.h>
25 #include <Pi/PiFirmwareFile.h>
26 #include <Protocol/GraphicsOutput.h>
27 #include <Library/BmpSupportLib.h>
28
29 /**
30 Performs FSP SA PEI Policy initialization in pre-memory.
31
32 @param[in][out] FspmUpd Pointer to FSP UPD Data.
33
34 @retval EFI_SUCCESS FSP UPD Data is updated.
35 @retval EFI_NOT_FOUND Fail to locate required PPI.
36 @retval Other FSP UPD Data update process fail.
37 **/
38 EFI_STATUS
39 EFIAPI
PeiFspSaPolicyInitPreMem(IN OUT FSPM_UPD * FspmUpd)40 PeiFspSaPolicyInitPreMem (
41 IN OUT FSPM_UPD *FspmUpd
42 )
43 {
44 SA_MISC_PEI_PREMEM_CONFIG *MiscPeiPreMemConfig;
45 HOST_BRIDGE_PREMEM_CONFIG *HostBridgePreMemConfig;
46 MEMORY_CONFIG_NO_CRC *MemConfigNoCrc;
47 #if FixedPcdGet8(PcdFspModeSelection) == 0
48 EFI_STATUS Status;
49 SI_PREMEM_POLICY_PPI *SiPreMemPolicyPpi;
50 #endif
51
52 DEBUG((DEBUG_INFO, "\nUpdating SA Policy in Pre Mem\n"));
53 MiscPeiPreMemConfig = NULL;
54 HostBridgePreMemConfig = NULL;
55 MemConfigNoCrc = NULL;
56 #if FixedPcdGet8(PcdFspModeSelection) == 0
57 //
58 // Locate SiPreMemPolicyPpi
59 //
60 SiPreMemPolicyPpi = NULL;
61 Status = PeiServicesLocatePpi(
62 &gSiPreMemPolicyPpiGuid,
63 0,
64 NULL,
65 (VOID **) &SiPreMemPolicyPpi
66 );
67 ASSERT_EFI_ERROR (Status);
68 if ((Status == EFI_SUCCESS) && (SiPreMemPolicyPpi != NULL)) {
69 Status = GetConfigBlock ((VOID *) SiPreMemPolicyPpi, &gSaMiscPeiPreMemConfigGuid, (VOID *) &MiscPeiPreMemConfig);
70 ASSERT_EFI_ERROR (Status);
71 Status = GetConfigBlock((VOID *) SiPreMemPolicyPpi, &gHostBridgePeiPreMemConfigGuid, (VOID *) &HostBridgePreMemConfig);
72 ASSERT_EFI_ERROR(Status);
73 Status = GetConfigBlock ((VOID *) SiPreMemPolicyPpi, &gMemoryConfigNoCrcGuid, (VOID *) &MemConfigNoCrc);
74 ASSERT_EFI_ERROR (Status);
75 ZeroMem ((VOID *) MemConfigNoCrc->SpdData->SpdData, sizeof (SPD_DATA_BUFFER));
76 }
77 #endif
78
79 UPDATE_POLICY (FspmUpd->FspmConfig.SpdAddressTable[0], MiscPeiPreMemConfig->SpdAddressTable[0], PcdGet8 (PcdMrcSpdAddressTable0));
80 UPDATE_POLICY (FspmUpd->FspmConfig.SpdAddressTable[1], MiscPeiPreMemConfig->SpdAddressTable[1], PcdGet8 (PcdMrcSpdAddressTable1));
81 UPDATE_POLICY (FspmUpd->FspmConfig.SpdAddressTable[2], MiscPeiPreMemConfig->SpdAddressTable[2], PcdGet8 (PcdMrcSpdAddressTable2));
82 UPDATE_POLICY (FspmUpd->FspmConfig.SpdAddressTable[3], MiscPeiPreMemConfig->SpdAddressTable[3], PcdGet8 (PcdMrcSpdAddressTable3));
83
84 if (PcdGet32 (PcdMrcSpdData)) {
85 DEBUG((DEBUG_INFO, "PcdMrcSpdData != NULL, MemConfigNoCrc->SpdData\n"));
86 COPY_POLICY ((VOID *)((FSPM_UPD *) FspmUpd)->FspmConfig.MemorySpdPtr000, (VOID *)MemConfigNoCrc->SpdData->SpdData[0][0][0], (VOID *)(UINTN)PcdGet32 (PcdMrcSpdData), PcdGet16(PcdMrcSpdDataSize));
87 COPY_POLICY ((VOID *)((FSPM_UPD *) FspmUpd)->FspmConfig.MemorySpdPtr010, (VOID *)MemConfigNoCrc->SpdData->SpdData[0][1][0], (VOID *)(UINTN)PcdGet32 (PcdMrcSpdData), PcdGet16(PcdMrcSpdDataSize));
88 COPY_POLICY ((VOID *)((FSPM_UPD *) FspmUpd)->FspmConfig.MemorySpdPtr020, (VOID *)MemConfigNoCrc->SpdData->SpdData[0][2][0], (VOID *)(UINTN)PcdGet32 (PcdMrcSpdData), PcdGet16(PcdMrcSpdDataSize));
89 COPY_POLICY ((VOID *)((FSPM_UPD *) FspmUpd)->FspmConfig.MemorySpdPtr030, (VOID *)MemConfigNoCrc->SpdData->SpdData[0][3][0], (VOID *)(UINTN)PcdGet32 (PcdMrcSpdData), PcdGet16(PcdMrcSpdDataSize));
90 COPY_POLICY ((VOID *)((FSPM_UPD *) FspmUpd)->FspmConfig.MemorySpdPtr100, (VOID *)MemConfigNoCrc->SpdData->SpdData[1][0][0], (VOID *)(UINTN)PcdGet32 (PcdMrcSpdData), PcdGet16(PcdMrcSpdDataSize));
91 COPY_POLICY ((VOID *)((FSPM_UPD *) FspmUpd)->FspmConfig.MemorySpdPtr110, (VOID *)MemConfigNoCrc->SpdData->SpdData[1][1][0], (VOID *)(UINTN)PcdGet32 (PcdMrcSpdData), PcdGet16(PcdMrcSpdDataSize));
92 COPY_POLICY ((VOID *)((FSPM_UPD *) FspmUpd)->FspmConfig.MemorySpdPtr120, (VOID *)MemConfigNoCrc->SpdData->SpdData[1][2][0], (VOID *)(UINTN)PcdGet32 (PcdMrcSpdData), PcdGet16(PcdMrcSpdDataSize));
93 COPY_POLICY ((VOID *)((FSPM_UPD *) FspmUpd)->FspmConfig.MemorySpdPtr130, (VOID *)MemConfigNoCrc->SpdData->SpdData[1][3][0], (VOID *)(UINTN)PcdGet32 (PcdMrcSpdData), PcdGet16(PcdMrcSpdDataSize));
94 }
95 UPDATE_POLICY (((FSPM_UPD *) FspmUpd)->FspmConfig.TsegSize, MiscPeiPreMemConfig->TsegSize, PcdGet32 (PcdTsegSize));
96 UPDATE_POLICY (((FSPM_UPD *) FspmUpd)->FspmConfig.UserBd, MiscPeiPreMemConfig->UserBd, PcdGet8 (PcdSaMiscUserBd));
97 UPDATE_POLICY (((FSPM_UPD *) FspmUpd)->FspmConfig.MmioSizeAdjustment, HostBridgePreMemConfig->MmioSizeAdjustment, PcdGet16 (PcdSaMiscMmioSizeAdjustment));
98
99 return EFI_SUCCESS;
100 }
101
102
103 /**
104 Performs FSP SA PEI Policy initialization.
105
106 @param[in][out] FspsUpd Pointer to FSP UPD Data.
107
108 @retval EFI_SUCCESS FSP UPD Data is updated.
109 @retval EFI_NOT_FOUND Fail to locate required PPI.
110 @retval Other FSP UPD Data update process fail.
111 **/
112 EFI_STATUS
113 EFIAPI
UpdateGraphics(IN OUT FSPS_UPD * FspsUpd,GRAPHICS_PEI_CONFIG * GtConfig)114 UpdateGraphics(
115 IN OUT FSPS_UPD *FspsUpd,
116 GRAPHICS_PEI_CONFIG *GtConfig
117 )
118 {
119 EFI_STATUS Status;
120 VOID *Buffer;
121 UINT32 Size;
122 EFI_GRAPHICS_OUTPUT_BLT_PIXEL *Blt;
123 UINTN BltSize;
124 UINTN Height;
125 UINTN Width;
126
127 DEBUG((DEBUG_INFO, "\nUpdating SA Policy in Post Mem\n"));
128 UPDATE_POLICY (FspsUpd->FspsConfig.PeiGraphicsPeimInit, GtConfig->PeiGraphicsPeimInit, 1);
129
130 Size = 0;
131 Buffer = NULL;
132 PeiGetSectionFromAnyFv(PcdGetPtr(PcdIntelGraphicsVbtFileGuid), EFI_SECTION_RAW, 0, &Buffer, &Size);
133 DEBUG((DEBUG_INFO, "Vbt Pointer from PeiGetSectionFromAnyFv is 0x%x\n", Buffer));
134 DEBUG((DEBUG_INFO, "Vbt Size from PeiGetSectionFromAnyFv is 0x%x\n", Size));
135 #if FixedPcdGet8(PcdFspModeSelection) == 1
136 FspsUpd->FspsConfig.GraphicsConfigPtr = (UINT32)(UINTN)Buffer;
137 #else
138 GtConfig->GraphicsConfigPtr = Buffer;
139 #endif
140
141 Size = 0;
142 Buffer = NULL;
143 PeiGetSectionFromAnyFv(&gTianoLogoGuid, EFI_SECTION_RAW, 0, &Buffer, &Size);
144 DEBUG((DEBUG_INFO, "LogoPtr from PeiGetSectionFromAnyFv is 0x%x\n", Buffer));
145 DEBUG((DEBUG_INFO, "LogoSize from PeiGetSectionFromAnyFv is 0x%x\n", Size));
146 #if FixedPcdGet8(PcdFspModeSelection) == 1
147 FspsUpd->FspsConfig.LogoPtr = (UINT32)Buffer;
148 FspsUpd->FspsConfig.LogoSize = Size;
149 #else
150 GtConfig->LogoPtr = Buffer;
151 GtConfig->LogoSize = Size;
152 #endif
153
154 if (Buffer != NULL) {
155 Blt = NULL;
156 Status = TranslateBmpToGopBlt (
157 Buffer,
158 Size,
159 &Blt,
160 &BltSize,
161 &Height,
162 &Width
163 );
164 if (EFI_ERROR (Status)) {
165 DEBUG ((DEBUG_ERROR, "TranslateBmpToGopBlt, Status = %r\n", Status));
166 ASSERT_EFI_ERROR (Status);
167 return Status;
168 }
169
170 UPDATE_POLICY(FspsUpd->FspsConfig.BltBufferSize, GtConfig->BltBufferSize, BltSize);
171 UPDATE_POLICY(FspsUpd->FspsConfig.LogoPixelWidth, GtConfig->LogoPixelWidth, Width);
172 UPDATE_POLICY(FspsUpd->FspsConfig.LogoPixelHeight, GtConfig->LogoPixelHeight, Height);
173 #if FixedPcdGet8(PcdFspModeSelection) == 1
174 FspsUpd->FspsConfig.BltBufferAddress = (UINT32) Blt;
175 #else
176 GtConfig->BltBufferAddress = (VOID *) Blt;
177 #endif
178 }
179
180 return EFI_SUCCESS;
181 }
182
183 /**
184 Performs FSP SA PEI Policy initialization.
185
186 @param[in][out] FspsUpd Pointer to FSP UPD Data.
187
188 @retval EFI_SUCCESS FSP UPD Data is updated.
189 @retval EFI_NOT_FOUND Fail to locate required PPI.
190 @retval Other FSP UPD Data update process fail.
191 **/
192 EFI_STATUS
193 EFIAPI
PeiFspSaPolicyInit(IN OUT FSPS_UPD * FspsUpd)194 PeiFspSaPolicyInit (
195 IN OUT FSPS_UPD *FspsUpd
196 )
197 {
198 #if FixedPcdGet8(PcdFspModeSelection) == 0
199 EFI_STATUS Status;
200 SI_POLICY_PPI *SiPolicyPpi;
201 #endif
202 SA_MISC_PEI_CONFIG *MiscPeiConfig;
203 GRAPHICS_PEI_CONFIG *GtConfig;
204
205 MiscPeiConfig = NULL;
206 GtConfig = NULL;
207
208 #if FixedPcdGet8(PcdFspModeSelection) == 0
209 //
210 // Locate SiPolicyPpi
211 //
212 SiPolicyPpi = NULL;
213 Status = PeiServicesLocatePpi(
214 &gSiPolicyPpiGuid,
215 0,
216 NULL,
217 (VOID **)&SiPolicyPpi
218 );
219 if ((Status == EFI_SUCCESS) && (SiPolicyPpi != NULL)) {
220 MiscPeiConfig = NULL;
221 Status = GetConfigBlock ((VOID *) SiPolicyPpi, &gSaMiscPeiConfigGuid, (VOID *) &MiscPeiConfig);
222 ASSERT_EFI_ERROR (Status);
223
224 GtConfig = NULL;
225 Status = GetConfigBlock ((VOID *) SiPolicyPpi, &gGraphicsPeiConfigGuid, (VOID *) &GtConfig);
226 ASSERT_EFI_ERROR (Status);
227
228 }
229 #endif
230
231 DEBUG ((DEBUG_INFO | DEBUG_INIT, "FSP Wrapper UpdatePeiSaPolicy\n"));
232
233 //
234 // Update UPD: VBT & LogoPtr
235 //
236 UpdateGraphics(FspsUpd, GtConfig);
237
238 return EFI_SUCCESS;
239 }
240
241