Home | History | Annotate | Download | only in FlashFvbDxe
      1 /** @file
      2 *
      3 *  Copyright (c) 2011-2015, ARM Limited. All rights reserved.
      4 *  Copyright (c) 2015, Hisilicon Limited. All rights reserved.
      5 *  Copyright (c) 2015, Linaro Limited. All rights reserved.
      6 *
      7 *  This program and the accompanying materials
      8 *  are licensed and made available under the terms and conditions of the BSD License
      9 *  which accompanies this distribution.  The full text of the license may be found at
     10 *  http://opensource.org/licenses/bsd-license.php
     11 *
     12 *  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
     13 *  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
     14 *
     15 **/
     16 
     17 
     18 #ifndef __FLASH_FVB_DXE_H__
     19 #define __FLASH_FVB_DXE_H__
     20 
     21 
     22 #include <Uefi.h>
     23 #include <PiDxe.h>
     24 #include <Library/BaseLib.h>
     25 #include <Library/HobLib.h>
     26 #include <Protocol/BlockIo.h>
     27 #include <Protocol/FirmwareVolumeBlock.h>
     28 #include <Library/DebugLib.h>
     29 
     30 #include <Library/IoLib.h>
     31 #include <Library/UefiLib.h>
     32 
     33 #include <Library/PcdLib.h>
     34 #include <Library/BaseMemoryLib.h>
     35 #include <Library/MemoryAllocationLib.h>
     36 #include <Library/UefiBootServicesTableLib.h>
     37 #include <Protocol/HisiSpiFlashProtocol.h>
     38 
     39 #include <Library/UefiRuntimeServicesTableLib.h>
     40 #include <Library/UefiRuntimeLib.h>
     41 
     42 #include <Guid/VariableFormat.h>
     43 #include <Guid/SystemNvDataGuid.h>
     44 
     45 
     46 #define FLASH_ERASE_RETRY                     10
     47 #define FLASH_DEVICE_COUNT                     1
     48 
     49 // Device access macros
     50 // These are necessary because we use 2 x 16bit parts to make up 32bit data
     51 typedef struct
     52 {
     53     UINTN       DeviceBaseAddress;    // Start address of the Device Base Address (DBA)
     54     UINTN       RegionBaseAddress;    // Start address of one single region
     55     UINTN       Size;
     56     UINTN       BlockSize;
     57     EFI_GUID    Guid;
     58 } FLASH_DESCRIPTION;
     59 
     60 #define GET_BLOCK_ADDRESS(BaseAddr,Lba,LbaSize)( BaseAddr + (UINTN)((Lba) * LbaSize) )
     61 
     62 #define FLASH_SIGNATURE                       SIGNATURE_32('s', 'p', 'i', '0')
     63 #define INSTANCE_FROM_FVB_THIS(a)             CR(a, FLASH_INSTANCE, FvbProtocol, FLASH_SIGNATURE)
     64 #define INSTANCE_FROM_BLKIO_THIS(a)           CR(a, FLASH_INSTANCE, BlockIoProtocol, FLASH_SIGNATURE)
     65 
     66 typedef struct _FLASH_INSTANCE                FLASH_INSTANCE;
     67 
     68 typedef EFI_STATUS (*FLASH_INITIALIZE)        (FLASH_INSTANCE* Instance);
     69 
     70 typedef struct
     71 {
     72     VENDOR_DEVICE_PATH                  Vendor;
     73     EFI_DEVICE_PATH_PROTOCOL            End;
     74 } FLASH_DEVICE_PATH;
     75 
     76 struct _FLASH_INSTANCE
     77 {
     78     UINT32                              Signature;
     79     EFI_HANDLE                          Handle;
     80 
     81     BOOLEAN                             Initialized;
     82     FLASH_INITIALIZE                    Initialize;
     83 
     84     UINTN                               DeviceBaseAddress;
     85     UINTN                               RegionBaseAddress;
     86     UINTN                               Size;
     87     EFI_LBA                             StartLba;
     88 
     89     EFI_BLOCK_IO_PROTOCOL               BlockIoProtocol;
     90     EFI_BLOCK_IO_MEDIA                  Media;
     91 
     92     BOOLEAN                             SupportFvb;
     93     EFI_FIRMWARE_VOLUME_BLOCK2_PROTOCOL FvbProtocol;
     94 
     95     FLASH_DEVICE_PATH                   DevicePath;
     96 };
     97 
     98 
     99 //
    100 // BlockIO Protocol function EFI_BLOCK_IO_PROTOCOL.ReadBlocks
    101 //
    102 EFI_STATUS
    103 EFIAPI
    104 FlashBlockIoReadBlocks (
    105     IN  EFI_BLOCK_IO_PROTOCOL*   This,
    106     IN  UINT32                   MediaId,
    107     IN  EFI_LBA                  Lba,
    108     IN  UINTN                    BufferSizeInBytes,
    109     OUT VOID*                    Buffer
    110 );
    111 
    112 //
    113 // BlockIO Protocol function EFI_BLOCK_IO_PROTOCOL.WriteBlocks
    114 //
    115 EFI_STATUS
    116 EFIAPI
    117 FlashBlockIoWriteBlocks (
    118     IN  EFI_BLOCK_IO_PROTOCOL*   This,
    119     IN  UINT32                   MediaId,
    120     IN  EFI_LBA                  Lba,
    121     IN  UINTN                    BufferSizeInBytes,
    122     IN  VOID*                    Buffer
    123 );
    124 
    125 //
    126 // BlockIO Protocol function EFI_BLOCK_IO_PROTOCOL.FlushBlocks
    127 //
    128 EFI_STATUS
    129 EFIAPI
    130 FlashBlockIoFlushBlocks (
    131     IN EFI_BLOCK_IO_PROTOCOL*    This
    132 );
    133 
    134 
    135 //
    136 // FvbHw.c
    137 //
    138 
    139 EFI_STATUS
    140 EFIAPI
    141 FvbInitialize (
    142     IN FLASH_INSTANCE*                            Instance
    143 );
    144 
    145 EFI_STATUS
    146 EFIAPI
    147 FvbGetAttributes(
    148     IN CONST  EFI_FIRMWARE_VOLUME_BLOCK2_PROTOCOL*     This,
    149     OUT       EFI_FVB_ATTRIBUTES_2*                    Attributes
    150 );
    151 
    152 EFI_STATUS
    153 EFIAPI
    154 FvbSetAttributes(
    155     IN CONST  EFI_FIRMWARE_VOLUME_BLOCK2_PROTOCOL*     This,
    156     IN OUT    EFI_FVB_ATTRIBUTES_2*                    Attributes
    157 );
    158 
    159 EFI_STATUS
    160 EFIAPI
    161 FvbGetPhysicalAddress(
    162     IN CONST  EFI_FIRMWARE_VOLUME_BLOCK2_PROTOCOL*     This,
    163     OUT       EFI_PHYSICAL_ADDRESS*                    Address
    164 );
    165 
    166 EFI_STATUS
    167 EFIAPI
    168 FvbGetBlockSize(
    169     IN CONST  EFI_FIRMWARE_VOLUME_BLOCK2_PROTOCOL*     This,
    170     IN        EFI_LBA                                  Lba,
    171     OUT       UINTN*                                   BlockSize,
    172     OUT       UINTN*                                   NumberOfBlocks
    173 );
    174 
    175 EFI_STATUS
    176 EFIAPI
    177 FvbRead(
    178     IN CONST  EFI_FIRMWARE_VOLUME_BLOCK2_PROTOCOL*     This,
    179     IN        EFI_LBA                                  Lba,
    180     IN        UINTN                                   Offset,
    181     IN OUT    UINTN*                                   NumBytes,
    182     IN OUT    UINT8*                                   Buffer
    183 );
    184 
    185 EFI_STATUS
    186 EFIAPI
    187 FvbWrite(
    188     IN CONST  EFI_FIRMWARE_VOLUME_BLOCK2_PROTOCOL*     This,
    189     IN        EFI_LBA                                  Lba,
    190     IN        UINTN                                    Offset,
    191     IN OUT    UINTN*                                   NumBytes,
    192     IN        UINT8*                                   Buffer
    193 );
    194 
    195 EFI_STATUS
    196 EFIAPI
    197 FvbEraseBlocks(
    198     IN CONST  EFI_FIRMWARE_VOLUME_BLOCK2_PROTOCOL*     This,
    199     ...
    200 );
    201 
    202 //
    203 // FlashFvbDxe.c
    204 //
    205 
    206 EFI_STATUS
    207 FlashUnlockAndEraseSingleBlock (
    208     IN FLASH_INSTANCE*         Instance,
    209     IN UINTN                   BlockAddress
    210 );
    211 
    212 EFI_STATUS
    213 FlashWriteBlocks (
    214     IN  FLASH_INSTANCE*    Instance,
    215     IN  EFI_LBA            Lba,
    216     IN  UINTN              BufferSizeInBytes,
    217     IN  VOID*              Buffer
    218 );
    219 
    220 EFI_STATUS
    221 FlashReadBlocks (
    222     IN FLASH_INSTANCE*       Instance,
    223     IN EFI_LBA               Lba,
    224     IN UINTN                 BufferSizeInBytes,
    225     OUT VOID*                Buffer
    226 );
    227 
    228 #endif
    229