]> git.proxmox.com Git - mirror_edk2.git/blame - OvmfPkg/QemuFlashFvbServicesRuntimeDxe/FvbInfo.c
OvmfPkg/QemuVideoDxe/VbeShim: handle PAM1 register on Q35 correctly
[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
0f2eb31c
LE
27#include <Pi/PiFirmwareVolume.h>\r
28\r
a4ce9ffd
JJ
29//\r
30// The protocols, PPI and GUID defintions for this module\r
31//\r
a4ce9ffd 32#include <Guid/SystemNvDataGuid.h>\r
a4ce9ffd
JJ
33//\r
34// The Library classes this module consumes\r
35//\r
a4ce9ffd 36#include <Library/BaseLib.h>\r
a4ce9ffd
JJ
37#include <Library/PcdLib.h>\r
38\r
39typedef struct {\r
40 UINT64 FvLength;\r
41 EFI_FIRMWARE_VOLUME_HEADER FvbInfo;\r
42 //\r
43 // EFI_FV_BLOCK_MAP_ENTRY ExtraBlockMap[n];//n=0\r
44 //\r
45 EFI_FV_BLOCK_MAP_ENTRY End[1];\r
46} EFI_FVB_MEDIA_INFO;\r
47\r
48EFI_FVB_MEDIA_INFO mPlatformFvbMediaInfo[] = {\r
49 //\r
50 // Systen NvStorage FVB\r
51 //\r
52 {\r
53 FixedPcdGet32 (PcdFlashNvStorageVariableSize) +\r
54 FixedPcdGet32 (PcdFlashNvStorageFtwWorkingSize) +\r
55 FixedPcdGet32 (PcdFlashNvStorageFtwSpareSize) +\r
56 FixedPcdGet32 (PcdOvmfFlashNvStorageEventLogSize),\r
57 {\r
58 {\r
59 0,\r
60 }, // ZeroVector[16]\r
61 EFI_SYSTEM_NV_DATA_FV_GUID,\r
62 FixedPcdGet32 (PcdFlashNvStorageVariableSize) +\r
63 FixedPcdGet32 (PcdFlashNvStorageFtwWorkingSize) +\r
64 FixedPcdGet32 (PcdFlashNvStorageFtwSpareSize) +\r
65 FixedPcdGet32 (PcdOvmfFlashNvStorageEventLogSize),\r
66 EFI_FVH_SIGNATURE,\r
141f0c64 67 EFI_FVB2_MEMORY_MAPPED |\r
a4ce9ffd
JJ
68 EFI_FVB2_READ_ENABLED_CAP |\r
69 EFI_FVB2_READ_STATUS |\r
70 EFI_FVB2_WRITE_ENABLED_CAP |\r
71 EFI_FVB2_WRITE_STATUS |\r
72 EFI_FVB2_ERASE_POLARITY |\r
73 EFI_FVB2_ALIGNMENT_16,\r
74 sizeof (EFI_FIRMWARE_VOLUME_HEADER) + sizeof (EFI_FV_BLOCK_MAP_ENTRY),\r
75 0, // CheckSum\r
76 0, // ExtHeaderOffset\r
77 {\r
78 0,\r
79 }, // Reserved[1]\r
80 2, // Revision\r
81 {\r
84043adf
LE
82 {\r
83 (FixedPcdGet32 (PcdFlashNvStorageVariableSize) +\r
84 FixedPcdGet32 (PcdFlashNvStorageFtwWorkingSize) +\r
85 FixedPcdGet32 (PcdFlashNvStorageFtwSpareSize) +\r
ea0d111e
LE
86 FixedPcdGet32 (PcdOvmfFlashNvStorageEventLogSize)) /\r
87 FixedPcdGet32 (PcdOvmfFirmwareBlockSize),\r
84043adf
LE
88 FixedPcdGet32 (PcdOvmfFirmwareBlockSize),\r
89 }\r
90 } // BlockMap[1]\r
a4ce9ffd
JJ
91 },\r
92 {\r
84043adf
LE
93 {\r
94 0,\r
95 0\r
96 }\r
97 } // End[1]\r
a4ce9ffd
JJ
98 }\r
99};\r
100\r
101EFI_STATUS\r
102GetFvbInfo (\r
103 IN UINT64 FvLength,\r
104 OUT EFI_FIRMWARE_VOLUME_HEADER **FvbInfo\r
105 )\r
106{\r
107 STATIC BOOLEAN Checksummed = FALSE;\r
108 UINTN Index;\r
109\r
110 if (!Checksummed) {\r
ea0d111e
LE
111 for (Index = 0;\r
112 Index < sizeof (mPlatformFvbMediaInfo) / sizeof (EFI_FVB_MEDIA_INFO);\r
113 Index += 1) {\r
a4ce9ffd
JJ
114 UINT16 Checksum;\r
115 mPlatformFvbMediaInfo[Index].FvbInfo.Checksum = 0;\r
116 Checksum = CalculateCheckSum16 (\r
117 (UINT16*) &mPlatformFvbMediaInfo[Index].FvbInfo,\r
118 mPlatformFvbMediaInfo[Index].FvbInfo.HeaderLength\r
119 );\r
120 mPlatformFvbMediaInfo[Index].FvbInfo.Checksum = Checksum;\r
121 }\r
122 Checksummed = TRUE;\r
123 }\r
124\r
ea0d111e
LE
125 for (Index = 0;\r
126 Index < sizeof (mPlatformFvbMediaInfo) / sizeof (EFI_FVB_MEDIA_INFO);\r
127 Index += 1) {\r
a4ce9ffd
JJ
128 if (mPlatformFvbMediaInfo[Index].FvLength == FvLength) {\r
129 *FvbInfo = &mPlatformFvbMediaInfo[Index].FvbInfo;\r
130 return EFI_SUCCESS;\r
131 }\r
132 }\r
133\r
134 return EFI_NOT_FOUND;\r
135}\r