2 SPI flash device description.
4 Copyright (c) 2016, Intel Corporation. All rights reserved.<BR>
5 SPDX-License-Identifier: BSD-2-Clause-Patent
10 #include "SpiFlashDevice.h"
12 #define FLASH_SIZE (FixedPcdGet32 (PcdFlashAreaSize))
14 SPI_INIT_TABLE mSpiInitTable
[] = {
16 // Macronix 32Mbit part
23 SPI_COMMAND_WRITE_ENABLE
,
24 SPI_COMMAND_WRITE_S_EN
27 {EnumSpiOpcodeReadNoAddr
, SPI_COMMAND_JEDEC_ID
, EnumSpiCycle33MHz
, EnumSpiOperationJedecId
},
28 {EnumSpiOpcodeRead
, SPI_COMMAND_READ_ID
, EnumSpiCycle33MHz
, EnumSpiOperationOther
},
29 {EnumSpiOpcodeWriteNoAddr
, SPI_COMMAND_WRITE_S
, EnumSpiCycle33MHz
, EnumSpiOperationWriteStatus
},
30 {EnumSpiOpcodeWrite
, SPI_COMMAND_WRITE
, EnumSpiCycle33MHz
, EnumSpiOperationProgramData_1_Byte
},
31 {EnumSpiOpcodeRead
, SPI_COMMAND_READ
, EnumSpiCycle20MHz
, EnumSpiOperationReadData
},
32 {EnumSpiOpcodeWrite
, SPI_COMMAND_BLOCK_ERASE
, EnumSpiCycle33MHz
, EnumSpiOperationErase_64K_Byte
},
33 {EnumSpiOpcodeReadNoAddr
, SPI_COMMAND_READ_S
, EnumSpiCycle33MHz
, EnumSpiOperationReadStatus
},
34 {EnumSpiOpcodeWriteNoAddr
, SPI_COMMAND_CHIP_ERASE
, EnumSpiCycle33MHz
, EnumSpiOperationFullChipErase
}
36 (UINTN
)(0x400000 - FLASH_SIZE
), // BIOS Start Offset
37 FLASH_SIZE
// BIOS image size in flash
40 // Winbond 32Mbit part
47 SPI_COMMAND_WRITE_ENABLE
,
48 SPI_COMMAND_WRITE_S_EN
51 {EnumSpiOpcodeReadNoAddr
, SPI_COMMAND_JEDEC_ID
, EnumSpiCycle50MHz
, EnumSpiOperationJedecId
},
52 {EnumSpiOpcodeRead
, SPI_COMMAND_READ_ID
, EnumSpiCycle50MHz
, EnumSpiOperationOther
},
53 {EnumSpiOpcodeWriteNoAddr
, SPI_COMMAND_WRITE_S
, EnumSpiCycle50MHz
, EnumSpiOperationWriteStatus
},
54 {EnumSpiOpcodeWrite
, SPI_COMMAND_WRITE
, EnumSpiCycle50MHz
, EnumSpiOperationProgramData_1_Byte
},
55 {EnumSpiOpcodeRead
, SPI_COMMAND_READ
, EnumSpiCycle50MHz
, EnumSpiOperationReadData
},
56 {EnumSpiOpcodeWrite
, SPI_COMMAND_ERASE
, EnumSpiCycle50MHz
, EnumSpiOperationErase_4K_Byte
},
57 {EnumSpiOpcodeReadNoAddr
, SPI_COMMAND_READ_S
, EnumSpiCycle50MHz
, EnumSpiOperationReadStatus
},
58 {EnumSpiOpcodeWriteNoAddr
, SPI_COMMAND_CHIP_ERASE
, EnumSpiCycle50MHz
, EnumSpiOperationFullChipErase
}
60 (UINTN
)(0x400000 - FLASH_SIZE
), // BIOS Start Offset
61 FLASH_SIZE
// BIOS image size in flash
64 // Winbond 32Mbit part
71 SPI_COMMAND_WRITE_ENABLE
,
72 SPI_COMMAND_WRITE_S_EN
75 {EnumSpiOpcodeReadNoAddr
, SPI_COMMAND_JEDEC_ID
, EnumSpiCycle33MHz
, EnumSpiOperationJedecId
},
76 {EnumSpiOpcodeRead
, SPI_COMMAND_READ_ID
, EnumSpiCycle33MHz
, EnumSpiOperationOther
},
77 {EnumSpiOpcodeWriteNoAddr
, SPI_COMMAND_WRITE_S
, EnumSpiCycle33MHz
, EnumSpiOperationWriteStatus
},
78 {EnumSpiOpcodeWrite
, SPI_COMMAND_WRITE
, EnumSpiCycle33MHz
, EnumSpiOperationProgramData_1_Byte
},
79 {EnumSpiOpcodeRead
, SPI_COMMAND_READ
, EnumSpiCycle33MHz
, EnumSpiOperationReadData
},
80 {EnumSpiOpcodeWrite
, SPI_COMMAND_ERASE
, EnumSpiCycle33MHz
, EnumSpiOperationErase_4K_Byte
},
81 {EnumSpiOpcodeReadNoAddr
, SPI_COMMAND_READ_S
, EnumSpiCycle33MHz
, EnumSpiOperationReadStatus
},
82 {EnumSpiOpcodeWriteNoAddr
, SPI_COMMAND_CHIP_ERASE
, EnumSpiCycle33MHz
, EnumSpiOperationFullChipErase
}
84 (UINTN
)(0x400000 - FLASH_SIZE
), // BIOS Start Offset
85 FLASH_SIZE
// BIOS image size in flash
92 SPI_AT26DF321_ID2
, // issue: byte 2 identifies family/density for Atmel
95 SPI_COMMAND_WRITE_ENABLE
,
96 SPI_COMMAND_WRITE_S_EN
99 {EnumSpiOpcodeReadNoAddr
, SPI_COMMAND_JEDEC_ID
, EnumSpiCycle33MHz
, EnumSpiOperationJedecId
},
100 {EnumSpiOpcodeRead
, SPI_COMMAND_READ_ID
, EnumSpiCycle33MHz
, EnumSpiOperationOther
},
101 {EnumSpiOpcodeWriteNoAddr
, SPI_COMMAND_WRITE_S
, EnumSpiCycle33MHz
, EnumSpiOperationWriteStatus
},
102 {EnumSpiOpcodeWrite
, SPI_COMMAND_WRITE
, EnumSpiCycle33MHz
, EnumSpiOperationProgramData_1_Byte
},
103 {EnumSpiOpcodeRead
, SPI_COMMAND_READ
, EnumSpiCycle33MHz
, EnumSpiOperationReadData
},
104 {EnumSpiOpcodeWrite
, SPI_COMMAND_BLOCK_ERASE
, EnumSpiCycle33MHz
, EnumSpiOperationErase_64K_Byte
},
105 {EnumSpiOpcodeReadNoAddr
, SPI_COMMAND_READ_S
, EnumSpiCycle33MHz
, EnumSpiOperationReadStatus
},
106 {EnumSpiOpcodeWriteNoAddr
, SPI_COMMAND_CHIP_ERASE
, EnumSpiCycle33MHz
, EnumSpiOperationFullChipErase
}
108 (UINTN
)(0x400000 - FLASH_SIZE
), // BIOS Start Offset
109 FLASH_SIZE
// BIOS image size in flash
113 // Intel 32Mbit part bottom boot
120 SPI_COMMAND_WRITE_ENABLE
,
121 SPI_COMMAND_WRITE_ENABLE
124 {EnumSpiOpcodeReadNoAddr
, SPI_COMMAND_JEDEC_ID
, EnumSpiCycle33MHz
, EnumSpiOperationJedecId
},
125 {EnumSpiOpcodeRead
, SPI_COMMAND_READ_ID
, EnumSpiCycle33MHz
, EnumSpiOperationOther
},
126 {EnumSpiOpcodeWriteNoAddr
, SPI_COMMAND_WRITE_S
, EnumSpiCycle33MHz
, EnumSpiOperationWriteStatus
},
127 {EnumSpiOpcodeWrite
, SPI_COMMAND_WRITE
, EnumSpiCycle33MHz
, EnumSpiOperationProgramData_1_Byte
},
128 {EnumSpiOpcodeRead
, SPI_COMMAND_READ
, EnumSpiCycle33MHz
, EnumSpiOperationReadData
},
129 {EnumSpiOpcodeWrite
, SPI_COMMAND_BLOCK_ERASE
, EnumSpiCycle33MHz
, EnumSpiOperationErase_64K_Byte
},
130 {EnumSpiOpcodeReadNoAddr
, SPI_COMMAND_READ_S
, EnumSpiCycle33MHz
, EnumSpiOperationReadStatus
},
131 {EnumSpiOpcodeWriteNoAddr
, SPI_COMMAND_CHIP_ERASE
, EnumSpiCycle33MHz
, EnumSpiOperationFullChipErase
}
133 0, // BIOS Start Offset
134 FLASH_SIZE
// BIOS image size in flash
140 SPI_SST25VF080B_ID1
, // VendorId
141 SF_DEVICE_ID0_25VF064C
, // DeviceId 0
142 SF_DEVICE_ID1_25VF064C
, // DeviceId 1
144 SPI_COMMAND_WRITE_ENABLE
,
145 SPI_COMMAND_WRITE_S_EN
148 {EnumSpiOpcodeReadNoAddr
, SPI_COMMAND_JEDEC_ID
, EnumSpiCycle50MHz
, EnumSpiOperationJedecId
},
149 {EnumSpiOpcodeRead
, SPI_COMMAND_READ_ID
, EnumSpiCycle50MHz
, EnumSpiOperationOther
},
150 {EnumSpiOpcodeWriteNoAddr
, SPI_COMMAND_WRITE_S
, EnumSpiCycle50MHz
, EnumSpiOperationWriteStatus
},
151 {EnumSpiOpcodeWrite
, SPI_COMMAND_WRITE
, EnumSpiCycle50MHz
, EnumSpiOperationProgramData_1_Byte
},
152 {EnumSpiOpcodeRead
, SPI_COMMAND_READ
, EnumSpiCycle50MHz
, EnumSpiOperationReadData
},
153 {EnumSpiOpcodeWrite
, SPI_COMMAND_ERASE
, EnumSpiCycle50MHz
, EnumSpiOperationErase_4K_Byte
},
154 {EnumSpiOpcodeReadNoAddr
, SPI_COMMAND_READ_S
, EnumSpiCycle50MHz
, EnumSpiOperationReadStatus
},
155 {EnumSpiOpcodeWriteNoAddr
, SPI_COMMAND_CHIP_ERASE
, EnumSpiCycle50MHz
, EnumSpiOperationFullChipErase
}
157 0x800000 - FLASH_SIZE
, // BIOS Start Offset
158 FLASH_SIZE
// BIOS image size in flash
161 // NUMONYX 64Mbit part
164 SF_VENDOR_ID_NUMONYX
, // VendorId
165 SF_DEVICE_ID0_M25PX64
, // DeviceId 0
166 SF_DEVICE_ID1_M25PX64
, // DeviceId 1
168 SPI_COMMAND_WRITE_ENABLE
,
169 SPI_COMMAND_WRITE_S_EN
172 {EnumSpiOpcodeReadNoAddr
, SPI_COMMAND_JEDEC_ID
, EnumSpiCycle50MHz
, EnumSpiOperationJedecId
},
173 {EnumSpiOpcodeRead
, SPI_COMMAND_READ_ID
, EnumSpiCycle50MHz
, EnumSpiOperationOther
},
174 {EnumSpiOpcodeWriteNoAddr
, SPI_COMMAND_WRITE_S
, EnumSpiCycle50MHz
, EnumSpiOperationWriteStatus
},
175 {EnumSpiOpcodeWrite
, SPI_COMMAND_WRITE
, EnumSpiCycle50MHz
, EnumSpiOperationProgramData_1_Byte
},
176 {EnumSpiOpcodeRead
, SPI_COMMAND_READ
, EnumSpiCycle50MHz
, EnumSpiOperationReadData
},
177 {EnumSpiOpcodeWrite
, SPI_COMMAND_ERASE
, EnumSpiCycle50MHz
, EnumSpiOperationErase_4K_Byte
},
178 {EnumSpiOpcodeReadNoAddr
, SPI_COMMAND_READ_S
, EnumSpiCycle50MHz
, EnumSpiOperationReadStatus
},
179 {EnumSpiOpcodeWriteNoAddr
, SPI_COMMAND_CHIP_ERASE
, EnumSpiCycle50MHz
, EnumSpiOperationFullChipErase
}
181 0x800000 - FLASH_SIZE
, // BIOS Start Offset
182 FLASH_SIZE
// BIOS image size in flash
188 SF_VENDOR_ID_ATMEL
, // VendorId
189 SF_DEVICE_ID0_AT25DF641
, // DeviceId 0
190 SF_DEVICE_ID1_AT25DF641
, // DeviceId 1
192 SPI_COMMAND_WRITE_ENABLE
,
193 SPI_COMMAND_WRITE_S_EN
196 {EnumSpiOpcodeReadNoAddr
, SPI_COMMAND_JEDEC_ID
, EnumSpiCycle50MHz
, EnumSpiOperationJedecId
},
197 {EnumSpiOpcodeRead
, SPI_COMMAND_READ_ID
, EnumSpiCycle50MHz
, EnumSpiOperationOther
},
198 {EnumSpiOpcodeWriteNoAddr
, SPI_COMMAND_WRITE_S
, EnumSpiCycle50MHz
, EnumSpiOperationWriteStatus
},
199 {EnumSpiOpcodeWrite
, SPI_COMMAND_WRITE
, EnumSpiCycle50MHz
, EnumSpiOperationProgramData_1_Byte
},
200 {EnumSpiOpcodeRead
, SPI_COMMAND_READ
, EnumSpiCycle50MHz
, EnumSpiOperationReadData
},
201 {EnumSpiOpcodeWrite
, SPI_COMMAND_ERASE
, EnumSpiCycle50MHz
, EnumSpiOperationErase_4K_Byte
},
202 {EnumSpiOpcodeReadNoAddr
, SPI_COMMAND_READ_S
, EnumSpiCycle50MHz
, EnumSpiOperationReadStatus
},
203 {EnumSpiOpcodeWriteNoAddr
, SPI_COMMAND_CHIP_ERASE
, EnumSpiCycle50MHz
, EnumSpiOperationFullChipErase
}
205 0x800000 - FLASH_SIZE
, // BIOS Start Offset
206 FLASH_SIZE
// BIOS image size in flash
210 // Spansion 64Mbit part
213 SF_VENDOR_ID_SPANSION
, // VendorId
214 SF_DEVICE_ID0_S25FL064K
, // DeviceId 0
215 SF_DEVICE_ID1_S25FL064K
, // DeviceId 1
217 SPI_COMMAND_WRITE_ENABLE
,
218 SPI_COMMAND_WRITE_S_EN
221 {EnumSpiOpcodeReadNoAddr
, SPI_COMMAND_JEDEC_ID
, EnumSpiCycle50MHz
, EnumSpiOperationJedecId
},
222 {EnumSpiOpcodeRead
, SPI_COMMAND_READ_ID
, EnumSpiCycle50MHz
, EnumSpiOperationOther
},
223 {EnumSpiOpcodeWriteNoAddr
, SPI_COMMAND_WRITE_S
, EnumSpiCycle50MHz
, EnumSpiOperationWriteStatus
},
224 {EnumSpiOpcodeWrite
, SPI_COMMAND_WRITE
, EnumSpiCycle50MHz
, EnumSpiOperationProgramData_1_Byte
},
225 {EnumSpiOpcodeRead
, SPI_COMMAND_READ
, EnumSpiCycle50MHz
, EnumSpiOperationReadData
},
226 {EnumSpiOpcodeWrite
, SPI_COMMAND_ERASE
, EnumSpiCycle50MHz
, EnumSpiOperationErase_4K_Byte
},
227 {EnumSpiOpcodeReadNoAddr
, SPI_COMMAND_READ_S
, EnumSpiCycle50MHz
, EnumSpiOperationReadStatus
},
228 {EnumSpiOpcodeWriteNoAddr
, SPI_COMMAND_CHIP_ERASE
, EnumSpiCycle50MHz
, EnumSpiOperationFullChipErase
}
230 0x800000 - FLASH_SIZE
, // BIOS Start Offset
231 FLASH_SIZE
// BIOS image size in flash
235 // Macronix 64Mbit part bottom boot
238 SF_VENDOR_ID_MX
, // VendorId
239 SF_DEVICE_ID0_25L6405D
, // DeviceId 0
240 SF_DEVICE_ID1_25L6405D
, // DeviceId 1
242 SPI_COMMAND_WRITE_ENABLE
,
243 SPI_COMMAND_WRITE_S_EN
246 {EnumSpiOpcodeReadNoAddr
, SPI_COMMAND_JEDEC_ID
, EnumSpiCycle50MHz
, EnumSpiOperationJedecId
},
247 {EnumSpiOpcodeRead
, SPI_COMMAND_READ_ID
, EnumSpiCycle50MHz
, EnumSpiOperationOther
},
248 {EnumSpiOpcodeWriteNoAddr
, SPI_COMMAND_WRITE_S
, EnumSpiCycle50MHz
, EnumSpiOperationWriteStatus
},
249 {EnumSpiOpcodeWrite
, SPI_COMMAND_WRITE
, EnumSpiCycle50MHz
, EnumSpiOperationProgramData_1_Byte
},
250 {EnumSpiOpcodeRead
, SPI_COMMAND_READ
, EnumSpiCycle50MHz
, EnumSpiOperationReadData
},
251 {EnumSpiOpcodeWrite
, SPI_COMMAND_BLOCK_ERASE
, EnumSpiCycle50MHz
, EnumSpiOperationErase_64K_Byte
},
252 {EnumSpiOpcodeReadNoAddr
, SPI_COMMAND_READ_S
, EnumSpiCycle50MHz
, EnumSpiOperationReadStatus
},
253 {EnumSpiOpcodeWriteNoAddr
, SPI_COMMAND_CHIP_ERASE
, EnumSpiCycle50MHz
, EnumSpiOperationFullChipErase
}
255 0x800000 - FLASH_SIZE
, // BIOS Start Offset
256 FLASH_SIZE
// BIOS image size in flash
259 // Winbond 64Mbit part bottom boot
263 SF_DEVICE_ID0_W25QXX
,
264 SF_DEVICE_ID1_W25Q64
,
266 SPI_COMMAND_WRITE_ENABLE
,
267 SPI_COMMAND_WRITE_S_EN
270 {EnumSpiOpcodeReadNoAddr
, SPI_COMMAND_JEDEC_ID
, EnumSpiCycle50MHz
, EnumSpiOperationJedecId
},
271 {EnumSpiOpcodeRead
, SPI_COMMAND_READ_ID
, EnumSpiCycle50MHz
, EnumSpiOperationOther
},
272 {EnumSpiOpcodeWriteNoAddr
, SPI_COMMAND_WRITE_S
, EnumSpiCycle50MHz
, EnumSpiOperationWriteStatus
},
273 {EnumSpiOpcodeWrite
, SPI_COMMAND_WRITE
, EnumSpiCycle50MHz
, EnumSpiOperationProgramData_1_Byte
},
274 {EnumSpiOpcodeRead
, SPI_COMMAND_READ
, EnumSpiCycle50MHz
, EnumSpiOperationReadData
},
275 {EnumSpiOpcodeWrite
, SPI_COMMAND_ERASE
, EnumSpiCycle50MHz
, EnumSpiOperationErase_4K_Byte
},
276 {EnumSpiOpcodeReadNoAddr
, SPI_COMMAND_READ_S
, EnumSpiCycle50MHz
, EnumSpiOperationReadStatus
},
277 {EnumSpiOpcodeWriteNoAddr
, SPI_COMMAND_CHIP_ERASE
, EnumSpiCycle50MHz
, EnumSpiOperationFullChipErase
}
279 0x800000 - FLASH_SIZE
, // BIOS Start Offset
280 FLASH_SIZE
// BIOS image size in flash
283 // Winbond 64Mbit part bottom boot
290 SPI_COMMAND_WRITE_ENABLE
,
291 SPI_COMMAND_WRITE_S_EN
294 {EnumSpiOpcodeReadNoAddr
, SPI_COMMAND_JEDEC_ID
, EnumSpiCycle50MHz
, EnumSpiOperationJedecId
},
295 {EnumSpiOpcodeRead
, SPI_COMMAND_READ_ID
, EnumSpiCycle50MHz
, EnumSpiOperationOther
},
296 {EnumSpiOpcodeWriteNoAddr
, SPI_COMMAND_WRITE_S
, EnumSpiCycle50MHz
, EnumSpiOperationWriteStatus
},
297 {EnumSpiOpcodeWrite
, SPI_COMMAND_WRITE
, EnumSpiCycle50MHz
, EnumSpiOperationProgramData_1_Byte
},
298 {EnumSpiOpcodeRead
, SPI_COMMAND_READ
, EnumSpiCycle50MHz
, EnumSpiOperationReadData
},
299 {EnumSpiOpcodeWrite
, SPI_COMMAND_ERASE
, EnumSpiCycle50MHz
, EnumSpiOperationErase_4K_Byte
},
300 {EnumSpiOpcodeReadNoAddr
, SPI_COMMAND_READ_S
, EnumSpiCycle50MHz
, EnumSpiOperationReadStatus
},
301 {EnumSpiOpcodeWriteNoAddr
, SPI_COMMAND_CHIP_ERASE
, EnumSpiCycle50MHz
, EnumSpiOperationFullChipErase
}
303 0x800000 - FLASH_SIZE
, // BIOS Start Offset
304 FLASH_SIZE
// BIOS image size in flash
307 // Intel 64Mbit part bottom boot
314 SPI_COMMAND_WRITE_ENABLE
,
315 SPI_COMMAND_WRITE_S_EN
318 {EnumSpiOpcodeReadNoAddr
, SPI_COMMAND_JEDEC_ID
, EnumSpiCycle33MHz
, EnumSpiOperationJedecId
},
319 {EnumSpiOpcodeRead
, SPI_COMMAND_READ_ID
, EnumSpiCycle33MHz
, EnumSpiOperationOther
},
320 {EnumSpiOpcodeWriteNoAddr
, SPI_COMMAND_WRITE_S
, EnumSpiCycle33MHz
, EnumSpiOperationWriteStatus
},
321 {EnumSpiOpcodeWrite
, SPI_COMMAND_WRITE
, EnumSpiCycle33MHz
, EnumSpiOperationProgramData_1_Byte
},
322 {EnumSpiOpcodeRead
, SPI_COMMAND_READ
, EnumSpiCycle33MHz
, EnumSpiOperationReadData
},
323 {EnumSpiOpcodeWrite
, SPI_COMMAND_BLOCK_ERASE
, EnumSpiCycle33MHz
, EnumSpiOperationErase_64K_Byte
},
324 {EnumSpiOpcodeReadNoAddr
, SPI_COMMAND_READ_S
, EnumSpiCycle33MHz
, EnumSpiOperationReadStatus
},
325 {EnumSpiOpcodeWriteNoAddr
, SPI_COMMAND_CHIP_ERASE
, EnumSpiCycle33MHz
, EnumSpiOperationFullChipErase
}
327 0x800000 - FLASH_SIZE
, // BIOS Start Offset
328 FLASH_SIZE
// BIOS image size in flash