]> git.proxmox.com Git - mirror_edk2.git/blame - UefiPayloadPkg/FvbRuntimeDxe/FvbInfo.c
OvmfPkg/PlatformPei: set the Hypervisor Features PCD
[mirror_edk2.git] / UefiPayloadPkg / FvbRuntimeDxe / FvbInfo.c
CommitLineData
ae8acce8
GD
1/** @file\r
2\r
3 Copyright (c) 2014 - 2021, Intel Corporation. All rights reserved.<BR>\r
4 SPDX-License-Identifier: BSD-2-Clause-Patent\r
5\r
6**/\r
7\r
8#include <PiDxe.h>\r
9#include <Protocol/FirmwareVolumeBlock.h>\r
10#include <Library/PcdLib.h>\r
11#include <Library/DebugLib.h>\r
12#include <Library/BaseLib.h>\r
13#include <Guid/FirmwareFileSystem2.h>\r
14#include <Guid/SystemNvDataGuid.h>\r
15#include <Guid/NvVariableInfoGuid.h>\r
16#include <Library/HobLib.h>\r
17\r
e5efcf8b 18#define FVB_MEDIA_BLOCK_SIZE 0x1000\r
ae8acce8
GD
19\r
20typedef struct {\r
e5efcf8b
MK
21 EFI_FIRMWARE_VOLUME_HEADER FvInfo;\r
22 EFI_FV_BLOCK_MAP_ENTRY End[1];\r
ae8acce8
GD
23} EFI_FVB2_MEDIA_INFO;\r
24\r
25//\r
26// This data structure contains a template of FV header which is used to restore\r
27// Fv header if it's corrupted.\r
28//\r
e5efcf8b 29EFI_FVB2_MEDIA_INFO mFvbMediaInfo = {\r
ae8acce8 30 {\r
e5efcf8b 31 { 0, }, // ZeroVector[16]\r
ae8acce8
GD
32 EFI_SYSTEM_NV_DATA_FV_GUID,\r
33 0,\r
34 EFI_FVH_SIGNATURE,\r
35 0x0004feff, // check PiFirmwareVolume.h for details on EFI_FVB_ATTRIBUTES_2\r
36 sizeof (EFI_FIRMWARE_VOLUME_HEADER) + sizeof (EFI_FV_BLOCK_MAP_ENTRY),\r
37 0, // CheckSum which will be calucated dynamically.\r
38 0, // ExtHeaderOffset\r
e5efcf8b 39 { 0, },\r
ae8acce8
GD
40 EFI_FVH_REVISION,\r
41 {\r
42 {\r
43 0,\r
44 FVB_MEDIA_BLOCK_SIZE,\r
45 }\r
46 }\r
47 },\r
48 {\r
49 {\r
50 0,\r
51 0\r
52 }\r
53 }\r
54};\r
55\r
56/**\r
57 Initialize the variable store\r
58\r
59 @retval EFI_SUCCESS if initialize the store success.\r
60\r
61**/\r
62EFI_STATUS\r
63InitVariableStore (\r
64 VOID\r
65 )\r
66{\r
e5efcf8b
MK
67 EFI_STATUS Status;\r
68 UINT32 NvStorageBase;\r
69 UINT32 NvStorageSize;\r
70 UINT32 NvVariableSize;\r
71 UINT32 FtwWorkingSize;\r
72 UINT32 FtwSpareSize;\r
73 EFI_HOB_GUID_TYPE *GuidHob;\r
74 NV_VARIABLE_INFO *NvVariableInfo;\r
ae8acce8
GD
75\r
76 //\r
77 // Find SPI flash variable hob\r
78 //\r
79 GuidHob = GetFirstGuidHob (&gNvVariableInfoGuid);\r
80 if (GuidHob == NULL) {\r
81 ASSERT (FALSE);\r
82 return EFI_NOT_FOUND;\r
83 }\r
e5efcf8b
MK
84\r
85 NvVariableInfo = (NV_VARIABLE_INFO *)GET_GUID_HOB_DATA (GuidHob);\r
ae8acce8
GD
86\r
87 //\r
88 // Get variable region base and size.\r
89 //\r
90 NvStorageSize = NvVariableInfo->VariableStoreSize;\r
91 NvStorageBase = NvVariableInfo->VariableStoreBase;\r
92\r
93 //\r
94 // NvStorageBase needs to be 4KB aligned, NvStorageSize needs to be 8KB * n\r
95 //\r
96 if (((NvStorageBase & (SIZE_4KB - 1)) != 0) || ((NvStorageSize & (SIZE_8KB - 1)) != 0)) {\r
97 return EFI_INVALID_PARAMETER;\r
98 }\r
99\r
100 FtwSpareSize = NvStorageSize / 2;\r
101 FtwWorkingSize = 0x2000;\r
102 NvVariableSize = NvStorageSize / 2 - FtwWorkingSize;\r
103 DEBUG ((DEBUG_INFO, "NvStorageBase:0x%x, NvStorageSize:0x%x\n", NvStorageBase, NvStorageSize));\r
104\r
105 if (NvVariableSize >= 0x80000000) {\r
106 return EFI_INVALID_PARAMETER;\r
107 }\r
e5efcf8b
MK
108\r
109 Status = PcdSet32S (PcdFlashNvStorageVariableSize, NvVariableSize);\r
ae8acce8 110 ASSERT_EFI_ERROR (Status);\r
e5efcf8b 111 Status = PcdSet32S (PcdFlashNvStorageVariableBase, NvStorageBase);\r
ae8acce8 112 ASSERT_EFI_ERROR (Status);\r
e5efcf8b 113 Status = PcdSet64S (PcdFlashNvStorageVariableBase64, NvStorageBase);\r
ae8acce8
GD
114 ASSERT_EFI_ERROR (Status);\r
115\r
e5efcf8b 116 Status = PcdSet32S (PcdFlashNvStorageFtwWorkingSize, FtwWorkingSize);\r
ae8acce8 117 ASSERT_EFI_ERROR (Status);\r
e5efcf8b 118 Status = PcdSet32S (PcdFlashNvStorageFtwWorkingBase, NvStorageBase + NvVariableSize);\r
ae8acce8
GD
119 ASSERT_EFI_ERROR (Status);\r
120\r
e5efcf8b 121 Status = PcdSet32S (PcdFlashNvStorageFtwSpareSize, FtwSpareSize);\r
ae8acce8 122 ASSERT_EFI_ERROR (Status);\r
e5efcf8b 123 Status = PcdSet32S (PcdFlashNvStorageFtwSpareBase, NvStorageBase + FtwSpareSize);\r
ae8acce8
GD
124 ASSERT_EFI_ERROR (Status);\r
125\r
126 return EFI_SUCCESS;\r
127}\r
128\r
ae8acce8
GD
129/**\r
130 Get a heathy FV header used for variable store recovery\r
131\r
132 @retval The FV header.\r
133\r
134**/\r
135EFI_FIRMWARE_VOLUME_HEADER *\r
136GetFvHeaderTemplate (\r
137 VOID\r
138 )\r
139{\r
e5efcf8b
MK
140 EFI_FIRMWARE_VOLUME_HEADER *FvHeader;\r
141 UINTN FvSize;\r
ae8acce8 142\r
e5efcf8b 143 FvSize = PcdGet32 (PcdFlashNvStorageFtwSpareSize) * 2;\r
ae8acce8
GD
144 FvHeader = &mFvbMediaInfo.FvInfo;\r
145 FvHeader->FvLength = FvSize;\r
e5efcf8b
MK
146 FvHeader->BlockMap[0].NumBlocks = (UINT32)(FvSize / FvHeader->BlockMap[0].Length);\r
147 FvHeader->Checksum = 0;\r
148 FvHeader->Checksum = CalculateCheckSum16 ((UINT16 *)FvHeader, FvHeader->HeaderLength);\r
ae8acce8
GD
149\r
150 return FvHeader;\r
151}\r