1 /**@file
2 Copyright (c) 2007, Intel Corporation. All rights reserved.<BR>
3 This program and the accompanying materials
4 are licensed and made available under the terms and conditions of the BSD License
5 which accompanies this distribution.  The full text of the license may be found at
6 http://opensource.org/licenses/bsd-license.php
7 
8 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
9 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
10 
11 Module Name:
12 
13   FwBlockService.h
14 
15 Abstract:
16 
17   Firmware volume block driver for Intel Firmware Hub (FWH) device
18 
19 **/
20 #ifndef _FW_BLOCK_SERVICE_H
21 #define _FW_BLOCK_SERVICE_H
22 
23 //
24 // The package level header files this module uses
25 //
26 #include <PiDxe.h>
27 
28 //
29 // The protocols, PPI and GUID defintions for this module
30 //
31 #include <Guid/EventGroup.h>
32 #include <Guid/FirmwareFileSystem2.h>
33 #include <Protocol/FirmwareVolumeBlock.h>
34 #include <Protocol/DevicePath.h>
35 #include <Protocol/SimpleFileSystem.h>
36 #include <Protocol/BlockIo.h>
37 #include <Library/DevicePathLib.h>
38 #include <Guid/SystemNvDataGuid.h>
39 #include <Guid/FlashMapHob.h>
40 #include <Guid/HobList.h>
41 
42 //
43 // The Library classes this module consumes
44 //
45 #include <Library/UefiLib.h>
46 #include <Library/UefiDriverEntryPoint.h>
47 #include <Library/BaseLib.h>
48 #include <Library/DxeServicesTableLib.h>
49 #include <Library/UefiRuntimeLib.h>
50 #include <Library/DebugLib.h>
51 #include <Library/HobLib.h>
52 #include <Library/BaseMemoryLib.h>
53 #include <Library/MemoryAllocationLib.h>
54 #include <Library/UefiBootServicesTableLib.h>
55 #include <Library/PcdLib.h>
56 
57 
58 #define FWH_READ_LOCK                   (1 << 2)
59 #define FWH_LOCK_DOWN                   (1 << 1)
60 #define FWH_WRITE_LOCK                  1
61 #define FWH_WRITE_STATE_STATUS          (1 << 7)
62 #define FWH_ERASE_STATUS                (1 << 5)
63 #define FWH_PROGRAM_STATUS              (1 << 4)
64 #define FWH_VPP_STATUS                  (1 << 3)
65 #define STALL_TIME                      5
66 #define FWH_ERASE_STATUS_BITS           (FWH_ERASE_STATUS || FWH_VPP_STATUS)
67 #define FWH_WRITE_STATUS_BITS           (FWH_WRITE_STATUS || FWH_VPP_STATUS)
68 
69 //
70 // BugBug: Add documentation here for data structure!!!!
71 //
72 #define FVB_PHYSICAL  0
73 #define FVB_VIRTUAL   1
74 
75 #define EFI_FVB2_CAPABILITIES (EFI_FVB2_READ_DISABLED_CAP | \
76                               EFI_FVB2_READ_ENABLED_CAP | \
77                               EFI_FVB2_WRITE_DISABLED_CAP | \
78                               EFI_FVB2_WRITE_ENABLED_CAP | \
79                               EFI_FVB2_LOCK_CAP \
80                               )
81 #define EFI_FVB2_STATUS (EFI_FVB2_READ_STATUS | EFI_FVB2_WRITE_STATUS | EFI_FVB2_LOCK_STATUS)
82 
83 typedef struct {
84   EFI_LOCK                    FvbDevLock;
85   UINTN                       FvBase[2];
86   //
87   // We can treat VolumeSignature combined with MappedFile
88   //  as a unique key to locate the mapped file.
89 #define MAX_PATH 256
90   UINT32                      VolumeId;
91   CHAR16                      MappedFile[MAX_PATH];
92   UINT32                      ActuralSize;
93   UINT32                      Offset;
94 
95   EFI_DEVICE_PATH_PROTOCOL    *Device; // only used in BS period, won't use after memory map changed
96   UINTN                       NumOfBlocks;
97   BOOLEAN                     WriteEnabled;
98   EFI_FIRMWARE_VOLUME_HEADER  VolumeHeader;
99 } EFI_FW_VOL_INSTANCE;
100 
101 typedef struct {
102   UINT32              NumFv;
103   EFI_FW_VOL_INSTANCE *FvInstance[2];
104   UINT8               *FvbScratchSpace[2];
105 } ESAL_FWB_GLOBAL;
106 
107 //
108 // Fvb Protocol instance data
109 //
110 #define FVB_DEVICE_FROM_THIS(a)         CR (a, EFI_FW_VOL_BLOCK_DEVICE, FwVolBlockInstance, FVB_DEVICE_SIGNATURE)
111 #define FVB_EXTEND_DEVICE_FROM_THIS(a)  CR (a, EFI_FW_VOL_BLOCK_DEVICE, FvbExtension, FVB_DEVICE_SIGNATURE)
112 #define FVB_DEVICE_SIGNATURE            SIGNATURE_32 ('F', 'V', 'B', 'C')
113 
114 typedef struct {
115   MEMMAP_DEVICE_PATH        MemMapDevPath;
116   EFI_DEVICE_PATH_PROTOCOL  EndDevPath;
117 } FV_DEVICE_PATH;
118 
119 typedef struct {
120   UINTN                               Signature;
121   FV_DEVICE_PATH                      DevicePath;
122   UINTN                               Instance;
123   EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL  FwVolBlockInstance;
124 } EFI_FW_VOL_BLOCK_DEVICE;
125 
126 EFI_STATUS
127 GetFvbInfo (
128   IN  EFI_PHYSICAL_ADDRESS              FvBaseAddress,
129   OUT EFI_FIRMWARE_VOLUME_HEADER        **FvbInfo
130   );
131 
132 EFI_STATUS
133 EnableFvbWrites (
134   IN  BOOLEAN   EnableWrites
135   );
136 
137 EFI_STATUS
138 PlatformGetFvbWriteBase (
139   IN  UINTN     CurrentBaseAddress,
140   IN  UINTN     *NewBaseAddress,
141   IN  BOOLEAN   *WriteEnabled
142   );
143 
144 EFI_STATUS
145 EnablePlatformFvb (
146   VOID
147   );
148 
149 BOOLEAN
150 SetPlatformFvbLock (
151   IN UINTN  LbaAddress
152   );
153 
154 EFI_STATUS
155 FvbReadBlock (
156   IN UINTN                                Instance,
157   IN EFI_LBA                              Lba,
158   IN UINTN                                BlockOffset,
159   IN OUT UINTN                            *NumBytes,
160   IN UINT8                                *Buffer,
161   IN ESAL_FWB_GLOBAL                      *Global,
162   IN BOOLEAN                              Virtual
163   );
164 
165 EFI_STATUS
166 FvbWriteBlock (
167   IN UINTN                                Instance,
168   IN EFI_LBA                              Lba,
169   IN UINTN                                BlockOffset,
170   IN OUT UINTN                            *NumBytes,
171   IN UINT8                                *Buffer,
172   IN ESAL_FWB_GLOBAL                      *Global,
173   IN BOOLEAN                              Virtual
174   );
175 
176 EFI_STATUS
177 FvbEraseBlock (
178   IN UINTN                                Instance,
179   IN EFI_LBA                              Lba,
180   IN ESAL_FWB_GLOBAL                      *Global,
181   IN BOOLEAN                              Virtual
182   );
183 
184 EFI_STATUS
185 FvbSetVolumeAttributes (
186   IN UINTN                                Instance,
187   IN OUT EFI_FVB_ATTRIBUTES_2             *Attributes,
188   IN ESAL_FWB_GLOBAL                      *Global,
189   IN BOOLEAN                              Virtual
190   );
191 
192 EFI_STATUS
193 FvbGetVolumeAttributes (
194   IN UINTN                                Instance,
195   OUT EFI_FVB_ATTRIBUTES_2                *Attributes,
196   IN ESAL_FWB_GLOBAL                      *Global,
197   IN BOOLEAN                              Virtual
198   );
199 
200 EFI_STATUS
201 FvbGetPhysicalAddress (
202   IN UINTN                                Instance,
203   OUT EFI_PHYSICAL_ADDRESS                *Address,
204   IN ESAL_FWB_GLOBAL                      *Global,
205   IN BOOLEAN                              Virtual
206   );
207 
208 EFI_STATUS
209 EFIAPI
210 FvbInitialize (
211   IN EFI_HANDLE         ImageHandle,
212   IN EFI_SYSTEM_TABLE   *SystemTable
213   );
214 
215 VOID
216 EFIAPI
217 FvbClassAddressChangeEvent (
218   IN EFI_EVENT        Event,
219   IN VOID             *Context
220   );
221 
222 EFI_STATUS
223 FvbSpecificInitialize (
224   IN  ESAL_FWB_GLOBAL   *mFvbModuleGlobal
225   );
226 
227 EFI_STATUS
228 FvbGetLbaAddress (
229   IN  UINTN                               Instance,
230   IN  EFI_LBA                             Lba,
231   OUT UINTN                               *LbaAddress,
232   OUT UINTN                               *LbaLength,
233   OUT UINTN                               *NumOfBlocks,
234   IN  ESAL_FWB_GLOBAL                     *Global,
235   IN  BOOLEAN                             Virtual
236   );
237 
238 //
239 // Protocol APIs
240 //
241 EFI_STATUS
242 EFIAPI
243 FvbProtocolGetAttributes (
244   IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL          *This,
245   OUT      EFI_FVB_ATTRIBUTES_2                        *Attributes
246   );
247 
248 EFI_STATUS
249 EFIAPI
250 FvbProtocolSetAttributes (
251   IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL       *This,
252   IN OUT   EFI_FVB_ATTRIBUTES_2                     *Attributes
253   );
254 
255 EFI_STATUS
256 EFIAPI
257 FvbProtocolGetPhysicalAddress (
258   IN  CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL          *This,
259   OUT       EFI_PHYSICAL_ADDRESS                        *Address
260   );
261 
262 EFI_STATUS
263 EFIAPI
264 FvbProtocolGetBlockSize (
265   IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL           *This,
266   IN  EFI_LBA                                     Lba,
267   OUT UINTN                                       *BlockSize,
268   OUT UINTN                                       *NumOfBlocks
269   );
270 
271 EFI_STATUS
272 EFIAPI
273 FvbProtocolRead (
274   IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL     *This,
275   IN EFI_LBA                                      Lba,
276   IN UINTN                                        Offset,
277   IN OUT UINTN                                    *NumBytes,
278   IN UINT8                                        *Buffer
279   );
280 
281 EFI_STATUS
282 EFIAPI
283 FvbProtocolWrite (
284   IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL     *This,
285   IN EFI_LBA                                      Lba,
286   IN UINTN                                        Offset,
287   IN OUT UINTN                                    *NumBytes,
288   IN UINT8                                        *Buffer
289   );
290 
291 EFI_STATUS
292 EFIAPI
293 FvbProtocolEraseBlocks (
294   IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL    *This,
295   ...
296   );
297 
298 #endif
299