Home | History | Annotate | Download | only in SpiFvbServices
      1 /** @file
      2 Firmware volume block driver for SPI device
      3 
      4 Copyright (c) 2013-2015 Intel Corporation.
      5 
      6 This program and the accompanying materials
      7 are licensed and made available under the terms and conditions of the BSD License
      8 which accompanies this distribution.  The full text of the license may be found at
      9 http://opensource.org/licenses/bsd-license.php
     10 
     11 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
     12 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
     13 
     14 
     15 **/
     16 
     17 #ifndef _FW_BLOCK_SERVICE_H
     18 #define _FW_BLOCK_SERVICE_H
     19 
     20 
     21 #include "SpiFlashDevice.h"
     22 
     23 //
     24 // Statements that include other header files
     25 
     26 #include <Library/IoLib.h>
     27 #include <Library/HobLib.h>
     28 #include <Library/PcdLib.h>
     29 #include <Library/UefiLib.h>
     30 #include <Library/DebugLib.h>
     31 #include <Library/BaseMemoryLib.h>
     32 #include <Library/DevicePathLib.h>
     33 #include <Library/UefiRuntimeLib.h>
     34 #include <Library/UefiDriverEntryPoint.h>
     35 #include <Library/UefiBootServicesTableLib.h>
     36 #include <Library/UefiRuntimeServicesTableLib.h>
     37 #include <Library/DxeServicesTableLib.h>
     38 #include <Library/MemoryAllocationLib.h>
     39 
     40 #include <Guid/EventGroup.h>
     41 #include <Guid/HobList.h>
     42 #include <Guid/FirmwareFileSystem2.h>
     43 #include <Guid/SystemNvDataGuid.h>
     44 
     45 #include <Protocol/SmmBase2.h>
     46 #include <Protocol/LoadedImage.h>
     47 #include <Protocol/PlatformSmmSpiReady.h>
     48 
     49 //
     50 // Define two helper macro to extract the Capability field or Status field in FVB
     51 // bit fields
     52 //
     53 #define EFI_FVB2_CAPABILITIES (EFI_FVB2_READ_DISABLED_CAP | \
     54                               EFI_FVB2_READ_ENABLED_CAP | \
     55                               EFI_FVB2_WRITE_DISABLED_CAP | \
     56                               EFI_FVB2_WRITE_ENABLED_CAP | \
     57                               EFI_FVB2_LOCK_CAP \
     58                               )
     59 
     60 #define EFI_FVB2_STATUS (EFI_FVB2_READ_STATUS | EFI_FVB2_WRITE_STATUS | EFI_FVB2_LOCK_STATUS)
     61 
     62 #define EFI_INTERNAL_POINTER  0x00000004
     63 #define FVB_PHYSICAL  0
     64 #define FVB_VIRTUAL   1
     65 
     66 typedef struct {
     67   EFI_LOCK                    FvbDevLock;
     68   UINTN                       FvBase[2];
     69   UINTN                       FvWriteBase[2];
     70   UINTN                       NumOfBlocks;
     71   BOOLEAN                     WriteEnabled;
     72   EFI_FIRMWARE_VOLUME_HEADER  VolumeHeader;
     73 } EFI_FW_VOL_INSTANCE;
     74 
     75 typedef struct {
     76   UINT32                NumFv;
     77   EFI_FW_VOL_INSTANCE   *FvInstance[2];
     78   UINT8                 *FvbScratchSpace[2];
     79   EFI_SPI_PROTOCOL      *SpiProtocol;
     80   EFI_SPI_PROTOCOL      *SmmSpiProtocol;
     81 } ESAL_FWB_GLOBAL;
     82 
     83 //
     84 // SPI default opcode slots
     85 //
     86 #define SPI_OPCODE_JEDEC_ID_INDEX        0
     87 #define SPI_OPCODE_READ_ID_INDEX         1
     88 #define SPI_OPCODE_WRITE_S_INDEX         2
     89 #define SPI_OPCODE_WRITE_INDEX           3
     90 #define SPI_OPCODE_READ_INDEX            4
     91 #define SPI_OPCODE_ERASE_INDEX           5
     92 #define SPI_OPCODE_READ_S_INDEX          6
     93 #define SPI_OPCODE_CHIP_ERASE_INDEX      7
     94 
     95 #define SPI_ERASE_SECTOR_SIZE            SIZE_4KB  //This is the chipset requirement
     96 
     97 //
     98 // Fvb Protocol instance data
     99 //
    100 #define FVB_DEVICE_FROM_THIS(a)         CR (a, EFI_FW_VOL_BLOCK_DEVICE, FwVolBlockInstance, FVB_DEVICE_SIGNATURE)
    101 #define FVB_EXTEND_DEVICE_FROM_THIS(a)  CR (a, EFI_FW_VOL_BLOCK_DEVICE, FvbExtension, FVB_DEVICE_SIGNATURE)
    102 #define FVB_DEVICE_SIGNATURE            SIGNATURE_32 ('F', 'V', 'B', 'C')
    103 //
    104 // Device Path
    105 //
    106 #define EFI_END_ENTIRE_DEVICE_PATH_SUBTYPE    0xff
    107 #define EfiDevicePathType(a)                  (((a)->Type) & 0x7f)
    108 #define EfiIsDevicePathEndType(a)             (EfiDevicePathType (a) == 0x7f)
    109 #define EfiIsDevicePathEndSubType(a)          ((a)->SubType == EFI_END_ENTIRE_DEVICE_PATH_SUBTYPE)
    110 #define EfiIsDevicePathEnd(a)                 (EfiIsDevicePathEndType (a) && EfiIsDevicePathEndSubType (a))
    111 
    112 typedef struct {
    113   MEMMAP_DEVICE_PATH        MemMapDevPath;
    114   EFI_DEVICE_PATH_PROTOCOL  EndDevPath;
    115 } FV_DEVICE_PATH;
    116 
    117 //
    118 // UEFI Specification define FV device path format if FV provide name GUID in extension header
    119 //
    120 typedef struct {
    121   MEDIA_FW_VOL_DEVICE_PATH    FvDevPath;
    122   EFI_DEVICE_PATH_PROTOCOL    EndDevPath;
    123 } UEFI_FV_DEVICE_PATH;
    124 
    125 typedef struct {
    126   UINTN                               Signature;
    127   FV_DEVICE_PATH                      FvDevicePath;
    128   UEFI_FV_DEVICE_PATH                 UefiFvDevicePath;
    129   UINTN                               Instance;
    130   EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL  FwVolBlockInstance;
    131 } EFI_FW_VOL_BLOCK_DEVICE;
    132 
    133 typedef struct {
    134   EFI_PHYSICAL_ADDRESS        BaseAddress;
    135   EFI_FIRMWARE_VOLUME_HEADER  FvbInfo;
    136   //
    137   // EFI_FV_BLOCK_MAP_ENTRY                ExtraBlockMap[n];//n=0
    138   //
    139   EFI_FV_BLOCK_MAP_ENTRY      End[1];
    140 } EFI_FVB_MEDIA_INFO;
    141 
    142 VOID
    143 FvbVirtualddressChangeEvent (
    144   IN EFI_EVENT        Event,
    145   IN VOID             *Context
    146   );
    147 
    148 EFI_STATUS
    149 GetFvbInfo (
    150   IN  EFI_PHYSICAL_ADDRESS              FvBaseAddress,
    151   OUT EFI_FIRMWARE_VOLUME_HEADER        **FvbInfo
    152   );
    153 
    154 BOOLEAN
    155 SetPlatformFvbLock (
    156   IN UINTN                              LbaAddress
    157   );
    158 
    159 EFI_STATUS
    160 FvbReadBlock (
    161   IN UINTN                              Instance,
    162   IN EFI_LBA                            Lba,
    163   IN UINTN                              BlockOffset,
    164   IN OUT UINTN                          *NumBytes,
    165   IN UINT8                              *Buffer,
    166   IN ESAL_FWB_GLOBAL                    *Global,
    167   IN BOOLEAN                            Virtual
    168   );
    169 
    170 EFI_STATUS
    171 FvbWriteBlock (
    172   IN UINTN                              Instance,
    173   IN EFI_LBA                            Lba,
    174   IN UINTN                              BlockOffset,
    175   IN OUT UINTN                          *NumBytes,
    176   IN UINT8                              *Buffer,
    177   IN ESAL_FWB_GLOBAL                    *Global,
    178   IN BOOLEAN                            Virtual
    179   );
    180 
    181 EFI_STATUS
    182 FvbEraseBlock (
    183   IN UINTN                              Instance,
    184   IN EFI_LBA                            Lba,
    185   IN ESAL_FWB_GLOBAL                    *Global,
    186   IN BOOLEAN                            Virtual
    187   );
    188 
    189 EFI_STATUS
    190 FvbSetVolumeAttributes (
    191   IN UINTN                              Instance,
    192   IN OUT EFI_FVB_ATTRIBUTES_2             *Attributes,
    193   IN ESAL_FWB_GLOBAL                    *Global,
    194   IN BOOLEAN                            Virtual
    195   );
    196 
    197 EFI_STATUS
    198 FvbGetVolumeAttributes (
    199   IN UINTN                              Instance,
    200   OUT EFI_FVB_ATTRIBUTES_2                *Attributes,
    201   IN ESAL_FWB_GLOBAL                    *Global,
    202   IN BOOLEAN                            Virtual
    203   );
    204 
    205 EFI_STATUS
    206 FvbGetPhysicalAddress (
    207   IN UINTN                              Instance,
    208   OUT EFI_PHYSICAL_ADDRESS              *Address,
    209   IN ESAL_FWB_GLOBAL                    *Global,
    210   IN BOOLEAN                            Virtual
    211   );
    212 
    213 EFI_STATUS
    214 FvbInitialize (
    215   IN EFI_HANDLE                         ImageHandle,
    216   IN EFI_SYSTEM_TABLE                   *SystemTable
    217   );
    218 
    219 VOID
    220 FvbClassAddressChangeEvent (
    221   IN EFI_EVENT                          Event,
    222   IN VOID                               *Context
    223   );
    224 
    225 EFI_STATUS
    226 FvbSpecificInitialize (
    227   IN  ESAL_FWB_GLOBAL                   *mFvbModuleGlobal
    228   );
    229 
    230 EFI_STATUS
    231 FvbGetLbaAddress (
    232   IN  UINTN                             Instance,
    233   IN  EFI_LBA                           Lba,
    234   OUT UINTN                             *LbaAddress,
    235   OUT UINTN                             *LbaWriteAddress,
    236   OUT UINTN                             *LbaLength,
    237   OUT UINTN                             *NumOfBlocks,
    238   IN  ESAL_FWB_GLOBAL                   *Global,
    239   IN  BOOLEAN                           Virtual
    240   );
    241 
    242 EFI_STATUS
    243 FvbEraseCustomBlockRange (
    244   IN UINTN                              Instance,
    245   IN EFI_LBA                            StartLba,
    246   IN UINTN                              OffsetStartLba,
    247   IN EFI_LBA                            LastLba,
    248   IN UINTN                              OffsetLastLba,
    249   IN ESAL_FWB_GLOBAL                    *Global,
    250   IN BOOLEAN                            Virtual
    251   );
    252 
    253 //
    254 // Protocol APIs
    255 //
    256 EFI_STATUS
    257 EFIAPI
    258 FvbProtocolGetAttributes (
    259   IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *This,
    260   OUT EFI_FVB_ATTRIBUTES_2                *Attributes
    261   );
    262 
    263 EFI_STATUS
    264 EFIAPI
    265 FvbProtocolSetAttributes (
    266   IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *This,
    267   IN OUT EFI_FVB_ATTRIBUTES_2             *Attributes
    268   );
    269 
    270 EFI_STATUS
    271 EFIAPI
    272 FvbProtocolGetPhysicalAddress (
    273   IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *This,
    274   OUT EFI_PHYSICAL_ADDRESS              *Address
    275   );
    276 
    277 EFI_STATUS
    278 FvbProtocolGetBlockSize (
    279   IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *This,
    280   IN  EFI_LBA                           Lba,
    281   OUT UINTN                             *BlockSize,
    282   OUT UINTN                             *NumOfBlocks
    283   );
    284 
    285 EFI_STATUS
    286 EFIAPI
    287 FvbProtocolRead (
    288   IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *This,
    289   IN EFI_LBA                            Lba,
    290   IN UINTN                              Offset,
    291   IN OUT UINTN                          *NumBytes,
    292   IN UINT8                              *Buffer
    293   );
    294 
    295 EFI_STATUS
    296 EFIAPI
    297 FvbProtocolWrite (
    298   IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *This,
    299   IN EFI_LBA                            Lba,
    300   IN UINTN                              Offset,
    301   IN OUT UINTN                          *NumBytes,
    302   IN UINT8                              *Buffer
    303   );
    304 
    305 EFI_STATUS
    306 EFIAPI
    307 FvbProtocolEraseBlocks (
    308   IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL         *This,
    309   ...
    310   );
    311 
    312 extern SPI_INIT_TABLE   mSpiInitTable[];
    313 
    314 #endif
    315