2 Initializes Platform Specific Drivers.
4 Copyright (c) 2013-2015 Intel Corporation.
6 SPDX-License-Identifier: BSD-2-Clause-Patent
11 #include "SpiFlashDevice.h"
13 #define FLASH_SIZE (FixedPcdGet32 (PcdFlashAreaSize))
15 SPI_INIT_TABLE mSpiInitTable
[] = {
17 // Macronix 32Mbit part
24 SPI_COMMAND_WRITE_ENABLE
,
25 SPI_COMMAND_WRITE_S_EN
28 {EnumSpiOpcodeReadNoAddr
, SPI_COMMAND_JEDEC_ID
, EnumSpiCycle33MHz
, EnumSpiOperationJedecId
},
29 {EnumSpiOpcodeRead
, SPI_COMMAND_READ_ID
, EnumSpiCycle33MHz
, EnumSpiOperationOther
},
30 {EnumSpiOpcodeWriteNoAddr
, SPI_COMMAND_WRITE_S
, EnumSpiCycle33MHz
, EnumSpiOperationWriteStatus
},
31 {EnumSpiOpcodeWrite
, SPI_COMMAND_WRITE
, EnumSpiCycle33MHz
, EnumSpiOperationProgramData_1_Byte
},
32 {EnumSpiOpcodeRead
, SPI_COMMAND_READ
, EnumSpiCycle20MHz
, EnumSpiOperationReadData
},
33 {EnumSpiOpcodeWrite
, SPI_COMMAND_BLOCK_ERASE
, EnumSpiCycle33MHz
, EnumSpiOperationErase_64K_Byte
},
34 {EnumSpiOpcodeReadNoAddr
, SPI_COMMAND_READ_S
, EnumSpiCycle33MHz
, EnumSpiOperationReadStatus
},
35 {EnumSpiOpcodeWriteNoAddr
, SPI_COMMAND_CHIP_ERASE
, EnumSpiCycle33MHz
, EnumSpiOperationFullChipErase
}
37 0x400000 - FLASH_SIZE
, // BIOS Start Offset
38 FLASH_SIZE
// BIOS image size in flash
41 // Winbond 32Mbit part
48 SPI_COMMAND_WRITE_ENABLE
,
49 SPI_COMMAND_WRITE_S_EN
52 {EnumSpiOpcodeReadNoAddr
, SPI_COMMAND_JEDEC_ID
, EnumSpiCycle50MHz
, EnumSpiOperationJedecId
},
53 {EnumSpiOpcodeRead
, SPI_COMMAND_READ_ID
, EnumSpiCycle50MHz
, EnumSpiOperationOther
},
54 {EnumSpiOpcodeWriteNoAddr
, SPI_COMMAND_WRITE_S
, EnumSpiCycle50MHz
, EnumSpiOperationWriteStatus
},
55 {EnumSpiOpcodeWrite
, SPI_COMMAND_WRITE
, EnumSpiCycle50MHz
, EnumSpiOperationProgramData_1_Byte
},
56 {EnumSpiOpcodeRead
, SPI_COMMAND_READ
, EnumSpiCycle50MHz
, EnumSpiOperationReadData
},
57 {EnumSpiOpcodeWrite
, SPI_COMMAND_ERASE
, EnumSpiCycle50MHz
, EnumSpiOperationErase_4K_Byte
},
58 {EnumSpiOpcodeReadNoAddr
, SPI_COMMAND_READ_S
, EnumSpiCycle50MHz
, EnumSpiOperationReadStatus
},
59 {EnumSpiOpcodeWriteNoAddr
, SPI_COMMAND_CHIP_ERASE
, EnumSpiCycle50MHz
, EnumSpiOperationFullChipErase
}
61 0x400000 - FLASH_SIZE
, // BIOS Start Offset
62 FLASH_SIZE
// BIOS image size in flash
65 // Winbond 32Mbit part
72 SPI_COMMAND_WRITE_ENABLE
,
73 SPI_COMMAND_WRITE_S_EN
76 {EnumSpiOpcodeReadNoAddr
, SPI_COMMAND_JEDEC_ID
, EnumSpiCycle33MHz
, EnumSpiOperationJedecId
},
77 {EnumSpiOpcodeRead
, SPI_COMMAND_READ_ID
, EnumSpiCycle33MHz
, EnumSpiOperationOther
},
78 {EnumSpiOpcodeWriteNoAddr
, SPI_COMMAND_WRITE_S
, EnumSpiCycle33MHz
, EnumSpiOperationWriteStatus
},
79 {EnumSpiOpcodeWrite
, SPI_COMMAND_WRITE
, EnumSpiCycle33MHz
, EnumSpiOperationProgramData_1_Byte
},
80 {EnumSpiOpcodeRead
, SPI_COMMAND_READ
, EnumSpiCycle33MHz
, EnumSpiOperationReadData
},
81 {EnumSpiOpcodeWrite
, SPI_COMMAND_ERASE
, EnumSpiCycle33MHz
, EnumSpiOperationErase_4K_Byte
},
82 {EnumSpiOpcodeReadNoAddr
, SPI_COMMAND_READ_S
, EnumSpiCycle33MHz
, EnumSpiOperationReadStatus
},
83 {EnumSpiOpcodeWriteNoAddr
, SPI_COMMAND_CHIP_ERASE
, EnumSpiCycle33MHz
, EnumSpiOperationFullChipErase
}
85 0x400000 - FLASH_SIZE
, // BIOS Start Offset
86 FLASH_SIZE
// BIOS image size in flash
93 SPI_AT26DF321_ID2
, // issue: byte 2 identifies family/density for Atmel
96 SPI_COMMAND_WRITE_ENABLE
,
97 SPI_COMMAND_WRITE_S_EN
100 {EnumSpiOpcodeReadNoAddr
, SPI_COMMAND_JEDEC_ID
, EnumSpiCycle33MHz
, EnumSpiOperationJedecId
},
101 {EnumSpiOpcodeRead
, SPI_COMMAND_READ_ID
, EnumSpiCycle33MHz
, EnumSpiOperationOther
},
102 {EnumSpiOpcodeWriteNoAddr
, SPI_COMMAND_WRITE_S
, EnumSpiCycle33MHz
, EnumSpiOperationWriteStatus
},
103 {EnumSpiOpcodeWrite
, SPI_COMMAND_WRITE
, EnumSpiCycle33MHz
, EnumSpiOperationProgramData_1_Byte
},
104 {EnumSpiOpcodeRead
, SPI_COMMAND_READ
, EnumSpiCycle33MHz
, EnumSpiOperationReadData
},
105 {EnumSpiOpcodeWrite
, SPI_COMMAND_BLOCK_ERASE
, EnumSpiCycle33MHz
, EnumSpiOperationErase_64K_Byte
},
106 {EnumSpiOpcodeReadNoAddr
, SPI_COMMAND_READ_S
, EnumSpiCycle33MHz
, EnumSpiOperationReadStatus
},
107 {EnumSpiOpcodeWriteNoAddr
, SPI_COMMAND_CHIP_ERASE
, EnumSpiCycle33MHz
, EnumSpiOperationFullChipErase
}
109 0x400000 - FLASH_SIZE
, // BIOS Start Offset
110 FLASH_SIZE
// BIOS image size in flash
114 // Intel 32Mbit part bottom boot
121 SPI_COMMAND_WRITE_ENABLE
,
122 SPI_COMMAND_WRITE_ENABLE
125 {EnumSpiOpcodeReadNoAddr
, SPI_COMMAND_JEDEC_ID
, EnumSpiCycle33MHz
, EnumSpiOperationJedecId
},
126 {EnumSpiOpcodeRead
, SPI_COMMAND_READ_ID
, EnumSpiCycle33MHz
, EnumSpiOperationOther
},
127 {EnumSpiOpcodeWriteNoAddr
, SPI_COMMAND_WRITE_S
, EnumSpiCycle33MHz
, EnumSpiOperationWriteStatus
},
128 {EnumSpiOpcodeWrite
, SPI_COMMAND_WRITE
, EnumSpiCycle33MHz
, EnumSpiOperationProgramData_1_Byte
},
129 {EnumSpiOpcodeRead
, SPI_COMMAND_READ
, EnumSpiCycle33MHz
, EnumSpiOperationReadData
},
130 {EnumSpiOpcodeWrite
, SPI_COMMAND_BLOCK_ERASE
, EnumSpiCycle33MHz
, EnumSpiOperationErase_64K_Byte
},
131 {EnumSpiOpcodeReadNoAddr
, SPI_COMMAND_READ_S
, EnumSpiCycle33MHz
, EnumSpiOperationReadStatus
},
132 {EnumSpiOpcodeWriteNoAddr
, SPI_COMMAND_CHIP_ERASE
, EnumSpiCycle33MHz
, EnumSpiOperationFullChipErase
}
134 0, // BIOS Start Offset
135 FLASH_SIZE
// BIOS image size in flash
141 SPI_SST25VF080B_ID1
, // VendorId
142 SF_DEVICE_ID0_25VF064C
, // DeviceId 0
143 SF_DEVICE_ID1_25VF064C
, // DeviceId 1
145 SPI_COMMAND_WRITE_ENABLE
,
146 SPI_COMMAND_WRITE_S_EN
149 {EnumSpiOpcodeReadNoAddr
, SPI_COMMAND_JEDEC_ID
, EnumSpiCycle50MHz
, EnumSpiOperationJedecId
},
150 {EnumSpiOpcodeRead
, SPI_COMMAND_READ_ID
, EnumSpiCycle50MHz
, EnumSpiOperationOther
},
151 {EnumSpiOpcodeWriteNoAddr
, SPI_COMMAND_WRITE_S
, EnumSpiCycle50MHz
, EnumSpiOperationWriteStatus
},
152 {EnumSpiOpcodeWrite
, SPI_COMMAND_WRITE
, EnumSpiCycle50MHz
, EnumSpiOperationProgramData_1_Byte
},
153 {EnumSpiOpcodeRead
, SPI_COMMAND_READ
, EnumSpiCycle50MHz
, EnumSpiOperationReadData
},
154 {EnumSpiOpcodeWrite
, SPI_COMMAND_ERASE
, EnumSpiCycle50MHz
, EnumSpiOperationErase_4K_Byte
},
155 {EnumSpiOpcodeReadNoAddr
, SPI_COMMAND_READ_S
, EnumSpiCycle50MHz
, EnumSpiOperationReadStatus
},
156 {EnumSpiOpcodeWriteNoAddr
, SPI_COMMAND_CHIP_ERASE
, EnumSpiCycle50MHz
, EnumSpiOperationFullChipErase
}
158 0x800000 - FLASH_SIZE
, // BIOS Start Offset
159 FLASH_SIZE
// BIOS image size in flash
162 // NUMONYX 64Mbit part
165 SF_VENDOR_ID_NUMONYX
, // VendorId
166 SF_DEVICE_ID0_M25PX64
, // DeviceId 0
167 SF_DEVICE_ID1_M25PX64
, // DeviceId 1
169 SPI_COMMAND_WRITE_ENABLE
,
170 SPI_COMMAND_WRITE_S_EN
173 {EnumSpiOpcodeReadNoAddr
, SPI_COMMAND_JEDEC_ID
, EnumSpiCycle50MHz
, EnumSpiOperationJedecId
},
174 {EnumSpiOpcodeRead
, SPI_COMMAND_READ_ID
, EnumSpiCycle50MHz
, EnumSpiOperationOther
},
175 {EnumSpiOpcodeWriteNoAddr
, SPI_COMMAND_WRITE_S
, EnumSpiCycle50MHz
, EnumSpiOperationWriteStatus
},
176 {EnumSpiOpcodeWrite
, SPI_COMMAND_WRITE
, EnumSpiCycle50MHz
, EnumSpiOperationProgramData_1_Byte
},
177 {EnumSpiOpcodeRead
, SPI_COMMAND_READ
, EnumSpiCycle50MHz
, EnumSpiOperationReadData
},
178 {EnumSpiOpcodeWrite
, SPI_COMMAND_ERASE
, EnumSpiCycle50MHz
, EnumSpiOperationErase_4K_Byte
},
179 {EnumSpiOpcodeReadNoAddr
, SPI_COMMAND_READ_S
, EnumSpiCycle50MHz
, EnumSpiOperationReadStatus
},
180 {EnumSpiOpcodeWriteNoAddr
, SPI_COMMAND_CHIP_ERASE
, EnumSpiCycle50MHz
, EnumSpiOperationFullChipErase
}
182 0x800000 - FLASH_SIZE
, // BIOS Start Offset
183 FLASH_SIZE
// BIOS image size in flash
189 SF_VENDOR_ID_ATMEL
, // VendorId
190 SF_DEVICE_ID0_AT25DF641
, // DeviceId 0
191 SF_DEVICE_ID1_AT25DF641
, // DeviceId 1
193 SPI_COMMAND_WRITE_ENABLE
,
194 SPI_COMMAND_WRITE_S_EN
197 {EnumSpiOpcodeReadNoAddr
, SPI_COMMAND_JEDEC_ID
, EnumSpiCycle50MHz
, EnumSpiOperationJedecId
},
198 {EnumSpiOpcodeRead
, SPI_COMMAND_READ_ID
, EnumSpiCycle50MHz
, EnumSpiOperationOther
},
199 {EnumSpiOpcodeWriteNoAddr
, SPI_COMMAND_WRITE_S
, EnumSpiCycle50MHz
, EnumSpiOperationWriteStatus
},
200 {EnumSpiOpcodeWrite
, SPI_COMMAND_WRITE
, EnumSpiCycle50MHz
, EnumSpiOperationProgramData_1_Byte
},
201 {EnumSpiOpcodeRead
, SPI_COMMAND_READ
, EnumSpiCycle50MHz
, EnumSpiOperationReadData
},
202 {EnumSpiOpcodeWrite
, SPI_COMMAND_ERASE
, EnumSpiCycle50MHz
, EnumSpiOperationErase_4K_Byte
},
203 {EnumSpiOpcodeReadNoAddr
, SPI_COMMAND_READ_S
, EnumSpiCycle50MHz
, EnumSpiOperationReadStatus
},
204 {EnumSpiOpcodeWriteNoAddr
, SPI_COMMAND_CHIP_ERASE
, EnumSpiCycle50MHz
, EnumSpiOperationFullChipErase
}
206 0x800000 - FLASH_SIZE
, // BIOS Start Offset
207 FLASH_SIZE
// BIOS image size in flash
211 // Spansion 64Mbit part
214 SF_VENDOR_ID_SPANSION
, // VendorId
215 SF_DEVICE_ID0_S25FL064K
, // DeviceId 0
216 SF_DEVICE_ID1_S25FL064K
, // DeviceId 1
218 SPI_COMMAND_WRITE_ENABLE
,
219 SPI_COMMAND_WRITE_S_EN
222 {EnumSpiOpcodeReadNoAddr
, SPI_COMMAND_JEDEC_ID
, EnumSpiCycle50MHz
, EnumSpiOperationJedecId
},
223 {EnumSpiOpcodeRead
, SPI_COMMAND_READ_ID
, EnumSpiCycle50MHz
, EnumSpiOperationOther
},
224 {EnumSpiOpcodeWriteNoAddr
, SPI_COMMAND_WRITE_S
, EnumSpiCycle50MHz
, EnumSpiOperationWriteStatus
},
225 {EnumSpiOpcodeWrite
, SPI_COMMAND_WRITE
, EnumSpiCycle50MHz
, EnumSpiOperationProgramData_1_Byte
},
226 {EnumSpiOpcodeRead
, SPI_COMMAND_READ
, EnumSpiCycle50MHz
, EnumSpiOperationReadData
},
227 {EnumSpiOpcodeWrite
, SPI_COMMAND_ERASE
, EnumSpiCycle50MHz
, EnumSpiOperationErase_4K_Byte
},
228 {EnumSpiOpcodeReadNoAddr
, SPI_COMMAND_READ_S
, EnumSpiCycle50MHz
, EnumSpiOperationReadStatus
},
229 {EnumSpiOpcodeWriteNoAddr
, SPI_COMMAND_CHIP_ERASE
, EnumSpiCycle50MHz
, EnumSpiOperationFullChipErase
}
231 0x800000 - FLASH_SIZE
, // BIOS Start Offset
232 FLASH_SIZE
// BIOS image size in flash
236 // Macronix 64Mbit part bottom boot
239 SF_VENDOR_ID_MX
, // VendorId
240 SF_DEVICE_ID0_25L6405D
, // DeviceId 0
241 SF_DEVICE_ID1_25L6405D
, // DeviceId 1
243 SPI_COMMAND_WRITE_ENABLE
,
244 SPI_COMMAND_WRITE_S_EN
247 {EnumSpiOpcodeReadNoAddr
, SPI_COMMAND_JEDEC_ID
, EnumSpiCycle50MHz
, EnumSpiOperationJedecId
},
248 {EnumSpiOpcodeRead
, SPI_COMMAND_READ_ID
, EnumSpiCycle50MHz
, EnumSpiOperationOther
},
249 {EnumSpiOpcodeWriteNoAddr
, SPI_COMMAND_WRITE_S
, EnumSpiCycle50MHz
, EnumSpiOperationWriteStatus
},
250 {EnumSpiOpcodeWrite
, SPI_COMMAND_WRITE
, EnumSpiCycle50MHz
, EnumSpiOperationProgramData_1_Byte
},
251 {EnumSpiOpcodeRead
, SPI_COMMAND_READ
, EnumSpiCycle50MHz
, EnumSpiOperationReadData
},
252 {EnumSpiOpcodeWrite
, SPI_COMMAND_BLOCK_ERASE
, EnumSpiCycle50MHz
, EnumSpiOperationErase_64K_Byte
},
253 {EnumSpiOpcodeReadNoAddr
, SPI_COMMAND_READ_S
, EnumSpiCycle50MHz
, EnumSpiOperationReadStatus
},
254 {EnumSpiOpcodeWriteNoAddr
, SPI_COMMAND_CHIP_ERASE
, EnumSpiCycle50MHz
, EnumSpiOperationFullChipErase
}
256 0x800000 - FLASH_SIZE
, // BIOS Start Offset
257 FLASH_SIZE
// BIOS image size in flash
260 // Winbond 64Mbit part bottom boot
264 SF_DEVICE_ID0_W25QXX
,
265 SF_DEVICE_ID1_W25Q64
,
267 SPI_COMMAND_WRITE_ENABLE
,
268 SPI_COMMAND_WRITE_S_EN
271 {EnumSpiOpcodeReadNoAddr
, SPI_COMMAND_JEDEC_ID
, EnumSpiCycle50MHz
, EnumSpiOperationJedecId
},
272 {EnumSpiOpcodeRead
, SPI_COMMAND_READ_ID
, EnumSpiCycle50MHz
, EnumSpiOperationOther
},
273 {EnumSpiOpcodeWriteNoAddr
, SPI_COMMAND_WRITE_S
, EnumSpiCycle50MHz
, EnumSpiOperationWriteStatus
},
274 {EnumSpiOpcodeWrite
, SPI_COMMAND_WRITE
, EnumSpiCycle50MHz
, EnumSpiOperationProgramData_1_Byte
},
275 {EnumSpiOpcodeRead
, SPI_COMMAND_READ
, EnumSpiCycle50MHz
, EnumSpiOperationReadData
},
276 {EnumSpiOpcodeWrite
, SPI_COMMAND_ERASE
, EnumSpiCycle50MHz
, EnumSpiOperationErase_4K_Byte
},
277 {EnumSpiOpcodeReadNoAddr
, SPI_COMMAND_READ_S
, EnumSpiCycle50MHz
, EnumSpiOperationReadStatus
},
278 {EnumSpiOpcodeWriteNoAddr
, SPI_COMMAND_CHIP_ERASE
, EnumSpiCycle50MHz
, EnumSpiOperationFullChipErase
}
280 0x800000 - FLASH_SIZE
, // BIOS Start Offset
281 FLASH_SIZE
// BIOS image size in flash
284 // Winbond 64Mbit part bottom boot
291 SPI_COMMAND_WRITE_ENABLE
,
292 SPI_COMMAND_WRITE_S_EN
295 {EnumSpiOpcodeReadNoAddr
, SPI_COMMAND_JEDEC_ID
, EnumSpiCycle50MHz
, EnumSpiOperationJedecId
},
296 {EnumSpiOpcodeRead
, SPI_COMMAND_READ_ID
, EnumSpiCycle50MHz
, EnumSpiOperationOther
},
297 {EnumSpiOpcodeWriteNoAddr
, SPI_COMMAND_WRITE_S
, EnumSpiCycle50MHz
, EnumSpiOperationWriteStatus
},
298 {EnumSpiOpcodeWrite
, SPI_COMMAND_WRITE
, EnumSpiCycle50MHz
, EnumSpiOperationProgramData_1_Byte
},
299 {EnumSpiOpcodeRead
, SPI_COMMAND_READ
, EnumSpiCycle50MHz
, EnumSpiOperationReadData
},
300 {EnumSpiOpcodeWrite
, SPI_COMMAND_ERASE
, EnumSpiCycle50MHz
, EnumSpiOperationErase_4K_Byte
},
301 {EnumSpiOpcodeReadNoAddr
, SPI_COMMAND_READ_S
, EnumSpiCycle50MHz
, EnumSpiOperationReadStatus
},
302 {EnumSpiOpcodeWriteNoAddr
, SPI_COMMAND_CHIP_ERASE
, EnumSpiCycle50MHz
, EnumSpiOperationFullChipErase
}
304 0x800000 - FLASH_SIZE
, // BIOS Start Offset
305 FLASH_SIZE
// BIOS image size in flash
308 // Intel 64Mbit part bottom boot
315 SPI_COMMAND_WRITE_ENABLE
,
316 SPI_COMMAND_WRITE_S_EN
319 {EnumSpiOpcodeReadNoAddr
, SPI_COMMAND_JEDEC_ID
, EnumSpiCycle33MHz
, EnumSpiOperationJedecId
},
320 {EnumSpiOpcodeRead
, SPI_COMMAND_READ_ID
, EnumSpiCycle33MHz
, EnumSpiOperationOther
},
321 {EnumSpiOpcodeWriteNoAddr
, SPI_COMMAND_WRITE_S
, EnumSpiCycle33MHz
, EnumSpiOperationWriteStatus
},
322 {EnumSpiOpcodeWrite
, SPI_COMMAND_WRITE
, EnumSpiCycle33MHz
, EnumSpiOperationProgramData_1_Byte
},
323 {EnumSpiOpcodeRead
, SPI_COMMAND_READ
, EnumSpiCycle33MHz
, EnumSpiOperationReadData
},
324 {EnumSpiOpcodeWrite
, SPI_COMMAND_BLOCK_ERASE
, EnumSpiCycle33MHz
, EnumSpiOperationErase_64K_Byte
},
325 {EnumSpiOpcodeReadNoAddr
, SPI_COMMAND_READ_S
, EnumSpiCycle33MHz
, EnumSpiOperationReadStatus
},
326 {EnumSpiOpcodeWriteNoAddr
, SPI_COMMAND_CHIP_ERASE
, EnumSpiCycle33MHz
, EnumSpiOperationFullChipErase
}
328 0x800000 - FLASH_SIZE
, // BIOS Start Offset
329 FLASH_SIZE
// BIOS image size in flash