16ae81428485020dd371eaefa5b97b24f21efe117klu/**@file
255e6660f6b4652dcac70ae5eb312a3cd2c96733dklu
38f2a5f8012e3a6de30f5b12ce3a218efae9eaeddhhtianCopyright (c) 2006, Intel Corporation. All rights reserved.<BR>
48f2a5f8012e3a6de30f5b12ce3a218efae9eaeddhhtianThis program and the accompanying materials
555e6660f6b4652dcac70ae5eb312a3cd2c96733dkluare licensed and made available under the terms and conditions of the BSD License
655e6660f6b4652dcac70ae5eb312a3cd2c96733dkluwhich accompanies this distribution.  The full text of the license may be found at
755e6660f6b4652dcac70ae5eb312a3cd2c96733dkluhttp://opensource.org/licenses/bsd-license.php
855e6660f6b4652dcac70ae5eb312a3cd2c96733dklu
955e6660f6b4652dcac70ae5eb312a3cd2c96733dkluTHE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
1055e6660f6b4652dcac70ae5eb312a3cd2c96733dkluWITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
1155e6660f6b4652dcac70ae5eb312a3cd2c96733dklu
1255e6660f6b4652dcac70ae5eb312a3cd2c96733dkluModule Name:
1355e6660f6b4652dcac70ae5eb312a3cd2c96733dklu
1455e6660f6b4652dcac70ae5eb312a3cd2c96733dklu  FwBlockService.h
1555e6660f6b4652dcac70ae5eb312a3cd2c96733dklu
1655e6660f6b4652dcac70ae5eb312a3cd2c96733dkluAbstract:
1755e6660f6b4652dcac70ae5eb312a3cd2c96733dklu
1855e6660f6b4652dcac70ae5eb312a3cd2c96733dklu  Firmware volume block driver for Intel Firmware Hub (FWH) device
1955e6660f6b4652dcac70ae5eb312a3cd2c96733dklu
206ae81428485020dd371eaefa5b97b24f21efe117klu**/
2155e6660f6b4652dcac70ae5eb312a3cd2c96733dklu
2255e6660f6b4652dcac70ae5eb312a3cd2c96733dklu#ifndef _FW_BLOCK_SERVICE_H
2355e6660f6b4652dcac70ae5eb312a3cd2c96733dklu#define _FW_BLOCK_SERVICE_H
2455e6660f6b4652dcac70ae5eb312a3cd2c96733dklu
2555e6660f6b4652dcac70ae5eb312a3cd2c96733dklu//
2655e6660f6b4652dcac70ae5eb312a3cd2c96733dklu// BugBug: Add documentation here for data structure!!!!
2755e6660f6b4652dcac70ae5eb312a3cd2c96733dklu//
2855e6660f6b4652dcac70ae5eb312a3cd2c96733dklu#define FVB_PHYSICAL  0
2955e6660f6b4652dcac70ae5eb312a3cd2c96733dklu#define FVB_VIRTUAL   1
3055e6660f6b4652dcac70ae5eb312a3cd2c96733dklu
3155e6660f6b4652dcac70ae5eb312a3cd2c96733dklutypedef struct {
3255e6660f6b4652dcac70ae5eb312a3cd2c96733dklu  EFI_LOCK                    FvbDevLock;
3355e6660f6b4652dcac70ae5eb312a3cd2c96733dklu  UINTN                       FvBase[2];
3455e6660f6b4652dcac70ae5eb312a3cd2c96733dklu  UINTN                       NumOfBlocks;
3555e6660f6b4652dcac70ae5eb312a3cd2c96733dklu  EFI_FIRMWARE_VOLUME_HEADER  VolumeHeader;
3655e6660f6b4652dcac70ae5eb312a3cd2c96733dklu} EFI_FW_VOL_INSTANCE;
3755e6660f6b4652dcac70ae5eb312a3cd2c96733dklu
3855e6660f6b4652dcac70ae5eb312a3cd2c96733dklutypedef struct {
3955e6660f6b4652dcac70ae5eb312a3cd2c96733dklu  UINT32              NumFv;
4055e6660f6b4652dcac70ae5eb312a3cd2c96733dklu  EFI_FW_VOL_INSTANCE *FvInstance[2];
4155e6660f6b4652dcac70ae5eb312a3cd2c96733dklu  UINT8               *FvbScratchSpace[2];
4255e6660f6b4652dcac70ae5eb312a3cd2c96733dklu} ESAL_FWB_GLOBAL;
4355e6660f6b4652dcac70ae5eb312a3cd2c96733dklu
4455e6660f6b4652dcac70ae5eb312a3cd2c96733dklu//
4555e6660f6b4652dcac70ae5eb312a3cd2c96733dklu// Fvb Protocol instance data
4655e6660f6b4652dcac70ae5eb312a3cd2c96733dklu//
4755e6660f6b4652dcac70ae5eb312a3cd2c96733dklu#define FVB_DEVICE_FROM_THIS(a)         CR (a, EFI_FW_VOL_BLOCK_DEVICE, FwVolBlockInstance, FVB_DEVICE_SIGNATURE)
4855e6660f6b4652dcac70ae5eb312a3cd2c96733dklu#define FVB_EXTEND_DEVICE_FROM_THIS(a)  CR (a, EFI_FW_VOL_BLOCK_DEVICE, FvbExtension, FVB_DEVICE_SIGNATURE)
4999e1dd896a87bc8c8548f4dcd7c1a902825c9c42qhuang#define FVB_DEVICE_SIGNATURE            SIGNATURE_32 ('F', 'V', 'B', 'N')
5055e6660f6b4652dcac70ae5eb312a3cd2c96733dklu
5155e6660f6b4652dcac70ae5eb312a3cd2c96733dklutypedef struct {
52eb9203646f2f05dff08a2852fe3a862d1c4fc5bdklu  MEDIA_FW_VOL_DEVICE_PATH  FvDevPath;
5355e6660f6b4652dcac70ae5eb312a3cd2c96733dklu  EFI_DEVICE_PATH_PROTOCOL  EndDevPath;
54eb9203646f2f05dff08a2852fe3a862d1c4fc5bdklu} FV_PIWG_DEVICE_PATH;
55eb9203646f2f05dff08a2852fe3a862d1c4fc5bdklu
56eb9203646f2f05dff08a2852fe3a862d1c4fc5bdklutypedef struct {
57eb9203646f2f05dff08a2852fe3a862d1c4fc5bdklu  MEMMAP_DEVICE_PATH          MemMapDevPath;
58eb9203646f2f05dff08a2852fe3a862d1c4fc5bdklu  EFI_DEVICE_PATH_PROTOCOL    EndDevPath;
59eb9203646f2f05dff08a2852fe3a862d1c4fc5bdklu} FV_MEMMAP_DEVICE_PATH;
6055e6660f6b4652dcac70ae5eb312a3cd2c96733dklu
6155e6660f6b4652dcac70ae5eb312a3cd2c96733dklutypedef struct {
6255e6660f6b4652dcac70ae5eb312a3cd2c96733dklu  UINTN                               Signature;
63eb9203646f2f05dff08a2852fe3a862d1c4fc5bdklu  EFI_DEVICE_PATH_PROTOCOL            *DevicePath;
6455e6660f6b4652dcac70ae5eb312a3cd2c96733dklu  UINTN                               Instance;
6555e6660f6b4652dcac70ae5eb312a3cd2c96733dklu  EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL  FwVolBlockInstance;
6655e6660f6b4652dcac70ae5eb312a3cd2c96733dklu} EFI_FW_VOL_BLOCK_DEVICE;
6755e6660f6b4652dcac70ae5eb312a3cd2c96733dklu
6855e6660f6b4652dcac70ae5eb312a3cd2c96733dkluEFI_STATUS
6955e6660f6b4652dcac70ae5eb312a3cd2c96733dkluGetFvbInfo (
7055e6660f6b4652dcac70ae5eb312a3cd2c96733dklu  IN  UINT64                            FvLength,
7155e6660f6b4652dcac70ae5eb312a3cd2c96733dklu  OUT EFI_FIRMWARE_VOLUME_HEADER        **FvbInfo
72ed66e1bc0d2be0a185fc47adab4930c3b7e2767fvanjeff  );
7355e6660f6b4652dcac70ae5eb312a3cd2c96733dklu
7455e6660f6b4652dcac70ae5eb312a3cd2c96733dkluEFI_STATUS
7555e6660f6b4652dcac70ae5eb312a3cd2c96733dkluFvbReadBlock (
7655e6660f6b4652dcac70ae5eb312a3cd2c96733dklu  IN UINTN                                Instance,
7755e6660f6b4652dcac70ae5eb312a3cd2c96733dklu  IN EFI_LBA                              Lba,
7855e6660f6b4652dcac70ae5eb312a3cd2c96733dklu  IN UINTN                                BlockOffset,
7955e6660f6b4652dcac70ae5eb312a3cd2c96733dklu  IN OUT UINTN                            *NumBytes,
8055e6660f6b4652dcac70ae5eb312a3cd2c96733dklu  IN UINT8                                *Buffer,
8155e6660f6b4652dcac70ae5eb312a3cd2c96733dklu  IN ESAL_FWB_GLOBAL                      *Global,
8255e6660f6b4652dcac70ae5eb312a3cd2c96733dklu  IN BOOLEAN                              Virtual
83ed66e1bc0d2be0a185fc47adab4930c3b7e2767fvanjeff  );
8455e6660f6b4652dcac70ae5eb312a3cd2c96733dklu
8555e6660f6b4652dcac70ae5eb312a3cd2c96733dkluEFI_STATUS
8655e6660f6b4652dcac70ae5eb312a3cd2c96733dkluFvbWriteBlock (
8755e6660f6b4652dcac70ae5eb312a3cd2c96733dklu  IN UINTN                                Instance,
8855e6660f6b4652dcac70ae5eb312a3cd2c96733dklu  IN CONST EFI_LBA                              Lba,
8955e6660f6b4652dcac70ae5eb312a3cd2c96733dklu  IN CONST UINTN                                BlockOffset,
9055e6660f6b4652dcac70ae5eb312a3cd2c96733dklu  IN OUT UINTN                            *NumBytes,
9155e6660f6b4652dcac70ae5eb312a3cd2c96733dklu  IN CONST UINT8                                *Buffer,
9255e6660f6b4652dcac70ae5eb312a3cd2c96733dklu  IN ESAL_FWB_GLOBAL                      *Global,
9355e6660f6b4652dcac70ae5eb312a3cd2c96733dklu  IN BOOLEAN                              Virtual
94ed66e1bc0d2be0a185fc47adab4930c3b7e2767fvanjeff  );
9555e6660f6b4652dcac70ae5eb312a3cd2c96733dklu
9655e6660f6b4652dcac70ae5eb312a3cd2c96733dkluEFI_STATUS
9755e6660f6b4652dcac70ae5eb312a3cd2c96733dkluFvbEraseBlock (
9855e6660f6b4652dcac70ae5eb312a3cd2c96733dklu  IN UINTN                                Instance,
9955e6660f6b4652dcac70ae5eb312a3cd2c96733dklu  IN EFI_LBA                              Lba,
10055e6660f6b4652dcac70ae5eb312a3cd2c96733dklu  IN ESAL_FWB_GLOBAL                      *Global,
10155e6660f6b4652dcac70ae5eb312a3cd2c96733dklu  IN BOOLEAN                              Virtual
102ed66e1bc0d2be0a185fc47adab4930c3b7e2767fvanjeff  );
10355e6660f6b4652dcac70ae5eb312a3cd2c96733dklu
10455e6660f6b4652dcac70ae5eb312a3cd2c96733dkluEFI_STATUS
10555e6660f6b4652dcac70ae5eb312a3cd2c96733dkluFvbSetVolumeAttributes (
10655e6660f6b4652dcac70ae5eb312a3cd2c96733dklu  IN UINTN                                Instance,
1078ee3a1990874ae94da24e8c2a97e941fdfcf74a6vanjeff  IN OUT EFI_FVB_ATTRIBUTES_2             *Attributes,
10855e6660f6b4652dcac70ae5eb312a3cd2c96733dklu  IN ESAL_FWB_GLOBAL                      *Global,
10955e6660f6b4652dcac70ae5eb312a3cd2c96733dklu  IN BOOLEAN                              Virtual
110ed66e1bc0d2be0a185fc47adab4930c3b7e2767fvanjeff  );
11155e6660f6b4652dcac70ae5eb312a3cd2c96733dklu
11255e6660f6b4652dcac70ae5eb312a3cd2c96733dkluEFI_STATUS
11355e6660f6b4652dcac70ae5eb312a3cd2c96733dkluFvbGetVolumeAttributes (
11455e6660f6b4652dcac70ae5eb312a3cd2c96733dklu  IN UINTN                                Instance,
1158ee3a1990874ae94da24e8c2a97e941fdfcf74a6vanjeff  OUT EFI_FVB_ATTRIBUTES_2                *Attributes,
11655e6660f6b4652dcac70ae5eb312a3cd2c96733dklu  IN ESAL_FWB_GLOBAL                      *Global,
11755e6660f6b4652dcac70ae5eb312a3cd2c96733dklu  IN BOOLEAN                              Virtual
118ed66e1bc0d2be0a185fc47adab4930c3b7e2767fvanjeff  );
11955e6660f6b4652dcac70ae5eb312a3cd2c96733dklu
12055e6660f6b4652dcac70ae5eb312a3cd2c96733dkluEFI_STATUS
12155e6660f6b4652dcac70ae5eb312a3cd2c96733dkluFvbGetPhysicalAddress (
12255e6660f6b4652dcac70ae5eb312a3cd2c96733dklu  IN UINTN                                Instance,
12355e6660f6b4652dcac70ae5eb312a3cd2c96733dklu  OUT EFI_PHYSICAL_ADDRESS                *Address,
12455e6660f6b4652dcac70ae5eb312a3cd2c96733dklu  IN ESAL_FWB_GLOBAL                      *Global,
12555e6660f6b4652dcac70ae5eb312a3cd2c96733dklu  IN BOOLEAN                              Virtual
126ed66e1bc0d2be0a185fc47adab4930c3b7e2767fvanjeff  );
12755e6660f6b4652dcac70ae5eb312a3cd2c96733dklu
12855e6660f6b4652dcac70ae5eb312a3cd2c96733dkluEFI_STATUS
12955e6660f6b4652dcac70ae5eb312a3cd2c96733dkluEFIAPI
13055e6660f6b4652dcac70ae5eb312a3cd2c96733dkluFvbInitialize (
13155e6660f6b4652dcac70ae5eb312a3cd2c96733dklu  IN EFI_HANDLE         ImageHandle,
13255e6660f6b4652dcac70ae5eb312a3cd2c96733dklu  IN EFI_SYSTEM_TABLE   *SystemTable
133ed66e1bc0d2be0a185fc47adab4930c3b7e2767fvanjeff  );
13455e6660f6b4652dcac70ae5eb312a3cd2c96733dklu
13555e6660f6b4652dcac70ae5eb312a3cd2c96733dklu
13655e6660f6b4652dcac70ae5eb312a3cd2c96733dkluVOID
13755e6660f6b4652dcac70ae5eb312a3cd2c96733dkluEFIAPI
13855e6660f6b4652dcac70ae5eb312a3cd2c96733dkluFvbClassAddressChangeEvent (
13955e6660f6b4652dcac70ae5eb312a3cd2c96733dklu  IN EFI_EVENT        Event,
14055e6660f6b4652dcac70ae5eb312a3cd2c96733dklu  IN VOID             *Context
141ed66e1bc0d2be0a185fc47adab4930c3b7e2767fvanjeff  );
14255e6660f6b4652dcac70ae5eb312a3cd2c96733dklu
14355e6660f6b4652dcac70ae5eb312a3cd2c96733dkluEFI_STATUS
14455e6660f6b4652dcac70ae5eb312a3cd2c96733dkluFvbGetLbaAddress (
14555e6660f6b4652dcac70ae5eb312a3cd2c96733dklu  IN  UINTN                               Instance,
14655e6660f6b4652dcac70ae5eb312a3cd2c96733dklu  IN  EFI_LBA                             Lba,
14755e6660f6b4652dcac70ae5eb312a3cd2c96733dklu  OUT UINTN                               *LbaAddress,
14855e6660f6b4652dcac70ae5eb312a3cd2c96733dklu  OUT UINTN                               *LbaLength,
14955e6660f6b4652dcac70ae5eb312a3cd2c96733dklu  OUT UINTN                               *NumOfBlocks,
15055e6660f6b4652dcac70ae5eb312a3cd2c96733dklu  IN  ESAL_FWB_GLOBAL                     *Global,
15155e6660f6b4652dcac70ae5eb312a3cd2c96733dklu  IN  BOOLEAN                             Virtual
152ed66e1bc0d2be0a185fc47adab4930c3b7e2767fvanjeff  );
15355e6660f6b4652dcac70ae5eb312a3cd2c96733dklu
15455e6660f6b4652dcac70ae5eb312a3cd2c96733dklu//
15555e6660f6b4652dcac70ae5eb312a3cd2c96733dklu// Protocol APIs
15655e6660f6b4652dcac70ae5eb312a3cd2c96733dklu//
15755e6660f6b4652dcac70ae5eb312a3cd2c96733dkluEFI_STATUS
15855e6660f6b4652dcac70ae5eb312a3cd2c96733dkluEFIAPI
15955e6660f6b4652dcac70ae5eb312a3cd2c96733dkluFvbProtocolGetAttributes (
16055e6660f6b4652dcac70ae5eb312a3cd2c96733dklu  IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL           *This,
1618ee3a1990874ae94da24e8c2a97e941fdfcf74a6vanjeff  OUT EFI_FVB_ATTRIBUTES_2                              *Attributes
162ed66e1bc0d2be0a185fc47adab4930c3b7e2767fvanjeff  );
16355e6660f6b4652dcac70ae5eb312a3cd2c96733dklu
16455e6660f6b4652dcac70ae5eb312a3cd2c96733dkluEFI_STATUS
16555e6660f6b4652dcac70ae5eb312a3cd2c96733dkluEFIAPI
16655e6660f6b4652dcac70ae5eb312a3cd2c96733dkluFvbProtocolSetAttributes (
16755e6660f6b4652dcac70ae5eb312a3cd2c96733dklu  IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL           *This,
1688ee3a1990874ae94da24e8c2a97e941fdfcf74a6vanjeff  IN OUT EFI_FVB_ATTRIBUTES_2                           *Attributes
169ed66e1bc0d2be0a185fc47adab4930c3b7e2767fvanjeff  );
17055e6660f6b4652dcac70ae5eb312a3cd2c96733dklu
17155e6660f6b4652dcac70ae5eb312a3cd2c96733dkluEFI_STATUS
17255e6660f6b4652dcac70ae5eb312a3cd2c96733dkluEFIAPI
17355e6660f6b4652dcac70ae5eb312a3cd2c96733dkluFvbProtocolGetPhysicalAddress (
17455e6660f6b4652dcac70ae5eb312a3cd2c96733dklu  IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL           *This,
17555e6660f6b4652dcac70ae5eb312a3cd2c96733dklu  OUT EFI_PHYSICAL_ADDRESS                        *Address
176ed66e1bc0d2be0a185fc47adab4930c3b7e2767fvanjeff  );
17755e6660f6b4652dcac70ae5eb312a3cd2c96733dklu
17855e6660f6b4652dcac70ae5eb312a3cd2c96733dkluEFI_STATUS
17955e6660f6b4652dcac70ae5eb312a3cd2c96733dkluEFIAPI
18055e6660f6b4652dcac70ae5eb312a3cd2c96733dkluFvbProtocolGetBlockSize (
18155e6660f6b4652dcac70ae5eb312a3cd2c96733dklu  IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL           *This,
18255e6660f6b4652dcac70ae5eb312a3cd2c96733dklu  IN CONST EFI_LBA                                     Lba,
18355e6660f6b4652dcac70ae5eb312a3cd2c96733dklu  OUT UINTN                                       *BlockSize,
18455e6660f6b4652dcac70ae5eb312a3cd2c96733dklu  OUT UINTN                                       *NumOfBlocks
185ed66e1bc0d2be0a185fc47adab4930c3b7e2767fvanjeff  );
18655e6660f6b4652dcac70ae5eb312a3cd2c96733dklu
18755e6660f6b4652dcac70ae5eb312a3cd2c96733dkluEFI_STATUS
18855e6660f6b4652dcac70ae5eb312a3cd2c96733dkluEFIAPI
18955e6660f6b4652dcac70ae5eb312a3cd2c96733dkluFvbProtocolRead (
19055e6660f6b4652dcac70ae5eb312a3cd2c96733dklu  IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL           *This,
19155e6660f6b4652dcac70ae5eb312a3cd2c96733dklu  IN CONST EFI_LBA                                      Lba,
19255e6660f6b4652dcac70ae5eb312a3cd2c96733dklu  IN CONST UINTN                                        Offset,
19355e6660f6b4652dcac70ae5eb312a3cd2c96733dklu  IN OUT UINTN                                    *NumBytes,
19455e6660f6b4652dcac70ae5eb312a3cd2c96733dklu  IN UINT8                                        *Buffer
195ed66e1bc0d2be0a185fc47adab4930c3b7e2767fvanjeff  );
19655e6660f6b4652dcac70ae5eb312a3cd2c96733dklu
19755e6660f6b4652dcac70ae5eb312a3cd2c96733dkluEFI_STATUS
19855e6660f6b4652dcac70ae5eb312a3cd2c96733dkluEFIAPI
19955e6660f6b4652dcac70ae5eb312a3cd2c96733dkluFvbProtocolWrite (
20055e6660f6b4652dcac70ae5eb312a3cd2c96733dklu  IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL           *This,
2010b94e31981fde83116598dc7a2c8a346d46fd3cfklu  IN       EFI_LBA                                      Lba,
2020b94e31981fde83116598dc7a2c8a346d46fd3cfklu  IN       UINTN                                        Offset,
2030b94e31981fde83116598dc7a2c8a346d46fd3cfklu  IN OUT   UINTN                                        *NumBytes,
2040b94e31981fde83116598dc7a2c8a346d46fd3cfklu  IN       UINT8                                        *Buffer
205ed66e1bc0d2be0a185fc47adab4930c3b7e2767fvanjeff  );
20655e6660f6b4652dcac70ae5eb312a3cd2c96733dklu
20755e6660f6b4652dcac70ae5eb312a3cd2c96733dkluEFI_STATUS
20855e6660f6b4652dcac70ae5eb312a3cd2c96733dkluEFIAPI
20955e6660f6b4652dcac70ae5eb312a3cd2c96733dkluFvbProtocolEraseBlocks (
21055e6660f6b4652dcac70ae5eb312a3cd2c96733dklu  IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL    *This,
21155e6660f6b4652dcac70ae5eb312a3cd2c96733dklu  ...
212ed66e1bc0d2be0a185fc47adab4930c3b7e2767fvanjeff  );
21355e6660f6b4652dcac70ae5eb312a3cd2c96733dklu
21455e6660f6b4652dcac70ae5eb312a3cd2c96733dklu#endif
215