1/** @file
2  The header file for Firmware volume block driver.
3
4Copyright (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
62typedef 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
72typedef 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
84typedef struct {
85  MEDIA_FW_VOL_DEVICE_PATH  FvDevPath;
86  EFI_DEVICE_PATH_PROTOCOL  EndDevPath;
87} FV_PIWG_DEVICE_PATH;
88
89typedef struct {
90  MEMMAP_DEVICE_PATH          MemMapDevPath;
91  EFI_DEVICE_PATH_PROTOCOL    EndDevPath;
92} FV_MEMMAP_DEVICE_PATH;
93
94typedef 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
101EFI_STATUS
102GetFvbInfo (
103  IN  EFI_PHYSICAL_ADDRESS              FvBaseAddress,
104  OUT EFI_FIRMWARE_VOLUME_HEADER        **FvbInfo
105  );
106
107//
108// Protocol APIs
109//
110EFI_STATUS
111EFIAPI
112FvbProtocolGetAttributes (
113  IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL   *This,
114  OUT EFI_FVB_ATTRIBUTES_2                      *Attributes
115  );
116
117EFI_STATUS
118EFIAPI
119FvbProtocolSetAttributes (
120  IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL   *This,
121  IN OUT EFI_FVB_ATTRIBUTES_2                   *Attributes
122  );
123
124EFI_STATUS
125EFIAPI
126FvbProtocolGetPhysicalAddress (
127  IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL  *This,
128       OUT EFI_PHYSICAL_ADDRESS                *Address
129  );
130
131EFI_STATUS
132EFIAPI
133FvbProtocolGetBlockSize (
134  IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL  *This,
135  IN  EFI_LBA                            Lba,
136  OUT UINTN                              *BlockSize,
137  OUT UINTN                              *NumOfBlocks
138  );
139
140EFI_STATUS
141EFIAPI
142FvbProtocolRead (
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
150EFI_STATUS
151EFIAPI
152FvbProtocolWrite (
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
160EFI_STATUS
161EFIAPI
162FvbProtocolEraseBlocks (
163  IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL    *This,
164  ...
165  );
166
167EFI_FW_VOL_INSTANCE *
168GetFvbInstance (
169  IN  UINTN                              Instance
170  );
171
172BOOLEAN
173IsFvHeaderValid (
174  IN       EFI_PHYSICAL_ADDRESS          FvBase,
175  IN CONST EFI_FIRMWARE_VOLUME_HEADER    *FwVolHeader
176  );
177
178VOID
179InstallFvbProtocol (
180  IN  EFI_FW_VOL_INSTANCE               *FwhInstance,
181  IN  UINTN                             InstanceNum
182  );
183
184EFI_STATUS
185FvbInitialize (
186  VOID
187  );
188
189extern FWB_GLOBAL              mFvbModuleGlobal;
190extern EFI_FW_VOL_BLOCK_DEVICE mFvbDeviceTemplate;
191extern FV_MEMMAP_DEVICE_PATH   mFvMemmapDevicePathTemplate;
192extern FV_PIWG_DEVICE_PATH     mFvPIWGDevicePathTemplate;
193extern UINT32                  mPlatformFvBaseAddress[3];
194
195#endif
196
197