/*++ @file
  Firmware volume block driver for Intel Firmware Hub (FWH) device

Copyright (c) 2006 - 2009, Intel Corporation. All rights reserved.<BR>
Portions copyright (c) 2011, Apple Inc. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent

**/

#ifndef _FW_BLOCK_SERVICE_H
#define _FW_BLOCK_SERVICE_H

//
// BugBug: Add documentation here for data structure!!!!
//
#define FVB_PHYSICAL  0
#define FVB_VIRTUAL   1

typedef struct {
  EFI_LOCK                      FvbDevLock;
  UINTN                         FvBase[2];
  UINTN                         NumOfBlocks;
  EFI_FIRMWARE_VOLUME_HEADER    VolumeHeader;
} EFI_FW_VOL_INSTANCE;

typedef struct {
  UINT32                 NumFv;
  EFI_FW_VOL_INSTANCE    *FvInstance[2];
} ESAL_FWB_GLOBAL;

//
// Fvb Protocol instance data
//
#define FVB_DEVICE_FROM_THIS(a)         CR (a, EFI_FW_VOL_BLOCK_DEVICE, FwVolBlockInstance, FVB_DEVICE_SIGNATURE)
#define FVB_EXTEND_DEVICE_FROM_THIS(a)  CR (a, EFI_FW_VOL_BLOCK_DEVICE, FvbExtension, FVB_DEVICE_SIGNATURE)
#define FVB_DEVICE_SIGNATURE  SIGNATURE_32 ('F', 'V', 'B', 'N')

typedef struct {
  MEMMAP_DEVICE_PATH          MemMapDevPath;
  EFI_DEVICE_PATH_PROTOCOL    EndDevPath;
} FV_DEVICE_PATH;

typedef struct {
  UINTN                                 Signature;
  FV_DEVICE_PATH                        DevicePath;
  UINTN                                 Instance;
  EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL    FwVolBlockInstance;
} EFI_FW_VOL_BLOCK_DEVICE;

EFI_STATUS
GetFvbInfo (
  IN  UINT64                      FvLength,
  OUT EFI_FIRMWARE_VOLUME_HEADER  **FvbInfo
  )
;

EFI_STATUS
FvbReadBlock (
  IN UINTN            Instance,
  IN EFI_LBA          Lba,
  IN UINTN            BlockOffset,
  IN OUT UINTN        *NumBytes,
  IN UINT8            *Buffer,
  IN ESAL_FWB_GLOBAL  *Global,
  IN BOOLEAN          Virtual
  )
;

EFI_STATUS
FvbWriteBlock (
  IN UINTN            Instance,
  IN EFI_LBA          Lba,
  IN UINTN            BlockOffset,
  IN OUT UINTN        *NumBytes,
  IN UINT8            *Buffer,
  IN ESAL_FWB_GLOBAL  *Global,
  IN BOOLEAN          Virtual
  )
;

EFI_STATUS
FvbEraseBlock (
  IN UINTN            Instance,
  IN EFI_LBA          Lba,
  IN ESAL_FWB_GLOBAL  *Global,
  IN BOOLEAN          Virtual
  )
;

EFI_STATUS
FvbSetVolumeAttributes (
  IN UINTN                     Instance,
  IN OUT EFI_FVB_ATTRIBUTES_2  *Attributes,
  IN ESAL_FWB_GLOBAL           *Global,
  IN BOOLEAN                   Virtual
  )
;

EFI_STATUS
FvbGetVolumeAttributes (
  IN UINTN                  Instance,
  OUT EFI_FVB_ATTRIBUTES_2  *Attributes,
  IN ESAL_FWB_GLOBAL        *Global,
  IN BOOLEAN                Virtual
  )
;

EFI_STATUS
FvbGetPhysicalAddress (
  IN UINTN                  Instance,
  OUT EFI_PHYSICAL_ADDRESS  *Address,
  IN ESAL_FWB_GLOBAL        *Global,
  IN BOOLEAN                Virtual
  )
;

EFI_STATUS
EFIAPI
FvbInitialize (
  IN EFI_HANDLE        ImageHandle,
  IN EFI_SYSTEM_TABLE  *SystemTable
  )
;

VOID
EFIAPI
FvbClassAddressChangeEvent (
  IN EFI_EVENT  Event,
  IN VOID       *Context
  )
;

EFI_STATUS
FvbGetLbaAddress (
  IN  UINTN            Instance,
  IN  EFI_LBA          Lba,
  OUT UINTN            *LbaAddress,
  OUT UINTN            *LbaLength,
  OUT UINTN            *NumOfBlocks,
  IN  ESAL_FWB_GLOBAL  *Global,
  IN  BOOLEAN          Virtual
  )
;

//
// Protocol APIs
//
EFI_STATUS
EFIAPI
FvbProtocolGetAttributes (
  IN  CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL  *This,
  OUT       EFI_FVB_ATTRIBUTES_2                *Attributes
  )
;

EFI_STATUS
EFIAPI
FvbProtocolSetAttributes (
  IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL  *This,
  IN OUT   EFI_FVB_ATTRIBUTES_2                *Attributes
  )
;

EFI_STATUS
EFIAPI
FvbProtocolGetPhysicalAddress (
  IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL  *This,
  OUT      EFI_PHYSICAL_ADDRESS                *Address
  )
;

EFI_STATUS
EFIAPI
FvbProtocolGetBlockSize (
  IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL  *This,
  IN  EFI_LBA                                  Lba,
  OUT UINTN                                    *BlockSize,
  OUT UINTN                                    *NumOfBlocks
  )
;

EFI_STATUS
EFIAPI
FvbProtocolRead (
  IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL  *This,
  IN EFI_LBA                                   Lba,
  IN UINTN                                     Offset,
  IN OUT UINTN                                 *NumBytes,
  IN UINT8                                     *Buffer
  )
;

EFI_STATUS
EFIAPI
FvbProtocolWrite (
  IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL  *This,
  IN EFI_LBA                                   Lba,
  IN UINTN                                     Offset,
  IN OUT UINTN                                 *NumBytes,
  IN UINT8                                     *Buffer
  )
;

EFI_STATUS
EFIAPI
FvbProtocolEraseBlocks (
  IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL  *This,
  ...
  )
;

#endif