Home | History | Annotate | Download | only in Library
      1 /*++
      2 
      3   Copyright (c) 2004  - 2014, Intel Corporation. All rights reserved.<BR>
      4 
      5   This program and the accompanying materials are licensed and made available under
      7   the terms and conditions of the BSD License that accompanies this distribution.
      9   The full text of the license may be found at
     11   http://opensource.org/licenses/bsd-license.php.
     13 
     15   THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
     17   WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
     19 
     21 
     23 
     24 
     25 Module Name:
     26 
     27   Fd.h
     28 
     29 Abstract:
     30 
     31   EFI Intel82802AB/82802AC Firmware Hub.
     32 
     33 
     34 --*/
     35 
     36 
     37 //
     38 // Supported SPI devices
     39 //
     40 
     41 //
     42 // MFG and Device code
     43 //
     44 #define SST_25LF040A        0x0044BF
     45 #define SST_25LF040         0x0040BF
     46 #define SST_25LF080A        0x0080BF
     47 #define SST_25VF080B        0x008EBF
     48 #define SST_25VF016B        0x0041BF
     49 #define SST_25VF032B        0x004ABF
     50 
     51 #define PMC_25LV040         0x007E9D
     52 
     53 #define ATMEL_26DF041       0x00441F
     54 #define Atmel_AT26F004      0x00041F
     55 #define Atmel_AT26DF081A    0x01451F
     56 #define Atmel_AT25DF161     0x02461F
     57 #define Atmel_AT26DF161     0x00461F
     58 #define Atmel_AT25DF641     0x00481F
     59 #define Atmel_AT26DF321     0x00471F
     60 
     61 #define Macronix_MX25L8005  0x1420C2
     62 #define Macronix_MX25L1605A 0x1520C2
     63 #define Macronix_MX25L3205D 0x1620C2
     64 
     65 #define STMicro_M25PE80     0x148020
     66 
     67 #define Winbond_W25X40      0x1330EF
     68 #define Winbond_W25X80      0x1430EF
     69 #define Winbond_W25Q80      0x1440EF
     70 
     71 #define Winbond_W25X16      0x1540EF    // W25Q16
     72 #define Winbond_W25X32      0x1630EF
     73 
     74 //
     75 //  NOTE: Assuming that 8Mbit flash will only contain a 4Mbit binary.
     76 //  Treating 4Mbit and 8Mbit devices the same.
     77 //
     78 
     79 //
     80 // BIOS Base Address
     81 //
     82 #define BIOS_BASE_ADDRESS_4M  0xFFF80000
     83 #define BIOS_BASE_ADDRESS_8M  0xFFF00000
     84 #define BIOS_BASE_ADDRESS_16M 0xFFE00000
     85 
     86 //
     87 // block and sector sizes
     88 //
     89 #define SECTOR_SIZE_256BYTE 0x100       // 256byte page size
     90 #define SECTOR_SIZE_4KB     0x1000      // 4kBytes sector size
     91 #define BLOCK_SIZE_32KB     0x00008000  // 32Kbytes block size
     92 #define MAX_FLASH_SIZE      0x00400000  // 32Mbit (Note that this can also be used for the 4Mbit & 8Mbit)
     93 
     94 //
     95 // Flash commands
     96 //
     97 #define SPI_SST25LF_COMMAND_WRITE         0x02
     98 #define SPI_SST25LF_COMMAND_READ          0x03
     99 #define SPI_SST25LF_COMMAND_ERASE         0x20
    100 #define SPI_SST25LF_COMMAND_WRITE_DISABLE 0x04
    101 #define SPI_SST25LF_COMMAND_READ_STATUS   0x05
    102 #define SPI_SST25LF_COMMAND_WRITE_ENABLE  0x06
    103 #define SPI_SST25LF_COMMAND_READ_ID       0xAB
    104 #define SPI_SST25LF_COMMAND_WRITE_S_EN    0x50
    105 #define SPI_SST25LF_COMMAND_WRITE_S       0x01
    106 
    107 #define SPI_PMC25LV_COMMAND_WRITE         0x02
    108 #define SPI_PMC25LV_COMMAND_READ          0x03
    109 #define SPI_PMC25LV_COMMAND_ERASE         0xD7
    110 #define SPI_PMC25LV_COMMAND_WRITE_DISABLE 0x04
    111 #define SPI_PMC25LV_COMMAND_READ_STATUS   0x05
    112 #define SPI_PMC25LV_COMMAND_WRITE_ENABLE  0x06
    113 #define SPI_PMC25LV_COMMAND_READ_ID       0xAB
    114 #define SPI_PMC25LV_COMMAND_WRITE_S_EN    0x06
    115 #define SPI_PMC25LV_COMMAND_WRITE_S       0x01
    116 
    117 #define SPI_AT26DF_COMMAND_WRITE         0x02
    118 #define SPI_AT26DF_COMMAND_READ          0x03
    119 #define SPI_AT26DF_COMMAND_ERASE         0x20
    120 #define SPI_AT26DF_COMMAND_WRITE_DISABLE 0x00
    121 #define SPI_AT26DF_COMMAND_READ_STATUS   0x05
    122 #define SPI_AT26DF_COMMAND_WRITE_ENABLE  0x00
    123 #define SPI_AT26DF_COMMAND_READ_ID       0x9F
    124 #define SPI_AT26DF_COMMAND_WRITE_S_EN    0x00
    125 #define SPI_AT26DF_COMMAND_WRITE_S       0x00
    126 
    127 #define SPI_AT26F_COMMAND_WRITE          0x02
    128 #define SPI_AT26F_COMMAND_READ           0x03
    129 #define SPI_AT26F_COMMAND_ERASE          0x20
    130 #define SPI_AT26F_COMMAND_WRITE_DISABLE  0x04
    131 #define SPI_AT26F_COMMAND_READ_STATUS    0x05
    132 #define SPI_AT26F_COMMAND_WRITE_ENABLE   0x06
    133 #define SPI_AT26F_COMMAND_JEDEC_ID       0x9F
    134 #define SPI_AT26F_COMMAND_WRITE_S_EN     0x00
    135 #define SPI_AT26F_COMMAND_WRITE_S        0x01
    136 #define SPI_AT26F_COMMAND_WRITE_UNPROTECT 0x39
    137 
    138 #define SPI_SST25VF_COMMAND_WRITE         0x02
    139 #define SPI_SST25VF_COMMAND_READ          0x03
    140 #define SPI_SST25VF_COMMAND_ERASE         0x20
    141 #define SPI_SST25VF_COMMAND_WRITE_DISABLE 0x04
    142 #define SPI_SST25VF_COMMAND_READ_STATUS   0x05
    143 #define SPI_SST25VF_COMMAND_WRITE_ENABLE  0x06
    144 #define SPI_SST25VF_COMMAND_READ_ID       0xAB
    145 #define SPI_SST25VF_COMMAND_JEDEC_ID      0x9F
    146 #define SPI_SST25VF_COMMAND_WRITE_S_EN    0x50
    147 #define SPI_SST25VF_COMMAND_WRITE_S       0x01
    148 
    149 #define SPI_STM25PE_COMMAND_WRITE         0x02
    150 #define SPI_STM25PE_COMMAND_READ          0x03
    151 #define SPI_STM25PE_COMMAND_ERASE         0xDB
    152 #define SPI_STM25PE_COMMAND_WRITE_DISABLE 0x04
    153 #define SPI_STM25PE_COMMAND_READ_STATUS   0x05
    154 #define SPI_STM25PE_COMMAND_WRITE_ENABLE  0x06
    155 #define SPI_STM25PE_COMMAND_JEDEC_ID      0x9F
    156 
    157 #define SPI_WinbondW25X_COMMAND_WRITE_S      0x01
    158 #define SPI_WinbondW25X_COMMAND_WRITE        0x02
    159 #define SPI_WinbondW25X_COMMAND_READ         0x03
    160 #define SPI_WinbondW25X_COMMAND_READ_STATUS  0x05
    161 #define SPI_WinbondW25X_COMMAND_ERASE_S      0x20
    162 #define SPI_WinbondW25X_COMMAND_WRITE_ENABLE 0x06
    163 #define SPI_WinbondW25X_COMMAND_JEDEC_ID     0x9F
    164 
    165 //
    166 // SPI default opcode slots
    167 //
    168 #define SPI_OPCODE_WRITE_INDEX           0
    169 #define SPI_OPCODE_READ_INDEX            1
    170 #define SPI_OPCODE_ERASE_INDEX           2
    171 #define SPI_OPCODE_READ_S_INDEX          3
    172 #define SPI_OPCODE_READ_ID_INDEX         4
    173 #define SPI_OPCODE_WRITE_S_INDEX         6
    174 #define SPI_OPCODE_WRITE_UNPROTECT_INDEX 7
    175 
    176 #define SPI_PREFIX_WRITE_S_EN 1
    177 #define SPI_PREFIX_WRITE_EN   0
    178 
    179 //
    180 // Atmel AT26F00x
    181 //
    182 #define B_AT26F_STS_REG_SPRL  0x80
    183 #define B_AT26F_STS_REG_SWP   0x0C
    184 
    185 //
    186 // Block lock bit definitions:
    187 //
    188 #define READ_LOCK   0x04
    189 #define LOCK_DOWN   0x02
    190 #define WRITE_LOCK  0x01
    191 #define FULL_ACCESS 0x00
    192 
    193 //
    194 // Function Prototypes
    195 //
    196 EFI_STATUS
    197 FlashGetNextBlock (
    198   IN UINTN*                               Key,
    199   OUT EFI_PHYSICAL_ADDRESS*               BlockAddress,
    200   OUT UINTN*                              BlockSize
    201   );
    202 
    203 EFI_STATUS
    204 FlashGetSize (
    205   OUT UINTN* Size
    206   );
    207 
    208 EFI_STATUS
    209 FlashGetUniformBlockSize (
    210   OUT UINTN* Size
    211   );
    212 
    213 EFI_STATUS
    214 FlashEraseWithNoTopSwapping (
    215   IN  UINT8 *BaseAddress,
    216   IN  UINTN NumBytes
    217   );
    218 
    219 EFI_STATUS
    220 FlashErase (
    221   IN  UINT8                 *BaseAddress,
    222   IN  UINTN                 NumBytes
    223   );
    224 
    225 EFI_STATUS
    226 FlashWriteWithNoTopSwapping (
    227   IN UINT8*                 DstBufferPtr,
    228   IN UINT8*                 SrcBufferPtr,
    229   IN UINTN                  NumBytes
    230   );
    231 
    232 EFI_STATUS
    233 FlashWrite (
    234   IN  UINT8                 *DstBufferPtr,
    235   IN  UINT8                 *SrcBufferPtr,
    236   IN  UINTN                 NumBytes
    237   );
    238 
    239 EFI_STATUS
    240 FlashReadWithNoTopSwapping (
    241   IN  UINT8                 *BaseAddress,
    242   IN  UINT8                 *DstBufferPtr,
    243   IN  UINTN                 NumBytes
    244   );
    245 
    246 EFI_STATUS
    247 FlashRead (
    248   IN  UINT8                 *BaseAddress,
    249   IN  UINT8                 *DstBufferPtr,
    250   IN  UINTN                 NumBytes
    251   );
    252 
    253 EFI_STATUS
    254 FlashLockWithNoTopSwapping (
    255   IN UINT8*                BaseAddress,
    256   IN UINTN                 NumBytes,
    257   IN UINT8                 LockState
    258   );
    259 
    260 EFI_STATUS
    261 FlashLock(
    262   IN  UINT8                 *BaseAddress,
    263   IN  UINTN                 NumBytes,
    264   IN  UINT8                 LockState
    265   );
    266 
    267 EFI_STATUS
    268 CheckIfErased(
    269   IN  UINT8       *DstBufferPtr,
    270   IN  UINTN       NumBytes
    271   );
    272 
    273 EFI_STATUS
    274 CheckIfFlashIsReadyForWrite (
    275   IN  UINT8       *DstBufferPtr,
    276   IN  UINT8       *SrcBufferPtr,
    277   IN  UINTN       NumBytes
    278   );
    279