
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++)