]> git.proxmox.com Git - mirror_edk2.git/blame - Vlv2TbltDevicePkg/FvbRuntimeDxe/FvbInfo.c
SignedCapsulePkg: Replace [Ascii|Unicode]ValueToString
[mirror_edk2.git] / Vlv2TbltDevicePkg / FvbRuntimeDxe / FvbInfo.c
CommitLineData
3cbfba02
DW
1/**@file\r
2 Defines data structure that is the volume header found.\r
3 These data is intent to decouple FVB driver with FV header.\r
4\r
abbe4e57 5Copyright (c) 2006 - 2015, Intel Corporation. All rights reserved.<BR>\r
3cbfba02
DW
6 \r\r
7 This program and the accompanying materials are licensed and made available under\r\r
8 the terms and conditions of the BSD License that accompanies this distribution. \r\r
9 The full text of the license may be found at \r\r
10 http://opensource.org/licenses/bsd-license.php. \r\r
11 \r\r
12 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, \r\r
13 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. \r\r
14 \r\r
15\r
16**/\r
17\r
18#include <PiDxe.h>\r
19#include <Protocol/FirmwareVolumeBlock.h>\r
20#include <Library/PcdLib.h>\r
21#include <Library/DebugLib.h>\r
22#include <Library/BaseLib.h>\r
23#include <Guid/FirmwareFileSystem2.h>\r
24#include <Guid/SystemNvDataGuid.h>\r
25\r
26#define FIRMWARE_BLOCK_SIZE 0x8000\r
27#define FVB_MEDIA_BLOCK_SIZE (FIRMWARE_BLOCK_SIZE * 2)\r
28\r
29#define FV_RECOVERY_BASE_ADDRESS FixedPcdGet32(PcdFlashFvRecoveryBase)\r
30#define RECOVERY_BIOS_BLOCK_NUM (FixedPcdGet32(PcdFlashFvRecoverySize) / FVB_MEDIA_BLOCK_SIZE)\r
31\r
32#define FV_MAIN_BASE_ADDRESS FixedPcdGet32(PcdFlashFvMainBase)\r
33#define MAIN_BIOS_BLOCK_NUM (FixedPcdGet32(PcdFlashFvMainSize) / FVB_MEDIA_BLOCK_SIZE)\r
34\r
35#define NV_STORAGE_BASE_ADDRESS FixedPcdGet32(PcdFlashNvStorageVariableBase)\r
36#define SYSTEM_NV_BLOCK_NUM ((FixedPcdGet32(PcdFlashNvStorageVariableSize)+ FixedPcdGet32(PcdFlashNvStorageFtwWorkingSize) + FixedPcdGet32(PcdFlashNvStorageFtwSpareSize))/ FVB_MEDIA_BLOCK_SIZE)\r
37\r
38typedef struct {\r
39 EFI_PHYSICAL_ADDRESS BaseAddress;\r
40 EFI_FIRMWARE_VOLUME_HEADER FvbInfo;\r
41 EFI_FV_BLOCK_MAP_ENTRY End[1];\r
42} EFI_FVB2_MEDIA_INFO;\r
43\r
44//\r
45// This data structure contains a template of all correct FV headers, which is used to restore\r
46// Fv header if it's corrupted.\r
47//\r
48EFI_FVB2_MEDIA_INFO mPlatformFvbMediaInfo[] = {\r
49 //\r
50 // Main BIOS FVB\r
51 //\r
52 {\r
53 FV_MAIN_BASE_ADDRESS,\r
54 {\r
55 {0,}, //ZeroVector[16]\r
56 EFI_FIRMWARE_FILE_SYSTEM2_GUID,\r
57 FVB_MEDIA_BLOCK_SIZE * MAIN_BIOS_BLOCK_NUM,\r
58 EFI_FVH_SIGNATURE,\r
59 0x0004feff, // check MdePkg/Include/Pi/PiFirmwareVolume.h for details on EFI_FVB_ATTRIBUTES_2\r
60 sizeof (EFI_FIRMWARE_VOLUME_HEADER) + sizeof (EFI_FV_BLOCK_MAP_ENTRY),\r
61 0, //CheckSum which will be calucated dynamically.\r
62 0, //ExtHeaderOffset\r
63 {0,}, //Reserved[1]\r
64 2, //Revision\r
65 {\r
66 {\r
67 MAIN_BIOS_BLOCK_NUM,\r
68 FVB_MEDIA_BLOCK_SIZE,\r
69 }\r
70 }\r
71 },\r
72 {\r
73 {\r
74 0,\r
75 0\r
76 }\r
77 }\r
78 },\r
79\r
80 //\r
81 // Systen NvStorage FVB\r
82 //\r
83 {\r
84 NV_STORAGE_BASE_ADDRESS,\r
85 {\r
86 {0,}, //ZeroVector[16]\r
87 EFI_SYSTEM_NV_DATA_FV_GUID,\r
88 FVB_MEDIA_BLOCK_SIZE * SYSTEM_NV_BLOCK_NUM,\r
89 EFI_FVH_SIGNATURE,\r
90 0x0004feff, // check MdePkg/Include/Pi/PiFirmwareVolume.h for details on EFI_FVB_ATTRIBUTES_2\r
91 sizeof (EFI_FIRMWARE_VOLUME_HEADER) + sizeof (EFI_FV_BLOCK_MAP_ENTRY),\r
92 0, //CheckSum which will be calucated dynamically.\r
93 0, //ExtHeaderOffset\r
94 {0,}, //Reserved[1]\r
95 2, //Revision\r
96 {\r
97 {\r
98 SYSTEM_NV_BLOCK_NUM,\r
99 FVB_MEDIA_BLOCK_SIZE,\r
100 }\r
101 }\r
102 },\r
103 {\r
104 {\r
105 0,\r
106 0\r
107 }\r
108 }\r
109 },\r
110\r
111 //\r
112 // Recovery BIOS FVB\r
113 //\r
114 {\r
115 FV_RECOVERY_BASE_ADDRESS,\r
116 {\r
117 {0,}, //ZeroVector[16]\r
118 EFI_FIRMWARE_FILE_SYSTEM2_GUID,\r
119 FVB_MEDIA_BLOCK_SIZE * RECOVERY_BIOS_BLOCK_NUM,\r
120 EFI_FVH_SIGNATURE,\r
121 0x0004feff, // check MdePkg/Include/Pi/PiFirmwareVolume.h for details on EFI_FVB_ATTRIBUTES_2\r
122 sizeof (EFI_FIRMWARE_VOLUME_HEADER) + sizeof (EFI_FV_BLOCK_MAP_ENTRY),\r
123 0, //CheckSum which will be calucated dynamically.\r
124 0, //ExtHeaderOffset\r
125 {0,}, //Reserved[1]\r
126 2, //Revision\r
127 {\r
128 {\r
129 RECOVERY_BIOS_BLOCK_NUM,\r
130 FVB_MEDIA_BLOCK_SIZE,\r
131 }\r
132 }\r
133 },\r
134 {\r
135 {\r
136 0,\r
137 0\r
138 }\r
139 }\r
140 }\r
141};\r
142\r
143EFI_STATUS\r
144GetFvbInfo (\r
145 IN EFI_PHYSICAL_ADDRESS FvBaseAddress,\r
146 OUT EFI_FIRMWARE_VOLUME_HEADER **FvbInfo\r
147 )\r
148{\r
149 UINTN Index;\r
150 EFI_FIRMWARE_VOLUME_HEADER *FvHeader;\r
151\r
152 for (Index = 0; Index < sizeof (mPlatformFvbMediaInfo) / sizeof (EFI_FVB2_MEDIA_INFO); Index += 1) {\r
153 if (mPlatformFvbMediaInfo[Index].BaseAddress == FvBaseAddress) {\r
154 FvHeader = &mPlatformFvbMediaInfo[Index].FvbInfo;\r
155\r
156 //\r
157 // Update the checksum value of FV header.\r
158 //\r
abbe4e57 159 FvHeader->Checksum = CalculateCheckSum16 ((UINT16 *) FvHeader, FvHeader->HeaderLength);\r
3cbfba02
DW
160\r
161 *FvbInfo = FvHeader;\r
162\r
163 DEBUG ((EFI_D_INFO, "\nBaseAddr: 0x%lx \n", FvBaseAddress));\r
164 DEBUG ((EFI_D_INFO, "FvLength: 0x%lx \n", (*FvbInfo)->FvLength));\r
165 DEBUG ((EFI_D_INFO, "HeaderLength: 0x%x \n", (*FvbInfo)->HeaderLength));\r
166 DEBUG ((EFI_D_INFO, "FvBlockMap[0].NumBlocks: 0x%x \n", (*FvbInfo)->BlockMap[0].NumBlocks));\r
167 DEBUG ((EFI_D_INFO, "FvBlockMap[0].BlockLength: 0x%x \n", (*FvbInfo)->BlockMap[0].Length));\r
168 DEBUG ((EFI_D_INFO, "FvBlockMap[1].NumBlocks: 0x%x \n", (*FvbInfo)->BlockMap[1].NumBlocks));\r
169 DEBUG ((EFI_D_INFO, "FvBlockMap[1].BlockLength: 0x%x \n\n", (*FvbInfo)->BlockMap[1].Length));\r
170\r
171 return EFI_SUCCESS;\r
172 }\r
173 }\r
174 return EFI_NOT_FOUND;\r
175}\r