]> git.proxmox.com Git - mirror_edk2.git/blame - QuarkPlatformPkg/Platform/SpiFvbServices/FvbInfo.c
BaseTool: Add cache for the result of SkipAutogen.
[mirror_edk2.git] / QuarkPlatformPkg / Platform / SpiFvbServices / FvbInfo.c
CommitLineData
b303605e
MK
1/** @file\r
2Defines data structure that is the volume header found.These data is intent\r
3to decouple FVB driver with FV header.\r
4\r
5Copyright (c) 2013 Intel Corporation.\r
6\r
7This program and the accompanying materials\r
8are licensed and made available under the terms and conditions of the BSD License\r
9which accompanies this distribution. The full text of the license may be found at\r
10http://opensource.org/licenses/bsd-license.php\r
11\r
12THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
13WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
14\r
15\r
16**/\r
17\r
18#include <PiDxe.h>\r
19#include "FwBlockService.h"\r
20\r
21\r
22//#define FVB_MEDIA_BLOCK_SIZE PcdGet32(PcdFlashMinEraseSize)\r
23#define FVB_MEDIA_BLOCK_SIZE 0x1000\r
24\r
25typedef struct {\r
26 EFI_PHYSICAL_ADDRESS BaseAddress;\r
27 EFI_FIRMWARE_VOLUME_HEADER FvbInfo;\r
28 //\r
29 //EFI_FV_BLOCK_MAP_ENTRY ExtraBlockMap[n];//n=0\r
30 //\r
31 EFI_FV_BLOCK_MAP_ENTRY End[1];\r
32} EFI_FVB2_MEDIA_INFO;\r
33\r
34//\r
35// This data structure contains a template of all correct FV headers, which is used to restore\r
36// Fv header if it's corrupted.\r
37//\r
38EFI_FVB2_MEDIA_INFO mPlatformFvbMediaInfo[] = {\r
39 //\r
40 // Main BIOS FVB\r
41 //\r
42 {\r
43 0,\r
44 {\r
45 {0,}, //ZeroVector[16]\r
46 EFI_FIRMWARE_FILE_SYSTEM2_GUID,\r
47 0,\r
48 EFI_FVH_SIGNATURE,\r
49 0x0004feff, // check MdePkg/Include/Pi/PiFirmwareVolume.h for details on EFI_FVB_ATTRIBUTES_2\r
50 sizeof (EFI_FIRMWARE_VOLUME_HEADER) + sizeof (EFI_FV_BLOCK_MAP_ENTRY),\r
51 0, //CheckSum, check the FD for the value.\r
52 0, //ExtHeaderOffset\r
53 {0,}, //Reserved[1]\r
54 2, //Revision\r
55 {\r
56 {\r
57 0,\r
58 0,\r
59 }\r
60 }\r
61 },\r
62 {\r
63 {\r
64 0,\r
65 0\r
66 }\r
67 }\r
68 },\r
69 //\r
70 // Systen NvStorage FVB\r
71 //\r
72 {\r
73 0,\r
74 {\r
75 {0,}, //ZeroVector[16]\r
76 EFI_SYSTEM_NV_DATA_FV_GUID,\r
77 0,\r
78 EFI_FVH_SIGNATURE,\r
79 0x0004feff, // check MdePkg/Include/Pi/PiFirmwareVolume.h for details on EFI_FVB_ATTRIBUTES_2\r
80 sizeof (EFI_FIRMWARE_VOLUME_HEADER) + sizeof (EFI_FV_BLOCK_MAP_ENTRY),\r
81 0, //CheckSum which will be calucated dynamically.\r
82 0, //ExtHeaderOffset\r
83 {0,}, //Reserved[1]\r
84 2, //Revision\r
85 {\r
86 {\r
87 0,\r
88 0,\r
89 }\r
90 }\r
91 },\r
92 {\r
93 {\r
94 0,\r
95 0\r
96 }\r
97 }\r
98 },\r
99 //\r
100 // Recovery BIOS FVB\r
101 //\r
102 {\r
103 0,\r
104 {\r
105 {0,}, //ZeroVector[16]\r
106 EFI_FIRMWARE_FILE_SYSTEM2_GUID,\r
107 0,\r
108 EFI_FVH_SIGNATURE,\r
109 0x0004feff, // check MdePkg/Include/Pi/PiFirmwareVolume.h for details on EFI_FVB_ATTRIBUTES_2\r
110 sizeof (EFI_FIRMWARE_VOLUME_HEADER) + sizeof (EFI_FV_BLOCK_MAP_ENTRY),\r
111 0, //CheckSum which will be calucated dynamically.\r
112 0, //ExtHeaderOffset\r
113 {0,}, //Reserved[1]\r
114 2, //Revision\r
115 {\r
116 {\r
117 0,\r
118 0,\r
119 }\r
120 }\r
121 },\r
122 {\r
123 {\r
124 0,\r
125 0\r
126 }\r
127 }\r
128 },\r
129 //\r
130 // Payload FVB\r
131 //\r
132 {\r
133 0,\r
134 {\r
135 {0,}, //ZeroVector[16]\r
136 EFI_FIRMWARE_FILE_SYSTEM2_GUID,\r
137 0,\r
138 EFI_FVH_SIGNATURE,\r
139 0x0004feff, // check MdePkg/Include/Pi/PiFirmwareVolume.h for details on EFI_FVB_ATTRIBUTES_2\r
140 sizeof (EFI_FIRMWARE_VOLUME_HEADER) + sizeof (EFI_FV_BLOCK_MAP_ENTRY),\r
141 0, //CheckSum which will be calucated dynamically.\r
142 0x60, //ExtHeaderOffset\r
143 {0,}, //Reserved[1]\r
144 2, //Revision\r
145 {\r
146 {\r
147 0,\r
148 0,\r
149 }\r
150 }\r
151 },\r
152 {\r
153 {\r
154 0,\r
155 0\r
156 }\r
157 }\r
158 }\r
159};\r
160\r
161\r
162//\r
163// FTW working space and FTW spare space don't have FV header.\r
164// We need create one for them and use it for FVB protocol.\r
165//\r
166EFI_FVB2_MEDIA_INFO mPlatformFtwFvbInfo[] = {\r
167 //\r
168 // System variable FTW working FVB\r
169 //\r
170 {\r
171 0,\r
172 {\r
173 {0,}, //ZeroVector[16]\r
174 EFI_SYSTEM_NV_DATA_FV_GUID,\r
175 0,\r
176 EFI_FVH_SIGNATURE,\r
177 0x0004feff, // check MdePkg/Include/Pi/PiFirmwareVolume.h for details on EFI_FVB_ATTRIBUTES_2\r
178 sizeof (EFI_FIRMWARE_VOLUME_HEADER) + sizeof (EFI_FV_BLOCK_MAP_ENTRY),\r
179 0, //CheckSum which will be calucated dynamically.\r
180 0, //ExtHeaderOffset\r
181 {0,}, //Reserved[1]\r
182 2, //Revision\r
183 {\r
184 {\r
185 0,\r
186 0,\r
187 }\r
188 }\r
189 },\r
190 {\r
191 {\r
192 0,\r
193 0\r
194 }\r
195 }\r
196 },\r
197 //\r
198 // Systen NV variable FTW spare FVB\r
199 //\r
200 {\r
201 0,\r
202 {\r
203 {0,}, //ZeroVector[16]\r
204 EFI_SYSTEM_NV_DATA_FV_GUID,\r
205 0,\r
206 EFI_FVH_SIGNATURE,\r
207 0x0004feff, // check MdePkg/Include/Pi/PiFirmwareVolume.h for details on EFI_FVB_ATTRIBUTES_2\r
208 sizeof (EFI_FIRMWARE_VOLUME_HEADER) + sizeof (EFI_FV_BLOCK_MAP_ENTRY),\r
209 0, //CheckSum which will be calucated dynamically.\r
210 0, //ExtHeaderOffset\r
211 {0,}, //Reserved[1]\r
212 2, //Revision\r
213 {\r
214 {\r
215 0,\r
216 0,\r
217 }\r
218 }\r
219 },\r
220 {\r
221 {\r
222 0,\r
223 0\r
224 }\r
225 }\r
226 }\r
227};\r
228\r
229\r
230\r
231EFI_STATUS\r
232GetFtwFvbInfo (\r
233 IN EFI_PHYSICAL_ADDRESS FvBaseAddress,\r
234 OUT EFI_FIRMWARE_VOLUME_HEADER **FvbInfo\r
235 )\r
236{\r
237 UINTN Index;\r
238 EFI_FIRMWARE_VOLUME_HEADER *FvHeader;\r
239\r
240 //\r
241 // Init Fvb data\r
242 //\r
243 mPlatformFtwFvbInfo[0].BaseAddress = PcdGet32 (PcdFlashNvStorageFtwWorkingBase);\r
244 mPlatformFtwFvbInfo[0].FvbInfo.FvLength = PcdGet32 (PcdFlashNvStorageFtwWorkingSize);\r
245 mPlatformFtwFvbInfo[0].FvbInfo.BlockMap[0].NumBlocks = PcdGet32 (PcdFlashNvStorageFtwWorkingSize) / FVB_MEDIA_BLOCK_SIZE;\r
246 mPlatformFtwFvbInfo[0].FvbInfo.BlockMap[0].Length = FVB_MEDIA_BLOCK_SIZE;\r
247 ASSERT ((PcdGet32 (PcdFlashNvStorageFtwWorkingSize) % FVB_MEDIA_BLOCK_SIZE) == 0);\r
248\r
249 mPlatformFtwFvbInfo[1].BaseAddress = PcdGet32 (PcdFlashNvStorageFtwSpareBase);\r
250 mPlatformFtwFvbInfo[1].FvbInfo.FvLength = PcdGet32 (PcdFlashNvStorageFtwSpareSize);\r
251 mPlatformFtwFvbInfo[1].FvbInfo.BlockMap[0].NumBlocks = PcdGet32 (PcdFlashNvStorageFtwSpareSize) / FVB_MEDIA_BLOCK_SIZE;\r
252 mPlatformFtwFvbInfo[1].FvbInfo.BlockMap[0].Length = FVB_MEDIA_BLOCK_SIZE;\r
253 ASSERT ((PcdGet32 (PcdFlashNvStorageFtwSpareSize) % FVB_MEDIA_BLOCK_SIZE) == 0);\r
254\r
255 for (Index=0; Index < sizeof (mPlatformFtwFvbInfo)/sizeof (mPlatformFtwFvbInfo[0]); Index += 1) {\r
256 if (mPlatformFtwFvbInfo[Index].BaseAddress == FvBaseAddress) {\r
257 FvHeader = &mPlatformFtwFvbInfo[Index].FvbInfo;\r
258 //\r
259 // Update the checksum value of FV header.\r
260 //\r
261 FvHeader->Checksum = CalculateCheckSum16 ((UINT16 *) FvHeader, FvHeader->HeaderLength / sizeof (UINT16));\r
262\r
263 *FvbInfo = FvHeader;\r
264\r
265 DEBUG ((EFI_D_INFO, "\nFTW BaseAddr: 0x%lx \n", FvBaseAddress));\r
266 DEBUG ((EFI_D_INFO, "FvLength: 0x%lx \n", (*FvbInfo)->FvLength));\r
267 DEBUG ((EFI_D_INFO, "HeaderLength: 0x%x \n", (*FvbInfo)->HeaderLength));\r
268 DEBUG ((EFI_D_INFO, "FvBlockMap[0].NumBlocks: 0x%x \n", (*FvbInfo)->BlockMap[0].NumBlocks));\r
269 DEBUG ((EFI_D_INFO, "FvBlockMap[0].BlockLength: 0x%x \n", (*FvbInfo)->BlockMap[0].Length));\r
270 DEBUG ((EFI_D_INFO, "FvBlockMap[1].NumBlocks: 0x%x \n", (*FvbInfo)->BlockMap[1].NumBlocks));\r
271 DEBUG ((EFI_D_INFO, "FvBlockMap[1].BlockLength: 0x%x \n\n", (*FvbInfo)->BlockMap[1].Length));\r
272\r
273 return EFI_SUCCESS;\r
274 }\r
275 }\r
276 return EFI_NOT_FOUND;\r
277}\r
278\r
279\r
280EFI_STATUS\r
281GetFvbInfo (\r
282 IN EFI_PHYSICAL_ADDRESS FvBaseAddress,\r
283 OUT EFI_FIRMWARE_VOLUME_HEADER **FvbInfo\r
284 )\r
285{\r
286 UINTN Index;\r
287 EFI_FIRMWARE_VOLUME_HEADER *FvHeader;\r
288\r
289 //\r
290 // Init Fvb data\r
291 //\r
292 mPlatformFvbMediaInfo[0].BaseAddress = PcdGet32 (PcdFlashFvMainBase);\r
293 mPlatformFvbMediaInfo[0].FvbInfo.FvLength = PcdGet32 (PcdFlashFvMainSize);\r
294 mPlatformFvbMediaInfo[0].FvbInfo.BlockMap[0].NumBlocks = PcdGet32 (PcdFlashFvMainSize) / FVB_MEDIA_BLOCK_SIZE;\r
295 mPlatformFvbMediaInfo[0].FvbInfo.BlockMap[0].Length = FVB_MEDIA_BLOCK_SIZE;\r
296 ASSERT ((PcdGet32 (PcdFlashFvMainSize) % FVB_MEDIA_BLOCK_SIZE) == 0);\r
297\r
298 mPlatformFvbMediaInfo[1].BaseAddress = PcdGet32 (PcdFlashNvStorageVariableBase);\r
299 mPlatformFvbMediaInfo[1].FvbInfo.FvLength = PcdGet32 (PcdFlashNvStorageVariableSize);\r
300 mPlatformFvbMediaInfo[1].FvbInfo.BlockMap[0].NumBlocks = PcdGet32 (PcdFlashNvStorageVariableSize) / FVB_MEDIA_BLOCK_SIZE;\r
301 mPlatformFvbMediaInfo[1].FvbInfo.BlockMap[0].Length = FVB_MEDIA_BLOCK_SIZE;\r
302 ASSERT ((PcdGet32 (PcdFlashNvStorageVariableSize) % FVB_MEDIA_BLOCK_SIZE) == 0);\r
303\r
304 mPlatformFvbMediaInfo[2].BaseAddress = PcdGet32 (PcdFlashFvRecoveryBase);\r
305 mPlatformFvbMediaInfo[2].FvbInfo.FvLength = PcdGet32 (PcdFlashFvRecoverySize);\r
306 mPlatformFvbMediaInfo[2].FvbInfo.BlockMap[0].NumBlocks = PcdGet32 (PcdFlashFvRecoverySize) / FVB_MEDIA_BLOCK_SIZE;\r
307 mPlatformFvbMediaInfo[2].FvbInfo.BlockMap[0].Length = FVB_MEDIA_BLOCK_SIZE;\r
308 ASSERT ((PcdGet32 (PcdFlashFvRecoverySize) % FVB_MEDIA_BLOCK_SIZE) == 0);\r
309\r
310 mPlatformFvbMediaInfo[3].BaseAddress = PcdGet32 (PcdFlashFvPayloadBase);\r
311 mPlatformFvbMediaInfo[3].FvbInfo.FvLength = PcdGet32 (PcdFlashFvPayloadSize);\r
312 mPlatformFvbMediaInfo[3].FvbInfo.BlockMap[0].NumBlocks = PcdGet32 (PcdFlashFvPayloadSize) / FVB_MEDIA_BLOCK_SIZE;\r
313 mPlatformFvbMediaInfo[3].FvbInfo.BlockMap[0].Length = FVB_MEDIA_BLOCK_SIZE;\r
314 ASSERT ((PcdGet32 (PcdFlashFvPayloadSize) % FVB_MEDIA_BLOCK_SIZE) == 0);\r
315\r
316 for (Index=0; Index < sizeof (mPlatformFvbMediaInfo)/sizeof (mPlatformFvbMediaInfo[0]); Index += 1) {\r
317 if (mPlatformFvbMediaInfo[Index].BaseAddress == FvBaseAddress) {\r
318 FvHeader = &mPlatformFvbMediaInfo[Index].FvbInfo;\r
319 //\r
320 // Update the checksum value of FV header.\r
321 //\r
322 FvHeader->Checksum = CalculateCheckSum16 ((UINT16 *) FvHeader, FvHeader->HeaderLength / sizeof (UINT16));\r
323\r
324 *FvbInfo = FvHeader;\r
325\r
326 DEBUG ((EFI_D_INFO, "\nBaseAddr: 0x%lx \n", FvBaseAddress));\r
327 DEBUG ((EFI_D_INFO, "FvLength: 0x%lx \n", (*FvbInfo)->FvLength));\r
328 DEBUG ((EFI_D_INFO, "HeaderLength: 0x%x \n", (*FvbInfo)->HeaderLength));\r
329 DEBUG ((EFI_D_INFO, "FvBlockMap[0].NumBlocks: 0x%x \n", (*FvbInfo)->BlockMap[0].NumBlocks));\r
330 DEBUG ((EFI_D_INFO, "FvBlockMap[0].BlockLength: 0x%x \n", (*FvbInfo)->BlockMap[0].Length));\r
331 DEBUG ((EFI_D_INFO, "FvBlockMap[1].NumBlocks: 0x%x \n", (*FvbInfo)->BlockMap[1].NumBlocks));\r
332 DEBUG ((EFI_D_INFO, "FvBlockMap[1].BlockLength: 0x%x \n\n", (*FvbInfo)->BlockMap[1].Length));\r
333\r
334 return EFI_SUCCESS;\r
335 }\r
336 }\r
337 return EFI_NOT_FOUND;\r
338}\r