1 /** @file
2   The header file for Firmware volume block driver.
3 
4 Copyright (c) 2006  - 2014, Intel Corporation. All rights reserved.<BR>
5 
6 
7   This program and the accompanying materials are licensed and made available under
8 
9   the terms and conditions of the BSD License that accompanies this distribution.
10 
11   The full text of the license may be found at
12 
13   http://opensource.org/licenses/bsd-license.php.
14 
15 
16 
17   THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
18 
19   WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
20 
21 
22 
23 
24 **/
25 
26 #ifndef _FW_BLOCK_SERVICE_H
27 #define _FW_BLOCK_SERVICE_H
28 
29 #include <Guid/EventGroup.h>
30 #include <Guid/FirmwareFileSystem2.h>
31 #include <Guid/SystemNvDataGuid.h>
32 #include <Protocol/DevicePath.h>
33 #include <Protocol/FirmwareVolumeBlock.h>
34 
35 #include <Library/UefiDriverEntryPoint.h>
36 #include <Library/UefiBootServicesTableLib.h>
37 #include <Library/UefiLib.h>
38 #include <Library/BaseLib.h>
39 #include <Library/DebugLib.h>
40 #include <Library/BaseMemoryLib.h>
41 #include <Library/IoLib.h>
42 #include <Library/CacheMaintenanceLib.h>
43 #include <Library/MemoryAllocationLib.h>
44 #include <Library/PcdLib.h>
45 #include <Library/FlashDeviceLib.h>
46 #include <Library/DevicePathLib.h>
47 
48 //
49 // Define two helper macro to extract the Capability field or Status field in FVB
50 // bit fields.
51 //
52 #define EFI_FVB2_CAPABILITIES (EFI_FVB2_READ_DISABLED_CAP | \
53                               EFI_FVB2_READ_ENABLED_CAP | \
54                               EFI_FVB2_WRITE_DISABLED_CAP | \
55                               EFI_FVB2_WRITE_ENABLED_CAP | \
56                               EFI_FVB2_LOCK_CAP \
57                               )
58 
59 #define EFI_FVB2_STATUS (EFI_FVB2_READ_STATUS | EFI_FVB2_WRITE_STATUS | EFI_FVB2_LOCK_STATUS)
60 
61 
62 typedef struct {
63   UINTN                       FvBase;
64   UINTN                       NumOfBlocks;
65   //
66   // Note!!!: VolumeHeader must be the last element
67   // of the structure.
68   //
69   EFI_FIRMWARE_VOLUME_HEADER  VolumeHeader;
70 } EFI_FW_VOL_INSTANCE;
71 
72 typedef struct {
73   EFI_FW_VOL_INSTANCE         *FvInstance;
74   UINT32                      NumFv;
75 } FWB_GLOBAL;
76 
77 //
78 // Fvb Protocol instance data.
79 //
80 #define FVB_DEVICE_FROM_THIS(a) CR(a, EFI_FW_VOL_BLOCK_DEVICE, FwVolBlockInstance, FVB_DEVICE_SIGNATURE)
81 #define FVB_EXTEND_DEVICE_FROM_THIS(a) CR(a, EFI_FW_VOL_BLOCK_DEVICE, FvbExtension, FVB_DEVICE_SIGNATURE)
82 #define FVB_DEVICE_SIGNATURE       SIGNATURE_32('F','V','B','C')
83 
84 typedef struct {
85   MEDIA_FW_VOL_DEVICE_PATH  FvDevPath;
86   EFI_DEVICE_PATH_PROTOCOL  EndDevPath;
87 } FV_PIWG_DEVICE_PATH;
88 
89 typedef struct {
90   MEMMAP_DEVICE_PATH          MemMapDevPath;
91   EFI_DEVICE_PATH_PROTOCOL    EndDevPath;
92 } FV_MEMMAP_DEVICE_PATH;
93 
94 typedef struct {
95   UINT32                                Signature;
96   EFI_DEVICE_PATH_PROTOCOL              *DevicePath;
97   UINTN                                 Instance;
98   EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL    FwVolBlockInstance;
99 } EFI_FW_VOL_BLOCK_DEVICE;
100 
101 EFI_STATUS
102 GetFvbInfo (
103   IN  EFI_PHYSICAL_ADDRESS              FvBaseAddress,
104   OUT EFI_FIRMWARE_VOLUME_HEADER        **FvbInfo
105   );
106 
107 //
108 // Protocol APIs
109 //
110 EFI_STATUS
111 EFIAPI
112 FvbProtocolGetAttributes (
113   IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL   *This,
114   OUT EFI_FVB_ATTRIBUTES_2                      *Attributes
115   );
116 
117 EFI_STATUS
118 EFIAPI
119 FvbProtocolSetAttributes (
120   IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL   *This,
121   IN OUT EFI_FVB_ATTRIBUTES_2                   *Attributes
122   );
123 
124 EFI_STATUS
125 EFIAPI
126 FvbProtocolGetPhysicalAddress (
127   IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL  *This,
128        OUT EFI_PHYSICAL_ADDRESS                *Address
129   );
130 
131 EFI_STATUS
132 EFIAPI
133 FvbProtocolGetBlockSize (
134   IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL  *This,
135   IN  EFI_LBA                            Lba,
136   OUT UINTN                              *BlockSize,
137   OUT UINTN                              *NumOfBlocks
138   );
139 
140 EFI_STATUS
141 EFIAPI
142 FvbProtocolRead (
143   IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL   *This,
144   IN EFI_LBA                              Lba,
145   IN UINTN                                Offset,
146   IN OUT UINTN                            *NumBytes,
147   OUT UINT8                                *Buffer
148   );
149 
150 EFI_STATUS
151 EFIAPI
152 FvbProtocolWrite (
153   IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL   *This,
154   IN EFI_LBA                              Lba,
155   IN UINTN                                Offset,
156   IN OUT UINTN                            *NumBytes,
157   IN UINT8                                *Buffer
158   );
159 
160 EFI_STATUS
161 EFIAPI
162 FvbProtocolEraseBlocks (
163   IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL    *This,
164   ...
165   );
166 
167 EFI_FW_VOL_INSTANCE *
168 GetFvbInstance (
169   IN  UINTN                              Instance
170   );
171 
172 BOOLEAN
173 IsFvHeaderValid (
174   IN       EFI_PHYSICAL_ADDRESS          FvBase,
175   IN CONST EFI_FIRMWARE_VOLUME_HEADER    *FwVolHeader
176   );
177 
178 VOID
179 InstallFvbProtocol (
180   IN  EFI_FW_VOL_INSTANCE               *FwhInstance,
181   IN  UINTN                             InstanceNum
182   );
183 
184 EFI_STATUS
185 FvbInitialize (
186   VOID
187   );
188 
189 extern FWB_GLOBAL              mFvbModuleGlobal;
190 extern EFI_FW_VOL_BLOCK_DEVICE mFvbDeviceTemplate;
191 extern FV_MEMMAP_DEVICE_PATH   mFvMemmapDevicePathTemplate;
192 extern FV_PIWG_DEVICE_PATH     mFvPIWGDevicePathTemplate;
193 extern UINT32                  mPlatformFvBaseAddress[3];
194 
195 #endif
196 
197