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