1 /**@file
2 
3   Copyright (c) 2006, Intel Corporation. All rights reserved.<BR>
4 
5   This program and the accompanying materials are licensed and made available
6   under the terms and conditions of the BSD License which accompanies this
7   distribution.  The full text of the license may be found at
8   http://opensource.org/licenses/bsd-license.php
9 
10   THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
11   WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
12 
13   Module Name:
14 
15     FwBlockService.h
16 
17   Abstract:
18 
19     Firmware volume block driver for Intel Firmware Hub (FWH) device
20 
21 **/
22 
23 #ifndef _FW_BLOCK_SERVICE_H
24 #define _FW_BLOCK_SERVICE_H
25 
26 typedef struct {
27   UINTN                       FvBase;
28   UINTN                       NumOfBlocks;
29   EFI_FIRMWARE_VOLUME_HEADER  VolumeHeader;
30 } EFI_FW_VOL_INSTANCE;
31 
32 typedef struct {
33   UINT32              NumFv;
34   EFI_FW_VOL_INSTANCE *FvInstance;
35 } ESAL_FWB_GLOBAL;
36 
37 extern ESAL_FWB_GLOBAL *mFvbModuleGlobal;
38 
39 //
40 // Fvb Protocol instance data
41 //
42 #define FVB_DEVICE_FROM_THIS(a) CR (a, EFI_FW_VOL_BLOCK_DEVICE, \
43                                   FwVolBlockInstance, FVB_DEVICE_SIGNATURE)
44 
45 #define FVB_EXTEND_DEVICE_FROM_THIS(a) CR (a, EFI_FW_VOL_BLOCK_DEVICE, \
46                                          FvbExtension, FVB_DEVICE_SIGNATURE)
47 
48 #define FVB_DEVICE_SIGNATURE            SIGNATURE_32 ('F', 'V', 'B', 'N')
49 
50 typedef struct {
51   MEDIA_FW_VOL_DEVICE_PATH  FvDevPath;
52   EFI_DEVICE_PATH_PROTOCOL  EndDevPath;
53 } FV_PIWG_DEVICE_PATH;
54 
55 typedef struct {
56   MEMMAP_DEVICE_PATH          MemMapDevPath;
57   EFI_DEVICE_PATH_PROTOCOL    EndDevPath;
58 } FV_MEMMAP_DEVICE_PATH;
59 
60 typedef struct {
61   UINTN                               Signature;
62   EFI_DEVICE_PATH_PROTOCOL            *DevicePath;
63   UINTN                               Instance;
64   EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL  FwVolBlockInstance;
65 } EFI_FW_VOL_BLOCK_DEVICE;
66 
67 EFI_STATUS
68 GetFvbInfo (
69   IN  UINT64                            FvLength,
70   OUT EFI_FIRMWARE_VOLUME_HEADER        **FvbInfo
71   );
72 
73 EFI_STATUS
74 FvbSetVolumeAttributes (
75   IN UINTN                                Instance,
76   IN OUT EFI_FVB_ATTRIBUTES_2             *Attributes,
77   IN ESAL_FWB_GLOBAL                      *Global
78   );
79 
80 EFI_STATUS
81 FvbGetVolumeAttributes (
82   IN UINTN                                Instance,
83   OUT EFI_FVB_ATTRIBUTES_2                *Attributes,
84   IN ESAL_FWB_GLOBAL                      *Global
85   );
86 
87 EFI_STATUS
88 FvbGetPhysicalAddress (
89   IN UINTN                                Instance,
90   OUT EFI_PHYSICAL_ADDRESS                *Address,
91   IN ESAL_FWB_GLOBAL                      *Global
92   );
93 
94 EFI_STATUS
95 EFIAPI
96 FvbInitialize (
97   IN EFI_HANDLE         ImageHandle,
98   IN EFI_SYSTEM_TABLE   *SystemTable
99   );
100 
101 
102 VOID
103 EFIAPI
104 FvbClassAddressChangeEvent (
105   IN EFI_EVENT        Event,
106   IN VOID             *Context
107   );
108 
109 EFI_STATUS
110 FvbGetLbaAddress (
111   IN  UINTN                               Instance,
112   IN  EFI_LBA                             Lba,
113   OUT UINTN                               *LbaAddress,
114   OUT UINTN                               *LbaLength,
115   OUT UINTN                               *NumOfBlocks,
116   IN  ESAL_FWB_GLOBAL                     *Global
117   );
118 
119 //
120 // Protocol APIs
121 //
122 EFI_STATUS
123 EFIAPI
124 FvbProtocolGetAttributes (
125   IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL           *This,
126   OUT EFI_FVB_ATTRIBUTES_2                              *Attributes
127   );
128 
129 EFI_STATUS
130 EFIAPI
131 FvbProtocolSetAttributes (
132   IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL           *This,
133   IN OUT EFI_FVB_ATTRIBUTES_2                           *Attributes
134   );
135 
136 EFI_STATUS
137 EFIAPI
138 FvbProtocolGetPhysicalAddress (
139   IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL           *This,
140   OUT EFI_PHYSICAL_ADDRESS                        *Address
141   );
142 
143 EFI_STATUS
144 EFIAPI
145 FvbProtocolGetBlockSize (
146   IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL           *This,
147   IN CONST EFI_LBA                                     Lba,
148   OUT UINTN                                       *BlockSize,
149   OUT UINTN                                       *NumOfBlocks
150   );
151 
152 EFI_STATUS
153 EFIAPI
154 FvbProtocolRead (
155   IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL           *This,
156   IN CONST EFI_LBA                                      Lba,
157   IN CONST UINTN                                        Offset,
158   IN OUT UINTN                                    *NumBytes,
159   IN UINT8                                        *Buffer
160   );
161 
162 EFI_STATUS
163 EFIAPI
164 FvbProtocolWrite (
165   IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL           *This,
166   IN       EFI_LBA                                      Lba,
167   IN       UINTN                                        Offset,
168   IN OUT   UINTN                                        *NumBytes,
169   IN       UINT8                                        *Buffer
170   );
171 
172 EFI_STATUS
173 EFIAPI
174 FvbProtocolEraseBlocks (
175   IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL    *This,
176   ...
177   );
178 
179 //
180 // The following functions have different implementations dependent on the
181 // module type chosen for building this driver.
182 //
183 VOID
184 InstallProtocolInterfaces (
185   IN EFI_FW_VOL_BLOCK_DEVICE *FvbDevice
186   );
187 
188 VOID
189 InstallVirtualAddressChangeHandler (
190   VOID
191   );
192 #endif
193