[U-Boot-Users] [RFC] CFI Driver Little-Endian write Issue

Zang Roy-r61911 tie-fei.zang at freescale.com
Mon Aug 7 09:24:31 CEST 2006


> 
> Hello Ed Okerson,
> 
> Recently, Roy Zang released MPC7448 HPC-II platform support 
> to this list and found a CFI Flash driver problem - 
> North-bridge chip TSI108 working as little-endian but write 
> to Flash is byte-swapped in a wrong way. 
> The workaround is to enable
> CFG_FLASH_USE_BUFFER_WRITE in little endian setting. However, 
> CFG_FLASH_USE_BUFFER_WRITE should have nothing to do with 
> little endian if I am right. So I suspect flash writing with 
> little endian could have some problems.

Flash writing on a pure little endian system should be right.
CFG_FLASH_USE_BUFFER_WRITE could not solve the issue on mpc7448hpc2
board.
Just as I mentioned before., 
"For handling unaligned head and tail bytes, the byte swap issue also
exists.
For example
=> cp.b 400002 fff80002 12 (from ram to flash)."
There will be some adjustment for my mpc7448hpc2 patch. 
Now I am struggled with the tsi108 config read exception.
I hope I can repost the whole  patch again in this week.
For cfi_flash.c driver, I add the following patch.

diff --git a/drivers/cfi_flash.c b/drivers/cfi_flash.c
index fd0a186..f621bc1 100644
--- a/drivers/cfi_flash.c
+++ b/drivers/cfi_flash.c
@@ -268,7 +268,7 @@ inline uchar flash_read_uchar (flash_inf
 	uchar *cp;
 
 	cp = flash_make_addr (info, 0, offset);
-#if defined(__LITTLE_ENDIAN)
+#if defined(__LITTLE_ENDIAN) || defined(CFG_FLASH_TSI_SWAP_BYTE)
 	return (cp[0]);
 #else
 	return (cp[info->portwidth - 1]);
@@ -295,7 +295,7 @@ #ifdef DEBUG
 		debug ("addr[%x] = 0x%x\n", x, addr[x]);
 	}
 #endif
-#if defined(__LITTLE_ENDIAN)
+#if defined(__LITTLE_ENDIAN) || defined(CFG_FLASH_TSI_SWAP_BYTE)
 	retval = ((addr[(info->portwidth)] << 8) | addr[0]);
 #else
 	retval = ((addr[(2 * info->portwidth) - 1] << 8) |
@@ -327,7 +327,7 @@ #ifdef DEBUG
 		debug ("addr[%x] = 0x%x\n", x, addr[x]);
 	}
 #endif
-#if defined(__LITTLE_ENDIAN)
+#if defined(__LITTLE_ENDIAN) || defined(CFG_FLASH_TSI_SWAP_BYTE)
 	retval = (addr[0] << 16) | (addr[(info->portwidth)] << 24) |
 		(addr[(2 * info->portwidth)]) | (addr[(3 *
info->portwidth)] << 8);
 #else
@@ -596,7 +596,6 @@ #ifdef CFG_FLASH_USE_BUFFER_WRITE
 	int buffered_size;
 #endif
 	/* get lower aligned address */
-	/* get lower aligned address */
 	wp = (addr & ~(info->portwidth - 1));
 
 	/* handle unaligned start */
@@ -892,7 +891,7 @@ static void flash_make_cmd (flash_info_t
 	int i;
 	uchar *cp = (uchar *) cmdbuf;
 
-#if defined(__LITTLE_ENDIAN)
+#if defined(__LITTLE_ENDIAN) || defined(CFG_FLASH_TSI_SWAP_BYTE)
 	for (i = info->portwidth; i > 0; i--)
 #else
 	for (i = 1; i <= info->portwidth; i++)




More information about the U-Boot mailing list