1a4ce9ffd470dbbab07ad1a9caeab5049b5a4bb6aJordan Justen/**@file
2a4ce9ffd470dbbab07ad1a9caeab5049b5a4bb6aJordan Justen
3ea0d111efe756dcc53d355bc25d17d9a925c6007Laszlo Ersek  Copyright (c) 2006, Intel Corporation. All rights reserved.<BR>
4141f0c644512e4da3bad7a0382fe82aa8c460762Laszlo Ersek
5ea0d111efe756dcc53d355bc25d17d9a925c6007Laszlo Ersek  This program and the accompanying materials are licensed and made available
6ea0d111efe756dcc53d355bc25d17d9a925c6007Laszlo Ersek  under the terms and conditions of the BSD License which accompanies this
7ea0d111efe756dcc53d355bc25d17d9a925c6007Laszlo Ersek  distribution.  The full text of the license may be found at
8ea0d111efe756dcc53d355bc25d17d9a925c6007Laszlo Ersek  http://opensource.org/licenses/bsd-license.php
9a4ce9ffd470dbbab07ad1a9caeab5049b5a4bb6aJordan Justen
10ea0d111efe756dcc53d355bc25d17d9a925c6007Laszlo Ersek  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
11ea0d111efe756dcc53d355bc25d17d9a925c6007Laszlo Ersek  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
12a4ce9ffd470dbbab07ad1a9caeab5049b5a4bb6aJordan Justen
13ea0d111efe756dcc53d355bc25d17d9a925c6007Laszlo Ersek  Module Name:
14141f0c644512e4da3bad7a0382fe82aa8c460762Laszlo Ersek
15ea0d111efe756dcc53d355bc25d17d9a925c6007Laszlo Ersek    FwBlockService.h
16a4ce9ffd470dbbab07ad1a9caeab5049b5a4bb6aJordan Justen
17ea0d111efe756dcc53d355bc25d17d9a925c6007Laszlo Ersek  Abstract:
18ea0d111efe756dcc53d355bc25d17d9a925c6007Laszlo Ersek
19ea0d111efe756dcc53d355bc25d17d9a925c6007Laszlo Ersek    Firmware volume block driver for Intel Firmware Hub (FWH) device
20a4ce9ffd470dbbab07ad1a9caeab5049b5a4bb6aJordan Justen
21a4ce9ffd470dbbab07ad1a9caeab5049b5a4bb6aJordan Justen**/
22a4ce9ffd470dbbab07ad1a9caeab5049b5a4bb6aJordan Justen
23a4ce9ffd470dbbab07ad1a9caeab5049b5a4bb6aJordan Justen#ifndef _FW_BLOCK_SERVICE_H
24a4ce9ffd470dbbab07ad1a9caeab5049b5a4bb6aJordan Justen#define _FW_BLOCK_SERVICE_H
25a4ce9ffd470dbbab07ad1a9caeab5049b5a4bb6aJordan Justen
26a4ce9ffd470dbbab07ad1a9caeab5049b5a4bb6aJordan Justentypedef struct {
27109301e5a14ec4bfd0ce93e15439e30d7ccd8b0aLaszlo Ersek  UINTN                       FvBase;
28a4ce9ffd470dbbab07ad1a9caeab5049b5a4bb6aJordan Justen  UINTN                       NumOfBlocks;
29a4ce9ffd470dbbab07ad1a9caeab5049b5a4bb6aJordan Justen  EFI_FIRMWARE_VOLUME_HEADER  VolumeHeader;
30a4ce9ffd470dbbab07ad1a9caeab5049b5a4bb6aJordan Justen} EFI_FW_VOL_INSTANCE;
31a4ce9ffd470dbbab07ad1a9caeab5049b5a4bb6aJordan Justen
32a4ce9ffd470dbbab07ad1a9caeab5049b5a4bb6aJordan Justentypedef struct {
33a4ce9ffd470dbbab07ad1a9caeab5049b5a4bb6aJordan Justen  UINT32              NumFv;
34109301e5a14ec4bfd0ce93e15439e30d7ccd8b0aLaszlo Ersek  EFI_FW_VOL_INSTANCE *FvInstance;
35a4ce9ffd470dbbab07ad1a9caeab5049b5a4bb6aJordan Justen} ESAL_FWB_GLOBAL;
36a4ce9ffd470dbbab07ad1a9caeab5049b5a4bb6aJordan Justen
371767877a31b3ce191ddae6cb9aefba99a733fe20Laszlo Ersekextern ESAL_FWB_GLOBAL *mFvbModuleGlobal;
381767877a31b3ce191ddae6cb9aefba99a733fe20Laszlo Ersek
39a4ce9ffd470dbbab07ad1a9caeab5049b5a4bb6aJordan Justen//
40a4ce9ffd470dbbab07ad1a9caeab5049b5a4bb6aJordan Justen// Fvb Protocol instance data
41a4ce9ffd470dbbab07ad1a9caeab5049b5a4bb6aJordan Justen//
42ea0d111efe756dcc53d355bc25d17d9a925c6007Laszlo Ersek#define FVB_DEVICE_FROM_THIS(a) CR (a, EFI_FW_VOL_BLOCK_DEVICE, \
43ea0d111efe756dcc53d355bc25d17d9a925c6007Laszlo Ersek                                  FwVolBlockInstance, FVB_DEVICE_SIGNATURE)
44ea0d111efe756dcc53d355bc25d17d9a925c6007Laszlo Ersek
45ea0d111efe756dcc53d355bc25d17d9a925c6007Laszlo Ersek#define FVB_EXTEND_DEVICE_FROM_THIS(a) CR (a, EFI_FW_VOL_BLOCK_DEVICE, \
46ea0d111efe756dcc53d355bc25d17d9a925c6007Laszlo Ersek                                         FvbExtension, FVB_DEVICE_SIGNATURE)
47ea0d111efe756dcc53d355bc25d17d9a925c6007Laszlo Ersek
48a4ce9ffd470dbbab07ad1a9caeab5049b5a4bb6aJordan Justen#define FVB_DEVICE_SIGNATURE            SIGNATURE_32 ('F', 'V', 'B', 'N')
49a4ce9ffd470dbbab07ad1a9caeab5049b5a4bb6aJordan Justen
50a4ce9ffd470dbbab07ad1a9caeab5049b5a4bb6aJordan Justentypedef struct {
51a4ce9ffd470dbbab07ad1a9caeab5049b5a4bb6aJordan Justen  MEDIA_FW_VOL_DEVICE_PATH  FvDevPath;
52a4ce9ffd470dbbab07ad1a9caeab5049b5a4bb6aJordan Justen  EFI_DEVICE_PATH_PROTOCOL  EndDevPath;
53a4ce9ffd470dbbab07ad1a9caeab5049b5a4bb6aJordan Justen} FV_PIWG_DEVICE_PATH;
54a4ce9ffd470dbbab07ad1a9caeab5049b5a4bb6aJordan Justen
55a4ce9ffd470dbbab07ad1a9caeab5049b5a4bb6aJordan Justentypedef struct {
56a4ce9ffd470dbbab07ad1a9caeab5049b5a4bb6aJordan Justen  MEMMAP_DEVICE_PATH          MemMapDevPath;
57a4ce9ffd470dbbab07ad1a9caeab5049b5a4bb6aJordan Justen  EFI_DEVICE_PATH_PROTOCOL    EndDevPath;
58a4ce9ffd470dbbab07ad1a9caeab5049b5a4bb6aJordan Justen} FV_MEMMAP_DEVICE_PATH;
59a4ce9ffd470dbbab07ad1a9caeab5049b5a4bb6aJordan Justen
60a4ce9ffd470dbbab07ad1a9caeab5049b5a4bb6aJordan Justentypedef struct {
61a4ce9ffd470dbbab07ad1a9caeab5049b5a4bb6aJordan Justen  UINTN                               Signature;
62a4ce9ffd470dbbab07ad1a9caeab5049b5a4bb6aJordan Justen  EFI_DEVICE_PATH_PROTOCOL            *DevicePath;
63a4ce9ffd470dbbab07ad1a9caeab5049b5a4bb6aJordan Justen  UINTN                               Instance;
64a4ce9ffd470dbbab07ad1a9caeab5049b5a4bb6aJordan Justen  EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL  FwVolBlockInstance;
65a4ce9ffd470dbbab07ad1a9caeab5049b5a4bb6aJordan Justen} EFI_FW_VOL_BLOCK_DEVICE;
66a4ce9ffd470dbbab07ad1a9caeab5049b5a4bb6aJordan Justen
67a4ce9ffd470dbbab07ad1a9caeab5049b5a4bb6aJordan JustenEFI_STATUS
68a4ce9ffd470dbbab07ad1a9caeab5049b5a4bb6aJordan JustenGetFvbInfo (
69a4ce9ffd470dbbab07ad1a9caeab5049b5a4bb6aJordan Justen  IN  UINT64                            FvLength,
70a4ce9ffd470dbbab07ad1a9caeab5049b5a4bb6aJordan Justen  OUT EFI_FIRMWARE_VOLUME_HEADER        **FvbInfo
71a4ce9ffd470dbbab07ad1a9caeab5049b5a4bb6aJordan Justen  );
72a4ce9ffd470dbbab07ad1a9caeab5049b5a4bb6aJordan Justen
73a4ce9ffd470dbbab07ad1a9caeab5049b5a4bb6aJordan JustenEFI_STATUS
74a4ce9ffd470dbbab07ad1a9caeab5049b5a4bb6aJordan JustenFvbSetVolumeAttributes (
75a4ce9ffd470dbbab07ad1a9caeab5049b5a4bb6aJordan Justen  IN UINTN                                Instance,
76a4ce9ffd470dbbab07ad1a9caeab5049b5a4bb6aJordan Justen  IN OUT EFI_FVB_ATTRIBUTES_2             *Attributes,
77109301e5a14ec4bfd0ce93e15439e30d7ccd8b0aLaszlo Ersek  IN ESAL_FWB_GLOBAL                      *Global
78a4ce9ffd470dbbab07ad1a9caeab5049b5a4bb6aJordan Justen  );
79a4ce9ffd470dbbab07ad1a9caeab5049b5a4bb6aJordan Justen
80a4ce9ffd470dbbab07ad1a9caeab5049b5a4bb6aJordan JustenEFI_STATUS
81a4ce9ffd470dbbab07ad1a9caeab5049b5a4bb6aJordan JustenFvbGetVolumeAttributes (
82a4ce9ffd470dbbab07ad1a9caeab5049b5a4bb6aJordan Justen  IN UINTN                                Instance,
83a4ce9ffd470dbbab07ad1a9caeab5049b5a4bb6aJordan Justen  OUT EFI_FVB_ATTRIBUTES_2                *Attributes,
84109301e5a14ec4bfd0ce93e15439e30d7ccd8b0aLaszlo Ersek  IN ESAL_FWB_GLOBAL                      *Global
85a4ce9ffd470dbbab07ad1a9caeab5049b5a4bb6aJordan Justen  );
86a4ce9ffd470dbbab07ad1a9caeab5049b5a4bb6aJordan Justen
87a4ce9ffd470dbbab07ad1a9caeab5049b5a4bb6aJordan JustenEFI_STATUS
88a4ce9ffd470dbbab07ad1a9caeab5049b5a4bb6aJordan JustenFvbGetPhysicalAddress (
89a4ce9ffd470dbbab07ad1a9caeab5049b5a4bb6aJordan Justen  IN UINTN                                Instance,
90a4ce9ffd470dbbab07ad1a9caeab5049b5a4bb6aJordan Justen  OUT EFI_PHYSICAL_ADDRESS                *Address,
91109301e5a14ec4bfd0ce93e15439e30d7ccd8b0aLaszlo Ersek  IN ESAL_FWB_GLOBAL                      *Global
92a4ce9ffd470dbbab07ad1a9caeab5049b5a4bb6aJordan Justen  );
93a4ce9ffd470dbbab07ad1a9caeab5049b5a4bb6aJordan Justen
94a4ce9ffd470dbbab07ad1a9caeab5049b5a4bb6aJordan JustenEFI_STATUS
95a4ce9ffd470dbbab07ad1a9caeab5049b5a4bb6aJordan JustenEFIAPI
96a4ce9ffd470dbbab07ad1a9caeab5049b5a4bb6aJordan JustenFvbInitialize (
97a4ce9ffd470dbbab07ad1a9caeab5049b5a4bb6aJordan Justen  IN EFI_HANDLE         ImageHandle,
98a4ce9ffd470dbbab07ad1a9caeab5049b5a4bb6aJordan Justen  IN EFI_SYSTEM_TABLE   *SystemTable
99a4ce9ffd470dbbab07ad1a9caeab5049b5a4bb6aJordan Justen  );
100a4ce9ffd470dbbab07ad1a9caeab5049b5a4bb6aJordan Justen
101a4ce9ffd470dbbab07ad1a9caeab5049b5a4bb6aJordan Justen
102a4ce9ffd470dbbab07ad1a9caeab5049b5a4bb6aJordan JustenVOID
103a4ce9ffd470dbbab07ad1a9caeab5049b5a4bb6aJordan JustenEFIAPI
104a4ce9ffd470dbbab07ad1a9caeab5049b5a4bb6aJordan JustenFvbClassAddressChangeEvent (
105a4ce9ffd470dbbab07ad1a9caeab5049b5a4bb6aJordan Justen  IN EFI_EVENT        Event,
106a4ce9ffd470dbbab07ad1a9caeab5049b5a4bb6aJordan Justen  IN VOID             *Context
107a4ce9ffd470dbbab07ad1a9caeab5049b5a4bb6aJordan Justen  );
108a4ce9ffd470dbbab07ad1a9caeab5049b5a4bb6aJordan Justen
109a4ce9ffd470dbbab07ad1a9caeab5049b5a4bb6aJordan JustenEFI_STATUS
110a4ce9ffd470dbbab07ad1a9caeab5049b5a4bb6aJordan JustenFvbGetLbaAddress (
111a4ce9ffd470dbbab07ad1a9caeab5049b5a4bb6aJordan Justen  IN  UINTN                               Instance,
112a4ce9ffd470dbbab07ad1a9caeab5049b5a4bb6aJordan Justen  IN  EFI_LBA                             Lba,
113a4ce9ffd470dbbab07ad1a9caeab5049b5a4bb6aJordan Justen  OUT UINTN                               *LbaAddress,
114a4ce9ffd470dbbab07ad1a9caeab5049b5a4bb6aJordan Justen  OUT UINTN                               *LbaLength,
115a4ce9ffd470dbbab07ad1a9caeab5049b5a4bb6aJordan Justen  OUT UINTN                               *NumOfBlocks,
116109301e5a14ec4bfd0ce93e15439e30d7ccd8b0aLaszlo Ersek  IN  ESAL_FWB_GLOBAL                     *Global
117a4ce9ffd470dbbab07ad1a9caeab5049b5a4bb6aJordan Justen  );
118a4ce9ffd470dbbab07ad1a9caeab5049b5a4bb6aJordan Justen
119a4ce9ffd470dbbab07ad1a9caeab5049b5a4bb6aJordan Justen//
120a4ce9ffd470dbbab07ad1a9caeab5049b5a4bb6aJordan Justen// Protocol APIs
121a4ce9ffd470dbbab07ad1a9caeab5049b5a4bb6aJordan Justen//
122a4ce9ffd470dbbab07ad1a9caeab5049b5a4bb6aJordan JustenEFI_STATUS
123a4ce9ffd470dbbab07ad1a9caeab5049b5a4bb6aJordan JustenEFIAPI
124a4ce9ffd470dbbab07ad1a9caeab5049b5a4bb6aJordan JustenFvbProtocolGetAttributes (
125a4ce9ffd470dbbab07ad1a9caeab5049b5a4bb6aJordan Justen  IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL           *This,
126a4ce9ffd470dbbab07ad1a9caeab5049b5a4bb6aJordan Justen  OUT EFI_FVB_ATTRIBUTES_2                              *Attributes
127a4ce9ffd470dbbab07ad1a9caeab5049b5a4bb6aJordan Justen  );
128a4ce9ffd470dbbab07ad1a9caeab5049b5a4bb6aJordan Justen
129a4ce9ffd470dbbab07ad1a9caeab5049b5a4bb6aJordan JustenEFI_STATUS
130a4ce9ffd470dbbab07ad1a9caeab5049b5a4bb6aJordan JustenEFIAPI
131a4ce9ffd470dbbab07ad1a9caeab5049b5a4bb6aJordan JustenFvbProtocolSetAttributes (
132a4ce9ffd470dbbab07ad1a9caeab5049b5a4bb6aJordan Justen  IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL           *This,
133a4ce9ffd470dbbab07ad1a9caeab5049b5a4bb6aJordan Justen  IN OUT EFI_FVB_ATTRIBUTES_2                           *Attributes
134a4ce9ffd470dbbab07ad1a9caeab5049b5a4bb6aJordan Justen  );
135a4ce9ffd470dbbab07ad1a9caeab5049b5a4bb6aJordan Justen
136a4ce9ffd470dbbab07ad1a9caeab5049b5a4bb6aJordan JustenEFI_STATUS
137a4ce9ffd470dbbab07ad1a9caeab5049b5a4bb6aJordan JustenEFIAPI
138a4ce9ffd470dbbab07ad1a9caeab5049b5a4bb6aJordan JustenFvbProtocolGetPhysicalAddress (
139a4ce9ffd470dbbab07ad1a9caeab5049b5a4bb6aJordan Justen  IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL           *This,
140a4ce9ffd470dbbab07ad1a9caeab5049b5a4bb6aJordan Justen  OUT EFI_PHYSICAL_ADDRESS                        *Address
141a4ce9ffd470dbbab07ad1a9caeab5049b5a4bb6aJordan Justen  );
142a4ce9ffd470dbbab07ad1a9caeab5049b5a4bb6aJordan Justen
143a4ce9ffd470dbbab07ad1a9caeab5049b5a4bb6aJordan JustenEFI_STATUS
144a4ce9ffd470dbbab07ad1a9caeab5049b5a4bb6aJordan JustenEFIAPI
145a4ce9ffd470dbbab07ad1a9caeab5049b5a4bb6aJordan JustenFvbProtocolGetBlockSize (
146a4ce9ffd470dbbab07ad1a9caeab5049b5a4bb6aJordan Justen  IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL           *This,
147a4ce9ffd470dbbab07ad1a9caeab5049b5a4bb6aJordan Justen  IN CONST EFI_LBA                                     Lba,
148a4ce9ffd470dbbab07ad1a9caeab5049b5a4bb6aJordan Justen  OUT UINTN                                       *BlockSize,
149a4ce9ffd470dbbab07ad1a9caeab5049b5a4bb6aJordan Justen  OUT UINTN                                       *NumOfBlocks
150a4ce9ffd470dbbab07ad1a9caeab5049b5a4bb6aJordan Justen  );
151a4ce9ffd470dbbab07ad1a9caeab5049b5a4bb6aJordan Justen
152a4ce9ffd470dbbab07ad1a9caeab5049b5a4bb6aJordan JustenEFI_STATUS
153a4ce9ffd470dbbab07ad1a9caeab5049b5a4bb6aJordan JustenEFIAPI
154a4ce9ffd470dbbab07ad1a9caeab5049b5a4bb6aJordan JustenFvbProtocolRead (
155a4ce9ffd470dbbab07ad1a9caeab5049b5a4bb6aJordan Justen  IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL           *This,
156a4ce9ffd470dbbab07ad1a9caeab5049b5a4bb6aJordan Justen  IN CONST EFI_LBA                                      Lba,
157a4ce9ffd470dbbab07ad1a9caeab5049b5a4bb6aJordan Justen  IN CONST UINTN                                        Offset,
158a4ce9ffd470dbbab07ad1a9caeab5049b5a4bb6aJordan Justen  IN OUT UINTN                                    *NumBytes,
159a4ce9ffd470dbbab07ad1a9caeab5049b5a4bb6aJordan Justen  IN UINT8                                        *Buffer
160a4ce9ffd470dbbab07ad1a9caeab5049b5a4bb6aJordan Justen  );
161a4ce9ffd470dbbab07ad1a9caeab5049b5a4bb6aJordan Justen
162a4ce9ffd470dbbab07ad1a9caeab5049b5a4bb6aJordan JustenEFI_STATUS
163a4ce9ffd470dbbab07ad1a9caeab5049b5a4bb6aJordan JustenEFIAPI
164a4ce9ffd470dbbab07ad1a9caeab5049b5a4bb6aJordan JustenFvbProtocolWrite (
165a4ce9ffd470dbbab07ad1a9caeab5049b5a4bb6aJordan Justen  IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL           *This,
166a4ce9ffd470dbbab07ad1a9caeab5049b5a4bb6aJordan Justen  IN       EFI_LBA                                      Lba,
167a4ce9ffd470dbbab07ad1a9caeab5049b5a4bb6aJordan Justen  IN       UINTN                                        Offset,
168a4ce9ffd470dbbab07ad1a9caeab5049b5a4bb6aJordan Justen  IN OUT   UINTN                                        *NumBytes,
169a4ce9ffd470dbbab07ad1a9caeab5049b5a4bb6aJordan Justen  IN       UINT8                                        *Buffer
170a4ce9ffd470dbbab07ad1a9caeab5049b5a4bb6aJordan Justen  );
171a4ce9ffd470dbbab07ad1a9caeab5049b5a4bb6aJordan Justen
172a4ce9ffd470dbbab07ad1a9caeab5049b5a4bb6aJordan JustenEFI_STATUS
173a4ce9ffd470dbbab07ad1a9caeab5049b5a4bb6aJordan JustenEFIAPI
174a4ce9ffd470dbbab07ad1a9caeab5049b5a4bb6aJordan JustenFvbProtocolEraseBlocks (
175a4ce9ffd470dbbab07ad1a9caeab5049b5a4bb6aJordan Justen  IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL    *This,
176a4ce9ffd470dbbab07ad1a9caeab5049b5a4bb6aJordan Justen  ...
177a4ce9ffd470dbbab07ad1a9caeab5049b5a4bb6aJordan Justen  );
178a4ce9ffd470dbbab07ad1a9caeab5049b5a4bb6aJordan Justen
1791767877a31b3ce191ddae6cb9aefba99a733fe20Laszlo Ersek//
1801767877a31b3ce191ddae6cb9aefba99a733fe20Laszlo Ersek// The following functions have different implementations dependent on the
1811767877a31b3ce191ddae6cb9aefba99a733fe20Laszlo Ersek// module type chosen for building this driver.
1821767877a31b3ce191ddae6cb9aefba99a733fe20Laszlo Ersek//
1831767877a31b3ce191ddae6cb9aefba99a733fe20Laszlo ErsekVOID
1841767877a31b3ce191ddae6cb9aefba99a733fe20Laszlo ErsekInstallProtocolInterfaces (
1851767877a31b3ce191ddae6cb9aefba99a733fe20Laszlo Ersek  IN EFI_FW_VOL_BLOCK_DEVICE *FvbDevice
1861767877a31b3ce191ddae6cb9aefba99a733fe20Laszlo Ersek  );
1871767877a31b3ce191ddae6cb9aefba99a733fe20Laszlo Ersek
1881767877a31b3ce191ddae6cb9aefba99a733fe20Laszlo ErsekVOID
1891767877a31b3ce191ddae6cb9aefba99a733fe20Laszlo ErsekInstallVirtualAddressChangeHandler (
1901767877a31b3ce191ddae6cb9aefba99a733fe20Laszlo Ersek  VOID
1911767877a31b3ce191ddae6cb9aefba99a733fe20Laszlo Ersek  );
192a4ce9ffd470dbbab07ad1a9caeab5049b5a4bb6aJordan Justen#endif
193