Patchwork Added chipsets

login
register
about
Submitter Николай Николаев
Date 2013-05-21 08:29:18
Message ID <CABSK2p=T4T=cW31HAeHjeo92OGsUThUnSuUEpLnKvnrSVxF5Vg@mail.gmail.com>
Download mbox | patch
Permalink /patch/3949/
State Superseded
Headers show

Comments

Николай Николаев - 2013-05-21 08:29:18
A new version patch

Was checked:
-functions block erase for all chips
-feature bits for all chips
-model_id for all chips
-manufacture_id for all chips
-voltage for all chips
Steven Zakulec - 2013-05-23 12:32:12
Thanks for the update. I will take a look at it soon.
On May 21, 2013 4:31 AM, "Николай Николаев" <evrinoma@gmail.com> wrote:

> A new version patch
>
> Was checked:
> -functions block erase for all chips
> -feature bits for all chips
> -model_id for all chips
> -manufacture_id for all chips
> -voltage for all chips
>
> --
> With best regards Nikolay Nikolaev
> С Уважением Николаев Николай
>
> _______________________________________________
> flashrom mailing list
> flashrom@flashrom.org
> http://www.flashrom.org/mailman/listinfo/flashrom
>
Steven Zakulec - 2013-05-27 01:13:45
Before I get started on the review, just a general comment or two.
If you plan to contribute in the future (which I certainly hope you will),
please break submissions down into blocks of 5-10 chips.  This makes it so
much easier for me, and any other reviewers, to quickly check the patch and
provide feedback in a timely manner.

In the last review, I mentioned the Numonyx M45PE series (10, 20, 40, 80,
16), should only have
+        .feature_bits    = FEATURE_WRSR_WREN,
set when the command is there.  It appears I may have been unclear there,
because instead of removing just the WREN flag, you removed the whole line
(the chips do have a Write Status Register- WRSR).


Continuing the review from Numonyx M45PE16.

Numonyx M25PX80-
+        .voltage    = {2700, 3600},
The datasheets I've seen have it as 2.3-3.6V (rev 4 Dec 2008 and Rev B
3/2013)

+        .tested        = TEST_OK_PREW,
Unless I'm reading it wrong, it looks like you're adding this chip as a
fully tested one- would you mind supplying some logs showing that it
successfully does these operations? (write logs shouldn't contain all :S
(for skipped blocks) next to the addresses).

Numonyx N25Q00AA13-
I'll admit I don't really know how this chip works, but it seems there
should be a 3rd eraseblock from the description of the memory organization
(datasheet is Rev E, 2/12):

Memory Configuration and Block Diagram
The memory is a stacked device comprised of four 256Mb chips. Each chip is
internally
partitioned into two 128Mb segments. Each page of memory can be
individually pro-
grammed. Bits are programmed from one through zero. The device is
subsector, sector,
or single 256Mb chip erasable, but not page-erasable. Bits are erased from
zero through
one. The memory is configured as 134,217,728 bytes (8 bits each); 2048
sectors (64KB
each); 32,768 subsectors (4KB each); and 524,288 pages (256 bytes each);
and 64 OTP
bytes are located outside the main memory array.

You've got:
+                .eraseblocks = { {4 * 1024, 32768 } },
+               .block_erase = spi_block_erase_20,
+            }, {
+                .eraseblocks = { {64 * 1024, 2048 } },
+               .block_erase = spi_block_erase_d8,

There's a die erase opcode, which I am unfamiliar with- maybe it handles
erasing a single 256Mb chip at a time?

Sanyo LF25FW203A / LE25FW203A-
Thanks so much for getting to the bottom of this chip, and figuring out
which chip it actually is.

         .probe        = probe_spi_rdid,
Maybe I'm reading the patch wrong, but you appear to be missing the
.probe_timing line for this chip.

LE25FW418A, LE25FW808  and LE25FW806 -
For the LE25FW806A you included the small sector erase, but left it out for
the rest of the chips- any particular reason for this?


I'll cover from Spansion S25FL128S to the end tomorrow.


On Tue, May 21, 2013 at 4:29 AM, Николай Николаев <evrinoma@gmail.com>wrote:

> A new version patch
>
> Was checked:
> -functions block erase for all chips
> -feature bits for all chips
> -model_id for all chips
> -manufacture_id for all chips
> -voltage for all chips
>
> --
> With best regards Nikolay Nikolaev
> С Уважением Николаев Николай
>
> _______________________________________________
> flashrom mailing list
> flashrom@flashrom.org
> http://www.flashrom.org/mailman/listinfo/flashrom
>
Steven Zakulec - 2013-05-27 16:02:16
On Mon, May 27, 2013 at 5:25 AM, Николай Николаев <evrinoma@gmail.com>wrote:

> Hi steven,
>
> 2013/5/27 Steven Zakulec <spzakulec@gmail.com>
>
>> Before I get started on the review, just a general comment or two.
>> If you plan to contribute in the future (which I certainly hope you
>> will), please break submissions down into blocks of 5-10 chips.  This makes
>> it so much easier for me, and any other reviewers, to quickly check the
>> patch and provide feedback in a timely manner.
>>
> Sorry, this is my first patch. My next patch i wrote with you wish. (
> http://patchwork.coreboot.org/patch/3896/) 8)
>
>
>
>> In the last review, I mentioned the Numonyx M45PE series (10, 20, 40, 80,
>> 16), should only have
>> +        .feature_bits    = FEATURE_WRSR_WREN,
>> set when the command is there.  It appears I may have been unclear there,
>> because instead of removing just the WREN flag, you removed the whole line
>> (the chips do have a Write Status Register- WRSR).
>>
>
>> Continuing the review from Numonyx M45PE16.
>>
> Sorry i don't know which flag must be used. You right these chips have a
> only WREN instruction, and i think if these chips doesn't have a feature
> that i exclude feature_bits. Maybe we will be able to specify the details.
>
Other people can provide more details on the general case, but in this
instance, with only a WREN instruction, the FEATURE line should be:
 +        .feature_bits    = FEATURE_WRSR

>
>
>> Numonyx M25PX80-
>> +        .voltage    = {2700, 3600},
>> The datasheets I've seen have it as 2.3-3.6V (rev 4 Dec 2008 and Rev B
>> 3/2013)
>>
>> +        .tested        = TEST_OK_PREW,
>> Unless I'm reading it wrong, it looks like you're adding this chip as a
>> fully tested one- would you mind supplying some logs showing that it
>> successfully does these operations? (write logs shouldn't contain all :S
>> (for skipped blocks) next to the addresses).
>>
> You right this is my typos, and i fixed them.
>
>
>> Numonyx N25Q00AA13-
>> I'll admit I don't really know how this chip works, but it seems there
>> should be a 3rd eraseblock from the description of the memory organization
>> (datasheet is Rev E, 2/12):
>>
>> Memory Configuration and Block Diagram
>> The memory is a stacked device comprised of four 256Mb chips. Each chip
>> is internally
>> partitioned into two 128Mb segments. Each page of memory can be
>> individually pro-
>> grammed. Bits are programmed from one through zero. The device is
>> subsector, sector,
>> or single 256Mb chip erasable, but not page-erasable. Bits are erased
>> from zero through
>> one. The memory is configured as 134,217,728 bytes (8 bits each); 2048
>> sectors (64KB
>> each); 32,768 subsectors (4KB each); and 524,288 pages (256 bytes each);
>> and 64 OTP
>> bytes are located outside the main memory array.
>>
>> You've got:
>> +                .eraseblocks = { {4 * 1024, 32768 } },
>> +               .block_erase = spi_block_erase_20,
>> +            }, {
>> +                .eraseblocks = { {64 * 1024, 2048 } },
>> +               .block_erase = spi_block_erase_d8,
>>
>> There's a die erase opcode, which I am unfamiliar with- maybe it handles
>> erasing a single 256Mb chip at a time?
>>
>
> You right this chip used a four 256 Mb chips. And 256 Mb chip has a three
> instruction subsector 20(hex) sector D8(hex) bulk C7(hex) erase commands.
> But chip N25Q00AA13 has a other op-code to initiate die erase command
> C4 (hex)
>
> So, how do you do a single-chip erase for this chip?

>
>
>> Sanyo LF25FW203A / LE25FW203A-
>> Thanks so much for getting to the bottom of this chip, and figuring out
>> which chip it actually is.
>>
>>          .probe        = probe_spi_rdid,
>> Maybe I'm reading the patch wrong, but you appear to be missing the
>> .probe_timing line for this chip.
>>
> You reading patch wrong.  The probe_timing line for this chip is present
> below in source code.
>
Okay- thanks for checking.

>
>
>> LE25FW418A, LE25FW808  and LE25FW806 -
>> For the LE25FW806A you included the small sector erase, but left it out
>> for the rest of the chips- any particular reason for this?
>>
> Because only LE25FW806A has a small sector erase op-code instruction,
> other chips didn't have it.
>
> What data sheets do you have for those chips?  The ones below list the
small sector erase op-code as D7.
LE25FW418A: 61709 SY 20090428-S00004 No.A1432
LE25FW808: 61009 SY IM 20090319-S00003 No.A0839
LE25FW806: 70208 SY IM 20070628-S00004 No.A0838


>>
>> I'll cover from Spansion S25FL128S to the end tomorrow.
>>
> Excellent
>
>
> how to delete all versions of the patch and leave only comments in one
> thread?
>
Don't change what you're doing for this patch.

>
> I send a new version patch
>
> --
> With best regards Nikolay Nikolaev
> С Уважением Николаев Николай
>
Steven Zakulec - 2013-05-27 17:53:45
On Mon, May 27, 2013 at 12:02 PM, Steven Zakulec <spzakulec@gmail.com>wrote:

>
>
>
> On Mon, May 27, 2013 at 5:25 AM, Николай Николаев <evrinoma@gmail.com>wrote:
>
>> Hi steven,
>>
>> 2013/5/27 Steven Zakulec <spzakulec@gmail.com>
>>>
>>> In the last review, I mentioned the Numonyx M45PE series (10, 20, 40,
>>> 80, 16), should only have
>>> +        .feature_bits    = FEATURE_WRSR_WREN,
>>> set when the command is there.  It appears I may have been unclear
>>> there, because instead of removing just the WREN flag, you removed the
>>> whole line (the chips do have a Write Status Register- WRSR).
>>>
>>
>>> Continuing the review from Numonyx M45PE16.
>>>
>> Sorry i don't know which flag must be used. You right these chips have a
>> only WREN instruction, and i think if these chips doesn't have a feature
>> that i exclude feature_bits. Maybe we will be able to specify the details.
>>
> Other people can provide more details on the general case, but in this
> instance, with only a WREN instruction, the FEATURE line should be:
>  +        .feature_bits    = FEATURE_WRSR
>
> I've been informed by others that your original idea of dropping the
FEATURE line is actually correct, so you should do that instead of what I
proposed.
Николай Николаев - 2013-05-28 05:59:54
---------- Forwarded message ----------
From: Николай Николаев <evrinoma@gmail.com>
Date: 2013/5/28
Subject: Re: [flashrom] Added chipsets
To: Steven Zakulec <spzakulec@gmail.com>


Hi Steven,

Other people can provide more details on the general case, but in this
> instance, with only a WREN instruction, the FEATURE line should be:
>
 I've been informed by others that your original idea of dropping the
> FEATURE line is actually correct, so you should do that instead of what I
> proposed.
>
i dropped this line because this line for chips fetch

 Numonyx N25Q00AA13-
>>> I'll admit I don't really know how this chip works, but it seems there
>>> should be a 3rd eraseblock from the description of the memory organization
>>> (datasheet is Rev E, 2/12):
>>>
>>> Memory Configuration and Block Diagram
>>> The memory is a stacked device comprised of four 256Mb chips. Each chip
>>> is internally
>>> partitioned into two 128Mb segments. Each page of memory can be
>>> individually pro-
>>> grammed. Bits are programmed from one through zero. The device is
>>> subsector, sector,
>>> or single 256Mb chip erasable, but not page-erasable. Bits are erased
>>> from zero through
>>> one. The memory is configured as 134,217,728 bytes (8 bits each); 2048
>>> sectors (64KB
>>> each); 32,768 subsectors (4KB each); and 524,288 pages (256 bytes each);
>>> and 64 OTP
>>> bytes are located outside the main memory array.
>>>
>>> You've got:
>>> +                .eraseblocks = { {4 * 1024, 32768 } },
>>> +               .block_erase = spi_block_erase_20,
>>> +            }, {
>>> +                .eraseblocks = { {64 * 1024, 2048 } },
>>> +               .block_erase = spi_block_erase_d8,
>>>
>>> There's a die erase opcode, which I am unfamiliar with- maybe it handles
>>> erasing a single 256Mb chip at a time?
>>>
>>
>> You right this chip used a four 256 Mb chips. And 256 Mb chip has a three
>> instruction subsector 20(hex) sector D8(hex) bulk C7(hex) erase commands.
>> But chip N25Q00AA13 has a other op-code to initiate die erase command
>> C4 (hex)
>>
>> So, how do you do a single-chip erase for this chip?
>
I think this function is feature, because use "not general" op-code C4 for
die erase command. Also first we need to write a special function feature
extended addressing for chips more than 128 mb, after that we will think
about how to initiate die erase instruction.

What data sheets do you have for those chips?  The ones below list the
> small sector erase op-code as D7.
> LE25FW418A: 61709 SY 20090428-S00004 No.A1432
> LE25FW808: 61009 SY IM 20090319-S00003 No.A0839
> LE25FW806: 70208 SY IM 20070628-S00004 No.A0838
>
 I have a equivalence data sheets.
 LE25FW808 has a general op-code 20(hex) to initiate small sector erase.
Other chips use a feature op-code as D7.
Steven Zakulec - 2013-05-28 12:25:54
---------- Forwarded message ----------
From: "Николай Николаев" <evrinoma@gmail.com>
Date: May 28, 2013 1:28 AM
Subject: Re: [flashrom] Added chipsets
To: "Steven Zakulec" <spzakulec@gmail.com>
Cc:

Hi Steven,

Other people can provide more details on the general case, but in this
> instance, with only a WREN instruction, the FEATURE line should be:
>
 I've been informed by others that your original idea of dropping the
> FEATURE line is actually correct, so you should do that instead of what I
> proposed.
>
i dropped this line because this line for chips fetch

 Numonyx N25Q00AA13-
>>> I'll admit I don't really know how this chip works, but it seems there
>>> should be a 3rd eraseblock from the description of the memory organization
>>> (datasheet is Rev E, 2/12):
>>>
>>> Memory Configuration and Block Diagram
>>> The memory is a stacked device comprised of four 256Mb chips. Each chip
>>> is internally
>>> partitioned into two 128Mb segments. Each page of memory can be
>>> individually pro-
>>> grammed. Bits are programmed from one through zero. The device is
>>> subsector, sector,
>>> or single 256Mb chip erasable, but not page-erasable. Bits are erased
>>> from zero through
>>> one. The memory is configured as 134,217,728 bytes (8 bits each); 2048
>>> sectors (64KB
>>> each); 32,768 subsectors (4KB each); and 524,288 pages (256 bytes each);
>>> and 64 OTP
>>> bytes are located outside the main memory array.
>>>
>>> You've got:
>>> +                .eraseblocks = { {4 * 1024, 32768 } },
>>> +               .block_erase = spi_block_erase_20,
>>> +            }, {
>>> +                .eraseblocks = { {64 * 1024, 2048 } },
>>> +               .block_erase = spi_block_erase_d8,
>>>
>>> There's a die erase opcode, which I am unfamiliar with- maybe it handles
>>> erasing a single 256Mb chip at a time?
>>>
>>
>> You right this chip used a four 256 Mb chips. And 256 Mb chip has a three
>> instruction subsector 20(hex) sector D8(hex) bulk C7(hex) erase commands.
>> But chip N25Q00AA13 has a other op-code to initiate die erase command
>> C4 (hex)
>>
>> So, how do you do a single-chip erase for this chip?
>
I think this function is feature, because use "not general" op-code C4 for
die erase command. Also first we need to write a special function feature
extended addressing for chips more than 128 mb, after that we will think
about how to initiate die erase instruction.

What data sheets do you have for those chips?  The ones below list the
> small sector erase op-code as D7.
> LE25FW418A: 61709 SY 20090428-S00004 No.A1432
> LE25FW808: 61009 SY IM 20090319-S00003 No.A0839
> LE25FW806: 70208 SY IM 20070628-S00004 No.A0838
>
 I have a equivalence data sheets.
 LE25FW808 has a general op-code 20(hex) to initiate small sector erase.
Other chips use a feature op-code as D7.

Patch

diff --git a/flashchips.c b/flashchips.c
index cbbb138..24175d5 100644
--- a/flashchips.c
+++ b/flashchips.c
@@ -1125,6 +1125,45 @@  const struct flashchip flashchips[] = {
 
 	{
 		.vendor		= "AMIC",
+		.name		= "A25LQ16",
+		.bustype	= BUS_SPI,
+		.manufacture_id	= AMIC_ID_NOPREFIX,
+		.model_id	= AMIC_A25LQ16,
+		.total_size	= 2048,
+		.page_size	= 256,
+		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP,
+		.tested		= TEST_UNTESTED,
+		.probe		= probe_spi_rdid,
+		.probe_timing	= TIMING_ZERO,
+		.block_erasers	= {
+			{
+				.eraseblocks = { { 4 * 1024, 512 } },
+				.block_erase = spi_block_erase_20,
+			}, {
+				.eraseblocks = { { 64 * 1024, 32 } },
+				.block_erase = spi_block_erase_52,
+			}, {
+				.eraseblocks = { { 64 * 1024, 32 } },
+				.block_erase = spi_block_erase_d8,
+			}, {
+				.eraseblocks = { { 2048 * 1024, 1 } },
+				.block_erase = spi_block_erase_60,
+			}, {
+				.eraseblocks = { { 2048 * 1024, 1 } },
+				.block_erase = spi_block_erase_c7,
+			}
+		},
+		.printlock	= spi_prettyprint_status_register_amic_a25l032,
+		.unlock		= NULL,/**
+					*Two status reg bytes (read with 0x35 and 0x05)
+					*/
+		.write		= spi_chip_write_256,
+		.read		= spi_chip_read,
+		.voltage	= {2700, 3600},
+	},
+
+	{
+		.vendor		= "AMIC",
 		.name		= "A25L032",
 		.bustype	= BUS_SPI,
 		.manufacture_id	= AMIC_ID_NOPREFIX,
@@ -3919,6 +3958,373 @@  const struct flashchip flashchips[] = {
 		.voltage	= {2700, 3600},
 	},
 
+
+	{
+		.vendor		= "Eon",
+		.name		= "EN25QH64",
+		.bustype	= BUS_SPI,
+		.manufacture_id	= EON_ID_NOPREFIX,
+		.model_id	= EON_EN25QH64,
+		.total_size	= 8192,
+		.page_size	= 256,
+		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP,
+		.tested		= TEST_UNTESTED,
+		.probe		= probe_spi_rdid,
+		.probe_timing	= TIMING_ZERO,
+		.block_erasers	= {
+			{
+				.eraseblocks = { {4 * 1024, 2048} },
+				.block_erase = spi_block_erase_20,
+			}, {
+				.eraseblocks = { {64 * 1024, 128} },
+				.block_erase = spi_block_erase_d8,
+			}, {
+				.eraseblocks = { { 8192 * 1024, 1} },
+				.block_erase = spi_block_erase_60,
+			}, {
+				.eraseblocks = { { 8192 * 1024, 1} },
+				.block_erase = spi_block_erase_c7,
+			}
+		},
+		.printlock	= spi_prettyprint_status_register_plain, /**
+									  * TODO: improve
+									  */
+		.unlock		= spi_disable_blockprotect,
+		.write		= spi_chip_write_256,
+		.read		= spi_chip_read,
+		.voltage	= {2700, 3600},
+	},
+
+	{
+		.vendor		= "Eon",
+		.name		= "EN25QH128",
+		.bustype	= BUS_SPI,
+		.manufacture_id	= EON_ID_NOPREFIX,
+		.model_id	= EON_EN25QH128,
+		.total_size	= 16384,
+		.page_size	= 256,
+		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP,
+		.tested		= TEST_UNTESTED,
+		.probe		= probe_spi_rdid,
+		.probe_timing	= TIMING_ZERO,
+		.block_erasers	= {
+			{
+				.eraseblocks = { {4 * 1024, 4096} },
+				.block_erase = spi_block_erase_20,
+			}, {
+				.eraseblocks = { {64 * 1024, 256} },
+				.block_erase = spi_block_erase_d8,
+			}, {
+				.eraseblocks = { { 16384 * 1024, 1} },
+				.block_erase = spi_block_erase_60,
+			}, {
+				.eraseblocks = { { 16384 * 1024, 1} },
+				.block_erase = spi_block_erase_c7,
+			}
+		},
+		.printlock	= spi_prettyprint_status_register_plain, /**
+									  * TODO: improve
+									  */
+		.unlock		= spi_disable_blockprotect,
+		.write		= spi_chip_write_256,
+		.read		= spi_chip_read,
+		.voltage	= {2700, 3600},
+	},
+
+	{
+		.vendor		= "Eon",
+		.name		= "EN25QH256",
+		.bustype	= BUS_SPI,
+		.manufacture_id	= EON_ID_NOPREFIX,
+		.model_id	= EON_EN25QH256,
+		.total_size	= 32768,
+		.page_size	= 256,
+		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP,
+		.tested		= TEST_UNTESTED,
+		.probe		= probe_spi_rdid,
+		.probe_timing	= TIMING_ZERO,
+		.block_erasers	= {
+			{
+				.eraseblocks = { {4 * 1024, 8192} },
+				.block_erase = spi_block_erase_20,
+			}, {
+				.eraseblocks = { {64 * 1024, 512} },
+				.block_erase = spi_block_erase_d8,
+			}, {
+				.eraseblocks = { { 32768 * 1024, 1} },
+				.block_erase = spi_block_erase_60,
+			}, {
+				.eraseblocks = { { 32768 * 1024, 1} },
+				.block_erase = spi_block_erase_c7,
+			}
+		},
+		.printlock	= spi_prettyprint_status_register_plain, /**
+									  * TODO: improve
+									  */
+		.unlock		= spi_disable_blockprotect,
+		.write		= spi_chip_write_256,
+		.read		= spi_chip_read,
+		.voltage	= {2700, 3600},
+	},
+
+	{
+		.vendor		= "Eon",
+		.name		= "EN25S10",
+		.bustype	= BUS_SPI,
+		.manufacture_id	= EON_ID_NOPREFIX,
+		.model_id	= EON_EN25S10,
+		.total_size	= 128,
+		.page_size	= 256,
+		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP,
+		.tested		= TEST_UNTESTED,
+		.probe		= probe_spi_rdid,
+		.probe_timing	= TIMING_ZERO,
+		.block_erasers	= {
+			{
+				.eraseblocks = { {4 * 1024, 32} },
+				.block_erase = spi_block_erase_20,
+			},  {
+				.eraseblocks = { {32 * 1024, 4} },
+				.block_erase = spi_block_erase_52,
+			}, {
+				.eraseblocks = { {128 * 1024, 1} },
+				.block_erase = spi_block_erase_60,
+			}, {
+				.eraseblocks = { {128 * 1024, 1} },
+				.block_erase = spi_block_erase_c7,
+			}
+		},
+		.printlock	= spi_prettyprint_status_register_plain, /**
+									  * TODO: improve
+									  */
+		.unlock		= spi_disable_blockprotect,
+		.write		= spi_chip_write_256,
+		.read		= spi_chip_read,
+		.voltage	= {1650, 1950},
+	},
+
+	{
+		.vendor		= "Eon",
+		.name		= "EN25S20",
+		.bustype	= BUS_SPI,
+		.manufacture_id	= EON_ID_NOPREFIX,
+		.model_id	= EON_EN25S20,
+		.total_size	= 256,
+		.page_size	= 256,
+		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP,
+		.tested		= TEST_UNTESTED,
+		.probe		= probe_spi_rdid,
+		.probe_timing	= TIMING_ZERO,
+		.block_erasers	= {
+			{
+				.eraseblocks = { {4 * 1024, 64} },
+				.block_erase = spi_block_erase_20,
+			}, {
+				.eraseblocks = { {64 * 1024, 4} },
+				.block_erase = spi_block_erase_d8,
+			}, {
+				.eraseblocks = { {256 * 1024, 1} },
+				.block_erase = spi_block_erase_60,
+			}, {
+				.eraseblocks = { {256 * 1024, 1} },
+				.block_erase = spi_block_erase_c7,
+			}
+		},
+		.printlock	= spi_prettyprint_status_register_plain, /**
+									  * TODO: improve
+									  */
+		.unlock		= spi_disable_blockprotect,
+		.write		= spi_chip_write_256,
+		.read		= spi_chip_read,
+		.voltage	= {1650, 1950},
+	},
+
+	{
+		.vendor		= "Eon",
+		.name		= "EN25S40",
+		.bustype	= BUS_SPI,
+		.manufacture_id	= EON_ID_NOPREFIX,
+		.model_id	= EON_EN25S40,
+		.total_size	= 512,
+		.page_size	= 256,
+		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP,
+		.tested		= TEST_UNTESTED,
+		.probe		= probe_spi_rdid,
+		.probe_timing	= TIMING_ZERO,
+		.block_erasers	= {
+			{
+				.eraseblocks = { {4 * 1024, 128} },
+				.block_erase = spi_block_erase_20,
+			}, {
+				.eraseblocks = { {64 * 1024, 8} },
+				.block_erase = spi_block_erase_d8,
+			}, {
+				.eraseblocks = { {512 * 1024, 1} },
+				.block_erase = spi_block_erase_60,
+			}, {
+				.eraseblocks = { {512 * 1024, 1} },
+				.block_erase = spi_block_erase_c7,
+			}
+		},
+		.printlock	= spi_prettyprint_status_register_plain, /**
+									  * TODO: improve
+									  */
+		.unlock		= spi_disable_blockprotect,
+		.write		= spi_chip_write_256,
+		.read		= spi_chip_read,
+		.voltage	= {1650, 1950},
+	},
+
+	{
+		.vendor		= "Eon",
+		.name		= "EN25S80",
+		.bustype	= BUS_SPI,
+		.manufacture_id	= EON_ID_NOPREFIX,
+		.model_id	= EON_EN25S80,
+		.total_size	= 1024,
+		.page_size	= 256,
+		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP,
+		.tested		= TEST_UNTESTED,
+		.probe		= probe_spi_rdid,
+		.probe_timing	= TIMING_ZERO,
+		.block_erasers	= {
+			{
+				.eraseblocks = { {4 * 1024, 256} },
+				.block_erase = spi_block_erase_20,
+			}, {
+				.eraseblocks = { {64 * 1024, 16} },
+				.block_erase = spi_block_erase_d8,
+			}, {
+				.eraseblocks = { {1024 * 1024, 1} },
+				.block_erase = spi_block_erase_60,
+			}, {
+				.eraseblocks = { {1024 * 1024, 1} },
+				.block_erase = spi_block_erase_c7,
+			}
+		},
+		.printlock	= spi_prettyprint_status_register_plain, /**
+									  * TODO: improve
+									  */
+		.unlock		= spi_disable_blockprotect,
+		.write		= spi_chip_write_256,
+		.read		= spi_chip_read,
+		.voltage	= {1650, 1950},
+	},
+
+	{
+		.vendor		= "Eon",
+		.name		= "EN25S16",
+		.bustype	= BUS_SPI,
+		.manufacture_id	= EON_ID_NOPREFIX,
+		.model_id	= EON_EN25S16,
+		.total_size	= 2048,
+		.page_size	= 256,
+		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP,
+		.tested		= TEST_UNTESTED,
+		.probe		= probe_spi_rdid,
+		.probe_timing	= TIMING_ZERO,
+		.block_erasers	= {
+			{
+				.eraseblocks = { {4 * 1024, 512} },
+				.block_erase = spi_block_erase_20,
+			}, {
+				.eraseblocks = { {64 * 1024, 32} },
+				.block_erase = spi_block_erase_52,
+			}, {
+				.eraseblocks = { {32 * 1024, 64} },
+				.block_erase = spi_block_erase_d8,
+			}, {
+				.eraseblocks = { {2048 * 1024, 1} },
+				.block_erase = spi_block_erase_60,
+			}, {
+				.eraseblocks = { {2048 * 1024, 1} },
+				.block_erase = spi_block_erase_c7,
+			}
+		},
+		.printlock	= spi_prettyprint_status_register_plain, /**
+									  * TODO: improve
+									  */
+		.unlock		= spi_disable_blockprotect,
+		.write		= spi_chip_write_256,
+		.read		= spi_chip_read,
+		.voltage	= {1650, 1950},
+	},
+
+	{
+		.vendor		= "Eon",
+		.name		= "EN25S32",
+		.bustype	= BUS_SPI,
+		.manufacture_id	= EON_ID_NOPREFIX,
+		.model_id	= EON_EN25S32,
+		.total_size	= 4096,
+		.page_size	= 256,
+		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP,
+		.tested		= TEST_UNTESTED,
+		.probe		= probe_spi_rdid,
+		.probe_timing	= TIMING_ZERO,
+		.block_erasers	= {
+			{
+				.eraseblocks = { {4 * 1024, 1024} },
+				.block_erase = spi_block_erase_20,
+			}, {
+				.eraseblocks = { {32 * 1024, 128} },
+				.block_erase = spi_block_erase_52,
+			}, {
+				.eraseblocks = { {64 * 1024, 64} },
+				.block_erase = spi_block_erase_d8,
+			}, {
+				.eraseblocks = { {4096 * 1024, 1} },
+				.block_erase = spi_block_erase_60,
+			}, {
+				.eraseblocks = { {4096 * 1024, 1} },
+				.block_erase = spi_block_erase_c7,
+			}
+		},
+		.printlock	= spi_prettyprint_status_register_plain, /**
+									  * TODO: improve
+									  */
+		.unlock		= spi_disable_blockprotect,
+		.write		= spi_chip_write_256,
+		.read		= spi_chip_read,
+		.voltage	= {1650, 1950},
+	},
+
+	{
+		.vendor		= "Eon",
+		.name		= "EN25S64",
+		.bustype	= BUS_SPI,
+		.manufacture_id	= EON_ID_NOPREFIX,
+		.model_id	= EON_EN25S64,
+		.total_size	= 8192,
+		.page_size	= 256,
+		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP,
+		.tested		= TEST_UNTESTED,
+		.probe		= probe_spi_rdid,
+		.probe_timing	= TIMING_ZERO,
+		.block_erasers	= {
+			{
+				.eraseblocks = { {4 * 1024, 2048} },
+				.block_erase = spi_block_erase_20,
+			}, {
+				.eraseblocks = { {64 * 1024, 128} },
+				.block_erase = spi_block_erase_d8,
+			}, {
+				.eraseblocks = { {8192 * 1024, 1} },
+				.block_erase = spi_block_erase_60,
+			}, {
+				.eraseblocks = { {8192 * 1024, 1} },
+				.block_erase = spi_block_erase_c7,
+			}
+		},
+		.printlock	= spi_prettyprint_status_register_plain, /**
+									  * TODO: improve
+									  */
+		.unlock		= spi_disable_blockprotect,
+		.write		= spi_chip_write_256,
+		.read		= spi_chip_read,
+		.voltage	= {1650, 1950},
+	},
+
 	{
 		.vendor		= "Eon",
 		.name		= "EN29F010",
@@ -4172,6 +4578,120 @@  const struct flashchip flashchips[] = {
 
 	{
 		.vendor		= "GigaDevice",
+		.name		= "GD25T80",
+		.bustype	= BUS_SPI,
+		.manufacture_id	= GIGADEVICE_ID,
+		.model_id	= GIGADEVICE_GD25T80,
+		.total_size	= 1024,
+		.page_size	= 256,
+		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP,
+		.tested		= TEST_UNTESTED,
+		.probe		= probe_spi_rdid,
+		.probe_timing	= TIMING_ZERO,
+		.block_erasers	= {
+			{
+				.eraseblocks = { {4 * 1024, 256} },
+				.block_erase = spi_block_erase_20,
+			}, {
+				.eraseblocks = { {64 * 1024, 16} },
+				.block_erase = spi_block_erase_52,
+			}, {
+				.eraseblocks = { {64 * 1024, 16} },
+				.block_erase = spi_block_erase_d8,
+			}, {
+				.eraseblocks = { {1024 * 1024, 1} },
+				.block_erase = spi_block_erase_60,
+			}, {
+				.eraseblocks = { {1024 * 1024, 1} },
+				.block_erase = spi_block_erase_c7,
+			}
+		},
+		.printlock	= spi_prettyprint_status_register_plain, /**
+									  * TODO: improve
+									  */
+		.unlock		= spi_disable_blockprotect,
+		.write		= spi_chip_write_256,
+		.read		= spi_chip_read,
+		.voltage	= {2700, 3600},
+	},
+
+	{
+		.vendor		= "GigaDevice",
+		.name		= "GD25Q512",
+		.bustype	= BUS_SPI,
+		.manufacture_id	= GIGADEVICE_ID,
+		.model_id	= GIGADEVICE_GD25Q512,
+		.total_size	= 64,
+		.page_size	= 256,
+		.feature_bits	= FEATURE_WRSR_WREN,
+		.tested		= TEST_UNTESTED,
+		.probe		= probe_spi_rdid,
+		.probe_timing	= TIMING_ZERO,
+		.block_erasers	= {
+			{
+				.eraseblocks = { {4 * 1024, 16} },
+				.block_erase = spi_block_erase_20,
+			}, {
+				.eraseblocks = { {32 * 1024, 2} },
+				.block_erase = spi_block_erase_52,
+			}, {
+				.eraseblocks = { {64 * 1024, 1} },
+				.block_erase = spi_block_erase_60,
+			}, {
+				.eraseblocks = { {64 * 1024, 1} },
+				.block_erase = spi_block_erase_c7,
+			}
+		},
+		.printlock	= spi_prettyprint_status_register_plain, /**
+									  * TODO: improve
+									  */
+		.unlock		= spi_disable_blockprotect,
+		.write		= spi_chip_write_256,
+		.read		= spi_chip_read,
+		.voltage	= {2700, 3600},
+	},
+
+	{
+		.vendor		= "GigaDevice",
+		.name		= "GD25Q10",
+		.bustype	= BUS_SPI,
+		.manufacture_id	= GIGADEVICE_ID,
+		.model_id	= GIGADEVICE_GD25Q10,
+		.total_size	= 128,
+		.page_size	= 256,
+		.feature_bits	= FEATURE_WRSR_WREN,
+		.tested		= TEST_UNTESTED,
+		.probe		= probe_spi_rdid,
+		.probe_timing	= TIMING_ZERO,
+		.block_erasers	= {
+			{
+				.eraseblocks = { {4 * 1024, 32} },
+				.block_erase = spi_block_erase_20,
+			}, {
+				.eraseblocks = { {32 * 1024, 4} },
+				.block_erase = spi_block_erase_52,
+			}, {
+				.eraseblocks = { {64 * 1024, 2} },
+				.block_erase = spi_block_erase_d8,
+			}, {
+				.eraseblocks = { {128 * 1024, 1} },
+				.block_erase = spi_block_erase_60,
+			}, {
+				.eraseblocks = { {128 * 1024, 1} },
+				.block_erase = spi_block_erase_c7,
+			}
+		},
+		.printlock	= spi_prettyprint_status_register_plain, /**
+									  * TODO: improve
+									  */
+		.unlock		= spi_disable_blockprotect,
+		.write		= spi_chip_write_256,
+		.read		= spi_chip_read,
+		.voltage	= {2700, 3600},
+	},
+
+	{
+		.vendor		= "GigaDevice",
 		.name		= "GD25Q20",
 		.bustype	= BUS_SPI,
 		.manufacture_id	= GIGADEVICE_ID,
@@ -6233,6 +6753,136 @@  const struct flashchip flashchips[] = {
 
 	{
 		.vendor		= "Numonyx",
+		.name		= "M45PE10",
+		.bustype	= BUS_SPI,
+		.manufacture_id	= ST_ID,
+		.model_id	= ST_M45PE10,
+		.total_size	= 128,
+		.page_size	= 256,
+		.tested		= TEST_UNTESTED,
+		.probe		= probe_spi_rdid,
+		.probe_timing	= TIMING_ZERO,
+		.block_erasers	= {
+			{
+				.eraseblocks = { {64 * 1024, 2} },
+				.block_erase = spi_block_erase_d8,
+			}
+		},
+		.printlock	= spi_prettyprint_status_register_plain, /**
+									  * TODO: improve
+									  */
+		.unlock		= spi_disable_blockprotect,
+		.write		= spi_chip_write_256,
+		.read		= spi_chip_read,
+		.voltage	= {2700, 3600},
+	},
+
+	{
+		.vendor		= "Numonyx",
+		.name		= "M45PE20",
+		.bustype	= BUS_SPI,
+		.manufacture_id	= ST_ID,
+		.model_id	= ST_M45PE20,
+		.total_size	= 256,
+		.page_size	= 256,
+		.tested		= TEST_UNTESTED,
+		.probe		= probe_spi_rdid,
+		.probe_timing	= TIMING_ZERO,
+		.block_erasers	= {
+			{
+				.eraseblocks = { {64 * 1024, 4} },
+				.block_erase = spi_block_erase_d8,
+			}
+		},
+		.printlock	= spi_prettyprint_status_register_plain, /**
+									  * TODO: improve
+									  */
+		.unlock		= spi_disable_blockprotect,
+		.write		= spi_chip_write_256,
+		.read		= spi_chip_read,
+		.voltage	= {2700, 3600},
+	},
+
+	{
+		.vendor		= "Numonyx",
+		.name		= "M45PE40",
+		.bustype	= BUS_SPI,
+		.manufacture_id	= ST_ID,
+		.model_id	= ST_M45PE40,
+		.total_size	= 512,
+		.page_size	= 256,
+		.tested		= TEST_UNTESTED,
+		.probe		= probe_spi_rdid,
+		.probe_timing	= TIMING_ZERO,
+		.block_erasers	= {
+			{
+				.eraseblocks = { {64 * 1024, 8} },
+				.block_erase = spi_block_erase_d8,
+			}
+		},
+		.printlock	= spi_prettyprint_status_register_plain, /**
+									  * TODO: improve
+									  */
+		.unlock		= spi_disable_blockprotect,
+		.write		= spi_chip_write_256,
+		.read		= spi_chip_read,
+		.voltage	= {2700, 3600},
+	},
+
+	{
+		.vendor		= "Numonyx",
+		.name		= "M45PE80",
+		.bustype	= BUS_SPI,
+		.manufacture_id	= ST_ID,
+		.model_id	= ST_M45PE80,
+		.total_size	= 1024,
+		.page_size	= 256,
+		.tested		= TEST_UNTESTED,
+		.probe		= probe_spi_rdid,
+		.probe_timing	= TIMING_ZERO,
+		.block_erasers	= {
+			{
+				.eraseblocks = { {64 * 1024, 16} },
+				.block_erase = spi_block_erase_d8,
+			}
+		},
+		.printlock	= spi_prettyprint_status_register_plain, /**
+									  * TODO: improve
+									*/
+		.unlock		= spi_disable_blockprotect,
+		.write		= spi_chip_write_256,
+		.read		= spi_chip_read,
+		.voltage	= {2700, 3600},
+	},
+
+	{
+		.vendor		= "Numonyx",
+		.name		= "M45PE16",
+		.bustype	= BUS_SPI,
+		.manufacture_id	= ST_ID,
+		.model_id	= ST_M45PE16,
+		.total_size	= 2048,
+		.page_size	= 256,
+		.tested		= TEST_UNTESTED,
+		.probe		= probe_spi_rdid,
+		.probe_timing	= TIMING_ZERO,
+		.block_erasers	= {
+			{
+				.eraseblocks = { {64 * 1024, 32} },
+				.block_erase = spi_block_erase_d8,
+			}
+		},
+		.printlock	= spi_prettyprint_status_register_plain, /**
+									  * TODO: improve
+									  */
+		.unlock		= spi_disable_blockprotect,
+		.write		= spi_chip_write_256,
+		.read		= spi_chip_read,
+		.voltage	= {2700, 3600},
+	},
+
+	{
+		.vendor		= "Numonyx",
 		.name		= "M25PE10",
 		.bustype	= BUS_SPI,
 		.manufacture_id	= ST_ID,
@@ -6393,6 +7043,39 @@  const struct flashchip flashchips[] = {
 
 	{
 		.vendor		= "Numonyx",
+		.name		= "M25PX80",
+		.bustype	= BUS_SPI,
+		.manufacture_id	= ST_ID,
+		.model_id	= ST_M25PX80,
+		.total_size	= 1024,
+		.page_size	= 256,
+		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP,
+		.tested		= TEST_OK_PREW,
+		.probe		= probe_spi_rdid,
+		.probe_timing	= TIMING_ZERO,
+		.block_erasers	= {
+			{
+				.eraseblocks = { { 4 * 1024, 256 } },
+				.block_erase = spi_block_erase_20,
+			}, {
+				.eraseblocks = { {64 * 1024, 16} },
+				.block_erase = spi_block_erase_d8,
+			}, {
+				.eraseblocks = { {1024 * 1024, 1} },
+				.block_erase = spi_block_erase_c7,
+			}
+		},
+		.printlock	= spi_prettyprint_status_register_plain, /**
+									  * TODO: improve
+									  */
+		.unlock		= spi_disable_blockprotect,
+		.write		= spi_chip_write_256,
+		.read		= spi_chip_read,
+		.voltage	= {2700, 3600},
+	},
+
+	{
+		.vendor		= "Numonyx",
 		.name		= "N25Q016",
 		.bustype	= BUS_SPI,
 		.manufacture_id	= ST_ID,
@@ -6782,6 +7465,231 @@  const struct flashchip flashchips[] = {
 	},
 
 	{
+		.vendor		= "Numonyx",
+		.name		= "N25Q128A13",
+		.bustype	= BUS_SPI,
+		.manufacture_id = ST_ID,
+		.model_id	= ST_N25Q128A13,
+		.total_size	= 16384,
+		.page_size	= 256,
+		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP,
+		.tested		= TEST_UNTESTED,
+		.probe		= probe_spi_rdid,
+		.probe_timing	= TIMING_ZERO,
+		.block_erasers	= {
+			{
+				.eraseblocks = { {4 * 1024, 4096 } },
+				.block_erase = spi_block_erase_20,
+			}, {
+				.eraseblocks = { {64 * 1024, 256} },
+				.block_erase = spi_block_erase_d8,
+			}, {
+				.eraseblocks = { {16384 * 1024, 1} },
+				.block_erase = spi_block_erase_c7,
+			}
+		},
+		.printlock	= spi_prettyprint_status_register_plain, /**
+									  * TODO: improve
+									  */
+		.unlock		= spi_disable_blockprotect,
+		.write		= spi_chip_write_256,
+		.read		= spi_chip_read,
+		.voltage	= {2700, 3600},
+	},
+
+	{
+		.vendor		= "Numonyx",
+		.name		= "N25Q128A11",
+		.bustype	= BUS_SPI,
+		.manufacture_id = ST_ID,
+		.model_id	= ST_N25Q128A11,
+		.total_size	= 16384,
+		.page_size	= 256,
+		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP,
+		.tested		= TEST_UNTESTED,
+		.probe		= probe_spi_rdid,
+		.probe_timing	= TIMING_ZERO,
+		.block_erasers	= {
+			{
+				.eraseblocks = { {4 * 1024, 4096 } },
+				.block_erase = spi_block_erase_20,
+			}, {
+				.eraseblocks = { {64 * 1024, 256} },
+				.block_erase = spi_block_erase_d8,
+			}, {
+				.eraseblocks = { {16384 * 1024, 1} },
+				.block_erase = spi_block_erase_c7,
+			}
+		},
+		.printlock	= spi_prettyprint_status_register_plain, /**
+									  * TODO: improve
+									  */
+		.unlock		= spi_disable_blockprotect,
+		.write		= spi_chip_write_256,
+		.read		= spi_chip_read,
+		.voltage	= {1700, 2000},
+	},
+
+	{
+		.vendor		= "Numonyx",
+		.name		= "N25Q256A13",
+		.bustype	= BUS_SPI,
+		.manufacture_id = ST_ID,
+		.model_id	= ST_N25Q256A13,
+		.total_size	= 32768,
+		.page_size	= 256,
+		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP,
+		.tested		= TEST_UNTESTED,
+		.probe		= probe_spi_rdid,
+		.probe_timing	= TIMING_ZERO,
+		.block_erasers	= {
+			{
+				.eraseblocks = { {4 * 1024, 8192 } },
+				.block_erase = spi_block_erase_20,
+			}, {
+				.eraseblocks = { {64 * 1024, 512} },
+				.block_erase = spi_block_erase_d8,
+			}, {
+				.eraseblocks = { {32768 * 1024, 1} },
+				.block_erase = spi_block_erase_c7,
+			}
+		},
+		.printlock	= spi_prettyprint_status_register_plain, /**
+									  * TODO: improve
+									  */
+		.unlock		= spi_disable_blockprotect,
+		.write		= spi_chip_write_256,
+		.read		= spi_chip_read,
+		.voltage	= {2700, 3600},
+	},
+
+	{
+		.vendor		= "Numonyx",
+		.name		= "N25Q256A11",
+		.bustype	= BUS_SPI,
+		.manufacture_id = ST_ID,
+		.model_id	= ST_N25Q256A11,
+		.total_size	= 32768,
+		.page_size	= 256,
+		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP,
+		.tested		= TEST_UNTESTED,
+		.probe		= probe_spi_rdid,
+		.probe_timing	= TIMING_ZERO,
+		.block_erasers	= {
+			{
+				.eraseblocks = { {4 * 1024, 8192 } },
+				.block_erase = spi_block_erase_20,
+			}, {
+				.eraseblocks = { {64 * 1024, 512} },
+				.block_erase = spi_block_erase_d8,
+			}, {
+				.eraseblocks = { {32768 * 1024, 1} },
+				.block_erase = spi_block_erase_c7,
+			}
+		},
+		.printlock	= spi_prettyprint_status_register_plain, /**
+									  * TODO: improve
+									  */
+		.unlock		= spi_disable_blockprotect,
+		.write		= spi_chip_write_256,
+		.read		= spi_chip_read,
+		.voltage	= {1700, 2000},
+	},
+
+	{
+		.vendor		= "Numonyx",
+		.name		= "N25Q512A13",
+		.bustype	= BUS_SPI,
+		.manufacture_id = ST_ID,
+		.model_id	= ST_N25Q512A13,
+		.total_size	= 65536,
+		.page_size	= 256,
+		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP,
+		.tested		= TEST_UNTESTED,
+		.probe		= probe_spi_rdid,
+		.probe_timing	= TIMING_ZERO,
+		.block_erasers	= {
+			{
+				.eraseblocks = { {4 * 1024, 16384 } },
+				.block_erase = spi_block_erase_20,
+			}, {
+				.eraseblocks = { {64 * 1024, 1024 } },
+				.block_erase = spi_block_erase_d8,
+			}, {
+				.eraseblocks = { {65536 * 1024, 1} },
+				.block_erase = spi_block_erase_c7,
+			}
+		},
+		.printlock	= spi_prettyprint_status_register_plain, /**
+									  * TODO: improve
+									  */
+		.unlock		= spi_disable_blockprotect,
+		.write		= spi_chip_write_256,
+		.read		= spi_chip_read,
+		.voltage	= {2700, 3600},
+	},
+
+	{
+		.vendor		= "Numonyx",
+		.name		= "N25Q512A11",
+		.bustype	= BUS_SPI,
+		.manufacture_id = ST_ID,
+		.model_id	= ST_N25Q512A11,
+		.total_size	= 65536,
+		.page_size	= 256,
+		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP,
+		.tested		= TEST_UNTESTED,
+		.probe		= probe_spi_rdid,
+		.probe_timing	= TIMING_ZERO,
+		.block_erasers	= {
+			{
+				.eraseblocks = { {4 * 1024, 16384 } },
+				.block_erase = spi_block_erase_20,
+			}, {
+				.eraseblocks = { {64 * 1024, 1024 } },
+				.block_erase = spi_block_erase_d8,
+			}
+		},
+		.printlock	= spi_prettyprint_status_register_plain, /**
+									  * TODO: improve
+									  */
+		.unlock		= spi_disable_blockprotect,
+		.write		= spi_chip_write_256,
+		.read		= spi_chip_read,
+		.voltage	= {1700, 2000},
+	},
+
+	{
+		.vendor		= "Numonyx",
+		.name		= "N25Q00AA13",
+		.bustype	= BUS_SPI,
+		.manufacture_id = ST_ID,
+		.model_id	= ST_N25Q00AA13,
+		.total_size	= 131072,
+		.page_size	= 256,
+		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP,
+		.tested		= TEST_UNTESTED,
+		.probe		= probe_spi_rdid,
+		.probe_timing	= TIMING_ZERO,
+		.block_erasers	= {
+			{
+				.eraseblocks = { {4 * 1024, 32768 } },
+				.block_erase = spi_block_erase_20,
+			}, {
+				.eraseblocks = { {64 * 1024, 2048 } },
+				.block_erase = spi_block_erase_d8,
+			}
+		},
+		.printlock	= spi_prettyprint_status_register_plain, /**
+									  * TODO: improve
+									  */
+		.unlock		= spi_disable_blockprotect,
+		.write		= spi_chip_write_256,
+		.read		= spi_chip_read,
+		.voltage	= {2700, 3600},
+	},
+
+	{
 		.vendor		= "PMC",
 		.name		= "Pm25LV010",
 		.bustype	= BUS_SPI,
@@ -7233,11 +8141,11 @@  const struct flashchip flashchips[] = {
 
 	{
 		.vendor		= "Sanyo",
-		.name		= "LF25FW203A",
+		.name		= "LE25FW203A",
 		.bustype	= BUS_SPI,
 		.manufacture_id	= SANYO_ID,
 		.model_id	= SANYO_LE25FW203A,
-		.total_size	= 2048,
+		.total_size	= 256,
 		.page_size	= 256,
 		.tested		= TEST_UNTESTED,
 		.probe		= probe_spi_rdid,
@@ -7245,17 +8153,142 @@  const struct flashchip flashchips[] = {
 		.block_erasers	=
 		{
 			{
-				.eraseblocks = { {64 * 1024, 32} },
+				.eraseblocks = { {64 * 1024, 4} },
 				.block_erase = spi_block_erase_d8,
 			},	{
-				.eraseblocks = { {2 * 1024 * 1024, 1} },
+				.eraseblocks = { {256 * 1024, 1} },
 				.block_erase = spi_block_erase_c7,
 			}
 		},
-		.printlock	= spi_prettyprint_status_register_plain, /* TODO: improve */
+		.printlock	= spi_prettyprint_status_register_plain, /**
+									  * TODO: improve
+									  */
 		.unlock		= spi_disable_blockprotect,
 		.write		= spi_chip_write_256,
 		.read		= spi_chip_read,
+		.voltage	= {2700, 3600},
+	},
+
+	{
+		.vendor		= "Sanyo",
+		.name		= "LE25FW403A",
+		.bustype	= BUS_SPI,
+		.manufacture_id	= SANYO_ID,
+		.model_id	= SANYO_LE25FW403A,
+		.total_size	= 512,
+		.page_size	= 256,
+		.tested		= TEST_UNTESTED,
+		.probe		= probe_spi_rdid,
+		.probe_timing	= TIMING_ZERO,
+		.block_erasers	= {
+			{
+				.eraseblocks = { {64 * 1024, 8} },
+				.block_erase = spi_block_erase_d8,
+			},	{
+				.eraseblocks = { {512 * 1024, 1} },
+				.block_erase = spi_block_erase_c7,
+			}
+		},
+		.printlock	= spi_prettyprint_status_register_plain, /**
+									  * TODO: improve
+									  */
+		.unlock		= spi_disable_blockprotect,
+		.write		= spi_chip_write_256,
+		.read		= spi_chip_read,
+		.voltage	= {2700, 3600},
+	},
+
+	{
+		.vendor		= "Sanyo",
+		.name		= "LE25FW418A",
+		.bustype	= BUS_SPI,
+		.manufacture_id	= SANYO_ID,
+		.model_id	= SANYO_LE25FW418A,
+		.total_size	= 512,
+		.page_size	= 256,
+		.feature_bits	= FEATURE_WRSR_WREN,
+		.tested		= TEST_UNTESTED,
+		.probe		= probe_spi_rdid,
+		.probe_timing	= TIMING_ZERO,
+		.block_erasers	= {
+			{
+				.eraseblocks = { {64 * 1024, 8} },
+				.block_erase = spi_block_erase_d8,
+			},	{
+				.eraseblocks = { {512 * 1024, 1} },
+				.block_erase = spi_block_erase_c7,
+				}
+			},
+		.printlock	= spi_prettyprint_status_register_plain, /**
+									  * TODO: improve
+									  */
+		.unlock		= spi_disable_blockprotect,
+		.write		= spi_chip_write_256,
+		.read		= spi_chip_read,
+		.voltage	= {2700, 3600},
+	},
+
+	{
+		.vendor		= "Sanyo",
+		.name		= "LE25FW806",
+		.bustype	= BUS_SPI,
+		.manufacture_id	= SANYO_ID,
+		.model_id	= SANYO_LE25FW806,
+		.total_size	= 1024,
+		.page_size	= 256,
+		.feature_bits	= FEATURE_WRSR_WREN,
+		.tested		= TEST_UNTESTED,
+		.probe		= probe_spi_rdid,
+		.probe_timing	= TIMING_ZERO,
+		.block_erasers	= {
+			{
+				.eraseblocks = { {4 * 1024, 256} },
+				.block_erase = spi_block_erase_20,
+			},	{
+				.eraseblocks = { {64 * 1024, 16} },
+				.block_erase = spi_block_erase_d8,
+			},	{
+				.eraseblocks = { {1024 * 1024, 1} },
+				.block_erase = spi_block_erase_c7,
+			}
+		},
+		.printlock	= spi_prettyprint_status_register_plain, /**
+									  * TODO: improve
+									  */
+		.unlock		= spi_disable_blockprotect,
+		.write		= spi_chip_write_256,
+		.read		= spi_chip_read,
+		.voltage	= {2700, 3600},
+	},
+
+	{
+		.vendor		= "Sanyo",
+		.name		= "LE25FW808",
+		.bustype	= BUS_SPI,
+		.manufacture_id	= SANYO_ID,
+		.model_id	= SANYO_LE25FW808,
+		.total_size	= 1024,
+		.page_size	= 256,
+		.feature_bits	= FEATURE_WRSR_WREN,
+		.tested		= TEST_UNTESTED,
+		.probe		= probe_spi_rdid,
+		.probe_timing	= TIMING_ZERO,
+		.block_erasers	= {
+			{
+				.eraseblocks = { {64 * 1024, 16} },
+				.block_erase = spi_block_erase_d8,
+			},	{
+				.eraseblocks = { {1024 * 1024, 1} },
+				.block_erase = spi_block_erase_c7,
+			}
+		},
+		.printlock	= spi_prettyprint_status_register_plain, /**
+									  * TODO: improve
+									  */
+		.unlock		= spi_disable_blockprotect,
+		.write		= spi_chip_write_256,
+		.read		= spi_chip_read,
+		.voltage	= {2700, 3600},
 	},
 
 	{
@@ -7467,6 +8500,219 @@  const struct flashchip flashchips[] = {
 	},
 
 	{
+		.vendor		= "Spansion",
+		.name		= "S25FL116K",
+		.bustype	= BUS_SPI,
+		.manufacture_id	= SPANSION_ID,
+		.model_id	= SPANSION_S25FL116,
+		.total_size	= 2048,
+		.page_size	= 256,
+		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP,
+		.tested		= TEST_UNTESTED,
+		.probe		= probe_spi_rdid,
+		.probe_timing	= TIMING_ZERO,
+		.block_erasers	= {
+			{
+				.eraseblocks = { {4 * 1024, 512} },
+				.block_erase = spi_block_erase_20,
+			}, {
+				.eraseblocks = { {64 * 1024, 32} },
+				.block_erase = spi_block_erase_d8,
+			}, {
+				.eraseblocks = { { 2048 * 1024, 1} },
+				.block_erase = spi_block_erase_60,
+			}, {
+				.eraseblocks = { { 2048 * 1024, 1} },
+				.block_erase = spi_block_erase_c7,
+			}
+		},
+		.printlock	= spi_prettyprint_status_register_plain, /**
+									  * TODO: improve
+									  */
+		.unlock		= spi_disable_blockprotect,
+		.write		= spi_chip_write_256,
+		.read		= spi_chip_read,
+		.voltage	= {2700, 3600},
+	},
+
+	{
+		.vendor		= "Spansion",
+		.name		= "S25FL204K",
+		.bustype	= BUS_SPI,
+		.manufacture_id	= SPANSION_ID,
+		.model_id	= SPANSION_S25FL204,
+		.total_size	= 512,
+		.page_size	= 256,
+		.feature_bits	= FEATURE_WRSR_WREN,
+		.tested		= TEST_UNTESTED,
+		.probe		= probe_spi_rdid,
+		.probe_timing	= TIMING_ZERO,
+		.block_erasers	= {
+			{
+				.eraseblocks = { {4 * 1024, 128} },
+				.block_erase = spi_block_erase_20,
+			}, {
+				.eraseblocks = { {64 * 1024, 8} },
+				.block_erase = spi_block_erase_d8,
+			}, {
+				.eraseblocks = { { 512 * 1024, 1} },
+				.block_erase = spi_block_erase_60,
+			}, {
+				.eraseblocks = { { 512 * 1024, 1} },
+				.block_erase = spi_block_erase_c7,
+			}
+		},
+		.printlock	= spi_prettyprint_status_register_plain, /**
+									  * TODO: improve
+									  */
+		.unlock		= spi_disable_blockprotect,
+		.write		= spi_chip_write_256,
+		.read		= spi_chip_read,
+		.voltage	= {2700, 3600},
+	},
+
+	{
+		.vendor		= "Spansion",
+		.name		= "S25FL208K",
+		.bustype	= BUS_SPI,
+		.manufacture_id	= SPANSION_ID,
+		.model_id	= SPANSION_S25FL208,
+		.total_size	= 1024,
+		.page_size	= 256,
+		.feature_bits	= FEATURE_WRSR_WREN,
+		.tested		= TEST_UNTESTED,
+		.probe		= probe_spi_rdid,
+		.probe_timing	= TIMING_ZERO,
+		.block_erasers	= {
+			{
+				.eraseblocks = { {4 * 1024, 256} },
+				.block_erase = spi_block_erase_20,
+			}, {
+				.eraseblocks = { {64 * 1024, 16} },
+				.block_erase = spi_block_erase_d8,
+			}, {
+				.eraseblocks = { { 1024 * 1024, 1} },
+				.block_erase = spi_block_erase_60,
+			}, {
+				.eraseblocks = { { 1024 * 1024, 1} },
+				.block_erase = spi_block_erase_c7,
+			}
+		},
+		.printlock	= spi_prettyprint_status_register_plain, /**
+									  * TODO: improve
+									  */
+		.unlock		= spi_disable_blockprotect,
+		.write		= spi_chip_write_256,
+		.read		= spi_chip_read,
+		.voltage	= {2700, 3600},
+	},
+
+	{
+		.vendor		= "Spansion",
+		.name		= "S25FL128S",
+		.bustype	= BUS_SPI,
+		.manufacture_id	= SPANSION_ID,
+		.model_id	= SPANSION_S25FL128,
+		.total_size	= 16384,
+		.page_size	= 256,
+		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP,
+		.tested		= TEST_UNTESTED,
+		.probe		= probe_spi_rdid,
+		.probe_timing	= TIMING_ZERO,
+		.block_erasers	= {
+			{
+				.eraseblocks = { {4 * 1024, 4096} },
+				.block_erase = spi_block_erase_20,
+			}, {
+				.eraseblocks = { {64 * 1024, 256} },
+				.block_erase = spi_block_erase_d8,
+			}, {
+				.eraseblocks = { { 16384 * 1024, 1} },
+				.block_erase = spi_block_erase_60,
+			}, {
+				.eraseblocks = { { 16384 * 1024, 1} },
+				.block_erase = spi_block_erase_c7,
+			}
+		},
+		.printlock	= spi_prettyprint_status_register_plain, /**
+									  * TODO: improve
+									  */
+		.unlock		= spi_disable_blockprotect,
+		.write		= spi_chip_write_256,
+		.read		= spi_chip_read,
+		.voltage	= {2700, 3600},
+	},
+
+	{
+		.vendor		= "Spansion",
+		.name		= "S25FL256S",
+		.bustype	= BUS_SPI,
+		.manufacture_id	= SPANSION_ID,
+		.model_id	= SPANSION_S25FL256,
+		.total_size	= 32768,
+		.page_size	= 256,
+		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP,
+		.tested		= TEST_UNTESTED,
+		.probe		= probe_spi_rdid,
+		.probe_timing	= TIMING_ZERO,
+		.block_erasers	= {
+			{
+				.eraseblocks = { {4 * 1024, 8192} },
+				.block_erase = spi_block_erase_20,
+			}, {
+				.eraseblocks = { {64 * 1024, 512} },
+				.block_erase = spi_block_erase_d8,
+			}, {
+				.eraseblocks = { { 32768 * 1024, 1} },
+				.block_erase = spi_block_erase_60,
+			}, {
+				.eraseblocks = { { 32768 * 1024, 1} },
+				.block_erase = spi_block_erase_c7,
+			}
+		},
+		.printlock	= spi_prettyprint_status_register_plain, /**
+									  * TODO: improve
+									  */
+		.unlock		= spi_disable_blockprotect,
+		.write		= spi_chip_write_256,
+		.read		= spi_chip_read,
+		.voltage	= {2700, 3600},
+	},
+
+	{
+		.vendor		= "Spansion",
+		.name		= "S25FL512S",
+		.bustype	= BUS_SPI,
+		.manufacture_id	= SPANSION_ID,
+		.model_id	= SPANSION_S25FL512,
+		.total_size	= 65536,
+		.page_size	= 256,
+		.feature_bits	= FEATURE_WRSR_WREN | FEATURE_OTP,
+		.tested		= TEST_UNTESTED,
+		.probe		= probe_spi_rdid,
+		.probe_timing	= TIMING_ZERO,
+		.block_erasers	= {
+			{
+				.eraseblocks = { {256 * 1024, 256} },
+				.block_erase = spi_block_erase_d8,
+			}, {
+				.eraseblocks = { { 65536 * 1024, 1} },
+				.block_erase = spi_block_erase_60,
+			}, {
+				.eraseblocks = { { 65536 * 1024, 1} },
+				.block_erase = spi_block_erase_c7,
+			}
+		},
+		.printlock	= spi_prettyprint_status_register_plain, /**
+									  * TODO: improve
+									  */
+		.unlock		= spi_disable_blockprotect,
+		.write		= spi_chip_write_256,
+		.read		= spi_chip_read,
+		.voltage	= {2700, 3600},
+	},
+
+	{
 		.vendor		= "SST",
 		.name		= "SST25LF040A",
 		.bustype	= BUS_SPI,
diff --git a/flashchips.h b/flashchips.h
index 62be293..0f817ae 100644
--- a/flashchips.h
+++ b/flashchips.h
@@ -112,6 +112,7 @@ 
 #define AMIC_A25L080		0x3014
 #define AMIC_A25L016		0x3015
 #define AMIC_A25L032		0x3016
+#define AMIC_A25LQ16		0x4015
 #define AMIC_A25LQ032		0x4016
 #define AMIC_A29002B		0x0d
 #define AMIC_A29002T		0x8C	/* Same as A290021T */
@@ -257,6 +258,16 @@ 
 #define EON_EN25Q128		0x3018
 #define EON_EN25QH16		0x7015
 #define EON_EN25QH32		0x7016
+#define EON_EN25QH64		0x7017
+#define EON_EN25QH128		0x7018
+#define EON_EN25QH256		0x7019
+#define EON_EN25S10		0x3811
+#define EON_EN25S20		0x3812
+#define EON_EN25S40		0x3813
+#define EON_EN25S80		0x3814
+#define EON_EN25S16		0x3815
+#define EON_EN25S32		0x3816
+#define EON_EN25S64		0x3817
 #define EON_EN29F512		0x7F21
 #define EON_EN29F010		0x20
 #define EON_EN29F040A		0x7F04
@@ -307,6 +318,9 @@ 
 #define FUJITSU_MBM29LV800TA	0xDA	/* Same as MBM29LV800TE */
 
 #define GIGADEVICE_ID		0xC8	/* GigaDevice */
+#define GIGADEVICE_GD25T80	0x3114
+#define GIGADEVICE_GD25Q512	0x4010
+#define GIGADEVICE_GD25Q10	0x4011
 #define GIGADEVICE_GD25Q20	0x4012
 #define GIGADEVICE_GD25Q40	0x4013
 #define GIGADEVICE_GD25Q80	0x4014	/* Same as GD25Q80B (which has OTP) */
@@ -482,6 +496,10 @@ 
  */
 #define SANYO_ID		0x62
 #define SANYO_LE25FW203A	0x1600
+#define SANYO_LE25FW403A	0x1100
+#define SANYO_LE25FW418A	0x10
+#define SANYO_LE25FW806	0x26
+#define SANYO_LE25FW808	0x20
 
 #define SHARP_ID		0xB0	/* Sharp */
 #define SHARP_LH28F008BJ__PT	0xEC
@@ -503,6 +521,12 @@ 
 #define SPANSION_S25FL016A	0x0214
 #define SPANSION_S25FL032A	0x0215	/* Same as S25FL032P, but the latter supports EDI and CFI */
 #define SPANSION_S25FL064A	0x0216	/* Same as S25FL064P, but the latter supports EDI and CFI */
+#define SPANSION_S25FL204	0x4013
+#define SPANSION_S25FL208	0x4014
+#define SPANSION_S25FL116	0x4015
+#define SPANSION_S25FL128	0x2018
+#define SPANSION_S25FL256	0x0219
+#define SPANSION_S25FL512	0x0220
 
 /*
  * SST25 chips are SPI, first byte of device ID is memory type, second
@@ -585,6 +609,12 @@ 
 #define ST_M25P32		0x2016
 #define ST_M25P64		0x2017
 #define ST_M25P128		0x2018
+#define ST_M45PE10		0x4011
+#define ST_M45PE20		0x4012
+#define ST_M45PE40		0x4013
+#define ST_M45PE80		0x4014
+#define ST_M45PE16		0x4015
+#define ST_M25PX80		0x7114
 #define ST_M25PX16		0x7115
 #define ST_M25PX32		0x7116
 #define ST_M25PX64		0x7117
@@ -620,6 +650,13 @@ 
 #define ST_N25Q032__1E		0xBB16		/* N25Q032, 1.8V, (uniform sectors expected) */
 #define ST_N25Q064__3E		0xBA17		/* N25Q064, 3.0V, (uniform sectors expected) */
 #define ST_N25Q064__1E		0xBB17		/* N25Q064, 1.8V, (uniform sectors expected) */
+#define ST_N25Q128A13		0xBA18 /* N25Q128, 3.0V */
+#define ST_N25Q128A11		0xBB18 /* N25Q128, 1.8V */
+#define ST_N25Q256A13		0xBA19 /* N25Q256, 3.0V */
+#define ST_N25Q256A11		0xBB19 /* N25Q256, 1.8V */
+#define ST_N25Q512A13		0xBA20 /* N25Q512, 3.0V */
+#define ST_N25Q512A11		0xBB20 /* N25Q512, 1.8V */
+#define ST_N25Q00AA13		0xBA21 /* N25Q00A, 3.0V */
 
 #define SYNCMOS_MVC_ID		0x40	/* SyncMOS (SM) and Mosel Vitelic Corporation (MVC) */
 #define MVC_V29C51000T		0x00