Home | History | Annotate | Download | only in FlashDeviceLib
      1 /** @file
      2 
      3   Copyright (c) 2004  - 2016, Intel Corporation. All rights reserved.<BR>
      4 
      5   This program and the accompanying materials are licensed and made available under
      6   the terms and conditions of the BSD License that accompanies this distribution.
      7   The full text of the license may be found at
      8   http://opensource.org/licenses/bsd-license.php.
      9 
     10   THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
     11   WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
     12 
     13 
     14 
     15 **/
     16 
     17 #include <Library/SpiFlash.H>
     18 
     19 #define FLASH_SIZE  0x400000
     20 
     21 //
     22 // Serial Flash device initialization data table provided to the
     23 // Intel(R) SPI Host Controller Compatibility Interface.
     24 //
     25 SPI_INIT_TABLE  mInitTable[] = {
     26   {
     27   SF_VENDOR_ID_WINBOND,     // VendorId
     28   SF_DEVICE_ID0_W25QXX,     // DeviceId 0
     29   SF_DEVICE_ID1_W25Q64,     // DeviceId 1
     30   {
     31     SF_INST_WREN,           // Prefix Opcode 0: Write Enable
     32     SF_INST_EWSR            // Prefix Opcode 1: Enable Write Status Register
     33   },
     34   {
     35     {EnumSpiOpcodeReadNoAddr,     SF_INST_JEDEC_READ_ID,  EnumSpiCycle50MHz, EnumSpiOperationJedecId           },     // Opcode 0: Read ID
     36     {EnumSpiOpcodeRead,           SF_INST_READ,           EnumSpiCycle50MHz, EnumSpiOperationReadData          },     // Opcode 1: Read
     37     {EnumSpiOpcodeReadNoAddr,     SF_INST_RDSR,           EnumSpiCycle50MHz, EnumSpiOperationReadStatus        },     // Opcode 2: Read Status Register
     38     {EnumSpiOpcodeRead,           SF_INST_SFDP,           EnumSpiCycle50MHz, EnumSpiOperationDiscoveryParameters},    // Opcode 3: Serial Flash Discovery Parameters
     39     {EnumSpiOpcodeWrite,          SF_INST_SERASE,         EnumSpiCycle50MHz, EnumSpiOperationErase_4K_Byte     },     // Opcode 4: Sector Erase (4KB)
     40     {EnumSpiOpcodeWrite,          SF_INST_64KB_ERASE,     EnumSpiCycle50MHz, EnumSpiOperationErase_64K_Byte    },     // Opcode 5: Block Erase (64KB
     41     {EnumSpiOpcodeWrite,          SF_INST_PROG,           EnumSpiCycle50MHz, EnumSpiOperationProgramData_1_Byte},     // Opcode 6: Byte Program
     42     {EnumSpiOpcodeWriteNoAddr,    SF_INST_WRSR,           EnumSpiCycle50MHz, EnumSpiOperationWriteStatus       },     // Opcode 7: Write Status Register
     43   },
     44 
     45   //
     46   // The offset of the start of the BIOS image in flash. This value is platform specific
     47   // and depends on the system flash map. If BIOS size is bigger than flash return -1.
     48   //
     49   ((WINBOND_W25Q64_SIZE >= FLASH_SIZE) ? WINBOND_W25Q64_SIZE - FLASH_SIZE : (UINTN) (-1)),
     50 
     51   //
     52   // The size of the BIOS image in flash. This value is platform specific and depends on the system flash map.
     53   //
     54   FLASH_SIZE
     55   },
     56   {
     57   SF_VENDOR_ID_ATMEL,       // VendorId
     58   SF_DEVICE_ID0_AT25DF321A,  // DeviceId 0
     59   SF_DEVICE_ID1_AT25DF321A, // DeviceId 1
     60   {
     61     SF_INST_WREN,           // Prefix Opcode 0: Write Enable
     62     SF_INST_WREN            // Prefix Opcode 1: Write Enable (this part doesn't support EWSR).
     63   },
     64   {
     65     {EnumSpiOpcodeReadNoAddr,     SF_INST_JEDEC_READ_ID,  EnumSpiCycle50MHz, EnumSpiOperationJedecId           },     // Opcode 0: Read ID
     66     {EnumSpiOpcodeRead,           SF_INST_READ,           EnumSpiCycle50MHz, EnumSpiOperationReadData          },     // Opcode 1: Read
     67     {EnumSpiOpcodeReadNoAddr,     SF_INST_RDSR,           EnumSpiCycle50MHz, EnumSpiOperationReadStatus        },     // Opcode 2: Read Status Register
     68     {EnumSpiOpcodeWriteNoAddr,    SF_INST_WRDI,           EnumSpiCycle50MHz, EnumSpiOperationWriteDisable      },     // Opcode 3: Write Disable
     69     {EnumSpiOpcodeWrite,          SF_INST_SERASE,         EnumSpiCycle50MHz, EnumSpiOperationErase_4K_Byte     },     // Opcode 4: Sector Erase (4KB)
     70     {EnumSpiOpcodeWrite,          SF_INST_64KB_ERASE,     EnumSpiCycle50MHz, EnumSpiOperationErase_64K_Byte    },     // Opcode 5: Block Erase (32KB)
     71     {EnumSpiOpcodeWrite,          SF_INST_PROG,           EnumSpiCycle50MHz, EnumSpiOperationProgramData_1_Byte},     // Opcode 6: Byte Program
     72     {EnumSpiOpcodeWriteNoAddr,    SF_INST_WRSR,           EnumSpiCycle50MHz, EnumSpiOperationWriteStatus       },     // Opcode 7: Write Status Register
     73   },
     74 
     75   //
     76   // The offset of the start of the BIOS image in flash. This value is platform specific
     77   // and depends on the system flash map. If BIOS size is bigger than flash return -1.
     78   //
     79   ((ATMEL_AT25DF321A_SIZE >= FLASH_SIZE) ? ATMEL_AT25DF321A_SIZE - FLASH_SIZE : (UINTN) (-1)),
     80 
     81   //
     82   // The size of the BIOS image in flash. This value is platform specific and depends on the system flash map.
     83   //
     84   FLASH_SIZE
     85   },
     86   {
     87   SF_VENDOR_ID_ATMEL,       // VendorId
     88   SF_DEVICE_ID0_AT26DF321,  // DeviceId 0
     89   SF_DEVICE_ID1_AT26DF321,  // DeviceId 1
     90   {
     91     SF_INST_WREN,           // Prefix Opcode 0: Write Enable
     92     SF_INST_WREN            // Prefix Opcode 1: Write Enable (this part doesn't support EWSR).
     93   },
     94   {
     95     {EnumSpiOpcodeReadNoAddr,     SF_INST_JEDEC_READ_ID,  EnumSpiCycle50MHz, EnumSpiOperationJedecId           },     // Opcode 0: Read ID
     96     {EnumSpiOpcodeRead,           SF_INST_READ,           EnumSpiCycle50MHz, EnumSpiOperationReadData          },     // Opcode 1: Read
     97     {EnumSpiOpcodeReadNoAddr,     SF_INST_RDSR,           EnumSpiCycle50MHz, EnumSpiOperationReadStatus        },     // Opcode 2: Read Status Register
     98     {EnumSpiOpcodeWriteNoAddr,    SF_INST_WRDI,           EnumSpiCycle50MHz, EnumSpiOperationWriteDisable      },     // Opcode 3: Write Disable
     99     {EnumSpiOpcodeWrite,          SF_INST_SERASE,         EnumSpiCycle50MHz, EnumSpiOperationErase_4K_Byte     },     // Opcode 4: Sector Erase (4KB)
    100     {EnumSpiOpcodeWrite,          SF_INST_64KB_ERASE,     EnumSpiCycle50MHz, EnumSpiOperationErase_64K_Byte    },     // Opcode 5: Block Erase (32KB)
    101     {EnumSpiOpcodeWrite,          SF_INST_PROG,           EnumSpiCycle50MHz, EnumSpiOperationProgramData_1_Byte},     // Opcode 6: Byte Program
    102     {EnumSpiOpcodeWriteNoAddr,    SF_INST_WRSR,           EnumSpiCycle50MHz, EnumSpiOperationWriteStatus       },     // Opcode 7: Write Status Register
    103   },
    104 
    105   //
    106   // The offset of the start of the BIOS image in flash. This value is platform specific
    107   // and depends on the system flash map. If BIOS size is bigger than flash return -1.
    108   //
    109   ((ATMEL_AT26DF321_SIZE >= FLASH_SIZE) ? ATMEL_AT26DF321_SIZE - FLASH_SIZE : (UINTN) (-1)),
    110 
    111   //
    112   // The size of the BIOS image in flash. This value is platform specific and depends on the system flash map.
    113   //
    114   FLASH_SIZE
    115   },
    116   {
    117   SF_VENDOR_ID_ATMEL,       // VendorId
    118   SF_DEVICE_ID0_AT25DF641,  // DeviceId 0
    119   SF_DEVICE_ID1_AT25DF641,  // DeviceId 1
    120   {
    121     SF_INST_WREN,           // Prefix Opcode 0: Write Enable
    122     SF_INST_WREN            // Prefix Opcode 1: Write Enable (this part doesn't support EWSR).
    123   },
    124   {
    125     {EnumSpiOpcodeReadNoAddr,     SF_INST_JEDEC_READ_ID,  EnumSpiCycle50MHz, EnumSpiOperationJedecId           },     // Opcode 0: Read ID
    126     {EnumSpiOpcodeRead,           SF_INST_READ,           EnumSpiCycle50MHz, EnumSpiOperationReadData          },     // Opcode 1: Read
    127     {EnumSpiOpcodeReadNoAddr,     SF_INST_RDSR,           EnumSpiCycle50MHz, EnumSpiOperationReadStatus        },     // Opcode 2: Read Status Register
    128     {EnumSpiOpcodeWriteNoAddr,    SF_INST_WRDI,           EnumSpiCycle50MHz, EnumSpiOperationWriteDisable      },     // Opcode 3: Write Disable
    129     {EnumSpiOpcodeWrite,          SF_INST_SERASE,         EnumSpiCycle50MHz, EnumSpiOperationErase_4K_Byte     },     // Opcode 4: Sector Erase (4KB)
    130     {EnumSpiOpcodeWrite,          SF_INST_64KB_ERASE,     EnumSpiCycle50MHz, EnumSpiOperationErase_64K_Byte    },     // Opcode 5: Block Erase (32KB)
    131     {EnumSpiOpcodeWrite,          SF_INST_PROG,           EnumSpiCycle50MHz, EnumSpiOperationProgramData_1_Byte},     // Opcode 6: Byte Program
    132     {EnumSpiOpcodeWriteNoAddr,    SF_INST_WRSR,           EnumSpiCycle50MHz, EnumSpiOperationWriteStatus       },     // Opcode 7: Write Status Register
    133   },
    134 
    135   //
    136   // The offset of the start of the BIOS image in flash. This value is platform specific
    137   // and depends on the system flash map. If BIOS size is bigger than flash return -1.
    138   //
    139   ((ATMEL_AT25DF641_SIZE >= FLASH_SIZE) ? ATMEL_AT25DF641_SIZE - FLASH_SIZE : (UINTN) (-1)),
    140 
    141   //
    142   // The size of the BIOS image in flash. This value is platform specific and depends on the system flash map.
    143   //
    144   FLASH_SIZE
    145   },
    146   {
    147   SF_VENDOR_ID_WINBOND,     // VendorId
    148   SF_DEVICE_ID0_W25QXX,     // DeviceId 0
    149   SF_DEVICE_ID1_W25Q16,     // DeviceId 1
    150   {
    151     SF_INST_WREN,           // Prefix Opcode 0: Write Enable
    152     SF_INST_EWSR            // Prefix Opcode 1: Enable Write Status Register
    153   },
    154   {
    155     {EnumSpiOpcodeReadNoAddr,     SF_INST_JEDEC_READ_ID,  EnumSpiCycle50MHz, EnumSpiOperationJedecId           },     // Opcode 0: Read ID
    156     {EnumSpiOpcodeRead,           SF_INST_READ,           EnumSpiCycle50MHz, EnumSpiOperationReadData          },     // Opcode 1: Read
    157     {EnumSpiOpcodeReadNoAddr,     SF_INST_RDSR,           EnumSpiCycle50MHz, EnumSpiOperationReadStatus        },     // Opcode 2: Read Status Register
    158     {EnumSpiOpcodeRead,           SF_INST_SFDP,           EnumSpiCycle50MHz, EnumSpiOperationDiscoveryParameters},    // Opcode 3: Serial Flash Discovery Parameters
    159     {EnumSpiOpcodeWrite,          SF_INST_SERASE,         EnumSpiCycle50MHz, EnumSpiOperationErase_4K_Byte     },     // Opcode 4: Sector Erase (4KB)
    160     {EnumSpiOpcodeWrite,          SF_INST_64KB_ERASE,     EnumSpiCycle50MHz, EnumSpiOperationErase_64K_Byte    },     // Opcode 5: Block Erase (64KB
    161     {EnumSpiOpcodeWrite,          SF_INST_PROG,           EnumSpiCycle50MHz, EnumSpiOperationProgramData_1_Byte},     // Opcode 6: Byte Program
    162     {EnumSpiOpcodeWriteNoAddr,    SF_INST_WRSR,           EnumSpiCycle50MHz, EnumSpiOperationWriteStatus       },     // Opcode 7: Write Status Register
    163   },
    164 
    165   //
    166   // The offset of the start of the BIOS image in flash. This value is platform specific
    167   // and depends on the system flash map. If BIOS size is bigger than flash return -1.
    168   //
    169   ((WINBOND_W25Q16_SIZE >= FLASH_SIZE) ? WINBOND_W25Q16_SIZE - FLASH_SIZE : (UINTN) (-1)),
    170 
    171   //
    172   // The size of the BIOS image in flash. This value is platform specific and depends on the system flash map.
    173   //
    174   FLASH_SIZE
    175   },
    176   {
    177   SF_VENDOR_ID_WINBOND,     // VendorId
    178   SF_DEVICE_ID0_W25QXX,     // DeviceId 0
    179   SF_DEVICE_ID1_W25Q32,     // DeviceId 1
    180   {
    181     SF_INST_WREN,           // Prefix Opcode 0: Write Enable
    182     SF_INST_EWSR            // Prefix Opcode 1: Enable Write Status Register.
    183   },
    184   {
    185     {EnumSpiOpcodeReadNoAddr,     SF_INST_JEDEC_READ_ID,  EnumSpiCycle50MHz, EnumSpiOperationJedecId           },     // Opcode 0: Read ID
    186     {EnumSpiOpcodeRead,           SF_INST_READ,           EnumSpiCycle50MHz, EnumSpiOperationReadData          },     // Opcode 1: Read
    187     {EnumSpiOpcodeReadNoAddr,     SF_INST_RDSR,           EnumSpiCycle50MHz, EnumSpiOperationReadStatus        },     // Opcode 2: Read Status Register
    188     {EnumSpiOpcodeRead,           SF_INST_SFDP,           EnumSpiCycle50MHz, EnumSpiOperationDiscoveryParameters},    // Opcode 3: Serial Flash Discovery Parameters
    189     {EnumSpiOpcodeWrite,          SF_INST_SERASE,         EnumSpiCycle50MHz, EnumSpiOperationErase_4K_Byte     },     // Opcode 4: Sector Erase (4KB)
    190     {EnumSpiOpcodeWrite,          SF_INST_64KB_ERASE,     EnumSpiCycle50MHz, EnumSpiOperationErase_64K_Byte    },     // Opcode 5: Block Erase (64KB
    191     {EnumSpiOpcodeWrite,          SF_INST_PROG,           EnumSpiCycle50MHz, EnumSpiOperationProgramData_1_Byte},     // Opcode 6: Byte Program
    192     {EnumSpiOpcodeWriteNoAddr,    SF_INST_WRSR,           EnumSpiCycle50MHz, EnumSpiOperationWriteStatus       },     // Opcode 7: Write Status Register
    193   },
    194 
    195   //
    196   // The offset of the start of the BIOS image in flash. This value is platform specific
    197   // and depends on the system flash map. If BIOS size is bigger than flash return -1.
    198   //
    199   ((WINBOND_W25Q32_SIZE >= FLASH_SIZE) ? WINBOND_W25Q32_SIZE - FLASH_SIZE : (UINTN) (-1)),
    200 
    201   //
    202   // The size of the BIOS image in flash. This value is platform specific and depends on the system flash map.
    203   //
    204   FLASH_SIZE
    205   },
    206   {
    207   SF_VENDOR_ID_WINBOND,     // VendorId
    208   SF_DEVICE_ID0_W25XXX,     // DeviceId 0
    209   SF_DEVICE_ID1_W25X32,     // DeviceId 1
    210   {
    211     SF_INST_WREN,           // Prefix Opcode 0: Write Enable
    212     SF_INST_EWSR            // Prefix Opcode 1: Enable Write Status Register
    213   },
    214   {
    215     {EnumSpiOpcodeReadNoAddr,     SF_INST_JEDEC_READ_ID,  EnumSpiCycle50MHz, EnumSpiOperationJedecId           },     // Opcode 0: Read ID
    216     {EnumSpiOpcodeRead,           SF_INST_READ,           EnumSpiCycle50MHz, EnumSpiOperationReadData          },     // Opcode 1: Read
    217     {EnumSpiOpcodeReadNoAddr,     SF_INST_RDSR,           EnumSpiCycle50MHz, EnumSpiOperationReadStatus        },     // Opcode 2: Read Status Register
    218     {EnumSpiOpcodeRead,           SF_INST_SFDP,           EnumSpiCycle50MHz, EnumSpiOperationDiscoveryParameters},    // Opcode 3: Serial Flash Discovery Parameters
    219     {EnumSpiOpcodeWrite,          SF_INST_SERASE,         EnumSpiCycle50MHz, EnumSpiOperationErase_4K_Byte     },     // Opcode 4: Sector Erase (4KB)
    220     {EnumSpiOpcodeWrite,          SF_INST_64KB_ERASE,     EnumSpiCycle50MHz, EnumSpiOperationErase_64K_Byte    },     // Opcode 5: Block Erase (64KB
    221     {EnumSpiOpcodeWrite,          SF_INST_PROG,           EnumSpiCycle50MHz, EnumSpiOperationProgramData_1_Byte},     // Opcode 6: Byte Program
    222     {EnumSpiOpcodeWriteNoAddr,    SF_INST_WRSR,           EnumSpiCycle50MHz, EnumSpiOperationWriteStatus       },     // Opcode 7: Write Status Register
    223   },
    224 
    225   //
    226   // The offset of the start of the BIOS image in flash. This value is platform specific
    227   // and depends on the system flash map. If BIOS size is bigger than flash return -1.
    228   //
    229   ((WINBOND_W25X32_SIZE >= FLASH_SIZE) ? WINBOND_W25X32_SIZE - FLASH_SIZE : (UINTN) (-1)),
    230 
    231   //
    232   // The size of the BIOS image in flash. This value is platform specific and depends on the system flash map.
    233   //
    234   FLASH_SIZE
    235   },
    236   {
    237   SF_VENDOR_ID_WINBOND,     // VendorId
    238   SF_DEVICE_ID0_W25XXX,     // DeviceId 0
    239   SF_DEVICE_ID1_W25X64,     // DeviceId 1
    240   {
    241     SF_INST_WREN,           // Prefix Opcode 0: Write Enable
    242     SF_INST_EWSR            // Prefix Opcode 1: Enable Write Status Register
    243   },
    244   {
    245     {EnumSpiOpcodeReadNoAddr,     SF_INST_JEDEC_READ_ID,  EnumSpiCycle50MHz, EnumSpiOperationJedecId      },     // Opcode 0: Read ID
    246     {EnumSpiOpcodeRead,           SF_INST_READ,           EnumSpiCycle50MHz, EnumSpiOperationReadData      },     // Opcode 1: Read
    247     {EnumSpiOpcodeReadNoAddr,     SF_INST_RDSR,           EnumSpiCycle50MHz, EnumSpiOperationReadStatus    },     // Opcode 2: Read Status Register
    248     {EnumSpiOpcodeRead,           SF_INST_SFDP,           EnumSpiCycle50MHz, EnumSpiOperationDiscoveryParameters},    // Opcode 3: Serial Flash Discovery Parameters
    249     {EnumSpiOpcodeWrite,          SF_INST_SERASE,         EnumSpiCycle50MHz, EnumSpiOperationErase_4K_Byte  },     // Opcode 4: Sector Erase (4KB)
    250     {EnumSpiOpcodeWrite,          SF_INST_64KB_ERASE,     EnumSpiCycle50MHz, EnumSpiOperationErase_64K_Byte  },     // Opcode 5: Block Erase (64KB
    251     {EnumSpiOpcodeWrite,          SF_INST_PROG,           EnumSpiCycle50MHz, EnumSpiOperationProgramData_1_Byte},    // Opcode 6: Byte Program
    252     {EnumSpiOpcodeWriteNoAddr,    SF_INST_WRSR,           EnumSpiCycle50MHz, EnumSpiOperationWriteStatus    },     // Opcode 7: Write Status Register
    253   },
    254 
    255   //
    256   // The offset of the start of the BIOS image in flash. This value is platform specific
    257   // and depends on the system flash map. If BIOS size is bigger than flash return -1.
    258   //
    259   ((WINBOND_W25X64_SIZE >= FLASH_SIZE) ? WINBOND_W25X64_SIZE - FLASH_SIZE : (UINTN) (-1)),
    260 
    261   //
    262   // The size of the BIOS image in flash. This value is platform specific and depends on the system flash map.
    263   //
    264   FLASH_SIZE
    265   },
    266   {
    267   SF_VENDOR_ID_WINBOND,     // VendorId
    268   SF_DEVICE_ID0_W25QXX,     // DeviceId 0
    269   SF_DEVICE_ID1_W25Q128,    // DeviceId 1
    270   {
    271     SF_INST_WREN,           // Prefix Opcode 0: Write Enable
    272     SF_INST_EWSR            // Prefix Opcode 1: Enable Write Status Register
    273   },
    274   {
    275     {EnumSpiOpcodeReadNoAddr,     SF_INST_JEDEC_READ_ID,  EnumSpiCycle50MHz, EnumSpiOperationJedecId           },     // Opcode 0: Read ID
    276     {EnumSpiOpcodeRead,           SF_INST_READ,           EnumSpiCycle50MHz, EnumSpiOperationReadData          },     // Opcode 1: Read
    277     {EnumSpiOpcodeReadNoAddr,     SF_INST_RDSR,           EnumSpiCycle50MHz, EnumSpiOperationReadStatus        },     // Opcode 2: Read Status Register
    278     {EnumSpiOpcodeRead,           SF_INST_SFDP,           EnumSpiCycle50MHz, EnumSpiOperationDiscoveryParameters},    // Opcode 3: Serial Flash Discovery Parameters
    279     {EnumSpiOpcodeWrite,          SF_INST_SERASE,         EnumSpiCycle50MHz, EnumSpiOperationErase_4K_Byte     },     // Opcode 4: Sector Erase (4KB)
    280     {EnumSpiOpcodeWrite,          SF_INST_64KB_ERASE,     EnumSpiCycle50MHz, EnumSpiOperationErase_64K_Byte    },     // Opcode 5: Block Erase (64KB
    281     {EnumSpiOpcodeWrite,          SF_INST_PROG,           EnumSpiCycle50MHz, EnumSpiOperationProgramData_1_Byte},     // Opcode 6: Byte Program
    282     {EnumSpiOpcodeWriteNoAddr,    SF_INST_WRSR,           EnumSpiCycle50MHz, EnumSpiOperationWriteStatus       },     // Opcode 7: Write Status Register
    283   },
    284 
    285   //
    286   // The offset of the start of the BIOS image in flash. This value is platform specific
    287   // and depends on the system flash map. If BIOS size is bigger than flash return -1.
    288   //
    289   ((WINBOND_W25Q128_SIZE >= FLASH_SIZE) ? WINBOND_W25Q128_SIZE - FLASH_SIZE : (UINTN) (-1)),
    290 
    291   //
    292   // The size of the BIOS image in flash. This value is platform specific and depends on the system flash map.
    293   //
    294   FLASH_SIZE
    295   },
    296   {
    297   SF_VENDOR_ID_MACRONIX,    // VendorId
    298   SF_DEVICE_ID0_MX25LXX,    // DeviceId 0
    299   SF_DEVICE_ID1_MX25L16,    // DeviceId 1
    300   {
    301     SF_INST_WREN,           // Prefix Opcode 0: Write Enable
    302     SF_INST_EWSR            // Prefix Opcode 1:  Write Enable (this part doesn't support EWSR).
    303   },
    304   {
    305     {EnumSpiOpcodeReadNoAddr,     SF_INST_JEDEC_READ_ID,  EnumSpiCycle50MHz, EnumSpiOperationJedecId      },      // Opcode 0: Read ID
    306     {EnumSpiOpcodeRead,           SF_INST_READ,           EnumSpiCycle33MHz, EnumSpiOperationReadData      },      // Opcode 1: Read
    307     {EnumSpiOpcodeReadNoAddr,     SF_INST_RDSR,           EnumSpiCycle50MHz, EnumSpiOperationReadStatus    },      // Opcode 2: Read Status Register
    308     {EnumSpiOpcodeRead,           SF_INST_SFDP,           EnumSpiCycle50MHz, EnumSpiOperationDiscoveryParameters},    // Opcode 3: Serial Flash Discovery Parameters
    309     {EnumSpiOpcodeWrite,          SF_INST_SERASE,         EnumSpiCycle50MHz, EnumSpiOperationErase_4K_Byte  },      // Opcode 4: Sector Erase (4KB)
    310     {EnumSpiOpcodeWrite,          SF_INST_64KB_ERASE,     EnumSpiCycle50MHz, EnumSpiOperationErase_64K_Byte  },      // Opcode 5: Block Erase (64KB
    311     {EnumSpiOpcodeWrite,          SF_INST_PROG,           EnumSpiCycle50MHz, EnumSpiOperationProgramData_1_Byte},     // Opcode 6: Byte Program
    312     {EnumSpiOpcodeWriteNoAddr,    SF_INST_WRSR,           EnumSpiCycle50MHz, EnumSpiOperationWriteStatus    },      // Opcode 7: Write Status Register
    313   },
    314 
    315   //
    316   // The offset of the start of the BIOS image in flash. This value is platform specific
    317   // and depends on the system flash map. If BIOS size is bigger than flash return -1.
    318   //
    319   ((MACRONIX_MX25L16_SIZE >= FLASH_SIZE) ? MACRONIX_MX25L16_SIZE - FLASH_SIZE : (UINTN) (-1)),
    320 
    321   //
    322   // The size of the BIOS image in flash. This value is platform specific and depends on the system flash map.
    323   //
    324   FLASH_SIZE
    325   },
    326   {
    327   SF_VENDOR_ID_MACRONIX,    // VendorId
    328   SF_DEVICE_ID0_MX25LXX,    // DeviceId 0
    329   SF_DEVICE_ID1_MX25L32,    // DeviceId 1
    330   {
    331     SF_INST_WREN,           // Prefix Opcode 0: Write Enable
    332     SF_INST_EWSR            // Prefix Opcode 1:  Write Enable (this part doesn't support EWSR).
    333   },
    334   {
    335     {EnumSpiOpcodeReadNoAddr,     SF_INST_JEDEC_READ_ID,  EnumSpiCycle50MHz, EnumSpiOperationJedecId      },      // Opcode 0: Read ID
    336     {EnumSpiOpcodeRead,           SF_INST_READ,           EnumSpiCycle33MHz, EnumSpiOperationReadData      },      // Opcode 1: Read
    337     {EnumSpiOpcodeReadNoAddr,     SF_INST_RDSR,           EnumSpiCycle50MHz, EnumSpiOperationReadStatus    },      // Opcode 2: Read Status Register
    338     {EnumSpiOpcodeRead,           SF_INST_SFDP,           EnumSpiCycle50MHz, EnumSpiOperationDiscoveryParameters},    // Opcode 3: Serial Flash Discovery Parameters
    339     {EnumSpiOpcodeWrite,          SF_INST_SERASE,         EnumSpiCycle50MHz, EnumSpiOperationErase_4K_Byte  },      // Opcode 4: Sector Erase (4KB)
    340     {EnumSpiOpcodeWrite,          SF_INST_64KB_ERASE,     EnumSpiCycle50MHz, EnumSpiOperationErase_64K_Byte  },      // Opcode 5: Block Erase (64KB
    341     {EnumSpiOpcodeWrite,          SF_INST_PROG,           EnumSpiCycle50MHz, EnumSpiOperationProgramData_1_Byte},     // Opcode 6: Byte Program
    342     {EnumSpiOpcodeWriteNoAddr,    SF_INST_WRSR,           EnumSpiCycle50MHz, EnumSpiOperationWriteStatus    },      // Opcode 7: Write Status Register
    343   },
    344 
    345   //
    346   // The offset of the start of the BIOS image in flash. This value is platform specific
    347   // and depends on the system flash map. If BIOS size is bigger than flash return -1.
    348   //
    349   ((MACRONIX_MX25L32_SIZE >= FLASH_SIZE) ? MACRONIX_MX25L32_SIZE - FLASH_SIZE : (UINTN) (-1)),
    350 
    351   //
    352   // The size of the BIOS image in flash. This value is platform specific and depends on the system flash map.
    353   //
    354   FLASH_SIZE
    355   },
    356   {
    357   SF_VENDOR_ID_MACRONIX,    // VendorId
    358   SF_DEVICE_ID0_MX25LXX,    // DeviceId 0
    359   SF_DEVICE_ID1_MX25L64,    // DeviceId 1
    360   {
    361     SF_INST_WREN,           // Prefix Opcode 0: Write Enable
    362     SF_INST_EWSR            // Prefix Opcode 1:  Write Enable (this part doesn't support EWSR)
    363   },
    364   {
    365     {EnumSpiOpcodeReadNoAddr,     SF_INST_JEDEC_READ_ID,  EnumSpiCycle50MHz, EnumSpiOperationJedecId      },      // Opcode 0: Read ID
    366     {EnumSpiOpcodeRead,           SF_INST_READ,           EnumSpiCycle33MHz, EnumSpiOperationReadData      },      // Opcode 1: Read
    367     {EnumSpiOpcodeReadNoAddr,     SF_INST_RDSR,           EnumSpiCycle50MHz, EnumSpiOperationReadStatus    },      // Opcode 2: Read Status Register
    368     {EnumSpiOpcodeRead,           SF_INST_SFDP,           EnumSpiCycle50MHz, EnumSpiOperationDiscoveryParameters},    // Opcode 3: Serial Flash Discovery Parameters
    369     {EnumSpiOpcodeWrite,          SF_INST_SERASE,         EnumSpiCycle50MHz, EnumSpiOperationErase_4K_Byte  },      // Opcode 4: Sector Erase (4KB)
    370     {EnumSpiOpcodeWrite,          SF_INST_64KB_ERASE,     EnumSpiCycle50MHz, EnumSpiOperationErase_64K_Byte  },      // Opcode 5: Block Erase (64KB
    371     {EnumSpiOpcodeWrite,          SF_INST_PROG,           EnumSpiCycle50MHz, EnumSpiOperationProgramData_1_Byte},     // Opcode 6: Byte Program
    372     {EnumSpiOpcodeWriteNoAddr,    SF_INST_WRSR,           EnumSpiCycle50MHz, EnumSpiOperationWriteStatus    },      // Opcode 7: Write Status Register
    373   },
    374 
    375   //
    376   // The offset of the start of the BIOS image in flash. This value is platform specific
    377   // and depends on the system flash map. If BIOS size is bigger than flash return -1.
    378   //
    379   ((MACRONIX_MX25L64_SIZE >= FLASH_SIZE) ? MACRONIX_MX25L64_SIZE - FLASH_SIZE : (UINTN) (-1)),
    380 
    381   //
    382   // The size of the BIOS image in flash. This value is platform specific and depends on the system flash map.
    383   //
    384   FLASH_SIZE
    385   },
    386   {
    387   SF_VENDOR_ID_MACRONIX,    // VendorId
    388   SF_DEVICE_ID0_MX25LXX,    // DeviceId 0
    389   SF_DEVICE_ID1_MX25L128,   // DeviceId 1
    390   {
    391     SF_INST_WREN,           // Prefix Opcode 0: Write Enable
    392     SF_INST_EWSR            // Prefix Opcode 1:  Write Enable (this part doesn't support EWSR)
    393   },
    394   {
    395     {EnumSpiOpcodeReadNoAddr,     SF_INST_JEDEC_READ_ID,  EnumSpiCycle50MHz, EnumSpiOperationJedecId      },      // Opcode 0: Read ID
    396     {EnumSpiOpcodeRead,           SF_INST_READ,           EnumSpiCycle33MHz, EnumSpiOperationReadData      },      // Opcode 1: Read
    397     {EnumSpiOpcodeReadNoAddr,     SF_INST_RDSR,           EnumSpiCycle50MHz, EnumSpiOperationReadStatus    },      // Opcode 2: Read Status Register
    398     {EnumSpiOpcodeRead,           SF_INST_SFDP,           EnumSpiCycle50MHz, EnumSpiOperationDiscoveryParameters},    // Opcode 3: Serial Flash Discovery Parameters
    399     {EnumSpiOpcodeWrite,          SF_INST_SERASE,         EnumSpiCycle50MHz, EnumSpiOperationErase_4K_Byte  },      // Opcode 4: Sector Erase (4KB)
    400     {EnumSpiOpcodeWrite,          SF_INST_64KB_ERASE,     EnumSpiCycle50MHz, EnumSpiOperationErase_64K_Byte  },      // Opcode 5: Block Erase (64KB
    401     {EnumSpiOpcodeWrite,          SF_INST_PROG,           EnumSpiCycle50MHz, EnumSpiOperationProgramData_1_Byte},     // Opcode 6: Byte Program
    402     {EnumSpiOpcodeWriteNoAddr,    SF_INST_WRSR,           EnumSpiCycle50MHz, EnumSpiOperationWriteStatus    },      // Opcode 7: Write Status Register
    403   },
    404 
    405   //
    406   // The offset of the start of the BIOS image in flash. This value is platform specific
    407   // and depends on the system flash map. If BIOS size is bigger than flash return -1.
    408   //
    409   ((MACRONIX_MX25L128_SIZE >= FLASH_SIZE) ? MACRONIX_MX25L128_SIZE - FLASH_SIZE : (UINTN) (-1)),
    410 
    411   //
    412   // The size of the BIOS image in flash. This value is platform specific and depends on the system flash map.
    413   //
    414   FLASH_SIZE
    415   },
    416   {
    417   SF_VENDOR_ID_MACRONIX,	  // VendorId
    418   SF_DEVICE_ID0_MX25UXX,	  // DeviceId 0
    419   SF_DEVICE_ID1_MX25U6435F,   // DeviceId 1
    420   {
    421     SF_INST_WREN, 		      // Prefix Opcode 0: Write Enable
    422     SF_INST_EWSR			  // Prefix Opcode 1:  Write Enable (this part doesn't support EWSR)
    423   },
    424   {
    425     {EnumSpiOpcodeReadNoAddr, 	SF_INST_JEDEC_READ_ID,	EnumSpiCycle50MHz, EnumSpiOperationJedecId		},		// Opcode 0: Read ID
    426     {EnumSpiOpcodeRead,			SF_INST_READ,			EnumSpiCycle33MHz, EnumSpiOperationReadData 	 }, 	 // Opcode 1: Read
    427     {EnumSpiOpcodeReadNoAddr, 	SF_INST_RDSR,			EnumSpiCycle50MHz, EnumSpiOperationReadStatus	 }, 	 // Opcode 2: Read Status Register
    428     {EnumSpiOpcodeRead,			SF_INST_SFDP,			EnumSpiCycle50MHz, EnumSpiOperationDiscoveryParameters},	// Opcode 3: Serial Flash Discovery Parameters
    429     {EnumSpiOpcodeWrite,		SF_INST_SERASE, 		EnumSpiCycle50MHz, EnumSpiOperationErase_4K_Byte  },	  // Opcode 4: Sector Erase (4KB)
    430     {EnumSpiOpcodeWrite,		SF_INST_64KB_ERASE, 	EnumSpiCycle50MHz, EnumSpiOperationErase_64K_Byte  },	   // Opcode 5: Block Erase (64KB
    431     {EnumSpiOpcodeWrite,		SF_INST_PROG,			EnumSpiCycle50MHz, EnumSpiOperationProgramData_1_Byte}, 	// Opcode 6: Byte Program
    432     {EnumSpiOpcodeWriteNoAddr,	SF_INST_WRSR,			EnumSpiCycle50MHz, EnumSpiOperationWriteStatus	  },	  // Opcode 7: Write Status Register
    433   },
    434 
    435   //
    436   // The offset of the start of the BIOS image in flash. This value is platform specific
    437   // and depends on the system flash map. If BIOS size is bigger than flash return -1.
    438   //
    439   ((MACRONIX_MX25U64_SIZE >= FLASH_SIZE) ? MACRONIX_MX25U64_SIZE - FLASH_SIZE : (UINTN) (-1)),
    440 
    441   //
    442   // The size of the BIOS image in flash. This value is platform specific and depends on the system flash map.
    443   //
    444   FLASH_SIZE
    445   },
    446   {
    447   SF_VENDOR_ID_SST,         // VendorId
    448   SF_DEVICE_ID0_SST25VF0XXX,// DeviceId 0
    449   SF_DEVICE_ID1_SST25VF016B,// DeviceId 1
    450   {
    451     SF_INST_WREN,           // Prefix Opcode 0: Write Enable
    452     SF_INST_EWSR            // Prefix Opcode 1: Enable Write Status Register
    453   },
    454   {
    455     {EnumSpiOpcodeReadNoAddr,     SF_INST_JEDEC_READ_ID,  EnumSpiCycle50MHz, EnumSpiOperationJedecId           },     // Opcode 0: Read ID
    456     {EnumSpiOpcodeRead,           SF_INST_READ,           EnumSpiCycle20MHz, EnumSpiOperationReadData          },     // Opcode 1: Read
    457     {EnumSpiOpcodeReadNoAddr,     SF_INST_RDSR,           EnumSpiCycle50MHz, EnumSpiOperationReadStatus        },     // Opcode 2: Read Status Register
    458     {EnumSpiOpcodeWriteNoAddr,    SF_INST_WRDI,           EnumSpiCycle50MHz, EnumSpiOperationWriteDisable      },     // Opcode 3: Write Disable
    459     {EnumSpiOpcodeWrite,          SF_INST_SERASE,         EnumSpiCycle50MHz, EnumSpiOperationErase_4K_Byte     },     // Opcode 4: Sector Erase (4KB)
    460     {EnumSpiOpcodeWrite,          SF_INST_64KB_ERASE,     EnumSpiCycle50MHz, EnumSpiOperationErase_64K_Byte    },     // Opcode 5: Block Erase (32KB)
    461     {EnumSpiOpcodeWrite,          SF_INST_PROG,           EnumSpiCycle50MHz, EnumSpiOperationProgramData_1_Byte},     // Opcode 6: Byte Program
    462     {EnumSpiOpcodeWriteNoAddr,    SF_INST_WRSR,           EnumSpiCycle50MHz, EnumSpiOperationWriteStatus       },     // Opcode 7: Write Status Register
    463   },
    464 
    465   //
    466   // The offset of the start of the BIOS image in flash. This value is platform specific
    467   // and depends on the system flash map. If BIOS size is bigger than flash return -1.
    468   //
    469   ((SST_SST25VF016B_SIZE >= FLASH_SIZE) ? SST_SST25VF016B_SIZE - FLASH_SIZE : (UINTN) (-1)),
    470 
    471   //
    472   // The size of the BIOS image in flash. This value is platform specific and depends on the system flash map.
    473   //
    474   FLASH_SIZE
    475   },
    476   {
    477   SF_VENDOR_ID_SST,         // VendorId
    478   SF_DEVICE_ID0_SST25VF0XXX,// DeviceId 0
    479   SF_DEVICE_ID1_SST25VF064C,// DeviceId 1
    480   {
    481     SF_INST_WREN,           // Prefix Opcode 0: Write Enable
    482     SF_INST_EWSR            // Prefix Opcode 1: Enable Write Status Register
    483   },
    484   {
    485     {EnumSpiOpcodeReadNoAddr,     SF_INST_JEDEC_READ_ID,  EnumSpiCycle50MHz, EnumSpiOperationJedecId           },     // Opcode 0: Read ID
    486     {EnumSpiOpcodeRead,           SF_INST_READ,           EnumSpiCycle20MHz, EnumSpiOperationReadData          },     // Opcode 1: Read
    487     {EnumSpiOpcodeReadNoAddr,     SF_INST_RDSR,           EnumSpiCycle50MHz, EnumSpiOperationReadStatus        },     // Opcode 2: Read Status Register
    488     {EnumSpiOpcodeWriteNoAddr,    SF_INST_WRDI,           EnumSpiCycle50MHz, EnumSpiOperationWriteDisable      },     // Opcode 3: Write Disable
    489     {EnumSpiOpcodeWrite,          SF_INST_SERASE,         EnumSpiCycle50MHz, EnumSpiOperationErase_4K_Byte     },     // Opcode 4: Sector Erase (4KB)
    490     {EnumSpiOpcodeWrite,          SF_INST_64KB_ERASE,     EnumSpiCycle50MHz, EnumSpiOperationErase_64K_Byte    },     // Opcode 5: Block Erase (32KB)
    491     {EnumSpiOpcodeWrite,          SF_INST_PROG,           EnumSpiCycle50MHz, EnumSpiOperationProgramData_1_Byte},     // Opcode 6: Byte Program
    492     {EnumSpiOpcodeWriteNoAddr,    SF_INST_WRSR,           EnumSpiCycle50MHz, EnumSpiOperationWriteStatus       },     // Opcode 7: Write Status Register
    493   },
    494 
    495   //
    496   // The offset of the start of the BIOS image in flash. This value is platform specific
    497   // and depends on the system flash map. If BIOS size is bigger than flash return -1.
    498   //
    499   ((SST_SST25VF064C_SIZE >= FLASH_SIZE) ? SST_SST25VF064C_SIZE - FLASH_SIZE : (UINTN) (-1)),
    500 
    501   //
    502   // The size of the BIOS image in flash. This value is platform specific and depends on the system flash map.
    503   //
    504   FLASH_SIZE
    505   },
    506   {
    507   	//
    508   	// Minnow2 SPI type
    509   	//
    510   SF_VENDOR_ID_NUMONYX,     // VendorId
    511   SF_DEVICE_ID0_N25Q064,    // DeviceId 0
    512   SF_DEVICE_ID1_N25Q064,    // DeviceId 1
    513   {
    514     SF_INST_WREN,           // Prefix Opcode 0: Write Enable
    515     SF_INST_WREN            // Prefix Opcode 1: Write Enable (this part doesn't support EWSR)
    516   },
    517   {
    518     {EnumSpiOpcodeReadNoAddr,     SF_INST_JEDEC_READ_ID,  EnumSpiCycle20MHz, EnumSpiOperationJedecId      },      // Opcode 0: Read ID
    519     {EnumSpiOpcodeRead,           SF_INST_READ,           EnumSpiCycle20MHz, EnumSpiOperationReadData      },      // Opcode 1: Read
    520     {EnumSpiOpcodeReadNoAddr,     SF_INST_RDSR,           EnumSpiCycle20MHz, EnumSpiOperationReadStatus    },      // Opcode 2: Read Status Register
    521     {EnumSpiOpcodeWriteNoAddr,    SF_INST_WRDI,           EnumSpiCycle20MHz, EnumSpiOperationWriteDisable    },      // Opcode 3: Write Disable
    522     {EnumSpiOpcodeWrite,          SF_INST_SERASE,         EnumSpiCycle20MHz, EnumSpiOperationErase_4K_Byte  },      // Opcode 4: Sector Erase (4KB)
    523     {EnumSpiOpcodeWrite,          SF_INST_64KB_ERASE,     EnumSpiCycle20MHz, EnumSpiOperationErase_64K_Byte  },      // Opcode 5: Block Erase (64KB
    524     {EnumSpiOpcodeWrite,          SF_INST_PROG,           EnumSpiCycle20MHz, EnumSpiOperationProgramData_1_Byte},     // Opcode 6: Byte Program
    525     {EnumSpiOpcodeWriteNoAddr,    SF_INST_WRSR,           EnumSpiCycle20MHz, EnumSpiOperationWriteStatus    },      // Opcode 7: Write Status Register
    526   },
    527 
    528   //
    529   // The offset of the start of the BIOS image in flash. This value is platform specific
    530   // and depends on the system flash map. If BIOS size is bigger than flash return -1.
    531   //
    532   ((NUMONYX_N25Q064_SIZE >= FLASH_SIZE) ? NUMONYX_N25Q064_SIZE - FLASH_SIZE : (UINTN) (-1)),
    533 
    534   //
    535   // The size of the BIOS image in flash. This value is platform specific and depends on the system flash map.
    536   //
    537   FLASH_SIZE
    538   },
    539   {
    540   SF_VENDOR_ID_NUMONYX,     // VendorId
    541   SF_DEVICE_ID0_M25PXXX,    // DeviceId 0
    542   SF_DEVICE_ID1_M25PX16,    // DeviceId 1
    543   {
    544     SF_INST_WREN,           // Prefix Opcode 0: Write Enable
    545     SF_INST_WREN            // Prefix Opcode 1: Write Enable (this part doesn't support EWSR).
    546   },
    547   {
    548     {EnumSpiOpcodeReadNoAddr,     SF_INST_JEDEC_READ_ID,  EnumSpiCycle50MHz, EnumSpiOperationJedecId      },      // Opcode 0: Read ID
    549     {EnumSpiOpcodeRead,           SF_INST_READ,           EnumSpiCycle33MHz, EnumSpiOperationReadData      },      // Opcode 1: Read
    550     {EnumSpiOpcodeReadNoAddr,     SF_INST_RDSR,           EnumSpiCycle50MHz, EnumSpiOperationReadStatus    },      // Opcode 2: Read Status Register
    551     {EnumSpiOpcodeWriteNoAddr,    SF_INST_WRDI,           EnumSpiCycle50MHz, EnumSpiOperationWriteDisable    },      // Opcode 3: Write Disable
    552     {EnumSpiOpcodeWrite,          SF_INST_SERASE,         EnumSpiCycle50MHz, EnumSpiOperationErase_4K_Byte  },      // Opcode 4: Sector Erase (4KB)
    553     {EnumSpiOpcodeWrite,          SF_INST_64KB_ERASE,     EnumSpiCycle50MHz, EnumSpiOperationErase_64K_Byte  },      // Opcode 5: Block Erase (64KB
    554     {EnumSpiOpcodeWrite,          SF_INST_PROG,           EnumSpiCycle50MHz, EnumSpiOperationProgramData_1_Byte},     // Opcode 6: Byte Program
    555     {EnumSpiOpcodeWriteNoAddr,    SF_INST_WRSR,           EnumSpiCycle50MHz, EnumSpiOperationWriteStatus    },      // Opcode 7: Write Status Register
    556   },
    557 
    558   //
    559   // The offset of the start of the BIOS image in flash. This value is platform specific
    560   // and depends on the system flash map. If BIOS size is bigger than flash return -1.
    561   //
    562   ((NUMONYX_M25PX16_SIZE >= FLASH_SIZE) ? NUMONYX_M25PX16_SIZE - FLASH_SIZE : (UINTN) (-1)),
    563 
    564   //
    565   // The size of the BIOS image in flash. This value is platform specific and depends on the system flash map.
    566   //
    567   FLASH_SIZE
    568   },
    569   {
    570   SF_VENDOR_ID_NUMONYX,     // VendorId
    571   SF_DEVICE_ID0_N25QXXX,    // DeviceId 0
    572   SF_DEVICE_ID1_N25Q032,    // DeviceId 1
    573   {
    574     SF_INST_WREN,           // Prefix Opcode 0: Write Enable
    575     SF_INST_WREN            // Prefix Opcode 1: Write Enable (this part doesn't support EWSR).
    576   },
    577   {
    578     {EnumSpiOpcodeReadNoAddr,     SF_INST_JEDEC_READ_ID,  EnumSpiCycle50MHz, EnumSpiOperationJedecId      },        // Opcode 0: Read ID
    579     {EnumSpiOpcodeRead,           SF_INST_READ,           EnumSpiCycle33MHz, EnumSpiOperationReadData      },        // Opcode 1: Read
    580     {EnumSpiOpcodeReadNoAddr,     SF_INST_RDSR,           EnumSpiCycle50MHz, EnumSpiOperationReadStatus    },        // Opcode 2: Read Status Register
    581     {EnumSpiOpcodeWriteNoAddr,    SF_INST_WRDI,           EnumSpiCycle50MHz, EnumSpiOperationWriteDisable    },      // Opcode 3: Write Disable
    582     {EnumSpiOpcodeWrite,          SF_INST_SERASE,         EnumSpiCycle50MHz, EnumSpiOperationErase_4K_Byte  },      // Opcode 4: Sector Erase (4KB)
    583     {EnumSpiOpcodeWrite,          SF_INST_64KB_ERASE,     EnumSpiCycle50MHz, EnumSpiOperationErase_64K_Byte  },      // Opcode 5: Block Erase (64KB
    584     {EnumSpiOpcodeWrite,          SF_INST_PROG,           EnumSpiCycle50MHz, EnumSpiOperationProgramData_1_Byte},   // Opcode 6: Byte Program
    585     {EnumSpiOpcodeWriteNoAddr,    SF_INST_WRSR,           EnumSpiCycle50MHz, EnumSpiOperationWriteStatus    },      // Opcode 7: Write Status Register
    586   },
    587 
    588   //
    589   // The offset of the start of the BIOS image in flash. This value is platform specific
    590   // and depends on the system flash map. If BIOS size is bigger than flash return -1.
    591   //
    592   ((NUMONYX_N25Q032_SIZE >= FLASH_SIZE) ? NUMONYX_N25Q032_SIZE - FLASH_SIZE : (UINTN) (-1)),
    593 
    594   //
    595   // The size of the BIOS image in flash. This value is platform specific and depends on the system flash map.
    596   //
    597   FLASH_SIZE
    598   },
    599   {
    600   SF_VENDOR_ID_NUMONYX,     // VendorId
    601   SF_DEVICE_ID0_M25PXXX,    // DeviceId 0
    602   SF_DEVICE_ID1_M25PX32,    // DeviceId 1
    603   {
    604     SF_INST_WREN,           // Prefix Opcode 0: Write Enable
    605     SF_INST_WREN            // Prefix Opcode 1: Write Enable (this part doesn't support EWSR).
    606   },
    607   {
    608     {EnumSpiOpcodeReadNoAddr,     SF_INST_JEDEC_READ_ID,  EnumSpiCycle50MHz, EnumSpiOperationJedecId      },      // Opcode 0: Read ID
    609     {EnumSpiOpcodeRead,           SF_INST_READ,           EnumSpiCycle33MHz, EnumSpiOperationReadData      },      // Opcode 1: Read
    610     {EnumSpiOpcodeReadNoAddr,     SF_INST_RDSR,           EnumSpiCycle50MHz, EnumSpiOperationReadStatus    },      // Opcode 2: Read Status Register
    611     {EnumSpiOpcodeWriteNoAddr,    SF_INST_WRDI,           EnumSpiCycle50MHz, EnumSpiOperationWriteDisable    },      // Opcode 3: Write Disable
    612     {EnumSpiOpcodeWrite,          SF_INST_SERASE,         EnumSpiCycle50MHz, EnumSpiOperationErase_4K_Byte  },      // Opcode 4: Sector Erase (4KB)
    613     {EnumSpiOpcodeWrite,          SF_INST_64KB_ERASE,     EnumSpiCycle50MHz, EnumSpiOperationErase_64K_Byte  },      // Opcode 5: Block Erase (64KB
    614     {EnumSpiOpcodeWrite,          SF_INST_PROG,           EnumSpiCycle50MHz, EnumSpiOperationProgramData_1_Byte},     // Opcode 6: Byte Program
    615     {EnumSpiOpcodeWriteNoAddr,    SF_INST_WRSR,           EnumSpiCycle50MHz, EnumSpiOperationWriteStatus    },      // Opcode 7: Write Status Register
    616   },
    617 
    618   //
    619   // The offset of the start of the BIOS image in flash. This value is platform specific
    620   // and depends on the system flash map. If BIOS size is bigger than flash return -1.
    621   //
    622   ((NUMONYX_M25PX32_SIZE >= FLASH_SIZE) ? NUMONYX_M25PX32_SIZE - FLASH_SIZE : (UINTN) (-1)),
    623 
    624   //
    625   // The size of the BIOS image in flash. This value is platform specific and depends on the system flash map.
    626   //
    627   FLASH_SIZE
    628   },
    629   {
    630   SF_VENDOR_ID_NUMONYX,     // VendorId
    631   SF_DEVICE_ID0_M25PXXX,    // DeviceId 0
    632   SF_DEVICE_ID1_M25PX64,    // DeviceId 1
    633   {
    634     SF_INST_WREN,           // Prefix Opcode 0: Write Enable
    635     SF_INST_WREN            // Prefix Opcode 1: Write Enable (this part doesn't support EWSR)
    636   },
    637   {
    638     {EnumSpiOpcodeReadNoAddr,     SF_INST_JEDEC_READ_ID,  EnumSpiCycle50MHz, EnumSpiOperationJedecId      },      // Opcode 0: Read ID
    639     {EnumSpiOpcodeRead,           SF_INST_READ,           EnumSpiCycle33MHz, EnumSpiOperationReadData      },      // Opcode 1: Read
    640     {EnumSpiOpcodeReadNoAddr,     SF_INST_RDSR,           EnumSpiCycle50MHz, EnumSpiOperationReadStatus    },      // Opcode 2: Read Status Register
    641     {EnumSpiOpcodeWriteNoAddr,    SF_INST_WRDI,           EnumSpiCycle50MHz, EnumSpiOperationWriteDisable    },      // Opcode 3: Write Disable
    642     {EnumSpiOpcodeWrite,          SF_INST_SERASE,         EnumSpiCycle50MHz, EnumSpiOperationErase_4K_Byte  },      // Opcode 4: Sector Erase (4KB)
    643     {EnumSpiOpcodeWrite,          SF_INST_64KB_ERASE,     EnumSpiCycle50MHz, EnumSpiOperationErase_64K_Byte  },      // Opcode 5: Block Erase (64KB
    644     {EnumSpiOpcodeWrite,          SF_INST_PROG,           EnumSpiCycle50MHz, EnumSpiOperationProgramData_1_Byte},     // Opcode 6: Byte Program
    645     {EnumSpiOpcodeWriteNoAddr,    SF_INST_WRSR,           EnumSpiCycle50MHz, EnumSpiOperationWriteStatus    },      // Opcode 7: Write Status Register
    646   },
    647 
    648   //
    649   // The offset of the start of the BIOS image in flash. This value is platform specific
    650   // and depends on the system flash map. If BIOS size is bigger than flash return -1.
    651   //
    652   ((NUMONYX_M25PX64_SIZE >= FLASH_SIZE) ? NUMONYX_M25PX64_SIZE - FLASH_SIZE : (UINTN) (-1)),
    653 
    654   //
    655   // The size of the BIOS image in flash. This value is platform specific and depends on the system flash map.
    656   //
    657   FLASH_SIZE
    658   },
    659   {
    660   SF_VENDOR_ID_NUMONYX,     // VendorId
    661   SF_DEVICE_ID0_N25QXXX,    // DeviceId 0
    662   SF_DEVICE_ID1_N25Q128,    // DeviceId 1
    663   {
    664     SF_INST_WREN,           // Prefix Opcode 0: Write Enable
    665     SF_INST_WREN            // Prefix Opcode 1: Write Enable (this part doesn't support EWSR)
    666   },
    667   {
    668     {EnumSpiOpcodeReadNoAddr,     SF_INST_JEDEC_READ_ID,  EnumSpiCycle50MHz, EnumSpiOperationJedecId      },      // Opcode 0: Read ID
    669     {EnumSpiOpcodeRead,           SF_INST_READ,           EnumSpiCycle33MHz, EnumSpiOperationReadData      },      // Opcode 1: Read
    670     {EnumSpiOpcodeReadNoAddr,     SF_INST_RDSR,           EnumSpiCycle50MHz, EnumSpiOperationReadStatus    },      // Opcode 2: Read Status Register
    671     {EnumSpiOpcodeWriteNoAddr,    SF_INST_WRDI,           EnumSpiCycle50MHz, EnumSpiOperationWriteDisable    },      // Opcode 3: Write Disable
    672     {EnumSpiOpcodeWrite,          SF_INST_SERASE,         EnumSpiCycle50MHz, EnumSpiOperationErase_4K_Byte  },      // Opcode 4: Sector Erase (4KB)
    673     {EnumSpiOpcodeWrite,          SF_INST_64KB_ERASE,     EnumSpiCycle50MHz, EnumSpiOperationErase_64K_Byte  },      // Opcode 5: Block Erase (64KB
    674     {EnumSpiOpcodeWrite,          SF_INST_PROG,           EnumSpiCycle50MHz, EnumSpiOperationProgramData_1_Byte},     // Opcode 6: Byte Program
    675     {EnumSpiOpcodeWriteNoAddr,    SF_INST_WRSR,           EnumSpiCycle50MHz, EnumSpiOperationWriteStatus    },      // Opcode 7: Write Status Register
    676   },
    677 
    678   //
    679   // The offset of the start of the BIOS image in flash. This value is platform specific
    680   // and depends on the system flash map. If BIOS size is bigger than flash return -1.
    681   //
    682   ((NUMONYX_N25Q128_SIZE >= FLASH_SIZE) ? NUMONYX_N25Q128_SIZE - FLASH_SIZE : (UINTN) (-1)),
    683 
    684   //
    685   // The size of the BIOS image in flash. This value is platform specific and depends on the system flash map.
    686   //
    687   FLASH_SIZE
    688   },
    689   {
    690   SF_VENDOR_ID_EON,         // VendorId
    691   SF_DEVICE_ID0_EN25QXX,    // DeviceId 0
    692   SF_DEVICE_ID1_EN25Q16,    // DeviceId 1
    693   {
    694     SF_INST_WREN,           // Prefix Opcode 0: Write Enable
    695     SF_INST_WREN            // Prefix Opcode 1: Write Enable (this part doesn't support EWSR)
    696   },
    697   {
    698     {EnumSpiOpcodeReadNoAddr,     SF_INST_JEDEC_READ_ID,  EnumSpiCycle50MHz, EnumSpiOperationJedecId      },      // Opcode 0: Read ID
    699     {EnumSpiOpcodeRead,           SF_INST_READ,           EnumSpiCycle50MHz, EnumSpiOperationReadData      },      // Opcode 1: Read
    700     {EnumSpiOpcodeReadNoAddr,     SF_INST_RDSR,           EnumSpiCycle50MHz, EnumSpiOperationReadStatus    },      // Opcode 2: Read Status Register
    701     {EnumSpiOpcodeWriteNoAddr,    SF_INST_WRDI,           EnumSpiCycle50MHz, EnumSpiOperationWriteDisable    },      // Opcode 3: Write Disable
    702     {EnumSpiOpcodeWrite,          SF_INST_SERASE,         EnumSpiCycle50MHz, EnumSpiOperationErase_4K_Byte  },      // Opcode 4: Sector Erase (4KB)
    703     {EnumSpiOpcodeWrite,          SF_INST_64KB_ERASE,     EnumSpiCycle50MHz, EnumSpiOperationErase_64K_Byte  },      // Opcode 5: Block Erase (64KB
    704     {EnumSpiOpcodeWrite,          SF_INST_PROG,           EnumSpiCycle50MHz, EnumSpiOperationProgramData_1_Byte},     // Opcode 6: Byte Program
    705     {EnumSpiOpcodeWriteNoAddr,    SF_INST_WRSR,           EnumSpiCycle50MHz, EnumSpiOperationWriteStatus    },      // Opcode 7: Write Status Register
    706   },
    707 
    708   //
    709   // The offset of the start of the BIOS image in flash. This value is platform specific
    710   // and depends on the system flash map. If BIOS size is bigger than flash return -1.
    711   //
    712   ((EON_EN25Q16_SIZE >= FLASH_SIZE) ? EON_EN25Q16_SIZE - FLASH_SIZE : (UINTN) (-1)),
    713 
    714   //
    715   // The size of the BIOS image in flash. This value is platform specific and depends on the system flash map.
    716   //
    717   FLASH_SIZE
    718   },
    719   {
    720   SF_VENDOR_ID_EON,         // VendorId
    721   SF_DEVICE_ID0_EN25QXX,    // DeviceId 0
    722   SF_DEVICE_ID1_EN25Q32,    // DeviceId 1
    723   {
    724     SF_INST_WREN,           // Prefix Opcode 0: Write Enable
    725     SF_INST_WREN            // Prefix Opcode 1: Write Enable (this part doesn't support EWSR)
    726   },
    727   {
    728     {EnumSpiOpcodeReadNoAddr,     SF_INST_JEDEC_READ_ID,  EnumSpiCycle50MHz, EnumSpiOperationJedecId      },      // Opcode 0: Read ID
    729     {EnumSpiOpcodeRead,           SF_INST_READ,           EnumSpiCycle33MHz, EnumSpiOperationReadData      },      // Opcode 1: Read
    730     {EnumSpiOpcodeReadNoAddr,     SF_INST_RDSR,           EnumSpiCycle50MHz, EnumSpiOperationReadStatus    },      // Opcode 2: Read Status Register
    731     {EnumSpiOpcodeWriteNoAddr,    SF_INST_WRDI,           EnumSpiCycle50MHz, EnumSpiOperationWriteDisable    },      // Opcode 3: Write Disable
    732     {EnumSpiOpcodeWrite,          SF_INST_SERASE,         EnumSpiCycle50MHz, EnumSpiOperationErase_4K_Byte  },      // Opcode 4: Sector Erase (4KB)
    733     {EnumSpiOpcodeWrite,          SF_INST_64KB_ERASE,     EnumSpiCycle50MHz, EnumSpiOperationErase_64K_Byte  },      // Opcode 5: Block Erase (64KB
    734     {EnumSpiOpcodeWrite,          SF_INST_PROG,           EnumSpiCycle50MHz, EnumSpiOperationProgramData_1_Byte},     // Opcode 6: Byte Program
    735     {EnumSpiOpcodeWriteNoAddr,    SF_INST_WRSR,           EnumSpiCycle50MHz, EnumSpiOperationWriteStatus    },      // Opcode 7: Write Status Register
    736   },
    737 
    738   //
    739   // The offset of the start of the BIOS image in flash. This value is platform specific
    740   // and depends on the system flash map. If BIOS size is bigger than flash return -1.
    741   //
    742   ((EON_EN25Q32_SIZE >= FLASH_SIZE) ? EON_EN25Q32_SIZE - FLASH_SIZE : (UINTN) (-1)),
    743 
    744   //
    745   // The size of the BIOS image in flash. This value is platform specific and depends on the system flash map.
    746   //
    747   FLASH_SIZE
    748   },
    749   {
    750   SF_VENDOR_ID_EON,         // VendorId
    751   SF_DEVICE_ID0_EN25QXX,    // DeviceId 0
    752   SF_DEVICE_ID1_EN25Q64,    // DeviceId 1
    753   {
    754     SF_INST_WREN,           // Prefix Opcode 0: Write Enable
    755     SF_INST_WREN            // Prefix Opcode 1: Write Enable (this part doesn't support EWSR).
    756   },
    757   {
    758     {EnumSpiOpcodeReadNoAddr,     SF_INST_JEDEC_READ_ID,  EnumSpiCycle50MHz, EnumSpiOperationJedecId      },      // Opcode 0: Read ID
    759     {EnumSpiOpcodeRead,           SF_INST_READ,           EnumSpiCycle50MHz, EnumSpiOperationReadData      },      // Opcode 1: Read
    760     {EnumSpiOpcodeReadNoAddr,     SF_INST_RDSR,           EnumSpiCycle50MHz, EnumSpiOperationReadStatus    },      // Opcode 2: Read Status Register
    761     {EnumSpiOpcodeWriteNoAddr,    SF_INST_WRDI,           EnumSpiCycle50MHz, EnumSpiOperationWriteDisable    },      // Opcode 3: Write Disable
    762     {EnumSpiOpcodeWrite,          SF_INST_SERASE,         EnumSpiCycle50MHz, EnumSpiOperationErase_4K_Byte  },      // Opcode 4: Sector Erase (4KB)
    763     {EnumSpiOpcodeWrite,          SF_INST_64KB_ERASE,     EnumSpiCycle50MHz, EnumSpiOperationErase_64K_Byte  },      // Opcode 5: Block Erase (64KB
    764     {EnumSpiOpcodeWrite,          SF_INST_PROG,           EnumSpiCycle50MHz, EnumSpiOperationProgramData_1_Byte},     // Opcode 6: Byte Program
    765     {EnumSpiOpcodeWriteNoAddr,    SF_INST_WRSR,           EnumSpiCycle50MHz, EnumSpiOperationWriteStatus    },      // Opcode 7: Write Status Register
    766   },
    767 
    768   //
    769   // The offset of the start of the BIOS image in flash. This value is platform specific
    770   // and depends on the system flash map. If BIOS size is bigger than flash return -1.
    771   //
    772   ((EON_EN25Q64_SIZE >= FLASH_SIZE) ? EON_EN25Q64_SIZE - FLASH_SIZE : (UINTN) (-1)),
    773 
    774   //
    775   // The size of the BIOS image in flash. This value is platform specific and depends on the system flash map.
    776   //
    777   FLASH_SIZE
    778   },
    779   {
    780   SF_VENDOR_ID_EON,         // VendorId
    781   SF_DEVICE_ID0_EN25QXX,    // DeviceId 0
    782   SF_DEVICE_ID1_EN25Q128,   // DeviceId 1
    783   {
    784     SF_INST_WREN,           // Prefix Opcode 0: Write Enable
    785     SF_INST_WREN            // Prefix Opcode 1: Write Enable (this part doesn't support EWSR)
    786   },
    787   {
    788     {EnumSpiOpcodeReadNoAddr,     SF_INST_JEDEC_READ_ID,  EnumSpiCycle50MHz, EnumSpiOperationJedecId      },      // Opcode 0: Read ID
    789     {EnumSpiOpcodeRead,           SF_INST_READ,           EnumSpiCycle50MHz, EnumSpiOperationReadData      },      // Opcode 1: Read
    790     {EnumSpiOpcodeReadNoAddr,     SF_INST_RDSR,           EnumSpiCycle50MHz, EnumSpiOperationReadStatus    },      // Opcode 2: Read Status Register
    791     {EnumSpiOpcodeWriteNoAddr,    SF_INST_WRDI,           EnumSpiCycle50MHz, EnumSpiOperationWriteDisable    },      // Opcode 3: Write Disable
    792     {EnumSpiOpcodeWrite,          SF_INST_SERASE,         EnumSpiCycle50MHz, EnumSpiOperationErase_4K_Byte  },      // Opcode 4: Sector Erase (4KB)
    793     {EnumSpiOpcodeWrite,          SF_INST_64KB_ERASE,     EnumSpiCycle50MHz, EnumSpiOperationErase_64K_Byte  },      // Opcode 5: Block Erase (64KB
    794     {EnumSpiOpcodeWrite,          SF_INST_PROG,           EnumSpiCycle50MHz, EnumSpiOperationProgramData_1_Byte},     // Opcode 6: Byte Program
    795     {EnumSpiOpcodeWriteNoAddr,    SF_INST_WRSR,           EnumSpiCycle50MHz, EnumSpiOperationWriteStatus    },      // Opcode 7: Write Status Register
    796   },
    797 
    798   //
    799   // The offset of the start of the BIOS image in flash. This value is platform specific
    800   // and depends on the system flash map. If BIOS size is bigger than flash return -1.
    801   //
    802   ((EON_EN25Q128_SIZE >= FLASH_SIZE) ? EON_EN25Q128_SIZE - FLASH_SIZE : (UINTN) (-1)),
    803 
    804   //
    805   // The size of the BIOS image in flash. This value is platform specific and depends on the system flash map.
    806   //
    807   FLASH_SIZE
    808   },
    809   {
    810   SF_VENDOR_ID_AMIC,        // VendorId
    811   SF_DEVICE_ID0_A25L016,    // DeviceId 0
    812   SF_DEVICE_ID1_A25L016,    // DeviceId 1
    813   {
    814     SF_INST_WREN,           // Prefix Opcode 0: Write Enable
    815     SF_INST_WREN            // Prefix Opcode 1: Write Enable (this part doesn't support EWSR)
    816   },
    817   {
    818     {EnumSpiOpcodeReadNoAddr,     SF_INST_JEDEC_READ_ID,  EnumSpiCycle50MHz, EnumSpiOperationJedecId      },      // Opcode 0: Read ID
    819     {EnumSpiOpcodeRead,           SF_INST_READ,           EnumSpiCycle50MHz, EnumSpiOperationReadData      },      // Opcode 1: Read
    820     {EnumSpiOpcodeReadNoAddr,     SF_INST_RDSR,           EnumSpiCycle50MHz, EnumSpiOperationReadStatus    },      // Opcode 2: Read Status Register
    821     {EnumSpiOpcodeWriteNoAddr,    SF_INST_WRDI,           EnumSpiCycle50MHz, EnumSpiOperationWriteDisable    },      // Opcode 3: Write Disable
    822     {EnumSpiOpcodeWrite,          SF_INST_SERASE,         EnumSpiCycle50MHz, EnumSpiOperationErase_4K_Byte  },      // Opcode 4: Sector Erase (4KB)
    823     {EnumSpiOpcodeWrite,          SF_INST_64KB_ERASE,     EnumSpiCycle50MHz, EnumSpiOperationErase_64K_Byte  },      // Opcode 5: Block Erase (64KB
    824     {EnumSpiOpcodeWrite,          SF_INST_PROG,           EnumSpiCycle50MHz, EnumSpiOperationProgramData_1_Byte},     // Opcode 6: Byte Program
    825     {EnumSpiOpcodeWriteNoAddr,    SF_INST_WRSR,           EnumSpiCycle50MHz, EnumSpiOperationWriteStatus    },      // Opcode 7: Write Status Register
    826   },
    827 
    828   //
    829   // The offset of the start of the BIOS image in flash. This value is platform specific
    830   // and depends on the system flash map. If BIOS size is bigger than flash return -1.
    831   //
    832   ((AMIC_A25L16_SIZE >= FLASH_SIZE) ? AMIC_A25L16_SIZE - FLASH_SIZE : (UINTN) (-1)),
    833 
    834   //
    835   // The size of the BIOS image in flash. This value is platform specific and depends on the system flash map.
    836   //
    837   FLASH_SIZE
    838   }
    839 };
    840 
    841