Home | History | Annotate | Download | only in FvbRuntimeService
      1 /**@file
      2 Copyright (c) 2007, Intel Corporation. All rights reserved.<BR>
      3 This program and the accompanying materials
      4 are licensed and made available under the terms and conditions of the BSD License
      5 which accompanies this distribution.  The full text of the license may be found at
      6 http://opensource.org/licenses/bsd-license.php
      7 
      8 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
      9 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
     10 
     11 Module Name:
     12 
     13   FwBlockService.h
     14 
     15 Abstract:
     16 
     17   Firmware volume block driver for Intel Firmware Hub (FWH) device
     18 
     19 **/
     20 #ifndef _FW_BLOCK_SERVICE_H
     21 #define _FW_BLOCK_SERVICE_H
     22 
     23 //
     24 // The package level header files this module uses
     25 //
     26 #include <PiDxe.h>
     27 
     28 //
     29 // The protocols, PPI and GUID defintions for this module
     30 //
     31 #include <Guid/EventGroup.h>
     32 #include <Guid/FirmwareFileSystem2.h>
     33 #include <Protocol/FirmwareVolumeBlock.h>
     34 #include <Protocol/DevicePath.h>
     35 #include <Protocol/SimpleFileSystem.h>
     36 #include <Protocol/BlockIo.h>
     37 #include <Library/DevicePathLib.h>
     38 #include <Guid/SystemNvDataGuid.h>
     39 #include <Guid/FlashMapHob.h>
     40 #include <Guid/HobList.h>
     41 
     42 //
     43 // The Library classes this module consumes
     44 //
     45 #include <Library/UefiLib.h>
     46 #include <Library/UefiDriverEntryPoint.h>
     47 #include <Library/BaseLib.h>
     48 #include <Library/DxeServicesTableLib.h>
     49 #include <Library/UefiRuntimeLib.h>
     50 #include <Library/DebugLib.h>
     51 #include <Library/HobLib.h>
     52 #include <Library/BaseMemoryLib.h>
     53 #include <Library/MemoryAllocationLib.h>
     54 #include <Library/UefiBootServicesTableLib.h>
     55 #include <Library/PcdLib.h>
     56 
     57 
     58 #define FWH_READ_LOCK                   (1 << 2)
     59 #define FWH_LOCK_DOWN                   (1 << 1)
     60 #define FWH_WRITE_LOCK                  1
     61 #define FWH_WRITE_STATE_STATUS          (1 << 7)
     62 #define FWH_ERASE_STATUS                (1 << 5)
     63 #define FWH_PROGRAM_STATUS              (1 << 4)
     64 #define FWH_VPP_STATUS                  (1 << 3)
     65 #define STALL_TIME                      5
     66 #define FWH_ERASE_STATUS_BITS           (FWH_ERASE_STATUS || FWH_VPP_STATUS)
     67 #define FWH_WRITE_STATUS_BITS           (FWH_WRITE_STATUS || FWH_VPP_STATUS)
     68 
     69 //
     70 // BugBug: Add documentation here for data structure!!!!
     71 //
     72 #define FVB_PHYSICAL  0
     73 #define FVB_VIRTUAL   1
     74 
     75 #define EFI_FVB2_CAPABILITIES (EFI_FVB2_READ_DISABLED_CAP | \
     76                               EFI_FVB2_READ_ENABLED_CAP | \
     77                               EFI_FVB2_WRITE_DISABLED_CAP | \
     78                               EFI_FVB2_WRITE_ENABLED_CAP | \
     79                               EFI_FVB2_LOCK_CAP \
     80                               )
     81 #define EFI_FVB2_STATUS (EFI_FVB2_READ_STATUS | EFI_FVB2_WRITE_STATUS | EFI_FVB2_LOCK_STATUS)
     82 
     83 typedef struct {
     84   EFI_LOCK                    FvbDevLock;
     85   UINTN                       FvBase[2];
     86   //
     87   // We can treat VolumeSignature combined with MappedFile
     88   //  as a unique key to locate the mapped file.
     89 #define MAX_PATH 256
     90   UINT32                      VolumeId;
     91   CHAR16                      MappedFile[MAX_PATH];
     92   UINT32                      ActuralSize;
     93   UINT32                      Offset;
     94 
     95   EFI_DEVICE_PATH_PROTOCOL    *Device; // only used in BS period, won't use after memory map changed
     96   UINTN                       NumOfBlocks;
     97   BOOLEAN                     WriteEnabled;
     98   EFI_FIRMWARE_VOLUME_HEADER  VolumeHeader;
     99 } EFI_FW_VOL_INSTANCE;
    100 
    101 typedef struct {
    102   UINT32              NumFv;
    103   EFI_FW_VOL_INSTANCE *FvInstance[2];
    104   UINT8               *FvbScratchSpace[2];
    105 } ESAL_FWB_GLOBAL;
    106 
    107 //
    108 // Fvb Protocol instance data
    109 //
    110 #define FVB_DEVICE_FROM_THIS(a)         CR (a, EFI_FW_VOL_BLOCK_DEVICE, FwVolBlockInstance, FVB_DEVICE_SIGNATURE)
    111 #define FVB_EXTEND_DEVICE_FROM_THIS(a)  CR (a, EFI_FW_VOL_BLOCK_DEVICE, FvbExtension, FVB_DEVICE_SIGNATURE)
    112 #define FVB_DEVICE_SIGNATURE            SIGNATURE_32 ('F', 'V', 'B', 'C')
    113 
    114 typedef struct {
    115   MEMMAP_DEVICE_PATH        MemMapDevPath;
    116   EFI_DEVICE_PATH_PROTOCOL  EndDevPath;
    117 } FV_DEVICE_PATH;
    118 
    119 typedef struct {
    120   UINTN                               Signature;
    121   FV_DEVICE_PATH                      DevicePath;
    122   UINTN                               Instance;
    123   EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL  FwVolBlockInstance;
    124 } EFI_FW_VOL_BLOCK_DEVICE;
    125 
    126 EFI_STATUS
    127 GetFvbInfo (
    128   IN  EFI_PHYSICAL_ADDRESS              FvBaseAddress,
    129   OUT EFI_FIRMWARE_VOLUME_HEADER        **FvbInfo
    130   );
    131 
    132 EFI_STATUS
    133 EnableFvbWrites (
    134   IN  BOOLEAN   EnableWrites
    135   );
    136 
    137 EFI_STATUS
    138 PlatformGetFvbWriteBase (
    139   IN  UINTN     CurrentBaseAddress,
    140   IN  UINTN     *NewBaseAddress,
    141   IN  BOOLEAN   *WriteEnabled
    142   );
    143 
    144 EFI_STATUS
    145 EnablePlatformFvb (
    146   VOID
    147   );
    148 
    149 BOOLEAN
    150 SetPlatformFvbLock (
    151   IN UINTN  LbaAddress
    152   );
    153 
    154 EFI_STATUS
    155 FvbReadBlock (
    156   IN UINTN                                Instance,
    157   IN EFI_LBA                              Lba,
    158   IN UINTN                                BlockOffset,
    159   IN OUT UINTN                            *NumBytes,
    160   IN UINT8                                *Buffer,
    161   IN ESAL_FWB_GLOBAL                      *Global,
    162   IN BOOLEAN                              Virtual
    163   );
    164 
    165 EFI_STATUS
    166 FvbWriteBlock (
    167   IN UINTN                                Instance,
    168   IN EFI_LBA                              Lba,
    169   IN UINTN                                BlockOffset,
    170   IN OUT UINTN                            *NumBytes,
    171   IN UINT8                                *Buffer,
    172   IN ESAL_FWB_GLOBAL                      *Global,
    173   IN BOOLEAN                              Virtual
    174   );
    175 
    176 EFI_STATUS
    177 FvbEraseBlock (
    178   IN UINTN                                Instance,
    179   IN EFI_LBA                              Lba,
    180   IN ESAL_FWB_GLOBAL                      *Global,
    181   IN BOOLEAN                              Virtual
    182   );
    183 
    184 EFI_STATUS
    185 FvbSetVolumeAttributes (
    186   IN UINTN                                Instance,
    187   IN OUT EFI_FVB_ATTRIBUTES_2             *Attributes,
    188   IN ESAL_FWB_GLOBAL                      *Global,
    189   IN BOOLEAN                              Virtual
    190   );
    191 
    192 EFI_STATUS
    193 FvbGetVolumeAttributes (
    194   IN UINTN                                Instance,
    195   OUT EFI_FVB_ATTRIBUTES_2                *Attributes,
    196   IN ESAL_FWB_GLOBAL                      *Global,
    197   IN BOOLEAN                              Virtual
    198   );
    199 
    200 EFI_STATUS
    201 FvbGetPhysicalAddress (
    202   IN UINTN                                Instance,
    203   OUT EFI_PHYSICAL_ADDRESS                *Address,
    204   IN ESAL_FWB_GLOBAL                      *Global,
    205   IN BOOLEAN                              Virtual
    206   );
    207 
    208 EFI_STATUS
    209 EFIAPI
    210 FvbInitialize (
    211   IN EFI_HANDLE         ImageHandle,
    212   IN EFI_SYSTEM_TABLE   *SystemTable
    213   );
    214 
    215 VOID
    216 EFIAPI
    217 FvbClassAddressChangeEvent (
    218   IN EFI_EVENT        Event,
    219   IN VOID             *Context
    220   );
    221 
    222 EFI_STATUS
    223 FvbSpecificInitialize (
    224   IN  ESAL_FWB_GLOBAL   *mFvbModuleGlobal
    225   );
    226 
    227 EFI_STATUS
    228 FvbGetLbaAddress (
    229   IN  UINTN                               Instance,
    230   IN  EFI_LBA                             Lba,
    231   OUT UINTN                               *LbaAddress,
    232   OUT UINTN                               *LbaLength,
    233   OUT UINTN                               *NumOfBlocks,
    234   IN  ESAL_FWB_GLOBAL                     *Global,
    235   IN  BOOLEAN                             Virtual
    236   );
    237 
    238 //
    239 // Protocol APIs
    240 //
    241 EFI_STATUS
    242 EFIAPI
    243 FvbProtocolGetAttributes (
    244   IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL          *This,
    245   OUT      EFI_FVB_ATTRIBUTES_2                        *Attributes
    246   );
    247 
    248 EFI_STATUS
    249 EFIAPI
    250 FvbProtocolSetAttributes (
    251   IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL       *This,
    252   IN OUT   EFI_FVB_ATTRIBUTES_2                     *Attributes
    253   );
    254 
    255 EFI_STATUS
    256 EFIAPI
    257 FvbProtocolGetPhysicalAddress (
    258   IN  CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL          *This,
    259   OUT       EFI_PHYSICAL_ADDRESS                        *Address
    260   );
    261 
    262 EFI_STATUS
    263 EFIAPI
    264 FvbProtocolGetBlockSize (
    265   IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL           *This,
    266   IN  EFI_LBA                                     Lba,
    267   OUT UINTN                                       *BlockSize,
    268   OUT UINTN                                       *NumOfBlocks
    269   );
    270 
    271 EFI_STATUS
    272 EFIAPI
    273 FvbProtocolRead (
    274   IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL     *This,
    275   IN EFI_LBA                                      Lba,
    276   IN UINTN                                        Offset,
    277   IN OUT UINTN                                    *NumBytes,
    278   IN UINT8                                        *Buffer
    279   );
    280 
    281 EFI_STATUS
    282 EFIAPI
    283 FvbProtocolWrite (
    284   IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL     *This,
    285   IN EFI_LBA                                      Lba,
    286   IN UINTN                                        Offset,
    287   IN OUT UINTN                                    *NumBytes,
    288   IN UINT8                                        *Buffer
    289   );
    290 
    291 EFI_STATUS
    292 EFIAPI
    293 FvbProtocolEraseBlocks (
    294   IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL    *This,
    295   ...
    296   );
    297 
    298 #endif
    299