[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