]> git.proxmox.com Git - mirror_edk2.git/blob - UefiPayloadPkg/FvbRuntimeDxe/FvbService.h
UefiPayloadPkg: Add a common FVB SMM module
[mirror_edk2.git] / UefiPayloadPkg / FvbRuntimeDxe / FvbService.h
1 /** @file
2 The header file for Firmware volume block driver.
3
4 Copyright (c) 2014 - 2021, Intel Corporation. All rights reserved.<BR>
5 SPDX-License-Identifier: BSD-2-Clause-Patent
6
7 **/
8
9 #ifndef FW_BLOCK_SERVICE_H_
10 #define FW_BLOCK_SERVICE_H_
11
12 #include <Guid/EventGroup.h>
13 #include <Guid/FirmwareFileSystem2.h>
14 #include <Guid/SystemNvDataGuid.h>
15 #include <Guid/VariableFormat.h>
16 #include <Protocol/DevicePath.h>
17 #include <Protocol/FirmwareVolumeBlock.h>
18 #include <Library/UefiDriverEntryPoint.h>
19 #include <Library/UefiBootServicesTableLib.h>
20 #include <Library/UefiLib.h>
21 #include <Library/BaseLib.h>
22 #include <Library/DebugLib.h>
23 #include <Library/BaseMemoryLib.h>
24 #include <Library/IoLib.h>
25 #include <Library/CacheMaintenanceLib.h>
26 #include <Library/MemoryAllocationLib.h>
27 #include <Library/PcdLib.h>
28 #include <Library/FlashDeviceLib.h>
29 #include <Library/DevicePathLib.h>
30 #include <Library/HobLib.h>
31 #include <Library/DxeServicesLib.h>
32 #include <Guid/NvVariableInfoGuid.h>
33 #include <Register/ArchitecturalMsr.h>
34
35 //
36 // Define two helper macro to extract the Capability field or Status field in FVB
37 // bit fields
38 //
39 #define EFI_FVB2_CAPABILITIES (EFI_FVB2_READ_DISABLED_CAP | \
40 EFI_FVB2_READ_ENABLED_CAP | \
41 EFI_FVB2_WRITE_DISABLED_CAP | \
42 EFI_FVB2_WRITE_ENABLED_CAP | \
43 EFI_FVB2_LOCK_CAP \
44 )
45
46 #define EFI_FVB2_STATUS (EFI_FVB2_READ_STATUS | EFI_FVB2_WRITE_STATUS | EFI_FVB2_LOCK_STATUS)
47
48
49 typedef struct {
50 UINTN FvBase;
51 UINTN NumOfBlocks;
52 //
53 // Note!!!: VolumeHeader must be the last element
54 // of the structure.
55 //
56 EFI_FIRMWARE_VOLUME_HEADER VolumeHeader;
57 } EFI_FW_VOL_INSTANCE;
58
59
60 typedef struct {
61 EFI_FW_VOL_INSTANCE *FvInstance;
62 UINT32 NumFv;
63 UINT32 Flags;
64 } FWB_GLOBAL;
65
66 //
67 // Fvb Protocol instance data
68 //
69 #define FVB_DEVICE_FROM_THIS(a) CR(a, EFI_FW_VOL_BLOCK_DEVICE, FwVolBlockInstance, FVB_DEVICE_SIGNATURE)
70 #define FVB_EXTEND_DEVICE_FROM_THIS(a) CR(a, EFI_FW_VOL_BLOCK_DEVICE, FvbExtension, FVB_DEVICE_SIGNATURE)
71 #define FVB_DEVICE_SIGNATURE SIGNATURE_32('F','V','B','C')
72
73 typedef struct {
74 MEDIA_FW_VOL_DEVICE_PATH FvDevPath;
75 EFI_DEVICE_PATH_PROTOCOL EndDevPath;
76 } FV_PIWG_DEVICE_PATH;
77
78 typedef struct {
79 MEMMAP_DEVICE_PATH MemMapDevPath;
80 EFI_DEVICE_PATH_PROTOCOL EndDevPath;
81 } FV_MEMMAP_DEVICE_PATH;
82
83 typedef struct {
84 UINT32 Signature;
85 EFI_DEVICE_PATH_PROTOCOL *DevicePath;
86 UINTN Instance;
87 EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL FwVolBlockInstance;
88 } EFI_FW_VOL_BLOCK_DEVICE;
89
90 /**
91 Get a heathy FV header used for variable store recovery
92
93 @retval The FV header.
94
95 **/
96 EFI_FIRMWARE_VOLUME_HEADER *
97 GetFvHeaderTemplate (
98 VOID
99 );
100
101 EFI_STATUS
102 InitVariableStore (
103 VOID
104 );
105
106 //
107 // Protocol APIs
108 //
109 EFI_STATUS
110 EFIAPI
111 FvbProtocolGetAttributes (
112 IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *This,
113 OUT EFI_FVB_ATTRIBUTES_2 *Attributes
114 );
115
116 EFI_STATUS
117 EFIAPI
118 FvbProtocolSetAttributes (
119 IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *This,
120 IN OUT EFI_FVB_ATTRIBUTES_2 *Attributes
121 );
122
123 EFI_STATUS
124 EFIAPI
125 FvbProtocolGetPhysicalAddress (
126 IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *This,
127 OUT EFI_PHYSICAL_ADDRESS *Address
128 );
129
130 EFI_STATUS
131 EFIAPI
132 FvbProtocolGetBlockSize (
133 IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *This,
134 IN EFI_LBA Lba,
135 OUT UINTN *BlockSize,
136 OUT UINTN *NumOfBlocks
137 );
138
139 EFI_STATUS
140 EFIAPI
141 FvbProtocolRead (
142 IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *This,
143 IN EFI_LBA Lba,
144 IN UINTN Offset,
145 IN OUT UINTN *NumBytes,
146 OUT UINT8 *Buffer
147 );
148
149 EFI_STATUS
150 EFIAPI
151 FvbProtocolWrite (
152 IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *This,
153 IN EFI_LBA Lba,
154 IN UINTN Offset,
155 IN OUT UINTN *NumBytes,
156 IN UINT8 *Buffer
157 );
158
159 EFI_STATUS
160 EFIAPI
161 FvbProtocolEraseBlocks (
162 IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *This,
163 ...
164 );
165
166 EFI_FW_VOL_INSTANCE *
167 GetFvbInstance (
168 IN UINTN Instance
169 );
170
171 EFI_STATUS
172 InstallFvbProtocol (
173 IN EFI_FW_VOL_INSTANCE *FwhInstance,
174 IN UINTN InstanceNum
175 );
176
177 EFI_STATUS
178 FvbInitialize (
179 VOID
180 );
181
182 extern FWB_GLOBAL mFvbModuleGlobal;
183 extern EFI_FW_VOL_BLOCK_DEVICE mFvbDeviceTemplate;
184 extern FV_MEMMAP_DEVICE_PATH mFvMemmapDevicePathTemplate;
185 extern FV_PIWG_DEVICE_PATH mFvPIWGDevicePathTemplate;
186
187 #endif