Skip to contentSkip to conversation

cfi_flash_intel: support 1024b buffer write

PATCH In review Eric Bénard 2 participants 4 messages Jul 30, 2010 – Aug 4, 2010

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 cfi_flash_intel: support 1024b buffer write

newer Numonyx Strataflash P3x have 1024b buffer, thus, it's possible to write a buffer size of 0x200 which the actual flash_write_cmd doesn't permit as it's limited to a uchar parameter.

---
 drivers/nor/cfi_flash.c       |   11 +++++++++++
 drivers/nor/cfi_flash.h       |    1 +
 drivers/nor/cfi_flash_intel.c |    5 ++++-
 3 files changed, 16 insertions(+), 1 deletions(-)
drivers/nor/cfi_flash.c +11 -0
index fa5e5ee..6f45da6 100644
@@ -886,6 +886,17 @@ void flash_write_cmd (struct flash_info *info, flash_sect_t sect, uint offset, u
 	flash_write_word(info, cword, addr);
 }
 
+void flash_write_cmd16 (struct flash_info *info, flash_sect_t sect, uint offset, ushort cmd)
+{
+
+	uchar *addr;
+	cfiword_t cword;
+
+	addr = flash_make_addr (info, sect, offset);
+	cword.w = cmd;
+	flash_write_word(info, cword, addr);
+}
+
 int flash_isequal (struct flash_info *info, flash_sect_t sect, uint offset, uchar cmd)
 {
 	cfiptr_t cptr;
drivers/nor/cfi_flash.h +1 -0
index 057e56c..d7e6ea2 100644
@@ -189,6 +189,7 @@ extern struct cfi_cmd_set cfi_cmd_set_amd;
 
 int flash_isset (struct flash_info *info, flash_sect_t sect, uint offset, uchar cmd);
 void flash_write_cmd (struct flash_info *info, flash_sect_t sect, uint offset, uchar cmd);
+void flash_write_cmd16 (struct flash_info * info, flash_sect_t sect, uint offset, ushort cmd);
 flash_sect_t find_sector (struct flash_info *info, ulong addr);
 int flash_status_check (struct flash_info *info, flash_sect_t sector,
 			       uint64_t tout, char *prompt);
drivers/nor/cfi_flash_intel.c +4 -1
index 4344760..96bf33f 100644
@@ -71,7 +71,10 @@ static int intel_flash_write_cfibuffer (struct flash_info *info, ulong dest, con
 	/* reduce the number of loops by the width of the port	*/
 	cnt = len >> (info->portwidth - 1);
 
-	flash_write_cmd (info, sector, 0, (uchar) cnt - 1);
+	if (cnt >= 0x100)
+		flash_write_cmd16 (info, sector, 0, (ushort) cnt - 1);
+	else
+		flash_write_cmd (info, sector, 0, (uchar) cnt - 1);
 	while (cnt-- > 0) {
 		if (bankwidth_is_1(info)) {
 			*dst.cp++ = *src.cp++;
Signature · 7 lines
1.6.3.3


_______________________________________________
barebox mailing list
[email protected]
http://lists.infradead.org/mailman/listinfo/barebox
#1 lore raw
Quoted 3 lines · Eric Bénard

newer Numonyx Strataflash P3x have 1024b buffer, thus, it's possible to write a buffer size of 0x200 which the actual flash_write_cmd doesn't permit as it's limited to a uchar parameter.

So I guess these chips have 16 data lines?

Unfortunately this won't work when two of these are parallel. You'd have to duplicate the command for the upper 16 bit.

Sascha

Quoted 62 lines
---
 drivers/nor/cfi_flash.c       |   11 +++++++++++
 drivers/nor/cfi_flash.h       |    1 +
 drivers/nor/cfi_flash_intel.c |    5 ++++-
 3 files changed, 16 insertions(+), 1 deletions(-)
drivers/nor/cfi_flash.c +11 -0
index fa5e5ee..6f45da6 100644
@@ -886,6 +886,17 @@ void flash_write_cmd (struct flash_info *info, flash_sect_t sect, uint offset, u
 	flash_write_word(info, cword, addr);
 }
 
+void flash_write_cmd16 (struct flash_info *info, flash_sect_t sect, uint offset, ushort cmd)
+{
+
+	uchar *addr;
+	cfiword_t cword;
+
+	addr = flash_make_addr (info, sect, offset);
+	cword.w = cmd;
+	flash_write_word(info, cword, addr);
+}
+
 int flash_isequal (struct flash_info *info, flash_sect_t sect, uint offset, uchar cmd)
 {
 	cfiptr_t cptr;
drivers/nor/cfi_flash.h +1 -0
index 057e56c..d7e6ea2 100644
@@ -189,6 +189,7 @@ extern struct cfi_cmd_set cfi_cmd_set_amd;
 
 int flash_isset (struct flash_info *info, flash_sect_t sect, uint offset, uchar cmd);
 void flash_write_cmd (struct flash_info *info, flash_sect_t sect, uint offset, uchar cmd);
+void flash_write_cmd16 (struct flash_info * info, flash_sect_t sect, uint offset, ushort cmd);
 flash_sect_t find_sector (struct flash_info *info, ulong addr);
 int flash_status_check (struct flash_info *info, flash_sect_t sector,
 			       uint64_t tout, char *prompt);
drivers/nor/cfi_flash_intel.c +4 -1
index 4344760..96bf33f 100644
@@ -71,7 +71,10 @@ static int intel_flash_write_cfibuffer (struct flash_info *info, ulong dest, con
 	/* reduce the number of loops by the width of the port	*/
 	cnt = len >> (info->portwidth - 1);
 
-	flash_write_cmd (info, sector, 0, (uchar) cnt - 1);
+	if (cnt >= 0x100)
+		flash_write_cmd16 (info, sector, 0, (ushort) cnt - 1);
+	else
+		flash_write_cmd (info, sector, 0, (uchar) cnt - 1);
 	while (cnt-- > 0) {
 		if (bankwidth_is_1(info)) {
 			*dst.cp++ = *src.cp++;
Signature · 1 line
1.6.3.3
Signature · 9 lines
Pengutronix e.K.                           |                             |
Industrial Linux Solutions                 | http://www.pengutronix.de/  |
Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0    |
Amtsgericht Hildesheim, HRA 2686           | Fax:   +49-5121-206917-5555 |

_______________________________________________
barebox mailing list
[email protected]
http://lists.infradead.org/mailman/listinfo/barebox
#2 lore raw

Hi Sascha,

Quoted 7 lines · Sascha Hauer
Quoted 3 lines · Eric Bénard

newer Numonyx Strataflash P3x have 1024b buffer, thus, it's possible to write a buffer size of 0x200 which the actual flash_write_cmd doesn't permit as it's limited to a uchar parameter.

So I guess these chips have 16 data lines?

actual flash_write_cmd is also used on chips with 16 data lines (like P30 or P33 Numonyx).

Quoted 4 lines

Unfortunately this won't work when two of these are parallel. You'd have to duplicate the command for the upper 16 bit.

Does actual flash_write_cmd works when 2 chips are parallel ?

Eric

Quoted 52 lines

Sascha

Quoted 50 lines
---
  drivers/nor/cfi_flash.c       |   11 +++++++++++
  drivers/nor/cfi_flash.h       |    1 +
  drivers/nor/cfi_flash_intel.c |    5 ++++-
  3 files changed, 16 insertions(+), 1 deletions(-)
drivers/nor/cfi_flash.c +11 -0
index fa5e5ee..6f45da6 100644
@@ -886,6 +886,17 @@ void flash_write_cmd (struct flash_info *info, flash_sect_t sect, uint offset, u
  	flash_write_word(info, cword, addr);
  }
 
+void flash_write_cmd16 (struct flash_info *info, flash_sect_t sect, uint offset, ushort cmd)
+{
+
+	uchar *addr;
+	cfiword_t cword;
+
+	addr = flash_make_addr (info, sect, offset);
+	cword.w = cmd;
+	flash_write_word(info, cword, addr);
+}
+
  int flash_isequal (struct flash_info *info, flash_sect_t sect, uint offset, uchar cmd)
  {
  	cfiptr_t cptr;
drivers/nor/cfi_flash.h +1 -0
index 057e56c..d7e6ea2 100644
@@ -189,6 +189,7 @@ extern struct cfi_cmd_set cfi_cmd_set_amd;
 
  int flash_isset (struct flash_info *info, flash_sect_t sect, uint offset, uchar cmd);
  void flash_write_cmd (struct flash_info *info, flash_sect_t sect, uint offset, uchar cmd);
+void flash_write_cmd16 (struct flash_info * info, flash_sect_t sect, uint offset, ushort cmd);
  flash_sect_t find_sector (struct flash_info *info, ulong addr);
  int flash_status_check (struct flash_info *info, flash_sect_t sector,
  			       uint64_t tout, char *prompt);
drivers/nor/cfi_flash_intel.c +0 -0
index 4344760..96bf33f 100644
@@ -71,7 +71,10 @@ static int intel_flash_write_cfibuffer (struct flash_info *info, ulong dest, con
  	/* reduce the number of loops by the width of the port	*/
  	cnt = len>>  (info->portwidth - 1);
 
Quoted 13 lines
Quoted 9 lines
drivers/nor/cfi_flash_intel.c +4 -2
-	flash_write_cmd (info, sector, 0, (uchar) cnt - 1);
+	if (cnt>= 0x100)
+		flash_write_cmd16 (info, sector, 0, (ushort) cnt - 1);
+	else
+		flash_write_cmd (info, sector, 0, (uchar) cnt - 1);
  	while (cnt-->  0) {
  		if (bankwidth_is_1(info)) {
  			*dst.cp++ = *src.cp++;
--
Quoted 3 lines

1.6.3.3

_______________________________________________
barebox mailing list
[email protected]
http://lists.infradead.org/mailman/listinfo/barebox

#3 lore raw
Quoted 4 lines · Eric Bénard

Hi Sascha,

Quoted 1 line · Sascha Hauer

On Fri, Jul 30, 2010 at 11:49:55AM +0200, Eric Bénard wrote:

Quoted 8 lines
Quoted 6 lines
Quoted 3 lines

newer Numonyx Strataflash P3x have 1024b buffer, thus, it's possible to write a buffer size of 0x200 which the actual flash_write_cmd doesn't permit as it's limited to a uchar parameter.

So I guess these chips have 16 data lines?

actual flash_write_cmd is also used on chips with 16 data lines (like P30 or P33 Numonyx).

Yes. I meant that 8 wouldn't be enough because the command gets wider than 8bit.

Quoted 6 lines
Quoted 5 lines

Unfortunately this won't work when two of these are parallel. You'd have to duplicate the command for the upper 16 bit.

Does actual flash_write_cmd works when 2 chips are parallel ?

At least it's supposed to ;)

See flash_make_cmd, it iterates over all bytes in info->portwidth and writes cmd or 0 into the buffer depending on info->chipwidth.

Sascha

Signature · 9 lines
Pengutronix e.K.                           |                             |
Industrial Linux Solutions                 | http://www.pengutronix.de/  |
Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0    |
Amtsgericht Hildesheim, HRA 2686           | Fax:   +49-5121-206917-5555 |

_______________________________________________
barebox mailing list
[email protected]
http://lists.infradead.org/mailman/listinfo/barebox