]> git.proxmox.com Git - mirror_edk2.git/blame - OvmfPkg/QemuFlashFvbServicesRuntimeDxe/FvbInfo.c
OvmfPkg: QemuFlashFvbServicesRuntimeDxe: split out runtime DXE specifics
[mirror_edk2.git] / OvmfPkg / QemuFlashFvbServicesRuntimeDxe / FvbInfo.c
CommitLineData
a4ce9ffd
JJ
1/**@file\r
2\r
ea0d111e 3 Copyright (c) 2006, Intel Corporation. All rights reserved.<BR>\r
141f0c64 4\r
ea0d111e
LE
5 This program and the accompanying materials are licensed and made available\r
6 under the terms and conditions of the BSD License which accompanies this\r
7 distribution. The full text of the license may be found at\r
8 http://opensource.org/licenses/bsd-license.php\r
a4ce9ffd 9\r
ea0d111e
LE
10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
a4ce9ffd 12\r
ea0d111e 13 Module Name:\r
a4ce9ffd 14\r
ea0d111e 15 FvbInfo.c\r
a4ce9ffd 16\r
ea0d111e
LE
17 Abstract:\r
18\r
19 Defines data structure that is the volume header found.These data is intent\r
20 to decouple FVB driver with FV header.\r
a4ce9ffd
JJ
21\r
22**/\r
23\r
24//\r
25// The package level header files this module uses\r
26//\r
27#include <PiDxe.h>\r
28//\r
29// The protocols, PPI and GUID defintions for this module\r
30//\r
31#include <Guid/EventGroup.h>\r
32#include <Guid/FirmwareFileSystem2.h>\r
33#include <Guid/SystemNvDataGuid.h>\r
34#include <Protocol/FirmwareVolumeBlock.h>\r
35#include <Protocol/DevicePath.h>\r
36//\r
37// The Library classes this module consumes\r
38//\r
39#include <Library/UefiLib.h>\r
40#include <Library/UefiDriverEntryPoint.h>\r
41#include <Library/BaseLib.h>\r
42#include <Library/DxeServicesTableLib.h>\r
43#include <Library/UefiRuntimeLib.h>\r
44#include <Library/DebugLib.h>\r
45#include <Library/HobLib.h>\r
46#include <Library/BaseMemoryLib.h>\r
47#include <Library/MemoryAllocationLib.h>\r
48#include <Library/UefiBootServicesTableLib.h>\r
49#include <Library/PcdLib.h>\r
50\r
51typedef struct {\r
52 UINT64 FvLength;\r
53 EFI_FIRMWARE_VOLUME_HEADER FvbInfo;\r
54 //\r
55 // EFI_FV_BLOCK_MAP_ENTRY ExtraBlockMap[n];//n=0\r
56 //\r
57 EFI_FV_BLOCK_MAP_ENTRY End[1];\r
58} EFI_FVB_MEDIA_INFO;\r
59\r
60EFI_FVB_MEDIA_INFO mPlatformFvbMediaInfo[] = {\r
61 //\r
62 // Systen NvStorage FVB\r
63 //\r
64 {\r
65 FixedPcdGet32 (PcdFlashNvStorageVariableSize) +\r
66 FixedPcdGet32 (PcdFlashNvStorageFtwWorkingSize) +\r
67 FixedPcdGet32 (PcdFlashNvStorageFtwSpareSize) +\r
68 FixedPcdGet32 (PcdOvmfFlashNvStorageEventLogSize),\r
69 {\r
70 {\r
71 0,\r
72 }, // ZeroVector[16]\r
73 EFI_SYSTEM_NV_DATA_FV_GUID,\r
74 FixedPcdGet32 (PcdFlashNvStorageVariableSize) +\r
75 FixedPcdGet32 (PcdFlashNvStorageFtwWorkingSize) +\r
76 FixedPcdGet32 (PcdFlashNvStorageFtwSpareSize) +\r
77 FixedPcdGet32 (PcdOvmfFlashNvStorageEventLogSize),\r
78 EFI_FVH_SIGNATURE,\r
141f0c64 79 EFI_FVB2_MEMORY_MAPPED |\r
a4ce9ffd
JJ
80 EFI_FVB2_READ_ENABLED_CAP |\r
81 EFI_FVB2_READ_STATUS |\r
82 EFI_FVB2_WRITE_ENABLED_CAP |\r
83 EFI_FVB2_WRITE_STATUS |\r
84 EFI_FVB2_ERASE_POLARITY |\r
85 EFI_FVB2_ALIGNMENT_16,\r
86 sizeof (EFI_FIRMWARE_VOLUME_HEADER) + sizeof (EFI_FV_BLOCK_MAP_ENTRY),\r
87 0, // CheckSum\r
88 0, // ExtHeaderOffset\r
89 {\r
90 0,\r
91 }, // Reserved[1]\r
92 2, // Revision\r
93 {\r
84043adf
LE
94 {\r
95 (FixedPcdGet32 (PcdFlashNvStorageVariableSize) +\r
96 FixedPcdGet32 (PcdFlashNvStorageFtwWorkingSize) +\r
97 FixedPcdGet32 (PcdFlashNvStorageFtwSpareSize) +\r
ea0d111e
LE
98 FixedPcdGet32 (PcdOvmfFlashNvStorageEventLogSize)) /\r
99 FixedPcdGet32 (PcdOvmfFirmwareBlockSize),\r
84043adf
LE
100 FixedPcdGet32 (PcdOvmfFirmwareBlockSize),\r
101 }\r
102 } // BlockMap[1]\r
a4ce9ffd
JJ
103 },\r
104 {\r
84043adf
LE
105 {\r
106 0,\r
107 0\r
108 }\r
109 } // End[1]\r
a4ce9ffd
JJ
110 }\r
111};\r
112\r
113EFI_STATUS\r
114GetFvbInfo (\r
115 IN UINT64 FvLength,\r
116 OUT EFI_FIRMWARE_VOLUME_HEADER **FvbInfo\r
117 )\r
118{\r
119 STATIC BOOLEAN Checksummed = FALSE;\r
120 UINTN Index;\r
121\r
122 if (!Checksummed) {\r
ea0d111e
LE
123 for (Index = 0;\r
124 Index < sizeof (mPlatformFvbMediaInfo) / sizeof (EFI_FVB_MEDIA_INFO);\r
125 Index += 1) {\r
a4ce9ffd
JJ
126 UINT16 Checksum;\r
127 mPlatformFvbMediaInfo[Index].FvbInfo.Checksum = 0;\r
128 Checksum = CalculateCheckSum16 (\r
129 (UINT16*) &mPlatformFvbMediaInfo[Index].FvbInfo,\r
130 mPlatformFvbMediaInfo[Index].FvbInfo.HeaderLength\r
131 );\r
132 mPlatformFvbMediaInfo[Index].FvbInfo.Checksum = Checksum;\r
133 }\r
134 Checksummed = TRUE;\r
135 }\r
136\r
ea0d111e
LE
137 for (Index = 0;\r
138 Index < sizeof (mPlatformFvbMediaInfo) / sizeof (EFI_FVB_MEDIA_INFO);\r
139 Index += 1) {\r
a4ce9ffd
JJ
140 if (mPlatformFvbMediaInfo[Index].FvLength == FvLength) {\r
141 *FvbInfo = &mPlatformFvbMediaInfo[Index].FvbInfo;\r
142 return EFI_SUCCESS;\r
143 }\r
144 }\r
145\r
146 return EFI_NOT_FOUND;\r
147}\r