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