[U-Boot-Users] [PATCH] Rework flash_read_uchar(), flash_read_ushort(), flash_read_long() for reading flash safety.

Signed-off-by: Zhang Wei wei.zhang@freescale.com --- drivers/cfi_flash.c | 107 +++++++++++++++++++++++---------------------------- 1 files changed, 48 insertions(+), 59 deletions(-)
diff --git a/drivers/cfi_flash.c b/drivers/cfi_flash.c index 696f9a4..8289b21 100644 --- a/drivers/cfi_flash.c +++ b/drivers/cfi_flash.c @@ -250,83 +250,72 @@ static void flash_printqry (flash_info_t #endif
-/*----------------------------------------------------------------------- - * read a character at a port width address - */ -inline uchar flash_read_uchar (flash_info_t * info, uint offset) +static inline ulong flash_read(flash_info_t * info, + flash_sect_t sect, uint offset, int data_size) { - uchar *cp; + volatile cfiptr_t addr; + unsigned long retval = 0; + int i;
- cp = flash_make_addr (info, 0, offset); + addr.cp = flash_make_addr(info, sect, offset); + for (i = 0; i < data_size; i++) { + cfiword_t cw; + switch (info->portwidth) { + case FLASH_CFI_8BIT: + cw.c = addr.cp[i]; + break; + case FLASH_CFI_16BIT: + cw.w = addr.wp[i]; + break; + case FLASH_CFI_32BIT: + cw.l = addr.lp[i]; + break; + case FLASH_CFI_64BIT: + cw.ll = addr.llp[i]; + break; + default: + return 0; + } #if defined(__LITTLE_ENDIAN) || defined(CFG_WRITE_SWAPPED_DATA) - return (cp[0]); + retval |= (cw.c << (8 * i)); #else - return (cp[info->portwidth - 1]); + retval |= (((cw.ll >> (8 * (FLASH_CFI_64BIT - info->portwidth))) + & 0xff) << (8 * i)); #endif + } + + debug ("flash_read retval = 0x%x\n", retval); + return retval; }
/*----------------------------------------------------------------------- - * read a short word by swapping for ppc format. + * read a character at a port width address */ -ushort flash_read_ushort (flash_info_t * info, flash_sect_t sect, uint offset) +inline uchar flash_read_uchar (flash_info_t * info, uint offset) { - uchar *addr; - ushort retval; - -#ifdef DEBUG - int x; -#endif - addr = flash_make_addr (info, sect, offset); - -#ifdef DEBUG - debug ("ushort addr is at %p info->portwidth = %d\n", addr, - info->portwidth); - for (x = 0; x < 2 * info->portwidth; x++) { - debug ("addr[%x] = 0x%x\n", x, addr[x]); - } -#endif -#if defined(__LITTLE_ENDIAN) || defined(CFG_WRITE_SWAPPED_DATA) - retval = ((addr[(info->portwidth)] << 8) | addr[0]); -#else - retval = ((addr[(2 * info->portwidth) - 1] << 8) | - addr[info->portwidth - 1]); -#endif + return (uchar)(flash_read(info, 0, offset, sizeof(uchar))); +}
- debug ("retval = 0x%x\n", retval); - return retval; +/*----------------------------------------------------------------------- + * read a short word. + */ +ushort flash_read_ushort (flash_info_t * info, flash_sect_t sect, uint offset) +{ + return (ushort)(flash_read(info, sect, offset, sizeof(ushort))); }
/*----------------------------------------------------------------------- * read a long word by picking the least significant byte of each maximum - * port size word. Swap for ppc format. + * port size word. */ ulong flash_read_long (flash_info_t * info, flash_sect_t sect, uint offset) { - uchar *addr; - ulong retval; - -#ifdef DEBUG - int x; -#endif - addr = flash_make_addr (info, sect, offset); - -#ifdef DEBUG - debug ("long addr is at %p info->portwidth = %d\n", addr, - info->portwidth); - for (x = 0; x < 4 * info->portwidth; x++) { - debug ("addr[%x] = 0x%x\n", x, addr[x]); - } -#endif -#if defined(__LITTLE_ENDIAN) || defined(CFG_WRITE_SWAPPED_DATA) - retval = (addr[0] << 16) | (addr[(info->portwidth)] << 24) | - (addr[(2 * info->portwidth)]) | (addr[(3 * info->portwidth)] << 8); -#else - retval = (addr[(2 * info->portwidth) - 1] << 24) | - (addr[(info->portwidth) - 1] << 16) | - (addr[(4 * info->portwidth) - 1] << 8) | - addr[(3 * info->portwidth) - 1]; -#endif - return retval; + ulong rval; + rval = (((flash_read(info, sect, offset, sizeof(ushort)) + & 0xffff) << 16 ) | + (flash_read(info, sect, offset + FLASH_CFI_16BIT, sizeof(ushort)) + & 0xffff)); + return rval; }
participants (1)
-
Zhang Wei